Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
d69f18f
feat(createDataGrid): add row ordering state management
johnleider Mar 30, 2026
30285d8
feat(createDataGrid): add cell editing with validation and dirty trac…
johnleider Mar 30, 2026
829f0bc
feat(createDataGrid): add row spanning computation
johnleider Mar 30, 2026
d7b005a
feat(createDataGrid): add column layout with sizing, pinning, resizin…
johnleider Mar 30, 2026
dcf2eb1
feat(createDataGrid): add grid adapters (client, server, virtual)
johnleider Mar 30, 2026
778f7ed
feat(createDataGrid): add main factory with trinity pattern
johnleider Mar 30, 2026
1ecb870
feat(createDataGrid): add integration tests
johnleider Mar 30, 2026
2c5ba05
refactor(createDataGrid): simplify adapters, layout, and factory
johnleider Mar 30, 2026
a17112e
refactor(createDataGrid): fix validation, editing, and pattern compli…
johnleider Apr 12, 2026
8a0672c
fix(createDataGrid): use isUndefined guard for item check
johnleider Apr 12, 2026
baca643
refactor(createDataGrid): shorten multi-word variable names
johnleider Apr 12, 2026
99d657b
docs(createDataGrid): add documentation page with examples
johnleider Apr 12, 2026
0a3ba69
docs(createDataGrid): redesign examples with distinct use cases
johnleider Apr 12, 2026
7b121e6
docs(createDataGrid): fix pinned grid bugs and add table-fixed
johnleider Apr 12, 2026
de28cbe
docs(createDataGrid): fix resize by moving listeners to document
johnleider Apr 12, 2026
f213c99
docs(createDataGrid): truncate cells to prevent row overflow on resize
johnleider Apr 12, 2026
8c928bb
docs(createDataGrid): prevent sort toggle when clicking resize handle
johnleider Apr 12, 2026
13b51d9
docs(createDataGrid): use useToggleScope + useEventListener for resize
johnleider Apr 12, 2026
1ab31a8
docs(createDataGrid): use useClickOutside and useHotkey for editing
johnleider Apr 12, 2026
05612bc
docs(createDataGrid): add pin/unpin controls and fix resize on frozen…
johnleider Apr 12, 2026
d8ea074
docs(createDataGrid): fix lint prefer-array-some
johnleider Apr 12, 2026
1f6be0a
docs(createDataGrid): rewrite basic example to showcase all different…
johnleider Apr 12, 2026
4aba104
feat(createDataGrid): add performance benchmarks
johnleider Apr 12, 2026
a4edf41
refactor(createDataGrid): align validate signature with v0 Rule pattern
johnleider Apr 12, 2026
3821a00
refactor(createDataGrid): compose layout from registry + group
johnleider Apr 12, 2026
f033bf1
refactor(createDataGrid): align benchmarks for cross-composable compa…
johnleider Apr 12, 2026
f5377d5
perf(createDataTable): optimize sort pipeline with Intl.Collator reuse
johnleider Apr 12, 2026
cbaff03
chore(typed-router): regenerate after rebase
johnleider May 12, 2026
6630729
chore(createDataGrid): align with renamed DataTable adapter exports
johnleider May 12, 2026
b293f7b
chore(createDataGrid): adopt master conventions from past month
johnleider May 12, 2026
66af182
docs(createDataGrid): normalize page flow and enrich feature examples
johnleider May 12, 2026
da1997f
docs(createDataGrid): reorder page sections and set per-column minSize
johnleider May 12, 2026
79c9f5b
docs(createDataGrid): allow horizontal scroll on spanning example
johnleider May 12, 2026
0604d4a
fix(createDataGrid): pinned columns resize across regions
johnleider May 12, 2026
63d0d94
refactor(createDataTable): drop items option for registry pattern
johnleider May 12, 2026
11ce21f
chore(createDataGrid): adopt registry pattern from createDataTable
johnleider May 12, 2026
9a44685
chore(docs): restore master's FAQ component and section headings
johnleider May 12, 2026
b9f3d65
docs(createDataGrid): sweep multi-word identifiers in examples
johnleider May 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .claude/rules/composables.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ Scope-specific mechanics for `packages/0/src/composables/**`. Covers naming, fac
- §6.6 `useProxyModel`
- §6.7 `useProxyRegistry`
- §6.8 Register / unregister lifecycle contract
- §6.10 Collection composables: no `items` option
- §7 Events & lifecycle
- §9 Errors & invariants

Expand Down Expand Up @@ -343,6 +344,10 @@ const table = createDataTable({
- The composable has exactly one correct implementation, and consumers have no reason to swap it. Example: `useHotkey` — the listener semantics are fixed.
- You want to switch behavior based on a boolean flag. Use an option (`mode: 'client' | 'server'`) rather than dressing it up as an adapter. Adapters are for swapping *implementations*, not for flipping a known toggle.

### Collection composables: no `items` option

A composable that owns a collection of values exposes `register` / `onboard` / `unregister`. It never accepts an `items` option in its factory — row identity, order, and per-row state live in the registry. Followed by `createRegistry`, `createModel`, `createSelection`, `createSingle`, `createGroup`, `createStep`, `createNested`, `createSortable`, `createKanban`, `createQueue`, `createTimeline`, `createTokens`, and (after the recent refactor) `createDataTable` and `createDataGrid`. Full rule and migration shape: PHILOSOPHY §6.10.

### `useProxyModel` and `useProxyRegistry` — cross-link

Both composables are covered in PHILOSOPHY §6.6 and §6.7. Repeating the when-to-use summary here for composable authors:
Expand Down Expand Up @@ -494,3 +499,4 @@ Pure transformers (`toRef`, `toElement`, `toValue`) are fine to call inline —
- [ ] No DOM event binding inside the composable
- [ ] ID generation through `useId()`
- [ ] Trinity return only from `createTrinity` / `createContext` / `createPlugin`
- [ ] Composable that owns a collection of values uses `register` / `onboard`, never an `items` option (PHILOSOPHY §6.10)
1 change: 1 addition & 0 deletions .claude/rules/new-feature-checklist.md
Original file line number Diff line number Diff line change
Expand Up @@ -189,3 +189,4 @@ Prefer extending an existing pattern over creating a new one.
- [ ] Feature appears in `apps/docs/build/generated/api-whitelist.ts` after build
- [ ] `<DocsApi />` renders on the new docs page
- [ ] Maturity level matches the promotion criteria table (don't self-promote to `stable` or `mature` — those require a maintainer)
- [ ] Collection composable surface uses `register` / `onboard` (no `items` option) — see PHILOSOPHY §6.10
54 changes: 48 additions & 6 deletions apps/docs/src/components/docs/DocsFaq.vue
Original file line number Diff line number Diff line change
@@ -1,14 +1,56 @@
<script setup lang="ts">
<script lang="ts">
// Framework
import { ExpansionPanel } from '@vuetify/v0'
import { createFilter, createFilterContext, ExpansionPanel } from '@vuetify/v0'

// Utilities
import { toRef, useSlots } from 'vue'

export const [useFaqFilter, provideFaqFilter] = createFilterContext({
namespace: 'docs:faq',
})
</script>

const props = defineProps<{
<script setup lang="ts">
const { multiple = true } = defineProps<{
multiple?: boolean
}>()

const slots = useSlots()
const filter = createFilter()
provideFaqFilter(filter)

const count = toRef(() => {
const items = slots.default?.() ?? []
return items.filter(v => (v.type as { __name?: string })?.__name === 'DocsFaqItem').length
})

const show = toRef(() => count.value >= 5)

function onInput (e: Event) {
filter.query.value = (e.target as HTMLInputElement).value
}
</script>

<template>
<ExpansionPanel.Group class="flex flex-col gap-3 my-6" :multiple="props.multiple ?? true">
<slot />
</ExpansionPanel.Group>
<div class="my-6">
<div v-if="show" class="relative mb-3">
<AppIcon
class="absolute left-3 top-1/2 -translate-y-1/2 text-on-surface-variant pointer-events-none"
icon="search"
:size="16"
/>

<input
class="w-full pl-9 pr-3 py-2 text-sm bg-surface-tint border border-divider rounded-lg outline-none focus:border-primary transition-colors placeholder:text-on-surface-variant"
placeholder="Search FAQ..."
type="text"
:value="filter.query.value"
@input="onInput"
>
</div>

<ExpansionPanel.Group class="flex flex-col gap-3" :multiple>
<slot />
</ExpansionPanel.Group>
</div>
</template>
14 changes: 12 additions & 2 deletions apps/docs/src/components/docs/DocsFaqItem.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,23 @@
// Framework
import { ExpansionPanel } from '@vuetify/v0'

defineProps<{
// Context
import { useFaqFilter } from './DocsFaq.vue'

// Utilities
import { toRef } from 'vue'

const { question } = defineProps<{
question: string
}>()

const filter = useFaqFilter()
const result = filter.apply(filter.query, () => [question])
const visible = toRef(() => result.items.value.length > 0)
</script>

<template>
<ExpansionPanel.Root>
<ExpansionPanel.Root v-show="visible">
<ExpansionPanel.Activator
v-slot="{ isSelected }"
class="w-full list-item-bordered flex items-center gap-3 text-left"
Expand Down
Loading
Loading