@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/docs/libs.md
ADDED
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
# Web JS libraries (core/js/libs)
|
|
2
|
+
|
|
3
|
+
The browser-side modules `@omega.js/web` ships for page code to import:
|
|
4
|
+
`packages/web/core/js/libs/`. They are the framework's own runtime helpers,
|
|
5
|
+
distinct from `@omega.js/client` (the singleton every page boots with) and from
|
|
6
|
+
`core/js/pages/` (a page's own module). Page modules, theme modules, the boot
|
|
7
|
+
runtime, and consumer page modules all reach them the same way.
|
|
8
|
+
|
|
9
|
+
## The import idiom
|
|
10
|
+
|
|
11
|
+
```js
|
|
12
|
+
import { createLogger } from '__main_assets__/js/libs/logger.js';
|
|
13
|
+
import { loadCharts, chartSlot, barChart } from '__main_assets__/js/libs/charts.js';
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
`__main_assets__/` is a build-time specifier resolved by the esbuild plugin in
|
|
17
|
+
`packages/web/src/assets.js`: `__main_assets__/js/...` points at the CORE layer
|
|
18
|
+
root (`packages/web/core/`), `__main_assets__/themes/...` at the packaged themes
|
|
19
|
+
dir. It is layer-independent, so a consumer's own page module in
|
|
20
|
+
`src/assets/js/pages/` writes exactly the specifier core's own pages write
|
|
21
|
+
(`core/js/pages/admin/index.js`, `core/js/layouts/modules/utilities/redirect.js`,
|
|
22
|
+
`themes/classy/_theme.js`, `runtime/boot.js`). There are no exceptions: every
|
|
23
|
+
bundle the pipeline builds — main, page, layout — carries the alias plugin
|
|
24
|
+
([#624](https://github.com/Omega-JS-Stack/omega/issues/624) deleted the
|
|
25
|
+
standalone-IIFE `js/modules/` lane that did not).
|
|
26
|
+
|
|
27
|
+
`js/modules/` is therefore not an asset lane in ANY layer. A directory that
|
|
28
|
+
still exists builds nothing, and the build prints one warning naming it rather
|
|
29
|
+
than ignoring it in silence ([#249](https://github.com/Omega-JS-Stack/omega/issues/249)).
|
|
30
|
+
Shared code goes in `js/libs/`; a script that belongs to one layout goes in
|
|
31
|
+
`js/layouts/<layout>.js`.
|
|
32
|
+
|
|
33
|
+
## Premade consumer JS: `src/assets/js/libs/`
|
|
34
|
+
|
|
35
|
+
The consumer twin of this directory. A brand's own shared browser modules live
|
|
36
|
+
in `src/assets/js/libs/` and are imported **by path** from any page module or
|
|
37
|
+
from `js/main.js`:
|
|
38
|
+
|
|
39
|
+
```js
|
|
40
|
+
// src/assets/js/pages/pricing/index.js
|
|
41
|
+
import { trackPlanChoice } from '../../libs/pricing-telemetry.js';
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Nothing declares them and nothing registers them: they are ordinary modules the
|
|
45
|
+
bundler follows from whichever entry imports them, so they land in the importing
|
|
46
|
+
bundle (or a shared chunk, when more than one entry uses them) and cost nothing
|
|
47
|
+
on a page that does not. The framework's own `libs/` below are reached the same
|
|
48
|
+
way, through the `__main_assets__` specifier instead of a relative path — one
|
|
49
|
+
idiom, two layers.
|
|
50
|
+
|
|
51
|
+
Two neighbours it is NOT: `js/pages/**` is keyed by URL and loads itself, and
|
|
52
|
+
`js/layouts/**` is keyed by layout name and does the same — a lib is only ever
|
|
53
|
+
loaded by something that imports it. A `js/pages/` file nothing imports and no
|
|
54
|
+
URL claims is dead code, and the orphan guard says so
|
|
55
|
+
([#469](https://github.com/Omega-JS-Stack/omega/issues/469)); a `js/libs/` file
|
|
56
|
+
nothing imports is simply never built.
|
|
57
|
+
|
|
58
|
+
## The consumer rule: import the helper, never the library
|
|
59
|
+
|
|
60
|
+
charts.js and graph.js state it, and it holds for both: @tanstack/charts and
|
|
61
|
+
mermaid are dependencies of `@omega.js/web`, never a CDN load at runtime, and a
|
|
62
|
+
page reaches either one ONLY through its helper module. Consumers import the helpers and
|
|
63
|
+
never name the underlying library, so its version and delivery stay the
|
|
64
|
+
framework's to change. The helpers own three things a page would otherwise have
|
|
65
|
+
to redo:
|
|
66
|
+
|
|
67
|
+
- **Lazy loading.** The library import inside `loadCharts` / `loadGraph` is
|
|
68
|
+
dynamic, and the bundle is ESM with splitting, so each library lands in its
|
|
69
|
+
own chunk fetched only when a page asks for it. A page with no chart or
|
|
70
|
+
diagram pays nothing.
|
|
71
|
+
- **Theming.** Colors are read off the `--omega-*` token sheet at draw time
|
|
72
|
+
([docs/shared/theming.md](shared/theming.md)), so a chart or diagram follows
|
|
73
|
+
the brand ramp and dark mode without knowing either exists.
|
|
74
|
+
- **Bundling.** The framework's own installed copy of the library resolves for
|
|
75
|
+
whoever imports it, so it ships once.
|
|
76
|
+
|
|
77
|
+
The practical consequence for a consumer: do not hand-roll SVG for a chart or a
|
|
78
|
+
diagram, and do not add @tanstack/charts or mermaid to a target's dependencies.
|
|
79
|
+
|
|
80
|
+
## The modules
|
|
81
|
+
|
|
82
|
+
| Module | What it is | Key exports |
|
|
83
|
+
|---|---|---|
|
|
84
|
+
| `admin-helpers.js` | Formatting and stat-cell helpers for the admin pages: relative timestamps, capitalization, and writing a settled Firestore count-aggregation result (or an inline error) into a stat element | `formatTimeAgo`, `capitalize`, `setStatValue`, `setStatSubValue` |
|
|
85
|
+
| `alert-dismiss.js` | The site alerts' × ([#719](https://github.com/Omega-JS-Stack/omega/issues/719)): one delegated `document` click handler hiding the `.main-alert` a pressed `.main-alert-close` sits in. `core/js/main.js` calls it, so every banner `core/_includes/core/body.html` ships is dismissible on every page, an alert injected after boot included | `setupAlertDismiss` |
|
|
86
|
+
| `analytics.js` | The web HOST of the analytics facade ([#328](https://github.com/Omega-JS-Stack/omega/issues/328)): it wires the page's three seams into `@omega.js/analytics` and is the ONE way core code counts anything. Detail below | `event`, `identify`, `reset`, `configureAnalytics`, `readPlatformCookies`, `PLATFORM_COOKIES` |
|
|
87
|
+
| `charts.js` | TanStack Charts behind framework helpers: lazy load, token colors, a slot to draw into, four chart builders. Detail below | `loadCharts`, `chartsReady`, `chartColors`, `resolveColor`, `chartSlot`, `chartDefinition`, `barChart`, `stackedBarChart`, `doughnutChart`, `lineChart` |
|
|
88
|
+
| `dev.js` | Development-only helpers, imported by `runtime/boot.js` only when `manager.isDevelopment()`: a click logger, a breakpoint logger on resize, and the palette's **Tools** section — "Log opening tags" and "Toggle theme", which were `window.logOpeningTags()` / `window.changeTheme()` until [#342](https://github.com/Omega-JS-Stack/omega/issues/342) made the palette the one home | default export: a function that installs all of it |
|
|
89
|
+
| `graph.js` | mermaid behind framework helpers, on the charts contract: a definition in, an SVG out. Detail below | `loadGraph`, `graphReady`, `graphTheme`, `graphSlot`, `drawGraph` |
|
|
90
|
+
| `initialize-tooltips.js` | Initializes every `[data-bs-toggle="tooltip"]` element as a Bootstrap tooltip, and exits early when the page has none. The ONE home for the behavior ([#99](https://github.com/Omega-JS-Stack/omega/issues/99)): each theme's `_theme.js` calls it from its DOM-ready handler instead of shipping its own copy | default export: `initializeTooltips()` |
|
|
91
|
+
| `logger.js` | The web runtime's tagged console, `[@omega.js/web:<module>]` with no timestamp ([#12](https://github.com/Omega-JS-Stack/omega/issues/12)). The methods are getters returning a bound `console` method, so devtools attributes each line to the real call site and a swapped `console` method is still seen | `createLogger(module)`, also the default export |
|
|
92
|
+
| `omega-copy.js` | Declarative copy-to-clipboard ([#709](https://github.com/Omega-JS-Stack/omega/issues/709)): one delegated `document` click handler making any `data-omega-copy` element a copy control, so a page writes no JS. The copied value resolves in order — the `omegaCopyValue` property or `data-omega-copy-value` (display and clipboard may differ: a masked row copies the real credential), a selector in `data-omega-copy` (an input's value, a `<pre>`'s text), then the sibling field in the same `.input-group`. Feedback is `showNotification` ('Copied!' / 'Failed to copy' / 'Nothing to copy'). `core/js/main.js` calls it | `setupCopy` |
|
|
93
|
+
| `path-prefix.js` | The browser half of base-path support ([#355](https://github.com/Omega-JS-Stack/omega/issues/355)): reads the mount off `<html data-omega-path-prefix>` (the build's own stamp — never baked into the bundle) and mounts a root-relative site path under it. Every absence — no stamp, no document, a worker scope — means the domain root | `pathPrefix()`, `siteUrl(path)` |
|
|
94
|
+
| `payment-config.js` | Reads the payment config (products, providers, prices, feature values, currency) off `omega.config.payment` and the FEATURES CATALOG off `omega.config.features`, both populated by the build, so no page fetches either at runtime. A feature is defined ONCE in the catalog and a product names only its value ([#647](https://github.com/Omega-JS-Stack/omega/issues/647)), so `getProductLimits` is the catalog-aware read: only the counted features a product gives a NUMBER | `getPaymentConfig`, `getProviders`, `getProducts`, `getProductById`, `getFeatureCatalog`, `getFeature`, `getProductFeatures`, `getProductLimits`, `getProductPrices`, `getCurrency` |
|
|
95
|
+
| `recaptcha.js` | reCAPTCHA v3 for any public form posting to a recaptcha-gated backend route (checkout payment intent, newsletter capture): lazy script load through `omega.dom().loadScript()`, then a token per action. Site key: `omega.config.captcha.providers.recaptcha.siteKey` | `initializeRecaptcha(siteKey)`, `getRecaptchaToken(action)` |
|
|
96
|
+
| `srcset.js` | The srcset candidate parser for the browser ([#367](https://github.com/Omega-JS-Stack/omega/issues/367)): rewrites every candidate URL through a caller's function, reading a comma inside a URL (a `data:` payload, a `?w=100,200` query) as part of the URL. The FORMAT TWIN of the build-time `packages/web/src/srcset.js` — a grammar change lands in both files, and each one says so. Used by the runtime lazy-loader for the `data-srcset` lane the build passes defer | `mapSrcset(value, mapUrl)` |
|
|
97
|
+
| `sale-name.js` | Picks the promotion name for a date. Holidays (Black Friday, Cyber Monday, Christmas, Easter) run a window of 7 days before to 3 days after their core date, and a later holiday only takes over once the earlier one's core date has passed; with no holiday active it falls back to the season (`Spring Sale`, and `End of Summer Sale` past 70% of the season), then to a plain `Sale` | `getSaleName(date)`, `getUpcomingSales(startDate, endDate)`, default `{ getSaleName, getUpcomingSales }` |
|
|
98
|
+
|
|
99
|
+
### analytics.js
|
|
100
|
+
|
|
101
|
+
The ONE call, and nothing about a provider at the call site:
|
|
102
|
+
|
|
103
|
+
```js
|
|
104
|
+
import { event } from '__main_assets__/js/libs/analytics.js';
|
|
105
|
+
|
|
106
|
+
event('user_refund_request', { action: 'submit' });
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
The name is a CANONICAL event from `@omega.js/analytics`' catalog, which decides
|
|
110
|
+
which providers hear it, under which native name, in which dialect — the whole
|
|
111
|
+
contract is [docs/shared/analytics.md](shared/analytics.md). This module is
|
|
112
|
+
the web HOST of that facade: it injects the three seams only a page can supply,
|
|
113
|
+
once, and exports the call sites' entry points.
|
|
114
|
+
|
|
115
|
+
| Seam | What web supplies |
|
|
116
|
+
|---|---|
|
|
117
|
+
| `transport` | the package's guarded browser transport — `gtag` / `fbq` / `ttq`, each checked with `typeof` before it is called |
|
|
118
|
+
| `consent` | a gate over `libs/tracking-consent.js`, read LIVE, so a visitor who accepts mid-session is counted from that moment ([#383](https://github.com/Omega-JS-Stack/omega/issues/383)) |
|
|
119
|
+
| `context` | `runtime: 'web'` plus the captured attribution, flattened into what the adapters read ([#384](https://github.com/Omega-JS-Stack/omega/issues/384)) |
|
|
120
|
+
|
|
121
|
+
`environment` is NOT web's: @omega.js/client injects it from the brand's own
|
|
122
|
+
`config.environment`, which is what decides whether an unknown event name throws.
|
|
123
|
+
|
|
124
|
+
The package is reached THROUGH @omega.js/client (`@omega.js/client/modules/analytics.js`),
|
|
125
|
+
never as a bare `@omega.js/analytics`: the analytics package is private and never
|
|
126
|
+
publishes, so in a consumer install it exists only as the copy vendored into the
|
|
127
|
+
client's dist — and the client is a real runtime dependency of every framework.
|
|
128
|
+
|
|
129
|
+
**Identity is not an event.** `identify(user)` and `reset()` set what the events
|
|
130
|
+
after them inherit — GA4's user properties, the Meta Pixel's advanced-matching
|
|
131
|
+
`init`, TikTok's `identify` — so they have no catalog entry, and they live here,
|
|
132
|
+
guarded the same way. `core/js/core/auth.js` calls them off the auth state. GA4's
|
|
133
|
+
`user_id` is deliberately NOT among them: @omega.js/client's `setUserId` owns
|
|
134
|
+
that one key on every runtime and sends the derived `uuidv5(uid, namespace)`
|
|
135
|
+
value, so a raw uid written here would only clobber it.
|
|
136
|
+
|
|
137
|
+
**`readPlatformCookies()`** is exported for the same SSOT reason: the checkout's
|
|
138
|
+
intent payload needs the `_fbc`/`_fbp`/`_ttp` read at conversion time
|
|
139
|
+
(`pages/payment/checkout/modules/api.js`), and one reader means a separator quirk
|
|
140
|
+
cannot be fixed on one path and left on the other.
|
|
141
|
+
|
|
142
|
+
**Why guarded at all**: `gtag`, `fbq` and `ttq` are page-level snippets, and an
|
|
143
|
+
ad blocker does not stub them — it keeps them from ever being defined, so a BARE
|
|
144
|
+
call throws a ReferenceError. Every one of these calls sits in front of the thing
|
|
145
|
+
the customer just pressed, so the throw takes the action with it. That was the
|
|
146
|
+
billing card's dead "Undo cancellation" button
|
|
147
|
+
([#283](https://github.com/Omega-JS-Stack/omega/issues/283)), found again in 19
|
|
148
|
+
other files ([#306](https://github.com/Omega-JS-Stack/omega/issues/306)). Each
|
|
149
|
+
provider is checked on its own, because blockers work per list: a page that lost
|
|
150
|
+
Meta still counts Google. The same reasoning covers this module's own storage
|
|
151
|
+
reads (consent, attribution): a read that fails is a denial or an absence, never
|
|
152
|
+
a raise.
|
|
153
|
+
|
|
154
|
+
`test/analytics-blocked.test.js` keeps it the SSOT with two static sweeps: no
|
|
155
|
+
file under `core/js` or the theme layer calls a provider global bare, and none
|
|
156
|
+
names a provider at all — the retired `trackGoogle` / `trackMeta` / `trackTikTok`
|
|
157
|
+
wrappers cannot regrow one page module at a time. Two files may name the globals:
|
|
158
|
+
this module (the guard itself, plus the identity calls) and
|
|
159
|
+
`core/js/core/analytics-loader.js`, which DEFINES them.
|
|
160
|
+
|
|
161
|
+
### charts.js
|
|
162
|
+
|
|
163
|
+
The library is [TanStack Charts](https://tanstack.com/charts/latest) — a
|
|
164
|
+
grammar (marks, scales, mappings) with a framework-neutral DOM host that
|
|
165
|
+
renders SVG ([#772](https://github.com/Omega-JS-Stack/omega/issues/772)). It is
|
|
166
|
+
**Alpha**, where 0.x minors move together and may break, so the version is an
|
|
167
|
+
EXACT pin in `packages/web/package.json` (`"@tanstack/charts": "0.16.0"`, no
|
|
168
|
+
range) and an update is a deliberate read of its release notes.
|
|
169
|
+
|
|
170
|
+
The lifecycle is load, slot, draw:
|
|
171
|
+
|
|
172
|
+
1. `await loadCharts()` loads the library once. It is idempotent and safe to
|
|
173
|
+
call on every poll (a failed load clears the cached promise so a later call
|
|
174
|
+
can retry), and it resolves a boolean. The grammar is per-capability, so the
|
|
175
|
+
one call fetches the root (Cartesian marks + the DOM host) alongside the
|
|
176
|
+
polar, tooltip and scale subpaths — several chunks, one lazy load.
|
|
177
|
+
2. `chartSlot(id, height = 220, series = [])` returns the markup to render: a
|
|
178
|
+
height-bearing box around a `<div id="…">` host that fills it, because the
|
|
179
|
+
host follows its container's WIDTH on its own and is told its height. It
|
|
180
|
+
stamps `series` onto the box as `data-series` so `@omega.js/client`'s
|
|
181
|
+
write-on-change `swap` (`modules/live-page`) sees a data-only change and
|
|
182
|
+
redraws; a host carries no data of its own, so without the stamp the old
|
|
183
|
+
picture would stand.
|
|
184
|
+
3. One of `barChart` (with `horizontal` for ranked rows), `stackedBarChart`,
|
|
185
|
+
`doughnutChart`, `lineChart` draws into that id and returns the chart host,
|
|
186
|
+
or `null` when nothing was drawn.
|
|
187
|
+
|
|
188
|
+
`chartsReady()` is the synchronous check for a render path. Every draw destroys
|
|
189
|
+
the host already mounted on that id first (the module keeps a Map of id → host),
|
|
190
|
+
so repainting on each poll replaces rather than stacks, and `svgAnimation` is
|
|
191
|
+
off for the same reason: a polled page would otherwise spend most of its life
|
|
192
|
+
growing bars back out of the axis.
|
|
193
|
+
|
|
194
|
+
A value axis is labelled in WHOLE numbers: these charts count things, and the
|
|
195
|
+
library's own tick policy is a responsive count that lands on 0.5 on a small
|
|
196
|
+
domain. The helper supplies integer candidates on the 1/2/5 ladder and a
|
|
197
|
+
configured `[first tick, last tick]` domain, so the axis ends exactly on its
|
|
198
|
+
ticks; zero always stays on the axis, and a negative reading widens the span downwards.
|
|
199
|
+
|
|
200
|
+
A tooltip names the THING being read, never the channel it rode in on
|
|
201
|
+
([#800](https://github.com/Omega-JS-Stack/omega/issues/800)): a bar says
|
|
202
|
+
`label: value`, a stacked segment and a line reading say `series · label: value`,
|
|
203
|
+
and a doughnut slice adds its share of the whole. The unit travels with the
|
|
204
|
+
data — `format: { prefix?, suffix?, decimals? }` on any builder's data argument,
|
|
205
|
+
plain JSON so a page carrying chart data alone can hold it — and it prints in
|
|
206
|
+
the tooltip AND on the value axis, so a money chart says `$` in both places.
|
|
207
|
+
Stated `decimals` are exact (`$7.00`); unstated, a count prints as itself and a
|
|
208
|
+
fraction gets at most two places. A page with JS may pass
|
|
209
|
+
`tooltip: (point) => string` to take the whole line over, where `point.datum` is
|
|
210
|
+
the row the mark drew (`{label, value}`, plus `series` on a stacked or line
|
|
211
|
+
chart, plus `fraction` on a doughnut).
|
|
212
|
+
|
|
213
|
+
`chartDefinition(kind, data)` — `'bar'`, `'stacked'`, `'doughnut'`, `'line'` —
|
|
214
|
+
returns the definition a builder would draw, without drawing it. A definition is
|
|
215
|
+
renderer-neutral and DOM-free, which is what lets the package's own suite
|
|
216
|
+
(`test/dataviz.test.js`) compile all four through `createChartScene` and assert
|
|
217
|
+
real geometry in node. The PAINT still needs a browser: the sandbox e2e lane's
|
|
218
|
+
chart step (`brands/sandbox-brand/test/e2e/run.js` → `window.__omega.drawCharts()`)
|
|
219
|
+
fails a chart whose host holds no SVG mark with a non-zero box. An unknown kind
|
|
220
|
+
is a programmer error and throws.
|
|
221
|
+
|
|
222
|
+
Element ids are authored, so `chartSlot` throws on anything that is not a plain
|
|
223
|
+
id. When the library did not load, `chartSlot` returns a line saying so in place
|
|
224
|
+
of the host instead of leaving a hole, which is why a chart always sits beside
|
|
225
|
+
the same figures in a table or statgrid.
|
|
226
|
+
|
|
227
|
+
Theming: `chartColors()` reads `--omega-ink-muted`, `--omega-line`,
|
|
228
|
+
`--omega-accent`, and the categorical ramp `--omega-chart-1` through
|
|
229
|
+
`--omega-chart-6` off `:root`, falling back token, then Bootstrap variable, then
|
|
230
|
+
a hardcoded color. Those values become the definition's `theme` (axis and
|
|
231
|
+
legend ink, gridlines, the categorical palette) and its color scale's `range`.
|
|
232
|
+
`resolveColor()` turns a `var(--token)` string into a real color, which is how a
|
|
233
|
+
caller passes `colors: ['var(--omega-ok)', …]` to keep STATUS meaning where the
|
|
234
|
+
categorical ramp would only say "different". Tokens are read at draw time and
|
|
235
|
+
nothing listens for a theme flip, so a light/dark switch lands on the next
|
|
236
|
+
redraw.
|
|
237
|
+
|
|
238
|
+
### graph.js
|
|
239
|
+
|
|
240
|
+
The same shape, for mermaid diagrams: `await loadGraph()`, then
|
|
241
|
+
`graphSlot(id, height = 320, definition = '')`, then
|
|
242
|
+
`await drawGraph(id, definition)`, with `graphReady()` as the synchronous check.
|
|
243
|
+
`drawGraph` returns the SVG it rendered (also written into the host), or `null`.
|
|
244
|
+
The module takes a DEFINITION in and puts an SVG out: composing the mermaid text
|
|
245
|
+
is the page's business, because the shapes and words in a diagram are content,
|
|
246
|
+
not framework.
|
|
247
|
+
|
|
248
|
+
`graphSlot`'s height is a FLOOR (`min-height`): the host is empty until the
|
|
249
|
+
render lands, so the box reserves the space rather than letting the page jump,
|
|
250
|
+
and a taller diagram still grows past it. The definition is stamped as
|
|
251
|
+
`data-series` for the same `swap` reason charts stamp their series, and ids are
|
|
252
|
+
validated the same way.
|
|
253
|
+
|
|
254
|
+
`graphTheme()` resolves the live tokens into mermaid `themeVariables` for the
|
|
255
|
+
`base` theme: ink, both surfaces, `--omega-line` for edges, `--omega-accent` for
|
|
256
|
+
the node outline, and the same `--omega-chart-1` through `--omega-chart-6` ramp
|
|
257
|
+
charts read, mapped onto mermaid's `cScale0` through `cScale5` and `pie1` through
|
|
258
|
+
`pie6` slots (an unset slot is left out so mermaid derives its own). Mermaid
|
|
259
|
+
paints with literal colors, so nothing is ever handed a `var()`. `drawGraph`
|
|
260
|
+
initializes per render (`startOnLoad: false`, `securityLevel: 'strict'`,
|
|
261
|
+
`suppressErrorRendering: true`) because the tokens are read per render, and it
|
|
262
|
+
throws on a definition that does not parse: diagram text is authored, so a syntax
|
|
263
|
+
error in it is a programmer error and says so instead of drawing nothing.
|
|
264
|
+
|
|
265
|
+
## The auth cluster (`libs/auth/`)
|
|
266
|
+
|
|
267
|
+
The three auth pages (`/signin`, `/signup`, `/reset`) share nearly all of their
|
|
268
|
+
logic, so the page modules import one orchestrator and the flows live in focused
|
|
269
|
+
modules beside it. `auth/index.js` builds a shared context object
|
|
270
|
+
(`{ formManager, useAuthPopup }`) and passes it explicitly to every flow that
|
|
271
|
+
needs it.
|
|
272
|
+
|
|
273
|
+
The boot order is the orchestrator's whole job, and it runs inside
|
|
274
|
+
`omega.dom().ready()`: handle `?authSignout`, then `?authCustomToken`, then
|
|
275
|
+
`?authPrivateKey` (return if either sign-in took over, the page is navigating),
|
|
276
|
+
then build the page's form from the `data-page-path` suffix, disable the fields
|
|
277
|
+
while checking for a returning OAuth redirect (return if one was handled), then
|
|
278
|
+
check the subdomain policy, call
|
|
279
|
+
`formManager.ready()`, and propagate `authReturnUrl` into the page's auth links.
|
|
280
|
+
|
|
281
|
+
| Module | What it is | Key exports |
|
|
282
|
+
|---|---|---|
|
|
283
|
+
| `auth/index.js` | The orchestrator: owns the boot order above and picks the form by matching the final segment of `data-page-path`. Imported by the `/signin`, `/signup`, and `/reset` page modules | default export: a function |
|
|
284
|
+
| `auth/forms.js` | FormManager wiring for the three forms (built with `autoReady: false`, since the boot sequence calls `ready()` itself), the shared validation that only checks email and password when the pressed button's `data-provider` is `email`, the provider-aware submit handler, and the signup consent UI: both checkboxes are outlined as one unit, and consent is stashed to `omega.storage()` BEFORE any Firebase call so it survives the post-signup redirect for the backend's signup route | `initializeSigninForm`, `initializeSignupForm`, `initializeResetForm` |
|
|
285
|
+
| `auth/email.js` | Email and password flows. Signup falls back to signing the user in when the address is already in use; reset reports success even for an unknown address, to avoid email enumeration; and each error lands on the field it belongs to (Firebase collapses wrong-email and wrong-password into one code, so both fields get the shared message) | `handleEmailSignin`, `handleEmailSignup`, `handlePasswordReset` |
|
|
286
|
+
| `auth/oauth.js` | Provider flows: redirect by default, popup only inside an iframe or with `?authPopup=true`, with a popup-to-redirect fallback on blockers. Also the returning-redirect provider (a one-shot sessionStorage marker makes a redirect that came home empty loud instead of silent) and the accidental-signup reversal: Google auto-creates an account during a signin attempt, so the reversal deletes it, signs out, and shows an inline error — and marks the uid for `auth/orphan.js` when that delete fails | `shouldUseAuthPopup`, `handleRedirectResult`, `signInWithProvider`, `reverseAccidentalSignup` |
|
|
287
|
+
| `auth/orphan.js` | The failed-delete backstop ([#703](https://github.com/Omega-JS-Stack/omega/issues/703)): a reversal whose `.delete()` fails leaves a live account with no consent record, and nothing about the account says so afterwards (a self-read is always allowed, and every account is consent-less until the `/user/signup` post lands), so the browser that failed the delete marks the uid in `omega.storage()`. `core/js/core/auth.js` retries the delete at auth-ready for THAT uid and nothing else — an account with legal consent on record is never touched, and a deliberate signup clears the markers before Firebase is called. A second failure signs the user out, reports it, and keeps the marker for the next visit | `markOrphanedAccount`, `clearOrphanMarkers`, `retryOrphanCleanup` |
|
|
288
|
+
| `auth/session-params.js` | The URL-parameter session behaviors: `?authSignout=true` (sign out, then strip the param so reloads do not loop), `?authCustomToken=…` (admin impersonation and custom-token sign-in, which owns its own post-signin navigation), `?authPrivateKey=…` (the durable-URL lane for an OBS dock, a kiosk, or a bookmark: a custom token expires in an hour, so the key buys a fresh one at `POST /omega/user/token` on every load, is stripped from the address bar BEFORE the page moves, and is never logged, notified, or captured), `authReturnUrl` propagation into every auth link on the page, and the apex-domain bounce when `auth.config.allowSubdomainAuth` is false | `handleAuthSignout`, `handleCustomTokenSignin`, `handlePrivateKeySignin`, `updateAuthReturnUrl`, `checkSubdomainAuth` |
|
|
289
|
+
| `auth/errors.js` | Pure Firebase error translation, no DOM and no form state: which codes belong on the password field, the short message for each, which codes are user-caused and therefore never worth a Sentry capture, and pulling a `@omega.js/backend` blocking-function message (rate limit, disposable email) back out of the opaque `auth/internal-error` blob | `isPasswordError`, `passwordErrorMessage`, `isUserError`, `extractBlockingFunctionMessage` |
|
|
290
|
+
| `auth/tracking.js` | GA4, Facebook Pixel, and TikTok Pixel events for the three auth outcomes | `trackLogin`, `trackSignup`, `trackPasswordReset` |
|
|
291
|
+
| `auth/password-toggle.js` | The password eye, registered once as the `password-toggle` click trigger on `@omega.js/client`'s shared trigger registry ([#16](https://github.com/Omega-JS-Stack/omega/issues/16)). `core/js/main.js` calls it, so it is armed on every page before any page module runs, and delegation covers input groups rendered after boot | `setupPasswordToggle` |
|
|
292
|
+
|
|
293
|
+
## See also
|
|
294
|
+
|
|
295
|
+
- [docs/web/index.md](index.md) for the framework guide, including the bundler
|
|
296
|
+
aliases and the conventions charts, graphs, and the log tag are pinned by
|
|
297
|
+
- [docs/shared/theming.md](shared/theming.md) for the `--omega-*` tokens the
|
|
298
|
+
chart and graph helpers read
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: ratified
|
|
3
|
+
created: 2026-07-18
|
|
4
|
+
---
|
|
5
|
+
# OMEGA Sections & Components — Architecture Spec
|
|
6
|
+
|
|
7
|
+
> **STATUS: RATIFIED (Ian, 2026-07-18 — same night as the design).** Extraction underway; durable parts migrate to `docs/web/sections.md` as pieces land.
|
|
8
|
+
> Scope: ALL frameworks (web, desktop, extension, future) — this design is made once and never redesigned. No backwards compat anywhere (standing rule).
|
|
9
|
+
|
|
10
|
+
## 0. Why (the ruling that produced this)
|
|
11
|
+
|
|
12
|
+
The frontmatter-monolith model (theme layout = whole page, copy as frontmatter defaults) has one fatal flaw — the **fork cliff**: consumers can override words but never structure; the only escape is owning a 600-line layout forever. Ian + Claude independently converged on a **section/component library**: structure becomes data, sections stay framework-owned, updates keep flowing. Massive frontmatter is explicitly rejected ("we tried that and its ugly") — frontmatter shrinks to page meta only.
|
|
13
|
+
|
|
14
|
+
## 1. The two-tier library
|
|
15
|
+
|
|
16
|
+
- **Sections** — full-width page bands (hero, testimonials, bento, pricing table, article list…). Pages are compositions of sections.
|
|
17
|
+
- **Components** — smaller reusable pieces (browser frame with mac buttons, terminal, marquee, stat card…). Used inside sections and directly in pages.
|
|
18
|
+
|
|
19
|
+
Both tiers share the same anatomy, resolution, and asset rules.
|
|
20
|
+
|
|
21
|
+
## 2. Anatomy — a section is a folder that owns everything about itself
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
themes/base/_sections/marketing/hero/
|
|
25
|
+
section.html ← markup (Liquid). The args are the data contract.
|
|
26
|
+
section.scss ← its styles (optional)
|
|
27
|
+
section.js ← its behavior (optional — most sections have none)
|
|
28
|
+
section.json5 ← meta: arg schema + defaults + showcase demo data
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
(Naming amendment, cp204: the folder families are `_sections`/`_components` —
|
|
32
|
+
the Jekyll-family underscore marks template machinery, matching
|
|
33
|
+
`_layouts`/`_includes`, and keeps Eleventy from processing them as content.)
|
|
34
|
+
|
|
35
|
+
Components identical with `component.*` filenames. Standard filenames (not `<name>.html`) so tooling/resolvers are predictable.
|
|
36
|
+
|
|
37
|
+
**The context-free rule (load-bearing):** args in → HTML out. Section markup never reaches into page globals (`site.*`, nav state, collections). This single rule is what makes sections renderable on every framework surface and portable to any future engine.
|
|
38
|
+
|
|
39
|
+
## 3. Organization — nested, dozens-scale
|
|
40
|
+
|
|
41
|
+
- Section id = path under `sections/` (kebab-case): `marketing/hero`, `commerce/pricing-table`, `content/article-list`, `app/stat-cards`.
|
|
42
|
+
- Arbitrary nesting allowed; the showcase groups by folder automatically.
|
|
43
|
+
- Same for components: `frame/browser`, `frame/terminal`, `motion/marquee`.
|
|
44
|
+
|
|
45
|
+
## 4. Resolution & layering (mirrors the theme layer chain)
|
|
46
|
+
|
|
47
|
+
For `{% section "marketing/hero" %}`, first match wins:
|
|
48
|
+
|
|
49
|
+
1. **Consumer-local**: `<src>/_sections/marketing/hero/` — consumers author their own sections here (their git holds ONLY their own work)
|
|
50
|
+
2. **Active theme**: `themes/<active>/_sections/...`
|
|
51
|
+
3. **Base layer**: `themes/base/_sections/...` — the floor, same as the theming two-lane model
|
|
52
|
+
|
|
53
|
+
Theme sections live inside the installed package (never scaffolded into the consumer repo) — consumer git stays clean; framework updates flow.
|
|
54
|
+
|
|
55
|
+
## 5. Authoring syntax
|
|
56
|
+
|
|
57
|
+
**Frontmatter is minimal forever**: meta title/description, permalink, page-level config only. Content lives in the body as section calls.
|
|
58
|
+
|
|
59
|
+
Inline form (simple args):
|
|
60
|
+
```liquid
|
|
61
|
+
{% section "marketing/hero", headline: "Ship every surface" %}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Block form (structured data — objects, arrays, N items):
|
|
65
|
+
```liquid
|
|
66
|
+
{% section "marketing/testimonials" %}
|
|
67
|
+
headline: "What builders say"
|
|
68
|
+
items:
|
|
69
|
+
- quote: "Shipped in a weekend."
|
|
70
|
+
name: "Avery Quinn"
|
|
71
|
+
role: "Founder, Loopwork"
|
|
72
|
+
- quote: "One config. Every surface."
|
|
73
|
+
name: "Sam Okafor"
|
|
74
|
+
role: "CTO, Fieldnote"
|
|
75
|
+
{% endsection %}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
- Block body = YAML (same dialect as frontmatter). One tag, two forms; using both inline args and a block body on the same call is an error (simplicity first).
|
|
79
|
+
- **Amendment (Ian 2026-07-18, landed cp224) — slots**: the body may also carry named markup blocks (`{% slot demo_html %}<any html>{% endslot %}`), composing with inline args OR the YAML (the both-forms error applies to the YAML remainder). Slot content renders in the caller's scope and reaches the section as a finished-HTML string arg (schema type `html`), merged outermost and never re-rendered. Full contract: docs/web/sections.md.
|
|
80
|
+
- No args → the theme's default copy renders (defaults from `section.json5`).
|
|
81
|
+
- Components: `{% component "frame/browser", url: "app.example.com" %}` — same two forms.
|
|
82
|
+
- Sections must be **N-item responsive by design** (auto-fit grids etc.) — item count is data, layout self-adjusts; showcase demo data exercises 1/3/many variants.
|
|
83
|
+
|
|
84
|
+
## 6. Schemas & validation (`section.json5`)
|
|
85
|
+
|
|
86
|
+
- Declares: args (name, type: string/number/bool/array/object/enum, default, description), demo data for the showcase (variants allowed).
|
|
87
|
+
- Build-time validation: unknown arg → warning with did-you-mean (`hero.headlin` → `headline`); type mismatch → warning. This is the typed-props benefit without changing engines.
|
|
88
|
+
- Schema names are **API** — renames are breaking and follow deprecation discipline (warn one minor, remove later).
|
|
89
|
+
- **Defaults ownership (cp205 ruling)**: a section used by ONE page lifts that page's default copy into its json5 (hero precedent); a section SHARED by multiple pages (testimonials: index + pricing + alternatives) keeps json5 defaults NEUTRAL — mechanical knobs only (e.g. the avatar placeholder frame) — and every caller passes its own copy over the data bridge, so no page can ever inherit another page's words.
|
|
90
|
+
|
|
91
|
+
## 7. Assets
|
|
92
|
+
|
|
93
|
+
- **CSS**: every section's `section.scss` compiles into the theme sheet (stable order); **PurgeCSS (already in the pipeline) strips sections a site never renders** — shipped CSS self-trims, zero config.
|
|
94
|
+
- **JS**: section JS bundles into the theme bundle behind DOM-presence auto-init (`data-omega-section="marketing/hero"` → init only when present) — same pattern as the motion library. Manifest-driven per-section splitting stays available later if bundles fatten.
|
|
95
|
+
- **Page assets — `asset_path` is DEAD**, replaced by wildcard filenames (Next.js convention, Windows-safe):
|
|
96
|
+
- `js/pages/team/[id].js` / `css/pages/team/[id].scss` match any `/team/<segment>` page without an exact module; exact path beats wildcard.
|
|
97
|
+
- Internal uses convert too (`js/pages/blog/[slug].js`); zero frontmatter involved.
|
|
98
|
+
|
|
99
|
+
## 8. Pages model — blueprints stay, absence is the spine
|
|
100
|
+
|
|
101
|
+
- **No file → theme/blueprint default renders** (Ian's loved behavior, preserved verbatim). Default pages become section compositions internally; pricing/contact/TOS keep filling from config.
|
|
102
|
+
- **`omega customize <url>`** (verb SETTLED, Ian 2026-07-18): materializes the page prefilled with the default composition as clean one-liners (no copy inlined) — consumer adds args only where they diverge. Nobody starts blank; nobody owns what they didn't change.
|
|
103
|
+
- Deep escape hatch unchanged: consumer-local theme file override = own that file forever (documented cost: its updates freeze).
|
|
104
|
+
|
|
105
|
+
### Sample content (Ian 2026-07-18)
|
|
106
|
+
|
|
107
|
+
- Posts/teammates/updates-style filler stays **SHARED across themes** — never per-theme. Scope = that filler only; anything bigger goes back to Ian.
|
|
108
|
+
- It becomes **auto-generated with rolling current dates** (a virgin blog always looks alive, never "6 months stale") and materializes only under a **gitignored test path** in the consumer tree — never committed, never mixed with real brand content.
|
|
109
|
+
|
|
110
|
+
### Update semantics (the truth table)
|
|
111
|
+
|
|
112
|
+
| Consumer state | Theme updates (html/css/js/copy) | What's preserved |
|
|
113
|
+
|---|---|---|
|
|
114
|
+
| No file | Everything flows | — (nothing to preserve) |
|
|
115
|
+
| Composition + args | All section internals flow; their words/composition preserved; framework NEVER writes consumer files | Their args + composition |
|
|
116
|
+
| Forked theme file | Nothing flows for that file | Everything (frozen at fork) |
|
|
117
|
+
|
|
118
|
+
Only schema renames can bite the middle row — governed by §6 deprecation + warnings.
|
|
119
|
+
|
|
120
|
+
## 9. Showcase & docs — auto-generated
|
|
121
|
+
|
|
122
|
+
- The showcase iterates the section/component library and renders each entry with its `section.json5` demo data (all variants). New section → appears automatically. The showcase stops being a hand-built page.
|
|
123
|
+
- Reference docs generate from the same schemas (args table per section).
|
|
124
|
+
|
|
125
|
+
## 10. Multilanguage
|
|
126
|
+
|
|
127
|
+
- **The existing post-build translation system stays THE mechanism** (`packages/web/src/translate/`): reads built HTML, translates text units via `@omega.js/devkit/translate` (default provider: Claude on the local install), per-string cache committed in the consumer repo (hand-fix any string, it sticks), emits static `/{lang}/…` copies with lang/dir, rewritten links, honest hreflang. SEO-correct, zero manual translation.
|
|
128
|
+
- Raw-liquid translation rejected (MT mangles template syntax). Data-level translation rejected as the pipeline (would need a second pipeline for prose anyway).
|
|
129
|
+
- Section contract additions: code-y components (terminal, code frames, commands) carry the standard `translate="no"` attribute; a future per-locale arg-override lane (hand-tuned marketing headlines) rides the same committed cache.
|
|
130
|
+
|
|
131
|
+
## 11. Cross-framework standardization (Ian 2026-07-18: design once, never again)
|
|
132
|
+
|
|
133
|
+
- **`@omega.js/web`'s engine is the single HTML factory for every framework's HTML surfaces.** Desktop windows/pages and extension popup/options pages are BUILT by it (target-scoped page sets via `targets.*` config); no framework ever reimplements templates, sections, theming, or translation.
|
|
134
|
+
- **One design contract across surfaces**: the `--omega-*` token sheet + `.omega-shell` chrome (already shipped) — sections ride on it.
|
|
135
|
+
- **One translator**: `@omega.js/devkit/translate` — the post-build pass runs over any built HTML dir regardless of target.
|
|
136
|
+
- Realistic surface scope: desktop inherits full pages via the website; extension shares tokens + small components (buttons, cards, frames) — marketing bands in a popup are a non-goal.
|
|
137
|
+
- Enabled entirely by the context-free rule (§2).
|
|
138
|
+
|
|
139
|
+
## 12. Engine ruling — Liquid stays this generation
|
|
140
|
+
|
|
141
|
+
- Market reality (2026): Liquid alive and huge (Shopify engine, Eleventy first-class); the modern paradigm is components-with-typed-props (Astro/JSX/Svelte; WebC is Eleventy's answer). Greenfield would evaluate Astro seriously.
|
|
142
|
+
- We are not greenfield: the layered file-override model works BECAUSE Liquid templates are interpreted at build from whichever file wins the chain (compile-time imports would break it); two themes are finished; consumers never write Liquid — they write one-liner calls + YAML.
|
|
143
|
+
- Sections + schemas capture the typed-props/scoped-assets benefit at ~10% of a rewrite's cost. **Sections are the migration unit** if omega v2 ever switches engines. Revisit at the next major, not before.
|
|
144
|
+
|
|
145
|
+
## 13. Sequencing (the locked map, updated)
|
|
146
|
+
|
|
147
|
+
1. ~~Ian ratifies this spec~~ **RATIFIED 2026-07-18**
|
|
148
|
+
2. **Extraction refactor**: classy + newsflash layouts → section/component libraries. `packages/web` only (playground-freeze-safe); corpus/golden-master pins output identical
|
|
149
|
+
3. **Content pass A — omega-ify the playground**: real framework pitch as compositions/args; playground = the living draft of the real site
|
|
150
|
+
4. **Content pass B — genericize classy**: sweep omega dev-accents from theme defaults (theme speaks generic SaaS; promoting OMEGA is a brand's job); optional per-theme sample posts/team
|
|
151
|
+
5. **Showcase**: auto-generated from the library (§9)
|
|
152
|
+
6. ~~**Arc close — THE FORK**: real omegajs.dev sub-brand born fresh outside the monorepo on published omega (fresh repo, fresh production Firebase, omegajs.dev zone, CI deploys); playground's polished content copies over 1:1.~~ **AMENDED + LANDED 2026-07-18 (Ian, cp229): the fork went LOCAL-FIRST** — born EARLY at `../omegajs.dev` (sibling repo) on relative `file:` specs into the monorepo ("still use local … until we are fully locked on all decisions that may result in breaking changes"), versions pre-reset to 1.0.0 (cp228) so first publish flips the specs to `^1.0.0` seamlessly; content forked 1:1 as specced (stale es caches dropped + re-translated fresh); **"published omega, fresh production Firebase, omegajs.dev zone, CI deploys" are now LAUNCH GATES, not birth conditions.** **The playground stays in the monorepo forever as the dedicated live test brand** (real Firebase, zero customer risk, break it freely)
|
|
153
|
+
7. Post-arc: company umbrella brand + sub-brand rebuilds (existing hard gates unchanged; the config `company` layer already models the umbrella)
|
|
154
|
+
|
|
155
|
+
## 14. Open items — ALL RESOLVED (Ian, 2026-07-18)
|
|
156
|
+
|
|
157
|
+
- Verb name → **`omega customize <url>`**
|
|
158
|
+
- Per-theme sample content → **NO — shared filler stays shared**, but it becomes auto-generated + gitignored-test-path isolated (see §8)
|
|
159
|
+
- Playground deploys after the fork → **BOTH lanes**: simple direct push is the normal lane (CI runs cost real money), and the full CI-dispatch path gets deliberately exercised every once in a while so it stays proven
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# The page paint contract
|
|
2
|
+
|
|
3
|
+
What every page owes a visitor in its first frame, and what it may make them
|
|
4
|
+
wait for. Ratified by Ian on 2026-08-27
|
|
5
|
+
([#637](https://github.com/Omega-JS-Stack/omega/issues/637)) after the checkout
|
|
6
|
+
page held its prices behind a cold backend.
|
|
7
|
+
|
|
8
|
+
The rules are five. They apply to every page in `packages/web/core/js/pages/`
|
|
9
|
+
and to every consumer page built on this framework.
|
|
10
|
+
|
|
11
|
+
## 1. Static content paints immediately
|
|
12
|
+
|
|
13
|
+
A page never hides its DOM waiting for auth. Everything the build already knows
|
|
14
|
+
goes on screen in the first frame: copy, prices from the payment config, plan
|
|
15
|
+
tiles, buttons, forms.
|
|
16
|
+
|
|
17
|
+
Redirects are not the page's job. The global auth policy owns them
|
|
18
|
+
(`packages/web/core/js/core/auth.js`): a visitor in the wrong state is sent
|
|
19
|
+
elsewhere before the page code runs. A page that hides itself "in case" is
|
|
20
|
+
hiding from a visitor who is allowed to be there.
|
|
21
|
+
|
|
22
|
+
That listener also owns the MID-SESSION case: it redirects the moment
|
|
23
|
+
@omega.js/client's session probe signs a dead session out, so a revoked,
|
|
24
|
+
disabled or deleted account leaves an `authenticated` page for sign-in with no
|
|
25
|
+
reload ([the session probe](../client/index.md#the-session-probe-omegaauthprobesession),
|
|
26
|
+
[#798](https://github.com/Omega-JS-Stack/omega/issues/798)).
|
|
27
|
+
|
|
28
|
+
## 2. User data arrives through bindings
|
|
29
|
+
|
|
30
|
+
Anything that depends on the signed-in user renders through
|
|
31
|
+
`data-omega-bind`, with a skeleton on the element until it fills. The client
|
|
32
|
+
fills the `auth`, `usage`, `config` and `device` roots on every page when auth
|
|
33
|
+
settles (`packages/client/src/modules/auth.js`). Page code does not repeat that
|
|
34
|
+
work.
|
|
35
|
+
|
|
36
|
+
Page code awaits auth for exactly one reason: to make a request that needs the
|
|
37
|
+
user. Never to decide whether to draw something.
|
|
38
|
+
|
|
39
|
+
## 3. An answer the visitor acts on resolves ONCE
|
|
40
|
+
|
|
41
|
+
Trial eligibility, the current plan, the price actually being charged: the
|
|
42
|
+
visitor decides with these, so they must never flip from one answer to another
|
|
43
|
+
while being read.
|
|
44
|
+
|
|
45
|
+
The spot holding such an answer keeps its skeleton until the answer lands, and
|
|
46
|
+
then renders once. The rest of the page is already painted around it. Only the
|
|
47
|
+
spot waits.
|
|
48
|
+
|
|
49
|
+
The bindings root key is the unit of deferral. `bindings.update()` filters by
|
|
50
|
+
the top-level keys it was handed, so a spot that must wait belongs to a root
|
|
51
|
+
the early paint does not publish
|
|
52
|
+
([packages/client/docs/bindings.md](../../packages/client/docs/bindings.md)).
|
|
53
|
+
Checkout is the worked example: its build-config half publishes `checkout`, and
|
|
54
|
+
the money line and trial spot live under `order`, written once when eligibility
|
|
55
|
+
answers.
|
|
56
|
+
|
|
57
|
+
## 4. Every wait has a deadline and a named fallback
|
|
58
|
+
|
|
59
|
+
A network wait behind user-visible copy gets a timeout, a constant that names
|
|
60
|
+
it, and a fallback state that is a decision rather than an accident. The
|
|
61
|
+
fallback is logged as a warning when it fires.
|
|
62
|
+
|
|
63
|
+
Pick the fallback that keeps the page's promises.
|
|
64
|
+
|
|
65
|
+
Checkout's trial check has THREE answers, not two: yes, no, and unknown. A
|
|
66
|
+
check that timed out or failed is unknown, and the page splits that answer in
|
|
67
|
+
two (Ian 2026-08-27). What it SHOWS stays conservative: no trial quoted, the
|
|
68
|
+
full amount due today, because rule 3 never shows a price the server has not
|
|
69
|
+
confirmed. What it ASKS FOR in the intent payload is the trial anyway, because
|
|
70
|
+
the intent route re-checks eligibility against the buyer's own order history and
|
|
71
|
+
silently downgrades anyone who does not qualify. Asking costs a non-qualifying
|
|
72
|
+
buyer nothing; not asking would cost a qualifying one their offer over a slow
|
|
73
|
+
network. A visitor is never quoted a price they are not charged, and never
|
|
74
|
+
loses an offer to a timeout.
|
|
75
|
+
|
|
76
|
+
## 5. Forms gate their submit control
|
|
77
|
+
|
|
78
|
+
Every form uses FormManager
|
|
79
|
+
(`@omega.js/client/modules/form-manager.js`). When a form must not be submitted
|
|
80
|
+
until an async answer is in, the page registers a gate per answer before it
|
|
81
|
+
calls `ready()`:
|
|
82
|
+
|
|
83
|
+
```javascript
|
|
84
|
+
formManager.addGate('eligibility');
|
|
85
|
+
formManager.addGate('recaptcha');
|
|
86
|
+
formManager.ready(); // held: the form stays `initializing`
|
|
87
|
+
...
|
|
88
|
+
formManager.resolveGate('recaptcha');
|
|
89
|
+
formManager.resolveGate('eligibility'); // the last one arms the form
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
The submit controls stay disabled while a gate is open. The rest of the form
|
|
93
|
+
stays live, so the visitor can still read it and change their choices. Both
|
|
94
|
+
calls fail loudly on a mistake: a gate added after the form armed throws, and so
|
|
95
|
+
does resolving a name that opened no gate (a typo would otherwise leave the form
|
|
96
|
+
gated forever).
|
|
97
|
+
|
|
98
|
+
## Reading a page against the contract
|
|
99
|
+
|
|
100
|
+
Four questions, in order:
|
|
101
|
+
|
|
102
|
+
1. Does anything in the first frame wait on a promise? If yes, does it need the
|
|
103
|
+
user, or was the answer already in the build config?
|
|
104
|
+
2. Is any element hidden pending auth that the auth policy already protects?
|
|
105
|
+
3. Can any user-visible value be written twice with two different answers?
|
|
106
|
+
4. Does every wait behind visible copy have a deadline and a named fallback?
|
|
107
|
+
|
|
108
|
+
## Related
|
|
109
|
+
|
|
110
|
+
- [docs/web/index.md](index.md) — the web framework guide
|
|
111
|
+
- [docs/client/index.md](../client/index.md) — the runtime that fills the bindings
|
|
112
|
+
- [packages/client/docs/bindings.md](../../packages/client/docs/bindings.md) — `data-omega-bind`, skeletons, root-key update filtering
|