@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/dist/pricing.js
ADDED
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pricing view-model composer — `payment.products` (omega.json5) is the ONLY
|
|
3
|
+
* source for pricing pages (C2). The engine derives `site.pricing` from the
|
|
4
|
+
* catalog and every theme renders that; consumer page frontmatter can still
|
|
5
|
+
* override presentation per-page through the resolved cascade (frontmatter is
|
|
6
|
+
* the consumer surface, never the framework's). No catalog → null → themes
|
|
7
|
+
* render an honest empty state instead of fictional plans.
|
|
8
|
+
*
|
|
9
|
+
* A feature is DEFINED once, in the config's top-level `features` catalog
|
|
10
|
+
* (name, icon, definition, and a `usage` block on the metered ones), and each
|
|
11
|
+
* product names only its VALUE
|
|
12
|
+
* ([#647](https://github.com/Omega-JS-Stack/omega/issues/647)). So this
|
|
13
|
+
* composer reads BOTH halves: the catalog decides row order and copy, the
|
|
14
|
+
* product decides what its tier promises. There is nothing left to backfill —
|
|
15
|
+
* a definition cannot disagree with itself when it exists in one place.
|
|
16
|
+
*
|
|
17
|
+
* Product presentation fields (optional, alongside the backend-shaped
|
|
18
|
+
* id/name/type/prices/trial):
|
|
19
|
+
* tagline - short line under the plan name
|
|
20
|
+
* popular - highlight badge on the plan card
|
|
21
|
+
* enterprise - the "talk to us" tier: leaves BOTH card lanes (plans and
|
|
22
|
+
* one-time, whatever its type) and renders as its own
|
|
23
|
+
* full-width row (no enterprise product in the catalog → no
|
|
24
|
+
* row, never invented)
|
|
25
|
+
* url - CTA href (defaults to /signup for free plans; /contact for
|
|
26
|
+
* the enterprise tier; paid plans without a url get a
|
|
27
|
+
* checkout button instead)
|
|
28
|
+
* features - the values map { <catalog id>: value }: a number on a counted
|
|
29
|
+
* feature (-1 renders as Unlimited), true/a string on a perk,
|
|
30
|
+
* and `false` (or absent) means the tier does not include it
|
|
31
|
+
* hidden - presentation-only exclusion (#348): the product is still
|
|
32
|
+
* created on every provider and purchasable by id (QA tiers,
|
|
33
|
+
* grandfathered plans), but the composer drops it before any
|
|
34
|
+
* lane reads the catalog — no card, no comparison row, no vote
|
|
35
|
+
* on the page's universal numbers
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
const Logger = require('./vendor/devkit/logger.js');
|
|
39
|
+
|
|
40
|
+
const logger = new Logger('pricing');
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Normalize a feature value for display: -1 is the catalog's "unlimited"
|
|
44
|
+
* sentinel; undefined stays null so templates can render name-only features.
|
|
45
|
+
* @param {*} value - raw feature/limit value
|
|
46
|
+
* @returns {*} display value or null
|
|
47
|
+
*/
|
|
48
|
+
function normalizeValue(value) {
|
|
49
|
+
if (value === undefined || value === null) return null;
|
|
50
|
+
if (value === -1) return 'Unlimited';
|
|
51
|
+
return value;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Compose a product's display features: the FEATURES CATALOG supplies the row
|
|
56
|
+
* order, the name, the icon and the definition; the product supplies only the
|
|
57
|
+
* value. A feature the product does not name — or names `false` — is not part
|
|
58
|
+
* of that tier and renders nowhere.
|
|
59
|
+
* @param {object} product - catalog entry (payment.products)
|
|
60
|
+
* @param {object} catalog - the top-level `features` catalog
|
|
61
|
+
* @returns {Array<object>} [{ id, name, icon, definition, value }]
|
|
62
|
+
* @throws {Error} on the pre-#647 features LIST, naming the migration
|
|
63
|
+
*/
|
|
64
|
+
function composeFeatures(product, catalog) {
|
|
65
|
+
const values = (product && product.features) || {};
|
|
66
|
+
|
|
67
|
+
// The pre-#647 display LIST is a shape this composer stopped understanding
|
|
68
|
+
// the day the catalog became the one home of a feature's copy — every key
|
|
69
|
+
// lookup below misses, so an unmigrated brand would get cards with no
|
|
70
|
+
// bullets and an empty comparison matrix. Say so instead (the config
|
|
71
|
+
// validator refuses the same shape earlier; this is the backstop for the
|
|
72
|
+
// readers that reach the composer without it).
|
|
73
|
+
if (Array.isArray(values)) {
|
|
74
|
+
throw new Error(
|
|
75
|
+
`payment.products "${(product && product.id) || 'unnamed'}" carries the pre-#647 features LIST — `
|
|
76
|
+
+ 'write `features: { requests: 100, support: true }` and define each feature ONCE in the '
|
|
77
|
+
+ 'top-level `features` catalog (docs/shared/breaking-changes.md § Plan limits become the features catalog)',
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return Object.keys(catalog)
|
|
82
|
+
.filter((id) => values[id] !== undefined && values[id] !== false)
|
|
83
|
+
.map((id) => ({
|
|
84
|
+
id: id,
|
|
85
|
+
name: catalog[id].name || id,
|
|
86
|
+
icon: catalog[id].icon || null,
|
|
87
|
+
definition: catalog[id].definition || null,
|
|
88
|
+
value: normalizeValue(values[id]),
|
|
89
|
+
}));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Compose one subscription plan card model.
|
|
94
|
+
* @param {object} product - catalog entry (type subscription)
|
|
95
|
+
* @returns {object} plan view-model
|
|
96
|
+
*/
|
|
97
|
+
function composePlan(product, catalog) {
|
|
98
|
+
const prices = product.prices || {};
|
|
99
|
+
const monthly = typeof prices.monthly === 'number' ? prices.monthly : 0;
|
|
100
|
+
const annually = typeof prices.annually === 'number' ? prices.annually : 0;
|
|
101
|
+
const free = monthly <= 0 && annually <= 0;
|
|
102
|
+
|
|
103
|
+
return {
|
|
104
|
+
id: product.id,
|
|
105
|
+
name: product.name,
|
|
106
|
+
tagline: product.tagline || null,
|
|
107
|
+
popular: product.popular === true,
|
|
108
|
+
free: free,
|
|
109
|
+
url: product.url || (free ? '/signup' : null),
|
|
110
|
+
trialDays: (product.trial && product.trial.days) || 0,
|
|
111
|
+
prices: {
|
|
112
|
+
monthly: monthly,
|
|
113
|
+
annually: annually,
|
|
114
|
+
// What the card shows in "$N /month" while the annual toggle is active.
|
|
115
|
+
// FLOORS (#477 — legacy parity): the monthly equivalent never claims
|
|
116
|
+
// more than a twelfth of what is actually charged.
|
|
117
|
+
annuallyPerMonth: annually > 0 ? Math.floor(annually / 12) : 0,
|
|
118
|
+
},
|
|
119
|
+
features: composeFeatures(product, catalog),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Compose the enterprise tier: the "talk to us" product, priced by
|
|
125
|
+
* conversation instead of by card — no prices, no billing cadence, a contact
|
|
126
|
+
* CTA. It never enters the plan grid or the comparison matrix.
|
|
127
|
+
* @param {object} product - catalog entry flagged `enterprise: true`
|
|
128
|
+
* @returns {object} enterprise view-model
|
|
129
|
+
*/
|
|
130
|
+
function composeEnterprise(product, catalog) {
|
|
131
|
+
return {
|
|
132
|
+
id: product.id,
|
|
133
|
+
name: product.name,
|
|
134
|
+
tagline: product.tagline || null,
|
|
135
|
+
url: product.url || '/contact',
|
|
136
|
+
features: composeFeatures(product, catalog),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Split each plan's features into the set common to ALL plans (rendered with
|
|
142
|
+
* per-plan values) and the plan's extras (rendered under "Everything in
|
|
143
|
+
* <previous>, and more").
|
|
144
|
+
* @param {Array<object>} plans - composed plans
|
|
145
|
+
*/
|
|
146
|
+
function splitCommonFeatures(plans) {
|
|
147
|
+
const withFeatures = plans.filter((plan) => plan.features.length > 0);
|
|
148
|
+
const commonIds = withFeatures.length === plans.length && plans.length > 0
|
|
149
|
+
? plans[0].features
|
|
150
|
+
.filter((feature) => plans.every((plan) => plan.features.some((f) => f.id === feature.id)))
|
|
151
|
+
.map((feature) => feature.id)
|
|
152
|
+
: [];
|
|
153
|
+
|
|
154
|
+
for (const plan of plans) {
|
|
155
|
+
plan.commonFeatures = plan.features.filter((feature) => commonIds.includes(feature.id));
|
|
156
|
+
plan.extraFeatures = plan.features.filter((feature) => !commonIds.includes(feature.id));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Build the feature-comparison matrix: the union of plan features in first-
|
|
162
|
+
* appearance order, with per-plan values. A plan that doesn't declare a
|
|
163
|
+
* feature inherits the value from the closest EARLIER plan that does (tiers
|
|
164
|
+
* accumulate) — null means genuinely not included.
|
|
165
|
+
* @param {Array<object>} plans - composed plans
|
|
166
|
+
* @returns {{ features: Array<object> }}
|
|
167
|
+
*/
|
|
168
|
+
function composeComparison(plans) {
|
|
169
|
+
const features = [];
|
|
170
|
+
const byId = new Map();
|
|
171
|
+
|
|
172
|
+
for (const plan of plans) {
|
|
173
|
+
for (const feature of plan.features) {
|
|
174
|
+
if (byId.has(feature.id)) continue;
|
|
175
|
+
const entry = {
|
|
176
|
+
id: feature.id,
|
|
177
|
+
name: feature.name,
|
|
178
|
+
icon: feature.icon,
|
|
179
|
+
definition: feature.definition,
|
|
180
|
+
values: {},
|
|
181
|
+
};
|
|
182
|
+
byId.set(feature.id, entry);
|
|
183
|
+
features.push(entry);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
for (const entry of features) {
|
|
188
|
+
let inherited = null;
|
|
189
|
+
for (const plan of plans) {
|
|
190
|
+
const own = plan.features.find((feature) => feature.id === entry.id);
|
|
191
|
+
if (own) inherited = own.value !== null ? own.value : true;
|
|
192
|
+
entry.values[plan.id] = own ? (own.value !== null ? own.value : true) : inherited;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
return { features: features };
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* The catalog a page may show: `hidden: true` is presentation-only (#348), so
|
|
201
|
+
* it drops here ONCE and every reader — the composer below, the `omega build`
|
|
202
|
+
* empty-catalog warning — asks this one question.
|
|
203
|
+
* @param {object} payment - resolved config `payment` section
|
|
204
|
+
* @returns {Array<object>} the non-hidden products, in catalog order
|
|
205
|
+
*/
|
|
206
|
+
function visibleProducts(payment) {
|
|
207
|
+
const catalog = payment && Array.isArray(payment.products) ? payment.products : [];
|
|
208
|
+
return catalog.filter((product) => product.hidden !== true);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Compose the pricing view-model from the shared payment section and the
|
|
213
|
+
* features catalog.
|
|
214
|
+
* @param {object} payment - resolved config `payment` section
|
|
215
|
+
* @param {object} [features] - resolved config `features` catalog (#647)
|
|
216
|
+
* @returns {object|null} { plans, oneTime, enterprise, billing, savingsPercent, comparison } or null when the catalog is empty
|
|
217
|
+
*/
|
|
218
|
+
function composePricing(payment, features) {
|
|
219
|
+
// Every lane below composes from what the page may show (a catalog of
|
|
220
|
+
// nothing else renders the empty state)
|
|
221
|
+
const products = visibleProducts(payment);
|
|
222
|
+
if (products.length === 0) return null;
|
|
223
|
+
|
|
224
|
+
// The one home of what a feature IS. A brand with products but no catalog
|
|
225
|
+
// renders cards with no bullets rather than inventing copy for them.
|
|
226
|
+
const catalog = (features && typeof features === 'object' && !Array.isArray(features)) ? features : {};
|
|
227
|
+
|
|
228
|
+
// The enterprise tier is a product like any other, marked `enterprise: true`
|
|
229
|
+
// — it leaves the grid so the cards stay peers of each other
|
|
230
|
+
const enterpriseProduct = products.find((product) => product.enterprise === true);
|
|
231
|
+
const enterprise = enterpriseProduct ? composeEnterprise(enterpriseProduct, catalog) : null;
|
|
232
|
+
|
|
233
|
+
const plans = products
|
|
234
|
+
.filter((product) => (product.type || 'subscription') === 'subscription' && product.enterprise !== true)
|
|
235
|
+
.map((product) => composePlan(product, catalog));
|
|
236
|
+
|
|
237
|
+
const oneTime = products
|
|
238
|
+
.filter((product) => product.type === 'one-time' && product.enterprise !== true)
|
|
239
|
+
.map((product) => ({
|
|
240
|
+
id: product.id,
|
|
241
|
+
name: product.name,
|
|
242
|
+
tagline: product.tagline || null,
|
|
243
|
+
price: (product.prices && typeof product.prices.once === 'number') ? product.prices.once : 0,
|
|
244
|
+
features: composeFeatures(product, catalog),
|
|
245
|
+
}));
|
|
246
|
+
|
|
247
|
+
// The comparison inherits feature values by catalog position (tiers
|
|
248
|
+
// accumulate), so `payment.products` must be authored lowest tier first —
|
|
249
|
+
// warn when prices are non-monotonic instead of silently composing a
|
|
250
|
+
// wrong matrix.
|
|
251
|
+
for (let i = 1; i < plans.length; i++) {
|
|
252
|
+
const prev = plans[i - 1].prices;
|
|
253
|
+
const curr = plans[i].prices;
|
|
254
|
+
const prevRank = prev.monthly || prev.annually;
|
|
255
|
+
const currRank = curr.monthly || curr.annually;
|
|
256
|
+
if (currRank < prevRank) {
|
|
257
|
+
logger.warn(`payment.products lists "${plans[i].id}" after the pricier "${plans[i - 1].id}" — the comparison matrix inherits values by catalog order (lowest tier first); reorder the catalog.`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
splitCommonFeatures(plans);
|
|
262
|
+
|
|
263
|
+
// Billing toggle only exists when both cadences are actually purchasable
|
|
264
|
+
const billing = {
|
|
265
|
+
monthly: plans.some((plan) => plan.prices.monthly > 0),
|
|
266
|
+
annually: plans.some((plan) => plan.prices.annually > 0),
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
// Honest annual-savings badge: the best real discount across paid plans
|
|
270
|
+
let savingsPercent = 0;
|
|
271
|
+
for (const plan of plans) {
|
|
272
|
+
if (plan.prices.monthly > 0 && plan.prices.annually > 0) {
|
|
273
|
+
const percent = Math.round((1 - plan.prices.annually / (plan.prices.monthly * 12)) * 100);
|
|
274
|
+
if (percent > savingsPercent) savingsPercent = percent;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// The catalog's trial, as ONE number the page can speak (#273). The copy it
|
|
279
|
+
// feeds is UNIVERSAL ("every paid plan starts with a N-day free trial"), so
|
|
280
|
+
// the number only exists when every paid plan agrees on it: a catalog whose
|
|
281
|
+
// paid plans carry different trials (or one without a trial at all) speaks
|
|
282
|
+
// no universal number → 0, and trial copy renders nowhere, exactly like a
|
|
283
|
+
// catalog with no trial. Free plans carry nothing to disagree with, and the
|
|
284
|
+
// per-plan `plan.trialDays` still states each plan's own truth.
|
|
285
|
+
const paidPlans = plans.filter((plan) => !plan.free);
|
|
286
|
+
const trialDays = paidPlans.length > 0 && paidPlans.every((plan) => plan.trialDays === paidPlans[0].trialDays)
|
|
287
|
+
? paidPlans[0].trialDays
|
|
288
|
+
: 0;
|
|
289
|
+
|
|
290
|
+
return {
|
|
291
|
+
plans: plans,
|
|
292
|
+
oneTime: oneTime,
|
|
293
|
+
enterprise: enterprise,
|
|
294
|
+
billing: billing,
|
|
295
|
+
savingsPercent: savingsPercent,
|
|
296
|
+
trialDays: trialDays,
|
|
297
|
+
comparison: composeComparison(plans),
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
module.exports = { composePricing, visibleProducts };
|
package/dist/purge.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare cache purge — the UJM cloudflare-purge successor, de-ITW'd:
|
|
3
|
+
* legacy proxied through the hardcoded ITW wrapper API (which held the
|
|
4
|
+
* token server-side); this talks to the Cloudflare API directly with the
|
|
5
|
+
* BRAND's own CLOUDFLARE_TOKEN from the .env cascade.
|
|
6
|
+
*
|
|
7
|
+
* Zone resolution: config `edge.providers.cloudflare.zone` wins;
|
|
8
|
+
* otherwise the zone is looked up by the brand URL's apex domain. No token
|
|
9
|
+
* → a clean skip (machine-readable), never a failure — purging is a
|
|
10
|
+
* post-deploy nicety, not a gate.
|
|
11
|
+
*/
|
|
12
|
+
const fetch = require('wonderful-fetch');
|
|
13
|
+
|
|
14
|
+
const API = 'https://api.cloudflare.com/client/v4';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* The apex domain of a site URL: playground.omegajs.dev → omegajs.dev.
|
|
18
|
+
* Multi-label TLDs aren't handled (none of ours) — config `edge.providers.cloudflare.zone`
|
|
19
|
+
* is the override for exotic zones.
|
|
20
|
+
* @param {string} url
|
|
21
|
+
* @returns {string|null}
|
|
22
|
+
*/
|
|
23
|
+
function apexOf(url) {
|
|
24
|
+
const host = String(url || '').replace(/^https?:\/\//, '').replace(/\/.*$/, '');
|
|
25
|
+
const labels = host.split('.').filter(Boolean);
|
|
26
|
+
if (labels.length < 2) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
return labels.slice(-2).join('.');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Purge the site's Cloudflare zone cache (purge_everything).
|
|
34
|
+
*
|
|
35
|
+
* @param {object} options
|
|
36
|
+
* @param {object} options.config - resolved web config (edge.providers.cloudflare.zone, brand.url)
|
|
37
|
+
* @param {string} [options.token] - Cloudflare API token (default: env CLOUDFLARE_TOKEN)
|
|
38
|
+
* @param {boolean} [options.dryRun] - resolve + plan, send nothing
|
|
39
|
+
* @param {function} [options.fetcher] - injection point for tests (default: wonderful-fetch)
|
|
40
|
+
* @returns {Promise<{ status: 'purged'|'planned'|'skipped', reason?: string, zone?: string, zoneName?: string }>}
|
|
41
|
+
*/
|
|
42
|
+
async function purgeZoneCache(options) {
|
|
43
|
+
const { config, dryRun = false, fetcher = fetch } = options;
|
|
44
|
+
const token = options.token !== undefined ? options.token : process.env.CLOUDFLARE_TOKEN;
|
|
45
|
+
|
|
46
|
+
if (!token) {
|
|
47
|
+
return { status: 'skipped', reason: 'no CLOUDFLARE_TOKEN in the env cascade' };
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const headers = { Authorization: `Bearer ${token}` };
|
|
51
|
+
|
|
52
|
+
// Zone id: explicit config wins; otherwise look it up by apex domain
|
|
53
|
+
let zone = config.edge && config.edge.providers && config.edge.providers.cloudflare && config.edge.providers.cloudflare.zone;
|
|
54
|
+
let zoneName = null;
|
|
55
|
+
if (!zone) {
|
|
56
|
+
const apex = apexOf(config.brand && config.brand.url);
|
|
57
|
+
if (!apex) {
|
|
58
|
+
return { status: 'skipped', reason: 'no edge.providers.cloudflare.zone in config and no brand.url to derive the zone from' };
|
|
59
|
+
}
|
|
60
|
+
const lookup = await fetcher(`${API}/zones?name=${apex}`, { method: 'get', response: 'json', headers });
|
|
61
|
+
const match = lookup && lookup.result && lookup.result[0];
|
|
62
|
+
if (!match) {
|
|
63
|
+
return { status: 'skipped', reason: `no Cloudflare zone named ${apex} visible to this token` };
|
|
64
|
+
}
|
|
65
|
+
zone = match.id;
|
|
66
|
+
zoneName = match.name;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (dryRun) {
|
|
70
|
+
return { status: 'planned', zone, zoneName };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const result = await fetcher(`${API}/zones/${zone}/purge_cache`, {
|
|
74
|
+
method: 'post',
|
|
75
|
+
response: 'json',
|
|
76
|
+
headers,
|
|
77
|
+
body: { purge_everything: true },
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
if (!result || result.success !== true) {
|
|
81
|
+
const errors = (result && result.errors) || [];
|
|
82
|
+
const detail = errors.length ? JSON.stringify(errors) : 'unknown error';
|
|
83
|
+
// Code 10000 on purge_cache with a token that could READ the zone =
|
|
84
|
+
// missing permission (DNS-scoped tokens hit this — the exact live
|
|
85
|
+
// rehearsal failure): purging needs Zone → Cache Purge → Purge.
|
|
86
|
+
const hint = errors.some((error) => error.code === 10000)
|
|
87
|
+
? ' — the token lacks the Cache Purge permission: edit it at https://dash.cloudflare.com/profile/api-tokens and add Zone → Cache Purge → Purge'
|
|
88
|
+
: '';
|
|
89
|
+
throw new Error(`Cloudflare purge failed: ${detail}${hint}`);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return { status: 'purged', zone, zoneName };
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
module.exports = { purgeZoneCache, apexOf };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The ONE shape of a GENERATED redirect page (#429 socials, #561 download and
|
|
3
|
+
* extension shortlinks). Legacy UJM hand-maintained these as default pages in
|
|
4
|
+
* `src/defaults/dist/redirects/**`; here they are source strings registered as
|
|
5
|
+
* virtual templates on the same lane as the framework's default pages
|
|
6
|
+
* (engine.js), so they ride `modules/utilities/redirect` (noindex +
|
|
7
|
+
* sitemap-excluded by the layout) and a consumer page at the same permalink
|
|
8
|
+
* takes that URL over.
|
|
9
|
+
*
|
|
10
|
+
* A brand never hand-writes one: the config block IS the declaration.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
// A YAML double-quoted scalar (the dynamic-pages spelling).
|
|
14
|
+
const yaml = (value) => JSON.stringify(String(value));
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* One generated redirect page.
|
|
18
|
+
* @param {object} page
|
|
19
|
+
* @param {string} page.virtual - the virtual template path (its identity in the build)
|
|
20
|
+
* @param {string} page.label - what generated it, for logs and collision reports
|
|
21
|
+
* @param {string} page.url - the permalink
|
|
22
|
+
* @param {string} page.redirect - where it sends the visitor
|
|
23
|
+
* @param {string} page.note - the source comment written into the page
|
|
24
|
+
* @returns {{ virtual: string, label: string, url: string, raw: string }}
|
|
25
|
+
*/
|
|
26
|
+
function redirectPage({ virtual, label, url, redirect, note }) {
|
|
27
|
+
return {
|
|
28
|
+
virtual,
|
|
29
|
+
label,
|
|
30
|
+
url,
|
|
31
|
+
raw: [
|
|
32
|
+
'---',
|
|
33
|
+
'layout: modules/utilities/redirect',
|
|
34
|
+
`permalink: ${url}`,
|
|
35
|
+
'',
|
|
36
|
+
`# ${note}`,
|
|
37
|
+
'redirect:',
|
|
38
|
+
` url: ${yaml(redirect)}`,
|
|
39
|
+
'---',
|
|
40
|
+
'',
|
|
41
|
+
].join('\n'),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
module.exports = { redirectPage };
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sample content (spec §8): the shared filler that keeps a content-less brand
|
|
3
|
+
* alive in development — posts, teammates, updates. One corpus for every
|
|
4
|
+
* theme, auto-generated with ROLLING dates: each file's authored date is a
|
|
5
|
+
* rhythm relative to SAMPLE_EPOCH_UTC, and generation re-anchors that rhythm
|
|
6
|
+
* to "now" (or an explicit anchor), so a virgin blog always looks alive —
|
|
7
|
+
* never "6 months stale". `omega dev` also materializes the generated set
|
|
8
|
+
* under the target's gitignored `.omega/sample-content/` so humans can read and
|
|
9
|
+
* copy the files; the tree is machine-owned and regenerated every boot.
|
|
10
|
+
*/
|
|
11
|
+
const fs = require('node:fs');
|
|
12
|
+
const path = require('node:path');
|
|
13
|
+
const reads = require('./vendor/devkit/reads.js');
|
|
14
|
+
|
|
15
|
+
// The day the sample corpus dates were authored against (spec §8 ruling,
|
|
16
|
+
// Ian 2026-07-18). Anchor === epoch reproduces the authored dates exactly —
|
|
17
|
+
// the determinism pin the test harness uses.
|
|
18
|
+
const SAMPLE_EPOCH_UTC = Date.UTC(2026, 6, 18);
|
|
19
|
+
|
|
20
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
21
|
+
const DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
|
|
22
|
+
|
|
23
|
+
// Collection dir (consumer + injection lane) ↔ packaged corpus dir.
|
|
24
|
+
const SAMPLE_SETS = [
|
|
25
|
+
{ collectionDir: '_posts', samplesDir: 'sample-posts' }, // the blog (11 posts — enough to exercise pagination at size 6)
|
|
26
|
+
{ collectionDir: '_team', samplesDir: 'sample-team' }, // the /team portrait grid + member pages
|
|
27
|
+
{ collectionDir: '_updates', samplesDir: 'sample-updates' }, // the /updates release feed
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Parse a YYYY-MM-DD string to a UTC-midnight timestamp.
|
|
32
|
+
* @param {string} value
|
|
33
|
+
* @returns {number}
|
|
34
|
+
*/
|
|
35
|
+
function parseDay(value) {
|
|
36
|
+
const [year, month, day] = value.split('-').map(Number);
|
|
37
|
+
return Date.UTC(year, month - 1, day);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Format a UTC timestamp as YYYY-MM-DD.
|
|
42
|
+
* @param {number} ms
|
|
43
|
+
* @returns {string}
|
|
44
|
+
*/
|
|
45
|
+
function formatDay(ms) {
|
|
46
|
+
return new Date(ms).toISOString().slice(0, 10);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Resolve the rolling-date anchor (UTC-midnight ms). Precedence: explicit
|
|
51
|
+
* option > OMEGA_SAMPLE_ANCHOR env (the harness determinism pin) > today.
|
|
52
|
+
* @param {string} [explicit] - YYYY-MM-DD
|
|
53
|
+
* @returns {number}
|
|
54
|
+
*/
|
|
55
|
+
function resolveAnchor(explicit) {
|
|
56
|
+
const value = explicit || process.env.OMEGA_SAMPLE_ANCHOR;
|
|
57
|
+
if (!value) {
|
|
58
|
+
const now = new Date();
|
|
59
|
+
return Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate());
|
|
60
|
+
}
|
|
61
|
+
if (!DATE_RE.test(value)) {
|
|
62
|
+
throw new Error(`Invalid sample-content anchor "${value}" — expected YYYY-MM-DD`);
|
|
63
|
+
}
|
|
64
|
+
return parseDay(value);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Shift a YYYY-MM-DD string by the anchor's offset from the corpus epoch.
|
|
69
|
+
* @param {string} value
|
|
70
|
+
* @param {number} anchorMs
|
|
71
|
+
* @returns {string}
|
|
72
|
+
*/
|
|
73
|
+
function shiftDay(value, anchorMs) {
|
|
74
|
+
return formatDay(parseDay(value) + (anchorMs - SAMPLE_EPOCH_UTC));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Roll one corpus file: date-prefixed filenames shift (posts — Eleventy reads
|
|
79
|
+
* page.date from the prefix), `date: YYYY-MM-DD` lines inside the frontmatter
|
|
80
|
+
* block shift (updates), a generated-content header comment lands inside
|
|
81
|
+
* the frontmatter (inert in YAML, never rendered), and the `generated: true`
|
|
82
|
+
* marker lands with it — the RENDER-visible half (#208), which templates key
|
|
83
|
+
* the TEST badge off so filler can never be mistaken for the brand's own
|
|
84
|
+
* writing on screen. It rides the generator, never the corpus files, so every
|
|
85
|
+
* sample document carries it and no fixture can forget to.
|
|
86
|
+
* @param {string} name - corpus filename
|
|
87
|
+
* @param {string} content - corpus file content
|
|
88
|
+
* @param {number} anchorMs
|
|
89
|
+
* @param {string} collectionDir - for the header's "real files" hint
|
|
90
|
+
* @returns {{ name: string, content: string }}
|
|
91
|
+
*/
|
|
92
|
+
function rollFile(name, content, anchorMs, collectionDir) {
|
|
93
|
+
const dated = name.match(/^(\d{4}-\d{2}-\d{2})-(.*)$/);
|
|
94
|
+
const outName = dated ? `${shiftDay(dated[1], anchorMs)}-${dated[2]}` : name;
|
|
95
|
+
|
|
96
|
+
let outContent = content;
|
|
97
|
+
const fmEnd = content.startsWith('---\n') ? content.indexOf('\n---', 4) : -1;
|
|
98
|
+
if (fmEnd !== -1) {
|
|
99
|
+
const header = '# Generated sample content (@omega.js/web) — dates roll with each dev build.\n'
|
|
100
|
+
+ `# Do not edit: real files in ${collectionDir}/ replace this whole set.\n`
|
|
101
|
+
+ 'generated: true\n';
|
|
102
|
+
const frontmatter = content
|
|
103
|
+
.slice(4, fmEnd)
|
|
104
|
+
.replace(/^(\s*date: )(\d{4}-\d{2}-\d{2})$/gm, (_, prefix, day) => `${prefix}${shiftDay(day, anchorMs)}`);
|
|
105
|
+
outContent = `---\n${header}${frontmatter}${content.slice(fmEnd)}`;
|
|
106
|
+
}
|
|
107
|
+
return { name: outName, content: outContent };
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Generate one sample set from the packaged corpus with dates re-anchored.
|
|
112
|
+
* @param {string} defaultsDir - the package defaults/ root
|
|
113
|
+
* @param {{ collectionDir: string, samplesDir: string }} set
|
|
114
|
+
* @param {number} anchorMs
|
|
115
|
+
* @returns {Array<{ name: string, content: string }>}
|
|
116
|
+
*/
|
|
117
|
+
function generateSampleSet(defaultsDir, set, anchorMs) {
|
|
118
|
+
const dir = path.join(defaultsDir, set.samplesDir);
|
|
119
|
+
// Through the captured-read helper (#200): configureOmega generates the sets
|
|
120
|
+
// at config time, so the corpus dir becomes a dev config-reset target. The
|
|
121
|
+
// boot-phase caller (reconcileSampleContent) runs outside a capture scope,
|
|
122
|
+
// where the same reads record nothing.
|
|
123
|
+
return reads.readdir(dir)
|
|
124
|
+
.filter((name) => name.endsWith('.md'))
|
|
125
|
+
.sort()
|
|
126
|
+
.map((name) => rollFile(name, reads.read(path.join(dir, name)), anchorMs, set.collectionDir));
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Does the consumer have any file of their own in a collection dir?
|
|
131
|
+
* Recursive — Jekyll-style year subfolders (_posts/2024/…) count. Dotfiles
|
|
132
|
+
* don't.
|
|
133
|
+
*
|
|
134
|
+
* Reads through the captured-read helper as a RESCAN capture (#200 Lane B):
|
|
135
|
+
* the collection dirs are where the brand's real content lands, so they must
|
|
136
|
+
* never become config-reset targets — the answer is re-scanned and the sample
|
|
137
|
+
* injection gate consults it at render time. Config-time callers wrap this in
|
|
138
|
+
* `reads.rescan(...)` (src/decisions.js); the boot-phase caller
|
|
139
|
+
* (reconcileSampleContent) runs outside a capture scope and records nothing.
|
|
140
|
+
* @param {string} consumerDir
|
|
141
|
+
* @param {string} collectionDir - collection folder name ('_posts', '_team')
|
|
142
|
+
* @returns {boolean}
|
|
143
|
+
*/
|
|
144
|
+
function hasOwnContent(consumerDir, collectionDir) {
|
|
145
|
+
const root = path.join(consumerDir, collectionDir);
|
|
146
|
+
if (!reads.dirExists(root)) return false;
|
|
147
|
+
const stack = [root];
|
|
148
|
+
while (stack.length) {
|
|
149
|
+
const dir = stack.pop();
|
|
150
|
+
for (const entry of reads.readdir(dir, { withFileTypes: true })) {
|
|
151
|
+
if (entry.name.startsWith('.')) continue;
|
|
152
|
+
if (entry.isDirectory()) stack.push(path.join(dir, entry.name));
|
|
153
|
+
else if (entry.isFile()) return true;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Materialize the generated sets under `<targetRoot>/.omega/sample-content/` —
|
|
161
|
+
* the gitignored test path (spec §8). Idempotent: each active collection is
|
|
162
|
+
* rebuilt wholesale, collections the consumer owns are removed, and the tree
|
|
163
|
+
* carries a self-`.gitignore` so it can never be committed regardless of the
|
|
164
|
+
* target's own ignore rules. Never mixed with real brand content.
|
|
165
|
+
* @param {object} options
|
|
166
|
+
* @param {string} options.targetRoot - the target root (owns .omega/)
|
|
167
|
+
* @param {string} options.consumerDir - the site src dir (own-content checks)
|
|
168
|
+
* @param {string} options.defaultsDir - the package defaults/ root
|
|
169
|
+
* @param {string} [options.anchor] - YYYY-MM-DD anchor override
|
|
170
|
+
* @returns {{ root: string, written: string[], removed: string[] }}
|
|
171
|
+
*/
|
|
172
|
+
function reconcileSampleContent(options) {
|
|
173
|
+
const root = path.join(options.targetRoot, '.omega', 'sample-content');
|
|
174
|
+
const anchorMs = resolveAnchor(options.anchor);
|
|
175
|
+
const written = [];
|
|
176
|
+
const removed = [];
|
|
177
|
+
|
|
178
|
+
for (const set of SAMPLE_SETS) {
|
|
179
|
+
const target = path.join(root, set.collectionDir);
|
|
180
|
+
if (hasOwnContent(options.consumerDir, set.collectionDir)) {
|
|
181
|
+
if (fs.existsSync(target)) {
|
|
182
|
+
fs.rmSync(target, { recursive: true, force: true });
|
|
183
|
+
removed.push(set.collectionDir);
|
|
184
|
+
}
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
fs.rmSync(target, { recursive: true, force: true });
|
|
188
|
+
fs.mkdirSync(target, { recursive: true });
|
|
189
|
+
for (const { name, content } of generateSampleSet(options.defaultsDir, set, anchorMs)) {
|
|
190
|
+
fs.writeFileSync(path.join(target, name), content);
|
|
191
|
+
written.push(path.join(set.collectionDir, name));
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (written.length) {
|
|
196
|
+
fs.writeFileSync(path.join(root, '.gitignore'), '*\n');
|
|
197
|
+
} else if (fs.existsSync(root)) {
|
|
198
|
+
fs.rmSync(root, { recursive: true, force: true });
|
|
199
|
+
}
|
|
200
|
+
return { root, written, removed };
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
module.exports = {
|
|
204
|
+
SAMPLE_EPOCH_UTC,
|
|
205
|
+
SAMPLE_SETS,
|
|
206
|
+
resolveAnchor,
|
|
207
|
+
generateSampleSet,
|
|
208
|
+
hasOwnContent,
|
|
209
|
+
reconcileSampleContent,
|
|
210
|
+
};
|