designmd-forge 1.2.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 (907) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +119 -0
  3. package/dist/__tests__/designStore.test.js +41 -0
  4. package/dist/__tests__/linter.test.js +23 -0
  5. package/dist/__tests__/sectionParser.test.js +60 -0
  6. package/dist/__tests__/server.test.js +129 -0
  7. package/dist/constants.js +12 -0
  8. package/dist/data/authoring-guide.md +113 -0
  9. package/dist/data/designs/airbnb.md +545 -0
  10. package/dist/data/designs/airtable.md +554 -0
  11. package/dist/data/designs/apple.md +562 -0
  12. package/dist/data/designs/binance.md +634 -0
  13. package/dist/data/designs/bmw-m.md +503 -0
  14. package/dist/data/designs/bmw.md +544 -0
  15. package/dist/data/designs/bugatti.md +454 -0
  16. package/dist/data/designs/cal.md +542 -0
  17. package/dist/data/designs/card-heavy.md +250 -0
  18. package/dist/data/designs/claude.md +589 -0
  19. package/dist/data/designs/clay.md +541 -0
  20. package/dist/data/designs/clickhouse.md +544 -0
  21. package/dist/data/designs/cohere.md +451 -0
  22. package/dist/data/designs/coinbase.md +570 -0
  23. package/dist/data/designs/composio.md +506 -0
  24. package/dist/data/designs/content-first.md +236 -0
  25. package/dist/data/designs/cursor.md +537 -0
  26. package/dist/data/designs/data-dashboard.md +300 -0
  27. package/dist/data/designs/dell-1996.md +632 -0
  28. package/dist/data/designs/elevenlabs.md +504 -0
  29. package/dist/data/designs/enterprise-neutral.md +252 -0
  30. package/dist/data/designs/expo.md +526 -0
  31. package/dist/data/designs/ferrari.md +531 -0
  32. package/dist/data/designs/figma.md +578 -0
  33. package/dist/data/designs/framer.md +544 -0
  34. package/dist/data/designs/hashicorp.md +575 -0
  35. package/dist/data/designs/hp.md +670 -0
  36. package/dist/data/designs/ibm.md +550 -0
  37. package/dist/data/designs/intercom.md +546 -0
  38. package/dist/data/designs/ios-acorns-android.md +430 -0
  39. package/dist/data/designs/ios-acorns-expo.md +381 -0
  40. package/dist/data/designs/ios-acorns-swiftui.md +378 -0
  41. package/dist/data/designs/ios-acorns.md +384 -0
  42. package/dist/data/designs/ios-airbnb-android.md +658 -0
  43. package/dist/data/designs/ios-airbnb-expo.md +457 -0
  44. package/dist/data/designs/ios-airbnb-swiftui.md +464 -0
  45. package/dist/data/designs/ios-airbnb.md +410 -0
  46. package/dist/data/designs/ios-alltrails-android.md +451 -0
  47. package/dist/data/designs/ios-alltrails-expo.md +400 -0
  48. package/dist/data/designs/ios-alltrails-swiftui.md +343 -0
  49. package/dist/data/designs/ios-alltrails.md +344 -0
  50. package/dist/data/designs/ios-amazon-android.md +686 -0
  51. package/dist/data/designs/ios-amazon-expo.md +433 -0
  52. package/dist/data/designs/ios-amazon-music-android.md +416 -0
  53. package/dist/data/designs/ios-amazon-music-expo.md +368 -0
  54. package/dist/data/designs/ios-amazon-music-swiftui.md +436 -0
  55. package/dist/data/designs/ios-amazon-music.md +389 -0
  56. package/dist/data/designs/ios-amazon-swiftui.md +460 -0
  57. package/dist/data/designs/ios-amazon.md +440 -0
  58. package/dist/data/designs/ios-apple-fitness-android.md +462 -0
  59. package/dist/data/designs/ios-apple-fitness-expo.md +373 -0
  60. package/dist/data/designs/ios-apple-fitness-swiftui.md +373 -0
  61. package/dist/data/designs/ios-apple-fitness.md +399 -0
  62. package/dist/data/designs/ios-apple-maps-android.md +646 -0
  63. package/dist/data/designs/ios-apple-maps-expo.md +557 -0
  64. package/dist/data/designs/ios-apple-maps-swiftui.md +588 -0
  65. package/dist/data/designs/ios-apple-maps.md +447 -0
  66. package/dist/data/designs/ios-apple-music-android.md +737 -0
  67. package/dist/data/designs/ios-apple-music-expo.md +596 -0
  68. package/dist/data/designs/ios-apple-music-swiftui.md +578 -0
  69. package/dist/data/designs/ios-apple-music.md +494 -0
  70. package/dist/data/designs/ios-apple-notes-android.md +675 -0
  71. package/dist/data/designs/ios-apple-notes-expo.md +468 -0
  72. package/dist/data/designs/ios-apple-notes-swiftui.md +489 -0
  73. package/dist/data/designs/ios-apple-notes.md +413 -0
  74. package/dist/data/designs/ios-apple-tv-android.md +405 -0
  75. package/dist/data/designs/ios-apple-tv-expo.md +341 -0
  76. package/dist/data/designs/ios-apple-tv-swiftui.md +348 -0
  77. package/dist/data/designs/ios-apple-tv.md +390 -0
  78. package/dist/data/designs/ios-apple-wallet-android.md +617 -0
  79. package/dist/data/designs/ios-apple-wallet-expo.md +487 -0
  80. package/dist/data/designs/ios-apple-wallet-swiftui.md +425 -0
  81. package/dist/data/designs/ios-apple-wallet.md +360 -0
  82. package/dist/data/designs/ios-asana-android.md +435 -0
  83. package/dist/data/designs/ios-asana-expo.md +411 -0
  84. package/dist/data/designs/ios-asana-swiftui.md +416 -0
  85. package/dist/data/designs/ios-asana.md +433 -0
  86. package/dist/data/designs/ios-audible-android.md +450 -0
  87. package/dist/data/designs/ios-audible-expo.md +328 -0
  88. package/dist/data/designs/ios-audible-swiftui.md +418 -0
  89. package/dist/data/designs/ios-audible.md +364 -0
  90. package/dist/data/designs/ios-bandcamp-android.md +471 -0
  91. package/dist/data/designs/ios-bandcamp-expo.md +378 -0
  92. package/dist/data/designs/ios-bandcamp-swiftui.md +374 -0
  93. package/dist/data/designs/ios-bandcamp.md +372 -0
  94. package/dist/data/designs/ios-bear-android.md +496 -0
  95. package/dist/data/designs/ios-bear-expo.md +449 -0
  96. package/dist/data/designs/ios-bear-swiftui.md +479 -0
  97. package/dist/data/designs/ios-bear.md +412 -0
  98. package/dist/data/designs/ios-bereal-android.md +392 -0
  99. package/dist/data/designs/ios-bereal-expo.md +299 -0
  100. package/dist/data/designs/ios-bereal-swiftui.md +319 -0
  101. package/dist/data/designs/ios-bereal.md +336 -0
  102. package/dist/data/designs/ios-binance-android.md +481 -0
  103. package/dist/data/designs/ios-binance-expo.md +404 -0
  104. package/dist/data/designs/ios-binance-swiftui.md +418 -0
  105. package/dist/data/designs/ios-binance.md +410 -0
  106. package/dist/data/designs/ios-bluesky-android.md +442 -0
  107. package/dist/data/designs/ios-bluesky-expo.md +362 -0
  108. package/dist/data/designs/ios-bluesky-swiftui.md +328 -0
  109. package/dist/data/designs/ios-bluesky.md +338 -0
  110. package/dist/data/designs/ios-booking-android.md +471 -0
  111. package/dist/data/designs/ios-booking-expo.md +364 -0
  112. package/dist/data/designs/ios-booking-swiftui.md +377 -0
  113. package/dist/data/designs/ios-booking.md +346 -0
  114. package/dist/data/designs/ios-bumble-android.md +756 -0
  115. package/dist/data/designs/ios-bumble-expo.md +629 -0
  116. package/dist/data/designs/ios-bumble-swiftui.md +546 -0
  117. package/dist/data/designs/ios-bumble.md +424 -0
  118. package/dist/data/designs/ios-cal-ai-android.md +664 -0
  119. package/dist/data/designs/ios-cal-ai-expo.md +415 -0
  120. package/dist/data/designs/ios-cal-ai-swiftui.md +486 -0
  121. package/dist/data/designs/ios-cal-ai.md +387 -0
  122. package/dist/data/designs/ios-calm-android.md +431 -0
  123. package/dist/data/designs/ios-calm-expo.md +384 -0
  124. package/dist/data/designs/ios-calm-swiftui.md +327 -0
  125. package/dist/data/designs/ios-calm.md +356 -0
  126. package/dist/data/designs/ios-canva-android.md +469 -0
  127. package/dist/data/designs/ios-canva-expo.md +374 -0
  128. package/dist/data/designs/ios-canva-swiftui.md +422 -0
  129. package/dist/data/designs/ios-canva.md +395 -0
  130. package/dist/data/designs/ios-cash-app-android.md +601 -0
  131. package/dist/data/designs/ios-cash-app-expo.md +453 -0
  132. package/dist/data/designs/ios-cash-app-swiftui.md +463 -0
  133. package/dist/data/designs/ios-cash-app.md +365 -0
  134. package/dist/data/designs/ios-character-ai-android.md +489 -0
  135. package/dist/data/designs/ios-character-ai-expo.md +420 -0
  136. package/dist/data/designs/ios-character-ai-swiftui.md +417 -0
  137. package/dist/data/designs/ios-character-ai.md +392 -0
  138. package/dist/data/designs/ios-charles-schwab-android.md +454 -0
  139. package/dist/data/designs/ios-charles-schwab-expo.md +388 -0
  140. package/dist/data/designs/ios-charles-schwab-swiftui.md +394 -0
  141. package/dist/data/designs/ios-charles-schwab.md +380 -0
  142. package/dist/data/designs/ios-chatgpt-android.md +753 -0
  143. package/dist/data/designs/ios-chatgpt-expo.md +644 -0
  144. package/dist/data/designs/ios-chatgpt-swiftui.md +653 -0
  145. package/dist/data/designs/ios-chatgpt.md +466 -0
  146. package/dist/data/designs/ios-chime-android.md +438 -0
  147. package/dist/data/designs/ios-chime-expo.md +419 -0
  148. package/dist/data/designs/ios-chime-swiftui.md +383 -0
  149. package/dist/data/designs/ios-chime.md +389 -0
  150. package/dist/data/designs/ios-chipotle-android.md +397 -0
  151. package/dist/data/designs/ios-chipotle-expo.md +301 -0
  152. package/dist/data/designs/ios-chipotle-swiftui.md +345 -0
  153. package/dist/data/designs/ios-chipotle.md +340 -0
  154. package/dist/data/designs/ios-citymapper-android.md +466 -0
  155. package/dist/data/designs/ios-citymapper-expo.md +420 -0
  156. package/dist/data/designs/ios-citymapper-swiftui.md +424 -0
  157. package/dist/data/designs/ios-citymapper.md +394 -0
  158. package/dist/data/designs/ios-claude-android.md +625 -0
  159. package/dist/data/designs/ios-claude-expo.md +671 -0
  160. package/dist/data/designs/ios-claude-swiftui.md +649 -0
  161. package/dist/data/designs/ios-claude.md +447 -0
  162. package/dist/data/designs/ios-clickup-android.md +484 -0
  163. package/dist/data/designs/ios-clickup-expo.md +423 -0
  164. package/dist/data/designs/ios-clickup-swiftui.md +416 -0
  165. package/dist/data/designs/ios-clickup.md +431 -0
  166. package/dist/data/designs/ios-clubhouse-android.md +524 -0
  167. package/dist/data/designs/ios-clubhouse-expo.md +425 -0
  168. package/dist/data/designs/ios-clubhouse-swiftui.md +447 -0
  169. package/dist/data/designs/ios-clubhouse.md +406 -0
  170. package/dist/data/designs/ios-coffee-meets-bagel-android.md +461 -0
  171. package/dist/data/designs/ios-coffee-meets-bagel-expo.md +372 -0
  172. package/dist/data/designs/ios-coffee-meets-bagel-swiftui.md +368 -0
  173. package/dist/data/designs/ios-coffee-meets-bagel.md +376 -0
  174. package/dist/data/designs/ios-coinbase-android.md +611 -0
  175. package/dist/data/designs/ios-coinbase-expo.md +500 -0
  176. package/dist/data/designs/ios-coinbase-swiftui.md +490 -0
  177. package/dist/data/designs/ios-coinbase.md +409 -0
  178. package/dist/data/designs/ios-copilot-android.md +625 -0
  179. package/dist/data/designs/ios-copilot-expo.md +423 -0
  180. package/dist/data/designs/ios-copilot-swiftui.md +471 -0
  181. package/dist/data/designs/ios-copilot.md +367 -0
  182. package/dist/data/designs/ios-craft-android.md +459 -0
  183. package/dist/data/designs/ios-craft-expo.md +417 -0
  184. package/dist/data/designs/ios-craft-swiftui.md +449 -0
  185. package/dist/data/designs/ios-craft.md +449 -0
  186. package/dist/data/designs/ios-crunchyroll-android.md +432 -0
  187. package/dist/data/designs/ios-crunchyroll-expo.md +388 -0
  188. package/dist/data/designs/ios-crunchyroll-swiftui.md +417 -0
  189. package/dist/data/designs/ios-crunchyroll.md +388 -0
  190. package/dist/data/designs/ios-crypto-com-android.md +461 -0
  191. package/dist/data/designs/ios-crypto-com-expo.md +404 -0
  192. package/dist/data/designs/ios-crypto-com-swiftui.md +419 -0
  193. package/dist/data/designs/ios-crypto-com.md +410 -0
  194. package/dist/data/designs/ios-deepseek-android.md +471 -0
  195. package/dist/data/designs/ios-deepseek-expo.md +391 -0
  196. package/dist/data/designs/ios-deepseek-swiftui.md +354 -0
  197. package/dist/data/designs/ios-deepseek.md +393 -0
  198. package/dist/data/designs/ios-deezer-android.md +475 -0
  199. package/dist/data/designs/ios-deezer-expo.md +400 -0
  200. package/dist/data/designs/ios-deezer-swiftui.md +430 -0
  201. package/dist/data/designs/ios-deezer.md +388 -0
  202. package/dist/data/designs/ios-deliveroo-android.md +493 -0
  203. package/dist/data/designs/ios-deliveroo-expo.md +424 -0
  204. package/dist/data/designs/ios-deliveroo-swiftui.md +398 -0
  205. package/dist/data/designs/ios-deliveroo.md +420 -0
  206. package/dist/data/designs/ios-delta-android.md +439 -0
  207. package/dist/data/designs/ios-delta-expo.md +381 -0
  208. package/dist/data/designs/ios-delta-swiftui.md +400 -0
  209. package/dist/data/designs/ios-delta.md +397 -0
  210. package/dist/data/designs/ios-discord-android.md +611 -0
  211. package/dist/data/designs/ios-discord-expo.md +618 -0
  212. package/dist/data/designs/ios-discord-swiftui.md +630 -0
  213. package/dist/data/designs/ios-discord.md +451 -0
  214. package/dist/data/designs/ios-disney-plus-android.md +464 -0
  215. package/dist/data/designs/ios-disney-plus-expo.md +358 -0
  216. package/dist/data/designs/ios-disney-plus-swiftui.md +412 -0
  217. package/dist/data/designs/ios-disney-plus.md +355 -0
  218. package/dist/data/designs/ios-dominos-android.md +417 -0
  219. package/dist/data/designs/ios-dominos-expo.md +316 -0
  220. package/dist/data/designs/ios-dominos-swiftui.md +340 -0
  221. package/dist/data/designs/ios-dominos.md +347 -0
  222. package/dist/data/designs/ios-doordash-android.md +527 -0
  223. package/dist/data/designs/ios-doordash-expo.md +323 -0
  224. package/dist/data/designs/ios-doordash-swiftui.md +301 -0
  225. package/dist/data/designs/ios-doordash.md +393 -0
  226. package/dist/data/designs/ios-dropbox-android.md +522 -0
  227. package/dist/data/designs/ios-dropbox-expo.md +393 -0
  228. package/dist/data/designs/ios-dropbox-swiftui.md +400 -0
  229. package/dist/data/designs/ios-dropbox.md +374 -0
  230. package/dist/data/designs/ios-duolingo-android.md +641 -0
  231. package/dist/data/designs/ios-duolingo-expo.md +597 -0
  232. package/dist/data/designs/ios-duolingo-swiftui.md +539 -0
  233. package/dist/data/designs/ios-duolingo.md +409 -0
  234. package/dist/data/designs/ios-ebay-android.md +436 -0
  235. package/dist/data/designs/ios-ebay-expo.md +344 -0
  236. package/dist/data/designs/ios-ebay-swiftui.md +308 -0
  237. package/dist/data/designs/ios-ebay.md +355 -0
  238. package/dist/data/designs/ios-espn-android.md +468 -0
  239. package/dist/data/designs/ios-espn-expo.md +387 -0
  240. package/dist/data/designs/ios-espn-swiftui.md +410 -0
  241. package/dist/data/designs/ios-espn.md +384 -0
  242. package/dist/data/designs/ios-etsy-android.md +439 -0
  243. package/dist/data/designs/ios-etsy-expo.md +351 -0
  244. package/dist/data/designs/ios-etsy-swiftui.md +296 -0
  245. package/dist/data/designs/ios-etsy.md +355 -0
  246. package/dist/data/designs/ios-evernote-android.md +419 -0
  247. package/dist/data/designs/ios-evernote-expo.md +379 -0
  248. package/dist/data/designs/ios-evernote-swiftui.md +380 -0
  249. package/dist/data/designs/ios-evernote.md +416 -0
  250. package/dist/data/designs/ios-expedia-android.md +451 -0
  251. package/dist/data/designs/ios-expedia-expo.md +433 -0
  252. package/dist/data/designs/ios-expedia-swiftui.md +399 -0
  253. package/dist/data/designs/ios-expedia.md +431 -0
  254. package/dist/data/designs/ios-facebook-android.md +628 -0
  255. package/dist/data/designs/ios-facebook-expo.md +471 -0
  256. package/dist/data/designs/ios-facebook-swiftui.md +459 -0
  257. package/dist/data/designs/ios-facebook.md +452 -0
  258. package/dist/data/designs/ios-feeld-android.md +431 -0
  259. package/dist/data/designs/ios-feeld-expo.md +379 -0
  260. package/dist/data/designs/ios-feeld-swiftui.md +401 -0
  261. package/dist/data/designs/ios-feeld.md +378 -0
  262. package/dist/data/designs/ios-fidelity-android.md +426 -0
  263. package/dist/data/designs/ios-fidelity-expo.md +396 -0
  264. package/dist/data/designs/ios-fidelity-swiftui.md +398 -0
  265. package/dist/data/designs/ios-fidelity.md +387 -0
  266. package/dist/data/designs/ios-figma-android.md +578 -0
  267. package/dist/data/designs/ios-figma-expo.md +504 -0
  268. package/dist/data/designs/ios-figma-swiftui.md +542 -0
  269. package/dist/data/designs/ios-figma.md +404 -0
  270. package/dist/data/designs/ios-fitbit-android.md +439 -0
  271. package/dist/data/designs/ios-fitbit-expo.md +389 -0
  272. package/dist/data/designs/ios-fitbit-swiftui.md +380 -0
  273. package/dist/data/designs/ios-fitbit.md +396 -0
  274. package/dist/data/designs/ios-flickr-android.md +506 -0
  275. package/dist/data/designs/ios-flickr-expo.md +434 -0
  276. package/dist/data/designs/ios-flickr-swiftui.md +421 -0
  277. package/dist/data/designs/ios-flickr.md +394 -0
  278. package/dist/data/designs/ios-flighty-android.md +418 -0
  279. package/dist/data/designs/ios-flighty-expo.md +353 -0
  280. package/dist/data/designs/ios-flighty-swiftui.md +337 -0
  281. package/dist/data/designs/ios-flighty.md +357 -0
  282. package/dist/data/designs/ios-flo-android.md +447 -0
  283. package/dist/data/designs/ios-flo-expo.md +363 -0
  284. package/dist/data/designs/ios-flo-swiftui.md +355 -0
  285. package/dist/data/designs/ios-flo.md +351 -0
  286. package/dist/data/designs/ios-garmin-connect-android.md +531 -0
  287. package/dist/data/designs/ios-garmin-connect-expo.md +429 -0
  288. package/dist/data/designs/ios-garmin-connect-swiftui.md +459 -0
  289. package/dist/data/designs/ios-garmin-connect.md +419 -0
  290. package/dist/data/designs/ios-gas-android.md +438 -0
  291. package/dist/data/designs/ios-gas-expo.md +350 -0
  292. package/dist/data/designs/ios-gas-swiftui.md +329 -0
  293. package/dist/data/designs/ios-gas.md +387 -0
  294. package/dist/data/designs/ios-gemini-android.md +568 -0
  295. package/dist/data/designs/ios-gemini-expo.md +416 -0
  296. package/dist/data/designs/ios-gemini-swiftui.md +424 -0
  297. package/dist/data/designs/ios-gemini.md +351 -0
  298. package/dist/data/designs/ios-github-android.md +507 -0
  299. package/dist/data/designs/ios-github-expo.md +486 -0
  300. package/dist/data/designs/ios-github-swiftui.md +459 -0
  301. package/dist/data/designs/ios-github.md +394 -0
  302. package/dist/data/designs/ios-gmail-android.md +548 -0
  303. package/dist/data/designs/ios-gmail-expo.md +457 -0
  304. package/dist/data/designs/ios-gmail-swiftui.md +470 -0
  305. package/dist/data/designs/ios-gmail.md +441 -0
  306. package/dist/data/designs/ios-goodreads-android.md +436 -0
  307. package/dist/data/designs/ios-goodreads-expo.md +407 -0
  308. package/dist/data/designs/ios-goodreads-swiftui.md +378 -0
  309. package/dist/data/designs/ios-goodreads.md +385 -0
  310. package/dist/data/designs/ios-google-calendar-android.md +565 -0
  311. package/dist/data/designs/ios-google-calendar-expo.md +616 -0
  312. package/dist/data/designs/ios-google-calendar-swiftui.md +585 -0
  313. package/dist/data/designs/ios-google-calendar.md +431 -0
  314. package/dist/data/designs/ios-google-maps-android.md +614 -0
  315. package/dist/data/designs/ios-google-maps-expo.md +515 -0
  316. package/dist/data/designs/ios-google-maps-swiftui.md +484 -0
  317. package/dist/data/designs/ios-google-maps.md +451 -0
  318. package/dist/data/designs/ios-grammarly-android.md +449 -0
  319. package/dist/data/designs/ios-grammarly-expo.md +383 -0
  320. package/dist/data/designs/ios-grammarly-swiftui.md +381 -0
  321. package/dist/data/designs/ios-grammarly.md +392 -0
  322. package/dist/data/designs/ios-grindr-android.md +494 -0
  323. package/dist/data/designs/ios-grindr-expo.md +358 -0
  324. package/dist/data/designs/ios-grindr-swiftui.md +357 -0
  325. package/dist/data/designs/ios-grindr.md +356 -0
  326. package/dist/data/designs/ios-grok-android.md +471 -0
  327. package/dist/data/designs/ios-grok-expo.md +388 -0
  328. package/dist/data/designs/ios-grok-swiftui.md +397 -0
  329. package/dist/data/designs/ios-grok.md +357 -0
  330. package/dist/data/designs/ios-groupme-android.md +551 -0
  331. package/dist/data/designs/ios-groupme-expo.md +442 -0
  332. package/dist/data/designs/ios-groupme-swiftui.md +439 -0
  333. package/dist/data/designs/ios-groupme.md +424 -0
  334. package/dist/data/designs/ios-grubhub-android.md +506 -0
  335. package/dist/data/designs/ios-grubhub-expo.md +428 -0
  336. package/dist/data/designs/ios-grubhub-swiftui.md +408 -0
  337. package/dist/data/designs/ios-grubhub.md +427 -0
  338. package/dist/data/designs/ios-happn-android.md +464 -0
  339. package/dist/data/designs/ios-happn-expo.md +411 -0
  340. package/dist/data/designs/ios-happn-swiftui.md +401 -0
  341. package/dist/data/designs/ios-happn.md +400 -0
  342. package/dist/data/designs/ios-headspace-android.md +688 -0
  343. package/dist/data/designs/ios-headspace-expo.md +574 -0
  344. package/dist/data/designs/ios-headspace-swiftui.md +498 -0
  345. package/dist/data/designs/ios-headspace.md +430 -0
  346. package/dist/data/designs/ios-hevy-android.md +473 -0
  347. package/dist/data/designs/ios-hevy-expo.md +405 -0
  348. package/dist/data/designs/ios-hevy-swiftui.md +367 -0
  349. package/dist/data/designs/ios-hevy.md +410 -0
  350. package/dist/data/designs/ios-hinge-android.md +743 -0
  351. package/dist/data/designs/ios-hinge-expo.md +580 -0
  352. package/dist/data/designs/ios-hinge-swiftui.md +512 -0
  353. package/dist/data/designs/ios-hinge.md +405 -0
  354. package/dist/data/designs/ios-hopper-android.md +440 -0
  355. package/dist/data/designs/ios-hopper-expo.md +353 -0
  356. package/dist/data/designs/ios-hopper-swiftui.md +340 -0
  357. package/dist/data/designs/ios-hopper.md +354 -0
  358. package/dist/data/designs/ios-hulu-android.md +435 -0
  359. package/dist/data/designs/ios-hulu-expo.md +331 -0
  360. package/dist/data/designs/ios-hulu-swiftui.md +374 -0
  361. package/dist/data/designs/ios-hulu.md +353 -0
  362. package/dist/data/designs/ios-iheartradio-android.md +481 -0
  363. package/dist/data/designs/ios-iheartradio-expo.md +417 -0
  364. package/dist/data/designs/ios-iheartradio-swiftui.md +423 -0
  365. package/dist/data/designs/ios-iheartradio.md +381 -0
  366. package/dist/data/designs/ios-imessage-android.md +426 -0
  367. package/dist/data/designs/ios-imessage-expo.md +384 -0
  368. package/dist/data/designs/ios-imessage-swiftui.md +378 -0
  369. package/dist/data/designs/ios-imessage.md +394 -0
  370. package/dist/data/designs/ios-instacart-android.md +471 -0
  371. package/dist/data/designs/ios-instacart-expo.md +349 -0
  372. package/dist/data/designs/ios-instacart-swiftui.md +378 -0
  373. package/dist/data/designs/ios-instacart.md +360 -0
  374. package/dist/data/designs/ios-instagram-android.md +646 -0
  375. package/dist/data/designs/ios-instagram-expo.md +310 -0
  376. package/dist/data/designs/ios-instagram-swiftui.md +333 -0
  377. package/dist/data/designs/ios-instagram.md +376 -0
  378. package/dist/data/designs/ios-jira-android.md +432 -0
  379. package/dist/data/designs/ios-jira-expo.md +375 -0
  380. package/dist/data/designs/ios-jira-swiftui.md +433 -0
  381. package/dist/data/designs/ios-jira.md +424 -0
  382. package/dist/data/designs/ios-kakaotalk-android.md +491 -0
  383. package/dist/data/designs/ios-kakaotalk-expo.md +418 -0
  384. package/dist/data/designs/ios-kakaotalk-swiftui.md +406 -0
  385. package/dist/data/designs/ios-kakaotalk.md +414 -0
  386. package/dist/data/designs/ios-kayak-android.md +466 -0
  387. package/dist/data/designs/ios-kayak-expo.md +407 -0
  388. package/dist/data/designs/ios-kayak-swiftui.md +426 -0
  389. package/dist/data/designs/ios-kayak.md +392 -0
  390. package/dist/data/designs/ios-kick-android.md +487 -0
  391. package/dist/data/designs/ios-kick-expo.md +434 -0
  392. package/dist/data/designs/ios-kick-swiftui.md +429 -0
  393. package/dist/data/designs/ios-kick.md +389 -0
  394. package/dist/data/designs/ios-kik-android.md +433 -0
  395. package/dist/data/designs/ios-kik-expo.md +363 -0
  396. package/dist/data/designs/ios-kik-swiftui.md +363 -0
  397. package/dist/data/designs/ios-kik.md +392 -0
  398. package/dist/data/designs/ios-kindle-android.md +439 -0
  399. package/dist/data/designs/ios-kindle-expo.md +356 -0
  400. package/dist/data/designs/ios-kindle-swiftui.md +372 -0
  401. package/dist/data/designs/ios-kindle.md +369 -0
  402. package/dist/data/designs/ios-klarna-android.md +420 -0
  403. package/dist/data/designs/ios-klarna-expo.md +349 -0
  404. package/dist/data/designs/ios-klarna-swiftui.md +360 -0
  405. package/dist/data/designs/ios-klarna.md +356 -0
  406. package/dist/data/designs/ios-lemon8-android.md +492 -0
  407. package/dist/data/designs/ios-lemon8-expo.md +413 -0
  408. package/dist/data/designs/ios-lemon8-swiftui.md +428 -0
  409. package/dist/data/designs/ios-lemon8.md +378 -0
  410. package/dist/data/designs/ios-life360-android.md +474 -0
  411. package/dist/data/designs/ios-life360-expo.md +375 -0
  412. package/dist/data/designs/ios-life360-swiftui.md +390 -0
  413. package/dist/data/designs/ios-life360.md +402 -0
  414. package/dist/data/designs/ios-line-android.md +517 -0
  415. package/dist/data/designs/ios-line-expo.md +402 -0
  416. package/dist/data/designs/ios-line-swiftui.md +361 -0
  417. package/dist/data/designs/ios-line.md +362 -0
  418. package/dist/data/designs/ios-linear-android.md +457 -0
  419. package/dist/data/designs/ios-linear-expo.md +367 -0
  420. package/dist/data/designs/ios-linear-swiftui.md +401 -0
  421. package/dist/data/designs/ios-linear.md +368 -0
  422. package/dist/data/designs/ios-linkedin-android.md +620 -0
  423. package/dist/data/designs/ios-linkedin-expo.md +469 -0
  424. package/dist/data/designs/ios-linkedin-swiftui.md +472 -0
  425. package/dist/data/designs/ios-linkedin.md +444 -0
  426. package/dist/data/designs/ios-locket-android.md +500 -0
  427. package/dist/data/designs/ios-locket-expo.md +375 -0
  428. package/dist/data/designs/ios-locket-swiftui.md +375 -0
  429. package/dist/data/designs/ios-locket.md +381 -0
  430. package/dist/data/designs/ios-lyft-android.md +406 -0
  431. package/dist/data/designs/ios-lyft-expo.md +333 -0
  432. package/dist/data/designs/ios-lyft-swiftui.md +315 -0
  433. package/dist/data/designs/ios-lyft.md +337 -0
  434. package/dist/data/designs/ios-marriott-bonvoy-android.md +488 -0
  435. package/dist/data/designs/ios-marriott-bonvoy-expo.md +412 -0
  436. package/dist/data/designs/ios-marriott-bonvoy-swiftui.md +461 -0
  437. package/dist/data/designs/ios-marriott-bonvoy.md +379 -0
  438. package/dist/data/designs/ios-mastodon-android.md +476 -0
  439. package/dist/data/designs/ios-mastodon-expo.md +379 -0
  440. package/dist/data/designs/ios-mastodon-swiftui.md +349 -0
  441. package/dist/data/designs/ios-mastodon.md +337 -0
  442. package/dist/data/designs/ios-match-android.md +496 -0
  443. package/dist/data/designs/ios-match-expo.md +393 -0
  444. package/dist/data/designs/ios-match-swiftui.md +450 -0
  445. package/dist/data/designs/ios-match.md +382 -0
  446. package/dist/data/designs/ios-max-android.md +454 -0
  447. package/dist/data/designs/ios-max-expo.md +342 -0
  448. package/dist/data/designs/ios-max-swiftui.md +332 -0
  449. package/dist/data/designs/ios-max.md +352 -0
  450. package/dist/data/designs/ios-mcdonalds-android.md +497 -0
  451. package/dist/data/designs/ios-mcdonalds-expo.md +382 -0
  452. package/dist/data/designs/ios-mcdonalds-swiftui.md +394 -0
  453. package/dist/data/designs/ios-mcdonalds.md +410 -0
  454. package/dist/data/designs/ios-messenger-android.md +523 -0
  455. package/dist/data/designs/ios-messenger-expo.md +379 -0
  456. package/dist/data/designs/ios-messenger-swiftui.md +369 -0
  457. package/dist/data/designs/ios-messenger.md +361 -0
  458. package/dist/data/designs/ios-microsoft-teams-android.md +446 -0
  459. package/dist/data/designs/ios-microsoft-teams-expo.md +362 -0
  460. package/dist/data/designs/ios-microsoft-teams-swiftui.md +384 -0
  461. package/dist/data/designs/ios-microsoft-teams.md +359 -0
  462. package/dist/data/designs/ios-midjourney-android.md +503 -0
  463. package/dist/data/designs/ios-midjourney-expo.md +406 -0
  464. package/dist/data/designs/ios-midjourney-swiftui.md +376 -0
  465. package/dist/data/designs/ios-midjourney.md +407 -0
  466. package/dist/data/designs/ios-miro-android.md +475 -0
  467. package/dist/data/designs/ios-miro-expo.md +421 -0
  468. package/dist/data/designs/ios-miro-swiftui.md +407 -0
  469. package/dist/data/designs/ios-miro.md +424 -0
  470. package/dist/data/designs/ios-monday-android.md +426 -0
  471. package/dist/data/designs/ios-monday-expo.md +382 -0
  472. package/dist/data/designs/ios-monday-swiftui.md +386 -0
  473. package/dist/data/designs/ios-monday.md +415 -0
  474. package/dist/data/designs/ios-monzo-android.md +423 -0
  475. package/dist/data/designs/ios-monzo-expo.md +391 -0
  476. package/dist/data/designs/ios-monzo-swiftui.md +371 -0
  477. package/dist/data/designs/ios-monzo.md +382 -0
  478. package/dist/data/designs/ios-myfitnesspal-android.md +631 -0
  479. package/dist/data/designs/ios-myfitnesspal-expo.md +489 -0
  480. package/dist/data/designs/ios-myfitnesspal-swiftui.md +500 -0
  481. package/dist/data/designs/ios-myfitnesspal.md +408 -0
  482. package/dist/data/designs/ios-netflix-android.md +570 -0
  483. package/dist/data/designs/ios-netflix-expo.md +528 -0
  484. package/dist/data/designs/ios-netflix-swiftui.md +543 -0
  485. package/dist/data/designs/ios-netflix.md +476 -0
  486. package/dist/data/designs/ios-nextdoor-android.md +399 -0
  487. package/dist/data/designs/ios-nextdoor-expo.md +317 -0
  488. package/dist/data/designs/ios-nextdoor-swiftui.md +343 -0
  489. package/dist/data/designs/ios-nextdoor.md +332 -0
  490. package/dist/data/designs/ios-nike-run-club-android.md +598 -0
  491. package/dist/data/designs/ios-nike-run-club-expo.md +459 -0
  492. package/dist/data/designs/ios-nike-run-club-swiftui.md +474 -0
  493. package/dist/data/designs/ios-nike-run-club.md +400 -0
  494. package/dist/data/designs/ios-noom-android.md +455 -0
  495. package/dist/data/designs/ios-noom-expo.md +362 -0
  496. package/dist/data/designs/ios-noom-swiftui.md +369 -0
  497. package/dist/data/designs/ios-noom.md +404 -0
  498. package/dist/data/designs/ios-notion-android.md +575 -0
  499. package/dist/data/designs/ios-notion-expo.md +543 -0
  500. package/dist/data/designs/ios-notion-swiftui.md +562 -0
  501. package/dist/data/designs/ios-notion.md +506 -0
  502. package/dist/data/designs/ios-nubank-android.md +447 -0
  503. package/dist/data/designs/ios-nubank-expo.md +391 -0
  504. package/dist/data/designs/ios-nubank-swiftui.md +391 -0
  505. package/dist/data/designs/ios-nubank.md +388 -0
  506. package/dist/data/designs/ios-obsidian-android.md +456 -0
  507. package/dist/data/designs/ios-obsidian-expo.md +401 -0
  508. package/dist/data/designs/ios-obsidian-swiftui.md +412 -0
  509. package/dist/data/designs/ios-obsidian.md +363 -0
  510. package/dist/data/designs/ios-okcupid-android.md +496 -0
  511. package/dist/data/designs/ios-okcupid-expo.md +378 -0
  512. package/dist/data/designs/ios-okcupid-swiftui.md +343 -0
  513. package/dist/data/designs/ios-okcupid.md +364 -0
  514. package/dist/data/designs/ios-opentable-android.md +426 -0
  515. package/dist/data/designs/ios-opentable-expo.md +350 -0
  516. package/dist/data/designs/ios-opentable-swiftui.md +328 -0
  517. package/dist/data/designs/ios-opentable.md +411 -0
  518. package/dist/data/designs/ios-oura-android.md +426 -0
  519. package/dist/data/designs/ios-oura-expo.md +353 -0
  520. package/dist/data/designs/ios-oura-swiftui.md +327 -0
  521. package/dist/data/designs/ios-oura.md +356 -0
  522. package/dist/data/designs/ios-overcast-android.md +508 -0
  523. package/dist/data/designs/ios-overcast-expo.md +420 -0
  524. package/dist/data/designs/ios-overcast-swiftui.md +427 -0
  525. package/dist/data/designs/ios-overcast.md +414 -0
  526. package/dist/data/designs/ios-pandora-android.md +477 -0
  527. package/dist/data/designs/ios-pandora-expo.md +406 -0
  528. package/dist/data/designs/ios-pandora-swiftui.md +413 -0
  529. package/dist/data/designs/ios-pandora.md +366 -0
  530. package/dist/data/designs/ios-panera-android.md +414 -0
  531. package/dist/data/designs/ios-panera-expo.md +352 -0
  532. package/dist/data/designs/ios-panera-swiftui.md +369 -0
  533. package/dist/data/designs/ios-panera.md +412 -0
  534. package/dist/data/designs/ios-paramount-plus-android.md +415 -0
  535. package/dist/data/designs/ios-paramount-plus-expo.md +363 -0
  536. package/dist/data/designs/ios-paramount-plus-swiftui.md +372 -0
  537. package/dist/data/designs/ios-paramount-plus.md +400 -0
  538. package/dist/data/designs/ios-paypal-android.md +535 -0
  539. package/dist/data/designs/ios-paypal-expo.md +429 -0
  540. package/dist/data/designs/ios-paypal-swiftui.md +466 -0
  541. package/dist/data/designs/ios-paypal.md +393 -0
  542. package/dist/data/designs/ios-peacock-android.md +453 -0
  543. package/dist/data/designs/ios-peacock-expo.md +393 -0
  544. package/dist/data/designs/ios-peacock-swiftui.md +420 -0
  545. package/dist/data/designs/ios-peacock.md +411 -0
  546. package/dist/data/designs/ios-peloton-android.md +470 -0
  547. package/dist/data/designs/ios-peloton-expo.md +401 -0
  548. package/dist/data/designs/ios-peloton-swiftui.md +409 -0
  549. package/dist/data/designs/ios-peloton.md +415 -0
  550. package/dist/data/designs/ios-perplexity-android.md +553 -0
  551. package/dist/data/designs/ios-perplexity-expo.md +703 -0
  552. package/dist/data/designs/ios-perplexity-swiftui.md +602 -0
  553. package/dist/data/designs/ios-perplexity.md +453 -0
  554. package/dist/data/designs/ios-pinterest-android.md +551 -0
  555. package/dist/data/designs/ios-pinterest-expo.md +466 -0
  556. package/dist/data/designs/ios-pinterest-swiftui.md +464 -0
  557. package/dist/data/designs/ios-pinterest.md +427 -0
  558. package/dist/data/designs/ios-plenty-of-fish-android.md +462 -0
  559. package/dist/data/designs/ios-plenty-of-fish-expo.md +380 -0
  560. package/dist/data/designs/ios-plenty-of-fish-swiftui.md +429 -0
  561. package/dist/data/designs/ios-plenty-of-fish.md +387 -0
  562. package/dist/data/designs/ios-plex-android.md +403 -0
  563. package/dist/data/designs/ios-plex-expo.md +333 -0
  564. package/dist/data/designs/ios-plex-swiftui.md +349 -0
  565. package/dist/data/designs/ios-plex.md +379 -0
  566. package/dist/data/designs/ios-pluto-tv-android.md +413 -0
  567. package/dist/data/designs/ios-pluto-tv-expo.md +379 -0
  568. package/dist/data/designs/ios-pluto-tv-swiftui.md +411 -0
  569. package/dist/data/designs/ios-pluto-tv.md +362 -0
  570. package/dist/data/designs/ios-pocket-casts-android.md +492 -0
  571. package/dist/data/designs/ios-pocket-casts-expo.md +430 -0
  572. package/dist/data/designs/ios-pocket-casts-swiftui.md +479 -0
  573. package/dist/data/designs/ios-pocket-casts.md +427 -0
  574. package/dist/data/designs/ios-postman-android.md +472 -0
  575. package/dist/data/designs/ios-postman-expo.md +372 -0
  576. package/dist/data/designs/ios-postman-swiftui.md +377 -0
  577. package/dist/data/designs/ios-postman.md +405 -0
  578. package/dist/data/designs/ios-prime-video-android.md +447 -0
  579. package/dist/data/designs/ios-prime-video-expo.md +365 -0
  580. package/dist/data/designs/ios-prime-video-swiftui.md +333 -0
  581. package/dist/data/designs/ios-prime-video.md +351 -0
  582. package/dist/data/designs/ios-quora-android.md +513 -0
  583. package/dist/data/designs/ios-quora-expo.md +362 -0
  584. package/dist/data/designs/ios-quora-swiftui.md +375 -0
  585. package/dist/data/designs/ios-quora.md +359 -0
  586. package/dist/data/designs/ios-raya-android.md +401 -0
  587. package/dist/data/designs/ios-raya-expo.md +366 -0
  588. package/dist/data/designs/ios-raya-swiftui.md +393 -0
  589. package/dist/data/designs/ios-raya.md +366 -0
  590. package/dist/data/designs/ios-reddit-android.md +605 -0
  591. package/dist/data/designs/ios-reddit-expo.md +553 -0
  592. package/dist/data/designs/ios-reddit-swiftui.md +514 -0
  593. package/dist/data/designs/ios-reddit.md +460 -0
  594. package/dist/data/designs/ios-resy-android.md +430 -0
  595. package/dist/data/designs/ios-resy-expo.md +344 -0
  596. package/dist/data/designs/ios-resy-swiftui.md +330 -0
  597. package/dist/data/designs/ios-resy.md +412 -0
  598. package/dist/data/designs/ios-revolut-android.md +433 -0
  599. package/dist/data/designs/ios-revolut-expo.md +379 -0
  600. package/dist/data/designs/ios-revolut-swiftui.md +372 -0
  601. package/dist/data/designs/ios-revolut.md +353 -0
  602. package/dist/data/designs/ios-robinhood-android.md +587 -0
  603. package/dist/data/designs/ios-robinhood-expo.md +416 -0
  604. package/dist/data/designs/ios-robinhood-swiftui.md +431 -0
  605. package/dist/data/designs/ios-robinhood.md +380 -0
  606. package/dist/data/designs/ios-runna-android.md +485 -0
  607. package/dist/data/designs/ios-runna-expo.md +388 -0
  608. package/dist/data/designs/ios-runna-swiftui.md +413 -0
  609. package/dist/data/designs/ios-runna.md +390 -0
  610. package/dist/data/designs/ios-shazam-android.md +436 -0
  611. package/dist/data/designs/ios-shazam-expo.md +348 -0
  612. package/dist/data/designs/ios-shazam-swiftui.md +394 -0
  613. package/dist/data/designs/ios-shazam.md +338 -0
  614. package/dist/data/designs/ios-signal-android.md +462 -0
  615. package/dist/data/designs/ios-signal-expo.md +361 -0
  616. package/dist/data/designs/ios-signal-swiftui.md +350 -0
  617. package/dist/data/designs/ios-signal.md +357 -0
  618. package/dist/data/designs/ios-skype-android.md +398 -0
  619. package/dist/data/designs/ios-skype-expo.md +368 -0
  620. package/dist/data/designs/ios-skype-swiftui.md +369 -0
  621. package/dist/data/designs/ios-skype.md +406 -0
  622. package/dist/data/designs/ios-skyscanner-android.md +451 -0
  623. package/dist/data/designs/ios-skyscanner-expo.md +423 -0
  624. package/dist/data/designs/ios-skyscanner-swiftui.md +419 -0
  625. package/dist/data/designs/ios-skyscanner.md +421 -0
  626. package/dist/data/designs/ios-slack-android.md +695 -0
  627. package/dist/data/designs/ios-slack-expo.md +601 -0
  628. package/dist/data/designs/ios-slack-swiftui.md +594 -0
  629. package/dist/data/designs/ios-slack.md +474 -0
  630. package/dist/data/designs/ios-sleep-cycle-android.md +436 -0
  631. package/dist/data/designs/ios-sleep-cycle-expo.md +380 -0
  632. package/dist/data/designs/ios-sleep-cycle-swiftui.md +409 -0
  633. package/dist/data/designs/ios-sleep-cycle.md +386 -0
  634. package/dist/data/designs/ios-snapchat-android.md +671 -0
  635. package/dist/data/designs/ios-snapchat-expo.md +528 -0
  636. package/dist/data/designs/ios-snapchat-swiftui.md +557 -0
  637. package/dist/data/designs/ios-snapchat.md +478 -0
  638. package/dist/data/designs/ios-sofi-android.md +446 -0
  639. package/dist/data/designs/ios-sofi-expo.md +387 -0
  640. package/dist/data/designs/ios-sofi-swiftui.md +379 -0
  641. package/dist/data/designs/ios-sofi.md +385 -0
  642. package/dist/data/designs/ios-soundcloud-android.md +488 -0
  643. package/dist/data/designs/ios-soundcloud-expo.md +364 -0
  644. package/dist/data/designs/ios-soundcloud-swiftui.md +399 -0
  645. package/dist/data/designs/ios-soundcloud.md +359 -0
  646. package/dist/data/designs/ios-southwest-android.md +446 -0
  647. package/dist/data/designs/ios-southwest-expo.md +389 -0
  648. package/dist/data/designs/ios-southwest-swiftui.md +405 -0
  649. package/dist/data/designs/ios-southwest.md +405 -0
  650. package/dist/data/designs/ios-spotify-android.md +427 -0
  651. package/dist/data/designs/ios-spotify-expo.md +321 -0
  652. package/dist/data/designs/ios-spotify-swiftui.md +312 -0
  653. package/dist/data/designs/ios-spotify.md +366 -0
  654. package/dist/data/designs/ios-starbucks-android.md +622 -0
  655. package/dist/data/designs/ios-starbucks-expo.md +497 -0
  656. package/dist/data/designs/ios-starbucks-swiftui.md +500 -0
  657. package/dist/data/designs/ios-starbucks.md +440 -0
  658. package/dist/data/designs/ios-strava-android.md +656 -0
  659. package/dist/data/designs/ios-strava-expo.md +501 -0
  660. package/dist/data/designs/ios-strava-swiftui.md +465 -0
  661. package/dist/data/designs/ios-strava.md +433 -0
  662. package/dist/data/designs/ios-strong-android.md +479 -0
  663. package/dist/data/designs/ios-strong-expo.md +396 -0
  664. package/dist/data/designs/ios-strong-swiftui.md +363 -0
  665. package/dist/data/designs/ios-strong.md +415 -0
  666. package/dist/data/designs/ios-substack-android.md +440 -0
  667. package/dist/data/designs/ios-substack-expo.md +395 -0
  668. package/dist/data/designs/ios-substack-swiftui.md +371 -0
  669. package/dist/data/designs/ios-substack.md +372 -0
  670. package/dist/data/designs/ios-swiggy-android.md +549 -0
  671. package/dist/data/designs/ios-swiggy-expo.md +443 -0
  672. package/dist/data/designs/ios-swiggy-swiftui.md +471 -0
  673. package/dist/data/designs/ios-swiggy.md +432 -0
  674. package/dist/data/designs/ios-taco-bell-android.md +529 -0
  675. package/dist/data/designs/ios-taco-bell-expo.md +407 -0
  676. package/dist/data/designs/ios-taco-bell-swiftui.md +419 -0
  677. package/dist/data/designs/ios-taco-bell.md +430 -0
  678. package/dist/data/designs/ios-telegram-android.md +676 -0
  679. package/dist/data/designs/ios-telegram-expo.md +594 -0
  680. package/dist/data/designs/ios-telegram-swiftui.md +518 -0
  681. package/dist/data/designs/ios-telegram.md +458 -0
  682. package/dist/data/designs/ios-the-league-android.md +454 -0
  683. package/dist/data/designs/ios-the-league-expo.md +391 -0
  684. package/dist/data/designs/ios-the-league-swiftui.md +409 -0
  685. package/dist/data/designs/ios-the-league.md +368 -0
  686. package/dist/data/designs/ios-things-3-android.md +421 -0
  687. package/dist/data/designs/ios-things-3-expo.md +351 -0
  688. package/dist/data/designs/ios-things-3-swiftui.md +359 -0
  689. package/dist/data/designs/ios-things-3.md +339 -0
  690. package/dist/data/designs/ios-threads-android.md +588 -0
  691. package/dist/data/designs/ios-threads-expo.md +468 -0
  692. package/dist/data/designs/ios-threads-swiftui.md +452 -0
  693. package/dist/data/designs/ios-threads.md +424 -0
  694. package/dist/data/designs/ios-threema-android.md +496 -0
  695. package/dist/data/designs/ios-threema-expo.md +415 -0
  696. package/dist/data/designs/ios-threema-swiftui.md +446 -0
  697. package/dist/data/designs/ios-threema.md +397 -0
  698. package/dist/data/designs/ios-tidal-android.md +398 -0
  699. package/dist/data/designs/ios-tidal-expo.md +323 -0
  700. package/dist/data/designs/ios-tidal-swiftui.md +340 -0
  701. package/dist/data/designs/ios-tidal.md +351 -0
  702. package/dist/data/designs/ios-tiktok-android.md +654 -0
  703. package/dist/data/designs/ios-tiktok-expo.md +578 -0
  704. package/dist/data/designs/ios-tiktok-swiftui.md +595 -0
  705. package/dist/data/designs/ios-tiktok.md +387 -0
  706. package/dist/data/designs/ios-tinder-android.md +681 -0
  707. package/dist/data/designs/ios-tinder-expo.md +512 -0
  708. package/dist/data/designs/ios-tinder-swiftui.md +497 -0
  709. package/dist/data/designs/ios-tinder.md +415 -0
  710. package/dist/data/designs/ios-todoist-android.md +711 -0
  711. package/dist/data/designs/ios-todoist-expo.md +607 -0
  712. package/dist/data/designs/ios-todoist-swiftui.md +573 -0
  713. package/dist/data/designs/ios-todoist.md +418 -0
  714. package/dist/data/designs/ios-trello-android.md +412 -0
  715. package/dist/data/designs/ios-trello-expo.md +332 -0
  716. package/dist/data/designs/ios-trello-swiftui.md +359 -0
  717. package/dist/data/designs/ios-trello.md +344 -0
  718. package/dist/data/designs/ios-tripadvisor-android.md +450 -0
  719. package/dist/data/designs/ios-tripadvisor-expo.md +322 -0
  720. package/dist/data/designs/ios-tripadvisor-swiftui.md +326 -0
  721. package/dist/data/designs/ios-tripadvisor.md +356 -0
  722. package/dist/data/designs/ios-tubi-android.md +453 -0
  723. package/dist/data/designs/ios-tubi-expo.md +419 -0
  724. package/dist/data/designs/ios-tubi-swiftui.md +463 -0
  725. package/dist/data/designs/ios-tubi.md +383 -0
  726. package/dist/data/designs/ios-tumblr-android.md +462 -0
  727. package/dist/data/designs/ios-tumblr-expo.md +374 -0
  728. package/dist/data/designs/ios-tumblr-swiftui.md +380 -0
  729. package/dist/data/designs/ios-tumblr.md +337 -0
  730. package/dist/data/designs/ios-turo-android.md +500 -0
  731. package/dist/data/designs/ios-turo-expo.md +454 -0
  732. package/dist/data/designs/ios-turo-swiftui.md +447 -0
  733. package/dist/data/designs/ios-turo.md +392 -0
  734. package/dist/data/designs/ios-twitch-android.md +412 -0
  735. package/dist/data/designs/ios-twitch-expo.md +342 -0
  736. package/dist/data/designs/ios-twitch-swiftui.md +328 -0
  737. package/dist/data/designs/ios-twitch.md +354 -0
  738. package/dist/data/designs/ios-uber-android.md +637 -0
  739. package/dist/data/designs/ios-uber-eats-android.md +502 -0
  740. package/dist/data/designs/ios-uber-eats-expo.md +407 -0
  741. package/dist/data/designs/ios-uber-eats-swiftui.md +393 -0
  742. package/dist/data/designs/ios-uber-eats.md +353 -0
  743. package/dist/data/designs/ios-uber-expo.md +512 -0
  744. package/dist/data/designs/ios-uber-swiftui.md +483 -0
  745. package/dist/data/designs/ios-uber.md +395 -0
  746. package/dist/data/designs/ios-united-airlines-android.md +494 -0
  747. package/dist/data/designs/ios-united-airlines-expo.md +408 -0
  748. package/dist/data/designs/ios-united-airlines-swiftui.md +453 -0
  749. package/dist/data/designs/ios-united-airlines.md +388 -0
  750. package/dist/data/designs/ios-venmo-android.md +654 -0
  751. package/dist/data/designs/ios-venmo-expo.md +458 -0
  752. package/dist/data/designs/ios-venmo-swiftui.md +469 -0
  753. package/dist/data/designs/ios-venmo.md +436 -0
  754. package/dist/data/designs/ios-vercel-android.md +454 -0
  755. package/dist/data/designs/ios-vercel-expo.md +387 -0
  756. package/dist/data/designs/ios-vercel-swiftui.md +374 -0
  757. package/dist/data/designs/ios-vercel.md +399 -0
  758. package/dist/data/designs/ios-vero-android.md +498 -0
  759. package/dist/data/designs/ios-vero-expo.md +376 -0
  760. package/dist/data/designs/ios-vero-swiftui.md +374 -0
  761. package/dist/data/designs/ios-vero.md +394 -0
  762. package/dist/data/designs/ios-viber-android.md +377 -0
  763. package/dist/data/designs/ios-viber-expo.md +375 -0
  764. package/dist/data/designs/ios-viber-swiftui.md +378 -0
  765. package/dist/data/designs/ios-viber.md +403 -0
  766. package/dist/data/designs/ios-vimeo-android.md +465 -0
  767. package/dist/data/designs/ios-vimeo-expo.md +347 -0
  768. package/dist/data/designs/ios-vimeo-swiftui.md +383 -0
  769. package/dist/data/designs/ios-vimeo.md +403 -0
  770. package/dist/data/designs/ios-vrbo-android.md +488 -0
  771. package/dist/data/designs/ios-vrbo-expo.md +395 -0
  772. package/dist/data/designs/ios-vrbo-swiftui.md +421 -0
  773. package/dist/data/designs/ios-vrbo.md +383 -0
  774. package/dist/data/designs/ios-vsco-android.md +490 -0
  775. package/dist/data/designs/ios-vsco-expo.md +413 -0
  776. package/dist/data/designs/ios-vsco-swiftui.md +449 -0
  777. package/dist/data/designs/ios-vsco.md +412 -0
  778. package/dist/data/designs/ios-walmart-android.md +479 -0
  779. package/dist/data/designs/ios-walmart-expo.md +370 -0
  780. package/dist/data/designs/ios-walmart-swiftui.md +387 -0
  781. package/dist/data/designs/ios-walmart.md +366 -0
  782. package/dist/data/designs/ios-waze-android.md +695 -0
  783. package/dist/data/designs/ios-waze-expo.md +587 -0
  784. package/dist/data/designs/ios-waze-swiftui.md +601 -0
  785. package/dist/data/designs/ios-waze.md +453 -0
  786. package/dist/data/designs/ios-webull-android.md +429 -0
  787. package/dist/data/designs/ios-webull-expo.md +384 -0
  788. package/dist/data/designs/ios-webull-swiftui.md +406 -0
  789. package/dist/data/designs/ios-webull.md +375 -0
  790. package/dist/data/designs/ios-wechat-android.md +545 -0
  791. package/dist/data/designs/ios-wechat-expo.md +398 -0
  792. package/dist/data/designs/ios-wechat-swiftui.md +394 -0
  793. package/dist/data/designs/ios-wechat.md +363 -0
  794. package/dist/data/designs/ios-whatsapp-android.md +568 -0
  795. package/dist/data/designs/ios-whatsapp-expo.md +502 -0
  796. package/dist/data/designs/ios-whatsapp-swiftui.md +483 -0
  797. package/dist/data/designs/ios-whatsapp.md +425 -0
  798. package/dist/data/designs/ios-whoop-android.md +635 -0
  799. package/dist/data/designs/ios-whoop-expo.md +562 -0
  800. package/dist/data/designs/ios-whoop-swiftui.md +553 -0
  801. package/dist/data/designs/ios-whoop.md +419 -0
  802. package/dist/data/designs/ios-wise-android.md +428 -0
  803. package/dist/data/designs/ios-wise-expo.md +357 -0
  804. package/dist/data/designs/ios-wise-swiftui.md +356 -0
  805. package/dist/data/designs/ios-wise.md +361 -0
  806. package/dist/data/designs/ios-x-twitter-android.md +618 -0
  807. package/dist/data/designs/ios-x-twitter-expo.md +442 -0
  808. package/dist/data/designs/ios-x-twitter-swiftui.md +429 -0
  809. package/dist/data/designs/ios-x-twitter.md +432 -0
  810. package/dist/data/designs/ios-yelp-android.md +455 -0
  811. package/dist/data/designs/ios-yelp-expo.md +397 -0
  812. package/dist/data/designs/ios-yelp-swiftui.md +369 -0
  813. package/dist/data/designs/ios-yelp.md +398 -0
  814. package/dist/data/designs/ios-youtube-android.md +668 -0
  815. package/dist/data/designs/ios-youtube-expo.md +435 -0
  816. package/dist/data/designs/ios-youtube-music-android.md +450 -0
  817. package/dist/data/designs/ios-youtube-music-expo.md +404 -0
  818. package/dist/data/designs/ios-youtube-music-swiftui.md +434 -0
  819. package/dist/data/designs/ios-youtube-music.md +381 -0
  820. package/dist/data/designs/ios-youtube-swiftui.md +496 -0
  821. package/dist/data/designs/ios-youtube.md +466 -0
  822. package/dist/data/designs/ios-zalo-android.md +510 -0
  823. package/dist/data/designs/ios-zalo-expo.md +389 -0
  824. package/dist/data/designs/ios-zalo-swiftui.md +431 -0
  825. package/dist/data/designs/ios-zalo.md +388 -0
  826. package/dist/data/designs/ios-zomato-android.md +527 -0
  827. package/dist/data/designs/ios-zomato-expo.md +437 -0
  828. package/dist/data/designs/ios-zomato-swiftui.md +433 -0
  829. package/dist/data/designs/ios-zomato.md +439 -0
  830. package/dist/data/designs/ios-zoom-android.md +423 -0
  831. package/dist/data/designs/ios-zoom-expo.md +355 -0
  832. package/dist/data/designs/ios-zoom-swiftui.md +379 -0
  833. package/dist/data/designs/ios-zoom.md +357 -0
  834. package/dist/data/designs/ios-zwift-android.md +402 -0
  835. package/dist/data/designs/ios-zwift-expo.md +402 -0
  836. package/dist/data/designs/ios-zwift-swiftui.md +378 -0
  837. package/dist/data/designs/ios-zwift.md +411 -0
  838. package/dist/data/designs/kraken.md +125 -0
  839. package/dist/data/designs/lamborghini.md +288 -0
  840. package/dist/data/designs/linear.app.md +548 -0
  841. package/dist/data/designs/lovable.md +298 -0
  842. package/dist/data/designs/mastercard.md +365 -0
  843. package/dist/data/designs/material-clean.md +289 -0
  844. package/dist/data/designs/meta.md +683 -0
  845. package/dist/data/designs/midnight-pro.md +256 -0
  846. package/dist/data/designs/minimal-brutalist.md +245 -0
  847. package/dist/data/designs/minimax.md +746 -0
  848. package/dist/data/designs/mintlify.md +852 -0
  849. package/dist/data/designs/miro.md +825 -0
  850. package/dist/data/designs/mistral.ai.md +773 -0
  851. package/dist/data/designs/mongodb.md +767 -0
  852. package/dist/data/designs/nike.md +575 -0
  853. package/dist/data/designs/nintendo-2001.md +649 -0
  854. package/dist/data/designs/notion.md +821 -0
  855. package/dist/data/designs/nova-mobile-design-md.md +235 -0
  856. package/dist/data/designs/nvidia.md +640 -0
  857. package/dist/data/designs/ollama.md +539 -0
  858. package/dist/data/designs/opencode.ai.md +521 -0
  859. package/dist/data/designs/pinterest.md +597 -0
  860. package/dist/data/designs/playful-color.md +253 -0
  861. package/dist/data/designs/playstation.md +661 -0
  862. package/dist/data/designs/posthog.md +690 -0
  863. package/dist/data/designs/raycast.md +669 -0
  864. package/dist/data/designs/renault.md +589 -0
  865. package/dist/data/designs/replicate.md +616 -0
  866. package/dist/data/designs/resend.md +585 -0
  867. package/dist/data/designs/revolut.md +636 -0
  868. package/dist/data/designs/runwayml.md +244 -0
  869. package/dist/data/designs/sanity.md +357 -0
  870. package/dist/data/designs/sentry.md +551 -0
  871. package/dist/data/designs/shopify.md +516 -0
  872. package/dist/data/designs/slack.md +482 -0
  873. package/dist/data/designs/soft-glass.md +258 -0
  874. package/dist/data/designs/spacex.md +363 -0
  875. package/dist/data/designs/spotify.md +246 -0
  876. package/dist/data/designs/starbucks.md +580 -0
  877. package/dist/data/designs/stripe.md +487 -0
  878. package/dist/data/designs/supabase.md +462 -0
  879. package/dist/data/designs/superhuman.md +448 -0
  880. package/dist/data/designs/tesla.md +286 -0
  881. package/dist/data/designs/theverge.md +339 -0
  882. package/dist/data/designs/together.ai.md +633 -0
  883. package/dist/data/designs/uber.md +636 -0
  884. package/dist/data/designs/vercel.md +736 -0
  885. package/dist/data/designs/vodafone.md +538 -0
  886. package/dist/data/designs/voltagent.md +521 -0
  887. package/dist/data/designs/warp.md +526 -0
  888. package/dist/data/designs/webflow.md +588 -0
  889. package/dist/data/designs/wired.md +497 -0
  890. package/dist/data/designs/wise.md +544 -0
  891. package/dist/data/designs/x.ai.md +465 -0
  892. package/dist/data/designs/zapier.md +537 -0
  893. package/dist/data/index.json +2600 -0
  894. package/dist/httpServer.js +83 -0
  895. package/dist/index.js +13 -0
  896. package/dist/server.js +32 -0
  897. package/dist/services/designStore.js +59 -0
  898. package/dist/services/linter.js +87 -0
  899. package/dist/services/sectionParser.js +154 -0
  900. package/dist/tools/authoring.js +131 -0
  901. package/dist/tools/browse.js +232 -0
  902. package/dist/tools/diff.js +88 -0
  903. package/dist/tools/getDesign.js +216 -0
  904. package/dist/tools/guardrails.js +87 -0
  905. package/dist/tools/lint.js +104 -0
  906. package/dist/types.js +1 -0
  907. package/package.json +65 -0
@@ -0,0 +1,327 @@
1
+ # Calm (iOS) — SwiftUI Implementation Guide
2
+
3
+ Companion to [DESIGN.md](DESIGN.md) — the framework-neutral spec. This file translates Calm's visual language into paste-ready SwiftUI code: `Color` extensions, `Font` extensions, `ViewModifier`s, and example views.
4
+
5
+ ## 1. Color Tokens
6
+
7
+ ```swift
8
+ import SwiftUI
9
+
10
+ extension Color {
11
+ // MARK: - Night-Sky Gradient
12
+ static let calmGradientTop = Color(red: 0.165, green: 0.435, blue: 0.839) // #2A6FD6
13
+ static let calmGradientMid = Color(red: 0.102, green: 0.290, blue: 0.561) // #1A4A8F
14
+ static let calmGradientBottom = Color(red: 0.043, green: 0.118, blue: 0.247) // #0B1E3F
15
+ static let calmScrimNavy = Color(red: 0.035, green: 0.094, blue: 0.188) // #091830
16
+
17
+ // MARK: - Glass Surfaces
18
+ static let calmGlass = Color.white.opacity(0.08)
19
+ static let calmGlassRaised = Color.white.opacity(0.12)
20
+ static let calmGlassDivider = Color.white.opacity(0.12)
21
+ static let calmGlassHover = Color.white.opacity(0.16)
22
+
23
+ // MARK: - Text
24
+ static let calmTextPrimary = Color.white // #FFFFFF
25
+ static let calmTextSecondary = Color(red: 0.722, green: 0.769, blue: 0.847) // #B8C4D8
26
+ static let calmTextTertiary = Color(red: 0.529, green: 0.580, blue: 0.659) // #8794A8
27
+
28
+ // MARK: - Accent
29
+ static let calmBlue = Color(red: 0.165, green: 0.435, blue: 0.839) // #2A6FD6
30
+ static let calmBluePressed = Color(red: 0.122, green: 0.341, blue: 0.671) // #1F57AB
31
+ static let calmBlueSoft = Color(red: 0.290, green: 0.522, blue: 0.878) // #4A85E0
32
+ static let calmStreakGold = Color(red: 0.949, green: 0.812, blue: 0.298) // #F2C94C
33
+ static let calmGentleError = Color(red: 0.878, green: 0.541, blue: 0.541) // #E08A8A
34
+ static let calmSuccess = Color(red: 0.498, green: 0.722, blue: 0.627) // #7FB8A0
35
+ }
36
+
37
+ extension LinearGradient {
38
+ static let calmSky = LinearGradient(
39
+ stops: [
40
+ .init(color: .calmGradientTop, location: 0.0),
41
+ .init(color: .calmGradientMid, location: 0.45),
42
+ .init(color: .calmGradientBottom, location: 1.0),
43
+ ],
44
+ startPoint: .top, endPoint: .bottom
45
+ )
46
+ }
47
+ ```
48
+
49
+ ## 2. Typography
50
+
51
+ Lora (serif headlines) and Inter (sans body) are both open-source (SIL OFL). Bundle TTFs via `Info.plist` (`UIAppFonts`).
52
+
53
+ ```swift
54
+ extension Font {
55
+ // Lora — serif, the brand voice
56
+ static let calmGreeting = Font.custom("Lora-SemiBold", size: 30)
57
+ static let calmScreenTitle = Font.custom("Lora-SemiBold", size: 26)
58
+ static let calmDailyTitle = Font.custom("Lora-SemiBold", size: 24)
59
+ static let calmCardTitle = Font.custom("Lora-SemiBold", size: 19)
60
+ static let calmBreatheCue = Font.custom("Lora-Regular", size: 22)
61
+
62
+ // Inter — sans, supporting
63
+ static let calmSection = Font.custom("Inter-Bold", size: 16)
64
+ static let calmRowTitle = Font.custom("Inter-SemiBold", size: 17)
65
+ static let calmBody = Font.custom("Inter-Regular", size: 17)
66
+ static let calmSubtitle = Font.custom("Inter-Regular", size: 15)
67
+ static let calmButton = Font.custom("Inter-SemiBold", size: 17)
68
+ static let calmMeta = Font.custom("Inter-Medium", size: 13)
69
+ static let calmTab = Font.custom("Inter-SemiBold", size: 11)
70
+ static let calmTimer = Font.custom("Inter-Light", size: 44)
71
+ static let calmLabelUpper = Font.custom("Inter-Bold", size: 12)
72
+ }
73
+ ```
74
+
75
+ ## 3. Signature Components
76
+
77
+ ### Night-Sky Background
78
+
79
+ ```swift
80
+ struct CalmBackground<Content: View>: View {
81
+ @ViewBuilder var content: Content
82
+ var body: some View {
83
+ ZStack {
84
+ LinearGradient.calmSky.ignoresSafeArea()
85
+ content
86
+ }
87
+ }
88
+ }
89
+ ```
90
+
91
+ ### Breathe Bubble (signature)
92
+
93
+ ```swift
94
+ struct BreatheBubble: View {
95
+ @State private var diameter: CGFloat = 120
96
+ @State private var cue = "Breathe in"
97
+ private let base: CGFloat = 120
98
+ private let peak: CGFloat = 220
99
+
100
+ var body: some View {
101
+ ZStack {
102
+ Circle()
103
+ .fill(Color.white.opacity(0.9))
104
+ .frame(width: diameter, height: diameter)
105
+ .shadow(color: .calmBlueSoft.opacity(0.6), radius: 40)
106
+ Text(cue)
107
+ .font(.calmBreatheCue)
108
+ .foregroundStyle(Color.calmGradientBottom)
109
+ .animation(.easeInOut(duration: 0.6), value: cue)
110
+ }
111
+ .onAppear { runCycle() }
112
+ }
113
+
114
+ private func runCycle() {
115
+ // Inhale 4s
116
+ withAnimation(.easeIn(duration: 4)) { diameter = peak }
117
+ cue = "Breathe in"
118
+ // Hold 7s
119
+ DispatchQueue.main.asyncAfter(deadline: .now() + 4) { cue = "Hold" }
120
+ // Exhale 8s
121
+ DispatchQueue.main.asyncAfter(deadline: .now() + 11) {
122
+ cue = "Breathe out"
123
+ withAnimation(.easeOut(duration: 8)) { diameter = base }
124
+ }
125
+ DispatchQueue.main.asyncAfter(deadline: .now() + 19) { runCycle() }
126
+ }
127
+ }
128
+ ```
129
+
130
+ ### Primary Play Pill
131
+
132
+ ```swift
133
+ struct CalmPlayPill: View {
134
+ let title: String
135
+ let action: () -> Void
136
+
137
+ var body: some View {
138
+ Button(action: action) {
139
+ HStack(spacing: 10) {
140
+ Image(systemName: "play.fill").font(.system(size: 16))
141
+ Text(title).font(.calmButton)
142
+ }
143
+ .foregroundStyle(.white)
144
+ .padding(.vertical, 16)
145
+ .padding(.horizontal, 40)
146
+ .background(Capsule().fill(Color.calmBlue))
147
+ }
148
+ .sensoryFeedback(.impact(flexibility: .soft), trigger: title)
149
+ .buttonStyle(CalmPressableStyle(scale: 0.97))
150
+ }
151
+ }
152
+
153
+ struct CalmPressableStyle: ButtonStyle {
154
+ var scale: CGFloat = 0.97
155
+ func makeBody(configuration: Configuration) -> some View {
156
+ configuration.label
157
+ .scaleEffect(configuration.isPressed ? scale : 1)
158
+ .animation(.easeOut(duration: 0.25), value: configuration.isPressed)
159
+ }
160
+ }
161
+ ```
162
+
163
+ ### Daily Calm Hero Card (signature)
164
+
165
+ ```swift
166
+ struct DailyCalmHero: View {
167
+ let title: String
168
+ let subtitle: String
169
+ let photo: Image
170
+ let onPlay: () -> Void
171
+
172
+ var body: some View {
173
+ ZStack(alignment: .bottomLeading) {
174
+ photo.resizable().aspectRatio(contentMode: .fill)
175
+ LinearGradient(
176
+ colors: [.clear, .calmScrimNavy.opacity(0.85)],
177
+ startPoint: .top, endPoint: .bottom
178
+ )
179
+ HStack(alignment: .bottom) {
180
+ VStack(alignment: .leading, spacing: 6) {
181
+ Text("DAILY CALM")
182
+ .font(.calmLabelUpper).tracking(1)
183
+ .foregroundStyle(.white)
184
+ Text(title).font(.calmDailyTitle).foregroundStyle(.white)
185
+ Text(subtitle).font(.calmSubtitle).foregroundStyle(Color.calmTextSecondary)
186
+ }
187
+ Spacer()
188
+ Button(action: onPlay) {
189
+ Image(systemName: "play.fill")
190
+ .font(.system(size: 18)).foregroundStyle(.white)
191
+ .frame(width: 44, height: 44)
192
+ .background(Circle().fill(Color.white.opacity(0.16)))
193
+ }
194
+ }
195
+ .padding(20)
196
+ }
197
+ .frame(height: 220)
198
+ .clipShape(RoundedRectangle(cornerRadius: 20))
199
+ }
200
+ }
201
+ ```
202
+
203
+ ### Sleep Story List Row
204
+
205
+ ```swift
206
+ struct SleepStoryRow: View {
207
+ let title: String
208
+ let narrator: String
209
+ let duration: String
210
+ let thumb: Image
211
+
212
+ var body: some View {
213
+ HStack(spacing: 14) {
214
+ thumb.resizable().aspectRatio(contentMode: .fill)
215
+ .frame(width: 56, height: 56)
216
+ .clipShape(RoundedRectangle(cornerRadius: 12))
217
+ VStack(alignment: .leading, spacing: 4) {
218
+ Text(title).font(.calmRowTitle).foregroundStyle(.white)
219
+ Text("Narrated by \(narrator) · \(duration)")
220
+ .font(.calmSubtitle).foregroundStyle(Color.calmTextSecondary)
221
+ }
222
+ Spacer()
223
+ Image(systemName: "arrow.down.circle")
224
+ .font(.system(size: 22)).foregroundStyle(.white.opacity(0.8))
225
+ }
226
+ .padding(.horizontal, 20).frame(height: 76)
227
+ .contentShape(Rectangle())
228
+ .overlay(alignment: .bottom) {
229
+ Rectangle().fill(Color.calmGlassDivider).frame(height: 1)
230
+ }
231
+ }
232
+ }
233
+ ```
234
+
235
+ ### Glass Card
236
+
237
+ ```swift
238
+ struct CalmGlassCard<Content: View>: View {
239
+ @ViewBuilder var content: Content
240
+ var body: some View {
241
+ content
242
+ .padding(20)
243
+ .background(.ultraThinMaterial.opacity(0.6))
244
+ .background(Color.calmGlass)
245
+ .overlay(RoundedRectangle(cornerRadius: 20)
246
+ .strokeBorder(Color.calmGlassDivider, lineWidth: 1))
247
+ .clipShape(RoundedRectangle(cornerRadius: 20))
248
+ }
249
+ }
250
+ ```
251
+
252
+ ## 4. Tab Bar
253
+
254
+ Use `TabView` with a custom `UITabBarAppearance` matching the deep-navy glass base of the gradient. **Active tint is Calm Blue.**
255
+
256
+ ```swift
257
+ struct RootTabView: View {
258
+ init() {
259
+ let a = UITabBarAppearance()
260
+ a.configureWithTransparentBackground()
261
+ a.backgroundEffect = UIBlurEffect(style: .systemMaterialDark)
262
+ a.backgroundColor = UIColor(Color.calmGradientBottom).withAlphaComponent(0.72)
263
+ UITabBar.appearance().standardAppearance = a
264
+ UITabBar.appearance().scrollEdgeAppearance = a
265
+ }
266
+ var body: some View {
267
+ TabView {
268
+ HomeView().tabItem { Label("Home", systemImage: "house.fill") }
269
+ SleepView().tabItem { Label("Sleep", systemImage: "moon.stars.fill") }
270
+ MeditateView().tabItem { Label("Meditate", systemImage: "figure.mind.and.body") }
271
+ MusicView().tabItem { Label("Music", systemImage: "music.note") }
272
+ MoreView().tabItem { Label("More", systemImage: "ellipsis") }
273
+ }
274
+ .tint(.calmBlue)
275
+ }
276
+ }
277
+ ```
278
+
279
+ ## 5. Motion
280
+
281
+ ```swift
282
+ // Breathe bubble: 4s ease-in → hold 7s → 8s ease-out, looping (see BreatheBubble.runCycle)
283
+
284
+ // Card tap
285
+ .buttonStyle(CalmPressableStyle(scale: 0.97)) // 250ms ease-out
286
+
287
+ // Screen transitions — Calm fades, never hard-slides
288
+ .transition(.opacity.animation(.easeInOut(duration: 0.55)))
289
+
290
+ // Session timer ring — linear sweep over duration
291
+ withAnimation(.linear(duration: sessionLength)) { progress = 1.0 }
292
+
293
+ // Session complete
294
+ .sensoryFeedback(.success, trigger: didComplete) // soft sage check fades in over 600ms
295
+ ```
296
+
297
+ Haptics via `.sensoryFeedback` (iOS 17+): `.impact(flexibility: .soft)` on play, `.success` on session complete, `.selection` on mood-chip pick. Keep haptics gentle and rare — Calm is serene.
298
+
299
+ ## 6. SF Symbols Used
300
+
301
+ | Component | Symbol | Size |
302
+ |-----------|--------|------|
303
+ | Play | `play.fill` | 16-24pt |
304
+ | Pause | `pause.fill` | 24pt |
305
+ | Favorite | `heart` / `heart.fill` | 22pt |
306
+ | Download | `arrow.down.circle` / `.fill` | 22pt |
307
+ | Share | `square.and.arrow.up` | 22pt |
308
+ | Background sound | `slider.horizontal.3` | 22pt |
309
+ | Timer | `timer` | 22pt |
310
+ | Search | `magnifyingglass` | 16pt |
311
+ | Streak | `flame.fill` | 18pt |
312
+ | Settings | `gearshape` | 22pt |
313
+ | Home (tab) | `house.fill` | 24pt |
314
+ | Sleep (tab) | `moon.stars.fill` | 24pt |
315
+ | Meditate (tab) | `figure.mind.and.body` | 24pt |
316
+ | Music (tab) | `music.note` | 24pt |
317
+ | More (tab) | `ellipsis` | 24pt |
318
+
319
+ ## 7. Minimum iOS & Accessibility Notes
320
+
321
+ - Minimum target: iOS 16 (`.sensoryFeedback` needs iOS 17; fall back to `UIImpactFeedbackGenerator`)
322
+ - Dynamic Type: scale greetings, titles, body, narrator (both Lora and Inter); pin tab labels (11pt), duration meta (13pt), and cap the session timer at 56pt
323
+ - VoiceOver: the breathe bubble is decorative/ambient — mark it `.accessibilityHidden(true)` and instead announce the phase ("Breathe in", "Hold", "Breathe out") via an `.accessibilityLabel` on a hidden live element; label the play pill "Play Daily Calm"
324
+ - Reduce Motion: replace the breathe-bubble scale animation with a static circle plus a text-only phase cue; replace cross-dissolves with instant cuts
325
+ - Reduce Transparency: when enabled, swap glass surfaces (`rgba(255,255,255,0.08)`) for solid `#13294B` so cards stay legible without blur
326
+ - Contrast: `#B8C4D8` on the mid-gradient passes AA at 15pt+; validate the 13pt meta over the lighter top of the gradient and darken the scrim if needed
327
+ - Dark-only: do not provide a light `ColorScheme`; lock the app to `.dark`
@@ -0,0 +1,356 @@
1
+ # Design System Inspiration of Calm (iOS)
2
+
3
+ ## 1. Visual Theme & Atmosphere
4
+
5
+ Calm's iOS app is a night sky you can fall asleep inside. The defining surface is a full-screen vertical gradient that runs from a deep twilight blue (`#2A6FD6`) at the top down to a near-black navy (`#0B1E3F`) at the bottom — the color of dusk just after the sun has gone. Over that gradient, almost everything is glass: cards are translucent white (`rgba(255,255,255,0.08)`) so the sky shows through them. The result is an interface that feels less like an app and more like a calm physical space — a planetarium, a lakeside at night — where nothing is sharp, nothing is loud, and the eye is never asked to work.
6
+
7
+ The accent system is a single, quiet blue. Calm Blue (`#2A6FD6`) is the only saturated color, and it is used sparingly: the primary "Play"/"Start" pill, the active tab, the progress arc on the breathing exercise. Everything else is white at varying opacities — full white for headlines, ~72% white (`#B8C4D8`) for supporting copy. There are no reds, no greens, no semantic traffic lights in the main experience; even errors are stated softly. Photography does the emotional work: full-bleed nature imagery (forests, rain on glass, slow waves) sits behind the content, gently darkened so type stays readable.
8
+
9
+ Typography is a deliberate pairing. Headlines are set in **Lora**, a contemporary serif with a literary, bedtime-story warmth — "Daily Calm", a sleep story title, the greeting "Good evening". Body and UI text are **Inter**, a clean humanist sans that disappears into the background. The contrast between the two is the brand's voice: the serif speaks (calm, human, narrative), the sans supports (functional, quiet). Sizes are generous and airy — a 30pt serif hero, 17pt body — with weights kept soft (400 / 600 / 700, never heavier). The single most expressive moment is the breathe bubble: a soft white circle that expands and contracts on a 4-7-8 cycle, the type around it fading "Breathe in… Hold… Breathe out…" in time.
10
+
11
+ **Key Characteristics:**
12
+ - Full-screen night-sky gradient (`#2A6FD6` → `#0B1E3F`) as the canvas — dusk, not pure black
13
+ - Glass cards — translucent white (`rgba(255,255,255,0.08)`) so the sky shows through
14
+ - Calm Blue (`#2A6FD6`) as the single accent — primary actions, active tab, progress arc
15
+ - Full-bleed, gently-darkened nature photography behind content
16
+ - Serif/sans pairing — **Lora** for headlines (bedtime-story warmth), **Inter** for body
17
+ - The breathe bubble — a soft circle that scales on a 4-7-8 breathing loop (signature)
18
+ - Daily Calm hero card — the day's featured meditation, large and photographic
19
+ - Sleep Story list rows — narrator + duration, designed to be read in the dark
20
+ - Bottom tabs (Home / Sleep / Meditate / Music / More) — soft, glass-backed
21
+ - Motion is slow and continuous — nothing snaps; everything eases over 600ms+
22
+
23
+ ## 2. Color Palette & Roles
24
+
25
+ ### Primary
26
+ - **Calm Blue** (`#2A6FD6`): The single accent — primary "Play"/"Start" pill, active tab icon/label, breathing progress arc, selected state.
27
+ - **Calm Blue Pressed** (`#1F57AB`): Pressed/active state for the blue pill and controls.
28
+ - **Calm Blue Soft** (`#4A85E0`): Lighter blue used for secondary highlights and the breathe-bubble glow.
29
+
30
+ ### Canvas (Night-Sky Gradient)
31
+ - **Gradient Top** (`#2A6FD6`): The twilight-blue top of the full-screen background gradient.
32
+ - **Gradient Mid** (`#1A4A8F`): The transitional mid-band of the gradient (~45% down).
33
+ - **Gradient Bottom** (`#0B1E3F`): The deep near-black navy at the base — behind the tab bar.
34
+ - **Scrim Navy** (`#091830`): Photo-darkening overlay applied beneath text on imagery.
35
+
36
+ ### Surfaces (Glass)
37
+ - **Glass Surface** (`rgba(255,255,255,0.08)`): Standard card fill — translucent so the sky shows through.
38
+ - **Glass Surface Raised** (`rgba(255,255,255,0.12)`): Higher-elevation cards, the Daily Calm hero, pressed list rows.
39
+ - **Glass Divider** (`rgba(255,255,255,0.12)`): Hairline separators between list rows.
40
+ - **Glass Hover** (`rgba(255,255,255,0.16)`): Pressed state on glass surfaces.
41
+
42
+ ### Text
43
+ - **Text Primary** (`#FFFFFF`): Headlines, card titles, primary copy — pure white for maximum readability on the dark sky.
44
+ - **Text Secondary** (`#B8C4D8`): Narrator names, durations, descriptions, supporting copy (~72% white, cool-toned).
45
+ - **Text Tertiary** (`#8794A8`): Very low-emphasis metadata, disabled labels, timestamps.
46
+
47
+ ### Semantic (Used Sparingly)
48
+ - **Progress Blue** (`#2A6FD6`): Session progress arc / scrubber fill (same as accent).
49
+ - **Streak Gold** (`#F2C94C`): Streak flame and "X-day streak" emphasis — the only warm accent, rare.
50
+ - **Gentle Error** (`#E08A8A`): Soft desaturated rose for the rare error message — never harsh red.
51
+ - **Success Calm** (`#7FB8A0`): Soft sage for "Session complete" confirmation.
52
+
53
+ ### Light Mode
54
+ Calm's iOS app is effectively dark-only — the night-sky gradient is intrinsic to the brand and the product is used primarily before sleep. There is no shipped light variant. (A daytime reference would invert to Canvas `#EAF1FB`, Text `#0B1E3F`, but it is not part of the product.)
55
+
56
+ ## 3. Typography Rules
57
+
58
+ ### Font Family
59
+ - **Headline / Display**: `Lora` — a contemporary serif with literary, bedtime-story warmth
60
+ - **Body / UI**: `Inter` — a clean humanist sans that recedes
61
+ - **Fallback (serif)**: `Georgia, 'Times New Roman', serif`
62
+ - **Fallback (sans)**: `-apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Segoe UI', Roboto, sans-serif`
63
+
64
+ ### Hierarchy
65
+
66
+ | Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
67
+ |------|------|------|--------|-------------|----------------|-------|
68
+ | Greeting Hero | Lora | 30pt | 600 | 1.25 | -0.2pt | "Good evening, Sam" on Home |
69
+ | Screen Title | Lora | 26pt | 600 | 1.3 | -0.2pt | "Sleep", "Meditate" screen heads |
70
+ | Daily Calm Title | Lora | 24pt | 600 | 1.3 | -0.1pt | The featured-session title on the hero card |
71
+ | Card Title | Lora | 19pt | 600 | 1.35 | 0pt | Sleep-story / meditation card titles |
72
+ | Section Header | Inter | 16pt | 700 | 1.3 | 0.2pt | "Sleep Stories", "Featured" labels |
73
+ | List Row Title | Inter | 17pt | 600 | 1.35 | 0pt | Sleep-story row name |
74
+ | Body | Inter | 17pt | 400 | 1.55 | 0pt | Descriptions, session intros |
75
+ | Subtitle / Narrator | Inter | 15pt | 400 | 1.4 | 0pt | "Narrated by Tamara · 32 min" |
76
+ | Button (Primary) | Inter | 17pt | 600 | 1.0 | 0.1pt | "Play", "Start session" pill text |
77
+ | Meta / Duration | Inter | 13pt | 500 | 1.3 | 0.2pt | "10 min", "Day 214" |
78
+ | Tab Label | Inter | 11pt | 600 | 1.0 | 0.2pt | Bottom tab bar labels |
79
+ | Breathe Cue | Lora | 22pt | 400 | 1.2 | 0.5pt | "Breathe in" / "Hold" / "Breathe out" |
80
+ | Timer (large) | Inter | 44pt | 300 | 1.0 | 0pt | The countdown during a session (light weight, airy) |
81
+ | Label (UPPER) | Inter | 12pt | 700 | 1.2 | 1.0pt | "DAILY CALM", "NEW" tags |
82
+
83
+ ### Principles
84
+ - **Serif speaks, sans supports**: Lora carries every emotional/narrative string (greetings, titles, breathe cues); Inter carries every functional one (buttons, meta, navigation). Never swap them.
85
+ - **Generous leading**: Body runs at 1.55 — this is a calm reading surface, not a dense feed.
86
+ - **Soft weights only**: Lora at 400/600, Inter at 400/500/600/700. The session timer uses Inter 300 (Light) deliberately — it should feel weightless.
87
+ - **Whitespace is the typography**: large type, lots of air, short lines. Nothing is cramped.
88
+ - **Color is structural**: text is white or cool-grey; Calm Blue is never used for body text emphasis (use the serif or weight instead).
89
+
90
+ ## 4. Component Stylings
91
+
92
+ ### Buttons
93
+
94
+ **Primary Play / Start Pill**
95
+ - Shape: Full pill, height 52pt
96
+ - Background: `#2A6FD6`
97
+ - Text: `#FFFFFF`, Inter 17pt weight 600, with a leading `play.fill` SF Symbol 16pt
98
+ - Padding: 16pt vertical, 40pt horizontal
99
+ - Pressed: background `#1F57AB`, scale 0.97, soft haptic
100
+ - Used for: "Play", "Start session", "Begin", "Continue"
101
+
102
+ **Glass Secondary Button**
103
+ - Background: `rgba(255,255,255,0.12)`
104
+ - Text: `#FFFFFF`, Inter 16pt weight 600
105
+ - Border: 1pt `rgba(255,255,255,0.16)`
106
+ - Padding: 14pt vertical, 28pt horizontal, corner radius 26pt (full pill)
107
+ - Pressed: background `rgba(255,255,255,0.16)`
108
+ - Used for: "Add to favorites", secondary CTAs on cards
109
+
110
+ **Icon Actions (Favorite, Download, Share, Background-sound)**
111
+ - Size: 22pt glyph, 44pt hit area
112
+ - Default: `#FFFFFF` at 80% opacity
113
+ - Active: `#2A6FD6` (favorite saved, downloaded)
114
+ - Spacing: 28pt between icons in the player action row
115
+
116
+ **Text Button ("See all", "Skip")**
117
+ - Font: Inter 15pt weight 600
118
+ - Color: `#B8C4D8`
119
+ - No background, 44pt hit area
120
+
121
+ ### Cards & Containers
122
+
123
+ **Daily Calm Hero Card** *(signature)*
124
+ - Height: ~220pt, full content width
125
+ - Background: full-bleed nature photograph, darkened with a `#091830` → transparent bottom-up gradient (so text is legible)
126
+ - Overlay content (bottom-left): "DAILY CALM" label 12pt w700 letter-spaced `#FFFFFF`, then Lora 24pt w600 title, then Inter 15pt `#B8C4D8` subtitle "Today · 10 min"
127
+ - Trailing: a 44pt circular glass play button (`rgba(255,255,255,0.16)`, `play.fill` 18pt white)
128
+ - Corner radius: 20pt
129
+ - Pressed: scale 0.98, subtle brightness lift on the photo
130
+
131
+ **Sleep Story / Meditation Card (Shelf tile)**
132
+ - Width: 160pt, photographic top (1:1 or 4:3), text below
133
+ - Background: glass `rgba(255,255,255,0.08)` behind the text zone
134
+ - Corner radius: 16pt on the image
135
+ - Structure: image → Lora 19pt w600 title (2-line clamp) → Inter 13pt w500 `#B8C4D8` "32 min · Sleep"
136
+ - Gap between tiles: 14pt
137
+ - Tap: scale 0.97 with soft haptic
138
+
139
+ **Sleep Story List Row**
140
+ - Height: 76pt
141
+ - Layout: 56pt rounded thumbnail (12pt radius) → stacked title/narrator → trailing duration + download glyph
142
+ - Background: transparent over the gradient; pressed → `rgba(255,255,255,0.12)`
143
+ - Title: Inter 17pt w600 white; Narrator: Inter 15pt w400 `#B8C4D8`
144
+ - Divider: 1pt `rgba(255,255,255,0.12)` between rows
145
+
146
+ **Glass Card (generic container)**
147
+ - Background: `rgba(255,255,255,0.08)` with a 20pt backdrop blur (the sky blurs through it)
148
+ - Border: 1pt `rgba(255,255,255,0.12)`
149
+ - Corner radius: 20pt
150
+ - Padding: 20pt
151
+
152
+ ### Navigation
153
+
154
+ **Bottom Tab Bar**
155
+ - Height: 56pt + safe area
156
+ - Background: `rgba(11,30,63,0.72)` with `.regularMaterial` blur (the deep navy base of the gradient, glassed)
157
+ - Tabs: Home, Sleep, Meditate, Music, More
158
+ - Icon size: 24pt
159
+ - Active color: `#2A6FD6` (icon + label both pick up Calm Blue)
160
+ - Inactive: `#FFFFFF` at 60% opacity
161
+ - Labels: Inter 11pt w600, always shown
162
+ - Active icon: filled SF Symbol; inactive: outlined
163
+ - A hairline `rgba(255,255,255,0.12)` top border
164
+
165
+ **Top Bar**
166
+ - Height: 44pt + safe area, transparent (the gradient runs behind it)
167
+ - Left: profile avatar (30pt circular) or greeting
168
+ - Right: streak flame (`#F2C94C`) with day count, then a settings glyph 22pt white
169
+ - No solid background — it floats on the sky; content scrolls beneath
170
+
171
+ **Player Screen (Full)**
172
+ - Full-bleed scene photo or animated gradient, scrim-darkened
173
+ - Centered: Lora 24pt w600 title, Inter 15pt narrator
174
+ - Large circular scrubber arc (Calm Blue progress) around a central 64pt play/pause
175
+ - Below: background-sound selector, timer, favorite — glass icon row
176
+ - A soft "x min remaining" caption in Inter 13pt `#B8C4D8`
177
+
178
+ ### Input Fields
179
+
180
+ **Search Field**
181
+ - Background: `rgba(255,255,255,0.10)`
182
+ - Height: 46pt, corner radius 23pt (full pill)
183
+ - Leading `magnifyingglass` SF Symbol 16pt `#B8C4D8`
184
+ - Placeholder: "Search meditations, sleep stories", 16pt `#8794A8`
185
+ - Text: `#FFFFFF`
186
+ - Focus: border `rgba(255,255,255,0.20)`, no color shift
187
+
188
+ **Mood Check-in Chip**
189
+ - Background: `rgba(255,255,255,0.10)` / `#2A6FD6` selected
190
+ - Text: `#FFFFFF`
191
+ - Padding: 12pt vertical, 20pt horizontal, corner radius 24pt
192
+ - Examples: "Calm", "Anxious", "Tired", "Grateful"
193
+
194
+ ### Distinctive Components
195
+
196
+ **Breathe Bubble** *(signature)*
197
+ - A soft white circle, base diameter ~120pt, on the night-sky gradient with a subtle outer glow (`#4A85E0` blur)
198
+ - Animation cycle (4-7-8 default): expand to ~220pt over **4s** (inhale), hold at full for **7s**, contract to 120pt over **8s** (exhale)
199
+ - The Lora 22pt cue text crossfades in time: "Breathe in" → "Hold" → "Breathe out"
200
+ - Concentric faint rings ripple outward on each inhale
201
+ - Motion easing is `easeInOut`, continuous, never linear — it must feel like breath
202
+
203
+ **Daily Calm Streak**
204
+ - A `#F2C94C` flame glyph + "214-day streak" in Inter 13pt w500
205
+ - On milestone, a gentle particle shimmer (no confetti — Calm stays serene)
206
+
207
+ **Session Timer Ring**
208
+ - Circular progress arc around the player play button
209
+ - Track: `rgba(255,255,255,0.16)`, 3pt; Progress: `#2A6FD6`, 3pt, rounded cap
210
+ - Sweeps clockwise over the session length; the center shows `pause.fill` 24pt white
211
+
212
+ **Soundscape Mixer**
213
+ - A glass sheet with horizontal sliders (rain, waves, fire, white noise)
214
+ - Slider track `rgba(255,255,255,0.16)`, fill `#2A6FD6`, 22pt white thumb
215
+ - Each row: icon + label (Inter 15pt) + slider
216
+
217
+ ## 5. Layout Principles
218
+
219
+ ### Spacing System
220
+ - Base unit: 4pt
221
+ - Scale: 4, 8, 12, 16, 20, 24, 28, 32, 40, 56
222
+ - Standard horizontal margin: 20pt (more generous than typical — Calm breathes)
223
+ - Section spacing: 32pt between shelves
224
+
225
+ ### Grid & Container
226
+ - Single column, full device width with 20pt horizontal margins
227
+ - Horizontal shelves: 14pt gaps, peek the next tile at the right edge
228
+ - Daily Calm hero: full content width, the visual anchor at the top of Home
229
+ - Player: fully centered, vertically balanced
230
+
231
+ ### Whitespace Philosophy
232
+ - **Air is the brand**: large margins (20pt+), generous leading (1.55), 32pt section gaps. The interface should never feel busy — busyness is the opposite of calm.
233
+ - **Photography breathes too**: hero imagery is given full width and never crowded by chrome.
234
+ - **The player is a sanctuary**: it uses the whole screen for one scene and a few large controls.
235
+
236
+ ### Border Radius Scale
237
+ - Soft (12pt): List-row thumbnails
238
+ - Standard (16pt): Shelf tiles, glass buttons (when not full-pill)
239
+ - Comfortable (20pt): Daily Calm hero, generic glass cards, sheets
240
+ - Pill (26pt / full): Primary play pill, glass secondary buttons, search field, chips
241
+ - Circle (50%): Play buttons, avatars, the breathe bubble, timer ring
242
+
243
+ ## 6. Depth & Elevation
244
+
245
+ | Level | Treatment | Use |
246
+ |-------|-----------|-----|
247
+ | Sky (Level 0) | The gradient itself; no shadow | The full-screen background canvas |
248
+ | Glass (Level 1) | `rgba(255,255,255,0.08)` + 20pt backdrop blur | Standard cards, list-row press states |
249
+ | Glass Raised (Level 2) | `rgba(255,255,255,0.12)` + blur + `rgba(0,0,0,0.25) 0 8px 24px` | Daily Calm hero, featured cards |
250
+ | Sheet (Level 3) | `rgba(11,30,63,0.94)` + blur + `rgba(0,0,0,0.4) 0 -16px 48px` | Soundscape mixer, settings sheets |
251
+ | Tab Bar Material | `rgba(11,30,63,0.72)` + `.regularMaterial` | Floats above scrolling content |
252
+ | Scrim | `#091830` → transparent gradient | Darkens photos beneath text |
253
+
254
+ **Shadow Philosophy**: Calm avoids hard shadows almost entirely — depth comes from translucency and blur, not from cast shadows. The sky shows through every glass surface, which is what makes the app feel layered yet weightless. The only real shadows are soft, very diffuse (24-48pt blur, low opacity) under the raised hero card and sheets, just enough to lift them off the gradient. Photography uses a scrim gradient (not a shadow) to keep type readable.
255
+
256
+ ### Motion
257
+ - **Breathe bubble**: scale 120 → 220pt over 4s ease-in (inhale), hold 7s, 220 → 120pt over 8s ease-out (exhale); continuous loop
258
+ - **Card tap**: scale 0.97 → 1.0 over 250ms ease-out, soft haptic
259
+ - **Play pill tap**: scale 0.97, background → `#1F57AB`, `.impactOccurred(.soft)`
260
+ - **Screen transitions**: cross-dissolve 500-600ms (never a hard slide — Calm fades)
261
+ - **Timer ring**: continuous clockwise sweep, linear over session length
262
+ - **Photo parallax**: hero imagery shifts ~8pt on scroll for gentle depth
263
+ - **Session complete**: soft sage check fades in over 600ms with a single gentle haptic
264
+ - **Streak shimmer**: slow particle drift, ~2s, no sharp motion
265
+
266
+ ## 7. Do's and Don'ts
267
+
268
+ ### Do
269
+ - Use the night-sky gradient (`#2A6FD6` → `#0B1E3F`) as the canvas — dusk, not pure black
270
+ - Make cards glass — `rgba(255,255,255,0.08)` with backdrop blur so the sky shows through
271
+ - Reserve Calm Blue (`#2A6FD6`) for primary actions, the active tab, and progress
272
+ - Set headlines in Lora (serif) and body/UI in Inter (sans) — never swap the roles
273
+ - Give the layout generous air — 20pt margins, 1.55 body leading, 32pt sections
274
+ - Animate the breathe bubble on a true 4-7-8 ease-in-out cycle — it must feel like breath
275
+ - Scrim-darken photography with a navy gradient so white type stays readable
276
+ - Keep motion slow and continuous — 500ms+ cross-dissolves, nothing snaps
277
+ - Use the soft session timer in Inter Light (300) — it should feel weightless
278
+
279
+ ### Don't
280
+ - Don't use pure black `#000000` as the canvas — Calm is a twilight gradient, not a void
281
+ - Don't add saturated accent colors beyond Calm Blue (gold streak is the only rare warm)
282
+ - Don't set headlines in a sans — the Lora serif is the brand's voice
283
+ - Don't use hard drop shadows — depth is translucency and blur, not cast shadow
284
+ - Don't crowd the layout — busyness is the opposite of calm
285
+ - Don't animate fast or bouncy — no spring overshoot; everything eases gently
286
+ - Don't use harsh red for errors — use the soft desaturated rose, stated quietly
287
+ - Don't put solid opaque cards on the gradient — the sky must show through the glass
288
+ - Don't make the breathe bubble linear or mechanical — it has to breathe
289
+
290
+ ## 8. Responsive Behavior
291
+
292
+ ### Device Sizes
293
+ | Device | Width | Key Changes |
294
+ |--------|-------|-------------|
295
+ | iPhone SE (3rd gen) | 375pt | 140pt shelf tiles; breathe bubble base 104pt |
296
+ | iPhone 13/14/15 | 390pt | Standard 160pt tiles; breathe bubble base 120pt |
297
+ | iPhone 15/16 Pro | 393pt | Dynamic Island clears the floating top bar |
298
+ | iPhone 15/16 Pro Max | 430pt | 180pt tiles; breathe bubble base 136pt; hero 240pt tall |
299
+ | iPad | 768pt+ | 3-column shelves; player centers with max 600pt content width |
300
+
301
+ ### Dynamic Type
302
+ - Greetings, titles, body, narrator: full scale (Lora and Inter both)
303
+ - Tab labels, duration meta: fixed (layout-sensitive at 11-13pt)
304
+ - Session timer: scales modestly, capped at 56pt
305
+ - Breathe cue: scales but the bubble geometry stays fixed
306
+
307
+ ### Orientation
308
+ - Home / Sleep / Meditate / Music: **portrait-locked** (the gradient is vertical by intent)
309
+ - Player: **portrait-locked** — the scene composition assumes vertical
310
+ - iPad: **rotates** — landscape widens shelves; the player keeps a centered column
311
+
312
+ ### Touch Targets
313
+ - Primary play pill: 52pt tall — generous
314
+ - Card play buttons: 44pt circular
315
+ - List rows: full 76pt height tappable
316
+ - Tab icons: 24pt glyph, 44pt effective hit
317
+ - Breathe bubble: not a button (it is ambient) — controls sit below it
318
+
319
+ ### Safe Area Handling
320
+ - Top: floating bar respects the notch / Dynamic Island; gradient runs to the top edge
321
+ - Bottom: tab bar floats above the home indicator; gradient runs to the bottom edge
322
+ - Sides: 20pt content insets
323
+ - Player: full-bleed scene ignores safe area for the background; controls inset
324
+
325
+ ## 9. Agent Prompt Guide
326
+
327
+ ### Quick Color Reference
328
+ - Gradient top: `#2A6FD6`
329
+ - Gradient mid: `#1A4A8F`
330
+ - Gradient bottom: `#0B1E3F`
331
+ - Glass surface: `rgba(255,255,255,0.08)`
332
+ - Glass raised: `rgba(255,255,255,0.12)`
333
+ - Divider: `rgba(255,255,255,0.12)`
334
+ - Text primary: `#FFFFFF`
335
+ - Text secondary: `#B8C4D8`
336
+ - Calm Blue (accent): `#2A6FD6`
337
+ - Calm Blue pressed: `#1F57AB`
338
+ - Streak gold: `#F2C94C`
339
+
340
+ ### Example Component Prompts
341
+ - "Create a SwiftUI Calm background: a full-screen vertical LinearGradient from #2A6FD6 (top) through #1A4A8F (45%) to #0B1E3F (bottom), ignoring safe area. All content sits on top of this."
342
+ - "Build the Daily Calm hero card: ~220pt tall, full width, a full-bleed nature photo darkened by a #091830-to-transparent bottom-up gradient. Bottom-left overlay: 'DAILY CALM' in Inter 12pt weight 700 letter-spacing 1pt #FFFFFF, then a Lora 24pt weight 600 white title, then Inter 15pt #B8C4D8 'Today · 10 min'. Trailing a 44pt circular glass play button (rgba(255,255,255,0.16), play.fill 18pt white). 20pt corner radius; pressed scales 0.98."
343
+ - "Design the breathe bubble: a soft white circle base diameter 120pt on the night-sky gradient with a #4A85E0 outer glow. Animate scale to 220pt over 4s ease-in (inhale), hold 7s, contract to 120pt over 8s ease-out (exhale), looping. A Lora 22pt cue ('Breathe in' / 'Hold' / 'Breathe out') crossfades in time. Concentric faint rings ripple outward on each inhale."
344
+ - "Create a Sleep Story list row: 76pt tall, a 56pt rounded thumbnail (12pt radius) leading, stacked title in Inter 17pt weight 600 #FFFFFF and 'Narrated by Tamara · 32 min' in Inter 15pt weight 400 #B8C4D8, trailing a download glyph 22pt white at 80% opacity. Transparent over the gradient; pressed background rgba(255,255,255,0.12); 1pt rgba(255,255,255,0.12) divider below."
345
+ - "Build the primary play pill: full pill 52pt tall, background #2A6FD6, leading play.fill SF Symbol 16pt, label in Inter 17pt weight 600 #FFFFFF, padding 16pt vertical / 40pt horizontal. Pressed: background #1F57AB, scale 0.97, soft haptic."
346
+
347
+ ### Iteration Guide
348
+ 1. Canvas is the night-sky gradient `#2A6FD6` → `#0B1E3F` — never pure black
349
+ 2. Cards are glass — `rgba(255,255,255,0.08)` + backdrop blur; the sky must show through
350
+ 3. Calm Blue `#2A6FD6` is the only accent — primary actions, active tab, progress
351
+ 4. Headlines are Lora (serif), body/UI is Inter (sans) — never swap the two roles
352
+ 5. Give everything air — 20pt margins, 1.55 body leading, 32pt section gaps
353
+ 6. The breathe bubble must breathe — a true 4-7-8 ease-in-out cycle, never linear
354
+ 7. Photography is scrim-darkened with navy, not shadowed — keep white type readable
355
+ 8. Motion is slow and continuous — 500ms+ cross-dissolves, no spring bounce
356
+ 9. Calm is dark-only — do not surface a daytime light theme