@omega.js/extension 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +98 -0
- package/README.md +194 -0
- package/bin/omega +2 -0
- package/bin/omega-extension +2 -0
- package/bin/omg +2 -0
- package/dist/assets/css/bundles/.gitkeep +0 -0
- package/dist/assets/css/components/content/index.scss +5 -0
- package/dist/assets/css/components/options/index.scss +9 -0
- package/dist/assets/css/components/pages/index.scss +5 -0
- package/dist/assets/css/components/popup/index.scss +9 -0
- package/dist/assets/css/core/_animations.scss +64 -0
- package/dist/assets/css/core/_fontawesome.scss +146 -0
- package/dist/assets/css/core/_initialize.scss +23 -0
- package/dist/assets/css/core/_utilities.scss +80 -0
- package/dist/assets/css/omega-extension.scss +43 -0
- package/dist/assets/css/shell/_index.scss +207 -0
- package/dist/assets/css/tokens/_index.scss +166 -0
- package/dist/assets/js/core/app-shell.js +136 -0
- package/dist/assets/js/libs/initialize-tooltips.js +31 -0
- package/dist/assets/js/libs/recaptcha.js +94 -0
- package/dist/assets/js/main.js +4 -0
- package/dist/assets/themes/_template/README.md +115 -0
- package/dist/assets/themes/_template/_config.scss +60 -0
- package/dist/assets/themes/_template/_theme.js +14 -0
- package/dist/assets/themes/_template/_theme.scss +28 -0
- package/dist/assets/themes/_template/css/base/_root.scss +19 -0
- package/dist/assets/themes/_template/css/components/_components.scss +23 -0
- package/dist/assets/themes/base/README.md +5 -0
- package/dist/assets/themes/base/_components/data/org-chart/component.html +33 -0
- package/dist/assets/themes/base/_components/data/org-chart/component.json5 +33 -0
- package/dist/assets/themes/base/_components/data/org-chart/component.scss +183 -0
- package/dist/assets/themes/base/_components/heading/masthead/component.html +22 -0
- package/dist/assets/themes/base/_components/heading/masthead/component.json5 +30 -0
- package/dist/assets/themes/base/_components/heading/section-head/component.html +18 -0
- package/dist/assets/themes/base/_components/heading/section-head/component.json5 +27 -0
- package/dist/assets/themes/base/_components/pricing/features/component.html +29 -0
- package/dist/assets/themes/base/_components/pricing/features/component.json5 +30 -0
- package/dist/assets/themes/base/_hero/orbit/index.html +30 -0
- package/dist/assets/themes/base/_hero/orbit/script.js +33 -0
- package/dist/assets/themes/base/_hero/orbit/style.scss +133 -0
- package/dist/assets/themes/base/_includes/admin/sections/sidebar.html +3 -0
- package/dist/assets/themes/base/_includes/admin/sections/topbar.html +3 -0
- package/dist/assets/themes/base/_includes/backend/sections/sidebar.html +3 -0
- package/dist/assets/themes/base/_includes/backend/sections/topbar.html +3 -0
- package/dist/assets/themes/base/_includes/frontend/components/connection-card.html +49 -0
- package/dist/assets/themes/base/_includes/frontend/components/post-card.html +54 -0
- package/dist/assets/themes/base/_includes/frontend/sections/account-connections.html +42 -0
- package/dist/assets/themes/base/_includes/frontend/sections/account-section-header.html +11 -0
- package/dist/assets/themes/base/_includes/frontend/sections/footer.html +154 -0
- package/dist/assets/themes/base/_includes/frontend/sections/nav.html +276 -0
- package/dist/assets/themes/base/_includes/global/sections/account.html +72 -0
- package/dist/assets/themes/base/_includes/global/sections/app-sidebar.html +248 -0
- package/dist/assets/themes/base/_includes/global/sections/app-topbar.html +228 -0
- package/dist/assets/themes/base/_includes/global/sections/page-header.html +99 -0
- package/dist/assets/themes/base/_layouts/admin/core/minimal-viewport-locked.html +22 -0
- package/dist/assets/themes/base/_layouts/admin/core/minimal.html +23 -0
- package/dist/assets/themes/base/_layouts/backend/core/base.html +57 -0
- package/dist/assets/themes/base/_layouts/backend/core/minimal-viewport-locked.html +32 -0
- package/dist/assets/themes/base/_layouts/backend/core/minimal.html +32 -0
- package/dist/assets/themes/base/_layouts/backend/pages/dashboard/index.html +230 -0
- package/dist/assets/themes/base/_layouts/frontend/core/base.html +31 -0
- package/dist/assets/themes/base/_layouts/frontend/core/cover.html +40 -0
- package/dist/assets/themes/base/_layouts/frontend/core/minimal.html +47 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/404.html +54 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/about.html +144 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/account/index.html +2104 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/alternatives/alternative.html +319 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/alternatives/index.html +186 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/app.html +142 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/auth/reset.html +53 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/auth/signin.html +90 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/auth/signup.html +141 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/auth/token.html +44 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/blog/categories/category.html +88 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/blog/categories/index.html +88 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/blog/index.html +255 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/blog/post.html +261 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/blog/tags/index.html +84 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/blog/tags/tag.html +88 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/collection/category.html +72 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/collection/document.html +54 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/collection/index.html +84 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/connections/callback.html +55 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/contact.html +214 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/download.html +793 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/extension/index.html +253 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/extension/installed.html +198 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/feedback.html +171 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/index.html +66 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/legal/document.html +78 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/payment/checkout.html +459 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/payment/confirmation.html +131 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/portal/email-preferences.html +104 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/pricing.html +596 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/status.html +361 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/team/index.html +210 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/team/member.html +125 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/updates/index.html +119 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/updates/update.html +118 -0
- package/dist/assets/themes/base/_sections/about/hero/section.html +68 -0
- package/dist/assets/themes/base/_sections/about/hero/section.json5 +58 -0
- package/dist/assets/themes/base/_sections/about/letter/section.html +60 -0
- package/dist/assets/themes/base/_sections/about/letter/section.json5 +56 -0
- package/dist/assets/themes/base/_sections/about/photo-band/section.html +24 -0
- package/dist/assets/themes/base/_sections/about/photo-band/section.json5 +23 -0
- package/dist/assets/themes/base/_sections/about/principles/section.html +17 -0
- package/dist/assets/themes/base/_sections/about/principles/section.json5 +34 -0
- package/dist/assets/themes/base/_sections/about/timeline/section.html +20 -0
- package/dist/assets/themes/base/_sections/about/timeline/section.json5 +34 -0
- package/dist/assets/themes/base/_sections/marketing/bento/section.html +91 -0
- package/dist/assets/themes/base/_sections/marketing/bento/section.json5 +152 -0
- package/dist/assets/themes/base/_sections/marketing/cta/section.html +44 -0
- package/dist/assets/themes/base/_sections/marketing/cta/section.json5 +47 -0
- package/dist/assets/themes/base/_sections/marketing/faq/section.html +52 -0
- package/dist/assets/themes/base/_sections/marketing/faq/section.json5 +68 -0
- package/dist/assets/themes/base/_sections/marketing/hero/section.html +349 -0
- package/dist/assets/themes/base/_sections/marketing/hero/section.json5 +335 -0
- package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.html +38 -0
- package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.js +86 -0
- package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.json5 +29 -0
- package/dist/assets/themes/base/_sections/marketing/pricing-cards/section.html +115 -0
- package/dist/assets/themes/base/_sections/marketing/pricing-cards/section.json5 +72 -0
- package/dist/assets/themes/base/_sections/marketing/product-demo/section.html +62 -0
- package/dist/assets/themes/base/_sections/marketing/product-demo/section.js +44 -0
- package/dist/assets/themes/base/_sections/marketing/product-demo/section.json5 +52 -0
- package/dist/assets/themes/base/_sections/marketing/prose/section.html +22 -0
- package/dist/assets/themes/base/_sections/marketing/prose/section.json5 +41 -0
- package/dist/assets/themes/base/_sections/marketing/showcase/section.html +35 -0
- package/dist/assets/themes/base/_sections/marketing/showcase/section.json5 +52 -0
- package/dist/assets/themes/base/_sections/marketing/stats/section.html +32 -0
- package/dist/assets/themes/base/_sections/marketing/stats/section.json5 +44 -0
- package/dist/assets/themes/base/_sections/marketing/testimonials/section.html +54 -0
- package/dist/assets/themes/base/_sections/marketing/testimonials/section.json5 +70 -0
- package/dist/assets/themes/base/_sections/marketing/trusted-by/section.html +30 -0
- package/dist/assets/themes/base/_sections/marketing/trusted-by/section.json5 +38 -0
- package/dist/assets/themes/base/_sections/verts/unit/section.html +7 -0
- package/dist/assets/themes/base/_sections/verts/unit/section.js +22 -0
- package/dist/assets/themes/base/_sections/verts/unit/section.json5 +24 -0
- package/dist/assets/themes/base/_sections/verts/unit/section.scss +24 -0
- package/dist/assets/themes/base/_theme.js +13 -0
- package/dist/assets/themes/base/_theme.scss +4 -0
- package/dist/assets/themes/bootstrap/_theme.js +16 -0
- package/dist/assets/themes/bootstrap/_theme.scss +11 -0
- package/dist/assets/themes/bootstrap/js/index.esm.js +19 -0
- package/dist/assets/themes/bootstrap/js/index.umd.js +34 -0
- package/dist/assets/themes/bootstrap/js/src/alert.js +87 -0
- package/dist/assets/themes/bootstrap/js/src/base-component.js +86 -0
- package/dist/assets/themes/bootstrap/js/src/button.js +72 -0
- package/dist/assets/themes/bootstrap/js/src/carousel.js +474 -0
- package/dist/assets/themes/bootstrap/js/src/collapse.js +297 -0
- package/dist/assets/themes/bootstrap/js/src/dom/data.js +55 -0
- package/dist/assets/themes/bootstrap/js/src/dom/event-handler.js +317 -0
- package/dist/assets/themes/bootstrap/js/src/dom/manipulator.js +71 -0
- package/dist/assets/themes/bootstrap/js/src/dom/selector-engine.js +126 -0
- package/dist/assets/themes/bootstrap/js/src/dropdown.js +458 -0
- package/dist/assets/themes/bootstrap/js/src/modal.js +378 -0
- package/dist/assets/themes/bootstrap/js/src/offcanvas.js +282 -0
- package/dist/assets/themes/bootstrap/js/src/popover.js +97 -0
- package/dist/assets/themes/bootstrap/js/src/scrollspy.js +296 -0
- package/dist/assets/themes/bootstrap/js/src/tab.js +315 -0
- package/dist/assets/themes/bootstrap/js/src/toast.js +224 -0
- package/dist/assets/themes/bootstrap/js/src/tooltip.js +632 -0
- package/dist/assets/themes/bootstrap/js/src/util/backdrop.js +151 -0
- package/dist/assets/themes/bootstrap/js/src/util/component-functions.js +35 -0
- package/dist/assets/themes/bootstrap/js/src/util/config.js +65 -0
- package/dist/assets/themes/bootstrap/js/src/util/focustrap.js +115 -0
- package/dist/assets/themes/bootstrap/js/src/util/index.js +306 -0
- package/dist/assets/themes/bootstrap/js/src/util/sanitizer.js +117 -0
- package/dist/assets/themes/bootstrap/js/src/util/scrollbar.js +114 -0
- package/dist/assets/themes/bootstrap/js/src/util/swipe.js +146 -0
- package/dist/assets/themes/bootstrap/js/src/util/template-factory.js +160 -0
- package/dist/assets/themes/bootstrap/overrides/_accordion.scss +21 -0
- package/dist/assets/themes/bootstrap/overrides/_avatars.scss +51 -0
- package/dist/assets/themes/bootstrap/overrides/_blog-images.scss +45 -0
- package/dist/assets/themes/bootstrap/overrides/_buttons-adaptive.scss +141 -0
- package/dist/assets/themes/bootstrap/overrides/_color-shades.scss +25 -0
- package/dist/assets/themes/bootstrap/overrides/_cursor-utilities.scss +13 -0
- package/dist/assets/themes/bootstrap/overrides/_index.scss +30 -0
- package/dist/assets/themes/bootstrap/overrides/_links.scss +26 -0
- package/dist/assets/themes/bootstrap/overrides/_soft-colors.scss +99 -0
- package/dist/assets/themes/bootstrap/overrides/_spacing-extended.scss +74 -0
- package/dist/assets/themes/bootstrap/overrides/_spinners.scss +22 -0
- package/dist/assets/themes/bootstrap/overrides/_typography-utilities.scss +40 -0
- package/dist/assets/themes/bootstrap/scss/_accordion.scss +153 -0
- package/dist/assets/themes/bootstrap/scss/_alert.scss +68 -0
- package/dist/assets/themes/bootstrap/scss/_badge.scss +38 -0
- package/dist/assets/themes/bootstrap/scss/_breadcrumb.scss +40 -0
- package/dist/assets/themes/bootstrap/scss/_button-group.scss +147 -0
- package/dist/assets/themes/bootstrap/scss/_buttons.scss +216 -0
- package/dist/assets/themes/bootstrap/scss/_card.scss +238 -0
- package/dist/assets/themes/bootstrap/scss/_carousel.scss +226 -0
- package/dist/assets/themes/bootstrap/scss/_close.scss +66 -0
- package/dist/assets/themes/bootstrap/scss/_containers.scss +41 -0
- package/dist/assets/themes/bootstrap/scss/_dropdown.scss +250 -0
- package/dist/assets/themes/bootstrap/scss/_forms.scss +9 -0
- package/dist/assets/themes/bootstrap/scss/_functions.scss +302 -0
- package/dist/assets/themes/bootstrap/scss/_grid.scss +39 -0
- package/dist/assets/themes/bootstrap/scss/_helpers.scss +12 -0
- package/dist/assets/themes/bootstrap/scss/_images.scss +42 -0
- package/dist/assets/themes/bootstrap/scss/_list-group.scss +199 -0
- package/dist/assets/themes/bootstrap/scss/_maps.scss +174 -0
- package/dist/assets/themes/bootstrap/scss/_mixins.scss +42 -0
- package/dist/assets/themes/bootstrap/scss/_modal.scss +240 -0
- package/dist/assets/themes/bootstrap/scss/_nav.scss +197 -0
- package/dist/assets/themes/bootstrap/scss/_navbar.scss +289 -0
- package/dist/assets/themes/bootstrap/scss/_offcanvas.scss +147 -0
- package/dist/assets/themes/bootstrap/scss/_pagination.scss +109 -0
- package/dist/assets/themes/bootstrap/scss/_placeholders.scss +51 -0
- package/dist/assets/themes/bootstrap/scss/_popover.scss +196 -0
- package/dist/assets/themes/bootstrap/scss/_progress.scss +68 -0
- package/dist/assets/themes/bootstrap/scss/_reboot.scss +611 -0
- package/dist/assets/themes/bootstrap/scss/_root.scss +187 -0
- package/dist/assets/themes/bootstrap/scss/_spinners.scss +85 -0
- package/dist/assets/themes/bootstrap/scss/_tables.scss +171 -0
- package/dist/assets/themes/bootstrap/scss/_toasts.scss +73 -0
- package/dist/assets/themes/bootstrap/scss/_tooltip.scss +119 -0
- package/dist/assets/themes/bootstrap/scss/_transitions.scss +27 -0
- package/dist/assets/themes/bootstrap/scss/_type.scss +106 -0
- package/dist/assets/themes/bootstrap/scss/_utilities.scss +806 -0
- package/dist/assets/themes/bootstrap/scss/_variables-dark.scss +102 -0
- package/dist/assets/themes/bootstrap/scss/_variables.scss +1753 -0
- package/dist/assets/themes/bootstrap/scss/bootstrap-grid.scss +62 -0
- package/dist/assets/themes/bootstrap/scss/bootstrap-reboot.scss +10 -0
- package/dist/assets/themes/bootstrap/scss/bootstrap-utilities.scss +19 -0
- package/dist/assets/themes/bootstrap/scss/bootstrap.scss +52 -0
- package/dist/assets/themes/bootstrap/scss/forms/_floating-labels.scss +97 -0
- package/dist/assets/themes/bootstrap/scss/forms/_form-check.scss +189 -0
- package/dist/assets/themes/bootstrap/scss/forms/_form-control.scss +214 -0
- package/dist/assets/themes/bootstrap/scss/forms/_form-range.scss +91 -0
- package/dist/assets/themes/bootstrap/scss/forms/_form-select.scss +80 -0
- package/dist/assets/themes/bootstrap/scss/forms/_form-text.scss +11 -0
- package/dist/assets/themes/bootstrap/scss/forms/_input-group.scss +132 -0
- package/dist/assets/themes/bootstrap/scss/forms/_labels.scss +36 -0
- package/dist/assets/themes/bootstrap/scss/forms/_validation.scss +12 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_clearfix.scss +3 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_color-bg.scss +7 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_colored-links.scss +30 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_focus-ring.scss +5 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_icon-link.scss +25 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_position.scss +36 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_ratio.scss +26 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_stacks.scss +15 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_stretched-link.scss +15 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_text-truncation.scss +7 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_vr.scss +8 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_alert.scss +18 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_backdrop.scss +14 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_banner.scss +7 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_border-radius.scss +78 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_box-shadow.scss +18 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_breakpoints.scss +127 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_buttons.scss +70 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_caret.scss +69 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_clearfix.scss +9 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_color-mode.scss +21 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_color-scheme.scss +7 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_container.scss +11 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_deprecate.scss +10 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_forms.scss +163 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_gradients.scss +47 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_grid.scss +151 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_image.scss +16 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_list-group.scss +26 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_lists.scss +7 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_pagination.scss +10 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_reset-text.scss +17 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_resize.scss +6 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_table-variants.scss +24 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_text-truncate.scss +8 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_transition.scss +26 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_utilities.scss +97 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_visually-hidden.scss +38 -0
- package/dist/assets/themes/bootstrap/scss/tests/jasmine.js +16 -0
- package/dist/assets/themes/bootstrap/scss/tests/mixins/_auto-import-of-variables-dark.test.scss +7 -0
- package/dist/assets/themes/bootstrap/scss/tests/mixins/_color-modes.test.scss +69 -0
- package/dist/assets/themes/bootstrap/scss/tests/mixins/_media-query-color-mode-full.test.scss +8 -0
- package/dist/assets/themes/bootstrap/scss/tests/mixins/_utilities.test.scss +393 -0
- package/dist/assets/themes/bootstrap/scss/tests/sass-true/register.js +14 -0
- package/dist/assets/themes/bootstrap/scss/tests/sass-true/runner.js +17 -0
- package/dist/assets/themes/bootstrap/scss/tests/utilities/_api.test.scss +75 -0
- package/dist/assets/themes/bootstrap/scss/utilities/_api.scss +47 -0
- package/dist/assets/themes/bootstrap/scss/vendor/_rfs.scss +348 -0
- package/dist/assets/themes/classy/README.md +89 -0
- package/dist/assets/themes/classy/_config.scss +245 -0
- package/dist/assets/themes/classy/_theme.js +31 -0
- package/dist/assets/themes/classy/_theme.scss +57 -0
- package/dist/assets/themes/classy/css/app/_panels.scss +183 -0
- package/dist/assets/themes/classy/css/base/_fonts.scss +79 -0
- package/dist/assets/themes/classy/css/base/_no-raise.scss +49 -0
- package/dist/assets/themes/classy/css/base/_root.scss +113 -0
- package/dist/assets/themes/classy/css/base/_typography.scss +154 -0
- package/dist/assets/themes/classy/css/base/_utilities.scss +284 -0
- package/dist/assets/themes/classy/css/components/_alerts.scss +51 -0
- package/dist/assets/themes/classy/css/components/_badges.scss +46 -0
- package/dist/assets/themes/classy/css/components/_buttons.scss +175 -0
- package/dist/assets/themes/classy/css/components/_cards.scss +41 -0
- package/dist/assets/themes/classy/css/components/_dropdowns.scss +48 -0
- package/dist/assets/themes/classy/css/components/_forms.scss +171 -0
- package/dist/assets/themes/classy/css/components/_receipt.scss +45 -0
- package/dist/assets/themes/classy/css/layout/_footer.scss +298 -0
- package/dist/assets/themes/classy/css/layout/_general.scss +209 -0
- package/dist/assets/themes/classy/css/layout/_nav.scss +154 -0
- package/dist/assets/themes/classy/css/layout/_shell.scss +458 -0
- package/dist/assets/themes/classy/css/marketing/_bento.scss +238 -0
- package/dist/assets/themes/classy/css/marketing/_content.scss +1328 -0
- package/dist/assets/themes/classy/css/marketing/_downloads.scss +246 -0
- package/dist/assets/themes/classy/css/marketing/_hero.scss +311 -0
- package/dist/assets/themes/classy/css/marketing/_sections.scss +649 -0
- package/dist/assets/themes/classy/css/pages/404/index.scss +67 -0
- package/dist/assets/themes/classy/css/pages/_auth.scss +235 -0
- package/dist/assets/themes/classy/css/pages/admin/firebase/index.scss +22 -0
- package/dist/assets/themes/classy/css/pages/blog/[slug].scss +56 -0
- package/dist/assets/themes/classy/css/pages/cookies.scss +2 -0
- package/dist/assets/themes/classy/css/pages/dashboard/account/index.scss +31 -0
- package/dist/assets/themes/classy/css/pages/feedback/index.scss +39 -0
- package/dist/assets/themes/classy/css/pages/legal/_document.scss +192 -0
- package/dist/assets/themes/classy/css/pages/payment/checkout/index.scss +585 -0
- package/dist/assets/themes/classy/css/pages/payment/confirmation/index.scss +9 -0
- package/dist/assets/themes/classy/css/pages/privacy.scss +2 -0
- package/dist/assets/themes/classy/css/pages/status/index.scss +164 -0
- package/dist/assets/themes/classy/css/pages/terms.scss +2 -0
- package/dist/assets/themes/classy/css/pages/updates/index.scss +128 -0
- package/dist/assets/themes/classy/fonts/inter-italic-latin-ext.woff2 +0 -0
- package/dist/assets/themes/classy/fonts/inter-italic-latin.woff2 +0 -0
- package/dist/assets/themes/classy/fonts/inter-normal-latin-ext.woff2 +0 -0
- package/dist/assets/themes/classy/fonts/inter-normal-latin.woff2 +0 -0
- package/dist/assets/themes/classy/fonts/newsreader-italic-latin-ext.woff2 +0 -0
- package/dist/assets/themes/classy/fonts/newsreader-italic-latin.woff2 +0 -0
- package/dist/assets/themes/classy/fonts/newsreader-normal-latin-ext.woff2 +0 -0
- package/dist/assets/themes/classy/fonts/newsreader-normal-latin.woff2 +0 -0
- package/dist/assets/themes/classy/js/hero-demo-form.js +56 -0
- package/dist/assets/themes/neobrutalism/README.md +118 -0
- package/dist/assets/themes/neobrutalism/_config.scss +139 -0
- package/dist/assets/themes/neobrutalism/_layouts/frontend/core/base.html +30 -0
- package/dist/assets/themes/neobrutalism/_layouts/frontend/pages/index.html +275 -0
- package/dist/assets/themes/neobrutalism/_theme.js +24 -0
- package/dist/assets/themes/neobrutalism/_theme.scss +61 -0
- package/dist/assets/themes/neobrutalism/css/base/_mixins.scss +46 -0
- package/dist/assets/themes/neobrutalism/css/base/_root.scss +169 -0
- package/dist/assets/themes/neobrutalism/css/base/_typography.scss +61 -0
- package/dist/assets/themes/neobrutalism/css/base/_utilities.scss +89 -0
- package/dist/assets/themes/neobrutalism/css/components/_billing-toggle.scss +74 -0
- package/dist/assets/themes/neobrutalism/css/components/_buttons.scss +148 -0
- package/dist/assets/themes/neobrutalism/css/components/_cards.scss +47 -0
- package/dist/assets/themes/neobrutalism/css/components/_forms.scss +88 -0
- package/dist/assets/themes/neobrutalism/css/components/_marketing.scss +244 -0
- package/dist/assets/themes/neobrutalism/css/layout/_general.scss +213 -0
- package/dist/assets/themes/neobrutalism/css/layout/_navigation.scss +171 -0
- package/dist/assets/themes/neobrutalism/css/pages/index.scss +203 -0
- package/dist/assets/themes/neobrutalism/css/pages/pricing/index.scss +58 -0
- package/dist/assets/themes/neobrutalism/css/pages/test/libraries/layers/index.scss +7 -0
- package/dist/assets/themes/neobrutalism/js/pages/test/libraries/layers/index.js +9 -0
- package/dist/assets/themes/newsflash/README.md +117 -0
- package/dist/assets/themes/newsflash/_components/heading/lede/component.html +14 -0
- package/dist/assets/themes/newsflash/_components/heading/lede/component.json5 +23 -0
- package/dist/assets/themes/newsflash/_components/heading/rule-head/component.html +17 -0
- package/dist/assets/themes/newsflash/_components/heading/rule-head/component.json5 +23 -0
- package/dist/assets/themes/newsflash/_components/news/byline/component.html +12 -0
- package/dist/assets/themes/newsflash/_components/news/byline/component.json5 +18 -0
- package/dist/assets/themes/newsflash/_components/news/story-card/component.html +25 -0
- package/dist/assets/themes/newsflash/_components/news/story-card/component.json5 +21 -0
- package/dist/assets/themes/newsflash/_config.scss +147 -0
- package/dist/assets/themes/newsflash/_layouts/frontend/core/base.html +51 -0
- package/dist/assets/themes/newsflash/_layouts/frontend/pages/blog/index.html +299 -0
- package/dist/assets/themes/newsflash/_layouts/frontend/pages/blog/post.html +235 -0
- package/dist/assets/themes/newsflash/_layouts/frontend/pages/index.html +328 -0
- package/dist/assets/themes/newsflash/_sections/marketing/desks/section.html +39 -0
- package/dist/assets/themes/newsflash/_sections/marketing/desks/section.json5 +49 -0
- package/dist/assets/themes/newsflash/_sections/marketing/newsletter-cta/section.html +103 -0
- package/dist/assets/themes/newsflash/_sections/marketing/newsletter-cta/section.json5 +50 -0
- package/dist/assets/themes/newsflash/_sections/marketing/rundown/section.html +28 -0
- package/dist/assets/themes/newsflash/_sections/marketing/rundown/section.json5 +40 -0
- package/dist/assets/themes/newsflash/_theme.js +24 -0
- package/dist/assets/themes/newsflash/_theme.scss +70 -0
- package/dist/assets/themes/newsflash/css/base/_fonts.scss +80 -0
- package/dist/assets/themes/newsflash/css/base/_mixins.scss +51 -0
- package/dist/assets/themes/newsflash/css/base/_root.scss +257 -0
- package/dist/assets/themes/newsflash/css/base/_typography.scss +49 -0
- package/dist/assets/themes/newsflash/css/base/_utilities.scss +122 -0
- package/dist/assets/themes/newsflash/css/components/_badges.scss +65 -0
- package/dist/assets/themes/newsflash/css/components/_billing-toggle.scss +61 -0
- package/dist/assets/themes/newsflash/css/components/_buttons.scss +139 -0
- package/dist/assets/themes/newsflash/css/components/_cards.scss +47 -0
- package/dist/assets/themes/newsflash/css/components/_editorial.scss +173 -0
- package/dist/assets/themes/newsflash/css/components/_forms.scss +75 -0
- package/dist/assets/themes/newsflash/css/components/_infinite-scroll.scss +102 -0
- package/dist/assets/themes/newsflash/css/components/_panels.scss +156 -0
- package/dist/assets/themes/newsflash/css/components/_ticker.scss +67 -0
- package/dist/assets/themes/newsflash/css/layout/_general.scss +330 -0
- package/dist/assets/themes/newsflash/css/layout/_navigation.scss +168 -0
- package/dist/assets/themes/newsflash/css/pages/404/index.scss +79 -0
- package/dist/assets/themes/newsflash/css/pages/blog/[slug].scss +186 -0
- package/dist/assets/themes/newsflash/css/pages/blog/index.scss +17 -0
- package/dist/assets/themes/newsflash/css/pages/index.scss +157 -0
- package/dist/assets/themes/newsflash/css/pages/pricing/index.scss +55 -0
- package/dist/assets/themes/newsflash/css/pages/test/libraries/layers/index.scss +7 -0
- package/dist/assets/themes/newsflash/fonts/fraunces-italic-latin-ext.woff2 +0 -0
- package/dist/assets/themes/newsflash/fonts/fraunces-italic-latin.woff2 +0 -0
- package/dist/assets/themes/newsflash/fonts/fraunces-normal-latin-ext.woff2 +0 -0
- package/dist/assets/themes/newsflash/fonts/fraunces-normal-latin.woff2 +0 -0
- package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-italic-latin-ext.woff2 +0 -0
- package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-italic-latin.woff2 +0 -0
- package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-normal-latin-ext.woff2 +0 -0
- package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-normal-latin.woff2 +0 -0
- package/dist/assets/themes/newsflash/js/pages/blog/[slug].js +29 -0
- package/dist/assets/themes/newsflash/js/pages/test/libraries/layers/index.js +9 -0
- package/dist/background.js +684 -0
- package/dist/build.js +268 -0
- package/dist/cli-run.js +25 -0
- package/dist/cli.js +30 -0
- package/dist/commands/build.js +67 -0
- package/dist/commands/clean.js +29 -0
- package/dist/commands/deploy.js +97 -0
- package/dist/commands/install.js +58 -0
- package/dist/commands/lib/dependencies.js +33 -0
- package/dist/commands/lib/deploy-precheck.js +57 -0
- package/dist/commands/lib/ensure-target.js +151 -0
- package/dist/commands/lib/push-secrets.js +60 -0
- package/dist/commands/migrate.js +77 -0
- package/dist/commands/test.js +110 -0
- package/dist/commands/update.js +21 -0
- package/dist/commands/version.js +12 -0
- package/dist/config/manifest.json +117 -0
- package/dist/config/page-template.html +21 -0
- package/dist/content.js +37 -0
- package/dist/defaults/.github/workflows/publish.yml +86 -0
- package/dist/defaults/.nvmrc +1 -0
- package/dist/defaults/.vscode/settings.json +8 -0
- package/dist/defaults/AGENTS.md +113 -0
- package/dist/defaults/CHANGELOG.md +15 -0
- package/dist/defaults/CLAUDE.md +1 -0
- package/dist/defaults/_.gitignore +75 -0
- package/dist/defaults/config/description.md +46 -0
- package/dist/defaults/config/messages.json +20 -0
- package/dist/defaults/config/omega.json5 +64 -0
- package/dist/defaults/docs/README.md +17 -0
- package/dist/defaults/gulpfile.js +6 -0
- package/dist/defaults/hooks/build/post.js +8 -0
- package/dist/defaults/hooks/build/pre.js +8 -0
- package/dist/defaults/src/assets/css/bundles/.gitkeep +0 -0
- package/dist/defaults/src/assets/css/components/content/index.scss +11 -0
- package/dist/defaults/src/assets/css/components/offscreen/index.scss +4 -0
- package/dist/defaults/src/assets/css/components/options/index.scss +14 -0
- package/dist/defaults/src/assets/css/components/pages/index.scss +10 -0
- package/dist/defaults/src/assets/css/components/popup/index.scss +10 -0
- package/dist/defaults/src/assets/css/components/sidepanel/index.scss +6 -0
- package/dist/defaults/src/assets/css/main.scss +32 -0
- package/dist/defaults/src/assets/images/.gitkeep +0 -0
- package/dist/defaults/src/assets/js/components/background/index.js +25 -0
- package/dist/defaults/src/assets/js/components/content/index.js +22 -0
- package/dist/defaults/src/assets/js/components/offscreen/index.js +25 -0
- package/dist/defaults/src/assets/js/components/options/index.js +22 -0
- package/dist/defaults/src/assets/js/components/pages/index.js +22 -0
- package/dist/defaults/src/assets/js/components/popup/index.js +22 -0
- package/dist/defaults/src/assets/js/components/sidepanel/index.js +20 -0
- package/dist/defaults/src/assets/vendor/.gitkeep +0 -0
- package/dist/defaults/src/manifest.json +131 -0
- package/dist/defaults/src/views/offscreen/index.html +3 -0
- package/dist/defaults/src/views/options/index.html +8 -0
- package/dist/defaults/src/views/pages/index.html +10 -0
- package/dist/defaults/src/views/popup/index.html +4 -0
- package/dist/defaults/src/views/sidepanel/index.html +4 -0
- package/dist/defaults/test/README.md +41 -0
- package/dist/defaults/test/_init.js +10 -0
- package/dist/defaults/test/boot/externally-connectable.test.js +28 -0
- package/dist/gulp/config/locales.js +12 -0
- package/dist/gulp/main.js +78 -0
- package/dist/gulp/tasks/_.js +18 -0
- package/dist/gulp/tasks/audit.js +222 -0
- package/dist/gulp/tasks/bundle.js +687 -0
- package/dist/gulp/tasks/defaults.js +281 -0
- package/dist/gulp/tasks/distribute.js +172 -0
- package/dist/gulp/tasks/fontawesome.js +25 -0
- package/dist/gulp/tasks/html.js +163 -0
- package/dist/gulp/tasks/icons.js +126 -0
- package/dist/gulp/tasks/package.js +742 -0
- package/dist/gulp/tasks/publish.js +417 -0
- package/dist/gulp/tasks/sass.js +252 -0
- package/dist/gulp/tasks/serve.js +103 -0
- package/dist/gulp/tasks/translate.js +252 -0
- package/dist/gulp/tasks/utils/build-json.js +43 -0
- package/dist/gulp/tasks/utils/template-transform.js +50 -0
- package/dist/gulp/templates/BUILD_INSTRUCTIONS.md +69 -0
- package/dist/index.js +46 -0
- package/dist/lib/affiliatizer.js +224 -0
- package/dist/lib/analytics.js +26 -0
- package/dist/lib/auth-helpers.js +213 -0
- package/dist/lib/extension.js +116 -0
- package/dist/lib/icons.js +36 -0
- package/dist/lib/logger-lite.js +35 -0
- package/dist/lib/logger.js +4 -0
- package/dist/lib/messaging.js +48 -0
- package/dist/lib/safe-install.js +4 -0
- package/dist/lib/theme.js +73 -0
- package/dist/lib/verts.js +68 -0
- package/dist/offscreen.js +31 -0
- package/dist/omega-bin.js +6 -0
- package/dist/options.js +80 -0
- package/dist/page.js +80 -0
- package/dist/popup.js +80 -0
- package/dist/sidepanel.js +80 -0
- package/dist/test/assert.js +4 -0
- package/dist/test/fixtures/consumer-extension/dist/background.js +23 -0
- package/dist/test/fixtures/consumer-extension/dist/manifest.json +20 -0
- package/dist/test/fixtures/consumer-extension/dist/options.html +10 -0
- package/dist/test/fixtures/consumer-extension/dist/popup.bundle.js +5 -0
- package/dist/test/fixtures/consumer-extension/dist/popup.html +12 -0
- package/dist/test/harness/extension/background.js +26 -0
- package/dist/test/harness/extension/manifest.json +27 -0
- package/dist/test/harness/extension/options.html +12 -0
- package/dist/test/harness/extension/popup.html +12 -0
- package/dist/test/harness/extension/sidepanel.html +12 -0
- package/dist/test/index.js +63 -0
- package/dist/test/runner.js +99 -0
- package/dist/test/runners/boot.js +221 -0
- package/dist/test/runners/chromium.js +391 -0
- package/dist/test/runners/helpers.js +24 -0
- package/dist/test/suites/background/messaging.test.js +44 -0
- package/dist/test/suites/background/storage.test.js +46 -0
- package/dist/test/suites/background/sw-context.test.js +49 -0
- package/dist/test/suites/boot/build-json-bake.test.js +80 -0
- package/dist/test/suites/boot/extension-loads.test.js +58 -0
- package/dist/test/suites/build/affiliatizer.test.js +64 -0
- package/dist/test/suites/build/app-launch.test.js +65 -0
- package/dist/test/suites/build/attach-log-file.test.js +99 -0
- package/dist/test/suites/build/auth-emulator-gate.test.js +118 -0
- package/dist/test/suites/build/auth-triggers.test.js +71 -0
- package/dist/test/suites/build/boot-discovery.test.js +134 -0
- package/dist/test/suites/build/boot-timeout.test.js +92 -0
- package/dist/test/suites/build/build-error-notification.test.js +122 -0
- package/dist/test/suites/build/build-json-bake.test.js +302 -0
- package/dist/test/suites/build/build-verb.test.js +138 -0
- package/dist/test/suites/build/bundle-targets.test.js +66 -0
- package/dist/test/suites/build/cache-warming.test.js +44 -0
- package/dist/test/suites/build/cli.test.js +150 -0
- package/dist/test/suites/build/default-boot-test.test.js +100 -0
- package/dist/test/suites/build/defaults-scaffold.test.js +287 -0
- package/dist/test/suites/build/deploy-dispatch.test.js +76 -0
- package/dist/test/suites/build/distribute-task.test.js +111 -0
- package/dist/test/suites/build/ensure-target.test.js +141 -0
- package/dist/test/suites/build/env-delivery.test.js +239 -0
- package/dist/test/suites/build/env-watch.test.js +86 -0
- package/dist/test/suites/build/expect.test.js +48 -0
- package/dist/test/suites/build/exports.test.js +53 -0
- package/dist/test/suites/build/extension-fallback.test.js +82 -0
- package/dist/test/suites/build/framework-deps.test.js +176 -0
- package/dist/test/suites/build/global-handlers.test.js +70 -0
- package/dist/test/suites/build/icon-sheet.test.js +74 -0
- package/dist/test/suites/build/logger-lite.test.js +61 -0
- package/dist/test/suites/build/manager.test.js +249 -0
- package/dist/test/suites/build/mode-helpers.test.js +136 -0
- package/dist/test/suites/build/omega-shell.test.js +103 -0
- package/dist/test/suites/build/omega-tokens.test.js +76 -0
- package/dist/test/suites/build/package-task.test.js +831 -0
- package/dist/test/suites/build/setup-scripts.test.js +172 -0
- package/dist/test/suites/build/strip-dev-blocks.test.js +122 -0
- package/dist/test/suites/build/template-replace.test.js +116 -0
- package/dist/test/suites/build/test-discovery.test.js +64 -0
- package/dist/test/suites/build/test-target-no-match.test.js +119 -0
- package/dist/test/suites/build/theme-resolve.test.js +115 -0
- package/dist/test/suites/build/translate.test.js +85 -0
- package/dist/test/suites/build/url-helpers.test.js +119 -0
- package/dist/test/suites/build/verb-logs.test.js +43 -0
- package/dist/test/suites/build/verts-binding.test.js +67 -0
- package/dist/test/suites/build/wakeup-ping.test.js +90 -0
- package/dist/test/suites/build/wave5-messenger.test.js +80 -0
- package/dist/test/suites/view/options-and-sidepanel.test.js +16 -0
- package/dist/test/suites/view/popup-context.test.js +53 -0
- package/dist/test/suites/view/sidepanel.test.js +16 -0
- package/dist/test/utils/extended-mode-warning.js +13 -0
- package/dist/utils/attach-log-file.js +4 -0
- package/dist/utils/mode-helpers.js +117 -0
- package/dist/utils/url-helpers.js +69 -0
- package/dist/vendor/account/engine.js +182 -0
- package/dist/vendor/account/features.js +220 -0
- package/dist/vendor/account/index.js +53 -0
- package/dist/vendor/account/schema.js +272 -0
- package/dist/vendor/account/subscription.js +38 -0
- package/dist/vendor/config/company.js +31 -0
- package/dist/vendor/config/defaults.js +173 -0
- package/dist/vendor/config/demo.js +18 -0
- package/dist/vendor/config/desktop-artifacts.js +110 -0
- package/dist/vendor/config/edit.js +769 -0
- package/dist/vendor/config/env-delivery.js +145 -0
- package/dist/vendor/config/env-rules.js +93 -0
- package/dist/vendor/config/env-schema.js +1078 -0
- package/dist/vendor/config/env.js +445 -0
- package/dist/vendor/config/hooks.js +97 -0
- package/dist/vendor/config/index.js +237 -0
- package/dist/vendor/config/instances.js +208 -0
- package/dist/vendor/config/load.js +490 -0
- package/dist/vendor/config/merge.js +68 -0
- package/dist/vendor/config/order.js +139 -0
- package/dist/vendor/config/ports.js +374 -0
- package/dist/vendor/config/providers.js +32 -0
- package/dist/vendor/config/repo.js +142 -0
- package/dist/vendor/config/retired-keys.js +430 -0
- package/dist/vendor/config/schema.js +1610 -0
- package/dist/vendor/config/secrets.js +50 -0
- package/dist/vendor/config/seed.js +34 -0
- package/dist/vendor/config/site-global.js +205 -0
- package/dist/vendor/config/validate.js +554 -0
- package/dist/vendor/config/winback.js +61 -0
- package/dist/vendor/devkit/actions-secrets.js +145 -0
- package/dist/vendor/devkit/attach-log-file.js +262 -0
- package/dist/vendor/devkit/bundle.js +292 -0
- package/dist/vendor/devkit/ci-workflows.js +520 -0
- package/dist/vendor/devkit/clean-dirs.js +28 -0
- package/dist/vendor/devkit/cli-router.js +156 -0
- package/dist/vendor/devkit/defaults-engine.js +372 -0
- package/dist/vendor/devkit/deploy-precheck.js +54 -0
- package/dist/vendor/devkit/deploy-record.js +180 -0
- package/dist/vendor/devkit/deploy.js +286 -0
- package/dist/vendor/devkit/empty-modules-plugin.js +64 -0
- package/dist/vendor/devkit/env-watch.js +132 -0
- package/dist/vendor/devkit/framework-deps.js +46 -0
- package/dist/vendor/devkit/icons.js +178 -0
- package/dist/vendor/devkit/license.js +155 -0
- package/dist/vendor/devkit/local.js +1905 -0
- package/dist/vendor/devkit/logger.js +128 -0
- package/dist/vendor/devkit/merge-line-files.js +296 -0
- package/dist/vendor/devkit/npm-registry.js +52 -0
- package/dist/vendor/devkit/omega-bin.js +345 -0
- package/dist/vendor/devkit/safe-install.js +18 -0
- package/dist/vendor/devkit/scaffold-guard.js +96 -0
- package/dist/vendor/devkit/strip-dev-blocks-plugin.js +29 -0
- package/dist/vendor/devkit/strip-dev-blocks.js +32 -0
- package/dist/vendor/devkit/target-dependencies.js +137 -0
- package/dist/vendor/devkit/target-secrets.js +165 -0
- package/dist/vendor/devkit/test/assert.js +120 -0
- package/dist/vendor/devkit/test/define-cases.js +104 -0
- package/dist/vendor/devkit/test/extended-mode-warning.js +22 -0
- package/dist/vendor/devkit/test/runner-core.js +554 -0
- package/dist/vendor/devkit/test/scope.js +162 -0
- package/dist/vendor/devkit/translate/cache.js +84 -0
- package/dist/vendor/devkit/translate/engine.js +243 -0
- package/dist/vendor/devkit/translate/index.js +49 -0
- package/dist/vendor/devkit/translate/languages.js +134 -0
- package/dist/vendor/devkit/translate/providers.js +188 -0
- package/dist/vendor/devkit/update.js +569 -0
- package/docs/affiliatizer.md +81 -0
- package/docs/audit.md +67 -0
- package/docs/auth.md +149 -0
- package/docs/build-system.md +176 -0
- package/docs/cdp-debugging.md +42 -0
- package/docs/cli.md +73 -0
- package/docs/common-mistakes.md +10 -0
- package/docs/components.md +87 -0
- package/docs/css.md +133 -0
- package/docs/defaults.md +72 -0
- package/docs/environment-detection.md +79 -0
- package/docs/extension.md +93 -0
- package/docs/hooks.md +111 -0
- package/docs/icons.md +47 -0
- package/docs/index.md +291 -0
- package/docs/logging.md +33 -0
- package/docs/managers.md +100 -0
- package/docs/offscreen.md +57 -0
- package/docs/publishing.md +182 -0
- package/docs/shared/agent-docs.md +89 -0
- package/docs/shared/analytics.md +612 -0
- package/docs/shared/brands.md +51 -0
- package/docs/shared/breaking-changes.md +497 -0
- package/docs/shared/config.md +1387 -0
- package/docs/shared/deploys.md +215 -0
- package/docs/shared/icons.md +201 -0
- package/docs/shared/local-dev.md +147 -0
- package/docs/shared/logging.md +202 -0
- package/docs/shared/monitoring.md +153 -0
- package/docs/shared/publishing.md +183 -0
- package/docs/shared/rulings.md +34 -0
- package/docs/shared/testing.md +147 -0
- package/docs/shared/theming.md +604 -0
- package/docs/shared/translation.md +291 -0
- package/docs/shared/updates.md +61 -0
- package/docs/templating.md +66 -0
- package/docs/test-boot-layer.md +143 -0
- package/docs/test-framework.md +411 -0
- package/docs/themes.md +89 -0
- package/docs/translations.md +73 -0
- package/docs/verts.md +67 -0
- package/docs/xss-prevention.md +95 -0
- package/package.json +159 -0
|
@@ -0,0 +1,2104 @@
|
|
|
1
|
+
---
|
|
2
|
+
# A page IN the user app (cp182): rides the omega-shell (backend/core/minimal
|
|
3
|
+
# → sidebar + topbar + main) instead of the old bespoke cover treatment with
|
|
4
|
+
# its fixed header + close button. The base layout brings the authenticated
|
|
5
|
+
# policy; the section rail below is page-owned (hash-driven JS contract).
|
|
6
|
+
# The layout page-header stays OFF: each section stamps the same anatomy
|
|
7
|
+
# (frontend/sections/account-section-header.html) so the visible title tracks
|
|
8
|
+
# the active section, and the rail speaks the shell sidebar dialect
|
|
9
|
+
# (omega-side__*) — one backend voice everywhere (cp183).
|
|
10
|
+
layout: backend/core/minimal
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
sections:
|
|
14
|
+
- id: "profile"
|
|
15
|
+
name: "Profile"
|
|
16
|
+
icon: "user-circle"
|
|
17
|
+
- id: "security"
|
|
18
|
+
name: "Security"
|
|
19
|
+
icon: "shield-halved"
|
|
20
|
+
- id: "connections"
|
|
21
|
+
name: "Connections"
|
|
22
|
+
icon: "link"
|
|
23
|
+
- id: "billing"
|
|
24
|
+
name: "Billing"
|
|
25
|
+
icon: "credit-card"
|
|
26
|
+
- id: "orders"
|
|
27
|
+
name: "Orders"
|
|
28
|
+
icon: "receipt"
|
|
29
|
+
- id: "referrals"
|
|
30
|
+
name: "Referrals"
|
|
31
|
+
icon: "user-plus"
|
|
32
|
+
- id: "team"
|
|
33
|
+
name: "Team"
|
|
34
|
+
icon: "users"
|
|
35
|
+
- id: "notifications"
|
|
36
|
+
name: "Notifications"
|
|
37
|
+
icon: "bell"
|
|
38
|
+
- id: "api-keys"
|
|
39
|
+
name: "API & MCP"
|
|
40
|
+
icon: "key"
|
|
41
|
+
- id: "data-request"
|
|
42
|
+
name: "Data request"
|
|
43
|
+
icon: "file-export"
|
|
44
|
+
- id: "delete"
|
|
45
|
+
name: "Delete account"
|
|
46
|
+
icon: "trash"
|
|
47
|
+
- id: "refund"
|
|
48
|
+
name: "Refund"
|
|
49
|
+
icon: "rotate-left"
|
|
50
|
+
|
|
51
|
+
signin_methods:
|
|
52
|
+
- id: "password"
|
|
53
|
+
name: "Password"
|
|
54
|
+
icon: "key"
|
|
55
|
+
- id: "google"
|
|
56
|
+
name: "Google"
|
|
57
|
+
logo: "https://cdn.itwcreativeworks.com/assets/general/images/brands/color/google.svg"
|
|
58
|
+
|
|
59
|
+
badges:
|
|
60
|
+
- id: "member"
|
|
61
|
+
name: "Member"
|
|
62
|
+
icon: "sailboat"
|
|
63
|
+
chip_class: "omega-chip"
|
|
64
|
+
always_visible: true
|
|
65
|
+
- id: "admin"
|
|
66
|
+
name: "Admin"
|
|
67
|
+
icon: "hat-wizard"
|
|
68
|
+
chip_class: "omega-chip omega-chip--ink"
|
|
69
|
+
- id: "premium"
|
|
70
|
+
name: "Premium"
|
|
71
|
+
icon: "crown"
|
|
72
|
+
chip_class: "omega-chip omega-chip--accent"
|
|
73
|
+
- id: "beta"
|
|
74
|
+
name: "Beta"
|
|
75
|
+
icon: "bolt"
|
|
76
|
+
chip_class: "omega-chip"
|
|
77
|
+
- id: "coder"
|
|
78
|
+
name: "Developer"
|
|
79
|
+
icon: "code"
|
|
80
|
+
chip_class: "omega-chip"
|
|
81
|
+
- id: "moderator"
|
|
82
|
+
name: "Moderator"
|
|
83
|
+
icon: "shield-halved"
|
|
84
|
+
chip_class: "omega-chip"
|
|
85
|
+
- id: "vip"
|
|
86
|
+
name: "VIP"
|
|
87
|
+
icon: "award"
|
|
88
|
+
chip_class: "omega-chip omega-chip--accent"
|
|
89
|
+
config:
|
|
90
|
+
theme:
|
|
91
|
+
header:
|
|
92
|
+
enabled: false
|
|
93
|
+
breadcrumbs:
|
|
94
|
+
items:
|
|
95
|
+
- label: "Account"
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
{% assign hidden_sections = "delete,data-request,refund" | split: "," %}
|
|
99
|
+
|
|
100
|
+
<!-- Mobile Navigation Dropdown (signing out lives in the topbar avatar menu) -->
|
|
101
|
+
<div class="d-lg-none mb-4">
|
|
102
|
+
<select class="form-select" id="mobile-nav-select" aria-label="Select account section">
|
|
103
|
+
{% for section in resolved.sections %}
|
|
104
|
+
{% unless hidden_sections contains section.id %}
|
|
105
|
+
<option value="{{ section.id }}" {% if forloop.first %}selected{% endif %}>
|
|
106
|
+
{{ section.name }}
|
|
107
|
+
</option>
|
|
108
|
+
{% endunless %}
|
|
109
|
+
{% endfor %}
|
|
110
|
+
<!-- Hidden section options are added dynamically by JavaScript when needed -->
|
|
111
|
+
</select>
|
|
112
|
+
</div>
|
|
113
|
+
|
|
114
|
+
<!-- Main Content with Sidebar -->
|
|
115
|
+
<div class="container-fluid px-0 d-flex flex-column flex-grow-1">
|
|
116
|
+
<div class="row flex-grow-1">
|
|
117
|
+
<!-- Section rail (page-owned: hash-driven, not the app sidebar) — speaks
|
|
118
|
+
the shell sidebar dialect (omega-side__*) so the whole backend reads
|
|
119
|
+
as one surface; .nav-link stays purely as the JS hook. The row fills
|
|
120
|
+
the panel and the rail draws a full-height lane divider, so every
|
|
121
|
+
section shares ONE skeleton — the rail box must never track whichever
|
|
122
|
+
column happens to be tallest (cp185). -->
|
|
123
|
+
<nav class="col-lg-3 d-none d-lg-block hairline-end" aria-label="Account navigation">
|
|
124
|
+
<div class="position-sticky" style="top: 1rem;">
|
|
125
|
+
<span class="omega-side__label mt-0">Settings</span>
|
|
126
|
+
<ul class="list-unstyled mb-0" id="account-nav" role="tablist" aria-label="Account sections">
|
|
127
|
+
{% for section in resolved.sections %}
|
|
128
|
+
<li class="{% if hidden_sections contains section.id %}d-none{% endif %}" id="{{ section.id }}-nav-item">
|
|
129
|
+
<a class="nav-link omega-side__item {% if forloop.first %}active{% endif %}"
|
|
130
|
+
href="#{{ section.id }}"
|
|
131
|
+
data-section="{{ section.id }}"
|
|
132
|
+
role="tab">
|
|
133
|
+
<span class="omega-side__icon"><i class="fa-solid fa-{{ section.icon }} fa-sm"></i></span>
|
|
134
|
+
<span>{{ section.name }}</span>
|
|
135
|
+
</a>
|
|
136
|
+
</li>
|
|
137
|
+
{% endfor %}
|
|
138
|
+
</ul>
|
|
139
|
+
<!-- No page-owned Sign out: the topbar avatar menu carries it (Ian, cp185) -->
|
|
140
|
+
</div>
|
|
141
|
+
</nav>
|
|
142
|
+
|
|
143
|
+
<!-- Content Area -->
|
|
144
|
+
<div class="col-lg-9 text-start">
|
|
145
|
+
<div class="px-3 py-4 pt-0">
|
|
146
|
+
|
|
147
|
+
<!-- Loading Section (visible initially) -->
|
|
148
|
+
<section id="loading-section" class="account-section">
|
|
149
|
+
<div class="d-flex flex-column align-items-center justify-content-center" style="min-height: 400px;">
|
|
150
|
+
<div class="spinner-border spinner-border-lg text-primary mb-3" role="status">
|
|
151
|
+
<span class="visually-hidden">Loading...</span>
|
|
152
|
+
</div>
|
|
153
|
+
<h4 class="text-muted">Loading your account...</h4>
|
|
154
|
+
</div>
|
|
155
|
+
</section>
|
|
156
|
+
|
|
157
|
+
<!-- Profile Section -->
|
|
158
|
+
<section id="profile-section" class="account-section d-none">
|
|
159
|
+
{% include frontend/sections/account-section-header.html title="My profile" icon="user-circle" %}
|
|
160
|
+
|
|
161
|
+
<form id="profile-form" novalidate data-form-state="initializing" onsubmit="return false">
|
|
162
|
+
<!-- Avatar and Edit Button -->
|
|
163
|
+
<div class="mb-4">
|
|
164
|
+
<div class="d-flex align-items-center">
|
|
165
|
+
<div id="avatar-container" class="me-3 position-relative d-flex align-items-center">
|
|
166
|
+
<!-- Avatar always available from getUser() -->
|
|
167
|
+
<div class="avatar avatar-lg rounded-circle overflow-hidden border">
|
|
168
|
+
<img src="{{ site.omega.placeholder.src }}" data-omega-bind="@attr src auth.user.photoURL" class="object-fit-cover w-100 h-100" alt="{{ resolved.config.brand.name }} profile picture"/>
|
|
169
|
+
</div>
|
|
170
|
+
<!-- Active status indicator -->
|
|
171
|
+
<span class="position-absolute bottom-0 end-0 p-1 bg-success border border-2 border-white avatar avatar-2xs rounded-circle mb-0">
|
|
172
|
+
<span class="visually-hidden">Active status</span>
|
|
173
|
+
</span>
|
|
174
|
+
</div>
|
|
175
|
+
<div>
|
|
176
|
+
<h5 class="mb-1" data-omega-bind="@text auth.user.displayName">Loading...</h5>
|
|
177
|
+
<small class="text-muted" id="profile-join-date">Member since Loading...</small>
|
|
178
|
+
</div>
|
|
179
|
+
</div>
|
|
180
|
+
|
|
181
|
+
<!-- Role Badges -->
|
|
182
|
+
<div id="role-badges" class="mt-2 d-flex gap-2 flex-wrap">
|
|
183
|
+
{% for badge in resolved.badges %}
|
|
184
|
+
<span id="badge-{{ badge.id }}" class="{{ badge.chip_class }} {% unless badge.always_visible %}d-none{% endunless %}">
|
|
185
|
+
<i class="fa-solid fa-{{ badge.icon }} fa-sm"></i>
|
|
186
|
+
{{ badge.name }}
|
|
187
|
+
</span>
|
|
188
|
+
{% endfor %}
|
|
189
|
+
</div>
|
|
190
|
+
</div>
|
|
191
|
+
|
|
192
|
+
<!-- Account Details Section -->
|
|
193
|
+
<div class="card mb-3">
|
|
194
|
+
<div class="card-header">
|
|
195
|
+
<h6 class="mb-0 d-inline-flex align-items-center"><i class="fa-solid fa-id-card fa-md me-2"></i> Account details</h6>
|
|
196
|
+
</div>
|
|
197
|
+
<div class="card-body">
|
|
198
|
+
<!-- Email and UID Fields Row -->
|
|
199
|
+
<div class="row g-3">
|
|
200
|
+
<!-- Email Field -->
|
|
201
|
+
<div class="col-lg-6">
|
|
202
|
+
<label for="email-input" class="form-label small text-muted">
|
|
203
|
+
Email
|
|
204
|
+
</label>
|
|
205
|
+
<input type="email" class="form-control" id="email-input" name="auth.email" autocomplete="email" readonly>
|
|
206
|
+
</div>
|
|
207
|
+
|
|
208
|
+
<!-- UID Field -->
|
|
209
|
+
<div class="col-lg-6">
|
|
210
|
+
<label for="uid-input" class="form-label small text-muted">
|
|
211
|
+
User ID
|
|
212
|
+
</label>
|
|
213
|
+
<div class="input-group">
|
|
214
|
+
<input type="text" class="form-control font-monospace" id="uid-input" name="auth.uid" readonly>
|
|
215
|
+
<button type="button" class="btn btn-outline-adaptive" id="copy-uid-btn" data-omega-copy aria-label="Copy UID">
|
|
216
|
+
<i class="fa-solid fa-copy me-2"></i>
|
|
217
|
+
<span class="button-text d-none d-sm-inline">Copy</span>
|
|
218
|
+
</button>
|
|
219
|
+
</div>
|
|
220
|
+
</div>
|
|
221
|
+
</div>
|
|
222
|
+
</div>
|
|
223
|
+
</div>
|
|
224
|
+
|
|
225
|
+
<!-- Personal Information Section -->
|
|
226
|
+
<div class="card mb-3">
|
|
227
|
+
<div class="card-header">
|
|
228
|
+
<h6 class="mb-0 d-inline-flex align-items-center"><i class="fa-solid fa-user-pen fa-md me-2"></i> Personal information</h6>
|
|
229
|
+
</div>
|
|
230
|
+
<div class="card-body">
|
|
231
|
+
<!-- Name Fields Row -->
|
|
232
|
+
<div class="row g-3 mb-3">
|
|
233
|
+
<div class="col-md-6">
|
|
234
|
+
<label for="first-name-input" class="form-label small text-muted">First name</label>
|
|
235
|
+
<input type="text" class="form-control" id="first-name-input" name="personal.name.first" autocomplete="given-name" placeholder="Enter first name">
|
|
236
|
+
</div>
|
|
237
|
+
<div class="col-md-6">
|
|
238
|
+
<label for="last-name-input" class="form-label small text-muted">Last name</label>
|
|
239
|
+
<input type="text" class="form-control" id="last-name-input" name="personal.name.last" autocomplete="family-name" placeholder="Enter last name">
|
|
240
|
+
</div>
|
|
241
|
+
</div>
|
|
242
|
+
|
|
243
|
+
<!-- Birthday and Gender Row -->
|
|
244
|
+
<div class="row g-3 mb-3">
|
|
245
|
+
<div class="col-md-6">
|
|
246
|
+
<label for="birthday-input" class="form-label small text-muted">Birthday</label>
|
|
247
|
+
<input type="date" class="form-control" id="birthday-input" name="personal.birthday" autocomplete="bday">
|
|
248
|
+
</div>
|
|
249
|
+
<div class="col-md-6">
|
|
250
|
+
<label for="gender-select" class="form-label small text-muted">Gender</label>
|
|
251
|
+
<select class="form-select" id="gender-select" name="personal.gender" autocomplete="sex">
|
|
252
|
+
<option value="">Select gender</option>
|
|
253
|
+
<option value="male">Male</option>
|
|
254
|
+
<option value="female">Female</option>
|
|
255
|
+
<option value="other">Other</option>
|
|
256
|
+
</select>
|
|
257
|
+
</div>
|
|
258
|
+
</div>
|
|
259
|
+
|
|
260
|
+
<!-- Country and Region Row -->
|
|
261
|
+
<div class="row g-3 mb-3">
|
|
262
|
+
<div class="col-md-6">
|
|
263
|
+
<label for="country-select" class="form-label small text-muted">Country</label>
|
|
264
|
+
<select class="form-select" id="country-select" name="personal.location.country" autocomplete="country" data-omega-no-translate>
|
|
265
|
+
<option value="">Select country</option>
|
|
266
|
+
<option value="AF">Afghanistan</option>
|
|
267
|
+
<option value="AL">Albania</option>
|
|
268
|
+
<option value="DZ">Algeria</option>
|
|
269
|
+
<option value="AD">Andorra</option>
|
|
270
|
+
<option value="AO">Angola</option>
|
|
271
|
+
<option value="AG">Antigua and Barbuda</option>
|
|
272
|
+
<option value="AR">Argentina</option>
|
|
273
|
+
<option value="AM">Armenia</option>
|
|
274
|
+
<option value="AU">Australia</option>
|
|
275
|
+
<option value="AT">Austria</option>
|
|
276
|
+
<option value="AZ">Azerbaijan</option>
|
|
277
|
+
<option value="BS">Bahamas</option>
|
|
278
|
+
<option value="BH">Bahrain</option>
|
|
279
|
+
<option value="BD">Bangladesh</option>
|
|
280
|
+
<option value="BB">Barbados</option>
|
|
281
|
+
<option value="BY">Belarus</option>
|
|
282
|
+
<option value="BE">Belgium</option>
|
|
283
|
+
<option value="BZ">Belize</option>
|
|
284
|
+
<option value="BJ">Benin</option>
|
|
285
|
+
<option value="BT">Bhutan</option>
|
|
286
|
+
<option value="BO">Bolivia</option>
|
|
287
|
+
<option value="BA">Bosnia and Herzegovina</option>
|
|
288
|
+
<option value="BW">Botswana</option>
|
|
289
|
+
<option value="BR">Brazil</option>
|
|
290
|
+
<option value="BN">Brunei</option>
|
|
291
|
+
<option value="BG">Bulgaria</option>
|
|
292
|
+
<option value="BF">Burkina Faso</option>
|
|
293
|
+
<option value="BI">Burundi</option>
|
|
294
|
+
<option value="KH">Cambodia</option>
|
|
295
|
+
<option value="CM">Cameroon</option>
|
|
296
|
+
<option value="CA">Canada</option>
|
|
297
|
+
<option value="CV">Cape Verde</option>
|
|
298
|
+
<option value="CF">Central African Republic</option>
|
|
299
|
+
<option value="TD">Chad</option>
|
|
300
|
+
<option value="CL">Chile</option>
|
|
301
|
+
<option value="CN">China</option>
|
|
302
|
+
<option value="CO">Colombia</option>
|
|
303
|
+
<option value="KM">Comoros</option>
|
|
304
|
+
<option value="CG">Congo</option>
|
|
305
|
+
<option value="CR">Costa Rica</option>
|
|
306
|
+
<option value="HR">Croatia</option>
|
|
307
|
+
<option value="CU">Cuba</option>
|
|
308
|
+
<option value="CY">Cyprus</option>
|
|
309
|
+
<option value="CZ">Czech Republic</option>
|
|
310
|
+
<option value="DK">Denmark</option>
|
|
311
|
+
<option value="DJ">Djibouti</option>
|
|
312
|
+
<option value="DM">Dominica</option>
|
|
313
|
+
<option value="DO">Dominican Republic</option>
|
|
314
|
+
<option value="EC">Ecuador</option>
|
|
315
|
+
<option value="EG">Egypt</option>
|
|
316
|
+
<option value="SV">El Salvador</option>
|
|
317
|
+
<option value="GQ">Equatorial Guinea</option>
|
|
318
|
+
<option value="ER">Eritrea</option>
|
|
319
|
+
<option value="EE">Estonia</option>
|
|
320
|
+
<option value="ET">Ethiopia</option>
|
|
321
|
+
<option value="FJ">Fiji</option>
|
|
322
|
+
<option value="FI">Finland</option>
|
|
323
|
+
<option value="FR">France</option>
|
|
324
|
+
<option value="GA">Gabon</option>
|
|
325
|
+
<option value="GM">Gambia</option>
|
|
326
|
+
<option value="GE">Georgia</option>
|
|
327
|
+
<option value="DE">Germany</option>
|
|
328
|
+
<option value="GH">Ghana</option>
|
|
329
|
+
<option value="GR">Greece</option>
|
|
330
|
+
<option value="GD">Grenada</option>
|
|
331
|
+
<option value="GT">Guatemala</option>
|
|
332
|
+
<option value="GN">Guinea</option>
|
|
333
|
+
<option value="GW">Guinea-Bissau</option>
|
|
334
|
+
<option value="GY">Guyana</option>
|
|
335
|
+
<option value="HT">Haiti</option>
|
|
336
|
+
<option value="HN">Honduras</option>
|
|
337
|
+
<option value="HU">Hungary</option>
|
|
338
|
+
<option value="IS">Iceland</option>
|
|
339
|
+
<option value="IN">India</option>
|
|
340
|
+
<option value="ID">Indonesia</option>
|
|
341
|
+
<option value="IR">Iran</option>
|
|
342
|
+
<option value="IQ">Iraq</option>
|
|
343
|
+
<option value="IE">Ireland</option>
|
|
344
|
+
<option value="IL">Israel</option>
|
|
345
|
+
<option value="IT">Italy</option>
|
|
346
|
+
<option value="JM">Jamaica</option>
|
|
347
|
+
<option value="JP">Japan</option>
|
|
348
|
+
<option value="JO">Jordan</option>
|
|
349
|
+
<option value="KZ">Kazakhstan</option>
|
|
350
|
+
<option value="KE">Kenya</option>
|
|
351
|
+
<option value="KI">Kiribati</option>
|
|
352
|
+
<option value="KP">North Korea</option>
|
|
353
|
+
<option value="KR">South Korea</option>
|
|
354
|
+
<option value="KW">Kuwait</option>
|
|
355
|
+
<option value="KG">Kyrgyzstan</option>
|
|
356
|
+
<option value="LA">Laos</option>
|
|
357
|
+
<option value="LV">Latvia</option>
|
|
358
|
+
<option value="LB">Lebanon</option>
|
|
359
|
+
<option value="LS">Lesotho</option>
|
|
360
|
+
<option value="LR">Liberia</option>
|
|
361
|
+
<option value="LY">Libya</option>
|
|
362
|
+
<option value="LI">Liechtenstein</option>
|
|
363
|
+
<option value="LT">Lithuania</option>
|
|
364
|
+
<option value="LU">Luxembourg</option>
|
|
365
|
+
<option value="MK">Macedonia</option>
|
|
366
|
+
<option value="MG">Madagascar</option>
|
|
367
|
+
<option value="MW">Malawi</option>
|
|
368
|
+
<option value="MY">Malaysia</option>
|
|
369
|
+
<option value="MV">Maldives</option>
|
|
370
|
+
<option value="ML">Mali</option>
|
|
371
|
+
<option value="MT">Malta</option>
|
|
372
|
+
<option value="MH">Marshall Islands</option>
|
|
373
|
+
<option value="MR">Mauritania</option>
|
|
374
|
+
<option value="MU">Mauritius</option>
|
|
375
|
+
<option value="MX">Mexico</option>
|
|
376
|
+
<option value="FM">Micronesia</option>
|
|
377
|
+
<option value="MD">Moldova</option>
|
|
378
|
+
<option value="MC">Monaco</option>
|
|
379
|
+
<option value="MN">Mongolia</option>
|
|
380
|
+
<option value="ME">Montenegro</option>
|
|
381
|
+
<option value="MA">Morocco</option>
|
|
382
|
+
<option value="MZ">Mozambique</option>
|
|
383
|
+
<option value="MM">Myanmar</option>
|
|
384
|
+
<option value="NA">Namibia</option>
|
|
385
|
+
<option value="NR">Nauru</option>
|
|
386
|
+
<option value="NP">Nepal</option>
|
|
387
|
+
<option value="NL">Netherlands</option>
|
|
388
|
+
<option value="NZ">New Zealand</option>
|
|
389
|
+
<option value="NI">Nicaragua</option>
|
|
390
|
+
<option value="NE">Niger</option>
|
|
391
|
+
<option value="NG">Nigeria</option>
|
|
392
|
+
<option value="NO">Norway</option>
|
|
393
|
+
<option value="OM">Oman</option>
|
|
394
|
+
<option value="PK">Pakistan</option>
|
|
395
|
+
<option value="PW">Palau</option>
|
|
396
|
+
<option value="PA">Panama</option>
|
|
397
|
+
<option value="PG">Papua New Guinea</option>
|
|
398
|
+
<option value="PY">Paraguay</option>
|
|
399
|
+
<option value="PE">Peru</option>
|
|
400
|
+
<option value="PH">Philippines</option>
|
|
401
|
+
<option value="PL">Poland</option>
|
|
402
|
+
<option value="PT">Portugal</option>
|
|
403
|
+
<option value="QA">Qatar</option>
|
|
404
|
+
<option value="RO">Romania</option>
|
|
405
|
+
<option value="RU">Russia</option>
|
|
406
|
+
<option value="RW">Rwanda</option>
|
|
407
|
+
<option value="KN">Saint Kitts and Nevis</option>
|
|
408
|
+
<option value="LC">Saint Lucia</option>
|
|
409
|
+
<option value="VC">Saint Vincent and the Grenadines</option>
|
|
410
|
+
<option value="WS">Samoa</option>
|
|
411
|
+
<option value="SM">San Marino</option>
|
|
412
|
+
<option value="ST">Sao Tome and Principe</option>
|
|
413
|
+
<option value="SA">Saudi Arabia</option>
|
|
414
|
+
<option value="SN">Senegal</option>
|
|
415
|
+
<option value="RS">Serbia</option>
|
|
416
|
+
<option value="SC">Seychelles</option>
|
|
417
|
+
<option value="SL">Sierra Leone</option>
|
|
418
|
+
<option value="SG">Singapore</option>
|
|
419
|
+
<option value="SK">Slovakia</option>
|
|
420
|
+
<option value="SI">Slovenia</option>
|
|
421
|
+
<option value="SB">Solomon Islands</option>
|
|
422
|
+
<option value="SO">Somalia</option>
|
|
423
|
+
<option value="ZA">South Africa</option>
|
|
424
|
+
<option value="ES">Spain</option>
|
|
425
|
+
<option value="LK">Sri Lanka</option>
|
|
426
|
+
<option value="SD">Sudan</option>
|
|
427
|
+
<option value="SR">Suriname</option>
|
|
428
|
+
<option value="SZ">Swaziland</option>
|
|
429
|
+
<option value="SE">Sweden</option>
|
|
430
|
+
<option value="CH">Switzerland</option>
|
|
431
|
+
<option value="SY">Syria</option>
|
|
432
|
+
<option value="TW">Taiwan</option>
|
|
433
|
+
<option value="TJ">Tajikistan</option>
|
|
434
|
+
<option value="TZ">Tanzania</option>
|
|
435
|
+
<option value="TH">Thailand</option>
|
|
436
|
+
<option value="TL">Timor-Leste</option>
|
|
437
|
+
<option value="TG">Togo</option>
|
|
438
|
+
<option value="TO">Tonga</option>
|
|
439
|
+
<option value="TT">Trinidad and Tobago</option>
|
|
440
|
+
<option value="TN">Tunisia</option>
|
|
441
|
+
<option value="TR">Turkey</option>
|
|
442
|
+
<option value="TM">Turkmenistan</option>
|
|
443
|
+
<option value="TV">Tuvalu</option>
|
|
444
|
+
<option value="UG">Uganda</option>
|
|
445
|
+
<option value="UA">Ukraine</option>
|
|
446
|
+
<option value="AE">United Arab Emirates</option>
|
|
447
|
+
<option value="GB">United Kingdom</option>
|
|
448
|
+
<option value="US">United States</option>
|
|
449
|
+
<option value="UY">Uruguay</option>
|
|
450
|
+
<option value="UZ">Uzbekistan</option>
|
|
451
|
+
<option value="VU">Vanuatu</option>
|
|
452
|
+
<option value="VA">Vatican City</option>
|
|
453
|
+
<option value="VE">Venezuela</option>
|
|
454
|
+
<option value="VN">Vietnam</option>
|
|
455
|
+
<option value="YE">Yemen</option>
|
|
456
|
+
<option value="ZM">Zambia</option>
|
|
457
|
+
<option value="ZW">Zimbabwe</option>
|
|
458
|
+
</select>
|
|
459
|
+
</div>
|
|
460
|
+
<div class="col-md-6">
|
|
461
|
+
<label for="region-input" class="form-label small text-muted">Region</label>
|
|
462
|
+
<input type="text" class="form-control" id="region-input" name="personal.location.region" autocomplete="address-level1" placeholder="State, Province, or Region">
|
|
463
|
+
</div>
|
|
464
|
+
</div>
|
|
465
|
+
|
|
466
|
+
<!-- Street and Postal Code Row -->
|
|
467
|
+
<div class="row g-3 mb-3">
|
|
468
|
+
<div class="col-md-8">
|
|
469
|
+
<label for="street-input" class="form-label small text-muted">Street</label>
|
|
470
|
+
<input type="text" class="form-control" id="street-input" name="personal.location.street" autocomplete="street-address" placeholder="Street address">
|
|
471
|
+
</div>
|
|
472
|
+
<div class="col-md-4">
|
|
473
|
+
<label for="postal-code-input" class="form-label small text-muted">Postal code</label>
|
|
474
|
+
<input type="text" class="form-control" id="postal-code-input" name="personal.location.postalCode" autocomplete="postal-code" placeholder="Postal code">
|
|
475
|
+
</div>
|
|
476
|
+
</div>
|
|
477
|
+
|
|
478
|
+
<!-- City and Phone Row -->
|
|
479
|
+
<div class="row g-3 mb-3">
|
|
480
|
+
<div class="col-md-6">
|
|
481
|
+
<label for="city-input" class="form-label small text-muted">City</label>
|
|
482
|
+
<input type="text" class="form-control" id="city-input" name="personal.location.city" autocomplete="address-level2" placeholder="City">
|
|
483
|
+
</div>
|
|
484
|
+
<div class="col-md-6">
|
|
485
|
+
<label for="phone-input" class="form-label small text-muted">Phone</label>
|
|
486
|
+
<div class="input-group">
|
|
487
|
+
<select class="form-select flex-shrink-1" id="phone-country-code" name="personal.telephone.countryCode" autocomplete="tel-country-code" style="max-width: 140px;" data-omega-no-translate>
|
|
488
|
+
<option value="+1">+1 (USA/CAN)</option>
|
|
489
|
+
<option value="+7">+7 (RUS/KAZ)</option>
|
|
490
|
+
<option value="+20">+20 (EGY)</option>
|
|
491
|
+
<option value="+27">+27 (ZAF)</option>
|
|
492
|
+
<option value="+30">+30 (GRC)</option>
|
|
493
|
+
<option value="+31">+31 (NLD)</option>
|
|
494
|
+
<option value="+32">+32 (BEL)</option>
|
|
495
|
+
<option value="+33">+33 (FRA)</option>
|
|
496
|
+
<option value="+34">+34 (ESP)</option>
|
|
497
|
+
<option value="+36">+36 (HUN)</option>
|
|
498
|
+
<option value="+39">+39 (ITA)</option>
|
|
499
|
+
<option value="+40">+40 (ROU)</option>
|
|
500
|
+
<option value="+41">+41 (CHE)</option>
|
|
501
|
+
<option value="+43">+43 (AUT)</option>
|
|
502
|
+
<option value="+44">+44 (GBR)</option>
|
|
503
|
+
<option value="+45">+45 (DNK)</option>
|
|
504
|
+
<option value="+46">+46 (SWE)</option>
|
|
505
|
+
<option value="+47">+47 (NOR)</option>
|
|
506
|
+
<option value="+48">+48 (POL)</option>
|
|
507
|
+
<option value="+49">+49 (DEU)</option>
|
|
508
|
+
<option value="+51">+51 (PER)</option>
|
|
509
|
+
<option value="+52">+52 (MEX)</option>
|
|
510
|
+
<option value="+53">+53 (CUB)</option>
|
|
511
|
+
<option value="+54">+54 (ARG)</option>
|
|
512
|
+
<option value="+55">+55 (BRA)</option>
|
|
513
|
+
<option value="+56">+56 (CHL)</option>
|
|
514
|
+
<option value="+57">+57 (COL)</option>
|
|
515
|
+
<option value="+58">+58 (VEN)</option>
|
|
516
|
+
<option value="+60">+60 (MYS)</option>
|
|
517
|
+
<option value="+61">+61 (AUS)</option>
|
|
518
|
+
<option value="+62">+62 (IDN)</option>
|
|
519
|
+
<option value="+63">+63 (PHL)</option>
|
|
520
|
+
<option value="+64">+64 (NZL)</option>
|
|
521
|
+
<option value="+65">+65 (SGP)</option>
|
|
522
|
+
<option value="+66">+66 (THA)</option>
|
|
523
|
+
<option value="+81">+81 (JPN)</option>
|
|
524
|
+
<option value="+82">+82 (KOR)</option>
|
|
525
|
+
<option value="+84">+84 (VNM)</option>
|
|
526
|
+
<option value="+86">+86 (CHN)</option>
|
|
527
|
+
<option value="+90">+90 (TUR)</option>
|
|
528
|
+
<option value="+91">+91 (IND)</option>
|
|
529
|
+
<option value="+92">+92 (PAK)</option>
|
|
530
|
+
<option value="+93">+93 (AFG)</option>
|
|
531
|
+
<option value="+94">+94 (LKA)</option>
|
|
532
|
+
<option value="+95">+95 (MMR)</option>
|
|
533
|
+
<option value="+98">+98 (IRN)</option>
|
|
534
|
+
<option value="+212">+212 (MAR)</option>
|
|
535
|
+
<option value="+213">+213 (DZA)</option>
|
|
536
|
+
<option value="+216">+216 (TUN)</option>
|
|
537
|
+
<option value="+218">+218 (LBY)</option>
|
|
538
|
+
<option value="+220">+220 (GMB)</option>
|
|
539
|
+
<option value="+221">+221 (SEN)</option>
|
|
540
|
+
<option value="+222">+222 (MRT)</option>
|
|
541
|
+
<option value="+223">+223 (MLI)</option>
|
|
542
|
+
<option value="+224">+224 (GIN)</option>
|
|
543
|
+
<option value="+225">+225 (CIV)</option>
|
|
544
|
+
<option value="+226">+226 (BFA)</option>
|
|
545
|
+
<option value="+227">+227 (NER)</option>
|
|
546
|
+
<option value="+228">+228 (TGO)</option>
|
|
547
|
+
<option value="+229">+229 (BEN)</option>
|
|
548
|
+
<option value="+230">+230 (MUS)</option>
|
|
549
|
+
<option value="+231">+231 (LBR)</option>
|
|
550
|
+
<option value="+232">+232 (SLE)</option>
|
|
551
|
+
<option value="+233">+233 (GHA)</option>
|
|
552
|
+
<option value="+234">+234 (NGA)</option>
|
|
553
|
+
<option value="+235">+235 (TCD)</option>
|
|
554
|
+
<option value="+236">+236 (CAF)</option>
|
|
555
|
+
<option value="+237">+237 (CMR)</option>
|
|
556
|
+
<option value="+238">+238 (CPV)</option>
|
|
557
|
+
<option value="+239">+239 (STP)</option>
|
|
558
|
+
<option value="+240">+240 (GNQ)</option>
|
|
559
|
+
<option value="+241">+241 (GAB)</option>
|
|
560
|
+
<option value="+242">+242 (COG)</option>
|
|
561
|
+
<option value="+243">+243 (COD)</option>
|
|
562
|
+
<option value="+244">+244 (AGO)</option>
|
|
563
|
+
<option value="+245">+245 (GNB)</option>
|
|
564
|
+
<option value="+246">+246 (IOT)</option>
|
|
565
|
+
<option value="+248">+248 (SYC)</option>
|
|
566
|
+
<option value="+249">+249 (SDN)</option>
|
|
567
|
+
<option value="+250">+250 (RWA)</option>
|
|
568
|
+
<option value="+251">+251 (ETH)</option>
|
|
569
|
+
<option value="+252">+252 (SOM)</option>
|
|
570
|
+
<option value="+253">+253 (DJI)</option>
|
|
571
|
+
<option value="+254">+254 (KEN)</option>
|
|
572
|
+
<option value="+255">+255 (TZA)</option>
|
|
573
|
+
<option value="+256">+256 (UGA)</option>
|
|
574
|
+
<option value="+257">+257 (BDI)</option>
|
|
575
|
+
<option value="+258">+258 (MOZ)</option>
|
|
576
|
+
<option value="+260">+260 (ZMB)</option>
|
|
577
|
+
<option value="+261">+261 (MDG)</option>
|
|
578
|
+
<option value="+262">+262 (REU)</option>
|
|
579
|
+
<option value="+263">+263 (ZWE)</option>
|
|
580
|
+
<option value="+264">+264 (NAM)</option>
|
|
581
|
+
<option value="+265">+265 (MWI)</option>
|
|
582
|
+
<option value="+266">+266 (LSO)</option>
|
|
583
|
+
<option value="+267">+267 (BWA)</option>
|
|
584
|
+
<option value="+268">+268 (SWZ)</option>
|
|
585
|
+
<option value="+269">+269 (COM)</option>
|
|
586
|
+
<option value="+290">+290 (SHN)</option>
|
|
587
|
+
<option value="+291">+291 (ERI)</option>
|
|
588
|
+
<option value="+297">+297 (ABW)</option>
|
|
589
|
+
<option value="+298">+298 (FRO)</option>
|
|
590
|
+
<option value="+299">+299 (GRL)</option>
|
|
591
|
+
<option value="+350">+350 (GIB)</option>
|
|
592
|
+
<option value="+351">+351 (PRT)</option>
|
|
593
|
+
<option value="+352">+352 (LUX)</option>
|
|
594
|
+
<option value="+353">+353 (IRL)</option>
|
|
595
|
+
<option value="+354">+354 (ISL)</option>
|
|
596
|
+
<option value="+355">+355 (ALB)</option>
|
|
597
|
+
<option value="+356">+356 (MLT)</option>
|
|
598
|
+
<option value="+357">+357 (CYP)</option>
|
|
599
|
+
<option value="+358">+358 (FIN)</option>
|
|
600
|
+
<option value="+359">+359 (BGR)</option>
|
|
601
|
+
<option value="+370">+370 (LTU)</option>
|
|
602
|
+
<option value="+371">+371 (LVA)</option>
|
|
603
|
+
<option value="+372">+372 (EST)</option>
|
|
604
|
+
<option value="+373">+373 (MDA)</option>
|
|
605
|
+
<option value="+374">+374 (ARM)</option>
|
|
606
|
+
<option value="+375">+375 (BLR)</option>
|
|
607
|
+
<option value="+376">+376 (AND)</option>
|
|
608
|
+
<option value="+377">+377 (MCO)</option>
|
|
609
|
+
<option value="+378">+378 (SMR)</option>
|
|
610
|
+
<option value="+380">+380 (UKR)</option>
|
|
611
|
+
<option value="+381">+381 (SRB)</option>
|
|
612
|
+
<option value="+382">+382 (MNE)</option>
|
|
613
|
+
<option value="+385">+385 (HRV)</option>
|
|
614
|
+
<option value="+386">+386 (SVN)</option>
|
|
615
|
+
<option value="+387">+387 (BIH)</option>
|
|
616
|
+
<option value="+389">+389 (MKD)</option>
|
|
617
|
+
<option value="+420">+420 (CZE)</option>
|
|
618
|
+
<option value="+421">+421 (SVK)</option>
|
|
619
|
+
<option value="+423">+423 (LIE)</option>
|
|
620
|
+
<option value="+500">+500 (FLK)</option>
|
|
621
|
+
<option value="+501">+501 (BLZ)</option>
|
|
622
|
+
<option value="+502">+502 (GTM)</option>
|
|
623
|
+
<option value="+503">+503 (SLV)</option>
|
|
624
|
+
<option value="+504">+504 (HND)</option>
|
|
625
|
+
<option value="+505">+505 (NIC)</option>
|
|
626
|
+
<option value="+506">+506 (CRI)</option>
|
|
627
|
+
<option value="+507">+507 (PAN)</option>
|
|
628
|
+
<option value="+509">+509 (HTI)</option>
|
|
629
|
+
<option value="+590">+590 (GLP/BLF/MAF)</option>
|
|
630
|
+
<option value="+591">+591 (BOL)</option>
|
|
631
|
+
<option value="+592">+592 (GUY)</option>
|
|
632
|
+
<option value="+593">+593 (ECU)</option>
|
|
633
|
+
<option value="+594">+594 (GUF)</option>
|
|
634
|
+
<option value="+595">+595 (PRY)</option>
|
|
635
|
+
<option value="+596">+596 (MTQ)</option>
|
|
636
|
+
<option value="+597">+597 (SUR)</option>
|
|
637
|
+
<option value="+598">+598 (URY)</option>
|
|
638
|
+
<option value="+599">+599 (CUW/BES)</option>
|
|
639
|
+
<option value="+670">+670 (TLS)</option>
|
|
640
|
+
<option value="+673">+673 (BRN)</option>
|
|
641
|
+
<option value="+674">+674 (NRU)</option>
|
|
642
|
+
<option value="+675">+675 (PNG)</option>
|
|
643
|
+
<option value="+676">+676 (TON)</option>
|
|
644
|
+
<option value="+677">+677 (SLB)</option>
|
|
645
|
+
<option value="+678">+678 (VUT)</option>
|
|
646
|
+
<option value="+679">+679 (FJI)</option>
|
|
647
|
+
<option value="+680">+680 (PLW)</option>
|
|
648
|
+
<option value="+681">+681 (WLF)</option>
|
|
649
|
+
<option value="+682">+682 (COK)</option>
|
|
650
|
+
<option value="+683">+683 (NIU)</option>
|
|
651
|
+
<option value="+685">+685 (WSM)</option>
|
|
652
|
+
<option value="+686">+686 (KIR)</option>
|
|
653
|
+
<option value="+687">+687 (NCL)</option>
|
|
654
|
+
<option value="+688">+688 (TUV)</option>
|
|
655
|
+
<option value="+689">+689 (PYF)</option>
|
|
656
|
+
<option value="+690">+690 (TKL)</option>
|
|
657
|
+
<option value="+691">+691 (FSM)</option>
|
|
658
|
+
<option value="+692">+692 (MHL)</option>
|
|
659
|
+
<option value="+850">+850 (PRK)</option>
|
|
660
|
+
<option value="+852">+852 (HKG)</option>
|
|
661
|
+
<option value="+853">+853 (MAC)</option>
|
|
662
|
+
<option value="+855">+855 (KHM)</option>
|
|
663
|
+
<option value="+856">+856 (LAO)</option>
|
|
664
|
+
<option value="+880">+880 (BGD)</option>
|
|
665
|
+
<option value="+886">+886 (TWN)</option>
|
|
666
|
+
<option value="+960">+960 (MDV)</option>
|
|
667
|
+
<option value="+961">+961 (LBN)</option>
|
|
668
|
+
<option value="+962">+962 (JOR)</option>
|
|
669
|
+
<option value="+963">+963 (SYR)</option>
|
|
670
|
+
<option value="+964">+964 (IRQ)</option>
|
|
671
|
+
<option value="+965">+965 (KWT)</option>
|
|
672
|
+
<option value="+966">+966 (SAU)</option>
|
|
673
|
+
<option value="+967">+967 (YEM)</option>
|
|
674
|
+
<option value="+968">+968 (OMN)</option>
|
|
675
|
+
<option value="+970">+970 (PSE)</option>
|
|
676
|
+
<option value="+971">+971 (ARE)</option>
|
|
677
|
+
<option value="+972">+972 (ISR)</option>
|
|
678
|
+
<option value="+973">+973 (BHR)</option>
|
|
679
|
+
<option value="+974">+974 (QAT)</option>
|
|
680
|
+
<option value="+975">+975 (BTN)</option>
|
|
681
|
+
<option value="+976">+976 (MNG)</option>
|
|
682
|
+
<option value="+977">+977 (NPL)</option>
|
|
683
|
+
<option value="+992">+992 (TJK)</option>
|
|
684
|
+
<option value="+993">+993 (TKM)</option>
|
|
685
|
+
<option value="+994">+994 (AZE)</option>
|
|
686
|
+
<option value="+995">+995 (GEO)</option>
|
|
687
|
+
<option value="+996">+996 (KGZ)</option>
|
|
688
|
+
<option value="+998">+998 (UZB)</option>
|
|
689
|
+
</select>
|
|
690
|
+
<input type="tel" class="form-control" id="phone-input" name="personal.telephone.national" autocomplete="tel-national" placeholder="Phone number">
|
|
691
|
+
</div>
|
|
692
|
+
</div>
|
|
693
|
+
</div>
|
|
694
|
+
|
|
695
|
+
<!-- Save Button -->
|
|
696
|
+
<div class="mt-3 d-grid d-sm-block">
|
|
697
|
+
<button type="submit" class="btn btn-adaptive">
|
|
698
|
+
<i class="fa-solid fa-floppy-disk me-2"></i>
|
|
699
|
+
<span class="button-text">Save changes</span>
|
|
700
|
+
</button>
|
|
701
|
+
</div>
|
|
702
|
+
</div>
|
|
703
|
+
</div>
|
|
704
|
+
</form>
|
|
705
|
+
</section>
|
|
706
|
+
|
|
707
|
+
<!-- Security Section -->
|
|
708
|
+
<section id="security-section" class="account-section d-none">
|
|
709
|
+
{% include frontend/sections/account-section-header.html title="Security and data" icon="shield-halved" %}
|
|
710
|
+
|
|
711
|
+
<!-- Sign-in Methods Section -->
|
|
712
|
+
<div class="card mb-3">
|
|
713
|
+
<div class="card-header">
|
|
714
|
+
<h6 class="mb-0 d-inline-flex align-items-center"><i class="fa-solid fa-key fa-md me-2"></i> Sign-in methods</h6>
|
|
715
|
+
</div>
|
|
716
|
+
<div class="card-body">
|
|
717
|
+
<p class="text-muted mb-0">Manage how you sign in to your account. You can connect multiple methods for added convenience and security.</p>
|
|
718
|
+
|
|
719
|
+
<div id="signin-methods-list">
|
|
720
|
+
{% for method in resolved.signin_methods %}
|
|
721
|
+
<div class="d-flex flex-column flex-sm-row align-items-stretch align-items-sm-center justify-content-between gap-3 py-3 {% unless forloop.first %}border-top{% endunless %}">
|
|
722
|
+
<div class="d-flex align-items-center">
|
|
723
|
+
<div class="d-flex align-items-center justify-content-center me-3 flex-shrink-0 {% iftruthy method.icon %}text-muted{% endiftruthy %} fa fa-3xl">
|
|
724
|
+
{% iftruthy method.icon %}
|
|
725
|
+
<i class="fa-solid fa-{{ method.icon }} fa-3xl"></i>
|
|
726
|
+
{% endiftruthy %}
|
|
727
|
+
{% iftruthy method.logo %}
|
|
728
|
+
<img src="{{ method.logo | omega_cachebreak }}" class="object-fit-contain" alt="{{ method.name }} Logo"/>
|
|
729
|
+
{% endiftruthy %}
|
|
730
|
+
</div>
|
|
731
|
+
<div>
|
|
732
|
+
<h6 class="mb-0">{{ method.name }}</h6>
|
|
733
|
+
<div class="text-muted small" id="{{ method.id }}-email"></div>
|
|
734
|
+
</div>
|
|
735
|
+
</div>
|
|
736
|
+
<div class="flex-shrink-0">
|
|
737
|
+
<form id="signin-method-{{ method.id }}-form" class="d-grid d-sm-inline-block" novalidate data-form-state="initializing" onsubmit="return false">
|
|
738
|
+
<input type="hidden" name="method" value="{{ method.id }}">
|
|
739
|
+
{% if method.id == "password" %}
|
|
740
|
+
<button type="submit" class="btn btn-adaptive btn-sm" data-action="change">
|
|
741
|
+
<i class="fa-solid fa-key me-1"></i>
|
|
742
|
+
<span class="button-text">Change</span>
|
|
743
|
+
</button>
|
|
744
|
+
{% else %}
|
|
745
|
+
<!-- Connect button -->
|
|
746
|
+
<button type="submit" class="btn btn-adaptive btn-sm" data-action="connect">
|
|
747
|
+
<i class="fa-solid fa-link me-1"></i>
|
|
748
|
+
<span class="button-text">Connect</span>
|
|
749
|
+
</button>
|
|
750
|
+
<!-- Disconnect button (hidden by default) -->
|
|
751
|
+
<button type="submit" class="btn btn-sm btn-outline-danger d-none" data-action="disconnect">
|
|
752
|
+
<i class="fa-solid fa-unlink me-1"></i>
|
|
753
|
+
<span class="button-text">Disconnect</span>
|
|
754
|
+
</button>
|
|
755
|
+
{% endif %}
|
|
756
|
+
</form>
|
|
757
|
+
</div>
|
|
758
|
+
</div>
|
|
759
|
+
{% endfor %}
|
|
760
|
+
</div>
|
|
761
|
+
</div>
|
|
762
|
+
</div>
|
|
763
|
+
|
|
764
|
+
<!-- <div class="card mb-3">
|
|
765
|
+
<div class="card-body">
|
|
766
|
+
<div class="d-flex justify-content-between align-items-center mb-2">
|
|
767
|
+
<h5 class="card-title mb-0">Two-Factor Authentication</h5>
|
|
768
|
+
<span id="2fa-status"></span>
|
|
769
|
+
</div>
|
|
770
|
+
<p class="card-text">Add an extra layer of security to your account.</p>
|
|
771
|
+
<button id="2fa-btn" class="btn btn-adaptive">Enable 2FA</button>
|
|
772
|
+
</div>
|
|
773
|
+
</div> -->
|
|
774
|
+
|
|
775
|
+
<div class="card">
|
|
776
|
+
<div class="card-header d-flex justify-content-between align-items-center">
|
|
777
|
+
<h6 class="mb-0 d-inline-flex align-items-center"><i class="fa-solid fa-desktop fa-md me-2"></i> Active sessions</h6>
|
|
778
|
+
<form id="signout-all-sessions-form" class="d-inline" novalidate data-form-state="initializing" onsubmit="return false">
|
|
779
|
+
<input type="hidden" name="action" value="signout-all">
|
|
780
|
+
<button type="submit" class="btn btn-outline-danger btn-sm">
|
|
781
|
+
<i class="fa-solid fa-right-from-bracket me-1"></i>
|
|
782
|
+
<span class="button-text">
|
|
783
|
+
Sign out<span class="d-none d-md-inline"> of all sessions</span>
|
|
784
|
+
</span>
|
|
785
|
+
</button>
|
|
786
|
+
</form>
|
|
787
|
+
</div>
|
|
788
|
+
<div class="card-body">
|
|
789
|
+
<p class="card-text text-muted">Manage your active sessions across devices. Review and revoke access from unrecognized devices.</p>
|
|
790
|
+
|
|
791
|
+
<div id="active-sessions-list" class="list-group list-group-flush mb-3">
|
|
792
|
+
<!-- Sessions will be loaded here -->
|
|
793
|
+
<div class="text-center py-3">
|
|
794
|
+
<div class="spinner-border spinner-border-sm text-primary" role="status">
|
|
795
|
+
<span class="visually-hidden">Loading sessions...</span>
|
|
796
|
+
</div>
|
|
797
|
+
</div>
|
|
798
|
+
</div>
|
|
799
|
+
</div>
|
|
800
|
+
</div>
|
|
801
|
+
|
|
802
|
+
<!-- Generate Signin Link (advanced) -->
|
|
803
|
+
<div id="generate-signin-link-trigger" class="text-center">
|
|
804
|
+
<button type="button" class="btn btn-link btn-sm text-muted text-decoration-underline opacity-50" data-bs-toggle="modal" data-bs-target="#generate-signin-link-modal">
|
|
805
|
+
<i class="fa-solid fa-link fa-xs me-1"></i>
|
|
806
|
+
Generate signin link
|
|
807
|
+
</button>
|
|
808
|
+
</div>
|
|
809
|
+
|
|
810
|
+
<!-- Generate Signin Link Modal -->
|
|
811
|
+
<div class="modal fade" id="generate-signin-link-modal" tabindex="-1" aria-labelledby="generate-signin-link-title" aria-hidden="true">
|
|
812
|
+
<div class="modal-dialog modal-dialog-centered modal-dialog-scrollable">
|
|
813
|
+
<div class="modal-content border border-danger">
|
|
814
|
+
<div class="modal-header">
|
|
815
|
+
<h5 class="modal-title text-danger" id="generate-signin-link-title">
|
|
816
|
+
<i class="fa-solid fa-triangle-exclamation fa-lg me-2"></i>
|
|
817
|
+
Generate signin link
|
|
818
|
+
</h5>
|
|
819
|
+
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
820
|
+
</div>
|
|
821
|
+
<div class="modal-body">
|
|
822
|
+
<!-- Warning view -->
|
|
823
|
+
<div id="generate-signin-link-warning">
|
|
824
|
+
<div class="alert alert-danger">
|
|
825
|
+
<strong>This is a dangerous feature for advanced users.</strong>
|
|
826
|
+
<p class="mb-2 mt-2 small">
|
|
827
|
+
Generating a signin link creates a single URL that lets <strong>anyone who has it</strong> sign in to your account: no password, no 2FA, no email verification.
|
|
828
|
+
</p>
|
|
829
|
+
<ul class="small mb-0">
|
|
830
|
+
<li>Use it only to sign in to your own account on another browser or device.</li>
|
|
831
|
+
<li><strong>Never share, message, email, or paste this link anywhere.</strong> Anyone with the link gets full access to your account.</li>
|
|
832
|
+
<li>The link expires in 1 hour, but treat it as a live key until then.</li>
|
|
833
|
+
<li>If you suspect the link was exposed, sign out of all sessions immediately.</li>
|
|
834
|
+
</ul>
|
|
835
|
+
</div>
|
|
836
|
+
|
|
837
|
+
<p class="mb-2">Type the following phrase exactly to confirm you understand the risks:</p>
|
|
838
|
+
<p class="mb-2"><code id="signin-link-confirm-phrase">I will not share this link</code></p>
|
|
839
|
+
|
|
840
|
+
<input type="text" class="form-control" id="signin-link-confirm-input" autocomplete="off" autocapitalize="off" autocorrect="off" spellcheck="false" placeholder="Type the phrase above">
|
|
841
|
+
</div>
|
|
842
|
+
|
|
843
|
+
<!-- Result view (hidden until generated) -->
|
|
844
|
+
<div id="generate-signin-link-result" class="d-none">
|
|
845
|
+
<div class="alert alert-warning small mb-3">
|
|
846
|
+
<i class="fa-solid fa-clock me-1"></i>
|
|
847
|
+
This link expires in <strong>1 hour</strong>. Use it immediately and do not share it.
|
|
848
|
+
</div>
|
|
849
|
+
<label for="signin-link-output" class="form-label small text-muted mb-1">Your signin link:</label>
|
|
850
|
+
<div class="input-group">
|
|
851
|
+
<input type="text" class="form-control font-monospace small" id="signin-link-output" readonly>
|
|
852
|
+
<button type="button" class="btn btn-outline-adaptive" id="signin-link-copy-btn" data-omega-copy aria-label="Copy signin link">
|
|
853
|
+
<i class="fa-solid fa-copy me-1"></i>
|
|
854
|
+
<span class="button-text">Copy</span>
|
|
855
|
+
</button>
|
|
856
|
+
</div>
|
|
857
|
+
</div>
|
|
858
|
+
</div>
|
|
859
|
+
<div class="modal-footer">
|
|
860
|
+
<button type="button" class="btn btn-adaptive" id="signin-link-generate-btn" disabled>
|
|
861
|
+
<i class="fa-solid fa-key me-1"></i>
|
|
862
|
+
<span class="button-text">Generate link</span>
|
|
863
|
+
</button>
|
|
864
|
+
</div>
|
|
865
|
+
</div>
|
|
866
|
+
</div>
|
|
867
|
+
</div>
|
|
868
|
+
</section>
|
|
869
|
+
|
|
870
|
+
<!-- Connections Section -->
|
|
871
|
+
<section id="connections-section" class="account-section d-none">
|
|
872
|
+
{% include frontend/sections/account-section-header.html title="Connected accounts" icon="link" %}
|
|
873
|
+
|
|
874
|
+
<div class="card">
|
|
875
|
+
<div class="card-header">
|
|
876
|
+
<h6 class="mb-0 d-inline-flex align-items-center"><i class="fa-solid fa-link fa-md me-2"></i> Manage connections</h6>
|
|
877
|
+
</div>
|
|
878
|
+
<div class="card-body">
|
|
879
|
+
<p class="text-muted mb-0">Connect your external accounts to access additional features.</p>
|
|
880
|
+
|
|
881
|
+
{% include frontend/sections/account-connections.html %}
|
|
882
|
+
</div>
|
|
883
|
+
</div>
|
|
884
|
+
</section>
|
|
885
|
+
|
|
886
|
+
<!-- Billing Section -->
|
|
887
|
+
<section id="billing-section" class="account-section d-none">
|
|
888
|
+
{% include frontend/sections/account-section-header.html title="Billing and usage" icon="credit-card" %}
|
|
889
|
+
|
|
890
|
+
<!-- Plan Overview Card -->
|
|
891
|
+
<div class="card mb-3">
|
|
892
|
+
<div class="card-header d-flex justify-content-between align-items-center flex-wrap gap-2">
|
|
893
|
+
<h6 class="mb-0 d-inline-flex align-items-center">
|
|
894
|
+
<i class="fa-solid fa-credit-card fa-md me-2"></i>
|
|
895
|
+
<span><span data-omega-bind="@text billing.plan.name" class="omega-binding-skeleton">Current</span> plan</span>
|
|
896
|
+
</h6>
|
|
897
|
+
<span class="omega-status omega-binding-skeleton" data-omega-bind="@attr class billing.status.badgeClass">
|
|
898
|
+
<span class="omega-dot omega-dot--muted" data-omega-bind="@attr class billing.status.dotClass"></span>
|
|
899
|
+
<span data-omega-bind="@text billing.status.label"> </span>
|
|
900
|
+
</span>
|
|
901
|
+
</div>
|
|
902
|
+
<div class="card-body">
|
|
903
|
+
<div class="mb-2">
|
|
904
|
+
<p class="card-text mb-0" data-omega-bind="@show billing.description.free" hidden>
|
|
905
|
+
You are currently on the <strong data-omega-bind="@text billing.plan.name">Free</strong> plan. Upgrade to unlock premium features.
|
|
906
|
+
</p>
|
|
907
|
+
<p class="card-text mb-0" data-omega-bind="@show billing.description.active" hidden>
|
|
908
|
+
You are currently on the <strong data-omega-bind="@text billing.plan.name">Current</strong> plan.
|
|
909
|
+
</p>
|
|
910
|
+
<p class="card-text mb-0" data-omega-bind="@show billing.description.suspended" hidden>
|
|
911
|
+
Your <strong data-omega-bind="@text billing.plan.name">Current</strong> subscription has been suspended and access has been revoked due to a payment issue. Please update your payment method to restore access.
|
|
912
|
+
</p>
|
|
913
|
+
<p class="card-text mb-0" data-omega-bind="@show billing.description.cancelled" hidden>
|
|
914
|
+
Your <strong data-omega-bind="@text billing.plan.name">Current</strong> subscription has ended. Resubscribe to regain access to premium features.
|
|
915
|
+
</p>
|
|
916
|
+
</div>
|
|
917
|
+
|
|
918
|
+
<!-- Billing details — EVERY slot shows in EVERY paid state: the
|
|
919
|
+
price, the cadence and the date line. A slot the subscription
|
|
920
|
+
does not record says so with the muted placeholder instead of
|
|
921
|
+
dropping out and leaving the row looking half-built. The
|
|
922
|
+
date's LABEL is the claim it makes (renews / access until /
|
|
923
|
+
ended / next billing), so a cancelled account can still say
|
|
924
|
+
when it ended, and a suspended one claims no date at all. -->
|
|
925
|
+
<div id="billing-details" class="mb-3" data-omega-bind="@show billing.details.visible" hidden>
|
|
926
|
+
<div class="row small text-muted">
|
|
927
|
+
<div class="col-sm-4 mb-1">
|
|
928
|
+
<strong><span data-omega-bind="@text billing.details.dateLabel">Renews</span>: </strong> <span data-omega-bind="@text billing.details.date, @attr class billing.details.dateClass"></span>
|
|
929
|
+
</div>
|
|
930
|
+
<div class="col-sm-4 mb-1">
|
|
931
|
+
<strong>Amount: </strong> <span data-omega-bind="@text billing.details.amount, @attr class billing.details.amountClass"></span>
|
|
932
|
+
</div>
|
|
933
|
+
<div class="col-sm-4 mb-1">
|
|
934
|
+
<strong>Billing cycle: </strong> <span data-omega-bind="@text billing.details.cadence, @attr class billing.details.cadenceClass"></span>
|
|
935
|
+
</div>
|
|
936
|
+
</div>
|
|
937
|
+
</div>
|
|
938
|
+
|
|
939
|
+
<!-- Active discount (#325) — the saving already on the
|
|
940
|
+
subscription, which the card used to say nothing about at all:
|
|
941
|
+
a winback accept applied a real discount and the customer had
|
|
942
|
+
no way to see it. Both halves are real TEXT (what comes off,
|
|
943
|
+
and which bills it comes off), never a colored pill alone, and
|
|
944
|
+
the whole row is hidden when there is no discount. -->
|
|
945
|
+
<div id="billing-discount" class="d-flex flex-wrap align-items-center gap-2 mb-3" data-omega-bind="@show billing.discount.show" hidden>
|
|
946
|
+
<span class="omega-chip omega-chip--accent">
|
|
947
|
+
<i class="fa-solid fa-tag fa-xs"></i>
|
|
948
|
+
<span data-omega-bind="@text billing.discount.label"></span>
|
|
949
|
+
</span>
|
|
950
|
+
<span class="small text-muted" data-omega-bind="@text billing.discount.when"></span>
|
|
951
|
+
</div>
|
|
952
|
+
|
|
953
|
+
<!-- State-specific alerts -->
|
|
954
|
+
<div class="mb-3">
|
|
955
|
+
<!-- Suspended (payment issue) alert -->
|
|
956
|
+
<div class="alert alert-danger d-flex align-items-start" data-omega-bind="@show billing.alerts.suspended" hidden>
|
|
957
|
+
<span class="me-2 flex-shrink-0"><i class="fa-solid fa-triangle-exclamation fa-md"></i></span>
|
|
958
|
+
<div>
|
|
959
|
+
<strong>Payment failed</strong>
|
|
960
|
+
<p class="mb-0 small">Your payment method was declined. Please update your payment method to keep your subscription active.</p>
|
|
961
|
+
</div>
|
|
962
|
+
</div>
|
|
963
|
+
|
|
964
|
+
<!-- Cancellation pending alert -->
|
|
965
|
+
<div class="alert alert-warning d-flex align-items-start" data-omega-bind="@show billing.alerts.cancelling" hidden>
|
|
966
|
+
<span class="me-2 flex-shrink-0"><i class="fa-solid fa-clock fa-md"></i></span>
|
|
967
|
+
<div>
|
|
968
|
+
<strong>Cancellation scheduled</strong>
|
|
969
|
+
<p class="mb-0 small">Your subscription will end on <strong data-omega-bind="@text billing.alerts.cancelDate"></strong>. You'll continue to have full access until then. If you change your mind, undo the cancellation below.</p>
|
|
970
|
+
</div>
|
|
971
|
+
</div>
|
|
972
|
+
|
|
973
|
+
<!-- Free trial alert -->
|
|
974
|
+
<div class="alert alert-success d-flex align-items-start" data-omega-bind="@show billing.alerts.trialing" hidden>
|
|
975
|
+
<span class="me-2 flex-shrink-0"><i class="fa-solid fa-circle-check fa-md"></i></span>
|
|
976
|
+
<div>
|
|
977
|
+
<strong>Free trial</strong>
|
|
978
|
+
<p class="mb-0 small" data-omega-bind="@show billing.alerts.trialHasEndDate" hidden>You're on a free trial that ends on <strong data-omega-bind="@text billing.alerts.trialEndDate"></strong>. You won't be charged until your trial ends.</p>
|
|
979
|
+
<p class="mb-0 small" data-omega-bind="@hide billing.alerts.trialHasEndDate">You're on a free trial. You won't be charged until your trial ends.</p>
|
|
980
|
+
</div>
|
|
981
|
+
</div>
|
|
982
|
+
</div>
|
|
983
|
+
|
|
984
|
+
<!-- Action Buttons -->
|
|
985
|
+
<div class="d-grid d-sm-flex gap-2">
|
|
986
|
+
<button id="upgrade-plan-btn" class="btn btn-adaptive plan-action-btn" data-omega-bind="@show billing.buttons.upgrade" hidden>
|
|
987
|
+
<i class="fa-solid fa-crown me-2"></i>
|
|
988
|
+
<span class="button-text">Upgrade plan</span>
|
|
989
|
+
</button>
|
|
990
|
+
<button id="change-plan-btn" class="btn btn-outline-adaptive plan-action-btn" data-omega-bind="@show billing.buttons.change" hidden data-bs-toggle="modal" data-bs-target="#change-plan-modal">
|
|
991
|
+
<i class="fa-solid fa-arrow-right-arrow-left me-2"></i>
|
|
992
|
+
<span class="button-text">Change plan</span>
|
|
993
|
+
</button>
|
|
994
|
+
<button id="uncancel-plan-btn" class="btn btn-adaptive plan-action-btn" data-omega-bind="@show billing.buttons.uncancel" hidden data-bs-toggle="collapse" data-bs-target="#uncancel-subscription-confirm" aria-expanded="false" aria-controls="uncancel-subscription-confirm">
|
|
995
|
+
<i class="fa-solid fa-rotate-left me-2"></i>
|
|
996
|
+
<span class="button-text">Undo cancellation</span>
|
|
997
|
+
</button>
|
|
998
|
+
<button id="manage-billing-btn" class="btn btn-adaptive plan-action-btn" data-omega-bind="@show billing.buttons.manage" hidden>
|
|
999
|
+
<i class="fa-solid fa-credit-card me-2"></i>
|
|
1000
|
+
<span class="button-text">Manage billing</span>
|
|
1001
|
+
</button>
|
|
1002
|
+
</div>
|
|
1003
|
+
|
|
1004
|
+
<!-- Undo cancellation confirmation -->
|
|
1005
|
+
<div class="collapse" id="uncancel-subscription-confirm">
|
|
1006
|
+
<div class="alert alert-success d-flex align-items-start mt-3 mb-0">
|
|
1007
|
+
<span class="me-2 flex-shrink-0"><i class="fa-solid fa-rotate-left fa-md"></i></span>
|
|
1008
|
+
<div class="w-100">
|
|
1009
|
+
<strong>Keep your subscription?</strong>
|
|
1010
|
+
<p class="mb-3 small">The scheduled cancellation is withdrawn and your subscription renews as normal on <strong data-omega-bind="@text billing.alerts.cancelDate"></strong>. Nothing is charged today.</p>
|
|
1011
|
+
<div class="d-grid d-sm-flex gap-2">
|
|
1012
|
+
<button type="button" class="btn btn-adaptive btn-sm" id="uncancel-confirm-btn">
|
|
1013
|
+
<i class="fa-solid fa-circle-check fa-sm me-2"></i>
|
|
1014
|
+
<span class="button-text">Yes, keep my subscription</span>
|
|
1015
|
+
</button>
|
|
1016
|
+
<button type="button" class="btn btn-outline-adaptive btn-sm" data-bs-toggle="collapse" data-bs-target="#uncancel-subscription-confirm">
|
|
1017
|
+
<span>Not now</span>
|
|
1018
|
+
</button>
|
|
1019
|
+
</div>
|
|
1020
|
+
</div>
|
|
1021
|
+
</div>
|
|
1022
|
+
</div>
|
|
1023
|
+
</div>
|
|
1024
|
+
</div>
|
|
1025
|
+
|
|
1026
|
+
<!-- Usage Metrics Card -->
|
|
1027
|
+
<div class="card mb-3">
|
|
1028
|
+
<div class="card-header">
|
|
1029
|
+
<h6 class="mb-0 d-inline-flex align-items-center"><i class="fa-solid fa-chart-line fa-md me-2"></i> Usage</h6>
|
|
1030
|
+
</div>
|
|
1031
|
+
<div class="card-body">
|
|
1032
|
+
<div id="usage-metrics-container">
|
|
1033
|
+
<div class="text-muted">Loading usage data...</div>
|
|
1034
|
+
</div>
|
|
1035
|
+
</div>
|
|
1036
|
+
</div>
|
|
1037
|
+
|
|
1038
|
+
<!-- Cancel Subscription (only visible for paid users) -->
|
|
1039
|
+
<!-- Opens the questionnaire declaratively, as it always has. A TRIALING
|
|
1040
|
+
subscription is intercepted in JS first — cancelling ends the trial
|
|
1041
|
+
on the spot (#267) — and paid cancels are untouched. -->
|
|
1042
|
+
<div id="cancel-subscription-trigger" class="text-center" data-omega-bind="@show billing.buttons.cancel" hidden>
|
|
1043
|
+
<button type="button" class="btn btn-link btn-sm text-muted text-decoration-underline opacity-50" id="cancel-subscription-trigger-btn" data-bs-toggle="collapse" data-bs-target="#cancel-subscription-accordion" aria-expanded="false" aria-controls="cancel-subscription-accordion">
|
|
1044
|
+
<i class="fa-solid fa-xmark fa-xs me-1"></i>
|
|
1045
|
+
Cancel subscription
|
|
1046
|
+
</button>
|
|
1047
|
+
</div>
|
|
1048
|
+
|
|
1049
|
+
<div class="collapse" id="cancel-subscription-accordion">
|
|
1050
|
+
<div class="card card-form-border border-danger mt-4">
|
|
1051
|
+
<div class="card-header">
|
|
1052
|
+
<h6 class="mb-0 d-inline-flex align-items-center text-danger"><i class="fa-solid fa-ban fa-md me-2"></i> Cancel your subscription</h6>
|
|
1053
|
+
</div>
|
|
1054
|
+
<div class="card-body">
|
|
1055
|
+
<!-- What this cancel actually does. A TRIAL ends on the spot
|
|
1056
|
+
(#267), so the questionnaire says so rather than repeating the
|
|
1057
|
+
paid promise the warning dialog just contradicted. Both
|
|
1058
|
+
variants read the ONE flag; the paid copy is the default
|
|
1059
|
+
render, so a page whose JS never runs shows today's text. -->
|
|
1060
|
+
<p class="card-text small text-muted" data-omega-bind="@hide billing.cancelForm.trial">
|
|
1061
|
+
If you cancel, your subscription will remain active until the end of your current billing period. After that, you'll be downgraded to the free plan and will lose access to premium features. You can resubscribe at any time.
|
|
1062
|
+
</p>
|
|
1063
|
+
<p class="card-text small text-muted" data-omega-bind="@show billing.cancelForm.trial" hidden>
|
|
1064
|
+
If you cancel, your free trial ends immediately and you'll be downgraded to the free plan right away; there is no remaining period to use up. You won't be charged, and you can resubscribe at any time.
|
|
1065
|
+
</p>
|
|
1066
|
+
|
|
1067
|
+
<form id="cancel-subscription-form" novalidate data-form-state="initializing" onsubmit="return false">
|
|
1068
|
+
<!-- Cancellation Reasons (randomized by JS) -->
|
|
1069
|
+
<div class="mb-3">
|
|
1070
|
+
<label class="form-label">Why are you cancelling?</label>
|
|
1071
|
+
<div id="cancel-reasons-container">
|
|
1072
|
+
<!-- Radio buttons injected by JS in random order -->
|
|
1073
|
+
</div>
|
|
1074
|
+
</div>
|
|
1075
|
+
|
|
1076
|
+
<!-- Additional Feedback -->
|
|
1077
|
+
<div class="mb-3">
|
|
1078
|
+
<label for="cancel-feedback" class="form-label">Anything else you'd like us to know?</label>
|
|
1079
|
+
<textarea class="form-control" id="cancel-feedback" name="feedback" rows="3" placeholder="Optional feedback to help us improve..."></textarea>
|
|
1080
|
+
</div>
|
|
1081
|
+
|
|
1082
|
+
<!-- Required Confirmation -->
|
|
1083
|
+
<div class="mb-3">
|
|
1084
|
+
<div class="form-check">
|
|
1085
|
+
<input class="form-check-input" type="checkbox" id="cancel-confirm-checkbox" name="confirm_cancellation" required>
|
|
1086
|
+
<label class="form-check-label" for="cancel-confirm-checkbox">
|
|
1087
|
+
<span data-omega-bind="@hide billing.cancelForm.trial">I confirm I want to cancel my subscription and agree to the <a href="/terms" target="_blank">Terms of Service</a>. I understand my access will continue until the end of the current billing period, after which I'll be moved to the free plan.</span>
|
|
1088
|
+
<span data-omega-bind="@show billing.cancelForm.trial" hidden>I confirm I want to cancel my free trial and agree to the <a href="/terms" target="_blank">Terms of Service</a>. I understand my access ends immediately and I'll be moved to the free plan right away.</span>
|
|
1089
|
+
</label>
|
|
1090
|
+
<div class="invalid-feedback">You must confirm before cancelling.</div>
|
|
1091
|
+
</div>
|
|
1092
|
+
</div>
|
|
1093
|
+
|
|
1094
|
+
<!-- Buttons -->
|
|
1095
|
+
<div class="row g-2">
|
|
1096
|
+
<div class="col-12 col-md-6 order-md-2">
|
|
1097
|
+
<button type="submit" class="btn btn-outline-adaptive w-100" id="cancel-subscription-btn">
|
|
1098
|
+
<i class="fa-solid fa-ban fa-sm me-2"></i>
|
|
1099
|
+
<span class="button-text">Cancel subscription</span>
|
|
1100
|
+
</button>
|
|
1101
|
+
</div>
|
|
1102
|
+
<div class="col-12 col-md-6 order-md-1">
|
|
1103
|
+
<button type="button" class="btn btn-adaptive w-100" id="keep-plan-btn" data-bs-toggle="collapse" data-bs-target="#cancel-subscription-accordion">
|
|
1104
|
+
<i class="fa-solid fa-circle-check fa-sm me-2"></i>
|
|
1105
|
+
<span>Keep my plan</span>
|
|
1106
|
+
</button>
|
|
1107
|
+
</div>
|
|
1108
|
+
</div>
|
|
1109
|
+
</form>
|
|
1110
|
+
</div>
|
|
1111
|
+
</div>
|
|
1112
|
+
</div>
|
|
1113
|
+
|
|
1114
|
+
<!-- Winback offer — shown BEFORE the questionnaire, and only for a PAID
|
|
1115
|
+
cancel (#268). The customer is pitched a discount on the next cycle
|
|
1116
|
+
while they are still here to keep; accepting applies it and calls
|
|
1117
|
+
the cancel off, declining opens the questionnaire unchanged and the
|
|
1118
|
+
NEXT cancel attempt is pitched again (#324). The offer is the
|
|
1119
|
+
BRAND's (payment.winback in omega.json5), so the number is bound
|
|
1120
|
+
from state and never spelled out here.
|
|
1121
|
+
It wears the exit popup's treatment (#323): centered, one mark, one
|
|
1122
|
+
headline, one line under it. A pitch reads like a pitch and gets
|
|
1123
|
+
out of the way. -->
|
|
1124
|
+
<div class="modal fade" id="cancel-winback-modal" tabindex="-1" aria-labelledby="cancel-winback-title" aria-hidden="true">
|
|
1125
|
+
<div class="modal-dialog modal-dialog-centered">
|
|
1126
|
+
<div class="modal-content overflow-hidden">
|
|
1127
|
+
<div class="position-relative">
|
|
1128
|
+
<button type="button" class="btn-close position-absolute top-0 end-0 m-3" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
1129
|
+
|
|
1130
|
+
<div class="p-4 p-md-5 text-center">
|
|
1131
|
+
<div class="mb-4">
|
|
1132
|
+
<span class="omega-dialog-mark"><i class="fa-solid fa-gift fa-2xl"></i></span>
|
|
1133
|
+
</div>
|
|
1134
|
+
|
|
1135
|
+
<h5 class="fw-bold fs-4 mb-2" id="cancel-winback-title" data-omega-bind="@text billing.winbackOffer.headline">Your discount is waiting</h5>
|
|
1136
|
+
|
|
1137
|
+
<p class="text-muted mb-4">
|
|
1138
|
+
Give {{ resolved.config.brand.name }} another shot. Same plan, same features, better price.
|
|
1139
|
+
</p>
|
|
1140
|
+
|
|
1141
|
+
<div class="d-flex flex-column align-items-center">
|
|
1142
|
+
<button type="button" class="btn btn-adaptive btn-lg px-5 mb-1" id="cancel-winback-accept-btn">
|
|
1143
|
+
<span class="button-text">Claim my discount</span>
|
|
1144
|
+
<i class="fa-solid fa-arrow-right fa-sm ms-2"></i>
|
|
1145
|
+
</button>
|
|
1146
|
+
<button type="button" class="btn btn-link btn-sm text-muted text-decoration-none" id="cancel-winback-decline-btn">
|
|
1147
|
+
No thanks, cancel my plan
|
|
1148
|
+
</button>
|
|
1149
|
+
</div>
|
|
1150
|
+
</div>
|
|
1151
|
+
</div>
|
|
1152
|
+
</div>
|
|
1153
|
+
</div>
|
|
1154
|
+
</div>
|
|
1155
|
+
|
|
1156
|
+
<!-- Trial cancel warning — shown BEFORE the questionnaire, and only for
|
|
1157
|
+
a trial. A trial cancel takes effect immediately (#267), the exact
|
|
1158
|
+
opposite of the accordion's own "until the end of your billing
|
|
1159
|
+
period" copy, so the consequence is stated while the choice is
|
|
1160
|
+
still open. "Keep my trial" is the dismiss; confirming opens the
|
|
1161
|
+
questionnaire the paid flow goes straight to. Same treatment as the
|
|
1162
|
+
offer beside it (#323): one mark, one headline, one line. -->
|
|
1163
|
+
<div class="modal fade" id="cancel-trial-warning-modal" tabindex="-1" aria-labelledby="cancel-trial-warning-title" aria-hidden="true">
|
|
1164
|
+
<div class="modal-dialog modal-dialog-centered">
|
|
1165
|
+
<div class="modal-content overflow-hidden">
|
|
1166
|
+
<div class="position-relative">
|
|
1167
|
+
<button type="button" class="btn-close position-absolute top-0 end-0 m-3" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
1168
|
+
|
|
1169
|
+
<div class="p-4 p-md-5 text-center">
|
|
1170
|
+
<div class="mb-4">
|
|
1171
|
+
<span class="omega-dialog-mark omega-dialog-mark--danger"><i class="fa-solid fa-hourglass-half fa-2xl"></i></span>
|
|
1172
|
+
</div>
|
|
1173
|
+
|
|
1174
|
+
<h5 class="fw-bold fs-4 mb-2" id="cancel-trial-warning-title">Want to end your free trial?</h5>
|
|
1175
|
+
|
|
1176
|
+
<p class="text-muted mb-4" data-omega-bind="@show billing.cancelWarning.hasTrialEndDate" hidden>
|
|
1177
|
+
You have free access until <strong data-omega-bind="@text billing.cancelWarning.trialEndDate">your trial ends</strong>. Cancelling now will end your trial immediately.
|
|
1178
|
+
</p>
|
|
1179
|
+
|
|
1180
|
+
<div class="d-flex flex-column align-items-center">
|
|
1181
|
+
<button type="button" class="btn btn-adaptive btn-lg px-5 mb-1" data-bs-dismiss="modal" id="cancel-trial-keep-btn">
|
|
1182
|
+
<span class="button-text">Keep my trial</span>
|
|
1183
|
+
<i class="fa-solid fa-arrow-right fa-sm ms-2"></i>
|
|
1184
|
+
</button>
|
|
1185
|
+
<button type="button" class="btn btn-link btn-sm text-muted text-decoration-none" id="cancel-trial-continue-btn">
|
|
1186
|
+
Cancel anyway
|
|
1187
|
+
</button>
|
|
1188
|
+
</div>
|
|
1189
|
+
</div>
|
|
1190
|
+
</div>
|
|
1191
|
+
</div>
|
|
1192
|
+
</div>
|
|
1193
|
+
</div>
|
|
1194
|
+
|
|
1195
|
+
<!-- Retention warning: shown BEFORE the questionnaire, and only for a
|
|
1196
|
+
cancel the other two dialogs have nothing to say to ([#341]), with
|
|
1197
|
+
no save offer on the table and no trial to end. What leaving might
|
|
1198
|
+
cost is stated the way the retention policy states it: data MAY be
|
|
1199
|
+
removed, never a promise that it will be. "Keep my account" is the
|
|
1200
|
+
dismiss; "Cancel anyway" opens the questionnaire the flow used to
|
|
1201
|
+
go straight to. Same treatment as the two above it (#323): one
|
|
1202
|
+
mark, one headline, one line. -->
|
|
1203
|
+
<div class="modal fade" id="cancel-retention-modal" tabindex="-1" aria-labelledby="cancel-retention-title" aria-hidden="true">
|
|
1204
|
+
<div class="modal-dialog modal-dialog-centered">
|
|
1205
|
+
<div class="modal-content overflow-hidden">
|
|
1206
|
+
<div class="position-relative">
|
|
1207
|
+
<button type="button" class="btn-close position-absolute top-0 end-0 m-3" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
1208
|
+
|
|
1209
|
+
<div class="p-4 p-md-5 text-center">
|
|
1210
|
+
<div class="mb-4">
|
|
1211
|
+
<span class="omega-dialog-mark omega-dialog-mark--danger"><i class="fa-solid fa-triangle-exclamation fa-2xl"></i></span>
|
|
1212
|
+
</div>
|
|
1213
|
+
|
|
1214
|
+
<h5 class="fw-bold fs-4 mb-2" id="cancel-retention-title">Cancel your subscription?</h5>
|
|
1215
|
+
|
|
1216
|
+
<p class="text-muted mb-4">
|
|
1217
|
+
Your {{ resolved.config.brand.name }} data, settings, and progress may be removed after your subscription ends.
|
|
1218
|
+
</p>
|
|
1219
|
+
|
|
1220
|
+
<div class="d-flex flex-column align-items-center">
|
|
1221
|
+
<button type="button" class="btn btn-adaptive btn-lg px-5 mb-1" data-bs-dismiss="modal" id="cancel-retention-keep-btn">
|
|
1222
|
+
<span class="button-text">Keep my account</span>
|
|
1223
|
+
<i class="fa-solid fa-arrow-right fa-sm ms-2"></i>
|
|
1224
|
+
</button>
|
|
1225
|
+
<button type="button" class="btn btn-link btn-sm text-muted text-decoration-none" id="cancel-retention-continue-btn">
|
|
1226
|
+
Cancel anyway
|
|
1227
|
+
</button>
|
|
1228
|
+
</div>
|
|
1229
|
+
</div>
|
|
1230
|
+
</div>
|
|
1231
|
+
</div>
|
|
1232
|
+
</div>
|
|
1233
|
+
</div>
|
|
1234
|
+
|
|
1235
|
+
<div class="modal fade" id="change-plan-modal" tabindex="-1" aria-labelledby="change-plan-title" aria-hidden="true">
|
|
1236
|
+
<div class="modal-dialog modal-dialog-centered modal-dialog-scrollable">
|
|
1237
|
+
<div class="modal-content">
|
|
1238
|
+
<div class="modal-header">
|
|
1239
|
+
<h5 class="modal-title" id="change-plan-title">
|
|
1240
|
+
<i class="fa-solid fa-arrow-right-arrow-left fa-lg me-2"></i>
|
|
1241
|
+
Change plan
|
|
1242
|
+
</h5>
|
|
1243
|
+
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
1244
|
+
</div>
|
|
1245
|
+
<div class="modal-body">
|
|
1246
|
+
<p class="mb-3">
|
|
1247
|
+
You are currently on the <strong data-omega-bind="@text billing.plan.name">Current</strong> plan.
|
|
1248
|
+
</p>
|
|
1249
|
+
|
|
1250
|
+
<!-- Cadence toggle — injected by JS, opening on the cadence
|
|
1251
|
+
the account is billed at. One card per plan below follows
|
|
1252
|
+
it; a brand selling a single cadence gets no toggle. -->
|
|
1253
|
+
<div id="change-plan-cadence" class="d-flex justify-content-center mb-4"></div>
|
|
1254
|
+
|
|
1255
|
+
<fieldset>
|
|
1256
|
+
<legend class="form-label">Move to</legend>
|
|
1257
|
+
<div id="change-plan-options">
|
|
1258
|
+
<!-- Plan cards injected by JS from the brand's plans -->
|
|
1259
|
+
</div>
|
|
1260
|
+
</fieldset>
|
|
1261
|
+
|
|
1262
|
+
<!-- The switcher shows each plan's headline features; the full
|
|
1263
|
+
story (every feature, the comparison table) is the pricing page -->
|
|
1264
|
+
<p class="small mb-3">
|
|
1265
|
+
<a href="/pricing" target="_blank" rel="noopener" aria-label="Compare plans on the pricing page (opens in a new tab)">
|
|
1266
|
+
Compare plans
|
|
1267
|
+
<i class="fa-solid fa-arrow-up-right-from-square fa-xs ms-1"></i>
|
|
1268
|
+
</a>
|
|
1269
|
+
</p>
|
|
1270
|
+
|
|
1271
|
+
<p class="small text-muted mb-0">
|
|
1272
|
+
Your payment provider prorates the difference: you are billed or credited for the remainder of the current period, and your next invoice reflects the new plan.
|
|
1273
|
+
</p>
|
|
1274
|
+
</div>
|
|
1275
|
+
<div class="modal-footer">
|
|
1276
|
+
<button type="button" class="btn btn-outline-adaptive" data-bs-dismiss="modal">
|
|
1277
|
+
<span>Cancel</span>
|
|
1278
|
+
</button>
|
|
1279
|
+
<button type="button" class="btn btn-adaptive" id="change-plan-confirm-btn" disabled>
|
|
1280
|
+
<i class="fa-solid fa-arrow-right-arrow-left me-2"></i>
|
|
1281
|
+
<span class="button-text">Change plan</span>
|
|
1282
|
+
</button>
|
|
1283
|
+
</div>
|
|
1284
|
+
</div>
|
|
1285
|
+
</div>
|
|
1286
|
+
</div>
|
|
1287
|
+
</section>
|
|
1288
|
+
|
|
1289
|
+
<!-- Orders Section -->
|
|
1290
|
+
<!-- The purchase history. A one-time purchase writes nothing to the user
|
|
1291
|
+
doc and payments-orders is admin-only to clients, so this list is the
|
|
1292
|
+
ONLY place a customer can see one — which is what the confirmation
|
|
1293
|
+
page and the receipt email have always promised them (#672). Rows are
|
|
1294
|
+
rendered by sections/orders.js off GET /user/orders. -->
|
|
1295
|
+
<section id="orders-section" class="account-section d-none">
|
|
1296
|
+
{% include frontend/sections/account-section-header.html title="Orders" icon="receipt" %}
|
|
1297
|
+
|
|
1298
|
+
<div class="card">
|
|
1299
|
+
<div class="card-header d-flex justify-content-between align-items-center">
|
|
1300
|
+
<h6 class="mb-0 d-inline-flex align-items-center"><i class="fa-solid fa-receipt fa-md me-2"></i> Your purchases</h6>
|
|
1301
|
+
<span class="omega-chip" id="orders-badge">0</span>
|
|
1302
|
+
</div>
|
|
1303
|
+
<div class="card-body">
|
|
1304
|
+
<p class="card-text text-muted">Every subscription and one-time purchase on this account, newest first.</p>
|
|
1305
|
+
|
|
1306
|
+
<div id="orders-list" class="list-group list-group-flush">
|
|
1307
|
+
<!-- Orders are loaded here -->
|
|
1308
|
+
<div class="text-center text-muted py-3">
|
|
1309
|
+
Loading your purchases…
|
|
1310
|
+
</div>
|
|
1311
|
+
</div>
|
|
1312
|
+
</div>
|
|
1313
|
+
</div>
|
|
1314
|
+
</section>
|
|
1315
|
+
|
|
1316
|
+
<!-- Referrals Section -->
|
|
1317
|
+
<section id="referrals-section" class="account-section d-none">
|
|
1318
|
+
{% include frontend/sections/account-section-header.html title="Referrals" icon="user-plus" %}
|
|
1319
|
+
|
|
1320
|
+
<!-- Referral Code Card -->
|
|
1321
|
+
<div class="card mb-3">
|
|
1322
|
+
<div class="card-header">
|
|
1323
|
+
<h6 class="mb-0 d-inline-flex align-items-center"><i class="fa-solid fa-share-nodes fa-md me-2"></i> Your referral code</h6>
|
|
1324
|
+
</div>
|
|
1325
|
+
<div class="card-body">
|
|
1326
|
+
<p class="card-text text-muted">Share your referral code with friends to earn rewards.</p>
|
|
1327
|
+
|
|
1328
|
+
<div class="mb-0">
|
|
1329
|
+
<div class="input-group">
|
|
1330
|
+
<input type="text" class="form-control font-monospace" id="referral-code-input" readonly value="Loading..." aria-label="Your referral code">
|
|
1331
|
+
<button type="button" class="btn btn-outline-adaptive" id="copy-referral-code-btn" data-omega-copy aria-label="Copy referral code">
|
|
1332
|
+
<i class="fa-solid fa-copy me-2"></i>
|
|
1333
|
+
<span class="button-text d-none d-sm-inline">Copy</span>
|
|
1334
|
+
</button>
|
|
1335
|
+
</div>
|
|
1336
|
+
</div>
|
|
1337
|
+
|
|
1338
|
+
<!-- The inbound half: the code this account itself signed up through, filled by the referrals section only when the signup carried one -->
|
|
1339
|
+
<p class="card-text text-muted small mt-3 mb-0 d-none" id="referred-by">
|
|
1340
|
+
Referred by
|
|
1341
|
+
<span class="omega-chip font-monospace ms-1" id="referred-by-code"></span>
|
|
1342
|
+
<span class="ms-1" id="referred-by-time"></span>
|
|
1343
|
+
</p>
|
|
1344
|
+
|
|
1345
|
+
</div>
|
|
1346
|
+
</div>
|
|
1347
|
+
|
|
1348
|
+
<!-- Referral stats (merged stat card — the admin App DNA) -->
|
|
1349
|
+
<div class="omega-statgrid mb-3" style="--omega-statgrid-cols: 2;">
|
|
1350
|
+
<div class="omega-statgrid__cell">
|
|
1351
|
+
<div class="omega-statgrid__label">
|
|
1352
|
+
<span class="omega-micro">Total referrals</span>
|
|
1353
|
+
<i class="fa-solid fa-user-plus fa-sm"></i>
|
|
1354
|
+
</div>
|
|
1355
|
+
<h3 class="omega-statgrid__value mb-0" id="total-referrals">0</h3>
|
|
1356
|
+
</div>
|
|
1357
|
+
<div class="omega-statgrid__cell">
|
|
1358
|
+
<div class="omega-statgrid__label">
|
|
1359
|
+
<span class="omega-micro">This month</span>
|
|
1360
|
+
<i class="fa-solid fa-calendar fa-sm"></i>
|
|
1361
|
+
</div>
|
|
1362
|
+
<h3 class="omega-statgrid__value mb-0" id="recent-referrals">0</h3>
|
|
1363
|
+
</div>
|
|
1364
|
+
</div>
|
|
1365
|
+
|
|
1366
|
+
<!-- Referrals List Accordion -->
|
|
1367
|
+
<div class="accordion" id="referrals-accordion">
|
|
1368
|
+
<div class="accordion-item">
|
|
1369
|
+
<h2 class="accordion-header" id="referrals-list-heading">
|
|
1370
|
+
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#referrals-list-collapse" aria-expanded="false" aria-controls="referrals-list-collapse">
|
|
1371
|
+
<span class="me-2"><i class="fa-solid fa-users fa-sm"></i></span>
|
|
1372
|
+
View referral details
|
|
1373
|
+
<span class="omega-chip ms-2" id="referrals-badge">0</span>
|
|
1374
|
+
</button>
|
|
1375
|
+
</h2>
|
|
1376
|
+
<div id="referrals-list-collapse" class="accordion-collapse collapse" aria-labelledby="referrals-list-heading" data-bs-parent="#referrals-accordion">
|
|
1377
|
+
<div class="accordion-body">
|
|
1378
|
+
<div id="referrals-list" class="list-group list-group-flush">
|
|
1379
|
+
<!-- Referrals will be loaded here -->
|
|
1380
|
+
<div class="text-center text-muted py-3">
|
|
1381
|
+
No referrals yet. Share your code to get started!
|
|
1382
|
+
</div>
|
|
1383
|
+
</div>
|
|
1384
|
+
</div>
|
|
1385
|
+
</div>
|
|
1386
|
+
</div>
|
|
1387
|
+
</div>
|
|
1388
|
+
</section>
|
|
1389
|
+
|
|
1390
|
+
<!-- Team Section -->
|
|
1391
|
+
<section id="team-section" class="account-section d-none">
|
|
1392
|
+
{% include frontend/sections/account-section-header.html title="Team" icon="users" %}
|
|
1393
|
+
|
|
1394
|
+
<div class="card">
|
|
1395
|
+
<div class="card-header d-flex justify-content-between align-items-center">
|
|
1396
|
+
<h6 class="mb-0 d-inline-flex align-items-center"><i class="fa-solid fa-users fa-md me-2"></i> Team members</h6>
|
|
1397
|
+
<button class="btn btn-adaptive btn-sm" id="invite-team-member-btn">
|
|
1398
|
+
<i class="fa-solid fa-user-plus me-2"></i>
|
|
1399
|
+
<span class="button-text">
|
|
1400
|
+
Invite<span class="d-none d-md-inline"> team member</span>
|
|
1401
|
+
</span>
|
|
1402
|
+
</button>
|
|
1403
|
+
</div>
|
|
1404
|
+
<div class="card-body">
|
|
1405
|
+
<div class="list-group" id="team-list">
|
|
1406
|
+
<div class="list-group-item">
|
|
1407
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
1408
|
+
<div>
|
|
1409
|
+
<strong>You</strong>
|
|
1410
|
+
<small class="text-muted d-block">Owner</small>
|
|
1411
|
+
</div>
|
|
1412
|
+
<span class="omega-chip omega-chip--ink">Owner</span>
|
|
1413
|
+
</div>
|
|
1414
|
+
</div>
|
|
1415
|
+
</div>
|
|
1416
|
+
</div>
|
|
1417
|
+
</div>
|
|
1418
|
+
</section>
|
|
1419
|
+
|
|
1420
|
+
<!-- Notifications Section -->
|
|
1421
|
+
<section id="notifications-section" class="account-section d-none">
|
|
1422
|
+
{% include frontend/sections/account-section-header.html title="Notifications" icon="bell" %}
|
|
1423
|
+
|
|
1424
|
+
<div class="card">
|
|
1425
|
+
<div class="card-header">
|
|
1426
|
+
<h6 class="mb-0 d-inline-flex align-items-center"><i class="fa-solid fa-envelope fa-md me-2"></i> Email preferences</h6>
|
|
1427
|
+
</div>
|
|
1428
|
+
<div class="card-body">
|
|
1429
|
+
<form id="marketing-emails-form" novalidate data-form-state="initializing" onsubmit="return false">
|
|
1430
|
+
<div class="form-check form-switch mb-3">
|
|
1431
|
+
<input class="form-check-input" type="checkbox" id="marketing-emails" name="enabled">
|
|
1432
|
+
<label class="form-check-label" for="marketing-emails">
|
|
1433
|
+
Product updates, newsletters, and marketing communications
|
|
1434
|
+
<small class="d-block text-muted">You can withdraw consent at any time.</small>
|
|
1435
|
+
<small id="marketing-emails-grant-date" class="d-block text-muted d-none"></small>
|
|
1436
|
+
</label>
|
|
1437
|
+
</div>
|
|
1438
|
+
<button type="submit" class="btn btn-adaptive">
|
|
1439
|
+
<i class="fa-solid fa-floppy-disk me-2"></i>
|
|
1440
|
+
<span class="button-text">Save preferences</span>
|
|
1441
|
+
</button>
|
|
1442
|
+
</form>
|
|
1443
|
+
</div>
|
|
1444
|
+
</div>
|
|
1445
|
+
<div class="card mt-3">
|
|
1446
|
+
<div class="card-header d-flex justify-content-between align-items-center">
|
|
1447
|
+
<h6 class="mb-0 d-inline-flex align-items-center"><i class="fa-solid fa-bell fa-md me-2"></i> Push notifications</h6>
|
|
1448
|
+
<span id="push-notification-status"><span class="omega-chip">Checking...</span></span>
|
|
1449
|
+
</div>
|
|
1450
|
+
<div class="card-body">
|
|
1451
|
+
<p class="text-muted small mb-3">Receive push notifications in your browser for important updates.</p>
|
|
1452
|
+
|
|
1453
|
+
<form id="push-subscribe-form" novalidate data-form-state="initializing" onsubmit="return false" style="display:none">
|
|
1454
|
+
<button type="submit" class="btn btn-adaptive btn-sm" id="push-subscribe-btn">
|
|
1455
|
+
<i class="fa-solid fa-bell me-1"></i>
|
|
1456
|
+
<span class="button-text">Enable push notifications</span>
|
|
1457
|
+
</button>
|
|
1458
|
+
</form>
|
|
1459
|
+
|
|
1460
|
+
<div class="mt-3 pt-3 border-top">
|
|
1461
|
+
<a class="small text-muted text-decoration-none d-flex align-items-center" data-bs-toggle="collapse" href="#push-token-details" role="button" aria-expanded="false">
|
|
1462
|
+
<i class="fa-solid fa-code fa-xs me-1"></i> Token details
|
|
1463
|
+
</a>
|
|
1464
|
+
<div class="collapse mt-2" id="push-token-details">
|
|
1465
|
+
<div class="input-group input-group-sm">
|
|
1466
|
+
<input type="text" class="form-control font-monospace bg-body-tertiary" id="push-token-value" readonly value="No token" style="font-size: 0.65rem;">
|
|
1467
|
+
<button type="button" class="btn btn-outline-adaptive" id="copy-push-token-btn" data-omega-copy aria-label="Copy push token">
|
|
1468
|
+
<i class="fa-solid fa-copy"></i>
|
|
1469
|
+
</button>
|
|
1470
|
+
</div>
|
|
1471
|
+
</div>
|
|
1472
|
+
</div>
|
|
1473
|
+
</div>
|
|
1474
|
+
</div>
|
|
1475
|
+
</section>
|
|
1476
|
+
|
|
1477
|
+
<!-- API Keys Section -->
|
|
1478
|
+
<section id="api-keys-section" class="account-section d-none">
|
|
1479
|
+
{% include frontend/sections/account-section-header.html title="API & MCP" icon="key" %}
|
|
1480
|
+
|
|
1481
|
+
<!-- API Key Card -->
|
|
1482
|
+
<div class="card mb-4">
|
|
1483
|
+
<div class="card-header d-flex justify-content-between align-items-center">
|
|
1484
|
+
<h6 class="mb-0 d-inline-flex align-items-center"><i class="fa-solid fa-key fa-md me-2"></i> Your API key</h6>
|
|
1485
|
+
<form id="reset-api-key-form" class="d-inline" novalidate data-form-state="initializing" onsubmit="return false">
|
|
1486
|
+
<button type="submit" class="btn btn-outline-danger btn-sm" id="reset-api-key-btn">
|
|
1487
|
+
<i class="fa-solid fa-rotate me-1"></i>
|
|
1488
|
+
<span class="button-text">
|
|
1489
|
+
Reset<span class="d-none d-md-inline"> API key</span>
|
|
1490
|
+
</span>
|
|
1491
|
+
</button>
|
|
1492
|
+
</form>
|
|
1493
|
+
</div>
|
|
1494
|
+
<div class="card-body">
|
|
1495
|
+
<p class="card-text text-muted">Use this private key to authenticate API requests. Keep it secure and never share it publicly.</p>
|
|
1496
|
+
|
|
1497
|
+
<!-- API Key Display -->
|
|
1498
|
+
<div class="mb-3">
|
|
1499
|
+
<label for="api-key-input" class="form-label small text-muted">Private API key</label>
|
|
1500
|
+
<div class="input-group">
|
|
1501
|
+
<input type="text" class="form-control font-monospace" id="api-key-input" readonly value="Loading...">
|
|
1502
|
+
<button type="button" class="btn btn-outline-adaptive" id="copy-api-key-btn" data-omega-copy aria-label="Copy API key">
|
|
1503
|
+
<i class="fa-solid fa-copy me-2"></i>
|
|
1504
|
+
<span class="button-text d-none d-sm-inline">Copy</span>
|
|
1505
|
+
</button>
|
|
1506
|
+
</div>
|
|
1507
|
+
</div>
|
|
1508
|
+
|
|
1509
|
+
<!-- Reset API Key -->
|
|
1510
|
+
<div class="alert alert-warning d-flex align-items-center" role="alert">
|
|
1511
|
+
<div class="me-3">
|
|
1512
|
+
<i class="fa-solid fa-triangle-exclamation fa-2xl"></i>
|
|
1513
|
+
</div>
|
|
1514
|
+
<div class="flex-grow-1">
|
|
1515
|
+
<strong>Warning:</strong> Resetting your API key will invalidate the current key. Any applications using the old key will stop working.
|
|
1516
|
+
</div>
|
|
1517
|
+
</div>
|
|
1518
|
+
</div>
|
|
1519
|
+
</div>
|
|
1520
|
+
|
|
1521
|
+
<!-- MCP Integration Card -->
|
|
1522
|
+
<div class="card" data-brand-id="{{ resolved.config.brand.id }}" id="mcp-card">
|
|
1523
|
+
<div class="card-header">
|
|
1524
|
+
<h6 class="mb-0 d-inline-flex align-items-center"><i class="fa-solid fa-plug fa-md me-2"></i> MCP integration</h6>
|
|
1525
|
+
</div>
|
|
1526
|
+
<div class="card-body">
|
|
1527
|
+
<p class="card-text text-muted mb-3">Connect AI assistants to your account using the Model Context Protocol. Paste the URL below into your preferred AI tool.</p>
|
|
1528
|
+
|
|
1529
|
+
<!-- MCP URL display -->
|
|
1530
|
+
<div class="mb-4">
|
|
1531
|
+
<label for="mcp-url-input" class="form-label small text-muted">MCP server URL</label>
|
|
1532
|
+
<div class="input-group">
|
|
1533
|
+
<input type="text" class="form-control font-monospace" id="mcp-url-input" readonly data-mcp-url value="Loading...">
|
|
1534
|
+
<button type="button" class="btn btn-outline-adaptive" id="copy-mcp-url-btn" data-omega-copy aria-label="Copy MCP URL">
|
|
1535
|
+
<i class="fa-solid fa-copy me-2"></i>
|
|
1536
|
+
<span class="button-text d-none d-sm-inline">Copy</span>
|
|
1537
|
+
</button>
|
|
1538
|
+
</div>
|
|
1539
|
+
</div>
|
|
1540
|
+
|
|
1541
|
+
<!-- Provider Tabs -->
|
|
1542
|
+
<div class="border rounded">
|
|
1543
|
+
<ul class="nav nav-tabs px-3 pt-2 flex-nowrap overflow-auto" id="mcp-provider-tabs" role="tablist">
|
|
1544
|
+
<li class="nav-item" role="presentation">
|
|
1545
|
+
<button class="nav-link active small text-nowrap" id="mcp-claude-tab" data-bs-toggle="tab" data-bs-target="#mcp-claude" type="button" role="tab">Claude</button>
|
|
1546
|
+
</li>
|
|
1547
|
+
<li class="nav-item" role="presentation">
|
|
1548
|
+
<button class="nav-link small text-nowrap" id="mcp-cursor-tab" data-bs-toggle="tab" data-bs-target="#mcp-cursor" type="button" role="tab">Cursor</button>
|
|
1549
|
+
</li>
|
|
1550
|
+
<li class="nav-item" role="presentation">
|
|
1551
|
+
<button class="nav-link small text-nowrap" id="mcp-vscode-tab" data-bs-toggle="tab" data-bs-target="#mcp-vscode" type="button" role="tab">VS Code</button>
|
|
1552
|
+
</li>
|
|
1553
|
+
<li class="nav-item" role="presentation">
|
|
1554
|
+
<button class="nav-link small text-nowrap" id="mcp-codex-tab" data-bs-toggle="tab" data-bs-target="#mcp-codex" type="button" role="tab">Codex</button>
|
|
1555
|
+
</li>
|
|
1556
|
+
<li class="nav-item" role="presentation">
|
|
1557
|
+
<button class="nav-link small text-nowrap" id="mcp-gemini-tab" data-bs-toggle="tab" data-bs-target="#mcp-gemini" type="button" role="tab">Gemini CLI</button>
|
|
1558
|
+
</li>
|
|
1559
|
+
<li class="nav-item" role="presentation">
|
|
1560
|
+
<button class="nav-link small text-nowrap" id="mcp-opencode-tab" data-bs-toggle="tab" data-bs-target="#mcp-opencode" type="button" role="tab">OpenCode</button>
|
|
1561
|
+
</li>
|
|
1562
|
+
<li class="nav-item" role="presentation">
|
|
1563
|
+
<button class="nav-link small text-nowrap" id="mcp-windsurf-tab" data-bs-toggle="tab" data-bs-target="#mcp-windsurf" type="button" role="tab">Windsurf</button>
|
|
1564
|
+
</li>
|
|
1565
|
+
<li class="nav-item" role="presentation">
|
|
1566
|
+
<button class="nav-link small text-nowrap" id="mcp-zed-tab" data-bs-toggle="tab" data-bs-target="#mcp-zed" type="button" role="tab">Zed</button>
|
|
1567
|
+
</li>
|
|
1568
|
+
<li class="nav-item" role="presentation">
|
|
1569
|
+
<button class="nav-link small text-nowrap" id="mcp-other-tab" data-bs-toggle="tab" data-bs-target="#mcp-other" type="button" role="tab">Other</button>
|
|
1570
|
+
</li>
|
|
1571
|
+
</ul>
|
|
1572
|
+
<div class="tab-content p-3">
|
|
1573
|
+
<!-- Claude -->
|
|
1574
|
+
<div class="tab-pane fade show active" id="mcp-claude" role="tabpanel">
|
|
1575
|
+
<ol class="small text-muted mb-0">
|
|
1576
|
+
<li class="mb-2">Open your terminal and run:
|
|
1577
|
+
<div class="input-group mt-1 mb-1">
|
|
1578
|
+
<input type="text" class="form-control form-control-sm font-monospace bg-dark text-light" id="mcp-cmd-claude" readonly data-mcp-cmd="claude" value="Loading...">
|
|
1579
|
+
<button type="button" class="btn btn-outline-adaptive btn-sm" data-omega-copy="#mcp-cmd-claude" aria-label="Copy the Claude command"><i class="fa-solid fa-copy"></i></button>
|
|
1580
|
+
</div>
|
|
1581
|
+
</li>
|
|
1582
|
+
<li class="mb-2">This will trigger an OAuth flow to connect Claude to your account.</li>
|
|
1583
|
+
</ol>
|
|
1584
|
+
<div class="position-relative my-3">
|
|
1585
|
+
<hr class="text-muted">
|
|
1586
|
+
<span class="position-absolute top-50 start-50 translate-middle px-3 text-muted small bg-body-secondary">OR</span>
|
|
1587
|
+
</div>
|
|
1588
|
+
<ol class="small text-muted mb-0">
|
|
1589
|
+
<li class="mb-2">Go to <strong>Claude Desktop → Settings → Integrations → Add</strong>.</li>
|
|
1590
|
+
<li>Paste the MCP URL above and connect.</li>
|
|
1591
|
+
</ol>
|
|
1592
|
+
</div>
|
|
1593
|
+
<!-- Cursor -->
|
|
1594
|
+
<div class="tab-pane fade" id="mcp-cursor" role="tabpanel">
|
|
1595
|
+
<ol class="small text-muted mb-0">
|
|
1596
|
+
<li class="mb-2">Open Cursor Settings: <kbd>⌘</kbd> + <kbd>Shift</kbd> + <kbd>J</kbd></li>
|
|
1597
|
+
<li class="mb-2">Select <strong>Skills and Integrations</strong>.</li>
|
|
1598
|
+
<li class="mb-2">Select <strong>New MCP Server</strong> and paste:
|
|
1599
|
+
<div class="position-relative mt-1">
|
|
1600
|
+
<pre class="bg-dark text-light rounded p-3 small mb-0" id="mcp-cmd-cursor" data-mcp-cmd="cursor"><code>Loading...</code></pre>
|
|
1601
|
+
<button type="button" class="btn btn-outline-light btn-sm position-absolute top-0 end-0 m-2" data-omega-copy="#mcp-cmd-cursor" aria-label="Copy the Cursor configuration"><i class="fa-solid fa-copy"></i></button>
|
|
1602
|
+
</div>
|
|
1603
|
+
</li>
|
|
1604
|
+
</ol>
|
|
1605
|
+
</div>
|
|
1606
|
+
<!-- VS Code -->
|
|
1607
|
+
<div class="tab-pane fade" id="mcp-vscode" role="tabpanel">
|
|
1608
|
+
<ol class="small text-muted mb-0">
|
|
1609
|
+
<li class="mb-2"><kbd>⌘</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd> and search for <strong>MCP: Add Server</strong>.</li>
|
|
1610
|
+
<li class="mb-2">Select <strong>HTTP (HTTP or Server-Sent Events)</strong>.</li>
|
|
1611
|
+
<li class="mb-2">Enter the MCP URL and hit enter.</li>
|
|
1612
|
+
</ol>
|
|
1613
|
+
<div class="position-relative my-3">
|
|
1614
|
+
<hr class="text-muted">
|
|
1615
|
+
<span class="position-absolute top-50 start-50 translate-middle px-3 text-muted small bg-body-secondary">OR</span>
|
|
1616
|
+
</div>
|
|
1617
|
+
<ol class="small text-muted mb-0">
|
|
1618
|
+
<li class="mb-2">Add to your <code>settings.json</code>:
|
|
1619
|
+
<div class="position-relative mt-1">
|
|
1620
|
+
<pre class="bg-dark text-light rounded p-3 small mb-0" id="mcp-cmd-vscode" data-mcp-cmd="vscode"><code>Loading...</code></pre>
|
|
1621
|
+
<button type="button" class="btn btn-outline-light btn-sm position-absolute top-0 end-0 m-2" data-omega-copy="#mcp-cmd-vscode" aria-label="Copy the VS Code configuration"><i class="fa-solid fa-copy"></i></button>
|
|
1622
|
+
</div>
|
|
1623
|
+
</li>
|
|
1624
|
+
<li>Save the file and restart VS Code.</li>
|
|
1625
|
+
</ol>
|
|
1626
|
+
</div>
|
|
1627
|
+
<!-- Codex -->
|
|
1628
|
+
<div class="tab-pane fade" id="mcp-codex" role="tabpanel">
|
|
1629
|
+
<ol class="small text-muted mb-0">
|
|
1630
|
+
<li class="mb-2">Open your terminal and run:
|
|
1631
|
+
<div class="input-group mt-1 mb-1">
|
|
1632
|
+
<input type="text" class="form-control form-control-sm font-monospace bg-dark text-light" id="mcp-cmd-codex" readonly data-mcp-cmd="codex" value="Loading...">
|
|
1633
|
+
<button type="button" class="btn btn-outline-adaptive btn-sm" data-omega-copy="#mcp-cmd-codex" aria-label="Copy the Codex command"><i class="fa-solid fa-copy"></i></button>
|
|
1634
|
+
</div>
|
|
1635
|
+
</li>
|
|
1636
|
+
<li>The MCP server will be available next time you run <code>codex</code>.</li>
|
|
1637
|
+
</ol>
|
|
1638
|
+
</div>
|
|
1639
|
+
<!-- Gemini CLI -->
|
|
1640
|
+
<div class="tab-pane fade" id="mcp-gemini" role="tabpanel">
|
|
1641
|
+
<ol class="small text-muted mb-0">
|
|
1642
|
+
<li class="mb-2">Edit <code>~/.gemini/settings.json</code> and add the HTTP MCP server configuration:
|
|
1643
|
+
<div class="position-relative mt-1">
|
|
1644
|
+
<pre class="bg-dark text-light rounded p-3 small mb-0" id="mcp-cmd-gemini" data-mcp-cmd="gemini"><code>Loading...</code></pre>
|
|
1645
|
+
<button type="button" class="btn btn-outline-light btn-sm position-absolute top-0 end-0 m-2" data-omega-copy="#mcp-cmd-gemini" aria-label="Copy the Gemini CLI configuration"><i class="fa-solid fa-copy"></i></button>
|
|
1646
|
+
</div>
|
|
1647
|
+
</li>
|
|
1648
|
+
<li class="mb-2">Save the file and restart Gemini CLI.</li>
|
|
1649
|
+
<li class="mb-2">Authenticate by running:
|
|
1650
|
+
<div class="input-group mt-1 mb-1">
|
|
1651
|
+
<input type="text" class="form-control form-control-sm font-monospace bg-dark text-light" id="mcp-cmd-gemini-auth" readonly data-mcp-cmd="gemini-auth" value="Loading...">
|
|
1652
|
+
<button type="button" class="btn btn-outline-adaptive btn-sm" data-omega-copy="#mcp-cmd-gemini-auth" aria-label="Copy the Gemini CLI authentication command"><i class="fa-solid fa-copy"></i></button>
|
|
1653
|
+
</div>
|
|
1654
|
+
</li>
|
|
1655
|
+
<li>This will open a browser window to complete the OAuth flow.</li>
|
|
1656
|
+
</ol>
|
|
1657
|
+
</div>
|
|
1658
|
+
<!-- OpenCode -->
|
|
1659
|
+
<div class="tab-pane fade" id="mcp-opencode" role="tabpanel">
|
|
1660
|
+
<ol class="small text-muted mb-0">
|
|
1661
|
+
<li class="mb-2">Edit <code>~/.config/opencode/opencode.json</code> and add the remote MCP server configuration:
|
|
1662
|
+
<div class="position-relative mt-1">
|
|
1663
|
+
<pre class="bg-dark text-light rounded p-3 small mb-0" id="mcp-cmd-opencode" data-mcp-cmd="opencode"><code>Loading...</code></pre>
|
|
1664
|
+
<button type="button" class="btn btn-outline-light btn-sm position-absolute top-0 end-0 m-2" data-omega-copy="#mcp-cmd-opencode" aria-label="Copy the OpenCode configuration"><i class="fa-solid fa-copy"></i></button>
|
|
1665
|
+
</div>
|
|
1666
|
+
</li>
|
|
1667
|
+
<li class="mb-2">Save the file and restart OpenCode.</li>
|
|
1668
|
+
<li class="mb-2">Authenticate by running:
|
|
1669
|
+
<div class="input-group mt-1 mb-1">
|
|
1670
|
+
<input type="text" class="form-control form-control-sm font-monospace bg-dark text-light" id="mcp-cmd-opencode-auth" readonly data-mcp-cmd="opencode-auth" value="Loading...">
|
|
1671
|
+
<button type="button" class="btn btn-outline-adaptive btn-sm" data-omega-copy="#mcp-cmd-opencode-auth" aria-label="Copy the OpenCode authentication command"><i class="fa-solid fa-copy"></i></button>
|
|
1672
|
+
</div>
|
|
1673
|
+
</li>
|
|
1674
|
+
<li>This will open a browser window to complete the OAuth flow.</li>
|
|
1675
|
+
</ol>
|
|
1676
|
+
</div>
|
|
1677
|
+
<!-- Windsurf -->
|
|
1678
|
+
<div class="tab-pane fade" id="mcp-windsurf" role="tabpanel">
|
|
1679
|
+
<ol class="small text-muted mb-0">
|
|
1680
|
+
<li class="mb-2">Open Windsurf Settings.</li>
|
|
1681
|
+
<li class="mb-2">Under <strong>Cascade</strong>, find <strong>Model Context Protocol Servers</strong>.</li>
|
|
1682
|
+
<li class="mb-2">Select <strong>Add Server</strong> and paste:
|
|
1683
|
+
<div class="position-relative mt-1">
|
|
1684
|
+
<pre class="bg-dark text-light rounded p-3 small mb-0" id="mcp-cmd-windsurf" data-mcp-cmd="windsurf"><code>Loading...</code></pre>
|
|
1685
|
+
<button type="button" class="btn btn-outline-light btn-sm position-absolute top-0 end-0 m-2" data-omega-copy="#mcp-cmd-windsurf" aria-label="Copy the Windsurf configuration"><i class="fa-solid fa-copy"></i></button>
|
|
1686
|
+
</div>
|
|
1687
|
+
</li>
|
|
1688
|
+
</ol>
|
|
1689
|
+
</div>
|
|
1690
|
+
<!-- Zed -->
|
|
1691
|
+
<div class="tab-pane fade" id="mcp-zed" role="tabpanel">
|
|
1692
|
+
<ol class="small text-muted mb-0">
|
|
1693
|
+
<li class="mb-2"><kbd>⌘</kbd> + <kbd>,</kbd> to open Zed settings.</li>
|
|
1694
|
+
<li class="mb-2">Add the MCP server configuration:
|
|
1695
|
+
<div class="position-relative mt-1">
|
|
1696
|
+
<pre class="bg-dark text-light rounded p-3 small mb-0" id="mcp-cmd-zed" data-mcp-cmd="zed"><code>Loading...</code></pre>
|
|
1697
|
+
<button type="button" class="btn btn-outline-light btn-sm position-absolute top-0 end-0 m-2" data-omega-copy="#mcp-cmd-zed" aria-label="Copy the Zed configuration"><i class="fa-solid fa-copy"></i></button>
|
|
1698
|
+
</div>
|
|
1699
|
+
</li>
|
|
1700
|
+
<li>Restart Zed to activate the server.</li>
|
|
1701
|
+
</ol>
|
|
1702
|
+
</div>
|
|
1703
|
+
<!-- Other -->
|
|
1704
|
+
<div class="tab-pane fade" id="mcp-other" role="tabpanel">
|
|
1705
|
+
<p class="small text-muted mb-2">Use these details to configure any MCP-compatible client:</p>
|
|
1706
|
+
<table class="table table-sm small mb-0">
|
|
1707
|
+
<tbody>
|
|
1708
|
+
<tr>
|
|
1709
|
+
<td class="text-muted fw-medium w-25">Server URL</td>
|
|
1710
|
+
<td class="font-monospace" id="mcp-detail-url" data-mcp-detail="url">Loading...</td>
|
|
1711
|
+
</tr>
|
|
1712
|
+
<tr>
|
|
1713
|
+
<td class="text-muted fw-medium">Transport</td>
|
|
1714
|
+
<td class="font-monospace">Streamable HTTP</td>
|
|
1715
|
+
</tr>
|
|
1716
|
+
<tr>
|
|
1717
|
+
<td class="text-muted fw-medium">Authentication</td>
|
|
1718
|
+
<td>OAuth 2.1 (automatic)</td>
|
|
1719
|
+
</tr>
|
|
1720
|
+
</tbody>
|
|
1721
|
+
</table>
|
|
1722
|
+
</div>
|
|
1723
|
+
</div>
|
|
1724
|
+
</div>
|
|
1725
|
+
|
|
1726
|
+
</div>
|
|
1727
|
+
</div>
|
|
1728
|
+
</section>
|
|
1729
|
+
|
|
1730
|
+
<!-- Data Request Section (Hidden by default) -->
|
|
1731
|
+
<section id="data-request-section" class="account-section d-none">
|
|
1732
|
+
{% include frontend/sections/account-section-header.html title="Request your data" icon="file-export" %}
|
|
1733
|
+
|
|
1734
|
+
<!-- Info card (always shown) -->
|
|
1735
|
+
<div class="card mb-4">
|
|
1736
|
+
<div class="card-header">
|
|
1737
|
+
<h6 class="mb-0 d-inline-flex align-items-center"><i class="fa-solid fa-file-export fa-md me-2"></i> Data request policy</h6>
|
|
1738
|
+
</div>
|
|
1739
|
+
<div class="card-body">
|
|
1740
|
+
<p class="card-text small text-muted">
|
|
1741
|
+
Under applicable data protection regulations including the General Data Protection Regulation (GDPR), the California Consumer Privacy Act (CCPA), and other similar legislative frameworks enacted by governmental bodies around the world, you may have the right to request a copy of the personal data we hold about you. This process is commonly referred to as a Subject Access Request (SAR) or a Data Portability Request. It is important that you understand the full scope, limitations, and procedural requirements of this request before proceeding. Please read the following information carefully and in its entirety before submitting a request.
|
|
1742
|
+
</p>
|
|
1743
|
+
<p class="card-text small text-muted">
|
|
1744
|
+
When you submit a data request, our data processing team will begin the process of compiling the personal information associated with your account. This may include, but is not limited to: your name, email address, account creation date, account activity logs, subscription and billing history (including payment provider identifiers and transaction records), geolocation data collected during your use of our services (such as IP address, approximate location derived from IP, continent, country, region, and city), device and browser information (including user agent strings, platform identifiers, and viewport characteristics), API usage statistics and rate limiting data, referral and affiliate information, OAuth2 connection records, and any other data points stored in connection with your account in our systems.
|
|
1745
|
+
</p>
|
|
1746
|
+
<p class="card-text small text-muted">
|
|
1747
|
+
The compilation and verification process is performed by our data processing team to ensure the accuracy, completeness, and security of the information provided to you. Due to the manual verification steps involved in this process and the need to ensure that data is being released to the correct account holder, this process may take up to <strong>14 business days</strong> from the date of your request submission to complete. We appreciate your patience during this time and ask that you do not submit duplicate requests, as this will not expedite the process and may in fact delay it.
|
|
1748
|
+
</p>
|
|
1749
|
+
<p class="card-text small text-muted">
|
|
1750
|
+
Once your data has been compiled, verified, and is ready for retrieval, you will need to <strong>return to this page</strong> to download it. For security purposes, we do not transmit personal data via email, SMS, or any other communication channel, as these methods are not considered sufficiently secure mediums for the transmission of personally identifiable information. The data will be made available exclusively through this authenticated account interface to ensure that only the verified account holder can access it. Your data package will be provided as a JSON file containing all of the aforementioned data categories.
|
|
1751
|
+
</p>
|
|
1752
|
+
<p class="card-text small text-muted">
|
|
1753
|
+
<strong>Important notice regarding account deletion:</strong> If you choose to delete your account at any point, all personal data associated with your account will be permanently and irreversibly removed from our systems in accordance with our data retention policy. Once your account has been deleted, we will no longer be able to process any pending data requests, nor will we be able to provide you with a copy of your data retroactively. There is no mechanism to recover data after account deletion. If you are considering both requesting your data and deleting your account, you must complete the data request process in full and download your data package <strong>before</strong> initiating the account deletion process. We strongly recommend downloading and verifying your data before taking any irreversible actions with your account.
|
|
1754
|
+
</p>
|
|
1755
|
+
<p class="card-text small text-muted">
|
|
1756
|
+
You are limited to one active data request at a time. If you have previously submitted a request that is still being processed, you will not be able to submit a new request until the current one has been completed or has expired. Additionally, after a completed data request, there is a 30-day cooldown period before a new request can be submitted. These limitations exist to prevent abuse of the system and to ensure that our data processing team can handle all requests in a timely and thorough manner. Excessive or abusive use of this feature may result in additional restrictions being applied to your account in accordance with our Terms of Service.
|
|
1757
|
+
</p>
|
|
1758
|
+
|
|
1759
|
+
<hr>
|
|
1760
|
+
|
|
1761
|
+
<h6 class="text-muted">Summary of key points:</h6>
|
|
1762
|
+
<ul class="small text-muted">
|
|
1763
|
+
<li>Processing time: up to <strong>14 business days</strong></li>
|
|
1764
|
+
<li>You must return to this page to download your data</li>
|
|
1765
|
+
<li>Data is <strong>not</strong> sent via email for security reasons</li>
|
|
1766
|
+
<li>Data is permanently unavailable after account deletion</li>
|
|
1767
|
+
<li>Only one active request at a time</li>
|
|
1768
|
+
<li>30-day cooldown between completed requests</li>
|
|
1769
|
+
<li>Data is provided as a downloadable JSON file</li>
|
|
1770
|
+
</ul>
|
|
1771
|
+
|
|
1772
|
+
<p id="data-request-form-trigger" class="card-text small text-muted mb-0">
|
|
1773
|
+
If you have read and understood all of the information above and still wish to proceed with your data subject access request, you may proceed to <button type="button" class="accordion-trigger small text-muted text-decoration-underline" data-bs-toggle="collapse" data-bs-target="#data-request-form-accordion" aria-expanded="false" aria-controls="data-request-form-accordion">submit your request →</button>.
|
|
1774
|
+
</p>
|
|
1775
|
+
</div>
|
|
1776
|
+
</div>
|
|
1777
|
+
|
|
1778
|
+
<!-- Status area (shown when a request exists) -->
|
|
1779
|
+
<div id="data-request-status" class="d-none mb-4">
|
|
1780
|
+
<div class="card">
|
|
1781
|
+
<div class="card-header">
|
|
1782
|
+
<h6 class="mb-0 d-inline-flex align-items-center">
|
|
1783
|
+
<i class="fa-solid fa-clock fa-md me-2"></i>
|
|
1784
|
+
<span id="data-request-status-title">Request status</span>
|
|
1785
|
+
</h6>
|
|
1786
|
+
</div>
|
|
1787
|
+
<div class="card-body">
|
|
1788
|
+
<p id="data-request-status-message" class="card-text text-muted"></p>
|
|
1789
|
+
<div id="data-request-download" class="d-none">
|
|
1790
|
+
<form id="data-request-download-form" data-form-state="initializing" onsubmit="return false">
|
|
1791
|
+
<button type="submit" class="btn btn-adaptive btn-sm" id="data-request-download-btn">
|
|
1792
|
+
<i class="fa-solid fa-download fa-sm me-2"></i>
|
|
1793
|
+
<span class="button-text">Download your data</span>
|
|
1794
|
+
</button>
|
|
1795
|
+
</form>
|
|
1796
|
+
</div>
|
|
1797
|
+
<div id="data-request-cancel" class="d-none">
|
|
1798
|
+
<form id="data-request-cancel-form" data-form-state="initializing" onsubmit="return false">
|
|
1799
|
+
<button type="submit" class="btn btn-adaptive btn-sm" id="data-request-cancel-btn">
|
|
1800
|
+
<i class="fa-solid fa-rotate-left fa-sm me-2"></i>
|
|
1801
|
+
<span class="button-text">Request withdrawal</span>
|
|
1802
|
+
</button>
|
|
1803
|
+
</form>
|
|
1804
|
+
</div>
|
|
1805
|
+
</div>
|
|
1806
|
+
</div>
|
|
1807
|
+
</div>
|
|
1808
|
+
|
|
1809
|
+
<!-- Request form (hidden when a request is pending) -->
|
|
1810
|
+
<div id="data-request-form-container">
|
|
1811
|
+
<div class="collapse" id="data-request-form-accordion">
|
|
1812
|
+
<div class="card card-form-border border-primary mt-4">
|
|
1813
|
+
<div class="card-header">
|
|
1814
|
+
<h6 class="mb-0 d-inline-flex align-items-center"><i class="fa-solid fa-file-export fa-md me-2"></i> Confirm data request</h6>
|
|
1815
|
+
</div>
|
|
1816
|
+
<div class="card-body">
|
|
1817
|
+
<form id="data-request-form" novalidate data-form-state="initializing" onsubmit="return false">
|
|
1818
|
+
<div class="mb-3">
|
|
1819
|
+
<div class="form-check">
|
|
1820
|
+
<input class="form-check-input" type="checkbox" id="data-request-confirm-checkbox" name="confirm_processing_time" required>
|
|
1821
|
+
<label class="form-check-label small" for="data-request-confirm-checkbox">
|
|
1822
|
+
I understand that this request may take up to 14 business days to process and that I must return to this page to download my data. I acknowledge that data will not be sent to me via email or any other channel.
|
|
1823
|
+
</label>
|
|
1824
|
+
<div class="invalid-feedback">You must acknowledge this before proceeding.</div>
|
|
1825
|
+
</div>
|
|
1826
|
+
</div>
|
|
1827
|
+
|
|
1828
|
+
<div class="mb-3">
|
|
1829
|
+
<div class="form-check">
|
|
1830
|
+
<input class="form-check-input" type="checkbox" id="data-request-deletion-checkbox" name="confirm_deletion_warning" required>
|
|
1831
|
+
<label class="form-check-label small" for="data-request-deletion-checkbox">
|
|
1832
|
+
I understand that if I delete my account before downloading my data, the data will be permanently lost and cannot be recovered under any circumstances.
|
|
1833
|
+
</label>
|
|
1834
|
+
<div class="invalid-feedback">You must acknowledge this before proceeding.</div>
|
|
1835
|
+
</div>
|
|
1836
|
+
</div>
|
|
1837
|
+
|
|
1838
|
+
<div class="mb-3">
|
|
1839
|
+
<label for="data-request-reason" class="form-label">Reason for request</label>
|
|
1840
|
+
<textarea class="form-control" id="data-request-reason" name="reason" rows="3" placeholder="Help us understand why you're requesting your data..."></textarea>
|
|
1841
|
+
</div>
|
|
1842
|
+
|
|
1843
|
+
<div class="row g-2">
|
|
1844
|
+
<div class="col-12 col-md-6 order-md-2">
|
|
1845
|
+
<button type="submit" class="btn btn-outline-adaptive w-100" id="data-request-submit-btn">
|
|
1846
|
+
<i class="fa-solid fa-file-export fa-sm me-2"></i>
|
|
1847
|
+
<span class="button-text">Submit data request</span>
|
|
1848
|
+
</button>
|
|
1849
|
+
</div>
|
|
1850
|
+
<div class="col-12 col-md-6 order-md-1">
|
|
1851
|
+
<a href="/dashboard/account" class="btn btn-adaptive w-100">
|
|
1852
|
+
<i class="fa-solid fa-arrow-left fa-sm me-2"></i>
|
|
1853
|
+
<span>Return to profile</span>
|
|
1854
|
+
</a>
|
|
1855
|
+
</div>
|
|
1856
|
+
</div>
|
|
1857
|
+
</form>
|
|
1858
|
+
</div>
|
|
1859
|
+
</div>
|
|
1860
|
+
</div>
|
|
1861
|
+
</div>
|
|
1862
|
+
</section>
|
|
1863
|
+
|
|
1864
|
+
<!-- Delete Account Section (Hidden by default) -->
|
|
1865
|
+
<section id="delete-section" class="account-section d-none">
|
|
1866
|
+
{% include frontend/sections/account-section-header.html title="Delete account" icon="trash" %}
|
|
1867
|
+
|
|
1868
|
+
<div class="card mb-4">
|
|
1869
|
+
<div class="card-header">
|
|
1870
|
+
<h6 class="mb-0 d-inline-flex align-items-center text-danger"><i class="fa-solid fa-trash fa-md me-2"></i> Account deletion policy</h6>
|
|
1871
|
+
</div>
|
|
1872
|
+
<div class="card-body">
|
|
1873
|
+
<p class="card-text small text-muted">
|
|
1874
|
+
Under applicable data protection regulations including the General Data Protection Regulation (GDPR) and the California Consumer Privacy Act (CCPA), you have the right to request the deletion of the personal data we hold about you. Account deletion is a permanent, irreversible action that cannot be undone under any circumstances. Please read the following important information carefully before proceeding.
|
|
1875
|
+
</p>
|
|
1876
|
+
<p class="card-text small text-muted">
|
|
1877
|
+
<strong>Permanent and irreversible:</strong> Once your account is deleted, all personal data associated with your account will be permanently removed from our systems. This includes, but is not limited to, your profile information, subscription and billing history, activity logs, API keys, OAuth2 connections, referral data, saved preferences, and all other stored information. There is no mechanism to recover any data after deletion. Our support team cannot restore deleted accounts or retrieve any associated data, regardless of the circumstances.
|
|
1878
|
+
</p>
|
|
1879
|
+
<p class="card-text small text-muted">
|
|
1880
|
+
<strong>Active subscriptions:</strong> You must cancel any active paid subscriptions before deleting your account. Accounts with active or suspended paid subscriptions cannot be deleted until the subscription is cancelled or expires. If you have a subscription that is currently in a billing cycle, you will need to wait for the cycle to complete or cancel the subscription first. No refunds will be issued for unused portions of cancelled subscriptions in connection with account deletion. <strong>Deleting your account permanently forfeits your right to request a refund</strong>, as all payment records and subscription history will be irreversibly removed from our systems and we will no longer be able to verify or process any refund requests. If you wish to request a refund, you must do so <strong>before</strong> deleting your account.
|
|
1881
|
+
</p>
|
|
1882
|
+
<p class="card-text small text-muted">
|
|
1883
|
+
<strong>Pending data requests:</strong> If you have a pending data request (Subject Access Request), it will be permanently cancelled upon account deletion. We will not be able to fulfill data requests after your account has been deleted. If you wish to obtain a copy of your data, you must complete the data request and download process <strong>before</strong> initiating account deletion. You can request a copy of your data from the <a href="#data-request">data request section</a>.
|
|
1884
|
+
</p>
|
|
1885
|
+
<p class="card-text small text-muted">
|
|
1886
|
+
<strong>Immediate effect:</strong> Account deletion takes effect immediately upon confirmation. You will be signed out of all active sessions across all devices and platforms, and will no longer be able to access any services, features, content, or data associated with your account. Any active API integrations or third-party connections will cease to function immediately.
|
|
1887
|
+
</p>
|
|
1888
|
+
<p class="card-text small text-muted">
|
|
1889
|
+
<strong>Third-party services:</strong> While we will remove your data from our systems, we cannot guarantee the removal of data that has already been shared with or collected by third-party services you may have used in connection with your account. This includes, but is not limited to, analytics providers, payment providers, authentication providers, and any external services you authorized. Please refer to the privacy policies of those services for information about their data retention and deletion practices.
|
|
1890
|
+
</p>
|
|
1891
|
+
|
|
1892
|
+
<hr>
|
|
1893
|
+
|
|
1894
|
+
<h6 class="text-muted">Summary of consequences:</h6>
|
|
1895
|
+
<ul class="small text-muted">
|
|
1896
|
+
<li>All personal information, account data, and stored content will be permanently erased</li>
|
|
1897
|
+
<li>Your subscription and complete billing history will be permanently removed</li>
|
|
1898
|
+
<li>All API keys, OAuth2 connections, and integrations will be revoked</li>
|
|
1899
|
+
<li>Access to all services, features, and platforms will be terminated immediately</li>
|
|
1900
|
+
<li>Any pending data requests will be cancelled and cannot be fulfilled</li>
|
|
1901
|
+
<li>Your right to request a refund will be permanently forfeited</li>
|
|
1902
|
+
<li>This action cannot be reversed, appealed, or undone by our support team</li>
|
|
1903
|
+
</ul>
|
|
1904
|
+
|
|
1905
|
+
<p class="card-text small text-muted mb-0">
|
|
1906
|
+
If you have read and understood all of the information above and still wish to proceed with deleting your account, you may proceed to <button type="button" class="accordion-trigger small text-muted text-decoration-underline" data-bs-toggle="collapse" data-bs-target="#delete-form-accordion" aria-expanded="false" aria-controls="delete-form-accordion">confirm account deletion →</button>.
|
|
1907
|
+
</p>
|
|
1908
|
+
</div>
|
|
1909
|
+
</div>
|
|
1910
|
+
|
|
1911
|
+
<div class="collapse" id="delete-form-accordion">
|
|
1912
|
+
<div class="card card-form-border border-danger mt-4">
|
|
1913
|
+
<div class="card-header">
|
|
1914
|
+
<h6 class="mb-0 d-inline-flex align-items-center text-danger"><i class="fa-solid fa-trash fa-md me-2"></i> Confirm account deletion</h6>
|
|
1915
|
+
</div>
|
|
1916
|
+
<div class="card-body">
|
|
1917
|
+
<form id="delete-account-form" novalidate data-form-state="initializing" onsubmit="return false">
|
|
1918
|
+
<div class="mb-3">
|
|
1919
|
+
<label for="delete-reason" class="form-label">Reason for leaving</label>
|
|
1920
|
+
<textarea class="form-control" id="delete-reason" name="reason" rows="3" placeholder="Help us improve by sharing why you're leaving..."></textarea>
|
|
1921
|
+
</div>
|
|
1922
|
+
|
|
1923
|
+
<div class="mb-3">
|
|
1924
|
+
<div class="form-check">
|
|
1925
|
+
<input class="form-check-input" type="checkbox" id="delete-confirm-checkbox" name="confirm_deletion" required>
|
|
1926
|
+
<label class="form-check-label" for="delete-confirm-checkbox">
|
|
1927
|
+
I understand that deleting my account is permanent and cannot be reversed. All my data, including personal information, subscription history, API keys, and stored content, will be permanently and irreversibly erased.
|
|
1928
|
+
</label>
|
|
1929
|
+
<div class="invalid-feedback">You must acknowledge this before proceeding.</div>
|
|
1930
|
+
</div>
|
|
1931
|
+
</div>
|
|
1932
|
+
|
|
1933
|
+
<div class="mb-3">
|
|
1934
|
+
<div class="form-check">
|
|
1935
|
+
<input class="form-check-input" type="checkbox" id="delete-data-request-checkbox" name="confirm_data_loss" required>
|
|
1936
|
+
<label class="form-check-label" for="delete-data-request-checkbox">
|
|
1937
|
+
I acknowledge that any pending data requests will be cancelled and I will not be able to request or download a copy of my data after my account is deleted.
|
|
1938
|
+
</label>
|
|
1939
|
+
<div class="invalid-feedback">You must acknowledge this before proceeding.</div>
|
|
1940
|
+
</div>
|
|
1941
|
+
</div>
|
|
1942
|
+
|
|
1943
|
+
<div class="row g-2">
|
|
1944
|
+
<div class="col-12 col-md-6 order-md-2">
|
|
1945
|
+
<button type="submit" class="btn btn-outline-adaptive w-100" id="delete-account-btn">
|
|
1946
|
+
<i class="fa-solid fa-trash fa-sm me-2"></i>
|
|
1947
|
+
<span class="button-text">Delete my account permanently</span>
|
|
1948
|
+
</button>
|
|
1949
|
+
</div>
|
|
1950
|
+
<div class="col-12 col-md-6 order-md-1">
|
|
1951
|
+
<a href="/dashboard/account" class="btn btn-adaptive w-100" id="cancel-delete-btn">
|
|
1952
|
+
<i class="fa-solid fa-arrow-left fa-sm me-2"></i>
|
|
1953
|
+
<span>Return to profile</span>
|
|
1954
|
+
</a>
|
|
1955
|
+
</div>
|
|
1956
|
+
</div>
|
|
1957
|
+
</form>
|
|
1958
|
+
</div>
|
|
1959
|
+
</div>
|
|
1960
|
+
</div>
|
|
1961
|
+
</section>
|
|
1962
|
+
|
|
1963
|
+
<!-- Refund Section (Hidden by default) -->
|
|
1964
|
+
<section id="refund-section" class="account-section d-none">
|
|
1965
|
+
{% include frontend/sections/account-section-header.html title="Request a refund" icon="rotate-left" %}
|
|
1966
|
+
|
|
1967
|
+
<!-- Refund policy info card -->
|
|
1968
|
+
<div class="card mb-4">
|
|
1969
|
+
<div class="card-header">
|
|
1970
|
+
<h6 class="mb-0 d-inline-flex align-items-center"><i class="fa-solid fa-rotate-left fa-md me-2"></i> Refund policy</h6>
|
|
1971
|
+
</div>
|
|
1972
|
+
<div class="card-body">
|
|
1973
|
+
<p class="card-text small text-muted">
|
|
1974
|
+
We understand that circumstances may change after making a purchase, and we want to ensure that our refund process is as transparent and fair as possible. Before submitting a refund request, please carefully read the following information in its entirety. By proceeding with a refund request, you acknowledge that you have read, understood, and agree to the terms and conditions outlined below. Our refund policy is governed by and subject to our <a href="/terms" target="_blank">Terms of Service</a> and <a href="/privacy" target="_blank">Privacy Policy</a>.
|
|
1975
|
+
</p>
|
|
1976
|
+
<p class="card-text small text-muted">
|
|
1977
|
+
<strong>Eligibility requirements:</strong> To be eligible for a refund, your subscription must first be cancelled or have a pending cancellation. Refunds cannot be issued for active subscriptions that have not been cancelled. If you have not yet cancelled your subscription, you must do so before initiating a refund request. You can cancel your subscription from the <a href="#billing">billing section</a> of your account. We require cancellation prior to refund processing to ensure that the subscription lifecycle is properly terminated and that no further charges are incurred during the refund processing window.
|
|
1978
|
+
</p>
|
|
1979
|
+
<p class="card-text small text-muted">
|
|
1980
|
+
<strong>Refund amount calculation:</strong> The amount of your refund is determined by how recently your most recent payment was processed. If your refund request is submitted within <strong>7 days</strong> of your last payment, you will receive a full refund of the entire payment amount. If your refund request is submitted after 7 days from the date of your last payment, you will receive a prorated refund calculated based on the remaining unused portion of your current billing period. The prorated amount is calculated proportionally based on the number of days remaining in your billing cycle relative to the total number of days in the cycle. <strong>Payments older than 6 months are not eligible for refunds under any circumstances.</strong> If your most recent payment was processed more than 6 months ago, your refund request will be automatically denied and cannot be overridden by our support team. All refund calculations are performed automatically by our payment processing system and are final.
|
|
1981
|
+
</p>
|
|
1982
|
+
<p class="card-text small text-muted">
|
|
1983
|
+
<strong>Processing and timeline:</strong> Refunds are processed through your original payment method, which is the same payment instrument (credit card, debit card, or other payment method) that was used to make the original purchase. Once a refund has been approved and initiated on our end, the actual processing time depends on your financial institution and payment provider. In most cases, refunds will appear on your statement within <strong>5–10 business days</strong>, although some financial institutions may take longer. We have no control over the processing timelines of your bank or payment provider. If your refund has not appeared after 10 business days, we recommend contacting your financial institution directly for further information.
|
|
1984
|
+
</p>
|
|
1985
|
+
<p class="card-text small text-muted">
|
|
1986
|
+
<strong>Immediate subscription cancellation:</strong> Upon successful processing of your refund, your subscription will be <strong>immediately and permanently cancelled</strong>. This means that you will instantly lose access to all premium features, content, elevated rate limits, priority support, and any other benefits associated with your paid subscription plan. Your account will be reverted to the free plan with its corresponding limitations. This action takes effect immediately upon refund approval and cannot be reversed, deferred, or scheduled for a later date.
|
|
1987
|
+
</p>
|
|
1988
|
+
<p class="card-text small text-muted">
|
|
1989
|
+
<strong>One refund per subscription period:</strong> Only one refund may be issued per subscription billing period. If you have already received a refund for the current billing period, you will not be eligible for an additional refund until a new billing period begins with a new payment. Additionally, refunds are only applicable to the most recent payment on your account. Payments from previous billing cycles are not eligible for refund through this self-service process.
|
|
1990
|
+
</p>
|
|
1991
|
+
<p class="card-text small text-muted">
|
|
1992
|
+
<strong>Account deletion and refunds:</strong> If you choose to delete your account, all personal data associated with your account will be permanently and irreversibly removed from our systems, including all payment and subscription records. Once your account has been deleted, we will no longer be able to look up your payment information, verify previous transactions, or process any refund requests. <strong>Account deletion permanently forfeits your right to request a refund</strong>, as we will have no means to verify or process such a request. If you are considering both requesting a refund and deleting your account, you must complete the refund process in full <strong>before</strong> initiating account deletion. For more information about account deletion, please visit the <a href="#delete">account deletion section</a>.
|
|
1993
|
+
</p>
|
|
1994
|
+
<p class="card-text small text-muted">
|
|
1995
|
+
<strong>Fraud and abuse prevention:</strong> We reserve the right to deny refund requests that we determine, in our sole discretion, to be fraudulent, abusive, or inconsistent with normal usage patterns. This includes, but is not limited to, repeated subscription and refund cycles, chargebacks filed in conjunction with refund requests, and any other activity that violates our <a href="/terms" target="_blank">Terms of Service</a>. Abuse of the refund system may result in suspension or termination of your account.
|
|
1996
|
+
</p>
|
|
1997
|
+
<p class="card-text small text-muted">
|
|
1998
|
+
<strong>Contact and support:</strong> If you have questions about this refund policy, need assistance with your refund request, or believe there has been an error in your refund calculation, please contact our support team through our <a href="/contact" target="_blank">contact page</a> before submitting a refund request. Our support team can help clarify your eligibility, explain the expected refund amount, and address any other concerns you may have. Please note that our support team is unable to override the automated refund calculation system or issue refunds outside the parameters of this policy.
|
|
1999
|
+
</p>
|
|
2000
|
+
|
|
2001
|
+
<hr>
|
|
2002
|
+
|
|
2003
|
+
<h6 class="text-muted">Summary of key points:</h6>
|
|
2004
|
+
<ul class="small text-muted">
|
|
2005
|
+
<li>Your subscription must be cancelled or pending cancellation before requesting a refund</li>
|
|
2006
|
+
<li>Full refund if requested within <strong>7 days</strong> of your last payment</li>
|
|
2007
|
+
<li>Prorated refund based on remaining billing period if requested after 7 days</li>
|
|
2008
|
+
<li><strong>Payments older than 6 months are not eligible</strong> for refunds under any circumstances</li>
|
|
2009
|
+
<li>Refunds are processed to your original payment method within <strong>5–10 business days</strong></li>
|
|
2010
|
+
<li>Your subscription will be <strong>immediately cancelled</strong> upon refund</li>
|
|
2011
|
+
<li>Account deletion permanently forfeits your right to a refund</li>
|
|
2012
|
+
<li>Only one refund per billing period; only the most recent payment is eligible</li>
|
|
2013
|
+
</ul>
|
|
2014
|
+
|
|
2015
|
+
<!-- Ineligible message (shown when not eligible) -->
|
|
2016
|
+
<div id="refund-ineligible" class="d-none">
|
|
2017
|
+
<hr>
|
|
2018
|
+
<div class="d-flex align-items-start text-warning">
|
|
2019
|
+
<span class="me-2 flex-shrink-0"><i class="fa-solid fa-triangle-exclamation fa-md"></i></span>
|
|
2020
|
+
<div>
|
|
2021
|
+
<strong>Not eligible for refund</strong>
|
|
2022
|
+
<p class="mb-0 small text-muted">A subscription refund is only available once the subscription is cancelled or pending cancellation — you can cancel it from the <a href="#billing">billing section</a> of your account. A one-time purchase is refundable on its own, for 6 months from the day it was bought; the ones still in that window are listed in your <a href="#orders">orders</a>.</p>
|
|
2023
|
+
</div>
|
|
2024
|
+
</div>
|
|
2025
|
+
</div>
|
|
2026
|
+
|
|
2027
|
+
<!-- Eligible: show refund form trigger -->
|
|
2028
|
+
<div id="refund-eligible" class="d-none">
|
|
2029
|
+
<p class="card-text small text-muted mb-0">
|
|
2030
|
+
If you have read and understood all of the information above and still wish to proceed with requesting a refund, you may proceed to <button type="button" class="accordion-trigger small text-muted text-decoration-underline" data-bs-toggle="collapse" data-bs-target="#refund-form-accordion" aria-expanded="false" aria-controls="refund-form-accordion">submit your refund request →</button>.
|
|
2031
|
+
</p>
|
|
2032
|
+
</div>
|
|
2033
|
+
</div>
|
|
2034
|
+
</div>
|
|
2035
|
+
|
|
2036
|
+
<div class="collapse" id="refund-form-accordion">
|
|
2037
|
+
<div class="card card-form-border border-primary mt-4">
|
|
2038
|
+
<div class="card-header">
|
|
2039
|
+
<h6 class="mb-0 d-inline-flex align-items-center"><i class="fa-solid fa-rotate-left fa-md me-2"></i> Confirm refund request</h6>
|
|
2040
|
+
</div>
|
|
2041
|
+
<div class="card-body">
|
|
2042
|
+
<form id="refund-form" novalidate data-form-state="initializing" onsubmit="return false">
|
|
2043
|
+
<!-- What is being refunded. One endpoint, two subjects: an empty
|
|
2044
|
+
value is the subscription, an order id is a one-time
|
|
2045
|
+
purchase (#672). The picker only appears when there is a
|
|
2046
|
+
choice to make — sections/refund.js fills and shows it. -->
|
|
2047
|
+
<div class="mb-3 d-none" id="refund-subject-picker">
|
|
2048
|
+
<label for="refund-subject" class="form-label">What would you like refunded? <span class="text-danger">*</span></label>
|
|
2049
|
+
<select class="form-select" id="refund-subject" name="subject">
|
|
2050
|
+
<!-- Options injected by JS -->
|
|
2051
|
+
</select>
|
|
2052
|
+
</div>
|
|
2053
|
+
|
|
2054
|
+
<!-- Refund reasons (randomized by JS) -->
|
|
2055
|
+
<div class="mb-3">
|
|
2056
|
+
<label class="form-label">Why are you requesting a refund? <span class="text-danger">*</span></label>
|
|
2057
|
+
<div id="refund-reasons-container">
|
|
2058
|
+
<!-- Radio buttons injected by JS in random order -->
|
|
2059
|
+
</div>
|
|
2060
|
+
</div>
|
|
2061
|
+
|
|
2062
|
+
<!-- Additional feedback -->
|
|
2063
|
+
<div class="mb-3">
|
|
2064
|
+
<label for="refund-feedback" class="form-label">Anything else you'd like us to know? <span class="text-danger">*</span></label>
|
|
2065
|
+
<textarea class="form-control" id="refund-feedback" name="feedback" rows="3" placeholder="Help us understand what we could do better..." required></textarea>
|
|
2066
|
+
<div class="invalid-feedback">Please provide feedback before requesting a refund.</div>
|
|
2067
|
+
</div>
|
|
2068
|
+
|
|
2069
|
+
<!-- Required confirmation -->
|
|
2070
|
+
<div class="mb-3">
|
|
2071
|
+
<div class="form-check">
|
|
2072
|
+
<input class="form-check-input" type="checkbox" id="refund-confirm-checkbox" name="confirm_refund" required>
|
|
2073
|
+
<label class="form-check-label" for="refund-confirm-checkbox">
|
|
2074
|
+
I understand that this refund is final: a refunded subscription is cancelled immediately and I lose access to its premium features, and a refunded one-time purchase is reversed. The refund amount will be determined by my refund eligibility and may be prorated.
|
|
2075
|
+
</label>
|
|
2076
|
+
<div class="invalid-feedback">You must confirm before requesting a refund.</div>
|
|
2077
|
+
</div>
|
|
2078
|
+
</div>
|
|
2079
|
+
|
|
2080
|
+
<!-- Buttons -->
|
|
2081
|
+
<div class="row g-2">
|
|
2082
|
+
<div class="col-12 col-md-6 order-md-2">
|
|
2083
|
+
<button type="submit" class="btn btn-outline-adaptive w-100" id="refund-submit-btn">
|
|
2084
|
+
<i class="fa-solid fa-rotate-left fa-sm me-2"></i>
|
|
2085
|
+
<span class="button-text">Request refund</span>
|
|
2086
|
+
</button>
|
|
2087
|
+
</div>
|
|
2088
|
+
<div class="col-12 col-md-6 order-md-1">
|
|
2089
|
+
<a href="#billing" class="btn btn-adaptive w-100">
|
|
2090
|
+
<i class="fa-solid fa-arrow-left fa-sm me-2"></i>
|
|
2091
|
+
<span>Return to billing</span>
|
|
2092
|
+
</a>
|
|
2093
|
+
</div>
|
|
2094
|
+
</div>
|
|
2095
|
+
</form>
|
|
2096
|
+
</div>
|
|
2097
|
+
</div>
|
|
2098
|
+
</div>
|
|
2099
|
+
</section>
|
|
2100
|
+
|
|
2101
|
+
</div>
|
|
2102
|
+
</div>
|
|
2103
|
+
</div>
|
|
2104
|
+
</div>
|