Documentation menu
Documentation / Foundation / motion
Motion
npm install @wabbit/tome-motionFirst install from our registry?
Get a free registry token from your credentials page. Every install from our registry needs one, free packages included.
Add the registry and your token to the
.npmrcat the root of your project, with your token in place ofYOUR_TOKEN:@wabbit:registry=https://npm.wabbit.com/ //npm.wabbit.com/:_authToken=YOUR_TOKEN
Client-side motion adapter layer — React bindings over GSAP, @gsap/react, and Lenis, plus a prefers-reduced-motion contract every hook honors; binds tome-chrome scroll behavior and tome-blocks-extras block animation.
Overview
The client-side motion adapter layer: React bindings over GSAP + @gsap/react + Lenis, plus a prefers-reduced-motion contract every declarative hook honors. ui layer per root ARCHITECTURE.md — it has no @wabbit/* runtime dependencies (it does not depend on @wabbit/tome-core or @wabbit/tome-blocks-core; useDebouncedResize lives at @wabbit/tome-blocks-core/utilities/useDebouncedResize). Adapter modules bind motion's hooks to two downstream consumers' adapter contracts: @wabbit/tome-chrome (header/footer scroll behavior) and @wabbit/tome-blocks-extras (block-level scroll animation).
Peer dependencies
| Peer | Range | Notes |
|---|---|---|
gsap | >=3.13 | |
@gsap/react | >=2.1 | |
react / react-dom | >=19.0.0 | |
lenis | >=1.1 | optional — only needed if you mount LenisProvider/useLenis |
60-second quickstart
// app root
import { MotionProvider } from '@wabbit/tome-motion'
<MotionProvider>{children}</MotionProvider>// any client component under the provider
'use client'
import { useRef } from 'react'
import { useTween } from '@wabbit/tome-motion'
export function FadeIn({ children }: { children: React.ReactNode }) {
const ref = useRef<HTMLDivElement>(null)
// useTween(target, gsapVars, options?) — target is a ref or a CSS selector;
// options.kind defaults to 'to'. It returns nothing; cleanup is automatic.
useTween(ref, { y: 0, opacity: 1 }, { kind: 'fromTo', fromProps: { y: 20, opacity: 0 } })
return <div ref={ref}>{children}</div>
}Provider setup
Every hook (including useReducedMotion) throws a MotionLayerError when it runs outside <MotionProvider>, so mount the provider once, high in the client tree. MotionProvider takes an optional options prop (MotionProviderOptions): autoRegisterScrollTrigger (default true), autoRegisterPlugins (extra GSAP plugins, registered once), and tokenNames (override the CSS custom properties it reads). Token defaults, used until the provider has read the page's CSS: fast 150 ms, normal 300 ms, slow 500 ms, ease power2.out. The provider sets gsap.defaults({ duration: normal, ease: easeOut }), so raw gsap calls pick those up too.
Public API
| Export | Description |
|---|---|
MotionProvider | Root provider — registers GSAP plugins, parses --tome-motion-* tokens, subscribes to prefers-reduced-motion, seeds gsap.defaults |
LenisProvider, useLenis, useLenisRefresh | Optional smooth-scroll integration |
useTween | Declarative gsap.to/from/fromTo/set wrapper with automatic reduced-motion collapse |
useTimeline | gsap.core.Timeline ref, React-lifecycle-managed via useGSAP |
useScrollTrigger | ScrollTrigger-driven tween wrapper |
useTicker | gsap.ticker-driven per-frame callback |
useGSAPContext | Escape hatch — raw useGSAP context + contextSafe, for patterns the declarative hooks can't express |
useReducedMotion | Thin accessor over MotionContext.prefersReducedMotion — the provider owns the single matchMedia subscription |
useParallaxScope, ParallaxScope | Parallax scroll utility hook + wrapper component |
usePerfMonitor, MotionDebugHUD | Dev-time FPS/reduced-motion telemetry overlay |
RouteTransition | Opts full page loads (cross-document navigations) into view transitions by server-rendering @view-transition { navigation: auto; } into <head>; disabled opts a page out |
killTweensInScope | Cleanup utility |
MotionLayerError | The error every hook throws when used outside MotionProvider |
Types: MotionTokens, MotionProviderOptions, MotionContextValue, TweenOptions, ScrollTriggerOptions, TickerOptions, TimelineOptions, GSAPContextSetup, UseParallaxScopeOptions, UseParallaxScopeReturn, PerfMonitorSample, MotionDebugHUDProps, MotionDebugHUDPosition | Option and return shapes |
gsap (default), ScrollTrigger | Raw GSAP re-export — see escape hatch note below |
@wabbit/tome-motion/adapters/chrome → chromeMotionAdapters | Binds useScrollDirection/useReducedMotion/useFooterParallax to @wabbit/tome-chrome's ChromeMotionAdapters contract. Pass it as <HeaderRenderer motionAdapters={chromeMotionAdapters}>. useScrollDirection and useFooterParallax are reachable only through this adapter; the root barrel does not export them |
@wabbit/tome-motion/adapters/blocks-extras → blocksExtrasAdapters | Binds motion hooks to @wabbit/tome-blocks-extras' adapter contract |
./test → MockMotionProvider | Test-only MotionProvider stand-in for component tests that don't need real GSAP |
Server / client posture
There is no server subpath — this entire package is browser-only. 19 of its 27 non-test source modules declare 'use client' (every hook, provider, and component, plus the chrome adapter); the rest are directive-free plain modules (types, token parsing, the context object, plugin registration, the two utilities, the blocks-extras adapter, and the barrel). The barrel index.ts re-exports client-only modules plus the raw gsap/ScrollTrigger values, so importing anything from @wabbit/tome-motion other than pure types forces the importing tree client. MotionProvider itself is a Client Component, so you can render it from a Server Component layout.
The reduced-motion contract — and the raw-GSAP escape hatch (documented honestly)
MotionProvider owns the single matchMedia('(prefers-reduced-motion: reduce)') subscription and exposes prefersReducedMotion through context; every hook reads it from there — none subscribes independently. The value is read synchronously on the client's first render (it is false only on the server, where there is no matchMedia), so tweens that run on mount already see the user's preference. The declarative hooks auto-gate, with a per-call opt-out:
useTween— when reduced-motion is active (andrespectReducedMotion !== false),kind: 'to'/'fromTo'/'set'collapse togsap.set()(instant end state) andkind: 'from'becomes a no-op. Pass{ respectReducedMotion: false }for an animation that IS the content. The tween re-runs when the preference changes, so turning reduced motion on after mount lands the element on its end state.useTimeline— still builds the timeline (so the ref is populated and consumer.to()calls don't throw), then calls.progress(1).pause()when reduced-motion is active. The caller is responsible for re-calling.progress(1)after appending children if they want an instant end state visible —useTimelineonly provides a best-effort default.MotionProvideritself, on a live OS-level toggle to reduced-motion, walksgsap.globalTimeline.getChildren()and force-progresses every active tween to1(end-state jump).
Known gap — the first mount. The provider starts with prefersReducedMotion: false and reads the real preference in a layout effect. React runs a child's layout effects before its parent's, so hooks that fire on first mount (a useTween with no dependencies, for example) can read false and start a full animation for a visitor who has reduced motion on. The later state update does not re-run them, and the end-state jump above fires only on a live change. If mount-time motion matters for you, add useReducedMotion()'s value to the hook's dependencies, or start the animation after mount.
The escape hatch does NOT auto-gate. gsap and ScrollTrigger are re-exported raw from the package root (export { default as gsap } from 'gsap') — a consumer reaching for raw gsap instead of the hooks gets zero reduced-motion protection; nothing in this package intercepts calls made directly on the raw instance. Likewise useGSAPContext (the hook-level escape hatch for patterns the declarative hooks can't express — mobile-state branching, getBoundingClientRect() mid-setup, cross-element contextSafe orchestration) does not auto-collapse: its own source comment states the contract plainly — "Callers MUST read `useReducedMotion()` and branch manually," typically via an early if (prefersReduced) return inside the setup callback. Any new consumer code that reaches for raw gsap or useGSAPContext carries the reduced-motion obligation itself; there is no ambient enforcement.
Testing
pnpm --filter @wabbit/tome-motion test runs the Vitest suite (jsdom) in src/test/. In your own component tests, wrap with MockMotionProvider from @wabbit/tome-motion/test instead of the real provider, so no GSAP plugin registration or matchMedia is needed. It swaps in no-op GSAP and ScrollTrigger stubs; set its reducedMotion prop to test the collapsed path.
Extending
New declarative hooks follow the useTween/useTimeline pattern: read useMotionContext() for gsap/prefersReducedMotion, wrap the GSAP call in useGSAP() for automatic cleanup, and decide the reduced-motion collapse behavior explicitly in the hook body (don't leave it to the consumer unless the hook is itself an escape hatch). New adapter bindings (a third downstream consumer beyond chrome/blocks-extras) follow adapters/chrome.ts's pattern: a type-only compile-time import of the consumer's adapter contract, a thin object of hook references, no wrapping.
Design history
- Original design: the declarative
useTween/useTimelinehooks plus the reduced-motion auto-gate. - Hardening pass added block-author guidance for consumers wiring motion into custom blocks.
- The motion-optional pattern (
NOOP_CHROME_ADAPTERS/isMotionActive) followed, so a consumer without this package installed still gets a working no-op adapter instead of a hard dependency;useDebouncedResizewas deprecated in the same pass and has since been removed from this package — import it from@wabbit/tome-blocks-core/utilities/useDebouncedResize. docs/claude-gotchas.md→ Payload / Typing / Layer Design section — "Duplicate installed copies of an adapter-bearing pack break React context" applies directly to this package's adapter modules
Exports
| Import path |
|---|
@wabbit/tome-motion |
@wabbit/tome-motion/test |
@wabbit/tome-motion/adapters/blocks-extras |
@wabbit/tome-motion/adapters/chrome |
Changelog
0.5.xMinor
RouteTransitionnow server-renders its@view-transition { navigation: auto; }rule into<head>(a React 19 hoisted<style>) instead of injecting it from a layout effect after hydration.A cross-document view transition needs the opt-in in both documents when the new page is revealed, which happens before hydration. The effect-injected rule was always too late on the arriving page, so Chrome aborted every transition and threw an uncaught
InvalidStateError: Transition was aborted because of invalid state. ViewTransition opt-in disabledon each full page load.Full page loads now actually cross-fade on sites that mount
RouteTransition.The rule has no effect on client-router (same-document) navigations, and the docs no longer claim it does.
disabledis decided per document: React keeps a hoisted style once inserted, so turningdisabledon during a client navigation does not remove a rule an earlier route already added.
2 fixes (0.5.1 – 0.5.2)
- 0.5.2
The changelog, README and license text now use American spellings.
No code or behavior changes.
- 0.5.1
README: subpath and file mentions are written package-qualified (for example
@wabbit/tome-x/render) or as code text, so crawlers no longer resolve them as site URLs.
0.4.xMinor
BREAKING:
useDebouncedResizeis no longer exported from@wabbit/tome-motion; import it from@wabbit/tome-blocks-core/utilities/useDebouncedResize.Migration: replace
import { useDebouncedResize } from '@wabbit/tome-motion'withimport { useDebouncedResize } from '@wabbit/tome-blocks-core/utilities/useDebouncedResize'. The hook's signature and behavior are unchanged; only its import path moves.Add
@wabbit/tome-blocks-coreto your own dependencies if you do not already install it.Deprecation window: the motion re-export was marked
@deprecatedand announced for removal in 0.2.0. It stayed in place through the 0.2.x and 0.3.x lines, well past that announced window, and is removed now.The hook is a plain DOM helper with no motion dependency, so it lives with the block substrate whether or not motion is installed.
With the re-export gone,
@wabbit/tome-motionno longer depends on@wabbit/tome-blocks-core, so installing motion stops pulling in the block substrate.
1 fix (0.4.1)
- 0.4.1
Published packages now contain compiled JavaScript and type declarations under a one-line license banner, and no longer include source maps.
What you install: one compiled
.js(ESM) and.cjs(CommonJS) file per source module, its.d.ts/.d.ctsdeclarations, and the stylesheets, fonts and other assets a package already shipped. Every JavaScript module opens with a comment naming the package and its license:/*! @wabbit/<package> — © Wabbit, LLC. Wabbit Tome Commercial License (see LICENSE.md). Not for redistribution. */.The
.mapfiles and thesourceMappingURLcomments that pointed at them are gone, which roughly halves the size of each tarball.Debugging: the code is still unbundled and unminified, one readable file per module, so a stack trace points at real code with real names. Line numbers in a stack trace are one higher than before, because of the banner line.
A
'use client'directive stays the first statement of its module (the banner is a comment above it), so React Server Component boundaries are unchanged.No API change, no runtime behavior change, and nothing to do on upgrade.
In
@wabbit/tome-blocks-gallery, the source snapshotsextractGallerySourcewrites from an installed pack leave out the license banner line, so a component or config snapshot starts at the code and a paid block's preview shows its first 15 lines of real code.
0.3.xMinor
Raise the
react/react-dompeer floor to>=19.0.0(ruled 2026-09-01).The platform declared React peers in five different shapes —
>=18.0.0,>=18,^18 || ^19,^18.3.0 || ^19.0.0,^19.0.0— while its kernel (@wabbit/tome-core) and five app-layer packages already required>=19. Any package advertising React 18 was advertising a configuration that could not be installed alongside the kernel, so the split was never a supported matrix; it was drift.One shape now, and it is the honest one.
These nine version independently of the
linkedblocks family (which gets its own coordinated bump), so they are listed here:@wabbit/tome-admin,@wabbit/tome-admin-pro— from^18.3.0 || ^19.0.0@wabbit/tome-blocks-gallery— from^18 || ^19; devDepsreact/@types/react^18.0.0→^19.0.0@wabbit/tome-blocks-org-pack— from>=18.0.0; same devDep correction@wabbit/tome-engine,@wabbit/tome-motion,@wabbit/tome-rpg,@wabbit/tome-webgl— from>=18@wabbit/tome-ui— from>=18.0.0
The
^18devDependency pins on the two block-shaped packages were already fiction: the rootpnpm.overridespins@types/reactto19.2.14, so both have been building against React 19 types regardless. Correcting them changes the manifest, not the resolved tree.Consumer impact: a React 18 consumer can no longer install these. That install was already impossible with the kernel in the graph.
dist now raw-Node loadable: relative specifiers get explicit extensions post-build.
buildgains&& node ../../scripts/fix-dist-extensions.mjs --strictas its last step, joining the 13 packages that already ran it. tsup buildsbundle: falseand emits relative specifiers exactly as the TypeScript source wrote them — extensionless — which bundlers resolve and raw Node does not (ESMERR_MODULE_NOT_FOUND; CJS worse,require('./x')finds the ESM.jstwin and Node 22+require(esm)then dies on that file's own extensionless import). Every consumer outside a bundler hit this: the payload CLI under plain node,generate:types,generate:importmap, ops scripts, codegen tools.No source changes, no API changes, and bundler consumers are unaffected — extensioned relative specifiers are universally resolvable.
Two supporting changes made the wiring possible, both in repo scripts rather than package source.
fix-dist-extensions.mjsnow skips bundler-asset specifiers (.css,.module.css,.scss, fonts, images, shaders) by explicit extension allowlist instead of reporting them as unresolvable — that single gap is why the 13 prior adopters were exactly the 13 packages that ship no CSS, since--strictexited 1 on any package with a relative stylesheet import.Dotted MODULE names (
./config.meta,./x.variants,./y.demo) are deliberately NOT treated as assets and still get.js/.cjsappended.assert-node-loadable.mjsgained the matching carve-outs so the new repo-wide CI gate reports real defects only: a resolution failure whose path lands undernode_modulesis a peer SKIP (next@15 has no exports map, sonext/imagefails as an absolute path), and a bundler-asset load failure is an environmental SKIP (CJS surfaces it asSyntaxError: Unexpected token '.'raised from inside the stylesheet).Verified before/after on four packages built one at a time: print 8 FAIL → 0, readout 22 FAIL → 0, ai 3 FAIL → 0, gamification 2 FAIL → 0 (its failure was the other signature — a
directory importmissing/index). cop was already clean on a fresh build, so the audit's "27 of 46 fail" figure includes at least one package whose local dist was merely stale.Manifest metadata:
homepage,bugs,engines.All 46 publishable manifests were missing the three fields a consumer sees before any code (2026-09-01 sale-readiness audit §6). Metadata only — no source, no build, no runtime change.
homepagedeep-links to that package README on GitHub (.../tree/main/packages/<dir>#readme). Without it a registry page links to the monorepo root and the reader has to guess which of 46 folders they want.bugs.urlpoints at the repo issue tracker, so a paying customer has a place to report a defect that is not email.engines.nodeis>=22, matching the rootenginesand.nvmrcset the same day. This is a real floor, not decoration: CI on Node 20 could not expand the glob the block packs use fornode --test, and a package installed on Node 20 fails at a runtime the installer cannot connect back to the version.
The forcing function ships with the change:
scripts/assert-manifest-metadata.mjs(rootpnpm assert:manifest-metadata, wired intoplatform-discipline.ymlbesideassert:license-metadata) fails when any publishable manifest lacksdescription,repository.directorymatching its own folder,homepage,bugs,engines.nodeequal to the repo floor,license,filesorsideEffects. It reported 138 violations before this change and 0 after.Updated dependencies [57875ba]
Updated dependencies [b01ca1f]
Updated dependencies [0836ef5]
Updated dependencies [73081e6]
Updated dependencies [090e984]
Updated dependencies [73081e6]
- @wabbit/tome-blocks-core@0.16.0
6 fixes (0.3.1 – 0.3.3)
- 0.3.3
Tweens that run on mount no longer animate for users who prefer reduced motion.
MotionProvidernow readsprefers-reduced-motionsynchronously on the client's first render instead of starting atfalse, souseTweencalls that run on mount no longer animate for reduced-motion users.useTweenalso re-runs when the preference changes after mount. - 0.3.3
Updated dependencies [1e481f4]
- 0.3.3
Updated dependencies [252ef2d]
- 0.3.3
Updated dependencies [cbbc37c]
- @wabbit/tome-blocks-core@0.18.1
- 0.3.2
Updated dependencies [c3468b0]
- @wabbit/tome-blocks-core@0.18.0
- 0.3.1
Updated dependencies [404d325]
- @wabbit/tome-blocks-core@0.17.0
0.2.xMinor
Initial publish to npm.wabbit.com — first registry release for the 5 non-block-pack packages.
Companion to the existing sprint-3-blocks-split changeset (which handles the 11 linked block packages). Together these two changesets bring all 8 publish-pipeline-Phase-2-remediated packages to a coherent first-release cohort:
@wabbit/tome-core0.1.0 → 0.2.0@wabbit/tome-ui0.2.0 → 0.3.0@wabbit/tome-motion0.1.0 → 0.2.0@wabbit/tome-lms0.1.0 → 0.2.0@wabbit/tome-lms-ui0.1.0 → 0.2.0@wabbit/tome-blocks-core0.1.0 → 0.2.0 (via sprint-3)@wabbit/tome-blocks-extras0.1.0 → 0.2.0 (via sprint-3)@wabbit/tome-blocks-marketing-starter0.1.0 → 0.2.0 (via sprint-3)
All 8 packages ship with metadata, dist/ output, exports map verified by P6 scratch-consumer smoke (35/35 resolutions), 'use client' + 'server-only' directives preserved through tsup bundle:false. Verdaccio v0 live since 2026-04-18 at npm.wabbit.com.
Updated dependencies
Updated dependencies [f2202cd]
- @wabbit/tome-core@0.2.0
- @wabbit/tome-blocks-core@0.3.0
37 fixes (0.2.3 – 0.2.25)
- 0.2.25
Purge client-specific lore and Star Citizen universe references from all non-SC packages (content and labels only — no schema field names, slugs, or enum values changed).
- dispatch: demo content rewritten as an incident-war-room / ops-bridge scenario (SEV-1 bridge traffic, failover runbooks, recovered security-report transcript) plus neutral original fiction for inherently fictional variants (Relay Station Aurelia personal log, SV Aurelia ship log). Config field-description examples de-lored (old client- and universe-specific labels → neutral equivalents).
- readout: all 9 blocks' demo props rewritten as business-operations console data (deployment phases, sprint objectives, service status, perimeter traffic, on-call roster, infrastructure asset cards). Config examples de-lored.
- blocks-signal-theme: demo props for the 33-block pack rewritten as an original search-and-rescue expedition serial ("Operation Long Wake", SV Aurelia, Meridian Reach) with zero client or SC references; config examples de-lored. Pack positioning (SC-tier bundling per OQ-4) unchanged.
- blocks-extras / blocks-content-writer: Custom Hero and Post Hero meta descriptions stop name-dropping the client; "Callsign" field descriptions neutralized to "Author name or handle"; provenance comments neutralized.
- blocks-core: BLOCK_CATALOG mirror entries refreshed for custom-hero and post-hero only; registry comment neutralized.
- blocks-gallery: SourceBadge label for the
vngdsource value now renders "Legacy" (enum value unchanged). - accounts / core / lms / ui / org / admin / motion / longform / cop / blocks: internal provenance comments, shipped CSS comments, and consumer-visible field descriptions that named a specific client replaced with neutral "upstream" phrasing; longform package description de-lored. Historical CHANGELOG entries left untouched.
- 0.2.25
Updated dependencies [71d3b09]
- @wabbit/tome-blocks-core@0.15.9
- 0.2.24
useTicker: make
enabledactually able to STOP a running ticker.enabledcould only ever prevent a ticker from starting. Flipping it false after mount did nothing, silently.useGSAP computes
deferCleanup = dependencies.length && !revertOnUpdate, and deferred cleanup runs only on unmount. So a dependency change re-invoked the effect body without first tearing down the previous run: theenabled === falseearly return was reached,ticker.remove(callback)never was, and the callback registered on the first render kept firing forever — while the call site read as though it had been switched off.Found the hard way. The marquee viewport gate (blocks-extras 0.15.3) passed
enabled: inViewport, typechecked, built, shipped, and changed nothing measurable: the off-screen marquee kept mutating at ~127/s in production because its ticker was registered once and never removed.revertOnUpdateis now set only when a consumer actually passesenabled, so anyone relying on the existing defer-to-unmount lifecycle is unaffected. At time of writing the onlyuseTickerconsumers in the monorepo are Marquee and ImageMarquee, both of which passenabled.Covered by
src/test/useTicker.test.tsx— registration, teardown on flip, re-registration on flip back, and non-interference for consumers withoutenabled. The teardown test was verified to fail whenrevertOnUpdateis removed, rather than merely to pass as written. - 0.2.23
LenisProvider: skip the per-frame scroll write while Lenis is at rest.
lenis.raf()was ticked unconditionally from GSAP's ticker. It writes scroll state on every frame it is handed — at rest or not — and each write forces a style recalculation, so an open tab paid a recalc per frame for as long as it stayed open.Measured on wabbit.com: 144 recalcs/s and ~8% of a core on a page nobody was touching, indefinitely. The same page with Lenis absent (
/block-review, a native-scroll route) idles at 0 recalcs and ~1.6%.This is what triggers Chrome's "this tab is slowing your browser" intervention.
The ticker now returns early when
isScrollingis falsy. That cannot deadlock: every entry point sets the flag synchronously inside the input handler, before the next tick — wheel/touch viaonVirtualScroll->scrollTo('smooth'), scrollbar/keyboard viaonNativeScroll('native'), and programmaticscrollTo.The idle branch still advances
lenis.time, because Lenis derivesdeltaTime = time - (this.time || time); leaving the clock stale would hand the first resumed frame a delta of the entire idle span, completing the ease instantly and snapping the scroll instead of easing it.No API change. Scroll feel is unchanged — only the at-rest cost goes away.
- 0.2.22
Updated dependencies [510036f]
- @wabbit/tome-blocks-core@0.15.0
- 0.2.21
Updated dependencies
- @wabbit/tome-blocks-core@0.14.0
- 0.2.20
Updated dependencies [f4d55c9]
- @wabbit/tome-blocks-core@0.13.0
- 0.2.19
Updated dependencies [e11d5a2]
- @wabbit/tome-blocks-core@0.11.2
- 0.2.18
Updated dependencies [26dfa07]
- 0.2.18
Updated dependencies [6bc419c]
- 0.2.18
Updated dependencies [36e537a]
- 0.2.18
Updated dependencies [36e537a]
- 0.2.18
Updated dependencies [36e537a]
- 0.2.18
Updated dependencies [36e537a]
- 0.2.18
Updated dependencies [a93f478]
- 0.2.18
Updated dependencies [5f78397]
- 0.2.18
Updated dependencies [5f78397]
- 0.2.18
Updated dependencies [aef2725]
- @wabbit/tome-blocks-core@0.11.0
- @wabbit/tome-core@1.4.0
- 0.2.17
Updated dependencies [66f394b]
- @wabbit/tome-core@1.3.4
- @wabbit/tome-blocks-core@0.10.0
- 0.2.16
Updated dependencies
- @wabbit/tome-core@1.3.3
- @wabbit/tome-blocks-core@0.10.0
- 0.2.15
Updated dependencies
- @wabbit/tome-blocks-core@0.10.0
- 0.2.14
Docs-manifest emitter pipeline (W3 ship-readiness).
@wabbit/tome-blocks-corenow ships a standalone Node ESM CLI atscripts/emit-docs-manifests.mjsthat emits per-package documentation manifests (index.json, packages/<slug>.json, changelog.json) by reading what packages already carry — READMEs, the payload-free<pkg>/metablock-usage barrels, package.json exports maps, and CHANGELOG.md. It is the docs-pipeline sibling of the gallery source extractor and is consumed by host sites at prebuild:node node_modules/@wabbit/tome-blocks-core/scripts/emit-docs-manifests.mjs --output-dir <dir> --scope <scope.json>.To let the emitter import block metadata uniformly without dragging Payload config into a build script, the
./metapayload-free subpath (BlockMetaEntry[]) is extended to the remaining offered blocks packs — agency-essentials, catalog-pack, lms-pack, org-pack, and signal-theme — mirroring the existing editorial-pack / marketing-starter / content-writer / extras barrels. Each block'sBlockMetawas relocated verbatim into a payload-free sibling meta module and re-imported by its block config; no meta values changed.Every supported-core package additionally adds
CHANGELOG.mdto its publishedfilesarray so the next publish cascade ships changelogs the emitter can read from installed tarballs at prebuild. - 0.2.14
Updated dependencies [bed3f90]
- 0.2.14
Updated dependencies [850d51c]
- @wabbit/tome-blocks-core@0.9.4
- @wabbit/tome-core@1.2.1
- 0.2.13
Updated dependencies
- @wabbit/tome-blocks-core@0.9.2
- 0.2.12
Updated dependencies [c7d0afc]
- @wabbit/tome-blocks-core@0.9.0
- 0.2.11
Updated dependencies [249b670]
- @wabbit/tome-blocks-core@0.8.0
- 0.2.10
Updated dependencies [66c611c]
- @wabbit/tome-blocks-core@0.7.0
- 0.2.9
Updated dependencies [a9801fe]
- 0.2.9
Updated dependencies [baf401e]
- 0.2.9
Updated dependencies [4b2f368]
- @wabbit/tome-core@1.1.0
- @wabbit/tome-blocks-core@0.6.2
- 0.2.8
Updated dependencies [8947ff1]
- @wabbit/tome-core@1.0.12
- @wabbit/tome-blocks-core@0.5.9
- 0.2.7
Updated dependencies [36dc023]
- 0.2.7
Updated dependencies [2612799]
- @wabbit/tome-core@1.0.11
- @wabbit/tome-blocks-core@0.5.7
- 0.2.4
*Re-publish: rewrite `workspace:` to actual semver in dependencies.**
Earlier 0.4.0/0.4.1 publishes used
npm publishdirectly, which doesn't rewriteworkspace:*deps. Verdaccio captured the literal"workspace:*"strings in the publishedpackage.jsondependenciesfields, so npm consumers (e.g. wabbit-site-core) failed to install withEUNSUPPORTEDPROTOCOL workspace:*.This changeset triggers a coordinated patch bump across the linked blocks-_ group (already 0.4.1 → 0.4.2) plus motion, lms-pack, catalog-pack, and the previously-untouched blocks-core. Re-publish flow uses
pnpm publishwhich rewritesworkspace:_to the actual version of the workspace dep at publish time.No source changes — purely a publish-pipeline correction.
- 0.2.4
Updated dependencies
- @wabbit/tome-blocks-core@0.4.2
- 0.2.3
Updated dependencies [b76f684]
- @wabbit/tome-blocks-core@0.4.0