From 180239ef4ce0e9b4c50152a7fb6f5ee46a102266 Mon Sep 17 00:00:00 2001 From: Ajay Ghanwat Date: Sun, 19 Jul 2026 17:25:37 +0530 Subject: [PATCH] release: WRNexusJS 0.2.56 --- .publish/ai/package.json | 2 +- .publish/authz/package.json | 2 +- .publish/cli/package.json | 22 +++--- .publish/compiler/package.json | 2 +- .publish/core/package.json | 2 +- .publish/csr/package.json | 4 +- .publish/db/package.json | 2 +- .publish/dev-server/package.json | 26 +++---- .publish/encryption/package.json | 2 +- .publish/helpers/package.json | 4 +- .publish/i18n/package.json | 4 +- .publish/jwt/package.json | 2 +- .publish/mobile/package.json | 4 +- .publish/native/package.json | 2 +- .publish/oauth/package.json | 2 +- .publish/pubsub/package.json | 2 +- .publish/queue/package.json | 2 +- .publish/reactive/package.json | 2 +- .publish/router/package.json | 6 +- .publish/ssr/package.json | 4 +- .publish/styles/package.json | 4 +- .publish/test/package.json | 2 +- .publish/tracking/package.json | 2 +- .publish/ui/README.md | 17 +++++ .publish/ui/package.json | 4 +- .publish/ui/ui.css | 121 +++++++++++++++++++++++++++++++ .publish/uploader/package.json | 4 +- .publish/validation/package.json | 2 +- packages/ai/package.json | 2 +- packages/authz/package.json | 2 +- packages/cli/package.json | 2 +- packages/cli/src/update.ts | 9 +++ packages/compiler/package.json | 2 +- packages/core/package.json | 2 +- packages/csr/package.json | 2 +- packages/db/package.json | 2 +- packages/dev-server/package.json | 2 +- packages/encryption/package.json | 2 +- packages/helpers/package.json | 2 +- packages/i18n/package.json | 2 +- packages/jwt/package.json | 2 +- packages/mobile/package.json | 2 +- packages/native/package.json | 2 +- packages/oauth/package.json | 2 +- packages/pubsub/package.json | 2 +- packages/queue/package.json | 2 +- packages/reactive/package.json | 2 +- packages/router/package.json | 2 +- packages/ssr/package.json | 2 +- packages/styles/package.json | 2 +- packages/test/package.json | 2 +- packages/tracking/package.json | 2 +- packages/ui/README.md | 17 +++++ packages/ui/package.json | 2 +- packages/ui/test/ui.test.ts | 5 ++ packages/ui/ui.css | 121 +++++++++++++++++++++++++++++++ packages/uploader/package.json | 2 +- packages/validation/package.json | 2 +- update-package-versions.mjs | 2 +- 59 files changed, 375 insertions(+), 85 deletions(-) diff --git a/.publish/ai/package.json b/.publish/ai/package.json index 21401c98..e2217836 100644 --- a/.publish/ai/package.json +++ b/.publish/ai/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/ai", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "description": "Zero-dependency Claude (Anthropic) client for WrNexus apps.", "license": "MIT", diff --git a/.publish/authz/package.json b/.publish/authz/package.json index 5b954ef4..ef6f4481 100644 --- a/.publish/authz/package.json +++ b/.publish/authz/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/authz", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "description": "@wrnexus/authz — part of the WrNexus framework.", "license": "MIT", diff --git a/.publish/cli/package.json b/.publish/cli/package.json index c11bc18e..45721daf 100644 --- a/.publish/cli/package.json +++ b/.publish/cli/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/cli", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "description": "@wrnexus/cli — part of the WrNexus framework.", "license": "MIT", @@ -28,16 +28,16 @@ "wrnexus": "./dist/index.js" }, "dependencies": { - "@wrnexus/core": "^0.2.55", - "@wrnexus/router": "^0.2.55", - "@wrnexus/csr": "^0.2.55", - "@wrnexus/compiler": "^0.2.55", - "@wrnexus/styles": "^0.2.55", - "@wrnexus/dev-server": "^0.2.55", - "@wrnexus/ui": "^0.2.55", - "@wrnexus/validation": "^0.2.55", - "@wrnexus/i18n": "^0.2.55", - "@wrnexus/db": "^0.2.55" + "@wrnexus/core": "^0.2.56", + "@wrnexus/router": "^0.2.56", + "@wrnexus/csr": "^0.2.56", + "@wrnexus/compiler": "^0.2.56", + "@wrnexus/styles": "^0.2.56", + "@wrnexus/dev-server": "^0.2.56", + "@wrnexus/ui": "^0.2.56", + "@wrnexus/validation": "^0.2.56", + "@wrnexus/i18n": "^0.2.56", + "@wrnexus/db": "^0.2.56" }, "files": [ "dist" diff --git a/.publish/compiler/package.json b/.publish/compiler/package.json index f48d8cf7..4ce7d59f 100644 --- a/.publish/compiler/package.json +++ b/.publish/compiler/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/compiler", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "description": "@wrnexus/compiler — part of the WrNexus framework.", "license": "MIT", diff --git a/.publish/core/package.json b/.publish/core/package.json index 83bc0338..b226d43f 100644 --- a/.publish/core/package.json +++ b/.publish/core/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/core", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "description": "@wrnexus/core — part of the WrNexus framework.", "license": "MIT", diff --git a/.publish/csr/package.json b/.publish/csr/package.json index b7b0f9ad..5f35f36f 100644 --- a/.publish/csr/package.json +++ b/.publish/csr/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/csr", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "description": "@wrnexus/csr — part of the WrNexus framework.", "license": "MIT", @@ -21,7 +21,7 @@ } }, "dependencies": { - "@wrnexus/core": "^0.2.55" + "@wrnexus/core": "^0.2.56" }, "files": [ "dist" diff --git a/.publish/db/package.json b/.publish/db/package.json index b15faa9a..a2aa505d 100644 --- a/.publish/db/package.json +++ b/.publish/db/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/db", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "description": "@wrnexus/db — part of the WrNexus framework.", "license": "MIT", diff --git a/.publish/dev-server/package.json b/.publish/dev-server/package.json index ed096e35..d472f10c 100644 --- a/.publish/dev-server/package.json +++ b/.publish/dev-server/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/dev-server", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "description": "@wrnexus/dev-server — part of the WrNexus framework.", "license": "MIT", @@ -25,18 +25,18 @@ } }, "dependencies": { - "@wrnexus/core": "^0.2.55", - "@wrnexus/router": "^0.2.55", - "@wrnexus/ssr": "^0.2.55", - "@wrnexus/csr": "^0.2.55", - "@wrnexus/compiler": "^0.2.55", - "@wrnexus/styles": "^0.2.55", - "@wrnexus/ui": "^0.2.55", - "@wrnexus/validation": "^0.2.55", - "@wrnexus/i18n": "^0.2.55", - "@wrnexus/db": "^0.2.55", - "@wrnexus/pubsub": "^0.2.55", - "@wrnexus/uploader": "^0.2.55" + "@wrnexus/core": "^0.2.56", + "@wrnexus/router": "^0.2.56", + "@wrnexus/ssr": "^0.2.56", + "@wrnexus/csr": "^0.2.56", + "@wrnexus/compiler": "^0.2.56", + "@wrnexus/styles": "^0.2.56", + "@wrnexus/ui": "^0.2.56", + "@wrnexus/validation": "^0.2.56", + "@wrnexus/i18n": "^0.2.56", + "@wrnexus/db": "^0.2.56", + "@wrnexus/pubsub": "^0.2.56", + "@wrnexus/uploader": "^0.2.56" }, "files": [ "dist" diff --git a/.publish/encryption/package.json b/.publish/encryption/package.json index ab1a5fb7..d0737c67 100644 --- a/.publish/encryption/package.json +++ b/.publish/encryption/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/encryption", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "description": "@wrnexus/encryption — part of the WrNexus framework.", "license": "MIT", diff --git a/.publish/helpers/package.json b/.publish/helpers/package.json index b322d722..8422aceb 100644 --- a/.publish/helpers/package.json +++ b/.publish/helpers/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/helpers", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "description": "Safe convenience helpers for WrNexus request contexts and common application flows.", "license": "MIT", @@ -21,7 +21,7 @@ } }, "dependencies": { - "@wrnexus/core": "^0.2.55" + "@wrnexus/core": "^0.2.56" }, "files": [ "dist" diff --git a/.publish/i18n/package.json b/.publish/i18n/package.json index 20c28cfb..efe2591b 100644 --- a/.publish/i18n/package.json +++ b/.publish/i18n/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/i18n", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "description": "@wrnexus/i18n — part of the WrNexus framework.", "license": "MIT", @@ -21,7 +21,7 @@ } }, "dependencies": { - "@wrnexus/core": "^0.2.55" + "@wrnexus/core": "^0.2.56" }, "files": [ "dist" diff --git a/.publish/jwt/package.json b/.publish/jwt/package.json index db9fa8f2..b36cc6eb 100644 --- a/.publish/jwt/package.json +++ b/.publish/jwt/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/jwt", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "description": "@wrnexus/jwt — part of the WrNexus framework.", "license": "MIT", diff --git a/.publish/mobile/package.json b/.publish/mobile/package.json index 039fd66d..085967b3 100644 --- a/.publish/mobile/package.json +++ b/.publish/mobile/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/mobile", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "description": "@wrnexus/mobile — part of the WrNexus framework.", "license": "MIT", @@ -21,7 +21,7 @@ } }, "dependencies": { - "@wrnexus/native": "^0.2.55" + "@wrnexus/native": "^0.2.56" }, "files": [ "dist" diff --git a/.publish/native/package.json b/.publish/native/package.json index bfe5dd71..47968159 100644 --- a/.publish/native/package.json +++ b/.publish/native/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/native", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "description": "@wrnexus/native — part of the WrNexus framework.", "license": "MIT", diff --git a/.publish/oauth/package.json b/.publish/oauth/package.json index 74850c7a..2ce0bf95 100644 --- a/.publish/oauth/package.json +++ b/.publish/oauth/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/oauth", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "description": "@wrnexus/oauth — part of the WrNexus framework.", "license": "MIT", diff --git a/.publish/pubsub/package.json b/.publish/pubsub/package.json index 11b86773..786b5f21 100644 --- a/.publish/pubsub/package.json +++ b/.publish/pubsub/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/pubsub", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "description": "@wrnexus/pubsub — part of the WrNexus framework.", "license": "MIT", diff --git a/.publish/queue/package.json b/.publish/queue/package.json index b707a86e..5df3ca16 100644 --- a/.publish/queue/package.json +++ b/.publish/queue/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/queue", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "description": "@wrnexus/queue — part of the WrNexus framework.", "license": "MIT", diff --git a/.publish/reactive/package.json b/.publish/reactive/package.json index 47df3030..916e7e53 100644 --- a/.publish/reactive/package.json +++ b/.publish/reactive/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/reactive", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "description": "@wrnexus/reactive — part of the WrNexus framework.", "license": "MIT", diff --git a/.publish/router/package.json b/.publish/router/package.json index a8cc673c..a0c1fd32 100644 --- a/.publish/router/package.json +++ b/.publish/router/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/router", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "description": "@wrnexus/router — part of the WrNexus framework.", "license": "MIT", @@ -21,8 +21,8 @@ } }, "dependencies": { - "@wrnexus/compiler": "^0.2.55", - "@wrnexus/core": "^0.2.55" + "@wrnexus/compiler": "^0.2.56", + "@wrnexus/core": "^0.2.56" }, "files": [ "dist" diff --git a/.publish/ssr/package.json b/.publish/ssr/package.json index 68beb615..712cb9b4 100644 --- a/.publish/ssr/package.json +++ b/.publish/ssr/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/ssr", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "description": "@wrnexus/ssr — part of the WrNexus framework.", "license": "MIT", @@ -21,7 +21,7 @@ } }, "dependencies": { - "@wrnexus/core": "^0.2.55" + "@wrnexus/core": "^0.2.56" }, "files": [ "dist" diff --git a/.publish/styles/package.json b/.publish/styles/package.json index d8d7449d..e8d7311b 100644 --- a/.publish/styles/package.json +++ b/.publish/styles/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/styles", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "description": "@wrnexus/styles — part of the WrNexus framework.", "license": "MIT", @@ -21,7 +21,7 @@ } }, "dependencies": { - "@wrnexus/uploader": "^0.2.55" + "@wrnexus/uploader": "^0.2.56" }, "files": [ "dist" diff --git a/.publish/test/package.json b/.publish/test/package.json index 488751ec..540613d2 100644 --- a/.publish/test/package.json +++ b/.publish/test/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/test", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "description": "@wrnexus/test — part of the WrNexus framework.", "license": "MIT", diff --git a/.publish/tracking/package.json b/.publish/tracking/package.json index c07feba1..f17eeb1e 100644 --- a/.publish/tracking/package.json +++ b/.publish/tracking/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/tracking", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "description": "@wrnexus/tracking — part of the WrNexus framework.", "license": "MIT", diff --git a/.publish/ui/README.md b/.publish/ui/README.md index 65caf61b..89103b30 100644 --- a/.publish/ui/README.md +++ b/.publish/ui/README.md @@ -108,6 +108,23 @@ are `.wrn` files rendered server-side. The framework serves this stylesheet once at `/__wrnexus/ui.css`, so pages get all component styles from a single request. +### Tailwind and motion + +Components use static Tailwind utility classes alongside the shared `.wire-*` +layer. If the package is consumed by a separate Tailwind build, include its +component sources so every utility is generated: + +```css +@import "tailwindcss"; +@source "../node_modules/@wrnexus/ui/components/*.wrn"; +``` + +The shared stylesheet gives all component boundaries consistent, GPU-friendly +entry and interaction motion. Override `--wire-motion-fast`, +`--wire-motion-base`, `--wire-motion-slow`, `--wire-ease-standard`, or +`--wire-ease-emphasized` to tune it. Hover lift is limited to precise pointing +devices and `prefers-reduced-motion` is honored automatically. + ## Usage ### Auto-discovery diff --git a/.publish/ui/package.json b/.publish/ui/package.json index 1950c908..601a4636 100644 --- a/.publish/ui/package.json +++ b/.publish/ui/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/ui", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "description": "@wrnexus/ui — part of the WrNexus framework.", "license": "MIT", @@ -23,7 +23,7 @@ "./ui.css": "./ui.css" }, "dependencies": { - "@wrnexus/core": "^0.2.55" + "@wrnexus/core": "^0.2.56" }, "files": [ "dist", diff --git a/.publish/ui/ui.css b/.publish/ui/ui.css index 665bdd49..f20fe432 100644 --- a/.publish/ui/ui.css +++ b/.publish/ui/ui.css @@ -937,6 +937,127 @@ position: static; } } + +/* --- Motion system ------------------------------------------------------- + * Applies to both Tailwind-authored and token-authored components. Motion is + * intentionally limited to composited properties so interaction stays fluid. + */ +:root { + --wire-motion-fast: 120ms; + --wire-motion-base: 200ms; + --wire-motion-slow: 320ms; + --wire-ease-standard: cubic-bezier(0.2, 0, 0, 1); + --wire-ease-emphasized: cubic-bezier(0.16, 1, 0.3, 1); +} + +[data-component] { + animation: wire-component-enter var(--wire-motion-slow) var(--wire-ease-emphasized) both; +} + +[data-component] + :where(button, a, input, select, textarea, summary, [role="button"], [role="tab"]) { + transition-property: color, background-color, border-color, opacity, box-shadow, transform; + transition-duration: var(--wire-motion-base); + transition-timing-function: var(--wire-ease-standard); +} + +[data-component] :where(input, select, textarea, .wire-input, .wire-select) { + transition-duration: var(--wire-motion-fast); +} + +[data-component] :where(.wire-card, .wire-panel, .wire-surface, .wire-catalog-card, article) { + transition-property: border-color, background-color, box-shadow, transform; + transition-duration: var(--wire-motion-base); + transition-timing-function: var(--wire-ease-emphasized); +} + +[data-component] :where(.wire-overlay, [role="dialog"]) { + animation: wire-overlay-enter var(--wire-motion-base) var(--wire-ease-standard) both; +} + +[data-component] :where(.wire-dialog, [role="dialog"] > :first-child) { + animation: wire-dialog-enter var(--wire-motion-slow) var(--wire-ease-emphasized) both; +} + +[data-component] :where([role="menu"], [role="listbox"], [role="tooltip"], .wire-mega-menu__panel) { + transform-origin: top center; + animation: wire-popover-enter var(--wire-motion-base) var(--wire-ease-emphasized) both; +} + +[data-component] :where([role="progressbar"], progress) { + transition: inline-size var(--wire-motion-slow) var(--wire-ease-emphasized); +} + +@media (hover: hover) and (pointer: fine) { + [data-component] :where(button, .wire-btn, [role="button"]):not(:disabled):hover { + transform: translateY(-1px); + } + + [data-component] :where(.wire-card, .wire-catalog-card, article):has(a):hover { + transform: translateY(-2px); + box-shadow: 0 0.75rem 2rem rgb(15 23 42 / 0.12); + } +} + +[data-component] :where(button, .wire-btn, [role="button"]):not(:disabled):active { + transform: translateY(0) scale(0.98); + transition-duration: var(--wire-motion-fast); +} + +@keyframes wire-component-enter { + from { + opacity: 0; + transform: translateY(4px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes wire-overlay-enter { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@keyframes wire-dialog-enter { + from { + opacity: 0; + transform: translateY(12px) scale(0.98); + } + to { + opacity: 1; + transform: translateY(0) scale(1); + } +} + +@keyframes wire-popover-enter { + from { + opacity: 0; + transform: translateY(-4px) scale(0.98); + } + to { + opacity: 1; + transform: translateY(0) scale(1); + } +} + +@media (prefers-reduced-motion: reduce) { + [data-component], + [data-component] *, + [data-component] *::before, + [data-component] *::after { + scroll-behavior: auto !important; + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + transition-delay: 0ms !important; + } +} @media (max-width: 480px) { .wire-form-row { grid-template-columns: 1fr; diff --git a/.publish/uploader/package.json b/.publish/uploader/package.json index 9b81c04b..2f47da0f 100644 --- a/.publish/uploader/package.json +++ b/.publish/uploader/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/uploader", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "description": "@wrnexus/uploader — part of the WrNexus framework.", "license": "MIT", @@ -21,7 +21,7 @@ } }, "dependencies": { - "@wrnexus/core": "^0.2.55" + "@wrnexus/core": "^0.2.56" }, "files": [ "dist" diff --git a/.publish/validation/package.json b/.publish/validation/package.json index 0bedf989..dded1139 100644 --- a/.publish/validation/package.json +++ b/.publish/validation/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/validation", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "description": "@wrnexus/validation — part of the WrNexus framework.", "license": "MIT", diff --git a/packages/ai/package.json b/packages/ai/package.json index 49d770ef..7786b897 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/ai", - "version": "0.2.55", + "version": "0.2.56", "private": true, "type": "module", "description": "Zero-dependency Claude (Anthropic) client for WrNexus apps.", diff --git a/packages/authz/package.json b/packages/authz/package.json index 8017def0..a517e3c9 100644 --- a/packages/authz/package.json +++ b/packages/authz/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/authz", - "version": "0.2.55", + "version": "0.2.56", "private": true, "type": "module", "main": "src/index.ts", diff --git a/packages/cli/package.json b/packages/cli/package.json index 1789d224..26ebaa3a 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/cli", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "main": "src/index.ts", "exports": { diff --git a/packages/cli/src/update.ts b/packages/cli/src/update.ts index 4ecd04f6..d476866f 100644 --- a/packages/cli/src/update.ts +++ b/packages/cli/src/update.ts @@ -566,6 +566,15 @@ const MIGRATIONS: Migration[] = [ // No generated application files require automatic migration. }, }, + { + version: "0.2.56", + id: "ui-motion-system", + description: + "Adds consistent, accessible motion and modern interactions across the shared UI catalog.", + apply() { + // No generated application files require automatic migration. + }, + }, ]; /** Release tooling uses this to require an explicit migration entry per version. */ diff --git a/packages/compiler/package.json b/packages/compiler/package.json index 81db60ad..25e6bec2 100644 --- a/packages/compiler/package.json +++ b/packages/compiler/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/compiler", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "main": "src/index.ts", "exports": { diff --git a/packages/core/package.json b/packages/core/package.json index bdf5d639..cad11ee3 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/core", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "main": "src/index.ts", "exports": { diff --git a/packages/csr/package.json b/packages/csr/package.json index 0cd1d64c..434004d2 100644 --- a/packages/csr/package.json +++ b/packages/csr/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/csr", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "main": "src/index.ts", "exports": { diff --git a/packages/db/package.json b/packages/db/package.json index 44010db9..19c9432a 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/db", - "version": "0.2.55", + "version": "0.2.56", "private": true, "type": "module", "main": "src/index.ts", diff --git a/packages/dev-server/package.json b/packages/dev-server/package.json index 00789f85..dc876ca4 100644 --- a/packages/dev-server/package.json +++ b/packages/dev-server/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/dev-server", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "main": "src/index.ts", "exports": { diff --git a/packages/encryption/package.json b/packages/encryption/package.json index 69032449..c5439f64 100644 --- a/packages/encryption/package.json +++ b/packages/encryption/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/encryption", - "version": "0.2.55", + "version": "0.2.56", "private": true, "type": "module", "main": "src/index.ts", diff --git a/packages/helpers/package.json b/packages/helpers/package.json index 07c11971..fae90919 100644 --- a/packages/helpers/package.json +++ b/packages/helpers/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/helpers", - "version": "0.2.55", + "version": "0.2.56", "private": true, "type": "module", "description": "Safe convenience helpers for WrNexus request contexts and common application flows.", diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 52ef093a..452643de 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/i18n", - "version": "0.2.55", + "version": "0.2.56", "private": true, "type": "module", "main": "src/index.ts", diff --git a/packages/jwt/package.json b/packages/jwt/package.json index 8680fdaf..18a721e4 100644 --- a/packages/jwt/package.json +++ b/packages/jwt/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/jwt", - "version": "0.2.55", + "version": "0.2.56", "private": true, "type": "module", "main": "src/index.ts", diff --git a/packages/mobile/package.json b/packages/mobile/package.json index a5b591cb..ef9973f2 100644 --- a/packages/mobile/package.json +++ b/packages/mobile/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/mobile", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "main": "src/index.ts", "exports": { diff --git a/packages/native/package.json b/packages/native/package.json index b9f905fd..91506316 100644 --- a/packages/native/package.json +++ b/packages/native/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/native", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "main": "src/index.ts", "exports": { diff --git a/packages/oauth/package.json b/packages/oauth/package.json index 05a560d8..141d1dbf 100644 --- a/packages/oauth/package.json +++ b/packages/oauth/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/oauth", - "version": "0.2.55", + "version": "0.2.56", "private": true, "type": "module", "main": "src/index.ts", diff --git a/packages/pubsub/package.json b/packages/pubsub/package.json index 2553151a..247c7d49 100644 --- a/packages/pubsub/package.json +++ b/packages/pubsub/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/pubsub", - "version": "0.2.55", + "version": "0.2.56", "private": true, "type": "module", "main": "src/index.ts", diff --git a/packages/queue/package.json b/packages/queue/package.json index 8a32d23f..501cffac 100644 --- a/packages/queue/package.json +++ b/packages/queue/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/queue", - "version": "0.2.55", + "version": "0.2.56", "private": true, "type": "module", "main": "src/index.ts", diff --git a/packages/reactive/package.json b/packages/reactive/package.json index 35323a54..2b7cf430 100644 --- a/packages/reactive/package.json +++ b/packages/reactive/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/reactive", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "main": "src/index.ts", "exports": { diff --git a/packages/router/package.json b/packages/router/package.json index 17bc1271..c6416e8e 100644 --- a/packages/router/package.json +++ b/packages/router/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/router", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "main": "src/index.ts", "exports": { diff --git a/packages/ssr/package.json b/packages/ssr/package.json index 31d9eabd..16353205 100644 --- a/packages/ssr/package.json +++ b/packages/ssr/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/ssr", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "main": "src/index.ts", "exports": { diff --git a/packages/styles/package.json b/packages/styles/package.json index 68ec909f..2e879d8c 100644 --- a/packages/styles/package.json +++ b/packages/styles/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/styles", - "version": "0.2.55", + "version": "0.2.56", "type": "module", "main": "src/index.ts", "exports": { diff --git a/packages/test/package.json b/packages/test/package.json index 775e7348..0bb61d4a 100644 --- a/packages/test/package.json +++ b/packages/test/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/test", - "version": "0.2.55", + "version": "0.2.56", "private": true, "type": "module", "main": "src/index.ts", diff --git a/packages/tracking/package.json b/packages/tracking/package.json index 71cab809..b190d3e2 100644 --- a/packages/tracking/package.json +++ b/packages/tracking/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/tracking", - "version": "0.2.55", + "version": "0.2.56", "private": true, "type": "module", "main": "src/index.ts", diff --git a/packages/ui/README.md b/packages/ui/README.md index 65caf61b..89103b30 100644 --- a/packages/ui/README.md +++ b/packages/ui/README.md @@ -108,6 +108,23 @@ are `.wrn` files rendered server-side. The framework serves this stylesheet once at `/__wrnexus/ui.css`, so pages get all component styles from a single request. +### Tailwind and motion + +Components use static Tailwind utility classes alongside the shared `.wire-*` +layer. If the package is consumed by a separate Tailwind build, include its +component sources so every utility is generated: + +```css +@import "tailwindcss"; +@source "../node_modules/@wrnexus/ui/components/*.wrn"; +``` + +The shared stylesheet gives all component boundaries consistent, GPU-friendly +entry and interaction motion. Override `--wire-motion-fast`, +`--wire-motion-base`, `--wire-motion-slow`, `--wire-ease-standard`, or +`--wire-ease-emphasized` to tune it. Hover lift is limited to precise pointing +devices and `prefers-reduced-motion` is honored automatically. + ## Usage ### Auto-discovery diff --git a/packages/ui/package.json b/packages/ui/package.json index c4d33b65..efcdcd11 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/ui", - "version": "0.2.55", + "version": "0.2.56", "private": true, "type": "module", "main": "src/index.ts", diff --git a/packages/ui/test/ui.test.ts b/packages/ui/test/ui.test.ts index 729c7d21..db877fb9 100644 --- a/packages/ui/test/ui.test.ts +++ b/packages/ui/test/ui.test.ts @@ -57,6 +57,11 @@ test("component-system CSS includes responsive, theme-token, focus, and reduced- expect(css).toContain(":focus-visible"); expect(css).toContain("var(--wire-color-surface)"); expect(css).toContain("min-height: 44px"); + expect(css).toContain("--wire-motion-base"); + expect(css).toContain("--wire-ease-emphasized"); + expect(css).toContain("@keyframes wire-component-enter"); + expect(css).toContain("@keyframes wire-dialog-enter"); + expect(css).toContain("@media (hover: hover) and (pointer: fine)"); }); test.each(uiComponentNames())("bundled UI component %s compiles", (name) => { diff --git a/packages/ui/ui.css b/packages/ui/ui.css index 665bdd49..f20fe432 100644 --- a/packages/ui/ui.css +++ b/packages/ui/ui.css @@ -937,6 +937,127 @@ position: static; } } + +/* --- Motion system ------------------------------------------------------- + * Applies to both Tailwind-authored and token-authored components. Motion is + * intentionally limited to composited properties so interaction stays fluid. + */ +:root { + --wire-motion-fast: 120ms; + --wire-motion-base: 200ms; + --wire-motion-slow: 320ms; + --wire-ease-standard: cubic-bezier(0.2, 0, 0, 1); + --wire-ease-emphasized: cubic-bezier(0.16, 1, 0.3, 1); +} + +[data-component] { + animation: wire-component-enter var(--wire-motion-slow) var(--wire-ease-emphasized) both; +} + +[data-component] + :where(button, a, input, select, textarea, summary, [role="button"], [role="tab"]) { + transition-property: color, background-color, border-color, opacity, box-shadow, transform; + transition-duration: var(--wire-motion-base); + transition-timing-function: var(--wire-ease-standard); +} + +[data-component] :where(input, select, textarea, .wire-input, .wire-select) { + transition-duration: var(--wire-motion-fast); +} + +[data-component] :where(.wire-card, .wire-panel, .wire-surface, .wire-catalog-card, article) { + transition-property: border-color, background-color, box-shadow, transform; + transition-duration: var(--wire-motion-base); + transition-timing-function: var(--wire-ease-emphasized); +} + +[data-component] :where(.wire-overlay, [role="dialog"]) { + animation: wire-overlay-enter var(--wire-motion-base) var(--wire-ease-standard) both; +} + +[data-component] :where(.wire-dialog, [role="dialog"] > :first-child) { + animation: wire-dialog-enter var(--wire-motion-slow) var(--wire-ease-emphasized) both; +} + +[data-component] :where([role="menu"], [role="listbox"], [role="tooltip"], .wire-mega-menu__panel) { + transform-origin: top center; + animation: wire-popover-enter var(--wire-motion-base) var(--wire-ease-emphasized) both; +} + +[data-component] :where([role="progressbar"], progress) { + transition: inline-size var(--wire-motion-slow) var(--wire-ease-emphasized); +} + +@media (hover: hover) and (pointer: fine) { + [data-component] :where(button, .wire-btn, [role="button"]):not(:disabled):hover { + transform: translateY(-1px); + } + + [data-component] :where(.wire-card, .wire-catalog-card, article):has(a):hover { + transform: translateY(-2px); + box-shadow: 0 0.75rem 2rem rgb(15 23 42 / 0.12); + } +} + +[data-component] :where(button, .wire-btn, [role="button"]):not(:disabled):active { + transform: translateY(0) scale(0.98); + transition-duration: var(--wire-motion-fast); +} + +@keyframes wire-component-enter { + from { + opacity: 0; + transform: translateY(4px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes wire-overlay-enter { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@keyframes wire-dialog-enter { + from { + opacity: 0; + transform: translateY(12px) scale(0.98); + } + to { + opacity: 1; + transform: translateY(0) scale(1); + } +} + +@keyframes wire-popover-enter { + from { + opacity: 0; + transform: translateY(-4px) scale(0.98); + } + to { + opacity: 1; + transform: translateY(0) scale(1); + } +} + +@media (prefers-reduced-motion: reduce) { + [data-component], + [data-component] *, + [data-component] *::before, + [data-component] *::after { + scroll-behavior: auto !important; + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + transition-delay: 0ms !important; + } +} @media (max-width: 480px) { .wire-form-row { grid-template-columns: 1fr; diff --git a/packages/uploader/package.json b/packages/uploader/package.json index ce02491b..6acd24e3 100644 --- a/packages/uploader/package.json +++ b/packages/uploader/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/uploader", - "version": "0.2.55", + "version": "0.2.56", "private": true, "type": "module", "main": "src/index.ts", diff --git a/packages/validation/package.json b/packages/validation/package.json index 09c6d680..3e646f1d 100644 --- a/packages/validation/package.json +++ b/packages/validation/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/validation", - "version": "0.2.55", + "version": "0.2.56", "private": true, "type": "module", "main": "src/index.ts", diff --git a/update-package-versions.mjs b/update-package-versions.mjs index bb50ba72..bbdc730a 100644 --- a/update-package-versions.mjs +++ b/update-package-versions.mjs @@ -1,7 +1,7 @@ import { existsSync, readdirSync, readFileSync, writeFileSync } from "node:fs"; import { join } from "node:path"; -const version = "0.2.55"; +const version = "0.2.56"; const dependencyGroups = [ "dependencies",