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,686 @@
1
+ # Amazon (iOS) — Jetpack Compose Implementation Guide
2
+
3
+ Companion to [DESIGN.md](DESIGN.md) — the framework-neutral spec. This file ports Amazon'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 (Amazon's deep-navy chrome, yellow-with-black-text CTA, superscript-cents pricing, dense info-packed product tiles) while making everything idiomatic Android — `NavigationBar` instead of a UITabBar, a `RoundedCornerShape` with per-corner radii for the search bar's split, `sp`/`dp` instead of `pt`. Amazon is a *light-canvas* storefront, 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 product photography.
8
+
9
+ ## 1. Color Tokens
10
+
11
+ ```kotlin
12
+ // ui/theme/AmazonColors.kt
13
+ import androidx.compose.ui.graphics.Color
14
+
15
+ object AmazonColors {
16
+ // Canvas & Surfaces
17
+ val Canvas = Color(0xFFFFFFFF)
18
+ val SurfaceMuted = Color(0xFFF3F3F3)
19
+ val SurfaceTint = Color(0xFFF7F8F8)
20
+ val Divider = Color(0xFFDDDDDD)
21
+ val BorderDefault = Color(0xFFD5D9D9)
22
+
23
+ // Text
24
+ val TextPrimary = Color(0xFF0F1111) // titles, prices, body
25
+ val TextSecondary = Color(0xFF565959) // metadata, "shipped by", helper
26
+ val TextTertiary = Color(0xFF848A8C) // disabled, placeholder
27
+
28
+ // Brand
29
+ val Yellow = Color(0xFFFF9900) // primary CTA — Add to Cart
30
+ val YellowPressed = Color(0xFFE68A00)
31
+ val YellowHighlight = Color(0xFFFCD200) // 1dp top-edge 3D cue
32
+ val BuyNowOrange = Color(0xFFF08804) // Buy Now / Place your order
33
+ val DeepNavy = Color(0xFF131921) // top nav chrome
34
+ val SecondaryNavy = Color(0xFF232F3E) // sub-nav, account panel
35
+
36
+ // Semantic
37
+ val PriceRed = Color(0xFFB12704) // deals, savings, struck-through
38
+ val AlertRed = Color(0xFFCC0C39) // errors, cart badge, out-of-stock
39
+ val SuccessGreen = Color(0xFF007600) // "FREE Delivery", in stock
40
+ val PrimeTeal = Color(0xFF007185) // Prime UI, in-body links, review count
41
+ val PrimeSky = Color(0xFF00A8E1) // `prime` wordmark accent
42
+ val RatingGold = Color(0xFFFFA41C) // 5-star glyphs
43
+ val StarEmpty = Color(0xFFE3E6E6) // empty star track
44
+
45
+ // Dark mode (light-first app; dark is a variant)
46
+ val DarkCanvas = Color(0xFF0F1111)
47
+ val DarkSurface1 = Color(0xFF1A1F25)
48
+ val DarkSurface2 = Color(0xFF232F3E)
49
+ val DarkDivider = Color(0xFF3A4553)
50
+ val DarkText = Color(0xFFF5F5F5)
51
+ val DarkTextSec = Color(0xFFAAB7B8)
52
+ }
53
+ ```
54
+
55
+ Amazon is light-first, so wire a Material 3 `lightColorScheme` (provide the dark variant for dark mode). The yellow CTA carries the brand even in chrome, so `primary` stays Amazon Yellow with black `onPrimary`.
56
+
57
+ ```kotlin
58
+ // ui/theme/Theme.kt
59
+ import androidx.compose.material3.lightColorScheme
60
+ import androidx.compose.material3.darkColorScheme
61
+ import androidx.compose.material3.MaterialTheme
62
+ import androidx.compose.foundation.isSystemInDarkTheme
63
+
64
+ private val AmazonLight = lightColorScheme(
65
+ primary = AmazonColors.Yellow,
66
+ onPrimary = AmazonColors.TextPrimary, // intentional: black on yellow, not white
67
+ background = AmazonColors.Canvas,
68
+ onBackground = AmazonColors.TextPrimary,
69
+ surface = AmazonColors.Canvas,
70
+ onSurface = AmazonColors.TextPrimary,
71
+ surfaceVariant = AmazonColors.SurfaceMuted,
72
+ outline = AmazonColors.BorderDefault,
73
+ error = AmazonColors.AlertRed,
74
+ )
75
+
76
+ private val AmazonDark = darkColorScheme(
77
+ primary = AmazonColors.Yellow, // unchanged on dark
78
+ onPrimary = AmazonColors.TextPrimary,
79
+ background = AmazonColors.DarkCanvas,
80
+ onBackground = AmazonColors.DarkText,
81
+ surface = AmazonColors.DarkSurface1,
82
+ onSurface = AmazonColors.DarkText,
83
+ surfaceVariant = AmazonColors.DarkSurface2,
84
+ outline = AmazonColors.DarkDivider,
85
+ error = AmazonColors.AlertRed,
86
+ )
87
+
88
+ @Composable
89
+ fun AmazonTheme(
90
+ darkTheme: Boolean = isSystemInDarkTheme(),
91
+ content: @Composable () -> Unit,
92
+ ) = MaterialTheme(
93
+ colorScheme = if (darkTheme) AmazonDark else AmazonLight,
94
+ typography = AmazonTypography,
95
+ content = content,
96
+ )
97
+ ```
98
+
99
+ ## 2. Typography
100
+
101
+ Amazon Ember (proprietary since 2015) is on every Amazon surface. Drop the TTFs in `res/font/` (lowercase, snake_case) and build a `FontFamily`. Fall back to the system font (Roboto) — a humanist sans tuned for small-size legibility, the closest free substitute.
102
+
103
+ ```kotlin
104
+ // ui/theme/AmazonType.kt
105
+ import androidx.compose.material3.Typography
106
+ import androidx.compose.ui.text.TextStyle
107
+ import androidx.compose.ui.text.font.Font
108
+ import androidx.compose.ui.text.font.FontFamily
109
+ import androidx.compose.ui.text.font.FontWeight
110
+ import androidx.compose.ui.unit.sp
111
+
112
+ val AmazonEmber = FontFamily(
113
+ Font(R.font.amazon_ember_light, FontWeight.Light), // 300
114
+ Font(R.font.amazon_ember_regular, FontWeight.Normal), // 400
115
+ Font(R.font.amazon_ember_medium, FontWeight.Medium), // 500
116
+ Font(R.font.amazon_ember_bold, FontWeight.Bold), // 700
117
+ )
118
+
119
+ // Named ramp — mirrors DESIGN.md §3 exactly (pt → sp 1:1)
120
+ object AmazonText {
121
+ val NavHero = TextStyle(AmazonEmber, fontWeight = FontWeight.Bold, fontSize = 22.sp, lineHeight = 25.sp, letterSpacing = (-0.2).sp)
122
+ val Section = TextStyle(AmazonEmber, fontWeight = FontWeight.Bold, fontSize = 20.sp, lineHeight = 24.sp, letterSpacing = (-0.1).sp)
123
+ val ProductTitle = TextStyle(AmazonEmber, fontWeight = FontWeight.Normal, fontSize = 16.sp, lineHeight = 21.sp)
124
+ val PDPTitle = TextStyle(AmazonEmber, fontWeight = FontWeight.Medium, fontSize = 20.sp, lineHeight = 26.sp, letterSpacing = (-0.1).sp)
125
+ val PriceHero = TextStyle(AmazonEmber, fontWeight = FontWeight.Bold, fontSize = 28.sp, lineHeight = 28.sp, letterSpacing = (-0.3).sp)
126
+ val PriceSuper = TextStyle(AmazonEmber, fontWeight = FontWeight.Bold, fontSize = 14.sp, lineHeight = 14.sp)
127
+ val PriceCard = TextStyle(AmazonEmber, fontWeight = FontWeight.Bold, fontSize = 18.sp, lineHeight = 20.sp, letterSpacing = (-0.1).sp)
128
+ val PriceStruck = TextStyle(AmazonEmber, fontWeight = FontWeight.Normal, fontSize = 14.sp, lineHeight = 17.sp)
129
+ val Body = TextStyle(AmazonEmber, fontWeight = FontWeight.Normal, fontSize = 15.sp, lineHeight = 22.sp)
130
+ val RatingCount = TextStyle(AmazonEmber, fontWeight = FontWeight.Normal, fontSize = 13.sp, lineHeight = 17.sp)
131
+ val Delivery = TextStyle(AmazonEmber, fontWeight = FontWeight.Medium, fontSize = 13.sp, lineHeight = 17.sp)
132
+ val Meta = TextStyle(AmazonEmber, fontWeight = FontWeight.Normal, fontSize = 12.sp, lineHeight = 16.sp)
133
+ val Button = TextStyle(AmazonEmber, fontWeight = FontWeight.Medium, fontSize = 15.sp, lineHeight = 15.sp)
134
+ val ButtonSmall = TextStyle(AmazonEmber, fontWeight = FontWeight.Normal, fontSize = 14.sp, lineHeight = 14.sp)
135
+ val PrimeBadge = TextStyle(AmazonEmber, fontWeight = FontWeight.Bold, fontSize = 11.sp, lineHeight = 11.sp, letterSpacing = 0.3.sp)
136
+ val Tab = TextStyle(AmazonEmber, fontWeight = FontWeight.Medium, fontSize = 10.sp, lineHeight = 10.sp)
137
+ val SearchHint = TextStyle(AmazonEmber, fontWeight = FontWeight.Normal, fontSize = 16.sp, lineHeight = 16.sp)
138
+ val PromoBadge = TextStyle(AmazonEmber, fontWeight = FontWeight.Bold, fontSize = 11.sp, lineHeight = 11.sp, letterSpacing = 0.5.sp)
139
+ }
140
+
141
+ // Map onto Material 3 slots so stock components inherit the brand
142
+ val AmazonTypography = Typography(
143
+ headlineMedium = AmazonText.NavHero,
144
+ headlineSmall = AmazonText.Section,
145
+ titleMedium = AmazonText.PDPTitle,
146
+ bodyLarge = AmazonText.Body,
147
+ bodyMedium = AmazonText.ProductTitle,
148
+ labelLarge = AmazonText.Button,
149
+ labelSmall = AmazonText.Tab,
150
+ )
151
+ ```
152
+
153
+ ## 3. Signature Components
154
+
155
+ ### Top Nav with Search Bar (navy + split yellow action)
156
+
157
+ The SwiftUI `RoundedCorner` shape becomes `RoundedCornerShape(topStart, topEnd, bottomEnd, bottomStart)` — the search field rounds its left corners only, the yellow mic/scan block rounds its right corners only.
158
+
159
+ ```kotlin
160
+ import androidx.compose.foundation.background
161
+ import androidx.compose.foundation.clickable
162
+ import androidx.compose.foundation.layout.*
163
+ import androidx.compose.foundation.shape.RoundedCornerShape
164
+ import androidx.compose.material.icons.Icons
165
+ import androidx.compose.material.icons.filled.*
166
+ import androidx.compose.material3.Icon
167
+ import androidx.compose.material3.Text
168
+ import androidx.compose.runtime.Composable
169
+ import androidx.compose.ui.Alignment
170
+ import androidx.compose.ui.Modifier
171
+ import androidx.compose.ui.draw.clip
172
+ import androidx.compose.ui.unit.dp
173
+
174
+ @Composable
175
+ fun AmazonTopNav(onSearch: () -> Unit, onMicOrScan: () -> Unit) {
176
+ Row(
177
+ modifier = Modifier
178
+ .fillMaxWidth()
179
+ .height(56.dp)
180
+ .background(AmazonColors.DeepNavy)
181
+ .padding(horizontal = 12.dp),
182
+ verticalAlignment = Alignment.CenterVertically,
183
+ horizontalArrangement = Arrangement.spacedBy(12.dp),
184
+ ) {
185
+ Icon(
186
+ Icons.Filled.ShoppingCart, // stand-in for the smile logo (ship a vector drawable)
187
+ contentDescription = "Amazon",
188
+ tint = Color.White,
189
+ modifier = Modifier.size(28.dp),
190
+ )
191
+ Row(Modifier.weight(1f).height(44.dp)) {
192
+ Row(
193
+ modifier = Modifier
194
+ .weight(1f)
195
+ .fillMaxHeight()
196
+ .clip(RoundedCornerShape(topStart = 8.dp, bottomStart = 8.dp))
197
+ .background(AmazonColors.Canvas)
198
+ .clickable(onClick = onSearch)
199
+ .padding(horizontal = 12.dp),
200
+ verticalAlignment = Alignment.CenterVertically,
201
+ horizontalArrangement = Arrangement.spacedBy(8.dp),
202
+ ) {
203
+ Icon(Icons.Filled.Search, contentDescription = null,
204
+ tint = AmazonColors.TextSecondary, modifier = Modifier.size(18.dp))
205
+ Text("Search Amazon", style = AmazonText.SearchHint,
206
+ color = AmazonColors.TextSecondary)
207
+ }
208
+ Row(
209
+ modifier = Modifier
210
+ .fillMaxHeight()
211
+ .clip(RoundedCornerShape(topEnd = 8.dp, bottomEnd = 8.dp))
212
+ .background(AmazonColors.Yellow)
213
+ .clickable(onClick = onMicOrScan)
214
+ .padding(horizontal = 14.dp),
215
+ verticalAlignment = Alignment.CenterVertically,
216
+ horizontalArrangement = Arrangement.spacedBy(10.dp),
217
+ ) {
218
+ Icon(Icons.Filled.Mic, contentDescription = "Voice search",
219
+ tint = AmazonColors.TextPrimary, modifier = Modifier.size(18.dp))
220
+ Icon(Icons.Filled.QrCodeScanner, contentDescription = "Scan barcode",
221
+ tint = AmazonColors.TextPrimary, modifier = Modifier.size(20.dp))
222
+ }
223
+ }
224
+ }
225
+ }
226
+ ```
227
+
228
+ ### Add to Cart Button (Yellow + 1dp top highlight)
229
+
230
+ The vestigial 3D cue (1dp `#FCD200` top edge) is a `drawBehind` line over the rounded fill.
231
+
232
+ ```kotlin
233
+ import androidx.compose.animation.core.animateFloatAsState
234
+ import androidx.compose.animation.core.spring
235
+ import androidx.compose.foundation.interaction.MutableInteractionSource
236
+ import androidx.compose.foundation.interaction.collectIsPressedAsState
237
+ import androidx.compose.runtime.*
238
+ import androidx.compose.ui.draw.drawBehind
239
+ import androidx.compose.ui.draw.scale
240
+ import androidx.compose.ui.draw.shadow
241
+ import androidx.compose.ui.geometry.Offset
242
+ import androidx.compose.ui.hapticfeedback.HapticFeedbackType
243
+ import androidx.compose.ui.platform.LocalDensity
244
+ import androidx.compose.ui.platform.LocalHapticFeedback
245
+
246
+ @Composable
247
+ fun AmazonAddToCartButton(onClick: () -> Unit, modifier: Modifier = Modifier) {
248
+ val interaction = remember { MutableInteractionSource() }
249
+ val pressed by interaction.collectIsPressedAsState()
250
+ val scale by animateFloatAsState(
251
+ if (pressed) 0.98f else 1f,
252
+ spring(dampingRatio = 0.8f, stiffness = 600f),
253
+ label = "cartScale",
254
+ )
255
+ val haptics = LocalHapticFeedback.current
256
+ val strokePx = with(LocalDensity.current) { 1.dp.toPx() }
257
+
258
+ Box(
259
+ modifier = modifier
260
+ .fillMaxWidth()
261
+ .heightIn(min = 44.dp)
262
+ .scale(scale)
263
+ .shadow(2.dp, RoundedCornerShape(8.dp), spotColor = Color.Black.copy(alpha = 0.1f))
264
+ .clip(RoundedCornerShape(8.dp))
265
+ .background(if (pressed) AmazonColors.YellowPressed else AmazonColors.Yellow)
266
+ .drawBehind {
267
+ drawLine( // 1dp top highlight
268
+ color = AmazonColors.YellowHighlight,
269
+ start = Offset(0f, strokePx / 2),
270
+ end = Offset(size.width, strokePx / 2),
271
+ strokeWidth = strokePx,
272
+ )
273
+ }
274
+ .clickable(interaction, indication = null) {
275
+ haptics.performHapticFeedback(HapticFeedbackType.LongPress) // ~iOS success on cart inc
276
+ onClick()
277
+ }
278
+ .padding(horizontal = 16.dp, vertical = 12.dp),
279
+ contentAlignment = Alignment.Center,
280
+ ) {
281
+ Text("Add to Cart", style = AmazonText.Button, color = AmazonColors.TextPrimary)
282
+ }
283
+ }
284
+ ```
285
+
286
+ ### Buy Now Button (Orange)
287
+
288
+ ```kotlin
289
+ @Composable
290
+ fun AmazonBuyNowButton(onClick: () -> Unit, modifier: Modifier = Modifier) {
291
+ Box(
292
+ modifier = modifier
293
+ .fillMaxWidth()
294
+ .heightIn(min = 48.dp)
295
+ .clip(RoundedCornerShape(8.dp))
296
+ .background(AmazonColors.BuyNowOrange)
297
+ .clickable(onClick = onClick)
298
+ .padding(horizontal = 16.dp, vertical = 12.dp),
299
+ contentAlignment = Alignment.Center,
300
+ ) {
301
+ Text("Buy Now", style = AmazonText.Button, color = AmazonColors.TextPrimary)
302
+ }
303
+ }
304
+ ```
305
+
306
+ ### Star Rating Row (gold stars + teal review-count link)
307
+
308
+ ```kotlin
309
+ import androidx.compose.material.icons.filled.Star
310
+
311
+ @Composable
312
+ fun StarRatingRow(rating: Double, reviewCount: Int, modifier: Modifier = Modifier) {
313
+ Row(modifier, verticalAlignment = Alignment.CenterVertically,
314
+ horizontalArrangement = Arrangement.spacedBy(2.dp)) {
315
+ repeat(5) { i ->
316
+ Icon(
317
+ Icons.Filled.Star,
318
+ contentDescription = null,
319
+ tint = if (i < rating) AmazonColors.RatingGold else AmazonColors.StarEmpty,
320
+ modifier = Modifier.size(12.dp),
321
+ )
322
+ }
323
+ Text(" (${"%,d".format(reviewCount)})", style = AmazonText.RatingCount,
324
+ color = AmazonColors.PrimeTeal) // tappable teal-blue link
325
+ }
326
+ }
327
+ ```
328
+
329
+ ### Product Card (Grid Tile — packs photo + title + rating + price + Prime + delivery)
330
+
331
+ ```kotlin
332
+ import androidx.compose.foundation.shape.RoundedCornerShape
333
+ import androidx.compose.ui.layout.ContentScale
334
+ import androidx.compose.ui.text.style.TextOverflow
335
+ import androidx.compose.ui.text.font.FontWeight
336
+ import coil.compose.AsyncImage
337
+
338
+ @Composable
339
+ fun AmazonProductCard(
340
+ title: String,
341
+ rating: Double,
342
+ reviewCount: Int,
343
+ price: String,
344
+ originalPrice: String?,
345
+ isPrime: Boolean,
346
+ deliveryLine: String,
347
+ imageUrl: String,
348
+ modifier: Modifier = Modifier,
349
+ ) {
350
+ Column(
351
+ modifier = modifier
352
+ .background(AmazonColors.Canvas)
353
+ .padding(8.dp),
354
+ verticalArrangement = Arrangement.spacedBy(6.dp),
355
+ ) {
356
+ AsyncImage(
357
+ model = imageUrl,
358
+ contentDescription = title,
359
+ modifier = Modifier
360
+ .fillMaxWidth()
361
+ .aspectRatio(1f) // square product photo
362
+ .clip(RoundedCornerShape(4.dp)),
363
+ contentScale = ContentScale.Fit,
364
+ )
365
+ Text(
366
+ title,
367
+ style = AmazonText.ProductTitle,
368
+ color = AmazonColors.TextPrimary,
369
+ maxLines = 2, // signature 2-line clamp
370
+ overflow = TextOverflow.Ellipsis,
371
+ )
372
+ StarRatingRow(rating, reviewCount)
373
+ Row(verticalAlignment = Alignment.Bottom,
374
+ horizontalArrangement = Arrangement.spacedBy(6.dp)) {
375
+ Text(price, style = AmazonText.PriceCard, color = AmazonColors.TextPrimary)
376
+ if (originalPrice != null) {
377
+ Text(
378
+ originalPrice,
379
+ style = AmazonText.PriceStruck.copy(
380
+ textDecoration = androidx.compose.ui.text.style.TextDecoration.LineThrough),
381
+ color = AmazonColors.TextSecondary,
382
+ )
383
+ }
384
+ }
385
+ if (isPrime) {
386
+ Row(horizontalArrangement = Arrangement.spacedBy(4.dp)) {
387
+ Text("prime", style = AmazonText.PrimeBadge, color = AmazonColors.PrimeSky)
388
+ Text(deliveryLine, style = AmazonText.Delivery, color = AmazonColors.SuccessGreen)
389
+ }
390
+ }
391
+ }
392
+ }
393
+ ```
394
+
395
+ ### PDP Price Block (hero price with superscript cents)
396
+
397
+ iOS uses `baselineOffset`; in Compose the cleanest equivalent is an `AnnotatedString` with `BaselineShift` on the `$` and cents spans.
398
+
399
+ ```kotlin
400
+ import androidx.compose.ui.text.AnnotatedString
401
+ import androidx.compose.ui.text.SpanStyle
402
+ import androidx.compose.ui.text.buildAnnotatedString
403
+ import androidx.compose.ui.text.style.BaselineShift
404
+ import androidx.compose.ui.text.withStyle
405
+
406
+ @Composable
407
+ fun AmazonPDPPriceBlock(
408
+ dollars: Int,
409
+ cents: Int,
410
+ originalPrice: String?,
411
+ savingsLine: String?,
412
+ deliveryText: String,
413
+ ) {
414
+ val priceText = buildAnnotatedString {
415
+ withStyle(SpanStyle(
416
+ fontSize = AmazonText.PriceSuper.fontSize,
417
+ fontWeight = FontWeight.Bold,
418
+ baselineShift = BaselineShift(0.5f),
419
+ )) { append("$") }
420
+ withStyle(SpanStyle(
421
+ fontSize = AmazonText.PriceHero.fontSize,
422
+ fontWeight = FontWeight.Bold,
423
+ )) { append("$dollars") }
424
+ withStyle(SpanStyle(
425
+ fontSize = AmazonText.PriceSuper.fontSize,
426
+ fontWeight = FontWeight.Bold,
427
+ baselineShift = BaselineShift(0.5f),
428
+ )) { append("%02d".format(cents)) }
429
+ }
430
+
431
+ Column(verticalArrangement = Arrangement.spacedBy(6.dp)) {
432
+ Text(
433
+ priceText,
434
+ color = AmazonColors.TextPrimary,
435
+ // single VoiceOver utterance — see §8
436
+ modifier = Modifier.semantics { contentDescription = "\$$dollars.${"%02d".format(cents)}" },
437
+ )
438
+ if (originalPrice != null) {
439
+ Text(
440
+ originalPrice,
441
+ style = AmazonText.PriceStruck.copy(
442
+ textDecoration = androidx.compose.ui.text.style.TextDecoration.LineThrough),
443
+ color = AmazonColors.TextSecondary,
444
+ )
445
+ }
446
+ if (savingsLine != null) {
447
+ Text(savingsLine, style = AmazonText.Button, color = AmazonColors.PriceRed)
448
+ }
449
+ Row(horizontalArrangement = Arrangement.spacedBy(4.dp)) {
450
+ Text("prime", style = AmazonText.PrimeBadge, color = AmazonColors.PrimeSky)
451
+ Text(deliveryText, style = AmazonText.Button, color = AmazonColors.SuccessGreen)
452
+ }
453
+ }
454
+ }
455
+ ```
456
+
457
+ ### Lightning Deal Countdown Banner
458
+
459
+ ```kotlin
460
+ import androidx.compose.material.icons.filled.Bolt
461
+ import androidx.compose.ui.graphics.Brush
462
+
463
+ @Composable
464
+ fun AmazonLightningDealBanner(countdown: String) {
465
+ Row(
466
+ modifier = Modifier
467
+ .clip(RoundedCornerShape(4.dp))
468
+ .background(Brush.horizontalGradient(
469
+ listOf(AmazonColors.PriceRed, AmazonColors.AlertRed)))
470
+ .padding(horizontal = 12.dp, vertical = 8.dp),
471
+ verticalAlignment = Alignment.CenterVertically,
472
+ horizontalArrangement = Arrangement.spacedBy(10.dp),
473
+ ) {
474
+ Icon(Icons.Filled.Bolt, contentDescription = null,
475
+ tint = Color.White, modifier = Modifier.size(18.dp))
476
+ Text("Lightning Deal", style = AmazonText.Delivery.copy(fontWeight = FontWeight.Bold),
477
+ color = Color.White)
478
+ Spacer(Modifier.weight(1f))
479
+ Text("Ends in $countdown", style = AmazonText.Delivery, color = Color.White)
480
+ }
481
+ }
482
+ ```
483
+
484
+ ### Quantity Stepper
485
+
486
+ ```kotlin
487
+ import androidx.compose.foundation.border
488
+ import androidx.compose.material.icons.filled.Add
489
+ import androidx.compose.material.icons.filled.Remove
490
+
491
+ @Composable
492
+ fun AmazonQuantityStepper(count: Int, onChange: (Int) -> Unit) {
493
+ Row(
494
+ modifier = Modifier
495
+ .height(32.dp)
496
+ .clip(RoundedCornerShape(8.dp))
497
+ .background(AmazonColors.SurfaceMuted)
498
+ .border(1.dp, AmazonColors.BorderDefault, RoundedCornerShape(8.dp)),
499
+ verticalAlignment = Alignment.CenterVertically,
500
+ ) {
501
+ Box(Modifier.size(44.dp, 32.dp).clickable { if (count > 1) onChange(count - 1) },
502
+ contentAlignment = Alignment.Center) {
503
+ Icon(Icons.Filled.Remove, "Decrease", tint = AmazonColors.TextPrimary,
504
+ modifier = Modifier.size(16.dp))
505
+ }
506
+ Text("$count", style = AmazonText.Button, color = AmazonColors.TextPrimary,
507
+ modifier = Modifier.width(36.dp), textAlign = androidx.compose.ui.text.style.TextAlign.Center)
508
+ Box(Modifier.size(44.dp, 32.dp).clickable { onChange(count + 1) },
509
+ contentAlignment = Alignment.Center) {
510
+ Icon(Icons.Filled.Add, "Increase", tint = AmazonColors.TextPrimary,
511
+ modifier = Modifier.size(16.dp))
512
+ }
513
+ }
514
+ }
515
+ ```
516
+
517
+ ## 4. Add-to-Cart Toast + Cart-Badge Bump
518
+
519
+ Amazon's most distinctive feedback loop is the bottom slide-up confirmation paired with the cart-badge count bump. iOS uses `.offset` + spring; Compose uses `AnimatedVisibility` with `slideInVertically` and a `LaunchedEffect` auto-dismiss.
520
+
521
+ ```kotlin
522
+ import androidx.compose.animation.AnimatedVisibility
523
+ import androidx.compose.animation.slideInVertically
524
+ import androidx.compose.animation.slideOutVertically
525
+ import androidx.compose.animation.core.tween
526
+ import androidx.compose.material.icons.filled.CheckCircle
527
+ import kotlinx.coroutines.delay
528
+
529
+ @Composable
530
+ fun AddToCartToast(visible: Boolean, onDismiss: () -> Unit) {
531
+ LaunchedEffect(visible) {
532
+ if (visible) { delay(2500); onDismiss() } // auto-dismiss after 2.5s
533
+ }
534
+ AnimatedVisibility(
535
+ visible = visible,
536
+ enter = slideInVertically(tween(300)) { it }, // slide up from bottom
537
+ exit = slideOutVertically(tween(200)) { it },
538
+ ) {
539
+ Row(
540
+ modifier = Modifier
541
+ .fillMaxWidth()
542
+ .shadow(12.dp, spotColor = Color.Black.copy(alpha = 0.15f))
543
+ .background(AmazonColors.Canvas)
544
+ .height(48.dp)
545
+ .padding(horizontal = 16.dp),
546
+ verticalAlignment = Alignment.CenterVertically,
547
+ horizontalArrangement = Arrangement.spacedBy(8.dp),
548
+ ) {
549
+ Icon(Icons.Filled.CheckCircle, contentDescription = null,
550
+ tint = AmazonColors.SuccessGreen, modifier = Modifier.size(20.dp))
551
+ Text("Added to your Cart", style = AmazonText.Button,
552
+ color = AmazonColors.TextPrimary)
553
+ }
554
+ }
555
+ }
556
+
557
+ // Cart-badge bump: 1 → 1.3 → 1 spring when the count changes
558
+ @Composable
559
+ fun CartBadge(count: Int) {
560
+ val scale = remember { androidx.compose.animation.core.Animatable(1f) }
561
+ LaunchedEffect(count) {
562
+ scale.animateTo(1.3f, spring(dampingRatio = 0.55f, stiffness = 700f))
563
+ scale.animateTo(1f, spring(dampingRatio = 0.55f, stiffness = 700f))
564
+ }
565
+ Box(
566
+ Modifier
567
+ .scale(scale.value)
568
+ .clip(androidx.compose.foundation.shape.CircleShape)
569
+ .background(AmazonColors.AlertRed)
570
+ .padding(horizontal = 6.dp, vertical = 2.dp),
571
+ ) {
572
+ Text("$count", style = AmazonText.Meta.copy(fontWeight = FontWeight.Bold),
573
+ color = Color.White)
574
+ }
575
+ }
576
+ ```
577
+
578
+ ## 5. Bottom Navigation (Tab Bar)
579
+
580
+ Use Material 3 `NavigationBar`. Amazon's bar is opaque white with a hairline top border (no blur, so no translucency needed). **Active tint is Amazon Yellow** with the filled icon variant; inactive is `#565959`. The Cart tab carries a red badge.
581
+
582
+ ```kotlin
583
+ import androidx.compose.material3.NavigationBar
584
+ import androidx.compose.material3.NavigationBarItem
585
+ import androidx.compose.material3.NavigationBarItemDefaults
586
+ import androidx.compose.material3.BadgedBox
587
+ import androidx.compose.material3.Badge
588
+
589
+ @Composable
590
+ fun AmazonBottomBar(selected: Int, cartCount: Int, onSelect: (Int) -> Unit) {
591
+ NavigationBar(
592
+ containerColor = AmazonColors.Canvas,
593
+ tonalElevation = 0.dp,
594
+ ) {
595
+ val items = listOf(
596
+ "Home" to Icons.Filled.Home,
597
+ "Menu" to Icons.Filled.Menu,
598
+ "Cart" to Icons.Filled.ShoppingCart,
599
+ "You" to Icons.Filled.Person,
600
+ "Search" to Icons.Filled.Search,
601
+ )
602
+ items.forEachIndexed { i, (label, icon) ->
603
+ NavigationBarItem(
604
+ selected = selected == i,
605
+ onClick = { onSelect(i) },
606
+ icon = {
607
+ if (label == "Cart" && cartCount > 0) {
608
+ BadgedBox(badge = {
609
+ Badge(containerColor = AmazonColors.AlertRed,
610
+ contentColor = Color.White) { Text("$cartCount") }
611
+ }) { Icon(icon, contentDescription = label, modifier = Modifier.size(24.dp)) }
612
+ } else {
613
+ Icon(icon, contentDescription = label, modifier = Modifier.size(24.dp))
614
+ }
615
+ },
616
+ label = { Text(label, style = AmazonText.Tab) },
617
+ colors = NavigationBarItemDefaults.colors(
618
+ selectedIconColor = AmazonColors.Yellow,
619
+ selectedTextColor = AmazonColors.Yellow,
620
+ unselectedIconColor = AmazonColors.TextSecondary,
621
+ unselectedTextColor = AmazonColors.TextSecondary,
622
+ indicatorColor = Color.Transparent, // no Material pill — Amazon has none
623
+ ),
624
+ )
625
+ }
626
+ }
627
+ }
628
+ ```
629
+
630
+ The **navy sub-nav strip** ("Deliver to … City Zip") is a 36.dp `Surface(color = AmazonColors.SecondaryNavy)` row with a leading pin icon, rendered directly under `AmazonTopNav` inside the `Scaffold` `topBar`.
631
+
632
+ ## 6. Motion
633
+
634
+ | Moment | Compose recipe |
635
+ |--------|----------------|
636
+ | Add to Cart tap | `animateFloatAsState` 0.98 → 1 `spring(dampingRatio = 0.8f)`; `HapticFeedbackType.LongPress` (~iOS success) |
637
+ | Cart badge increment | `Animatable` 1 → 1.3 → 1 `spring(dampingRatio = 0.55f)` over ~200ms |
638
+ | Search expand | 250ms `tween` morph navy bar → full-screen search (`AnimatedContent`) |
639
+ | Image carousel swipe | `HorizontalPager` 60fps paging; page dots cross-fade |
640
+ | Variant swatch select | border 1dp → 2dp via `animateDpAsState` 150ms + light haptic |
641
+ | Add-to-cart toast | `slideInVertically` 300ms, hold 2.5s, `slideOutVertically` 200ms |
642
+ | Buy Now confirm | full-screen green check: `Animatable` scale + alpha over 500ms |
643
+ | Deal countdown | recomposes every 1s, **no animation** (efficiency — matches DESIGN.md) |
644
+
645
+ ```kotlin
646
+ // Add-to-Cart press scale (exact 0.98 → 1, damping 0.8)
647
+ val scale by animateFloatAsState(
648
+ targetValue = if (pressed) 0.98f else 1f,
649
+ animationSpec = spring(dampingRatio = 0.8f, stiffness = 600f),
650
+ label = "cartScale",
651
+ )
652
+ ```
653
+
654
+ Haptics: prefer `LocalHapticFeedback`. For richer control use `LocalView.current.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK)` (API 30+) — map `.selection` to the quantity stepper, a `.success`-style double-buzz `VibrationEffect.createWaveform(longArrayOf(0, 30, 50, 30), -1)` to the cart increment, and `VibrationEffect.createOneShot(20, DEFAULT_AMPLITUDE)` to "Place your order".
655
+
656
+ ## 7. Icons
657
+
658
+ Amazon ships the smile logo and custom glyphs as artwork; the closest first-party set is `androidx.compose.material:material-icons-extended`. Export the Amazon smile/arrow logo and the `prime` wordmark as vector drawables and load via `ImageVector.vectorResource(R.drawable.…)`.
659
+
660
+ | Component | SF Symbol (iOS) | Material Icon (Compose) |
661
+ |-----------|-----------------|--------------------------|
662
+ | Cart | `cart.fill` / `cart` | `Icons.Filled.ShoppingCart` |
663
+ | Search | `magnifyingglass` | `Icons.Filled.Search` |
664
+ | Mic (search) | `mic.fill` | `Icons.Filled.Mic` |
665
+ | Barcode scanner | `barcode.viewfinder` | `Icons.Filled.QrCodeScanner` |
666
+ | Lightning deal | `bolt.fill` | `Icons.Filled.Bolt` |
667
+ | Star (rating) | `star.fill` / `star` | `Icons.Filled.Star` |
668
+ | Checkmark (success) | `checkmark.circle.fill` | `Icons.Filled.CheckCircle` |
669
+ | Plus / Minus (stepper) | `plus` / `minus` | `Icons.Filled.Add` / `Icons.Filled.Remove` |
670
+ | Hamburger menu | `line.3.horizontal` | `Icons.Filled.Menu` |
671
+ | Bell (notifications) | `bell.fill` | `Icons.Filled.Notifications` |
672
+ | Person (You tab) | `person.fill` | `Icons.Filled.Person` |
673
+ | Home (tab) | `house.fill` | `Icons.Filled.Home` |
674
+ | Lock (secure transaction) | `lock.fill` | `Icons.Filled.Lock` |
675
+ | Amazon smile logo | — | custom vector drawable |
676
+
677
+ ## 8. Minimum SDK & Accessibility Notes
678
+
679
+ - **minSdk 24** (Compose floor is 21; `HorizontalPager` + modern motion are comfortable at 24). `compileSdk 34+`, Compose BOM `2024.09+`, Kotlin `2.0+`.
680
+ - **Edge-to-edge**: call `enableEdgeToEdge()` in the `Activity`. The navy nav extends under the status bar, so request light-content (light icons) system bars while the nav is showing; switch to dark-content over the white canvas. Apply `Scaffold` insets so the cart drawer clears the gesture nav.
681
+ - **Font scaling**: `sp` honors the user's font scale. Keep it on product titles, body, and reviews. Prices scale but **cap at ~140%** — wrap the price block in `CompositionLocalProvider(LocalDensity provides Density(density, fontScale = minOf(fontScale, 1.4f)))`. The `prime` wordmark and 10sp tab labels are fixed (brand/layout-sensitive).
682
+ - **TalkBack**: combine the superscript dollars + cents into one utterance via `Modifier.semantics { contentDescription = "$28.99" }` (already wired in §3) — never let the screen reader read "$ 28 99" as three tokens. Label Add to Cart as `"Add Wireless Headphones to cart for $24.99"`; the star row as `"4.7 out of 5 stars, 12,345 reviews"`.
683
+ - **Touch targets**: Material guidance is 48.dp minimum. The Add to Cart button is `heightIn(min = 44.dp)` — bump to 48.dp on the PDP. The stepper cells are 44.dp wide; the star row needs a 48.dp tall hit box even though glyphs are 12.dp.
684
+ - **Contrast**: `#565959` secondary text on `#FFFFFF` passes WCAG AA at ≥13sp. `#848A8C` tertiary is below AA — restrict it to non-essential labels only. Black-on-yellow (`#0F1111` on `#FF9900`) is the iconic CTA contrast and passes AA — do not switch to white text.
685
+ - **Reduce motion**: when `Settings.Global.ANIMATOR_DURATION_SCALE == 0f`, replace the cart-badge bump with a 100ms fade and skip the toast slide (show/hide instantly).
686
+ - **Dynamic color**: do **not** enable Material You `dynamicColorScheme()` — Amazon Yellow `#FF9900` and Deep Navy `#131921` are load-bearing brand assets; the yellow CTA must never recolor to the user's wallpaper. The flat yellow (no gradient) is also load-bearing.