devskill 2.0.5 → 2.0.7

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 (438) hide show
  1. package/landing/app/[locale]/page.tsx +68 -2
  2. package/landing/messages/en.json +12 -2
  3. package/landing/messages/vi.json +13 -3
  4. package/meta.ts +18 -1
  5. package/package.json +5 -1
  6. package/scripts/cli.ts +175 -46
  7. package/skills/algorithmic-art/LICENSE.txt +202 -0
  8. package/skills/algorithmic-art/SKILL.md +405 -0
  9. package/skills/algorithmic-art/SYNC.md +5 -0
  10. package/skills/algorithmic-art/templates/generator_template.js +223 -0
  11. package/skills/algorithmic-art/templates/viewer.html +599 -0
  12. package/skills/brand-guidelines/LICENSE.txt +202 -0
  13. package/skills/brand-guidelines/SKILL.md +73 -0
  14. package/skills/brand-guidelines/SYNC.md +5 -0
  15. package/skills/canvas-design/LICENSE.txt +202 -0
  16. package/skills/canvas-design/SKILL.md +130 -0
  17. package/skills/canvas-design/SYNC.md +5 -0
  18. package/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
  19. package/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  20. package/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  21. package/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
  22. package/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  23. package/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
  24. package/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  25. package/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  26. package/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  27. package/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  28. package/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  29. package/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  30. package/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
  31. package/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  32. package/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
  33. package/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  34. package/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
  35. package/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  36. package/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  37. package/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
  38. package/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  39. package/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
  40. package/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  41. package/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  42. package/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
  43. package/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  44. package/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  45. package/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  46. package/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  47. package/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  48. package/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  49. package/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  50. package/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  51. package/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  52. package/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  53. package/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  54. package/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  55. package/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
  56. package/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  57. package/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  58. package/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  59. package/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  60. package/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  61. package/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  62. package/skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
  63. package/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
  64. package/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  65. package/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  66. package/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  67. package/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  68. package/skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
  69. package/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  70. package/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  71. package/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
  72. package/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  73. package/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  74. package/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  75. package/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  76. package/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
  77. package/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  78. package/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  79. package/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
  80. package/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
  81. package/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  82. package/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  83. package/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
  84. package/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  85. package/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
  86. package/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  87. package/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  88. package/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
  89. package/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  90. package/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
  91. package/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  92. package/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  93. package/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  94. package/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  95. package/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
  96. package/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  97. package/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
  98. package/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  99. package/skills/claude-api/LICENSE.txt +202 -0
  100. package/skills/claude-api/SKILL.md +246 -0
  101. package/skills/claude-api/SYNC.md +5 -0
  102. package/skills/claude-api/csharp/claude-api.md +400 -0
  103. package/skills/claude-api/curl/examples.md +193 -0
  104. package/skills/claude-api/go/claude-api.md +404 -0
  105. package/skills/claude-api/java/claude-api.md +430 -0
  106. package/skills/claude-api/php/claude-api.md +241 -0
  107. package/skills/claude-api/python/agent-sdk/README.md +345 -0
  108. package/skills/claude-api/python/agent-sdk/patterns.md +359 -0
  109. package/skills/claude-api/python/claude-api/README.md +410 -0
  110. package/skills/claude-api/python/claude-api/batches.md +185 -0
  111. package/skills/claude-api/python/claude-api/files-api.md +165 -0
  112. package/skills/claude-api/python/claude-api/streaming.md +162 -0
  113. package/skills/claude-api/python/claude-api/tool-use.md +590 -0
  114. package/skills/claude-api/ruby/claude-api.md +92 -0
  115. package/skills/claude-api/shared/error-codes.md +206 -0
  116. package/skills/claude-api/shared/live-sources.md +121 -0
  117. package/skills/claude-api/shared/models.md +119 -0
  118. package/skills/claude-api/shared/tool-use-concepts.md +305 -0
  119. package/skills/claude-api/typescript/agent-sdk/README.md +296 -0
  120. package/skills/claude-api/typescript/agent-sdk/patterns.md +209 -0
  121. package/skills/claude-api/typescript/claude-api/README.md +321 -0
  122. package/skills/claude-api/typescript/claude-api/batches.md +106 -0
  123. package/skills/claude-api/typescript/claude-api/files-api.md +98 -0
  124. package/skills/claude-api/typescript/claude-api/streaming.md +178 -0
  125. package/skills/claude-api/typescript/claude-api/tool-use.md +527 -0
  126. package/skills/doc-coauthoring/SKILL.md +375 -0
  127. package/skills/doc-coauthoring/SYNC.md +5 -0
  128. package/skills/docx/LICENSE.txt +30 -0
  129. package/skills/docx/SKILL.md +590 -0
  130. package/skills/docx/SYNC.md +5 -0
  131. package/skills/docx/scripts/__init__.py +1 -0
  132. package/skills/docx/scripts/accept_changes.py +135 -0
  133. package/skills/docx/scripts/comment.py +318 -0
  134. package/skills/docx/scripts/office/helpers/__init__.py +0 -0
  135. package/skills/docx/scripts/office/helpers/merge_runs.py +199 -0
  136. package/skills/docx/scripts/office/helpers/simplify_redlines.py +197 -0
  137. package/skills/docx/scripts/office/pack.py +159 -0
  138. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  139. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  140. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  141. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  142. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  143. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  144. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  145. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  146. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  147. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  148. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  149. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  150. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  151. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  152. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  153. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  154. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  155. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  156. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  157. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  158. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  159. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  160. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  161. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  162. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  163. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  164. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  165. package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  166. package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  167. package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  168. package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  169. package/skills/docx/scripts/office/schemas/mce/mc.xsd +75 -0
  170. package/skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  171. package/skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  172. package/skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  173. package/skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  174. package/skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  175. package/skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  176. package/skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  177. package/skills/docx/scripts/office/soffice.py +183 -0
  178. package/skills/docx/scripts/office/unpack.py +132 -0
  179. package/skills/docx/scripts/office/validate.py +111 -0
  180. package/skills/docx/scripts/office/validators/__init__.py +15 -0
  181. package/skills/docx/scripts/office/validators/base.py +847 -0
  182. package/skills/docx/scripts/office/validators/docx.py +446 -0
  183. package/skills/docx/scripts/office/validators/pptx.py +275 -0
  184. package/skills/docx/scripts/office/validators/redlining.py +247 -0
  185. package/skills/docx/scripts/templates/comments.xml +3 -0
  186. package/skills/docx/scripts/templates/commentsExtended.xml +3 -0
  187. package/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  188. package/skills/docx/scripts/templates/commentsIds.xml +3 -0
  189. package/skills/docx/scripts/templates/people.xml +3 -0
  190. package/skills/frontend-design/LICENSE.txt +177 -0
  191. package/skills/frontend-design/SKILL.md +42 -0
  192. package/skills/frontend-design/SYNC.md +5 -0
  193. package/skills/internal-comms/LICENSE.txt +202 -0
  194. package/skills/internal-comms/SKILL.md +32 -0
  195. package/skills/internal-comms/SYNC.md +5 -0
  196. package/skills/internal-comms/examples/3p-updates.md +47 -0
  197. package/skills/internal-comms/examples/company-newsletter.md +65 -0
  198. package/skills/internal-comms/examples/faq-answers.md +30 -0
  199. package/skills/internal-comms/examples/general-comms.md +16 -0
  200. package/skills/mcp-builder/LICENSE.txt +202 -0
  201. package/skills/mcp-builder/SKILL.md +236 -0
  202. package/skills/mcp-builder/SYNC.md +5 -0
  203. package/skills/mcp-builder/reference/evaluation.md +602 -0
  204. package/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
  205. package/skills/mcp-builder/reference/node_mcp_server.md +970 -0
  206. package/skills/mcp-builder/reference/python_mcp_server.md +719 -0
  207. package/skills/mcp-builder/scripts/connections.py +151 -0
  208. package/skills/mcp-builder/scripts/evaluation.py +373 -0
  209. package/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
  210. package/skills/mcp-builder/scripts/requirements.txt +2 -0
  211. package/skills/next-best-practices/SKILL.md +153 -0
  212. package/skills/next-best-practices/SYNC.md +5 -0
  213. package/skills/next-best-practices/async-patterns.md +87 -0
  214. package/skills/next-best-practices/bundling.md +180 -0
  215. package/skills/next-best-practices/data-patterns.md +297 -0
  216. package/skills/next-best-practices/debug-tricks.md +105 -0
  217. package/skills/next-best-practices/directives.md +73 -0
  218. package/skills/next-best-practices/error-handling.md +227 -0
  219. package/skills/next-best-practices/file-conventions.md +140 -0
  220. package/skills/next-best-practices/font.md +245 -0
  221. package/skills/next-best-practices/functions.md +108 -0
  222. package/skills/next-best-practices/hydration-error.md +91 -0
  223. package/skills/next-best-practices/image.md +173 -0
  224. package/skills/next-best-practices/metadata.md +301 -0
  225. package/skills/next-best-practices/parallel-routes.md +287 -0
  226. package/skills/next-best-practices/route-handlers.md +146 -0
  227. package/skills/next-best-practices/rsc-boundaries.md +159 -0
  228. package/skills/next-best-practices/runtime-selection.md +39 -0
  229. package/skills/next-best-practices/scripts.md +141 -0
  230. package/skills/next-best-practices/self-hosting.md +371 -0
  231. package/skills/next-best-practices/suspense-boundaries.md +67 -0
  232. package/skills/next-cache-components/SKILL.md +411 -0
  233. package/skills/next-cache-components/SYNC.md +5 -0
  234. package/skills/next-upgrade/SKILL.md +50 -0
  235. package/skills/next-upgrade/SYNC.md +5 -0
  236. package/skills/pdf/LICENSE.txt +30 -0
  237. package/skills/pdf/SKILL.md +314 -0
  238. package/skills/pdf/SYNC.md +5 -0
  239. package/skills/pdf/forms.md +294 -0
  240. package/skills/pdf/reference.md +612 -0
  241. package/skills/pdf/scripts/check_bounding_boxes.py +65 -0
  242. package/skills/pdf/scripts/check_fillable_fields.py +11 -0
  243. package/skills/pdf/scripts/convert_pdf_to_images.py +33 -0
  244. package/skills/pdf/scripts/create_validation_image.py +37 -0
  245. package/skills/pdf/scripts/extract_form_field_info.py +122 -0
  246. package/skills/pdf/scripts/extract_form_structure.py +115 -0
  247. package/skills/pdf/scripts/fill_fillable_fields.py +98 -0
  248. package/skills/pdf/scripts/fill_pdf_form_with_annotations.py +107 -0
  249. package/skills/pptx/LICENSE.txt +30 -0
  250. package/skills/pptx/SKILL.md +232 -0
  251. package/skills/pptx/SYNC.md +5 -0
  252. package/skills/pptx/editing.md +205 -0
  253. package/skills/pptx/pptxgenjs.md +420 -0
  254. package/skills/pptx/scripts/__init__.py +0 -0
  255. package/skills/pptx/scripts/add_slide.py +195 -0
  256. package/skills/pptx/scripts/clean.py +286 -0
  257. package/skills/pptx/scripts/office/helpers/__init__.py +0 -0
  258. package/skills/pptx/scripts/office/helpers/merge_runs.py +199 -0
  259. package/skills/pptx/scripts/office/helpers/simplify_redlines.py +197 -0
  260. package/skills/pptx/scripts/office/pack.py +159 -0
  261. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  262. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  263. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  264. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  265. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  266. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  267. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  268. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  269. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  270. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  271. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  272. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  273. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  274. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  275. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  276. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  277. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  278. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  279. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  280. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  281. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  282. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  283. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  284. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  285. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  286. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  287. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  288. package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  289. package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  290. package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  291. package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  292. package/skills/pptx/scripts/office/schemas/mce/mc.xsd +75 -0
  293. package/skills/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  294. package/skills/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  295. package/skills/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  296. package/skills/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  297. package/skills/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  298. package/skills/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  299. package/skills/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  300. package/skills/pptx/scripts/office/soffice.py +183 -0
  301. package/skills/pptx/scripts/office/unpack.py +132 -0
  302. package/skills/pptx/scripts/office/validate.py +111 -0
  303. package/skills/pptx/scripts/office/validators/__init__.py +15 -0
  304. package/skills/pptx/scripts/office/validators/base.py +847 -0
  305. package/skills/pptx/scripts/office/validators/docx.py +446 -0
  306. package/skills/pptx/scripts/office/validators/pptx.py +275 -0
  307. package/skills/pptx/scripts/office/validators/redlining.py +247 -0
  308. package/skills/pptx/scripts/thumbnail.py +289 -0
  309. package/skills/shadcn/LICENSE.md +21 -0
  310. package/skills/shadcn/SKILL.md +242 -0
  311. package/skills/shadcn/SYNC.md +5 -0
  312. package/skills/shadcn/agents/openai.yml +5 -0
  313. package/skills/shadcn/assets/shadcn-small.png +0 -0
  314. package/skills/shadcn/assets/shadcn.png +0 -0
  315. package/skills/shadcn/cli.md +257 -0
  316. package/skills/shadcn/customization.md +202 -0
  317. package/skills/shadcn/evals/evals.json +47 -0
  318. package/skills/shadcn/mcp.md +94 -0
  319. package/skills/shadcn/rules/base-vs-radix.md +306 -0
  320. package/skills/shadcn/rules/composition.md +195 -0
  321. package/skills/shadcn/rules/forms.md +192 -0
  322. package/skills/shadcn/rules/icons.md +101 -0
  323. package/skills/shadcn/rules/styling.md +162 -0
  324. package/skills/skill-creator/LICENSE.txt +202 -0
  325. package/skills/skill-creator/SKILL.md +485 -0
  326. package/skills/skill-creator/SYNC.md +5 -0
  327. package/skills/skill-creator/agents/analyzer.md +274 -0
  328. package/skills/skill-creator/agents/comparator.md +202 -0
  329. package/skills/skill-creator/agents/grader.md +223 -0
  330. package/skills/skill-creator/assets/eval_review.html +146 -0
  331. package/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  332. package/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  333. package/skills/skill-creator/references/schemas.md +430 -0
  334. package/skills/skill-creator/scripts/__init__.py +0 -0
  335. package/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  336. package/skills/skill-creator/scripts/generate_report.py +326 -0
  337. package/skills/skill-creator/scripts/improve_description.py +247 -0
  338. package/skills/skill-creator/scripts/package_skill.py +136 -0
  339. package/skills/skill-creator/scripts/quick_validate.py +103 -0
  340. package/skills/skill-creator/scripts/run_eval.py +310 -0
  341. package/skills/skill-creator/scripts/run_loop.py +328 -0
  342. package/skills/skill-creator/scripts/utils.py +47 -0
  343. package/skills/slack-gif-creator/LICENSE.txt +202 -0
  344. package/skills/slack-gif-creator/SKILL.md +254 -0
  345. package/skills/slack-gif-creator/SYNC.md +5 -0
  346. package/skills/slack-gif-creator/core/easing.py +234 -0
  347. package/skills/slack-gif-creator/core/frame_composer.py +176 -0
  348. package/skills/slack-gif-creator/core/gif_builder.py +269 -0
  349. package/skills/slack-gif-creator/core/validators.py +136 -0
  350. package/skills/slack-gif-creator/requirements.txt +4 -0
  351. package/skills/theme-factory/LICENSE.txt +202 -0
  352. package/skills/theme-factory/SKILL.md +59 -0
  353. package/skills/theme-factory/SYNC.md +5 -0
  354. package/skills/theme-factory/theme-showcase.pdf +0 -0
  355. package/skills/theme-factory/themes/arctic-frost.md +19 -0
  356. package/skills/theme-factory/themes/botanical-garden.md +19 -0
  357. package/skills/theme-factory/themes/desert-rose.md +19 -0
  358. package/skills/theme-factory/themes/forest-canopy.md +19 -0
  359. package/skills/theme-factory/themes/golden-hour.md +19 -0
  360. package/skills/theme-factory/themes/midnight-galaxy.md +19 -0
  361. package/skills/theme-factory/themes/modern-minimalist.md +19 -0
  362. package/skills/theme-factory/themes/ocean-depths.md +19 -0
  363. package/skills/theme-factory/themes/sunset-boulevard.md +19 -0
  364. package/skills/theme-factory/themes/tech-innovation.md +19 -0
  365. package/skills/vue-best-practices/SYNC.md +1 -1
  366. package/skills/vue-jsx-best-practices/SYNC.md +1 -1
  367. package/skills/vue-options-api-best-practices/SYNC.md +1 -1
  368. package/skills/vue-pinia-best-practices/SYNC.md +1 -1
  369. package/skills/vue-router-best-practices/SYNC.md +1 -1
  370. package/skills/vue-testing-best-practices/SYNC.md +1 -1
  371. package/skills/web-artifacts-builder/LICENSE.txt +202 -0
  372. package/skills/web-artifacts-builder/SKILL.md +74 -0
  373. package/skills/web-artifacts-builder/SYNC.md +5 -0
  374. package/skills/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
  375. package/skills/web-artifacts-builder/scripts/init-artifact.sh +322 -0
  376. package/skills/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  377. package/skills/webapp-testing/LICENSE.txt +202 -0
  378. package/skills/webapp-testing/SKILL.md +96 -0
  379. package/skills/webapp-testing/SYNC.md +5 -0
  380. package/skills/webapp-testing/examples/console_logging.py +35 -0
  381. package/skills/webapp-testing/examples/element_discovery.py +40 -0
  382. package/skills/webapp-testing/examples/static_html_automation.py +33 -0
  383. package/skills/webapp-testing/scripts/with_server.py +106 -0
  384. package/skills/xlsx/LICENSE.txt +30 -0
  385. package/skills/xlsx/SKILL.md +292 -0
  386. package/skills/xlsx/SYNC.md +5 -0
  387. package/skills/xlsx/scripts/office/helpers/__init__.py +0 -0
  388. package/skills/xlsx/scripts/office/helpers/merge_runs.py +199 -0
  389. package/skills/xlsx/scripts/office/helpers/simplify_redlines.py +197 -0
  390. package/skills/xlsx/scripts/office/pack.py +159 -0
  391. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  392. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  393. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  394. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  395. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  396. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  397. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  398. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  399. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  400. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  401. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  402. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  403. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  404. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  405. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  406. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  407. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  408. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  409. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  410. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  411. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  412. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  413. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  414. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  415. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  416. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  417. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  418. package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  419. package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  420. package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  421. package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  422. package/skills/xlsx/scripts/office/schemas/mce/mc.xsd +75 -0
  423. package/skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  424. package/skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  425. package/skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  426. package/skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  427. package/skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  428. package/skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  429. package/skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  430. package/skills/xlsx/scripts/office/soffice.py +183 -0
  431. package/skills/xlsx/scripts/office/unpack.py +132 -0
  432. package/skills/xlsx/scripts/office/validate.py +111 -0
  433. package/skills/xlsx/scripts/office/validators/__init__.py +15 -0
  434. package/skills/xlsx/scripts/office/validators/base.py +847 -0
  435. package/skills/xlsx/scripts/office/validators/docx.py +446 -0
  436. package/skills/xlsx/scripts/office/validators/pptx.py +275 -0
  437. package/skills/xlsx/scripts/office/validators/redlining.py +247 -0
  438. package/skills/xlsx/scripts/recalc.py +184 -0
@@ -0,0 +1,306 @@
1
+ # Base vs Radix
2
+
3
+ API differences between `base` and `radix`. Check the `base` field from `npx shadcn@latest info`.
4
+
5
+ ## Contents
6
+
7
+ - Composition: asChild vs render
8
+ - Button / trigger as non-button element
9
+ - Select (items prop, placeholder, positioning, multiple, object values)
10
+ - ToggleGroup (type vs multiple)
11
+ - Slider (scalar vs array)
12
+ - Accordion (type and defaultValue)
13
+
14
+ ---
15
+
16
+ ## Composition: asChild (radix) vs render (base)
17
+
18
+ Radix uses `asChild` to replace the default element. Base uses `render`. Don't wrap triggers in extra elements.
19
+
20
+ **Incorrect:**
21
+
22
+ ```tsx
23
+ <DialogTrigger>
24
+ <div>
25
+ <Button>Open</Button>
26
+ </div>
27
+ </DialogTrigger>
28
+ ```
29
+
30
+ **Correct (radix):**
31
+
32
+ ```tsx
33
+ <DialogTrigger asChild>
34
+ <Button>Open</Button>
35
+ </DialogTrigger>
36
+ ```
37
+
38
+ **Correct (base):**
39
+
40
+ ```tsx
41
+ <DialogTrigger render={<Button />}>Open</DialogTrigger>
42
+ ```
43
+
44
+ This applies to all trigger and close components: `DialogTrigger`, `SheetTrigger`, `AlertDialogTrigger`, `DropdownMenuTrigger`, `PopoverTrigger`, `TooltipTrigger`, `CollapsibleTrigger`, `DialogClose`, `SheetClose`, `NavigationMenuLink`, `BreadcrumbLink`, `SidebarMenuButton`, `Badge`, `Item`.
45
+
46
+ ---
47
+
48
+ ## Button / trigger as non-button element (base only)
49
+
50
+ When `render` changes an element to a non-button (`<a>`, `<span>`), add `nativeButton={false}`.
51
+
52
+ **Incorrect (base):** missing `nativeButton={false}`.
53
+
54
+ ```tsx
55
+ <Button render={<a href="/docs" />}>Read the docs</Button>
56
+ ```
57
+
58
+ **Correct (base):**
59
+
60
+ ```tsx
61
+ <Button render={<a href="/docs" />} nativeButton={false}>
62
+ Read the docs
63
+ </Button>
64
+ ```
65
+
66
+ **Correct (radix):**
67
+
68
+ ```tsx
69
+ <Button asChild>
70
+ <a href="/docs">Read the docs</a>
71
+ </Button>
72
+ ```
73
+
74
+ Same for triggers whose `render` is not a `Button`:
75
+
76
+ ```tsx
77
+ // base.
78
+ <PopoverTrigger render={<InputGroupAddon />} nativeButton={false}>
79
+ Pick date
80
+ </PopoverTrigger>
81
+ ```
82
+
83
+ ---
84
+
85
+ ## Select
86
+
87
+ **items prop (base only).** Base requires an `items` prop on the root. Radix uses inline JSX only.
88
+
89
+ **Incorrect (base):**
90
+
91
+ ```tsx
92
+ <Select>
93
+ <SelectTrigger><SelectValue placeholder="Select a fruit" /></SelectTrigger>
94
+ </Select>
95
+ ```
96
+
97
+ **Correct (base):**
98
+
99
+ ```tsx
100
+ const items = [
101
+ { label: "Select a fruit", value: null },
102
+ { label: "Apple", value: "apple" },
103
+ { label: "Banana", value: "banana" },
104
+ ]
105
+
106
+ <Select items={items}>
107
+ <SelectTrigger>
108
+ <SelectValue />
109
+ </SelectTrigger>
110
+ <SelectContent>
111
+ <SelectGroup>
112
+ {items.map((item) => (
113
+ <SelectItem key={item.value} value={item.value}>{item.label}</SelectItem>
114
+ ))}
115
+ </SelectGroup>
116
+ </SelectContent>
117
+ </Select>
118
+ ```
119
+
120
+ **Correct (radix):**
121
+
122
+ ```tsx
123
+ <Select>
124
+ <SelectTrigger>
125
+ <SelectValue placeholder="Select a fruit" />
126
+ </SelectTrigger>
127
+ <SelectContent>
128
+ <SelectGroup>
129
+ <SelectItem value="apple">Apple</SelectItem>
130
+ <SelectItem value="banana">Banana</SelectItem>
131
+ </SelectGroup>
132
+ </SelectContent>
133
+ </Select>
134
+ ```
135
+
136
+ **Placeholder.** Base uses a `{ value: null }` item in the items array. Radix uses `<SelectValue placeholder="...">`.
137
+
138
+ **Content positioning.** Base uses `alignItemWithTrigger`. Radix uses `position`.
139
+
140
+ ```tsx
141
+ // base.
142
+ <SelectContent alignItemWithTrigger={false} side="bottom">
143
+
144
+ // radix.
145
+ <SelectContent position="popper">
146
+ ```
147
+
148
+ ---
149
+
150
+ ## Select — multiple selection and object values (base only)
151
+
152
+ Base supports `multiple`, render-function children on `SelectValue`, and object values with `itemToStringValue`. Radix is single-select with string values only.
153
+
154
+ **Correct (base — multiple selection):**
155
+
156
+ ```tsx
157
+ <Select items={items} multiple defaultValue={[]}>
158
+ <SelectTrigger>
159
+ <SelectValue>
160
+ {(value: string[]) => value.length === 0 ? "Select fruits" : `${value.length} selected`}
161
+ </SelectValue>
162
+ </SelectTrigger>
163
+ ...
164
+ </Select>
165
+ ```
166
+
167
+ **Correct (base — object values):**
168
+
169
+ ```tsx
170
+ <Select defaultValue={plans[0]} itemToStringValue={(plan) => plan.name}>
171
+ <SelectTrigger>
172
+ <SelectValue>{(value) => value.name}</SelectValue>
173
+ </SelectTrigger>
174
+ ...
175
+ </Select>
176
+ ```
177
+
178
+ ---
179
+
180
+ ## ToggleGroup
181
+
182
+ Base uses a `multiple` boolean prop. Radix uses `type="single"` or `type="multiple"`.
183
+
184
+ **Incorrect (base):**
185
+
186
+ ```tsx
187
+ <ToggleGroup type="single" defaultValue="daily">
188
+ <ToggleGroupItem value="daily">Daily</ToggleGroupItem>
189
+ </ToggleGroup>
190
+ ```
191
+
192
+ **Correct (base):**
193
+
194
+ ```tsx
195
+ // Single (no prop needed), defaultValue is always an array.
196
+ <ToggleGroup defaultValue={["daily"]} spacing={2}>
197
+ <ToggleGroupItem value="daily">Daily</ToggleGroupItem>
198
+ <ToggleGroupItem value="weekly">Weekly</ToggleGroupItem>
199
+ </ToggleGroup>
200
+
201
+ // Multi-selection.
202
+ <ToggleGroup multiple>
203
+ <ToggleGroupItem value="bold">Bold</ToggleGroupItem>
204
+ <ToggleGroupItem value="italic">Italic</ToggleGroupItem>
205
+ </ToggleGroup>
206
+ ```
207
+
208
+ **Correct (radix):**
209
+
210
+ ```tsx
211
+ // Single, defaultValue is a string.
212
+ <ToggleGroup type="single" defaultValue="daily" spacing={2}>
213
+ <ToggleGroupItem value="daily">Daily</ToggleGroupItem>
214
+ <ToggleGroupItem value="weekly">Weekly</ToggleGroupItem>
215
+ </ToggleGroup>
216
+
217
+ // Multi-selection.
218
+ <ToggleGroup type="multiple">
219
+ <ToggleGroupItem value="bold">Bold</ToggleGroupItem>
220
+ <ToggleGroupItem value="italic">Italic</ToggleGroupItem>
221
+ </ToggleGroup>
222
+ ```
223
+
224
+ **Controlled single value:**
225
+
226
+ ```tsx
227
+ // base — wrap/unwrap arrays.
228
+ const [value, setValue] = React.useState("normal")
229
+ <ToggleGroup value={[value]} onValueChange={(v) => setValue(v[0])}>
230
+
231
+ // radix — plain string.
232
+ const [value, setValue] = React.useState("normal")
233
+ <ToggleGroup type="single" value={value} onValueChange={setValue}>
234
+ ```
235
+
236
+ ---
237
+
238
+ ## Slider
239
+
240
+ Base accepts a plain number for a single thumb. Radix always requires an array.
241
+
242
+ **Incorrect (base):**
243
+
244
+ ```tsx
245
+ <Slider defaultValue={[50]} max={100} step={1} />
246
+ ```
247
+
248
+ **Correct (base):**
249
+
250
+ ```tsx
251
+ <Slider defaultValue={50} max={100} step={1} />
252
+ ```
253
+
254
+ **Correct (radix):**
255
+
256
+ ```tsx
257
+ <Slider defaultValue={[50]} max={100} step={1} />
258
+ ```
259
+
260
+ Both use arrays for range sliders. Controlled `onValueChange` in base may need a cast:
261
+
262
+ ```tsx
263
+ // base.
264
+ const [value, setValue] = React.useState([0.3, 0.7])
265
+ <Slider value={value} onValueChange={(v) => setValue(v as number[])} />
266
+
267
+ // radix.
268
+ const [value, setValue] = React.useState([0.3, 0.7])
269
+ <Slider value={value} onValueChange={setValue} />
270
+ ```
271
+
272
+ ---
273
+
274
+ ## Accordion
275
+
276
+ Radix requires `type="single"` or `type="multiple"` and supports `collapsible`. `defaultValue` is a string. Base uses no `type` prop, uses `multiple` boolean, and `defaultValue` is always an array.
277
+
278
+ **Incorrect (base):**
279
+
280
+ ```tsx
281
+ <Accordion type="single" collapsible defaultValue="item-1">
282
+ <AccordionItem value="item-1">...</AccordionItem>
283
+ </Accordion>
284
+ ```
285
+
286
+ **Correct (base):**
287
+
288
+ ```tsx
289
+ <Accordion defaultValue={["item-1"]}>
290
+ <AccordionItem value="item-1">...</AccordionItem>
291
+ </Accordion>
292
+
293
+ // Multi-select.
294
+ <Accordion multiple defaultValue={["item-1", "item-2"]}>
295
+ <AccordionItem value="item-1">...</AccordionItem>
296
+ <AccordionItem value="item-2">...</AccordionItem>
297
+ </Accordion>
298
+ ```
299
+
300
+ **Correct (radix):**
301
+
302
+ ```tsx
303
+ <Accordion type="single" collapsible defaultValue="item-1">
304
+ <AccordionItem value="item-1">...</AccordionItem>
305
+ </Accordion>
306
+ ```
@@ -0,0 +1,195 @@
1
+ # Component Composition
2
+
3
+ ## Contents
4
+
5
+ - Items always inside their Group component
6
+ - Callouts use Alert
7
+ - Empty states use Empty component
8
+ - Toast notifications use sonner
9
+ - Choosing between overlay components
10
+ - Dialog, Sheet, and Drawer always need a Title
11
+ - Card structure
12
+ - Button has no isPending or isLoading prop
13
+ - TabsTrigger must be inside TabsList
14
+ - Avatar always needs AvatarFallback
15
+ - Use Separator instead of raw hr or border divs
16
+ - Use Skeleton for loading placeholders
17
+ - Use Badge instead of custom styled spans
18
+
19
+ ---
20
+
21
+ ## Items always inside their Group component
22
+
23
+ Never render items directly inside the content container.
24
+
25
+ **Incorrect:**
26
+
27
+ ```tsx
28
+ <SelectContent>
29
+ <SelectItem value="apple">Apple</SelectItem>
30
+ <SelectItem value="banana">Banana</SelectItem>
31
+ </SelectContent>
32
+ ```
33
+
34
+ **Correct:**
35
+
36
+ ```tsx
37
+ <SelectContent>
38
+ <SelectGroup>
39
+ <SelectItem value="apple">Apple</SelectItem>
40
+ <SelectItem value="banana">Banana</SelectItem>
41
+ </SelectGroup>
42
+ </SelectContent>
43
+ ```
44
+
45
+ This applies to all group-based components:
46
+
47
+ | Item | Group |
48
+ |------|-------|
49
+ | `SelectItem`, `SelectLabel` | `SelectGroup` |
50
+ | `DropdownMenuItem`, `DropdownMenuLabel`, `DropdownMenuSub` | `DropdownMenuGroup` |
51
+ | `MenubarItem` | `MenubarGroup` |
52
+ | `ContextMenuItem` | `ContextMenuGroup` |
53
+ | `CommandItem` | `CommandGroup` |
54
+
55
+ ---
56
+
57
+ ## Callouts use Alert
58
+
59
+ ```tsx
60
+ <Alert>
61
+ <AlertTitle>Warning</AlertTitle>
62
+ <AlertDescription>Something needs attention.</AlertDescription>
63
+ </Alert>
64
+ ```
65
+
66
+ ---
67
+
68
+ ## Empty states use Empty component
69
+
70
+ ```tsx
71
+ <Empty>
72
+ <EmptyHeader>
73
+ <EmptyMedia variant="icon"><FolderIcon /></EmptyMedia>
74
+ <EmptyTitle>No projects yet</EmptyTitle>
75
+ <EmptyDescription>Get started by creating a new project.</EmptyDescription>
76
+ </EmptyHeader>
77
+ <EmptyContent>
78
+ <Button>Create Project</Button>
79
+ </EmptyContent>
80
+ </Empty>
81
+ ```
82
+
83
+ ---
84
+
85
+ ## Toast notifications use sonner
86
+
87
+ ```tsx
88
+ import { toast } from "sonner"
89
+
90
+ toast.success("Changes saved.")
91
+ toast.error("Something went wrong.")
92
+ toast("File deleted.", {
93
+ action: { label: "Undo", onClick: () => undoDelete() },
94
+ })
95
+ ```
96
+
97
+ ---
98
+
99
+ ## Choosing between overlay components
100
+
101
+ | Use case | Component |
102
+ |----------|-----------|
103
+ | Focused task that requires input | `Dialog` |
104
+ | Destructive action confirmation | `AlertDialog` |
105
+ | Side panel with details or filters | `Sheet` |
106
+ | Mobile-first bottom panel | `Drawer` |
107
+ | Quick info on hover | `HoverCard` |
108
+ | Small contextual content on click | `Popover` |
109
+
110
+ ---
111
+
112
+ ## Dialog, Sheet, and Drawer always need a Title
113
+
114
+ `DialogTitle`, `SheetTitle`, `DrawerTitle` are required for accessibility. Use `className="sr-only"` if visually hidden.
115
+
116
+ ```tsx
117
+ <DialogContent>
118
+ <DialogHeader>
119
+ <DialogTitle>Edit Profile</DialogTitle>
120
+ <DialogDescription>Update your profile.</DialogDescription>
121
+ </DialogHeader>
122
+ ...
123
+ </DialogContent>
124
+ ```
125
+
126
+ ---
127
+
128
+ ## Card structure
129
+
130
+ Use full composition — don't dump everything into `CardContent`:
131
+
132
+ ```tsx
133
+ <Card>
134
+ <CardHeader>
135
+ <CardTitle>Team Members</CardTitle>
136
+ <CardDescription>Manage your team.</CardDescription>
137
+ </CardHeader>
138
+ <CardContent>...</CardContent>
139
+ <CardFooter>
140
+ <Button>Invite</Button>
141
+ </CardFooter>
142
+ </Card>
143
+ ```
144
+
145
+ ---
146
+
147
+ ## Button has no isPending or isLoading prop
148
+
149
+ Compose with `Spinner` + `data-icon` + `disabled`:
150
+
151
+ ```tsx
152
+ <Button disabled>
153
+ <Spinner data-icon="inline-start" />
154
+ Saving...
155
+ </Button>
156
+ ```
157
+
158
+ ---
159
+
160
+ ## TabsTrigger must be inside TabsList
161
+
162
+ Never render `TabsTrigger` directly inside `Tabs` — always wrap in `TabsList`:
163
+
164
+ ```tsx
165
+ <Tabs defaultValue="account">
166
+ <TabsList>
167
+ <TabsTrigger value="account">Account</TabsTrigger>
168
+ <TabsTrigger value="password">Password</TabsTrigger>
169
+ </TabsList>
170
+ <TabsContent value="account">...</TabsContent>
171
+ </Tabs>
172
+ ```
173
+
174
+ ---
175
+
176
+ ## Avatar always needs AvatarFallback
177
+
178
+ Always include `AvatarFallback` for when the image fails to load:
179
+
180
+ ```tsx
181
+ <Avatar>
182
+ <AvatarImage src="/avatar.png" alt="User" />
183
+ <AvatarFallback>JD</AvatarFallback>
184
+ </Avatar>
185
+ ```
186
+
187
+ ---
188
+
189
+ ## Use existing components instead of custom markup
190
+
191
+ | Instead of | Use |
192
+ |---|---|
193
+ | `<hr>` or `<div className="border-t">` | `<Separator />` |
194
+ | `<div className="animate-pulse">` with styled divs | `<Skeleton className="h-4 w-3/4" />` |
195
+ | `<span className="rounded-full bg-green-100 ...">` | `<Badge variant="secondary">` |
@@ -0,0 +1,192 @@
1
+ # Forms & Inputs
2
+
3
+ ## Contents
4
+
5
+ - Forms use FieldGroup + Field
6
+ - InputGroup requires InputGroupInput/InputGroupTextarea
7
+ - Buttons inside inputs use InputGroup + InputGroupAddon
8
+ - Option sets (2–7 choices) use ToggleGroup
9
+ - FieldSet + FieldLegend for grouping related fields
10
+ - Field validation and disabled states
11
+
12
+ ---
13
+
14
+ ## Forms use FieldGroup + Field
15
+
16
+ Always use `FieldGroup` + `Field` — never raw `div` with `space-y-*`:
17
+
18
+ ```tsx
19
+ <FieldGroup>
20
+ <Field>
21
+ <FieldLabel htmlFor="email">Email</FieldLabel>
22
+ <Input id="email" type="email" />
23
+ </Field>
24
+ <Field>
25
+ <FieldLabel htmlFor="password">Password</FieldLabel>
26
+ <Input id="password" type="password" />
27
+ </Field>
28
+ </FieldGroup>
29
+ ```
30
+
31
+ Use `Field orientation="horizontal"` for settings pages. Use `FieldLabel className="sr-only"` for visually hidden labels.
32
+
33
+ **Choosing form controls:**
34
+
35
+ - Simple text input → `Input`
36
+ - Dropdown with predefined options → `Select`
37
+ - Searchable dropdown → `Combobox`
38
+ - Native HTML select (no JS) → `native-select`
39
+ - Boolean toggle → `Switch` (for settings) or `Checkbox` (for forms)
40
+ - Single choice from few options → `RadioGroup`
41
+ - Toggle between 2–5 options → `ToggleGroup` + `ToggleGroupItem`
42
+ - OTP/verification code → `InputOTP`
43
+ - Multi-line text → `Textarea`
44
+
45
+ ---
46
+
47
+ ## InputGroup requires InputGroupInput/InputGroupTextarea
48
+
49
+ Never use raw `Input` or `Textarea` inside an `InputGroup`.
50
+
51
+ **Incorrect:**
52
+
53
+ ```tsx
54
+ <InputGroup>
55
+ <Input placeholder="Search..." />
56
+ </InputGroup>
57
+ ```
58
+
59
+ **Correct:**
60
+
61
+ ```tsx
62
+ import { InputGroup, InputGroupInput } from "@/components/ui/input-group"
63
+
64
+ <InputGroup>
65
+ <InputGroupInput placeholder="Search..." />
66
+ </InputGroup>
67
+ ```
68
+
69
+ ---
70
+
71
+ ## Buttons inside inputs use InputGroup + InputGroupAddon
72
+
73
+ Never place a `Button` directly inside or adjacent to an `Input` with custom positioning.
74
+
75
+ **Incorrect:**
76
+
77
+ ```tsx
78
+ <div className="relative">
79
+ <Input placeholder="Search..." className="pr-10" />
80
+ <Button className="absolute right-0 top-0" size="icon">
81
+ <SearchIcon />
82
+ </Button>
83
+ </div>
84
+ ```
85
+
86
+ **Correct:**
87
+
88
+ ```tsx
89
+ import { InputGroup, InputGroupInput, InputGroupAddon } from "@/components/ui/input-group"
90
+
91
+ <InputGroup>
92
+ <InputGroupInput placeholder="Search..." />
93
+ <InputGroupAddon>
94
+ <Button size="icon">
95
+ <SearchIcon data-icon="inline-start" />
96
+ </Button>
97
+ </InputGroupAddon>
98
+ </InputGroup>
99
+ ```
100
+
101
+ ---
102
+
103
+ ## Option sets (2–7 choices) use ToggleGroup
104
+
105
+ Don't manually loop `Button` components with active state.
106
+
107
+ **Incorrect:**
108
+
109
+ ```tsx
110
+ const [selected, setSelected] = useState("daily")
111
+
112
+ <div className="flex gap-2">
113
+ {["daily", "weekly", "monthly"].map((option) => (
114
+ <Button
115
+ key={option}
116
+ variant={selected === option ? "default" : "outline"}
117
+ onClick={() => setSelected(option)}
118
+ >
119
+ {option}
120
+ </Button>
121
+ ))}
122
+ </div>
123
+ ```
124
+
125
+ **Correct:**
126
+
127
+ ```tsx
128
+ import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"
129
+
130
+ <ToggleGroup spacing={2}>
131
+ <ToggleGroupItem value="daily">Daily</ToggleGroupItem>
132
+ <ToggleGroupItem value="weekly">Weekly</ToggleGroupItem>
133
+ <ToggleGroupItem value="monthly">Monthly</ToggleGroupItem>
134
+ </ToggleGroup>
135
+ ```
136
+
137
+ Combine with `Field` for labelled toggle groups:
138
+
139
+ ```tsx
140
+ <Field orientation="horizontal">
141
+ <FieldTitle id="theme-label">Theme</FieldTitle>
142
+ <ToggleGroup aria-labelledby="theme-label" spacing={2}>
143
+ <ToggleGroupItem value="light">Light</ToggleGroupItem>
144
+ <ToggleGroupItem value="dark">Dark</ToggleGroupItem>
145
+ <ToggleGroupItem value="system">System</ToggleGroupItem>
146
+ </ToggleGroup>
147
+ </Field>
148
+ ```
149
+
150
+ > **Note:** `defaultValue` and `type`/`multiple` props differ between base and radix. See [base-vs-radix.md](./base-vs-radix.md#togglegroup).
151
+
152
+ ---
153
+
154
+ ## FieldSet + FieldLegend for grouping related fields
155
+
156
+ Use `FieldSet` + `FieldLegend` for related checkboxes, radios, or switches — not `div` with a heading:
157
+
158
+ ```tsx
159
+ <FieldSet>
160
+ <FieldLegend variant="label">Preferences</FieldLegend>
161
+ <FieldDescription>Select all that apply.</FieldDescription>
162
+ <FieldGroup className="gap-3">
163
+ <Field orientation="horizontal">
164
+ <Checkbox id="dark" />
165
+ <FieldLabel htmlFor="dark" className="font-normal">Dark mode</FieldLabel>
166
+ </Field>
167
+ </FieldGroup>
168
+ </FieldSet>
169
+ ```
170
+
171
+ ---
172
+
173
+ ## Field validation and disabled states
174
+
175
+ Both attributes are needed — `data-invalid`/`data-disabled` styles the field (label, description), while `aria-invalid`/`disabled` styles the control.
176
+
177
+ ```tsx
178
+ // Invalid.
179
+ <Field data-invalid>
180
+ <FieldLabel htmlFor="email">Email</FieldLabel>
181
+ <Input id="email" aria-invalid />
182
+ <FieldDescription>Invalid email address.</FieldDescription>
183
+ </Field>
184
+
185
+ // Disabled.
186
+ <Field data-disabled>
187
+ <FieldLabel htmlFor="email">Email</FieldLabel>
188
+ <Input id="email" disabled />
189
+ </Field>
190
+ ```
191
+
192
+ Works for all controls: `Input`, `Textarea`, `Select`, `Checkbox`, `RadioGroupItem`, `Switch`, `Slider`, `NativeSelect`, `InputOTP`.