From db5762abd47e4b4f2276199a38285170ebce16a0 Mon Sep 17 00:00:00 2001 From: CieanYau Date: Fri, 6 Nov 2026 00:04:38 +0800 Subject: [PATCH] first commit --- .env.example | 3 + .gitignore | 8 + README.md | 72 + app/app.vue | 35 + app/assets/styles/AuthProviders.CgAWouSf.css | 211 + .../styles/BackendNavEntry.Bx6IPica.css | 23 + .../styles/BackendNavigation.CEj4LnzI.css | 21 + .../styles/BuildUpdateNotice.CuqdqvlF.css | 31 + app/assets/styles/CaptchaField.BSN3ZbsD.css | 37 + app/assets/styles/ChartBox.CYP_mhat.css | 9 + .../styles/ClientLevelDialog.DcYabp-W.css | 52 + .../styles/CloudAccessExtras.CnBJlFAZ.css | 68 + .../styles/CloudProductPicker.CAm9rmUl.css | 122 + app/assets/styles/CommonConfig.Cfik-oMe.css | 46 + app/assets/styles/CommonManage.qcc2l13i.css | 85 + app/assets/styles/CommonUpgrade.C8sZ-ExM.css | 30 + .../styles/ConfigBandwidth.CWSH1WJZ.css | 120 + app/assets/styles/ConfigDiskAdd.C92e9ZuF.css | 45 + app/assets/styles/ConfigDiskCard.Dx9IqqQ_.css | 152 + .../styles/ConfigResourceOption.Dj4VopnA.css | 23 + .../styles/ConsoleLegalFooter.DAYWmXIB.css | 50 + app/assets/styles/DcimActions.Da2op5wy.css | 36 + app/assets/styles/DcimBilling.QV7PUjnH.css | 78 + app/assets/styles/DcimDefence.BYaQccXZ.css | 72 + app/assets/styles/DcimDomains.BT2s5hGW.css | 26 + app/assets/styles/DcimManage.BlqFeSOi.css | 425 + app/assets/styles/DcimMonitor.CiStTCbZ.css | 84 + .../styles/DcimReinstallStatus.CuXeXmZ3.css | 20 + app/assets/styles/DcimUpgrade.DaLApYFa.css | 17 + app/assets/styles/FinanceConfig.CLwX1CC8.css | 34 + .../styles/FlowPacketPanel.-RJSx13z.css | 143 + app/assets/styles/GeetestField.DiieTibK.css | 44 + .../styles/GenericOAuthProviders.Bv8oNwXP.css | 22 + app/assets/styles/GlobalSearch.BQqObidy.css | 104 + .../styles/HomeConsumeTrend.DfrmEdD9.css | 3 + .../styles/HomeExpiringPanel.Ckflw2Hv.css | 17 + .../styles/HomeNoticePanel.e5-qgzAs.css | 57 + .../styles/HomeReferralPanel.DsgN33ME.css | 156 + .../styles/HomeServerPanel.Do7AgMDx.css | 107 + .../styles/HomeTicketPanel.LxPesukM.css | 21 + app/assets/styles/HomeTicketStat.C4kzybrY.css | 30 + app/assets/styles/HomeWalletCard.C5SHzGlJ.css | 35 + app/assets/styles/HostList.B3U15sJm.css | 328 + app/assets/styles/InstanceAccess.DIZBrksv.css | 284 + .../styles/InstanceBilling.CvIGLT2J.css | 143 + app/assets/styles/InstanceDisks.Ca7NZxYd.css | 98 + .../styles/InstanceLoadingShell.CwfiUwdU.css | 80 + app/assets/styles/InstanceManage.apzbBV1c.css | 25 + .../styles/InstanceMonitor.B0X15iQt.css | 64 + .../InstanceMonitorSkeleton.C0FT51jJ.css | 44 + .../styles/InstanceNetwork.CyucZaZp.css | 160 + .../styles/InstanceOnDemand.okGWwgIJ.css | 25 + .../styles/InstanceOverview.C9ExpxMB.css | 241 + .../styles/InstanceRenewDialog.BHDAL6d3.css | 81 + .../styles/InstanceServiceInfo.BftSVIeW.css | 60 + .../styles/InstanceSmsCode.CsITfIEU.css | 12 + .../styles/InstanceTraffic.CyyEAXl3.css | 93 + app/assets/styles/JyCloudConfig.kGfttaHi.css | 239 + app/assets/styles/KkyEcsConfig.BFaAwQPZ.css | 43 + app/assets/styles/KkyUpgrade.CkDmxFBM.css | 229 + .../styles/LegacyDcimActions.DcIrQby6.css | 34 + .../styles/LegacyDcimManage.5YRq508t.css | 236 + .../styles/LegacyProductUpgrade.dzWGwGgY.css | 8 + .../styles/MfCloudBackupPanel.BTlEe-fy.css | 117 + app/assets/styles/MfCloudConfig.DbgUu8qr.css | 30 + app/assets/styles/MfCloudDefence.B2vl5Yip.css | 19 + app/assets/styles/MfCloudIps.jhFnuvcs.css | 65 + app/assets/styles/MfCloudLogs.MTqtLGjA.css | 63 + app/assets/styles/MfCloudNat.C1uXa4fX.css | 15 + .../MfCloudResourceUpgrade.bSwLWjPg.css | 57 + app/assets/styles/MfCloudUpgrade.N7TNG8F1.css | 109 + app/assets/styles/MfCloudVpc.CpOEbuWs.css | 15 + app/assets/styles/MfDcimConfig.BhC_eZ0V.css | 175 + .../NotificationPreferences.DcH8Noxd.css | 72 + .../styles/OperationToasts.DfA_b8om.css | 71 + app/assets/styles/OsIcon.CAi4Iz2S.css | 10 + app/assets/styles/PageInfoNotice._16xRFrB.css | 31 + app/assets/styles/PageSteps.B5K7G9zF.css | 66 + app/assets/styles/PaymentDialog.BNFKQF1U.css | 283 + app/assets/styles/PhoneCodeField.CwyHXfML.css | 33 + .../styles/ProductCategoryNotice.CwaR3eXN.css | 115 + .../ProductConfigurationSummary.BqZns1LB.css | 16 + .../styles/ProductCustomFields.B2QMnPil.css | 12 + .../styles/ProductDescription.Ctb7jDuO.css | 274 + .../styles/ProductGroupLabel.B1kWpFA-.css | 32 + app/assets/styles/PromoCodeField.qFEkB6Hm.css | 35 + app/assets/styles/RechargeDialog.DpsMly4r.css | 47 + app/assets/styles/RemfUpgrade.4stQ5ASH.css | 92 + app/assets/styles/RemoteConsole.DLmX5UZu.css | 233 + app/assets/styles/RichTextEditor.NkmgPT5m.css | 48 + app/assets/styles/RingProgress.CVwR7il5.css | 27 + app/assets/styles/RoxyMascot.CDqPSf2d.css | 471 + .../SecurityVerificationDialog.skYFo4v7.css | 32 + app/assets/styles/SensitiveValue.BSZlaRHT.css | 35 + .../styles/TicketAttachments.DtbJGLkE.css | 150 + app/assets/styles/UploadField.BbTCTv6C.css | 44 + .../styles/WechatConnection.DI5ko1xy.css | 15 + app/assets/styles/WithdrawDialog.ks0wdKEK.css | 97 + app/assets/styles/_id_.C-0--Lx-.css | 287 + app/assets/styles/_id_.CSXsMADH.css | 59 + app/assets/styles/_id_.gjoJy9S8.css | 431 + app/assets/styles/account.CTvLXxT_.css | 198 + app/assets/styles/api-keys.Bq3Csr53.css | 46 + app/assets/styles/bind.CFZQE2UH.css | 73 + app/assets/styles/blank.DOa3C9wi.css | 268 + app/assets/styles/cart.CSS2vTmS.css | 299 + app/assets/styles/cloud-server.CcwlOXJ0.css | 15 + app/assets/styles/create.gX6gpD00.css | 289 + app/assets/styles/customize.Cc123Awf.css | 45 + .../styles/dedicated-server.CiJfMYtk.css | 391 + app/assets/styles/default.DFUVVR1i.css | 516 + app/assets/styles/domains.GiD6NSti.css | 113 + app/assets/styles/entry.Cs9kvuGi.css | 2407 +++++ app/assets/styles/error-404.IMo4BvbT.css | 131 + app/assets/styles/error-500.CT6S2vcm.css | 102 + app/assets/styles/finance.BkxKMno0.css | 286 + app/assets/styles/groups.Buw8nwl1.css | 289 + app/assets/styles/help.BSOB30LE.css | 292 + app/assets/styles/home.DWX5YkpJ.css | 30 + app/assets/styles/invoice.B6sYFYlb.css | 82 + app/assets/styles/invoices.t1P1GXOx.css | 169 + app/assets/styles/logbook.Y7gm684m.css | 71 + app/assets/styles/login.Clyo2_3T.css | 41 + app/assets/styles/messages.asRdYcVu.css | 193 + app/assets/styles/news.CbIzdrjt.css | 198 + app/assets/styles/notices.BXNGOj-Q.css | 186 + app/assets/styles/official-site.pBD-PXD7.css | 1180 +++ app/assets/styles/orders.BflDlvVz.css | 63 + app/assets/styles/pages.DytekQXu.css | 261 + app/assets/styles/products.CrccEo2m.css | 435 + app/assets/styles/public-order.0RThfr7m.css | 107 + app/assets/styles/realname.BpRCvfXO.css | 273 + app/assets/styles/recommend.C1KCHBPJ.css | 304 + app/assets/styles/remote-console.zcxaOxxS.css | 120 + app/assets/styles/resources._aUrMsvM.css | 56 + app/assets/styles/server.DGuhrprb.css | 292 + app/assets/styles/settings.zV3AWuRw.css | 198 + app/assets/styles/ssh-keys.WWTOf2zG.css | 112 + app/assets/styles/tickets.Dz8JrDhQ.css | 120 + app/assets/styles/transfer.CAsJhVUW.css | 278 + app/assets/styles/vouchers.5FV4ozrh.css | 341 + app/components/AuthProviders.vue | 726 ++ app/components/BackendNavEntry.vue | 433 + app/components/BackendNavigation.vue | 153 + app/components/BuildUpdateNotice.vue | 177 + app/components/CaptchaField.vue | 230 + app/components/ChartBox.vue | 87 + app/components/ClientLevelDialog.vue | 449 + app/components/ConsoleLegalFooter.vue | 69 + app/components/GeetestField.vue | 372 + app/components/GenericOAuthProviders.vue | 162 + app/components/GlobalSearch.vue | 403 + app/components/HostList.vue | 3656 +++++++ app/components/ListEmpty.vue | 56 + app/components/ListSegments.vue | 74 + app/components/MfCloudBackupPanel.vue | 1364 +++ app/components/NotificationPreferences.vue | 379 + app/components/OperatePasswordGate.vue | 36 + app/components/OperationNotice.vue | 52 + app/components/OperationToasts.vue | 123 + app/components/OsIcon.vue | 124 + app/components/PageInfoNotice.vue | 49 + app/components/PageSteps.vue | 100 + app/components/PaymentDialog.vue | 2030 ++++ app/components/PhoneCodeField.vue | 173 + app/components/ProductCategoryNotice.vue | 91 + .../ProductConfigurationSummary.vue | 454 + app/components/ProductDescription.vue | 592 ++ app/components/ProductGroupLabel.vue | 77 + app/components/RechargeDialog.vue | 253 + app/components/RichTextEditor.vue | 248 + app/components/RingProgress.vue | 128 + app/components/SecurityVerificationDialog.vue | 635 ++ app/components/SensitiveValue.vue | 166 + app/components/TicketAttachments.vue | 457 + app/components/TicketNotice.vue | 119 + app/components/UploadField.vue | 191 + app/components/WechatConnection.vue | 296 + app/components/WithdrawDialog.vue | 965 ++ app/components/config/CloudProductPicker.vue | 449 + app/components/config/CommonConfig.vue | 2478 +++++ app/components/config/ConfigBandwidth.vue | 305 + app/components/config/ConfigCheckout.vue | 657 ++ app/components/config/ConfigChoiceGrid.vue | 140 + app/components/config/ConfigDiskAdd.vue | 66 + app/components/config/ConfigDiskCard.vue | 346 + app/components/config/ConfigLoadingShell.vue | 197 + .../config/ConfigResourceOption.vue | 233 + app/components/config/FinanceConfig.vue | 1861 ++++ app/components/config/JyCloudConfig.vue | 2288 ++++ app/components/config/KkyEcsConfig.vue | 1597 +++ app/components/config/MfCloudConfig.vue | 2806 +++++ app/components/config/MfDcimConfig.vue | 2060 ++++ app/components/config/ProductCustomFields.vue | 268 + app/components/config/PromoCodeField.vue | 193 + app/components/home/HomeConsumeTrend.vue | 295 + app/components/home/HomeExpiringPanel.vue | 268 + app/components/home/HomeNoticePanel.vue | 440 + app/components/home/HomeReferralPanel.vue | 427 + app/components/home/HomeServerPanel.vue | 491 + app/components/home/HomeTicketPanel.vue | 394 + app/components/home/HomeTicketStat.vue | 197 + app/components/home/HomeWalletCard.vue | 206 + app/components/home/RoxyMascot.vue | 36 + app/components/instance/CloudAccessExtras.vue | 172 + app/components/instance/CommonManage.vue | 1583 +++ app/components/instance/CommonUpgrade.vue | 1443 +++ app/components/instance/DcimActions.vue | 838 ++ app/components/instance/DcimBilling.vue | 989 ++ app/components/instance/DcimDefence.vue | 636 ++ app/components/instance/DcimDomains.vue | 356 + app/components/instance/DcimManage.vue | 3320 ++++++ app/components/instance/DcimMonitor.vue | 343 + .../instance/DcimReinstallStatus.vue | 163 + app/components/instance/DcimUpgrade.vue | 613 ++ app/components/instance/FlowPacketPanel.vue | 681 ++ .../instance/ImagePurchaseDialog.vue | 275 + app/components/instance/InstanceAccess.vue | 2202 ++++ app/components/instance/InstanceBilling.vue | 1422 +++ app/components/instance/InstanceDisks.vue | 1351 +++ .../instance/InstanceLoadingShell.vue | 166 + app/components/instance/InstanceManage.vue | 882 ++ app/components/instance/InstanceMonitor.vue | 757 ++ .../instance/InstanceMonitorSkeleton.vue | 147 + app/components/instance/InstanceNetwork.vue | 926 ++ app/components/instance/InstanceOnDemand.vue | 797 ++ app/components/instance/InstanceOverview.vue | 1866 ++++ .../instance/InstanceRenewDialog.vue | 640 ++ .../instance/InstanceServiceInfo.vue | 435 + app/components/instance/InstanceSmsCode.vue | 223 + app/components/instance/InstanceStatusTag.vue | 45 + app/components/instance/InstanceTraffic.vue | 641 ++ app/components/instance/LegacyDcimActions.vue | 870 ++ app/components/instance/LegacyDcimManage.vue | 2112 ++++ .../instance/LegacyProductUpgrade.vue | 340 + app/components/instance/RemfUpgrade.vue | 641 ++ app/components/instance/RemoteConsole.vue | 923 ++ app/components/kkyecs/KkyUpgrade.vue | 1435 +++ app/components/mfcloud/MfCloudDefence.vue | 511 + app/components/mfcloud/MfCloudIps.vue | 726 ++ app/components/mfcloud/MfCloudLogs.vue | 406 + app/components/mfcloud/MfCloudNat.vue | 744 ++ .../mfcloud/MfCloudResourceUpgrade.vue | 572 + app/components/mfcloud/MfCloudUpgrade.vue | 493 + app/components/mfcloud/MfCloudVpc.vue | 864 ++ app/config/locale.zh-CN.json | 80 + app/config/primevue.js | 37 + app/layouts/blank.vue | 50 + app/layouts/default.vue | 1318 +++ app/layouts/official-site.vue | 587 ++ app/layouts/public-order.vue | 224 + app/lib/_plugin-vue_export-helper.js | 6 + app/lib/auth-redirect.js | 29 + app/lib/auth.js | 856 ++ app/lib/backend-menu.js | 380 + app/lib/bandwidth-display.js | 7 + app/lib/cart-edit.js | 104 + app/lib/cloud-instance-management.js | 162 + app/lib/common-advanced-rules.js | 261 + app/lib/complete-list.js | 44 + app/lib/composables-2.js | 2 + app/lib/configuration-display.js | 100 + app/lib/content-route.js | 25 + app/lib/dict.js | 127 + app/lib/finance-resource-chart.js | 41 + app/lib/instance-data.js | 250 + app/lib/instance-status.js | 95 + app/lib/interval.js | 2 + app/lib/invoice.js | 28 + app/lib/modules.js | 62 + app/lib/navigation-state.js | 76 + app/lib/oauth.js | 67 + app/lib/order-image-continuation.js | 42 + app/lib/os-name.js | 78 + app/lib/password-2.js | 21 + app/lib/product-description-data.js | 26 + app/lib/product-fields.js | 214 + app/lib/product-name.js | 17 + app/lib/product-order-module.js | 23 + app/lib/purchase-limit-state.js | 48 + app/lib/remote-console.js | 21 + app/lib/renewal-quote.js | 34 + app/lib/rolldown-runtime.js | 72 + app/lib/sanitize.js | 122 + app/lib/server-page.js | 253 + app/lib/storage-capacity.js | 466 + app/lib/ticketAttachments.js | 86 + app/lib/useCaptcha.js | 202 + app/lib/useListPage.js | 176 + app/lib/useMailbox.js | 48 + app/lib/useOAuth.js | 42 + app/lib/useOfficialSiteContent.js | 417 + app/lib/useSiteConfig.js | 47 + app/lib/useTheme.js | 73 + app/lib/useVerifyCode.js | 83 + app/lib/useWithdrawAvailability.js | 50 + app/lib/wechat-binding.js | 35 + app/middleware/auth.global.js | 53 + app/pages/account/api-keys.vue | 927 ++ app/pages/account/connections.vue | 407 + app/pages/account/index.vue | 2899 +++++ app/pages/account/realname/company.vue | 23 + app/pages/account/realname/index.vue | 2577 +++++ app/pages/account/realname/personal.vue | 23 + app/pages/bills/[id].vue | 25 + app/pages/bills/index.vue | 38 + app/pages/cart/index.vue | 1372 +++ app/pages/cloud-servers/index.vue | 92 + app/pages/dedicated-servers/index.vue | 92 + app/pages/finance/index.vue | 1909 ++++ app/pages/forgot-password.vue | 520 + app/pages/help.vue | 741 ++ app/pages/home.htm.vue | 105 + app/pages/index.vue | 675 ++ app/pages/invoices/index.vue | 2379 +++++ app/pages/invoices/invoice.vue | 623 ++ app/pages/invoices/request.vue | 17 + app/pages/invoices/settings/index.vue | 1392 +++ app/pages/logbook/index.vue | 393 + app/pages/login.vue | 568 + app/pages/messages/index.vue | 904 ++ app/pages/news.vue | 576 + app/pages/notices/index.vue | 543 + app/pages/oauth/bind.vue | 614 ++ app/pages/oauth/callback.vue | 149 + app/pages/official-site.vue | 1088 ++ app/pages/orders/[id].vue | 1578 +++ app/pages/orders/index.vue | 1147 ++ app/pages/orders/order/index.vue | 25 + app/pages/orders/order/paid.vue | 25 + app/pages/orders/order/pay.vue | 25 + app/pages/products/[id].vue | 460 + app/pages/products/cloud-server.vue | 494 + .../products/dedicated-server/customize.vue | 255 + app/pages/products/dedicated-server/index.vue | 1207 +++ app/pages/products/index.vue | 1602 +++ app/pages/recommend/index.vue | 3438 ++++++ app/pages/register.vue | 907 ++ app/pages/remote-console.vue | 427 + app/pages/resources.vue | 263 + app/pages/security/domains/index.vue | 1160 ++ app/pages/security/groups/index.vue | 2376 +++++ app/pages/security/ssh-keys/index.vue | 413 + app/pages/servers/server.vue | 2961 ++++++ app/pages/tickets/[id].vue | 778 ++ app/pages/tickets/create.vue | 675 ++ app/pages/tickets/index.vue | 623 ++ app/pages/tickets/ticket.vue | 17 + app/pages/transfer/index.vue | 1667 +++ app/pages/vouchers/index.vue | 1023 ++ app/plugins/01-ui.client.js | 21 + app/plugins/02-bootstrap.client.js | 17 + app/plugins/03-session.client.js | 37 + app/utils/access.js | 31 + app/utils/brand.js | 1 + app/utils/crypto.js | 4 + app/utils/load-module.js | 3 + ...stripped-and-reaches-the-verified-home.png | Bin 0 -> 138503 bytes ...ial-remains-removed-from-the-error-url.png | Bin 0 -> 39735 bytes ...ut-of-the-error-url-and-can-be-retried.png | Bin 0 -> 138503 bytes ...st-cannot-swallow-the-payment-deadline.png | Bin 0 -> 78628 bytes ...ty-menu-does-not-expose-fallback-links.png | Bin 0 -> 154104 bytes ...lears-the-session-and-returns-to-login.png | Bin 0 -> 7611 bytes ...ing-the-legacy-route-is-verified-again.png | Bin 0 -> 138503 bytes ...-cannot-restart-payment-initialization.png | Bin 0 -> 7611 bytes ...rd-preserves-the-protected-destination.png | Bin 0 -> 7611 bytes ...override-the-available-password-method.png | Bin 0 -> 156863 bytes docs/acceptance-assets/legacy-error-390.png | Bin 0 -> 31525 bytes ...e-cannot-reinitialize-its-payment-data.png | Bin 0 -> 7611 bytes docs/acceptance-assets/login-390.png | Bin 0 -> 38957 bytes ...rejects-a-backslash-return-destination.png | Bin 0 -> 138503 bytes ...cts-a-encoded-slash-return-destination.png | Bin 0 -> 138503 bytes ...a-protocol-relative-return-destination.png | Bin 0 -> 138503 bytes ...-while-its-api-request-remains-pending.png | Bin 0 -> 7611 bytes ...ther-tab-revokes-both-visible-sessions.png | Bin 0 -> 7611 bytes ...-the-deployed-encrypted-field-contract.png | Bin 0 -> 156863 bytes ...s-the-deployed-top-level-paid-response.png | Bin 0 -> 67535 bytes docs/acceptance-assets/sms-320.png | Bin 0 -> 28863 bytes docs/acceptance-assets/sms-390.png | Bin 0 -> 30134 bytes ...nd-the-verification-countdown-contract.png | Bin 0 -> 156453 bytes ...-return-the-final-page-to-a-valid-page.png | Bin 0 -> 155991 bytes docs/acceptance-assets/ssh-editor-390.png | Bin 0 -> 78934 bytes ...-25-matches-without-repeating-all-rows.png | Bin 0 -> 156453 bytes ...-unfinished-json-body-and-allows-retry.png | Bin 0 -> 156456 bytes docs/acceptance-requests.json | 2408 +++++ docs/acceptance.json | 2057 ++++ docs/audit-coverage.json | 9284 +++++++++++++++++ docs/defect-ledger.json | 147 + docs/dependency-audit.json | 246 + docs/module-inventory.json | 439 + docs/project-completeness.md | 70 + docs/reconstruction-plan.md | 21 + docs/validation.md | 96 + nuxt.config.ts | 31 + package-lock.json | 9022 ++++++++++++++++ package.json | 44 + public/favicon.ico | Bin 0 -> 36397 bytes public/favicon.svg | 1 + public/fonts/harmonyos-sans-sc/Bold.css | 680 ++ .../fonts/harmonyos-sans-sc/Bold_00397b.woff2 | Bin 0 -> 61468 bytes .../fonts/harmonyos-sans-sc/Bold_09158a.woff2 | Bin 0 -> 53128 bytes .../fonts/harmonyos-sans-sc/Bold_09a9b3.woff2 | Bin 0 -> 68904 bytes .../fonts/harmonyos-sans-sc/Bold_0ca5a9.woff2 | Bin 0 -> 51756 bytes .../fonts/harmonyos-sans-sc/Bold_0cdc77.woff2 | Bin 0 -> 53400 bytes .../fonts/harmonyos-sans-sc/Bold_0d19f4.woff2 | Bin 0 -> 59560 bytes .../fonts/harmonyos-sans-sc/Bold_0d29b4.woff2 | Bin 0 -> 64392 bytes .../fonts/harmonyos-sans-sc/Bold_0dbc27.woff2 | Bin 0 -> 58136 bytes .../fonts/harmonyos-sans-sc/Bold_0e127a.woff2 | Bin 0 -> 58564 bytes .../fonts/harmonyos-sans-sc/Bold_0f358f.woff2 | Bin 0 -> 57980 bytes .../fonts/harmonyos-sans-sc/Bold_0ff13d.woff2 | Bin 0 -> 61156 bytes .../fonts/harmonyos-sans-sc/Bold_135790.woff2 | Bin 0 -> 59280 bytes .../fonts/harmonyos-sans-sc/Bold_138611.woff2 | Bin 0 -> 58720 bytes .../fonts/harmonyos-sans-sc/Bold_16a8ba.woff2 | Bin 0 -> 63728 bytes .../fonts/harmonyos-sans-sc/Bold_1c96d4.woff2 | Bin 0 -> 63084 bytes .../fonts/harmonyos-sans-sc/Bold_22048b.woff2 | Bin 0 -> 60400 bytes .../fonts/harmonyos-sans-sc/Bold_269445.woff2 | Bin 0 -> 50096 bytes .../fonts/harmonyos-sans-sc/Bold_2c89c1.woff2 | Bin 0 -> 22084 bytes .../fonts/harmonyos-sans-sc/Bold_2f7c7d.woff2 | Bin 0 -> 58236 bytes .../fonts/harmonyos-sans-sc/Bold_2fefd6.woff2 | Bin 0 -> 60284 bytes .../fonts/harmonyos-sans-sc/Bold_306bba.woff2 | Bin 0 -> 58048 bytes .../fonts/harmonyos-sans-sc/Bold_3149e0.woff2 | Bin 0 -> 57236 bytes .../fonts/harmonyos-sans-sc/Bold_35c17d.woff2 | Bin 0 -> 60320 bytes .../fonts/harmonyos-sans-sc/Bold_36ad1b.woff2 | Bin 0 -> 65268 bytes .../fonts/harmonyos-sans-sc/Bold_3b743f.woff2 | Bin 0 -> 66048 bytes .../fonts/harmonyos-sans-sc/Bold_3c428d.woff2 | Bin 0 -> 59616 bytes .../fonts/harmonyos-sans-sc/Bold_53d21e.woff2 | Bin 0 -> 57352 bytes .../fonts/harmonyos-sans-sc/Bold_545620.woff2 | Bin 0 -> 62436 bytes .../fonts/harmonyos-sans-sc/Bold_5825df.woff2 | Bin 0 -> 57652 bytes .../fonts/harmonyos-sans-sc/Bold_5a8449.woff2 | Bin 0 -> 66396 bytes .../fonts/harmonyos-sans-sc/Bold_5ae301.woff2 | Bin 0 -> 66548 bytes .../fonts/harmonyos-sans-sc/Bold_5b1e0f.woff2 | Bin 0 -> 65256 bytes .../fonts/harmonyos-sans-sc/Bold_666915.woff2 | Bin 0 -> 66192 bytes .../fonts/harmonyos-sans-sc/Bold_6927bf.woff2 | Bin 0 -> 61216 bytes .../fonts/harmonyos-sans-sc/Bold_6938ca.woff2 | Bin 0 -> 64160 bytes .../fonts/harmonyos-sans-sc/Bold_6d65eb.woff2 | Bin 0 -> 63536 bytes .../fonts/harmonyos-sans-sc/Bold_70874c.woff2 | Bin 0 -> 57496 bytes .../fonts/harmonyos-sans-sc/Bold_71407d.woff2 | Bin 0 -> 59716 bytes .../fonts/harmonyos-sans-sc/Bold_76f2de.woff2 | Bin 0 -> 58484 bytes .../fonts/harmonyos-sans-sc/Bold_782503.woff2 | Bin 0 -> 61984 bytes .../fonts/harmonyos-sans-sc/Bold_813dd1.woff2 | Bin 0 -> 56692 bytes .../fonts/harmonyos-sans-sc/Bold_82438c.woff2 | Bin 0 -> 59720 bytes .../fonts/harmonyos-sans-sc/Bold_87c494.woff2 | Bin 0 -> 67188 bytes .../fonts/harmonyos-sans-sc/Bold_8867bc.woff2 | Bin 0 -> 66228 bytes .../fonts/harmonyos-sans-sc/Bold_8a2aad.woff2 | Bin 0 -> 63624 bytes .../fonts/harmonyos-sans-sc/Bold_8ea124.woff2 | Bin 0 -> 70992 bytes .../fonts/harmonyos-sans-sc/Bold_8ea677.woff2 | Bin 0 -> 57568 bytes .../fonts/harmonyos-sans-sc/Bold_971f00.woff2 | Bin 0 -> 63848 bytes .../fonts/harmonyos-sans-sc/Bold_9ad5e8.woff2 | Bin 0 -> 60560 bytes .../fonts/harmonyos-sans-sc/Bold_a04e21.woff2 | Bin 0 -> 66156 bytes .../fonts/harmonyos-sans-sc/Bold_a0f240.woff2 | Bin 0 -> 54872 bytes .../fonts/harmonyos-sans-sc/Bold_aacef2.woff2 | Bin 0 -> 60776 bytes .../fonts/harmonyos-sans-sc/Bold_abac36.woff2 | Bin 0 -> 61608 bytes .../fonts/harmonyos-sans-sc/Bold_b028be.woff2 | Bin 0 -> 58876 bytes .../fonts/harmonyos-sans-sc/Bold_b1143d.woff2 | Bin 0 -> 68628 bytes .../fonts/harmonyos-sans-sc/Bold_b8977e.woff2 | Bin 0 -> 59440 bytes .../fonts/harmonyos-sans-sc/Bold_bba9bc.woff2 | Bin 0 -> 61048 bytes .../fonts/harmonyos-sans-sc/Bold_bc06aa.woff2 | Bin 0 -> 62308 bytes .../fonts/harmonyos-sans-sc/Bold_bee5fd.woff2 | Bin 0 -> 59316 bytes .../fonts/harmonyos-sans-sc/Bold_bf7217.woff2 | Bin 0 -> 62940 bytes .../fonts/harmonyos-sans-sc/Bold_c2b336.woff2 | Bin 0 -> 60896 bytes .../fonts/harmonyos-sans-sc/Bold_c37197.woff2 | Bin 0 -> 56348 bytes .../fonts/harmonyos-sans-sc/Bold_c614c1.woff2 | Bin 0 -> 11116 bytes .../fonts/harmonyos-sans-sc/Bold_c728d8.woff2 | Bin 0 -> 63480 bytes .../fonts/harmonyos-sans-sc/Bold_cd2170.woff2 | Bin 0 -> 62476 bytes .../fonts/harmonyos-sans-sc/Bold_cf29b0.woff2 | Bin 0 -> 68388 bytes .../fonts/harmonyos-sans-sc/Bold_d2da49.woff2 | Bin 0 -> 55768 bytes .../fonts/harmonyos-sans-sc/Bold_d829f0.woff2 | Bin 0 -> 61548 bytes .../fonts/harmonyos-sans-sc/Bold_d8e0ef.woff2 | Bin 0 -> 56996 bytes .../fonts/harmonyos-sans-sc/Bold_d95e9e.woff2 | Bin 0 -> 60164 bytes .../fonts/harmonyos-sans-sc/Bold_d9776c.woff2 | Bin 0 -> 58604 bytes .../fonts/harmonyos-sans-sc/Bold_df3eef.woff2 | Bin 0 -> 67636 bytes .../fonts/harmonyos-sans-sc/Bold_e7152d.woff2 | Bin 0 -> 58260 bytes .../fonts/harmonyos-sans-sc/Bold_e7daea.woff2 | Bin 0 -> 64252 bytes .../fonts/harmonyos-sans-sc/Bold_e8003a.woff2 | Bin 0 -> 56184 bytes .../fonts/harmonyos-sans-sc/Bold_eac724.woff2 | Bin 0 -> 62516 bytes .../fonts/harmonyos-sans-sc/Bold_ed0d20.woff2 | Bin 0 -> 58572 bytes .../fonts/harmonyos-sans-sc/Bold_eeb3fd.woff2 | Bin 0 -> 56608 bytes .../fonts/harmonyos-sans-sc/Bold_f7ca8a.woff2 | Bin 0 -> 62748 bytes .../fonts/harmonyos-sans-sc/Bold_f9818b.woff2 | Bin 0 -> 63232 bytes .../fonts/harmonyos-sans-sc/Bold_fdb231.woff2 | Bin 0 -> 26080 bytes .../fonts/harmonyos-sans-sc/Bold_fdc333.woff2 | Bin 0 -> 61296 bytes public/fonts/harmonyos-sans-sc/LICENSE.txt | Bin 0 -> 32768 bytes public/fonts/harmonyos-sans-sc/Regular.css | 680 ++ .../harmonyos-sans-sc/Regular_00a682.woff2 | Bin 0 -> 67884 bytes .../harmonyos-sans-sc/Regular_0f9ed6.woff2 | Bin 0 -> 60988 bytes .../harmonyos-sans-sc/Regular_121ef3.woff2 | Bin 0 -> 63608 bytes .../harmonyos-sans-sc/Regular_170a05.woff2 | Bin 0 -> 59512 bytes .../harmonyos-sans-sc/Regular_17f172.woff2 | Bin 0 -> 58116 bytes .../harmonyos-sans-sc/Regular_217dc2.woff2 | Bin 0 -> 65972 bytes .../harmonyos-sans-sc/Regular_256855.woff2 | Bin 0 -> 67512 bytes .../harmonyos-sans-sc/Regular_272cc0.woff2 | Bin 0 -> 58448 bytes .../harmonyos-sans-sc/Regular_27c723.woff2 | Bin 0 -> 57148 bytes .../harmonyos-sans-sc/Regular_28749b.woff2 | Bin 0 -> 58340 bytes .../harmonyos-sans-sc/Regular_2b1dc1.woff2 | Bin 0 -> 56312 bytes .../harmonyos-sans-sc/Regular_2dce0b.woff2 | Bin 0 -> 56448 bytes .../harmonyos-sans-sc/Regular_3056fd.woff2 | Bin 0 -> 58156 bytes .../harmonyos-sans-sc/Regular_312071.woff2 | Bin 0 -> 65576 bytes .../harmonyos-sans-sc/Regular_375414.woff2 | Bin 0 -> 58320 bytes .../harmonyos-sans-sc/Regular_39f71f.woff2 | Bin 0 -> 58760 bytes .../harmonyos-sans-sc/Regular_3ef9bb.woff2 | Bin 0 -> 56864 bytes .../harmonyos-sans-sc/Regular_3fc7ac.woff2 | Bin 0 -> 59628 bytes .../harmonyos-sans-sc/Regular_409c84.woff2 | Bin 0 -> 65892 bytes .../harmonyos-sans-sc/Regular_44123f.woff2 | Bin 0 -> 60424 bytes .../harmonyos-sans-sc/Regular_449d8d.woff2 | Bin 0 -> 64100 bytes .../harmonyos-sans-sc/Regular_45ef02.woff2 | Bin 0 -> 50488 bytes .../harmonyos-sans-sc/Regular_47cfe5.woff2 | Bin 0 -> 54880 bytes .../harmonyos-sans-sc/Regular_4d7a5e.woff2 | Bin 0 -> 62728 bytes .../harmonyos-sans-sc/Regular_4fed1d.woff2 | Bin 0 -> 62176 bytes .../harmonyos-sans-sc/Regular_533bb6.woff2 | Bin 0 -> 55216 bytes .../harmonyos-sans-sc/Regular_68d530.woff2 | Bin 0 -> 67024 bytes .../harmonyos-sans-sc/Regular_6acba8.woff2 | Bin 0 -> 23640 bytes .../harmonyos-sans-sc/Regular_6cf07f.woff2 | Bin 0 -> 62924 bytes .../harmonyos-sans-sc/Regular_6dd231.woff2 | Bin 0 -> 61684 bytes .../harmonyos-sans-sc/Regular_6fde5a.woff2 | Bin 0 -> 62020 bytes .../harmonyos-sans-sc/Regular_7058e1.woff2 | Bin 0 -> 58376 bytes .../harmonyos-sans-sc/Regular_7a0ff1.woff2 | Bin 0 -> 56040 bytes .../harmonyos-sans-sc/Regular_7c169d.woff2 | Bin 0 -> 51740 bytes .../harmonyos-sans-sc/Regular_7ef7a1.woff2 | Bin 0 -> 57420 bytes .../harmonyos-sans-sc/Regular_7f7d1c.woff2 | Bin 0 -> 68304 bytes .../harmonyos-sans-sc/Regular_83d7dd.woff2 | Bin 0 -> 56852 bytes .../harmonyos-sans-sc/Regular_84452c.woff2 | Bin 0 -> 57576 bytes .../harmonyos-sans-sc/Regular_84f7ac.woff2 | Bin 0 -> 64412 bytes .../harmonyos-sans-sc/Regular_86f2d2.woff2 | Bin 0 -> 55828 bytes .../harmonyos-sans-sc/Regular_88d643.woff2 | Bin 0 -> 70588 bytes .../harmonyos-sans-sc/Regular_8a3521.woff2 | Bin 0 -> 61924 bytes .../harmonyos-sans-sc/Regular_8b2a9d.woff2 | Bin 0 -> 63336 bytes .../harmonyos-sans-sc/Regular_8c54f5.woff2 | Bin 0 -> 55260 bytes .../harmonyos-sans-sc/Regular_8ef126.woff2 | Bin 0 -> 63664 bytes .../harmonyos-sans-sc/Regular_8fcd67.woff2 | Bin 0 -> 58840 bytes .../harmonyos-sans-sc/Regular_92d092.woff2 | Bin 0 -> 58088 bytes .../harmonyos-sans-sc/Regular_95b6b4.woff2 | Bin 0 -> 60708 bytes .../harmonyos-sans-sc/Regular_96734e.woff2 | Bin 0 -> 57956 bytes .../harmonyos-sans-sc/Regular_997d05.woff2 | Bin 0 -> 58676 bytes .../harmonyos-sans-sc/Regular_9dbf33.woff2 | Bin 0 -> 60520 bytes .../harmonyos-sans-sc/Regular_a2360c.woff2 | Bin 0 -> 58360 bytes .../harmonyos-sans-sc/Regular_a3f550.woff2 | Bin 0 -> 61548 bytes .../harmonyos-sans-sc/Regular_a4d91f.woff2 | Bin 0 -> 57412 bytes .../harmonyos-sans-sc/Regular_a9cfd5.woff2 | Bin 0 -> 65716 bytes .../harmonyos-sans-sc/Regular_a9e9db.woff2 | Bin 0 -> 63856 bytes .../harmonyos-sans-sc/Regular_aab13d.woff2 | Bin 0 -> 58508 bytes .../harmonyos-sans-sc/Regular_ac4458.woff2 | Bin 0 -> 61236 bytes .../harmonyos-sans-sc/Regular_b00490.woff2 | Bin 0 -> 57964 bytes .../harmonyos-sans-sc/Regular_b13597.woff2 | Bin 0 -> 58020 bytes .../harmonyos-sans-sc/Regular_b2c226.woff2 | Bin 0 -> 65168 bytes .../harmonyos-sans-sc/Regular_b2e109.woff2 | Bin 0 -> 61924 bytes .../harmonyos-sans-sc/Regular_b62ca1.woff2 | Bin 0 -> 10696 bytes .../harmonyos-sans-sc/Regular_c59db4.woff2 | Bin 0 -> 66192 bytes .../harmonyos-sans-sc/Regular_cdc930.woff2 | Bin 0 -> 64200 bytes .../harmonyos-sans-sc/Regular_d0a30d.woff2 | Bin 0 -> 52628 bytes .../harmonyos-sans-sc/Regular_d605af.woff2 | Bin 0 -> 54008 bytes .../harmonyos-sans-sc/Regular_d892dd.woff2 | Bin 0 -> 60228 bytes .../harmonyos-sans-sc/Regular_d9b42a.woff2 | Bin 0 -> 53556 bytes .../harmonyos-sans-sc/Regular_da4d56.woff2 | Bin 0 -> 62300 bytes .../harmonyos-sans-sc/Regular_de2c82.woff2 | Bin 0 -> 56708 bytes .../harmonyos-sans-sc/Regular_e17466.woff2 | Bin 0 -> 61108 bytes .../harmonyos-sans-sc/Regular_e39c0d.woff2 | Bin 0 -> 59544 bytes .../harmonyos-sans-sc/Regular_ea8896.woff2 | Bin 0 -> 23860 bytes .../harmonyos-sans-sc/Regular_eccccb.woff2 | Bin 0 -> 59332 bytes .../harmonyos-sans-sc/Regular_f07e53.woff2 | Bin 0 -> 59212 bytes .../harmonyos-sans-sc/Regular_f61d6a.woff2 | Bin 0 -> 57940 bytes .../harmonyos-sans-sc/Regular_f64fe5.woff2 | Bin 0 -> 51236 bytes .../harmonyos-sans-sc/Regular_f796c7.woff2 | Bin 0 -> 64448 bytes .../harmonyos-sans-sc/Regular_fda05f.woff2 | Bin 0 -> 62356 bytes .../harmonyos-sans-sc/Regular_fe0341.woff2 | Bin 0 -> 60092 bytes .../harmonyos-sans-sc/Regular_fff490.woff2 | Bin 0 -> 63100 bytes public/fonts/harmonyos-sans-sc/Semibold.css | 680 ++ .../harmonyos-sans-sc/Semibold_035914.woff2 | Bin 0 -> 61292 bytes .../harmonyos-sans-sc/Semibold_0379f0.woff2 | Bin 0 -> 57932 bytes .../harmonyos-sans-sc/Semibold_03c22c.woff2 | Bin 0 -> 62848 bytes .../harmonyos-sans-sc/Semibold_0fa4e5.woff2 | Bin 0 -> 55744 bytes .../harmonyos-sans-sc/Semibold_162d10.woff2 | Bin 0 -> 57576 bytes .../harmonyos-sans-sc/Semibold_16edf9.woff2 | Bin 0 -> 61160 bytes .../harmonyos-sans-sc/Semibold_1ab105.woff2 | Bin 0 -> 60824 bytes .../harmonyos-sans-sc/Semibold_1b5db9.woff2 | Bin 0 -> 58020 bytes .../harmonyos-sans-sc/Semibold_1bf653.woff2 | Bin 0 -> 60304 bytes .../harmonyos-sans-sc/Semibold_205230.woff2 | Bin 0 -> 56260 bytes .../harmonyos-sans-sc/Semibold_2238a5.woff2 | Bin 0 -> 59372 bytes .../harmonyos-sans-sc/Semibold_249977.woff2 | Bin 0 -> 51560 bytes .../harmonyos-sans-sc/Semibold_2b266f.woff2 | Bin 0 -> 54172 bytes .../harmonyos-sans-sc/Semibold_2edd83.woff2 | Bin 0 -> 62724 bytes .../harmonyos-sans-sc/Semibold_33239d.woff2 | Bin 0 -> 58804 bytes .../harmonyos-sans-sc/Semibold_38d7af.woff2 | Bin 0 -> 60388 bytes .../harmonyos-sans-sc/Semibold_3d1b2a.woff2 | Bin 0 -> 70892 bytes .../harmonyos-sans-sc/Semibold_3e0e35.woff2 | Bin 0 -> 59468 bytes .../harmonyos-sans-sc/Semibold_3f7217.woff2 | Bin 0 -> 62176 bytes .../harmonyos-sans-sc/Semibold_48beb0.woff2 | Bin 0 -> 63356 bytes .../harmonyos-sans-sc/Semibold_4b11f9.woff2 | Bin 0 -> 54060 bytes .../harmonyos-sans-sc/Semibold_4bdb16.woff2 | Bin 0 -> 59352 bytes .../harmonyos-sans-sc/Semibold_5364ad.woff2 | Bin 0 -> 58744 bytes .../harmonyos-sans-sc/Semibold_5567e2.woff2 | Bin 0 -> 65976 bytes .../harmonyos-sans-sc/Semibold_585512.woff2 | Bin 0 -> 57560 bytes .../harmonyos-sans-sc/Semibold_592e5c.woff2 | Bin 0 -> 62328 bytes .../harmonyos-sans-sc/Semibold_59f2bf.woff2 | Bin 0 -> 62832 bytes .../harmonyos-sans-sc/Semibold_5ff619.woff2 | Bin 0 -> 56456 bytes .../harmonyos-sans-sc/Semibold_6308f6.woff2 | Bin 0 -> 61000 bytes .../harmonyos-sans-sc/Semibold_696098.woff2 | Bin 0 -> 63960 bytes .../harmonyos-sans-sc/Semibold_6a0a75.woff2 | Bin 0 -> 56096 bytes .../harmonyos-sans-sc/Semibold_6b489a.woff2 | Bin 0 -> 66724 bytes .../harmonyos-sans-sc/Semibold_6d6321.woff2 | Bin 0 -> 66424 bytes .../harmonyos-sans-sc/Semibold_7166d1.woff2 | Bin 0 -> 63824 bytes .../harmonyos-sans-sc/Semibold_746ab4.woff2 | Bin 0 -> 56940 bytes .../harmonyos-sans-sc/Semibold_798fe0.woff2 | Bin 0 -> 49176 bytes .../harmonyos-sans-sc/Semibold_8183f4.woff2 | Bin 0 -> 59200 bytes .../harmonyos-sans-sc/Semibold_85caa3.woff2 | Bin 0 -> 25924 bytes .../harmonyos-sans-sc/Semibold_87a0b0.woff2 | Bin 0 -> 64452 bytes .../harmonyos-sans-sc/Semibold_88c61b.woff2 | Bin 0 -> 57472 bytes .../harmonyos-sans-sc/Semibold_8d6f60.woff2 | Bin 0 -> 60220 bytes .../harmonyos-sans-sc/Semibold_93b52d.woff2 | Bin 0 -> 63988 bytes .../harmonyos-sans-sc/Semibold_9716a9.woff2 | Bin 0 -> 65888 bytes .../harmonyos-sans-sc/Semibold_98776b.woff2 | Bin 0 -> 61600 bytes .../harmonyos-sans-sc/Semibold_98aeda.woff2 | Bin 0 -> 63516 bytes .../harmonyos-sans-sc/Semibold_995738.woff2 | Bin 0 -> 11260 bytes .../harmonyos-sans-sc/Semibold_999ef3.woff2 | Bin 0 -> 63088 bytes .../harmonyos-sans-sc/Semibold_a0479f.woff2 | Bin 0 -> 58340 bytes .../harmonyos-sans-sc/Semibold_a2d1da.woff2 | Bin 0 -> 66024 bytes .../harmonyos-sans-sc/Semibold_a59330.woff2 | Bin 0 -> 65660 bytes .../harmonyos-sans-sc/Semibold_a66c95.woff2 | Bin 0 -> 66296 bytes .../harmonyos-sans-sc/Semibold_a8eb23.woff2 | Bin 0 -> 59364 bytes .../harmonyos-sans-sc/Semibold_ab0a44.woff2 | Bin 0 -> 66792 bytes .../harmonyos-sans-sc/Semibold_acb7e5.woff2 | Bin 0 -> 59728 bytes .../harmonyos-sans-sc/Semibold_b23485.woff2 | Bin 0 -> 61260 bytes .../harmonyos-sans-sc/Semibold_b30258.woff2 | Bin 0 -> 62128 bytes .../harmonyos-sans-sc/Semibold_b4367f.woff2 | Bin 0 -> 60976 bytes .../harmonyos-sans-sc/Semibold_b4e4f5.woff2 | Bin 0 -> 62624 bytes .../harmonyos-sans-sc/Semibold_b7823b.woff2 | Bin 0 -> 59600 bytes .../harmonyos-sans-sc/Semibold_b797d3.woff2 | Bin 0 -> 58328 bytes .../harmonyos-sans-sc/Semibold_bccf7a.woff2 | Bin 0 -> 52456 bytes .../harmonyos-sans-sc/Semibold_be8500.woff2 | Bin 0 -> 57844 bytes .../harmonyos-sans-sc/Semibold_c4b65c.woff2 | Bin 0 -> 58968 bytes .../harmonyos-sans-sc/Semibold_cf0ca5.woff2 | Bin 0 -> 55540 bytes .../harmonyos-sans-sc/Semibold_d42952.woff2 | Bin 0 -> 59876 bytes .../harmonyos-sans-sc/Semibold_d6f7b6.woff2 | Bin 0 -> 58204 bytes .../harmonyos-sans-sc/Semibold_db872c.woff2 | Bin 0 -> 64524 bytes .../harmonyos-sans-sc/Semibold_def583.woff2 | Bin 0 -> 58356 bytes .../harmonyos-sans-sc/Semibold_df300a.woff2 | Bin 0 -> 67680 bytes .../harmonyos-sans-sc/Semibold_dff643.woff2 | Bin 0 -> 57120 bytes .../harmonyos-sans-sc/Semibold_e2ddb8.woff2 | Bin 0 -> 65904 bytes .../harmonyos-sans-sc/Semibold_e3dbb9.woff2 | Bin 0 -> 58084 bytes .../harmonyos-sans-sc/Semibold_e58b2d.woff2 | Bin 0 -> 62620 bytes .../harmonyos-sans-sc/Semibold_e9183a.woff2 | Bin 0 -> 66548 bytes .../harmonyos-sans-sc/Semibold_ebd971.woff2 | Bin 0 -> 61244 bytes .../harmonyos-sans-sc/Semibold_ec2481.woff2 | Bin 0 -> 60508 bytes .../harmonyos-sans-sc/Semibold_ee8de8.woff2 | Bin 0 -> 67328 bytes .../harmonyos-sans-sc/Semibold_f8e3e1.woff2 | Bin 0 -> 58532 bytes .../harmonyos-sans-sc/Semibold_f9bc45.woff2 | Bin 0 -> 19216 bytes .../harmonyos-sans-sc/Semibold_fafd13.woff2 | Bin 0 -> 68836 bytes .../harmonyos-sans-sc/Semibold_fba4ed.woff2 | Bin 0 -> 61524 bytes .../harmonyos-sans-sc/Semibold_fdfabc.woff2 | Bin 0 -> 64444 bytes public/icons/primeicons.C1oiW3xv.eot | Bin 0 -> 89284 bytes public/icons/primeicons.Cw7jw2u3.woff2 | Bin 0 -> 32652 bytes public/icons/primeicons.DFbS0HxT.woff | Bin 0 -> 89184 bytes public/icons/primeicons.DI7WxhAS.svg | 390 + public/icons/primeicons.MNyB0pWW.ttf | Bin 0 -> 89108 bytes public/images/auth/roxy-idc-login-v2.jpg | Bin 0 -> 516472 bytes public/images/auth/roxy-idc-login-v2.png | Bin 0 -> 2246625 bytes public/images/auth/roxy-idc-login.png | Bin 0 -> 2302973 bytes public/images/brand/logo.png | Bin 0 -> 9420 bytes public/images/certification/alipay.svg | 1 + .../national-network-identity.png | Bin 0 -> 10146 bytes public/images/certification/wechat.svg | 1 + public/images/os/AlmaLinux.svg | 12 + public/images/os/ArchLinux.svg | 1 + public/images/os/CentOS.svg | 1 + public/images/os/Debian.svg | 1 + public/images/os/ESXi.svg | 1 + public/images/os/Fedora.svg | 1 + public/images/os/FreeBSD.svg | 13 + public/images/os/Linux.svg | 1 + public/images/os/OpenClaw.svg | 9 + public/images/os/OpenEuler.svg | 18 + public/images/os/Other.svg | 11 + public/images/os/RedHat.svg | 5 + public/images/os/Rocky.svg | 4 + public/images/os/TencentOS-Server.svg | 3 + public/images/os/Ubuntu.svg | 44 + public/images/os/Windows.svg | 1 + public/images/os/XenServer.svg | 44 + public/images/reference/cloud-server.png | Bin 0 -> 17146 bytes public/images/reference/console-preview.jpg | Bin 0 -> 70898 bytes public/images/reference/firewall.png | Bin 0 -> 20769 bytes public/robots.txt | 2 + scripts/check-source.mjs | 140 + scripts/reconstruct.mjs | 649 ++ tests/.gitignore | 1 + tests/README.md | 31 + tests/console.e2e.test.mjs | 1298 +++ tests/fixtures/api-server.mjs | 268 + 687 files changed, 171307 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 README.md create mode 100644 app/app.vue create mode 100644 app/assets/styles/AuthProviders.CgAWouSf.css create mode 100644 app/assets/styles/BackendNavEntry.Bx6IPica.css create mode 100644 app/assets/styles/BackendNavigation.CEj4LnzI.css create mode 100644 app/assets/styles/BuildUpdateNotice.CuqdqvlF.css create mode 100644 app/assets/styles/CaptchaField.BSN3ZbsD.css create mode 100644 app/assets/styles/ChartBox.CYP_mhat.css create mode 100644 app/assets/styles/ClientLevelDialog.DcYabp-W.css create mode 100644 app/assets/styles/CloudAccessExtras.CnBJlFAZ.css create mode 100644 app/assets/styles/CloudProductPicker.CAm9rmUl.css create mode 100644 app/assets/styles/CommonConfig.Cfik-oMe.css create mode 100644 app/assets/styles/CommonManage.qcc2l13i.css create mode 100644 app/assets/styles/CommonUpgrade.C8sZ-ExM.css create mode 100644 app/assets/styles/ConfigBandwidth.CWSH1WJZ.css create mode 100644 app/assets/styles/ConfigDiskAdd.C92e9ZuF.css create mode 100644 app/assets/styles/ConfigDiskCard.Dx9IqqQ_.css create mode 100644 app/assets/styles/ConfigResourceOption.Dj4VopnA.css create mode 100644 app/assets/styles/ConsoleLegalFooter.DAYWmXIB.css create mode 100644 app/assets/styles/DcimActions.Da2op5wy.css create mode 100644 app/assets/styles/DcimBilling.QV7PUjnH.css create mode 100644 app/assets/styles/DcimDefence.BYaQccXZ.css create mode 100644 app/assets/styles/DcimDomains.BT2s5hGW.css create mode 100644 app/assets/styles/DcimManage.BlqFeSOi.css create mode 100644 app/assets/styles/DcimMonitor.CiStTCbZ.css create mode 100644 app/assets/styles/DcimReinstallStatus.CuXeXmZ3.css create mode 100644 app/assets/styles/DcimUpgrade.DaLApYFa.css create mode 100644 app/assets/styles/FinanceConfig.CLwX1CC8.css create mode 100644 app/assets/styles/FlowPacketPanel.-RJSx13z.css create mode 100644 app/assets/styles/GeetestField.DiieTibK.css create mode 100644 app/assets/styles/GenericOAuthProviders.Bv8oNwXP.css create mode 100644 app/assets/styles/GlobalSearch.BQqObidy.css create mode 100644 app/assets/styles/HomeConsumeTrend.DfrmEdD9.css create mode 100644 app/assets/styles/HomeExpiringPanel.Ckflw2Hv.css create mode 100644 app/assets/styles/HomeNoticePanel.e5-qgzAs.css create mode 100644 app/assets/styles/HomeReferralPanel.DsgN33ME.css create mode 100644 app/assets/styles/HomeServerPanel.Do7AgMDx.css create mode 100644 app/assets/styles/HomeTicketPanel.LxPesukM.css create mode 100644 app/assets/styles/HomeTicketStat.C4kzybrY.css create mode 100644 app/assets/styles/HomeWalletCard.C5SHzGlJ.css create mode 100644 app/assets/styles/HostList.B3U15sJm.css create mode 100644 app/assets/styles/InstanceAccess.DIZBrksv.css create mode 100644 app/assets/styles/InstanceBilling.CvIGLT2J.css create mode 100644 app/assets/styles/InstanceDisks.Ca7NZxYd.css create mode 100644 app/assets/styles/InstanceLoadingShell.CwfiUwdU.css create mode 100644 app/assets/styles/InstanceManage.apzbBV1c.css create mode 100644 app/assets/styles/InstanceMonitor.B0X15iQt.css create mode 100644 app/assets/styles/InstanceMonitorSkeleton.C0FT51jJ.css create mode 100644 app/assets/styles/InstanceNetwork.CyucZaZp.css create mode 100644 app/assets/styles/InstanceOnDemand.okGWwgIJ.css create mode 100644 app/assets/styles/InstanceOverview.C9ExpxMB.css create mode 100644 app/assets/styles/InstanceRenewDialog.BHDAL6d3.css create mode 100644 app/assets/styles/InstanceServiceInfo.BftSVIeW.css create mode 100644 app/assets/styles/InstanceSmsCode.CsITfIEU.css create mode 100644 app/assets/styles/InstanceTraffic.CyyEAXl3.css create mode 100644 app/assets/styles/JyCloudConfig.kGfttaHi.css create mode 100644 app/assets/styles/KkyEcsConfig.BFaAwQPZ.css create mode 100644 app/assets/styles/KkyUpgrade.CkDmxFBM.css create mode 100644 app/assets/styles/LegacyDcimActions.DcIrQby6.css create mode 100644 app/assets/styles/LegacyDcimManage.5YRq508t.css create mode 100644 app/assets/styles/LegacyProductUpgrade.dzWGwGgY.css create mode 100644 app/assets/styles/MfCloudBackupPanel.BTlEe-fy.css create mode 100644 app/assets/styles/MfCloudConfig.DbgUu8qr.css create mode 100644 app/assets/styles/MfCloudDefence.B2vl5Yip.css create mode 100644 app/assets/styles/MfCloudIps.jhFnuvcs.css create mode 100644 app/assets/styles/MfCloudLogs.MTqtLGjA.css create mode 100644 app/assets/styles/MfCloudNat.C1uXa4fX.css create mode 100644 app/assets/styles/MfCloudResourceUpgrade.bSwLWjPg.css create mode 100644 app/assets/styles/MfCloudUpgrade.N7TNG8F1.css create mode 100644 app/assets/styles/MfCloudVpc.CpOEbuWs.css create mode 100644 app/assets/styles/MfDcimConfig.BhC_eZ0V.css create mode 100644 app/assets/styles/NotificationPreferences.DcH8Noxd.css create mode 100644 app/assets/styles/OperationToasts.DfA_b8om.css create mode 100644 app/assets/styles/OsIcon.CAi4Iz2S.css create mode 100644 app/assets/styles/PageInfoNotice._16xRFrB.css create mode 100644 app/assets/styles/PageSteps.B5K7G9zF.css create mode 100644 app/assets/styles/PaymentDialog.BNFKQF1U.css create mode 100644 app/assets/styles/PhoneCodeField.CwyHXfML.css create mode 100644 app/assets/styles/ProductCategoryNotice.CwaR3eXN.css create mode 100644 app/assets/styles/ProductConfigurationSummary.BqZns1LB.css create mode 100644 app/assets/styles/ProductCustomFields.B2QMnPil.css create mode 100644 app/assets/styles/ProductDescription.Ctb7jDuO.css create mode 100644 app/assets/styles/ProductGroupLabel.B1kWpFA-.css create mode 100644 app/assets/styles/PromoCodeField.qFEkB6Hm.css create mode 100644 app/assets/styles/RechargeDialog.DpsMly4r.css create mode 100644 app/assets/styles/RemfUpgrade.4stQ5ASH.css create mode 100644 app/assets/styles/RemoteConsole.DLmX5UZu.css create mode 100644 app/assets/styles/RichTextEditor.NkmgPT5m.css create mode 100644 app/assets/styles/RingProgress.CVwR7il5.css create mode 100644 app/assets/styles/RoxyMascot.CDqPSf2d.css create mode 100644 app/assets/styles/SecurityVerificationDialog.skYFo4v7.css create mode 100644 app/assets/styles/SensitiveValue.BSZlaRHT.css create mode 100644 app/assets/styles/TicketAttachments.DtbJGLkE.css create mode 100644 app/assets/styles/UploadField.BbTCTv6C.css create mode 100644 app/assets/styles/WechatConnection.DI5ko1xy.css create mode 100644 app/assets/styles/WithdrawDialog.ks0wdKEK.css create mode 100644 app/assets/styles/_id_.C-0--Lx-.css create mode 100644 app/assets/styles/_id_.CSXsMADH.css create mode 100644 app/assets/styles/_id_.gjoJy9S8.css create mode 100644 app/assets/styles/account.CTvLXxT_.css create mode 100644 app/assets/styles/api-keys.Bq3Csr53.css create mode 100644 app/assets/styles/bind.CFZQE2UH.css create mode 100644 app/assets/styles/blank.DOa3C9wi.css create mode 100644 app/assets/styles/cart.CSS2vTmS.css create mode 100644 app/assets/styles/cloud-server.CcwlOXJ0.css create mode 100644 app/assets/styles/create.gX6gpD00.css create mode 100644 app/assets/styles/customize.Cc123Awf.css create mode 100644 app/assets/styles/dedicated-server.CiJfMYtk.css create mode 100644 app/assets/styles/default.DFUVVR1i.css create mode 100644 app/assets/styles/domains.GiD6NSti.css create mode 100644 app/assets/styles/entry.Cs9kvuGi.css create mode 100644 app/assets/styles/error-404.IMo4BvbT.css create mode 100644 app/assets/styles/error-500.CT6S2vcm.css create mode 100644 app/assets/styles/finance.BkxKMno0.css create mode 100644 app/assets/styles/groups.Buw8nwl1.css create mode 100644 app/assets/styles/help.BSOB30LE.css create mode 100644 app/assets/styles/home.DWX5YkpJ.css create mode 100644 app/assets/styles/invoice.B6sYFYlb.css create mode 100644 app/assets/styles/invoices.t1P1GXOx.css create mode 100644 app/assets/styles/logbook.Y7gm684m.css create mode 100644 app/assets/styles/login.Clyo2_3T.css create mode 100644 app/assets/styles/messages.asRdYcVu.css create mode 100644 app/assets/styles/news.CbIzdrjt.css create mode 100644 app/assets/styles/notices.BXNGOj-Q.css create mode 100644 app/assets/styles/official-site.pBD-PXD7.css create mode 100644 app/assets/styles/orders.BflDlvVz.css create mode 100644 app/assets/styles/pages.DytekQXu.css create mode 100644 app/assets/styles/products.CrccEo2m.css create mode 100644 app/assets/styles/public-order.0RThfr7m.css create mode 100644 app/assets/styles/realname.BpRCvfXO.css create mode 100644 app/assets/styles/recommend.C1KCHBPJ.css create mode 100644 app/assets/styles/remote-console.zcxaOxxS.css create mode 100644 app/assets/styles/resources._aUrMsvM.css create mode 100644 app/assets/styles/server.DGuhrprb.css create mode 100644 app/assets/styles/settings.zV3AWuRw.css create mode 100644 app/assets/styles/ssh-keys.WWTOf2zG.css create mode 100644 app/assets/styles/tickets.Dz8JrDhQ.css create mode 100644 app/assets/styles/transfer.CAsJhVUW.css create mode 100644 app/assets/styles/vouchers.5FV4ozrh.css create mode 100644 app/components/AuthProviders.vue create mode 100644 app/components/BackendNavEntry.vue create mode 100644 app/components/BackendNavigation.vue create mode 100644 app/components/BuildUpdateNotice.vue create mode 100644 app/components/CaptchaField.vue create mode 100644 app/components/ChartBox.vue create mode 100644 app/components/ClientLevelDialog.vue create mode 100644 app/components/ConsoleLegalFooter.vue create mode 100644 app/components/GeetestField.vue create mode 100644 app/components/GenericOAuthProviders.vue create mode 100644 app/components/GlobalSearch.vue create mode 100644 app/components/HostList.vue create mode 100644 app/components/ListEmpty.vue create mode 100644 app/components/ListSegments.vue create mode 100644 app/components/MfCloudBackupPanel.vue create mode 100644 app/components/NotificationPreferences.vue create mode 100644 app/components/OperatePasswordGate.vue create mode 100644 app/components/OperationNotice.vue create mode 100644 app/components/OperationToasts.vue create mode 100644 app/components/OsIcon.vue create mode 100644 app/components/PageInfoNotice.vue create mode 100644 app/components/PageSteps.vue create mode 100644 app/components/PaymentDialog.vue create mode 100644 app/components/PhoneCodeField.vue create mode 100644 app/components/ProductCategoryNotice.vue create mode 100644 app/components/ProductConfigurationSummary.vue create mode 100644 app/components/ProductDescription.vue create mode 100644 app/components/ProductGroupLabel.vue create mode 100644 app/components/RechargeDialog.vue create mode 100644 app/components/RichTextEditor.vue create mode 100644 app/components/RingProgress.vue create mode 100644 app/components/SecurityVerificationDialog.vue create mode 100644 app/components/SensitiveValue.vue create mode 100644 app/components/TicketAttachments.vue create mode 100644 app/components/TicketNotice.vue create mode 100644 app/components/UploadField.vue create mode 100644 app/components/WechatConnection.vue create mode 100644 app/components/WithdrawDialog.vue create mode 100644 app/components/config/CloudProductPicker.vue create mode 100644 app/components/config/CommonConfig.vue create mode 100644 app/components/config/ConfigBandwidth.vue create mode 100644 app/components/config/ConfigCheckout.vue create mode 100644 app/components/config/ConfigChoiceGrid.vue create mode 100644 app/components/config/ConfigDiskAdd.vue create mode 100644 app/components/config/ConfigDiskCard.vue create mode 100644 app/components/config/ConfigLoadingShell.vue create mode 100644 app/components/config/ConfigResourceOption.vue create mode 100644 app/components/config/FinanceConfig.vue create mode 100644 app/components/config/JyCloudConfig.vue create mode 100644 app/components/config/KkyEcsConfig.vue create mode 100644 app/components/config/MfCloudConfig.vue create mode 100644 app/components/config/MfDcimConfig.vue create mode 100644 app/components/config/ProductCustomFields.vue create mode 100644 app/components/config/PromoCodeField.vue create mode 100644 app/components/home/HomeConsumeTrend.vue create mode 100644 app/components/home/HomeExpiringPanel.vue create mode 100644 app/components/home/HomeNoticePanel.vue create mode 100644 app/components/home/HomeReferralPanel.vue create mode 100644 app/components/home/HomeServerPanel.vue create mode 100644 app/components/home/HomeTicketPanel.vue create mode 100644 app/components/home/HomeTicketStat.vue create mode 100644 app/components/home/HomeWalletCard.vue create mode 100644 app/components/home/RoxyMascot.vue create mode 100644 app/components/instance/CloudAccessExtras.vue create mode 100644 app/components/instance/CommonManage.vue create mode 100644 app/components/instance/CommonUpgrade.vue create mode 100644 app/components/instance/DcimActions.vue create mode 100644 app/components/instance/DcimBilling.vue create mode 100644 app/components/instance/DcimDefence.vue create mode 100644 app/components/instance/DcimDomains.vue create mode 100644 app/components/instance/DcimManage.vue create mode 100644 app/components/instance/DcimMonitor.vue create mode 100644 app/components/instance/DcimReinstallStatus.vue create mode 100644 app/components/instance/DcimUpgrade.vue create mode 100644 app/components/instance/FlowPacketPanel.vue create mode 100644 app/components/instance/ImagePurchaseDialog.vue create mode 100644 app/components/instance/InstanceAccess.vue create mode 100644 app/components/instance/InstanceBilling.vue create mode 100644 app/components/instance/InstanceDisks.vue create mode 100644 app/components/instance/InstanceLoadingShell.vue create mode 100644 app/components/instance/InstanceManage.vue create mode 100644 app/components/instance/InstanceMonitor.vue create mode 100644 app/components/instance/InstanceMonitorSkeleton.vue create mode 100644 app/components/instance/InstanceNetwork.vue create mode 100644 app/components/instance/InstanceOnDemand.vue create mode 100644 app/components/instance/InstanceOverview.vue create mode 100644 app/components/instance/InstanceRenewDialog.vue create mode 100644 app/components/instance/InstanceServiceInfo.vue create mode 100644 app/components/instance/InstanceSmsCode.vue create mode 100644 app/components/instance/InstanceStatusTag.vue create mode 100644 app/components/instance/InstanceTraffic.vue create mode 100644 app/components/instance/LegacyDcimActions.vue create mode 100644 app/components/instance/LegacyDcimManage.vue create mode 100644 app/components/instance/LegacyProductUpgrade.vue create mode 100644 app/components/instance/RemfUpgrade.vue create mode 100644 app/components/instance/RemoteConsole.vue create mode 100644 app/components/kkyecs/KkyUpgrade.vue create mode 100644 app/components/mfcloud/MfCloudDefence.vue create mode 100644 app/components/mfcloud/MfCloudIps.vue create mode 100644 app/components/mfcloud/MfCloudLogs.vue create mode 100644 app/components/mfcloud/MfCloudNat.vue create mode 100644 app/components/mfcloud/MfCloudResourceUpgrade.vue create mode 100644 app/components/mfcloud/MfCloudUpgrade.vue create mode 100644 app/components/mfcloud/MfCloudVpc.vue create mode 100644 app/config/locale.zh-CN.json create mode 100644 app/config/primevue.js create mode 100644 app/layouts/blank.vue create mode 100644 app/layouts/default.vue create mode 100644 app/layouts/official-site.vue create mode 100644 app/layouts/public-order.vue create mode 100644 app/lib/_plugin-vue_export-helper.js create mode 100644 app/lib/auth-redirect.js create mode 100644 app/lib/auth.js create mode 100644 app/lib/backend-menu.js create mode 100644 app/lib/bandwidth-display.js create mode 100644 app/lib/cart-edit.js create mode 100644 app/lib/cloud-instance-management.js create mode 100644 app/lib/common-advanced-rules.js create mode 100644 app/lib/complete-list.js create mode 100644 app/lib/composables-2.js create mode 100644 app/lib/configuration-display.js create mode 100644 app/lib/content-route.js create mode 100644 app/lib/dict.js create mode 100644 app/lib/finance-resource-chart.js create mode 100644 app/lib/instance-data.js create mode 100644 app/lib/instance-status.js create mode 100644 app/lib/interval.js create mode 100644 app/lib/invoice.js create mode 100644 app/lib/modules.js create mode 100644 app/lib/navigation-state.js create mode 100644 app/lib/oauth.js create mode 100644 app/lib/order-image-continuation.js create mode 100644 app/lib/os-name.js create mode 100644 app/lib/password-2.js create mode 100644 app/lib/product-description-data.js create mode 100644 app/lib/product-fields.js create mode 100644 app/lib/product-name.js create mode 100644 app/lib/product-order-module.js create mode 100644 app/lib/purchase-limit-state.js create mode 100644 app/lib/remote-console.js create mode 100644 app/lib/renewal-quote.js create mode 100644 app/lib/rolldown-runtime.js create mode 100644 app/lib/sanitize.js create mode 100644 app/lib/server-page.js create mode 100644 app/lib/storage-capacity.js create mode 100644 app/lib/ticketAttachments.js create mode 100644 app/lib/useCaptcha.js create mode 100644 app/lib/useListPage.js create mode 100644 app/lib/useMailbox.js create mode 100644 app/lib/useOAuth.js create mode 100644 app/lib/useOfficialSiteContent.js create mode 100644 app/lib/useSiteConfig.js create mode 100644 app/lib/useTheme.js create mode 100644 app/lib/useVerifyCode.js create mode 100644 app/lib/useWithdrawAvailability.js create mode 100644 app/lib/wechat-binding.js create mode 100644 app/middleware/auth.global.js create mode 100644 app/pages/account/api-keys.vue create mode 100644 app/pages/account/connections.vue create mode 100644 app/pages/account/index.vue create mode 100644 app/pages/account/realname/company.vue create mode 100644 app/pages/account/realname/index.vue create mode 100644 app/pages/account/realname/personal.vue create mode 100644 app/pages/bills/[id].vue create mode 100644 app/pages/bills/index.vue create mode 100644 app/pages/cart/index.vue create mode 100644 app/pages/cloud-servers/index.vue create mode 100644 app/pages/dedicated-servers/index.vue create mode 100644 app/pages/finance/index.vue create mode 100644 app/pages/forgot-password.vue create mode 100644 app/pages/help.vue create mode 100644 app/pages/home.htm.vue create mode 100644 app/pages/index.vue create mode 100644 app/pages/invoices/index.vue create mode 100644 app/pages/invoices/invoice.vue create mode 100644 app/pages/invoices/request.vue create mode 100644 app/pages/invoices/settings/index.vue create mode 100644 app/pages/logbook/index.vue create mode 100644 app/pages/login.vue create mode 100644 app/pages/messages/index.vue create mode 100644 app/pages/news.vue create mode 100644 app/pages/notices/index.vue create mode 100644 app/pages/oauth/bind.vue create mode 100644 app/pages/oauth/callback.vue create mode 100644 app/pages/official-site.vue create mode 100644 app/pages/orders/[id].vue create mode 100644 app/pages/orders/index.vue create mode 100644 app/pages/orders/order/index.vue create mode 100644 app/pages/orders/order/paid.vue create mode 100644 app/pages/orders/order/pay.vue create mode 100644 app/pages/products/[id].vue create mode 100644 app/pages/products/cloud-server.vue create mode 100644 app/pages/products/dedicated-server/customize.vue create mode 100644 app/pages/products/dedicated-server/index.vue create mode 100644 app/pages/products/index.vue create mode 100644 app/pages/recommend/index.vue create mode 100644 app/pages/register.vue create mode 100644 app/pages/remote-console.vue create mode 100644 app/pages/resources.vue create mode 100644 app/pages/security/domains/index.vue create mode 100644 app/pages/security/groups/index.vue create mode 100644 app/pages/security/ssh-keys/index.vue create mode 100644 app/pages/servers/server.vue create mode 100644 app/pages/tickets/[id].vue create mode 100644 app/pages/tickets/create.vue create mode 100644 app/pages/tickets/index.vue create mode 100644 app/pages/tickets/ticket.vue create mode 100644 app/pages/transfer/index.vue create mode 100644 app/pages/vouchers/index.vue create mode 100644 app/plugins/01-ui.client.js create mode 100644 app/plugins/02-bootstrap.client.js create mode 100644 app/plugins/03-session.client.js create mode 100644 app/utils/access.js create mode 100644 app/utils/brand.js create mode 100644 app/utils/crypto.js create mode 100644 app/utils/load-module.js create mode 100644 docs/acceptance-assets/a-legacy-temporary-credential-is-stripped-and-reaches-the-verified-home.png create mode 100644 docs/acceptance-assets/a-rejected-legacy-credential-remains-removed-from-the-error-url.png create mode 100644 docs/acceptance-assets/a-rejected-legacy-credential-stays-out-of-the-error-url-and-can-be-retried.png create mode 100644 docs/acceptance-assets/a-stalled-payment-status-request-cannot-swallow-the-payment-deadline.png create mode 100644 docs/acceptance-assets/an-authoritative-empty-menu-does-not-expose-fallback-links.png create mode 100644 docs/acceptance-assets/an-envelope-401-clears-the-session-and-returns-to-login.png create mode 100644 docs/acceptance-assets/an-existing-session-entering-the-legacy-route-is-verified-again.png create mode 100644 docs/acceptance-assets/an-expired-identity-on-payment-confirmation-cannot-restart-payment-initialization.png create mode 100644 docs/acceptance-assets/auth-guard-preserves-the-protected-destination.png create mode 100644 docs/acceptance-assets/disabled-sms-login-cannot-override-the-available-password-method.png create mode 100644 docs/acceptance-assets/legacy-error-390.png create mode 100644 docs/acceptance-assets/logging-out-of-an-open-payment-page-cannot-reinitialize-its-payment-data.png create mode 100644 docs/acceptance-assets/login-390.png create mode 100644 docs/acceptance-assets/login-rejects-a-backslash-return-destination.png create mode 100644 docs/acceptance-assets/login-rejects-a-encoded-slash-return-destination.png create mode 100644 docs/acceptance-assets/login-rejects-a-protocol-relative-return-destination.png create mode 100644 docs/acceptance-assets/logout-clears-local-access-while-its-api-request-remains-pending.png create mode 100644 docs/acceptance-assets/logout-in-another-tab-revokes-both-visible-sessions.png create mode 100644 docs/acceptance-assets/password-login-uses-the-deployed-encrypted-field-contract.png create mode 100644 docs/acceptance-assets/payment-handles-the-deployed-top-level-paid-response.png create mode 100644 docs/acceptance-assets/sms-320.png create mode 100644 docs/acceptance-assets/sms-390.png create mode 100644 docs/acceptance-assets/sms-only-login-honors-site-settings-and-the-verification-countdown-contract.png create mode 100644 docs/acceptance-assets/ssh-create-edit-and-delete-return-the-final-page-to-a-valid-page.png create mode 100644 docs/acceptance-assets/ssh-editor-390.png create mode 100644 docs/acceptance-assets/ssh-search-paginates-25-matches-without-repeating-all-rows.png create mode 100644 docs/acceptance-assets/the-default-request-deadline-aborts-an-unfinished-json-body-and-allows-retry.png create mode 100644 docs/acceptance-requests.json create mode 100644 docs/acceptance.json create mode 100644 docs/audit-coverage.json create mode 100644 docs/defect-ledger.json create mode 100644 docs/dependency-audit.json create mode 100644 docs/module-inventory.json create mode 100644 docs/project-completeness.md create mode 100644 docs/reconstruction-plan.md create mode 100644 docs/validation.md create mode 100644 nuxt.config.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/favicon.ico create mode 100644 public/favicon.svg create mode 100644 public/fonts/harmonyos-sans-sc/Bold.css create mode 100644 public/fonts/harmonyos-sans-sc/Bold_00397b.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_09158a.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_09a9b3.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_0ca5a9.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_0cdc77.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_0d19f4.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_0d29b4.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_0dbc27.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_0e127a.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_0f358f.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_0ff13d.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_135790.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_138611.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_16a8ba.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_1c96d4.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_22048b.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_269445.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_2c89c1.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_2f7c7d.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_2fefd6.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_306bba.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_3149e0.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_35c17d.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_36ad1b.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_3b743f.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_3c428d.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_53d21e.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_545620.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_5825df.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_5a8449.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_5ae301.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_5b1e0f.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_666915.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_6927bf.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_6938ca.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_6d65eb.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_70874c.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_71407d.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_76f2de.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_782503.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_813dd1.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_82438c.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_87c494.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_8867bc.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_8a2aad.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_8ea124.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_8ea677.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_971f00.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_9ad5e8.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_a04e21.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_a0f240.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_aacef2.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_abac36.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_b028be.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_b1143d.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_b8977e.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_bba9bc.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_bc06aa.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_bee5fd.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_bf7217.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_c2b336.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_c37197.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_c614c1.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_c728d8.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_cd2170.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_cf29b0.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_d2da49.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_d829f0.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_d8e0ef.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_d95e9e.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_d9776c.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_df3eef.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_e7152d.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_e7daea.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_e8003a.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_eac724.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_ed0d20.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_eeb3fd.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_f7ca8a.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_f9818b.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_fdb231.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Bold_fdc333.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/LICENSE.txt create mode 100644 public/fonts/harmonyos-sans-sc/Regular.css create mode 100644 public/fonts/harmonyos-sans-sc/Regular_00a682.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_0f9ed6.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_121ef3.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_170a05.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_17f172.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_217dc2.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_256855.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_272cc0.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_27c723.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_28749b.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_2b1dc1.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_2dce0b.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_3056fd.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_312071.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_375414.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_39f71f.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_3ef9bb.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_3fc7ac.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_409c84.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_44123f.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_449d8d.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_45ef02.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_47cfe5.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_4d7a5e.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_4fed1d.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_533bb6.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_68d530.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_6acba8.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_6cf07f.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_6dd231.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_6fde5a.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_7058e1.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_7a0ff1.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_7c169d.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_7ef7a1.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_7f7d1c.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_83d7dd.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_84452c.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_84f7ac.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_86f2d2.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_88d643.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_8a3521.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_8b2a9d.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_8c54f5.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_8ef126.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_8fcd67.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_92d092.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_95b6b4.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_96734e.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_997d05.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_9dbf33.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_a2360c.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_a3f550.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_a4d91f.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_a9cfd5.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_a9e9db.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_aab13d.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_ac4458.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_b00490.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_b13597.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_b2c226.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_b2e109.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_b62ca1.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_c59db4.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_cdc930.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_d0a30d.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_d605af.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_d892dd.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_d9b42a.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_da4d56.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_de2c82.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_e17466.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_e39c0d.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_ea8896.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_eccccb.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_f07e53.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_f61d6a.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_f64fe5.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_f796c7.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_fda05f.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_fe0341.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Regular_fff490.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold.css create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_035914.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_0379f0.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_03c22c.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_0fa4e5.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_162d10.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_16edf9.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_1ab105.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_1b5db9.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_1bf653.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_205230.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_2238a5.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_249977.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_2b266f.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_2edd83.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_33239d.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_38d7af.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_3d1b2a.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_3e0e35.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_3f7217.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_48beb0.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_4b11f9.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_4bdb16.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_5364ad.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_5567e2.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_585512.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_592e5c.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_59f2bf.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_5ff619.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_6308f6.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_696098.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_6a0a75.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_6b489a.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_6d6321.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_7166d1.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_746ab4.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_798fe0.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_8183f4.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_85caa3.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_87a0b0.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_88c61b.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_8d6f60.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_93b52d.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_9716a9.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_98776b.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_98aeda.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_995738.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_999ef3.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_a0479f.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_a2d1da.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_a59330.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_a66c95.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_a8eb23.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_ab0a44.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_acb7e5.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_b23485.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_b30258.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_b4367f.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_b4e4f5.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_b7823b.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_b797d3.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_bccf7a.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_be8500.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_c4b65c.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_cf0ca5.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_d42952.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_d6f7b6.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_db872c.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_def583.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_df300a.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_dff643.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_e2ddb8.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_e3dbb9.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_e58b2d.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_e9183a.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_ebd971.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_ec2481.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_ee8de8.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_f8e3e1.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_f9bc45.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_fafd13.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_fba4ed.woff2 create mode 100644 public/fonts/harmonyos-sans-sc/Semibold_fdfabc.woff2 create mode 100644 public/icons/primeicons.C1oiW3xv.eot create mode 100644 public/icons/primeicons.Cw7jw2u3.woff2 create mode 100644 public/icons/primeicons.DFbS0HxT.woff create mode 100644 public/icons/primeicons.DI7WxhAS.svg create mode 100644 public/icons/primeicons.MNyB0pWW.ttf create mode 100644 public/images/auth/roxy-idc-login-v2.jpg create mode 100644 public/images/auth/roxy-idc-login-v2.png create mode 100644 public/images/auth/roxy-idc-login.png create mode 100644 public/images/brand/logo.png create mode 100644 public/images/certification/alipay.svg create mode 100644 public/images/certification/national-network-identity.png create mode 100644 public/images/certification/wechat.svg create mode 100755 public/images/os/AlmaLinux.svg create mode 100755 public/images/os/ArchLinux.svg create mode 100755 public/images/os/CentOS.svg create mode 100755 public/images/os/Debian.svg create mode 100755 public/images/os/ESXi.svg create mode 100755 public/images/os/Fedora.svg create mode 100755 public/images/os/FreeBSD.svg create mode 100755 public/images/os/Linux.svg create mode 100755 public/images/os/OpenClaw.svg create mode 100755 public/images/os/OpenEuler.svg create mode 100755 public/images/os/Other.svg create mode 100755 public/images/os/RedHat.svg create mode 100755 public/images/os/Rocky.svg create mode 100755 public/images/os/TencentOS-Server.svg create mode 100755 public/images/os/Ubuntu.svg create mode 100755 public/images/os/Windows.svg create mode 100755 public/images/os/XenServer.svg create mode 100644 public/images/reference/cloud-server.png create mode 100644 public/images/reference/console-preview.jpg create mode 100644 public/images/reference/firewall.png create mode 100644 public/robots.txt create mode 100644 scripts/check-source.mjs create mode 100644 scripts/reconstruct.mjs create mode 100644 tests/.gitignore create mode 100644 tests/README.md create mode 100644 tests/console.e2e.test.mjs create mode 100644 tests/fixtures/api-server.mjs diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..b109896 --- /dev/null +++ b/.env.example @@ -0,0 +1,3 @@ +# Backend origin only. The client appends /console/v1. +# Leave empty when your reverse proxy serves the API on the same origin. +NUXT_PUBLIC_API_BASE= diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..40dc90a --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +node_modules/ +.nuxt/ +.output/ +.data/ +test-results/ +.env +.env.* +!.env.example diff --git a/README.md b/README.md new file mode 100644 index 0000000..c14fae2 --- /dev/null +++ b/README.md @@ -0,0 +1,72 @@ +# crashwork-console 完整前端工程(源码重建版) + +这是根据当前 `20261025-kky-traffic-display` 发布包重建的独立工程,不是原始源码的逐字恢复。 +覆盖 52 个页面、104 个业务组件、4 套布局,包含现有图片、字体和样式。开发、构建和运行均不依赖旧发布目录。 +这里交付的是整个会员中心前端,不是仅含四个改写文件的示例。已只读核对服务器当前发布版本; +模块元数据及其 735 个构建资源与重建依据一致。范围、证据与边界见 [完整项目交接说明](docs/project-completeness.md)。 + +原工程的模板、注释和局部变量名已在编译时丢失。多数页面恢复为可编辑的 Vue 单文件组件及渲染函数, +部分局部变量仍为短名;请求/会话核心、应用入口、鉴权、主题和图表集成已重新编写。 +第二轮已将登录页、旧平台登录入口、SSH 密钥页和公共认证布局改为手写 ` + + diff --git a/app/assets/styles/AuthProviders.CgAWouSf.css b/app/assets/styles/AuthProviders.CgAWouSf.css new file mode 100644 index 0000000..eed09d3 --- /dev/null +++ b/app/assets/styles/AuthProviders.CgAWouSf.css @@ -0,0 +1,211 @@ +.auth-providers[data-v-9d0ee2f9] { + border-left: 1px solid var(--p-content-border-color); + background: var(--p-content-hover-background); + min-width: 0; + font-size: inherit; + flex-direction: column; + padding: 32px; + display: flex; +} +.provider-panel[data-v-9d0ee2f9] { + text-align: center; + flex-direction: column; + flex: 1; + min-height: 330px; + padding: 16px 0 28px; +} +.provider-panel[data-v-9d0ee2f9], +.provider-qr-placeholder[data-v-9d0ee2f9] { + justify-content: center; + align-items: center; + display: flex; +} +.provider-qr-placeholder[data-v-9d0ee2f9] { + border: 2px dashed var(--p-content-border-color); + background: var(--p-content-background); + width: 176px; + height: 176px; + color: var(--p-text-muted-color); + border-radius: 12px; + margin-bottom: 20px; +} +.provider-qr-placeholder .pi[data-v-9d0ee2f9] { + font-size: 48px; +} +.provider-heading[data-v-9d0ee2f9] { + color: var(--p-text-color); + margin: 0; + font-size: 1em; + font-weight: 600; +} +.provider-description[data-v-9d0ee2f9] { + color: var(--p-text-muted-color); + margin: 8px 0 0; + font-size: 1em; + line-height: 1.6; +} +.provider-tabs[data-v-9d0ee2f9] { + background: color-mix( + in srgb, + var(--p-text-color) 6%, + var(--p-content-background) + ); + border-radius: 10px; + grid-template-columns: repeat(2, minmax(0, 1fr)); + padding: 4px; + display: grid; + position: relative; +} +.provider-tab-indicator[data-v-9d0ee2f9] { + background: var(--p-content-background); + pointer-events: none; + border-radius: 7px; + width: calc(50% - 4px); + transition: transform 0.2s; + position: absolute; + top: 4px; + bottom: 4px; + left: 4px; + box-shadow: 0 1px 3px #00000014; +} +.provider-tabs button[data-v-9d0ee2f9] { + min-height: 44px; + color: var(--p-text-muted-color); + font: inherit; + cursor: pointer; + background: 0 0; + border: 0; + border-radius: 7px; + padding: 8px; + font-weight: 500; + position: relative; +} +.provider-tabs button.active[data-v-9d0ee2f9] { + color: var(--p-text-color); +} +.provider-tabs button[data-v-9d0ee2f9]:disabled { + opacity: 0.45; + cursor: not-allowed; +} +.provider-tabs button[data-v-9d0ee2f9]:focus-visible { + outline: 2px solid var(--p-primary-color); + outline-offset: -2px; +} +.provider-config-error[data-v-9d0ee2f9] { + margin-top: 16px; +} +.login-qr[data-v-9d0ee2f9] .p-button { + min-height: 44px; + font-size: 1em; +} +@media (width<=760px) { + .auth-providers[data-v-9d0ee2f9] { + border-left: 0; + border-top: 1px solid var(--p-content-border-color); + padding: 24px; + } + .provider-panel[data-v-9d0ee2f9] { + min-height: 300px; + padding-top: 0; + } + .provider-qr-placeholder[data-v-9d0ee2f9] { + width: 152px; + height: 152px; + } +} +@media (prefers-reduced-motion: reduce) { + .provider-tab-indicator[data-v-9d0ee2f9] { + transition: none; + } +} +.login-qr[data-v-9d0ee2f9] { + grid-template-rows: 200px 64px 44px; + justify-items: center; + gap: 8px; + width: 100%; + padding: 12px 0; + font-size: 1em; + display: grid; +} +.qr-stage[data-v-9d0ee2f9] { + justify-content: center; + height: 200px; + display: flex; +} +.qr-stage[data-v-9d0ee2f9], +.qr-status[data-v-9d0ee2f9] { + width: 100%; + min-height: 0; +} +.qr-status[data-v-9d0ee2f9] { + align-items: center; + display: grid; + overflow: auto; +} +.qr-status[data-v-9d0ee2f9] .p-message { + margin: 0; +} +.qr-actions[data-v-9d0ee2f9] { + height: 44px; +} +.qr-request[data-v-9d0ee2f9] { + flex-direction: column; + gap: 12px; + width: 100%; + height: 100%; + display: flex; +} +.qr-request[data-v-9d0ee2f9] .p-button-icon { + font-size: 32px; +} +.qr-box[data-v-9d0ee2f9] { + border: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + border-radius: 12px; + justify-content: center; + align-items: center; + width: 200px; + height: 200px; + display: flex; + overflow: hidden; +} +.qr-box-idle[data-v-9d0ee2f9] { + background: 0 0; + border-style: dashed; +} +.qr-img[data-v-9d0ee2f9] { + -o-object-fit: contain; + object-fit: contain; + width: 100%; + height: 100%; +} +.qr-img-dim[data-v-9d0ee2f9] { + opacity: 0.35; +} +.qr-tip[data-v-9d0ee2f9] { + color: var(--p-text-color); + margin: 0; +} +.qr-clients[data-v-9d0ee2f9] { + flex-direction: column; + gap: 12px; + width: 100%; + max-height: 200px; + overflow-y: auto; +} +.qr-client[data-v-9d0ee2f9], +.qr-clients[data-v-9d0ee2f9] { + align-items: center; + display: flex; +} +.qr-client[data-v-9d0ee2f9] { + cursor: pointer; + gap: 8px; +} +.qr-client.disabled[data-v-9d0ee2f9] { + opacity: 0.5; + cursor: not-allowed; +} +.qr-client-btn[data-v-9d0ee2f9] { + margin-top: 4px; +} diff --git a/app/assets/styles/BackendNavEntry.Bx6IPica.css b/app/assets/styles/BackendNavEntry.Bx6IPica.css new file mode 100644 index 0000000..f666974 --- /dev/null +++ b/app/assets/styles/BackendNavEntry.Bx6IPica.css @@ -0,0 +1,23 @@ +.configured-external[data-v-b0009398], +.nav-unavailable[data-v-b0009398] { + align-items: center; + gap: 10.5px; + display: flex; +} +.nav-unavailable[data-v-b0009398] { + color: var(--p-text-muted-color); + cursor: not-allowed; + text-align: left; + width: 100%; + font: inherit; + background: 0 0; + border: 0; +} +.nav-unavailable small[data-v-b0009398] { + white-space: nowrap; + font-size: 0.75rem; +} +.external-icon[data-v-b0009398] { + color: var(--p-text-muted-color); + font-size: 0.75rem; +} diff --git a/app/assets/styles/BackendNavigation.CEj4LnzI.css b/app/assets/styles/BackendNavigation.CEj4LnzI.css new file mode 100644 index 0000000..cb33cf9 --- /dev/null +++ b/app/assets/styles/BackendNavigation.CEj4LnzI.css @@ -0,0 +1,21 @@ +.nav-load-error[data-v-02b58e93] { + color: var(--p-text-muted-color); + justify-content: space-between; + align-items: center; + gap: 8px; + padding: 8.75px 14px; + font-size: 0.875rem; + display: flex; +} +.nav-placeholder[data-v-02b58e93] { + gap: 18px; + padding: 20px 14px; + display: grid; +} +.nav-placeholder span[data-v-02b58e93] { + background: var(--p-content-hover-background); + border-radius: 4px; + width: 78%; + height: 20px; + display: block; +} diff --git a/app/assets/styles/BuildUpdateNotice.CuqdqvlF.css b/app/assets/styles/BuildUpdateNotice.CuqdqvlF.css new file mode 100644 index 0000000..3dc7895 --- /dev/null +++ b/app/assets/styles/BuildUpdateNotice.CuqdqvlF.css @@ -0,0 +1,31 @@ +.build-notice[data-v-fc2ba853] { + z-index: 1100; + border: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + border-radius: 12px; + flex-direction: column; + gap: 12px; + max-width: 420px; + padding: 20px; + display: flex; + position: fixed; + bottom: 24px; + right: 24px; + box-shadow: 0 8px 32px #0002; +} +.build-notice p[data-v-fc2ba853] { + color: var(--p-text-muted-color); + margin: 8px 0 0; +} +.build-actions[data-v-fc2ba853] { + justify-content: flex-end; + gap: 8px; + display: flex; +} +@media (width<=500px) { + .build-notice[data-v-fc2ba853] { + bottom: 12px; + left: 12px; + right: 12px; + } +} diff --git a/app/assets/styles/CaptchaField.BSN3ZbsD.css b/app/assets/styles/CaptchaField.BSN3ZbsD.css new file mode 100644 index 0000000..dffeb76 --- /dev/null +++ b/app/assets/styles/CaptchaField.BSN3ZbsD.css @@ -0,0 +1,37 @@ +.field[data-v-5ba6618f] { + flex-direction: column; + gap: 6px; + display: flex; +} +.field > label[data-v-5ba6618f] { + color: var(--p-text-color, #334155); + font-size: 0.9375rem; +} +.row[data-v-5ba6618f] { + gap: 10px; + display: flex; +} +.row[data-v-5ba6618f] > :first-child { + flex: 1; +} +.img[data-v-5ba6618f] { + border: 1px solid var(--p-content-border-color, #e2e8f0); + background: var(--p-content-background); + cursor: pointer; + width: 110px; + height: 40px; + color: var(--p-text-muted-color, #94a3b8); + border-radius: 6px; + flex-shrink: 0; + justify-content: center; + align-items: center; + padding: 0; + display: flex; + overflow: hidden; +} +.img img[data-v-5ba6618f] { + -o-object-fit: cover; + object-fit: cover; + width: 100%; + height: 100%; +} diff --git a/app/assets/styles/ChartBox.CYP_mhat.css b/app/assets/styles/ChartBox.CYP_mhat.css new file mode 100644 index 0000000..3b938b3 --- /dev/null +++ b/app/assets/styles/ChartBox.CYP_mhat.css @@ -0,0 +1,9 @@ +.chart-box[data-v-c86d748f] { + width: 100%; + min-width: 0; + overflow: hidden; +} +.chart[data-v-c86d748f] { + width: 100%; + height: 100%; +} diff --git a/app/assets/styles/ClientLevelDialog.DcYabp-W.css b/app/assets/styles/ClientLevelDialog.DcYabp-W.css new file mode 100644 index 0000000..490a7d9 --- /dev/null +++ b/app/assets/styles/ClientLevelDialog.DcYabp-W.css @@ -0,0 +1,52 @@ +.lvl-state[data-v-7c5ffb84] { + text-align: center; + color: var(--p-text-muted-color, #94a3b8); + padding: 24px 0; + font-size: 0.9375rem; +} +.lvl-grid[data-v-7c5ffb84] { + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 12px 24px; + margin-bottom: 12px; + display: grid; +} +.lvl-item[data-v-7c5ffb84] { + justify-content: space-between; + align-items: center; + gap: 12px; + font-size: 0.9375rem; + display: flex; +} +.lvl-label[data-v-7c5ffb84] { + color: var(--p-text-muted-color, #64748b); +} +.lvl-value[data-v-7c5ffb84] { + font-weight: 500; +} +.lvl-desc[data-v-7c5ffb84] { + color: var(--p-text-muted-color, #94a3b8); + margin: 0 0 6px; + font-size: 0.875rem; +} +.lvl-section[data-v-7c5ffb84] { + margin: 14px 0 8px; + font-size: 1rem; + font-weight: 600; +} +.lvl-grid[data-v-7c5ffb84] { + gap: 21px; + padding-block: 14px; +} +.lvl-item[data-v-7c5ffb84] { + flex-direction: column; + align-items: flex-start; + gap: 7px; +} +.lvl-value[data-v-7c5ffb84] { + font-size: 1.25rem; +} +@media (width<=480px) { + .lvl-grid[data-v-7c5ffb84] { + grid-template-columns: minmax(0, 1fr); + } +} diff --git a/app/assets/styles/CloudAccessExtras.CnBJlFAZ.css b/app/assets/styles/CloudAccessExtras.CnBJlFAZ.css new file mode 100644 index 0000000..6c6925c --- /dev/null +++ b/app/assets/styles/CloudAccessExtras.CnBJlFAZ.css @@ -0,0 +1,68 @@ +.cloud-extras[data-v-94e7f654] { + flex-direction: column; + gap: 14px; + min-width: 0; + display: flex; +} +.block-title[data-v-94e7f654] { + margin: 0; + font-size: 1.125rem; + font-weight: 600; +} +.info-table[data-v-94e7f654] { + border: 1px solid var(--console-panel-border); + box-shadow: var(--console-panel-shadow); + background: var(--console-panel-bg); + border-radius: 6px; + overflow: hidden; +} +.kv[data-v-94e7f654] { + grid-template-columns: 16.6667% minmax(0, 1fr); + align-items: center; + min-height: 49px; + display: grid; +} +.kv + .kv[data-v-94e7f654] { + border-top: 1px solid var(--console-panel-border); +} +.kv[data-v-94e7f654]:nth-child(2n) { + background: var(--console-page-bg); +} +.kv > span[data-v-94e7f654] { + color: var(--p-text-muted-color); + padding: 14px; + font-weight: 600; +} +.kv > div[data-v-94e7f654] { + overflow-wrap: anywhere; + min-width: 0; + padding: 14px; +} +.action-cell[data-v-94e7f654] { + flex-direction: column; + align-items: flex-start; + gap: 7px; + display: flex; +} +.action-cell[data-v-94e7f654] .p-button { + max-width: 100%; +} +.action-cell[data-v-94e7f654] .p-button-label { + white-space: normal; + text-align: left; +} +.action-desc[data-v-94e7f654] { + color: var(--p-text-muted-color); + margin: 0; + font-size: 0.875rem; + line-height: 1.6; +} +@media (width<=480px) { + .kv[data-v-94e7f654] { + grid-template-columns: 100px minmax(0, 1fr); + } + .kv > div[data-v-94e7f654], + .kv > span[data-v-94e7f654] { + padding: 12px; + } +} diff --git a/app/assets/styles/CloudProductPicker.CAm9rmUl.css b/app/assets/styles/CloudProductPicker.CAm9rmUl.css new file mode 100644 index 0000000..e31e2c5 --- /dev/null +++ b/app/assets/styles/CloudProductPicker.CAm9rmUl.css @@ -0,0 +1,122 @@ +.cloud-product-picker[data-v-a438862d] { + flex-direction: column; + gap: 24px; + min-width: 0; + display: flex; +} +.selection-section[data-v-a438862d] { + min-width: 0; +} +.selection-section h3[data-v-a438862d] { + border-bottom: 1px solid var(--p-content-border-color); + margin: 0 0 21px; + padding-bottom: 15px; + font-size: 1rem; + font-weight: 400; +} +.selection-section .products-title[data-v-a438862d] { + border: 0; + margin-bottom: 8px; + padding-bottom: 0; +} +.selection-label[data-v-a438862d] { + margin-bottom: 8px; +} +.zone-options[data-v-a438862d] { + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 14px; + display: grid; +} +.product-options[data-v-a438862d] { + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 14px; + display: grid; +} +.product-option[data-v-a438862d], +.zone-option[data-v-a438862d] { + border: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + min-width: 0; + min-height: 60px; + color: var(--p-text-color); + text-align: left; + cursor: pointer; + overflow-wrap: anywhere; + border-radius: 5px; + flex-direction: column; + gap: 10px; + padding: 17px 14px; + display: flex; + box-shadow: 0 1px 3px #0000001a; +} +.zone-option[data-v-a438862d] { + justify-content: center; + font-weight: 600; +} +.product-option[data-v-a438862d] { + gap: 0; + padding: 0; + overflow: hidden; +} +.product-option strong[data-v-a438862d] { + background: color-mix( + in srgb, + var(--p-primary-color) 8%, + var(--p-content-background) + ); + padding: 14px; + font-weight: 600; + display: block; +} +.product-option span[data-v-a438862d] { + color: var(--p-text-muted-color); + padding: 14px; + font-size: 0.875rem; +} +.active[data-v-a438862d] { + outline: 2px solid var(--p-primary-color); + outline-offset: -1px; + background: color-mix( + in srgb, + var(--p-primary-color) 7%, + var(--p-content-background) + ); + color: var(--p-primary-700); +} +.product-option[data-v-a438862d]:disabled, +.zone-option[data-v-a438862d]:disabled { + opacity: 0.55; + cursor: not-allowed; +} +.product-option[data-v-a438862d]:focus-visible, +.zone-option[data-v-a438862d]:focus-visible { + outline: 2px solid var(--p-primary-color); + outline-offset: 3px; +} +.catalog-empty[data-v-a438862d] { + text-align: center; + color: var(--p-text-muted-color); + border: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + border-radius: 5px; + padding: 28px; +} +.catalog-empty i[data-v-a438862d] { + font-size: 1.75rem; +} +.catalog-empty a[data-v-a438862d] { + color: var(--p-primary-color); + text-decoration: none; +} +@media (width<=767px) { + .product-options[data-v-a438862d], + .zone-options[data-v-a438862d] { + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 8px; + } +} +@media (width<=390px) { + .product-options[data-v-a438862d] { + grid-template-columns: minmax(0, 1fr); + } +} diff --git a/app/assets/styles/CommonConfig.Cfik-oMe.css b/app/assets/styles/CommonConfig.Cfik-oMe.css new file mode 100644 index 0000000..bb4fae6 --- /dev/null +++ b/app/assets/styles/CommonConfig.Cfik-oMe.css @@ -0,0 +1,46 @@ +.cycle-warn[data-v-bc59a2b1] { + flex-shrink: 0; +} +.hint[data-v-bc59a2b1] { + color: var(--p-text-muted-color); + font-size: 0.875rem; +} +.cascade-controls[data-v-bc59a2b1], +.repeat-controls[data-v-bc59a2b1] { + flex-wrap: wrap; + flex: 1; + align-items: center; + gap: 8px; + min-width: 0; + display: flex; +} +.repeat-controls[data-v-bc59a2b1] { + flex-direction: column; + align-items: stretch; +} +.repeat-row[data-v-bc59a2b1] { + align-items: center; + gap: 8px; + min-width: 0; + display: flex; +} +.repeat-label[data-v-bc59a2b1] { + color: var(--p-text-muted-color); + flex: 0 0 84px; + font-size: 0.875rem; +} +.repeat-row[data-v-bc59a2b1] .p-inputnumber { + flex: 1; + min-width: 160px; +} +.storage-grid[data-v-bc59a2b1] { + grid-template-columns: repeat(2, minmax(0, 1fr)); + align-items: start; + gap: 16px; + display: grid; +} +@media (width<=639px) { + .storage-grid[data-v-bc59a2b1] { + grid-template-columns: minmax(0, 1fr); + } +} diff --git a/app/assets/styles/CommonManage.qcc2l13i.css b/app/assets/styles/CommonManage.qcc2l13i.css new file mode 100644 index 0000000..fd207ac --- /dev/null +++ b/app/assets/styles/CommonManage.qcc2l13i.css @@ -0,0 +1,85 @@ +.common-manage[data-v-34fd3c5d] { + border: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + border-radius: 12px; + overflow: hidden; +} +.common-tabs[data-v-34fd3c5d] { + border-bottom: 1px solid var(--p-content-border-color); + gap: 8px; + padding: 12px; + display: flex; + overflow: auto; +} +.common-tabs button[data-v-34fd3c5d] { + white-space: nowrap; + color: var(--p-text-muted-color); + font: inherit; + cursor: pointer; + background: 0 0; + border: 0; + border-radius: 6px; + padding: 10px 14px; +} +.common-tabs button.active[data-v-34fd3c5d] { + background: var(--p-primary-50); + color: var(--p-primary-color); +} +.common-body[data-v-34fd3c5d] { + gap: 20px; + padding: 24px; + display: grid; +} +.common-body h3[data-v-34fd3c5d] { + margin: 0; + font-size: 16px; +} +.common-grid[data-v-34fd3c5d] { + grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); + gap: 20px; + margin: 0; + display: grid; +} +.common-grid dt[data-v-34fd3c5d], +.muted[data-v-34fd3c5d] { + color: var(--p-text-muted-color); +} +.common-grid dd[data-v-34fd3c5d] { + overflow-wrap: anywhere; + margin: 8px 0 0; +} +.common-actions[data-v-34fd3c5d] { + flex-wrap: wrap; + gap: 12px; + display: flex; +} +.common-form[data-v-34fd3c5d] { + gap: 14px; + display: grid; +} +.common-form p[data-v-34fd3c5d], +.muted[data-v-34fd3c5d] { + margin: 0; +} +.common-chart header[data-v-34fd3c5d] { + justify-content: space-between; + align-items: center; + gap: 12px; + display: flex; +} +.chart-canvas[data-v-34fd3c5d] { + min-width: 0; + height: 280px; +} +.common-body[data-v-34fd3c5d] .p-datatable { + max-width: 100%; +} +@media (width<=600px) { + .common-body[data-v-34fd3c5d] { + padding: 16px; + } + .common-chart header[data-v-34fd3c5d] { + flex-direction: column; + align-items: stretch; + } +} diff --git a/app/assets/styles/CommonUpgrade.C8sZ-ExM.css b/app/assets/styles/CommonUpgrade.C8sZ-ExM.css new file mode 100644 index 0000000..dd2971e --- /dev/null +++ b/app/assets/styles/CommonUpgrade.C8sZ-ExM.css @@ -0,0 +1,30 @@ +.common-upgrade[data-v-830ee5e4], +.upgrade-option[data-v-830ee5e4] { + gap: 14px; + display: grid; +} +.upgrade-option[data-v-830ee5e4] { + border-bottom: 1px solid var(--p-content-border-color); + padding: 18px 0; +} +.upgrade-toolbar[data-v-830ee5e4] { + flex-wrap: wrap; + align-items: center; + gap: 12px; + display: flex; +} +.upgrade-option > label[data-v-830ee5e4] { + font-weight: 500; +} +.muted[data-v-830ee5e4], +.upgrade-option small[data-v-830ee5e4] { + color: var(--p-text-muted-color); +} +.common-upgrade[data-v-830ee5e4] .p-inputnumber-input { + width: 100%; + min-width: 0; +} +.common-upgrade[data-v-830ee5e4] .p-multiselect, +.common-upgrade[data-v-830ee5e4] .p-select { + max-width: 100%; +} diff --git a/app/assets/styles/ConfigBandwidth.CWSH1WJZ.css b/app/assets/styles/ConfigBandwidth.CWSH1WJZ.css new file mode 100644 index 0000000..311d711 --- /dev/null +++ b/app/assets/styles/ConfigBandwidth.CWSH1WJZ.css @@ -0,0 +1,120 @@ +.bandwidth-field[data-v-45a9c613] { + flex-direction: column; + gap: 12px; + width: 100%; + min-width: 0; + max-width: 470px; + display: flex; +} +.bandwidth-label[data-v-45a9c613] { + color: var(--p-text-color); + align-items: center; + gap: 8px; + font-size: 1rem; + line-height: 1.429rem; + display: flex; +} +.bandwidth-help[data-v-45a9c613] { + width: 20px; + height: 20px; + color: var(--p-primary-color); + cursor: help; + background: 0 0; + border: 0; + border-radius: 50%; + justify-content: center; + align-items: center; + padding: 0; + display: inline-flex; +} +.bandwidth-help > i[data-v-45a9c613] { + font-size: 1rem; +} +.bandwidth-help[data-v-45a9c613]:focus-visible { + outline: 2px solid var(--p-primary-color); + outline-offset: 3px; +} +.bandwidth-capacity[data-v-45a9c613] { + border: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + border-radius: 6px; + width: 100%; + min-width: 0; + display: flex; + box-shadow: 0 1px 2px #0000000a; +} +.bandwidth-capacity[data-v-45a9c613]:focus-within { + outline: 2px solid var(--p-primary-color); + outline-offset: 2px; +} +.bandwidth-capacity[data-v-45a9c613] .p-inputnumber { + flex: 1; + width: 0; + min-width: 0; + max-width: none; +} +.bandwidth-capacity[data-v-45a9c613] .p-inputnumber-input { + width: 100%; + min-width: 0; + min-height: 36px; + box-shadow: none; + color: var(--p-text-color); + opacity: 1; + background: 0 0; + border: 0; + padding: 8px 10px; + font-size: 1rem; +} +.bandwidth-unit[data-v-45a9c613] { + border-left: 1px solid var(--p-content-border-color); + color: var(--p-text-muted-color); + justify-content: center; + align-items: center; + padding: 0 8px; + font-size: 1rem; + display: flex; +} +.bandwidth-slider[data-v-45a9c613] { + appearance: none; + background: var(--p-content-border-color); + cursor: pointer; + border: 0; + border-radius: 4px; + width: calc(100% - 14px); + height: 3px; + margin: 16px 7px 9px; + display: block; +} +.bandwidth-slider[data-v-45a9c613]::-webkit-slider-thumb { + appearance: none; + border: 2px solid var(--p-content-border-color); + background: var(--p-content-background); + border-radius: 50%; + width: 19px; + height: 19px; + box-shadow: 0 1px 2px #0000002e; +} +.bandwidth-slider[data-v-45a9c613]::-moz-range-thumb { + box-sizing: border-box; + border: 2px solid var(--p-content-border-color); + background: var(--p-content-background); + border-radius: 50%; + width: 19px; + height: 19px; + box-shadow: 0 1px 2px #0000002e; +} +.bandwidth-slider[data-v-45a9c613]:focus-visible { + outline: 2px solid var(--p-primary-color); + outline-offset: 9px; +} +.bandwidth-slider[data-v-45a9c613]:disabled { + cursor: default; +} +.bandwidth-capacity.is-disabled[data-v-45a9c613] { + opacity: 0.6; +} +@media (width<=639px) { + .bandwidth-field[data-v-45a9c613] { + max-width: none; + } +} diff --git a/app/assets/styles/ConfigDiskAdd.C92e9ZuF.css b/app/assets/styles/ConfigDiskAdd.C92e9ZuF.css new file mode 100644 index 0000000..8530a78 --- /dev/null +++ b/app/assets/styles/ConfigDiskAdd.C92e9ZuF.css @@ -0,0 +1,45 @@ +.storage-add[data-v-68361f8e] { + border: 2px dashed var(--p-content-border-color); + width: 100%; + min-height: 200px; + color: var(--p-text-muted-color); + font: inherit; + cursor: pointer; + background: 0 0; + border-radius: 8px; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 16px; + padding: 24px; + font-size: 1rem; + font-weight: 500; + display: flex; +} +.storage-add > i[data-v-68361f8e] { + font-size: 1.5rem; + font-weight: 400; +} +.storage-add > small[data-v-68361f8e] { + font-size: 0.875rem; + font-weight: 400; + line-height: 1.286rem; +} +.storage-add[data-v-68361f8e]:hover:not(:disabled) { + border-color: var(--p-primary-color); + color: var(--p-primary-color); + background: var(--p-highlight-background); +} +.storage-add[data-v-68361f8e]:focus-visible { + outline: 2px solid var(--p-primary-color); + outline-offset: 3px; +} +.storage-add[data-v-68361f8e]:disabled { + cursor: not-allowed; + opacity: 0.55; +} +@media (width<=639px) { + .storage-add[data-v-68361f8e] { + min-height: 170px; + } +} diff --git a/app/assets/styles/ConfigDiskCard.Dx9IqqQ_.css b/app/assets/styles/ConfigDiskCard.Dx9IqqQ_.css new file mode 100644 index 0000000..4d60d25 --- /dev/null +++ b/app/assets/styles/ConfigDiskCard.Dx9IqqQ_.css @@ -0,0 +1,152 @@ +.storage-field[data-v-83c644c5] { + min-width: 0; +} +.storage-label[data-v-83c644c5] { + color: var(--p-text-color); + margin-bottom: 12px; + font-size: 1rem; + font-weight: 500; + line-height: 1.571rem; +} +.storage-card[data-v-83c644c5] { + border: 2px solid var(--p-primary-color); + background: var(--p-highlight-background); + min-width: 0; + box-shadow: 0 2px 5px + color-mix(in srgb, var(--p-primary-color) 15%, transparent); + border-radius: 8px; + flex-direction: column; + gap: 20px; + padding: 16px; + display: flex; +} +.storage-card-header[data-v-83c644c5] { + justify-content: space-between; + align-items: center; + gap: 12px; + min-height: 20px; + display: flex; +} +.storage-card-header strong[data-v-83c644c5] { + color: var(--p-highlight-color); + overflow-wrap: anywhere; + font-size: 1rem; + font-weight: 650; + line-height: 1.429rem; +} +.storage-capacity[data-v-83c644c5] { + border: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + border-radius: 6px; + width: 100%; + min-width: 0; + display: flex; + box-shadow: 0 1px 2px #0000000a; +} +.storage-capacity[data-v-83c644c5]:focus-within { + outline: 2px solid var(--p-primary-color); + outline-offset: 2px; +} +.storage-capacity[data-v-83c644c5] .p-inputnumber { + flex: 1; + width: 0; + min-width: 0; + max-width: none; +} +.storage-capacity[data-v-83c644c5] .p-inputnumber-input { + width: 100%; + min-width: 0; + min-height: 36px; + box-shadow: none; + color: var(--p-text-color); + opacity: 1; + background: 0 0; + border: 0; + padding: 8px 10px; + font-size: 1rem; +} +.storage-unit[data-v-83c644c5] { + border-left: 1px solid var(--p-content-border-color); + color: var(--p-text-muted-color); + justify-content: center; + align-items: center; + padding: 0 8px; + font-size: 1rem; + display: flex; +} +.storage-slider[data-v-83c644c5] { + appearance: none; + background: var(--p-content-border-color); + cursor: pointer; + border: 0; + border-radius: 4px; + width: 100%; + height: 3px; + margin: 9px 0; + display: block; +} +.storage-slider[data-v-83c644c5]::-webkit-slider-thumb { + appearance: none; + border: 2px solid var(--p-content-border-color); + background: var(--p-content-background); + border-radius: 50%; + width: 19px; + height: 19px; + box-shadow: 0 1px 2px #0000002e; +} +.storage-slider[data-v-83c644c5]::-moz-range-thumb { + box-sizing: border-box; + border: 2px solid var(--p-content-border-color); + background: var(--p-content-background); + border-radius: 50%; + width: 19px; + height: 19px; + box-shadow: 0 1px 2px #0000002e; +} +.storage-slider[data-v-83c644c5]:focus-visible { + outline: 2px solid var(--p-primary-color); + outline-offset: 9px; +} +.storage-slider[data-v-83c644c5]:disabled { + cursor: default; +} +.storage-description[data-v-83c644c5] { + color: var(--p-primary-color); + overflow-wrap: anywhere; + margin: 0; + font-size: 0.9375rem; + line-height: 1.429rem; +} +.storage-remove[data-v-83c644c5] { + width: 30px; + height: 30px; + color: var(--p-text-muted-color); + cursor: pointer; + background: 0 0; + border: 0; + border-radius: 4px; + flex-shrink: 0; + justify-content: center; + align-items: center; + margin: -3px; + padding: 0; + display: inline-flex; +} +.storage-remove[data-v-83c644c5]:hover:not(:disabled) { + color: var(--p-red-500); + background: var(--p-content-background); +} +.storage-remove[data-v-83c644c5]:focus-visible { + outline: 2px solid var(--p-primary-color); + outline-offset: 2px; +} +.storage-remove[data-v-83c644c5]:disabled { + opacity: 0.5; + cursor: not-allowed; +} +@media (width<=639px) { + .storage-card[data-v-83c644c5] { + gap: 20px; + padding: 16px; + } +} diff --git a/app/assets/styles/ConfigResourceOption.Dj4VopnA.css b/app/assets/styles/ConfigResourceOption.Dj4VopnA.css new file mode 100644 index 0000000..2f6b5ad --- /dev/null +++ b/app/assets/styles/ConfigResourceOption.Dj4VopnA.css @@ -0,0 +1,23 @@ +.resource-range[data-v-5a04c843] { + flex-wrap: wrap; + align-items: center; + gap: 10px; + min-width: 0; + display: flex; +} +.resource-range[data-v-5a04c843] .p-inputnumber { + width: 220px; + max-width: 100%; +} +.resource-range[data-v-5a04c843] .p-inputnumber-input { + width: 100%; + min-width: 0; +} +.resource-range[data-v-5a04c843] .p-select { + min-width: 150px; + max-width: 100%; +} +.hint[data-v-5a04c843] { + color: var(--p-text-muted-color); + font-size: 0.875rem; +} diff --git a/app/assets/styles/ConsoleLegalFooter.DAYWmXIB.css b/app/assets/styles/ConsoleLegalFooter.DAYWmXIB.css new file mode 100644 index 0000000..ce16d69 --- /dev/null +++ b/app/assets/styles/ConsoleLegalFooter.DAYWmXIB.css @@ -0,0 +1,50 @@ +.console-legal-footer[data-v-81b185f4] { + border-top: 1px solid var(--console-panel-border, #e2e8f0); + color: var(--p-text-muted-color, #64748b); + flex-shrink: 0; + font-size: 0.875rem; + line-height: 1.6; +} +.legal-footer-inner[data-v-81b185f4] { + text-align: center; + flex-wrap: wrap; + justify-content: center; + gap: 5px 18px; + max-width: 1600px; + margin: 0 auto; + padding: 18px 14px 22px; + display: flex; +} +.legal-footer-inner[data-v-81b185f4] > * { + overflow-wrap: anywhere; + min-width: 0; + max-width: 100%; +} +@media print { + .console-legal-footer[data-v-81b185f4] { + display: none; + } +} +.legal-footer-inner a[data-v-81b185f4] { + color: inherit; + text-decoration: none; +} +.legal-footer-inner a[data-v-81b185f4]:focus-visible, +.legal-footer-inner a[data-v-81b185f4]:hover { + color: var(--p-primary-color, #3b82f6); + text-underline-offset: 3px; + text-decoration: underline; +} +@media (width<=1023px) { + .main:has(.config-mobile-total) .console-legal-footer { + margin-bottom: calc(84px + env(safe-area-inset-bottom, 0px)); + } +} +@media (width<=640px) { + .legal-footer-inner[data-v-81b185f4] { + flex-direction: column; + align-items: center; + gap: 4px; + padding: 16px 14px 20px; + } +} diff --git a/app/assets/styles/DcimActions.Da2op5wy.css b/app/assets/styles/DcimActions.Da2op5wy.css new file mode 100644 index 0000000..c0bc241 --- /dev/null +++ b/app/assets/styles/DcimActions.Da2op5wy.css @@ -0,0 +1,36 @@ +.action-form[data-v-a1044895] { + flex-direction: column; + gap: 10px; + display: flex; +} +.target[data-v-a1044895] { + overflow-wrap: anywhere; + margin: 0 0 4px; +} +.form-grid[data-v-a1044895] { + grid-template-columns: 1fr 1fr; + gap: 14px; + display: grid; +} +.form-grid > div[data-v-a1044895] { + flex-direction: column; + gap: 7px; + display: flex; +} +.ack[data-v-a1044895] { + align-items: flex-start; + gap: 10px; + margin-top: 7px; + display: flex; +} +.ack label[data-v-a1044895] { + line-height: 1.5; +} +.muted[data-v-a1044895] { + color: var(--p-text-muted-color); +} +@media (width<=480px) { + .form-grid[data-v-a1044895] { + grid-template-columns: 1fr; + } +} diff --git a/app/assets/styles/DcimBilling.QV7PUjnH.css b/app/assets/styles/DcimBilling.QV7PUjnH.css new file mode 100644 index 0000000..19ae2da --- /dev/null +++ b/app/assets/styles/DcimBilling.QV7PUjnH.css @@ -0,0 +1,78 @@ +.billing[data-v-9a8e05c2] { + flex-direction: column; + gap: 14px; + display: flex; +} +.billing h3[data-v-9a8e05c2] { + margin: 0; + font-size: 1.125rem; +} +.rows[data-v-9a8e05c2] { + border: 1px solid var(--console-panel-border); + background: var(--console-panel-bg); + box-shadow: var(--console-panel-shadow); + border-radius: 6px; + margin: 0; + overflow: hidden; +} +.rows > div[data-v-9a8e05c2] { + grid-template-columns: 16.666% minmax(0, 1fr); + align-items: center; + gap: 14px; + min-height: 50px; + padding: 14px; + display: grid; +} +.rows > div + div[data-v-9a8e05c2] { + border-top: 1px solid var(--console-panel-border); +} +.rows > div[data-v-9a8e05c2]:nth-child(2n) { + background: var(--console-page-bg); +} +dt[data-v-9a8e05c2] { + color: var(--p-text-muted-color); + font-weight: 600; +} +dd[data-v-9a8e05c2] { + overflow-wrap: anywhere; + flex-wrap: wrap; + align-items: center; + gap: 10px; + margin: 0; + display: flex; +} +dd small[data-v-9a8e05c2] { + color: var(--p-text-muted-color); + flex-basis: 100%; +} +.order-row[data-v-9a8e05c2] { + border: 1px solid var(--console-panel-border); + background: var(--console-panel-bg); + box-shadow: var(--console-panel-shadow); + border-radius: 6px; + gap: 28px; + padding: 14px; + display: flex; +} +.muted[data-v-9a8e05c2] { + color: var(--p-text-muted-color); + margin: 0; +} +.muted a[data-v-9a8e05c2] { + margin: 0 3px; +} +.form[data-v-9a8e05c2] { + flex-direction: column; + gap: 10px; + display: flex; +} +.form p[data-v-9a8e05c2] { + margin: 0; +} +@media (width<=600px) { + .rows > div[data-v-9a8e05c2] { + grid-template-columns: 95px minmax(0, 1fr); + gap: 10px; + padding: 12px 10px; + } +} diff --git a/app/assets/styles/DcimDefence.BYaQccXZ.css b/app/assets/styles/DcimDefence.BYaQccXZ.css new file mode 100644 index 0000000..3677563 --- /dev/null +++ b/app/assets/styles/DcimDefence.BYaQccXZ.css @@ -0,0 +1,72 @@ +.defence[data-v-2f38c55b], +.form[data-v-2f38c55b] { + flex-direction: column; + gap: 14px; + display: flex; +} +.defence h3[data-v-2f38c55b] { + margin: 0; + font-size: 1.125rem; +} +.head[data-v-2f38c55b] { + flex-wrap: wrap; + align-items: center; + gap: 10px; + display: flex; +} +.head h3[data-v-2f38c55b] { + margin-right: auto; +} +.rows[data-v-2f38c55b] { + border: 1px solid var(--console-panel-border); + box-shadow: var(--console-panel-shadow); + border-radius: 6px; + margin: 0; + overflow: hidden; +} +.rows > div[data-v-2f38c55b] { + background: var(--console-panel-bg); + grid-template-columns: 16.666% minmax(0, 1fr); + align-items: center; + gap: 14px; + padding: 10px 14px; + display: grid; +} +.muted[data-v-2f38c55b], +dt[data-v-2f38c55b] { + color: var(--p-text-muted-color); +} +dd[data-v-2f38c55b] { + flex-wrap: wrap; + align-items: center; + gap: 14px; + margin: 0; + display: flex; +} +.unavailable[data-v-2f38c55b] { + text-align: center; + color: var(--p-text-muted-color); + border: 1px solid var(--console-panel-border); + background: var(--console-panel-bg); + box-shadow: var(--console-panel-shadow); + border-radius: 6px; + margin: 0; + padding: 28px; +} +.form p[data-v-2f38c55b], +.muted[data-v-2f38c55b] { + overflow-wrap: anywhere; + margin: 0; + line-height: 1.6; +} +.config-error[data-v-2f38c55b] { + color: var(--p-text-muted-color); + align-items: center; + gap: 7px; + display: flex; +} +@media (width<=600px) { + .rows > div[data-v-2f38c55b] { + grid-template-columns: 100px 1fr; + } +} diff --git a/app/assets/styles/DcimDomains.BT2s5hGW.css b/app/assets/styles/DcimDomains.BT2s5hGW.css new file mode 100644 index 0000000..a57e275 --- /dev/null +++ b/app/assets/styles/DcimDomains.BT2s5hGW.css @@ -0,0 +1,26 @@ +.domains[data-v-6c2c5ee1] { + flex-direction: column; + gap: 14px; + display: flex; +} +.toolbar[data-v-6c2c5ee1] { + flex-wrap: wrap; + align-items: center; + gap: 10px; + display: flex; +} +.toolbar h3[data-v-6c2c5ee1] { + margin: 0 auto 0 0; + font-size: 1.125rem; +} +.domains[data-v-6c2c5ee1] .p-datatable { + border: 1px solid var(--console-panel-border); + box-shadow: var(--console-panel-shadow); + border-radius: 6px; + overflow: hidden; +} +.empty[data-v-6c2c5ee1] { + text-align: center; + color: var(--p-text-muted-color); + padding: 28px; +} diff --git a/app/assets/styles/DcimManage.BlqFeSOi.css b/app/assets/styles/DcimManage.BlqFeSOi.css new file mode 100644 index 0000000..14cc2c4 --- /dev/null +++ b/app/assets/styles/DcimManage.BlqFeSOi.css @@ -0,0 +1,425 @@ +.compact-monitor-slot[data-v-e2d08c68] { + min-width: 0; + min-height: 154px; +} +.dcim-manage[data-v-e2d08c68] .p-tablist-tab-list { + background: 0 0; + gap: 7px; +} +.dcim-manage[data-v-e2d08c68] .p-tab { + color: var(--p-text-muted-color); + white-space: nowrap; + padding: 14px; + font-weight: 500; +} +.dcim-manage[data-v-e2d08c68] .p-tab-active { + color: var(--p-primary-color); +} +.dcim-manage[data-v-e2d08c68] .p-tabpanels { + background: 0 0; + padding: 21px 0 0; +} +.dcim-manage[data-v-e2d08c68] .p-tabpanel { + padding: 0; +} +.overview[data-v-e2d08c68] { + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 21px; + display: grid; +} +.stack[data-v-e2d08c68] { + flex-direction: column; + gap: 21px; + min-width: 0; + display: flex; +} +.card[data-v-e2d08c68] { + border: 1px solid var(--console-panel-border); + background: var(--console-panel-bg); + box-shadow: var(--console-panel-shadow); + border-radius: 6px; + min-width: 0; + padding: 14px; +} +.card h3[data-v-e2d08c68], +.detail-content h3[data-v-e2d08c68] { + margin: 0 0 14px; + font-size: 1.125rem; + font-weight: 600; +} +.card-title[data-v-e2d08c68] { + width: 100%; + font: inherit; + color: inherit; + cursor: pointer; + text-align: left; + background: 0 0; + border: 0; + justify-content: space-between; + align-items: center; + padding: 0; + display: flex; +} +.card-title i[data-v-e2d08c68] { + font-size: 0.875rem; +} +.card-title[data-v-e2d08c68]:hover { + color: var(--p-primary-color); +} +.card-bottom[data-v-e2d08c68] { + width: 100%; + margin-top: 28px; +} +.flow-card[data-v-e2d08c68] .p-progressbar, +.network-flow-bar[data-v-e2d08c68] { + height: 8px; +} +.flow-used[data-v-e2d08c68] { + align-items: center; + gap: 7px; + margin: 14px 0; + font-size: 1rem; + display: flex; +} +.flow-used i[data-v-e2d08c68] { + color: var(--p-green-600); +} +.muted[data-v-e2d08c68] { + color: var(--p-text-muted-color); + margin: 14px 0 0; + font-size: 1rem; + line-height: 1.6; +} +.compact-rows[data-v-e2d08c68] { + margin: 0; +} +.compact-rows > div[data-v-e2d08c68] { + justify-content: space-between; + align-items: center; + gap: 14px; + min-height: 33px; + display: flex; +} +.compact-rows dt[data-v-e2d08c68] { + color: var(--p-text-muted-color); + flex-shrink: 0; +} +.compact-rows dd[data-v-e2d08c68] { + overflow-wrap: anywhere; + text-align: right; + justify-content: flex-end; + align-items: center; + gap: 4px; + min-width: 0; + margin: 0; + display: flex; +} +.compact-rows dd.muted[data-v-e2d08c68] { + font-size: 0.9375rem; +} +.compact-rows[data-v-e2d08c68] .p-button { + padding: 3px; +} +.resource-list[data-v-e2d08c68] { + flex-direction: column; + gap: 21px; + margin: 0; + display: flex; +} +.resource-list > div[data-v-e2d08c68] { + border: 1px solid var(--console-panel-border); + box-shadow: var(--console-panel-shadow); + border-radius: 6px; + justify-content: space-between; + align-items: center; + gap: 14px; + min-height: 50px; + padding: 14px; + display: flex; +} +.resource-list dt[data-v-e2d08c68] { + flex-shrink: 0; + align-items: center; + gap: 7px; + display: flex; +} +.resource-list dd[data-v-e2d08c68] { + overflow-wrap: anywhere; + text-align: right; + margin: 0; + font-weight: 600; + line-height: 1.5; +} +.resource-list small[data-v-e2d08c68] { + color: var(--p-text-muted-color); + font-weight: 400; + display: block; +} +.os[data-v-e2d08c68] { + flex-direction: column; + align-items: center; + gap: 14px; + margin: 21px 0; + display: flex; +} +.os strong[data-v-e2d08c68] { + font-weight: 400; +} +.quick-actions[data-v-e2d08c68] { + flex-wrap: wrap; + gap: 10px; + margin-top: 14px; + display: flex; +} +.access-quick[data-v-e2d08c68] { + margin-top: 35px; +} +.access-quick[data-v-e2d08c68] .p-button { + flex: 1; + padding: 9px 10px; +} +.protection-card[data-v-e2d08c68] { + min-height: 310px; +} +.protection-body[data-v-e2d08c68] { + text-align: center; + flex-direction: column; + align-items: center; + gap: 10px; + padding: 40px 0 14px; + display: flex; +} +.protection-body img[data-v-e2d08c68] { + -o-object-fit: contain; + object-fit: contain; + width: 112px; + height: 112px; +} +.protection-body strong[data-v-e2d08c68] { + font-size: 1.25rem; + font-weight: 400; +} +.protection-body p[data-v-e2d08c68] { + margin: 0; + font-size: 0.9375rem; +} +.protection-body[data-v-e2d08c68] .p-button { + padding: 2px; +} +.help-links[data-v-e2d08c68] { + flex-direction: column; + gap: 14px; + margin-top: 14px; + display: flex; +} +.help-links a[data-v-e2d08c68] { + color: var(--p-text-color); + justify-content: space-between; + align-items: center; + text-decoration: none; + display: flex; +} +.help-links a[data-v-e2d08c68]:hover { + color: var(--p-primary-color); +} +.network-card > .compact-rows[data-v-e2d08c68] { + border-bottom: 1px solid var(--console-panel-border); + margin-bottom: 21px; + padding-bottom: 14px; +} +.detail-content[data-v-e2d08c68] { + flex-direction: column; + gap: 14px; + min-width: 0; + display: flex; +} +.detail-content h3[data-v-e2d08c68], +.detail-content > .muted[data-v-e2d08c68] { + margin: 0; +} +.detail-content .section-gap[data-v-e2d08c68] { + margin-top: 28px; +} +.detail-content .muted a[data-v-e2d08c68] { + margin: 0 4px; +} +.rows[data-v-e2d08c68] { + background: var(--console-panel-bg); + border: 1px solid var(--console-panel-border); + box-shadow: var(--console-panel-shadow); + border-radius: 6px; + margin: 0; + overflow: hidden; +} +.rows > div[data-v-e2d08c68] { + grid-template-columns: 16.666% minmax(0, 1fr); + align-items: center; + gap: 14px; + min-height: 50px; + padding: 14px; + display: grid; +} +.rows > div + div[data-v-e2d08c68] { + border-top: 1px solid var(--console-panel-border); +} +.rows > div[data-v-e2d08c68]:nth-child(2n) { + background: var(--console-page-bg); +} +.rows dt[data-v-e2d08c68] { + color: var(--p-text-muted-color); + font-weight: 600; +} +.rows dd[data-v-e2d08c68] { + overflow-wrap: anywhere; + flex-wrap: wrap; + align-items: center; + gap: 10px; + margin: 0; + display: flex; +} +.rows dd.stacked-value[data-v-e2d08c68] { + flex-direction: column; + align-items: flex-start; + gap: 10px; + display: flex; +} +.stacked-value small[data-v-e2d08c68] { + color: var(--p-text-muted-color); + font-size: 0.875rem; + line-height: 1.6; +} +.inline-actions[data-v-e2d08c68], +.password-line[data-v-e2d08c68] { + flex-wrap: wrap; + align-items: center; + gap: 7px; + display: flex; +} +.password-line[data-v-e2d08c68] .p-button { + padding: 2px; +} +.rows dd.ip-table-cell[data-v-e2d08c68] { + flex-direction: column; + align-items: stretch; + gap: 7px; + min-width: 0; + display: flex; +} +.ip-table-cell[data-v-e2d08c68] .p-datatable { + border: 1px solid var(--console-panel-border); + width: 100%; + box-shadow: var(--console-panel-shadow); + border-radius: 6px; + overflow: hidden; +} +.ip-table-cell[data-v-e2d08c68] > .p-button { + align-self: flex-start; +} +.network-flow-bar[data-v-e2d08c68] { + width: 100%; +} +.stacked-value .flow-used[data-v-e2d08c68] { + margin: 0; +} +.section-head[data-v-e2d08c68] { + flex-wrap: wrap; + justify-content: space-between; + gap: 14px; +} +.search[data-v-e2d08c68], +.section-head[data-v-e2d08c68] { + align-items: center; + display: flex; +} +.search[data-v-e2d08c68] { + gap: 4px; + max-width: 100%; +} +.search[data-v-e2d08c68] input { + width: 210px; + min-width: 0; +} +.records-table[data-v-e2d08c68] { + border: 1px solid var(--console-panel-border); + box-shadow: var(--console-panel-shadow); + border-radius: 6px; + overflow: hidden; +} +.empty[data-v-e2d08c68] { + text-align: center; + color: var(--p-text-muted-color); + padding: 28px; +} +.inline-error[data-v-e2d08c68] { + flex-wrap: wrap; + align-items: center; + gap: 7px; + font-size: 0.9375rem; + display: flex; +} +.load-failure[data-v-e2d08c68] { + padding-top: 14px; +} +.mono[data-v-e2d08c68] { + font-family: var(--font-mono, monospace); +} +@media (width<=1199px) { + .overview[data-v-e2d08c68], + .stack[data-v-e2d08c68] { + gap: 14px; + } + .resource-list > div[data-v-e2d08c68] { + padding: 10px; + } + .resource-list dd[data-v-e2d08c68] { + font-size: 0.9375rem; + } +} +@media (width<=950px) { + .overview[data-v-e2d08c68] { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + .stack[data-v-e2d08c68]:last-child { + grid-column: 1/-1; + grid-template-columns: 1fr 1fr; + display: grid; + } +} +@media (width<=600px) { + .overview[data-v-e2d08c68] { + grid-template-columns: 1fr; + } + .stack[data-v-e2d08c68]:last-child { + grid-column: auto; + display: flex; + } + .rows > div[data-v-e2d08c68] { + grid-template-columns: 95px minmax(0, 1fr); + gap: 10px; + padding: 12px 10px; + } + .rows > div[data-v-e2d08c68]:has(.ip-table-cell) { + grid-template-columns: 1fr; + } + .rows .ip-table-cell[data-v-e2d08c68] { + grid-column: 1/-1; + } + .dcim-manage[data-v-e2d08c68] .p-tabpanels { + padding-top: 14px; + } + .dcim-manage[data-v-e2d08c68] .p-tab { + padding: 12px 10px; + } + .search[data-v-e2d08c68] { + width: 100%; + } + .search[data-v-e2d08c68] input { + flex: 1; + } + .protection-body[data-v-e2d08c68] { + padding-top: 28px; + } + .resource-list dd[data-v-e2d08c68] { + font-size: 1rem; + } +} diff --git a/app/assets/styles/DcimMonitor.CiStTCbZ.css b/app/assets/styles/DcimMonitor.CiStTCbZ.css new file mode 100644 index 0000000..3339a02 --- /dev/null +++ b/app/assets/styles/DcimMonitor.CiStTCbZ.css @@ -0,0 +1,84 @@ +.chart-viewport[data-v-eb47944f] { + min-width: 0; +} +.chart-viewport[data-v-eb47944f], +.chart-viewport .empty[data-v-eb47944f], +.chart-viewport .monitor-error[data-v-eb47944f] { + min-height: var(--chart-height); +} +.monitor[data-v-eb47944f] { + min-width: 0; +} +.monitor[data-v-eb47944f]:not(.compact) { + flex-direction: column; + gap: 21px; + display: flex; +} +.monitor-panel[data-v-eb47944f] { + min-width: 0; +} +.monitor:not(.compact) .monitor-panel[data-v-eb47944f] { + border: 1px solid var(--console-panel-border); + background: var(--console-panel-bg); + box-shadow: var(--console-panel-shadow); + border-radius: 6px; + padding: 14px; +} +.range[data-v-eb47944f] { + flex-wrap: wrap; + align-self: flex-start; +} +.monitor-head[data-v-eb47944f] { + border-bottom: 1px solid var(--console-panel-border); + align-items: center; + margin-bottom: 14px; + padding-bottom: 14px; + display: flex; +} +.monitor-head h3[data-v-eb47944f] { + margin: 0; + font-size: 1.125rem; +} +.legend[data-v-eb47944f] { + color: var(--p-text-muted-color); + gap: 14px; + margin-bottom: 7px; + font-size: 0.875rem; +} +.legend[data-v-eb47944f], +.legend span[data-v-eb47944f] { + align-items: center; + display: flex; +} +.legend span[data-v-eb47944f] { + gap: 5px; +} +.legend i[data-v-eb47944f] { + border-radius: 2px; + width: 8px; + height: 8px; +} +.incoming[data-v-eb47944f] { + background: #1687d9; +} +.outgoing[data-v-eb47944f] { + background: #29b6d8; +} +.legend small[data-v-eb47944f] { + margin-left: auto; +} +.empty[data-v-eb47944f] { + min-height: 126px; + color: var(--p-text-muted-color); + place-items: center; + margin: 0; + display: grid; +} +.monitor-error[data-v-eb47944f] { + flex-wrap: wrap; + justify-content: center; + align-items: center; + gap: 7px; + min-height: 126px; + display: flex; +} diff --git a/app/assets/styles/DcimReinstallStatus.CuXeXmZ3.css b/app/assets/styles/DcimReinstallStatus.CuXeXmZ3.css new file mode 100644 index 0000000..d3d89c0 --- /dev/null +++ b/app/assets/styles/DcimReinstallStatus.CuXeXmZ3.css @@ -0,0 +1,20 @@ +.task-status[data-v-d99d9473] { + flex-wrap: wrap; + align-items: center; + gap: 10px; + min-height: 36px; + display: flex; +} +.task-error[data-v-d99d9473] { + text-overflow: ellipsis; + white-space: nowrap; + max-width: min(100%, 480px); + color: var(--p-red-600); + overflow: hidden; +} +@media (width<=600px) { + .task-status[data-v-d99d9473] { + align-content: center; + min-height: 70px; + } +} diff --git a/app/assets/styles/DcimUpgrade.DaLApYFa.css b/app/assets/styles/DcimUpgrade.DaLApYFa.css new file mode 100644 index 0000000..949d6e9 --- /dev/null +++ b/app/assets/styles/DcimUpgrade.DaLApYFa.css @@ -0,0 +1,17 @@ +.dcim-upgrade[data-v-790898bc] { + gap: 14px; + display: grid; +} +.dcim-upgrade label[data-v-790898bc] { + gap: 8px; + display: grid; +} +.dcim-upgrade fieldset[data-v-790898bc] { + border: 1px solid var(--p-content-border-color); + border-radius: 6px; + gap: 12px; + display: grid; +} +.dcim-upgrade p[data-v-790898bc] { + margin: 0; +} diff --git a/app/assets/styles/FinanceConfig.CLwX1CC8.css b/app/assets/styles/FinanceConfig.CLwX1CC8.css new file mode 100644 index 0000000..7b7d875 --- /dev/null +++ b/app/assets/styles/FinanceConfig.CLwX1CC8.css @@ -0,0 +1,34 @@ +.hint[data-v-1ac7876b] { + color: var(--p-text-muted-color); + overflow-wrap: anywhere; + font-size: 0.875rem; +} +.required-mark[data-v-1ac7876b] { + color: var(--p-red-500); +} +.storage-grid[data-v-1ac7876b] { + grid-template-columns: repeat(2, minmax(0, 1fr)); + align-items: start; + gap: 16px; + display: grid; +} +.storage-fixed-capacity[data-v-1ac7876b] { + color: var(--p-text-color); + align-items: baseline; + gap: 8px; + display: flex; +} +.storage-fixed-capacity strong[data-v-1ac7876b] { + font-size: 1.75rem; + font-weight: 650; + line-height: 1.25; +} +.storage-fixed-capacity span[data-v-1ac7876b] { + color: var(--p-text-muted-color); + font-size: 1rem; +} +@media (width<=639px) { + .storage-grid[data-v-1ac7876b] { + grid-template-columns: minmax(0, 1fr); + } +} diff --git a/app/assets/styles/FlowPacketPanel.-RJSx13z.css b/app/assets/styles/FlowPacketPanel.-RJSx13z.css new file mode 100644 index 0000000..3431cf7 --- /dev/null +++ b/app/assets/styles/FlowPacketPanel.-RJSx13z.css @@ -0,0 +1,143 @@ +.block[data-v-ca0029df] { + flex-direction: column; + gap: 14px; + min-width: 0; + display: flex; +} +.block-title[data-v-ca0029df] { + margin: 0; + font-size: 1.125rem; + font-weight: 600; +} +.block-desc[data-v-ca0029df] { + color: var(--p-text-muted-color, #94a3b8); + margin: 0; + font-size: 1rem; + line-height: 1.7; +} +.info-table[data-v-ca0029df] { + border: 1px solid var(--console-panel-border); + box-shadow: var(--console-panel-shadow); + background: var(--console-panel-bg); + border-radius: 6px; + overflow: hidden; +} +.kv[data-v-ca0029df] { + grid-template-columns: 16.6667% minmax(0, 1fr); + align-items: center; + min-height: 49px; + font-size: 1rem; + display: grid; +} +.kv[data-v-ca0029df] > * { + overflow-wrap: anywhere; + min-width: 0; + padding: 14px; +} +.kv[data-v-ca0029df]:nth-child(2n) { + background: var(--console-page-bg); +} +.kv + .kv[data-v-ca0029df] { + border-top: 1px solid var(--console-panel-border); +} +.kv > span[data-v-ca0029df] { + color: var(--p-text-muted-color, #64748b); + font-weight: 600; +} +.kv > b[data-v-ca0029df] { + font-weight: 500; +} +.action-cell[data-v-ca0029df] { + flex-wrap: wrap; + align-items: center; + gap: 8px; + display: flex; +} +.action-cell[data-v-ca0029df] .p-button { + max-width: 100%; +} +.info-table .pk-empty[data-v-ca0029df] { + text-align: left; + margin: 0; + padding: 0; + font-size: 1rem; +} +@media (width<=767px) { + .kv[data-v-ca0029df] { + grid-template-columns: 100px minmax(0, 1fr); + } +} +.pk-list[data-v-ca0029df] { + flex-direction: column; + gap: 6px; + display: flex; +} +.pk-row[data-v-ca0029df] { + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + gap: 12px; + padding: 6px 0; + font-size: 1rem; + display: flex; +} +.pk-row + .pk-row[data-v-ca0029df] { + border-top: 1px solid var(--console-panel-border); +} +.pk-name[data-v-ca0029df] { + flex: 160px; + min-width: 0; +} +.pk-expire[data-v-ca0029df] { + color: var(--p-text-muted-color, #64748b); + font-size: 0.875rem; +} +.pk-grid[data-v-ca0029df] { + grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); + gap: 12px; + display: grid; +} +.pk-card[data-v-ca0029df] { + border: 1px solid var(--p-content-border-color, #e2e8f0); + text-align: center; + border-radius: 12px; + flex-direction: column; + align-items: center; + gap: 6px; + padding: 14px 12px; + display: flex; +} +.pk-card-disabled[data-v-ca0029df] { + opacity: 0.55; +} +.pk-card-name[data-v-ca0029df] { + color: var(--p-text-muted-color, #64748b); + font-size: 0.9375rem; +} +.pk-card-cap[data-v-ca0029df] { + font-size: 1.25rem; + font-weight: 600; +} +.pk-card-price[data-v-ca0029df] { + color: var(--p-primary-color, #10b981); + font-size: 1rem; + font-weight: 600; +} +.pk-card-tags[data-v-ca0029df] { + flex-wrap: wrap; + justify-content: center; + gap: 4px; + display: flex; +} +.pk-card-note[data-v-ca0029df] { + font-size: 0.875rem; +} +.pk-card-note[data-v-ca0029df], +.pk-empty[data-v-ca0029df] { + color: var(--p-text-muted-color, #94a3b8); +} +.pk-empty[data-v-ca0029df] { + text-align: center; + padding: 20px 0; + font-size: 0.9375rem; +} diff --git a/app/assets/styles/GeetestField.DiieTibK.css b/app/assets/styles/GeetestField.DiieTibK.css new file mode 100644 index 0000000..4743c7d --- /dev/null +++ b/app/assets/styles/GeetestField.DiieTibK.css @@ -0,0 +1,44 @@ +.geetest-field[data-v-4cd14cdc] { + flex-direction: column; + gap: 8px; + display: flex; +} +.geetest-trigger[data-v-4cd14cdc] { + border: 1px solid var(--p-form-field-border-color); + border-radius: var(--p-inputtext-border-radius, 6px); + background: var(--p-content-background); + width: 100%; + min-height: 44px; + color: var(--p-text-color); + font: inherit; + cursor: pointer; + justify-content: center; + align-items: center; + gap: 8px; + padding: 10px 12px; + display: flex; +} +.geetest-trigger[data-v-4cd14cdc]:hover:not(:disabled) { + border-color: var(--p-primary-color); +} +.geetest-trigger[data-v-4cd14cdc]:focus-visible { + outline: 2px solid var(--p-primary-color); + outline-offset: 2px; +} +.geetest-trigger[data-v-4cd14cdc]:disabled { + cursor: not-allowed; + opacity: 0.65; +} +.geetest-trigger.verified[data-v-4cd14cdc] { + border-color: var(--p-green-500, #22c55e); + color: var(--p-green-600, #16a34a); + background: color-mix( + in srgb, + var(--p-green-500, #22c55e) 8%, + var(--p-content-background) + ); +} +.geetest-trigger.has-error[data-v-4cd14cdc] { + border-color: var(--p-red-500, #ef4444); + color: var(--p-red-600, #dc2626); +} diff --git a/app/assets/styles/GenericOAuthProviders.Bv8oNwXP.css b/app/assets/styles/GenericOAuthProviders.Bv8oNwXP.css new file mode 100644 index 0000000..55cdc6c --- /dev/null +++ b/app/assets/styles/GenericOAuthProviders.Bv8oNwXP.css @@ -0,0 +1,22 @@ +.oauth-providers[data-v-45e5a5aa] { + text-align: center; + gap: 12px; + margin-top: 20px; + display: grid; +} +.oauth-buttons[data-v-45e5a5aa] { + flex-wrap: wrap; + justify-content: center; + gap: 10px; + display: flex; +} +.oauth-buttons img[data-v-45e5a5aa] { + -o-object-fit: contain; + object-fit: contain; + width: 20px; + height: 20px; +} +.oauth-providers a[data-v-45e5a5aa] { + color: var(--p-primary-color); + font-size: 13px; +} diff --git a/app/assets/styles/GlobalSearch.BQqObidy.css b/app/assets/styles/GlobalSearch.BQqObidy.css new file mode 100644 index 0000000..007e5cc --- /dev/null +++ b/app/assets/styles/GlobalSearch.BQqObidy.css @@ -0,0 +1,104 @@ +.gs[data-v-bc4d898a] { + margin-right: 4px; + position: relative; +} +.gs-input[data-v-bc4d898a] { + border: 1px solid var(--p-content-border-color, #e2e8f0); + background: var(--p-content-background); + width: 220px; + height: 32px; + color: var(--p-text-muted-color, #94a3b8); + border-radius: 8px; + align-items: center; + gap: 6px; + padding: 0 10px; + display: flex; +} +.gs-input input[data-v-bc4d898a] { + min-width: 0; + color: var(--p-text-color); + background: 0 0; + border: 0; + outline: none; + flex: 1; + font-size: 0.9375rem; +} +.gs-input[data-v-bc4d898a]:focus-within { + border-color: var(--p-primary-color); + outline: 2px solid var(--p-primary-color); + outline-offset: 2px; +} +.gs-panel[data-v-bc4d898a] { + background: var(--p-content-background); + border: 1px solid var(--p-content-border-color, #e2e8f0); + z-index: 200; + border-radius: 10px; + width: min(320px, 100vw - 32px); + max-height: 380px; + padding: 6px; + position: absolute; + top: 38px; + right: 0; + overflow-y: auto; + box-shadow: 0 10px 30px #0f172a1f; +} +.gs-state[data-v-bc4d898a] { + color: var(--p-text-muted-color, #94a3b8); + justify-content: center; + align-items: center; + gap: 6px; + padding: 18px 0; + font-size: 0.9375rem; + display: flex; +} +.gs-error[data-v-bc4d898a] { + text-align: center; + flex-direction: column; + padding: 16px 10px; +} +.gs-retry[data-v-bc4d898a] { + color: var(--p-primary-color); + cursor: pointer; + background: 0 0; + border: 0; + padding: 6px; + text-decoration: underline; +} +.gs-item[data-v-bc4d898a]:focus-visible, +.gs-retry[data-v-bc4d898a]:focus-visible { + outline: 2px solid var(--p-primary-color); + outline-offset: -2px; +} +.gs-group + .gs-group[data-v-bc4d898a] { + border-top: 1px solid var(--p-content-border-color, #e2e8f0); + margin-top: 4px; + padding-top: 4px; +} +.gs-group-title[data-v-bc4d898a] { + color: var(--p-text-muted-color, #94a3b8); + padding: 6px 10px 4px; + font-size: 0.875rem; +} +.gs-item[data-v-bc4d898a] { + text-align: left; + cursor: pointer; + background: 0 0; + border: 0; + border-radius: 6px; + flex-direction: column; + gap: 2px; + width: 100%; + padding: 7px 10px; + display: flex; +} +.gs-item[data-v-bc4d898a]:hover { + background: var(--p-content-hover-background); +} +.gs-item-name[data-v-bc4d898a] { + color: var(--p-text-color); + font-size: 0.9375rem; +} +.gs-item-sub[data-v-bc4d898a] { + color: var(--p-text-muted-color, #94a3b8); + font-size: 0.875rem; +} diff --git a/app/assets/styles/HomeConsumeTrend.DfrmEdD9.css b/app/assets/styles/HomeConsumeTrend.DfrmEdD9.css new file mode 100644 index 0000000..2ed52a9 --- /dev/null +++ b/app/assets/styles/HomeConsumeTrend.DfrmEdD9.css @@ -0,0 +1,3 @@ +.chart-wrap[data-v-90c11ad2] { + padding: 0 10px 10px; +} diff --git a/app/assets/styles/HomeExpiringPanel.Ckflw2Hv.css b/app/assets/styles/HomeExpiringPanel.Ckflw2Hv.css new file mode 100644 index 0000000..0cb2904 --- /dev/null +++ b/app/assets/styles/HomeExpiringPanel.Ckflw2Hv.css @@ -0,0 +1,17 @@ +.home-list[data-v-9017f053] { + padding: 0 18px 14px; +} +.home-row[data-v-9017f053], +.home-row-skeleton[data-v-9017f053] { + min-height: 64px; + padding-inline: 4px; +} +.due-badge[data-v-9017f053] { + background: var(--p-content-hover-background); + color: var(--p-text-muted-color, #64748b); + white-space: nowrap; + border-radius: 20px; + flex-shrink: 0; + padding: 2px 8px; + font-size: 0.875rem; +} diff --git a/app/assets/styles/HomeNoticePanel.e5-qgzAs.css b/app/assets/styles/HomeNoticePanel.e5-qgzAs.css new file mode 100644 index 0000000..dbde49a --- /dev/null +++ b/app/assets/styles/HomeNoticePanel.e5-qgzAs.css @@ -0,0 +1,57 @@ +.home-list[data-v-a93c47c1] { + padding: 0 18px; +} +.home-row-skeleton[data-v-a93c47c1] { + box-sizing: border-box; + height: calc(2.715rem + 28px); + padding: 12px 4px; +} +.notice-row[data-v-a93c47c1] { + border: none; + border-bottom: 1px solid var(--p-content-border-color, #e2e8f0); + cursor: pointer; + text-align: left; + background: 0 0; + flex-direction: column; + align-items: flex-start; + gap: 3px; + width: 100%; + min-height: 64px; + padding-inline: 4px; + font-family: inherit; + font-size: 1rem; +} +.notice-title[data-v-a93c47c1] { + width: 100%; +} +.notice-row[data-v-a93c47c1]:last-child { + border-bottom: none; +} +.notice-row:hover .notice-title[data-v-a93c47c1] { + color: var(--p-primary-color, #0052d9); +} +.notice-row[data-v-a93c47c1]:focus-visible { + outline: 2px solid var(--p-primary-color, #0052d9); + outline-offset: -2px; + border-radius: 4px; +} +.detail-time[data-v-a93c47c1] { + color: var(--p-text-muted-color, #94a3b8); + margin-bottom: 12px; + font-size: 0.9375rem; +} +.detail-content[data-v-a93c47c1] { + overflow-wrap: anywhere; + font-size: 1rem; + line-height: 1.8; +} +.detail-content[data-v-a93c47c1] img { + max-width: 100%; + height: auto; +} +.detail-content[data-v-a93c47c1] pre, +.detail-content[data-v-a93c47c1] table { + max-width: 100%; + display: block; + overflow-x: auto; +} diff --git a/app/assets/styles/HomeReferralPanel.DsgN33ME.css b/app/assets/styles/HomeReferralPanel.DsgN33ME.css new file mode 100644 index 0000000..08e3dfa --- /dev/null +++ b/app/assets/styles/HomeReferralPanel.DsgN33ME.css @@ -0,0 +1,156 @@ +.home-referral[data-v-8690c3a5] { + container-type: inline-size; +} +.home-card-head[data-v-8690c3a5] { + border-bottom: 1px solid var(--p-content-border-color); +} +.referral-body[data-v-8690c3a5] { + flex-direction: column; + flex: 1; + gap: 24px; + padding: 24px; + display: flex; +} +.referral-overview[data-v-8690c3a5], +.referral-stats[data-v-8690c3a5] { + gap: 20px; + margin: 0; + display: grid; +} +.referral-overview[data-v-8690c3a5] { + grid-template-columns: minmax(0, 1.7fr) minmax(0, 1fr); + align-items: start; +} +.referral-overview dt[data-v-8690c3a5], +.referral-stats dt[data-v-8690c3a5] { + color: var(--p-text-muted-color); + font-size: 0.875rem; + line-height: 1.286rem; +} +.referral-overview dd[data-v-8690c3a5], +.referral-stats dd[data-v-8690c3a5] { + font-variant-numeric: tabular-nums; + overflow-wrap: anywhere; + margin: 8px 0 0; + line-height: 1.3; +} +.referral-overview small[data-v-8690c3a5], +.referral-stats small[data-v-8690c3a5] { + font-size: 0.9375rem; + font-weight: 400; +} +.referral-balance dd[data-v-8690c3a5] { + letter-spacing: -0.5px; + color: var(--p-primary-color); + font-size: 1.875rem; + font-weight: 600; +} +.referral-balance dd small[data-v-8690c3a5] { + margin-right: 4px; +} +.referral-invitees[data-v-8690c3a5] { + border-left: 1px solid var(--p-content-border-color); + padding-left: 20px; +} +.referral-invitees dd[data-v-8690c3a5] { + font-size: 1.625rem; + font-weight: 500; +} +.referral-invitees dd small[data-v-8690c3a5] { + color: var(--p-text-muted-color); + margin-left: 6px; +} +.referral-stats[data-v-8690c3a5] { + border-top: 1px solid var(--p-content-border-color); + grid-template-columns: repeat(3, minmax(0, 1fr)); + padding-top: 20px; +} +.referral-stat[data-v-8690c3a5] { + min-width: 0; +} +.referral-stat dd[data-v-8690c3a5] { + font-size: 1.25rem; + font-weight: 500; +} +.referral-stat small[data-v-8690c3a5] { + margin-right: 3px; +} +.referral-footer[data-v-8690c3a5] { + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + gap: 8px 16px; + margin-top: auto; + display: flex; +} +.referral-footer p[data-v-8690c3a5] { + color: var(--p-text-muted-color); + margin: 0; + font-size: 0.875rem; + line-height: 1.6; +} +.referral-details[data-v-8690c3a5] { + min-height: 32px; + color: var(--p-primary-color); + align-items: center; + gap: 6px; + font-size: 0.9375rem; + text-decoration: none; + display: inline-flex; +} +.referral-details[data-v-8690c3a5]:hover { + text-decoration: underline; +} +.referral-details i[data-v-8690c3a5] { + font-size: 0.8125rem; +} +.referral-empty[data-v-8690c3a5] { + justify-content: center; + align-items: flex-start; + gap: 14px; +} +.referral-empty h3[data-v-8690c3a5] { + margin: 0; + font-size: 1.25rem; + font-weight: 600; +} +.referral-empty p[data-v-8690c3a5] { + color: var(--p-text-muted-color); + margin: 0; + font-size: 0.9375rem; + line-height: 1.8; +} +.referral-empty .home-button[data-v-8690c3a5] { + margin-top: 8px; +} +.referral-loading[data-v-8690c3a5] { + gap: 14px; +} +.referral-placeholders[data-v-8690c3a5] { + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 20px; + margin-top: 18px; + display: grid; +} +@container (width<=380px) { + .referral-body[data-v-8690c3a5] { + gap: 20px; + padding: 20px 16px; + } + .referral-overview[data-v-8690c3a5] { + gap: 12px; + } + .referral-balance dd[data-v-8690c3a5] { + font-size: 1.625rem; + } + .referral-invitees[data-v-8690c3a5] { + padding-left: 12px; + } + .referral-invitees dd[data-v-8690c3a5] { + font-size: 1.625rem; + } + .referral-stats[data-v-8690c3a5] { + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 16px 12px; + } +} diff --git a/app/assets/styles/HomeServerPanel.Do7AgMDx.css b/app/assets/styles/HomeServerPanel.Do7AgMDx.css new file mode 100644 index 0000000..53a7b2b --- /dev/null +++ b/app/assets/styles/HomeServerPanel.Do7AgMDx.css @@ -0,0 +1,107 @@ +.home-tabs[data-v-7ce76df7], +.server-head[data-v-7ce76df7] { + border-bottom: 1px solid var(--p-content-border-color); +} +.home-tabs[data-v-7ce76df7] { + align-items: center; + gap: 4px; + min-width: 0; + padding: 10px 14px; + display: flex; + overflow-x: auto; +} +.home-tab[data-v-7ce76df7] { + cursor: pointer; + color: var(--p-text-muted-color); + white-space: nowrap; + background: 0 0; + border: none; + border-radius: 4px; + flex: 1; + padding: 7px 10px; + font-size: 1rem; +} +.home-tab.active[data-v-7ce76df7] { + background: var(--p-highlight-background); + font-weight: 500; +} +.home-tab.active[data-v-7ce76df7], +.home-tab[data-v-7ce76df7]:hover { + color: var(--p-primary-color); +} +.home-row[data-v-7ce76df7], +.server-cols[data-v-7ce76df7] { + grid-template-columns: minmax(0, 1fr) 106px 74px; + align-items: center; + gap: 12px; + display: grid; +} +.server-cols[data-v-7ce76df7] { + background: color-mix( + in srgb, + var(--p-content-hover-background) 45%, + var(--p-content-background) + ); + border-bottom: 1px solid var(--p-content-border-color); + min-height: 43px; + padding: 12px 14px; + font-size: 1rem; + font-weight: 500; +} +.server-cols span[data-v-7ce76df7]:nth-child(2), +.server-due[data-v-7ce76df7] { + text-align: center; +} +.server-cols span[data-v-7ce76df7]:last-child { + text-align: right; +} +.home-row-skeleton[data-v-7ce76df7] { + box-sizing: border-box; + height: calc(2.715rem + 18px); + padding: 7px 14px; +} +.home-row[data-v-7ce76df7] { + min-height: calc(2.715rem + 18px); + padding: 7px 14px; +} +.home-row[data-v-7ce76df7] .p-tag { + border-radius: 20px; + justify-self: end; + font-size: 0.875rem; +} +.server-pagination[data-v-7ce76df7] { + margin-top: auto; + padding: 8px 14px 14px; +} +.server-pagination[data-v-7ce76df7] .p-paginator { + background: 0 0; +} +@media (width<=639px) { + .server-head[data-v-7ce76df7] { + flex-wrap: wrap; + gap: 2px; + padding-block: 10px; + } + .home-tabs[data-v-7ce76df7] { + padding: 10px; + } + .home-tab[data-v-7ce76df7] { + font-size: 0.875rem; + } + .home-row[data-v-7ce76df7], + .server-cols[data-v-7ce76df7] { + grid-template-columns: minmax(0, 1fr) 84px 58px; + gap: 8px; + } + .server-cols[data-v-7ce76df7] { + font-size: 0.875rem; + } + .home-row-title[data-v-7ce76df7] { + font-size: 0.9375rem; + } + .home-row-sub[data-v-7ce76df7] { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } +} diff --git a/app/assets/styles/HomeTicketPanel.LxPesukM.css b/app/assets/styles/HomeTicketPanel.LxPesukM.css new file mode 100644 index 0000000..05c94ba --- /dev/null +++ b/app/assets/styles/HomeTicketPanel.LxPesukM.css @@ -0,0 +1,21 @@ +.home-list[data-v-bacdfa58] { + padding: 0 18px; +} +.home-row-skeleton[data-v-bacdfa58] { + box-sizing: border-box; + height: calc(2.715rem + 28px); + padding: 12px 4px; +} +.home-row[data-v-bacdfa58] { + min-height: 64px; + padding-inline: 4px; +} +.ticket-status[data-v-bacdfa58] { + white-space: nowrap; + color: #fff; + border-radius: 20px; + flex-shrink: 0; + padding: 3px 7px; + font-size: 0.875rem; + font-weight: 600; +} diff --git a/app/assets/styles/HomeTicketStat.C4kzybrY.css b/app/assets/styles/HomeTicketStat.C4kzybrY.css new file mode 100644 index 0000000..31a715e --- /dev/null +++ b/app/assets/styles/HomeTicketStat.C4kzybrY.css @@ -0,0 +1,30 @@ +.stat-grid[data-v-6971a1b9] { + grid-template-columns: 1fr 1fr; + gap: 8px; + padding: 14px 18px; + display: grid; +} +.stat-chip[data-v-6971a1b9] { + border: 1px solid var(--p-content-border-color, #e2e8f0); + background: var(--p-content-background); + border-left-width: 3px; + border-radius: 8px; + align-items: baseline; + gap: 8px; + padding: 10px 12px; + text-decoration: none; + transition: background 0.15s; + display: flex; +} +.stat-chip[data-v-6971a1b9]:hover { + background: var(--p-content-hover-background); +} +.stat-num[data-v-6971a1b9] { + color: var(--p-text-color); + font-size: 1.25rem; + font-weight: 600; +} +.stat-name[data-v-6971a1b9] { + color: var(--p-text-muted-color, #64748b); + font-size: 0.875rem; +} diff --git a/app/assets/styles/HomeWalletCard.C5SHzGlJ.css b/app/assets/styles/HomeWalletCard.C5SHzGlJ.css new file mode 100644 index 0000000..846f293 --- /dev/null +++ b/app/assets/styles/HomeWalletCard.C5SHzGlJ.css @@ -0,0 +1,35 @@ +.wallet-body[data-v-0dbd1f86] { + flex-direction: column; + flex: 1; + padding-top: 28px; + display: flex; +} +.balance-label[data-v-0dbd1f86] { + color: var(--p-text-muted-color); + font-size: 1rem; +} +.balance-value[data-v-0dbd1f86] { + color: var(--p-text-color); + margin-top: 7px; + font-size: 1.75rem; + font-weight: 400; + line-height: 2.571rem; +} +.wallet-actions[data-v-0dbd1f86] { + grid-template-columns: 1fr 1fr; + gap: 7px; + margin-top: auto; + padding-top: 16px; + display: grid; +} +.wallet-actions-single[data-v-0dbd1f86] { + grid-template-columns: 1fr; +} +.wallet-actions[data-v-0dbd1f86] .p-button { + min-height: 36px; +} +@media (width<=639px) { + .wallet-body[data-v-0dbd1f86] { + padding-top: 28px; + } +} diff --git a/app/assets/styles/HostList.B3U15sJm.css b/app/assets/styles/HostList.B3U15sJm.css new file mode 100644 index 0000000..a68ba0c --- /dev/null +++ b/app/assets/styles/HostList.B3U15sJm.css @@ -0,0 +1,328 @@ +.traffic-error[data-v-e23fddb0] { + color: var(--p-text-muted-color); + align-items: center; + gap: 7px; + display: flex; +} +.catalog-empty-action[data-v-e23fddb0] { + border: 1px solid var(--p-primary-color); + background: var(--p-primary-color); + min-height: 36px; + color: var(--p-primary-contrast-color); + border-radius: 5px; + justify-content: center; + align-items: center; + gap: 8px; + padding: 8px 14px; + font-size: 0.9375rem; + font-weight: 500; + text-decoration: none; + display: inline-flex; +} +.catalog-empty-action[data-v-e23fddb0]:hover { + background: var(--p-primary-hover-color); +} +.catalog-empty-action[data-v-e23fddb0]:focus-visible { + outline: 2px solid var(--p-primary-color); + outline-offset: 3px; +} +.host-list-page .list-toolbar[data-v-e23fddb0] { + align-items: flex-start; +} +.host-list-page .list-toolbar-right[data-v-e23fddb0] { + width: 100%; +} +.list-description[data-v-e23fddb0] { + color: var(--p-text-muted-color, #64748b); + margin: 6px 0 0; + font-size: 0.9375rem; + line-height: 1.6; +} +.host-search[data-v-e23fddb0] { + align-items: center; + gap: 8px; + min-width: 0; + display: flex; +} +.host-detail-link[data-v-e23fddb0] { + color: var(--p-text-color); + border-radius: 3px; + text-decoration: none; +} +.host-detail-link[data-v-e23fddb0]:hover { + text-decoration: underline; +} +.host-detail-link[data-v-e23fddb0]:focus-visible { + outline: 2px solid var(--p-primary-color, #0052d9); + outline-offset: 4px; +} +.host-name[data-v-e23fddb0] { + font-weight: 400; +} +.host-product[data-v-e23fddb0] { + flex-direction: column; + align-items: flex-start; + gap: 4px; + max-width: 280px; + display: flex; +} +.host-notes-edit[data-v-e23fddb0] { + max-width: 100%; + min-height: 24px; + color: var(--p-text-muted-color); + font: inherit; + text-align: left; + cursor: pointer; + background: 0 0; + border: 0; + border-radius: 3px; + align-items: center; + gap: 6px; + padding: 0; + font-size: max(12px, 0.8125rem); + line-height: 1.5; + display: inline-flex; +} +.host-notes-edit[data-v-e23fddb0]:hover { + color: var(--p-primary-color); +} +.host-notes-edit[data-v-e23fddb0]:focus-visible { + outline: 2px solid var(--p-primary-color); + outline-offset: 3px; +} +.host-notes-edit > i[data-v-e23fddb0] { + flex-shrink: 0; + font-size: 0.75rem; +} +.host-notes-text[data-v-e23fddb0] { + -webkit-line-clamp: 2; + white-space: pre-wrap; + overflow-wrap: anywhere; + -webkit-box-orient: vertical; + display: -webkit-box; + overflow: hidden; +} +.host-notes-form[data-v-e23fddb0] { + flex-direction: column; + gap: 10px; + display: flex; +} +.host-notes-context[data-v-e23fddb0] { + color: var(--p-text-muted-color); + overflow-wrap: anywhere; + margin: 0 0 4px; +} +.table-scroll-hint[data-v-e23fddb0] { + display: none; +} +.host-traffic[data-v-e23fddb0] { + --traffic-accent: var(--p-green-600, #16a34a); + flex-direction: column; + justify-content: center; + gap: 8px; + min-width: 215px; + max-width: 280px; + min-height: 40px; + font-size: 1rem; + display: flex; +} +.traffic-track[data-v-e23fddb0] { + background: var(--p-content-border-color, #e2e8f0); + border-radius: 999px; + height: 6px; + overflow: hidden; +} +.traffic-track-fill[data-v-e23fddb0] { + border-radius: inherit; + background: var(--traffic-accent); + height: 100%; +} +.traffic-usage[data-v-e23fddb0] { + white-space: nowrap; + font-variant-numeric: tabular-nums; + align-items: center; + gap: 8px; + line-height: 1.5; + display: flex; +} +.traffic-usage > i[data-v-e23fddb0] { + color: var(--traffic-accent); + flex-shrink: 0; + font-size: 1.0625rem; +} +.traffic-period[data-v-e23fddb0] { + color: var(--p-text-muted-color); + align-items: center; + gap: 5px; + font-size: 0.8125rem; + line-height: 1; + display: flex; +} +.traffic-period > i[data-v-e23fddb0] { + font-size: 0.625rem; +} +.traffic-note[data-v-e23fddb0] { + color: var(--p-text-muted-color); + font-size: 0.875rem; +} +.traffic-unlimited[data-v-e23fddb0] { + align-items: center; + gap: 10px; + display: flex; +} +.traffic-infinity[data-v-e23fddb0] { + border: 1px solid color-mix(in srgb, var(--traffic-accent) 18%, transparent); + background: color-mix(in srgb, var(--traffic-accent) 7%, transparent); + width: 36px; + height: 36px; + color: var(--traffic-accent); + border-radius: 8px; + flex-shrink: 0; + place-items: center; + font-size: 1.75rem; + line-height: 1; + display: grid; +} +.traffic-unlimited-copy[data-v-e23fddb0] { + flex-direction: column; + gap: 2px; + display: flex; +} +.traffic-unlimited-label[data-v-e23fddb0] { + font-weight: 500; + line-height: 1.4; +} +.traffic-unlimited-copy > small[data-v-e23fddb0] { + font-size: 0.8125rem; + line-height: 1.5; +} +.app-dark .host-traffic { + --traffic-accent: var(--p-green-400, #4ade80); +} +.muted[data-v-e23fddb0] { + color: var(--p-text-muted-color, #94a3b8); +} +.os-cell[data-v-e23fddb0] { + overflow-wrap: anywhere; + align-items: center; + gap: 7px; + display: inline-flex; +} +.bulk-count[data-v-e23fddb0] { + color: var(--p-text-muted-color, #64748b); + margin-right: 4px; + font-size: 0.9375rem; +} +.bulk-hint[data-v-e23fddb0] { + color: var(--p-text-muted-color, #94a3b8); + font-size: 0.9375rem; +} +.batch-dlg[data-v-e23fddb0] { + flex-direction: column; + gap: 16px; + display: flex; +} +.confirm-text[data-v-e23fddb0] { + color: var(--p-text-color, #334155); + margin: 0; + font-size: 1rem; + line-height: 1.7; +} +.renew-dlg[data-v-e23fddb0] { + flex-direction: column; + gap: 14px; + display: flex; +} +.renew-hint[data-v-e23fddb0] { + color: var(--p-text-muted-color, #94a3b8); + margin: 0; + font-size: 0.875rem; + line-height: 1.7; +} +.renew-prod[data-v-e23fddb0] { + flex-direction: column; + gap: 2px; + display: flex; +} +.renew-name[data-v-e23fddb0] { + font-weight: 500; +} +.renew-host[data-v-e23fddb0] { + color: var(--p-text-muted-color, #94a3b8); + font-size: 0.875rem; +} +.renew-select[data-v-e23fddb0] { + width: 100%; +} +.renew-promo[data-v-e23fddb0] { + width: 100%; + min-width: 140px; +} +.renew-price[data-v-e23fddb0] { + color: #ef4444; + font-weight: 500; +} +.renew-total[data-v-e23fddb0] { + border-top: 1px solid var(--p-content-border-color, #e2e8f0); + color: var(--p-text-muted-color, #64748b); + justify-content: flex-end; + align-items: baseline; + gap: 8px; + padding-top: 12px; + font-size: 0.9375rem; + display: flex; +} +.renew-total b[data-v-e23fddb0] { + color: #ef4444; + font-size: 1.375rem; +} +.nowrap[data-v-e23fddb0] { + white-space: nowrap; +} +.form-row[data-v-e23fddb0] { + align-items: center; + gap: 14px; + display: flex; +} +.form-row > label[data-v-e23fddb0] { + width: 70px; + color: var(--p-text-muted-color, #64748b); + flex-shrink: 0; + font-size: 0.9375rem; +} +@media (width<=768px) { + .list-toolbar-right > .host-search[data-v-e23fddb0] { + flex-basis: 100%; + } + .host-search .list-search[data-v-e23fddb0] { + flex: 1; + width: auto; + min-width: 0; + } + .list-foot .list-bulk > .p-button[data-v-e23fddb0] { + flex: 1; + } + .host-search > .p-button[data-v-e23fddb0] { + flex: none; + } + .list-foot .list-bulk[data-v-e23fddb0] { + flex-wrap: wrap; + } + .table-scroll-hint[data-v-e23fddb0] { + color: var(--p-text-muted-color, #64748b); + align-items: center; + gap: 6px; + margin: -8px 0 0; + font-size: 0.875rem; + display: flex; + } + .form-row[data-v-e23fddb0] { + flex-direction: column; + align-items: stretch; + gap: 8px; + } + .form-row[data-v-e23fddb0] .p-password-input { + width: 100%; + min-width: 0; + } +} diff --git a/app/assets/styles/InstanceAccess.DIZBrksv.css b/app/assets/styles/InstanceAccess.DIZBrksv.css new file mode 100644 index 0000000..89ddb48 --- /dev/null +++ b/app/assets/styles/InstanceAccess.DIZBrksv.css @@ -0,0 +1,284 @@ +.ac[data-v-cd28d8b4] { + gap: 42px; +} +.ac[data-v-cd28d8b4], +.block[data-v-cd28d8b4] { + flex-direction: column; + display: flex; +} +.block[data-v-cd28d8b4] { + gap: 14px; + min-width: 0; +} +.block-title[data-v-cd28d8b4] { + margin: 0; + font-size: 1.125rem; + font-weight: 600; +} +.block-desc[data-v-cd28d8b4] { + color: var(--p-text-muted-color); + margin: -7px 0 0; + font-size: 1rem; + line-height: 1.5; +} +.info-table[data-v-cd28d8b4] { + border: 1px solid var(--console-panel-border); + box-shadow: var(--console-panel-shadow); + background: var(--console-panel-bg); + border-radius: 6px; + overflow: hidden; +} +.kv[data-v-cd28d8b4] { + grid-template-columns: 16.6667% minmax(0, 1fr); + align-items: center; + min-height: 49px; + display: grid; +} +.kv + .kv[data-v-cd28d8b4] { + border-top: 1px solid var(--console-panel-border); +} +.kv[data-v-cd28d8b4]:nth-child(2n) { + background: var(--console-page-bg); +} +.kv > span[data-v-cd28d8b4] { + color: var(--p-text-muted-color); + padding: 14px; + font-weight: 600; +} +.kv > div[data-v-cd28d8b4] { + overflow-wrap: anywhere; + min-width: 0; + padding: 14px; +} +.action-cell[data-v-cd28d8b4], +.password-cell[data-v-cd28d8b4] { + flex-direction: column; + align-items: flex-start; + gap: 7px; + display: flex; +} +.password-value[data-v-cd28d8b4] { + align-items: center; + display: flex; +} +.dialog-error[data-v-cd28d8b4] { + margin-bottom: 14px; +} +.act[data-v-cd28d8b4] { + width: 21px; + height: 21px; + color: var(--p-text-muted-color, #94a3b8); + cursor: pointer; + background: 0 0; + border: 0; + border-radius: 4px; + flex-shrink: 0; + justify-content: center; + align-items: center; + padding: 0; + font-size: 0.875rem; + display: inline-flex; +} +.act.ok[data-v-cd28d8b4], +.act[data-v-cd28d8b4]:hover { + color: var(--p-primary-color, #10b981); +} +.block-actions[data-v-cd28d8b4] { + gap: 8px; + padding-top: 4px; + display: flex; +} +.repair[data-v-cd28d8b4] { + grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr)); + gap: 14px; + display: grid; +} +.repair-item[data-v-cd28d8b4] { + border: 1px solid var(--p-content-border-color, #e2e8f0); + border-radius: 10px; + flex-direction: column; + gap: 8px; + padding: 14px 16px; + display: flex; +} +.repair-name[data-v-cd28d8b4] { + font-size: 1rem; + font-weight: 600; +} +.repair-desc[data-v-cd28d8b4] { + color: var(--p-text-muted-color, #94a3b8); + flex: 1; + margin: 0; + font-size: 0.875rem; + line-height: 1.6; +} +.re-form[data-v-cd28d8b4] { + flex-direction: column; + gap: 21px; + width: 100%; + display: flex; +} +.re-notice[data-v-cd28d8b4] { + border: 1px solid color-mix(in srgb, var(--p-primary-color) 22%, transparent); + background: color-mix( + in srgb, + var(--p-primary-color) 8%, + var(--console-panel-bg) + ); + color: var(--p-primary-color); + border-radius: 6px; + margin-bottom: 14px; + padding: 14px; + font-size: 1rem; + font-weight: 500; + line-height: 1.75; +} +.re-notice h4[data-v-cd28d8b4] { + margin: 0 0 7px; + font-size: 1.125rem; + font-weight: 600; +} +.re-notice ol[data-v-cd28d8b4] { + margin: 0; + padding-left: 16px; +} +.re-snapshot[data-v-cd28d8b4] { + margin-bottom: 21px; +} +.re-form .form-row[data-v-cd28d8b4] { + flex-direction: column; + align-items: stretch; + gap: 7px; +} +.re-form .form-row > .field-label[data-v-cd28d8b4], +.re-form .form-row > label[data-v-cd28d8b4] { + width: auto; + color: var(--p-text-color); + font-size: 1rem; +} +.re-form .form-row > .grow[data-v-cd28d8b4] { + flex: none; + width: 100%; +} +.re-login[data-v-cd28d8b4] { + border: 0; + min-width: 0; + margin: 0; + padding: 0; +} +.re-login legend[data-v-cd28d8b4] { + margin-bottom: 7px; + padding: 0; + font-size: 1rem; +} +.re-choice[data-v-cd28d8b4], +.re-login-options[data-v-cd28d8b4] { + align-items: center; + gap: 7px; + display: flex; +} +.re-login-options[data-v-cd28d8b4] { + flex-wrap: wrap; + gap: 14px; +} +.re-choice label[data-v-cd28d8b4] { + font-size: 1rem; +} +.re-password[data-v-cd28d8b4] { + align-items: stretch; + min-width: 0; + display: flex; +} +.re-password[data-v-cd28d8b4] > :first-child { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.re-password[data-v-cd28d8b4] .p-button { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + flex-shrink: 0; +} +.re-format-warning[data-v-cd28d8b4] .p-message-content { + gap: 7px; + padding: 5px 7px; +} +.re-format-warning[data-v-cd28d8b4] .p-message-icon, +.re-format-warning[data-v-cd28d8b4] .p-message-text { + font-size: 0.875rem; +} +.form-list[data-v-cd28d8b4] { + flex-direction: column; + margin-top: 14px; +} +.form-list[data-v-cd28d8b4], +.form-row[data-v-cd28d8b4] { + gap: 14px; + display: flex; +} +.form-row[data-v-cd28d8b4] { + align-items: center; +} +.form-row > .field-label[data-v-cd28d8b4], +.form-row > label[data-v-cd28d8b4] { + width: 80px; + color: var(--p-text-muted-color, #64748b); + flex-shrink: 0; + font-size: 0.9375rem; +} +.form-row > label.cb-label[data-v-cd28d8b4] { + white-space: nowrap; + width: auto; +} +.grow[data-v-cd28d8b4] { + flex: 1; + min-width: 0; +} +.os-opt[data-v-cd28d8b4] { + align-items: center; + gap: 8px; + min-width: 0; + display: flex; +} +.os-opt span[data-v-cd28d8b4] { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +.hint[data-v-cd28d8b4] { + color: var(--p-text-muted-color, #94a3b8); + font-size: 0.875rem; +} +.re-actions[data-v-cd28d8b4] { + justify-content: flex-end; + display: flex; +} +.dlg[data-v-cd28d8b4] { + flex-direction: column; + gap: 14px; + display: flex; +} +.confirm-text[data-v-cd28d8b4] { + margin: 0; + font-size: 1rem; + line-height: 1.7; +} +@media (width<=480px) { + .kv[data-v-cd28d8b4] { + grid-template-columns: 100px minmax(0, 1fr); + } + .kv > div[data-v-cd28d8b4], + .kv > span[data-v-cd28d8b4] { + padding: 12px; + } + .form-row[data-v-cd28d8b4] { + flex-wrap: wrap; + gap: 8px; + } + .form-row > .field-label[data-v-cd28d8b4], + .form-row > label[data-v-cd28d8b4]:not(.cb-label) { + width: 100%; + } + .form-row > .grow[data-v-cd28d8b4] { + flex-basis: 100%; + } +} diff --git a/app/assets/styles/InstanceBilling.CvIGLT2J.css b/app/assets/styles/InstanceBilling.CvIGLT2J.css new file mode 100644 index 0000000..4389c8c --- /dev/null +++ b/app/assets/styles/InstanceBilling.CvIGLT2J.css @@ -0,0 +1,143 @@ +.bill[data-v-4e83e0f6] { + gap: 28px; +} +.bill[data-v-4e83e0f6], +.block[data-v-4e83e0f6] { + flex-direction: column; + display: flex; +} +.block[data-v-4e83e0f6] { + gap: 14px; +} +.block-title[data-v-4e83e0f6] { + margin: 0; + font-size: 1.0625rem; + font-weight: 600; +} +.info-table[data-v-4e83e0f6] { + border: 1px solid var(--console-panel-border); + box-shadow: var(--console-panel-shadow); + background: var(--console-panel-bg); + border-radius: 6px; + overflow: hidden; +} +.kv[data-v-4e83e0f6] { + grid-template-columns: 16.6667% minmax(0, 1fr); + align-items: center; + min-height: 49px; + display: grid; +} +.kv + .kv[data-v-4e83e0f6] { + border-top: 1px solid var(--console-panel-border); +} +.kv[data-v-4e83e0f6]:nth-child(2n) { + background: var(--console-page-bg); +} +.kv[data-v-4e83e0f6] > :first-child { + color: var(--p-text-muted-color); + padding: 14px; + font-weight: 600; +} +.kv[data-v-4e83e0f6] > :last-child { + overflow-wrap: anywhere; + min-width: 0; + padding: 14px; + font-weight: 400; +} +.kv[data-v-4e83e0f6] > .p-tag { + justify-self: start; + margin: 14px; + padding: 2px 7px; +} +.action-cell[data-v-4e83e0f6] { + flex-direction: column; + align-items: flex-start; + gap: 14px; + display: flex; +} +.action-cell[data-v-4e83e0f6] .p-button { + max-width: 100%; +} +.upgrade-desc[data-v-4e83e0f6] { + color: var(--p-text-muted-color); + margin: 0; + line-height: 1.7; +} +.upgrade-dialog-body[data-v-4e83e0f6] { + flex-direction: column; + gap: 18px; + display: flex; +} +.upgrade-dialog-body p[data-v-4e83e0f6] { + margin: 8px 0 0; + line-height: 1.7; +} +.upgrade-panel[data-v-4e83e0f6] { + background: var(--console-panel-bg); + border: 1px solid var(--console-panel-border); + box-shadow: var(--console-panel-shadow); + border-radius: 6px; + padding: 14px; +} +@media (width<=767px) { + .kv[data-v-4e83e0f6] { + grid-template-columns: 100px minmax(0, 1fr); + } +} +.auto-renew[data-v-4e83e0f6] { + align-items: center; + gap: 10px; + display: flex; +} +.auto-renew-state[data-v-4e83e0f6] { + color: var(--p-text-muted-color, #94a3b8); + font-size: 0.875rem; +} +.auto-renew-state.on[data-v-4e83e0f6] { + color: #22c55e; +} +.block-actions[data-v-4e83e0f6] { + gap: 8px; + padding-top: 4px; + display: flex; +} +.dlg[data-v-4e83e0f6] { + flex-direction: column; + gap: 16px; + display: flex; +} +.form-row[data-v-4e83e0f6] { + align-items: center; + gap: 14px; + display: flex; +} +.form-label[data-v-4e83e0f6], +.form-row > label[data-v-4e83e0f6] { + width: 80px; + color: var(--p-text-muted-color, #64748b); + flex-shrink: 0; + font-size: 0.9375rem; +} +.grow[data-v-4e83e0f6] { + flex: 1; +} +.refund-state[data-v-4e83e0f6] { + background: var(--p-content-hover-background); + border-radius: 8px; + flex-direction: column; + gap: 10px; + padding: 12px 14px; + display: flex; +} +.refund-reject[data-v-4e83e0f6] { + color: #ef4444; + line-height: 1.7; +} +.hint[data-v-4e83e0f6], +.refund-reject[data-v-4e83e0f6] { + margin: 0; + font-size: 0.875rem; +} +.hint[data-v-4e83e0f6] { + color: var(--p-text-muted-color, #94a3b8); +} diff --git a/app/assets/styles/InstanceDisks.Ca7NZxYd.css b/app/assets/styles/InstanceDisks.Ca7NZxYd.css new file mode 100644 index 0000000..5dfcdde --- /dev/null +++ b/app/assets/styles/InstanceDisks.Ca7NZxYd.css @@ -0,0 +1,98 @@ +.disks[data-v-22ec0282] { + gap: 42px; +} +.disks[data-v-22ec0282], +.grp[data-v-22ec0282] { + flex-direction: column; + display: flex; +} +.grp[data-v-22ec0282] { + gap: 10px; +} +.load-error[data-v-22ec0282] { + flex-wrap: wrap; + align-items: center; + gap: 8px; + display: flex; +} +.grp-title[data-v-22ec0282] { + font-size: 1rem; + font-weight: 600; +} +.grp-note[data-v-22ec0282] { + color: var(--p-text-muted-color, #94a3b8); + margin: 0; + font-size: 1rem; +} +.disk-name[data-v-22ec0282] { + align-items: center; + gap: 8px; + display: flex; +} +.disk-name i[data-v-22ec0282], +.empty[data-v-22ec0282] { + color: var(--p-text-muted-color, #94a3b8); +} +.empty[data-v-22ec0282] { + text-align: center; + padding: 20px 0; + font-size: 1rem; +} +.row-actions[data-v-22ec0282] { + gap: 4px; + display: flex; +} +.dlg[data-v-22ec0282] { + flex-direction: column; + gap: 16px; + display: flex; +} +.resize-info[data-v-22ec0282] { + color: var(--p-text-muted-color, #64748b); + margin: 0; + font-size: 1rem; +} +.form-row[data-v-22ec0282] { + align-items: center; + gap: 14px; + display: flex; +} +.form-row > label[data-v-22ec0282] { + flex-shrink: 0; + width: 70px; +} +.form-row > label[data-v-22ec0282], +.quote[data-v-22ec0282] { + color: var(--p-text-muted-color, #64748b); + font-size: 1rem; +} +.quote[data-v-22ec0282] { + border-top: 1px solid var(--p-content-border-color, #e2e8f0); + justify-content: space-between; + align-items: center; + padding-top: 14px; + display: flex; +} +.quote-value[data-v-22ec0282] { + color: #ef4444; + font-size: 1.25rem; + font-weight: 600; +} +.hint[data-v-22ec0282] { + color: var(--p-text-muted-color, #94a3b8); + margin: 0; + font-size: 1rem; +} +.grp[data-v-22ec0282] .p-datatable-table-container { + background: var(--console-panel-bg); + border: 1px solid var(--console-panel-border); + box-shadow: var(--console-panel-shadow); + border-radius: 6px; +} +.grp[data-v-22ec0282] .p-datatable-thead > tr > th { + background: var(--console-page-bg); + padding: 14px; +} +.grp[data-v-22ec0282] .p-datatable-tbody > tr > td { + padding: 14px; +} diff --git a/app/assets/styles/InstanceLoadingShell.CwfiUwdU.css b/app/assets/styles/InstanceLoadingShell.CwfiUwdU.css new file mode 100644 index 0000000..8d987b4 --- /dev/null +++ b/app/assets/styles/InstanceLoadingShell.CwfiUwdU.css @@ -0,0 +1,80 @@ +.instance-loading-shell[data-v-f12d9300] { + min-width: 0; +} +.shell-tabs[data-v-f12d9300] { + border-bottom: 1px solid var(--p-content-border-color, #e2e8f0); + display: flex; + overflow: hidden; +} +.shell-tabs > span[data-v-f12d9300] { + flex-shrink: 0; + padding: 14px; +} +.shell-grid[data-v-f12d9300] { + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 21px; + padding-top: 21px; + display: grid; +} +.shell-column[data-v-f12d9300] { + gap: 21px; + min-width: 0; +} +.shell-card[data-v-f12d9300], +.shell-column[data-v-f12d9300] { + flex-direction: column; + display: flex; +} +.shell-card[data-v-f12d9300] { + background: var(--console-panel-bg); + border: 1px solid var(--console-panel-border); + box-shadow: var(--console-panel-shadow); + border-radius: 6px; + gap: 12px; + padding: 14px; +} +.shell-row[data-v-f12d9300] { + justify-content: space-between; + gap: 12px; + display: flex; +} +.shell-button[data-v-f12d9300] { + margin-top: 3px; +} +.shell-secondary[data-v-f12d9300] { + min-height: 230px; +} +@media (width<=1199px) { + .dcim .shell-column[data-v-f12d9300], + .dcim .shell-grid[data-v-f12d9300] { + gap: 14px; + } +} +@media (width<=1023px) { + .instance-loading-shell:not(.dcim) .shell-grid[data-v-f12d9300] { + grid-template-columns: 1fr; + } +} +@media (width<=950px) { + .dcim .shell-grid[data-v-f12d9300] { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + .dcim .shell-column[data-v-f12d9300]:last-child { + grid-column: 1/-1; + grid-template-columns: 1fr 1fr; + display: grid; + } +} +@media (width<=600px) { + .dcim .shell-grid[data-v-f12d9300] { + grid-template-columns: 1fr; + padding-top: 14px; + } + .dcim .shell-column[data-v-f12d9300]:last-child { + grid-column: auto; + display: flex; + } + .dcim .shell-tabs > span[data-v-f12d9300] { + padding: 12px 10px; + } +} diff --git a/app/assets/styles/InstanceManage.apzbBV1c.css b/app/assets/styles/InstanceManage.apzbBV1c.css new file mode 100644 index 0000000..aba3d8a --- /dev/null +++ b/app/assets/styles/InstanceManage.apzbBV1c.css @@ -0,0 +1,25 @@ +.instance-manage[data-v-627058ac] { + min-width: 0; +} +.instance-manage[data-v-627058ac] .p-tablist-tab-list, +.instance-manage[data-v-627058ac] .p-tabpanels { + background: 0 0; +} +.instance-manage[data-v-627058ac] .p-tab { + padding: 14px; + font-size: 1rem; +} +.instance-manage[data-v-627058ac] .p-tabpanels { + padding: 21px 0 0; +} +.instance-manage[data-v-627058ac] .p-tabpanel { + min-width: 0; +} +.bs-wrap[data-v-627058ac] { + flex-direction: column; + gap: 42px; + display: flex; +} +.bs-block[data-v-627058ac] { + min-width: 0; +} diff --git a/app/assets/styles/InstanceMonitor.B0X15iQt.css b/app/assets/styles/InstanceMonitor.B0X15iQt.css new file mode 100644 index 0000000..6b24adc --- /dev/null +++ b/app/assets/styles/InstanceMonitor.B0X15iQt.css @@ -0,0 +1,64 @@ +.mon[data-v-6a900feb] { + flex-direction: column; + gap: 21px; + display: flex; +} +.range-row[data-v-6a900feb] { + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + gap: 12px; + display: flex; +} +.charts[data-v-6a900feb] { + grid-template-columns: minmax(0, 1fr); + gap: 21px; + display: grid; +} +.chart-card[data-v-6a900feb] { + background: var(--console-panel-bg); + border: 1px solid var(--p-content-border-color, #e2e8f0); + min-width: 0; + box-shadow: var(--console-panel-shadow); + border-radius: 6px; + padding: 14px; +} +.chart-title[data-v-6a900feb] { + border-bottom: 1px solid var(--console-panel-border); + min-height: 24px; + margin-bottom: 21px; + padding-bottom: 21px; + font-size: 1rem; + font-weight: 600; +} +.chart-unit[data-v-6a900feb] { + color: var(--p-text-muted-color); + font-weight: 400; +} +.chart-viewport[data-v-6a900feb] { + min-width: 0; + min-height: 280px; +} +.chart-error[data-v-6a900feb] { + justify-content: center; + align-items: center; + min-height: 280px; + display: flex; +} +.chart-empty[data-v-6a900feb] { + min-height: 280px; + color: var(--p-text-muted-color); + place-items: center; + margin: 0; + font-size: 1rem; + display: grid; +} +.refresh-row[data-v-6a900feb] { + align-items: center; + gap: 10px; + display: flex; +} +.hint[data-v-6a900feb] { + color: var(--p-text-muted-color, #94a3b8); + font-size: 0.875rem; +} diff --git a/app/assets/styles/InstanceMonitorSkeleton.C0FT51jJ.css b/app/assets/styles/InstanceMonitorSkeleton.C0FT51jJ.css new file mode 100644 index 0000000..fe190ff --- /dev/null +++ b/app/assets/styles/InstanceMonitorSkeleton.C0FT51jJ.css @@ -0,0 +1,44 @@ +.monitor-skeleton[data-v-5a1fd568] { + flex-direction: column; + gap: 21px; + min-width: 0; + display: flex; +} +.range-placeholder[data-v-5a1fd568] { + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + gap: 12px; + min-height: 40px; + display: flex; +} +.range-placeholder > .p-skeleton[data-v-5a1fd568] { + max-width: 100%; +} +.hint-placeholder[data-v-5a1fd568] { + color: #0000; + font-size: 0.875rem; +} +.refresh-placeholder[data-v-5a1fd568] { + height: 35px; +} +.chart-placeholder[data-v-5a1fd568] { + border: 1px solid var(--console-panel-border); + box-shadow: var(--console-panel-shadow); + background: var(--console-panel-bg); + border-radius: 6px; + min-width: 0; + padding: 14px; +} +.title-placeholder[data-v-5a1fd568] { + border-bottom: 1px solid var(--console-panel-border); + margin-bottom: 21px; + padding-bottom: 21px; +} +.dcim .title-placeholder[data-v-5a1fd568] { + margin-bottom: 14px; + padding-bottom: 14px; +} +.legend-placeholder[data-v-5a1fd568] { + margin-bottom: 7px; +} diff --git a/app/assets/styles/InstanceNetwork.CyucZaZp.css b/app/assets/styles/InstanceNetwork.CyucZaZp.css new file mode 100644 index 0000000..1a70072 --- /dev/null +++ b/app/assets/styles/InstanceNetwork.CyucZaZp.css @@ -0,0 +1,160 @@ +.nw[data-v-aa906366] { + flex-direction: column; + gap: 28px; + min-width: 0; + display: flex; +} +.nw[data-v-aa906366] .network-section { + gap: 14px; + min-width: 0; +} +.nw[data-v-aa906366] .network-head { + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + gap: 12px 16px; + min-width: 0; + display: flex; +} +.nw[data-v-aa906366] .network-heading { + align-items: center; + gap: 8px; + display: flex; +} +.nw[data-v-aa906366] .network-head h4 { + margin: 0; + font-size: 1.125rem; + font-weight: 600; +} +.nw[data-v-aa906366] .network-count { + color: var(--p-text-muted-color); + font-size: 1rem; +} +.nw[data-v-aa906366] .network-actions { + flex-wrap: wrap; + justify-content: flex-end; + align-items: center; + gap: 8px; + min-width: 0; + max-width: 100%; + margin-left: auto; + display: flex; +} +.nw[data-v-aa906366] .network-table { + border: 1px solid var(--console-panel-border); + background: var(--console-panel-bg); + border-radius: 6px; + overflow: hidden; +} +.nw[data-v-aa906366] .network-table.p-datatable .p-datatable-tbody > tr > td, +.nw[data-v-aa906366] .network-table.p-datatable .p-datatable-thead > tr > th { + padding: 12px 14px; +} +.nw[data-v-aa906366] .network-table .p-datatable-tbody > tr:last-child > td { + border-bottom: 0; +} +.nw[data-v-aa906366] + .network-table.p-datatable + .p-datatable-tbody + > .p-datatable-empty-message + > td { + text-align: center; + color: var(--p-text-muted-color); + padding: 24px 14px; +} +.nw[data-v-aa906366] .network-table .empty { + padding: 0; +} +@media (width<=767px) { + .nw[data-v-aa906366] .network-head { + align-items: flex-start; + } + .nw[data-v-aa906366] .network-actions { + justify-content: flex-start; + margin-left: 0; + } + .nw[data-v-aa906366] .network-head > .network-actions { + flex-basis: 100%; + } +} +.block[data-v-aa906366] { + flex-direction: column; + gap: 14px; + min-width: 0; + display: flex; +} +.block-title[data-v-aa906366] { + margin: 0; + font-size: 1.125rem; + font-weight: 600; +} +.block-desc[data-v-aa906366] { + color: var(--p-text-muted-color, #94a3b8); + margin: 0; + font-size: 1rem; + line-height: 1.7; +} +.kv[data-v-aa906366] { + justify-content: space-between; + align-items: center; + gap: 12px; + font-size: 1rem; + display: flex; +} +.kv > span[data-v-aa906366] { + color: var(--p-text-muted-color, #64748b); +} +.kv > b[data-v-aa906366] { + overflow-wrap: anywhere; + min-width: 0; + font-weight: 500; +} +.action-cell[data-v-aa906366] { + flex-wrap: wrap; + gap: 8px; + min-width: 0; + display: flex; +} +.action-cell > a[data-v-aa906366], +.action-cell[data-v-aa906366] .p-button { + max-width: 100%; +} +.empty[data-v-aa906366] { + text-align: center; + padding: 20px 0; +} +.empty[data-v-aa906366], +.sub[data-v-aa906366] { + color: var(--p-text-muted-color, #94a3b8); + font-size: 1rem; +} +.info-table[data-v-aa906366] { + border: 1px solid var(--console-panel-border); + box-shadow: var(--console-panel-shadow); + background: var(--console-panel-bg); + border-radius: 6px; + overflow: hidden; +} +.info-table .kv[data-v-aa906366] { + grid-template-columns: 16.6667% minmax(0, 1fr); + gap: 0; + min-height: 49px; + display: grid; +} +.info-table .kv[data-v-aa906366] > * { + padding: 14px; +} +.info-table .kv[data-v-aa906366]:nth-child(2n) { + background: var(--console-page-bg); +} +.info-table .kv + .kv[data-v-aa906366] { + border-top: 1px solid var(--console-panel-border); +} +.info-table .kv > span[data-v-aa906366] { + font-weight: 600; +} +@media (width<=767px) { + .info-table .kv[data-v-aa906366] { + grid-template-columns: 100px minmax(0, 1fr); + } +} diff --git a/app/assets/styles/InstanceOnDemand.okGWwgIJ.css b/app/assets/styles/InstanceOnDemand.okGWwgIJ.css new file mode 100644 index 0000000..ca3a0e6 --- /dev/null +++ b/app/assets/styles/InstanceOnDemand.okGWwgIJ.css @@ -0,0 +1,25 @@ +.on-demand[data-v-2710106c] { + gap: 12px; + font-size: 13px; + display: grid; +} +.on-demand h4[data-v-2710106c], +.on-demand p[data-v-2710106c] { + margin: 0; +} +.on-demand small[data-v-2710106c] { + color: var(--p-text-muted-color); + font-size: 12px; +} +.actions[data-v-2710106c] { + flex-wrap: wrap; + gap: 8px; + display: flex; +} +.confirmation[data-v-2710106c] { + align-items: center; + gap: 8px; + margin-top: 12px; + font-size: 13px; + display: flex; +} diff --git a/app/assets/styles/InstanceOverview.C9ExpxMB.css b/app/assets/styles/InstanceOverview.C9ExpxMB.css new file mode 100644 index 0000000..f783e28 --- /dev/null +++ b/app/assets/styles/InstanceOverview.C9ExpxMB.css @@ -0,0 +1,241 @@ +.ov[data-v-fe24aa37] { + flex-direction: column; + gap: 12px; + display: flex; +} +.grid[data-v-fe24aa37] { + grid-template-columns: repeat(3, minmax(0, 1fr)); + align-items: start; + gap: 21px; + display: grid; +} +.overview-column[data-v-fe24aa37] { + gap: 21px; + min-width: 0; +} +.card[data-v-fe24aa37], +.overview-column[data-v-fe24aa37] { + flex-direction: column; + display: flex; +} +.card[data-v-fe24aa37] { + background: var(--console-panel-bg); + border: 1px solid var(--p-content-border-color, #e2e8f0); + box-shadow: var(--console-panel-shadow); + border-radius: 6px; + gap: 12px; + padding: 14px; +} +.card-head[data-v-fe24aa37] { + color: var(--p-text-color, #334155); + justify-content: space-between; + align-items: center; + font-size: 1rem; + font-weight: 600; + display: flex; +} +.card-link[data-v-fe24aa37] { + text-align: left; + cursor: pointer; + background: 0 0; + border: 0; + border-radius: 4px; + width: 100%; + padding: 0; +} +.card-head i[data-v-fe24aa37] { + color: var(--p-text-muted-color, #94a3b8); + font-size: 0.875rem; +} +.card-body[data-v-fe24aa37] { + flex-direction: column; + flex: 1; + gap: 10.5px; + display: flex; +} +.kv[data-v-fe24aa37] { + justify-content: space-between; + align-items: center; + gap: 12px; + font-size: 1rem; + display: flex; +} +.kv > span[data-v-fe24aa37] { + color: var(--p-text-muted-color, #64748b); + flex-shrink: 0; +} +.kv > b[data-v-fe24aa37] { + text-align: right; + gap: 6px; + min-width: 0; + font-weight: 500; +} +.icon-action[data-v-fe24aa37], +.kv > b[data-v-fe24aa37] { + align-items: center; + display: inline-flex; +} +.icon-action[data-v-fe24aa37] { + width: 24px; + height: 24px; + color: var(--p-text-muted-color, #94a3b8); + cursor: pointer; + background: 0 0; + border: 0; + border-radius: 4px; + flex-shrink: 0; + justify-content: center; + padding: 0; +} +.icon-action .pi[data-v-fe24aa37] { + font-size: 0.875rem; +} +.copy.ok[data-v-fe24aa37], +.icon-action[data-v-fe24aa37]:hover { + color: var(--p-primary-color, #10b981); +} +.price[data-v-fe24aa37] { + font-weight: 700 !important; +} +.unlimited[data-v-fe24aa37] { + color: var(--p-text-muted-color, #94a3b8); + font-size: 0.875rem; +} +.os[data-v-fe24aa37] { + flex-direction: column; + align-items: center; + gap: 8px; + padding: 8px 0 14px; + font-size: 1rem; + font-weight: 500; + display: flex; +} +.os span[data-v-fe24aa37] { + text-overflow: ellipsis; + white-space: nowrap; + max-width: 100%; + overflow: hidden; +} +.res[data-v-fe24aa37] { + flex-direction: column; +} +.res[data-v-fe24aa37], +.res-head[data-v-fe24aa37] { + gap: 8px; + display: flex; +} +.res-head[data-v-fe24aa37] { + border: 1px solid var(--console-panel-border); + box-shadow: var(--console-panel-shadow); + color: var(--p-text-muted-color, #64748b); + border-radius: 6px; + align-items: center; + padding: 14px; + font-size: 1rem; +} +.res-head b[data-v-fe24aa37] { + color: var(--p-text-color, #334155); + margin-left: auto; + font-weight: 600; +} +.res-sub[data-v-fe24aa37] { + color: var(--p-text-muted-color, #94a3b8); + text-overflow: ellipsis; + white-space: nowrap; + font-size: 0.875rem; + overflow: hidden; +} +.res-body[data-v-fe24aa37] { + align-items: center; + gap: 14px; + padding: 7px 0 14px; + display: flex; +} +.res-chart[data-v-fe24aa37] { + flex: 1; + min-width: 0; + min-height: 126px; +} +.resource-unavailable[data-v-fe24aa37] { + min-height: 112px; + color: var(--p-text-muted-color); + text-align: center; + flex: 0 0 112px; + place-items: center; + font-size: 0.875rem; + display: grid; +} +.network-chart[data-v-fe24aa37] { + border-top: 1px solid var(--console-panel-border); + min-width: 0; + padding-top: 10.5px; +} +.network-chart-title[data-v-fe24aa37] { + color: var(--p-text-muted-color); + margin-bottom: 4px; + font-size: 0.875rem; +} +.network-chart-viewport[data-v-fe24aa37] { + min-width: 0; + min-height: 126px; +} +.network-chart-state[data-v-fe24aa37] { + min-height: 126px; + color: var(--p-text-muted-color); + place-items: center; + margin: 0; + font-size: 0.875rem; + display: grid; +} +.disk-row[data-v-fe24aa37] { + border: 1px solid var(--console-panel-border); + box-shadow: var(--console-panel-shadow); + border-radius: 6px; + align-items: center; + gap: 10px; + padding: 14px; + font-size: 1rem; + display: flex; +} +.disk-row i[data-v-fe24aa37] { + color: var(--p-text-muted-color, #94a3b8); +} +.disk-name[data-v-fe24aa37] { + text-overflow: ellipsis; + white-space: nowrap; + flex: 1; + overflow: hidden; +} +.doc-link[data-v-fe24aa37] { + color: var(--p-text-muted-color, #64748b); + padding: 2px 0; + font-size: 1rem; + text-decoration: none; +} +.doc-link[data-v-fe24aa37]:hover { + color: var(--p-primary-color, #10b981); +} +.row-2[data-v-fe24aa37] { + gap: 8px; + display: flex; +} +.flex-1[data-v-fe24aa37], +.row-2[data-v-fe24aa37] > * { + flex: 1; +} +.muted[data-v-fe24aa37] { + font-size: 1rem; +} +.hint[data-v-fe24aa37], +.muted[data-v-fe24aa37] { + color: var(--p-text-muted-color, #94a3b8); +} +.hint[data-v-fe24aa37] { + margin: 0; + font-size: 0.875rem; +} +@media (width<=1023px) { + .grid[data-v-fe24aa37] { + grid-template-columns: 1fr; + } +} diff --git a/app/assets/styles/InstanceRenewDialog.BHDAL6d3.css b/app/assets/styles/InstanceRenewDialog.BHDAL6d3.css new file mode 100644 index 0000000..d4925f8 --- /dev/null +++ b/app/assets/styles/InstanceRenewDialog.BHDAL6d3.css @@ -0,0 +1,81 @@ +.rd[data-v-01429388] { + flex-direction: column; + gap: 16px; +} +.rd[data-v-01429388], +.rd-row[data-v-01429388] { + display: flex; +} +.rd-row[data-v-01429388] { + align-items: center; + gap: 14px; + min-width: 0; +} +.rd-label[data-v-01429388], +.rd-row > label[data-v-01429388] { + width: 80px; + color: var(--p-text-muted-color, #64748b); + flex-shrink: 0; + font-size: 0.9375rem; +} +.rd-grow[data-v-01429388] { + flex: 1; + min-width: 0; +} +.rd-quote[data-v-01429388] { + border-top: 1px solid var(--p-content-border-color, #e2e8f0); + color: var(--p-text-muted-color, #64748b); + flex-direction: column; + gap: 8px; + padding-top: 14px; + font-size: 0.9375rem; + display: flex; +} +.rd-quote-row[data-v-01429388] { + justify-content: space-between; + align-items: baseline; + gap: 12px; + display: flex; +} +.rd-discount[data-v-01429388] { + color: #22c55e; +} +.rd-price[data-v-01429388] { + color: #ef4444; + font-size: 1.375rem; + font-weight: 600; +} +.rd-promo[data-v-01429388] { + align-items: center; + gap: 8px; + display: flex; +} +.rd-promo[data-v-01429388] > .p-button { + white-space: nowrap; + flex-shrink: 0; +} +.rd-code[data-v-01429388] { + overflow-wrap: anywhere; + background: var(--p-content-hover-background); + border-radius: 6px; + min-width: 0; + padding: 4px 10px; + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 0.9375rem; +} +.rd-hint[data-v-01429388] { + color: var(--p-text-muted-color, #94a3b8); + margin: 0; + font-size: 0.875rem; +} +@media (width<=480px) { + .rd-row[data-v-01429388] { + flex-direction: column; + align-items: stretch; + gap: 8px; + } + .rd-label[data-v-01429388], + .rd-row > label[data-v-01429388] { + width: auto; + } +} diff --git a/app/assets/styles/InstanceServiceInfo.BftSVIeW.css b/app/assets/styles/InstanceServiceInfo.BftSVIeW.css new file mode 100644 index 0000000..68a7036 --- /dev/null +++ b/app/assets/styles/InstanceServiceInfo.BftSVIeW.css @@ -0,0 +1,60 @@ +.service-info[data-v-0ff5d554] { + background: var(--console-panel-bg); + border: 1px solid var(--console-panel-border); + border-radius: 6px; + padding: 21px; +} +.service-heading[data-v-0ff5d554] { + align-items: center; + gap: 14px; + margin-bottom: 14px; + display: flex; +} +h3[data-v-0ff5d554] { + margin: 0; + font-size: 1rem; +} +.service-rows[data-v-0ff5d554] { + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 0 28px; + margin: 14px 0 0; + display: grid; +} +.service-rows > div[data-v-0ff5d554] { + border-bottom: 1px solid var(--console-panel-border); + gap: 14px; + padding: 10px 0; + display: flex; +} +dt[data-v-0ff5d554] { + color: var(--p-text-muted-color); + flex: 0 0 88px; +} +dd[data-v-0ff5d554] { + overflow-wrap: anywhere; + min-width: 0; + margin: 0; +} +.password-toggle[data-v-0ff5d554] { + color: var(--p-text-muted-color); + cursor: pointer; + background: 0 0; + border: 0; + margin-left: 7px; +} +.traffic-recovery[data-v-0ff5d554] { + flex-direction: column; + gap: 14px; + margin: 14px 0; + display: flex; +} +.traffic-recovery p[data-v-0ff5d554] { + color: var(--p-text-muted-color); + margin: 0; + line-height: 1.7; +} +@media (width<=767px) { + .service-rows[data-v-0ff5d554] { + grid-template-columns: 1fr; + } +} diff --git a/app/assets/styles/InstanceSmsCode.CsITfIEU.css b/app/assets/styles/InstanceSmsCode.CsITfIEU.css new file mode 100644 index 0000000..89febf4 --- /dev/null +++ b/app/assets/styles/InstanceSmsCode.CsITfIEU.css @@ -0,0 +1,12 @@ +.instance-code[data-v-741dd729] { + gap: 8px; + display: grid; +} +.code-row[data-v-741dd729] { + gap: 8px; + display: flex; +} +.code-row .p-inputtext[data-v-741dd729] { + flex: 1; + min-width: 0; +} diff --git a/app/assets/styles/InstanceTraffic.CyyEAXl3.css b/app/assets/styles/InstanceTraffic.CyyEAXl3.css new file mode 100644 index 0000000..0bb8218 --- /dev/null +++ b/app/assets/styles/InstanceTraffic.CyyEAXl3.css @@ -0,0 +1,93 @@ +.traffic-summary[data-v-484c7b21] { + flex-direction: column; + gap: 12px; + min-width: 0; + display: flex; +} +.traffic-row[data-v-484c7b21] { + justify-content: space-between; + align-items: baseline; + gap: 16px; + font-size: 1rem; + display: flex; +} +.traffic-note[data-v-484c7b21], +.traffic-row > span[data-v-484c7b21] { + color: var(--p-text-muted-color); +} +.traffic-row > span[data-v-484c7b21] { + flex-shrink: 0; +} +.traffic-row > b[data-v-484c7b21] { + overflow-wrap: anywhere; + text-align: right; + font-weight: 500; +} +.traffic-note[data-v-484c7b21] { + margin: 0; + font-size: 0.875rem; + line-height: 1.6; +} +.traffic-actions[data-v-484c7b21] { + justify-content: flex-end; + display: flex; +} +.traffic-error[data-v-484c7b21] { + align-items: flex-start; + gap: 8px; + display: flex; +} +.traffic-error[data-v-484c7b21] .p-message { + flex: 1; + min-width: 0; +} +.traffic-error[data-v-484c7b21] .p-button { + flex-shrink: 0; +} +.traffic-table[data-v-484c7b21] { + border: 1px solid var(--console-panel-border); + box-shadow: var(--console-panel-shadow); + background: var(--console-panel-bg); + border-radius: 6px; + gap: 0; + overflow: hidden; +} +.traffic-table[data-v-484c7b21] > * + * { + border-top: 1px solid var(--console-panel-border); +} +.traffic-table .traffic-row[data-v-484c7b21] { + grid-template-columns: 16.6667% minmax(0, 1fr); + align-items: center; + gap: 0; + min-height: 49px; + display: grid; +} +.traffic-table .traffic-row[data-v-484c7b21] > * { + overflow-wrap: anywhere; + min-width: 0; + padding: 14px; +} +.traffic-table .traffic-row[data-v-484c7b21]:nth-child(2n of .traffic-row) { + background: var(--console-page-bg); +} +.traffic-table .traffic-row > span[data-v-484c7b21] { + font-weight: 600; +} +.traffic-table .traffic-row > b[data-v-484c7b21] { + text-align: left; +} +.traffic-table .traffic-error[data-v-484c7b21], +.traffic-table .traffic-note[data-v-484c7b21], +.traffic-table .traffic-progress[data-v-484c7b21] { + overflow-wrap: anywhere; + min-width: 0; + padding: 14px; +} +.traffic-table .traffic-error[data-v-484c7b21] { + flex-wrap: wrap; +} +@media (width<=767px) { + .traffic-table .traffic-row[data-v-484c7b21] { + grid-template-columns: 100px minmax(0, 1fr); + } +} diff --git a/app/assets/styles/JyCloudConfig.kGfttaHi.css b/app/assets/styles/JyCloudConfig.kGfttaHi.css new file mode 100644 index 0000000..03edc5f --- /dev/null +++ b/app/assets/styles/JyCloudConfig.kGfttaHi.css @@ -0,0 +1,239 @@ +.storage-system[data-v-7837d303] { + width: calc(50% - 8px); +} +.storage-disks[data-v-7837d303] { + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 16px; + min-width: 0; + display: grid; +} +.grow[data-v-7837d303] { + flex: 1; + min-width: 0; +} +.jy-dcim-config .config-options[data-v-7837d303] { + gap: 30px; +} +.jy-dcim-config .config-options .section-title[data-v-7837d303] { + border-left: 3px solid var(--p-primary-color); + padding-left: 11px; + font-weight: 600; +} +.jy-config-row[data-v-7837d303] { + grid-template-columns: 76px minmax(0, 1fr); + align-items: start; + gap: 12px 14px; + min-width: 0; + margin-bottom: 23px; + display: grid; +} +.jy-config-row[data-v-7837d303]:last-child { + margin-bottom: 0; +} +.jy-config-row > label[data-v-7837d303], +.jy-config-row > span[data-v-7837d303] { + color: var(--p-text-muted-color); + text-align: left; + padding-top: 7px; + font-size: 0.9375rem; + line-height: 1.5rem; +} +.jy-config-row > .config-choices[data-v-7837d303], +.jy-config-row > .jy-defense-options[data-v-7837d303], +.jy-config-row > .jy-model-filters[data-v-7837d303], +.jy-config-row > .jy-resource-control[data-v-7837d303] { + min-width: 0; +} +.jy-model-filters[data-v-7837d303] { + grid-template-columns: repeat(2, minmax(0, 240px)); + gap: 14px; + max-width: 560px; + display: grid; +} +.jy-model-filters[data-v-7837d303] .p-select { + width: 100%; + min-width: 0; +} +.jy-model-table-wrap[data-v-7837d303] { + border: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + border-radius: 4px; + width: 100%; + overflow-x: auto; +} +.jy-model-table[data-v-7837d303] { + border-collapse: collapse; + text-align: left; + width: 100%; + min-width: 660px; +} +.jy-model-table td[data-v-7837d303], +.jy-model-table th[data-v-7837d303] { + border-bottom: 1px solid var(--p-content-border-color); + color: var(--p-text-color); + vertical-align: middle; + padding: 11px 14px; + font-size: 0.875rem; + line-height: 1.5; +} +.jy-model-table th[data-v-7837d303] { + background: var(--p-content-hover-background); + white-space: nowrap; + font-weight: 600; +} +.jy-model-table td[data-v-7837d303]:first-child, +.jy-model-table th[data-v-7837d303]:first-child { + text-align: center; + width: 54px; +} +.jy-model-table tbody tr[data-v-7837d303] { + cursor: pointer; +} +.jy-model-table tbody tr[data-v-7837d303]:hover { + background: var(--p-content-hover-background); +} +.jy-model-table tbody tr.selected[data-v-7837d303] { + background: var(--p-highlight-background); +} +.jy-model-table tbody tr:last-child td[data-v-7837d303] { + border-bottom: 0; +} +.jy-model-table td input[type="radio"][data-v-7837d303] { + width: 16px; + height: 16px; + accent-color: var(--p-primary-color); + cursor: pointer; + margin: 0; +} +.jy-model-table td input[type="radio"][data-v-7837d303]:focus-visible { + outline: 2px solid var(--p-primary-color); + outline-offset: 3px; +} +.jy-model-name[data-v-7837d303] { + min-width: 245px; + font-weight: 500; +} +.jy-model-table .jy-no-model[data-v-7837d303] { + color: var(--p-text-muted-color); + text-align: center; + padding: 24px; +} +.jy-resource-control[data-v-7837d303] { + grid-template-columns: minmax(0, 1fr) 130px; + align-items: center; + gap: 5px 18px; + width: 100%; + max-width: 720px; + display: grid; +} +.jy-resource-control[data-v-7837d303] .p-inputnumber { + grid-area: 1/2; + width: 100%; + max-width: none; +} +.jy-resource-control[data-v-7837d303] .p-inputnumber-input { + width: 100%; +} +.jy-resource-slider[data-v-7837d303] { + width: 100%; + height: 4px; + accent-color: var(--p-primary-color); + grid-area: 1/1; + margin: 0; +} +.jy-resource-slider[data-v-7837d303]:focus-visible { + outline: 2px solid var(--p-primary-color); + outline-offset: 5px; +} +.jy-resource-control > small[data-v-7837d303] { + color: var(--p-text-muted-color); + grid-area: 2/1; + font-size: 0.8125rem; +} +.jy-config-row[data-v-7837d303] .bandwidth-field { + max-width: 720px; +} +.jy-config-row[data-v-7837d303] .bandwidth-label { + display: none; +} +.jy-defense-options[data-v-7837d303] { + flex-wrap: wrap; + gap: 0; + display: flex; +} +.jy-defense-options button[data-v-7837d303] { + border: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + min-height: 36px; + color: var(--p-text-color); + font: inherit; + cursor: pointer; + margin: 0 -1px -1px 0; + padding: 6px 16px; +} +.jy-defense-options button[data-v-7837d303]:first-child { + border-radius: 4px 0 0 4px; +} +.jy-defense-options button[data-v-7837d303]:last-child { + border-radius: 0 4px 4px 0; +} +.jy-defense-options button[data-v-7837d303]:only-child { + border-radius: 4px; +} +.jy-defense-options button.active[data-v-7837d303] { + z-index: 1; + border-color: var(--p-primary-color); + background: var(--p-highlight-background); + color: var(--p-highlight-color); + position: relative; +} +.jy-defense-options button[data-v-7837d303]:focus-visible { + z-index: 2; + outline: 2px solid var(--p-primary-color); + outline-offset: 2px; + position: relative; +} +.jy-defense-options button[data-v-7837d303]:disabled { + cursor: not-allowed; + opacity: 0.6; +} +.jy-dcim-config .image-groups[data-v-7837d303] { + max-width: 960px; +} +@media (width<=767px) { + .jy-config-row[data-v-7837d303] { + grid-template-columns: 1fr; + gap: 8px; + margin-bottom: 20px; + } + .jy-config-row > label[data-v-7837d303], + .jy-config-row > span[data-v-7837d303] { + text-align: left; + padding-top: 0; + } + .jy-model-filters[data-v-7837d303] { + grid-template-columns: repeat(2, minmax(0, 1fr)); + max-width: none; + } + .jy-resource-control[data-v-7837d303] { + grid-template-columns: minmax(0, 1fr) 112px; + gap: 5px 12px; + } +} +@media (width<=639px) { + .storage-system[data-v-7837d303] { + width: 100%; + } + .storage-disks[data-v-7837d303] { + grid-template-columns: minmax(0, 1fr); + } + .jy-dcim-config .config-options[data-v-7837d303] { + gap: 24px; + } + .jy-config-row[data-v-7837d303] .config-choices.compact { + flex-wrap: wrap; + } + .jy-config-row[data-v-7837d303] .config-choices.compact .config-choice { + min-width: 88px; + } +} diff --git a/app/assets/styles/KkyEcsConfig.BFaAwQPZ.css b/app/assets/styles/KkyEcsConfig.BFaAwQPZ.css new file mode 100644 index 0000000..1d89a12 --- /dev/null +++ b/app/assets/styles/KkyEcsConfig.BFaAwQPZ.css @@ -0,0 +1,43 @@ +.cycle-warn[data-v-e8ce6418] { + flex-shrink: 0; +} +.hint[data-v-e8ce6418] { + color: var(--p-text-muted-color); + font-size: 0.875rem; +} +.storage-system[data-v-e8ce6418] { + width: calc(50% - 8px); +} +.storage-disks[data-v-e8ce6418] { + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 16px; + min-width: 0; + display: grid; +} +.traffic-package-value[data-v-e8ce6418] { + border: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + width: 196px; + min-height: 44px; + color: var(--p-text-color); + border-radius: 6px; + align-items: center; + padding: 8px 14px; + display: flex; +} +.traffic-package-value strong[data-v-e8ce6418] { + font-size: 1rem; + font-weight: 500; +} +@media (width<=639px) { + .storage-system[data-v-e8ce6418] { + width: 100%; + } + .storage-disks[data-v-e8ce6418] { + grid-template-columns: minmax(0, 1fr); + } + .traffic-package-value[data-v-e8ce6418] { + width: 100%; + max-width: 470px; + } +} diff --git a/app/assets/styles/KkyUpgrade.CkDmxFBM.css b/app/assets/styles/KkyUpgrade.CkDmxFBM.css new file mode 100644 index 0000000..9ec32e0 --- /dev/null +++ b/app/assets/styles/KkyUpgrade.CkDmxFBM.css @@ -0,0 +1,229 @@ +.up[data-v-625e699a] { + flex-direction: column; + gap: 14px; + display: flex; +} +.current[data-v-625e699a] { + background: var(--p-content-hover-background); + border-radius: 8px; + align-items: center; + gap: 10px; + padding: 10px 14px; + font-size: 0.9375rem; + display: flex; +} +.current-label[data-v-625e699a] { + color: var(--p-text-muted-color, #64748b); +} +.current-spec[data-v-625e699a] { + font-weight: 500; +} +.seg[data-v-625e699a] { + flex-wrap: wrap; + gap: 6px; + display: flex; +} +.seg-item[data-v-625e699a] { + border: 1px solid var(--p-content-border-color, #e2e8f0); + background: var(--p-content-background); + color: var(--p-text-muted-color, #64748b); + cursor: pointer; + border-radius: 8px; + align-items: center; + gap: 6px; + padding: 7px 14px; + font-size: 0.9375rem; + transition: + border-color 0.15s, + color 0.15s, + background 0.15s; + display: inline-flex; +} +.seg-item[data-v-625e699a]:hover { + color: var(--p-text-color); +} +.seg-item.active[data-v-625e699a], +.seg-item[data-v-625e699a]:hover { + border-color: var(--p-primary-color, #0052d9); +} +.seg-item.active[data-v-625e699a] { + background: var(--p-highlight-background); + color: var(--p-primary-color, #0052d9); + font-weight: 500; +} +.sk[data-v-625e699a] { + padding: 4px 0; +} +.plans[data-v-625e699a] { + grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); + gap: 12px; + display: grid; +} +.plan[data-v-625e699a] { + text-align: left; + background: var(--p-content-background); + border: 1px solid var(--p-content-border-color, #e2e8f0); + cursor: pointer; + border-radius: 10px; + flex-direction: column; + gap: 8px; + padding: 14px 16px; + transition: + border-color 0.15s, + background 0.15s; + display: flex; +} +.plan.active[data-v-625e699a], +.plan[data-v-625e699a]:hover:not(:disabled) { + border-color: var(--p-primary-color, #0052d9); +} +.plan.active[data-v-625e699a] { + background: var(--p-highlight-background); +} +.plan[data-v-625e699a]:disabled { + opacity: 0.55; + cursor: not-allowed; +} +.plan-head[data-v-625e699a] { + justify-content: space-between; + align-items: center; + gap: 8px; + display: flex; +} +.plan-name[data-v-625e699a] { + font-size: 1rem; + font-weight: 600; +} +.plan-check[data-v-625e699a] { + color: var(--p-primary-color, #0052d9); +} +.plan-desc[data-v-625e699a] { + color: var(--p-text-muted-color, #64748b); + font-size: 0.875rem; + line-height: 1.6; +} +.field[data-v-625e699a] { + align-items: center; + gap: 12px; +} +.field[data-v-625e699a], +.field-row[data-v-625e699a] { + flex-wrap: wrap; + display: flex; +} +.field-row[data-v-625e699a] { + gap: 28px; +} +.field > label[data-v-625e699a] { + color: var(--p-text-muted-color, #64748b); + font-size: 0.9375rem; +} +.field-hint[data-v-625e699a], +.note[data-v-625e699a] { + color: var(--p-text-muted-color, #94a3b8); + font-size: 0.875rem; +} +.note[data-v-625e699a] { + margin: 0; + line-height: 1.7; +} +.sub[data-v-625e699a] { + background: var(--p-content-hover-background); + border-radius: 8px; + align-self: flex-start; + gap: 4px; + padding: 3px; + display: inline-flex; +} +.sub-item[data-v-625e699a] { + color: var(--p-text-muted-color, #64748b); + cursor: pointer; + background: 0 0; + border: 0; + border-radius: 6px; + padding: 5px 14px; + font-size: 0.9375rem; +} +.sub-item.active[data-v-625e699a] { + background: var(--p-content-background); + color: var(--p-text-color); + font-weight: 500; +} +.disks[data-v-625e699a] { + grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); + gap: 10px; + display: grid; +} +.disk[data-v-625e699a] { + text-align: left; + background: var(--p-content-background); + border: 1px solid var(--p-content-border-color, #e2e8f0); + cursor: pointer; + border-radius: 10px; + align-items: center; + gap: 8px; + padding: 12px 14px; + font-size: 0.9375rem; + transition: + border-color 0.15s, + background 0.15s; + display: flex; +} +.disk.active[data-v-625e699a], +.disk[data-v-625e699a]:hover { + border-color: var(--p-primary-color, #0052d9); +} +.disk.active[data-v-625e699a] { + background: var(--p-highlight-background); +} +.disk i[data-v-625e699a] { + color: var(--p-text-muted-color, #94a3b8); +} +.disk-name[data-v-625e699a] { + flex: 1; + font-weight: 500; +} +.disk-meta[data-v-625e699a] { + color: var(--p-text-muted-color, #94a3b8); + font-size: 0.875rem; +} +.bar[data-v-625e699a] { + border-top: 1px solid var(--p-content-border-color, #e2e8f0); + justify-content: space-between; + align-items: center; + gap: 16px; + padding-top: 16px; + display: flex; +} +.bar-price[data-v-625e699a] { + flex-wrap: wrap; + align-items: baseline; + gap: 10px; + display: flex; +} +.bar-label[data-v-625e699a] { + color: var(--p-text-muted-color, #64748b); + font-size: 0.9375rem; +} +.bar-value[data-v-625e699a] { + color: #ef4444; + font-size: 1.5rem; + font-weight: 600; +} +.bar-sub[data-v-625e699a] { + color: var(--p-text-muted-color, #94a3b8); + font-size: 0.875rem; +} +.changes[data-v-625e699a] { + color: var(--p-text-muted-color, #64748b); + padding-left: 18px; + line-height: 1.8; +} +.changes[data-v-625e699a], +.hint[data-v-625e699a] { + margin: 0; + font-size: 0.875rem; +} +.hint[data-v-625e699a] { + color: var(--p-text-muted-color, #94a3b8); +} diff --git a/app/assets/styles/LegacyDcimActions.DcIrQby6.css b/app/assets/styles/LegacyDcimActions.DcIrQby6.css new file mode 100644 index 0000000..d74abeb --- /dev/null +++ b/app/assets/styles/LegacyDcimActions.DcIrQby6.css @@ -0,0 +1,34 @@ +.legacy-actions[data-v-e3236d5c] { + flex-direction: column; + gap: 14px; + display: flex; +} +.action-buttons[data-v-e3236d5c] { + flex-wrap: wrap; + gap: 10px; + display: flex; +} +.action-form[data-v-e3236d5c] { + flex-direction: column; + gap: 10px; + display: flex; +} +.target[data-v-e3236d5c] { + overflow-wrap: anywhere; + margin: 0 0 4px; +} +.ack[data-v-e3236d5c] { + align-items: flex-start; + gap: 10px; + margin-top: 7px; + display: flex; +} +.ack label[data-v-e3236d5c] { + line-height: 1.5; +} +.muted[data-v-e3236d5c] { + color: var(--p-text-muted-color); + margin: 0; + font-size: 0.875rem; + line-height: 1.6; +} diff --git a/app/assets/styles/LegacyDcimManage.5YRq508t.css b/app/assets/styles/LegacyDcimManage.5YRq508t.css new file mode 100644 index 0000000..d153431 --- /dev/null +++ b/app/assets/styles/LegacyDcimManage.5YRq508t.css @@ -0,0 +1,236 @@ +.legacy-dcim-manage[data-v-f40d7201] { + min-width: 0; +} +.legacy-dcim-manage[data-v-f40d7201] .p-tabpanels { + padding: 21px 0 0; +} +.legacy-dcim-manage[data-v-f40d7201] .p-tab { + white-space: nowrap; + padding: 14px 21px; +} +.overview[data-v-f40d7201] { + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 21px; + display: grid; +} +.stack[data-v-f40d7201] { + flex-direction: column; + gap: 21px; + min-width: 0; + display: flex; +} +.card[data-v-f40d7201] { + background: var(--console-panel-bg); + border: 1px solid var(--console-panel-border); + box-shadow: var(--console-panel-shadow); + border-radius: 6px; + min-width: 0; + padding: 21px; +} +.card h3[data-v-f40d7201] { + margin: 0 0 21px; + font-size: 1.125rem; +} +.card-title[data-v-f40d7201] { + width: 100%; + color: inherit; + font: inherit; + cursor: pointer; + background: 0 0; + border: 0; + justify-content: space-between; + align-items: center; + gap: 10px; + padding: 0; + display: flex; +} +.card-title i[data-v-f40d7201] { + color: var(--p-text-muted-color); + font-size: 0.875rem; +} +.card-bottom[data-v-f40d7201] { + width: 100%; + margin-top: 21px; +} +.muted[data-v-f40d7201] { + color: var(--p-text-muted-color); + font-size: 0.9375rem; + line-height: 1.6; +} +.compact-rows[data-v-f40d7201] { + margin: 0; +} +.compact-rows > div[data-v-f40d7201] { + justify-content: space-between; + align-items: center; + gap: 14px; + min-height: 33px; + display: flex; +} +.compact-rows dt[data-v-f40d7201] { + color: var(--p-text-muted-color); + flex-shrink: 0; +} +.compact-rows dd[data-v-f40d7201] { + overflow-wrap: anywhere; + text-align: right; + justify-content: flex-end; + align-items: center; + gap: 4px; + min-width: 0; + margin: 0; + display: flex; +} +.compact-rows[data-v-f40d7201] .p-button { + padding: 3px; +} +.resource-list[data-v-f40d7201] { + flex-direction: column; + gap: 14px; + margin: 0; + display: flex; +} +.resource-list > div[data-v-f40d7201] { + border: 1px solid var(--console-panel-border); + border-radius: 6px; + justify-content: space-between; + align-items: center; + gap: 14px; + min-height: 50px; + padding: 14px; + display: flex; +} +.resource-list dt[data-v-f40d7201] { + color: var(--p-text-muted-color); + flex-shrink: 0; +} +.resource-list dd[data-v-f40d7201] { + overflow-wrap: anywhere; + text-align: right; + margin: 0; + font-weight: 600; + line-height: 1.5; +} +.os[data-v-f40d7201] { + flex-direction: column; + align-items: center; + gap: 14px; + margin: 21px 0; + display: flex; +} +.os strong[data-v-f40d7201] { + font-weight: 400; +} +.flow-used[data-v-f40d7201] { + margin: 14px 0; + font-size: 0.9375rem; +} +.detail-content[data-v-f40d7201] { + flex-direction: column; + gap: 14px; + min-width: 0; + display: flex; +} +.detail-content h3[data-v-f40d7201] { + margin: 0; + font-size: 1.125rem; +} +.detail-content .section-gap[data-v-f40d7201] { + margin-top: 14px; +} +.rows[data-v-f40d7201] { + background: var(--console-panel-bg); + border: 1px solid var(--console-panel-border); + box-shadow: var(--console-panel-shadow); + border-radius: 6px; + margin: 0; + overflow: hidden; +} +.rows > div[data-v-f40d7201] { + grid-template-columns: 16.666% minmax(0, 1fr); + align-items: center; + gap: 14px; + min-height: 50px; + padding: 14px; + display: grid; +} +.rows > div + div[data-v-f40d7201] { + border-top: 1px solid var(--console-panel-border); +} +.rows > div[data-v-f40d7201]:nth-child(2n) { + background: var(--console-page-bg); +} +.rows dt[data-v-f40d7201] { + color: var(--p-text-muted-color); + font-weight: 600; +} +.rows dd[data-v-f40d7201] { + overflow-wrap: anywhere; + flex-wrap: wrap; + align-items: center; + gap: 10px; + margin: 0; + display: flex; +} +.rows[data-v-f40d7201] .p-button { + padding: 3px; +} +.rows .ip-list[data-v-f40d7201] { + flex-direction: column; + align-items: flex-start; + gap: 7px; +} +.ip-list > span[data-v-f40d7201] { + align-items: center; + gap: 7px; + display: flex; +} +.usage[data-v-f40d7201] .p-progressbar { + flex: 1; + min-width: 100px; +} +.mono[data-v-f40d7201] { + font-family: var(--font-mono, monospace); +} +@media (width<=1199px) { + .overview[data-v-f40d7201], + .stack[data-v-f40d7201] { + gap: 14px; + } + .card[data-v-f40d7201] { + padding: 14px; + } + .resource-list > div[data-v-f40d7201] { + padding: 10px; + } +} +@media (width<=950px) { + .overview[data-v-f40d7201] { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + .stack[data-v-f40d7201]:last-child { + grid-column: 1/-1; + grid-template-columns: 1fr 1fr; + display: grid; + } +} +@media (width<=600px) { + .overview[data-v-f40d7201] { + grid-template-columns: 1fr; + } + .stack[data-v-f40d7201]:last-child { + grid-column: auto; + display: flex; + } + .rows > div[data-v-f40d7201] { + grid-template-columns: 95px minmax(0, 1fr); + gap: 10px; + padding: 12px 10px; + } + .legacy-dcim-manage[data-v-f40d7201] .p-tabpanels { + padding-top: 14px; + } + .legacy-dcim-manage[data-v-f40d7201] .p-tab { + padding: 12px 10px; + } +} diff --git a/app/assets/styles/LegacyProductUpgrade.dzWGwGgY.css b/app/assets/styles/LegacyProductUpgrade.dzWGwGgY.css new file mode 100644 index 0000000..2d634d0 --- /dev/null +++ b/app/assets/styles/LegacyProductUpgrade.dzWGwGgY.css @@ -0,0 +1,8 @@ +.product-upgrade[data-v-3bd25322] { + gap: 12px; + display: grid; +} +.product-upgrade h4[data-v-3bd25322], +.product-upgrade p[data-v-3bd25322] { + margin: 0; +} diff --git a/app/assets/styles/MfCloudBackupPanel.BTlEe-fy.css b/app/assets/styles/MfCloudBackupPanel.BTlEe-fy.css new file mode 100644 index 0000000..b4b9cb6 --- /dev/null +++ b/app/assets/styles/MfCloudBackupPanel.BTlEe-fy.css @@ -0,0 +1,117 @@ +.info-table[data-v-a7ffe460] { + border: 1px solid var(--console-panel-border); + box-shadow: var(--console-panel-shadow); + background: var(--console-panel-bg); + border-radius: 6px; + overflow: hidden; +} +.info-table[data-v-a7ffe460] .p-datatable-thead > tr > th { + background: var(--console-page-bg); + color: var(--p-text-muted-color); + border-color: var(--console-panel-border); + padding: 14px; + font-size: 1rem; + font-weight: 600; +} +.info-table[data-v-a7ffe460] .p-datatable-tbody > tr { + background: var(--console-panel-bg); +} +.info-table[data-v-a7ffe460] .p-datatable-tbody > tr:nth-child(2n) { + background: var(--console-page-bg); +} +.info-table[data-v-a7ffe460] .p-datatable-tbody > tr > td { + border-color: var(--console-panel-border); + padding: 14px; + font-size: 1rem; +} +.info-table[data-v-a7ffe460] .p-datatable-tbody > tr:last-child > td { + border-bottom-width: 0; +} +.bs-head[data-v-a7ffe460] { + justify-content: space-between; + align-items: center; + margin-bottom: 14px; + display: flex; +} +.bs-guide[data-v-a7ffe460] { + border: 1px dashed var(--p-content-border-color, #e2e8f0); + border-radius: 10px; + flex-direction: column; + align-items: flex-start; + gap: 10px; + padding: 20px 22px; + display: flex; +} +.bs-guide-title[data-v-a7ffe460] { + margin: 0; + font-size: 1.0625rem; + font-weight: 600; +} +.bs-guide-desc[data-v-a7ffe460], +.guide-text[data-v-a7ffe460] { + color: var(--p-text-muted-color, #94a3b8); + margin: 0; + font-size: 0.875rem; + line-height: 1.7; +} +.quote[data-v-a7ffe460] { + border-top: 1px solid var(--p-content-border-color, #e2e8f0); + color: var(--p-text-muted-color, #64748b); + justify-content: space-between; + align-items: center; + padding-top: 14px; + font-size: 0.9375rem; + display: flex; +} +.quote-value[data-v-a7ffe460] { + color: #ef4444; + font-size: 1.25rem; + font-weight: 600; +} +.bs-title[data-v-a7ffe460] { + font-size: 1rem; + font-weight: 600; +} +.bs-count[data-v-a7ffe460] { + font-weight: 400; +} +.bs-count[data-v-a7ffe460], +.bs-empty[data-v-a7ffe460] { + color: var(--p-text-muted-color, #94a3b8); +} +.bs-empty[data-v-a7ffe460] { + text-align: center; + padding: 24px 0; + font-size: 0.9375rem; +} +.bs-actions[data-v-a7ffe460] { + gap: 4px; + display: flex; +} +.dlg-body[data-v-a7ffe460] { + flex-direction: column; +} +.dlg-body[data-v-a7ffe460], +.form-row[data-v-a7ffe460] { + gap: 14px; + display: flex; +} +.form-row[data-v-a7ffe460] { + align-items: center; +} +.form-label[data-v-a7ffe460], +.form-row > label[data-v-a7ffe460] { + width: 80px; + color: var(--p-text-muted-color, #64748b); + flex-shrink: 0; + font-size: 0.9375rem; +} +.grow[data-v-a7ffe460] { + flex: 1; +} +.confirm-text[data-v-a7ffe460] { + color: var(--p-text-color, #334155); + margin: 0; + font-size: 1rem; + line-height: 1.7; +} diff --git a/app/assets/styles/MfCloudConfig.DbgUu8qr.css b/app/assets/styles/MfCloudConfig.DbgUu8qr.css new file mode 100644 index 0000000..beb8501 --- /dev/null +++ b/app/assets/styles/MfCloudConfig.DbgUu8qr.css @@ -0,0 +1,30 @@ +.cycle-warn[data-v-8ba1c9ae] { + flex-shrink: 0; +} +.hint[data-v-8ba1c9ae] { + color: var(--p-text-muted-color); + font-size: 0.875rem; +} +.storage-system[data-v-8ba1c9ae] { + width: calc(50% - 8px); +} +.storage-disks[data-v-8ba1c9ae] { + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 16px; + min-width: 0; + display: grid; +} +.storage-hint[data-v-8ba1c9ae] { + color: var(--p-text-muted-color); + margin: 10px 0 0; + font-size: 0.875rem; + line-height: 1.429rem; +} +@media (width<=639px) { + .storage-system[data-v-8ba1c9ae] { + width: 100%; + } + .storage-disks[data-v-8ba1c9ae] { + grid-template-columns: minmax(0, 1fr); + } +} diff --git a/app/assets/styles/MfCloudDefence.B2vl5Yip.css b/app/assets/styles/MfCloudDefence.B2vl5Yip.css new file mode 100644 index 0000000..de02e56 --- /dev/null +++ b/app/assets/styles/MfCloudDefence.B2vl5Yip.css @@ -0,0 +1,19 @@ +.defence[data-v-b0c2bd86], +.form[data-v-b0c2bd86] { + flex-direction: column; + gap: 12px; + display: flex; +} +.defence-ip[data-v-b0c2bd86] { + width: 210px; + max-width: 100%; +} +.muted[data-v-b0c2bd86] { + color: var(--p-text-muted-color); + font-size: 1rem; + line-height: 1.7; +} +.muted[data-v-b0c2bd86], +p[data-v-b0c2bd86] { + margin: 0; +} diff --git a/app/assets/styles/MfCloudIps.jhFnuvcs.css b/app/assets/styles/MfCloudIps.jhFnuvcs.css new file mode 100644 index 0000000..243d7d6 --- /dev/null +++ b/app/assets/styles/MfCloudIps.jhFnuvcs.css @@ -0,0 +1,65 @@ +.ips[data-v-9ba8a1b3], +.ipv6-group[data-v-9ba8a1b3] { + flex-direction: column; + gap: 14px; + min-width: 0; + display: flex; +} +.ips[data-v-9ba8a1b3] .ipv4-table .p-datatable-table { + table-layout: fixed; + min-width: 480px; +} +.ips[data-v-9ba8a1b3] .ipv6-table .p-datatable-table { + table-layout: fixed; + min-width: 0; +} +.ips[data-v-9ba8a1b3] .col-mono { + overflow-wrap: anywhere; +} +.ips-title[data-v-9ba8a1b3] { + font-size: 1rem; + font-weight: 600; +} +.count[data-v-9ba8a1b3] { + font-weight: 400; +} +.count[data-v-9ba8a1b3], +.empty[data-v-9ba8a1b3] { + color: var(--p-text-muted-color, #94a3b8); +} +.empty[data-v-9ba8a1b3] { + text-align: center; + padding: 24px 0; + font-size: 0.9375rem; +} +.dlg[data-v-9ba8a1b3] { + flex-direction: column; + gap: 16px; + display: flex; +} +.form-row[data-v-9ba8a1b3] { + align-items: center; + gap: 14px; + display: flex; +} +.form-row > label[data-v-9ba8a1b3] { + flex-shrink: 0; + width: 90px; +} +.form-row > label[data-v-9ba8a1b3], +.quote[data-v-9ba8a1b3] { + color: var(--p-text-muted-color, #64748b); + font-size: 0.9375rem; +} +.quote[data-v-9ba8a1b3] { + border-top: 1px solid var(--p-content-border-color, #e2e8f0); + justify-content: space-between; + align-items: center; + padding-top: 14px; + display: flex; +} +.quote-value[data-v-9ba8a1b3] { + color: #ef4444; + font-size: 1.25rem; + font-weight: 600; +} diff --git a/app/assets/styles/MfCloudLogs.MTqtLGjA.css b/app/assets/styles/MfCloudLogs.MTqtLGjA.css new file mode 100644 index 0000000..90645ee --- /dev/null +++ b/app/assets/styles/MfCloudLogs.MTqtLGjA.css @@ -0,0 +1,63 @@ +.logs[data-v-c4521240] { + flex-direction: column; + gap: 18px; + min-width: 0; + display: flex; +} +.logs-heading[data-v-c4521240] { + justify-content: space-between; + align-items: center; + gap: 16px; + display: flex; +} +.logs-heading h4[data-v-c4521240] { + margin: 0 0 6px; + font-size: 1.125rem; + font-weight: 600; +} +.logs-heading p[data-v-c4521240] { + color: var(--p-text-muted-color); + margin: 0; + font-size: 0.9375rem; +} +.logs-toolbar[data-v-c4521240] { + flex-wrap: wrap; + gap: 8px; + display: flex; +} +.logs-toolbar .p-inputtext[data-v-c4521240] { + width: 280px; +} +.logs-table[data-v-c4521240] { + border: 1px solid var(--console-panel-border); + border-radius: 6px; + overflow: hidden; +} +.log-content[data-v-c4521240] { + white-space: pre-wrap; + overflow-wrap: anywhere; + line-height: 1.7; +} +.log-time[data-v-c4521240] { + white-space: nowrap; +} +.logs-foot[data-v-c4521240] { + color: var(--p-text-muted-color); + justify-content: flex-end; + align-items: center; + gap: 12px; + font-size: 0.9375rem; + display: flex; +} +@media (width<=640px) { + .logs-toolbar > .p-iconfield[data-v-c4521240] { + flex: 1; + min-width: 180px; + } + .logs-toolbar .p-inputtext[data-v-c4521240] { + width: 100%; + } + .logs-heading[data-v-c4521240] { + align-items: flex-start; + } +} diff --git a/app/assets/styles/MfCloudNat.C1uXa4fX.css b/app/assets/styles/MfCloudNat.C1uXa4fX.css new file mode 100644 index 0000000..1861a84 --- /dev/null +++ b/app/assets/styles/MfCloudNat.C1uXa4fX.css @@ -0,0 +1,15 @@ +.form[data-v-1ff078ab], +.nat-panel[data-v-1ff078ab] { + flex-direction: column; + gap: 12px; + display: flex; +} +.muted[data-v-1ff078ab] { + color: var(--p-text-muted-color); + margin: 0; + font-size: 1rem; + line-height: 1.7; +} +.form label[data-v-1ff078ab] { + font-size: 13px; +} diff --git a/app/assets/styles/MfCloudResourceUpgrade.bSwLWjPg.css b/app/assets/styles/MfCloudResourceUpgrade.bSwLWjPg.css new file mode 100644 index 0000000..c2054b8 --- /dev/null +++ b/app/assets/styles/MfCloudResourceUpgrade.bSwLWjPg.css @@ -0,0 +1,57 @@ +.resource-upgrade[data-v-c9212028] { + gap: 24px; +} +.config-field[data-v-c9212028], +.resource-upgrade[data-v-c9212028] { + flex-direction: column; + display: flex; +} +.config-field[data-v-c9212028] { + gap: 10px; + font-size: 1rem; +} +.choices[data-v-c9212028] { + border: 1px solid var(--p-content-border-color); + border-radius: 6px; + grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); + gap: 0; + display: grid; + overflow: hidden; +} +.choices button[data-v-c9212028] { + border: 1px solid #0000; + border-right-color: var(--p-content-border-color); + min-height: 38px; + color: var(--p-text-color); + background: var(--p-content-background); + cursor: pointer; + padding: 8px 12px; +} +.choices button.selected[data-v-c9212028] { + border-color: var(--p-primary-color); + color: var(--p-primary-color); + background: var(--p-highlight-background); + box-shadow: inset 0 0 0 1px var(--p-primary-color); +} +.upgrade-total[data-v-c9212028] { + justify-content: space-between; + align-items: center; + gap: 16px; + font-size: 1rem; + display: flex; +} +.upgrade-total b[data-v-c9212028] { + color: var(--p-primary-color); + font-weight: 600; +} +.muted[data-v-c9212028] { + color: var(--p-text-muted-color); + margin: 0; + font-size: 0.875rem; +} +@media (width<=640px) { + .upgrade-total[data-v-c9212028] { + flex-direction: column; + align-items: stretch; + } +} diff --git a/app/assets/styles/MfCloudUpgrade.N7TNG8F1.css b/app/assets/styles/MfCloudUpgrade.N7TNG8F1.css new file mode 100644 index 0000000..2585df2 --- /dev/null +++ b/app/assets/styles/MfCloudUpgrade.N7TNG8F1.css @@ -0,0 +1,109 @@ +.up[data-v-b98b2e63] { + flex-direction: column; + gap: 14px; + display: flex; +} +.current[data-v-b98b2e63] { + background: var(--p-content-hover-background); + border-radius: 8px; + align-items: center; + gap: 10px; + padding: 10px 14px; + font-size: 0.9375rem; + display: flex; +} +.current-label[data-v-b98b2e63] { + color: var(--p-text-muted-color, #64748b); +} +.current-spec[data-v-b98b2e63] { + font-weight: 500; +} +.grid[data-v-b98b2e63] { + grid-template-columns: repeat(auto-fit, minmax(min(100%, 240px), 1fr)); + gap: 12px; + display: grid; +} +.plan[data-v-b98b2e63] { + text-align: left; + background: var(--p-content-background); + border: 1px solid var(--p-content-border-color, #e2e8f0); + cursor: pointer; + border-radius: 10px; + flex-direction: column; + gap: 8px; + padding: 14px 16px; + transition: + border-color 0.15s, + background 0.15s; + display: flex; +} +.plan.active[data-v-b98b2e63], +.plan[data-v-b98b2e63]:hover { + border-color: var(--p-primary-color, #10b981); +} +.plan.active[data-v-b98b2e63] { + background: var(--p-highlight-background); +} +.plan-head[data-v-b98b2e63] { + justify-content: space-between; + align-items: center; + gap: 8px; + display: flex; +} +.plan-name[data-v-b98b2e63] { + font-size: 1rem; + font-weight: 600; +} +.plan-check[data-v-b98b2e63] { + color: var(--p-primary-color, #10b981); +} +.plan-desc[data-v-b98b2e63], +.plan-spec[data-v-b98b2e63] { + color: var(--p-text-muted-color, #64748b); + font-size: 0.875rem; + line-height: 1.6; +} +.bar[data-v-b98b2e63] { + border-top: 1px solid var(--p-content-border-color, #e2e8f0); + justify-content: space-between; + align-items: center; + gap: 16px; + padding-top: 16px; + display: flex; +} +.bar-price[data-v-b98b2e63] { + flex-wrap: wrap; + align-items: baseline; + gap: 10px; + display: flex; +} +.bar-label[data-v-b98b2e63] { + color: var(--p-text-muted-color, #64748b); + font-size: 0.9375rem; +} +.bar-value[data-v-b98b2e63] { + color: #ef4444; + font-size: 1.5rem; + font-weight: 600; +} +.bar-sub[data-v-b98b2e63], +.hint[data-v-b98b2e63] { + color: var(--p-text-muted-color, #94a3b8); + font-size: 0.875rem; +} +.hint[data-v-b98b2e63] { + margin: 0; +} +@media (width<=640px) { + .bar[data-v-b98b2e63], + .current[data-v-b98b2e63] { + flex-direction: column; + align-items: flex-start; + } + .bar > .p-button[data-v-b98b2e63] { + width: 100%; + } + .plan[data-v-b98b2e63] { + padding: 14px; + } +} diff --git a/app/assets/styles/MfCloudVpc.CpOEbuWs.css b/app/assets/styles/MfCloudVpc.CpOEbuWs.css new file mode 100644 index 0000000..1a7a450 --- /dev/null +++ b/app/assets/styles/MfCloudVpc.CpOEbuWs.css @@ -0,0 +1,15 @@ +.form[data-v-1d12fc4b], +.vpc-panel[data-v-1d12fc4b] { + flex-direction: column; + gap: 12px; + display: flex; +} +.muted[data-v-1d12fc4b] { + color: var(--p-text-muted-color); + margin: 0; + font-size: 1rem; + line-height: 1.7; +} +.form label[data-v-1d12fc4b] { + font-size: 13px; +} diff --git a/app/assets/styles/MfDcimConfig.BhC_eZ0V.css b/app/assets/styles/MfDcimConfig.BhC_eZ0V.css new file mode 100644 index 0000000..13c4ba4 --- /dev/null +++ b/app/assets/styles/MfDcimConfig.BhC_eZ0V.css @@ -0,0 +1,175 @@ +.storage-grid[data-v-b5ff32bb] { + grid-template-columns: repeat(2, minmax(0, 1fr)); + align-items: start; + gap: 16px; + display: grid; +} +.disk-quantity[data-v-b5ff32bb] { + flex-direction: column; + gap: 12px; + min-width: 0; + display: flex; +} +.disk-quantity > label[data-v-b5ff32bb] { + color: var(--p-text-muted-color); + font-size: 0.9375rem; +} +.disk-quantity[data-v-b5ff32bb] .p-inputnumber { + width: 100%; + min-width: 0; +} +.disk-quantity[data-v-b5ff32bb] .p-inputnumber-input { + flex: 1; + width: 0; + min-width: 0; +} +@media (width<=639px) { + .storage-grid[data-v-b5ff32bb] { + grid-template-columns: 1fr; + } +} +.dcim-base[data-v-b5ff32bb] { + border: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + border-radius: 6px; + margin-bottom: 21px; + padding: 21px; + box-shadow: 0 1px 3px #0000001a; +} +.dcim-base h3[data-v-b5ff32bb] { + margin: 0 0 21px; + font-size: 1.125rem; + font-weight: 600; +} +.base-specs[data-v-b5ff32bb] { + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 21px; + display: grid; +} +.base-specs > div[data-v-b5ff32bb] { + align-items: center; + gap: 14px; + min-width: 0; + display: flex; +} +.base-specs i[data-v-b5ff32bb] { + color: var(--p-primary-color); + flex-shrink: 0; +} +.base-specs span[data-v-b5ff32bb] { + color: var(--p-text-muted-color); + min-width: 0; + font-size: 0.875rem; +} +.base-specs strong[data-v-b5ff32bb] { + color: var(--p-text-color); + overflow-wrap: anywhere; + font-size: 1rem; + font-weight: 500; + display: block; +} +.base-specs small[data-v-b5ff32bb] { + overflow-wrap: anywhere; + font-size: 0.8125rem; + display: block; +} +.network-slider[data-v-b5ff32bb] { + max-width: 465px; + margin: 14px 7px 0; +} +.optional-group h3[data-v-b5ff32bb] { + margin: 21px 0 12px; + font-size: 1rem; + font-weight: 400; +} +.optional-row[data-v-b5ff32bb] { + justify-content: space-between; + align-items: center; + gap: 21px; + margin: 10px 0; + display: flex; +} +.optional-row[data-v-b5ff32bb] .p-inputnumber { + flex-shrink: 0; + width: 150px; +} +.optional-row label[data-v-b5ff32bb] { + overflow-wrap: anywhere; +} +.agreement[data-v-b5ff32bb] { + align-items: flex-start; + gap: 8px; + line-height: 1.5; + display: flex; +} +.agreement a[data-v-b5ff32bb] { + color: var(--p-primary-color); + text-decoration: none; +} +.image-charge[data-v-b5ff32bb], +.stock-hint[data-v-b5ff32bb] { + color: var(--p-text-muted-color); + font-size: 0.875rem; +} +.config-change[data-v-b5ff32bb] { + border-top: 1px solid var(--p-content-border-color); + margin-top: 21px; +} +.config-change summary[data-v-b5ff32bb] { + color: var(--p-primary-color); + cursor: pointer; + justify-content: space-between; + align-items: center; + gap: 14px; + padding-top: 14px; + font-size: 0.875rem; + list-style: none; + display: flex; +} +.config-change summary[data-v-b5ff32bb]::-webkit-details-marker { + display: none; +} +.config-change summary > i[data-v-b5ff32bb] { + font-size: 0.875rem; +} +.config-change[open] summary > i[data-v-b5ff32bb] { + transform: rotate(180deg); +} +.config-change summary[data-v-b5ff32bb]:focus-visible { + outline: 2px solid var(--p-primary-color); + outline-offset: 4px; +} +.config-change-fields[data-v-b5ff32bb] { + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 21px; + padding-top: 21px; + display: grid; +} +.config-change-fields .form-row[data-v-b5ff32bb] { + margin-bottom: 0; +} +@media (width<=767px) { + .config-change-fields[data-v-b5ff32bb] { + grid-template-columns: 1fr; + gap: 14px; + } + .base-specs[data-v-b5ff32bb] { + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 21px 14px; + } + .dcim-base[data-v-b5ff32bb] { + padding: 14px; + } + .base-specs > div[data-v-b5ff32bb] { + gap: 10px; + } + .base-specs strong[data-v-b5ff32bb] { + font-size: 0.875rem; + } + .optional-row[data-v-b5ff32bb] { + gap: 14px; + } + .optional-row[data-v-b5ff32bb] .p-inputnumber { + width: 125px; + } +} diff --git a/app/assets/styles/NotificationPreferences.DcH8Noxd.css b/app/assets/styles/NotificationPreferences.DcH8Noxd.css new file mode 100644 index 0000000..50692a7 --- /dev/null +++ b/app/assets/styles/NotificationPreferences.DcH8Noxd.css @@ -0,0 +1,72 @@ +.notification-preferences[data-v-f4132ec8] { + border: 1px solid var(--console-panel-border); + background: var(--console-panel-bg); + border-radius: 8px; + padding: 16px 20px; +} +.preferences-heading[data-v-f4132ec8] { + justify-content: space-between; + align-items: flex-start; + gap: 16px; + display: flex; +} +.preferences-heading h3[data-v-f4132ec8] { + margin: 0; + font-size: 1.0625rem; + font-weight: 650; + line-height: 1.571rem; +} +.preferences-heading p[data-v-f4132ec8] { + color: var(--p-text-muted-color); + margin: 4px 0 0; + font-size: 0.875rem; + line-height: 1.6; +} +.preference-rows[data-v-f4132ec8] { + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 12px 28px; + margin-top: 14px; + display: grid; +} +.preference-row[data-v-f4132ec8] { + justify-content: space-between; + align-items: center; + gap: 12px; + min-height: 40px; + padding: 8px 0; + display: flex; +} +.preference-copy[data-v-f4132ec8] { + flex-direction: column; + gap: 2px; + min-width: 0; + display: flex; +} +.preference-label[data-v-f4132ec8] { + color: var(--p-text-color); + font-size: 1rem; + font-weight: 550; +} +.preference-hint[data-v-f4132ec8] { + color: var(--p-text-muted-color); + font-size: 0.875rem; + line-height: 1.4; +} +.preferences-message[data-v-f4132ec8] { + margin-top: 12px; +} +.preferences-status[data-v-f4132ec8] { + color: var(--p-text-muted-color); + margin: 8px 0 0; + font-size: 0.875rem; + line-height: 1.4; +} +@media (width<=640px) { + .notification-preferences[data-v-f4132ec8] { + padding: 14px 16px; + } + .preference-rows[data-v-f4132ec8] { + grid-template-columns: 1fr; + gap: 0; + } +} diff --git a/app/assets/styles/OperationToasts.DfA_b8om.css b/app/assets/styles/OperationToasts.DfA_b8om.css new file mode 100644 index 0000000..1fbeaa9 --- /dev/null +++ b/app/assets/styles/OperationToasts.DfA_b8om.css @@ -0,0 +1,71 @@ +.operation-toasts.p-toast { + width: min(380px, 100% - 24px); + top: 76px !important; + right: 20px !important; +} +.operation-toasts .p-toast-message { + background: var(--p-content-background); + color: var(--p-text-color); + border: 1px solid var(--p-content-border-color); + -webkit-backdrop-filter: none; + backdrop-filter: none; + border-radius: 10px; + box-shadow: 0 8px 28px #0f172a1f; +} +.operation-toasts .p-toast-message-content { + align-items: flex-start; + gap: 10px; + padding: 14px; +} +.operation-toast-icon { + flex-shrink: 0; + margin-top: 3px; + font-size: 1.125rem; +} +.operation-toast-icon.notice-success { + color: var(--p-green-500); +} +.operation-toast-icon.notice-error { + color: var(--p-red-500); +} +.operation-toast-icon.notice-warn { + color: var(--p-orange-500); +} +.operation-toast-icon.notice-info { + color: var(--p-primary-color); +} +.operation-toast-copy { + overflow-wrap: anywhere; + flex: 1; + min-width: 0; + font-size: 0.9375rem; + line-height: 1.6; +} +.operation-toast-results { + margin-top: 8px; + font-size: 0.875rem; +} +.operation-toast-results summary { + cursor: pointer; + color: var(--p-primary-color); +} +.operation-toast-results ul { + max-height: min(240px, 40vh); + margin: 8px 0 0; + padding-left: 18px; + overflow: auto; +} +.operation-toast-results li + li { + margin-top: 6px; +} +@media (width<=600px) { + .operation-toasts.p-toast { + top: 68px !important; + right: 12px !important; + } +} +@media (prefers-reduced-motion: reduce) { + .operation-toasts .p-toast-message { + transition: none !important; + } +} diff --git a/app/assets/styles/OsIcon.CAi4Iz2S.css b/app/assets/styles/OsIcon.CAi4Iz2S.css new file mode 100644 index 0000000..c69696d --- /dev/null +++ b/app/assets/styles/OsIcon.CAi4Iz2S.css @@ -0,0 +1,10 @@ +.os-icon[data-v-01907ce4] { + -o-object-fit: contain; + object-fit: contain; + flex-shrink: 0; + display: block; +} +.os-icon-fallback[data-v-01907ce4] { + color: var(--p-text-muted-color, #94a3b8); + flex-shrink: 0; +} diff --git a/app/assets/styles/PageInfoNotice._16xRFrB.css b/app/assets/styles/PageInfoNotice._16xRFrB.css new file mode 100644 index 0000000..51a2735 --- /dev/null +++ b/app/assets/styles/PageInfoNotice._16xRFrB.css @@ -0,0 +1,31 @@ +.page-info-notice[data-v-8f81f268] { + min-width: 0; + box-shadow: none; + border-radius: 6px; +} +.page-info-notice[data-v-8f81f268] .p-message-content { + align-items: flex-start; + gap: 8px; + padding: 10px 12px; +} +.page-info-notice[data-v-8f81f268] .p-message-icon { + flex-shrink: 0; + align-items: center; + width: 14px; + height: 1.6rem; + font-size: 14px; + display: inline-flex; +} +.page-info-notice[data-v-8f81f268] .p-message-text { + overflow-wrap: anywhere; + min-width: 0; + font-size: 1rem; + font-weight: 400; + line-height: 1.6; +} +.page-info-notice[data-v-8f81f268] a { + color: inherit; + text-underline-offset: 3px; + font-weight: 500; + text-decoration: underline; +} diff --git a/app/assets/styles/PageSteps.B5K7G9zF.css b/app/assets/styles/PageSteps.B5K7G9zF.css new file mode 100644 index 0000000..00dc7a9 --- /dev/null +++ b/app/assets/styles/PageSteps.B5K7G9zF.css @@ -0,0 +1,66 @@ +.steps[data-v-a16c5dea] { + margin: 0; + padding: 4px 0 2px; + list-style: none; + overflow-x: auto; +} +.step[data-v-a16c5dea], +.steps[data-v-a16c5dea] { + align-items: center; + display: flex; +} +.step[data-v-a16c5dea] { + flex-shrink: 0; + gap: 8px; +} +.step-dot[data-v-a16c5dea] { + background: var(--p-content-hover-background); + border: 1px solid var(--p-content-border-color, #e2e8f0); + border-radius: 50%; + flex-shrink: 0; + justify-content: center; + align-items: center; + width: 24px; + height: 24px; + font-size: 0.875rem; + font-weight: 600; + transition: + background 0.15s, + color 0.15s, + border-color 0.15s; + display: inline-flex; +} +.step-dot[data-v-a16c5dea], +.step-label[data-v-a16c5dea] { + color: var(--p-text-muted-color, #94a3b8); +} +.step-label[data-v-a16c5dea] { + white-space: nowrap; + font-size: 0.9375rem; +} +.step.done .step-dot[data-v-a16c5dea] { + background: var(--p-primary-color, #10b981); + border-color: var(--p-primary-color, #10b981); + color: var(--p-primary-contrast-color, #fff); +} +.step.done .step-label[data-v-a16c5dea] { + color: var(--p-text-color, #334155); +} +.step.active .step-dot[data-v-a16c5dea] { + border-color: var(--p-primary-color, #10b981); + color: var(--p-primary-color, #10b981); +} +.step.active .step-label[data-v-a16c5dea] { + color: var(--p-text-color, #334155); + font-weight: 500; +} +.step-line[data-v-a16c5dea] { + background: var(--p-content-border-color, #e2e8f0); + flex-shrink: 0; + width: 40px; + height: 1px; + margin: 0 10px; +} +.step.done .step-line[data-v-a16c5dea] { + background: var(--p-primary-color, #10b981); +} diff --git a/app/assets/styles/PaymentDialog.BNFKQF1U.css b/app/assets/styles/PaymentDialog.BNFKQF1U.css new file mode 100644 index 0000000..125bad6 --- /dev/null +++ b/app/assets/styles/PaymentDialog.BNFKQF1U.css @@ -0,0 +1,283 @@ +.order-line[data-v-4931e21e] { + color: var(--p-text-muted-color, #64748b); + justify-content: space-between; + align-items: center; + margin-bottom: 14px; + font-size: 0.9375rem; + display: flex; +} +.amount[data-v-4931e21e] { + color: #ef4444; + font-weight: 600; +} +.gateway-list[data-v-4931e21e] { + flex-direction: column; + gap: 10px; + display: flex; +} +.gateway-item[data-v-4931e21e] { + border: 1px solid var(--p-content-border-color, #e2e8f0); + background: var(--p-content-background); + cursor: pointer; + border-radius: 10px; + align-items: center; + gap: 10px; + padding: 12px 14px; + transition: + border-color 0.15s, + background 0.15s; + display: flex; +} +.gateway-item.active[data-v-4931e21e], +.gateway-item[data-v-4931e21e]:hover { + border-color: var(--p-primary-color, #3b82f6); +} +.gateway-item.active[data-v-4931e21e] { + background: var(--p-highlight-background); +} +.gateway-icon[data-v-4931e21e] { + -o-object-fit: contain; + object-fit: contain; + flex-shrink: 0; + width: 26px; + height: 26px; +} +.pay-box[data-v-4931e21e] { + justify-content: center; + min-height: 180px; + display: flex; +} +.pay-box[data-v-4931e21e] img { + max-width: 200px; +} +.polling-tip[data-v-4931e21e] { + color: var(--p-text-muted-color, #94a3b8); + justify-content: center; + align-items: center; + gap: 8px; + font-size: 0.9375rem; + display: flex; +} +.paid[data-v-4931e21e] { + text-align: center; + padding: 20px 0; +} +.paid i[data-v-4931e21e] { + color: var(--p-primary-color, #3b82f6); + font-size: 2.75rem; +} +.paid p[data-v-4931e21e] { + margin: 12px 0 0; + font-size: 1.0625rem; + font-weight: 500; +} +.msg[data-v-4931e21e] { + margin-top: 12px; +} +.voucher-row[data-v-4931e21e] { + border: 1px solid var(--p-content-border-color); + border-radius: 6px; + flex-direction: column; + gap: 10px; + min-width: 0; + margin-bottom: 18px; + padding: 14px; + display: flex; +} +.voucher-heading[data-v-4931e21e] { + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + gap: 8px; + font-size: 0.9375rem; + display: flex; +} +.voucher-heading a[data-v-4931e21e] { + color: var(--p-primary-color); + align-items: center; + gap: 6px; + font-size: 0.875rem; + text-decoration: none; + display: inline-flex; +} +.voucher-heading a[data-v-4931e21e]:hover { + text-decoration: underline; +} +.voucher-heading i[data-v-4931e21e] { + font-size: 0.625rem; +} +.voucher-select[data-v-4931e21e] { + width: 100%; + min-width: 0; +} +.voucher-empty[data-v-4931e21e], +.voucher-help[data-v-4931e21e] { + color: var(--p-text-muted-color); + margin: 0; + font-size: 0.875rem; + line-height: 1.6; +} +.voucher-empty[data-v-4931e21e], +.voucher-feedback[data-v-4931e21e] { + font-size: 0.9375rem; +} +.voucher-feedback[data-v-4931e21e] { + color: var(--p-red-500, #ef4444); + justify-content: space-between; + align-items: center; + gap: 8px; + display: flex; +} +.voucher-choice[data-v-4931e21e] { + white-space: normal; + overflow-wrap: anywhere; + flex-direction: column; + gap: 4px; + min-width: 0; + display: flex; +} +.voucher-choice small[data-v-4931e21e] { + color: var(--p-text-muted-color); + font-size: 0.875rem; +} +.voucher-option[data-v-4931e21e] { + color: #ef4444; + margin-left: 8px; + font-size: 0.875rem; +} +.voucher-tip[data-v-4931e21e] { + color: #22c55e; + margin: -6px 0 12px; + font-size: 0.875rem; +} +.gateway-item[data-v-4931e21e] { + border-radius: 0; + padding: 10px 14px; + font-size: 1rem; +} +.gateway-list[data-v-4931e21e] { + gap: 0; +} +.gateway-item + .gateway-item[data-v-4931e21e] { + margin-top: -1px; +} +.gateway-item[data-v-4931e21e]:focus-visible { + outline: 2px solid var(--p-primary-color); + outline-offset: 2px; +} +.gateway-selected[data-v-4931e21e] { + color: var(--p-primary-color); + flex-shrink: 0; + margin-left: auto; + font-size: 1.375rem; +} +.gateway-item[data-v-4931e21e]:disabled { + cursor: not-allowed; + opacity: 0.65; +} +.gateway-item.active[data-v-4931e21e] { + z-index: 1; + box-shadow: inset 0 0 0 1px var(--p-primary-color); + position: relative; +} +.gateway-list > .gateway-item[data-v-4931e21e]:first-of-type { + border-radius: 6px 6px 0 0; +} +.gateway-list > .gateway-item[data-v-4931e21e]:last-of-type { + border-radius: 0 0 6px 6px; +} +.gateway-list > .gateway-item[data-v-4931e21e]:only-of-type { + border-radius: 6px; +} +.balance-icon[data-v-4931e21e] { + text-align: center; + flex-shrink: 0; + width: 26px; + font-size: 1.25rem; +} +.balance-copy[data-v-4931e21e] { + text-align: left; + flex-wrap: wrap; + align-items: baseline; + gap: 4px 12px; + min-width: 0; + display: flex; +} +.balance-title[data-v-4931e21e] { + white-space: nowrap; + flex-shrink: 0; +} +.balance-copy small[data-v-4931e21e] { + color: var(--p-text-muted-color); + font-size: 0.875rem; + line-height: 1.6; +} +.gateway-title[data-v-4931e21e] { + text-align: left; + overflow-wrap: anywhere; + min-width: 0; +} +.payment-combination[data-v-4931e21e] { + margin-top: 26px; +} +.combination-amount[data-v-4931e21e] { + margin: 0 0 12px; + font-size: 1rem; + font-weight: 400; + line-height: 1.6; +} +.combination-amount b[data-v-4931e21e] { + font-variant-numeric: tabular-nums; + font-weight: 500; +} +.balance-breakdown[data-v-4931e21e] { + color: var(--p-text-muted-color); + flex-direction: column; + gap: 5px; + margin-top: 12px; + font-size: 0.875rem; + line-height: 1.7; + display: flex; +} +.balance-breakdown b[data-v-4931e21e] { + color: var(--p-primary-color); +} +.balance-note[data-v-4931e21e] { + color: var(--p-text-muted-color); + margin-top: 12px; + font-size: 0.875rem; + line-height: 1.7; +} +.amount[data-v-4931e21e] { + color: var(--p-text-color); +} +.inline-payment h3[data-v-4931e21e] { + margin: 0 0 14px; + font-size: 1rem; + font-weight: 400; +} +.inline-payment .order-line[data-v-4931e21e] { + display: none; +} +.inline-pay-actions[data-v-4931e21e] { + flex-direction: column; + gap: 10px; + margin-top: 56px; + display: flex; +} +.inline-payment .gateway-item[data-v-4931e21e] { + min-height: 56px; + padding: 14px 18px; +} +@media (width<=640px) { + .order-line[data-v-4931e21e] { + gap: 10px; + } + .order-line[data-v-4931e21e], + .voucher-row[data-v-4931e21e] { + flex-wrap: wrap; + } + .voucher-select[data-v-4931e21e] { + min-width: 0; + } +} diff --git a/app/assets/styles/PhoneCodeField.CwyHXfML.css b/app/assets/styles/PhoneCodeField.CwyHXfML.css new file mode 100644 index 0000000..ad6e0bd --- /dev/null +++ b/app/assets/styles/PhoneCodeField.CwyHXfML.css @@ -0,0 +1,33 @@ +.phone-code-field[data-v-24cb0489] { + gap: 6px; + display: grid; +} +.phone-code-field label[data-v-24cb0489] { + color: var(--p-text-muted-color); + font-size: 0.875rem; +} +.phone-code-input[data-v-24cb0489] { + border: 1px solid + var(--p-inputtext-border-color, var(--p-content-border-color)); + border-radius: var(--p-inputtext-border-radius, 6px); + background: var(--p-inputtext-background, var(--p-content-background)); + align-items: center; + gap: 6px; + padding: 8px 12px; + display: flex; +} +.phone-code-input input[data-v-24cb0489] { + width: 100%; + min-width: 0; + color: inherit; + font: inherit; + background: 0 0; + border: 0; + outline: 0; +} +.phone-code-input[data-v-24cb0489]:focus-within { + outline: 1px solid var(--p-primary-color); +} +small[data-v-24cb0489] { + color: var(--p-text-muted-color); +} diff --git a/app/assets/styles/ProductCategoryNotice.CwaR3eXN.css b/app/assets/styles/ProductCategoryNotice.CwaR3eXN.css new file mode 100644 index 0000000..5f136f9 --- /dev/null +++ b/app/assets/styles/ProductCategoryNotice.CwaR3eXN.css @@ -0,0 +1,115 @@ +.category-notice[data-v-faa6a7a3] { + border: 1px solid + color-mix( + in srgb, + var(--p-primary-color) 24%, + var(--p-content-border-color) + ); + background: color-mix( + in srgb, + var(--p-primary-color) 5%, + var(--p-content-background) + ); + min-width: 0; + color: var(--p-text-color); + border-radius: 8px; + align-items: flex-start; + gap: 12px; + padding: 16px 20px; + display: flex; +} +.category-notice-icon[data-v-faa6a7a3] { + color: var(--p-primary-color); + flex-shrink: 0; + margin-top: 4px; + font-size: 1.125rem; +} +.category-notice-content[data-v-faa6a7a3] { + overflow-wrap: anywhere; + flex: 1; + min-width: 0; + font-size: 0.9375rem; + line-height: 1.8; +} +.category-notice-plain[data-v-faa6a7a3] { + white-space: pre-line; +} +.category-notice-content[data-v-faa6a7a3] blockquote, +.category-notice-content[data-v-faa6a7a3] ol, +.category-notice-content[data-v-faa6a7a3] p, +.category-notice-content[data-v-faa6a7a3] ul { + margin: 8px 0; +} +.category-notice-content[data-v-faa6a7a3] h1, +.category-notice-content[data-v-faa6a7a3] h2, +.category-notice-content[data-v-faa6a7a3] h3, +.category-notice-content[data-v-faa6a7a3] h4, +.category-notice-content[data-v-faa6a7a3] h5, +.category-notice-content[data-v-faa6a7a3] h6 { + margin: 12px 0 8px; + font-size: 1.0625rem; + font-weight: 600; + line-height: 1.6; +} +.category-notice-content[data-v-faa6a7a3] ol, +.category-notice-content[data-v-faa6a7a3] ul { + padding-left: 22px; +} +.category-notice-content[data-v-faa6a7a3] ul { + list-style: outside; +} +.category-notice-content[data-v-faa6a7a3] ol { + list-style: decimal; +} +.category-notice-content[data-v-faa6a7a3] a { + color: var(--p-primary-color); + text-underline-offset: 3px; + text-decoration: underline; +} +.category-notice-content[data-v-faa6a7a3] a:focus-visible { + outline: 2px solid var(--p-primary-color); + outline-offset: 3px; +} +.category-notice-content[data-v-faa6a7a3] img { + vertical-align: middle; + max-width: 100%; + height: auto; +} +.category-notice-content[data-v-faa6a7a3] figure { + margin: 8px 0; +} +.category-notice-content[data-v-faa6a7a3] blockquote { + border-left: 3px solid var(--p-content-border-color); + color: var(--p-text-muted-color); + padding-left: 12px; +} +.category-notice-content[data-v-faa6a7a3] pre { + white-space: pre-wrap; + max-width: 100%; + overflow-x: auto; +} +.category-notice-content[data-v-faa6a7a3] table { + border-collapse: collapse; + white-space: normal; + max-width: 100%; + display: block; + overflow-x: auto; +} +.category-notice-content[data-v-faa6a7a3] td, +.category-notice-content[data-v-faa6a7a3] th { + border: 1px solid var(--p-content-border-color); + text-align: left; + padding: 6px 10px; +} +.category-notice-content[data-v-faa6a7a3] > :first-child { + margin-top: 0; +} +.category-notice-content[data-v-faa6a7a3] > :last-child { + margin-bottom: 0; +} +@media (width<=760px) { + .category-notice[data-v-faa6a7a3] { + gap: 10px; + padding: 14px 16px; + } +} diff --git a/app/assets/styles/ProductConfigurationSummary.BqZns1LB.css b/app/assets/styles/ProductConfigurationSummary.BqZns1LB.css new file mode 100644 index 0000000..4d0a9c7 --- /dev/null +++ b/app/assets/styles/ProductConfigurationSummary.BqZns1LB.css @@ -0,0 +1,16 @@ +.product-configuration-summary[data-v-cb8d72e4] { + color: var(--p-text-muted-color); + overflow-wrap: anywhere; + margin: 0 0 8px; + font-size: 0.875rem; + line-height: 1.7; +} +.summary-line[data-v-cb8d72e4] { + flex-wrap: wrap; + align-items: baseline; + gap: 3px 6px; + display: flex; +} +.summary-separator[data-v-cb8d72e4] { + opacity: 0.55; +} diff --git a/app/assets/styles/ProductCustomFields.B2QMnPil.css b/app/assets/styles/ProductCustomFields.B2QMnPil.css new file mode 100644 index 0000000..4ac0b91 --- /dev/null +++ b/app/assets/styles/ProductCustomFields.B2QMnPil.css @@ -0,0 +1,12 @@ +.product-custom-fields[data-v-9d2a6f70] { + min-width: 0; +} +.field-note[data-v-9d2a6f70] { + color: var(--p-text-muted-color); + margin: 0; + font-size: 0.875rem; + line-height: 1.7; +} +.product-custom-fields > .field-note[data-v-9d2a6f70] { + margin-bottom: 20px; +} diff --git a/app/assets/styles/ProductDescription.Ctb7jDuO.css b/app/assets/styles/ProductDescription.Ctb7jDuO.css new file mode 100644 index 0000000..ec4542c --- /dev/null +++ b/app/assets/styles/ProductDescription.Ctb7jDuO.css @@ -0,0 +1,274 @@ +.product-description[data-v-8a6cfb44] { + min-width: 0; + max-width: 100%; + color: var(--p-text-color); + overflow-wrap: anywhere; + font-size: 0.9375rem; + line-height: 1.8; +} +.description-panel[data-v-8a6cfb44] { + background: #fff; + border-top: 1px solid #e2e9f3; + border-bottom: 1px solid #dfe6f0; + padding: 0; +} +.description-header[data-v-8a6cfb44] { + background: #f5f8fe; + border-bottom: 1px solid #dfe6f0; + padding: 8px clamp(20px, 8.6%, 110px); +} +.description-header h2[data-v-8a6cfb44] { + color: #657286; + margin: 0; + font-size: 21px; + font-weight: 500; + line-height: 1.35; +} +.description-content[data-v-8a6cfb44] { + min-width: 0; +} +.description-panel .description-content[data-v-8a6cfb44] { + padding: 40px clamp(20px, 8.6%, 110px) 52px; +} +.description-field[data-v-8a6cfb44] { + grid-template-columns: 160px minmax(0, 1fr); + align-items: center; + gap: 20px; + margin: 0; + padding: 16px 0; + display: grid; +} +.description-field dt[data-v-8a6cfb44] { + color: #708096; + align-items: center; + gap: 16px; + min-width: 0; + font-size: 20px; + font-weight: 400; + display: flex; +} +.description-field dt i[data-v-8a6cfb44] { + color: #768aa7; + flex: none; + font-size: 18px; +} +.description-field dd[data-v-8a6cfb44] { + color: #394658; + white-space: pre-line; + min-width: 0; + margin: 0; + font-size: 22px; + line-height: 1.5; +} +.description-field--network dt i[data-v-8a6cfb44] { + color: #5084a6; +} +.description-field--notes dt i[data-v-8a6cfb44] { + color: #8792a2; +} +.description-field--security dt i[data-v-8a6cfb44] { + color: #4e9276; +} +.description-field--hardware dt i[data-v-8a6cfb44] { + color: #756fb1; +} +.description-field--resources dt i[data-v-8a6cfb44] { + color: #52818a; +} +.description-field--billing dt i[data-v-8a6cfb44] { + color: #a17a3f; +} +.description-paragraph[data-v-8a6cfb44] { + white-space: pre-line; + margin: 12px 0; +} +.description-content > .description-paragraph[data-v-8a6cfb44]:first-child { + margin-top: 0; +} +.description-content > .description-paragraph[data-v-8a6cfb44]:last-child { + margin-bottom: 0; +} +.description-header + + .description-content + > .description-paragraph[data-v-8a6cfb44]:first-child { + margin-top: 16px; +} +.description-compact .description-field[data-v-8a6cfb44] { + border: 0; + grid-template-columns: 76px minmax(0, 1fr); + gap: 14px; + padding: 5px 0; +} +.description-compact .description-field[data-v-8a6cfb44]:first-child { + padding-top: 0; +} +.description-compact .description-field dt[data-v-8a6cfb44] { + gap: 7px; + font-size: 0.875rem; +} +.description-compact .description-field dt i[data-v-8a6cfb44] { + font-size: 0.875rem; +} +.description-compact .description-field dd[data-v-8a6cfb44] { + font-size: 0.9375rem; +} +.description-compact .description-paragraph[data-v-8a6cfb44] { + color: var(--p-text-muted-color); +} +.description-preview[data-v-8a6cfb44] { + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + display: -webkit-box; + overflow: hidden; +} +.description-empty[data-v-8a6cfb44] { + color: var(--p-text-muted-color); + margin: 0; +} +.description-toggle[data-v-8a6cfb44] { + min-height: 32px; + font: inherit; + color: var(--p-primary-color); + cursor: pointer; + background: 0 0; + border: 0; + align-items: center; + gap: 6px; + margin-top: 8px; + padding: 3px 0; + font-size: 0.875rem; + display: inline-flex; +} +.description-toggle[data-v-8a6cfb44]:hover { + text-underline-offset: 3px; + text-decoration: underline; +} +.description-toggle[data-v-8a6cfb44]:focus-visible { + outline: 2px solid var(--p-primary-color); + outline-offset: 3px; + border-radius: 2px; +} +.description-toggle i[data-v-8a6cfb44] { + font-size: 0.875rem; +} +.description-rich[data-v-8a6cfb44] { + min-width: 0; + padding-top: 8px; +} +.description-rich[data-v-8a6cfb44] dl, +.description-rich[data-v-8a6cfb44] ol, +.description-rich[data-v-8a6cfb44] p, +.description-rich[data-v-8a6cfb44] ul { + margin: 10px 0; +} +.description-rich[data-v-8a6cfb44] h1, +.description-rich[data-v-8a6cfb44] h2, +.description-rich[data-v-8a6cfb44] h3, +.description-rich[data-v-8a6cfb44] h4, +.description-rich[data-v-8a6cfb44] h5, +.description-rich[data-v-8a6cfb44] h6 { + color: var(--p-text-color); + margin: 20px 0 8px; + font-size: 1rem; + font-weight: 600; + line-height: 1.7; +} +.description-rich[data-v-8a6cfb44] ol, +.description-rich[data-v-8a6cfb44] ul { + padding-left: 22px; +} +.description-rich[data-v-8a6cfb44] ul { + list-style: outside; +} +.description-rich[data-v-8a6cfb44] ol { + list-style: decimal; +} +.description-rich[data-v-8a6cfb44] li { + margin-block: 4px; +} +.description-rich[data-v-8a6cfb44] a { + color: var(--p-primary-color); + text-underline-offset: 3px; + text-decoration: underline; +} +.description-rich[data-v-8a6cfb44] img { + border-radius: 4px; + max-width: 100%; + height: auto; + display: block; +} +.description-rich[data-v-8a6cfb44] figure { + margin: 14px 0; +} +.description-rich[data-v-8a6cfb44] figcaption { + color: var(--p-text-muted-color); + margin-top: 6px; + font-size: 0.875rem; +} +.description-rich[data-v-8a6cfb44] table { + border-collapse: collapse; + max-width: 100%; + display: block; + overflow-x: auto; +} +.description-rich[data-v-8a6cfb44] td, +.description-rich[data-v-8a6cfb44] th { + border: 1px solid var(--p-content-border-color); + text-align: left; + padding: 8px 12px; +} +.description-rich[data-v-8a6cfb44] th { + background: var(--p-content-hover-background); + font-weight: 500; +} +.description-rich[data-v-8a6cfb44] pre { + white-space: pre-wrap; + background: var(--p-content-hover-background); + border-radius: 4px; + max-width: 100%; + padding: 12px; + overflow-x: auto; +} +.description-rich[data-v-8a6cfb44] blockquote { + border-left: 3px solid var(--p-primary-color); + color: var(--p-text-muted-color); + margin: 14px 0; + padding: 4px 14px; +} +.description-rich[data-v-8a6cfb44] hr { + border: 0; + border-top: 1px solid var(--p-content-border-color); + margin: 16px 0; +} +.description-rich[data-v-8a6cfb44] > :first-child { + margin-top: 0; +} +.description-rich[data-v-8a6cfb44] > :last-child { + margin-bottom: 0; +} +@media (width<=760px) { + .description-header[data-v-8a6cfb44] { + padding: 10px 20px; + } + .description-header h2[data-v-8a6cfb44] { + font-size: 17px; + } + .description-panel .description-content[data-v-8a6cfb44] { + padding: 20px 20px 28px; + } + .description-field[data-v-8a6cfb44] { + grid-template-columns: 94px minmax(0, 1fr); + gap: 12px; + padding: 12px 0; + } + .description-field dt[data-v-8a6cfb44] { + gap: 8px; + font-size: 14px; + } + .description-field dt i[data-v-8a6cfb44] { + font-size: 14px; + } + .description-field dd[data-v-8a6cfb44] { + font-size: 15px; + } +} diff --git a/app/assets/styles/ProductGroupLabel.B1kWpFA-.css b/app/assets/styles/ProductGroupLabel.B1kWpFA-.css new file mode 100644 index 0000000..c2d9d65 --- /dev/null +++ b/app/assets/styles/ProductGroupLabel.B1kWpFA-.css @@ -0,0 +1,32 @@ +.product-group-label[data-v-6806c62d] { + align-items: center; + justify-content: inherit; + vertical-align: middle; + flex-wrap: wrap; + gap: 5px 8px; + min-width: 0; + max-width: 100%; + display: inline-flex; +} +.product-group-name[data-v-6806c62d] { + overflow-wrap: anywhere; + min-width: 0; +} +.product-group-badge[data-v-6806c62d] { + border: 1px solid + color-mix(in srgb, var(--p-primary-color) 24%, var(--p-content-background)); + background: color-mix( + in srgb, + var(--p-primary-color) 9%, + var(--p-content-background) + ); + max-width: 100%; + color: var(--p-primary-700); + overflow-wrap: anywhere; + border-radius: 5px; + padding: 1px 7px; + font-size: 0.8125rem; + font-weight: 600; + line-height: 1.286rem; + display: inline-block; +} diff --git a/app/assets/styles/PromoCodeField.qFEkB6Hm.css b/app/assets/styles/PromoCodeField.qFEkB6Hm.css new file mode 100644 index 0000000..c1540e8 --- /dev/null +++ b/app/assets/styles/PromoCodeField.qFEkB6Hm.css @@ -0,0 +1,35 @@ +.promo summary[data-v-a17e621a] { + color: var(--p-primary-color); + cursor: pointer; + margin-bottom: 8px; + font-size: 0.875rem; + list-style: none; +} +.promo[data-v-a17e621a] { + flex-direction: column; + gap: 6px; + display: flex; +} +.promo > label[data-v-a17e621a] { + color: var(--p-text-muted-color, #64748b); + font-size: 0.9375rem; +} +.promo-body[data-v-a17e621a] { + align-items: center; + gap: 8px; + display: flex; +} +.promo-input[data-v-a17e621a] { + flex: 1; + min-width: 0; +} +.promo-tip[data-v-a17e621a] { + margin: 0; + font-size: 0.875rem; +} +.promo-tip.ok[data-v-a17e621a] { + color: #22c55e; +} +.promo-tip.fail[data-v-a17e621a] { + color: #ef4444; +} diff --git a/app/assets/styles/RechargeDialog.DpsMly4r.css b/app/assets/styles/RechargeDialog.DpsMly4r.css new file mode 100644 index 0000000..9eba0e1 --- /dev/null +++ b/app/assets/styles/RechargeDialog.DpsMly4r.css @@ -0,0 +1,47 @@ +.step[data-v-c038cb91] { + flex-direction: column; + gap: 14px; + display: flex; +} +.field-label[data-v-c038cb91] { + color: var(--p-text-color, #334155); + font-size: 0.9375rem; +} +.recharge-options[data-v-c038cb91] { + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 7px; + margin-bottom: 21px; + display: grid; +} +.recharge-option[data-v-c038cb91] { + border: 1px solid var(--p-content-border-color); + height: 56px; + color: var(--p-text-color); + cursor: pointer; + background: 0 0; + border-radius: 5px; + font-size: 1.0625rem; +} +.recharge-option.active[data-v-c038cb91] { + border-color: var(--p-primary-color); + color: var(--p-primary-color); + background: var(--p-highlight-background); +} +.recharge-option[data-v-c038cb91]:focus-visible { + outline: 2px solid var(--p-primary-color); + outline-offset: 2px; +} +.custom-amount[data-v-c038cb91] { + grid-column: span 2; + min-width: 0; +} +.custom-amount[data-v-c038cb91] input { + width: 100%; + min-width: 0; + height: 56px; +} +@media (width<=480px) { + .recharge-options[data-v-c038cb91] { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} diff --git a/app/assets/styles/RemfUpgrade.4stQ5ASH.css b/app/assets/styles/RemfUpgrade.4stQ5ASH.css new file mode 100644 index 0000000..d9a4ad6 --- /dev/null +++ b/app/assets/styles/RemfUpgrade.4stQ5ASH.css @@ -0,0 +1,92 @@ +.upg[data-v-7efd9d4d] { + flex-direction: column; + gap: 14px; + display: flex; +} +.upg-state[data-v-7efd9d4d] { + text-align: center; + color: var(--p-text-muted-color, #94a3b8); + padding: 18px 0; + font-size: 0.9375rem; +} +.info-table[data-v-7efd9d4d] { + border: 1px solid var(--console-panel-border); + box-shadow: var(--console-panel-shadow); + background: var(--console-panel-bg); + border-radius: 6px; + overflow: hidden; +} +.kv[data-v-7efd9d4d] { + grid-template-columns: 16.6667% minmax(0, 1fr); + align-items: center; + min-height: 49px; + display: grid; +} +.kv + .kv[data-v-7efd9d4d] { + border-top: 1px solid var(--console-panel-border); +} +.kv[data-v-7efd9d4d]:nth-child(2n) { + background: var(--console-page-bg); +} +.kv[data-v-7efd9d4d] > * { + overflow-wrap: anywhere; + min-width: 0; + padding: 14px; +} +.kv[data-v-7efd9d4d] > :first-child { + color: var(--p-text-muted-color); + font-weight: 600; +} +.config-field[data-v-7efd9d4d] .p-inputnumber, +.config-field[data-v-7efd9d4d] .p-select { + width: 100%; + min-width: 0; + max-width: 420px; +} +.config-field[data-v-7efd9d4d] .p-inputnumber-input { + flex: 1; + width: 0; + min-width: 0; +} +.config-field[data-v-7efd9d4d] .p-select-label { + min-width: 0; +} +.action-cell[data-v-7efd9d4d] .p-button { + max-width: 100%; +} +@media (width<=767px) { + .kv[data-v-7efd9d4d] { + grid-template-columns: 100px minmax(0, 1fr); + } +} +.upg-note[data-v-7efd9d4d], +.upg-unsupported[data-v-7efd9d4d] { + color: var(--p-text-muted-color, #94a3b8); + font-size: 0.875rem; +} +.upg-price[data-v-7efd9d4d] { + color: var(--p-text-muted-color, #64748b); + align-items: baseline; + gap: 8px; + font-size: 0.9375rem; + display: flex; +} +.upg-price b[data-v-7efd9d4d] { + color: #ef4444; + font-size: 1.375rem; +} +.upg-loading[data-v-7efd9d4d] { + display: inline-flex; +} +.upg-price .upg-idle[data-v-7efd9d4d] { + font-size: 0.9375rem; + font-weight: 400; +} +.upg-desc[data-v-7efd9d4d], +.upg-price .upg-idle[data-v-7efd9d4d] { + color: var(--p-text-muted-color, #94a3b8); +} +.upg-desc[data-v-7efd9d4d] { + margin: 0; + font-size: 0.875rem; +} diff --git a/app/assets/styles/RemoteConsole.DLmX5UZu.css b/app/assets/styles/RemoteConsole.DLmX5UZu.css new file mode 100644 index 0000000..959a04b --- /dev/null +++ b/app/assets/styles/RemoteConsole.DLmX5UZu.css @@ -0,0 +1,233 @@ +.remote-console[data-v-e696489e] { + color: #23324d; + background: #f8fafc; + flex-direction: column; + width: 100%; + height: 100dvh; + min-height: 0; + display: flex; + overflow: hidden; +} +.console-header[data-v-e696489e] { + background: #fff; + flex-shrink: 0; + align-items: center; + gap: 14px; + padding: 14px 22px; + display: flex; +} +.console-mark[data-v-e696489e] { + color: #0052d9; + background: #edf4ff; + border-radius: 10px; + flex: 0 0 40px; + place-items: center; + width: 40px; + height: 40px; + font-size: 1.375rem; + display: grid; +} +.console-heading[data-v-e696489e] { + flex: 1; + min-width: 0; +} +.console-heading h1[data-v-e696489e] { + flex-wrap: wrap; + align-items: baseline; + gap: 10px; + margin: 0; + font-size: 1.25rem; + font-weight: 650; + line-height: 1.45; + display: flex; +} +.console-brand[data-v-e696489e] { + color: #64748b; + letter-spacing: 0.04em; + margin: 0 0 2px; + font-size: 0.8125rem; + line-height: 1.5; +} +.console-target[data-v-e696489e] { + text-overflow: ellipsis; + white-space: nowrap; + margin: 3px 0 0; + overflow: hidden; +} +.console-target[data-v-e696489e], +.host-id[data-v-e696489e] { + color: #64748b; + font-size: 0.875rem; +} +.host-id[data-v-e696489e] { + flex-shrink: 0; + font-weight: 400; +} +.connection-state[data-v-e696489e] { + color: #64748b; + flex-shrink: 0; + align-items: center; + gap: 7px; + font-size: 0.875rem; + display: flex; +} +.state-dot[data-v-e696489e] { + background: currentColor; + border-radius: 50%; + width: 7px; + height: 7px; +} +.state-connected[data-v-e696489e] { + color: #16803c; +} +.state-error[data-v-e696489e] { + color: #c2413a; +} +.state-connecting[data-v-e696489e], +.state-creating[data-v-e696489e] { + color: #0052d9; +} +.console-toolbar[data-v-e696489e] { + background: #f8fafc; + border-block: 1px solid #e2e8f0; + flex-shrink: 0; + justify-content: space-between; + gap: 10px; + padding: 11px 20px; +} +.console-toolbar[data-v-e696489e], +.toolbar-group[data-v-e696489e] { + flex-wrap: wrap; + align-items: center; + display: flex; +} +.toolbar-group[data-v-e696489e] { + gap: 8px; +} +.toolbar-message[data-v-e696489e] { + color: #8a5900; + flex-shrink: 0; + margin: 0; + padding: 9px 20px; + font-size: 0.875rem; +} +.console-display[data-v-e696489e] { + background: #141b2b; + flex: 1; + min-height: 0; + display: flex; + position: relative; + overflow: hidden; +} +.console-screen[data-v-e696489e] { + width: 100%; + min-width: 0; + height: 100%; + min-height: 0; + position: absolute; + inset: 0; +} +.console-overlay[data-v-e696489e] { + color: #f8fafc; + background: #141b2b; + justify-content: center; + align-items: center; + padding: 24px; + display: flex; + position: absolute; + inset: 0; + overflow: auto; +} +.connection-message[data-v-e696489e] { + text-align: center; + max-width: 380px; +} +.state-icon[data-v-e696489e] { + color: #9bb7e9; + font-size: 1.875rem; +} +.connection-message h3[data-v-e696489e], +.credential-form h3[data-v-e696489e] { + margin: 18px 0 8px; + font-size: 1.25rem; + font-weight: 600; + line-height: 1.4; +} +.connection-message p[data-v-e696489e], +.credential-form p[data-v-e696489e] { + color: #b6c3d9; + margin: 0 0 22px; + font-size: 0.9375rem; + line-height: 1.8; +} +.credential-form[data-v-e696489e] { + flex-direction: column; + gap: 10px; + width: min(320px, 100%); + margin: auto; + display: flex; +} +.credential-form .state-icon[data-v-e696489e], +.credential-form h3[data-v-e696489e], +.credential-form > p[data-v-e696489e] { + text-align: center; +} +.credential-form h3[data-v-e696489e] { + margin: 8px 0 0; +} +.credential-form p[data-v-e696489e] { + margin: 0 0 8px; +} +.credential-form label[data-v-e696489e] { + font-size: 0.9375rem; +} +.credential-form .credential-error[data-v-e696489e] { + color: #fca5a5; +} +.console-footer[data-v-e696489e] { + color: #64748b; + border-top: 1px solid #e2e8f0; + flex-wrap: wrap; + flex-shrink: 0; + justify-content: space-between; + gap: 8px; + padding: 11px 20px; + font-size: 0.875rem; + line-height: 1.5; + display: flex; +} +.remote-console[data-v-e696489e]:fullscreen { + width: 100vw; + height: 100dvh; +} +@media (width<=640px) { + .console-header[data-v-e696489e] { + gap: 9px; + padding: 14px 12px; + } + .console-mark[data-v-e696489e] { + display: none; + } + .console-heading h1[data-v-e696489e] { + gap: 7px; + font-size: 1.125rem; + } + .connection-state[data-v-e696489e] { + font-size: 0.8125rem; + } + .console-toolbar[data-v-e696489e] { + padding: 10px; + } + .toolbar-group[data-v-e696489e] { + gap: 6px; + } + .console-footer[data-v-e696489e] { + padding: 10px 12px; + font-size: 0.8125rem; + } +} +@media (prefers-reduced-motion: reduce) { + .pi-spin[data-v-e696489e] { + animation: none; + } +} diff --git a/app/assets/styles/RichTextEditor.NkmgPT5m.css b/app/assets/styles/RichTextEditor.NkmgPT5m.css new file mode 100644 index 0000000..b72f780 --- /dev/null +++ b/app/assets/styles/RichTextEditor.NkmgPT5m.css @@ -0,0 +1,48 @@ +.rich-editor[data-v-858a2ddd] { + border: 1px solid var(--p-form-field-border-color); + background: var(--p-form-field-background); + border-radius: 4px; + overflow: hidden; +} +.rich-editor[data-v-858a2ddd]:focus-within { + border-color: var(--p-primary-color); +} +.editor-toolbar[data-v-858a2ddd] { + border-bottom: 1px solid var(--console-panel-border); + flex-wrap: wrap; + gap: 3.5px; + padding: 4px 7px; + display: flex; +} +.editor-toolbar button[data-v-858a2ddd] { + width: 24px; + height: 28px; + color: var(--p-text-muted-color); + cursor: pointer; + background: 0 0; + border: 0; + border-radius: 3px; +} +.editor-toolbar button[data-v-858a2ddd]:hover { + background: var(--p-content-hover-background); +} +.editor-toolbar i[data-v-858a2ddd] { + font-size: 0.875rem; +} +.editor-content[data-v-858a2ddd] { + overflow-wrap: anywhere; + outline: none; + padding: 14px; + line-height: 1.5; +} +.editor-content[data-v-858a2ddd]:empty:before { + content: attr(data-placeholder); + color: var(--p-text-muted-color); + pointer-events: none; +} +.editor-content[data-v-858a2ddd] p { + margin: 0 0 7px; +} +.disabled[data-v-858a2ddd] { + opacity: 0.6; +} diff --git a/app/assets/styles/RingProgress.CVwR7il5.css b/app/assets/styles/RingProgress.CVwR7il5.css new file mode 100644 index 0000000..ef8a395 --- /dev/null +++ b/app/assets/styles/RingProgress.CVwR7il5.css @@ -0,0 +1,27 @@ +.ring[data-v-bff6718d] { + flex-shrink: 0; + position: relative; +} +.ring-bar[data-v-bff6718d] { + transition: stroke-dashoffset 0.4s; +} +.ring-text[data-v-bff6718d] { + pointer-events: none; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 7px; + display: flex; + position: absolute; + inset: 0; +} +.ring-value[data-v-bff6718d] { + font-size: 1.125rem; + font-weight: 600; + line-height: 1; +} +.ring-label[data-v-bff6718d] { + color: var(--p-text-muted-color, #94a3b8); + font-size: 1rem; + line-height: 1; +} diff --git a/app/assets/styles/RoxyMascot.CDqPSf2d.css b/app/assets/styles/RoxyMascot.CDqPSf2d.css new file mode 100644 index 0000000..d2d3645 --- /dev/null +++ b/app/assets/styles/RoxyMascot.CDqPSf2d.css @@ -0,0 +1,471 @@ +.roxy-mascot[data-v-65169a82] { + --roxy-ink: #45465f; + --roxy-hair: #779aca; + --roxy-hair-light: #a8c4e4; + --roxy-hair-dark: #5376a7; + --roxy-skin: #ffe7d5; + pointer-events: none; + -webkit-user-select: none; + user-select: none; + isolation: isolate; + width: 240px; + height: 160px; + position: relative; +} +.roxy-mascot[data-v-65169a82] *, +.roxy-mascot[data-v-65169a82] :after, +.roxy-mascot[data-v-65169a82] :before { + box-sizing: border-box; + position: absolute; +} +.roxy-shadow[data-v-65169a82] { + background: #3d517721; + border-radius: 50%; + width: 176px; + height: 9px; + bottom: 8px; + left: 48px; +} +.roxy-body[data-v-65169a82] { + border: 2px solid var(--roxy-ink); + background: #f4e8cd; + border-radius: 42% 55% 20% 25%; + width: 93px; + height: 34px; + top: 114px; + left: 127px; + overflow: hidden; + transform: rotate(4deg); +} +.cape-fold[data-v-65169a82] { + border-right: 2px solid #b6a98e; + border-radius: 50%; + width: 25px; + height: 31px; + top: -4px; + left: 16px; + transform: rotate(-14deg); +} +.cape-hem[data-v-65169a82] { + background: #514957; + border-radius: 70% 0 0; + width: 41px; + height: 16px; + bottom: -2px; + right: -2px; +} +.cape-hem[data-v-65169a82], +.roxy-leg[data-v-65169a82] { + border: 2px solid var(--roxy-ink); +} +.roxy-leg[data-v-65169a82] { + transform-origin: 50% 100%; + background: #f5dcc7; + border-radius: 9px; + width: 15px; + height: 35px; +} +.leg-back[data-v-65169a82] { + top: 94px; + left: 190px; + transform: rotate(22deg); +} +.leg-front[data-v-65169a82] { + top: 101px; + left: 203px; + transform: rotate(42deg); +} +.roxy-leg i[data-v-65169a82] { + border: 2px solid var(--roxy-ink); + background: #6c5654; + border-radius: 8px 8px 4px 4px; + width: 21px; + height: 23px; + top: -8px; + left: -4px; +} +.roxy-leg i[data-v-65169a82]:after { + content: ""; + border-top: 2px solid #c4a47c; + bottom: 3px; + left: 1px; + right: 1px; +} +.roxy-sleeve[data-v-65169a82] { + border: 2px solid var(--roxy-ink); + background: #f4e8cd; + border-radius: 50% 50% 35% 35%; + width: 37px; + height: 19px; + top: 132px; +} +.sleeve-left[data-v-65169a82] { + left: 65px; + transform: rotate(-9deg); +} +.sleeve-right[data-v-65169a82] { + left: 125px; + transform: rotate(9deg); +} +.roxy-hand[data-v-65169a82] { + background: var(--roxy-skin); + border: 1.5px solid #a27f7a; + border-radius: 45% 45% 48% 48%; + width: 23px; + height: 13px; + top: 142px; +} +.hand-left[data-v-65169a82] { + left: 70px; + transform: rotate(-8deg); +} +.hand-right[data-v-65169a82] { + left: 129px; + transform: rotate(8deg); +} +.roxy-hand i[data-v-65169a82] { + background: #d7af9b; + width: 1px; + height: 4px; + top: 6px; + left: 7px; + box-shadow: 4px 0 #d7af9b; +} +.roxy-head[data-v-65169a82] { + transform-origin: 59% 94%; + width: 151px; + height: 143px; + animation: 5.6s ease-in-out infinite roxy-head-sway-65169a82; + top: 4px; + left: 29px; +} +.hair-back[data-v-65169a82] { + border: 2px solid var(--roxy-ink); + background: var(--roxy-hair-dark); + border-radius: 48% 48% 28% 30%; + width: 81px; + height: 83px; + top: 53px; + left: 44px; +} +.roxy-face[data-v-65169a82] { + border: 1.5px solid var(--roxy-ink); + border-top: 0; + border-radius: 36% 36% 46% 46%; + width: 67px; + height: 62px; + top: 72px; + left: 51px; + box-shadow: inset 0 6px #efd0bd; +} +.roxy-ear[data-v-65169a82], +.roxy-face[data-v-65169a82] { + background: var(--roxy-skin); +} +.roxy-ear[data-v-65169a82] { + border: 1.5px solid #a27f7a; + border-radius: 50%; + width: 12px; + height: 16px; + top: 103px; +} +.ear-left[data-v-65169a82] { + left: 46px; +} +.ear-right[data-v-65169a82] { + left: 111px; +} +.roxy-brow[data-v-65169a82] { + border-top: 2px solid #637699; + border-radius: 50%; + width: 13px; + height: 4px; + top: 16px; +} +.brow-left[data-v-65169a82] { + left: 10px; + transform: rotate(-5deg); +} +.brow-right[data-v-65169a82] { + right: 9px; + transform: rotate(5deg); +} +.roxy-eye[data-v-65169a82] { + border: 1.5px solid var(--roxy-ink); + transform-origin: 50%; + background: #fbfcff; + border-top-width: 3px; + border-radius: 42% 42% 46% 46%; + width: 15px; + height: 19px; + animation: 7.8s linear infinite roxy-blink-65169a82; + top: 24px; + overflow: hidden; +} +.eye-left[data-v-65169a82] { + left: 10px; + transform: rotate(2deg); +} +.eye-right[data-v-65169a82] { + right: 9px; + transform: rotate(-2deg); +} +.roxy-eye i[data-v-65169a82] { + background: #3d649c; + border-radius: 45%; + width: 10px; + height: 15px; + top: 0; + left: 2px; + box-shadow: inset 0 -5px #6a9ed4; +} +.roxy-eye i[data-v-65169a82]:before { + background: #2c3d63; + height: 9px; + left: 3px; +} +.roxy-eye i[data-v-65169a82]:after, +.roxy-eye i[data-v-65169a82]:before { + content: ""; + border-radius: 50%; + width: 4px; + top: 1px; +} +.roxy-eye i[data-v-65169a82]:after { + background: #fff; + height: 5px; + left: 0; + box-shadow: 6px 9px 0 -1px #d5edff; +} +.roxy-cheek[data-v-65169a82] { + opacity: 0.55; + background: #efa5a3; + border-radius: 50%; + width: 12px; + height: 5px; + top: 43px; +} +.cheek-left[data-v-65169a82] { + left: 5px; +} +.cheek-right[data-v-65169a82] { + right: 4px; +} +.roxy-nose[data-v-65169a82] { + background: #dba996; + border-radius: 50%; + width: 3px; + height: 2px; + top: 41px; + left: 32px; +} +.roxy-mouth[data-v-65169a82] { + border-bottom: 1.5px solid #a66c75; + border-radius: 0 0 50% 50%; + width: 10px; + height: 5px; + top: 47px; + left: 28px; +} +.roxy-fringe[data-v-65169a82] { + background: var(--roxy-hair); + border: 1.5px solid var(--roxy-ink); + box-shadow: inset 4px 1px var(--roxy-hair-light); +} +.fringe-left[data-v-65169a82] { + border-radius: 85% 12% 95% 10%; + width: 34px; + height: 44px; + top: 66px; + left: 44px; + transform: rotate(7deg); +} +.fringe-middle[data-v-65169a82] { + border-radius: 25% 20% 18% 95%; + width: 24px; + height: 34px; + top: 65px; + left: 73px; + transform: rotate(-18deg); +} +.fringe-right[data-v-65169a82] { + border-radius: 12% 85% 10% 95%; + width: 31px; + height: 46px; + top: 65px; + left: 92px; + transform: rotate(-10deg); +} +.roxy-braid[data-v-65169a82] { + width: 19px; + height: 46px; + top: 109px; +} +.braid-left[data-v-65169a82] { + left: 34px; + transform: rotate(13deg); +} +.braid-right[data-v-65169a82] { + left: 120px; + transform: rotate(-17deg); +} +.roxy-braid i[data-v-65169a82] { + border: 1.5px solid var(--roxy-ink); + background: var(--roxy-hair); + width: 15px; + height: 14px; + box-shadow: inset 3px 1px var(--roxy-hair-light); + border-radius: 55% 45%; +} +.roxy-braid i[data-v-65169a82]:first-child { + top: 0; + left: 0; + transform: rotate(-23deg); +} +.roxy-braid i[data-v-65169a82]:nth-child(2) { + top: 9px; + left: 3px; + transform: rotate(23deg); +} +.roxy-braid i[data-v-65169a82]:nth-child(3) { + top: 18px; + left: 0; + transform: rotate(-23deg); +} +.roxy-braid i[data-v-65169a82]:nth-child(4) { + top: 27px; + left: 3px; + transform: rotate(23deg); +} +.hair-tie[data-v-65169a82] { + background: #d8bd73; + border: 1px solid #65533e; + border-radius: 2px; + width: 15px; + height: 5px; + top: 35px; + left: 2px; +} +.roxy-hat[data-v-65169a82] { + width: 152px; + height: 85px; + top: 0; + left: 0; + transform: rotate(-8deg); +} +.hat-cone[data-v-65169a82] { + background: #463d4a; + width: 104px; + height: 79px; + top: 0; + left: 31px; +} +.hat-cone[data-v-65169a82], +.hat-cone[data-v-65169a82]:before { + clip-path: polygon(3% 100%, 24% 29%, 62% 0, 58% 23%, 76% 53%, 100% 100%); +} +.hat-cone[data-v-65169a82]:before { + content: ""; + background: #79615c; + inset: 3px; +} +.hat-seam[data-v-65169a82] { + opacity: 0.8; + border-left: 2px solid #ad9180; + width: 27px; + height: 38px; + top: 22px; + left: 41px; + transform: rotate(24deg); +} +.hat-band[data-v-65169a82] { + background: #e7d9ad; + border: 2px solid #574958; + border-radius: 40% 45% 10% 10%; + width: 82px; + height: 16px; + top: 57px; + left: 43px; + transform: rotate(5deg); +} +.hat-brim[data-v-65169a82] { + background: #8b7166; + border: 2px solid #463d4a; + border-radius: 50%; + width: 148px; + height: 19px; + top: 68px; + left: 3px; + transform: rotate(3deg); + box-shadow: inset 0 -5px #584952; +} +.hat-buckle[data-v-65169a82] { + background: #544b5b; + border: 3px solid #b39b69; + border-radius: 3px; + width: 13px; + height: 15px; + top: 60px; + left: 96px; + transform: rotate(5deg); +} +.roxy-staff[data-v-65169a82] { + background: #b38c69; + border: 1px solid #624d44; + border-radius: 6px; + width: 182px; + height: 5px; + top: 144px; + left: 17px; + transform: rotate(-3deg); +} +.staff-ring[data-v-65169a82] { + border: 4px solid #aa845e; + border-radius: 50%; + width: 28px; + height: 28px; + top: -14px; + left: -9px; + box-shadow: 0 0 0 1px #624d44; +} +.staff-ring i[data-v-65169a82] { + background: #c98fa9; + border: 1px solid #914d66; + border-radius: 30% 45% 35%; + inset: 1px; + transform: rotate(30deg); + box-shadow: inset 3px 2px #f0c5d4; +} +@keyframes roxy-head-sway-65169a82 { + 0%, + to { + transform: rotate(-4deg); + } + 45%, + 55% { + transform: rotate(4deg); + } +} +@keyframes roxy-blink-65169a82 { + 0%, + 43%, + 47%, + to { + scale: 1; + } + 45% { + scale: 1 0.08; + } +} +@media (width<=767px) { + .roxy-eye[data-v-65169a82], + .roxy-head[data-v-65169a82] { + animation: none; + } +} +@media (prefers-reduced-motion: reduce) { + .roxy-eye[data-v-65169a82], + .roxy-head[data-v-65169a82] { + animation: none; + } +} diff --git a/app/assets/styles/SecurityVerificationDialog.skYFo4v7.css b/app/assets/styles/SecurityVerificationDialog.skYFo4v7.css new file mode 100644 index 0000000..2a95317 --- /dev/null +++ b/app/assets/styles/SecurityVerificationDialog.skYFo4v7.css @@ -0,0 +1,32 @@ +.security-verify[data-v-ff4061ec] { + gap: 8px; + font-size: 13px; + display: grid; +} +.security-verify label[data-v-ff4061ec], +.tip[data-v-ff4061ec] { + color: var(--p-text-muted-color); + font-size: 12px; +} +.verify-input[data-v-ff4061ec] { + gap: 8px; + display: flex; +} +.verify-input .p-inputtext[data-v-ff4061ec] { + flex: 1; + min-width: 0; +} +.error[data-v-ff4061ec] { + color: var(--p-red-500); +} +.actions[data-v-ff4061ec] { + justify-content: flex-end; + gap: 8px; + margin-top: 10px; + display: flex; +} +.security-qr[data-v-ff4061ec] { + justify-self: center; + width: 240px; + max-width: 100%; +} diff --git a/app/assets/styles/SensitiveValue.BSZlaRHT.css b/app/assets/styles/SensitiveValue.BSZlaRHT.css new file mode 100644 index 0000000..a0f66fd --- /dev/null +++ b/app/assets/styles/SensitiveValue.BSZlaRHT.css @@ -0,0 +1,35 @@ +.sensitive-value[data-v-07008ebf] { + vertical-align: middle; + align-items: center; + gap: 4px; + min-width: 0; + max-width: 100%; + display: inline-flex; +} +.sensitive-value-text[data-v-07008ebf] { + overflow-wrap: anywhere; + min-width: 0; +} +.sensitive-value-toggle[data-v-07008ebf] { + min-width: 28px; + min-height: 28px; + color: var(--p-text-muted-color, #64748b); + cursor: pointer; + background: 0 0; + border: 0; + border-radius: 4px; + flex: none; + justify-content: center; + align-items: center; + padding: 4px; + font-size: 0.9375rem; + display: inline-flex; +} +.sensitive-value-toggle[data-v-07008ebf]:hover { + color: var(--p-primary-color); + background: var(--p-content-hover-background); +} +.sensitive-value-toggle[data-v-07008ebf]:focus-visible { + outline: 2px solid var(--p-primary-color); + outline-offset: 2px; +} diff --git a/app/assets/styles/TicketAttachments.DtbJGLkE.css b/app/assets/styles/TicketAttachments.DtbJGLkE.css new file mode 100644 index 0000000..d9b7289 --- /dev/null +++ b/app/assets/styles/TicketAttachments.DtbJGLkE.css @@ -0,0 +1,150 @@ +.message-attachments[data-v-77cd676b] { + border-top: 1px solid var(--p-content-border-color); + flex-direction: column; + gap: 12px; + margin: 0 14px 14px; + padding: 12px 0 0; + font-size: 0.9375rem; + list-style: none; + display: flex; +} +.message-attachments li[data-v-77cd676b] { + min-width: 0; +} +.image-attachment[data-v-77cd676b] { + border: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + max-width: 100%; + color: var(--p-text-color); + text-align: left; + cursor: pointer; + border-radius: 8px; + align-items: center; + gap: 12px; + padding: 8px; + display: flex; +} +.image-attachment[data-v-77cd676b]:hover { + border-color: var(--p-primary-color); +} +.image-attachment[data-v-77cd676b]:hover, +.thumbnail[data-v-77cd676b] { + background: var(--p-content-hover-background); +} +.thumbnail[data-v-77cd676b] { + border-radius: 4px; + flex: 0 0 112px; + justify-content: center; + align-items: center; + width: 112px; + height: 80px; + display: flex; + overflow: hidden; +} +.thumbnail img[data-v-77cd676b] { + -o-object-fit: contain; + object-fit: contain; + width: 100%; + height: 100%; +} +.thumbnail .pi[data-v-77cd676b] { + color: var(--p-text-muted-color); + font-size: 1.5rem; +} +.image-caption[data-v-77cd676b] { + flex-direction: column; + gap: 5px; + min-width: 0; + display: flex; +} +.attachment-name[data-v-77cd676b] { + color: var(--p-primary-color); + overflow-wrap: anywhere; +} +.image-hint[data-v-77cd676b] { + color: var(--p-text-muted-color); + font-size: 0.8125rem; +} +.file-attachment[data-v-77cd676b] { + align-items: baseline; + gap: 8px; + min-width: 0; + display: flex; +} +.file-attachment a[data-v-77cd676b] { + color: var(--p-primary-color); + overflow-wrap: anywhere; +} +.file-attachment a .pi[data-v-77cd676b] { + margin-left: 4px; + font-size: 0.8125rem; +} +.attachment-unavailable[data-v-77cd676b] { + color: var(--p-text-muted-color); + overflow-wrap: anywhere; +} +.preview-error[data-v-77cd676b], +.preview-status[data-v-77cd676b] { + color: var(--p-text-muted-color); + margin: 0 0 12px; +} +.preview-error[data-v-77cd676b] { + padding: 24px 0; +} +.image-preview[data-v-77cd676b] { + background: var(--p-content-hover-background); + border-radius: 6px; + justify-content: center; + align-items: center; + min-height: 120px; + max-height: 68vh; + display: flex; + overflow: auto; +} +.image-preview img[data-v-77cd676b] { + -o-object-fit: contain; + object-fit: contain; + max-width: 100%; + max-height: 68vh; + display: block; +} +.image-preview.original-size[data-v-77cd676b] { + display: block; +} +.image-preview.original-size img[data-v-77cd676b] { + max-width: none; + max-height: none; + margin: 0 auto; +} +.preview-actions[data-v-77cd676b] { + flex-wrap: wrap; + justify-content: flex-end; + align-items: center; + gap: 10px; + display: flex; +} +.download-image[data-v-77cd676b] { + color: var(--p-primary-contrast-color); + background: var(--p-primary-color); + border-radius: 6px; + justify-content: center; + align-items: center; + gap: 8px; + padding: 10px 14px; + text-decoration: none; + display: inline-flex; +} +.download-image[data-v-77cd676b]:hover { + background: var(--p-primary-hover-color); +} +@media (width<=480px) { + .thumbnail[data-v-77cd676b] { + flex-basis: 80px; + width: 80px; + height: 64px; + } + .image-attachment[data-v-77cd676b], + .preview-actions[data-v-77cd676b] { + gap: 8px; + } +} diff --git a/app/assets/styles/UploadField.BbTCTv6C.css b/app/assets/styles/UploadField.BbTCTv6C.css new file mode 100644 index 0000000..b3c108e --- /dev/null +++ b/app/assets/styles/UploadField.BbTCTv6C.css @@ -0,0 +1,44 @@ +.field[data-v-8267b59f] { + flex-direction: column; + gap: 6px; + display: flex; +} +.field > label[data-v-8267b59f] { + color: var(--p-text-color, #334155); + font-size: 0.9375rem; +} +.row[data-v-8267b59f] { + flex-wrap: wrap; + align-items: center; + gap: 10px; + display: flex; +} +.row input[type="file"][data-v-8267b59f] { + color: var(--p-text-muted-color, #64748b); + max-width: 100%; + font-size: 0.9375rem; +} +.state[data-v-8267b59f] { + color: var(--p-text-muted-color, #94a3b8); + align-items: center; + gap: 5px; + font-size: 0.875rem; + display: inline-flex; +} +.state.ok[data-v-8267b59f] { + color: #22c55e; +} +.rm[data-v-8267b59f] { + color: var(--p-text-muted-color, #94a3b8); + cursor: pointer; + background: 0 0; + border: 0; + padding: 2px 4px; +} +.err[data-v-8267b59f], +.rm[data-v-8267b59f]:hover { + color: #ef4444; +} +.err[data-v-8267b59f] { + font-size: 0.875rem; +} diff --git a/app/assets/styles/WechatConnection.DI5ko1xy.css b/app/assets/styles/WechatConnection.DI5ko1xy.css new file mode 100644 index 0000000..d82a144 --- /dev/null +++ b/app/assets/styles/WechatConnection.DI5ko1xy.css @@ -0,0 +1,15 @@ +.wechat-connection[data-v-4c933481] { + min-width: 0; +} +.wechat-connection .p-message[data-v-4c933481] { + margin-bottom: 14px; +} +.wechat-loading[data-v-4c933481] { + flex-direction: column; + gap: 12px; + padding: 21px 0; + display: flex; +} +.wechat-binding-help[data-v-4c933481] { + margin-top: 14px; +} diff --git a/app/assets/styles/WithdrawDialog.ks0wdKEK.css b/app/assets/styles/WithdrawDialog.ks0wdKEK.css new file mode 100644 index 0000000..da2a033 --- /dev/null +++ b/app/assets/styles/WithdrawDialog.ks0wdKEK.css @@ -0,0 +1,97 @@ +.sk[data-v-e4be3b52] { + padding: 8px 0; +} +.form[data-v-e4be3b52] { + flex-direction: column; + gap: 14px; + display: flex; +} +.notice[data-v-e4be3b52] { + border: 1px solid var(--p-content-border-color, #e2e8f0); + background: var(--p-content-hover-background); + border-radius: 8px; + padding: 12px 16px; +} +.notice-title[data-v-e4be3b52] { + align-items: center; + gap: 6px; + margin-bottom: 6px; + font-size: 0.9375rem; + display: flex; +} +.notice ul[data-v-e4be3b52] { + color: var(--p-text-muted-color, #64748b); + margin: 0; + padding-left: 18px; + font-size: 0.875rem; + line-height: 1.9; +} +.field[data-v-e4be3b52] { + flex-direction: column; + gap: 6px; + display: flex; +} +.field-label[data-v-e4be3b52], +.field > label[data-v-e4be3b52] { + color: var(--p-text-color, #334155); + font-size: 0.9375rem; +} +.hint[data-v-e4be3b52] { + color: var(--p-text-muted-color, #94a3b8); + font-size: 0.875rem; +} +.calc[data-v-e4be3b52] { + border-top: 1px solid var(--p-content-border-color, #e2e8f0); + flex-direction: column; + gap: 8px; + padding-top: 14px; + display: flex; +} +.calc-row[data-v-e4be3b52] { + color: var(--p-text-muted-color, #64748b); + justify-content: space-between; + align-items: baseline; + font-size: 0.9375rem; + display: flex; +} +.calc-row > b[data-v-e4be3b52] { + color: var(--p-text-color); + font-weight: 500; +} +.calc-row.total > b[data-v-e4be3b52] { + color: #ef4444; + font-size: 1.25rem; +} +.notice[data-v-e4be3b52] { + background: var(--p-blue-50, #eff6ff); + border-color: var(--p-blue-200, #bfdbfe); + border-radius: 5px; + padding: 14px; +} +.notice ul[data-v-e4be3b52], +.notice-title[data-v-e4be3b52] { + color: var(--p-blue-700, #1d4ed8); +} +.notice-title[data-v-e4be3b52] { + font-weight: 600; +} +.notice ul[data-v-e4be3b52] { + line-height: 1.8; +} +.form[data-v-e4be3b52] { + gap: 21px; +} +.calc[data-v-e4be3b52] { + gap: 7px; +} +.calc-row.total > b[data-v-e4be3b52] { + color: var(--p-text-color); +} +.app-dark .notice { + background: #172554; + border-color: #1e3a8a; +} +.app-dark .notice ul, +.app-dark .notice-title { + color: #bfdbfe; +} diff --git a/app/assets/styles/_id_.C-0--Lx-.css b/app/assets/styles/_id_.C-0--Lx-.css new file mode 100644 index 0000000..f99873a --- /dev/null +++ b/app/assets/styles/_id_.C-0--Lx-.css @@ -0,0 +1,287 @@ +.page[data-v-3743a20f] { + flex-direction: column; + gap: 16px; + display: flex; +} +.back[data-v-3743a20f] { + color: var(--p-text-muted-color, #94a3b8); + align-items: center; + gap: 6px; + font-size: 0.9375rem; + text-decoration: none; + display: inline-flex; +} +.back[data-v-3743a20f]:hover { + color: var(--p-primary-color, #10b981); +} +.head-panel[data-v-3743a20f] { + flex-direction: column; + gap: 10px; + display: flex; +} +.ticket-head[data-v-3743a20f] { + justify-content: space-between; + align-items: flex-start; + gap: 16px; + display: flex; +} +.ticket-num[data-v-3743a20f] { + color: var(--p-text-muted-color, #94a3b8); +} +.status-tag[data-v-3743a20f] { + border: 1px solid; + border-radius: 999px; + flex-shrink: 0; + padding: 3px 12px; + font-size: 0.875rem; + line-height: 1.286rem; + display: inline-block; +} +.ticket-meta[data-v-3743a20f] { + color: var(--p-text-muted-color, #94a3b8); + font-size: 0.9375rem; +} +.thread[data-v-3743a20f] { + flex-direction: column; + gap: 16px; + margin-bottom: 24px; + display: flex; +} +.message[data-v-3743a20f] { + background: var(--p-highlight-background); + border: 1px solid var(--p-content-border-color, #e2e8f0); + border-radius: 10px; + padding: 14px 16px; +} +.message.admin[data-v-3743a20f] { + background: var(--p-content-hover-background); + border-color: var(--p-content-border-color, #e2e8f0); +} +.message-head[data-v-3743a20f] { + align-items: center; + gap: 8px; + margin-bottom: 8px; + font-size: 0.9375rem; + display: flex; +} +.sender[data-v-3743a20f] { + font-weight: 600; +} +.badge[data-v-3743a20f] { + background: var(--p-primary-color, #10b981); + color: var(--p-primary-contrast-color, #fff); + border-radius: 999px; + padding: 1px 8px; + font-size: 0.8125rem; +} +.time[data-v-3743a20f] { + color: var(--p-text-muted-color, #94a3b8); + font-size: 0.875rem; +} +.message-body[data-v-3743a20f] { + color: var(--p-text-color, #334155); + word-break: break-word; + font-size: 1rem; + line-height: 1.7; +} +.message-body[data-v-3743a20f] p { + margin: 0 0 8px; +} +.message-body[data-v-3743a20f] p:last-child { + margin-bottom: 0; +} +.message-body[data-v-3743a20f] img { + max-width: 100%; +} +.reply-box[data-v-3743a20f] { + border-top: 1px solid var(--p-content-border-color, #e2e8f0); + flex-direction: column; + gap: 12px; + padding-top: 16px; + display: flex; +} +.reply-actions[data-v-3743a20f] { + justify-content: space-between; + align-items: center; + gap: 12px; + display: flex; +} +.buttons[data-v-3743a20f] { + gap: 8px; + margin-left: auto; + display: flex; +} +.inline-error[data-v-3743a20f] { + flex: 1; +} +.list-page[data-v-3743a20f] { + gap: 21px; +} +.list-head h2[data-v-3743a20f], +.page-head h2[data-v-3743a20f] { + margin: 0; + font-size: 1.125rem; + font-weight: 700; + line-height: 24.5px; +} +.list-toolbar[data-v-3743a20f], +.list-toolbar-right[data-v-3743a20f] { + justify-content: flex-start; + gap: 7px; +} +.list-search[data-v-3743a20f], +.list-select[data-v-3743a20f] { + width: 280px; +} +.list-table[data-v-3743a20f] { + border-radius: 6px; + box-shadow: 0 1px 3px #0f172a12; +} +.list-foot[data-v-3743a20f] { + justify-content: center; +} +.list-foot > .list-bulk[data-v-3743a20f]:empty { + display: none; +} +[data-v-3743a20f] .p-datatable-header-cell { + background: var(--p-content-hover-background); + padding: 10.5px 14px; + font-size: 1rem; + font-weight: 600; +} +[data-v-3743a20f] .p-datatable-tbody > tr > td { + padding: 10.5px 14px; + font-size: 1rem; +} +[data-v-3743a20f] .p-tag { + font-size: 0.875rem; + font-weight: 500; +} +[data-v-3743a20f] .list-empty { + gap: 14px; + min-height: 300px; + padding: 42px 21px; +} +[data-v-3743a20f] .list-empty i { + opacity: 1; + font-size: 1.875rem; +} +[data-v-3743a20f] .list-empty-title { + font-size: 1rem; +} +[data-v-3743a20f] .list-empty-desc { + font-size: 0.875rem; +} +.field[data-v-3743a20f] { + gap: 7px; +} +.field label[data-v-3743a20f] { + font-size: 0.875rem; +} +@media (width<=768px) { + .list-search[data-v-3743a20f], + .list-select[data-v-3743a20f], + .list-toolbar-right[data-v-3743a20f] { + width: 100%; + } +} +.page[data-v-3743a20f] { + gap: 21px; + width: 100%; + max-width: 896px; + margin: 0 auto; +} +.panel[data-v-3743a20f] { + background: 0 0; + border: 0; + border-radius: 0; + padding: 0; +} +.head-panel[data-v-3743a20f] { + border-bottom: 1px solid var(--p-content-border-color); + padding-bottom: 14px; +} +.ticket-head[data-v-3743a20f] { + flex-wrap: wrap; + align-items: center; + gap: 14px; +} +.ticket-title[data-v-3743a20f] { + flex: 1; +} +.ticket-title h2[data-v-3743a20f] { + margin: 0; + font-size: 1.125rem; +} +.ticket-meta[data-v-3743a20f], +.ticket-num[data-v-3743a20f] { + font-size: 0.875rem; +} +.ticket-meta[data-v-3743a20f] { + color: var(--p-text-muted-color); +} +.thread[data-v-3743a20f] { + gap: 14px; + margin-left: 49px; +} +.message[data-v-3743a20f], +.message.admin[data-v-3743a20f] { + background: var(--p-content-background); + border: 1px solid var(--p-content-border-color); + border-radius: 6px; + padding: 0; + position: relative; + box-shadow: 0 1px 3px #0f172a0a; +} +.message-head[data-v-3743a20f] { + border-bottom: 1px solid var(--p-content-border-color); + margin: 0; + padding: 10.5px 14px; +} +.sender-avatar[data-v-3743a20f] { + color: #fff; + background: #ec4899; + border-radius: 50%; + place-items: center; + width: 35px; + height: 35px; + display: grid; + position: absolute; + top: 0; + left: -49px; +} +.sender-avatar.staff[data-v-3743a20f] { + background: var(--p-primary-color); +} +.time[data-v-3743a20f] { + margin-left: auto; +} +.message-body[data-v-3743a20f] { + padding: 14px; +} +.message-attachments[data-v-3743a20f] { + margin: 0 14px 14px; +} +.reply-box[data-v-3743a20f] { + border: 0; + margin-left: 49px; + padding: 0; +} +.reply-box[data-v-3743a20f] textarea { + min-height: 160px; +} +@media (width<=768px) { + .reply-box[data-v-3743a20f], + .thread[data-v-3743a20f] { + margin-left: 35px; + } + .sender-avatar[data-v-3743a20f] { + width: 28px; + height: 28px; + left: -35px; + } + .buttons[data-v-3743a20f], + .reply-actions[data-v-3743a20f] { + flex-wrap: wrap; + } +} diff --git a/app/assets/styles/_id_.CSXsMADH.css b/app/assets/styles/_id_.CSXsMADH.css new file mode 100644 index 0000000..238e14f --- /dev/null +++ b/app/assets/styles/_id_.CSXsMADH.css @@ -0,0 +1,59 @@ +.page[data-v-49461ec8] { + flex-direction: column; + gap: 32px; + width: 100%; + max-width: 1280px; + margin: 0 auto; + padding: 0 0 28px; + display: flex; +} +.product-head[data-v-49461ec8] { + justify-content: space-between; + align-items: center; + gap: 20px; + min-height: 36px; + display: flex; +} +.product-head h1[data-v-49461ec8] { + overflow-wrap: anywhere; + margin: 0; + font-size: 1.375rem; + font-weight: 500; + line-height: 1.5; +} +.product-head p[data-v-49461ec8] { + color: var(--p-text-muted-color); + margin: 6px 0 0; + font-size: 0.9375rem; +} +.product-links[data-v-49461ec8] { + flex-shrink: 0; + align-items: center; + gap: 18px; + display: flex; +} +.back[data-v-49461ec8], +.cart-link[data-v-49461ec8] { + color: var(--p-text-muted-color); + align-items: center; + gap: 5px; + font-size: 0.9375rem; + text-decoration: none; + display: inline-flex; +} +.back[data-v-49461ec8]:hover, +.cart-link[data-v-49461ec8]:hover { + color: var(--p-primary-color); +} +@media (width<=639px) { + .product-head[data-v-49461ec8] { + flex-wrap: wrap; + gap: 8px; + } + .product-links[data-v-49461ec8] { + font-size: 0.875rem; + } + .page[data-v-49461ec8] { + gap: 28px; + } +} diff --git a/app/assets/styles/_id_.gjoJy9S8.css b/app/assets/styles/_id_.gjoJy9S8.css new file mode 100644 index 0000000..ae1dea2 --- /dev/null +++ b/app/assets/styles/_id_.gjoJy9S8.css @@ -0,0 +1,431 @@ +.receipt-page[data-v-b3b3cd9c] { + width: 100%; + max-width: 560px; + margin: 0 auto; +} +.receipt-nav[data-v-b3b3cd9c] { + color: var(--p-text-muted-color); + justify-content: space-between; + align-items: center; + gap: 14px; + margin-bottom: 14px; + font-size: 0.875rem; + display: flex; +} +.receipt-nav a[data-v-b3b3cd9c] { + color: inherit; + align-items: center; + gap: 7px; + text-decoration: none; + display: inline-flex; +} +.receipt-nav a[data-v-b3b3cd9c]:hover { + color: var(--p-primary-color); +} +.receipt-nav > span[data-v-b3b3cd9c] { + overflow-wrap: anywhere; + text-align: right; + min-width: 0; +} +.receipt-feedback[data-v-b3b3cd9c] { + margin-bottom: 14px; +} +.receipt-layout[data-v-b3b3cd9c] { + grid-template-columns: minmax(0, 1fr); + gap: 35px; + display: grid; +} +.receipt[data-v-b3b3cd9c] { + border: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + border-radius: 10px; + gap: 56px; + min-width: 0; + padding: 70px 21px 84px; + box-shadow: 0 1px 2px #00000014; +} +.receipt[data-v-b3b3cd9c], +.receipt-header[data-v-b3b3cd9c] { + flex-direction: column; + display: flex; +} +.receipt-header[data-v-b3b3cd9c] { + align-items: flex-start; + gap: 14px; + padding: 14px 14px 0; +} +.receipt-heading[data-v-b3b3cd9c] { + align-items: center; + gap: 14px; + width: 100%; + min-width: 0; + display: flex; +} +.receipt-heading > div[data-v-b3b3cd9c] { + min-width: 0; +} +.receipt-icon[data-v-b3b3cd9c] { + border: 1px solid var(--p-content-border-color); + background: var(--p-content-hover-background); + border-radius: 7px; + flex-shrink: 0; + place-items: center; + width: 49px; + height: 49px; + display: grid; +} +.receipt-heading h2[data-v-b3b3cd9c] { + overflow-wrap: anywhere; + margin: 0 0 4px; + font-size: 1rem; + font-weight: 650; + line-height: 1.5; +} +.receipt-heading p[data-v-b3b3cd9c] { + color: var(--p-text-muted-color); + margin: 0; + font-size: 0.875rem; +} +.receipt-status[data-v-b3b3cd9c] { + padding: 5px 10px; + font-size: 1rem; +} +.receipt-item[data-v-b3b3cd9c], +.receipt-table-head[data-v-b3b3cd9c], +.receipt-total[data-v-b3b3cd9c] { + justify-content: space-between; + gap: 14px; + display: flex; +} +.receipt-table-head[data-v-b3b3cd9c], +.receipt-tx-head[data-v-b3b3cd9c] { + background: var(--p-content-hover-background); +} +.receipt-item[data-v-b3b3cd9c], +.receipt-table-head[data-v-b3b3cd9c], +.receipt-tx-head[data-v-b3b3cd9c] { + border-bottom: 1px solid var(--p-content-border-color); + padding: 12px 14px; + font-size: 1rem; +} +.receipt-item[data-v-b3b3cd9c] { + align-items: center; + line-height: 1.5; +} +.receipt-item > div[data-v-b3b3cd9c] { + overflow-wrap: anywhere; + flex: 1; + min-width: 0; +} +.receipt-item > b[data-v-b3b3cd9c] { + overflow-wrap: anywhere; + text-align: right; + font-variant-numeric: tabular-nums; + flex-shrink: 0; + max-width: 40%; +} +.receipt-item p[data-v-b3b3cd9c] { + margin: 0; +} +.receipt-description[data-v-b3b3cd9c] { + white-space: pre-line; + overflow-wrap: anywhere; +} +.receipt-total[data-v-b3b3cd9c] { + align-items: baseline; + padding: 14px 14px 0; + font-size: 1rem; +} +.receipt-total > b[data-v-b3b3cd9c] { + flex-shrink: 0; +} +.receipt-total strong[data-v-b3b3cd9c] { + font-variant-numeric: tabular-nums; + text-align: right; + overflow-wrap: anywhere; + min-width: 0; + font-size: 1.5rem; + font-weight: 650; + line-height: 1.4; +} +.receipt-tx[data-v-b3b3cd9c], +.receipt-tx-head[data-v-b3b3cd9c] { + grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr) minmax(0, 0.9fr); + gap: 10px; + font-size: 1rem; + display: grid; +} +.receipt-tx[data-v-b3b3cd9c] { + border-bottom: 1px solid var(--p-content-border-color); + padding: 12px 14px; +} +.receipt-tx-head[data-v-b3b3cd9c] > :nth-child(2), +.receipt-tx[data-v-b3b3cd9c] > :nth-child(2) { + text-align: center; +} +.receipt-tx-head[data-v-b3b3cd9c] > :last-child, +.receipt-tx[data-v-b3b3cd9c] > :last-child { + text-align: right; +} +.receipt-tx[data-v-b3b3cd9c] > * { + overflow-wrap: anywhere; + min-width: 0; +} +.transaction-error[data-v-b3b3cd9c] { + flex-direction: column; + align-items: flex-start; + gap: 10px; + padding: 14px; + display: flex; +} +.receipt-empty[data-v-b3b3cd9c] { + border-bottom: 1px solid var(--p-content-border-color); + text-align: center; + color: var(--p-text-muted-color); + margin: 0; + padding: 12px 14px; + font-size: 1rem; +} +.bank-transfer-panel[data-v-b3b3cd9c] { + border: 1px solid var(--p-content-border-color); + background: var(--p-content-hover-background); + border-radius: 8px; + flex-direction: column; + gap: 14px; + margin-top: -21px; + padding: 18px 14px; + display: flex; +} +.bank-transfer-heading[data-v-b3b3cd9c] { + justify-content: space-between; + align-items: flex-start; + gap: 14px; + display: flex; +} +.bank-transfer-heading h3[data-v-b3b3cd9c] { + margin: 0 0 4px; + font-size: 1rem; +} +.bank-transfer-heading p[data-v-b3b3cd9c] { + overflow-wrap: anywhere; + margin: 0; + line-height: 1.6; +} +.bank-transfer-heading p[data-v-b3b3cd9c], +.bank-transfer-upload[data-v-b3b3cd9c] { + color: var(--p-text-muted-color); + font-size: 0.875rem; +} +.bank-transfer-upload[data-v-b3b3cd9c] { + flex-wrap: wrap; + align-items: center; + gap: 10px; + display: flex; +} +.bank-transfer-upload input[data-v-b3b3cd9c] { + max-width: 100%; + font-size: 0.875rem; +} +.bank-voucher-list[data-v-b3b3cd9c] { + flex-direction: column; + gap: 4px; + margin: 0; + padding: 0; + list-style: none; + display: flex; +} +.bank-voucher-list li[data-v-b3b3cd9c] { + border: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + border-radius: 4px; + justify-content: space-between; + align-items: center; + gap: 10px; + min-width: 0; + padding: 5px 8px; + font-size: 0.875rem; + display: flex; +} +.bank-voucher-list li span[data-v-b3b3cd9c] { + overflow-wrap: anywhere; + min-width: 0; +} +.bank-transfer-actions[data-v-b3b3cd9c] { + flex-wrap: wrap; + gap: 8px; + display: flex; +} +.receipt-actions[data-v-b3b3cd9c] { + flex-wrap: wrap; + justify-content: flex-end; + align-items: center; + gap: 10px; + margin-top: 21px; + display: flex; +} +.receipt-actions > .p-button[data-v-b3b3cd9c] { + min-width: 112px; +} +.receipt-actions > .p-button[data-v-b3b3cd9c], +.success-actions > .p-button[data-v-b3b3cd9c] { + white-space: nowrap; + flex-shrink: 0; + text-decoration: none; +} +.credit-note[data-v-b3b3cd9c] { + color: var(--p-text-muted-color); + margin: 10px 14px 0; + font-size: 0.875rem; +} +.payment-page[data-v-b3b3cd9c] { + max-width: 1024px; +} +.payment-page .receipt-layout[data-v-b3b3cd9c] { + grid-template-columns: minmax(0, 1.18fr) minmax(0, 1fr); + align-items: stretch; + gap: 42px; +} +.payment-page .receipt[data-v-b3b3cd9c] { + min-height: 700px; +} +.receipt-payment[data-v-b3b3cd9c] { + min-width: 0; + padding: 84px 0; +} +.receipt-payment > p[data-v-b3b3cd9c] { + color: var(--p-text-muted-color); + margin: 0 0 70px; + font-size: 1rem; +} +.payment-success[data-v-b3b3cd9c] { + text-align: center; + max-width: 560px; + margin: 56px auto; +} +.payment-success > i[data-v-b3b3cd9c] { + color: #22c55e; + background: #dcfce7; + border: 10px solid #dcfce7; + border-radius: 100%; + font-size: 2.1875rem; +} +.payment-success > p[data-v-b3b3cd9c] { + color: var(--p-text-muted-color); + margin: 21px 0 7px; +} +.payment-success > strong[data-v-b3b3cd9c] { + font-size: 1.75rem; + font-weight: 400; +} +.payment-success dl[data-v-b3b3cd9c] { + border-block: 1px solid var(--p-content-border-color); + margin: 42px 0; + padding-block: 28px; +} +.payment-success dl > div[data-v-b3b3cd9c] { + text-align: right; + justify-content: space-between; + gap: 21px; + margin: 10px 0; + display: flex; +} +.payment-success dt[data-v-b3b3cd9c] { + color: var(--p-text-muted-color); + flex-shrink: 0; +} +.payment-success dd[data-v-b3b3cd9c] { + overflow-wrap: anywhere; + margin: 0; +} +.success-actions[data-v-b3b3cd9c] { + grid-template-columns: 1fr 1fr; + gap: 14px; + display: grid; +} +@media (width<=900px) { + .payment-page .receipt-layout[data-v-b3b3cd9c] { + grid-template-columns: minmax(0, 1fr); + } + .payment-page[data-v-b3b3cd9c] { + max-width: 560px; + } + .payment-page .receipt[data-v-b3b3cd9c] { + min-height: 0; + } + .receipt-payment[data-v-b3b3cd9c] { + padding: 0 14px; + } + .receipt-payment > p[data-v-b3b3cd9c] { + margin-bottom: 28px; + } +} +@media (width<=600px) { + .receipt[data-v-b3b3cd9c] { + gap: 35px; + padding: 28px 14px 35px; + } + .receipt-header[data-v-b3b3cd9c] { + padding: 0; + } + .receipt-heading[data-v-b3b3cd9c] { + align-items: flex-start; + gap: 10px; + } + .receipt-icon[data-v-b3b3cd9c] { + width: 42px; + height: 42px; + } + .receipt-empty[data-v-b3b3cd9c], + .receipt-item[data-v-b3b3cd9c], + .receipt-table-head[data-v-b3b3cd9c], + .receipt-tx[data-v-b3b3cd9c], + .receipt-tx-head[data-v-b3b3cd9c] { + padding-inline: 0; + } + .receipt-table-head[data-v-b3b3cd9c], + .receipt-tx-head[data-v-b3b3cd9c] { + padding-inline: 8px; + } + .receipt-item[data-v-b3b3cd9c], + .receipt-tx[data-v-b3b3cd9c], + .receipt-tx-head[data-v-b3b3cd9c] { + font-size: 0.875rem; + } + .receipt-total[data-v-b3b3cd9c] { + padding-inline: 0; + } + .receipt-total strong[data-v-b3b3cd9c] { + font-size: 1.375rem; + } + .receipt-actions[data-v-b3b3cd9c] { + gap: 7px; + } + .receipt-actions > .p-button[data-v-b3b3cd9c] { + flex: auto; + min-width: 0; + padding-inline: 10px; + } + .credit-note[data-v-b3b3cd9c] { + margin-inline: 0; + } +} +@media print { + .receipt-actions[data-v-b3b3cd9c], + .receipt-feedback[data-v-b3b3cd9c], + .receipt-nav[data-v-b3b3cd9c], + .receipt-payment[data-v-b3b3cd9c] { + display: none; + } + .receipt[data-v-b3b3cd9c] { + box-shadow: none; + -moz-column-break-inside: avoid; + break-inside: avoid; + } + .payment-page[data-v-b3b3cd9c], + .receipt-page[data-v-b3b3cd9c] { + max-width: 700px; + } + .payment-page .receipt-layout[data-v-b3b3cd9c] { + grid-template-columns: minmax(0, 1fr); + } +} diff --git a/app/assets/styles/account.CTvLXxT_.css b/app/assets/styles/account.CTvLXxT_.css new file mode 100644 index 0000000..931165c --- /dev/null +++ b/app/assets/styles/account.CTvLXxT_.css @@ -0,0 +1,198 @@ +.acct[data-v-8ca4eb3d] { + gap: 16px; + width: 100%; + max-width: 64rem; + margin: 0 auto; + position: relative; +} +.acct[data-v-8ca4eb3d], +.warn-list[data-v-8ca4eb3d] { + flex-direction: column; + display: flex; +} +.warn-list[data-v-8ca4eb3d] { + gap: 12px; +} +.warn-row[data-v-8ca4eb3d] { + flex-wrap: wrap; + align-items: center; + gap: 14px; + display: flex; +} +.warn-name[data-v-8ca4eb3d] { + width: 80px; + font-size: 0.9375rem; + font-weight: 500; +} +.warn-select[data-v-8ca4eb3d] { + width: 150px; +} +.warn-err[data-v-8ca4eb3d] { + min-width: 160px; + color: var(--p-red-500, #ef4444); + flex: 1; + font-size: 0.875rem; +} +.sk[data-v-8ca4eb3d] { + padding: 4px 0; +} +.page-head[data-v-8ca4eb3d] { + align-items: center; + gap: 10px; + display: flex; +} +.page-head h2[data-v-8ca4eb3d] { + margin: 0; + font-size: 1.375rem; +} +.level-badge[data-v-8ca4eb3d] { + font: inherit; + cursor: pointer; + background: 0 0; + border: 1px solid; + border-radius: 999px; + padding: 2px 10px; + font-size: 0.875rem; +} +.tabs[data-v-8ca4eb3d] { + border-bottom: 1px solid var(--p-content-border-color, #e2e8f0); + gap: 0; + padding-top: 4px; + display: flex; + overflow: auto hidden; +} +.tab[data-v-8ca4eb3d] { + white-space: nowrap; + min-height: 50px; + color: var(--p-text-muted-color, #64748b); + cursor: pointer; + background: 0 0; + border: none; + border-bottom: 2px solid #0000; + flex-shrink: 0; + margin-bottom: -1px; + padding: 14px; + font-size: 1rem; + transition: + color 0.15s, + border-color 0.15s; +} +.tab[data-v-8ca4eb3d]:hover { + color: var(--p-text-color, #334155); +} +.tab.active[data-v-8ca4eb3d] { + color: var(--p-primary-color, #3b82f6); + border-bottom-color: var(--p-primary-color, #3b82f6); + font-weight: 500; +} +.panel[data-v-8ca4eb3d] { + background: 0 0; + border: 0; + border-radius: 0; + padding: 14px 0; +} +.sec-title[data-v-8ca4eb3d] { + margin: 0 0 28px; + font-size: 1.5rem; + font-weight: 400; +} +.sec-desc[data-v-8ca4eb3d] { + color: var(--p-text-muted-color, #64748b); + margin: 0 0 16px; + font-size: 0.9375rem; + line-height: 1.7; +} +.divider[data-v-8ca4eb3d] { + background: var(--p-content-border-color, #e2e8f0); + height: 1px; + margin-bottom: 20px; +} +.field[data-v-8ca4eb3d] { + flex-direction: column; + gap: 8px; + margin-bottom: 21px; + display: flex; +} +.field > .field-label[data-v-8ca4eb3d], +.field > label[data-v-8ca4eb3d] { + color: var(--p-text-color, #334155); + font-size: 0.9375rem; +} +.sr-only[data-v-8ca4eb3d] { + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + position: absolute; + overflow: hidden; +} +.inline[data-v-8ca4eb3d] { + flex-wrap: wrap; + align-items: center; + gap: 10px; + display: flex; +} +.inline[data-v-8ca4eb3d] > :first-child { + flex: 1; + min-width: 180px; +} +.code-select[data-v-8ca4eb3d] { + flex: 0 0 160px; +} +.actions[data-v-8ca4eb3d] { + border-top: 1px solid var(--p-content-border-color, #e2e8f0); + justify-content: flex-end; + gap: 10px; + margin-top: 4px; + padding-top: 18px; + display: flex; +} +@media (width<=768px) { + .tabs[data-v-8ca4eb3d] { + gap: 0; + } + .tab[data-v-8ca4eb3d] { + padding-inline: 10px; + } + .panel[data-v-8ca4eb3d] { + padding: 14px 0; + } +} +.page-head[data-v-8ca4eb3d] { + justify-content: flex-end; + position: absolute; + top: -5px; + right: 0; + transform: translateY(-100%); +} +.tabs[data-v-8ca4eb3d] { + scrollbar-width: thin; +} +.tab[data-v-8ca4eb3d]:focus-visible { + outline: 2px solid var(--p-primary-color); + outline-offset: -3px; +} +.account-shortcuts[data-v-8ca4eb3d] { + flex-wrap: wrap; + align-items: center; + gap: 10px; + display: flex; +} +.social-field .sec-desc[data-v-8ca4eb3d] { + margin: 7px 0; +} +@media (width<=640px) { + .acct[data-v-8ca4eb3d] { + gap: 14px; + } + .page-head[data-v-8ca4eb3d] { + position: static; + transform: none; + } + .inline[data-v-8ca4eb3d] > :first-child { + min-width: 0; + } +} diff --git a/app/assets/styles/api-keys.Bq3Csr53.css b/app/assets/styles/api-keys.Bq3Csr53.css new file mode 100644 index 0000000..100f85c --- /dev/null +++ b/app/assets/styles/api-keys.Bq3Csr53.css @@ -0,0 +1,46 @@ +.create-key[data-v-76e29360] { + border-top: 1px solid var(--console-panel-border); + flex-wrap: wrap; + align-items: flex-end; + gap: 10px; + padding-top: 21px; + display: flex; +} +.create-key-field[data-v-76e29360] { + flex-direction: column; + gap: 8px; + width: 100%; + min-width: 0; + max-width: 470px; + display: flex; +} +.create-key-field label[data-v-76e29360] { + font-size: 0.9375rem; +} +.create-key-field .p-inputtext[data-v-76e29360] { + width: 100%; +} +.row-actions[data-v-76e29360] { + flex-wrap: wrap; + align-items: center; + gap: 8px; + display: flex; +} +.token[data-v-76e29360] { + overflow-wrap: anywhere; + white-space: normal; +} +.muted[data-v-76e29360] { + color: var(--p-text-muted-color); + margin: 0; + font-size: 0.9375rem; +} +.whitelist-form[data-v-76e29360] { + gap: 16px; + display: grid; +} +@media (width<=640px) { + .create-key-field[data-v-76e29360] { + max-width: none; + } +} diff --git a/app/assets/styles/bind.CFZQE2UH.css b/app/assets/styles/bind.CFZQE2UH.css new file mode 100644 index 0000000..e96ab8d --- /dev/null +++ b/app/assets/styles/bind.CFZQE2UH.css @@ -0,0 +1,73 @@ +.session-status[data-v-146faed1] { + justify-content: center; + align-items: center; + gap: 16px; + margin-top: 20px; + display: flex; +} +.bind-intro[data-v-146faed1] { + color: var(--p-text-muted-color); + text-align: center; + margin: 0 0 28px; +} +fieldset[data-v-146faed1] { + border: 0; + margin: 0; + padding: 0; +} +legend[data-v-146faed1] { + margin-bottom: 8px; + display: block; +} +.input-row[data-v-146faed1] { + min-width: 0; + display: flex; +} +.input-row > input[data-v-146faed1] { + flex: 1; + width: 0; + min-width: 0; +} +.input-row[data-v-146faed1] > :first-child { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-row[data-v-146faed1] > :last-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.country[data-v-146faed1] { + border: 1px solid var(--p-form-field-border-color); + color: var(--p-text-color); + border-right: 0; + border-radius: 6px; + align-items: center; + padding: 8px; + display: flex; +} +.agreement[data-v-146faed1] { + align-items: flex-start; + gap: 10px; + display: flex; +} +.agreement[data-v-146faed1] .p-checkbox { + flex-shrink: 0; + margin-top: 4px; +} +@media (width<=360px) { + .input-row[data-v-146faed1]:has(button) { + flex-wrap: wrap; + gap: 10px; + } + .input-row:has(button) > input[data-v-146faed1] { + border-radius: var(--p-inputtext-border-radius); + flex-basis: 100%; + } + .input-row > button[data-v-146faed1] { + border-radius: var(--p-button-border-radius); + width: 100%; + } + .country[data-v-146faed1] { + padding-inline: 6px; + } +} diff --git a/app/assets/styles/blank.DOa3C9wi.css b/app/assets/styles/blank.DOa3C9wi.css new file mode 100644 index 0000000..509038c --- /dev/null +++ b/app/assets/styles/blank.DOa3C9wi.css @@ -0,0 +1,268 @@ +.blank-layout { + font-size: max(14px, 1rem); + line-height: 1.6; +} +.auth-shell { + border: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + border-radius: 16px; + grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); + width: min(880px, 100%); + display: grid; + overflow: hidden; + box-shadow: 0 10px 30px #0f172a0f; +} +.auth-shell > .auth-card { + width: 100%; + min-width: 0; + box-shadow: none; + border: 0; + border-radius: 0; + align-self: center; +} +.auth-card { + border: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + border-radius: 16px; + width: min(480px, 100%); + padding: 32px; + box-shadow: 0 10px 30px #0f172a0f; +} +.auth-card h1 { + text-align: center; + margin: 0 0 12px; + font-size: 1.71429em; + font-weight: 600; + line-height: 1.4; +} +.auth-card .login-brand { + text-align: center; + margin-bottom: 28px; +} +.auth-card .login-brand p { + color: var(--p-text-muted-color); + margin: 0; +} +.auth-card a { + color: var(--p-primary-color); + text-underline-offset: 3px; + text-decoration: none; +} +.auth-card a:hover { + text-decoration: underline; +} +.auth-card .bind-form, +.auth-card .login-form { + flex-direction: column; + gap: 20px; + display: flex; +} +.auth-card .field { + flex-direction: column; + gap: 8px; + min-width: 0; + display: flex; +} +.auth-card .field-label-row { + justify-content: space-between; + align-items: center; + gap: 12px; + display: flex; +} +.auth-card .field label, +.auth-card .method-label, +.auth-card legend { + color: var(--p-text-color); + font-size: 1em; + font-weight: 500; +} +.auth-card .field-link { + font-size: 1em; +} +.auth-card .p-inputtext { + min-width: 0; + min-height: 44px; + padding: 10px 12px; + font-size: 1em; + line-height: 1.5; +} +.auth-card .p-password { + font-size: 1em; +} +.auth-card .p-password-input { + padding-inline-end: 44px; +} +.auth-card .p-inputtext::placeholder { + color: var(--p-text-muted-color); + opacity: 1; +} +.auth-card .p-password-toggle-mask-icon { + width: 18px; + height: 18px; +} +.auth-card .p-button { + min-height: 44px; + font-size: 1em; +} +.auth-card .p-message { + font-size: 1em; +} +.auth-card .p-message-text { + font-size: 1em; + line-height: 1.6; +} +.auth-card .field .img { + height: 44px; + color: var(--p-text-color); +} +.auth-card .field .row > input { + width: 0; + min-width: 0; +} +.auth-card .login-btn { + min-height: 44px; + margin-top: 4px; +} +.auth-card .seg { + background: var(--p-content-hover-background); + border-radius: 10px; + gap: 4px; + padding: 4px; + display: flex; +} +.auth-card .seg button { + min-height: 44px; + color: var(--p-text-color); + cursor: pointer; + background: 0 0; + border: 1px solid #0000; + border-radius: 7px; + flex: 1; + padding: 8px; + font-size: 1em; +} +.auth-card .seg button.active { + border-color: var(--p-content-border-color); + background: var(--p-content-background); + color: var(--p-primary-color); + font-weight: 600; + box-shadow: 0 1px 3px #0f172a0f; +} +.auth-card .code-row { + gap: 10px; + display: flex; +} +.auth-card .code-row > input { + flex: 1; + width: 0; + min-width: 0; +} +.auth-card .code-row > button { + flex-shrink: 0; +} +.auth-card .login-links { + justify-content: center; + display: flex; +} +.auth-card .req { + color: var(--p-red-600, #dc2626); +} +@media (width<=760px) { + .auth-shell { + grid-template-columns: minmax(0, 1fr); + width: min(480px, 100%); + } + .auth-card .p-inputtext { + font-size: max(16px, 1em); + } +} +@media (width<=480px) { + .auth-card { + padding: 32px 24px; + } +} +@media (width<=360px) { + .auth-card { + padding: 28px 20px; + } + .auth-card .code-row { + flex-wrap: wrap; + } + .auth-card .code-row > input { + flex-basis: 100%; + } + .auth-card .code-row > button { + width: 100%; + } +} +.auth-card a.register-btn { + width: 100%; + color: var(--p-button-secondary-color); + text-decoration: none; +} +.blank-layout[data-v-69ca9392] { + min-height: 100dvh; + color: var(--p-text-color); + background: #f7fcff; +} +.app-dark .blank-layout { + background: #09090b; +} +.auth-topbar[data-v-69ca9392] { + background: var(--p-content-background); + border-bottom: 1px solid var(--p-content-border-color); + justify-content: space-between; + height: 56px; + padding: 0 14px; +} +.auth-logo[data-v-69ca9392], +.auth-topbar[data-v-69ca9392] { + align-items: center; + display: flex; +} +.auth-logo[data-v-69ca9392] { + color: var(--p-text-color); + text-decoration: none; +} +.auth-logo img[data-v-69ca9392] { + -o-object-fit: contain; + object-fit: contain; + width: 164px; + height: auto; + max-height: 34px; + display: block; +} +.auth-top-actions[data-v-69ca9392] { + align-items: center; + gap: 14px; + display: flex; +} +.auth-theme[data-v-69ca9392] { + color: inherit; + cursor: pointer; + background: 0 0; + border: 0; + padding: 9px; +} +.auth-login[data-v-69ca9392] { + color: #fff; + background: var(--p-primary-color); + border-radius: 6px; + padding: 7px 10.5px; + text-decoration: none; +} +.auth-main[data-v-69ca9392] { + justify-content: center; + align-items: center; + min-height: calc(100dvh - 56px); + padding: 28px 14px; + display: flex; +} +@media (width<=600px) { + .auth-logo img[data-v-69ca9392] { + width: 144px; + } + .auth-main[data-v-69ca9392] { + padding: 21px 14px; + } +} diff --git a/app/assets/styles/cart.CSS2vTmS.css b/app/assets/styles/cart.CSS2vTmS.css new file mode 100644 index 0000000..6d44adc --- /dev/null +++ b/app/assets/styles/cart.CSS2vTmS.css @@ -0,0 +1,299 @@ +.page[data-v-11d8a39a] { + flex-direction: column; + gap: 21px; + width: 100%; + min-width: 0; + padding-bottom: 28px; + display: flex; +} +.page-head[data-v-11d8a39a] { + justify-content: space-between; + align-items: center; + gap: 12px; + min-height: 36px; + display: flex; +} +.page-head h2[data-v-11d8a39a] { + margin: 0; + font-size: 1.25rem; + font-weight: 650; + line-height: 2rem; +} +.page-heading p[data-v-11d8a39a] { + color: var(--p-text-muted-color); + margin: 4px 0 0; + font-size: 0.9375rem; +} +.cart-layout[data-v-11d8a39a] { + grid-template-columns: minmax(0, 3.15fr) minmax(270px, 1fr); + align-items: start; + gap: 20px; + display: grid; +} +.panel[data-v-11d8a39a] { + background: var(--p-content-background); + border: 1px solid var(--p-content-border-color); + border-radius: 8px; + min-width: 0; + padding: 20px; +} +.cart-head[data-v-11d8a39a] { + border-bottom: 1px solid var(--p-content-border-color); + align-items: center; + gap: 10px; + padding-bottom: 16px; + font-size: 1rem; + display: flex; +} +.head-text[data-v-11d8a39a] { + color: var(--p-text-color); + margin-right: auto; +} +.item-count[data-v-11d8a39a] { + margin-left: 12px; +} +.clear-btn[data-v-11d8a39a], +.item-count[data-v-11d8a39a] { + color: var(--p-text-muted-color); + font-size: 0.875rem; +} +.clear-btn[data-v-11d8a39a] { + cursor: pointer; + background: 0 0; + border: none; + margin-left: 8px; + padding: 0; +} +.clear-btn[data-v-11d8a39a]:hover { + color: var(--p-red-600, #dc2626); +} +.clear-btn[data-v-11d8a39a]:disabled { + cursor: not-allowed; + opacity: 0.6; +} +.cart-item[data-v-11d8a39a] { + border-bottom: 1px solid var(--p-content-border-color); + align-items: center; + gap: 14px; + padding: 24px 0; + display: flex; +} +.cart-item[data-v-11d8a39a]:last-child { + border-bottom: 0; +} +.item-main[data-v-11d8a39a] { + flex: 1; + min-width: 0; +} +.item-name[data-v-11d8a39a] { + overflow-wrap: anywhere; + font-size: 1rem; + font-weight: 500; +} +.item-configuration[data-v-11d8a39a] { + flex-direction: column; + gap: 5px; + margin: 10px 0 0; + font-size: 0.875rem; + line-height: 1.6; + display: flex; +} +.item-configuration-row[data-v-11d8a39a] { + align-items: baseline; + gap: 10px; + min-width: 0; + display: flex; +} +.item-configuration dt[data-v-11d8a39a] { + color: var(--p-text-muted-color); + overflow-wrap: anywhere; + flex: 0 0 88px; +} +.item-configuration dd[data-v-11d8a39a] { + min-width: 0; + color: var(--p-text-color); + overflow-wrap: anywhere; + margin: 0; +} +.item-configuration-empty[data-v-11d8a39a] { + color: var(--p-text-muted-color); + margin: 8px 0 0; + font-size: 0.875rem; +} +.item-main[data-v-11d8a39a] { + container-type: inline-size; +} +@container (width>=560px) { + .item-configuration[data-v-11d8a39a] { + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 6px 20px; + display: grid; + } +} +.cart-item > .p-checkbox[data-v-11d8a39a] { + align-self: start; + margin-top: 2px; +} +.item-qty[data-v-11d8a39a] { + border: 1px solid var(--p-content-border-color); + border-radius: 4px; + align-items: center; + gap: 0; + display: flex; +} +.item-qty[data-v-11d8a39a] .p-button { + border: 0; + border-radius: 0; + width: 28px; + min-width: 28px; + height: 34px; +} +.qty-num[data-v-11d8a39a] { + text-align: center; + min-width: 34px; + font-size: 1rem; +} +.item-price[data-v-11d8a39a] { + text-align: right; + min-width: 90px; + color: var(--p-primary-color); + font-size: 1.125rem; + font-weight: 600; +} +.quote-status[data-v-11d8a39a] { + color: var(--p-text-muted-color); + margin-bottom: 4px; + font-size: 0.875rem; +} +.quote-error[data-v-11d8a39a], +.quote-status[data-v-11d8a39a] { + font-weight: 400; + display: block; +} +.quote-error[data-v-11d8a39a] { + overflow-wrap: anywhere; + max-width: 200px; + font-size: 0.8125rem; +} +.cart-foot[data-v-11d8a39a] { + flex-direction: column; + gap: 18px; + display: flex; + position: sticky; + top: 76px; +} +.cart-foot h3[data-v-11d8a39a] { + margin: 0; + font-size: 1.125rem; + font-weight: 600; + line-height: 1.714rem; +} +.summary-line[data-v-11d8a39a] { + justify-content: space-between; + gap: 12px; + font-size: 1rem; + display: flex; +} +.summary-line > span[data-v-11d8a39a]:first-child { + color: var(--p-text-muted-color); +} +.foot-promo[data-v-11d8a39a] { + flex-direction: column; + align-items: stretch; + gap: 8px; + min-width: 0; + display: flex; +} +.foot-promo > label[data-v-11d8a39a] { + color: var(--p-text-muted-color); + font-size: 1rem; +} +.promo-input[data-v-11d8a39a] { + width: 100%; + min-width: 0; +} +.promo-count[data-v-11d8a39a] { + color: var(--p-green-600, #16a34a); + font-size: 0.875rem; +} +.foot-total[data-v-11d8a39a] { + border-top: 1px solid var(--p-content-border-color); + flex-direction: column; + gap: 8px; + padding-top: 16px; + font-size: 1.125rem; + font-weight: 600; + display: flex; +} +.total[data-v-11d8a39a] { + color: var(--p-primary-color); + overflow-wrap: anywhere; + font-size: 1.75rem; + font-weight: 650; +} +.checkout-note[data-v-11d8a39a] { + color: var(--p-text-muted-color); + margin: -6px 0 0; + font-size: 0.875rem; + line-height: 1.6; +} +.cart-foot > .p-button[data-v-11d8a39a] { + width: 100%; + min-height: 36px; +} +.empty-panel[data-v-11d8a39a] { + padding: 20px; +} +.empty-panel[data-v-11d8a39a] .list-empty { + justify-content: center; + min-height: 380px; +} +.empty-panel[data-v-11d8a39a] .p-button { + margin-top: 8px; +} +@media (width<=1023px) { + .cart-layout[data-v-11d8a39a] { + grid-template-columns: 1fr; + } + .cart-foot[data-v-11d8a39a] { + position: static; + } +} +@media (width<=639px) { + .page[data-v-11d8a39a] { + gap: 18px; + } + .page-head[data-v-11d8a39a] { + flex-wrap: wrap; + } + .panel[data-v-11d8a39a] { + padding: 16px; + } + .item-count[data-v-11d8a39a] { + margin-left: 0; + display: block; + } + .cart-head[data-v-11d8a39a] { + flex-wrap: wrap; + } + .cart-item[data-v-11d8a39a] { + grid-template-columns: auto minmax(0, 1fr) auto; + gap: 14px 10px; + display: grid; + } + .item-main[data-v-11d8a39a] { + grid-column: 2/-1; + } + .item-qty[data-v-11d8a39a] { + grid-area: 2/2; + width: max-content; + } + .item-price[data-v-11d8a39a] { + text-align: left; + grid-area: 3/2; + min-width: 0; + } + .cart-item > .p-button[data-v-11d8a39a] { + grid-area: 2/3; + } +} diff --git a/app/assets/styles/cloud-server.CcwlOXJ0.css b/app/assets/styles/cloud-server.CcwlOXJ0.css new file mode 100644 index 0000000..d525acd --- /dev/null +++ b/app/assets/styles/cloud-server.CcwlOXJ0.css @@ -0,0 +1,15 @@ +.cloud-order-page[data-v-ef3931f0] { + flex-direction: column; + gap: 32px; + width: 100%; + max-width: 1280px; + margin: 0 auto; + padding-bottom: 28px; + display: flex; +} +h2[data-v-ef3931f0] { + margin: 0; + font-size: 1.375rem; + font-weight: 500; + line-height: 2rem; +} diff --git a/app/assets/styles/create.gX6gpD00.css b/app/assets/styles/create.gX6gpD00.css new file mode 100644 index 0000000..9322c0c --- /dev/null +++ b/app/assets/styles/create.gX6gpD00.css @@ -0,0 +1,289 @@ +.page[data-v-710c7c49] { + flex-direction: column; + gap: 18px; + display: flex; +} +.page-head h2[data-v-710c7c49] { + margin: 10px 0 0; + font-size: 1.375rem; +} +.back[data-v-710c7c49] { + color: var(--p-text-muted-color, #94a3b8); + align-items: center; + gap: 6px; + font-size: 0.9375rem; + text-decoration: none; + display: inline-flex; +} +.back[data-v-710c7c49]:hover { + color: var(--p-primary-color, #10b981); +} +.panel[data-v-710c7c49] { + background: var(--p-content-background); + border: 1px solid var(--p-content-border-color, #e2e8f0); + border-radius: 12px; + max-width: 760px; + padding: 24px; +} +.form[data-v-710c7c49] { + gap: 18px; +} +.field[data-v-710c7c49], +.form[data-v-710c7c49] { + flex-direction: column; + display: flex; +} +.field[data-v-710c7c49] { + flex: 1; + gap: 6px; +} +.field label[data-v-710c7c49] { + color: var(--p-text-color, #334155); + font-size: 0.9375rem; +} +.field-row[data-v-710c7c49] { + gap: 16px; + display: flex; +} +.req[data-v-710c7c49] { + color: #ef4444; +} +.upload[data-v-710c7c49] { + flex-wrap: wrap; + align-items: center; + gap: 12px; + display: flex; +} +.file-input[data-v-710c7c49] { + color: var(--p-text-muted-color, #64748b); + font-size: 0.9375rem; +} +.uploading[data-v-710c7c49] { + color: var(--p-primary-color); + align-items: center; + gap: 6px; + display: inline-flex; +} +.hint[data-v-710c7c49], +.uploading[data-v-710c7c49] { + font-size: 0.875rem; +} +.hint[data-v-710c7c49] { + color: var(--p-text-muted-color, #94a3b8); +} +.files[data-v-710c7c49] { + flex-direction: column; + gap: 6px; + margin: 8px 0 0; + padding: 0; + list-style: none; + display: flex; +} +.files li[data-v-710c7c49] { + background: var(--p-content-hover-background); + border-radius: 6px; + align-items: center; + gap: 8px; + padding: 6px 10px; + font-size: 0.9375rem; + display: flex; +} +.files .fname[data-v-710c7c49] { + text-overflow: ellipsis; + white-space: nowrap; + flex: 1; + overflow: hidden; +} +.files .rm[data-v-710c7c49] { + color: var(--p-text-muted-color, #94a3b8); + cursor: pointer; + background: 0 0; + border: 0; + padding: 2px 4px; +} +.files .rm[data-v-710c7c49]:hover { + color: #ef4444; +} +.host-opt[data-v-710c7c49] { + flex-direction: column; + gap: 2px; + min-width: 0; + display: flex; +} +.host-opt-name[data-v-710c7c49] { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +.host-opt-meta[data-v-710c7c49] { + color: var(--p-text-muted-color, #94a3b8); + font-size: 0.875rem; +} +.actions[data-v-710c7c49] { + justify-content: flex-end; + gap: 10px; + display: flex; +} +.list-page[data-v-710c7c49] { + gap: 21px; +} +.list-head h2[data-v-710c7c49], +.page-head h2[data-v-710c7c49] { + margin: 0; + font-size: 1.125rem; + font-weight: 700; + line-height: 24.5px; +} +.list-toolbar[data-v-710c7c49], +.list-toolbar-right[data-v-710c7c49] { + justify-content: flex-start; + gap: 7px; +} +.list-search[data-v-710c7c49], +.list-select[data-v-710c7c49] { + width: 280px; +} +.list-table[data-v-710c7c49] { + border-radius: 6px; + box-shadow: 0 1px 3px #0f172a12; +} +.list-foot[data-v-710c7c49] { + justify-content: center; +} +.list-foot > .list-bulk[data-v-710c7c49]:empty { + display: none; +} +[data-v-710c7c49] .p-datatable-header-cell { + background: var(--p-content-hover-background); + padding: 10.5px 14px; + font-size: 1rem; + font-weight: 600; +} +[data-v-710c7c49] .p-datatable-tbody > tr > td { + padding: 10.5px 14px; + font-size: 1rem; +} +[data-v-710c7c49] .p-tag { + font-size: 0.875rem; + font-weight: 500; +} +[data-v-710c7c49] .list-empty { + gap: 14px; + min-height: 300px; + padding: 42px 21px; +} +[data-v-710c7c49] .list-empty i { + opacity: 1; + font-size: 1.875rem; +} +[data-v-710c7c49] .list-empty-title { + font-size: 1rem; +} +[data-v-710c7c49] .list-empty-desc { + font-size: 0.875rem; +} +.field[data-v-710c7c49] { + gap: 7px; +} +@media (width<=768px) { + .list-search[data-v-710c7c49], + .list-select[data-v-710c7c49], + .list-toolbar-right[data-v-710c7c49] { + width: 100%; + } +} +.ticket-create[data-v-710c7c49] { + width: 100%; + max-width: 896px; + margin: 0 auto; +} +.ticket-create h2[data-v-710c7c49] { + margin: 0 0 28px; + font-size: 1.5rem; + font-weight: 400; +} +.ticket-section[data-v-710c7c49] { + border-top: 1px solid var(--p-content-border-color); + grid-template-columns: 210px minmax(0, 1fr); + gap: 21px; + padding: 28px 0; + display: grid; +} +.ticket-section aside h3[data-v-710c7c49] { + margin: 7px 0; + font-size: 1rem; + font-weight: 400; +} +.ticket-section aside p[data-v-710c7c49] { + color: var(--p-text-muted-color); + margin: 0; + font-size: 1rem; + line-height: 1.5rem; +} +.section-fields[data-v-710c7c49] { + flex-direction: column; + gap: 14px; + min-width: 0; + display: flex; +} +.type-options[data-v-710c7c49] { + border: 0; + flex-wrap: wrap; + gap: 14px; + margin: 0; + padding: 0; + display: flex; +} +.type-options legend[data-v-710c7c49] { + margin-bottom: 7px; +} +.type-options label[data-v-710c7c49] { + align-items: center; + gap: 7px; + display: flex; +} +.upload-drop[data-v-710c7c49] { + border: 1px dashed var(--p-content-border-color); + cursor: pointer; + border-radius: 6px; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 14px; + height: 224px; + display: flex; + position: relative; +} +.upload-drop input[data-v-710c7c49] { + opacity: 0; + cursor: pointer; + position: absolute; + inset: 0; +} +.upload-drop b[data-v-710c7c49] { + color: var(--p-primary-color); + font-weight: 400; +} +.upload-drop small[data-v-710c7c49] { + color: var(--p-text-muted-color); + font-size: 0.875rem; +} +.cancel-link[data-v-710c7c49] { + color: var(--p-text-muted-color); + padding: 8px 14px; + text-decoration: none; +} +#content[data-v-710c7c49] { + min-height: 264px; +} +.field label[data-v-710c7c49] { + font-size: 1rem; +} +@media (width<=768px) { + .ticket-section[data-v-710c7c49] { + grid-template-columns: 1fr; + } + .ticket-section aside[data-v-710c7c49] { + max-width: 100%; + } +} diff --git a/app/assets/styles/customize.Cc123Awf.css b/app/assets/styles/customize.Cc123Awf.css new file mode 100644 index 0000000..771d6e3 --- /dev/null +++ b/app/assets/styles/customize.Cc123Awf.css @@ -0,0 +1,45 @@ +.dedicated-customize[data-v-5618b27d] { + flex-direction: column; + gap: 32px; + width: 100%; + max-width: 1280px; + margin: 0 auto; + padding-bottom: 28px; + display: flex; +} +.dedicated-customize header[data-v-5618b27d] { + justify-content: space-between; + align-items: center; + gap: 14px; + min-height: 36px; + display: flex; +} +.dedicated-customize h1[data-v-5618b27d] { + margin: 0; + font-size: 1.375rem; + font-weight: 500; +} +.product-links[data-v-5618b27d] { + gap: 18px; + display: flex; +} +.product-links a[data-v-5618b27d] { + color: var(--p-text-muted-color); + align-items: center; + gap: 5px; + font-size: 0.9375rem; + text-decoration: none; + display: inline-flex; +} +.product-links a[data-v-5618b27d]:hover { + color: var(--p-primary-color); +} +@media (width<=639px) { + .dedicated-customize header[data-v-5618b27d] { + flex-wrap: wrap; + gap: 8px; + } + .dedicated-customize[data-v-5618b27d] { + gap: 28px; + } +} diff --git a/app/assets/styles/dedicated-server.CiJfMYtk.css b/app/assets/styles/dedicated-server.CiJfMYtk.css new file mode 100644 index 0000000..e7b61c3 --- /dev/null +++ b/app/assets/styles/dedicated-server.CiJfMYtk.css @@ -0,0 +1,391 @@ +.dedicated-catalog[data-v-e16eb167] { + width: 100%; + max-width: 1280px; + margin: 0 auto; + padding-bottom: 28px; +} +.catalog-head[data-v-e16eb167] { + justify-content: space-between; + align-items: center; + gap: 14px; + margin-bottom: 35px; + display: flex; +} +.catalog-head h1[data-v-e16eb167] { + margin: 0; + font-size: 1.375rem; + font-weight: 400; +} +.catalog-head a[data-v-e16eb167] { + color: var(--p-text-muted-color); + font-size: 0.875rem; + text-decoration: none; +} +.catalog-layout[data-v-e16eb167] { + grid-template-columns: 304px minmax(0, 1fr); + align-items: start; + gap: 21px; + display: grid; +} +.catalog-layout.has-selection[data-v-e16eb167] { + grid-template-columns: 240px minmax(0, 1fr) minmax(0, 1fr); +} +h2[data-v-e16eb167] { + border-bottom: 1px solid var(--p-content-border-color); + margin: 0 0 14px; + padding: 0 0 14px; + font-size: 1rem; + font-weight: 400; + line-height: 1.5rem; +} +.filter-panel[data-v-e16eb167], +.hardware-card[data-v-e16eb167] { + border: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + border-radius: 6px; + box-shadow: 0 1px 3px #0000001a; +} +.filter-panel[data-v-e16eb167] { + padding: 0 16px 7px; +} +details[data-v-e16eb167] { + border-bottom: 1px solid var(--p-content-border-color); +} +summary[data-v-e16eb167] { + cursor: pointer; + justify-content: space-between; + padding: 16px 0; + font-weight: 500; + list-style: none; + display: flex; +} +summary[data-v-e16eb167]::-webkit-details-marker { + display: none; +} +summary > i[data-v-e16eb167] { + align-self: center; + font-size: 0.875rem; +} +details[open] > summary > i[data-v-e16eb167] { + transform: rotate(180deg); +} +.price-range[data-v-e16eb167] { + align-items: center; + gap: 7px; + margin: 7px 0 12px; + display: flex; +} +.price-range[data-v-e16eb167] .p-inputnumber { + flex: 1; + width: 0; +} +.price-range[data-v-e16eb167] input { + width: 100%; + min-width: 0; +} +.filter-panel small[data-v-e16eb167] { + color: var(--p-text-muted-color); + padding-bottom: 14px; + font-size: 0.8125rem; + line-height: 1.6; + display: block; +} +.filter-options[data-v-e16eb167] { + flex-wrap: wrap; + gap: 7px; + padding-bottom: 14px; + display: flex; +} +.filter-options button[data-v-e16eb167] { + border: 1px solid var(--p-content-border-color); + color: var(--p-text-color); + cursor: pointer; + background: 0 0; + border-radius: 4px; + padding: 4px 7px; + font-size: 0.875rem; +} +.filter-options button.active[data-v-e16eb167] { + border-color: var(--p-primary-color); + background: var(--p-highlight-background); + color: var(--p-highlight-color); +} +.filter-empty[data-v-e16eb167] { + color: var(--p-text-muted-color); + font-size: 0.875rem; +} +.catalog-lines[data-v-e16eb167], +.catalog-products[data-v-e16eb167] { + min-width: 0; +} +.hardware-card[data-v-e16eb167] { + margin-bottom: 14px; + padding: 17px 15px; +} +.hardware-card.selected[data-v-e16eb167] { + outline: 2px solid var(--p-primary-color); + background: var(--p-highlight-background); +} +.hardware-card h3[data-v-e16eb167] { + margin: 0 0 24px; + font-size: 1.125rem; + font-weight: 600; +} +.hardware-body[data-v-e16eb167] { + grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr) auto; + align-items: center; + gap: 21px; + display: grid; +} +.hardware-spec[data-v-e16eb167] { + align-items: center; + gap: 14px; + min-width: 0; + display: flex; +} +.hardware-spec i[data-v-e16eb167], +.line-specs i[data-v-e16eb167] { + color: var(--p-primary-color); +} +.hardware-spec > div[data-v-e16eb167] { + flex-direction: column; + min-width: 0; + display: flex; +} +.hardware-spec span[data-v-e16eb167] { + color: var(--p-text-muted-color); + font-size: 0.875rem; +} +.hardware-spec strong[data-v-e16eb167] { + overflow-wrap: anywhere; + font-size: 1rem; + font-weight: 500; +} +.hardware-spec small[data-v-e16eb167] { + color: var(--p-text-muted-color); + font-size: 0.8125rem; +} +.hardware-buy[data-v-e16eb167] { + background: var(--p-content-hover-background); + border-radius: 6px; + align-items: center; + gap: 10px; + padding: 4px; + display: flex; +} +.hardware-buy > span[data-v-e16eb167] { + text-align: right; + flex-direction: column; + display: flex; +} +.hardware-buy strong[data-v-e16eb167] { + white-space: nowrap; + font-size: 1.25rem; +} +.hardware-buy small[data-v-e16eb167] { + color: var(--p-text-muted-color); + font-size: max(11px, 0.625rem); +} +.hardware-buy[data-v-e16eb167] button { + min-width: 112px; +} +.hardware-card footer[data-v-e16eb167] { + color: var(--p-text-muted-color); + justify-content: space-between; + gap: 14px; + margin-top: 24px; + font-size: 0.875rem; + display: flex; +} +.has-selection .hardware-body[data-v-e16eb167] { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} +.has-selection .hardware-buy[data-v-e16eb167] { + grid-column: 1/-1; + justify-self: end; + margin-top: 7px; +} +.has-selection .hardware-card h3[data-v-e16eb167] { + margin-bottom: 21px; +} +.catalog-state[data-v-e16eb167] { + text-align: center; + border: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + border-radius: 6px; + flex-direction: column; + align-items: center; + gap: 14px; + min-height: 260px; + padding: 70px 21px; + display: flex; +} +.catalog-state > i[data-v-e16eb167] { + color: var(--p-text-muted-color); + font-size: 2rem; +} +.catalog-state h3[data-v-e16eb167] { + margin: 0; + font-size: 1.125rem; +} +.catalog-state p[data-v-e16eb167] { + color: var(--p-text-muted-color); + margin: 0; + font-size: 0.9375rem; +} +.line-heading[data-v-e16eb167] { + border-bottom: 1px solid var(--p-content-border-color); + justify-content: space-between; + align-items: center; + min-height: 36px; + margin-bottom: 14px; + display: flex; +} +.line-heading h2[data-v-e16eb167] { + border: 0; + margin: 0; + padding: 0; +} +.line-panel[data-v-e16eb167] { + border: 1px solid var(--p-content-border-color); + background: var(--p-highlight-background); + border-radius: 6px; + padding: 0 17px; +} +.line-card[data-v-e16eb167] { + border-bottom: 1px solid var(--p-content-border-color); + padding: 17px 0; +} +.line-card[data-v-e16eb167]:last-child { + border: 0; +} +.line-tags[data-v-e16eb167] { + flex-wrap: wrap; + gap: 8px; + margin-bottom: 21px; + display: flex; +} +.line-specs[data-v-e16eb167] { + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 14px; + display: grid; +} +.line-specs > div[data-v-e16eb167] { + align-items: center; + gap: 10px; + min-width: 0; + display: flex; +} +.line-specs span[data-v-e16eb167] { + color: var(--p-text-muted-color); + font-size: 0.875rem; +} +.line-specs strong[data-v-e16eb167] { + color: var(--p-text-color); + font-size: 1rem; + font-weight: 500; + display: block; +} +.line-action[data-v-e16eb167] { + justify-content: flex-end; + align-items: center; + gap: 10px; + margin-top: 21px; + display: flex; +} +.line-action .line-order-link[data-v-e16eb167] { + white-space: nowrap; + flex-shrink: 0; + justify-content: center; + align-items: center; + gap: 7px; + min-width: 112px; + text-decoration: none; + display: inline-flex; +} +.line-action > span[data-v-e16eb167] { + overflow-wrap: anywhere; + min-width: 0; + color: var(--p-text-muted-color); + font-size: 0.8125rem; +} +.line-empty[data-v-e16eb167] { + padding: 21px; + font-size: 0.9375rem; +} +.filter-options button[data-v-e16eb167]:focus-visible, +summary[data-v-e16eb167]:focus-visible { + outline: 2px solid var(--p-primary-color); + outline-offset: 3px; +} +@media (width>=1024px) { + .catalog-lines[data-v-e16eb167] { + position: sticky; + top: 76px; + } +} +@media (width<=1199px) { + .catalog-layout[data-v-e16eb167] { + grid-template-columns: 240px minmax(0, 1fr); + } + .hardware-body[data-v-e16eb167] { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + .hardware-buy[data-v-e16eb167] { + grid-column: 1/-1; + justify-self: end; + } + .catalog-layout.has-selection[data-v-e16eb167] { + grid-template-columns: 200px minmax(0, 1fr); + } + .catalog-lines[data-v-e16eb167] { + grid-area: 1/2; + position: static; + } + .has-selection .catalog-products[data-v-e16eb167] { + grid-column: 2; + } + .has-selection .catalog-filters[data-v-e16eb167] { + grid-row: 1 / span 2; + } +} +@media (width<=767px) { + .catalog-head[data-v-e16eb167] { + margin-bottom: 28px; + } + .catalog-layout[data-v-e16eb167], + .catalog-layout.has-selection[data-v-e16eb167] { + flex-direction: column; + gap: 28px; + display: flex; + } + .catalog-filters[data-v-e16eb167], + .catalog-lines[data-v-e16eb167], + .catalog-products[data-v-e16eb167] { + width: 100%; + } + .catalog-lines[data-v-e16eb167] { + order: -1; + } + .catalog-head h1[data-v-e16eb167] { + font-size: 1.375rem; + } + .hardware-body[data-v-e16eb167] { + gap: 14px; + } + .line-action[data-v-e16eb167] { + flex-wrap: wrap; + } + .line-specs[data-v-e16eb167] { + gap: 8px; + } + .line-specs > div[data-v-e16eb167] { + gap: 6px; + } + .line-specs strong[data-v-e16eb167] { + font-size: 0.875rem; + } + .catalog-state[data-v-e16eb167] { + padding: 42px 14px; + } +} diff --git a/app/assets/styles/default.DFUVVR1i.css b/app/assets/styles/default.DFUVVR1i.css new file mode 100644 index 0000000..aa89c22 --- /dev/null +++ b/app/assets/styles/default.DFUVVR1i.css @@ -0,0 +1,516 @@ +.console-layout[data-v-1a9c3b51] { + background: var(--console-page-bg); + min-height: 100dvh; + color: var(--p-text-color, #334155); + padding-top: 56px; +} +.console-layout.has-banner[data-v-1a9c3b51] { + padding-top: 94px; +} +.maintenance-banner[data-v-1a9c3b51] { + z-index: 150; + color: #92400e; + background: #fef3c7; + align-items: center; + gap: 8px; + height: 38px; + padding: 0 14px; + display: flex; + position: fixed; + inset: 0 0 auto; +} +.sidebar[data-v-1a9c3b51] { + z-index: 30; + background: var(--console-page-bg); + border-right: 1px solid var(--console-panel-border); + width: 210px; + position: fixed; + top: 56px; + bottom: 0; + left: 0; +} +.nav[data-v-1a9c3b51], +.sidebar[data-v-1a9c3b51] { + flex-direction: column; + display: flex; +} +.nav[data-v-1a9c3b51] { + overscroll-behavior: contain; + scrollbar-width: none; + flex: 1; + gap: 3.5px; + min-height: 0; + padding: 14px; + overflow-y: auto; +} +.nav[data-v-1a9c3b51] > * { + flex-shrink: 0; +} +.nav[data-v-1a9c3b51]::-webkit-scrollbar { + display: none; +} +.nav[data-v-1a9c3b51] .nav-section { + color: var(--p-text-muted-color); + padding: 17.5px 14px 7px; + font-size: max(11px, 0.65625rem); + font-weight: 600; +} +.nav[data-v-1a9c3b51] .nav-item { + width: 100%; + min-height: 35px; + color: inherit; + text-align: left; + cursor: pointer; + background: 0 0; + border: 0; + border-radius: 6px; + align-items: center; + gap: 10.5px; + padding: 8.75px 14px; + font-size: 1rem; + text-decoration: none; + display: flex; +} +.nav[data-v-1a9c3b51] .nav-item:hover, +.nav[data-v-1a9c3b51] .sub-item:hover { + background: var(--p-content-hover-background); +} +.nav[data-v-1a9c3b51] .nav-item.active { + font-weight: 500; +} +.nav[data-v-1a9c3b51] .nav-item.active:not(button), +.nav[data-v-1a9c3b51] .nav-item.router-link-exact-active, +.nav[data-v-1a9c3b51] .sub-item.active { + background: var(--console-panel-bg); + box-shadow: var(--console-panel-shadow); +} +.nav[data-v-1a9c3b51] .nav-label { + text-overflow: ellipsis; + white-space: nowrap; + flex: 1; + min-width: 0; + overflow: hidden; +} +.nav[data-v-1a9c3b51] .nav-unavailable { + color: var(--p-text-muted-color); + cursor: not-allowed; +} +.nav[data-v-1a9c3b51] .nav-icon { + flex: 0 0 20px; + width: 20px; + height: 20px; +} +.nav[data-v-1a9c3b51] .nav-arrow { + flex: 0 0 18px; + justify-content: center; + align-items: center; + width: 18px; + height: 18px; + font-size: 18px; + line-height: 1; + transition: transform 0.24s; + display: inline-flex; + transform: rotate(-90deg); +} +.nav[data-v-1a9c3b51] .nav-arrow.open { + transform: rotate(0); +} +.nav[data-v-1a9c3b51] .sub-nav { + grid-template-rows: 0fr; + transition: grid-template-rows 0.24s; + display: grid; +} +.nav[data-v-1a9c3b51] .sub-nav.open { + grid-template-rows: 1fr; +} +.nav[data-v-1a9c3b51] .sub-nav-clip { + min-height: 0; + overflow: hidden; +} +.nav[data-v-1a9c3b51] .sub-nav-items { + flex-direction: column; + gap: 3.5px; + padding-top: 3.5px; + display: flex; +} +.nav[data-v-1a9c3b51] .sub-item { + color: inherit; + border-radius: 6px; + padding: 8.75px 14px 8.75px 35px; + text-decoration: none; + display: block; +} +.main[data-v-1a9c3b51] { + flex-direction: column; + min-width: 0; + min-height: calc(100dvh - 56px); + margin-left: 210px; + display: flex; +} +.has-banner .main[data-v-1a9c3b51] { + min-height: calc(100dvh - 94px); +} +.topbar[data-v-1a9c3b51] { + z-index: 35; + background: var(--console-panel-bg); + border-bottom: 1px solid var(--console-panel-border); + gap: 0; + height: 56px; + position: fixed; + inset: 0 0 auto; +} +.brand-group[data-v-1a9c3b51], +.topbar[data-v-1a9c3b51] { + align-items: center; + display: flex; +} +.brand-group[data-v-1a9c3b51] { + flex: 0 0 210px; + height: 100%; +} +.brand[data-v-1a9c3b51] { + color: inherit; + letter-spacing: 0.4px; + white-space: nowrap; + align-items: center; + gap: 7px; + padding: 0 14px; + font-size: 1.25rem; + font-weight: 700; + text-decoration: none; + display: inline-flex; +} +.brand-logo[data-v-1a9c3b51] { + -o-object-fit: contain; + object-fit: contain; + flex-shrink: 0; + width: 176px; + height: auto; + max-height: 40px; + display: block; +} +.brand-icon[data-v-1a9c3b51] { + color: #0052d9; + flex-shrink: 0; + width: 35px; + height: 35px; +} +.app-dark .brand-icon[data-v-1a9c3b51] { + color: #fff; +} +.crumbs[data-v-1a9c3b51] { + align-items: center; + gap: 12px; + min-width: 0; + height: 100%; + padding-left: 8px; + font-size: 1.125rem; + line-height: 1.4; + display: flex; + overflow: hidden; +} +.crumb-home[data-v-1a9c3b51], +.crumb-sep[data-v-1a9c3b51] { + flex-shrink: 0; + justify-content: center; + align-items: center; + line-height: 1; + display: inline-flex; +} +.crumb-home[data-v-1a9c3b51] { + width: 44px; + height: 44px; + color: var(--p-text-muted-color); + text-decoration: none; +} +.crumb-home > i[data-v-1a9c3b51] { + justify-content: center; + align-items: center; + width: 24px; + height: 24px; + font-size: 22px; + line-height: 1; + display: inline-flex; +} +.crumb-sep[data-v-1a9c3b51] { + font-size: 14px; +} +.crumb[data-v-1a9c3b51], +.crumb-sep[data-v-1a9c3b51] { + color: var(--p-text-muted-color); +} +.crumb[data-v-1a9c3b51] { + white-space: nowrap; + line-height: 1.4; + display: block; +} +.crumb.current[data-v-1a9c3b51] { + color: inherit; + text-overflow: ellipsis; + overflow: hidden; +} +.topbar-right[data-v-1a9c3b51] { + flex-shrink: 0; + align-items: center; + gap: 10px; + height: 100%; + margin-left: auto; + padding: 0 14px; + display: flex; +} +.nav-toggle[data-v-1a9c3b51], +.theme-btn[data-v-1a9c3b51], +.user-chip[data-v-1a9c3b51] { + width: 44px; + height: 44px; + color: inherit; + cursor: pointer; + background: 0 0; + border: 0; + border-radius: 50%; + flex-shrink: 0; + padding: 0; + font-size: 1rem; +} +.nav-toggle[data-v-1a9c3b51], +.nav-toggle > i[data-v-1a9c3b51], +.theme-btn[data-v-1a9c3b51], +.theme-btn > i[data-v-1a9c3b51], +.user-chip[data-v-1a9c3b51], +.user-chip > i[data-v-1a9c3b51] { + justify-content: center; + align-items: center; + line-height: 1; + display: inline-flex; +} +.nav-toggle > i[data-v-1a9c3b51], +.theme-btn > i[data-v-1a9c3b51], +.user-chip > i[data-v-1a9c3b51] { + width: 24px; + height: 24px; + font-size: 22px; +} +.nav-toggle[data-v-1a9c3b51]:hover, +.theme-btn[data-v-1a9c3b51]:hover, +.user-chip[data-v-1a9c3b51]:hover { + background: var(--p-content-hover-background); +} +.nav-toggle[data-v-1a9c3b51] { + display: none; +} +.content[data-v-1a9c3b51] { + flex: 1; + width: 100%; + min-width: 0; + max-width: 1600px; + margin: 0 auto; + padding: 14px 14px 112px; +} +.content[data-v-1a9c3b51]:focus { + outline: none; +} +.nav-close[data-v-1a9c3b51] { + clip-path: inset(50%); + border: 0; + width: 1px; + height: 1px; + padding: 0; + position: absolute; + overflow: hidden; +} +.nav-close[data-v-1a9c3b51]:focus-visible { + clip-path: none; + background: var(--console-panel-bg); + z-index: 1; + width: 32px; + height: 32px; + top: 4px; + right: 4px; +} +.nav-backdrop[data-v-1a9c3b51] { + z-index: 49; + background: #0006; + position: fixed; + inset: 0; +} +.mail-btn[data-v-1a9c3b51] { + position: relative; +} +.mail-badge[data-v-1a9c3b51] { + min-width: 18px; + height: 18px; + font-size: 0.75rem; + line-height: 18px; + position: absolute; + top: -1px; + right: -2px; +} +.mail-pop[data-v-1a9c3b51] { + width: 100%; +} +.mail-pop-list[data-v-1a9c3b51] { + max-height: 360px; + overflow: auto; +} +.mail-pop-item[data-v-1a9c3b51], +.mail-pop-list[data-v-1a9c3b51] { + flex-direction: column; + display: flex; +} +.mail-pop-item[data-v-1a9c3b51] { + border: 0; + border-bottom: 1px solid var(--console-panel-border); + text-align: left; + cursor: pointer; + width: 100%; + color: inherit; + background: 0 0; + gap: 4px; + padding: 14px; +} +.mail-pop-item[data-v-1a9c3b51]:hover { + background: var(--p-content-hover-background); +} +.mail-pop-title[data-v-1a9c3b51] { + align-items: center; + gap: 7px; + display: flex; +} +.mail-pop-dot[data-v-1a9c3b51] { + background: var(--p-primary-color); + border-radius: 50%; + width: 6px; + height: 6px; +} +.mail-pop-time[data-v-1a9c3b51] { + color: var(--p-text-muted-color); + font-size: 0.875rem; +} +.mail-pop-empty[data-v-1a9c3b51] { + flex-direction: column; + justify-content: center; + align-items: center; + gap: 7px; + height: 315px; + display: flex; +} +.mail-pop-empty i[data-v-1a9c3b51] { + margin-bottom: 14px; + font-size: 2rem; +} +.mail-pop-empty strong[data-v-1a9c3b51] { + font-size: 1.25rem; + font-weight: 500; +} +.mail-pop-empty span[data-v-1a9c3b51] { + color: var(--p-text-muted-color); + font-size: 0.875rem; +} +.mail-pop-foot[data-v-1a9c3b51] { + width: 100%; + color: var(--p-primary-color); + cursor: pointer; + background: 0 0; + border: 0; + padding: 10px; + display: block; +} +.skip-link[data-v-1a9c3b51] { + z-index: 200; + background: var(--p-primary-color); + color: #fff; + border-radius: 6px; + padding: 12px 18px; + text-decoration: none; + position: fixed; + top: 8px; + left: 14px; + transform: translateY(-160%); +} +.skip-link[data-v-1a9c3b51]:focus { + transform: translateY(0); +} +.has-banner .topbar[data-v-1a9c3b51] { + top: 38px; +} +.has-banner .sidebar[data-v-1a9c3b51] { + top: 94px; +} +@media (width<=1535px) { + .main[data-v-1a9c3b51] { + margin-left: 0; + } + .sidebar[data-v-1a9c3b51] { + z-index: 50; + border-right: 0; + width: 280px; + transition: transform 0.2s; + top: 0; + transform: translate(-100%); + } + .sidebar.open[data-v-1a9c3b51] { + transform: translate(0); + } + .nav-toggle[data-v-1a9c3b51] { + display: inline-flex; + } + .brand[data-v-1a9c3b51] { + padding-right: 7px; + } + .brand-group[data-v-1a9c3b51] { + flex: none; + } + .has-banner .sidebar[data-v-1a9c3b51] { + top: 0; + } +} +@media (width<=767px) { + .crumbs[data-v-1a9c3b51] { + display: none; + } + .brand[data-v-1a9c3b51] { + font-size: 1.25rem; + } + .topbar-right[data-v-1a9c3b51] { + gap: 4px; + padding: 0 10px 0 0; + } + .nav-toggle[data-v-1a9c3b51], + .theme-btn[data-v-1a9c3b51], + .user-chip[data-v-1a9c3b51] { + width: 40px; + height: 40px; + } + .brand[data-v-1a9c3b51] { + gap: 5px; + font-size: 1.125rem; + } + .brand-logo[data-v-1a9c3b51] { + width: 144px; + } + .brand-icon[data-v-1a9c3b51] { + width: 30px; + height: 30px; + } + .brand-group[data-v-1a9c3b51] { + flex-basis: auto; + } +} +@media (width<=359px) { + .brand[data-v-1a9c3b51] { + gap: 5px; + padding: 0 4px 0 8px; + font-size: 1.0625rem; + } + .brand-logo[data-v-1a9c3b51] { + width: 120px; + } + .brand-icon[data-v-1a9c3b51] { + width: 28px; + height: 28px; + } + .topbar-right[data-v-1a9c3b51] { + gap: 0; + padding-right: 8px; + } +} diff --git a/app/assets/styles/domains.GiD6NSti.css b/app/assets/styles/domains.GiD6NSti.css new file mode 100644 index 0000000..aee97ed --- /dev/null +++ b/app/assets/styles/domains.GiD6NSti.css @@ -0,0 +1,113 @@ +.field[data-v-0a28aca5] { + flex-direction: column; + gap: 6px; + display: flex; +} +.field label[data-v-0a28aca5] { + color: var(--p-text-color, #334155); + font-size: 0.9375rem; +} +.req[data-v-0a28aca5] { + color: #ef4444; +} +.tip[data-v-0a28aca5] { + line-height: 1.7; +} +.sub[data-v-0a28aca5], +.tip[data-v-0a28aca5] { + color: var(--p-text-muted-color, #94a3b8); + font-size: 0.875rem; +} +.confirm-text[data-v-0a28aca5] { + margin: 0 0 12px; + font-size: 1rem; +} +.cert-link[data-v-0a28aca5] { + color: var(--p-primary-color, #3b82f6); + text-decoration: none; +} +.list-page[data-v-0a28aca5] { + gap: 21px; +} +.list-head h2[data-v-0a28aca5], +.page-head h2[data-v-0a28aca5] { + margin: 0; + font-size: 1.125rem; + font-weight: 700; + line-height: 24.5px; +} +.list-toolbar[data-v-0a28aca5], +.list-toolbar-right[data-v-0a28aca5] { + justify-content: flex-start; + gap: 7px; +} +.list-search[data-v-0a28aca5], +.list-select[data-v-0a28aca5] { + width: 280px; +} +.list-table[data-v-0a28aca5] { + border-radius: 6px; + box-shadow: 0 1px 3px #0f172a12; +} +.list-foot[data-v-0a28aca5] { + justify-content: center; +} +.list-foot > .list-bulk[data-v-0a28aca5]:empty { + display: none; +} +[data-v-0a28aca5] .p-datatable-header-cell { + background: var(--p-content-hover-background); + padding: 10.5px 14px; + font-size: 1rem; + font-weight: 600; +} +[data-v-0a28aca5] .p-datatable-tbody > tr > td { + padding: 10.5px 14px; + font-size: 1rem; +} +[data-v-0a28aca5] .p-tag { + font-size: 0.875rem; + font-weight: 500; +} +[data-v-0a28aca5] .list-empty { + gap: 14px; + min-height: 300px; + padding: 42px 21px; +} +[data-v-0a28aca5] .list-empty i { + opacity: 1; + font-size: 1.875rem; +} +[data-v-0a28aca5] .list-empty-title { + font-size: 1rem; +} +[data-v-0a28aca5] .list-empty-desc { + font-size: 0.875rem; +} +.field[data-v-0a28aca5] { + gap: 7px; +} +.field label[data-v-0a28aca5] { + font-size: 0.875rem; +} +@media (width<=768px) { + .list-search[data-v-0a28aca5], + .list-select[data-v-0a28aca5], + .list-toolbar-right[data-v-0a28aca5] { + width: 100%; + } +} +.domain-notice[data-v-0a28aca5] { + padding: 7px; + font-size: 1rem; + line-height: 24.5px; +} +.domain-notice p[data-v-0a28aca5] { + margin: 7px 0 0; +} +.domain-notice a[data-v-0a28aca5] { + color: var(--p-primary-color); +} +.domain-notice strong[data-v-0a28aca5] { + font-size: 1.125rem; +} diff --git a/app/assets/styles/entry.Cs9kvuGi.css b/app/assets/styles/entry.Cs9kvuGi.css new file mode 100644 index 0000000..62fb4f6 --- /dev/null +++ b/app/assets/styles/entry.Cs9kvuGi.css @@ -0,0 +1,2407 @@ +@font-face { + font-family: primeicons; + font-display: block; + src: url(/icons/primeicons.C1oiW3xv.eot); + src: + url(/icons/primeicons.C1oiW3xv.eot?#iefix) format("embedded-opentype"), + url(/icons/primeicons.Cw7jw2u3.woff2) format("woff2"), + url(/icons/primeicons.DFbS0HxT.woff) format("woff"), + url(/icons/primeicons.MNyB0pWW.ttf) format("truetype"), + url(/icons/primeicons.DI7WxhAS.svg?#primeicons) format("svg"); + font-weight: 400; + font-style: normal; +} +.pi { + speak: none; + font-variant: normal; + text-transform: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + font-family: primeicons; + font-style: normal; + font-weight: 400; + line-height: 1; + display: inline-block; +} +.pi:before { + --webkit-backface-visibility: hidden; + backface-visibility: hidden; +} +.pi-fw { + text-align: center; + width: 1.28571em; +} +.pi-spin { + animation: 2s linear infinite fa-spin; +} +@media (prefers-reduced-motion: reduce) { + .pi-spin { + transition-duration: 0s; + transition-delay: 0s; + animation-duration: 1ms; + animation-iteration-count: 1; + animation-delay: -1ms; + } +} +@keyframes fa-spin { + 0% { + transform: rotate(0); + } + to { + transform: rotate(359deg); + } +} +.pi-eye-dropper:before { + content: ""; +} +.pi-code-branch:before { + content: ""; +} +.pi-signature:before { + content: ""; +} +.pi-stamp:before { + content: ""; +} +.pi-rectangle-xmark:before { + content: ""; +} +.pi-note-sticky:before { + content: ""; +} +.pi-sidebar:before { + content: ""; +} +.pi-slash:before { + content: ""; +} +.pi-grid-2:before { + content: ""; +} +.pi-columns-2:before { + content: ""; +} +.pi-rows-2:before { + content: ""; +} +.pi-square:before { + content: ""; +} +.pi-compress:before { + content: ""; +} +.pi-pen-line:before { + content: ""; +} +.pi-case-sensitive:before { + content: ""; +} +.pi-text-color:before { + content: ""; +} +.pi-list-tree:before { + content: ""; +} +.pi-highlighter:before { + content: ""; +} +.pi-text:before { + content: ""; +} +.pi-heading-6:before { + content: ""; +} +.pi-heading-5:before { + content: ""; +} +.pi-heading-4:before { + content: ""; +} +.pi-heading-3:before { + content: ""; +} +.pi-heading-2:before { + content: ""; +} +.pi-heading-1:before { + content: ""; +} +.pi-heading:before { + content: ""; +} +.pi-grip:before { + content: ""; +} +.pi-grip-horizontal:before { + content: ""; +} +.pi-grip-vertical:before { + content: ""; +} +.pi-paragraph-right:before { + content: ""; +} +.pi-paragraph-left:before { + content: ""; +} +.pi-arrow-u-turn-up-left:before { + content: ""; +} +.pi-arrow-u-turn-up-right:before { + content: ""; +} +.pi-horizontal-rule:before { + content: ""; +} +.pi-outdent:before { + content: ""; +} +.pi-indent:before { + content: ""; +} +.pi-list-ol:before { + content: ""; +} +.pi-block-quote:before { + content: ""; +} +.pi-superscript:before { + content: ""; +} +.pi-subscript:before { + content: ""; +} +.pi-strikethrough:before { + content: ""; +} +.pi-underline:before { + content: ""; +} +.pi-italic:before { + content: ""; +} +.pi-bold:before { + content: ""; +} +.pi-dot:before { + content: ""; +} +.pi-folder-plus:before { + content: ""; +} +.pi-receipt:before { + content: ""; +} +.pi-asterisk:before { + content: ""; +} +.pi-face-smile:before { + content: ""; +} +.pi-pinterest:before { + content: ""; +} +.pi-expand:before { + content: ""; +} +.pi-pen-to-square:before { + content: ""; +} +.pi-wave-pulse:before { + content: ""; +} +.pi-turkish-lira:before { + content: ""; +} +.pi-spinner-dotted:before { + content: ""; +} +.pi-crown:before { + content: ""; +} +.pi-pause-circle:before { + content: ""; +} +.pi-warehouse:before { + content: ""; +} +.pi-objects-column:before { + content: ""; +} +.pi-clipboard:before { + content: ""; +} +.pi-play-circle:before { + content: ""; +} +.pi-venus:before { + content: ""; +} +.pi-cart-minus:before { + content: ""; +} +.pi-file-plus:before { + content: ""; +} +.pi-microchip:before { + content: ""; +} +.pi-twitch:before { + content: ""; +} +.pi-building-columns:before { + content: ""; +} +.pi-file-check:before { + content: ""; +} +.pi-microchip-ai:before { + content: ""; +} +.pi-trophy:before { + content: ""; +} +.pi-barcode:before { + content: ""; +} +.pi-file-arrow-up:before { + content: ""; +} +.pi-mars:before { + content: ""; +} +.pi-tiktok:before { + content: ""; +} +.pi-arrow-up-right-and-arrow-down-left-from-center:before { + content: ""; +} +.pi-ethereum:before { + content: ""; +} +.pi-list-check:before { + content: ""; +} +.pi-thumbtack:before { + content: ""; +} +.pi-arrow-down-left-and-arrow-up-right-to-center:before { + content: ""; +} +.pi-equals:before { + content: ""; +} +.pi-lightbulb:before { + content: ""; +} +.pi-star-half:before { + content: ""; +} +.pi-address-book:before { + content: ""; +} +.pi-chart-scatter:before { + content: ""; +} +.pi-indian-rupee:before { + content: ""; +} +.pi-star-half-fill:before { + content: ""; +} +.pi-cart-arrow-down:before { + content: ""; +} +.pi-calendar-clock:before { + content: ""; +} +.pi-sort-up-fill:before { + content: ""; +} +.pi-sparkles:before { + content: ""; +} +.pi-bullseye:before { + content: ""; +} +.pi-sort-down-fill:before { + content: ""; +} +.pi-graduation-cap:before { + content: ""; +} +.pi-hammer:before { + content: ""; +} +.pi-bell-slash:before { + content: ""; +} +.pi-gauge:before { + content: ""; +} +.pi-shop:before { + content: ""; +} +.pi-headphones:before { + content: ""; +} +.pi-eraser:before { + content: ""; +} +.pi-stopwatch:before { + content: ""; +} +.pi-verified:before { + content: ""; +} +.pi-delete-left:before { + content: ""; +} +.pi-hourglass:before { + content: ""; +} +.pi-truck:before { + content: ""; +} +.pi-wrench:before { + content: ""; +} +.pi-microphone:before { + content: ""; +} +.pi-megaphone:before { + content: ""; +} +.pi-arrow-right-arrow-left:before { + content: ""; +} +.pi-bitcoin:before { + content: ""; +} +.pi-file-edit:before { + content: ""; +} +.pi-language:before { + content: ""; +} +.pi-file-export:before { + content: ""; +} +.pi-file-import:before { + content: ""; +} +.pi-file-word:before { + content: ""; +} +.pi-gift:before { + content: ""; +} +.pi-cart-plus:before { + content: ""; +} +.pi-thumbs-down-fill:before { + content: ""; +} +.pi-thumbs-up-fill:before { + content: ""; +} +.pi-arrows-alt:before { + content: ""; +} +.pi-calculator:before { + content: ""; +} +.pi-sort-alt-slash:before { + content: ""; +} +.pi-arrows-h:before { + content: ""; +} +.pi-arrows-v:before { + content: ""; +} +.pi-pound:before { + content: ""; +} +.pi-prime:before { + content: ""; +} +.pi-chart-pie:before { + content: ""; +} +.pi-reddit:before { + content: ""; +} +.pi-code:before { + content: ""; +} +.pi-sync:before { + content: ""; +} +.pi-shopping-bag:before { + content: ""; +} +.pi-server:before { + content: ""; +} +.pi-database:before { + content: ""; +} +.pi-hashtag:before { + content: ""; +} +.pi-bookmark-fill:before { + content: ""; +} +.pi-filter-fill:before { + content: ""; +} +.pi-heart-fill:before { + content: ""; +} +.pi-flag-fill:before { + content: ""; +} +.pi-circle:before { + content: ""; +} +.pi-circle-fill:before { + content: ""; +} +.pi-bolt:before { + content: ""; +} +.pi-history:before { + content: ""; +} +.pi-box:before { + content: ""; +} +.pi-at:before { + content: ""; +} +.pi-arrow-up-right:before { + content: ""; +} +.pi-arrow-up-left:before { + content: ""; +} +.pi-arrow-down-left:before { + content: ""; +} +.pi-arrow-down-right:before { + content: ""; +} +.pi-telegram:before { + content: ""; +} +.pi-stop-circle:before { + content: ""; +} +.pi-stop:before { + content: ""; +} +.pi-whatsapp:before { + content: ""; +} +.pi-building:before { + content: ""; +} +.pi-qrcode:before { + content: ""; +} +.pi-car:before { + content: ""; +} +.pi-instagram:before { + content: ""; +} +.pi-linkedin:before { + content: ""; +} +.pi-send:before { + content: ""; +} +.pi-slack:before { + content: ""; +} +.pi-moon:before { + content: ""; +} +.pi-sun:before { + content: ""; +} +.pi-youtube:before { + content: ""; +} +.pi-vimeo:before { + content: ""; +} +.pi-flag:before { + content: ""; +} +.pi-wallet:before { + content: ""; +} +.pi-map:before { + content: ""; +} +.pi-link:before { + content: ""; +} +.pi-credit-card:before { + content: ""; +} +.pi-discord:before { + content: ""; +} +.pi-percentage:before { + content: ""; +} +.pi-euro:before { + content: ""; +} +.pi-book:before { + content: ""; +} +.pi-shield:before { + content: ""; +} +.pi-paypal:before { + content: ""; +} +.pi-amazon:before { + content: ""; +} +.pi-phone:before { + content: ""; +} +.pi-filter-slash:before { + content: ""; +} +.pi-facebook:before { + content: ""; +} +.pi-github:before { + content: ""; +} +.pi-twitter:before { + content: ""; +} +.pi-step-backward-alt:before { + content: ""; +} +.pi-step-forward-alt:before { + content: ""; +} +.pi-forward:before { + content: ""; +} +.pi-backward:before { + content: ""; +} +.pi-fast-backward:before { + content: ""; +} +.pi-fast-forward:before { + content: ""; +} +.pi-pause:before { + content: ""; +} +.pi-play:before { + content: ""; +} +.pi-compass:before { + content: ""; +} +.pi-id-card:before { + content: ""; +} +.pi-ticket:before { + content: ""; +} +.pi-file-o:before { + content: ""; +} +.pi-reply:before { + content: ""; +} +.pi-directions-alt:before { + content: ""; +} +.pi-directions:before { + content: ""; +} +.pi-thumbs-up:before { + content: ""; +} +.pi-thumbs-down:before { + content: ""; +} +.pi-sort-numeric-down-alt:before { + content: ""; +} +.pi-sort-numeric-up-alt:before { + content: ""; +} +.pi-sort-alpha-down-alt:before { + content: ""; +} +.pi-sort-alpha-up-alt:before { + content: ""; +} +.pi-sort-numeric-down:before { + content: ""; +} +.pi-sort-numeric-up:before { + content: ""; +} +.pi-sort-alpha-down:before { + content: ""; +} +.pi-sort-alpha-up:before { + content: ""; +} +.pi-sort-alt:before { + content: ""; +} +.pi-sort-amount-up:before { + content: ""; +} +.pi-sort-amount-down:before { + content: ""; +} +.pi-sort-amount-down-alt:before { + content: ""; +} +.pi-sort-amount-up-alt:before { + content: ""; +} +.pi-palette:before { + content: ""; +} +.pi-undo:before { + content: ""; +} +.pi-desktop:before { + content: ""; +} +.pi-sliders-v:before { + content: ""; +} +.pi-sliders-h:before { + content: ""; +} +.pi-search-plus:before { + content: ""; +} +.pi-search-minus:before { + content: ""; +} +.pi-file-excel:before { + content: ""; +} +.pi-file-pdf:before { + content: ""; +} +.pi-check-square:before { + content: ""; +} +.pi-chart-line:before { + content: ""; +} +.pi-user-edit:before { + content: ""; +} +.pi-exclamation-circle:before { + content: ""; +} +.pi-android:before { + content: ""; +} +.pi-google:before { + content: ""; +} +.pi-apple:before { + content: ""; +} +.pi-microsoft:before { + content: ""; +} +.pi-heart:before { + content: ""; +} +.pi-mobile:before { + content: ""; +} +.pi-tablet:before { + content: ""; +} +.pi-key:before { + content: ""; +} +.pi-shopping-cart:before { + content: ""; +} +.pi-comments:before { + content: ""; +} +.pi-comment:before { + content: ""; +} +.pi-briefcase:before { + content: ""; +} +.pi-bell:before { + content: ""; +} +.pi-paperclip:before { + content: ""; +} +.pi-share-alt:before { + content: ""; +} +.pi-envelope:before { + content: ""; +} +.pi-volume-down:before { + content: ""; +} +.pi-volume-up:before { + content: ""; +} +.pi-volume-off:before { + content: ""; +} +.pi-eject:before { + content: ""; +} +.pi-money-bill:before { + content: ""; +} +.pi-images:before { + content: ""; +} +.pi-image:before { + content: ""; +} +.pi-sign-in:before { + content: ""; +} +.pi-sign-out:before { + content: ""; +} +.pi-wifi:before { + content: ""; +} +.pi-sitemap:before { + content: ""; +} +.pi-chart-bar:before { + content: ""; +} +.pi-camera:before { + content: ""; +} +.pi-dollar:before { + content: ""; +} +.pi-lock-open:before { + content: ""; +} +.pi-table:before { + content: ""; +} +.pi-map-marker:before { + content: ""; +} +.pi-list:before { + content: ""; +} +.pi-eye-slash:before { + content: ""; +} +.pi-eye:before { + content: ""; +} +.pi-folder-open:before { + content: ""; +} +.pi-folder:before { + content: ""; +} +.pi-video:before { + content: ""; +} +.pi-inbox:before { + content: ""; +} +.pi-lock:before { + content: ""; +} +.pi-unlock:before { + content: ""; +} +.pi-tags:before { + content: ""; +} +.pi-tag:before { + content: ""; +} +.pi-power-off:before { + content: ""; +} +.pi-save:before { + content: ""; +} +.pi-question-circle:before { + content: ""; +} +.pi-question:before { + content: ""; +} +.pi-copy:before { + content: ""; +} +.pi-file:before { + content: ""; +} +.pi-clone:before { + content: ""; +} +.pi-calendar-times:before { + content: ""; +} +.pi-calendar-minus:before { + content: ""; +} +.pi-calendar-plus:before { + content: ""; +} +.pi-ellipsis-v:before { + content: ""; +} +.pi-ellipsis-h:before { + content: ""; +} +.pi-bookmark:before { + content: ""; +} +.pi-globe:before { + content: ""; +} +.pi-replay:before { + content: ""; +} +.pi-filter:before { + content: ""; +} +.pi-print:before { + content: ""; +} +.pi-align-right:before { + content: ""; +} +.pi-align-left:before { + content: ""; +} +.pi-align-center:before { + content: ""; +} +.pi-align-justify:before { + content: ""; +} +.pi-cog:before { + content: ""; +} +.pi-cloud-download:before { + content: ""; +} +.pi-cloud-upload:before { + content: ""; +} +.pi-cloud:before { + content: ""; +} +.pi-pencil:before { + content: ""; +} +.pi-users:before { + content: ""; +} +.pi-clock:before { + content: ""; +} +.pi-user-minus:before { + content: ""; +} +.pi-user-plus:before { + content: ""; +} +.pi-trash:before { + content: ""; +} +.pi-window-minimize:before { + content: ""; +} +.pi-window-maximize:before { + content: ""; +} +.pi-external-link:before { + content: ""; +} +.pi-refresh:before { + content: ""; +} +.pi-user:before { + content: ""; +} +.pi-exclamation-triangle:before { + content: ""; +} +.pi-calendar:before { + content: ""; +} +.pi-chevron-circle-left:before { + content: ""; +} +.pi-chevron-circle-down:before { + content: ""; +} +.pi-chevron-circle-right:before { + content: ""; +} +.pi-chevron-circle-up:before { + content: ""; +} +.pi-angle-double-down:before { + content: ""; +} +.pi-angle-double-left:before { + content: ""; +} +.pi-angle-double-right:before { + content: ""; +} +.pi-angle-double-up:before { + content: ""; +} +.pi-angle-down:before { + content: ""; +} +.pi-angle-left:before { + content: ""; +} +.pi-angle-right:before { + content: ""; +} +.pi-angle-up:before { + content: ""; +} +.pi-upload:before { + content: ""; +} +.pi-download:before { + content: ""; +} +.pi-ban:before { + content: ""; +} +.pi-star-fill:before { + content: ""; +} +.pi-star:before { + content: ""; +} +.pi-chevron-left:before { + content: ""; +} +.pi-chevron-right:before { + content: ""; +} +.pi-chevron-down:before { + content: ""; +} +.pi-chevron-up:before { + content: ""; +} +.pi-caret-left:before { + content: ""; +} +.pi-caret-right:before { + content: ""; +} +.pi-caret-down:before { + content: ""; +} +.pi-caret-up:before { + content: ""; +} +.pi-search:before { + content: ""; +} +.pi-check:before { + content: ""; +} +.pi-check-circle:before { + content: ""; +} +.pi-times:before { + content: ""; +} +.pi-times-circle:before { + content: ""; +} +.pi-plus:before { + content: ""; +} +.pi-plus-circle:before { + content: ""; +} +.pi-minus:before { + content: ""; +} +.pi-minus-circle:before { + content: ""; +} +.pi-circle-on:before { + content: ""; +} +.pi-circle-off:before { + content: ""; +} +.pi-sort-down:before { + content: ""; +} +.pi-sort-up:before { + content: ""; +} +.pi-sort:before { + content: ""; +} +.pi-step-backward:before { + content: ""; +} +.pi-step-forward:before { + content: ""; +} +.pi-th-large:before { + content: ""; +} +.pi-arrow-down:before { + content: ""; +} +.pi-arrow-left:before { + content: ""; +} +.pi-arrow-right:before { + content: ""; +} +.pi-arrow-up:before { + content: ""; +} +.pi-bars:before { + content: ""; +} +.pi-arrow-circle-down:before { + content: ""; +} +.pi-arrow-circle-left:before { + content: ""; +} +.pi-arrow-circle-right:before { + content: ""; +} +.pi-arrow-circle-up:before { + content: ""; +} +.pi-info:before { + content: ""; +} +.pi-info-circle:before { + content: ""; +} +.pi-home:before { + content: ""; +} +.pi-spinner:before { + content: ""; +} +:root { + --console-page-bg: #f8fafc; + --console-panel-bg: #fff; + --console-panel-border: #e2e8f0; + --console-panel-shadow: 0 1px 2px #0000001a, 0 1px 3px #0000001a; + color: var(--p-text-color, #23324d); + background: var(--p-content-background, #fff); + font-synthesis: none; + text-rendering: optimizelegibility; + -webkit-font-smoothing: antialiased; + font-family: + HarmonyOS Sans SC, + ui-sans-serif, + system-ui, + sans-serif, + Apple Color Emoji, + Segoe UI Emoji, + Segoe UI Symbol, + Noto Color Emoji; + font-size: 81.25%; + line-height: 1.5; +} +*, +:after, +:before { + box-sizing: border-box; +} +html { + scrollbar-gutter: stable; +} +@supports not (scrollbar-gutter: stable) { + html { + overflow-y: scroll; + } +} +@supports (scrollbar-gutter: stable) { + body.p-overflow-hidden { + padding-right: 0 !important; + } +} +body { + min-width: 320px; + margin: 0; +} +button, +input, +select, +textarea { + font: inherit; +} +a, +button, +input, +select, +textarea { + -webkit-tap-highlight-color: transparent; +} +[tabindex]:focus-visible, +a:focus-visible, +button:focus-visible { + outline: 2px solid var(--p-primary-color, #0052d9); + outline-offset: 3px; +} +img, +video { + max-width: 100%; +} +.p-dialog { + max-width: calc(100vw - 24px); +} +.p-dialog-content { + overflow-wrap: anywhere; +} +.p-datatable-table-container { + overscroll-behavior-x: contain; +} +.p-message { + overflow-wrap: anywhere; +} +.p-tab { + white-space: nowrap; + flex-shrink: 0; +} +.p-datatable { + min-width: 0; + max-width: 100%; +} +.p-datatable-header-cell { + white-space: nowrap; +} +@media (width<=768px) { + .p-datatable-table:not(:has(.p-datatable-empty-message)) { + min-width: 680px; + } + .p-datatable-table:has(.p-datatable-empty-message) { + table-layout: fixed; + width: 100%; + min-width: 0 !important; + } + .p-datatable-table:has(.p-datatable-empty-message) thead { + display: none; + } +} +@media (prefers-reduced-motion: reduce) { + *, + :after, + :before { + scroll-behavior: auto !important; + transition-duration: 0.01ms !important; + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + } +} +.app-dark { + --console-page-bg: #0f172a; + --console-panel-bg: #020617; + --console-panel-border: #334155; +} +.instance-product-status.p-tag-warn { + background: var(--p-yellow-100); + color: var(--p-yellow-800); +} +.app-dark .instance-product-status.p-tag-warn { + background: var(--p-yellow-950); + color: var(--p-yellow-300); +} +.config-options, +.config-page { + flex-direction: column; + gap: 32px; + min-width: 0; + display: flex; +} +.config-layout { + grid-template-columns: minmax(0, 3.15fr) minmax(270px, 1fr); + align-items: start; + gap: 20px; + min-width: 0; + display: grid; +} +.config-options > .panel { + min-width: 0; + box-shadow: none; + background: 0 0; + border: 0; + border-radius: 0; + padding: 0; +} +.config-column-title, +.config-options .section-title { + border-bottom: 1px solid var(--p-content-border-color); + color: var(--p-text-color); + margin: 0 0 22px; + padding: 0 0 15px; + font-size: 1rem; + font-weight: 400; + line-height: 1.429rem; +} +.config-page .form-row { + flex-direction: column; + align-items: stretch; + gap: 8px; + min-width: 0; + margin-bottom: 24px; + display: flex; +} +.config-page .form-row:last-child { + margin-bottom: 0; +} +.config-page .form-row > label, +.config-page .form-row > span[id] { + color: var(--p-text-color); + font-size: 1rem; + line-height: 1.429rem; +} +.config-page .form-row > .p-multiselect, +.config-page .form-row > .p-select, +.config-page .form-row > .p-textarea { + width: 100%; + max-width: 470px; +} +.config-page .grow, +.config-page .p-inputnumber { + width: 100%; + min-width: 0; + max-width: 470px; +} +.config-page .p-inputnumber-input, +.config-page .p-multiselect-label-container, +.config-page .p-select-label { + min-width: 0; +} +.config-page .p-inputnumber-input { + width: 100%; +} +.config-choices { + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 14px; + display: grid; +} +.config-choice { + border: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + min-height: 60px; + color: var(--p-text-color); + text-align: left; + cursor: pointer; + overflow-wrap: anywhere; + border-radius: 5px; + flex-direction: column; + justify-content: center; + align-items: flex-start; + gap: 12px; + padding: 17px 14px; + font-size: 1rem; + font-weight: 600; + line-height: 1.429rem; + display: flex; + box-shadow: 0 1px 3px #0000001a; +} +.config-choice small { + color: var(--p-text-muted-color); + font-size: 0.875rem; + font-weight: 400; +} +.config-choice.active { + outline: 1px solid var(--p-primary-color); + background: var(--p-highlight-background); + color: var(--p-highlight-color); +} +.config-choice.active, +.config-choice:hover { + border-color: var(--p-primary-color); +} +.config-choice:focus-visible, +.image-group:focus-visible { + outline: 2px solid var(--p-primary-color); + outline-offset: 3px; +} +.config-choice:disabled, +.image-group:disabled { + opacity: 0.6; + cursor: not-allowed; +} +.config-choices.compact { + flex-wrap: wrap; + gap: 0; + max-width: 100%; + display: flex; +} +.compact .config-choice { + min-width: 96px; + min-height: 36px; + box-shadow: none; + border-radius: 0; + align-items: center; + margin: 0 -1px -1px 0; + padding: 7px 18px; + font-weight: 400; +} +.compact .config-choice:first-child { + border-radius: 5px 0 0 5px; +} +.compact .config-choice:last-child { + border-radius: 0 5px 5px 0; +} +.compact .config-choice:only-child { + border-radius: 5px; +} +.compact .config-choice.active { + z-index: 1; + position: relative; +} +.compact .config-choice:focus-visible { + z-index: 2; + position: relative; +} +.config-page .image-groups { + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 14px; + margin-bottom: 24px; + display: grid; +} +.config-page .image-group { + border: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + min-height: 72px; + color: var(--p-text-color); + text-align: left; + cursor: pointer; + border-radius: 5px; + align-items: center; + gap: 14px; + padding: 14px; + font-size: 1rem; + font-weight: 600; + display: flex; + box-shadow: 0 1px 3px #0000001a; +} +.config-page .image-group.active { + border-color: var(--p-primary-color); + outline: 1px solid var(--p-primary-color); + background: var(--p-highlight-background); + color: var(--p-highlight-color); +} +.config-page .image-group > span { + overflow-wrap: anywhere; + min-width: 0; +} +.config-page .image-group:hover:not(:disabled) { + border-color: var(--p-primary-color); +} +.config-page .form-row .image-groups { + margin-bottom: 0; +} +.config-summary-wrap { + min-width: 0; + max-width: 100%; +} +.config-column-title { + margin-bottom: 14px; +} +.config-page .config-checkout { + background: var(--p-content-background); + border: 1px solid var(--p-content-border-color); + border-radius: 5px; + min-width: 0; + max-width: 100%; + padding: 16px 14px; + scroll-margin-top: 75px; + box-shadow: 0 1px 3px #0000001a; +} +.config-checkout .section-title { + color: var(--p-text-color); + margin: 0 0 12px; + font-size: 1.125rem; + font-weight: 600; + line-height: 1.714rem; +} +.config-summary { + flex-direction: column; + gap: 10px; + margin: 0; + display: flex; +} +.config-summary-row { + grid-template-columns: 68px minmax(0, 1fr); + align-items: baseline; + gap: 12px; + font-size: 1rem; + line-height: 1.429rem; + display: grid; +} +.config-summary-row dt { + min-width: 0; + color: var(--p-text-muted-color); + overflow-wrap: anywhere; +} +.config-summary-row dd { + text-align: right; + overflow-wrap: anywhere; + min-width: 0; + margin: 0; +} +.checkout-divider { + border-top: 1px solid var(--p-content-border-color); + margin: 16px 0; +} +.config-page .config-checkout .form-row { + gap: 5px; + margin-bottom: 12px; +} +.config-page .config-checkout .form-row > label { + color: var(--p-text-muted-color); +} +.config-page .config-checkout .grow, +.config-page .config-checkout .p-inputnumber { + max-width: 100%; +} +.config-page .config-checkout .p-inputnumber-input { + flex: 1; + width: 0; + min-width: 0; +} +.config-page .config-checkout .form-row > span[id] { + color: var(--p-text-muted-color); +} +.config-page .config-checkout .form-row > .p-select { + max-width: none; +} +.config-page .buy-bar { + border-top: 1px solid var(--p-content-border-color); + flex-direction: column; + gap: 12px; + margin-top: 16px; + padding-top: 16px; + display: flex; +} +.config-page .price-area { + flex-direction: column; + align-items: flex-start; + gap: 7px; + display: flex; +} +.config-page .price-label { + color: var(--p-text-color); + font-size: 1.125rem; + font-weight: 600; + line-height: 1.714rem; +} +.config-page .price-value { + font-variant-numeric: tabular-nums; + max-width: 100%; + color: var(--p-primary-color); + overflow-wrap: anywhere; + font-size: 1.75rem; + font-weight: 650; + line-height: 1.3; +} +.config-page .price-pending { + color: var(--p-text-muted-color); + align-items: center; + gap: 8px; + font-size: 1.25rem; + display: inline-flex; +} +.config-page .level-hint { + color: var(--p-green-600, #16a34a); + overflow-wrap: anywhere; + font-size: 0.875rem; + line-height: 1.6; +} +.config-page .quote-status { + background: var(--p-content-hover-background); + color: var(--p-text-muted-color); + border-radius: 4px; + flex-direction: column; + align-items: flex-start; + gap: 10px; + padding: 10px; + font-size: 0.875rem; + line-height: 1.6; + display: flex; +} +.config-page .quote-status p { + margin: 0; +} +.config-page .buy-actions { + flex-direction: column-reverse; + gap: 8px; + display: flex; +} +.config-page .buy-actions .p-button { + white-space: nowrap; + width: 100%; + min-width: 0; + min-height: 36px; + padding-inline: 10px; + font-size: 1rem; +} +.config-page .cart-confirmation { + background: var(--p-content-hover-background); + color: var(--p-text-color); + border-radius: 5px; + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + gap: 8px 12px; + padding: 10px 12px; + font-size: 0.875rem; + line-height: 1.286rem; + display: flex; +} +.cart-confirmation-message { + align-items: center; + gap: 7px; + display: inline-flex; +} +.cart-confirmation-message > i { + color: var(--p-green-500, #22c55e); + font-size: 1rem; +} +.config-page .cart-confirmation-link { + color: var(--p-primary-color); + white-space: nowrap; + align-items: center; + gap: 6px; + font-weight: 500; + text-decoration: none; + display: inline-flex; +} +.cart-confirmation-link > i { + font-size: 0.625rem; +} +.config-page .cart-confirmation-link:hover { + text-underline-offset: 3px; + text-decoration: underline; +} +.cart-confirmation-link:focus-visible { + outline: 2px solid var(--p-primary-color); + outline-offset: 3px; + border-radius: 2px; +} +.config-page .config-checkout .promo-body { + flex-wrap: wrap; +} +.config-page .config-checkout .promo-input { + flex: 120px; + width: 100%; + min-width: 0; +} +.config-page .p-message { + overflow-wrap: anywhere; + min-width: 0; +} +.config-load-error { + flex-direction: column; + align-items: flex-start; + gap: 14px; + display: flex; +} +.config-page > .config-load-error, +.config-page > .config-loading, +.product-order-page > .config-load-error, +.product-order-page > .config-loading { + border: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + border-radius: 5px; + width: 100%; + padding: 24px; +} +.config-loading .p-skeleton { + width: 100%; +} +.config-mobile-label { + align-items: center; + gap: 8px; + font-size: 0.9375rem; + display: inline-flex; +} +.config-mobile-total { + display: none; +} +@media (width>=1024px) { + .config-summary-wrap { + position: sticky; + top: 76px; + } +} +@media (width<=1199px) { + .config-choices, + .config-page .image-groups { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } +} +@media (width<=1023px) { + .config-layout { + grid-template-columns: minmax(0, 1fr); + gap: 32px; + } + .config-page { + padding-bottom: calc(100px + env(safe-area-inset-bottom, 0px)); + } + .config-summary-wrap { + width: 100%; + position: static; + } + .config-page .config-checkout { + width: 100%; + padding: 16px; + } + .config-summary-wrap .config-column-title { + display: block; + } + .config-page .config-checkout .price-value { + word-break: break-all; + font-size: 1.625rem; + } + .config-page .config-checkout .buy-actions .p-button { + white-space: normal; + min-height: 44px; + } + .config-mobile-total { + padding: 10px max(16px, env(safe-area-inset-right, 0px)) + max(10px, env(safe-area-inset-bottom, 0px)) + max(16px, env(safe-area-inset-left, 0px)); + border-top: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + min-height: 64px; + color: var(--p-text-color); + z-index: 40; + grid-template-columns: minmax(0, 1fr) minmax(0, auto); + align-items: center; + gap: 12px; + text-decoration: none; + display: grid; + position: fixed; + bottom: 0; + left: 0; + right: 0; + } + .config-mobile-total > span:first-child { + min-width: 0; + color: var(--p-text-muted-color); + flex-direction: column; + font-size: 0.875rem; + display: flex; + } + .config-mobile-total strong { + color: var(--p-primary-color); + overflow-wrap: anywhere; + word-break: break-all; + font-size: 1.5rem; + line-height: 1.857rem; + } + .config-mobile-label { + justify-content: flex-end; + min-width: 0; + max-width: 132px; + min-height: 44px; + } + .config-mobile-label > i { + flex-shrink: 0; + } +} +@media (width<=639px) { + .config-choices, + .config-page .image-groups { + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 8px; + } + .config-choice { + padding: 15px 14px; + } + .config-page .image-group { + gap: 10px; + padding: 12px; + } + .compact .config-choice { + flex: 1; + min-width: 78px; + } + .config-page .form-row > .p-multiselect, + .config-page .form-row > .p-select, + .config-page .form-row > .p-textarea, + .config-page .grow, + .config-page .p-inputnumber { + max-width: none; + } + .config-page .form-row { + margin-bottom: 24px; + } +} +@media (prefers-reduced-motion: reduce) { + .config-page .pi-spin { + animation: none; + } +} +.config-page .price-pending, +.config-page .price-value { + min-height: 2.275rem; + line-height: 2.275rem; +} +.config-loading-fields { + flex-direction: column; + gap: 16px; + display: flex; +} +.config-loading-summary { + flex-direction: column; + gap: 10px; + display: flex; +} +.product-switch-status { + color: var(--p-text-muted-color); + margin: 0; + font-size: 0.875rem; +} +.config-page > .config-loading-shell { + padding-bottom: 0; +} +.list-page { + flex-direction: column; + gap: 24px; + min-width: 0; + max-width: 100%; + display: flex; +} +.list-head { + justify-content: space-between; + align-items: center; + gap: 16px; + min-height: 38px; + display: flex; +} +.list-head h2 { + color: var(--p-text-color); + margin: 0; + font-size: 1rem; + font-weight: 600; +} +.list-head-actions { + flex-shrink: 0; + align-items: center; + gap: 8px; + display: flex; +} +.list-toolbar { + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + gap: 14px; + display: flex; +} +.host-list-page .list-toolbar { + flex-direction: column; +} +.list-toolbar-right { + flex-wrap: wrap; + align-items: center; + gap: 8px; + display: flex; +} +.list-segments { + background: color-mix( + in srgb, + var(--p-content-hover-background) 60%, + transparent + ); + border-radius: 4px; + align-items: center; + gap: 2px; + max-width: 100%; + padding: 3px; + display: inline-flex; + overflow-x: auto; +} +.list-seg { + min-height: 30px; + color: var(--p-text-muted-color); + white-space: nowrap; + cursor: pointer; + background: 0 0; + border: 1px solid #0000; + border-radius: 4px; + padding: 4px 10px; + font-size: 1rem; + line-height: 1.5; +} +.list-seg.active, +.list-seg:hover { + color: var(--p-text-color); +} +.list-seg.active { + background: var(--p-content-background); + border-color: var(--p-content-border-color); + font-weight: 500; + box-shadow: 0 1px 2px #0000000a; +} +.list-search { + width: 280px; +} +.list-search > .p-inputtext { + width: 100%; +} +.list-select { + width: 280px; +} +.list-table { + background: var(--p-content-background); + border: 1px solid var(--p-content-border-color); + border-radius: 5px; + min-width: 0; + max-width: 100%; + overflow: hidden; + box-shadow: 0 2px 3px #00000014; +} +.list-table:has(.p-datatable-mask):has(.p-datatable-empty-message) { + min-height: 100dvh; +} +.list-table .p-datatable-header-cell { + color: var(--p-text-color); + white-space: nowrap; + background: 0 0; + font-weight: 500; +} +.list-table .p-datatable-header-cell, +.list-table .p-datatable-tbody > tr > td { + border-color: var(--p-content-border-color); + padding: 18px 14px; +} +.list-table .p-tag, +.list-table .p-tag-label { + white-space: nowrap; +} +.list-table .p-tag { + border-radius: 20px; + padding: 2px 8px; + font-size: 0.875rem; + font-weight: 600; +} +.list-table .p-datatable-tbody > tr.clickable { + cursor: pointer; +} +.col-id, +.col-mono { + font-family: inherit; +} +.col-id { + color: var(--p-text-color); +} +.list-empty { + color: var(--p-text-muted-color); + text-align: center; + flex-direction: column; + align-items: center; + gap: 10px; + padding: 56px 20px; + display: flex; +} +.list-empty > i { + opacity: 0.5; + font-size: 2.375rem; +} +.list-empty-title { + color: var(--p-text-color); + font-size: 1.0625rem; +} +.list-empty-desc { + max-width: 42em; + margin: 0; + font-size: 0.9375rem; + line-height: 1.7; +} +.list-foot { + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + gap: 12px; + display: flex; +} +.list-foot .list-bulk { + align-items: center; + gap: 8px; + display: flex; +} +.list-foot .p-paginator { + background: 0 0; + padding: 0; +} +.host-list-page .host-loading-status { + clip-path: inset(50%); + width: 1px; + height: 1px; + padding: 0; + position: absolute; + overflow: hidden; +} +.host-list-page .host-row-placeholder { + flex-direction: column; + justify-content: center; + gap: 4px; + min-height: 52px; + display: flex; +} +.host-list-page .host-list-foot { + min-height: 40px; +} +.host-list-page .host-list-foot-empty { + visibility: hidden; +} +.host-list-page .host-refresh-error .p-message-text { + flex-wrap: wrap; + align-items: center; + gap: 12px; + display: flex; +} +@media (width<=768px) { + .list-table:has(.p-datatable-mask) + .p-datatable-table:has(.p-datatable-empty-message) { + table-layout: auto; + min-width: 680px !important; + } + .list-table:has(.p-datatable-mask) + .p-datatable-table:has(.p-datatable-empty-message) + thead { + display: table-header-group; + } + .list-head { + gap: 10px; + } + .list-head, + .list-head-actions { + flex-wrap: wrap; + } + .list-toolbar { + flex-direction: column; + align-items: stretch; + } + .list-toolbar-right { + width: 100%; + } + .list-toolbar-right > * { + flex: 1; + min-width: 0; + } + .list-toolbar-right > .list-search { + flex-basis: 100%; + } + .list-search, + .list-select { + width: 100%; + } + .list-seg { + min-height: 34px; + } + .list-table { + overflow-x: auto; + } + .list-table .p-datatable-table { + min-width: 680px; + } + .list-foot { + justify-content: center; + } + .list-foot .list-bulk { + flex-wrap: wrap; + justify-content: flex-start; + width: 100%; + } +} +.account-management-page { + flex-direction: column; + gap: 21px; + min-width: 0; + padding: 4px 0; + display: flex; +} +.account-management-head { + flex-wrap: wrap; + justify-content: space-between; + align-items: flex-start; + gap: 16px; + display: flex; +} +.account-management-head h2 { + margin: 0 0 16px; + font-size: 1.5rem; + font-weight: 400; + line-height: 1.5; +} +.account-management-head p { + color: var(--p-text-muted-color); + margin: 0; + font-size: 0.9375rem; + line-height: 1.7; +} +.account-management-actions { + flex-wrap: wrap; + align-items: center; + gap: 10px; + display: flex; +} +.account-management-link { + border: 1px solid var(--p-content-border-color); + min-height: 36px; + color: var(--p-text-color); + white-space: nowrap; + background: 0 0; + border-radius: 4px; + align-items: center; + gap: 7px; + padding: 7px 12px; + font-size: 1rem; + line-height: 1.5; + text-decoration: none; + display: inline-flex; +} +.account-management-link:hover { + background: var(--p-content-hover-background); +} +.account-management-link > i { + font-size: 0.875rem; +} +.account-management-note { + color: var(--p-text-muted-color); + margin: 0; + font-size: 0.9375rem; + line-height: 1.7; +} +.connection-list { + border-top: 1px solid var(--console-panel-border); +} +.connection-section-title { + margin: 0 0 14px; + font-size: 1.125rem; + font-weight: 500; +} +.connection-provider { + border-bottom: 1px solid var(--console-panel-border); + align-items: center; + gap: 14px; + min-width: 0; + padding: 21px 0; + display: flex; +} +.connection-provider > img { + -o-object-fit: contain; + object-fit: contain; + flex-shrink: 0; + width: 32px; + height: 32px; +} +.connection-provider-main { + flex: 1; + min-width: 0; +} +.connection-provider-main strong { + font-size: 1rem; + font-weight: 500; +} +.connection-provider-main p { + color: var(--p-text-muted-color); + overflow-wrap: anywhere; + margin: 6px 0 0; + font-size: 0.9375rem; +} +@media (width<=640px) { + .account-management-actions { + width: 100%; + } + .account-management-head h2 { + margin-bottom: 12px; + } + .connection-provider { + flex-wrap: wrap; + } + .connection-provider > .p-button { + margin-left: auto; + } +} +.home-page { + flex-direction: column; + gap: 21px; + display: flex; +} +.home-grid { + grid-template-columns: repeat(4, minmax(0, 1fr)); + align-items: stretch; + gap: 21px; + display: grid; +} +.home-grid > * { + min-width: 0; +} +.home-welcome { + grid-column: span 3; + min-height: 232px; +} +.home-wallet { + grid-column: span 1; + min-height: 232px; +} +.home-expiring, +.home-tickets { + grid-column: span 1; + min-height: 442px; +} +.home-servers { + grid-column: span 2; + min-height: 442px; +} +.home-notices, +.home-referral { + grid-column: span 2; + min-height: 316px; +} +.home-card { + background: var(--p-content-background); + border: 1px solid var(--p-content-border-color, #e2e8f0); + border-radius: 5px; + flex-direction: column; + min-width: 0; + display: flex; + overflow: hidden; + box-shadow: 0 1px 3px #0000001a; +} +.home-card-head { + justify-content: space-between; + align-items: center; + gap: 12px; + min-height: 50px; + padding: 0 14px; + display: flex; +} +.home-card-title { + color: var(--p-text-color, #334155); + gap: 8px; + margin: 0; + font-weight: 600; + display: flex; +} +.home-card-more, +.home-card-title { + align-items: center; + font-size: 1rem; +} +.home-card-more { + min-width: 20px; + min-height: 28px; + color: var(--p-text-color); + flex-shrink: 0; + justify-content: center; + text-decoration: none; + display: inline-flex; +} +.home-card-more:hover { + color: var(--p-primary-color); +} +.home-card-body { + padding: 14px; +} +.home-card-foot { + align-items: center; + gap: 7px; + margin-top: auto; + padding: 14px; + display: flex; +} +.home-card-foot > * { + flex: 1; + min-width: 0; +} +.home-button { + border: 1px solid var(--p-primary-color); + background: var(--p-primary-color); + min-height: 36px; + color: var(--p-primary-contrast-color, #fff); + border-radius: 4px; + justify-content: center; + align-items: center; + gap: 6px; + padding: 7px 12px; + font-size: 1rem; + line-height: 1.429rem; + text-decoration: none; + display: inline-flex; +} +.home-button.secondary { + border-color: var(--p-content-border-color); + color: var(--p-text-muted-color); + background: 0 0; +} +.home-button i { + opacity: 1; + font-size: 1rem; +} +.home-button:hover { + filter: brightness(0.97); +} +.home-list { + flex-direction: column; + min-width: 0; + display: flex; +} +.home-row { + border-bottom: 1px solid var(--p-content-border-color); + color: inherit; + align-items: center; + gap: 12px; + padding: 12px 7px; + text-decoration: none; + display: flex; +} +.home-row:last-child { + border-bottom: 0; +} +a.home-row:hover, +button.home-row:hover { + background: var(--p-content-hover-background); +} +.home-row-main { + flex-direction: column; + flex: 1; + gap: 3px; + min-width: 0; + display: flex; +} +.home-row-title { + color: var(--p-text-color); + text-overflow: ellipsis; + white-space: nowrap; + font-size: 1rem; + line-height: 1.429rem; + overflow: hidden; +} +.home-row-side, +.home-row-sub { + color: var(--p-text-muted-color); + font-size: 0.875rem; + line-height: 1.286rem; +} +.home-row-side { + white-space: nowrap; + flex-shrink: 0; +} +.home-row-skeleton { + border-bottom: 1px solid var(--p-content-border-color); + padding: 12px 14px; +} +.home-mini-stats { + flex-wrap: wrap; + gap: 12px 28px; + padding: 0 14px 14px; + display: flex; +} +.home-mini-stat { + flex-direction: column; + gap: 2px; + display: flex; +} +.home-mini-label { + color: var(--p-text-muted-color); + font-size: 0.875rem; +} +.home-mini-value { + color: var(--p-text-color); + font-size: 1.125rem; + font-weight: 600; +} +.home-page a:focus-visible, +.home-page button:focus-visible { + outline: 2px solid var(--p-primary-color); + outline-offset: 2px; +} +@media (width<=1023px) { + .home-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + .home-welcome { + grid-column: span 2; + } + .home-tickets, + .home-wallet { + grid-column: span 1; + } + .home-expiring, + .home-servers { + grid-column: span 2; + } + .home-notices, + .home-referral { + grid-column: span 1; + } +} +@media (width<=639px) { + .home-grid { + flex-direction: column; + gap: 21px; + display: flex; + } + .home-welcome { + min-height: 0; + } + .home-wallet { + min-height: 214px; + } + .home-expiring, + .home-servers, + .home-tickets { + min-height: 330px; + } + .home-notices, + .home-referral { + min-height: 280px; + } +} diff --git a/app/assets/styles/error-404.IMo4BvbT.css b/app/assets/styles/error-404.IMo4BvbT.css new file mode 100644 index 0000000..f432fef --- /dev/null +++ b/app/assets/styles/error-404.IMo4BvbT.css @@ -0,0 +1,131 @@ +.grid[data-v-ca5ec3aa] { + display: grid; +} +.mb-2[data-v-ca5ec3aa] { + margin-bottom: 0.5rem; +} +.mb-4[data-v-ca5ec3aa] { + margin-bottom: 1rem; +} +.max-w-520px[data-v-ca5ec3aa] { + max-width: 520px; +} +.min-h-screen[data-v-ca5ec3aa] { + min-height: 100vh; +} +.w-full[data-v-ca5ec3aa] { + width: 100%; +} +.flex[data-v-ca5ec3aa] { + display: flex; +} +.place-content-center[data-v-ca5ec3aa] { + place-content: center; +} +.items-center[data-v-ca5ec3aa] { + align-items: center; +} +.justify-center[data-v-ca5ec3aa] { + justify-content: center; +} +.overflow-hidden[data-v-ca5ec3aa] { + overflow: hidden; +} +.bg-white[data-v-ca5ec3aa] { + --un-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--un-bg-opacity)); +} +.px-2[data-v-ca5ec3aa] { + padding-left: 0.5rem; + padding-right: 0.5rem; +} +.text-center[data-v-ca5ec3aa] { + text-align: center; +} +.text-\[80px\][data-v-ca5ec3aa] { + font-size: 80px; +} +.text-2xl[data-v-ca5ec3aa] { + font-size: 1.5rem; + line-height: 2rem; +} +.text-sm[data-v-ca5ec3aa] { + font-size: 0.875rem; + line-height: 1.25rem; +} +.text-\[\#020420\][data-v-ca5ec3aa] { + --un-text-opacity: 1; + color: rgb(2 4 32 / var(--un-text-opacity)); +} +.text-\[\#64748B\][data-v-ca5ec3aa] { + --un-text-opacity: 1; + color: rgb(100 116 139 / var(--un-text-opacity)); +} +.hover\:text-\[\#00DC82\][data-v-ca5ec3aa]:hover { + --un-text-opacity: 1; + color: rgb(0 220 130 / var(--un-text-opacity)); +} +.font-medium[data-v-ca5ec3aa] { + font-weight: 500; +} +.font-semibold[data-v-ca5ec3aa] { + font-weight: 600; +} +.leading-none[data-v-ca5ec3aa] { + line-height: 1; +} +.tracking-wide[data-v-ca5ec3aa] { + letter-spacing: 0.025em; +} +.font-sans[data-v-ca5ec3aa] { + font-family: + ui-sans-serif, + system-ui, + -apple-system, + BlinkMacSystemFont, + Segoe UI, + Roboto, + Helvetica Neue, + Arial, + Noto Sans, + sans-serif, + Apple Color Emoji, + Segoe UI Emoji, + Segoe UI Symbol, + Noto Color Emoji; +} +.tabular-nums[data-v-ca5ec3aa] { + --un-numeric-spacing: tabular-nums; + font-variant-numeric: var(--un-ordinal) var(--un-slashed-zero) + var(--un-numeric-figure) var(--un-numeric-spacing) + var(--un-numeric-fraction); +} +.underline[data-v-ca5ec3aa] { + text-decoration-line: underline; +} +.underline-offset-3[data-v-ca5ec3aa] { + text-underline-offset: 3px; +} +.antialiased[data-v-ca5ec3aa] { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +@media (prefers-color-scheme: dark) { + .dark\:bg-\[\#020420\][data-v-ca5ec3aa] { + --un-bg-opacity: 1; + background-color: rgb(2 4 32 / var(--un-bg-opacity)); + } + .dark\:text-white[data-v-ca5ec3aa] { + --un-text-opacity: 1; + color: rgb(255 255 255 / var(--un-text-opacity)); + } +} +@media (width>=640px) { + .sm\:text-\[110px\][data-v-ca5ec3aa] { + font-size: 110px; + } + .sm\:text-3xl[data-v-ca5ec3aa] { + font-size: 1.875rem; + line-height: 2.25rem; + } +} diff --git a/app/assets/styles/error-500.CT6S2vcm.css b/app/assets/styles/error-500.CT6S2vcm.css new file mode 100644 index 0000000..92d8cc7 --- /dev/null +++ b/app/assets/styles/error-500.CT6S2vcm.css @@ -0,0 +1,102 @@ +.grid[data-v-ecba301a] { + display: grid; +} +.mb-2[data-v-ecba301a] { + margin-bottom: 0.5rem; +} +.mb-4[data-v-ecba301a] { + margin-bottom: 1rem; +} +.max-w-520px[data-v-ecba301a] { + max-width: 520px; +} +.min-h-screen[data-v-ecba301a] { + min-height: 100vh; +} +.place-content-center[data-v-ecba301a] { + place-content: center; +} +.overflow-hidden[data-v-ecba301a] { + overflow: hidden; +} +.bg-white[data-v-ecba301a] { + --un-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--un-bg-opacity)); +} +.px-2[data-v-ecba301a] { + padding-left: 0.5rem; + padding-right: 0.5rem; +} +.text-center[data-v-ecba301a] { + text-align: center; +} +.text-\[80px\][data-v-ecba301a] { + font-size: 80px; +} +.text-2xl[data-v-ecba301a] { + font-size: 1.5rem; + line-height: 2rem; +} +.text-\[\#020420\][data-v-ecba301a] { + --un-text-opacity: 1; + color: rgb(2 4 32 / var(--un-text-opacity)); +} +.text-\[\#64748B\][data-v-ecba301a] { + --un-text-opacity: 1; + color: rgb(100 116 139 / var(--un-text-opacity)); +} +.font-semibold[data-v-ecba301a] { + font-weight: 600; +} +.leading-none[data-v-ecba301a] { + line-height: 1; +} +.tracking-wide[data-v-ecba301a] { + letter-spacing: 0.025em; +} +.font-sans[data-v-ecba301a] { + font-family: + ui-sans-serif, + system-ui, + -apple-system, + BlinkMacSystemFont, + Segoe UI, + Roboto, + Helvetica Neue, + Arial, + Noto Sans, + sans-serif, + Apple Color Emoji, + Segoe UI Emoji, + Segoe UI Symbol, + Noto Color Emoji; +} +.tabular-nums[data-v-ecba301a] { + --un-numeric-spacing: tabular-nums; + font-variant-numeric: var(--un-ordinal) var(--un-slashed-zero) + var(--un-numeric-figure) var(--un-numeric-spacing) + var(--un-numeric-fraction); +} +.antialiased[data-v-ecba301a] { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +@media (prefers-color-scheme: dark) { + .dark\:bg-\[\#020420\][data-v-ecba301a] { + --un-bg-opacity: 1; + background-color: rgb(2 4 32 / var(--un-bg-opacity)); + } + .dark\:text-white[data-v-ecba301a] { + --un-text-opacity: 1; + color: rgb(255 255 255 / var(--un-text-opacity)); + } +} +@media (width>=640px) { + .sm\:text-\[110px\][data-v-ecba301a] { + font-size: 110px; + } + .sm\:text-3xl[data-v-ecba301a] { + font-size: 1.875rem; + line-height: 2.25rem; + } +} diff --git a/app/assets/styles/finance.BkxKMno0.css b/app/assets/styles/finance.BkxKMno0.css new file mode 100644 index 0000000..8d14e84 --- /dev/null +++ b/app/assets/styles/finance.BkxKMno0.css @@ -0,0 +1,286 @@ +.finance-shortcut[data-v-18fe1f08] { + color: var(--p-primary-color); + white-space: nowrap; + padding: 8px 6px; + text-decoration: none; +} +.finance-shortcut[data-v-18fe1f08]:hover { + text-decoration: underline; +} +.page[data-v-18fe1f08] { + flex-direction: column; + gap: 18px; + display: flex; +} +.page-head h2[data-v-18fe1f08] { + margin: 0 0 6px; + font-size: 1.375rem; +} +.page-head p[data-v-18fe1f08] { + color: var(--p-text-muted-color, #94a3b8); + margin: 0; + font-size: 1rem; +} +.summary[data-v-18fe1f08] { + grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); + gap: 16px; + display: grid; +} +.summary-card[data-v-18fe1f08] { + background: var(--p-content-background); + border: 1px solid var(--p-content-border-color, #e2e8f0); + border-radius: 12px; + flex-direction: column; + gap: 8px; + padding: 18px; + display: flex; +} +.summary-card.balance[data-v-18fe1f08] { + background: linear-gradient( + 135deg, + var(--p-highlight-background) 0, + var(--p-content-background) 70% + ); +} +.summary-label[data-v-18fe1f08] { + color: var(--p-text-muted-color, #94a3b8); + font-size: 0.9375rem; +} +.summary-value[data-v-18fe1f08] { + font-size: 1.625rem; + font-weight: 600; +} +.summary-card.balance .summary-value[data-v-18fe1f08] { + margin-bottom: 4px; +} +.summary-actions[data-v-18fe1f08] { + gap: 8px; + display: flex; +} +.reject[data-v-18fe1f08] { + color: #ef4444; + margin-top: 4px; + font-size: 0.875rem; +} +.panel[data-v-18fe1f08] { + background: var(--p-content-background); + border: 1px solid var(--p-content-border-color, #e2e8f0); + border-radius: 12px; + padding: 8px 20px 20px; +} +.credit-summary[data-v-18fe1f08] { + color: var(--p-text-muted-color, #64748b); + padding: 10px 0; + font-size: 0.9375rem; +} +.link[data-v-18fe1f08] { + color: var(--p-primary-color, #3b82f6); + font-weight: 500; + text-decoration: none; +} +.link[data-v-18fe1f08]:hover { + text-decoration: underline; +} +.amount[data-v-18fe1f08] { + font-weight: 500; +} +.empty[data-v-18fe1f08] { + text-align: center; + color: var(--p-text-muted-color, #94a3b8); + padding: 32px 0; +} +.v-msg[data-v-18fe1f08] { + margin-bottom: 12px; +} +.page[data-v-18fe1f08] { + gap: 14px; +} +.wallet-card[data-v-18fe1f08] { + background: var(--p-content-background); + border: 1px solid var(--p-content-border-color); + border-radius: 7px; + justify-content: space-between; + align-items: center; + gap: 21px; + min-height: 91px; + padding: 14px; + display: flex; + box-shadow: 0 1px 2px #00000014; +} +.summary-label[data-v-18fe1f08] { + color: var(--p-text-muted-color); + margin-bottom: 10px; + font-size: 1rem; +} +.summary-value[data-v-18fe1f08] { + font-size: 1.75rem; + font-weight: 400; + line-height: 1.2; +} +.summary-value small[data-v-18fe1f08] { + font-size: 1.5rem; +} +.wallet-pending-refund[data-v-18fe1f08] { + min-width: 130px; +} +.pending-refund-value[data-v-18fe1f08] { + color: var(--p-orange-600, #ea580c); + font-size: 1.125rem; + font-weight: 600; +} +.reminder-panel[data-v-18fe1f08] { + flex-wrap: wrap; + align-items: center; + gap: 18px; + padding: 16px 18px; + display: flex; +} +.reminder-copy[data-v-18fe1f08] { + flex: 1; + min-width: 220px; +} +.reminder-copy h3[data-v-18fe1f08] { + margin: 0 0 4px; + font-size: 1rem; + font-weight: 600; +} +.reminder-copy p[data-v-18fe1f08] { + color: var(--p-text-muted-color); + margin: 0; + font-size: 0.875rem; +} +.reminder-form[data-v-18fe1f08] { + flex-wrap: nowrap; + align-items: center; + gap: 10px; + min-width: 0; + display: flex; +} +.reminder-form[data-v-18fe1f08] .p-inputnumber { + flex: 0 150px; + width: 150px; + min-width: 0; +} +.reminder-form[data-v-18fe1f08] .p-button, +.reminder-form[data-v-18fe1f08] > :first-child, +.reminder-form > label[data-v-18fe1f08] { + flex: none; +} +.reminder-form[data-v-18fe1f08] .p-button, +.reminder-form > label[data-v-18fe1f08] { + white-space: nowrap; +} +.reminder-panel > .p-message[data-v-18fe1f08] { + flex-basis: 100%; + margin: 0; +} +.panel.wallet-tabs[data-v-18fe1f08] { + background: 0 0; + border: 0; + border-radius: 0; + padding: 0; +} +.wallet-tabs[data-v-18fe1f08] .p-tabpanels { + background: 0 0; + padding: 0; +} +.wallet-tabs[data-v-18fe1f08] .p-tablist-tab-list { + background: 0 0; + border: 0; +} +.wallet-tabs[data-v-18fe1f08] .p-tab { + padding: 14px; +} +.wallet-tabs[data-v-18fe1f08] .p-tablist-active-bar { + display: none; +} +.wallet-section-title[data-v-18fe1f08] { + margin: 28px 0; + font-size: 1.25rem; + font-weight: 600; +} +.wallet-filters[data-v-18fe1f08], +.wallet-toolbar[data-v-18fe1f08] { + flex-wrap: wrap; + align-items: center; + gap: 7px; + display: flex; +} +.wallet-toolbar[data-v-18fe1f08] { + justify-content: space-between; + margin: 28px 0; +} +.wallet-filters .p-inputtext[data-v-18fe1f08], +.wallet-filters .p-select[data-v-18fe1f08] { + width: 280px; +} +.wallet-tabs[data-v-18fe1f08] .p-datatable-table-container { + border: 1px solid var(--p-content-border-color); + border-radius: 6px; + box-shadow: 0 2px 3px #0000000f; +} +.wallet-tabs[data-v-18fe1f08] .p-datatable-table { + min-width: 640px; +} +.wallet-tabs[data-v-18fe1f08] .p-datatable-thead > tr > th { + white-space: nowrap; + background: 0 0; + padding: 12px 14px; +} +.wallet-tabs[data-v-18fe1f08] .p-datatable-tbody > tr > td { + padding: 12px 14px; +} +.wallet-tabs[data-v-18fe1f08] .p-paginator { + background: 0 0; + margin: 28px 0; +} +.wallet-tabs[data-v-18fe1f08] .amount-cell { + text-align: right; + white-space: nowrap; +} +.wallet-tabs[data-v-18fe1f08] + .amount-heading + .p-datatable-column-header-content { + justify-content: flex-end; +} +.credit-summary[data-v-18fe1f08] { + display: none; +} +.withdraw-notice[data-v-18fe1f08] { + margin-top: 21px; +} +@media (width<=640px) { + .wallet-card[data-v-18fe1f08] { + flex-wrap: wrap; + } + .reminder-copy[data-v-18fe1f08] { + flex: 100%; + min-width: 0; + } + .reminder-form[data-v-18fe1f08] { + gap: 8px; + width: 100%; + } + .reminder-form[data-v-18fe1f08] .p-inputnumber { + flex: 1 1 0; + width: auto; + } + .reminder-form[data-v-18fe1f08] .p-inputtext { + width: 100%; + min-width: 0; + } + .wallet-filters[data-v-18fe1f08], + .wallet-toolbar[data-v-18fe1f08] { + flex-direction: column; + align-items: stretch; + width: 100%; + } + .wallet-filters .p-inputtext[data-v-18fe1f08], + .wallet-filters .p-select[data-v-18fe1f08] { + width: 100%; + } + .wallet-section-title[data-v-18fe1f08], + .wallet-toolbar[data-v-18fe1f08] { + margin: 21px 0; + } +} diff --git a/app/assets/styles/groups.Buw8nwl1.css b/app/assets/styles/groups.Buw8nwl1.css new file mode 100644 index 0000000..b8304b3 --- /dev/null +++ b/app/assets/styles/groups.Buw8nwl1.css @@ -0,0 +1,289 @@ +.row-actions[data-v-fe145bae] { + align-items: center; + gap: 4px; + display: flex; +} +.form[data-v-fe145bae] { + gap: 14px; +} +.field[data-v-fe145bae], +.form[data-v-fe145bae] { + flex-direction: column; + display: flex; +} +.field label[data-v-fe145bae] { + color: var(--p-text-color, #334155); + font-size: 0.9375rem; +} +.req[data-v-fe145bae] { + color: #ef4444; +} +.rules[data-v-fe145bae] { + gap: 12px; +} +.dlg-tabs[data-v-fe145bae] { + background: var(--p-content-hover-background); + border-radius: 8px; + align-self: flex-start; + gap: 4px; + padding: 3px; + display: flex; +} +.dlg-tabs button[data-v-fe145bae] { + color: var(--p-text-muted-color, #64748b); + cursor: pointer; + background: 0 0; + border: 0; + border-radius: 6px; + padding: 6px 18px; + font-size: 0.9375rem; +} +.dlg-tabs button.active[data-v-fe145bae] { + background: var(--p-content-background); + color: var(--p-text-color); + font-weight: 500; +} +.batch-dlg[data-v-fe145bae] { + flex-direction: column; + gap: 12px; + display: flex; +} +.batch-hint[data-v-fe145bae] { + color: var(--p-text-muted-color, #94a3b8); + margin: 0; + font-size: 0.875rem; + line-height: 1.9; +} +.batch-hint code[data-v-fe145bae] { + background: var(--p-content-hover-background); + border-radius: 4px; + padding: 1px 5px; + font-size: 0.875rem; +} +.sg-note[data-v-fe145bae] { + color: var(--p-text-muted-color, #94a3b8); + margin: 10px 0 0; + font-size: 0.875rem; + line-height: 1.8; +} +.rule-add[data-v-fe145bae] { + border: 1px dashed var(--p-content-border-color, #e2e8f0); + border-radius: 10px; + padding: 12px; +} +.rule-form[data-v-fe145bae] { + flex-wrap: wrap; + align-items: center; + gap: 8px; +} +.rule-error[data-v-fe145bae] { + margin-top: 10px; +} +.w-90[data-v-fe145bae] { + width: 90px; +} +.w-100[data-v-fe145bae] { + width: 100px; +} +.w-port[data-v-fe145bae] { + width: 170px; +} +.w-160[data-v-fe145bae] { + width: 160px; +} +.grow[data-v-fe145bae] { + flex: 1; + min-width: 140px; +} +.mono[data-v-fe145bae] { + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 0.875rem; +} +.empty-rule[data-v-fe145bae] { + text-align: center; + color: var(--p-text-muted-color, #94a3b8); + padding: 20px 0; + font-size: 0.9375rem; +} +.list-page[data-v-fe145bae] { + gap: 21px; +} +.list-head h2[data-v-fe145bae], +.page-head h2[data-v-fe145bae] { + margin: 0; + font-size: 1.125rem; + font-weight: 700; + line-height: 24.5px; +} +.list-toolbar[data-v-fe145bae], +.list-toolbar-right[data-v-fe145bae] { + justify-content: flex-start; + gap: 7px; +} +.list-search[data-v-fe145bae], +.list-select[data-v-fe145bae] { + width: 280px; +} +.list-table[data-v-fe145bae] { + border-radius: 6px; + box-shadow: 0 1px 3px #0f172a12; +} +.list-foot[data-v-fe145bae] { + justify-content: center; +} +.list-foot > .list-bulk[data-v-fe145bae]:empty { + display: none; +} +[data-v-fe145bae] .p-datatable-header-cell { + background: var(--p-content-hover-background); + padding: 10.5px 14px; + font-size: 1rem; + font-weight: 600; +} +[data-v-fe145bae] .p-datatable-tbody > tr > td { + padding: 10.5px 14px; + font-size: 1rem; +} +[data-v-fe145bae] .p-tag { + font-size: 0.875rem; + font-weight: 500; +} +[data-v-fe145bae] .list-empty { + gap: 14px; + min-height: 300px; + padding: 42px 21px; +} +[data-v-fe145bae] .list-empty i { + opacity: 1; + font-size: 1.875rem; +} +[data-v-fe145bae] .list-empty-title { + font-size: 1rem; +} +[data-v-fe145bae] .list-empty-desc { + font-size: 0.875rem; +} +.field[data-v-fe145bae] { + gap: 7px; +} +.field label[data-v-fe145bae] { + font-size: 0.875rem; +} +@media (width<=768px) { + .list-search[data-v-fe145bae], + .list-select[data-v-fe145bae], + .list-toolbar-right[data-v-fe145bae] { + width: 100%; + } +} +.detail-back[data-v-fe145bae], +.group-name[data-v-fe145bae] { + color: inherit; + font: inherit; + cursor: pointer; + background: 0 0; + border: 0; + padding: 0; +} +.group-name[data-v-fe145bae]:hover { + color: var(--p-primary-color); +} +.detail-back[data-v-fe145bae] { + color: var(--p-text-muted-color); + margin-bottom: 14px; + font-size: 0.875rem; +} +.group-detail[data-v-fe145bae] { + min-width: 0; +} +.group-detail-head[data-v-fe145bae] { + justify-content: space-between; + align-items: center; + gap: 21px; + margin-bottom: 21px; + display: flex; +} +.group-detail-head h2[data-v-fe145bae] { + margin: 0 0 14px; + font-size: 1.125rem; +} +.group-detail-head h2 small[data-v-fe145bae] { + font-weight: 400; +} +.group-detail-head h2 small[data-v-fe145bae], +.group-meta[data-v-fe145bae] { + color: var(--p-text-muted-color); + font-size: 0.875rem; +} +.group-meta[data-v-fe145bae] { + gap: 28px; + display: flex; +} +.group-meta b[data-v-fe145bae] { + color: var(--p-text-color); + font-weight: 400; +} +.rules[data-v-fe145bae] { + flex-direction: column; + gap: 21px; + display: flex; +} +.dlg-tabs[data-v-fe145bae] { + border-bottom: 1px solid var(--p-content-border-color); + background: 0 0; + border-radius: 0; + gap: 0; + padding: 0; +} +.dlg-tabs button[data-v-fe145bae] { + border-radius: 0; + padding: 14px; +} +.dlg-tabs button.active[data-v-fe145bae] { + color: var(--p-primary-color); + border-bottom: 2px solid var(--p-primary-color); + box-shadow: none; + background: 0 0; +} +.rule-toolbar[data-v-fe145bae] { + gap: 7px; + display: flex; +} +.rule-form[data-v-fe145bae] { + flex-direction: column; + align-items: stretch; + gap: 14px; + margin-top: 21px; + display: flex; +} +.rule-form[data-v-fe145bae] > * { + width: 100%; +} +.quick-grid[data-v-fe145bae] { + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 14px; + display: grid; +} +.quick-grid label[data-v-fe145bae] { + align-items: center; + gap: 7px; + font-size: 0.875rem; + display: flex; +} +.group-detail[data-v-fe145bae] .p-datatable { + border: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + border-radius: 6px; +} +@media (width<=768px) { + .group-detail-head[data-v-fe145bae] { + flex-direction: column; + align-items: flex-start; + } + .quick-grid[data-v-fe145bae] { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + .group-detail-head .row-actions[data-v-fe145bae] { + flex-wrap: wrap; + } +} diff --git a/app/assets/styles/help.BSOB30LE.css b/app/assets/styles/help.BSOB30LE.css new file mode 100644 index 0000000..dc2d8ee --- /dev/null +++ b/app/assets/styles/help.BSOB30LE.css @@ -0,0 +1,292 @@ +.help-page[data-v-2e1fbf8d] { + flex-direction: column; + gap: 21px; + min-width: 0; + display: flex; +} +.page-head[data-v-2e1fbf8d] { + justify-content: space-between; + align-items: center; + gap: 16px; + display: flex; +} +.page-heading h2[data-v-2e1fbf8d] { + margin: 0; + font-size: 1.25rem; + font-weight: 650; + line-height: 2rem; +} +.page-heading p[data-v-2e1fbf8d] { + color: var(--p-text-muted-color); + margin: 4px 0 0; + font-size: 0.9375rem; +} +.help-body[data-v-2e1fbf8d] { + grid-template-columns: 280px minmax(0, 1fr); + align-items: start; + gap: 21px; + display: grid; +} +.help-content[data-v-2e1fbf8d], +.help-nav[data-v-2e1fbf8d] { + background: var(--console-panel-bg); + border: 1px solid var(--console-panel-border); + border-radius: 8px; + min-width: 0; +} +.help-nav[data-v-2e1fbf8d] { + flex-direction: column; + gap: 18px; + max-height: calc(100dvh - 104px); + padding: 20px 14px 16px; + display: flex; + position: sticky; + top: 78px; +} +.nav-heading[data-v-2e1fbf8d] { + justify-content: space-between; + align-items: center; + gap: 12px; + padding: 0 4px; + display: flex; +} +.nav-heading h3[data-v-2e1fbf8d] { + margin: 0; + font-size: 1rem; + font-weight: 600; +} +.nav-heading > span[data-v-2e1fbf8d] { + color: var(--p-text-muted-color); + font-size: 0.875rem; +} +.help-search .p-inputtext[data-v-2e1fbf8d] { + width: 100%; + font-size: 0.9375rem; +} +.nav-sk[data-v-2e1fbf8d] { + flex-direction: column; + gap: 16px; + padding: 8px; + display: flex; +} +.nav-groups[data-v-2e1fbf8d] { + min-height: 0; + overflow-y: auto; +} +.nav-group + .nav-group[data-v-2e1fbf8d] { + margin-top: 20px; +} +.nav-group-title[data-v-2e1fbf8d] { + color: var(--p-text-muted-color); + justify-content: space-between; + align-items: center; + padding: 0 10px 8px; + font-size: 0.875rem; + font-weight: 600; + display: flex; +} +.nav-group-title > span[data-v-2e1fbf8d] { + font-weight: 400; +} +.nav-item[data-v-2e1fbf8d] { + text-align: left; + width: 100%; + color: var(--p-text-color); + cursor: pointer; + background: 0 0; + border: 0; + border-radius: 5px; + align-items: flex-start; + gap: 10px; + padding: 10px; + font-size: 0.9375rem; + line-height: 1.7; + display: flex; +} +.nav-item > i[data-v-2e1fbf8d] { + opacity: 0.6; + flex-shrink: 0; + margin-top: 5px; + font-size: 0.875rem; +} +.nav-item > span[data-v-2e1fbf8d] { + overflow-wrap: anywhere; +} +.nav-item[data-v-2e1fbf8d]:hover { + background: var(--p-content-hover-background); +} +.nav-item.active[data-v-2e1fbf8d] { + background: var(--p-highlight-background); + color: var(--p-primary-color); + font-weight: 600; +} +.nav-empty[data-v-2e1fbf8d] { + color: var(--p-text-muted-color); + text-align: center; + padding: 18px 8px; + font-size: 0.9375rem; +} +.nav-empty p[data-v-2e1fbf8d] { + margin: 0 0 8px; +} +.support-note[data-v-2e1fbf8d] { + border-top: 1px solid var(--console-panel-border); + color: var(--p-text-muted-color); + gap: 8px; + padding: 14px 4px 0; + font-size: 0.875rem; + line-height: 1.7; + display: flex; +} +.support-note > i[data-v-2e1fbf8d] { + flex-shrink: 0; + margin-top: 4px; +} +.help-content[data-v-2e1fbf8d] { + min-height: 480px; + padding: 30px 36px; +} +.content-sk[data-v-2e1fbf8d] { + flex-direction: column; + gap: 22px; + padding: 12px 0; + display: flex; +} +.article-category[data-v-2e1fbf8d] { + color: var(--p-text-muted-color); + align-items: center; + gap: 8px; + margin-bottom: 10px; + font-size: 0.875rem; + display: flex; +} +.content-title[data-v-2e1fbf8d] { + border-bottom: 1px solid var(--console-panel-border); + overflow-wrap: anywhere; + margin: 0 0 24px; + padding-bottom: 24px; + font-size: 1.5rem; + font-weight: 650; + line-height: 1.5; +} +.content-html[data-v-2e1fbf8d] { + color: var(--p-text-color); + overflow-wrap: anywhere; + font-size: 1rem; + line-height: 1.9; + overflow-x: auto; +} +.content-html[data-v-2e1fbf8d] img { + max-width: 100%; + height: auto; +} +.content-html[data-v-2e1fbf8d] a { + color: var(--p-primary-color); +} +.content-html[data-v-2e1fbf8d] table { + border-collapse: collapse; + max-width: 100%; +} +.content-html[data-v-2e1fbf8d] td, +.content-html[data-v-2e1fbf8d] th { + border: 1px solid var(--console-panel-border); + padding: 8px 12px; +} +.content-html[data-v-2e1fbf8d] pre { + background: var(--p-content-hover-background); + border-radius: 6px; + padding: 16px; + overflow-x: auto; +} +.article-attachments[data-v-2e1fbf8d] { + border-top: 1px solid var(--console-panel-border); + margin-top: 28px; + padding-top: 20px; +} +.article-attachments h4[data-v-2e1fbf8d] { + margin: 0 0 12px; + font-size: 1rem; + font-weight: 500; +} +.article-attachments ul[data-v-2e1fbf8d] { + flex-direction: column; + gap: 10px; + margin: 0; + padding: 0; + list-style: none; + display: flex; +} +.article-attachments a[data-v-2e1fbf8d] { + color: var(--p-primary-color); + align-items: center; + gap: 10px; + font-size: 0.9375rem; + text-decoration: none; + display: flex; +} +.article-attachments a:hover span[data-v-2e1fbf8d] { + text-decoration: underline; +} +.article-attachments a span[data-v-2e1fbf8d] { + overflow-wrap: anywhere; + min-width: 0; +} +.article-attachments i[data-v-2e1fbf8d] { + flex-shrink: 0; + font-size: 0.875rem; +} +.article-footer[data-v-2e1fbf8d] { + border-top: 1px solid var(--console-panel-border); + color: var(--p-text-muted-color); + justify-content: space-between; + align-items: center; + gap: 16px; + margin-top: 36px; + padding-top: 20px; + font-size: 0.9375rem; + display: flex; +} +.help-content[data-v-2e1fbf8d] .list-empty { + justify-content: center; + min-height: 370px; +} +.help-content[data-v-2e1fbf8d] .list-empty .p-button { + margin-top: 8px; +} +@media (width<=1024px) { + .help-body[data-v-2e1fbf8d] { + grid-template-columns: 240px minmax(0, 1fr); + gap: 16px; + } + .help-content[data-v-2e1fbf8d] { + padding: 24px; + } +} +@media (width<=768px) { + .page-head[data-v-2e1fbf8d] { + flex-wrap: wrap; + } + .help-body[data-v-2e1fbf8d] { + grid-template-columns: minmax(0, 1fr); + } + .help-nav[data-v-2e1fbf8d] { + gap: 14px; + max-height: 310px; + padding: 16px; + position: static; + } + .support-note[data-v-2e1fbf8d] { + display: none; + } + .help-content[data-v-2e1fbf8d] { + min-height: 340px; + padding: 22px 18px; + } + .content-title[data-v-2e1fbf8d] { + font-size: 1.3125rem; + } + .help-content[data-v-2e1fbf8d] .list-empty { + min-height: 280px; + padding: 24px 0; + } +} diff --git a/app/assets/styles/home.DWX5YkpJ.css b/app/assets/styles/home.DWX5YkpJ.css new file mode 100644 index 0000000..04a2e2a --- /dev/null +++ b/app/assets/styles/home.DWX5YkpJ.css @@ -0,0 +1,30 @@ +.legacy-login[data-v-64cc050c] { + text-align: center; +} +.legacy-login-icon[data-v-64cc050c] { + background: color-mix(in srgb, var(--p-primary-color) 10%, transparent); + width: 56px; + height: 56px; + color: var(--p-primary-color); + border-radius: 50%; + justify-content: center; + align-items: center; + margin-bottom: 20px; + font-size: 1.75em; + display: inline-flex; +} +.legacy-login p[data-v-64cc050c] { + color: var(--p-text-muted-color); + margin: 0; + line-height: 1.6; +} +.legacy-login-actions[data-v-64cc050c] { + flex-direction: column; + gap: 20px; + margin-top: 24px; + display: flex; +} +.legacy-login-link[data-v-64cc050c] { + color: var(--p-primary-color); + text-underline-offset: 3px; +} diff --git a/app/assets/styles/invoice.B6sYFYlb.css b/app/assets/styles/invoice.B6sYFYlb.css new file mode 100644 index 0000000..a3d76b1 --- /dev/null +++ b/app/assets/styles/invoice.B6sYFYlb.css @@ -0,0 +1,82 @@ +.invoice-detail-page[data-v-3b8f6704] { + flex-direction: column; + gap: 14px; + max-width: 896px; + margin: 0 auto; + display: flex; +} +.invoice-paper[data-v-3b8f6704] { + background: var(--p-content-background); + border: 1px solid var(--p-content-border-color); + padding: 42px 35px; +} +.invoice-paper h1[data-v-3b8f6704] { + text-align: center; + color: #9f454a; + margin: 0 0 14px; + font-size: 1.625rem; + font-weight: 500; +} +.invoice-number[data-v-3b8f6704] { + text-align: right; + color: var(--p-text-muted-color); + font-size: 0.875rem; +} +.invoice-paper dl[data-v-3b8f6704] { + border: 1px solid #cba0a2; + grid-template-columns: 1fr 1fr; + margin: 28px 0; + display: grid; +} +.invoice-paper dl > div[data-v-3b8f6704] { + border-bottom: 1px solid #e7cccd; + flex-direction: column; + gap: 10px; + min-width: 0; + padding: 18px; + display: flex; +} +.invoice-paper dt[data-v-3b8f6704] { + color: var(--p-text-muted-color); + font-size: 0.875rem; +} +.invoice-paper dd[data-v-3b8f6704] { + overflow-wrap: anywhere; + margin: 0; +} +.invoice-total[data-v-3b8f6704] { + border-block: 1px solid #cba0a2; + justify-content: space-between; + gap: 21px; + padding: 21px 14px; + display: flex; +} +.invoice-total strong[data-v-3b8f6704] { + font-size: 1.5rem; +} +.invoice-actions[data-v-3b8f6704] { + flex-wrap: wrap; + justify-content: flex-end; + gap: 14px; + margin-top: 28px; + display: flex; +} +.invoice-file-hint[data-v-3b8f6704] { + text-align: right; + color: var(--p-text-muted-color); + font-size: 0.875rem; +} +.invoice-error[data-v-3b8f6704] { + flex-direction: column; + align-items: flex-start; + gap: 14px; + display: flex; +} +@media (width<=640px) { + .invoice-paper[data-v-3b8f6704] { + padding: 28px 14px; + } + .invoice-paper dl[data-v-3b8f6704] { + grid-template-columns: minmax(0, 1fr); + } +} diff --git a/app/assets/styles/invoices.t1P1GXOx.css b/app/assets/styles/invoices.t1P1GXOx.css new file mode 100644 index 0000000..3d01db1 --- /dev/null +++ b/app/assets/styles/invoices.t1P1GXOx.css @@ -0,0 +1,169 @@ +.list-head-actions[data-v-86fc6dc2] a.p-button { + text-decoration: none; +} +.title-cell[data-v-86fc6dc2] { + align-items: center; + gap: 8px; + display: flex; +} +.title-type[data-v-86fc6dc2] { + color: var(--p-text-muted-color, #94a3b8); + border: 1px solid var(--p-content-border-color, #e2e8f0); + white-space: nowrap; + border-radius: 999px; + flex-shrink: 0; + padding: 0 8px; + font-size: 0.875rem; +} +.amount[data-v-86fc6dc2] { + color: #ef4444; + font-weight: 500; +} +.invoice-row-actions[data-v-86fc6dc2] { + align-items: center; + gap: 2px; + display: inline-flex; +} +.apply[data-v-86fc6dc2] { + flex-direction: column; + gap: 18px; + display: flex; +} +.section-label[data-v-86fc6dc2] { + color: var(--p-text-muted-color, #64748b); + margin-bottom: 8px; + font-size: 0.9375rem; +} +.order-list[data-v-86fc6dc2] { + border: 1px solid var(--p-content-border-color, #e2e8f0); + border-radius: 10px; + flex-direction: column; + max-height: 220px; + display: flex; + overflow-y: auto; +} +.order-item[data-v-86fc6dc2] { + border-bottom: 1px solid var(--p-content-border-color, #f1f5f9); + cursor: pointer; + align-items: center; + gap: 12px; + padding: 10px 14px; + font-size: 0.9375rem; + display: flex; +} +.order-item[data-v-86fc6dc2]:last-child { + border-bottom: none; +} +.order-main[data-v-86fc6dc2] { + flex-direction: column; + flex: 1; + gap: 2px; + min-width: 0; + display: flex; +} +.order-title[data-v-86fc6dc2] { + align-items: center; + gap: 8px; + display: flex; +} +.order-host[data-v-86fc6dc2] { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +.order-host[data-v-86fc6dc2], +.order-time[data-v-86fc6dc2] { + color: var(--p-text-muted-color, #94a3b8); + font-size: 0.875rem; +} +.order-amount[data-v-86fc6dc2] { + color: #ef4444; + font-weight: 500; +} +.no-data[data-v-86fc6dc2] { + text-align: center; + color: var(--p-text-muted-color, #94a3b8); + border: 1px dashed var(--p-content-border-color, #e2e8f0); + border-radius: 10px; + padding: 20px; + font-size: 0.9375rem; +} +.apply-grid[data-v-86fc6dc2] { + grid-template-columns: 1fr 1fr; + gap: 14px; + display: grid; +} +.field[data-v-86fc6dc2] { + flex-direction: column; + gap: 6px; + display: flex; +} +.field label[data-v-86fc6dc2] { + color: var(--p-text-color, #334155); + font-size: 0.9375rem; +} +.field-tip[data-v-86fc6dc2] { + color: var(--p-primary-color, #3b82f6); + font-size: 0.875rem; + text-decoration: none; +} +.total-tip[data-v-86fc6dc2] { + color: var(--p-text-muted-color, #64748b); + margin-right: auto; + font-size: 0.9375rem; +} +.total-tip b[data-v-86fc6dc2] { + color: #ef4444; + font-size: 1.0625rem; +} +.invoice-link[data-v-86fc6dc2] { + color: var(--p-text-color); + text-decoration: none; +} +.invoice-link[data-v-86fc6dc2]:hover { + text-decoration: underline; +} +.list-foot[data-v-86fc6dc2] { + justify-content: center; +} +.list-table[data-v-86fc6dc2] .p-datatable-thead > tr > th { + padding: 12px 14px; +} +.list-table[data-v-86fc6dc2] .p-datatable-tbody > tr > td { + padding: 18px 14px; +} +.request-page[data-v-86fc6dc2] { + flex-direction: column; + gap: 21px; + display: flex; +} +.request-page h2[data-v-86fc6dc2] { + margin: 0; + font-size: 1.25rem; + font-weight: 600; +} +.request-page .apply-grid[data-v-86fc6dc2] { + border-top: 1px solid var(--p-content-border-color); + padding-top: 28px; +} +.request-actions[data-v-86fc6dc2] { + justify-content: flex-end; + align-items: center; + gap: 14px; + margin-top: 14px; + display: flex; +} +.request-actions > span[data-v-86fc6dc2] { + margin-right: auto; +} +@media (width<=640px) { + .apply-grid[data-v-86fc6dc2] { + grid-template-columns: minmax(0, 1fr); + } + .request-actions[data-v-86fc6dc2] { + flex-wrap: wrap; + } + .request-actions > span[data-v-86fc6dc2] { + flex-basis: 100%; + } +} diff --git a/app/assets/styles/logbook.Y7gm684m.css b/app/assets/styles/logbook.Y7gm684m.css new file mode 100644 index 0000000..dff810b --- /dev/null +++ b/app/assets/styles/logbook.Y7gm684m.css @@ -0,0 +1,71 @@ +.list-page[data-v-0e32233b] { + gap: 21px; +} +.list-head h2[data-v-0e32233b], +.page-head h2[data-v-0e32233b] { + margin: 0; + font-size: 1.125rem; + font-weight: 700; + line-height: 24.5px; +} +.list-toolbar[data-v-0e32233b], +.list-toolbar-right[data-v-0e32233b] { + justify-content: flex-start; + gap: 7px; +} +.list-search[data-v-0e32233b], +.list-select[data-v-0e32233b] { + width: 280px; +} +.list-table[data-v-0e32233b] { + border-radius: 6px; + box-shadow: 0 1px 3px #0f172a12; +} +.list-foot[data-v-0e32233b] { + justify-content: center; +} +.list-foot > .list-bulk[data-v-0e32233b]:empty { + display: none; +} +[data-v-0e32233b] .p-datatable-header-cell { + background: var(--p-content-hover-background); + padding: 10.5px 14px; + font-size: 1rem; + font-weight: 600; +} +[data-v-0e32233b] .p-datatable-tbody > tr > td { + padding: 10.5px 14px; + font-size: 1rem; +} +[data-v-0e32233b] .p-tag { + font-size: 0.875rem; + font-weight: 500; +} +[data-v-0e32233b] .list-empty { + gap: 14px; + min-height: 300px; + padding: 42px 21px; +} +[data-v-0e32233b] .list-empty i { + opacity: 1; + font-size: 1.875rem; +} +[data-v-0e32233b] .list-empty-title { + font-size: 1rem; +} +[data-v-0e32233b] .list-empty-desc { + font-size: 0.875rem; +} +.field[data-v-0e32233b] { + gap: 7px; +} +.field label[data-v-0e32233b] { + font-size: 0.875rem; +} +@media (width<=768px) { + .list-search[data-v-0e32233b], + .list-select[data-v-0e32233b], + .list-toolbar-right[data-v-0e32233b] { + width: 100%; + } +} diff --git a/app/assets/styles/login.Clyo2_3T.css b/app/assets/styles/login.Clyo2_3T.css new file mode 100644 index 0000000..e9b416c --- /dev/null +++ b/app/assets/styles/login.Clyo2_3T.css @@ -0,0 +1,41 @@ +.login-captcha[data-v-7896f676] { + align-items: center; + min-width: 0; + height: max(78px, 30px + 3.1em); + display: grid; +} +.captcha-placeholder[data-v-7896f676] { + border: 1px solid var(--p-form-field-border-color); + border-radius: var(--p-inputtext-border-radius, 6px); + background: var(--p-content-background); + width: 100%; + min-height: 44px; + color: var(--p-text-color); + font: inherit; + cursor: pointer; + justify-content: center; + align-items: center; + gap: 8px; + padding: 10px 12px; + display: flex; +} +.captcha-placeholder[data-v-7896f676]:disabled { + cursor: not-allowed; + opacity: 0.65; +} +.captcha-placeholder[data-v-7896f676]:focus-visible { + outline: 2px solid var(--p-primary-color); + outline-offset: 2px; +} +.captcha-placeholder.has-error[data-v-7896f676] { + border-color: var(--p-red-500, #ef4444); + color: var(--p-red-600, #dc2626); +} +.code-row[data-v-7896f676] .p-button { + width: 9em; +} +@media (width<=360px) { + .code-row[data-v-7896f676] .p-button { + width: 100%; + } +} diff --git a/app/assets/styles/messages.asRdYcVu.css b/app/assets/styles/messages.asRdYcVu.css new file mode 100644 index 0000000..3c5dcc5 --- /dev/null +++ b/app/assets/styles/messages.asRdYcVu.css @@ -0,0 +1,193 @@ +.list-page[data-v-e9dbafec] { + gap: 21px; +} +.page-heading h2[data-v-e9dbafec] { + margin: 0; + font-size: 1.25rem; + font-weight: 650; + line-height: 2rem; +} +.page-heading p[data-v-e9dbafec] { + color: var(--p-text-muted-color); + margin: 4px 0 0; + font-size: 0.9375rem; +} +.message-panel[data-v-e9dbafec] { + border: 1px solid var(--console-panel-border); + background: var(--console-panel-bg); + border-radius: 8px; + min-width: 0; + overflow: hidden; +} +.list-toolbar[data-v-e9dbafec] { + border-bottom: 1px solid var(--console-panel-border); + padding: 20px; +} +.list-toolbar-right[data-v-e9dbafec] { + flex: 1; + gap: 10px; +} +.search-field[data-v-e9dbafec] { + flex: 1; + min-width: 200px; + max-width: 340px; +} +.search-field .list-search[data-v-e9dbafec] { + width: 100%; +} +.list-select[data-v-e9dbafec] { + width: 150px; +} +.selection-toolbar[data-v-e9dbafec] { + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + gap: 10px; + min-height: 58px; + padding: 10px 20px; + display: flex; +} +.selection-summary[data-v-e9dbafec] { + color: var(--p-text-muted-color); + font-size: 0.9375rem; +} +.bulk-actions[data-v-e9dbafec] { + align-items: center; + gap: 8px; + display: flex; +} +.list-table[data-v-e9dbafec] { + box-shadow: none; + border: 0; + border-radius: 0; +} +.message-error[data-v-e9dbafec] { + flex-direction: column; + align-items: flex-start; + gap: 14px; + padding: 20px; + display: flex; +} +.message-panel > .p-message[data-v-e9dbafec] { + margin: 0 20px 14px; +} +[data-v-e9dbafec] .p-datatable-header-cell { + background: var(--p-content-hover-background); + padding: 12px 20px; + font-size: 0.9375rem; + font-weight: 600; +} +[data-v-e9dbafec] .p-datatable-tbody > tr > td { + padding: 16px 20px; + font-size: 1rem; +} +[data-v-e9dbafec] .list-empty { + min-height: 300px; +} +.mail-title[data-v-e9dbafec] { + color: var(--p-text-muted-color); + cursor: pointer; + text-align: left; + overflow-wrap: anywhere; + background: 0 0; + border: 0; + align-items: center; + gap: 9px; + padding: 0; + line-height: 1.6; + display: inline-flex; +} +.mail-title[data-v-e9dbafec]:hover { + color: var(--p-primary-color); +} +.mail-title.unread[data-v-e9dbafec] { + color: var(--p-text-color); + font-weight: 600; +} +.mail-title.unread[data-v-e9dbafec]:hover { + color: var(--p-primary-color); +} +.mail-dot[data-v-e9dbafec] { + background: var(--p-primary-color); + border-radius: 50%; + flex-shrink: 0; + width: 7px; + height: 7px; +} +.list-foot[data-v-e9dbafec] { + border-top: 1px solid var(--console-panel-border); + justify-content: flex-end; + padding: 16px 20px; +} +.list-foot > .list-bulk[data-v-e9dbafec]:empty { + display: none; +} +.detail-state[data-v-e9dbafec] { + flex-direction: column; + align-items: flex-start; + gap: 18px; + padding: 12px 0; + display: flex; +} +.detail-state > .p-skeleton[data-v-e9dbafec] { + align-self: stretch; +} +.detail-meta[data-v-e9dbafec] { + border-bottom: 1px solid var(--console-panel-border); + color: var(--p-text-muted-color); + flex-wrap: wrap; + align-items: center; + gap: 10px; + margin-bottom: 20px; + padding-bottom: 16px; + font-size: 0.9375rem; + display: flex; +} +.detail-body[data-v-e9dbafec] { + overflow-wrap: anywhere; + font-size: 1rem; + line-height: 1.9; + overflow-x: auto; +} +.detail-body[data-v-e9dbafec] img { + max-width: 100%; + height: auto; +} +.detail-body[data-v-e9dbafec] a { + color: var(--p-primary-color); +} +.detail-nav[data-v-e9dbafec] { + gap: 8px; + margin-right: auto; + display: flex; +} +.confirm-text[data-v-e9dbafec] { + margin: 0 0 12px; + font-size: 1rem; + line-height: 1.8; +} +@media (width<=768px) { + .list-toolbar[data-v-e9dbafec] { + padding: 16px; + } + .list-toolbar-right[data-v-e9dbafec] { + grid-template-columns: repeat(2, minmax(0, 1fr)); + width: 100%; + display: grid; + } + .search-field[data-v-e9dbafec] { + grid-column: 1/-1; + min-width: 0; + max-width: none; + } + .list-select[data-v-e9dbafec] { + width: 100%; + } + .selection-toolbar[data-v-e9dbafec] { + padding: 10px 16px; + } + .list-foot[data-v-e9dbafec] { + justify-content: center; + padding: 14px 8px; + } +} diff --git a/app/assets/styles/news.CbIzdrjt.css b/app/assets/styles/news.CbIzdrjt.css new file mode 100644 index 0000000..8d43c04 --- /dev/null +++ b/app/assets/styles/news.CbIzdrjt.css @@ -0,0 +1,198 @@ +.news-list[data-v-0f61b69d] { + flex-direction: column; + gap: 12px; + display: flex; +} +.news-card[data-v-0f61b69d] { + text-align: left; + background: var(--p-content-background); + border: 1px solid var(--p-content-border-color, #e2e8f0); + cursor: pointer; + border-radius: 10px; + gap: 14px; + width: 100%; + padding: 16px 18px; + transition: border-color 0.15s; + display: flex; +} +.news-card[data-v-0f61b69d]:hover { + border-color: var(--p-primary-color, #0052d9); +} +.news-img[data-v-0f61b69d] { + -o-object-fit: cover; + object-fit: cover; + border-radius: 8px; + flex-shrink: 0; + width: 120px; + height: 76px; +} +.news-main[data-v-0f61b69d] { + flex-direction: column; + flex: 1; + gap: 6px; + min-width: 0; + display: flex; +} +.news-title[data-v-0f61b69d] { + color: var(--p-text-color); + font-size: 1.0625rem; +} +.news-excerpt[data-v-0f61b69d] { + -webkit-line-clamp: 2; + line-clamp: 2; + -webkit-box-orient: vertical; + font-size: 0.9375rem; + line-height: 1.7; + display: -webkit-box; + overflow: hidden; +} +.news-excerpt[data-v-0f61b69d], +.news-meta[data-v-0f61b69d] { + color: var(--p-text-muted-color, #94a3b8); +} +.news-meta[data-v-0f61b69d] { + align-items: center; + gap: 10px; + font-size: 0.875rem; + display: flex; +} +.news-detail[data-v-0f61b69d] { + flex-direction: column; + gap: 14px; + display: flex; +} +.news-detail-time[data-v-0f61b69d] { + color: var(--p-text-muted-color, #94a3b8); + font-size: 0.875rem; +} +.news-detail-html[data-v-0f61b69d] { + color: var(--p-text-color, #334155); + word-break: break-word; + max-height: 60vh; + font-size: 1rem; + line-height: 1.9; + overflow-y: auto; +} +.news-detail-html[data-v-0f61b69d] img { + max-width: 100%; + height: auto; +} +.news-detail-html[data-v-0f61b69d] table { + border-collapse: collapse; + max-width: 100%; +} +.news-detail-html[data-v-0f61b69d] td, +.news-detail-html[data-v-0f61b69d] th { + border: 1px solid var(--p-content-border-color, #e2e8f0); + padding: 6px 10px; +} +@media (width<=768px) { + .news-img[data-v-0f61b69d] { + display: none; + } +} +.list-page[data-v-0f61b69d] { + gap: 21px; +} +.list-head h2[data-v-0f61b69d], +.page-head h2[data-v-0f61b69d] { + margin: 0; + font-size: 1.125rem; + font-weight: 700; + line-height: 24.5px; +} +.list-toolbar[data-v-0f61b69d], +.list-toolbar-right[data-v-0f61b69d] { + justify-content: flex-start; + gap: 7px; +} +.list-search[data-v-0f61b69d], +.list-select[data-v-0f61b69d] { + width: 280px; +} +.list-table[data-v-0f61b69d] { + border-radius: 6px; + box-shadow: 0 1px 3px #0f172a12; +} +.list-foot[data-v-0f61b69d] { + justify-content: center; +} +.list-foot > .list-bulk[data-v-0f61b69d]:empty { + display: none; +} +[data-v-0f61b69d] .p-datatable-header-cell { + background: var(--p-content-hover-background); + padding: 10.5px 14px; + font-size: 1rem; + font-weight: 600; +} +[data-v-0f61b69d] .p-datatable-tbody > tr > td { + padding: 10.5px 14px; + font-size: 1rem; +} +[data-v-0f61b69d] .p-tag { + font-size: 0.875rem; + font-weight: 500; +} +[data-v-0f61b69d] .list-empty { + gap: 14px; + min-height: 300px; + padding: 42px 21px; +} +[data-v-0f61b69d] .list-empty i { + opacity: 1; + font-size: 1.875rem; +} +[data-v-0f61b69d] .list-empty-title { + font-size: 1rem; +} +[data-v-0f61b69d] .list-empty-desc { + font-size: 0.875rem; +} +.field[data-v-0f61b69d] { + gap: 7px; +} +.field label[data-v-0f61b69d] { + font-size: 0.875rem; +} +@media (width<=768px) { + .list-search[data-v-0f61b69d], + .list-select[data-v-0f61b69d], + .list-toolbar-right[data-v-0f61b69d] { + width: 100%; + } +} +.news-card[data-v-0f61b69d] { + border-radius: 6px; + padding: 14px; + box-shadow: 0 1px 3px #0f172a0a; +} +.news-title[data-v-0f61b69d] { + font-size: 1rem; + font-weight: 600; +} +.news-excerpt[data-v-0f61b69d], +.news-meta[data-v-0f61b69d] { + font-size: 0.875rem; +} +.news-list[data-v-0f61b69d] { + gap: 14px; +} +.list-toolbar[data-v-0f61b69d] { + flex-wrap: wrap; +} +.list-toolbar[data-v-0f61b69d] .list-segments { + background: 0 0; + padding: 0; +} +.list-toolbar[data-v-0f61b69d] .list-seg { + border: 0; + border-radius: 0; + padding: 10.5px 14px; +} +.list-toolbar[data-v-0f61b69d] .list-seg.active { + box-shadow: none; + color: var(--p-primary-color); + border-bottom: 2px solid var(--p-primary-color); + background: 0 0; +} diff --git a/app/assets/styles/notices.BXNGOj-Q.css b/app/assets/styles/notices.BXNGOj-Q.css new file mode 100644 index 0000000..311beb1 --- /dev/null +++ b/app/assets/styles/notices.BXNGOj-Q.css @@ -0,0 +1,186 @@ +.list[data-v-4ba0157b] { + flex-direction: column; + display: flex; +} +.notice-item[data-v-4ba0157b] { + border: none; + border-bottom: 1px solid var(--p-content-border-color, #f1f5f9); + cursor: pointer; + text-align: left; + color: var(--p-text-color, #334155); + background: 0 0; + justify-content: space-between; + align-items: center; + gap: 16px; + padding: 14px 4px; + font-size: 1rem; + text-decoration: none; + display: flex; +} +.notice-item:hover .notice-title[data-v-4ba0157b] { + color: var(--p-primary-color, #10b981); +} +.notice-title[data-v-4ba0157b] { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +.notice-time[data-v-4ba0157b] { + flex-shrink: 0; +} +.detail-time[data-v-4ba0157b], +.notice-time[data-v-4ba0157b] { + color: var(--p-text-muted-color, #94a3b8); + font-size: 0.9375rem; +} +.detail-time[data-v-4ba0157b] { + margin-bottom: 12px; +} +.detail-content[data-v-4ba0157b] { + color: var(--p-text-color, #334155); + line-height: 1.8; +} +.detail-content[data-v-4ba0157b] img { + max-width: 100%; +} +.list-page[data-v-4ba0157b] { + gap: 21px; +} +.list-head h2[data-v-4ba0157b], +.page-head h2[data-v-4ba0157b] { + margin: 0; + font-size: 1.125rem; + font-weight: 700; + line-height: 24.5px; +} +.list-toolbar[data-v-4ba0157b], +.list-toolbar-right[data-v-4ba0157b] { + justify-content: flex-start; + gap: 7px; +} +.list-search[data-v-4ba0157b], +.list-select[data-v-4ba0157b] { + width: 280px; +} +.list-table[data-v-4ba0157b] { + border-radius: 6px; + box-shadow: 0 1px 3px #0f172a12; +} +.list-foot[data-v-4ba0157b] { + justify-content: center; +} +.list-foot > .list-bulk[data-v-4ba0157b]:empty { + display: none; +} +[data-v-4ba0157b] .p-datatable-header-cell { + background: var(--p-content-hover-background); + padding: 10.5px 14px; + font-size: 1rem; + font-weight: 600; +} +[data-v-4ba0157b] .p-datatable-tbody > tr > td { + padding: 10.5px 14px; + font-size: 1rem; +} +[data-v-4ba0157b] .p-tag { + font-size: 0.875rem; + font-weight: 500; +} +[data-v-4ba0157b] .list-empty { + gap: 14px; + min-height: 300px; + padding: 42px 21px; +} +[data-v-4ba0157b] .list-empty i { + opacity: 1; + font-size: 1.875rem; +} +[data-v-4ba0157b] .list-empty-title { + font-size: 1rem; +} +[data-v-4ba0157b] .list-empty-desc { + font-size: 0.875rem; +} +.field[data-v-4ba0157b] { + gap: 7px; +} +.field label[data-v-4ba0157b] { + font-size: 0.875rem; +} +@media (width<=768px) { + .list-search[data-v-4ba0157b], + .list-select[data-v-4ba0157b], + .list-toolbar-right[data-v-4ba0157b] { + width: 100%; + } +} +.notice-heading h2[data-v-4ba0157b] { + margin: 0; + font-size: 1.125rem; +} +.notice-heading p[data-v-4ba0157b] { + color: var(--p-text-muted-color); + margin: 10.5px 0 0; + font-size: 1rem; +} +.notice-tabs[data-v-4ba0157b] { + gap: 28px; + padding: 0 14px; + display: flex; +} +.notice-tabs span[data-v-4ba0157b] { + color: var(--p-primary-color); + border-bottom: 1px solid var(--p-primary-color); + padding-bottom: 7px; +} +.notice-list[data-v-4ba0157b] { + flex-direction: column; + gap: 14px; + display: flex; +} +.notice-item[data-v-4ba0157b] { + border: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + border-radius: 6px; + padding: 14px; + box-shadow: 0 1px 3px #0f172a0a; +} +.notice-time[data-v-4ba0157b] { + font-size: 0.875rem; +} +.notice-article[data-v-4ba0157b] { + max-width: 896px; + margin: 0 auto; +} +.notice-article h1[data-v-4ba0157b] { + margin: 14px 0; + font-size: 1.125rem; +} +.article-back[data-v-4ba0157b] { + font: inherit; + color: var(--p-text-muted-color); + cursor: pointer; + background: 0 0; + border: 0; + padding: 0; + font-size: 0.875rem; +} +.detail-content[data-v-4ba0157b] { + border-top: 1px solid var(--p-content-border-color); + padding-top: 28px; + font-size: 1rem; + line-height: 24.5px; +} +.detail-time[data-v-4ba0157b] { + font-size: 0.875rem; +} +@media (width<=768px) { + .notice-item[data-v-4ba0157b] { + flex-direction: column; + align-items: flex-start; + gap: 7px; + } + .notice-title[data-v-4ba0157b] { + white-space: normal; + } +} diff --git a/app/assets/styles/official-site.pBD-PXD7.css b/app/assets/styles/official-site.pBD-PXD7.css new file mode 100644 index 0000000..f6f7a5b --- /dev/null +++ b/app/assets/styles/official-site.pBD-PXD7.css @@ -0,0 +1,1180 @@ +.official-site { + min-height: 100vh; + color: var(--p-text-color, #334155); + background: var(--console-page-bg, #f8fafc); + --official-primary: var(--p-primary-color, #0052d9); + --official-accent: #eff6ff; +} +.official-site a { + color: inherit; + text-decoration: none; +} +.official-header { + z-index: 20; + border-bottom: 1px solid var(--console-panel-border, #e2e8f0); + background: color-mix( + in srgb, + var(--p-content-background, #fff) 92%, + transparent + ); + -webkit-backdrop-filter: blur(12px); + backdrop-filter: blur(12px); + position: sticky; + top: 0; +} +.official-header-inner { + align-items: center; + gap: 32px; + width: min(1200px, 100% - 36px); + min-height: 66px; + margin: 0 auto; + display: flex; +} +.official-brand { + align-items: center; + gap: 10px; + min-width: 0; + display: inline-flex; +} +.official-brand-mark { + background: color-mix( + in srgb, + var(--official-primary) 11%, + var(--p-content-background) + ); + border-radius: 5px; + justify-content: center; + align-items: flex-end; + gap: 2px; + width: 30px; + height: 30px; + padding: 6px; + display: inline-flex; +} +.official-brand-mark span { + background: var(--official-primary); + border-radius: 2px 2px 1px 1px; + width: 4px; +} +.official-brand-mark span:first-child { + opacity: 0.6; + height: 8px; +} +.official-brand-mark span:nth-child(2) { + height: 14px; +} +.official-brand-mark span:nth-child(3) { + opacity: 0.8; + height: 10px; +} +.official-brand-image { + -o-object-fit: contain; + object-fit: contain; + width: auto; + max-width: 136px; + max-height: 36px; + display: block; +} +.official-brand-copy { + flex-direction: column; + min-width: 0; + line-height: 1.2; + display: flex; +} +.official-brand-copy strong { + color: var(--p-text-color); + text-overflow: ellipsis; + white-space: nowrap; + font-size: 1rem; + font-weight: 650; + overflow: hidden; +} +.official-brand-copy small { + color: var(--p-text-muted-color); + white-space: nowrap; + margin-top: 3px; + font-size: 0.75rem; +} +.official-nav { + flex: 1; + justify-content: center; + align-items: center; + gap: 27px; + display: flex; +} +.official-mobile-nav a, +.official-nav a { + color: var(--p-text-muted-color); + font-size: 0.92rem; + transition: color 0.18s; +} +.official-mobile-nav a:hover, +.official-nav a:hover { + color: var(--official-primary); +} +.official-header-actions { + align-items: center; + gap: 10px; + display: flex; +} +.official-header-login { + border: 1px solid var(--console-panel-border); + background: var(--p-content-background); + color: var(--p-text-color); + white-space: nowrap; + border-radius: 4px; + align-items: center; + gap: 7px; + padding: 9px 13px; + font-size: 0.88rem; + transition: + border-color 0.18s, + color 0.18s; + display: inline-flex; +} +.official-header-login i { + color: var(--official-primary); + font-size: 0.78rem; +} +.official-header-login:hover { + border-color: var(--official-primary); + color: var(--official-primary); +} +.official-menu-toggle { + border: 1px solid var(--console-panel-border); + background: var(--p-content-background); + width: 38px; + height: 38px; + color: var(--p-text-color); + cursor: pointer; + border-radius: 4px; + display: none; +} +.official-mobile-nav { + display: none; +} +.official-main { + width: min(1200px, 100% - 36px); + margin: 0 auto; +} +.official-page { + padding: 35px 0 50px; +} +.official-hero-top { + grid-template-columns: 1.05fr 0.95fr; + align-items: end; + gap: 56px; + padding: 36px 0 28px; + display: grid; +} +.official-eyebrow, +.official-section-eyebrow { + color: var(--official-primary); + align-items: center; + gap: 8px; + font-size: 0.85rem; + font-weight: 600; + display: inline-flex; +} +.official-eyebrow { + border: 1px solid + color-mix(in srgb, var(--official-primary) 18%, var(--console-panel-border)); + background: color-mix( + in srgb, + var(--official-primary) 5%, + var(--p-content-background) + ); + border-radius: 20px; + padding: 6px 10px; +} +.official-eyebrow > span { + background: var(--official-primary); + width: 7px; + height: 7px; + box-shadow: 0 0 0 3px + color-mix(in srgb, var(--official-primary) 13%, transparent); + border-radius: 50%; +} +.official-hero-heading h1 { + max-width: 700px; + color: var(--p-text-color); + letter-spacing: -0.055em; + white-space: pre-line; + margin: 21px 0 9px; + font-size: clamp(2.15rem, 4.25vw, 3.7rem); + font-weight: 700; + line-height: 1.18; +} +.official-hero-heading h2 { + color: var(--p-text-muted-color); + margin: 0; + font-size: clamp(1.1rem, 1.7vw, 1.42rem); + font-weight: 500; +} +.official-hero-intro { + padding: 0 0 3px; +} +.official-hero-intro > p { + max-width: 500px; + color: var(--p-text-muted-color); + margin: 0 0 18px; + font-size: 1rem; + line-height: 1.8; +} +.official-hero-features { + flex-wrap: wrap; + gap: 9px 18px; + margin-bottom: 22px; + display: flex; +} +.official-hero-features span { + color: var(--p-text-color); + align-items: center; + gap: 7px; + font-size: 0.88rem; + display: inline-flex; +} +.official-hero-features i { + color: var(--official-primary); + font-size: 0.82rem; +} +.official-contact-actions, +.official-hero-actions { + flex-wrap: wrap; + align-items: center; + gap: 10px; + display: flex; +} +.official-button { + border: 1px solid #0000; + border-radius: 4px; + justify-content: center; + align-items: center; + gap: 9px; + min-height: 38px; + padding: 8px 13px; + font-size: 0.91rem; + font-weight: 500; + line-height: 1.3; + transition: + background 0.18s, + border-color 0.18s, + color 0.18s, + transform 0.18s; + display: inline-flex; +} +.official-button:hover { + transform: translateY(-1px); +} +.official-button.primary { + background: var(--official-primary); + color: var(--p-primary-contrast-color, #fff); + box-shadow: 0 2px 5px + color-mix(in srgb, var(--official-primary) 20%, transparent); +} +.official-button.primary:hover { + filter: brightness(0.96); +} +.official-button.secondary { + border-color: var(--console-panel-border); + background: var(--p-content-background); + color: var(--p-text-color); +} +.official-button.secondary:hover { + border-color: color-mix( + in srgb, + var(--official-primary) 40%, + var(--console-panel-border) + ); + color: var(--official-primary); +} +.official-button i { + font-size: 0.8rem; +} +.official-hero-visual { + border: 1px solid + color-mix(in srgb, var(--official-primary) 17%, var(--console-panel-border)); + background: linear-gradient( + 122deg, + color-mix(in srgb, var(--official-accent) 86%, var(--p-content-background)) + 0, + var(--p-content-background) 57%, + color-mix(in srgb, var(--official-primary) 10%, var(--p-content-background)) + 100% + ); + min-height: 315px; + box-shadow: var(--console-panel-shadow); + border-radius: 6px; + position: relative; + overflow: hidden; +} +.official-visual-grid { + opacity: 0.48; + background-image: + linear-gradient( + to right, + color-mix(in srgb, var(--official-primary) 11%, transparent) 1px, + transparent 1px + ), + linear-gradient( + to bottom, + color-mix(in srgb, var(--official-primary) 11%, transparent) 1px, + transparent 1px + ); + background-size: 34px 34px; + position: absolute; + inset: 0; + -webkit-mask-image: linear-gradient(110deg, #000 5%, #0000 83%); + mask-image: linear-gradient(110deg, #000 5%, #0000 83%); +} +.official-visual-orbit { + border: 1px solid color-mix(in srgb, var(--official-primary) 18%, transparent); + border-radius: 50%; + width: 290px; + height: 290px; + position: absolute; +} +.orbit-one { + top: 11px; + left: 8%; +} +.orbit-one, +.orbit-two { + transform: scaleX(1.45); +} +.orbit-two { + top: 54px; + left: 14%; +} +.official-visual-network { + position: absolute; + inset: 0; +} +.network-line { + transform-origin: 0; + background: linear-gradient( + 90deg, + transparent, + color-mix(in srgb, var(--official-primary) 55%, #fff), + transparent + ); + width: 47%; + height: 1px; + position: absolute; + top: 50%; + left: 14%; +} +.line-one { + transform: rotate(-18deg); +} +.line-two { + transform: rotate(19deg); +} +.network-node { + border: 2px solid var(--p-content-background); + background: var(--official-primary); + width: 8px; + height: 8px; + box-shadow: 0 0 0 4px + color-mix(in srgb, var(--official-primary) 14%, transparent); + border-radius: 50%; + position: absolute; +} +.node-one { + top: 26%; + left: 23%; +} +.node-two { + top: 68%; + left: 33%; +} +.node-three { + top: 37%; + left: 53%; +} +.node-four { + top: 62%; + left: 62%; +} +.official-art-caption { + color: color-mix(in srgb, var(--p-text-color) 74%, transparent); + align-items: center; + gap: 9px; + font-size: 0.84rem; + display: inline-flex; + position: absolute; + bottom: 23px; + left: 25px; +} +.official-art-pulse { + background: var(--official-primary); + border-radius: 50%; + width: 7px; + height: 7px; +} +.official-hero-stat { + width: min(265px, 40%); + min-height: 215px; + padding: 20px; + position: absolute; + top: 28px; + right: 28px; +} +.official-stat-kicker { + color: var(--p-text-muted-color); + font-size: 0.82rem; +} +.official-stat-value { + color: var(--p-text-color); + letter-spacing: -0.04em; + margin-top: 18px; + font-size: 1.9rem; + font-weight: 700; + line-height: 1.1; +} +.official-stat-value small { + color: var(--p-text-muted-color); + letter-spacing: 0; + margin-left: 4px; + font-size: 0.85rem; + font-weight: 500; +} +.official-hero-stat strong { + color: var(--p-text-color); + margin-top: 11px; + font-size: 0.95rem; + font-weight: 600; + display: block; +} +.official-hero-stat p { + color: var(--p-text-muted-color); + margin: 6px 0 0; + font-size: 0.82rem; + line-height: 1.55; +} +.official-floating-label { + border: 1px solid var(--console-panel-border); + background: var(--p-content-background); + color: var(--p-text-color); + box-shadow: var(--console-panel-shadow); + border-radius: 4px; + align-items: center; + gap: 8px; + padding: 9px 12px; + font-size: 0.86rem; + display: inline-flex; + position: absolute; + bottom: 66px; + left: 7%; +} +.official-floating-label i { + color: var(--official-primary); + font-size: 0.82rem; +} +.official-section { + margin-top: 52px; + scroll-margin-top: 87px; +} +.official-section-head { + justify-content: space-between; + align-items: flex-end; + gap: 25px; + margin-bottom: 20px; + display: flex; +} +.official-contact-panel h2, +.official-infra-copy h2, +.official-section-head h2 { + color: var(--p-text-color); + letter-spacing: -0.035em; + margin: 7px 0 6px; + font-size: clamp(1.45rem, 2.5vw, 2rem); + font-weight: 650; + line-height: 1.3; +} +.official-contact-panel p, +.official-infra-copy > p, +.official-section-head p { + max-width: 690px; + color: var(--p-text-muted-color); + margin: 0; + font-size: 0.96rem; + line-height: 1.7; +} +.official-section-badges { + flex-wrap: wrap; + justify-content: flex-end; + gap: 8px; + display: flex; +} +.official-section-badges span { + border: 1px solid var(--console-panel-border); + background: var(--p-content-background); + color: var(--p-text-muted-color); + white-space: nowrap; + border-radius: 4px; + align-items: center; + gap: 6px; + padding: 6px 9px; + font-size: 0.8rem; + display: inline-flex; +} +.official-section-badges i { + color: var(--official-primary); + font-size: 0.72rem; +} +.official-product-grid { + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 14px; + display: grid; +} +.official-product-card { + min-height: 315px; + padding: 18px; + transition: + border-color 0.18s, + box-shadow 0.18s, + transform 0.18s; + position: relative; +} +.official-product-card:hover { + border-color: color-mix( + in srgb, + var(--official-primary) 30%, + var(--console-panel-border) + ); + transform: translateY(-2px); + box-shadow: 0 5px 14px #0f172a14; +} +.official-product-icon { + border: 1px solid + color-mix(in srgb, var(--official-primary) 15%, var(--console-panel-border)); + background: color-mix( + in srgb, + var(--official-primary) 7%, + var(--p-content-background) + ); + width: 38px; + height: 38px; + color: var(--official-primary); + border-radius: 4px; + place-items: center; + font-size: 1.2rem; + display: grid; +} +.official-product-title-row { + justify-content: space-between; + align-items: flex-start; + gap: 10px; + margin-top: 16px; + display: flex; +} +.official-product-title-row h3 { + color: var(--p-text-color); + margin: 0; + font-size: 1.1rem; + font-weight: 600; +} +.official-product-title-row span { + color: var(--p-text-muted-color); + letter-spacing: 0.08em; + margin-top: 3px; + font-size: 0.72rem; + display: block; +} +.official-product-title-row > i { + color: var(--p-text-muted-color); + margin-top: 3px; + font-size: 0.88rem; +} +.official-product-description { + min-height: 42px; + color: var(--p-text-muted-color); + margin: 12px 0 0; + font-size: 0.87rem; + line-height: 1.6; +} +.official-product-price { + color: var(--p-text-color); + align-items: baseline; + gap: 7px; + margin-top: 15px; + font-size: 1.13rem; + font-weight: 650; + display: flex; +} +.official-product-price small { + color: var(--p-text-muted-color); + font-size: 0.79rem; + font-weight: 400; +} +.official-product-features { + border-top: 1px solid var(--console-panel-border); + gap: 7px; + margin: 14px 0; + padding: 14px 0 0; + list-style: none; + display: grid; +} +.official-product-features li { + color: var(--p-text-muted-color); + justify-content: space-between; + align-items: center; + gap: 12px; + font-size: 0.83rem; + display: flex; +} +.official-product-features i { + color: var(--official-primary); + font-size: 0.72rem; +} +.official-product-link { + align-items: center; + gap: 7px; + font-size: 0.88rem; + font-weight: 600; + display: inline-flex; + color: var(--official-primary) !important; +} +.official-product-link i { + font-size: 0.75rem; + transition: transform 0.18s; +} +.official-product-link:hover i { + transform: translate(3px); +} +.official-empty-card { + min-height: 200px; + color: var(--p-text-muted-color); + justify-content: center; + align-items: center; + gap: 8px; + display: flex; +} +.official-infra-panel { + grid-template-columns: 0.9fr 1.1fr; + min-height: 350px; + padding: 25px; + display: grid; + overflow: hidden; +} +.official-infra-copy { + flex-direction: column; + align-items: flex-start; + display: flex; +} +.official-infra-copy > p { + max-width: 470px; +} +.official-infra-stats { + flex-wrap: wrap; + gap: 28px; + margin: auto 0 0; + padding-top: 30px; + display: flex; +} +.official-infra-stats div { + flex-direction: column-reverse; + gap: 4px; + display: flex; +} +.official-infra-stats dt { + color: var(--p-text-muted-color); + font-size: 0.8rem; +} +.official-infra-stats dd { + color: var(--p-text-color); + margin: 0; + font-size: 1.2rem; + font-weight: 650; +} +.official-infra-stats dd small { + color: var(--p-text-muted-color); + margin-left: 4px; + font-size: 0.78rem; + font-weight: 400; +} +.official-infra-visual { + border: 1px solid + color-mix(in srgb, var(--official-primary) 14%, var(--console-panel-border)); + background: linear-gradient( + 130deg, + color-mix(in srgb, var(--official-accent) 70%, var(--p-content-background)), + var(--p-content-background) + ); + border-radius: 5px; + min-height: 285px; + position: relative; + overflow: hidden; +} +.official-infra-world { + opacity: 0.55; + place-items: center; + display: grid; + position: absolute; + inset: 0; +} +.official-infra-world:after, +.official-infra-world:before { + content: ""; + border: 1px solid color-mix(in srgb, var(--official-primary) 28%, transparent); + border-radius: 50%; + width: 205px; + height: 205px; + position: absolute; +} +.official-infra-world:after { + width: 270px; + height: 120px; + transform: rotate(-27deg); +} +.official-infra-world span { + background: var(--official-primary); + width: 6px; + height: 6px; + box-shadow: 0 0 0 5px + color-mix(in srgb, var(--official-primary) 13%, transparent); + border-radius: 50%; + position: absolute; +} +.official-infra-world span:first-child { + top: 28%; + left: 30%; +} +.official-infra-world span:nth-child(2) { + top: 40%; + right: 21%; +} +.official-infra-world span:nth-child(3) { + bottom: 20%; + left: 49%; +} +.official-infra-world span:nth-child(4) { + bottom: 33%; + left: 22%; +} +.official-infra-world span:nth-child(5) { + top: 19%; + right: 39%; +} +.official-infra-card { + width: min(320px, 74%); + padding: 15px; + position: absolute; + top: 22px; + right: 22px; +} +.official-infra-card-kicker { + color: var(--official-primary); + letter-spacing: 0.09em; + font-size: 0.72rem; + font-weight: 600; + display: block; +} +.official-infra-card > strong { + color: var(--p-text-color); + margin-top: 7px; + font-size: 0.98rem; + display: block; +} +.official-infra-card > p { + color: var(--p-text-muted-color); + margin: 4px 0 14px; + font-size: 0.78rem; +} +.official-resource-row { + color: var(--p-text-muted-color); + grid-template-columns: 86px minmax(40px, 1fr) auto; + align-items: center; + gap: 8px; + margin-top: 10px; + font-size: 0.77rem; + display: grid; +} +.official-resource-track { + background: color-mix( + in srgb, + var(--official-primary) 10%, + var(--console-panel-border) + ); + border-radius: 5px; + height: 5px; + overflow: hidden; +} +.official-resource-track i { + border-radius: inherit; + background: var(--official-primary); + height: 100%; + display: block; +} +.official-resource-row b { + color: var(--p-text-color); + white-space: nowrap; + font-size: 0.74rem; + font-weight: 500; +} +.official-reviews-head { + justify-content: flex-start; +} +.official-review-grid { + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 14px; + display: grid; +} +.official-review-card { + min-height: 190px; + padding: 18px; +} +.official-review-mark { + color: var(--official-primary); + font-size: 2rem; + font-weight: 700; + line-height: 0.9; +} +.official-review-card > p { + min-height: 52px; + color: var(--p-text-color); + margin: 10px 0 18px; + font-size: 0.92rem; + line-height: 1.65; +} +.official-review-person { + border-top: 1px solid var(--console-panel-border); + align-items: center; + gap: 10px; + padding-top: 13px; + display: flex; +} +.official-review-avatar, +.official-review-person img { + -o-object-fit: cover; + object-fit: cover; + background: color-mix( + in srgb, + var(--official-primary) 11%, + var(--p-content-background) + ); + width: 34px; + height: 34px; + color: var(--official-primary); + border-radius: 50%; + place-items: center; + display: grid; +} +.official-review-person div { + flex-direction: column; + gap: 2px; + display: flex; +} +.official-review-person strong { + color: var(--p-text-color); + font-size: 0.83rem; + font-weight: 600; +} +.official-review-person small { + color: var(--p-text-muted-color); + font-size: 0.75rem; +} +.official-contact-section { + margin-top: 50px; +} +.official-contact-panel { + border-left: 3px solid var(--official-primary); + justify-content: space-between; + align-items: center; + gap: 30px; + padding: 25px; + display: flex; +} +.official-contact-panel > div:first-child { + max-width: 670px; +} +.official-contact-actions { + flex-shrink: 0; + justify-content: flex-end; +} +.official-footer { + border-top: 1px solid var(--console-panel-border); + background: var(--p-content-background); +} +.official-footer-main { + grid-template-columns: 1.15fr 1.4fr 0.9fr; + gap: 42px; + width: min(1200px, 100% - 36px); + margin: 0 auto; + padding: 35px 0 28px; + display: grid; +} +.official-footer-brand > p { + max-width: 300px; + color: var(--p-text-muted-color); + margin: 15px 0 0; + font-size: 0.83rem; + line-height: 1.65; +} +.official-footer-groups { + flex-wrap: wrap; + gap: 30px; + display: flex; +} +.official-footer-contact, +.official-footer-group { + flex-direction: column; + align-items: flex-start; + gap: 10px; + display: flex; +} +.official-footer-contact h2, +.official-footer-group h2 { + color: var(--p-text-color); + margin: 2px 0 4px; + font-size: 0.88rem; + font-weight: 600; +} +.official-footer-contact a, +.official-footer-contact p, +.official-footer-group a { + color: var(--p-text-muted-color); + margin: 0; + font-size: 0.82rem; + line-height: 1.5; +} +.official-footer-contact a:hover, +.official-footer-group a:hover { + color: var(--official-primary); +} +.official-footer-contact a, +.official-footer-contact p { + align-items: flex-start; + gap: 8px; + display: flex; +} +.official-footer-contact i { + color: var(--official-primary); + margin-top: 2px; + font-size: 0.78rem; +} +.official-footer-qr { + color: var(--p-text-muted-color); + align-items: center; + gap: 10px; + font-size: 0.76rem; + display: flex; +} +.official-footer-qr img { + border: 1px solid var(--console-panel-border); + -o-object-fit: contain; + object-fit: contain; + border-radius: 4px; + width: 56px; + height: 56px; +} +.official-footer-bottom { + border-top: 1px solid var(--console-panel-border); + width: min(1200px, 100% - 36px); + min-height: 50px; + color: var(--p-text-muted-color); + justify-content: space-between; + align-items: center; + gap: 12px; + margin: 0 auto; + font-size: 0.76rem; + display: flex; +} +.official-footer-bottom > div { + gap: 17px; + display: flex; +} +.official-footer-bottom a:hover { + color: var(--official-primary); +} +.official-site a:focus-visible, +.official-site button:focus-visible { + outline: 2px solid var(--official-primary); + outline-offset: 3px; +} +@media (width<=900px) { + .official-header-inner { + gap: 18px; + } + .official-nav { + gap: 15px; + } + .official-hero-top { + gap: 35px; + } + .official-section-head { + flex-direction: column; + align-items: flex-start; + } + .official-section-badges { + justify-content: flex-start; + } + .official-infra-panel { + grid-template-columns: 1fr; + gap: 25px; + } + .official-infra-stats { + margin-top: 26px; + } + .official-footer-main { + grid-template-columns: 1fr 1.3fr; + } + .official-footer-contact { + grid-column: 2; + } +} +@media (width<=680px) { + .official-footer-bottom, + .official-footer-main, + .official-header-inner, + .official-main { + width: min(100% - 24px, 560px); + } + .official-header-inner { + justify-content: space-between; + min-height: 58px; + } + .official-nav { + display: none; + } + .official-header-login { + padding: 8px 9px; + font-size: 0.8rem; + } + .official-menu-toggle { + place-items: center; + display: inline-grid; + } + .official-mobile-nav { + border-top: 1px solid var(--console-panel-border); + background: var(--p-content-background); + gap: 0; + padding: 4px 12px 12px; + display: grid; + } + .official-mobile-nav a { + border-bottom: 1px solid var(--console-panel-border); + padding: 11px 7px; + } + .official-page { + padding: 20px 0 38px; + } + .official-hero-top { + grid-template-columns: 1fr; + gap: 19px; + padding: 17px 0 20px; + } + .official-hero-heading h1 { + margin-top: 16px; + font-size: clamp(2rem, 8.5vw, 2.8rem); + } + .official-hero-intro > p { + margin-bottom: 13px; + font-size: 0.92rem; + } + .official-hero-features { + margin-bottom: 16px; + } + .official-hero-visual { + min-height: 270px; + } + .official-hero-stat { + width: min(236px, 58%); + min-height: 187px; + padding: 14px; + top: 16px; + right: 14px; + } + .official-stat-value { + margin-top: 13px; + font-size: 1.55rem; + } + .official-floating-label { + max-width: 48%; + font-size: 0.76rem; + bottom: 17px; + left: 12px; + } + .official-art-caption { + text-align: right; + max-width: 49%; + font-size: 0.73rem; + bottom: 19px; + left: auto; + right: 14px; + } + .official-section { + margin-top: 38px; + } + .official-product-grid { + grid-template-columns: 1fr; + } + .official-product-card { + min-height: 0; + } + .official-product-description { + min-height: auto; + } + .official-infra-panel { + padding: 16px; + } + .official-infra-visual { + min-height: 265px; + } + .official-infra-card { + width: min(310px, 82%); + padding: 13px; + top: 14px; + right: 12px; + } + .official-infra-stats { + gap: 18px; + } + .official-review-grid { + grid-template-columns: 1fr; + } + .official-contact-panel { + flex-direction: column; + align-items: flex-start; + gap: 18px; + padding: 18px; + } + .official-contact-actions { + justify-content: flex-start; + } + .official-footer-main { + grid-template-columns: 1fr 1fr; + gap: 23px 15px; + padding: 26px 0 21px; + } + .official-footer-brand { + grid-column: 1/-1; + } + .official-footer-brand > p { + max-width: 460px; + } + .official-footer-groups { + grid-column: 1/-1; + gap: 26px; + } + .official-footer-contact { + grid-column: 1/-1; + } + .official-footer-bottom { + flex-direction: column; + justify-content: center; + align-items: flex-start; + padding: 12px 0; + } +} +@media (prefers-reduced-motion: reduce) { + .official-site *, + .official-site :after, + .official-site :before { + scroll-behavior: auto !important; + transition-duration: 0.01ms !important; + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + } +} diff --git a/app/assets/styles/orders.BflDlvVz.css b/app/assets/styles/orders.BflDlvVz.css new file mode 100644 index 0000000..6a1367f --- /dev/null +++ b/app/assets/styles/orders.BflDlvVz.css @@ -0,0 +1,63 @@ +.bill-description[data-v-d87be2e3] { + color: var(--p-text-muted-color); + margin: 0; + font-size: 0.9375rem; +} +.order-link[data-v-d87be2e3] { + color: var(--p-primary-color, #3b82f6); + font-weight: 500; + text-decoration: none; +} +.order-link[data-v-d87be2e3]:hover { + text-decoration: underline; +} +.amount[data-v-d87be2e3] { + white-space: nowrap; + font-weight: 500; +} +.order-description[data-v-d87be2e3] { + -webkit-line-clamp: 3; + line-clamp: 3; + overflow-wrap: anywhere; + -webkit-box-orient: vertical; + min-width: 220px; + line-height: 1.65; + display: -webkit-box; + overflow: hidden; +} +.list-toolbar[data-v-d87be2e3] { + flex-direction: column; + align-items: flex-start; + gap: 14px; +} +.list-head[data-v-d87be2e3] { + min-height: 28px; +} +.list-head-actions .p-button[data-v-d87be2e3] { + padding-block: 5px; +} +.order-link[data-v-d87be2e3] { + color: var(--p-text-color); + font-weight: 400; +} +.order-description[data-v-d87be2e3] { + -webkit-line-clamp: 1; + line-clamp: 1; +} +.list-table[data-v-d87be2e3] .p-datatable-tbody > tr > td { + padding: 18px 14px; +} +.list-table[data-v-d87be2e3] .p-datatable-thead > tr > th { + padding: 12px 14px; +} +.list-foot[data-v-d87be2e3] { + justify-content: center; +} +@media (width<=640px) { + .list-toolbar-right > .p-iconfield[data-v-d87be2e3] { + flex-basis: 100%; + } + .list-toolbar-right > .p-iconfield .p-inputtext[data-v-d87be2e3] { + width: 100%; + } +} diff --git a/app/assets/styles/pages.DytekQXu.css b/app/assets/styles/pages.DytekQXu.css new file mode 100644 index 0000000..97d51b3 --- /dev/null +++ b/app/assets/styles/pages.DytekQXu.css @@ -0,0 +1,261 @@ +.welcome-card[data-v-b43b228e] { + --welcome-line: #dce7f4; + --welcome-tile-bg: #fff; + background: #f7faff; + border-color: #cbdcf0; + border-radius: 6px; + position: relative; +} +.welcome-head[data-v-b43b228e] { + align-items: center; + gap: 18px; + min-height: 166px; + padding: 24px 26px; + position: relative; +} +.welcome-greeting[data-v-b43b228e] { + flex: 1; + min-width: 0; + padding-right: 36px; +} +.welcome-heading[data-v-b43b228e] { + align-items: flex-start; + gap: 10px; + min-height: 38px; + display: flex; +} +.welcome-icon[data-v-b43b228e] { + width: 34px; + height: 34px; + color: var(--p-primary-color); + flex: 0 0 34px; + justify-content: center; + align-items: center; + display: inline-flex; +} +.welcome-icon .iconify[data-v-b43b228e] { + width: 30px; + height: 30px; +} +.welcome-title[data-v-b43b228e] { + overflow-wrap: anywhere; + letter-spacing: -0.35px; + flex: 1; + min-width: 0; + font-size: 1.5625rem; + font-weight: 600; + line-height: 1.5; + display: block; +} +.welcome-message[data-v-b43b228e] { + min-height: 24px; + color: var(--p-text-muted-color); + margin: 8px 0 0; + font-size: 1.0625rem; + line-height: 1.714rem; +} +.welcome-meta[data-v-b43b228e] { + min-height: 22px; + color: var(--p-text-muted-color); + gap: 8px 24px; + margin: 13px 0 0; + font-size: 1rem; + line-height: 1.571rem; +} +.welcome-login[data-v-b43b228e], +.welcome-meta[data-v-b43b228e] { + flex-wrap: wrap; + align-items: center; + display: flex; +} +.welcome-login[data-v-b43b228e] { + gap: 7px; + min-width: 0; +} +.welcome-login dt[data-v-b43b228e] { + align-items: center; + gap: 6px; + display: inline-flex; +} +.welcome-login dt .iconify[data-v-b43b228e] { + flex-shrink: 0; + width: 17px; + height: 17px; +} +.welcome-login dd[data-v-b43b228e] { + min-width: 0; + color: var(--p-text-color); + font-variant-numeric: tabular-nums; + overflow-wrap: anywhere; + margin: 0; +} +.welcome-settings[data-v-b43b228e] { + z-index: 2; + border: 1px solid var(--welcome-line); + background: var(--welcome-tile-bg); + min-width: 38px; + min-height: 38px; + color: var(--p-text-muted-color); + border-radius: 5px; + transition: + border-color 0.2s, + color 0.2s; + position: absolute; + top: 16px; + right: 16px; +} +.welcome-settings i[data-v-b43b228e] { + font-size: 1.25rem; +} +.welcome-settings[data-v-b43b228e]:hover { + border-color: var(--p-primary-color); +} +.welcome-body[data-v-b43b228e] { + flex-direction: column; + flex: 1; + padding: 0; + display: flex; +} +.welcome-body[data-v-b43b228e] > .p-message { + margin: 0 26px 22px; +} +.copy-id[data-v-b43b228e] { + border: 1px solid var(--welcome-line); + background: var(--welcome-tile-bg); + min-height: 36px; + color: var(--p-text-muted-color); + font: inherit; + letter-spacing: inherit; + vertical-align: baseline; + cursor: pointer; + border-radius: 4px; + align-items: center; + gap: 8px; + margin-left: 6px; + padding: 0 10px; + display: inline-flex; +} +.copy-id-placeholder[data-v-b43b228e] { + vertical-align: middle; + width: 126px; + height: 1.5em; + margin-left: 6px; + display: inline-block; +} +.copy-id[data-v-b43b228e]:hover { + color: var(--p-primary-color); +} +.copy-id i[data-v-b43b228e] { + font-size: 1rem; +} +.tiles[data-v-b43b228e] { + border-top: 1px solid var(--welcome-line); + background: var(--welcome-tile-bg); + border-radius: 0 0 5px 5px; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 0; + margin: auto 0 0; + display: grid; + overflow: hidden; +} +.tile[data-v-b43b228e] { + min-width: 0; + min-height: 96px; + padding: 21px 22px 23px; +} +.tile + .tile[data-v-b43b228e] { + border-left: 1px solid var(--welcome-line); +} +.tile-label[data-v-b43b228e] { + color: var(--p-text-muted-color); + font-size: 0.9375rem; + line-height: 1.429rem; +} +.tile-value[data-v-b43b228e] { + margin: 7px 0 0; + font-size: 1.0625rem; + line-height: 1.714rem; +} +.tile-text[data-v-b43b228e] { + overflow-wrap: anywhere; +} +.tile-action[data-v-b43b228e] { + color: var(--p-primary-color); + text-decoration: none; +} +.tile-action i[data-v-b43b228e] { + font-size: 0.9375rem; +} +.app-dark .welcome-card[data-v-b43b228e] { + --welcome-line: #263b56; + --welcome-tile-bg: #101e31; + background: #12233b; + border-color: #304766; +} +@media (width<=1023px) { + .tiles[data-v-b43b228e] { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + .tile[data-v-b43b228e]:nth-child(odd) { + border-left: 0; + } + .tile[data-v-b43b228e]:nth-child(n + 3) { + border-top: 1px solid var(--welcome-line); + } +} +@media (width<=767px) { + .welcome-head[data-v-b43b228e] { + align-items: flex-start; + gap: 12px; + min-height: 224px; + padding: 22px 18px; + } + .welcome-greeting[data-v-b43b228e] { + padding: 0; + } + .welcome-heading[data-v-b43b228e] { + gap: 8px; + padding-right: 38px; + } + .welcome-settings[data-v-b43b228e] { + top: 18px; + right: 14px; + } + .welcome-meta[data-v-b43b228e] { + flex-direction: column; + align-items: flex-start; + gap: 5px; + } +} +@media (width<=639px) { + .welcome-title[data-v-b43b228e] { + font-size: 1.5rem; + } + .welcome-message[data-v-b43b228e] { + font-size: 1rem; + } + .welcome-meta[data-v-b43b228e] { + font-size: 0.9375rem; + } + .welcome-icon[data-v-b43b228e] { + flex-basis: 28px; + } + .welcome-icon[data-v-b43b228e], + .welcome-icon .iconify[data-v-b43b228e] { + width: 28px; + height: 28px; + } + .welcome-settings[data-v-b43b228e] { + min-width: 34px; + min-height: 34px; + } + .welcome-body[data-v-b43b228e] > .p-message { + margin: 0 18px 20px; + } + .tile[data-v-b43b228e] { + padding: 18px 16px; + } + .tile-value[data-v-b43b228e] { + font-size: 1rem; + } +} diff --git a/app/assets/styles/products.CrccEo2m.css b/app/assets/styles/products.CrccEo2m.css new file mode 100644 index 0000000..414461a --- /dev/null +++ b/app/assets/styles/products.CrccEo2m.css @@ -0,0 +1,435 @@ +.catalog-page[data-v-a6c63d86] { + flex-direction: column; + gap: 24px; + min-width: 0; + max-width: 1440px; + margin: 0 auto; + padding: 18px 10px 28px; + display: flex; +} +.catalog-header[data-v-a6c63d86] { + justify-content: space-between; + align-items: center; + gap: 20px; + display: flex; +} +.catalog-header h1[data-v-a6c63d86] { + color: var(--p-text-color); + margin: 0; + font-size: 1.625rem; + font-weight: 600; + line-height: 2.286rem; +} +.catalog-header p[data-v-a6c63d86] { + color: var(--p-text-muted-color); + margin: 8px 0 0; + font-size: 1rem; + line-height: 1.571rem; +} +.cart-link[data-v-a6c63d86] { + border: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + color: var(--p-text-color); + white-space: nowrap; + border-radius: 6px; + align-items: center; + gap: 9px; + padding: 10px 16px; + font-size: 1rem; + text-decoration: none; + display: inline-flex; +} +.cart-link[data-v-a6c63d86]:hover { + border-color: var(--p-primary-color); + color: var(--p-primary-color); +} +.catalog-categories[data-v-a6c63d86] { + border: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + border-radius: 8px; + padding: 20px 24px; +} +.catalog-categories h2[data-v-a6c63d86] { + color: var(--p-text-color); + margin: 0 0 16px; + font-size: 1rem; + font-weight: 600; +} +.category-options[data-v-a6c63d86] { + flex-wrap: wrap; + gap: 10px; + display: flex; +} +.category-options button[data-v-a6c63d86] { + border: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + color: var(--p-text-color); + font: inherit; + cursor: pointer; + overflow-wrap: anywhere; + border-radius: 6px; + max-width: 100%; + padding: 10px 18px; + font-size: 1rem; + line-height: 1.429rem; +} +.category-options button[data-v-a6c63d86]:hover { + border-color: var(--p-primary-color); + color: var(--p-primary-color); +} +.category-options button.active[data-v-a6c63d86] { + border-color: var(--p-primary-color); + background: var(--p-highlight-background); + color: var(--p-highlight-color); + font-weight: 600; +} +.secondary-categories[data-v-a6c63d86] { + border-top: 1px solid var(--p-content-border-color); + margin-top: 16px; + padding-top: 16px; +} +.secondary-categories button[data-v-a6c63d86] { + padding: 7px 14px; + font-size: 0.9375rem; +} +.category-empty[data-v-a6c63d86] { + margin: 16px 0 0; +} +.category-empty[data-v-a6c63d86], +.category-error[data-v-a6c63d86] { + color: var(--p-text-muted-color); + font-size: 0.9375rem; +} +.category-error[data-v-a6c63d86] { + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + gap: 16px; + display: flex; +} +.catalog-panel[data-v-a6c63d86] { + border: 1px solid var(--p-content-border-color); + background: var(--p-content-background); + border-radius: 8px; + min-width: 0; + overflow: hidden; +} +.catalog-toolbar[data-v-a6c63d86] { + justify-content: space-between; + align-items: center; + gap: 20px; + padding: 20px 24px; + display: flex; +} +.catalog-search[data-v-a6c63d86] { + gap: 10px; + width: min(100%, 480px); + display: flex; +} +.search-input[data-v-a6c63d86] { + flex: 1; + min-width: 0; + position: relative; +} +.search-input > i[data-v-a6c63d86] { + color: var(--p-text-muted-color); + pointer-events: none; + font-size: 1rem; + position: absolute; + top: 50%; + left: 13px; + transform: translateY(-50%); +} +.search-input[data-v-a6c63d86] input { + width: 100%; + min-width: 0; + padding-left: 36px; + font-size: 1rem; +} +.catalog-count[data-v-a6c63d86] { + flex-shrink: 0; + gap: 12px; +} +.catalog-count[data-v-a6c63d86], +.search-result[data-v-a6c63d86] { + color: var(--p-text-muted-color); + align-items: center; + font-size: 0.9375rem; + display: flex; +} +.search-result[data-v-a6c63d86] { + overflow-wrap: anywhere; + flex-wrap: wrap; + gap: 16px; + padding: 0 24px 18px; +} +.search-result button[data-v-a6c63d86] { + font: inherit; + color: var(--p-primary-color); + cursor: pointer; + background: 0 0; + border: 0; + align-items: center; + gap: 6px; + padding: 0; + display: inline-flex; +} +.search-result i[data-v-a6c63d86] { + font-size: 0.8125rem; +} +.product-columns[data-v-a6c63d86], +.product-row[data-v-a6c63d86] { + grid-template-columns: minmax(180px, 1fr) minmax(200px, 1.4fr) 190px; + align-items: center; + gap: 28px; + padding-inline: 24px; + display: grid; +} +.product-columns[data-v-a6c63d86] { + border-top: 1px solid var(--p-content-border-color); + border-bottom: 1px solid var(--p-content-border-color); + background: var(--p-content-hover-background); + min-height: 42px; + color: var(--p-text-muted-color); + font-size: 0.875rem; +} +.product-columns[data-v-a6c63d86] > :last-child { + text-align: right; +} +.product-row[data-v-a6c63d86] { + border-bottom: 1px solid var(--p-content-border-color); + min-width: 0; + min-height: 143px; + padding-block: 26px; +} +.product-row[data-v-a6c63d86]:last-child { + border-bottom: 0; +} +.product-heading[data-v-a6c63d86] { + align-items: flex-start; + gap: 14px; + min-width: 0; + display: flex; +} +.product-heading > div[data-v-a6c63d86] { + min-width: 0; +} +.product-icon[data-v-a6c63d86] { + background: var(--p-highlight-background); + width: 42px; + height: 42px; + color: var(--p-primary-color); + border-radius: 7px; + flex-shrink: 0; + place-items: center; + font-size: 1.375rem; + display: grid; +} +.product-heading h2[data-v-a6c63d86] { + overflow-wrap: anywhere; + margin: 0 0 9px; + font-size: 1.125rem; + font-weight: 600; + line-height: 1.714rem; +} +.product-status[data-v-a6c63d86] { + color: var(--p-text-muted-color); + align-items: center; + gap: 6px; + display: inline-flex; +} +.product-status[data-v-a6c63d86], +.product-status > i[data-v-a6c63d86] { + font-size: 0.875rem; +} +.in-stock > i[data-v-a6c63d86] { + color: var(--p-primary-color); +} +.product-purchase[data-v-a6c63d86] { + flex-direction: column; + align-items: flex-end; + gap: 14px; + min-width: 0; + display: flex; +} +.product-price[data-v-a6c63d86] { + text-align: right; + color: var(--p-text-muted-color); + overflow-wrap: anywhere; + font-size: 0.875rem; +} +.product-price strong[data-v-a6c63d86] { + color: var(--p-text-color); + font-variant-numeric: tabular-nums; + font-size: 1.5rem; + font-weight: 600; + line-height: 2rem; +} +.configure-link[data-v-a6c63d86] { + min-height: 36px; + color: var(--p-primary-contrast-color); + background: var(--p-primary-color); + border-radius: 5px; + justify-content: center; + align-items: center; + gap: 20px; + padding: 8px 16px; + font-size: 0.9375rem; + text-decoration: none; + display: inline-flex; +} +.configure-link[data-v-a6c63d86]:hover { + background: var(--p-primary-hover-color); +} +.configure-link i[data-v-a6c63d86] { + font-size: 0.875rem; +} +.unavailable .product-icon[data-v-a6c63d86] { + color: var(--p-text-muted-color); + background: var(--p-content-hover-background); +} +.product-skeleton[data-v-a6c63d86] { + min-height: 143px; +} +.catalog-footer[data-v-a6c63d86] { + border-top: 1px solid var(--p-content-border-color); + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + gap: 16px; + padding: 16px 24px; + display: flex; +} +.catalog-footer p[data-v-a6c63d86] { + color: var(--p-text-muted-color); + margin: 0; + font-size: 0.875rem; + line-height: 1.429rem; +} +.catalog-footer[data-v-a6c63d86] .p-paginator { + gap: 4px; + padding: 0; +} +.catalog-help[data-v-a6c63d86] { + color: var(--p-text-muted-color); + justify-content: center; + align-items: center; + gap: 8px; + margin: 0; + font-size: 0.875rem; + line-height: 1.429rem; + display: flex; +} +.catalog-help a[data-v-a6c63d86] { + color: var(--p-primary-color); + align-items: center; + gap: 5px; + text-decoration: none; + display: inline-flex; +} +a[data-v-a6c63d86]:focus-visible, +button[data-v-a6c63d86]:focus-visible { + outline: 2px solid var(--p-primary-color); + outline-offset: 3px; +} +@media (width<=1100px) { + .product-columns[data-v-a6c63d86], + .product-row[data-v-a6c63d86] { + grid-template-columns: minmax(150px, 1fr) minmax(160px, 1.1fr) 160px; + gap: 20px; + } + .product-icon[data-v-a6c63d86] { + display: none; + } +} +@media (width<=760px) { + .catalog-categories[data-v-a6c63d86] { + padding: 16px; + } + .category-options[data-v-a6c63d86] { + gap: 8px; + } + .category-options button[data-v-a6c63d86] { + padding: 8px 12px; + } + .secondary-categories button[data-v-a6c63d86] { + padding: 6px 10px; + } + .catalog-page[data-v-a6c63d86] { + gap: 20px; + padding: 8px 0 20px; + } + .catalog-header[data-v-a6c63d86] { + align-items: flex-start; + gap: 12px; + } + .catalog-header h1[data-v-a6c63d86] { + font-size: 1.5rem; + line-height: 2rem; + } + .catalog-header p[data-v-a6c63d86] { + max-width: 250px; + font-size: 0.9375rem; + } + .cart-link[data-v-a6c63d86] { + padding: 8px 12px; + font-size: 0.9375rem; + } + .catalog-toolbar[data-v-a6c63d86] { + flex-wrap: wrap; + gap: 8px; + padding: 16px; + } + .catalog-search[data-v-a6c63d86] { + width: 100%; + } + .catalog-count[data-v-a6c63d86] { + justify-content: space-between; + width: 100%; + } + .search-result[data-v-a6c63d86] { + padding: 0 16px 16px; + } + .product-columns[data-v-a6c63d86] { + display: none; + } + .product-list[data-v-a6c63d86] { + border-top: 1px solid var(--p-content-border-color); + } + .product-row[data-v-a6c63d86] { + grid-template-columns: minmax(0, 1fr); + gap: 16px; + padding: 22px 16px; + } + .product-heading h2[data-v-a6c63d86] { + margin-bottom: 5px; + font-size: 1.125rem; + } + .product-icon[data-v-a6c63d86] { + display: grid; + } + .product-purchase[data-v-a6c63d86] { + flex-flow: wrap; + justify-content: space-between; + align-items: center; + gap: 12px; + } + .product-price[data-v-a6c63d86] { + text-align: left; + } + .product-price strong[data-v-a6c63d86] { + font-size: 1.5rem; + } + .catalog-footer[data-v-a6c63d86] { + gap: 14px; + padding: 16px; + } + .catalog-footer[data-v-a6c63d86] .p-paginator { + flex-wrap: wrap; + justify-content: center; + width: 100%; + } + .catalog-help[data-v-a6c63d86] { + flex-wrap: wrap; + } +} diff --git a/app/assets/styles/public-order.0RThfr7m.css b/app/assets/styles/public-order.0RThfr7m.css new file mode 100644 index 0000000..31d8d55 --- /dev/null +++ b/app/assets/styles/public-order.0RThfr7m.css @@ -0,0 +1,107 @@ +.public-order-layout[data-v-f882e304] { + background: var(--console-page-bg); + min-height: 100dvh; + color: var(--p-text-color); + flex-direction: column; + display: flex; +} +.public-order-header[data-v-f882e304] { + border-bottom: 1px solid var(--console-panel-border); + background: var(--console-panel-bg); + justify-content: space-between; + align-items: center; + gap: 24px; + min-height: 72px; + padding: 16px max(24px, 50vw - 690px); + display: flex; +} +.public-order-brand[data-v-f882e304] { + flex-shrink: 0; + display: flex; +} +.public-order-brand img[data-v-f882e304] { + width: 142px; + height: auto; +} +.public-order-header nav[data-v-f882e304] { + flex-wrap: wrap; + gap: 24px; + display: flex; +} +.public-order-header a[data-v-f882e304] { + color: inherit; + font-size: 0.9375rem; + text-decoration: none; +} +.public-order-header a[data-v-f882e304]:hover, +.public-order-header nav .router-link-exact-active[data-v-f882e304] { + color: var(--p-primary-color); +} +.public-order-account[data-v-f882e304] { + align-items: center; + gap: 16px; + display: flex; +} +.public-order-account button[data-v-f882e304] { + width: 36px; + height: 36px; + color: inherit; + cursor: pointer; + background: 0 0; + border: 0; +} +.public-order-login[data-v-f882e304] { + border: 1px solid var(--console-panel-border); + border-radius: 6px; + padding: 9px 18px; +} +.public-order-content[data-v-f882e304] { + flex: 1; + width: 100%; + max-width: 1380px; + margin: 0 auto; + padding: 36px 24px; +} +.public-order-maintenance[data-v-f882e304] { + color: #92400e; + text-align: center; + background: #fef3c7; + padding: 12px 24px; +} +.skip-link[data-v-f882e304] { + z-index: 200; + background: var(--console-panel-bg); + padding: 12px 16px; + position: fixed; + top: -60px; + left: 16px; +} +.skip-link[data-v-f882e304]:focus { + top: 8px; +} +.public-order-layout[data-v-f882e304]:has(.config-mobile-total) { + padding-bottom: calc(84px + env(safe-area-inset-bottom, 0px)); +} +@media (width>=1024px) { + .public-order-layout[data-v-f882e304]:has(.config-mobile-total) { + padding-bottom: 0; + } +} +@media (width<=640px) { + .public-order-header[data-v-f882e304] { + flex-wrap: wrap; + gap: 12px; + padding: 14px 16px; + } + .public-order-header nav[data-v-f882e304] { + order: 3; + gap: 20px; + width: 100%; + } + .public-order-content[data-v-f882e304] { + padding: 24px 16px; + } + .public-order-brand img[data-v-f882e304] { + width: 130px; + } +} diff --git a/app/assets/styles/realname.BpRCvfXO.css b/app/assets/styles/realname.BpRCvfXO.css new file mode 100644 index 0000000..64fc1ef --- /dev/null +++ b/app/assets/styles/realname.BpRCvfXO.css @@ -0,0 +1,273 @@ +.auth-template-link[data-v-ed164766] { + color: var(--p-primary-color); + align-self: flex-start; + align-items: center; + gap: 8px; + font-size: 0.9375rem; + line-height: 1.7; + text-decoration: none; + display: inline-flex; +} +.auth-template-link[data-v-ed164766]:hover { + text-underline-offset: 3px; + text-decoration: underline; +} +.auth-template-link > i[data-v-ed164766] { + font-size: 0.875rem; +} +.page[data-v-ed164766] { + flex-direction: column; + gap: 16px; + display: flex; +} +.back[data-v-ed164766] { + color: var(--p-text-muted-color, #94a3b8); + align-items: center; + gap: 6px; + font-size: 0.9375rem; + text-decoration: none; + display: inline-flex; +} +.back[data-v-ed164766]:hover { + color: var(--p-primary-color, #3b82f6); +} +.page-head h2[data-v-ed164766] { + margin: 10px 0 0; + font-size: 1.375rem; +} +.panel[data-v-ed164766] { + background: var(--p-content-background); + border: 1px solid var(--p-content-border-color, #e2e8f0); + border-radius: 12px; + padding: 20px 22px; +} +.steps-panel[data-v-ed164766] { + padding: 18px 22px; +} +.certified[data-v-ed164766] { + align-items: center; + gap: 14px; + display: flex; +} +.certified i[data-v-ed164766] { + color: var(--p-primary-color, #3b82f6); + flex-shrink: 0; + font-size: 2.125rem; +} +.certified-title[data-v-ed164766] { + font-weight: 600; +} +.certified-sub[data-v-ed164766] { + color: var(--p-text-muted-color, #64748b); + flex-wrap: wrap; + gap: 16px; + margin-top: 6px; + font-size: 0.9375rem; + display: flex; +} +.certify-id[data-v-ed164766] { + overflow-wrap: anywhere; + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; +} +.certified > div[data-v-ed164766] { + min-width: 0; +} +.hint[data-v-ed164766] { + color: var(--p-text-muted-color, #94a3b8); + margin: 14px 0 0; + font-size: 0.9375rem; +} +.form[data-v-ed164766] { + gap: 14px; + max-width: 560px; + padding-top: 4px; +} +.field[data-v-ed164766], +.form[data-v-ed164766] { + flex-direction: column; + display: flex; +} +.field[data-v-ed164766] { + flex: 1; + gap: 6px; +} +.field label[data-v-ed164766] { + color: var(--p-text-color, #334155); + font-size: 0.9375rem; +} +.field-row[data-v-ed164766] { + gap: 14px; + display: flex; +} +.req[data-v-ed164766] { + color: #ef4444; +} +.tip[data-v-ed164766] { + margin-bottom: 14px; +} +.company-status[data-v-ed164766] { + gap: 8px; + display: grid; +} +.status-row[data-v-ed164766] { + align-items: center; + gap: 10px; + display: flex; +} +.error-copy[data-v-ed164766] { + color: var(--p-red-500, #dc2626); + margin: 0; + font-size: 12px; +} +.load-error[data-v-ed164766] { + gap: 12px; + display: grid; +} +.field-tip[data-v-ed164766] { + color: var(--p-text-muted-color); + font-size: 12px; +} +.channel-fields[data-v-ed164766] { + gap: 12px; + display: grid; +} +.channel-picker[data-v-ed164766] { + flex-direction: column; + gap: 14px; + display: flex; +} +.channel-hint[data-v-ed164766] { + color: var(--p-text-muted-color); + margin: 0; + font-size: 1rem; +} +.channel-list[data-v-ed164766] { + border: 0; + gap: 10px; + min-width: 0; + margin: 0; + padding: 0; + display: grid; +} +.channel-option[data-v-ed164766] { + border: 1px solid var(--p-content-border-color); + cursor: pointer; + border-radius: 8px; + align-items: center; + gap: 12px; + min-height: 70px; + padding: 14px; + display: flex; + position: relative; +} +.channel-option.is-selected[data-v-ed164766], +.channel-option[data-v-ed164766]:hover:not(.is-unavailable) { + border-color: var(--p-primary-color); + background: var(--p-highlight-background); +} +.channel-option[data-v-ed164766]:focus-within { + outline: 2px solid var(--p-primary-color); + outline-offset: 2px; +} +.channel-option input[data-v-ed164766] { + opacity: 0; + width: 1px; + height: 1px; + position: absolute; +} +.channel-icon[data-v-ed164766] { + -o-object-fit: contain; + object-fit: contain; + flex-shrink: 0; + width: 32px; + height: 32px; +} +.channel-fallback[data-v-ed164766] { + text-align: center; + width: 32px; + color: var(--p-primary-color); + font-size: 24px; +} +.channel-title[data-v-ed164766] { + overflow-wrap: anywhere; + flex: 1; + min-width: 0; + font-size: 1rem; +} +.channel-status[data-v-ed164766] { + color: var(--p-text-muted-color); + white-space: nowrap; + font-size: 0.923rem; +} +.channel-check[data-v-ed164766] { + color: var(--p-primary-color); + font-size: 16px; +} +.channel-option.is-unavailable[data-v-ed164766] { + cursor: not-allowed; + color: var(--p-text-muted-color); + background: var(--p-content-hover-background); +} +.channel-option.is-unavailable .channel-icon[data-v-ed164766] { + filter: grayscale(); + opacity: 0.45; +} +.auth-box[data-v-ed164766] { + justify-content: center; + align-items: center; + display: flex; +} +.auth-frame[data-v-ed164766] { + aspect-ratio: 1; + border: none; + width: 100%; + display: block; +} +.page[data-v-ed164766] { + gap: 21px; + width: 100%; + margin: 0 auto; +} +.page-head h2[data-v-ed164766] { + font-size: 1.5rem; + font-weight: 400; +} +.panel[data-v-ed164766] { + border-radius: 6px; + padding: 21px; +} +.form[data-v-ed164766] { + gap: 21px; + max-width: none; +} +.field-row[data-v-ed164766] { + flex-direction: column; +} +.cert-heading[data-v-ed164766] { + justify-content: space-between; + align-items: center; + display: flex; +} +.cert-heading h3[data-v-ed164766] { + margin: 14px 0; + font-size: 1.5rem; + font-weight: 400; +} +.certified-title[data-v-ed164766] { + font-size: 1.125rem; + font-weight: 500; +} +.certified i[data-v-ed164766] { + font-size: 1.625rem; +} +.page[data-v-ed164766] .p-tabpanels { + padding: 21px 0 0; +} +@media (width<=640px) { + .panel[data-v-ed164766] { + padding: 14px; + } + .field-row[data-v-ed164766] { + gap: 21px; + } +} diff --git a/app/assets/styles/recommend.C1KCHBPJ.css b/app/assets/styles/recommend.C1KCHBPJ.css new file mode 100644 index 0000000..2b675ba --- /dev/null +++ b/app/assets/styles/recommend.C1KCHBPJ.css @@ -0,0 +1,304 @@ +.recommend-page[data-v-78278278] { + --recommend-gap: 14px; + --recommend-section-gap: 21px; + --recommend-summary-gap: 28px; + gap: var(--recommend-gap); +} +.panel[data-v-78278278], +.reward-summary[data-v-78278278] { + min-width: 0; + padding: var(--recommend-gap); + background: var(--p-content-background); + border: 1px solid var(--p-content-border-color); + border-radius: 7px; + box-shadow: 0 1px 2px #00000014; +} +.error-panel[data-v-78278278], +.join-intro[data-v-78278278], +.link-block[data-v-78278278] { + gap: var(--recommend-gap); + flex-direction: column; + display: flex; +} +.error-panel[data-v-78278278], +.join-intro[data-v-78278278] { + align-items: flex-start; +} +.join-card[data-v-78278278], +.recommend-section[data-v-78278278] { + gap: var(--recommend-section-gap); + flex-direction: column; + display: flex; +} +.join-intro h3[data-v-78278278] { + margin: 0; + font-size: 1.25rem; + font-weight: 600; +} +.join-desc[data-v-78278278] { + max-width: 65em; + color: var(--p-text-muted-color); + margin: 0; + line-height: 1.8; +} +.join-desc b[data-v-78278278] { + color: var(--p-text-color); + font-weight: 500; +} +.join-steps[data-v-78278278] { + gap: var(--recommend-section-gap); + padding: var(--recommend-section-gap) 0 0; + border-top: 1px solid var(--p-content-border-color); + grid-template-columns: repeat(3, minmax(0, 1fr)); + margin: 0; + list-style: none; + display: grid; +} +.join-steps li[data-v-78278278] { + align-items: baseline; + gap: 10px; + display: flex; +} +.step-number[data-v-78278278] { + color: var(--p-text-muted-color); + font-variant-numeric: tabular-nums; +} +.join-steps h4[data-v-78278278] { + margin: 0 0 7px; + font-size: 1rem; + font-weight: 500; +} +.join-steps p[data-v-78278278] { + color: var(--p-text-muted-color); + margin: 0; + font-size: 0.9375rem; + line-height: 1.7; +} +.reward-summary[data-v-78278278] { + min-height: 105px; +} +.reward-balance[data-v-78278278], +.reward-summary[data-v-78278278] { + align-items: center; + gap: var(--recommend-summary-gap); + display: flex; +} +.reward-balance[data-v-78278278] { + flex: 1.35; + justify-content: space-between; + min-width: 0; +} +.link-row > .p-button[data-v-78278278], +.reward-balance > .p-button[data-v-78278278] { + flex-shrink: 0; +} +.reward-metrics[data-v-78278278] { + gap: var(--recommend-summary-gap); + min-width: 0; + padding-left: var(--recommend-summary-gap); + border-left: 1px solid var(--p-content-border-color); + flex: 3; + grid-auto-columns: minmax(0, 1fr); + grid-auto-flow: column; + display: grid; +} +.reward-metric[data-v-78278278] { + flex-direction: column; + gap: 10px; + min-width: 0; + display: flex; +} +.stat-label[data-v-78278278] { + color: var(--p-text-muted-color); + font-size: 1rem; +} +.stat-num[data-v-78278278] { + font-variant-numeric: tabular-nums; + overflow-wrap: anywhere; + font-size: 1.75rem; + font-weight: 400; + line-height: 1.2; +} +.stat-num small[data-v-78278278] { + margin-right: 2px; + font-size: 1.5rem; +} +.recommend-section[data-v-78278278], +.recommend-tabs[data-v-78278278] { + min-width: 0; +} +.recommend-tabs[data-v-78278278] .p-tabpanels { + padding: var(--recommend-gap) 0 0; + background: 0 0; +} +.recommend-tabs[data-v-78278278] .p-tablist-tab-list { + background: 0 0; + border: 0; +} +.recommend-tabs[data-v-78278278] .p-tab { + padding: var(--recommend-gap); +} +.recommend-tabs[data-v-78278278] .p-tablist-active-bar { + display: none; +} +.link-heading[data-v-78278278] { + font-size: 1rem; + font-weight: 500; +} +.link-row[data-v-78278278] { + align-items: center; + gap: 7px; + max-width: 840px; + display: flex; +} +.link-text[data-v-78278278] { + flex: 1; + width: 100%; + min-width: 0; +} +.link-tip[data-v-78278278] { + color: var(--p-text-muted-color); + overflow-wrap: anywhere; + max-width: 65em; + margin: 0; + font-size: 0.9375rem; + line-height: 1.7; +} +.custom-link-block[data-v-78278278] { + gap: var(--recommend-gap); + flex-direction: column; + display: flex; +} +.custom-link-form[data-v-78278278] { + grid-template-columns: minmax(180px, 1fr) minmax(180px, 1fr) auto; + gap: 8px; + max-width: 840px; + display: grid; +} +.custom-link-list[data-v-78278278] { + flex-direction: column; + gap: 8px; + display: flex; +} +.custom-link-row[data-v-78278278] { + border-top: 1px solid var(--p-content-border-color); + align-items: center; + gap: 12px; + padding: 10px 0; + display: flex; +} +.custom-link-value[data-v-78278278] { + flex: 1; + align-items: center; + gap: 10px; + min-width: 0; + display: flex; +} +.custom-link-value strong[data-v-78278278] { + overflow-wrap: anywhere; + flex: 0 0 150px; + font-size: 0.875rem; +} +.custom-link-value .p-inputtext[data-v-78278278] { + flex: 1; + min-width: 0; +} +.custom-link-actions[data-v-78278278] { + flex-shrink: 0; + gap: 2px; + display: flex; +} +.link-loading[data-v-78278278] { + color: var(--p-text-muted-color); + padding: var(--recommend-gap) 0; + font-size: 1rem; +} +.recommend-data-section[data-v-78278278] { + flex-direction: column; + gap: 12px; + min-width: 0; + display: flex; +} +.section-header[data-v-78278278] { + flex-direction: column; + gap: 6px; + display: flex; +} +.section-heading[data-v-78278278] { + flex-wrap: wrap; + align-items: baseline; + gap: 10px; + display: flex; +} +.link-title[data-v-78278278] { + margin: 0; + font-size: 1rem; + font-weight: 600; +} +.section-heading > span[data-v-78278278] { + color: var(--p-text-muted-color); + font-size: 0.9375rem; +} +.list-toolbar[data-v-78278278] { + justify-content: flex-start; +} +.list-foot[data-v-78278278] { + justify-content: center; +} +@media (width<=1100px) { + .reward-summary[data-v-78278278] { + align-items: stretch; + gap: var(--recommend-section-gap); + flex-direction: column; + } + .reward-balance[data-v-78278278] { + justify-content: flex-start; + } + .reward-metrics[data-v-78278278] { + padding: var(--recommend-section-gap) 0 0; + border-left: 0; + border-top: 1px solid var(--p-content-border-color); + } +} +@media (width<=640px) { + .join-steps[data-v-78278278] { + grid-template-columns: minmax(0, 1fr); + } + .reward-metrics[data-v-78278278] { + gap: var(--recommend-section-gap); + grid-template-columns: repeat(2, minmax(0, 1fr)); + grid-auto-flow: row; + } + .stat-num[data-v-78278278] { + font-size: 1.625rem; + } + .stat-num small[data-v-78278278] { + font-size: 1.25rem; + } + .link-row[data-v-78278278], + .list-toolbar-right[data-v-78278278] { + flex-direction: column; + align-items: stretch; + } + .link-row > .p-button[data-v-78278278] { + align-self: flex-start; + } + .custom-link-form[data-v-78278278] { + grid-template-columns: minmax(0, 1fr); + } + .custom-link-row[data-v-78278278], + .custom-link-value[data-v-78278278] { + flex-direction: column; + align-items: stretch; + } + .custom-link-value strong[data-v-78278278] { + flex-basis: auto; + } + .custom-link-actions[data-v-78278278] { + justify-content: flex-start; + } + .list-toolbar-right[data-v-78278278] > * { + flex-basis: auto; + width: 100%; + } +} diff --git a/app/assets/styles/remote-console.zcxaOxxS.css b/app/assets/styles/remote-console.zcxaOxxS.css new file mode 100644 index 0000000..1ecbf97 --- /dev/null +++ b/app/assets/styles/remote-console.zcxaOxxS.css @@ -0,0 +1,120 @@ +.standalone-console[data-v-5f7e2625] { + color: #23324d; + background: #f8fafc; + flex-direction: column; + width: 100%; + height: 100dvh; + min-height: 0; + display: flex; + overflow: hidden; +} +.console-page-header[data-v-5f7e2625] { + background: #fff; + border-bottom: 1px solid #e2e8f0; + flex-shrink: 0; + justify-content: space-between; + align-items: center; + gap: 16px; + min-height: 72px; + padding: 14px 24px; + display: flex; +} +.console-page-brand[data-v-5f7e2625] { + align-items: center; + display: inline-flex; +} +.console-page-brand img[data-v-5f7e2625] { + width: 156px; + height: auto; + display: block; +} +.console-page-host[data-v-5f7e2625] { + color: #64748b; + font-size: 0.875rem; +} +.console-page-content[data-v-5f7e2625] { + flex: 1; + justify-content: center; + align-items: center; + min-height: 0; + padding: 32px 24px; + display: flex; + overflow: auto; +} +.console-intro[data-v-5f7e2625] { + text-align: center; + width: min(380px, 100%); + margin: auto; +} +.intro-icon[data-v-5f7e2625] { + color: #0052d9; + margin-bottom: 8px; + font-size: 2rem; + display: inline-block; +} +.console-intro h1[data-v-5f7e2625] { + margin: 16px 0 12px; + font-size: 1.625rem; + font-weight: 650; + line-height: 1.4; +} +.console-intro p[data-v-5f7e2625] { + color: #64748b; + margin: 0 0 24px; + font-size: 1rem; + line-height: 1.8; +} +.console-return[data-v-5f7e2625] { + color: #0052d9; + justify-content: center; + align-items: center; + gap: 8px; + width: fit-content; + margin: 22px auto 0; + font-size: 0.9375rem; + text-decoration: none; + display: flex; +} +.console-return[data-v-5f7e2625]:hover { + text-decoration: underline; +} +.console-operation label[data-v-5f7e2625] { + text-align: left; + align-items: baseline; + gap: 8px; + margin-bottom: 9px; + font-size: 1rem; + display: flex; +} +.console-operation label span[data-v-5f7e2625] { + color: #64748b; + font-size: 0.875rem; +} +.console-operation .operation-help[data-v-5f7e2625] { + text-align: left; + margin: 9px 0 22px; + font-size: 0.875rem; +} +.console-page-footer[data-v-5f7e2625] { + color: #64748b; + text-align: center; + border-top: 1px solid #e2e8f0; + flex-shrink: 0; + padding: 14px 24px; + font-size: 0.875rem; +} +@media (width<=640px) { + .console-page-header[data-v-5f7e2625] { + min-height: 64px; + padding: 14px 16px; + } + .console-page-brand img[data-v-5f7e2625] { + width: 138px; + } + .console-page-content[data-v-5f7e2625] { + padding: 28px 20px; + } + .console-intro h1[data-v-5f7e2625] { + font-size: 1.5rem; + } +} diff --git a/app/assets/styles/resources._aUrMsvM.css b/app/assets/styles/resources._aUrMsvM.css new file mode 100644 index 0000000..d5e64ef --- /dev/null +++ b/app/assets/styles/resources._aUrMsvM.css @@ -0,0 +1,56 @@ +.resources-page[data-v-7390ef3e] { + flex-direction: column; + gap: 21px; + min-width: 0; + display: flex; +} +.page-head[data-v-7390ef3e] { + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + gap: 16px; + display: flex; +} +.page-heading h2[data-v-7390ef3e] { + margin: 0; + font-size: 1.25rem; + font-weight: 650; + line-height: 2rem; +} +.page-heading p[data-v-7390ef3e] { + color: var(--p-text-muted-color); + margin: 4px 0 0; + font-size: 0.9375rem; +} +.resource-tabs[data-v-7390ef3e] { + border-bottom: 1px solid var(--console-panel-border); + display: flex; + overflow-x: auto; +} +.resource-tab[data-v-7390ef3e] { + min-height: 50px; + color: var(--p-text-muted-color); + white-space: nowrap; + cursor: pointer; + background: 0 0; + border: 0; + border-bottom: 2px solid #0000; + flex-shrink: 0; + margin-bottom: -1px; + padding: 14px; + font-size: 1rem; +} +.resource-tab[data-v-7390ef3e]:hover { + color: var(--p-text-color); +} +.resource-tab.active[data-v-7390ef3e] { + color: var(--p-primary-color); + border-bottom-color: var(--p-primary-color); + font-weight: 500; +} +.resource-tab[data-v-7390ef3e]:focus-visible { + outline-offset: -3px; +} +.resource-content[data-v-7390ef3e] { + min-width: 0; +} diff --git a/app/assets/styles/server.DGuhrprb.css b/app/assets/styles/server.DGuhrprb.css new file mode 100644 index 0000000..bff9c91 --- /dev/null +++ b/app/assets/styles/server.DGuhrprb.css @@ -0,0 +1,292 @@ +.page[data-v-b18590a1] { + flex-direction: column; + gap: 12px; + display: flex; +} +.panel[data-v-b18590a1] { + background: var(--console-panel-bg); + border: 1px solid var(--console-panel-border); + box-shadow: var(--console-panel-shadow); + border-radius: 6px; + padding: 14px; +} +.host-panel[data-v-b18590a1] { + padding: 14px 0 0; + position: relative; +} +.back[data-v-b18590a1] { + clip-path: inset(50%); + width: 1px; + height: 1px; + position: absolute; + overflow: hidden; +} +.back[data-v-b18590a1]:focus-visible { + clip-path: none; + width: auto; + height: auto; + margin-bottom: 7px; + display: block; + position: static; +} +.host-head[data-v-b18590a1] { + justify-content: space-between; + gap: 21px; +} +.host-head[data-v-b18590a1], +.host-ident[data-v-b18590a1] { + align-items: center; + display: flex; +} +.host-ident[data-v-b18590a1] { + flex: 1; + gap: 28px; + min-width: 0; +} +.host-avatar[data-v-b18590a1] { + flex-shrink: 0; + align-items: center; + width: 112px; + height: 112px; + display: flex; + position: relative; +} +.host-avatar img[data-v-b18590a1] { + -o-object-fit: contain; + object-fit: contain; + width: 91px; + height: 91px; +} +.host-avatar .dot[data-v-b18590a1] { + background: #eab308; + border-radius: 50%; + width: 14px; + height: 14px; + position: absolute; + bottom: 13px; + left: 73px; + box-shadow: 0 0 0 3px #fef9c3; +} +.host-avatar .dot-running[data-v-b18590a1] { + background: #22c55e; + box-shadow: 0 0 0 3px #dcfce7; +} +.host-avatar .dot-stopped[data-v-b18590a1] { + background: #ef4444; + box-shadow: 0 0 0 3px #fee2e2; +} +.host-id[data-v-b18590a1] { + flex-direction: column; + gap: 7px; + min-width: 0; + display: flex; +} +.host-id-skeleton[data-v-b18590a1] { + width: 100%; +} +.host-actions-skeleton[data-v-b18590a1] { + width: 403px; +} +.host-title[data-v-b18590a1] { + flex-wrap: wrap; + align-items: center; + gap: 7px; + display: flex; +} +.host-title h2[data-v-b18590a1] { + margin: 0; + font-size: 1.125rem; + font-weight: 700; +} +.host-no[data-v-b18590a1], +.host-sub[data-v-b18590a1] { + color: var(--p-text-muted-color); + font-size: 1rem; +} +.host-sub[data-v-b18590a1] { + flex-wrap: wrap; + gap: 4px; + display: flex; +} +.copy[data-v-b18590a1], +.host-sub[data-v-b18590a1] { + align-items: center; +} +.copy[data-v-b18590a1] { + width: 18px; + height: 21px; + color: var(--p-text-muted-color); + cursor: pointer; + background: 0 0; + border: 0; + border-radius: 3px; + justify-content: center; + padding: 0; + display: inline-flex; +} +.copy .pi[data-v-b18590a1] { + font-size: 0.875rem; +} +.copy.ok[data-v-b18590a1], +.copy[data-v-b18590a1]:hover { + color: var(--p-primary-color); +} +.host-facts[data-v-b18590a1] { + grid-template-columns: minmax(140px, 2fr) repeat(3, minmax(100px, 1fr)); + gap: 21px; + margin-top: 7px; + display: grid; +} +.fact[data-v-b18590a1] { + flex-direction: column; + align-items: flex-start; + gap: 7px; + min-width: 0; + display: flex; +} +.fact label[data-v-b18590a1] { + color: var(--p-text-muted-color); +} +.fact > span[data-v-b18590a1] { + overflow-wrap: anywhere; + max-width: 100%; +} +.ip-value[data-v-b18590a1] { + align-items: center; + gap: 4px; + min-width: 0; + max-width: 100%; + display: inline-flex; +} +.ip-value .mono[data-v-b18590a1] { + overflow-wrap: anywhere; + min-width: 0; +} +.ip-value .copy[data-v-b18590a1] { + flex-shrink: 0; +} +.ip-error[data-v-b18590a1] { + align-items: center; + gap: 4px; +} +.host-actions[data-v-b18590a1], +.ip-error[data-v-b18590a1] { + flex-wrap: wrap; + display: flex; +} +.host-actions[data-v-b18590a1] { + flex-shrink: 0; + gap: 7px; +} +.host-actions[data-v-b18590a1] .p-button { + padding: 7px 10.5px; +} +.power-confirm-text[data-v-b18590a1] { + overflow-wrap: anywhere; + line-height: 1.7; +} +.power-confirm-text p[data-v-b18590a1] { + margin: 0; +} +.power-confirm-text p + p[data-v-b18590a1] { + color: var(--p-text-muted-color); + margin-top: 12px; +} +.power-confirm-text label[data-v-b18590a1] { + margin: 14px 0 7px; + display: block; +} +.power-confirm-error[data-v-b18590a1] { + color: var(--p-red-600); + margin-top: 7px; + display: block; +} +.section-title[data-v-b18590a1] { + margin-bottom: 14px; + font-size: 1.125rem; + font-weight: 600; +} +.info-grid[data-v-b18590a1] { + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + gap: 14px; + display: grid; +} +.info-item[data-v-b18590a1] { + flex-direction: column; + gap: 7px; + display: flex; +} +.empty-hint[data-v-b18590a1], +.info-item label[data-v-b18590a1] { + color: var(--p-text-muted-color); +} +.config-options[data-v-b18590a1], +.msg[data-v-b18590a1] { + margin-top: 14px; +} +.notes-label[data-v-b18590a1] { + margin-bottom: 7px; + display: block; +} +@media (width<=1199px) { + .host-head[data-v-b18590a1] { + flex-wrap: wrap; + } + .host-actions[data-v-b18590a1] { + margin-left: 140px; + } + .host-facts[data-v-b18590a1] { + grid-template-columns: minmax(160px, 2fr) repeat(3, minmax(90px, 1fr)); + } +} +@media (width<=767px) { + .host-panel[data-v-b18590a1] { + padding-top: 7px; + } + .host-head[data-v-b18590a1] { + gap: 28px; + } + .host-ident[data-v-b18590a1] { + flex-direction: column; + flex-basis: 100%; + align-items: flex-start; + gap: 14px; + } + .host-avatar[data-v-b18590a1] { + height: 98px; + } + .host-avatar .dot[data-v-b18590a1] { + bottom: 6px; + } + .host-id[data-v-b18590a1] { + width: 100%; + } + .host-title[data-v-b18590a1] { + gap: 7px; + } + .host-facts[data-v-b18590a1] { + flex-direction: column; + gap: 10.5px; + margin-top: 10.5px; + display: flex; + } + .fact[data-v-b18590a1] { + flex-direction: row; + justify-content: space-between; + align-items: center; + gap: 14px; + } + .fact label[data-v-b18590a1] { + flex-shrink: 0; + } + .fact > span[data-v-b18590a1] { + text-align: right; + } + .host-actions[data-v-b18590a1] { + max-width: min(340px, 100%); + margin-left: 0; + } + .page[data-v-b18590a1] { + gap: 21px; + } +} diff --git a/app/assets/styles/settings.zV3AWuRw.css b/app/assets/styles/settings.zV3AWuRw.css new file mode 100644 index 0000000..192e8bf --- /dev/null +++ b/app/assets/styles/settings.zV3AWuRw.css @@ -0,0 +1,198 @@ +.page[data-v-4a007273] { + flex-direction: column; + gap: 16px; + display: flex; +} +.back[data-v-4a007273] { + color: var(--p-text-muted-color, #94a3b8); + align-items: center; + gap: 6px; + font-size: 0.9375rem; + text-decoration: none; + display: inline-flex; +} +.back[data-v-4a007273]:hover { + color: var(--p-primary-color, #3b82f6); +} +.page-head h2[data-v-4a007273] { + margin: 10px 0 0; + font-size: 1.375rem; +} +.panel[data-v-4a007273] { + background: var(--p-content-background); + border: 1px solid var(--p-content-border-color, #e2e8f0); + border-radius: 12px; + padding: 8px 20px 20px; +} +.tab-head[data-v-4a007273] { + justify-content: space-between; + align-items: center; + margin-bottom: 14px; + display: flex; +} +.tab-tip[data-v-4a007273] { + color: var(--p-text-muted-color, #94a3b8); + font-size: 0.9375rem; +} +.card-list[data-v-4a007273] { + flex-direction: column; + gap: 10px; + display: flex; +} +.info-card[data-v-4a007273] { + border: 1px solid var(--p-content-border-color, #e2e8f0); + border-radius: 10px; + align-items: center; + gap: 12px; + padding: 12px 16px; + display: flex; +} +.card-main[data-v-4a007273] { + flex: 1; + min-width: 0; +} +.card-title[data-v-4a007273] { + align-items: center; + gap: 8px; + font-size: 1rem; + font-weight: 500; + display: flex; +} +.badge[data-v-4a007273] { + color: var(--p-text-muted-color, #64748b); + border: 1px solid var(--p-content-border-color, #e2e8f0); + border-radius: 999px; + padding: 0 8px; + font-size: 0.8125rem; + font-weight: 400; +} +.badge.special[data-v-4a007273] { + color: #ef4444; + border-color: #fecaca; +} +.badge.default[data-v-4a007273] { + color: var(--p-primary-color, #3b82f6); + border-color: #a7f3d0; +} +.card-sub[data-v-4a007273] { + margin-top: 4px; + font-size: 0.875rem; +} +.card-sub[data-v-4a007273], +.empty[data-v-4a007273] { + color: var(--p-text-muted-color, #94a3b8); +} +.empty[data-v-4a007273] { + text-align: center; + padding: 32px 0; + font-size: 0.9375rem; +} +.field[data-v-4a007273], +.form[data-v-4a007273] { + flex-direction: column; + display: flex; +} +.field[data-v-4a007273] { + flex: 1; + gap: 6px; +} +.field label[data-v-4a007273] { + color: var(--p-text-color, #334155); + font-size: 0.9375rem; +} +.field-row[data-v-4a007273] { + gap: 14px; + display: flex; +} +.field-check[data-v-4a007273] { + color: var(--p-text-color, #334155); + align-items: center; + gap: 8px; + font-size: 0.9375rem; + display: flex; +} +.req[data-v-4a007273] { + color: #ef4444; +} +.page[data-v-4a007273] { + gap: 28px; + width: 100%; + max-width: 896px; + margin: 0 auto; +} +.page-head[data-v-4a007273] { + flex-direction: row-reverse; + justify-content: space-between; + align-items: center; + display: flex; +} +.page-head h2[data-v-4a007273] { + margin: 0; + font-size: 1.25rem; + font-weight: 600; +} +.settings-section[data-v-4a007273] { + border-bottom: 1px solid var(--p-content-border-color); + grid-template-columns: minmax(0, 1fr) minmax(0, 3fr); + gap: 28px; + padding: 14px 0 28px; + display: grid; +} +.settings-intro h3[data-v-4a007273] { + margin: 0 0 10px; + font-size: 1rem; + font-weight: 500; +} +.settings-intro p[data-v-4a007273] { + color: var(--p-text-muted-color); + margin: 0; + font-size: 0.875rem; + line-height: 1.8; +} +.settings-content[data-v-4a007273] { + flex-direction: column; + align-items: flex-start; + gap: 14px; + min-width: 0; + display: flex; +} +.settings-table[data-v-4a007273] { + border: 1px solid var(--p-content-border-color); + border-radius: 5px; + width: 100%; + overflow: hidden; + box-shadow: 0 2px 3px #0000000f; +} +.settings-table[data-v-4a007273] .p-datatable-table { + min-width: 540px; +} +.settings-table[data-v-4a007273] .p-datatable-thead > tr > th { + background: 0 0; + padding: 14px; + font-size: 0.875rem; +} +.settings-table[data-v-4a007273] .p-datatable-tbody > tr > td { + padding: 14px; + font-size: 0.875rem; +} +.form[data-v-4a007273] { + gap: 21px; +} +@media (width<=768px) { + .settings-section[data-v-4a007273] { + grid-template-columns: minmax(0, 1fr); + gap: 14px; + } + .field-row[data-v-4a007273] { + flex-direction: column; + } + .page-head[data-v-4a007273] { + flex-direction: column-reverse; + align-items: flex-start; + gap: 14px; + } +} +.row-actions[data-v-4a007273] { + gap: 0; + display: flex; +} diff --git a/app/assets/styles/ssh-keys.WWTOf2zG.css b/app/assets/styles/ssh-keys.WWTOf2zG.css new file mode 100644 index 0000000..a5c3f58 --- /dev/null +++ b/app/assets/styles/ssh-keys.WWTOf2zG.css @@ -0,0 +1,112 @@ +.key-text[data-v-31489433] { + color: var(--p-text-muted-color, #64748b); + text-overflow: ellipsis; + white-space: nowrap; + max-width: 420px; + font-size: 0.875rem; + display: block; + overflow: hidden; +} +.fingerprint[data-v-31489433], +.key-text[data-v-31489433] { + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; +} +.fingerprint[data-v-31489433] { + color: var(--p-text-muted-color, #94a3b8); + font-size: 0.8125rem; +} +.row-actions[data-v-31489433] { + align-items: center; + gap: 4px; + display: flex; +} +.form[data-v-31489433] { + gap: 14px; +} +.field[data-v-31489433], +.form[data-v-31489433] { + flex-direction: column; + display: flex; +} +.field label[data-v-31489433] { + color: var(--p-text-color, #334155); + font-size: 0.9375rem; +} +.hint[data-v-31489433] { + color: var(--p-text-muted-color, #94a3b8); + font-size: 0.875rem; +} +.req[data-v-31489433] { + color: #ef4444; +} +.list-page[data-v-31489433] { + gap: 21px; +} +.list-head h2[data-v-31489433], +.page-head h2[data-v-31489433] { + margin: 0; + font-size: 1.125rem; + font-weight: 700; + line-height: 24.5px; +} +.list-toolbar[data-v-31489433], +.list-toolbar-right[data-v-31489433] { + justify-content: flex-start; + gap: 7px; +} +.list-search[data-v-31489433], +.list-select[data-v-31489433] { + width: 280px; +} +.list-table[data-v-31489433] { + border-radius: 6px; + box-shadow: 0 1px 3px #0f172a12; +} +.list-foot[data-v-31489433] { + justify-content: center; +} +.list-foot > .list-bulk[data-v-31489433]:empty { + display: none; +} +[data-v-31489433] .p-datatable-header-cell { + background: var(--p-content-hover-background); + padding: 10.5px 14px; + font-size: 1rem; + font-weight: 600; +} +[data-v-31489433] .p-datatable-tbody > tr > td { + padding: 10.5px 14px; + font-size: 1rem; +} +[data-v-31489433] .p-tag { + font-size: 0.875rem; + font-weight: 500; +} +[data-v-31489433] .list-empty { + gap: 14px; + min-height: 300px; + padding: 42px 21px; +} +[data-v-31489433] .list-empty i { + opacity: 1; + font-size: 1.875rem; +} +[data-v-31489433] .list-empty-title { + font-size: 1rem; +} +[data-v-31489433] .list-empty-desc { + font-size: 0.875rem; +} +.field[data-v-31489433] { + gap: 7px; +} +.field label[data-v-31489433] { + font-size: 0.875rem; +} +@media (width<=768px) { + .list-search[data-v-31489433], + .list-select[data-v-31489433], + .list-toolbar-right[data-v-31489433] { + width: 100%; + } +} diff --git a/app/assets/styles/tickets.Dz8JrDhQ.css b/app/assets/styles/tickets.Dz8JrDhQ.css new file mode 100644 index 0000000..9c0fd10 --- /dev/null +++ b/app/assets/styles/tickets.Dz8JrDhQ.css @@ -0,0 +1,120 @@ +.stat-row[data-v-1ff3e04d] { + flex-wrap: wrap; + gap: 12px; + display: flex; +} +.stat-card[data-v-1ff3e04d] { + background: var(--p-content-background); + border: 1px solid var(--p-content-border-color, #e2e8f0); + border-radius: 10px; + align-items: center; + gap: 8px; + padding: 10px 16px; + font-size: 0.9375rem; + display: inline-flex; +} +.stat-dot[data-v-1ff3e04d] { + border-radius: 50%; + flex-shrink: 0; + width: 8px; + height: 8px; +} +.stat-label[data-v-1ff3e04d] { + color: var(--p-text-muted-color, #64748b); +} +.stat-count[data-v-1ff3e04d] { + font-weight: 600; +} +.title-link[data-v-1ff3e04d] { + color: var(--p-text-color, #334155); + text-decoration: none; +} +.title-link[data-v-1ff3e04d]:hover { + color: var(--p-primary-color, #10b981); +} +.status-tag[data-v-1ff3e04d] { + white-space: nowrap; + border: 1px solid; + border-radius: 999px; + padding: 1px 8px; + font-size: 0.875rem; + display: inline-block; +} +.list-page[data-v-1ff3e04d] { + gap: 21px; +} +.list-head h2[data-v-1ff3e04d], +.page-head h2[data-v-1ff3e04d] { + margin: 0; + font-size: 1.125rem; + font-weight: 700; + line-height: 24.5px; +} +.list-toolbar[data-v-1ff3e04d], +.list-toolbar-right[data-v-1ff3e04d] { + justify-content: flex-start; + gap: 7px; +} +.list-search[data-v-1ff3e04d], +.list-select[data-v-1ff3e04d] { + width: 280px; +} +.list-table[data-v-1ff3e04d] { + border-radius: 6px; + box-shadow: 0 1px 3px #0f172a12; +} +.list-foot[data-v-1ff3e04d] { + justify-content: center; +} +.list-foot > .list-bulk[data-v-1ff3e04d]:empty { + display: none; +} +[data-v-1ff3e04d] .p-datatable-header-cell { + background: var(--p-content-hover-background); + padding: 10.5px 14px; + font-size: 1rem; + font-weight: 600; +} +[data-v-1ff3e04d] .p-datatable-tbody > tr > td { + padding: 10.5px 14px; + font-size: 1rem; +} +[data-v-1ff3e04d] .p-tag { + font-size: 0.875rem; + font-weight: 500; +} +[data-v-1ff3e04d] .list-empty { + gap: 14px; + min-height: 300px; + padding: 42px 21px; +} +[data-v-1ff3e04d] .list-empty i { + opacity: 1; + font-size: 1.875rem; +} +[data-v-1ff3e04d] .list-empty-title { + font-size: 1rem; +} +[data-v-1ff3e04d] .list-empty-desc { + font-size: 0.875rem; +} +.field[data-v-1ff3e04d] { + gap: 7px; +} +.field label[data-v-1ff3e04d] { + font-size: 0.875rem; +} +@media (width<=768px) { + .list-search[data-v-1ff3e04d], + .list-select[data-v-1ff3e04d], + .list-toolbar-right[data-v-1ff3e04d] { + width: 100%; + } +} +.support-notice[data-v-1ff3e04d] { + font-size: 0.875rem; + line-height: 24.5px; +} +.list-head[data-v-1ff3e04d] { + margin-top: 0; +} diff --git a/app/assets/styles/transfer.CAsJhVUW.css b/app/assets/styles/transfer.CAsJhVUW.css new file mode 100644 index 0000000..710d5c7 --- /dev/null +++ b/app/assets/styles/transfer.CAsJhVUW.css @@ -0,0 +1,278 @@ +.code-card[data-v-559a870e] { + border: 1px solid var(--p-content-border-color, #e2e8f0); + background: var(--p-content-background); + border-radius: 10px; + gap: 8px; + padding: 16px 18px; +} +.code-main[data-v-559a870e] { + flex-wrap: wrap; + align-items: center; + gap: 12px; + display: flex; +} +.code-label[data-v-559a870e] { + color: var(--p-text-muted-color, #64748b); + font-size: 0.9375rem; +} +.code-value[data-v-559a870e] { + letter-spacing: 0.5px; + color: var(--p-text-color); + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 1.125rem; + font-weight: 600; +} +.code-tip[data-v-559a870e], +.code-warn[data-v-559a870e] { + color: var(--p-text-muted-color, #94a3b8); + margin: 0; + font-size: 0.875rem; + line-height: 1.7; +} +.code-warn[data-v-559a870e] { + color: #f59e0b; +} +.prod[data-v-559a870e] { + flex-direction: column; + gap: 2px; + display: flex; +} +.nowrap[data-v-559a870e] { + white-space: nowrap; +} +.prod-name[data-v-559a870e] { + font-weight: 500; +} +.prod-host[data-v-559a870e] { + color: var(--p-text-muted-color, #94a3b8); +} +.row-actions[data-v-559a870e] { + align-items: center; + gap: 2px; + display: flex; +} +.dlg[data-v-559a870e] { + gap: 16px; +} +.detail[data-v-559a870e], +.dlg[data-v-559a870e] { + flex-direction: column; + display: flex; +} +.detail[data-v-559a870e] { + background: var(--p-content-hover-background); + border-radius: 8px; + gap: 10px; + padding: 14px 16px; +} +.d-row[data-v-559a870e] { + justify-content: space-between; + align-items: baseline; + gap: 16px; + font-size: 0.9375rem; + display: flex; +} +.d-row > span[data-v-559a870e] { + color: var(--p-text-muted-color, #64748b); + flex-shrink: 0; +} +.d-row > b[data-v-559a870e] { + text-align: right; + font-weight: 500; +} +.d-row .fee[data-v-559a870e] { + color: #ef4444; +} +.field[data-v-559a870e] { + flex-direction: column; + gap: 6px; + display: flex; +} +.field > label[data-v-559a870e] { + color: var(--p-text-color, #334155); + font-size: 0.9375rem; +} +.verify-row[data-v-559a870e] { + gap: 10px; + display: flex; +} +.verify-row[data-v-559a870e] > :first-child { + flex: 1; +} +.verify-result[data-v-559a870e] { + align-items: center; + gap: 6px; + margin: 0; + font-size: 0.875rem; + display: flex; +} +.verify-result.ok[data-v-559a870e] { + color: #22c55e; +} +.verify-result.bad[data-v-559a870e] { + color: #ef4444; +} +.note[data-v-559a870e] { + color: var(--p-text-muted-color, #94a3b8); + margin: 0; + font-size: 0.875rem; + line-height: 1.8; +} +.disclaimer[data-v-559a870e] { + cursor: pointer; + align-items: flex-start; + gap: 8px; + font-size: 0.9375rem; + line-height: 1.6; + display: flex; +} +.req[data-v-559a870e] { + color: #ef4444; +} +.confirm-text[data-v-559a870e] { + margin: 0 0 12px; + font-size: 1rem; +} +.list-page[data-v-559a870e] { + gap: 21px; +} +.list-head h2[data-v-559a870e], +.page-head h2[data-v-559a870e] { + margin: 0; + font-size: 1.125rem; + font-weight: 700; + line-height: 24.5px; +} +.list-toolbar[data-v-559a870e], +.list-toolbar-right[data-v-559a870e] { + justify-content: flex-start; + gap: 7px; +} +.list-search[data-v-559a870e], +.list-select[data-v-559a870e] { + width: 280px; +} +.list-table[data-v-559a870e] { + border-radius: 6px; + box-shadow: 0 1px 3px #0f172a12; +} +.list-foot[data-v-559a870e] { + justify-content: center; +} +.list-foot > .list-bulk[data-v-559a870e]:empty { + display: none; +} +[data-v-559a870e] .p-datatable-header-cell { + background: var(--p-content-hover-background); + padding: 10.5px 14px; + font-size: 1rem; + font-weight: 600; +} +[data-v-559a870e] .p-datatable-tbody > tr > td { + padding: 10.5px 14px; + font-size: 1rem; +} +[data-v-559a870e] .p-tag { + font-size: 0.875rem; + font-weight: 500; +} +[data-v-559a870e] .list-empty { + gap: 14px; + min-height: 300px; + padding: 42px 21px; +} +[data-v-559a870e] .list-empty i { + opacity: 1; + font-size: 1.875rem; +} +[data-v-559a870e] .list-empty-title { + font-size: 1rem; +} +[data-v-559a870e] .list-empty-desc { + font-size: 0.875rem; +} +.field[data-v-559a870e] { + gap: 7px; +} +.field label[data-v-559a870e] { + font-size: 0.875rem; +} +@media (width<=768px) { + .list-search[data-v-559a870e], + .list-select[data-v-559a870e], + .list-toolbar-right[data-v-559a870e] { + width: 100%; + } +} +.page-description[data-v-559a870e] { + color: var(--p-text-muted-color); + margin: 7px 0 0; + font-size: 1rem; +} +.transfer-tabs[data-v-559a870e] { + border-bottom: 1px solid var(--p-content-border-color); +} +.transfer-tabs[data-v-559a870e] .list-segments { + background: 0 0; + gap: 0; + padding: 0; +} +.transfer-tabs[data-v-559a870e] .list-seg { + border: 0; + border-radius: 0; + padding: 14px; + font-weight: 600; +} +.transfer-tabs[data-v-559a870e] .list-seg.active { + box-shadow: none; + border-bottom: 2px solid var(--p-primary-color); + color: var(--p-primary-color); + background: 0 0; +} +.code-card[data-v-559a870e] { + background: color-mix( + in srgb, + var(--p-primary-color) 7%, + var(--p-content-background) + ); + border: 1px solid var(--p-content-border-color); + border-radius: 6px; + flex-direction: column; + gap: 7px; + padding: 17.5px 21px; + display: flex; +} +.code-main[data-v-559a870e] { + grid-template-columns: minmax(0, 1fr) auto; + gap: 10.5px; + display: grid; +} +.code-label[data-v-559a870e] { + color: var(--p-primary-color); + grid-column: 1/-1; + font-weight: 700; +} +.code-value[data-v-559a870e] { + background: var(--p-content-background); + border: 1px solid var(--p-content-border-color); + overflow-wrap: anywhere; + border-radius: 5px; + padding: 7px 10.5px; + font-family: inherit; +} +.code-tip[data-v-559a870e] { + color: var(--p-primary-color); + margin: 0; + font-size: 0.875rem; +} +.transfer-section-head[data-v-559a870e] { + justify-content: space-between; + align-items: center; + display: flex; +} +.prod-name[data-v-559a870e] { + font-size: 1rem; +} +.prod-host[data-v-559a870e] { + font-size: 0.875rem; +} diff --git a/app/assets/styles/vouchers.5FV4ozrh.css b/app/assets/styles/vouchers.5FV4ozrh.css new file mode 100644 index 0000000..0a1b69b --- /dev/null +++ b/app/assets/styles/vouchers.5FV4ozrh.css @@ -0,0 +1,341 @@ +.voucher-page[data-v-b08e3df0] { + flex-direction: column; + gap: 21px; + min-width: 0; + display: flex; +} +.page-head[data-v-b08e3df0] { + justify-content: space-between; + align-items: center; + gap: 16px; + display: flex; +} +.page-heading h2[data-v-b08e3df0] { + margin: 0; + font-size: 1.25rem; + font-weight: 650; + line-height: 2rem; +} +.page-heading p[data-v-b08e3df0] { + color: var(--p-text-muted-color); + margin: 4px 0 0; + font-size: 0.9375rem; +} +.voucher-guide[data-v-b08e3df0] { + background: var(--console-panel-bg); + border: 1px solid var(--console-panel-border); + border-radius: 8px; + align-items: center; + gap: 16px; + padding: 22px 24px; + display: flex; +} +.guide-icon[data-v-b08e3df0] { + width: 44px; + height: 44px; + color: var(--p-primary-color); + background: var(--p-highlight-background); + border-radius: 10px; + flex-shrink: 0; + place-items: center; + font-size: 1.375rem; + display: grid; +} +.voucher-guide h3[data-v-b08e3df0] { + margin: 0 0 6px; + font-size: 1.0625rem; + font-weight: 600; +} +.voucher-guide p[data-v-b08e3df0] { + margin: 0; + font-size: 0.9375rem; +} +.guide-note[data-v-b08e3df0], +.voucher-guide p[data-v-b08e3df0] { + color: var(--p-text-muted-color); + line-height: 1.7; +} +.guide-note[data-v-b08e3df0] { + align-items: center; + gap: 7px; + max-width: 240px; + margin-left: auto; + font-size: 0.875rem; + display: flex; +} +.guide-note > i[data-v-b08e3df0] { + flex-shrink: 0; +} +.voucher-tabs[data-v-b08e3df0] { + min-width: 0; +} +.voucher-tabs[data-v-b08e3df0] .p-tablist-tab-list { + background: 0 0; +} +.voucher-tabs[data-v-b08e3df0] .p-tab { + gap: 8px; + padding: 14px 18px; +} +.voucher-tabs[data-v-b08e3df0] .p-tabpanels { + background: 0 0; + padding: 20px 0 0; +} +.tab-count[data-v-b08e3df0] { + background: var(--p-content-hover-background); + min-width: 22px; + height: 20px; + color: var(--p-text-muted-color); + font-variant-numeric: tabular-nums; + border-radius: 5px; + justify-content: center; + align-items: center; + padding: 0 6px; + font-size: 0.875rem; + display: inline-flex; +} +.voucher-toolbar[data-v-b08e3df0] { + justify-content: space-between; + align-items: center; + gap: 14px; + margin-bottom: 16px; + display: flex; +} +.voucher-toolbar p[data-v-b08e3df0] { + color: var(--p-text-muted-color); + margin: 0; + font-size: 0.9375rem; +} +.voucher-grid[data-v-b08e3df0] { + grid-template-columns: repeat(auto-fit, minmax(min(100%, 430px), 1fr)); + gap: 18px; + display: grid; +} +.voucher-card[data-v-b08e3df0] { + border: 1px solid var(--console-panel-border); + background: var(--console-panel-bg); + border-radius: 8px; + grid-template-columns: 128px minmax(0, 1fr); + min-width: 0; + display: grid; + overflow: hidden; +} +.voucher-face[data-v-b08e3df0] { + text-align: center; + border-right: 1px dashed var(--console-panel-border); + background: color-mix( + in srgb, + var(--p-highlight-background) 70%, + var(--console-panel-bg) + ); + color: var(--p-primary-color); + flex-direction: column; + justify-content: center; + align-items: center; + gap: 12px; + padding: 24px 12px; + display: flex; +} +.face-label[data-v-b08e3df0] { + font-size: 0.875rem; +} +.face-value[data-v-b08e3df0] { + font-variant-numeric: tabular-nums; + justify-content: center; + align-items: baseline; + gap: 3px; + max-width: 100%; + display: flex; +} +.face-value small[data-v-b08e3df0] { + font-size: 1.125rem; +} +.face-value strong[data-v-b08e3df0] { + overflow-wrap: anywhere; + font-size: clamp(24px, 2.6vw, 36px); + font-weight: 650; + line-height: 1.2; +} +.face-threshold[data-v-b08e3df0] { + overflow-wrap: anywhere; + font-size: 0.875rem; + line-height: 1.7; +} +.voucher-details[data-v-b08e3df0] { + flex-direction: column; + gap: 16px; + min-width: 0; + padding: 20px; + display: flex; +} +.voucher-title[data-v-b08e3df0] { + justify-content: space-between; + align-items: flex-start; + gap: 10px; + display: flex; +} +.voucher-title[data-v-b08e3df0] .p-tag { + flex-shrink: 0; + font-size: 0.8125rem; +} +.voucher-code[data-v-b08e3df0] { + overflow-wrap: anywhere; + font-size: 1rem; + font-weight: 600; + line-height: 1.6; +} +.voucher-rules[data-v-b08e3df0] { + flex-direction: column; + gap: 9px; + margin: 0; + font-size: 0.875rem; + line-height: 1.7; + display: flex; +} +.voucher-rules > div[data-v-b08e3df0] { + grid-template-columns: 52px minmax(0, 1fr); + gap: 8px; + display: grid; +} +.voucher-rules dt[data-v-b08e3df0] { + color: var(--p-text-muted-color); +} +.voucher-rules dd[data-v-b08e3df0] { + overflow-wrap: anywhere; + margin: 0; +} +.voucher-uses[data-v-b08e3df0] { + flex-wrap: wrap; + gap: 7px 12px; + font-size: 0.8125rem; + line-height: 1.6; + display: flex; +} +.voucher-uses > span[data-v-b08e3df0] { + color: var(--p-primary-color); + align-items: center; + gap: 4px; + display: inline-flex; +} +.voucher-uses > .restricted[data-v-b08e3df0] { + color: var(--p-text-muted-color); +} +.voucher-uses i[data-v-b08e3df0] { + font-size: 0.625rem; +} +.voucher-footer[data-v-b08e3df0] { + border-top: 1px solid var(--console-panel-border); + color: var(--p-text-muted-color); + justify-content: space-between; + align-items: center; + gap: 10px; + margin-top: auto; + padding-top: 14px; + font-size: 0.8125rem; + display: flex; +} +.voucher-footer .p-button[data-v-b08e3df0] { + flex-shrink: 0; +} +.inactive .voucher-face[data-v-b08e3df0], +.use-tip[data-v-b08e3df0] { + color: var(--p-text-muted-color); +} +.inactive .voucher-face[data-v-b08e3df0] { + background: var(--p-content-hover-background); +} +.inactive .voucher-uses > span[data-v-b08e3df0] { + color: var(--p-text-muted-color); +} +.voucher-state[data-v-b08e3df0] { + background: var(--console-panel-bg); + border: 1px solid var(--console-panel-border); + border-radius: 8px; +} +.voucher-state[data-v-b08e3df0] .list-empty { + justify-content: center; + min-height: 340px; +} +.voucher-state[data-v-b08e3df0] .p-button { + margin-top: 8px; +} +.voucher-skeleton[data-v-b08e3df0] { + border: 1px solid var(--console-panel-border); + background: var(--console-panel-bg); + border-radius: 8px; + flex-direction: column; + gap: 20px; + min-height: 260px; + padding: 28px; + display: flex; +} +.voucher-pagination[data-v-b08e3df0] { + color: var(--p-text-muted-color); + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + gap: 14px; + margin-top: 24px; + font-size: 0.9375rem; + display: flex; +} +.voucher-pagination[data-v-b08e3df0] .p-paginator { + background: 0 0; + padding: 0; +} +@media (width<=1000px) { + .guide-note[data-v-b08e3df0] { + display: none; + } +} +@media (width<=640px) { + .page-head[data-v-b08e3df0] { + flex-wrap: wrap; + } + .voucher-guide[data-v-b08e3df0] { + align-items: flex-start; + gap: 12px; + padding: 18px; + } + .guide-icon[data-v-b08e3df0] { + width: 36px; + height: 36px; + font-size: 1.1875rem; + } + .voucher-grid[data-v-b08e3df0] { + gap: 14px; + } + .voucher-card[data-v-b08e3df0] { + grid-template-columns: minmax(0, 1fr); + } + .voucher-face[data-v-b08e3df0] { + text-align: left; + border-right: 0; + border-bottom: 1px dashed var(--console-panel-border); + grid-template-columns: auto 1fr; + gap: 4px 14px; + padding: 18px 20px; + display: grid; + } + .face-value[data-v-b08e3df0] { + grid-area: 1/1/3; + } + .face-value strong[data-v-b08e3df0] { + font-size: 2rem; + } + .face-label[data-v-b08e3df0] { + grid-area: 1/2; + } + .face-threshold[data-v-b08e3df0] { + grid-area: 2/2; + } + .voucher-details[data-v-b08e3df0] { + padding: 18px; + } + .voucher-pagination[data-v-b08e3df0] { + justify-content: center; + } + .voucher-pagination > span[data-v-b08e3df0] { + text-align: center; + width: 100%; + } +} diff --git a/app/components/AuthProviders.vue b/app/components/AuthProviders.vue new file mode 100644 index 0000000..f050834 --- /dev/null +++ b/app/components/AuthProviders.vue @@ -0,0 +1,726 @@ + diff --git a/app/components/BackendNavEntry.vue b/app/components/BackendNavEntry.vue new file mode 100644 index 0000000..65cd8fe --- /dev/null +++ b/app/components/BackendNavEntry.vue @@ -0,0 +1,433 @@ + diff --git a/app/components/BackendNavigation.vue b/app/components/BackendNavigation.vue new file mode 100644 index 0000000..87b2f6f --- /dev/null +++ b/app/components/BackendNavigation.vue @@ -0,0 +1,153 @@ + diff --git a/app/components/BuildUpdateNotice.vue b/app/components/BuildUpdateNotice.vue new file mode 100644 index 0000000..c717025 --- /dev/null +++ b/app/components/BuildUpdateNotice.vue @@ -0,0 +1,177 @@ + diff --git a/app/components/CaptchaField.vue b/app/components/CaptchaField.vue new file mode 100644 index 0000000..8f3d89c --- /dev/null +++ b/app/components/CaptchaField.vue @@ -0,0 +1,230 @@ + diff --git a/app/components/ChartBox.vue b/app/components/ChartBox.vue new file mode 100644 index 0000000..dd08240 --- /dev/null +++ b/app/components/ChartBox.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/app/components/ClientLevelDialog.vue b/app/components/ClientLevelDialog.vue new file mode 100644 index 0000000..7014b25 --- /dev/null +++ b/app/components/ClientLevelDialog.vue @@ -0,0 +1,449 @@ + diff --git a/app/components/ConsoleLegalFooter.vue b/app/components/ConsoleLegalFooter.vue new file mode 100644 index 0000000..9742630 --- /dev/null +++ b/app/components/ConsoleLegalFooter.vue @@ -0,0 +1,69 @@ + diff --git a/app/components/GeetestField.vue b/app/components/GeetestField.vue new file mode 100644 index 0000000..2fe9808 --- /dev/null +++ b/app/components/GeetestField.vue @@ -0,0 +1,372 @@ + diff --git a/app/components/GenericOAuthProviders.vue b/app/components/GenericOAuthProviders.vue new file mode 100644 index 0000000..9bdb6c1 --- /dev/null +++ b/app/components/GenericOAuthProviders.vue @@ -0,0 +1,162 @@ + diff --git a/app/components/GlobalSearch.vue b/app/components/GlobalSearch.vue new file mode 100644 index 0000000..3bb660e --- /dev/null +++ b/app/components/GlobalSearch.vue @@ -0,0 +1,403 @@ + diff --git a/app/components/HostList.vue b/app/components/HostList.vue new file mode 100644 index 0000000..e1ecfe8 --- /dev/null +++ b/app/components/HostList.vue @@ -0,0 +1,3656 @@ + diff --git a/app/components/ListEmpty.vue b/app/components/ListEmpty.vue new file mode 100644 index 0000000..b25ee94 --- /dev/null +++ b/app/components/ListEmpty.vue @@ -0,0 +1,56 @@ + diff --git a/app/components/ListSegments.vue b/app/components/ListSegments.vue new file mode 100644 index 0000000..a4a6b2b --- /dev/null +++ b/app/components/ListSegments.vue @@ -0,0 +1,74 @@ + diff --git a/app/components/MfCloudBackupPanel.vue b/app/components/MfCloudBackupPanel.vue new file mode 100644 index 0000000..fc75256 --- /dev/null +++ b/app/components/MfCloudBackupPanel.vue @@ -0,0 +1,1364 @@ + diff --git a/app/components/NotificationPreferences.vue b/app/components/NotificationPreferences.vue new file mode 100644 index 0000000..0cef068 --- /dev/null +++ b/app/components/NotificationPreferences.vue @@ -0,0 +1,379 @@ + diff --git a/app/components/OperatePasswordGate.vue b/app/components/OperatePasswordGate.vue new file mode 100644 index 0000000..1c23764 --- /dev/null +++ b/app/components/OperatePasswordGate.vue @@ -0,0 +1,36 @@ + diff --git a/app/components/OperationNotice.vue b/app/components/OperationNotice.vue new file mode 100644 index 0000000..b477985 --- /dev/null +++ b/app/components/OperationNotice.vue @@ -0,0 +1,52 @@ + diff --git a/app/components/OperationToasts.vue b/app/components/OperationToasts.vue new file mode 100644 index 0000000..7d7b44e --- /dev/null +++ b/app/components/OperationToasts.vue @@ -0,0 +1,123 @@ + diff --git a/app/components/OsIcon.vue b/app/components/OsIcon.vue new file mode 100644 index 0000000..2531d8d --- /dev/null +++ b/app/components/OsIcon.vue @@ -0,0 +1,124 @@ + diff --git a/app/components/PageInfoNotice.vue b/app/components/PageInfoNotice.vue new file mode 100644 index 0000000..9e831ab --- /dev/null +++ b/app/components/PageInfoNotice.vue @@ -0,0 +1,49 @@ + diff --git a/app/components/PageSteps.vue b/app/components/PageSteps.vue new file mode 100644 index 0000000..9ac3caa --- /dev/null +++ b/app/components/PageSteps.vue @@ -0,0 +1,100 @@ + diff --git a/app/components/PaymentDialog.vue b/app/components/PaymentDialog.vue new file mode 100644 index 0000000..53ecc47 --- /dev/null +++ b/app/components/PaymentDialog.vue @@ -0,0 +1,2030 @@ + diff --git a/app/components/PhoneCodeField.vue b/app/components/PhoneCodeField.vue new file mode 100644 index 0000000..5969c0d --- /dev/null +++ b/app/components/PhoneCodeField.vue @@ -0,0 +1,173 @@ + diff --git a/app/components/ProductCategoryNotice.vue b/app/components/ProductCategoryNotice.vue new file mode 100644 index 0000000..08acd81 --- /dev/null +++ b/app/components/ProductCategoryNotice.vue @@ -0,0 +1,91 @@ + diff --git a/app/components/ProductConfigurationSummary.vue b/app/components/ProductConfigurationSummary.vue new file mode 100644 index 0000000..133b67b --- /dev/null +++ b/app/components/ProductConfigurationSummary.vue @@ -0,0 +1,454 @@ + diff --git a/app/components/ProductDescription.vue b/app/components/ProductDescription.vue new file mode 100644 index 0000000..b9cc5bb --- /dev/null +++ b/app/components/ProductDescription.vue @@ -0,0 +1,592 @@ + diff --git a/app/components/ProductGroupLabel.vue b/app/components/ProductGroupLabel.vue new file mode 100644 index 0000000..c3473b2 --- /dev/null +++ b/app/components/ProductGroupLabel.vue @@ -0,0 +1,77 @@ + diff --git a/app/components/RechargeDialog.vue b/app/components/RechargeDialog.vue new file mode 100644 index 0000000..6567f02 --- /dev/null +++ b/app/components/RechargeDialog.vue @@ -0,0 +1,253 @@ + diff --git a/app/components/RichTextEditor.vue b/app/components/RichTextEditor.vue new file mode 100644 index 0000000..5e2bd34 --- /dev/null +++ b/app/components/RichTextEditor.vue @@ -0,0 +1,248 @@ + diff --git a/app/components/RingProgress.vue b/app/components/RingProgress.vue new file mode 100644 index 0000000..c71e538 --- /dev/null +++ b/app/components/RingProgress.vue @@ -0,0 +1,128 @@ + diff --git a/app/components/SecurityVerificationDialog.vue b/app/components/SecurityVerificationDialog.vue new file mode 100644 index 0000000..0678fca --- /dev/null +++ b/app/components/SecurityVerificationDialog.vue @@ -0,0 +1,635 @@ + diff --git a/app/components/SensitiveValue.vue b/app/components/SensitiveValue.vue new file mode 100644 index 0000000..0992c89 --- /dev/null +++ b/app/components/SensitiveValue.vue @@ -0,0 +1,166 @@ + diff --git a/app/components/TicketAttachments.vue b/app/components/TicketAttachments.vue new file mode 100644 index 0000000..f0dc76c --- /dev/null +++ b/app/components/TicketAttachments.vue @@ -0,0 +1,457 @@ + diff --git a/app/components/TicketNotice.vue b/app/components/TicketNotice.vue new file mode 100644 index 0000000..0529f8a --- /dev/null +++ b/app/components/TicketNotice.vue @@ -0,0 +1,119 @@ + diff --git a/app/components/UploadField.vue b/app/components/UploadField.vue new file mode 100644 index 0000000..f48d8d8 --- /dev/null +++ b/app/components/UploadField.vue @@ -0,0 +1,191 @@ + diff --git a/app/components/WechatConnection.vue b/app/components/WechatConnection.vue new file mode 100644 index 0000000..3172c2a --- /dev/null +++ b/app/components/WechatConnection.vue @@ -0,0 +1,296 @@ + diff --git a/app/components/WithdrawDialog.vue b/app/components/WithdrawDialog.vue new file mode 100644 index 0000000..0646059 --- /dev/null +++ b/app/components/WithdrawDialog.vue @@ -0,0 +1,965 @@ + diff --git a/app/components/config/CloudProductPicker.vue b/app/components/config/CloudProductPicker.vue new file mode 100644 index 0000000..c22c892 --- /dev/null +++ b/app/components/config/CloudProductPicker.vue @@ -0,0 +1,449 @@ + diff --git a/app/components/config/CommonConfig.vue b/app/components/config/CommonConfig.vue new file mode 100644 index 0000000..c07f886 --- /dev/null +++ b/app/components/config/CommonConfig.vue @@ -0,0 +1,2478 @@ + diff --git a/app/components/config/ConfigBandwidth.vue b/app/components/config/ConfigBandwidth.vue new file mode 100644 index 0000000..b328edd --- /dev/null +++ b/app/components/config/ConfigBandwidth.vue @@ -0,0 +1,305 @@ + diff --git a/app/components/config/ConfigCheckout.vue b/app/components/config/ConfigCheckout.vue new file mode 100644 index 0000000..b0036dc --- /dev/null +++ b/app/components/config/ConfigCheckout.vue @@ -0,0 +1,657 @@ + diff --git a/app/components/config/ConfigChoiceGrid.vue b/app/components/config/ConfigChoiceGrid.vue new file mode 100644 index 0000000..9580d93 --- /dev/null +++ b/app/components/config/ConfigChoiceGrid.vue @@ -0,0 +1,140 @@ + diff --git a/app/components/config/ConfigDiskAdd.vue b/app/components/config/ConfigDiskAdd.vue new file mode 100644 index 0000000..f2be26f --- /dev/null +++ b/app/components/config/ConfigDiskAdd.vue @@ -0,0 +1,66 @@ + diff --git a/app/components/config/ConfigDiskCard.vue b/app/components/config/ConfigDiskCard.vue new file mode 100644 index 0000000..35cda97 --- /dev/null +++ b/app/components/config/ConfigDiskCard.vue @@ -0,0 +1,346 @@ + diff --git a/app/components/config/ConfigLoadingShell.vue b/app/components/config/ConfigLoadingShell.vue new file mode 100644 index 0000000..e7cb657 --- /dev/null +++ b/app/components/config/ConfigLoadingShell.vue @@ -0,0 +1,197 @@ + diff --git a/app/components/config/ConfigResourceOption.vue b/app/components/config/ConfigResourceOption.vue new file mode 100644 index 0000000..9d4cf04 --- /dev/null +++ b/app/components/config/ConfigResourceOption.vue @@ -0,0 +1,233 @@ + diff --git a/app/components/config/FinanceConfig.vue b/app/components/config/FinanceConfig.vue new file mode 100644 index 0000000..f30bae4 --- /dev/null +++ b/app/components/config/FinanceConfig.vue @@ -0,0 +1,1861 @@ + diff --git a/app/components/config/JyCloudConfig.vue b/app/components/config/JyCloudConfig.vue new file mode 100644 index 0000000..eaae3cf --- /dev/null +++ b/app/components/config/JyCloudConfig.vue @@ -0,0 +1,2288 @@ + diff --git a/app/components/config/KkyEcsConfig.vue b/app/components/config/KkyEcsConfig.vue new file mode 100644 index 0000000..59d291d --- /dev/null +++ b/app/components/config/KkyEcsConfig.vue @@ -0,0 +1,1597 @@ + diff --git a/app/components/config/MfCloudConfig.vue b/app/components/config/MfCloudConfig.vue new file mode 100644 index 0000000..06ad201 --- /dev/null +++ b/app/components/config/MfCloudConfig.vue @@ -0,0 +1,2806 @@ + diff --git a/app/components/config/MfDcimConfig.vue b/app/components/config/MfDcimConfig.vue new file mode 100644 index 0000000..031c589 --- /dev/null +++ b/app/components/config/MfDcimConfig.vue @@ -0,0 +1,2060 @@ + diff --git a/app/components/config/ProductCustomFields.vue b/app/components/config/ProductCustomFields.vue new file mode 100644 index 0000000..890471b --- /dev/null +++ b/app/components/config/ProductCustomFields.vue @@ -0,0 +1,268 @@ + diff --git a/app/components/config/PromoCodeField.vue b/app/components/config/PromoCodeField.vue new file mode 100644 index 0000000..098418b --- /dev/null +++ b/app/components/config/PromoCodeField.vue @@ -0,0 +1,193 @@ + diff --git a/app/components/home/HomeConsumeTrend.vue b/app/components/home/HomeConsumeTrend.vue new file mode 100644 index 0000000..e3b2a4b --- /dev/null +++ b/app/components/home/HomeConsumeTrend.vue @@ -0,0 +1,295 @@ + diff --git a/app/components/home/HomeExpiringPanel.vue b/app/components/home/HomeExpiringPanel.vue new file mode 100644 index 0000000..341b0c5 --- /dev/null +++ b/app/components/home/HomeExpiringPanel.vue @@ -0,0 +1,268 @@ + diff --git a/app/components/home/HomeNoticePanel.vue b/app/components/home/HomeNoticePanel.vue new file mode 100644 index 0000000..83f0806 --- /dev/null +++ b/app/components/home/HomeNoticePanel.vue @@ -0,0 +1,440 @@ + diff --git a/app/components/home/HomeReferralPanel.vue b/app/components/home/HomeReferralPanel.vue new file mode 100644 index 0000000..b7c6d1a --- /dev/null +++ b/app/components/home/HomeReferralPanel.vue @@ -0,0 +1,427 @@ + diff --git a/app/components/home/HomeServerPanel.vue b/app/components/home/HomeServerPanel.vue new file mode 100644 index 0000000..cd8df58 --- /dev/null +++ b/app/components/home/HomeServerPanel.vue @@ -0,0 +1,491 @@ + diff --git a/app/components/home/HomeTicketPanel.vue b/app/components/home/HomeTicketPanel.vue new file mode 100644 index 0000000..bee6f50 --- /dev/null +++ b/app/components/home/HomeTicketPanel.vue @@ -0,0 +1,394 @@ + diff --git a/app/components/home/HomeTicketStat.vue b/app/components/home/HomeTicketStat.vue new file mode 100644 index 0000000..70bd2fc --- /dev/null +++ b/app/components/home/HomeTicketStat.vue @@ -0,0 +1,197 @@ + diff --git a/app/components/home/HomeWalletCard.vue b/app/components/home/HomeWalletCard.vue new file mode 100644 index 0000000..2d071fc --- /dev/null +++ b/app/components/home/HomeWalletCard.vue @@ -0,0 +1,206 @@ + diff --git a/app/components/home/RoxyMascot.vue b/app/components/home/RoxyMascot.vue new file mode 100644 index 0000000..c03dc83 --- /dev/null +++ b/app/components/home/RoxyMascot.vue @@ -0,0 +1,36 @@ + diff --git a/app/components/instance/CloudAccessExtras.vue b/app/components/instance/CloudAccessExtras.vue new file mode 100644 index 0000000..30b5efe --- /dev/null +++ b/app/components/instance/CloudAccessExtras.vue @@ -0,0 +1,172 @@ + diff --git a/app/components/instance/CommonManage.vue b/app/components/instance/CommonManage.vue new file mode 100644 index 0000000..5779f02 --- /dev/null +++ b/app/components/instance/CommonManage.vue @@ -0,0 +1,1583 @@ + diff --git a/app/components/instance/CommonUpgrade.vue b/app/components/instance/CommonUpgrade.vue new file mode 100644 index 0000000..29b234e --- /dev/null +++ b/app/components/instance/CommonUpgrade.vue @@ -0,0 +1,1443 @@ + diff --git a/app/components/instance/DcimActions.vue b/app/components/instance/DcimActions.vue new file mode 100644 index 0000000..1371414 --- /dev/null +++ b/app/components/instance/DcimActions.vue @@ -0,0 +1,838 @@ + diff --git a/app/components/instance/DcimBilling.vue b/app/components/instance/DcimBilling.vue new file mode 100644 index 0000000..77d4b2f --- /dev/null +++ b/app/components/instance/DcimBilling.vue @@ -0,0 +1,989 @@ + diff --git a/app/components/instance/DcimDefence.vue b/app/components/instance/DcimDefence.vue new file mode 100644 index 0000000..bd1ce6a --- /dev/null +++ b/app/components/instance/DcimDefence.vue @@ -0,0 +1,636 @@ + diff --git a/app/components/instance/DcimDomains.vue b/app/components/instance/DcimDomains.vue new file mode 100644 index 0000000..2e99dd1 --- /dev/null +++ b/app/components/instance/DcimDomains.vue @@ -0,0 +1,356 @@ + diff --git a/app/components/instance/DcimManage.vue b/app/components/instance/DcimManage.vue new file mode 100644 index 0000000..9662df0 --- /dev/null +++ b/app/components/instance/DcimManage.vue @@ -0,0 +1,3320 @@ + diff --git a/app/components/instance/DcimMonitor.vue b/app/components/instance/DcimMonitor.vue new file mode 100644 index 0000000..e2f1b19 --- /dev/null +++ b/app/components/instance/DcimMonitor.vue @@ -0,0 +1,343 @@ + diff --git a/app/components/instance/DcimReinstallStatus.vue b/app/components/instance/DcimReinstallStatus.vue new file mode 100644 index 0000000..5325a07 --- /dev/null +++ b/app/components/instance/DcimReinstallStatus.vue @@ -0,0 +1,163 @@ + diff --git a/app/components/instance/DcimUpgrade.vue b/app/components/instance/DcimUpgrade.vue new file mode 100644 index 0000000..24297d4 --- /dev/null +++ b/app/components/instance/DcimUpgrade.vue @@ -0,0 +1,613 @@ + diff --git a/app/components/instance/FlowPacketPanel.vue b/app/components/instance/FlowPacketPanel.vue new file mode 100644 index 0000000..2758945 --- /dev/null +++ b/app/components/instance/FlowPacketPanel.vue @@ -0,0 +1,681 @@ + diff --git a/app/components/instance/ImagePurchaseDialog.vue b/app/components/instance/ImagePurchaseDialog.vue new file mode 100644 index 0000000..8b49863 --- /dev/null +++ b/app/components/instance/ImagePurchaseDialog.vue @@ -0,0 +1,275 @@ + diff --git a/app/components/instance/InstanceAccess.vue b/app/components/instance/InstanceAccess.vue new file mode 100644 index 0000000..8fcb216 --- /dev/null +++ b/app/components/instance/InstanceAccess.vue @@ -0,0 +1,2202 @@ + diff --git a/app/components/instance/InstanceBilling.vue b/app/components/instance/InstanceBilling.vue new file mode 100644 index 0000000..732dc50 --- /dev/null +++ b/app/components/instance/InstanceBilling.vue @@ -0,0 +1,1422 @@ + diff --git a/app/components/instance/InstanceDisks.vue b/app/components/instance/InstanceDisks.vue new file mode 100644 index 0000000..4bec1a4 --- /dev/null +++ b/app/components/instance/InstanceDisks.vue @@ -0,0 +1,1351 @@ + diff --git a/app/components/instance/InstanceLoadingShell.vue b/app/components/instance/InstanceLoadingShell.vue new file mode 100644 index 0000000..797241c --- /dev/null +++ b/app/components/instance/InstanceLoadingShell.vue @@ -0,0 +1,166 @@ + diff --git a/app/components/instance/InstanceManage.vue b/app/components/instance/InstanceManage.vue new file mode 100644 index 0000000..aa66f66 --- /dev/null +++ b/app/components/instance/InstanceManage.vue @@ -0,0 +1,882 @@ + diff --git a/app/components/instance/InstanceMonitor.vue b/app/components/instance/InstanceMonitor.vue new file mode 100644 index 0000000..132260c --- /dev/null +++ b/app/components/instance/InstanceMonitor.vue @@ -0,0 +1,757 @@ + diff --git a/app/components/instance/InstanceMonitorSkeleton.vue b/app/components/instance/InstanceMonitorSkeleton.vue new file mode 100644 index 0000000..6db5e9f --- /dev/null +++ b/app/components/instance/InstanceMonitorSkeleton.vue @@ -0,0 +1,147 @@ + diff --git a/app/components/instance/InstanceNetwork.vue b/app/components/instance/InstanceNetwork.vue new file mode 100644 index 0000000..7e57b4d --- /dev/null +++ b/app/components/instance/InstanceNetwork.vue @@ -0,0 +1,926 @@ + diff --git a/app/components/instance/InstanceOnDemand.vue b/app/components/instance/InstanceOnDemand.vue new file mode 100644 index 0000000..de33fb5 --- /dev/null +++ b/app/components/instance/InstanceOnDemand.vue @@ -0,0 +1,797 @@ + diff --git a/app/components/instance/InstanceOverview.vue b/app/components/instance/InstanceOverview.vue new file mode 100644 index 0000000..5fe7457 --- /dev/null +++ b/app/components/instance/InstanceOverview.vue @@ -0,0 +1,1866 @@ + diff --git a/app/components/instance/InstanceRenewDialog.vue b/app/components/instance/InstanceRenewDialog.vue new file mode 100644 index 0000000..36d5ab5 --- /dev/null +++ b/app/components/instance/InstanceRenewDialog.vue @@ -0,0 +1,640 @@ + diff --git a/app/components/instance/InstanceServiceInfo.vue b/app/components/instance/InstanceServiceInfo.vue new file mode 100644 index 0000000..2ed1ceb --- /dev/null +++ b/app/components/instance/InstanceServiceInfo.vue @@ -0,0 +1,435 @@ + diff --git a/app/components/instance/InstanceSmsCode.vue b/app/components/instance/InstanceSmsCode.vue new file mode 100644 index 0000000..8f8b181 --- /dev/null +++ b/app/components/instance/InstanceSmsCode.vue @@ -0,0 +1,223 @@ + diff --git a/app/components/instance/InstanceStatusTag.vue b/app/components/instance/InstanceStatusTag.vue new file mode 100644 index 0000000..7d9af96 --- /dev/null +++ b/app/components/instance/InstanceStatusTag.vue @@ -0,0 +1,45 @@ + diff --git a/app/components/instance/InstanceTraffic.vue b/app/components/instance/InstanceTraffic.vue new file mode 100644 index 0000000..0dec672 --- /dev/null +++ b/app/components/instance/InstanceTraffic.vue @@ -0,0 +1,641 @@ + diff --git a/app/components/instance/LegacyDcimActions.vue b/app/components/instance/LegacyDcimActions.vue new file mode 100644 index 0000000..6c20bc9 --- /dev/null +++ b/app/components/instance/LegacyDcimActions.vue @@ -0,0 +1,870 @@ + diff --git a/app/components/instance/LegacyDcimManage.vue b/app/components/instance/LegacyDcimManage.vue new file mode 100644 index 0000000..85eecd1 --- /dev/null +++ b/app/components/instance/LegacyDcimManage.vue @@ -0,0 +1,2112 @@ + diff --git a/app/components/instance/LegacyProductUpgrade.vue b/app/components/instance/LegacyProductUpgrade.vue new file mode 100644 index 0000000..eec1b60 --- /dev/null +++ b/app/components/instance/LegacyProductUpgrade.vue @@ -0,0 +1,340 @@ + diff --git a/app/components/instance/RemfUpgrade.vue b/app/components/instance/RemfUpgrade.vue new file mode 100644 index 0000000..9361fc0 --- /dev/null +++ b/app/components/instance/RemfUpgrade.vue @@ -0,0 +1,641 @@ + diff --git a/app/components/instance/RemoteConsole.vue b/app/components/instance/RemoteConsole.vue new file mode 100644 index 0000000..f79e07e --- /dev/null +++ b/app/components/instance/RemoteConsole.vue @@ -0,0 +1,923 @@ + diff --git a/app/components/kkyecs/KkyUpgrade.vue b/app/components/kkyecs/KkyUpgrade.vue new file mode 100644 index 0000000..344f472 --- /dev/null +++ b/app/components/kkyecs/KkyUpgrade.vue @@ -0,0 +1,1435 @@ + diff --git a/app/components/mfcloud/MfCloudDefence.vue b/app/components/mfcloud/MfCloudDefence.vue new file mode 100644 index 0000000..57d54a3 --- /dev/null +++ b/app/components/mfcloud/MfCloudDefence.vue @@ -0,0 +1,511 @@ + diff --git a/app/components/mfcloud/MfCloudIps.vue b/app/components/mfcloud/MfCloudIps.vue new file mode 100644 index 0000000..a2debfa --- /dev/null +++ b/app/components/mfcloud/MfCloudIps.vue @@ -0,0 +1,726 @@ + diff --git a/app/components/mfcloud/MfCloudLogs.vue b/app/components/mfcloud/MfCloudLogs.vue new file mode 100644 index 0000000..7e71194 --- /dev/null +++ b/app/components/mfcloud/MfCloudLogs.vue @@ -0,0 +1,406 @@ + diff --git a/app/components/mfcloud/MfCloudNat.vue b/app/components/mfcloud/MfCloudNat.vue new file mode 100644 index 0000000..d01cc00 --- /dev/null +++ b/app/components/mfcloud/MfCloudNat.vue @@ -0,0 +1,744 @@ + diff --git a/app/components/mfcloud/MfCloudResourceUpgrade.vue b/app/components/mfcloud/MfCloudResourceUpgrade.vue new file mode 100644 index 0000000..8927885 --- /dev/null +++ b/app/components/mfcloud/MfCloudResourceUpgrade.vue @@ -0,0 +1,572 @@ + diff --git a/app/components/mfcloud/MfCloudUpgrade.vue b/app/components/mfcloud/MfCloudUpgrade.vue new file mode 100644 index 0000000..360ed3f --- /dev/null +++ b/app/components/mfcloud/MfCloudUpgrade.vue @@ -0,0 +1,493 @@ + diff --git a/app/components/mfcloud/MfCloudVpc.vue b/app/components/mfcloud/MfCloudVpc.vue new file mode 100644 index 0000000..3ec17f0 --- /dev/null +++ b/app/components/mfcloud/MfCloudVpc.vue @@ -0,0 +1,864 @@ + diff --git a/app/config/locale.zh-CN.json b/app/config/locale.zh-CN.json new file mode 100644 index 0000000..2cc9041 --- /dev/null +++ b/app/config/locale.zh-CN.json @@ -0,0 +1,80 @@ +{ + "fileSizeTypes": ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"], + "dayNames": [ + "星期日", + "星期一", + "星期二", + "星期三", + "星期四", + "星期五", + "星期六" + ], + "dayNamesShort": ["周日", "周一", "周二", "周三", "周四", "周五", "周六"], + "dayNamesMin": ["日", "一", "二", "三", "四", "五", "六"], + "monthNames": [ + "一月", + "二月", + "三月", + "四月", + "五月", + "六月", + "七月", + "八月", + "九月", + "十月", + "十一月", + "十二月" + ], + "monthNamesShort": [ + "1月", + "2月", + "3月", + "4月", + "5月", + "6月", + "7月", + "8月", + "9月", + "10月", + "11月", + "12月" + ], + "firstDayOfWeek": 1, + "dateFormat": "yy-mm-dd", + "today": "今天", + "clear": "清除", + "chooseDate": "选择日期", + "chooseMonth": "选择月份", + "chooseYear": "选择年份", + "prevMonth": "上个月", + "nextMonth": "下个月", + "prevYear": "上一年", + "nextYear": "下一年", + "accept": "确认", + "reject": "取消", + "choose": "选择", + "upload": "上传", + "cancel": "取消", + "emptyMessage": "暂无数据", + "emptyFilterMessage": "没有匹配的结果", + "searchMessage": "{0} 个结果可用", + "selectionMessage": "已选择 {0} 项", + "emptySelectionMessage": "未选择任何项目", + "weak": "弱", + "medium": "中", + "strong": "强", + "passwordPrompt": "请输入密码", + "aria": { + "close": "关闭", + "firstPageLabel": "第一页", + "lastPageLabel": "最后一页", + "nextPageLabel": "下一页", + "prevPageLabel": "上一页", + "pageLabel": "第 {page} 页", + "rowsPerPageLabel": "每页条数", + "selectAll": "选择全部", + "unselectAll": "取消全选", + "selectRow": "选择此行", + "unselectRow": "取消选择此行" + } +} diff --git a/app/config/primevue.js b/app/config/primevue.js new file mode 100644 index 0000000..b6daa49 --- /dev/null +++ b/app/config/primevue.js @@ -0,0 +1,37 @@ +import { definePreset } from "@primeuix/themes"; +import Aura from "@primeuix/themes/aura"; +import locale from "./locale.zh-CN.json"; + +// Use the MIT theme package, with the console's blue/slate/zinc palette. +const preset = definePreset(Aura, { + semantic: { + primary: Object.fromEntries( + [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950].map((shade) => [ + shade, + `{blue.${shade}}`, + ]), + ), + colorScheme: { + light: { + surface: Object.fromEntries( + [0, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950].map( + (shade) => [shade, shade === 0 ? "#ffffff" : `{slate.${shade}}`], + ), + ), + }, + dark: { + surface: Object.fromEntries( + [0, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950].map( + (shade) => [shade, shade === 0 ? "#ffffff" : `{zinc.${shade}}`], + ), + ), + }, + }, + }, +}); + +export default { + ripple: true, + locale, + theme: { preset, options: { darkModeSelector: ".app-dark" } }, +}; diff --git a/app/layouts/blank.vue b/app/layouts/blank.vue new file mode 100644 index 0000000..1c6db76 --- /dev/null +++ b/app/layouts/blank.vue @@ -0,0 +1,50 @@ + + + diff --git a/app/layouts/default.vue b/app/layouts/default.vue new file mode 100644 index 0000000..aa533d9 --- /dev/null +++ b/app/layouts/default.vue @@ -0,0 +1,1318 @@ + diff --git a/app/layouts/official-site.vue b/app/layouts/official-site.vue new file mode 100644 index 0000000..3cb1057 --- /dev/null +++ b/app/layouts/official-site.vue @@ -0,0 +1,587 @@ + diff --git a/app/layouts/public-order.vue b/app/layouts/public-order.vue new file mode 100644 index 0000000..0d14407 --- /dev/null +++ b/app/layouts/public-order.vue @@ -0,0 +1,224 @@ + diff --git a/app/lib/_plugin-vue_export-helper.js b/app/lib/_plugin-vue_export-helper.js new file mode 100644 index 0000000..f7c3750 --- /dev/null +++ b/app/lib/_plugin-vue_export-helper.js @@ -0,0 +1,6 @@ +var e = (e, t) => { + let n = e.__vccOpts || e; + for (let [e, r] of t) n[e] = r; + return n; +}; +export { e as t }; diff --git a/app/lib/auth-redirect.js b/app/lib/auth-redirect.js new file mode 100644 index 0000000..50d0b41 --- /dev/null +++ b/app/lib/auth-redirect.js @@ -0,0 +1,29 @@ +function e(e) { + if ( + typeof e != `string` || + !e.startsWith(`/`) || + e.startsWith(`//`) || + /[\\\u0000-\u0020\u007f]/.test(e) + ) + return `/`; + try { + let t = decodeURIComponent(e.split(/[?#]/, 1)[0] || ``); + if (t.startsWith(`//`) || /[\\\u0000-\u0020\u007f]/.test(t)) return `/`; + } catch { + return `/`; + } + return e; +} +function t(t) { + let n = e(t); + return n === `/` + ? {} + : { + redirect: n, + }; +} +function n(t, n) { + let r = e(n); + return r === `/` ? t : `${t}?redirect=${encodeURIComponent(r)}`; +} +export { t as n, e as r, n as t }; diff --git a/app/lib/auth.js b/app/lib/auth.js new file mode 100644 index 0000000..a7aab16 --- /dev/null +++ b/app/lib/auth.js @@ -0,0 +1,856 @@ +import CryptoJS from "crypto-js"; +import { defineStore } from "pinia"; +import { navigateTo, useRuntimeConfig } from "#app"; +import { computed, ref } from "vue"; +var ce = [ + [/产品类型错误.{0,30}安全组[^\n]*/g, `该商品未接入安全组`], + [/商品未关联.{0,20}模块接口/g, `该商品暂不可用`], + [/未关联.{0,12}模块接口/g, `该商品暂不可用`], + [/尚未接入.{0,12}模块/g, `该商品暂不可用`], +]; +var le = [ + [/快快云-弹性云|弹性云/g, ``], + [/快快云|快快/g, ``], + [/魔方云|魔方财务|智简魔方|智简/g, ``], + [/美得云|美德云|meidecloud/gi, ``], + [/dwvps[a-z0-9_]*/gi, ``], + [/miloce[a-z0-9_]*/gi, ``], + [/jinghanyun[a-z0-9_]*/gi, ``], + [/kkidc[a-z0-9_]*/gi, ``], + [/kky[a-z0-9_]*/gi, ``], + [/idcsmart[a-z0-9_]*/gi, ``], + [/mf[_-]?cloud[a-z0-9_]*/gi, ``], + [/mf[_-]?dcim[a-z0-9_]*/gi, ``], + [/common[_-]?cloud[a-z0-9_]*/gi, ``], + [/pve[_-]?cloud[a-z0-9_]*/gi, ``], +]; +var ue = + /模块接口|自定义配置|模块未关联|模块标识|上游|第三方云|[a-z]{2,}[_-][a-z0-9_]+|\bDCIM\b|whmcs|reserver|https?:\/\//i; +function W(e) { + let t = typeof e == `string` ? e : ``; + if (!t) return ``; + let n = t; + for (let [e, t] of ce) n = n.replace(e, t); + for (let [e, t] of le) n = n.replace(e, t); + return ( + (n = n + .replace(/\s{2,}/g, ` `) + .replace(/[,,、]{2,}/g, `,`) + .replace(/^[\s,,、::;;-]+|[\s,,、::;;-]+$/g, ``) + .trim()), + n.length < 2 || ue.test(n) ? `操作失败,请稍后重试或联系客服` : n + ); +} +function de(e) { + let t = typeof e == `string` ? e : ``; + return /^\s*上游熔断解除[::]/u.test(t) + ? `服务连接已恢复正常` + : /^\s*上游熔断[::]/u.test(t) + ? `服务连接暂时异常,请稍后重试` + : t; +} +var fe = 32; +var pe = 200; +var me = 6e4; +var G = new Map(); +var he = Symbol(`uninitialized`); +var ge = 0; +function _e() { + (ge++, G.clear()); +} +function ve() { + return ge; +} +function ye(e, t, n = ``) { + return JSON.stringify([e, n, t], (e, t) => + t && typeof t == `object` && !Array.isArray(t) + ? Object.fromEntries( + Object.keys(t) + .sort() + .map((e) => [e, t[e]]), + ) + : t, + ); +} +function be(e) { + return JSON.parse(JSON.stringify(e)); +} +function xe(e, t, n = Date.now()) { + he !== e && (_e(), (he = e)); + for (let [e, t] of G) t.expires <= n && G.delete(e); + let r = G.get(t); + if (r) return (G.delete(t), G.set(t, r), be(r.data)); +} +function Se(e, t, n, r, i = Date.now()) { + if (e === he && r === ge) { + if (!Array.isArray(n.list) || n.list.length > pe) { + G.delete(t); + return; + } + try { + let e = be(n); + (G.delete(t), + G.size >= fe && G.delete(G.keys().next().value), + G.set(t, { + data: e, + expires: i + me, + })); + } catch { + G.delete(t); + } + } +} +var Ce = 2147483647; +function K(e, t) { + let n = + typeof e == `number` + ? e + : typeof e == `string` && /^\d+$/.test(e) + ? Number(e) + : NaN; + if (!Number.isSafeInteger(n) || n < t || n > Ce) + throw Error(`购买信息无效,请重新确认后重试`); + return n; +} +function we(e) { + if (!e || typeof e != `object` || Array.isArray(e)) + throw Error(`购买信息无效,请重新确认后重试`); + return e; +} +function Te(e) { + let t = we(e); + return { + product_id: K(t.product_id, 1), + qty: K(t.qty, 1), + }; +} +function Ee(e, t, n) { + if (e === `POST` && t === `/product/settle`) + return { + mode: `single`, + ...Te(n), + }; + if (e === `POST` && t === `/cart`) { + let e = we(n); + if (e.products !== void 0) { + if ( + !Array.isArray(e.products) || + !e.products.length || + e.products.length > 1e3 + ) + throw Error(`购买信息无效,请重新确认后重试`); + return { + mode: `cart_add`, + products: e.products.map(Te), + }; + } + return { + mode: `cart_add`, + ...Te(e), + }; + } + if (e === `POST` && t === `/cart/settle`) { + let e = we(n); + if (!Array.isArray(e.positions) || !e.positions.length) + throw Error(`请选择要结算的商品`); + return { + mode: `cart_settle`, + positions: [...new Set(e.positions.map((e) => K(e, 0)))], + }; + } + let r = e === `PUT` ? /^\/cart\/(\d+)(\/qty)?$/.exec(t) : null; + if (r) { + let e = we(n); + return { + mode: `cart_update`, + position: K(r[1], 0), + qty: K(e.qty, 1), + ...(r[2] + ? {} + : { + product_id: K(e.product_id, 1), + }), + }; + } + return null; +} +function De(e) { + if (!e || typeof e != `object` || Array.isArray(e)) return !1; + let t = e; + return ( + typeof t.allowed == `boolean` && + typeof t.message == `string` && + (t.allowed || !!t.message.trim()) + ); +} +class ApiError extends Error { + status; + data; + constructor(status, message, data) { + super(message); + this.status = status; + this.data = data; + this.name = "ApiError"; + } +} + +const DEFAULT_REQUEST_TIMEOUT_MS = 30_000; +const FILE_TRANSFER_TIMEOUT_MS = 120_000; + +function requestTimeoutError() { + return new ApiError(408, "请求超时,请稍后重试"); +} + +async function withRequestDeadline( + operation, + timeoutMs = DEFAULT_REQUEST_TIMEOUT_MS, + controller = new AbortController(), +) { + const duration = + Number.isFinite(timeoutMs) && timeoutMs > 0 && timeoutMs <= 2_147_483_647 + ? timeoutMs + : DEFAULT_REQUEST_TIMEOUT_MS; + let timer; + const deadline = new Promise((_, reject) => { + timer = setTimeout(() => { + controller.abort(); + reject(requestTimeoutError()); + }, duration); + }); + try { + // The deadline also covers response-body decoding and any purchase preflight. + return await Promise.race([ + Promise.resolve().then(() => operation(controller.signal)), + deadline, + ]); + } finally { + clearTimeout(timer); + } +} + +function assertRequestActive(signal) { + if (signal.aborted) throw requestTimeoutError(); +} + +function normalizeRequestError(error) { + return error instanceof ApiError + ? error + : new ApiError(0, "网络异常,请检查网络后重试"); +} + +function useApi() { + const config = useRuntimeConfig(); + const auth = useAuth(); + + function clearUnauthorizedSession(requestToken) { + if ( + !requestToken || + localStorage.getItem("jwt") !== requestToken || + auth.token !== requestToken + ) + return; + + auth.clear(); + if (window.location.pathname === "/login") return; + const redirect = window.location.pathname + window.location.search; + try { + void Promise.resolve( + navigateTo({ + path: "/login", + query: redirect === "/" ? undefined : { redirect }, + }), + ).catch(() => {}); + } catch {} + } + + function responseObject(value) { + return value && typeof value === "object" && !Array.isArray(value) + ? value + : {}; + } + + function responseError(response, payload, requestToken, fallbackMessage) { + const envelope = responseObject(payload); + const status = + response.status === 401 + ? 401 + : typeof envelope.status === "number" && envelope.status !== 200 + ? envelope.status + : response.status; + if (status === 401) clearUnauthorizedSession(requestToken); + return new ApiError( + status, + W(envelope.msg || envelope.message) || fallbackMessage, + envelope.data, + ); + } + + async function decodeResponse( + response, + requestToken, + fallbackMessage, + signal, + allowStatuslessDataArray = false, + ) { + const payload = await response.json().catch(() => null); + assertRequestActive(signal); + const envelope = responseObject(payload); + if (response.ok && envelope.status === 200) return payload; + if ( + response.ok && + allowStatuslessDataArray && + !("status" in envelope) && + Array.isArray(envelope.data) + ) { + return { status: 200, msg: "", data: envelope.data }; + } + throw responseError(response, payload, requestToken, fallbackMessage); + } + + function apiUrl(path, query, keepEmpty = false) { + let url = `${String(config.public.apiBase ?? "")}/console/v1${path}`; + const search = new URLSearchParams(); + for (const [key, value] of Object.entries(query ?? {})) { + if (value == null || (value === "" && !keepEmpty)) continue; + if (Array.isArray(value)) { + for (const item of value) { + if (item != null && item !== "") + search.append(`${key}[]`, String(item)); + } + } else { + search.append(key, String(value)); + } + } + if (search.size) url += `?${search}`; + return url; + } + + async function request(method, path, options = {}) { + // Capture identity before the first await, including when logout clears it immediately. + const requestToken = auth.token; + const headers = { Accept: "application/json" }; + if (requestToken) headers.Authorization = `Bearer ${requestToken}`; + if (options.body !== undefined) + headers["Content-Type"] = "application/json"; + try { + const serializedBody = + options.body === undefined ? undefined : JSON.stringify(options.body); + return await withRequestDeadline(async (signal) => { + if (requestToken) { + let purchase; + try { + purchase = Ee(method, path, options.body); + } catch (error) { + throw new ApiError( + 422, + error instanceof Error + ? error.message + : "购买信息无效,请重新确认后重试", + ); + } + if (purchase) { + const authToken = auth.token; + const permission = await request("POST", "/purchase_limit/check", { + body: purchase, + timeoutMs: options.timeoutMs ?? 15_000, + }); + assertRequestActive(signal); + if ( + localStorage.getItem("jwt") !== requestToken || + auth.token !== authToken + ) { + throw new ApiError(409, "登录状态已变化,请重新确认后重试"); + } + if (JSON.stringify(options.body) !== serializedBody) { + throw new ApiError(409, "购买信息已变化,请重新确认后重试"); + } + if (!De(permission)) + throw new ApiError(502, "限购验证暂不可用,请稍后重试"); + if (!permission.allowed) + throw new ApiError(422, permission.message); + } + } + assertRequestActive(signal); + const response = await fetch( + apiUrl(path, options.query, options.keepEmpty), + { + method, + headers, + body: serializedBody, + signal, + }, + ); + assertRequestActive(signal); + const envelope = await decodeResponse( + response, + requestToken, + response.ok + ? "响应格式异常,请稍后重试" + : `请求失败(HTTP ${response.status})`, + signal, + options.allowStatuslessDataArray, + ); + assertRequestActive(signal); + if ( + method !== "GET" && + path !== "/purchase_limit/check" && + !/^\/product\/\d+\/config_option$/.test(path) + ) { + _e(); + } + return options.raw ? envelope : envelope.data; + }, options.timeoutMs); + } catch (error) { + throw normalizeRequestError(error); + } + } + + async function upload(file) { + const body = new FormData(); + body.append("file", file); + const headers = { Accept: "application/json" }; + const requestToken = auth.token; + if (requestToken) headers.Authorization = `Bearer ${requestToken}`; + try { + return await withRequestDeadline(async (signal) => { + const response = await fetch(apiUrl("/upload"), { + method: "POST", + headers, + body, + signal, + }); + assertRequestActive(signal); + const envelope = await decodeResponse( + response, + requestToken, + "上传失败", + signal, + ); + assertRequestActive(signal); + return envelope.data; + }, FILE_TRANSFER_TIMEOUT_MS); + } catch (error) { + throw normalizeRequestError(error); + } + } + + async function download(path, data, filename = "export.xlsx", options = {}) { + const method = options.method ?? "GET"; + const headers = { Accept: "*/*" }; + const requestToken = auth.token; + if (requestToken) headers.Authorization = `Bearer ${requestToken}`; + if (method === "POST") headers["Content-Type"] = "application/json"; + try { + await withRequestDeadline(async (signal) => { + const response = await fetch( + apiUrl(path, method === "GET" ? data : undefined), + { + method, + headers, + ...(method === "POST" ? { body: JSON.stringify(data ?? {}) } : {}), + signal, + }, + ); + assertRequestActive(signal); + const isJson = /\bapplication\/(?:[\w.-]+\+)?json\b/i.test( + response.headers.get("content-type") || "", + ); + if (!response.ok || isJson) { + const payload = await response + .clone() + .json() + .catch(() => null); + assertRequestActive(signal); + const envelope = responseObject(payload); + if ( + !response.ok || + (typeof envelope.status === "number" && envelope.status !== 200) + ) { + throw responseError( + response, + payload, + requestToken, + `下载失败(HTTP ${response.status})`, + ); + } + } + const disposition = response.headers.get("content-disposition") || ""; + const match = /filename\*?=(?:UTF-8'')?"?([^";]+)"?/i.exec(disposition); + if (match?.[1]) { + try { + filename = decodeURIComponent(match[1]); + } catch { + filename = match[1]; + } + } + const blob = await response.blob(); + assertRequestActive(signal); + const objectUrl = URL.createObjectURL(blob); + const link = document.createElement("a"); + try { + link.href = objectUrl; + link.download = filename; + document.body.appendChild(link); + link.click(); + } finally { + link.remove(); + URL.revokeObjectURL(objectUrl); + } + }, options.timeoutMs ?? FILE_TRANSFER_TIMEOUT_MS); + } catch (error) { + throw normalizeRequestError(error); + } + } + + return { + identity: () => auth.token, + request, + upload, + download, + get: (path, query, keepEmpty = false, options = {}) => + request("GET", path, { + ...options, + query, + keepEmpty, + }), + getRaw: (path, query, options = {}) => + request("GET", path, { + ...options, + query, + raw: true, + }), + post: (path, body, raw = false, options = {}) => + request("POST", path, { + ...options, + body, + raw, + }), + put: (path, body, query) => request("PUT", path, { body, query }), + del: (path, query, body) => request("DELETE", path, { query, body }), + }; +} +var ot = CryptoJS.enc.Utf8.parse(`idcsmart.finance`); +var st = CryptoJS.enc.Utf8.parse(`9311019310287172`); +function ct(e) { + return CryptoJS.AES.encrypt(e, ot, { + mode: CryptoJS.mode.CBC, + padding: CryptoJS.pad.Pkcs7, + iv: st, + }).toString(); +} +function lt(e, t = `登录失败,请稍后重试`) { + let n = e && typeof e == `object` ? e : {}, + r = typeof n.message == `string` ? n.message.trim() : ``, + i = n.data && typeof n.data == `object` ? n.data : {}; + return i.need_security_verify || i.ip_exception_verify + ? `本次登录需要额外的安全验证,请联系客服协助完成验证。` + : n.status === 429 + ? `登录尝试过于频繁,请稍后再试` + : n.status === 408 || /超时|timeout/i.test(r) + ? `登录请求超时,请检查网络后重试` + : n.status === 0 || + /网络异常|Failed to fetch|NetworkError|Load failed/i.test(r) + ? `网络连接失败,请检查网络后重试` + : (n.status ?? 0) >= 500 || + /页面错误|响应格式异常|Internal Server Error|Bad Gateway|Service Unavailable/i.test( + r, + ) + ? `登录服务暂时异常,请稍后重试;若持续失败,请联系客服。` + : !r || + /<[^>]+>|SQLSTATE|\b(?:TypeError|ReferenceError|Exception)\b/.test( + r, + ) + ? t + : r; +} +function ut(e) { + return ( + typeof e == `string` && e.length > 0 && e.length <= 8192 && !/\s/.test(e) + ); +} +function dt(e) { + if (!e || typeof e != `object`) return null; + let t = e, + n = [t, t.data, t.error, t.response]; + for (let e of n) { + if (!e || typeof e != `object`) continue; + let t = e, + n = t.data && typeof t.data == `object` ? t.data : t; + if ( + n.need_security_verify === !0 || + n.need_security_verify === 1 || + n.need_security_verify === `1` || + (Array.isArray(n.available_methods) && n.available_methods.length > 0) + ) + return n; + } + return null; +} +function ft(e) { + let t = dt(e); + if (t) + throw Object.assign(Error(`安全验证尚未完成,请重试`), { + data: t, + }); +} +var pt = { + operate_password: `操作密码`, + email_code: `邮箱验证码`, + phone_code: `手机验证码`, + certification: `实名认证`, +}; +function mt(e) { + return ( + Array.isArray(e.available_methods) ? e.available_methods : [] + ).flatMap((t) => { + let n = + typeof t == `string` + ? { + value: t, + } + : t && typeof t == `object` + ? t + : {}, + r = String(n.value ?? ``); + return pt[r] + ? [ + { + value: r, + label: pt[r], + tip: String(n.tip ?? ``), + account: String(n.account ?? ``), + phone_code: String(n.phone_code ?? ``), + security_verify_token: String( + n.security_verify_token ?? e.security_verify_token ?? ``, + ), + }, + ] + : []; + }); +} +const useAuth = defineStore("auth", () => { + const token = ref(localStorage.getItem("jwt")); + const overview = ref(null); + const loading = ref(false); + const legacyLoginPending = ref(false); + const isLoggedIn = computed(() => !!token.value); + let overviewPromise = null; + let sessionVersion = 0; + let legacySession = null; + + function loginWithJwt(jwt) { + if (!ut(jwt)) + throw Error("登录响应无效,请重新登录;若持续失败,请联系客服。"); + resetSessionState(); + token.value = jwt; + localStorage.setItem("jwt", jwt); + } + + function prepareLegacyLogin(jwt = localStorage.getItem("jwt")) { + clear(); + legacySession = { + jwt: ut(jwt) ? jwt : null, + version: sessionVersion, + controller: null, + promise: null, + }; + legacyLoginPending.value = true; + } + + function cancelLegacyLogin() { + legacySession?.controller?.abort(); + legacySession = null; + legacyLoginPending.value = false; + } + + function verifyLegacyLogin() { + const session = legacySession; + if (!session?.jwt) { + return Promise.reject( + Error("缺少有效登录凭证,请返回原平台重新进入,或使用账号登录。"), + ); + } + if (session.promise) return session.promise; + const apiBase = String(useRuntimeConfig().public.apiBase ?? ""); + const controller = new AbortController(); + session.controller = controller; + const isCurrentSession = () => + legacySession === session && sessionVersion === session.version; + const promise = withRequestDeadline( + async (signal) => { + let response; + try { + response = await fetch(`${apiBase}/console/v1/index`, { + headers: { + Accept: "application/json", + Authorization: `Bearer ${session.jwt}`, + }, + credentials: "omit", + cache: "no-store", + referrerPolicy: "no-referrer", + signal, + }); + } catch { + throw Error("网络连接失败或验证超时,请检查网络后重试。"); + } + const envelope = await response.json().catch(() => null); + assertRequestActive(signal); + if (!isCurrentSession()) throw Error("登录状态已变化,请重新进入。"); + if (response.status === 401 || envelope?.status === 401) { + throw Error("登录凭证已失效,请返回原平台重新进入,或使用账号登录。"); + } + const account = envelope?.data?.account; + if ( + !response.ok || + envelope?.status !== 200 || + !account || + typeof account !== "object" || + !Number.isSafeInteger(account.id) || + account.id <= 0 + ) + throw Error("暂时无法验证登录身份,请稍后重试。"); + loginWithJwt(session.jwt); + overview.value = account; + }, + 15_000, + controller, + ) + .catch((error) => { + if (error instanceof ApiError && error.status === 408) { + throw Error("网络连接失败或验证超时,请检查网络后重试。"); + } + throw error; + }) + .finally(() => { + if (isCurrentSession()) { + session.controller = null; + session.promise = null; + } + }); + session.promise = promise; + return promise; + } + + async function login( + account, + password, + captcha = "", + captchaToken = "", + type = "password", + code = "", + phoneCode = "86", + verification, + ) { + if (type === "code" && account.includes("@")) + throw Error("验证码登录仅支持手机号"); + const api = useApi(); + const version = sessionVersion; + loading.value = true; + try { + const result = await api.post( + "/login", + { + type, + account, + ...(account.includes("@") ? {} : { phone_code: phoneCode }), + code, + password: type === "password" ? ct(password) : "", + remember_password: "0", + captcha, + token: captchaToken, + ...(verification || {}), + }, + false, + { timeoutMs: 15_000 }, + ); + if (version !== sessionVersion) throw Error("登录状态已变化,请重试"); + ft(result); + if (!ut(result?.jwt)) + throw Error("登录响应无效,请重新登录;若持续失败,请联系客服。"); + loginWithJwt(result.jwt); + } finally { + loading.value = false; + } + } + + function loadOverview() { + if (!overviewPromise) { + const version = sessionVersion; + const promise = useApi() + .get("/index", undefined, false, { timeoutMs: 10_000 }) + .then((result) => { + if (version !== sessionVersion) throw Error("登录状态已变化,请重试"); + overview.value = result.account; + return result.account; + }) + .finally(() => { + if (overviewPromise === promise) overviewPromise = null; + }); + overviewPromise = promise; + } + return overviewPromise; + } + + async function fetchOverview() { + return overview.value ?? loadOverview(); + } + + async function refreshOverview() { + return loadOverview(); + } + + function logout() { + // request() captures the original Bearer synchronously; remote revocation never owns local logout. + const revocation = useApi().post("/logout"); + clear(); + void revocation.catch(() => {}); + } + + function resetSessionState() { + _e(); + cancelLegacyLogin(); + sessionVersion += 1; + overview.value = null; + overviewPromise = null; + } + + function clear() { + resetSessionState(); + token.value = null; + localStorage.removeItem("jwt"); + } + + return { + token, + overview, + loading, + isLoggedIn, + login, + loginWithJwt, + fetchOverview, + refreshOverview, + logout, + clear, + legacyLoginPending, + prepareLegacyLogin, + verifyLegacyLogin, + cancelLegacyLogin, + }; +}); +export { + lt as loginErrorMessage, + ApiError, + ye as apiCacheKey, + ve as apiCacheVersion, + W as sanitizeMessage, + de as operationMessage, + mt as securityMethods, + useApi, + Se as writeApiCache, + ft as assertSecurityComplete, + ut as isValidJwt, + xe as readApiCache, + dt as securityChallenge, + useAuth, + _e as clearApiCache, +}; diff --git a/app/lib/backend-menu.js b/app/lib/backend-menu.js new file mode 100644 index 0000000..b2fa4a8 --- /dev/null +++ b/app/lib/backend-menu.js @@ -0,0 +1,380 @@ +function e(e) { + let t = (e) => + e.some( + (e) => + e.to === `/finance` || + e.to === `/finance?tab=bills` || + (e.children && t(e.children)), + ), + n = t(e); + function r(e) { + return e.flatMap((e) => { + if (e.children) { + let t = r(e.children); + return t.length + ? [ + { + ...e, + children: t, + }, + ] + : []; + } + return e.to?.split(`?`)[0] === `/bills` + ? n + ? [] + : ((n = !0), + [ + { + ...e, + label: `财务`, + to: `/finance`, + }, + ]) + : [e]; + }); + } + return r(e); +} +function t(e, t, n = []) { + let r = + t.path === `/products/cvm` + ? `/products/cloud-server` + : t.path === `/bills` || t.path.startsWith(`/bills/`) + ? t.path.replace(`/bills`, `/finance`) + : t.path; + function i(e) { + let [n = ``, i = ``] = e.split(`?`); + if (r !== n && !r.startsWith(`${n}/`)) return -1; + let a = [...new URLSearchParams(i)]; + return a.every(([e, n]) => String(t.query[e] ?? ``) === n) + ? n.length * 100 + a.length + : -1; + } + let a = i(e); + return a >= 0 && !n.some((e) => i(e.to) > a); +} +var n = new Set( + `/./products./products/cloud-server./products/dedicated-server./cart./cloud-servers./dedicated-servers./security/groups./security/ssh-keys./security/domains./transfer./finance./orders./bills./invoices./invoices/settings./invoices/request./recommend./vouchers./account./account/api-keys./account/connections./account/realname./messages./logbook./tickets./tickets/create./help./notices./news./resources`.split( + `.`, + ), + ), + r = { + "index.htm": `/`, + "home.htm": `/`, + "cart/goodsList.htm": `/products`, + "cart/cart.htm": `/cart`, + "finance.htm": `/finance`, + "order.htm": `/orders`, + "account.htm": `/account`, + "security.htm": `/account/api-keys`, + "ticket.htm": `/tickets`, + "help.htm": `/help`, + "news.htm": `/news`, + "announcement.htm": `/notices`, + "api.htm": `/account/api-keys`, + "log.htm": `/logbook`, + "invoice.htm": `/invoices`, + "recommend.htm": `/recommend`, + "voucher.htm": `/vouchers`, + "host_transfer.htm": `/transfer`, + "security_group.htm": `/security/groups`, + "ssh_key.htm": `/security/ssh-keys`, + "message.htm": `/messages`, + "msgDetail.htm": `/messages`, + "group_rules.htm": `/security/groups`, + "withdrawal.htm": `/finance?tab=withdraw`, + "orderDetail.htm": `/orders/order`, + "addTicket.htm": `/tickets/create`, + "ticketDetails.htm": `/tickets/ticket`, + "issuedInvoice.htm": `/invoices/request`, + "security_ssh.htm": `/security/ssh-keys`, + "security_log.htm": `/logbook?type=api`, + }, + i = { + 45: `/transfer`, + }, + a = new Set( + Object.values(r).filter( + (e) => ![`/`, `/security/groups`, `/vouchers`, `/logbook`].includes(e), + ), + ); +function o(e) { + let t = e.to?.split(`?`)[0]; + return ( + (t && + { + "/": `lucide:house`, + "/products": `lucide:shopping-cart`, + "/cart": `lucide:shopping-basket`, + "/cloud-servers": `lucide:server`, + "/dedicated-servers": `lucide:server`, + "/bills": `lucide:receipt-text`, + "/finance": `lucide:wallet`, + "/orders": `lucide:clipboard-list`, + "/invoices": `lucide:receipt`, + "/recommend": `lucide:gift`, + "/vouchers": `lucide:ticket`, + "/account": `lucide:user`, + "/account/api-keys": `lucide:key-round`, + "/account/connections": `lucide:link`, + "/messages": `lucide:mail`, + "/logbook": `lucide:scroll-text`, + "/tickets": `lucide:headphones`, + "/help": `lucide:circle-help`, + "/resources": `lucide:book-open`, + "/notices": `lucide:megaphone`, + "/news": `lucide:newspaper`, + "/transfer": `lucide:truck`, + }[t]) || + (e.href + ? `lucide:external-link` + : e.children?.length + ? `lucide:folder` + : `lucide:circle-help`) + ); +} +function s(e, t) { + if (![`/cloud-servers`, `/dedicated-servers`].includes(t.path)) return; + let n = new Set(), + r; + function i(e) { + for (let a of e) { + a.children && i(a.children); + let [e, o = ``] = a.to?.split(`?`) ?? [], + s = new URLSearchParams(o).get(`m`); + (s && + s === String(t.query.m ?? ``) && + e && + [`/cloud-servers`, `/dedicated-servers`].includes(e) && + e !== t.path && + (r = { + path: e, + query: { + ...t.query, + m: s, + }, + }), + e === t.path && s && /^[1-9]\d*$/.test(s) && n.add(s)); + } + } + if ((i(e), r)) return r; + if (!(n.size !== 1 || n.has(String(t.query.m ?? ``)))) + return { + path: t.path, + query: { + ...t.query, + m: [...n][0], + }, + }; +} +function c(e, t, n) { + let r = e.map((e) => ({ + ...e, + items: [...(t.find((t) => t.label === e.label)?.items ?? [])], + })), + i = (e) => e.children?.flatMap(i) ?? (e.to ? [e.to.split(`?`)[0]] : []); + for (let t of n) { + let n = i(t), + a = e.findIndex((e) => + e.items.some((e) => + [e.to, ...(e.children?.map((e) => e.to) ?? [])].some( + (e) => e && n.includes(e), + ), + ), + ); + (a < 0 && + n.some((e) => e.startsWith(`/account/`)) && + (a = e.findIndex((e) => e.items.some((e) => e.to === `/account`))), + a < 0 && + n.includes(`/resources`) && + (a = e.findIndex((e) => e.items.some((e) => e.to === `/help`))), + a < 0 && (a = r.length - 1), + !(a < 0) && + r[a].items.push({ + label: t.label, + icon: o(t), + backend: t, + })); + } + return r.filter((e) => e.items.length); +} +function l(e, n) { + let r = []; + function i(e, a) { + let o = e + .filter((e) => e.to) + .map((e) => ({ + to: e.to, + })); + for (let s of e) { + let e = [...a, s.label]; + if (s.to && t(s.to, n, o)) { + let [t = ``, n = ``] = s.to.split(`?`); + r.push({ + labels: e, + path: t, + score: t.length * 100 + [...new URLSearchParams(n)].length, + }); + } + s.children && i(s.children, e); + } + } + return (i(e, []), r.sort((e, t) => t.score - e.score)[0]?.labels ?? []); +} +function u(e, t) { + let n = new Set(), + r = (e) => + e.forEach((e) => { + (e.to && n.add(e.to.split(`?`)[0]), e.children && r(e.children)); + }); + r(t); + let i = (e) => !a.has(e) && !n.has(e); + return e + .map((e) => ({ + ...e, + items: e.items.flatMap((e) => { + if (e.children) { + let t = e.children.filter((e) => i(e.to)); + return t.length + ? [ + { + ...e, + children: t, + }, + ] + : []; + } + return !e.to || i(e.to) ? [e] : []; + }), + })) + .filter((e) => e.items.length); +} +function d(e) { + if ( + typeof e != `string` || + !/^https?:\/\//i.test(e) || + /[\u0000-\u0020\\]/.test(e) + ) + return ``; + try { + let t = new URL(e); + return t.username || t.password ? `` : t.href; + } catch { + return ``; + } +} +function f(e, t = ``, a = 0) { + if (!Array.isArray(e) || a > 2) return []; + let o = e.slice(0, 100).flatMap((e, o) => { + if ( + !e || + typeof e != `object` || + typeof e.name != `string` || + !e.name.trim() + ) + return []; + let s = { + key: `${t}${e.id ?? o}`, + label: e.name.slice(0, 100), + confirm: Number(e.second_reminder) === 1, + }, + c = f(e.child, `${s.key}-`, a + 1); + if (c.length) return ((s.children = c), [s]); + if ([`module`, `res_module`].includes(e.menu_type)) { + let t = { + 云服务器: `/cloud-servers`, + 物理服务器: `/dedicated-servers`, + }[e.name.trim()], + n = Number(e.id); + return ( + t && Number.isSafeInteger(n) && n > 0 + ? (s.to = `${t}?m=${n}`) + : (s.disabledReason = `此菜单暂未适配当前控制台`), + [s] + ); + } + if (e.menu_type === `embedded`) + return ((s.disabledReason = `此菜单暂未适配当前控制台`), [s]); + let l = typeof e.url == `string` ? e.url.trim() : ``, + u = l.split(`?`)[0] || ``, + p = u.replace(/^\//, ``).replace(/^clientarea\//, ``), + m = /^plugin\/([1-9]\d*)\/([a-zA-Z_]+\.htm)$/.exec(p), + h = r[p] || (m ? (m[2] === `index.htm` ? i[m[1]] : r[m[2]]) : void 0), + g = /^plugin\/([1-9]\d*)\/source\.htm$/.exec(p); + if (g) s.to = `/resources?plugin=${g[1]}`; + else if (h || n.has(u)) { + let [e, t = ``] = (h || u).split(`?`), + n = new URLSearchParams(l.split(`?`)[1] ?? ``), + r = new URLSearchParams(t); + for (let t of { + "/bills": [`status`], + "/orders": [`status`], + "/finance": [`tab`, `status`], + "/logbook": [`type`], + "/security/groups": [`id`], + "/orders/order": [`id`], + "/tickets/ticket": [`id`], + "/messages": [`id`], + }[e] ?? []) { + let e = n.getAll(t), + i = e[0] ?? ``, + a = + t === `id` + ? /^[1-9]\d*$/.test(i) + : t === `tab` + ? [ + `bills`, + `transaction`, + `credit`, + `withdraw`, + `freeze`, + ].includes(i) + : t === `status` + ? [ + `all`, + `Unpaid`, + `Paid`, + `Refunded`, + `WaitUpload`, + `WaitReview`, + `ReviewFail`, + ].includes(i) + : [`api`, `system`].includes(i); + !r.has(t) && e.length === 1 && a && r.set(t, i); + } + s.to = e + (r.size ? `?${r}` : ``); + } else + e.menu_type === `custom` && d(l) + ? (s.href = d(l)) + : (s.disabledReason = `此功能暂未开放`); + return [s]; + }), + s = o.filter((e) => e.to === `/account`); + return s.length < 2 + ? o + : o.flatMap((e) => + e.to === `/account` + ? e === s[0] + ? [ + { + ...e, + label: `账户`, + confirm: s.some((e) => e.confirm), + }, + ] + : [] + : [e], + ); +} +export { + c as a, + t as c, + f as i, + e as l, + o as n, + d as o, + s as r, + u as s, + l as t, +}; diff --git a/app/lib/bandwidth-display.js b/app/lib/bandwidth-display.js new file mode 100644 index 0000000..091eb10 --- /dev/null +++ b/app/lib/bandwidth-display.js @@ -0,0 +1,7 @@ +function e(e) { + return e.replace( + /(? t(e(n))); +} +function r(e) { + return Array.isArray(e) + ? e.map(r) + : e && typeof e == `object` + ? Object.fromEntries( + Object.entries(e) + .filter(([, e]) => e !== void 0) + .sort(([e], [t]) => e.localeCompare(t)) + .map(([e, t]) => [e, r(t)]), + ) + : e; +} +function i(t) { + return JSON.stringify(r(e(t))); +} +function a(e, t) { + if (!e) return; + let n = e.item.self_defined_field ?? {}; + if (Object.keys(n).some((e) => !t.includes(e))) + throw Error(`商品自定义字段已调整,请返回购物车删除该项后重新配置`); +} +var o = null; +async function s(e) { + let t = new TextEncoder().encode(i(e)); + return Array.from( + new Uint8Array(await crypto.subtle.digest(`SHA-256`, t)), + (e) => e.toString(16).padStart(2, `0`), + ).join(``); +} +async function c(e, t) { + let n = [...t]; + o = { + fingerprints: await Promise.all(e.map(s)), + indices: n, + }; +} +async function l(e) { + let t = o; + if (!t) return null; + o = null; + let n = await Promise.all(e.map(s)), + r = new Set(); + return t.indices.flatMap((e) => { + let i = t.fingerprints + .slice(0, e) + .filter((n) => n === t.fingerprints[e]).length, + a = n.flatMap((n, r) => (n === t.fingerprints[e] ? [r] : []))[i]; + return a === void 0 || r.has(a) ? [] : (r.add(a), [a]); + }); +} +function u(n, r) { + let a = r ? t(r.item) : null, + c = !1; + return async (l, u) => { + if (!r || !a) throw Error(`购物车编辑上下文缺失`); + if (c) throw Error(`正在保存,请勿重复操作`); + c = !0; + let d = t(e(a, l)); + try { + let c = (await n.get(`/cart`)).list?.[r.position]; + if (!c || i(c) !== i(a)) + throw Error(`购物车商品已变化,请返回购物车刷新后重新编辑`); + if (!u()) throw Error(`配置已改变,请重新确认报价后保存`); + let l = await n.put(`/cart/${r.position}`, { + ...d, + expected_item: e(a), + }), + f = a; + a = t({ + ...a, + ...d, + }); + let p = o; + return ( + p && + p.fingerprints[r.position] === (await s(f)) && + (p.fingerprints[r.position] = await s(a)), + l + ); + } finally { + c = !1; + } + }; +} +export { l as a, c as i, t as n, a as o, u as r, n as t }; diff --git a/app/lib/cloud-instance-management.js b/app/lib/cloud-instance-management.js new file mode 100644 index 0000000..c52b646 --- /dev/null +++ b/app/lib/cloud-instance-management.js @@ -0,0 +1,162 @@ +var e = (e) => e === `mf_cloud` || e === `remf_cloud`; +function t(e) { + let t = () => { + throw Error(`防御配置无效,请重试`); + }; + if (!e || typeof e != `object` || Array.isArray(e)) return t(); + let n = e; + if (!Object.keys(n).length) + return { + options: [], + current: ``, + }; + let r = n.defence; + if ( + !r || + typeof r != `object` || + (!Array.isArray(r) && Object.keys(r).some((e) => !/^(0|[1-9]\d*)$/.test(e))) + ) + return t(); + let i = Object.values(r).map((e) => { + if (!e || typeof e != `object`) return t(); + let { value: n, desc: r } = e; + return ![`string`, `number`].includes(typeof n) || + String(n).trim() === `` || + !Number.isFinite(Number(n)) || + Number(n) < 0 || + ![`string`, `number`].includes(typeof r) || + String(r).trim() === `` + ? t() + : { + value: String(n), + desc: String(r), + }; + }), + a = n.current_defence == null ? `` : String(n.current_defence); + return a !== `` && (!Number.isFinite(Number(a)) || Number(a) < 0 || !a.trim()) + ? t() + : { + options: i, + current: a, + }; +} +function n(e) { + if ( + e == null || + String(e).trim() === `` || + !Number.isFinite(Number(e)) || + Number(e) < 0 + ) + throw Error(`未获得有效报价,请重试`); + return String(e); +} +function r(e) { + if ( + (typeof e != `string` && typeof e != `number`) || + !/^[1-9]\d*$/.test(String(e)) + ) + throw Error(`订单编号未返回,请先在订单管理中检查,避免重复下单`); + return e; +} +function i(e, t) { + if (!Number.isInteger(t.int_port) || t.int_port < 1 || t.int_port > 65535) + throw Error(`内部端口应为 1–65535 的整数`); + if (e === `web`) { + let e = t.domain.trim().toLowerCase(); + if ( + !/^(?=.{1,253}$)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test( + e, + ) + ) + throw Error(`请输入有效域名,不含协议和路径`); + return { + domain: e, + int_port: t.int_port, + }; + } + if (!t.name.trim()) throw Error(`请输入转发名称`); + if (![1, 2, 3].includes(t.protocol)) throw Error(`请选择有效协议`); + if ( + t.ext_port !== null && + (!Number.isInteger(t.ext_port) || + t.ext_port < 0 || + t.ext_port > 65535 || + [22, 80, 443].includes(t.ext_port)) + ) + throw Error(`外部端口应为 0–65535,且不能使用 22、80、443`); + return { + name: t.name.trim(), + int_port: t.int_port, + protocol: t.protocol, + ...(t.ext_port === null + ? {} + : { + ext_port: t.ext_port, + }), + }; +} +function a(e, t, n = []) { + if (!e.trim()) throw Error(`请输入 VPC 名称`); + if (!t.trim()) + return { + name: e.trim(), + }; + let r = t.trim().match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)\/(\d+)$/); + if (!r) throw Error(`请输入有效 IPv4 CIDR 网段`); + let i = r.slice(1, 5).map(Number), + a = Number(r[5]); + if ( + i.some((e) => e < 0 || e > 255) || + a < 1 || + a > 32 || + (n.length && !n.includes(a)) + ) + throw Error(`网段地址或掩码不在允许范围内`); + return { + name: e.trim(), + ips: t.trim(), + }; +} +function o(e, t = {}) { + return e.flatMap((e, n) => { + let r = e.type === `step` || e.type === `total`, + i = + Number(t.disk_range_limit_switch) === 1 && + Number(t.disk_range_limit) > 0 + ? Number(t.disk_range_limit) + : 1, + a = r + ? Math.ceil(Number(e.min_value ?? e.value) / i) * i + : Number(e.value), + o = r + ? Math.floor(Number(e.max_value ?? e.value) / i) * i + : Number(e.value), + s = String(e.other_config?.disk_type ?? ``); + return !Number.isInteger(a) || + !Number.isInteger(o) || + a < 1 || + o < a || + !Number.isFinite(i) || + i <= 0 + ? [] + : [ + { + id: n, + type: s, + min: a, + max: o, + step: i, + label: `${s || `默认类型`} · ${a === o ? a : `${a}–${o}`} GB`, + }, + ]; + }); +} +function s(e, t) { + return ( + Number.isInteger(e) && + e >= t.min && + e <= t.max && + Math.abs((e - t.min) / t.step - Math.round((e - t.min) / t.step)) < 1e-7 + ); +} +export { i as a, a as c, e as i, t as n, s as o, o as r, r as s, n as t }; diff --git a/app/lib/common-advanced-rules.js b/app/lib/common-advanced-rules.js new file mode 100644 index 0000000..9f94ec4 --- /dev/null +++ b/app/lib/common-advanced-rules.js @@ -0,0 +1,261 @@ +var e = (e) => (e && typeof e == `object` && !Array.isArray(e) ? e : {}), + t = (t) => (Array.isArray(t) ? t.map(e) : []), + n = (e) => JSON.parse(JSON.stringify(e)), + r = (e) => [`quantity`, `quantity_range`].includes(String(e.option_type)), + i = (e) => String(e.id ?? e.configoption_id ?? ``), + a = (e) => + (Array.isArray(e) ? e : [e]) + .filter((e) => e != null && e !== ``) + .map(Number), + o = (e = `商品高级规则数据不完整`) => { + throw Error(e); + }; +function s(n) { + return n == null + ? [] + : Array.isArray(n) + ? n.flatMap((n) => { + let r = e(n); + if (![!0, 1, `1`].includes(r.enabled)) return []; + [`all`, `any`].includes(String(r.combine_mode)) || o(); + let i = t(r.terms).map( + (e) => ( + (![`condition`, `result`].includes(String(e.role)) || + ![`in`, `not_in`].includes(String(e.operator)) || + !Number.isSafeInteger(Number(e.configoption_id)) || + Number(e.configoption_id) <= 0 || + !t(e.values).length) && + o(), + { + id: String(e.configoption_id), + role: e.role, + operator: e.operator, + values: t(e.values), + } + ), + ); + return ( + (!i.some((e) => e.role === `condition`) || + !i.some((e) => e.role === `result`)) && + o(), + [ + { + mode: r.combine_mode, + terms: i, + }, + ] + ); + }) + : o(); +} +function c(e, t, n) { + return n.values.some((n) => { + if (r(e)) + return ( + (n.qty_min === null || + n.qty_min === void 0 || + n.qty_max === null || + n.qty_max === void 0 || + !Number.isFinite(Number(n.qty_min)) || + !Number.isFinite(Number(n.qty_max)) || + Number(n.qty_max) < Number(n.qty_min)) && + o(), + t >= Number(n.qty_min) && t <= Number(n.qty_max) + ); + let i = Number(n.configoption_sub_id); + return ((!Number.isSafeInteger(i) || i <= 0) && o(), t === i); + }); +} +function l(e, t, n) { + let r = a(t).map((t) => c(e, t, n)); + return n.operator === `not_in` + ? !r.some(Boolean) + : n.role === `condition` + ? r.some(Boolean) + : !!r.length && r.every(Boolean); +} +function u(e) { + return e.option_type === `os` + ? t(e.subs).flatMap((e) => t(e.version).map((e) => Number(e.id))) + : t(e.subs).map((e) => Number(e.id)); +} +function d(e) { + let n = {}; + for (let o of e) { + let e = i(o); + if (!e || o.option_type === `cascade`) continue; + let s = ( + r(o) + ? [Number(o.qty)] + : o.configoption_sub_id === void 0 + ? t(o.subs).some((e) => e.id !== void 0) + ? t(o.subs).map((e) => Number(e.id)) + : u(o) + : [Number(o.configoption_sub_id)] + ).filter(Number.isFinite); + n[e] = + r(o) || o.option_type === `multi_select` + ? [...a(n[e]), ...s] + : (s[0] ?? null); + } + return n; +} +function f(e, n, i) { + if ( + (e.option_type === `cascade` && o(`高级规则不能将级联项作为普通配置提交`), + !r(e)) + ) { + let r = (t) => + n.operator === `not_in` ? !c(e, Number(t), n) : c(e, Number(t), n); + e.subs = + e.option_type === `os` + ? t(e.subs) + .map((e) => ({ + ...e, + version: t(e.version).filter((e) => r(e.id)), + })) + .filter((e) => e.version.length) + : t(e.subs).filter((e) => r(e.id)); + return; + } + let a = Number(i.qty_min ?? 0), + s = Math.max(1, Number(i.qty_change || 1)); + ((!Number.isSafeInteger(a) || !Number.isSafeInteger(s)) && o(), + (e.subs = ( + t(e.subs).length + ? t(e.subs) + : [ + { + qty_min: e.qty_min, + qty_max: e.qty_max, + }, + ] + ).flatMap((t) => { + let r = a + Math.ceil((Number(t.qty_min) - a) / s) * s, + i = a + Math.floor((Number(t.qty_max) - a) / s) * s; + if (!Number.isSafeInteger(r) || !Number.isSafeInteger(i) || i < r) + return []; + let o = Math.floor((i - r) / s) + 1, + l = [ + ...new Set([ + 0, + o, + ...n.values.flatMap( + (t) => ( + c(e, r, { + ...n, + values: [t], + }), + [ + Math.ceil((Number(t.qty_min) - r) / s), + Math.floor((Number(t.qty_max) - r) / s) + 1, + ] + ), + ), + ]), + ] + .filter((e) => e >= 0 && e <= o) + .sort((e, t) => e - t); + return l.slice(0, -1).flatMap((i, a) => { + let o = r + i * s, + u = r + (l[a + 1] - 1) * s, + d = c(e, o, n); + return u >= o && (n.operator === `not_in` ? !d : d) + ? [ + { + ...t, + qty_min: o, + qty_max: u, + }, + ] + : []; + }); + }))); + let l = t(e.subs); + l.length && + ((e.qty_min = Math.min(...l.map((e) => Number(e.qty_min)))), + (e.qty_max = Math.max(...l.map((e) => Number(e.qty_max))))); +} +function p(e, n, s) { + let c = i(e), + l = String(e.option_name || c), + d = n[c]; + if (r(e)) { + let r = t(e.subs), + i = Number(s.qty_min ?? 0), + u = Math.max(1, Number(s.qty_change || 1)); + r.length || o(`${l}没有符合当前条件的配置`); + let f = Number(r[0].qty_min), + p = a(d).map((e) => + r.some( + (t) => + e >= Number(t.qty_min) && + e <= Number(t.qty_max) && + (e - i) % u === 0, + ) + ? e + : f, + ); + n[c] = Array.isArray(d) ? (p.length ? p : [f]) : (p[0] ?? f); + } else { + let t = u(e); + if ( + (t.length || o(`${l}没有符合当前条件的配置`), + e.option_type === `multi_select`) + ) { + let e = a(d).filter((e) => t.includes(e)); + n[c] = e.length ? e : [t[0]]; + } else t.includes(Number(d)) || (n[c] = t[0]); + } +} +function m(r, a, c, u = []) { + let m = r.map((t) => n(e(t))), + h = s(c); + if (!h.length) + return { + options: r, + form: a, + }; + let g = t(u), + _ = new Map([...g, ...m].map((e) => [i(e), e])), + v = d(g), + y = n(a), + b = new Set(); + for (let e = 0; e <= m.length + h.length + 2; e++) { + let e = JSON.stringify(y); + (b.has(e) && o(`商品高级规则相互冲突,请重新选择配置`), b.add(e)); + let t = n(m), + r = { + ...v, + ...y, + }, + a = new Set(); + for (let e of h) { + let n = e.terms + .filter((e) => e.role === `condition`) + .map((e) => { + let t = _.get(e.id); + return t ? l(t, r[e.id], e) : null; + }); + if (e.mode === `any` ? n.some((e) => e === !0) : n.every((e) => e === !0)) + for (let n of e.terms.filter((e) => e.role === `result`)) { + let e = t.find((e) => i(e) === n.id); + if (e) (f(e, n, _.get(n.id)), a.add(n.id)); + else { + let e = _.get(n.id); + e && + !l(e, r[n.id], n) && + o(`所选配置与当前实例配置不兼容,请重新选择`); + } + } + } + for (let e of t) a.has(i(e)) && p(e, y, _.get(i(e))); + if (JSON.stringify(y) === e) + return { + options: t, + form: y, + }; + } + return o(`商品高级规则无法确定,请重新选择配置`); +} +export { m as t }; diff --git a/app/lib/complete-list.js b/app/lib/complete-list.js new file mode 100644 index 0000000..de3495c --- /dev/null +++ b/app/lib/complete-list.js @@ -0,0 +1,44 @@ +async function e(e, t = () => !0) { + let n = [], + r = new Set(); + for (let i = 1; ; i++) { + if (!t()) return []; + let a = await e(i, 100); + if (!t()) return []; + if (!a || !Array.isArray(a.list)) throw Error(`列表响应无效,请重试`); + let o = a.count === void 0 ? null : Number(a.count); + if (o !== null && (!Number.isSafeInteger(o) || o < 0)) + throw Error(`分页信息无效,请重试`); + let s = n.length; + for (let e of a.list) { + if (!e || !Number.isSafeInteger(Number(e.id)) || Number(e.id) <= 0) + throw Error(`列表项目无效,请重试`); + r.has(String(e.id)) || (r.add(String(e.id)), n.push(e)); + } + if (o === null ? a.list.length < 100 : n.length >= o) return n; + if (s === n.length) throw Error(`未能加载完整列表,请刷新重试`); + } +} +function t(e, t) { + let n = ( + Array.isArray(e) ? e : e && typeof e == `object` && `id` in e ? [e] : [] + ).filter((e) => !!e && typeof e == `object`), + r = [], + i = [], + a = []; + for (let e of t) { + let t = n.filter((t) => Number(t.id) === e); + t.length === 1 && Number(t[0].status) === 200 + ? r.push(e) + : (i.push(e), + a.push( + `#${e}:${t.length === 1 ? String(t[0].msg || `关联失败`) : `未取得明确结果,请刷新核对`}`, + )); + } + return { + succeeded: r, + failed: i, + details: a, + }; +} +export { e as n, t }; diff --git a/app/lib/composables-2.js b/app/lib/composables-2.js new file mode 100644 index 0000000..a159c69 --- /dev/null +++ b/app/lib/composables-2.js @@ -0,0 +1,2 @@ +var e = (e) => {}; +export { e as t }; diff --git a/app/lib/configuration-display.js b/app/lib/configuration-display.js new file mode 100644 index 0000000..cc22824 --- /dev/null +++ b/app/lib/configuration-display.js @@ -0,0 +1,100 @@ +function e(e, t) { + let n = typeof e == `string` ? e.trim() : ``; + return t === `area` || Number(t) === 12 + ? `区域` + : t === `os` || Number(t) === 5 + ? `操作系统` + : /^(区域|地区|地域|数据中心|机房)$/.test(n) + ? `区域` + : /^(线路|网络线路)$/.test(n) + ? `线路` + : /^(带宽|网络带宽|带宽上限)$/.test(n) + ? `带宽上限` + : /^(镜像|系统|系统镜像|镜像名称|操作系统)$/.test(n) + ? `操作系统` + : /^(系统版本|镜像版本)$/.test(n) + ? `镜像版本` + : n; +} +function t(e) { + let t = typeof e == `string` ? e.trim() : ``; + return /^(normal|classic|经典网络)$/i.test(t) + ? `经典网络` + : /^(vpc(?:\s*网络)?|私有网络)$/i.test(t) + ? `VPC 网络` + : t; +} +function n(e) { + if (typeof e == `string`) + try { + return n(JSON.parse(e)); + } catch { + return {}; + } + return e && typeof e == `object` && !Array.isArray(e) ? e : {}; +} +function r(e) { + return typeof e == `string` ? e.trim() : ``; +} +function i(i, a, o) { + let s = n(a), + c = n(o), + l = n(s.data_center ?? c.data_center), + u = + s.config_options ?? + s.configoptions ?? + c.config_options ?? + c.configoptions, + d = []; + if (Array.isArray(u)) d = u.map(n); + else if (typeof u == `string`) + try { + let e = JSON.parse(u); + Array.isArray(e) && (d = e.map(n)); + } catch {} + let f = (t) => d.find((n) => e(n.option_name ?? n.name, n.option_type) === t), + p = (e) => { + let t = f(e); + return t + ? r(t.sub_name ?? t.value ?? t.cascade_path) || + (Array.isArray(t.subs) + ? t.subs + .map((e) => r(n(e).option_name)) + .filter(Boolean) + .join(` / `) + : ``) + : ``; + }, + m = [r(l.city), r(l.area)].filter(Boolean), + h = m.length + ? [...new Set(m)].join(` / `) + : r(l.name) || r(l.country) || r(s.data_center) || r(c.data_center); + return i === `kky_ecs` + ? { + region: r(s.line_name) || r(c.line_name) || h, + line: r(s.network_name) || r(c.network_name), + networkType: `经典网络`, + } + : i === `jy_cloud` || i === `jy_dcim` + ? { + region: + h || + r(s.region_name) || + r(s.area_name) || + p(`区域`) || + r(s.line_name) || + r(c.line_name), + line: r(n(s.line).name) || r(s.line_name) || r(c.line_name), + networkType: t(s.network_type ?? c.network_type), + } + : { + region: h || p(`区域`), + line: + r(n(s.line).name) || + r(s.line_name) || + r(n(c.line).name) || + p(`线路`), + networkType: t(s.network_type ?? c.network_type) || t(p(`网络类型`)), + }; +} +export { i as n, t as r, e as t }; diff --git a/app/lib/content-route.js b/app/lib/content-route.js new file mode 100644 index 0000000..c843d4d --- /dev/null +++ b/app/lib/content-route.js @@ -0,0 +1,25 @@ +function e(e) { + if (typeof e != `string` || !/^[1-9]\d*$/.test(e)) return null; + let t = Number(e); + return Number.isSafeInteger(t) ? t : null; +} +function t(e) { + return e === `help` || e === `news` || e === `notices` ? e : null; +} +function n(t, n) { + let r = e(t); + return r + ? ({ + IdcsmartHelp: `help`, + IdcsmartNews: `news`, + IdcsmartAnnouncement: `notices`, + }[ + n.find( + (e) => + Number(e.id) === r && + (e.status === void 0 || Number(e.status) === 1), + )?.name ?? `` + ] ?? null) + : null; +} +export { n, t as r, e as t }; diff --git a/app/lib/dict.js b/app/lib/dict.js new file mode 100644 index 0000000..fcf686c --- /dev/null +++ b/app/lib/dict.js @@ -0,0 +1,127 @@ +import { n as product_name_n } from "~/lib/product-name.js"; +var t = { + Unpaid: { + label: `未付款`, + severity: `warn`, + }, + Pending: { + label: `开通中`, + severity: `info`, + }, + Active: { + label: `使用中`, + severity: `success`, + }, + Suspended: { + label: `暂停`, + severity: `danger`, + }, + Deleted: { + label: `删除`, + severity: `secondary`, + }, + Failed: { + label: `开通失败`, + severity: `danger`, + }, + }, + n = { + Unpaid: { + label: `未付款`, + severity: `warn`, + }, + Paid: { + label: `已付款`, + severity: `success`, + }, + WaitUpload: { + label: `待上传`, + severity: `warn`, + }, + WaitReview: { + label: `待审核`, + severity: `warn`, + }, + ReviewFail: { + label: `审核失败`, + severity: `danger`, + }, + Cancelled: { + label: `已取消`, + severity: `secondary`, + }, + Refunded: { + label: `已退款`, + severity: `info`, + }, + }, + r = { + new: `新订单`, + renew: `续费订单`, + upgrade: `升降级订单`, + artificial: `人工订单`, + recharge: `充值订单`, + combine: `合并订单`, + credit_limit: `还款订单`, + on_demand: `按需订单`, + change_billing_cycle: `变更计费周期`, + }, + i = { + Recharge: `充值`, + Applied: `扣费`, + Refund: `退款`, + Withdraw: `提现`, + Artificial: `人工`, + Freeze: `冻结`, + Unfreeze: `解冻`, + DeveloperWithdraw: `开发者提现`, + }; +function a(e) { + return i[e] ?? e; +} +function o(t) { + let n = t.product_names; + if (Array.isArray(n)) { + let t = n.map(product_name_n).filter(Boolean).join(`、`); + if (t) return t; + } else if (n) return product_name_n(n); + return t.name || t.description || `--`; +} +function s(e) { + return t[e]?.label ?? e; +} +function c(e) { + return t[e]?.severity ?? `secondary`; +} +function l(e) { + return r[e] ?? e; +} +function u(e) { + return n[e]?.label ?? e; +} +function d(e) { + return n[e]?.severity ?? `secondary`; +} +function f(e) { + if (!e) return `--`; + let t = new Date(e * 1e3), + n = (e) => String(e).padStart(2, `0`); + return `${t.getFullYear()}-${n(t.getMonth() + 1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}`; +} +function p(e) { + if (!e) return `--`; + let t = new Date(e * 1e3), + n = (e) => String(e).padStart(2, `0`); + return `${t.getFullYear()}-${n(t.getMonth() + 1)}-${n(t.getDate())}`; +} +export { + u as a, + s as c, + o as i, + c as l, + p as n, + d as o, + f as r, + l as s, + a as t, +}; diff --git a/app/lib/finance-resource-chart.js b/app/lib/finance-resource-chart.js new file mode 100644 index 0000000..f5fd6ac --- /dev/null +++ b/app/lib/finance-resource-chart.js @@ -0,0 +1,41 @@ +function e(e) { + if (typeof e != `number` && (typeof e != `string` || !e.trim())) return null; + let t = Number(e); + return Number.isFinite(t) ? t : null; +} +function t(t, n) { + let r = t.list ?? [], + i = t.label ?? [], + a = i.findIndex((e) => /已用|使用|used|usage|utilization/i.test(e)), + o = (t) => { + let n = e(t); + return n === null + ? null + : Number(Math.min(100, Math.max(0, n)).toFixed(2)); + }, + s = (e) => e.map((e) => String(e.time ?? ``).slice(11, 16)); + if (n === `cpu` || /%|percent/i.test(t.unit ?? ``)) { + let e = r[n === `memory` && a >= 0 ? a : 0] ?? []; + return { + labels: s(e), + data: e.map((e) => o(e.value)), + }; + } + let c = i.findIndex((e) => /总|total|allocated/i.test(e)), + l = c >= 0 ? c : 0, + u = i.findIndex((e) => /空闲|可用|free|available/i.test(e)), + d = a >= 0 ? a : u >= 0 ? u : 1, + f = r[l] ?? [], + p = new Map((r[d] ?? []).map((e) => [String(e.time ?? ``), e.value])); + return { + labels: s(f), + data: f.map((t) => { + let n = e(t.value), + r = t.time ? e(p.get(t.time)) : null; + if (l === d || n === null || n <= 0 || r === null || r < 0) return null; + let i = a < 0 && u >= 0 ? n - r : r; + return o((i / n) * 100); + }), + }; +} +export { t as n, e as t }; diff --git a/app/lib/instance-data.js b/app/lib/instance-data.js new file mode 100644 index 0000000..592a3e9 --- /dev/null +++ b/app/lib/instance-data.js @@ -0,0 +1,250 @@ +function e(e) { + if (e == null || e === ``) return null; + let t = Number(e); + return Number.isFinite(t) ? t : null; +} +function t(t) { + if (typeof t != `number` && typeof t != `string`) return null; + let n = e(t); + return n !== null && Number.isInteger(n) && n >= 1 && n <= 65535 ? n : null; +} +function n(e) { + if (typeof e == `string`) + try { + return n(JSON.parse(e)); + } catch { + return {}; + } + return e && typeof e == `object` && !Array.isArray(e) ? e : {}; +} +function r(e) { + if (typeof e == `string`) + try { + return r(JSON.parse(e)); + } catch { + return []; + } + return Array.isArray(e) ? e.filter((e) => e && typeof e == `object`) : []; +} +function i(t) { + let n = e(t); + if (n !== null) return n > 0xe8d4a51000 ? Math.floor(n / 1e3) : n || void 0; + let r = Date.parse(String(t ?? ``).replace(` `, `T`)); + return Number.isFinite(r) ? Math.floor(r / 1e3) : void 0; +} +function a(e, t = `GB`) { + if (typeof e == `string` && /不限|unlimited/i.test(e)) return 0; + let n = /^\s*(-?\d+(?:\.\d+)?(?:e[+-]?\d+)?)\s*([KMGT]?B)?\s*$/i.exec( + String(e ?? ``), + ); + if (!n) return null; + let r = (n[2] || t).toUpperCase(), + i = + Number(n[1]) * + ({ + B: 1 / 1024 ** 3, + KB: 1 / 1024 ** 2, + MB: 1 / 1024, + GB: 1, + TB: 1024, + }[r] ?? 1); + return Number.isFinite(i) ? i : null; +} +function o(t, r, i) { + let o = n(r), + s = n(i), + c = n(o.host_data), + l = n(s.billing), + u = n(s.quota), + d = + t === `kky_ecs` + ? l.mode === `traffic` || l.mode === `bandwidth` + ? l.mode + : Number(o.bill_method) === 1 + ? `bandwidth` + : Number(o.bill_method) === 2 + ? `traffic` + : `` + : ``, + f = t === `kky_ecs` ? e(l.unit_price) : null, + p = f !== null && f >= 0 ? f : null, + m = t === `kky_ecs` ? a(l.monthly_quota) : null, + h = m !== null && m >= 0 ? m : null, + g = a(u.total), + _ = a(u.used), + v = a(u.remaining), + y = + t === `kky_ecs` && + g !== null && + g >= 0 && + _ !== null && + _ >= 0 && + v !== null && + v >= 0 + ? { + total: g, + used: _, + remaining: v, + percent: g > 0 ? Math.min(100, (_ / g) * 100) : null, + start: String(u.start_time ?? ``), + end: String(u.end_time ?? ``), + } + : null, + b = + t === `kky_ecs` && + [`available`, `none`, `not_applicable`].includes( + String(s.quota_status ?? ``), + ), + x = null, + S = null, + C = null, + w = ``, + T = !1, + E = t === `kky_ecs` && !!s.start_time && !!s.end_time, + D = E ? a(s.incoming) : null; + if (t === `mf_cloud` || t === `remf_cloud`) + ((x = a(s.total_num ?? s.total)), + (S = a(s.used_num ?? s.used)), + (C = a(s.leave)), + (w = String(s.reset_flow_date ?? ``))); + else if (t === `remf_finance`) + ((x = a(c.bwlimit, String(c.bwunit ?? `GB`))), + (S = a(c.bwusage, String(c.bwunit ?? `GB`))), + (w = String(c.reset_flow_date ?? o.reset_flow_date ?? ``))); + else { + let e = n(o.traffic); + ((x = a( + o.traffic_total ?? + o.total_traffic ?? + e.total ?? + (typeof o.traffic == `object` ? null : o.traffic), + )), + (S = a( + E + ? s.used + : (o.traffic_used ?? o.used_traffic ?? o.traffic_usage ?? e.used), + )), + (C = a(o.traffic_remain ?? o.remain_traffic ?? e.remain)), + (w = String(o.traffic_reset_time ?? o.reset_flow_date ?? ``)), + (T = + Number(o.bill_method) === 2 || + Number(o.traffic_show) === 1 || + /流量/.test(String(o.bill_method_name ?? ``))), + (l.mode === `traffic` || l.mode === `bandwidth`) && + (T = l.mode === `traffic`), + d && (T = d === `traffic`)); + } + return ( + !E && + x !== null && + x > 0 && + S === null && + C !== null && + (S = Math.max(0, x - C)), + !E && + x !== null && + x > 0 && + C === null && + S !== null && + (C = Math.max(0, x - S)), + { + total: x, + used: S, + remaining: C, + reset: w, + unlimited: !T && (x === null ? d === `bandwidth` : x <= 0), + metered: T, + incoming: D, + quota: y, + quotaLoaded: b, + unitPrice: p, + monthlyQuota: h, + periodStart: E ? String(s.start_time) : ``, + periodEnd: E ? String(s.end_time) : ``, + usedLabel: E ? `最近完整小时出站流量` : `已用流量`, + percent: + !E && x !== null && x > 0 && S !== null + ? Math.max(0, Math.min(100, (S / x) * 100)) + : null, + packageRemaining: + t === `kky_ecs` && Number(o.traffic_show) !== 1 + ? null + : a(o.traffic_package_remain), + } + ); +} +function s(e) { + return e === null + ? `—` + : Math.abs(e) >= 1024 + ? `${(e / 1024).toFixed(2)} TB` + : `${e.toFixed(2)} GB`; +} +function c(e) { + return e === null + ? `—` + : e === 0 + ? `0 B` + : Math.abs(e) >= 1 + ? s(e) + : Math.abs(e) >= 1 / 1024 + ? `${(e * 1024).toFixed(2)} MB` + : Math.abs(e) >= 1 / 1024 ** 2 + ? `${(e * 1024 ** 2).toFixed(2)} KB` + : `${(e * 1024 ** 3).toFixed(0)} B`; +} +function l(t) { + let o = n(t); + return r(o.disk ?? o.disks ?? o.disk_list).map((t, n) => { + let r = String(t.type2 ?? t.type ?? t.disk_property ?? ``).toLowerCase(), + o = + [`system`, `sys`, `1`].includes(r) || /系统/.test(String(t.name ?? ``)); + return { + ident: String(t.id ?? t.disk_id ?? t.identity ?? n), + name: String(t.name ?? t.disk_name ?? (o ? `系统盘` : `数据盘`)), + size: a(t.size ?? t.disk_size) ?? 0, + type: String(t.fs_type ?? t.disk_type ?? `—`), + type2: o ? `system` : `data`, + status: e(t.status) ?? -1, + createTime: i(t.create_time ?? t.created_at), + raw: t, + }; + }); +} +function u(e) { + let t = n(e), + i = n(t.image), + a = n(t.host_data), + o = r(t.config_options).find((e) => Number(e.option_type) === 5); + return { + name: String( + t.image_name ?? i.name ?? t.os_name ?? t.os ?? o?.sub_name ?? a.os ?? ``, + ), + icon: String(t.image_icon ?? i.icon ?? ``), + url: String(t.image_icon_url ?? i.icon_url ?? ``), + }; +} +function d(e, t) { + let r = n(e); + return { + id: String(r.id ?? r.log_id ?? t), + description: String( + r.description ?? r.content ?? r.detail ?? r.message ?? r.des ?? `—`, + ), + create_time: i(r.create_time ?? r.created_at ?? r.time ?? r.date), + ip: String(r.ip ?? r.ip_address ?? ``), + }; +} +export { + u as a, + t as c, + o as d, + r as i, + n as l, + s as n, + d as o, + c as r, + e as s, + l as t, + i as u, +}; diff --git a/app/lib/instance-status.js b/app/lib/instance-status.js new file mode 100644 index 0000000..3e66f81 --- /dev/null +++ b/app/lib/instance-status.js @@ -0,0 +1,95 @@ +function e(e, t) { + let n = + typeof t == `string` && + [`suspend`, `suspended`, `paused`].includes(t.trim().toLowerCase()); + return e.status !== `Suspended` && !(e.status === `Active` && n) + ? `` + : e.suspend_reason?.trim() || + { + overtraffic: `流量用尽,服务已暂停`, + overdue: `服务到期,已暂停`, + certification_not_complete: `实名认证未完成,服务已暂停`, + upstream: `上游暂停服务`, + downstream: `下游暂停服务`, + }[e.suspend_type || ``] || + `暂停原因暂未提供,请联系支持`; +} +function t(e, t = `Active`, n = !1) { + let r = { + Unpaid: `未付款`, + Pending: `开通中`, + Suspended: `暂停`, + Deleted: `已删除`, + Failed: `开通失败`, + Grace: `宽限期`, + Keep: `保留期`, + }; + if (t && t !== `Active`) + return { + label: r[t] || `状态未知`, + tone: `warning`, + severity: `warn`, + }; + let i = typeof e == `string` ? e.trim().toLowerCase() : ``; + return i === `on` + ? { + label: `运行中`, + tone: `running`, + severity: `success`, + } + : i === `off` + ? { + label: `已关机`, + tone: `stopped`, + severity: `danger`, + } + : { + label: + { + suspend: `暂停`, + suspended: `暂停`, + paused: `暂停`, + pending: `开通中`, + operating: `操作中`, + fault: `故障`, + }[i] || (n ? `查询中` : `状态未知`), + tone: `warning`, + severity: `warn`, + }; +} +function n(e, t) { + if (!/^[1-9]\d*$/.test(String(t))) return null; + let n = e.replace(/^mf_finance(?=$|_)/, `remf_finance`); + return n === `idcsmart_common` || n === `reidcsmart_common` + ? { + method: `post`, + path: `/${n}/host/${t}/provision/status`, + } + : [ + `mf_cloud`, + `kky_ecs`, + `mf_dcim`, + `remf_dcim`, + `remf_cloud`, + `remf_finance`, + `remf_finance_dcim`, + `remf_finance_common`, + `jy_cloud`, + `jy_dcim`, + ].includes(n) + ? { + method: `get`, + path: `/${n}/${t}/status`, + } + : null; +} +async function r(e, t, r) { + let i = n(t, r); + if (!i) return ``; + let a = await e[i.method](i.path, void 0, !1, { + timeoutMs: 12e3, + }), + o = a && typeof a == `object` ? a.status : void 0; + return typeof o == `string` ? o : ``; +} +export { e as n, r, t }; diff --git a/app/lib/interval.js b/app/lib/interval.js new file mode 100644 index 0000000..932ff6e --- /dev/null +++ b/app/lib/interval.js @@ -0,0 +1,2 @@ +var e = globalThis.setInterval; +export { e as t }; diff --git a/app/lib/invoice.js b/app/lib/invoice.js new file mode 100644 index 0000000..a835a99 --- /dev/null +++ b/app/lib/invoice.js @@ -0,0 +1,28 @@ +async function e(e) { + let t = [], + n = new Set(); + for (let r = 1; ; r++) { + let i = await e(r, 50); + if (!i || !Array.isArray(i.list)) + throw Error(`发票资料格式异常,请重新加载`); + let a = i.count === void 0 ? null : Number(i.count); + if (a !== null && (!Number.isSafeInteger(a) || a < 0)) + throw Error(`发票资料分页信息异常,请重新加载`); + let o = t.length; + for (let e of i.list) { + if ( + !e || + ![`number`, `string`].includes(typeof e.id) || + !String(e.id).trim() + ) + throw Error(`发票资料格式异常,请重新加载`); + let r = String(e.id); + n.has(r) || (n.add(r), t.push(e)); + } + if ((a !== null && t.length >= a) || (a === null && i.list.length < 50)) + return t; + if (t.length === o) + throw Error(`未能加载完整发票资料,分页数据可能已变化,请重试`); + } +} +export { e as t }; diff --git a/app/lib/modules.js b/app/lib/modules.js new file mode 100644 index 0000000..ab6fe88 --- /dev/null +++ b/app/lib/modules.js @@ -0,0 +1,62 @@ +var e = { + cloud: [ + `mf_cloud`, + `kky_ecs`, + `whmcs_cloud`, + `mf_finance`, + `remf_finance`, + `jy_cloud`, + ], + dcim: [ + `mf_dcim`, + `remf_dcim`, + `mf_finance_dcim`, + `remf_finance_dcim`, + `whmcs_dcim`, + `jy_dcim`, + ], + common: [`idcsmart_common`, `mf_finance_common`], +}; +function t(e, t, n) { + let r = String(e ?? ``).trim(); + if (r && !/[\u0000-\u0020\u007f\\]/.test(r)) { + if (/^\/(?!\/)/.test(r)) return r; + try { + let e = new URL(r.startsWith(`//`) ? `https:${r}` : r); + if (/^(https?:)$/.test(e.protocol) && !e.username && !e.password) + return r; + } catch {} + } + let i = [ + [`Windows`, [`windows`, `winserver`]], + [`Ubuntu`, [`ubuntu`]], + [`Debian`, [`debian`]], + [`TencentOS-Server`, [`tencentos`]], + [`CentOS`, [`centos`]], + [`Rocky`, [`rocky`]], + [`AlmaLinux`, [`almalinux`]], + [`OpenEuler`, [`openeuler`, `euleros`]], + [`RedHat`, [`redhat`, `rhel`]], + [`Fedora`, [`fedora`, `fedroa`]], + [`ArchLinux`, [`archlinux`]], + [`FreeBSD`, [`freebsd`]], + [`ESXi`, [`esxi`]], + [`XenServer`, [`xenserver`]], + [`OpenClaw`, [`openclaw`]], + ], + a = [e, n].map((e) => + String(e ?? ``) + .toLowerCase() + .replace(/[\s_.\-/]+/g, ``), + ); + for (let e of a) { + let t = i.find(([, t]) => t.some((t) => e.includes(t))); + if (t) return `/images/os/${t[0]}.svg`; + } + return a.some((e) => /linux|alpine|opensuse|suse/.test(e)) + ? `/images/os/Linux.svg` + : e || n + ? `/images/os/Other.svg` + : ``; +} +export { t as n, e as t }; diff --git a/app/lib/navigation-state.js b/app/lib/navigation-state.js new file mode 100644 index 0000000..f564347 --- /dev/null +++ b/app/lib/navigation-state.js @@ -0,0 +1,76 @@ +import { watch } from "vue"; +import { ref } from "vue"; +import { effectScope } from "vue"; +import { i as backend_menu_i } from "~/lib/backend-menu.js"; +import { l as backend_menu_l } from "~/lib/backend-menu.js"; +function a(a, o) { + let s = ref([]), + c = ref(!1), + l = ref(!1), + u = ref(!1), + d = ref(``), + f = 0, + p = null; + effectScope(!0).run(() => + watch( + () => a.token, + () => { + (f++, + (p = null), + (s.value = []), + (c.value = !1), + (l.value = !1), + (u.value = !1), + (d.value = ``)); + }, + { + flush: `sync`, + }, + ), + ); + function m(e = !1) { + if (!a.isLoggedIn) return Promise.resolve(); + if (p) return p; + if (l.value && !e) return Promise.resolve(); + let t = f, + n = a.token; + ((u.value = !0), (d.value = ``)); + let m = o + .get(`/menu`, void 0, !1, { + timeoutMs: 8e3, + }) + .then((e) => { + if (t === f && n === a.token) { + if (!Array.isArray(e?.menu)) throw Error(`站点导航响应异常`); + ((s.value = backend_menu_l(backend_menu_i(e.menu))), + (c.value = + e.menu.length === 0 || + e.menu.some((e) => e && typeof e == `object` && `id` in e)), + (l.value = !0)); + } + }) + .catch((e) => { + t === f && + n === a.token && + (d.value = e instanceof Error ? e.message : `站点导航加载失败`); + }) + .finally(() => { + p === m && ((p = null), (u.value = !1)); + }); + return ((p = m), m); + } + return { + entries: s, + authoritative: c, + loaded: l, + loading: u, + error: d, + load: m, + }; +} +var o = new WeakMap(); +function s(e, t) { + let n = o.get(e); + return (n || ((n = a(e, t)), o.set(e, n)), n); +} +export { s as t }; diff --git a/app/lib/oauth.js b/app/lib/oauth.js new file mode 100644 index 0000000..768fe94 --- /dev/null +++ b/app/lib/oauth.js @@ -0,0 +1,67 @@ +import { o as backend_menu_o } from "~/lib/backend-menu.js"; +function t(t) { + return Array.isArray(t) + ? t.flatMap((t) => { + if ( + !t || + typeof t != `object` || + typeof t.name != `string` || + !/^[a-z][a-z0-9_]*$/i.test(t.name) + ) + return []; + let n = typeof t.img == `string` ? t.img : ``, + r = + /^\/(?!\/)/.test(n) && !/[\\\u0000-\u0020]/.test(n) + ? n + : backend_menu_o(n); + return [ + { + name: t.name, + title: typeof t.title == `string` ? t.title : t.name, + image: r, + linked: t.link === !0 || t.link === 1 || t.link === `1`, + }, + ]; + }) + : []; +} +function n(t, n) { + return typeof t == `string` + ? /^\/(?!\/)/.test(t) && !/[\\\u0000-\u0020]/.test(t) + ? new URL(t, n).href + : backend_menu_o(t) + : ``; +} +function r(e, t, r = t) { + if (!e || typeof e != `object` || Array.isArray(e)) + return { + kind: `expired`, + }; + let i = e; + if (typeof i.jwt == `string` && i.jwt.trim()) + return { + kind: `login`, + jwt: i.jwt.trim(), + }; + let a = n(i.url, t); + if (a) { + let e = new URL(a); + if (e.pathname === `/oauth.htm` && [t, r].includes(e.origin)) + return ( + (e.pathname = `/oauth/bind`), + { + kind: `bind`, + url: t + e.pathname + e.search + e.hash, + } + ); + if (e.origin === t && e.pathname === `/oauth/bind`) + return { + kind: `bind`, + url: a, + }; + } + return { + kind: `expired`, + }; +} +export { r as n, n as r, t }; diff --git a/app/lib/order-image-continuation.js b/app/lib/order-image-continuation.js new file mode 100644 index 0000000..261d3bf --- /dev/null +++ b/app/lib/order-image-continuation.js @@ -0,0 +1,42 @@ +var e = Symbol(`order-login-continuation`); +function t(e) { + if (typeof e != `number` && typeof e != `string`) return; + let t = Number(e); + if (!( + !Number.isSafeInteger(t) || + t <= 0 || + (typeof e == `string` && String(t) !== e) + )) + return t; +} +function n(e) { + let t = decodeURIComponent(e); + return ( + t.startsWith(`/`) && + !t.startsWith(`//`) && + !/[\\\u0000-\u0020\u007f]/.test(t) + ); +} +function r(e, r) { + try { + if ( + typeof e != `string` || + /[\\\u0000-\u0020\u007f]/.test(e) || + !n(e.split(/[?#]/, 1)[0] || ``) + ) + return `/products`; + let i = new URL(e, `https://console.invalid`); + if (i.origin !== `https://console.invalid` || !n(i.pathname)) + return `/products`; + let a = t(r); + return ( + a === void 0 + ? i.searchParams.delete(`order_image`) + : i.searchParams.set(`order_image`, String(a)), + `${i.pathname}${i.search}${i.hash}` + ); + } catch { + return `/products`; + } +} +export { r as n, t as r, e as t }; diff --git a/app/lib/os-name.js b/app/lib/os-name.js new file mode 100644 index 0000000..73c901e --- /dev/null +++ b/app/lib/os-name.js @@ -0,0 +1,78 @@ +var e = { + debian: `Debian`, + ubuntu: `Ubuntu`, + centos: `CentOS`, + windows: `Windows`, + rocky: `Rocky`, + "rocky linux": `Rocky Linux`, + almalinux: `AlmaLinux`, + fedora: `Fedora`, + openeuler: `openEuler`, + freebsd: `FreeBSD`, + tencentos: `TencentOS`, + alpine: `Alpine`, + "alpine linux": `Alpine Linux`, + }, + t = { + server: `Server`, + stream: `Stream`, + datacenter: `Datacenter`, + standard: `Standard`, + enterprise: `Enterprise`, + professional: `Professional`, + essentials: `Essentials`, + education: `Education`, + desktop: `Desktop`, + minimal: `Minimal`, + core: `Core`, + pro: `Pro`, + home: `Home`, + lts: `LTS`, + uefi: `UEFI`, + bios: `BIOS`, + gpt: `GPT`, + bt: `BT`, + }; +function n(n) { + let r = n.match( + /^(Debian|Ubuntu|CentOS|Windows|Rocky(?:[ _-]+Linux)?|AlmaLinux|Fedora|openEuler|FreeBSD|TencentOS|Alpine(?:[ _-]+Linux)?)(?=$|[\d\s_-])/i, + ); + if (!r) return n; + let i = n.slice(r[0].length), + a = !1, + o = [e[r[0].replace(/[ _-]+/g, ` `).toLowerCase()]], + s = + /^[\s_-]*(x86[_-]64|64[ _-]?(?:bits?|位)|32[ _-]?(?:bits?|位)|\d+(?:\.\d+)*(?:R2)?|Server|Stream|Datacenter|Standard|Enterprise|Professional|Essentials|Education|Desktop|Minimal|Core|Pro|Home|R2|LTS|SP\d+|UEFI|BIOS|GPT|BT|ARM64|aarch64|x64|amd64|x86|x32|i386|i686|ARM|cn|en|zh(?:[ _-](?:CN|TW))?|专业版|标准版|数据中心版|企业版|家庭版|教育版|中文版|英文版)(?=$|[\s_()()\[\]【】-])/i; + for (let e = i.match(s); e; e = i.match(s)) { + let n = t[e[1].toLowerCase()] ?? e[1]; + (/^\d+(?:\.\d+)*(?:R2)?$/i.test(n) && + (o[0] === `CentOS` && + !a && + (n = n.replace(/^(\d+\.\d+)(?:\.\d+)+$/, `$1`)), + (n = n.replace(/^(\d+(?:\.\d+)*)R2$/i, `$1 R2`)), + (a = !0)), + o.push(n), + (i = i.slice(e[0].length))); + } + return o.join(` `) + i; +} +function r(e) { + if (typeof e != `string`) return ``; + let t = e.trim(); + if (!t) return ``; + let r = `(?:x86[_-]64|x64|amd64|64[ _-]?(?:bit|bits|位))`; + return ( + n(t.replace(/\.(?:iso|qcow2?|img|raw|vhdx?|vmdk)$/i, ``)) + .replace( + /[\s_-]*(?:[((【\[]\s*)?纯净优化版(?:\s*[))】\]])?(?=$|[\s_-])/g, + ``, + ) + .replace(RegExp(`[((\\[【]\\s*${r}\\s*[))\\]】]`, `gi`), ` `) + .replace(RegExp(`(^|[\\s_])${r}(?=$|[\\s_])`, `gi`), `$1`) + .replace(RegExp(`-${r}$`, `i`), ``) + .replace(/_+/g, ` `) + .replace(/\s+/g, ` `) + .trim() || (t.includes(`纯净优化版`) ? `默认镜像` : t) + ); +} +export { r as t }; diff --git a/app/lib/password-2.js b/app/lib/password-2.js new file mode 100644 index 0000000..3f22ee7 --- /dev/null +++ b/app/lib/password-2.js @@ -0,0 +1,21 @@ +function e(e = 12) { + let t = (e) => e[Math.floor(Math.random() * e.length)], + n = [ + t(`abcdefghjkmnpqrstuvwxyz`), + t(`ABCDEFGHJKMNPQRSTUVWXYZ`), + t(`23456789`), + ], + r = Array.from( + { + length: Math.max(0, e - n.length), + }, + () => t(`abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ23456789`), + ), + i = [...n, ...r]; + for (let e = i.length - 1; e > 0; e--) { + let t = Math.floor(Math.random() * (e + 1)); + [i[e], i[t]] = [i[t], i[e]]; + } + return i.join(``); +} +export { e as t }; diff --git a/app/lib/product-description-data.js b/app/lib/product-description-data.js new file mode 100644 index 0000000..673dc61 --- /dev/null +++ b/app/lib/product-description-data.js @@ -0,0 +1,26 @@ +async function e(e, t) { + if (typeof t.description == `string`) return t.description; + let n = Number(t.id); + if (!Number.isSafeInteger(n) || n <= 0) return ``; + try { + let t = await e.get( + `/product`, + { + product_ids: [n], + page: 1, + limit: 1, + }, + !1, + { + timeoutMs: 5e3, + }, + ), + r = Array.isArray(t?.list) + ? t.list.find((e) => e && Number(e.id) === n) + : void 0; + return typeof r?.description == `string` ? r.description : ``; + } catch { + return ``; + } +} +export { e as t }; diff --git a/app/lib/product-fields.js b/app/lib/product-fields.js new file mode 100644 index 0000000..0d425e1 --- /dev/null +++ b/app/lib/product-fields.js @@ -0,0 +1,214 @@ +function e(e) { + return e && typeof e == `object` && !Array.isArray(e) ? e : null; +} +function t(e) { + return typeof e == `string` || typeof e == `number` ? String(e) : ``; +} +function n(e) { + return e === !0 || e === 1 || e === `1`; +} +function r(n) { + return ( + Array.isArray(n) + ? n.flatMap((n) => { + let r = e(n); + return r + ? [ + { + value: t(r.value ?? r.id ?? r.option_value), + label: t(r.label ?? r.name ?? r.option_name ?? r.value), + }, + ] + : [t(n)]; + }) + : t(n).split(/[,\n]/) + ) + .map((e) => + typeof e == `string` + ? { + value: e.trim(), + label: e.trim(), + } + : e, + ) + .filter((e) => e.value !== ``); +} +function i(e) { + let n = t(e).trim(); + if (!n) return {}; + let r = ``, + i = n[0], + a = { + "(": `)`, + "[": `]`, + "{": `}`, + "<": `>`, + }; + if (/[^a-zA-Z0-9\\\s\0]/.test(i)) { + let e = a[i] ?? i, + t = 1, + o = -1; + for (let r = 1; r < n.length; r++) { + if (n[r] === `\\`) { + r++; + continue; + } + if ((a[i] && n[r] === i && t++, n[r] === e && --t === 0)) { + o = r; + break; + } + a[i] || (t = 1); + } + if (o > 0 && /^[a-zA-Z\s]*$/.test(n.slice(o + 1))) + ((r = n.slice(o + 1).replace(/\s/g, ``)), + (n = n.slice(1, o)), + `\\^$.*+?()[]{}|/`.includes(e) || (n = n.split(`\\${e}`).join(e))); + else if (`/#~%!`.includes(i)) throw Error(`自定义字段验证规则无效`); + } + if (!/^[imsuxADSUXJnr]*$/.test(r)) + throw Error(`自定义字段验证规则修饰符无效`); + let o = /^\(\?([imsx]+)\)/.exec(n); + o && ((r += o[1]), (n = n.slice(o[0].length))); + let s = [...new Set(r.replace(/[^imsu]/g, ``))].join(``); + if ( + /\(\?(?:[>('|&R0-9]|P[=>]|[imsx-]+:)|\(\*|\\[KCG]|(?:[+*?]|\{\d+(?:,\d*)?\})\+/.test( + n, + ) || + r.includes(`r`) || + (r.includes(`J`) && /\(\? 0 && n[e - 1] !== `(`) || + (t === `}` && /\{\d+(?:,\d*)?\}$/.test(c))) && + (n[e + 1] === `?` ? e++ : (c += `?`))); + } + r.includes(`A`) && (c = `(? n.findIndex((t) => t.id === e.id) === t); +} +function o(e) { + return Object.fromEntries( + e.filter((e) => e.kind !== `explain`).map((e) => [e.id, (e.kind, ``)]), + ); +} +function s(e, t) { + for (let n of e) { + if (n.kind === `explain`) continue; + let e = t[n.id], + r = + n.kind === `boolean` + ? e === !0 || e === 1 || e === `1` + ? `1` + : `` + : String(e ?? ``).trim(); + if (n.required && !r) throw Error(`请填写${n.label}`); + if (r) { + if (n.kind === `select` && !n.options.some((e) => e.value === r)) + throw Error(`${n.label}选项无效`); + if (n.pattern && !n.patternServerOnly) { + let e; + try { + e = new RegExp(n.pattern, n.patternFlags); + } catch { + throw Error(`${n.label}验证规则无效`); + } + if (!e.test(r)) throw Error(`${n.label}格式不正确`); + } + } + } +} +export { s as i, i as n, a as r, o as t }; diff --git a/app/lib/product-name.js b/app/lib/product-name.js new file mode 100644 index 0000000..2d1f6e1 --- /dev/null +++ b/app/lib/product-name.js @@ -0,0 +1,17 @@ +function e(e) { + return typeof e == `string` && /-L\s*$/.test(e); +} +function t(e) { + return typeof e == `string` ? e.replace(/-L\s*$/, ``).trim() : ``; +} +function n(n, r) { + if (!n) return ``; + let i = [...new Set(r.filter((t) => e(t)).map((e) => e.trim()))].sort( + (e, t) => t.length - e.length, + ); + if (!i.length) return n; + let a = i.map((e) => e.replace(/[.*+?^${}()|[\]\\]/g, `\\$&`)).join(`|`), + o = RegExp(`(? t(e)); +} +export { t as n, n as r, e as t }; diff --git a/app/lib/product-order-module.js b/app/lib/product-order-module.js new file mode 100644 index 0000000..7a562dd --- /dev/null +++ b/app/lib/product-order-module.js @@ -0,0 +1,23 @@ +function e(e) { + let t = typeof e.module == `string` ? e.module.trim() : ``, + n = typeof e.res_module == `string` ? e.res_module.trim() : ``; + if (t === `mf_dcim`) return `mf_dcim`; + if (t === `remf_dcim` || (!t && n === `mf_dcim`)) return `remf_dcim`; +} +async function t(t, n) { + let r = typeof n.module == `string` ? n.module.trim() : ``, + i = e(n); + if (i) return i; + if (r && r !== `mf_cloud`) return r; + let a = await t.get(`/product/${n.id}/config_option`), + o = typeof a?.module == `string` ? a.module.trim() : ``, + s = + e({ + module: o, + res_module: typeof a?.res_module == `string` ? a.res_module.trim() : ``, + }) || (!r && n.res_module === `mf_dcim` ? `remf_dcim` : void 0); + if (s) return s; + if (!o) throw Error(`商品配置类型加载失败,请重试`); + return o; +} +export { t }; diff --git a/app/lib/purchase-limit-state.js b/app/lib/purchase-limit-state.js new file mode 100644 index 0000000..b24051f --- /dev/null +++ b/app/lib/purchase-limit-state.js @@ -0,0 +1,48 @@ +import { ref } from "vue"; +function t(t) { + let n = ref(!1), + r = ref(!1), + i = ref(!1), + a = ref(``), + o = 0; + function s() { + (o++, (n.value = !1), (r.value = !1), (i.value = !1), (a.value = ``)); + } + async function c(e) { + let s = ++o; + ((n.value = !0), (r.value = !1), (i.value = !1), (a.value = ``)); + try { + let n = await t(e); + if (s !== o) return; + if ( + !n || + typeof n != `object` || + !(`allowed` in n) || + typeof n.allowed != `boolean` || + !(`message` in n) || + typeof n.message != `string` + ) + throw Error(`限购检查暂时不可用,请重试`); + ((i.value = n.allowed), + (a.value = n.allowed + ? `` + : n.message || `此商品已达到购买限制,请调整数量后重试`)); + } catch (e) { + s === o && + (a.value = + (e instanceof Error ? e.message : ``) || + `限购检查暂时不可用,请重试`); + } finally { + s === o && ((n.value = !1), (r.value = !0)); + } + } + return { + pending: n, + checked: r, + allowed: i, + message: a, + check: c, + reset: s, + }; +} +export { t }; diff --git a/app/lib/remote-console.js b/app/lib/remote-console.js new file mode 100644 index 0000000..677d050 --- /dev/null +++ b/app/lib/remote-console.js @@ -0,0 +1,21 @@ +var e = new Set([ + `kky_ecs`, + `mf_cloud`, + `remf_cloud`, + `mf_dcim`, + `remf_dcim`, + `remf_finance`, + `remf_finance_dcim`, + `remf_finance_common`, + `idcsmart_common`, +]); +function t(t, n) { + let r = String(t); + if (!/^[1-9]\d{0,9}$/.test(r) || !e.has(n)) + throw Error(`实例信息无效,请刷新后重试`); + return `/remote-console?hostId=${r}&module=${n}`; +} +function n(e, n) { + window.open(t(e, n), `_blank`, `noopener,noreferrer`); +} +export { n as t }; diff --git a/app/lib/renewal-quote.js b/app/lib/renewal-quote.js new file mode 100644 index 0000000..d987e14 --- /dev/null +++ b/app/lib/renewal-quote.js @@ -0,0 +1,34 @@ +function e(e) { + return (e ?? []).map((e) => ({ + ...e, + name_show: e.name_show?.trim() || e.billing_cycle, + })); +} +function t(e) { + if (!e || typeof e != `object` || !(`status` in e)) return !1; + let t = e.status; + return typeof t == `number` + ? [0, 408, 429, 500, 502, 503, 504].includes(t) + ? !0 + : t === 400 && + `message` in e && + typeof e.message == `string` && + /稍后重试|服务暂不可用|系统繁忙/u.test(e.message) + : !1; +} +function n(e) { + return t(e) + ? `暂时无法获取续费价格,请重新获取或稍后重试` + : e instanceof Error + ? e.message + : `获取续费信息失败`; +} +async function r(e, n) { + try { + return await e(); + } catch (r) { + if (!n() || !t(r)) throw r; + return e(); + } +} +export { n, e as r, r as t }; diff --git a/app/lib/rolldown-runtime.js b/app/lib/rolldown-runtime.js new file mode 100644 index 0000000..4fed41f --- /dev/null +++ b/app/lib/rolldown-runtime.js @@ -0,0 +1,72 @@ +var e = Object.create, + t = Object.defineProperty, + n = Object.getOwnPropertyDescriptor, + r = Object.getOwnPropertyNames, + i = Object.getPrototypeOf, + a = Object.prototype.hasOwnProperty, + o = (e, t) => () => ( + t || + (e( + (t = { + exports: {}, + }).exports, + t, + ), + (e = null)), + t.exports + ), + s = (e, n) => { + let r = {}; + for (var i in e) + t(r, i, { + get: e[i], + enumerable: !0, + }); + return ( + n || + t(r, Symbol.toStringTag, { + value: `Module`, + }), + r + ); + }, + c = (e, i, o, s) => { + if ((i && typeof i == `object`) || typeof i == `function`) + for (var c = r(i), l = 0, u = c.length, d; l < u; l++) + ((d = c[l]), + !a.call(e, d) && + d !== o && + t(e, d, { + get: ((e) => i[e]).bind(null, d), + enumerable: !(s = n(i, d)) || s.enumerable, + })); + return e; + }, + l = (n, r, o) => ( + (o = n == null ? {} : e(i(n))), + c( + r || !n || !n.__esModule || !a.call(n, `default`) + ? t(o, `default`, { + value: n, + enumerable: !0, + }) + : o, + n, + ) + ), + u = ((e) => + typeof require < `u` + ? require + : typeof Proxy < `u` + ? new Proxy(e, { + get: (e, t) => (typeof require < `u` ? require : e)[t], + }) + : e)(function (e) { + if (typeof require < `u`) return require.apply(this, arguments); + throw Error( + 'Calling `require` for "' + + e + + "\" in an environment that doesn't expose the `require` function. See https://rolldown.rs/in-depth/bundling-cjs#require-external-modules for more details.", + ); + }); +export { l as i, s as n, u as r, o as t }; diff --git a/app/lib/sanitize.js b/app/lib/sanitize.js new file mode 100644 index 0000000..8d8c8fe --- /dev/null +++ b/app/lib/sanitize.js @@ -0,0 +1,122 @@ +var e = new Set( + `a.p.br.hr.div.span.h1.h2.h3.h4.h5.h6.b.strong.i.em.u.s.del.ins.sub.sup.small.mark.blockquote.pre.code.kbd.ul.ol.li.dl.dt.dd.table.thead.tbody.tfoot.tr.th.td.caption.colgroup.col.img.figure.figcaption`.split( + `.`, + ), + ), + t = new Set([ + `script`, + `style`, + `iframe`, + `object`, + `embed`, + `link`, + `meta`, + `base`, + `form`, + `input`, + `button`, + `textarea`, + `select`, + `option`, + `template`, + `noscript`, + `noembed`, + `noframes`, + `xmp`, + `plaintext`, + `svg`, + `math`, + `audio`, + `video`, + `source`, + ]); +function n(e, t = !1) { + if (!e || /[\u0000-\u001f\u007f]/.test(e)) return !1; + if ( + t && + /^data:image\/(?:png|jpeg|gif|webp|avif);base64,[a-z\d+/]+={0,2}$/i.test(e) + ) + return !0; + try { + let n = new URL(e, `https://sanitizer.invalid/`).protocol; + return ( + n === `https:` || + n === `http:` || + (!t && (n === `mailto:` || n === `tel:`)) + ); + } catch { + return !1; + } +} +function r(r) { + if (!r) return ``; + let i = new DOMParser().parseFromString(r, `text/html`), + a = i.createElement(`div`); + function o(r, a) { + if (r.nodeType === 3) { + a.appendChild(i.createTextNode(r.textContent ?? ``)); + return; + } + if (r.nodeType !== 1) return; + let s = r, + c = s.localName; + if (s.namespaceURI !== `http://www.w3.org/1999/xhtml` || t.has(c)) return; + let l = a; + if (e.has(c)) { + let e = i.createElement(c); + for (let t of Array.from(s.attributes)) { + let r = t.name.toLowerCase(), + i = t.value.trim(); + t.namespaceURI === null && + (r === `title` || (r === `alt` && c === `img`) + ? e.setAttribute(r, t.value) + : r === `style` && + /^(p|div|h[1-6])$/.test(c) && + /^text-align:\s*(left|center|right|justify);?$/i.test(i) + ? e.setAttribute(`style`, i.toLowerCase()) + : ((r === `dir` && /^(ltr|rtl|auto)$/.test(i)) || + (r === `href` && c === `a` && n(i)) || + (r === `src` && c === `img` && n(i, !0)) || + (r === `target` && + c === `a` && + /^(?:_blank|_self)$/.test(i)) || + (r === `scope` && + c === `th` && + /^(?:row|col|rowgroup|colgroup)$/.test(i)) || + ((((r === `colspan` || r === `rowspan`) && + (c === `td` || c === `th`)) || + ((r === `width` || r === `height`) && c === `img`) || + (r === `span` && (c === `col` || c === `colgroup`)) || + (r === `start` && c === `ol`)) && + /^\d{1,4}$/.test(i) && + Number(i) > 0)) && + e.setAttribute(r, i)); + } + (c === `a` && + e.getAttribute(`target`) === `_blank` && + e.setAttribute(`rel`, `noopener noreferrer`), + a.appendChild(e), + (l = e)); + } + for (let e of Array.from(r.childNodes)) o(e, l); + } + for (let e of Array.from(i.body.childNodes)) o(e, a); + return a.innerHTML; +} +function i(e) { + if (!e) return ``; + let t = e; + for ( + let e = 0; + e < 2 && /&(?:amp|lt|gt|quot|#\d+|#x[0-9a-f]+);/i.test(t); + e++ + ) { + let e = + new DOMParser().parseFromString(t, `text/html`).documentElement + .textContent ?? t; + if (e === t) break; + t = e; + } + return t; +} +export { r as n, i as t }; diff --git a/app/lib/server-page.js b/app/lib/server-page.js new file mode 100644 index 0000000..785d8de --- /dev/null +++ b/app/lib/server-page.js @@ -0,0 +1,253 @@ +var e = new Set([3997, 5174, 5226, 5227, 5631, 5914, 6243]); +function t(t) { + return t.module === `idcsmart_common` && e.has(Number(t.product_id)); +} +function n(e, n, r) { + if (r !== void 0 && (!Number.isSafeInteger(r) || r <= 0)) + throw Error(`服务器导航参数无效`); + let i = (e) => e.replace(/^re(?=mf_|whmcs_)/, ``), + a = new Set(n.map(i)), + o = + r !== void 0 || + a.has(`mf_finance`) || + a.has(`mf_finance_dcim`) || + a.has(`idcsmart_common`), + s = [...new Set([...n, `idcsmart_common`])].join(`,`), + c = new Map(), + l = new Map(), + u = new Map(), + d = 0, + f, + p, + m = new Map(); + function h(t) { + let i = + r === void 0 + ? { + ...t, + module: s, + display_modules: n.join(`,`), + server_page: `classified-v1`, + } + : { + ...t, + m: r, + }, + a = JSON.stringify(i), + o = m.get(a); + if (!o) { + ((o = + r === void 0 + ? e.get(`/host`, i) + : e.get(`/home/host`, i).then((e) => ({ + ...e, + server_page: `classified-v1`, + }))), + m.set(a, o)); + let t = o, + n = () => { + m.get(a) === t && m.delete(a); + }; + o.then(n, n); + } + return o; + } + async function g(t, n) { + let a = t.product_id || -t.id; + if (c.has(a)) return c.get(a); + if (l.has(a)) return l.get(a); + let o = e.get(`/host/${t.id}/view`).then((e) => { + if (!e.module) throw Error(`服务器分类信息加载失败,请重试`); + let t = r === void 0 ? i(e.module) : e.module; + return (n === d && c.set(a, t), t); + }); + l.set(a, o); + try { + return await o; + } finally { + l.get(a) === o && l.delete(a); + } + } + async function _(n, o, c) { + let l = [], + u = {}, + p = new Set(), + m = new Set(); + for (let t = 1; ; t++) { + let r = + t === 1 && c + ? c + : f === !1 + ? await e.get(`/host`, { + ...n, + module: s, + page: t, + limit: 100, + }) + : await h({ + ...n, + orderby: `id`, + page: t, + limit: 100, + }), + i = r.server_page === `classified-v1`; + (t === 1 && + (u = { + select_field: r.select_field, + self_defined_field: r.self_defined_field, + }), + o === d && (f = i)); + let a = Array.isArray(r.list) ? r.list : [], + g = 0; + for (let e of a) + (i && m.add(Number(e.id)), + p.has(Number(e.id)) || + (p.add(Number(e.id)), + l.push({ + ...e, + }), + g++)); + if (l.length >= Number(r.count ?? l.length)) break; + if (!a.length || !g) throw Error(`服务器列表分页未返回完整数据,请重试`); + } + let _ = [ + ...new Map( + l + .filter( + (e) => e.module === `idcsmart_common` && !m.has(Number(e.id)), + ) + .map((e) => [e.product_id || -e.id, e]), + ).values(), + ], + v = 0, + y = new Map(); + await Promise.all( + Array.from( + { + length: Math.min(4, _.length), + }, + async () => { + for (; v < _.length;) { + let e = _[v++]; + y.set(e.product_id || -e.id, await g(e, o)); + } + }, + ), + ); + for (let e of l) + e.module === `idcsmart_common` && + !m.has(Number(e.id)) && + (e.module = y.get(e.product_id || -e.id)); + let b = + r === void 0 + ? l.filter((e) => (t(e) ? a.has(`mf_dcim`) : a.has(i(e.module || ``)))) + : l; + if (n.orderby === `dedicate_ip` || n.orderby === `name`) { + let e = n.orderby; + b.sort( + (t, r) => + String(t[e] || ``).localeCompare(String(r[e] || ``), `zh-CN`, { + numeric: !0, + }) * (n.sort === `asc` ? 1 : -1), + ); + } + return { + ...u, + list: b, + }; + } + async function v(t) { + if (!o) return e.get(`/host`, t); + let n = Object.fromEntries( + Object.entries(t) + .filter(([e]) => ![`page`, `limit`, `module`].includes(e)) + .sort(([e], [t]) => e.localeCompare(t)), + ), + r = JSON.stringify(n), + i = d, + a; + if (f !== !1 && ![`name`, `dedicate_ip`].includes(String(t.orderby))) { + let e = { + ...n, + page: Math.max(1, Number(t.page) || 1), + limit: Math.max(1, Number(t.limit) || 10), + }, + o = JSON.stringify(e), + s, + c = !0; + if (f === !0) s = await h(e); + else { + (!p || p.version !== i) && + (p = { + key: r, + pageKey: o, + version: i, + promise: h(e), + }); + let t = p; + try { + s = await t.promise; + } catch (e) { + throw (p === t && (p = void 0), e); + } + ((c = t.key === r), + s.server_page === `classified-v1` && + t.pageKey !== o && + (s = await h(e)), + p === t && (p = void 0)); + } + if (s.server_page === `classified-v1`) + return ( + i === d && (f = !0), + { + ...s, + list: s.list.map((e) => ({ + ...e, + })), + } + ); + (i === d && (f = !1), + c && + Array.isArray(s.list) && + Number(s.count) === s.list.length && + (a = s)); + } + let s = Date.now(); + for (let [e, t] of u) t.expires <= s && u.delete(e); + let c = u.get(r); + if (!c) { + (u.size >= 4 && u.delete(u.keys().next().value), + (c = { + expires: 1 / 0, + promise: _(n, i, a), + })); + let e = c; + (i === d && u.set(r, e), + e.promise.then( + () => { + e.expires = Date.now() + 3e4; + }, + () => { + u.get(r) === e && u.delete(r); + }, + )); + } + let l = await c.promise, + m = l.list, + g = Math.max(1, Number(t.limit) || 10), + v = (Math.max(1, Number(t.page) || 1) - 1) * g; + return { + ...l, + list: m.slice(v, v + g).map((e) => ({ + ...e, + })), + count: m.length, + }; + } + return Object.assign(v, { + invalidate(e = !1) { + (d++, u.clear(), m.clear(), (p = void 0), e && (c.clear(), l.clear())); + }, + }); +} +export { t as n, n as t }; diff --git a/app/lib/storage-capacity.js b/app/lib/storage-capacity.js new file mode 100644 index 0000000..0552382 --- /dev/null +++ b/app/lib/storage-capacity.js @@ -0,0 +1,466 @@ +import { n as product_fields_n } from "~/lib/product-fields.js"; +import { t as bandwidth_display_t } from "~/lib/bandwidth-display.js"; +var n = new Set([4, 7, 9, 11, 14, 15, 16, 17, 18, 19]), + r = new Set([1, 2, 6, 8, 10, 13, 20]); +function i(e) { + return typeof e == `object` && e && !Array.isArray(e) ? e : null; +} +function a(e) { + return typeof e == `string` ? e : typeof e == `number` ? String(e) : ``; +} +function o(e) { + return e === !0 || e === 1 || e === `1`; +} +function s(e) { + throw Error(`${e},请刷新重试或联系客服`); +} +function c(e, t, n = 0) { + ((typeof e != `number` && typeof e != `string`) || String(e).trim() === ``) && + s(t); + let r = Number(e); + return ((!Number.isFinite(r) || r < n) && s(t), r); +} +function l(e) { + let t = c(e, `商品配置标识无效`, 1); + return (Number.isSafeInteger(t) || s(`商品配置标识无效`), t); +} +function u(e, t = `商品配置数据不完整`) { + return (Array.isArray(e) || s(t), e); +} +function d(e) { + return ( + (!e.length || new Set(e.map((e) => e.value)).size !== e.length) && + s(`商品配置选项不完整`), + e + ); +} +function f(e) { + let t = `(?:第\\s*)?(?:[一二三四五六七八九十百零〇两]+|[0-90-9]+)\\s*区`; + return e + .replace(RegExp(`[((]\\s*${t}\\s*[))]`, `g`), ``) + .replace(RegExp(t, `g`), ``) + .replace(/\s{2,}/g, ` `) + .replace(/^[\s\-—_/·]+|[\s\-—_/·]+$/g, ``) + .trim(); +} +function p(e, n) { + if (n === 5) { + let t = i(e.sub); + return ( + t || s(`操作系统配置不完整`), + d( + Object.entries(t).flatMap(([e, t]) => + u(i(t)?.child).map((t) => { + let n = i(t); + return ( + n || s(`操作系统配置不完整`), + { + value: l(n.id), + label: a(n.version || n.option_name).trim() || e, + group: e, + } + ); + }), + ), + ) + ); + } + return d( + n === 12 + ? u(e.sub).flatMap((e) => { + let t = i(e); + return ( + t || s(`区域配置不完整`), + u(t.area).map((e) => { + let n = i(e); + n || s(`区域配置不完整`); + let r = [f(a(t.option_name)), f(a(n.area_zh || n.area))].filter( + Boolean, + ); + return { + value: l(n.id), + label: [...new Set(r)].join(` / `) || `默认区域`, + }; + }) + ); + }) + : u(e.sub).map((e) => { + let n = i(e); + n || s(`商品配置选项不完整`); + let r = l(n.id); + return { + value: r, + label: bandwidth_display_t(a(n.option_name).trim()) || String(r), + }; + }), + ); +} +function m(e) { + let t = i(e); + t || s(`商品配置数据不完整`); + let o = c(t.option_type, `商品配置类型无效`); + !r.has(o) && + !n.has(o) && + ![3, 5, 12].includes(o) && + s(`该商品配置类型暂不支持`); + let d = { + id: String(l(t.id)), + label: a(t.option_name).trim() || `配置选项`, + kind: + o === 20 + ? `cascade` + : o === 3 + ? `boolean` + : o === 5 + ? `os` + : n.has(o) + ? `quantity` + : `choice`, + choices: [], + min: 0, + max: 0, + step: 1, + unit: a(t.unit) || (o === 14 ? `GB` : ``), + description: a(t.notes), + }; + if (d.kind === `boolean`) + return ( + (d.max = 1), + (d.choices = [ + { + value: 0, + label: `否`, + }, + { + value: 1, + label: `是`, + }, + ]), + d + ); + if (d.kind !== `quantity`) return ((d.choices = p(t, o)), d); + if ( + ((d.min = c(t.qty_minimum, `商品数量配置无效`)), + (d.max = c(t.qty_maximum, `商品数量配置无效`, d.min)), + d.max === 0) + ) + return null; + d.step = + t.qty_stage === void 0 || t.qty_stage === null || t.qty_stage === `` + ? 1 + : c(t.qty_stage, `商品数量步长配置无效`, Number.MIN_VALUE); + let f = u(t.sub) + .map((e) => { + let t = i(e); + t || s(`商品数量范围配置无效`); + let n = Math.max(d.min, c(t.qty_minimum, `商品数量范围配置无效`)), + r = Math.min(d.max, c(t.qty_maximum, `商品数量范围配置无效`)); + return r < n + ? null + : { + min: n, + max: r, + step: d.step, + }; + }) + .filter((e) => e !== null); + return ( + (!f.length || !f.some((e) => e.min === d.min)) && + s(`商品数量范围配置不完整`), + (d.ranges = f), + d + ); +} +function h(e, t) { + let n = i(e); + return { + show: o(n?.show), + editable: o(n?.modify), + value: a(n?.[t]), + }; +} +function g(t) { + if (t == null) return []; + let n = u(t, `自定义字段配置不完整`).map((t) => { + let n = i(t); + n || s(`自定义字段配置不完整`); + let r = { + text: `text`, + password: `password`, + textarea: `textarea`, + dropdown: `select`, + tickbox: `boolean`, + checkbox: `boolean`, + link: `link`, + explain: `explain`, + }[a(n.field_type)]; + r || s(`该商品自定义字段类型暂不支持`); + let c = product_fields_n(n.regexpr), + u = []; + if (r === `select`) { + let e = + typeof n.field_option == `string` + ? n.field_option.split(`,`) + : Array.isArray(n.field_option) && + n.field_option.every((e) => typeof e == `string`) + ? n.field_option + : []; + ((u = [...new Set(e.map((e) => e.trim()).filter(Boolean))].map((e) => ({ + value: e, + label: e, + }))), + u.length || s(`自定义字段选项不完整`)); + } + return { + id: String(l(n.id)), + label: a(n.field_name).trim() || `自定义字段`, + kind: r, + required: o(n.is_required), + ...c, + explain: a(n.explain_content), + options: u, + description: a(n.description), + }; + }); + return ( + new Set(n.map((e) => e.id)).size !== n.length && s(`自定义字段标识重复`), + n + ); +} +function _(e) { + let t = i(e), + n = i(t?.product) ? t : i(t?.data), + r = i(n?.product); + ((!n || !r || (n.status !== void 0 && Number(n.status) !== 200)) && + s(`商品配置数据不完整`), + n.links !== void 0 && + n.links !== null && + !Array.isArray(n.links) && + s(`商品联动配置数据不完整`)); + let l = u(n.option) + .map(m) + .filter((e) => e !== null); + new Set(l.map((e) => e.id)).size !== l.length && s(`商品配置标识重复`); + let d = u(r.cycle, `商品周期配置不完整`).map((e) => { + let t = i(e), + n = a(t?.billingcycle).trim(); + return ( + n || s(`商品周期配置不完整`), + { + value: n, + label: a(t?.billingcycle_zh).trim() || n, + } + ); + }); + (!d.length || new Set(d.map((e) => e.value)).size !== d.length) && + s(`商品周期配置不完整`); + let f = o(r.stock_control) ? c(r.qty, `商品库存配置无效`) : null; + return ( + f !== null && !Number.isSafeInteger(f) && s(`商品库存配置无效`), + { + options: l, + cycles: d, + allowQty: o(n.allow_qty ?? r.allow_qty), + stock: f, + hostname: h(r.host, `host`), + password: h(r.password, `password`), + customFields: g(n.custom_fields), + links: v(n.links ?? [], l), + linkDefinitions: JSON.parse(JSON.stringify(n.links ?? [])), + } + ); +} +function v(e, t) { + let n = new Map(t.map((e) => [e.id, e])); + function r(e) { + let t = i(e), + r = String(l(t?.config_id)), + o = n.get(r); + (!o || ![`seq`, `sneq`].includes(a(t?.relation))) && + s(`商品联动配置数据不完整`); + let u = i(t?.sub_id); + (!u || !Object.keys(u).length) && s(`商品联动选项不完整`); + let d = + o.kind === `quantity` + ? Object.values(u).map((e) => { + let t = i(e), + n = c(t?.qty_minimum, `商品联动数量范围无效`); + return { + min: n, + max: c(t?.qty_maximum, `商品联动数量范围无效`, n), + }; + }) + : [], + f = []; + if (o.kind !== `quantity`) + for (let e of Object.keys(u)) { + if (!/^\d+$/.test(e)) return null; + let t = Number(e); + if ( + !Number.isSafeInteger(t) || + (o.kind === `cascade` && t <= 0) || + !o.choices.some((e) => e.value === t) + ) + return null; + f.push(t); + } + return { + optionId: r, + relation: t.relation, + values: f, + ranges: d, + }; + } + return u(e).flatMap((e) => { + let t = i(e); + if ((t || s(`商品联动配置数据不完整`), !n.has(String(t.config_id)))) + return []; + let a = r(t); + if (!a) return []; + let o = u(t.result, `商品联动结果不完整`); + o.length || s(`商品联动结果不完整`); + let c = o.filter((e) => n.has(String(i(e)?.config_id))); + if (!c.length) return []; + let l = c.map(r); + return l.some((e) => e === null) + ? [] + : [ + { + ...a, + results: l, + }, + ]; + }); +} +function y(e, t) { + let n = + e.values.includes(t) || + e.ranges.some((e) => t !== void 0 && t >= e.min && t <= e.max); + return e.relation === `seq` ? n : !n; +} +function b(e, t, n) { + let r = t.filter((e) => y(e, n[e.optionId])).flatMap((e) => e.results); + return e.map((e) => { + let t = r.filter((t) => t.optionId === e.id); + if (!t.length) return e; + if (e.kind !== `quantity`) + return { + ...e, + choices: e.choices.filter((e) => t.every((t) => y(t, e.value))), + }; + let n = e.ranges ?? [ + { + min: e.min, + max: e.max, + step: e.step, + }, + ]; + for (let e of t) { + let t = []; + for (let r of n) { + let n = [ + ...new Set([ + 0, + Math.floor((r.max - r.min) / r.step + 1e-7) + 1, + ...e.ranges.flatMap((e) => [ + Math.max(0, Math.ceil((e.min - r.min) / r.step - 1e-7)), + Math.floor((e.max - r.min) / r.step + 1e-7) + 1, + ]), + ]), + ] + .filter( + (e) => + e >= 0 && e <= Math.floor((r.max - r.min) / r.step + 1e-7) + 1, + ) + .sort((e, t) => e - t); + for (let i = 0; i < n.length - 1; i++) { + let a = Number((r.min + n[i] * r.step).toFixed(8)), + o = Number((r.min + (n[i + 1] - 1) * r.step).toFixed(8)); + o >= a && + y(e, a) && + t.push({ + min: a, + max: o, + step: r.step, + }); + } + } + n = t; + } + return { + ...e, + ranges: n, + min: n[0]?.min ?? 0, + max: n.at(-1)?.max ?? -1, + }; + }); +} +function x(e, t) { + let n = u( + i(u(e, `商品级联配置数据不完整`)[0])?.son, + `商品级联配置数据不完整`, + ), + r = {}; + return { + options: n.map((e) => { + let n = i(e); + n || s(`商品级联配置数据不完整`); + let a = m({ + ...n, + option_type: 20, + }); + (a.id === t || r[a.id] !== void 0) && s(`商品级联配置标识重复`); + let o = l(n.checkSubId); + return ( + a.choices.some((e) => e.value === o) || s(`商品级联默认配置无效`), + (r[a.id] = o), + { + ...a, + cascadeRoot: t, + } + ); + }), + values: r, + }; +} +function S(e) { + let t = /^([kmgtpe])(?:i?b)?$|^(b)$/i.exec(e.trim()); + return t + ? t[2] + ? `B` + : `${t[1].toUpperCase()}${/ib$/i.test(e.trim()) ? `iB` : `B`}` + : ``; +} +function C(e, t = ``) { + let n = e.normalize(`NFKC`).trim(); + if (!n || /[×*¥¥$€]|(?:^|[\s([{])[-+]\s*\d/.test(n)) return null; + let r = [...n.matchAll(/\d+(?:\.\d+)?\s*(?:[kmgtpe](?:i?b)?|b)(?![a-z])/gi)], + i = r[0], + a = ``; + if (r.length === 1) a = S(/[a-z]+$/i.exec(i[0])?.[0] ?? ``); + else if (r.length === 0 && S(t)) { + let e = [...n.matchAll(/\d+(?:\.\d+)?/g)]; + if (e.length !== 1) return null; + ((i = e[0]), (a = S(t))); + } else return null; + if (!i || !a) return null; + let o = Number(/^\d+(?:\.\d+)?/.exec(i[0])?.[0]); + if (!Number.isFinite(o)) return null; + let s = n.slice(0, i.index) + n.slice(i.index + i[0].length), + c = [...s.matchAll(/NVMe|SSD|HDD|SAS|SATA/gi)].map((e) => + e[0].toUpperCase() === `NVME` ? `NVMe` : e[0].toUpperCase(), + ); + return s + .replace( + /NVMe|SSD|HDD|SAS|SATA|免费赠送|免费|赠送|系统盘|数据盘|云硬盘|云磁盘|云盘|硬盘|磁盘|存储|容量|高性能|高效|普通|标准|通用型|性能型|弹性|本地/gi, + ``, + ) + .replace(/[\s()[\]{}::·]/g, ``) + ? null + : { + size: o, + unit: a, + type: [...new Set(c)].join(` `), + }; +} +export { _ as a, v as i, b as n, x as r, C as t }; diff --git a/app/lib/ticketAttachments.js b/app/lib/ticketAttachments.js new file mode 100644 index 0000000..145ccb1 --- /dev/null +++ b/app/lib/ticketAttachments.js @@ -0,0 +1,86 @@ +function e(e) { + if ( + !/^(?:https?:\/\/|\/(?!\/)|\.\.?\/)/i.test(e) || + /[\u0000-\u001f\u007f\\]/.test(e) + ) + return !1; + try { + let t = new URL(e, `https://attachment.invalid/`); + return t.protocol === `http:` || t.protocol === `https:`; + } catch { + return !1; + } +} +function t(t) { + return ( + !!t.href && + e(t.href) && + /\.(?:avif|bmp|gif|ico|jpe?g|png|webp)$/i.test(t.name) + ); +} +function n(e, t) { + let n = + e + .split(`/`) + .at(-1) + ?.split(/\^|%5e/i) + .at(-1) || t; + try { + n = decodeURIComponent(n); + } catch {} + return n.split(`^`).at(-1) || t; +} +function r(t) { + return Array.isArray(t) + ? t.map((t, r) => { + let i = `附件 ${r + 1}`, + a = t && typeof t == `object` && !Array.isArray(t) ? t : null; + if ( + typeof t != `string` && + (!a || + ![`url`, `name`, `save_name`].some((e) => typeof a[e] == `string`)) + ) + return { + name: `${i}(格式暂不支持)`, + href: null, + }; + let o = typeof t == `string` ? t : a?.url, + s = typeof o == `string` ? o.trim() : ``, + c = typeof a?.name == `string` ? a.name.trim() : ``, + l = typeof a?.save_name == `string` ? a.save_name.trim() : ``, + u = c || (l ? n(l, i) : ``), + d = + l || + (typeof o == `string` && !e(o) && !/[\\/:\u0000-\u001f]/.test(o) + ? o + : ``), + f = { + name: u || (d ? n(d, i) : `${i}(地址不可用)`), + href: null, + ...(d + ? { + storageName: d, + } + : {}), + }; + if (!e(s)) return f; + try { + let e = new URL(s, `https://attachment.invalid/`); + return e.protocol !== `http:` && e.protocol !== `https:` + ? f + : { + name: u || n(e.pathname, i), + href: s, + ...(d + ? { + storageName: d, + } + : {}), + }; + } catch { + return f; + } + }) + : []; +} +export { r as n, t }; diff --git a/app/lib/useCaptcha.js b/app/lib/useCaptcha.js new file mode 100644 index 0000000..6e10605 --- /dev/null +++ b/app/lib/useCaptcha.js @@ -0,0 +1,202 @@ +import { onMounted } from "vue"; +import { watch } from "vue"; +import { onScopeDispose } from "vue"; +import { ref } from "vue"; +import { ApiError } from "~/lib/auth.js"; +import { useApi } from "~/lib/auth.js"; +import { t as useSiteConfig_t } from "~/lib/useSiteConfig.js"; +var s = (e) => e === !0 || e === 1 || e === `1`; +function c(e, t) { + return s(e?.[`captcha_client_${t}`]) + ? !0 + : t === `login` && + s(e?.captcha_client_login_error) && + s(e?.captcha_client_login_error_3_times); +} +function l(e) { + if (typeof e != `string` || e.length > 262144) throw Error(`验证码响应无效`); + let t = new DOMParser().parseFromString(e, `text/html`), + n = t.querySelector(`[data-captcha-provider]`); + if (n) { + let e = n.getAttribute(`data-captcha-id`) ?? ``; + if ( + n.getAttribute(`data-captcha-provider`) !== `geetest` || + !/^[a-f0-9]{32}$/i.test(e) + ) + throw Error(`验证码服务尚未配置完成,请联系管理员`); + return { + provider: `geetest`, + captchaId: e, + }; + } + if ( + e.includes(`/captcha/tp_captcha/index/refresh`) && + t.querySelector(`#captcha-img`) + ) + return { + provider: `image`, + captchaId: ``, + }; + throw Error(`当前验证码插件暂不受支持,请联系管理员`); +} +function u(e) { + if (!e || typeof e != `object`) return !1; + let t = e; + return [`lot_number`, `captcha_output`, `pass_token`, `gen_time`].every( + (e) => + typeof t[e] == `string` && t[e].trim().length > 0 && t[e].length <= 8192, + ); +} +function d(d) { + let f = useSiteConfig_t(), + p = useApi(), + m = ref(!1), + h = ref(`image`), + g = ref(``), + _ = ref(``), + v = ref(``), + y = ref(``), + b = ref(!1), + x = ref(``), + S = ref(!(!d || f.config.value)), + C = !1, + w = 0, + T = null, + E = !1; + function D() { + ((y.value = ``), (v.value = ``)); + } + async function O() { + if (C || b.value) return; + let e = ++w; + ((b.value = !0), + (x.value = ``), + D(), + (_.value = ``), + (g.value = ``), + (T = new AbortController())); + let t = T, + n = setTimeout(() => t.abort(), 1e4); + try { + let n = await p.get(`/captcha`, void 0, !1, { + timeoutMs: 1e4, + }); + if (C || e !== w) return; + let r = l(n.html); + if ( + ((h.value = r.provider), + (g.value = r.captchaId), + r.provider === `geetest`) + ) + return; + let i = await fetch(`/captcha/tp_captcha/index/refresh`, { + headers: { + Accept: `application/json`, + }, + signal: t.signal, + cache: `no-store`, + }), + a = await i.json(); + if (C || e !== w) return; + if ( + !i.ok || + typeof a?.base64 != `string` || + !/^data:image\/(?:png|jpeg|gif|webp);base64,/.test(a.base64) || + typeof a?.token != `string` || + !a.token + ) + throw Error(`验证码加载失败`); + ((_.value = a.base64), (v.value = a.token)); + } catch (t) { + if (C || e !== w) return; + x.value = + t instanceof Error && /验证码.*(?:配置|支持)/.test(t.message) + ? t.message + : `验证码加载失败,请点击重新加载`; + } finally { + (clearTimeout(n), !C && e === w && (b.value = !1)); + } + } + function k(e) { + (D(), + !C && + m.value && + h.value === `geetest` && + !b.value && + u(e) && + ((y.value = JSON.stringify({ + lot_number: e.lot_number, + captcha_output: e.captcha_output, + pass_token: e.pass_token, + gen_time: e.gen_time, + })), + (v.value = e.lot_number))); + } + function A() { + return S.value + ? `验证码设置正在加载,请稍候` + : d && !f.config.value + ? `验证码设置加载失败,请刷新页面重试` + : m.value + ? b.value + ? `验证码正在加载,请稍候` + : x.value + ? x.value + : h.value === `geetest` + ? v.value && y.value + ? `` + : `请先完成人机验证` + : v.value + ? y.value.trim() + ? `` + : `请输入图形验证码` + : `请先重新加载图形验证码` + : ``; + } + async function j(e) { + let t = e instanceof ApiError && s(e.data?.captcha); + return (t && ((E = !0), (m.value = !0)), m.value && (await O()), t); + } + return ( + d && + (watch( + () => c(f.config.value, d), + (e) => { + ((m.value = E || e), + m.value + ? O() + : ((w += 1), T?.abort(), (b.value = !1), (x.value = ``), D())); + }, + { + immediate: !0, + }, + ), + onMounted(async () => { + (await f.load(), + !C && + ((S.value = !1), + f.config.value || + (x.value = `验证码设置加载失败,请刷新页面重试`))); + })), + onScopeDispose(() => { + ((C = !0), (w += 1), T?.abort(), D()); + }), + { + needed: m, + provider: h, + captchaId: g, + img: _, + token: v, + value: y, + loading: b, + error: x, + configLoading: S, + load: O, + complete: k, + invalidate: D, + validationError: A, + handleError: j, + } + ); +} +export { d as t }; diff --git a/app/lib/useListPage.js b/app/lib/useListPage.js new file mode 100644 index 0000000..d8db333 --- /dev/null +++ b/app/lib/useListPage.js @@ -0,0 +1,176 @@ +import { onMounted } from "vue"; +import { watch } from "vue"; +import { onScopeDispose } from "vue"; +import { ref } from "vue"; +import { apiCacheKey } from "~/lib/auth.js"; +import { apiCacheVersion } from "~/lib/auth.js"; +import { useApi } from "~/lib/auth.js"; +import { writeApiCache } from "~/lib/auth.js"; +import { readApiCache } from "~/lib/auth.js"; +import { clearApiCache } from "~/lib/auth.js"; +function u(u, d = {}) { + let f = useApi(), + p = + d.identity ?? + (typeof f.identity == `function` ? () => f.identity() : void 0), + m = d.retainOnRefreshError !== !1, + h = ref([]), + g = ref(0), + _ = ref(!1), + v = ref(``), + y = ref(!1), + b = ref(1), + x = ref(d.limit ?? 10), + S = 0, + C = ``, + w = !0, + T = !1, + E = null; + function D() { + (S++, + (h.value = []), + (g.value = 0), + (_.value = !1), + (v.value = ``), + (y.value = !1), + (C = ``), + (E = null), + (w = !1)); + } + (p && + watch( + p, + () => { + (clearApiCache(), D()); + }, + { + flush: `sync`, + }, + ), + onScopeDispose(() => { + ((T = !0), S++, (E = null)); + })); + function O(e) { + if (d.rowKey) return d.rowKey(e); + if ( + e && + typeof e == `object` && + `id` in e && + (typeof e.id == `string` || typeof e.id == `number`) + ) + return e.id; + } + function k() { + if (T) return Promise.resolve(); + let e, + t, + n = p?.(); + try { + ((e = { + page: b.value, + limit: x.value, + ...(d.params?.() ?? {}), + }), + (t = apiCacheKey( + u, + e, + typeof d.snapshotKey == `function` ? d.snapshotKey() : d.snapshotKey, + ))); + } catch (e) { + return ( + D(), + (v.value = e instanceof Error ? e.message : `查询条件无效`), + Promise.resolve() + ); + } + if (E?.query === t && E.identity === n) return E.promise; + let r = ++S, + o = () => !T && r === S && (!p || p() === n); + ((_.value = !0), (v.value = ``)); + let l = y.value && t === C, + k = p ? readApiCache(n, t) : void 0, + A = apiCacheVersion(); + (l || ((h.value = []), (g.value = 0), (y.value = !1)), + w && + k && + ((h.value = k.list), + (g.value = k.count), + (y.value = !0), + (C = t), + (l = !0)), + (w = !1)); + let j = (async () => { + try { + let r = d.loader ? await d.loader(e) : await f.get(u, e); + if (!o()) return; + let i = new Map( + h.value.flatMap((e) => { + let t = O(e); + return t === void 0 ? [] : [[t, e]]; + }), + ); + ((h.value = (r.list ?? []).map((e) => { + let t = O(e), + n = t === void 0 ? void 0 : i.get(t); + if (!n || typeof n != `object` || typeof e != `object` || !e) + return e; + let r = n; + for (let t of Object.keys(r)) + Object.prototype.hasOwnProperty.call(e, t) || delete r[t]; + return (Object.assign(r, e), n); + })), + (g.value = r.count ?? 0), + (y.value = !0), + (C = t), + p && + writeApiCache( + n, + t, + { + list: h.value, + count: g.value, + }, + A, + )); + } catch (e) { + if (!o()) return; + ((v.value = e instanceof Error ? e.message : `加载失败`), + (!m || !l) && ((h.value = []), (g.value = 0), (y.value = !1))); + } finally { + (o() && (_.value = !1), r === S && (E = null)); + } + })(); + return ( + o() && + _.value && + (E = { + query: t, + identity: n, + promise: j, + }), + j + ); + } + function A(e) { + ((b.value = e.page + 1), (x.value = e.rows), k()); + } + function j() { + ((b.value = 1), k()); + } + return ( + d.immediate !== !1 && onMounted(k), + { + list: h, + total: g, + loading: _, + error: v, + hasResult: y, + page: b, + limit: x, + load: k, + onPage: A, + reload: j, + } + ); +} +export { u as t }; diff --git a/app/lib/useMailbox.js b/app/lib/useMailbox.js new file mode 100644 index 0000000..3fc6ade --- /dev/null +++ b/app/lib/useMailbox.js @@ -0,0 +1,48 @@ +import { watch } from "vue"; +import { useState } from "#app"; +import { useApi } from "~/lib/auth.js"; +import { useAuth } from "~/lib/auth.js"; +function i() { + let i = useState(`mail-unread-count`, () => 0), + a = useState(`mail-recent`, () => []), + o = useState(`mail-types`, () => []), + s = useState(`mail-session`, () => null), + c = useState(`mail-request-id`, () => 0), + l = useAuth(), + u = useApi(); + watch( + () => l.token, + (e) => { + s.value !== e && + ((s.value = e), + (c.value += 1), + (i.value = 0), + (a.value = []), + (o.value = [])); + }, + { + immediate: !0, + flush: `sync`, + }, + ); + async function d() { + if (!l.token) return; + let e = l.token, + t = ++c.value; + try { + let n = await u.get(`/client_care/mail`); + if (e !== l.token || t !== c.value) return; + let r = n?.credit_limit; + ((i.value = Number(r?.count ?? 0)), + (a.value = r?.list ?? []), + (o.value = r?.type ?? [])); + } catch {} + } + return { + count: i, + recent: a, + types: o, + refresh: d, + }; +} +export { i as t }; diff --git a/app/lib/useOAuth.js b/app/lib/useOAuth.js new file mode 100644 index 0000000..200639f --- /dev/null +++ b/app/lib/useOAuth.js @@ -0,0 +1,42 @@ +import { onBeforeUnmount } from "vue"; +import { ref } from "vue"; +import { useApi } from "~/lib/auth.js"; +import { r as oauth_r } from "~/lib/oauth.js"; +function i() { + let i = useApi(), + a = ref(!1), + o = ref(``), + s = !0; + onBeforeUnmount(() => { + s = !1; + }); + async function c(e) { + if (s && !a.value) { + if (((o.value = ``), !/^[a-z][a-z0-9_]*$/i.test(e))) { + o.value = `授权方式无效`; + return; + } + a.value = !0; + try { + let t = await i.get(`/oauth/${encodeURIComponent(e)}`); + if (!s) return; + let n = oauth_r(t?.url, window.location.origin); + if (!n) throw Error(`授权地址无效,请联系支持`); + try { + sessionStorage.setItem(`console-oauth-pending`, `1`); + } catch {} + window.location.assign(n); + } catch (e) { + s && (o.value = e instanceof Error ? e.message : `授权失败`); + } finally { + s && (a.value = !1); + } + } + } + return { + busy: a, + error: o, + start: c, + }; +} +export { i as t }; diff --git a/app/lib/useOfficialSiteContent.js b/app/lib/useOfficialSiteContent.js new file mode 100644 index 0000000..a8ae059 --- /dev/null +++ b/app/lib/useOfficialSiteContent.js @@ -0,0 +1,417 @@ +import { useState } from "#app"; +import { useApi } from "~/lib/auth.js"; +var n = { + meta: { + title: `破碎工坊网络 - 云计算与基础设施服务`, + description: `为开发者与企业提供云服务器、物理服务器、机柜托管与网络资源。`, + }, + theme: { + primary: `#0052d9`, + accent: `#eff6ff`, + }, + brand: { + name: `破碎工坊网络`, + tagline: `云计算与基础设施服务`, + logoUrl: ``, + }, + header: { + navigation: [ + { + label: `产品服务`, + href: `#products`, + is_show: !0, + }, + { + label: `订购产品`, + href: `/cart`, + is_show: !0, + }, + { + label: `基础设施`, + href: `#infrastructure`, + is_show: !0, + }, + { + label: `客户评价`, + href: `#reviews`, + is_show: !0, + }, + { + label: `联系我们`, + href: `#contact`, + is_show: !0, + }, + ], + buttonLabel: `进入客户中心`, + buttonHref: `/login`, + }, + hero: { + tag: `面向开发者与企业用户`, + title: `让每一份算力, +都稳定生长。`, + subtitle: `灵活的云基础设施服务`, + description: `从云服务器到专属物理资源,按业务阶段灵活选择,让部署、扩展与日常管理更简单。`, + features: [ + { + text: `按需配置`, + is_show: !0, + }, + { + text: `弹性扩展`, + is_show: !0, + }, + { + text: `统一管理`, + is_show: !0, + }, + ], + buttonLabel: `浏览产品服务`, + buttonHref: `/login?redirect=%2Fproducts`, + secondaryLabel: `了解基础设施`, + secondaryHref: `#infrastructure`, + metric: { + value: `云 · 物 · 柜`, + unit: ``, + title: `多类型资源`, + label: `从轻量部署到专属算力`, + description: `云服务器、物理服务器与机柜托管,可按需选择。`, + }, + floatingText: `灵活部署 · 简单管理`, + artCaption: `为业务构建可靠的运行基础`, + }, + sectionOrder: [`products`, `infrastructure`, `reviews`, `contact`], + products: { + is_show: !0, + eyebrow: `产品与服务`, + title: `为不同阶段准备合适的资源`, + description: `从快速上线到专属部署,选择适合当前业务的产品方案。`, + badges: [ + { + label: `配置清晰`, + is_show: !0, + }, + { + label: `按需选择`, + is_show: !0, + }, + { + label: `统一管理`, + is_show: !0, + }, + ], + items: [ + { + title: `云服务器`, + subtitle: `CLOUD SERVER`, + icon: `lucide:cloud`, + price: `按需选配`, + period: `查看方案`, + description: `灵活部署,随业务变化扩展计算资源。`, + features: [ + { + label: `多种配置可选`, + is_show: !0, + }, + { + label: `支持弹性升级`, + is_show: !0, + }, + { + label: `控制台统一管理`, + is_show: !0, + }, + ], + buttonLabel: `查看云服务器`, + href: `/login?redirect=%2Fcloud-servers`, + is_show: !0, + }, + { + title: `物理服务器`, + subtitle: `DEDICATED SERVER`, + icon: `lucide:server`, + price: `专属算力`, + period: `查看方案`, + description: `独享硬件资源,适合稳定运行的核心业务。`, + features: [ + { + label: `独享物理资源`, + is_show: !0, + }, + { + label: `可选多种规格`, + is_show: !0, + }, + { + label: `实例状态可视`, + is_show: !0, + }, + ], + buttonLabel: `查看物理服务器`, + href: `/login?redirect=%2Fdedicated-servers`, + is_show: !0, + }, + { + title: `机柜托管`, + subtitle: `CABINET COLOCATION`, + icon: `lucide:network`, + price: `按需咨询`, + period: `了解服务`, + description: `为自有设备提供机房空间与网络接入方案。`, + features: [ + { + label: `机房资源托管`, + is_show: !0, + }, + { + label: `网络接入可选`, + is_show: !0, + }, + { + label: `服务信息可查询`, + is_show: !0, + }, + ], + buttonLabel: `了解机柜托管`, + href: `/login?redirect=%2Fcolocations`, + is_show: !0, + }, + ], + }, + infrastructure: { + is_show: !0, + eyebrow: `基础设施`, + title: `让资源状态一目了然`, + description: `通过统一的客户中心管理实例、订单与服务信息,减少日常运维中的重复操作。`, + visualLabel: `RESOURCE OVERVIEW`, + visualCaption: `基础设施服务概览`, + stats: [ + { + value: `多类型`, + unit: ``, + label: `资源形态`, + is_show: !0, + }, + { + value: `按需`, + unit: ``, + label: `配置选择`, + is_show: !0, + }, + { + value: `统一`, + unit: ``, + label: `控制入口`, + is_show: !0, + }, + ], + nodeTitle: `服务资源`, + nodeSubtitle: `按业务需要灵活组合`, + nodes: [ + { + label: `云服务器`, + value: `弹性计算`, + progress: 78, + is_show: !0, + }, + { + label: `物理服务器`, + value: `专属资源`, + progress: 64, + is_show: !0, + }, + { + label: `机柜托管`, + value: `设备接入`, + progress: 52, + is_show: !0, + }, + ], + }, + reviews: { + is_show: !1, + eyebrow: `客户声音`, + title: `真实体验,值得持续打磨`, + description: `在这里展示经授权发布的客户评价。`, + items: [ + { + quote: `请填写获得客户授权的真实评价。`, + author: `客户姓名`, + company: `公司或项目名称`, + avatar: ``, + rating: 5, + is_show: !1, + }, + ], + }, + contact: { + is_show: !0, + eyebrow: `开始使用`, + title: `为你的下一个项目选好基础设施`, + description: `浏览可用产品方案,或进入客户中心配置服务、管理实例与订单。`, + buttonLabel: `前往产品目录`, + buttonHref: `/login?redirect=%2Fproducts`, + secondaryLabel: `登录客户中心`, + secondaryHref: `/login`, + }, + footer: { + linkGroups: [ + { + title: `产品服务`, + is_show: !0, + links: [ + { + label: `云服务器`, + href: `/login?redirect=%2Fcloud-servers`, + is_show: !0, + }, + { + label: `物理服务器`, + href: `/login?redirect=%2Fdedicated-servers`, + is_show: !0, + }, + { + label: `机柜托管`, + href: `/login?redirect=%2Fcolocations`, + is_show: !0, + }, + ], + }, + { + title: `服务支持`, + is_show: !0, + links: [ + { + label: `帮助中心`, + href: `/login?redirect=%2Fhelp`, + is_show: !0, + }, + { + label: `服务公告`, + href: `/login?redirect=%2Fnotices`, + is_show: !0, + }, + { + label: `新闻资讯`, + href: `/login?redirect=%2Fnews`, + is_show: !0, + }, + ], + }, + ], + contactTitle: `联系我们`, + phone: ``, + email: ``, + address: ``, + qrImage: ``, + qrCaption: `扫码关注`, + copyright: `© 破碎工坊网络`, + registrations: [ + { + label: `ICP备案`, + number: ``, + href: ``, + is_show: !0, + }, + { + label: `网安备案`, + number: ``, + href: ``, + is_show: !0, + }, + { + label: `增值电信业务经营许可证`, + number: ``, + href: ``, + is_show: !0, + }, + ], + legalLinks: [ + { + label: `服务条款`, + href: ``, + is_show: !1, + }, + { + label: `隐私政策`, + href: ``, + is_show: !1, + }, + ], + }, +}; +function r(e) { + return typeof e == `object` && !!e && !Array.isArray(e); +} +function i(e, t) { + if (Array.isArray(e)) return Array.isArray(t) ? t : e; + if (!r(e)) return t === void 0 ? e : t; + let n = r(t) ? t : {}, + a = { + ...e, + }; + for (let [t, r] of Object.entries(n)) a[t] = t in e ? i(e[t], r) : r; + return a; +} +function a() { + return JSON.parse(JSON.stringify(n)); +} +function o(e) { + return i(n, e); +} +function s(e) { + if (typeof e != `string`) return `#`; + let t = e.trim(); + return !t || /[\u0000-\u001f\\]/.test(t) + ? `#` + : /^(https?:\/\/|mailto:|tel:|#|\/(?!\/))/i.test(t) + ? t + : `#`; +} +function c(e) { + if (typeof e != `string`) return ``; + let t = e.trim(); + return !t || /[\u0000-\u001f\\]/.test(t) + ? `` + : /^(https?:\/\/|\/(?!\/))/i.test(t) + ? t + : ``; +} +function l(e, t) { + return typeof e == `string` && /^#[0-9a-fA-F]{6}$/.test(e) ? e : t; +} +var u = null; +function d() { + let n = useState(`official-site-content`, a), + r = useState(`official-site-content-loaded`, () => !1), + i = useState(`official-site-content-error`, () => ``); + async function s(e = !1) { + return r.value && !e + ? n.value + : ((!u || e) && + ((i.value = ``), + (u = useApi() + .get(`/official_site_cms/content`, void 0, !1, { + timeoutMs: 8e3, + }) + .then((e) => { + (e?.content && (n.value = o(e.content)), (r.value = !0)); + }) + .catch((e) => { + ((r.value = !0), + (i.value = + e instanceof Error ? e.message : `官网内容暂时无法同步`)); + }) + .finally(() => { + u = null; + }))), + await u, + n.value); + } + return { + content: n, + loaded: r, + error: i, + load: s, + }; +} +export { c as i, l as n, s as r, d as t }; diff --git a/app/lib/useSiteConfig.js b/app/lib/useSiteConfig.js new file mode 100644 index 0000000..121630f --- /dev/null +++ b/app/lib/useSiteConfig.js @@ -0,0 +1,47 @@ +import { ref } from "vue"; +import { computed } from "vue"; +import { useState } from "#app"; +import { useApi } from "~/lib/auth.js"; +var i = null; +function a() { + let a = useState(`site-config`, () => null), + o = ref(``); + async function s() { + if (((o.value = ``), a.value)) return a.value; + i ||= useApi() + .get(`/common`, void 0, !1, { + timeoutMs: 1e4, + }) + .then((e) => ((a.value = e), e)) + .catch((e) => { + throw ((i = null), e); + }); + try { + return await i; + } catch (e) { + return ( + (o.value = e instanceof Error ? e.message : `加载站点配置失败`), + null + ); + } + } + let c = (e) => e === 1 || e === `1` || e === !0; + return { + config: a, + error: o, + load: s, + on: c, + maintenance: computed(() => c(a.value?.maintenance_mode)), + rechargeClosed: computed( + () => a.value != null && !c(a.value.recharge_open), + ), + lockedFields: computed( + () => a.value?.prohibit_user_information_changes ?? [], + ), + siteName: computed(() => a.value?.website_name || `破碎工坊云`), + scanLoginEnabled: computed(() => + c(a.value?.plugin_configuration?.mp_weixin_notice?.scan_login), + ), + }; +} +export { a as t }; diff --git a/app/lib/useTheme.js b/app/lib/useTheme.js new file mode 100644 index 0000000..045c80d --- /dev/null +++ b/app/lib/useTheme.js @@ -0,0 +1,73 @@ +import { computed } from "vue"; +import { useState } from "#app"; +function n(e) { + try { + let t = (e ?? globalThis.localStorage)?.getItem(`theme`); + if (t === `light` || t === `dark`) return t; + } catch {} + return `auto`; +} +var r = [`light`, `dark`, `auto`], + i = { + light: `浅色`, + dark: `深色`, + auto: `跟随系统`, + }, + a = { + light: `pi pi-sun`, + dark: `pi pi-moon`, + auto: `pi pi-desktop`, + }, + o = `theme`; +function s() { + let s = useState(`theme-mode`, () => n()), + c = useState( + `theme-dark`, + () => + typeof document < `u` && + document.documentElement.classList.contains(`app-dark`), + ), + l = () => window.matchMedia(`(prefers-color-scheme: dark)`); + function u() { + c.value = s.value === `dark` || (s.value === `auto` && l().matches); + } + function d() { + let e = document.documentElement; + (e.classList.toggle(`app-dark`, c.value), + (e.style.colorScheme = c.value ? `dark` : `light`)); + } + function f() { + (u(), d()); + } + let p = null, + m = () => { + s.value === `auto` && f(); + }; + function h() { + (p?.removeEventListener(`change`, m), (p = null)); + } + function g() { + (h(), (s.value = n()), f(), (p = l()), p.addEventListener(`change`, m)); + } + function _(e) { + s.value = e; + try { + localStorage.setItem(o, e); + } catch {} + f(); + } + function v() { + _(r[(r.indexOf(s.value) + 1) % r.length]); + } + return { + mode: s, + isDark: c, + init: g, + dispose: h, + set: _, + cycle: v, + label: computed(() => i[s.value]), + icon: computed(() => a[s.value]), + }; +} +export { s as t }; diff --git a/app/lib/useVerifyCode.js b/app/lib/useVerifyCode.js new file mode 100644 index 0000000..87069fa --- /dev/null +++ b/app/lib/useVerifyCode.js @@ -0,0 +1,83 @@ +import { onScopeDispose } from "vue"; +import { ref } from "vue"; +import { useApi } from "~/lib/auth.js"; +import { t as interval_t } from "~/lib/interval.js"; +function i(i) { + let a = useApi(), + o = ref(!1), + s = ref(0), + c = null, + l = !1; + function u() { + c &&= (clearInterval(c), null); + } + function d() { + l || + (u(), + (s.value = i.seconds ?? 60), + (c = interval_t(() => { + (--s.value, s.value <= 0 && u()); + }, 1e3))); + } + onScopeDispose(() => { + ((l = !0), u()); + }); + async function f(e, t, n) { + if (l || o.value || s.value > 0) return; + if (((i.error.value = ``), !t)) { + i.error.value = n; + return; + } + let r = i.captcha.validationError(); + if (r) { + i.error.value = r; + return; + } + o.value = !0; + try { + let n = { + action: i.action, + captcha: i.captcha.value.value.trim(), + token: i.captcha.token.value, + }; + if (e === `email`) + await a.post(`/email/code`, { + ...n, + email: t, + }); + else { + let e = String( + typeof i.phoneCode == `function` + ? i.phoneCode() + : (i.phoneCode ?? 86), + ).trim(); + if (!/^[1-9]\d{0,3}$/.test(e)) throw Error(`请输入有效的国际电话区号`); + await a.post(`/phone/code`, { + ...n, + phone_code: Number(e), + phone: t, + }); + } + (d(), + !l && + i.captcha.needed.value && + (i.captcha.provider.value === `geetest` + ? i.captcha.invalidate() + : i.captcha.load())); + } catch (e) { + if (l) return; + ((i.error.value = e instanceof Error ? e.message : `验证码发送失败`), + await i.captcha.handleError(e)); + } finally { + o.value = !1; + } + } + return { + sending: o, + countdown: s, + send: f, + start: d, + stop: u, + }; +} +export { i as t }; diff --git a/app/lib/useWithdrawAvailability.js b/app/lib/useWithdrawAvailability.js new file mode 100644 index 0000000..b4f594f --- /dev/null +++ b/app/lib/useWithdrawAvailability.js @@ -0,0 +1,50 @@ +import { computed } from "vue"; +import { useState } from "#app"; +import { useApi } from "~/lib/auth.js"; +import { n as WithdrawDialog_n } from "~/components/WithdrawDialog.vue"; +function i(i = ``) { + let a = useState( + `withdraw-availability:${i ? `recommend` : `credit`}`, + () => ({ + rule: null, + loading: !1, + loaded: !1, + error: ``, + }), + ), + o = computed(() => WithdrawDialog_n(a.value.rule, i ? `recommend` : ``)), + s = computed(() => a.value.loading), + c = computed(() => a.value.loaded), + l = computed(() => a.value.error); + async function u(e = !1) { + if (!(a.value.loading || (a.value.loaded && !e))) { + ((a.value.loading = !0), (a.value.error = ``)); + try { + let e = await useApi().get( + `/withdraw/rule/credit`, + i + ? { + scene: `recommend`, + } + : void 0, + ); + ((a.value.rule = e ?? null), (a.value.loaded = !0)); + } catch (e) { + ((a.value.rule = null), + (a.value.loaded = !1), + (a.value.error = + e instanceof Error ? e.message : `加载提现设置失败`)); + } finally { + a.value.loading = !1; + } + } + } + return { + enabled: o, + loading: s, + loaded: c, + error: l, + load: u, + }; +} +export { i as t }; diff --git a/app/lib/wechat-binding.js b/app/lib/wechat-binding.js new file mode 100644 index 0000000..c58c14e --- /dev/null +++ b/app/lib/wechat-binding.js @@ -0,0 +1,35 @@ +var e = `console.wechat-binding`; +function t(t, n, r = Date.now()) { + if (!t.ticket || !t.token) throw Error(`扫码会话无效,请重新扫码`); + let i = Math.min(r + 3e5, t.expire_time ? t.expire_time * 1e3 : r + 3e5); + if (i <= r) throw Error(`二维码已过期,请重新扫码`); + n.setItem( + e, + JSON.stringify({ + ticket: t.ticket, + token: t.token, + expires: i, + }), + ); +} +function n(t, n = Date.now()) { + try { + let r = JSON.parse(t.getItem(e) || `null`); + if ( + r && + typeof r.ticket == `string` && + r.ticket && + typeof r.token == `string` && + r.token && + typeof r.expires == `number` && + r.expires > n && + r.expires <= n + 3e5 + ) + return r; + } catch {} + return (t.removeItem(e), null); +} +function r(t) { + t.removeItem(e); +} +export { n, t as r, r as t }; diff --git a/app/middleware/auth.global.js b/app/middleware/auth.global.js new file mode 100644 index 0000000..3a31aff --- /dev/null +++ b/app/middleware/auth.global.js @@ -0,0 +1,53 @@ +import { defineNuxtRouteMiddleware, navigateTo } from "#app"; +import { useAuth } from "~/lib/auth.js"; +import { r as safeRedirect } from "~/lib/auth-redirect.js"; +import { isAuthPage, isPublicRoute } from "~/utils/access.js"; + +export default defineNuxtRouteMiddleware((to) => { + const auth = useAuth(); + if (to.path === "/home.htm") { + if (Object.hasOwn(to.query, "queryParam") || !auth.legacyLoginPending) { + auth.prepareLegacyLogin(to.query.queryParam); + } + if (Object.hasOwn(to.query, "queryParam")) { + const url = new URL(window.location.href); + url.searchParams.delete("queryParam"); + window.history.replaceState( + window.history.state, + "", + url.pathname + url.search + url.hash, + ); + const query = { ...to.query }; + delete query.queryParam; + // Canonicalize the router location too; mutating query alone leaves fullPath with the credential. + return navigateTo( + { path: "/home.htm", query, hash: to.hash }, + { replace: true }, + ); + } + return; + } + if (!auth.isLoggedIn && !isPublicRoute(to)) { + const query = { ...to.query }; + delete query.queryParam; + const params = new URLSearchParams(); + for (const [key, value] of Object.entries(query)) { + for (const item of Array.isArray(value) ? value : [value]) + if (item != null) params.append(key, item); + } + const redirect = safeRedirect( + to.path + (params.size ? "?" + params : "") + to.hash, + ); + return navigateTo({ + path: "/login", + query: redirect === "/" ? {} : { redirect }, + }); + } + if ( + auth.isLoggedIn && + isAuthPage(to.path) && + !["/oauth/callback", "/official-site"].includes(to.path) && + !(to.path === "/oauth/bind" && to.query.provider === "wechat") + ) + return navigateTo("/"); +}); diff --git a/app/pages/account/api-keys.vue b/app/pages/account/api-keys.vue new file mode 100644 index 0000000..838e9aa --- /dev/null +++ b/app/pages/account/api-keys.vue @@ -0,0 +1,927 @@ + diff --git a/app/pages/account/connections.vue b/app/pages/account/connections.vue new file mode 100644 index 0000000..c1b4d26 --- /dev/null +++ b/app/pages/account/connections.vue @@ -0,0 +1,407 @@ + diff --git a/app/pages/account/index.vue b/app/pages/account/index.vue new file mode 100644 index 0000000..8530064 --- /dev/null +++ b/app/pages/account/index.vue @@ -0,0 +1,2899 @@ + diff --git a/app/pages/account/realname/company.vue b/app/pages/account/realname/company.vue new file mode 100644 index 0000000..2a853c6 --- /dev/null +++ b/app/pages/account/realname/company.vue @@ -0,0 +1,23 @@ + diff --git a/app/pages/account/realname/index.vue b/app/pages/account/realname/index.vue new file mode 100644 index 0000000..4bdc71f --- /dev/null +++ b/app/pages/account/realname/index.vue @@ -0,0 +1,2577 @@ + diff --git a/app/pages/account/realname/personal.vue b/app/pages/account/realname/personal.vue new file mode 100644 index 0000000..74c70dc --- /dev/null +++ b/app/pages/account/realname/personal.vue @@ -0,0 +1,23 @@ + diff --git a/app/pages/bills/[id].vue b/app/pages/bills/[id].vue new file mode 100644 index 0000000..c9f9d90 --- /dev/null +++ b/app/pages/bills/[id].vue @@ -0,0 +1,25 @@ + diff --git a/app/pages/bills/index.vue b/app/pages/bills/index.vue new file mode 100644 index 0000000..043e1c5 --- /dev/null +++ b/app/pages/bills/index.vue @@ -0,0 +1,38 @@ + diff --git a/app/pages/cart/index.vue b/app/pages/cart/index.vue new file mode 100644 index 0000000..4d11449 --- /dev/null +++ b/app/pages/cart/index.vue @@ -0,0 +1,1372 @@ + diff --git a/app/pages/cloud-servers/index.vue b/app/pages/cloud-servers/index.vue new file mode 100644 index 0000000..bb0da60 --- /dev/null +++ b/app/pages/cloud-servers/index.vue @@ -0,0 +1,92 @@ + diff --git a/app/pages/dedicated-servers/index.vue b/app/pages/dedicated-servers/index.vue new file mode 100644 index 0000000..18f931e --- /dev/null +++ b/app/pages/dedicated-servers/index.vue @@ -0,0 +1,92 @@ + diff --git a/app/pages/finance/index.vue b/app/pages/finance/index.vue new file mode 100644 index 0000000..929392b --- /dev/null +++ b/app/pages/finance/index.vue @@ -0,0 +1,1909 @@ + diff --git a/app/pages/forgot-password.vue b/app/pages/forgot-password.vue new file mode 100644 index 0000000..a11971a --- /dev/null +++ b/app/pages/forgot-password.vue @@ -0,0 +1,520 @@ + diff --git a/app/pages/help.vue b/app/pages/help.vue new file mode 100644 index 0000000..11ba75b --- /dev/null +++ b/app/pages/help.vue @@ -0,0 +1,741 @@ + diff --git a/app/pages/home.htm.vue b/app/pages/home.htm.vue new file mode 100644 index 0000000..8b0eef6 --- /dev/null +++ b/app/pages/home.htm.vue @@ -0,0 +1,105 @@ + + + + + diff --git a/app/pages/index.vue b/app/pages/index.vue new file mode 100644 index 0000000..3c40a2f --- /dev/null +++ b/app/pages/index.vue @@ -0,0 +1,675 @@ + diff --git a/app/pages/invoices/index.vue b/app/pages/invoices/index.vue new file mode 100644 index 0000000..206297e --- /dev/null +++ b/app/pages/invoices/index.vue @@ -0,0 +1,2379 @@ + diff --git a/app/pages/invoices/invoice.vue b/app/pages/invoices/invoice.vue new file mode 100644 index 0000000..1532838 --- /dev/null +++ b/app/pages/invoices/invoice.vue @@ -0,0 +1,623 @@ + diff --git a/app/pages/invoices/request.vue b/app/pages/invoices/request.vue new file mode 100644 index 0000000..f8ded5c --- /dev/null +++ b/app/pages/invoices/request.vue @@ -0,0 +1,17 @@ + diff --git a/app/pages/invoices/settings/index.vue b/app/pages/invoices/settings/index.vue new file mode 100644 index 0000000..5bfae26 --- /dev/null +++ b/app/pages/invoices/settings/index.vue @@ -0,0 +1,1392 @@ + diff --git a/app/pages/logbook/index.vue b/app/pages/logbook/index.vue new file mode 100644 index 0000000..eb08f26 --- /dev/null +++ b/app/pages/logbook/index.vue @@ -0,0 +1,393 @@ + diff --git a/app/pages/login.vue b/app/pages/login.vue new file mode 100644 index 0000000..e798528 --- /dev/null +++ b/app/pages/login.vue @@ -0,0 +1,568 @@ + + + diff --git a/app/pages/messages/index.vue b/app/pages/messages/index.vue new file mode 100644 index 0000000..b4165d7 --- /dev/null +++ b/app/pages/messages/index.vue @@ -0,0 +1,904 @@ + diff --git a/app/pages/news.vue b/app/pages/news.vue new file mode 100644 index 0000000..4e1b381 --- /dev/null +++ b/app/pages/news.vue @@ -0,0 +1,576 @@ + diff --git a/app/pages/notices/index.vue b/app/pages/notices/index.vue new file mode 100644 index 0000000..5c7713f --- /dev/null +++ b/app/pages/notices/index.vue @@ -0,0 +1,543 @@ + diff --git a/app/pages/oauth/bind.vue b/app/pages/oauth/bind.vue new file mode 100644 index 0000000..c3a40df --- /dev/null +++ b/app/pages/oauth/bind.vue @@ -0,0 +1,614 @@ + diff --git a/app/pages/oauth/callback.vue b/app/pages/oauth/callback.vue new file mode 100644 index 0000000..4e9312b --- /dev/null +++ b/app/pages/oauth/callback.vue @@ -0,0 +1,149 @@ + diff --git a/app/pages/official-site.vue b/app/pages/official-site.vue new file mode 100644 index 0000000..1c8cdb6 --- /dev/null +++ b/app/pages/official-site.vue @@ -0,0 +1,1088 @@ + diff --git a/app/pages/orders/[id].vue b/app/pages/orders/[id].vue new file mode 100644 index 0000000..e8fe4ce --- /dev/null +++ b/app/pages/orders/[id].vue @@ -0,0 +1,1578 @@ + diff --git a/app/pages/orders/index.vue b/app/pages/orders/index.vue new file mode 100644 index 0000000..50354b9 --- /dev/null +++ b/app/pages/orders/index.vue @@ -0,0 +1,1147 @@ + diff --git a/app/pages/orders/order/index.vue b/app/pages/orders/order/index.vue new file mode 100644 index 0000000..47bcfd0 --- /dev/null +++ b/app/pages/orders/order/index.vue @@ -0,0 +1,25 @@ + diff --git a/app/pages/orders/order/paid.vue b/app/pages/orders/order/paid.vue new file mode 100644 index 0000000..0d4559e --- /dev/null +++ b/app/pages/orders/order/paid.vue @@ -0,0 +1,25 @@ + diff --git a/app/pages/orders/order/pay.vue b/app/pages/orders/order/pay.vue new file mode 100644 index 0000000..5d85b68 --- /dev/null +++ b/app/pages/orders/order/pay.vue @@ -0,0 +1,25 @@ + diff --git a/app/pages/products/[id].vue b/app/pages/products/[id].vue new file mode 100644 index 0000000..87daa48 --- /dev/null +++ b/app/pages/products/[id].vue @@ -0,0 +1,460 @@ + diff --git a/app/pages/products/cloud-server.vue b/app/pages/products/cloud-server.vue new file mode 100644 index 0000000..edcd5b8 --- /dev/null +++ b/app/pages/products/cloud-server.vue @@ -0,0 +1,494 @@ + diff --git a/app/pages/products/dedicated-server/customize.vue b/app/pages/products/dedicated-server/customize.vue new file mode 100644 index 0000000..606794f --- /dev/null +++ b/app/pages/products/dedicated-server/customize.vue @@ -0,0 +1,255 @@ + diff --git a/app/pages/products/dedicated-server/index.vue b/app/pages/products/dedicated-server/index.vue new file mode 100644 index 0000000..2fce8f9 --- /dev/null +++ b/app/pages/products/dedicated-server/index.vue @@ -0,0 +1,1207 @@ + diff --git a/app/pages/products/index.vue b/app/pages/products/index.vue new file mode 100644 index 0000000..3cf05d5 --- /dev/null +++ b/app/pages/products/index.vue @@ -0,0 +1,1602 @@ + diff --git a/app/pages/recommend/index.vue b/app/pages/recommend/index.vue new file mode 100644 index 0000000..c19cbbd --- /dev/null +++ b/app/pages/recommend/index.vue @@ -0,0 +1,3438 @@ + diff --git a/app/pages/register.vue b/app/pages/register.vue new file mode 100644 index 0000000..96e7ca9 --- /dev/null +++ b/app/pages/register.vue @@ -0,0 +1,907 @@ + diff --git a/app/pages/remote-console.vue b/app/pages/remote-console.vue new file mode 100644 index 0000000..d995e54 --- /dev/null +++ b/app/pages/remote-console.vue @@ -0,0 +1,427 @@ + diff --git a/app/pages/resources.vue b/app/pages/resources.vue new file mode 100644 index 0000000..0f4697d --- /dev/null +++ b/app/pages/resources.vue @@ -0,0 +1,263 @@ + diff --git a/app/pages/security/domains/index.vue b/app/pages/security/domains/index.vue new file mode 100644 index 0000000..8ccb849 --- /dev/null +++ b/app/pages/security/domains/index.vue @@ -0,0 +1,1160 @@ + diff --git a/app/pages/security/groups/index.vue b/app/pages/security/groups/index.vue new file mode 100644 index 0000000..2d9c05d --- /dev/null +++ b/app/pages/security/groups/index.vue @@ -0,0 +1,2376 @@ + diff --git a/app/pages/security/ssh-keys/index.vue b/app/pages/security/ssh-keys/index.vue new file mode 100644 index 0000000..c791f5f --- /dev/null +++ b/app/pages/security/ssh-keys/index.vue @@ -0,0 +1,413 @@ + + +