@omega.js/web 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1162) hide show
  1. package/LICENSE +98 -0
  2. package/README.md +640 -0
  3. package/bin/omega +2 -0
  4. package/bin/omega-web +2 -0
  5. package/bin/omg +2 -0
  6. package/core/_includes/admin/sections/sidebar.json +100 -0
  7. package/core/_includes/admin/sections/topbar.json +11 -0
  8. package/core/_includes/backend/sections/sidebar.json +39 -0
  9. package/core/_includes/backend/sections/topbar.json +16 -0
  10. package/core/_includes/core/body.html +102 -0
  11. package/core/_includes/core/foot.html +536 -0
  12. package/core/_includes/core/head.html +423 -0
  13. package/core/_includes/core/pricing/price-per-unit.html +33 -0
  14. package/core/_includes/core/showcase/entry-body.html +94 -0
  15. package/core/_includes/core/showcase/index-body.html +43 -0
  16. package/core/_includes/core/showcase/nav.html +60 -0
  17. package/core/_includes/frontend/sections/footer.json +74 -0
  18. package/core/_includes/frontend/sections/nav.json +70 -0
  19. package/core/_includes/global/sections/account.json +31 -0
  20. package/core/_includes/modules/engagement/giscus.html +26 -0
  21. package/core/_layouts/blueprint/404.html +10 -0
  22. package/core/_layouts/blueprint/about.html +10 -0
  23. package/core/_layouts/blueprint/account/index.html +11 -0
  24. package/core/_layouts/blueprint/admin/calendar/index.html +590 -0
  25. package/core/_layouts/blueprint/admin/dashboard/index.html +301 -0
  26. package/core/_layouts/blueprint/admin/firebase/index.html +214 -0
  27. package/core/_layouts/blueprint/admin/posts/editor.html +157 -0
  28. package/core/_layouts/blueprint/admin/posts/index.html +126 -0
  29. package/core/_layouts/blueprint/admin/stackblitz/index.html +30 -0
  30. package/core/_layouts/blueprint/admin/studio/index.html +85 -0
  31. package/core/_layouts/blueprint/admin/users/index.html +272 -0
  32. package/core/_layouts/blueprint/admin/users/new.html +82 -0
  33. package/core/_layouts/blueprint/admin/verts/index.html +204 -0
  34. package/core/_layouts/blueprint/alternatives/alternative.html +15 -0
  35. package/core/_layouts/blueprint/alternatives/index.html +10 -0
  36. package/core/_layouts/blueprint/app.html +10 -0
  37. package/core/_layouts/blueprint/auth/reset.html +19 -0
  38. package/core/_layouts/blueprint/auth/signin.html +19 -0
  39. package/core/_layouts/blueprint/auth/signup.html +19 -0
  40. package/core/_layouts/blueprint/auth/token.html +19 -0
  41. package/core/_layouts/blueprint/blog/categories/category.html +8 -0
  42. package/core/_layouts/blueprint/blog/categories/index.html +11 -0
  43. package/core/_layouts/blueprint/blog/index.html +10 -0
  44. package/core/_layouts/blueprint/blog/post.html +5 -0
  45. package/core/_layouts/blueprint/blog/tags/index.html +11 -0
  46. package/core/_layouts/blueprint/blog/tags/tag.html +8 -0
  47. package/core/_layouts/blueprint/careers.md +13 -0
  48. package/core/_layouts/blueprint/collection/category.html +9 -0
  49. package/core/_layouts/blueprint/collection/document.html +9 -0
  50. package/core/_layouts/blueprint/collection/index.html +9 -0
  51. package/core/_layouts/blueprint/connections/callback.html +11 -0
  52. package/core/_layouts/blueprint/contact.html +14 -0
  53. package/core/_layouts/blueprint/dashboard/index.html +10 -0
  54. package/core/_layouts/blueprint/download.html +20 -0
  55. package/core/_layouts/blueprint/extension/index.html +14 -0
  56. package/core/_layouts/blueprint/extension/installed.html +11 -0
  57. package/core/_layouts/blueprint/feedback.html +10 -0
  58. package/core/_layouts/blueprint/index.html +16 -0
  59. package/core/_layouts/blueprint/legal/cookies.md +57 -0
  60. package/core/_layouts/blueprint/legal/privacy.md +109 -0
  61. package/core/_layouts/blueprint/legal/terms.md +155 -0
  62. package/core/_layouts/blueprint/payment/checkout.html +15 -0
  63. package/core/_layouts/blueprint/payment/confirmation.html +14 -0
  64. package/core/_layouts/blueprint/portal/email-preferences.html +15 -0
  65. package/core/_layouts/blueprint/pricing.html +20 -0
  66. package/core/_layouts/blueprint/status.html +10 -0
  67. package/core/_layouts/blueprint/team/index.html +10 -0
  68. package/core/_layouts/blueprint/team/member.html +5 -0
  69. package/core/_layouts/blueprint/updates/index.html +10 -0
  70. package/core/_layouts/blueprint/updates/update.html +10 -0
  71. package/core/_layouts/core/root.html +45 -0
  72. package/core/_layouts/modules/utilities/redirect.html +129 -0
  73. package/core/css/_studio.scss +237 -0
  74. package/core/css/components/_index.scss +146 -0
  75. package/core/css/core/_.scss +0 -0
  76. package/core/css/core/_alert.scss +87 -0
  77. package/core/css/core/_animations.scss +343 -0
  78. package/core/css/core/_bindings.scss +116 -0
  79. package/core/css/core/_blog-search.scss +57 -0
  80. package/core/css/core/_chatsy.scss +61 -0
  81. package/core/css/core/_consent.scss +424 -0
  82. package/core/css/core/_custom-font-awesome.scss +146 -0
  83. package/core/css/core/_exit-popup.scss +42 -0
  84. package/core/css/core/_generated-badge.scss +33 -0
  85. package/core/css/core/_initialize.scss +29 -0
  86. package/core/css/core/_lazy-loading.scss +104 -0
  87. package/core/css/core/_social-sharing.scss +41 -0
  88. package/core/css/core/_tones.scss +32 -0
  89. package/core/css/core/_utilities.scss +157 -0
  90. package/core/css/main.scss +54 -0
  91. package/core/css/motion/_index.scss +368 -0
  92. package/core/css/pages/404/index.scss +0 -0
  93. package/core/css/pages/admin/calendar/index.scss +692 -0
  94. package/core/css/pages/admin/firebase/index.scss +33 -0
  95. package/core/css/pages/admin/index.scss +9 -0
  96. package/core/css/pages/admin/users/index.scss +9 -0
  97. package/core/css/pages/admin/verts/index.scss +9 -0
  98. package/core/css/pages/alternatives/[alternative]/index.scss +0 -0
  99. package/core/css/pages/blog/[slug].scss +55 -0
  100. package/core/css/pages/dashboard/account/index.scss +242 -0
  101. package/core/css/pages/download/index.scss +480 -0
  102. package/core/css/pages/extension/installed/index.scss +317 -0
  103. package/core/css/pages/feedback/index.scss +31 -0
  104. package/core/css/pages/payment/confirmation/index.scss +14 -0
  105. package/core/css/pages/pricing/index.scss +0 -0
  106. package/core/css/pages/status/index.scss +162 -0
  107. package/core/css/pages/test/libraries/layers/index.scss +28 -0
  108. package/core/css/pages/updates/[update].scss +46 -0
  109. package/core/css/pages/updates/index.scss +13 -0
  110. package/core/css/shell/_index.scss +207 -0
  111. package/core/css/tokens/_index.scss +166 -0
  112. package/core/icons/flags/ar.svg +1 -0
  113. package/core/icons/flags/bd.svg +1 -0
  114. package/core/icons/flags/ca.svg +1 -0
  115. package/core/icons/flags/ch.svg +1 -0
  116. package/core/icons/flags/cn.svg +1 -0
  117. package/core/icons/flags/co.svg +1 -0
  118. package/core/icons/flags/cw.svg +1 -0
  119. package/core/icons/flags/cz.svg +1 -0
  120. package/core/icons/flags/de.svg +1 -0
  121. package/core/icons/flags/dk.svg +1 -0
  122. package/core/icons/flags/eg.svg +1 -0
  123. package/core/icons/flags/es.svg +1 -0
  124. package/core/icons/flags/fi.svg +1 -0
  125. package/core/icons/flags/fr.svg +1 -0
  126. package/core/icons/flags/gb.svg +1 -0
  127. package/core/icons/flags/gq.svg +1 -0
  128. package/core/icons/flags/gr.svg +1 -0
  129. package/core/icons/flags/gt.svg +1 -0
  130. package/core/icons/flags/hn.svg +1 -0
  131. package/core/icons/flags/id.svg +1 -0
  132. package/core/icons/flags/ie.svg +1 -0
  133. package/core/icons/flags/in.svg +1 -0
  134. package/core/icons/flags/ir.svg +1 -0
  135. package/core/icons/flags/it.svg +1 -0
  136. package/core/icons/flags/jp.svg +1 -0
  137. package/core/icons/flags/kp.svg +1 -0
  138. package/core/icons/flags/kr.svg +1 -0
  139. package/core/icons/flags/ly.svg +1 -0
  140. package/core/icons/flags/ma.svg +1 -0
  141. package/core/icons/flags/mu.svg +1 -0
  142. package/core/icons/flags/mx.svg +1 -0
  143. package/core/icons/flags/ng.svg +1 -0
  144. package/core/icons/flags/pa.svg +1 -0
  145. package/core/icons/flags/ph.svg +1 -0
  146. package/core/icons/flags/pk.svg +1 -0
  147. package/core/icons/flags/pt.svg +1 -0
  148. package/core/icons/flags/ru.svg +1 -0
  149. package/core/icons/flags/sa.svg +1 -0
  150. package/core/icons/flags/sd.svg +1 -0
  151. package/core/icons/flags/se.svg +1 -0
  152. package/core/icons/flags/th.svg +1 -0
  153. package/core/icons/flags/tm.svg +1 -0
  154. package/core/icons/flags/tr.svg +1 -0
  155. package/core/icons/flags/us.svg +1 -0
  156. package/core/icons/flags/uy.svg +1 -0
  157. package/core/icons/flags/vn.svg +1 -0
  158. package/core/icons/flags/za.svg +1 -0
  159. package/core/images/exit-popup/subscriber-1.jpg +0 -0
  160. package/core/images/exit-popup/subscriber-2.jpg +0 -0
  161. package/core/images/exit-popup/subscriber-3.jpg +0 -0
  162. package/core/images/exit-popup/subscriber-4.jpg +0 -0
  163. package/core/images/placeholder/photo-1.jpg +0 -0
  164. package/core/images/placeholder/photo-2.jpg +0 -0
  165. package/core/images/placeholder/photo-3.jpg +0 -0
  166. package/core/js/core/analytics-loader.js +253 -0
  167. package/core/js/core/app-shell.js +136 -0
  168. package/core/js/core/appearance.js +195 -0
  169. package/core/js/core/auth.js +457 -0
  170. package/core/js/core/complete.js +72 -0
  171. package/core/js/core/consent.js +384 -0
  172. package/core/js/core/dev-icon-audit.js +63 -0
  173. package/core/js/core/dev-palette.js +670 -0
  174. package/core/js/core/dev-sections.js +53 -0
  175. package/core/js/core/exit-popup.js +276 -0
  176. package/core/js/core/initialize.js +8 -0
  177. package/core/js/core/language-switcher.js +167 -0
  178. package/core/js/core/lazy-loading.js +479 -0
  179. package/core/js/core/motion.js +28 -0
  180. package/core/js/core/query-strings.js +146 -0
  181. package/core/js/core/service-worker.js +28 -0
  182. package/core/js/core/social-sharing.js +293 -0
  183. package/core/js/first-paint.js +35 -0
  184. package/core/js/layouts/modules/utilities/redirect.js +122 -0
  185. package/core/js/libs/admin-helpers.js +62 -0
  186. package/core/js/libs/alert-dismiss.js +35 -0
  187. package/core/js/libs/analytics.js +368 -0
  188. package/core/js/libs/auth/email.js +144 -0
  189. package/core/js/libs/auth/errors.js +119 -0
  190. package/core/js/libs/auth/forms.js +206 -0
  191. package/core/js/libs/auth/index.js +181 -0
  192. package/core/js/libs/auth/oauth.js +394 -0
  193. package/core/js/libs/auth/orphan.js +110 -0
  194. package/core/js/libs/auth/password-toggle.js +44 -0
  195. package/core/js/libs/auth/session-params.js +266 -0
  196. package/core/js/libs/auth/tracking.js +41 -0
  197. package/core/js/libs/charts.js +516 -0
  198. package/core/js/libs/consent-region.js +127 -0
  199. package/core/js/libs/dev.js +150 -0
  200. package/core/js/libs/graph.js +201 -0
  201. package/core/js/libs/initialize-tooltips.js +31 -0
  202. package/core/js/libs/logger.js +38 -0
  203. package/core/js/libs/omega-copy.js +89 -0
  204. package/core/js/libs/path-prefix.js +44 -0
  205. package/core/js/libs/payment-config.js +76 -0
  206. package/core/js/libs/recaptcha.js +94 -0
  207. package/core/js/libs/sale-name.js +295 -0
  208. package/core/js/libs/showcase-frames.js +37 -0
  209. package/core/js/libs/srcset.js +69 -0
  210. package/core/js/libs/tracking-consent.js +161 -0
  211. package/core/js/main.js +144 -0
  212. package/core/js/pages/404/index.js +57 -0
  213. package/core/js/pages/admin/calendar/calendar-core.js +701 -0
  214. package/core/js/pages/admin/calendar/calendar-events.js +853 -0
  215. package/core/js/pages/admin/calendar/calendar-renderer.js +807 -0
  216. package/core/js/pages/admin/calendar/campaign-preview.js +105 -0
  217. package/core/js/pages/admin/calendar/index.js +40 -0
  218. package/core/js/pages/admin/firebase/index.js +727 -0
  219. package/core/js/pages/admin/index.js +531 -0
  220. package/core/js/pages/admin/posts/editor/index.js +230 -0
  221. package/core/js/pages/admin/posts/index.js +237 -0
  222. package/core/js/pages/admin/studio/index.js +538 -0
  223. package/core/js/pages/admin/users/index.js +669 -0
  224. package/core/js/pages/admin/users/new/index.js +65 -0
  225. package/core/js/pages/admin/verts/index.js +407 -0
  226. package/core/js/pages/alternatives/[alternative]/index.js +17 -0
  227. package/core/js/pages/app/index.js +135 -0
  228. package/core/js/pages/blog/[slug].js +132 -0
  229. package/core/js/pages/blog/_search.mjs +108 -0
  230. package/core/js/pages/blog/index.js +193 -0
  231. package/core/js/pages/blog/page/[num]/index.js +7 -0
  232. package/core/js/pages/connections/callback/index.js +148 -0
  233. package/core/js/pages/contact/index.js +170 -0
  234. package/core/js/pages/cookies.js +2 -0
  235. package/core/js/pages/dashboard/account/index.js +366 -0
  236. package/core/js/pages/dashboard/account/modules/orders.js +82 -0
  237. package/core/js/pages/dashboard/account/sections/api-keys.js +149 -0
  238. package/core/js/pages/dashboard/account/sections/billing.js +1667 -0
  239. package/core/js/pages/dashboard/account/sections/connections.js +333 -0
  240. package/core/js/pages/dashboard/account/sections/data-request.js +225 -0
  241. package/core/js/pages/dashboard/account/sections/delete.js +80 -0
  242. package/core/js/pages/dashboard/account/sections/notifications.js +167 -0
  243. package/core/js/pages/dashboard/account/sections/orders.js +151 -0
  244. package/core/js/pages/dashboard/account/sections/profile.js +200 -0
  245. package/core/js/pages/dashboard/account/sections/referrals.js +217 -0
  246. package/core/js/pages/dashboard/account/sections/refund.js +253 -0
  247. package/core/js/pages/dashboard/account/sections/security.js +726 -0
  248. package/core/js/pages/dashboard/account/sections/team.js +247 -0
  249. package/core/js/pages/download/index.js +418 -0
  250. package/core/js/pages/extension/index.js +164 -0
  251. package/core/js/pages/extension/installed/index.js +135 -0
  252. package/core/js/pages/feedback/index.js +193 -0
  253. package/core/js/pages/legal/_document.js +91 -0
  254. package/core/js/pages/payment/checkout/index.js +420 -0
  255. package/core/js/pages/payment/checkout/modules/api.js +139 -0
  256. package/core/js/pages/payment/checkout/modules/dev-section.js +175 -0
  257. package/core/js/pages/payment/checkout/modules/discount.js +69 -0
  258. package/core/js/pages/payment/checkout/modules/pricing.js +73 -0
  259. package/core/js/pages/payment/checkout/modules/state.js +339 -0
  260. package/core/js/pages/payment/checkout/modules/tracking.js +54 -0
  261. package/core/js/pages/payment/confirmation/index.js +91 -0
  262. package/core/js/pages/payment/confirmation/modules/celebration.js +45 -0
  263. package/core/js/pages/payment/confirmation/modules/state.js +112 -0
  264. package/core/js/pages/payment/confirmation/modules/tracking.js +133 -0
  265. package/core/js/pages/payment/confirmation/modules/verify.js +142 -0
  266. package/core/js/pages/portal/email-preferences/index.js +183 -0
  267. package/core/js/pages/pricing/index.js +425 -0
  268. package/core/js/pages/privacy.js +2 -0
  269. package/core/js/pages/reset/index.js +12 -0
  270. package/core/js/pages/signin/index.js +22 -0
  271. package/core/js/pages/signup/index.js +23 -0
  272. package/core/js/pages/status/index.js +687 -0
  273. package/core/js/pages/terms.js +2 -0
  274. package/core/js/pages/test/components/[category]/[name]/index.js +26 -0
  275. package/core/js/pages/test/libraries/appearance/index.js +220 -0
  276. package/core/js/pages/test/libraries/form-manager/index.js +328 -0
  277. package/core/js/pages/test/libraries/layers/index.js +16 -0
  278. package/core/js/pages/test/libraries/verts/index.js +68 -0
  279. package/core/js/pages/test/sections/[category]/[name]/index.js +28 -0
  280. package/core/js/pages/test/styleguide/index.js +35 -0
  281. package/core/js/pages/token/index.js +203 -0
  282. package/core/logos/brandmarks/original/apple-app-store.svg +1 -0
  283. package/core/logos/brandmarks/original/apple.svg +6 -0
  284. package/core/logos/brandmarks/original/bitbucket.svg +14 -0
  285. package/core/logos/brandmarks/original/bitcoin.svg +1 -0
  286. package/core/logos/brandmarks/original/bluesky.svg +7 -0
  287. package/core/logos/brandmarks/original/bootstrap.svg +43 -0
  288. package/core/logos/brandmarks/original/brave.svg +1 -0
  289. package/core/logos/brandmarks/original/chrome.svg +1 -0
  290. package/core/logos/brandmarks/original/discord.svg +1 -0
  291. package/core/logos/brandmarks/original/dropbox.svg +10 -0
  292. package/core/logos/brandmarks/original/edge.svg +1 -0
  293. package/core/logos/brandmarks/original/facebook-f.svg +1 -0
  294. package/core/logos/brandmarks/original/facebook.svg +8 -0
  295. package/core/logos/brandmarks/original/figma.svg +10 -0
  296. package/core/logos/brandmarks/original/firefox.svg +1 -0
  297. package/core/logos/brandmarks/original/github.svg +6 -0
  298. package/core/logos/brandmarks/original/gitlab.svg +17 -0
  299. package/core/logos/brandmarks/original/google-a-s.svg +1 -0
  300. package/core/logos/brandmarks/original/google-chrome-webstore.svg +49 -0
  301. package/core/logos/brandmarks/original/google-play-store.svg +1 -0
  302. package/core/logos/brandmarks/original/google-web-search.svg +1 -0
  303. package/core/logos/brandmarks/original/google.svg +1 -0
  304. package/core/logos/brandmarks/original/gulp.svg +4 -0
  305. package/core/logos/brandmarks/original/html-5.svg +1 -0
  306. package/core/logos/brandmarks/original/instagram.svg +1 -0
  307. package/core/logos/brandmarks/original/javascript.svg +1 -0
  308. package/core/logos/brandmarks/original/jira.svg +18 -0
  309. package/core/logos/brandmarks/original/kick.svg +7 -0
  310. package/core/logos/brandmarks/original/linkedin.svg +1 -0
  311. package/core/logos/brandmarks/original/linux.svg +28 -0
  312. package/core/logos/brandmarks/original/messenger.svg +16 -0
  313. package/core/logos/brandmarks/original/microsoft.svg +1 -0
  314. package/core/logos/brandmarks/original/npm.svg +8 -0
  315. package/core/logos/brandmarks/original/opera.svg +1 -0
  316. package/core/logos/brandmarks/original/patreon.svg +6 -0
  317. package/core/logos/brandmarks/original/pinterest.svg +6 -0
  318. package/core/logos/brandmarks/original/reddit.svg +1 -0
  319. package/core/logos/brandmarks/original/safari.svg +31 -0
  320. package/core/logos/brandmarks/original/sass.svg +3 -0
  321. package/core/logos/brandmarks/original/signal.svg +6 -0
  322. package/core/logos/brandmarks/original/skype.svg +47 -0
  323. package/core/logos/brandmarks/original/slack.svg +33 -0
  324. package/core/logos/brandmarks/original/soundcloud.svg +1 -0
  325. package/core/logos/brandmarks/original/spotify.svg +5 -0
  326. package/core/logos/brandmarks/original/steam.svg +6 -0
  327. package/core/logos/brandmarks/original/telegram.svg +14 -0
  328. package/core/logos/brandmarks/original/tiktok.svg +1 -0
  329. package/core/logos/brandmarks/original/trello.svg +16 -0
  330. package/core/logos/brandmarks/original/tumblr.svg +1 -0
  331. package/core/logos/brandmarks/original/twitch.svg +6 -0
  332. package/core/logos/brandmarks/original/twitter.svg +6 -0
  333. package/core/logos/brandmarks/original/unity.svg +6 -0
  334. package/core/logos/brandmarks/original/x.svg +7 -0
  335. package/core/logos/brandmarks/original/yahoo-y.svg +1 -0
  336. package/core/logos/brandmarks/original/youtube-square.svg +1 -0
  337. package/core/logos/brandmarks/original/youtube.svg +1 -0
  338. package/core/logos/combomarks/dark/airbnb.svg +30 -0
  339. package/core/logos/combomarks/dark/slack.svg +38 -0
  340. package/core/logos/combomarks/dark/spotify.svg +35 -0
  341. package/core/logos/combomarks/dark/twilio.svg +26 -0
  342. package/core/logos/combomarks/dark/weebly.svg +35 -0
  343. package/core/logos/combomarks/gray/airbnb.svg +33 -0
  344. package/core/logos/combomarks/gray/alphabet.svg +23 -0
  345. package/core/logos/combomarks/gray/amazon.svg +38 -0
  346. package/core/logos/combomarks/gray/boring-company.svg +91 -0
  347. package/core/logos/combomarks/gray/burberry.svg +239 -0
  348. package/core/logos/combomarks/gray/embark.svg +21 -0
  349. package/core/logos/combomarks/gray/fitbit.svg +61 -0
  350. package/core/logos/combomarks/gray/fred-perry.svg +94 -0
  351. package/core/logos/combomarks/gray/google.svg +27 -0
  352. package/core/logos/combomarks/gray/hollister.svg +34 -0
  353. package/core/logos/combomarks/gray/hubspot.svg +27 -0
  354. package/core/logos/combomarks/gray/kaplan.svg +33 -0
  355. package/core/logos/combomarks/gray/lenovo.svg +27 -0
  356. package/core/logos/combomarks/gray/levis.svg +25 -0
  357. package/core/logos/combomarks/gray/mapbox.svg +37 -0
  358. package/core/logos/combomarks/gray/netflix.svg +15 -0
  359. package/core/logos/combomarks/gray/new-balance.svg +32 -0
  360. package/core/logos/combomarks/gray/nike.svg +17 -0
  361. package/core/logos/combomarks/gray/paypal.svg +41 -0
  362. package/core/logos/combomarks/gray/puma.svg +82 -0
  363. package/core/logos/combomarks/gray/samsung.svg +26 -0
  364. package/core/logos/combomarks/gray/shopify.svg +36 -0
  365. package/core/logos/combomarks/gray/slack.svg +42 -0
  366. package/core/logos/combomarks/gray/spotify.svg +38 -0
  367. package/core/logos/combomarks/gray/stripe.svg +24 -0
  368. package/core/logos/combomarks/gray/tnf.svg +30 -0
  369. package/core/logos/combomarks/gray/twilio.svg +29 -0
  370. package/core/logos/combomarks/gray/uber.svg +24 -0
  371. package/core/logos/combomarks/gray/weebly.svg +38 -0
  372. package/core/logos/combomarks/original/airbnb.svg +33 -0
  373. package/core/logos/combomarks/original/alphabet.svg +23 -0
  374. package/core/logos/combomarks/original/amazon.svg +38 -0
  375. package/core/logos/combomarks/original/asana.svg +8 -0
  376. package/core/logos/combomarks/original/boring-company.svg +91 -0
  377. package/core/logos/combomarks/original/discord.svg +6 -0
  378. package/core/logos/combomarks/original/embark.svg +24 -0
  379. package/core/logos/combomarks/original/fitbit.svg +60 -0
  380. package/core/logos/combomarks/original/github.svg +6 -0
  381. package/core/logos/combomarks/original/gitlab.svg +20 -0
  382. package/core/logos/combomarks/original/google.svg +28 -0
  383. package/core/logos/combomarks/original/hubspot.svg +29 -0
  384. package/core/logos/combomarks/original/instagram.svg +7 -0
  385. package/core/logos/combomarks/original/kickstarter.svg +6 -0
  386. package/core/logos/combomarks/original/lenovo.svg +24 -0
  387. package/core/logos/combomarks/original/linkedin.svg +6 -0
  388. package/core/logos/combomarks/original/mapbox.svg +39 -0
  389. package/core/logos/combomarks/original/mastodon.svg +7 -0
  390. package/core/logos/combomarks/original/medium.svg +6 -0
  391. package/core/logos/combomarks/original/meta.svg +22 -0
  392. package/core/logos/combomarks/original/microsoft.svg +13 -0
  393. package/core/logos/combomarks/original/monday.svg +12 -0
  394. package/core/logos/combomarks/original/netflix.svg +15 -0
  395. package/core/logos/combomarks/original/notion.svg +9 -0
  396. package/core/logos/combomarks/original/paypal.svg +41 -0
  397. package/core/logos/combomarks/original/reddit.svg +13 -0
  398. package/core/logos/combomarks/original/samsung.svg +25 -0
  399. package/core/logos/combomarks/original/shopify.svg +35 -0
  400. package/core/logos/combomarks/original/slack.svg +47 -0
  401. package/core/logos/combomarks/original/spotify.svg +37 -0
  402. package/core/logos/combomarks/original/stackoverflow.svg +28 -0
  403. package/core/logos/combomarks/original/stripe.svg +24 -0
  404. package/core/logos/combomarks/original/tiktok.svg +12 -0
  405. package/core/logos/combomarks/original/tumblr.svg +6 -0
  406. package/core/logos/combomarks/original/uber.svg +24 -0
  407. package/core/logos/combomarks/original/weebly.svg +34 -0
  408. package/core/logos/combomarks/original/whatsapp.svg +20 -0
  409. package/core/logos/combomarks/original/youtube.svg +10 -0
  410. package/core/logos/combomarks/original/zoom.svg +7 -0
  411. package/core/logos/combomarks/white/airbnb.svg +33 -0
  412. package/core/logos/combomarks/white/alphabet.svg +23 -0
  413. package/core/logos/combomarks/white/amazon.svg +38 -0
  414. package/core/logos/combomarks/white/boring-company.svg +91 -0
  415. package/core/logos/combomarks/white/embark.svg +21 -0
  416. package/core/logos/combomarks/white/fitbit.svg +61 -0
  417. package/core/logos/combomarks/white/google.svg +27 -0
  418. package/core/logos/combomarks/white/hubspot.svg +27 -0
  419. package/core/logos/combomarks/white/kaplan.svg +33 -0
  420. package/core/logos/combomarks/white/lenovo.svg +27 -0
  421. package/core/logos/combomarks/white/mapbox.svg +37 -0
  422. package/core/logos/combomarks/white/netflix.svg +15 -0
  423. package/core/logos/combomarks/white/paypal.svg +40 -0
  424. package/core/logos/combomarks/white/samsung.svg +26 -0
  425. package/core/logos/combomarks/white/shopify.svg +36 -0
  426. package/core/logos/combomarks/white/slack.svg +42 -0
  427. package/core/logos/combomarks/white/spotify.svg +38 -0
  428. package/core/logos/combomarks/white/stripe.svg +24 -0
  429. package/core/logos/combomarks/white/twilio.svg +29 -0
  430. package/core/logos/combomarks/white/uber.svg +24 -0
  431. package/core/logos/combomarks/white/weebly.svg +38 -0
  432. package/defaults/pages/404.md +4 -0
  433. package/defaults/pages/about.md +4 -0
  434. package/defaults/pages/admin/calendar/index.html +4 -0
  435. package/defaults/pages/admin/firebase/index.html +4 -0
  436. package/defaults/pages/admin/index.md +4 -0
  437. package/defaults/pages/admin/posts/editor.html +4 -0
  438. package/defaults/pages/admin/posts/index.html +4 -0
  439. package/defaults/pages/admin/stackblitz/index.html +4 -0
  440. package/defaults/pages/admin/studio/index.html +4 -0
  441. package/defaults/pages/admin/users/index.html +4 -0
  442. package/defaults/pages/admin/users/new.html +4 -0
  443. package/defaults/pages/admin/verts/index.html +4 -0
  444. package/defaults/pages/ads-txt.html +11 -0
  445. package/defaults/pages/alternatives/index.md +4 -0
  446. package/defaults/pages/app.md +4 -0
  447. package/defaults/pages/auth/reset.md +4 -0
  448. package/defaults/pages/auth/signin.md +4 -0
  449. package/defaults/pages/auth/signup.md +4 -0
  450. package/defaults/pages/auth/token.md +4 -0
  451. package/defaults/pages/blog/categories/category.html +21 -0
  452. package/defaults/pages/blog/categories.md +4 -0
  453. package/defaults/pages/blog/index-json.html +27 -0
  454. package/defaults/pages/blog/tags/tag.html +21 -0
  455. package/defaults/pages/blog/tags.md +4 -0
  456. package/defaults/pages/blog.md +22 -0
  457. package/defaults/pages/careers.md +4 -0
  458. package/defaults/pages/connections/callback.md +4 -0
  459. package/defaults/pages/contact.md +4 -0
  460. package/defaults/pages/dashboard/account.md +4 -0
  461. package/defaults/pages/dashboard/index.md +12 -0
  462. package/defaults/pages/download.md +4 -0
  463. package/defaults/pages/extension/index.html +4 -0
  464. package/defaults/pages/extension/installed.html +4 -0
  465. package/defaults/pages/feedback.md +4 -0
  466. package/defaults/pages/feeds/posts-json.html +40 -0
  467. package/defaults/pages/feeds/posts-xml.html +38 -0
  468. package/defaults/pages/humans.html +25 -0
  469. package/defaults/pages/index.md +4 -0
  470. package/defaults/pages/legal/cookies.md +4 -0
  471. package/defaults/pages/legal/privacy.md +4 -0
  472. package/defaults/pages/legal/terms.md +4 -0
  473. package/defaults/pages/llms-txt.html +46 -0
  474. package/defaults/pages/opensearch.html +16 -0
  475. package/defaults/pages/pages-json.html +42 -0
  476. package/defaults/pages/payment/checkout.md +4 -0
  477. package/defaults/pages/payment/confirmation.md +4 -0
  478. package/defaults/pages/portal/email-preferences.md +4 -0
  479. package/defaults/pages/pricing.md +4 -0
  480. package/defaults/pages/redirects/account.md +12 -0
  481. package/defaults/pages/redirects/admin/dashboard.md +11 -0
  482. package/defaults/pages/redirects/auth/change-password.md +9 -0
  483. package/defaults/pages/redirects/auth/forgot.md +9 -0
  484. package/defaults/pages/redirects/auth/join.md +9 -0
  485. package/defaults/pages/redirects/auth/login.md +9 -0
  486. package/defaults/pages/redirects/auth/recover.md +9 -0
  487. package/defaults/pages/redirects/auth/register.md +9 -0
  488. package/defaults/pages/redirects/auth/reset-password.md +9 -0
  489. package/defaults/pages/redirects/billing/cancel.md +9 -0
  490. package/defaults/pages/redirects/billing/refund.md +9 -0
  491. package/defaults/pages/robots.html +36 -0
  492. package/defaults/pages/security-txt.html +11 -0
  493. package/defaults/pages/sitemap.html +37 -0
  494. package/defaults/pages/status.md +4 -0
  495. package/defaults/pages/team/index.md +4 -0
  496. package/defaults/pages/test/account/dashboard.html +16 -0
  497. package/defaults/pages/test/index.md +12 -0
  498. package/defaults/pages/test/libraries/appearance.html +268 -0
  499. package/defaults/pages/test/libraries/cover.html +50 -0
  500. package/defaults/pages/test/libraries/error.html +30 -0
  501. package/defaults/pages/test/libraries/firestore.html +202 -0
  502. package/defaults/pages/test/libraries/form-manager.html +374 -0
  503. package/defaults/pages/test/libraries/layers.html +52 -0
  504. package/defaults/pages/test/libraries/lazy-loading.html +450 -0
  505. package/defaults/pages/test/libraries/verts.html +149 -0
  506. package/defaults/pages/test/redirect/external.md +13 -0
  507. package/defaults/pages/test/redirect/internal.md +13 -0
  508. package/defaults/pages/test/styleguide/index.html +588 -0
  509. package/defaults/pages/test/translation/index.md +50 -0
  510. package/defaults/pages/updates/index.md +4 -0
  511. package/defaults/sample-posts/2026-01-12-welcome-to-the-blog.md +26 -0
  512. package/defaults/sample-posts/2026-02-03-a-field-guide-to-good-defaults.md +50 -0
  513. package/defaults/sample-posts/2026-02-24-shipping-week-notes.md +37 -0
  514. package/defaults/sample-posts/2026-03-17-the-case-for-one-config.md +36 -0
  515. package/defaults/sample-posts/2026-04-09-write-release-notes-people-read.md +34 -0
  516. package/defaults/sample-posts/2026-05-21-dark-mode-done-properly.md +38 -0
  517. package/defaults/sample-posts/2026-06-02-the-boring-deploy-is-the-good-deploy.md +30 -0
  518. package/defaults/sample-posts/2026-06-11-naming-things-a-survival-guide.md +30 -0
  519. package/defaults/sample-posts/2026-06-19-your-pricing-page-is-a-product.md +28 -0
  520. package/defaults/sample-posts/2026-06-30-email-is-an-api-with-feelings.md +28 -0
  521. package/defaults/sample-posts/2026-07-08-ship-the-docs-with-the-diff.md +30 -0
  522. package/defaults/sample-team/avery-quinn.md +22 -0
  523. package/defaults/sample-team/jordan-reyes.md +25 -0
  524. package/defaults/sample-team/riley-nakamura.md +22 -0
  525. package/defaults/sample-team/sam-okafor.md +22 -0
  526. package/defaults/sample-updates/v1.0.0.md +28 -0
  527. package/defaults/sample-updates/v1.1.0.md +27 -0
  528. package/defaults/sample-updates/v1.2.0.md +27 -0
  529. package/defaults/sample-updates/v1.3.0.md +28 -0
  530. package/defaults/showcase/components.html +62 -0
  531. package/defaults/showcase/entry.html +76 -0
  532. package/defaults/showcase/frame.html +62 -0
  533. package/defaults/showcase/index.html +59 -0
  534. package/dist/assets.js +1349 -0
  535. package/dist/brand-tokens.js +195 -0
  536. package/dist/build.js +192 -0
  537. package/dist/cachebreak-html.js +71 -0
  538. package/dist/cli-run.js +25 -0
  539. package/dist/cli.js +47 -0
  540. package/dist/collections.js +183 -0
  541. package/dist/commands/audit.js +470 -0
  542. package/dist/commands/build.js +197 -0
  543. package/dist/commands/clean.js +18 -0
  544. package/dist/commands/customize.js +125 -0
  545. package/dist/commands/deploy.js +441 -0
  546. package/dist/commands/dev.js +1067 -0
  547. package/dist/commands/install.js +31 -0
  548. package/dist/commands/lib/deploy-precheck.js +43 -0
  549. package/dist/commands/lib/ensure-target.js +115 -0
  550. package/dist/commands/migrate.js +86 -0
  551. package/dist/commands/purge.js +31 -0
  552. package/dist/commands/test.js +237 -0
  553. package/dist/commands/translate.js +57 -0
  554. package/dist/commands/update.js +22 -0
  555. package/dist/commands/version.js +11 -0
  556. package/dist/config-sections.js +245 -0
  557. package/dist/consumer-scan.js +118 -0
  558. package/dist/consumer.js +49 -0
  559. package/dist/customize.js +328 -0
  560. package/dist/decisions.js +153 -0
  561. package/dist/dist-audit.js +417 -0
  562. package/dist/dynamic-pages.js +357 -0
  563. package/dist/engine.js +1402 -0
  564. package/dist/firebase-auth-helpers.js +198 -0
  565. package/dist/font-metrics.js +420 -0
  566. package/dist/frontmatter-liquid.js +253 -0
  567. package/dist/github-secrets.js +80 -0
  568. package/dist/hero-animations.js +170 -0
  569. package/dist/imagemin.js +261 -0
  570. package/dist/index.js +41 -0
  571. package/dist/inline-icons.js +65 -0
  572. package/dist/language-flags.js +55 -0
  573. package/dist/layers.js +80 -0
  574. package/dist/layouts.js +44 -0
  575. package/dist/limit-collections.js +199 -0
  576. package/dist/link-resolver.js +303 -0
  577. package/dist/markdown-images.js +85 -0
  578. package/dist/merge.js +20 -0
  579. package/dist/migrate/codemod.js +172 -0
  580. package/dist/migrate/config-convert.js +448 -0
  581. package/dist/migrate/consumer-assets.js +130 -0
  582. package/dist/migrate/index.js +223 -0
  583. package/dist/migrate/lint.js +108 -0
  584. package/dist/migrate/rules.js +1929 -0
  585. package/dist/minify-html.js +148 -0
  586. package/dist/mode-helpers.js +96 -0
  587. package/dist/omega-bin.js +7 -0
  588. package/dist/overrides.js +190 -0
  589. package/dist/path-prefix.js +167 -0
  590. package/dist/paths.js +37 -0
  591. package/dist/pricing.js +301 -0
  592. package/dist/purge.js +95 -0
  593. package/dist/redirect-page.js +45 -0
  594. package/dist/sample-content.js +210 -0
  595. package/dist/scaffold.js +123 -0
  596. package/dist/sections.js +810 -0
  597. package/dist/service-worker.js +200 -0
  598. package/dist/social-pages.js +142 -0
  599. package/dist/srcset.js +67 -0
  600. package/dist/static-assets.js +154 -0
  601. package/dist/target-shortlinks.js +123 -0
  602. package/dist/theme-vocabulary.js +76 -0
  603. package/dist/translate/collect-text-nodes.js +93 -0
  604. package/dist/translate/default-routes.js +152 -0
  605. package/dist/translate/generate-defaults.js +297 -0
  606. package/dist/translate/index.js +568 -0
  607. package/dist/translate/packaged-defaults.js +127 -0
  608. package/dist/translate/sitemap.js +108 -0
  609. package/dist/vendor/account/engine.js +182 -0
  610. package/dist/vendor/account/features.js +220 -0
  611. package/dist/vendor/account/index.js +53 -0
  612. package/dist/vendor/account/schema.js +272 -0
  613. package/dist/vendor/account/subscription.js +38 -0
  614. package/dist/vendor/config/company.js +31 -0
  615. package/dist/vendor/config/defaults.js +173 -0
  616. package/dist/vendor/config/demo.js +18 -0
  617. package/dist/vendor/config/desktop-artifacts.js +110 -0
  618. package/dist/vendor/config/edit.js +769 -0
  619. package/dist/vendor/config/env-delivery.js +145 -0
  620. package/dist/vendor/config/env-rules.js +93 -0
  621. package/dist/vendor/config/env-schema.js +1078 -0
  622. package/dist/vendor/config/env.js +445 -0
  623. package/dist/vendor/config/hooks.js +97 -0
  624. package/dist/vendor/config/index.js +237 -0
  625. package/dist/vendor/config/instances.js +208 -0
  626. package/dist/vendor/config/load.js +490 -0
  627. package/dist/vendor/config/merge.js +68 -0
  628. package/dist/vendor/config/order.js +139 -0
  629. package/dist/vendor/config/ports.js +374 -0
  630. package/dist/vendor/config/providers.js +32 -0
  631. package/dist/vendor/config/repo.js +142 -0
  632. package/dist/vendor/config/retired-keys.js +430 -0
  633. package/dist/vendor/config/schema.js +1610 -0
  634. package/dist/vendor/config/secrets.js +50 -0
  635. package/dist/vendor/config/seed.js +34 -0
  636. package/dist/vendor/config/site-global.js +205 -0
  637. package/dist/vendor/config/validate.js +554 -0
  638. package/dist/vendor/config/winback.js +61 -0
  639. package/dist/vendor/devkit/actions-secrets.js +145 -0
  640. package/dist/vendor/devkit/attach-log-file.js +262 -0
  641. package/dist/vendor/devkit/bare-requires.js +153 -0
  642. package/dist/vendor/devkit/bundle.js +292 -0
  643. package/dist/vendor/devkit/ci-workflows.js +520 -0
  644. package/dist/vendor/devkit/cli-router.js +156 -0
  645. package/dist/vendor/devkit/command-path.js +46 -0
  646. package/dist/vendor/devkit/defaults-engine.js +372 -0
  647. package/dist/vendor/devkit/deploy-precheck.js +54 -0
  648. package/dist/vendor/devkit/deploy-record.js +180 -0
  649. package/dist/vendor/devkit/deploy.js +286 -0
  650. package/dist/vendor/devkit/env-watch.js +132 -0
  651. package/dist/vendor/devkit/framework-deps.js +46 -0
  652. package/dist/vendor/devkit/icons.js +178 -0
  653. package/dist/vendor/devkit/license.js +155 -0
  654. package/dist/vendor/devkit/local-https.js +360 -0
  655. package/dist/vendor/devkit/local.js +1905 -0
  656. package/dist/vendor/devkit/logger.js +128 -0
  657. package/dist/vendor/devkit/merge-line-files.js +296 -0
  658. package/dist/vendor/devkit/omega-bin.js +345 -0
  659. package/dist/vendor/devkit/reads.js +274 -0
  660. package/dist/vendor/devkit/safe-install.js +18 -0
  661. package/dist/vendor/devkit/scaffold-guard.js +96 -0
  662. package/dist/vendor/devkit/stop-signals.js +28 -0
  663. package/dist/vendor/devkit/strip-dev-blocks-plugin.js +29 -0
  664. package/dist/vendor/devkit/strip-dev-blocks.js +32 -0
  665. package/dist/vendor/devkit/target-secrets.js +165 -0
  666. package/dist/vendor/devkit/test/scope.js +162 -0
  667. package/dist/vendor/devkit/translate/cache.js +84 -0
  668. package/dist/vendor/devkit/translate/engine.js +243 -0
  669. package/dist/vendor/devkit/translate/index.js +49 -0
  670. package/dist/vendor/devkit/translate/languages.js +134 -0
  671. package/dist/vendor/devkit/translate/providers.js +188 -0
  672. package/dist/vendor/devkit/update.js +569 -0
  673. package/dist/vendor/template-kit/data/language-flags.js +54 -0
  674. package/dist/vendor/template-kit/data/languages.js +195 -0
  675. package/dist/vendor/template-kit/data/social-urls.js +26 -0
  676. package/dist/vendor/template-kit/filters.js +227 -0
  677. package/dist/vendor/template-kit/index.js +28 -0
  678. package/dist/vendor/template-kit/jekyll-compat.js +268 -0
  679. package/dist/vendor/template-kit/register-liquid.js +0 -0
  680. package/dist/vendor/template-kit/tags/collections.js +191 -0
  681. package/dist/vendor/template-kit/tags/conditionals.js +101 -0
  682. package/dist/vendor/template-kit/tags/content.js +175 -0
  683. package/dist/vendor/template-kit/tags/index.js +33 -0
  684. package/dist/vendor/template-kit/tags/media.js +376 -0
  685. package/dist/vendor/template-kit/variable-resolver.js +163 -0
  686. package/docs/ads-system.md +109 -0
  687. package/docs/classy-v2/DIRECTION.md +92 -0
  688. package/docs/classy-v2/draft-1.html +1932 -0
  689. package/docs/classy-v2/draft-2.html +1956 -0
  690. package/docs/frontmatter.md +153 -0
  691. package/docs/index.md +254 -0
  692. package/docs/libs.md +298 -0
  693. package/docs/omega-sections-spec.md +159 -0
  694. package/docs/page-contract.md +112 -0
  695. package/docs/sections.md +845 -0
  696. package/docs/shared/agent-docs.md +89 -0
  697. package/docs/shared/analytics.md +612 -0
  698. package/docs/shared/brands.md +51 -0
  699. package/docs/shared/breaking-changes.md +497 -0
  700. package/docs/shared/config.md +1387 -0
  701. package/docs/shared/deploys.md +215 -0
  702. package/docs/shared/icons.md +201 -0
  703. package/docs/shared/local-dev.md +147 -0
  704. package/docs/shared/logging.md +202 -0
  705. package/docs/shared/monitoring.md +153 -0
  706. package/docs/shared/publishing.md +183 -0
  707. package/docs/shared/rulings.md +34 -0
  708. package/docs/shared/testing.md +147 -0
  709. package/docs/shared/theming.md +604 -0
  710. package/docs/shared/translation.md +291 -0
  711. package/docs/shared/updates.md +61 -0
  712. package/docs/template-kit.md +128 -0
  713. package/docs/test-framework.md +163 -0
  714. package/package.json +122 -0
  715. package/runtime/boot.js +149 -0
  716. package/runtime/icons.js +77 -0
  717. package/runtime/manager.js +36 -0
  718. package/scaffold/.github/workflows/build.yml +139 -0
  719. package/scaffold/.nvmrc +1 -0
  720. package/scaffold/AGENTS.md +55 -0
  721. package/scaffold/CLAUDE.md +1 -0
  722. package/scaffold/_.gitattributes +4 -0
  723. package/scaffold/_.gitignore +27 -0
  724. package/scaffold/config/omega.json5 +20 -0
  725. package/scaffold/src/assets/css/pages/.gitkeep +0 -0
  726. package/scaffold/src/assets/images/.gitkeep +0 -0
  727. package/scaffold/src/assets/js/pages/.gitkeep +0 -0
  728. package/scaffold/src/pages/.gitkeep +0 -0
  729. package/scaffold/src/pages/example.md.txt +94 -0
  730. package/scaffold/src/service-worker.js +16 -0
  731. package/sw/entry.js +19 -0
  732. package/sw/manager.js +281 -0
  733. package/themes/_template/README.md +115 -0
  734. package/themes/_template/_config.scss +60 -0
  735. package/themes/_template/_theme.js +14 -0
  736. package/themes/_template/_theme.scss +28 -0
  737. package/themes/_template/css/base/_root.scss +19 -0
  738. package/themes/_template/css/components/_components.scss +23 -0
  739. package/themes/base/README.md +5 -0
  740. package/themes/base/_components/data/org-chart/component.html +33 -0
  741. package/themes/base/_components/data/org-chart/component.json5 +33 -0
  742. package/themes/base/_components/data/org-chart/component.scss +183 -0
  743. package/themes/base/_components/heading/masthead/component.html +22 -0
  744. package/themes/base/_components/heading/masthead/component.json5 +30 -0
  745. package/themes/base/_components/heading/section-head/component.html +18 -0
  746. package/themes/base/_components/heading/section-head/component.json5 +27 -0
  747. package/themes/base/_components/pricing/features/component.html +29 -0
  748. package/themes/base/_components/pricing/features/component.json5 +30 -0
  749. package/themes/base/_hero/orbit/index.html +30 -0
  750. package/themes/base/_hero/orbit/script.js +33 -0
  751. package/themes/base/_hero/orbit/style.scss +133 -0
  752. package/themes/base/_includes/admin/sections/sidebar.html +3 -0
  753. package/themes/base/_includes/admin/sections/topbar.html +3 -0
  754. package/themes/base/_includes/backend/sections/sidebar.html +3 -0
  755. package/themes/base/_includes/backend/sections/topbar.html +3 -0
  756. package/themes/base/_includes/frontend/components/connection-card.html +49 -0
  757. package/themes/base/_includes/frontend/components/post-card.html +54 -0
  758. package/themes/base/_includes/frontend/sections/account-connections.html +42 -0
  759. package/themes/base/_includes/frontend/sections/account-section-header.html +11 -0
  760. package/themes/base/_includes/frontend/sections/footer.html +154 -0
  761. package/themes/base/_includes/frontend/sections/nav.html +276 -0
  762. package/themes/base/_includes/global/sections/account.html +72 -0
  763. package/themes/base/_includes/global/sections/app-sidebar.html +248 -0
  764. package/themes/base/_includes/global/sections/app-topbar.html +228 -0
  765. package/themes/base/_includes/global/sections/page-header.html +99 -0
  766. package/themes/base/_layouts/admin/core/minimal-viewport-locked.html +22 -0
  767. package/themes/base/_layouts/admin/core/minimal.html +23 -0
  768. package/themes/base/_layouts/backend/core/base.html +57 -0
  769. package/themes/base/_layouts/backend/core/minimal-viewport-locked.html +32 -0
  770. package/themes/base/_layouts/backend/core/minimal.html +32 -0
  771. package/themes/base/_layouts/backend/pages/dashboard/index.html +230 -0
  772. package/themes/base/_layouts/frontend/core/base.html +31 -0
  773. package/themes/base/_layouts/frontend/core/cover.html +40 -0
  774. package/themes/base/_layouts/frontend/core/minimal.html +47 -0
  775. package/themes/base/_layouts/frontend/pages/404.html +54 -0
  776. package/themes/base/_layouts/frontend/pages/about.html +144 -0
  777. package/themes/base/_layouts/frontend/pages/account/index.html +2104 -0
  778. package/themes/base/_layouts/frontend/pages/alternatives/alternative.html +319 -0
  779. package/themes/base/_layouts/frontend/pages/alternatives/index.html +186 -0
  780. package/themes/base/_layouts/frontend/pages/app.html +142 -0
  781. package/themes/base/_layouts/frontend/pages/auth/reset.html +53 -0
  782. package/themes/base/_layouts/frontend/pages/auth/signin.html +90 -0
  783. package/themes/base/_layouts/frontend/pages/auth/signup.html +141 -0
  784. package/themes/base/_layouts/frontend/pages/auth/token.html +44 -0
  785. package/themes/base/_layouts/frontend/pages/blog/categories/category.html +88 -0
  786. package/themes/base/_layouts/frontend/pages/blog/categories/index.html +88 -0
  787. package/themes/base/_layouts/frontend/pages/blog/index.html +255 -0
  788. package/themes/base/_layouts/frontend/pages/blog/post.html +261 -0
  789. package/themes/base/_layouts/frontend/pages/blog/tags/index.html +84 -0
  790. package/themes/base/_layouts/frontend/pages/blog/tags/tag.html +88 -0
  791. package/themes/base/_layouts/frontend/pages/collection/category.html +72 -0
  792. package/themes/base/_layouts/frontend/pages/collection/document.html +54 -0
  793. package/themes/base/_layouts/frontend/pages/collection/index.html +84 -0
  794. package/themes/base/_layouts/frontend/pages/connections/callback.html +55 -0
  795. package/themes/base/_layouts/frontend/pages/contact.html +214 -0
  796. package/themes/base/_layouts/frontend/pages/download.html +793 -0
  797. package/themes/base/_layouts/frontend/pages/extension/index.html +253 -0
  798. package/themes/base/_layouts/frontend/pages/extension/installed.html +198 -0
  799. package/themes/base/_layouts/frontend/pages/feedback.html +171 -0
  800. package/themes/base/_layouts/frontend/pages/index.html +66 -0
  801. package/themes/base/_layouts/frontend/pages/legal/document.html +78 -0
  802. package/themes/base/_layouts/frontend/pages/payment/checkout.html +459 -0
  803. package/themes/base/_layouts/frontend/pages/payment/confirmation.html +131 -0
  804. package/themes/base/_layouts/frontend/pages/portal/email-preferences.html +104 -0
  805. package/themes/base/_layouts/frontend/pages/pricing.html +596 -0
  806. package/themes/base/_layouts/frontend/pages/status.html +361 -0
  807. package/themes/base/_layouts/frontend/pages/team/index.html +210 -0
  808. package/themes/base/_layouts/frontend/pages/team/member.html +125 -0
  809. package/themes/base/_layouts/frontend/pages/updates/index.html +119 -0
  810. package/themes/base/_layouts/frontend/pages/updates/update.html +118 -0
  811. package/themes/base/_sections/about/hero/section.html +68 -0
  812. package/themes/base/_sections/about/hero/section.json5 +58 -0
  813. package/themes/base/_sections/about/letter/section.html +60 -0
  814. package/themes/base/_sections/about/letter/section.json5 +56 -0
  815. package/themes/base/_sections/about/photo-band/section.html +24 -0
  816. package/themes/base/_sections/about/photo-band/section.json5 +23 -0
  817. package/themes/base/_sections/about/principles/section.html +17 -0
  818. package/themes/base/_sections/about/principles/section.json5 +34 -0
  819. package/themes/base/_sections/about/timeline/section.html +20 -0
  820. package/themes/base/_sections/about/timeline/section.json5 +34 -0
  821. package/themes/base/_sections/marketing/bento/section.html +91 -0
  822. package/themes/base/_sections/marketing/bento/section.json5 +152 -0
  823. package/themes/base/_sections/marketing/cta/section.html +44 -0
  824. package/themes/base/_sections/marketing/cta/section.json5 +47 -0
  825. package/themes/base/_sections/marketing/faq/section.html +52 -0
  826. package/themes/base/_sections/marketing/faq/section.json5 +68 -0
  827. package/themes/base/_sections/marketing/hero/section.html +349 -0
  828. package/themes/base/_sections/marketing/hero/section.json5 +335 -0
  829. package/themes/base/_sections/marketing/newsletter-cta/section.html +38 -0
  830. package/themes/base/_sections/marketing/newsletter-cta/section.js +86 -0
  831. package/themes/base/_sections/marketing/newsletter-cta/section.json5 +29 -0
  832. package/themes/base/_sections/marketing/pricing-cards/section.html +115 -0
  833. package/themes/base/_sections/marketing/pricing-cards/section.json5 +72 -0
  834. package/themes/base/_sections/marketing/product-demo/section.html +62 -0
  835. package/themes/base/_sections/marketing/product-demo/section.js +44 -0
  836. package/themes/base/_sections/marketing/product-demo/section.json5 +52 -0
  837. package/themes/base/_sections/marketing/prose/section.html +22 -0
  838. package/themes/base/_sections/marketing/prose/section.json5 +41 -0
  839. package/themes/base/_sections/marketing/showcase/section.html +35 -0
  840. package/themes/base/_sections/marketing/showcase/section.json5 +52 -0
  841. package/themes/base/_sections/marketing/stats/section.html +32 -0
  842. package/themes/base/_sections/marketing/stats/section.json5 +44 -0
  843. package/themes/base/_sections/marketing/testimonials/section.html +54 -0
  844. package/themes/base/_sections/marketing/testimonials/section.json5 +70 -0
  845. package/themes/base/_sections/marketing/trusted-by/section.html +30 -0
  846. package/themes/base/_sections/marketing/trusted-by/section.json5 +38 -0
  847. package/themes/base/_sections/verts/unit/section.html +7 -0
  848. package/themes/base/_sections/verts/unit/section.js +22 -0
  849. package/themes/base/_sections/verts/unit/section.json5 +24 -0
  850. package/themes/base/_sections/verts/unit/section.scss +24 -0
  851. package/themes/base/_theme.js +13 -0
  852. package/themes/base/_theme.scss +4 -0
  853. package/themes/bootstrap/_theme.js +16 -0
  854. package/themes/bootstrap/_theme.scss +11 -0
  855. package/themes/bootstrap/js/index.esm.js +19 -0
  856. package/themes/bootstrap/js/index.umd.js +34 -0
  857. package/themes/bootstrap/js/src/alert.js +87 -0
  858. package/themes/bootstrap/js/src/base-component.js +86 -0
  859. package/themes/bootstrap/js/src/button.js +72 -0
  860. package/themes/bootstrap/js/src/carousel.js +474 -0
  861. package/themes/bootstrap/js/src/collapse.js +297 -0
  862. package/themes/bootstrap/js/src/dom/data.js +55 -0
  863. package/themes/bootstrap/js/src/dom/event-handler.js +317 -0
  864. package/themes/bootstrap/js/src/dom/manipulator.js +71 -0
  865. package/themes/bootstrap/js/src/dom/selector-engine.js +126 -0
  866. package/themes/bootstrap/js/src/dropdown.js +458 -0
  867. package/themes/bootstrap/js/src/modal.js +378 -0
  868. package/themes/bootstrap/js/src/offcanvas.js +282 -0
  869. package/themes/bootstrap/js/src/popover.js +97 -0
  870. package/themes/bootstrap/js/src/scrollspy.js +296 -0
  871. package/themes/bootstrap/js/src/tab.js +315 -0
  872. package/themes/bootstrap/js/src/toast.js +224 -0
  873. package/themes/bootstrap/js/src/tooltip.js +632 -0
  874. package/themes/bootstrap/js/src/util/backdrop.js +151 -0
  875. package/themes/bootstrap/js/src/util/component-functions.js +35 -0
  876. package/themes/bootstrap/js/src/util/config.js +65 -0
  877. package/themes/bootstrap/js/src/util/focustrap.js +115 -0
  878. package/themes/bootstrap/js/src/util/index.js +306 -0
  879. package/themes/bootstrap/js/src/util/sanitizer.js +117 -0
  880. package/themes/bootstrap/js/src/util/scrollbar.js +114 -0
  881. package/themes/bootstrap/js/src/util/swipe.js +146 -0
  882. package/themes/bootstrap/js/src/util/template-factory.js +160 -0
  883. package/themes/bootstrap/overrides/_accordion.scss +21 -0
  884. package/themes/bootstrap/overrides/_avatars.scss +51 -0
  885. package/themes/bootstrap/overrides/_blog-images.scss +45 -0
  886. package/themes/bootstrap/overrides/_buttons-adaptive.scss +141 -0
  887. package/themes/bootstrap/overrides/_color-shades.scss +25 -0
  888. package/themes/bootstrap/overrides/_cursor-utilities.scss +13 -0
  889. package/themes/bootstrap/overrides/_index.scss +30 -0
  890. package/themes/bootstrap/overrides/_links.scss +26 -0
  891. package/themes/bootstrap/overrides/_soft-colors.scss +99 -0
  892. package/themes/bootstrap/overrides/_spacing-extended.scss +74 -0
  893. package/themes/bootstrap/overrides/_spinners.scss +22 -0
  894. package/themes/bootstrap/overrides/_typography-utilities.scss +40 -0
  895. package/themes/bootstrap/scss/_accordion.scss +153 -0
  896. package/themes/bootstrap/scss/_alert.scss +68 -0
  897. package/themes/bootstrap/scss/_badge.scss +38 -0
  898. package/themes/bootstrap/scss/_breadcrumb.scss +40 -0
  899. package/themes/bootstrap/scss/_button-group.scss +147 -0
  900. package/themes/bootstrap/scss/_buttons.scss +216 -0
  901. package/themes/bootstrap/scss/_card.scss +238 -0
  902. package/themes/bootstrap/scss/_carousel.scss +226 -0
  903. package/themes/bootstrap/scss/_close.scss +66 -0
  904. package/themes/bootstrap/scss/_containers.scss +41 -0
  905. package/themes/bootstrap/scss/_dropdown.scss +250 -0
  906. package/themes/bootstrap/scss/_forms.scss +9 -0
  907. package/themes/bootstrap/scss/_functions.scss +302 -0
  908. package/themes/bootstrap/scss/_grid.scss +39 -0
  909. package/themes/bootstrap/scss/_helpers.scss +12 -0
  910. package/themes/bootstrap/scss/_images.scss +42 -0
  911. package/themes/bootstrap/scss/_list-group.scss +199 -0
  912. package/themes/bootstrap/scss/_maps.scss +174 -0
  913. package/themes/bootstrap/scss/_mixins.scss +42 -0
  914. package/themes/bootstrap/scss/_modal.scss +240 -0
  915. package/themes/bootstrap/scss/_nav.scss +197 -0
  916. package/themes/bootstrap/scss/_navbar.scss +289 -0
  917. package/themes/bootstrap/scss/_offcanvas.scss +147 -0
  918. package/themes/bootstrap/scss/_pagination.scss +109 -0
  919. package/themes/bootstrap/scss/_placeholders.scss +51 -0
  920. package/themes/bootstrap/scss/_popover.scss +196 -0
  921. package/themes/bootstrap/scss/_progress.scss +68 -0
  922. package/themes/bootstrap/scss/_reboot.scss +611 -0
  923. package/themes/bootstrap/scss/_root.scss +187 -0
  924. package/themes/bootstrap/scss/_spinners.scss +85 -0
  925. package/themes/bootstrap/scss/_tables.scss +171 -0
  926. package/themes/bootstrap/scss/_toasts.scss +73 -0
  927. package/themes/bootstrap/scss/_tooltip.scss +119 -0
  928. package/themes/bootstrap/scss/_transitions.scss +27 -0
  929. package/themes/bootstrap/scss/_type.scss +106 -0
  930. package/themes/bootstrap/scss/_utilities.scss +806 -0
  931. package/themes/bootstrap/scss/_variables-dark.scss +102 -0
  932. package/themes/bootstrap/scss/_variables.scss +1753 -0
  933. package/themes/bootstrap/scss/bootstrap-grid.scss +62 -0
  934. package/themes/bootstrap/scss/bootstrap-reboot.scss +10 -0
  935. package/themes/bootstrap/scss/bootstrap-utilities.scss +19 -0
  936. package/themes/bootstrap/scss/bootstrap.scss +52 -0
  937. package/themes/bootstrap/scss/forms/_floating-labels.scss +97 -0
  938. package/themes/bootstrap/scss/forms/_form-check.scss +189 -0
  939. package/themes/bootstrap/scss/forms/_form-control.scss +214 -0
  940. package/themes/bootstrap/scss/forms/_form-range.scss +91 -0
  941. package/themes/bootstrap/scss/forms/_form-select.scss +80 -0
  942. package/themes/bootstrap/scss/forms/_form-text.scss +11 -0
  943. package/themes/bootstrap/scss/forms/_input-group.scss +132 -0
  944. package/themes/bootstrap/scss/forms/_labels.scss +36 -0
  945. package/themes/bootstrap/scss/forms/_validation.scss +12 -0
  946. package/themes/bootstrap/scss/helpers/_clearfix.scss +3 -0
  947. package/themes/bootstrap/scss/helpers/_color-bg.scss +7 -0
  948. package/themes/bootstrap/scss/helpers/_colored-links.scss +30 -0
  949. package/themes/bootstrap/scss/helpers/_focus-ring.scss +5 -0
  950. package/themes/bootstrap/scss/helpers/_icon-link.scss +25 -0
  951. package/themes/bootstrap/scss/helpers/_position.scss +36 -0
  952. package/themes/bootstrap/scss/helpers/_ratio.scss +26 -0
  953. package/themes/bootstrap/scss/helpers/_stacks.scss +15 -0
  954. package/themes/bootstrap/scss/helpers/_stretched-link.scss +15 -0
  955. package/themes/bootstrap/scss/helpers/_text-truncation.scss +7 -0
  956. package/themes/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
  957. package/themes/bootstrap/scss/helpers/_vr.scss +8 -0
  958. package/themes/bootstrap/scss/mixins/_alert.scss +18 -0
  959. package/themes/bootstrap/scss/mixins/_backdrop.scss +14 -0
  960. package/themes/bootstrap/scss/mixins/_banner.scss +7 -0
  961. package/themes/bootstrap/scss/mixins/_border-radius.scss +78 -0
  962. package/themes/bootstrap/scss/mixins/_box-shadow.scss +18 -0
  963. package/themes/bootstrap/scss/mixins/_breakpoints.scss +127 -0
  964. package/themes/bootstrap/scss/mixins/_buttons.scss +70 -0
  965. package/themes/bootstrap/scss/mixins/_caret.scss +69 -0
  966. package/themes/bootstrap/scss/mixins/_clearfix.scss +9 -0
  967. package/themes/bootstrap/scss/mixins/_color-mode.scss +21 -0
  968. package/themes/bootstrap/scss/mixins/_color-scheme.scss +7 -0
  969. package/themes/bootstrap/scss/mixins/_container.scss +11 -0
  970. package/themes/bootstrap/scss/mixins/_deprecate.scss +10 -0
  971. package/themes/bootstrap/scss/mixins/_forms.scss +163 -0
  972. package/themes/bootstrap/scss/mixins/_gradients.scss +47 -0
  973. package/themes/bootstrap/scss/mixins/_grid.scss +151 -0
  974. package/themes/bootstrap/scss/mixins/_image.scss +16 -0
  975. package/themes/bootstrap/scss/mixins/_list-group.scss +26 -0
  976. package/themes/bootstrap/scss/mixins/_lists.scss +7 -0
  977. package/themes/bootstrap/scss/mixins/_pagination.scss +10 -0
  978. package/themes/bootstrap/scss/mixins/_reset-text.scss +17 -0
  979. package/themes/bootstrap/scss/mixins/_resize.scss +6 -0
  980. package/themes/bootstrap/scss/mixins/_table-variants.scss +24 -0
  981. package/themes/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  982. package/themes/bootstrap/scss/mixins/_transition.scss +26 -0
  983. package/themes/bootstrap/scss/mixins/_utilities.scss +97 -0
  984. package/themes/bootstrap/scss/mixins/_visually-hidden.scss +38 -0
  985. package/themes/bootstrap/scss/tests/jasmine.js +16 -0
  986. package/themes/bootstrap/scss/tests/mixins/_auto-import-of-variables-dark.test.scss +7 -0
  987. package/themes/bootstrap/scss/tests/mixins/_color-modes.test.scss +69 -0
  988. package/themes/bootstrap/scss/tests/mixins/_media-query-color-mode-full.test.scss +8 -0
  989. package/themes/bootstrap/scss/tests/mixins/_utilities.test.scss +393 -0
  990. package/themes/bootstrap/scss/tests/sass-true/register.js +14 -0
  991. package/themes/bootstrap/scss/tests/sass-true/runner.js +17 -0
  992. package/themes/bootstrap/scss/tests/utilities/_api.test.scss +75 -0
  993. package/themes/bootstrap/scss/utilities/_api.scss +47 -0
  994. package/themes/bootstrap/scss/vendor/_rfs.scss +348 -0
  995. package/themes/classy/README.md +89 -0
  996. package/themes/classy/_config.scss +245 -0
  997. package/themes/classy/_theme.js +31 -0
  998. package/themes/classy/_theme.scss +57 -0
  999. package/themes/classy/css/app/_panels.scss +183 -0
  1000. package/themes/classy/css/base/_fonts.scss +79 -0
  1001. package/themes/classy/css/base/_no-raise.scss +49 -0
  1002. package/themes/classy/css/base/_root.scss +113 -0
  1003. package/themes/classy/css/base/_typography.scss +154 -0
  1004. package/themes/classy/css/base/_utilities.scss +284 -0
  1005. package/themes/classy/css/components/_alerts.scss +51 -0
  1006. package/themes/classy/css/components/_badges.scss +46 -0
  1007. package/themes/classy/css/components/_buttons.scss +175 -0
  1008. package/themes/classy/css/components/_cards.scss +41 -0
  1009. package/themes/classy/css/components/_dropdowns.scss +48 -0
  1010. package/themes/classy/css/components/_forms.scss +171 -0
  1011. package/themes/classy/css/components/_receipt.scss +45 -0
  1012. package/themes/classy/css/layout/_footer.scss +298 -0
  1013. package/themes/classy/css/layout/_general.scss +209 -0
  1014. package/themes/classy/css/layout/_nav.scss +154 -0
  1015. package/themes/classy/css/layout/_shell.scss +458 -0
  1016. package/themes/classy/css/marketing/_bento.scss +238 -0
  1017. package/themes/classy/css/marketing/_content.scss +1328 -0
  1018. package/themes/classy/css/marketing/_downloads.scss +246 -0
  1019. package/themes/classy/css/marketing/_hero.scss +311 -0
  1020. package/themes/classy/css/marketing/_sections.scss +649 -0
  1021. package/themes/classy/css/pages/404/index.scss +67 -0
  1022. package/themes/classy/css/pages/_auth.scss +235 -0
  1023. package/themes/classy/css/pages/admin/firebase/index.scss +22 -0
  1024. package/themes/classy/css/pages/blog/[slug].scss +56 -0
  1025. package/themes/classy/css/pages/cookies.scss +2 -0
  1026. package/themes/classy/css/pages/dashboard/account/index.scss +31 -0
  1027. package/themes/classy/css/pages/feedback/index.scss +39 -0
  1028. package/themes/classy/css/pages/legal/_document.scss +192 -0
  1029. package/themes/classy/css/pages/payment/checkout/index.scss +585 -0
  1030. package/themes/classy/css/pages/payment/confirmation/index.scss +9 -0
  1031. package/themes/classy/css/pages/privacy.scss +2 -0
  1032. package/themes/classy/css/pages/status/index.scss +164 -0
  1033. package/themes/classy/css/pages/terms.scss +2 -0
  1034. package/themes/classy/css/pages/updates/index.scss +128 -0
  1035. package/themes/classy/fonts/inter-italic-latin-ext.woff2 +0 -0
  1036. package/themes/classy/fonts/inter-italic-latin.woff2 +0 -0
  1037. package/themes/classy/fonts/inter-normal-latin-ext.woff2 +0 -0
  1038. package/themes/classy/fonts/inter-normal-latin.woff2 +0 -0
  1039. package/themes/classy/fonts/newsreader-italic-latin-ext.woff2 +0 -0
  1040. package/themes/classy/fonts/newsreader-italic-latin.woff2 +0 -0
  1041. package/themes/classy/fonts/newsreader-normal-latin-ext.woff2 +0 -0
  1042. package/themes/classy/fonts/newsreader-normal-latin.woff2 +0 -0
  1043. package/themes/classy/js/hero-demo-form.js +56 -0
  1044. package/themes/neobrutalism/README.md +118 -0
  1045. package/themes/neobrutalism/_config.scss +139 -0
  1046. package/themes/neobrutalism/_layouts/frontend/core/base.html +30 -0
  1047. package/themes/neobrutalism/_layouts/frontend/pages/index.html +275 -0
  1048. package/themes/neobrutalism/_theme.js +24 -0
  1049. package/themes/neobrutalism/_theme.scss +61 -0
  1050. package/themes/neobrutalism/css/base/_mixins.scss +46 -0
  1051. package/themes/neobrutalism/css/base/_root.scss +169 -0
  1052. package/themes/neobrutalism/css/base/_typography.scss +61 -0
  1053. package/themes/neobrutalism/css/base/_utilities.scss +89 -0
  1054. package/themes/neobrutalism/css/components/_billing-toggle.scss +74 -0
  1055. package/themes/neobrutalism/css/components/_buttons.scss +148 -0
  1056. package/themes/neobrutalism/css/components/_cards.scss +47 -0
  1057. package/themes/neobrutalism/css/components/_forms.scss +88 -0
  1058. package/themes/neobrutalism/css/components/_marketing.scss +244 -0
  1059. package/themes/neobrutalism/css/layout/_general.scss +213 -0
  1060. package/themes/neobrutalism/css/layout/_navigation.scss +171 -0
  1061. package/themes/neobrutalism/css/pages/index.scss +203 -0
  1062. package/themes/neobrutalism/css/pages/pricing/index.scss +58 -0
  1063. package/themes/neobrutalism/css/pages/test/libraries/layers/index.scss +7 -0
  1064. package/themes/neobrutalism/js/pages/test/libraries/layers/index.js +9 -0
  1065. package/themes/newsflash/README.md +117 -0
  1066. package/themes/newsflash/_components/heading/lede/component.html +14 -0
  1067. package/themes/newsflash/_components/heading/lede/component.json5 +23 -0
  1068. package/themes/newsflash/_components/heading/rule-head/component.html +17 -0
  1069. package/themes/newsflash/_components/heading/rule-head/component.json5 +23 -0
  1070. package/themes/newsflash/_components/news/byline/component.html +12 -0
  1071. package/themes/newsflash/_components/news/byline/component.json5 +18 -0
  1072. package/themes/newsflash/_components/news/story-card/component.html +25 -0
  1073. package/themes/newsflash/_components/news/story-card/component.json5 +21 -0
  1074. package/themes/newsflash/_config.scss +147 -0
  1075. package/themes/newsflash/_layouts/frontend/core/base.html +51 -0
  1076. package/themes/newsflash/_layouts/frontend/pages/blog/index.html +299 -0
  1077. package/themes/newsflash/_layouts/frontend/pages/blog/post.html +235 -0
  1078. package/themes/newsflash/_layouts/frontend/pages/index.html +328 -0
  1079. package/themes/newsflash/_sections/marketing/desks/section.html +39 -0
  1080. package/themes/newsflash/_sections/marketing/desks/section.json5 +49 -0
  1081. package/themes/newsflash/_sections/marketing/newsletter-cta/section.html +103 -0
  1082. package/themes/newsflash/_sections/marketing/newsletter-cta/section.json5 +50 -0
  1083. package/themes/newsflash/_sections/marketing/rundown/section.html +28 -0
  1084. package/themes/newsflash/_sections/marketing/rundown/section.json5 +40 -0
  1085. package/themes/newsflash/_theme.js +24 -0
  1086. package/themes/newsflash/_theme.scss +70 -0
  1087. package/themes/newsflash/css/base/_fonts.scss +80 -0
  1088. package/themes/newsflash/css/base/_mixins.scss +51 -0
  1089. package/themes/newsflash/css/base/_root.scss +257 -0
  1090. package/themes/newsflash/css/base/_typography.scss +49 -0
  1091. package/themes/newsflash/css/base/_utilities.scss +122 -0
  1092. package/themes/newsflash/css/components/_badges.scss +65 -0
  1093. package/themes/newsflash/css/components/_billing-toggle.scss +61 -0
  1094. package/themes/newsflash/css/components/_buttons.scss +139 -0
  1095. package/themes/newsflash/css/components/_cards.scss +47 -0
  1096. package/themes/newsflash/css/components/_editorial.scss +173 -0
  1097. package/themes/newsflash/css/components/_forms.scss +75 -0
  1098. package/themes/newsflash/css/components/_infinite-scroll.scss +102 -0
  1099. package/themes/newsflash/css/components/_panels.scss +156 -0
  1100. package/themes/newsflash/css/components/_ticker.scss +67 -0
  1101. package/themes/newsflash/css/layout/_general.scss +330 -0
  1102. package/themes/newsflash/css/layout/_navigation.scss +168 -0
  1103. package/themes/newsflash/css/pages/404/index.scss +79 -0
  1104. package/themes/newsflash/css/pages/blog/[slug].scss +186 -0
  1105. package/themes/newsflash/css/pages/blog/index.scss +17 -0
  1106. package/themes/newsflash/css/pages/index.scss +157 -0
  1107. package/themes/newsflash/css/pages/pricing/index.scss +55 -0
  1108. package/themes/newsflash/css/pages/test/libraries/layers/index.scss +7 -0
  1109. package/themes/newsflash/fonts/fraunces-italic-latin-ext.woff2 +0 -0
  1110. package/themes/newsflash/fonts/fraunces-italic-latin.woff2 +0 -0
  1111. package/themes/newsflash/fonts/fraunces-normal-latin-ext.woff2 +0 -0
  1112. package/themes/newsflash/fonts/fraunces-normal-latin.woff2 +0 -0
  1113. package/themes/newsflash/fonts/schibsted-grotesk-italic-latin-ext.woff2 +0 -0
  1114. package/themes/newsflash/fonts/schibsted-grotesk-italic-latin.woff2 +0 -0
  1115. package/themes/newsflash/fonts/schibsted-grotesk-normal-latin-ext.woff2 +0 -0
  1116. package/themes/newsflash/fonts/schibsted-grotesk-normal-latin.woff2 +0 -0
  1117. package/themes/newsflash/js/pages/blog/[slug].js +29 -0
  1118. package/themes/newsflash/js/pages/test/libraries/layers/index.js +9 -0
  1119. package/translations/es/pages/404.json +86 -0
  1120. package/translations/es/pages/account.json +36 -0
  1121. package/translations/es/pages/app.json +44 -0
  1122. package/translations/es/pages/cancel.json +36 -0
  1123. package/translations/es/pages/change-password.json +36 -0
  1124. package/translations/es/pages/connections/callback.json +41 -0
  1125. package/translations/es/pages/dashboard/account.json +475 -0
  1126. package/translations/es/pages/dashboard.json +36 -0
  1127. package/translations/es/pages/forgot.json +36 -0
  1128. package/translations/es/pages/join.json +36 -0
  1129. package/translations/es/pages/login.json +36 -0
  1130. package/translations/es/pages/payment/checkout.json +83 -0
  1131. package/translations/es/pages/payment/confirmation.json +62 -0
  1132. package/translations/es/pages/portal/email-preferences.json +46 -0
  1133. package/translations/es/pages/recover.json +36 -0
  1134. package/translations/es/pages/refund.json +36 -0
  1135. package/translations/es/pages/register.json +36 -0
  1136. package/translations/es/pages/reset-password.json +36 -0
  1137. package/translations/es/pages/reset.json +42 -0
  1138. package/translations/es/pages/signin.json +45 -0
  1139. package/translations/es/pages/signup.json +60 -0
  1140. package/translations/es/pages/token.json +39 -0
  1141. package/translations/fa/pages/404.json +86 -0
  1142. package/translations/fa/pages/account.json +36 -0
  1143. package/translations/fa/pages/app.json +44 -0
  1144. package/translations/fa/pages/cancel.json +36 -0
  1145. package/translations/fa/pages/change-password.json +36 -0
  1146. package/translations/fa/pages/connections/callback.json +41 -0
  1147. package/translations/fa/pages/dashboard/account.json +475 -0
  1148. package/translations/fa/pages/dashboard.json +36 -0
  1149. package/translations/fa/pages/forgot.json +36 -0
  1150. package/translations/fa/pages/join.json +36 -0
  1151. package/translations/fa/pages/login.json +36 -0
  1152. package/translations/fa/pages/payment/checkout.json +83 -0
  1153. package/translations/fa/pages/payment/confirmation.json +62 -0
  1154. package/translations/fa/pages/portal/email-preferences.json +46 -0
  1155. package/translations/fa/pages/recover.json +36 -0
  1156. package/translations/fa/pages/refund.json +36 -0
  1157. package/translations/fa/pages/register.json +36 -0
  1158. package/translations/fa/pages/reset-password.json +36 -0
  1159. package/translations/fa/pages/reset.json +42 -0
  1160. package/translations/fa/pages/signin.json +45 -0
  1161. package/translations/fa/pages/signup.json +60 -0
  1162. package/translations/fa/pages/token.json +39 -0
@@ -0,0 +1,1932 @@
1
+ <title>classy v2 — Draft 1</title>
2
+ <style>
3
+ /* ============================================================================
4
+ CLASSY v2 — DRAFT 1 (interactive direction mockup, not production code)
5
+ One token sheet skins two surfaces: marketing Site + dashboard App.
6
+ Draft controls (bottom dock): view · theme · brand accent · type · density.
7
+ ========================================================================== */
8
+
9
+ /* ─── Tokens ─────────────────────────────────────────────────────────────── */
10
+
11
+ :root {
12
+ /* geometry */
13
+ --r-xs: 6px;
14
+ --r-s: 8px;
15
+ --r-m: 10px;
16
+ --r-l: 14px;
17
+ --r-xl: 20px;
18
+
19
+ /* type */
20
+ --font-ui: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
21
+ --font-mono: ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, monospace;
22
+ --font-display: var(--font-ui);
23
+ --track-display: -0.035em;
24
+ --fs-ui: 13.5px;
25
+
26
+ /* density-scaled geometry */
27
+ --control-h: 34px;
28
+ --pad-card: 20px;
29
+ --nav-item-h: 34px;
30
+ --cell-pad: 12px 16px;
31
+ --shell-side: 264px;
32
+ --shell-rail: 68px;
33
+ --shell-top: 60px;
34
+
35
+ /* motion */
36
+ --speed: 160ms;
37
+ --ease: cubic-bezier(0.25, 0.5, 0.35, 1);
38
+
39
+ /* brand accent — light/dark variants; theme blocks resolve them.
40
+ A brand preset only redefines these six. */
41
+ --acc-l: #5b47fb;
42
+ --acc-d: #8577ff;
43
+ --acc2-l: #00d4ff;
44
+ --acc2-d: #22d9ff;
45
+ --chart2-l: #0f8fa9;
46
+ --chart2-d: #1f9fb4;
47
+ }
48
+
49
+ :root[data-density="compact"] {
50
+ --fs-ui: 12.5px;
51
+ --control-h: 29px;
52
+ --pad-card: 14px;
53
+ --nav-item-h: 29px;
54
+ --cell-pad: 8px 14px;
55
+ --shell-top: 52px;
56
+ }
57
+
58
+ :root[data-type="editorial"] {
59
+ --font-display: "New York", ui-serif, Georgia, "Iowan Old Style", "Times New Roman", serif;
60
+ --track-display: -0.015em;
61
+ }
62
+
63
+ :root[data-type="terminal"] {
64
+ --font-display: var(--font-mono);
65
+ --track-display: -0.03em;
66
+ }
67
+
68
+ /* brand presets */
69
+ :root[data-brand="ember"] { --acc-l:#e8590c; --acc-d:#ff8b3d; --acc2-l:#f43f5e; --acc2-d:#fb7185; }
70
+ :root[data-brand="emerald"] { --acc-l:#0e9f6e; --acc-d:#34d39b; --acc2-l:#00d4ff; --acc2-d:#22d9ff; }
71
+ :root[data-brand="ocean"] { --acc-l:#2563eb; --acc-d:#6395ff; --acc2-l:#00d4ff; --acc2-d:#22d9ff; }
72
+ :root[data-brand="rose"] { --acc-l:#e11d63; --acc-d:#fb5c94; --acc2-l:#8b5cf6; --acc2-d:#a78bfa; }
73
+
74
+ /* light theme (default) */
75
+ :root {
76
+ color-scheme: light;
77
+ --ground: #f4f5f7;
78
+ --surface: #ffffff;
79
+ --surface-2: #f7f8fa;
80
+ --ink: #16181d;
81
+ --muted: #616873;
82
+ --faint: #98a0ab;
83
+ --line: #e6e8ec;
84
+ --line-strong: #d9dce2;
85
+ --accent: var(--acc-l);
86
+ --accent-2: var(--acc2-l);
87
+ --chart-2: var(--chart2-l);
88
+ --accent-ink: #ffffff;
89
+ --ok: #12925c;
90
+ --warn: #c47206;
91
+ --danger: #d92d20;
92
+ --shadow-s: 0 1px 2px rgb(16 18 23 / 5%);
93
+ --shadow-m: 0 8px 24px -12px rgb(16 18 23 / 18%);
94
+ --shadow-l: 0 24px 60px -24px rgb(16 18 23 / 25%);
95
+ --glass: rgb(255 255 255 / 68%);
96
+ --hero-ink-bg: #101116;
97
+ }
98
+
99
+ @media (prefers-color-scheme: dark) {
100
+ :root {
101
+ color-scheme: dark;
102
+ --ground: #0f1013;
103
+ --surface: #16171b;
104
+ --surface-2: #1d1f24;
105
+ --ink: #e8e9ee;
106
+ --muted: #9aa1ac;
107
+ --faint: #666d78;
108
+ --line: #26282f;
109
+ --line-strong: #33363e;
110
+ --accent: var(--acc-d);
111
+ --accent-2: var(--acc2-d);
112
+ --chart-2: var(--chart2-d);
113
+ --accent-ink: #101116;
114
+ --ok: #3ecf8e;
115
+ --warn: #f5a524;
116
+ --danger: #f0574d;
117
+ --shadow-s: 0 1px 2px rgb(0 0 0 / 40%);
118
+ --shadow-m: 0 8px 24px -12px rgb(0 0 0 / 55%);
119
+ --shadow-l: 0 24px 60px -24px rgb(0 0 0 / 65%);
120
+ --glass: rgb(22 23 27 / 66%);
121
+ --hero-ink-bg: #0b0c0f;
122
+ }
123
+ }
124
+
125
+ :root[data-theme="dark"] {
126
+ color-scheme: dark;
127
+ --ground: #0f1013;
128
+ --surface: #16171b;
129
+ --surface-2: #1d1f24;
130
+ --ink: #e8e9ee;
131
+ --muted: #9aa1ac;
132
+ --faint: #666d78;
133
+ --line: #26282f;
134
+ --line-strong: #33363e;
135
+ --accent: var(--acc-d);
136
+ --accent-2: var(--acc2-d);
137
+ --chart-2: var(--chart2-d);
138
+ --accent-ink: #101116;
139
+ --ok: #3ecf8e;
140
+ --warn: #f5a524;
141
+ --danger: #f0574d;
142
+ --shadow-s: 0 1px 2px rgb(0 0 0 / 40%);
143
+ --shadow-m: 0 8px 24px -12px rgb(0 0 0 / 55%);
144
+ --shadow-l: 0 24px 60px -24px rgb(0 0 0 / 65%);
145
+ --glass: rgb(22 23 27 / 66%);
146
+ --hero-ink-bg: #0b0c0f;
147
+ }
148
+
149
+ :root[data-theme="light"] {
150
+ color-scheme: light;
151
+ --ground: #f4f5f7;
152
+ --surface: #ffffff;
153
+ --surface-2: #f7f8fa;
154
+ --ink: #16181d;
155
+ --muted: #616873;
156
+ --faint: #98a0ab;
157
+ --line: #e6e8ec;
158
+ --line-strong: #d9dce2;
159
+ --accent: var(--acc-l);
160
+ --accent-2: var(--acc2-l);
161
+ --chart-2: var(--chart2-l);
162
+ --accent-ink: #ffffff;
163
+ --ok: #12925c;
164
+ --warn: #c47206;
165
+ --danger: #d92d20;
166
+ --shadow-s: 0 1px 2px rgb(16 18 23 / 5%);
167
+ --shadow-m: 0 8px 24px -12px rgb(16 18 23 / 18%);
168
+ --shadow-l: 0 24px 60px -24px rgb(16 18 23 / 25%);
169
+ --glass: rgb(255 255 255 / 68%);
170
+ --hero-ink-bg: #101116;
171
+ }
172
+
173
+ /* derived */
174
+ :root {
175
+ --beam: linear-gradient(135deg, var(--accent), var(--accent-2));
176
+ --accent-subtle: color-mix(in srgb, var(--accent) 11%, transparent);
177
+ --accent-hover: color-mix(in srgb, var(--accent) 88%, var(--ink) 12%);
178
+ --ring: color-mix(in srgb, var(--accent) 40%, transparent);
179
+ --ok-subtle: color-mix(in srgb, var(--ok) 13%, transparent);
180
+ --warn-subtle: color-mix(in srgb, var(--warn) 14%, transparent);
181
+ --danger-subtle: color-mix(in srgb, var(--danger) 12%, transparent);
182
+ }
183
+
184
+ /* ─── Base ───────────────────────────────────────────────────────────────── */
185
+
186
+ html { scroll-behavior: smooth; }
187
+ html[data-view="app"] { overflow: hidden; }
188
+
189
+ body {
190
+ margin: 0;
191
+ background: var(--ground);
192
+ color: var(--ink);
193
+ font-family: var(--font-ui);
194
+ font-size: var(--fs-ui);
195
+ line-height: 1.55;
196
+ -webkit-font-smoothing: antialiased;
197
+ }
198
+
199
+ * { box-sizing: border-box; }
200
+ svg { display: block; }
201
+ button { font: inherit; color: inherit; background: none; border: 0; padding: 0; cursor: pointer; }
202
+ :is(button, a, [tabindex]):focus-visible { outline: 2px solid var(--ring); outline-offset: 2px; border-radius: var(--r-xs); }
203
+ ::selection { background: color-mix(in srgb, var(--accent) 25%, transparent); }
204
+
205
+ h1, h2, h3 { margin: 0; font-family: var(--font-display); letter-spacing: var(--track-display); text-wrap: balance; }
206
+ p { margin: 0; }
207
+
208
+ .num { font-variant-numeric: tabular-nums; }
209
+ .mono { font-family: var(--font-mono); }
210
+
211
+ /* view switching */
212
+ .view--site { display: block; }
213
+ .view--app { display: none; }
214
+ html[data-view="app"] .view--site { display: none; }
215
+ html[data-view="app"] .view--app { display: block; }
216
+
217
+ /* ─── Shared atoms ───────────────────────────────────────────────────────── */
218
+
219
+ .btn {
220
+ display: inline-flex;
221
+ align-items: center;
222
+ justify-content: center;
223
+ gap: 7px;
224
+ height: var(--control-h);
225
+ padding: 0 14px;
226
+ border-radius: var(--r-s);
227
+ font-weight: 560;
228
+ font-size: var(--fs-ui);
229
+ border: 1px solid transparent;
230
+ transition: background var(--speed) var(--ease), border-color var(--speed) var(--ease),
231
+ color var(--speed) var(--ease), transform var(--speed) var(--ease);
232
+ white-space: nowrap;
233
+ }
234
+ .btn:active { transform: translateY(1px); }
235
+ .btn--primary { background: var(--accent); color: var(--accent-ink); }
236
+ .btn--primary:hover { background: var(--accent-hover); }
237
+ .btn--ink { background: var(--ink); color: var(--surface); }
238
+ .btn--ink:hover { opacity: 0.88; }
239
+ .btn--ghost { border-color: var(--line-strong); color: var(--ink); background: var(--surface); }
240
+ .btn--ghost:hover { background: var(--surface-2); }
241
+ .btn--quiet:hover { background: var(--surface-2); }
242
+ .btn--lg { height: calc(var(--control-h) + 10px); padding: 0 20px; font-size: calc(var(--fs-ui) + 1.5px); border-radius: var(--r-m); }
243
+
244
+ /* gradient border shell — Ian's gradient-border buttons/cards */
245
+ .gborder {
246
+ position: relative;
247
+ border: 1px solid transparent;
248
+ background:
249
+ linear-gradient(var(--surface), var(--surface)) padding-box,
250
+ var(--beam) border-box;
251
+ }
252
+ .btn.gborder:hover { box-shadow: 0 0 0 3px var(--accent-subtle); }
253
+
254
+ .iconbtn {
255
+ display: inline-flex;
256
+ align-items: center;
257
+ justify-content: center;
258
+ width: var(--control-h);
259
+ height: var(--control-h);
260
+ border-radius: var(--r-s);
261
+ color: var(--muted);
262
+ position: relative;
263
+ }
264
+ .iconbtn:hover { background: var(--surface-2); color: var(--ink); }
265
+ .iconbtn .dot {
266
+ position: absolute; top: 7px; right: 7px;
267
+ width: 7px; height: 7px; border-radius: 50%;
268
+ background: var(--danger); border: 2px solid var(--surface);
269
+ }
270
+
271
+ .chip {
272
+ display: inline-flex;
273
+ align-items: center;
274
+ gap: 6px;
275
+ height: 22px;
276
+ padding: 0 9px;
277
+ border-radius: 999px;
278
+ font-size: 11.5px;
279
+ font-weight: 560;
280
+ border: 1px solid var(--line);
281
+ background: var(--surface-2);
282
+ color: var(--muted);
283
+ white-space: nowrap;
284
+ }
285
+ .chip--accent { background: var(--accent-subtle); border-color: transparent; color: var(--accent); }
286
+
287
+ .pill-status { display: inline-flex; align-items: center; gap: 7px; font-weight: 560; font-size: 12px; }
288
+ .pill-status i { width: 7px; height: 7px; border-radius: 50%; flex: none; }
289
+ .pill-status--ok { color: var(--ok); } .pill-status--ok i { background: var(--ok); }
290
+ .pill-status--warn { color: var(--warn); } .pill-status--warn i { background: var(--warn); animation: pulse 1.4s ease-in-out infinite; }
291
+ .pill-status--danger { color: var(--danger); } .pill-status--danger i { background: var(--danger); }
292
+ @keyframes pulse { 50% { opacity: 0.35; } }
293
+
294
+ .seg {
295
+ display: inline-flex;
296
+ padding: 3px;
297
+ gap: 2px;
298
+ background: var(--surface-2);
299
+ border: 1px solid var(--line);
300
+ border-radius: var(--r-s);
301
+ }
302
+ .seg button {
303
+ height: calc(var(--control-h) - 8px);
304
+ padding: 0 12px;
305
+ border-radius: calc(var(--r-s) - 3px);
306
+ color: var(--muted);
307
+ font-weight: 560;
308
+ font-size: 12.5px;
309
+ }
310
+ .seg button:hover { color: var(--ink); }
311
+ .seg button[aria-pressed="true"] { background: var(--surface); color: var(--ink); box-shadow: var(--shadow-s); }
312
+
313
+ .card {
314
+ background: var(--surface);
315
+ border: 1px solid var(--line);
316
+ border-radius: var(--r-l);
317
+ box-shadow: var(--shadow-s);
318
+ }
319
+
320
+ .avatar {
321
+ display: inline-flex; align-items: center; justify-content: center;
322
+ width: 26px; height: 26px; border-radius: 50%;
323
+ background: var(--beam); color: #fff;
324
+ font-size: 10.5px; font-weight: 700; letter-spacing: 0.02em;
325
+ flex: none;
326
+ }
327
+
328
+ /* Ω brandmark */
329
+ .mark {
330
+ display: inline-flex; align-items: center; justify-content: center;
331
+ width: 30px; height: 30px; border-radius: 9px;
332
+ background: var(--beam); color: #fff;
333
+ font-size: 17px; font-weight: 700; line-height: 1;
334
+ box-shadow: 0 2px 8px -2px color-mix(in srgb, var(--accent) 55%, transparent);
335
+ flex: none;
336
+ font-family: var(--font-ui);
337
+ }
338
+ .lockup { display: inline-flex; align-items: center; gap: 10px; font-weight: 680; font-size: 15.5px; letter-spacing: -0.02em; }
339
+
340
+ /* ============================================================================
341
+ SITE — marketing view
342
+ ========================================================================== */
343
+
344
+ .site { position: relative; }
345
+
346
+ /* glassy nav — invisible until scroll */
347
+ .nav {
348
+ position: fixed;
349
+ inset: 0 0 auto 0;
350
+ z-index: 60;
351
+ transition: background var(--speed) var(--ease), border-color var(--speed) var(--ease),
352
+ backdrop-filter var(--speed) var(--ease);
353
+ border-bottom: 1px solid transparent;
354
+ }
355
+ .nav.scrolled {
356
+ background: var(--glass);
357
+ -webkit-backdrop-filter: blur(16px) saturate(1.5);
358
+ backdrop-filter: blur(16px) saturate(1.5);
359
+ border-bottom-color: var(--line);
360
+ }
361
+ .nav__in {
362
+ max-width: 1180px; margin: 0 auto;
363
+ display: flex; align-items: center; gap: 26px;
364
+ padding: 12px 28px;
365
+ }
366
+ .nav__links { display: flex; gap: 4px; margin-inline-start: 10px; }
367
+ .nav__links a {
368
+ color: var(--muted); text-decoration: none; font-weight: 540; font-size: 13.5px;
369
+ padding: 7px 11px; border-radius: var(--r-s);
370
+ }
371
+ .nav__links a:hover { color: var(--ink); background: var(--surface-2); }
372
+ .nav__cta { margin-inline-start: auto; display: flex; align-items: center; gap: 10px; }
373
+
374
+ /* hero */
375
+ .hero {
376
+ position: relative;
377
+ padding: 158px 28px 96px;
378
+ overflow: clip;
379
+ background: var(--ground);
380
+ }
381
+ .hero__bg { position: absolute; inset: 0; pointer-events: none; }
382
+ .hero__dots {
383
+ position: absolute; inset: 0;
384
+ background-image: radial-gradient(color-mix(in srgb, var(--ink) 16%, transparent) 1px, transparent 1px);
385
+ background-size: 22px 22px;
386
+ -webkit-mask-image: radial-gradient(ellipse 75% 62% at 50% 30%, #000 30%, transparent 72%);
387
+ mask-image: radial-gradient(ellipse 75% 62% at 50% 30%, #000 30%, transparent 72%);
388
+ opacity: 0.5;
389
+ }
390
+ .aurora { position: absolute; border-radius: 50%; filter: blur(90px); opacity: 0.42; will-change: transform; }
391
+ .aurora--1 { width: 560px; height: 420px; left: 6%; top: -6%; background: var(--accent); animation: drift1 26s ease-in-out infinite alternate; }
392
+ .aurora--2 { width: 480px; height: 380px; right: 4%; top: 4%; background: var(--accent-2); opacity: 0.3; animation: drift2 31s ease-in-out infinite alternate; }
393
+ .aurora--3 { width: 420px; height: 360px; left: 38%; top: 30%; background: color-mix(in srgb, var(--accent) 60%, var(--accent-2)); opacity: 0.2; animation: drift1 37s ease-in-out infinite alternate-reverse; }
394
+ @keyframes drift1 { to { transform: translate(70px, 46px) scale(1.12); } }
395
+ @keyframes drift2 { to { transform: translate(-64px, 38px) scale(0.92); } }
396
+
397
+ .hero__in { position: relative; max-width: 1180px; margin: 0 auto; text-align: center; }
398
+
399
+ .hero__badge {
400
+ display: inline-flex; align-items: center; gap: 8px;
401
+ padding: 6px 14px; border-radius: 999px;
402
+ font-size: 12.5px; font-weight: 560; color: var(--muted);
403
+ background:
404
+ linear-gradient(var(--surface), var(--surface)) padding-box,
405
+ var(--beam) border-box;
406
+ border: 1px solid transparent;
407
+ box-shadow: var(--shadow-s);
408
+ }
409
+ .hero__badge b { color: var(--accent); font-weight: 650; }
410
+
411
+ .hero h1 {
412
+ margin: 26px auto 0;
413
+ max-width: 15ch;
414
+ font-size: clamp(44px, 7.2vw, 86px);
415
+ line-height: 1.02;
416
+ font-weight: 740;
417
+ }
418
+ .hero h1 .beam-text {
419
+ background: var(--beam);
420
+ -webkit-background-clip: text;
421
+ background-clip: text;
422
+ color: transparent;
423
+ }
424
+ .hero__sub {
425
+ margin: 22px auto 0;
426
+ max-width: 62ch;
427
+ color: var(--muted);
428
+ font-size: clamp(15px, 1.6vw, 18px);
429
+ line-height: 1.65;
430
+ }
431
+ .hero__sub code { font-family: var(--font-mono); font-size: 0.88em; background: var(--surface-2); border: 1px solid var(--line); padding: 1px 6px; border-radius: 6px; }
432
+ .hero__cta { margin-top: 32px; display: flex; gap: 12px; justify-content: center; flex-wrap: wrap; }
433
+ .hero__cmd { gap: 10px; font-family: var(--font-mono); font-size: 13px; font-weight: 500; color: var(--muted); }
434
+ .hero__cmd:hover { color: var(--ink); }
435
+
436
+ /* entrance stagger */
437
+ .rise { opacity: 0; transform: translateY(16px); animation: rise 0.7s var(--ease) forwards; }
438
+ .rise-2 { animation-delay: 0.08s; }
439
+ .rise-3 { animation-delay: 0.16s; }
440
+ .rise-4 { animation-delay: 0.26s; }
441
+ .rise-5 { animation-delay: 0.4s; }
442
+ @keyframes rise { to { opacity: 1; transform: none; } }
443
+
444
+ /* floating app frame */
445
+ .frame-wrap { position: relative; margin: 64px auto 0; max-width: 980px; perspective: 1600px; }
446
+ .frame-halo {
447
+ position: absolute; inset: -8% -6%;
448
+ background: conic-gradient(from 210deg, transparent 12%, color-mix(in srgb, var(--accent) 32%, transparent), color-mix(in srgb, var(--accent-2) 30%, transparent), transparent 78%);
449
+ filter: blur(56px);
450
+ border-radius: 50%;
451
+ opacity: 0.7;
452
+ pointer-events: none;
453
+ }
454
+ .frame {
455
+ position: relative;
456
+ border-radius: var(--r-xl);
457
+ border: 1px solid var(--line);
458
+ background: var(--surface);
459
+ box-shadow: var(--shadow-l);
460
+ overflow: hidden;
461
+ transform: rotateX(7deg);
462
+ transform-origin: 50% 0;
463
+ transition: transform 0.7s var(--ease);
464
+ }
465
+ .frame-wrap:hover .frame { transform: rotateX(2.5deg); }
466
+ .frame__bar {
467
+ display: flex; align-items: center; gap: 8px;
468
+ padding: 11px 16px;
469
+ border-bottom: 1px solid var(--line);
470
+ background: var(--surface-2);
471
+ }
472
+ .frame__bar i { width: 10px; height: 10px; border-radius: 50%; background: var(--line-strong); }
473
+ .frame__url {
474
+ margin: 0 auto;
475
+ display: inline-flex; align-items: center; gap: 7px;
476
+ font-size: 11.5px; color: var(--muted);
477
+ background: var(--surface); border: 1px solid var(--line);
478
+ padding: 4px 14px; border-radius: 999px;
479
+ font-family: var(--font-mono);
480
+ }
481
+ .frame__body { display: grid; grid-template-columns: 208px 1fr; min-height: 380px; background: var(--ground); }
482
+ .frame__side { background: var(--ground); border-inline-end: 1px solid var(--line); padding: 14px 10px; display: flex; flex-direction: column; gap: 3px; }
483
+ .frame__side .lockup { padding: 4px 8px 10px; font-size: 13px; }
484
+ .frame__side .mark { width: 22px; height: 22px; border-radius: 7px; font-size: 12px; }
485
+ .fnav {
486
+ display: flex; align-items: center; gap: 9px;
487
+ padding: 6px 9px; border-radius: 8px;
488
+ color: var(--muted); font-size: 12px; font-weight: 540;
489
+ }
490
+ .fnav svg { opacity: 0.75; }
491
+ .fnav.on { background: var(--accent-subtle); color: var(--accent); font-weight: 620; }
492
+ .fnav.on svg { opacity: 1; }
493
+ .frame__main { padding: 18px; display: flex; flex-direction: column; gap: 12px; }
494
+ .frame__tiles { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
495
+ .ftile { background: var(--surface); border: 1px solid var(--line); border-radius: 10px; padding: 12px 14px; text-align: left; }
496
+ .ftile b { display: block; font-size: 17px; letter-spacing: -0.02em; }
497
+ .ftile span { font-size: 11px; color: var(--muted); }
498
+ .ftile .up { color: var(--ok); font-size: 10.5px; font-weight: 650; }
499
+ .fchart { flex: 1; background: var(--surface); border: 1px solid var(--line); border-radius: 12px; padding: 12px 14px; text-align: left; }
500
+ .fchart span { font-size: 11px; color: var(--muted); }
501
+
502
+ /* logo marquee */
503
+ .logos { padding: 34px 0 10px; border-block: 1px solid var(--line); background: var(--surface); }
504
+ .logos p { text-align: center; font-size: 11.5px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--faint); font-weight: 600; }
505
+ .marquee { overflow: hidden; margin-top: 18px; padding-bottom: 26px; -webkit-mask-image: linear-gradient(90deg, transparent, #000 12%, #000 88%, transparent); mask-image: linear-gradient(90deg, transparent, #000 12%, #000 88%, transparent); }
506
+ .marquee__track { display: flex; width: max-content; animation: slide 30s linear infinite; }
507
+ .marquee__track .wlogo { margin-inline-end: 64px; }
508
+ .marquee:hover .marquee__track { animation-play-state: paused; }
509
+ @keyframes slide { to { transform: translateX(-50%); } }
510
+ .wlogo { font-weight: 740; font-size: 17px; letter-spacing: 0.02em; color: var(--faint); white-space: nowrap; font-family: var(--font-display); }
511
+
512
+ /* sections */
513
+ .section { padding: 96px 28px; }
514
+ .section__in { max-width: 1180px; margin: 0 auto; }
515
+ .section__eyebrow { color: var(--accent); font-weight: 650; font-size: 12.5px; letter-spacing: 0.12em; text-transform: uppercase; }
516
+ .section h2 { font-size: clamp(30px, 4vw, 46px); font-weight: 720; line-height: 1.08; margin-top: 12px; max-width: 22ch; }
517
+ .section__sub { color: var(--muted); max-width: 58ch; margin-top: 14px; font-size: 15.5px; line-height: 1.65; }
518
+
519
+ /* bento */
520
+ .bento { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; margin-top: 44px; }
521
+ .bento .card { padding: var(--pad-card); display: flex; flex-direction: column; gap: 10px; transition: transform var(--speed) var(--ease), box-shadow var(--speed) var(--ease); position: relative; overflow: clip; }
522
+ .bento .card:hover { transform: translateY(-3px); box-shadow: var(--shadow-m); }
523
+ .bento .card h3 { font-size: 16.5px; font-weight: 650; letter-spacing: -0.015em; }
524
+ .bento .card p { color: var(--muted); font-size: 13px; line-height: 1.6; }
525
+ .b-2x2 { grid-column: span 2; grid-row: span 2; }
526
+ .b-2x1 { grid-column: span 2; }
527
+ .icotile {
528
+ width: 34px; height: 34px; border-radius: 10px;
529
+ display: inline-flex; align-items: center; justify-content: center;
530
+ background: var(--accent-subtle); color: var(--accent);
531
+ flex: none;
532
+ }
533
+ .codebox {
534
+ margin-top: auto;
535
+ background: var(--hero-ink-bg);
536
+ color: #dfe2ea;
537
+ border-radius: var(--r-m);
538
+ border: 1px solid color-mix(in srgb, var(--line-strong) 50%, transparent);
539
+ padding: 16px 18px;
540
+ font-family: var(--font-mono);
541
+ font-size: 12px;
542
+ line-height: 1.75;
543
+ overflow-x: auto;
544
+ }
545
+ .codebox .k { color: #8ea0b8; }
546
+ .codebox .s { color: var(--accent-2); }
547
+ .codebox .c { color: #5b6474; }
548
+ .targets { display: flex; flex-wrap: wrap; gap: 8px; }
549
+ .brand-dots { display: flex; gap: 10px; margin-top: auto; padding-top: 6px; }
550
+ .bdot {
551
+ width: 26px; height: 26px; border-radius: 50%;
552
+ border: 2px solid var(--surface);
553
+ box-shadow: 0 0 0 1px var(--line-strong);
554
+ transition: transform var(--speed) var(--ease), box-shadow var(--speed) var(--ease);
555
+ }
556
+ .bdot:hover { transform: scale(1.15); }
557
+ .bdot[aria-pressed="true"] { box-shadow: 0 0 0 2px var(--accent); transform: scale(1.08); }
558
+ .split { display: flex; border-radius: var(--r-m); overflow: hidden; border: 1px solid var(--line); margin-top: auto; min-height: 74px; }
559
+ .split > div { flex: 1; padding: 10px 12px; font-size: 11px; font-weight: 600; }
560
+ .split .lite { background: #f4f5f7; color: #616873; }
561
+ .split .dark { background: #101116; color: #9aa1ac; }
562
+ .split i { display: block; width: 34px; height: 8px; border-radius: 999px; background: var(--beam); margin-top: 8px; }
563
+ .term {
564
+ margin-top: auto;
565
+ background: var(--hero-ink-bg); border-radius: var(--r-m); padding: 14px 18px;
566
+ font-family: var(--font-mono); font-size: 12.5px; color: #dfe2ea;
567
+ display: flex; align-items: center; gap: 10px;
568
+ border: 1px solid color-mix(in srgb, var(--line-strong) 50%, transparent);
569
+ overflow-x: auto; white-space: nowrap;
570
+ }
571
+ .term .p { color: var(--accent-2); }
572
+ .term .okx { color: #3ecf8e; }
573
+ .term::after { content: ""; width: 7px; height: 15px; background: #dfe2ea; animation: caret 1.1s steps(1) infinite; flex: none; }
574
+ @keyframes caret { 50% { opacity: 0; } }
575
+ .mini-rows { display: flex; flex-direction: column; gap: 8px; margin-top: auto; }
576
+ .mini-rows div { display: flex; align-items: center; gap: 9px; font-size: 12.5px; color: var(--muted); font-weight: 540; }
577
+ .mini-rows svg { color: var(--ok); flex: none; }
578
+
579
+ /* stats band */
580
+ .band {
581
+ position: relative;
582
+ background: var(--hero-ink-bg);
583
+ color: #eceef4;
584
+ overflow: clip;
585
+ }
586
+ .band .aurora--1 { opacity: 0.3; }
587
+ .band .aurora--2 { opacity: 0.22; }
588
+ .band__grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 24px; position: relative; }
589
+ .band__cell { text-align: center; padding: 10px 6px; }
590
+ .band__cell b {
591
+ display: block;
592
+ font-family: var(--font-display);
593
+ font-size: clamp(34px, 4.6vw, 58px);
594
+ font-weight: 740;
595
+ letter-spacing: var(--track-display);
596
+ background: var(--beam);
597
+ -webkit-background-clip: text;
598
+ background-clip: text;
599
+ color: transparent;
600
+ }
601
+ .band__cell span { color: #9aa1ac; font-size: 13px; font-weight: 540; }
602
+
603
+ /* pricing */
604
+ .pricing { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; margin-top: 44px; align-items: stretch; }
605
+ .price { padding: calc(var(--pad-card) + 6px); display: flex; flex-direction: column; gap: 14px; }
606
+ .price--pop { box-shadow: var(--shadow-m); }
607
+ .price__head { display: flex; align-items: center; justify-content: space-between; }
608
+ .price__name { font-weight: 680; font-size: 15.5px; }
609
+ .price__amt { font-family: var(--font-display); font-size: 40px; font-weight: 730; letter-spacing: -0.03em; }
610
+ .price__amt span { font-size: 14px; color: var(--muted); font-weight: 520; letter-spacing: 0; font-family: var(--font-ui); }
611
+ .price ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 9px; }
612
+ .price li { display: flex; gap: 9px; align-items: center; color: var(--muted); font-size: 13px; }
613
+ .price li svg { color: var(--ok); flex: none; }
614
+ .price .btn { margin-top: auto; }
615
+
616
+ /* quote */
617
+ .quote { text-align: center; max-width: 760px; margin: 0 auto; }
618
+ .quote blockquote {
619
+ margin: 0;
620
+ font-family: var(--font-display);
621
+ font-size: clamp(22px, 3vw, 32px);
622
+ font-weight: 620;
623
+ line-height: 1.3;
624
+ letter-spacing: -0.02em;
625
+ }
626
+ .quote blockquote .beam-text { background: var(--beam); -webkit-background-clip: text; background-clip: text; color: transparent; }
627
+ .quote figcaption { margin-top: 18px; color: var(--muted); font-size: 13.5px; display: flex; align-items: center; gap: 10px; justify-content: center; }
628
+
629
+ /* cta band */
630
+ .cta-band {
631
+ position: relative;
632
+ border-radius: var(--r-xl);
633
+ overflow: clip;
634
+ background: var(--hero-ink-bg);
635
+ color: #eceef4;
636
+ padding: 72px 40px;
637
+ text-align: center;
638
+ }
639
+ .cta-band .aurora--1 { left: 18%; top: 20%; opacity: 0.36; }
640
+ .cta-band .aurora--2 { right: 12%; top: -10%; opacity: 0.3; }
641
+ .cta-band h2 { font-size: clamp(28px, 3.6vw, 44px); font-weight: 730; position: relative; }
642
+ .cta-band p { color: #9aa1ac; margin-top: 12px; position: relative; }
643
+ .cta-band .hero__cta { position: relative; }
644
+
645
+ /* footer */
646
+ .footer { border-top: 1px solid var(--line); background: var(--surface); padding: 56px 28px 34px; }
647
+ .footer__in { max-width: 1180px; margin: 0 auto; }
648
+ .footer__grid { display: grid; grid-template-columns: 2fr 1fr 1fr 1fr; gap: 32px; }
649
+ .footer h4 { margin: 0 0 12px; font-size: 12px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--faint); }
650
+ .footer a { display: block; color: var(--muted); text-decoration: none; font-size: 13px; padding: 4px 0; }
651
+ .footer a:hover { color: var(--ink); }
652
+ .footer__brand p { color: var(--muted); font-size: 13px; max-width: 30ch; margin-top: 12px; line-height: 1.6; }
653
+ .footer__base {
654
+ display: flex; align-items: center; gap: 14px;
655
+ margin-top: 40px; padding-top: 22px;
656
+ border-top: 1px solid var(--line);
657
+ color: var(--faint); font-size: 12.5px;
658
+ }
659
+
660
+ /* scroll reveal */
661
+ .rv { opacity: 0; transform: translateY(16px); }
662
+ .rv.in { opacity: 1; transform: none; transition: opacity 0.65s var(--ease), transform 0.65s var(--ease); }
663
+
664
+ /* ============================================================================
665
+ APP — dashboard view
666
+ ========================================================================== */
667
+
668
+ .shell {
669
+ display: grid;
670
+ grid-template-columns: auto minmax(0, 1fr);
671
+ grid-template-rows: auto minmax(0, 1fr);
672
+ height: 100dvh;
673
+ background: var(--ground);
674
+ }
675
+
676
+ /* sidebar lives ON the ground (GitBook pattern) — content gets the big card */
677
+ .side {
678
+ grid-row: 1 / -1;
679
+ width: var(--shell-side);
680
+ display: flex;
681
+ flex-direction: column;
682
+ padding: 14px 12px 12px;
683
+ gap: 2px;
684
+ overflow-y: auto;
685
+ overflow-x: hidden;
686
+ transition: width var(--speed) var(--ease), transform var(--speed) var(--ease);
687
+ }
688
+ .side__head { display: flex; align-items: center; gap: 10px; padding: 2px 8px 12px; }
689
+ .side__head .word { font-weight: 680; font-size: 15px; letter-spacing: -0.02em; white-space: nowrap; }
690
+ .side__head .ver { margin-inline-start: auto; }
691
+
692
+ .selector {
693
+ display: flex; align-items: center; gap: 9px;
694
+ padding: 7px 9px;
695
+ border-radius: var(--r-m);
696
+ border: 1px solid var(--line);
697
+ background: var(--surface);
698
+ box-shadow: var(--shadow-s);
699
+ margin-bottom: 10px;
700
+ width: 100%;
701
+ text-align: left;
702
+ }
703
+ .selector:hover { border-color: var(--line-strong); }
704
+ .selector .pdot { width: 20px; height: 20px; border-radius: 7px; background: var(--beam); flex: none; }
705
+ .selector b { font-size: 12.5px; font-weight: 620; display: block; line-height: 1.2; white-space: nowrap; }
706
+ .selector span { font-size: 11px; color: var(--faint); display: block; line-height: 1.2; }
707
+ .selector svg { margin-inline-start: auto; color: var(--faint); flex: none; }
708
+
709
+ .side__search {
710
+ display: flex; align-items: center; gap: 8px;
711
+ padding: 0 10px;
712
+ height: calc(var(--control-h) - 2px);
713
+ border-radius: var(--r-s);
714
+ border: 1px solid var(--line);
715
+ background: var(--surface);
716
+ color: var(--faint);
717
+ font-size: 12.5px;
718
+ margin-bottom: 12px;
719
+ width: 100%;
720
+ }
721
+ .side__search:hover { border-color: var(--line-strong); color: var(--muted); }
722
+ .side__search kbd {
723
+ margin-inline-start: auto;
724
+ font-family: var(--font-mono); font-size: 10px;
725
+ border: 1px solid var(--line); border-radius: 5px;
726
+ padding: 1px 5px; color: var(--faint); background: var(--surface-2);
727
+ }
728
+
729
+ .side__label {
730
+ padding: 14px 10px 5px;
731
+ font-size: 10.5px;
732
+ font-weight: 650;
733
+ letter-spacing: 0.09em;
734
+ text-transform: uppercase;
735
+ color: var(--faint);
736
+ white-space: nowrap;
737
+ }
738
+
739
+ .nav-item {
740
+ display: flex; align-items: center; gap: 10px;
741
+ height: var(--nav-item-h);
742
+ padding: 0 10px;
743
+ border-radius: var(--r-s);
744
+ color: var(--muted);
745
+ font-weight: 540;
746
+ font-size: 13px;
747
+ width: 100%;
748
+ text-align: left;
749
+ white-space: nowrap;
750
+ }
751
+ .nav-item svg { flex: none; opacity: 0.85; }
752
+ .nav-item:hover { background: color-mix(in srgb, var(--ink) 5%, transparent); color: var(--ink); }
753
+ .nav-item[aria-current="page"] {
754
+ background: var(--surface);
755
+ color: var(--ink);
756
+ font-weight: 620;
757
+ box-shadow: var(--shadow-s);
758
+ border: 1px solid var(--line);
759
+ }
760
+ .nav-item[aria-current="page"] svg { color: var(--accent); opacity: 1; }
761
+ .nav-item .tail { margin-inline-start: auto; }
762
+
763
+ .side__foot { margin-top: auto; display: flex; flex-direction: column; gap: 10px; padding-top: 14px; }
764
+
765
+ /* the optional ad module */
766
+ .ad {
767
+ position: relative;
768
+ border-radius: var(--r-m);
769
+ padding: 12px 12px 11px;
770
+ background:
771
+ linear-gradient(var(--surface), var(--surface)) padding-box,
772
+ var(--beam) border-box;
773
+ border: 1px solid transparent;
774
+ box-shadow: var(--shadow-s);
775
+ }
776
+ .ad__tag { font-size: 9.5px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--faint); font-weight: 650; }
777
+ .ad b { display: block; font-size: 12.5px; font-weight: 620; margin-top: 3px; letter-spacing: -0.01em; }
778
+ .ad p { font-size: 11.5px; color: var(--muted); line-height: 1.45; margin-top: 2px; }
779
+ .ad a { color: var(--accent); font-size: 11.5px; font-weight: 620; text-decoration: none; display: inline-block; margin-top: 6px; }
780
+ .ad__x { position: absolute; top: 6px; right: 6px; color: var(--faint); width: 20px; height: 20px; display: flex; align-items: center; justify-content: center; border-radius: 6px; }
781
+ .ad__x:hover { color: var(--ink); background: var(--surface-2); }
782
+
783
+ .user-row { display: flex; align-items: center; gap: 9px; padding: 6px 8px; border-radius: var(--r-s); width: 100%; text-align: left; }
784
+ .user-row:hover { background: color-mix(in srgb, var(--ink) 5%, transparent); }
785
+ .user-row b { display: block; font-size: 12.5px; font-weight: 600; line-height: 1.25; white-space: nowrap; }
786
+ .user-row span { display: block; font-size: 11px; color: var(--faint); line-height: 1.25; white-space: nowrap; }
787
+ .user-row svg { margin-inline-start: auto; color: var(--faint); flex: none; }
788
+
789
+ /* collapsed rail */
790
+ .shell[data-collapsed="true"] .side { width: var(--shell-rail); padding-inline: 10px; }
791
+ .shell[data-collapsed="true"] :is(.side__head .word, .side__head .ver, .side .meta, .selector > svg,
792
+ .side__search kbd, .side__search span, .side__label, .nav-item .lbl, .nav-item .tail,
793
+ .ad, .user-row > svg) { display: none; }
794
+ .shell[data-collapsed="true"] .side__head { justify-content: center; padding-inline: 0; }
795
+ .shell[data-collapsed="true"] .selector { justify-content: center; padding: 8px 0; }
796
+ .shell[data-collapsed="true"] .side__search { justify-content: center; padding: 0; }
797
+ .shell[data-collapsed="true"] .nav-item { justify-content: center; padding: 0; gap: 0; }
798
+ .shell[data-collapsed="true"] .user-row { justify-content: center; }
799
+
800
+ /* topbar */
801
+ .top {
802
+ grid-column: 2;
803
+ display: flex; align-items: center; gap: 10px;
804
+ min-height: var(--shell-top);
805
+ padding: 0 18px 0 6px;
806
+ }
807
+ .top__toggle { color: var(--muted); }
808
+ .crumb { display: flex; align-items: center; gap: 8px; font-size: 13.5px; font-weight: 620; }
809
+ .crumb .sep { color: var(--faint); font-weight: 400; }
810
+ .top__end { margin-inline-start: auto; display: flex; align-items: center; gap: 6px; }
811
+ .top__divider { width: 1px; height: 22px; background: var(--line-strong); margin: 0 6px; }
812
+
813
+ .account { position: relative; }
814
+ .account > button {
815
+ display: flex; align-items: center; gap: 9px;
816
+ height: var(--control-h);
817
+ padding: 0 10px 0 6px;
818
+ border-radius: 999px;
819
+ border: 1px solid transparent;
820
+ }
821
+ .account > button:hover { background: var(--surface); border-color: var(--line); box-shadow: var(--shadow-s); }
822
+ .account b { font-size: 12.5px; font-weight: 600; }
823
+ .account svg { color: var(--faint); }
824
+ .menu {
825
+ position: absolute; top: calc(100% + 8px); right: 0;
826
+ min-width: 210px;
827
+ background: var(--surface);
828
+ border: 1px solid var(--line);
829
+ border-radius: var(--r-m);
830
+ box-shadow: var(--shadow-m);
831
+ padding: 6px;
832
+ display: none;
833
+ z-index: 40;
834
+ }
835
+ .account.open .menu { display: block; }
836
+ .menu__head { padding: 8px 10px 10px; border-bottom: 1px solid var(--line); margin-bottom: 6px; }
837
+ .menu__head b { font-size: 13px; display: block; }
838
+ .menu__head span { font-size: 11.5px; color: var(--faint); }
839
+ .menu button { display: flex; align-items: center; gap: 10px; width: 100%; text-align: left; padding: 8px 10px; border-radius: var(--r-s); font-size: 13px; color: var(--muted); }
840
+ .menu button:hover { background: var(--surface-2); color: var(--ink); }
841
+ .menu button.danger { color: var(--danger); }
842
+
843
+ /* main — the one big rounded card */
844
+ .main {
845
+ grid-column: 2;
846
+ overflow-y: auto;
847
+ margin: 0 14px 14px 6px;
848
+ background: var(--surface);
849
+ border: 1px solid var(--line);
850
+ border-radius: var(--r-xl);
851
+ box-shadow: var(--shadow-s);
852
+ }
853
+ .main__in { max-width: 1160px; margin: 0 auto; padding: calc(var(--pad-card) + 12px) calc(var(--pad-card) + 12px) 48px; }
854
+
855
+ .page-head { display: flex; align-items: flex-end; gap: 18px; flex-wrap: wrap; }
856
+ .page-head h1 { font-size: 25px; font-weight: 700; }
857
+ .page-head .sub { color: var(--muted); font-size: 13.5px; margin-top: 5px; }
858
+ .page-head__end { margin-inline-start: auto; display: flex; align-items: center; gap: 10px; }
859
+
860
+ /* stat tiles */
861
+ .tiles { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; margin-top: 26px; }
862
+ .tile { padding: calc(var(--pad-card) - 4px) var(--pad-card); display: flex; flex-direction: column; gap: 4px; }
863
+ .tile__label { font-size: 12px; color: var(--muted); font-weight: 560; display: flex; align-items: center; gap: 8px; }
864
+ .tile__row { display: flex; align-items: baseline; gap: 10px; }
865
+ .tile__num { font-family: var(--font-display); font-size: 26px; font-weight: 700; letter-spacing: -0.03em; }
866
+ .delta { font-size: 11.5px; font-weight: 650; padding: 2px 7px; border-radius: 999px; }
867
+ .delta--up { color: var(--ok); background: var(--ok-subtle); }
868
+ .delta--down { color: var(--danger); background: var(--danger-subtle); }
869
+ .delta--flat { color: var(--muted); background: var(--surface-2); }
870
+ .tile svg.spark { margin-top: 8px; width: 100%; height: 34px; }
871
+
872
+ /* grid: chart + side column */
873
+ .grid-2 { display: grid; grid-template-columns: minmax(0, 1fr) 320px; gap: 14px; margin-top: 14px; }
874
+ .panel { padding: var(--pad-card); }
875
+ .panel__head { display: flex; align-items: center; gap: 12px; margin-bottom: 14px; }
876
+ .panel__head h3 { font-size: 14.5px; font-weight: 650; letter-spacing: -0.01em; }
877
+ .panel__head .end { margin-inline-start: auto; display: flex; align-items: center; gap: 10px; }
878
+ .legend { display: flex; gap: 14px; font-size: 12px; color: var(--muted); }
879
+ .legend i { display: inline-block; width: 14px; height: 3px; border-radius: 2px; background: var(--accent); vertical-align: middle; margin-inline-end: 6px; }
880
+ .legend .prev i { background: var(--chart-2); height: 0; border-top: 2.5px dashed var(--chart-2); }
881
+
882
+ .chart-wrap { position: relative; }
883
+ .panel--chart { display: flex; flex-direction: column; }
884
+ .toppages { margin-top: auto; border-top: 1px solid var(--line); padding-top: 12px; }
885
+ .tp-head { display: flex; justify-content: space-between; font-size: 11px; letter-spacing: 0.07em; text-transform: uppercase; color: var(--faint); font-weight: 640; margin-bottom: 4px; }
886
+ .tp-row { display: grid; grid-template-columns: 104px minmax(0, 1fr) auto; gap: 12px; align-items: center; padding: 7px 0; font-size: 12.5px; color: var(--muted); }
887
+ .tp-row i { display: block; position: relative; height: 6px; border-radius: 999px; background: var(--accent-subtle); overflow: hidden; }
888
+ .tp-row i::after { content: ""; position: absolute; inset: 0; width: var(--w); background: var(--accent); border-radius: 999px; opacity: 0.85; }
889
+ .tp-row b { color: var(--ink); font-weight: 620; }
890
+ .chart-tip {
891
+ position: absolute;
892
+ pointer-events: none;
893
+ background: var(--surface);
894
+ border: 1px solid var(--line-strong);
895
+ border-radius: var(--r-s);
896
+ box-shadow: var(--shadow-m);
897
+ padding: 8px 11px;
898
+ font-size: 11.5px;
899
+ display: none;
900
+ min-width: 122px;
901
+ z-index: 5;
902
+ }
903
+ .chart-tip b { display: block; font-size: 11px; color: var(--faint); font-weight: 600; margin-bottom: 4px; }
904
+ .chart-tip .row { display: flex; align-items: center; gap: 7px; color: var(--muted); }
905
+ .chart-tip .row i { width: 8px; height: 8px; border-radius: 3px; }
906
+ .chart-tip .row .v { margin-inline-start: auto; font-weight: 650; color: var(--ink); font-variant-numeric: tabular-nums; }
907
+
908
+ .side-col { display: flex; flex-direction: column; gap: 14px; }
909
+ .meter { display: flex; flex-direction: column; gap: 6px; margin-top: 12px; }
910
+ .meter__row { display: flex; justify-content: space-between; font-size: 12.5px; color: var(--muted); font-weight: 540; }
911
+ .meter__row b { color: var(--ink); font-weight: 620; }
912
+ .meter__bar { height: 6px; border-radius: 999px; background: var(--surface-2); border: 1px solid var(--line); overflow: hidden; }
913
+ .meter__bar i { display: block; height: 100%; border-radius: 999px; background: var(--accent); }
914
+ .meter__bar i.warnfill { background: var(--warn); }
915
+
916
+ .check-list { display: flex; flex-direction: column; gap: 4px; margin-top: 8px; }
917
+ .check {
918
+ display: flex; align-items: center; gap: 10px;
919
+ padding: 7px 8px; border-radius: var(--r-s);
920
+ font-size: 13px; color: var(--muted); font-weight: 540;
921
+ }
922
+ .check:hover { background: var(--surface-2); }
923
+ .check .box { width: 17px; height: 17px; border-radius: 6px; border: 1.5px solid var(--line-strong); flex: none; display: flex; align-items: center; justify-content: center; }
924
+ .check.done { color: var(--faint); text-decoration: line-through; }
925
+ .check.done .box { background: var(--ok); border-color: var(--ok); color: #fff; }
926
+ .check .go { margin-inline-start: auto; color: var(--accent); font-size: 11.5px; font-weight: 640; text-decoration: none; }
927
+
928
+ .feed { display: flex; flex-direction: column; margin-top: 6px; }
929
+ .feed__item { display: flex; gap: 11px; padding: 9px 2px; align-items: flex-start; border-bottom: 1px solid var(--line); }
930
+ .feed__item:last-child { border-bottom: 0; }
931
+ .feed__dot { width: 8px; height: 8px; border-radius: 50%; margin-top: 5px; flex: none; }
932
+ .feed__item p { font-size: 12.5px; color: var(--muted); line-height: 1.45; }
933
+ .feed__item p b { color: var(--ink); font-weight: 600; }
934
+ .feed__item time { display: block; font-size: 11px; color: var(--faint); margin-top: 1px; }
935
+
936
+ /* promo banner — the gradient-border big-card moment */
937
+ .promo {
938
+ margin-top: 14px;
939
+ display: flex; align-items: center; gap: 16px;
940
+ padding: 16px var(--pad-card);
941
+ border-radius: var(--r-l);
942
+ background:
943
+ linear-gradient(var(--surface), var(--surface)) padding-box,
944
+ var(--beam) border-box;
945
+ border: 1px solid transparent;
946
+ box-shadow: var(--shadow-s);
947
+ flex-wrap: wrap;
948
+ }
949
+ .promo b { font-size: 13.5px; font-weight: 650; display: block; letter-spacing: -0.01em; }
950
+ .promo p { font-size: 12.5px; color: var(--muted); }
951
+ .promo .brand-dots { margin: 0 0 0 auto; padding: 0; }
952
+
953
+ /* table */
954
+ .tablecard { margin-top: 14px; overflow: hidden; }
955
+ .tablewrap { overflow-x: auto; }
956
+ table { width: 100%; border-collapse: collapse; font-size: 13px; }
957
+ th {
958
+ text-align: left; font-size: 11px; letter-spacing: 0.07em; text-transform: uppercase;
959
+ color: var(--faint); font-weight: 640; padding: var(--cell-pad);
960
+ border-bottom: 1px solid var(--line);
961
+ white-space: nowrap;
962
+ }
963
+ td { padding: var(--cell-pad); border-bottom: 1px solid var(--line); color: var(--muted); white-space: nowrap; }
964
+ tbody tr:hover td { background: color-mix(in srgb, var(--ink) 2.5%, transparent); }
965
+ tbody tr:last-child td { border-bottom: 0; }
966
+ td .proj { display: flex; align-items: center; gap: 10px; color: var(--ink); font-weight: 600; }
967
+ td .pdot { width: 18px; height: 18px; border-radius: 6px; background: var(--beam); flex: none; opacity: 0.9; }
968
+ .tfoot { display: flex; align-items: center; gap: 10px; padding: 10px 16px; color: var(--faint); font-size: 12px; }
969
+ .tfoot .pages { margin-inline-start: auto; display: flex; gap: 4px; }
970
+
971
+ /* mobile drawer */
972
+ .scrim { display: none; position: fixed; inset: 0; z-index: 45; background: rgb(0 0 0 / 45%); border: 0; }
973
+ .top__drawer { display: none; }
974
+
975
+ @media (max-width: 1200px) {
976
+ .shell { grid-template-columns: minmax(0, 1fr); }
977
+ .top, .main { grid-column: 1; }
978
+ .side {
979
+ position: fixed; inset-block: 0; inset-inline-start: 0; z-index: 50;
980
+ transform: translateX(-105%);
981
+ background: var(--ground);
982
+ box-shadow: var(--shadow-l);
983
+ width: var(--shell-side) !important;
984
+ }
985
+ .shell[data-open="true"] .side { transform: none; }
986
+ .shell[data-open="true"] .scrim { display: block; }
987
+ .top__drawer { display: inline-flex; }
988
+ .top__collapse { display: none; }
989
+ .grid-2 { grid-template-columns: 1fr; }
990
+ .tiles { grid-template-columns: repeat(2, 1fr); }
991
+ }
992
+
993
+ @media (max-width: 900px) {
994
+ .bento { grid-template-columns: repeat(2, 1fr); }
995
+ .b-2x2, .b-2x1 { grid-column: span 2; }
996
+ .band__grid { grid-template-columns: repeat(2, 1fr); }
997
+ .pricing { grid-template-columns: 1fr; }
998
+ .footer__grid { grid-template-columns: 1fr 1fr; }
999
+ .nav__links { display: none; }
1000
+ .frame__body { grid-template-columns: 1fr; }
1001
+ .frame__side { display: none; }
1002
+ }
1003
+ @media (max-width: 640px) {
1004
+ .tiles { grid-template-columns: 1fr; }
1005
+ .bento { grid-template-columns: 1fr; }
1006
+ .b-2x2, .b-2x1 { grid-column: span 1; }
1007
+ }
1008
+
1009
+ /* ─── Draft dock (meta chrome — always dark glass) ───────────────────────── */
1010
+
1011
+ .dock {
1012
+ position: fixed;
1013
+ bottom: 18px; left: 50%;
1014
+ transform: translateX(-50%);
1015
+ z-index: 100;
1016
+ display: flex; align-items: center; gap: 5px;
1017
+ padding: 7px 10px;
1018
+ border-radius: 999px;
1019
+ background: rgb(15 16 20 / 88%);
1020
+ -webkit-backdrop-filter: blur(14px);
1021
+ backdrop-filter: blur(14px);
1022
+ border: 1px solid rgb(255 255 255 / 12%);
1023
+ box-shadow: 0 18px 50px -12px rgb(0 0 0 / 55%);
1024
+ color: #cfd3db;
1025
+ font-size: 12px;
1026
+ flex-wrap: wrap;
1027
+ justify-content: center;
1028
+ max-width: calc(100vw - 24px);
1029
+ }
1030
+ .dock__tag { font-size: 9.5px; letter-spacing: 0.12em; font-weight: 700; color: #7d8593; padding: 0 6px 0 4px; text-transform: uppercase; }
1031
+ .dock__sep { width: 1px; height: 18px; background: rgb(255 255 255 / 14%); margin: 0 3px; }
1032
+ .dock button { border-radius: 999px; }
1033
+ .dock .dseg { display: flex; background: rgb(255 255 255 / 7%); border-radius: 999px; padding: 2px; }
1034
+ .dock .dseg button { padding: 4px 12px; font-weight: 620; font-size: 12px; color: #9aa1ac; }
1035
+ .dock .dseg button[aria-pressed="true"] { background: #eceef4; color: #101116; }
1036
+ .dock .dicon { width: 28px; height: 28px; display: inline-flex; align-items: center; justify-content: center; color: #9aa1ac; }
1037
+ .dock .dicon:hover { color: #eceef4; background: rgb(255 255 255 / 8%); }
1038
+ .dock .dicon[aria-pressed="true"] { color: #eceef4; background: rgb(255 255 255 / 14%); }
1039
+ .dock .bdot { border-color: transparent; box-shadow: 0 0 0 1px rgb(255 255 255 / 25%); width: 20px; height: 20px; }
1040
+ .dock .bdot[aria-pressed="true"] { box-shadow: 0 0 0 2px #eceef4; }
1041
+ .dock .tbtn { padding: 3px 9px; font-weight: 650; color: #9aa1ac; }
1042
+ .dock .tbtn[aria-pressed="true"] { background: rgb(255 255 255 / 14%); color: #eceef4; }
1043
+ .dock .tbtn.t-e { font-family: "New York", ui-serif, Georgia, serif; }
1044
+ .dock .tbtn.t-t { font-family: var(--font-mono); }
1045
+
1046
+ /* ─── Motion safety ──────────────────────────────────────────────────────── */
1047
+
1048
+ @media (prefers-reduced-motion: reduce) {
1049
+ html { scroll-behavior: auto; }
1050
+ .aurora, .marquee__track, .term::after, .pill-status--warn i { animation: none !important; }
1051
+ .rise { animation-duration: 0.01ms; }
1052
+ .rv { opacity: 1; transform: none; }
1053
+ .frame { transform: none; transition: none; }
1054
+ * { transition-duration: 0.01ms !important; }
1055
+ }
1056
+ </style>
1057
+
1058
+ <!-- ═══════════════════════ SVG symbol defs ═══════════════════════ -->
1059
+ <svg width="0" height="0" style="position:absolute" aria-hidden="true">
1060
+ <defs>
1061
+ <symbol id="i-home" viewBox="0 0 16 16"><path d="M2.5 6.5 8 2l5.5 4.5V13a1 1 0 0 1-1 1h-3v-4h-3v4h-3a1 1 0 0 1-1-1z" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/></symbol>
1062
+ <symbol id="i-pulse" viewBox="0 0 16 16"><path d="M1.5 8h3l2-4.5L10 12l2-4h2.5" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></symbol>
1063
+ <symbol id="i-folder" viewBox="0 0 16 16"><path d="M1.5 4a1 1 0 0 1 1-1H6l1.5 2h6a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1z" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/></symbol>
1064
+ <symbol id="i-bolt" viewBox="0 0 16 16"><path d="M8.8 1.5 3.5 9h3.4l-.7 5.5L11.5 7H8.1z" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/></symbol>
1065
+ <symbol id="i-users" viewBox="0 0 16 16"><circle cx="6" cy="5.5" r="2.5" fill="none" stroke="currentColor" stroke-width="1.5"/><path d="M1.5 13.5c.5-2.3 2.3-3.5 4.5-3.5s4 1.2 4.5 3.5M11 3.3a2.5 2.5 0 0 1 0 4.4M12 10.3c1.3.5 2.2 1.5 2.5 3.2" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></symbol>
1066
+ <symbol id="i-key" viewBox="0 0 16 16"><circle cx="5" cy="11" r="3" fill="none" stroke="currentColor" stroke-width="1.5"/><path d="M7.2 8.8 13.5 2.5M11 5l2 2M9 7l1.5 1.5" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></symbol>
1067
+ <symbol id="i-chart" viewBox="0 0 16 16"><path d="M2 2v11a1 1 0 0 0 1 1h11" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/><path d="M5 10.5V8M8 10.5V5.5M11 10.5V7" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/></symbol>
1068
+ <symbol id="i-gauge" viewBox="0 0 16 16"><path d="M2.5 12.5a6 6 0 1 1 11 0" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/><path d="M8 9.5 10.8 6" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></symbol>
1069
+ <symbol id="i-gear" viewBox="0 0 16 16"><circle cx="8" cy="8" r="2.2" fill="none" stroke="currentColor" stroke-width="1.5"/><path d="M8 1.8v2M8 12.2v2M1.8 8h2M12.2 8h2M3.6 3.6l1.4 1.4M11 11l1.4 1.4M12.4 3.6 11 5M5 11l-1.4 1.4" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></symbol>
1070
+ <symbol id="i-card" viewBox="0 0 16 16"><rect x="1.5" y="3.5" width="13" height="9" rx="1.5" fill="none" stroke="currentColor" stroke-width="1.5"/><path d="M1.5 6.5h13" stroke="currentColor" stroke-width="1.5"/></symbol>
1071
+ <symbol id="i-bell" viewBox="0 0 16 16"><path d="M8 2a4 4 0 0 1 4 4c0 3 .8 4 1.5 4.7H2.5C3.2 10 4 9 4 6a4 4 0 0 1 4-4zM6.5 13a1.6 1.6 0 0 0 3 0" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></symbol>
1072
+ <symbol id="i-search" viewBox="0 0 16 16"><circle cx="7" cy="7" r="4.5" fill="none" stroke="currentColor" stroke-width="1.5"/><path d="m10.5 10.5 3 3" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></symbol>
1073
+ <symbol id="i-book" viewBox="0 0 16 16"><path d="M2.5 3.5A1.5 1.5 0 0 1 4 2h9.5v10.5H4A1.5 1.5 0 0 0 2.5 14z" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/><path d="M2.5 12.5A1.5 1.5 0 0 1 4 11h9.5" fill="none" stroke="currentColor" stroke-width="1.5"/></symbol>
1074
+ <symbol id="i-chev-d" viewBox="0 0 16 16"><path d="m4 6 4 4 4-4" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></symbol>
1075
+ <symbol id="i-chev-ud" viewBox="0 0 16 16"><path d="m5 6.2 3-3 3 3M5 9.8l3 3 3-3" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></symbol>
1076
+ <symbol id="i-panel" viewBox="0 0 16 16"><rect x="2" y="2.5" width="12" height="11" rx="2" fill="none" stroke="currentColor" stroke-width="1.5"/><path d="M6.2 2.5v11" stroke="currentColor" stroke-width="1.5"/></symbol>
1077
+ <symbol id="i-plus" viewBox="0 0 16 16"><path d="M8 3v10M3 8h10" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/></symbol>
1078
+ <symbol id="i-check" viewBox="0 0 16 16"><path d="m3 8.5 3.2 3L13 4.5" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/></symbol>
1079
+ <symbol id="i-x" viewBox="0 0 16 16"><path d="m4 4 8 8M12 4l-8 8" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></symbol>
1080
+ <symbol id="i-dots" viewBox="0 0 16 16"><circle cx="3.5" cy="8" r="1.2" fill="currentColor"/><circle cx="8" cy="8" r="1.2" fill="currentColor"/><circle cx="12.5" cy="8" r="1.2" fill="currentColor"/></symbol>
1081
+ <symbol id="i-arrow" viewBox="0 0 16 16"><path d="M2.5 8h10M9 4.5 13 8l-4 3.5" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></symbol>
1082
+ <symbol id="i-spark" viewBox="0 0 16 16"><path d="M8 1.5 9.6 6 14 8l-4.4 2L8 14.5 6.4 10 2 8l4.4-2z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/></symbol>
1083
+ <symbol id="i-sun" viewBox="0 0 16 16"><circle cx="8" cy="8" r="3" fill="none" stroke="currentColor" stroke-width="1.5"/><path d="M8 1.5v1.8M8 12.7v1.8M1.5 8h1.8M12.7 8h1.8M3.4 3.4l1.3 1.3M11.3 11.3l1.3 1.3M12.6 3.4l-1.3 1.3M4.7 11.3l-1.3 1.3" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></symbol>
1084
+ <symbol id="i-moon" viewBox="0 0 16 16"><path d="M13.5 9.5A6 6 0 0 1 6.5 2.5 6 6 0 1 0 13.5 9.5z" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/></symbol>
1085
+ <symbol id="i-density" viewBox="0 0 16 16"><path d="M2.5 4h11M2.5 8h11M2.5 12h11" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/></symbol>
1086
+ <symbol id="i-globe" viewBox="0 0 16 16"><circle cx="8" cy="8" r="6" fill="none" stroke="currentColor" stroke-width="1.5"/><path d="M2 8h12M8 2c-3.5 3.8-3.5 8.2 0 12 3.5-3.8 3.5-8.2 0-12z" fill="none" stroke="currentColor" stroke-width="1.2"/></symbol>
1087
+ <symbol id="i-desktop" viewBox="0 0 16 16"><rect x="1.5" y="2.5" width="13" height="9" rx="1.5" fill="none" stroke="currentColor" stroke-width="1.5"/><path d="M5.5 14h5M8 11.5V14" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></symbol>
1088
+ <symbol id="i-puzzle" viewBox="0 0 16 16"><path d="M6 2.5h4v3a1.5 1.5 0 1 0 3 0v0h.5v8h-11v-8H3v0a1.5 1.5 0 1 0 3 0z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/></symbol>
1089
+ <symbol id="i-server" viewBox="0 0 16 16"><rect x="2" y="2.5" width="12" height="4.5" rx="1.2" fill="none" stroke="currentColor" stroke-width="1.5"/><rect x="2" y="9" width="12" height="4.5" rx="1.2" fill="none" stroke="currentColor" stroke-width="1.5"/><circle cx="4.6" cy="4.75" r="0.9" fill="currentColor"/><circle cx="4.6" cy="11.25" r="0.9" fill="currentColor"/></symbol>
1090
+ </defs>
1091
+ </svg>
1092
+
1093
+ <!-- ═══════════════════════════════ SITE ═══════════════════════════════ -->
1094
+ <div class="view view--site site" id="view-site">
1095
+
1096
+ <header class="nav" id="site-nav">
1097
+ <div class="nav__in">
1098
+ <span class="lockup"><span class="mark">Ω</span><span class="word">Playground</span></span>
1099
+ <nav class="nav__links" aria-label="Site">
1100
+ <a href="#bento">Product</a>
1101
+ <a href="#pricing">Pricing</a>
1102
+ <a href="#">Docs</a>
1103
+ <a href="#">Changelog</a>
1104
+ </nav>
1105
+ <div class="nav__cta">
1106
+ <button class="btn btn--quiet">Sign in</button>
1107
+ <button class="btn btn--primary">Get started</button>
1108
+ </div>
1109
+ </div>
1110
+ </header>
1111
+
1112
+ <section class="hero">
1113
+ <div class="hero__bg">
1114
+ <div class="hero__dots"></div>
1115
+ <div class="aurora aurora--1"></div>
1116
+ <div class="aurora aurora--2"></div>
1117
+ <div class="aurora aurora--3"></div>
1118
+ </div>
1119
+ <div class="hero__in">
1120
+ <span class="hero__badge rise"><svg width="13" height="13"><use href="#i-spark"/></svg> <b>OMEGA 1.0</b> is here — one framework, every surface</span>
1121
+ <h1 class="rise rise-2">The whole stack, from <span class="beam-text">one config.</span></h1>
1122
+ <p class="hero__sub rise rise-3">OMEGA turns a single <code>omega.json5</code> into your marketing site, dashboard, backend, desktop app, and browser extension. One brand. One deploy verb. Every target.</p>
1123
+ <div class="hero__cta rise rise-4">
1124
+ <button class="btn btn--primary btn--lg">Start building free</button>
1125
+ <button class="btn btn--ghost btn--lg hero__cmd mono">npx omega setup <svg width="14" height="14"><use href="#i-arrow"/></svg></button>
1126
+ </div>
1127
+
1128
+ <div class="frame-wrap rise rise-5">
1129
+ <div class="frame-halo"></div>
1130
+ <div class="frame">
1131
+ <div class="frame__bar">
1132
+ <i></i><i></i><i></i>
1133
+ <span class="frame__url"><svg width="11" height="11"><use href="#i-globe"/></svg> app.playground.omegajs.dev</span>
1134
+ </div>
1135
+ <div class="frame__body">
1136
+ <div class="frame__side">
1137
+ <span class="lockup"><span class="mark">Ω</span> Playground</span>
1138
+ <span class="fnav on"><svg width="13" height="13"><use href="#i-home"/></svg> Overview</span>
1139
+ <span class="fnav"><svg width="13" height="13"><use href="#i-folder"/></svg> Projects</span>
1140
+ <span class="fnav"><svg width="13" height="13"><use href="#i-chart"/></svg> Analytics</span>
1141
+ <span class="fnav"><svg width="13" height="13"><use href="#i-users"/></svg> Members</span>
1142
+ <span class="fnav"><svg width="13" height="13"><use href="#i-gear"/></svg> Settings</span>
1143
+ </div>
1144
+ <div class="frame__main">
1145
+ <div class="frame__tiles">
1146
+ <div class="ftile"><span>Revenue</span><b class="num">$12,480</b><span class="up">↑ 8.2%</span></div>
1147
+ <div class="ftile"><span>Active users</span><b class="num">3,204</b><span class="up">↑ 4.1%</span></div>
1148
+ <div class="ftile"><span>Uptime</span><b class="num">99.98%</b><span class="up">30 days</span></div>
1149
+ </div>
1150
+ <div class="fchart">
1151
+ <span>Traffic</span>
1152
+ <svg id="frame-chart" viewBox="0 0 560 150" width="100%" height="150" role="img" aria-label="Decorative traffic chart"></svg>
1153
+ </div>
1154
+ </div>
1155
+ </div>
1156
+ </div>
1157
+ </div>
1158
+ </div>
1159
+ </section>
1160
+
1161
+ <section class="logos">
1162
+ <p>Powering every ITW Creative Works brand</p>
1163
+ <div class="marquee" aria-hidden="true">
1164
+ <div class="marquee__track" id="marquee-track">
1165
+ <span class="wlogo">SOMIIBO</span><span class="wlogo">StudyMonkey</span><span class="wlogo">SLAPFORM</span><span class="wlogo">chatsy.</span><span class="wlogo">Replyify</span><span class="wlogo">PROXIFLY</span><span class="wlogo">ITW Creative Works</span>
1166
+ </div>
1167
+ </div>
1168
+ </section>
1169
+
1170
+ <section class="section" id="bento">
1171
+ <div class="section__in">
1172
+ <span class="section__eyebrow rv">Why OMEGA</span>
1173
+ <h2 class="rv">Every target. Zero drift.</h2>
1174
+ <p class="section__sub rv">Every surface reads the same config, wears the same brand tokens, and ships with the same deploy verb — so your product feels like one product, everywhere.</p>
1175
+
1176
+ <div class="bento">
1177
+ <div class="card b-2x2 rv">
1178
+ <span class="icotile"><svg width="16" height="16"><use href="#i-globe"/></svg></span>
1179
+ <h3>One config, every target</h3>
1180
+ <p>Declare your brand once. Web, backend, desktop, and extension builds all derive from it — colors, icons, auth, analytics, payments.</p>
1181
+ <div class="targets">
1182
+ <span class="chip"><svg width="11" height="11"><use href="#i-globe"/></svg> web</span>
1183
+ <span class="chip"><svg width="11" height="11"><use href="#i-server"/></svg> backend</span>
1184
+ <span class="chip"><svg width="11" height="11"><use href="#i-desktop"/></svg> desktop</span>
1185
+ <span class="chip"><svg width="11" height="11"><use href="#i-puzzle"/></svg> extension</span>
1186
+ </div>
1187
+ <div class="codebox"><span class="c">// omega.json5</span><br>{<br>&nbsp;&nbsp;<span class="k">brand</span>: { <span class="k">name</span>: <span class="s">'Playground'</span>, <span class="k">color</span>: <span class="s">'#5B47FB'</span> },<br>&nbsp;&nbsp;<span class="k">targets</span>: {<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">web</span>: { <span class="k">theme</span>: <span class="s">'classy'</span> },<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">backend</span>: {}, <span class="k">desktop</span>: {}, <span class="k">extension</span>: {}<br>&nbsp;&nbsp;}<br>}</div>
1188
+ </div>
1189
+
1190
+ <div class="card rv">
1191
+ <span class="icotile"><svg width="16" height="16"><use href="#i-spark"/></svg></span>
1192
+ <h3>Your brand is a token</h3>
1193
+ <p>One hex in config becomes a full accent ramp. Try it —</p>
1194
+ <div class="brand-dots" data-brand-dots></div>
1195
+ </div>
1196
+
1197
+ <div class="card rv">
1198
+ <span class="icotile"><svg width="16" height="16"><use href="#i-moon"/></svg></span>
1199
+ <h3>Dark mode, day one</h3>
1200
+ <p>Both themes are defined at the token level. No retrofits.</p>
1201
+ <div class="split"><div class="lite">Light<i></i></div><div class="dark">Dark<i></i></div></div>
1202
+ </div>
1203
+
1204
+ <div class="card b-2x1 rv">
1205
+ <span class="icotile"><svg width="16" height="16"><use href="#i-bolt"/></svg></span>
1206
+ <h3>Deploys that mean it</h3>
1207
+ <p>Nothing publishes on commit. When you're ready, one verb ships every surface.</p>
1208
+ <div class="term"><span class="p">$</span> omega deploy&nbsp;&nbsp;<span class="okx">✓ web · backend · desktop · extension</span></div>
1209
+ </div>
1210
+
1211
+ <div class="card rv">
1212
+ <span class="icotile"><svg width="16" height="16"><use href="#i-key"/></svg></span>
1213
+ <h3>Auth → payments, wired</h3>
1214
+ <p>The unglamorous stuff is the default.</p>
1215
+ <div class="mini-rows">
1216
+ <div><svg width="13" height="13"><use href="#i-check"/></svg> Sign-in, OAuth &amp; accounts</div>
1217
+ <div><svg width="13" height="13"><use href="#i-check"/></svg> Checkout &amp; billing portal</div>
1218
+ <div><svg width="13" height="13"><use href="#i-check"/></svg> Usage limits &amp; plans</div>
1219
+ </div>
1220
+ </div>
1221
+
1222
+ <div class="card rv">
1223
+ <span class="icotile"><svg width="16" height="16"><use href="#i-gauge"/></svg></span>
1224
+ <h3>Fast by default</h3>
1225
+ <p>Minified HTML, hashed assets, image matrix, CSS hot-swap in under a second.</p>
1226
+ <div class="mini-rows">
1227
+ <div><svg width="13" height="13"><use href="#i-check"/></svg> <span class="mono num">&lt;1s</span>&nbsp;style reloads in dev</div>
1228
+ <div><svg width="13" height="13"><use href="#i-check"/></svg> Purged, hashed production CSS</div>
1229
+ </div>
1230
+ </div>
1231
+ </div>
1232
+ </div>
1233
+ </section>
1234
+
1235
+ <section class="band section">
1236
+ <div class="aurora aurora--1"></div>
1237
+ <div class="aurora aurora--2"></div>
1238
+ <div class="section__in">
1239
+ <div class="band__grid">
1240
+ <div class="band__cell rv"><b class="num" data-count="45">0</b><span>layouts skinned</span></div>
1241
+ <div class="band__cell rv"><b class="num" data-count="4">0</b><span>surface families</span></div>
1242
+ <div class="band__cell rv"><b class="num" data-count="1">0</b><span>token sheet</span></div>
1243
+ <div class="band__cell rv"><b class="num">&lt;1s</b><span>css hot-swap</span></div>
1244
+ </div>
1245
+ </div>
1246
+ </section>
1247
+
1248
+ <section class="section" id="pricing">
1249
+ <div class="section__in">
1250
+ <span class="section__eyebrow rv">Pricing</span>
1251
+ <h2 class="rv">Start free. Scale when it's real.</h2>
1252
+ <div class="pricing">
1253
+ <div class="card price rv">
1254
+ <div class="price__head"><span class="price__name">Hobby</span></div>
1255
+ <div class="price__amt num">$0<span> /mo</span></div>
1256
+ <ul>
1257
+ <li><svg width="13" height="13"><use href="#i-check"/></svg> 1 project, all targets</li>
1258
+ <li><svg width="13" height="13"><use href="#i-check"/></svg> Community themes</li>
1259
+ <li><svg width="13" height="13"><use href="#i-check"/></svg> Deploy to your own infra</li>
1260
+ </ul>
1261
+ <button class="btn btn--ghost">Start free</button>
1262
+ </div>
1263
+ <div class="card price price--pop gborder rv">
1264
+ <div class="price__head"><span class="price__name">Pro</span><span class="chip chip--accent">Most popular</span></div>
1265
+ <div class="price__amt num">$19<span> /mo</span></div>
1266
+ <ul>
1267
+ <li><svg width="13" height="13"><use href="#i-check"/></svg> Unlimited projects</li>
1268
+ <li><svg width="13" height="13"><use href="#i-check"/></svg> classy v2 + premium themes</li>
1269
+ <li><svg width="13" height="13"><use href="#i-check"/></svg> Payments &amp; usage plans</li>
1270
+ <li><svg width="13" height="13"><use href="#i-check"/></svg> Remove the sidebar ad slot</li>
1271
+ </ul>
1272
+ <button class="btn btn--primary">Go Pro</button>
1273
+ </div>
1274
+ <div class="card price rv">
1275
+ <div class="price__head"><span class="price__name">Scale</span></div>
1276
+ <div class="price__amt num">$99<span> /mo</span></div>
1277
+ <ul>
1278
+ <li><svg width="13" height="13"><use href="#i-check"/></svg> Everything in Pro</li>
1279
+ <li><svg width="13" height="13"><use href="#i-check"/></svg> Multi-brand workspaces</li>
1280
+ <li><svg width="13" height="13"><use href="#i-check"/></svg> Priority support</li>
1281
+ </ul>
1282
+ <button class="btn btn--ghost">Talk to us</button>
1283
+ </div>
1284
+ </div>
1285
+ </div>
1286
+ </section>
1287
+
1288
+ <section class="section">
1289
+ <figure class="quote rv">
1290
+ <blockquote>“We rebuilt five products on OMEGA <span class="beam-text">without touching a stylesheet.</span>”</blockquote>
1291
+ <figcaption><span class="avatar">IW</span> Ian Wiedenman — ITW Creative Works</figcaption>
1292
+ </figure>
1293
+ </section>
1294
+
1295
+ <section class="section" style="padding-top: 0;">
1296
+ <div class="section__in">
1297
+ <div class="cta-band rv">
1298
+ <div class="aurora aurora--1"></div>
1299
+ <div class="aurora aurora--2"></div>
1300
+ <h2>Ready to ship every surface?</h2>
1301
+ <p>From <span class="mono">omega setup</span> to a live product — site, app, backend, desktop, extension.</p>
1302
+ <div class="hero__cta">
1303
+ <button class="btn btn--primary btn--lg">Start building free</button>
1304
+ <button class="btn btn--lg" style="color:#cfd3db;">Read the docs <svg width="14" height="14"><use href="#i-arrow"/></svg></button>
1305
+ </div>
1306
+ </div>
1307
+ </div>
1308
+ </section>
1309
+
1310
+ <footer class="footer">
1311
+ <div class="footer__in">
1312
+ <div class="footer__grid">
1313
+ <div class="footer__brand">
1314
+ <span class="lockup"><span class="mark">Ω</span><span class="word">Playground</span></span>
1315
+ <p>The OMEGA demonstration brand. One config, every surface — built with classy v2.</p>
1316
+ </div>
1317
+ <div><h4>Product</h4><a href="#">Features</a><a href="#">Pricing</a><a href="#">Themes</a><a href="#">Changelog</a></div>
1318
+ <div><h4>Resources</h4><a href="#">Docs</a><a href="#">Guides</a><a href="#">API</a><a href="#">Status</a></div>
1319
+ <div><h4>Company</h4><a href="#">About</a><a href="#">Blog</a><a href="#">Contact</a><a href="#">Legal</a></div>
1320
+ </div>
1321
+ <div class="footer__base">
1322
+ <span class="mark" style="width:22px;height:22px;font-size:12px;border-radius:7px;">Ω</span>
1323
+ <span>© 2026 OMEGA Playground. A test brand, deliberately on fire.</span>
1324
+ </div>
1325
+ </div>
1326
+ </footer>
1327
+ </div>
1328
+
1329
+ <!-- ═══════════════════════════════ APP ═══════════════════════════════ -->
1330
+ <div class="view view--app" id="view-app">
1331
+ <div class="shell" id="shell">
1332
+
1333
+ <aside class="side" id="side">
1334
+ <div class="side__head">
1335
+ <span class="mark">Ω</span>
1336
+ <span class="word">Playground</span>
1337
+ <span class="chip ver mono">v2</span>
1338
+ </div>
1339
+
1340
+ <button class="selector" title="Switch project">
1341
+ <span class="pdot"></span>
1342
+ <span class="meta"><b>somiibo</b><span>Production</span></span>
1343
+ <svg width="13" height="13"><use href="#i-chev-ud"/></svg>
1344
+ </button>
1345
+
1346
+ <button class="side__search">
1347
+ <svg width="13" height="13"><use href="#i-search"/></svg>
1348
+ <span>Search…</span>
1349
+ <kbd>⌘K</kbd>
1350
+ </button>
1351
+
1352
+ <button class="nav-item" aria-current="page"><svg width="15" height="15"><use href="#i-home"/></svg><span class="lbl">Overview</span></button>
1353
+ <button class="nav-item"><svg width="15" height="15"><use href="#i-pulse"/></svg><span class="lbl">Activity</span></button>
1354
+
1355
+ <div class="side__label">Workspace</div>
1356
+ <button class="nav-item"><svg width="15" height="15"><use href="#i-folder"/></svg><span class="lbl">Projects</span><span class="tail chip num">6</span></button>
1357
+ <button class="nav-item"><svg width="15" height="15"><use href="#i-bolt"/></svg><span class="lbl">Automations</span><span class="tail chip chip--accent">New</span></button>
1358
+ <button class="nav-item"><svg width="15" height="15"><use href="#i-users"/></svg><span class="lbl">Members</span><span class="tail chip num">12</span></button>
1359
+ <button class="nav-item"><svg width="15" height="15"><use href="#i-key"/></svg><span class="lbl">API keys</span></button>
1360
+
1361
+ <div class="side__label">Insights</div>
1362
+ <button class="nav-item"><svg width="15" height="15"><use href="#i-chart"/></svg><span class="lbl">Analytics</span></button>
1363
+ <button class="nav-item"><svg width="15" height="15"><use href="#i-gauge"/></svg><span class="lbl">Usage</span></button>
1364
+
1365
+ <div class="side__label">Settings</div>
1366
+ <button class="nav-item"><svg width="15" height="15"><use href="#i-gear"/></svg><span class="lbl">General</span></button>
1367
+ <button class="nav-item"><svg width="15" height="15"><use href="#i-card"/></svg><span class="lbl">Billing</span></button>
1368
+
1369
+ <div class="side__foot">
1370
+ <div class="ad" id="ad-slot">
1371
+ <button class="ad__x" id="ad-dismiss" aria-label="Dismiss ad"><svg width="11" height="11"><use href="#i-x"/></svg></button>
1372
+ <span class="ad__tag">Sponsored</span>
1373
+ <b>Ship faster with DevKit Pro</b>
1374
+ <p>The toolkit your deploys deserve.</p>
1375
+ <a href="#">Learn more → <span style="color:var(--faint);font-weight:400;">· Pro removes ads</span></a>
1376
+ </div>
1377
+ <button class="user-row">
1378
+ <span class="avatar">IW</span>
1379
+ <span class="meta"><b>Ian W.</b><span>ian@itwcreativeworks.com</span></span>
1380
+ <svg width="14" height="14"><use href="#i-dots"/></svg>
1381
+ </button>
1382
+ </div>
1383
+ </aside>
1384
+
1385
+ <header class="top">
1386
+ <button class="iconbtn top__drawer" id="drawer-btn" aria-label="Open navigation" aria-expanded="false"><svg width="16" height="16"><use href="#i-panel"/></svg></button>
1387
+ <button class="iconbtn top__collapse" id="collapse-btn" aria-label="Collapse sidebar" aria-expanded="true"><svg width="16" height="16"><use href="#i-panel"/></svg></button>
1388
+ <div class="crumb"><span style="color:var(--faint);font-weight:520;">somiibo</span><span class="sep">/</span><span>Overview</span></div>
1389
+ <span class="pill-status pill-status--ok" style="margin-inline-start:6px;"><i></i>Production</span>
1390
+ <div class="top__end">
1391
+ <button class="iconbtn" aria-label="Search"><svg width="15" height="15"><use href="#i-search"/></svg></button>
1392
+ <button class="iconbtn" aria-label="Documentation"><svg width="15" height="15"><use href="#i-book"/></svg></button>
1393
+ <button class="iconbtn" aria-label="Notifications"><svg width="15" height="15"><use href="#i-bell"/></svg><span class="dot"></span></button>
1394
+ <div class="top__divider"></div>
1395
+ <div class="account" id="account">
1396
+ <button aria-haspopup="menu" aria-expanded="false" id="account-btn">
1397
+ <span class="avatar">IW</span>
1398
+ <b>Ian W.</b>
1399
+ <svg width="12" height="12"><use href="#i-chev-d"/></svg>
1400
+ </button>
1401
+ <div class="menu" role="menu">
1402
+ <div class="menu__head"><b>Ian Wiedenman</b><span>ian@itwcreativeworks.com</span></div>
1403
+ <button role="menuitem"><svg width="14" height="14"><use href="#i-users"/></svg> Profile</button>
1404
+ <button role="menuitem"><svg width="14" height="14"><use href="#i-gear"/></svg> Preferences</button>
1405
+ <button role="menuitem"><svg width="14" height="14"><use href="#i-chev-ud"/></svg> Switch account</button>
1406
+ <button role="menuitem" class="danger"><svg width="14" height="14"><use href="#i-x"/></svg> Sign out</button>
1407
+ </div>
1408
+ </div>
1409
+ </div>
1410
+ </header>
1411
+
1412
+ <main class="main">
1413
+ <div class="main__in">
1414
+ <div class="page-head">
1415
+ <div>
1416
+ <h1>Good evening, Ian</h1>
1417
+ <p class="sub">Here's what's happening across your workspace.</p>
1418
+ </div>
1419
+ <div class="page-head__end">
1420
+ <div class="seg" role="group" aria-label="Period">
1421
+ <button aria-pressed="false">24h</button>
1422
+ <button aria-pressed="true">7d</button>
1423
+ <button aria-pressed="false">30d</button>
1424
+ </div>
1425
+ <button class="btn btn--primary"><svg width="13" height="13"><use href="#i-plus"/></svg> New project</button>
1426
+ </div>
1427
+ </div>
1428
+
1429
+ <div class="tiles">
1430
+ <div class="card tile">
1431
+ <span class="tile__label">Monthly revenue</span>
1432
+ <div class="tile__row"><span class="tile__num num">$12,480</span><span class="delta delta--up num">↑ 8.2%</span></div>
1433
+ <svg class="spark" data-spark="4,6,5,8,9,8,11,12,11,13,14,13,15,17" aria-hidden="true"></svg>
1434
+ </div>
1435
+ <div class="card tile">
1436
+ <span class="tile__label">Active users</span>
1437
+ <div class="tile__row"><span class="tile__num num">3,204</span><span class="delta delta--up num">↑ 4.1%</span></div>
1438
+ <svg class="spark" data-spark="6,7,7,8,9,10,9,11,10,12,12,13,13,14" aria-hidden="true"></svg>
1439
+ </div>
1440
+ <div class="card tile">
1441
+ <span class="tile__label">API requests</span>
1442
+ <div class="tile__row"><span class="tile__num num">1.2M</span><span class="delta delta--down num">↓ 2.3%</span></div>
1443
+ <svg class="spark" data-spark="12,13,11,12,10,11,9,10,9,8,9,8,8,7" aria-hidden="true"></svg>
1444
+ </div>
1445
+ <div class="card tile">
1446
+ <span class="tile__label">Uptime <span class="pill-status pill-status--ok"><i></i></span></span>
1447
+ <div class="tile__row"><span class="tile__num num">99.98%</span><span class="delta delta--flat num">30 days</span></div>
1448
+ <svg class="spark" data-spark="12,12,12,12,11.6,12,12,12,12,11.8,12,12,12,12" aria-hidden="true"></svg>
1449
+ </div>
1450
+ </div>
1451
+
1452
+ <div class="grid-2">
1453
+ <div class="card panel panel--chart">
1454
+ <div class="panel__head">
1455
+ <h3>Traffic</h3>
1456
+ <div class="end">
1457
+ <div class="legend"><span><i></i>This period</span><span class="prev"><i></i>Previous</span></div>
1458
+ <div class="seg" role="group" aria-label="Traffic metric">
1459
+ <button aria-pressed="true">Visitors</button>
1460
+ <button aria-pressed="false">Page views</button>
1461
+ </div>
1462
+ </div>
1463
+ </div>
1464
+ <div class="chart-wrap">
1465
+ <svg id="big-chart" viewBox="0 0 720 260" width="100%" role="img" aria-label="Visitors for the last 14 days, this period versus previous"></svg>
1466
+ <div class="chart-tip" id="chart-tip"></div>
1467
+ </div>
1468
+ <div class="toppages">
1469
+ <div class="tp-head"><span>Top pages</span><span>Visitors</span></div>
1470
+ <div class="tp-row"><span class="mono">/</span><i style="--w:100%"></i><b class="num">4,812</b></div>
1471
+ <div class="tp-row"><span class="mono">/pricing</span><i style="--w:42%"></i><b class="num">1,904</b></div>
1472
+ <div class="tp-row"><span class="mono">/signin</span><i style="--w:24%"></i><b class="num">1,102</b></div>
1473
+ </div>
1474
+ </div>
1475
+
1476
+ <div class="side-col">
1477
+ <div class="card panel">
1478
+ <div class="panel__head"><h3>Usage</h3><div class="end"><a href="#" style="color:var(--accent);font-size:12px;font-weight:640;text-decoration:none;">Upgrade</a></div></div>
1479
+ <div class="meter">
1480
+ <div class="meter__row"><span>Builds</span><b class="num">82 / 100</b></div>
1481
+ <div class="meter__bar"><i class="warnfill" style="width:82%"></i></div>
1482
+ </div>
1483
+ <div class="meter">
1484
+ <div class="meter__row"><span>Bandwidth</span><b class="num">64%</b></div>
1485
+ <div class="meter__bar"><i style="width:64%"></i></div>
1486
+ </div>
1487
+ <div class="meter">
1488
+ <div class="meter__row"><span>Seats</span><b class="num">9 / 12</b></div>
1489
+ <div class="meter__bar"><i style="width:75%"></i></div>
1490
+ </div>
1491
+ </div>
1492
+
1493
+ <div class="card panel">
1494
+ <div class="panel__head"><h3>Get started</h3><span class="chip num">2/4</span></div>
1495
+ <div class="check-list">
1496
+ <div class="check done"><span class="box"><svg width="10" height="10"><use href="#i-check"/></svg></span> Create your first project</div>
1497
+ <div class="check done"><span class="box"><svg width="10" height="10"><use href="#i-check"/></svg></span> Connect a domain</div>
1498
+ <div class="check"><span class="box"></span> Invite your team <a class="go" href="#">Invite →</a></div>
1499
+ <div class="check"><span class="box"></span> Enable payments <a class="go" href="#">Set up →</a></div>
1500
+ </div>
1501
+ </div>
1502
+
1503
+ <div class="card panel">
1504
+ <div class="panel__head"><h3>Activity</h3></div>
1505
+ <div class="feed">
1506
+ <div class="feed__item"><i class="feed__dot" style="background:var(--ok)"></i><p><b>Deploy succeeded</b> — somiibo · web<time>2 minutes ago</time></p></div>
1507
+ <div class="feed__item"><i class="feed__dot" style="background:var(--accent)"></i><p><b>Nathan</b> invited <b>rachel@itw.co</b><time>1 hour ago</time></p></div>
1508
+ <div class="feed__item"><i class="feed__dot" style="background:var(--warn)"></i><p><b>Usage alert</b> — builds at 82%<time>3 hours ago</time></p></div>
1509
+ <div class="feed__item"><i class="feed__dot" style="background:var(--ok)"></i><p><b>Payment received</b> — $49.00 · Pro<time>Yesterday</time></p></div>
1510
+ </div>
1511
+ </div>
1512
+ </div>
1513
+ </div>
1514
+
1515
+ <div class="promo">
1516
+ <span class="icotile"><svg width="16" height="16"><use href="#i-spark"/></svg></span>
1517
+ <div>
1518
+ <b>classy v2 is live for your workspace</b>
1519
+ <p>Swap the accent, keep the theme — your whole stack recolors from one token.</p>
1520
+ </div>
1521
+ <div class="brand-dots" data-brand-dots></div>
1522
+ <button class="btn btn--ghost">Try it</button>
1523
+ </div>
1524
+
1525
+ <div class="card tablecard">
1526
+ <div class="panel__head" style="padding:16px var(--pad-card) 0;">
1527
+ <h3>Recent deployments</h3>
1528
+ <div class="end"><button class="btn btn--ghost" style="height:28px;font-size:12px;">View all</button></div>
1529
+ </div>
1530
+ <div class="tablewrap">
1531
+ <table>
1532
+ <thead>
1533
+ <tr><th scope="col">Project</th><th scope="col">Target</th><th scope="col">Status</th><th scope="col">Duration</th><th scope="col">When</th><th scope="col"></th></tr>
1534
+ </thead>
1535
+ <tbody>
1536
+ <tr>
1537
+ <td><span class="proj"><span class="pdot"></span>somiibo <span class="chip mono">prod</span></span></td>
1538
+ <td><span class="chip"><svg width="11" height="11"><use href="#i-globe"/></svg> web</span></td>
1539
+ <td><span class="pill-status pill-status--ok"><i></i>Live</span></td>
1540
+ <td class="mono num">42s</td>
1541
+ <td>2 min ago</td>
1542
+ <td><button class="iconbtn" aria-label="Row actions" style="width:26px;height:26px;"><svg width="14" height="14"><use href="#i-dots"/></svg></button></td>
1543
+ </tr>
1544
+ <tr>
1545
+ <td><span class="proj"><span class="pdot"></span>somiibo <span class="chip mono">prod</span></span></td>
1546
+ <td><span class="chip"><svg width="11" height="11"><use href="#i-server"/></svg> backend</span></td>
1547
+ <td><span class="pill-status pill-status--ok"><i></i>Live</span></td>
1548
+ <td class="mono num">1m 18s</td>
1549
+ <td>2 min ago</td>
1550
+ <td><button class="iconbtn" aria-label="Row actions" style="width:26px;height:26px;"><svg width="14" height="14"><use href="#i-dots"/></svg></button></td>
1551
+ </tr>
1552
+ <tr>
1553
+ <td><span class="proj"><span class="pdot" style="background:linear-gradient(135deg,#f59e0b,#ef4444)"></span>studymonkey <span class="chip mono">staging</span></span></td>
1554
+ <td><span class="chip"><svg width="11" height="11"><use href="#i-desktop"/></svg> desktop</span></td>
1555
+ <td><span class="pill-status pill-status--warn"><i></i>Building</span></td>
1556
+ <td class="mono num">—</td>
1557
+ <td>6 min ago</td>
1558
+ <td><button class="iconbtn" aria-label="Row actions" style="width:26px;height:26px;"><svg width="14" height="14"><use href="#i-dots"/></svg></button></td>
1559
+ </tr>
1560
+ <tr>
1561
+ <td><span class="proj"><span class="pdot" style="background:linear-gradient(135deg,#10b981,#06b6d4)"></span>slapform <span class="chip mono">prod</span></span></td>
1562
+ <td><span class="chip"><svg width="11" height="11"><use href="#i-puzzle"/></svg> extension</span></td>
1563
+ <td><span class="pill-status pill-status--ok"><i></i>Live</span></td>
1564
+ <td class="mono num">55s</td>
1565
+ <td>1 hour ago</td>
1566
+ <td><button class="iconbtn" aria-label="Row actions" style="width:26px;height:26px;"><svg width="14" height="14"><use href="#i-dots"/></svg></button></td>
1567
+ </tr>
1568
+ <tr>
1569
+ <td><span class="proj"><span class="pdot" style="background:linear-gradient(135deg,#8b5cf6,#ec4899)"></span>chatsy <span class="chip mono">prod</span></span></td>
1570
+ <td><span class="chip"><svg width="11" height="11"><use href="#i-globe"/></svg> web</span></td>
1571
+ <td><span class="pill-status pill-status--danger"><i></i>Failed</span></td>
1572
+ <td class="mono num">12s</td>
1573
+ <td>3 hours ago</td>
1574
+ <td><button class="btn btn--ghost" style="height:26px;font-size:12px;padding:0 10px;">Retry</button></td>
1575
+ </tr>
1576
+ </tbody>
1577
+ </table>
1578
+ </div>
1579
+ <div class="tfoot">
1580
+ <span class="num">Showing 5 of 128 deployments</span>
1581
+ <div class="pages">
1582
+ <button class="iconbtn" style="width:26px;height:26px;transform:rotate(90deg)" aria-label="Previous page"><svg width="13" height="13"><use href="#i-chev-d"/></svg></button>
1583
+ <button class="iconbtn" style="width:26px;height:26px;transform:rotate(-90deg)" aria-label="Next page"><svg width="13" height="13"><use href="#i-chev-d"/></svg></button>
1584
+ </div>
1585
+ </div>
1586
+ </div>
1587
+
1588
+ </div>
1589
+ </main>
1590
+
1591
+ <button class="scrim" id="scrim" aria-label="Close navigation" tabindex="-1"></button>
1592
+ </div>
1593
+ </div>
1594
+
1595
+ <!-- ═══════════════════════ DRAFT CONTROL DOCK ═══════════════════════ -->
1596
+ <div class="dock" role="toolbar" aria-label="Draft controls">
1597
+ <span class="dock__tag">Draft 1</span>
1598
+ <div class="dseg" role="group" aria-label="View">
1599
+ <button id="dock-site" aria-pressed="true">Site</button>
1600
+ <button id="dock-app" aria-pressed="false">App</button>
1601
+ </div>
1602
+ <span class="dock__sep"></span>
1603
+ <button class="dicon" id="dock-light" aria-pressed="true" title="Light theme" aria-label="Light theme"><svg width="15" height="15"><use href="#i-sun"/></svg></button>
1604
+ <button class="dicon" id="dock-dark" aria-pressed="false" title="Dark theme" aria-label="Dark theme"><svg width="15" height="15"><use href="#i-moon"/></svg></button>
1605
+ <span class="dock__sep"></span>
1606
+ <span data-brand-dots data-dock></span>
1607
+ <span class="dock__sep"></span>
1608
+ <button class="tbtn" data-type-btn="grotesk" aria-pressed="true" title="Grotesk display">Aa</button>
1609
+ <button class="tbtn t-e" data-type-btn="editorial" aria-pressed="false" title="Editorial display">Aa</button>
1610
+ <button class="tbtn t-t" data-type-btn="terminal" aria-pressed="false" title="Terminal display">Aa</button>
1611
+ <span class="dock__sep"></span>
1612
+ <button class="dicon" id="dock-density" aria-pressed="false" title="Compact density" aria-label="Toggle compact density"><svg width="15" height="15"><use href="#i-density"/></svg></button>
1613
+ </div>
1614
+
1615
+ <script>
1616
+ /* classy v2 draft — mockup logic (throwaway comp; the real theme ships its own modules) */
1617
+ (() => {
1618
+ const root = document.documentElement;
1619
+
1620
+ /* ── draft dock: view / theme / brand / type / density ────────────────── */
1621
+
1622
+ const BRANDS = [
1623
+ { id: 'omega', dot: 'linear-gradient(135deg,#5b47fb,#00d4ff)' },
1624
+ { id: 'ember', dot: 'linear-gradient(135deg,#e8590c,#f43f5e)' },
1625
+ { id: 'emerald', dot: 'linear-gradient(135deg,#0e9f6e,#00d4ff)' },
1626
+ { id: 'ocean', dot: 'linear-gradient(135deg,#2563eb,#00d4ff)' },
1627
+ { id: 'rose', dot: 'linear-gradient(135deg,#e11d63,#8b5cf6)' },
1628
+ ];
1629
+
1630
+ function setBrand(id) {
1631
+ if (id === 'omega') {
1632
+ delete root.dataset.brand;
1633
+ } else {
1634
+ root.dataset.brand = id;
1635
+ }
1636
+ document.querySelectorAll('.bdot').forEach((dot) => {
1637
+ dot.setAttribute('aria-pressed', String(dot.dataset.brand === id));
1638
+ });
1639
+ drawAllCharts();
1640
+ }
1641
+
1642
+ document.querySelectorAll('[data-brand-dots]').forEach((host) => {
1643
+ BRANDS.forEach((brand) => {
1644
+ const btn = document.createElement('button');
1645
+ btn.className = 'bdot';
1646
+ btn.dataset.brand = brand.id;
1647
+ btn.style.background = brand.dot;
1648
+ btn.title = `Brand: ${brand.id}`;
1649
+ btn.setAttribute('aria-label', `Brand accent: ${brand.id}`);
1650
+ btn.setAttribute('aria-pressed', String(brand.id === 'omega'));
1651
+ btn.addEventListener('click', () => setBrand(brand.id));
1652
+ host.appendChild(btn);
1653
+ });
1654
+ });
1655
+
1656
+ const dockSite = document.getElementById('dock-site');
1657
+ const dockApp = document.getElementById('dock-app');
1658
+
1659
+ function setView(view) {
1660
+ root.dataset.view = view;
1661
+ dockSite.setAttribute('aria-pressed', String(view === 'site'));
1662
+ dockApp.setAttribute('aria-pressed', String(view === 'app'));
1663
+ drawAllCharts();
1664
+ }
1665
+ dockSite.addEventListener('click', () => setView('site'));
1666
+ dockApp.addEventListener('click', () => setView('app'));
1667
+
1668
+ const dockLight = document.getElementById('dock-light');
1669
+ const dockDark = document.getElementById('dock-dark');
1670
+
1671
+ function setTheme(theme) {
1672
+ root.dataset.theme = theme;
1673
+ dockLight.setAttribute('aria-pressed', String(theme === 'light'));
1674
+ dockDark.setAttribute('aria-pressed', String(theme === 'dark'));
1675
+ drawAllCharts();
1676
+ }
1677
+ dockLight.addEventListener('click', () => setTheme('light'));
1678
+ dockDark.addEventListener('click', () => setTheme('dark'));
1679
+
1680
+ document.querySelectorAll('[data-type-btn]').forEach((btn) => {
1681
+ btn.addEventListener('click', () => {
1682
+ const type = btn.dataset.typeBtn;
1683
+ if (type === 'grotesk') {
1684
+ delete root.dataset.type;
1685
+ } else {
1686
+ root.dataset.type = type;
1687
+ }
1688
+ document.querySelectorAll('[data-type-btn]').forEach((b) => {
1689
+ b.setAttribute('aria-pressed', String(b === btn));
1690
+ });
1691
+ });
1692
+ });
1693
+
1694
+ const dockDensity = document.getElementById('dock-density');
1695
+ dockDensity.addEventListener('click', () => {
1696
+ const compact = root.dataset.density !== 'compact';
1697
+ if (compact) {
1698
+ root.dataset.density = 'compact';
1699
+ } else {
1700
+ delete root.dataset.density;
1701
+ }
1702
+ dockDensity.setAttribute('aria-pressed', String(compact));
1703
+ });
1704
+
1705
+ /* sync initial theme buttons with the viewer/OS theme */
1706
+ const prefersDark = matchMedia('(prefers-color-scheme: dark)');
1707
+ const startDark = root.dataset.theme
1708
+ ? root.dataset.theme === 'dark'
1709
+ : prefersDark.matches;
1710
+ dockLight.setAttribute('aria-pressed', String(!startDark));
1711
+ dockDark.setAttribute('aria-pressed', String(startDark));
1712
+
1713
+ /* ── site: glassy nav + scroll reveals + counters + marquee ───────────── */
1714
+
1715
+ const nav = document.getElementById('site-nav');
1716
+ const onScroll = () => nav.classList.toggle('scrolled', window.scrollY > 8);
1717
+ addEventListener('scroll', onScroll, { passive: true });
1718
+ onScroll();
1719
+
1720
+ const track = document.getElementById('marquee-track');
1721
+ track.innerHTML += track.innerHTML; // duplicate for the seamless loop
1722
+
1723
+ const reduceMotion = matchMedia('(prefers-reduced-motion: reduce)').matches;
1724
+
1725
+ const countUp = (el) => {
1726
+ const target = Number(el.dataset.count);
1727
+ if (reduceMotion) { el.textContent = target; return; }
1728
+ const t0 = performance.now();
1729
+ const tick = (t) => {
1730
+ const k = Math.min(1, (t - t0) / 900);
1731
+ el.textContent = Math.round(target * (1 - Math.pow(1 - k, 3)));
1732
+ if (k < 1) requestAnimationFrame(tick);
1733
+ };
1734
+ requestAnimationFrame(tick);
1735
+ };
1736
+
1737
+ const seen = new WeakSet();
1738
+ const observer = new IntersectionObserver((entries) => {
1739
+ entries.forEach((entry) => {
1740
+ if (!entry.isIntersecting) return;
1741
+ entry.target.classList.add('in');
1742
+ entry.target.querySelectorAll('[data-count]').forEach((el) => {
1743
+ if (seen.has(el)) return;
1744
+ seen.add(el);
1745
+ countUp(el);
1746
+ });
1747
+ observer.unobserve(entry.target);
1748
+ });
1749
+ }, { threshold: 0.15 });
1750
+ document.querySelectorAll('.rv').forEach((el) => observer.observe(el));
1751
+
1752
+ /* ── charts (drawn from data so they re-paint on theme/brand swap) ────── */
1753
+
1754
+ const css = (name) => getComputedStyle(root).getPropertyValue(name).trim();
1755
+
1756
+ const CURR = [420, 460, 445, 510, 548, 530, 585, 620, 604, 668, 701, 662, 731, 768];
1757
+ const PREV = [380, 398, 412, 405, 440, 452, 438, 472, 489, 470, 502, 516, 508, 522];
1758
+ const DAYS = ['Jul 1', 'Jul 2', 'Jul 3', 'Jul 4', 'Jul 5', 'Jul 6', 'Jul 7',
1759
+ 'Jul 8', 'Jul 9', 'Jul 10', 'Jul 11', 'Jul 12', 'Jul 13', 'Jul 14'];
1760
+
1761
+ const pts = (data, x0, x1, y0, y1, max) =>
1762
+ data.map((v, i) => [x0 + (i * (x1 - x0)) / (data.length - 1), y1 - (v / max) * (y1 - y0)]);
1763
+
1764
+ const lineD = (p) => 'M' + p.map(([x, y]) => `${x.toFixed(1)},${y.toFixed(1)}`).join(' L');
1765
+
1766
+ function drawBigChart() {
1767
+ const svg = document.getElementById('big-chart');
1768
+ const accent = css('--accent');
1769
+ const second = css('--chart-2');
1770
+ const line = css('--line');
1771
+ const faint = css('--faint');
1772
+ const MAX = 800;
1773
+ const [x0, x1, y0, y1] = [34, 706, 14, 224];
1774
+ const cp = pts(CURR, x0, x1, y0, y1, MAX);
1775
+ const pp = pts(PREV, x0, x1, y0, y1, MAX);
1776
+
1777
+ let grid = '';
1778
+ [0, 200, 400, 600, 800].forEach((v) => {
1779
+ const y = y1 - (v / MAX) * (y1 - y0);
1780
+ grid += `<line x1="${x0}" y1="${y}" x2="${x1}" y2="${y}" stroke="${line}" stroke-width="1"/>` +
1781
+ `<text x="${x0 - 8}" y="${y + 3.5}" text-anchor="end" font-size="10" fill="${faint}">${v}</text>`;
1782
+ });
1783
+ let xlabels = '';
1784
+ [0, 3, 6, 9, 13].forEach((i) => {
1785
+ xlabels += `<text x="${cp[i][0]}" y="248" text-anchor="middle" font-size="10" fill="${faint}">${DAYS[i]}</text>`;
1786
+ });
1787
+
1788
+ const areaD = `${lineD(cp)} L${x1},${y1} L${x0},${y1} Z`;
1789
+ const endC = cp[cp.length - 1];
1790
+ const endP = pp[pp.length - 1];
1791
+
1792
+ svg.innerHTML = `
1793
+ <defs>
1794
+ <linearGradient id="area-fill" x1="0" y1="0" x2="0" y2="1">
1795
+ <stop offset="0%" stop-color="${accent}" stop-opacity="0.22"/>
1796
+ <stop offset="100%" stop-color="${accent}" stop-opacity="0"/>
1797
+ </linearGradient>
1798
+ </defs>
1799
+ ${grid}${xlabels}
1800
+ <path d="${areaD}" fill="url(#area-fill)"/>
1801
+ <path d="${lineD(pp)}" fill="none" stroke="${second}" stroke-width="2" stroke-dasharray="5 5" stroke-linecap="round"/>
1802
+ <path d="${lineD(cp)}" fill="none" stroke="${accent}" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
1803
+ <circle cx="${endC[0]}" cy="${endC[1]}" r="4" fill="${accent}"/>
1804
+ <circle cx="${endC[0]}" cy="${endC[1]}" r="8" fill="${accent}" opacity="0.18"/>
1805
+ <text x="${endC[0] - 10}" y="${endC[1] - 12}" text-anchor="end" font-size="11" font-weight="650" fill="${accent}">768</text>
1806
+ <text x="${endP[0] - 10}" y="${endP[1] + 18}" text-anchor="end" font-size="11" font-weight="600" fill="${second}">522</text>
1807
+ <g id="chart-hover" style="display:none">
1808
+ <line id="hover-line" y1="${y0}" y2="${y1}" stroke="${faint}" stroke-width="1" stroke-dasharray="3 3"/>
1809
+ <circle id="hover-dot-c" r="4" fill="${accent}" stroke="${css('--surface')}" stroke-width="2"/>
1810
+ <circle id="hover-dot-p" r="4" fill="${second}" stroke="${css('--surface')}" stroke-width="2"/>
1811
+ </g>`;
1812
+
1813
+ /* hover layer */
1814
+ const tip = document.getElementById('chart-tip');
1815
+ const hover = svg.querySelector('#chart-hover');
1816
+ const hline = svg.querySelector('#hover-line');
1817
+ const hdc = svg.querySelector('#hover-dot-c');
1818
+ const hdp = svg.querySelector('#hover-dot-p');
1819
+
1820
+ svg.onpointermove = (event) => {
1821
+ const rect = svg.getBoundingClientRect();
1822
+ const sx = ((event.clientX - rect.left) / rect.width) * 720;
1823
+ const i = Math.max(0, Math.min(CURR.length - 1,
1824
+ Math.round(((sx - x0) / (x1 - x0)) * (CURR.length - 1))));
1825
+ const [cx, cy] = cp[i];
1826
+ hover.style.display = '';
1827
+ hline.setAttribute('x1', cx); hline.setAttribute('x2', cx);
1828
+ hdc.setAttribute('cx', cx); hdc.setAttribute('cy', cy);
1829
+ hdp.setAttribute('cx', pp[i][0]); hdp.setAttribute('cy', pp[i][1]);
1830
+ tip.style.display = 'block';
1831
+ tip.innerHTML = `<b>${DAYS[i]}</b>
1832
+ <div class="row"><i style="background:${accent}"></i>This period <span class="v num">${CURR[i]}</span></div>
1833
+ <div class="row"><i style="background:${second}"></i>Previous <span class="v num">${PREV[i]}</span></div>`;
1834
+ const px = (cx / 720) * rect.width;
1835
+ tip.style.left = `${Math.min(rect.width - 140, Math.max(4, px + 14))}px`;
1836
+ tip.style.top = `${(cy / 260) * rect.height - 8}px`;
1837
+ };
1838
+ svg.onpointerleave = () => {
1839
+ hover.style.display = 'none';
1840
+ tip.style.display = 'none';
1841
+ };
1842
+ }
1843
+
1844
+ function drawSparks() {
1845
+ document.querySelectorAll('svg.spark').forEach((svg) => {
1846
+ const data = svg.dataset.spark.split(',').map(Number);
1847
+ const max = Math.max(...data) * 1.15;
1848
+ const p = pts(data, 2, 118, 4, 32, max);
1849
+ const accent = css('--accent');
1850
+ const end = p[p.length - 1];
1851
+ svg.setAttribute('viewBox', '0 0 120 36');
1852
+ svg.innerHTML = `
1853
+ <path d="${lineD(p)} L118,34 L2,34 Z" fill="${accent}" opacity="0.1"/>
1854
+ <path d="${lineD(p)}" fill="none" stroke="${accent}" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>
1855
+ <circle cx="${end[0]}" cy="${end[1]}" r="2.6" fill="${accent}"/>`;
1856
+ });
1857
+ }
1858
+
1859
+ function drawFrameChart() {
1860
+ const svg = document.getElementById('frame-chart');
1861
+ const accent = css('--accent');
1862
+ const second = css('--chart-2');
1863
+ const p1 = pts(CURR, 6, 554, 8, 140, 800);
1864
+ const p2 = pts(PREV, 6, 554, 8, 140, 800);
1865
+ svg.innerHTML = `
1866
+ <path d="${lineD(p1)} L554,146 L6,146 Z" fill="${accent}" opacity="0.12"/>
1867
+ <path d="${lineD(p2)}" fill="none" stroke="${second}" stroke-width="1.6" stroke-dasharray="4 4"/>
1868
+ <path d="${lineD(p1)}" fill="none" stroke="${accent}" stroke-width="2" stroke-linecap="round"/>`;
1869
+ }
1870
+
1871
+ function drawAllCharts() {
1872
+ requestAnimationFrame(() => {
1873
+ drawBigChart();
1874
+ drawSparks();
1875
+ drawFrameChart();
1876
+ });
1877
+ }
1878
+ drawAllCharts();
1879
+ prefersDark.addEventListener('change', drawAllCharts);
1880
+
1881
+ /* ── app shell: collapse, drawer, menus, ad dismiss ───────────────────── */
1882
+
1883
+ const shell = document.getElementById('shell');
1884
+ const collapseBtn = document.getElementById('collapse-btn');
1885
+ collapseBtn.addEventListener('click', () => {
1886
+ const collapsed = shell.dataset.collapsed !== 'true';
1887
+ shell.dataset.collapsed = String(collapsed);
1888
+ collapseBtn.setAttribute('aria-expanded', String(!collapsed));
1889
+ });
1890
+
1891
+ const drawerBtn = document.getElementById('drawer-btn');
1892
+ const scrim = document.getElementById('scrim');
1893
+ const setDrawer = (open) => {
1894
+ shell.dataset.open = String(open);
1895
+ drawerBtn.setAttribute('aria-expanded', String(open));
1896
+ };
1897
+ drawerBtn.addEventListener('click', () => setDrawer(shell.dataset.open !== 'true'));
1898
+ scrim.addEventListener('click', () => setDrawer(false));
1899
+
1900
+ const account = document.getElementById('account');
1901
+ const accountBtn = document.getElementById('account-btn');
1902
+ accountBtn.addEventListener('click', (event) => {
1903
+ event.stopPropagation();
1904
+ const open = !account.classList.contains('open');
1905
+ account.classList.toggle('open', open);
1906
+ accountBtn.setAttribute('aria-expanded', String(open));
1907
+ });
1908
+ addEventListener('click', () => {
1909
+ account.classList.remove('open');
1910
+ accountBtn.setAttribute('aria-expanded', 'false');
1911
+ });
1912
+
1913
+ document.getElementById('ad-dismiss').addEventListener('click', () => {
1914
+ document.getElementById('ad-slot').remove();
1915
+ });
1916
+
1917
+ /* segmented controls + sidebar nav: purely visual state for the draft */
1918
+ document.querySelectorAll('.seg').forEach((seg) => {
1919
+ seg.addEventListener('click', (event) => {
1920
+ const btn = event.target.closest('button');
1921
+ if (!btn) return;
1922
+ seg.querySelectorAll('button').forEach((b) => b.setAttribute('aria-pressed', String(b === btn)));
1923
+ });
1924
+ });
1925
+ document.querySelectorAll('.side .nav-item').forEach((item) => {
1926
+ item.addEventListener('click', () => {
1927
+ document.querySelectorAll('.side .nav-item').forEach((n) => n.removeAttribute('aria-current'));
1928
+ item.setAttribute('aria-current', 'page');
1929
+ });
1930
+ });
1931
+ })();
1932
+ </script>