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,646 @@
1
+ # Apple Maps (iOS) — Jetpack Compose Implementation Guide
2
+
3
+ Companion to [DESIGN.md](DESIGN.md) — the framework-neutral spec. Apple Maps is the canonical reference for native iOS map UI. This file ports that 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 (Apple Maps' cream-parchment cartography, sliding bottom search sheet, the pulsing blue location puck, blur-as-depth) while making everything idiomatic Android — Material 3 `BottomSheetScaffold` instead of `.presentationDetents`, a translucent `Surface` instead of `.regularMaterial` (Android has no live blur), `sp`/`dp` instead of `pt`. The cartography is rendered by Google's `Maps Compose` SDK with a custom JSON style approximating the cream/water/park palette.
6
+
7
+ Assumes Compose BOM `2024.09+`, Kotlin `2.0+`, `minSdk 24`, Material 3, `androidx.compose.material3:material3` with the bottom-sheet APIs, and `com.google.maps.android:maps-compose` `4.3+` for the map surface (style it via a `MapStyleOptions` JSON to the cream palette below).
8
+
9
+ ## 1. Color Tokens
10
+
11
+ ```kotlin
12
+ // ui/theme/MapsColors.kt
13
+ import androidx.compose.ui.graphics.Color
14
+
15
+ object MapsColors {
16
+ // Map Cartography — the brand
17
+ val Cream = Color(0xFFF6F1E6) // land surface
18
+ val Water = Color(0xFFB9D9EB) // oceans, rivers, lakes
19
+ val ParkGreen = Color(0xFFD6E5C9) // parks, green space
20
+ val RoadWhite = Color(0xFFFFFFFF) // major roads
21
+ val RoadOutline = Color(0xFFD5CFC0) // minor road strokes
22
+ val Highway = Color(0xFFFFD966) // highway fill
23
+ val Building2D = Color(0xFFEFE9DD)
24
+ val Building3D = Color(0xFFE6DFD0)
25
+ val MapLabel = Color(0xFF594F3F) // warm dark slate map text
26
+
27
+ // Brand
28
+ val Blue = Color(0xFF0A84FF) // directions polyline, puck, primary CTAs
29
+ val BluePressed = Color(0xFF0967D2)
30
+ val BlueDark = Color(0xFF409CFF) // brighter blue for dark mode
31
+ val Red = Color(0xFFFF3B30) // dropped pin (iOS system Red)
32
+
33
+ // Category Colors
34
+ val Food = Color(0xFFFF9500)
35
+ val Coffee = Color(0xFFA5694C)
36
+ val Drinks = Color(0xFF5AC8FA)
37
+ val Shopping = Color(0xFFFFCC00)
38
+ val Parking = Color(0xFFAF52DE)
39
+ val Hotel = Color(0xFF5856D6)
40
+ val Health = Color(0xFFFF2D55)
41
+ val EVGreen = Color(0xFF34C759)
42
+
43
+ // UI Chrome
44
+ val CardCanvas = Color(0xFFFFFFFF)
45
+ val SurfaceGray = Color(0xFFF2F2F7) // search field fill, chip backgrounds
46
+ val SurfaceGray2 = Color(0xFFE5E5EA) // pressed list rows
47
+ val Divider = Color(0xFFC7C7CC)
48
+
49
+ // Text (base colors; apply alpha for secondary tiers)
50
+ val Ink = Color(0xFF000000) // primary — pure black on cream
51
+ val Secondary = Color(0xFF3C3C43) // apply .copy(alpha = 0.60f)
52
+ // tertiary = Secondary @ 0.30f, placeholder = Secondary @ 0.18f
53
+
54
+ // Semantic
55
+ val Success = Color(0xFF34C759)
56
+ val Warning = Color(0xFFFF9500)
57
+ val Error = Color(0xFFFF3B30)
58
+
59
+ // Dark mode (warm dark land — the dark equivalent of cream paper)
60
+ val DarkMapLand = Color(0xFF2A2826)
61
+ val DarkMapWater = Color(0xFF1C2638)
62
+ val DarkMapPark = Color(0xFF2C3A2A)
63
+ val DarkCardSurf = Color(0xFF1C1C1E)
64
+ val DarkSurface2 = Color(0xFF2C2C2E)
65
+ val DarkDivider = Color(0xFF38383A)
66
+ }
67
+ ```
68
+
69
+ Apple Maps' chrome is a light frosted layer over warm cartography, so wire a Material 3 `lightColorScheme` (provide the dark variant for dark mode). `primary` is Maps Blue.
70
+
71
+ ```kotlin
72
+ // ui/theme/Theme.kt
73
+ import androidx.compose.material3.lightColorScheme
74
+ import androidx.compose.material3.darkColorScheme
75
+ import androidx.compose.material3.MaterialTheme
76
+ import androidx.compose.foundation.isSystemInDarkTheme
77
+
78
+ private val MapsLight = lightColorScheme(
79
+ primary = MapsColors.Blue,
80
+ onPrimary = Color.White,
81
+ background = MapsColors.CardCanvas,
82
+ onBackground = MapsColors.Ink, // pure black on cream
83
+ surface = MapsColors.CardCanvas,
84
+ onSurface = MapsColors.Ink,
85
+ surfaceVariant = MapsColors.SurfaceGray,
86
+ outline = MapsColors.Divider,
87
+ error = MapsColors.Error,
88
+ )
89
+
90
+ private val MapsDark = darkColorScheme(
91
+ primary = MapsColors.BlueDark, // brighter blue for dark legibility
92
+ onPrimary = Color.White,
93
+ background = MapsColors.DarkCardSurf,
94
+ onBackground = Color.White,
95
+ surface = MapsColors.DarkCardSurf,
96
+ onSurface = Color.White,
97
+ surfaceVariant = MapsColors.DarkSurface2,
98
+ outline = MapsColors.DarkDivider,
99
+ error = MapsColors.Error,
100
+ )
101
+
102
+ @Composable
103
+ fun MapsTheme(
104
+ darkTheme: Boolean = isSystemInDarkTheme(),
105
+ content: @Composable () -> Unit,
106
+ ) = MaterialTheme(
107
+ colorScheme = if (darkTheme) MapsDark else MapsLight,
108
+ typography = MapsTypography,
109
+ content = content,
110
+ )
111
+ ```
112
+
113
+ ## 2. Typography
114
+
115
+ Apple Maps uses SF Pro at the system stack with three optical variants. On Android, SF Pro is unavailable — use the system font (Roboto), the closest neutral grotesque, and reserve `Inter` (bundled in `res/font/`) if you want a tighter match to SF Pro's metrics. Tabular figures are mandatory on every distance/time/ETA — apply `FontFeatureSetting("tnum")`.
116
+
117
+ ```kotlin
118
+ // ui/theme/MapsType.kt
119
+ import androidx.compose.material3.Typography
120
+ import androidx.compose.ui.text.TextStyle
121
+ import androidx.compose.ui.text.font.FontFamily
122
+ import androidx.compose.ui.text.font.FontWeight
123
+ import androidx.compose.ui.unit.sp
124
+
125
+ // System Roboto stack; swap to FontFamily(Font(R.font.inter_…)) for a closer SF Pro match
126
+ private val SF = FontFamily.Default
127
+ private val Tnum = "tnum" // FontFeatureSetting via fontFeatureSettings on numeric styles
128
+
129
+ // Named ramp — mirrors DESIGN.md §3 exactly (pt → sp 1:1)
130
+ object MapsText {
131
+ val PlaceTitle = TextStyle(SF, fontWeight = FontWeight.Bold, fontSize = 28.sp, lineHeight = 32.sp, letterSpacing = (-0.4).sp)
132
+ val PlaceSubtitle = TextStyle(SF, fontWeight = FontWeight.Normal, fontSize = 15.sp, lineHeight = 20.sp)
133
+ val SearchHint = TextStyle(SF, fontWeight = FontWeight.Normal, fontSize = 17.sp, lineHeight = 22.sp)
134
+ val NavTitle = TextStyle(SF, fontWeight = FontWeight.SemiBold, fontSize = 17.sp, lineHeight = 20.sp, letterSpacing = (-0.2).sp)
135
+ val SectionHdr = TextStyle(SF, fontWeight = FontWeight.SemiBold, fontSize = 13.sp, lineHeight = 16.sp, letterSpacing = 0.4.sp) // UPPERCASE
136
+ val ListTitle = TextStyle(SF, fontWeight = FontWeight.Normal, fontSize = 17.sp, lineHeight = 22.sp)
137
+ val ListSubtitle = TextStyle(SF, fontWeight = FontWeight.Normal, fontSize = 13.sp, lineHeight = 16.sp)
138
+ val ETATime = TextStyle(SF, fontWeight = FontWeight.SemiBold, fontSize = 22.sp, lineHeight = 24.sp, letterSpacing = (-0.2).sp, fontFeatureSettings = Tnum)
139
+ val ETADuration = TextStyle(SF, fontWeight = FontWeight.Medium, fontSize = 17.sp, lineHeight = 20.sp, fontFeatureSettings = Tnum)
140
+ val StepTitle = TextStyle(SF, fontWeight = FontWeight.SemiBold, fontSize = 22.sp, lineHeight = 26.sp, letterSpacing = (-0.2).sp)
141
+ val StepDistance = TextStyle(SF, fontWeight = FontWeight.Medium, fontSize = 17.sp, lineHeight = 22.sp, fontFeatureSettings = Tnum)
142
+ val CategoryLabel = TextStyle(SF, fontWeight = FontWeight.Medium, fontSize = 14.sp, lineHeight = 14.sp)
143
+ val Button = TextStyle(SF, fontWeight = FontWeight.SemiBold, fontSize = 17.sp, lineHeight = 17.sp)
144
+ val CityLabel = TextStyle(SF, fontWeight = FontWeight.SemiBold, fontSize = 14.sp, lineHeight = 14.sp)
145
+ val Neighborhood = TextStyle(SF, fontWeight = FontWeight.Medium, fontSize = 12.sp, lineHeight = 12.sp)
146
+ val Street = TextStyle(SF, fontWeight = FontWeight.Normal, fontSize = 10.sp, lineHeight = 10.sp)
147
+ val TransitBadge = TextStyle(SF, fontWeight = FontWeight.Bold, fontSize = 12.sp, lineHeight = 12.sp)
148
+ val Caption = TextStyle(SF, fontWeight = FontWeight.Normal, fontSize = 12.sp, lineHeight = 16.sp)
149
+ }
150
+
151
+ // Map onto Material 3 slots
152
+ val MapsTypography = Typography(
153
+ headlineMedium = MapsText.PlaceTitle,
154
+ titleMedium = MapsText.NavTitle,
155
+ bodyLarge = MapsText.ListTitle,
156
+ bodyMedium = MapsText.PlaceSubtitle,
157
+ labelLarge = MapsText.Button,
158
+ labelSmall = MapsText.Caption,
159
+ )
160
+ ```
161
+
162
+ ## 3. Signature Components
163
+
164
+ ### Search Card content (sliding bottom sheet — see §4 for the sheet host)
165
+
166
+ iOS uses `.regularMaterial` on the card; Android has no live blur, so the sheet is a 90%-opaque `CardCanvas` surface. The grabber is a `BottomSheetScaffold` default, but the spec's exact 36×5dp / 30%-alpha pill is shown.
167
+
168
+ ```kotlin
169
+ import androidx.compose.foundation.background
170
+ import androidx.compose.foundation.layout.*
171
+ import androidx.compose.foundation.lazy.LazyRow
172
+ import androidx.compose.foundation.shape.RoundedCornerShape
173
+ import androidx.compose.material.icons.Icons
174
+ import androidx.compose.material.icons.filled.*
175
+ import androidx.compose.material3.Icon
176
+ import androidx.compose.material3.Text
177
+ import androidx.compose.runtime.*
178
+ import androidx.compose.ui.Alignment
179
+ import androidx.compose.ui.Modifier
180
+ import androidx.compose.ui.draw.clip
181
+ import androidx.compose.ui.graphics.Color
182
+ import androidx.compose.ui.text.input.TextFieldValue
183
+ import androidx.compose.ui.unit.dp
184
+
185
+ @Composable
186
+ fun SearchCardContent(expanded: Boolean) {
187
+ Column(Modifier.fillMaxWidth()) {
188
+ // Drag indicator (grabber) — exact spec
189
+ Box(
190
+ Modifier
191
+ .padding(top = 8.dp)
192
+ .align(Alignment.CenterHorizontally)
193
+ .size(width = 36.dp, height = 5.dp)
194
+ .clip(RoundedCornerShape(2.5.dp))
195
+ .background(MapsColors.Secondary.copy(alpha = 0.30f)),
196
+ )
197
+
198
+ // Search field
199
+ var query by remember { mutableStateOf(TextFieldValue("")) }
200
+ Row(
201
+ modifier = Modifier
202
+ .padding(horizontal = 16.dp, vertical = 12.dp)
203
+ .fillMaxWidth()
204
+ .height(44.dp)
205
+ .clip(RoundedCornerShape(10.dp))
206
+ .background(MapsColors.SurfaceGray)
207
+ .padding(horizontal = 16.dp),
208
+ verticalAlignment = Alignment.CenterVertically,
209
+ horizontalArrangement = Arrangement.spacedBy(12.dp),
210
+ ) {
211
+ Icon(Icons.Filled.Search, contentDescription = null,
212
+ tint = MapsColors.Secondary.copy(alpha = 0.60f), modifier = Modifier.size(18.dp))
213
+ Text(
214
+ if (query.text.isEmpty()) "Search Maps" else query.text,
215
+ style = MapsText.SearchHint,
216
+ color = if (query.text.isEmpty())
217
+ MapsColors.Secondary.copy(alpha = 0.30f) else MapsColors.Ink,
218
+ modifier = Modifier.weight(1f),
219
+ )
220
+ Icon(Icons.Filled.Mic, contentDescription = "Voice search",
221
+ tint = MapsColors.Secondary.copy(alpha = 0.60f), modifier = Modifier.size(16.dp))
222
+ }
223
+
224
+ // Category pills — only at medium+ detent
225
+ if (expanded) {
226
+ LazyRow(
227
+ contentPadding = PaddingValues(horizontal = 16.dp),
228
+ horizontalArrangement = Arrangement.spacedBy(12.dp),
229
+ modifier = Modifier.padding(top = 4.dp, bottom = 16.dp),
230
+ ) {
231
+ item { CategoryPill(Icons.Filled.Restaurant, "Food", MapsColors.Food) }
232
+ item { CategoryPill(Icons.Filled.LocalCafe, "Coffee", MapsColors.Coffee) }
233
+ item { CategoryPill(Icons.Filled.LocalBar, "Drinks", MapsColors.Drinks) }
234
+ item { CategoryPill(Icons.Filled.ShoppingBag, "Shopping", MapsColors.Shopping) }
235
+ item { CategoryPill(Icons.Filled.LocalParking, "Parking", MapsColors.Parking) }
236
+ item { CategoryPill(Icons.Filled.Tram, "Transit", MapsColors.Blue) }
237
+ }
238
+ }
239
+ }
240
+ }
241
+ ```
242
+
243
+ ### Category Pill
244
+
245
+ ```kotlin
246
+ import androidx.compose.animation.core.animateFloatAsState
247
+ import androidx.compose.animation.core.spring
248
+ import androidx.compose.foundation.clickable
249
+ import androidx.compose.foundation.interaction.MutableInteractionSource
250
+ import androidx.compose.foundation.interaction.collectIsPressedAsState
251
+ import androidx.compose.ui.draw.scale
252
+ import androidx.compose.ui.draw.shadow
253
+ import androidx.compose.ui.graphics.vector.ImageVector
254
+
255
+ @Composable
256
+ fun CategoryPill(icon: ImageVector, label: String, color: Color, onClick: () -> Unit = {}) {
257
+ val interaction = remember { MutableInteractionSource() }
258
+ val pressed by interaction.collectIsPressedAsState()
259
+ val scale by animateFloatAsState(
260
+ if (pressed) 0.96f else 1f,
261
+ spring(dampingRatio = 0.7f, stiffness = 600f),
262
+ label = "pillScale",
263
+ )
264
+ Column(
265
+ modifier = Modifier
266
+ .size(width = 64.dp, height = 88.dp)
267
+ .scale(scale)
268
+ .shadow(12.dp, RoundedCornerShape(14.dp), spotColor = Color.Black.copy(alpha = 0.12f))
269
+ .clip(RoundedCornerShape(14.dp))
270
+ .background(MapsColors.CardCanvas) // solid white — NOT translucent
271
+ .clickable(interaction, indication = null, onClick = onClick)
272
+ .padding(vertical = 16.dp, horizontal = 8.dp),
273
+ horizontalAlignment = Alignment.CenterHorizontally,
274
+ verticalArrangement = Arrangement.spacedBy(8.dp),
275
+ ) {
276
+ Icon(icon, contentDescription = label, tint = color, modifier = Modifier.size(28.dp))
277
+ Text(label, style = MapsText.CategoryLabel, color = MapsColors.Ink, maxLines = 1)
278
+ }
279
+ }
280
+ ```
281
+
282
+ ### Current-Location Puck (pulsing blue dot + directional cone)
283
+
284
+ The 2s infinite pulse is a `rememberInfiniteTransition`; the cone is a custom `Path` rotated to the heading.
285
+
286
+ ```kotlin
287
+ import androidx.compose.animation.core.*
288
+ import androidx.compose.foundation.Canvas
289
+ import androidx.compose.foundation.border
290
+ import androidx.compose.foundation.shape.CircleShape
291
+ import androidx.compose.ui.geometry.Offset
292
+ import androidx.compose.ui.graphics.Brush
293
+ import androidx.compose.ui.graphics.Path
294
+ import androidx.compose.ui.graphics.drawscope.rotate
295
+
296
+ @Composable
297
+ fun CurrentLocationPuck(heading: Float?, modifier: Modifier = Modifier) {
298
+ val t = rememberInfiniteTransition(label = "puck")
299
+ val pulseScale by t.animateFloat(
300
+ 1f, 1.6f,
301
+ infiniteRepeatable(tween(2000, easing = EaseOut), RepeatMode.Restart),
302
+ label = "pulseScale",
303
+ )
304
+ val pulseAlpha by t.animateFloat(
305
+ 0.30f, 0f,
306
+ infiniteRepeatable(tween(2000, easing = EaseOut), RepeatMode.Restart),
307
+ label = "pulseAlpha",
308
+ )
309
+
310
+ Box(modifier.size(80.dp), contentAlignment = Alignment.Center) {
311
+ // Pulsing outer ring (30dp scaling 1 → 1.6, alpha 0.30 → 0)
312
+ Box(
313
+ Modifier
314
+ .size(30.dp)
315
+ .scale(pulseScale)
316
+ .clip(CircleShape)
317
+ .background(MapsColors.Blue.copy(alpha = pulseAlpha)),
318
+ )
319
+ // Directional cone (90°, gradient, 60dp) when heading known
320
+ if (heading != null) {
321
+ Canvas(Modifier.size(80.dp)) {
322
+ rotate(heading, pivot = center) {
323
+ val cone = Path().apply {
324
+ moveTo(center.x, center.y)
325
+ lineTo(center.x - size.width * 0.4f, center.y - 60.dp.toPx())
326
+ lineTo(center.x + size.width * 0.4f, center.y - 60.dp.toPx())
327
+ close()
328
+ }
329
+ drawPath(
330
+ cone,
331
+ Brush.verticalGradient(
332
+ 0f to MapsColors.Blue.copy(alpha = 0.4f),
333
+ 1f to MapsColors.Blue.copy(alpha = 0f),
334
+ startY = center.y - 60.dp.toPx(),
335
+ endY = center.y,
336
+ ),
337
+ )
338
+ }
339
+ }
340
+ }
341
+ // Blue dot with 3dp white ring
342
+ Box(
343
+ Modifier
344
+ .size(22.dp)
345
+ .clip(CircleShape)
346
+ .background(MapsColors.Blue)
347
+ .border(3.dp, Color.White, CircleShape)
348
+ .shadow(4.dp, CircleShape, spotColor = Color.Black.copy(alpha = 0.2f)),
349
+ )
350
+ }
351
+ }
352
+ ```
353
+
354
+ ### Map Controls (floating top-right stack)
355
+
356
+ iOS uses `.regularMaterial`; Android has no live blur, so each button is a 92%-opaque white circular `Surface`.
357
+
358
+ ```kotlin
359
+ import androidx.compose.material3.Surface
360
+
361
+ @Composable
362
+ fun MapControls(
363
+ onLayers: () -> Unit,
364
+ onLocation: () -> Unit,
365
+ on3D: () -> Unit,
366
+ modifier: Modifier = Modifier,
367
+ ) {
368
+ Column(
369
+ modifier = modifier.padding(top = 16.dp, end = 16.dp),
370
+ verticalArrangement = Arrangement.spacedBy(8.dp),
371
+ ) {
372
+ MapControlButton(Icons.Filled.Layers, "Map layers", onLayers)
373
+ MapControlButton(Icons.Filled.MyLocation, "Center on my location", onLocation)
374
+ MapControlButton(Icons.Filled.ThreeDRotation, "Toggle 3D", on3D)
375
+ }
376
+ }
377
+
378
+ @Composable
379
+ private fun MapControlButton(icon: ImageVector, desc: String, onClick: () -> Unit) {
380
+ Surface(
381
+ color = MapsColors.CardCanvas.copy(alpha = 0.92f), // translucent — no live blur on Android
382
+ shape = CircleShape,
383
+ modifier = Modifier.size(44.dp),
384
+ onClick = onClick,
385
+ ) {
386
+ Box(contentAlignment = Alignment.Center) {
387
+ Icon(icon, contentDescription = desc, tint = MapsColors.Ink,
388
+ modifier = Modifier.size(18.dp))
389
+ }
390
+ }
391
+ }
392
+ ```
393
+
394
+ ### Place Card (detail view) — Action Pill row
395
+
396
+ ```kotlin
397
+ import androidx.compose.foundation.border
398
+
399
+ enum class PillStyle { Filled, Outlined }
400
+
401
+ @Composable
402
+ fun ActionPill(
403
+ label: String,
404
+ icon: ImageVector,
405
+ style: PillStyle,
406
+ onClick: () -> Unit,
407
+ ) {
408
+ val haptics = androidx.compose.ui.platform.LocalHapticFeedback.current
409
+ val filled = style == PillStyle.Filled
410
+ Row(
411
+ modifier = Modifier
412
+ .heightIn(min = 44.dp)
413
+ .clip(CircleShape) // 22dp full pill at 44dp height
414
+ .then(
415
+ if (filled) Modifier.background(MapsColors.Blue)
416
+ else Modifier
417
+ .background(MapsColors.CardCanvas)
418
+ .border(1.dp, MapsColors.Blue, CircleShape)
419
+ )
420
+ .clickable {
421
+ haptics.performHapticFeedback(
422
+ androidx.compose.ui.hapticfeedback.HapticFeedbackType.LongPress) // ~iOS .medium
423
+ onClick()
424
+ }
425
+ .padding(horizontal = 20.dp, vertical = 12.dp),
426
+ verticalAlignment = Alignment.CenterVertically,
427
+ horizontalArrangement = Arrangement.spacedBy(8.dp),
428
+ ) {
429
+ Icon(icon, contentDescription = null,
430
+ tint = if (filled) Color.White else MapsColors.Blue, modifier = Modifier.size(14.dp))
431
+ Text(label, style = MapsText.Button, color = if (filled) Color.White else MapsColors.Blue)
432
+ }
433
+ }
434
+
435
+ @Composable
436
+ fun PlaceCardHeader(title: String, subtitle: String, onClose: () -> Unit) {
437
+ Row(
438
+ Modifier.fillMaxWidth().padding(horizontal = 20.dp, vertical = 16.dp),
439
+ verticalAlignment = Alignment.Top,
440
+ ) {
441
+ Column(Modifier.weight(1f)) {
442
+ Text(title, style = MapsText.PlaceTitle, color = MapsColors.Ink)
443
+ Text(subtitle, style = MapsText.PlaceSubtitle,
444
+ color = MapsColors.Secondary.copy(alpha = 0.60f))
445
+ }
446
+ Surface(
447
+ color = MapsColors.SurfaceGray.copy(alpha = 0.92f),
448
+ shape = CircleShape,
449
+ modifier = Modifier.size(30.dp),
450
+ onClick = onClose,
451
+ ) {
452
+ Box(contentAlignment = Alignment.Center) {
453
+ Icon(Icons.Filled.Close, contentDescription = "Close",
454
+ tint = MapsColors.Secondary.copy(alpha = 0.80f),
455
+ modifier = Modifier.size(14.dp))
456
+ }
457
+ }
458
+ }
459
+ }
460
+ ```
461
+
462
+ ### Direction Step Card + ETA Bar
463
+
464
+ ```kotlin
465
+ @Composable
466
+ fun StepCard(arrow: ImageVector, arrowRotation: Float, title: String, distance: String) {
467
+ Surface(color = MapsColors.CardCanvas.copy(alpha = 0.92f), tonalElevation = 0.dp) {
468
+ Row(
469
+ Modifier.fillMaxWidth().height(96.dp).padding(horizontal = 20.dp),
470
+ verticalAlignment = Alignment.CenterVertically,
471
+ horizontalArrangement = Arrangement.spacedBy(16.dp),
472
+ ) {
473
+ Icon(
474
+ arrow, contentDescription = null, tint = MapsColors.Blue,
475
+ modifier = Modifier
476
+ .size(56.dp)
477
+ .androidx.compose.ui.draw.rotate(arrowRotation),
478
+ )
479
+ Column(Modifier.weight(1f)) {
480
+ Text(title, style = MapsText.StepTitle, color = MapsColors.Ink, maxLines = 2)
481
+ Text(distance, style = MapsText.StepDistance,
482
+ color = MapsColors.Secondary.copy(alpha = 0.60f))
483
+ }
484
+ }
485
+ }
486
+ }
487
+
488
+ @Composable
489
+ fun ETABar(duration: String, arrival: String, onEnd: () -> Unit) {
490
+ Surface(color = MapsColors.CardCanvas.copy(alpha = 0.92f), tonalElevation = 0.dp) {
491
+ Row(
492
+ Modifier.fillMaxWidth().height(80.dp).padding(horizontal = 20.dp),
493
+ verticalAlignment = Alignment.CenterVertically,
494
+ ) {
495
+ Column(Modifier.weight(1f)) {
496
+ Text(duration, style = MapsText.ETATime, color = MapsColors.Ink)
497
+ Text(arrival, style = MapsText.ETADuration,
498
+ color = MapsColors.Secondary.copy(alpha = 0.60f))
499
+ }
500
+ Row(
501
+ Modifier
502
+ .clip(CircleShape)
503
+ .background(MapsColors.CardCanvas)
504
+ .border(1.dp, MapsColors.Error, CircleShape)
505
+ .clickable(onClick = onEnd)
506
+ .padding(horizontal = 20.dp, vertical = 12.dp),
507
+ ) {
508
+ Text("End", style = MapsText.Button, color = MapsColors.Error)
509
+ }
510
+ }
511
+ }
512
+ }
513
+ ```
514
+
515
+ ### Transit Line Badge
516
+
517
+ ```kotlin
518
+ @Composable
519
+ fun TransitBadge(label: String, color: Color) {
520
+ Box(
521
+ Modifier
522
+ .defaultMinSize(minWidth = 24.dp, minHeight = 24.dp)
523
+ .clip(RoundedCornerShape(4.dp))
524
+ .background(color) // agency-accurate color, never recolored
525
+ .padding(horizontal = 6.dp),
526
+ contentAlignment = Alignment.Center,
527
+ ) {
528
+ Text(label, style = MapsText.TransitBadge, color = Color.White)
529
+ }
530
+ }
531
+ ```
532
+
533
+ ## 4. The Sliding Bottom Search Sheet (signature interaction)
534
+
535
+ Apple Maps' defining move is the translucent search card with three detents. iOS uses `.presentationDetents([.height(88), .medium, .large])`; the Compose equivalent is Material 3 `BottomSheetScaffold` with a custom `SheetState`. The sheet stays partially expanded (peek = 88.dp) so the user can still pan the map beneath it — that's the Apple Maps "background interaction" behavior, native to `BottomSheetScaffold`.
536
+
537
+ ```kotlin
538
+ import androidx.compose.material3.BottomSheetScaffold
539
+ import androidx.compose.material3.SheetValue
540
+ import androidx.compose.material3.rememberBottomSheetScaffoldState
541
+ import androidx.compose.material3.rememberStandardBottomSheetState
542
+
543
+ @OptIn(androidx.compose.material3.ExperimentalMaterial3Api::class)
544
+ @Composable
545
+ fun MapScreen() {
546
+ val sheetState = rememberStandardBottomSheetState(
547
+ initialValue = SheetValue.PartiallyExpanded, // ≈ iOS "small" detent
548
+ skipHiddenState = true,
549
+ )
550
+ val scaffoldState = rememberBottomSheetScaffoldState(bottomSheetState = sheetState)
551
+ val expanded = sheetState.currentValue == SheetValue.Expanded
552
+
553
+ BottomSheetScaffold(
554
+ scaffoldState = scaffoldState,
555
+ sheetPeekHeight = 88.dp, // small detent
556
+ sheetContainerColor = MapsColors.CardCanvas.copy(alpha = 0.90f), // translucent (no live blur)
557
+ sheetShape = RoundedCornerShape(topStart = 10.dp, topEnd = 10.dp),
558
+ sheetContent = { SearchCardContent(expanded = expanded) },
559
+ ) {
560
+ Box(Modifier.fillMaxSize()) {
561
+ // GoogleMap(...) styled with MapStyleOptions JSON → cream palette goes here
562
+ MapControls(
563
+ onLayers = {}, onLocation = {}, on3D = {},
564
+ modifier = Modifier.align(Alignment.TopEnd),
565
+ )
566
+ }
567
+ }
568
+ }
569
+ ```
570
+
571
+ For a true 3-stop detent (88dp / ~50% / full), wrap a custom `AnchoredDraggable` (Compose Foundation 1.6+) with three anchors, or gate `SearchCardContent`'s category row on a `derivedStateOf` height threshold as shown. Animate detent changes with `spring(dampingRatio = 0.85f, stiffness = 380f)` to match the spec's "350ms physical paper" feel.
572
+
573
+ ## 5. Navigation
574
+
575
+ Apple Maps has **no bottom tab bar** — the entire experience is the map plus the sliding search sheet and a contextual place card. Do **not** add a Material `NavigationBar`. Navigation between Map → Place Card → Directions is modeled as bottom-sheet content swaps inside the single `BottomSheetScaffold` (use `AnimatedContent` to cross-fade Search ↔ Place ↔ Directions content). Floating chrome (map controls, step card, ETA bar) overlays the map with translucent `Surface`s — Android has no live blur, so a 92%-opaque surface stands in for `.regularMaterial`.
576
+
577
+ ## 6. Motion
578
+
579
+ | Moment | Compose recipe |
580
+ |--------|----------------|
581
+ | Search card detent transition | `spring(dampingRatio = 0.85f, stiffness = 380f)` ≈ 350ms physical |
582
+ | Pin drop (long-press) | `Animatable` translationY + `spring(dampingRatio = 0.65f)` ~400ms bounce; `HapticFeedbackType.LongPress` |
583
+ | Current-location lock | camera animate 600ms `EaseOut`, then puck `Animatable` 1 → 1.2 → 1 pulse |
584
+ | Category pill tap | `animateFloatAsState` 1 → 0.96 → 1 `spring(dampingRatio = 0.7f)` |
585
+ | Direction step transition | `AnimatedContent` 300ms cross-fade; arrow `animateFloatAsState` rotation 250ms |
586
+ | Map style picker | `AnimatedVisibility` expand from the layer button (no native shared-element morph required) |
587
+ | Look Around launch | 600ms `Crossfade` from map to 360° view |
588
+ | Current-location pulse | `rememberInfiniteTransition` 2000ms: scale 1 → 1.6, alpha 0.30 → 0, infinite |
589
+
590
+ ```kotlin
591
+ // Pin drop — exact 400ms ease-out bounce
592
+ @Composable
593
+ fun rememberPinDrop(dropped: Boolean): Float {
594
+ val offsetY = remember { Animatable(-120f) }
595
+ LaunchedEffect(dropped) {
596
+ if (dropped) offsetY.animateTo(
597
+ 0f,
598
+ spring(dampingRatio = 0.65f, stiffness = 350f),
599
+ )
600
+ }
601
+ return offsetY.value
602
+ }
603
+ ```
604
+
605
+ Haptics: prefer `LocalHapticFeedback`. For richer control use `LocalView.current.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK)` (API 30+) — map `.medium` (pin drop, Directions tap) to `VibrationEffect.createOneShot(15, DEFAULT_AMPLITUDE)`, `.selection` (map-style picker) to a short tick, and `.success` (arrived at destination) to a double-buzz `VibrationEffect.createWaveform(longArrayOf(0, 40, 60, 40), -1)`, mirroring iOS `.notificationOccurred(.success)`.
606
+
607
+ ## 7. Icons
608
+
609
+ Apple Maps uses SF Symbols; the closest first-party set is `androidx.compose.material:material-icons-extended`. For exact parity (the directional cone, the agency transit badges, the dropped-pin teardrop) ship custom vector drawables and load via `ImageVector.vectorResource(R.drawable.…)` — the cone is drawn with `Canvas` (see §3).
610
+
611
+ | Component | SF Symbol (iOS) | Material Icon (Compose) |
612
+ |-----------|-----------------|--------------------------|
613
+ | Search | `magnifyingglass` | `Icons.Filled.Search` |
614
+ | Microphone | `mic.fill` | `Icons.Filled.Mic` |
615
+ | Close | `xmark` | `Icons.Filled.Close` |
616
+ | Layer picker | `square.3.layers.3d` | `Icons.Filled.Layers` |
617
+ | Current location (locked) | `location.fill` | `Icons.Filled.MyLocation` |
618
+ | Current location (unlocked) | `location` | `Icons.Filled.LocationSearching` |
619
+ | 3D toggle | `view.3d` | `Icons.Filled.ThreeDRotation` |
620
+ | Compass | `safari` | `Icons.Filled.Explore` |
621
+ | Dropped pin | `mappin.and.ellipse` | `Icons.Filled.LocationOn` (or custom teardrop drawable, Maps Red) |
622
+ | Directions | `arrow.triangle.turn.up.right.diamond.fill` | `Icons.AutoMirrored.Filled.Directions` |
623
+ | Call | `phone.fill` | `Icons.Filled.Call` |
624
+ | Share | `square.and.arrow.up` | `Icons.Filled.IosShare` |
625
+ | Save | `heart` / `heart.fill` | `Icons.Outlined.FavoriteBorder` / `Icons.Filled.Favorite` |
626
+ | Look Around | `binoculars.fill` | `Icons.Filled.Visibility` |
627
+ | Food category | `fork.knife` | `Icons.Filled.Restaurant` |
628
+ | Coffee category | `cup.and.saucer.fill` | `Icons.Filled.LocalCafe` |
629
+ | Drinks category | `wineglass.fill` | `Icons.Filled.LocalBar` |
630
+ | Shopping | `bag.fill` | `Icons.Filled.ShoppingBag` |
631
+ | Parking | `parkingsign.circle.fill` | `Icons.Filled.LocalParking` |
632
+ | Transit | `tram.fill` | `Icons.Filled.Tram` |
633
+ | Direction arrow (turn) | `arrow.turn.up.right` / `.left` | `Icons.AutoMirrored.Filled.TurnRight` / `TurnLeft` |
634
+ | Phone (place row) | `phone.fill` | `Icons.Filled.Call` |
635
+ | Globe (website row) | `globe` | `Icons.Filled.Language` |
636
+
637
+ ## 8. Minimum SDK & Accessibility Notes
638
+
639
+ - **minSdk 24** (Compose floor is 21; `BottomSheetScaffold` + `Canvas` cone + Maps Compose are comfortable at 24). `compileSdk 34+`, Compose BOM `2024.09+`, Kotlin `2.0+`.
640
+ - **Edge-to-edge**: call `enableEdgeToEdge()` in the `Activity`. The map is full-bleed under the status bar; request dark-content (dark icons) over the cream canvas, light-content in dark mode. Apply `Scaffold`/`WindowInsets.systemBars` padding so the search sheet's small detent clears the gesture nav and map controls sit 16.dp below the status bar / Dynamic-Island analog (the display cutout).
641
+ - **Font scaling**: `sp` honors the user's font scale — keep it on the place-card title, list rows, button labels, and body. Pin layout/zoom-sensitive text (map labels, ETA numbers, distance/time tabular figures, 14sp category labels) by deriving size from `dp` or `CompositionLocalProvider(LocalDensity provides Density(density, fontScale = 1f))`. The place-card title scales but clamp at ~36sp. Keep `fontFeatureSettings = "tnum"` on every numeric style for column alignment.
642
+ - **TalkBack**: the place card reads as one node — `Modifier.semantics(mergeDescendants = true) { contentDescription = "$title, $subtitle, ${if (isOpen) "Open" else "Closed"}, $closingTime" }`; the current-location puck announces `"Your current location"`; the dropped pin exposes its reverse-geocoded address. Mark each map control button with its own `contentDescription` ("Center on my location", etc.).
643
+ - **Touch targets**: Material guidance is 48.dp minimum. Map control buttons and action pills are 44.dp — bump to 48.dp via padding. The category pill is 64×88dp (well clear). The pin tap target needs a 48.dp hit box centered on the teardrop tip even though the glyph is smaller.
644
+ - **Contrast**: pure black on cream `#F6F1E6` passes WCAG AAA. `#3C3C43`@60% on cream passes AA only at ≥18sp Bold or ≥14sp Medium — do not use it for the 13sp list subtitle as primary information; it's acceptable as supporting metadata only.
645
+ - **Reduce motion**: when `Settings.Global.ANIMATOR_DURATION_SCALE == 0f`, skip the 2s puck pulse (render a static blue dot) and the pin-drop bounce (place the pin instantly).
646
+ - **Dynamic color**: do **not** enable Material You `dynamicColorScheme()` — the cream `#F6F1E6` cartography, Maps Blue `#0A84FF` polyline/puck, and Maps Red `#FF3B30` pin are signature, intentionally system-Apple (not system-Android) colors and must not recolor to the user's wallpaper.