@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/sections.md
ADDED
|
@@ -0,0 +1,845 @@
|
|
|
1
|
+
# Sections & Components
|
|
2
|
+
|
|
3
|
+
The section/component library: pages are compositions of one-line calls;
|
|
4
|
+
markup, styles, behavior, and the arg contract live together in a folder the
|
|
5
|
+
framework owns. Design rationale and the arc's sequencing live in
|
|
6
|
+
[docs/web/omega-sections-spec.md](omega-sections-spec.md) — this doc is
|
|
7
|
+
the landed contract.
|
|
8
|
+
|
|
9
|
+
## The two tiers
|
|
10
|
+
|
|
11
|
+
- **Sections** — full-width page bands (`{% section "marketing/hero" %}`).
|
|
12
|
+
- **Components** — smaller reusable pieces (`{% component "frame/box" %}`).
|
|
13
|
+
|
|
14
|
+
Same anatomy, same resolution, same asset lanes; only the folder family and
|
|
15
|
+
filenames differ (`_sections/<id>/section.*` vs `_components/<id>/component.*`).
|
|
16
|
+
|
|
17
|
+
## Anatomy
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
themes/base/_sections/marketing/hero/
|
|
21
|
+
section.html ← markup (Liquid). Renders against { args } ONLY.
|
|
22
|
+
section.scss ← styles (optional) — compiles into the main sheet
|
|
23
|
+
section.js ← behavior (optional) — bundles behind DOM-presence init
|
|
24
|
+
section.json5 ← { description, args, defaults, demo }
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Ids are kebab-case category paths (`marketing/hero`, `frame/browser`) —
|
|
28
|
+
arbitrary nesting, validated shape, traversal rejected. The underscore folder
|
|
29
|
+
families mark template machinery (like `_layouts`/`_includes`) and are
|
|
30
|
+
excluded from Eleventy content processing.
|
|
31
|
+
|
|
32
|
+
## Resolution
|
|
33
|
+
|
|
34
|
+
First match wins, whole-folder: consumer `<src>/_sections/<id>/` → active
|
|
35
|
+
theme → base. A consumer overriding a section owns ALL of it (markup +
|
|
36
|
+
assets travel together). Theme sections live inside the installed package —
|
|
37
|
+
consumer git holds only the consumer's own work.
|
|
38
|
+
|
|
39
|
+
`omega customize --list` prints those paths (with their owning layer and your
|
|
40
|
+
existing shadows) and `omega customize <path>` materializes one of them, so a
|
|
41
|
+
consumer never reads the theme source tree to learn what it may shadow. The
|
|
42
|
+
whole-folder rule still applies: materializing an entry's `section.scss` alone
|
|
43
|
+
does nothing until the entry's `section.html` moves too, or the winner declares
|
|
44
|
+
`inherit` — the command and the file's provenance header both say so.
|
|
45
|
+
|
|
46
|
+
One declared exception: an override folder's json5 may carry
|
|
47
|
+
`inherit: ['js']` (and/or `'scss'`) — §7 asset lanes it deliberately leaves
|
|
48
|
+
to the chain, filled from the first LOWER full entry that has the file (the
|
|
49
|
+
chain continues past layers lacking it). That's how a theme override replaces
|
|
50
|
+
markup while keeping the base section's behavior riding the bundle without a
|
|
51
|
+
copy — and it makes the inherited js's DOM contract (the selectors it
|
|
52
|
+
queries) part of the override's markup contract. Declaring a lane the folder
|
|
53
|
+
also ships is a build error; a declaration no lower layer can fill warns and
|
|
54
|
+
inherits nothing. html and json5 are never inheritable: not overriding markup
|
|
55
|
+
IS inheritance, and the folder is its own manifest (theme defaults are theme
|
|
56
|
+
identity).
|
|
57
|
+
|
|
58
|
+
## Authoring — one tag, two forms
|
|
59
|
+
|
|
60
|
+
Inline (simple args — values are real Liquid expressions):
|
|
61
|
+
|
|
62
|
+
```liquid
|
|
63
|
+
{% section "marketing/hero", headline: page.title %}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Block (structured data — YAML, the frontmatter dialect; `{{ }}` output tokens
|
|
67
|
+
inside values render against the calling page):
|
|
68
|
+
|
|
69
|
+
```liquid
|
|
70
|
+
{% section "marketing/testimonials" %}
|
|
71
|
+
superheadline: "What builders say"
|
|
72
|
+
items:
|
|
73
|
+
- quote: "Shipped in a weekend."
|
|
74
|
+
author: "Avery Quinn"
|
|
75
|
+
{% endsection %}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Using both forms on one call is an error. No args → the section's json5
|
|
79
|
+
defaults render.
|
|
80
|
+
|
|
81
|
+
### Values are text, prose is markup (#580)
|
|
82
|
+
|
|
83
|
+
An arg naming a literal VALUE — a stat number, a hero card number, a timeline
|
|
84
|
+
year, a shell command, a terminal transcript line, a code-panel token, a price
|
|
85
|
+
card's catalog value — renders through `| escape_once`. A value like `<200ms`
|
|
86
|
+
otherwise opens a tag the html minifier eats, and the page prints a visible
|
|
87
|
+
`< div>` (kramdown escaped these in the legacy build, so the defect is
|
|
88
|
+
OMEGA-only). `escape_once` and not `escape`: a brand that already worked around
|
|
89
|
+
this by authoring `<200ms` keeps rendering `<200ms`, and the filter is
|
|
90
|
+
idempotent.
|
|
91
|
+
|
|
92
|
+
Prose args — headline, description, label, title, quote — stay raw: authoring
|
|
93
|
+
inline `<em>` in them is the shipped idiom. Real markup beyond that rides the
|
|
94
|
+
`html` schema type and slot blocks, below.
|
|
95
|
+
|
|
96
|
+
### Slots — passing finished HTML (Ian 2026-07-18)
|
|
97
|
+
|
|
98
|
+
When an arg needs real markup beyond strings/numbers, the block body may
|
|
99
|
+
carry named slot blocks — alongside the YAML, or alongside inline args (the
|
|
100
|
+
both-forms error applies to the YAML remainder only):
|
|
101
|
+
|
|
102
|
+
```liquid
|
|
103
|
+
{% section "marketing/hero", data: resolved.hero %}
|
|
104
|
+
{% slot demo_html %}
|
|
105
|
+
<div class="my-wild-demo"><i class="fa-solid fa-rocket"></i> {{ resolved.config.brand.name }}</div>
|
|
106
|
+
{% endslot %}
|
|
107
|
+
{% endsection %}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Slot content renders in the CALLER's scope (site vars, page captures, `omega_*`
|
|
111
|
+
tags all work) and reaches the section as a finished-HTML string arg —
|
|
112
|
+
schema type `html` — merged OUTERMOST (over defaults ← data ← named) and
|
|
113
|
+
NEVER re-rendered: it merges after call-site liquification, so literal
|
|
114
|
+
braces survive (`{% raw %}` code samples stay intact; capture-passing an
|
|
115
|
+
html value as a plain named arg re-liquifies — slots are the finished-HTML
|
|
116
|
+
lane). A whitespace-only slot collapses to `''` — explicit-empty, killing
|
|
117
|
+
an html default the way explicit-empty kills everywhere. Duplicate slot
|
|
118
|
+
names and unclosed blocks throw; slot names ride the same schema
|
|
119
|
+
validation/did-you-mean lane as every arg. `{% slot %}` is body-text
|
|
120
|
+
grammar, not a registered tag — stray use outside a call fails loudly.
|
|
121
|
+
One limit: same-tag nesting inside a slot (a `{% section %}` block inside a
|
|
122
|
+
section slot) breaks the dual-form scan — nest the other tag instead
|
|
123
|
+
(components inside section slots, sections inside component slots).
|
|
124
|
+
|
|
125
|
+
Shipped html args: `marketing/hero` `demo_html` (finished markup replacing
|
|
126
|
+
the typed demo lanes) and `marketing/stats` `after` (markup inside the band
|
|
127
|
+
container after the grid — classy AND the newsflash override serve it; the
|
|
128
|
+
alternative.html stats+CTA composite now composes through it).
|
|
129
|
+
|
|
130
|
+
The name is usually a quoted literal; a bare expression resolving to an id
|
|
131
|
+
string is also legal (`{% section entry.id, data: variant.args %}`) — the
|
|
132
|
+
showcase's mechanism, and how data-driven composition stays one tag. The
|
|
133
|
+
expression runs up to the first comma (a filter taking comma-separated
|
|
134
|
+
params needs a `{% capture %}` first).
|
|
135
|
+
|
|
136
|
+
### The `data:` bridge
|
|
137
|
+
|
|
138
|
+
`data:` is reserved: it deep-spreads an object BETWEEN defaults and named
|
|
139
|
+
args — `defaults ← data ← named args` (shared `deepMerge` semantics with the
|
|
140
|
+
resolved cascade: b wins, explicit `null` removes, `undefined` keeps).
|
|
141
|
+
Layouts pass `data: resolved.hero` to bridge the THEME's own defaults (and
|
|
142
|
+
the consumer's site-wide directory-data lane). Bare ARRAYS bridge as a named arg
|
|
143
|
+
(`{% section "marketing/stats", items: resolved.stats %}`) — an undefined
|
|
144
|
+
named arg keeps the default, so absence semantics survive.
|
|
145
|
+
|
|
146
|
+
**Consumer page frontmatter is META-ONLY (Ian 2026-07-19: "not only no more
|
|
147
|
+
frontmatter but NOTHING EVEN TRIES TO CONSUME frontmatter"; softened same
|
|
148
|
+
day: no build-fail)**: a real file under `pages/` may carry only `layout`,
|
|
149
|
+
`permalink`, `meta`, `schema`, `config`, `sitemap` (+ engine plumbing — every
|
|
150
|
+
key documented in [frontmatter.md](frontmatter.md)). `config` ([#607](https://github.com/Omega-JS-Stack/omega/issues/607))
|
|
151
|
+
is the page's omega.json5 override block — every config section a page or
|
|
152
|
+
layout restates lives under it, including `theme` (shell chrome) and `client`
|
|
153
|
+
(#1: the `@omega.js/client` settings blob — auth policy, cookie consent, exit
|
|
154
|
+
popup; the chat widget moved to `inbound.chat.providers.chatsy` in #23), which
|
|
155
|
+
the core chrome reads into the Configuration payload via
|
|
156
|
+
`resolved.config.client`. The layout chain still merges underneath, key by key.
|
|
157
|
+
A config section restated BARE is a build ERROR naming the file and the key —
|
|
158
|
+
no dual-read, and `omega migrate`'s `config-parent` rule moves it. (`client`
|
|
159
|
+
was `web_manager` through the UJM era; WebManager is not an OMEGA concept —
|
|
160
|
+
see the [config mapping tables](shared/config.md).) Any other key is
|
|
161
|
+
content-in-frontmatter — a lane that doesn't
|
|
162
|
+
exist: the engine STRIPS it from the data cascade before resolution (and the
|
|
163
|
+
collections parity-repair lane filters pages to the same allow set, so
|
|
164
|
+
nothing stripped re-enters through `resolved`), then warns with a
|
|
165
|
+
move-it-into-sections message. Sections/components can never see the values;
|
|
166
|
+
the build proceeds (`frontmatter-guard.test.js`). Content lives in the page
|
|
167
|
+
BODY as `{% section %}` calls; site-wide overrides live in directory data;
|
|
168
|
+
theme voice lives in layout frontmatter.
|
|
169
|
+
|
|
170
|
+
**Doc-wins parity — collections lane (repaired cp225, rescoped cp235)**:
|
|
171
|
+
Eleventy's own data-cascade merge CONCATS a doc array onto a layout-default
|
|
172
|
+
array and lets a layout-default object beat a doc scalar — breaking the
|
|
173
|
+
inject-properties.rb contract for content ENTRIES (`_posts`, `_team`,
|
|
174
|
+
`_alternatives`, … — docs whose frontmatter IS the document; the guard never
|
|
175
|
+
touches them). The engine re-applies the doc's OWN frontmatter (re-parsed
|
|
176
|
+
from source) over the cascade with the shared `deepMerge` inside the
|
|
177
|
+
`resolved` computed, so a doc always wins its own keys outright: arrays
|
|
178
|
+
replace, scalars beat objects, partial object overrides keep layout
|
|
179
|
+
siblings. Virtual templates (blueprints, sample content) have no source
|
|
180
|
+
file and keep pure cascade behavior. Pinned in
|
|
181
|
+
`test/resolved-page-wins.test.js` against the real classy alternative
|
|
182
|
+
layout.
|
|
183
|
+
|
|
184
|
+
### Context-freeness (load-bearing)
|
|
185
|
+
|
|
186
|
+
Section markup never reads page globals — `{ args }` is the whole render
|
|
187
|
+
scope. Interpolation happens at the CALL site: any string value (default or
|
|
188
|
+
passed) containing Liquid renders against the calling page's scope before the
|
|
189
|
+
section sees it, so defaults like `"Introducing {{ resolved.config.brand.name }}"`
|
|
190
|
+
work while markup stays portable to every framework surface. Config keys are
|
|
191
|
+
read through `resolved.config.*` (#607) — `site.*` is build facts only.
|
|
192
|
+
|
|
193
|
+
## Markup convention: base, skin, fork (ratified 2026-08-04, #177)
|
|
194
|
+
|
|
195
|
+
Structure lives once, look lives per theme, identity is a bounded escape
|
|
196
|
+
hatch. The rules:
|
|
197
|
+
|
|
198
|
+
- **The base theme owns shared markup.** `themes/base` holds the structural
|
|
199
|
+
markup of every shared surface (layouts, sections, includes, components)
|
|
200
|
+
with neutral `omega-*` BEM classes
|
|
201
|
+
(`omega-<block>__<element>--<modifier>`). The theme layer chain ends at
|
|
202
|
+
base for every theme. Base markup is a contract: changing it touches every
|
|
203
|
+
theme, so it gets API-level care and tests.
|
|
204
|
+
- **A theme is a skin by default.** A theme ships tokens plus scss over the
|
|
205
|
+
base's `omega-*` selectors (and fonts, `_theme.js` — both optional: base
|
|
206
|
+
ships the js floor the chain ends at, and a shadowing theme inherits the
|
|
207
|
+
packaged skin's faces and font files,
|
|
208
|
+
[#773](https://github.com/Omega-JS-Stack/omega/issues/773)). It forks no shared
|
|
209
|
+
markup. Identical DOM across themes is what makes theme switching safe:
|
|
210
|
+
a consumer's custom css and overrides survive the switch.
|
|
211
|
+
- **Forks are identity, and they are bounded.** A theme forks a surface's
|
|
212
|
+
folder only when its design needs different structure (newsflash's ticker,
|
|
213
|
+
story cards, newspaper homepage). Fork markup uses theme-prefixed BEM
|
|
214
|
+
(`newsflash-<block>__<element>--<modifier>`); the theme's README lists its
|
|
215
|
+
forks. Everything else falls through to base.
|
|
216
|
+
- **Pages are compositions.** A page layout is a thin sequence of
|
|
217
|
+
`{% section %}` calls; a hand-built band belongs in a section folder.
|
|
218
|
+
- **Behavior contracts ride the base.** Core JS selectors (`.amount`,
|
|
219
|
+
`.billing-info`, `.price-per-unit`, `.btn-adaptive`, `.button-text`) and
|
|
220
|
+
`data-*` idioms (`data-lazy`, `data-plan-*`, `data-billing`,
|
|
221
|
+
`data-omega-countup`, `data-service-uptime`) live in base markup; a fork
|
|
222
|
+
keeps them, whatever its styling does.
|
|
223
|
+
- **The theme ladder.** Rung 1: tokens only, a complete restyled site
|
|
224
|
+
(`_template` is this rung). Rung 2: component scss over `omega-*`
|
|
225
|
+
selectors. Rung 3: identity forks. Each rung is a working theme.
|
|
226
|
+
- **Unprefixed vocabulary.** Bootstrap and core utility classes stay as-is
|
|
227
|
+
(`card`, `row`, `btn-adaptive`, `animation-*`); `avatar`/`avatar-*`,
|
|
228
|
+
`hairline*`, and `cursor-help` are base utilities shared by all themes.
|
|
229
|
+
|
|
230
|
+
Classy is a skin like the others; its former structural markup IS the base.
|
|
231
|
+
|
|
232
|
+
Enforcement is mechanical: `packages/web/test/theme-convention.test.js`
|
|
233
|
+
pins the class discipline and the README fork lists, so drift fails the
|
|
234
|
+
suite.
|
|
235
|
+
|
|
236
|
+
## Schemas & validation
|
|
237
|
+
|
|
238
|
+
`section.json5` declares `args` (name → type or `{ type, description }`),
|
|
239
|
+
`defaults`, and `demo` (showcase variants — see §9 below). Build-time
|
|
240
|
+
validation is warn-only: unknown args warn with did-you-mean, type
|
|
241
|
+
mismatches warn, nothing throws. Schema names are API — renames follow
|
|
242
|
+
deprecation discipline.
|
|
243
|
+
|
|
244
|
+
**Defaults ownership**: a single-page section lifts that page's default copy
|
|
245
|
+
into its json5 (hero). A section SHARED by multiple pages (testimonials, cta,
|
|
246
|
+
newsletter-cta) keeps json5 defaults NEUTRAL — mechanical knobs only — and
|
|
247
|
+
every caller passes its own copy over the data bridge, so no page can inherit
|
|
248
|
+
another page's words.
|
|
249
|
+
|
|
250
|
+
## Asset lanes (§7)
|
|
251
|
+
|
|
252
|
+
- **CSS**: every layer-resolved `section.scss` compiles into the MAIN sheet
|
|
253
|
+
via the synthesized `omega:sections` sass module (core main.scss pulls it
|
|
254
|
+
last, so section rules sit on top of the theme vocabulary; deterministic
|
|
255
|
+
kind+id order). PurgeCSS self-trims sections a site never renders. A
|
|
256
|
+
consumer main.scss that configures via `@use 'omega:main'` inherits the
|
|
257
|
+
library automatically; a full-fork main that skips `omega:main` opts out.
|
|
258
|
+
- **JS**: every `section.js` bundles into the MAIN bundle; the generated boot
|
|
259
|
+
stub registers `id → init` and `bootSections` initializes AFTER the main
|
|
260
|
+
boot, once per present element: `init(el, { manager, options })` for each
|
|
261
|
+
`[data-omega-section="<id>"]` (components: `data-omega-component`).
|
|
262
|
+
Sections with behavior carry the attribute on their own root element;
|
|
263
|
+
absent sections cost one querySelectorAll. One section's init failure never
|
|
264
|
+
blocks another's.
|
|
265
|
+
- **Default imagery**: the framework never loads an external image at
|
|
266
|
+
runtime. Default pictures SHIP in the package — `core/images/*` bridges to
|
|
267
|
+
`/assets/images/core/*` via the static-asset channel
|
|
268
|
+
(`static-assets.js`) — or the surface carries none and its designed
|
|
269
|
+
fallback renders (e.g. the testimonial initial badge). No theme or section
|
|
270
|
+
default may point at a third-party image host; the guard test
|
|
271
|
+
`packages/web/test/external-images.test.js` fails the retired hosts across
|
|
272
|
+
the whole theme layer and `defaults/`
|
|
273
|
+
([#154](https://github.com/Omega-JS-Stack/omega/issues/154),
|
|
274
|
+
[#158](https://github.com/Omega-JS-Stack/omega/issues/158)).
|
|
275
|
+
- **Hero animations ride these same lanes**
|
|
276
|
+
([#441](https://github.com/Omega-JS-Stack/omega/issues/441), Ian's ruling
|
|
277
|
+
2026-08-25). A brand that wants a moving hero visual makes ONE folder —
|
|
278
|
+
`src/_hero/<name>/{index.html, style.scss, script.js}` — and names it in the
|
|
279
|
+
hero's own frontmatter:
|
|
280
|
+
|
|
281
|
+
```liquid
|
|
282
|
+
{% section "marketing/hero" %}
|
|
283
|
+
demo:
|
|
284
|
+
enabled: true
|
|
285
|
+
type: custom
|
|
286
|
+
name: orbit
|
|
287
|
+
{% endsection %}
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
Resolution is the layer chain (consumer → theme layers), first folder with an
|
|
291
|
+
`index.html` wins the whole entry, so a brand overrides a shipped animation by
|
|
292
|
+
owning the name. `style.scss` joins the `omega:sections` sheet and `script.js`
|
|
293
|
+
joins the main bundle beside every `section.js` — the collector
|
|
294
|
+
([hero-animations.js](../src/hero-animations.js)) returns the
|
|
295
|
+
same `{ kind, id, scss, js }` shape, and the markup's
|
|
296
|
+
`data-omega-hero="<name>"` wrapper is what `bootSections` inits on. The markup
|
|
297
|
+
reaches the hero through the `{% hero_animation %}` tag, not a global, because
|
|
298
|
+
section markup is context-free by contract. The framework ships ONE reference
|
|
299
|
+
animation in exactly that shape, `themes/base/_hero/orbit/`, with its
|
|
300
|
+
`prefers-reduced-motion` branch; the hero's `Custom animation` demo variant is
|
|
301
|
+
it, rendered. The other custom lane is unchanged: `demo.options.content` is
|
|
302
|
+
finished markup authored at the call site, and a named folder wins over it.
|
|
303
|
+
Pinned by `test/hero-animation.test.js`.
|
|
304
|
+
|
|
305
|
+
Whichever lane fills it, that markup animates with the document: the hero band
|
|
306
|
+
is a first-paint band (`data-omega-first-paint`,
|
|
307
|
+
[#763](https://github.com/Omega-JS-Stack/omega/issues/763)), so a
|
|
308
|
+
`data-omega-reveal` authored inside it is started by the head's inline starter
|
|
309
|
+
the moment the band is parsed, instead of waiting for the engine to download
|
|
310
|
+
and its scroll observer to fire. A hero animation that runs on its own (a
|
|
311
|
+
`_hero/` folder's js, a css keyframe) still starts from a VISIBLE state, since
|
|
312
|
+
nothing stamps it. The motion contract is
|
|
313
|
+
[docs/shared/theming.md](shared/theming.md).
|
|
314
|
+
- **Dev loop**: theme-layer section edits are covered by the theme-root
|
|
315
|
+
watchers; consumer `src/_sections`/`_components`/`_hero` have their own watch
|
|
316
|
+
entries — scss changes hot-swap css, js changes rebuild + reload.
|
|
317
|
+
- **Page modules (cp221)**: `asset_path` frontmatter is DEAD — page assets
|
|
318
|
+
bind to URLs alone. Exact key first (`js/pages/pricing.js` or the
|
|
319
|
+
per-page-dir `pricing/index.js`), then `[name]` wildcard filenames
|
|
320
|
+
(Next.js convention, Windows-safe): `js/pages/blog/[slug].js` /
|
|
321
|
+
`css/pages/blog/[slug].scss` serve every `/blog/<slug>` page. A wildcard
|
|
322
|
+
segment matches exactly one URL segment; exact beats wildcard; among
|
|
323
|
+
wildcards the most-literal key wins (ties break lexicographically); a
|
|
324
|
+
trailing `/index` on a wildcard key is the per-page-dir spelling and never
|
|
325
|
+
consumes a URL segment. Underscore basenames under `pages/` are shared
|
|
326
|
+
partials in BOTH languages, never entries — the flat legal URLs
|
|
327
|
+
(`/terms`, `/cookies`, `/privacy`, unreachable by wildcard) each own a
|
|
328
|
+
two-line entry over `legal/_document.js` / `legal/_document.scss`.
|
|
329
|
+
Resolver: `resolvePageAsset` (assets.js), consumed by the engine's
|
|
330
|
+
`pageAssets` computed. The `data-asset-path` html attribute died with the
|
|
331
|
+
mechanism (nothing read it). Every layer that ships a file for the resolved
|
|
332
|
+
key LOADS, in layer order ([#624](https://github.com/Omega-JS-Stack/omega/issues/624))
|
|
333
|
+
— the same resolver answers `js/layouts/<layout>.js` / `css/layouts/<layout>.scss`
|
|
334
|
+
keyed by layout name.
|
|
335
|
+
|
|
336
|
+
## Update semantics
|
|
337
|
+
|
|
338
|
+
| Consumer state | Theme updates (html/css/js/copy) | What's preserved |
|
|
339
|
+
|---|---|---|
|
|
340
|
+
| No file | Everything flows | — |
|
|
341
|
+
| Composition + args | Section internals flow; framework never writes consumer files | Their args + composition |
|
|
342
|
+
| Forked section/theme file | Nothing flows for that entry | Everything (frozen) |
|
|
343
|
+
|
|
344
|
+
A fork whose json5 declares `inherit` keeps those lanes flowing from the
|
|
345
|
+
layer below — the one opt-back-in to the update stream (the collector
|
|
346
|
+
resolves the base file live, so base js/scss updates still reach the fork).
|
|
347
|
+
|
|
348
|
+
## Showcase & docs (spec §9) — auto-generated
|
|
349
|
+
|
|
350
|
+
TWO galleries, one shape ([#602](https://github.com/Omega-JS-Stack/omega/issues/602)): `/test/sections` is the section library and `/test/components` the component library, each an index over every RESOLVED entry of its kind (grouped by category folder) plus one page per entry carrying the args table (generated from the schema — name, type, description), the pretty-printed defaults, and every `demo` variant rendered LIVE through the real tag. New folder → new pages, zero authoring. The
|
|
351
|
+
engine computes the `sectionLibrary` global (`buildSectionLibrary`: same
|
|
352
|
+
first-match-wins resolution as the tags) and the pages paginate over it;
|
|
353
|
+
each entry chips its owning layer, so overrides say `newsflash` and
|
|
354
|
+
fallthrough ids say `classy` — the override doctrine, visible.
|
|
355
|
+
|
|
356
|
+
Each kind's URL SPACE has one home, `KINDS.<kind>.gallery` in [sections.js](../src/sections.js): `url` (the index), `base` (entry pages hang off `<base>/<id>`, frames off `<base>/<id>/frames/<slug>`) and `label`. The library stamps the resolved url onto every entry and variant, so no template ever composes one.
|
|
357
|
+
|
|
358
|
+
The two spellings are HARMONIZED (Ian's #602 addendum, 2026-08-26) — `base` IS `url` on both, so the shape is literally the same sentence twice:
|
|
359
|
+
|
|
360
|
+
| Library | Index | Entry | Frame |
|
|
361
|
+
|---|---|---|---|
|
|
362
|
+
| Sections | `/test/sections` | `/test/sections/<id>` | `/test/sections/<id>/frames/<slug>` |
|
|
363
|
+
| Components | `/test/components` | `/test/components/<id>` | `/test/components/<id>/frames/<slug>` |
|
|
364
|
+
|
|
365
|
+
Neither carries a kind segment the other lacks. Sections used to hang off `/test/sections/section/<id>` — a leftover of the era when the section space held both kinds; a gallery is development-only ([#554](https://github.com/Omega-JS-Stack/omega/issues/554)), so that spelling was simply dropped, with no redirects. The index and its entries share one url prefix without colliding on disk: an extensionless permalink gets the Jekyll `.html` (`jekyllPermalink` in [engine.js](../src/engine.js)), so `test/sections.html` the file sits beside `test/sections/` the directory.
|
|
366
|
+
|
|
367
|
+
**It is the agent path.** Building a page means composing entries from this
|
|
368
|
+
gallery, never hand-rolling HTML: the entry page is the args contract and
|
|
369
|
+
the frames are what each variant actually looks like.
|
|
370
|
+
|
|
371
|
+
- **Embedded frames (#463)**: a variant renders in its OWN document —
|
|
372
|
+
`<gallery base>/<id>/frames/<slug>` (`defaults/showcase/frame.html`,
|
|
373
|
+
paginating over `sectionLibrary.variants`, the flattened one-item-per-
|
|
374
|
+
entry×variant list). The slug is the kebab-cased label, numbered on
|
|
375
|
+
collision within the entry (`side-by-side`, `side-by-side-2`). The frame
|
|
376
|
+
wears the theme's real asset bundles with nav and footer off (page-level
|
|
377
|
+
`theme.nav.enabled: false`), so a hero that expects the viewport gets one.
|
|
378
|
+
The OVERLAY chrome is off in the same frontmatter (#555): the frame bakes
|
|
379
|
+
`client.consent.enabled: false` and
|
|
380
|
+
`inbound.chat.providers.chatsy.enabled: false`, so a stack of variants is not
|
|
381
|
+
a stack of cookie banners and chat bubbles. ONE generator serves both kinds,
|
|
382
|
+
so that is the ONE home for it; the gallery page around the frames is a page
|
|
383
|
+
like any other and still shows both. The DEV PALETTE is the third overlay a
|
|
384
|
+
frame drops, and it is gated in the other place: `core/js/main.js` imports it
|
|
385
|
+
only when `html[data-iframed]` is not `true` (the mark `core/_includes/core/body.html`
|
|
386
|
+
stamps before first paint), because main.js is what loads that chunk. The
|
|
387
|
+
other two are decided before it runs — the client mounts chatsy inside
|
|
388
|
+
`omega.initialize()` — which is why they live in the frontmatter and this one
|
|
389
|
+
does not.
|
|
390
|
+
- **The entry page embeds them**: per variant, the label, the authored args
|
|
391
|
+
as a copyable escaped block (`argsJson`, escaped by the collector like
|
|
392
|
+
every other display string), and a lazy same-origin `<iframe>` autosized to
|
|
393
|
+
its content by `core/js/libs/showcase-frames.js` (the shared helper both
|
|
394
|
+
galleries' page modules call —
|
|
395
|
+
`core/js/pages/test/sections/[category]/[name]/index.js` and
|
|
396
|
+
`core/js/pages/test/components/[category]/[name]/index.js` are the wildcard
|
|
397
|
+
page-asset entries serving the two generated families — mirrored keys for
|
|
398
|
+
mirrored urls, both two wildcard segments off their index). An inline
|
|
399
|
+
`min-height` is the no-JS fallback — the frame scrolls, never collapses. The
|
|
400
|
+
stack itself is ONE include, `core/_includes/core/showcase/entry-body.html`,
|
|
401
|
+
rendered by the ONE entry-page generator.
|
|
402
|
+
- **Sidebar + stacked frames (#540, Ian's QA call)**: every gallery page is
|
|
403
|
+
one row — the navigation rail on the left, the content on the right. The
|
|
404
|
+
rail (`core/_includes/core/showcase/nav.html`, one home for both galleries'
|
|
405
|
+
indexes and entry pages) is KIND-SCOPED (#602): it lists that library the way
|
|
406
|
+
its own index groups it, marks the entry being shown, and nests THAT entry's
|
|
407
|
+
demo variants under it.
|
|
408
|
+
The right pane shows EVERY variant STACKED, one frame each with its options
|
|
409
|
+
block, and the entry's args table beneath them; the rail's variant links are
|
|
410
|
+
plain anchor jumps (`#variant-<slug>`) into that stack — no tab machinery,
|
|
411
|
+
no reload, and no JS required (the page module only autosizes). Ian settled
|
|
412
|
+
the model at the 2026-08-24 QA pass: stacked scans faster.
|
|
413
|
+
- **The gallery chrome clears the masthead**: each gallery page's shell is a
|
|
414
|
+
top-level `<section data-omega-showcase-shell>`, which is the element a
|
|
415
|
+
theme's nav clearance targets (classy's nav is `position: fixed`) — as a
|
|
416
|
+
bare `<div>` it took no clearance and slid under the nav, which is also what
|
|
417
|
+
made the rail's "← Section library" link unclickable. The rail's sticky
|
|
418
|
+
offset and each panel's `scroll-margin-top` clear the same nav.
|
|
419
|
+
- **The component gallery (#549, reshaped by #602)**: `/test/components`
|
|
420
|
+
MIRRORS the section gallery rather than reinterpreting it — an index here,
|
|
421
|
+
an entry page at `/test/components/<id>`, its frames at
|
|
422
|
+
`/test/components/<id>/frames/<slug>`. ONE generator serves both kinds:
|
|
423
|
+
`defaults/showcase/entry.html` and `defaults/showcase/frame.html` paginate
|
|
424
|
+
the whole library and take their permalink off the entry's own kind-aware
|
|
425
|
+
url, and the two index pages share `core/_includes/core/showcase/index-body.html`.
|
|
426
|
+
Nothing is generated under `/test/sections/component/…` or
|
|
427
|
+
`/test/sections/section/…` any more — both kind segments are gone. The living
|
|
428
|
+
styleguide that used to hold the `/test/components` URL is `/test/styleguide`
|
|
429
|
+
(a `defaults/pages` page, so it ships in production builds too — noindex and
|
|
430
|
+
sitemap-excluded like every `/test` page); the galleries ride
|
|
431
|
+
`defaults/showcase/`, so production emits none of them.
|
|
432
|
+
- The five `hero-demo-*` default pages folded INTO the gallery (#463): the
|
|
433
|
+
hero's own `demo:` roster now carries the input/form/video/side/custom
|
|
434
|
+
compositions they used to author page-side, and they render as frames.
|
|
435
|
+
|
|
436
|
+
- **Development builds only** (the sample-content gate): a page rendering
|
|
437
|
+
every section would keep every section's CSS alive through the PurgeCSS
|
|
438
|
+
content scan and quietly defeat §7 self-trimming. Production never builds
|
|
439
|
+
it; the pages are also collection-excluded, so sitemap.xml and pages.json
|
|
440
|
+
never carry them. The frame pages ride the same injection (the engine
|
|
441
|
+
collects the whole `defaults/showcase/` dir). A theme with its own sections
|
|
442
|
+
gets exactly that many extra entry pages plus their frames — the one
|
|
443
|
+
sanctioned cross-theme page-count delta (pinned in the contract suite,
|
|
444
|
+
derived from the collector).
|
|
445
|
+
- **`demo` variants** — `[{ label, args?, stage_class? }]`: args ride the
|
|
446
|
+
data bridge over the entry's defaults (exactly the consumer experience)
|
|
447
|
+
and liquify at the frame's call site; `stage_class` supplies the wrapper a
|
|
448
|
+
component's caller normally owns (section-head's shell). Shared bands
|
|
449
|
+
carry generic demo copy — neutral defaults stay neutral (§6).
|
|
450
|
+
- **Docs display is RAW**: description/args/defaults strings arrive
|
|
451
|
+
HTML-escaped from the collector (including `{` → `{`), so the docs
|
|
452
|
+
show the `{{ resolved.config.brand.name }}` tokens a consumer would see in the file.
|
|
453
|
+
Load-bearing, not cosmetic — the library rides the page data cascade,
|
|
454
|
+
whose frontmatter/resolved walkers liquify any string containing `{{`
|
|
455
|
+
(the walkers also skip the `sectionLibrary` key wholesale).
|
|
456
|
+
- **Lookup-driven entries demo nothing by design** (news/story-card,
|
|
457
|
+
news/byline resolve posts/members from live site content) — their pages
|
|
458
|
+
document args only.
|
|
459
|
+
|
|
460
|
+
## Customize (spec §8) — `omega customize <url>`
|
|
461
|
+
|
|
462
|
+
Materializes a default page into `src/pages/` so it can diverge — without
|
|
463
|
+
owning anything it didn't change. No URL → lists every customizable default
|
|
464
|
+
URL with its lane. Idempotent: an existing consumer page at the URL is never
|
|
465
|
+
overwritten; both lanes carry a YAML comment header (frontmatter comments
|
|
466
|
+
never render) and deleting the file returns the URL to the packaged default.
|
|
467
|
+
|
|
468
|
+
- **composition lane** — the page's theme layout wraps a pure section
|
|
469
|
+
composition in `{% composition %}…{% endcomposition %}` (classy's home
|
|
470
|
+
today; more as extraction continues — the lane is detected from the tag,
|
|
471
|
+
never a hardcoded list). The materialized file = the default page's thin
|
|
472
|
+
frontmatter + the wrapped one-liners verbatim (a body replaces the
|
|
473
|
+
composition by default — no flag):
|
|
474
|
+
**no copy inlined**. The layout chain stays intact, so shared-band words
|
|
475
|
+
(testimonials, cta) keep flowing from the theme's frontmatter through
|
|
476
|
+
`resolved.*` — the consumer file renders "Sarah Johnson" without ever
|
|
477
|
+
containing it. The consumer owns the composition order plus whatever args
|
|
478
|
+
they add; everything else keeps updating. Written `.html` regardless of
|
|
479
|
+
the default's extension — section output must never pass through
|
|
480
|
+
markdown.
|
|
481
|
+
- **shell lane** — the theme layout still carries one-off page markup (not
|
|
482
|
+
yet a pure composition, or shadowed by a theme's own hand-crafted layout,
|
|
483
|
+
e.g. newsflash's home). The materialized file is a verbatim copy of the
|
|
484
|
+
thin default page (layout pointer + permalink): customization happens
|
|
485
|
+
through the page's SIDECAR data file over `resolved.*`, and everything
|
|
486
|
+
keeps flowing. Page frontmatter is meta-only (the guard strips content
|
|
487
|
+
keys), so `<page>.11tydata.json` beside the page IS the page-level lane
|
|
488
|
+
for a shell layout's band data — and it obeys the same arrays-replace rule
|
|
489
|
+
every other override lane does ([#269](https://github.com/Omega-JS-Stack/omega/issues/269)):
|
|
490
|
+
a sidecar array REPLACES the layout's default array outright (Eleventy's
|
|
491
|
+
cascade concats it; `resolved` re-applies the sidecar with the engine's
|
|
492
|
+
deepMerge), while object and string keys merge over the defaults as they
|
|
493
|
+
always did. Pinned by `test/sidecar-data.test.js`.
|
|
494
|
+
|
|
495
|
+
A default page whose permalink is a TEMPLATE — the blog hub's pagination, the
|
|
496
|
+
per-term tag/category pages — is addressed by its SOURCE PATH, because no URL
|
|
497
|
+
can ever equal a Liquid permalink ([#458](https://github.com/Omega-JS-Stack/omega/issues/458)):
|
|
498
|
+
`omega customize /blog` materializes `defaults/pages/blog.md`,
|
|
499
|
+
`/blog/tags/tag` materializes the tag generator. Both list like any other
|
|
500
|
+
customizable URL. The permalink is copied BYTE-IDENTICAL, which is the only
|
|
501
|
+
thing build-time suppression keys on, so the materialized page takes the
|
|
502
|
+
default's place with no duplicate output. Pinned by `test/customize.test.js`.
|
|
503
|
+
|
|
504
|
+
The `{% composition %}` wrap is tri-state, byte-parity with the
|
|
505
|
+
`{{ content | omega_content_format }}` line it replaces in the layout:
|
|
506
|
+
|
|
507
|
+
| Page state | Renders |
|
|
508
|
+
|---|---|
|
|
509
|
+
| No body content | The wrapped default composition |
|
|
510
|
+
| Body content | The body REPLACES the composition (Ian's 2026-07-19 ruling: writing a body means it — what customize materializes; no flag) |
|
|
511
|
+
|
|
512
|
+
Materialize-then-build is identity: the only sanctioned output delta is
|
|
513
|
+
blank-line runs (the materialized body passes through the blueprint's
|
|
514
|
+
content wrap, which frames it with one extra newline each side). Pinned in
|
|
515
|
+
`test/customize.test.js`, along with divergence (a call-site arg
|
|
516
|
+
override lands — frontmatter is meta-only; a deleted one-liner drops exactly
|
|
517
|
+
that band) and the theme-honest
|
|
518
|
+
lanes. The update-semantics table above is unchanged — customize writes
|
|
519
|
+
once, at the consumer's explicit request; the update stream never writes
|
|
520
|
+
consumer files.
|
|
521
|
+
|
|
522
|
+
## Landed vs pending
|
|
523
|
+
|
|
524
|
+
Landed: the tags, resolution, schemas/validation, data bridge, §7 asset
|
|
525
|
+
lanes, classy's marketing library (hero, trusted-by, bento, product-demo,
|
|
526
|
+
showcase, stats, testimonials, cta, newsletter-cta, faq — the homepage and
|
|
527
|
+
every CTA/testimonial/newsletter/FAQ band across classy pages render through
|
|
528
|
+
them; pricing's FAQ stays inline: its aside embeds a bespoke guarantee
|
|
529
|
+
object), and the heading components: `heading/masthead` — the interior-page
|
|
530
|
+
head cluster (eyebrow + display h1 + sub) composed inside ~17 layouts' own
|
|
531
|
+
band shells (sub_class/h1_class knobs carry the per-page class variants;
|
|
532
|
+
breadcrumb pages pass no eyebrow; `first_paint: true` drops the cluster's
|
|
533
|
+
reveal attributes for a caller whose band is the first viewport,
|
|
534
|
+
[#467](https://github.com/Omega-JS-Stack/omega/issues/467)) — and
|
|
535
|
+
`heading/section-head` — the h2-band
|
|
536
|
+
cluster serving ~18 layout bands AND the sections themselves (bento,
|
|
537
|
+
product-demo, showcase, faq compose it from their markup: **nested
|
|
538
|
+
composition** — sections render on the same engine, so `{% component %}`
|
|
539
|
+
works inside section markup, args evaluating against the section's own
|
|
540
|
+
`{ args }` scope).
|
|
541
|
+
newsletter-cta is the §7 reference consumer: its `section.js` owns the
|
|
542
|
+
FormManager binding (`export default (el, { manager, options })`), its root
|
|
543
|
+
carries `data-omega-section="marketing/newsletter-cta"`, and any page
|
|
544
|
+
composing the band gets the working managed form — live-proven on blog index
|
|
545
|
+
AND posts (whose old plain-action form posted to a nonexistent page).
|
|
546
|
+
|
|
547
|
+
The newsflash lane (cp213–218): the FIRST theme-layer section override —
|
|
548
|
+
`themes/newsflash/_sections/marketing/stats/` serves the same items
|
|
549
|
+
contract with newsflash markup (whole-folder wins, so its json5 carries the
|
|
550
|
+
theme's own head default — theme defaults are part of the theme's
|
|
551
|
+
identity) — plus newsflash-specific sections (`marketing/rundown`,
|
|
552
|
+
`marketing/desks`) and the theme's head components (`heading/rule-head` —
|
|
553
|
+
the h2 + rule + view-all idiom; `heading/lede` — the h1-sized header
|
|
554
|
+
cluster), composed by the newsflash index — and, since the cp216 sweep,
|
|
555
|
+
by EVERY newsflash layout: all 23 band heads and 8 ledes render through
|
|
556
|
+
the two components (composite heads join via `{% capture %}`; the
|
|
557
|
+
rule-head link slot serves index top-stories/the-latest and post
|
|
558
|
+
related; its doc comment trims its trailing newline so calls adjacent
|
|
559
|
+
to whitespace-trimmed tags keep glued joins). The posts-driven tile
|
|
560
|
+
family:
|
|
561
|
+
`news/story-card` (framed art + kicker + h5 + byline — 6 identical grid
|
|
562
|
+
instances across index/blog/category/tag/related) nests `news/byline`
|
|
563
|
+
(component-IN-component; the byline alone also serves the lead splash via
|
|
564
|
+
its `p_class` knob, feed items, and the hero cover). Posts stay out of
|
|
565
|
+
args entirely — raw post objects can never ride call-site liquification
|
|
566
|
+
(no circularity guard; content strings may carry literal braces). The
|
|
567
|
+
pattern: `omega_post`/`omega_member` are scope-independent (injected site
|
|
568
|
+
adapter), so components own image/name lookups from plain id args;
|
|
569
|
+
readtime pre-captures at the call site; kickers pass display-ready with
|
|
570
|
+
`| default: "" | omega_title_case` so absence suppresses instead of
|
|
571
|
+
rendering "Undefined". Override #2 (cp217): `marketing/newsletter-cta` —
|
|
572
|
+
the vermilion slab — is the inherit lane's first consumer: newsflash
|
|
573
|
+
markup (adds `headline_accent` + the `narrow` post-column knob), classy's
|
|
574
|
+
FormManager `section.js` inherited into the bundle, binding through the
|
|
575
|
+
override's own `data-omega-section` root. Landing it killed TWO live dead
|
|
576
|
+
forms: nf posts still carried the plain `action="/email-subscription"`
|
|
577
|
+
form (the cp209 bug), and the blog index's inline slab spoke the managed
|
|
578
|
+
dialect with NO presence-init root — nothing ever bound it.
|
|
579
|
+
Override #3 + the flip decision (cp218): `marketing/cta` — the dark
|
|
580
|
+
big-read band — went native. The cta-panel idiom that repeated inline
|
|
581
|
+
across the index/about/pricing layouts is now the theme's override
|
|
582
|
+
serving classy's exact contract, so those three bands compose it AND
|
|
583
|
+
every fallthrough page (download, extension, alternatives ×2) flips from
|
|
584
|
+
classy markup to the panel — with the icon keys classy's markup ignores
|
|
585
|
+
(`superheadline.icon`, `*_button.icon`) finally rendering (superheadline
|
|
586
|
+
icons were later removed everywhere — Ian's ruling, 2026-08-22; button
|
|
587
|
+
icons stay), and `command`
|
|
588
|
+
served as the mono $ button in panel idiom. The newsletter-cta override
|
|
589
|
+
gained a second presentation the same checkpoint, `variant: "rail"` — the
|
|
590
|
+
compact sidebar signup card with NO section/container wrapper, composed
|
|
591
|
+
by the index aside (`anchor`/`disclaimer` knobs) — killing the THIRD dead
|
|
592
|
+
form: the rail card posted to the dead route since birth; it now speaks
|
|
593
|
+
the managed dialect through its own §7 root. The standing doctrine the
|
|
594
|
+
flip settled: **a theme overrides a shared id only when the band exists
|
|
595
|
+
in its own design vocabulary** — hero, bento, product-demo, showcase,
|
|
596
|
+
testimonials, trusted-by, and faq deliberately fall through to the classy
|
|
597
|
+
base under newsflash (the lede/splash family serves the hero role) and
|
|
598
|
+
the skin styles them; team's charter slab and join band stay inline
|
|
599
|
+
(per-page uniques borrowing the panel visual, not instances of the
|
|
600
|
+
contract). Newsflash pins live in `test/sections-newsflash.test.js` on a
|
|
601
|
+
theme-override build lane over the posts-rich fixture (17 posts — every
|
|
602
|
+
index slot lit).
|
|
603
|
+
|
|
604
|
+
The showcase lane (cp219): the auto-generated `/test/sections` surface —
|
|
605
|
+
see "Showcase & docs" above. Landing it added the expression-name tag form,
|
|
606
|
+
the `sectionLibrary` global, demo variants across all 17 demoable entries
|
|
607
|
+
(the two lookup-driven components document args only), and the
|
|
608
|
+
development-only default-page injection lane.
|
|
609
|
+
|
|
610
|
+
The customize lane (cp220): `omega customize <url>` + the
|
|
611
|
+
`{% composition %}` wrap — see "Customize" above. Classy's home is the
|
|
612
|
+
first composition-lane page (the one pure-composition layout); every other
|
|
613
|
+
URL rides the shell lane until its one-off bands extract. The wrap's
|
|
614
|
+
guard originally preserved the legacy append contract as the
|
|
615
|
+
default (the slice-suite pin caught the first over-eager version); Ian's
|
|
616
|
+
2026-07-19 ruling flipped it — a body REPLACES the composition, no flag —
|
|
617
|
+
and #607 deleted the `append: true` escape hatch that kept the legacy
|
|
618
|
+
add-below contract alive beside it: a page that wants the default bands
|
|
619
|
+
writes them, which is exactly what `omega customize <url>` hands it.
|
|
620
|
+
The `composition: true` key is retired (ignored).
|
|
621
|
+
|
|
622
|
+
The wildcard lane (cp221): page assets went URL-only — `asset_path` died
|
|
623
|
+
across the tree (theme post/taxonomy/legal/app layouts, the update and
|
|
624
|
+
alternative blueprints, the hero-demo pages, the ports fixture), the
|
|
625
|
+
`blog/post` → `blog/[slug]`, `updates/[update]`, `alternatives/
|
|
626
|
+
[alternative]` families renamed in place, and the legal trio split into
|
|
627
|
+
flat exact entries over underscore partials. The §7 dividend: the
|
|
628
|
+
homepage's video-tab logic left the dying `index` page module for
|
|
629
|
+
`product-demo/section.js`, so the behavior now works on EVERY page that
|
|
630
|
+
composes the band — including the showcase pages, which never had it.
|
|
631
|
+
|
|
632
|
+
Sample content went auto-generated (cp222, spec §8): the shared corpus (11
|
|
633
|
+
posts / 4 teammates / 4 updates) carries its dates as a rhythm relative to
|
|
634
|
+
the corpus epoch (2026-07-18) and re-anchors to the build day on every
|
|
635
|
+
non-production build — post filenames shift (Eleventy `page.date`),
|
|
636
|
+
`update.date` frontmatter lines rewrite, dateless team files pass through —
|
|
637
|
+
so a virgin blog always looks alive. `omega dev` additionally materializes
|
|
638
|
+
the generated set under the target's `.omega/sample-content/`
|
|
639
|
+
(self-`.gitignore`d, regenerated each boot, removed per collection the
|
|
640
|
+
moment the consumer owns one) for humans to read and copy. Determinism: the
|
|
641
|
+
web test harness pins `OMEGA_SAMPLE_ANCHOR` to the epoch — generation
|
|
642
|
+
becomes an identity transform (the cp222 goldens are byte-zero against
|
|
643
|
+
cp221) — while the wizard journey proves live rolling: a wizard-born brand's
|
|
644
|
+
newest sample post lands ~10 days before today, unpinned.
|
|
645
|
+
|
|
646
|
+
The extraction close (cp223, spec §13 step 2 COMPLETE): a full-page audit of
|
|
647
|
+
every classy layout found ONE remaining true duplicate — alternatives/index's
|
|
648
|
+
inline stats band, a byte-level copy of `marketing/stats` — now a section
|
|
649
|
+
call (classy goldens byte-zero; under newsflash the band correctly flips to
|
|
650
|
+
the theme's stats override, the last band newsflash couldn't reskin on that
|
|
651
|
+
page). Everything else that *looks* repeated was audited and stays, each for
|
|
652
|
+
a reason: alternative.html's stats+CTA composite and pricing's social-proof
|
|
653
|
+
stats (star rows) and FAQ+guarantee panel are divergent per-page composites,
|
|
654
|
+
not instances of the shared contracts; status's subscribe band is its own
|
|
655
|
+
compact idiom, not newsletter-cta; the team portrait card repeats only as an
|
|
656
|
+
SCSS pattern (`omega-person` — the index variant carries a links row the
|
|
657
|
+
member page deliberately drops), like the rowlist/hairline idiom. The
|
|
658
|
+
boundary doctrine the audit settled: **sections/components are for
|
|
659
|
+
composable bands with data args (+ finished-HTML slots, cp224); context-bound
|
|
660
|
+
partials stay includes**
|
|
661
|
+
(post-card, nav/footer, account-section-header — they need `site.*`/liquid
|
|
662
|
+
tags a context-free render can't see, the same reason posts never ride
|
|
663
|
+
args); **plumbing pages stay layouts** (auth flows, blog taxonomy twins,
|
|
664
|
+
payment, portal — generated-page machinery brands override at the layout
|
|
665
|
+
layer, not compositions brands remix).
|
|
666
|
+
|
|
667
|
+
HTML slots (cp224, Ian's ruling 2026-07-18): the `{% slot name %}` block
|
|
668
|
+
form — see "Slots" under Authoring above. Landing it: the two shipped html
|
|
669
|
+
args (`hero.demo_html`, `stats.after` on classy AND the newsflash override),
|
|
670
|
+
and the cp223 audit's parked composite converted — alternative.html's
|
|
671
|
+
stats+CTA band now composes `marketing/stats` with its trailing CTA in the
|
|
672
|
+
`after` slot. Classy goldens: every production page byte-zero (the
|
|
673
|
+
conversion is motion; slot output byte-exact); the only classy diffs are the
|
|
674
|
+
showcase's own arg tables documenting the new args. Newsflash: the
|
|
675
|
+
per-alternative page's stats band now correctly flips to the theme's stats
|
|
676
|
+
override — with the after-CTA surviving inside it — the same FLIP story as
|
|
677
|
+
cp223's index page.
|
|
678
|
+
|
|
679
|
+
Content pass A (cp225, freeze lifted by Ian 2026-07-18): the playground now
|
|
680
|
+
carries the real framework pitch — the homepage is a full composition
|
|
681
|
+
(hero with the `demo_html` terminal slot as the product shot and the
|
|
682
|
+
generic frame mock killed, six true-capability bento tiles, honest stats,
|
|
683
|
+
command CTA; trusted-by/product-demo/showcase/testimonials deliberately
|
|
684
|
+
absent until real ones exist) and the about page tells the real story
|
|
685
|
+
(era-labeled consolidation timeline, the project's actual working
|
|
686
|
+
principles as values, `gallery: false`). Landing it found and fixed the
|
|
687
|
+
page-wins parity break above — the about draft was the first consumer to
|
|
688
|
+
override layout arrays and caught its items concatenating. The draft is
|
|
689
|
+
fork-portable: copy carries `{{ site.brand.name }}` refs, so the real
|
|
690
|
+
brand's name lands at fork time.
|
|
691
|
+
|
|
692
|
+
Content pass B (cp226): classy's theme layer speaks generic SaaS — the
|
|
693
|
+
sweep found four literal omega accents and killed each: the hero's
|
|
694
|
+
`command: npx omega setup` DEFAULT is gone (no command default at all — a
|
|
695
|
+
framework command is never a theme's voice; the button renders only when a
|
|
696
|
+
brand sets one), the index layout's cta command lines are gone, the bento
|
|
697
|
+
code tile's comment line became `config_demo.label` (generic default
|
|
698
|
+
`// one config — every target`), and the bento terminal mock's lines became
|
|
699
|
+
per-item args (`item.terminal.{command,out,ok}`, defaulting to a generic
|
|
700
|
+
npm session). The playground passes its own omega voice through those args
|
|
701
|
+
(`omega deploy`, `// omega.json5 — one file, every target`) — proving the
|
|
702
|
+
division: the THEME is generic, promoting OMEGA is the BRAND's job. The
|
|
703
|
+
framework's own dev-only /test/* surfaces keep their omega references
|
|
704
|
+
(they demo the framework's real machinery and are purged from production).
|
|
705
|
+
|
|
706
|
+
The data lane (#72, ported from the workkit tower): `data/org-chart` — one
|
|
707
|
+
root card over a connected row of node cards (`{ title, sub, meta, tone }`
|
|
708
|
+
each), joined by ANIMATED dashed connectors. Every line is a repeating
|
|
709
|
+
gradient, not a border: a gradient's position is animatable and a border's
|
|
710
|
+
dash pattern is not, and a chart of what is happening right now reads as live
|
|
711
|
+
only if something on it is. Under 768px the tree tilts onto its side (spine
|
|
712
|
+
down the left, an elbow into each card), `prefers-reduced-motion` parks the
|
|
713
|
+
animation, and the `tone` arg rides the shared categorical ramp
|
|
714
|
+
([docs/shared/theming.md](shared/theming.md)) so a node's chip matches the
|
|
715
|
+
same name's chart series. The class vocabulary is `omega-`-namespaced on
|
|
716
|
+
purpose — a live page rendering it from JS keeps the connectors AND survives
|
|
717
|
+
the PurgeCSS content scan. Pinned in `test/dataviz.test.js`.
|
|
718
|
+
|
|
719
|
+
The porting pass (#513, #500, #515, #493) — four gaps the operst and
|
|
720
|
+
playlisteer ports found, each closed in the library rather than brand-side:
|
|
721
|
+
|
|
722
|
+
- `marketing/hero` `breadcrumb` — an ordered `[{ label, href }]` trail rendered
|
|
723
|
+
as `<nav aria-label="Breadcrumb">` above the headline cluster, small and
|
|
724
|
+
muted on shared utilities alone (inline list items, so the trail inherits the
|
|
725
|
+
hero's own alignment in both placements). The LAST crumb is the current page:
|
|
726
|
+
unlinked, `aria-current="page"`. Absent renders nothing. It is the ON-PAGE
|
|
727
|
+
trail only — `foot.html` emits the BreadcrumbList JSON-LD unconditionally
|
|
728
|
+
from `site`, and the arg neither feeds nor replaces it, so an author keeping
|
|
729
|
+
a deep page honest keeps BOTH consistent.
|
|
730
|
+
- `marketing/hero` `heading_level` (#500) — the headline's tag, default `1`. A
|
|
731
|
+
page composing the band twice (the #496 pattern: the dashboard demo as its
|
|
732
|
+
own below-fold instance) authors `2` on the second and ships one h1. The
|
|
733
|
+
classes never change with the level, so classy's hero rules key on
|
|
734
|
+
`.omega-display--hero` rather than the tag.
|
|
735
|
+
- `marketing/prose` (#515) — the head-plus-lede band: the shared
|
|
736
|
+
`heading/section-head` cluster over a `body` of paragraphs, one `<p>` each,
|
|
737
|
+
in the `omega-prose` reading column. No items, no media, no new CSS. Absent
|
|
738
|
+
body renders the head alone. Before it, that shape had to fake itself with an
|
|
739
|
+
item-less `marketing/showcase`; that empty-items rendering stays UNRATIFIED.
|
|
740
|
+
- `marketing/pricing-cards` (#493) — the minimal plan band, composed by the
|
|
741
|
+
base index layout directly under the WHY band (the bento). It renders from
|
|
742
|
+
the SAME resolved catalog `/pricing` does: the layout bridges
|
|
743
|
+
`plans: resolved.pricing.plans` and `annual: resolved.pricing.billing.annually`,
|
|
744
|
+
so the annual view shows the resolver's own floored monthly equivalent
|
|
745
|
+
(#477) and no homepage number can drift from `payment.products`. The card
|
|
746
|
+
vocabulary is `/pricing`'s `omega-price-card`, minus the billing-toggle JS
|
|
747
|
+
hooks (`amount`, `billing-info`) and with a real link per card instead of a
|
|
748
|
+
checkout button — that binding is a page module, and a hook nothing binds is
|
|
749
|
+
a dead contract. No plans, no band; `enabled: false` removes it (#473).
|
|
750
|
+
Because the band composes price cards OFF /pricing, a theme's
|
|
751
|
+
`.omega-price-card` skin belongs in its marketing layer in the main bundle,
|
|
752
|
+
never in `css/pages/pricing/index.scss` — neobrutalism and newsflash hoisted
|
|
753
|
+
theirs there (#531), matching classy; /pricing renders identically, its
|
|
754
|
+
styles simply arrive from the shared layer.
|
|
755
|
+
- `pricing/features` (#539) — the price card's feature bullets, hoisted out of
|
|
756
|
+
the /pricing layout into a COMPONENT because the band composes the same
|
|
757
|
+
list: green check, the catalog's value ahead of the name, and the
|
|
758
|
+
dotted-underline tooltip a feature's `definition` earns (the themes
|
|
759
|
+
initialize Bootstrap tooltips page-wide, so the affordance works wherever
|
|
760
|
+
the list lands). Three callers — /pricing's plan cards, its one-time cards,
|
|
761
|
+
and `marketing/pricing-cards` — so the hover surface can never exist on one
|
|
762
|
+
and not the other. **Where the data comes from changed with
|
|
763
|
+
[#647](https://github.com/Omega-JS-Stack/omega/issues/647), the rendering did
|
|
764
|
+
not**: the composer now reads the top-level `features` CATALOG for the row
|
|
765
|
+
order, the name, the icon and the definition, and each product's `features`
|
|
766
|
+
map for its value alone ([config.md](shared/config.md)). A feature valued
|
|
767
|
+
`false` (or absent) is not part of that tier and renders nowhere. The
|
|
768
|
+
definition BACKFILL is gone with the duplication that needed it — a
|
|
769
|
+
definition exists in exactly one place now. The caller keeps the tier note above the extras, because
|
|
770
|
+
its WORDING differs by surface: the page says "Everything in <previous>,
|
|
771
|
+
and more:", the band says "and:" (Ian 2026-08-24). The band reads the
|
|
772
|
+
composer's own `commonFeatures`/`extraFeatures` split, falling back to the
|
|
773
|
+
flat `features` list for a plan hand-authored in a page body.
|
|
774
|
+
- The /pricing comparison matrix reads a cell the SAME way (#562, ruling Ian
|
|
775
|
+
2026-08-25). A truthy cell is a YES and draws `circle-check`; a cell that is
|
|
776
|
+
not a bare `true` also prints its own value as `omega-compare__label` beside
|
|
777
|
+
the mark. `true` stays icon-only, falsy stays `circle-xmark`. **One value
|
|
778
|
+
feeds both surfaces**: a product's `features.<id>` entry is the only number or
|
|
779
|
+
label either one reads (#647), so a catalog's `"Included"` stops mixing the
|
|
780
|
+
word with x icons in the same row while the cards keep printing the label. A value the catalog
|
|
781
|
+
authored is TEXT — `omega_commaify` still formats a number, then
|
|
782
|
+
`escape_once` (#580).
|
|
783
|
+
|
|
784
|
+
- `marketing/bento` `subheadline` default (#512) — the section default is
|
|
785
|
+
EMPTY: an absent subheadline renders no sub node, never a demo sentence the
|
|
786
|
+
brand never wrote (it shipped onto 40 pages of the operst port). The demo
|
|
787
|
+
line moved into the band's `Default grid` gallery variant, where sample
|
|
788
|
+
content belongs. Same sweep, same move: `about/timeline` and
|
|
789
|
+
`about/principles` (the about layout authors both bands' real sub lines
|
|
790
|
+
itself, so the packaged /about is unchanged). The rule this pins: **a
|
|
791
|
+
json5 default is STRUCTURE — copy that reads as a live sentence belongs to
|
|
792
|
+
a gallery variant or to the composing layout.** The sweep's remainder
|
|
793
|
+
(#530) finished the job on the three marketing bands the base index layout
|
|
794
|
+
composes without copy of its own: `marketing/showcase`,
|
|
795
|
+
`marketing/product-demo` and `marketing/pricing-cards` all take the empty
|
|
796
|
+
default, their demo lines moved to their gallery variants, and the packaged
|
|
797
|
+
homepage's plan band now renders head-only until a brand writes its own sub
|
|
798
|
+
line. (`marketing/prose` was already neutral by design.)
|
|
799
|
+
- `marketing/bento` tile `href` (#514) — the linked-card listing. With `href`
|
|
800
|
+
the WHOLE tile renders as one `<a>` wearing `.omega-interactive` (the shared
|
|
801
|
+
whole-surface click affordance); without it the tile is the div it always
|
|
802
|
+
was. **A linked tile's body carries no nested anchors** — one anchor per
|
|
803
|
+
tile, always, so the markup stays valid and the click target stays whole.
|
|
804
|
+
It covers every hub/category listing the operst port hand-rolled over the
|
|
805
|
+
`omega-rowlist` vocabulary; no separate link-list band exists (#514's
|
|
806
|
+
deletion test).
|
|
807
|
+
- `marketing/bento` `numbered` (#519) — band-level, not per tile: `true`
|
|
808
|
+
numbers the tiles 1..N by position as a small mono ordinal chip
|
|
809
|
+
(`omega-tile__ordinal`, tokens only), so reordering a process band
|
|
810
|
+
renumbers itself. Default band unchanged.
|
|
811
|
+
- `marketing/stats` item `icon` + `color` (#518) — the glyph rides the ONE
|
|
812
|
+
icon mechanism (native `fa-*` markup in the shared `omega-icon-chip` idiom); `color`
|
|
813
|
+
names a slot in the categorical token palette (`tone-1`…`tone-6` — the same
|
|
814
|
+
ramp charts and tone chips read, [theming](shared/theming.md)) and is
|
|
815
|
+
WHITELISTED: anything else — a hex, a Bootstrap name — paints nothing, so a
|
|
816
|
+
band can never colour outside the theme. The tone marks the glyph; the
|
|
817
|
+
number stays ink.
|
|
818
|
+
- `about/letter` aside gate (#520) — the aside renders only when it has
|
|
819
|
+
something to say: feed items, or the aside photo. Empty `feed_items` means
|
|
820
|
+
no feed AND no framing (fragment box, status chip, label), and with no photo
|
|
821
|
+
either the aside column goes with it and the letter runs the container's
|
|
822
|
+
full width. Before it, a brand that wanted the mission/vision copy without
|
|
823
|
+
the feed got an empty ornament no page asked for.
|
|
824
|
+
- `about/hero` `facts_head.headline_accent` (#516) — the facts head composed
|
|
825
|
+
every line but the accent, so a legacy "Measuring our IMPACT" rendered as
|
|
826
|
+
"Measuring our". It passes through like every other head composition now.
|
|
827
|
+
- `blueprint/team/index` copy homes (#517) — three optional args, all absent
|
|
828
|
+
by default (byte-identical hub): `grid_head` (superheadline / headline /
|
|
829
|
+
headline_accent / subheadline) heads the portrait grid through the shared
|
|
830
|
+
`heading/section-head` cluster; each member's own one-line `bio:` (in their
|
|
831
|
+
`_team` doc) reads under name and position as `omega-person__desc` — the
|
|
832
|
+
card vocabulary the theme already styled and nothing rendered; and
|
|
833
|
+
`mission_headline` gives the mission band its h2.
|
|
834
|
+
- `blueprint/alternatives/index` competitor description (#563) — the same
|
|
835
|
+
shape one page over: each `_alternatives` doc's
|
|
836
|
+
`alternative.competitor.description` reads UNDER its hub row title as
|
|
837
|
+
`omega-rowlist__desc` (the row's first cell, above the "View comparison"
|
|
838
|
+
meta), muted and unweighted so the link voice stays the title's. Every
|
|
839
|
+
alternatives doc authors the key and legacy UJM printed it; the OMEGA hub
|
|
840
|
+
printed the title and the link alone, so brand copy had nowhere to land.
|
|
841
|
+
Unauthored, the row is byte-identical to what it always was.
|
|
842
|
+
|
|
843
|
+
Pending (spec §13): the arc close — THE FORK (real omegajs.dev sub-brand
|
|
844
|
+
born outside the monorepo on published omega; Ian-gated on publish/launch
|
|
845
|
+
decisions).
|