@yewdiel21/motion-kit 0.9.0 → 0.10.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 (399) hide show
  1. package/NOTICE +3 -35
  2. package/README.md +93 -81
  3. package/dist/auto/index.d.ts +22 -3
  4. package/dist/auto/index.js +43 -5
  5. package/dist/auto/index.js.map +1 -1
  6. package/dist/{chunk-KLY5BRRI.js → chunk-34EZ7DF4.js} +1 -1
  7. package/dist/chunk-34EZ7DF4.js.map +1 -0
  8. package/dist/{chunk-RFDIZYFX.js → chunk-DOOMULVV.js} +20 -20
  9. package/dist/chunk-DOOMULVV.js.map +1 -0
  10. package/dist/{chunk-ABNRDDO7.js → chunk-I3DXF2KQ.js} +2 -2
  11. package/dist/{chunk-Q4LVFNLN.js → chunk-IKQ5FODN.js} +4 -4
  12. package/dist/chunk-IKQ5FODN.js.map +1 -0
  13. package/dist/{chunk-2BQGFOA7.js → chunk-J6OCFNGU.js} +2 -2
  14. package/dist/chunk-J6OCFNGU.js.map +1 -0
  15. package/dist/{chunk-6OJAP6ZL.js → chunk-QFBOHPWZ.js} +3 -3
  16. package/dist/chunk-QFBOHPWZ.js.map +1 -0
  17. package/dist/{chunk-J27KH2A2.js → chunk-RVSKEBIC.js} +1 -1
  18. package/dist/chunk-RVSKEBIC.js.map +1 -0
  19. package/dist/{chunk-34XYOXHG.js → chunk-TFNRIZHU.js} +1615 -12
  20. package/dist/chunk-TFNRIZHU.js.map +1 -0
  21. package/dist/{chunk-FS2HJVVY.js → chunk-XAKC2QY7.js} +1204 -5
  22. package/dist/chunk-XAKC2QY7.js.map +1 -0
  23. package/dist/css/components/calendar.css +159 -0
  24. package/dist/css/components/chat-background.css +2 -2
  25. package/dist/css/components/chat.css +1 -1
  26. package/dist/css/components/cursor.css +3 -3
  27. package/dist/css/components/dialog.css +3 -3
  28. package/dist/css/components/hover-card.css +14 -0
  29. package/dist/css/components/input-otp.css +10 -0
  30. package/dist/css/components/island.css +1 -1
  31. package/dist/css/components/menu.css +1 -1
  32. package/dist/css/components/nav.css +1 -5
  33. package/dist/css/components/pagination.css +11 -0
  34. package/dist/css/components/quantity.css +16 -0
  35. package/dist/css/components/slot-picker.css +126 -0
  36. package/dist/css/components/steps.css +2 -2
  37. package/dist/css/components/studio-dock.css +35 -0
  38. package/dist/css/components/theme-picker.css +1 -1
  39. package/dist/css/components/toast.css +1 -1
  40. package/dist/css/components/trailer.css +37 -0
  41. package/dist/css/controls.css +78 -13
  42. package/dist/css/effects.css +8 -8
  43. package/dist/css/fonts.css +1 -1
  44. package/dist/css/themes/black-green.css +1 -1
  45. package/dist/css/themes/black.css +1 -1
  46. package/dist/css/themes/blue.css +1 -1
  47. package/dist/css/themes/brown.css +1 -1
  48. package/dist/css/themes/cold-blue.css +1 -1
  49. package/dist/css/themes/funny.css +1 -1
  50. package/dist/css/themes/gray.css +1 -1
  51. package/dist/css/themes/green.css +1 -1
  52. package/dist/css/themes/modern-1.css +1 -1
  53. package/dist/css/themes/neogreen.css +1 -1
  54. package/dist/css/themes/new.css +1 -1
  55. package/dist/css/themes/new2.css +1 -1
  56. package/dist/css/themes/oled.css +1 -1
  57. package/dist/css/themes/orange.css +1 -1
  58. package/dist/css/themes/pastel-pink.css +1 -1
  59. package/dist/css/themes/pink.css +1 -1
  60. package/dist/css/themes/purple.css +1 -1
  61. package/dist/css/themes/red.css +1 -1
  62. package/dist/css/themes/super-blue.css +1 -1
  63. package/dist/css/themes.css +19 -19
  64. package/dist/css/tokens.css +9 -9
  65. package/dist/elements/index.d.ts +75 -7
  66. package/dist/elements/index.js +172 -6
  67. package/dist/elements/index.js.map +1 -1
  68. package/dist/{engine-CUr9QijM.d.ts → engine-GDGwQnJE.d.ts} +2 -2
  69. package/dist/gl/index.js +3 -3
  70. package/dist/index.css +1076 -63
  71. package/dist/index.d.ts +17 -17
  72. package/dist/index.js +49 -7
  73. package/dist/index.js.map +1 -1
  74. package/dist/react/index.d.ts +139 -40
  75. package/dist/react/index.js +355 -8
  76. package/dist/react/index.js.map +1 -1
  77. package/dist/{reduced-BM4Ls0g5.d.ts → reduced-BmBzKH94.d.ts} +215 -18
  78. package/dist/{reveal-WFUWDrei.d.ts → reveal-jsX-uwUz.d.ts} +233 -24
  79. package/dist/{store-Bqy_obnD.d.ts → store-DYb3tTsZ.d.ts} +5 -5
  80. package/dist/theme/generate.d.ts +1 -1
  81. package/dist/theme/generate.js +2 -2
  82. package/dist/theme/generate.js.map +1 -1
  83. package/dist/theme/index.d.ts +2 -2
  84. package/dist/theme/index.js +2 -2
  85. package/dist/{theme-BFMoCzi6.d.ts → theme-Bjf9qIIy.d.ts} +1 -1
  86. package/package.json +2 -2
  87. package/registry.json +230 -156
  88. package/skills/motion-kit/SKILL.md +209 -189
  89. package/skills/motion-kit/reference/components.md +5 -5
  90. package/skills/motion-kit/reference/design.md +14 -14
  91. package/skills/motion-kit/reference/recipes.md +48 -49
  92. package/src/auto/auto-init.ts +38 -0
  93. package/src/components/calendar/README.md +82 -0
  94. package/src/components/calendar/calendar.css +158 -0
  95. package/src/components/calendar/element.ts +27 -0
  96. package/src/components/calendar/engine.ts +412 -0
  97. package/src/components/calendar/react.tsx +69 -0
  98. package/src/components/chat/README.md +1 -3
  99. package/src/components/chat/chat.css +1 -1
  100. package/src/components/chat/engine.ts +1 -1
  101. package/src/components/chat/react.tsx +1 -1
  102. package/src/components/chat-background/README.md +1 -3
  103. package/src/components/chat-background/audio.ts +1 -1
  104. package/src/components/chat-background/chat-background.css +2 -2
  105. package/src/components/chat-background/engine.ts +1 -1
  106. package/src/components/chat-background/react.tsx +1 -1
  107. package/src/components/cursor/README.md +3 -5
  108. package/src/components/cursor/cursor.css +3 -3
  109. package/src/components/cursor/element.ts +2 -2
  110. package/src/components/cursor/engine.ts +5 -5
  111. package/src/components/cursor/react.tsx +1 -1
  112. package/src/components/dialog/README.md +4 -8
  113. package/src/components/dialog/dialog.css +3 -3
  114. package/src/components/dialog/engine.ts +2 -2
  115. package/src/components/dialog/react.tsx +1 -1
  116. package/src/components/hover-card/README.md +16 -0
  117. package/src/components/hover-card/element.ts +8 -0
  118. package/src/components/hover-card/engine.ts +69 -0
  119. package/src/components/hover-card/hover-card.css +13 -0
  120. package/src/components/hover-card/react.tsx +19 -0
  121. package/src/components/input-otp/README.md +18 -0
  122. package/src/components/input-otp/element.ts +14 -0
  123. package/src/components/input-otp/engine.ts +106 -0
  124. package/src/components/input-otp/input-otp.css +9 -0
  125. package/src/components/input-otp/react.tsx +21 -0
  126. package/src/components/island/README.md +7 -7
  127. package/src/components/island/engine.ts +3 -3
  128. package/src/components/island/island.css +1 -1
  129. package/src/components/island/react.tsx +3 -3
  130. package/src/components/menu/README.md +2 -4
  131. package/src/components/menu/engine.ts +1 -1
  132. package/src/components/menu/menu.css +1 -1
  133. package/src/components/menu/react.tsx +1 -1
  134. package/src/components/nav/README.md +12 -14
  135. package/src/components/nav/engine.ts +5 -5
  136. package/src/components/nav/nav.css +1 -5
  137. package/src/components/nav/react.tsx +3 -3
  138. package/src/components/pagination/README.md +17 -0
  139. package/src/components/pagination/element.ts +14 -0
  140. package/src/components/pagination/engine.ts +102 -0
  141. package/src/components/pagination/pagination.css +10 -0
  142. package/src/components/pagination/react.tsx +22 -0
  143. package/src/components/quantity/README.md +20 -0
  144. package/src/components/quantity/element.ts +14 -0
  145. package/src/components/quantity/engine.ts +85 -0
  146. package/src/components/quantity/quantity.css +15 -0
  147. package/src/components/quantity/react.tsx +21 -0
  148. package/src/components/slot-picker/README.md +68 -0
  149. package/src/components/slot-picker/element.ts +27 -0
  150. package/src/components/slot-picker/engine.ts +412 -0
  151. package/src/components/slot-picker/react.tsx +76 -0
  152. package/src/components/slot-picker/slot-picker.css +125 -0
  153. package/src/components/steps/README.md +1 -3
  154. package/src/components/steps/engine.ts +3 -3
  155. package/src/components/steps/react.tsx +2 -2
  156. package/src/components/steps/steps.css +2 -2
  157. package/src/components/studio-dock/README.md +44 -0
  158. package/src/components/studio-dock/element.ts +11 -0
  159. package/src/components/studio-dock/engine.ts +212 -0
  160. package/src/components/studio-dock/react.tsx +23 -0
  161. package/src/components/studio-dock/studio-dock.css +34 -0
  162. package/src/components/theme-picker/README.md +3 -5
  163. package/src/components/theme-picker/engine.ts +2 -2
  164. package/src/components/theme-picker/react.tsx +1 -1
  165. package/src/components/theme-picker/theme-picker.css +1 -1
  166. package/src/components/toast/README.md +1 -3
  167. package/src/components/toast/engine.ts +2 -2
  168. package/src/components/toast/react.tsx +1 -1
  169. package/src/components/toast/store.ts +1 -2
  170. package/src/components/toast/toast.css +1 -1
  171. package/src/components/trailer/README.md +28 -0
  172. package/src/components/trailer/element.ts +13 -0
  173. package/src/components/trailer/engine.ts +189 -0
  174. package/src/components/trailer/react.tsx +16 -0
  175. package/src/components/trailer/trailer.css +36 -0
  176. package/src/core/channels.ts +3 -3
  177. package/src/core/curves.ts +3 -3
  178. package/src/core/dates.ts +98 -0
  179. package/src/core/gsap.ts +2 -2
  180. package/src/core/loop.ts +1 -1
  181. package/src/core/math.ts +1 -1
  182. package/src/core/physics-spring.ts +2 -2
  183. package/src/core/scroll-track.ts +2 -4
  184. package/src/core/spring.ts +1 -1
  185. package/src/core/timing.ts +21 -22
  186. package/src/css/controls/README.md +24 -20
  187. package/src/css/controls/burger.css +1 -1
  188. package/src/css/controls/button.css +4 -4
  189. package/src/css/controls/checkbox.css +1 -1
  190. package/src/css/controls/chip.css +1 -1
  191. package/src/css/controls/field.css +2 -2
  192. package/src/css/controls/glass.css +4 -4
  193. package/src/css/controls/status.css +63 -0
  194. package/src/css/default-theme.css +1 -1
  195. package/src/css/effects/README.md +19 -21
  196. package/src/css/effects/anim.css +1 -1
  197. package/src/css/effects/fade.css +1 -1
  198. package/src/css/effects/float.css +1 -1
  199. package/src/css/effects/frost.css +1 -1
  200. package/src/css/effects/grain.css +1 -1
  201. package/src/css/effects/loading.css +1 -1
  202. package/src/css/effects/success.css +1 -1
  203. package/src/css/effects/text.css +1 -1
  204. package/src/css/fonts.css +1 -1
  205. package/src/css/states.css +1 -1
  206. package/src/css/themes/black-green.css +1 -1
  207. package/src/css/themes/black.css +1 -1
  208. package/src/css/themes/blue.css +1 -1
  209. package/src/css/themes/brown.css +1 -1
  210. package/src/css/themes/cold-blue.css +1 -1
  211. package/src/css/themes/funny.css +1 -1
  212. package/src/css/themes/gray.css +1 -1
  213. package/src/css/themes/green.css +1 -1
  214. package/src/css/themes/modern-1.css +1 -1
  215. package/src/css/themes/neogreen.css +1 -1
  216. package/src/css/themes/new.css +1 -1
  217. package/src/css/themes/new2.css +1 -1
  218. package/src/css/themes/oled.css +1 -1
  219. package/src/css/themes/orange.css +1 -1
  220. package/src/css/themes/pastel-pink.css +1 -1
  221. package/src/css/themes/pink.css +1 -1
  222. package/src/css/themes/purple.css +1 -1
  223. package/src/css/themes/red.css +1 -1
  224. package/src/css/themes/super-blue.css +1 -1
  225. package/src/css/tokens.css +8 -8
  226. package/src/elements/index.ts +24 -0
  227. package/src/gl/liquid-blend/README.md +3 -3
  228. package/src/gl/matcap/README.md +3 -3
  229. package/src/gl/particle-hero/README.md +1 -1
  230. package/src/gl/particle-hero/create-particle-hero.ts +3 -5
  231. package/src/gl/particle-hero/shaders.ts +1 -1
  232. package/src/gl/shader-blur/README.md +3 -3
  233. package/src/gl/shader-grain/README.md +3 -3
  234. package/src/index.ts +25 -0
  235. package/src/motion/chat.ts +2 -2
  236. package/src/motion/confetti.ts +1 -1
  237. package/src/motion/count.ts +1 -1
  238. package/src/motion/details.ts +1 -1
  239. package/src/motion/drag-dismiss.ts +1 -1
  240. package/src/motion/effects.ts +1 -1
  241. package/src/motion/entrances.ts +1 -1
  242. package/src/motion/floating.ts +1 -1
  243. package/src/motion/flow.ts +2 -2
  244. package/src/motion/indicator.ts +1 -1
  245. package/src/motion/layout.ts +1 -1
  246. package/src/motion/liquid.ts +1 -1
  247. package/src/motion/morph.ts +2 -2
  248. package/src/motion/reveal.ts +1 -1
  249. package/src/motion/sheet.ts +1 -1
  250. package/src/motion/surface.ts +1 -1
  251. package/src/react/animated-number.tsx +2 -2
  252. package/src/react/flip-group.tsx +1 -1
  253. package/src/react/frost.tsx +1 -1
  254. package/src/react/index.ts +21 -0
  255. package/src/react/slot-text.tsx +1 -1
  256. package/src/react/use-action-button.ts +6 -0
  257. package/src/react/use-card-dock.ts +1 -1
  258. package/src/react/use-cascade.ts +1 -1
  259. package/src/react/use-contrast.ts +1 -1
  260. package/src/react/use-depth-grid.ts +1 -1
  261. package/src/react/use-editorial-reveal.ts +7 -0
  262. package/src/react/use-fill-text.ts +1 -1
  263. package/src/react/use-film-hero.ts +6 -0
  264. package/src/react/use-font-cycle.ts +7 -0
  265. package/src/react/use-frame-zoom.ts +1 -1
  266. package/src/react/use-image-zoom.ts +5 -0
  267. package/src/react/use-joined-cta.ts +5 -0
  268. package/src/react/use-letters.ts +1 -1
  269. package/src/react/use-local-clock.ts +5 -0
  270. package/src/react/use-marquee.ts +1 -1
  271. package/src/react/use-mask-text.ts +1 -1
  272. package/src/react/use-parallax.ts +1 -1
  273. package/src/react/use-particle-hero.ts +1 -1
  274. package/src/react/use-scroll-dock.ts +5 -0
  275. package/src/react/use-snap-strip.ts +1 -1
  276. package/src/react/use-sticker.ts +5 -0
  277. package/src/react/use-studio-dock.ts +8 -0
  278. package/src/react/use-text-roll.ts +1 -1
  279. package/src/react/use-thumbnail-nav.ts +7 -0
  280. package/src/react/use-trailer.ts +6 -0
  281. package/src/react/use-weight-hover.ts +5 -0
  282. package/src/recipes/action-button/README.md +31 -0
  283. package/src/recipes/action-button/action-button.css +113 -0
  284. package/src/recipes/action-button/create-action-button.ts +56 -0
  285. package/src/recipes/card-dock/README.md +1 -1
  286. package/src/recipes/card-dock/card-dock.css +1 -1
  287. package/src/recipes/card-dock/create-card-dock.ts +2 -2
  288. package/src/recipes/cascade/README.md +1 -3
  289. package/src/recipes/cascade/create-cascade.ts +3 -3
  290. package/src/recipes/contrast/README.md +0 -2
  291. package/src/recipes/contrast/create-contrast.ts +1 -1
  292. package/src/recipes/counter/README.md +0 -2
  293. package/src/recipes/counter/create-counter.ts +1 -1
  294. package/src/recipes/curved-carousel/README.md +0 -2
  295. package/src/recipes/curved-carousel/create-curved-carousel.ts +2 -2
  296. package/src/recipes/curved-carousel/curved-carousel.css +1 -1
  297. package/src/recipes/depth-grid/README.md +0 -2
  298. package/src/recipes/depth-grid/create-depth-grid.ts +3 -4
  299. package/src/recipes/details/README.md +0 -2
  300. package/src/recipes/details/create-details.ts +1 -1
  301. package/src/recipes/dock-pill/README.md +3 -3
  302. package/src/recipes/drag-ruler/README.md +3 -3
  303. package/src/recipes/editorial-reveal/README.md +35 -0
  304. package/src/recipes/editorial-reveal/create-editorial-reveal.ts +91 -0
  305. package/src/recipes/editorial-reveal/editorial-reveal.css +17 -0
  306. package/src/recipes/fill-text/README.md +1 -1
  307. package/src/recipes/fill-text/create-fill-text.ts +1 -1
  308. package/src/recipes/film-hero/README.md +23 -0
  309. package/src/recipes/film-hero/create-film-hero.ts +65 -0
  310. package/src/recipes/film-hero/film-hero.css +29 -0
  311. package/src/recipes/fit-text/README.md +0 -2
  312. package/src/recipes/flow/README.md +0 -2
  313. package/src/recipes/flow/create-flow.ts +1 -1
  314. package/src/recipes/font-cycle/README.md +11 -0
  315. package/src/recipes/font-cycle/create-font-cycle.ts +126 -0
  316. package/src/recipes/font-cycle/font-cycle.css +36 -0
  317. package/src/recipes/frame-zoom/README.md +1 -3
  318. package/src/recipes/frame-zoom/create-frame-zoom.ts +2 -2
  319. package/src/recipes/image-zoom/README.md +16 -0
  320. package/src/recipes/image-zoom/create-image-zoom.ts +27 -0
  321. package/src/recipes/image-zoom/image-zoom.css +7 -0
  322. package/src/recipes/infinite-reel/README.md +3 -3
  323. package/src/recipes/joined-cta/README.md +13 -0
  324. package/src/recipes/joined-cta/create-joined-cta.ts +22 -0
  325. package/src/recipes/joined-cta/joined-cta.css +17 -0
  326. package/src/recipes/letters/README.md +2 -4
  327. package/src/recipes/letters/create-letters.ts +3 -3
  328. package/src/recipes/local-clock/README.md +31 -0
  329. package/src/recipes/local-clock/create-local-clock.ts +61 -0
  330. package/src/recipes/marquee/README.md +0 -2
  331. package/src/recipes/marquee/create-marquee.ts +3 -3
  332. package/src/recipes/marquee/marquee.css +1 -1
  333. package/src/recipes/mask-text/README.md +3 -5
  334. package/src/recipes/mask-text/create-mask-text.ts +4 -4
  335. package/src/recipes/parallax/README.md +1 -3
  336. package/src/recipes/parallax/create-parallax.ts +1 -1
  337. package/src/recipes/pile/README.md +0 -2
  338. package/src/recipes/pile/create-pile.ts +1 -1
  339. package/src/recipes/pile/pile-math.ts +1 -1
  340. package/src/recipes/pile/pile.css +1 -1
  341. package/src/recipes/pill/README.md +0 -2
  342. package/src/recipes/pill/pill.css +2 -2
  343. package/src/recipes/pop/README.md +0 -2
  344. package/src/recipes/pop/create-pop.ts +1 -1
  345. package/src/recipes/radial-menu/README.md +0 -2
  346. package/src/recipes/radial-menu/create-radial-menu.ts +1 -1
  347. package/src/recipes/radial-menu/radial-menu.css +1 -1
  348. package/src/recipes/reflow/README.md +3 -5
  349. package/src/recipes/reflow/create-reflow.ts +1 -1
  350. package/src/recipes/repel-bento/README.md +3 -3
  351. package/src/recipes/reveal/README.md +0 -2
  352. package/src/recipes/reveal/create-reveal.ts +1 -1
  353. package/src/recipes/rotator/README.md +3 -3
  354. package/src/recipes/scroll-dock/README.md +46 -0
  355. package/src/recipes/scroll-dock/create-scroll-dock.ts +72 -0
  356. package/src/recipes/scroll-dock/scroll-dock.css +70 -0
  357. package/src/recipes/slot-text/README.md +0 -2
  358. package/src/recipes/slot-text/create-slot-text.ts +1 -1
  359. package/src/recipes/snap-strip/README.md +1 -1
  360. package/src/recipes/snap-strip/create-snap-strip.ts +5 -6
  361. package/src/recipes/snap-strip/snap-strip.css +1 -1
  362. package/src/recipes/sortable/README.md +3 -5
  363. package/src/recipes/sortable/create-sortable.ts +4 -4
  364. package/src/recipes/sortable/sortable.css +1 -1
  365. package/src/recipes/spring-cards/README.md +0 -2
  366. package/src/recipes/spring-cards/create-spring-cards.ts +1 -1
  367. package/src/recipes/spring-cards/spring-cards.css +1 -1
  368. package/src/recipes/sticker/README.md +59 -0
  369. package/src/recipes/sticker/create-sticker.ts +490 -0
  370. package/src/recipes/sticker/sticker.css +112 -0
  371. package/src/recipes/stretch-footer/README.md +0 -2
  372. package/src/recipes/stretch-footer/create-stretch-footer.ts +1 -1
  373. package/src/recipes/stretch-footer/stretch-footer.css +1 -1
  374. package/src/recipes/tabs/README.md +0 -2
  375. package/src/recipes/tabs/create-tabs.ts +1 -1
  376. package/src/recipes/text-roll/README.md +1 -3
  377. package/src/recipes/text-roll/create-text-roll.ts +3 -3
  378. package/src/recipes/text-roll/text-roll.css +1 -1
  379. package/src/recipes/thumbnail-nav/README.md +16 -0
  380. package/src/recipes/thumbnail-nav/create-thumbnail-nav.ts +165 -0
  381. package/src/recipes/thumbnail-nav/thumbnail-nav.css +108 -0
  382. package/src/recipes/ticket-menu/README.md +3 -3
  383. package/src/recipes/weight-hover/README.md +37 -0
  384. package/src/recipes/weight-hover/create-weight-hover.ts +136 -0
  385. package/src/recipes/weight-hover/weight-hover.css +7 -0
  386. package/src/recipes/words/README.md +0 -2
  387. package/src/recipes/words/create-words.ts +1 -1
  388. package/src/theme/generate.ts +1 -1
  389. package/src/theme/presets.ts +2 -2
  390. package/src/theme/theme.ts +1 -2
  391. package/dist/chunk-2BQGFOA7.js.map +0 -1
  392. package/dist/chunk-34XYOXHG.js.map +0 -1
  393. package/dist/chunk-6OJAP6ZL.js.map +0 -1
  394. package/dist/chunk-FS2HJVVY.js.map +0 -1
  395. package/dist/chunk-J27KH2A2.js.map +0 -1
  396. package/dist/chunk-KLY5BRRI.js.map +0 -1
  397. package/dist/chunk-Q4LVFNLN.js.map +0 -1
  398. package/dist/chunk-RFDIZYFX.js.map +0 -1
  399. /package/dist/{chunk-ABNRDDO7.js.map → chunk-I3DXF2KQ.js.map} +0 -0
package/dist/index.css CHANGED
@@ -1,13 +1,13 @@
1
1
  /* css/tokens.css */
2
2
  /* motion-kit tokens — override any of them on :root, on a [data-mk-theme] or on a component. */
3
3
  :root {
4
- /* spencergabor.com elastic curves */
4
+ /* Elastic curves */
5
5
  --mk-ease-elastic: linear(0, 0.5737 7.6%, 0.8382 11.87%, 0.9463 14.19%, 1.0292 16.54%, 1.0886 18.97%, 1.1258 21.53%, 1.137 22.97%, 1.1424 24.48%, 1.1423 26.1%, 1.1366 27.86%, 1.1165 31.01%, 1.0507 38.62%, 1.0219 42.57%, 0.9995 46.99%, 0.9872 51.63%, 0.9842 58.77%, 1.0011 81.26%, 1);
6
6
  --mk-ease-elastic-hover: linear(0, 0.2178 2.1%, 1.1144 8.49%, 1.2959 10.7%, 1.3463 11.81%, 1.3705 12.94%, 1.3726, 1.3643 14.48%, 1.3151 16.2%, 1.0317 21.81%, 0.941 24.01%, 0.8912 25.91%, 0.8694 27.84%, 0.8698 29.21%, 0.8824 30.71%, 1.0122 38.33%, 1.0357, 1.046 42.71%, 1.0416 45.7%, 0.9961 53.26%, 0.9839 57.54%, 0.9853 60.71%, 1.0012 68.14%, 1.0056 72.24%, 0.9981 86.66%, 1);
7
7
 
8
- /* Stepbro curves. The signature is a multi-point path: CSS gets Stepbro's own linear() sampling of it. */
8
+ /* Motion curves. The signature is a multi-point path sampled as CSS linear(). */
9
9
  --mk-ease-signature: linear(0 0%, .017 2.5%, .037 5%, .061 7.5%, .091 10%, .13 12.5%, .184 15%, .275 17.5%, .562 20%, .733 22.5%, .803 25%, .848 27.5%, .88 30%, .902 32.5%, .942 40%, .97 50%, .985 60%, .993 70%, .998 80%, 1 90%, 1 100%);
10
- /* Stepbro's backdrop tint uses the same curve. */
10
+ /* backdrop tint uses the same curve. */
11
11
  --mk-ease-tint: var(--mk-ease-signature);
12
12
  --mk-ease-flow: cubic-bezier(0.25, 0.1, 0.25, 1);
13
13
  --mk-ease-close: cubic-bezier(0.56, 0.27, 0, 1);
@@ -17,12 +17,12 @@
17
17
  --mk-ease-swatch: cubic-bezier(0.38, 0.49, 0, 1.5);
18
18
  --mk-ease-swatch-light: cubic-bezier(0.11, 1, 0, 1);
19
19
  --mk-ease-slot: cubic-bezier(0.34, 1.56, 0.64, 1);
20
- /* Dousan Miao / Siena Film Foundation curves */
20
+ /* Glass, sheet and control curves */
21
21
  --mk-ease-glass: cubic-bezier(0.25, 1, 0.5, 1);
22
22
  --mk-ease-sheet: cubic-bezier(0.16, 1, 0.3, 1);
23
23
  --mk-ease-siena: cubic-bezier(0.19, 1, 0.22, 1);
24
24
  --mk-ease-quint: cubic-bezier(0.23, 1, 0.32, 1);
25
- /* Dousan's springs (Motion 400/10 press, 260/18 success), sampled by springLinear(); a test keeps them in sync. */
25
+ /* springs (Motion 400/10 press, 260/18 success), sampled by springLinear(); a test keeps them in sync. */
26
26
  --mk-ease-press: linear(0, 0.1957, 0.6333, 1.0817, 1.3717, 1.4412, 1.3274, 1.1249, 0.934, 0.8221, 0.808, 0.8691, 0.9612, 1.0413, 1.0833, 1.0824, 1.0513, 1.01, 0.9769, 0.9618, 0.9651, 0.9804, 0.9986, 1.0121, 1.0173, 1.0146, 1.0072, 0.9993, 0.9939, 0.9923, 0.994, 0.9974, 1.0008, 1.003, 1.0034, 1.0024, 1.0008, 0.9994, 0.9986, 0.9985, 1);
27
27
  --mk-dur-press: 1.346s;
28
28
  --mk-ease-success: linear(0, 0.0437, 0.1533, 0.3004, 0.4617, 0.6197, 0.7624, 0.8825, 0.9767, 1.0451, 1.0895, 1.1133, 1.1208, 1.1161, 1.1032, 1.0856, 1.0662, 1.047, 1.0296, 1.0149, 1.0034, 0.9949, 0.9894, 0.9864, 0.9854, 0.9859, 0.9874, 0.9895, 0.9919, 0.9942, 0.9963, 0.9981, 0.9995, 1.0006, 1.0012, 1.0016, 1.0018, 1.0017, 1.0015, 1.0013, 1);
@@ -35,7 +35,7 @@
35
35
  --mk-shadow: 0 9px 21px rgb(0 0 0 / 0.1), 0 38px 38px rgb(0 0 0 / 0.09), 0 85px 51px rgb(0 0 0 / 0.05);
36
36
  --mk-shadow-soft: 0 9px 21px rgb(0 0 0 / 0.05), 0 38px 38px rgb(0 0 0 / 0.045), 0 85px 51px rgb(0 0 0 / 0.025);
37
37
 
38
- /* Shape: Stepbro's large capsules */
38
+ /* Shape: large capsules */
39
39
  --mk-radius-card: 1rem;
40
40
  --mk-radius-xs: 8px;
41
41
  --mk-radius-sm: 12px;
@@ -51,7 +51,7 @@
51
51
  --mk-radius-chat: var(--mk-radius-3xl);
52
52
  --mk-radius-dock: var(--mk-radius-4xl);
53
53
 
54
- /* Spacing, 4 px steps. Stepbro's navigation breakpoint is 680px (media queries use it literally). */
54
+ /* Spacing, 4 px steps. navigation breakpoint is 680px (media queries use it literally). */
55
55
  --mk-space-1: 4px;
56
56
  --mk-space-2: 8px;
57
57
  --mk-space-3: 12px;
@@ -73,7 +73,7 @@
73
73
  /* Type: DM Sans, Geist Mono, Material Symbols Rounded (css/fonts.css loads them). */
74
74
  --mk-font: 'DM Sans', ui-sans-serif, system-ui, sans-serif;
75
75
  --mk-font-mono: 'Geist Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
76
- /* Material 3 type scale with Stepbro's values (its bundle writes weights as "400px"; here they are numbers). */
76
+ /* Material 3 type scale; font weights are unitless. */
77
77
  --md-sys-typescale-display-large-font: var(--mk-font);
78
78
  --md-sys-typescale-display-large-size: 57px;
79
79
  --md-sys-typescale-display-large-line-height: 64px;
@@ -183,7 +183,7 @@
183
183
  }
184
184
 
185
185
  /* css/default-theme.css */
186
- /* Default palette (Stepbro "neogreen") with zero specificity: any [data-mk-theme] wins.
186
+ /* Default palette with zero specificity: any [data-mk-theme] wins.
187
187
  Generated by scripts/import-themes.mjs; do not edit. */
188
188
  :where(:root) {
189
189
  --md-sys-color-background: #f1fded;
@@ -467,7 +467,7 @@
467
467
  visibility: hidden;
468
468
  }
469
469
 
470
- /* iyo: the island drops in from above, the fill-text starts dimmed. */
470
+ /* the island drops in from above, the fill-text starts dimmed. */
471
471
  .mk-js:not(.mk-failed) :is(.mk-island, mk-island):not([data-mk-ready]) .mk-island__shell {
472
472
  visibility: hidden;
473
473
  }
@@ -505,7 +505,7 @@
505
505
  }
506
506
 
507
507
  /* recipes/spring-cards/spring-cards.css */
508
- /* spring-cards — card geometry and tilt from spencergabor.com (Hero) */
508
+ /* spring-cards — card geometry and tilt */
509
509
 
510
510
  [data-mk-card] {
511
511
  display: grid;
@@ -531,7 +531,7 @@
531
531
 
532
532
  /* recipes/curved-carousel/curved-carousel.css */
533
533
  /*
534
- * curved-carousel — spencergabor.com (Carousel). Layout rules apply only while the
534
+ * curved-carousel — Layout rules apply only while the
535
535
  * recipe runs (`[data-mk-carousel]`); without JS the root keeps whatever fallback
536
536
  * the page gives it (e.g. a horizontal scroll row).
537
537
  */
@@ -582,7 +582,7 @@
582
582
  }
583
583
 
584
584
  /* recipes/pile/pile.css */
585
- /* pile — stack recipe from spencergabor.com (GridEntry) */
585
+ /* pile — stacked card geometry */
586
586
 
587
587
  .mk-pile {
588
588
  display: grid;
@@ -656,7 +656,7 @@
656
656
 
657
657
  /* recipes/stretch-footer/stretch-footer.css */
658
658
  /*
659
- * stretch-footer — spencergabor.com (Footer). The page content must sit above it:
659
+ * stretch-footer — The page content must sit above it:
660
660
  * give <main> `position: relative; z-index: 1; background: <page colour>`.
661
661
  */
662
662
 
@@ -685,7 +685,7 @@
685
685
  }
686
686
 
687
687
  /* recipes/radial-menu/radial-menu.css */
688
- /* radial-menu — spencergabor.com colour picker, generalised. Scoped to its root:
688
+ /* radial-menu — radial-menu. Scoped to its root:
689
689
  [data-mk-item] and [data-mk-open] are also used by other recipes and components. */
690
690
 
691
691
  [data-mk~="radial-menu"],
@@ -732,7 +732,7 @@
732
732
  }
733
733
 
734
734
  /* recipes/pill/pill.css */
735
- /* pill — spencergabor.com button: elastic scale and shadow */
735
+ /* pill — pill: elastic scale and shadow */
736
736
 
737
737
  .mk-pill {
738
738
  display: inline-flex;
@@ -768,7 +768,7 @@
768
768
  }
769
769
  }
770
770
 
771
- /* Stretch on hover (spencergabor.com footer links) */
771
+ /* Stretch on hover (stretch-footer links) */
772
772
  .mk-stretch {
773
773
  display: inline-block;
774
774
  transform-origin: 50% 100%;
@@ -847,7 +847,7 @@
847
847
  }
848
848
 
849
849
  /* recipes/sortable/sortable.css */
850
- /* sortable — Stepbro's drag reorder (Tasks): the item lifts into a floating copy that tilts; the others make room. */
850
+ /* sortable — drag reorder: the item lifts into a floating copy that tilts; the others make room. */
851
851
  [data-mk-sorting] {
852
852
  -webkit-user-select: none;
853
853
  user-select: none;
@@ -889,7 +889,7 @@
889
889
  }
890
890
 
891
891
  /* recipes/text-roll/text-roll.css */
892
- /* text-roll — Siena's slot title: each letter is a reel (its face and a copy below), clipped to one line. */
892
+ /* text-roll — slot title: each letter is a reel (its face and a copy below), clipped to one line. */
893
893
  .mk-roll-word {
894
894
  white-space: nowrap;
895
895
  }
@@ -912,7 +912,7 @@
912
912
  }
913
913
 
914
914
  /* recipes/marquee/marquee.css */
915
- /* marquee — Siena's strip: every copy of the group slides its own length in a linear loop. */
915
+ /* marquee — strip: every copy of the group slides its own length in a linear loop. */
916
916
  .mk-marquee {
917
917
  display: flex;
918
918
  gap: var(--mk-marquee-gap, 0px);
@@ -956,7 +956,7 @@
956
956
 
957
957
  /* recipes/card-dock/card-dock.css */
958
958
  /*
959
- * iyo.ai's product dock. Cards are .mk-card-dock__item children (the last one
959
+ * product dock. Cards are .mk-card-dock__item children (the last one
960
960
  * is the front card); the optional .mk-card-dock__cta shows next to the stack
961
961
  * once it has settled. Without JavaScript the stack still opens on hover/focus.
962
962
  */
@@ -1135,7 +1135,7 @@
1135
1135
  }
1136
1136
 
1137
1137
  /* recipes/snap-strip/snap-strip.css */
1138
- /* iyo.ai's phone cards: a strip of cards that snaps to each one. */
1138
+ /* phone cards: a strip of cards that snaps to each one. */
1139
1139
  .mk-snap-strip {
1140
1140
  --mk-snap-strip-item: 68vw;
1141
1141
  --mk-snap-strip-gap: 0.75rem;
@@ -1245,8 +1245,544 @@
1245
1245
  .mk-shader__canvas { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; }
1246
1246
  .mk-shader__canvas[hidden] { display: none; }
1247
1247
 
1248
+ /* recipes/joined-cta/joined-cta.css */
1249
+ .mk-joined-cta { --mk-joined-duration: .5s; --mk-joined-bg: var(--mk-text); --mk-joined-color: var(--mk-bg); position: relative; display: inline-flex; align-items: center; justify-content: center; width: 17.7rem; height: 5.9rem; max-width: 100%; border: 0; padding: 0; background: transparent; text-decoration: none; color: var(--mk-joined-color); cursor: pointer; font: inherit; isolation: isolate; border-radius: var(--mk-radius-full); }
1250
+ .mk-joined-cta::before { content: ''; position: absolute; left: 0; width: 7.3rem; height: 5.9rem; border-radius: 100px; background: var(--mk-joined-bg); z-index: -1; transition: width var(--mk-joined-duration) ease-in-out; }
1251
+ .mk-joined-cta > span { position: relative; display: grid; place-items: center; flex-shrink: 0; background: var(--mk-joined-bg); border-radius: 100px; height: 5.9rem; transition: left var(--mk-joined-duration) ease-in-out, height var(--mk-joined-duration) ease-in-out, transform var(--mk-joined-duration) ease-in-out, background var(--mk-joined-duration); }
1252
+ .mk-joined-cta > span:nth-child(1) { width: 7.3rem; left: 0; }
1253
+ .mk-joined-cta > span:nth-child(2) { width: 4.5rem; left: 0; z-index: 2; }
1254
+ .mk-joined-cta > span:nth-child(3) { width: 5.9rem; height: 3.05rem; left: -1.45rem; transform: rotate(-90deg); }
1255
+ .mk-joined-cta:is(:hover,:focus-visible,[data-mk-expanded])::before { width: 17.7rem; }
1256
+ .mk-joined-cta:is(:hover,:focus-visible,[data-mk-expanded]) > span:nth-child(1) { left: 3.2rem; }
1257
+ .mk-joined-cta:is(:hover,:focus-visible,[data-mk-expanded]) > span:nth-child(2) { left: -.75rem; background: transparent; }
1258
+ .mk-joined-cta:is(:hover,:focus-visible,[data-mk-expanded]) > span:nth-child(3) { left: -3.65rem; height: 5.9rem; transform: rotate(0); }
1259
+ .mk-joined-cta:focus-visible { outline: 2px solid var(--mk-accent); outline-offset: 5px; }
1260
+ @media (hover: none), (max-width: 420px) {
1261
+ .mk-joined-cta { width: auto; height: auto; padding: 1.25rem 2rem; gap: .3em; background: var(--mk-joined-bg); }
1262
+ .mk-joined-cta::before { display: none; }
1263
+ .mk-joined-cta > span:nth-child(n) { width: auto; height: auto; left: 0; transform: none; background: transparent; }
1264
+ }
1265
+ @media (prefers-reduced-motion: reduce) { .mk-joined-cta::before, .mk-joined-cta > span { transition: none; } }
1266
+
1267
+ /* recipes/image-zoom/image-zoom.css */
1268
+ .mk-image-zoom { --mk-zoom-duration: 1s; --mk-zoom-frame-scale: 1.1; --mk-zoom-image-scale: 1.2; --mk-zoom-ease: cubic-bezier(.28,.71,0,.98); color: inherit; text-decoration: none; }
1269
+ .mk-image-zoom [data-mk-zoom-frame] { display: block; overflow: hidden; border-radius: inherit; transition: transform var(--mk-zoom-duration) var(--mk-zoom-ease); }
1270
+ .mk-image-zoom [data-mk-zoom-frame] > :is(img,video,picture), .mk-image-zoom [data-mk-zoom-image] { display: block; width: 100%; height: 100%; object-fit: cover; transform: scale(var(--mk-zoom-image-scale)); transition: transform var(--mk-zoom-duration) var(--mk-zoom-ease); }
1271
+ .mk-image-zoom:is(:hover,:focus-within,[data-mk-active]) [data-mk-zoom-frame] { transform: scale(var(--mk-zoom-frame-scale)); }
1272
+ .mk-image-zoom:is(:hover,:focus-within,[data-mk-active]) [data-mk-zoom-frame] > :is(img,video,picture), .mk-image-zoom:is(:hover,:focus-within,[data-mk-active]) [data-mk-zoom-image] { transform: scale(1); }
1273
+ .mk-image-zoom:focus-visible { outline: 2px solid var(--mk-accent); outline-offset: 5px; }
1274
+ @media (prefers-reduced-motion: reduce) { .mk-image-zoom [data-mk-zoom-frame], .mk-image-zoom [data-mk-zoom-frame] > :is(img,video,picture), .mk-image-zoom [data-mk-zoom-image] { transform: none !important; transition: none; } }
1275
+
1276
+ /* recipes/font-cycle/font-cycle.css */
1277
+ .mk-font-cycle {
1278
+ position: relative;
1279
+ display: inline-block;
1280
+ color: inherit;
1281
+ font-family: var(--mk-font, sans-serif);
1282
+ isolation: isolate;
1283
+ }
1284
+ .mk-font-cycle__accessible {
1285
+ position: absolute;
1286
+ width: 1px;
1287
+ height: 1px;
1288
+ padding: 0;
1289
+ overflow: hidden;
1290
+ clip-path: inset(50%);
1291
+ white-space: nowrap;
1292
+ }
1293
+ .mk-font-cycle__visual { display: inline-flex; white-space: pre; }
1294
+ .mk-font-cycle__char {
1295
+ position: relative;
1296
+ display: inline-grid;
1297
+ overflow: hidden;
1298
+ line-height: 1.12;
1299
+ vertical-align: bottom;
1300
+ }
1301
+ .mk-font-cycle__sizer { grid-area: 1 / 1; visibility: hidden; padding-inline: .035em; }
1302
+ .mk-font-cycle__track { position: absolute; inset: 0 0 auto; display: flex; flex-direction: column; will-change: transform; }
1303
+ .mk-font-cycle__face { display: block; flex: none; text-align: center; padding-inline: .035em; }
1304
+ .mk-font-cycle__overlay { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain; pointer-events: none; opacity: 0; }
1305
+ .mk-font-cycle[data-mk-active][data-mk-font-overlay-ready] .mk-font-cycle__overlay { opacity: 1; }
1306
+ .mk-font-cycle[data-mk-active][data-mk-font-overlay-ready] .mk-font-cycle__visual { opacity: 0; }
1307
+ .mk-font-cycle:focus-visible { outline: 2px solid var(--mk-accent, currentColor); outline-offset: .15em; }
1308
+ @media (prefers-reduced-motion: reduce) {
1309
+ .mk-font-cycle__track { will-change: auto; }
1310
+ .mk-font-cycle[data-mk-active][data-mk-font-overlay-ready] .mk-font-cycle__visual { opacity: 1; }
1311
+ .mk-font-cycle[data-mk-active][data-mk-font-overlay-ready] .mk-font-cycle__overlay { display: none; }
1312
+ }
1313
+
1314
+ /* recipes/thumbnail-nav/thumbnail-nav.css */
1315
+ .mk-thumbnail-nav {
1316
+ --mk-thumbnail-nav-surface: #181716e6;
1317
+ --mk-thumbnail-nav-color: #fff;
1318
+ --mk-thumbnail-nav-duration: .5s;
1319
+ --mk-thumbnail-nav-ease: cubic-bezier(.165,.84,.44,1);
1320
+ position: relative;
1321
+ display: flex;
1322
+ align-items: end;
1323
+ justify-content: center;
1324
+ inline-size: min(100%, 18.0625rem);
1325
+ min-block-size: 4.25rem;
1326
+ margin-inline: auto;
1327
+ color: var(--mk-thumbnail-nav-color);
1328
+ font-family: var(--mk-font, sans-serif);
1329
+ isolation: isolate;
1330
+ }
1331
+ .mk-thumbnail-nav--fixed { position: fixed; z-index: 20; inset: auto auto max(1.25rem, env(safe-area-inset-bottom)) 50%; transform: translateX(-50%); }
1332
+ .mk-thumbnail-nav__toggle {
1333
+ position: relative;
1334
+ display: flex;
1335
+ align-items: center;
1336
+ flex: none;
1337
+ gap: .5rem;
1338
+ inline-size: 13.875rem;
1339
+ max-inline-size: 100%;
1340
+ min-block-size: 3.3125rem;
1341
+ padding: .40625rem .75rem;
1342
+ border: 0;
1343
+ border-radius: 3.3125rem;
1344
+ background: var(--mk-thumbnail-nav-surface);
1345
+ color: inherit;
1346
+ font: inherit;
1347
+ cursor: pointer;
1348
+ -webkit-backdrop-filter: blur(8px);
1349
+ backdrop-filter: blur(8px);
1350
+ transition: inline-size var(--mk-thumbnail-nav-duration) var(--mk-thumbnail-nav-ease), min-block-size var(--mk-thumbnail-nav-duration) var(--mk-thumbnail-nav-ease), border-radius var(--mk-thumbnail-nav-duration) var(--mk-thumbnail-nav-ease);
1351
+ }
1352
+ .mk-thumbnail-nav[data-mk-expanded] .mk-thumbnail-nav__toggle { inline-size: 18.0625rem; min-block-size: 4.25rem; border-radius: 4.25rem; }
1353
+ .mk-thumbnail-nav__preview { position: relative; display: block; flex: 0 0 4.25rem; block-size: 2.5rem; }
1354
+ .mk-thumbnail-nav__thumb {
1355
+ position: absolute;
1356
+ inset: 0 auto auto 0;
1357
+ display: grid;
1358
+ place-items: center;
1359
+ inline-size: 2.5rem;
1360
+ block-size: 2.5rem;
1361
+ overflow: hidden;
1362
+ border-radius: 100%;
1363
+ background: var(--mk-accent, #dda063);
1364
+ color: var(--mk-on-accent, #181716);
1365
+ font-size: .75rem;
1366
+ font-weight: 600;
1367
+ z-index: calc(3 - var(--mk-thumbnail-order));
1368
+ transform-origin: left center;
1369
+ transform: translateX(calc((2 - var(--mk-thumbnail-order)) * .625rem)) scale(.725);
1370
+ transition: transform var(--mk-thumbnail-nav-duration) var(--mk-thumbnail-nav-ease);
1371
+ }
1372
+ .mk-thumbnail-nav[data-mk-expanded] .mk-thumbnail-nav__thumb { transform: translateX(calc((2 - var(--mk-thumbnail-order)) * .5rem)) scale(1); }
1373
+ .mk-thumbnail-nav__thumb img { inline-size: 100%; block-size: 100%; object-fit: cover; }
1374
+ .mk-thumbnail-nav__copy { display: grid; flex: 1; min-inline-size: 0; gap: .125rem; text-align: start; }
1375
+ .mk-thumbnail-nav__kicker { display: none; font-size: .6875rem; opacity: .6; line-height: 1.1; }
1376
+ .mk-thumbnail-nav[data-mk-expanded] .mk-thumbnail-nav__kicker { display: block; }
1377
+ .mk-thumbnail-nav__label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: .875rem; font-weight: 600; line-height: 1.3; }
1378
+ .mk-thumbnail-nav__chevron { display: grid; flex: 0 0 1.8125rem; place-items: center; block-size: 1.8125rem; border-radius: 50%; background: #ffffff1a; line-height: 1; transition: transform var(--mk-thumbnail-nav-duration) var(--mk-thumbnail-nav-ease); }
1379
+ .mk-thumbnail-nav[data-mk-expanded] .mk-thumbnail-nav__chevron { transform: rotate(180deg); }
1380
+ .mk-thumbnail-nav__panel {
1381
+ position: absolute;
1382
+ z-index: 2;
1383
+ inset: auto 0 calc(100% + .625rem);
1384
+ display: grid;
1385
+ gap: .25rem;
1386
+ max-block-size: min(20rem, 55vh);
1387
+ overflow: auto;
1388
+ padding: .5rem;
1389
+ border: 1px solid #ffffff1a;
1390
+ border-radius: 1.125rem;
1391
+ background: var(--mk-thumbnail-nav-surface);
1392
+ color: inherit;
1393
+ box-shadow: 0 1rem 3rem #0003;
1394
+ -webkit-backdrop-filter: blur(8px);
1395
+ backdrop-filter: blur(8px);
1396
+ transform-origin: center bottom;
1397
+ }
1398
+ .mk-thumbnail-nav__panel[hidden] { display: none; }
1399
+ .mk-thumbnail-nav__panel :is(ul, ol) { margin: 0; padding: 0; list-style: none; }
1400
+ .mk-thumbnail-nav__panel [data-mk-thumbnail-item] {
1401
+ box-sizing: border-box;
1402
+ display: flex;
1403
+ align-items: center;
1404
+ gap: .75rem;
1405
+ inline-size: 100%;
1406
+ min-block-size: 3rem;
1407
+ padding: .5rem .625rem;
1408
+ border: 0;
1409
+ border-radius: .75rem;
1410
+ background: transparent;
1411
+ color: inherit;
1412
+ font: inherit;
1413
+ text-decoration: none;
1414
+ cursor: pointer;
1415
+ }
1416
+ .mk-thumbnail-nav__panel [data-mk-thumbnail-item]:is(:hover, [aria-current='page']) { background: #ffffff1a; }
1417
+ .mk-thumbnail-nav__panel [data-mk-thumbnail-item]:is(:disabled, [aria-disabled='true']) { opacity: .4; cursor: default; }
1418
+ .mk-thumbnail-nav__panel [data-mk-thumbnail-item] img { inline-size: 2rem; block-size: 2rem; object-fit: cover; border-radius: 50%; }
1419
+ .mk-thumbnail-nav__toggle:focus-visible, .mk-thumbnail-nav__panel [data-mk-thumbnail-item]:focus-visible { outline: 2px solid var(--mk-accent, #dda063); outline-offset: 2px; }
1420
+ @media (prefers-reduced-motion: reduce) {
1421
+ .mk-thumbnail-nav *, .mk-thumbnail-nav *::before, .mk-thumbnail-nav *::after { transition: none !important; }
1422
+ }
1423
+
1424
+ /* recipes/action-button/action-button.css */
1425
+ .mk-action-button {
1426
+ --mk-action-ink: var(--mk-text, #171713);
1427
+ --mk-action-paper: var(--mk-surface, #f7f5ee);
1428
+ --mk-action-lift: 5px;
1429
+ --mk-action-tilt: -1.2deg;
1430
+ appearance: none;
1431
+ position: relative;
1432
+ display: inline-flex;
1433
+ align-items: center;
1434
+ justify-content: center;
1435
+ gap: .6em;
1436
+ min-height: 44px;
1437
+ padding: .65em 1.5em;
1438
+ border: 3px solid var(--mk-action-paper);
1439
+ border-radius: 24px 30px 22px 28px / 30px 22px 28px 24px;
1440
+ background: var(--mk-action-ink);
1441
+ color: var(--mk-action-paper);
1442
+ box-shadow: var(--mk-action-lift) calc(var(--mk-action-lift) + 1px) 0 var(--mk-action-ink);
1443
+ transform: rotate(var(--mk-action-tilt));
1444
+ font: 700 .85rem/1.15 var(--mk-font, sans-serif);
1445
+ letter-spacing: .045em;
1446
+ text-transform: uppercase;
1447
+ text-decoration: none;
1448
+ cursor: pointer;
1449
+ touch-action: manipulation;
1450
+ transition: transform 130ms ease-out, box-shadow 130ms ease-out, background-color 150ms ease, color 150ms ease, border-color 150ms ease;
1451
+ }
1452
+ .mk-action-button[data-mk-action-variant="secondary"],
1453
+ .mk-action-button[data-mk-action-variant="icon"] {
1454
+ --mk-action-tilt: 1.1deg;
1455
+ background: var(--mk-action-paper);
1456
+ border-color: var(--mk-action-ink);
1457
+ color: var(--mk-action-ink);
1458
+ }
1459
+ .mk-action-button[data-mk-action-variant="icon"] {
1460
+ width: 44px;
1461
+ padding: 8px;
1462
+ border-radius: 16px 20px 15px 19px / 20px 15px 19px 16px;
1463
+ }
1464
+ .mk-action-button svg { width: 1.25em; height: 1.25em; flex: none; }
1465
+ .mk-action-button[data-mk-action-variant="stepper"] {
1466
+ --mk-action-tilt: 0deg;
1467
+ min-width: 44px;
1468
+ padding: .5em;
1469
+ border: 2px solid var(--mk-action-ink);
1470
+ border-radius: 11px;
1471
+ background: var(--mk-action-paper);
1472
+ color: var(--mk-action-ink);
1473
+ box-shadow: none;
1474
+ }
1475
+ .mk-action-button[data-mk-action-variant="film"] {
1476
+ --mk-action-tilt: 0deg;
1477
+ border: 0;
1478
+ border-radius: 0;
1479
+ background: transparent;
1480
+ color: inherit;
1481
+ box-shadow: none;
1482
+ padding: .5em 0;
1483
+ font-family: var(--mk-film-font, Georgia, serif);
1484
+ font-size: 1.25rem;
1485
+ }
1486
+ .mk-action-button[data-mk-action-variant="film"]::before,
1487
+ .mk-action-button[data-mk-action-variant="film"]::after {
1488
+ content: "";
1489
+ position: absolute;
1490
+ inset: 0 0 auto;
1491
+ height: 1px;
1492
+ background: currentColor;
1493
+ transition: transform .4s cubic-bezier(.32,.72,0,1);
1494
+ }
1495
+ .mk-action-button[data-mk-action-variant="film"]::after { inset: auto 0 0; }
1496
+ [data-mk-action-label] { display: inline-grid; overflow: clip; }
1497
+ .mk-action-button__line, .mk-action-button__copy {
1498
+ grid-area: 1 / 1;
1499
+ transition: clip-path .4s cubic-bezier(.32,.72,0,1), translate .35s cubic-bezier(.32,.72,0,1), scale .3s cubic-bezier(.34,2.27,.64,1);
1500
+ }
1501
+ .mk-action-button__line { clip-path: inset(0); transform-origin: bottom; }
1502
+ .mk-action-button__copy { clip-path: inset(0 0 100%); translate: 0 -.25em; scale: 1.05; transform-origin: top; }
1503
+ @media (hover: hover) {
1504
+ .mk-action-button:not(:disabled):not([aria-disabled="true"]):hover {
1505
+ transform: rotate(var(--mk-action-tilt)) translate(3px, 3px);
1506
+ box-shadow: 2px 3px 0 var(--mk-action-ink);
1507
+ }
1508
+ .mk-action-button:is([data-mk-action-variant="secondary"], [data-mk-action-variant="icon"], [data-mk-action-variant="stepper"]):not(:disabled):not([aria-disabled="true"]):hover {
1509
+ background: var(--mk-action-ink);
1510
+ border-color: var(--mk-action-paper);
1511
+ color: var(--mk-action-paper);
1512
+ }
1513
+ .mk-action-button[data-mk-action-variant="stepper"]:not(:disabled):not([aria-disabled="true"]):hover { transform: none; box-shadow: none; }
1514
+ }
1515
+ .mk-action-button:not(:disabled):not([aria-disabled="true"]):active,
1516
+ .mk-action-button[aria-pressed="true"] {
1517
+ transform: rotate(var(--mk-action-tilt)) translate(var(--mk-action-lift), calc(var(--mk-action-lift) + 1px));
1518
+ box-shadow: 0 0 0 var(--mk-action-ink);
1519
+ }
1520
+ .mk-action-button[aria-pressed="true"] { background: var(--mk-action-ink); color: var(--mk-action-paper); }
1521
+ .mk-action-button[aria-pressed="true"]:not(:disabled):not([aria-disabled="true"]):hover { transform: rotate(var(--mk-action-tilt)) translate(var(--mk-action-lift), calc(var(--mk-action-lift) + 1px)); box-shadow: none; }
1522
+ .mk-action-button[data-mk-action-variant="stepper"]:not(:disabled):not([aria-disabled="true"]):active { transform: translateY(1px); box-shadow: none; }
1523
+ .mk-action-button[data-mk-action-variant="film"]:is(:hover, :focus-visible):not(:disabled):not([aria-disabled="true"]) {
1524
+ transform: scale(1.03) rotate(-.75deg);
1525
+ box-shadow: none;
1526
+ }
1527
+ .mk-action-button[data-mk-action-variant="film"]:is(:hover, :focus-visible):not(:disabled):not([aria-disabled="true"]) .mk-action-button__line { clip-path: inset(100% 0 0); translate: 0 .25em; scale: .95; }
1528
+ .mk-action-button[data-mk-action-variant="film"]:is(:hover, :focus-visible):not(:disabled):not([aria-disabled="true"]) .mk-action-button__copy { clip-path: inset(0); translate: 0; scale: 1; transition-delay: 75ms; }
1529
+ .mk-action-button[data-mk-action-variant="film"]:active:not(:disabled) { transform: scale(.97); }
1530
+ .mk-action-button:focus-visible { outline: 3px solid var(--mk-action-focus, #356bdf); outline-offset: 7px; }
1531
+ .mk-action-button:disabled, .mk-action-button[aria-disabled="true"] { opacity: .35; cursor: default; }
1532
+ @media (prefers-reduced-motion: reduce) {
1533
+ .mk-action-button, .mk-action-button *, .mk-action-button::before, .mk-action-button::after { transition: none; }
1534
+ .mk-action-button[data-mk-action-variant="film"]:is(:hover, :focus-visible):not(:disabled):not([aria-disabled="true"]) { transform: none; }
1535
+ .mk-action-button[data-mk-action-variant="film"]:is(:hover, :focus-visible):not(:disabled):not([aria-disabled="true"]) .mk-action-button__line { clip-path: none; translate: none; scale: 1; }
1536
+ .mk-action-button__copy { display: none; }
1537
+ }
1538
+
1539
+ /* recipes/film-hero/film-hero.css */
1540
+ .mk-film-hero {
1541
+ --mk-film-ink: var(--mk-text, #191b18);
1542
+ --mk-film-paper: var(--mk-surface, #f4f1e8);
1543
+ --mk-film-font: Georgia, 'Times New Roman', serif;
1544
+ position: relative;
1545
+ isolation: isolate;
1546
+ color: var(--mk-film-ink);
1547
+ background: var(--mk-film-paper);
1548
+ overflow: clip;
1549
+ }
1550
+ .mk-film-hero__credits { padding: clamp(20px, 5cqw, 64px); text-align: center; }
1551
+ .mk-film-hero__eyebrow { font: 500 .65rem/1.5 var(--mk-font-mono, monospace); text-transform: uppercase; letter-spacing: .18em; }
1552
+ .mk-film-hero__title { margin: .2em 0 .35em; font: 400 clamp(3.5rem, 10cqw, 8rem)/.82 var(--mk-film-font); letter-spacing: -.065em; text-transform: uppercase; }
1553
+ .mk-film-hero__mask { display: block; overflow: clip; padding-bottom: .08em; margin-bottom: -.08em; }
1554
+ [data-mk-film-line] { display: block; }
1555
+ [data-mk-film-rule] { display: block; height: 1px; border: 0; background: currentColor; margin: 16px 0; }
1556
+ .mk-film-hero__metadata { display: grid; gap: 0; margin: 24px 0 0; font: .8rem/1.5 var(--mk-font, sans-serif); }
1557
+ .mk-film-hero__metadata > div { display: flex; align-items: baseline; justify-content: space-between; gap: 20px; padding: 8px 0; border-top: 1px solid currentColor; }
1558
+ .mk-film-hero__metadata dt { font: .6rem/1.5 var(--mk-font-mono, monospace); text-transform: uppercase; letter-spacing: .14em; }
1559
+ .mk-film-hero__metadata dd { margin: 0; text-align: right; }
1560
+ .mk-film-hero__visual { position: relative; min-height: clamp(260px, 45cqw, 540px); display: grid; place-items: center; overflow: clip; color: #fffdf1; background: #243c36; }
1561
+ .mk-film-hero__media { position: absolute; inset: -8% 0; width: 100%; height: 116%; object-fit: cover; transform: translateY(var(--mk-film-shift, 0px)) scale(var(--mk-film-scale, 1)); transform-origin: center; }
1562
+ .mk-film-hero__visual::after { content: ''; position: absolute; inset: 0; pointer-events: none; background: linear-gradient(transparent, #00120c66); }
1563
+ .mk-film-hero__caption { position: relative; z-index: 1; padding: 48px 24px; text-align: center; }
1564
+ .mk-film-hero__caption blockquote { font: 400 clamp(2.25rem, 6cqw, 5.5rem)/.95 var(--mk-film-font); letter-spacing: -.04em; margin: 0 0 24px; text-transform: uppercase; }
1565
+ .mk-film-hero[data-mk-film-edge="organic"] .mk-film-hero__visual {
1566
+ clip-path: polygon(0 7%, 9% 8%, 20% 5%, 32% 2%, 43% 0, 54% 2%, 68% 6%, 82% 8%, 93% 6%, 100% 4%, 100% 100%, 0 100%);
1567
+ }
1568
+ @media (prefers-reduced-motion: reduce) { .mk-film-hero__media { transform: none; } }
1569
+
1570
+ /* recipes/editorial-reveal/editorial-reveal.css */
1571
+ .mk-editorial-reveal { position: relative; isolation: isolate; color: var(--mk-text); }
1572
+ .mk-editorial-reveal [data-mk-editorial-image], .mk-editorial-reveal [data-mk-editorial-card] { overflow: clip; border-radius: 12px; }
1573
+ .mk-editorial-reveal [data-mk-editorial-image] > :is(img,video,picture) { display: block; width: 100%; height: 100%; object-fit: cover; }
1574
+ .mk-editorial-reveal [data-mk-editorial-card] { display: grid; gap: 20px; padding: 24px; background: var(--mk-surface-2); color: inherit; text-decoration: none; transition: background-color .5s cubic-bezier(.6, 0, 0, 1), color .5s cubic-bezier(.6, 0, 0, 1); }
1575
+ .mk-editorial-reveal [data-mk-editorial-card][data-mk-editorial-active] { background: var(--mk-accent); color: var(--mk-on-accent); }
1576
+ .mk-editorial-reveal [data-mk-editorial-card-image] { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; border-radius: 8px; }
1577
+ .mk-editorial-reveal [data-mk-editorial-button] { display: inline-flex; overflow: clip; align-items: center; padding: 12px 18px; border: 1px solid var(--mk-outline-soft); border-radius: 8px; background: var(--mk-text); color: var(--mk-surface); text-decoration: none; font: inherit; cursor: pointer; }
1578
+ .mk-editorial-reveal [data-mk-editorial-button-content] { position: relative; display: flex; align-items: center; gap: 1em; padding-inline-end: 2.25em; }
1579
+ .mk-editorial-reveal [data-mk-editorial-button-content]::before, .mk-editorial-reveal [data-mk-editorial-button-content]::after { content: '↗'; position: absolute; inset-block-start: 0; }
1580
+ .mk-editorial-reveal [data-mk-editorial-button-content]::before { inset-inline-start: -2.25em; }
1581
+ .mk-editorial-reveal [data-mk-editorial-button-content]::after { inset-inline-end: 0; }
1582
+ .mk-editorial-reveal [data-mk-editorial-cursor] { pointer-events: none; position: absolute; z-index: 3; inset: 0 auto auto 0; width: max-content; height: max-content; padding: 10px 14px; border-radius: 30px; background: var(--mk-text); color: var(--mk-surface); font-size: .75rem; }
1583
+ .mk-editorial-reveal [hidden] { display: none !important; }
1584
+ .mk-editorial-reveal [data-mk-editorial-header][data-mk-on='dark'] { color: var(--mk-surface); }
1585
+ .mk-editorial-reveal :is(a,button,input,textarea):focus-visible { outline: 2px solid var(--mk-accent); outline-offset: 4px; }
1586
+ .mk-editorial-reveal [data-mk-editorial-group] [data-mk-cascade='rise'] { position: relative; }
1587
+ @media (prefers-reduced-motion: reduce) { .mk-editorial-reveal *, .mk-editorial-reveal *::after, .mk-editorial-reveal *::before { animation: none !important; transition: none !important; } }
1588
+
1589
+ /* recipes/weight-hover/weight-hover.css */
1590
+ /* weight-hover — each letter carries its own axis value; the font must be variable. */
1591
+ .mk-weight-hover {
1592
+ font-kerning: none;
1593
+ }
1594
+ .mk-weight-hover__visual [data-mk-weight-char] {
1595
+ will-change: font-variation-settings;
1596
+ }
1597
+
1598
+ /* recipes/sticker/sticker.css */
1599
+ /* sticker — die-cut holographic sticker (DOVV Studio). Place it with position/left/top; tilt it with --mk-sticker-rot. */
1600
+ .mk-sticker {
1601
+ --mk-sticker-rot: 0deg;
1602
+ --mk-sticker-foil: linear-gradient(115deg, #ed4a1c, #ff6a3d 18%, #ff8f5e 34%, #ff4f7a 52%, #ed4a1c 68%, #ff7a3d 84%, #ed4a1c);
1603
+ --mk-sticker-ink: #fff;
1604
+ display: inline-block;
1605
+ cursor: grab;
1606
+ touch-action: none;
1607
+ user-select: none;
1608
+ -webkit-user-select: none;
1609
+ scale: var(--mk-sticker-scale, 1);
1610
+ transform: rotate(var(--mk-sticker-rot));
1611
+ filter: drop-shadow(0 8px 14px rgb(0 0 0 / 0.16));
1612
+ transition: transform 0.4s var(--mk-ease-slot), filter 0.3s;
1613
+ animation: mk-sticker-pop 0.7s var(--mk-ease-slot) backwards;
1614
+ animation-delay: var(--mk-sticker-delay, 0s);
1615
+ }
1616
+ @media (hover: hover) {
1617
+ .mk-sticker:hover { transform: rotate(calc(var(--mk-sticker-rot) * -0.6)) scale(1.08); }
1618
+ }
1619
+ /* The engine freezes the pose it had at the press (inline transform), so there is no snap here. */
1620
+ .mk-sticker[data-mk-peeling],
1621
+ .mk-sticker[data-mk-peeling]:hover {
1622
+ transition: none;
1623
+ cursor: grabbing;
1624
+ }
1625
+ .mk-sticker[data-mk-carried] { cursor: grabbing; }
1626
+ .mk-sticker[data-mk-away] { visibility: hidden; }
1627
+ @keyframes mk-sticker-pop {
1628
+ 0% { opacity: 0; scale: 0.4; }
1629
+ }
1630
+
1631
+ /* Peel layers: the top is clipped at the fold; the back is a reflected copy whose
1632
+ face is clipped (inner) while the shadow lives on the outer layer, outside the clip. */
1633
+ .mk-sticker__peel { position: relative; display: inline-block; vertical-align: top; }
1634
+ .mk-sticker__top { display: block; }
1635
+ .mk-sticker__back {
1636
+ position: absolute;
1637
+ left: 0;
1638
+ top: 0;
1639
+ width: 100%;
1640
+ height: 100%;
1641
+ transform-origin: 0 0;
1642
+ visibility: hidden;
1643
+ pointer-events: none;
1644
+ filter: drop-shadow(0 0 1.5px rgb(0 0 0 / 0.3)) drop-shadow(0 0 7px rgb(0 0 0 / 0.22));
1645
+ }
1646
+ .mk-sticker__back-face { width: 100%; height: 100%; }
1647
+ /* Paper backing: brightest along the fold, a little grey towards the lifted tip. */
1648
+ .mk-sticker:not([data-mk-sticker-back='silhouette']) .mk-sticker__back-face :is(.mk-sticker__art, .mk-sticker__pill, .mk-sticker__badge) {
1649
+ /* The gradient runs under the die-cut border too, so the back reads as one piece of paper. */
1650
+ background: linear-gradient(var(--mk-sticker-fold, 90deg), #fff 0%, #f6f6f4 40%, #e2e2de 100%) border-box !important;
1651
+ color: transparent !important;
1652
+ border-color: transparent !important;
1653
+ }
1654
+ .mk-sticker__back-face :is(.mk-sticker__art, .mk-sticker__pill, .mk-sticker__badge) * { visibility: hidden; }
1655
+ .mk-sticker__back-face :is(.mk-sticker__art, .mk-sticker__pill, .mk-sticker__badge)::after { display: none; }
1656
+ /* Free-form art (an <img> or <svg> shape): a white silhouette of it instead. */
1657
+ .mk-sticker[data-mk-sticker-back='silhouette'] .mk-sticker__back-face { filter: brightness(0) invert(0.95); }
1658
+
1659
+ /* Art: a pill, a round badge or any element with .mk-sticker__art. The white die-cut border is part of the art. */
1660
+ .mk-sticker__art,
1661
+ .mk-sticker__pill,
1662
+ .mk-sticker__badge {
1663
+ position: relative;
1664
+ display: block;
1665
+ overflow: hidden;
1666
+ isolation: isolate;
1667
+ color: var(--mk-sticker-ink);
1668
+ border: 4px solid #fff;
1669
+ }
1670
+ .mk-sticker__pill {
1671
+ padding: 0.6em 1.1em;
1672
+ border-radius: 999px;
1673
+ font-weight: 800;
1674
+ font-size: 1.15rem;
1675
+ letter-spacing: -0.02em;
1676
+ white-space: nowrap;
1677
+ }
1678
+ .mk-sticker__badge {
1679
+ display: grid;
1680
+ place-items: center;
1681
+ width: var(--mk-sticker-size, 7rem);
1682
+ aspect-ratio: 1;
1683
+ border-radius: 50%;
1684
+ font-weight: 800;
1685
+ text-align: center;
1686
+ }
1687
+ .mk-sticker__art { border-radius: var(--mk-sticker-radius, 24px); }
1688
+ .mk-sticker[data-mk-holo] :is(.mk-sticker__art, .mk-sticker__pill, .mk-sticker__badge) {
1689
+ background: var(--mk-sticker-foil);
1690
+ background-size: 220% 220%;
1691
+ background-position: calc(var(--mk-sticker-x, 0.5) * 100%) calc(var(--mk-sticker-y, 0.5) * 100%);
1692
+ }
1693
+ .mk-sticker[data-mk-holo] :is(.mk-sticker__art, .mk-sticker__pill, .mk-sticker__badge)::after {
1694
+ content: '';
1695
+ position: absolute;
1696
+ inset: 0;
1697
+ z-index: -1;
1698
+ pointer-events: none;
1699
+ background: radial-gradient(circle at calc(var(--mk-sticker-x, 0.5) * 100%) calc(var(--mk-sticker-y, 0.5) * 100%), rgb(255 255 255 / 0.7), transparent 65%);
1700
+ mix-blend-mode: soft-light;
1701
+ opacity: 0.9;
1702
+ }
1703
+ .mk-sticker--pink { --mk-sticker-foil: linear-gradient(115deg, #ff7ac6, #c084fc 22%, #ffb3e1 44%, #7dd3fc 66%, #ff7ac6 84%, #f0abfc); --mk-sticker-ink: #3d0a26; }
1704
+ .mk-sticker--blue { --mk-sticker-foil: linear-gradient(115deg, #2e90fa, #7c5cff 25%, #38bdf8 50%, #2e90fa 75%, #a78bfa); --mk-sticker-ink: #fff; }
1705
+ .mk-sticker--lime { --mk-sticker-foil: linear-gradient(115deg, #c6f432, #fef08a 25%, #5eead4 50%, #a3e635 75%, #c6f432); --mk-sticker-ink: #1d2a00; }
1706
+ .mk-sticker--gold { --mk-sticker-foil: linear-gradient(115deg, #facc15, #fde68a 25%, #f59e0b 50%, #fef3c7 70%, #eab308); --mk-sticker-ink: #1a1a1a; }
1707
+
1708
+ @media (prefers-reduced-motion: reduce) {
1709
+ .mk-sticker { animation: none; transition: none; }
1710
+ }
1711
+
1712
+ /* recipes/scroll-dock/scroll-dock.css */
1713
+ /* scroll-dock — inverted capsule at the bottom centre; rises with a soft overshoot. */
1714
+ .mk-scroll-dock {
1715
+ position: fixed;
1716
+ left: 50%;
1717
+ bottom: var(--mk-scroll-dock-bottom, 24px);
1718
+ z-index: 20;
1719
+ display: flex;
1720
+ gap: 4px;
1721
+ max-width: calc(100vw - 32px);
1722
+ padding: 6px;
1723
+ /* Too many items for the width: scroll inside the capsule, never overflow the page. */
1724
+ overflow-x: auto;
1725
+ scrollbar-width: none;
1726
+ border-radius: 100px;
1727
+ background: var(--mk-text);
1728
+ color: var(--mk-bg);
1729
+ box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--mk-bg) 20%, transparent), 0 12px 30px -10px rgb(0 0 0 / 0.5);
1730
+ opacity: 0;
1731
+ pointer-events: none;
1732
+ transform: translate(-50%, 140%);
1733
+ transition: transform 0.6s cubic-bezier(0.32, 1.25, 0.5, 1), opacity 0.3s;
1734
+ }
1735
+ .mk-scroll-dock[data-mk-visible],
1736
+ .mk-scroll-dock:focus-within {
1737
+ opacity: 1;
1738
+ pointer-events: auto;
1739
+ transform: translate(-50%, 0);
1740
+ }
1741
+ /* Inside a scrolling container: sticks to its bottom edge instead of the viewport's.
1742
+ Scrollable overflow counts the un-stuck box plus its transform, so the negative
1743
+ margin lifts that box by its height + bottom gap and the hide offset equals the
1744
+ gap: nothing reaches past the last section, no empty band at the end. */
1745
+ .mk-scroll-dock--sticky {
1746
+ position: sticky;
1747
+ left: auto;
1748
+ width: max-content;
1749
+ max-width: calc(100% - 16px);
1750
+ margin: calc(-1 * (var(--mk-scroll-dock-height, 58px) + var(--mk-scroll-dock-bottom, 24px))) auto 0;
1751
+ transform: translateY(var(--mk-scroll-dock-bottom, 24px)) scale(0.96);
1752
+ }
1753
+ .mk-scroll-dock--sticky:is([data-mk-visible], :focus-within) { transform: none; }
1754
+ .mk-scroll-dock > :is(a, button) {
1755
+ display: flex;
1756
+ align-items: center;
1757
+ gap: 8px;
1758
+ height: 46px;
1759
+ padding: 0 18px;
1760
+ border: 0;
1761
+ border-radius: 100px;
1762
+ background: transparent;
1763
+ color: inherit;
1764
+ font: inherit;
1765
+ font-size: 15px;
1766
+ font-weight: 500;
1767
+ white-space: nowrap;
1768
+ text-decoration: none;
1769
+ cursor: pointer;
1770
+ transition: background 0.25s;
1771
+ }
1772
+ .mk-scroll-dock > :is(a, button):hover { background: color-mix(in srgb, var(--mk-bg) 15%, transparent); }
1773
+ .mk-scroll-dock > :is(a, button):focus-visible { outline: 2px solid var(--mk-bg); outline-offset: -2px; }
1774
+ .mk-scroll-dock::-webkit-scrollbar { display: none; }
1775
+ /* Phones: a tab bar, icon over label, so four or five items fit in 360 px. */
1776
+ @media (max-width: 680px) {
1777
+ .mk-scroll-dock > :is(a, button) { flex-direction: column; justify-content: center; gap: 2px; height: 52px; padding: 0 12px; border-radius: 26px; font-size: 11px; }
1778
+ .mk-scroll-dock--sticky { margin-top: calc(-1 * (var(--mk-scroll-dock-height, 64px) + var(--mk-scroll-dock-bottom, 24px))); }
1779
+ }
1780
+ @media (prefers-reduced-motion: reduce) {
1781
+ .mk-scroll-dock { transition: opacity 0.2s; }
1782
+ }
1783
+
1248
1784
  /* css/controls/button.css */
1249
- /* .mk-button — Stepbro capsules. Default is the tonal primary container Stepbro uses on filled buttons. */
1785
+ /* .mk-button — Capsule buttons. Filled buttons default to the tonal primary container. */
1250
1786
  .mk-button {
1251
1787
  --mk-button-bg: var(--mk-accent-soft);
1252
1788
  --mk-button-fg: var(--mk-on-accent-soft);
@@ -1356,7 +1892,7 @@
1356
1892
  font-size: 24px;
1357
1893
  }
1358
1894
 
1359
- /* Stepbro's small buttons: 32 px, 16 px sides, radius 12. */
1895
+ /* small buttons: 32 px, 16 px sides, radius 12. */
1360
1896
  .mk-button--sm {
1361
1897
  --mk-button-height: 32px;
1362
1898
  --mk-button-padding: 16px;
@@ -1379,7 +1915,7 @@
1379
1915
  }
1380
1916
  }
1381
1917
 
1382
- /* Stepbro's press squash (buttonClickAnimation), on pointer focus only so tabbing does not bounce. */
1918
+ /* press squash (buttonClickAnimation), on pointer focus only so tabbing does not bounce. */
1383
1919
  .mk-button:focus:not(:focus-visible) {
1384
1920
  animation: mk-press 0.5s cubic-bezier(0.37, 1.42, 0.37, 1);
1385
1921
  }
@@ -1398,7 +1934,7 @@
1398
1934
  }
1399
1935
  }
1400
1936
 
1401
- /* Rolling label (Siena's Explore button): the text and its copy roll up, the arrow slides on, the fill inverts. */
1937
+ /* Rolling label: the text and its copy roll up, the arrow slides on, the fill inverts. */
1402
1938
  .mk-button--roll {
1403
1939
  overflow: hidden;
1404
1940
  background: transparent;
@@ -1475,7 +2011,7 @@
1475
2011
 
1476
2012
  /* css/controls/field.css */
1477
2013
  /*
1478
- * .mk-field — Stepbro's filled fields: container-high background, radius 16,
2014
+ * .mk-field — filled fields: container-high background, radius 16,
1479
2015
  * no bottom indicator; focus draws a ring in the accent colour.
1480
2016
  * <label class="mk-field"><span class="mk-field__label">…</span><input>…<span class="mk-field__hint">…</span></label>
1481
2017
  */
@@ -1553,7 +2089,7 @@
1553
2089
  animation: mk-vibrate 0.3s;
1554
2090
  }
1555
2091
 
1556
- /* Stepbro's error vibration: plays each time the field becomes invalid. */
2092
+ /* error vibration: plays each time the field becomes invalid. */
1557
2093
  @keyframes mk-vibrate {
1558
2094
  0% {
1559
2095
  transform: translate(0);
@@ -1674,7 +2210,7 @@
1674
2210
  }
1675
2211
 
1676
2212
  /* css/controls/checkbox.css */
1677
- /* .mk-checkbox — <input type="checkbox" class="mk-checkbox">: 18 px, radius 6 (Stepbro), check drawn in on-accent. */
2213
+ /* .mk-checkbox — <input type="checkbox" class="mk-checkbox">: 18 px, radius 6, check drawn in on-accent. */
1678
2214
  .mk-checkbox {
1679
2215
  position: relative;
1680
2216
  display: inline-grid;
@@ -1729,7 +2265,7 @@
1729
2265
  }
1730
2266
 
1731
2267
  /* css/controls/chip.css */
1732
- /* .mk-chip — capsules on container-high; a pressed filter chip takes the primary container (Stepbro filter chips). */
2268
+ /* .mk-chip — capsules on container-high; a pressed filter chip takes the primary container. */
1733
2269
  .mk-chip {
1734
2270
  position: relative;
1735
2271
  display: inline-flex;
@@ -1907,11 +2443,11 @@
1907
2443
 
1908
2444
  /* css/controls/glass.css */
1909
2445
  /*
1910
- * .mk-glass — Dousan Miao's glass in one element: a translucent surface with a
2446
+ * .mk-glass — glass in one element: a translucent surface with a
1911
2447
  * 4 px backdrop blur, an optical ring (::before) whose conic highlight turns
1912
2448
  * from −75° to −125° on hover, and a specular band (::after) that slides and
1913
2449
  * tilts when pressed. <span class="mk-glass__shadow" aria-hidden="true"> inside
1914
- * adds Dousan's gradient shadow. Colours follow the theme's scheme (light-dark()).
2450
+ * adds gradient shadow. Colours follow the theme's scheme (light-dark()).
1915
2451
  */
1916
2452
  @property --mk-glass-angle-1 {
1917
2453
  syntax: '<angle>';
@@ -1954,7 +2490,7 @@
1954
2490
  isolation: isolate;
1955
2491
  border: 0;
1956
2492
  border-radius: 999vw;
1957
- /* Dousan: dark text on light, white on dark. */
2493
+ /* dark text on light, white on dark. */
1958
2494
  color: var(--mk-glass-fg, light-dark(#121212, #fff));
1959
2495
  background: linear-gradient(-75deg, var(--mk-glass-edge), var(--mk-glass-middle), var(--mk-glass-edge));
1960
2496
  box-shadow: var(--mk-glass-shadow);
@@ -2015,7 +2551,7 @@
2015
2551
  --mk-glass-angle-2 0.5s var(--mk-ease-glass);
2016
2552
  }
2017
2553
 
2018
- /* Dousan's gradient shadow (optional child). Only its lower part shows: it sits under the button. */
2554
+ /* gradient shadow (optional child). Only its lower part shows: it sits under the button. */
2019
2555
  .mk-glass__shadow {
2020
2556
  --mk-glass-cut: 2em;
2021
2557
  position: absolute;
@@ -2128,7 +2664,7 @@
2128
2664
  }
2129
2665
 
2130
2666
  /* css/controls/burger.css */
2131
- /* .mk-burger — Siena's menu icon: three lines that fold into an X when aria-expanded="true" (1.1 s, Siena's curve). */
2667
+ /* .mk-burger — menu icon: three lines that fold into an X when aria-expanded="true". */
2132
2668
  .mk-burger {
2133
2669
  --mk-burger-size: 24px;
2134
2670
  --mk-burger-line: 1.5px;
@@ -2196,8 +2732,73 @@
2196
2732
  }
2197
2733
  }
2198
2734
 
2735
+ /* css/controls/status.css */
2736
+ /* status — "Available for new projects" pill and a live dot whose halo pulses (DOVV Studio: 1.6 s ease-out, scale 1 → 2.6). */
2737
+ .mk-status {
2738
+ display: inline-flex;
2739
+ align-items: center;
2740
+ gap: 10px;
2741
+ height: 40px;
2742
+ padding: 0 16px 0 14px;
2743
+ border-radius: 100px;
2744
+ background: var(--mk-surface);
2745
+ color: var(--mk-text);
2746
+ font: inherit;
2747
+ font-size: 14px;
2748
+ font-weight: 500;
2749
+ letter-spacing: -0.01em;
2750
+ white-space: nowrap;
2751
+ text-decoration: none;
2752
+ box-shadow: 0 0 0 1px var(--mk-outline-soft), 0 6px 20px -8px rgb(0 0 0 / 0.18);
2753
+ transition: box-shadow 0.3s, transform 0.3s;
2754
+ }
2755
+ /* One line always: on phones the secondary half goes. */
2756
+ @media (max-width: 480px) {
2757
+ .mk-status > :is(.mk-status__sep, .mk-status__muted) { display: none; }
2758
+ }
2759
+ a.mk-status:hover,
2760
+ button.mk-status:hover {
2761
+ transform: translateY(-1px);
2762
+ box-shadow: 0 0 0 1px var(--mk-outline), 0 10px 24px -8px rgb(0 0 0 / 0.22);
2763
+ }
2764
+ .mk-status__sep { width: 1px; height: 14px; background: var(--mk-outline-soft); }
2765
+ .mk-status__muted { color: var(--mk-muted); }
2766
+ .mk-status > svg,
2767
+ .mk-status > .mk-icon { color: var(--mk-muted); transition: transform 0.3s; }
2768
+ .mk-status:hover > svg,
2769
+ .mk-status:hover > .mk-icon { transform: translateX(2px); }
2770
+ .mk-status__dot {
2771
+ --mk-status-color: #16c847;
2772
+ position: relative;
2773
+ display: inline-block;
2774
+ flex: none;
2775
+ width: 8px;
2776
+ height: 8px;
2777
+ border-radius: 50%;
2778
+ background: var(--mk-status-color);
2779
+ }
2780
+ .mk-status__dot::after {
2781
+ content: '';
2782
+ position: absolute;
2783
+ inset: 0;
2784
+ border-radius: inherit;
2785
+ background: inherit;
2786
+ animation: mk-status-pulse 1.6s ease-out infinite;
2787
+ }
2788
+ .mk-status__dot--busy { --mk-status-color: #f59e0b; }
2789
+ .mk-status__dot--off { --mk-status-color: var(--mk-muted); }
2790
+ .mk-status__dot--off::after { animation: none; }
2791
+ @keyframes mk-status-pulse {
2792
+ 0% { opacity: 0.6; transform: scale(1); }
2793
+ 100% { opacity: 0; transform: scale(2.6); }
2794
+ }
2795
+ @media (prefers-reduced-motion: reduce) {
2796
+ .mk-status { transition: none; }
2797
+ .mk-status__dot::after { animation: none; }
2798
+ }
2799
+
2199
2800
  /* css/effects/anim.css */
2200
- /* Stepbro's utility animations (shared stylesheet) and Dousan's strong shake. Replay them with animate(el, name). */
2801
+ /* utility animations (shared stylesheet) and strong shake. Replay them with animate(el, name). */
2201
2802
  .mk-anim-out {
2202
2803
  animation: mk-out 0.5s ease forwards;
2203
2804
  }
@@ -2423,7 +3024,7 @@
2423
3024
  }
2424
3025
 
2425
3026
  /* css/effects/loading.css */
2426
- /* Stepbro's loading sweeps (animation-loading-1 / -2) and hover shimmer (hover-magic-1). */
3027
+ /* loading sweeps (animation-loading-1 / -2) and hover shimmer (hover-magic-1). */
2427
3028
  .mk-loading {
2428
3029
  position: relative;
2429
3030
  overflow: hidden;
@@ -2485,7 +3086,7 @@
2485
3086
  }
2486
3087
 
2487
3088
  /* css/effects/text.css */
2488
- /* Stepbro's animated gradient text: a rainbow (6 s) and one in the theme's colours (8 s). */
3089
+ /* animated gradient text: a rainbow (6 s) and one in the theme's colours (8 s). */
2489
3090
  .mk-text-rainbow,
2490
3091
  .mk-text-gradient {
2491
3092
  -webkit-background-clip: text;
@@ -2554,7 +3155,7 @@
2554
3155
  }
2555
3156
 
2556
3157
  /* css/effects/frost.css */
2557
- /* .mk-frost — Dousan's progressive blur: five backdrop-blur layers with staggered masks, so the blur grows toward the edge. */
3158
+ /* .mk-frost — progressive blur: five backdrop-blur layers with staggered masks, so the blur grows toward the edge. */
2558
3159
  .mk-frost {
2559
3160
  --mk-frost-strength: 1;
2560
3161
  position: absolute;
@@ -2618,7 +3219,7 @@
2618
3219
  }
2619
3220
 
2620
3221
  /* css/effects/float.css */
2621
- /* .mk-float — Dousan's floating tags: a slow bob (ease-in-out, infinite); children of .mk-float-group alternate Dousan's five paths. */
3222
+ /* .mk-float — floating tags: a slow bob (ease-in-out, infinite); children of .mk-float-group alternate five paths. */
2622
3223
  .mk-float,
2623
3224
  .mk-float-group > * {
2624
3225
  --mk-float-y: 4px;
@@ -2684,7 +3285,7 @@
2684
3285
  }
2685
3286
 
2686
3287
  /* css/effects/grain.css */
2687
- /* .mk-grain — film grain (Siena's noise, .07) in CSS: an SVG turbulence tile that jumps between 8 places, like film. */
3288
+ /* .mk-grain — film grain in CSS: an SVG turbulence tile that jumps between 8 places, like film. */
2688
3289
  :where(.mk-grain) {
2689
3290
  position: relative;
2690
3291
  isolation: isolate;
@@ -2744,7 +3345,7 @@
2744
3345
  }
2745
3346
 
2746
3347
  /* css/effects/success.css */
2747
- /* .mk-success — Dousan's success mark: grows and untwists on a 260/18 spring after 0.15 s. Pair it with confetti(). */
3348
+ /* .mk-success — success mark: grows and untwists on a 260/18 spring after 0.15 s. Pair it with confetti(). */
2748
3349
  .mk-success {
2749
3350
  display: inline-grid;
2750
3351
  place-items: center;
@@ -2768,7 +3369,7 @@
2768
3369
  }
2769
3370
 
2770
3371
  /* css/effects/fade.css */
2771
- /* Siena's edge masks: content fades out at the edges of a strip or a column. */
3372
+ /* edge masks: content fades out at the edges of a strip or a column. */
2772
3373
  .mk-fade-x {
2773
3374
  -webkit-mask-image: linear-gradient(to right, transparent 0%, #000 20%, #000 80%, transparent 100%);
2774
3375
  mask-image: linear-gradient(to right, transparent 0%, #000 20%, #000 80%, transparent 100%);
@@ -2785,7 +3386,7 @@
2785
3386
  }
2786
3387
 
2787
3388
  /* components/theme-picker/theme-picker.css */
2788
- /* theme-picker — Stepbro's colour balls (from Kayro's accent swatches). */
3389
+ /* theme-picker — colour balls. */
2789
3390
  .mk-theme-picker,
2790
3391
  mk-theme-picker {
2791
3392
  --mk-swatch-size: 72px;
@@ -2901,7 +3502,7 @@ mk-theme-picker {
2901
3502
  }
2902
3503
 
2903
3504
  /* components/dialog/dialog.css */
2904
- /* dialog — Stepbro's modal surface: 400 px, radius 40, tonal surface; full screen under 680 px. */
3505
+ /* dialog — modal surface: 400 px, radius 40, tonal surface; full screen under 680 px. */
2905
3506
  .mk-dialog {
2906
3507
  --mk-dialog-bg: var(--mk-surface-2);
2907
3508
  --mk-dialog-radius: var(--mk-radius-dialog);
@@ -3121,7 +3722,7 @@ mk-dialog:not(:defined) {
3121
3722
  display: none;
3122
3723
  }
3123
3724
 
3124
- /* Phones: dialogs take the whole screen with square corners (Stepbro's responsive rules). */
3725
+ /* Phones: dialogs take the whole screen with square corners. */
3125
3726
  @media (max-width: 679px) {
3126
3727
  .mk-dialog:not([data-mk-placement='anchor']) {
3127
3728
  width: 100vw;
@@ -3141,7 +3742,7 @@ mk-dialog:not(:defined) {
3141
3742
  }
3142
3743
  }
3143
3744
 
3144
- /* Sheet (Dousan): pinned to the bottom, up to 720 px wide, rises from below. Also on phones. */
3745
+ /* Sheet: pinned to the bottom, up to 720 px wide, rises from below. Also on phones. */
3145
3746
  .mk-dialog[data-mk-variant='sheet'] {
3146
3747
  --mk-dialog-width: var(--mk-sheet-max-width, 720px);
3147
3748
  /* A modal <dialog> is inset: 0 — anchored only to the bottom, it takes its content's height. */
@@ -3161,7 +3762,7 @@ mk-dialog:not(:defined) {
3161
3762
  }
3162
3763
 
3163
3764
  /* components/menu/menu.css */
3164
- /* menu — Stepbro's translucent options panel that grows out of its button (an anchored .mk-dialog). */
3765
+ /* menu — translucent options panel that grows out of its button (an anchored .mk-dialog). */
3165
3766
  .mk-menu {
3166
3767
  --mk-menu-bg: color-mix(in srgb, var(--mk-surface-3) 78%, transparent);
3167
3768
  --mk-menu-radius: 28px;
@@ -3267,7 +3868,7 @@ mk-menu:not(:defined) {
3267
3868
  }
3268
3869
 
3269
3870
  /* components/toast/toast.css */
3270
- /* toast — Stepbro's deck at the top of the screen, above dialogs (top layer when popovers exist). */
3871
+ /* toast — deck at the top of the screen, above dialogs (top layer when popovers exist). */
3271
3872
  .mk-toaster {
3272
3873
  position: fixed;
3273
3874
  inset: 16px 0 auto;
@@ -3383,7 +3984,7 @@ mk-toaster {
3383
3984
  }
3384
3985
 
3385
3986
  /* components/chat-background/chat-background.css */
3386
- /* chat-background — Stepbro's PrettyBackground: two orbiting blobs and a grain, driven by energy. */
3987
+ /* chat-background — Chat background: two orbiting blobs and a grain, driven by energy. */
3387
3988
  .mk-chat-background,
3388
3989
  mk-chat-background {
3389
3990
  --mk-chat-orbit-1: 10s;
@@ -3431,7 +4032,7 @@ mk-chat-background::after {
3431
4032
  animation: mk-chat-blob-2 var(--mk-chat-orbit-2) linear infinite;
3432
4033
  }
3433
4034
 
3434
- /* Grain on top (Stepbro ships a PNG; this is SVG turbulence at the same 30 %). */
4035
+ /* Grain overlay using SVG turbulence at 30 %. */
3435
4036
  .mk-chat-background__noise {
3436
4037
  position: absolute;
3437
4038
  inset: 0;
@@ -3471,7 +4072,7 @@ mk-chat-background::after {
3471
4072
  }
3472
4073
 
3473
4074
  /* components/chat/chat.css */
3474
- /* chat — Stepbro's PrettyChat: glass bubbles over the live background, a soft fade at the bottom, a 64 px composer. */
4075
+ /* chat — Chat: glass bubbles over the live background, a soft fade at the bottom, a 64 px composer. */
3475
4076
  .mk-chat,
3476
4077
  mk-chat {
3477
4078
  --mk-chat-radius: var(--mk-radius-2xl);
@@ -3710,11 +4311,7 @@ mk-chat > mk-chat-background {
3710
4311
 
3711
4312
  /* components/nav/nav.css */
3712
4313
  /*
3713
- * nav — Stepbro's navigation (Money and Tasks): seven desktop styles and one
3714
- * mobile bar under 680 px, inside an app shell. Ported from Stepbro's
3715
- * `.app-nav.style-N` rules: .app-container → .mk-shell, .app-view → .mk-shell__view,
3716
- * .nav-button → .mk-nav__button, [active=true] → [aria-current="page"],
3717
- * variant-1 → .mk-nav--accent.
4314
+ * nav — seven desktop styles and one mobile bar under 680 px, inside an app shell.
3718
4315
  */
3719
4316
 
3720
4317
  /* Shell: the view and the nav side by side (the nav first), stacked on phones. */
@@ -4764,7 +5361,7 @@ mk-chat > mk-chat-background {
4764
5361
  }
4765
5362
 
4766
5363
  /* components/steps/steps.css */
4767
- /* steps — Stepbro's onboarding: one step at a time, centred in a column up to 600 px wide. */
5364
+ /* steps — onboarding: one step at a time, centred in a column up to 600 px wide. */
4768
5365
  .mk-steps,
4769
5366
  mk-steps {
4770
5367
  position: relative;
@@ -4777,7 +5374,7 @@ mk-steps {
4777
5374
  font-family: var(--mk-font);
4778
5375
  }
4779
5376
 
4780
- /* Stepbro's onboarding background runs at 20 %. */
5377
+ /* onboarding background runs at 20 %. */
4781
5378
  :is(.mk-steps, mk-steps) > :is(.mk-chat-background, mk-chat-background) {
4782
5379
  --mk-chat-background-opacity: 0.2;
4783
5380
  }
@@ -4815,7 +5412,7 @@ mk-steps {
4815
5412
  }
4816
5413
 
4817
5414
  /* components/cursor/cursor.css */
4818
- /* cursor — Dousan's glass chip and Siena's dot. The layer follows the pointer; the engine writes its transform. */
5415
+ /* cursor — glass chip and dot. The layer follows the pointer; the engine writes its transform. */
4819
5416
  .mk-cursor {
4820
5417
  position: fixed;
4821
5418
  top: 0;
@@ -4825,7 +5422,7 @@ mk-steps {
4825
5422
  will-change: transform;
4826
5423
  }
4827
5424
 
4828
- /* chip (Dousan): a .mk-glass label; ink follows the background under it. */
5425
+ /* chip: a .mk-glass label; ink follows the background under it. */
4829
5426
  .mk-cursor__chip {
4830
5427
  --mk-glass-fg: #fff;
4831
5428
  display: inline-flex;
@@ -4863,7 +5460,7 @@ mk-steps {
4863
5460
  display: none;
4864
5461
  }
4865
5462
 
4866
- /* dot (Siena): a disc with a word and two arrows that slide in when pressed. */
5463
+ /* dot: a disc with a word and two arrows that slide in when pressed. */
4867
5464
  .mk-cursor--dot {
4868
5465
  --mk-cursor-size: 88px;
4869
5466
  transition: opacity 0.15s var(--mk-ease-quint);
@@ -4995,7 +5592,7 @@ mk-cursor {
4995
5592
 
4996
5593
  /* components/island/island.css */
4997
5594
  /*
4998
- * iyo.ai's floating navbar: frosted glass pill at the top that grows into a
5595
+ * floating navbar: frosted glass pill at the top that grows into a
4999
5596
  * panel. Fixed over the page by default; .mk-island--contained keeps it (and its
5000
5597
  * backdrop) inside a positioned parent, for previews.
5001
5598
  */
@@ -5294,3 +5891,419 @@ mk-cursor {
5294
5891
  transition: none !important;
5295
5892
  }
5296
5893
  }
5894
+
5895
+ /* components/quantity/quantity.css */
5896
+ .mk-quantity, mk-quantity { display: inline-flex; align-items: center; gap: .5rem; --mk-quantity-size: 3rem; }
5897
+ .mk-quantity [data-mk-quantity-decrease], .mk-quantity [data-mk-quantity-increase], mk-quantity button {
5898
+ width: var(--mk-quantity-size); height: var(--mk-quantity-size); border: 0; border-radius: 50%;
5899
+ background: var(--mk-secondary-soft); color: var(--mk-on-secondary-soft); font: inherit; font-size: 1.65rem;
5900
+ cursor: pointer; transition: transform .4s cubic-bezier(.28,.71,0,.98), opacity .2s;
5901
+ }
5902
+ .mk-quantity [data-mk-quantity-increase], mk-quantity [data-mk-quantity-increase] { background: var(--mk-accent-soft); color: var(--mk-on-accent-soft); }
5903
+ .mk-quantity button:is(:hover,:focus-visible):not(:disabled), mk-quantity button:is(:hover,:focus-visible):not(:disabled) {
5904
+ transform: rotate(15deg); mask-image: radial-gradient(circle at 100% 0, transparent 22%, #000 23%);
5905
+ }
5906
+ .mk-quantity button:focus-visible, mk-quantity button:focus-visible { outline: 2px solid var(--mk-accent); outline-offset: 4px; }
5907
+ .mk-quantity button:disabled, mk-quantity button:disabled { opacity: .4; cursor: default; }
5908
+ .mk-quantity input, mk-quantity input { width: 3.5rem; padding: .4rem 0; border: 0; border-radius: var(--mk-radius-sm); text-align: center; font: inherit; font-variant-numeric: tabular-nums; background: transparent; color: var(--mk-text); appearance: textfield; }
5909
+ .mk-quantity input::-webkit-inner-spin-button, mk-quantity input::-webkit-inner-spin-button { appearance: none; }
5910
+ @media (prefers-reduced-motion: reduce) { .mk-quantity button, mk-quantity button { transition: none; transform: none !important; } }
5911
+
5912
+ /* components/pagination/pagination.css */
5913
+ .mk-pagination, mk-pagination { display: flex; flex-wrap: wrap; justify-content: center; align-items: center; gap: .35rem; }
5914
+ .mk-pagination [data-mk-pagination-pages], mk-pagination [data-mk-pagination-pages] { display: flex; align-items: center; gap: .25rem; }
5915
+ .mk-pagination button, mk-pagination button { min-width: 2.5rem; height: 2.5rem; border: 0; border-radius: var(--mk-radius-full); background: var(--mk-surface-2); color: var(--mk-text); font: inherit; cursor: pointer; transition: transform .3s, background .3s, color .3s; }
5916
+ .mk-pagination button[aria-current], mk-pagination button[aria-current] { background: var(--mk-accent); color: var(--mk-on-accent); }
5917
+ .mk-pagination button:hover:not(:disabled), mk-pagination button:hover:not(:disabled) { transform: translateY(-3px); }
5918
+ .mk-pagination button:active:not(:disabled), mk-pagination button:active:not(:disabled) { transform: scale(.9); }
5919
+ .mk-pagination button:focus-visible, mk-pagination button:focus-visible { outline: 2px solid var(--mk-accent); outline-offset: 3px; }
5920
+ .mk-pagination button:disabled, mk-pagination button:disabled { opacity: .35; cursor: default; }
5921
+ .mk-pagination__gap { padding: 0 .15rem; color: var(--mk-muted); }
5922
+ @media (prefers-reduced-motion: reduce) { .mk-pagination button, mk-pagination button { transition: none; transform: none !important; } }
5923
+
5924
+ /* components/hover-card/hover-card.css */
5925
+ .mk-hover-card, mk-hover-card { position: relative; display: inline-flex; }
5926
+ .mk-hover-card [data-mk-hover-panel], mk-hover-card [data-mk-hover-panel] {
5927
+ position: absolute; z-index: 10; bottom: calc(100% + .75rem); left: 0;
5928
+ width: min(19rem, calc(100vw - 3rem)); padding: 1.25rem; border-radius: var(--mk-radius-lg);
5929
+ color: var(--mk-text); background: var(--mk-surface-3); border: 1px solid var(--mk-outline-soft);
5930
+ box-shadow: 0 12px 40px color-mix(in srgb, var(--mk-shadow-color) 20%, transparent);
5931
+ animation: mk-hover-card-in .28s cubic-bezier(.2,.8,.2,1) both;
5932
+ }
5933
+ .mk-hover-card [data-mk-hover-panel]::after, mk-hover-card [data-mk-hover-panel]::after { content: ''; position: absolute; inset: -1rem 0; z-index: -1; }
5934
+ .mk-hover-card[data-mk-placement=bottom] [data-mk-hover-panel], mk-hover-card[data-mk-placement=bottom] [data-mk-hover-panel] { top: calc(100% + .75rem); bottom: auto; }
5935
+ .mk-hover-card [hidden], mk-hover-card [hidden] { display: none !important; }
5936
+ @keyframes mk-hover-card-in { from { opacity: 0; transform: translateY(7px) scale(.97); } to { opacity: 1; transform: none; } }
5937
+ @media (prefers-reduced-motion: reduce) { .mk-hover-card [data-mk-hover-panel], mk-hover-card [data-mk-hover-panel] { animation: none; } }
5938
+
5939
+ /* components/input-otp/input-otp.css */
5940
+ .mk-input-otp, mk-input-otp { --mk-otp-size: 2.75rem; --mk-otp-gap: .4rem; display: inline-block; position: relative; max-width: 100%; }
5941
+ .mk-input-otp [data-mk-otp-slots], mk-input-otp [data-mk-otp-slots] { display: flex; flex-wrap: wrap; gap: var(--mk-otp-gap); }
5942
+ .mk-input-otp__slot { box-sizing: border-box; width: var(--mk-otp-size); height: 3.5rem; display: grid; place-items: center; border: 1px solid var(--mk-outline-soft); border-radius: var(--mk-radius-sm); color: var(--mk-text); background: var(--mk-surface-1); font: 1.5rem var(--mk-font-mono, monospace); transition: border-color .2s, background .2s, transform .2s; }
5943
+ .mk-input-otp__slot[data-mk-active] { outline: 2px solid var(--mk-accent); outline-offset: 2px; background: var(--mk-accent-soft); color: var(--mk-on-accent-soft); transform: translateY(-2px); }
5944
+ .mk-input-otp [data-mk-otp-input], mk-input-otp [data-mk-otp-input] { position: absolute; inset: 0; box-sizing: border-box; width: 100%; height: 100%; border: 0; background: transparent; color: transparent; caret-color: transparent; outline: 0; font: 1.5rem var(--mk-font-mono, monospace); letter-spacing: calc(var(--mk-otp-size) + var(--mk-otp-gap) - 1ch); padding: 0 0 0 calc((var(--mk-otp-size) - 1ch) / 2); }
5945
+ .mk-input-otp:has([aria-invalid=true]) .mk-input-otp__slot, mk-input-otp:has([aria-invalid=true]) .mk-input-otp__slot { border-color: var(--mk-error); }
5946
+ .mk-input-otp:has(:disabled), mk-input-otp:has(:disabled) { opacity: .45; }
5947
+ @media (max-width: 420px) { .mk-input-otp, mk-input-otp { --mk-otp-size: 2.25rem; --mk-otp-gap: .3rem; } }
5948
+ @media (prefers-reduced-motion: reduce) { .mk-input-otp__slot { transition: none; transform: none !important; } }
5949
+
5950
+ /* components/studio-dock/studio-dock.css */
5951
+ .mk-studio-dock { position: relative; isolation: isolate; width: min(343px, 100%); color: var(--mk-text); font: inherit; }
5952
+ .mk-studio-dock--fixed { position: fixed; z-index: 70; inset-block-end: 24px; inset-inline-start: 50%; translate: -50% 0; width: min(343px, calc(100vw - 32px)); }
5953
+ .mk-studio-dock__bar { display: flex; align-items: center; gap: 16px; min-height: 64px; padding: 12px; border-radius: 18px; background: var(--mk-surface-2); }
5954
+ .mk-studio-dock__brand, .mk-studio-dock__toggle { display: grid; place-items: center; inline-size: 40px; block-size: 40px; flex: none; border: 0; border-radius: 10px; background: var(--mk-surface); color: inherit; text-decoration: none; font: inherit; }
5955
+ .mk-studio-dock__label { flex: 1; font-size: .9rem; }
5956
+ .mk-studio-dock__toggle { cursor: pointer; }
5957
+ .mk-studio-dock__toggle span { transition: transform .4s; }
5958
+ .mk-studio-dock[data-mk-studio-open] .mk-studio-dock__toggle span { transform: rotate(45deg); }
5959
+ .mk-studio-dock__panel { position: absolute; z-index: 2; inset-inline: 0; inset-block-end: var(--mk-studio-dock-offset, 76px); max-height: min(660px, 75dvh, var(--mk-studio-dock-space, 660px)); overflow: auto; overscroll-behavior: contain; padding: 12px; border: 1px solid var(--mk-outline-soft); border-radius: 18px; background: var(--mk-surface-2); box-shadow: 0 16px 60px #0002; }
5960
+ /* Not enough room above the bar: the engine opens the sheet below it. */
5961
+ .mk-studio-dock[data-mk-studio-below] .mk-studio-dock__panel { inset-block: var(--mk-studio-dock-offset, 76px) auto; }
5962
+ .mk-studio-dock [hidden] { display: none !important; }
5963
+ .mk-studio-dock__grid, .mk-studio-dock__page { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
5964
+ .mk-studio-dock__tile { min-height: 130px; display: flex; flex-direction: column; justify-content: flex-end; gap: 4px; padding: 12px; border-radius: 10px; background: var(--mk-surface); color: inherit; text-decoration: none; transition: transform .4s cubic-bezier(.2, 1.4, .4, 1); }
5965
+ .mk-studio-dock__tile small { color: var(--mk-muted); }
5966
+ .mk-studio-dock__tile:is(:hover, :focus-visible) { transform: scale(.94); }
5967
+ .mk-studio-dock__reel { display: flex; justify-content: space-between; align-items: end; min-height: 154px; margin-block: 12px; padding: 16px; border-radius: 10px; background: var(--mk-accent); color: var(--mk-on-accent); }
5968
+ .mk-studio-dock__reel button { border: 1px solid currentColor; border-radius: 50%; padding: 14px; background: transparent; color: inherit; font: inherit; cursor: pointer; }
5969
+ .mk-studio-dock__slide-track { position: relative; display: flex; align-items: center; height: 64px; padding: 4px; margin-block: 12px; border-radius: 48px; background: var(--mk-surface-3, var(--mk-surface)); }
5970
+ .mk-studio-dock__slide-track > span { position: absolute; inset-inline: 60px 12px; text-align: center; font-size: .75rem; pointer-events: none; }
5971
+ .mk-studio-dock [data-mk-studio-slide] { position: relative; display: grid; place-items: center; width: 56px; height: 56px; border: 0; border-radius: 50%; background: var(--mk-surface); color: inherit; font-size: 20px; cursor: pointer; touch-action: pan-y; transform: translateX(var(--mk-studio-drag, 0px)); }
5972
+ .mk-studio-dock__clock { position: relative; aspect-ratio: 1; display: grid; place-content: center; gap: 4px; text-align: center; border: 10px solid var(--mk-surface); border-radius: 50%; background: var(--mk-surface-2); }
5973
+ .mk-studio-dock__clock::after { content: ''; position: absolute; inset: 8px; border: 1px solid var(--mk-outline-soft); border-radius: 50%; }
5974
+ .mk-studio-dock__clock small { color: var(--mk-muted); }
5975
+ .mk-studio-dock__pages { margin-block-start: 12px; }
5976
+ .mk-studio-dock__pagination { display: flex; justify-content: center; gap: 8px; margin-block-start: 12px; }
5977
+ .mk-studio-dock__pagination button { width: 32px; height: 32px; padding: 0; border: 0; border-radius: 50%; background: var(--mk-surface); color: inherit; font: inherit; cursor: pointer; }
5978
+ .mk-studio-dock__pagination [aria-current] { background: var(--mk-accent); color: var(--mk-on-accent); }
5979
+ .mk-studio-dock__view { display: grid; gap: 16px; padding: 12px 0; }
5980
+ .mk-studio-dock__view input, .mk-studio-dock__view textarea { width: 100%; padding: 12px; border: 1px solid var(--mk-outline-soft); border-radius: 8px; background: var(--mk-surface); color: inherit; font: inherit; }
5981
+ .mk-studio-dock__view label { display: grid; gap: 6px; }
5982
+ .mk-studio-dock__view video { width: 100%; border-radius: 10px; }
5983
+ .mk-studio-dock :is(button,a,input,textarea):focus-visible { outline: 2px solid var(--mk-accent); outline-offset: 3px; }
5984
+ @media (prefers-reduced-motion: reduce) { .mk-studio-dock *, .mk-studio-dock *::after { transition: none !important; animation: none !important; } }
5985
+
5986
+ /* components/trailer/trailer.css */
5987
+ .mk-trailer {
5988
+ --mk-trailer-ink: #f6f3e8;
5989
+ --mk-trailer-paper: #131816;
5990
+ width: min(1100px, calc(100vw - 32px));
5991
+ max-width: none;
5992
+ max-height: calc(100dvh - 32px);
5993
+ padding: 0;
5994
+ border: 0;
5995
+ border-radius: 0;
5996
+ color: var(--mk-trailer-ink);
5997
+ background: var(--mk-trailer-paper);
5998
+ overflow: auto;
5999
+ margin: auto;
6000
+ }
6001
+ .mk-trailer::backdrop { background: rgb(4 10 7 / .8); }
6002
+ .mk-trailer__header { display: flex; align-items: center; justify-content: space-between; gap: 20px; padding: 16px 20px; }
6003
+ .mk-trailer__title { font: 500 .75rem/1.5 var(--mk-font-mono, monospace); text-transform: uppercase; letter-spacing: .16em; margin: 0; }
6004
+ .mk-trailer video { display: block; width: 100%; aspect-ratio: 16 / 9; object-fit: contain; background: #060b08; }
6005
+ .mk-trailer [data-mk-trailer-stage]:fullscreen { display: flex; flex-direction: column; justify-content: center; width: 100%; height: 100%; background: var(--mk-trailer-paper); color: var(--mk-trailer-ink); }
6006
+ .mk-trailer [data-mk-trailer-stage]:fullscreen video { max-height: calc(100dvh - 90px); }
6007
+ .mk-trailer__controls { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; padding: 10px 20px 16px; font: .7rem/1.5 var(--mk-font-mono, monospace); }
6008
+ .mk-trailer button { display: grid; place-items: center; min-width: 44px; min-height: 44px; border: 1px solid currentColor; color: inherit; background: transparent; cursor: pointer; font: inherit; }
6009
+ .mk-trailer button:hover { background: rgb(255 255 255 / .12); }
6010
+ .mk-trailer button:focus-visible, .mk-trailer input:focus-visible { outline: 2px solid #e5ff96; outline-offset: 4px; }
6011
+ .mk-trailer button svg { width: 18px; height: 18px; fill: currentColor; }
6012
+ .mk-trailer [data-mk-trailer-seek] { flex: 1; min-width: 70px; accent-color: #d6f2ac; }
6013
+ .mk-trailer [data-mk-trailer-volume] { width: 72px; accent-color: #d6f2ac; }
6014
+ .mk-trailer [data-mk-trailer-time] { white-space: nowrap; }
6015
+ .mk-trailer [data-mk-trailer-status] { padding: 0 20px; font: .8rem/1.5 var(--mk-font, sans-serif); }
6016
+ .mk-trailer [data-mk-trailer-status]:empty { display: none; }
6017
+ .mk-trailer__pause-icon, .mk-trailer__sound-off { display: none; }
6018
+ .mk-trailer [data-mk-trailer-play][aria-pressed="true"] .mk-trailer__play-icon,
6019
+ .mk-trailer [data-mk-trailer-mute][aria-pressed="true"] .mk-trailer__sound-on { display: none; }
6020
+ .mk-trailer [data-mk-trailer-play][aria-pressed="true"] .mk-trailer__pause-icon,
6021
+ .mk-trailer [data-mk-trailer-mute][aria-pressed="true"] .mk-trailer__sound-off { display: block; }
6022
+ @media (max-width: 540px) { .mk-trailer [data-mk-trailer-volume] { display: none; } .mk-trailer__controls { gap: 8px; padding-inline: 12px; } .mk-trailer [data-mk-trailer-seek] { flex-basis: 100%; order: -1; } }
6023
+
6024
+ /* components/calendar/calendar.css */
6025
+ /* calendar — Melon Mind's month/week grid on the --mk-* tokens; parts are .mk-calendar__*. */
6026
+ .mk-calendar,
6027
+ mk-calendar {
6028
+ --mk-calendar-gap: 6px;
6029
+ --mk-calendar-radius: var(--mk-radius-lg);
6030
+ --mk-calendar-day-height: 112px;
6031
+ display: flex;
6032
+ flex-direction: column;
6033
+ gap: var(--mk-space-3);
6034
+ color: var(--mk-text);
6035
+ }
6036
+ .mk-calendar__header {
6037
+ display: flex;
6038
+ flex-wrap: wrap;
6039
+ align-items: center;
6040
+ gap: var(--mk-space-2);
6041
+ }
6042
+ .mk-calendar__title { margin: 0 auto 0 0; font-size: clamp(1.4rem, 2.6vw, 2rem); font-weight: 400; letter-spacing: -0.01em; }
6043
+ .mk-calendar__views { display: inline-flex; padding: 4px; gap: 2px; border-radius: var(--mk-radius-full); background: var(--mk-surface-3); }
6044
+ .mk-calendar__views button,
6045
+ .mk-calendar__nav {
6046
+ display: inline-grid;
6047
+ place-items: center;
6048
+ min-width: 44px;
6049
+ height: 44px;
6050
+ padding: 0 12px;
6051
+ border: 0;
6052
+ border-radius: var(--mk-radius-full);
6053
+ background: transparent;
6054
+ color: var(--mk-muted);
6055
+ font: inherit;
6056
+ cursor: pointer;
6057
+ transition: background 0.2s, color 0.2s, transform 0.3s var(--mk-ease-nav-move);
6058
+ }
6059
+ .mk-calendar__views button[aria-pressed='true'] { background: var(--mk-surface-5); color: var(--mk-text); }
6060
+ .mk-calendar__nav { background: var(--mk-surface-3); color: var(--mk-text); }
6061
+ .mk-calendar__nav:active { transform: scale(0.92); }
6062
+ :is(.mk-calendar__views button, .mk-calendar__nav):focus-visible { outline: 2px solid var(--mk-accent); outline-offset: 2px; }
6063
+
6064
+ [data-mk-calendar-grid] { position: relative; display: flex; flex-direction: column; gap: var(--mk-calendar-gap); }
6065
+ .mk-calendar__head,
6066
+ .mk-calendar__week { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: var(--mk-calendar-gap); }
6067
+ .mk-calendar__body { display: flex; flex-direction: column; gap: var(--mk-calendar-gap); }
6068
+ .mk-calendar__body--leaving { position: absolute; left: 0; right: 0; pointer-events: none; }
6069
+ .mk-calendar__weekday {
6070
+ padding: 8px 4px;
6071
+ border-radius: var(--mk-radius-md);
6072
+ background: var(--mk-surface-2);
6073
+ text-align: center;
6074
+ font-size: 0.95rem;
6075
+ }
6076
+ .mk-calendar__weekday-narrow { display: none; }
6077
+
6078
+ .mk-calendar__day {
6079
+ position: relative;
6080
+ display: flex;
6081
+ flex-direction: column;
6082
+ gap: 4px;
6083
+ min-width: 0;
6084
+ min-height: var(--mk-calendar-day-height);
6085
+ padding: 6px;
6086
+ border-radius: var(--mk-calendar-radius);
6087
+ background: var(--mk-surface-3);
6088
+ transition: background 0.3s, box-shadow 0.3s;
6089
+ container-type: inline-size;
6090
+ }
6091
+ .mk-calendar__body[data-view='week'] .mk-calendar__day { min-height: calc(var(--mk-calendar-day-height) * 3); }
6092
+ .mk-calendar__day[data-outside] { background: var(--mk-surface-1); color: var(--mk-muted); }
6093
+ .mk-calendar__day:hover { background: var(--mk-surface-4); }
6094
+ .mk-calendar__day[aria-selected='true'] { box-shadow: inset 0 0 0 2px var(--mk-accent); }
6095
+ .mk-calendar__number {
6096
+ align-self: flex-end;
6097
+ min-width: 2.2rem;
6098
+ height: 2.2rem;
6099
+ padding: 0 0.4rem;
6100
+ border: 0;
6101
+ border-radius: var(--mk-radius-full);
6102
+ background: transparent;
6103
+ color: inherit;
6104
+ font: inherit;
6105
+ font-size: 1.15rem;
6106
+ cursor: pointer;
6107
+ transition: background 0.3s, color 0.3s, border-radius 0.3s var(--mk-ease-nav-radius), transform 0.3s var(--mk-ease-nav-radius);
6108
+ }
6109
+ .mk-calendar__number:hover { background: var(--mk-surface-5); }
6110
+ .mk-calendar__number:active { transform: scale(0.9); }
6111
+ .mk-calendar__number:focus-visible { outline: 2px solid var(--mk-accent); outline-offset: 2px; }
6112
+ .mk-calendar__day[data-today] .mk-calendar__number { background: var(--mk-accent); color: var(--mk-on-accent); }
6113
+
6114
+ .mk-calendar__events { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
6115
+ .mk-calendar__event,
6116
+ .mk-calendar__more {
6117
+ --mk-calendar-event-color: var(--mk-accent);
6118
+ display: flex;
6119
+ align-items: center;
6120
+ gap: 6px;
6121
+ width: 100%;
6122
+ min-width: 0;
6123
+ padding: 5px 8px;
6124
+ border: 0;
6125
+ border-radius: 10px;
6126
+ background: var(--mk-surface-4);
6127
+ color: var(--mk-text);
6128
+ font: inherit;
6129
+ font-size: 0.85rem;
6130
+ text-align: left;
6131
+ cursor: pointer;
6132
+ transition: background 0.2s, transform 0.3s var(--mk-ease-nav-move);
6133
+ }
6134
+ .mk-calendar__event[data-state='pending'] {
6135
+ background: color-mix(in srgb, var(--mk-calendar-event-color) 30%, var(--mk-surface-3));
6136
+ }
6137
+ .mk-calendar__event:hover,
6138
+ .mk-calendar__more:hover { transform: translateY(-1px); background: var(--mk-surface-5); }
6139
+ .mk-calendar__event:focus-visible,
6140
+ .mk-calendar__more:focus-visible { outline: 2px solid var(--mk-accent); outline-offset: 1px; }
6141
+ .mk-calendar__status {
6142
+ flex: none;
6143
+ width: 0.8rem;
6144
+ height: 0.8rem;
6145
+ border: 2px solid currentColor;
6146
+ border-radius: 50%;
6147
+ }
6148
+ .mk-calendar__event[data-state='done'] .mk-calendar__status { background: currentColor; box-shadow: inset 0 0 0 2px var(--mk-surface-4); }
6149
+ .mk-calendar__event[data-state='cancelled'] .mk-calendar__event-title { text-decoration: line-through; opacity: 0.6; }
6150
+ .mk-calendar__event-title { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
6151
+ .mk-calendar__event-time { flex: none; font-variant-numeric: tabular-nums; opacity: 0.85; }
6152
+ .mk-calendar__more { justify-content: center; background: transparent; color: var(--mk-muted); }
6153
+
6154
+ /* Narrow day cells: the month keeps the title (the time stays in the label); the week stacks the time under it. */
6155
+ @container (max-width: 150px) {
6156
+ .mk-calendar__body[data-view='month'] .mk-calendar__event-time { display: none; }
6157
+ .mk-calendar__body[data-view='week'] .mk-calendar__event { flex-wrap: wrap; column-gap: 5px; row-gap: 1px; }
6158
+ .mk-calendar__body[data-view='week'] .mk-calendar__event-title { flex: 1 1 0; }
6159
+ .mk-calendar__body[data-view='week'] .mk-calendar__event-time { flex-basis: 100%; padding-left: calc(0.8rem + 5px); font-size: 0.72rem; }
6160
+ }
6161
+ @media (max-width: 680px) {
6162
+ .mk-calendar,
6163
+ mk-calendar { --mk-calendar-day-height: 64px; --mk-calendar-gap: 4px; --mk-calendar-radius: var(--mk-radius-sm); }
6164
+ .mk-calendar__weekday-long { display: none; }
6165
+ .mk-calendar__weekday-narrow { display: inline; }
6166
+ .mk-calendar__number { align-self: center; font-size: 0.95rem; }
6167
+ .mk-calendar__body[data-view='month'] .mk-calendar__events { flex-direction: row; flex-wrap: wrap; justify-content: center; gap: 3px; }
6168
+ .mk-calendar__body[data-view='month'] :is(.mk-calendar__event, .mk-calendar__more) {
6169
+ width: 7px;
6170
+ height: 7px;
6171
+ padding: 0;
6172
+ border-radius: 50%;
6173
+ background: var(--mk-calendar-event-color);
6174
+ font-size: 0;
6175
+ }
6176
+ .mk-calendar__body[data-view='month'] .mk-calendar__status { display: none; }
6177
+ .mk-calendar__body[data-view='week'] .mk-calendar__event-time { display: none; }
6178
+ }
6179
+ @media (prefers-reduced-motion: reduce) {
6180
+ .mk-calendar *,
6181
+ mk-calendar * { transition: none !important; }
6182
+ }
6183
+
6184
+ /* components/slot-picker/slot-picker.css */
6185
+ /* slot-picker — Melon Mind's appointment picker on the --mk-* tokens; parts are .mk-slot-picker__*. */
6186
+ .mk-slot-picker,
6187
+ mk-slot-picker {
6188
+ --mk-slot-picker-radius: var(--mk-radius-md);
6189
+ display: grid;
6190
+ grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr);
6191
+ overflow: hidden;
6192
+ border-radius: var(--mk-radius-xl);
6193
+ background: var(--mk-surface);
6194
+ color: var(--mk-text);
6195
+ }
6196
+ .mk-slot-picker__calendar { padding: var(--mk-space-5); }
6197
+ .mk-slot-picker__panel {
6198
+ display: flex;
6199
+ flex-direction: column;
6200
+ gap: var(--mk-space-3);
6201
+ min-height: 100%;
6202
+ padding: var(--mk-space-5);
6203
+ background: var(--mk-surface-2);
6204
+ }
6205
+ .mk-slot-picker__month { display: flex; align-items: center; gap: var(--mk-space-2); margin-bottom: var(--mk-space-3); }
6206
+ .mk-slot-picker__title { margin: 0 auto 0 0; font-size: 1.35rem; font-weight: 400; }
6207
+ .mk-slot-picker__nav {
6208
+ display: grid;
6209
+ place-items: center;
6210
+ width: 42px;
6211
+ height: 42px;
6212
+ border: 0;
6213
+ border-radius: 50%;
6214
+ background: var(--mk-surface-2);
6215
+ color: var(--mk-text);
6216
+ font: inherit;
6217
+ cursor: pointer;
6218
+ transition: transform 0.3s var(--mk-ease-nav-move), opacity 0.2s;
6219
+ }
6220
+ .mk-slot-picker__nav:active { transform: scale(0.9); }
6221
+ .mk-slot-picker__nav:disabled { opacity: 0.35; cursor: default; }
6222
+ [data-mk-slot-days],
6223
+ [data-mk-slot-times] { position: relative; }
6224
+ .mk-slot-picker__days { display: flex; flex-direction: column; gap: 6px; }
6225
+ .mk-slot-picker__weekdays,
6226
+ .mk-slot-picker__week { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 6px; }
6227
+ .mk-slot-picker__weekdays span {
6228
+ padding: 6px 0;
6229
+ border-radius: var(--mk-radius-sm);
6230
+ background: color-mix(in srgb, var(--mk-surface-2) 70%, transparent);
6231
+ text-align: center;
6232
+ font-size: 0.9rem;
6233
+ }
6234
+ .mk-slot-picker__week > [role='gridcell'] { display: grid; }
6235
+ .mk-slot-picker__day {
6236
+ aspect-ratio: 1.15;
6237
+ border: 0;
6238
+ border-radius: var(--mk-slot-picker-radius);
6239
+ background: var(--mk-surface-3);
6240
+ color: var(--mk-text);
6241
+ font: inherit;
6242
+ font-size: 0.95rem;
6243
+ cursor: pointer;
6244
+ transition: background 0.25s, color 0.25s, border-radius 0.3s var(--mk-ease-nav-radius), transform 0.3s var(--mk-ease-nav-radius);
6245
+ }
6246
+ .mk-slot-picker__day:hover:not(:disabled) { background: var(--mk-surface-5); border-radius: var(--mk-radius-full); }
6247
+ .mk-slot-picker__day:active:not(:disabled) { transform: scale(0.92); }
6248
+ .mk-slot-picker__day:disabled { opacity: 0.35; cursor: default; }
6249
+ .mk-slot-picker__day[aria-current='date'] { box-shadow: inset 0 0 0 1.5px var(--mk-outline); }
6250
+ [aria-selected='true'] > .mk-slot-picker__day,
6251
+ [aria-selected='true'] > .mk-slot-picker__day:hover:not(:disabled) { background: var(--mk-accent); color: var(--mk-on-accent); }
6252
+ :is(.mk-slot-picker__day, .mk-slot-picker__time, .mk-slot-picker__nav):focus-visible { outline: 2px solid var(--mk-accent); outline-offset: 2px; }
6253
+
6254
+ .mk-slot-picker__heading {
6255
+ margin: 0;
6256
+ padding: 8px;
6257
+ border-radius: var(--mk-radius-md);
6258
+ background: var(--mk-surface);
6259
+ font-weight: 600;
6260
+ }
6261
+ .mk-slot-picker__heading:not([data-mk-shown]) { display: none; }
6262
+ .mk-slot-picker__heading[data-mk-shown] { animation: mk-slot-heading-in 0.5s cubic-bezier(0.38, 0.49, 0, 1.4); }
6263
+ @keyframes mk-slot-heading-in {
6264
+ 0% { max-height: 0; min-height: 0; padding-block: 0; opacity: 0; }
6265
+ 100% { max-height: 56px; min-height: 40px; opacity: 1; }
6266
+ }
6267
+ .mk-slot-picker__list { display: grid; grid-template-columns: repeat(auto-fill, minmax(5.5rem, 1fr)); gap: 8px; align-content: start; }
6268
+ .mk-slot-picker__leaving { position: absolute; left: 0; right: 0; pointer-events: none; }
6269
+ .mk-slot-picker__note { grid-column: 1 / -1; margin: 2rem 0; color: var(--mk-muted); text-align: center; }
6270
+ .mk-slot-picker__time {
6271
+ position: relative;
6272
+ isolation: isolate;
6273
+ height: 44px;
6274
+ border: 0;
6275
+ border-radius: var(--mk-radius-sm);
6276
+ background: var(--mk-surface-4);
6277
+ color: var(--mk-text);
6278
+ font: inherit;
6279
+ font-variant-numeric: tabular-nums;
6280
+ cursor: pointer;
6281
+ transition: background 0.2s, color 0.2s, transform 0.3s var(--mk-ease-nav-move);
6282
+ }
6283
+ .mk-slot-picker__time:hover { transform: translateY(-2px); }
6284
+ .mk-slot-picker__time[aria-checked='true'] { color: var(--mk-on-accent); }
6285
+ .mk-slot-picker__time[aria-checked='true']::before {
6286
+ content: '';
6287
+ position: absolute;
6288
+ inset: 0;
6289
+ z-index: -1;
6290
+ border-radius: inherit;
6291
+ background: var(--mk-accent);
6292
+ animation: mk-slot-highlight 0.7s cubic-bezier(0.38, 0.49, 0, 1.1);
6293
+ }
6294
+ @keyframes mk-slot-highlight {
6295
+ 0% { transform: scale(0.8); opacity: 0; filter: blur(16px); box-shadow: 0 0 0 1px var(--mk-surface-2); }
6296
+ 100% { transform: scale(1); opacity: 1; filter: blur(0); }
6297
+ }
6298
+ .mk-slot-picker__actions { margin-top: auto; display: flex; justify-content: flex-end; }
6299
+
6300
+ @media (max-width: 680px) {
6301
+ .mk-slot-picker,
6302
+ mk-slot-picker { grid-template-columns: 1fr; }
6303
+ .mk-slot-picker__calendar,
6304
+ .mk-slot-picker__panel { padding: var(--mk-space-4); }
6305
+ }
6306
+ @media (prefers-reduced-motion: reduce) {
6307
+ .mk-slot-picker *,
6308
+ mk-slot-picker * { transition: none !important; animation: none !important; }
6309
+ }