@omega.js/web 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 +640 -0
- package/bin/omega +2 -0
- package/bin/omega-web +2 -0
- package/bin/omg +2 -0
- package/core/_includes/admin/sections/sidebar.json +100 -0
- package/core/_includes/admin/sections/topbar.json +11 -0
- package/core/_includes/backend/sections/sidebar.json +39 -0
- package/core/_includes/backend/sections/topbar.json +16 -0
- package/core/_includes/core/body.html +102 -0
- package/core/_includes/core/foot.html +536 -0
- package/core/_includes/core/head.html +423 -0
- package/core/_includes/core/pricing/price-per-unit.html +33 -0
- package/core/_includes/core/showcase/entry-body.html +94 -0
- package/core/_includes/core/showcase/index-body.html +43 -0
- package/core/_includes/core/showcase/nav.html +60 -0
- package/core/_includes/frontend/sections/footer.json +74 -0
- package/core/_includes/frontend/sections/nav.json +70 -0
- package/core/_includes/global/sections/account.json +31 -0
- package/core/_includes/modules/engagement/giscus.html +26 -0
- package/core/_layouts/blueprint/404.html +10 -0
- package/core/_layouts/blueprint/about.html +10 -0
- package/core/_layouts/blueprint/account/index.html +11 -0
- package/core/_layouts/blueprint/admin/calendar/index.html +590 -0
- package/core/_layouts/blueprint/admin/dashboard/index.html +301 -0
- package/core/_layouts/blueprint/admin/firebase/index.html +214 -0
- package/core/_layouts/blueprint/admin/posts/editor.html +157 -0
- package/core/_layouts/blueprint/admin/posts/index.html +126 -0
- package/core/_layouts/blueprint/admin/stackblitz/index.html +30 -0
- package/core/_layouts/blueprint/admin/studio/index.html +85 -0
- package/core/_layouts/blueprint/admin/users/index.html +272 -0
- package/core/_layouts/blueprint/admin/users/new.html +82 -0
- package/core/_layouts/blueprint/admin/verts/index.html +204 -0
- package/core/_layouts/blueprint/alternatives/alternative.html +15 -0
- package/core/_layouts/blueprint/alternatives/index.html +10 -0
- package/core/_layouts/blueprint/app.html +10 -0
- package/core/_layouts/blueprint/auth/reset.html +19 -0
- package/core/_layouts/blueprint/auth/signin.html +19 -0
- package/core/_layouts/blueprint/auth/signup.html +19 -0
- package/core/_layouts/blueprint/auth/token.html +19 -0
- package/core/_layouts/blueprint/blog/categories/category.html +8 -0
- package/core/_layouts/blueprint/blog/categories/index.html +11 -0
- package/core/_layouts/blueprint/blog/index.html +10 -0
- package/core/_layouts/blueprint/blog/post.html +5 -0
- package/core/_layouts/blueprint/blog/tags/index.html +11 -0
- package/core/_layouts/blueprint/blog/tags/tag.html +8 -0
- package/core/_layouts/blueprint/careers.md +13 -0
- package/core/_layouts/blueprint/collection/category.html +9 -0
- package/core/_layouts/blueprint/collection/document.html +9 -0
- package/core/_layouts/blueprint/collection/index.html +9 -0
- package/core/_layouts/blueprint/connections/callback.html +11 -0
- package/core/_layouts/blueprint/contact.html +14 -0
- package/core/_layouts/blueprint/dashboard/index.html +10 -0
- package/core/_layouts/blueprint/download.html +20 -0
- package/core/_layouts/blueprint/extension/index.html +14 -0
- package/core/_layouts/blueprint/extension/installed.html +11 -0
- package/core/_layouts/blueprint/feedback.html +10 -0
- package/core/_layouts/blueprint/index.html +16 -0
- package/core/_layouts/blueprint/legal/cookies.md +57 -0
- package/core/_layouts/blueprint/legal/privacy.md +109 -0
- package/core/_layouts/blueprint/legal/terms.md +155 -0
- package/core/_layouts/blueprint/payment/checkout.html +15 -0
- package/core/_layouts/blueprint/payment/confirmation.html +14 -0
- package/core/_layouts/blueprint/portal/email-preferences.html +15 -0
- package/core/_layouts/blueprint/pricing.html +20 -0
- package/core/_layouts/blueprint/status.html +10 -0
- package/core/_layouts/blueprint/team/index.html +10 -0
- package/core/_layouts/blueprint/team/member.html +5 -0
- package/core/_layouts/blueprint/updates/index.html +10 -0
- package/core/_layouts/blueprint/updates/update.html +10 -0
- package/core/_layouts/core/root.html +45 -0
- package/core/_layouts/modules/utilities/redirect.html +129 -0
- package/core/css/_studio.scss +237 -0
- package/core/css/components/_index.scss +146 -0
- package/core/css/core/_.scss +0 -0
- package/core/css/core/_alert.scss +87 -0
- package/core/css/core/_animations.scss +343 -0
- package/core/css/core/_bindings.scss +116 -0
- package/core/css/core/_blog-search.scss +57 -0
- package/core/css/core/_chatsy.scss +61 -0
- package/core/css/core/_consent.scss +424 -0
- package/core/css/core/_custom-font-awesome.scss +146 -0
- package/core/css/core/_exit-popup.scss +42 -0
- package/core/css/core/_generated-badge.scss +33 -0
- package/core/css/core/_initialize.scss +29 -0
- package/core/css/core/_lazy-loading.scss +104 -0
- package/core/css/core/_social-sharing.scss +41 -0
- package/core/css/core/_tones.scss +32 -0
- package/core/css/core/_utilities.scss +157 -0
- package/core/css/main.scss +54 -0
- package/core/css/motion/_index.scss +368 -0
- package/core/css/pages/404/index.scss +0 -0
- package/core/css/pages/admin/calendar/index.scss +692 -0
- package/core/css/pages/admin/firebase/index.scss +33 -0
- package/core/css/pages/admin/index.scss +9 -0
- package/core/css/pages/admin/users/index.scss +9 -0
- package/core/css/pages/admin/verts/index.scss +9 -0
- package/core/css/pages/alternatives/[alternative]/index.scss +0 -0
- package/core/css/pages/blog/[slug].scss +55 -0
- package/core/css/pages/dashboard/account/index.scss +242 -0
- package/core/css/pages/download/index.scss +480 -0
- package/core/css/pages/extension/installed/index.scss +317 -0
- package/core/css/pages/feedback/index.scss +31 -0
- package/core/css/pages/payment/confirmation/index.scss +14 -0
- package/core/css/pages/pricing/index.scss +0 -0
- package/core/css/pages/status/index.scss +162 -0
- package/core/css/pages/test/libraries/layers/index.scss +28 -0
- package/core/css/pages/updates/[update].scss +46 -0
- package/core/css/pages/updates/index.scss +13 -0
- package/core/css/shell/_index.scss +207 -0
- package/core/css/tokens/_index.scss +166 -0
- package/core/icons/flags/ar.svg +1 -0
- package/core/icons/flags/bd.svg +1 -0
- package/core/icons/flags/ca.svg +1 -0
- package/core/icons/flags/ch.svg +1 -0
- package/core/icons/flags/cn.svg +1 -0
- package/core/icons/flags/co.svg +1 -0
- package/core/icons/flags/cw.svg +1 -0
- package/core/icons/flags/cz.svg +1 -0
- package/core/icons/flags/de.svg +1 -0
- package/core/icons/flags/dk.svg +1 -0
- package/core/icons/flags/eg.svg +1 -0
- package/core/icons/flags/es.svg +1 -0
- package/core/icons/flags/fi.svg +1 -0
- package/core/icons/flags/fr.svg +1 -0
- package/core/icons/flags/gb.svg +1 -0
- package/core/icons/flags/gq.svg +1 -0
- package/core/icons/flags/gr.svg +1 -0
- package/core/icons/flags/gt.svg +1 -0
- package/core/icons/flags/hn.svg +1 -0
- package/core/icons/flags/id.svg +1 -0
- package/core/icons/flags/ie.svg +1 -0
- package/core/icons/flags/in.svg +1 -0
- package/core/icons/flags/ir.svg +1 -0
- package/core/icons/flags/it.svg +1 -0
- package/core/icons/flags/jp.svg +1 -0
- package/core/icons/flags/kp.svg +1 -0
- package/core/icons/flags/kr.svg +1 -0
- package/core/icons/flags/ly.svg +1 -0
- package/core/icons/flags/ma.svg +1 -0
- package/core/icons/flags/mu.svg +1 -0
- package/core/icons/flags/mx.svg +1 -0
- package/core/icons/flags/ng.svg +1 -0
- package/core/icons/flags/pa.svg +1 -0
- package/core/icons/flags/ph.svg +1 -0
- package/core/icons/flags/pk.svg +1 -0
- package/core/icons/flags/pt.svg +1 -0
- package/core/icons/flags/ru.svg +1 -0
- package/core/icons/flags/sa.svg +1 -0
- package/core/icons/flags/sd.svg +1 -0
- package/core/icons/flags/se.svg +1 -0
- package/core/icons/flags/th.svg +1 -0
- package/core/icons/flags/tm.svg +1 -0
- package/core/icons/flags/tr.svg +1 -0
- package/core/icons/flags/us.svg +1 -0
- package/core/icons/flags/uy.svg +1 -0
- package/core/icons/flags/vn.svg +1 -0
- package/core/icons/flags/za.svg +1 -0
- package/core/images/exit-popup/subscriber-1.jpg +0 -0
- package/core/images/exit-popup/subscriber-2.jpg +0 -0
- package/core/images/exit-popup/subscriber-3.jpg +0 -0
- package/core/images/exit-popup/subscriber-4.jpg +0 -0
- package/core/images/placeholder/photo-1.jpg +0 -0
- package/core/images/placeholder/photo-2.jpg +0 -0
- package/core/images/placeholder/photo-3.jpg +0 -0
- package/core/js/core/analytics-loader.js +253 -0
- package/core/js/core/app-shell.js +136 -0
- package/core/js/core/appearance.js +195 -0
- package/core/js/core/auth.js +457 -0
- package/core/js/core/complete.js +72 -0
- package/core/js/core/consent.js +384 -0
- package/core/js/core/dev-icon-audit.js +63 -0
- package/core/js/core/dev-palette.js +670 -0
- package/core/js/core/dev-sections.js +53 -0
- package/core/js/core/exit-popup.js +276 -0
- package/core/js/core/initialize.js +8 -0
- package/core/js/core/language-switcher.js +167 -0
- package/core/js/core/lazy-loading.js +479 -0
- package/core/js/core/motion.js +28 -0
- package/core/js/core/query-strings.js +146 -0
- package/core/js/core/service-worker.js +28 -0
- package/core/js/core/social-sharing.js +293 -0
- package/core/js/first-paint.js +35 -0
- package/core/js/layouts/modules/utilities/redirect.js +122 -0
- package/core/js/libs/admin-helpers.js +62 -0
- package/core/js/libs/alert-dismiss.js +35 -0
- package/core/js/libs/analytics.js +368 -0
- package/core/js/libs/auth/email.js +144 -0
- package/core/js/libs/auth/errors.js +119 -0
- package/core/js/libs/auth/forms.js +206 -0
- package/core/js/libs/auth/index.js +181 -0
- package/core/js/libs/auth/oauth.js +394 -0
- package/core/js/libs/auth/orphan.js +110 -0
- package/core/js/libs/auth/password-toggle.js +44 -0
- package/core/js/libs/auth/session-params.js +266 -0
- package/core/js/libs/auth/tracking.js +41 -0
- package/core/js/libs/charts.js +516 -0
- package/core/js/libs/consent-region.js +127 -0
- package/core/js/libs/dev.js +150 -0
- package/core/js/libs/graph.js +201 -0
- package/core/js/libs/initialize-tooltips.js +31 -0
- package/core/js/libs/logger.js +38 -0
- package/core/js/libs/omega-copy.js +89 -0
- package/core/js/libs/path-prefix.js +44 -0
- package/core/js/libs/payment-config.js +76 -0
- package/core/js/libs/recaptcha.js +94 -0
- package/core/js/libs/sale-name.js +295 -0
- package/core/js/libs/showcase-frames.js +37 -0
- package/core/js/libs/srcset.js +69 -0
- package/core/js/libs/tracking-consent.js +161 -0
- package/core/js/main.js +144 -0
- package/core/js/pages/404/index.js +57 -0
- package/core/js/pages/admin/calendar/calendar-core.js +701 -0
- package/core/js/pages/admin/calendar/calendar-events.js +853 -0
- package/core/js/pages/admin/calendar/calendar-renderer.js +807 -0
- package/core/js/pages/admin/calendar/campaign-preview.js +105 -0
- package/core/js/pages/admin/calendar/index.js +40 -0
- package/core/js/pages/admin/firebase/index.js +727 -0
- package/core/js/pages/admin/index.js +531 -0
- package/core/js/pages/admin/posts/editor/index.js +230 -0
- package/core/js/pages/admin/posts/index.js +237 -0
- package/core/js/pages/admin/studio/index.js +538 -0
- package/core/js/pages/admin/users/index.js +669 -0
- package/core/js/pages/admin/users/new/index.js +65 -0
- package/core/js/pages/admin/verts/index.js +407 -0
- package/core/js/pages/alternatives/[alternative]/index.js +17 -0
- package/core/js/pages/app/index.js +135 -0
- package/core/js/pages/blog/[slug].js +132 -0
- package/core/js/pages/blog/_search.mjs +108 -0
- package/core/js/pages/blog/index.js +193 -0
- package/core/js/pages/blog/page/[num]/index.js +7 -0
- package/core/js/pages/connections/callback/index.js +148 -0
- package/core/js/pages/contact/index.js +170 -0
- package/core/js/pages/cookies.js +2 -0
- package/core/js/pages/dashboard/account/index.js +366 -0
- package/core/js/pages/dashboard/account/modules/orders.js +82 -0
- package/core/js/pages/dashboard/account/sections/api-keys.js +149 -0
- package/core/js/pages/dashboard/account/sections/billing.js +1667 -0
- package/core/js/pages/dashboard/account/sections/connections.js +333 -0
- package/core/js/pages/dashboard/account/sections/data-request.js +225 -0
- package/core/js/pages/dashboard/account/sections/delete.js +80 -0
- package/core/js/pages/dashboard/account/sections/notifications.js +167 -0
- package/core/js/pages/dashboard/account/sections/orders.js +151 -0
- package/core/js/pages/dashboard/account/sections/profile.js +200 -0
- package/core/js/pages/dashboard/account/sections/referrals.js +217 -0
- package/core/js/pages/dashboard/account/sections/refund.js +253 -0
- package/core/js/pages/dashboard/account/sections/security.js +726 -0
- package/core/js/pages/dashboard/account/sections/team.js +247 -0
- package/core/js/pages/download/index.js +418 -0
- package/core/js/pages/extension/index.js +164 -0
- package/core/js/pages/extension/installed/index.js +135 -0
- package/core/js/pages/feedback/index.js +193 -0
- package/core/js/pages/legal/_document.js +91 -0
- package/core/js/pages/payment/checkout/index.js +420 -0
- package/core/js/pages/payment/checkout/modules/api.js +139 -0
- package/core/js/pages/payment/checkout/modules/dev-section.js +175 -0
- package/core/js/pages/payment/checkout/modules/discount.js +69 -0
- package/core/js/pages/payment/checkout/modules/pricing.js +73 -0
- package/core/js/pages/payment/checkout/modules/state.js +339 -0
- package/core/js/pages/payment/checkout/modules/tracking.js +54 -0
- package/core/js/pages/payment/confirmation/index.js +91 -0
- package/core/js/pages/payment/confirmation/modules/celebration.js +45 -0
- package/core/js/pages/payment/confirmation/modules/state.js +112 -0
- package/core/js/pages/payment/confirmation/modules/tracking.js +133 -0
- package/core/js/pages/payment/confirmation/modules/verify.js +142 -0
- package/core/js/pages/portal/email-preferences/index.js +183 -0
- package/core/js/pages/pricing/index.js +425 -0
- package/core/js/pages/privacy.js +2 -0
- package/core/js/pages/reset/index.js +12 -0
- package/core/js/pages/signin/index.js +22 -0
- package/core/js/pages/signup/index.js +23 -0
- package/core/js/pages/status/index.js +687 -0
- package/core/js/pages/terms.js +2 -0
- package/core/js/pages/test/components/[category]/[name]/index.js +26 -0
- package/core/js/pages/test/libraries/appearance/index.js +220 -0
- package/core/js/pages/test/libraries/form-manager/index.js +328 -0
- package/core/js/pages/test/libraries/layers/index.js +16 -0
- package/core/js/pages/test/libraries/verts/index.js +68 -0
- package/core/js/pages/test/sections/[category]/[name]/index.js +28 -0
- package/core/js/pages/test/styleguide/index.js +35 -0
- package/core/js/pages/token/index.js +203 -0
- package/core/logos/brandmarks/original/apple-app-store.svg +1 -0
- package/core/logos/brandmarks/original/apple.svg +6 -0
- package/core/logos/brandmarks/original/bitbucket.svg +14 -0
- package/core/logos/brandmarks/original/bitcoin.svg +1 -0
- package/core/logos/brandmarks/original/bluesky.svg +7 -0
- package/core/logos/brandmarks/original/bootstrap.svg +43 -0
- package/core/logos/brandmarks/original/brave.svg +1 -0
- package/core/logos/brandmarks/original/chrome.svg +1 -0
- package/core/logos/brandmarks/original/discord.svg +1 -0
- package/core/logos/brandmarks/original/dropbox.svg +10 -0
- package/core/logos/brandmarks/original/edge.svg +1 -0
- package/core/logos/brandmarks/original/facebook-f.svg +1 -0
- package/core/logos/brandmarks/original/facebook.svg +8 -0
- package/core/logos/brandmarks/original/figma.svg +10 -0
- package/core/logos/brandmarks/original/firefox.svg +1 -0
- package/core/logos/brandmarks/original/github.svg +6 -0
- package/core/logos/brandmarks/original/gitlab.svg +17 -0
- package/core/logos/brandmarks/original/google-a-s.svg +1 -0
- package/core/logos/brandmarks/original/google-chrome-webstore.svg +49 -0
- package/core/logos/brandmarks/original/google-play-store.svg +1 -0
- package/core/logos/brandmarks/original/google-web-search.svg +1 -0
- package/core/logos/brandmarks/original/google.svg +1 -0
- package/core/logos/brandmarks/original/gulp.svg +4 -0
- package/core/logos/brandmarks/original/html-5.svg +1 -0
- package/core/logos/brandmarks/original/instagram.svg +1 -0
- package/core/logos/brandmarks/original/javascript.svg +1 -0
- package/core/logos/brandmarks/original/jira.svg +18 -0
- package/core/logos/brandmarks/original/kick.svg +7 -0
- package/core/logos/brandmarks/original/linkedin.svg +1 -0
- package/core/logos/brandmarks/original/linux.svg +28 -0
- package/core/logos/brandmarks/original/messenger.svg +16 -0
- package/core/logos/brandmarks/original/microsoft.svg +1 -0
- package/core/logos/brandmarks/original/npm.svg +8 -0
- package/core/logos/brandmarks/original/opera.svg +1 -0
- package/core/logos/brandmarks/original/patreon.svg +6 -0
- package/core/logos/brandmarks/original/pinterest.svg +6 -0
- package/core/logos/brandmarks/original/reddit.svg +1 -0
- package/core/logos/brandmarks/original/safari.svg +31 -0
- package/core/logos/brandmarks/original/sass.svg +3 -0
- package/core/logos/brandmarks/original/signal.svg +6 -0
- package/core/logos/brandmarks/original/skype.svg +47 -0
- package/core/logos/brandmarks/original/slack.svg +33 -0
- package/core/logos/brandmarks/original/soundcloud.svg +1 -0
- package/core/logos/brandmarks/original/spotify.svg +5 -0
- package/core/logos/brandmarks/original/steam.svg +6 -0
- package/core/logos/brandmarks/original/telegram.svg +14 -0
- package/core/logos/brandmarks/original/tiktok.svg +1 -0
- package/core/logos/brandmarks/original/trello.svg +16 -0
- package/core/logos/brandmarks/original/tumblr.svg +1 -0
- package/core/logos/brandmarks/original/twitch.svg +6 -0
- package/core/logos/brandmarks/original/twitter.svg +6 -0
- package/core/logos/brandmarks/original/unity.svg +6 -0
- package/core/logos/brandmarks/original/x.svg +7 -0
- package/core/logos/brandmarks/original/yahoo-y.svg +1 -0
- package/core/logos/brandmarks/original/youtube-square.svg +1 -0
- package/core/logos/brandmarks/original/youtube.svg +1 -0
- package/core/logos/combomarks/dark/airbnb.svg +30 -0
- package/core/logos/combomarks/dark/slack.svg +38 -0
- package/core/logos/combomarks/dark/spotify.svg +35 -0
- package/core/logos/combomarks/dark/twilio.svg +26 -0
- package/core/logos/combomarks/dark/weebly.svg +35 -0
- package/core/logos/combomarks/gray/airbnb.svg +33 -0
- package/core/logos/combomarks/gray/alphabet.svg +23 -0
- package/core/logos/combomarks/gray/amazon.svg +38 -0
- package/core/logos/combomarks/gray/boring-company.svg +91 -0
- package/core/logos/combomarks/gray/burberry.svg +239 -0
- package/core/logos/combomarks/gray/embark.svg +21 -0
- package/core/logos/combomarks/gray/fitbit.svg +61 -0
- package/core/logos/combomarks/gray/fred-perry.svg +94 -0
- package/core/logos/combomarks/gray/google.svg +27 -0
- package/core/logos/combomarks/gray/hollister.svg +34 -0
- package/core/logos/combomarks/gray/hubspot.svg +27 -0
- package/core/logos/combomarks/gray/kaplan.svg +33 -0
- package/core/logos/combomarks/gray/lenovo.svg +27 -0
- package/core/logos/combomarks/gray/levis.svg +25 -0
- package/core/logos/combomarks/gray/mapbox.svg +37 -0
- package/core/logos/combomarks/gray/netflix.svg +15 -0
- package/core/logos/combomarks/gray/new-balance.svg +32 -0
- package/core/logos/combomarks/gray/nike.svg +17 -0
- package/core/logos/combomarks/gray/paypal.svg +41 -0
- package/core/logos/combomarks/gray/puma.svg +82 -0
- package/core/logos/combomarks/gray/samsung.svg +26 -0
- package/core/logos/combomarks/gray/shopify.svg +36 -0
- package/core/logos/combomarks/gray/slack.svg +42 -0
- package/core/logos/combomarks/gray/spotify.svg +38 -0
- package/core/logos/combomarks/gray/stripe.svg +24 -0
- package/core/logos/combomarks/gray/tnf.svg +30 -0
- package/core/logos/combomarks/gray/twilio.svg +29 -0
- package/core/logos/combomarks/gray/uber.svg +24 -0
- package/core/logos/combomarks/gray/weebly.svg +38 -0
- package/core/logos/combomarks/original/airbnb.svg +33 -0
- package/core/logos/combomarks/original/alphabet.svg +23 -0
- package/core/logos/combomarks/original/amazon.svg +38 -0
- package/core/logos/combomarks/original/asana.svg +8 -0
- package/core/logos/combomarks/original/boring-company.svg +91 -0
- package/core/logos/combomarks/original/discord.svg +6 -0
- package/core/logos/combomarks/original/embark.svg +24 -0
- package/core/logos/combomarks/original/fitbit.svg +60 -0
- package/core/logos/combomarks/original/github.svg +6 -0
- package/core/logos/combomarks/original/gitlab.svg +20 -0
- package/core/logos/combomarks/original/google.svg +28 -0
- package/core/logos/combomarks/original/hubspot.svg +29 -0
- package/core/logos/combomarks/original/instagram.svg +7 -0
- package/core/logos/combomarks/original/kickstarter.svg +6 -0
- package/core/logos/combomarks/original/lenovo.svg +24 -0
- package/core/logos/combomarks/original/linkedin.svg +6 -0
- package/core/logos/combomarks/original/mapbox.svg +39 -0
- package/core/logos/combomarks/original/mastodon.svg +7 -0
- package/core/logos/combomarks/original/medium.svg +6 -0
- package/core/logos/combomarks/original/meta.svg +22 -0
- package/core/logos/combomarks/original/microsoft.svg +13 -0
- package/core/logos/combomarks/original/monday.svg +12 -0
- package/core/logos/combomarks/original/netflix.svg +15 -0
- package/core/logos/combomarks/original/notion.svg +9 -0
- package/core/logos/combomarks/original/paypal.svg +41 -0
- package/core/logos/combomarks/original/reddit.svg +13 -0
- package/core/logos/combomarks/original/samsung.svg +25 -0
- package/core/logos/combomarks/original/shopify.svg +35 -0
- package/core/logos/combomarks/original/slack.svg +47 -0
- package/core/logos/combomarks/original/spotify.svg +37 -0
- package/core/logos/combomarks/original/stackoverflow.svg +28 -0
- package/core/logos/combomarks/original/stripe.svg +24 -0
- package/core/logos/combomarks/original/tiktok.svg +12 -0
- package/core/logos/combomarks/original/tumblr.svg +6 -0
- package/core/logos/combomarks/original/uber.svg +24 -0
- package/core/logos/combomarks/original/weebly.svg +34 -0
- package/core/logos/combomarks/original/whatsapp.svg +20 -0
- package/core/logos/combomarks/original/youtube.svg +10 -0
- package/core/logos/combomarks/original/zoom.svg +7 -0
- package/core/logos/combomarks/white/airbnb.svg +33 -0
- package/core/logos/combomarks/white/alphabet.svg +23 -0
- package/core/logos/combomarks/white/amazon.svg +38 -0
- package/core/logos/combomarks/white/boring-company.svg +91 -0
- package/core/logos/combomarks/white/embark.svg +21 -0
- package/core/logos/combomarks/white/fitbit.svg +61 -0
- package/core/logos/combomarks/white/google.svg +27 -0
- package/core/logos/combomarks/white/hubspot.svg +27 -0
- package/core/logos/combomarks/white/kaplan.svg +33 -0
- package/core/logos/combomarks/white/lenovo.svg +27 -0
- package/core/logos/combomarks/white/mapbox.svg +37 -0
- package/core/logos/combomarks/white/netflix.svg +15 -0
- package/core/logos/combomarks/white/paypal.svg +40 -0
- package/core/logos/combomarks/white/samsung.svg +26 -0
- package/core/logos/combomarks/white/shopify.svg +36 -0
- package/core/logos/combomarks/white/slack.svg +42 -0
- package/core/logos/combomarks/white/spotify.svg +38 -0
- package/core/logos/combomarks/white/stripe.svg +24 -0
- package/core/logos/combomarks/white/twilio.svg +29 -0
- package/core/logos/combomarks/white/uber.svg +24 -0
- package/core/logos/combomarks/white/weebly.svg +38 -0
- package/defaults/pages/404.md +4 -0
- package/defaults/pages/about.md +4 -0
- package/defaults/pages/admin/calendar/index.html +4 -0
- package/defaults/pages/admin/firebase/index.html +4 -0
- package/defaults/pages/admin/index.md +4 -0
- package/defaults/pages/admin/posts/editor.html +4 -0
- package/defaults/pages/admin/posts/index.html +4 -0
- package/defaults/pages/admin/stackblitz/index.html +4 -0
- package/defaults/pages/admin/studio/index.html +4 -0
- package/defaults/pages/admin/users/index.html +4 -0
- package/defaults/pages/admin/users/new.html +4 -0
- package/defaults/pages/admin/verts/index.html +4 -0
- package/defaults/pages/ads-txt.html +11 -0
- package/defaults/pages/alternatives/index.md +4 -0
- package/defaults/pages/app.md +4 -0
- package/defaults/pages/auth/reset.md +4 -0
- package/defaults/pages/auth/signin.md +4 -0
- package/defaults/pages/auth/signup.md +4 -0
- package/defaults/pages/auth/token.md +4 -0
- package/defaults/pages/blog/categories/category.html +21 -0
- package/defaults/pages/blog/categories.md +4 -0
- package/defaults/pages/blog/index-json.html +27 -0
- package/defaults/pages/blog/tags/tag.html +21 -0
- package/defaults/pages/blog/tags.md +4 -0
- package/defaults/pages/blog.md +22 -0
- package/defaults/pages/careers.md +4 -0
- package/defaults/pages/connections/callback.md +4 -0
- package/defaults/pages/contact.md +4 -0
- package/defaults/pages/dashboard/account.md +4 -0
- package/defaults/pages/dashboard/index.md +12 -0
- package/defaults/pages/download.md +4 -0
- package/defaults/pages/extension/index.html +4 -0
- package/defaults/pages/extension/installed.html +4 -0
- package/defaults/pages/feedback.md +4 -0
- package/defaults/pages/feeds/posts-json.html +40 -0
- package/defaults/pages/feeds/posts-xml.html +38 -0
- package/defaults/pages/humans.html +25 -0
- package/defaults/pages/index.md +4 -0
- package/defaults/pages/legal/cookies.md +4 -0
- package/defaults/pages/legal/privacy.md +4 -0
- package/defaults/pages/legal/terms.md +4 -0
- package/defaults/pages/llms-txt.html +46 -0
- package/defaults/pages/opensearch.html +16 -0
- package/defaults/pages/pages-json.html +42 -0
- package/defaults/pages/payment/checkout.md +4 -0
- package/defaults/pages/payment/confirmation.md +4 -0
- package/defaults/pages/portal/email-preferences.md +4 -0
- package/defaults/pages/pricing.md +4 -0
- package/defaults/pages/redirects/account.md +12 -0
- package/defaults/pages/redirects/admin/dashboard.md +11 -0
- package/defaults/pages/redirects/auth/change-password.md +9 -0
- package/defaults/pages/redirects/auth/forgot.md +9 -0
- package/defaults/pages/redirects/auth/join.md +9 -0
- package/defaults/pages/redirects/auth/login.md +9 -0
- package/defaults/pages/redirects/auth/recover.md +9 -0
- package/defaults/pages/redirects/auth/register.md +9 -0
- package/defaults/pages/redirects/auth/reset-password.md +9 -0
- package/defaults/pages/redirects/billing/cancel.md +9 -0
- package/defaults/pages/redirects/billing/refund.md +9 -0
- package/defaults/pages/robots.html +36 -0
- package/defaults/pages/security-txt.html +11 -0
- package/defaults/pages/sitemap.html +37 -0
- package/defaults/pages/status.md +4 -0
- package/defaults/pages/team/index.md +4 -0
- package/defaults/pages/test/account/dashboard.html +16 -0
- package/defaults/pages/test/index.md +12 -0
- package/defaults/pages/test/libraries/appearance.html +268 -0
- package/defaults/pages/test/libraries/cover.html +50 -0
- package/defaults/pages/test/libraries/error.html +30 -0
- package/defaults/pages/test/libraries/firestore.html +202 -0
- package/defaults/pages/test/libraries/form-manager.html +374 -0
- package/defaults/pages/test/libraries/layers.html +52 -0
- package/defaults/pages/test/libraries/lazy-loading.html +450 -0
- package/defaults/pages/test/libraries/verts.html +149 -0
- package/defaults/pages/test/redirect/external.md +13 -0
- package/defaults/pages/test/redirect/internal.md +13 -0
- package/defaults/pages/test/styleguide/index.html +588 -0
- package/defaults/pages/test/translation/index.md +50 -0
- package/defaults/pages/updates/index.md +4 -0
- package/defaults/sample-posts/2026-01-12-welcome-to-the-blog.md +26 -0
- package/defaults/sample-posts/2026-02-03-a-field-guide-to-good-defaults.md +50 -0
- package/defaults/sample-posts/2026-02-24-shipping-week-notes.md +37 -0
- package/defaults/sample-posts/2026-03-17-the-case-for-one-config.md +36 -0
- package/defaults/sample-posts/2026-04-09-write-release-notes-people-read.md +34 -0
- package/defaults/sample-posts/2026-05-21-dark-mode-done-properly.md +38 -0
- package/defaults/sample-posts/2026-06-02-the-boring-deploy-is-the-good-deploy.md +30 -0
- package/defaults/sample-posts/2026-06-11-naming-things-a-survival-guide.md +30 -0
- package/defaults/sample-posts/2026-06-19-your-pricing-page-is-a-product.md +28 -0
- package/defaults/sample-posts/2026-06-30-email-is-an-api-with-feelings.md +28 -0
- package/defaults/sample-posts/2026-07-08-ship-the-docs-with-the-diff.md +30 -0
- package/defaults/sample-team/avery-quinn.md +22 -0
- package/defaults/sample-team/jordan-reyes.md +25 -0
- package/defaults/sample-team/riley-nakamura.md +22 -0
- package/defaults/sample-team/sam-okafor.md +22 -0
- package/defaults/sample-updates/v1.0.0.md +28 -0
- package/defaults/sample-updates/v1.1.0.md +27 -0
- package/defaults/sample-updates/v1.2.0.md +27 -0
- package/defaults/sample-updates/v1.3.0.md +28 -0
- package/defaults/showcase/components.html +62 -0
- package/defaults/showcase/entry.html +76 -0
- package/defaults/showcase/frame.html +62 -0
- package/defaults/showcase/index.html +59 -0
- package/dist/assets.js +1349 -0
- package/dist/brand-tokens.js +195 -0
- package/dist/build.js +192 -0
- package/dist/cachebreak-html.js +71 -0
- package/dist/cli-run.js +25 -0
- package/dist/cli.js +47 -0
- package/dist/collections.js +183 -0
- package/dist/commands/audit.js +470 -0
- package/dist/commands/build.js +197 -0
- package/dist/commands/clean.js +18 -0
- package/dist/commands/customize.js +125 -0
- package/dist/commands/deploy.js +441 -0
- package/dist/commands/dev.js +1067 -0
- package/dist/commands/install.js +31 -0
- package/dist/commands/lib/deploy-precheck.js +43 -0
- package/dist/commands/lib/ensure-target.js +115 -0
- package/dist/commands/migrate.js +86 -0
- package/dist/commands/purge.js +31 -0
- package/dist/commands/test.js +237 -0
- package/dist/commands/translate.js +57 -0
- package/dist/commands/update.js +22 -0
- package/dist/commands/version.js +11 -0
- package/dist/config-sections.js +245 -0
- package/dist/consumer-scan.js +118 -0
- package/dist/consumer.js +49 -0
- package/dist/customize.js +328 -0
- package/dist/decisions.js +153 -0
- package/dist/dist-audit.js +417 -0
- package/dist/dynamic-pages.js +357 -0
- package/dist/engine.js +1402 -0
- package/dist/firebase-auth-helpers.js +198 -0
- package/dist/font-metrics.js +420 -0
- package/dist/frontmatter-liquid.js +253 -0
- package/dist/github-secrets.js +80 -0
- package/dist/hero-animations.js +170 -0
- package/dist/imagemin.js +261 -0
- package/dist/index.js +41 -0
- package/dist/inline-icons.js +65 -0
- package/dist/language-flags.js +55 -0
- package/dist/layers.js +80 -0
- package/dist/layouts.js +44 -0
- package/dist/limit-collections.js +199 -0
- package/dist/link-resolver.js +303 -0
- package/dist/markdown-images.js +85 -0
- package/dist/merge.js +20 -0
- package/dist/migrate/codemod.js +172 -0
- package/dist/migrate/config-convert.js +448 -0
- package/dist/migrate/consumer-assets.js +130 -0
- package/dist/migrate/index.js +223 -0
- package/dist/migrate/lint.js +108 -0
- package/dist/migrate/rules.js +1929 -0
- package/dist/minify-html.js +148 -0
- package/dist/mode-helpers.js +96 -0
- package/dist/omega-bin.js +7 -0
- package/dist/overrides.js +190 -0
- package/dist/path-prefix.js +167 -0
- package/dist/paths.js +37 -0
- package/dist/pricing.js +301 -0
- package/dist/purge.js +95 -0
- package/dist/redirect-page.js +45 -0
- package/dist/sample-content.js +210 -0
- package/dist/scaffold.js +123 -0
- package/dist/sections.js +810 -0
- package/dist/service-worker.js +200 -0
- package/dist/social-pages.js +142 -0
- package/dist/srcset.js +67 -0
- package/dist/static-assets.js +154 -0
- package/dist/target-shortlinks.js +123 -0
- package/dist/theme-vocabulary.js +76 -0
- package/dist/translate/collect-text-nodes.js +93 -0
- package/dist/translate/default-routes.js +152 -0
- package/dist/translate/generate-defaults.js +297 -0
- package/dist/translate/index.js +568 -0
- package/dist/translate/packaged-defaults.js +127 -0
- package/dist/translate/sitemap.js +108 -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/bare-requires.js +153 -0
- package/dist/vendor/devkit/bundle.js +292 -0
- package/dist/vendor/devkit/ci-workflows.js +520 -0
- package/dist/vendor/devkit/cli-router.js +156 -0
- package/dist/vendor/devkit/command-path.js +46 -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/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-https.js +360 -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/omega-bin.js +345 -0
- package/dist/vendor/devkit/reads.js +274 -0
- package/dist/vendor/devkit/safe-install.js +18 -0
- package/dist/vendor/devkit/scaffold-guard.js +96 -0
- package/dist/vendor/devkit/stop-signals.js +28 -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-secrets.js +165 -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/dist/vendor/template-kit/data/language-flags.js +54 -0
- package/dist/vendor/template-kit/data/languages.js +195 -0
- package/dist/vendor/template-kit/data/social-urls.js +26 -0
- package/dist/vendor/template-kit/filters.js +227 -0
- package/dist/vendor/template-kit/index.js +28 -0
- package/dist/vendor/template-kit/jekyll-compat.js +268 -0
- package/dist/vendor/template-kit/register-liquid.js +0 -0
- package/dist/vendor/template-kit/tags/collections.js +191 -0
- package/dist/vendor/template-kit/tags/conditionals.js +101 -0
- package/dist/vendor/template-kit/tags/content.js +175 -0
- package/dist/vendor/template-kit/tags/index.js +33 -0
- package/dist/vendor/template-kit/tags/media.js +376 -0
- package/dist/vendor/template-kit/variable-resolver.js +163 -0
- package/docs/ads-system.md +109 -0
- package/docs/classy-v2/DIRECTION.md +92 -0
- package/docs/classy-v2/draft-1.html +1932 -0
- package/docs/classy-v2/draft-2.html +1956 -0
- package/docs/frontmatter.md +153 -0
- package/docs/index.md +254 -0
- package/docs/libs.md +298 -0
- package/docs/omega-sections-spec.md +159 -0
- package/docs/page-contract.md +112 -0
- package/docs/sections.md +845 -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/template-kit.md +128 -0
- package/docs/test-framework.md +163 -0
- package/package.json +122 -0
- package/runtime/boot.js +149 -0
- package/runtime/icons.js +77 -0
- package/runtime/manager.js +36 -0
- package/scaffold/.github/workflows/build.yml +139 -0
- package/scaffold/.nvmrc +1 -0
- package/scaffold/AGENTS.md +55 -0
- package/scaffold/CLAUDE.md +1 -0
- package/scaffold/_.gitattributes +4 -0
- package/scaffold/_.gitignore +27 -0
- package/scaffold/config/omega.json5 +20 -0
- package/scaffold/src/assets/css/pages/.gitkeep +0 -0
- package/scaffold/src/assets/images/.gitkeep +0 -0
- package/scaffold/src/assets/js/pages/.gitkeep +0 -0
- package/scaffold/src/pages/.gitkeep +0 -0
- package/scaffold/src/pages/example.md.txt +94 -0
- package/scaffold/src/service-worker.js +16 -0
- package/sw/entry.js +19 -0
- package/sw/manager.js +281 -0
- package/themes/_template/README.md +115 -0
- package/themes/_template/_config.scss +60 -0
- package/themes/_template/_theme.js +14 -0
- package/themes/_template/_theme.scss +28 -0
- package/themes/_template/css/base/_root.scss +19 -0
- package/themes/_template/css/components/_components.scss +23 -0
- package/themes/base/README.md +5 -0
- package/themes/base/_components/data/org-chart/component.html +33 -0
- package/themes/base/_components/data/org-chart/component.json5 +33 -0
- package/themes/base/_components/data/org-chart/component.scss +183 -0
- package/themes/base/_components/heading/masthead/component.html +22 -0
- package/themes/base/_components/heading/masthead/component.json5 +30 -0
- package/themes/base/_components/heading/section-head/component.html +18 -0
- package/themes/base/_components/heading/section-head/component.json5 +27 -0
- package/themes/base/_components/pricing/features/component.html +29 -0
- package/themes/base/_components/pricing/features/component.json5 +30 -0
- package/themes/base/_hero/orbit/index.html +30 -0
- package/themes/base/_hero/orbit/script.js +33 -0
- package/themes/base/_hero/orbit/style.scss +133 -0
- package/themes/base/_includes/admin/sections/sidebar.html +3 -0
- package/themes/base/_includes/admin/sections/topbar.html +3 -0
- package/themes/base/_includes/backend/sections/sidebar.html +3 -0
- package/themes/base/_includes/backend/sections/topbar.html +3 -0
- package/themes/base/_includes/frontend/components/connection-card.html +49 -0
- package/themes/base/_includes/frontend/components/post-card.html +54 -0
- package/themes/base/_includes/frontend/sections/account-connections.html +42 -0
- package/themes/base/_includes/frontend/sections/account-section-header.html +11 -0
- package/themes/base/_includes/frontend/sections/footer.html +154 -0
- package/themes/base/_includes/frontend/sections/nav.html +276 -0
- package/themes/base/_includes/global/sections/account.html +72 -0
- package/themes/base/_includes/global/sections/app-sidebar.html +248 -0
- package/themes/base/_includes/global/sections/app-topbar.html +228 -0
- package/themes/base/_includes/global/sections/page-header.html +99 -0
- package/themes/base/_layouts/admin/core/minimal-viewport-locked.html +22 -0
- package/themes/base/_layouts/admin/core/minimal.html +23 -0
- package/themes/base/_layouts/backend/core/base.html +57 -0
- package/themes/base/_layouts/backend/core/minimal-viewport-locked.html +32 -0
- package/themes/base/_layouts/backend/core/minimal.html +32 -0
- package/themes/base/_layouts/backend/pages/dashboard/index.html +230 -0
- package/themes/base/_layouts/frontend/core/base.html +31 -0
- package/themes/base/_layouts/frontend/core/cover.html +40 -0
- package/themes/base/_layouts/frontend/core/minimal.html +47 -0
- package/themes/base/_layouts/frontend/pages/404.html +54 -0
- package/themes/base/_layouts/frontend/pages/about.html +144 -0
- package/themes/base/_layouts/frontend/pages/account/index.html +2104 -0
- package/themes/base/_layouts/frontend/pages/alternatives/alternative.html +319 -0
- package/themes/base/_layouts/frontend/pages/alternatives/index.html +186 -0
- package/themes/base/_layouts/frontend/pages/app.html +142 -0
- package/themes/base/_layouts/frontend/pages/auth/reset.html +53 -0
- package/themes/base/_layouts/frontend/pages/auth/signin.html +90 -0
- package/themes/base/_layouts/frontend/pages/auth/signup.html +141 -0
- package/themes/base/_layouts/frontend/pages/auth/token.html +44 -0
- package/themes/base/_layouts/frontend/pages/blog/categories/category.html +88 -0
- package/themes/base/_layouts/frontend/pages/blog/categories/index.html +88 -0
- package/themes/base/_layouts/frontend/pages/blog/index.html +255 -0
- package/themes/base/_layouts/frontend/pages/blog/post.html +261 -0
- package/themes/base/_layouts/frontend/pages/blog/tags/index.html +84 -0
- package/themes/base/_layouts/frontend/pages/blog/tags/tag.html +88 -0
- package/themes/base/_layouts/frontend/pages/collection/category.html +72 -0
- package/themes/base/_layouts/frontend/pages/collection/document.html +54 -0
- package/themes/base/_layouts/frontend/pages/collection/index.html +84 -0
- package/themes/base/_layouts/frontend/pages/connections/callback.html +55 -0
- package/themes/base/_layouts/frontend/pages/contact.html +214 -0
- package/themes/base/_layouts/frontend/pages/download.html +793 -0
- package/themes/base/_layouts/frontend/pages/extension/index.html +253 -0
- package/themes/base/_layouts/frontend/pages/extension/installed.html +198 -0
- package/themes/base/_layouts/frontend/pages/feedback.html +171 -0
- package/themes/base/_layouts/frontend/pages/index.html +66 -0
- package/themes/base/_layouts/frontend/pages/legal/document.html +78 -0
- package/themes/base/_layouts/frontend/pages/payment/checkout.html +459 -0
- package/themes/base/_layouts/frontend/pages/payment/confirmation.html +131 -0
- package/themes/base/_layouts/frontend/pages/portal/email-preferences.html +104 -0
- package/themes/base/_layouts/frontend/pages/pricing.html +596 -0
- package/themes/base/_layouts/frontend/pages/status.html +361 -0
- package/themes/base/_layouts/frontend/pages/team/index.html +210 -0
- package/themes/base/_layouts/frontend/pages/team/member.html +125 -0
- package/themes/base/_layouts/frontend/pages/updates/index.html +119 -0
- package/themes/base/_layouts/frontend/pages/updates/update.html +118 -0
- package/themes/base/_sections/about/hero/section.html +68 -0
- package/themes/base/_sections/about/hero/section.json5 +58 -0
- package/themes/base/_sections/about/letter/section.html +60 -0
- package/themes/base/_sections/about/letter/section.json5 +56 -0
- package/themes/base/_sections/about/photo-band/section.html +24 -0
- package/themes/base/_sections/about/photo-band/section.json5 +23 -0
- package/themes/base/_sections/about/principles/section.html +17 -0
- package/themes/base/_sections/about/principles/section.json5 +34 -0
- package/themes/base/_sections/about/timeline/section.html +20 -0
- package/themes/base/_sections/about/timeline/section.json5 +34 -0
- package/themes/base/_sections/marketing/bento/section.html +91 -0
- package/themes/base/_sections/marketing/bento/section.json5 +152 -0
- package/themes/base/_sections/marketing/cta/section.html +44 -0
- package/themes/base/_sections/marketing/cta/section.json5 +47 -0
- package/themes/base/_sections/marketing/faq/section.html +52 -0
- package/themes/base/_sections/marketing/faq/section.json5 +68 -0
- package/themes/base/_sections/marketing/hero/section.html +349 -0
- package/themes/base/_sections/marketing/hero/section.json5 +335 -0
- package/themes/base/_sections/marketing/newsletter-cta/section.html +38 -0
- package/themes/base/_sections/marketing/newsletter-cta/section.js +86 -0
- package/themes/base/_sections/marketing/newsletter-cta/section.json5 +29 -0
- package/themes/base/_sections/marketing/pricing-cards/section.html +115 -0
- package/themes/base/_sections/marketing/pricing-cards/section.json5 +72 -0
- package/themes/base/_sections/marketing/product-demo/section.html +62 -0
- package/themes/base/_sections/marketing/product-demo/section.js +44 -0
- package/themes/base/_sections/marketing/product-demo/section.json5 +52 -0
- package/themes/base/_sections/marketing/prose/section.html +22 -0
- package/themes/base/_sections/marketing/prose/section.json5 +41 -0
- package/themes/base/_sections/marketing/showcase/section.html +35 -0
- package/themes/base/_sections/marketing/showcase/section.json5 +52 -0
- package/themes/base/_sections/marketing/stats/section.html +32 -0
- package/themes/base/_sections/marketing/stats/section.json5 +44 -0
- package/themes/base/_sections/marketing/testimonials/section.html +54 -0
- package/themes/base/_sections/marketing/testimonials/section.json5 +70 -0
- package/themes/base/_sections/marketing/trusted-by/section.html +30 -0
- package/themes/base/_sections/marketing/trusted-by/section.json5 +38 -0
- package/themes/base/_sections/verts/unit/section.html +7 -0
- package/themes/base/_sections/verts/unit/section.js +22 -0
- package/themes/base/_sections/verts/unit/section.json5 +24 -0
- package/themes/base/_sections/verts/unit/section.scss +24 -0
- package/themes/base/_theme.js +13 -0
- package/themes/base/_theme.scss +4 -0
- package/themes/bootstrap/_theme.js +16 -0
- package/themes/bootstrap/_theme.scss +11 -0
- package/themes/bootstrap/js/index.esm.js +19 -0
- package/themes/bootstrap/js/index.umd.js +34 -0
- package/themes/bootstrap/js/src/alert.js +87 -0
- package/themes/bootstrap/js/src/base-component.js +86 -0
- package/themes/bootstrap/js/src/button.js +72 -0
- package/themes/bootstrap/js/src/carousel.js +474 -0
- package/themes/bootstrap/js/src/collapse.js +297 -0
- package/themes/bootstrap/js/src/dom/data.js +55 -0
- package/themes/bootstrap/js/src/dom/event-handler.js +317 -0
- package/themes/bootstrap/js/src/dom/manipulator.js +71 -0
- package/themes/bootstrap/js/src/dom/selector-engine.js +126 -0
- package/themes/bootstrap/js/src/dropdown.js +458 -0
- package/themes/bootstrap/js/src/modal.js +378 -0
- package/themes/bootstrap/js/src/offcanvas.js +282 -0
- package/themes/bootstrap/js/src/popover.js +97 -0
- package/themes/bootstrap/js/src/scrollspy.js +296 -0
- package/themes/bootstrap/js/src/tab.js +315 -0
- package/themes/bootstrap/js/src/toast.js +224 -0
- package/themes/bootstrap/js/src/tooltip.js +632 -0
- package/themes/bootstrap/js/src/util/backdrop.js +151 -0
- package/themes/bootstrap/js/src/util/component-functions.js +35 -0
- package/themes/bootstrap/js/src/util/config.js +65 -0
- package/themes/bootstrap/js/src/util/focustrap.js +115 -0
- package/themes/bootstrap/js/src/util/index.js +306 -0
- package/themes/bootstrap/js/src/util/sanitizer.js +117 -0
- package/themes/bootstrap/js/src/util/scrollbar.js +114 -0
- package/themes/bootstrap/js/src/util/swipe.js +146 -0
- package/themes/bootstrap/js/src/util/template-factory.js +160 -0
- package/themes/bootstrap/overrides/_accordion.scss +21 -0
- package/themes/bootstrap/overrides/_avatars.scss +51 -0
- package/themes/bootstrap/overrides/_blog-images.scss +45 -0
- package/themes/bootstrap/overrides/_buttons-adaptive.scss +141 -0
- package/themes/bootstrap/overrides/_color-shades.scss +25 -0
- package/themes/bootstrap/overrides/_cursor-utilities.scss +13 -0
- package/themes/bootstrap/overrides/_index.scss +30 -0
- package/themes/bootstrap/overrides/_links.scss +26 -0
- package/themes/bootstrap/overrides/_soft-colors.scss +99 -0
- package/themes/bootstrap/overrides/_spacing-extended.scss +74 -0
- package/themes/bootstrap/overrides/_spinners.scss +22 -0
- package/themes/bootstrap/overrides/_typography-utilities.scss +40 -0
- package/themes/bootstrap/scss/_accordion.scss +153 -0
- package/themes/bootstrap/scss/_alert.scss +68 -0
- package/themes/bootstrap/scss/_badge.scss +38 -0
- package/themes/bootstrap/scss/_breadcrumb.scss +40 -0
- package/themes/bootstrap/scss/_button-group.scss +147 -0
- package/themes/bootstrap/scss/_buttons.scss +216 -0
- package/themes/bootstrap/scss/_card.scss +238 -0
- package/themes/bootstrap/scss/_carousel.scss +226 -0
- package/themes/bootstrap/scss/_close.scss +66 -0
- package/themes/bootstrap/scss/_containers.scss +41 -0
- package/themes/bootstrap/scss/_dropdown.scss +250 -0
- package/themes/bootstrap/scss/_forms.scss +9 -0
- package/themes/bootstrap/scss/_functions.scss +302 -0
- package/themes/bootstrap/scss/_grid.scss +39 -0
- package/themes/bootstrap/scss/_helpers.scss +12 -0
- package/themes/bootstrap/scss/_images.scss +42 -0
- package/themes/bootstrap/scss/_list-group.scss +199 -0
- package/themes/bootstrap/scss/_maps.scss +174 -0
- package/themes/bootstrap/scss/_mixins.scss +42 -0
- package/themes/bootstrap/scss/_modal.scss +240 -0
- package/themes/bootstrap/scss/_nav.scss +197 -0
- package/themes/bootstrap/scss/_navbar.scss +289 -0
- package/themes/bootstrap/scss/_offcanvas.scss +147 -0
- package/themes/bootstrap/scss/_pagination.scss +109 -0
- package/themes/bootstrap/scss/_placeholders.scss +51 -0
- package/themes/bootstrap/scss/_popover.scss +196 -0
- package/themes/bootstrap/scss/_progress.scss +68 -0
- package/themes/bootstrap/scss/_reboot.scss +611 -0
- package/themes/bootstrap/scss/_root.scss +187 -0
- package/themes/bootstrap/scss/_spinners.scss +85 -0
- package/themes/bootstrap/scss/_tables.scss +171 -0
- package/themes/bootstrap/scss/_toasts.scss +73 -0
- package/themes/bootstrap/scss/_tooltip.scss +119 -0
- package/themes/bootstrap/scss/_transitions.scss +27 -0
- package/themes/bootstrap/scss/_type.scss +106 -0
- package/themes/bootstrap/scss/_utilities.scss +806 -0
- package/themes/bootstrap/scss/_variables-dark.scss +102 -0
- package/themes/bootstrap/scss/_variables.scss +1753 -0
- package/themes/bootstrap/scss/bootstrap-grid.scss +62 -0
- package/themes/bootstrap/scss/bootstrap-reboot.scss +10 -0
- package/themes/bootstrap/scss/bootstrap-utilities.scss +19 -0
- package/themes/bootstrap/scss/bootstrap.scss +52 -0
- package/themes/bootstrap/scss/forms/_floating-labels.scss +97 -0
- package/themes/bootstrap/scss/forms/_form-check.scss +189 -0
- package/themes/bootstrap/scss/forms/_form-control.scss +214 -0
- package/themes/bootstrap/scss/forms/_form-range.scss +91 -0
- package/themes/bootstrap/scss/forms/_form-select.scss +80 -0
- package/themes/bootstrap/scss/forms/_form-text.scss +11 -0
- package/themes/bootstrap/scss/forms/_input-group.scss +132 -0
- package/themes/bootstrap/scss/forms/_labels.scss +36 -0
- package/themes/bootstrap/scss/forms/_validation.scss +12 -0
- package/themes/bootstrap/scss/helpers/_clearfix.scss +3 -0
- package/themes/bootstrap/scss/helpers/_color-bg.scss +7 -0
- package/themes/bootstrap/scss/helpers/_colored-links.scss +30 -0
- package/themes/bootstrap/scss/helpers/_focus-ring.scss +5 -0
- package/themes/bootstrap/scss/helpers/_icon-link.scss +25 -0
- package/themes/bootstrap/scss/helpers/_position.scss +36 -0
- package/themes/bootstrap/scss/helpers/_ratio.scss +26 -0
- package/themes/bootstrap/scss/helpers/_stacks.scss +15 -0
- package/themes/bootstrap/scss/helpers/_stretched-link.scss +15 -0
- package/themes/bootstrap/scss/helpers/_text-truncation.scss +7 -0
- package/themes/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
- package/themes/bootstrap/scss/helpers/_vr.scss +8 -0
- package/themes/bootstrap/scss/mixins/_alert.scss +18 -0
- package/themes/bootstrap/scss/mixins/_backdrop.scss +14 -0
- package/themes/bootstrap/scss/mixins/_banner.scss +7 -0
- package/themes/bootstrap/scss/mixins/_border-radius.scss +78 -0
- package/themes/bootstrap/scss/mixins/_box-shadow.scss +18 -0
- package/themes/bootstrap/scss/mixins/_breakpoints.scss +127 -0
- package/themes/bootstrap/scss/mixins/_buttons.scss +70 -0
- package/themes/bootstrap/scss/mixins/_caret.scss +69 -0
- package/themes/bootstrap/scss/mixins/_clearfix.scss +9 -0
- package/themes/bootstrap/scss/mixins/_color-mode.scss +21 -0
- package/themes/bootstrap/scss/mixins/_color-scheme.scss +7 -0
- package/themes/bootstrap/scss/mixins/_container.scss +11 -0
- package/themes/bootstrap/scss/mixins/_deprecate.scss +10 -0
- package/themes/bootstrap/scss/mixins/_forms.scss +163 -0
- package/themes/bootstrap/scss/mixins/_gradients.scss +47 -0
- package/themes/bootstrap/scss/mixins/_grid.scss +151 -0
- package/themes/bootstrap/scss/mixins/_image.scss +16 -0
- package/themes/bootstrap/scss/mixins/_list-group.scss +26 -0
- package/themes/bootstrap/scss/mixins/_lists.scss +7 -0
- package/themes/bootstrap/scss/mixins/_pagination.scss +10 -0
- package/themes/bootstrap/scss/mixins/_reset-text.scss +17 -0
- package/themes/bootstrap/scss/mixins/_resize.scss +6 -0
- package/themes/bootstrap/scss/mixins/_table-variants.scss +24 -0
- package/themes/bootstrap/scss/mixins/_text-truncate.scss +8 -0
- package/themes/bootstrap/scss/mixins/_transition.scss +26 -0
- package/themes/bootstrap/scss/mixins/_utilities.scss +97 -0
- package/themes/bootstrap/scss/mixins/_visually-hidden.scss +38 -0
- package/themes/bootstrap/scss/tests/jasmine.js +16 -0
- package/themes/bootstrap/scss/tests/mixins/_auto-import-of-variables-dark.test.scss +7 -0
- package/themes/bootstrap/scss/tests/mixins/_color-modes.test.scss +69 -0
- package/themes/bootstrap/scss/tests/mixins/_media-query-color-mode-full.test.scss +8 -0
- package/themes/bootstrap/scss/tests/mixins/_utilities.test.scss +393 -0
- package/themes/bootstrap/scss/tests/sass-true/register.js +14 -0
- package/themes/bootstrap/scss/tests/sass-true/runner.js +17 -0
- package/themes/bootstrap/scss/tests/utilities/_api.test.scss +75 -0
- package/themes/bootstrap/scss/utilities/_api.scss +47 -0
- package/themes/bootstrap/scss/vendor/_rfs.scss +348 -0
- package/themes/classy/README.md +89 -0
- package/themes/classy/_config.scss +245 -0
- package/themes/classy/_theme.js +31 -0
- package/themes/classy/_theme.scss +57 -0
- package/themes/classy/css/app/_panels.scss +183 -0
- package/themes/classy/css/base/_fonts.scss +79 -0
- package/themes/classy/css/base/_no-raise.scss +49 -0
- package/themes/classy/css/base/_root.scss +113 -0
- package/themes/classy/css/base/_typography.scss +154 -0
- package/themes/classy/css/base/_utilities.scss +284 -0
- package/themes/classy/css/components/_alerts.scss +51 -0
- package/themes/classy/css/components/_badges.scss +46 -0
- package/themes/classy/css/components/_buttons.scss +175 -0
- package/themes/classy/css/components/_cards.scss +41 -0
- package/themes/classy/css/components/_dropdowns.scss +48 -0
- package/themes/classy/css/components/_forms.scss +171 -0
- package/themes/classy/css/components/_receipt.scss +45 -0
- package/themes/classy/css/layout/_footer.scss +298 -0
- package/themes/classy/css/layout/_general.scss +209 -0
- package/themes/classy/css/layout/_nav.scss +154 -0
- package/themes/classy/css/layout/_shell.scss +458 -0
- package/themes/classy/css/marketing/_bento.scss +238 -0
- package/themes/classy/css/marketing/_content.scss +1328 -0
- package/themes/classy/css/marketing/_downloads.scss +246 -0
- package/themes/classy/css/marketing/_hero.scss +311 -0
- package/themes/classy/css/marketing/_sections.scss +649 -0
- package/themes/classy/css/pages/404/index.scss +67 -0
- package/themes/classy/css/pages/_auth.scss +235 -0
- package/themes/classy/css/pages/admin/firebase/index.scss +22 -0
- package/themes/classy/css/pages/blog/[slug].scss +56 -0
- package/themes/classy/css/pages/cookies.scss +2 -0
- package/themes/classy/css/pages/dashboard/account/index.scss +31 -0
- package/themes/classy/css/pages/feedback/index.scss +39 -0
- package/themes/classy/css/pages/legal/_document.scss +192 -0
- package/themes/classy/css/pages/payment/checkout/index.scss +585 -0
- package/themes/classy/css/pages/payment/confirmation/index.scss +9 -0
- package/themes/classy/css/pages/privacy.scss +2 -0
- package/themes/classy/css/pages/status/index.scss +164 -0
- package/themes/classy/css/pages/terms.scss +2 -0
- package/themes/classy/css/pages/updates/index.scss +128 -0
- package/themes/classy/fonts/inter-italic-latin-ext.woff2 +0 -0
- package/themes/classy/fonts/inter-italic-latin.woff2 +0 -0
- package/themes/classy/fonts/inter-normal-latin-ext.woff2 +0 -0
- package/themes/classy/fonts/inter-normal-latin.woff2 +0 -0
- package/themes/classy/fonts/newsreader-italic-latin-ext.woff2 +0 -0
- package/themes/classy/fonts/newsreader-italic-latin.woff2 +0 -0
- package/themes/classy/fonts/newsreader-normal-latin-ext.woff2 +0 -0
- package/themes/classy/fonts/newsreader-normal-latin.woff2 +0 -0
- package/themes/classy/js/hero-demo-form.js +56 -0
- package/themes/neobrutalism/README.md +118 -0
- package/themes/neobrutalism/_config.scss +139 -0
- package/themes/neobrutalism/_layouts/frontend/core/base.html +30 -0
- package/themes/neobrutalism/_layouts/frontend/pages/index.html +275 -0
- package/themes/neobrutalism/_theme.js +24 -0
- package/themes/neobrutalism/_theme.scss +61 -0
- package/themes/neobrutalism/css/base/_mixins.scss +46 -0
- package/themes/neobrutalism/css/base/_root.scss +169 -0
- package/themes/neobrutalism/css/base/_typography.scss +61 -0
- package/themes/neobrutalism/css/base/_utilities.scss +89 -0
- package/themes/neobrutalism/css/components/_billing-toggle.scss +74 -0
- package/themes/neobrutalism/css/components/_buttons.scss +148 -0
- package/themes/neobrutalism/css/components/_cards.scss +47 -0
- package/themes/neobrutalism/css/components/_forms.scss +88 -0
- package/themes/neobrutalism/css/components/_marketing.scss +244 -0
- package/themes/neobrutalism/css/layout/_general.scss +213 -0
- package/themes/neobrutalism/css/layout/_navigation.scss +171 -0
- package/themes/neobrutalism/css/pages/index.scss +203 -0
- package/themes/neobrutalism/css/pages/pricing/index.scss +58 -0
- package/themes/neobrutalism/css/pages/test/libraries/layers/index.scss +7 -0
- package/themes/neobrutalism/js/pages/test/libraries/layers/index.js +9 -0
- package/themes/newsflash/README.md +117 -0
- package/themes/newsflash/_components/heading/lede/component.html +14 -0
- package/themes/newsflash/_components/heading/lede/component.json5 +23 -0
- package/themes/newsflash/_components/heading/rule-head/component.html +17 -0
- package/themes/newsflash/_components/heading/rule-head/component.json5 +23 -0
- package/themes/newsflash/_components/news/byline/component.html +12 -0
- package/themes/newsflash/_components/news/byline/component.json5 +18 -0
- package/themes/newsflash/_components/news/story-card/component.html +25 -0
- package/themes/newsflash/_components/news/story-card/component.json5 +21 -0
- package/themes/newsflash/_config.scss +147 -0
- package/themes/newsflash/_layouts/frontend/core/base.html +51 -0
- package/themes/newsflash/_layouts/frontend/pages/blog/index.html +299 -0
- package/themes/newsflash/_layouts/frontend/pages/blog/post.html +235 -0
- package/themes/newsflash/_layouts/frontend/pages/index.html +328 -0
- package/themes/newsflash/_sections/marketing/desks/section.html +39 -0
- package/themes/newsflash/_sections/marketing/desks/section.json5 +49 -0
- package/themes/newsflash/_sections/marketing/newsletter-cta/section.html +103 -0
- package/themes/newsflash/_sections/marketing/newsletter-cta/section.json5 +50 -0
- package/themes/newsflash/_sections/marketing/rundown/section.html +28 -0
- package/themes/newsflash/_sections/marketing/rundown/section.json5 +40 -0
- package/themes/newsflash/_theme.js +24 -0
- package/themes/newsflash/_theme.scss +70 -0
- package/themes/newsflash/css/base/_fonts.scss +80 -0
- package/themes/newsflash/css/base/_mixins.scss +51 -0
- package/themes/newsflash/css/base/_root.scss +257 -0
- package/themes/newsflash/css/base/_typography.scss +49 -0
- package/themes/newsflash/css/base/_utilities.scss +122 -0
- package/themes/newsflash/css/components/_badges.scss +65 -0
- package/themes/newsflash/css/components/_billing-toggle.scss +61 -0
- package/themes/newsflash/css/components/_buttons.scss +139 -0
- package/themes/newsflash/css/components/_cards.scss +47 -0
- package/themes/newsflash/css/components/_editorial.scss +173 -0
- package/themes/newsflash/css/components/_forms.scss +75 -0
- package/themes/newsflash/css/components/_infinite-scroll.scss +102 -0
- package/themes/newsflash/css/components/_panels.scss +156 -0
- package/themes/newsflash/css/components/_ticker.scss +67 -0
- package/themes/newsflash/css/layout/_general.scss +330 -0
- package/themes/newsflash/css/layout/_navigation.scss +168 -0
- package/themes/newsflash/css/pages/404/index.scss +79 -0
- package/themes/newsflash/css/pages/blog/[slug].scss +186 -0
- package/themes/newsflash/css/pages/blog/index.scss +17 -0
- package/themes/newsflash/css/pages/index.scss +157 -0
- package/themes/newsflash/css/pages/pricing/index.scss +55 -0
- package/themes/newsflash/css/pages/test/libraries/layers/index.scss +7 -0
- package/themes/newsflash/fonts/fraunces-italic-latin-ext.woff2 +0 -0
- package/themes/newsflash/fonts/fraunces-italic-latin.woff2 +0 -0
- package/themes/newsflash/fonts/fraunces-normal-latin-ext.woff2 +0 -0
- package/themes/newsflash/fonts/fraunces-normal-latin.woff2 +0 -0
- package/themes/newsflash/fonts/schibsted-grotesk-italic-latin-ext.woff2 +0 -0
- package/themes/newsflash/fonts/schibsted-grotesk-italic-latin.woff2 +0 -0
- package/themes/newsflash/fonts/schibsted-grotesk-normal-latin-ext.woff2 +0 -0
- package/themes/newsflash/fonts/schibsted-grotesk-normal-latin.woff2 +0 -0
- package/themes/newsflash/js/pages/blog/[slug].js +29 -0
- package/themes/newsflash/js/pages/test/libraries/layers/index.js +9 -0
- package/translations/es/pages/404.json +86 -0
- package/translations/es/pages/account.json +36 -0
- package/translations/es/pages/app.json +44 -0
- package/translations/es/pages/cancel.json +36 -0
- package/translations/es/pages/change-password.json +36 -0
- package/translations/es/pages/connections/callback.json +41 -0
- package/translations/es/pages/dashboard/account.json +475 -0
- package/translations/es/pages/dashboard.json +36 -0
- package/translations/es/pages/forgot.json +36 -0
- package/translations/es/pages/join.json +36 -0
- package/translations/es/pages/login.json +36 -0
- package/translations/es/pages/payment/checkout.json +83 -0
- package/translations/es/pages/payment/confirmation.json +62 -0
- package/translations/es/pages/portal/email-preferences.json +46 -0
- package/translations/es/pages/recover.json +36 -0
- package/translations/es/pages/refund.json +36 -0
- package/translations/es/pages/register.json +36 -0
- package/translations/es/pages/reset-password.json +36 -0
- package/translations/es/pages/reset.json +42 -0
- package/translations/es/pages/signin.json +45 -0
- package/translations/es/pages/signup.json +60 -0
- package/translations/es/pages/token.json +39 -0
- package/translations/fa/pages/404.json +86 -0
- package/translations/fa/pages/account.json +36 -0
- package/translations/fa/pages/app.json +44 -0
- package/translations/fa/pages/cancel.json +36 -0
- package/translations/fa/pages/change-password.json +36 -0
- package/translations/fa/pages/connections/callback.json +41 -0
- package/translations/fa/pages/dashboard/account.json +475 -0
- package/translations/fa/pages/dashboard.json +36 -0
- package/translations/fa/pages/forgot.json +36 -0
- package/translations/fa/pages/join.json +36 -0
- package/translations/fa/pages/login.json +36 -0
- package/translations/fa/pages/payment/checkout.json +83 -0
- package/translations/fa/pages/payment/confirmation.json +62 -0
- package/translations/fa/pages/portal/email-preferences.json +46 -0
- package/translations/fa/pages/recover.json +36 -0
- package/translations/fa/pages/refund.json +36 -0
- package/translations/fa/pages/register.json +36 -0
- package/translations/fa/pages/reset-password.json +36 -0
- package/translations/fa/pages/reset.json +42 -0
- package/translations/fa/pages/signin.json +45 -0
- package/translations/fa/pages/signup.json +60 -0
- package/translations/fa/pages/token.json +39 -0
package/README.md
ADDED
|
@@ -0,0 +1,640 @@
|
|
|
1
|
+
# @omega.js/web
|
|
2
|
+
|
|
3
|
+
The OMEGA web framework — the UJM (Jekyll) successor, built on **Eleventy 3 +
|
|
4
|
+
LiquidJS + [@omega.js/template-kit](../template-kit)** per the Phase 2 bake-off
|
|
5
|
+
decision ([_attic/spikes/bakeoff-shared/DECISION.md](../../_attic/spikes/bakeoff-shared/DECISION.md) — the bake-off trees retired to the local `_attic/`, out of git:
|
|
6
|
+
Eleventy 4.70 vs Astro 3.55 weighted). B1 promoted the engine core from the
|
|
7
|
+
winning spike; **B2 ported the REAL UJM content** — the full blueprint layout
|
|
8
|
+
set, 3 Liquid themes + the bootstrap asset layer, ~60 default pages, and the
|
|
9
|
+
real core chrome (head/body/foot) — through the B4 codemod rules. **B3 added
|
|
10
|
+
the `omega` CLI, consumer scaffolding, the ESM boot runtime, and the Ruby-free
|
|
11
|
+
CI template. B4 made the conversion plan executable: `omega migrate` (legacy
|
|
12
|
+
configs → omega.json5, the codemod rule table over `src/**`, the liquid-lint
|
|
13
|
+
scanner, legacy-file removal) — live-proven on real consumers (somiibo:
|
|
14
|
+
migrate → 2,556 pages, ~3.2× the whole Jekyll pipeline).**
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
# In a consumer project (scaffolded scripts call these):
|
|
18
|
+
npx omega dev # dev server: Eleventy watch/serve + in-place asset rebuilds
|
|
19
|
+
# port: website convention 4000, auto-bumps +1 when taken (N7);
|
|
20
|
+
# --port=N or config ports.website PINS it (busy = hard error)
|
|
21
|
+
# HTTPS by default via mkcert (https://localhost:4000; Eleventy
|
|
22
|
+
# serves an internal port behind the TLS proxy, live-reload WS
|
|
23
|
+
# tunneled; plain http://localhost:4000 307s to https) —
|
|
24
|
+
# --no-https or no mkcert falls back to plain http
|
|
25
|
+
# and site.url follows the scheme (canonical/og stay honest)
|
|
26
|
+
# dev pages auto-connect the REAL Auth+Firestore SDKs to the local
|
|
27
|
+
# emulators (zero flags; never live Firebase) — start them from the
|
|
28
|
+
# brand's backend app: `npx omega emulator`. A live backend's
|
|
29
|
+
# resolved (possibly bumped) ports reach the page via the injected
|
|
30
|
+
# dev.ports chrome, so the browser always targets THIS brand's stack
|
|
31
|
+
# --local: first link every @omega.js dep brand-wide from the local
|
|
32
|
+
# Omega monorepo + start its src→dist watch (docs/shared/local-dev.md there)
|
|
33
|
+
npx omega build # production: assets (hashed, @dev-only blocks stripped) → Eleventy → PurgeCSS → Firebase auth helpers (/__/auth/*) → dist/
|
|
34
|
+
# the auth-helper fetch fails the build loudly on error (demo-*/projectless brands skip); escape hatch: OMEGA_SKIP_FIREBASE_AUTH=true
|
|
35
|
+
npx omega test # PROJECT scope: production build + smoke checks + consumer test/
|
|
36
|
+
# framework:/omega:/web: = @omega.js/web's own suite; full: = both
|
|
37
|
+
# (C5 scoping — docs/shared/testing.md in the Omega repo)
|
|
38
|
+
npx omega deploy # THE publish verb (D13): sync (push triggers nothing) → dispatch
|
|
39
|
+
# build.yml so CI builds + publishes; --dry-run prints the exact
|
|
40
|
+
# POST, --local builds only (docs/shared/deploys.md in the Omega repo)
|
|
41
|
+
npx omega update # dependency freshness (npu semantics): installed/wanted/latest +
|
|
42
|
+
# patch/minor/major per dep; releases < 7 days old QUARANTINED
|
|
43
|
+
# --apply installs the non-breaking non-quarantined set via npu
|
|
44
|
+
# (--major explicit; --min-age N / --force-fresh tune the hold;
|
|
45
|
+
# file: specs skipped — docs/shared/updates.md in the Omega repo)
|
|
46
|
+
npx omega customize <url> # materialize a default page into src/pages/ (spec §8):
|
|
47
|
+
# composition-wrapped pages prefill the theme's section
|
|
48
|
+
# one-liners (no copy inlined — sections keep flowing),
|
|
49
|
+
# everything else copies the thin default verbatim for
|
|
50
|
+
# frontmatter-args customization; no URL lists every
|
|
51
|
+
# customizable URL + lane (docs/web/sections.md in the Omega repo)
|
|
52
|
+
npx omega customize --list # the layered override map: every shadowable file
|
|
53
|
+
# (sections, includes, css, pages), its owning layer
|
|
54
|
+
# (framework / theme:<id> / consumer), and whether you
|
|
55
|
+
# already shadow it
|
|
56
|
+
npx omega customize <path> # materialize ONE shadowable file at the path that
|
|
57
|
+
# shadows it (`_includes/…`, `_sections/…`, `assets/css/…`
|
|
58
|
+
# — exactly what --list prints), with a provenance header
|
|
59
|
+
# comment naming the source layer; never overwrites
|
|
60
|
+
npx omega clean # remove dist/ + .omega/
|
|
61
|
+
npx omega version # framework version
|
|
62
|
+
npx omega help # command listing (also -h/--help; router built-in — never
|
|
63
|
+
# falls through to setup like the old flag handling did)
|
|
64
|
+
npx omega migrate # UJM (Jekyll) consumer → @omega.js/web, in place
|
|
65
|
+
npx omega migrate --check # full report (config + codemod preview + lint), zero writes
|
|
66
|
+
npx omega translate # translate dist/ into translation.languages (committed cache;
|
|
67
|
+
# `omega build` runs it automatically when enabled — see
|
|
68
|
+
# docs/shared/translation.md in the Omega repo)
|
|
69
|
+
npx omega audit # production build → dist/ served on an ephemeral port →
|
|
70
|
+
# Lighthouse on the home page; report-only. Each page
|
|
71
|
+
# prints the four scores plus LCP, CLS and the form
|
|
72
|
+
# factor the run emulated (Lighthouse's default is
|
|
73
|
+
# mobile on Slow 4G, the shape PSI reports)
|
|
74
|
+
npx omega audit /pricing --min-performance=90
|
|
75
|
+
# extra pages as args; --min-<category> arms the gate
|
|
76
|
+
# (performance/accessibility/best-practices/seo) —
|
|
77
|
+
# any score under its minimum exits 1
|
|
78
|
+
npx omega audit --max-lcp=1300
|
|
79
|
+
# the 1.3 s perceived-usability bar (the end of the hero fade):
|
|
80
|
+
# any page whose LCP is over the stated ms fails and exits 1
|
|
81
|
+
|
|
82
|
+
npm test # engine slice + assets/ESM + CLI/scaffold + migrate + ports + theme contract + translate
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
A bare consumer (`omega build` in an empty dir, edit brand in
|
|
86
|
+
config/omega.json5) builds the full ~56-page default set in under 2 s.
|
|
87
|
+
|
|
88
|
+
Corpus-scale benching lives in [_attic/spikes/bakeoff-eleventy](../../_attic/spikes/bakeoff-eleventy)
|
|
89
|
+
(the promoted spike, now a thin harness). With the REAL content the corpus
|
|
90
|
+
(1,135 docs → 1,397 pages incl. the full default set) builds in ~20 s total —
|
|
91
|
+
see the harness README for the honest before/after numbers.
|
|
92
|
+
|
|
93
|
+
## Module map (`src/`)
|
|
94
|
+
|
|
95
|
+
| Module | Owns |
|
|
96
|
+
|--------|------|
|
|
97
|
+
| [engine.js](src/engine.js) | `configureOmega()` — turns an Eleventy instance into the OMEGA engine: Liquid options + template-kit registration, layered layouts, frontmatter preprocessor, `resolved`/`paginator`/`pageAssets` computed data, site collections, default pages, globals |
|
|
98
|
+
| [collections.js](src/collections.js) | posts / alternatives / team / updates collections + taxonomy aggregation (deterministic date-desc, slug tie-break order), and the same registration for the brand's own collections |
|
|
99
|
+
| [dynamic-pages.js](src/dynamic-pages.js) | Dynamic pages, the jekyll-uj-powertools dynamic-pages successor: `targets.web.collections` declares a brand's own collection (`docs: { field: 'doc.category', size, title, description, permalink }`), its documents live in `_docs/` and publish at `/docs/<slug>`, and the engine generates the paginated listing (`/docs`, `/docs/2…`) plus one page per category of `field` (`/docs/categories/<slug>`) as virtual templates on the default-page lane — a consumer page at any of those permalinks takes that URL over. The documents are consumer FILES, so they are served at data time instead: each one gets the same `collection` block its generated siblings carry, plus its own `meta.title` (`<Document> - <Collection> - <Brand>`) and `meta.description` derived from the document's own frontmatter, and `blueprint/collection/document` is the layout that renders it (masthead h1 + prose, the listing/category siblings' shape) |
|
|
100
|
+
| [social-pages.js](src/social-pages.js) | Social shortlinks (#429), legacy UJM's per-social redirect pages: every entry of the `socials` config block generates a redirect page at `/<platform>` on the `modules/utilities/redirect` layout, as a virtual template on the default-page lane — so a consumer page at `/<platform>` takes that URL over, and the layout's own noindex + sitemap exclusion apply. The string form is a handle whose profile URL (template-kit's platform patterns, the same ones `omega_social` and JSON-LD `sameAs` read) IS the destination; the object form `{ handle, redirect }` sends the shortlink somewhere else while the handle keeps naming the profile. Nowhere to point (blank handle, or an unknown platform with no `redirect`) generates nothing; a malformed entry is a hard error |
|
|
101
|
+
| [markdown-images.js](src/markdown-images.js) | Markdown `` renders through template-kit's `buildImageHtml` (the `omega_image` builder — one image-markup SSOT): responsive `<picture>` + lazy placeholder for local raster images, the plain lazy `<img>` lane for external or non-raster sources. `@post/<file>` resolves to `/assets/images/blog/post-<post.id>/<file>`; used off a post it FAILS the build naming the file. Note: feeds embed the rendered (lazy) markup, so feed readers see the placeholder — legacy parity |
|
|
102
|
+
| [limit-collections.js](src/limit-collections.js) | Dev-mode collection sampling (`targets.web.dev.limitCollections`, the jekyll-uj-powertools limit-collections successor): first-N in collection order, or a random sample with `randomize: true`; the sampled-out documents are skipped before render, so they cost no pages, collection entries or taxonomy terms. Development builds only, loud on every build; the config is validated in production too, where nothing is ever sampled |
|
|
103
|
+
| [layouts.js](src/layouts.js) | Layered layout delivery, zero copying: virtual templates (build) / symlink farm (dev, watchable) |
|
|
104
|
+
| [layers.js](src/layers.js) | `collectLayered()` — first-layer-wins file resolution (themes, page modules, default pages) — over `collectProviders()`, which keeps every layer that provides a path (what the override map reports as shadowed) |
|
|
105
|
+
| [language-flags.js](src/language-flags.js) | The language-named flag aliases in the emitted icon set (`assets/icons/flags/lang/en.svg` = the us flag; their own namespace because `ar`/`ca` name both a language and a country), so the client-side footer language switcher fetches a flag by the row's own hreflang code — the language→country map stays `@omega.js/template-kit`'s |
|
|
106
|
+
| [frontmatter-liquid.js](src/frontmatter-liquid.js) | Frontmatter-value Liquid — a value's variable ROOTS pick its lane (cached site-scope renders; page-scoped values, the page's pagination alias included, defer to a per-page copy-on-write pass; everything else renders uncached against the template's own cascade, so the consumer's `_data` globals resolve; a `meta:` ref with an undefined root fails the build; the context-free `omega_*` filters are registered, since LiquidJS drops an unknown filter silently) |
|
|
107
|
+
| [consumer-scan.js](src/consumer-scan.js) | Consumer permalink scan → default-page suppression |
|
|
108
|
+
| [sections.js](src/sections.js) | The section/component library: `{% section %}`/`{% component %}` tags (layered resolution, json5 schemas/defaults, data bridge, call-site liquification), `buildSectionLibrary()` (the showcase/docs collector), `collectSectionAssets()` (§7 lanes), and the `{% composition %}` page-body guard (docs/web/sections.md in the Omega repo) |
|
|
109
|
+
| [customize.js](src/customize.js) | `omega customize <url>` mechanics (spec §8): default-URL → materialization plan (composition lane prefills the theme's wrapped one-liners, shell lane copies the thin default verbatim), idempotent writes, `listCustomizable()` |
|
|
110
|
+
| [overrides.js](src/overrides.js) | The layered override map (#94): `buildOverrideMap()` — every shadowable section/include/css/page with its owning layer and the consumer's shadows, read out of the SAME layer chains the build resolves through (`collectProviders`), and `materializeOverride()` — one file copied to its shadow path with a provenance header. The css lane lists ONLY what sass layers by — `main.scss` and the page sheets (`isPageEntry`, base bucket) — never the partials a bare relative `@use` resolves against the importing file, which a consumer copy could never win |
|
|
111
|
+
| [assets.js](src/assets.js) | esbuild page modules + main bundle over LAYER ROOTS (boot stubs, `@omega.js/client` → @omega.js/client dir alias, `__main_assets__`/`__theme__` resolution), layered sass (`omega:theme`), page css namespaces, layered `fonts/` → `/assets/fonts` copy, PurgeCSS post-pass (content scan = `dist/**/*.html` + `dist/**/*.js`, so classes that live only in JS-built markup survive — #66), critical-css extraction (the first-paint subset the head inlines so the main sheet stops render-blocking, #750) |
|
|
112
|
+
| [path-prefix.js](src/path-prefix.js) | Base-path support (#355): `resolvePathPrefix()` normalizes the publisher's `OMEGA_PATH_PREFIX`, and the emit lanes mount root-relative URLs under it — `prefixHtml()` (the engine's `omega-path-prefix` transform: href/src/srcset/action plus the `<html data-omega-path-prefix>` stamp the browser half reads) and `prefixCss()` (the theme sheets' `url()` targets). Unset = no pass runs |
|
|
113
|
+
| [service-worker.js](src/service-worker.js) | `buildServiceWorker()` — esbuild iife bundle of the consumer's `src/service-worker.js` (or the packaged `sw/entry.js`) to dist root `/service-worker.js`; `writeBuildMeta()` — the build manifest at `/build.js` (JSONP config transport for the worker) + `/build.json` (page-side; the client version check reads `timestamp`, the `/status` page shows the rest: theme, package versions, repo, commit) |
|
|
114
|
+
| [build.js](src/build.js) | `buildSite()` — assets → service worker/meta → static → imagemin → Eleventy → PurgeCSS orchestration with per-phase timings (what `omega build` runs) |
|
|
115
|
+
| [imagemin.js](src/imagemin.js) | Responsive image matrix (the UJM imagemin successor): 320/640/1024 + original × source-format + webp @ q80 over `dist/assets/images` (favicon dir exempt), content-addressed cache at the brand `.omega`, `devImageFallback()` dev-server middleware |
|
|
116
|
+
| [inline-icons.js](src/inline-icons.js) | Build-time icon inlining ([#619](https://github.com/Omega-JS-Stack/omega/issues/619)): the engine's `omega-inline-icons` transform fills every empty `<i>` whose classes name an icon — Font Awesome or the `omega-flag-*` namespace — with that icon's SVG, in markup byte-identical to what the runtime watcher (`runtime/icons.js`) would produce, so static chrome costs zero fetches and no icon renders two ways. A name the set has no file for is left empty and marked `data-omega-icon-missing` |
|
|
117
|
+
| [minify-html.js](src/minify-html.js) | Production HTML minification (UJM minifyHtml successor) — Rust minifier with the legacy extraction dance (JSON-LD minified as JSON, inline scripts esbuild-minified, IE conditionals preserved); engine mounts it as a transform for `environment: 'production'`, .html outputs only |
|
|
118
|
+
| [purge.js](src/purge.js) | Cloudflare cache purge (UJM cloudflare-purge successor, de-ITW'd — direct API, brand's own `CLOUDFLARE_TOKEN`): zone from config `cloudflare.zone` or brand-url apex lookup; `omega purge` command, auto after `omega deploy --direct`, CI workflow step when the secret exists |
|
|
119
|
+
| [paths.js](src/paths.js) | Packaged content locations (themes/core/defaults/scaffold/runtime/translations) + `resolveClientEntry()` |
|
|
120
|
+
| [cli.js](src/cli.js) + [commands/](src/commands) | The `omega` CLI — devkit's shared router (bin/omega → cli.js → commands/<name>.js); dotenv from the consumer root, and the environment surface mixed into the CLI class |
|
|
121
|
+
| [mode-helpers.js](src/mode-helpers.js) | The build-side environment surface: `getEnvironment()` → `'development' \| 'testing' \| 'production'` (mutually exclusive, testing wins) plus `isDevelopment()` / `isProduction()` / `isTesting()` deriving from it — the same four calls `@omega.js/backend`, `@omega.js/desktop` and `@omega.js/extension` answer, and the browser-side `runtime/manager.js` already carried. `attachTo()` mixes them into the CLI class (statically and on the prototype); the build lanes read them off their own options object (`getEnvironment.call(options)`), precedence is `OMEGA_TEST_MODE` → the context's own `environment` (`omega build` → production, `omega dev` → development) → `OMEGA_BUILD_MODE` / `NODE_ENV` → development |
|
|
122
|
+
| [consumer.js](src/consumer.js) | Consumer layout (`src/`, `dist/`, `.omega/`) + omega.json5 → site data (loadConfig + toSiteGlobal) |
|
|
123
|
+
| [scaffold.js](src/scaffold.js) | `scaffoldDefaults()` — devkit defaults engine + the web FILE_MAP over `scaffold/` (marker merges, JSON5 config merge, CI/nvmrc templating) |
|
|
124
|
+
| [migrate/](src/migrate) | `runMigration()` — [config-convert.js](src/migrate/config-convert.js) (_config.yml + ultimate-jekyll-manager.json → omega.json5, mapping in [docs/shared/config.md](../../docs/shared/config.md)), [rules.js](src/migrate/rules.js) (the DECISION.md codemod table as pure text transforms), [codemod.js](src/migrate/codemod.js) (src/** walker), [lint.js](src/migrate/lint.js) (liquid-lint — known names derived from the REAL registration path: registerLiquid plus the framework's own `{% section %}`/`{% component %}`/`{% composition %}` tags, so a fully converted tree lints clean), [consumer-assets.js](src/migrate/consumer-assets.js) (seed main.js removal, `omega:main` scss rewrite, page-css self-@use drop) |
|
|
125
|
+
| [runtime/](runtime) | The BROWSER boot runtime (ESM, bundled into every build): `boot.js` bootMain/bootPage/bootLayout handshake, `manager.js` frontend Manager (omega + mode helpers), `icons.js` the icon watcher's transport (`/assets/icons/<style>/<name>.svg`, flags one namespace over) — loud on a miss in development, silent in production |
|
|
126
|
+
|
|
127
|
+
## Packaged content (the real UJM port, B2)
|
|
128
|
+
|
|
129
|
+
- `themes/base/` — the structural markup layer every theme chain terminates
|
|
130
|
+
at: frontend + backend + admin layouts, includes, sections, and components
|
|
131
|
+
in the neutral `omega-*` BEM vocabulary. Themes are skins over these
|
|
132
|
+
selectors and fork markup only for identity surfaces (the ladder: tokens →
|
|
133
|
+
component scss → bounded forks); convention in
|
|
134
|
+
[docs/web/sections.md](../../docs/web/sections.md).
|
|
135
|
+
- `themes/classy/` — the flagship skin, classy v2 (css, js, vendored
|
|
136
|
+
webfonts over base's markup): warm-paper/charcoal
|
|
137
|
+
token-driven skin, zero gradients, ink primaries, serif marketing display
|
|
138
|
+
(Newsreader) over an Inter UI, `.omega-shell` app chrome — see
|
|
139
|
+
[docs/shared/theming.md](../../docs/shared/theming.md). Every default frontend page ships
|
|
140
|
+
in the v2 language (page-hero/prose/timeline/post-card/person/facts
|
|
141
|
+
vocabulary in `css/marketing/_content.scss` + the cp147 compositional set:
|
|
142
|
+
hero-split, duo, statement, numbered, channel, band, form-panel — pages are
|
|
143
|
+
COMPOSED asymmetrically, not centered; the shared blog card is ONE
|
|
144
|
+
include, `_includes/frontend/components/post-card.html`). The footer is the
|
|
145
|
+
draft-2 pattern (brand block + auto-fit link columns + ONE matched-scale
|
|
146
|
+
base row with legal links, language pill, segmented appearance control).
|
|
147
|
+
Per-page THEME
|
|
148
|
+
css lives at `css/pages/<page>/index.scss` — it loads LAST on its page
|
|
149
|
+
(after core page css), which makes it the override slot for core page rules
|
|
150
|
+
(status/feedback use this to repaint JS-toggled `bg-*` state classes in the
|
|
151
|
+
hairline language);
|
|
152
|
+
`themes/neobrutalism/` and `themes/newsflash/` — skins with bounded
|
|
153
|
+
identity forks that fall back to base per file (fork lists in each
|
|
154
|
+
theme's README); `themes/bootstrap/` — the vendored Bootstrap 5
|
|
155
|
+
scss/js the themes build on (sibling imports); `themes/_template/` — the
|
|
156
|
+
theme-starter skeleton.
|
|
157
|
+
- `core/` — the theme-agnostic layer: `_layouts/blueprint/**` (45 page-type
|
|
158
|
+
contracts), `_layouts/core/root.html` (the document shell),
|
|
159
|
+
`_layouts/modules/` (redirect utility), `_includes/` (head/body/foot chrome,
|
|
160
|
+
price-per-unit pricing math, default
|
|
161
|
+
nav/footer/account + app sidebar/topbar data JSONs), `css/` (main.scss +
|
|
162
|
+
the `--omega-*` token sheet, `.omega-shell` mechanics, the motion library,
|
|
163
|
+
core styles, per-page css), `js/` (the UJM runtime: main module, core
|
|
164
|
+
modules incl. the motion boot, libs, per-page modules), `icons/`.
|
|
165
|
+
- `defaults/pages/**` — ~60 default pages at their real URLs (about, pricing,
|
|
166
|
+
contact, auth, legal, payment, portal, team, updates, alternatives, admin,
|
|
167
|
+
test pages) + the blog set: paginated index (`/blog/page/N.html`, size 6;
|
|
168
|
+
`generatePageOnEmptyData` keeps `/blog` alive with an empty state for
|
|
169
|
+
post-less brands),
|
|
170
|
+
category/tag index pages, and per-category/per-tag generator pages
|
|
171
|
+
(pagination over the aggregated taxonomy — replaces dynamic-pages.rb) + the
|
|
172
|
+
site meta-files (sitemap.xml, `/feeds/posts.{xml,json}` RSS + JSON feeds,
|
|
173
|
+
robots.txt, ads.txt, humans.txt, opensearch.xml, the pages.json search
|
|
174
|
+
index, `/.well-known/security.txt`) — default pages like any other, so a
|
|
175
|
+
consumer file at the same URL overrides. sitemap.xml and pages.json emit
|
|
176
|
+
entries in URL byte order (deterministic across builds). JSON outputs are
|
|
177
|
+
valid by construction (`omega_json_escape` + first-emitted-comma pattern); ads.txt
|
|
178
|
+
renders the configured `advertising.providers.adsense.client` or an
|
|
179
|
+
honest comment — that client id is the ONE adsense switch, the same
|
|
180
|
+
presence that renders the ad units and has the manager manage the account
|
|
181
|
+
([#527](https://github.com/Omega-JS-Stack/omega/issues/527)).
|
|
182
|
+
- `defaults/sample-posts/**`, `sample-team/**`, `sample-updates/**` — the
|
|
183
|
+
shared sample-content corpus (spec §8: 11 posts, 4 teammates, 4 updates),
|
|
184
|
+
injected as virtual collection templates in **development builds only**,
|
|
185
|
+
per collection only while the brand owns zero files there (nested
|
|
186
|
+
`_posts/<year>/` dirs count) — a content-less brand still gets a living
|
|
187
|
+
blog/team/updates locally. Dates ROLL: each file's authored date is a
|
|
188
|
+
rhythm relative to the corpus epoch (2026-07-18), re-anchored to the
|
|
189
|
+
build day (post filenames shift — Eleventy `page.date`; `update.date`
|
|
190
|
+
frontmatter lines rewrite) so a virgin blog always looks alive, never
|
|
191
|
+
"6 months stale". The anchor pins via `options.sampleAnchor` /
|
|
192
|
+
`OMEGA_SAMPLE_ANCHOR` — the test harness pins the epoch, making
|
|
193
|
+
generation an identity transform for fixtures and goldens. `omega dev`
|
|
194
|
+
also materializes the generated set under the target's
|
|
195
|
+
`.omega/sample-content/` (self-`.gitignore`d, regenerated every boot,
|
|
196
|
+
removed per collection once the consumer owns it) so the filler can be
|
|
197
|
+
read and copied — never committed, never mixed with real content. The
|
|
198
|
+
first consumer file in a collection — or any production build — removes
|
|
199
|
+
that collection's samples entirely. Every generated document is MARKED:
|
|
200
|
+
the generator writes `generated: true` into the frontmatter (never the
|
|
201
|
+
corpus files, so a newly authored sample cannot forget it), and the base
|
|
202
|
+
theme renders a `--omega-warn` TEST pill wherever such a document shows —
|
|
203
|
+
the post page, the blog listing's featured lead, and every post card
|
|
204
|
+
(`core/css/core/_generated-badge.scss`, `#208`). The templates key off the
|
|
205
|
+
flag ALONE, with no environment check, because samples never inject into a
|
|
206
|
+
production build. The two oldest posts carry
|
|
207
|
+
`post.image: false` + no author, exercising the designed no-media panel
|
|
208
|
+
(serif category monogram) and the brand-byline author fallback; both
|
|
209
|
+
contracts apply to real posts too (`post.image: false` → no-media panel,
|
|
210
|
+
a path → that image, absent → the legacy id-path convention).
|
|
211
|
+
- `sw/` — the service worker: `manager.js` (the master-service-worker
|
|
212
|
+
successor — FCM background messaging, notification clicks, the
|
|
213
|
+
`update-cache` command, brand+build-named caches with foreign-cache
|
|
214
|
+
eviction) + `entry.js` (the consumer-less default entry; the scaffold seeds
|
|
215
|
+
`src/service-worker.js` with the same import for custom worker code).
|
|
216
|
+
|
|
217
|
+
## URL shape — flat `.html`, no trailing slashes (legacy parity)
|
|
218
|
+
|
|
219
|
+
Pages write **flat files** (`/signin` → `signin.html`, never
|
|
220
|
+
`signin/index.html`) and `page.url` is **extensionless with no trailing
|
|
221
|
+
slash** (`/signin`) — exactly legacy UJM/Jekyll. Mechanics: the computed
|
|
222
|
+
`permalink` appends `.html` to extensionless permalinks (a REAL-extension
|
|
223
|
+
whitelist, not `path.extname` — dotted slugs like `/updates/v1.0.0` are page
|
|
224
|
+
URLs), an Eleventy `addUrlTransform` strips `.html` back off `page.url`, and
|
|
225
|
+
Liquid-carrying permalinks (blog pagination, taxonomy generators) spell their
|
|
226
|
+
full shape explicitly. Serving: the dev server's `devCleanUrls` middleware
|
|
227
|
+
resolves `/signin` (and a stray `/signin/`) to `signin.html` — the legacy
|
|
228
|
+
serve.js contract — and GitHub Pages resolves extensionless paths against
|
|
229
|
+
`.html` files natively, so production behaves identically.
|
|
230
|
+
|
|
231
|
+
## Serving under a URL path (`OMEGA_PATH_PREFIX`)
|
|
232
|
+
|
|
233
|
+
Everything a build emits is root-relative, so a site mounted under a URL path
|
|
234
|
+
instead of a domain root — a GitHub Pages **project** site at
|
|
235
|
+
`https://<user>.github.io/<repo>/` — would ask the domain root for its assets
|
|
236
|
+
and 404. Set `OMEGA_PATH_PREFIX` around `omega build` and every emitted URL
|
|
237
|
+
moves under it:
|
|
238
|
+
|
|
239
|
+
```bash
|
|
240
|
+
OMEGA_PATH_PREFIX=/workkit npx omega build
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
The value is a **publisher** input, not an end-user one: whatever machinery
|
|
244
|
+
publishes the site knows its mount point (workkit's publish reads it off the
|
|
245
|
+
Pages API), and hosts that serve at the domain root — Netlify, Vercel, a custom
|
|
246
|
+
domain — pass nothing. It is normalized defensively (leading slash added,
|
|
247
|
+
trailing slash stripped); `/` and unset both mean the domain root, and then no
|
|
248
|
+
pass runs at all, so the output is byte-for-byte what it has always been.
|
|
249
|
+
|
|
250
|
+
**`omega deploy` fills it for you** ([#358](../../issues/358)), so an ordinary
|
|
251
|
+
gh-pages brand never types the variable: a `brand.url` naming a domain of your
|
|
252
|
+
own means the site serves at that domain's root (the CNAME both lanes publish
|
|
253
|
+
cannot carry a path) → `/`; a `brand.url` naming a `*.github.io` address means
|
|
254
|
+
the path IT carries is the mount → `/<name>/` ([#366](../../issues/366));
|
|
255
|
+
`brand.url` unset means the default project address
|
|
256
|
+
`https://<owner>.github.io/<name>/` → `/<name>/`, from the same repo slug the
|
|
257
|
+
deploy plan resolves. `--direct` sets it around the build it runs itself; the
|
|
258
|
+
scaffolded CI workflow derives it remotely through the same function
|
|
259
|
+
(`@omega.js/web/deploy`'s `targetPathPrefix()`, with `GITHUB_REPOSITORY` naming
|
|
260
|
+
the repo when the config carries no slug). An explicitly exported value always
|
|
261
|
+
wins, and `omega dev` / a bare `omega build` stay at the root.
|
|
262
|
+
|
|
263
|
+
The direct lane deploys **both** Pages shapes ([#361](../../issues/361)): with a
|
|
264
|
+
`brand.url` naming your own domain it writes the CNAME and reports that domain;
|
|
265
|
+
without one it publishes a project site at the derived
|
|
266
|
+
`https://<owner>.github.io/<name>/`, mounted under the matching base path, with
|
|
267
|
+
no CNAME step at all. Plan address and build prefix come from one derivation,
|
|
268
|
+
and the repo slug resolves from the config, then `GITHUB_REPOSITORY`, then the
|
|
269
|
+
tree's own `origin` remote. A project site still sets `brand.url` to its Pages
|
|
270
|
+
URL, without a trailing slash (`https://<owner>.github.io/<name>`) — absolute
|
|
271
|
+
URLs build from it and nothing derives them at build time, so the direct lane
|
|
272
|
+
warns and prints the exact value when it is unset ([#366](../../issues/366)).
|
|
273
|
+
A `*.github.io` host is **never** a custom domain: neither the deploy plan nor
|
|
274
|
+
the production build's `dist/CNAME` step reads one as such, so setting that
|
|
275
|
+
value keeps the project shape instead of flipping the site to the domain root.
|
|
276
|
+
|
|
277
|
+
Three lanes carry it ([path-prefix.js](src/path-prefix.js)): the rendered HTML
|
|
278
|
+
(`href`/`src`/`srcset`/`action`, which covers asset URLs, favicons, config-sourced
|
|
279
|
+
brand images and every internal link), the emitted CSS (`url()` targets — the
|
|
280
|
+
theme sheets' `@font-face` sources), and the runtime, which reads the value off
|
|
281
|
+
`<html data-omega-path-prefix>` through `core/js/libs/path-prefix.js` rather
|
|
282
|
+
than baking it into a bundle. Page IDENTITY stays site-relative:
|
|
283
|
+
`data-page-path` is the route, which is what the client's route checks compare
|
|
284
|
+
against. `omega dev` serves at the root and never sets one. ABSOLUTE URLs
|
|
285
|
+
(canonical, `og:url`, the sitemap) are built from `brand.url`, which for a
|
|
286
|
+
project site already carries the path — nothing prefixes them twice. Pinned by
|
|
287
|
+
`test/path-prefix.test.js`.
|
|
288
|
+
|
|
289
|
+
The translation pass reads the same stamp and composes **prefix, then
|
|
290
|
+
language** ([#359](../../issues/359)): a mounted link's route is read from
|
|
291
|
+
underneath the base path — which is also the route the exclusion list is
|
|
292
|
+
matched on — and the language segment mounts after it, `/workkit/es/pricing`.
|
|
293
|
+
Pinned by `test/translate.test.js`.
|
|
294
|
+
|
|
295
|
+
## Service worker (dev AND production)
|
|
296
|
+
|
|
297
|
+
Every build emits `/service-worker.js` + `/build.js` + `/build.json`;
|
|
298
|
+
@omega.js/client registers the worker at scope `/` on every page load
|
|
299
|
+
(`updateViaCache: 'none'`). Under a base path ([#360](../../issues/360)) it
|
|
300
|
+
registers `<prefix>/service-worker.js` at scope `<prefix>/` — the only scope a
|
|
301
|
+
script served from there can claim — and hands the prefix to the worker as the
|
|
302
|
+
`omega-path-prefix` query param on that URL, since a worker has no document to
|
|
303
|
+
read the `data-omega-path-prefix` stamp from. The worker mounts every site URL
|
|
304
|
+
it builds (`/build.js`, the default notification icon, the default click
|
|
305
|
+
target) under it; at the domain root nothing changes. Pinned by
|
|
306
|
+
`test/service-worker-mount.test.js`. Push (FCM background messages) rides it —
|
|
307
|
+
`notifications.getToken({ serviceWorkerRegistration })` uses THIS
|
|
308
|
+
registration. **Cross-project safety on one localhost port**: registering
|
|
309
|
+
replaces whatever worker last claimed the origin (one registration per
|
|
310
|
+
scope), the fresh `/build.js` bytes force the update, `skipWaiting` +
|
|
311
|
+
`clients.claim` take over immediately, and the worker's boot evicts every
|
|
312
|
+
cache not named `<brand>-<cacheBreaker>`. A project that explicitly disables
|
|
313
|
+
the SW (`serviceWorker.enabled: false`) gets the origin swept clean instead
|
|
314
|
+
(`unregisterAll()`).
|
|
315
|
+
|
|
316
|
+
## The page paint contract
|
|
317
|
+
|
|
318
|
+
Every page this framework ships, and every page a brand builds on it, obeys one
|
|
319
|
+
contract about its first frame ([#637](https://github.com/Omega-JS-Stack/omega/issues/637)):
|
|
320
|
+
static content paints immediately and no page hides its DOM waiting for auth
|
|
321
|
+
(the global auth policy owns redirects); user data arrives through
|
|
322
|
+
`data-omega-bind` with skeletons, filled by @omega.js/client at auth settle; an
|
|
323
|
+
answer the visitor acts on — trial eligibility, the current plan, the price
|
|
324
|
+
being charged — keeps a skeleton on that spot alone and resolves ONCE, never
|
|
325
|
+
flipping between two answers; every network wait behind visible copy has a
|
|
326
|
+
deadline and a named fallback state; and every form's submit control stays
|
|
327
|
+
disabled until its `FormManager` gates resolve. The rules, the worked checkout
|
|
328
|
+
example, and the four questions to read a page against them:
|
|
329
|
+
[docs/web/page-contract.md](../../docs/web/page-contract.md).
|
|
330
|
+
|
|
331
|
+
## Architecture
|
|
332
|
+
|
|
333
|
+
- **Layered layouts** — layer chain `consumer _layouts → active theme →
|
|
334
|
+
base → core`; the winning `_layouts/**` file per relative path is
|
|
335
|
+
registered as an Eleventy v3 **virtual template** (build) or composed as a
|
|
336
|
+
**symlink farm** (dev). Consumer-local layouts (sweet-saucy's recipe) are
|
|
337
|
+
first-class; consumer `_layouts` is ignored as content (cwd-relative glob —
|
|
338
|
+
`../`-relative input dirs miss bare `**/` globs).
|
|
339
|
+
- **Blueprint dispatch, plain names** — `layout: blueprint/pricing` →
|
|
340
|
+
(core) blueprint carries the page-type defaults → `layout:
|
|
341
|
+
frontend/pages/pricing` resolves through the theme layers (active wins,
|
|
342
|
+
base fills). Plain names are the ONLY accepted form: the legacy bracket
|
|
343
|
+
idiom (`themes/[ site.theme.id ]/…`) and hardcoded `themes/<id>/…` prefixes
|
|
344
|
+
fail the build loudly — the B4 codemod rewrites them at migration
|
|
345
|
+
(#148 removed the alias table).
|
|
346
|
+
- **Includes layering** — LiquidJS `root:` array over consumer `_includes`
|
|
347
|
+
first, then theme layers, then core — EXISTING dirs only — with
|
|
348
|
+
`jekyllInclude: true` and `cache: true` (without the parsed-template cache,
|
|
349
|
+
re-parsing the 885-line core chrome per render was the corpus bottleneck).
|
|
350
|
+
- **`resolved`** — inject-properties.rb parity: `site config ← layout chain ←
|
|
351
|
+
page data` (the site seed carries brand/theme/analytics/client/…;
|
|
352
|
+
site collections and bulk keys excluded). Frontmatter values that reference
|
|
353
|
+
`page.*` / `resolved.*` render per page, copy-on-write (layout defaults
|
|
354
|
+
template on merged data — classy alternative's hero does this).
|
|
355
|
+
- **Jekyll site emulation** — `site.posts/team/updates/alternatives` are real
|
|
356
|
+
arrays synced in place when collections compute (Eleventy captures the site
|
|
357
|
+
object at data-init, so replacement or lazy getters would be invisible);
|
|
358
|
+
`site.data._includes.*` is built from `.json` files in the layered include
|
|
359
|
+
roots (UJM's json-data system: nav/footer/account/sidebar/topbar data);
|
|
360
|
+
`paginator` compat maps Eleventy pagination to Jekyll's shape; `jekyll.
|
|
361
|
+
environment` global.
|
|
362
|
+
- **Default pages, no copying** — `defaults/pages/**` registered as virtual
|
|
363
|
+
templates UNLESS the consumer owns the same URL. The 404 lands at literal
|
|
364
|
+
`/404.html` (static hosts need the file).
|
|
365
|
+
- **Assets** — every layer root follows one convention (`js/main.js`,
|
|
366
|
+
`js/pages/**`, `js/layouts/**`, `css/main.scss`, `css/pages/**`,
|
|
367
|
+
`css/layouts/**`, theme roots add `_theme.scss`/`_theme.js`).
|
|
368
|
+
`__main_assets__/*` resolves to the core layer / themes dir, `__theme__/*` to
|
|
369
|
+
the active theme (base fallback), `omega:<name>` to the same name from the
|
|
370
|
+
layers below the importing file, `@omega.js/client` (subpaths included) to
|
|
371
|
+
@omega.js/client. Every package the framework declares as a dependency
|
|
372
|
+
resolves from the FRAMEWORK's installation for whoever imports it, so a
|
|
373
|
+
consumer page module writes `import { defineChart } from '@tanstack/charts'` bare and
|
|
374
|
+
shares one copy (one chunk) with core's own users of the library — the
|
|
375
|
+
framework's copy wins even if the consumer declares its own; anything the
|
|
376
|
+
framework does not declare the consumer declares itself. Manifest:
|
|
377
|
+
`{ js: { main, firstPaint, pages, layouts }, css: { main, critical, pages, layouts } }`; each `css.pages`/`css.layouts` entry is `{ inline }` (a sheet of 8 KB or less, printed as a `<style>` block) or `{ href }`.
|
|
378
|
+
**One rule for page and layout assets, JS and CSS alike: every layer's file
|
|
379
|
+
loads, in layer order** (core → theme → consumer), so each key holds a LIST —
|
|
380
|
+
a framework page script always runs, the theme decorates, the consumer adds,
|
|
381
|
+
and nothing replaces anything. The engine's `pageAssets` computed resolves
|
|
382
|
+
each page's entries from the URL alone (the `asset_path` frontmatter override
|
|
383
|
+
is dead — spec §7): exact key, then the per-page-dir `<key>/index` spelling,
|
|
384
|
+
then `[name]` wildcard filenames (Next.js convention —
|
|
385
|
+
`js/pages/blog/[slug].js` serves every `/blog/<slug>` post; a wildcard segment
|
|
386
|
+
matches exactly one URL segment, exact beats wildcard, most-literal wildcard
|
|
387
|
+
wins). `layoutAssets` does the same keyed by layout name, across the page's
|
|
388
|
+
whole layout chain. Underscore basenames under `pages/` and `layouts/` are
|
|
389
|
+
shared partials in both languages, never entries
|
|
390
|
+
(`js/pages/legal/_document.js` backs the flat `terms`/`cookies`/`privacy`
|
|
391
|
+
entries). `main.js` / `main.scss` are the exception: first layer wins, and it
|
|
392
|
+
extends the layers below with `import coreMain from 'omega:main'` /
|
|
393
|
+
`@use 'omega:main'`. Dev mode (`omega dev`): stable un-hashed names + no
|
|
394
|
+
minify, so in-place asset rebuilds keep their URLs without an HTML re-render.
|
|
395
|
+
- **Boot runtime (ESM + code splitting)** — all bundles come out of ONE
|
|
396
|
+
esbuild call with `splitting: true`, so @omega.js/client and `runtime/boot.js`
|
|
397
|
+
land in a shared chunk the browser evaluates ONCE per page: every
|
|
398
|
+
`import omega from '@omega.js/client'` — in the main bundle, a page module,
|
|
399
|
+
anywhere — is the SAME initialized singleton (webpack's single module
|
|
400
|
+
graph, reproduced with `<script type="module">` semantics; both scripts are
|
|
401
|
+
deferred and execute in document order). The handshake: main stub →
|
|
402
|
+
`bootMain(mod)` (omega.initialize(window.Configuration) → dev lib in
|
|
403
|
+
development → global module), page stub → `bootPage(mod)` (awaits the main
|
|
404
|
+
boot, then `mod({ manager, options })` — the UJM page-module contract,
|
|
405
|
+
with `manager` the frontend Manager wrapper carrying mode helpers), layout
|
|
406
|
+
stub → `bootLayout(mod)` (the layout module's NAMESPACE, whose default export
|
|
407
|
+
is optional: the redirect layout hops at import time and exports nothing, so
|
|
408
|
+
no stub may name a `default` esbuild can prove undefined, #742).
|
|
409
|
+
- **Scaffolding (`ensureTarget()`, every verb)** — devkit's defaults engine over
|
|
410
|
+
`scaffold/`: marker-section merges live-sync .gitignore/AGENTS.md
|
|
411
|
+
(Custom sections preserved verbatim; CLAUDE.md is the one-line `@AGENTS.md`
|
|
412
|
+
pointer, copied when missing), config/omega.json5 seeds then
|
|
413
|
+
JSON5-defaults-merges (consumer values win), the Ruby-free CI workflow +
|
|
414
|
+
.nvmrc re-template every run, `src/**` is consumer-owned after seeding.
|
|
415
|
+
Inside a brand monorepo that CI workflow is composed into the BRAND ROOT
|
|
416
|
+
as `.github/workflows/<app>-build.yml` — scoped to the app's dir, its own
|
|
417
|
+
concurrency group — because GitHub runs workflows from the repo root only.
|
|
418
|
+
NO pages are copied — the default set stays virtual. package.json scripts
|
|
419
|
+
sync to the omega commands.
|
|
420
|
+
- **Migration (`omega migrate`)** — one command converts a UJM consumer in
|
|
421
|
+
place: legacy configs → validated omega.json5 (shared sections extracted
|
|
422
|
+
with unified spellings — `analytics.providers.<p>.id`, `cloud.{provider,config}`,
|
|
423
|
+
`payment` at the top level; the legacy `web_manager` blob renamed to the
|
|
424
|
+
`client` client-settings key + presentation
|
|
425
|
+
sections + build settings under `targets.web`), the codemod rule table over
|
|
426
|
+
`src/**` templates (starting with `legacy-prefix`: `uj_*` tags/filters →
|
|
427
|
+
`omega_*`, `site.uj` → `site.omega`, `uj-*` classes → `omega-*` — #44 retired
|
|
428
|
+
those spellings with no aliases), seed `main.js` removal (the core main + boot runtime
|
|
429
|
+
replace it), the `@use 'omega:main' with (…)` rewrite for theme-variable
|
|
430
|
+
customization (the layered sass importer skips the requesting file, so a
|
|
431
|
+
consumer main.scss configures the layers below it), page-css self-@use
|
|
432
|
+
drops, liquid-lint, and legacy-file removal (Gemfile & co). `--check` runs
|
|
433
|
+
everything in memory. The ENGINE composes the runtime shape back
|
|
434
|
+
(cloud.config → `client.firebase.app.config`, payment →
|
|
435
|
+
`client.payment`, providers → the client's flat analytics) so the
|
|
436
|
+
chrome/client contract is unchanged — one home per value in the config,
|
|
437
|
+
same bridge pattern as the extension framework.
|
|
438
|
+
|
|
439
|
+
## Design tokens (C3)
|
|
440
|
+
|
|
441
|
+
[core/css/tokens/_index.scss](core/css/tokens/_index.scss) is the runtime
|
|
442
|
+
contract every theme consumes: `--omega-*` CSS custom properties (color,
|
|
443
|
+
radius, motion) defined light-first, redefined at the token level for
|
|
444
|
+
`prefers-color-scheme: dark`, and overridden in BOTH directions by the
|
|
445
|
+
`data-bs-theme` stamp appearance.js manages. Themes restyle by redefining
|
|
446
|
+
tokens — components read `var(--omega-*)`, never hardcoded values. The
|
|
447
|
+
sheet emits before the theme in main.scss (themes win at equal
|
|
448
|
+
specificity) and is pinned to ZERO sass deprecations — the bar for all
|
|
449
|
+
new core css. `brand.color` drives the accent family: the engine derives
|
|
450
|
+
a ramp ([src/brand-tokens.js](src/brand-tokens.js) — hover/active shifts,
|
|
451
|
+
WCAG-picked on-accent ink, subtle/ring alphas) and head.html emits it
|
|
452
|
+
inline AFTER the bundles so the brand wins the cascade. No/invalid color
|
|
453
|
+
→ the sheet's neutral placeholder stands. Token VALUES are C3 scaffolding
|
|
454
|
+
until Ian's direction notes land; the names + plumbing are the contract.
|
|
455
|
+
|
|
456
|
+
The categorical ramp (`--omega-chart-1`…`-6`) serves three surfaces from one
|
|
457
|
+
palette: chart series ([core/js/libs/charts.js](core/js/libs/charts.js) — the
|
|
458
|
+
framework's TanStack Charts, lazily split into its own chunks, so a chartless
|
|
459
|
+
page pays nothing), diagram slots ([core/js/libs/graph.js](core/js/libs/graph.js) —
|
|
460
|
+
the framework's mermaid on the same terms, mapped onto its `cScale`/`pie`
|
|
461
|
+
slots) and the `.omega-tone-<n>` / `.omega-badge-tone` chips
|
|
462
|
+
([core/css/core/_tones.scss](core/css/core/_tones.scss)), so the same thing is
|
|
463
|
+
the same color wherever it appears. A surface that means a STATUS passes the
|
|
464
|
+
status tokens instead (`colors: ['var(--omega-ok)', …]`) — semantics beat
|
|
465
|
+
categories. `.omega-interactive` (+ `--lift`) is the shared whole-surface
|
|
466
|
+
click affordance. All are core, so every theme inherits them:
|
|
467
|
+
[docs/shared/theming.md](../../docs/shared/theming.md).
|
|
468
|
+
|
|
469
|
+
The status hues (`--omega-ok`/`-warn`/`-danger`) each carry an `-rgb` channel
|
|
470
|
+
twin, and every theme's root bridge points Bootstrap's `--bs-success`/
|
|
471
|
+
`-warning`/`-danger` (and their `-rgb`) at them, so `bg-success`, `.text-success`
|
|
472
|
+
and a token-painted glyph are ONE color in both modes.
|
|
473
|
+
|
|
474
|
+
## Theming — two consumer tiers (C3)
|
|
475
|
+
|
|
476
|
+
**Tier 1 — restyle the stock theme.** Ship `src/assets/css/main.scss` in the
|
|
477
|
+
brand website app: the consumer layer leads the chain, so your entry wins
|
|
478
|
+
the layered `main.scss` lookup. Open with `@use 'omega:main' with (…)` — the
|
|
479
|
+
self-skipping `omega:` importer resolves to the next layer's entry, core
|
|
480
|
+
`@forward`s the active theme's variables (so `with (…)` configures them),
|
|
481
|
+
and your own rules land last to win the cascade. This is the migrated form
|
|
482
|
+
of UJM's `@use 'ultimate-jekyll-manager' with (…)` customization.
|
|
483
|
+
|
|
484
|
+
**Tier 2 — ship a full theme.** Put `themes/<id>/` in the brand website app
|
|
485
|
+
(own `_theme.scss`, `_layouts/`, `css/`, `js/`) and set `theme.id: "<id>"` —
|
|
486
|
+
consumer-local themes beat packaged ones ([resolveThemeLayers](src/layers.js)),
|
|
487
|
+
`omega dev` watches them, and anything the theme doesn't cover falls through
|
|
488
|
+
to `themes/base` (base's `_theme.scss` forwards classy's theme as the
|
|
489
|
+
default skin css).
|
|
490
|
+
Legacy `themes/<id>/…` layout spellings alias for consumer ids too.
|
|
491
|
+
|
|
492
|
+
## App shell (C3)
|
|
493
|
+
|
|
494
|
+
[core/css/shell/_index.scss](core/css/shell/_index.scss) is the
|
|
495
|
+
skin-independent structure for backend/admin surfaces: regions
|
|
496
|
+
(`.omega-shell__sidebar/topbar/main/scrim`, with `__topbar-start/-end`
|
|
497
|
+
slots and the `__sidebar-scroll` region that carries the nav's scrolling —
|
|
498
|
+
the rail itself clips nothing, so its popovers can escape) and states — desktop rail collapse (`data-shell-collapsed`,
|
|
499
|
+
persisted under `shell.collapsed`; `.omega-shell__label` text hides in the
|
|
500
|
+
rail), mobile drawer below 1200px (`data-shell-open` + scrim, matching
|
|
501
|
+
classy's xl cutover), and a `.omega-shell--locked` variant whose main never
|
|
502
|
+
scrolls (calendar/studio-style pages). Geometry only — every painted value
|
|
503
|
+
is a `var(--omega-*)` token, dimensions are `--omega-shell-*` custom
|
|
504
|
+
properties, and motion respects `prefers-reduced-motion`. Main pins its own
|
|
505
|
+
grid row, so a page that turns the topbar off (`theme.topbar.enabled: false`)
|
|
506
|
+
still scrolls inside main; `theme.sidebar.enabled: false` drops the rail and
|
|
507
|
+
the two topbar toggles that drive it. A topbar-off page that KEEPS its rail
|
|
508
|
+
renders `.omega-shell__drawer-toggle` instead, a floating control on the same
|
|
509
|
+
`data-shell-toggle="drawer"` handler, so the drawer is still reachable on a
|
|
510
|
+
narrow viewport (#719); and classy's content card reads the topbar's presence
|
|
511
|
+
(`:has(> .omega-shell__topbar)`) rather than assuming it, so main draws its
|
|
512
|
+
full frame when it is the whole card.
|
|
513
|
+
[core/js/core/app-shell.js](core/js/core/app-shell.js) drives it
|
|
514
|
+
declaratively (`[data-shell-toggle="collapse|drawer"]`,
|
|
515
|
+
`[data-shell-dismiss]`, Escape closes the drawer, `aria-expanded` synced)
|
|
516
|
+
and exposes `omega.library().appShell`. The full contract markup is documented
|
|
517
|
+
at the top of the sheet; theme layouts emit it (one tree — no duplicated
|
|
518
|
+
mobile nav like classy's offcanvas). Because the state attributes are
|
|
519
|
+
stamped at runtime, `purgeCss` safelists `/omega-shell/`. Classy keeps its
|
|
520
|
+
Bootstrap shell untouched; the D10 skin's layouts adopt this contract.
|
|
521
|
+
|
|
522
|
+
## Pricing from config (C2)
|
|
523
|
+
|
|
524
|
+
`payment.products` in omega.json5 is the ONLY pricing source. The engine
|
|
525
|
+
composes `site.pricing` ([src/pricing.js](src/pricing.js)) — subscription
|
|
526
|
+
plans (config order), one-time products (own section, no billing cadence),
|
|
527
|
+
billing-toggle availability (both cadences must exist), an HONEST savings
|
|
528
|
+
badge (computed from real prices), and the feature-comparison matrix (tiers
|
|
529
|
+
inherit earlier plans' features) — and it surfaces as `resolved.pricing` in
|
|
530
|
+
every theme's pricing layout. Optional presentation fields per product:
|
|
531
|
+
`tagline`, `popular`, `url`, `hidden` (drops the product from every pricing
|
|
532
|
+
lane while checkout still resolves it by id), `features [{ id, name, icon,
|
|
533
|
+
definition, value }]` (value falls back to `limits[id]`; `-1` renders
|
|
534
|
+
Unlimited). Free plan = no prices → anchors to `/signup`. Empty catalog —
|
|
535
|
+
bare, or every product `hidden` — → an explicit `#pricing-empty` state + an
|
|
536
|
+
`omega build` warning — never fictional plans.
|
|
537
|
+
Consumer page frontmatter still overrides presentation per-page (hero copy,
|
|
538
|
+
`faqs`, `social_proof`, `pricing.enterprise`, `pricing.promo`,
|
|
539
|
+
`pricing.guarantee`, `pricing.price_per_unit`); the framework ships NO
|
|
540
|
+
fictional defaults (the dispersal-era `### ALL PAGES ###` marker convention
|
|
541
|
+
is dead — pinned by a contract test).
|
|
542
|
+
|
|
543
|
+
Trial and refund claims are GATED — the framework states neither on its own
|
|
544
|
+
([#273](https://github.com/Omega-JS-Stack/omega/issues/273)). A trial is
|
|
545
|
+
catalog data: `resolved.pricing.trialDays` is the one number a page may speak
|
|
546
|
+
UNIVERSALLY ("every paid plan starts with an N-day free trial"), so it exists
|
|
547
|
+
only when every PAID plan agrees on it — a catalog whose paid plans carry
|
|
548
|
+
different trials, or one selling no trial, resolves `0` and every universal
|
|
549
|
+
trial sentence (the pricing FAQ, the alternatives index and detail pages, the
|
|
550
|
+
checkout) renders empty and drops out, taking its FAQ accordion row and
|
|
551
|
+
FAQPage schema entry with it. Free plans have nothing to disagree with, and
|
|
552
|
+
each card still states its own `plan.trialDays`. A refund window is NOT
|
|
553
|
+
catalog data: money-back copy renders only from the brand's own
|
|
554
|
+
`pricing.guarantee`, so an absent guarantee means no window is promised
|
|
555
|
+
anywhere. Neither number is ever a framework default — the checkout's trial
|
|
556
|
+
sentence and renewal date read the product's real `trial.days`, never a
|
|
557
|
+
constant.
|
|
558
|
+
|
|
559
|
+
## Responsive images (the imagemin successor)
|
|
560
|
+
|
|
561
|
+
`omega build` re-encodes every jpg/jpeg/png under `dist/assets/images` into
|
|
562
|
+
the legacy UJM matrix — widths 320/640/1024 + the original size, each in the
|
|
563
|
+
source format AND webp, quality 80, metadata stripped, upscaling allowed so
|
|
564
|
+
every variant name always exists (`hero.jpg` → `hero-320px.jpg`,
|
|
565
|
+
`hero-320px.webp`, … `hero.webp` — `@srcset` markup never 404s). The original
|
|
566
|
+
NAME survives (re-encoded, so URL contracts hold), svg/gif/webp pass through
|
|
567
|
+
verbatim, the minted `favicon/` dir is exempt (exact-name mint contract), and
|
|
568
|
+
an undecodable file warns and ships verbatim — never a failed build.
|
|
569
|
+
`targets.web.imagemin.enabled: false` opts a brand out.
|
|
570
|
+
|
|
571
|
+
Outputs are reproducible binaries and NEVER commit: the content-addressed
|
|
572
|
+
cache lives at the brand's `.omega/cache/imagemin` (source or settings
|
|
573
|
+
changes re-process exactly what changed; stale entries prune every run), and
|
|
574
|
+
CI restores it via `actions/cache` in the scaffolded build workflow — the
|
|
575
|
+
`cache-uj-imagemin` branch successor. Dev never processes: `omega dev`
|
|
576
|
+
middleware rewrites missing `-NNNpx`/`.webp` variant URLs to the verbatim
|
|
577
|
+
original, so build-time markup resolves in dev too.
|
|
578
|
+
|
|
579
|
+
## Engine facts worth knowing (test-pinned)
|
|
580
|
+
|
|
581
|
+
1. LiquidJS has NO `forloop.parentloop` (renders empty) — hoist outer-loop
|
|
582
|
+
values into `{% assign %}` vars (B4 codemod rule).
|
|
583
|
+
2. `{{ }}` inside QUOTED tag args is a silent no-op (upstream Jekyll too) —
|
|
584
|
+
`{% capture %}` hoist.
|
|
585
|
+
3. Include paths must not lead with `/` (resolves outside LiquidJS roots).
|
|
586
|
+
4. Layout values resolve BEFORE preprocessors — a legacy bracket layout is a
|
|
587
|
+
loud missing-layout error (the codemod rewrites it; nothing aliases it).
|
|
588
|
+
`layout: none` must be dropped entirely (`null` breaks layout
|
|
589
|
+
chains, `none` is a missing-layout error).
|
|
590
|
+
5. Same-process multi-builds need `setUseTemplateCache(false)` (tests only;
|
|
591
|
+
the CLI is per-process).
|
|
592
|
+
6. `--incremental` doesn't narrow under collection-paginated templates —
|
|
593
|
+
acceptable dev loop; B-phase optimization if it hurts.
|
|
594
|
+
7. Foreign cascade objects can carry throwing getters (Eleventy collection
|
|
595
|
+
items' `templateContent` pre-render) — the copy-on-write renderer checks
|
|
596
|
+
`'templateContent' in node` WITHOUT touching the getter (constructing
|
|
597
|
+
those errors per item per page was ~19% of corpus CPU).
|
|
598
|
+
8. Eleventy's computed-data dependency pass probes with EMPTY-STRING proxies
|
|
599
|
+
that persist into data — `permalink: ''` must count as absent, or every
|
|
600
|
+
collection doc collides at `/index.html`.
|
|
601
|
+
9. Block-tag bodies must render LAZILY: a falsy `{% iftruthy %}` around a
|
|
602
|
+
re-`{% assign %}` would otherwise clobber the outer value (side effects
|
|
603
|
+
run even when output is discarded) — template-kit's adapter probes first,
|
|
604
|
+
renders the body only when the tag asks for it.
|
|
605
|
+
10. Eleventy keeps global-data OBJECT REFERENCES but captures the key set at
|
|
606
|
+
data-init: mutate arrays in place (site collections), never reassign.
|
|
607
|
+
11. Site-wide front-matter defaults: a root directory data file
|
|
608
|
+
(`<srcDir>/<srcDirName>.11tydata.json`) sits ABOVE layout front matter and
|
|
609
|
+
BELOW each page's own front matter — the one-place override for
|
|
610
|
+
layout/blueprint sample content (jekyll-uj-powertools 1.8.1's `defaults:`
|
|
611
|
+
layer; pinned in slice.test.js).
|
|
612
|
+
|
|
613
|
+
The full findings log + scorecard: [RESULTS.md](../../_attic/spikes/bakeoff-shared/RESULTS.md),
|
|
614
|
+
[DECISION.md](../../_attic/spikes/bakeoff-shared/DECISION.md). The codemod rule
|
|
615
|
+
table (DECISION.md) is EXECUTABLE as of B4 — [src/migrate/rules.js](src/migrate/rules.js),
|
|
616
|
+
semantically proven in the suite (the capture hoist renders byte-identical to
|
|
617
|
+
a literal arg; the parentloop hoist renders the right outer indexes). B4 also
|
|
618
|
+
killed two real-data bugs: taxonomy terms now dedupe by slug (somiibo mixes
|
|
619
|
+
"Marketing" ×673 / "marketing" ×11 — Jekyll silently last-write-won, Eleventy
|
|
620
|
+
hard-errors), and the live somiibo interpolated-icon bug
|
|
621
|
+
(`class="fa text- display-4"`) is fixed in the packaged classy layouts (12
|
|
622
|
+
latent copies) AND forward in consumer files by the codemod.
|
|
623
|
+
|
|
624
|
+
## Not here yet (B5 + follow-ups)
|
|
625
|
+
|
|
626
|
+
`omega verify --against <jekyll-dist>` parity harness (B5 — the per-site
|
|
627
|
+
migration gate; the real somiibo URL-set diff, 2,556 vs Jekyll's 2,608 files,
|
|
628
|
+
is its first job) · the audit's HTML/spelling half (`omega audit` ports the
|
|
629
|
+
Lighthouse pass; the legacy html-validate + spellcheck sweep is still out) · UJM-setup post dedupe · named css
|
|
630
|
+
bundles, full icon set (B-phase pipeline) · engine consumption of
|
|
631
|
+
`targets.web.collections`/`defaults`/`generators` (migrate carries the config;
|
|
632
|
+
custom collections land with the sweet-saucy wave) · dev-loop re-render
|
|
633
|
+
narrowing + browser live-reload on asset rebuilds.
|
|
634
|
+
|
|
635
|
+
## License
|
|
636
|
+
|
|
637
|
+
[Elastic License 2.0](LICENSE). The source is free to use and modify; a
|
|
638
|
+
license key unlocks payments in production deploys and removes the
|
|
639
|
+
attribution (local dev and test payments are always free); and you may not
|
|
640
|
+
offer `@omega.js/web` to third parties as a hosted or managed service.
|