create-inox-app 0.1.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 (510) hide show
  1. package/README.md +110 -0
  2. package/dist/cli.js +22196 -0
  3. package/dist/prompt-Bp8saGVV.js +852 -0
  4. package/dist/templates/base/.gitignore.hbs +9 -0
  5. package/dist/templates/base/package.json.hbs +29 -0
  6. package/dist/templates/base/packages/typescript-config/base.json +17 -0
  7. package/dist/templates/base/packages/typescript-config/nextjs.json +8 -0
  8. package/dist/templates/base/packages/typescript-config/package.json +10 -0
  9. package/dist/templates/base/packages/typescript-config/react-library.json +7 -0
  10. package/dist/templates/base/turbo.json.hbs +32 -0
  11. package/dist/templates/ci/.gitlab-ci.yml.hbs +70 -0
  12. package/dist/templates/ci/scripts/build.sh.hbs +94 -0
  13. package/dist/templates/ci/scripts/prebuild.sh.hbs +11 -0
  14. package/dist/templates/claude-config/app/.agents/skills/agent-browser/SKILL.md +325 -0
  15. package/dist/templates/claude-config/app/.agents/skills/agent-browser/references/authentication.md +202 -0
  16. package/dist/templates/claude-config/app/.agents/skills/agent-browser/references/commands.md +259 -0
  17. package/dist/templates/claude-config/app/.agents/skills/agent-browser/references/proxy-support.md +188 -0
  18. package/dist/templates/claude-config/app/.agents/skills/agent-browser/references/session-management.md +193 -0
  19. package/dist/templates/claude-config/app/.agents/skills/agent-browser/references/snapshot-refs.md +194 -0
  20. package/dist/templates/claude-config/app/.agents/skills/agent-browser/references/video-recording.md +173 -0
  21. package/dist/templates/claude-config/app/.agents/skills/agent-browser/templates/authenticated-session.sh +100 -0
  22. package/dist/templates/claude-config/app/.agents/skills/agent-browser/templates/capture-workflow.sh +69 -0
  23. package/dist/templates/claude-config/app/.agents/skills/agent-browser/templates/form-automation.sh +62 -0
  24. package/dist/templates/claude-config/app/.agents/skills/ai-elements/SKILL.md +150 -0
  25. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/agent.md +131 -0
  26. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/artifact.md +84 -0
  27. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/attachments.md +190 -0
  28. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/audio-player.md +134 -0
  29. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/canvas.md +32 -0
  30. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/chain-of-thought.md +81 -0
  31. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/checkpoint.md +163 -0
  32. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/code-block.md +170 -0
  33. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/commit.md +177 -0
  34. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/confirmation.md +252 -0
  35. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/connection.md +32 -0
  36. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/context.md +126 -0
  37. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/controls.md +30 -0
  38. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/conversation.md +210 -0
  39. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/edge.md +50 -0
  40. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/environment-variables.md +102 -0
  41. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/file-tree.md +72 -0
  42. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/image.md +143 -0
  43. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/inline-citation.md +293 -0
  44. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/jsx-preview.md +101 -0
  45. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/message.md +256 -0
  46. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/mic-selector.md +186 -0
  47. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/model-selector.md +112 -0
  48. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/node.md +71 -0
  49. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/open-in-chat.md +67 -0
  50. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/package-info.md +95 -0
  51. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/panel.md +31 -0
  52. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/persona.md +158 -0
  53. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/plan.md +79 -0
  54. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/prompt-input.md +555 -0
  55. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/queue.md +172 -0
  56. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/reasoning.md +219 -0
  57. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/sandbox.md +126 -0
  58. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/schema-display.md +102 -0
  59. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/shimmer.md +48 -0
  60. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/snippet.md +64 -0
  61. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/sources.md +193 -0
  62. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/speech-input.md +160 -0
  63. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/stack-trace.md +218 -0
  64. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/suggestion.md +121 -0
  65. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/task.md +215 -0
  66. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/terminal.md +103 -0
  67. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/test-results.md +157 -0
  68. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/tool.md +275 -0
  69. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/toolbar.md +30 -0
  70. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/transcription.md +120 -0
  71. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/voice-selector.md +241 -0
  72. package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/web-preview.md +197 -0
  73. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/agent.tsx +61 -0
  74. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/artifact.tsx +111 -0
  75. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/attachments-inline.tsx +117 -0
  76. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/attachments-list.tsx +88 -0
  77. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/attachments.tsx +78 -0
  78. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/audio-player-remote.tsx +35 -0
  79. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/audio-player.tsx +69 -0
  80. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/chain-of-thought.tsx +74 -0
  81. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/checkpoint.tsx +90 -0
  82. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/code-block-dark.tsx +46 -0
  83. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/code-block.tsx +115 -0
  84. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/commit.tsx +94 -0
  85. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/confirmation-accepted.tsx +35 -0
  86. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/confirmation-rejected.tsx +35 -0
  87. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/confirmation-request.tsx +54 -0
  88. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/confirmation.tsx +53 -0
  89. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/context.tsx +45 -0
  90. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/conversation.tsx +176 -0
  91. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/environment-variables.tsx +55 -0
  92. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/file-tree-basic.tsx +14 -0
  93. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/file-tree-expanded.tsx +17 -0
  94. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/file-tree-selection.tsx +20 -0
  95. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/file-tree.tsx +38 -0
  96. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/image.tsx +20 -0
  97. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/inline-citation.tsx +95 -0
  98. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/jsx-preview.tsx +99 -0
  99. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/message.tsx +324 -0
  100. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/mic-selector.tsx +46 -0
  101. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/model-selector.tsx +362 -0
  102. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/open-in-chat.tsx +33 -0
  103. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/package-info.tsx +46 -0
  104. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/persona-command.tsx +96 -0
  105. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/persona-glint.tsx +96 -0
  106. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/persona-halo.tsx +96 -0
  107. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/persona-mana.tsx +96 -0
  108. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/persona-obsidian.tsx +96 -0
  109. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/persona-opal.tsx +96 -0
  110. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/plan.tsx +63 -0
  111. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/prompt-input-cursor.tsx +459 -0
  112. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/prompt-input-tooltip.tsx +40 -0
  113. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/prompt-input.tsx +247 -0
  114. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/queue-prompt-input.tsx +367 -0
  115. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/queue.tsx +276 -0
  116. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/reasoning.tsx +67 -0
  117. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/sandbox.tsx +166 -0
  118. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/schema-display-basic.tsx +7 -0
  119. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/schema-display-body.tsx +20 -0
  120. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/schema-display-nested.tsx +23 -0
  121. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/schema-display-params.tsx +16 -0
  122. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/schema-display.tsx +110 -0
  123. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/shimmer-duration.tsx +29 -0
  124. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/shimmer-elements.tsx +39 -0
  125. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/shimmer.tsx +17 -0
  126. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/snippet-plain.tsx +19 -0
  127. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/snippet.tsx +25 -0
  128. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/sources-custom.tsx +34 -0
  129. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/sources.tsx +27 -0
  130. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/speech-input.tsx +79 -0
  131. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/stack-trace-collapsed.tsx +39 -0
  132. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/stack-trace-no-internal.tsx +41 -0
  133. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/stack-trace.tsx +54 -0
  134. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/suggestion-input.tsx +137 -0
  135. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/suggestion.tsx +28 -0
  136. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/task.tsx +60 -0
  137. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/terminal-basic.tsx +7 -0
  138. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/terminal-clear.tsx +19 -0
  139. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/terminal-streaming.tsx +38 -0
  140. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/terminal.tsx +77 -0
  141. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/test-results-basic.tsx +27 -0
  142. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/test-results-errors.tsx +51 -0
  143. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/test-results-suites.tsx +40 -0
  144. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/test-results.tsx +78 -0
  145. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/tool-input-available.tsx +31 -0
  146. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/tool-input-streaming.tsx +30 -0
  147. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/tool-output-available.tsx +76 -0
  148. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/tool-output-error.tsx +45 -0
  149. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/tool.tsx +205 -0
  150. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/transcription.tsx +284 -0
  151. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/voice-selector.tsx +228 -0
  152. package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/web-preview.tsx +99 -0
  153. package/dist/templates/claude-config/app/.agents/skills/ai-sdk/SKILL.md +78 -0
  154. package/dist/templates/claude-config/app/.agents/skills/ai-sdk/references/ai-gateway.md +66 -0
  155. package/dist/templates/claude-config/app/.agents/skills/ai-sdk/references/common-errors.md +439 -0
  156. package/dist/templates/claude-config/app/.agents/skills/ai-sdk/references/devtools.md +52 -0
  157. package/dist/templates/claude-config/app/.agents/skills/ai-sdk/references/type-safe-agents.md +200 -0
  158. package/dist/templates/claude-config/app/.agents/skills/better-auth-best-practices/SKILL.md +166 -0
  159. package/dist/templates/claude-config/app/.agents/skills/building-components/SKILL.md +37 -0
  160. package/dist/templates/claude-config/app/.agents/skills/building-components/references/accessibility.mdx +819 -0
  161. package/dist/templates/claude-config/app/.agents/skills/building-components/references/as-child.mdx +324 -0
  162. package/dist/templates/claude-config/app/.agents/skills/building-components/references/composition.mdx +239 -0
  163. package/dist/templates/claude-config/app/.agents/skills/building-components/references/data-attributes.mdx +413 -0
  164. package/dist/templates/claude-config/app/.agents/skills/building-components/references/definitions.mdx +258 -0
  165. package/dist/templates/claude-config/app/.agents/skills/building-components/references/design-tokens.mdx +57 -0
  166. package/dist/templates/claude-config/app/.agents/skills/building-components/references/docs.mdx +155 -0
  167. package/dist/templates/claude-config/app/.agents/skills/building-components/references/marketplaces.mdx +144 -0
  168. package/dist/templates/claude-config/app/.agents/skills/building-components/references/npm.mdx +166 -0
  169. package/dist/templates/claude-config/app/.agents/skills/building-components/references/polymorphism.mdx +583 -0
  170. package/dist/templates/claude-config/app/.agents/skills/building-components/references/principles.mdx +61 -0
  171. package/dist/templates/claude-config/app/.agents/skills/building-components/references/registry.mdx +169 -0
  172. package/dist/templates/claude-config/app/.agents/skills/building-components/references/state.mdx +99 -0
  173. package/dist/templates/claude-config/app/.agents/skills/building-components/references/styling.mdx +286 -0
  174. package/dist/templates/claude-config/app/.agents/skills/building-components/references/types.mdx +191 -0
  175. package/dist/templates/claude-config/app/.agents/skills/docker-expert/SKILL.md +409 -0
  176. package/dist/templates/claude-config/app/.agents/skills/email-and-password-best-practices/SKILL.md +224 -0
  177. package/dist/templates/claude-config/app/.agents/skills/find-skills/SKILL.md +133 -0
  178. package/dist/templates/claude-config/app/.agents/skills/frontend-design/LICENSE.txt +177 -0
  179. package/dist/templates/claude-config/app/.agents/skills/frontend-design/SKILL.md +42 -0
  180. package/dist/templates/claude-config/app/.agents/skills/git-commit/SKILL.md +124 -0
  181. package/dist/templates/claude-config/app/.agents/skills/gitlab-ci-patterns/SKILL.md +271 -0
  182. package/dist/templates/claude-config/app/.agents/skills/hono/SKILL.md +90 -0
  183. package/dist/templates/claude-config/app/.agents/skills/langfuse-observability/SKILL.md +139 -0
  184. package/dist/templates/claude-config/app/.agents/skills/logging-best-practices/SKILL.md +127 -0
  185. package/dist/templates/claude-config/app/.agents/skills/logging-best-practices/rules/context.md +157 -0
  186. package/dist/templates/claude-config/app/.agents/skills/logging-best-practices/rules/pitfalls.md +118 -0
  187. package/dist/templates/claude-config/app/.agents/skills/logging-best-practices/rules/structure.md +193 -0
  188. package/dist/templates/claude-config/app/.agents/skills/logging-best-practices/rules/wide-events.md +113 -0
  189. package/dist/templates/claude-config/app/.agents/skills/next-best-practices/SKILL.md +153 -0
  190. package/dist/templates/claude-config/app/.agents/skills/next-best-practices/async-patterns.md +87 -0
  191. package/dist/templates/claude-config/app/.agents/skills/next-best-practices/bundling.md +180 -0
  192. package/dist/templates/claude-config/app/.agents/skills/next-best-practices/data-patterns.md +297 -0
  193. package/dist/templates/claude-config/app/.agents/skills/next-best-practices/debug-tricks.md +105 -0
  194. package/dist/templates/claude-config/app/.agents/skills/next-best-practices/directives.md +73 -0
  195. package/dist/templates/claude-config/app/.agents/skills/next-best-practices/error-handling.md +227 -0
  196. package/dist/templates/claude-config/app/.agents/skills/next-best-practices/file-conventions.md +140 -0
  197. package/dist/templates/claude-config/app/.agents/skills/next-best-practices/font.md +245 -0
  198. package/dist/templates/claude-config/app/.agents/skills/next-best-practices/functions.md +108 -0
  199. package/dist/templates/claude-config/app/.agents/skills/next-best-practices/hydration-error.md +91 -0
  200. package/dist/templates/claude-config/app/.agents/skills/next-best-practices/image.md +173 -0
  201. package/dist/templates/claude-config/app/.agents/skills/next-best-practices/metadata.md +301 -0
  202. package/dist/templates/claude-config/app/.agents/skills/next-best-practices/parallel-routes.md +287 -0
  203. package/dist/templates/claude-config/app/.agents/skills/next-best-practices/route-handlers.md +146 -0
  204. package/dist/templates/claude-config/app/.agents/skills/next-best-practices/rsc-boundaries.md +159 -0
  205. package/dist/templates/claude-config/app/.agents/skills/next-best-practices/runtime-selection.md +39 -0
  206. package/dist/templates/claude-config/app/.agents/skills/next-best-practices/scripts.md +141 -0
  207. package/dist/templates/claude-config/app/.agents/skills/next-best-practices/self-hosting.md +371 -0
  208. package/dist/templates/claude-config/app/.agents/skills/next-best-practices/suspense-boundaries.md +67 -0
  209. package/dist/templates/claude-config/app/.agents/skills/next-cache-components/SKILL.md +411 -0
  210. package/dist/templates/claude-config/app/.agents/skills/next-upgrade/SKILL.md +50 -0
  211. package/dist/templates/claude-config/app/.agents/skills/postgres-drizzle/SKILL.md +179 -0
  212. package/dist/templates/claude-config/app/.agents/skills/postgres-drizzle/references/CHEATSHEET.md +418 -0
  213. package/dist/templates/claude-config/app/.agents/skills/postgres-drizzle/references/MIGRATIONS.md +536 -0
  214. package/dist/templates/claude-config/app/.agents/skills/postgres-drizzle/references/PERFORMANCE.md +559 -0
  215. package/dist/templates/claude-config/app/.agents/skills/postgres-drizzle/references/POSTGRES.md +588 -0
  216. package/dist/templates/claude-config/app/.agents/skills/postgres-drizzle/references/QUERIES.md +764 -0
  217. package/dist/templates/claude-config/app/.agents/skills/postgres-drizzle/references/RELATIONS.md +624 -0
  218. package/dist/templates/claude-config/app/.agents/skills/postgres-drizzle/references/SCHEMA.md +554 -0
  219. package/dist/templates/claude-config/app/.agents/skills/skill-creator/LICENSE.txt +202 -0
  220. package/dist/templates/claude-config/app/.agents/skills/skill-creator/SKILL.md +356 -0
  221. package/dist/templates/claude-config/app/.agents/skills/skill-creator/references/output-patterns.md +82 -0
  222. package/dist/templates/claude-config/app/.agents/skills/skill-creator/references/workflows.md +28 -0
  223. package/dist/templates/claude-config/app/.agents/skills/skill-creator/scripts/init_skill.py +303 -0
  224. package/dist/templates/claude-config/app/.agents/skills/skill-creator/scripts/package_skill.py +113 -0
  225. package/dist/templates/claude-config/app/.agents/skills/skill-creator/scripts/quick_validate.py +95 -0
  226. package/dist/templates/claude-config/app/.agents/skills/streamdown/SKILL.md +164 -0
  227. package/dist/templates/claude-config/app/.agents/skills/streamdown/assets/examples/basic-streaming.tsx +34 -0
  228. package/dist/templates/claude-config/app/.agents/skills/streamdown/assets/examples/custom-security.tsx +38 -0
  229. package/dist/templates/claude-config/app/.agents/skills/streamdown/assets/examples/full-featured.tsx +60 -0
  230. package/dist/templates/claude-config/app/.agents/skills/streamdown/assets/examples/static-mode.tsx +17 -0
  231. package/dist/templates/claude-config/app/.agents/skills/streamdown/assets/examples/with-caret.tsx +39 -0
  232. package/dist/templates/claude-config/app/.agents/skills/streamdown/references/api.md +278 -0
  233. package/dist/templates/claude-config/app/.agents/skills/streamdown/references/features.md +201 -0
  234. package/dist/templates/claude-config/app/.agents/skills/streamdown/references/plugins.md +239 -0
  235. package/dist/templates/claude-config/app/.agents/skills/streamdown/references/security.md +192 -0
  236. package/dist/templates/claude-config/app/.agents/skills/streamdown/references/styling.md +166 -0
  237. package/dist/templates/claude-config/app/.agents/skills/tdd/SKILL.md +107 -0
  238. package/dist/templates/claude-config/app/.agents/skills/tdd/deep-modules.md +33 -0
  239. package/dist/templates/claude-config/app/.agents/skills/tdd/interface-design.md +31 -0
  240. package/dist/templates/claude-config/app/.agents/skills/tdd/mocking.md +60 -0
  241. package/dist/templates/claude-config/app/.agents/skills/tdd/refactoring.md +10 -0
  242. package/dist/templates/claude-config/app/.agents/skills/tdd/tests.md +61 -0
  243. package/dist/templates/claude-config/app/.agents/skills/turborepo/SKILL.md +914 -0
  244. package/dist/templates/claude-config/app/.agents/skills/turborepo/command/turborepo.md +70 -0
  245. package/dist/templates/claude-config/app/.agents/skills/turborepo/references/best-practices/RULE.md +241 -0
  246. package/dist/templates/claude-config/app/.agents/skills/turborepo/references/best-practices/dependencies.md +246 -0
  247. package/dist/templates/claude-config/app/.agents/skills/turborepo/references/best-practices/packages.md +335 -0
  248. package/dist/templates/claude-config/app/.agents/skills/turborepo/references/best-practices/structure.md +270 -0
  249. package/dist/templates/claude-config/app/.agents/skills/turborepo/references/boundaries/RULE.md +126 -0
  250. package/dist/templates/claude-config/app/.agents/skills/turborepo/references/caching/RULE.md +107 -0
  251. package/dist/templates/claude-config/app/.agents/skills/turborepo/references/caching/gotchas.md +169 -0
  252. package/dist/templates/claude-config/app/.agents/skills/turborepo/references/caching/remote-cache.md +127 -0
  253. package/dist/templates/claude-config/app/.agents/skills/turborepo/references/ci/RULE.md +79 -0
  254. package/dist/templates/claude-config/app/.agents/skills/turborepo/references/ci/github-actions.md +162 -0
  255. package/dist/templates/claude-config/app/.agents/skills/turborepo/references/ci/patterns.md +145 -0
  256. package/dist/templates/claude-config/app/.agents/skills/turborepo/references/ci/vercel.md +103 -0
  257. package/dist/templates/claude-config/app/.agents/skills/turborepo/references/cli/RULE.md +100 -0
  258. package/dist/templates/claude-config/app/.agents/skills/turborepo/references/cli/commands.md +297 -0
  259. package/dist/templates/claude-config/app/.agents/skills/turborepo/references/configuration/RULE.md +211 -0
  260. package/dist/templates/claude-config/app/.agents/skills/turborepo/references/configuration/global-options.md +191 -0
  261. package/dist/templates/claude-config/app/.agents/skills/turborepo/references/configuration/gotchas.md +348 -0
  262. package/dist/templates/claude-config/app/.agents/skills/turborepo/references/configuration/tasks.md +281 -0
  263. package/dist/templates/claude-config/app/.agents/skills/turborepo/references/environment/RULE.md +96 -0
  264. package/dist/templates/claude-config/app/.agents/skills/turborepo/references/environment/gotchas.md +141 -0
  265. package/dist/templates/claude-config/app/.agents/skills/turborepo/references/environment/modes.md +101 -0
  266. package/dist/templates/claude-config/app/.agents/skills/turborepo/references/filtering/RULE.md +148 -0
  267. package/dist/templates/claude-config/app/.agents/skills/turborepo/references/filtering/patterns.md +152 -0
  268. package/dist/templates/claude-config/app/.agents/skills/turborepo/references/watch/RULE.md +99 -0
  269. package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/AGENTS.md +917 -0
  270. package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/SKILL.md +88 -0
  271. package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md +94 -0
  272. package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/rules/architecture-compound-components.md +108 -0
  273. package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md +84 -0
  274. package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/rules/patterns-explicit-variants.md +94 -0
  275. package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/rules/react19-no-forwardref.md +42 -0
  276. package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/rules/state-context-interface.md +191 -0
  277. package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/rules/state-decouple-implementation.md +103 -0
  278. package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/rules/state-lift-state.md +125 -0
  279. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/AGENTS.md +2883 -0
  280. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/SKILL.md +138 -0
  281. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  282. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  283. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  284. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/async-api-routes.md +35 -0
  285. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
  286. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/async-dependencies.md +48 -0
  287. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/async-parallel.md +24 -0
  288. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  289. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
  290. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/bundle-conditional.md +37 -0
  291. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +48 -0
  292. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +34 -0
  293. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/bundle-preload.md +44 -0
  294. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/client-event-listeners.md +78 -0
  295. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +74 -0
  296. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  297. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  298. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +110 -0
  299. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  300. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  301. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-cache-storage.md +68 -0
  302. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  303. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  304. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  305. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  306. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-length-check-first.md +50 -0
  307. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  308. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  309. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  310. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  311. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +38 -0
  312. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +32 -0
  313. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  314. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +36 -0
  315. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +72 -0
  316. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +26 -0
  317. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  318. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  319. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  320. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  321. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  322. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  323. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +77 -0
  324. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +56 -0
  325. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +36 -0
  326. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  327. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  328. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  329. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  330. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  331. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  332. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  333. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  334. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  335. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  336. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  337. package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
  338. package/dist/templates/claude-config/app/.agents/skills/web-design-guidelines/SKILL.md +40 -0
  339. package/dist/templates/claude-config/app/.agents/skills/workflow/SKILL.md +181 -0
  340. package/dist/templates/claude-config/app/.claude/commands/council.md +7 -0
  341. package/dist/templates/claude-config/app/.claude/commands/deslop.md +25 -0
  342. package/dist/templates/claude-config/app/.claude/commands/diagram.md +101 -0
  343. package/dist/templates/claude-config/app/.claude/commands/fix-merge.md +47 -0
  344. package/dist/templates/claude-config/app/.claude/commands/you-might-not-need-an-effect.md +10 -0
  345. package/dist/templates/claude-config/app/.claude/hooks/post-tool-use-tracker.sh +187 -0
  346. package/dist/templates/claude-config/app/.claude/hooks/skill-activation-prompt.sh +5 -0
  347. package/dist/templates/claude-config/app/.claude/hooks/skill-activation-prompt.ts +134 -0
  348. package/dist/templates/claude-config/app/.claude/rules/comments.md +12 -0
  349. package/dist/templates/claude-config/app/.claude/rules/typescript.md +31 -0
  350. package/dist/templates/claude-config/app/.claude/settings.json.hbs +74 -0
  351. package/dist/templates/claude-config/app/.claude/skills/skill-rules.json.hbs +309 -0
  352. package/dist/templates/claude-config/app/AGENTS.md.hbs +185 -0
  353. package/dist/templates/claude-config/app/CLAUDE.md.hbs +5 -0
  354. package/dist/templates/claude-config/kustomize/.agents/skills/git-commit/SKILL.md +124 -0
  355. package/dist/templates/claude-config/kustomize/.agents/skills/k8s-manifest-generator/SKILL.md +534 -0
  356. package/dist/templates/claude-config/kustomize/.agents/skills/k8s-manifest-generator/assets/configmap-template.yaml +296 -0
  357. package/dist/templates/claude-config/kustomize/.agents/skills/k8s-manifest-generator/assets/deployment-template.yaml +203 -0
  358. package/dist/templates/claude-config/kustomize/.agents/skills/k8s-manifest-generator/assets/service-template.yaml +171 -0
  359. package/dist/templates/claude-config/kustomize/.agents/skills/k8s-manifest-generator/references/deployment-spec.md +780 -0
  360. package/dist/templates/claude-config/kustomize/.agents/skills/k8s-manifest-generator/references/service-spec.md +748 -0
  361. package/dist/templates/claude-config/kustomize/.claude/settings.json +42 -0
  362. package/dist/templates/claude-config/kustomize/.claude/skills/git-commit/SKILL.md +124 -0
  363. package/dist/templates/claude-config/kustomize/.claude/skills/k8s-manifest-generator/SKILL.md +534 -0
  364. package/dist/templates/claude-config/kustomize/.claude/skills/k8s-manifest-generator/assets/configmap-template.yaml +296 -0
  365. package/dist/templates/claude-config/kustomize/.claude/skills/k8s-manifest-generator/assets/deployment-template.yaml +203 -0
  366. package/dist/templates/claude-config/kustomize/.claude/skills/k8s-manifest-generator/assets/service-template.yaml +171 -0
  367. package/dist/templates/claude-config/kustomize/.claude/skills/k8s-manifest-generator/references/deployment-spec.md +780 -0
  368. package/dist/templates/claude-config/kustomize/.claude/skills/k8s-manifest-generator/references/service-spec.md +748 -0
  369. package/dist/templates/docker/.dockerignore.hbs +8 -0
  370. package/dist/templates/docker/Dockerfile.hbs +81 -0
  371. package/dist/templates/docker/docker-compose.yml.hbs +55 -0
  372. package/dist/templates/kustomize/base/deployments/app.yaml.hbs +44 -0
  373. package/dist/templates/kustomize/base/ingress/app.yaml.hbs +20 -0
  374. package/dist/templates/kustomize/base/jobs/app-jobs.yaml.hbs +43 -0
  375. package/dist/templates/kustomize/base/kustomization.yaml.hbs +13 -0
  376. package/dist/templates/kustomize/base/secrets/regcred.yaml.hbs +7 -0
  377. package/dist/templates/kustomize/base/services/app.yaml.hbs +12 -0
  378. package/dist/templates/kustomize/overlays/{{env}}/configs/app.config.env.hbs +21 -0
  379. package/dist/templates/kustomize/overlays/{{env}}/configs/paradedb.config.env.hbs +3 -0
  380. package/dist/templates/kustomize/overlays/{{env}}/deployments/paradedb.yaml.hbs +28 -0
  381. package/dist/templates/kustomize/overlays/{{env}}/deployments/redis.yaml.hbs +18 -0
  382. package/dist/templates/kustomize/overlays/{{env}}/kustomization.yaml.hbs +36 -0
  383. package/dist/templates/kustomize/overlays/{{env}}/patch-operation/ingress-host.yaml.hbs +15 -0
  384. package/dist/templates/kustomize/overlays/{{env}}/services/paradedb.yaml.hbs +11 -0
  385. package/dist/templates/kustomize/overlays/{{env}}/services/redis.yaml.hbs +11 -0
  386. package/dist/templates/kustomize/overlays/{{env}}/storage/paradedb-pvc.yaml.hbs +10 -0
  387. package/dist/templates/presets/ai-chat-app/apps/web/.env.example +11 -0
  388. package/dist/templates/presets/ai-chat-app/apps/web/app/api/auth/[...all]/route.ts +5 -0
  389. package/dist/templates/presets/ai-chat-app/apps/web/app/api/chat/input-guardrail.ts +47 -0
  390. package/dist/templates/presets/ai-chat-app/apps/web/app/api/chat/route.ts +266 -0
  391. package/dist/templates/presets/ai-chat-app/apps/web/app/api/chat/sessions/[id]/messages/route.ts +38 -0
  392. package/dist/templates/presets/ai-chat-app/apps/web/app/api/chat/sessions/[id]/route.ts +59 -0
  393. package/dist/templates/presets/ai-chat-app/apps/web/app/api/chat/sessions/route.ts +24 -0
  394. package/dist/templates/presets/ai-chat-app/apps/web/app/api/health/route.ts +21 -0
  395. package/dist/templates/presets/ai-chat-app/apps/web/app/chat/[id]/page.tsx +54 -0
  396. package/dist/templates/presets/ai-chat-app/apps/web/app/chat/layout.tsx +23 -0
  397. package/dist/templates/presets/ai-chat-app/apps/web/app/chat/page.tsx +9 -0
  398. package/dist/templates/presets/ai-chat-app/apps/web/app/error.tsx +20 -0
  399. package/dist/templates/presets/ai-chat-app/apps/web/app/global-error.tsx +42 -0
  400. package/dist/templates/presets/ai-chat-app/apps/web/app/globals.css +187 -0
  401. package/dist/templates/presets/ai-chat-app/apps/web/app/layout.tsx.hbs +30 -0
  402. package/dist/templates/presets/ai-chat-app/apps/web/app/login/login-form.tsx +96 -0
  403. package/dist/templates/presets/ai-chat-app/apps/web/app/login/page.tsx +14 -0
  404. package/dist/templates/presets/ai-chat-app/apps/web/app/not-found.tsx +15 -0
  405. package/dist/templates/presets/ai-chat-app/apps/web/components/ai-elements/code-block.tsx +518 -0
  406. package/dist/templates/presets/ai-chat-app/apps/web/components/ai-elements/context.tsx +356 -0
  407. package/dist/templates/presets/ai-chat-app/apps/web/components/ai-elements/conversation.tsx +150 -0
  408. package/dist/templates/presets/ai-chat-app/apps/web/components/ai-elements/environment-variables.tsx +303 -0
  409. package/dist/templates/presets/ai-chat-app/apps/web/components/ai-elements/message.tsx +295 -0
  410. package/dist/templates/presets/ai-chat-app/apps/web/components/ai-elements/prompt-input.tsx +1179 -0
  411. package/dist/templates/presets/ai-chat-app/apps/web/components/ai-elements/sources.tsx +54 -0
  412. package/dist/templates/presets/ai-chat-app/apps/web/components/ai-elements/tool.tsx +157 -0
  413. package/dist/templates/presets/ai-chat-app/apps/web/components/app-sidebar.tsx +110 -0
  414. package/dist/templates/presets/ai-chat-app/apps/web/components/chat-sessions-provider.tsx +89 -0
  415. package/dist/templates/presets/ai-chat-app/apps/web/components/chat-sidebar-list.tsx +174 -0
  416. package/dist/templates/presets/ai-chat-app/apps/web/components/chat-view.tsx +156 -0
  417. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/accordion.tsx +72 -0
  418. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/alert-dialog.tsx +162 -0
  419. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/alert.tsx +73 -0
  420. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/aspect-ratio.tsx +22 -0
  421. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/avatar.tsx +93 -0
  422. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/badge.tsx +49 -0
  423. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/breadcrumb.tsx +103 -0
  424. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/button-group.tsx +78 -0
  425. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/button.tsx +60 -0
  426. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/calendar.tsx +185 -0
  427. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/card.tsx +92 -0
  428. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/carousel.tsx +231 -0
  429. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/chart.tsx +325 -0
  430. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/checkbox.tsx +28 -0
  431. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/collapsible.tsx +17 -0
  432. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/combobox.tsx +273 -0
  433. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/command.tsx +181 -0
  434. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/context-menu.tsx +245 -0
  435. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/dialog.tsx +135 -0
  436. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/direction.tsx +3 -0
  437. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/drawer.tsx +120 -0
  438. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/dropdown-menu.tsx +258 -0
  439. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/empty.tsx +94 -0
  440. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/field.tsx +224 -0
  441. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/hover-card.tsx +46 -0
  442. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/input-group.tsx +146 -0
  443. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/input-otp.tsx +86 -0
  444. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/input.tsx +20 -0
  445. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/item.tsx +188 -0
  446. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/kbd.tsx +26 -0
  447. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/label.tsx +20 -0
  448. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/menubar.tsx +270 -0
  449. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/native-select.tsx +43 -0
  450. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/navigation-menu.tsx +161 -0
  451. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/pagination.tsx +118 -0
  452. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/popover.tsx +77 -0
  453. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/progress.tsx +66 -0
  454. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/radio-group.tsx +39 -0
  455. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/resizable.tsx +42 -0
  456. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/scroll-area.tsx +51 -0
  457. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/select.tsx +190 -0
  458. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/separator.tsx +21 -0
  459. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/sheet.tsx +125 -0
  460. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/sidebar.tsx +689 -0
  461. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/skeleton.tsx +13 -0
  462. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/slider.tsx +54 -0
  463. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/sonner.tsx +45 -0
  464. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/spinner.tsx +15 -0
  465. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/switch.tsx +32 -0
  466. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/table.tsx +89 -0
  467. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/tabs.tsx +75 -0
  468. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/textarea.tsx +18 -0
  469. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/toggle-group.tsx +87 -0
  470. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/toggle.tsx +44 -0
  471. package/dist/templates/presets/ai-chat-app/apps/web/components/ui/tooltip.tsx +54 -0
  472. package/dist/templates/presets/ai-chat-app/apps/web/components.json +20 -0
  473. package/dist/templates/presets/ai-chat-app/apps/web/drizzle.config.ts +10 -0
  474. package/dist/templates/presets/ai-chat-app/apps/web/env.ts +30 -0
  475. package/dist/templates/presets/ai-chat-app/apps/web/hooks/use-mobile.ts +19 -0
  476. package/dist/templates/presets/ai-chat-app/apps/web/instrumentation.ts +21 -0
  477. package/dist/templates/presets/ai-chat-app/apps/web/lib/auth-client.ts +3 -0
  478. package/dist/templates/presets/ai-chat-app/apps/web/lib/auth-session.ts +9 -0
  479. package/dist/templates/presets/ai-chat-app/apps/web/lib/auth.ts +16 -0
  480. package/dist/templates/presets/ai-chat-app/apps/web/lib/db/index.ts +11 -0
  481. package/dist/templates/presets/ai-chat-app/apps/web/lib/db/migrate.ts +53 -0
  482. package/dist/templates/presets/ai-chat-app/apps/web/lib/db/schema.ts +94 -0
  483. package/dist/templates/presets/ai-chat-app/apps/web/lib/db/seed.ts +123 -0
  484. package/dist/templates/presets/ai-chat-app/apps/web/lib/group-by-date.ts +34 -0
  485. package/dist/templates/presets/ai-chat-app/apps/web/lib/logger.ts +21 -0
  486. package/dist/templates/presets/ai-chat-app/apps/web/lib/openrouter.ts +7 -0
  487. package/dist/templates/presets/ai-chat-app/apps/web/lib/schemas/auth.ts +8 -0
  488. package/dist/templates/presets/ai-chat-app/apps/web/lib/utils.ts +4 -0
  489. package/dist/templates/presets/ai-chat-app/apps/web/next-env.d.ts +6 -0
  490. package/dist/templates/presets/ai-chat-app/apps/web/next.config.ts +14 -0
  491. package/dist/templates/presets/ai-chat-app/apps/web/package.json +70 -0
  492. package/dist/templates/presets/ai-chat-app/apps/web/postcss.config.mjs +7 -0
  493. package/dist/templates/presets/ai-chat-app/apps/web/proxy.ts +13 -0
  494. package/dist/templates/presets/ai-chat-app/apps/web/tsconfig.json +14 -0
  495. package/dist/templates/presets/blank/apps/web/.env.example +1 -0
  496. package/dist/templates/presets/blank/apps/web/app/api/health/route.ts +11 -0
  497. package/dist/templates/presets/blank/apps/web/app/globals.css +49 -0
  498. package/dist/templates/presets/blank/apps/web/app/layout.tsx.hbs +30 -0
  499. package/dist/templates/presets/blank/apps/web/app/page.tsx.hbs +10 -0
  500. package/dist/templates/presets/blank/apps/web/env.ts +10 -0
  501. package/dist/templates/presets/blank/apps/web/next-env.d.ts +2 -0
  502. package/dist/templates/presets/blank/apps/web/next.config.ts +9 -0
  503. package/dist/templates/presets/blank/apps/web/package.json.hbs +27 -0
  504. package/dist/templates/presets/blank/apps/web/postcss.config.mjs +7 -0
  505. package/dist/templates/presets/blank/apps/web/tsconfig.json +14 -0
  506. package/dist/templates/tooling/.oxfmtrc.json +6 -0
  507. package/dist/templates/tooling/.oxlintrc.json +20 -0
  508. package/dist/templates/tooling/commitlint.config.ts.hbs +3 -0
  509. package/dist/templates/tooling/lefthook.yml.hbs +25 -0
  510. package/package.json +47 -0
@@ -0,0 +1,275 @@
1
+ # Tool
2
+
3
+ A collapsible component for displaying tool invocation details in AI chatbot interfaces.
4
+
5
+ The `Tool` component displays a collapsible interface for showing/hiding tool details. It is designed to take the `ToolUIPart` type from the AI SDK and display it in a collapsible interface.
6
+
7
+ See `scripts/tool.tsx` for this example.
8
+
9
+ ## Installation
10
+
11
+ ```bash
12
+ npx ai-elements@latest add tool
13
+ ```
14
+
15
+ ## Usage in AI SDK
16
+
17
+ Build a simple stateful weather app that renders the last message in a tool using [`useChat`](/docs/reference/ai-sdk-ui/use-chat).
18
+
19
+ Add the following component to your frontend:
20
+
21
+ ```tsx title="app/page.tsx"
22
+ "use client";
23
+
24
+ import { useChat } from "@ai-sdk/react";
25
+ import { DefaultChatTransport, type ToolUIPart } from "ai";
26
+ import { Button } from "@/components/ui/button";
27
+ import { MessageResponse } from "@/components/ai-elements/message";
28
+ import {
29
+ Tool,
30
+ ToolContent,
31
+ ToolHeader,
32
+ ToolInput,
33
+ ToolOutput,
34
+ } from "@/components/ai-elements/tool";
35
+
36
+ type WeatherToolInput = {
37
+ location: string;
38
+ units: "celsius" | "fahrenheit";
39
+ };
40
+
41
+ type WeatherToolOutput = {
42
+ location: string;
43
+ temperature: string;
44
+ conditions: string;
45
+ humidity: string;
46
+ windSpeed: string;
47
+ lastUpdated: string;
48
+ };
49
+
50
+ type WeatherToolUIPart = ToolUIPart<{
51
+ fetch_weather_data: {
52
+ input: WeatherToolInput;
53
+ output: WeatherToolOutput;
54
+ };
55
+ }>;
56
+
57
+ const Example = () => {
58
+ const { messages, sendMessage, status } = useChat({
59
+ transport: new DefaultChatTransport({
60
+ api: "/api/weather",
61
+ }),
62
+ });
63
+
64
+ const handleWeatherClick = () => {
65
+ sendMessage({ text: "Get weather data for San Francisco in fahrenheit" });
66
+ };
67
+
68
+ const latestMessage = messages[messages.length - 1];
69
+ const weatherTool = latestMessage?.parts?.find(
70
+ (part) => part.type === "tool-fetch_weather_data",
71
+ ) as WeatherToolUIPart | undefined;
72
+
73
+ return (
74
+ <div className="max-w-4xl mx-auto p-6 relative size-full rounded-lg border h-[600px]">
75
+ <div className="flex flex-col h-full">
76
+ <div className="space-y-4">
77
+ <Button onClick={handleWeatherClick} disabled={status !== "ready"}>
78
+ Get Weather for San Francisco
79
+ </Button>
80
+
81
+ {weatherTool && (
82
+ <Tool defaultOpen={true}>
83
+ <ToolHeader type="tool-fetch_weather_data" state={weatherTool.state} />
84
+ <ToolContent>
85
+ <ToolInput input={weatherTool.input} />
86
+ <ToolOutput
87
+ output={
88
+ <MessageResponse>{formatWeatherResult(weatherTool.output)}</MessageResponse>
89
+ }
90
+ errorText={weatherTool.errorText}
91
+ />
92
+ </ToolContent>
93
+ </Tool>
94
+ )}
95
+ </div>
96
+ </div>
97
+ </div>
98
+ );
99
+ };
100
+
101
+ function formatWeatherResult(result: WeatherToolOutput): string {
102
+ return `**Weather for ${result.location}**
103
+
104
+ **Temperature:** ${result.temperature}
105
+ **Conditions:** ${result.conditions}
106
+ **Humidity:** ${result.humidity}
107
+ **Wind Speed:** ${result.windSpeed}
108
+
109
+ *Last updated: ${result.lastUpdated}*`;
110
+ }
111
+
112
+ export default Example;
113
+ ```
114
+
115
+ Add the following route to your backend:
116
+
117
+ ```ts title="app/api/weather/route.tsx"
118
+ import { streamText, UIMessage, convertToModelMessages } from "ai";
119
+ import { z } from "zod";
120
+
121
+ // Allow streaming responses up to 30 seconds
122
+ export const maxDuration = 30;
123
+
124
+ export async function POST(req: Request) {
125
+ const { messages }: { messages: UIMessage[] } = await req.json();
126
+
127
+ const result = streamText({
128
+ model: "openai/gpt-4o",
129
+ messages: await convertToModelMessages(messages),
130
+ tools: {
131
+ fetch_weather_data: {
132
+ description: "Fetch weather information for a specific location",
133
+ parameters: z.object({
134
+ location: z.string().describe("The city or location to get weather for"),
135
+ units: z.enum(["celsius", "fahrenheit"]).default("celsius").describe("Temperature units"),
136
+ }),
137
+ inputSchema: z.object({
138
+ location: z.string(),
139
+ units: z.enum(["celsius", "fahrenheit"]).default("celsius"),
140
+ }),
141
+ execute: async ({ location, units }) => {
142
+ await new Promise((resolve) => setTimeout(resolve, 1500));
143
+
144
+ const temp =
145
+ units === "celsius"
146
+ ? Math.floor(Math.random() * 35) + 5
147
+ : Math.floor(Math.random() * 63) + 41;
148
+
149
+ return {
150
+ location,
151
+ temperature: `${temp}°${units === "celsius" ? "C" : "F"}`,
152
+ conditions: "Sunny",
153
+ humidity: `12%`,
154
+ windSpeed: `35 ${units === "celsius" ? "km/h" : "mph"}`,
155
+ lastUpdated: new Date().toLocaleString(),
156
+ };
157
+ },
158
+ },
159
+ },
160
+ });
161
+
162
+ return result.toUIMessageStreamResponse();
163
+ }
164
+ ```
165
+
166
+ ## Features
167
+
168
+ - Collapsible interface for showing/hiding tool details
169
+ - Visual status indicators with icons and badges
170
+ - Support for multiple tool execution states (pending, running, completed, error)
171
+ - Formatted parameter display with JSON syntax highlighting
172
+ - Result and error handling with appropriate styling
173
+ - Composable structure for flexible layouts
174
+ - Accessible keyboard navigation and screen reader support
175
+ - Consistent styling that matches your design system
176
+ - Auto-opens completed tools by default for better UX
177
+
178
+ ## Examples
179
+
180
+ ### Input Streaming (Pending)
181
+
182
+ Shows a tool in its initial state while parameters are being processed.
183
+
184
+ See `scripts/tool-input-streaming.tsx` for this example.
185
+
186
+ ### Input Available (Running)
187
+
188
+ Shows a tool that's actively executing with its parameters.
189
+
190
+ See `scripts/tool-input-available.tsx` for this example.
191
+
192
+ ### Output Available (Completed)
193
+
194
+ Shows a completed tool with successful results. Opens by default to show the results. In this instance, the output is a JSON object, so we can use the `CodeBlock` component to display it.
195
+
196
+ See `scripts/tool-output-available.tsx` for this example.
197
+
198
+ ### Output Error
199
+
200
+ Shows a tool that encountered an error during execution. Opens by default to display the error.
201
+
202
+ See `scripts/tool-output-error.tsx` for this example.
203
+
204
+ ## Props
205
+
206
+ ### `<Tool />`
207
+
208
+ | Prop | Type | Default | Description |
209
+ | ---------- | ------------------------------------------ | ------- | ------------------------------------------------------------- |
210
+ | `...props` | `React.ComponentProps<typeof Collapsible>` | - | Any other props are spread to the root Collapsible component. |
211
+
212
+ ### `<ToolHeader />`
213
+
214
+ | Prop | Type | Default | Description |
215
+ | ----------- | ------------------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------- |
216
+ | `title` | `string` | - | Custom title to display instead of the derived tool name. |
217
+ | `type` | `ToolUIPart[` | Required | The type/name of the tool. |
218
+ | `state` | `ToolUIPart[` | Required | The current state of the tool (input-streaming, input-available, output-available, or output-error). |
219
+ | `toolName` | `string` | - | Required when type is |
220
+ | `className` | `string` | - | Additional CSS classes to apply to the header. |
221
+ | `...props` | `React.ComponentProps<typeof CollapsibleTrigger>` | - | Any other props are spread to the CollapsibleTrigger. |
222
+
223
+ ### `<ToolContent />`
224
+
225
+ | Prop | Type | Default | Description |
226
+ | ---------- | ------------------------------------------------- | ------- | ----------------------------------------------------- |
227
+ | `...props` | `React.ComponentProps<typeof CollapsibleContent>` | - | Any other props are spread to the CollapsibleContent. |
228
+
229
+ ### `<ToolInput />`
230
+
231
+ | Prop | Type | Default | Description |
232
+ | ---------- | ----------------------- | ------- | --------------------------------------------------------------------- |
233
+ | `input` | `ToolUIPart[` | - | The input parameters passed to the tool, displayed as formatted JSON. |
234
+ | `...props` | `React.ComponentProps<` | - | Any other props are spread to the underlying div. |
235
+
236
+ ### `<ToolOutput />`
237
+
238
+ | Prop | Type | Default | Description |
239
+ | ----------- | ----------------------- | ------- | ------------------------------------------------- |
240
+ | `output` | `React.ReactNode` | - | The output/result of the tool execution. |
241
+ | `errorText` | `ToolUIPart[` | - | An error message if the tool execution failed. |
242
+ | `...props` | `React.ComponentProps<` | - | Any other props are spread to the underlying div. |
243
+
244
+ ## Type Exports
245
+
246
+ ### `ToolPart`
247
+
248
+ Union type representing both static and dynamic tool UI parts.
249
+
250
+ ```tsx
251
+ type ToolPart = ToolUIPart | DynamicToolUIPart;
252
+ ```
253
+
254
+ ## Utilities
255
+
256
+ ### `getStatusBadge`
257
+
258
+ Returns a Badge component with icon and label based on tool state.
259
+
260
+ ```tsx
261
+ import { getStatusBadge } from "@/components/ai-elements/tool";
262
+
263
+ // Returns a Badge with appropriate icon and label
264
+ const badge = getStatusBadge("output-available");
265
+ ```
266
+
267
+ Supported states:
268
+
269
+ - `input-streaming` - "Pending"
270
+ - `input-available` - "Running"
271
+ - `approval-requested` - "Awaiting Approval"
272
+ - `approval-responded` - "Responded"
273
+ - `output-available` - "Completed"
274
+ - `output-error` - "Error"
275
+ - `output-denied` - "Denied"
@@ -0,0 +1,30 @@
1
+ # Toolbar
2
+
3
+ A styled toolbar component for React Flow nodes with flexible positioning and custom actions.
4
+
5
+ The `Toolbar` component provides a positioned toolbar that attaches to nodes in React Flow canvases. It features modern card styling with backdrop blur and flexbox layout for action buttons and controls.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npx ai-elements@latest add toolbar
11
+ ```
12
+
13
+ ## Features
14
+
15
+ - Attaches to any React Flow node
16
+ - Bottom positioning by default
17
+ - Rounded card design with border
18
+ - Theme-aware background styling
19
+ - Flexbox layout with gap spacing
20
+ - Full TypeScript support
21
+ - Compatible with all React Flow NodeToolbar features
22
+
23
+ ## Props
24
+
25
+ ### `<Toolbar />`
26
+
27
+ | Prop | Type | Default | Description |
28
+ | ----------- | ------------------------------------ | ------- | --------------------------------------------------------------------------------------------- |
29
+ | `className` | `string` | - | Additional CSS classes to apply to the toolbar. |
30
+ | `...props` | `ComponentProps<typeof NodeToolbar>` | - | Any other props from @xyflow/react NodeToolbar component (position, offset, isVisible, etc.). |
@@ -0,0 +1,120 @@
1
+ # Transcription
2
+
3
+ A composable component for displaying interactive, synchronized transcripts from AI SDK transcribe() results with click-to-seek functionality.
4
+
5
+ The `Transcription` component provides a flexible render props interface for displaying audio transcripts with synchronized playback. It automatically highlights the current segment based on playback time and supports click-to-seek functionality for interactive navigation.
6
+
7
+ See `scripts/transcription.tsx` for this example.
8
+
9
+ ## Installation
10
+
11
+ ```bash
12
+ npx ai-elements@latest add transcription
13
+ ```
14
+
15
+ ## Features
16
+
17
+ - Render props pattern for maximum flexibility
18
+ - Automatic segment highlighting based on current time
19
+ - Click-to-seek functionality for interactive navigation
20
+ - Controlled and uncontrolled component patterns
21
+ - Automatic filtering of empty segments
22
+ - Visual state indicators (active, past, future)
23
+ - Built on Radix UI's `useControllableState` for flexible state management
24
+ - Full TypeScript support with AI SDK transcription types
25
+
26
+ ## Props
27
+
28
+ ### `<Transcription />`
29
+
30
+ Root component that provides context and manages transcript state. Uses render props pattern for rendering segments.
31
+
32
+ | Prop | Type | Default | Description |
33
+ | ------------- | ------------------------------------------------------------- | ------- | --------------------------------------------------------------------- |
34
+ | `segments` | `TranscriptionSegment[]` | - | Array of transcription segments from AI SDK transcribe() function. |
35
+ | `currentTime` | `number` | `0` | Current playback time in seconds (controlled). |
36
+ | `onSeek` | `(time: number) => void` | - | Callback fired when a segment is clicked or when currentTime changes. |
37
+ | `children` | `(segment: TranscriptionSegment, index: number) => ReactNode` | - | Render function that receives each segment and its index. |
38
+ | `...props` | `Omit<React.ComponentProps<` | - | Any other props are spread to the root div element. |
39
+
40
+ ### `<TranscriptionSegment />`
41
+
42
+ Individual segment button with automatic state styling and click-to-seek functionality.
43
+
44
+ | Prop | Type | Default | Description |
45
+ | ---------- | ----------------------- | ------- | ------------------------------------------------- |
46
+ | `segment` | `TranscriptionSegment` | - | The transcription segment data. |
47
+ | `index` | `number` | - | The segment index. |
48
+ | `...props` | `React.ComponentProps<` | - | Any other props are spread to the button element. |
49
+
50
+ ## Behavior
51
+
52
+ ### Render Props Pattern
53
+
54
+ The component uses a render props pattern where the `children` prop is a function that receives each segment and its index. This provides maximum flexibility for custom rendering while still benefiting from automatic state management and context.
55
+
56
+ ### Segment Highlighting
57
+
58
+ Segments are automatically styled based on their relationship to the current playback time:
59
+
60
+ - **Active** (`isActive`): When `currentTime` is within the segment's time range. Styled with primary color.
61
+ - **Past** (`isPast`): When `currentTime` is after the segment's end time. Styled with muted foreground.
62
+ - **Future**: When `currentTime` is before the segment's start time. Styled with dimmed muted foreground.
63
+
64
+ ### Click-to-Seek
65
+
66
+ When `onSeek` is provided, segments become interactive buttons. Clicking a segment calls `onSeek` with the segment's start time, allowing your audio/video player to seek to that position.
67
+
68
+ ### Empty Segment Filtering
69
+
70
+ The component automatically filters out segments with empty or whitespace-only text to avoid rendering unnecessary elements.
71
+
72
+ ### State Management
73
+
74
+ Uses Radix UI's `useControllableState` hook to support both controlled and uncontrolled patterns. When `currentTime` is provided, the component operates in controlled mode. Otherwise, it maintains its own internal state.
75
+
76
+ ## Data Format
77
+
78
+ The component expects segments from the AI SDK `transcribe()` function:
79
+
80
+ ```ts
81
+ type TranscriptionSegment = {
82
+ text: string;
83
+ startSecond: number;
84
+ endSecond: number;
85
+ };
86
+ ```
87
+
88
+ ## Styling
89
+
90
+ The component uses data attributes for custom styling:
91
+
92
+ - `data-slot="transcription"`: Root container
93
+ - `data-slot="transcription-segment"`: Individual segment button
94
+ - `data-active`: Present on the currently playing segment
95
+ - `data-index`: The segment's index in the array
96
+
97
+ Default segment appearance:
98
+
99
+ - Active segment: `text-primary` (primary brand color)
100
+ - Past segments: `text-muted-foreground`
101
+ - Future segments: `text-muted-foreground/60` (dimmed)
102
+ - Interactive segments: `cursor-pointer hover:text-foreground`
103
+ - Non-interactive segments: `cursor-default`
104
+
105
+ ## Accessibility
106
+
107
+ - Uses semantic `<button>` elements for interactive segments
108
+ - Full keyboard navigation support
109
+ - Proper button semantics for screen readers
110
+ - `data-active` attribute for assistive technology
111
+ - Hover and focus states for keyboard users
112
+
113
+ ## Notes
114
+
115
+ - Empty or whitespace-only segments are automatically filtered out
116
+ - The component uses `flex-wrap` for responsive text flow
117
+ - Segments maintain inline layout with `gap-1` spacing
118
+ - `text-sm` and `leading-relaxed` provide comfortable reading
119
+ - Click events on segments still fire the `onClick` handler if provided
120
+ - The `onSeek` callback is called both when segments are clicked and when controlled `currentTime` changes
@@ -0,0 +1,241 @@
1
+ # Voice Selector
2
+
3
+ A composable dialog component for selecting AI voices with metadata display and search functionality.
4
+
5
+ The `VoiceSelector` component provides a flexible and composable interface for selecting AI voices. Built on shadcn/ui's Dialog and Command components, it features a searchable voice list with support for metadata display (gender, accent, age), grouping, and customizable layouts. The component includes a context provider for accessing voice selection state from any nested component.
6
+
7
+ See `scripts/voice-selector.tsx` for this example.
8
+
9
+ ## Installation
10
+
11
+ ```bash
12
+ npx ai-elements@latest add voice-selector
13
+ ```
14
+
15
+ ## Features
16
+
17
+ - Fully composable architecture with granular control components
18
+ - Built on shadcn/ui Dialog and Command components
19
+ - React Context API for accessing state in nested components
20
+ - Searchable voice list with real-time filtering
21
+ - Support for voice metadata with icons and emojis (gender icons, accent flags, age)
22
+ - Voice preview button with play/pause/loading states
23
+ - Voice grouping with separators and bullet dividers
24
+ - Keyboard navigation support
25
+ - Controlled and uncontrolled component patterns
26
+ - Full TypeScript support with proper types for all components
27
+
28
+ ## Props
29
+
30
+ ### `<VoiceSelector />`
31
+
32
+ Root Dialog component that provides context for all child components. Manages both voice selection and dialog open states.
33
+
34
+ | Prop | Type | Default | Description |
35
+ | --------------- | ------------------------------------- | ------------------- | --------------------------------------------------------------------------- | ----------------------------------------------- |
36
+ | `value` | `string` | - | The selected voice ID (controlled). |
37
+ | `defaultValue` | `string` | - | The default selected voice ID (uncontrolled). |
38
+ | `onValueChange` | `(value: string | undefined) => void` | - | Callback fired when the selected voice changes. |
39
+ | `defaultOpen` | `boolean` | `false` | The default open state (uncontrolled). |
40
+ | `open` | `boolean` | - | The open state (controlled). |
41
+ | `onOpenChange` | `(open: boolean) => void` | - | Callback fired when the open state changes. |
42
+ | `modal` | `boolean` | `true` | Whether the dialog is modal (blocks interaction with the rest of the page). |
43
+ | `...props` | `React.ComponentProps<typeof Dialog>` | - | Any other props are spread to the Dialog component. |
44
+
45
+ ### `<VoiceSelectorTrigger />`
46
+
47
+ Button or element that opens the voice selector dialog.
48
+
49
+ | Prop | Type | Default | Description |
50
+ | ---------- | -------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------- |
51
+ | `asChild` | `boolean` | `false` | Change the default rendered element for the one passed as a child, merging their props and behavior. |
52
+ | `...props` | `React.ComponentProps<typeof DialogTrigger>` | - | Any other props are spread to the DialogTrigger component. |
53
+
54
+ ### `<VoiceSelectorContent />`
55
+
56
+ Container for the Command component and voice list, rendered inside the dialog.
57
+
58
+ | Prop | Type | Default | Description |
59
+ | ----------- | -------------------------------------------- | ------- | --------------------------------------------------------------------------------------- |
60
+ | `title` | `ReactNode` | - | The title for screen readers. Hidden visually but accessible to assistive technologies. |
61
+ | `className` | `string` | - | Additional CSS classes to apply to the dialog content. |
62
+ | `...props` | `React.ComponentProps<typeof DialogContent>` | - | Any other props are spread to the DialogContent component. |
63
+
64
+ ### `<VoiceSelectorDialog />`
65
+
66
+ Alternative dialog implementation using CommandDialog for a full-screen command palette style.
67
+
68
+ | Prop | Type | Default | Description |
69
+ | ---------- | -------------------------------------------- | ------- | ---------------------------------------------------------- |
70
+ | `...props` | `React.ComponentProps<typeof CommandDialog>` | - | Any other props are spread to the CommandDialog component. |
71
+
72
+ ### `<VoiceSelectorInput />`
73
+
74
+ Search input for filtering voices.
75
+
76
+ | Prop | Type | Default | Description |
77
+ | ------------- | ------------------------------------------- | ------- | --------------------------------------------------------- |
78
+ | `placeholder` | `string` | - | Placeholder text for the search input. |
79
+ | `className` | `string` | - | Additional CSS classes to apply. |
80
+ | `...props` | `React.ComponentProps<typeof CommandInput>` | - | Any other props are spread to the CommandInput component. |
81
+
82
+ ### `<VoiceSelectorList />`
83
+
84
+ Scrollable container for voice items and groups.
85
+
86
+ | Prop | Type | Default | Description |
87
+ | ---------- | ------------------------------------------ | ------- | -------------------------------------------------------- |
88
+ | `...props` | `React.ComponentProps<typeof CommandList>` | - | Any other props are spread to the CommandList component. |
89
+
90
+ ### `<VoiceSelectorEmpty />`
91
+
92
+ Message shown when no voices match the search query.
93
+
94
+ | Prop | Type | Default | Description |
95
+ | ---------- | ------------------------------------------- | ------- | --------------------------------------------------------- |
96
+ | `children` | `ReactNode` | - | The message to display. |
97
+ | `...props` | `React.ComponentProps<typeof CommandEmpty>` | - | Any other props are spread to the CommandEmpty component. |
98
+
99
+ ### `<VoiceSelectorGroup />`
100
+
101
+ Groups related voices together with an optional heading.
102
+
103
+ | Prop | Type | Default | Description |
104
+ | ---------- | ------------------------------------------- | ------- | --------------------------------------------------------- |
105
+ | `heading` | `string` | - | The heading text for the group. |
106
+ | `...props` | `React.ComponentProps<typeof CommandGroup>` | - | Any other props are spread to the CommandGroup component. |
107
+
108
+ ### `<VoiceSelectorItem />`
109
+
110
+ Selectable item representing a voice.
111
+
112
+ | Prop | Type | Default | Description |
113
+ | ---------- | ------------------------------------------ | ------- | ---------------------------------------------------------------- |
114
+ | `value` | `string` | - | The unique identifier for this voice. Used for search filtering. |
115
+ | `onSelect` | `(value: string) => void` | - | Callback fired when the voice is selected. |
116
+ | `...props` | `React.ComponentProps<typeof CommandItem>` | - | Any other props are spread to the CommandItem component. |
117
+
118
+ ### `<VoiceSelectorSeparator />`
119
+
120
+ Visual separator between voice groups.
121
+
122
+ | Prop | Type | Default | Description |
123
+ | ---------- | ----------------------------------------------- | ------- | ------------------------------------------------------------- |
124
+ | `...props` | `React.ComponentProps<typeof CommandSeparator>` | - | Any other props are spread to the CommandSeparator component. |
125
+
126
+ ### `<VoiceSelectorName />`
127
+
128
+ Displays the voice name with proper styling.
129
+
130
+ | Prop | Type | Default | Description |
131
+ | ----------- | ----------------------- | ------- | ----------------------------------------------- |
132
+ | `className` | `string` | - | Additional CSS classes to apply. |
133
+ | `...props` | `React.ComponentProps<` | - | Any other props are spread to the span element. |
134
+
135
+ ### `<VoiceSelectorGender />`
136
+
137
+ Displays the voice gender metadata with icons from Lucide. Supports multiple gender identities with corresponding icons.
138
+
139
+ | Prop | Type | Default | Description |
140
+ | ----------- | ----------------------- | ------- | ------------------------------------------------------------------------- |
141
+ | `value` | `unknown` | - | The gender value that determines which icon to display. Supported values: |
142
+ | `className` | `string` | - | Additional CSS classes to apply. |
143
+ | `children` | `ReactNode` | - | Override the icon with custom content. |
144
+ | `...props` | `React.ComponentProps<` | - | Any other props are spread to the span element. |
145
+
146
+ ### `<VoiceSelectorAccent />`
147
+
148
+ Displays the voice accent metadata with emoji flags representing different countries/regions.
149
+
150
+ | Prop | Type | Default | Description |
151
+ | ----------- | ----------------------- | ------- | ------------------------------------------------------------------------------------------------------ |
152
+ | `value` | `unknown` | - | The accent value that determines which flag emoji to display. Supports 27 different accents including: |
153
+ | `className` | `string` | - | Additional CSS classes to apply. |
154
+ | `children` | `ReactNode` | - | Override the flag emoji with custom content. |
155
+ | `...props` | `React.ComponentProps<` | - | Any other props are spread to the span element. |
156
+
157
+ ### `<VoiceSelectorAge />`
158
+
159
+ Displays the voice age metadata with muted styling and tabular numbers for consistent alignment.
160
+
161
+ | Prop | Type | Default | Description |
162
+ | ----------- | ----------------------- | ------- | ----------------------------------------------- |
163
+ | `className` | `string` | - | Additional CSS classes to apply. |
164
+ | `...props` | `React.ComponentProps<` | - | Any other props are spread to the span element. |
165
+
166
+ ### `<VoiceSelectorDescription />`
167
+
168
+ Displays a description for the voice with muted styling.
169
+
170
+ | Prop | Type | Default | Description |
171
+ | ----------- | ----------------------- | ------- | ----------------------------------------------- |
172
+ | `className` | `string` | - | Additional CSS classes to apply. |
173
+ | `...props` | `React.ComponentProps<` | - | Any other props are spread to the span element. |
174
+
175
+ ### `<VoiceSelectorAttributes />`
176
+
177
+ Container for grouping voice attributes (gender, accent, age) together. Use with `VoiceSelectorBullet` for separation.
178
+
179
+ | Prop | Type | Default | Description |
180
+ | ----------- | ----------------------- | ------- | ---------------------------------------------- |
181
+ | `className` | `string` | - | Additional CSS classes to apply. |
182
+ | `...props` | `React.ComponentProps<` | - | Any other props are spread to the div element. |
183
+
184
+ ### `<VoiceSelectorBullet />`
185
+
186
+ Displays a bullet separator (•) between voice attributes. Hidden from screen readers via `aria-hidden`.
187
+
188
+ | Prop | Type | Default | Description |
189
+ | ----------- | ----------------------- | ------- | ----------------------------------------------- |
190
+ | `className` | `string` | - | Additional CSS classes to apply. |
191
+ | `...props` | `React.ComponentProps<` | - | Any other props are spread to the span element. |
192
+
193
+ ### `<VoiceSelectorShortcut />`
194
+
195
+ Displays keyboard shortcuts for voice items.
196
+
197
+ | Prop | Type | Default | Description |
198
+ | ---------- | ---------------------------------------------- | ------- | ------------------------------------------------------------ |
199
+ | `...props` | `React.ComponentProps<typeof CommandShortcut>` | - | Any other props are spread to the CommandShortcut component. |
200
+
201
+ ### `<VoiceSelectorPreview />`
202
+
203
+ A button that allows users to preview/play a voice sample before selecting it. Shows play, pause, or loading icons based on state.
204
+
205
+ | Prop | Type | Default | Description |
206
+ | ----------- | ---------------------------- | ------- | ------------------------------------------------------------------------------------ |
207
+ | `playing` | `boolean` | - | Whether the voice is currently playing. Shows pause icon when true. |
208
+ | `loading` | `boolean` | - | Whether the voice preview is loading. Shows loading spinner and disables the button. |
209
+ | `onPlay` | `() => void` | - | Callback fired when the preview button is clicked. |
210
+ | `className` | `string` | - | Additional CSS classes to apply. |
211
+ | `...props` | `Omit<React.ComponentProps<` | - | Any other props are spread to the button element. |
212
+
213
+ ## Hooks
214
+
215
+ ### `useVoiceSelector()`
216
+
217
+ A custom hook for accessing the voice selector context. This hook allows you to access and control the voice selection state from any component nested within `VoiceSelector`.
218
+
219
+ ```tsx
220
+ import { useVoiceSelector } from "@repo/elements/voice-selector";
221
+
222
+ export default function CustomVoiceDisplay() {
223
+ const { value, setValue, open, setOpen } = useVoiceSelector();
224
+
225
+ return (
226
+ <div>
227
+ <p>Selected voice: {value ?? "None"}</p>
228
+ <button onClick={() => setOpen(!open)}>Toggle Dialog</button>
229
+ </div>
230
+ );
231
+ }
232
+ ```
233
+
234
+ #### Return Value
235
+
236
+ | Prop | Type | Default | Description |
237
+ | ---------- | ------------------------- | ------------------- | ------------------------------------------ | ----------------------------------------- |
238
+ | `value` | `string | undefined` | - | The currently selected voice ID. |
239
+ | `setValue` | `(value: string | undefined) => void` | - | Function to update the selected voice ID. |
240
+ | `open` | `boolean` | - | Whether the dialog is currently open. |
241
+ | `setOpen` | `(open: boolean) => void` | - | Function to control the dialog open state. |