@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,335 @@
|
|
|
1
|
+
{
|
|
2
|
+
description: 'Serif display hero — rotating italic second line, ink CTA + mono command, optional stat cards, floating product frame, optional demo capture (input/form/video/custom). The classy homepage opener.',
|
|
3
|
+
|
|
4
|
+
// Top-level arg contract (validation is warn-only; names are API — renames
|
|
5
|
+
// follow deprecation discipline, spec §6)
|
|
6
|
+
args: {
|
|
7
|
+
breadcrumb: 'array', // ordered [{ label, href }] rendered as the nav above the headline — the LAST crumb is the current page and never links; absent renders nothing (#513). Pair it with the BreadcrumbList JSON-LD foot.html emits: the arg is the on-page trail, not the structured data
|
|
8
|
+
badge: 'object',
|
|
9
|
+
headline: 'string',
|
|
10
|
+
headline_accent: 'string',
|
|
11
|
+
heading_level: 'number', // the headline's heading tag (default 1) — a hero-shaped band BELOW the page's opener authors 2, so one page never ships two h1s (#500)
|
|
12
|
+
rotating: 'array',
|
|
13
|
+
description: 'string',
|
|
14
|
+
primary_button: 'object', // { text, href, enabled, icon?, class? } — an authored class replaces btn-adaptive; an authored icon leads the label INSTEAD of the arrow nudge
|
|
15
|
+
command: 'string',
|
|
16
|
+
command_href: 'string',
|
|
17
|
+
secondary_button: 'object', // { text, href, enabled, icon?, class? } — same contract over btn-outline-adaptive
|
|
18
|
+
meta: 'array',
|
|
19
|
+
cards: 'array', // stat cards under the hero ({ number, label, icon? }) — the marketing/stats vocabulary, no default: brand content is never a theme's voice
|
|
20
|
+
frame: 'object', // { enabled, title } — the centred product mock; a demo that IS the hero visual suppresses it: a side demo of any type (#496), and a video demo in any placement (#486)
|
|
21
|
+
// demo.type 'video' (legacy parity, #486) carries its knobs in the same
|
|
22
|
+
// options object: { src, poster, autoplay, loop, muted, controls, class,
|
|
23
|
+
// subtext }. The player rides omega_video, so the file lazy-loads like
|
|
24
|
+
// every other media; controls default ON (an unauthored video plays only
|
|
25
|
+
// on click) and an authored autoplay is ALWAYS muted.
|
|
26
|
+
// A `custom` demo has TWO fills: `name` points at a consumer animation
|
|
27
|
+
// folder — src/_hero/<name>/{index.html, style.scss, script.js}, resolved
|
|
28
|
+
// through the layer chain, its css and js bundled like a section's (#441) —
|
|
29
|
+
// and `options.content` is finished markup authored at the call site. A
|
|
30
|
+
// name wins over content. The framework ships `orbit` as the reference one.
|
|
31
|
+
demo: 'object', // { enabled, type, placement, name, options } — type: input | form | video | custom; placement: 'side' sets the demo BESIDE the copy; anything else (the default) centres it under the CTAs
|
|
32
|
+
demo_html: 'html', // finished markup for the demo position ({% slot demo_html %}) — replaces the typed demo lanes when set
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
// Every key consumer-overridable; string values liquify at the call site
|
|
36
|
+
// (so {{ resolved.config.brand.name }} resolves against the calling page's scope).
|
|
37
|
+
defaults: {
|
|
38
|
+
badge: {
|
|
39
|
+
text: 'Introducing {{ resolved.config.brand.name }}',
|
|
40
|
+
href: null,
|
|
41
|
+
},
|
|
42
|
+
headline: 'The platform for',
|
|
43
|
+
rotating: [
|
|
44
|
+
'modern business',
|
|
45
|
+
'shipping faster',
|
|
46
|
+
'scaling your team',
|
|
47
|
+
],
|
|
48
|
+
description: 'Everything you need to launch, measure, and grow: auth, payments, analytics, and every surface of your product in one place.',
|
|
49
|
+
primary_button: {
|
|
50
|
+
text: 'Get started free',
|
|
51
|
+
href: '/signup',
|
|
52
|
+
},
|
|
53
|
+
// No command default (pass B): the mono $ button renders only when the
|
|
54
|
+
// BRAND sets one — a framework command is never a theme's voice.
|
|
55
|
+
secondary_button: {
|
|
56
|
+
enabled: false,
|
|
57
|
+
text: 'See pricing',
|
|
58
|
+
href: '/pricing',
|
|
59
|
+
},
|
|
60
|
+
meta: [
|
|
61
|
+
'Free plan',
|
|
62
|
+
'No credit card required',
|
|
63
|
+
'Set up in minutes',
|
|
64
|
+
],
|
|
65
|
+
frame: {
|
|
66
|
+
enabled: true,
|
|
67
|
+
title: '{{ resolved.config.brand.name }} · Overview',
|
|
68
|
+
},
|
|
69
|
+
demo: {
|
|
70
|
+
enabled: false,
|
|
71
|
+
type: 'input',
|
|
72
|
+
placement: 'bottom',
|
|
73
|
+
// Input-lane knobs only — they render inside the input/form branches and
|
|
74
|
+
// leak nothing. Copy (subtext) and the card width live with the CALLER:
|
|
75
|
+
// a default here rides the deep merge onto every other demo type.
|
|
76
|
+
options: {
|
|
77
|
+
placeholder: 'Enter your email',
|
|
78
|
+
name: 'email',
|
|
79
|
+
input_type: 'email',
|
|
80
|
+
required: true,
|
|
81
|
+
redirect: '/dashboard/account',
|
|
82
|
+
button: {
|
|
83
|
+
text: 'Start free trial',
|
|
84
|
+
class: 'btn-adaptive',
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
|
|
90
|
+
// Showcase variants (spec §9) — args ride the data bridge over the
|
|
91
|
+
// defaults above, exactly like a consumer composition.
|
|
92
|
+
demo: [
|
|
93
|
+
{ label: 'Default' },
|
|
94
|
+
{
|
|
95
|
+
label: 'Email capture',
|
|
96
|
+
args: {
|
|
97
|
+
demo: {
|
|
98
|
+
enabled: true,
|
|
99
|
+
options: { subtext: 'No credit card required' },
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
label: 'No frame, second button',
|
|
105
|
+
args: {
|
|
106
|
+
frame: { enabled: false },
|
|
107
|
+
secondary_button: { enabled: true },
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
label: 'Input capture',
|
|
112
|
+
args: {
|
|
113
|
+
headline: 'Create your logo in',
|
|
114
|
+
headline_accent: 'seconds',
|
|
115
|
+
description: 'Enter your business name and watch the magic happen',
|
|
116
|
+
demo: {
|
|
117
|
+
enabled: true,
|
|
118
|
+
type: 'input',
|
|
119
|
+
options: {
|
|
120
|
+
class: 'mw-md',
|
|
121
|
+
placeholder: 'Enter your business name...',
|
|
122
|
+
name: 'business_name',
|
|
123
|
+
input_type: 'text',
|
|
124
|
+
required: true,
|
|
125
|
+
redirect: '/dashboard',
|
|
126
|
+
subtext: 'No credit card required - 5 free logos',
|
|
127
|
+
button: {
|
|
128
|
+
text: 'Generate logo',
|
|
129
|
+
icon: 'wand-magic-sparkles',
|
|
130
|
+
class: 'btn-adaptive-inverse',
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
// The legacy button contract (#476): an authored class replaces
|
|
135
|
+
// btn-adaptive and an authored icon takes the arrow nudge's place.
|
|
136
|
+
primary_button: {
|
|
137
|
+
text: 'Get started free',
|
|
138
|
+
icon: 'rocket',
|
|
139
|
+
href: '/dashboard',
|
|
140
|
+
class: 'btn-light',
|
|
141
|
+
},
|
|
142
|
+
secondary_button: {
|
|
143
|
+
text: 'Explore solutions',
|
|
144
|
+
icon: 'book-open',
|
|
145
|
+
href: '/pricing',
|
|
146
|
+
class: 'btn-outline-light',
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
label: 'Form',
|
|
152
|
+
args: {
|
|
153
|
+
headline: 'Get your custom',
|
|
154
|
+
headline_accent: 'quote',
|
|
155
|
+
description: "Tell us about your project and we'll get back to you within 24 hours",
|
|
156
|
+
demo: {
|
|
157
|
+
enabled: true,
|
|
158
|
+
type: 'form',
|
|
159
|
+
options: {
|
|
160
|
+
class: 'mw-lg',
|
|
161
|
+
redirect: '/contact',
|
|
162
|
+
subtext: 'We respond within 24 hours',
|
|
163
|
+
fields: [
|
|
164
|
+
{
|
|
165
|
+
name: 'industry',
|
|
166
|
+
label: 'Industry',
|
|
167
|
+
icon: 'building',
|
|
168
|
+
type: 'select',
|
|
169
|
+
size: 'half',
|
|
170
|
+
placeholder: 'Select industry',
|
|
171
|
+
options: [
|
|
172
|
+
{ value: 'technology', label: 'Technology' },
|
|
173
|
+
{ value: 'healthcare', label: 'Healthcare' },
|
|
174
|
+
{ value: 'finance', label: 'Finance' },
|
|
175
|
+
{ value: 'retail', label: 'Retail' },
|
|
176
|
+
],
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
name: 'company_size',
|
|
180
|
+
label: 'Company size',
|
|
181
|
+
icon: 'users',
|
|
182
|
+
type: 'select',
|
|
183
|
+
size: 'half',
|
|
184
|
+
placeholder: 'Select size',
|
|
185
|
+
options: [
|
|
186
|
+
{ value: '1-10', label: '1-10 employees' },
|
|
187
|
+
{ value: '11-50', label: '11-50 employees' },
|
|
188
|
+
{ value: '51-200', label: '51-200 employees' },
|
|
189
|
+
{ value: '200+', label: '200+ employees' },
|
|
190
|
+
],
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
name: 'message',
|
|
194
|
+
label: 'Tell us about your project',
|
|
195
|
+
icon: 'comment',
|
|
196
|
+
type: 'textarea',
|
|
197
|
+
size: 'full',
|
|
198
|
+
placeholder: 'Describe your goals, challenges, or questions...',
|
|
199
|
+
rows: 4,
|
|
200
|
+
required: true,
|
|
201
|
+
},
|
|
202
|
+
],
|
|
203
|
+
button: {
|
|
204
|
+
text: 'Get quote',
|
|
205
|
+
icon: 'paper-plane',
|
|
206
|
+
full_width: true,
|
|
207
|
+
class: 'btn-adaptive-inverse',
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
// No frame authored off: a video demo IS the hero visual, so the
|
|
215
|
+
// centred product frame suppresses itself (#486).
|
|
216
|
+
label: 'Video',
|
|
217
|
+
args: {
|
|
218
|
+
headline: 'See the platform in',
|
|
219
|
+
headline_accent: 'action',
|
|
220
|
+
description: 'Watch how easy it is to ship every surface of your product',
|
|
221
|
+
demo: {
|
|
222
|
+
enabled: true,
|
|
223
|
+
type: 'video',
|
|
224
|
+
options: {
|
|
225
|
+
class: 'mw-lg',
|
|
226
|
+
src: 'https://cdn.itwcreativeworks.com/assets/sample/videos/demos/16x9/sample-demo-1.webm',
|
|
227
|
+
autoplay: true,
|
|
228
|
+
loop: true,
|
|
229
|
+
muted: true,
|
|
230
|
+
controls: false,
|
|
231
|
+
subtext: 'No sound - autoplay enabled',
|
|
232
|
+
},
|
|
233
|
+
},
|
|
234
|
+
},
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
label: 'Side placement',
|
|
238
|
+
args: {
|
|
239
|
+
headline: 'Everything you need,',
|
|
240
|
+
headline_accent: 'side by side',
|
|
241
|
+
description: 'The demo sits beside the copy instead of under the CTAs',
|
|
242
|
+
demo: {
|
|
243
|
+
enabled: true,
|
|
244
|
+
type: 'video',
|
|
245
|
+
placement: 'side',
|
|
246
|
+
options: {
|
|
247
|
+
class: 'mw-lg',
|
|
248
|
+
src: 'https://cdn.itwcreativeworks.com/assets/sample/videos/demos/16x9/sample-demo-1.webm',
|
|
249
|
+
autoplay: true,
|
|
250
|
+
loop: true,
|
|
251
|
+
muted: true,
|
|
252
|
+
controls: false,
|
|
253
|
+
subtext: 'No sound, autoplay enabled',
|
|
254
|
+
},
|
|
255
|
+
},
|
|
256
|
+
},
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
// The named-folder lane (#441): the framework's own reference animation,
|
|
260
|
+
// resolved out of themes/base/_hero/orbit/ the way a consumer's
|
|
261
|
+
// src/_hero/<name>/ resolves. No frame — the animation IS the visual.
|
|
262
|
+
label: 'Custom animation',
|
|
263
|
+
args: {
|
|
264
|
+
headline: 'One stack for',
|
|
265
|
+
headline_accent: 'every surface',
|
|
266
|
+
description: 'A hero animation the brand owns: one folder, its own markup, styles and behavior.',
|
|
267
|
+
frame: { enabled: false },
|
|
268
|
+
demo: {
|
|
269
|
+
enabled: true,
|
|
270
|
+
type: 'custom',
|
|
271
|
+
name: 'orbit',
|
|
272
|
+
options: { subtext: 'src/_hero/orbit/' },
|
|
273
|
+
},
|
|
274
|
+
},
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
label: 'Custom slot',
|
|
278
|
+
args: {
|
|
279
|
+
headline: 'Design your',
|
|
280
|
+
headline_accent: 'brand',
|
|
281
|
+
description: 'Try our interactive brand builder right here',
|
|
282
|
+
demo: {
|
|
283
|
+
enabled: true,
|
|
284
|
+
type: 'custom',
|
|
285
|
+
options: {
|
|
286
|
+
class: 'bg-glassy rounded-4 p-4 mw-md',
|
|
287
|
+
subtext: 'Customize and preview in real-time',
|
|
288
|
+
// Finished markup, authored at the CALL site: it liquifies in the
|
|
289
|
+
// caller's scope (omega_* tags work) and lands in the demo slot as
|
|
290
|
+
// is. Anchors are welcome — the route guard skips escaped code
|
|
291
|
+
// display, so the gallery's copyable args block no longer reads a
|
|
292
|
+
// demo's href= as a link the page emits (#521).
|
|
293
|
+
content: '<div class="row g-3 text-start">\
|
|
294
|
+
<div class="col-12">\
|
|
295
|
+
<label for="demo-brand-color" class="form-label fw-bold"><i class="fa-solid fa-palette me-1"></i>Choose your brand color:</label>\
|
|
296
|
+
<input type="color" class="form-control form-control-color form-control-lg border-0 w-100" id="demo-brand-color" value="#6366f1" aria-label="Choose your brand color">\
|
|
297
|
+
</div>\
|
|
298
|
+
<div class="col-12">\
|
|
299
|
+
<a href="/signup" class="btn btn-adaptive-inverse btn-lg px-4 w-100"><i class="fa-solid fa-palette me-2"></i>Apply theme</a>\
|
|
300
|
+
</div>\
|
|
301
|
+
</div>',
|
|
302
|
+
},
|
|
303
|
+
},
|
|
304
|
+
},
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
// The deep-page shape: a page inside a hub says where it sits before it
|
|
308
|
+
// says anything else. No frame — the trail carries the page, not a mock.
|
|
309
|
+
// The crumb hrefs are REAL default routes: a variant's rendered frame
|
|
310
|
+
// rides the #427 route guard like every other default page.
|
|
311
|
+
label: 'Breadcrumb',
|
|
312
|
+
args: {
|
|
313
|
+
breadcrumb: [
|
|
314
|
+
{ label: 'Home', href: '/' },
|
|
315
|
+
{ label: 'Blog', href: '/blog' },
|
|
316
|
+
{ label: 'Shipping faster' },
|
|
317
|
+
],
|
|
318
|
+
headline: 'Everything we learned',
|
|
319
|
+
headline_accent: 'shipping faster',
|
|
320
|
+
description: 'A deep page that says where it sits before it says anything else.',
|
|
321
|
+
frame: { enabled: false },
|
|
322
|
+
},
|
|
323
|
+
},
|
|
324
|
+
{
|
|
325
|
+
label: 'Stat cards',
|
|
326
|
+
args: {
|
|
327
|
+
cards: [
|
|
328
|
+
{ number: '99%', label: 'Uptime', icon: 'shield-halved' },
|
|
329
|
+
{ number: '500K+', label: 'Builds shipped', icon: 'rocket' },
|
|
330
|
+
{ number: '30+', label: 'Integrations' },
|
|
331
|
+
],
|
|
332
|
+
},
|
|
333
|
+
},
|
|
334
|
+
],
|
|
335
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
<section{% if args.section_class != blank %} class="{{ args.section_class }}"{% endif %} data-omega-section="marketing/newsletter-cta">
|
|
2
|
+
<div class="container">
|
|
3
|
+
<div class="omega-cta omega-ink-panel" data-omega-reveal="scale">
|
|
4
|
+
{% iftruthy args.superheadline.text %}
|
|
5
|
+
<span class="omega-micro d-block mb-3">{{ args.superheadline.text }}</span>
|
|
6
|
+
{% endiftruthy %}
|
|
7
|
+
<h2 class="omega-cta__headline">{{ args.headline }}</h2>
|
|
8
|
+
{% iftruthy args.subheadline %}
|
|
9
|
+
<p class="omega-cta__sub">{{ args.subheadline }}</p>
|
|
10
|
+
{% endiftruthy %}
|
|
11
|
+
|
|
12
|
+
<!-- Newsletter Form -->
|
|
13
|
+
<form id="newsletter-form" class="newsletter-form mt-4" novalidate data-form-state="initializing" onsubmit="return false">
|
|
14
|
+
<div class="row g-3 justify-content-center">
|
|
15
|
+
<div class="col-md-5">
|
|
16
|
+
<input
|
|
17
|
+
type="email"
|
|
18
|
+
class="form-control form-control-lg"
|
|
19
|
+
placeholder="{{ args.form.placeholder }}"
|
|
20
|
+
name="email"
|
|
21
|
+
required
|
|
22
|
+
autocomplete="email"
|
|
23
|
+
>
|
|
24
|
+
<div class="invalid-feedback text-start">
|
|
25
|
+
Please enter a valid email address.
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
28
|
+
<div class="col-md-auto">
|
|
29
|
+
<button type="submit" class="btn btn-adaptive btn-lg px-4">
|
|
30
|
+
<i class="fa-solid fa-paper-plane fa-sm me-2"></i>
|
|
31
|
+
<span class="button-text">{{ args.button.text }}</span>
|
|
32
|
+
</button>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
</form>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
</section>
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Newsletter capture behavior — binds this section's form to the client
|
|
3
|
+
* FormManager (managed states, validation, success/error alerts) and posts
|
|
4
|
+
* the address to the backend's public subscribe endpoint
|
|
5
|
+
* (`POST /omega/marketing/contact` — email validation, reCAPTCHA, rate
|
|
6
|
+
* limiting, provider add server-side). The §7 presence init calls this once
|
|
7
|
+
* per rendered instance with the section's root element, so the binding
|
|
8
|
+
* works on ANY page that composes the band.
|
|
9
|
+
*
|
|
10
|
+
* reCAPTCHA loads lazily on first interaction with the form (not at page
|
|
11
|
+
* load — the band rides most pages and passive visitors shouldn't pay for
|
|
12
|
+
* the Google script). No site key configured → the request still sends;
|
|
13
|
+
* the backend decides.
|
|
14
|
+
*/
|
|
15
|
+
import omega from '@omega.js/client';
|
|
16
|
+
import { WAKEUP_ROUTE } from '@omega.js/client/modules/request.js';
|
|
17
|
+
import { FormManager } from '@omega.js/client/modules/form-manager.js';
|
|
18
|
+
import { initializeRecaptcha, getRecaptchaToken } from '__main_assets__/js/libs/recaptcha.js';
|
|
19
|
+
import { event } from '__main_assets__/js/libs/analytics.js';
|
|
20
|
+
|
|
21
|
+
export default (el) => {
|
|
22
|
+
const $form = el.querySelector('form.newsletter-form');
|
|
23
|
+
if (!$form) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Warm reCAPTCHA on first interaction so the token is ready by submit
|
|
28
|
+
let recaptchaWarmup = null;
|
|
29
|
+
const warmup = () => {
|
|
30
|
+
recaptchaWarmup = recaptchaWarmup || initializeRecaptcha(omega.config?.captcha?.providers?.recaptcha?.siteKey);
|
|
31
|
+
return recaptchaWarmup;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// The backend warms on that same first interaction, and not on load: this
|
|
35
|
+
// band rides most pages, so a passive visitor would ping a function they are
|
|
36
|
+
// never going to POST to. A focus IS the intent, and the submit behind it is
|
|
37
|
+
// `/omega/marketing/contact`
|
|
38
|
+
// ([#644](https://github.com/Omega-JS-Stack/omega/issues/644)).
|
|
39
|
+
$form.addEventListener('focusin', () => {
|
|
40
|
+
omega.request(WAKEUP_ROUTE, { wakeup: true });
|
|
41
|
+
warmup();
|
|
42
|
+
}, { once: true });
|
|
43
|
+
|
|
44
|
+
const formManager = new FormManager($form, {
|
|
45
|
+
allowResubmit: false,
|
|
46
|
+
resetOnSuccess: true,
|
|
47
|
+
submittingText: 'Subscribing...',
|
|
48
|
+
submittedText: 'Subscribed!',
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
formManager.on('submit', async ({ data }) => {
|
|
52
|
+
await warmup();
|
|
53
|
+
const recaptchaToken = await getRecaptchaToken('newsletter_signup');
|
|
54
|
+
|
|
55
|
+
// A thrown error runs FormManager's own catch: it shows the error alert
|
|
56
|
+
// AND restores the ready state so the visitor can retry. Swallowing the
|
|
57
|
+
// error here would let FormManager run its success path (reset +
|
|
58
|
+
// disabled + "Subscribed!") on a failed submit. Single attempt on
|
|
59
|
+
// purpose — reCAPTCHA tokens are single-use, so a retry would resend a
|
|
60
|
+
// consumed token; the restored form IS the retry path.
|
|
61
|
+
try {
|
|
62
|
+
await omega.request('/omega/marketing/contact', {
|
|
63
|
+
method: 'POST',
|
|
64
|
+
auth: false,
|
|
65
|
+
timeout: 15000,
|
|
66
|
+
body: {
|
|
67
|
+
email: data.email,
|
|
68
|
+
source: 'newsletter-cta',
|
|
69
|
+
'g-recaptcha-response': recaptchaToken || '',
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
} catch (e) {
|
|
73
|
+
throw new Error('Something went wrong. Please try again.');
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
trackNewsletterSignup();
|
|
77
|
+
formManager.showSuccess('Thanks for subscribing!');
|
|
78
|
+
});
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
// Tracking (the guarded helper no-ops per provider when its global is absent)
|
|
82
|
+
function trackNewsletterSignup() {
|
|
83
|
+
event('marketing_newsletter_subscribe', {
|
|
84
|
+
method: 'newsletter-cta',
|
|
85
|
+
});
|
|
86
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
description: 'The ink newsletter band — email capture over the classy CTA panel, speaking the client form-manager dialect (data-form-state; its section.js binds the form through the §7 presence init — the reference consumer of the section-JS lane). SHARED band: defaults stay neutral, every page passes its own copy.',
|
|
3
|
+
|
|
4
|
+
args: {
|
|
5
|
+
superheadline: 'object',
|
|
6
|
+
headline: 'string',
|
|
7
|
+
subheadline: 'string',
|
|
8
|
+
button: 'object',
|
|
9
|
+
form: 'object',
|
|
10
|
+
section_class: 'string',
|
|
11
|
+
},
|
|
12
|
+
|
|
13
|
+
defaults: {},
|
|
14
|
+
|
|
15
|
+
// Showcase variants (spec §9) — a SHARED band keeps neutral defaults, so
|
|
16
|
+
// the demo carries its own generic copy.
|
|
17
|
+
demo: [
|
|
18
|
+
{
|
|
19
|
+
label: 'Capture band',
|
|
20
|
+
args: {
|
|
21
|
+
superheadline: { text: 'Newsletter' },
|
|
22
|
+
headline: 'Stay in the loop',
|
|
23
|
+
subheadline: 'One email a month: product updates, guides, and nothing else.',
|
|
24
|
+
button: { text: 'Subscribe' },
|
|
25
|
+
form: { placeholder: 'you@example.com' },
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
{% comment %} The minimal plan band (#493). Every figure comes from the plan
|
|
2
|
+
view-models the layout bridges in — the same `resolved.pricing` /pricing
|
|
3
|
+
renders — so the homepage can never drift from the catalog. The annual view
|
|
4
|
+
shows the resolver's own floored monthly equivalent (#477); nothing here does
|
|
5
|
+
arithmetic. The card vocabulary is /pricing's `omega-price-card`, minus the
|
|
6
|
+
billing-toggle JS hooks (`amount`, `billing-info`): the toggle is a page
|
|
7
|
+
module, and a hook nothing binds is a dead contract. Each CTA is a real link
|
|
8
|
+
for the same reason — the checkout button only works on /pricing. {% endcomment %}
|
|
9
|
+
{% if args.enabled != false and args.plans and args.plans.size > 0 %}
|
|
10
|
+
<section>
|
|
11
|
+
<div class="container" data-omega-reveal-stagger="80">
|
|
12
|
+
<div class="omega-section-head omega-section-head--center mb-5" data-omega-reveal>
|
|
13
|
+
{% component "heading/section-head", superheadline: args.superheadline, headline: args.headline, headline_accent: args.headline_accent, sub: args.subheadline %}
|
|
14
|
+
</div>
|
|
15
|
+
|
|
16
|
+
{% comment %} The row fits the catalog it was given — a brand with two
|
|
17
|
+
tiers gets two wide cards, not two thirds of a row. {% endcomment %}
|
|
18
|
+
{% assign plan_count = args.plans | size %}
|
|
19
|
+
{% if plan_count == 1 %}
|
|
20
|
+
{% assign col_classes = "col-12 col-md-8 col-lg-5" %}
|
|
21
|
+
{% elsif plan_count == 2 %}
|
|
22
|
+
{% assign col_classes = "col-12 col-md-6 col-lg-5" %}
|
|
23
|
+
{% elsif plan_count == 3 %}
|
|
24
|
+
{% assign col_classes = "col-12 col-md-6 col-lg-4" %}
|
|
25
|
+
{% else %}
|
|
26
|
+
{% assign col_classes = "col-12 col-sm-6 col-lg-4 col-xl-3" %}
|
|
27
|
+
{% endif %}
|
|
28
|
+
|
|
29
|
+
<div class="row g-4 justify-content-center">
|
|
30
|
+
{% for plan in args.plans %}
|
|
31
|
+
<div class="{{ col_classes }}" data-omega-reveal>
|
|
32
|
+
<div class="card omega-price-card {% if plan.popular %}omega-price-card--popular{% endif %} h-100">
|
|
33
|
+
{% if plan.popular %}
|
|
34
|
+
<span class="omega-chip omega-chip--ink omega-price-card__popular">Most popular</span>
|
|
35
|
+
{% endif %}
|
|
36
|
+
|
|
37
|
+
<h3 class="card-title omega-price-card__name mb-0">{{ plan.name }}</h3>
|
|
38
|
+
{% iftruthy plan.tagline %}
|
|
39
|
+
<p class="omega-price-card__tagline">{{ plan.tagline }}</p>
|
|
40
|
+
{% endiftruthy %}
|
|
41
|
+
|
|
42
|
+
{% if plan.free %}
|
|
43
|
+
<div class="omega-price-card__price">
|
|
44
|
+
<span class="omega-price-card__amount">Free</span>
|
|
45
|
+
</div>
|
|
46
|
+
{% else %}
|
|
47
|
+
{% if args.annual and plan.prices.annually > 0 %}
|
|
48
|
+
{% assign plan_amount = plan.prices.annuallyPerMonth %}
|
|
49
|
+
{% else %}
|
|
50
|
+
{% assign plan_amount = plan.prices.monthly %}
|
|
51
|
+
{% endif %}
|
|
52
|
+
<div class="omega-price-card__price">
|
|
53
|
+
<span class="omega-price-card__currency">$</span>
|
|
54
|
+
<span class="omega-price-card__amount">{{ plan_amount }}</span>
|
|
55
|
+
<span class="omega-price-card__per">/month</span>
|
|
56
|
+
</div>
|
|
57
|
+
{% endif %}
|
|
58
|
+
|
|
59
|
+
{% comment %} The features, through the SAME component /pricing's
|
|
60
|
+
cards render (#539): the catalog's definitions carry their hover
|
|
61
|
+
explanations here too. The tier note between the two lists reads
|
|
62
|
+
`and:` — the ONE wording, here and on /pricing, because a thing
|
|
63
|
+
never renders differently in two places (Ian 2026-08-24).
|
|
64
|
+
{% endcomment %}
|
|
65
|
+
{% comment %} The composer splits a plan's features into the set
|
|
66
|
+
every plan shares and that plan's extras; a plan hand-authored in
|
|
67
|
+
a page body carries neither, so its whole list is the shared one.
|
|
68
|
+
{% endcomment %}
|
|
69
|
+
{% assign plan_common = plan.commonFeatures %}
|
|
70
|
+
{% if plan.commonFeatures == nil and plan.extraFeatures == nil %}
|
|
71
|
+
{% assign plan_common = plan.features %}
|
|
72
|
+
{% endif %}
|
|
73
|
+
{% if plan_common.size > 0 or plan.extraFeatures.size > 0 %}
|
|
74
|
+
{% component "pricing/features", features: plan_common %}
|
|
75
|
+
|
|
76
|
+
{% if plan.extraFeatures.size > 0 %}
|
|
77
|
+
{% unless forloop.first %}
|
|
78
|
+
{% assign prev_index = forloop.index0 | minus: 1 %}
|
|
79
|
+
{% assign prev_plan = args.plans[prev_index] %}
|
|
80
|
+
<div class="omega-price-card__tier-note">
|
|
81
|
+
Everything in <strong>{{ prev_plan.name }}</strong>, and:
|
|
82
|
+
</div>
|
|
83
|
+
{% endunless %}
|
|
84
|
+
{% component "pricing/features", features: plan.extraFeatures %}
|
|
85
|
+
{% elsif forloop.first == false %}
|
|
86
|
+
{% assign prev_index = forloop.index0 | minus: 1 %}
|
|
87
|
+
{% assign prev_plan = args.plans[prev_index] %}
|
|
88
|
+
<div class="omega-price-card__tier-note">
|
|
89
|
+
Everything in <strong>{{ prev_plan.name }}</strong>
|
|
90
|
+
</div>
|
|
91
|
+
{% endif %}
|
|
92
|
+
{% endif %}
|
|
93
|
+
|
|
94
|
+
<div class="d-grid omega-price-card__cta">
|
|
95
|
+
{% if plan.popular %}
|
|
96
|
+
{% assign plan_btn = "btn-adaptive omega-btn-ring" %}
|
|
97
|
+
{% else %}
|
|
98
|
+
{% assign plan_btn = "btn-outline-adaptive" %}
|
|
99
|
+
{% endif %}
|
|
100
|
+
<a href="{{ plan.url | default: args.href }}" class="btn {{ plan_btn }} fw-semibold omega-hover-nudge">
|
|
101
|
+
{% if plan.trialDays > 0 %}
|
|
102
|
+
Get free trial
|
|
103
|
+
{% else %}
|
|
104
|
+
Get started
|
|
105
|
+
{% endif %}
|
|
106
|
+
<span class="omega-nudge ms-2"><i class="fa-solid fa-arrow-right fa-sm"></i></span>
|
|
107
|
+
</a>
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
</div>
|
|
111
|
+
{% endfor %}
|
|
112
|
+
</div>
|
|
113
|
+
</div>
|
|
114
|
+
</section>
|
|
115
|
+
{% endif %}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
description: 'The minimal plan band — one compact card per subscription plan (name, price, the feature list, one CTA), for a homepage that should say what it costs without sending you to /pricing first. The bullets are /pricing\'s own `pricing/features` component, hover explanations included, and the line introducing a tier\'s extras reads "Everything in <previous>, and:" (#539). Reads the SAME resolved catalog /pricing renders (`resolved.pricing`), so no number here is ever a copy: the layout bridges `plans` and `annual` in. No plans, no band. `enabled: false` removes it (#473 family gate).',
|
|
3
|
+
|
|
4
|
+
args: {
|
|
5
|
+
enabled: 'boolean',
|
|
6
|
+
superheadline: 'string',
|
|
7
|
+
headline: 'string',
|
|
8
|
+
headline_accent: 'string',
|
|
9
|
+
subheadline: 'string',
|
|
10
|
+
plans: 'array', // the composed plan view-models — `resolved.pricing.plans`, never hand-authored numbers
|
|
11
|
+
annual: 'boolean', // show each plan's floored monthly equivalent (#477) instead of its monthly price — `resolved.pricing.billing.annually`
|
|
12
|
+
href: 'string', // where a plan with no url of its own sends you
|
|
13
|
+
},
|
|
14
|
+
|
|
15
|
+
defaults: {
|
|
16
|
+
enabled: true,
|
|
17
|
+
superheadline: 'Pricing',
|
|
18
|
+
headline: 'Simple pricing that',
|
|
19
|
+
headline_accent: 'scales with you',
|
|
20
|
+
// No sub line by default: an ABSENT subheadline renders NOTHING. A band
|
|
21
|
+
// the brand authors inherits no words it never wrote (the demo line lives
|
|
22
|
+
// in the gallery variant below, where sample content belongs).
|
|
23
|
+
subheadline: '',
|
|
24
|
+
// No plan defaults, ever: a plan a brand does not sell is fiction, and the
|
|
25
|
+
// catalog is the one source (C2). An empty list renders no band.
|
|
26
|
+
plans: [],
|
|
27
|
+
annual: false,
|
|
28
|
+
href: '/pricing',
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
// Showcase variants (spec §9): the band is catalog-driven, so the demo
|
|
32
|
+
// bridges plan view-models the way the layout does.
|
|
33
|
+
demo: [
|
|
34
|
+
{
|
|
35
|
+
label: 'Two plans',
|
|
36
|
+
args: {
|
|
37
|
+
subheadline: 'Start free, upgrade when it pays for itself.',
|
|
38
|
+
// commonFeatures/extraFeatures are the composer's own split (the tier
|
|
39
|
+
// note renders from it), and a `definition` is what makes a bullet
|
|
40
|
+
// hoverable — the demo carries both because the layout bridges both.
|
|
41
|
+
plans: [
|
|
42
|
+
{
|
|
43
|
+
id: 'starter',
|
|
44
|
+
name: 'Starter',
|
|
45
|
+
tagline: 'best for getting started',
|
|
46
|
+
free: true,
|
|
47
|
+
url: '/signup',
|
|
48
|
+
commonFeatures: [
|
|
49
|
+
{ id: 'projects', name: 'Projects', value: 3, definition: 'Live projects you can keep at once.' },
|
|
50
|
+
{ id: 'seats', name: 'Seat', value: 1 },
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
id: 'team',
|
|
55
|
+
name: 'Team',
|
|
56
|
+
tagline: 'best for growing teams',
|
|
57
|
+
popular: true,
|
|
58
|
+
trialDays: 14,
|
|
59
|
+
prices: { monthly: 19, annually: 190, annuallyPerMonth: 15 },
|
|
60
|
+
commonFeatures: [
|
|
61
|
+
{ id: 'projects', name: 'Projects', value: 'Unlimited', definition: 'Live projects you can keep at once.' },
|
|
62
|
+
{ id: 'seats', name: 'Seats', value: 10 },
|
|
63
|
+
],
|
|
64
|
+
extraFeatures: [
|
|
65
|
+
{ id: 'support', name: 'Priority support', value: true },
|
|
66
|
+
],
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
}
|