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,319 @@
1
+ # BeReal (iOS) — SwiftUI Implementation Guide
2
+
3
+ Companion to [DESIGN.md](DESIGN.md) — the framework-neutral spec. This file translates BeReal'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: - Canvas & Surfaces
12
+ static let brealCanvas = Color.black // #000000
13
+ static let brealSurface1 = Color(red: 0.110, green: 0.110, blue: 0.118) // #1C1C1E
14
+ static let brealSurface2 = Color(red: 0.173, green: 0.173, blue: 0.180) // #2C2C2E
15
+ static let brealDivider = Color(red: 0.173, green: 0.173, blue: 0.180) // #2C2C2E
16
+
17
+ // MARK: - Text
18
+ static let brealTextPrimary = Color.white // #FFFFFF
19
+ static let brealTextSecondary = Color(red: 0.557, green: 0.557, blue: 0.576) // #8E8E93
20
+ static let brealTextTertiary = Color(red: 0.388, green: 0.388, blue: 0.400) // #636366
21
+
22
+ // MARK: - Accent (intentionally monochrome)
23
+ static let brealAccent = Color.white // #FFFFFF — no brand hue
24
+ static let brealOnAccent = Color.black // #000000
25
+
26
+ // MARK: - Semantic
27
+ static let brealLate = Color(red: 1.0, green: 0.839, blue: 0.039) // #FFD60A
28
+ static let brealError = Color(red: 1.0, green: 0.271, blue: 0.227) // #FF453A
29
+ static let brealOnline = Color(red: 0.188, green: 0.820, blue: 0.345) // #30D158
30
+ }
31
+ ```
32
+
33
+ ## 2. Typography
34
+
35
+ BeReal ships no custom typeface — it uses the system font (SF Pro). Use `.system` directly; enable `.monospacedDigit()` on the countdown.
36
+
37
+ ```swift
38
+ extension Font {
39
+ // Display
40
+ static let brealTimer = Font.system(size: 24, weight: .bold).monospacedDigit()
41
+ static let brealScreenTitle = Font.system(size: 22, weight: .bold)
42
+
43
+ // Text
44
+ static let brealUsername = Font.system(size: 17, weight: .semibold)
45
+ static let brealCaption = Font.system(size: 16, weight: .regular)
46
+ static let brealBody = Font.system(size: 15, weight: .regular)
47
+ static let brealCommentAuthor = Font.system(size: 14, weight: .semibold)
48
+ static let brealMeta = Font.system(size: 13, weight: .regular)
49
+ static let brealLateBadge = Font.system(size: 12, weight: .bold)
50
+ static let brealButton = Font.system(size: 17, weight: .semibold)
51
+ static let brealTab = Font.system(size: 10, weight: .semibold)
52
+ static let brealRetake = Font.system(size: 11, weight: .semibold)
53
+ }
54
+ ```
55
+
56
+ ## 3. Signature Components
57
+
58
+ ### Dual-Lens Composite Card (the signature)
59
+
60
+ ```swift
61
+ struct DualLensCard: View {
62
+ let backPhoto: Image
63
+ let frontSelfie: Image
64
+ @State private var corner: UnitPoint = .topLeading
65
+ @State private var lifted = false
66
+
67
+ private let selfieSize = CGSize(width: 100, height: 134)
68
+
69
+ var body: some View {
70
+ GeometryReader { geo in
71
+ ZStack(alignment: alignment(for: corner)) {
72
+ backPhoto
73
+ .resizable()
74
+ .aspectRatio(3/4, contentMode: .fill)
75
+ .frame(width: geo.size.width, height: geo.size.width * 4/3)
76
+ .clipShape(RoundedRectangle(cornerRadius: 18))
77
+
78
+ frontSelfie
79
+ .resizable()
80
+ .aspectRatio(3/4, contentMode: .fill)
81
+ .frame(width: selfieSize.width, height: selfieSize.height)
82
+ .clipShape(RoundedRectangle(cornerRadius: 14))
83
+ .overlay(RoundedRectangle(cornerRadius: 14).strokeBorder(.black, lineWidth: 2))
84
+ .padding(12)
85
+ .scaleEffect(lifted ? 1.05 : 1.0)
86
+ .shadow(color: .black.opacity(lifted ? 0.7 : 0), radius: 18, y: 6)
87
+ .gesture(
88
+ LongPressGesture(minimumDuration: 0.2)
89
+ .onEnded { _ in withAnimation(.spring()) { lifted = true } }
90
+ .sequenced(before: DragGesture())
91
+ .onEnded { _ in
92
+ withAnimation(.spring(response: 0.3, dampingFraction: 0.75)) {
93
+ lifted = false
94
+ corner = [.topLeading, .topTrailing, .bottomLeading, .bottomTrailing].randomElement()!
95
+ }
96
+ }
97
+ )
98
+ }
99
+ }
100
+ .aspectRatio(3/4, contentMode: .fit)
101
+ .shadow(color: .black.opacity(0.6), radius: 24, y: 8)
102
+ }
103
+
104
+ private func alignment(for c: UnitPoint) -> Alignment {
105
+ switch c {
106
+ case .topTrailing: return .topTrailing
107
+ case .bottomLeading: return .bottomLeading
108
+ case .bottomTrailing: return .bottomTrailing
109
+ default: return .topLeading
110
+ }
111
+ }
112
+ }
113
+ ```
114
+
115
+ ### Capture Button (Dual Shutter)
116
+
117
+ ```swift
118
+ struct CaptureButton: View {
119
+ let onCapture: () -> Void
120
+ @State private var pressed = false
121
+
122
+ var body: some View {
123
+ Button {
124
+ onCapture()
125
+ } label: {
126
+ ZStack {
127
+ Circle().strokeBorder(.white, lineWidth: 4).frame(width: 76, height: 76)
128
+ Circle().fill(.white).frame(width: pressed ? 64 : 0, height: pressed ? 64 : 0)
129
+ }
130
+ .scaleEffect(pressed ? 0.92 : 1)
131
+ }
132
+ .buttonStyle(.plain)
133
+ .simultaneousGesture(
134
+ DragGesture(minimumDistance: 0)
135
+ .onChanged { _ in pressed = true }
136
+ .onEnded { _ in pressed = false }
137
+ )
138
+ // heavy for back camera, then a soft for the front lens ~0.5s later
139
+ .sensoryFeedback(.impact(weight: .heavy), trigger: pressed)
140
+ }
141
+ }
142
+ ```
143
+
144
+ ### Primary / Secondary Button
145
+
146
+ ```swift
147
+ struct BeRealButton: View {
148
+ enum Style { case filled, outline }
149
+ let title: String
150
+ var style: Style = .filled
151
+ let action: () -> Void
152
+
153
+ var body: some View {
154
+ Button(action: action) {
155
+ Text(title)
156
+ .font(.brealButton)
157
+ .foregroundStyle(style == .filled ? Color.brealOnAccent : .white)
158
+ .padding(.vertical, style == .filled ? 14 : 12)
159
+ .padding(.horizontal, style == .filled ? 32 : 24)
160
+ .background(Capsule().fill(style == .filled ? Color.brealAccent : .clear))
161
+ .overlay(Capsule().strokeBorder(style == .outline ? Color.white.opacity(0.4) : .clear, lineWidth: 1))
162
+ }
163
+ .buttonStyle(BeRealPressable())
164
+ }
165
+ }
166
+
167
+ struct BeRealPressable: ButtonStyle {
168
+ func makeBody(configuration: Configuration) -> some View {
169
+ configuration.label
170
+ .opacity(configuration.isPressed ? 0.85 : 1)
171
+ .scaleEffect(configuration.isPressed ? 0.97 : 1)
172
+ .animation(.spring(response: 0.25, dampingFraction: 0.8), value: configuration.isPressed)
173
+ }
174
+ }
175
+ ```
176
+
177
+ ### Late Badge & Countdown Banner
178
+
179
+ ```swift
180
+ struct LateBadge: View {
181
+ let text: String // "2h late"
182
+ var body: some View {
183
+ Label(text, systemImage: "exclamationmark.triangle.fill")
184
+ .font(.brealLateBadge)
185
+ .foregroundStyle(Color.brealLate)
186
+ .labelStyle(.titleAndIcon)
187
+ }
188
+ }
189
+
190
+ struct CountdownBanner: View {
191
+ let remaining: String // "1:42"
192
+ var body: some View {
193
+ Text("⏰ \(remaining) left to capture a BeReal")
194
+ .font(.brealTimer)
195
+ .monospacedDigit()
196
+ .foregroundStyle(Color.brealLate)
197
+ .padding(.vertical, 12).padding(.horizontal, 20)
198
+ .frame(maxWidth: .infinity)
199
+ .background(.ultraThinMaterial.opacity(0.6), in: Capsule())
200
+ .overlay(Capsule().strokeBorder(Color.brealLate.opacity(0.4), lineWidth: 1))
201
+ }
202
+ }
203
+ ```
204
+
205
+ ### RealMoji Reaction Cluster
206
+
207
+ ```swift
208
+ struct RealMojiCluster: View {
209
+ let selfies: [Image] // real selfie photos — never emoji
210
+ let onAdd: () -> Void
211
+
212
+ var body: some View {
213
+ HStack(spacing: -8) { // overlap by 8pt
214
+ ForEach(Array(selfies.enumerated()), id: \.offset) { _, img in
215
+ img.resizable().scaledToFill()
216
+ .frame(width: 30, height: 30)
217
+ .clipShape(Circle())
218
+ .overlay(Circle().strokeBorder(.black, lineWidth: 2))
219
+ }
220
+ Button(action: onAdd) {
221
+ Image(systemName: "plus")
222
+ .font(.system(size: 14, weight: .semibold))
223
+ .foregroundStyle(.white)
224
+ .frame(width: 30, height: 30)
225
+ .overlay(Circle().strokeBorder(.white.opacity(0.6), style: StrokeStyle(lineWidth: 1.5, dash: [3])))
226
+ }
227
+ .padding(.leading, 12)
228
+ }
229
+ // No counts, no like numbers — reactions are faces, not metrics
230
+ }
231
+ }
232
+ ```
233
+
234
+ ## 4. Distinctive System — Selfie Corner-Snap
235
+
236
+ ```swift
237
+ // The front selfie inset is the soul of BeReal. Long-press lifts it
238
+ // (scale 1.05 + shadow), drag, release snaps to nearest corner with a spring.
239
+ // See DualLensCard above for the full gesture chain. Key spring:
240
+ // .spring(response: 0.3, dampingFraction: 0.75)
241
+ // Tapping (not dragging) the selfie swaps which camera is full-bleed:
242
+
243
+ func swapPrimaryCamera() {
244
+ withAnimation(.easeInOut(duration: 0.35)) { /* cross-fade back<->front */ }
245
+ }
246
+ ```
247
+
248
+ ## 5. Tab Bar
249
+
250
+ BeReal's tab bar is opaque true-black — **no blur**, the canvas simply continues. Active tint is white.
251
+
252
+ ```swift
253
+ struct RootTabView: View {
254
+ init() {
255
+ let appearance = UITabBarAppearance()
256
+ appearance.configureWithOpaqueBackground()
257
+ appearance.backgroundColor = .black
258
+ appearance.shadowColor = UIColor.white.withAlphaComponent(0.08)
259
+ UITabBar.appearance().standardAppearance = appearance
260
+ UITabBar.appearance().scrollEdgeAppearance = appearance
261
+ }
262
+ var body: some View {
263
+ TabView {
264
+ FriendsView().tabItem { Label("Friends", systemImage: "person.2.fill") }
265
+ OfficialView().tabItem { Label("Official", systemImage: "star.circle.fill") }
266
+ SearchView().tabItem { Label("Search", systemImage: "magnifyingglass") }
267
+ ProfileView().tabItem { Label("Profile", systemImage: "person.crop.circle") }
268
+ }
269
+ .tint(.white) // accent is white — BeReal has no brand hue
270
+ }
271
+ }
272
+ ```
273
+
274
+ ## 6. Motion
275
+
276
+ ```swift
277
+ // Dual-shutter capture: white flash + heavy haptic, then ~0.5s later a soft haptic
278
+ .sensoryFeedback(.impact(weight: .heavy), trigger: didCaptureBack)
279
+ .sensoryFeedback(.impact(weight: .soft), trigger: didCaptureFront)
280
+
281
+ // Camera flip: 180° 3D rotation of the viewfinder
282
+ .rotation3DEffect(.degrees(flipped ? 180 : 0), axis: (x: 0, y: 1, z: 0))
283
+ .animation(.easeInOut(duration: 0.35), value: flipped)
284
+
285
+ // Selfie drag-snap: spring(response: 0.3, dampingFraction: 0.75) — see §3
286
+ // RealMoji pop: scale 0 → 1.2 → 1.0 over 280ms
287
+ .scaleEffect(appeared ? 1 : 0)
288
+ .animation(.spring(response: 0.28, dampingFraction: 0.55), value: appeared)
289
+
290
+ // Friends' BeReals blurred until you post yours:
291
+ .blur(radius: hasPosted ? 0 : 30)
292
+ .animation(.easeOut(duration: 0.4), value: hasPosted)
293
+ ```
294
+
295
+ ## 7. SF Symbols Used
296
+
297
+ | Component | Symbol | Size |
298
+ |-----------|--------|------|
299
+ | Camera flip | `arrow.triangle.2.circlepath.camera` | 28pt |
300
+ | Flash | `bolt.fill` / `bolt.slash.fill` | 22pt |
301
+ | Late badge | `exclamationmark.triangle.fill` | 12pt |
302
+ | Add RealMoji | `plus` | 14pt |
303
+ | Comments | `bubble.left` | 20pt |
304
+ | Share | `square.and.arrow.up` | 22pt |
305
+ | More | `ellipsis` | 20pt |
306
+ | Friends (tab) | `person.2.fill` | 26pt |
307
+ | Official (tab) | `star.circle.fill` | 26pt |
308
+ | Search (tab) | `magnifyingglass` | 26pt |
309
+ | Profile (tab) | `person.crop.circle` | 26pt |
310
+ | BTS video | `play.rectangle.on.rectangle` | 18pt |
311
+
312
+ ## 8. Minimum iOS & Accessibility Notes
313
+
314
+ - Minimum target: iOS 16 (for `.sensoryFeedback` you need iOS 17; fall back to `UIImpactFeedbackGenerator` — use `.heavy` then `.soft`)
315
+ - Support Dynamic Type on usernames, captions, and comments — pin the countdown timer (tabular, layout-critical), late badge, retake count, and tab labels
316
+ - VoiceOver: label the dual-lens card ("jordan's BeReal, 2 hours late"), expose the selfie as an adjustable "drag to reposition" element, and announce RealMojis as "Reaction from <name>" (never read a count — there is none)
317
+ - The capture button needs `.accessibilityLabel("Capture BeReal")` and a hint about the dual exposure
318
+ - Contrast: `#8E8E93` secondary on `#000000` passes WCAG AA at 13pt+; the amber `#FFD60A` late badge on black is high-contrast — keep it for urgency only
319
+ - Reduce Motion: replace the 180° camera-flip rotation and selfie drag-spring with a cross-fade; freeze the countdown roll to an instant text swap
@@ -0,0 +1,336 @@
1
+ # Design System Inspiration of BeReal (iOS)
2
+
3
+ ## 1. Visual Theme & Atmosphere
4
+
5
+ BeReal's iOS app is a deliberate rejection of the polished social-media aesthetic. The interface is a true-black canvas (`#000000`) with almost no chrome, no gradients, no decorative color — a stark, photographic darkroom where the only thing that matters is the unfiltered dual-camera moment. There is no brand color in the UI. The accent is white. This is a design philosophy, not an oversight: by stripping every gradient, glow, and tint, BeReal forces the eye onto the photo itself — the back camera's view of where you are, and the small front-camera selfie of your face reacting to it. The app feels less like Instagram and more like a disposable camera with a 2-minute timer taped to it.
6
+
7
+ The signature element is the dual-lens composite card: a full-bleed photo from the rear camera with a small, rounded, draggable selfie thumbnail pinned to the top-left corner. This composite is the atomic unit of the entire product — it appears in capture, in the friends feed, in your profile grid, and in the memories calendar. Everything else (reactions, comments, the timer banner) is layered on top of or around this card in plain white text on black. Authenticity signals are first-class UI: a "⚠ late" badge with a relative timestamp ("2h late"), a "RealMojis" reaction strip of tiny circular selfie-photos instead of abstract emoji, and small dots indicating how many retakes someone needed before posting.
8
+
9
+ Typography is San Francisco (SF Pro) used plainly — no custom typeface, no display weights, no expressive type moments. Headlines are compact, functional, and white. The most expressive "type" moment in the app isn't type at all: it's the 2-minute countdown banner that appears at the top of the feed when the daily notification fires ("⏰ 2 min left to capture a BeReal"). The restraint in type mirrors the restraint in color — BeReal is anti-design as design, and the consistency of that stance is what makes it feel honest.
10
+
11
+ **Key Characteristics:**
12
+ - True-black canvas (`#000000`) — maximum starkness, no warm-black softening
13
+ - No brand accent color — the accent is white; deliberate chromatic minimalism
14
+ - Dual-lens composite card: full back photo + small draggable rounded front selfie (top-left)
15
+ - 2-minute countdown banner — the daily ritual, top of the friends feed
16
+ - Authenticity tags as UI: "⚠ late", relative timestamps, retake-count dots
17
+ - RealMojis reactions — circular selfie-photos, never abstract emoji, no like counts
18
+ - SF Pro at 400 / 600 / 700, no custom font, no display sizes
19
+ - Bottom tab nav: Friends / Official / Search / Profile
20
+ - Haptics on dual-shutter capture and camera flip
21
+
22
+ ## 2. Color Palette & Roles
23
+
24
+ ### Canvas & Surfaces (Dark — the only mode)
25
+ - **Canvas Black** (`#000000`): The primary and only canvas — true black, full-bleed behind every screen.
26
+ - **Surface 1** (`#1C1C1E`): Sheets, bottom modals, comment composer, settings rows.
27
+ - **Surface 2** (`#2C2C2E`): Elevated rows, pressed states, chip backgrounds, RealMoji picker tray.
28
+ - **Divider** (`#2C2C2E`): Hairline separators between settings rows and comment threads.
29
+
30
+ ### Text
31
+ - **Text Primary** (`#FFFFFF`): Usernames, captions, headlines, all primary text.
32
+ - **Text Secondary** (`#8E8E93`): Timestamps, "your friends", metadata, location strings, placeholder text.
33
+ - **Text Tertiary** (`#636366`): Disabled labels, very low-emphasis hints.
34
+
35
+ ### Accent (Intentionally Monochrome)
36
+ - **Accent White** (`#FFFFFF`): The primary action color — capture ring, active tab, primary button fill. BeReal has *no* brand hue; white is the verb.
37
+ - **On-Accent Black** (`#000000`): Text/icon on white-filled buttons (intentional inversion, like the capture button).
38
+
39
+ ### Semantic
40
+ - **Late Amber** (`#FFD60A`): The "⚠ late" authenticity badge and timer-warning accent — the single warm color, used only for lateness/urgency.
41
+ - **Error Red** (`#FF453A`): Failed posts, connection-lost, destructive confirm ("Delete BeReal").
42
+ - **Online Green** (`#30D158`): Rare — friend-active dot in messaging.
43
+
44
+ ### Light Mode (Not Used)
45
+ BeReal's iOS app is dark-only by design — the photographic darkroom metaphor depends on true black. No light variant ships.
46
+
47
+ ## 3. Typography Rules
48
+
49
+ ### Font Family
50
+ - **Primary**: `SF Pro Text` / `SF Pro Display` (system) — BeReal ships no custom typeface
51
+ - **Fallback Stack**: `-apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Segoe UI', Roboto, Helvetica, Arial, sans-serif`
52
+ - **Numerals**: Tabular figures for the countdown timer so digits don't jitter as they tick
53
+
54
+ ### Hierarchy
55
+
56
+ | Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
57
+ |------|------|------|--------|-------------|----------------|-------|
58
+ | Timer Banner | SF Pro Display | 24pt | 700 | 1.1 | -0.3pt | "2 min left to capture" countdown headline |
59
+ | Screen Title | SF Pro Display | 22pt | 700 | 1.2 | -0.3pt | "Friends", "Discovery" nav title |
60
+ | Username (Card) | SF Pro Text | 17pt | 600 | 1.2 | -0.2pt | Poster's name above the dual-lens card |
61
+ | Caption | SF Pro Text | 16pt | 400 | 1.35 | 0pt | The optional one-line caption under a BeReal |
62
+ | Body | SF Pro Text | 15pt | 400 | 1.4 | 0pt | Comment text, settings descriptions |
63
+ | Comment Author | SF Pro Text | 14pt | 600 | 1.3 | 0pt | Bold name preceding a comment body |
64
+ | Meta / Timestamp | SF Pro Text | 13pt | 400 | 1.3 | 0pt | "2h late", "Paris, France", "12:43" |
65
+ | Late Badge | SF Pro Text | 12pt | 700 | 1.1 | 0.2pt | "⚠ LATE" authenticity tag |
66
+ | Button (Primary) | SF Pro Text | 17pt | 600 | 1.0 | -0.2pt | "Post", "Add a caption" |
67
+ | Tab Label | SF Pro Text | 10pt | 600 | 1.0 | 0.1pt | Bottom tab bar labels (when shown) |
68
+ | Retake Count | SF Pro Text | 11pt | 600 | 1.0 | 0pt | "3 retakes" pill under a posted card |
69
+
70
+ ### Principles
71
+ - **System font only**: No custom face — BeReal's identity is the dual-lens layout, not type
72
+ - **Weight concentrated at 400 / 600 / 700**: Regular for body, semibold for names/buttons, bold for the timer
73
+ - **No display-size headlines except the timer** — the photo is the headline; the timer is the only "hero" type
74
+ - **Tabular numerals on the countdown** — `2:00 → 1:59` must not shift horizontally
75
+ - **White on black, always** — there is no colored text anywhere except the amber late badge
76
+
77
+ ## 4. Component Stylings
78
+
79
+ ### Buttons
80
+
81
+ **Capture Button (The Dual Shutter)**
82
+ - Shape: Circle, 76pt outer ring, 4pt white stroke, transparent center
83
+ - Inner: 64pt solid white disc on press
84
+ - Pressed: scale 0.92, brief white flash overlay on the viewfinder, paired with `.impactOccurred(.heavy)` haptic
85
+ - Triggers both cameras in sequence (~0.5s apart) — a second lighter haptic on the front-camera capture
86
+
87
+ **Primary Button ("Post" / "Send")**
88
+ - Background: `#FFFFFF`
89
+ - Text: `#000000` (intentional inversion for contrast on black)
90
+ - Padding: 14pt vertical, 32pt horizontal
91
+ - Corner radius: 500pt (full pill)
92
+ - Font: SF Pro Text 17pt weight 600
93
+ - Pressed: opacity 0.85, scale 0.97
94
+ - Used for: "Post", "Send", "Continue"
95
+
96
+ **Secondary Button ("Add a caption" / "Retake")**
97
+ - Background: transparent
98
+ - Text: `#FFFFFF`
99
+ - Border: 1pt solid `rgba(255,255,255,0.4)`
100
+ - Padding: 12pt vertical, 24pt horizontal
101
+ - Corner radius: 500pt
102
+ - Font: SF Pro Text 16pt weight 600
103
+ - Pressed: border opacity → 1.0
104
+
105
+ **Camera Flip Icon Button**
106
+ - Size: 28pt glyph, 44pt hit area
107
+ - Default: `#FFFFFF` on transparent
108
+ - Tap: 180° flip animation on the viewfinder + light haptic
109
+ - Position: bottom-right of the capture screen
110
+
111
+ **RealMoji Add Button**
112
+ - Circular 44pt dashed-stroke white outline with a `+` glyph at center
113
+ - Tap: opens the RealMoji selfie picker (front camera live)
114
+
115
+ ### Cards & Containers
116
+
117
+ **Dual-Lens Composite Card (THE signature)**
118
+ - Aspect: 3:4 portrait, full content width minus 0pt margins (edge-to-edge in feed)
119
+ - Back photo: full-bleed, corner radius 18pt
120
+ - Front selfie: 100pt × 134pt (3:4), corner radius 14pt, 2pt black inner stroke, default position top-left with 12pt inset
121
+ - Front selfie is **draggable** — long-press lifts it (scale 1.05 + shadow), drag snaps to any corner
122
+ - Card shadow: `rgba(0,0,0,0.6) 0 8px 24px` (registers on black via opacity)
123
+ - Tap front selfie: swaps which camera is primary (front becomes full-bleed) with a cross-fade
124
+
125
+ **Feed Post (Friends)**
126
+ - Header: 32pt circular avatar + username (17pt w600) + "⚠ 2h late" badge (amber) + ⋯
127
+ - The dual-lens composite card directly below the header, edge-to-edge
128
+ - Caption (16pt w400) one line below the card if present
129
+ - Location + relative time (13pt w400 `#8E8E93`) under the caption
130
+ - RealMojis strip: row of overlapping 30pt circular selfie-reactions, then the `+` add button
131
+ - "View N comments" link (14pt w400 `#8E8E93`)
132
+
133
+ **RealMoji Reaction Bubble**
134
+ - 30pt circular photo (a real selfie, not an emoji), 2pt black ring
135
+ - Overlap: each bubble overlaps the previous by 8pt (stacked cluster)
136
+ - Tap the cluster: opens the full reactions sheet (who reacted, with their selfie)
137
+ - No counts, no like numbers anywhere — reactions are faces, not metrics
138
+
139
+ **Memories Calendar Cell**
140
+ - Square grid cell, 4 columns, 2pt gap
141
+ - Each cell: that day's BeReal as a tiny dual-lens thumbnail (corner radius 6pt)
142
+ - Date label (11pt w600 white) bottom-left over a subtle scrim
143
+ - Tap: expands that day's BeReal full-screen
144
+
145
+ ### Navigation
146
+
147
+ **Bottom Tab Bar**
148
+ - Height: 52pt + safe area
149
+ - Background: `#000000` (opaque true black, no blur — the canvas continues)
150
+ - Tabs: Friends, Official, Search, Profile
151
+ - Icon size: 26pt
152
+ - Active: `#FFFFFF` filled glyph; Inactive: `rgba(255,255,255,0.45)` outline
153
+ - Labels: SF Pro Text 10pt w600 (or icon-only on some builds)
154
+ - Top hairline: `rgba(255,255,255,0.08)` 0.5pt
155
+
156
+ **Top Bar (Friends)**
157
+ - Height: 48pt + safe area
158
+ - Left: "Friends" / "My Friends" segmented toggle (text, 17pt w600, inactive at 45% opacity)
159
+ - Center: BeReal wordmark (lowercase, 18pt w700) on Capture entry
160
+ - Right: profile avatar (28pt circular)
161
+
162
+ **Capture Screen (Full Screen)**
163
+ - Edge-to-edge live viewfinder (back camera)
164
+ - Small live front-camera selfie inset top-left (same 100×134pt as the card)
165
+ - 2-minute countdown pill top-center: amber text on `rgba(0,0,0,0.5)` blur, tabular digits
166
+ - Capture button bottom-center (76pt dual shutter)
167
+ - Camera flip bottom-right, flash toggle bottom-left
168
+
169
+ ### Input Fields
170
+
171
+ **Caption Field**
172
+ - Background: transparent (overlaid on the card or on black)
173
+ - Placeholder: "Add a caption…", 16pt w400 `#8E8E93`
174
+ - Text: `#FFFFFF` 16pt
175
+ - No border, no box — a bare cursor and text, single line, centered
176
+
177
+ **Comment Composer**
178
+ - Background: `#1C1C1E`
179
+ - Height: 44pt, corner radius 500pt (pill)
180
+ - Placeholder: "Add a comment…", 15pt w400 `#8E8E93`, 16pt horizontal inset
181
+ - Trailing: circular white "Send" button (32pt) appears once text is entered
182
+
183
+ ### Distinctive Components
184
+
185
+ **2-Minute Countdown Banner**
186
+ - Full-width pill at the top of the friends feed when the daily notification has fired
187
+ - Background: `rgba(0,0,0,0.6)` with light blur, 1pt `rgba(255,215,10,0.4)` amber border
188
+ - Text: "⏰ 2 min left to capture a BeReal" — amber `#FFD60A`, tabular digits
189
+ - Counts down live; on expiry the banner says "Late — post anyway?" and the late badge logic engages
190
+
191
+ **Authenticity / Late Tag**
192
+ - Inline pill next to the username: "⚠ 2h late"
193
+ - Background: transparent; text + glyph in amber `#FFD60A`, 12pt w700
194
+ - Relative time recalculated from post timestamp vs the day's notification time
195
+
196
+ **Retake-Count Dots**
197
+ - A small "N retakes" pill under the card showing how many attempts the poster made
198
+ - Honesty signal — surfaced, not hidden
199
+ - 11pt w600 white on `rgba(255,255,255,0.12)` pill
200
+
201
+ **Behind-the-Scenes / BTS History**
202
+ - A small stacked-photos icon on a card if the poster recorded a BTS video
203
+ - Tap: plays the short behind-the-scenes clip in a full-screen modal
204
+
205
+ ## 5. Layout Principles
206
+
207
+ ### Spacing System
208
+ - Base unit: 4pt
209
+ - Scale: 4, 8, 12, 16, 20, 24, 32, 40, 52, 76
210
+ - Standard margin: 16pt horizontal for text; the dual-lens card goes **edge-to-edge** (0pt)
211
+ - Feed post vertical rhythm: 24pt between posts
212
+
213
+ ### Grid & Container
214
+ - Content width: full device width; card is full-bleed, text content inset 16pt
215
+ - Memories grid: 4-column square grid, 2pt gap (dense photographic mosaic)
216
+ - Profile grid: 3-column dual-lens thumbnails, 2pt gap
217
+
218
+ ### Whitespace Philosophy
219
+ - **The photo owns the screen**: One BeReal per viewport in the feed — it is not a dense list
220
+ - **Minimal chrome**: Almost no padding or boxing; text floats directly on black
221
+ - **Dense only in the calendar**: Memories is intentionally tight to read as a film contact sheet
222
+
223
+ ### Border Radius Scale
224
+ - Square (0pt): Almost nothing — BeReal avoids hard squares
225
+ - Tiny (6pt): Memories/profile grid thumbnails
226
+ - Soft (14pt): The front-camera selfie inset
227
+ - Card (18pt): The dual-lens composite card
228
+ - Comfortable (24pt): Bottom sheets, modals
229
+ - Full Pill (500pt): Primary/secondary buttons, the countdown banner, comment composer
230
+ - Circle (50%): Avatars, capture ring, RealMoji bubbles
231
+
232
+ ## 6. Depth & Elevation
233
+
234
+ | Level | Treatment | Use |
235
+ |-------|-----------|-----|
236
+ | Flat (Level 0) | No shadow | Text on canvas, tab bar, feed background |
237
+ | Card (Level 1) | `rgba(0,0,0,0.6) 0 8px 24px` | The dual-lens composite card lifts off black |
238
+ | Lifted Selfie (Level 2) | `rgba(0,0,0,0.7) 0 6px 18px` | Front-camera inset while being dragged (scale 1.05) |
239
+ | Sheet (Level 3) | `rgba(0,0,0,0.8) 0 -16px 48px` | RealMoji picker, comments sheet, share sheet |
240
+ | Blur Overlay | `rgba(0,0,0,0.5)` + backdrop-blur 30 | Countdown pill, full-screen viewers |
241
+
242
+ **Shadow Philosophy**: Because the canvas is pure black, shadows can't darken — they register through high opacity (0.6–0.8) and generous blur so the white card edges separate from the void. There are no colored glows, no soft ambient lighting. The only "elevation" that matters is the dual-lens card floating slightly above the black, and the selfie inset lifting when grabbed. Everything else is resolutely flat.
243
+
244
+ ### Motion
245
+ - **Dual-shutter capture**: viewfinder white-flash 120ms + back-camera shutter, then ~0.5s later the front camera fires with a second lighter flash; two haptics (heavy then soft)
246
+ - **Camera flip**: 180° 3D rotation of the viewfinder over 0.35s, ease-in-out, light haptic
247
+ - **Selfie drag-snap**: long-press lifts (scale 1.0 → 1.05, 150ms spring), release snaps to nearest corner with a 0.3s spring (damping 0.75)
248
+ - **RealMoji pop**: a newly-added reaction scales 0 → 1.2 → 1.0 over 280ms
249
+ - **Late banner countdown**: digits roll with a subtle vertical slide each second (tabular, no layout shift)
250
+ - **Feed reveal**: friends' BeReals are blurred until you post yours — un-blur is a 0.4s fade once you capture
251
+
252
+ ## 7. Do's and Don'ts
253
+
254
+ ### Do
255
+ - Use pure black `#000000` as the canvas — the darkroom metaphor requires true black
256
+ - Keep the UI monochrome — white is the only accent; amber only for lateness
257
+ - Make the dual-lens composite the hero of every surface (feed, profile, memories)
258
+ - Keep the front-camera selfie draggable and corner-snapping
259
+ - Surface authenticity signals openly: "⚠ late", relative timestamps, retake counts
260
+ - Use RealMojis (real selfie photos) for reactions — never abstract emoji, never counts
261
+ - Render the 2-minute countdown with tabular numerals and amber text
262
+ - Pair the capture button with a heavy haptic and a second soft one for the front lens
263
+
264
+ ### Don't
265
+ - Don't introduce a brand accent color — the lack of one *is* the brand
266
+ - Don't use warm-black (`#121212`) — BeReal is true `#000000`
267
+ - Don't add like counts, follower counts, or vanity metrics anywhere
268
+ - Don't use abstract emoji for reactions — only RealMoji selfie-photos
269
+ - Don't beautify with gradients, glows, or decorative shadows
270
+ - Don't hide the late badge or retake count — honesty is the product
271
+ - Don't add a light mode — it breaks the photographic darkroom feel
272
+ - Don't use a custom display font — system SF Pro only, no expressive type
273
+
274
+ ## 8. Responsive Behavior
275
+
276
+ ### Device Sizes
277
+ | Device | Width | Key Changes |
278
+ |--------|-------|-------------|
279
+ | iPhone SE (3rd gen) | 375pt | Selfie inset 88×118pt; card aspect held at 3:4 |
280
+ | iPhone 13/14/15 | 390pt | Standard 100×134pt selfie inset |
281
+ | iPhone 15/16 Pro | 393pt | Dynamic Island clears the top toggle row |
282
+ | iPhone 15/16 Pro Max | 430pt | Selfie inset 112×150pt; memories grid stays 4-col |
283
+ | iPad | 768pt+ | Feed centered at 480pt max-width; memories grid 6-col |
284
+
285
+ ### Dynamic Type
286
+ - Usernames, captions, comments: full scale
287
+ - Countdown timer: fixed (tabular, layout-critical — never scales)
288
+ - Late badge / retake count: fixed 12pt / 11pt
289
+ - Tab labels: fixed 10pt
290
+
291
+ ### Orientation
292
+ - All screens: **portrait-locked** — BeReal is a portrait-camera ritual
293
+ - Full-screen photo viewer: portrait only (the 3:4 composite assumes it)
294
+
295
+ ### Touch Targets
296
+ - Capture button: 76pt — the largest, deliberately unmissable
297
+ - Selfie inset: full 100×134pt is draggable (long-press to lift)
298
+ - Tab icons: 26pt glyph, 44pt effective hit
299
+ - RealMoji `+`: 44pt
300
+
301
+ ### Safe Area Handling
302
+ - Top: countdown pill and toggle row sit below the safe area / Dynamic Island
303
+ - Bottom: tab bar and capture button respect the home indicator
304
+ - Card: intentionally goes edge-to-edge horizontally (0pt side insets)
305
+
306
+ ## 9. Agent Prompt Guide
307
+
308
+ ### Quick Color Reference
309
+ - Canvas: `#000000`
310
+ - Surface 1 (sheets): `#1C1C1E`
311
+ - Surface 2 (rows/chips): `#2C2C2E`
312
+ - Divider: `#2C2C2E`
313
+ - Primary text: `#FFFFFF`
314
+ - Secondary text: `#8E8E93`
315
+ - Tertiary text: `#636366`
316
+ - Accent (action): `#FFFFFF` (no brand hue)
317
+ - On-accent: `#000000`
318
+ - Late amber: `#FFD60A`
319
+ - Error red: `#FF453A`
320
+
321
+ ### Example Component Prompts
322
+ - "Create a SwiftUI BeReal dual-lens composite card: 3:4 full-bleed back photo with 18pt corner radius, and a 100×134pt front-camera selfie inset (14pt radius, 2pt black stroke) pinned top-left with a 12pt inset. The selfie is long-press draggable and snaps to the nearest corner with a 0.3s spring. Card shadow rgba(0,0,0,0.6) 0 8px 24px."
323
+ - "Build the BeReal capture button: a 76pt circle with a 4pt white stroke and transparent center; on press it fills with a 64pt white disc, scales to 0.92, flashes the viewfinder white for 120ms, and fires a heavy haptic followed ~0.5s later by a soft haptic for the front camera."
324
+ - "Design the BeReal 2-minute countdown banner: a full-width pill at the top of the feed, background rgba(0,0,0,0.6) with light blur and a 1pt rgba(255,215,10,0.4) border, text '⏰ 2 min left to capture a BeReal' in amber #FFD60A using tabular numerals so digits don't shift while counting down."
325
+ - "Create a BeReal friends-feed post: 32pt circular avatar + username 'jordan' in SF Pro 17pt weight 600 + an amber '⚠ 2h late' badge + trailing ⋯. Below, the edge-to-edge dual-lens card. Then a one-line caption 16pt #FFFFFF, location + relative time 13pt #8E8E93, and a strip of overlapping 30pt circular RealMoji selfie-reactions ending with a dashed-outline + button. No like counts anywhere."
326
+ - "Build the BeReal RealMoji reaction cluster: a horizontal row of 30pt circular selfie photos each with a 2pt black ring, overlapping the previous by 8pt; tapping the cluster opens a sheet listing who reacted with their selfie. Never use abstract emoji and never show a numeric count."
327
+
328
+ ### Iteration Guide
329
+ 1. Canvas is pure black `#000000` — never warm-black
330
+ 2. The UI is monochrome — white is the only accent; amber is reserved for lateness/urgency
331
+ 3. The dual-lens composite card is the hero of every screen — keep it edge-to-edge with a draggable corner-snapping selfie
332
+ 4. Reactions are RealMoji selfie-photos, not emoji, and there are no counts or vanity metrics
333
+ 5. Authenticity is visible: show "⚠ late", relative timestamps, and retake-count dots — never hide them
334
+ 6. Typography is system SF Pro at 400/600/700 — no custom font, no display sizes except the countdown
335
+ 7. Shadows register via opacity (0.6–0.8) and blur, not darkening — no colored glows
336
+ 8. Portrait-locked, dark-only — there is no light mode and no landscape