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,658 @@
1
+ # Airbnb (iOS) — Jetpack Compose Implementation Guide
2
+
3
+ Companion to [DESIGN.md](DESIGN.md) — the framework-neutral spec. This file ports Airbnb's visual language to **Android with Jetpack Compose (Material 3)**: a color token object, a `Typography` set, paste-ready `@Composable`s, `Modifier`s, motion, and haptics.
4
+
5
+ > Why a Compose guide for an iOS-referenced app? The DESIGN.md tokens are platform-neutral. This file keeps the *visual* identity (Airbnb's white editorial canvas, photography-as-hero stay cards, single coral accent, soft 16dp radii) while making everything idiomatic Android — `NavigationBar` instead of a UITabBar, a translucent `Surface` instead of `.regularMaterial` blur, `sp`/`dp` instead of `pt`. Airbnb is a *light-canvas* app, so we wire a Material 3 `lightColorScheme`, not a dark one.
6
+
7
+ Assumes Compose BOM `2024.09+`, Kotlin `2.0+`, `minSdk 24`, Material 3, and [Coil](https://coil-kt.github.io/coil/) `2.6+` for the remote stay photography.
8
+
9
+ ## 1. Color Tokens
10
+
11
+ ```kotlin
12
+ // ui/theme/AirbnbColors.kt
13
+ import androidx.compose.ui.graphics.Color
14
+
15
+ object AirbnbColors {
16
+ // Canvas, Surfaces & Dividers
17
+ val Canvas = Color(0xFFFFFFFF)
18
+ val SurfaceGray = Color(0xFFF7F7F7)
19
+ val SurfaceGray2 = Color(0xFFEBEBEB)
20
+ val Divider = Color(0xFFEBEBEB)
21
+
22
+ // Text
23
+ val Hof = Color(0xFF484848) // primary text — titles, body
24
+ val Foggy = Color(0xFF767676) // secondary — host byline, review count, dates
25
+ val FoggyLight = Color(0xFFB0B0B0) // tertiary — placeholders, disabled
26
+ val Ink = Color(0xFF222222) // hero titles, borders, visited map pin
27
+
28
+ // Brand
29
+ val Coral = Color(0xFFFF385C) // primary — Reserve, save-heart fill, active tab
30
+ val CoralPressed = Color(0xFFE31C5F)
31
+ val Rausch = Color(0xFFFF5A5F) // heritage — Belo logomark only
32
+ val Babu = Color(0xFF00A699) // Plus / Experiences / Superhost seal
33
+ val Arches = Color(0xFFFC642D) // Trips module
34
+ val Beach = Color(0xFFFFB400) // star yellow — review screens only
35
+
36
+ // Semantic
37
+ val Success = Color(0xFF008A05)
38
+ val Error = Color(0xFFC13515)
39
+
40
+ // Dark mode (warm — preserves photography integrity, not true black)
41
+ val DarkCanvas = Color(0xFF121212)
42
+ val DarkSurface = Color(0xFF1C1C1E)
43
+ val DarkText = Color(0xFFDDDDDD)
44
+ val DarkTextSec = Color(0xFFA0A0A0)
45
+ }
46
+ ```
47
+
48
+ Airbnb is a white-canvas editorial app, so wire a Material 3 `lightColorScheme` (provide the warm-dark scheme for dark mode). Ripples, dividers, and stock component defaults then inherit the brand.
49
+
50
+ ```kotlin
51
+ // ui/theme/Theme.kt
52
+ import androidx.compose.material3.lightColorScheme
53
+ import androidx.compose.material3.darkColorScheme
54
+ import androidx.compose.material3.MaterialTheme
55
+ import androidx.compose.foundation.isSystemInDarkTheme
56
+
57
+ private val AirbnbLight = lightColorScheme(
58
+ primary = AirbnbColors.Coral,
59
+ onPrimary = Color.White,
60
+ background = AirbnbColors.Canvas,
61
+ onBackground = AirbnbColors.Hof, // warm #484848, never pure black
62
+ surface = AirbnbColors.Canvas,
63
+ onSurface = AirbnbColors.Hof,
64
+ surfaceVariant = AirbnbColors.SurfaceGray,
65
+ outline = AirbnbColors.Divider,
66
+ error = AirbnbColors.Error,
67
+ )
68
+
69
+ private val AirbnbDark = darkColorScheme(
70
+ primary = AirbnbColors.Coral, // coral is unchanged on dark
71
+ onPrimary = Color.White,
72
+ background = AirbnbColors.DarkCanvas,
73
+ onBackground = AirbnbColors.DarkText,
74
+ surface = AirbnbColors.DarkSurface,
75
+ onSurface = AirbnbColors.DarkText,
76
+ surfaceVariant = AirbnbColors.DarkSurface,
77
+ outline = Color(0xFF2C2C2E),
78
+ error = AirbnbColors.Error,
79
+ )
80
+
81
+ @Composable
82
+ fun AirbnbTheme(
83
+ darkTheme: Boolean = isSystemInDarkTheme(),
84
+ content: @Composable () -> Unit,
85
+ ) = MaterialTheme(
86
+ colorScheme = if (darkTheme) AirbnbDark else AirbnbLight,
87
+ typography = AirbnbTypography,
88
+ content = content,
89
+ )
90
+ ```
91
+
92
+ ## 2. Typography
93
+
94
+ Airbnb Cereal (Dalton Maag, 2018) is proprietary. Drop the TTFs in `res/font/` (lowercase, snake_case) and build a `FontFamily`. Fall back to the system font (Roboto) — but Cereal is warm and tightly spaced, so if you ship a substitute prefer bundling `Plus Jakarta Sans` / `Manrope`, which capture its roundness better than a pure grotesque.
95
+
96
+ ```kotlin
97
+ // ui/theme/AirbnbType.kt
98
+ import androidx.compose.material3.Typography
99
+ import androidx.compose.ui.text.TextStyle
100
+ import androidx.compose.ui.text.font.Font
101
+ import androidx.compose.ui.text.font.FontFamily
102
+ import androidx.compose.ui.text.font.FontWeight
103
+ import androidx.compose.ui.unit.sp
104
+
105
+ val AirbnbCereal = FontFamily(
106
+ Font(R.font.airbnb_cereal_light, FontWeight.Light), // 300
107
+ Font(R.font.airbnb_cereal_book, FontWeight.Normal), // 400
108
+ Font(R.font.airbnb_cereal_medium, FontWeight.Medium), // 500
109
+ Font(R.font.airbnb_cereal_bold, FontWeight.Bold), // 700
110
+ Font(R.font.airbnb_cereal_extrabold, FontWeight.ExtraBold), // 800
111
+ Font(R.font.airbnb_cereal_black, FontWeight.Black), // 900
112
+ )
113
+
114
+ // Named ramp — mirrors DESIGN.md §3 exactly (pt → sp 1:1)
115
+ object AirbnbText {
116
+ val LargeNav = TextStyle(AirbnbCereal, fontWeight = FontWeight.ExtraBold, fontSize = 32.sp, lineHeight = 37.sp, letterSpacing = (-0.4).sp)
117
+ val Hero = TextStyle(AirbnbCereal, fontWeight = FontWeight.Bold, fontSize = 26.sp, lineHeight = 31.sp, letterSpacing = (-0.3).sp)
118
+ val Section = TextStyle(AirbnbCereal, fontWeight = FontWeight.Bold, fontSize = 22.sp, lineHeight = 26.sp, letterSpacing = (-0.2).sp)
119
+ val Subsection = TextStyle(AirbnbCereal, fontWeight = FontWeight.Bold, fontSize = 18.sp, lineHeight = 23.sp, letterSpacing = (-0.1).sp)
120
+ val CardTitle = TextStyle(AirbnbCereal, fontWeight = FontWeight.Medium, fontSize = 15.sp, lineHeight = 20.sp, letterSpacing = (-0.05).sp)
121
+ val Body = TextStyle(AirbnbCereal, fontWeight = FontWeight.Normal, fontSize = 16.sp, lineHeight = 22.sp)
122
+ val BodySmall = TextStyle(AirbnbCereal, fontWeight = FontWeight.Normal, fontSize = 14.sp, lineHeight = 20.sp)
123
+ val Meta = TextStyle(AirbnbCereal, fontWeight = FontWeight.Normal, fontSize = 14.sp, lineHeight = 18.sp)
124
+ val RatingNum = TextStyle(AirbnbCereal, fontWeight = FontWeight.Medium, fontSize = 14.sp, lineHeight = 17.sp)
125
+ val PriceInline = TextStyle(AirbnbCereal, fontWeight = FontWeight.Bold, fontSize = 15.sp, lineHeight = 18.sp)
126
+ val PriceHero = TextStyle(AirbnbCereal, fontWeight = FontWeight.ExtraBold, fontSize = 22.sp, lineHeight = 24.sp, letterSpacing = (-0.2).sp)
127
+ val Button = TextStyle(AirbnbCereal, fontWeight = FontWeight.Bold, fontSize = 16.sp, lineHeight = 16.sp)
128
+ val ButtonSm = TextStyle(AirbnbCereal, fontWeight = FontWeight.Medium, fontSize = 14.sp, lineHeight = 14.sp)
129
+ val Tab = TextStyle(AirbnbCereal, fontWeight = FontWeight.Medium, fontSize = 10.sp, lineHeight = 10.sp, letterSpacing = 0.1.sp)
130
+ val Chip = TextStyle(AirbnbCereal, fontWeight = FontWeight.Medium, fontSize = 12.sp, lineHeight = 12.sp)
131
+ val Caption = TextStyle(AirbnbCereal, fontWeight = FontWeight.Normal, fontSize = 12.sp, lineHeight = 16.sp)
132
+ }
133
+
134
+ // Map onto Material 3 slots so stock components inherit the brand
135
+ val AirbnbTypography = Typography(
136
+ headlineLarge = AirbnbText.LargeNav,
137
+ headlineMedium = AirbnbText.Hero,
138
+ headlineSmall = AirbnbText.Section,
139
+ titleMedium = AirbnbText.CardTitle,
140
+ bodyLarge = AirbnbText.Body,
141
+ bodyMedium = AirbnbText.BodySmall,
142
+ labelSmall = AirbnbText.Tab,
143
+ )
144
+ ```
145
+
146
+ ## 3. Signature Components
147
+
148
+ ### Save Heart (top-right of every stay card)
149
+
150
+ ```kotlin
151
+ import androidx.compose.animation.core.Animatable
152
+ import androidx.compose.foundation.background
153
+ import androidx.compose.foundation.clickable
154
+ import androidx.compose.foundation.interaction.MutableInteractionSource
155
+ import androidx.compose.foundation.layout.size
156
+ import androidx.compose.foundation.shape.CircleShape
157
+ import androidx.compose.material.icons.Icons
158
+ import androidx.compose.material.icons.filled.Favorite
159
+ import androidx.compose.material.icons.outlined.FavoriteBorder
160
+ import androidx.compose.material3.Icon
161
+ import androidx.compose.runtime.*
162
+ import androidx.compose.ui.Modifier
163
+ import androidx.compose.ui.draw.scale
164
+ import androidx.compose.ui.draw.shadow
165
+ import androidx.compose.ui.graphics.Color
166
+ import androidx.compose.ui.hapticfeedback.HapticFeedbackType
167
+ import androidx.compose.ui.platform.LocalHapticFeedback
168
+ import androidx.compose.ui.unit.dp
169
+
170
+ @Composable
171
+ fun SaveHeart(
172
+ isSaved: Boolean,
173
+ onToggle: () -> Unit,
174
+ modifier: Modifier = Modifier,
175
+ ) {
176
+ val haptics = LocalHapticFeedback.current
177
+ val scale = remember { Animatable(1f) }
178
+ LaunchedEffect(isSaved) {
179
+ if (isSaved) {
180
+ scale.animateTo(1.25f, spring(dampingRatio = 0.6f, stiffness = 500f))
181
+ scale.animateTo(1f, spring(dampingRatio = 0.6f, stiffness = 500f))
182
+ }
183
+ }
184
+
185
+ Box(
186
+ modifier = modifier
187
+ .size(44.dp) // 44dp tap target around a 32dp glyph
188
+ .clickable(
189
+ interactionSource = remember { MutableInteractionSource() },
190
+ indication = null,
191
+ ) {
192
+ haptics.performHapticFeedback(HapticFeedbackType.TextHandleMove) // ~iOS .soft impact
193
+ onToggle()
194
+ },
195
+ contentAlignment = Alignment.Center,
196
+ ) {
197
+ if (isSaved) {
198
+ Icon(
199
+ Icons.Filled.Favorite,
200
+ contentDescription = "Saved",
201
+ tint = AirbnbColors.Coral,
202
+ modifier = Modifier.size(28.dp).scale(scale.value),
203
+ )
204
+ } else {
205
+ // White fill + ink outline so it stays legible over varied photography
206
+ Icon(
207
+ Icons.Filled.Favorite,
208
+ contentDescription = null,
209
+ tint = Color.White,
210
+ modifier = Modifier
211
+ .size(28.dp)
212
+ .shadow(4.dp, CircleShape, spotColor = Color.Black.copy(alpha = 0.2f)),
213
+ )
214
+ Icon(
215
+ Icons.Outlined.FavoriteBorder,
216
+ contentDescription = "Save",
217
+ tint = AirbnbColors.Ink,
218
+ modifier = Modifier.size(28.dp),
219
+ )
220
+ }
221
+ }
222
+ }
223
+ ```
224
+
225
+ ### Rating Row (star + number + review count)
226
+
227
+ ```kotlin
228
+ import androidx.compose.foundation.layout.Arrangement
229
+ import androidx.compose.foundation.layout.Row
230
+ import androidx.compose.material.icons.filled.Star
231
+ import androidx.compose.material3.Text
232
+
233
+ @Composable
234
+ fun RatingRow(rating: Double, reviewCount: Int, modifier: Modifier = Modifier) {
235
+ Row(
236
+ modifier = modifier,
237
+ verticalAlignment = Alignment.CenterVertically,
238
+ horizontalArrangement = Arrangement.spacedBy(4.dp),
239
+ ) {
240
+ Icon(
241
+ Icons.Filled.Star,
242
+ contentDescription = null,
243
+ tint = AirbnbColors.Hof, // dark gray on cards — NOT yellow
244
+ modifier = Modifier.size(12.dp),
245
+ )
246
+ Text("%.2f".format(rating), style = AirbnbText.RatingNum, color = AirbnbColors.Hof)
247
+ Text(" · ${"%,d".format(reviewCount)}", style = AirbnbText.Meta, color = AirbnbColors.Foggy)
248
+ }
249
+ }
250
+ ```
251
+
252
+ ### Stay Card (the hero component)
253
+
254
+ `HorizontalPager` from `androidx.compose.foundation.pager` replaces SwiftUI's paged `TabView`.
255
+
256
+ ```kotlin
257
+ import androidx.compose.foundation.layout.*
258
+ import androidx.compose.foundation.pager.HorizontalPager
259
+ import androidx.compose.foundation.pager.rememberPagerState
260
+ import androidx.compose.foundation.shape.RoundedCornerShape
261
+ import androidx.compose.ui.draw.clip
262
+ import androidx.compose.ui.layout.ContentScale
263
+ import androidx.compose.ui.text.style.TextOverflow
264
+ import coil.compose.AsyncImage
265
+
266
+ @Composable
267
+ fun StayCard(
268
+ photoUrls: List<String>,
269
+ title: String,
270
+ host: String,
271
+ dates: String,
272
+ pricePerNight: Int,
273
+ rating: Double,
274
+ reviewCount: Int,
275
+ modifier: Modifier = Modifier,
276
+ ) {
277
+ var isSaved by remember { mutableStateOf(false) }
278
+ val pager = rememberPagerState(pageCount = { photoUrls.size })
279
+
280
+ Column(modifier = modifier.fillMaxWidth()) {
281
+ Box {
282
+ HorizontalPager(
283
+ state = pager,
284
+ modifier = Modifier
285
+ .fillMaxWidth()
286
+ .aspectRatio(4f / 3f) // signature 4:3
287
+ .clip(RoundedCornerShape(16.dp)), // signature 16dp radius
288
+ ) { page ->
289
+ AsyncImage(
290
+ model = photoUrls[page],
291
+ contentDescription = "$title photo ${page + 1}",
292
+ modifier = Modifier.fillMaxSize(),
293
+ contentScale = ContentScale.Crop,
294
+ )
295
+ }
296
+ SaveHeart(
297
+ isSaved = isSaved,
298
+ onToggle = { isSaved = !isSaved },
299
+ modifier = Modifier.align(Alignment.TopEnd).padding(12.dp),
300
+ )
301
+ // Dot indicators bottom-center (6 max)
302
+ Row(
303
+ Modifier.align(Alignment.BottomCenter).padding(bottom = 8.dp),
304
+ horizontalArrangement = Arrangement.spacedBy(6.dp),
305
+ ) {
306
+ repeat(minOf(photoUrls.size, 6)) { i ->
307
+ Box(
308
+ Modifier
309
+ .size(6.dp)
310
+ .clip(CircleShape)
311
+ .background(
312
+ if (i == pager.currentPage) Color.White
313
+ else Color.White.copy(alpha = 0.5f)
314
+ ),
315
+ )
316
+ }
317
+ }
318
+ }
319
+
320
+ RatingRow(rating, reviewCount, Modifier.padding(top = 8.dp))
321
+ Text(title, style = AirbnbText.CardTitle, color = AirbnbColors.Hof,
322
+ maxLines = 1, overflow = TextOverflow.Ellipsis, modifier = Modifier.padding(top = 2.dp))
323
+ Text(host, style = AirbnbText.Meta, color = AirbnbColors.Foggy,
324
+ maxLines = 1, overflow = TextOverflow.Ellipsis, modifier = Modifier.padding(top = 2.dp))
325
+ Text(dates, style = AirbnbText.Meta, color = AirbnbColors.Foggy,
326
+ modifier = Modifier.padding(top = 6.dp))
327
+ Row(Modifier.padding(top = 4.dp), horizontalArrangement = Arrangement.spacedBy(4.dp)) {
328
+ Text("$$pricePerNight", style = AirbnbText.PriceInline, color = AirbnbColors.Hof)
329
+ Text("night", style = AirbnbText.PriceInline.copy(fontWeight = FontWeight.Normal),
330
+ color = AirbnbColors.Hof)
331
+ }
332
+ }
333
+ }
334
+ ```
335
+
336
+ ### Search Pill (Explore top)
337
+
338
+ ```kotlin
339
+ import androidx.compose.foundation.border
340
+ import androidx.compose.material.icons.filled.Search
341
+ import androidx.compose.material.icons.filled.Tune
342
+
343
+ @Composable
344
+ fun SearchPill(onClick: () -> Unit, modifier: Modifier = Modifier) {
345
+ Row(
346
+ modifier = modifier
347
+ .fillMaxWidth()
348
+ .height(56.dp)
349
+ .shadow(12.dp, CircleShape, spotColor = Color.Black.copy(alpha = 0.08f))
350
+ .clip(CircleShape) // full pill
351
+ .background(AirbnbColors.Canvas)
352
+ .border(0.5.dp, AirbnbColors.Divider, CircleShape)
353
+ .clickable(onClick = onClick)
354
+ .padding(horizontal = 20.dp),
355
+ verticalAlignment = Alignment.CenterVertically,
356
+ horizontalArrangement = Arrangement.spacedBy(12.dp),
357
+ ) {
358
+ Icon(Icons.Filled.Search, contentDescription = null,
359
+ tint = AirbnbColors.Ink, modifier = Modifier.size(16.dp))
360
+ Column(Modifier.weight(1f)) {
361
+ Text("Where to?", style = AirbnbText.CardTitle.copy(fontWeight = FontWeight.Bold),
362
+ color = AirbnbColors.Ink)
363
+ Text("Anywhere · Any week · Add guests", style = AirbnbText.Caption,
364
+ color = AirbnbColors.Foggy)
365
+ }
366
+ Box(
367
+ Modifier
368
+ .size(36.dp)
369
+ .clip(CircleShape)
370
+ .border(1.dp, AirbnbColors.Divider, CircleShape),
371
+ contentAlignment = Alignment.Center,
372
+ ) {
373
+ Icon(Icons.Filled.Tune, contentDescription = "Filters",
374
+ tint = AirbnbColors.Ink, modifier = Modifier.size(14.dp))
375
+ }
376
+ }
377
+ }
378
+ ```
379
+
380
+ ### Category Bar (sliding underline — see §4 for the motion)
381
+
382
+ ```kotlin
383
+ import androidx.compose.foundation.lazy.LazyRow
384
+ import androidx.compose.foundation.lazy.itemsIndexed
385
+ import androidx.compose.animation.animateColorAsState
386
+
387
+ @Composable
388
+ fun CategoryBar(
389
+ categories: List<Pair<androidx.compose.ui.graphics.vector.ImageVector, String>>,
390
+ selected: Int,
391
+ onSelect: (Int) -> Unit,
392
+ ) {
393
+ LazyRow(
394
+ modifier = Modifier
395
+ .fillMaxWidth()
396
+ .height(72.dp)
397
+ .background(AirbnbColors.Canvas),
398
+ contentPadding = PaddingValues(horizontal = 16.dp),
399
+ horizontalArrangement = Arrangement.spacedBy(32.dp),
400
+ verticalAlignment = Alignment.CenterVertically,
401
+ ) {
402
+ itemsIndexed(categories) { i, (icon, label) ->
403
+ val isSel = i == selected
404
+ val tint by animateColorAsState(
405
+ if (isSel) AirbnbColors.Ink else Color(0xFF717171), label = "catTint")
406
+ Column(
407
+ horizontalAlignment = Alignment.CenterHorizontally,
408
+ modifier = Modifier.clickable(
409
+ interactionSource = remember { MutableInteractionSource() },
410
+ indication = null,
411
+ ) { onSelect(i) },
412
+ ) {
413
+ Icon(icon, contentDescription = label, tint = tint, modifier = Modifier.size(24.dp))
414
+ Spacer(Modifier.height(6.dp))
415
+ Text(label, style = AirbnbText.Chip, color = tint)
416
+ Spacer(Modifier.height(8.dp))
417
+ Box(
418
+ Modifier
419
+ .height(2.dp)
420
+ .width(if (isSel) 28.dp else 0.dp)
421
+ .background(AirbnbColors.Ink),
422
+ )
423
+ }
424
+ }
425
+ }
426
+ }
427
+ ```
428
+
429
+ ### Sticky Booking Footer (Stay Detail bottom)
430
+
431
+ iOS uses `.regularMaterial` blur; Android has no first-class live blur, so use a 95%-opaque canvas `Surface` with a hairline top divider.
432
+
433
+ ```kotlin
434
+ import androidx.compose.material3.Surface
435
+ import androidx.compose.ui.text.style.TextDecoration
436
+
437
+ @Composable
438
+ fun BookingFooter(
439
+ totalPrice: Int,
440
+ dateRange: String,
441
+ onReserve: () -> Unit,
442
+ ) {
443
+ val haptics = LocalHapticFeedback.current
444
+ Surface(color = AirbnbColors.Canvas.copy(alpha = 0.95f), tonalElevation = 0.dp) {
445
+ Column {
446
+ Box(Modifier.fillMaxWidth().height(0.5.dp).background(AirbnbColors.Divider))
447
+ Row(
448
+ modifier = Modifier
449
+ .fillMaxWidth()
450
+ .height(80.dp)
451
+ .padding(horizontal = 24.dp),
452
+ verticalAlignment = Alignment.CenterVertically,
453
+ ) {
454
+ Column(Modifier.weight(1f)) {
455
+ Row(verticalAlignment = Alignment.Bottom,
456
+ horizontalArrangement = Arrangement.spacedBy(4.dp)) {
457
+ Text("$$totalPrice", style = AirbnbText.Subsection.copy(fontSize = 16.sp),
458
+ color = AirbnbColors.Ink)
459
+ Text("total", style = AirbnbText.BodySmall, color = AirbnbColors.Ink)
460
+ }
461
+ Text(dateRange, style = AirbnbText.BodySmall, color = AirbnbColors.Ink,
462
+ textDecoration = TextDecoration.Underline)
463
+ }
464
+ ReservePill(text = "Reserve") {
465
+ haptics.performHapticFeedback(HapticFeedbackType.LongPress) // ~iOS .medium impact
466
+ onReserve()
467
+ }
468
+ }
469
+ }
470
+ }
471
+ }
472
+
473
+ @Composable
474
+ fun ReservePill(text: String, onClick: () -> Unit) {
475
+ val interaction = remember { MutableInteractionSource() }
476
+ val pressed by interaction.collectIsPressedAsState()
477
+ val scale by animateFloatAsState(if (pressed) 0.98f else 1f, label = "reserveScale")
478
+ Box(
479
+ modifier = Modifier
480
+ .scale(scale)
481
+ .heightIn(min = 48.dp)
482
+ .clip(RoundedCornerShape(8.dp)) // soft rectangle, NOT a full pill
483
+ .background(if (pressed) AirbnbColors.CoralPressed else AirbnbColors.Coral)
484
+ .clickable(interaction, indication = null, onClick = onClick)
485
+ .padding(horizontal = 28.dp, vertical = 14.dp),
486
+ contentAlignment = Alignment.Center,
487
+ ) {
488
+ Text(text, style = AirbnbText.Button, color = Color.White)
489
+ }
490
+ }
491
+ ```
492
+
493
+ ### Map Price Bubble
494
+
495
+ ```kotlin
496
+ enum class BubbleState { Default, Visited, Selected }
497
+
498
+ @Composable
499
+ fun MapPriceBubble(price: Int, state: BubbleState = BubbleState.Default) {
500
+ val bg = when (state) {
501
+ BubbleState.Default -> Color.White
502
+ BubbleState.Visited -> AirbnbColors.Ink
503
+ BubbleState.Selected -> AirbnbColors.Coral
504
+ }
505
+ val fg = if (state == BubbleState.Default) AirbnbColors.Ink else Color.White
506
+ Box(
507
+ Modifier
508
+ .shadow(6.dp, RoundedCornerShape(12.dp), spotColor = Color.Black.copy(alpha = 0.2f))
509
+ .clip(RoundedCornerShape(12.dp)) // rounded rect, NOT a full pill
510
+ .background(bg)
511
+ .padding(horizontal = 10.dp, vertical = 6.dp),
512
+ ) {
513
+ Text("$$price", style = AirbnbText.PriceInline.copy(fontWeight = FontWeight.Bold), color = fg)
514
+ }
515
+ }
516
+ ```
517
+
518
+ ## 4. Category Underline — Shared-Element Slide
519
+
520
+ Airbnb's signature interaction is the category-bar underline that slides to the tapped chip (iOS `matchedGeometryEffect`). The §3 `CategoryBar` animates width per chip; for a true single underline that travels across chips, drive an `Animatable` offset with a `spring`, mirroring DESIGN.md §6's "underline slides … 250ms spring".
521
+
522
+ ```kotlin
523
+ import androidx.compose.foundation.layout.offset
524
+ import androidx.compose.ui.unit.Dp
525
+
526
+ @Composable
527
+ fun SlidingUnderline(
528
+ chipCount: Int,
529
+ selected: Int,
530
+ chipWidth: Dp,
531
+ chipSpacing: Dp = 32.dp,
532
+ ) {
533
+ val targetX = (chipWidth + chipSpacing) * selected
534
+ val x by animateDpAsState(
535
+ targetValue = targetX,
536
+ animationSpec = spring(dampingRatio = 0.8f, stiffness = 400f), // ~250ms feel
537
+ label = "underline",
538
+ )
539
+ Box(
540
+ Modifier
541
+ .offset(x = x)
542
+ .width(chipWidth)
543
+ .height(2.dp)
544
+ .background(AirbnbColors.Ink),
545
+ )
546
+ }
547
+ ```
548
+
549
+ The **search-pill → modal** morph is Compose's `SharedTransitionLayout` + `Modifier.sharedElement()` (Compose 1.7+) on the pill container; fall back to `AnimatedVisibility` with `slideInVertically` + a 400ms cross-fade if you target older BOMs. The **Belo logomark** loading pulse is a `rememberInfiniteTransition` driving alpha `0.6f → 1f → 0.6f` over 1200ms, tinted `AirbnbColors.Rausch` (never Coral).
550
+
551
+ ## 5. Bottom Navigation (Tab Bar)
552
+
553
+ Use Material 3 `NavigationBar`. Airbnb's iOS tab bar is `.regularMaterial` blur; Android has no first-class live blur, so use a 92%-opaque canvas surface. **Active tint is Primary Coral** (icon + label), inactive is `#717171`. All five tabs are always labeled.
554
+
555
+ ```kotlin
556
+ import androidx.compose.material.icons.filled.*
557
+ import androidx.compose.material3.NavigationBar
558
+ import androidx.compose.material3.NavigationBarItem
559
+ import androidx.compose.material3.NavigationBarItemDefaults
560
+
561
+ @Composable
562
+ fun AirbnbBottomBar(selected: Int, onSelect: (Int) -> Unit) {
563
+ NavigationBar(
564
+ containerColor = AirbnbColors.Canvas.copy(alpha = 0.92f),
565
+ tonalElevation = 0.dp,
566
+ ) {
567
+ val items = listOf(
568
+ "Explore" to Icons.Filled.Search,
569
+ "Wishlists" to Icons.Filled.Favorite,
570
+ "Trips" to Icons.Filled.Flight,
571
+ "Inbox" to Icons.Filled.ChatBubbleOutline,
572
+ "Profile" to Icons.Filled.AccountCircle,
573
+ )
574
+ items.forEachIndexed { i, (label, icon) ->
575
+ NavigationBarItem(
576
+ selected = selected == i,
577
+ onClick = { onSelect(i) },
578
+ icon = { Icon(icon, contentDescription = label, modifier = Modifier.size(24.dp)) },
579
+ label = { Text(label, style = AirbnbText.Tab) },
580
+ colors = NavigationBarItemDefaults.colors(
581
+ selectedIconColor = AirbnbColors.Coral,
582
+ selectedTextColor = AirbnbColors.Coral,
583
+ unselectedIconColor = Color(0xFF717171),
584
+ unselectedTextColor = Color(0xFF717171),
585
+ indicatorColor = Color.Transparent, // no Material pill — Airbnb has none
586
+ ),
587
+ )
588
+ }
589
+ }
590
+ }
591
+ ```
592
+
593
+ The collapsing **large-title nav bar** (`#222222` Cereal 32sp ExtraBold over a metadata strip) is best built with a `LargeTopAppBar` + `TopAppBarDefaults.exitUntilCollapsedScrollBehavior()`, with the `CategoryBar` pinned directly beneath it inside the `Scaffold` content.
594
+
595
+ ## 6. Motion
596
+
597
+ | Moment | Compose recipe |
598
+ |--------|----------------|
599
+ | Save heart tap | `Animatable` 1 → 1.25 → 1 spring (`dampingRatio = 0.6f`); `HapticFeedbackType.TextHandleMove` (~iOS `.soft`) |
600
+ | Photo carousel swipe | `HorizontalPager` 60fps paging, rubber-band at edges; dot indicators cross-fade |
601
+ | Category bar switch | `animateDpAsState` underline offset, `spring(dampingRatio = 0.8f)` ≈ 250ms |
602
+ | Search pill → modal | `SharedTransitionLayout` + `Modifier.sharedElement()` (1.7+); fallback `slideInVertically` + 400ms cross-fade |
603
+ | Reserve tap | `animateFloatAsState` 1 → 0.98; `HapticFeedbackType.LongPress` (~`.medium`); success → see below |
604
+ | Map pin select | scale 1 → 1.1 + color `White` → `Coral` via `animateColorAsState`; card slides up from bottom |
605
+ | Belo loading | `rememberInfiniteTransition` alpha `0.6 → 1 → 0.6` over 1200ms, Rausch |
606
+
607
+ ```kotlin
608
+ // Save-heart bounce — exact 1 → 1.25 → 1 spring (damping 0.6)
609
+ @Composable
610
+ fun rememberHeartBounce(isSaved: Boolean): Float {
611
+ val scale = remember { Animatable(1f) }
612
+ LaunchedEffect(isSaved) {
613
+ if (isSaved) {
614
+ scale.animateTo(1.25f, spring(dampingRatio = 0.6f, stiffness = 500f))
615
+ scale.animateTo(1f, spring(dampingRatio = 0.6f, stiffness = 500f))
616
+ }
617
+ }
618
+ return scale.value
619
+ }
620
+ ```
621
+
622
+ Haptics: prefer `LocalHapticFeedback`. For richer control use `LocalView.current.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK)` (API 30+) or a `Vibrator` `VibrationEffect.createOneShot(10, ...)` to approximate iOS's `.soft` impact on the save heart, and `.medium` on Reserve. Booking-confirmed → a double-buzz `VibrationEffect.createWaveform(longArrayOf(0, 40, 60, 40), -1)` mirrors iOS `.notificationOccurred(.success)`.
623
+
624
+ ## 7. Icons
625
+
626
+ Airbnb ships custom category glyphs; the closest first-party set is `androidx.compose.material:material-icons-extended`. Export Airbnb's bespoke category icons and the Belo logomark as vector drawables and load via `ImageVector.vectorResource(R.drawable.…)`.
627
+
628
+ | Component | SF Symbol (iOS) | Material Icon (Compose) |
629
+ |-----------|-----------------|--------------------------|
630
+ | Save (unsaved) | `heart` | `Icons.Outlined.FavoriteBorder` |
631
+ | Save (saved) | `heart.fill` | `Icons.Filled.Favorite` |
632
+ | Rating star | `star.fill` | `Icons.Filled.Star` |
633
+ | Search | `magnifyingglass` | `Icons.Filled.Search` |
634
+ | Filters | `slider.horizontal.3` | `Icons.Filled.Tune` |
635
+ | Show all photos | `square.grid.2x2.fill` | `Icons.Filled.GridView` |
636
+ | Superhost | `checkmark.seal.fill` (Babu) | `Icons.Filled.Verified` |
637
+ | Explore tab | `magnifyingglass` | `Icons.Filled.Search` |
638
+ | Wishlists tab | `heart` / `heart.fill` | `Icons.Filled.Favorite` |
639
+ | Trips tab | `airplane` | `Icons.Filled.Flight` |
640
+ | Inbox tab | `message` / `message.fill` | `Icons.Filled.ChatBubbleOutline` |
641
+ | Profile tab | `person.circle` | `Icons.Filled.AccountCircle` |
642
+ | Wifi amenity | `wifi` | `Icons.Filled.Wifi` |
643
+ | TV amenity | `tv.fill` | `Icons.Filled.Tv` |
644
+ | Parking amenity | `parkingsign.circle` | `Icons.Filled.LocalParking` |
645
+ | Back (detail) | `chevron.left` | `Icons.AutoMirrored.Filled.ArrowBackIos` |
646
+ | Share | `square.and.arrow.up` | `Icons.Filled.IosShare` |
647
+ | Belo logomark | — | custom vector drawable, Rausch `#FF5A5F` |
648
+
649
+ ## 8. Minimum SDK & Accessibility Notes
650
+
651
+ - **minSdk 24** (Compose floor is 21; modern motion + `HorizontalPager` are comfortable at 24). `compileSdk 34+`, Compose BOM `2024.09+`, Kotlin `2.0+`.
652
+ - **Edge-to-edge**: call `enableEdgeToEdge()` in the `Activity`; the white canvas wants `WindowCompat` dark-content (dark icons) system bars. Apply `Scaffold` insets / `Modifier.windowInsetsPadding(WindowInsets.systemBars)` so the sticky Reserve footer clears the gesture nav and the large title clears the status bar.
653
+ - **Font scaling**: `sp` honors the user's font scale automatically — keep it on stay-card titles, host bylines, dates, body copy, and large nav titles. Pin layout-sensitive text (10sp tab labels, 12sp chip labels, the map price bubble, rating numbers) by deriving size from `dp` or wrapping in `CompositionLocalProvider(LocalDensity provides Density(density, fontScale = 1f))`. Stay-card title scales but clamp at ~18sp.
654
+ - **TalkBack**: merge the whole stay card into one node with `Modifier.semantics(mergeDescendants = true) { contentDescription = "Private room in Reykjavik, hosted by Sigrún, Superhost, 4.92 stars, 324 reviews, Oct 12 to 17, \$214 per night" }`; expose the save heart as a *separate* button node (`"Save"` / `"Saved"`).
655
+ - **Touch targets**: Material guidance is 48.dp minimum. The save heart already uses a 44.dp box — bump to 48.dp via padding. The Reserve pill is `heightIn(min = 48.dp)`; category chips fill the 72.dp bar height.
656
+ - **Contrast**: Hof (`#484848`) on white passes WCAG AA at all sizes. Foggy (`#767676`) on white passes AA only at ≥18sp Bold or ≥14sp Medium — do not use Foggy for small body text; for the 14sp Book host byline this is borderline, nudge toward `#6A6A6A` if targeting strict AA.
657
+ - **Reduce motion**: when `Settings.Global.ANIMATOR_DURATION_SCALE == 0f`, skip the heart 1.25 bounce and the underline slide — fall back to an instant color/position change.
658
+ - **Dynamic color**: do **not** enable Material You `dynamicLightColorScheme()` — Airbnb's brand requires the fixed white canvas and the specific `#FF385C` coral regardless of the user's wallpaper. Photography is the color story, not the system accent.