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