@omega.js/web 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1162) hide show
  1. package/LICENSE +98 -0
  2. package/README.md +640 -0
  3. package/bin/omega +2 -0
  4. package/bin/omega-web +2 -0
  5. package/bin/omg +2 -0
  6. package/core/_includes/admin/sections/sidebar.json +100 -0
  7. package/core/_includes/admin/sections/topbar.json +11 -0
  8. package/core/_includes/backend/sections/sidebar.json +39 -0
  9. package/core/_includes/backend/sections/topbar.json +16 -0
  10. package/core/_includes/core/body.html +102 -0
  11. package/core/_includes/core/foot.html +536 -0
  12. package/core/_includes/core/head.html +423 -0
  13. package/core/_includes/core/pricing/price-per-unit.html +33 -0
  14. package/core/_includes/core/showcase/entry-body.html +94 -0
  15. package/core/_includes/core/showcase/index-body.html +43 -0
  16. package/core/_includes/core/showcase/nav.html +60 -0
  17. package/core/_includes/frontend/sections/footer.json +74 -0
  18. package/core/_includes/frontend/sections/nav.json +70 -0
  19. package/core/_includes/global/sections/account.json +31 -0
  20. package/core/_includes/modules/engagement/giscus.html +26 -0
  21. package/core/_layouts/blueprint/404.html +10 -0
  22. package/core/_layouts/blueprint/about.html +10 -0
  23. package/core/_layouts/blueprint/account/index.html +11 -0
  24. package/core/_layouts/blueprint/admin/calendar/index.html +590 -0
  25. package/core/_layouts/blueprint/admin/dashboard/index.html +301 -0
  26. package/core/_layouts/blueprint/admin/firebase/index.html +214 -0
  27. package/core/_layouts/blueprint/admin/posts/editor.html +157 -0
  28. package/core/_layouts/blueprint/admin/posts/index.html +126 -0
  29. package/core/_layouts/blueprint/admin/stackblitz/index.html +30 -0
  30. package/core/_layouts/blueprint/admin/studio/index.html +85 -0
  31. package/core/_layouts/blueprint/admin/users/index.html +272 -0
  32. package/core/_layouts/blueprint/admin/users/new.html +82 -0
  33. package/core/_layouts/blueprint/admin/verts/index.html +204 -0
  34. package/core/_layouts/blueprint/alternatives/alternative.html +15 -0
  35. package/core/_layouts/blueprint/alternatives/index.html +10 -0
  36. package/core/_layouts/blueprint/app.html +10 -0
  37. package/core/_layouts/blueprint/auth/reset.html +19 -0
  38. package/core/_layouts/blueprint/auth/signin.html +19 -0
  39. package/core/_layouts/blueprint/auth/signup.html +19 -0
  40. package/core/_layouts/blueprint/auth/token.html +19 -0
  41. package/core/_layouts/blueprint/blog/categories/category.html +8 -0
  42. package/core/_layouts/blueprint/blog/categories/index.html +11 -0
  43. package/core/_layouts/blueprint/blog/index.html +10 -0
  44. package/core/_layouts/blueprint/blog/post.html +5 -0
  45. package/core/_layouts/blueprint/blog/tags/index.html +11 -0
  46. package/core/_layouts/blueprint/blog/tags/tag.html +8 -0
  47. package/core/_layouts/blueprint/careers.md +13 -0
  48. package/core/_layouts/blueprint/collection/category.html +9 -0
  49. package/core/_layouts/blueprint/collection/document.html +9 -0
  50. package/core/_layouts/blueprint/collection/index.html +9 -0
  51. package/core/_layouts/blueprint/connections/callback.html +11 -0
  52. package/core/_layouts/blueprint/contact.html +14 -0
  53. package/core/_layouts/blueprint/dashboard/index.html +10 -0
  54. package/core/_layouts/blueprint/download.html +20 -0
  55. package/core/_layouts/blueprint/extension/index.html +14 -0
  56. package/core/_layouts/blueprint/extension/installed.html +11 -0
  57. package/core/_layouts/blueprint/feedback.html +10 -0
  58. package/core/_layouts/blueprint/index.html +16 -0
  59. package/core/_layouts/blueprint/legal/cookies.md +57 -0
  60. package/core/_layouts/blueprint/legal/privacy.md +109 -0
  61. package/core/_layouts/blueprint/legal/terms.md +155 -0
  62. package/core/_layouts/blueprint/payment/checkout.html +15 -0
  63. package/core/_layouts/blueprint/payment/confirmation.html +14 -0
  64. package/core/_layouts/blueprint/portal/email-preferences.html +15 -0
  65. package/core/_layouts/blueprint/pricing.html +20 -0
  66. package/core/_layouts/blueprint/status.html +10 -0
  67. package/core/_layouts/blueprint/team/index.html +10 -0
  68. package/core/_layouts/blueprint/team/member.html +5 -0
  69. package/core/_layouts/blueprint/updates/index.html +10 -0
  70. package/core/_layouts/blueprint/updates/update.html +10 -0
  71. package/core/_layouts/core/root.html +45 -0
  72. package/core/_layouts/modules/utilities/redirect.html +129 -0
  73. package/core/css/_studio.scss +237 -0
  74. package/core/css/components/_index.scss +146 -0
  75. package/core/css/core/_.scss +0 -0
  76. package/core/css/core/_alert.scss +87 -0
  77. package/core/css/core/_animations.scss +343 -0
  78. package/core/css/core/_bindings.scss +116 -0
  79. package/core/css/core/_blog-search.scss +57 -0
  80. package/core/css/core/_chatsy.scss +61 -0
  81. package/core/css/core/_consent.scss +424 -0
  82. package/core/css/core/_custom-font-awesome.scss +146 -0
  83. package/core/css/core/_exit-popup.scss +42 -0
  84. package/core/css/core/_generated-badge.scss +33 -0
  85. package/core/css/core/_initialize.scss +29 -0
  86. package/core/css/core/_lazy-loading.scss +104 -0
  87. package/core/css/core/_social-sharing.scss +41 -0
  88. package/core/css/core/_tones.scss +32 -0
  89. package/core/css/core/_utilities.scss +157 -0
  90. package/core/css/main.scss +54 -0
  91. package/core/css/motion/_index.scss +368 -0
  92. package/core/css/pages/404/index.scss +0 -0
  93. package/core/css/pages/admin/calendar/index.scss +692 -0
  94. package/core/css/pages/admin/firebase/index.scss +33 -0
  95. package/core/css/pages/admin/index.scss +9 -0
  96. package/core/css/pages/admin/users/index.scss +9 -0
  97. package/core/css/pages/admin/verts/index.scss +9 -0
  98. package/core/css/pages/alternatives/[alternative]/index.scss +0 -0
  99. package/core/css/pages/blog/[slug].scss +55 -0
  100. package/core/css/pages/dashboard/account/index.scss +242 -0
  101. package/core/css/pages/download/index.scss +480 -0
  102. package/core/css/pages/extension/installed/index.scss +317 -0
  103. package/core/css/pages/feedback/index.scss +31 -0
  104. package/core/css/pages/payment/confirmation/index.scss +14 -0
  105. package/core/css/pages/pricing/index.scss +0 -0
  106. package/core/css/pages/status/index.scss +162 -0
  107. package/core/css/pages/test/libraries/layers/index.scss +28 -0
  108. package/core/css/pages/updates/[update].scss +46 -0
  109. package/core/css/pages/updates/index.scss +13 -0
  110. package/core/css/shell/_index.scss +207 -0
  111. package/core/css/tokens/_index.scss +166 -0
  112. package/core/icons/flags/ar.svg +1 -0
  113. package/core/icons/flags/bd.svg +1 -0
  114. package/core/icons/flags/ca.svg +1 -0
  115. package/core/icons/flags/ch.svg +1 -0
  116. package/core/icons/flags/cn.svg +1 -0
  117. package/core/icons/flags/co.svg +1 -0
  118. package/core/icons/flags/cw.svg +1 -0
  119. package/core/icons/flags/cz.svg +1 -0
  120. package/core/icons/flags/de.svg +1 -0
  121. package/core/icons/flags/dk.svg +1 -0
  122. package/core/icons/flags/eg.svg +1 -0
  123. package/core/icons/flags/es.svg +1 -0
  124. package/core/icons/flags/fi.svg +1 -0
  125. package/core/icons/flags/fr.svg +1 -0
  126. package/core/icons/flags/gb.svg +1 -0
  127. package/core/icons/flags/gq.svg +1 -0
  128. package/core/icons/flags/gr.svg +1 -0
  129. package/core/icons/flags/gt.svg +1 -0
  130. package/core/icons/flags/hn.svg +1 -0
  131. package/core/icons/flags/id.svg +1 -0
  132. package/core/icons/flags/ie.svg +1 -0
  133. package/core/icons/flags/in.svg +1 -0
  134. package/core/icons/flags/ir.svg +1 -0
  135. package/core/icons/flags/it.svg +1 -0
  136. package/core/icons/flags/jp.svg +1 -0
  137. package/core/icons/flags/kp.svg +1 -0
  138. package/core/icons/flags/kr.svg +1 -0
  139. package/core/icons/flags/ly.svg +1 -0
  140. package/core/icons/flags/ma.svg +1 -0
  141. package/core/icons/flags/mu.svg +1 -0
  142. package/core/icons/flags/mx.svg +1 -0
  143. package/core/icons/flags/ng.svg +1 -0
  144. package/core/icons/flags/pa.svg +1 -0
  145. package/core/icons/flags/ph.svg +1 -0
  146. package/core/icons/flags/pk.svg +1 -0
  147. package/core/icons/flags/pt.svg +1 -0
  148. package/core/icons/flags/ru.svg +1 -0
  149. package/core/icons/flags/sa.svg +1 -0
  150. package/core/icons/flags/sd.svg +1 -0
  151. package/core/icons/flags/se.svg +1 -0
  152. package/core/icons/flags/th.svg +1 -0
  153. package/core/icons/flags/tm.svg +1 -0
  154. package/core/icons/flags/tr.svg +1 -0
  155. package/core/icons/flags/us.svg +1 -0
  156. package/core/icons/flags/uy.svg +1 -0
  157. package/core/icons/flags/vn.svg +1 -0
  158. package/core/icons/flags/za.svg +1 -0
  159. package/core/images/exit-popup/subscriber-1.jpg +0 -0
  160. package/core/images/exit-popup/subscriber-2.jpg +0 -0
  161. package/core/images/exit-popup/subscriber-3.jpg +0 -0
  162. package/core/images/exit-popup/subscriber-4.jpg +0 -0
  163. package/core/images/placeholder/photo-1.jpg +0 -0
  164. package/core/images/placeholder/photo-2.jpg +0 -0
  165. package/core/images/placeholder/photo-3.jpg +0 -0
  166. package/core/js/core/analytics-loader.js +253 -0
  167. package/core/js/core/app-shell.js +136 -0
  168. package/core/js/core/appearance.js +195 -0
  169. package/core/js/core/auth.js +457 -0
  170. package/core/js/core/complete.js +72 -0
  171. package/core/js/core/consent.js +384 -0
  172. package/core/js/core/dev-icon-audit.js +63 -0
  173. package/core/js/core/dev-palette.js +670 -0
  174. package/core/js/core/dev-sections.js +53 -0
  175. package/core/js/core/exit-popup.js +276 -0
  176. package/core/js/core/initialize.js +8 -0
  177. package/core/js/core/language-switcher.js +167 -0
  178. package/core/js/core/lazy-loading.js +479 -0
  179. package/core/js/core/motion.js +28 -0
  180. package/core/js/core/query-strings.js +146 -0
  181. package/core/js/core/service-worker.js +28 -0
  182. package/core/js/core/social-sharing.js +293 -0
  183. package/core/js/first-paint.js +35 -0
  184. package/core/js/layouts/modules/utilities/redirect.js +122 -0
  185. package/core/js/libs/admin-helpers.js +62 -0
  186. package/core/js/libs/alert-dismiss.js +35 -0
  187. package/core/js/libs/analytics.js +368 -0
  188. package/core/js/libs/auth/email.js +144 -0
  189. package/core/js/libs/auth/errors.js +119 -0
  190. package/core/js/libs/auth/forms.js +206 -0
  191. package/core/js/libs/auth/index.js +181 -0
  192. package/core/js/libs/auth/oauth.js +394 -0
  193. package/core/js/libs/auth/orphan.js +110 -0
  194. package/core/js/libs/auth/password-toggle.js +44 -0
  195. package/core/js/libs/auth/session-params.js +266 -0
  196. package/core/js/libs/auth/tracking.js +41 -0
  197. package/core/js/libs/charts.js +516 -0
  198. package/core/js/libs/consent-region.js +127 -0
  199. package/core/js/libs/dev.js +150 -0
  200. package/core/js/libs/graph.js +201 -0
  201. package/core/js/libs/initialize-tooltips.js +31 -0
  202. package/core/js/libs/logger.js +38 -0
  203. package/core/js/libs/omega-copy.js +89 -0
  204. package/core/js/libs/path-prefix.js +44 -0
  205. package/core/js/libs/payment-config.js +76 -0
  206. package/core/js/libs/recaptcha.js +94 -0
  207. package/core/js/libs/sale-name.js +295 -0
  208. package/core/js/libs/showcase-frames.js +37 -0
  209. package/core/js/libs/srcset.js +69 -0
  210. package/core/js/libs/tracking-consent.js +161 -0
  211. package/core/js/main.js +144 -0
  212. package/core/js/pages/404/index.js +57 -0
  213. package/core/js/pages/admin/calendar/calendar-core.js +701 -0
  214. package/core/js/pages/admin/calendar/calendar-events.js +853 -0
  215. package/core/js/pages/admin/calendar/calendar-renderer.js +807 -0
  216. package/core/js/pages/admin/calendar/campaign-preview.js +105 -0
  217. package/core/js/pages/admin/calendar/index.js +40 -0
  218. package/core/js/pages/admin/firebase/index.js +727 -0
  219. package/core/js/pages/admin/index.js +531 -0
  220. package/core/js/pages/admin/posts/editor/index.js +230 -0
  221. package/core/js/pages/admin/posts/index.js +237 -0
  222. package/core/js/pages/admin/studio/index.js +538 -0
  223. package/core/js/pages/admin/users/index.js +669 -0
  224. package/core/js/pages/admin/users/new/index.js +65 -0
  225. package/core/js/pages/admin/verts/index.js +407 -0
  226. package/core/js/pages/alternatives/[alternative]/index.js +17 -0
  227. package/core/js/pages/app/index.js +135 -0
  228. package/core/js/pages/blog/[slug].js +132 -0
  229. package/core/js/pages/blog/_search.mjs +108 -0
  230. package/core/js/pages/blog/index.js +193 -0
  231. package/core/js/pages/blog/page/[num]/index.js +7 -0
  232. package/core/js/pages/connections/callback/index.js +148 -0
  233. package/core/js/pages/contact/index.js +170 -0
  234. package/core/js/pages/cookies.js +2 -0
  235. package/core/js/pages/dashboard/account/index.js +366 -0
  236. package/core/js/pages/dashboard/account/modules/orders.js +82 -0
  237. package/core/js/pages/dashboard/account/sections/api-keys.js +149 -0
  238. package/core/js/pages/dashboard/account/sections/billing.js +1667 -0
  239. package/core/js/pages/dashboard/account/sections/connections.js +333 -0
  240. package/core/js/pages/dashboard/account/sections/data-request.js +225 -0
  241. package/core/js/pages/dashboard/account/sections/delete.js +80 -0
  242. package/core/js/pages/dashboard/account/sections/notifications.js +167 -0
  243. package/core/js/pages/dashboard/account/sections/orders.js +151 -0
  244. package/core/js/pages/dashboard/account/sections/profile.js +200 -0
  245. package/core/js/pages/dashboard/account/sections/referrals.js +217 -0
  246. package/core/js/pages/dashboard/account/sections/refund.js +253 -0
  247. package/core/js/pages/dashboard/account/sections/security.js +726 -0
  248. package/core/js/pages/dashboard/account/sections/team.js +247 -0
  249. package/core/js/pages/download/index.js +418 -0
  250. package/core/js/pages/extension/index.js +164 -0
  251. package/core/js/pages/extension/installed/index.js +135 -0
  252. package/core/js/pages/feedback/index.js +193 -0
  253. package/core/js/pages/legal/_document.js +91 -0
  254. package/core/js/pages/payment/checkout/index.js +420 -0
  255. package/core/js/pages/payment/checkout/modules/api.js +139 -0
  256. package/core/js/pages/payment/checkout/modules/dev-section.js +175 -0
  257. package/core/js/pages/payment/checkout/modules/discount.js +69 -0
  258. package/core/js/pages/payment/checkout/modules/pricing.js +73 -0
  259. package/core/js/pages/payment/checkout/modules/state.js +339 -0
  260. package/core/js/pages/payment/checkout/modules/tracking.js +54 -0
  261. package/core/js/pages/payment/confirmation/index.js +91 -0
  262. package/core/js/pages/payment/confirmation/modules/celebration.js +45 -0
  263. package/core/js/pages/payment/confirmation/modules/state.js +112 -0
  264. package/core/js/pages/payment/confirmation/modules/tracking.js +133 -0
  265. package/core/js/pages/payment/confirmation/modules/verify.js +142 -0
  266. package/core/js/pages/portal/email-preferences/index.js +183 -0
  267. package/core/js/pages/pricing/index.js +425 -0
  268. package/core/js/pages/privacy.js +2 -0
  269. package/core/js/pages/reset/index.js +12 -0
  270. package/core/js/pages/signin/index.js +22 -0
  271. package/core/js/pages/signup/index.js +23 -0
  272. package/core/js/pages/status/index.js +687 -0
  273. package/core/js/pages/terms.js +2 -0
  274. package/core/js/pages/test/components/[category]/[name]/index.js +26 -0
  275. package/core/js/pages/test/libraries/appearance/index.js +220 -0
  276. package/core/js/pages/test/libraries/form-manager/index.js +328 -0
  277. package/core/js/pages/test/libraries/layers/index.js +16 -0
  278. package/core/js/pages/test/libraries/verts/index.js +68 -0
  279. package/core/js/pages/test/sections/[category]/[name]/index.js +28 -0
  280. package/core/js/pages/test/styleguide/index.js +35 -0
  281. package/core/js/pages/token/index.js +203 -0
  282. package/core/logos/brandmarks/original/apple-app-store.svg +1 -0
  283. package/core/logos/brandmarks/original/apple.svg +6 -0
  284. package/core/logos/brandmarks/original/bitbucket.svg +14 -0
  285. package/core/logos/brandmarks/original/bitcoin.svg +1 -0
  286. package/core/logos/brandmarks/original/bluesky.svg +7 -0
  287. package/core/logos/brandmarks/original/bootstrap.svg +43 -0
  288. package/core/logos/brandmarks/original/brave.svg +1 -0
  289. package/core/logos/brandmarks/original/chrome.svg +1 -0
  290. package/core/logos/brandmarks/original/discord.svg +1 -0
  291. package/core/logos/brandmarks/original/dropbox.svg +10 -0
  292. package/core/logos/brandmarks/original/edge.svg +1 -0
  293. package/core/logos/brandmarks/original/facebook-f.svg +1 -0
  294. package/core/logos/brandmarks/original/facebook.svg +8 -0
  295. package/core/logos/brandmarks/original/figma.svg +10 -0
  296. package/core/logos/brandmarks/original/firefox.svg +1 -0
  297. package/core/logos/brandmarks/original/github.svg +6 -0
  298. package/core/logos/brandmarks/original/gitlab.svg +17 -0
  299. package/core/logos/brandmarks/original/google-a-s.svg +1 -0
  300. package/core/logos/brandmarks/original/google-chrome-webstore.svg +49 -0
  301. package/core/logos/brandmarks/original/google-play-store.svg +1 -0
  302. package/core/logos/brandmarks/original/google-web-search.svg +1 -0
  303. package/core/logos/brandmarks/original/google.svg +1 -0
  304. package/core/logos/brandmarks/original/gulp.svg +4 -0
  305. package/core/logos/brandmarks/original/html-5.svg +1 -0
  306. package/core/logos/brandmarks/original/instagram.svg +1 -0
  307. package/core/logos/brandmarks/original/javascript.svg +1 -0
  308. package/core/logos/brandmarks/original/jira.svg +18 -0
  309. package/core/logos/brandmarks/original/kick.svg +7 -0
  310. package/core/logos/brandmarks/original/linkedin.svg +1 -0
  311. package/core/logos/brandmarks/original/linux.svg +28 -0
  312. package/core/logos/brandmarks/original/messenger.svg +16 -0
  313. package/core/logos/brandmarks/original/microsoft.svg +1 -0
  314. package/core/logos/brandmarks/original/npm.svg +8 -0
  315. package/core/logos/brandmarks/original/opera.svg +1 -0
  316. package/core/logos/brandmarks/original/patreon.svg +6 -0
  317. package/core/logos/brandmarks/original/pinterest.svg +6 -0
  318. package/core/logos/brandmarks/original/reddit.svg +1 -0
  319. package/core/logos/brandmarks/original/safari.svg +31 -0
  320. package/core/logos/brandmarks/original/sass.svg +3 -0
  321. package/core/logos/brandmarks/original/signal.svg +6 -0
  322. package/core/logos/brandmarks/original/skype.svg +47 -0
  323. package/core/logos/brandmarks/original/slack.svg +33 -0
  324. package/core/logos/brandmarks/original/soundcloud.svg +1 -0
  325. package/core/logos/brandmarks/original/spotify.svg +5 -0
  326. package/core/logos/brandmarks/original/steam.svg +6 -0
  327. package/core/logos/brandmarks/original/telegram.svg +14 -0
  328. package/core/logos/brandmarks/original/tiktok.svg +1 -0
  329. package/core/logos/brandmarks/original/trello.svg +16 -0
  330. package/core/logos/brandmarks/original/tumblr.svg +1 -0
  331. package/core/logos/brandmarks/original/twitch.svg +6 -0
  332. package/core/logos/brandmarks/original/twitter.svg +6 -0
  333. package/core/logos/brandmarks/original/unity.svg +6 -0
  334. package/core/logos/brandmarks/original/x.svg +7 -0
  335. package/core/logos/brandmarks/original/yahoo-y.svg +1 -0
  336. package/core/logos/brandmarks/original/youtube-square.svg +1 -0
  337. package/core/logos/brandmarks/original/youtube.svg +1 -0
  338. package/core/logos/combomarks/dark/airbnb.svg +30 -0
  339. package/core/logos/combomarks/dark/slack.svg +38 -0
  340. package/core/logos/combomarks/dark/spotify.svg +35 -0
  341. package/core/logos/combomarks/dark/twilio.svg +26 -0
  342. package/core/logos/combomarks/dark/weebly.svg +35 -0
  343. package/core/logos/combomarks/gray/airbnb.svg +33 -0
  344. package/core/logos/combomarks/gray/alphabet.svg +23 -0
  345. package/core/logos/combomarks/gray/amazon.svg +38 -0
  346. package/core/logos/combomarks/gray/boring-company.svg +91 -0
  347. package/core/logos/combomarks/gray/burberry.svg +239 -0
  348. package/core/logos/combomarks/gray/embark.svg +21 -0
  349. package/core/logos/combomarks/gray/fitbit.svg +61 -0
  350. package/core/logos/combomarks/gray/fred-perry.svg +94 -0
  351. package/core/logos/combomarks/gray/google.svg +27 -0
  352. package/core/logos/combomarks/gray/hollister.svg +34 -0
  353. package/core/logos/combomarks/gray/hubspot.svg +27 -0
  354. package/core/logos/combomarks/gray/kaplan.svg +33 -0
  355. package/core/logos/combomarks/gray/lenovo.svg +27 -0
  356. package/core/logos/combomarks/gray/levis.svg +25 -0
  357. package/core/logos/combomarks/gray/mapbox.svg +37 -0
  358. package/core/logos/combomarks/gray/netflix.svg +15 -0
  359. package/core/logos/combomarks/gray/new-balance.svg +32 -0
  360. package/core/logos/combomarks/gray/nike.svg +17 -0
  361. package/core/logos/combomarks/gray/paypal.svg +41 -0
  362. package/core/logos/combomarks/gray/puma.svg +82 -0
  363. package/core/logos/combomarks/gray/samsung.svg +26 -0
  364. package/core/logos/combomarks/gray/shopify.svg +36 -0
  365. package/core/logos/combomarks/gray/slack.svg +42 -0
  366. package/core/logos/combomarks/gray/spotify.svg +38 -0
  367. package/core/logos/combomarks/gray/stripe.svg +24 -0
  368. package/core/logos/combomarks/gray/tnf.svg +30 -0
  369. package/core/logos/combomarks/gray/twilio.svg +29 -0
  370. package/core/logos/combomarks/gray/uber.svg +24 -0
  371. package/core/logos/combomarks/gray/weebly.svg +38 -0
  372. package/core/logos/combomarks/original/airbnb.svg +33 -0
  373. package/core/logos/combomarks/original/alphabet.svg +23 -0
  374. package/core/logos/combomarks/original/amazon.svg +38 -0
  375. package/core/logos/combomarks/original/asana.svg +8 -0
  376. package/core/logos/combomarks/original/boring-company.svg +91 -0
  377. package/core/logos/combomarks/original/discord.svg +6 -0
  378. package/core/logos/combomarks/original/embark.svg +24 -0
  379. package/core/logos/combomarks/original/fitbit.svg +60 -0
  380. package/core/logos/combomarks/original/github.svg +6 -0
  381. package/core/logos/combomarks/original/gitlab.svg +20 -0
  382. package/core/logos/combomarks/original/google.svg +28 -0
  383. package/core/logos/combomarks/original/hubspot.svg +29 -0
  384. package/core/logos/combomarks/original/instagram.svg +7 -0
  385. package/core/logos/combomarks/original/kickstarter.svg +6 -0
  386. package/core/logos/combomarks/original/lenovo.svg +24 -0
  387. package/core/logos/combomarks/original/linkedin.svg +6 -0
  388. package/core/logos/combomarks/original/mapbox.svg +39 -0
  389. package/core/logos/combomarks/original/mastodon.svg +7 -0
  390. package/core/logos/combomarks/original/medium.svg +6 -0
  391. package/core/logos/combomarks/original/meta.svg +22 -0
  392. package/core/logos/combomarks/original/microsoft.svg +13 -0
  393. package/core/logos/combomarks/original/monday.svg +12 -0
  394. package/core/logos/combomarks/original/netflix.svg +15 -0
  395. package/core/logos/combomarks/original/notion.svg +9 -0
  396. package/core/logos/combomarks/original/paypal.svg +41 -0
  397. package/core/logos/combomarks/original/reddit.svg +13 -0
  398. package/core/logos/combomarks/original/samsung.svg +25 -0
  399. package/core/logos/combomarks/original/shopify.svg +35 -0
  400. package/core/logos/combomarks/original/slack.svg +47 -0
  401. package/core/logos/combomarks/original/spotify.svg +37 -0
  402. package/core/logos/combomarks/original/stackoverflow.svg +28 -0
  403. package/core/logos/combomarks/original/stripe.svg +24 -0
  404. package/core/logos/combomarks/original/tiktok.svg +12 -0
  405. package/core/logos/combomarks/original/tumblr.svg +6 -0
  406. package/core/logos/combomarks/original/uber.svg +24 -0
  407. package/core/logos/combomarks/original/weebly.svg +34 -0
  408. package/core/logos/combomarks/original/whatsapp.svg +20 -0
  409. package/core/logos/combomarks/original/youtube.svg +10 -0
  410. package/core/logos/combomarks/original/zoom.svg +7 -0
  411. package/core/logos/combomarks/white/airbnb.svg +33 -0
  412. package/core/logos/combomarks/white/alphabet.svg +23 -0
  413. package/core/logos/combomarks/white/amazon.svg +38 -0
  414. package/core/logos/combomarks/white/boring-company.svg +91 -0
  415. package/core/logos/combomarks/white/embark.svg +21 -0
  416. package/core/logos/combomarks/white/fitbit.svg +61 -0
  417. package/core/logos/combomarks/white/google.svg +27 -0
  418. package/core/logos/combomarks/white/hubspot.svg +27 -0
  419. package/core/logos/combomarks/white/kaplan.svg +33 -0
  420. package/core/logos/combomarks/white/lenovo.svg +27 -0
  421. package/core/logos/combomarks/white/mapbox.svg +37 -0
  422. package/core/logos/combomarks/white/netflix.svg +15 -0
  423. package/core/logos/combomarks/white/paypal.svg +40 -0
  424. package/core/logos/combomarks/white/samsung.svg +26 -0
  425. package/core/logos/combomarks/white/shopify.svg +36 -0
  426. package/core/logos/combomarks/white/slack.svg +42 -0
  427. package/core/logos/combomarks/white/spotify.svg +38 -0
  428. package/core/logos/combomarks/white/stripe.svg +24 -0
  429. package/core/logos/combomarks/white/twilio.svg +29 -0
  430. package/core/logos/combomarks/white/uber.svg +24 -0
  431. package/core/logos/combomarks/white/weebly.svg +38 -0
  432. package/defaults/pages/404.md +4 -0
  433. package/defaults/pages/about.md +4 -0
  434. package/defaults/pages/admin/calendar/index.html +4 -0
  435. package/defaults/pages/admin/firebase/index.html +4 -0
  436. package/defaults/pages/admin/index.md +4 -0
  437. package/defaults/pages/admin/posts/editor.html +4 -0
  438. package/defaults/pages/admin/posts/index.html +4 -0
  439. package/defaults/pages/admin/stackblitz/index.html +4 -0
  440. package/defaults/pages/admin/studio/index.html +4 -0
  441. package/defaults/pages/admin/users/index.html +4 -0
  442. package/defaults/pages/admin/users/new.html +4 -0
  443. package/defaults/pages/admin/verts/index.html +4 -0
  444. package/defaults/pages/ads-txt.html +11 -0
  445. package/defaults/pages/alternatives/index.md +4 -0
  446. package/defaults/pages/app.md +4 -0
  447. package/defaults/pages/auth/reset.md +4 -0
  448. package/defaults/pages/auth/signin.md +4 -0
  449. package/defaults/pages/auth/signup.md +4 -0
  450. package/defaults/pages/auth/token.md +4 -0
  451. package/defaults/pages/blog/categories/category.html +21 -0
  452. package/defaults/pages/blog/categories.md +4 -0
  453. package/defaults/pages/blog/index-json.html +27 -0
  454. package/defaults/pages/blog/tags/tag.html +21 -0
  455. package/defaults/pages/blog/tags.md +4 -0
  456. package/defaults/pages/blog.md +22 -0
  457. package/defaults/pages/careers.md +4 -0
  458. package/defaults/pages/connections/callback.md +4 -0
  459. package/defaults/pages/contact.md +4 -0
  460. package/defaults/pages/dashboard/account.md +4 -0
  461. package/defaults/pages/dashboard/index.md +12 -0
  462. package/defaults/pages/download.md +4 -0
  463. package/defaults/pages/extension/index.html +4 -0
  464. package/defaults/pages/extension/installed.html +4 -0
  465. package/defaults/pages/feedback.md +4 -0
  466. package/defaults/pages/feeds/posts-json.html +40 -0
  467. package/defaults/pages/feeds/posts-xml.html +38 -0
  468. package/defaults/pages/humans.html +25 -0
  469. package/defaults/pages/index.md +4 -0
  470. package/defaults/pages/legal/cookies.md +4 -0
  471. package/defaults/pages/legal/privacy.md +4 -0
  472. package/defaults/pages/legal/terms.md +4 -0
  473. package/defaults/pages/llms-txt.html +46 -0
  474. package/defaults/pages/opensearch.html +16 -0
  475. package/defaults/pages/pages-json.html +42 -0
  476. package/defaults/pages/payment/checkout.md +4 -0
  477. package/defaults/pages/payment/confirmation.md +4 -0
  478. package/defaults/pages/portal/email-preferences.md +4 -0
  479. package/defaults/pages/pricing.md +4 -0
  480. package/defaults/pages/redirects/account.md +12 -0
  481. package/defaults/pages/redirects/admin/dashboard.md +11 -0
  482. package/defaults/pages/redirects/auth/change-password.md +9 -0
  483. package/defaults/pages/redirects/auth/forgot.md +9 -0
  484. package/defaults/pages/redirects/auth/join.md +9 -0
  485. package/defaults/pages/redirects/auth/login.md +9 -0
  486. package/defaults/pages/redirects/auth/recover.md +9 -0
  487. package/defaults/pages/redirects/auth/register.md +9 -0
  488. package/defaults/pages/redirects/auth/reset-password.md +9 -0
  489. package/defaults/pages/redirects/billing/cancel.md +9 -0
  490. package/defaults/pages/redirects/billing/refund.md +9 -0
  491. package/defaults/pages/robots.html +36 -0
  492. package/defaults/pages/security-txt.html +11 -0
  493. package/defaults/pages/sitemap.html +37 -0
  494. package/defaults/pages/status.md +4 -0
  495. package/defaults/pages/team/index.md +4 -0
  496. package/defaults/pages/test/account/dashboard.html +16 -0
  497. package/defaults/pages/test/index.md +12 -0
  498. package/defaults/pages/test/libraries/appearance.html +268 -0
  499. package/defaults/pages/test/libraries/cover.html +50 -0
  500. package/defaults/pages/test/libraries/error.html +30 -0
  501. package/defaults/pages/test/libraries/firestore.html +202 -0
  502. package/defaults/pages/test/libraries/form-manager.html +374 -0
  503. package/defaults/pages/test/libraries/layers.html +52 -0
  504. package/defaults/pages/test/libraries/lazy-loading.html +450 -0
  505. package/defaults/pages/test/libraries/verts.html +149 -0
  506. package/defaults/pages/test/redirect/external.md +13 -0
  507. package/defaults/pages/test/redirect/internal.md +13 -0
  508. package/defaults/pages/test/styleguide/index.html +588 -0
  509. package/defaults/pages/test/translation/index.md +50 -0
  510. package/defaults/pages/updates/index.md +4 -0
  511. package/defaults/sample-posts/2026-01-12-welcome-to-the-blog.md +26 -0
  512. package/defaults/sample-posts/2026-02-03-a-field-guide-to-good-defaults.md +50 -0
  513. package/defaults/sample-posts/2026-02-24-shipping-week-notes.md +37 -0
  514. package/defaults/sample-posts/2026-03-17-the-case-for-one-config.md +36 -0
  515. package/defaults/sample-posts/2026-04-09-write-release-notes-people-read.md +34 -0
  516. package/defaults/sample-posts/2026-05-21-dark-mode-done-properly.md +38 -0
  517. package/defaults/sample-posts/2026-06-02-the-boring-deploy-is-the-good-deploy.md +30 -0
  518. package/defaults/sample-posts/2026-06-11-naming-things-a-survival-guide.md +30 -0
  519. package/defaults/sample-posts/2026-06-19-your-pricing-page-is-a-product.md +28 -0
  520. package/defaults/sample-posts/2026-06-30-email-is-an-api-with-feelings.md +28 -0
  521. package/defaults/sample-posts/2026-07-08-ship-the-docs-with-the-diff.md +30 -0
  522. package/defaults/sample-team/avery-quinn.md +22 -0
  523. package/defaults/sample-team/jordan-reyes.md +25 -0
  524. package/defaults/sample-team/riley-nakamura.md +22 -0
  525. package/defaults/sample-team/sam-okafor.md +22 -0
  526. package/defaults/sample-updates/v1.0.0.md +28 -0
  527. package/defaults/sample-updates/v1.1.0.md +27 -0
  528. package/defaults/sample-updates/v1.2.0.md +27 -0
  529. package/defaults/sample-updates/v1.3.0.md +28 -0
  530. package/defaults/showcase/components.html +62 -0
  531. package/defaults/showcase/entry.html +76 -0
  532. package/defaults/showcase/frame.html +62 -0
  533. package/defaults/showcase/index.html +59 -0
  534. package/dist/assets.js +1349 -0
  535. package/dist/brand-tokens.js +195 -0
  536. package/dist/build.js +192 -0
  537. package/dist/cachebreak-html.js +71 -0
  538. package/dist/cli-run.js +25 -0
  539. package/dist/cli.js +47 -0
  540. package/dist/collections.js +183 -0
  541. package/dist/commands/audit.js +470 -0
  542. package/dist/commands/build.js +197 -0
  543. package/dist/commands/clean.js +18 -0
  544. package/dist/commands/customize.js +125 -0
  545. package/dist/commands/deploy.js +441 -0
  546. package/dist/commands/dev.js +1067 -0
  547. package/dist/commands/install.js +31 -0
  548. package/dist/commands/lib/deploy-precheck.js +43 -0
  549. package/dist/commands/lib/ensure-target.js +115 -0
  550. package/dist/commands/migrate.js +86 -0
  551. package/dist/commands/purge.js +31 -0
  552. package/dist/commands/test.js +237 -0
  553. package/dist/commands/translate.js +57 -0
  554. package/dist/commands/update.js +22 -0
  555. package/dist/commands/version.js +11 -0
  556. package/dist/config-sections.js +245 -0
  557. package/dist/consumer-scan.js +118 -0
  558. package/dist/consumer.js +49 -0
  559. package/dist/customize.js +328 -0
  560. package/dist/decisions.js +153 -0
  561. package/dist/dist-audit.js +417 -0
  562. package/dist/dynamic-pages.js +357 -0
  563. package/dist/engine.js +1402 -0
  564. package/dist/firebase-auth-helpers.js +198 -0
  565. package/dist/font-metrics.js +420 -0
  566. package/dist/frontmatter-liquid.js +253 -0
  567. package/dist/github-secrets.js +80 -0
  568. package/dist/hero-animations.js +170 -0
  569. package/dist/imagemin.js +261 -0
  570. package/dist/index.js +41 -0
  571. package/dist/inline-icons.js +65 -0
  572. package/dist/language-flags.js +55 -0
  573. package/dist/layers.js +80 -0
  574. package/dist/layouts.js +44 -0
  575. package/dist/limit-collections.js +199 -0
  576. package/dist/link-resolver.js +303 -0
  577. package/dist/markdown-images.js +85 -0
  578. package/dist/merge.js +20 -0
  579. package/dist/migrate/codemod.js +172 -0
  580. package/dist/migrate/config-convert.js +448 -0
  581. package/dist/migrate/consumer-assets.js +130 -0
  582. package/dist/migrate/index.js +223 -0
  583. package/dist/migrate/lint.js +108 -0
  584. package/dist/migrate/rules.js +1929 -0
  585. package/dist/minify-html.js +148 -0
  586. package/dist/mode-helpers.js +96 -0
  587. package/dist/omega-bin.js +7 -0
  588. package/dist/overrides.js +190 -0
  589. package/dist/path-prefix.js +167 -0
  590. package/dist/paths.js +37 -0
  591. package/dist/pricing.js +301 -0
  592. package/dist/purge.js +95 -0
  593. package/dist/redirect-page.js +45 -0
  594. package/dist/sample-content.js +210 -0
  595. package/dist/scaffold.js +123 -0
  596. package/dist/sections.js +810 -0
  597. package/dist/service-worker.js +200 -0
  598. package/dist/social-pages.js +142 -0
  599. package/dist/srcset.js +67 -0
  600. package/dist/static-assets.js +154 -0
  601. package/dist/target-shortlinks.js +123 -0
  602. package/dist/theme-vocabulary.js +76 -0
  603. package/dist/translate/collect-text-nodes.js +93 -0
  604. package/dist/translate/default-routes.js +152 -0
  605. package/dist/translate/generate-defaults.js +297 -0
  606. package/dist/translate/index.js +568 -0
  607. package/dist/translate/packaged-defaults.js +127 -0
  608. package/dist/translate/sitemap.js +108 -0
  609. package/dist/vendor/account/engine.js +182 -0
  610. package/dist/vendor/account/features.js +220 -0
  611. package/dist/vendor/account/index.js +53 -0
  612. package/dist/vendor/account/schema.js +272 -0
  613. package/dist/vendor/account/subscription.js +38 -0
  614. package/dist/vendor/config/company.js +31 -0
  615. package/dist/vendor/config/defaults.js +173 -0
  616. package/dist/vendor/config/demo.js +18 -0
  617. package/dist/vendor/config/desktop-artifacts.js +110 -0
  618. package/dist/vendor/config/edit.js +769 -0
  619. package/dist/vendor/config/env-delivery.js +145 -0
  620. package/dist/vendor/config/env-rules.js +93 -0
  621. package/dist/vendor/config/env-schema.js +1078 -0
  622. package/dist/vendor/config/env.js +445 -0
  623. package/dist/vendor/config/hooks.js +97 -0
  624. package/dist/vendor/config/index.js +237 -0
  625. package/dist/vendor/config/instances.js +208 -0
  626. package/dist/vendor/config/load.js +490 -0
  627. package/dist/vendor/config/merge.js +68 -0
  628. package/dist/vendor/config/order.js +139 -0
  629. package/dist/vendor/config/ports.js +374 -0
  630. package/dist/vendor/config/providers.js +32 -0
  631. package/dist/vendor/config/repo.js +142 -0
  632. package/dist/vendor/config/retired-keys.js +430 -0
  633. package/dist/vendor/config/schema.js +1610 -0
  634. package/dist/vendor/config/secrets.js +50 -0
  635. package/dist/vendor/config/seed.js +34 -0
  636. package/dist/vendor/config/site-global.js +205 -0
  637. package/dist/vendor/config/validate.js +554 -0
  638. package/dist/vendor/config/winback.js +61 -0
  639. package/dist/vendor/devkit/actions-secrets.js +145 -0
  640. package/dist/vendor/devkit/attach-log-file.js +262 -0
  641. package/dist/vendor/devkit/bare-requires.js +153 -0
  642. package/dist/vendor/devkit/bundle.js +292 -0
  643. package/dist/vendor/devkit/ci-workflows.js +520 -0
  644. package/dist/vendor/devkit/cli-router.js +156 -0
  645. package/dist/vendor/devkit/command-path.js +46 -0
  646. package/dist/vendor/devkit/defaults-engine.js +372 -0
  647. package/dist/vendor/devkit/deploy-precheck.js +54 -0
  648. package/dist/vendor/devkit/deploy-record.js +180 -0
  649. package/dist/vendor/devkit/deploy.js +286 -0
  650. package/dist/vendor/devkit/env-watch.js +132 -0
  651. package/dist/vendor/devkit/framework-deps.js +46 -0
  652. package/dist/vendor/devkit/icons.js +178 -0
  653. package/dist/vendor/devkit/license.js +155 -0
  654. package/dist/vendor/devkit/local-https.js +360 -0
  655. package/dist/vendor/devkit/local.js +1905 -0
  656. package/dist/vendor/devkit/logger.js +128 -0
  657. package/dist/vendor/devkit/merge-line-files.js +296 -0
  658. package/dist/vendor/devkit/omega-bin.js +345 -0
  659. package/dist/vendor/devkit/reads.js +274 -0
  660. package/dist/vendor/devkit/safe-install.js +18 -0
  661. package/dist/vendor/devkit/scaffold-guard.js +96 -0
  662. package/dist/vendor/devkit/stop-signals.js +28 -0
  663. package/dist/vendor/devkit/strip-dev-blocks-plugin.js +29 -0
  664. package/dist/vendor/devkit/strip-dev-blocks.js +32 -0
  665. package/dist/vendor/devkit/target-secrets.js +165 -0
  666. package/dist/vendor/devkit/test/scope.js +162 -0
  667. package/dist/vendor/devkit/translate/cache.js +84 -0
  668. package/dist/vendor/devkit/translate/engine.js +243 -0
  669. package/dist/vendor/devkit/translate/index.js +49 -0
  670. package/dist/vendor/devkit/translate/languages.js +134 -0
  671. package/dist/vendor/devkit/translate/providers.js +188 -0
  672. package/dist/vendor/devkit/update.js +569 -0
  673. package/dist/vendor/template-kit/data/language-flags.js +54 -0
  674. package/dist/vendor/template-kit/data/languages.js +195 -0
  675. package/dist/vendor/template-kit/data/social-urls.js +26 -0
  676. package/dist/vendor/template-kit/filters.js +227 -0
  677. package/dist/vendor/template-kit/index.js +28 -0
  678. package/dist/vendor/template-kit/jekyll-compat.js +268 -0
  679. package/dist/vendor/template-kit/register-liquid.js +0 -0
  680. package/dist/vendor/template-kit/tags/collections.js +191 -0
  681. package/dist/vendor/template-kit/tags/conditionals.js +101 -0
  682. package/dist/vendor/template-kit/tags/content.js +175 -0
  683. package/dist/vendor/template-kit/tags/index.js +33 -0
  684. package/dist/vendor/template-kit/tags/media.js +376 -0
  685. package/dist/vendor/template-kit/variable-resolver.js +163 -0
  686. package/docs/ads-system.md +109 -0
  687. package/docs/classy-v2/DIRECTION.md +92 -0
  688. package/docs/classy-v2/draft-1.html +1932 -0
  689. package/docs/classy-v2/draft-2.html +1956 -0
  690. package/docs/frontmatter.md +153 -0
  691. package/docs/index.md +254 -0
  692. package/docs/libs.md +298 -0
  693. package/docs/omega-sections-spec.md +159 -0
  694. package/docs/page-contract.md +112 -0
  695. package/docs/sections.md +845 -0
  696. package/docs/shared/agent-docs.md +89 -0
  697. package/docs/shared/analytics.md +612 -0
  698. package/docs/shared/brands.md +51 -0
  699. package/docs/shared/breaking-changes.md +497 -0
  700. package/docs/shared/config.md +1387 -0
  701. package/docs/shared/deploys.md +215 -0
  702. package/docs/shared/icons.md +201 -0
  703. package/docs/shared/local-dev.md +147 -0
  704. package/docs/shared/logging.md +202 -0
  705. package/docs/shared/monitoring.md +153 -0
  706. package/docs/shared/publishing.md +183 -0
  707. package/docs/shared/rulings.md +34 -0
  708. package/docs/shared/testing.md +147 -0
  709. package/docs/shared/theming.md +604 -0
  710. package/docs/shared/translation.md +291 -0
  711. package/docs/shared/updates.md +61 -0
  712. package/docs/template-kit.md +128 -0
  713. package/docs/test-framework.md +163 -0
  714. package/package.json +122 -0
  715. package/runtime/boot.js +149 -0
  716. package/runtime/icons.js +77 -0
  717. package/runtime/manager.js +36 -0
  718. package/scaffold/.github/workflows/build.yml +139 -0
  719. package/scaffold/.nvmrc +1 -0
  720. package/scaffold/AGENTS.md +55 -0
  721. package/scaffold/CLAUDE.md +1 -0
  722. package/scaffold/_.gitattributes +4 -0
  723. package/scaffold/_.gitignore +27 -0
  724. package/scaffold/config/omega.json5 +20 -0
  725. package/scaffold/src/assets/css/pages/.gitkeep +0 -0
  726. package/scaffold/src/assets/images/.gitkeep +0 -0
  727. package/scaffold/src/assets/js/pages/.gitkeep +0 -0
  728. package/scaffold/src/pages/.gitkeep +0 -0
  729. package/scaffold/src/pages/example.md.txt +94 -0
  730. package/scaffold/src/service-worker.js +16 -0
  731. package/sw/entry.js +19 -0
  732. package/sw/manager.js +281 -0
  733. package/themes/_template/README.md +115 -0
  734. package/themes/_template/_config.scss +60 -0
  735. package/themes/_template/_theme.js +14 -0
  736. package/themes/_template/_theme.scss +28 -0
  737. package/themes/_template/css/base/_root.scss +19 -0
  738. package/themes/_template/css/components/_components.scss +23 -0
  739. package/themes/base/README.md +5 -0
  740. package/themes/base/_components/data/org-chart/component.html +33 -0
  741. package/themes/base/_components/data/org-chart/component.json5 +33 -0
  742. package/themes/base/_components/data/org-chart/component.scss +183 -0
  743. package/themes/base/_components/heading/masthead/component.html +22 -0
  744. package/themes/base/_components/heading/masthead/component.json5 +30 -0
  745. package/themes/base/_components/heading/section-head/component.html +18 -0
  746. package/themes/base/_components/heading/section-head/component.json5 +27 -0
  747. package/themes/base/_components/pricing/features/component.html +29 -0
  748. package/themes/base/_components/pricing/features/component.json5 +30 -0
  749. package/themes/base/_hero/orbit/index.html +30 -0
  750. package/themes/base/_hero/orbit/script.js +33 -0
  751. package/themes/base/_hero/orbit/style.scss +133 -0
  752. package/themes/base/_includes/admin/sections/sidebar.html +3 -0
  753. package/themes/base/_includes/admin/sections/topbar.html +3 -0
  754. package/themes/base/_includes/backend/sections/sidebar.html +3 -0
  755. package/themes/base/_includes/backend/sections/topbar.html +3 -0
  756. package/themes/base/_includes/frontend/components/connection-card.html +49 -0
  757. package/themes/base/_includes/frontend/components/post-card.html +54 -0
  758. package/themes/base/_includes/frontend/sections/account-connections.html +42 -0
  759. package/themes/base/_includes/frontend/sections/account-section-header.html +11 -0
  760. package/themes/base/_includes/frontend/sections/footer.html +154 -0
  761. package/themes/base/_includes/frontend/sections/nav.html +276 -0
  762. package/themes/base/_includes/global/sections/account.html +72 -0
  763. package/themes/base/_includes/global/sections/app-sidebar.html +248 -0
  764. package/themes/base/_includes/global/sections/app-topbar.html +228 -0
  765. package/themes/base/_includes/global/sections/page-header.html +99 -0
  766. package/themes/base/_layouts/admin/core/minimal-viewport-locked.html +22 -0
  767. package/themes/base/_layouts/admin/core/minimal.html +23 -0
  768. package/themes/base/_layouts/backend/core/base.html +57 -0
  769. package/themes/base/_layouts/backend/core/minimal-viewport-locked.html +32 -0
  770. package/themes/base/_layouts/backend/core/minimal.html +32 -0
  771. package/themes/base/_layouts/backend/pages/dashboard/index.html +230 -0
  772. package/themes/base/_layouts/frontend/core/base.html +31 -0
  773. package/themes/base/_layouts/frontend/core/cover.html +40 -0
  774. package/themes/base/_layouts/frontend/core/minimal.html +47 -0
  775. package/themes/base/_layouts/frontend/pages/404.html +54 -0
  776. package/themes/base/_layouts/frontend/pages/about.html +144 -0
  777. package/themes/base/_layouts/frontend/pages/account/index.html +2104 -0
  778. package/themes/base/_layouts/frontend/pages/alternatives/alternative.html +319 -0
  779. package/themes/base/_layouts/frontend/pages/alternatives/index.html +186 -0
  780. package/themes/base/_layouts/frontend/pages/app.html +142 -0
  781. package/themes/base/_layouts/frontend/pages/auth/reset.html +53 -0
  782. package/themes/base/_layouts/frontend/pages/auth/signin.html +90 -0
  783. package/themes/base/_layouts/frontend/pages/auth/signup.html +141 -0
  784. package/themes/base/_layouts/frontend/pages/auth/token.html +44 -0
  785. package/themes/base/_layouts/frontend/pages/blog/categories/category.html +88 -0
  786. package/themes/base/_layouts/frontend/pages/blog/categories/index.html +88 -0
  787. package/themes/base/_layouts/frontend/pages/blog/index.html +255 -0
  788. package/themes/base/_layouts/frontend/pages/blog/post.html +261 -0
  789. package/themes/base/_layouts/frontend/pages/blog/tags/index.html +84 -0
  790. package/themes/base/_layouts/frontend/pages/blog/tags/tag.html +88 -0
  791. package/themes/base/_layouts/frontend/pages/collection/category.html +72 -0
  792. package/themes/base/_layouts/frontend/pages/collection/document.html +54 -0
  793. package/themes/base/_layouts/frontend/pages/collection/index.html +84 -0
  794. package/themes/base/_layouts/frontend/pages/connections/callback.html +55 -0
  795. package/themes/base/_layouts/frontend/pages/contact.html +214 -0
  796. package/themes/base/_layouts/frontend/pages/download.html +793 -0
  797. package/themes/base/_layouts/frontend/pages/extension/index.html +253 -0
  798. package/themes/base/_layouts/frontend/pages/extension/installed.html +198 -0
  799. package/themes/base/_layouts/frontend/pages/feedback.html +171 -0
  800. package/themes/base/_layouts/frontend/pages/index.html +66 -0
  801. package/themes/base/_layouts/frontend/pages/legal/document.html +78 -0
  802. package/themes/base/_layouts/frontend/pages/payment/checkout.html +459 -0
  803. package/themes/base/_layouts/frontend/pages/payment/confirmation.html +131 -0
  804. package/themes/base/_layouts/frontend/pages/portal/email-preferences.html +104 -0
  805. package/themes/base/_layouts/frontend/pages/pricing.html +596 -0
  806. package/themes/base/_layouts/frontend/pages/status.html +361 -0
  807. package/themes/base/_layouts/frontend/pages/team/index.html +210 -0
  808. package/themes/base/_layouts/frontend/pages/team/member.html +125 -0
  809. package/themes/base/_layouts/frontend/pages/updates/index.html +119 -0
  810. package/themes/base/_layouts/frontend/pages/updates/update.html +118 -0
  811. package/themes/base/_sections/about/hero/section.html +68 -0
  812. package/themes/base/_sections/about/hero/section.json5 +58 -0
  813. package/themes/base/_sections/about/letter/section.html +60 -0
  814. package/themes/base/_sections/about/letter/section.json5 +56 -0
  815. package/themes/base/_sections/about/photo-band/section.html +24 -0
  816. package/themes/base/_sections/about/photo-band/section.json5 +23 -0
  817. package/themes/base/_sections/about/principles/section.html +17 -0
  818. package/themes/base/_sections/about/principles/section.json5 +34 -0
  819. package/themes/base/_sections/about/timeline/section.html +20 -0
  820. package/themes/base/_sections/about/timeline/section.json5 +34 -0
  821. package/themes/base/_sections/marketing/bento/section.html +91 -0
  822. package/themes/base/_sections/marketing/bento/section.json5 +152 -0
  823. package/themes/base/_sections/marketing/cta/section.html +44 -0
  824. package/themes/base/_sections/marketing/cta/section.json5 +47 -0
  825. package/themes/base/_sections/marketing/faq/section.html +52 -0
  826. package/themes/base/_sections/marketing/faq/section.json5 +68 -0
  827. package/themes/base/_sections/marketing/hero/section.html +349 -0
  828. package/themes/base/_sections/marketing/hero/section.json5 +335 -0
  829. package/themes/base/_sections/marketing/newsletter-cta/section.html +38 -0
  830. package/themes/base/_sections/marketing/newsletter-cta/section.js +86 -0
  831. package/themes/base/_sections/marketing/newsletter-cta/section.json5 +29 -0
  832. package/themes/base/_sections/marketing/pricing-cards/section.html +115 -0
  833. package/themes/base/_sections/marketing/pricing-cards/section.json5 +72 -0
  834. package/themes/base/_sections/marketing/product-demo/section.html +62 -0
  835. package/themes/base/_sections/marketing/product-demo/section.js +44 -0
  836. package/themes/base/_sections/marketing/product-demo/section.json5 +52 -0
  837. package/themes/base/_sections/marketing/prose/section.html +22 -0
  838. package/themes/base/_sections/marketing/prose/section.json5 +41 -0
  839. package/themes/base/_sections/marketing/showcase/section.html +35 -0
  840. package/themes/base/_sections/marketing/showcase/section.json5 +52 -0
  841. package/themes/base/_sections/marketing/stats/section.html +32 -0
  842. package/themes/base/_sections/marketing/stats/section.json5 +44 -0
  843. package/themes/base/_sections/marketing/testimonials/section.html +54 -0
  844. package/themes/base/_sections/marketing/testimonials/section.json5 +70 -0
  845. package/themes/base/_sections/marketing/trusted-by/section.html +30 -0
  846. package/themes/base/_sections/marketing/trusted-by/section.json5 +38 -0
  847. package/themes/base/_sections/verts/unit/section.html +7 -0
  848. package/themes/base/_sections/verts/unit/section.js +22 -0
  849. package/themes/base/_sections/verts/unit/section.json5 +24 -0
  850. package/themes/base/_sections/verts/unit/section.scss +24 -0
  851. package/themes/base/_theme.js +13 -0
  852. package/themes/base/_theme.scss +4 -0
  853. package/themes/bootstrap/_theme.js +16 -0
  854. package/themes/bootstrap/_theme.scss +11 -0
  855. package/themes/bootstrap/js/index.esm.js +19 -0
  856. package/themes/bootstrap/js/index.umd.js +34 -0
  857. package/themes/bootstrap/js/src/alert.js +87 -0
  858. package/themes/bootstrap/js/src/base-component.js +86 -0
  859. package/themes/bootstrap/js/src/button.js +72 -0
  860. package/themes/bootstrap/js/src/carousel.js +474 -0
  861. package/themes/bootstrap/js/src/collapse.js +297 -0
  862. package/themes/bootstrap/js/src/dom/data.js +55 -0
  863. package/themes/bootstrap/js/src/dom/event-handler.js +317 -0
  864. package/themes/bootstrap/js/src/dom/manipulator.js +71 -0
  865. package/themes/bootstrap/js/src/dom/selector-engine.js +126 -0
  866. package/themes/bootstrap/js/src/dropdown.js +458 -0
  867. package/themes/bootstrap/js/src/modal.js +378 -0
  868. package/themes/bootstrap/js/src/offcanvas.js +282 -0
  869. package/themes/bootstrap/js/src/popover.js +97 -0
  870. package/themes/bootstrap/js/src/scrollspy.js +296 -0
  871. package/themes/bootstrap/js/src/tab.js +315 -0
  872. package/themes/bootstrap/js/src/toast.js +224 -0
  873. package/themes/bootstrap/js/src/tooltip.js +632 -0
  874. package/themes/bootstrap/js/src/util/backdrop.js +151 -0
  875. package/themes/bootstrap/js/src/util/component-functions.js +35 -0
  876. package/themes/bootstrap/js/src/util/config.js +65 -0
  877. package/themes/bootstrap/js/src/util/focustrap.js +115 -0
  878. package/themes/bootstrap/js/src/util/index.js +306 -0
  879. package/themes/bootstrap/js/src/util/sanitizer.js +117 -0
  880. package/themes/bootstrap/js/src/util/scrollbar.js +114 -0
  881. package/themes/bootstrap/js/src/util/swipe.js +146 -0
  882. package/themes/bootstrap/js/src/util/template-factory.js +160 -0
  883. package/themes/bootstrap/overrides/_accordion.scss +21 -0
  884. package/themes/bootstrap/overrides/_avatars.scss +51 -0
  885. package/themes/bootstrap/overrides/_blog-images.scss +45 -0
  886. package/themes/bootstrap/overrides/_buttons-adaptive.scss +141 -0
  887. package/themes/bootstrap/overrides/_color-shades.scss +25 -0
  888. package/themes/bootstrap/overrides/_cursor-utilities.scss +13 -0
  889. package/themes/bootstrap/overrides/_index.scss +30 -0
  890. package/themes/bootstrap/overrides/_links.scss +26 -0
  891. package/themes/bootstrap/overrides/_soft-colors.scss +99 -0
  892. package/themes/bootstrap/overrides/_spacing-extended.scss +74 -0
  893. package/themes/bootstrap/overrides/_spinners.scss +22 -0
  894. package/themes/bootstrap/overrides/_typography-utilities.scss +40 -0
  895. package/themes/bootstrap/scss/_accordion.scss +153 -0
  896. package/themes/bootstrap/scss/_alert.scss +68 -0
  897. package/themes/bootstrap/scss/_badge.scss +38 -0
  898. package/themes/bootstrap/scss/_breadcrumb.scss +40 -0
  899. package/themes/bootstrap/scss/_button-group.scss +147 -0
  900. package/themes/bootstrap/scss/_buttons.scss +216 -0
  901. package/themes/bootstrap/scss/_card.scss +238 -0
  902. package/themes/bootstrap/scss/_carousel.scss +226 -0
  903. package/themes/bootstrap/scss/_close.scss +66 -0
  904. package/themes/bootstrap/scss/_containers.scss +41 -0
  905. package/themes/bootstrap/scss/_dropdown.scss +250 -0
  906. package/themes/bootstrap/scss/_forms.scss +9 -0
  907. package/themes/bootstrap/scss/_functions.scss +302 -0
  908. package/themes/bootstrap/scss/_grid.scss +39 -0
  909. package/themes/bootstrap/scss/_helpers.scss +12 -0
  910. package/themes/bootstrap/scss/_images.scss +42 -0
  911. package/themes/bootstrap/scss/_list-group.scss +199 -0
  912. package/themes/bootstrap/scss/_maps.scss +174 -0
  913. package/themes/bootstrap/scss/_mixins.scss +42 -0
  914. package/themes/bootstrap/scss/_modal.scss +240 -0
  915. package/themes/bootstrap/scss/_nav.scss +197 -0
  916. package/themes/bootstrap/scss/_navbar.scss +289 -0
  917. package/themes/bootstrap/scss/_offcanvas.scss +147 -0
  918. package/themes/bootstrap/scss/_pagination.scss +109 -0
  919. package/themes/bootstrap/scss/_placeholders.scss +51 -0
  920. package/themes/bootstrap/scss/_popover.scss +196 -0
  921. package/themes/bootstrap/scss/_progress.scss +68 -0
  922. package/themes/bootstrap/scss/_reboot.scss +611 -0
  923. package/themes/bootstrap/scss/_root.scss +187 -0
  924. package/themes/bootstrap/scss/_spinners.scss +85 -0
  925. package/themes/bootstrap/scss/_tables.scss +171 -0
  926. package/themes/bootstrap/scss/_toasts.scss +73 -0
  927. package/themes/bootstrap/scss/_tooltip.scss +119 -0
  928. package/themes/bootstrap/scss/_transitions.scss +27 -0
  929. package/themes/bootstrap/scss/_type.scss +106 -0
  930. package/themes/bootstrap/scss/_utilities.scss +806 -0
  931. package/themes/bootstrap/scss/_variables-dark.scss +102 -0
  932. package/themes/bootstrap/scss/_variables.scss +1753 -0
  933. package/themes/bootstrap/scss/bootstrap-grid.scss +62 -0
  934. package/themes/bootstrap/scss/bootstrap-reboot.scss +10 -0
  935. package/themes/bootstrap/scss/bootstrap-utilities.scss +19 -0
  936. package/themes/bootstrap/scss/bootstrap.scss +52 -0
  937. package/themes/bootstrap/scss/forms/_floating-labels.scss +97 -0
  938. package/themes/bootstrap/scss/forms/_form-check.scss +189 -0
  939. package/themes/bootstrap/scss/forms/_form-control.scss +214 -0
  940. package/themes/bootstrap/scss/forms/_form-range.scss +91 -0
  941. package/themes/bootstrap/scss/forms/_form-select.scss +80 -0
  942. package/themes/bootstrap/scss/forms/_form-text.scss +11 -0
  943. package/themes/bootstrap/scss/forms/_input-group.scss +132 -0
  944. package/themes/bootstrap/scss/forms/_labels.scss +36 -0
  945. package/themes/bootstrap/scss/forms/_validation.scss +12 -0
  946. package/themes/bootstrap/scss/helpers/_clearfix.scss +3 -0
  947. package/themes/bootstrap/scss/helpers/_color-bg.scss +7 -0
  948. package/themes/bootstrap/scss/helpers/_colored-links.scss +30 -0
  949. package/themes/bootstrap/scss/helpers/_focus-ring.scss +5 -0
  950. package/themes/bootstrap/scss/helpers/_icon-link.scss +25 -0
  951. package/themes/bootstrap/scss/helpers/_position.scss +36 -0
  952. package/themes/bootstrap/scss/helpers/_ratio.scss +26 -0
  953. package/themes/bootstrap/scss/helpers/_stacks.scss +15 -0
  954. package/themes/bootstrap/scss/helpers/_stretched-link.scss +15 -0
  955. package/themes/bootstrap/scss/helpers/_text-truncation.scss +7 -0
  956. package/themes/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
  957. package/themes/bootstrap/scss/helpers/_vr.scss +8 -0
  958. package/themes/bootstrap/scss/mixins/_alert.scss +18 -0
  959. package/themes/bootstrap/scss/mixins/_backdrop.scss +14 -0
  960. package/themes/bootstrap/scss/mixins/_banner.scss +7 -0
  961. package/themes/bootstrap/scss/mixins/_border-radius.scss +78 -0
  962. package/themes/bootstrap/scss/mixins/_box-shadow.scss +18 -0
  963. package/themes/bootstrap/scss/mixins/_breakpoints.scss +127 -0
  964. package/themes/bootstrap/scss/mixins/_buttons.scss +70 -0
  965. package/themes/bootstrap/scss/mixins/_caret.scss +69 -0
  966. package/themes/bootstrap/scss/mixins/_clearfix.scss +9 -0
  967. package/themes/bootstrap/scss/mixins/_color-mode.scss +21 -0
  968. package/themes/bootstrap/scss/mixins/_color-scheme.scss +7 -0
  969. package/themes/bootstrap/scss/mixins/_container.scss +11 -0
  970. package/themes/bootstrap/scss/mixins/_deprecate.scss +10 -0
  971. package/themes/bootstrap/scss/mixins/_forms.scss +163 -0
  972. package/themes/bootstrap/scss/mixins/_gradients.scss +47 -0
  973. package/themes/bootstrap/scss/mixins/_grid.scss +151 -0
  974. package/themes/bootstrap/scss/mixins/_image.scss +16 -0
  975. package/themes/bootstrap/scss/mixins/_list-group.scss +26 -0
  976. package/themes/bootstrap/scss/mixins/_lists.scss +7 -0
  977. package/themes/bootstrap/scss/mixins/_pagination.scss +10 -0
  978. package/themes/bootstrap/scss/mixins/_reset-text.scss +17 -0
  979. package/themes/bootstrap/scss/mixins/_resize.scss +6 -0
  980. package/themes/bootstrap/scss/mixins/_table-variants.scss +24 -0
  981. package/themes/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  982. package/themes/bootstrap/scss/mixins/_transition.scss +26 -0
  983. package/themes/bootstrap/scss/mixins/_utilities.scss +97 -0
  984. package/themes/bootstrap/scss/mixins/_visually-hidden.scss +38 -0
  985. package/themes/bootstrap/scss/tests/jasmine.js +16 -0
  986. package/themes/bootstrap/scss/tests/mixins/_auto-import-of-variables-dark.test.scss +7 -0
  987. package/themes/bootstrap/scss/tests/mixins/_color-modes.test.scss +69 -0
  988. package/themes/bootstrap/scss/tests/mixins/_media-query-color-mode-full.test.scss +8 -0
  989. package/themes/bootstrap/scss/tests/mixins/_utilities.test.scss +393 -0
  990. package/themes/bootstrap/scss/tests/sass-true/register.js +14 -0
  991. package/themes/bootstrap/scss/tests/sass-true/runner.js +17 -0
  992. package/themes/bootstrap/scss/tests/utilities/_api.test.scss +75 -0
  993. package/themes/bootstrap/scss/utilities/_api.scss +47 -0
  994. package/themes/bootstrap/scss/vendor/_rfs.scss +348 -0
  995. package/themes/classy/README.md +89 -0
  996. package/themes/classy/_config.scss +245 -0
  997. package/themes/classy/_theme.js +31 -0
  998. package/themes/classy/_theme.scss +57 -0
  999. package/themes/classy/css/app/_panels.scss +183 -0
  1000. package/themes/classy/css/base/_fonts.scss +79 -0
  1001. package/themes/classy/css/base/_no-raise.scss +49 -0
  1002. package/themes/classy/css/base/_root.scss +113 -0
  1003. package/themes/classy/css/base/_typography.scss +154 -0
  1004. package/themes/classy/css/base/_utilities.scss +284 -0
  1005. package/themes/classy/css/components/_alerts.scss +51 -0
  1006. package/themes/classy/css/components/_badges.scss +46 -0
  1007. package/themes/classy/css/components/_buttons.scss +175 -0
  1008. package/themes/classy/css/components/_cards.scss +41 -0
  1009. package/themes/classy/css/components/_dropdowns.scss +48 -0
  1010. package/themes/classy/css/components/_forms.scss +171 -0
  1011. package/themes/classy/css/components/_receipt.scss +45 -0
  1012. package/themes/classy/css/layout/_footer.scss +298 -0
  1013. package/themes/classy/css/layout/_general.scss +209 -0
  1014. package/themes/classy/css/layout/_nav.scss +154 -0
  1015. package/themes/classy/css/layout/_shell.scss +458 -0
  1016. package/themes/classy/css/marketing/_bento.scss +238 -0
  1017. package/themes/classy/css/marketing/_content.scss +1328 -0
  1018. package/themes/classy/css/marketing/_downloads.scss +246 -0
  1019. package/themes/classy/css/marketing/_hero.scss +311 -0
  1020. package/themes/classy/css/marketing/_sections.scss +649 -0
  1021. package/themes/classy/css/pages/404/index.scss +67 -0
  1022. package/themes/classy/css/pages/_auth.scss +235 -0
  1023. package/themes/classy/css/pages/admin/firebase/index.scss +22 -0
  1024. package/themes/classy/css/pages/blog/[slug].scss +56 -0
  1025. package/themes/classy/css/pages/cookies.scss +2 -0
  1026. package/themes/classy/css/pages/dashboard/account/index.scss +31 -0
  1027. package/themes/classy/css/pages/feedback/index.scss +39 -0
  1028. package/themes/classy/css/pages/legal/_document.scss +192 -0
  1029. package/themes/classy/css/pages/payment/checkout/index.scss +585 -0
  1030. package/themes/classy/css/pages/payment/confirmation/index.scss +9 -0
  1031. package/themes/classy/css/pages/privacy.scss +2 -0
  1032. package/themes/classy/css/pages/status/index.scss +164 -0
  1033. package/themes/classy/css/pages/terms.scss +2 -0
  1034. package/themes/classy/css/pages/updates/index.scss +128 -0
  1035. package/themes/classy/fonts/inter-italic-latin-ext.woff2 +0 -0
  1036. package/themes/classy/fonts/inter-italic-latin.woff2 +0 -0
  1037. package/themes/classy/fonts/inter-normal-latin-ext.woff2 +0 -0
  1038. package/themes/classy/fonts/inter-normal-latin.woff2 +0 -0
  1039. package/themes/classy/fonts/newsreader-italic-latin-ext.woff2 +0 -0
  1040. package/themes/classy/fonts/newsreader-italic-latin.woff2 +0 -0
  1041. package/themes/classy/fonts/newsreader-normal-latin-ext.woff2 +0 -0
  1042. package/themes/classy/fonts/newsreader-normal-latin.woff2 +0 -0
  1043. package/themes/classy/js/hero-demo-form.js +56 -0
  1044. package/themes/neobrutalism/README.md +118 -0
  1045. package/themes/neobrutalism/_config.scss +139 -0
  1046. package/themes/neobrutalism/_layouts/frontend/core/base.html +30 -0
  1047. package/themes/neobrutalism/_layouts/frontend/pages/index.html +275 -0
  1048. package/themes/neobrutalism/_theme.js +24 -0
  1049. package/themes/neobrutalism/_theme.scss +61 -0
  1050. package/themes/neobrutalism/css/base/_mixins.scss +46 -0
  1051. package/themes/neobrutalism/css/base/_root.scss +169 -0
  1052. package/themes/neobrutalism/css/base/_typography.scss +61 -0
  1053. package/themes/neobrutalism/css/base/_utilities.scss +89 -0
  1054. package/themes/neobrutalism/css/components/_billing-toggle.scss +74 -0
  1055. package/themes/neobrutalism/css/components/_buttons.scss +148 -0
  1056. package/themes/neobrutalism/css/components/_cards.scss +47 -0
  1057. package/themes/neobrutalism/css/components/_forms.scss +88 -0
  1058. package/themes/neobrutalism/css/components/_marketing.scss +244 -0
  1059. package/themes/neobrutalism/css/layout/_general.scss +213 -0
  1060. package/themes/neobrutalism/css/layout/_navigation.scss +171 -0
  1061. package/themes/neobrutalism/css/pages/index.scss +203 -0
  1062. package/themes/neobrutalism/css/pages/pricing/index.scss +58 -0
  1063. package/themes/neobrutalism/css/pages/test/libraries/layers/index.scss +7 -0
  1064. package/themes/neobrutalism/js/pages/test/libraries/layers/index.js +9 -0
  1065. package/themes/newsflash/README.md +117 -0
  1066. package/themes/newsflash/_components/heading/lede/component.html +14 -0
  1067. package/themes/newsflash/_components/heading/lede/component.json5 +23 -0
  1068. package/themes/newsflash/_components/heading/rule-head/component.html +17 -0
  1069. package/themes/newsflash/_components/heading/rule-head/component.json5 +23 -0
  1070. package/themes/newsflash/_components/news/byline/component.html +12 -0
  1071. package/themes/newsflash/_components/news/byline/component.json5 +18 -0
  1072. package/themes/newsflash/_components/news/story-card/component.html +25 -0
  1073. package/themes/newsflash/_components/news/story-card/component.json5 +21 -0
  1074. package/themes/newsflash/_config.scss +147 -0
  1075. package/themes/newsflash/_layouts/frontend/core/base.html +51 -0
  1076. package/themes/newsflash/_layouts/frontend/pages/blog/index.html +299 -0
  1077. package/themes/newsflash/_layouts/frontend/pages/blog/post.html +235 -0
  1078. package/themes/newsflash/_layouts/frontend/pages/index.html +328 -0
  1079. package/themes/newsflash/_sections/marketing/desks/section.html +39 -0
  1080. package/themes/newsflash/_sections/marketing/desks/section.json5 +49 -0
  1081. package/themes/newsflash/_sections/marketing/newsletter-cta/section.html +103 -0
  1082. package/themes/newsflash/_sections/marketing/newsletter-cta/section.json5 +50 -0
  1083. package/themes/newsflash/_sections/marketing/rundown/section.html +28 -0
  1084. package/themes/newsflash/_sections/marketing/rundown/section.json5 +40 -0
  1085. package/themes/newsflash/_theme.js +24 -0
  1086. package/themes/newsflash/_theme.scss +70 -0
  1087. package/themes/newsflash/css/base/_fonts.scss +80 -0
  1088. package/themes/newsflash/css/base/_mixins.scss +51 -0
  1089. package/themes/newsflash/css/base/_root.scss +257 -0
  1090. package/themes/newsflash/css/base/_typography.scss +49 -0
  1091. package/themes/newsflash/css/base/_utilities.scss +122 -0
  1092. package/themes/newsflash/css/components/_badges.scss +65 -0
  1093. package/themes/newsflash/css/components/_billing-toggle.scss +61 -0
  1094. package/themes/newsflash/css/components/_buttons.scss +139 -0
  1095. package/themes/newsflash/css/components/_cards.scss +47 -0
  1096. package/themes/newsflash/css/components/_editorial.scss +173 -0
  1097. package/themes/newsflash/css/components/_forms.scss +75 -0
  1098. package/themes/newsflash/css/components/_infinite-scroll.scss +102 -0
  1099. package/themes/newsflash/css/components/_panels.scss +156 -0
  1100. package/themes/newsflash/css/components/_ticker.scss +67 -0
  1101. package/themes/newsflash/css/layout/_general.scss +330 -0
  1102. package/themes/newsflash/css/layout/_navigation.scss +168 -0
  1103. package/themes/newsflash/css/pages/404/index.scss +79 -0
  1104. package/themes/newsflash/css/pages/blog/[slug].scss +186 -0
  1105. package/themes/newsflash/css/pages/blog/index.scss +17 -0
  1106. package/themes/newsflash/css/pages/index.scss +157 -0
  1107. package/themes/newsflash/css/pages/pricing/index.scss +55 -0
  1108. package/themes/newsflash/css/pages/test/libraries/layers/index.scss +7 -0
  1109. package/themes/newsflash/fonts/fraunces-italic-latin-ext.woff2 +0 -0
  1110. package/themes/newsflash/fonts/fraunces-italic-latin.woff2 +0 -0
  1111. package/themes/newsflash/fonts/fraunces-normal-latin-ext.woff2 +0 -0
  1112. package/themes/newsflash/fonts/fraunces-normal-latin.woff2 +0 -0
  1113. package/themes/newsflash/fonts/schibsted-grotesk-italic-latin-ext.woff2 +0 -0
  1114. package/themes/newsflash/fonts/schibsted-grotesk-italic-latin.woff2 +0 -0
  1115. package/themes/newsflash/fonts/schibsted-grotesk-normal-latin-ext.woff2 +0 -0
  1116. package/themes/newsflash/fonts/schibsted-grotesk-normal-latin.woff2 +0 -0
  1117. package/themes/newsflash/js/pages/blog/[slug].js +29 -0
  1118. package/themes/newsflash/js/pages/test/libraries/layers/index.js +9 -0
  1119. package/translations/es/pages/404.json +86 -0
  1120. package/translations/es/pages/account.json +36 -0
  1121. package/translations/es/pages/app.json +44 -0
  1122. package/translations/es/pages/cancel.json +36 -0
  1123. package/translations/es/pages/change-password.json +36 -0
  1124. package/translations/es/pages/connections/callback.json +41 -0
  1125. package/translations/es/pages/dashboard/account.json +475 -0
  1126. package/translations/es/pages/dashboard.json +36 -0
  1127. package/translations/es/pages/forgot.json +36 -0
  1128. package/translations/es/pages/join.json +36 -0
  1129. package/translations/es/pages/login.json +36 -0
  1130. package/translations/es/pages/payment/checkout.json +83 -0
  1131. package/translations/es/pages/payment/confirmation.json +62 -0
  1132. package/translations/es/pages/portal/email-preferences.json +46 -0
  1133. package/translations/es/pages/recover.json +36 -0
  1134. package/translations/es/pages/refund.json +36 -0
  1135. package/translations/es/pages/register.json +36 -0
  1136. package/translations/es/pages/reset-password.json +36 -0
  1137. package/translations/es/pages/reset.json +42 -0
  1138. package/translations/es/pages/signin.json +45 -0
  1139. package/translations/es/pages/signup.json +60 -0
  1140. package/translations/es/pages/token.json +39 -0
  1141. package/translations/fa/pages/404.json +86 -0
  1142. package/translations/fa/pages/account.json +36 -0
  1143. package/translations/fa/pages/app.json +44 -0
  1144. package/translations/fa/pages/cancel.json +36 -0
  1145. package/translations/fa/pages/change-password.json +36 -0
  1146. package/translations/fa/pages/connections/callback.json +41 -0
  1147. package/translations/fa/pages/dashboard/account.json +475 -0
  1148. package/translations/fa/pages/dashboard.json +36 -0
  1149. package/translations/fa/pages/forgot.json +36 -0
  1150. package/translations/fa/pages/join.json +36 -0
  1151. package/translations/fa/pages/login.json +36 -0
  1152. package/translations/fa/pages/payment/checkout.json +83 -0
  1153. package/translations/fa/pages/payment/confirmation.json +62 -0
  1154. package/translations/fa/pages/portal/email-preferences.json +46 -0
  1155. package/translations/fa/pages/recover.json +36 -0
  1156. package/translations/fa/pages/refund.json +36 -0
  1157. package/translations/fa/pages/register.json +36 -0
  1158. package/translations/fa/pages/reset-password.json +36 -0
  1159. package/translations/fa/pages/reset.json +42 -0
  1160. package/translations/fa/pages/signin.json +45 -0
  1161. package/translations/fa/pages/signup.json +60 -0
  1162. package/translations/fa/pages/token.json +39 -0
package/docs/libs.md ADDED
@@ -0,0 +1,298 @@
1
+ # Web JS libraries (core/js/libs)
2
+
3
+ The browser-side modules `@omega.js/web` ships for page code to import:
4
+ `packages/web/core/js/libs/`. They are the framework's own runtime helpers,
5
+ distinct from `@omega.js/client` (the singleton every page boots with) and from
6
+ `core/js/pages/` (a page's own module). Page modules, theme modules, the boot
7
+ runtime, and consumer page modules all reach them the same way.
8
+
9
+ ## The import idiom
10
+
11
+ ```js
12
+ import { createLogger } from '__main_assets__/js/libs/logger.js';
13
+ import { loadCharts, chartSlot, barChart } from '__main_assets__/js/libs/charts.js';
14
+ ```
15
+
16
+ `__main_assets__/` is a build-time specifier resolved by the esbuild plugin in
17
+ `packages/web/src/assets.js`: `__main_assets__/js/...` points at the CORE layer
18
+ root (`packages/web/core/`), `__main_assets__/themes/...` at the packaged themes
19
+ dir. It is layer-independent, so a consumer's own page module in
20
+ `src/assets/js/pages/` writes exactly the specifier core's own pages write
21
+ (`core/js/pages/admin/index.js`, `core/js/layouts/modules/utilities/redirect.js`,
22
+ `themes/classy/_theme.js`, `runtime/boot.js`). There are no exceptions: every
23
+ bundle the pipeline builds — main, page, layout — carries the alias plugin
24
+ ([#624](https://github.com/Omega-JS-Stack/omega/issues/624) deleted the
25
+ standalone-IIFE `js/modules/` lane that did not).
26
+
27
+ `js/modules/` is therefore not an asset lane in ANY layer. A directory that
28
+ still exists builds nothing, and the build prints one warning naming it rather
29
+ than ignoring it in silence ([#249](https://github.com/Omega-JS-Stack/omega/issues/249)).
30
+ Shared code goes in `js/libs/`; a script that belongs to one layout goes in
31
+ `js/layouts/<layout>.js`.
32
+
33
+ ## Premade consumer JS: `src/assets/js/libs/`
34
+
35
+ The consumer twin of this directory. A brand's own shared browser modules live
36
+ in `src/assets/js/libs/` and are imported **by path** from any page module or
37
+ from `js/main.js`:
38
+
39
+ ```js
40
+ // src/assets/js/pages/pricing/index.js
41
+ import { trackPlanChoice } from '../../libs/pricing-telemetry.js';
42
+ ```
43
+
44
+ Nothing declares them and nothing registers them: they are ordinary modules the
45
+ bundler follows from whichever entry imports them, so they land in the importing
46
+ bundle (or a shared chunk, when more than one entry uses them) and cost nothing
47
+ on a page that does not. The framework's own `libs/` below are reached the same
48
+ way, through the `__main_assets__` specifier instead of a relative path — one
49
+ idiom, two layers.
50
+
51
+ Two neighbours it is NOT: `js/pages/**` is keyed by URL and loads itself, and
52
+ `js/layouts/**` is keyed by layout name and does the same — a lib is only ever
53
+ loaded by something that imports it. A `js/pages/` file nothing imports and no
54
+ URL claims is dead code, and the orphan guard says so
55
+ ([#469](https://github.com/Omega-JS-Stack/omega/issues/469)); a `js/libs/` file
56
+ nothing imports is simply never built.
57
+
58
+ ## The consumer rule: import the helper, never the library
59
+
60
+ charts.js and graph.js state it, and it holds for both: @tanstack/charts and
61
+ mermaid are dependencies of `@omega.js/web`, never a CDN load at runtime, and a
62
+ page reaches either one ONLY through its helper module. Consumers import the helpers and
63
+ never name the underlying library, so its version and delivery stay the
64
+ framework's to change. The helpers own three things a page would otherwise have
65
+ to redo:
66
+
67
+ - **Lazy loading.** The library import inside `loadCharts` / `loadGraph` is
68
+ dynamic, and the bundle is ESM with splitting, so each library lands in its
69
+ own chunk fetched only when a page asks for it. A page with no chart or
70
+ diagram pays nothing.
71
+ - **Theming.** Colors are read off the `--omega-*` token sheet at draw time
72
+ ([docs/shared/theming.md](shared/theming.md)), so a chart or diagram follows
73
+ the brand ramp and dark mode without knowing either exists.
74
+ - **Bundling.** The framework's own installed copy of the library resolves for
75
+ whoever imports it, so it ships once.
76
+
77
+ The practical consequence for a consumer: do not hand-roll SVG for a chart or a
78
+ diagram, and do not add @tanstack/charts or mermaid to a target's dependencies.
79
+
80
+ ## The modules
81
+
82
+ | Module | What it is | Key exports |
83
+ |---|---|---|
84
+ | `admin-helpers.js` | Formatting and stat-cell helpers for the admin pages: relative timestamps, capitalization, and writing a settled Firestore count-aggregation result (or an inline error) into a stat element | `formatTimeAgo`, `capitalize`, `setStatValue`, `setStatSubValue` |
85
+ | `alert-dismiss.js` | The site alerts' × ([#719](https://github.com/Omega-JS-Stack/omega/issues/719)): one delegated `document` click handler hiding the `.main-alert` a pressed `.main-alert-close` sits in. `core/js/main.js` calls it, so every banner `core/_includes/core/body.html` ships is dismissible on every page, an alert injected after boot included | `setupAlertDismiss` |
86
+ | `analytics.js` | The web HOST of the analytics facade ([#328](https://github.com/Omega-JS-Stack/omega/issues/328)): it wires the page's three seams into `@omega.js/analytics` and is the ONE way core code counts anything. Detail below | `event`, `identify`, `reset`, `configureAnalytics`, `readPlatformCookies`, `PLATFORM_COOKIES` |
87
+ | `charts.js` | TanStack Charts behind framework helpers: lazy load, token colors, a slot to draw into, four chart builders. Detail below | `loadCharts`, `chartsReady`, `chartColors`, `resolveColor`, `chartSlot`, `chartDefinition`, `barChart`, `stackedBarChart`, `doughnutChart`, `lineChart` |
88
+ | `dev.js` | Development-only helpers, imported by `runtime/boot.js` only when `manager.isDevelopment()`: a click logger, a breakpoint logger on resize, and the palette's **Tools** section — "Log opening tags" and "Toggle theme", which were `window.logOpeningTags()` / `window.changeTheme()` until [#342](https://github.com/Omega-JS-Stack/omega/issues/342) made the palette the one home | default export: a function that installs all of it |
89
+ | `graph.js` | mermaid behind framework helpers, on the charts contract: a definition in, an SVG out. Detail below | `loadGraph`, `graphReady`, `graphTheme`, `graphSlot`, `drawGraph` |
90
+ | `initialize-tooltips.js` | Initializes every `[data-bs-toggle="tooltip"]` element as a Bootstrap tooltip, and exits early when the page has none. The ONE home for the behavior ([#99](https://github.com/Omega-JS-Stack/omega/issues/99)): each theme's `_theme.js` calls it from its DOM-ready handler instead of shipping its own copy | default export: `initializeTooltips()` |
91
+ | `logger.js` | The web runtime's tagged console, `[@omega.js/web:<module>]` with no timestamp ([#12](https://github.com/Omega-JS-Stack/omega/issues/12)). The methods are getters returning a bound `console` method, so devtools attributes each line to the real call site and a swapped `console` method is still seen | `createLogger(module)`, also the default export |
92
+ | `omega-copy.js` | Declarative copy-to-clipboard ([#709](https://github.com/Omega-JS-Stack/omega/issues/709)): one delegated `document` click handler making any `data-omega-copy` element a copy control, so a page writes no JS. The copied value resolves in order — the `omegaCopyValue` property or `data-omega-copy-value` (display and clipboard may differ: a masked row copies the real credential), a selector in `data-omega-copy` (an input's value, a `<pre>`'s text), then the sibling field in the same `.input-group`. Feedback is `showNotification` ('Copied!' / 'Failed to copy' / 'Nothing to copy'). `core/js/main.js` calls it | `setupCopy` |
93
+ | `path-prefix.js` | The browser half of base-path support ([#355](https://github.com/Omega-JS-Stack/omega/issues/355)): reads the mount off `<html data-omega-path-prefix>` (the build's own stamp — never baked into the bundle) and mounts a root-relative site path under it. Every absence — no stamp, no document, a worker scope — means the domain root | `pathPrefix()`, `siteUrl(path)` |
94
+ | `payment-config.js` | Reads the payment config (products, providers, prices, feature values, currency) off `omega.config.payment` and the FEATURES CATALOG off `omega.config.features`, both populated by the build, so no page fetches either at runtime. A feature is defined ONCE in the catalog and a product names only its value ([#647](https://github.com/Omega-JS-Stack/omega/issues/647)), so `getProductLimits` is the catalog-aware read: only the counted features a product gives a NUMBER | `getPaymentConfig`, `getProviders`, `getProducts`, `getProductById`, `getFeatureCatalog`, `getFeature`, `getProductFeatures`, `getProductLimits`, `getProductPrices`, `getCurrency` |
95
+ | `recaptcha.js` | reCAPTCHA v3 for any public form posting to a recaptcha-gated backend route (checkout payment intent, newsletter capture): lazy script load through `omega.dom().loadScript()`, then a token per action. Site key: `omega.config.captcha.providers.recaptcha.siteKey` | `initializeRecaptcha(siteKey)`, `getRecaptchaToken(action)` |
96
+ | `srcset.js` | The srcset candidate parser for the browser ([#367](https://github.com/Omega-JS-Stack/omega/issues/367)): rewrites every candidate URL through a caller's function, reading a comma inside a URL (a `data:` payload, a `?w=100,200` query) as part of the URL. The FORMAT TWIN of the build-time `packages/web/src/srcset.js` — a grammar change lands in both files, and each one says so. Used by the runtime lazy-loader for the `data-srcset` lane the build passes defer | `mapSrcset(value, mapUrl)` |
97
+ | `sale-name.js` | Picks the promotion name for a date. Holidays (Black Friday, Cyber Monday, Christmas, Easter) run a window of 7 days before to 3 days after their core date, and a later holiday only takes over once the earlier one's core date has passed; with no holiday active it falls back to the season (`Spring Sale`, and `End of Summer Sale` past 70% of the season), then to a plain `Sale` | `getSaleName(date)`, `getUpcomingSales(startDate, endDate)`, default `{ getSaleName, getUpcomingSales }` |
98
+
99
+ ### analytics.js
100
+
101
+ The ONE call, and nothing about a provider at the call site:
102
+
103
+ ```js
104
+ import { event } from '__main_assets__/js/libs/analytics.js';
105
+
106
+ event('user_refund_request', { action: 'submit' });
107
+ ```
108
+
109
+ The name is a CANONICAL event from `@omega.js/analytics`' catalog, which decides
110
+ which providers hear it, under which native name, in which dialect — the whole
111
+ contract is [docs/shared/analytics.md](shared/analytics.md). This module is
112
+ the web HOST of that facade: it injects the three seams only a page can supply,
113
+ once, and exports the call sites' entry points.
114
+
115
+ | Seam | What web supplies |
116
+ |---|---|
117
+ | `transport` | the package's guarded browser transport — `gtag` / `fbq` / `ttq`, each checked with `typeof` before it is called |
118
+ | `consent` | a gate over `libs/tracking-consent.js`, read LIVE, so a visitor who accepts mid-session is counted from that moment ([#383](https://github.com/Omega-JS-Stack/omega/issues/383)) |
119
+ | `context` | `runtime: 'web'` plus the captured attribution, flattened into what the adapters read ([#384](https://github.com/Omega-JS-Stack/omega/issues/384)) |
120
+
121
+ `environment` is NOT web's: @omega.js/client injects it from the brand's own
122
+ `config.environment`, which is what decides whether an unknown event name throws.
123
+
124
+ The package is reached THROUGH @omega.js/client (`@omega.js/client/modules/analytics.js`),
125
+ never as a bare `@omega.js/analytics`: the analytics package is private and never
126
+ publishes, so in a consumer install it exists only as the copy vendored into the
127
+ client's dist — and the client is a real runtime dependency of every framework.
128
+
129
+ **Identity is not an event.** `identify(user)` and `reset()` set what the events
130
+ after them inherit — GA4's user properties, the Meta Pixel's advanced-matching
131
+ `init`, TikTok's `identify` — so they have no catalog entry, and they live here,
132
+ guarded the same way. `core/js/core/auth.js` calls them off the auth state. GA4's
133
+ `user_id` is deliberately NOT among them: @omega.js/client's `setUserId` owns
134
+ that one key on every runtime and sends the derived `uuidv5(uid, namespace)`
135
+ value, so a raw uid written here would only clobber it.
136
+
137
+ **`readPlatformCookies()`** is exported for the same SSOT reason: the checkout's
138
+ intent payload needs the `_fbc`/`_fbp`/`_ttp` read at conversion time
139
+ (`pages/payment/checkout/modules/api.js`), and one reader means a separator quirk
140
+ cannot be fixed on one path and left on the other.
141
+
142
+ **Why guarded at all**: `gtag`, `fbq` and `ttq` are page-level snippets, and an
143
+ ad blocker does not stub them — it keeps them from ever being defined, so a BARE
144
+ call throws a ReferenceError. Every one of these calls sits in front of the thing
145
+ the customer just pressed, so the throw takes the action with it. That was the
146
+ billing card's dead "Undo cancellation" button
147
+ ([#283](https://github.com/Omega-JS-Stack/omega/issues/283)), found again in 19
148
+ other files ([#306](https://github.com/Omega-JS-Stack/omega/issues/306)). Each
149
+ provider is checked on its own, because blockers work per list: a page that lost
150
+ Meta still counts Google. The same reasoning covers this module's own storage
151
+ reads (consent, attribution): a read that fails is a denial or an absence, never
152
+ a raise.
153
+
154
+ `test/analytics-blocked.test.js` keeps it the SSOT with two static sweeps: no
155
+ file under `core/js` or the theme layer calls a provider global bare, and none
156
+ names a provider at all — the retired `trackGoogle` / `trackMeta` / `trackTikTok`
157
+ wrappers cannot regrow one page module at a time. Two files may name the globals:
158
+ this module (the guard itself, plus the identity calls) and
159
+ `core/js/core/analytics-loader.js`, which DEFINES them.
160
+
161
+ ### charts.js
162
+
163
+ The library is [TanStack Charts](https://tanstack.com/charts/latest) — a
164
+ grammar (marks, scales, mappings) with a framework-neutral DOM host that
165
+ renders SVG ([#772](https://github.com/Omega-JS-Stack/omega/issues/772)). It is
166
+ **Alpha**, where 0.x minors move together and may break, so the version is an
167
+ EXACT pin in `packages/web/package.json` (`"@tanstack/charts": "0.16.0"`, no
168
+ range) and an update is a deliberate read of its release notes.
169
+
170
+ The lifecycle is load, slot, draw:
171
+
172
+ 1. `await loadCharts()` loads the library once. It is idempotent and safe to
173
+ call on every poll (a failed load clears the cached promise so a later call
174
+ can retry), and it resolves a boolean. The grammar is per-capability, so the
175
+ one call fetches the root (Cartesian marks + the DOM host) alongside the
176
+ polar, tooltip and scale subpaths — several chunks, one lazy load.
177
+ 2. `chartSlot(id, height = 220, series = [])` returns the markup to render: a
178
+ height-bearing box around a `<div id="…">` host that fills it, because the
179
+ host follows its container's WIDTH on its own and is told its height. It
180
+ stamps `series` onto the box as `data-series` so `@omega.js/client`'s
181
+ write-on-change `swap` (`modules/live-page`) sees a data-only change and
182
+ redraws; a host carries no data of its own, so without the stamp the old
183
+ picture would stand.
184
+ 3. One of `barChart` (with `horizontal` for ranked rows), `stackedBarChart`,
185
+ `doughnutChart`, `lineChart` draws into that id and returns the chart host,
186
+ or `null` when nothing was drawn.
187
+
188
+ `chartsReady()` is the synchronous check for a render path. Every draw destroys
189
+ the host already mounted on that id first (the module keeps a Map of id → host),
190
+ so repainting on each poll replaces rather than stacks, and `svgAnimation` is
191
+ off for the same reason: a polled page would otherwise spend most of its life
192
+ growing bars back out of the axis.
193
+
194
+ A value axis is labelled in WHOLE numbers: these charts count things, and the
195
+ library's own tick policy is a responsive count that lands on 0.5 on a small
196
+ domain. The helper supplies integer candidates on the 1/2/5 ladder and a
197
+ configured `[first tick, last tick]` domain, so the axis ends exactly on its
198
+ ticks; zero always stays on the axis, and a negative reading widens the span downwards.
199
+
200
+ A tooltip names the THING being read, never the channel it rode in on
201
+ ([#800](https://github.com/Omega-JS-Stack/omega/issues/800)): a bar says
202
+ `label: value`, a stacked segment and a line reading say `series · label: value`,
203
+ and a doughnut slice adds its share of the whole. The unit travels with the
204
+ data — `format: { prefix?, suffix?, decimals? }` on any builder's data argument,
205
+ plain JSON so a page carrying chart data alone can hold it — and it prints in
206
+ the tooltip AND on the value axis, so a money chart says `$` in both places.
207
+ Stated `decimals` are exact (`$7.00`); unstated, a count prints as itself and a
208
+ fraction gets at most two places. A page with JS may pass
209
+ `tooltip: (point) => string` to take the whole line over, where `point.datum` is
210
+ the row the mark drew (`{label, value}`, plus `series` on a stacked or line
211
+ chart, plus `fraction` on a doughnut).
212
+
213
+ `chartDefinition(kind, data)` — `'bar'`, `'stacked'`, `'doughnut'`, `'line'` —
214
+ returns the definition a builder would draw, without drawing it. A definition is
215
+ renderer-neutral and DOM-free, which is what lets the package's own suite
216
+ (`test/dataviz.test.js`) compile all four through `createChartScene` and assert
217
+ real geometry in node. The PAINT still needs a browser: the sandbox e2e lane's
218
+ chart step (`brands/sandbox-brand/test/e2e/run.js` → `window.__omega.drawCharts()`)
219
+ fails a chart whose host holds no SVG mark with a non-zero box. An unknown kind
220
+ is a programmer error and throws.
221
+
222
+ Element ids are authored, so `chartSlot` throws on anything that is not a plain
223
+ id. When the library did not load, `chartSlot` returns a line saying so in place
224
+ of the host instead of leaving a hole, which is why a chart always sits beside
225
+ the same figures in a table or statgrid.
226
+
227
+ Theming: `chartColors()` reads `--omega-ink-muted`, `--omega-line`,
228
+ `--omega-accent`, and the categorical ramp `--omega-chart-1` through
229
+ `--omega-chart-6` off `:root`, falling back token, then Bootstrap variable, then
230
+ a hardcoded color. Those values become the definition's `theme` (axis and
231
+ legend ink, gridlines, the categorical palette) and its color scale's `range`.
232
+ `resolveColor()` turns a `var(--token)` string into a real color, which is how a
233
+ caller passes `colors: ['var(--omega-ok)', …]` to keep STATUS meaning where the
234
+ categorical ramp would only say "different". Tokens are read at draw time and
235
+ nothing listens for a theme flip, so a light/dark switch lands on the next
236
+ redraw.
237
+
238
+ ### graph.js
239
+
240
+ The same shape, for mermaid diagrams: `await loadGraph()`, then
241
+ `graphSlot(id, height = 320, definition = '')`, then
242
+ `await drawGraph(id, definition)`, with `graphReady()` as the synchronous check.
243
+ `drawGraph` returns the SVG it rendered (also written into the host), or `null`.
244
+ The module takes a DEFINITION in and puts an SVG out: composing the mermaid text
245
+ is the page's business, because the shapes and words in a diagram are content,
246
+ not framework.
247
+
248
+ `graphSlot`'s height is a FLOOR (`min-height`): the host is empty until the
249
+ render lands, so the box reserves the space rather than letting the page jump,
250
+ and a taller diagram still grows past it. The definition is stamped as
251
+ `data-series` for the same `swap` reason charts stamp their series, and ids are
252
+ validated the same way.
253
+
254
+ `graphTheme()` resolves the live tokens into mermaid `themeVariables` for the
255
+ `base` theme: ink, both surfaces, `--omega-line` for edges, `--omega-accent` for
256
+ the node outline, and the same `--omega-chart-1` through `--omega-chart-6` ramp
257
+ charts read, mapped onto mermaid's `cScale0` through `cScale5` and `pie1` through
258
+ `pie6` slots (an unset slot is left out so mermaid derives its own). Mermaid
259
+ paints with literal colors, so nothing is ever handed a `var()`. `drawGraph`
260
+ initializes per render (`startOnLoad: false`, `securityLevel: 'strict'`,
261
+ `suppressErrorRendering: true`) because the tokens are read per render, and it
262
+ throws on a definition that does not parse: diagram text is authored, so a syntax
263
+ error in it is a programmer error and says so instead of drawing nothing.
264
+
265
+ ## The auth cluster (`libs/auth/`)
266
+
267
+ The three auth pages (`/signin`, `/signup`, `/reset`) share nearly all of their
268
+ logic, so the page modules import one orchestrator and the flows live in focused
269
+ modules beside it. `auth/index.js` builds a shared context object
270
+ (`{ formManager, useAuthPopup }`) and passes it explicitly to every flow that
271
+ needs it.
272
+
273
+ The boot order is the orchestrator's whole job, and it runs inside
274
+ `omega.dom().ready()`: handle `?authSignout`, then `?authCustomToken`, then
275
+ `?authPrivateKey` (return if either sign-in took over, the page is navigating),
276
+ then build the page's form from the `data-page-path` suffix, disable the fields
277
+ while checking for a returning OAuth redirect (return if one was handled), then
278
+ check the subdomain policy, call
279
+ `formManager.ready()`, and propagate `authReturnUrl` into the page's auth links.
280
+
281
+ | Module | What it is | Key exports |
282
+ |---|---|---|
283
+ | `auth/index.js` | The orchestrator: owns the boot order above and picks the form by matching the final segment of `data-page-path`. Imported by the `/signin`, `/signup`, and `/reset` page modules | default export: a function |
284
+ | `auth/forms.js` | FormManager wiring for the three forms (built with `autoReady: false`, since the boot sequence calls `ready()` itself), the shared validation that only checks email and password when the pressed button's `data-provider` is `email`, the provider-aware submit handler, and the signup consent UI: both checkboxes are outlined as one unit, and consent is stashed to `omega.storage()` BEFORE any Firebase call so it survives the post-signup redirect for the backend's signup route | `initializeSigninForm`, `initializeSignupForm`, `initializeResetForm` |
285
+ | `auth/email.js` | Email and password flows. Signup falls back to signing the user in when the address is already in use; reset reports success even for an unknown address, to avoid email enumeration; and each error lands on the field it belongs to (Firebase collapses wrong-email and wrong-password into one code, so both fields get the shared message) | `handleEmailSignin`, `handleEmailSignup`, `handlePasswordReset` |
286
+ | `auth/oauth.js` | Provider flows: redirect by default, popup only inside an iframe or with `?authPopup=true`, with a popup-to-redirect fallback on blockers. Also the returning-redirect provider (a one-shot sessionStorage marker makes a redirect that came home empty loud instead of silent) and the accidental-signup reversal: Google auto-creates an account during a signin attempt, so the reversal deletes it, signs out, and shows an inline error — and marks the uid for `auth/orphan.js` when that delete fails | `shouldUseAuthPopup`, `handleRedirectResult`, `signInWithProvider`, `reverseAccidentalSignup` |
287
+ | `auth/orphan.js` | The failed-delete backstop ([#703](https://github.com/Omega-JS-Stack/omega/issues/703)): a reversal whose `.delete()` fails leaves a live account with no consent record, and nothing about the account says so afterwards (a self-read is always allowed, and every account is consent-less until the `/user/signup` post lands), so the browser that failed the delete marks the uid in `omega.storage()`. `core/js/core/auth.js` retries the delete at auth-ready for THAT uid and nothing else — an account with legal consent on record is never touched, and a deliberate signup clears the markers before Firebase is called. A second failure signs the user out, reports it, and keeps the marker for the next visit | `markOrphanedAccount`, `clearOrphanMarkers`, `retryOrphanCleanup` |
288
+ | `auth/session-params.js` | The URL-parameter session behaviors: `?authSignout=true` (sign out, then strip the param so reloads do not loop), `?authCustomToken=…` (admin impersonation and custom-token sign-in, which owns its own post-signin navigation), `?authPrivateKey=…` (the durable-URL lane for an OBS dock, a kiosk, or a bookmark: a custom token expires in an hour, so the key buys a fresh one at `POST /omega/user/token` on every load, is stripped from the address bar BEFORE the page moves, and is never logged, notified, or captured), `authReturnUrl` propagation into every auth link on the page, and the apex-domain bounce when `auth.config.allowSubdomainAuth` is false | `handleAuthSignout`, `handleCustomTokenSignin`, `handlePrivateKeySignin`, `updateAuthReturnUrl`, `checkSubdomainAuth` |
289
+ | `auth/errors.js` | Pure Firebase error translation, no DOM and no form state: which codes belong on the password field, the short message for each, which codes are user-caused and therefore never worth a Sentry capture, and pulling a `@omega.js/backend` blocking-function message (rate limit, disposable email) back out of the opaque `auth/internal-error` blob | `isPasswordError`, `passwordErrorMessage`, `isUserError`, `extractBlockingFunctionMessage` |
290
+ | `auth/tracking.js` | GA4, Facebook Pixel, and TikTok Pixel events for the three auth outcomes | `trackLogin`, `trackSignup`, `trackPasswordReset` |
291
+ | `auth/password-toggle.js` | The password eye, registered once as the `password-toggle` click trigger on `@omega.js/client`'s shared trigger registry ([#16](https://github.com/Omega-JS-Stack/omega/issues/16)). `core/js/main.js` calls it, so it is armed on every page before any page module runs, and delegation covers input groups rendered after boot | `setupPasswordToggle` |
292
+
293
+ ## See also
294
+
295
+ - [docs/web/index.md](index.md) for the framework guide, including the bundler
296
+ aliases and the conventions charts, graphs, and the log tag are pinned by
297
+ - [docs/shared/theming.md](shared/theming.md) for the `--omega-*` tokens the
298
+ chart and graph helpers read
@@ -0,0 +1,159 @@
1
+ ---
2
+ status: ratified
3
+ created: 2026-07-18
4
+ ---
5
+ # OMEGA Sections & Components — Architecture Spec
6
+
7
+ > **STATUS: RATIFIED (Ian, 2026-07-18 — same night as the design).** Extraction underway; durable parts migrate to `docs/web/sections.md` as pieces land.
8
+ > Scope: ALL frameworks (web, desktop, extension, future) — this design is made once and never redesigned. No backwards compat anywhere (standing rule).
9
+
10
+ ## 0. Why (the ruling that produced this)
11
+
12
+ The frontmatter-monolith model (theme layout = whole page, copy as frontmatter defaults) has one fatal flaw — the **fork cliff**: consumers can override words but never structure; the only escape is owning a 600-line layout forever. Ian + Claude independently converged on a **section/component library**: structure becomes data, sections stay framework-owned, updates keep flowing. Massive frontmatter is explicitly rejected ("we tried that and its ugly") — frontmatter shrinks to page meta only.
13
+
14
+ ## 1. The two-tier library
15
+
16
+ - **Sections** — full-width page bands (hero, testimonials, bento, pricing table, article list…). Pages are compositions of sections.
17
+ - **Components** — smaller reusable pieces (browser frame with mac buttons, terminal, marquee, stat card…). Used inside sections and directly in pages.
18
+
19
+ Both tiers share the same anatomy, resolution, and asset rules.
20
+
21
+ ## 2. Anatomy — a section is a folder that owns everything about itself
22
+
23
+ ```
24
+ themes/base/_sections/marketing/hero/
25
+ section.html ← markup (Liquid). The args are the data contract.
26
+ section.scss ← its styles (optional)
27
+ section.js ← its behavior (optional — most sections have none)
28
+ section.json5 ← meta: arg schema + defaults + showcase demo data
29
+ ```
30
+
31
+ (Naming amendment, cp204: the folder families are `_sections`/`_components` —
32
+ the Jekyll-family underscore marks template machinery, matching
33
+ `_layouts`/`_includes`, and keeps Eleventy from processing them as content.)
34
+
35
+ Components identical with `component.*` filenames. Standard filenames (not `<name>.html`) so tooling/resolvers are predictable.
36
+
37
+ **The context-free rule (load-bearing):** args in → HTML out. Section markup never reaches into page globals (`site.*`, nav state, collections). This single rule is what makes sections renderable on every framework surface and portable to any future engine.
38
+
39
+ ## 3. Organization — nested, dozens-scale
40
+
41
+ - Section id = path under `sections/` (kebab-case): `marketing/hero`, `commerce/pricing-table`, `content/article-list`, `app/stat-cards`.
42
+ - Arbitrary nesting allowed; the showcase groups by folder automatically.
43
+ - Same for components: `frame/browser`, `frame/terminal`, `motion/marquee`.
44
+
45
+ ## 4. Resolution & layering (mirrors the theme layer chain)
46
+
47
+ For `{% section "marketing/hero" %}`, first match wins:
48
+
49
+ 1. **Consumer-local**: `<src>/_sections/marketing/hero/` — consumers author their own sections here (their git holds ONLY their own work)
50
+ 2. **Active theme**: `themes/<active>/_sections/...`
51
+ 3. **Base layer**: `themes/base/_sections/...` — the floor, same as the theming two-lane model
52
+
53
+ Theme sections live inside the installed package (never scaffolded into the consumer repo) — consumer git stays clean; framework updates flow.
54
+
55
+ ## 5. Authoring syntax
56
+
57
+ **Frontmatter is minimal forever**: meta title/description, permalink, page-level config only. Content lives in the body as section calls.
58
+
59
+ Inline form (simple args):
60
+ ```liquid
61
+ {% section "marketing/hero", headline: "Ship every surface" %}
62
+ ```
63
+
64
+ Block form (structured data — objects, arrays, N items):
65
+ ```liquid
66
+ {% section "marketing/testimonials" %}
67
+ headline: "What builders say"
68
+ items:
69
+ - quote: "Shipped in a weekend."
70
+ name: "Avery Quinn"
71
+ role: "Founder, Loopwork"
72
+ - quote: "One config. Every surface."
73
+ name: "Sam Okafor"
74
+ role: "CTO, Fieldnote"
75
+ {% endsection %}
76
+ ```
77
+
78
+ - Block body = YAML (same dialect as frontmatter). One tag, two forms; using both inline args and a block body on the same call is an error (simplicity first).
79
+ - **Amendment (Ian 2026-07-18, landed cp224) — slots**: the body may also carry named markup blocks (`{% slot demo_html %}<any html>{% endslot %}`), composing with inline args OR the YAML (the both-forms error applies to the YAML remainder). Slot content renders in the caller's scope and reaches the section as a finished-HTML string arg (schema type `html`), merged outermost and never re-rendered. Full contract: docs/web/sections.md.
80
+ - No args → the theme's default copy renders (defaults from `section.json5`).
81
+ - Components: `{% component "frame/browser", url: "app.example.com" %}` — same two forms.
82
+ - Sections must be **N-item responsive by design** (auto-fit grids etc.) — item count is data, layout self-adjusts; showcase demo data exercises 1/3/many variants.
83
+
84
+ ## 6. Schemas & validation (`section.json5`)
85
+
86
+ - Declares: args (name, type: string/number/bool/array/object/enum, default, description), demo data for the showcase (variants allowed).
87
+ - Build-time validation: unknown arg → warning with did-you-mean (`hero.headlin` → `headline`); type mismatch → warning. This is the typed-props benefit without changing engines.
88
+ - Schema names are **API** — renames are breaking and follow deprecation discipline (warn one minor, remove later).
89
+ - **Defaults ownership (cp205 ruling)**: a section used by ONE page lifts that page's default copy into its json5 (hero precedent); a section SHARED by multiple pages (testimonials: index + pricing + alternatives) keeps json5 defaults NEUTRAL — mechanical knobs only (e.g. the avatar placeholder frame) — and every caller passes its own copy over the data bridge, so no page can ever inherit another page's words.
90
+
91
+ ## 7. Assets
92
+
93
+ - **CSS**: every section's `section.scss` compiles into the theme sheet (stable order); **PurgeCSS (already in the pipeline) strips sections a site never renders** — shipped CSS self-trims, zero config.
94
+ - **JS**: section JS bundles into the theme bundle behind DOM-presence auto-init (`data-omega-section="marketing/hero"` → init only when present) — same pattern as the motion library. Manifest-driven per-section splitting stays available later if bundles fatten.
95
+ - **Page assets — `asset_path` is DEAD**, replaced by wildcard filenames (Next.js convention, Windows-safe):
96
+ - `js/pages/team/[id].js` / `css/pages/team/[id].scss` match any `/team/<segment>` page without an exact module; exact path beats wildcard.
97
+ - Internal uses convert too (`js/pages/blog/[slug].js`); zero frontmatter involved.
98
+
99
+ ## 8. Pages model — blueprints stay, absence is the spine
100
+
101
+ - **No file → theme/blueprint default renders** (Ian's loved behavior, preserved verbatim). Default pages become section compositions internally; pricing/contact/TOS keep filling from config.
102
+ - **`omega customize <url>`** (verb SETTLED, Ian 2026-07-18): materializes the page prefilled with the default composition as clean one-liners (no copy inlined) — consumer adds args only where they diverge. Nobody starts blank; nobody owns what they didn't change.
103
+ - Deep escape hatch unchanged: consumer-local theme file override = own that file forever (documented cost: its updates freeze).
104
+
105
+ ### Sample content (Ian 2026-07-18)
106
+
107
+ - Posts/teammates/updates-style filler stays **SHARED across themes** — never per-theme. Scope = that filler only; anything bigger goes back to Ian.
108
+ - It becomes **auto-generated with rolling current dates** (a virgin blog always looks alive, never "6 months stale") and materializes only under a **gitignored test path** in the consumer tree — never committed, never mixed with real brand content.
109
+
110
+ ### Update semantics (the truth table)
111
+
112
+ | Consumer state | Theme updates (html/css/js/copy) | What's preserved |
113
+ |---|---|---|
114
+ | No file | Everything flows | — (nothing to preserve) |
115
+ | Composition + args | All section internals flow; their words/composition preserved; framework NEVER writes consumer files | Their args + composition |
116
+ | Forked theme file | Nothing flows for that file | Everything (frozen at fork) |
117
+
118
+ Only schema renames can bite the middle row — governed by §6 deprecation + warnings.
119
+
120
+ ## 9. Showcase & docs — auto-generated
121
+
122
+ - The showcase iterates the section/component library and renders each entry with its `section.json5` demo data (all variants). New section → appears automatically. The showcase stops being a hand-built page.
123
+ - Reference docs generate from the same schemas (args table per section).
124
+
125
+ ## 10. Multilanguage
126
+
127
+ - **The existing post-build translation system stays THE mechanism** (`packages/web/src/translate/`): reads built HTML, translates text units via `@omega.js/devkit/translate` (default provider: Claude on the local install), per-string cache committed in the consumer repo (hand-fix any string, it sticks), emits static `/{lang}/…` copies with lang/dir, rewritten links, honest hreflang. SEO-correct, zero manual translation.
128
+ - Raw-liquid translation rejected (MT mangles template syntax). Data-level translation rejected as the pipeline (would need a second pipeline for prose anyway).
129
+ - Section contract additions: code-y components (terminal, code frames, commands) carry the standard `translate="no"` attribute; a future per-locale arg-override lane (hand-tuned marketing headlines) rides the same committed cache.
130
+
131
+ ## 11. Cross-framework standardization (Ian 2026-07-18: design once, never again)
132
+
133
+ - **`@omega.js/web`'s engine is the single HTML factory for every framework's HTML surfaces.** Desktop windows/pages and extension popup/options pages are BUILT by it (target-scoped page sets via `targets.*` config); no framework ever reimplements templates, sections, theming, or translation.
134
+ - **One design contract across surfaces**: the `--omega-*` token sheet + `.omega-shell` chrome (already shipped) — sections ride on it.
135
+ - **One translator**: `@omega.js/devkit/translate` — the post-build pass runs over any built HTML dir regardless of target.
136
+ - Realistic surface scope: desktop inherits full pages via the website; extension shares tokens + small components (buttons, cards, frames) — marketing bands in a popup are a non-goal.
137
+ - Enabled entirely by the context-free rule (§2).
138
+
139
+ ## 12. Engine ruling — Liquid stays this generation
140
+
141
+ - Market reality (2026): Liquid alive and huge (Shopify engine, Eleventy first-class); the modern paradigm is components-with-typed-props (Astro/JSX/Svelte; WebC is Eleventy's answer). Greenfield would evaluate Astro seriously.
142
+ - We are not greenfield: the layered file-override model works BECAUSE Liquid templates are interpreted at build from whichever file wins the chain (compile-time imports would break it); two themes are finished; consumers never write Liquid — they write one-liner calls + YAML.
143
+ - Sections + schemas capture the typed-props/scoped-assets benefit at ~10% of a rewrite's cost. **Sections are the migration unit** if omega v2 ever switches engines. Revisit at the next major, not before.
144
+
145
+ ## 13. Sequencing (the locked map, updated)
146
+
147
+ 1. ~~Ian ratifies this spec~~ **RATIFIED 2026-07-18**
148
+ 2. **Extraction refactor**: classy + newsflash layouts → section/component libraries. `packages/web` only (playground-freeze-safe); corpus/golden-master pins output identical
149
+ 3. **Content pass A — omega-ify the playground**: real framework pitch as compositions/args; playground = the living draft of the real site
150
+ 4. **Content pass B — genericize classy**: sweep omega dev-accents from theme defaults (theme speaks generic SaaS; promoting OMEGA is a brand's job); optional per-theme sample posts/team
151
+ 5. **Showcase**: auto-generated from the library (§9)
152
+ 6. ~~**Arc close — THE FORK**: real omegajs.dev sub-brand born fresh outside the monorepo on published omega (fresh repo, fresh production Firebase, omegajs.dev zone, CI deploys); playground's polished content copies over 1:1.~~ **AMENDED + LANDED 2026-07-18 (Ian, cp229): the fork went LOCAL-FIRST** — born EARLY at `../omegajs.dev` (sibling repo) on relative `file:` specs into the monorepo ("still use local … until we are fully locked on all decisions that may result in breaking changes"), versions pre-reset to 1.0.0 (cp228) so first publish flips the specs to `^1.0.0` seamlessly; content forked 1:1 as specced (stale es caches dropped + re-translated fresh); **"published omega, fresh production Firebase, omegajs.dev zone, CI deploys" are now LAUNCH GATES, not birth conditions.** **The playground stays in the monorepo forever as the dedicated live test brand** (real Firebase, zero customer risk, break it freely)
153
+ 7. Post-arc: company umbrella brand + sub-brand rebuilds (existing hard gates unchanged; the config `company` layer already models the umbrella)
154
+
155
+ ## 14. Open items — ALL RESOLVED (Ian, 2026-07-18)
156
+
157
+ - Verb name → **`omega customize <url>`**
158
+ - Per-theme sample content → **NO — shared filler stays shared**, but it becomes auto-generated + gitignored-test-path isolated (see §8)
159
+ - Playground deploys after the fork → **BOTH lanes**: simple direct push is the normal lane (CI runs cost real money), and the full CI-dispatch path gets deliberately exercised every once in a while so it stays proven
@@ -0,0 +1,112 @@
1
+ # The page paint contract
2
+
3
+ What every page owes a visitor in its first frame, and what it may make them
4
+ wait for. Ratified by Ian on 2026-08-27
5
+ ([#637](https://github.com/Omega-JS-Stack/omega/issues/637)) after the checkout
6
+ page held its prices behind a cold backend.
7
+
8
+ The rules are five. They apply to every page in `packages/web/core/js/pages/`
9
+ and to every consumer page built on this framework.
10
+
11
+ ## 1. Static content paints immediately
12
+
13
+ A page never hides its DOM waiting for auth. Everything the build already knows
14
+ goes on screen in the first frame: copy, prices from the payment config, plan
15
+ tiles, buttons, forms.
16
+
17
+ Redirects are not the page's job. The global auth policy owns them
18
+ (`packages/web/core/js/core/auth.js`): a visitor in the wrong state is sent
19
+ elsewhere before the page code runs. A page that hides itself "in case" is
20
+ hiding from a visitor who is allowed to be there.
21
+
22
+ That listener also owns the MID-SESSION case: it redirects the moment
23
+ @omega.js/client's session probe signs a dead session out, so a revoked,
24
+ disabled or deleted account leaves an `authenticated` page for sign-in with no
25
+ reload ([the session probe](../client/index.md#the-session-probe-omegaauthprobesession),
26
+ [#798](https://github.com/Omega-JS-Stack/omega/issues/798)).
27
+
28
+ ## 2. User data arrives through bindings
29
+
30
+ Anything that depends on the signed-in user renders through
31
+ `data-omega-bind`, with a skeleton on the element until it fills. The client
32
+ fills the `auth`, `usage`, `config` and `device` roots on every page when auth
33
+ settles (`packages/client/src/modules/auth.js`). Page code does not repeat that
34
+ work.
35
+
36
+ Page code awaits auth for exactly one reason: to make a request that needs the
37
+ user. Never to decide whether to draw something.
38
+
39
+ ## 3. An answer the visitor acts on resolves ONCE
40
+
41
+ Trial eligibility, the current plan, the price actually being charged: the
42
+ visitor decides with these, so they must never flip from one answer to another
43
+ while being read.
44
+
45
+ The spot holding such an answer keeps its skeleton until the answer lands, and
46
+ then renders once. The rest of the page is already painted around it. Only the
47
+ spot waits.
48
+
49
+ The bindings root key is the unit of deferral. `bindings.update()` filters by
50
+ the top-level keys it was handed, so a spot that must wait belongs to a root
51
+ the early paint does not publish
52
+ ([packages/client/docs/bindings.md](../../packages/client/docs/bindings.md)).
53
+ Checkout is the worked example: its build-config half publishes `checkout`, and
54
+ the money line and trial spot live under `order`, written once when eligibility
55
+ answers.
56
+
57
+ ## 4. Every wait has a deadline and a named fallback
58
+
59
+ A network wait behind user-visible copy gets a timeout, a constant that names
60
+ it, and a fallback state that is a decision rather than an accident. The
61
+ fallback is logged as a warning when it fires.
62
+
63
+ Pick the fallback that keeps the page's promises.
64
+
65
+ Checkout's trial check has THREE answers, not two: yes, no, and unknown. A
66
+ check that timed out or failed is unknown, and the page splits that answer in
67
+ two (Ian 2026-08-27). What it SHOWS stays conservative: no trial quoted, the
68
+ full amount due today, because rule 3 never shows a price the server has not
69
+ confirmed. What it ASKS FOR in the intent payload is the trial anyway, because
70
+ the intent route re-checks eligibility against the buyer's own order history and
71
+ silently downgrades anyone who does not qualify. Asking costs a non-qualifying
72
+ buyer nothing; not asking would cost a qualifying one their offer over a slow
73
+ network. A visitor is never quoted a price they are not charged, and never
74
+ loses an offer to a timeout.
75
+
76
+ ## 5. Forms gate their submit control
77
+
78
+ Every form uses FormManager
79
+ (`@omega.js/client/modules/form-manager.js`). When a form must not be submitted
80
+ until an async answer is in, the page registers a gate per answer before it
81
+ calls `ready()`:
82
+
83
+ ```javascript
84
+ formManager.addGate('eligibility');
85
+ formManager.addGate('recaptcha');
86
+ formManager.ready(); // held: the form stays `initializing`
87
+ ...
88
+ formManager.resolveGate('recaptcha');
89
+ formManager.resolveGate('eligibility'); // the last one arms the form
90
+ ```
91
+
92
+ The submit controls stay disabled while a gate is open. The rest of the form
93
+ stays live, so the visitor can still read it and change their choices. Both
94
+ calls fail loudly on a mistake: a gate added after the form armed throws, and so
95
+ does resolving a name that opened no gate (a typo would otherwise leave the form
96
+ gated forever).
97
+
98
+ ## Reading a page against the contract
99
+
100
+ Four questions, in order:
101
+
102
+ 1. Does anything in the first frame wait on a promise? If yes, does it need the
103
+ user, or was the answer already in the build config?
104
+ 2. Is any element hidden pending auth that the auth policy already protects?
105
+ 3. Can any user-visible value be written twice with two different answers?
106
+ 4. Does every wait behind visible copy have a deadline and a named fallback?
107
+
108
+ ## Related
109
+
110
+ - [docs/web/index.md](index.md) — the web framework guide
111
+ - [docs/client/index.md](../client/index.md) — the runtime that fills the bindings
112
+ - [packages/client/docs/bindings.md](../../packages/client/docs/bindings.md) — `data-omega-bind`, skeletons, root-key update filtering