@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,604 @@
|
|
|
1
|
+
# Theming — the OMEGA design system contract
|
|
2
|
+
|
|
3
|
+
> classy v2 (the flagship skin) + the shared machinery every theme and, at C4,
|
|
4
|
+
> every target rides. Visual spec: [docs/web/classy-v2/DIRECTION.md](../web/classy-v2/DIRECTION.md).
|
|
5
|
+
|
|
6
|
+
The one-hex/one-token half of this contract is checkable per edit: the plugin's `omega:brandcheck` skill,
|
|
7
|
+
[agent-plugins/claude/skills/brandcheck/SKILL.md](../../agent-plugins/claude/skills/brandcheck/SKILL.md), and
|
|
8
|
+
its quality hook fires on every stylesheet edit (contrast, focus, and reduced-motion checks ride `omega:accessibility`).
|
|
9
|
+
|
|
10
|
+
## The three layers
|
|
11
|
+
|
|
12
|
+
1. **Tokens** — `packages/web/core/css/tokens/_index.scss` emits the
|
|
13
|
+
`--omega-*` custom-property contract: neutrals (`ground`, `surface`,
|
|
14
|
+
`surface-2`, `ink`, `ink-muted`, `ink-faint`, `line`, `line-strong`), the
|
|
15
|
+
accent family (`accent`, `-hover`, `-active`, `-subtle`, `-ink`, `-ring`),
|
|
16
|
+
status (`ok`/`warn`/`danger`, each with an `-rgb` channel twin — see
|
|
17
|
+
"One status hue site-wide" below), the categorical ramp (`chart-1`…`chart-6` —
|
|
18
|
+
series-1 rides the accent, the rest are CVD-validated muted hues, cool half
|
|
19
|
+
before warm), shadows
|
|
20
|
+
(`shadow-1`/`shadow-2`), shape (`radius-xs/s/m/l/xl`), motion (`speed`,
|
|
21
|
+
`speed-slow`, `speed-first-paint`, `ease`), and the type slots (`font-ui`, `font-serif`,
|
|
22
|
+
`font-mono`, plus the pairing slots `font-marketing` and `font-display`).
|
|
23
|
+
Light + dark values ship together: OS preference carries via
|
|
24
|
+
`@media (prefers-color-scheme: dark)`, and the `data-bs-theme` stamp
|
|
25
|
+
(core/js/core/appearance.js) beats it in both directions. **Names are the
|
|
26
|
+
stable API; values are the skin.**
|
|
27
|
+
2. **Mechanics** — `core/css/shell/_index.scss` (the `.omega-shell` app
|
|
28
|
+
chrome: 264px sidebar / 68px rail / 60px topbar, drawer under 1200px; the
|
|
29
|
+
rail clips nothing — its nav scrolls inside the `__sidebar-scroll` region
|
|
30
|
+
so rail popovers can escape, [#319](https://github.com/Omega-JS-Stack/omega/issues/319);
|
|
31
|
+
main claims the `1fr` row explicitly, so a page that turns the topbar off
|
|
32
|
+
still scrolls inside main instead of handing the scroll back to the
|
|
33
|
+
document, [#741](https://github.com/Omega-JS-Stack/omega/issues/741)),
|
|
34
|
+
`core/css/motion/_index.scss` (below), and `core/css/components/_index.scss`
|
|
35
|
+
(the shared component vocabulary: `omega-chip` and its `--accent`/`--ink`
|
|
36
|
+
modifiers, plus the app-chrome pair the base topbar/sidebar renders —
|
|
37
|
+
`.btn-icon`, the square ghost icon button, and `.omega-search`, the ⌘K field
|
|
38
|
+
with its input and its `kbd` shortcut badge). All three paint exclusively through tokens so a skin restyles
|
|
39
|
+
them without touching structure, and all three emit BEFORE the theme so a
|
|
40
|
+
skin's own rules win. **Promotion rule
|
|
41
|
+
([#242](https://github.com/Omega-JS-Stack/omega/issues/242))**: a component
|
|
42
|
+
the BASE layer renders belongs in the component sheet, never in one theme's
|
|
43
|
+
partials — the icon-CSS ruling (presentation SSOT in the shared sheet).
|
|
44
|
+
Theme-only components (classy's marketing vocabulary) stay in their theme.
|
|
45
|
+
3. **Theme** — `themes/<id>/`, a skin over `themes/base` (the structural
|
|
46
|
+
`omega-*` markup layer every theme chain terminates at; classy is the
|
|
47
|
+
flagship and the default skin). classy v2's `css/base/_root.scss` bridges Bootstrap's CSS
|
|
48
|
+
variables onto the tokens, so every Bootstrap component follows the theme,
|
|
49
|
+
the brand ramp, and consumer overrides with zero recompilation.
|
|
50
|
+
|
|
51
|
+
## The three surface tiers (and which way elevation runs)
|
|
52
|
+
|
|
53
|
+
`--omega-ground` is the page, `--omega-surface` is a card lifted off it, and
|
|
54
|
+
`--omega-surface-2` is the second tier: table heads, chips, code blocks, hover
|
|
55
|
+
fills, receipt panels, segmented tracks. The tiers move in OPPOSITE directions
|
|
56
|
+
per mode, and a component may not assume one of them: dark elevates by getting
|
|
57
|
+
LIGHTER (`#0d0d0e` ground → `#151516` surface → `#1d1d1f` surface-2), light
|
|
58
|
+
elevates with white plus a shadow and recesses by getting DARKER (`#f5f5f4`
|
|
59
|
+
ground → `#ffffff` surface → `#ececeb` surface-2, the well).
|
|
60
|
+
|
|
61
|
+
Light surface-2 shipped at `#f6f6f5`, one point off the ground, so every
|
|
62
|
+
component that painted it directly on the page was invisible in light mode and
|
|
63
|
+
correct in dark ([#152](https://github.com/Omega-JS-Stack/omega/issues/152)).
|
|
64
|
+
The value is now a real well: readable on the ground AND inside a white card,
|
|
65
|
+
still lighter than `--omega-line`. Its Bootstrap twins move with it:
|
|
66
|
+
`$classy-surface-2-light` (compile-time `$body-secondary-bg`) and
|
|
67
|
+
`--bs-secondary-bg-rgb` in classy's root bridge.
|
|
68
|
+
|
|
69
|
+
Two readings of a segmented control are both sanctioned, and both work in both
|
|
70
|
+
modes: a RAISED track (surface + `--omega-line-strong` + `shadow-1`, selected
|
|
71
|
+
segment recessed to surface-2, the billing toggle) or a RECESSED track
|
|
72
|
+
(surface-2 straight on the ground, selected segment raised to white, the
|
|
73
|
+
platform rail).
|
|
74
|
+
|
|
75
|
+
## brand.color → the accent ramps
|
|
76
|
+
|
|
77
|
+
`omega.json5 → brand.color` is an optional hex string (`#RGB` / `#RRGGBB`,
|
|
78
|
+
schema-validated since [#272](https://github.com/Omega-JS-Stack/omega/issues/272);
|
|
79
|
+
unset leaves the token sheet's neutral placeholder standing) and it drives
|
|
80
|
+
`composeBrandTokens()` (`packages/web/src/brand-tokens.js`): a light ramp plus a **dark-mode variant**
|
|
81
|
+
(darker brands lift into a legible lightness band for the charcoal ground;
|
|
82
|
+
already-light brands pass through). `core/_includes/core/head.html` emits both
|
|
83
|
+
as inline `:root` blocks AFTER the css bundles — same three-stamp plumbing as
|
|
84
|
+
the token sheet — so the ramp wins the cascade everywhere, including
|
|
85
|
+
`.btn-primary`, links, focus rings, `.form-check-input:checked`,
|
|
86
|
+
`.progress-bar`, and `.text-primary`/`.bg-primary` (classy re-points those at
|
|
87
|
+
the tokens).
|
|
88
|
+
|
|
89
|
+
## Consumer customization (tier 1 — main.scss)
|
|
90
|
+
|
|
91
|
+
- **Discovery**: `omega customize --list` prints the layered override map —
|
|
92
|
+
every shadowable file (sections, includes, css, pages), its owning layer
|
|
93
|
+
(framework / `theme:<id>` / consumer), and whether you already shadow it.
|
|
94
|
+
`omega customize <path>` materializes ONE of them at that path with a
|
|
95
|
+
provenance header; reading the theme source tree to guess a path is over.
|
|
96
|
+
The css lane lists only what sass actually layers by — `main.scss` and the
|
|
97
|
+
page sheets — because a bare relative `@use`/`@import` inside a theme sheet
|
|
98
|
+
resolves against the importing file, so a consumer copy of a partial would
|
|
99
|
+
never load.
|
|
100
|
+
- **Recolor**: set `brand.color` in omega.json5. No CSS.
|
|
101
|
+
- **Sass knobs**: every variable in `themes/classy/_config.scss` is `!default`
|
|
102
|
+
— `@use 'omega:main' with ($primary: …, $font-family-sans-serif: …,
|
|
103
|
+
$border-radius: …)` from the consumer main.scss.
|
|
104
|
+
- **Token overrides**: redefine any `--omega-*` property in `:root` /
|
|
105
|
+
`[data-bs-theme='dark']` for surgical re-vibing (grays, radii, speeds,
|
|
106
|
+
shadows, type).
|
|
107
|
+
- **Type presets**: stamp `data-omega-type="sans|serif|mono"` on `<html>`
|
|
108
|
+
(via `theme.html.attributes`) or re-point `--omega-font-marketing`
|
|
109
|
+
/ `--omega-font-display` directly. Default is the mix pairing — serif
|
|
110
|
+
marketing display over sans UI.
|
|
111
|
+
- **Fonts (D5, shipped)**: classy vendors **Inter** (UI grotesk) and
|
|
112
|
+
**Newsreader** (marketing serif); newsflash vendors **Schibsted Grotesk**
|
|
113
|
+
and **Fraunces** the same way (cp187 — its Google Fonts CDN link is dead) —
|
|
114
|
+
variable woff2, latin + latin-ext, OFL —
|
|
115
|
+
in `themes/<theme>/fonts/`; the asset pipeline copies every layer's `fonts/`
|
|
116
|
+
dir to `/assets/fonts` (first layer wins, and a consumer-local theme is
|
|
117
|
+
followed by the packaged theme it SHADOWS — inheriting that skin's sheet
|
|
118
|
+
through the hatch inherits the files its `@font-face` rules point at,
|
|
119
|
+
[#773](https://github.com/Omega-JS-Stack/omega/issues/773)), `css/base/_fonts.scss` carries
|
|
120
|
+
the `@font-face` blocks (`font-display: swap`), and `css/base/_root.scss`
|
|
121
|
+
re-points `--omega-font-ui` / `--omega-font-serif` at them. The core token
|
|
122
|
+
sheet keeps system stacks as the framework default AND the fallback tail —
|
|
123
|
+
swapping faces stays a values-only change (two custom properties + the
|
|
124
|
+
files). Ordering note: core main.scss MUST load the token sheet before the
|
|
125
|
+
theme `@forward` (Sass emits a module's CSS at its first load), or theme
|
|
126
|
+
token overrides lose the cascade. The head PRELOADS the first-paint faces,
|
|
127
|
+
and the list is read off those `@font-face` rules in the compiled sheet
|
|
128
|
+
([#765](https://github.com/Omega-JS-Stack/omega/issues/765)) — a face with no
|
|
129
|
+
`unicode-range`, or one whose range reaches basic latin (U+0000-00FF), is a
|
|
130
|
+
first-paint face; the `-latin-ext` subsets stay out. So a theme naming its
|
|
131
|
+
files its own way, or vendoring ONE variable face, preloads correctly with
|
|
132
|
+
nothing to declare: the declaration IS the `@font-face`
|
|
133
|
+
([docs/web/index.md](../web/index.md)).
|
|
134
|
+
And the face that paints BEFORE it lands is metric-matched
|
|
135
|
+
([#768](https://github.com/Omega-JS-Stack/omega/issues/768)): the css lane
|
|
136
|
+
measures each vendored family's own font file, measures the system family the
|
|
137
|
+
theme's stack already names next, and generates
|
|
138
|
+
`@font-face { font-family: '<Family> Fallback'; src: local('<system family>'), ...;
|
|
139
|
+
size-adjust; ascent-override; descent-override; line-gap-override }` (one
|
|
140
|
+
`local()` per measured family the stack names, so the face resolves on macOS
|
|
141
|
+
and Windows alike; the overrides follow the first), then
|
|
142
|
+
names that face right after the web family in the `--omega-font-*` stack. The
|
|
143
|
+
system font occupies the same lines the webfont will, so `font-display: swap`
|
|
144
|
+
moves nothing (classy: Inter over `Helvetica Neue` at size-adjust 105.508%,
|
|
145
|
+
Newsreader over `georgia` at 91.224%). A theme gets this for FREE: the
|
|
146
|
+
transform reads the compiled sheet, so a theme's own faces and its own stacks
|
|
147
|
+
are all it has to declare, and no scss file names a fallback family. What a
|
|
148
|
+
theme owes is the tail: a stack that reaches none of the measured system
|
|
149
|
+
families (Arial, Helvetica, Helvetica Neue, Georgia, Times New Roman,
|
|
150
|
+
Verdana) gets no fallback face and one build warning naming the family.
|
|
151
|
+
|
|
152
|
+
Tier 2 stays: fork `themes/_template` for a full theme; `themes/base` remains
|
|
153
|
+
the fall-through layer for anything the theme doesn't cover, and base's
|
|
154
|
+
`_theme.scss` forwards classy's theme as the default skin css. The tier is
|
|
155
|
+
PROVEN in a real build by the brand-shape corpus's `shape-theme-override` cell
|
|
156
|
+
([#773](https://github.com/Omega-JS-Stack/omega/issues/773)): a consumer-local
|
|
157
|
+
theme shadows the packaged one of the same id, and every file kind the cascade
|
|
158
|
+
resolves — layout, include, the scss entry, a section's html, its own section
|
|
159
|
+
js, and a lane left to the chain with `inherit: ['js']` — is read back out of
|
|
160
|
+
`dist/` ([testing.md](testing.md)).
|
|
161
|
+
|
|
162
|
+
### CSS fall-through — the two lanes (cp190, closes the audit's asymmetry)
|
|
163
|
+
|
|
164
|
+
Layouts/includes fall through per-file, but a theme's `_theme.scss` never
|
|
165
|
+
did — a non-classy theme rendered the shared `omega-*` vocabulary
|
|
166
|
+
unstyled on fall-through pages. Two blessed lanes now cover it, both
|
|
167
|
+
proven:
|
|
168
|
+
|
|
169
|
+
- **Partial/consumer themes** (no Bootstrap of their own): put
|
|
170
|
+
`@forward 'omega:theme';` at the top of the theme's `_theme.scss` — the
|
|
171
|
+
importer resolves through the layer roots and SELF-SKIPS the requesting
|
|
172
|
+
file, so the forward lands on base's `_theme.scss` (a bridge forwarding
|
|
173
|
+
classy's theme as the default skin css) and emits classy's whole
|
|
174
|
+
chain (Bootstrap included, configured through the forward); the theme's
|
|
175
|
+
own rules land after and win the cascade. Pinned in
|
|
176
|
+
`test/themes.test.js` ("inheritance hatch").
|
|
177
|
+
- **Full sibling themes** (own Bootstrap config — newsflash): do NOT
|
|
178
|
+
inherit wholesale (two Bootstraps); import classy's app/auth partials
|
|
179
|
+
directly as the vocabulary FLOOR — they are deliberately TOKEN-PURE
|
|
180
|
+
(zero Sass config coupling), so they paint through the importing theme's
|
|
181
|
+
token re-values. The set: `layout/shell` (+ `.page-header`),
|
|
182
|
+
`layout/footer` (the shared footer include speaks `omega-footer`
|
|
183
|
+
vocabulary on every page — the floor supplies structure, the theme
|
|
184
|
+
re-inks it), `app/panels` (table/statgrid/iconbtn/count), `pages/auth`,
|
|
185
|
+
`components/receipt`, `components/badges` (dot-status; the chip left for the
|
|
186
|
+
core component sheet in #242, so every theme gets it with no floor at all). Import
|
|
187
|
+
EARLY (the floor sits UNDER the theme's voice, so later theme rules win
|
|
188
|
+
collisions like classy's `.badge` base). Live models:
|
|
189
|
+
`themes/newsflash/_theme.scss`, `themes/neobrutalism/_theme.scss`.
|
|
190
|
+
NOT in the floor and never needed there: `components/buttons` and
|
|
191
|
+
`components/forms` are Sass-config coupled, so the two app-chrome pieces they
|
|
192
|
+
used to hide — `.btn-icon` and `.omega-search` — moved to the core component
|
|
193
|
+
sheet in [#303](https://github.com/Omega-JS-Stack/omega/issues/303). A sibling
|
|
194
|
+
theme that skipped them rendered a native UA button box beside the breadcrumb
|
|
195
|
+
and a native search field with reboot's inverted `kbd` (a solid cream slab on
|
|
196
|
+
a dark skin). Anything else a base surface renders takes the same route: the
|
|
197
|
+
core sheet, never a widened floor.
|
|
198
|
+
|
|
199
|
+
**The guard ([#98](https://github.com/Omega-JS-Stack/omega/issues/98))**: the web
|
|
200
|
+
asset lane reads the COMPILED main bundle for three sentinels the two lanes both
|
|
201
|
+
guarantee — `.omega-auth`, `.omega-statgrid`, `.omega-footer`, one per
|
|
202
|
+
fall-through surface (the other floor partials ride along unsentineled) — and a
|
|
203
|
+
non-classy theme missing ANY of them gets one loud build WARNING (never a failure)
|
|
204
|
+
naming the theme, the missing piece (hatch vs floor — decided by whether the
|
|
205
|
+
bundle defines `--bs-body-bg`, i.e. whether the theme ships its own Bootstrap),
|
|
206
|
+
and the exact line to add. `packages/web/src/theme-vocabulary.js`; every bundled
|
|
207
|
+
theme is silent, pinned in `test/themes.test.js` ("fall-through guard").
|
|
208
|
+
|
|
209
|
+
Rule for classy authors: app/auth vocabulary partials MUST stay token-pure
|
|
210
|
+
— a Sass config dependency there breaks every sibling theme's floor.
|
|
211
|
+
|
|
212
|
+
## Content-page vocabulary (default pages + blueprints)
|
|
213
|
+
|
|
214
|
+
Every classy frontend default page composes from one shared set
|
|
215
|
+
(`themes/classy/css/marketing/_content.scss` + the existing section/bento
|
|
216
|
+
vocab): `omega-page-hero` (+ `omega-display--page`) opener, `omega-prose`
|
|
217
|
+
long-form (blog posts, legal md, bios), `omega-timeline`, `omega-post-card`
|
|
218
|
+
(the ONE blog card — `_includes/frontend/components/post-card.html`, shared
|
|
219
|
+
by index/related/category/tag grids), `omega-person`, `omega-facts`
|
|
220
|
+
(hairline-divided columns; `__value--num` serif numerals, `__sub` footnote),
|
|
221
|
+
`omega-chip-cloud`, `omega-blog-search`, and token-driven `.pagination`.
|
|
222
|
+
Consumer frontmatter keys are unchanged — pages re-rendered, data contracts
|
|
223
|
+
kept.
|
|
224
|
+
|
|
225
|
+
**Compositional set (cp147 — pages are COMPOSED, not centered)**:
|
|
226
|
+
`omega-hero-split` (asymmetric opener: statement + side rail),
|
|
227
|
+
`omega-duo` (label/head column + body column, sticky aside; column split
|
|
228
|
+
overridable via `--omega-duo-cols`), `omega-statement` (editorial letter
|
|
229
|
+
text — big serif with italic `<em>`), `omega-numbered` (principles list
|
|
230
|
+
with serif italic indices), `omega-channel` (contact/support rows),
|
|
231
|
+
`omega-band` (one wide hairline row — enterprise, platform strips),
|
|
232
|
+
`omega-form-panel` (the hairline container every long form sits in), and
|
|
233
|
+
the `.omega-quiet` fine-print voice.
|
|
234
|
+
|
|
235
|
+
**Post media + author contracts** (post-card AND the post page honor them):
|
|
236
|
+
`post.image: false` → designed no-media panel (serif italic category
|
|
237
|
+
monogram on dotgrid), never a 404 `<img>`; `post.image: "<path>"` → that
|
|
238
|
+
image lazy-loaded; absent → the legacy `/assets/images/blog/post-<id>/`
|
|
239
|
+
convention. An author that resolves to no team member renders a neutral
|
|
240
|
+
pen-nib mark + the brand name (no broken avatar rows).
|
|
241
|
+
|
|
242
|
+
**Footer pattern** (`frontend/sections/footer.html` + `css/layout/_footer.scss`,
|
|
243
|
+
draft-2): brand block (lockup + one-liner + social icon row) beside auto-fit
|
|
244
|
+
link columns; ONE hairline base row where copyright, legal links, the
|
|
245
|
+
language dropup pill, and the segmented appearance control all share the
|
|
246
|
+
same 1.75rem scale. The appearance segments are plain `data-appearance-set`
|
|
247
|
+
buttons — core appearance.js stamps `.active`/`aria-pressed`. The brand
|
|
248
|
+
lockup class (`.omega-nav__brand`) is root-scoped and shared by nav +
|
|
249
|
+
footer.
|
|
250
|
+
|
|
251
|
+
**Per-page theme css slot**: `themes/<theme>/css/pages/<page>/index.scss`
|
|
252
|
+
compiles to its own bundle and loads after main css AND core's page sheet — one
|
|
253
|
+
rule, every layer's sheet in layer order ([#624](https://github.com/Omega-JS-Stack/omega/issues/624)). That's where a theme outranks core page
|
|
254
|
+
rules; classy's `status` and `feedback` entries repaint the JS-toggled `bg-*`
|
|
255
|
+
state classes (a class contract — never rename them) into the hairline
|
|
256
|
+
language there.
|
|
257
|
+
|
|
258
|
+
## App panels (App DNA — dashboard/admin content)
|
|
259
|
+
|
|
260
|
+
`themes/classy/css/app/_panels.scss`: `omega-statgrid` (the DIRECTION
|
|
261
|
+
merged stat card — ONE card, hairline column dividers, micro-label +
|
|
262
|
+
tabular value + delta chip per cell; it sizes off ITS OWN width, never the
|
|
263
|
+
viewport — `--omega-statgrid-cols` sets the column CEILING and cells reflow
|
|
264
|
+
below a 10rem floor, so a statgrid nested in a half-width card wraps instead
|
|
265
|
+
of overflowing), `omega-panel-title` (the 14/650 card-title voice), and
|
|
266
|
+
`omega-activity` (hairline-divided feed rows with neutral icon chips).
|
|
267
|
+
The backend dashboard layout and the admin dashboard/users blueprints
|
|
268
|
+
render on these; every JS-populated id (`stat-*`, tables, charts) is a
|
|
269
|
+
contract and stays.
|
|
270
|
+
|
|
271
|
+
## Categorical tones + the interactive affordance (#72)
|
|
272
|
+
|
|
273
|
+
Two shared utility sets in `core/css` — core, not classy, so every theme
|
|
274
|
+
inherits them:
|
|
275
|
+
|
|
276
|
+
- **Tones** (`core/css/core/_tones.scss`): `.omega-tone-1`…`.omega-tone-6` set
|
|
277
|
+
`--omega-tone` to the matching `--omega-chart-*` slot, and
|
|
278
|
+
`.omega-badge-tone` paints a chip with it (`color-mix` tint, no
|
|
279
|
+
uppercasing — a tone label is an identifier, not a word). ONE ramp for two
|
|
280
|
+
surfaces: a chart series and the badge naming the same thing are the same
|
|
281
|
+
color. Which name falls in which slot is the page's business. The sheet
|
|
282
|
+
loads after the theme forward, so it outranks a theme's own chip rules.
|
|
283
|
+
- **`.omega-interactive`** (`core/css/motion/_index.scss`): the whole-surface
|
|
284
|
+
click affordance — the surface warms on hover AND `:focus-visible`, an
|
|
285
|
+
accent ring on focus, an accent-subtle tint on press. `--lift` adds the
|
|
286
|
+
card lift (2px up, shadow-2) that presses back down; a row takes the base
|
|
287
|
+
class alone. `prefers-reduced-motion` drops the transition and the lift, and
|
|
288
|
+
classy drops the lift outright (see "classy never raises on hover" below).
|
|
289
|
+
|
|
290
|
+
Charts read the same ramp: `core/js/libs/charts.js` (`chartColors()`) resolves
|
|
291
|
+
`--omega-chart-1…6` off `:root` and hands them to the chart definition as its
|
|
292
|
+
theme palette, so a chart follows the brand ramp and dark mode without knowing
|
|
293
|
+
either exists. A surface that means a STATUS passes the
|
|
294
|
+
status tokens explicitly instead (`colors: ['var(--omega-ok)', …]` — the
|
|
295
|
+
helper's `resolveColor` reads them off the live sheet); the admin dashboard's
|
|
296
|
+
plan doughnut is the reference case ([#74](https://github.com/Omega-JS-Stack/omega/issues/74)).
|
|
297
|
+
|
|
298
|
+
Graphs read the same ramp again: `core/js/libs/graph.js` (`graphTheme()`) maps
|
|
299
|
+
`--omega-chart-1…6` onto mermaid's per-item slots (`cScale0…5` and `pie1…6`),
|
|
300
|
+
and the rest of a diagram off `--omega-ink`, `--omega-surface`/`--omega-surface-2`,
|
|
301
|
+
`--omega-line` and `--omega-accent` — the accent is the node outline, the one
|
|
302
|
+
place the brand color lands in a diagram
|
|
303
|
+
([#169](https://github.com/Omega-JS-Stack/omega/issues/169)). Mermaid paints
|
|
304
|
+
with literal colors, so every token is resolved before it is handed over, and
|
|
305
|
+
the read happens at draw time: like charts, a light/dark flip lands on the next
|
|
306
|
+
redraw and nothing listens for it.
|
|
307
|
+
|
|
308
|
+
## One status hue site-wide
|
|
309
|
+
|
|
310
|
+
`--omega-ok` / `--omega-warn` / `--omega-danger` are the ONLY greens, ambers
|
|
311
|
+
and reds on a site. Each ships with an `-rgb` channel twin (`--omega-ok-rgb:
|
|
312
|
+
18, 146, 92`) because Bootstrap's translucency utilities paint from
|
|
313
|
+
`rgba(var(--bs-success-rgb), …)`, which no `var()` can feed a hex to. Every
|
|
314
|
+
theme's root bridge points `--bs-success`/`-warning`/`-danger` and their `-rgb`
|
|
315
|
+
companions at the tokens, AFTER Bootstrap compiles, so `bg-success`,
|
|
316
|
+
`.text-success` and a token-painted glyph are the same color in both modes —
|
|
317
|
+
the /status page's "all systems operational" and the uptime bars beneath it
|
|
318
|
+
were two different greens in dark mode until this landed
|
|
319
|
+
([#13](https://github.com/Omega-JS-Stack/omega/issues/13)).
|
|
320
|
+
|
|
321
|
+
Affirmation ticks ride that same bridge: every "you get this" check (plan
|
|
322
|
+
features, benefit lists, hero meta, comparison "yes" cells, signup benefits)
|
|
323
|
+
wears Bootstrap's `.text-success` on the icon or its wrapper, and nothing else.
|
|
324
|
+
There is no framework class for it: the `.omega-check`/`--omega-check` seam
|
|
325
|
+
was deleted (Ian's ruling 2026-07-31, #44) because it computed exactly
|
|
326
|
+
`.text-success`: a concept Bootstrap already names is expressed through
|
|
327
|
+
Bootstrap's hook, and `omega-*` is only for concepts Bootstrap has no name for.
|
|
328
|
+
A call site NEVER paints a check its own color (#11's call-site rule stands).
|
|
329
|
+
|
|
330
|
+
**A theme that re-values a status hue MUST re-value its `-rgb` twin** (only
|
|
331
|
+
newsflash does today) or the two drift apart again. `test/tokens.test.js` pins
|
|
332
|
+
both halves: the twins exist in every stamp, and the bridge is the LAST
|
|
333
|
+
`--bs-success` in every theme's compiled css.
|
|
334
|
+
|
|
335
|
+
## Motion library
|
|
336
|
+
|
|
337
|
+
CSS: `core/css/motion/_index.scss`. Engine: `@omega.js/client/modules/motion.js`
|
|
338
|
+
(`createMotion()`), started by `core/js/first-paint.js` and registered on the
|
|
339
|
+
omega library by `core/js/core/motion.js` — shared with desktop/extension at C4
|
|
340
|
+
exactly like icon-renderer.
|
|
341
|
+
|
|
342
|
+
| Surface | Use |
|
|
343
|
+
|---|---|
|
|
344
|
+
| `data-omega-reveal="up\|fade\|left\|right\|scale"` | reveal once on scroll-in |
|
|
345
|
+
| `data-omega-reveal-stagger="60"` (parent) | staggers child reveals (ms step) |
|
|
346
|
+
| `data-omega-first-paint` (band) | the band IS the first viewport: its reveals are started at PARSE time by head.html's inline starter (no fetch), and a rotator inside it opens on its first word (css) |
|
|
347
|
+
| `data-omega-countup` | counts to the number already in the markup |
|
|
348
|
+
| `data-omega-rotate="2600"` | children cycle (hero word rotator, quotes) |
|
|
349
|
+
| `data-omega-marquee` + `.omega-marquee__track/__item` | seamless loop — the set is cloned until half the track covers the container (never runs dry), constant px/s (attr value overrides); clones are `aria-hidden` with focusables detabbed (`tabindex=-1`, still mouse-clickable) so interactive sets (newsflash ticker headlines) stay accessible |
|
|
350
|
+
| `data-omega-scroll-watch="24"` | stamps `data-omega-scrolled` (glassy nav) |
|
|
351
|
+
| `data-omega-segmented` | gliding-thumb segmented control: engine injects `.omega-segmented__thumb` and tracks the checked/`.active` segment (billing toggle, platform rails, footer appearance) |
|
|
352
|
+
| `data-omega-dotfield="22"` | canvas dot grid (value = px spacing): slow traveling wave, dots tint along ONE drifting rainbow gradient, pointer glow (tracked window-level so the fixed nav can't blind it); the loop starts only once first paint has settled and repaints at 30fps (below), reduced motion gets ONE still grid, and static CSS dots remain for no-JS |
|
|
353
|
+
| `.omega-hover-lift/-raise/-dim`, `.omega-pressable`, `.omega-hover-nudge .omega-nudge` | pure-CSS hover/press effects |
|
|
354
|
+
| `.omega-interactive` (+ `--lift`) | whole-surface click affordance: warm on hover/focus-visible, ring on focus, tint on press |
|
|
355
|
+
| `.omega-float`, `.omega-caret` | ambient float, terminal caret |
|
|
356
|
+
|
|
357
|
+
Resilience rules (load-bearing):
|
|
358
|
+
|
|
359
|
+
- Reveal styles only hide content under the inline `html[data-omega-motion]`
|
|
360
|
+
stamp (head.html) — **no JS means a fully visible page**.
|
|
361
|
+
- **A reveal never waits for the big bundle**
|
|
362
|
+
([#585](https://github.com/Omega-JS-Stack/omega/issues/585)). The stamp lands
|
|
363
|
+
before first paint, so a hidden reveal that waited on the engine's
|
|
364
|
+
IntersectionObserver was blank text for the whole JS download on a cold cache
|
|
365
|
+
— LCP measured on an empty band. The cause was never the animation but WHERE
|
|
366
|
+
the starter lived: `core/js/main.js`, behind firebase/auth/analytics init. The
|
|
367
|
+
fix is `core/js/first-paint.js` — its own asset entry, loaded from `head.html`
|
|
368
|
+
as a deferred `type="module"` script, so it runs the moment the DOM is parsed:
|
|
369
|
+
ahead of the main bundle's module in the foot, and independent of images,
|
|
370
|
+
fonts and firebase. Same engine, same CSS transition, same feel; it just
|
|
371
|
+
starts when the DOM is ready instead of when the app is.
|
|
372
|
+
- **The band in the FIRST viewport starts its reveals at PARSE time**
|
|
373
|
+
([#763](https://github.com/Omega-JS-Stack/omega/issues/763), Ian's ruling
|
|
374
|
+
2026-09-02). Booting the engine early made the gate cheap, not free: the
|
|
375
|
+
reveal lane is a SCROLL lane, and the opening band is never scrolled to.
|
|
376
|
+
Holding it at opacity 0 until the observer fires cost the playground homepage
|
|
377
|
+
~2.0s of a 2,588ms mobile LCP, measured on `p.omega-hero__sub`
|
|
378
|
+
([#749](https://github.com/Omega-JS-Stack/omega/issues/749)). #749 answered
|
|
379
|
+
that by taking the hero copy out of the lane entirely; the above-the-fold fade
|
|
380
|
+
is part of the design, so the attributes came back and the ATTRIBUTE changed
|
|
381
|
+
meaning instead. A band that declares `data-omega-first-paint` is run by an
|
|
382
|
+
inline starter in `head.html`, right after the motion stamp: a plain script,
|
|
383
|
+
no module and no fetch. A MutationObserver on `document.documentElement`
|
|
384
|
+
collects the reveals in each batch of added nodes, and **the guard is per
|
|
385
|
+
ELEMENT, never per band** — the parser hands a band over at its OPEN tag, when
|
|
386
|
+
it holds no copy yet, so a band-level "handled" flag stamps nothing and leaves
|
|
387
|
+
the work to `DOMContentLoaded`, which waits for the deferred bundles: the very
|
|
388
|
+
wait this removes. Each batch coalesces TWO animation frames — the first
|
|
389
|
+
paints what was collected at opacity 0, which is the transition's starting
|
|
390
|
+
state, the second stamps it — then re-applies the stagger across the whole
|
|
391
|
+
container (`--omega-reveal-delay` per child, same 60ms default; parse order is
|
|
392
|
+
document order, so an index never changes and re-setting a value restarts
|
|
393
|
+
nothing) and sets `data-omega-inview`. `DOMContentLoaded` disconnects the
|
|
394
|
+
observer after one last pass, as a backstop. The engine's `observeReveal`
|
|
395
|
+
returns early on a stamped element, so its later boot changes nothing inside
|
|
396
|
+
the band, and the starter needs no reduced-motion guard of its own: the reveal
|
|
397
|
+
lane hides only under `(prefers-reduced-motion: no-preference)`, so a visitor
|
|
398
|
+
who asked for less motion gets the final state either way, JS or no JS.
|
|
399
|
+
**The inline critical block has to carry the reveal lane** for any of that to
|
|
400
|
+
be visible: every reveal rule is scoped `html[data-omega-motion] …`, a token
|
|
401
|
+
no markup scan can see, so PurgeCSS purged the lane out of the block and a
|
|
402
|
+
built page painted its copy VISIBLE, stamped it, and met the deferred sheet
|
|
403
|
+
with the element already resolved — no fade at all. The critical extractor
|
|
404
|
+
safelists that one lane (`src/assets.js`, ~1.1 KB), pinned by
|
|
405
|
+
`test/critical-css.test.js`. So the marketing
|
|
406
|
+
hero's copy stack (badge, headline, sub, CTAs, meta, frame) is back on the
|
|
407
|
+
lane behind its `data-omega-reveal-stagger="40"` container, and so is any
|
|
408
|
+
markup the template never sees (an authored `demo_html` slot, a custom hero
|
|
409
|
+
animation folder). The headline's word rotator is the one above-the-fold gate
|
|
410
|
+
the starter does NOT resolve — the engine owns the cycle — so its css rule
|
|
411
|
+
stays: inside a first-paint band the FIRST word paints with the document and
|
|
412
|
+
yields the moment the engine stamps `data-omega-active`, which it does on that
|
|
413
|
+
same child. Below-the-fold bands keep the one lane, untouched.
|
|
414
|
+
|
|
415
|
+
**A first-paint band fades on its own, shorter token.** Chrome reports the
|
|
416
|
+
largest element painted only when its fade ENDS, so the first viewport's
|
|
417
|
+
transition and the stagger ahead of it land on LCP in full; the proof on the
|
|
418
|
+
playground home (mobile, slow 4G) put the 550ms reveal behind a 90ms stagger
|
|
419
|
+
750ms past first paint. `motion/_index.scss` therefore times
|
|
420
|
+
`[data-omega-first-paint] [data-omega-reveal]` with `--omega-speed-first-paint`
|
|
421
|
+
(300ms in core) and the hero's stagger is 40ms a step: the same fade, the same
|
|
422
|
+
lane, 400ms past first paint. Below the fold nothing changed, because no
|
|
423
|
+
metric watches a scroll-in reveal. A theme re-times the first viewport by
|
|
424
|
+
setting the token, exactly as it sets `--omega-speed-slow` for the rest.
|
|
425
|
+
|
|
426
|
+
**Every first-viewport band declares the attribute, not just the hero**
|
|
427
|
+
([#467](https://github.com/Omega-JS-Stack/omega/issues/467) Phase 2). The
|
|
428
|
+
five the #749 worker found still gated took the identical treatment:
|
|
429
|
+
`about/hero` (both its layouts, photo-lead and split), the document masthead
|
|
430
|
+
in `_layouts/frontend/core/minimal.html`, and the opening bands of
|
|
431
|
+
`download.html`, `contact.html` and `pricing.html`. Four of them compose
|
|
432
|
+
their copy through the shared `heading/masthead` component, which emits the
|
|
433
|
+
reveal attributes itself, so the component takes a `first_paint: true`
|
|
434
|
+
switch rather than losing them. The follow-up pass then walked the REST of
|
|
435
|
+
that component's callers, and every one of them proved to be its page's
|
|
436
|
+
opening band too: `status.html`, `feedback.html`, `blog/index.html` and the
|
|
437
|
+
four blog taxonomy layouts, `team/index.html`, `legal/document.html` (whose
|
|
438
|
+
band wears `omega-legal__head`, not a dotgrid), `alternatives/index.html`
|
|
439
|
+
and `alternatives/alternative.html`, the three `collection/` layouts,
|
|
440
|
+
`extension/index.html` and `updates/index.html`. The switch stays on the
|
|
441
|
+
component because a MID-page caller (a consumer's own composition, the
|
|
442
|
+
component gallery) still belongs on the reveal lane. Those masthead clusters
|
|
443
|
+
therefore carry no reveal attributes at all, which #763 left exactly as it
|
|
444
|
+
found them: the starter animates whatever a first-paint band carries, and
|
|
445
|
+
these bands carry nothing. Below the fold on every one of these pages,
|
|
446
|
+
nothing changed. Pinned by
|
|
447
|
+
`packages/web/test/first-paint-bands.test.js`.
|
|
448
|
+
- **The first-paint script is the one early seam, and it stays small.** Anything
|
|
449
|
+
that must beat the big bundle belongs there (brand custom hero animations,
|
|
450
|
+
[#441](https://github.com/Omega-JS-Stack/omega/issues/441), ride the same
|
|
451
|
+
engine and get the same early start) — weighed against that budget. It must
|
|
452
|
+
never import `@omega.js/client`: the singleton drags the whole runtime into
|
|
453
|
+
the bundle and rebuilds the very problem it exists to solve. The motion
|
|
454
|
+
module's subpath is standalone by design, and `core/js/core/motion.js` adopts
|
|
455
|
+
the running instance rather than starting a second one.
|
|
456
|
+
- **One lane, not two** (Ian's ruling 2026-08-26). An earlier round answered
|
|
457
|
+
#585 with a second, pure-CSS entrance lane (paint-time keyframes, a 120ms
|
|
458
|
+
lead-in, an `:nth-child` stagger cap, a 1s auto-resolve net, `will-change`
|
|
459
|
+
staging). It put the text on screen but at a different rhythm and a different
|
|
460
|
+
start moment than the reveal everywhere else — a visibly worse animation. It
|
|
461
|
+
is deleted: no `omega-reveal-in` keyframe, no `--omega-reveal-wait`, no
|
|
462
|
+
`html[data-omega-motion-ready]` gate, no `data-omega-reveal-lead` hook. A
|
|
463
|
+
band's stagger is again the engine's job alone, from the one number its author
|
|
464
|
+
writes on the cluster (`data-omega-reveal-stagger="70"` → `--omega-reveal-delay`
|
|
465
|
+
per child).
|
|
466
|
+
- **Ambient motion waits for first paint; a mutation never reads geometry
|
|
467
|
+
behind itself** ([#752](https://github.com/Omega-JS-Stack/omega/issues/752)).
|
|
468
|
+
The homepage hero carries `data-omega-dotfield`, and the engine used to start
|
|
469
|
+
its loop the moment it scanned: a full canvas grid repainted on every one of
|
|
470
|
+
the display's frames, on the page's own thread, through the whole LCP window.
|
|
471
|
+
The rules below answer it, and they are the pattern for anything ambient
|
|
472
|
+
this engine grows next:
|
|
473
|
+
- **The settle signal.** No measure, no style read and no paint until the
|
|
474
|
+
first `requestIdleCallback` AFTER the load event (a 2s timeout, so a
|
|
475
|
+
permanently busy page still gets its field), or the load event itself where
|
|
476
|
+
idle callbacks do not exist. The `whenSettled(doc, fn)` helper in
|
|
477
|
+
`motion.js` is the one implementation.
|
|
478
|
+
- **The handoff stamp rides the first painted grid.** classy fades its CSS
|
|
479
|
+
fallback dots out on `.omega-dotgrid[data-omega-dotfield-ready]::before`,
|
|
480
|
+
so `data-omega-dotfield-ready` lands with the grid that replaces them and
|
|
481
|
+
never at scan: stamped early it left the hero backdrop blank for the whole
|
|
482
|
+
wait. The engine keeps its own re-entry set, so a rescan before the stamp
|
|
483
|
+
exists still installs exactly one field.
|
|
484
|
+
- **A capped cadence.** The field then repaints at 30fps, not at whatever the
|
|
485
|
+
display offers: the wave crawls (~900px crest, a 20s rainbow cycle), so 30
|
|
486
|
+
reads exactly like 60 and costs half the main thread, and a 120Hz display
|
|
487
|
+
pays the same 30, not double. The pointer trail still eases on every frame
|
|
488
|
+
(cheap), so its feel is unchanged. Under `prefers-reduced-motion` the field
|
|
489
|
+
paints ONE grid, held at the start of the wave, with no loop and no pointer
|
|
490
|
+
tracking; it repaints only on a resize or a `data-bs-theme` flip, and
|
|
491
|
+
re-reads `--omega-line-strong` there, because the once-a-second color poll
|
|
492
|
+
lives inside the loop that path does not have.
|
|
493
|
+
- **The marquee measures in a later frame.** `build()` replaces the track's
|
|
494
|
+
children and reads the set width one `requestAnimationFrame` later, never
|
|
495
|
+
in the tick that just mutated it: that read was a forced synchronous
|
|
496
|
+
reflow on every build, and a build runs on resize, on `fonts.ready` and on
|
|
497
|
+
every image load in the set. A burst of those collapses to ONE measure, so
|
|
498
|
+
the second never sizes the loop from a track the first just cloned.
|
|
499
|
+
- `prefers-reduced-motion` renders final states: reveals resolve instantly,
|
|
500
|
+
count-ups show their target, rotators hold the first word, marquees park.
|
|
501
|
+
EVERY continuous loop in `core/css` and in the theme sheets this package
|
|
502
|
+
authors parks with them (vendored Bootstrap keeps upstream's own behavior):
|
|
503
|
+
the `.animation-*` utilities (spin, pulse, pulse-right, bounce, wiggle, flex,
|
|
504
|
+
shimmer), the motion library's float, marquee, and caret blink, the lazy-load
|
|
505
|
+
and binding shimmers, the exit-popup wave, the studio record pulse, the
|
|
506
|
+
download/extension walkthrough pointers, and the theme loops (the typing
|
|
507
|
+
dots, the org-chart flow lines, the ticker pulse, the CTA rings, the
|
|
508
|
+
infinite-scroll track). The one-shot fades, slides, and popups already end on
|
|
509
|
+
their final state. `test/animations.test.js` derives its roster from every
|
|
510
|
+
core and theme sheet that declares `infinite`, so a new unparked loop fails
|
|
511
|
+
the suite.
|
|
512
|
+
- **Autoplaying video parks in JS, because CSS cannot pause one**
|
|
513
|
+
([#499](https://github.com/Omega-JS-Stack/omega/issues/499)). The motion
|
|
514
|
+
engine's scan is the ONE lane: under `prefers-reduced-motion` it strips
|
|
515
|
+
`autoplay` from every `video[autoplay]`, pauses it, and turns its controls
|
|
516
|
+
on, so the poster holds and the visitor decides. It applies to every
|
|
517
|
+
autoplaying band at once (the hero's video demo, `marketing/product-demo`) —
|
|
518
|
+
a section never forks its own pause. Once parked, a rescan leaves a video
|
|
519
|
+
the visitor started alone.
|
|
520
|
+
- The PurgeCSS safelist keeps every `omega-`-namespaced selector plus
|
|
521
|
+
Bootstrap's own JS-toggled transition classes (`collapse`/`collapsing`/
|
|
522
|
+
`show`/`showing`/`fade` — `src/assets.js`) because that state is
|
|
523
|
+
runtime-stamped and never visible to the content scan. **New
|
|
524
|
+
runtime-stamped classes must live in the `omega-` namespace** (or join the
|
|
525
|
+
safelist explicitly).
|
|
526
|
+
|
|
527
|
+
**Classy never raises on hover** (Ian 2026-08-29,
|
|
528
|
+
[#686](https://github.com/Omega-JS-Stack/omega/issues/686)). Nothing travels
|
|
529
|
+
upward under the pointer in classy — not a button, not a card, not a tile.
|
|
530
|
+
Everything else a hover does stays: the warm, the ring, the shadow, the line,
|
|
531
|
+
the press, and the hero frame's tilt. The raise itself is SHARED css (core's
|
|
532
|
+
motion library serves every skin, and newsflash/neobrutalism import classy's
|
|
533
|
+
floor partials), so classy OPTS OUT in `themes/classy/css/base/_no-raise.scss`
|
|
534
|
+
— loaded last by its `_theme.scss` — and every other theme keeps its lifts.
|
|
535
|
+
Raises classy owns alone are gone from their own files instead. The legacy
|
|
536
|
+
`.hover-up` utility needs one specificity step (`html .hover-up:hover`) because
|
|
537
|
+
`core/css/core/_animations.scss` lands AFTER every theme, and a re-declared
|
|
538
|
+
hover transform carries its `prefers-reduced-motion` park with it, since a
|
|
539
|
+
media query adds no specificity. `test/hover-raise.test.js` compiles both the
|
|
540
|
+
classy and a sibling bundle, so a new raise reaching classy fails the suite.
|
|
541
|
+
|
|
542
|
+
**Every loading state carries a visible animation** (Ian 2026-08-15). Any
|
|
543
|
+
surface that WAITS — a poll, a fetch, a build, a webhook that has not landed —
|
|
544
|
+
shows an animated waiting indicator: the Bootstrap `spinner-border` idiom
|
|
545
|
+
(`role="status"` plus a `visually-hidden` label; `spinner-border-lg` for a
|
|
546
|
+
full-panel wait) for a spinner, the binding skeleton's shimmer for
|
|
547
|
+
placeholder content. Bare text alone is never a waiting state: with nothing
|
|
548
|
+
moving, a page that is working looks broken. Under `prefers-reduced-motion`
|
|
549
|
+
the indicator swaps to a STATIC state that still says what is happening —
|
|
550
|
+
park the loop (`animation: none`) and keep visible copy naming the wait
|
|
551
|
+
beside it, because vendored Bootstrap only slows its own spinner, so the page
|
|
552
|
+
rendering one owns the park (the confirmation page's
|
|
553
|
+
`core/css/pages/payment/confirmation/index.scss` is the reference).
|
|
554
|
+
|
|
555
|
+
## Copy register
|
|
556
|
+
|
|
557
|
+
Product copy — every string a visitor reads: layout and section copy,
|
|
558
|
+
section-defaults `json5`, and the JS string literals that render into the
|
|
559
|
+
page — **never uses em dashes**. Use a comma, a semicolon, a period, or
|
|
560
|
+
parentheses instead, whichever the sentence actually wants (Ian 2026-08-15).
|
|
561
|
+
The rule is about COPY, not about code: comments, `docs/`, frontmatter
|
|
562
|
+
headers, and `logger.*` messages are not rendered and are untouched, and a
|
|
563
|
+
bare `—` standing in as a placeholder glyph or a range separator is
|
|
564
|
+
typography rather than a sentence.
|
|
565
|
+
|
|
566
|
+
## classy v2 (the flagship skin)
|
|
567
|
+
|
|
568
|
+
Warm-paper light / de-blued charcoal dark; zero gradients (the only permitted
|
|
569
|
+
fades are alpha masks and monotone chart fills); ink primary buttons
|
|
570
|
+
(`.btn-adaptive` — built from `$dark`/`$light` by the shared overrides layer);
|
|
571
|
+
accent reserved for links, active states, focus, meters, chart series-1, and
|
|
572
|
+
small signals. Marketing display voice is the serif `--omega-font-marketing`
|
|
573
|
+
(`.omega-display`); app surfaces stay on the grotesk. The app chrome rides
|
|
574
|
+
`.omega-shell` with the content area drawn as one big rounded surface card
|
|
575
|
+
(matching margins/radii on topbar + main — the markup contract is untouched).
|
|
576
|
+
|
|
577
|
+
Structure: `_config.scss` (consumer knobs + Bootstrap forward) → `css/base`
|
|
578
|
+
(root bridge, typography, utilities) → `css/components`
|
|
579
|
+
(buttons/cards/forms/badges/dropdowns) → `css/layout`
|
|
580
|
+
(general/nav/footer/shell) → `css/marketing` (hero/bento/sections) →
|
|
581
|
+
`css/pages` (auth) → shared `../bootstrap/overrides`.
|
|
582
|
+
|
|
583
|
+
Section chrome is data-driven: `_includes/frontend/sections/{nav,footer}.html`
|
|
584
|
+
and the shared app chrome `_includes/global/sections/{app-sidebar,app-topbar,
|
|
585
|
+
page-header}.html` render JSON section data (`core/_includes/**.json`,
|
|
586
|
+
consumer-overridable per file). The sidebar supports an optional project
|
|
587
|
+
selector module (`selector:`), nested collapsible groups, badges, an ad slot
|
|
588
|
+
(`bottom.ad.enabled`), and the auth-bound user row; the topbar carries the
|
|
589
|
+
drawer/rail toggles, the breadcrumb trail (from `theme.header.breadcrumbs`),
|
|
590
|
+
the ⌘K search pill (`search:`), custom actions, and the account dropdown. Each
|
|
591
|
+
region rides its own page switch: `theme.sidebar.enabled: false` drops the rail
|
|
592
|
+
AND the two topbar toggles that drive it (dead buttons otherwise, naming an id
|
|
593
|
+
the page no longer carries,
|
|
594
|
+
[#740](https://github.com/Omega-JS-Stack/omega/issues/740)), and
|
|
595
|
+
`theme.topbar.enabled: false` drops the topbar.
|
|
596
|
+
|
|
597
|
+
## Stable-API line (don't churn once consumers exist)
|
|
598
|
+
|
|
599
|
+
Token NAMES · `_config.scss` variable names · `.omega-shell` markup contract
|
|
600
|
+
(which since [#319](https://github.com/Omega-JS-Stack/omega/issues/319) includes
|
|
601
|
+
the `__sidebar-scroll` region — hand-rolled shell markup without it gets a rail
|
|
602
|
+
that no longer scrolls its nav) · `_includes` section names + their JSON data
|
|
603
|
+
shapes · the motion attribute contract. Everything behind that line — values, partial internals, page
|
|
604
|
+
markup — iterates freely with the skin arc.
|