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