Skip to content

chore: sync master into dev and add beta snapshot publish - #1017

Closed
johnleider wants to merge 47 commits into
devfrom
chore/beta-dev
Closed

johnleider wants to merge 47 commits into
devfrom
chore/beta-dev

Conversation

@johnleider

Copy link
Copy Markdown
Member

Sync origin/master into the dev line and add a local beta publish that does not commit version bumps.

dev package versions were still 1.2.0 while npm latest is 1.2.3. A snapshot calculated from that stale line would publish 1.2.1-beta-<datetime>, which is behind the stable release. This merge brings the public manifests in line with npm so the next beta calculates as 1.3.0-beta-<datetime>.

Beta publish

pnpm release:beta (scripts/changeset-beta.js) is the process. It is not changesets pre mode, and dev is not added to release.yml.

The script only runs from a clean checkout of the branch named dev whose HEAD equals origin/dev. It runs changeset version --snapshot beta (config sets snapshot.useCalculatedVersion), builds, then changeset publish --tag beta --no-git-tag, and restores the working tree. Snapshot rewrites to package.json / CHANGELOG.md and the applied changeset files are never committed. Those files stay on dev for the later stable cut.

Install with pnpm add @vuetify/v0@beta. A ^1.2.3 range will not take the beta. latest is not moved. No GitHub Release is minted. npm whoami has to succeed locally; the release.yml OIDC publisher does not cover this script.

The same run also publishes @paper/genesis, @paper/emerald, @paper/bulma, and @vuetify/play under beta, because a prerelease does not satisfy their workspace:^ ranges. @vuetify/paper stays private.

This PR does not publish. After it lands on origin/dev, log in to npm and run pnpm release:beta from a clean dev checkout.

Merge resolutions

  • apps/docs/src/pages/systems/bulma/modal.md — useFocusTrap exists in Vuetify0; BuModal's migration onto it is still pending.
  • packages/genesis/SPEC.md — keeps the GnDocsBadge token rows and the --v0-divider row.
  • pnpm-workspace.yaml — master's catalog pins, plus dev's @vue/devtools-api and vite-plugin-vue-devtools.
  • pnpm-lock.yaml — regenerated from that catalog with pnpm install --lockfile-only.

The merge also picks up master's eslint rules. Four test and example selectors now pass the id through CSS.escape, and the devtools localhost check uses non-capturing groups. Behavior is unchanged.

Fourteen patch changesets that already shipped on master are dropped by the merge: breadcrumbs ellipsis, button keyboard focus, data-table locale, datagrid resize, emerald calendar width, form fail-closed, form required, accent-insensitive match, input control omit-undefined, popover content id, popover plugin namespace, progress indeterminate, selection-layer cleanup, and tabs item focus target. They must not be re-noted on the 1.3.0 cut.

johnleider and others added 30 commits August 31, 2026 15:08
The Official Emerald UI Kit for Figma is on the Vuetify Store. Point the
landing card and install note at the product, and document the MIT Vue
package vs paid Figma companion split.
…app bar (#963)

* docs: wrap long headings and inline code instead of widening the mobile viewport

Long API tokens in h1-h3 (useIntersectionObserver, SUPPORTS_*) and inline
code paths had no break opportunity and pushed the layout viewport past
the phone width, panning the whole page. The mobile header-anchor ::after
was also in flow, extending scrollWidth by ~1em past the widest line.

Claude-Session: https://claude.ai/code/session_01UTCx471779RNB2pVGuW1RQ

* docs: let wide prose tables scroll with a visible affordance on mobile

width:100% resolved to max(container, min-content) at phone widths,
squeezing every wrappable column to one word per line while the last
column sat off-canvas with no scroll signal. Tables now take their
natural width (capped at 42rem) and scroll inside the markdown wrapper,
whose clipped edge fades via a scroll-driven mask; browsers without
scroll timelines get a thin styled scrollbar instead.

Claude-Session: https://claude.ai/code/session_01UTCx471779RNB2pVGuW1RQ

* docs: wrap breadcrumbs and truncate non-link crumbs at narrow widths

The nowrap current-page crumb pushed the trail past 320px viewports
(createOverflow, BuNumberField). The list now wraps, and crumbs without
a link keep a truncate backstop for single over-long tokens.

Claude-Session: https://claude.ai/code/session_01UTCx471779RNB2pVGuW1RQ

* docs: fit the app bar on 320px screens by collapsing social icons below 430px

The right cluster (theme, Discord, GitHub, account, settings) needed
~384px, leaving sign-in and settings untappable at 320 and clipping the
gear at 375. Below 430px the Discord/GitHub icons collapse away (both
stay reachable in the page footer) and bar padding and cluster gap
tighten one step; 430px and up render exactly as before.

Claude-Session: https://claude.ai/code/session_01UTCx471779RNB2pVGuW1RQ

* docs: pin the mobile header-anchor hash to the heading's last line

Follow-up to c49bdc0 per review: the abspos ::after took flex static
positioning from its inline-flex parent and painted over the heading's
first characters, so it gets explicit offsets — heading-relative, at the
inline-end of the last line, which a wrapped heading leaves short (the
first line is full by construction, and anything hung past the text end
re-widens the page). The overflow-wrap rules are also scoped under 768px
to match the defect and the original commit's intent.

Claude-Session: https://claude.ai/code/session_01UTCx471779RNB2pVGuW1RQ

* docs: scope mobile table rules to markdown-emitted tables and flip the edge fade for RTL

Follow-up to 4e1f143 per review: the width clamp and fade matched any
table wrapper under .markdown-body, squashing example and app tables that
manage their own widths (DataGrid demos, benchmarks, freshness, API
index). Both markdown pipelines now stamp their wrapper with .docs-table
and the rules target only that. The fade gradient gains a [dir=rtl]
override (scroll progress starts at the right edge there) and the
-webkit-mask-image prefix the file uses elsewhere.

Claude-Session: https://claude.ai/code/session_01UTCx471779RNB2pVGuW1RQ

* docs: add the footer to the fullscreen layout

The skillz tour player and the 404 page had no AppFooter, so collapsing
the app-bar social icons below 430px left those routes with no Discord or
GitHub link at all. They now carry the same inset footer as the default
layout.

Claude-Session: https://claude.ai/code/session_01UTCx471779RNB2pVGuW1RQ

* docs: drop the inset prop from the fullscreen footer

Follow-up to 31d9124 per review: inset adds md:ms-[230px], but AppMain
carries no nav offset, so the footer indented against un-indented content
on md+. Bare AppFooter, as home.vue uses it.

Claude-Session: https://claude.ai/code/session_01UTCx471779RNB2pVGuW1RQ

* docs: stamp docs-table on the API index tables and outrank the base width rule structurally

Follow-up to e0c5f3c per review: DocsApiIndex hand-writes the same
overflow wrapper the markdown pipelines emit, so its tables missed the
mobile width fix and fade; both wrappers now carry .docs-table. The
mobile width rule also selects both wrapper classes so it outranks the
base table rule at (0,3,2) instead of tying at (0,2,2) and winning on
source order alone.

Claude-Session: https://claude.ai/code/session_01UTCx471779RNB2pVGuW1RQ
…ction cache (#964)

* docs(DiscoveryContent): keep mobile tour cards inside the viewport

The mobile branch anchors only the card's vertical edge, so a target
spanning most of the viewport (Ask AI panel, an expanded code pane)
left no room on the anchored side and pushed the card off-screen
(using-the-docs#ask-ai-panel rendered at y=-189 with Exit/Back
unreachable). Measure the target when a step activates: flip
top/bottom when the anchored side can't hold a card, and center over
targets taller than 60vh, where neither side can.

Claude-Session: https://claude.ai/code/session_01UTCx471779RNB2pVGuW1RQ

* docs(skillz): wrap the detail-page action row at phone widths

With a completed tour the header cluster (duration + Reset + Restart +
Next CTA) runs ~400px wide and clipped the primary CTA at 375.

Claude-Session: https://claude.ai/code/session_01UTCx471779RNB2pVGuW1RQ

* docs(api): invalidate the API extraction cache when package sources change

api-cache.json never expired, so a manifest extracted before a component
landed 404s its minted /api/<slug> route forever (/api/data-grid and
/api/data-table with a pre-1.1 cache) and resurrects internals the
barrel no longer exports (createFocusTraversal/createObserver ghosts in
the /api/ index "Other" category). Stamp the cache with a fingerprint of
packages/0/src component+composable files and regenerate on mismatch.

Claude-Session: https://claude.ai/code/session_01UTCx471779RNB2pVGuW1RQ

* docs(DiscoveryContent): stop the activator poll when its step deactivates

The rAF poll loop was gated only on unmount, so next/back/exit while
polling let a stale loop measure() and set isReady for a step no longer
active. Bail when root.isActive drops.

Claude-Session: https://claude.ai/code/session_01UTCx471779RNB2pVGuW1RQ
* docs: fix P1 example layouts at phone widths (wave 3a)

- treeview settings-panel: stack description pane below the tree under sm
  so labels no longer paint through the fixed w-48 sidebar
- create-rating StarRating: let the rating label wrap under the stars
  instead of crushing to one-character lines
- emerald tabs vertical: shrink-guard the tablist and stack the demo
  column-wise below 600px
- emerald pagination summary: wrap the control row so Next stays visible
  and tappable (works around the Pagination.Root fit-measurement gap for
  non-page slot content; package issue reported separately)
- benchmarks summary cards: single column below sm to stop page h-scroll

Claude-Session: https://claude.ai/code/session_01UTCx471779RNB2pVGuW1RQ

* docs: fix home, health, and example layouts at phone widths (wave 3b)

- DocsFreshnessTable: wrap the table footer and hide First/Last page
  buttons below sm so the pagination row no longer sets a ~395px layout
  width on /health
- HomeHero: stack the CTA pair below sm so Get Started is no longer
  clipped at the left edge at 320
- HomeEcosystem: truncate explore-card labels instead of clipping
  mid-glyph (also closes the home 320 h-scroll flake)
- create-trinity ToastConsumer: stack the tuple tiles below sm so the
  mono labels stop overlapping
- number-field CartLineItems: wrap line items so product names keep a
  full line and prices stop wrapping word-per-line

Claude-Session: https://claude.ai/code/session_01UTCx471779RNB2pVGuW1RQ

* docs: fix P2 example clipping at phone widths (wave 3c)

- use-reduced-motion basic: wrap the mode row so the MOTION chip is no
  longer clipped at the card edge
- create-breadcrumbs basic: wrap the demo trail so every crumb stays
  reachable inside the overflow-hidden preview panel
- splitter playground: truncate explorer labels so narrow panes
  ellipsize instead of clipping mid-glyph

Claude-Session: https://claude.ai/code/session_01UTCx471779RNB2pVGuW1RQ
0.1.0 was first-created with npm publish, so the tarball still has
workspace:^ and catalog: protocol strings. A play patch changeset
puts 0.1.1 on the current Version Packages PR; pnpm pack rewrites
both to semver.
GitHub's Latest badge is last-write-wins. A cut that also mints
@paper/* or @vuetify/play was leaving that last DS/play release as
Latest instead of the substrate v* tag. Pass --latest on the stable
v* mint and --latest=false on every other.
* chore(deps): refresh catalog to latest installable

Same-major catalog bump under the 14-day age gate (vue/vite/eslint
age-excluded). Absorb the type/lint/knip fallout in the same PR.

Bumps: vue 3.5.42, vite 8.2.2, vue-tsc 3.3.10, tsdown 0.22.14,
satori 0.29.1, eslint-config-vuetify 4.7.2, knip 6.32.2, @vue/repl
4.7.2 (re-patched), plus the rest of the same-major set.

Holds: majors, rollup-plugin-sass rc, simple-git-hooks (too new).

Vue 3.5.42 needed catalog-pinned vue on paper/emerald/genesis (they
were stuck on 3.5.39 via autoInstallPeers) and MaybeRefOrGetter
widening for useTemplateRef in createOverflow / useDragDrop.

* chore(ci): fix playwright cache key and hold vue-component-meta

Playwright 1.62.1 needs a new Chromium; the cache key was still
1.61.0 so CI restored a stale binary and skipped install.

vue-component-meta 3.3.10 extracted 0 components (silent catch), so
API markdown twins never wrote and lychee 404'd /api/*.md. Hold at
3.2.7; log extract failures so this does not fail silent next time.
Co-authored-by: johnleider <9064066+johnleider@users.noreply.github.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
…rcel v0.dev (#977)

* docs: sweep bare 'v0' prose toward 'Vuetify0' to disambiguate from Vercel v0.dev

- Changed first-mention-per-section prose references from bare 'v0' to 'Vuetify0'
- Preserved @vuetify/v0 package references, #v0/ import paths, --v0-* CSS variables
- Preserved code examples, namespace identifiers, and technical references
- 95 files changed, 306 insertions(+), 306 deletions(-) across docs prose

Before: 1254 bare 'v0' matches | After: 996 matches (258 prose references changed)

Resolves naming collision confusion with Vercel's v0.dev AI product.

* docs: restore @vuetify/v0 and finish Vuetify0 prose

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
* docs: document markdown twins on ai-tools page

* docs: clarify markdown twin paths for index pages
* docs(philosophy): align axioms with source and adapter CSS carve-out

Resolve PHILOSOPHY vs source contradictions: readonly is type-load-bearing with runtime wrap on plugin fallbacks only, DOM-query is a component-Root fire-and-forget read, theme adapters emit custom properties and color-scheme, and over-axioms (slots, aria-disabled, locale strings, Locale dual-mode, overlay roots, createQueue) are narrowed to match the tree.

* fix(useTheme): stop emitting element-level color on [data-theme]

ThemeAdapter.generate() still writes custom properties and color-scheme. It no longer sets color: var(--*-on-background) on the theme selector — applying tokens is Paper's job.

* fix(createFilter): track reactive keys

keys now accepts a ref or getter (MaybeRefOrGetter<readonly string[]>), so changing which fields are searched re-runs the filter. Passing a plain string[] is unchanged.
The v1.0 / unreleased-dev copy is outdated. Leave AppBanner wired so a future announcement can register a ticket, and default --app-banner-h to 0 so the shell does not reserve a 24px gap.
Disabled Toggle.Root now sets the HTML disabled attribute when as is
"button" (the default) and omits aria-disabled on that path. Non-button
hosts still get aria-disabled.
Docs toolbar actions now show the themed tooltip on hover and keyboard
focus, and share the app's tooltip delay region.
Follow-up to #988. Remaining docs chrome still used native title for hover
labels; those now go through AppTooltip so they share the plugin region.
Examples keep native title.
Remember the selected rail in localStorage via useStorage, defaulting to
Vuetify One. Enroll the pref on the always-mounted menu bar so the
watcher survives the v-if'd dialog unmount.
Component/composable pages posted examples+api blobs (~4.5–11.5KB)
and CF returned 403 HTML without CORS (Failed to fetch). Send a
slim API summary only, drop example source, keep payload ≤2KB.

Tracked on johnleider/ops#45.
* docs(benchmark): default history tooltip to last 5 runs

Show only the 5 most recent benchmark runs in the trend tooltip by default.
Users can click 'Show all N runs' to see full history.

The sparkline still shows full history for visual context.

* docs(benchmark): make history tooltip interactive/hoverable

Add interactive prop to Tooltip.Root so users can move the pointer
onto the tooltip content and click 'Show all N runs' without the
tooltip disappearing when leaving the sparkline.

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
#966 stacked coarse-pointer py-2 on every row on top of gap-2, which made the mobile nav drawer too sparse. Drop the extra padding, shrink the chevron hit area to 24px, and use gap-1 below md.
Keep Vue-managed empty state out of the observed node so childList logs
are not polluted, and add Update Text so characterData actually fires.
johnleider and others added 17 commits September 23, 2026 08:44
Monaco has no formatter for .vue, so Format did nothing on App.vue.
Prettier now formats those files. An Auto format switch on the Format
item and in editor settings runs it when the editor blurs, and is off
by default so a blur rewrite cannot autosave a One playground.

The blur path writes the file that lost focus. vue-repl flushes editor
changes onto whichever file is active 250ms later, which would otherwise
paste the formatted text into the file you just switched to.
Vue's browser compiler rejects `import type` from a package inside
defineProps, defineEmits, and defineModel. Rewrite those imports to a
relative src/v0-macros.ts shim when an example loads, and keep the
shim out of the deletable file tree.
xs through xxl now follow the threshold key that matched. andUp and
andDown use the fixed xs-to-xxl order, so an out-of-order custom map
keeps name and the boolean flags in agreement.
* docs(paper): lock spec exclusivity and orchestrator wrapping

A design system implements one pinned spec, all of it and nothing else.
Vuetify wraps that package (v0 Button → MdButton → VBtn) and does not own
Material. Onyx ships before Material. Emerald, Bulma, and Genesis SPECs
name what they deliberately omit.

* docs(agents): show the skills install for every package manager

The skills add command was an npx-only fence. Match the other install
blocks: pnpm, npm, yarn, and bun.

* chore(dev): regenerate composable auto-imports

Pick up the popover plugin globals and drop the duplicated V0Error export.
The guide offered three plugins/v0.ts files, and the theme cookie
default made the color-scheme branch unreachable. One plugin now
renders theme CSS on the server, shares viewport width, and installs
hydration. Getting Started points at that file instead of a second one.
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
…de-group (#1008)

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: johnleider <9064066+johnleider@users.noreply.github.com>
* docs: improve @paper/emerald README

* docs: improve @paper/bulma README

* docs: improve @vuetify/play README

* docs: add Genesis package README

* docs: fix license badge link

* docs: fix license badge link

* docs: fix license badge link

* docs: fix license badge link

* docs: improve Play README accessibility

* docs(bulma): use centered Vuetify0 wordmark

* docs(emerald): use centered Vuetify0 wordmark

* docs(genesis): use centered Vuetify0 wordmark

* docs: align package README logo size and alignment with packages/0

Co-authored-by: John Leider <johnleider@users.noreply.github.com>

* docs: center package README logos

Co-authored-by: John Leider <johnleider@users.noreply.github.com>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: John Leider <johnleider@users.noreply.github.com>
Archbox history snapshots for the two published versions that had no point in the series. Same host and bench suite as 1.2.1.
# Conflicts:
#	apps/docs/src/pages/systems/bulma/modal.md
#	packages/genesis/SPEC.md
#	pnpm-lock.yaml
#	pnpm-workspace.yaml
pnpm release:beta versions from a clean dev checkout, publishes under the beta dist-tag, and restores the tree so the version line never lands in git.
unicorn/no-process-exit allows process.exit only in shebang scripts and signal handlers. The refusals have to abort; exitCode alone would continue and could publish from the wrong branch.
Master's eslint flags unused regexp groups and unescaped CSS selectors. The devtools origin check and the Tour / focus-trap queries are the only hits.
@johnleider johnleider added this to the v1.3.0 milestone Oct 6, 2026
@johnleider johnleider added the documentation Improvements or additions to documentation label Oct 6, 2026
@johnleider johnleider self-assigned this Oct 6, 2026
@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

⚠️ No changeset found

This PR changes packages/* source but has no changeset, so it won't be in the next release's version bump or notes. Add one:

pnpm changeset

Pick the affected package(s) — @vuetify/v0 carries @vuetify/paper automatically; @paper/genesis (and other @paper/* design systems) version separately — a bump type, and a short summary, then commit the generated .changeset/*.md. Docs-only, chore, or CI PRs can ignore this.

@johnleider

Copy link
Copy Markdown
Member Author

Closing this. The master sync and the beta-publish script are separate changes, and squash-merging this PR would collapse the commits already on master into one new SHA.

Master is being merged into dev as a merge commit on its own.

@johnleider johnleider closed this Oct 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant