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,675 @@
1
+ # Apple Notes (iOS) — Jetpack Compose Implementation Guide
2
+
3
+ Companion to [DESIGN.md](DESIGN.md) — the framework-neutral spec. This file ports Apple Notes's paper-soft aesthetic to **Android with Jetpack Compose (Material 3)**: a color token object, a `Typography` set, paste-ready `@Composable`s, the iconic yellow folder glyph drawn with `Canvas`, 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 Notes' warm cream-paper canvas, the iconic 3D yellow tab-folder glyph, single Notes-Orange action color, the calmest body type in mobile) while making everything idiomatic Android — hierarchical `NavHost` navigation instead of `NavigationStack`, a `Canvas` `Path` for the folder glyph instead of SwiftUI `Canvas`, a translucent `Surface` instead of `.regularMaterial` (Android has no live blur), `sp`/`dp` instead of `pt`. Notes supports light and dark, so we wire a full Material 3 light + dark scheme; the cream canvas is deliberately *warmer than white*.
6
+
7
+ Assumes Compose BOM `2024.09+`, Kotlin `2.0+`, `minSdk 24`, Material 3. No remote-image or color-extraction libraries are needed — Notes has no photography and no dynamic palette; the only "graphic" is the hand-drawn folder glyph.
8
+
9
+ ## 1. Color Tokens
10
+
11
+ ```kotlin
12
+ // ui/theme/NotesColors.kt
13
+ import androidx.compose.ui.graphics.Color
14
+
15
+ object NotesColors {
16
+ // Canvas & Surfaces (Light — warm cream paper)
17
+ val Cream = Color(0xFFFFFBED) // primary canvas — warmer than white by ~3%
18
+ val CreamSurf1 = Color(0xFFFAF6E3) // search field, focused section
19
+ val CreamSurf2 = Color(0xFFF2EDD6) // pressed rows, chip fills
20
+ val DividerLight = Color(0xFFEDEAD8) // warm hairline dividers
21
+
22
+ // Canvas & Surfaces (Dark)
23
+ val DarkPaper = Color(0xFF1A1A1A) // true dark gray — preserves paper feel, NOT pure black
24
+ val DarkSurf1 = Color(0xFF262626)
25
+ val DarkSurf2 = Color(0xFF333333)
26
+ val DarkDivider = Color(0xFF2A2A2A)
27
+
28
+ // Brand
29
+ val Orange = Color(0xFFF09A38) // FAB, folder stroke, cursor, link, selection accent
30
+ val OrangePressed = Color(0xFFD87E1F)
31
+ val OrangeTint = Color(0xFFFFF1DD) // selected-row / chip background
32
+ val FolderYellow = Color(0xFFF5D773) // the iconic folder glyph fill
33
+ val FolderHighlight = Color(0xFFFAE8A0) // folder top-edge highlight (depth)
34
+ val HighlightYellow = Color(0xFFFFEB78) // text-selection highlight ONLY
35
+
36
+ // Text
37
+ val Ink = Color(0xFF1C1C1E) // primary — titles, body, folder names
38
+ val Slate = Color(0xFF8E8E93) // secondary — preview, date, metadata
39
+ val Mute = Color(0xFFC7C7CC) // tertiary — placeholder, disabled
40
+ val SoftWhite = Color(0xFFF2F2F2) // primary text on dark
41
+
42
+ // Semantic
43
+ val Success = Color(0xFF34C759)
44
+ val Warning = Color(0xFFFFCC00)
45
+ val Error = Color(0xFFFF3B30)
46
+ val InfoBlue = Color(0xFF0A84FF)
47
+ val LockYellow = Color(0xFFFFCC00)
48
+
49
+ // Highlight palette (text-selection colors inside the note body)
50
+ val HighlightGreen = Color(0xFFB3E47B)
51
+ val HighlightBlue = Color(0xFFA0D8FF)
52
+ val HighlightPink = Color(0xFFFFB3DB)
53
+ val HighlightPurple = Color(0xFFD4B3FF)
54
+ }
55
+ ```
56
+
57
+ Notes supports light and dark equally — wire both Material 3 schemes. The cream/dark-paper canvas and the single Orange accent carry the brand; the folder yellow is glyph-only and never a scheme role.
58
+
59
+ ```kotlin
60
+ // ui/theme/Theme.kt
61
+ import androidx.compose.material3.lightColorScheme
62
+ import androidx.compose.material3.darkColorScheme
63
+ import androidx.compose.material3.MaterialTheme
64
+ import androidx.compose.foundation.isSystemInDarkTheme
65
+
66
+ private val NotesLight = lightColorScheme(
67
+ primary = NotesColors.Orange,
68
+ onPrimary = Color.White,
69
+ background = NotesColors.Cream, // warm cream, never #FFFFFF
70
+ onBackground = NotesColors.Ink,
71
+ surface = NotesColors.Cream,
72
+ onSurface = NotesColors.Ink,
73
+ surfaceVariant = NotesColors.CreamSurf1,
74
+ outline = NotesColors.DividerLight,
75
+ error = NotesColors.Error,
76
+ )
77
+
78
+ private val NotesDark = darkColorScheme(
79
+ primary = NotesColors.Orange, // unchanged across light/dark
80
+ onPrimary = Color.White,
81
+ background = NotesColors.DarkPaper, // true dark gray, not pure black
82
+ onBackground = NotesColors.SoftWhite,
83
+ surface = NotesColors.DarkPaper,
84
+ onSurface = NotesColors.SoftWhite,
85
+ surfaceVariant = NotesColors.DarkSurf1,
86
+ outline = NotesColors.DarkDivider,
87
+ error = NotesColors.Error,
88
+ )
89
+
90
+ @Composable
91
+ fun NotesTheme(
92
+ darkTheme: Boolean = isSystemInDarkTheme(),
93
+ content: @Composable () -> Unit,
94
+ ) = MaterialTheme(
95
+ colorScheme = if (darkTheme) NotesDark else NotesLight,
96
+ typography = NotesTypography,
97
+ content = content,
98
+ )
99
+ ```
100
+
101
+ ## 2. Typography
102
+
103
+ Apple Notes is 100% SF Pro — including the rare SF Pro Display **Heavy (800)** on the large "Notes" nav title and the calm SF Pro Text 17pt/1.5 body. SF Pro is unavailable on Android — use the system font (Roboto), reserving a bundled `Inter` for a tighter metric match. The note body's generous 1.5 line-height (25sp at 17sp) is the centerpiece — preserve it exactly. Honor font scaling everywhere (Notes skews older-demographic).
104
+
105
+ ```kotlin
106
+ // ui/theme/NotesType.kt
107
+ import androidx.compose.material3.Typography
108
+ import androidx.compose.ui.text.TextStyle
109
+ import androidx.compose.ui.text.font.FontFamily
110
+ import androidx.compose.ui.text.font.FontWeight
111
+ import androidx.compose.ui.unit.sp
112
+
113
+ private val SF = FontFamily.Default // swap to FontFamily(Font(R.font.inter_…))
114
+ private val SFMono = FontFamily.Monospace // code-formatted text inside notes
115
+
116
+ // Named ramp — mirrors DESIGN.md §3 exactly (pt → sp 1:1)
117
+ object NotesText {
118
+ val LargeNav = TextStyle(SF, fontWeight = FontWeight.Black, fontSize = 34.sp, lineHeight = 37.sp, letterSpacing = (-0.4).sp) // Heavy (800)
119
+ val FolderSec = TextStyle(SF, fontWeight = FontWeight.Bold, fontSize = 22.sp, lineHeight = 26.sp, letterSpacing = (-0.3).sp)
120
+ val RowTitle = TextStyle(SF, fontWeight = FontWeight.SemiBold, fontSize = 16.sp, lineHeight = 21.sp, letterSpacing = (-0.1).sp)
121
+ val RowPreview = TextStyle(SF, fontWeight = FontWeight.Normal, fontSize = 14.sp, lineHeight = 19.sp)
122
+ val RowDate = TextStyle(SF, fontWeight = FontWeight.Normal, fontSize = 12.sp, lineHeight = 16.sp)
123
+ val FolderRow = TextStyle(SF, fontWeight = FontWeight.Normal, fontSize = 17.sp, lineHeight = 22.sp)
124
+ val BodyTitle = TextStyle(SF, fontWeight = FontWeight.SemiBold, fontSize = 20.sp, lineHeight = 26.sp, letterSpacing = (-0.2).sp)
125
+ val BodyHeading = TextStyle(SF, fontWeight = FontWeight.SemiBold, fontSize = 17.sp, lineHeight = 24.sp)
126
+ val Body = TextStyle(SF, fontWeight = FontWeight.Normal, fontSize = 17.sp, lineHeight = 25.sp) // 1.5× — Apple's calmest body
127
+ val BodyMono = TextStyle(SFMono, fontWeight = FontWeight.Normal, fontSize = 15.sp, lineHeight = 22.sp)
128
+ val TagChip = TextStyle(SF, fontWeight = FontWeight.Medium, fontSize = 14.sp, lineHeight = 14.sp)
129
+ val Toolbar = TextStyle(SF, fontWeight = FontWeight.Medium, fontSize = 11.sp, lineHeight = 11.sp, letterSpacing = 0.1.sp)
130
+ val Button = TextStyle(SF, fontWeight = FontWeight.SemiBold, fontSize = 17.sp, lineHeight = 17.sp)
131
+ val SearchHint = TextStyle(SF, fontWeight = FontWeight.Normal, fontSize = 17.sp, lineHeight = 17.sp)
132
+ }
133
+
134
+ // Map onto Material 3 slots so stock components inherit the brand
135
+ val NotesTypography = Typography(
136
+ headlineLarge = NotesText.LargeNav,
137
+ headlineSmall = NotesText.FolderSec,
138
+ titleMedium = NotesText.RowTitle,
139
+ bodyLarge = NotesText.Body,
140
+ bodyMedium = NotesText.RowPreview,
141
+ labelLarge = NotesText.Button,
142
+ labelSmall = NotesText.Toolbar,
143
+ )
144
+ ```
145
+
146
+ ## 3. Signature Components
147
+
148
+ ### Yellow Folder Glyph (the iconic mark)
149
+
150
+ Apple's cross-app yellow tab-folder, drawn with a Compose `Canvas` `Path` — fill `#F5D773`, 1dp `#F09A38` stroke, a 0.5dp warm top-edge highlight, and a subtle 2° forward tilt for the hand-painted depth illusion.
151
+
152
+ ```kotlin
153
+ import androidx.compose.foundation.Canvas
154
+ import androidx.compose.foundation.layout.size
155
+ import androidx.compose.runtime.Composable
156
+ import androidx.compose.ui.Modifier
157
+ import androidx.compose.ui.draw.rotate
158
+ import androidx.compose.ui.geometry.Offset
159
+ import androidx.compose.ui.graphics.Path
160
+ import androidx.compose.ui.graphics.drawscope.Stroke
161
+ import androidx.compose.ui.unit.Dp
162
+ import androidx.compose.ui.unit.dp
163
+
164
+ @Composable
165
+ fun FolderGlyph(modifier: Modifier = Modifier, size: Dp = 24.dp) {
166
+ Canvas(
167
+ modifier
168
+ .size(width = size, height = size * 0.78f)
169
+ .rotate(-2f), // subtle forward tilt — physical-folder feel
170
+ ) {
171
+ val w = this.size.width
172
+ val h = this.size.height
173
+ val tabH = h * 0.18f
174
+ val tabW = w * 0.45f
175
+ val top = tabH
176
+
177
+ val folder = Path().apply {
178
+ moveTo(0f, top)
179
+ lineTo(0f, h)
180
+ lineTo(w, h)
181
+ lineTo(w, top - 2f)
182
+ lineTo(tabW + 6f, top - 2f)
183
+ cubicTo(tabW + 4f, 0f, tabW + 2f, 0f, tabW, 0f)
184
+ lineTo(4f, 0f)
185
+ cubicTo(2f, 0f, 0f, 2f, 0f, 4f)
186
+ close()
187
+ }
188
+ drawPath(folder, color = NotesColors.FolderYellow)
189
+ drawPath(folder, color = NotesColors.Orange, style = Stroke(width = 1.dp.toPx()))
190
+ // Top-edge highlight for depth
191
+ drawLine(
192
+ color = NotesColors.FolderHighlight,
193
+ start = Offset(6f, top + 1f),
194
+ end = Offset(w - 6f, top + 1f),
195
+ strokeWidth = 0.5.dp.toPx(),
196
+ )
197
+ }
198
+ }
199
+ ```
200
+
201
+ ### Note Row (the three-line centerpiece)
202
+
203
+ ```kotlin
204
+ import androidx.compose.foundation.background
205
+ import androidx.compose.foundation.clickable
206
+ import androidx.compose.foundation.interaction.MutableInteractionSource
207
+ import androidx.compose.foundation.interaction.collectIsPressedAsState
208
+ import androidx.compose.foundation.layout.*
209
+ import androidx.compose.material.icons.Icons
210
+ import androidx.compose.material.icons.filled.PushPin
211
+ import androidx.compose.material3.Icon
212
+ import androidx.compose.material3.Text
213
+ import androidx.compose.runtime.*
214
+ import androidx.compose.ui.Alignment
215
+ import androidx.compose.ui.draw.scale
216
+ import androidx.compose.ui.text.style.TextOverflow
217
+
218
+ @Composable
219
+ fun NoteRow(
220
+ title: String,
221
+ preview: String,
222
+ date: String,
223
+ isPinned: Boolean,
224
+ onClick: () -> Unit,
225
+ modifier: Modifier = Modifier,
226
+ ) {
227
+ val interaction = remember { MutableInteractionSource() }
228
+ val pressed by interaction.collectIsPressedAsState()
229
+ val scale by androidx.compose.animation.core.animateFloatAsState(
230
+ if (pressed) 0.99f else 1f, label = "rowScale")
231
+ val haptics = androidx.compose.ui.platform.LocalHapticFeedback.current
232
+
233
+ Column(
234
+ modifier = modifier
235
+ .fillMaxWidth()
236
+ .scale(scale)
237
+ .background(if (isPinned) NotesColors.CreamSurf1 else NotesColors.Cream)
238
+ .clickable(interaction, indication = null) {
239
+ haptics.performHapticFeedback(
240
+ androidx.compose.ui.hapticfeedback.HapticFeedbackType.TextHandleMove) // ~iOS .selection
241
+ onClick()
242
+ },
243
+ ) {
244
+ Column(Modifier.padding(start = 16.dp, end = 16.dp, top = 16.dp).heightIn(min = 68.dp)) {
245
+ Row(verticalAlignment = Alignment.CenterVertically,
246
+ horizontalArrangement = Arrangement.spacedBy(6.dp)) {
247
+ if (isPinned) {
248
+ Icon(Icons.Filled.PushPin, contentDescription = "Pinned",
249
+ tint = NotesColors.Orange, modifier = Modifier.size(11.dp))
250
+ }
251
+ Text(title, style = NotesText.RowTitle, color = NotesColors.Ink,
252
+ maxLines = 1, overflow = TextOverflow.Ellipsis)
253
+ }
254
+ Text(preview, style = NotesText.RowPreview, color = NotesColors.Slate,
255
+ maxLines = 1, overflow = TextOverflow.Ellipsis,
256
+ modifier = Modifier.padding(top = 4.dp))
257
+ Text(date, style = NotesText.RowDate, color = NotesColors.Slate,
258
+ modifier = Modifier.padding(top = 2.dp))
259
+ }
260
+ Box(Modifier.fillMaxWidth().height(0.5.dp).background(NotesColors.DividerLight))
261
+ }
262
+ }
263
+ ```
264
+
265
+ Swipe actions (Pin / Add to Folder / Delete) use Material 3 `SwipeToDismissBox` with a custom background lane: Pin = `NotesColors.Orange`, Add to Folder = `Slate`, Delete = `Error`.
266
+
267
+ ### Folder Row
268
+
269
+ ```kotlin
270
+ import androidx.compose.material.icons.automirrored.filled.KeyboardArrowRight
271
+ import androidx.compose.material.icons.filled.AutoAwesome
272
+
273
+ @Composable
274
+ fun FolderRow(
275
+ name: String,
276
+ count: Int,
277
+ isSmart: Boolean = false,
278
+ onClick: () -> Unit,
279
+ modifier: Modifier = Modifier,
280
+ ) {
281
+ Row(
282
+ modifier = modifier
283
+ .fillMaxWidth()
284
+ .height(44.dp)
285
+ .background(NotesColors.Cream)
286
+ .clickable(onClick = onClick)
287
+ .padding(horizontal = 16.dp),
288
+ verticalAlignment = Alignment.CenterVertically,
289
+ horizontalArrangement = Arrangement.spacedBy(12.dp),
290
+ ) {
291
+ if (isSmart) {
292
+ Icon(Icons.Filled.AutoAwesome, contentDescription = null,
293
+ tint = NotesColors.Orange, modifier = Modifier.size(14.dp))
294
+ }
295
+ FolderGlyph(size = 24.dp)
296
+ Text(name, style = NotesText.FolderRow, color = NotesColors.Ink,
297
+ modifier = Modifier.weight(1f))
298
+ Text("$count", style = NotesText.FolderRow, color = NotesColors.Slate)
299
+ Icon(Icons.AutoMirrored.Filled.KeyboardArrowRight, contentDescription = null,
300
+ tint = NotesColors.Slate, modifier = Modifier.size(16.dp))
301
+ }
302
+ }
303
+ ```
304
+
305
+ ### New Note FAB (orange-tinted shadow)
306
+
307
+ The orange-tinted glow (`rgba(240,154,56,0.30) 0 4px 12px`) is non-negotiable brand — set the `Modifier.shadow` `spotColor`/`ambientColor` to Notes Orange, never neutral.
308
+
309
+ ```kotlin
310
+ import androidx.compose.animation.core.Animatable
311
+ import androidx.compose.foundation.shape.CircleShape
312
+ import androidx.compose.material.icons.filled.Edit
313
+ import androidx.compose.ui.draw.clip
314
+ import androidx.compose.ui.draw.shadow
315
+ import androidx.compose.ui.hapticfeedback.HapticFeedbackType
316
+ import androidx.compose.ui.platform.LocalHapticFeedback
317
+ import kotlinx.coroutines.launch
318
+
319
+ @Composable
320
+ fun NewNoteFab(onClick: () -> Unit, modifier: Modifier = Modifier) {
321
+ val haptics = LocalHapticFeedback.current
322
+ val scope = rememberCoroutineScope()
323
+ val scale = remember { Animatable(1f) }
324
+
325
+ Box(
326
+ modifier = modifier
327
+ .size(56.dp)
328
+ .scale(scale.value)
329
+ .shadow(
330
+ elevation = 12.dp,
331
+ shape = CircleShape,
332
+ spotColor = NotesColors.Orange.copy(alpha = 0.30f), // orange-tinted, NOT neutral
333
+ ambientColor = NotesColors.Orange.copy(alpha = 0.30f),
334
+ )
335
+ .clip(CircleShape)
336
+ .background(NotesColors.Orange)
337
+ .clickable {
338
+ haptics.performHapticFeedback(HapticFeedbackType.LongPress) // ~iOS .medium impact
339
+ scope.launch {
340
+ scale.animateTo(0.95f, androidx.compose.animation.core.tween(80))
341
+ scale.animateTo(1.05f, androidx.compose.animation.core.spring(
342
+ dampingRatio = 0.5f, stiffness = 500f))
343
+ scale.animateTo(1f, androidx.compose.animation.core.spring())
344
+ }
345
+ onClick()
346
+ },
347
+ contentAlignment = Alignment.Center,
348
+ ) {
349
+ Icon(Icons.Filled.Edit, contentDescription = "New note",
350
+ tint = Color.White, modifier = Modifier.size(24.dp))
351
+ }
352
+ }
353
+ ```
354
+
355
+ ### Primary CTA
356
+
357
+ ```kotlin
358
+ import androidx.compose.foundation.shape.RoundedCornerShape
359
+
360
+ @Composable
361
+ fun NotesPrimaryButton(label: String, onClick: () -> Unit, modifier: Modifier = Modifier) {
362
+ val interaction = remember { MutableInteractionSource() }
363
+ val pressed by interaction.collectIsPressedAsState()
364
+ val scale by androidx.compose.animation.core.animateFloatAsState(
365
+ if (pressed) 0.98f else 1f, label = "ctaScale")
366
+ val haptics = LocalHapticFeedback.current
367
+
368
+ Box(
369
+ modifier = modifier
370
+ .fillMaxWidth()
371
+ .heightIn(min = 44.dp)
372
+ .scale(scale)
373
+ .clip(RoundedCornerShape(12.dp))
374
+ .background(if (pressed) NotesColors.OrangePressed else NotesColors.Orange)
375
+ .clickable(interaction, indication = null) {
376
+ haptics.performHapticFeedback(HapticFeedbackType.TextHandleMove) // ~iOS .light impact
377
+ onClick()
378
+ }
379
+ .padding(horizontal = 24.dp, vertical = 12.dp),
380
+ contentAlignment = Alignment.Center,
381
+ ) {
382
+ Text(label, style = NotesText.Button, color = Color.White)
383
+ }
384
+ }
385
+ ```
386
+
387
+ ### Tag Chip
388
+
389
+ ```kotlin
390
+ @Composable
391
+ fun TagChip(name: String, isSelected: Boolean, onClick: () -> Unit) {
392
+ val haptics = LocalHapticFeedback.current
393
+ Row(
394
+ modifier = Modifier
395
+ .height(32.dp)
396
+ .clip(RoundedCornerShape(16.dp))
397
+ .background(if (isSelected) NotesColors.Orange else NotesColors.OrangeTint)
398
+ .clickable {
399
+ haptics.performHapticFeedback(HapticFeedbackType.TextHandleMove) // ~iOS .selection
400
+ onClick()
401
+ }
402
+ .padding(horizontal = 12.dp, vertical = 6.dp),
403
+ verticalAlignment = Alignment.CenterVertically,
404
+ horizontalArrangement = Arrangement.spacedBy(4.dp),
405
+ ) {
406
+ Text("#", style = NotesText.TagChip,
407
+ color = if (isSelected) Color.White else NotesColors.Orange)
408
+ Text(name, style = NotesText.TagChip,
409
+ color = if (isSelected) Color.White else NotesColors.Orange)
410
+ }
411
+ }
412
+ ```
413
+
414
+ ### Search Bar
415
+
416
+ ```kotlin
417
+ import androidx.compose.foundation.border
418
+ import androidx.compose.foundation.text.BasicTextField
419
+ import androidx.compose.material.icons.filled.Mic
420
+ import androidx.compose.material.icons.filled.Search
421
+
422
+ @Composable
423
+ fun NotesSearchBar(value: String, onValueChange: (String) -> Unit) {
424
+ var focused by remember { mutableStateOf(false) }
425
+ Row(
426
+ modifier = Modifier
427
+ .fillMaxWidth()
428
+ .height(36.dp)
429
+ .clip(RoundedCornerShape(10.dp))
430
+ .background(NotesColors.CreamSurf1)
431
+ .border(
432
+ width = if (focused) 2.dp else 0.dp,
433
+ color = if (focused) NotesColors.Orange else Color.Transparent,
434
+ shape = RoundedCornerShape(10.dp),
435
+ )
436
+ .padding(horizontal = 12.dp),
437
+ verticalAlignment = Alignment.CenterVertically,
438
+ horizontalArrangement = Arrangement.spacedBy(8.dp),
439
+ ) {
440
+ Icon(Icons.Filled.Search, contentDescription = null,
441
+ tint = NotesColors.Slate, modifier = Modifier.size(14.dp))
442
+ Box(Modifier.weight(1f)) {
443
+ if (value.isEmpty()) {
444
+ Text("Search", style = NotesText.SearchHint, color = NotesColors.Slate)
445
+ }
446
+ BasicTextField(
447
+ value = value,
448
+ onValueChange = onValueChange,
449
+ textStyle = NotesText.Body.copy(color = NotesColors.Ink),
450
+ singleLine = true,
451
+ cursorBrush = androidx.compose.ui.graphics.SolidColor(NotesColors.Orange),
452
+ modifier = Modifier.fillMaxWidth()
453
+ .onFocusChanged { focused = it.isFocused },
454
+ )
455
+ }
456
+ Icon(Icons.Filled.Mic, contentDescription = "Voice search",
457
+ tint = NotesColors.Slate, modifier = Modifier.size(14.dp))
458
+ }
459
+ }
460
+ ```
461
+
462
+ ### Checklist Item
463
+
464
+ ```kotlin
465
+ import androidx.compose.material.icons.filled.Check
466
+ import androidx.compose.ui.text.style.TextDecoration
467
+
468
+ @Composable
469
+ fun ChecklistItem(text: String, checked: Boolean, onToggle: () -> Unit) {
470
+ val haptics = LocalHapticFeedback.current
471
+ val circleScale = remember { Animatable(if (checked) 1f else 0f) }
472
+ LaunchedEffect(checked) {
473
+ circleScale.animateTo(if (checked) 1f else 0f,
474
+ androidx.compose.animation.core.tween(200))
475
+ }
476
+ val alpha by androidx.compose.animation.core.animateFloatAsState(
477
+ if (checked) 0.6f else 1f,
478
+ androidx.compose.animation.core.tween(300), label = "checkAlpha")
479
+
480
+ Row(verticalAlignment = Alignment.CenterVertically,
481
+ horizontalArrangement = Arrangement.spacedBy(12.dp)) {
482
+ Box(
483
+ Modifier
484
+ .size(24.dp)
485
+ .border(1.5.dp, NotesColors.Slate, CircleShape)
486
+ .clickable(
487
+ interactionSource = remember { MutableInteractionSource() },
488
+ indication = null,
489
+ ) {
490
+ haptics.performHapticFeedback(HapticFeedbackType.LongPress) // ~iOS .success
491
+ onToggle()
492
+ },
493
+ contentAlignment = Alignment.Center,
494
+ ) {
495
+ Box(
496
+ Modifier
497
+ .size(24.dp)
498
+ .scale(circleScale.value)
499
+ .clip(CircleShape)
500
+ .background(NotesColors.Orange),
501
+ contentAlignment = Alignment.Center,
502
+ ) {
503
+ if (circleScale.value > 0.5f) {
504
+ Icon(Icons.Filled.Check, contentDescription = null,
505
+ tint = Color.White, modifier = Modifier.size(12.dp))
506
+ }
507
+ }
508
+ }
509
+ Text(
510
+ text,
511
+ style = NotesText.Body,
512
+ color = if (checked) NotesColors.Slate else NotesColors.Ink,
513
+ textDecoration = if (checked) TextDecoration.LineThrough else null,
514
+ modifier = Modifier.androidx.compose.ui.draw.alpha(alpha),
515
+ )
516
+ }
517
+ }
518
+ ```
519
+
520
+ ### Pinned Card (horizontal scroll)
521
+
522
+ ```kotlin
523
+ @Composable
524
+ fun PinnedCard(title: String, preview: String, onClick: () -> Unit) {
525
+ Column(
526
+ modifier = Modifier
527
+ .size(width = 160.dp, height = 96.dp)
528
+ .clip(RoundedCornerShape(10.dp))
529
+ .background(NotesColors.CreamSurf1)
530
+ .clickable(onClick = onClick)
531
+ .padding(12.dp),
532
+ verticalArrangement = Arrangement.spacedBy(4.dp),
533
+ ) {
534
+ Row(verticalAlignment = Alignment.Top) {
535
+ Text(title, style = NotesText.RowTitle.copy(fontSize = 15.sp),
536
+ color = NotesColors.Ink, maxLines = 1, overflow = TextOverflow.Ellipsis,
537
+ modifier = Modifier.weight(1f))
538
+ Icon(Icons.Filled.PushPin, contentDescription = "Pinned",
539
+ tint = NotesColors.Orange, modifier = Modifier.size(11.dp))
540
+ }
541
+ Text(preview, style = NotesText.RowDate.copy(fontSize = 12.sp),
542
+ color = NotesColors.Slate, maxLines = 3, overflow = TextOverflow.Ellipsis)
543
+ }
544
+ }
545
+ ```
546
+
547
+ ## 4. The Note Editor Canvas (the paper)
548
+
549
+ Apple Notes' calmest, most distinctive surface: a chrome-free editable canvas — no card, no border, just the cream paper with the orange blinking cursor and 1.5-line-height body. iOS uses a `UITextView`; Compose uses a `BasicTextField` with no decoration.
550
+
551
+ ```kotlin
552
+ import androidx.compose.foundation.text.BasicTextField
553
+ import androidx.compose.ui.graphics.SolidColor
554
+ import androidx.compose.ui.text.input.TextFieldValue
555
+
556
+ @Composable
557
+ fun NoteEditor(
558
+ title: TextFieldValue,
559
+ body: TextFieldValue,
560
+ onTitleChange: (TextFieldValue) -> Unit,
561
+ onBodyChange: (TextFieldValue) -> Unit,
562
+ ) {
563
+ Column(
564
+ Modifier
565
+ .fillMaxSize()
566
+ .background(NotesColors.Cream) // the canvas IS the paper — no card, no border
567
+ .padding(horizontal = 20.dp, vertical = 16.dp),
568
+ ) {
569
+ BasicTextField(
570
+ value = title,
571
+ onValueChange = onTitleChange,
572
+ textStyle = NotesText.BodyTitle.copy(color = NotesColors.Ink),
573
+ cursorBrush = SolidColor(NotesColors.Orange), // orange cursor
574
+ modifier = Modifier.fillMaxWidth(),
575
+ )
576
+ Spacer(Modifier.height(4.dp))
577
+ BasicTextField(
578
+ value = body,
579
+ onValueChange = onBodyChange,
580
+ textStyle = NotesText.Body.copy(color = NotesColors.Ink), // 17sp / 25sp line-height
581
+ cursorBrush = SolidColor(NotesColors.Orange),
582
+ modifier = Modifier.fillMaxSize(),
583
+ )
584
+ }
585
+ }
586
+ ```
587
+
588
+ Compose's `BasicTextField` cursor blink (≈500ms) approximates iOS's 600ms orange cursor — the `SolidColor(NotesColors.Orange)` `cursorBrush` is the load-bearing detail. The system text-selection handles are tinted via `LocalTextSelectionColors` to `NotesColors.HighlightYellow` (the highlight color is reserved exclusively for selection — never a UI fill).
589
+
590
+ ## 5. Navigation (no tab bar — hierarchical)
591
+
592
+ Apple Notes has **no bottom tab bar** — navigation is strictly hierarchical: Folders → Note list → Editor. Do **not** add a Material `NavigationBar`. Use Navigation Compose with a standard slide transition; tint every top-bar action Notes Orange.
593
+
594
+ ```kotlin
595
+ import androidx.navigation.compose.NavHost
596
+ import androidx.navigation.compose.composable
597
+ import androidx.navigation.compose.rememberNavController
598
+
599
+ @Composable
600
+ fun NotesApp() {
601
+ val nav = rememberNavController()
602
+ NavHost(navController = nav, startDestination = "folders") {
603
+ composable("folders") { FoldersScreen(onOpen = { nav.navigate("notes/$it") }) }
604
+ composable("notes/{folderId}") { NotesListScreen(onOpen = { nav.navigate("editor/$it") }) }
605
+ composable("editor/{noteId}") { NoteEditorScreen() }
606
+ }
607
+ }
608
+ ```
609
+
610
+ iOS push/pop maps to `androidx.navigation` enter/exit transitions: `slideInHorizontally { it } + fadeIn()` / `slideOutHorizontally { -it / 4 } + fadeOut()`, ~350ms — the standard platform slide. The collapsing large title ("Notes" 34sp Heavy → 17sp inline) maps to `LargeTopAppBar` + `TopAppBarDefaults.exitUntilCollapsedScrollBehavior()`. When content scrolls under it, swap the bar container to a 92%-opaque cream `Surface` (no live blur on Android).
611
+
612
+ ## 6. Motion
613
+
614
+ | Moment | Compose recipe |
615
+ |--------|----------------|
616
+ | Note row tap | `animateFloatAsState` 1 → 0.99; then nav `slideInHorizontally` editor (~350ms); `HapticFeedbackType.TextHandleMove` (~iOS `.selection`) |
617
+ | New Note FAB tap | `Animatable` 0.95 → 1.05 → 1 ~250ms `spring(dampingRatio = 0.5f)`; `HapticFeedbackType.LongPress` (~`.medium`) |
618
+ | Checklist toggle | circle `Animatable` scale 0 → 1 over 200ms, text strike + alpha 1 → 0.6 over 300ms; `HapticFeedbackType.LongPress` (~`.success`) |
619
+ | Pin / Unpin swipe | `SwipeToDismissBox` reveals Pin lane; `HapticFeedbackType.TextHandleMove`; row animates between sections ~400ms `spring` |
620
+ | Cursor blink | `BasicTextField` default (~500ms) ≈ iOS 600ms orange cursor |
621
+ | Search field focus | `animateDpAsState` border 0 → 2dp Orange; Cancel slides in `slideInHorizontally` ~250ms |
622
+ | Folder glyph tilt | static -2° `Modifier.rotate`; optional `SensorManager` parallax (clamp ≤5°) |
623
+
624
+ ```kotlin
625
+ // FAB bounce — exact 0.95 → 1.05 → 1
626
+ @Composable
627
+ fun rememberFabBounce(): Pair<Animatable<Float, *>, suspend () -> Unit> {
628
+ val scale = remember { Animatable(1f) }
629
+ val play: suspend () -> Unit = {
630
+ scale.animateTo(0.95f, tween(80))
631
+ scale.animateTo(1.05f, spring(dampingRatio = 0.5f, stiffness = 500f))
632
+ scale.animateTo(1f, spring())
633
+ }
634
+ return scale to play
635
+ }
636
+ ```
637
+
638
+ Haptics: prefer `LocalHapticFeedback`. For richer control use `LocalView.current.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK)` (API 30+) — map `.light` (CTA) to `VibrationEffect.createOneShot(8, ...)`, `.medium` (FAB) to `VibrationEffect.createOneShot(15, ...)`, `.selection` (tag chip, row tap, pin swipe) to a short tick, and `.success` (checklist complete) to a double-buzz `VibrationEffect.createWaveform(longArrayOf(0, 40, 60, 40), -1)`, mirroring iOS `.notificationOccurred(.success)`.
639
+
640
+ ## 7. Icons
641
+
642
+ Apple Notes uses SF Symbols; the closest first-party set is `androidx.compose.material:material-icons-extended`. The iconic **yellow folder glyph** and the **checklist circle** are hand-drawn (see §3) rather than icons. Ship any non-matching glyph as a vector drawable via `ImageVector.vectorResource(R.drawable.…)`.
643
+
644
+ | Component | SF Symbol (iOS) | Material Icon (Compose) |
645
+ |-----------|-----------------|--------------------------|
646
+ | New Note FAB | `square.and.pencil` | `Icons.Filled.Edit` |
647
+ | Pin indicator | `pin.fill` | `Icons.Filled.PushPin` |
648
+ | Smart folder | `sparkles` | `Icons.Filled.AutoAwesome` |
649
+ | Search | `magnifyingglass` | `Icons.Filled.Search` |
650
+ | Voice search | `mic.fill` | `Icons.Filled.Mic` |
651
+ | Clear search | `xmark.circle.fill` | `Icons.Filled.Cancel` |
652
+ | Checklist (empty) | custom circle (1.5dp stroke) | custom composable (see §3) |
653
+ | Checklist (filled) | `checkmark` over filled circle | `Icons.Filled.Check` over circle |
654
+ | Share | `square.and.arrow.up` | `Icons.Filled.IosShare` |
655
+ | More menu | `ellipsis.circle` | `Icons.Filled.MoreHoriz` |
656
+ | Back chevron | `chevron.left` | `Icons.AutoMirrored.Filled.ArrowBackIos` |
657
+ | Row chevron | `chevron.right` | `Icons.AutoMirrored.Filled.KeyboardArrowRight` |
658
+ | Photo (toolbar) | `camera` | `Icons.Filled.PhotoCamera` |
659
+ | Checklist (toolbar) | `checklist` | `Icons.Filled.Checklist` |
660
+ | Table (toolbar) | `tablecells` | `Icons.Filled.TableChart` |
661
+ | Format (toolbar) | `textformat` | `Icons.Filled.TextFormat` |
662
+ | Lock | `lock.fill` | `Icons.Filled.Lock` |
663
+ | Folder glyph | — | custom `Canvas` path (see §3), yellow `#F5D773` + orange `#F09A38` |
664
+
665
+ ## 8. Minimum SDK & Accessibility Notes
666
+
667
+ - **minSdk 24** (Compose floor is 21; `Canvas` folder glyph + `BasicTextField` + Navigation Compose are comfortable at 24). `compileSdk 34+`, Compose BOM `2024.09+`, Kotlin `2.0+`.
668
+ - **Edge-to-edge**: call `enableEdgeToEdge()` in the `Activity`. The cream canvas wants dark-content (dark icons) system bars; the dark-paper canvas wants light-content. Apply `Scaffold` insets / `Modifier.windowInsetsPadding(WindowInsets.systemBars)` so the FAB sits 16.dp above the gesture nav and the large title clears the status bar / display cutout.
669
+ - **Font scaling**: Notes is the most Dynamic-Type-sensitive app on the platform (older-demographic skew) — `sp` honors the user's font scale; keep it on note titles, body, preview, date, and folder names. The body must stay at `17sp × scale` with the 1.5 line-height intact at every size (the calmness scales up, never breaks). Even tag chips should scale (wrap horizontally rather than truncate). Only pin truly layout-locked text (11sp toolbar labels, 17sp search placeholder).
670
+ - **TalkBack**: read a note row as one node — `Modifier.semantics(mergeDescendants = true) { contentDescription = "$title, $preview, $date" }`; a folder row as `"$name folder, $count notes"`; a checklist item as `"${if (checked) "Checked" else "Unchecked"}: $text, double tap to toggle"`. The folder glyph is decorative — `contentDescription = null` (the row label carries meaning).
671
+ - **Touch targets**: Material guidance is 48.dp minimum. The note row (84dp) and FAB (56dp) are well clear; bump the 24.dp checklist circle, 32.dp tag chips, and 14–16.dp toolbar/chevron glyphs to a 48.dp hit box via padding.
672
+ - **Contrast**: Ink `#1C1C1E` on cream `#FFFBED` meets WCAG AAA. Slate `#8E8E93` on cream meets AA only at ≥18sp — for the 12sp date and 14sp preview, this is below AA; raise to Medium (500) weight if strict AA compliance is required (Apple ships it at Regular by design).
673
+ - **Reduce motion**: when `Settings.Global.ANIMATOR_DURATION_SCALE == 0f`, skip the FAB scale bounce, the checklist circle-fill scale, and the folder-glyph parallax tilt — apply the end state instantly.
674
+ - **Locked notes**: implement biometric unlock with `androidx.biometric:biometric` (`BiometricPrompt`); fall back to device credential after 3 failed attempts. Render the locked row with a 24.dp lock glyph + "This note is locked." in `NotesText.RowPreview` italic instead of the preview.
675
+ - **Dynamic color**: do **not** enable Material You `dynamicColorScheme()` — the cream `#FFFBED` paper canvas, Notes Orange `#F09A38`, and the iconic Folder Yellow `#F5D773` are signature cross-app Apple brand assets (Finder, iCloud Drive, Files share the same folder) and must not recolor to the user's wallpaper.