@0xsown/vibe-code-fe 1.0.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 (189) hide show
  1. package/bin/index.js +181 -0
  2. package/package.json +32 -0
  3. package/skills/claude-md-improver/SKILL.md +179 -0
  4. package/skills/claude-md-improver/references/quality-criteria.md +109 -0
  5. package/skills/claude-md-improver/references/templates.md +253 -0
  6. package/skills/claude-md-improver/references/update-guidelines.md +150 -0
  7. package/skills/find-skills/SKILL.md +133 -0
  8. package/skills/frontend-design/LICENSE.txt +177 -0
  9. package/skills/frontend-design/SKILL.md +42 -0
  10. package/skills/next-best-practices/SKILL.md +153 -0
  11. package/skills/next-best-practices/async-patterns.md +87 -0
  12. package/skills/next-best-practices/bundling.md +180 -0
  13. package/skills/next-best-practices/data-patterns.md +297 -0
  14. package/skills/next-best-practices/debug-tricks.md +105 -0
  15. package/skills/next-best-practices/directives.md +73 -0
  16. package/skills/next-best-practices/error-handling.md +227 -0
  17. package/skills/next-best-practices/file-conventions.md +140 -0
  18. package/skills/next-best-practices/font.md +245 -0
  19. package/skills/next-best-practices/functions.md +108 -0
  20. package/skills/next-best-practices/hydration-error.md +91 -0
  21. package/skills/next-best-practices/image.md +173 -0
  22. package/skills/next-best-practices/metadata.md +301 -0
  23. package/skills/next-best-practices/parallel-routes.md +287 -0
  24. package/skills/next-best-practices/route-handlers.md +146 -0
  25. package/skills/next-best-practices/rsc-boundaries.md +159 -0
  26. package/skills/next-best-practices/runtime-selection.md +39 -0
  27. package/skills/next-best-practices/scripts.md +141 -0
  28. package/skills/next-best-practices/self-hosting.md +371 -0
  29. package/skills/next-best-practices/suspense-boundaries.md +67 -0
  30. package/skills/next-cache-components/SKILL.md +411 -0
  31. package/skills/shadcn-ui/README.md +248 -0
  32. package/skills/shadcn-ui/SKILL.md +326 -0
  33. package/skills/shadcn-ui/examples/auth-layout.tsx +177 -0
  34. package/skills/shadcn-ui/examples/data-table.tsx +313 -0
  35. package/skills/shadcn-ui/examples/form-pattern.tsx +177 -0
  36. package/skills/shadcn-ui/resources/component-catalog.md +481 -0
  37. package/skills/shadcn-ui/resources/customization-guide.md +516 -0
  38. package/skills/shadcn-ui/resources/migration-guide.md +463 -0
  39. package/skills/shadcn-ui/resources/setup-guide.md +412 -0
  40. package/skills/shadcn-ui/scripts/verify-setup.sh +134 -0
  41. package/skills/supabase-postgres-best-practices/AGENTS.md +68 -0
  42. package/skills/supabase-postgres-best-practices/CLAUDE.md +68 -0
  43. package/skills/supabase-postgres-best-practices/README.md +116 -0
  44. package/skills/supabase-postgres-best-practices/SKILL.md +64 -0
  45. package/skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
  46. package/skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
  47. package/skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
  48. package/skills/supabase-postgres-best-practices/references/conn-limits.md +44 -0
  49. package/skills/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
  50. package/skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
  51. package/skills/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
  52. package/skills/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
  53. package/skills/supabase-postgres-best-practices/references/data-pagination.md +50 -0
  54. package/skills/supabase-postgres-best-practices/references/data-upsert.md +50 -0
  55. package/skills/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
  56. package/skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
  57. package/skills/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
  58. package/skills/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
  59. package/skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
  60. package/skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
  61. package/skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
  62. package/skills/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
  63. package/skills/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
  64. package/skills/supabase-postgres-best-practices/references/query-index-types.md +48 -0
  65. package/skills/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
  66. package/skills/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
  67. package/skills/supabase-postgres-best-practices/references/schema-constraints.md +80 -0
  68. package/skills/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
  69. package/skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
  70. package/skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
  71. package/skills/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
  72. package/skills/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
  73. package/skills/supabase-postgres-best-practices/references/security-privileges.md +54 -0
  74. package/skills/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
  75. package/skills/supabase-postgres-best-practices/references/security-rls-performance.md +57 -0
  76. package/skills/tailwind-design-system/SKILL.md +874 -0
  77. package/skills/vercel-composition-patterns/AGENTS.md +946 -0
  78. package/skills/vercel-composition-patterns/README.md +60 -0
  79. package/skills/vercel-composition-patterns/SKILL.md +89 -0
  80. package/skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
  81. package/skills/vercel-composition-patterns/rules/architecture-compound-components.md +112 -0
  82. package/skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md +87 -0
  83. package/skills/vercel-composition-patterns/rules/patterns-explicit-variants.md +100 -0
  84. package/skills/vercel-composition-patterns/rules/react19-no-forwardref.md +42 -0
  85. package/skills/vercel-composition-patterns/rules/state-context-interface.md +191 -0
  86. package/skills/vercel-composition-patterns/rules/state-decouple-implementation.md +113 -0
  87. package/skills/vercel-composition-patterns/rules/state-lift-state.md +125 -0
  88. package/skills/vercel-react-best-practices/AGENTS.md +2934 -0
  89. package/skills/vercel-react-best-practices/README.md +123 -0
  90. package/skills/vercel-react-best-practices/SKILL.md +136 -0
  91. package/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  92. package/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  93. package/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  94. package/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
  95. package/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
  96. package/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
  97. package/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
  98. package/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  99. package/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
  100. package/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
  101. package/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  102. package/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  103. package/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
  104. package/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
  105. package/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
  106. package/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  107. package/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  108. package/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
  109. package/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  110. package/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  111. package/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
  112. package/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  113. package/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  114. package/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  115. package/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  116. package/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
  117. package/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  118. package/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  119. package/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  120. package/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  121. package/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  122. package/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
  123. package/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  124. package/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  125. package/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  126. package/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  127. package/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  128. package/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  129. package/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  130. package/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  131. package/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  132. package/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  133. package/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  134. package/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  135. package/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  136. package/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  137. package/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  138. package/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  139. package/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  140. package/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  141. package/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  142. package/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  143. package/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  144. package/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  145. package/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  146. package/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  147. package/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
  148. package/skills/vercel-react-native-skills/AGENTS.md +2897 -0
  149. package/skills/vercel-react-native-skills/README.md +165 -0
  150. package/skills/vercel-react-native-skills/SKILL.md +121 -0
  151. package/skills/vercel-react-native-skills/rules/animation-derived-value.md +53 -0
  152. package/skills/vercel-react-native-skills/rules/animation-gesture-detector-press.md +95 -0
  153. package/skills/vercel-react-native-skills/rules/animation-gpu-properties.md +65 -0
  154. package/skills/vercel-react-native-skills/rules/design-system-compound-components.md +66 -0
  155. package/skills/vercel-react-native-skills/rules/fonts-config-plugin.md +71 -0
  156. package/skills/vercel-react-native-skills/rules/imports-design-system-folder.md +68 -0
  157. package/skills/vercel-react-native-skills/rules/js-hoist-intl.md +61 -0
  158. package/skills/vercel-react-native-skills/rules/list-performance-callbacks.md +44 -0
  159. package/skills/vercel-react-native-skills/rules/list-performance-function-references.md +132 -0
  160. package/skills/vercel-react-native-skills/rules/list-performance-images.md +53 -0
  161. package/skills/vercel-react-native-skills/rules/list-performance-inline-objects.md +97 -0
  162. package/skills/vercel-react-native-skills/rules/list-performance-item-expensive.md +94 -0
  163. package/skills/vercel-react-native-skills/rules/list-performance-item-memo.md +82 -0
  164. package/skills/vercel-react-native-skills/rules/list-performance-item-types.md +104 -0
  165. package/skills/vercel-react-native-skills/rules/list-performance-virtualize.md +67 -0
  166. package/skills/vercel-react-native-skills/rules/monorepo-native-deps-in-app.md +46 -0
  167. package/skills/vercel-react-native-skills/rules/monorepo-single-dependency-versions.md +63 -0
  168. package/skills/vercel-react-native-skills/rules/navigation-native-navigators.md +188 -0
  169. package/skills/vercel-react-native-skills/rules/react-compiler-destructure-functions.md +50 -0
  170. package/skills/vercel-react-native-skills/rules/react-compiler-reanimated-shared-values.md +48 -0
  171. package/skills/vercel-react-native-skills/rules/react-state-dispatcher.md +91 -0
  172. package/skills/vercel-react-native-skills/rules/react-state-fallback.md +56 -0
  173. package/skills/vercel-react-native-skills/rules/react-state-minimize.md +65 -0
  174. package/skills/vercel-react-native-skills/rules/rendering-no-falsy-and.md +74 -0
  175. package/skills/vercel-react-native-skills/rules/rendering-text-in-text-component.md +36 -0
  176. package/skills/vercel-react-native-skills/rules/scroll-position-no-state.md +82 -0
  177. package/skills/vercel-react-native-skills/rules/state-ground-truth.md +80 -0
  178. package/skills/vercel-react-native-skills/rules/ui-expo-image.md +66 -0
  179. package/skills/vercel-react-native-skills/rules/ui-image-gallery.md +104 -0
  180. package/skills/vercel-react-native-skills/rules/ui-measure-views.md +78 -0
  181. package/skills/vercel-react-native-skills/rules/ui-menus.md +174 -0
  182. package/skills/vercel-react-native-skills/rules/ui-native-modals.md +77 -0
  183. package/skills/vercel-react-native-skills/rules/ui-pressable.md +61 -0
  184. package/skills/vercel-react-native-skills/rules/ui-safe-area-scroll.md +65 -0
  185. package/skills/vercel-react-native-skills/rules/ui-scrollview-content-inset.md +45 -0
  186. package/skills/vercel-react-native-skills/rules/ui-styling.md +87 -0
  187. package/skills/web-design-guidelines/SKILL.md +39 -0
  188. package/templates/AGENTS.md +31 -0
  189. package/templates/CLAUDE.md +31 -0
@@ -0,0 +1,60 @@
1
+ # React Composition Patterns
2
+
3
+ A structured repository for React composition patterns that scale. These
4
+ patterns help avoid boolean prop proliferation by using compound components,
5
+ lifting state, and composing internals.
6
+
7
+ ## Structure
8
+
9
+ - `rules/` - Individual rule files (one per rule)
10
+ - `_sections.md` - Section metadata (titles, impacts, descriptions)
11
+ - `_template.md` - Template for creating new rules
12
+ - `area-description.md` - Individual rule files
13
+ - `metadata.json` - Document metadata (version, organization, abstract)
14
+ - **`AGENTS.md`** - Compiled output (generated)
15
+
16
+ ## Rules
17
+
18
+ ### Component Architecture (CRITICAL)
19
+
20
+ - `architecture-avoid-boolean-props.md` - Don't add boolean props to customize
21
+ behavior
22
+ - `architecture-compound-components.md` - Structure as compound components with
23
+ shared context
24
+
25
+ ### State Management (HIGH)
26
+
27
+ - `state-lift-state.md` - Lift state into provider components
28
+ - `state-context-interface.md` - Define clear context interfaces
29
+ (state/actions/meta)
30
+ - `state-decouple-implementation.md` - Decouple state management from UI
31
+
32
+ ### Implementation Patterns (MEDIUM)
33
+
34
+ - `patterns-children-over-render-props.md` - Prefer children over renderX props
35
+ - `patterns-explicit-variants.md` - Create explicit component variants
36
+
37
+ ## Core Principles
38
+
39
+ 1. **Composition over configuration** — Instead of adding props, let consumers
40
+ compose
41
+ 2. **Lift your state** — State in providers, not trapped in components
42
+ 3. **Compose your internals** — Subcomponents access context, not props
43
+ 4. **Explicit variants** — Create ThreadComposer, EditComposer, not Composer
44
+ with isThread
45
+
46
+ ## Creating a New Rule
47
+
48
+ 1. Copy `rules/_template.md` to `rules/area-description.md`
49
+ 2. Choose the appropriate area prefix:
50
+ - `architecture-` for Component Architecture
51
+ - `state-` for State Management
52
+ - `patterns-` for Implementation Patterns
53
+ 3. Fill in the frontmatter and content
54
+ 4. Ensure you have clear examples with explanations
55
+
56
+ ## Impact Levels
57
+
58
+ - `CRITICAL` - Foundational patterns, prevents unmaintainable code
59
+ - `HIGH` - Significant maintainability improvements
60
+ - `MEDIUM` - Good practices for cleaner code
@@ -0,0 +1,89 @@
1
+ ---
2
+ name: vercel-composition-patterns
3
+ description:
4
+ React composition patterns that scale. Use when refactoring components with
5
+ boolean prop proliferation, building flexible component libraries, or
6
+ designing reusable APIs. Triggers on tasks involving compound components,
7
+ render props, context providers, or component architecture. Includes React 19
8
+ API changes.
9
+ license: MIT
10
+ metadata:
11
+ author: vercel
12
+ version: '1.0.0'
13
+ ---
14
+
15
+ # React Composition Patterns
16
+
17
+ Composition patterns for building flexible, maintainable React components. Avoid
18
+ boolean prop proliferation by using compound components, lifting state, and
19
+ composing internals. These patterns make codebases easier for both humans and AI
20
+ agents to work with as they scale.
21
+
22
+ ## When to Apply
23
+
24
+ Reference these guidelines when:
25
+
26
+ - Refactoring components with many boolean props
27
+ - Building reusable component libraries
28
+ - Designing flexible component APIs
29
+ - Reviewing component architecture
30
+ - Working with compound components or context providers
31
+
32
+ ## Rule Categories by Priority
33
+
34
+ | Priority | Category | Impact | Prefix |
35
+ | -------- | ----------------------- | ------ | --------------- |
36
+ | 1 | Component Architecture | HIGH | `architecture-` |
37
+ | 2 | State Management | MEDIUM | `state-` |
38
+ | 3 | Implementation Patterns | MEDIUM | `patterns-` |
39
+ | 4 | React 19 APIs | MEDIUM | `react19-` |
40
+
41
+ ## Quick Reference
42
+
43
+ ### 1. Component Architecture (HIGH)
44
+
45
+ - `architecture-avoid-boolean-props` - Don't add boolean props to customize
46
+ behavior; use composition
47
+ - `architecture-compound-components` - Structure complex components with shared
48
+ context
49
+
50
+ ### 2. State Management (MEDIUM)
51
+
52
+ - `state-decouple-implementation` - Provider is the only place that knows how
53
+ state is managed
54
+ - `state-context-interface` - Define generic interface with state, actions, meta
55
+ for dependency injection
56
+ - `state-lift-state` - Move state into provider components for sibling access
57
+
58
+ ### 3. Implementation Patterns (MEDIUM)
59
+
60
+ - `patterns-explicit-variants` - Create explicit variant components instead of
61
+ boolean modes
62
+ - `patterns-children-over-render-props` - Use children for composition instead
63
+ of renderX props
64
+
65
+ ### 4. React 19 APIs (MEDIUM)
66
+
67
+ > **⚠️ React 19+ only.** Skip this section if using React 18 or earlier.
68
+
69
+ - `react19-no-forwardref` - Don't use `forwardRef`; use `use()` instead of `useContext()`
70
+
71
+ ## How to Use
72
+
73
+ Read individual rule files for detailed explanations and code examples:
74
+
75
+ ```
76
+ rules/architecture-avoid-boolean-props.md
77
+ rules/state-context-interface.md
78
+ ```
79
+
80
+ Each rule file contains:
81
+
82
+ - Brief explanation of why it matters
83
+ - Incorrect code example with explanation
84
+ - Correct code example with explanation
85
+ - Additional context and references
86
+
87
+ ## Full Compiled Document
88
+
89
+ For the complete guide with all rules expanded: `AGENTS.md`
@@ -0,0 +1,100 @@
1
+ ---
2
+ title: Avoid Boolean Prop Proliferation
3
+ impact: CRITICAL
4
+ impactDescription: prevents unmaintainable component variants
5
+ tags: composition, props, architecture
6
+ ---
7
+
8
+ ## Avoid Boolean Prop Proliferation
9
+
10
+ Don't add boolean props like `isThread`, `isEditing`, `isDMThread` to customize
11
+ component behavior. Each boolean doubles possible states and creates
12
+ unmaintainable conditional logic. Use composition instead.
13
+
14
+ **Incorrect (boolean props create exponential complexity):**
15
+
16
+ ```tsx
17
+ function Composer({
18
+ onSubmit,
19
+ isThread,
20
+ channelId,
21
+ isDMThread,
22
+ dmId,
23
+ isEditing,
24
+ isForwarding,
25
+ }: Props) {
26
+ return (
27
+ <form>
28
+ <Header />
29
+ <Input />
30
+ {isDMThread ? (
31
+ <AlsoSendToDMField id={dmId} />
32
+ ) : isThread ? (
33
+ <AlsoSendToChannelField id={channelId} />
34
+ ) : null}
35
+ {isEditing ? (
36
+ <EditActions />
37
+ ) : isForwarding ? (
38
+ <ForwardActions />
39
+ ) : (
40
+ <DefaultActions />
41
+ )}
42
+ <Footer onSubmit={onSubmit} />
43
+ </form>
44
+ )
45
+ }
46
+ ```
47
+
48
+ **Correct (composition eliminates conditionals):**
49
+
50
+ ```tsx
51
+ // Channel composer
52
+ function ChannelComposer() {
53
+ return (
54
+ <Composer.Frame>
55
+ <Composer.Header />
56
+ <Composer.Input />
57
+ <Composer.Footer>
58
+ <Composer.Attachments />
59
+ <Composer.Formatting />
60
+ <Composer.Emojis />
61
+ <Composer.Submit />
62
+ </Composer.Footer>
63
+ </Composer.Frame>
64
+ )
65
+ }
66
+
67
+ // Thread composer - adds "also send to channel" field
68
+ function ThreadComposer({ channelId }: { channelId: string }) {
69
+ return (
70
+ <Composer.Frame>
71
+ <Composer.Header />
72
+ <Composer.Input />
73
+ <AlsoSendToChannelField id={channelId} />
74
+ <Composer.Footer>
75
+ <Composer.Formatting />
76
+ <Composer.Emojis />
77
+ <Composer.Submit />
78
+ </Composer.Footer>
79
+ </Composer.Frame>
80
+ )
81
+ }
82
+
83
+ // Edit composer - different footer actions
84
+ function EditComposer() {
85
+ return (
86
+ <Composer.Frame>
87
+ <Composer.Input />
88
+ <Composer.Footer>
89
+ <Composer.Formatting />
90
+ <Composer.Emojis />
91
+ <Composer.CancelEdit />
92
+ <Composer.SaveEdit />
93
+ </Composer.Footer>
94
+ </Composer.Frame>
95
+ )
96
+ }
97
+ ```
98
+
99
+ Each variant is explicit about what it renders. We can share internals without
100
+ sharing a single monolithic parent.
@@ -0,0 +1,112 @@
1
+ ---
2
+ title: Use Compound Components
3
+ impact: HIGH
4
+ impactDescription: enables flexible composition without prop drilling
5
+ tags: composition, compound-components, architecture
6
+ ---
7
+
8
+ ## Use Compound Components
9
+
10
+ Structure complex components as compound components with a shared context. Each
11
+ subcomponent accesses shared state via context, not props. Consumers compose the
12
+ pieces they need.
13
+
14
+ **Incorrect (monolithic component with render props):**
15
+
16
+ ```tsx
17
+ function Composer({
18
+ renderHeader,
19
+ renderFooter,
20
+ renderActions,
21
+ showAttachments,
22
+ showFormatting,
23
+ showEmojis,
24
+ }: Props) {
25
+ return (
26
+ <form>
27
+ {renderHeader?.()}
28
+ <Input />
29
+ {showAttachments && <Attachments />}
30
+ {renderFooter ? (
31
+ renderFooter()
32
+ ) : (
33
+ <Footer>
34
+ {showFormatting && <Formatting />}
35
+ {showEmojis && <Emojis />}
36
+ {renderActions?.()}
37
+ </Footer>
38
+ )}
39
+ </form>
40
+ )
41
+ }
42
+ ```
43
+
44
+ **Correct (compound components with shared context):**
45
+
46
+ ```tsx
47
+ const ComposerContext = createContext<ComposerContextValue | null>(null)
48
+
49
+ function ComposerProvider({ children, state, actions, meta }: ProviderProps) {
50
+ return (
51
+ <ComposerContext value={{ state, actions, meta }}>
52
+ {children}
53
+ </ComposerContext>
54
+ )
55
+ }
56
+
57
+ function ComposerFrame({ children }: { children: React.ReactNode }) {
58
+ return <form>{children}</form>
59
+ }
60
+
61
+ function ComposerInput() {
62
+ const {
63
+ state,
64
+ actions: { update },
65
+ meta: { inputRef },
66
+ } = use(ComposerContext)
67
+ return (
68
+ <TextInput
69
+ ref={inputRef}
70
+ value={state.input}
71
+ onChangeText={(text) => update((s) => ({ ...s, input: text }))}
72
+ />
73
+ )
74
+ }
75
+
76
+ function ComposerSubmit() {
77
+ const {
78
+ actions: { submit },
79
+ } = use(ComposerContext)
80
+ return <Button onPress={submit}>Send</Button>
81
+ }
82
+
83
+ // Export as compound component
84
+ const Composer = {
85
+ Provider: ComposerProvider,
86
+ Frame: ComposerFrame,
87
+ Input: ComposerInput,
88
+ Submit: ComposerSubmit,
89
+ Header: ComposerHeader,
90
+ Footer: ComposerFooter,
91
+ Attachments: ComposerAttachments,
92
+ Formatting: ComposerFormatting,
93
+ Emojis: ComposerEmojis,
94
+ }
95
+ ```
96
+
97
+ **Usage:**
98
+
99
+ ```tsx
100
+ <Composer.Provider state={state} actions={actions} meta={meta}>
101
+ <Composer.Frame>
102
+ <Composer.Header />
103
+ <Composer.Input />
104
+ <Composer.Footer>
105
+ <Composer.Formatting />
106
+ <Composer.Submit />
107
+ </Composer.Footer>
108
+ </Composer.Frame>
109
+ </Composer.Provider>
110
+ ```
111
+
112
+ Consumers explicitly compose exactly what they need. No hidden conditionals. And the state, actions and meta are dependency-injected by a parent provider, allowing multiple usages of the same component structure.
@@ -0,0 +1,87 @@
1
+ ---
2
+ title: Prefer Composing Children Over Render Props
3
+ impact: MEDIUM
4
+ impactDescription: cleaner composition, better readability
5
+ tags: composition, children, render-props
6
+ ---
7
+
8
+ ## Prefer Children Over Render Props
9
+
10
+ Use `children` for composition instead of `renderX` props. Children are more
11
+ readable, compose naturally, and don't require understanding callback
12
+ signatures.
13
+
14
+ **Incorrect (render props):**
15
+
16
+ ```tsx
17
+ function Composer({
18
+ renderHeader,
19
+ renderFooter,
20
+ renderActions,
21
+ }: {
22
+ renderHeader?: () => React.ReactNode
23
+ renderFooter?: () => React.ReactNode
24
+ renderActions?: () => React.ReactNode
25
+ }) {
26
+ return (
27
+ <form>
28
+ {renderHeader?.()}
29
+ <Input />
30
+ {renderFooter ? renderFooter() : <DefaultFooter />}
31
+ {renderActions?.()}
32
+ </form>
33
+ )
34
+ }
35
+
36
+ // Usage is awkward and inflexible
37
+ return (
38
+ <Composer
39
+ renderHeader={() => <CustomHeader />}
40
+ renderFooter={() => (
41
+ <>
42
+ <Formatting />
43
+ <Emojis />
44
+ </>
45
+ )}
46
+ renderActions={() => <SubmitButton />}
47
+ />
48
+ )
49
+ ```
50
+
51
+ **Correct (compound components with children):**
52
+
53
+ ```tsx
54
+ function ComposerFrame({ children }: { children: React.ReactNode }) {
55
+ return <form>{children}</form>
56
+ }
57
+
58
+ function ComposerFooter({ children }: { children: React.ReactNode }) {
59
+ return <footer className='flex'>{children}</footer>
60
+ }
61
+
62
+ // Usage is flexible
63
+ return (
64
+ <Composer.Frame>
65
+ <CustomHeader />
66
+ <Composer.Input />
67
+ <Composer.Footer>
68
+ <Composer.Formatting />
69
+ <Composer.Emojis />
70
+ <SubmitButton />
71
+ </Composer.Footer>
72
+ </Composer.Frame>
73
+ )
74
+ ```
75
+
76
+ **When render props are appropriate:**
77
+
78
+ ```tsx
79
+ // Render props work well when you need to pass data back
80
+ <List
81
+ data={items}
82
+ renderItem={({ item, index }) => <Item item={item} index={index} />}
83
+ />
84
+ ```
85
+
86
+ Use render props when the parent needs to provide data or state to the child.
87
+ Use children when composing static structure.
@@ -0,0 +1,100 @@
1
+ ---
2
+ title: Create Explicit Component Variants
3
+ impact: MEDIUM
4
+ impactDescription: self-documenting code, no hidden conditionals
5
+ tags: composition, variants, architecture
6
+ ---
7
+
8
+ ## Create Explicit Component Variants
9
+
10
+ Instead of one component with many boolean props, create explicit variant
11
+ components. Each variant composes the pieces it needs. The code documents
12
+ itself.
13
+
14
+ **Incorrect (one component, many modes):**
15
+
16
+ ```tsx
17
+ // What does this component actually render?
18
+ <Composer
19
+ isThread
20
+ isEditing={false}
21
+ channelId='abc'
22
+ showAttachments
23
+ showFormatting={false}
24
+ />
25
+ ```
26
+
27
+ **Correct (explicit variants):**
28
+
29
+ ```tsx
30
+ // Immediately clear what this renders
31
+ <ThreadComposer channelId="abc" />
32
+
33
+ // Or
34
+ <EditMessageComposer messageId="xyz" />
35
+
36
+ // Or
37
+ <ForwardMessageComposer messageId="123" />
38
+ ```
39
+
40
+ Each implementation is unique, explicit and self-contained. Yet they can each
41
+ use shared parts.
42
+
43
+ **Implementation:**
44
+
45
+ ```tsx
46
+ function ThreadComposer({ channelId }: { channelId: string }) {
47
+ return (
48
+ <ThreadProvider channelId={channelId}>
49
+ <Composer.Frame>
50
+ <Composer.Input />
51
+ <AlsoSendToChannelField channelId={channelId} />
52
+ <Composer.Footer>
53
+ <Composer.Formatting />
54
+ <Composer.Emojis />
55
+ <Composer.Submit />
56
+ </Composer.Footer>
57
+ </Composer.Frame>
58
+ </ThreadProvider>
59
+ )
60
+ }
61
+
62
+ function EditMessageComposer({ messageId }: { messageId: string }) {
63
+ return (
64
+ <EditMessageProvider messageId={messageId}>
65
+ <Composer.Frame>
66
+ <Composer.Input />
67
+ <Composer.Footer>
68
+ <Composer.Formatting />
69
+ <Composer.Emojis />
70
+ <Composer.CancelEdit />
71
+ <Composer.SaveEdit />
72
+ </Composer.Footer>
73
+ </Composer.Frame>
74
+ </EditMessageProvider>
75
+ )
76
+ }
77
+
78
+ function ForwardMessageComposer({ messageId }: { messageId: string }) {
79
+ return (
80
+ <ForwardMessageProvider messageId={messageId}>
81
+ <Composer.Frame>
82
+ <Composer.Input placeholder="Add a message, if you'd like." />
83
+ <Composer.Footer>
84
+ <Composer.Formatting />
85
+ <Composer.Emojis />
86
+ <Composer.Mentions />
87
+ </Composer.Footer>
88
+ </Composer.Frame>
89
+ </ForwardMessageProvider>
90
+ )
91
+ }
92
+ ```
93
+
94
+ Each variant is explicit about:
95
+
96
+ - What provider/state it uses
97
+ - What UI elements it includes
98
+ - What actions are available
99
+
100
+ No boolean prop combinations to reason about. No impossible states.
@@ -0,0 +1,42 @@
1
+ ---
2
+ title: React 19 API Changes
3
+ impact: MEDIUM
4
+ impactDescription: cleaner component definitions and context usage
5
+ tags: react19, refs, context, hooks
6
+ ---
7
+
8
+ ## React 19 API Changes
9
+
10
+ > **⚠️ React 19+ only.** Skip this if you're on React 18 or earlier.
11
+
12
+ In React 19, `ref` is now a regular prop (no `forwardRef` wrapper needed), and `use()` replaces `useContext()`.
13
+
14
+ **Incorrect (forwardRef in React 19):**
15
+
16
+ ```tsx
17
+ const ComposerInput = forwardRef<TextInput, Props>((props, ref) => {
18
+ return <TextInput ref={ref} {...props} />
19
+ })
20
+ ```
21
+
22
+ **Correct (ref as a regular prop):**
23
+
24
+ ```tsx
25
+ function ComposerInput({ ref, ...props }: Props & { ref?: React.Ref<TextInput> }) {
26
+ return <TextInput ref={ref} {...props} />
27
+ }
28
+ ```
29
+
30
+ **Incorrect (useContext in React 19):**
31
+
32
+ ```tsx
33
+ const value = useContext(MyContext)
34
+ ```
35
+
36
+ **Correct (use instead of useContext):**
37
+
38
+ ```tsx
39
+ const value = use(MyContext)
40
+ ```
41
+
42
+ `use()` can also be called conditionally, unlike `useContext()`.