diff --git a/active-rfcs/0046-patterned-template.md b/active-rfcs/0046-patterned-template.md
new file mode 100644
index 00000000..5c256a20
--- /dev/null
+++ b/active-rfcs/0046-patterned-template.md
@@ -0,0 +1,356 @@
+- Start Date: 2026-03-05
+- Target Major Version: 3.x
+- Reference Issues: N/A
+- Implementation PR: (leave this empty)
+
+# Summary
+
+Introduce a pattern matching directive for Vue templates that enables declarative, multi-branch conditional rendering based on the value of an expression. This provides a cleaner alternative to chained `v-if` / `v-else-if` / `v-else` when branching on a single expression's value.
+
+# Basic example
+
+```html
+
+ Loading... Something went wrong. Data loaded successfully! Unknown status. Loading... Something went wrong. Data loaded successfully! Unknown status.
...
+...
+...
+...
+...
+...
+...
+...
+...
+...
+...
+...
+Success
+Redirect
+Client Error
+Server Error
+Unknown Status
+ +``` + +When `v-case` receives an array, the branch matches if the discriminant is strictly equal to **any** element in the array (i.e., `array.includes(discriminant)`). + +### Default branch + +The `.default` modifier designates a fallback branch. It is rendered when no other `v-case` matches. At most one `v-case.default` is allowed per `v-match` block. If no `.default` is provided and no case matches, nothing is rendered (same behavior as `v-if` with no `v-else`). + +```html +Correct!
+Try again.
+A
+B
+Default
+A
+} else if (__match_0 === 'b') { + // renderB
+} else { + // renderDefault
+} +``` + +The discriminant is evaluated once and cached in a temporary variable to avoid redundant evaluations. + +For multiple values: + +```js +const __match_0 = httpStatus + +if ([200, 201, 204].includes(__match_0)) { + // render Success +} else if ([301, 302].includes(__match_0)) { + // render Redirect +} ... +``` + +## Validation rules + +The compiler should enforce the following rules and emit warnings/errors: + +1. **`v-case` must be a direct child of a `v-match` element.** Using `v-case` outside of `v-match` is a compile-time error. +2. **At most one `v-case.default` per `v-match`.** Multiple defaults produce a compile-time error. +3. **`v-case` must not be combined with `v-if`, `v-else-if`, `v-else`, `v-for`, or another `v-match` on the same element.** These are mutually exclusive structural directives. +4. **Non-`v-case` children of `v-match` are ignored with a warning.** All direct children of a `v-match` element should use `v-case`. +5. **`v-match` with no `v-case` children** produces a compile-time warning. + +## TypeScript support + +When using `v-match` on a discriminated union, Volar (vue-tsc) should narrow the type within each `v-case` branch: + +```vue + + + + + +{{ result.value }}
+ +{{ result.error.message }}
+ + +``` + +This requires Volar plugin support and is a stretch goal for the initial implementation. + +# Drawbacks + +- **New directive pair**: Adds two new built-in directives (`v-match` and `v-case`) to Vue's API surface. This increases the learning surface, though both concepts are widely understood. +- **Overlap with `v-if` / `v-else-if`**: This feature doesn't enable anything new — it's syntactic sugar over existing directives. Developers need to learn when to use which. +- **Compiler complexity**: The compiler must handle the parent-child relationship between `v-match` and `v-case`, which is a new pattern for Vue structural directives (currently all structural directives are independent). +- **Userland alternative**: This can be approximated in userland with a renderless component, though with worse ergonomics and no compiler optimizations. + +# Alternatives + +## 1. Do nothing — keep using `v-if` / `v-else-if` + +The current approach works and is well-understood. The cost is verbosity and repeated expressions. + +## 2. Renderless `Loading...
Error!
Unknown
Loading...
+Error!
+Unknown
+``` + +Using the directive argument as the discriminant avoids a wrapper element but: +- Requires repeating the discriminant name on every branch +- Loses the visual grouping of related branches +- Has ambiguous scoping if used non-consecutively + +## 4. `v-switch` / `v-case` naming + +As discussed in the syntax candidates section, `v-switch` is more familiar but implies fall-through behavior. We recommend `v-match` to avoid this confusion. + +# Adoption strategy + +- This is a **non-breaking, additive** feature. No existing code needs to change. +- `v-if` / `v-else-if` / `v-else` remains fully supported and is still appropriate for conditions that test different expressions. +- ESLint plugin (`eslint-plugin-vue`) can provide a rule to suggest `v-match` when it detects a `v-if` / `v-else-if` chain that tests the same expression. +- Documentation should present `v-match` alongside `v-if` in the conditional rendering guide, with guidance on when to use each. +- A codemod can be provided to automatically convert eligible `v-if` chains to `v-match` / `v-case`. + +# Unresolved questions + +1. **Naming**: Should we go with `v-match` / `v-case`, `v-switch` / `v-case`, `v-match` / `v-when`, or something else? This RFC presents the trade-offs but the final decision should be made through community discussion. +2. **Guard conditions**: Should `v-case` support an additional guard expression (e.g., `v-case="'error'" v-case-if="retryCount < 3"`)? This adds power but also complexity. It could be deferred to a follow-up RFC. +3. **Exhaustiveness checking**: Should the compiler or Volar warn when a `v-match` on a union type is missing branches? This is valuable for type safety but requires deep integration with the type system. +4. **Range matching**: Should there be syntax for matching ranges (e.g., `v-case="1..10"`)? This is useful but may be better handled by `v-if` or deferred. +5. **Deep pattern matching**: Should future iterations support matching on object shape (e.g., `v-case="{ status: 'ok', data: { type: 'user' } }"`)? This is powerful but complex and should likely be a separate RFC. +6. **`v-case` value expression evaluation**: Should `v-case` values be limited to literals for optimization, or should any expression be allowed? Allowing expressions provides flexibility but prevents some compile-time optimizations.