@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,1956 @@
1
+ <title>classy v2 — Draft 2</title>
2
+ <style>
3
+ /* ============================================================================
4
+ CLASSY v2 — DRAFT 2 (interactive direction mockup, not production code)
5
+ Changes from Draft 1 (Ian's feedback):
6
+ · zero gradients (only monotone-opacity chart fades remain)
7
+ · neutral “generic” dark — no blue/purple cast (ElevenLabs reference)
8
+ · Manus-leaning type + colors in the app; ink primary buttons
9
+ · nested sidebar dropdowns; search moved to topbar; active-shift fixed
10
+ · marketing re-skinned: ink on paper, serif display, motion for life
11
+ ========================================================================== */
12
+
13
+ /* ─── Tokens ─────────────────────────────────────────────────────────────── */
14
+
15
+ :root {
16
+ /* geometry */
17
+ --r-xs: 6px;
18
+ --r-s: 8px;
19
+ --r-m: 10px;
20
+ --r-l: 14px;
21
+ --r-xl: 20px;
22
+
23
+ /* type */
24
+ --font-ui: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
25
+ --font-mono: ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, monospace;
26
+ --font-serif: "New York", ui-serif, Georgia, "Iowan Old Style", "Times New Roman", serif;
27
+ --font-display: var(--font-ui); /* app display */
28
+ --font-marketing: var(--font-serif); /* marketing display (Manus split) */
29
+ --track-display: -0.02em;
30
+ --fs-ui: 13.5px;
31
+
32
+ /* density-scaled geometry */
33
+ --control-h: 34px;
34
+ --pad-card: 20px;
35
+ --nav-item-h: 34px;
36
+ --cell-pad: 12px 16px;
37
+ --shell-side: 264px;
38
+ --shell-rail: 68px;
39
+ --shell-top: 60px;
40
+
41
+ /* motion */
42
+ --speed: 160ms;
43
+ --ease: cubic-bezier(0.25, 0.5, 0.35, 1);
44
+
45
+ /* brand accent — ONE hue per brand, light/dark variants */
46
+ --acc-l: #5b47fb;
47
+ --acc-d: #8577ff;
48
+ --chart2-l: #0f8fa9;
49
+ --chart2-d: #1f9fb4;
50
+ }
51
+
52
+ :root[data-density="compact"] {
53
+ --fs-ui: 12.5px;
54
+ --control-h: 29px;
55
+ --pad-card: 14px;
56
+ --nav-item-h: 29px;
57
+ --cell-pad: 8px 14px;
58
+ --shell-top: 52px;
59
+ }
60
+
61
+ /* type presets — default is the Manus split (app sans · marketing serif) */
62
+ :root[data-type="sans"] { --font-marketing: var(--font-ui); --track-display: -0.03em; }
63
+ :root[data-type="editorial"] { --font-display: var(--font-serif); }
64
+ :root[data-type="terminal"] { --font-display: var(--font-mono); --font-marketing: var(--font-mono); }
65
+
66
+ /* brand presets — single hue each */
67
+ :root[data-brand="ember"] { --acc-l: #e8590c; --acc-d: #ff8b3d; }
68
+ :root[data-brand="emerald"] { --acc-l: #0e9f6e; --acc-d: #34d39b; }
69
+ :root[data-brand="ocean"] { --acc-l: #2563eb; --acc-d: #6395ff; }
70
+ :root[data-brand="rose"] { --acc-l: #e11d63; --acc-d: #fb5c94; }
71
+
72
+ /* light theme — warm-neutral paper (Manus reference) */
73
+ :root {
74
+ color-scheme: light;
75
+ --ground: #f5f5f4;
76
+ --surface: #ffffff;
77
+ --surface-2: #f6f6f5;
78
+ --ink: #1a1a19;
79
+ --muted: #6d6d6c;
80
+ --faint: #a1a19e;
81
+ --line: #e8e8e6;
82
+ --line-strong: #d8d8d5;
83
+ --accent: var(--acc-l);
84
+ --chart-2: var(--chart2-l);
85
+ --accent-ink: #ffffff;
86
+ --ok: #12925c;
87
+ --warn: #c47206;
88
+ --danger: #d92d20;
89
+ --shadow-s: 0 1px 2px rgb(20 20 19 / 5%);
90
+ --shadow-m: 0 8px 24px -12px rgb(20 20 19 / 16%);
91
+ --shadow-l: 0 24px 60px -24px rgb(20 20 19 / 22%);
92
+ --glass: rgb(255 255 255 / 70%);
93
+ --panel-ink: #161616;
94
+ }
95
+
96
+ @media (prefers-color-scheme: dark) {
97
+ :root {
98
+ color-scheme: dark;
99
+ --ground: #0d0d0e;
100
+ --surface: #151516;
101
+ --surface-2: #1d1d1f;
102
+ --ink: #ebebea;
103
+ --muted: #9f9fa0;
104
+ --faint: #6c6c6e;
105
+ --line: #262628;
106
+ --line-strong: #333336;
107
+ --accent: var(--acc-d);
108
+ --chart-2: var(--chart2-d);
109
+ --accent-ink: #111112;
110
+ --ok: #3ecf8e;
111
+ --warn: #f5a524;
112
+ --danger: #f0574d;
113
+ --shadow-s: 0 1px 2px rgb(0 0 0 / 40%);
114
+ --shadow-m: 0 8px 24px -12px rgb(0 0 0 / 55%);
115
+ --shadow-l: 0 24px 60px -24px rgb(0 0 0 / 65%);
116
+ --glass: rgb(21 21 22 / 68%);
117
+ --panel-ink: #1a1a1b;
118
+ }
119
+ }
120
+
121
+ :root[data-theme="dark"] {
122
+ color-scheme: dark;
123
+ --ground: #0d0d0e;
124
+ --surface: #151516;
125
+ --surface-2: #1d1d1f;
126
+ --ink: #ebebea;
127
+ --muted: #9f9fa0;
128
+ --faint: #6c6c6e;
129
+ --line: #262628;
130
+ --line-strong: #333336;
131
+ --accent: var(--acc-d);
132
+ --chart-2: var(--chart2-d);
133
+ --accent-ink: #111112;
134
+ --ok: #3ecf8e;
135
+ --warn: #f5a524;
136
+ --danger: #f0574d;
137
+ --shadow-s: 0 1px 2px rgb(0 0 0 / 40%);
138
+ --shadow-m: 0 8px 24px -12px rgb(0 0 0 / 55%);
139
+ --shadow-l: 0 24px 60px -24px rgb(0 0 0 / 65%);
140
+ --glass: rgb(21 21 22 / 68%);
141
+ --panel-ink: #1a1a1b;
142
+ }
143
+
144
+ :root[data-theme="light"] {
145
+ color-scheme: light;
146
+ --ground: #f5f5f4;
147
+ --surface: #ffffff;
148
+ --surface-2: #f6f6f5;
149
+ --ink: #1a1a19;
150
+ --muted: #6d6d6c;
151
+ --faint: #a1a19e;
152
+ --line: #e8e8e6;
153
+ --line-strong: #d8d8d5;
154
+ --accent: var(--acc-l);
155
+ --chart-2: var(--chart2-l);
156
+ --accent-ink: #ffffff;
157
+ --ok: #12925c;
158
+ --warn: #c47206;
159
+ --danger: #d92d20;
160
+ --shadow-s: 0 1px 2px rgb(20 20 19 / 5%);
161
+ --shadow-m: 0 8px 24px -12px rgb(20 20 19 / 16%);
162
+ --shadow-l: 0 24px 60px -24px rgb(20 20 19 / 22%);
163
+ --glass: rgb(255 255 255 / 70%);
164
+ --panel-ink: #161616;
165
+ }
166
+
167
+ /* derived */
168
+ :root {
169
+ --accent-subtle: color-mix(in srgb, var(--accent) 11%, transparent);
170
+ --accent-hover: color-mix(in srgb, var(--accent) 88%, var(--ink) 12%);
171
+ --ring: color-mix(in srgb, var(--accent) 40%, transparent);
172
+ --ok-subtle: color-mix(in srgb, var(--ok) 13%, transparent);
173
+ --warn-subtle: color-mix(in srgb, var(--warn) 14%, transparent);
174
+ --danger-subtle: color-mix(in srgb, var(--danger) 12%, transparent);
175
+ }
176
+
177
+ /* ─── Base ───────────────────────────────────────────────────────────────── */
178
+
179
+ html { scroll-behavior: smooth; }
180
+ html[data-view="app"] { overflow: hidden; }
181
+
182
+ body {
183
+ margin: 0;
184
+ background: var(--ground);
185
+ color: var(--ink);
186
+ font-family: var(--font-ui);
187
+ font-size: var(--fs-ui);
188
+ line-height: 1.55;
189
+ -webkit-font-smoothing: antialiased;
190
+ }
191
+
192
+ * { box-sizing: border-box; }
193
+ svg { display: block; }
194
+ button { font: inherit; color: inherit; background: none; border: 0; padding: 0; cursor: pointer; }
195
+ :is(button, a, [tabindex]):focus-visible { outline: 2px solid var(--ring); outline-offset: 2px; border-radius: var(--r-xs); }
196
+ ::selection { background: color-mix(in srgb, var(--accent) 22%, transparent); }
197
+
198
+ h1, h2, h3 { margin: 0; font-family: var(--font-display); letter-spacing: var(--track-display); text-wrap: balance; }
199
+ p { margin: 0; }
200
+
201
+ .num { font-variant-numeric: tabular-nums; }
202
+ .mono { font-family: var(--font-mono); }
203
+
204
+ /* view switching */
205
+ .view--site { display: block; }
206
+ .view--app { display: none; }
207
+ html[data-view="app"] .view--site { display: none; }
208
+ html[data-view="app"] .view--app { display: block; }
209
+
210
+ /* ─── Shared atoms ───────────────────────────────────────────────────────── */
211
+
212
+ .btn {
213
+ display: inline-flex;
214
+ align-items: center;
215
+ justify-content: center;
216
+ gap: 7px;
217
+ height: var(--control-h);
218
+ padding: 0 14px;
219
+ border-radius: var(--r-s);
220
+ font-weight: 560;
221
+ font-size: var(--fs-ui);
222
+ border: 1px solid transparent;
223
+ transition: background var(--speed) var(--ease), border-color var(--speed) var(--ease),
224
+ color var(--speed) var(--ease), transform var(--speed) var(--ease),
225
+ opacity var(--speed) var(--ease);
226
+ white-space: nowrap;
227
+ }
228
+ .btn:active { transform: translateY(1px); }
229
+ .btn--ink { background: var(--ink); color: var(--surface); }
230
+ .btn--ink:hover { opacity: 0.86; }
231
+ .btn--paper { background: #ffffff; color: #161616; }
232
+ .btn--paper:hover { opacity: 0.9; }
233
+ .btn--accent { background: var(--accent); color: var(--accent-ink); }
234
+ .btn--accent:hover { background: var(--accent-hover); }
235
+ .btn--ghost { border-color: var(--line-strong); color: var(--ink); background: var(--surface); }
236
+ .btn--ghost:hover { background: var(--surface-2); }
237
+ .btn--quiet:hover { background: var(--surface-2); }
238
+ .btn--lg { height: calc(var(--control-h) + 10px); padding: 0 20px; font-size: calc(var(--fs-ui) + 1.5px); border-radius: var(--r-m); }
239
+
240
+ .iconbtn {
241
+ display: inline-flex;
242
+ align-items: center;
243
+ justify-content: center;
244
+ width: var(--control-h);
245
+ height: var(--control-h);
246
+ border-radius: var(--r-s);
247
+ color: var(--muted);
248
+ position: relative;
249
+ }
250
+ .iconbtn:hover { background: var(--surface-2); color: var(--ink); }
251
+ .iconbtn .dot {
252
+ position: absolute; top: 7px; right: 7px;
253
+ width: 7px; height: 7px; border-radius: 50%;
254
+ background: var(--danger); border: 2px solid var(--surface);
255
+ }
256
+
257
+ .chip {
258
+ display: inline-flex;
259
+ align-items: center;
260
+ gap: 6px;
261
+ height: 22px;
262
+ padding: 0 9px;
263
+ border-radius: 999px;
264
+ font-size: 11.5px;
265
+ font-weight: 560;
266
+ border: 1px solid var(--line);
267
+ background: var(--surface-2);
268
+ color: var(--muted);
269
+ white-space: nowrap;
270
+ }
271
+ .chip--accent { background: var(--accent-subtle); border-color: transparent; color: var(--accent); }
272
+ .chip--ink { background: var(--ink); border-color: transparent; color: var(--surface); }
273
+
274
+ .pill-status { display: inline-flex; align-items: center; gap: 7px; font-weight: 560; font-size: 12px; }
275
+ .pill-status i { width: 7px; height: 7px; border-radius: 50%; flex: none; }
276
+ .pill-status--ok { color: var(--ok); } .pill-status--ok i { background: var(--ok); }
277
+ .pill-status--warn { color: var(--warn); } .pill-status--warn i { background: var(--warn); animation: pulse 1.4s ease-in-out infinite; }
278
+ .pill-status--danger { color: var(--danger); } .pill-status--danger i { background: var(--danger); }
279
+ @keyframes pulse { 50% { opacity: 0.35; } }
280
+
281
+ .seg {
282
+ display: inline-flex;
283
+ padding: 3px;
284
+ gap: 2px;
285
+ background: var(--surface-2);
286
+ border: 1px solid var(--line);
287
+ border-radius: var(--r-s);
288
+ }
289
+ .seg button {
290
+ height: calc(var(--control-h) - 8px);
291
+ padding: 0 12px;
292
+ border-radius: calc(var(--r-s) - 3px);
293
+ color: var(--muted);
294
+ font-weight: 560;
295
+ font-size: 12.5px;
296
+ }
297
+ .seg button:hover { color: var(--ink); }
298
+ .seg button[aria-pressed="true"] { background: var(--surface); color: var(--ink); box-shadow: var(--shadow-s); }
299
+
300
+ .card {
301
+ background: var(--surface);
302
+ border: 1px solid var(--line);
303
+ border-radius: var(--r-l);
304
+ box-shadow: var(--shadow-s);
305
+ }
306
+
307
+ .avatar {
308
+ display: inline-flex; align-items: center; justify-content: center;
309
+ width: 26px; height: 26px; border-radius: 50%;
310
+ background: var(--surface-2); color: var(--muted);
311
+ border: 1px solid var(--line-strong);
312
+ font-size: 10px; font-weight: 700; letter-spacing: 0.02em;
313
+ flex: none;
314
+ }
315
+
316
+ /* Ω brandmark — solid ink tile (no gradient) */
317
+ .mark {
318
+ display: inline-flex; align-items: center; justify-content: center;
319
+ width: 30px; height: 30px; border-radius: 9px;
320
+ background: var(--ink); color: var(--surface);
321
+ font-size: 17px; font-weight: 700; line-height: 1;
322
+ flex: none;
323
+ font-family: var(--font-ui);
324
+ }
325
+ .lockup { display: inline-flex; align-items: center; gap: 10px; font-weight: 680; font-size: 15.5px; letter-spacing: -0.02em; }
326
+
327
+ /* ============================================================================
328
+ SITE — marketing view (ink on paper)
329
+ ========================================================================== */
330
+
331
+ .site { position: relative; }
332
+
333
+ /* glassy nav — invisible until scroll */
334
+ .nav {
335
+ position: fixed;
336
+ inset: 0 0 auto 0;
337
+ z-index: 60;
338
+ transition: background var(--speed) var(--ease), border-color var(--speed) var(--ease);
339
+ border-bottom: 1px solid transparent;
340
+ }
341
+ .nav.scrolled {
342
+ background: var(--glass);
343
+ -webkit-backdrop-filter: blur(16px) saturate(1.3);
344
+ backdrop-filter: blur(16px) saturate(1.3);
345
+ border-bottom-color: var(--line);
346
+ }
347
+ .nav__in {
348
+ max-width: 1180px; margin: 0 auto;
349
+ display: flex; align-items: center; gap: 26px;
350
+ padding: 12px 28px;
351
+ }
352
+ .nav__links { display: flex; gap: 4px; margin-inline-start: 10px; }
353
+ .nav__links a {
354
+ color: var(--muted); text-decoration: none; font-weight: 540; font-size: 13.5px;
355
+ padding: 7px 11px; border-radius: var(--r-s);
356
+ }
357
+ .nav__links a:hover { color: var(--ink); background: var(--surface-2); }
358
+ .nav__cta { margin-inline-start: auto; display: flex; align-items: center; gap: 10px; }
359
+
360
+ /* hero */
361
+ .hero {
362
+ position: relative;
363
+ padding: 158px 28px 96px;
364
+ overflow: clip;
365
+ background: var(--ground);
366
+ }
367
+ .hero__bg { position: absolute; inset: 0; pointer-events: none; }
368
+ .hero__dots {
369
+ position: absolute; inset: 0;
370
+ background-image: radial-gradient(color-mix(in srgb, var(--ink) 15%, transparent) 1px, transparent 1px);
371
+ background-size: 22px 22px;
372
+ -webkit-mask-image: radial-gradient(ellipse 75% 62% at 50% 30%, #000 30%, transparent 72%);
373
+ mask-image: radial-gradient(ellipse 75% 62% at 50% 30%, #000 30%, transparent 72%);
374
+ opacity: 0.45;
375
+ }
376
+
377
+ .hero__in { position: relative; max-width: 1180px; margin: 0 auto; text-align: center; }
378
+
379
+ .hero__badge {
380
+ display: inline-flex; align-items: center; gap: 9px;
381
+ padding: 6px 14px; border-radius: 999px;
382
+ font-size: 12.5px; font-weight: 560; color: var(--muted);
383
+ background: var(--surface);
384
+ border: 1px solid var(--line-strong);
385
+ box-shadow: var(--shadow-s);
386
+ }
387
+ .hero__badge i { width: 7px; height: 7px; border-radius: 50%; background: var(--ok); flex: none; }
388
+ .hero__badge b { color: var(--ink); font-weight: 640; }
389
+
390
+ .hero h1 {
391
+ margin: 28px auto 0;
392
+ font-family: var(--font-marketing);
393
+ font-size: clamp(42px, 6.6vw, 78px);
394
+ line-height: 1.06;
395
+ font-weight: 640;
396
+ letter-spacing: -0.015em;
397
+ }
398
+ .hero h1 .rot-line { display: block; font-style: italic; color: var(--muted); }
399
+ .rot { display: inline-block; transition: opacity 0.24s var(--ease), transform 0.24s var(--ease); }
400
+ .rot.out { opacity: 0; transform: translateY(10px); }
401
+
402
+ .hero__sub {
403
+ margin: 24px auto 0;
404
+ max-width: 62ch;
405
+ color: var(--muted);
406
+ font-size: clamp(15px, 1.6vw, 17.5px);
407
+ line-height: 1.65;
408
+ }
409
+ .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; }
410
+ .hero__cta { margin-top: 32px; display: flex; gap: 12px; justify-content: center; flex-wrap: wrap; }
411
+ .hero__cmd { gap: 10px; font-family: var(--font-mono); font-size: 13px; font-weight: 500; color: var(--muted); }
412
+ .hero__cmd:hover { color: var(--ink); }
413
+
414
+ /* entrance stagger */
415
+ .rise { opacity: 0; transform: translateY(16px); animation: rise 0.7s var(--ease) forwards; }
416
+ .rise-2 { animation-delay: 0.08s; }
417
+ .rise-3 { animation-delay: 0.16s; }
418
+ .rise-4 { animation-delay: 0.26s; }
419
+ .rise-5 { animation-delay: 0.4s; }
420
+ @keyframes rise { to { opacity: 1; transform: none; } }
421
+
422
+ /* floating app frame — motion for life, no glow */
423
+ .frame-wrap { position: relative; margin: 64px auto 0; max-width: 980px; perspective: 1600px; }
424
+ .frame-float { animation: floaty 7s ease-in-out infinite; }
425
+ @keyframes floaty { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-9px); } }
426
+ .frame {
427
+ position: relative;
428
+ border-radius: var(--r-xl);
429
+ border: 1px solid var(--line);
430
+ background: var(--surface);
431
+ box-shadow: var(--shadow-l);
432
+ overflow: hidden;
433
+ transform: rotateX(7deg);
434
+ transform-origin: 50% 0;
435
+ transition: transform 0.7s var(--ease);
436
+ }
437
+ .frame-wrap:hover .frame { transform: rotateX(2deg); }
438
+ .frame__bar {
439
+ display: flex; align-items: center; gap: 8px;
440
+ padding: 11px 16px;
441
+ border-bottom: 1px solid var(--line);
442
+ background: var(--surface-2);
443
+ }
444
+ .frame__bar i { width: 10px; height: 10px; border-radius: 50%; background: var(--line-strong); }
445
+ .frame__url {
446
+ margin: 0 auto;
447
+ display: inline-flex; align-items: center; gap: 7px;
448
+ font-size: 11.5px; color: var(--muted);
449
+ background: var(--surface); border: 1px solid var(--line);
450
+ padding: 4px 14px; border-radius: 999px;
451
+ font-family: var(--font-mono);
452
+ }
453
+ .frame__body { display: grid; grid-template-columns: 208px 1fr; min-height: 380px; background: var(--ground); }
454
+ .frame__side { background: var(--ground); border-inline-end: 1px solid var(--line); padding: 14px 10px; display: flex; flex-direction: column; gap: 3px; }
455
+ .frame__side .lockup { padding: 4px 8px 10px; font-size: 13px; }
456
+ .frame__side .mark { width: 22px; height: 22px; border-radius: 7px; font-size: 12px; }
457
+ .fnav {
458
+ display: flex; align-items: center; gap: 9px;
459
+ padding: 6px 9px; border-radius: 8px;
460
+ color: var(--muted); font-size: 12px; font-weight: 540;
461
+ }
462
+ .fnav svg { opacity: 0.75; }
463
+ .fnav.on { background: var(--accent-subtle); color: var(--accent); font-weight: 620; }
464
+ .fnav.on svg { opacity: 1; }
465
+ .frame__main { padding: 18px; display: flex; flex-direction: column; gap: 12px; }
466
+ .frame__tiles { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
467
+ .ftile { background: var(--surface); border: 1px solid var(--line); border-radius: 10px; padding: 12px 14px; text-align: left; }
468
+ .ftile b { display: block; font-size: 17px; letter-spacing: -0.02em; }
469
+ .ftile span { font-size: 11px; color: var(--muted); }
470
+ .ftile .up { color: var(--ok); font-size: 10.5px; font-weight: 650; }
471
+ .fchart { flex: 1; background: var(--surface); border: 1px solid var(--line); border-radius: 12px; padding: 12px 14px; text-align: left; }
472
+ .fchart span { font-size: 11px; color: var(--muted); }
473
+
474
+ /* logo marquee */
475
+ .logos { padding: 34px 0 10px; border-block: 1px solid var(--line); background: var(--surface); }
476
+ .logos p { text-align: center; font-size: 11.5px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--faint); font-weight: 600; }
477
+ .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); }
478
+ .marquee__track { display: flex; width: max-content; animation: slide 30s linear infinite; }
479
+ .marquee__track .wlogo { margin-inline-end: 64px; }
480
+ .marquee:hover .marquee__track { animation-play-state: paused; }
481
+ @keyframes slide { to { transform: translateX(-50%); } }
482
+ .wlogo { font-weight: 700; font-size: 17px; letter-spacing: 0.02em; color: var(--faint); white-space: nowrap; }
483
+
484
+ /* sections */
485
+ .section { padding: 96px 28px; }
486
+ .section__in { max-width: 1180px; margin: 0 auto; }
487
+ .section__eyebrow { color: var(--muted); font-weight: 650; font-size: 12px; letter-spacing: 0.14em; text-transform: uppercase; }
488
+ .section h2 { font-family: var(--font-marketing); font-size: clamp(30px, 4vw, 44px); font-weight: 620; line-height: 1.1; letter-spacing: -0.015em; margin-top: 12px; max-width: 24ch; }
489
+ .section__sub { color: var(--muted); max-width: 58ch; margin-top: 14px; font-size: 15.5px; line-height: 1.65; }
490
+
491
+ /* bento */
492
+ .bento { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; margin-top: 44px; }
493
+ .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; }
494
+ .bento .card:hover { transform: translateY(-3px); box-shadow: var(--shadow-m); }
495
+ .bento .card h3 { font-size: 16.5px; font-weight: 650; letter-spacing: -0.015em; font-family: var(--font-display); }
496
+ .bento .card p { color: var(--muted); font-size: 13px; line-height: 1.6; }
497
+ .b-2x2 { grid-column: span 2; grid-row: span 2; }
498
+ .b-2x1 { grid-column: span 2; }
499
+ .icotile {
500
+ width: 34px; height: 34px; border-radius: 10px;
501
+ display: inline-flex; align-items: center; justify-content: center;
502
+ background: var(--surface-2); color: var(--ink);
503
+ border: 1px solid var(--line);
504
+ flex: none;
505
+ }
506
+ .codebox {
507
+ margin-top: auto;
508
+ background: var(--panel-ink);
509
+ color: #e3e3e1;
510
+ border-radius: var(--r-m);
511
+ border: 1px solid rgb(255 255 255 / 8%);
512
+ padding: 16px 18px;
513
+ font-family: var(--font-mono);
514
+ font-size: 12px;
515
+ line-height: 1.75;
516
+ overflow-x: auto;
517
+ }
518
+ .codebox .k { color: #9a9a97; }
519
+ .codebox .s { color: #c9c9c6; }
520
+ .codebox .c { color: #6c6c6a; }
521
+ .targets { display: flex; flex-wrap: wrap; gap: 8px; }
522
+ .brand-dots { display: flex; gap: 10px; margin-top: auto; padding-top: 6px; }
523
+ .bdot {
524
+ width: 26px; height: 26px; border-radius: 50%;
525
+ border: 2px solid var(--surface);
526
+ box-shadow: 0 0 0 1px var(--line-strong);
527
+ transition: transform var(--speed) var(--ease), box-shadow var(--speed) var(--ease);
528
+ }
529
+ .bdot:hover { transform: scale(1.15); }
530
+ .bdot[aria-pressed="true"] { box-shadow: 0 0 0 2px var(--ink); transform: scale(1.08); }
531
+ .split { display: flex; border-radius: var(--r-m); overflow: hidden; border: 1px solid var(--line); margin-top: auto; min-height: 74px; }
532
+ .split > div { flex: 1; padding: 10px 12px; font-size: 11px; font-weight: 600; }
533
+ .split .lite { background: #f5f5f4; color: #6d6d6c; }
534
+ .split .dark { background: #141415; color: #9f9fa0; }
535
+ .split i { display: block; width: 34px; height: 8px; border-radius: 999px; background: var(--accent); margin-top: 8px; }
536
+ .term {
537
+ margin-top: auto;
538
+ background: var(--panel-ink); border-radius: var(--r-m); padding: 14px 18px;
539
+ font-family: var(--font-mono); font-size: 12.5px; color: #e3e3e1;
540
+ display: flex; align-items: center; gap: 10px;
541
+ border: 1px solid rgb(255 255 255 / 8%);
542
+ overflow-x: auto; white-space: nowrap;
543
+ }
544
+ .term .p { color: #9a9a97; }
545
+ .term .okx { color: #3ecf8e; }
546
+ .term::after { content: ""; width: 7px; height: 15px; background: #e3e3e1; animation: caret 1.1s steps(1) infinite; flex: none; }
547
+ @keyframes caret { 50% { opacity: 0; } }
548
+ .mini-rows { display: flex; flex-direction: column; gap: 8px; margin-top: auto; }
549
+ .mini-rows div { display: flex; align-items: center; gap: 9px; font-size: 12.5px; color: var(--muted); font-weight: 540; }
550
+ .mini-rows svg { color: var(--ok); flex: none; }
551
+
552
+ /* stats band — quiet paper band, serif ink numbers */
553
+ .band { background: var(--surface); border-block: 1px solid var(--line); }
554
+ .band__grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 24px; }
555
+ .band__cell { text-align: center; padding: 10px 6px; }
556
+ .band__cell b {
557
+ display: block;
558
+ font-family: var(--font-marketing);
559
+ font-size: clamp(34px, 4.4vw, 54px);
560
+ font-weight: 620;
561
+ letter-spacing: -0.01em;
562
+ color: var(--ink);
563
+ }
564
+ .band__cell span { color: var(--muted); font-size: 13px; font-weight: 540; }
565
+
566
+ /* pricing */
567
+ .pricing { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; margin-top: 44px; align-items: stretch; }
568
+ .price { padding: calc(var(--pad-card) + 6px); display: flex; flex-direction: column; gap: 14px; }
569
+ .price--pop { border-color: var(--ink); box-shadow: var(--shadow-m); }
570
+ .price__head { display: flex; align-items: center; justify-content: space-between; }
571
+ .price__name { font-weight: 680; font-size: 15.5px; }
572
+ .price__amt { font-family: var(--font-marketing); font-size: 40px; font-weight: 620; letter-spacing: -0.01em; }
573
+ .price__amt span { font-size: 14px; color: var(--muted); font-weight: 520; letter-spacing: 0; font-family: var(--font-ui); }
574
+ .price ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 9px; }
575
+ .price li { display: flex; gap: 9px; align-items: center; color: var(--muted); font-size: 13px; }
576
+ .price li svg { color: var(--ok); flex: none; }
577
+ .price .btn { margin-top: auto; }
578
+
579
+ /* quote */
580
+ .quote { text-align: center; max-width: 760px; margin: 0 auto; }
581
+ .quote blockquote {
582
+ margin: 0;
583
+ font-family: var(--font-marketing);
584
+ font-size: clamp(22px, 3vw, 31px);
585
+ font-weight: 560;
586
+ line-height: 1.35;
587
+ letter-spacing: -0.01em;
588
+ }
589
+ .quote blockquote em { font-style: italic; }
590
+ .quote figcaption { margin-top: 18px; color: var(--muted); font-size: 13.5px; display: flex; align-items: center; gap: 10px; justify-content: center; }
591
+
592
+ /* cta band — neutral ink panel, no decoration */
593
+ .cta-band {
594
+ border-radius: var(--r-xl);
595
+ background: var(--panel-ink);
596
+ color: #f1f1ef;
597
+ padding: 72px 40px;
598
+ text-align: center;
599
+ }
600
+ .cta-band h2 { font-family: var(--font-marketing); font-size: clamp(28px, 3.6vw, 42px); font-weight: 620; letter-spacing: -0.01em; }
601
+ .cta-band p { color: #9f9fa0; margin-top: 12px; }
602
+ .cta-band .ghosty { color: #c9c9c6; }
603
+ .cta-band .ghosty:hover { color: #ffffff; }
604
+
605
+ /* footer */
606
+ .footer { border-top: 1px solid var(--line); background: var(--surface); padding: 56px 28px 34px; }
607
+ .footer__in { max-width: 1180px; margin: 0 auto; }
608
+ .footer__grid { display: grid; grid-template-columns: 2fr 1fr 1fr 1fr; gap: 32px; }
609
+ .footer h4 { margin: 0 0 12px; font-size: 12px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--faint); }
610
+ .footer a { display: block; color: var(--muted); text-decoration: none; font-size: 13px; padding: 4px 0; }
611
+ .footer a:hover { color: var(--ink); }
612
+ .footer__brand p { color: var(--muted); font-size: 13px; max-width: 30ch; margin-top: 12px; line-height: 1.6; }
613
+ .footer__base {
614
+ display: flex; align-items: center; gap: 14px;
615
+ margin-top: 40px; padding-top: 22px;
616
+ border-top: 1px solid var(--line);
617
+ color: var(--faint); font-size: 12.5px;
618
+ }
619
+
620
+ /* scroll reveal */
621
+ .rv { opacity: 0; transform: translateY(16px); }
622
+ .rv.in { opacity: 1; transform: none; transition: opacity 0.65s var(--ease), transform 0.65s var(--ease); }
623
+
624
+ /* ============================================================================
625
+ APP — dashboard view
626
+ ========================================================================== */
627
+
628
+ .shell {
629
+ display: grid;
630
+ grid-template-columns: auto minmax(0, 1fr);
631
+ grid-template-rows: auto minmax(0, 1fr);
632
+ height: 100dvh;
633
+ background: var(--ground);
634
+ }
635
+
636
+ .side {
637
+ grid-row: 1 / -1;
638
+ width: var(--shell-side);
639
+ display: flex;
640
+ flex-direction: column;
641
+ padding: 14px 12px 12px;
642
+ gap: 2px;
643
+ overflow-y: auto;
644
+ overflow-x: hidden;
645
+ transition: width var(--speed) var(--ease), transform var(--speed) var(--ease);
646
+ }
647
+ .side__head { display: flex; align-items: center; gap: 10px; padding: 2px 8px 12px; }
648
+ .side__head .word { font-weight: 680; font-size: 15px; letter-spacing: -0.02em; white-space: nowrap; }
649
+ .side__head .ver { margin-inline-start: auto; }
650
+
651
+ .selector {
652
+ display: flex; align-items: center; gap: 9px;
653
+ padding: 7px 9px;
654
+ border-radius: var(--r-m);
655
+ border: 1px solid var(--line);
656
+ background: var(--surface);
657
+ box-shadow: var(--shadow-s);
658
+ margin-bottom: 12px;
659
+ width: 100%;
660
+ text-align: left;
661
+ }
662
+ .selector:hover { border-color: var(--line-strong); }
663
+ .selector .pdot { width: 20px; height: 20px; border-radius: 7px; background: var(--accent); flex: none; }
664
+ .selector b { font-size: 12.5px; font-weight: 620; display: block; line-height: 1.2; white-space: nowrap; }
665
+ .selector span { font-size: 11px; color: var(--faint); display: block; line-height: 1.2; }
666
+ .selector > svg { margin-inline-start: auto; color: var(--faint); flex: none; }
667
+
668
+ .side__label {
669
+ padding: 14px 10px 5px;
670
+ font-size: 10.5px;
671
+ font-weight: 650;
672
+ letter-spacing: 0.09em;
673
+ text-transform: uppercase;
674
+ color: var(--faint);
675
+ white-space: nowrap;
676
+ }
677
+
678
+ /* transparent border keeps geometry constant — active state can't shift text */
679
+ .nav-item {
680
+ display: flex; align-items: center; gap: 10px;
681
+ height: var(--nav-item-h);
682
+ padding: 0 9px;
683
+ border: 1px solid transparent;
684
+ border-radius: var(--r-s);
685
+ color: var(--muted);
686
+ font-weight: 540;
687
+ font-size: 13px;
688
+ width: 100%;
689
+ text-align: left;
690
+ white-space: nowrap;
691
+ }
692
+ .nav-item svg { flex: none; opacity: 0.85; }
693
+ .nav-item:hover { background: color-mix(in srgb, var(--ink) 5%, transparent); color: var(--ink); }
694
+ .nav-item[aria-current="page"] {
695
+ background: var(--surface);
696
+ color: var(--ink);
697
+ font-weight: 620;
698
+ box-shadow: var(--shadow-s);
699
+ border-color: var(--line);
700
+ }
701
+ .nav-item[aria-current="page"] svg { color: var(--accent); opacity: 1; }
702
+ .nav-item .tail { margin-inline-start: auto; }
703
+ .nav-item .chev { margin-inline-start: auto; color: var(--faint); display: inline-flex; }
704
+ .nav-item .chev svg { transition: transform var(--speed) var(--ease); }
705
+ .nav-item[aria-expanded="false"] .chev svg { transform: rotate(-90deg); }
706
+
707
+ /* nested groups */
708
+ .nav-sub { display: grid; grid-template-rows: 0fr; transition: grid-template-rows var(--speed) var(--ease); }
709
+ .nav-sub.open { grid-template-rows: 1fr; }
710
+ .nav-sub__in {
711
+ overflow: hidden;
712
+ display: flex; flex-direction: column; gap: 2px;
713
+ margin-inline-start: 17px;
714
+ padding-inline-start: 8px;
715
+ border-inline-start: 1px solid var(--line);
716
+ }
717
+ .nav-sub .nav-item { height: calc(var(--nav-item-h) - 4px); font-size: 12.5px; }
718
+
719
+ .side__foot { margin-top: auto; display: flex; flex-direction: column; gap: 10px; padding-top: 14px; }
720
+
721
+ /* the optional ad module — hairline, no gradient */
722
+ .ad {
723
+ position: relative;
724
+ border-radius: var(--r-m);
725
+ padding: 12px 12px 11px;
726
+ background: var(--surface);
727
+ border: 1px solid var(--line-strong);
728
+ box-shadow: var(--shadow-s);
729
+ }
730
+ .ad__tag { font-size: 9.5px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--faint); font-weight: 650; }
731
+ .ad b { display: block; font-size: 12.5px; font-weight: 620; margin-top: 3px; letter-spacing: -0.01em; }
732
+ .ad p { font-size: 11.5px; color: var(--muted); line-height: 1.45; margin-top: 2px; }
733
+ .ad a { color: var(--accent); font-size: 11.5px; font-weight: 620; text-decoration: none; display: inline-block; margin-top: 6px; }
734
+ .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; }
735
+ .ad__x:hover { color: var(--ink); background: var(--surface-2); }
736
+
737
+ .user-row { display: flex; align-items: center; gap: 9px; padding: 6px 8px; border-radius: var(--r-s); width: 100%; text-align: left; }
738
+ .user-row:hover { background: color-mix(in srgb, var(--ink) 5%, transparent); }
739
+ .user-row b { display: block; font-size: 12.5px; font-weight: 600; line-height: 1.25; white-space: nowrap; }
740
+ .user-row span { display: block; font-size: 11px; color: var(--faint); line-height: 1.25; white-space: nowrap; }
741
+ .user-row > svg { margin-inline-start: auto; color: var(--faint); flex: none; }
742
+
743
+ /* collapsed rail */
744
+ .shell[data-collapsed="true"] .side { width: var(--shell-rail); padding-inline: 10px; }
745
+ .shell[data-collapsed="true"] :is(.side__head .word, .side__head .ver, .side .meta, .selector > svg,
746
+ .side__label, .nav-item .lbl, .nav-item .tail, .nav-item .chev, .nav-sub,
747
+ .ad, .user-row > svg) { display: none; }
748
+ .shell[data-collapsed="true"] .side__head { justify-content: center; padding-inline: 0; }
749
+ .shell[data-collapsed="true"] .selector { justify-content: center; padding: 8px 0; }
750
+ .shell[data-collapsed="true"] .nav-item { justify-content: center; padding: 0; gap: 0; }
751
+ .shell[data-collapsed="true"] .user-row { justify-content: center; }
752
+
753
+ /* topbar — search lives HERE now */
754
+ .top {
755
+ grid-column: 2;
756
+ display: flex; align-items: center; gap: 10px;
757
+ min-height: var(--shell-top);
758
+ padding: 0 18px 0 6px;
759
+ }
760
+ .top__toggle { color: var(--muted); }
761
+ .crumb { display: flex; align-items: center; gap: 8px; font-size: 13.5px; font-weight: 620; white-space: nowrap; }
762
+ .crumb .sep { color: var(--faint); font-weight: 400; }
763
+ .top__search {
764
+ display: flex; align-items: center; gap: 8px;
765
+ flex: 1;
766
+ max-width: 380px;
767
+ margin-inline: auto;
768
+ padding: 0 11px;
769
+ height: calc(var(--control-h) - 2px);
770
+ border-radius: var(--r-s);
771
+ border: 1px solid var(--line);
772
+ background: var(--surface);
773
+ color: var(--faint);
774
+ font-size: 12.5px;
775
+ }
776
+ .top__search:hover { border-color: var(--line-strong); color: var(--muted); }
777
+ .top__search kbd {
778
+ margin-inline-start: auto;
779
+ font-family: var(--font-mono); font-size: 10px;
780
+ border: 1px solid var(--line); border-radius: 5px;
781
+ padding: 1px 5px; color: var(--faint); background: var(--surface-2);
782
+ }
783
+ .top__end { display: flex; align-items: center; gap: 6px; }
784
+ .top__divider { width: 1px; height: 22px; background: var(--line-strong); margin: 0 6px; }
785
+
786
+ .account { position: relative; }
787
+ .account > button {
788
+ display: flex; align-items: center; gap: 9px;
789
+ height: var(--control-h);
790
+ padding: 0 10px 0 6px;
791
+ border-radius: 999px;
792
+ border: 1px solid transparent;
793
+ }
794
+ .account > button:hover { background: var(--surface); border-color: var(--line); box-shadow: var(--shadow-s); }
795
+ .account b { font-size: 12.5px; font-weight: 600; }
796
+ .account > button > svg { color: var(--faint); }
797
+ .menu {
798
+ position: absolute; top: calc(100% + 8px); right: 0;
799
+ min-width: 210px;
800
+ background: var(--surface);
801
+ border: 1px solid var(--line);
802
+ border-radius: var(--r-m);
803
+ box-shadow: var(--shadow-m);
804
+ padding: 6px;
805
+ display: none;
806
+ z-index: 40;
807
+ }
808
+ .account.open .menu { display: block; }
809
+ .menu__head { padding: 8px 10px 10px; border-bottom: 1px solid var(--line); margin-bottom: 6px; }
810
+ .menu__head b { font-size: 13px; display: block; }
811
+ .menu__head span { font-size: 11.5px; color: var(--faint); }
812
+ .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); }
813
+ .menu button:hover { background: var(--surface-2); color: var(--ink); }
814
+ .menu button.danger { color: var(--danger); }
815
+
816
+ /* main — the one big rounded card */
817
+ .main {
818
+ grid-column: 2;
819
+ overflow-y: auto;
820
+ margin: 0 14px 14px 6px;
821
+ background: var(--surface);
822
+ border: 1px solid var(--line);
823
+ border-radius: var(--r-xl);
824
+ box-shadow: var(--shadow-s);
825
+ }
826
+ .main__in { max-width: 1160px; margin: 0 auto; padding: calc(var(--pad-card) + 12px) calc(var(--pad-card) + 12px) 48px; }
827
+
828
+ .page-head { display: flex; align-items: flex-end; gap: 18px; flex-wrap: wrap; }
829
+ .page-head h1 { font-size: 22px; font-weight: 650; letter-spacing: -0.02em; }
830
+ .page-head .sub { color: var(--muted); font-size: 13.5px; margin-top: 5px; }
831
+ .page-head__end { margin-inline-start: auto; display: flex; align-items: center; gap: 10px; }
832
+
833
+ /* stat tiles — ONE card, hairline dividers (Manus) */
834
+ .tiles {
835
+ display: grid;
836
+ grid-template-columns: repeat(4, 1fr);
837
+ margin-top: 26px;
838
+ overflow: hidden;
839
+ }
840
+ .tile { padding: calc(var(--pad-card) - 3px) var(--pad-card); display: flex; flex-direction: column; gap: 4px; border-inline-start: 1px solid var(--line); }
841
+ .tile:first-child { border-inline-start: 0; }
842
+ .tile__label { font-size: 11px; color: var(--muted); font-weight: 620; letter-spacing: 0.07em; text-transform: uppercase; display: flex; align-items: center; gap: 8px; }
843
+ .tile__row { display: flex; align-items: baseline; gap: 10px; }
844
+ .tile__num { font-family: var(--font-display); font-size: 24px; font-weight: 650; letter-spacing: -0.02em; }
845
+ .delta { font-size: 11.5px; font-weight: 650; padding: 2px 7px; border-radius: 999px; }
846
+ .delta--up { color: var(--ok); background: var(--ok-subtle); }
847
+ .delta--down { color: var(--danger); background: var(--danger-subtle); }
848
+ .delta--flat { color: var(--muted); background: var(--surface-2); }
849
+ .tile svg.spark { margin-top: 8px; width: 100%; height: 34px; }
850
+
851
+ /* grid: chart + side column */
852
+ .grid-2 { display: grid; grid-template-columns: minmax(0, 1fr) 320px; gap: 14px; margin-top: 14px; }
853
+ .panel { padding: var(--pad-card); }
854
+ .panel__head { display: flex; align-items: center; gap: 12px; margin-bottom: 14px; }
855
+ .panel__head h3 { font-size: 14px; font-weight: 650; letter-spacing: -0.01em; font-family: var(--font-display); }
856
+ .panel__head .end { margin-inline-start: auto; display: flex; align-items: center; gap: 10px; }
857
+ .legend { display: flex; gap: 14px; font-size: 12px; color: var(--muted); }
858
+ .legend i { display: inline-block; width: 14px; height: 3px; border-radius: 2px; background: var(--accent); vertical-align: middle; margin-inline-end: 6px; }
859
+ .legend .prev i { background: var(--chart-2); height: 0; border-top: 2.5px dashed var(--chart-2); }
860
+
861
+ .chart-wrap { position: relative; }
862
+ .panel--chart { display: flex; flex-direction: column; }
863
+ .toppages { margin-top: auto; border-top: 1px solid var(--line); padding-top: 12px; }
864
+ .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; }
865
+ .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); }
866
+ .tp-row i { display: block; position: relative; height: 6px; border-radius: 999px; background: var(--surface-2); border: 1px solid var(--line); overflow: hidden; }
867
+ .tp-row i::after { content: ""; position: absolute; inset: 0; width: var(--w); background: var(--accent); border-radius: 999px; opacity: 0.85; }
868
+ .tp-row b { color: var(--ink); font-weight: 620; }
869
+
870
+ .chart-tip {
871
+ position: absolute;
872
+ pointer-events: none;
873
+ background: var(--surface);
874
+ border: 1px solid var(--line-strong);
875
+ border-radius: var(--r-s);
876
+ box-shadow: var(--shadow-m);
877
+ padding: 8px 11px;
878
+ font-size: 11.5px;
879
+ display: none;
880
+ min-width: 122px;
881
+ z-index: 5;
882
+ }
883
+ .chart-tip b { display: block; font-size: 11px; color: var(--faint); font-weight: 600; margin-bottom: 4px; }
884
+ .chart-tip .row { display: flex; align-items: center; gap: 7px; color: var(--muted); }
885
+ .chart-tip .row i { width: 8px; height: 8px; border-radius: 3px; }
886
+ .chart-tip .row .v { margin-inline-start: auto; font-weight: 650; color: var(--ink); font-variant-numeric: tabular-nums; }
887
+
888
+ .side-col { display: flex; flex-direction: column; gap: 14px; }
889
+ .meter { display: flex; flex-direction: column; gap: 6px; margin-top: 12px; }
890
+ .meter__row { display: flex; justify-content: space-between; font-size: 12.5px; color: var(--muted); font-weight: 540; }
891
+ .meter__row b { color: var(--ink); font-weight: 620; }
892
+ .meter__bar { height: 6px; border-radius: 999px; background: var(--surface-2); border: 1px solid var(--line); overflow: hidden; }
893
+ .meter__bar i { display: block; height: 100%; border-radius: 999px; background: var(--accent); }
894
+ .meter__bar i.warnfill { background: var(--warn); }
895
+
896
+ .check-list { display: flex; flex-direction: column; gap: 4px; margin-top: 8px; }
897
+ .check {
898
+ display: flex; align-items: center; gap: 10px;
899
+ padding: 7px 8px; border-radius: var(--r-s);
900
+ font-size: 13px; color: var(--muted); font-weight: 540;
901
+ }
902
+ .check:hover { background: var(--surface-2); }
903
+ .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; }
904
+ .check.done { color: var(--faint); text-decoration: line-through; }
905
+ .check.done .box { background: var(--ok); border-color: var(--ok); color: #fff; }
906
+ .check .go { margin-inline-start: auto; color: var(--accent); font-size: 11.5px; font-weight: 640; text-decoration: none; }
907
+
908
+ .feed { display: flex; flex-direction: column; margin-top: 6px; }
909
+ .feed__item { display: flex; gap: 11px; padding: 9px 2px; align-items: flex-start; border-bottom: 1px solid var(--line); }
910
+ .feed__item:last-child { border-bottom: 0; }
911
+ .feed__dot { width: 8px; height: 8px; border-radius: 50%; margin-top: 5px; flex: none; }
912
+ .feed__item p { font-size: 12.5px; color: var(--muted); line-height: 1.45; }
913
+ .feed__item p b { color: var(--ink); font-weight: 600; }
914
+ .feed__item time { display: block; font-size: 11px; color: var(--faint); margin-top: 1px; }
915
+
916
+ /* promo banner — plain card now */
917
+ .promo {
918
+ margin-top: 14px;
919
+ display: flex; align-items: center; gap: 16px;
920
+ padding: 16px var(--pad-card);
921
+ border-radius: var(--r-l);
922
+ background: var(--surface);
923
+ border: 1px solid var(--line-strong);
924
+ box-shadow: var(--shadow-s);
925
+ flex-wrap: wrap;
926
+ }
927
+ .promo b { font-size: 13.5px; font-weight: 650; display: block; letter-spacing: -0.01em; }
928
+ .promo p { font-size: 12.5px; color: var(--muted); }
929
+ .promo .brand-dots { margin: 0 0 0 auto; padding: 0; }
930
+
931
+ /* table */
932
+ .tablecard { margin-top: 14px; overflow: hidden; }
933
+ .tablewrap { overflow-x: auto; }
934
+ table { width: 100%; border-collapse: collapse; font-size: 13px; }
935
+ th {
936
+ text-align: left; font-size: 11px; letter-spacing: 0.07em; text-transform: uppercase;
937
+ color: var(--faint); font-weight: 640; padding: var(--cell-pad);
938
+ border-bottom: 1px solid var(--line);
939
+ white-space: nowrap;
940
+ }
941
+ td { padding: var(--cell-pad); border-bottom: 1px solid var(--line); color: var(--muted); white-space: nowrap; }
942
+ tbody tr:hover td { background: color-mix(in srgb, var(--ink) 2.5%, transparent); }
943
+ tbody tr:last-child td { border-bottom: 0; }
944
+ td .proj { display: flex; align-items: center; gap: 10px; color: var(--ink); font-weight: 600; }
945
+ td .pdot { width: 18px; height: 18px; border-radius: 6px; flex: none; opacity: 0.92; }
946
+ .tfoot { display: flex; align-items: center; gap: 10px; padding: 10px 16px; color: var(--faint); font-size: 12px; }
947
+ .tfoot .pages { margin-inline-start: auto; display: flex; gap: 4px; }
948
+
949
+ /* mobile drawer */
950
+ .scrim { display: none; position: fixed; inset: 0; z-index: 45; background: rgb(0 0 0 / 45%); border: 0; }
951
+ .top__drawer { display: none; }
952
+
953
+ @media (max-width: 1200px) {
954
+ .shell { grid-template-columns: minmax(0, 1fr); }
955
+ .top, .main { grid-column: 1; }
956
+ .side {
957
+ position: fixed; inset-block: 0; inset-inline-start: 0; z-index: 50;
958
+ transform: translateX(-105%);
959
+ background: var(--ground);
960
+ box-shadow: var(--shadow-l);
961
+ width: var(--shell-side) !important;
962
+ }
963
+ .shell[data-open="true"] .side { transform: none; }
964
+ .shell[data-open="true"] .scrim { display: block; }
965
+ .top__drawer { display: inline-flex; }
966
+ .top__collapse { display: none; }
967
+ .grid-2 { grid-template-columns: 1fr; }
968
+ .tiles { grid-template-columns: repeat(2, 1fr); }
969
+ .tile:nth-child(odd) { border-inline-start: 0; }
970
+ .tile:nth-child(n+3) { border-top: 1px solid var(--line); }
971
+ }
972
+
973
+ @media (max-width: 900px) {
974
+ .bento { grid-template-columns: repeat(2, 1fr); }
975
+ .b-2x2, .b-2x1 { grid-column: span 2; }
976
+ .band__grid { grid-template-columns: repeat(2, 1fr); }
977
+ .pricing { grid-template-columns: 1fr; }
978
+ .footer__grid { grid-template-columns: 1fr 1fr; }
979
+ .nav__links { display: none; }
980
+ .frame__body { grid-template-columns: 1fr; }
981
+ .frame__side { display: none; }
982
+ }
983
+ @media (max-width: 760px) {
984
+ .top__search { display: none; }
985
+ }
986
+ @media (max-width: 640px) {
987
+ .tiles { grid-template-columns: 1fr; }
988
+ .tile { border-inline-start: 0; }
989
+ .tile:nth-child(n+2) { border-top: 1px solid var(--line); }
990
+ .bento { grid-template-columns: 1fr; }
991
+ .b-2x2, .b-2x1 { grid-column: span 1; }
992
+ }
993
+
994
+ /* ─── Draft dock (meta chrome — always dark glass) ───────────────────────── */
995
+
996
+ .dock {
997
+ position: fixed;
998
+ bottom: 18px; left: 50%;
999
+ transform: translateX(-50%);
1000
+ z-index: 100;
1001
+ display: flex; align-items: center; gap: 5px;
1002
+ padding: 7px 10px;
1003
+ border-radius: 999px;
1004
+ background: rgb(17 17 18 / 90%);
1005
+ -webkit-backdrop-filter: blur(14px);
1006
+ backdrop-filter: blur(14px);
1007
+ border: 1px solid rgb(255 255 255 / 12%);
1008
+ box-shadow: 0 18px 50px -12px rgb(0 0 0 / 55%);
1009
+ color: #d0d0ce;
1010
+ font-size: 12px;
1011
+ flex-wrap: wrap;
1012
+ justify-content: center;
1013
+ max-width: calc(100vw - 24px);
1014
+ }
1015
+ .dock__tag { font-size: 9.5px; letter-spacing: 0.12em; font-weight: 700; color: #7f7f80; padding: 0 6px 0 4px; text-transform: uppercase; }
1016
+ .dock__sep { width: 1px; height: 18px; background: rgb(255 255 255 / 14%); margin: 0 3px; }
1017
+ .dock button { border-radius: 999px; }
1018
+ .dock .dseg { display: flex; background: rgb(255 255 255 / 7%); border-radius: 999px; padding: 2px; }
1019
+ .dock .dseg button { padding: 4px 12px; font-weight: 620; font-size: 12px; color: #9f9fa0; }
1020
+ .dock .dseg button[aria-pressed="true"] { background: #f1f1ef; color: #111112; }
1021
+ .dock .dicon { width: 28px; height: 28px; display: inline-flex; align-items: center; justify-content: center; color: #9f9fa0; }
1022
+ .dock .dicon:hover { color: #f1f1ef; background: rgb(255 255 255 / 8%); }
1023
+ .dock .dicon[aria-pressed="true"] { color: #f1f1ef; background: rgb(255 255 255 / 14%); }
1024
+ .dock .bdot { border-color: transparent; box-shadow: 0 0 0 1px rgb(255 255 255 / 25%); width: 20px; height: 20px; }
1025
+ .dock .bdot[aria-pressed="true"] { box-shadow: 0 0 0 2px #f1f1ef; }
1026
+ .dock .tbtn { padding: 3px 9px; font-weight: 640; font-size: 11.5px; color: #9f9fa0; }
1027
+ .dock .tbtn[aria-pressed="true"] { background: rgb(255 255 255 / 14%); color: #f1f1ef; }
1028
+ .dock .tbtn.t-serif { font-family: "New York", ui-serif, Georgia, serif; }
1029
+ .dock .tbtn.t-mono { font-family: var(--font-mono); }
1030
+
1031
+ /* ─── Motion safety ──────────────────────────────────────────────────────── */
1032
+
1033
+ @media (prefers-reduced-motion: reduce) {
1034
+ html { scroll-behavior: auto; }
1035
+ .marquee__track, .term::after, .pill-status--warn i, .frame-float { animation: none !important; }
1036
+ .rise { animation-duration: 0.01ms; }
1037
+ .rv { opacity: 1; transform: none; }
1038
+ .frame { transform: none; transition: none; }
1039
+ * { transition-duration: 0.01ms !important; }
1040
+ }
1041
+ </style>
1042
+
1043
+ <!-- ═══════════════════════ SVG symbol defs ═══════════════════════ -->
1044
+ <svg width="0" height="0" style="position:absolute" aria-hidden="true">
1045
+ <defs>
1046
+ <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>
1047
+ <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>
1048
+ <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>
1049
+ <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>
1050
+ <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>
1051
+ <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>
1052
+ <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>
1053
+ <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>
1054
+ <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>
1055
+ <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>
1056
+ <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>
1057
+ <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>
1058
+ <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>
1059
+ <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>
1060
+ <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>
1061
+ <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>
1062
+ <symbol id="i-plus" viewBox="0 0 16 16"><path d="M8 3v10M3 8h10" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/></symbol>
1063
+ <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>
1064
+ <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>
1065
+ <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>
1066
+ <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>
1067
+ <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>
1068
+ <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>
1069
+ <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>
1070
+ <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>
1071
+ <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>
1072
+ <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>
1073
+ <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>
1074
+ <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>
1075
+ </defs>
1076
+ </svg>
1077
+
1078
+ <!-- ═══════════════════════════════ SITE ═══════════════════════════════ -->
1079
+ <div class="view view--site site" id="view-site">
1080
+
1081
+ <header class="nav" id="site-nav">
1082
+ <div class="nav__in">
1083
+ <span class="lockup"><span class="mark">Ω</span><span class="word">Playground</span></span>
1084
+ <nav class="nav__links" aria-label="Site">
1085
+ <a href="#bento">Product</a>
1086
+ <a href="#pricing">Pricing</a>
1087
+ <a href="#">Docs</a>
1088
+ <a href="#">Changelog</a>
1089
+ </nav>
1090
+ <div class="nav__cta">
1091
+ <button class="btn btn--quiet">Sign in</button>
1092
+ <button class="btn btn--ink">Get started</button>
1093
+ </div>
1094
+ </div>
1095
+ </header>
1096
+
1097
+ <section class="hero">
1098
+ <div class="hero__bg">
1099
+ <div class="hero__dots"></div>
1100
+ </div>
1101
+ <div class="hero__in">
1102
+ <span class="hero__badge rise"><i></i><b>OMEGA 1.0</b> is here — one framework, every surface</span>
1103
+ <h1 class="rise rise-2">One config.<span class="rot-line"><span class="rot" id="rot-word">Every surface.</span></span></h1>
1104
+ <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>
1105
+ <div class="hero__cta rise rise-4">
1106
+ <button class="btn btn--ink btn--lg">Start building free</button>
1107
+ <button class="btn btn--ghost btn--lg hero__cmd mono">npx omega setup <svg width="14" height="14"><use href="#i-arrow"/></svg></button>
1108
+ </div>
1109
+
1110
+ <div class="frame-wrap rise rise-5">
1111
+ <div class="frame-float">
1112
+ <div class="frame">
1113
+ <div class="frame__bar">
1114
+ <i></i><i></i><i></i>
1115
+ <span class="frame__url"><svg width="11" height="11"><use href="#i-globe"/></svg> app.playground.omegajs.dev</span>
1116
+ </div>
1117
+ <div class="frame__body">
1118
+ <div class="frame__side">
1119
+ <span class="lockup"><span class="mark">Ω</span> Playground</span>
1120
+ <span class="fnav on"><svg width="13" height="13"><use href="#i-home"/></svg> Overview</span>
1121
+ <span class="fnav"><svg width="13" height="13"><use href="#i-folder"/></svg> Projects</span>
1122
+ <span class="fnav"><svg width="13" height="13"><use href="#i-chart"/></svg> Analytics</span>
1123
+ <span class="fnav"><svg width="13" height="13"><use href="#i-users"/></svg> Members</span>
1124
+ <span class="fnav"><svg width="13" height="13"><use href="#i-gear"/></svg> Settings</span>
1125
+ </div>
1126
+ <div class="frame__main">
1127
+ <div class="frame__tiles">
1128
+ <div class="ftile"><span>Revenue</span><b class="num">$12,480</b><span class="up">↑ 8.2%</span></div>
1129
+ <div class="ftile"><span>Active users</span><b class="num">3,204</b><span class="up">↑ 4.1%</span></div>
1130
+ <div class="ftile"><span>Uptime</span><b class="num">99.98%</b><span class="up">30 days</span></div>
1131
+ </div>
1132
+ <div class="fchart">
1133
+ <span>Traffic</span>
1134
+ <svg id="frame-chart" viewBox="0 0 560 150" width="100%" height="150" role="img" aria-label="Decorative traffic chart"></svg>
1135
+ </div>
1136
+ </div>
1137
+ </div>
1138
+ </div>
1139
+ </div>
1140
+ </div>
1141
+ </div>
1142
+ </section>
1143
+
1144
+ <section class="logos">
1145
+ <p>Powering every ITW Creative Works brand</p>
1146
+ <div class="marquee" aria-hidden="true">
1147
+ <div class="marquee__track" id="marquee-track">
1148
+ <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>
1149
+ </div>
1150
+ </div>
1151
+ </section>
1152
+
1153
+ <section class="section" id="bento">
1154
+ <div class="section__in">
1155
+ <span class="section__eyebrow rv">Why OMEGA</span>
1156
+ <h2 class="rv">Every target. Zero drift.</h2>
1157
+ <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>
1158
+
1159
+ <div class="bento">
1160
+ <div class="card b-2x2 rv">
1161
+ <span class="icotile"><svg width="16" height="16"><use href="#i-globe"/></svg></span>
1162
+ <h3>One config, every target</h3>
1163
+ <p>Declare your brand once. Web, backend, desktop, and extension builds all derive from it — colors, icons, auth, analytics, payments.</p>
1164
+ <div class="targets">
1165
+ <span class="chip"><svg width="11" height="11"><use href="#i-globe"/></svg> web</span>
1166
+ <span class="chip"><svg width="11" height="11"><use href="#i-server"/></svg> backend</span>
1167
+ <span class="chip"><svg width="11" height="11"><use href="#i-desktop"/></svg> desktop</span>
1168
+ <span class="chip"><svg width="11" height="11"><use href="#i-puzzle"/></svg> extension</span>
1169
+ </div>
1170
+ <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>
1171
+ </div>
1172
+
1173
+ <div class="card rv">
1174
+ <span class="icotile"><svg width="16" height="16"><use href="#i-spark"/></svg></span>
1175
+ <h3>Your brand is a token</h3>
1176
+ <p>One hex in config restyles every accent. Try it —</p>
1177
+ <div class="brand-dots" data-brand-dots></div>
1178
+ </div>
1179
+
1180
+ <div class="card rv">
1181
+ <span class="icotile"><svg width="16" height="16"><use href="#i-moon"/></svg></span>
1182
+ <h3>Dark mode, day one</h3>
1183
+ <p>Both themes are defined at the token level. No retrofits.</p>
1184
+ <div class="split"><div class="lite">Light<i></i></div><div class="dark">Dark<i></i></div></div>
1185
+ </div>
1186
+
1187
+ <div class="card b-2x1 rv">
1188
+ <span class="icotile"><svg width="16" height="16"><use href="#i-bolt"/></svg></span>
1189
+ <h3>Deploys that mean it</h3>
1190
+ <p>Nothing publishes on commit. When you're ready, one verb ships every surface.</p>
1191
+ <div class="term"><span class="p">$</span> omega deploy&nbsp;&nbsp;<span class="okx">✓ web · backend · desktop · extension</span></div>
1192
+ </div>
1193
+
1194
+ <div class="card rv">
1195
+ <span class="icotile"><svg width="16" height="16"><use href="#i-key"/></svg></span>
1196
+ <h3>Auth → payments, wired</h3>
1197
+ <p>The unglamorous stuff is the default.</p>
1198
+ <div class="mini-rows">
1199
+ <div><svg width="13" height="13"><use href="#i-check"/></svg> Sign-in, OAuth &amp; accounts</div>
1200
+ <div><svg width="13" height="13"><use href="#i-check"/></svg> Checkout &amp; billing portal</div>
1201
+ <div><svg width="13" height="13"><use href="#i-check"/></svg> Usage limits &amp; plans</div>
1202
+ </div>
1203
+ </div>
1204
+
1205
+ <div class="card rv">
1206
+ <span class="icotile"><svg width="16" height="16"><use href="#i-gauge"/></svg></span>
1207
+ <h3>Fast by default</h3>
1208
+ <p>Minified HTML, hashed assets, image matrix, CSS hot-swap in under a second.</p>
1209
+ <div class="mini-rows">
1210
+ <div><svg width="13" height="13"><use href="#i-check"/></svg> <span class="mono num">&lt;1s</span>&nbsp;style reloads in dev</div>
1211
+ <div><svg width="13" height="13"><use href="#i-check"/></svg> Purged, hashed production CSS</div>
1212
+ </div>
1213
+ </div>
1214
+ </div>
1215
+ </div>
1216
+ </section>
1217
+
1218
+ <section class="band section">
1219
+ <div class="section__in">
1220
+ <div class="band__grid">
1221
+ <div class="band__cell rv"><b class="num" data-count="45">0</b><span>layouts skinned</span></div>
1222
+ <div class="band__cell rv"><b class="num" data-count="4">0</b><span>surface families</span></div>
1223
+ <div class="band__cell rv"><b class="num" data-count="1">0</b><span>token sheet</span></div>
1224
+ <div class="band__cell rv"><b class="num">&lt;1s</b><span>css hot-swap</span></div>
1225
+ </div>
1226
+ </div>
1227
+ </section>
1228
+
1229
+ <section class="section" id="pricing">
1230
+ <div class="section__in">
1231
+ <span class="section__eyebrow rv">Pricing</span>
1232
+ <h2 class="rv">Start free. Scale when it's real.</h2>
1233
+ <div class="pricing">
1234
+ <div class="card price rv">
1235
+ <div class="price__head"><span class="price__name">Hobby</span></div>
1236
+ <div class="price__amt num">$0<span> /mo</span></div>
1237
+ <ul>
1238
+ <li><svg width="13" height="13"><use href="#i-check"/></svg> 1 project, all targets</li>
1239
+ <li><svg width="13" height="13"><use href="#i-check"/></svg> Community themes</li>
1240
+ <li><svg width="13" height="13"><use href="#i-check"/></svg> Deploy to your own infra</li>
1241
+ </ul>
1242
+ <button class="btn btn--ghost">Start free</button>
1243
+ </div>
1244
+ <div class="card price price--pop rv">
1245
+ <div class="price__head"><span class="price__name">Pro</span><span class="chip chip--ink">Most popular</span></div>
1246
+ <div class="price__amt num">$19<span> /mo</span></div>
1247
+ <ul>
1248
+ <li><svg width="13" height="13"><use href="#i-check"/></svg> Unlimited projects</li>
1249
+ <li><svg width="13" height="13"><use href="#i-check"/></svg> classy v2 + premium themes</li>
1250
+ <li><svg width="13" height="13"><use href="#i-check"/></svg> Payments &amp; usage plans</li>
1251
+ <li><svg width="13" height="13"><use href="#i-check"/></svg> Remove the sidebar ad slot</li>
1252
+ </ul>
1253
+ <button class="btn btn--ink">Go Pro</button>
1254
+ </div>
1255
+ <div class="card price rv">
1256
+ <div class="price__head"><span class="price__name">Scale</span></div>
1257
+ <div class="price__amt num">$99<span> /mo</span></div>
1258
+ <ul>
1259
+ <li><svg width="13" height="13"><use href="#i-check"/></svg> Everything in Pro</li>
1260
+ <li><svg width="13" height="13"><use href="#i-check"/></svg> Multi-brand workspaces</li>
1261
+ <li><svg width="13" height="13"><use href="#i-check"/></svg> Priority support</li>
1262
+ </ul>
1263
+ <button class="btn btn--ghost">Talk to us</button>
1264
+ </div>
1265
+ </div>
1266
+ </div>
1267
+ </section>
1268
+
1269
+ <section class="section">
1270
+ <figure class="quote rv">
1271
+ <blockquote>“We rebuilt five products on OMEGA <em>without touching a stylesheet.</em>”</blockquote>
1272
+ <figcaption><span class="avatar">IW</span> Ian Wiedenman — ITW Creative Works</figcaption>
1273
+ </figure>
1274
+ </section>
1275
+
1276
+ <section class="section" style="padding-top: 0;">
1277
+ <div class="section__in">
1278
+ <div class="cta-band rv">
1279
+ <h2>Ready to ship every surface?</h2>
1280
+ <p>From <span class="mono">omega setup</span> to a live product — site, app, backend, desktop, extension.</p>
1281
+ <div class="hero__cta">
1282
+ <button class="btn btn--paper btn--lg">Start building free</button>
1283
+ <button class="btn btn--lg ghosty">Read the docs <svg width="14" height="14"><use href="#i-arrow"/></svg></button>
1284
+ </div>
1285
+ </div>
1286
+ </div>
1287
+ </section>
1288
+
1289
+ <footer class="footer">
1290
+ <div class="footer__in">
1291
+ <div class="footer__grid">
1292
+ <div class="footer__brand">
1293
+ <span class="lockup"><span class="mark">Ω</span><span class="word">Playground</span></span>
1294
+ <p>The OMEGA demonstration brand. One config, every surface — built with classy v2.</p>
1295
+ </div>
1296
+ <div><h4>Product</h4><a href="#">Features</a><a href="#">Pricing</a><a href="#">Themes</a><a href="#">Changelog</a></div>
1297
+ <div><h4>Resources</h4><a href="#">Docs</a><a href="#">Guides</a><a href="#">API</a><a href="#">Status</a></div>
1298
+ <div><h4>Company</h4><a href="#">About</a><a href="#">Blog</a><a href="#">Contact</a><a href="#">Legal</a></div>
1299
+ </div>
1300
+ <div class="footer__base">
1301
+ <span class="mark" style="width:22px;height:22px;font-size:12px;border-radius:7px;">Ω</span>
1302
+ <span>© 2026 OMEGA Playground. A test brand, deliberately on fire.</span>
1303
+ </div>
1304
+ </div>
1305
+ </footer>
1306
+ </div>
1307
+
1308
+ <!-- ═══════════════════════════════ APP ═══════════════════════════════ -->
1309
+ <div class="view view--app" id="view-app">
1310
+ <div class="shell" id="shell">
1311
+
1312
+ <aside class="side" id="side">
1313
+ <div class="side__head">
1314
+ <span class="mark">Ω</span>
1315
+ <span class="word">Playground</span>
1316
+ <span class="chip ver mono">v2</span>
1317
+ </div>
1318
+
1319
+ <button class="selector" title="Switch project">
1320
+ <span class="pdot"></span>
1321
+ <span class="meta"><b>somiibo</b><span>Production</span></span>
1322
+ <svg width="13" height="13"><use href="#i-chev-ud"/></svg>
1323
+ </button>
1324
+
1325
+ <button class="nav-item" aria-current="page"><svg width="15" height="15"><use href="#i-home"/></svg><span class="lbl">Overview</span></button>
1326
+ <button class="nav-item"><svg width="15" height="15"><use href="#i-pulse"/></svg><span class="lbl">Activity</span></button>
1327
+
1328
+ <div class="side__label">Workspace</div>
1329
+ <button class="nav-item" data-expand="grp-projects" aria-expanded="true">
1330
+ <svg width="15" height="15"><use href="#i-folder"/></svg><span class="lbl">Projects</span>
1331
+ <span class="chev"><svg width="13" height="13"><use href="#i-chev-d"/></svg></span>
1332
+ </button>
1333
+ <div class="nav-sub open" id="grp-projects">
1334
+ <div class="nav-sub__in">
1335
+ <button class="nav-item"><span class="lbl">somiibo</span><span class="tail chip mono">prod</span></button>
1336
+ <button class="nav-item"><span class="lbl">studymonkey</span></button>
1337
+ <button class="nav-item"><span class="lbl">slapform</span></button>
1338
+ <button class="nav-item" style="color:var(--faint);"><svg width="13" height="13"><use href="#i-plus"/></svg><span class="lbl">New project</span></button>
1339
+ </div>
1340
+ </div>
1341
+ <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>
1342
+ <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>
1343
+ <button class="nav-item"><svg width="15" height="15"><use href="#i-key"/></svg><span class="lbl">API keys</span></button>
1344
+
1345
+ <div class="side__label">Insights</div>
1346
+ <button class="nav-item" data-expand="grp-analytics" aria-expanded="false">
1347
+ <svg width="15" height="15"><use href="#i-chart"/></svg><span class="lbl">Analytics</span>
1348
+ <span class="chev"><svg width="13" height="13"><use href="#i-chev-d"/></svg></span>
1349
+ </button>
1350
+ <div class="nav-sub" id="grp-analytics">
1351
+ <div class="nav-sub__in">
1352
+ <button class="nav-item"><span class="lbl">Traffic</span></button>
1353
+ <button class="nav-item"><span class="lbl">Engagement</span></button>
1354
+ <button class="nav-item"><span class="lbl">Retention</span></button>
1355
+ </div>
1356
+ </div>
1357
+ <button class="nav-item"><svg width="15" height="15"><use href="#i-gauge"/></svg><span class="lbl">Usage</span></button>
1358
+
1359
+ <div class="side__label">Settings</div>
1360
+ <button class="nav-item"><svg width="15" height="15"><use href="#i-gear"/></svg><span class="lbl">General</span></button>
1361
+ <button class="nav-item"><svg width="15" height="15"><use href="#i-card"/></svg><span class="lbl">Billing</span></button>
1362
+
1363
+ <div class="side__foot">
1364
+ <div class="ad" id="ad-slot">
1365
+ <button class="ad__x" id="ad-dismiss" aria-label="Dismiss ad"><svg width="11" height="11"><use href="#i-x"/></svg></button>
1366
+ <span class="ad__tag">Sponsored</span>
1367
+ <b>Ship faster with DevKit Pro</b>
1368
+ <p>The toolkit your deploys deserve.</p>
1369
+ <a href="#">Learn more → <span style="color:var(--faint);font-weight:400;">· Pro removes ads</span></a>
1370
+ </div>
1371
+ <button class="user-row">
1372
+ <span class="avatar">IW</span>
1373
+ <span class="meta"><b>Ian W.</b><span>ian@itwcreativeworks.com</span></span>
1374
+ <svg width="14" height="14"><use href="#i-dots"/></svg>
1375
+ </button>
1376
+ </div>
1377
+ </aside>
1378
+
1379
+ <header class="top">
1380
+ <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>
1381
+ <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>
1382
+ <div class="crumb"><span style="color:var(--faint);font-weight:520;">somiibo</span><span class="sep">/</span><span>Overview</span></div>
1383
+ <span class="pill-status pill-status--ok" style="margin-inline-start:6px;"><i></i>Production</span>
1384
+
1385
+ <button class="top__search">
1386
+ <svg width="13" height="13"><use href="#i-search"/></svg>
1387
+ <span>Search…</span>
1388
+ <kbd>⌘K</kbd>
1389
+ </button>
1390
+
1391
+ <div class="top__end">
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--ink"><svg width="13" height="13"><use href="#i-plus"/></svg> New project</button>
1426
+ </div>
1427
+ </div>
1428
+
1429
+ <div class="card tiles">
1430
+ <div class="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="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="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="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" style="background:#6366f1"></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" style="background:#6366f1"></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:#f59e0b"></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:#10b981"></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:#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 2</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="default" aria-pressed="true" title="Serif marketing · sans app (default)">Mix</button>
1609
+ <button class="tbtn" data-type-btn="sans" aria-pressed="false" title="Sans everywhere">Sans</button>
1610
+ <button class="tbtn t-serif" data-type-btn="editorial" aria-pressed="false" title="Serif display everywhere">Serif</button>
1611
+ <button class="tbtn t-mono" data-type-btn="terminal" aria-pressed="false" title="Mono display everywhere">Mono</button>
1612
+ <span class="dock__sep"></span>
1613
+ <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>
1614
+ </div>
1615
+
1616
+ <script>
1617
+ /* classy v2 draft 2 — mockup logic (throwaway comp; the real theme ships its own modules) */
1618
+ (() => {
1619
+ const root = document.documentElement;
1620
+
1621
+ /* ── draft dock: view / theme / brand / type / density ────────────────── */
1622
+
1623
+ const BRANDS = [
1624
+ { id: 'omega', dot: '#5b47fb' },
1625
+ { id: 'ember', dot: '#e8590c' },
1626
+ { id: 'emerald', dot: '#0e9f6e' },
1627
+ { id: 'ocean', dot: '#2563eb' },
1628
+ { id: 'rose', dot: '#e11d63' },
1629
+ ];
1630
+
1631
+ function setBrand(id) {
1632
+ if (id === 'omega') {
1633
+ delete root.dataset.brand;
1634
+ } else {
1635
+ root.dataset.brand = id;
1636
+ }
1637
+ document.querySelectorAll('.bdot').forEach((dot) => {
1638
+ dot.setAttribute('aria-pressed', String(dot.dataset.brand === id));
1639
+ });
1640
+ drawAllCharts();
1641
+ }
1642
+
1643
+ document.querySelectorAll('[data-brand-dots]').forEach((host) => {
1644
+ BRANDS.forEach((brand) => {
1645
+ const btn = document.createElement('button');
1646
+ btn.className = 'bdot';
1647
+ btn.dataset.brand = brand.id;
1648
+ btn.style.background = brand.dot;
1649
+ btn.title = `Brand: ${brand.id}`;
1650
+ btn.setAttribute('aria-label', `Brand accent: ${brand.id}`);
1651
+ btn.setAttribute('aria-pressed', String(brand.id === 'omega'));
1652
+ btn.addEventListener('click', () => setBrand(brand.id));
1653
+ host.appendChild(btn);
1654
+ });
1655
+ });
1656
+
1657
+ const dockSite = document.getElementById('dock-site');
1658
+ const dockApp = document.getElementById('dock-app');
1659
+
1660
+ function setView(view) {
1661
+ root.dataset.view = view;
1662
+ dockSite.setAttribute('aria-pressed', String(view === 'site'));
1663
+ dockApp.setAttribute('aria-pressed', String(view === 'app'));
1664
+ drawAllCharts();
1665
+ }
1666
+ dockSite.addEventListener('click', () => setView('site'));
1667
+ dockApp.addEventListener('click', () => setView('app'));
1668
+
1669
+ const dockLight = document.getElementById('dock-light');
1670
+ const dockDark = document.getElementById('dock-dark');
1671
+
1672
+ function setTheme(theme) {
1673
+ root.dataset.theme = theme;
1674
+ dockLight.setAttribute('aria-pressed', String(theme === 'light'));
1675
+ dockDark.setAttribute('aria-pressed', String(theme === 'dark'));
1676
+ drawAllCharts();
1677
+ }
1678
+ dockLight.addEventListener('click', () => setTheme('light'));
1679
+ dockDark.addEventListener('click', () => setTheme('dark'));
1680
+
1681
+ document.querySelectorAll('[data-type-btn]').forEach((btn) => {
1682
+ btn.addEventListener('click', () => {
1683
+ const type = btn.dataset.typeBtn;
1684
+ if (type === 'default') {
1685
+ delete root.dataset.type;
1686
+ } else {
1687
+ root.dataset.type = type;
1688
+ }
1689
+ document.querySelectorAll('[data-type-btn]').forEach((b) => {
1690
+ b.setAttribute('aria-pressed', String(b === btn));
1691
+ });
1692
+ });
1693
+ });
1694
+
1695
+ const dockDensity = document.getElementById('dock-density');
1696
+ dockDensity.addEventListener('click', () => {
1697
+ const compact = root.dataset.density !== 'compact';
1698
+ if (compact) {
1699
+ root.dataset.density = 'compact';
1700
+ } else {
1701
+ delete root.dataset.density;
1702
+ }
1703
+ dockDensity.setAttribute('aria-pressed', String(compact));
1704
+ });
1705
+
1706
+ /* sync initial theme buttons with the viewer/OS theme */
1707
+ const prefersDark = matchMedia('(prefers-color-scheme: dark)');
1708
+ const startDark = root.dataset.theme
1709
+ ? root.dataset.theme === 'dark'
1710
+ : prefersDark.matches;
1711
+ dockLight.setAttribute('aria-pressed', String(!startDark));
1712
+ dockDark.setAttribute('aria-pressed', String(startDark));
1713
+
1714
+ /* ── site: glassy nav + rotating hero word + reveals + marquee ────────── */
1715
+
1716
+ const nav = document.getElementById('site-nav');
1717
+ const onScroll = () => nav.classList.toggle('scrolled', window.scrollY > 8);
1718
+ addEventListener('scroll', onScroll, { passive: true });
1719
+ onScroll();
1720
+
1721
+ const reduceMotion = matchMedia('(prefers-reduced-motion: reduce)').matches;
1722
+
1723
+ const WORDS = ['Every surface.', 'Your website.', 'Your backend.', 'Your desktop app.', 'Your extension.'];
1724
+ const rotEl = document.getElementById('rot-word');
1725
+ if (!reduceMotion) {
1726
+ let wordIndex = 0;
1727
+ setInterval(() => {
1728
+ rotEl.classList.add('out');
1729
+ setTimeout(() => {
1730
+ wordIndex = (wordIndex + 1) % WORDS.length;
1731
+ rotEl.textContent = WORDS[wordIndex];
1732
+ rotEl.classList.remove('out');
1733
+ }, 260);
1734
+ }, 2600);
1735
+ }
1736
+
1737
+ const track = document.getElementById('marquee-track');
1738
+ track.innerHTML += track.innerHTML; // duplicate for the seamless loop
1739
+
1740
+ const countUp = (el) => {
1741
+ const target = Number(el.dataset.count);
1742
+ if (reduceMotion) { el.textContent = target; return; }
1743
+ const t0 = performance.now();
1744
+ const tick = (t) => {
1745
+ const k = Math.min(1, (t - t0) / 900);
1746
+ el.textContent = Math.round(target * (1 - Math.pow(1 - k, 3)));
1747
+ if (k < 1) requestAnimationFrame(tick);
1748
+ };
1749
+ requestAnimationFrame(tick);
1750
+ };
1751
+
1752
+ const seen = new WeakSet();
1753
+ const observer = new IntersectionObserver((entries) => {
1754
+ entries.forEach((entry) => {
1755
+ if (!entry.isIntersecting) return;
1756
+ entry.target.classList.add('in');
1757
+ entry.target.querySelectorAll('[data-count]').forEach((el) => {
1758
+ if (seen.has(el)) return;
1759
+ seen.add(el);
1760
+ countUp(el);
1761
+ });
1762
+ observer.unobserve(entry.target);
1763
+ });
1764
+ }, { threshold: 0.15 });
1765
+ document.querySelectorAll('.rv').forEach((el) => observer.observe(el));
1766
+
1767
+ /* ── charts (drawn from data so they re-paint on theme/brand swap) ────── */
1768
+
1769
+ const css = (name) => getComputedStyle(root).getPropertyValue(name).trim();
1770
+
1771
+ const CURR = [420, 460, 445, 510, 548, 530, 585, 620, 604, 668, 701, 662, 731, 768];
1772
+ const PREV = [380, 398, 412, 405, 440, 452, 438, 472, 489, 470, 502, 516, 508, 522];
1773
+ const DAYS = ['Jul 1', 'Jul 2', 'Jul 3', 'Jul 4', 'Jul 5', 'Jul 6', 'Jul 7',
1774
+ 'Jul 8', 'Jul 9', 'Jul 10', 'Jul 11', 'Jul 12', 'Jul 13', 'Jul 14'];
1775
+
1776
+ const pts = (data, x0, x1, y0, y1, max) =>
1777
+ data.map((v, i) => [x0 + (i * (x1 - x0)) / (data.length - 1), y1 - (v / max) * (y1 - y0)]);
1778
+
1779
+ const lineD = (p) => 'M' + p.map(([x, y]) => `${x.toFixed(1)},${y.toFixed(1)}`).join(' L');
1780
+
1781
+ function drawBigChart() {
1782
+ const svg = document.getElementById('big-chart');
1783
+ const accent = css('--accent');
1784
+ const second = css('--chart-2');
1785
+ const line = css('--line');
1786
+ const faint = css('--faint');
1787
+ const MAX = 800;
1788
+ const [x0, x1, y0, y1] = [34, 706, 14, 224];
1789
+ const cp = pts(CURR, x0, x1, y0, y1, MAX);
1790
+ const pp = pts(PREV, x0, x1, y0, y1, MAX);
1791
+
1792
+ let grid = '';
1793
+ [0, 200, 400, 600, 800].forEach((v) => {
1794
+ const y = y1 - (v / MAX) * (y1 - y0);
1795
+ grid += `<line x1="${x0}" y1="${y}" x2="${x1}" y2="${y}" stroke="${line}" stroke-width="1"/>` +
1796
+ `<text x="${x0 - 8}" y="${y + 3.5}" text-anchor="end" font-size="10" fill="${faint}">${v}</text>`;
1797
+ });
1798
+ let xlabels = '';
1799
+ [0, 3, 6, 9, 13].forEach((i) => {
1800
+ xlabels += `<text x="${cp[i][0]}" y="248" text-anchor="middle" font-size="10" fill="${faint}">${DAYS[i]}</text>`;
1801
+ });
1802
+
1803
+ const areaD = `${lineD(cp)} L${x1},${y1} L${x0},${y1} Z`;
1804
+ const endC = cp[cp.length - 1];
1805
+ const endP = pp[pp.length - 1];
1806
+
1807
+ svg.innerHTML = `
1808
+ <defs>
1809
+ <linearGradient id="area-fill" x1="0" y1="0" x2="0" y2="1">
1810
+ <stop offset="0%" stop-color="${accent}" stop-opacity="0.18"/>
1811
+ <stop offset="100%" stop-color="${accent}" stop-opacity="0"/>
1812
+ </linearGradient>
1813
+ </defs>
1814
+ ${grid}${xlabels}
1815
+ <path d="${areaD}" fill="url(#area-fill)"/>
1816
+ <path d="${lineD(pp)}" fill="none" stroke="${second}" stroke-width="2" stroke-dasharray="5 5" stroke-linecap="round"/>
1817
+ <path d="${lineD(cp)}" fill="none" stroke="${accent}" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
1818
+ <circle cx="${endC[0]}" cy="${endC[1]}" r="4" fill="${accent}"/>
1819
+ <circle cx="${endC[0]}" cy="${endC[1]}" r="8" fill="${accent}" opacity="0.18"/>
1820
+ <text x="${endC[0] - 10}" y="${endC[1] - 12}" text-anchor="end" font-size="11" font-weight="650" fill="${accent}">768</text>
1821
+ <text x="${endP[0] - 10}" y="${endP[1] + 18}" text-anchor="end" font-size="11" font-weight="600" fill="${second}">522</text>
1822
+ <g id="chart-hover" style="display:none">
1823
+ <line id="hover-line" y1="${y0}" y2="${y1}" stroke="${faint}" stroke-width="1" stroke-dasharray="3 3"/>
1824
+ <circle id="hover-dot-c" r="4" fill="${accent}" stroke="${css('--surface')}" stroke-width="2"/>
1825
+ <circle id="hover-dot-p" r="4" fill="${second}" stroke="${css('--surface')}" stroke-width="2"/>
1826
+ </g>`;
1827
+
1828
+ /* hover layer */
1829
+ const tip = document.getElementById('chart-tip');
1830
+ const hover = svg.querySelector('#chart-hover');
1831
+ const hline = svg.querySelector('#hover-line');
1832
+ const hdc = svg.querySelector('#hover-dot-c');
1833
+ const hdp = svg.querySelector('#hover-dot-p');
1834
+
1835
+ svg.onpointermove = (event) => {
1836
+ const rect = svg.getBoundingClientRect();
1837
+ const sx = ((event.clientX - rect.left) / rect.width) * 720;
1838
+ const i = Math.max(0, Math.min(CURR.length - 1,
1839
+ Math.round(((sx - x0) / (x1 - x0)) * (CURR.length - 1))));
1840
+ const [cx, cy] = cp[i];
1841
+ hover.style.display = '';
1842
+ hline.setAttribute('x1', cx); hline.setAttribute('x2', cx);
1843
+ hdc.setAttribute('cx', cx); hdc.setAttribute('cy', cy);
1844
+ hdp.setAttribute('cx', pp[i][0]); hdp.setAttribute('cy', pp[i][1]);
1845
+ tip.style.display = 'block';
1846
+ tip.innerHTML = `<b>${DAYS[i]}</b>
1847
+ <div class="row"><i style="background:${accent}"></i>This period <span class="v num">${CURR[i]}</span></div>
1848
+ <div class="row"><i style="background:${second}"></i>Previous <span class="v num">${PREV[i]}</span></div>`;
1849
+ const px = (cx / 720) * rect.width;
1850
+ tip.style.left = `${Math.min(rect.width - 140, Math.max(4, px + 14))}px`;
1851
+ tip.style.top = `${(cy / 260) * rect.height - 8}px`;
1852
+ };
1853
+ svg.onpointerleave = () => {
1854
+ hover.style.display = 'none';
1855
+ tip.style.display = 'none';
1856
+ };
1857
+ }
1858
+
1859
+ function drawSparks() {
1860
+ document.querySelectorAll('svg.spark').forEach((svg) => {
1861
+ const data = svg.dataset.spark.split(',').map(Number);
1862
+ const max = Math.max(...data) * 1.15;
1863
+ const p = pts(data, 2, 118, 4, 32, max);
1864
+ const accent = css('--accent');
1865
+ const end = p[p.length - 1];
1866
+ svg.setAttribute('viewBox', '0 0 120 36');
1867
+ svg.innerHTML = `
1868
+ <path d="${lineD(p)} L118,34 L2,34 Z" fill="${accent}" opacity="0.09"/>
1869
+ <path d="${lineD(p)}" fill="none" stroke="${accent}" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>
1870
+ <circle cx="${end[0]}" cy="${end[1]}" r="2.6" fill="${accent}"/>`;
1871
+ });
1872
+ }
1873
+
1874
+ function drawFrameChart() {
1875
+ const svg = document.getElementById('frame-chart');
1876
+ const accent = css('--accent');
1877
+ const second = css('--chart-2');
1878
+ const p1 = pts(CURR, 6, 554, 8, 140, 800);
1879
+ const p2 = pts(PREV, 6, 554, 8, 140, 800);
1880
+ svg.innerHTML = `
1881
+ <path d="${lineD(p1)} L554,146 L6,146 Z" fill="${accent}" opacity="0.1"/>
1882
+ <path d="${lineD(p2)}" fill="none" stroke="${second}" stroke-width="1.6" stroke-dasharray="4 4"/>
1883
+ <path d="${lineD(p1)}" fill="none" stroke="${accent}" stroke-width="2" stroke-linecap="round"/>`;
1884
+ }
1885
+
1886
+ function drawAllCharts() {
1887
+ requestAnimationFrame(() => {
1888
+ drawBigChart();
1889
+ drawSparks();
1890
+ drawFrameChart();
1891
+ });
1892
+ }
1893
+ drawAllCharts();
1894
+ prefersDark.addEventListener('change', drawAllCharts);
1895
+
1896
+ /* ── app shell: nested nav, collapse, drawer, menus, ad dismiss ───────── */
1897
+
1898
+ document.querySelectorAll('[data-expand]').forEach((parent) => {
1899
+ parent.addEventListener('click', () => {
1900
+ const sub = document.getElementById(parent.dataset.expand);
1901
+ const open = parent.getAttribute('aria-expanded') !== 'true';
1902
+ parent.setAttribute('aria-expanded', String(open));
1903
+ sub.classList.toggle('open', open);
1904
+ });
1905
+ });
1906
+
1907
+ const shell = document.getElementById('shell');
1908
+ const collapseBtn = document.getElementById('collapse-btn');
1909
+ collapseBtn.addEventListener('click', () => {
1910
+ const collapsed = shell.dataset.collapsed !== 'true';
1911
+ shell.dataset.collapsed = String(collapsed);
1912
+ collapseBtn.setAttribute('aria-expanded', String(!collapsed));
1913
+ });
1914
+
1915
+ const drawerBtn = document.getElementById('drawer-btn');
1916
+ const scrim = document.getElementById('scrim');
1917
+ const setDrawer = (open) => {
1918
+ shell.dataset.open = String(open);
1919
+ drawerBtn.setAttribute('aria-expanded', String(open));
1920
+ };
1921
+ drawerBtn.addEventListener('click', () => setDrawer(shell.dataset.open !== 'true'));
1922
+ scrim.addEventListener('click', () => setDrawer(false));
1923
+
1924
+ const account = document.getElementById('account');
1925
+ const accountBtn = document.getElementById('account-btn');
1926
+ accountBtn.addEventListener('click', (event) => {
1927
+ event.stopPropagation();
1928
+ const open = !account.classList.contains('open');
1929
+ account.classList.toggle('open', open);
1930
+ accountBtn.setAttribute('aria-expanded', String(open));
1931
+ });
1932
+ addEventListener('click', () => {
1933
+ account.classList.remove('open');
1934
+ accountBtn.setAttribute('aria-expanded', 'false');
1935
+ });
1936
+
1937
+ document.getElementById('ad-dismiss').addEventListener('click', () => {
1938
+ document.getElementById('ad-slot').remove();
1939
+ });
1940
+
1941
+ /* segmented controls + sidebar nav: purely visual state for the draft */
1942
+ document.querySelectorAll('.seg').forEach((seg) => {
1943
+ seg.addEventListener('click', (event) => {
1944
+ const btn = event.target.closest('button');
1945
+ if (!btn) return;
1946
+ seg.querySelectorAll('button').forEach((b) => b.setAttribute('aria-pressed', String(b === btn)));
1947
+ });
1948
+ });
1949
+ document.querySelectorAll('.side .nav-item:not([data-expand])').forEach((item) => {
1950
+ item.addEventListener('click', () => {
1951
+ document.querySelectorAll('.side .nav-item').forEach((n) => n.removeAttribute('aria-current'));
1952
+ item.setAttribute('aria-current', 'page');
1953
+ });
1954
+ });
1955
+ })();
1956
+ </script>