diff --git a/app/pages/404.wrn b/app/pages/404.wrn index f8b17829..42e73f1b 100644 --- a/app/pages/404.wrn +++ b/app/pages/404.wrn @@ -7,10 +7,10 @@ page Pagenotfound { view {
-
W WRNexusJS
+
W WRNexusJS
- +
} diff --git a/app/pages/access.wrn b/app/pages/access.wrn index 7bdf8e8e..74e7f540 100644 --- a/app/pages/access.wrn +++ b/app/pages/access.wrn @@ -7,10 +7,10 @@ page Access { view {
-
W WRNexusJS
+
W WRNexusJS
-

Request preview access

WRNexusJS 0.5.13 packages are not available from the public npm registry. Installation requires approval and private registry credentials supplied by WorkRoot. Never paste registry tokens into source control, issue reports, or support messages.

Request process

  1. Contact WorkRoot through the public contact path at workroot.in.
  2. Describe the application, team, expected deployment, and Bun environment.
  3. After approval, follow the registry instructions supplied privately.
  4. Use the canonical scaffold command below only after authentication.
bunx @wrnexus/cli@0.5.13 create my-app

Access approval, response time, licensing terms, and support level remain owner-controlled. This site does not collect access requests directly.

- +

Request preview access

WRNexusJS 0.6.0 packages are not available from the public npm registry. Installation requires approval and private registry credentials supplied by WorkRoot. Never paste registry tokens into source control, issue reports, or support messages.

Request process

  1. Contact WorkRoot through the public contact path at workroot.in.
  2. Describe the application, team, expected deployment, and Bun environment.
  3. After approval, follow the registry instructions supplied privately.
  4. Use the canonical scaffold command below only after authentication.
bunx @wrnexus/cli@0.6.0 create my-app

Access approval, response time, licensing terms, and support level remain owner-controlled. This site does not collect access requests directly.

+
} diff --git a/app/pages/architecture.wrn b/app/pages/architecture.wrn index 5a6ed086..0cd1201b 100644 --- a/app/pages/architecture.wrn +++ b/app/pages/architecture.wrn @@ -7,10 +7,10 @@ page Architecture { view {
-
W WRNexusJS
+
W WRNexusJS
-
Framework architecture · 0.5.13

Architecture

WRNexusJS is Bun-native and SSR-first. File discovery maps pages and API handlers; middleware enriches or short-circuits a request; the compiler turns .wrn declarations into server render functions and small feature runtimes.

Request and build lifecycle

  1. DiscoverPages, APIs, middleware, components, layouts, schemas, rooms
  2. CompileParse .wrn, validate grammar, generate server code
  3. RequestLimits, security, locale, session, middleware
  4. MatchStatic and dynamic file route
  5. RenderSSR data, escaped interpolation, components, metadata
  6. EnhanceOnly required reactive/directive runtimes

Package boundaries

core owns contexts, middleware, sessions and rooms; router discovers routes; compiler parses .wrn; ssr renders documents; csr supplies browser runtimes; dev-server and cli orchestrate development and builds.

Security and data flow

Validation happens at trust boundaries. Session authentication establishes identity; authorization makes resource decisions. CSP, Trusted Types, CSRF, upload checks, WebSocket origins, request limits, and output escaping are layered controls—not substitutes for application policy.

Realtime and scale

Rooms are process-local unless connected through pub/sub. Redis-backed pub/sub distributes events. Queue durability depends on the selected driver and must be evaluated explicitly.

Workspaces and gateways

The gateway can dispatch multiple applications while preserving route, component, asset, config, and session boundaries. Validate host routing and isolation before production.

Build and deployment

wrnexus build . produces dist/server.js and hashed/static assets. Run the server with Bun, apply migrations before traffic, terminate TLS at a trusted edge, and forward only expected proxy headers.

Mobile

Mobile compatibility bridges SSR-safe Capacitor capabilities; native route generation is experimental and is not general web portability. Test each target platform.

Generated files and limits

app/routes.gen.ts, .wrnexus/, and dist/ are generated. The runtime is Bun-only. Preview packages are private. Historical compatibility and long-term support policy are not yet published.

- +
Framework architecture · 0.6.0

Architecture

WRNexusJS is Bun-native and SSR-first. File discovery maps pages and API handlers; middleware enriches or short-circuits a request; the compiler turns .wrn declarations into server render functions and small feature runtimes.

Request and build lifecycle

  1. DiscoverPages, APIs, middleware, components, layouts, schemas, rooms
  2. CompileParse .wrn, validate grammar, generate server code
  3. RequestLimits, security, locale, session, middleware
  4. MatchStatic and dynamic file route
  5. RenderSSR data, escaped interpolation, components, metadata
  6. EnhanceOnly required reactive/directive runtimes

Package boundaries

core owns contexts, middleware, sessions and rooms; router discovers routes; compiler parses .wrn; ssr renders documents; csr supplies browser runtimes; dev-server and cli orchestrate development and builds.

Security and data flow

Validation happens at trust boundaries. Session authentication establishes identity; authorization makes resource decisions. CSP, Trusted Types, CSRF, upload checks, WebSocket origins, request limits, and output escaping are layered controls—not substitutes for application policy.

Realtime and scale

Rooms are process-local unless connected through pub/sub. Redis-backed pub/sub distributes events. Queue durability depends on the selected driver and must be evaluated explicitly.

Workspaces and gateways

The gateway can dispatch multiple applications while preserving route, component, asset, config, and session boundaries. Validate host routing and isolation before production.

Build and deployment

wrnexus build . produces dist/server.js and hashed/static assets. Run the server with Bun, apply migrations before traffic, terminate TLS at a trusted edge, and forward only expected proxy headers.

Mobile

Mobile compatibility bridges SSR-safe Capacitor capabilities; native route generation is experimental and is not general web portability. Test each target platform.

Generated files and limits

app/routes.gen.ts, .wrnexus/, and dist/ are generated. The runtime is Bun-only. Preview packages are private. Historical compatibility and long-term support policy are not yet published.

+
} diff --git a/app/pages/benchmarks.wrn b/app/pages/benchmarks.wrn index 6692dfdc..98e10573 100644 --- a/app/pages/benchmarks.wrn +++ b/app/pages/benchmarks.wrn @@ -7,10 +7,10 @@ page Benchmarks { view {
-
W WRNexusJS
+
W WRNexusJS

Benchmarks

No publishable benchmark dataset yet

No comparative speed claims are published. A valid baseline must record scripts, commit, Bun/framework versions, hardware, OS, warmup, samples, workload, raw results, median, percentiles, memory, HTML size, browser JavaScript size, and run date.

The roadmap starts with WRNexusJS-only measurements before any maintained equivalent-workload comparison.

- +
} diff --git a/app/pages/changelog.wrn b/app/pages/changelog.wrn index b88fc87d..6ed767bd 100644 --- a/app/pages/changelog.wrn +++ b/app/pages/changelog.wrn @@ -7,10 +7,10 @@ page Changelog { view {
-
W WRNexusJS
+
W WRNexusJS
-

Changelog

0.5.13 2026-07-13

Documentation is aligned to all 31 installed packages. This release adds @wrnexus/helpers, original-request URL helpers, safe login redirects, working wrnexus workspace add, and forward-auth redirect propagation.

Migration notes

Run wrnexus update --latest and keep every @wrnexus/* package on 0.5.13. Existing applications must explicitly add @wrnexus/helpers before importing it; newly scaffolded applications include it automatically.

Versioning and support

The packages use semantic-looking versions, but a formal compatibility and old-release support policy has not been approved. Preview consumers should treat minor releases as potentially requiring migration review.

- +

Changelog

0.6.0 2026-07-13

Documentation is aligned to all 33 installed packages. This release adds @wrnexus/helpers, original-request URL helpers, safe login redirects, working wrnexus workspace add, and forward-auth redirect propagation.

Migration notes

Run wrnexus update --latest and keep every @wrnexus/* package on 0.6.0. Existing applications must explicitly add @wrnexus/helpers before importing it; newly scaffolded applications include it automatically.

Versioning and support

The packages use semantic-looking versions, but a formal compatibility and old-release support policy has not been approved. Preview consumers should treat minor releases as potentially requiring migration review.

+
} diff --git a/app/pages/examples.wrn b/app/pages/examples.wrn index 2848bb6f..969d7acf 100644 --- a/app/pages/examples.wrn +++ b/app/pages/examples.wrn @@ -7,10 +7,10 @@ page Examples { view {
-
W WRNexusJS
+
W WRNexusJS
-

Examples

Examples are tied to installed 0.5.13 package documentation. The focused snippets in guides are source-verified; standalone runnable projects and CI compilation are tracked as remaining work.

Minimal .wrn page

Documented

Database CRUD

Planned fixture

Authentication and protected route

Planned fixture

Permissions

Planned fixture

Forms and validation

Documented

Realtime dashboard

Planned fixture

File upload

Planned fixture

Background queue

Planned fixture

Redis pub/sub

Planned fixture

Workspace gateway

Planned fixture

Deployment

Planned fixture

Experimental mobile mode

Planned fixture
- +

Examples

Examples are tied to installed 0.6.0 package documentation. The focused snippets in guides are source-verified; standalone runnable projects and CI compilation are tracked as remaining work.

Minimal .wrn page

Documented

Database CRUD

Planned fixture

Authentication and protected route

Planned fixture

Permissions

Planned fixture

Forms and validation

Documented

Realtime dashboard

Planned fixture

File upload

Planned fixture

Background queue

Planned fixture

Redis pub/sub

Planned fixture

Workspace gateway

Planned fixture

Deployment

Planned fixture

Experimental mobile mode

Planned fixture
+
} diff --git a/app/pages/getting-started.wrn b/app/pages/getting-started.wrn index 8c12f075..37fd8a85 100644 --- a/app/pages/getting-started.wrn +++ b/app/pages/getting-started.wrn @@ -7,9 +7,9 @@ page Gettingstarted { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · v0.5.13

Build a contact inbox

This path creates a server-rendered page, validated API route, middleware, and realtime next step. It requires approved registry access and Bun 1.3.x; this site was verified with Bun 1.3.14.

1. Create the project

bunx @wrnexus/cli@0.5.13 create my-app
+      
Preview guide · v0.6.0

Build a contact inbox

This path creates a server-rendered page, validated API route, middleware, and realtime next step. It requires approved registry access and Bun 1.3.x; this site was verified with Bun 1.3.14.

1. Create the project

bunx @wrnexus/cli@0.6.0 create my-app
 cd my-app
 bun install
 bun run dev

2. Know the structure

app/pages/       # file-based .wrn routes
@@ -39,7 +39,7 @@ export const POST = async (ctx) => {
 }

7. Test and ship

bun run test
 bun run build
 bun dist/server.js

Next: deployment, database, authentication, and workspaces.

- +
} diff --git a/app/pages/guides/api-routes.wrn b/app/pages/guides/api-routes.wrn index e53aad7e..df8798ef 100644 --- a/app/pages/guides/api-routes.wrn +++ b/app/pages/guides/api-routes.wrn @@ -7,10 +7,10 @@ page APIroutes { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.5.13

API routes

Export GET, POST, PUT, PATCH, or DELETE from app/api files. Validate request bodies, enforce authentication and authorization, cap request sizes, and return Web Responses.

Release scope

This guide describes installed 0.5.13 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.6.0

API routes

Export GET, POST, PUT, PATCH, or DELETE from app/api files. Validate request bodies, enforce authentication and authorization, cap request sizes, and return Web Responses.

Release scope

This guide describes installed 0.6.0 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} diff --git a/app/pages/guides/authentication.wrn b/app/pages/guides/authentication.wrn index b0e07005..d675146d 100644 --- a/app/pages/guides/authentication.wrn +++ b/app/pages/guides/authentication.wrn @@ -7,10 +7,10 @@ page Authentication { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.5.13

Authentication

Configure session authentication, log users in through supported auth helpers, and read identity from context. Cookie flags, rotation, expiry, and secret storage remain deployment responsibilities.

Release scope

This guide describes installed 0.5.13 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.6.0

Authentication

Configure session authentication, log users in through supported auth helpers, and read identity from context. Cookie flags, rotation, expiry, and secret storage remain deployment responsibilities.

Release scope

This guide describes installed 0.6.0 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} diff --git a/app/pages/guides/authorization.wrn b/app/pages/guides/authorization.wrn index 83078df5..6c6177ef 100644 --- a/app/pages/guides/authorization.wrn +++ b/app/pages/guides/authorization.wrn @@ -7,10 +7,10 @@ page Authorization { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.5.13

Authorization

Authentication identifies; authorization decides. Enforce permissions in server routes and policies, including object ownership. UI hiding is never an authorization boundary.

Release scope

This guide describes installed 0.5.13 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.6.0

Authorization

Authentication identifies; authorization decides. Enforce permissions in server routes and policies, including object ownership. UI hiding is never an authorization boundary.

Release scope

This guide describes installed 0.6.0 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} diff --git a/app/pages/guides/configuration-and-profiles.wrn b/app/pages/guides/configuration-and-profiles.wrn index 0d250c57..522f7fac 100644 --- a/app/pages/guides/configuration-and-profiles.wrn +++ b/app/pages/guides/configuration-and-profiles.wrn @@ -7,10 +7,10 @@ page Configurationandprofiles { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.5.13

Configuration and profiles

wrnexus.config.ts owns styles, SEO, security, data, mobile, fonts, and profiles. Keep secrets in validated environment variables and review merged production configuration.

Release scope

This guide describes installed 0.5.13 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.6.0

Configuration and profiles

wrnexus.config.ts owns styles, SEO, security, data, mobile, fonts, and profiles. Keep secrets in validated environment variables and review merged production configuration.

Release scope

This guide describes installed 0.6.0 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} diff --git a/app/pages/guides/database.wrn b/app/pages/guides/database.wrn index 83bd87a7..eb9efbcf 100644 --- a/app/pages/guides/database.wrn +++ b/app/pages/guides/database.wrn @@ -7,10 +7,10 @@ page Database { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.5.13

Database

Configure SQLite or the installed supported driver, keep queries in named SQL blocks, generate typed functions, and apply migrations before traffic. Back up data and test rollback independently.

Release scope

This guide describes installed 0.5.13 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.6.0

Database

Configure SQLite or the installed supported driver, keep queries in named SQL blocks, generate typed functions, and apply migrations before traffic. Back up data and test rollback independently.

Release scope

This guide describes installed 0.6.0 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} diff --git a/app/pages/guides/deployment.wrn b/app/pages/guides/deployment.wrn index 3b5d2f1f..ad7f343f 100644 --- a/app/pages/guides/deployment.wrn +++ b/app/pages/guides/deployment.wrn @@ -7,10 +7,10 @@ page Deployment { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.5.13

Deployment

Run bun run build, apply migrations, and start dist/server.js with Bun. Configure TLS, proxy trust, environment validation, health checks, graceful restarts, logs, backups, and restrictive security headers.

Release scope

This guide describes installed 0.5.13 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.6.0

Deployment

Run bun run build, apply migrations, and start dist/server.js with Bun. Configure TLS, proxy trust, environment validation, health checks, graceful restarts, logs, backups, and restrictive security headers.

Release scope

This guide describes installed 0.6.0 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} diff --git a/app/pages/guides/forms-and-validation.wrn b/app/pages/guides/forms-and-validation.wrn index 4c786563..6cabf38b 100644 --- a/app/pages/guides/forms-and-validation.wrn +++ b/app/pages/guides/forms-and-validation.wrn @@ -7,10 +7,10 @@ page Formsandvalidation { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.5.13

Forms and validation

Define a v.object schema, use data-schema on the form, show field errors with data-error, and always call parseBody on the server. refine is server-only.

Release scope

This guide describes installed 0.5.13 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.6.0

Forms and validation

Define a v.object schema, use data-schema on the form, show field errors with data-error, and always call parseBody on the server. refine is server-only.

Release scope

This guide describes installed 0.6.0 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} diff --git a/app/pages/guides/i18n-and-themes.wrn b/app/pages/guides/i18n-and-themes.wrn index 5f1b0510..49b5a353 100644 --- a/app/pages/guides/i18n-and-themes.wrn +++ b/app/pages/guides/i18n-and-themes.wrn @@ -7,10 +7,10 @@ page Internationalizationandthemes { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.5.13

Internationalization and themes

Store locale JSON under app/locales and use translation directives. Themes resolve CSS tokens; ensure contrast, system preference behavior, persistence, and non-color cues.

Release scope

This guide describes installed 0.5.13 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.6.0

Internationalization and themes

Store locale JSON under app/locales and use translation directives. Themes resolve CSS tokens; ensure contrast, system preference behavior, persistence, and non-color cues.

Release scope

This guide describes installed 0.6.0 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} diff --git a/app/pages/guides/middleware.wrn b/app/pages/guides/middleware.wrn index 3a2852bb..e437fb8f 100644 --- a/app/pages/guides/middleware.wrn +++ b/app/pages/guides/middleware.wrn @@ -7,10 +7,10 @@ page Middleware { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.5.13

Middleware

Middleware receives context and next. Return next() to continue or return a Response to stop. Put request limits and trust-boundary controls before business logic.

Release scope

This guide describes installed 0.5.13 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.6.0

Middleware

Middleware receives context and next. Return next() to continue or return a Response to stop. Put request limits and trust-boundary controls before business logic.

Release scope

This guide describes installed 0.6.0 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} diff --git a/app/pages/guides/mobile.wrn b/app/pages/guides/mobile.wrn index e1bd1cef..81c1b9c7 100644 --- a/app/pages/guides/mobile.wrn +++ b/app/pages/guides/mobile.wrn @@ -7,10 +7,10 @@ page Mobile { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.5.13

Mobile

Mobile capabilities are experimental in this preview. Test Capacitor permissions and lifecycle on each platform; do not assume every .wrn or browser API converts to native.

Release scope

This guide describes installed 0.5.13 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.6.0

Mobile

Mobile capabilities are experimental in this preview. Test Capacitor permissions and lifecycle on each platform; do not assume every .wrn or browser API converts to native.

Release scope

This guide describes installed 0.6.0 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} diff --git a/app/pages/guides/observability.wrn b/app/pages/guides/observability.wrn index c3d98e58..1015659d 100644 --- a/app/pages/guides/observability.wrn +++ b/app/pages/guides/observability.wrn @@ -7,10 +7,10 @@ page Observability { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.5.13

Observability

Use tracking middleware and sinks with redaction, sampling, stable request identifiers, alert ownership, and retention limits. Never capture registry tokens or session secrets.

Release scope

This guide describes installed 0.5.13 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.6.0

Observability

Use tracking middleware and sinks with redaction, sampling, stable request identifiers, alert ownership, and retention limits. Never capture registry tokens or session secrets.

Release scope

This guide describes installed 0.6.0 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} diff --git a/app/pages/guides/pages-and-components.wrn b/app/pages/guides/pages-and-components.wrn index 8f29d575..fbc7b2b7 100644 --- a/app/pages/guides/pages-and-components.wrn +++ b/app/pages/guides/pages-and-components.wrn @@ -7,10 +7,10 @@ page Pagesandcomponents { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.5.13

Pages and components

Pages are routable, components are reusable, and layouts provide shared slots. Mount a component with data-component and keep browser state scoped and minimal.

Release scope

This guide describes installed 0.5.13 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.6.0

Pages and components

Pages are routable, components are reusable, and layouts provide shared slots. Mount a component with data-component and keep browser state scoped and minimal.

Release scope

This guide describes installed 0.6.0 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} diff --git a/app/pages/guides/project-structure.wrn b/app/pages/guides/project-structure.wrn index 62c90d7b..f33d329f 100644 --- a/app/pages/guides/project-structure.wrn +++ b/app/pages/guides/project-structure.wrn @@ -7,10 +7,10 @@ page Projectstructure { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.5.13

Project structure

Pages, components, layouts, APIs, middleware, schemas, database files, locales, realtime rooms, and styles live under app. Never edit app/routes.gen.ts, .wrnexus, or dist by hand.

Release scope

This guide describes installed 0.5.13 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.6.0

Project structure

Pages, components, layouts, APIs, middleware, schemas, database files, locales, realtime rooms, and styles live under app. Never edit app/routes.gen.ts, .wrnexus, or dist by hand.

Release scope

This guide describes installed 0.6.0 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} diff --git a/app/pages/guides/pubsub.wrn b/app/pages/guides/pubsub.wrn index 563fb8e9..b81fc1cb 100644 --- a/app/pages/guides/pubsub.wrn +++ b/app/pages/guides/pubsub.wrn @@ -7,10 +7,10 @@ page Pubsub { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.5.13

Pub/sub

The in-process driver cannot cross processes. Use Redis where instances must share events, define channel ownership, and design for reconnects and duplicate delivery.

Release scope

This guide describes installed 0.5.13 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.6.0

Pub/sub

The in-process driver cannot cross processes. Use Redis where instances must share events, define channel ownership, and design for reconnects and duplicate delivery.

Release scope

This guide describes installed 0.6.0 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} diff --git a/app/pages/guides/queues.wrn b/app/pages/guides/queues.wrn index 594656cf..40ed41cf 100644 --- a/app/pages/guides/queues.wrn +++ b/app/pages/guides/queues.wrn @@ -7,10 +7,10 @@ page Queues { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.5.13

Queues

Queue behavior is preview-level. Treat in-process work as non-durable, make handlers idempotent, cap retries, record failures, and choose a production persistence strategy.

Release scope

This guide describes installed 0.5.13 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.6.0

Queues

Queue behavior is preview-level. Treat in-process work as non-durable, make handlers idempotent, cap retries, record failures, and choose a production persistence strategy.

Release scope

This guide describes installed 0.6.0 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} diff --git a/app/pages/guides/realtime.wrn b/app/pages/guides/realtime.wrn index 597c3677..2a4efd55 100644 --- a/app/pages/guides/realtime.wrn +++ b/app/pages/guides/realtime.wrn @@ -7,10 +7,10 @@ page Realtime { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.5.13

Realtime

defineRoom handles connection and messages. Validate message shapes, authorize subscriptions, restrict origins, bound payloads, and use pub/sub to scale across processes.

Release scope

This guide describes installed 0.5.13 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.6.0

Realtime

defineRoom handles connection and messages. Validate message shapes, authorize subscriptions, restrict origins, bound payloads, and use pub/sub to scale across processes.

Release scope

This guide describes installed 0.6.0 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} diff --git a/app/pages/guides/routing.wrn b/app/pages/guides/routing.wrn index a5f22cee..dc183438 100644 --- a/app/pages/guides/routing.wrn +++ b/app/pages/guides/routing.wrn @@ -7,10 +7,10 @@ page Routing { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.5.13

Routing

A page filename defines its URL; index maps to the directory root and bracket segments are dynamic parameters. API files under app/api expose HTTP method functions and receive a Context.

Release scope

This guide describes installed 0.5.13 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.6.0

Routing

A page filename defines its URL; index maps to the directory root and bracket segments are dynamic parameters. API files under app/api expose HTTP method functions and receive a Context.

Release scope

This guide describes installed 0.6.0 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} diff --git a/app/pages/guides/security.wrn b/app/pages/guides/security.wrn index e3d8f18b..b5f56a47 100644 --- a/app/pages/guides/security.wrn +++ b/app/pages/guides/security.wrn @@ -7,10 +7,10 @@ page Applicationsecurity { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.5.13

Application security

Use CSP, CSRF, Trusted Types, session hardening, validation, origin checks, upload restrictions, encryption, request limits, and explicit CORS. See the security policy for reporting.

Release scope

This guide describes installed 0.5.13 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.6.0

Application security

Use CSP, CSRF, Trusted Types, session hardening, validation, origin checks, upload restrictions, encryption, request limits, and explicit CORS. See the security policy for reporting.

Release scope

This guide describes installed 0.6.0 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} diff --git a/app/pages/guides/server-data.wrn b/app/pages/guides/server-data.wrn index eb320433..c699661b 100644 --- a/app/pages/guides/server-data.wrn +++ b/app/pages/guides/server-data.wrn @@ -7,10 +7,10 @@ page Serverdata { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.5.13

Server data

Use an ssr API binding, return the desired response field, and render it with a server #each block. Values are escaped. Avoid fetching private data through a route that lacks authorization.

Release scope

This guide describes installed 0.5.13 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.6.0

Server data

Use an ssr API binding, return the desired response field, and render it with a server #each block. Values are escaped. Avoid fetching private data through a route that lacks authorization.

Release scope

This guide describes installed 0.6.0 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} diff --git a/app/pages/guides/testing.wrn b/app/pages/guides/testing.wrn index f9e4967d..9907d69d 100644 --- a/app/pages/guides/testing.wrn +++ b/app/pages/guides/testing.wrn @@ -7,10 +7,10 @@ page Testing { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.5.13

Testing

Use Bun tests and @wrnexus/test helpers. Cover server HTML, API status and validation, authorization failures, reactive behavior, and a production startup smoke test.

Release scope

This guide describes installed 0.5.13 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.6.0

Testing

Use Bun tests and @wrnexus/test helpers. Cover server HTML, API status and validation, authorization failures, reactive behavior, and a production startup smoke test.

Release scope

This guide describes installed 0.6.0 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} diff --git a/app/pages/guides/troubleshooting.wrn b/app/pages/guides/troubleshooting.wrn index 983400e0..16fd62a8 100644 --- a/app/pages/guides/troubleshooting.wrn +++ b/app/pages/guides/troubleshooting.wrn @@ -7,10 +7,10 @@ page Troubleshooting { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.5.13

Troubleshooting

Confirm Bun and package versions, regenerate docs/routes through supported commands, read the first compiler diagnostic, check file naming, validate config, and reproduce under a production build.

Release scope

This guide describes installed 0.5.13 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.6.0

Troubleshooting

Confirm Bun and package versions, regenerate docs/routes through supported commands, read the first compiler diagnostic, check file naming, validate config, and reproduce under a production build.

Release scope

This guide describes installed 0.6.0 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} diff --git a/app/pages/guides/upgrading.wrn b/app/pages/guides/upgrading.wrn index 4adae9c5..f998fee9 100644 --- a/app/pages/guides/upgrading.wrn +++ b/app/pages/guides/upgrading.wrn @@ -7,10 +7,10 @@ page Upgrading { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.5.13

Upgrading

Back up and commit first, then use wrnexus update --latest as documented by the installed CLI. Review migrations and keep every @wrnexus package aligned. Current release: 0.5.13.

Release scope

This guide describes installed 0.5.13 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.6.0

Upgrading

Back up and commit first, then use wrnexus update --latest as documented by the installed CLI. Review migrations and keep every @wrnexus package aligned. Current release: 0.6.0.

Release scope

This guide describes installed 0.6.0 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} diff --git a/app/pages/guides/uploads.wrn b/app/pages/guides/uploads.wrn index f617e544..884226c7 100644 --- a/app/pages/guides/uploads.wrn +++ b/app/pages/guides/uploads.wrn @@ -7,10 +7,10 @@ page Uploads { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.5.13

Uploads

Configure named stores, accepted MIME/extensions, and maxBytes. Random keys avoid path traversal. Private files require an authenticated serving route; v1 buffers each file in memory.

Release scope

This guide describes installed 0.5.13 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.6.0

Uploads

Configure named stores, accepted MIME/extensions, and maxBytes. Random keys avoid path traversal. Private files require an authenticated serving route; v1 buffers each file in memory.

Release scope

This guide describes installed 0.6.0 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} diff --git a/app/pages/guides/workspaces-and-gateway.wrn b/app/pages/guides/workspaces-and-gateway.wrn index f9298a94..4cca4f1d 100644 --- a/app/pages/guides/workspaces-and-gateway.wrn +++ b/app/pages/guides/workspaces-and-gateway.wrn @@ -7,9 +7,9 @@ page Workspacesandgateway { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.5.13

Workspaces and gateway

A workspace runs isolated applications behind one domain-routing gateway. Add an application from the workspace root; the CLI scaffolds apps/reports and registers it in wrnexus.workspace.ts:

wrnexus workspace add reports --domain=reports.localhost
+      
Preview guide · 0.6.0

Workspaces and gateway

A workspace runs isolated applications behind one domain-routing gateway. Add an application from the workspace root; the CLI scaffolds apps/reports and registers it in wrnexus.workspace.ts:

wrnexus workspace add reports --domain=reports.localhost
 bun install
 bun run dev

Forward authentication

Point protected applications at a dedicated verifier endpoint. The verifier must return 2xx for an authenticated session, 401/403 to deny access, or an HTTP redirect to begin browser login.

// wrnexus.workspace.ts
 {
@@ -28,8 +28,8 @@ export const GET = async (ctx: Context) => {
   return redirectToLogin(ctx, "/login", {
     allowedHosts: ["admin.localhost:3000", "reports.localhost:3000"],
   });
-};

Always allowlist redirect hosts. After login, validate or sign the returnTo value before redirecting. Keep internal app ports private and open applications through the gateway port.

Release scope

This guide describes installed 0.5.13 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +};

Always allowlist redirect hosts. After login, validate or sign the returnTo value before redirecting. Keep internal app ports private and open applications through the gateway port.

Release scope

This guide describes installed 0.6.0 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} diff --git a/app/pages/index.wrn b/app/pages/index.wrn index e26d4caa..ce86dd4c 100644 --- a/app/pages/index.wrn +++ b/app/pages/index.wrn @@ -7,9 +7,9 @@ page Home { view {
-
W WRNexusJS
+
W WRNexusJS
-

WRNexusJS v0.5.13

Build from the server.
Ship only what matters.

WRNexusJS is an SSR-first, Bun-native full-stack framework. Build typed pages, APIs, validated forms, realtime rooms, secure sessions, workspaces, and optional mobile experiences with the .wrn component language.

Private developer preview. Request access to the package registry.

app/pages/dashboard.wrn
page Dashboard {
+      

WRNexusJS v0.6.0

Build from the server.
Ship only what matters.

WRNexusJS is an SSR-first, Bun-native full-stack framework. Build typed pages, APIs, validated forms, realtime rooms, secure sessions, workspaces, and optional mobile experiences with the .wrn component language.

Private developer preview. Request access to the package registry.

app/pages/dashboard.wrn
page Dashboard {
   ssr { api tasks GET /api/tasks { return tasks } }
   view {
     <main>
@@ -35,10 +35,10 @@ export const POST = async (ctx) => {
   return result.ok ? Response.json({ ok: true }, { status: 201 }) : result.response;
 };

Request lifecycle

  1. RequestSecurity headers and request limits
  2. MiddlewareAuthentication, policy, and context
  3. File routePage or API handler
  4. Compiler + SSRSafe HTML and scoped runtime
  5. ResponseHTML, JSON, stream, or realtime upgrade
-

Production proof

WorkRoot

Public creator/company site and approved WRNexusJS production showcase.

wrnexusjs.dev

This documentation application runs WRNexusJS 0.5.13.

View deployment notes and showcase status →

-

Capability status

CapabilityStatusDetails
SSR, routing, compiler, APIsPreviewInstalled in 0.5.13; public support policy pending.
Mobile/nativeExperimentalCapacitor compatibility and native generation have platform limitations.
Durable queuesExperimentalProduction durability requires an appropriate driver strategy.
-

Continue exploring

- +

Production proof

WorkRoot

Public creator/company site and approved WRNexusJS production showcase.

wrnexusjs.dev

This documentation application runs WRNexusJS 0.6.0.

View deployment notes and showcase status →

+

Capability status

CapabilityStatusDetails
SSR, routing, compiler, APIsPreviewInstalled in 0.6.0; public support policy pending.
Mobile/nativeExperimentalCapacitor compatibility and native generation have platform limitations.
Durable queuesExperimentalProduction durability requires an appropriate driver strategy.
+

Continue exploring

+
} diff --git a/app/pages/language.wrn b/app/pages/language.wrn index 0aba7a57..d90fcd98 100644 --- a/app/pages/language.wrn +++ b/app/pages/language.wrn @@ -7,15 +7,15 @@ page Thewrnlanguage { view {
-
W WRNexusJS
+
W WRNexusJS
-
Language reference · 0.5.13

The .wrn language

File anatomy

page Account {
+      
Language reference · 0.6.0

The .wrn language

File anatomy

page Account {
   layout = "public"
   seo { title = "Account" description = "Manage your account." }
   state count = 0
   view { <button @click="count++">Count {count}</button> }
 }

Pages, components, layouts, props, and state

Pages are routes. Components declare default-valued props and may hold state. Layouts provide shared slots. Mount components with data-component; fill default or named slots with data-slot.

Interpolation, conditionals, and loops

Interpolation is HTML-escaped. Use server {#if} and {#each} for SSR data. Use data-show for reactive client visibility.

Events and directives

@click and other events execute in the reactive scope. Data attributes opt into forms, i18n, themes, realtime, uploader, browser, and mobile behavior. Consult the exact package page because availability varies.

Forms, i18n, themes, and realtime

form[data-schema] connects descriptors to client and server validation. Translation keys use {t:key}. Theme toggles use data-wire-theme-toggle. Realtime pages opt into a named room.

Escaping and security

Text interpolation is escaped by default. Do not construct trusted HTML from user input. Server-only refinements must be repeated at the authoritative mutation boundary.

Common compiler errors

  • Use balanced braces; a literal brace must be escaped.
  • Declare UI in view, not JSX or hooks.
  • Use a valid page, component, or layout declaration matching the file role.
  • Keep server loops tied to available SSR bindings.
  • Check troubleshooting and compiler API for this release.
- +
} diff --git a/app/pages/license.wrn b/app/pages/license.wrn index 46cd5809..bd56c5e4 100644 --- a/app/pages/license.wrn +++ b/app/pages/license.wrn @@ -7,10 +7,10 @@ page License { view {
-
W WRNexusJS
+
W WRNexusJS

License

Owner decision required

This documentation repository contains no public license file, and the packages are unavailable from the public npm registry. No open-source license or redistribution right should be inferred.

Approved preview users must follow the private/commercial terms supplied by WorkRoot. Contact WorkRoot before copying, redistributing, or using WRNexusJS in production.

- +
} diff --git a/app/pages/packages.wrn b/app/pages/packages.wrn index ab3a3f31..1aeb67a2 100644 --- a/app/pages/packages.wrn +++ b/app/pages/packages.wrn @@ -12,10 +12,10 @@ page Packages {
W WRNexusJS - +
-
31 focused packages

Package reference

Everything in the framework, organized by responsibility and documented from the published 0.5.13 APIs.

Showing {category} packages

+
31 focused packages

Package reference

Everything in the framework, organized by responsibility and documented from the published 0.6.0 APIs.

Showing {category} packages

AI

@wrnexus/ai

Server-side Anthropic client with generation and streaming.

Open documentation →
@@ -108,7 +108,7 @@ page Packages { Security

@wrnexus/validation

Typed schemas, coercion, validation, and browser descriptors.

Open documentation →
- + } diff --git a/app/pages/packages/ai.wrn b/app/pages/packages/ai.wrn index e0664f72..0d09ff9e 100644 --- a/app/pages/packages/ai.wrn +++ b/app/pages/packages/ai.wrn @@ -10,11 +10,11 @@ page wrnexusai {
W WRNexusJS - +
-
AI · Package reference

@wrnexus/ai

Server-side Anthropic client with generation and streaming.

v0.5.13Private registryAI

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/ai@0.5.13

Request preview access. Never put registry tokens in source control.

A tiny, zero-dependency Claude (Anthropic) client for WRNexusJS apps — generate and stream text with Claude from any server-side code.
+
AI · Package reference

@wrnexus/ai

Server-side Anthropic client with generation and streaming.

v0.6.0Private registryAI

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/ai@0.6.0

Request preview access. Never put registry tokens in source control.

A tiny, zero-dependency Claude (Anthropic) client for WRNexusJS apps — generate and stream text with Claude from any server-side code.

Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

Overview

@wrnexus/ai is a thin, dependency-free wrapper over the Anthropic Messages API, built on fetch (Bun-native, no SDK). Use it in API routes, jobs, or middleware to call Claude. It defaults to the most capable model, claude-opus-4-8, reads your key from ANTHROPIC_API_KEY, and supports both one-shot generation and streaming.

@@ -240,7 +240,7 @@ export const POST = async (ctx) => { };
- + } diff --git a/app/pages/packages/auth.wrn b/app/pages/packages/auth.wrn index 8aa693ac..f9db9b83 100644 --- a/app/pages/packages/auth.wrn +++ b/app/pages/packages/auth.wrn @@ -10,11 +10,11 @@ page wrnexusauth {
W WRNexusJS - +
-
Security · Package reference

@wrnexus/auth

Authentication routes, sessions, forms, guards, and account flows.

v0.5.13Private registrySecurity

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/auth@0.5.13

Request preview access. Never put registry tokens in source control.

Framework-native authentication, identity, account-security, and session management for WRNexusJS.

+
Security · Package reference

@wrnexus/auth

Authentication routes, sessions, forms, guards, and account flows.

v0.6.0Private registrySecurity

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/auth@0.6.0

Request preview access. Never put registry tokens in source control.

Framework-native authentication, identity, account-security, and session management for WRNexusJS.

Capabilities

  • Password registration, login, recovery, reset, and authenticated password changes
  • @@ -360,7 +360,7 @@ export const auth = createAuthEngine({ };
- + } diff --git a/app/pages/packages/authz.wrn b/app/pages/packages/authz.wrn index 86aed269..fc2f39e7 100644 --- a/app/pages/packages/authz.wrn +++ b/app/pages/packages/authz.wrn @@ -10,11 +10,11 @@ page wrnexusauthz {
W WRNexusJS - +
-
Security · Package reference

@wrnexus/authz

Role, permission, policy, and authorization guards.

v0.5.13Private registrySecurity

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/authz@0.5.13

Request preview access. Never put registry tokens in source control.

Composable authorization for WRNexusJS — role-based (RBAC), policy-based (PBAC), and attribute-based (ABAC) access control that reduces to a boolean check plus an authorize() guard.
+
Security · Package reference

@wrnexus/authz

Role, permission, policy, and authorization guards.

v0.6.0Private registrySecurity

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/authz@0.6.0

Request preview access. Never put registry tokens in source control.

Composable authorization for WRNexusJS — role-based (RBAC), policy-based (PBAC), and attribute-based (ABAC) access control that reduces to a boolean check plus an authorize() guard.

Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

Overview

@wrnexus/authz is a small, server-side authorization toolkit. It gives you three interchangeable models — RBAC (roles → permissions), PBAC (policy predicates), and ABAC (attribute matchers) — that all collapse to a boolean | Promise<boolean> decision. Wrap any decision in a Middleware guard (authorize, requireRole, requirePermission) to protect WRNexusJS routes. Reach for it whenever a route or action needs to be gated on who the user is, what roles they hold, or attributes of the user and the resource. It plugs into @wrnexus/core by reading ctx.user as the authorization subject.

@@ -242,7 +242,7 @@ app.put( );
- + } diff --git a/app/pages/packages/captcha.wrn b/app/pages/packages/captcha.wrn index 310f1390..e3135f09 100644 --- a/app/pages/packages/captcha.wrn +++ b/app/pages/packages/captcha.wrn @@ -10,11 +10,11 @@ page wrnexuscaptcha {
W WRNexusJS - +
-
Security · Package reference

@wrnexus/captcha

Managed CAPTCHA verification, middleware, and UI integration.

v0.5.13Private registrySecurity

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/captcha@0.5.13

Request preview access. Never put registry tokens in source control.

A first-class CAPTCHA and anti-automation package for WRNexusJS. It supports self-hosted challenges, a managed WRNexus service, external providers, form submission guards, page gates, accessible audio, adaptive risk checks, and a Tailwind-only .wrn component.

+
Security · Package reference

@wrnexus/captcha

Managed CAPTCHA verification, middleware, and UI integration.

v0.6.0Private registrySecurity

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/captcha@0.6.0

Request preview access. Never put registry tokens in source control.

A first-class CAPTCHA and anti-automation package for WRNexusJS. It supports self-hosted challenges, a managed WRNexus service, external providers, form submission guards, page gates, accessible audio, adaptive risk checks, and a Tailwind-only .wrn component.

Install

bun add @wrnexus/captcha

WRNexusJS automatically discovers the package plugin, component, client runtime, styles, and DevToolbar audit. Use <Captcha /> directly after installation. The browser runtime is injected once only on responses that render a CAPTCHA; no script tag, public-file copy, or manual plugin registration is required. Call captchaPlugin(options) explicitly only when an application needs to override the discovered package configuration.

@@ -314,7 +314,7 @@ export const HEAD = POST;
- + } diff --git a/app/pages/packages/cli.wrn b/app/pages/packages/cli.wrn index a6e2aac7..658f0700 100644 --- a/app/pages/packages/cli.wrn +++ b/app/pages/packages/cli.wrn @@ -10,11 +10,11 @@ page wrnexuscli {
W WRNexusJS - +
-
Tooling · Package reference

@wrnexus/cli

Create, develop, build, generate, test, and maintain WRNexusJS apps.

v0.5.13Private registryTooling

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/cli@0.5.13

Request preview access. Never put registry tokens in source control.

The wrnexus command-line tool that scaffolds, runs, builds, tests, and manages WRNexusJS apps.
+
Tooling · Package reference

@wrnexus/cli

Create, develop, build, generate, test, and maintain WRNexusJS apps.

v0.6.0Private registryTooling

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/cli@0.6.0

Request preview access. Never put registry tokens in source control.

The wrnexus command-line tool that scaffolds, runs, builds, tests, and manages WRNexusJS apps.

Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

Overview

@wrnexus/cli provides the wrnexus executable — the single entry point for developing a WRNexusJS app. It runs the HMR dev server, produces a self-contained production build, scaffolds apps/pages/components, drives database migrations, regenerates typed routes and queries, runs tests, and manages configuration profiles. It also scaffolds multi-app monorepos and serves them behind a domain-routing gateway. This is a CLI/build-time package (it shells out to the Bun binary for the dev child and tests) and it also exports the workspace config types via a subpath.

@@ -153,7 +153,7 @@ wrnexus update --latest wrnexus doctor
- + } diff --git a/app/pages/packages/compiler.wrn b/app/pages/packages/compiler.wrn index f031fb0f..0cce8a5a 100644 --- a/app/pages/packages/compiler.wrn +++ b/app/pages/packages/compiler.wrn @@ -10,11 +10,11 @@ page wrnexuscompiler {
W WRNexusJS - +
-
Core · Package reference

@wrnexus/compiler

Parser and code generators for the .wrn language.

v0.5.13Private registryCore

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/compiler@0.5.13

Request preview access. Never put registry tokens in source control.

Compiler for the .wrn language — tokenizes, parses, and lowers .wrn page and component files to TypeScript.
+
Core · Package reference

@wrnexus/compiler

Parser and code generators for the .wrn language.

v0.6.0Private registryCore

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/compiler@0.6.0

Request preview access. Never put registry tokens in source control.

Compiler for the .wrn language — tokenizes, parses, and lowers .wrn page and component files to TypeScript.

Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

Overview

@wrnexus/compiler turns .wrn source into TypeScript that targets the framework's runtime primitives. A .wrn file declares either a page (a route) or a component (a reusable, prop-driven fragment) with blocks for state, view (plain HTML), seo, style, functions, api, ssr/client data bindings, and realtime websocket handlers. The pipeline is source → Lexer → parse() → PageAst → generate() → TypeScript. It is a build/server-side library — the WRNexusJS dev loader calls it to compile .wrn files on the fly, surfacing ParseError as a readable error page.

@@ -123,8 +123,8 @@ lx.next(); // { type: "lbrace", value: "{", pos: 1
  • Pure TypeScript with no runtime dependencies; runs under Bun as part of the WRNexusJS toolchain (Node is not supported).
  • Generated modules target WRNexusJS runtime primitives (data-scope, data-text, data-on-*, data-for, data-component, __wrnexus*/__wire* helpers) — consume the output within a WRNexusJS app, e.g. via @wrnexus/core's dev loader.
  • -

Complete TypeScript API

Generated from the exact installed package declarations.

import { PageAst as PageAst$1, WrnDiagnostic } from '@wrnexus/syntax';
-export { ActionBlock, ApiBlock, Attr, ComputedDecl, DataApiBlock, DataMode, EffectBlock, EventDecl, LexError, Lexer, LoadBlock, ModeFunctionsBlock, PageAst, ParseError, PropDecl, RealtimeBlock, SeoBlock, StateDecl, ViewNode, WrnDiagnostic, assertValidAst, diagnose, diagnosticFromError, eraseFunctionTypes, formatDiagnostic, inferredRuntimeType, parse, runtimeTypeOf } from '@wrnexus/syntax';
+

Complete TypeScript API

Generated from the exact installed package declarations.

import { PageAst as PageAst$1, StructuredImportDecl, WrnDiagnostic } from '@wrnexus/syntax';
+export { ActionBlock, ApiBlock, Attr, ComputedDecl, DataApiBlock, DataMode, EffectBlock, EventDecl, LexError, Lexer, LoadBlock, ModeFunctionsBlock, OutputDecl, PageAst, ParseError, PropDecl, RealtimeBlock, RuntimeFunctionDecl, SeoBlock, StateDecl, StateRuntime, StoreKind, StructuredImportDecl, ViewNode, WrnDiagnostic, assertValidAst, diagnose, diagnosticFromError, eraseFunctionTypes, formatDiagnostic, inferredRuntimeType, parse, runtimeTypeOf } from '@wrnexus/syntax';
 import { PageAst } from '@wrnexus/syntax/parser';
 
 /**
@@ -138,7 +138,7 @@ import { PageAst } from '@wrnexus/syntax/parser';
  *   api="<name>"       -> SSR/client data binding declared in a mode block
  *   ssrGet/ssrText     -> legacy server-side API fetch + render
  *   csrGet/csrText     -> legacy browser-side API fetch + render
- *   style              -> an inline page stylesheet
+ *   style              -> tagged local stylesheet metadata promoted by SSR
  *   functions          -> server-only helpers for API/realtime code
  *   api M /p {b}       -> export const M = async (ctx) => { b }
  *   realtime {..}      -> export const websocket = { evt(ws, ...args) { b } }
@@ -146,6 +146,115 @@ import { PageAst } from '@wrnexus/syntax/parser';
 
 declare function generate(ast: PageAst): string;
 
+interface ComponentContractMetadata {
+    name: string;
+    kind: PageAst$1["kind"];
+    props: Array<{
+        name: string;
+        type: string;
+        required: boolean;
+        default?: string;
+        options?: string[];
+    }>;
+    outputs: Array<{
+        name: string;
+        payloadName?: string;
+        payloadType?: string;
+    }>;
+    functions: Array<{
+        name: string;
+        runtime: string;
+        async: boolean;
+        parameters: Array<{
+            name: string;
+            type: string;
+            optional: boolean;
+        }>;
+        returnType: string;
+    }>;
+    states: Array<{
+        name: string;
+        runtime: string;
+        type: string;
+        initializer: string;
+    }>;
+    computed: Array<{
+        name: string;
+        type: string;
+        expression: string;
+    }>;
+    imports: Array<{
+        source: string;
+        typeOnly: boolean;
+        defaultImport?: string;
+        namedImports: string[];
+    }>;
+}
+declare function createComponentContract(ast: PageAst$1): ComponentContractMetadata;
+
+interface RpcManifestEntry {
+    id: string;
+    component: string;
+    function: string;
+    parameters: Array<{
+        name: string;
+        type: string;
+        optional: boolean;
+    }>;
+    returnType: string;
+}
+declare function rpcManifest(ast: PageAst$1): RpcManifestEntry[];
+declare function generateServerFunctionsModule(ast: PageAst$1): string;
+
+interface CompileTargets {
+    server: string;
+    browser: string;
+    declarations: string;
+    contract: ReturnType<typeof createComponentContract>;
+    rpc: ReturnType<typeof rpcManifest>;
+}
+declare function generateTargets(ast: PageAst$1): CompileTargets;
+
+declare function generateBrowserModule(ast: PageAst$1): string;
+
+declare function generateDeclarations(ast: PageAst$1): string;
+
+declare function generateStoreModule(ast: PageAst$1): string;
+/** Standalone browser artifact for an imported `.wrn` store. */
+declare function generateStoreBrowserModule(ast: PageAst$1): string;
+
+type ImportMode = "legacy" | "compatible" | "explicit";
+interface ImportResolverOptions {
+    appRoot: string;
+    mode?: ImportMode;
+    aliases?: Record<string, string>;
+}
+interface ResolvedImport {
+    declaration: StructuredImportDecl;
+    resolved?: string;
+    diagnostic?: {
+        code: string;
+        message: string;
+        severity: "error" | "warning";
+    };
+}
+declare function resolveWrnImport(declaration: StructuredImportDecl, importer: string, options: ImportResolverOptions): ResolvedImport;
+declare function resolveWrnImports(declarations: StructuredImportDecl[], importer: string, options: ImportResolverOptions): ResolvedImport[];
+
+interface WrnSourceMapEntry {
+    generatedLine: number;
+    sourceLine: number;
+    sourceColumn: number;
+    kind: string;
+}
+interface WrnSourceMap {
+    version: 1;
+    source: string;
+    generated: string;
+    mappings: WrnSourceMapEntry[];
+}
+declare function createWrnSourceMap(source: string, generated: string): WrnSourceMap;
+
 declare class NativeCompileError extends Error {
     constructor(message: string);
 }
@@ -210,7 +319,7 @@ declare function compileWireFile(source: string, filePath?: string): string;
 /** Richer entry point returning the AST and structured diagnostics. */
 declare function compile(source: string, filePath?: string): CompileResult;
 
-export { type CompilationCache, type CompilationCacheEntry, type CompilationCacheOptions, type CompileResult, DependencyGraph, NativeCompileError, compilationKey, compile, compileNativeWireFile, compileWireFile, createCompilationCache, generate, generateNative };
+export { type CompilationCache, type CompilationCacheEntry, type CompilationCacheOptions, type CompileResult, DependencyGraph, NativeCompileError, compilationKey, compile, compileNativeWireFile, compileWireFile, createCompilationCache, createComponentContract, createWrnSourceMap, generate, generateBrowserModule, generateDeclarations, generateNative, generateServerFunctionsModule, generateStoreBrowserModule, generateStoreModule, generateTargets, resolveWrnImport, resolveWrnImports, rpcManifest };
 

Examples

Copy-ready examples from the installed package documentation.

Compile a page

import { compileWireFile } from "@wrnexus/compiler";
 
 const ts = compileWireFile(`
@@ -241,7 +350,7 @@ lx.next(); // { type: "ident", value: "Home", pos: 5 &#
 lx.next(); // { type: "lbrace", value: "{", pos: 10 }
- + } diff --git a/app/pages/packages/core.wrn b/app/pages/packages/core.wrn index 2ae1fc1c..b46495c0 100644 --- a/app/pages/packages/core.wrn +++ b/app/pages/packages/core.wrn @@ -10,11 +10,11 @@ page wrnexuscore {
W WRNexusJS - +
-
Core · Package reference

@wrnexus/core

Contexts, middleware, security, sessions, caching, JSX, and realtime.

v0.5.13Private registryCore

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/core@0.5.13

Request preview access. Never put registry tokens in source control.

The framework core: the request Context, middleware contract, and the security, session, caching, streaming, realtime, and JSX primitives every other WRNexusJS package builds on.
+
Core · Package reference

@wrnexus/core

Contexts, middleware, security, sessions, caching, JSX, and realtime.

v0.6.0Private registryCore

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/core@0.6.0

Request preview access. Never put registry tokens in source control.

The framework core: the request Context, middleware contract, and the security, session, caching, streaming, realtime, and JSX primitives every other WRNexusJS package builds on.

Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

Overview

@wrnexus/core is the shared foundation of WRNexusJS. It defines the Context object that flows through every middleware, page, and API route, plus the Middleware/Next contract they implement. On top of that it ships the building blocks a real app needs: cookie-backed sessions, password auth, CSRF protection, rate limiting, request logging, HTTP + in-memory caching, file uploads, streaming/SSE responses, WebSocket "rooms", security headers/CORS, and a server-side JSX runtime that renders to HTML strings. Everything here is server-side and Bun-native (it uses Bun.password, Bun.write, the web-standard Request/Response, and crypto). You depend on it directly and transitively through the rest of the framework.

@@ -1210,7 +1210,7 @@ const registry = createRealtimeRegistry(); bridgeRealtime(registry, createPubSub(redisDriver(process.env.REDIS_URL)));
- + } diff --git a/app/pages/packages/csr.wrn b/app/pages/packages/csr.wrn index 2f3bbfae..697d47e8 100644 --- a/app/pages/packages/csr.wrn +++ b/app/pages/packages/csr.wrn @@ -10,11 +10,11 @@ page wrnexuscsr {
W WRNexusJS - +
-
Frontend · Package reference

@wrnexus/csr

Reactive, navigation, and realtime browser runtimes.

v0.5.13Private registryFrontend

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/csr@0.5.13

Request preview access. Never put registry tokens in source control.

The browser-side client runtime for WRNexusJS — generic, self-contained JS that hydrates server-rendered pages with reactivity, client-side navigation, and realtime rooms.
+
Frontend · Package reference

@wrnexus/csr

Reactive, navigation, and realtime browser runtimes.

v0.6.0Private registryFrontend

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/csr@0.6.0

Request preview access. Never put registry tokens in source control.

The browser-side client runtime for WRNexusJS — generic, self-contained JS that hydrates server-rendered pages with reactivity, client-side navigation, and realtime rooms.

Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

Overview

@wrnexus/csr holds the three client runtimes that WRNexusJS serves to the browser. Components are authored as .wrn files and rendered on the server; this package provides the single, generic runtime that hydrates that HTML in the browser — there are no per-component browser bundles. Each runtime is exported as a plain-JS string (no build step, no imports) intended to be served verbatim from a well-known URL:

@@ -189,6 +189,52 @@ declare const NAV_RUNTIME: string; */ declare const REALTIME_RUNTIME: string; +type OutputHandler<T = unknown> = (payload: T) => void | Promise<void>; +interface OutputHost extends HTMLElement { + __wrnexusOutputHandlers?: Map<string, Set<OutputHandler>>; +} +declare function registerOutputHandler<T>(host: OutputHost, name: string, handler: OutputHandler<T>): () => void; +declare function invokeOutput<T>(host: OutputHost, name: string, payload?: T): Promise<void>; +declare function createOutputProxy<T extends Record<string, (...args: any[]) => void>>(host: OutputHost): T; + +interface ServerCallOptions { + endpoint?: string; + signal?: AbortSignal; + headers?: HeadersInit; + csrfToken?: string; +} +declare class WrnServerCallError extends Error { + readonly code: string; + readonly status: number; + readonly details?: unknown | undefined; + constructor(message: string, code: string, status: number, details?: unknown | undefined); +} +declare function callServerFunction<TInput extends unknown[], TOutput>(component: string, functionName: string, args: TInput, options?: ServerCallOptions): Promise<TOutput>; +declare function createServerProxy<T extends Record<string, (...args: any[]) => Promise<any>>>(component: string, options?: ServerCallOptions): T; + +declare function collectRefs(root: ParentNode): Record<string, Element>; + +interface ClientModuleScope { + output: Record<string, (payload?: unknown) => void>; + server: Record<string, (...args: unknown[]) => Promise<unknown>>; + props: Readonly<Record<string, unknown>>; + refs: Record<string, Element>; +} +declare function loadClientFunctions(url: string, scope: ClientModuleScope): Promise<Record<string, (...args: unknown[]) => unknown>>; +declare function invalidateClientModule(url: string): void; + +interface HydrationScopeApi { + get(name: string): unknown; + set(name: string, value: unknown): void; + call(name: string, ...args: unknown[]): unknown; + snapshot(): Readonly<Record<string, unknown>>; + dispose(): void; +} +interface WrnexusBrowserGlobals { + __wrnexusHydrateScopes?(root?: ParentNode): void; + __wrnexusDisposeBehaviors?(root?: ParentNode): void; +} + /** * @wrnexus/csr — the browser reactive runtime. * @@ -205,7 +251,7 @@ declare function getNavRuntime(): string; /** The realtime client runtime served at `/__wrnexus/realtime.js`. */ declare function getRealtimeRuntime(): string; -export { NAV_RUNTIME, REACTIVE_RUNTIME, REALTIME_RUNTIME, getNavRuntime, getReactiveRuntime, getRealtimeRuntime }; +export { type ClientModuleScope, type HydrationScopeApi, NAV_RUNTIME, type OutputHandler, type OutputHost, REACTIVE_RUNTIME, REALTIME_RUNTIME, type ServerCallOptions, WrnServerCallError, type WrnexusBrowserGlobals, callServerFunction, collectRefs, createOutputProxy, createServerProxy, getNavRuntime, getReactiveRuntime, getRealtimeRuntime, invalidateClientModule, invokeOutput, loadClientFunctions, registerOutputHandler };

Examples

Copy-ready examples from the installed package documentation.

Server side — serve the runtime strings from your router (example with Bun.serve)

import { getReactiveRuntime, getNavRuntime, getRealtimeRuntime } from "@wrnexus/csr";
 
 const routes: Record<string, string> = {
@@ -251,7 +297,7 @@ room.on("chat", (msg) => console.log(msg.user, msg.text));
 room.send({ type: "chat", user: "ada", text: "hi" });
- + } diff --git a/app/pages/packages/db.wrn b/app/pages/packages/db.wrn index b02104bb..9329375d 100644 --- a/app/pages/packages/db.wrn +++ b/app/pages/packages/db.wrn @@ -10,11 +10,11 @@ page wrnexusdb {
W WRNexusJS - +
-
Data · Package reference

@wrnexus/db

Database adapters, typed queries, models, migrations, and sessions.

v0.5.13Private registryData

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/db@0.5.13

Request preview access. Never put registry tokens in source control.

The database layer for WRNexusJS: TS models as the single source of truth for DDL, validation, and result typing, plus a driver-based Db client, migrations, and a sqlc-style query generator.
+
Data · Package reference

@wrnexus/db

Database adapters, typed queries, models, migrations, and sessions.

v0.6.0Private registryData

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/db@0.6.0

Request preview access. Never put registry tokens in source control.

The database layer for WRNexusJS: TS models as the single source of truth for DDL, validation, and result typing, plus a driver-based Db client, migrations, and a sqlc-style query generator.

Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

Overview

@wrnexus/db is the server-side data layer. You describe tables as TypeScript models (the v column builder + table()); those models drive migrations, coerce raw DB rows into typed objects, and feed the query generator. A thin Driver interface is implemented by adapters for SQLite (bun:sqlite), Postgres/MySQL (Bun.SQL), and MongoDB. The Db client adds ergonomics — model-mapped all/one, transactions, createTable, pagination, and batched relation loading. A process-wide registry (getDb/setDb) exposes configured connections to pages and API routes. Reach for it whenever a WRNexusJS app needs persistence.

@@ -381,7 +381,7 @@ await repo.insert({ email: "a@b.com" }); const active = await repo.find({ active: true });
- + } diff --git a/app/pages/packages/dev-server.wrn b/app/pages/packages/dev-server.wrn index d8f2351e..a6f558a3 100644 --- a/app/pages/packages/dev-server.wrn +++ b/app/pages/packages/dev-server.wrn @@ -10,11 +10,11 @@ page wrnexusdevserver {
W WRNexusJS - +
-
Runtime · Package reference

@wrnexus/dev-server

Development and production servers, HMR, assets, and gateways.

v0.5.13Private registryRuntime

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/dev-server@0.5.13

Request preview access. Never put registry tokens in source control.

The WRNexusJS HTTP + WebSocket server runtime — request dispatch, SSR document assembly, live-reload (HMR), and the portable production handler.
+
Runtime · Package reference

@wrnexus/dev-server

Development and production servers, HMR, assets, and gateways.

v0.6.0Private registryRuntime

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/dev-server@0.6.0

Request preview access. Never put registry tokens in source control.

The WRNexusJS HTTP + WebSocket server runtime — request dispatch, SSR document assembly, live-reload (HMR), and the portable production handler.

Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

Overview

This package is the server runtime that powers a WRNexusJS app in both development and production. A single request runtime (createHandlers) owns HTTP/WebSocket dispatch and SSR document assembly; it knows nothing about _how_ modules and assets are produced, so the dev and prod entry points wire in different backends: dev uses dynamic module loading plus on-the-fly bundling and injects a live-reload client; prod uses a static, pre-built manifest with cache-immutable assets. The package also ships a multi-app gateway (route several apps by Host header behind one port) and a portable node:http adapter for WinterCG hosts. It is entirely server-side and Bun-native (Bun.serve, Bun.file, Bun.gzipSync).

@@ -737,7 +737,7 @@ await startGateway({ });
- + } diff --git a/app/pages/packages/dev-toolbar.wrn b/app/pages/packages/dev-toolbar.wrn index b5e98443..89444f28 100644 --- a/app/pages/packages/dev-toolbar.wrn +++ b/app/pages/packages/dev-toolbar.wrn @@ -10,11 +10,11 @@ page wrnexusdevtoolbar {
W WRNexusJS - +
-
Tooling · Package reference

@wrnexus/dev-toolbar

Development toolbar diagnostics, inspection, and runtime status.

v0.5.13Private registryTooling

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/dev-toolbar@0.5.13

Request preview access. Never put registry tokens in source control.

Development-only page quality toolbar for WRNexusJS.

+
Tooling · Package reference

@wrnexus/dev-toolbar

Development toolbar diagnostics, inspection, and runtime status.

v0.6.0Private registryTooling

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/dev-toolbar@0.6.0

Request preview access. Never put registry tokens in source control.

Development-only page quality toolbar for WRNexusJS.

Features

  • Runtime, resource and unhandled promise error capture
  • @@ -37,7 +37,7 @@ export { DEV_TOOLBAR_CSS, DEV_TOOLBAR_RUNTIME } from './client/index.j const issues = runDevToolbarRules(context);
- + } diff --git a/app/pages/packages/encryption.wrn b/app/pages/packages/encryption.wrn index 5b9a54e7..bdfc34d6 100644 --- a/app/pages/packages/encryption.wrn +++ b/app/pages/packages/encryption.wrn @@ -10,11 +10,11 @@ page wrnexusencryption {
W WRNexusJS - +
-
Security · Package reference

@wrnexus/encryption

Hashing, HMAC, authenticated encryption, and key derivation.

v0.5.13Private registrySecurity

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/encryption@0.5.13

Request preview access. Never put registry tokens in source control.

Dependency-free crypto helpers for WRNexusJS: authenticated symmetric encryption (AES-256-GCM), hashing, and HMAC signing.
+
Security · Package reference

@wrnexus/encryption

Hashing, HMAC, authenticated encryption, and key derivation.

v0.6.0Private registrySecurity

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/encryption@0.6.0

Request preview access. Never put registry tokens in source control.

Dependency-free crypto helpers for WRNexusJS: authenticated symmetric encryption (AES-256-GCM), hashing, and HMAC signing.

Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

Overview

This package provides small, focused cryptographic primitives for server-side use: encrypting secrets/tokens/database fields at rest with AES-256-GCM, deriving keys from passwords via PBKDF2, computing SHA-256 digests, and signing/verifying payloads with HMAC-SHA256. It is built entirely on the standard Web Crypto API (crypto.subtle) plus btoa/atob and TextEncoder/TextDecoder — no third-party dependencies. Reach for it whenever you need to protect sensitive values or verify webhook signatures. All functions are async (Web Crypto is promise-based).

@@ -127,7 +127,7 @@ const ok = await hmacVerify(rawBody, webhookSecret, incomingSignatureHeader); if (!ok) throw new Error("Invalid webhook signature");
- + } diff --git a/app/pages/packages/helpers.wrn b/app/pages/packages/helpers.wrn index f4ac10d6..4148b470 100644 --- a/app/pages/packages/helpers.wrn +++ b/app/pages/packages/helpers.wrn @@ -10,11 +10,11 @@ page wrnexushelpers {
W WRNexusJS - +
-
Tooling · Package reference

@wrnexus/helpers

Safe Context URL helpers and forward-auth login redirects.

v0.5.13Private registryTooling

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/helpers@0.5.13

Request preview access. Never put registry tokens in source control.

Safe convenience helpers for common WRNexusJS application flows. The package uses standard Context, URL, and Response values and has no runtime dependency beyond @wrnexus/core.

+
Tooling · Package reference

@wrnexus/helpers

Safe Context URL helpers and forward-auth login redirects.

v0.6.0Private registryTooling

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/helpers@0.6.0

Request preview access. Never put registry tokens in source control.

Safe convenience helpers for common WRNexusJS application flows. The package uses standard Context, URL, and Response values and has no runtime dependency beyond @wrnexus/core.

bun add @wrnexus/helpers

The package is private, so the machine must be authenticated to the wrnexus npm organization.

Usage

@@ -156,7 +156,7 @@ export const GET = async (ctx: Context) => { };
- + } diff --git a/app/pages/packages/i18n.wrn b/app/pages/packages/i18n.wrn index 9e22f491..d0c17082 100644 --- a/app/pages/packages/i18n.wrn +++ b/app/pages/packages/i18n.wrn @@ -10,11 +10,11 @@ page wrnexusi18n {
W WRNexusJS - +
-
Frontend · Package reference

@wrnexus/i18n

Translation loading, locale resolution, and Intl formatting.

v0.5.13Private registryFrontend

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/i18n@0.5.13

Request preview access. Never put registry tokens in source control.

Per-request translations plus locale-aware number, date, and currency formatting for WRNexusJS apps.
+
Frontend · Package reference

@wrnexus/i18n

Translation loading, locale resolution, and Intl formatting.

v0.6.0Private registryFrontend

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/i18n@0.6.0

Request preview access. Never put registry tokens in source control.

Per-request translations plus locale-aware number, date, and currency formatting for WRNexusJS apps.

Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

Overview

@wrnexus/i18n loads locale files from app/locales/<lang>.json, resolves the active language for each request (cookie → Accept-Language → default), and builds a t(key, params) translator used both in server code and in .wrn views. It also ships Intl-based formatting helpers and a tiny client runtime that wires up a language switcher. Translation lookup, language resolution, and HTML marker rewriting run server-side; only the small I18N_RUNTIME snippet runs in the browser.

@@ -251,7 +251,7 @@ formatRelativeTime(-3, "day", lang); // "3 days ago" plural(2, { one: "# item", other: "# items" }, lang); // "2 items"
- + } diff --git a/app/pages/packages/jwt.wrn b/app/pages/packages/jwt.wrn index f2d41c20..f2a03ea8 100644 --- a/app/pages/packages/jwt.wrn +++ b/app/pages/packages/jwt.wrn @@ -10,11 +10,11 @@ page wrnexusjwt {
W WRNexusJS - +
-
Security · Package reference

@wrnexus/jwt

HS256 JWT signing, verification, and bearer authentication.

v0.5.13Private registrySecurity

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/jwt@0.5.13

Request preview access. Never put registry tokens in source control.

Dependency-free JSON Web Tokens (HS256) via Web Crypto, plus a bearer-token auth middleware for WRNexusJS.
+
Security · Package reference

@wrnexus/jwt

HS256 JWT signing, verification, and bearer authentication.

v0.6.0Private registrySecurity

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/jwt@0.6.0

Request preview access. Never put registry tokens in source control.

Dependency-free JSON Web Tokens (HS256) via Web Crypto, plus a bearer-token auth middleware for WRNexusJS.

Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

Overview

@wrnexus/jwt signs and verifies stateless JSON Web Tokens using the HS256 (HMAC-SHA-256) algorithm. It has no runtime dependencies — signing and verification are implemented directly on the standard Web Crypto API (crypto.subtle), which Bun provides natively. It runs server-side and pairs with the session-based auth in @wrnexus/core, giving you a stateless option for API and mobile clients. Reach for it when you need bearer-token auth rather than cookie sessions.

@@ -192,7 +192,7 @@ app.use(jwtAuth({ secret: process.env.JWT_SECRET! })); app.use(jwtAuth({ secret: process.env.JWT_SECRET!, required: false }));
- + } diff --git a/app/pages/packages/mobile.wrn b/app/pages/packages/mobile.wrn index 56c73267..b5607541 100644 --- a/app/pages/packages/mobile.wrn +++ b/app/pages/packages/mobile.wrn @@ -10,11 +10,11 @@ page wrnexusmobile {
W WRNexusJS - +
-
Native · Package reference

@wrnexus/mobile

SSR-safe compatibility access to Capacitor plugins.

v0.5.13Private registryNative

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/mobile@0.5.13

Request preview access. Never put registry tokens in source control.

SSR-safe access to Capacitor plugins from WRNexusJS browser code.
+
Native · Package reference

@wrnexus/mobile

SSR-safe compatibility access to Capacitor plugins.

v0.6.0Private registryNative

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/mobile@0.6.0

Request preview access. Never put registry tokens in source control.

SSR-safe access to Capacitor plugins from WRNexusJS browser code.

Overview

@wrnexus/mobile keeps optional native imports out of server rendering while giving browser-owned modules one consistent registry for Capacitor plugins. During SSR, mobile.isNative() is false and mobile.platform() is "web".

Install a plugin through the WRNexusJS CLI so the web and native projects stay aligned:

@@ -169,7 +169,7 @@ const network = mobile.plugin<NetworkPlugin>("Network"); const status = network ? await network.getStatus() : { connected: true, connectionType: "unknown" };
- + } diff --git a/app/pages/packages/native.wrn b/app/pages/packages/native.wrn index 1557d5d9..9d616e3a 100644 --- a/app/pages/packages/native.wrn +++ b/app/pages/packages/native.wrn @@ -10,11 +10,11 @@ page wrnexusnative {
W WRNexusJS - +
-
Native · Package reference

@wrnexus/native

Cross-platform browser and Capacitor capability registry.

v0.5.13Private registryNative

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/native@0.5.13

Request preview access. Never put registry tokens in source control.

Cross-platform capabilities for browsers, Capacitor WebViews, and compiled native apps.
+
Native · Package reference

@wrnexus/native

Cross-platform browser and Capacitor capability registry.

v0.6.0Private registryNative

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/native@0.6.0

Request preview access. Never put registry tokens in source control.

Cross-platform capabilities for browsers, Capacitor WebViews, and compiled native apps.

Overview

@wrnexus/native exposes capabilities by name so application code can ask what the current platform supports before presenting an action. Browser capabilities use Web APIs; mobile capabilities use installed Capacitor plugins. platform() returns "server" during SSR, "browser" on the web, and the Capacitor platform in a native WebView.

bun add @wrnexus/native
@@ -152,7 +152,7 @@ const position = await native.run( );
- + } diff --git a/app/pages/packages/oauth.wrn b/app/pages/packages/oauth.wrn index c3f6a512..f669c88d 100644 --- a/app/pages/packages/oauth.wrn +++ b/app/pages/packages/oauth.wrn @@ -10,11 +10,11 @@ page wrnexusoauth {
W WRNexusJS - +
-
Security · Package reference

@wrnexus/oauth

OAuth 2.0, PKCE, provider presets, and profile mapping.

v0.5.13Private registrySecurity

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/oauth@0.5.13

Request preview access. Never put registry tokens in source control.

Dependency-free OAuth 2.0 sign-in for any provider, with PKCE and presets for Google, GitHub, and Discord.
+
Security · Package reference

@wrnexus/oauth

OAuth 2.0, PKCE, provider presets, and profile mapping.

v0.6.0Private registrySecurity

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/oauth@0.6.0

Request preview access. Never put registry tokens in source control.

Dependency-free OAuth 2.0 sign-in for any provider, with PKCE and presets for Google, GitHub, and Discord.

Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

Overview

@wrnexus/oauth implements the OAuth 2.0 Authorization Code flow (with PKCE) for server-side sign-in. It ships ready-made provider presets and a defineProvider helper for custom providers, then gives you two flow functions — startAuth (build the redirect) and completeAuth (exchange the code and fetch the user's profile). It has no runtime dependencies: it uses the platform fetch and WebCrypto only. Pairs naturally with @wrnexus/core's logIn to establish a session once you have a normalized profile.

@@ -313,7 +313,7 @@ const gitlab = defineProvider({ });
- + } diff --git a/app/pages/packages/plugin.wrn b/app/pages/packages/plugin.wrn index afcff848..eeb09812 100644 --- a/app/pages/packages/plugin.wrn +++ b/app/pages/packages/plugin.wrn @@ -10,11 +10,11 @@ page wrnexusplugin {
W WRNexusJS - +
-
Core · Package reference

@wrnexus/plugin

Plugin contracts, lifecycle hooks, composition, and framework integration.

v0.5.13Private registryCore

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/plugin@0.5.13

Request preview access. Never put registry tokens in source control.

Deterministic WRNexusJS plugin contracts for configuration, AST/code transforms, diagnostics, development servers, production builds, and DevToolbar extensions.

+
Core · Package reference

@wrnexus/plugin

Plugin contracts, lifecycle hooks, composition, and framework integration.

v0.6.0Private registryCore

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/plugin@0.6.0

Request preview access. Never put registry tokens in source control.

Deterministic WRNexusJS plugin contracts for configuration, AST/code transforms, diagnostics, development servers, production builds, and DevToolbar extensions.

Use definePlugin() and declare enforce, before, or after when ordering matters. Duplicate names and dependency cycles are rejected.

Complete TypeScript API

Generated from the exact installed package declarations.

export { PageAst, WrnDiagnostic } from '@wrnexus/syntax';
 import { WrnexusPlugin, PluginInput, PluginContext, PluginRunner } from './types.js';
 export { ClientRuntimeDefinition, ClientRuntimeInject, ClientRuntimeLoad, ClientRuntimeType, PackageAssetDefinition, PackageMigrationDefinition, PackagePluginManifest, PackageRouteDefinition, PackageStyleDefinition, PluginCommand, PluginContributions, PluginDevToolbarPanel, PluginOrder, TransformContext, WrnexusPackageManifest } from './types.js';
@@ -39,7 +39,7 @@ export default definePlugin({
 const ordered = resolvePlugins([corePlugin, analyticsPlugin]);
- + } diff --git a/app/pages/packages/pubsub.wrn b/app/pages/packages/pubsub.wrn index 45007d2a..eb9efa11 100644 --- a/app/pages/packages/pubsub.wrn +++ b/app/pages/packages/pubsub.wrn @@ -10,11 +10,11 @@ page wrnexuspubsub {
W WRNexusJS - +
-
Realtime · Package reference

@wrnexus/pubsub

In-process and Redis-backed publish/subscribe.

v0.5.13Private registryRealtime

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/pubsub@0.5.13

Request preview access. Never put registry tokens in source control.

Topic-based publish/subscribe with a pluggable driver — in-process by default, Redis for cross-process messaging.
+
Realtime · Package reference

@wrnexus/pubsub

In-process and Redis-backed publish/subscribe.

v0.6.0Private registryRealtime

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/pubsub@0.6.0

Request preview access. Never put registry tokens in source control.

Topic-based publish/subscribe with a pluggable driver — in-process by default, Redis for cross-process messaging.

Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

Overview

@wrnexus/pubsub is a small server-side pub/sub bus. You publish messages to a topic and subscribe with topic patterns; handlers fire for matching topics. The default driver keeps everything in-process, and you can swap in the Redis driver (@wrnexus/pubsub/redis) to fan messages out across processes or hosts. It also backs @wrnexus/core's realtime bridge for horizontal scaling.

@@ -176,7 +176,7 @@ await bus.publish("order:created", { id: 7 }); driver.close();
- + } diff --git a/app/pages/packages/queue.wrn b/app/pages/packages/queue.wrn index fcb0ae01..89dc2324 100644 --- a/app/pages/packages/queue.wrn +++ b/app/pages/packages/queue.wrn @@ -10,11 +10,11 @@ page wrnexusqueue {
W WRNexusJS - +
-
Data · Package reference

@wrnexus/queue

Background jobs with delay, concurrency, retry, and repetition.

v0.5.13Private registryData

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/queue@0.5.13

Request preview access. Never put registry tokens in source control.

A background job queue with delays, retries + exponential backoff, recurring jobs, and concurrent workers.
+
Data · Package reference

@wrnexus/queue

Background jobs with delay, concurrency, retry, and repetition.

v0.6.0Private registryData

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/queue@0.6.0

Request preview access. Never put registry tokens in source control.

A background job queue with delays, retries + exponential backoff, recurring jobs, and concurrent workers.

Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

Overview

@wrnexus/queue is a server-side in-process job queue. You register named workers, enqueue jobs (optionally delayed or recurring), and let the queue poll and run them on a timer — with per-job retry limits and doubling backoff between attempts. The default store lives in memory; the design allows a pluggable driver to back it with Redis/SQL for durability across restarts. Reach for it when you need to defer work (emails, webhooks, cleanup) off the request path without a heavyweight external broker. Tests can drive it deterministically via drain().

@@ -252,7 +252,7 @@ clock = 5000; const ran = await queue.drain(); // => 1
- + } diff --git a/app/pages/packages/reactive.wrn b/app/pages/packages/reactive.wrn index 3ce33943..86216274 100644 --- a/app/pages/packages/reactive.wrn +++ b/app/pages/packages/reactive.wrn @@ -10,11 +10,11 @@ page wrnexusreactive {
W WRNexusJS - +
-
Frontend · Package reference

@wrnexus/reactive

Small type-safe reactive signal primitives.

v0.5.13Private registryFrontend

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/reactive@0.5.13

Request preview access. Never put registry tokens in source control.

Tiny, type-safe reactive primitives (signals) with zero dependencies.
+
Frontend · Package reference

@wrnexus/reactive

Small type-safe reactive signal primitives.

v0.6.0Private registryFrontend

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/reactive@0.6.0

Request preview access. Never put registry tokens in source control.

Tiny, type-safe reactive primitives (signals) with zero dependencies.

Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

Overview

@wrnexus/reactive is the seed of WRNexusJS's reactivity layer: a minimal signal primitive that holds a value, notifies subscribers when it changes, and hands back an unsubscribe function. It is deliberately small and framework-agnostic — it powers nothing on its own, but is shaped so client islands (and later the .wrn compiler's state blocks) can build reactive bindings on top of it. Reach for it when you need observable state without pulling in a full reactivity library.

@@ -156,7 +156,7 @@ const user: Signal<{ name: string } | null> = signal(null); user.set({ name: "Ada" });
- + } diff --git a/app/pages/packages/router.wrn b/app/pages/packages/router.wrn index 3fc3fc5a..3b039e29 100644 --- a/app/pages/packages/router.wrn +++ b/app/pages/packages/router.wrn @@ -10,11 +10,11 @@ page wrnexusrouter {
W WRNexusJS - +
-
Core · Package reference

@wrnexus/router

Filesystem discovery, route matching, and typed route generation.

v0.5.13Private registryCore

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/router@0.5.13

Request preview access. Never put registry tokens in source control.

File-based router that maps an app/ directory onto route tables and matches request paths against them.
+
Core · Package reference

@wrnexus/router

Filesystem discovery, route matching, and typed route generation.

v0.6.0Private registryCore

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/router@0.6.0

Request preview access. Never put registry tokens in source control.

File-based router that maps an app/ directory onto route tables and matches request paths against them.

Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

Overview

@wrnexus/router scans an application's app/ directory once at startup and builds route tables for pages, API endpoints, realtime channels, middleware, server-rendered .wrn components, layouts, and validation schemas. It also compiles URL patterns (/users/[id]) into RegExps and matches request paths against them. Request input is never turned into a file path, which makes the router immune to path traversal. This is a server-side package used by the WRNexusJS runtime to resolve incoming requests, plus a codegen helper for compile-time typed links.

@@ -236,6 +236,8 @@ interface Router { components: ComponentRef[]; /** Named page layouts (`app/layouts/<name>.wrn`); a page picks one via `layout`. */ layouts: ComponentRef[]; + /** Typed global/page stores discovered under `app/stores/`. */ + stores: ComponentRef[]; /** Validation schemas (`app/schemas/<name>.ts`) shared by API + forms. */ schemas: ComponentRef[]; matchPage(pathname: string): RouteMatch | null; @@ -300,7 +302,7 @@ const routes = sortRoutes([{ raw: "/posts/[slug]", file: " const m = matchRoute(routes, "/posts/hello"); // { route, params: { slug: "hello" } }
- + } diff --git a/app/pages/packages/ssr.wrn b/app/pages/packages/ssr.wrn index 2c53d5f1..9dd5209d 100644 --- a/app/pages/packages/ssr.wrn +++ b/app/pages/packages/ssr.wrn @@ -10,11 +10,11 @@ page wrnexusssr {
W WRNexusJS - +
-
Runtime · Package reference

@wrnexus/ssr

Secure HTML document rendering and SEO metadata.

v0.5.13Private registryRuntime

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/ssr@0.5.13

Request preview access. Never put registry tokens in source control.

Server-side rendering: wraps a page's HTML body in a complete HTML document with a metadata-driven <head>.
+
Runtime · Package reference

@wrnexus/ssr

Secure HTML document rendering and SEO metadata.

v0.6.0Private registryRuntime

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/ssr@0.6.0

Request preview access. Never put registry tokens in source control.

Server-side rendering: wraps a page's HTML body in a complete HTML document with a metadata-driven <head>.

Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

Overview

Pages in WRNexusJS return an HTML string for the body. @wrnexus/ssr takes that body and produces a full HTML document — building the <head> from page metadata and global SEO defaults, resolving canonical/Open Graph/Twitter tags, and injecting module preloads and <script type="module"> tags. It is deliberately server-only: nothing in this package touches the DOM or ships to the browser, keeping server code genuinely server-only. Reach for it on the server when turning a rendered page body into a response document.

@@ -96,6 +96,9 @@ return new Response(html, { headers: { "content-type": "
  • Depends on [@wrnexus/core](../core) for escapeHtml and the PageMeta / SeoConfig types.
  • Bun-only — like the rest of WRNexusJS, this package targets the Bun runtime (Node is not supported).
  • Complete TypeScript API

    Generated from the exact installed package declarations.

    import { PageMeta, SeoConfig } from '@wrnexus/core';
    +export { RpcContext, RpcHandlerOptions, RpcManifestContract, RpcParameterContract, RpcRequestPayload, createRpcHandler } from './rpc.js';
    +export { disposeRequestStores, renderStoreHydration, requestStoreContainer } from './store-context.js';
    +import '@wrnexus/store';
     
     /**
      * @wrnexus/ssr — server-side rendering.
    @@ -136,6 +139,8 @@ interface RenderOptions {
         defaultTitle?: string;
         /** Raw HTML injected at the end of `<head>` (trusted, framework-controlled). */
         extraHead?: string;
    +    /** CSP nonce applied to framework-promoted `.wrn` style blocks. */
    +    styleNonce?: string;
         /** Raw HTML injected at the end of `<body>` (trusted, framework-controlled). */
         extraBody?: string;
         /** Attributes for the `<html>` element, e.g. ` data-theme="dark"` (trusted). */
    @@ -154,6 +159,16 @@ interface RenderOptions {
      * out of its element or attribute.
      */
     declare function renderDocument(opts: RenderOptions): string;
    +interface ExtractedWrnexusStyles {
    +    html: string;
    +    styles: string;
    +}
    +/**
    + * Promote compiler-emitted `.wrn` style blocks out of rendered markup and into
    + * the document head. They are emitted after global stylesheets, deduplicated by
    + * stable id, ordered layout -> page -> component, and nonce-tagged for CSP.
    + */
    +declare function extractWrnexusStyles(html: string, nonce?: string): ExtractedWrnexusStyles;
     interface StreamRenderOptions extends Omit<RenderOptions, "body"> {
         body: string | Promise<string> | AsyncIterable<string>;
     }
    @@ -165,7 +180,7 @@ interface StreamRenderOptions extends Omit<RenderOptions, "body">
     declare function renderDocumentStream(opts: StreamRenderOptions): ReadableStream<Uint8Array>;
     declare function streamDocumentResponse(opts: StreamRenderOptions, init?: ResponseInit): Response;
     
    -export { type RenderOptions, type RenderScript, type ScriptAsset, type StreamRenderOptions, renderDocument, renderDocumentStream, streamDocumentResponse };
    +export { type RenderOptions, type RenderScript, type ScriptAsset, type StreamRenderOptions, extractWrnexusStyles, renderDocument, renderDocumentStream, streamDocumentResponse };
     

    Examples

    Copy-ready examples from the installed package documentation.

    Render an SEO-ready application page

    import { renderDocument } from "@wrnexus/ssr";
     
     const html = renderDocument({
    @@ -198,7 +213,7 @@ return new Response(html, {
     return new Response(html, { headers: { "content-type": "text/html; charset=utf-8" } });
    - + } diff --git a/app/pages/packages/styles.wrn b/app/pages/packages/styles.wrn index b339418a..d73404b9 100644 --- a/app/pages/packages/styles.wrn +++ b/app/pages/packages/styles.wrn @@ -10,11 +10,11 @@ page wrnexusstyles {
    W WRNexusJS - +
    -
    Frontend · Package reference

    @wrnexus/styles

    CSS pipeline, themes, fonts, profiles, and application config.

    v0.5.13Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/styles@0.5.13

    Request preview access. Never put registry tokens in source control.

    Global CSS bundling, the --wire-* design-token theme system, and the wrnexus.config.ts app-config loader for WRNexusJS apps.
    +
    Frontend · Package reference

    @wrnexus/styles

    CSS pipeline, themes, fonts, profiles, and application config.

    v0.6.0Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/styles@0.6.0

    Request preview access. Never put registry tokens in source control.

    Global CSS bundling, the --wire-* design-token theme system, and the wrnexus.config.ts app-config loader for WRNexusJS apps.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    This package owns three server-side concerns that shape every page a WRNexusJS app renders:

    @@ -515,9 +515,46 @@ interface NavigationConfig { */ mode?: "client" | "document"; } +interface ImportsConfig { + mode?: "legacy" | "compatible" | "explicit"; + autoImport?: boolean; + aliases?: Record<string, string>; +} +interface TypesConfig { + strict?: boolean; + noImplicitAny?: boolean; + strictNullChecks?: boolean; + checkTemplates?: boolean; + checkComponentProps?: boolean; + generateDeclarations?: boolean; + globalTypes?: string; +} +interface FunctionsConfig { + legacyDefaultRuntime?: "current" | "client" | "server" | "shared"; +} +interface StoresConfig { + strictMutations?: boolean; + persistence?: boolean; +} +interface CompatibilityConfig { + legacyEmit?: boolean; + legacyEventProps?: boolean; + legacyComponentDiscovery?: boolean; + stringLayouts?: boolean; +} interface AppConfig { /** Compiler/dev/build plugins, resolved in deterministic pre/normal/post order. */ plugins?: PluginInput; + /** WRN v0.6 explicit import and compatibility resolution. */ + imports?: ImportsConfig; + /** TypeScript-backed .wrn type checking and declaration generation. */ + types?: TypesConfig; + /** Legacy function runtime behavior for existing applications. */ + functions?: FunctionsConfig; + /** Typed global/page store behavior. */ + stores?: StoresConfig; + /** Temporary v0.5 syntax compatibility switches. */ + compatibility?: CompatibilityConfig; /** Opt-in APIs that are not yet covered by stable compatibility guarantees. */ experimental?: ExperimentalConfig; /** Route and asset budgets plus build analyzer behavior. */ @@ -768,7 +805,7 @@ const themeJs = renderThemeRuntime(theme); // served at THEME_JS_HREF
    - + } diff --git a/app/pages/packages/syntax.wrn b/app/pages/packages/syntax.wrn index 1a7ad7ef..88a81439 100644 --- a/app/pages/packages/syntax.wrn +++ b/app/pages/packages/syntax.wrn @@ -10,16 +10,16 @@ page wrnexussyntax {
    W WRNexusJS - +
    -
    Frontend · Package reference

    @wrnexus/syntax

    Editor syntax definitions and language tooling for .wrn files.

    v0.5.13Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/syntax@0.5.13

    Request preview access. Never put registry tokens in source control.

    Canonical WRN lexer, parser, AST, language metadata, source positions, and stable diagnostics. Framework tooling should import this package instead of implementing a separate .wrn parser.

    +
    Frontend · Package reference

    @wrnexus/syntax

    Editor syntax definitions and language tooling for .wrn files.

    v0.6.0Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/syntax@0.6.0

    Request preview access. Never put registry tokens in source control.

    Canonical WRN lexer, parser, AST, language metadata, source positions, and stable diagnostics. Framework tooling should import this package instead of implementing a separate .wrn parser.

    See docs/WRN-LANGUAGE-SPEC-1.0.md in the WRNexusJS repository.

    Complete TypeScript API

    Generated from the exact installed package declarations.

    export { LexError, Lexer } from './tokenizer.js';
    -export { ActionBlock, ApiBlock, Attr, ComputedDecl, DataApiBlock, DataMode, EffectBlock, EventDecl, LifecycleBlock, LoadBlock, ModeFunctionsBlock, PageAst, ParseError, PropDecl, RealtimeBlock, RealtimeHandler, SeoBlock, StateDecl, VOID_ELEMENTS, ViewNode, WatchBlock, parse, parseHtmlView } from './parser.js';
    +export { A as ActionBlock, a as ApiBlock, b as Attr, C as ComputedDecl, D as DataApiBlock, c as DataMode, E as EffectBlock, d as EventDecl, F as FunctionParameterDecl, e as FunctionRuntime, L as LifecycleBlock, f as LoadBlock, M as ModeFunctionsBlock, O as OutputDecl, P as PageAst, g as ParseError, h as PersistDecl, i as PropDecl, R as RealtimeBlock, j as RealtimeHandler, k as RuntimeFunctionDecl, S as SeoBlock, l as StateDecl, m as StateRuntime, n as StoreKind, o as StoreLifecycleDecl, p as StructuredImportDecl, V as VOID_ELEMENTS, q as ViewNode, W as WatchBlock, r as parse, s as parseComputedDeclarations, t as parseHtmlView, u as parseOutputs, v as parsePersist, w as parseRuntimeFunctions, x as parseStateDeclarations, y as parseStoreLifecycle, z as parseStructuredImports, B as stripRuntimeFunctionModifiers } from './parser-BGaF5Zdu.js';
     export { RuntimeType, eraseFunctionTypes, inferredRuntimeType, runtimeTypeOf, validateTypedInitializer } from './types.js';
     import { WrnDiagnostic } from './diagnostics.js';
    -export { DiagnoseOptions, WrnDiagnosticSeverity, WrnSourcePosition, assertValidAst, classifyParseError, diagnose, diagnosticFromError, formatDiagnostic, isHydrationStrategy, isRuntimeTarget, positionAt } from './diagnostics.js';
    +export { DiagnoseOptions, WrnDiagnosticSeverity, WrnSourcePosition, assertValidAst, classifyParseError, containsReadonlyPropMutation, diagnose, diagnosticFromError, formatDiagnostic, isHydrationStrategy, isRuntimeTarget, positionAt } from './diagnostics.js';
     export { WRN_DIAGNOSTIC_CODES, WRN_HYDRATION_STRATEGIES, WRN_LANGUAGE_VERSION, WRN_ROOT_KINDS, WRN_ROOT_MEMBERS, WRN_RUNTIME_TARGETS, WrnHydrationStrategy, WrnRootKind, WrnRootMember, WrnRuntimeTarget } from './spec.js';
     
     /** Current stable syntax contract. Bump only when parsers/codegen need migration. */
    @@ -48,7 +48,7 @@ const ast = parse('component Greeting { view { <p>Hello</p>
     const summary = diagnosticSummary(diagnose(source));
    - + } diff --git a/app/pages/packages/test.wrn b/app/pages/packages/test.wrn index 8a5f8eca..6f066707 100644 --- a/app/pages/packages/test.wrn +++ b/app/pages/packages/test.wrn @@ -10,11 +10,11 @@ page wrnexustest {
    W WRNexusJS - +
    -
    Tooling · Package reference

    @wrnexus/test

    WRNexusJS-aware component, route, and browser testing utilities.

    v0.5.13Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/test@0.5.13

    Request preview access. Never put registry tokens in source control.

    Testing utilities for WRNexusJS apps — component rendering, reactive-DOM mounting, route handler calls, and a full in-process app harness, plus a one-import re-export of bun:test.
    +
    Tooling · Package reference

    @wrnexus/test

    WRNexusJS-aware component, route, and browser testing utilities.

    v0.6.0Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/test@0.6.0

    Request preview access. Never put registry tokens in source control.

    Testing utilities for WRNexusJS apps — component rendering, reactive-DOM mounting, route handler calls, and a full in-process app harness, plus a one-import re-export of bun:test.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/test is the server-side test toolkit you reach for when writing tests for a WRNexusJS app. It runs under bun test (invoked via wrnexus test) and gives you a single import surface: the bun:test primitives (test, expect, mock, …) re-exported alongside WRNexusJS-aware helpers that compile .wrn components, hydrate server HTML in a DOM, invoke API route handlers, and boot the real app on an ephemeral port for integration tests.

    @@ -220,7 +220,7 @@ test("health endpoint", async () => { });
    - + } diff --git a/app/pages/packages/tracking.wrn b/app/pages/packages/tracking.wrn index a891f55d..76b22186 100644 --- a/app/pages/packages/tracking.wrn +++ b/app/pages/packages/tracking.wrn @@ -10,11 +10,11 @@ page wrnexustracking {
    W WRNexusJS - +
    -
    Runtime · Package reference

    @wrnexus/tracking

    Error/event capture, middleware, filtering, and sinks.

    v0.5.13Private registryRuntime

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/tracking@0.5.13

    Request preview access. Never put registry tokens in source control.

    Error tracking for WRNexusJS apps: capture exceptions manually or via middleware and fan them out to pluggable sinks.
    +
    Runtime · Package reference

    @wrnexus/tracking

    Error/event capture, middleware, filtering, and sinks.

    v0.6.0Private registryRuntime

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/tracking@0.6.0

    Request preview access. Never put registry tokens in source control.

    Error tracking for WRNexusJS apps: capture exceptions manually or via middleware and fan them out to pluggable sinks.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/tracking is a small, server-side error-capture layer. You create a tracker with one or more sinks, then feed it errors — either manually with tracker.capture(err, context) or automatically by mounting tracker.middleware() in your request pipeline. A consoleSink is included; forwarding to Sentry, Datadog, or any other backend is just a matter of writing a tiny sink. Reach for it when you want a single, sink-agnostic place to route application errors. Sinks run best-effort — a throwing sink never breaks the request.

    @@ -199,7 +199,7 @@ const tracker = createTracker({ tracker.addSink(anotherSink); // add more sinks later
    - + } diff --git a/app/pages/packages/ui.wrn b/app/pages/packages/ui.wrn index f3b94731..bf94c008 100644 --- a/app/pages/packages/ui.wrn +++ b/app/pages/packages/ui.wrn @@ -10,11 +10,11 @@ page wrnexusui {
    W WRNexusJS - +
    -
    Frontend · Package reference

    @wrnexus/ui

    Themeable server-rendered UI components and CSS.

    v0.5.13Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/ui@0.5.13

    Request preview access. Never put registry tokens in source control.

    First-party Wire UI component library — a set of themeable .wrn components plus a single tokenized stylesheet.
    +
    Frontend · Package reference

    @wrnexus/ui

    Themeable server-rendered UI components and CSS.

    v0.6.0Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/ui@0.6.0

    Request preview access. Never put registry tokens in source control.

    First-party Wire UI component library — a set of themeable .wrn components plus a single tokenized stylesheet.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/ui ships a library of server-rendered .wrn components (layout, form controls, and feedback UI) together with one themeable stylesheet, ui.css. The components are auto-discovered by the framework router — you don't import them in code. Once the package's component directory is on the router's scan path, you mount any component in a page with data-component="<name>". Every visual is driven by var(--wire-*) theme tokens, so components restyle instantly when the theme changes. The tiny JS surface (src/index.ts) exists only so the toolchain (CLI build + dev server) can locate the component directory and stylesheet.

    @@ -155,7 +155,7 @@ const router = buildRouter(appDir, { componentDirs: [uiComponentsDir()]  </div>

    Explore the component library

    Browse interactive examples and complete component usage in the dedicated WRNexusJS component showcase.

    Browse all 108 components →

    - + } diff --git a/app/pages/packages/uploader.wrn b/app/pages/packages/uploader.wrn index 580ad0ce..1bedc46a 100644 --- a/app/pages/packages/uploader.wrn +++ b/app/pages/packages/uploader.wrn @@ -10,11 +10,11 @@ page wrnexusuploader {
    W WRNexusJS - +
    -
    Data · Package reference

    @wrnexus/uploader

    Validated local/S3 uploads and secure file serving.

    v0.5.13Private registryData

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/uploader@0.5.13

    Request preview access. Never put registry tokens in source control.

    Config-driven file uploads + serving for WRNexusJS. Declare named storage stores (local disk or any S3-compatible backend) in wrnexus.config.ts, upload with one function call, drop a drag-and-drop widget on a page, and serve files back — public or private. Zero external dependencies (S3 is signed with a built-in AWS SigV4 implementation, like the rest of the framework).

    +
    Data · Package reference

    @wrnexus/uploader

    Validated local/S3 uploads and secure file serving.

    v0.6.0Private registryData

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/uploader@0.6.0

    Request preview access. Never put registry tokens in source control.

    Config-driven file uploads + serving for WRNexusJS. Declare named storage stores (local disk or any S3-compatible backend) in wrnexus.config.ts, upload with one function call, drop a drag-and-drop widget on a page, and serve files back — public or private. Zero external dependencies (S3 is signed with a built-in AWS SigV4 implementation, like the rest of the framework).

    Usage

    Configure local and S3 stores

    // wrnexus.config.ts
    @@ -453,7 +453,7 @@ import { serveFromStore } from "@wrnexus/uploader";
     export const GET = serveFromStore("docs"); // your middleware decides who gets in
    - + } diff --git a/app/pages/packages/validation.wrn b/app/pages/packages/validation.wrn index c7a8a3cc..9488b47c 100644 --- a/app/pages/packages/validation.wrn +++ b/app/pages/packages/validation.wrn @@ -10,11 +10,11 @@ page wrnexusvalidation {
    W WRNexusJS - +
    -
    Security · Package reference

    @wrnexus/validation

    Typed schemas, coercion, validation, and browser descriptors.

    v0.5.13Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/validation@0.5.13

    Request preview access. Never put registry tokens in source control.

    One fluent schema, validated on the server (API bodies, env vars) and mirrored to an eval-free browser validator for forms.
    +
    Security · Package reference

    @wrnexus/validation

    Typed schemas, coercion, validation, and browser descriptors.

    v0.6.0Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/validation@0.6.0

    Request preview access. Never put registry tokens in source control.

    One fluent schema, validated on the server (API bodies, env vars) and mirrored to an eval-free browser validator for forms.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    Define a schema once with the fluent v builder, then reuse it in three places: .parse() runs server-side and returns coerced values plus per-field errors; .describe() emits a plain-JSON SchemaDescriptor that the browser runtime interprets (no eval, no bundled validator); and helpers like parseBody and parseEnv wire schemas straight into API routes and startup config. The server rule logic (applyRule/checkField) and the client runtime (VALIDATE_RUNTIME) mirror each other exactly, so a form validates identically in both places. Schemas are conventionally kept in app/schemas/.

    @@ -384,7 +384,7 @@ const head = `<script>${renderSchemasScript({ signup: signupSche // render a <form data-schema="signup"> with [data-error="email"] etc.
    - + } diff --git a/app/pages/releases/0.6.0.wrn b/app/pages/releases/0.6.0.wrn new file mode 100644 index 00000000..8445fee8 --- /dev/null +++ b/app/pages/releases/0.6.0.wrn @@ -0,0 +1,17 @@ +page Release060 { + seo { + title = "Release 0.6.0" + description = "WRNexusJS 0.6.0 release notes." + canonical = "https://wrnexusjs.dev/releases/0.6.0" + } + view { + +
    +
    W WRNexusJS
    + +

    WRNexusJS 0.6.0

    Released 2026-07-13. All 33 installed packages are aligned to this version. Highlights include the new helpers package, reliable workspace app addition, and browser SSO redirects through forward authentication. See the changelog, upgrade guide, and package references.

    + + +
    + } +} \ No newline at end of file diff --git a/app/pages/roadmap.wrn b/app/pages/roadmap.wrn index 3ff57897..9a2f4d9e 100644 --- a/app/pages/roadmap.wrn +++ b/app/pages/roadmap.wrn @@ -7,10 +7,10 @@ page Roadmap { view {
    -
    W WRNexusJS
    +
    W WRNexusJS

    Roadmap

    Roadmap items are direction, not delivery commitments. Dates require explicit owner approval.

    Now

    • Private preview onboarding and accurate package references
    • Runnable documentation fixtures and link/accessibility checks
    • License, support, and disclosure owner decisions

    Next

    • Durable queue driver guidance
    • Expanded database/auth/realtime examples
    • Versioned release notes and migration fixtures

    Later / exploration

    • Historical documentation selector
    • Maintained reproducible benchmarks
    • Broader mobile/native coverage
    - +
    } diff --git a/app/pages/search.wrn b/app/pages/search.wrn index 97365638..a5a10fca 100644 --- a/app/pages/search.wrn +++ b/app/pages/search.wrn @@ -7,10 +7,10 @@ page Search { view {
    -
    W WRNexusJS
    +
    W WRNexusJS
    -

    Search documentation

    This build-time index is local and sends no query to a third party. Use your browser’s find command to filter this compact index.

    Core documentation

    Get started · Packages · Components · Language · Architecture

    Guides

    Project structure · Routing · Pages and components · Server data · API routes · Middleware · Forms and validation · Authentication · Authorization · Application security · Database · Uploads · Realtime · Pub/sub · Queues · Testing · Workspaces and gateway · Deployment · Configuration and profiles · Internationalization and themes · Mobile · Observability · Upgrading · Troubleshooting

    Package APIs

    @wrnexus/ai · @wrnexus/authz · @wrnexus/compiler · @wrnexus/core · @wrnexus/csr · @wrnexus/db · @wrnexus/dev-server · @wrnexus/encryption · @wrnexus/helpers · @wrnexus/i18n · @wrnexus/jwt · @wrnexus/mobile · @wrnexus/native · @wrnexus/oauth · @wrnexus/pubsub · @wrnexus/queue · @wrnexus/reactive · @wrnexus/router · @wrnexus/ssr · @wrnexus/styles · @wrnexus/test · @wrnexus/tracking · @wrnexus/ui · @wrnexus/uploader · @wrnexus/validation · @wrnexus/dev-toolbar · @wrnexus/syntax · @wrnexus/plugin · @wrnexus/captcha · @wrnexus/auth · @wrnexus/cli

    - +

    Search documentation

    This build-time index is local and sends no query to a third party. Use your browser’s find command to filter this compact index.

    Core documentation

    Get started · Packages · Components · Language · Architecture

    Guides

    Project structure · Routing · Pages and components · Server data · API routes · Middleware · Forms and validation · Authentication · Authorization · Application security · Database · Uploads · Realtime · Pub/sub · Queues · Testing · Workspaces and gateway · Deployment · Configuration and profiles · Internationalization and themes · Mobile · Observability · Upgrading · Troubleshooting

    Package APIs

    @wrnexus/ai · @wrnexus/authz · @wrnexus/compiler · @wrnexus/core · @wrnexus/csr · @wrnexus/db · @wrnexus/dev-server · @wrnexus/encryption · @wrnexus/helpers · @wrnexus/i18n · @wrnexus/jwt · @wrnexus/mobile · @wrnexus/native · @wrnexus/oauth · @wrnexus/pubsub · @wrnexus/queue · @wrnexus/reactive · @wrnexus/router · @wrnexus/ssr · @wrnexus/styles · @wrnexus/test · @wrnexus/tracking · @wrnexus/ui · @wrnexus/uploader · @wrnexus/validation · @wrnexus/dev-toolbar · @wrnexus/syntax · @wrnexus/plugin · @wrnexus/captcha · @wrnexus/auth · @wrnexus/store · @wrnexus/typecheck · @wrnexus/cli

    +
    } diff --git a/app/pages/security.wrn b/app/pages/security.wrn index 9dadba09..5bd19fc8 100644 --- a/app/pages/security.wrn +++ b/app/pages/security.wrn @@ -7,10 +7,10 @@ page Security { view {
    -
    W WRNexusJS
    +
    W WRNexusJS
    -

    Security

    WRNexusJS provides primitives for CSP, CSRF, Trusted Types, sessions, validation, authorization, encryption, upload restrictions, request limits, and WebSocket-origin checks. Applications remain responsible for correct configuration, business authorization, secrets, dependencies, data protection, and operations.

    Supported releases

    Only the current private-preview release 0.5.13 is documented here. A formal old-release support window is not yet published.

    Report a vulnerability

    Use WorkRoot’s approved private contact path at workroot.in. Do not publish exploit details or secrets. Include affected version, impact, reproduction, and a safe contact method. Response targets, encryption key, bounty, audit, and certification are not currently claimed.

    Deployment controls

    Use restrictive CSP and permissions policies, HSTS only on HTTPS production origins, MIME sniffing protection, restrictive referrers, explicit CORS, secure cookies, CSRF validation, request limits, and origin checks. See application security.

    - +

    Security

    WRNexusJS provides primitives for CSP, CSRF, Trusted Types, sessions, validation, authorization, encryption, upload restrictions, request limits, and WebSocket-origin checks. Applications remain responsible for correct configuration, business authorization, secrets, dependencies, data protection, and operations.

    Supported releases

    Only the current private-preview release 0.6.0 is documented here. A formal old-release support window is not yet published.

    Report a vulnerability

    Use WorkRoot’s approved private contact path at workroot.in. Do not publish exploit details or secrets. Include affected version, impact, reproduction, and a safe contact method. Response targets, encryption key, bounty, audit, and certification are not currently claimed.

    Deployment controls

    Use restrictive CSP and permissions policies, HSTS only on HTTPS production origins, MIME sniffing protection, restrictive referrers, explicit CORS, secure cookies, CSRF validation, request limits, and origin checks. See application security.

    +
    } diff --git a/app/pages/showcase.wrn b/app/pages/showcase.wrn index 139b602e..c0c186a2 100644 --- a/app/pages/showcase.wrn +++ b/app/pages/showcase.wrn @@ -7,10 +7,10 @@ page Showcase { view {
    -
    W WRNexusJS
    +
    W WRNexusJS
    -

    Showcase

    Only confirmed public properties are listed; no customer or traffic claims are made.

    WorkRoot

    Creator/company site demonstrating a public WRNexusJS deployment. Exact deployed version and infrastructure notes await owner confirmation.

    WRNexusJS docs

    This documentation portal, built and verified against WRNexusJS 0.5.13 on Bun.

    Screenshots are intentionally deferred until approved assets and alt text are available.

    - +

    Showcase

    Only confirmed public properties are listed; no customer or traffic claims are made.

    WorkRoot

    Creator/company site demonstrating a public WRNexusJS deployment. Exact deployed version and infrastructure notes await owner confirmation.

    WRNexusJS docs

    This documentation portal, built and verified against WRNexusJS 0.6.0 on Bun.

    Screenshots are intentionally deferred until approved assets and alt text are available.

    +
    } diff --git a/app/pages/support.wrn b/app/pages/support.wrn index de35e1db..1f04e419 100644 --- a/app/pages/support.wrn +++ b/app/pages/support.wrn @@ -7,10 +7,10 @@ page Support { view {
    -
    W WRNexusJS
    +
    W WRNexusJS

    Support

    WRNexusJS has no public Discord, public issue tracker, or guaranteed community support channel listed by this repository. Preview access and support begin through WorkRoot’s public contact path.

    Include WRNexusJS version, Bun version, OS, a minimal reproduction, expected and actual behavior, and sanitized logs. Never include registry tokens, credentials, session cookies, or private data.

    Support scope, service levels, and commercial terms require owner confirmation.

    - +
    } diff --git a/app/pages/tutorial.wrn b/app/pages/tutorial.wrn index 1116c2d0..3a4ad255 100644 --- a/app/pages/tutorial.wrn +++ b/app/pages/tutorial.wrn @@ -7,9 +7,9 @@ page Tutorial { view {
    -
    W WRNexusJS
    +
    W WRNexusJS
    -
    Preview · runnable-project extraction pending

    Secure task board

    This tutorial connects the installed 0.5.13 APIs into one design. Snippets are limited to declarations and README patterns verified in the installed packages; a CI-compiled standalone fixture remains on the roadmap.

    Application shape

    A .wrn page renders tasks from an SSR API binding. A shared validation schema protects mutations. Session middleware identifies users, authorization policies gate updates, and a realtime room broadcasts changes.

    Schema and create route

    import { v, parseBody } from "@wrnexus/validation";
    +      
    Preview · runnable-project extraction pending

    Secure task board

    This tutorial connects the installed 0.6.0 APIs into one design. Snippets are limited to declarations and README patterns verified in the installed packages; a CI-compiled standalone fixture remains on the roadmap.

    Application shape

    A .wrn page renders tasks from an SSR API binding. A shared validation schema protects mutations. Session middleware identifies users, authorization policies gate updates, and a realtime room broadcasts changes.

    Schema and create route

    import { v, parseBody } from "@wrnexus/validation";
     const task = v.object({ title: v.string().trim().min(3).max(120) });
     export const POST = async (ctx) => {
       const parsed = await parseBody(task, ctx.req);
    @@ -23,7 +23,7 @@ export const POST = async (ctx) => {
         </ul></main>
       }
     }

    Production checklist

    • Choose SQLite for local development or configure the supported PostgreSQL driver.
    • Run migrations before accepting traffic.
    • Enable session authentication and enforce authorization on every mutation.
    • Validate upload types and sizes; keep private objects behind authenticated routes.
    • Use Redis pub/sub when realtime rooms span processes.
    • Treat the default queue as non-durable until a production driver is selected.

    Follow the focused database, authentication, authorization, realtime, and upload guides.

    - +
    } diff --git a/app/types/global.d.ts b/app/types/global.d.ts new file mode 100644 index 00000000..03c49cc0 --- /dev/null +++ b/app/types/global.d.ts @@ -0,0 +1,2 @@ +// Application-wide ambient WRNexusJS types. +export {}; diff --git a/bun.lock b/bun.lock index 7a2b93be..2bc73692 100644 --- a/bun.lock +++ b/bun.lock @@ -7,43 +7,45 @@ "dependencies": { "@iconify-json/lucide": "^1.2.118", "@iconify/tailwind4": "^1.2.3", - "@wrnexus/ai": "^0.5.13", - "@wrnexus/auth": "^0.5.13", - "@wrnexus/authz": "^0.5.13", - "@wrnexus/captcha": "^0.5.13", - "@wrnexus/compiler": "^0.5.13", - "@wrnexus/core": "^0.5.13", - "@wrnexus/csr": "^0.5.13", - "@wrnexus/db": "^0.5.13", - "@wrnexus/dev-server": "^0.5.13", - "@wrnexus/dev-toolbar": "^0.5.13", - "@wrnexus/encryption": "^0.5.13", - "@wrnexus/helpers": "^0.5.13", - "@wrnexus/i18n": "^0.5.13", - "@wrnexus/jwt": "^0.5.13", - "@wrnexus/mobile": "^0.5.13", - "@wrnexus/native": "^0.5.13", - "@wrnexus/oauth": "^0.5.13", - "@wrnexus/plugin": "^0.5.13", - "@wrnexus/pubsub": "^0.5.13", - "@wrnexus/queue": "^0.5.13", - "@wrnexus/reactive": "^0.5.13", - "@wrnexus/router": "^0.5.13", - "@wrnexus/ssr": "^0.5.13", - "@wrnexus/styles": "^0.5.13", - "@wrnexus/syntax": "^0.5.13", - "@wrnexus/test": "^0.5.13", - "@wrnexus/tracking": "^0.5.13", - "@wrnexus/ui": "^0.5.13", - "@wrnexus/uploader": "^0.5.13", - "@wrnexus/validation": "^0.5.13", + "@wrnexus/ai": "^0.6.0", + "@wrnexus/auth": "^0.6.0", + "@wrnexus/authz": "^0.6.0", + "@wrnexus/captcha": "^0.6.0", + "@wrnexus/compiler": "^0.6.0", + "@wrnexus/core": "^0.6.0", + "@wrnexus/csr": "^0.6.0", + "@wrnexus/db": "^0.6.0", + "@wrnexus/dev-server": "^0.6.0", + "@wrnexus/dev-toolbar": "^0.6.0", + "@wrnexus/encryption": "^0.6.0", + "@wrnexus/helpers": "^0.6.0", + "@wrnexus/i18n": "^0.6.0", + "@wrnexus/jwt": "^0.6.0", + "@wrnexus/mobile": "^0.6.0", + "@wrnexus/native": "^0.6.0", + "@wrnexus/oauth": "^0.6.0", + "@wrnexus/plugin": "^0.6.0", + "@wrnexus/pubsub": "^0.6.0", + "@wrnexus/queue": "^0.6.0", + "@wrnexus/reactive": "^0.6.0", + "@wrnexus/router": "^0.6.0", + "@wrnexus/ssr": "^0.6.0", + "@wrnexus/store": "^0.6.0", + "@wrnexus/styles": "^0.6.0", + "@wrnexus/syntax": "^0.6.0", + "@wrnexus/test": "^0.6.0", + "@wrnexus/tracking": "^0.6.0", + "@wrnexus/typecheck": "^0.6.0", + "@wrnexus/ui": "^0.6.0", + "@wrnexus/uploader": "^0.6.0", + "@wrnexus/validation": "^0.6.0", }, "devDependencies": { "@eslint/js": "^9.0.0", "@tailwindcss/cli": "^4.0.0", "@types/bun": "latest", "@types/node": "^26.1.1", - "@wrnexus/cli": "^0.5.13", + "@wrnexus/cli": "^0.6.0", "eslint": "^9.0.0", "prettier": "latest", "tailwindcss": "^4.0.0", @@ -191,67 +193,71 @@ "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.63.0", "", { "dependencies": { "@typescript-eslint/types": "8.63.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-UexrHGnGTpbuQHct2ExOc2ZcFbGUS9FOesCxxqdBGcpI1BxYu/LZ6U8Aq6/72XtF/qRBk9nhuGHFJIXXMhPMdw=="], - "@wrnexus/ai": ["@wrnexus/ai@0.5.13", "", {}, "sha512-rPn2m4dReg3iLEr4wn95DZjFPxSWZLSQ+JxHp9jo+0gOY13Z/5dVVI1pl1bDhmrcrs/Fwj1DQcTSkfJeOCt4lw=="], + "@wrnexus/ai": ["@wrnexus/ai@0.6.0", "", {}, "sha512-Hj76672ZHnG03MV58gcrulWii8hxbfAVlR7T/2INnGxKRIOKHJa+pVZoAl7TVOPXRFPqVwgrkATa+vK6/dhg8g=="], - "@wrnexus/auth": ["@wrnexus/auth@0.5.13", "", { "dependencies": { "@wrnexus/authz": "^0.5.4", "@wrnexus/captcha": "^0.5.9", "@wrnexus/core": "^0.5.4", "@wrnexus/db": "^0.5.7", "@wrnexus/encryption": "^0.5.4", "@wrnexus/jwt": "^0.5.4", "@wrnexus/oauth": "^0.5.4", "@wrnexus/plugin": "^0.5.4", "@wrnexus/queue": "^0.5.4", "@wrnexus/ui": "^0.5.10", "@wrnexus/validation": "^0.5.5" } }, "sha512-ZEwz+Bpj/lJYHRNwgPexSxLrMDU6pbLJlaFpf8oiV838fspkfXvpyK93t1/z5iix2k/vqgbyL9KIQU+W6t/pIA=="], + "@wrnexus/auth": ["@wrnexus/auth@0.6.0", "", { "dependencies": { "@wrnexus/authz": "^0.6.0", "@wrnexus/captcha": "^0.6.0", "@wrnexus/core": "^0.6.0", "@wrnexus/db": "^0.6.0", "@wrnexus/encryption": "^0.6.0", "@wrnexus/jwt": "^0.6.0", "@wrnexus/oauth": "^0.6.0", "@wrnexus/plugin": "^0.6.0", "@wrnexus/queue": "^0.6.0", "@wrnexus/ui": "^0.6.0", "@wrnexus/validation": "^0.6.0" } }, "sha512-pqka4koIRZoy2Wn5CK4wETSI4nVuFCiAyI7nS4Qs4Wt2pPdJVGF8CDCKuTLOqwwufs4s5Bm5+L8QuB9txdAO0Q=="], - "@wrnexus/authz": ["@wrnexus/authz@0.5.13", "", {}, "sha512-OG+8hsTrNc3yXfQg9s4B1TApxSsvHQeNKoqMf/02rb3fR5KJU5KCYpZ4AHjkuWDScI6Gs1Y6lZVb88mzagmzHQ=="], + "@wrnexus/authz": ["@wrnexus/authz@0.6.0", "", {}, "sha512-9y5CwL62mLwKzopt9Wl0z/yi895HDL1H7QadcYK4zVFymAo8qlaM/kpgnG+K+yE5qGLam6rC97d60KPhqDb4bA=="], - "@wrnexus/captcha": ["@wrnexus/captcha@0.5.13", "", { "dependencies": { "@wrnexus/core": "^0.5.13", "@wrnexus/plugin": "^0.5.13", "@wrnexus/validation": "^0.5.13" } }, "sha512-mG163tf9oZ+qRN9/5idZpSg6SCimRr0KKMtXNzAJaA7pbdi+Y81cZq0stnM7VDe+3cHEy6Z1xc1cyGupI67eLQ=="], + "@wrnexus/captcha": ["@wrnexus/captcha@0.6.0", "", { "dependencies": { "@wrnexus/core": "^0.6.0", "@wrnexus/plugin": "^0.6.0", "@wrnexus/validation": "^0.6.0" } }, "sha512-r0V2rhWXkK/3RtVl4toMUQFfYDdUDS49rSkrxWBOvnUCRMs2qsFvSYPt1odC1fZ9kQkVcmNYuUPBh8YapjGixg=="], - "@wrnexus/cli": ["@wrnexus/cli@0.5.13", "", { "dependencies": { "@wrnexus/compiler": "^0.5.13", "@wrnexus/core": "^0.5.13", "@wrnexus/csr": "^0.5.13", "@wrnexus/db": "^0.5.13", "@wrnexus/dev-server": "^0.5.13", "@wrnexus/i18n": "^0.5.13", "@wrnexus/plugin": "^0.5.13", "@wrnexus/router": "^0.5.13", "@wrnexus/styles": "^0.5.13", "@wrnexus/syntax": "^0.5.13", "@wrnexus/ui": "^0.5.13", "@wrnexus/validation": "^0.5.13" }, "bin": { "wrnexus": "dist/index.js" } }, "sha512-Wkkdc7OuQ/jFc6VRn7OTb9Wjs17845qa7dPJewGrpib4+oWul7TurI6od18vIVC4zDmb8AHDbhm3Cs7gpmJjyw=="], + "@wrnexus/cli": ["@wrnexus/cli@0.6.0", "", { "dependencies": { "@wrnexus/compiler": "^0.6.0", "@wrnexus/core": "^0.6.0", "@wrnexus/csr": "^0.6.0", "@wrnexus/db": "^0.6.0", "@wrnexus/dev-server": "^0.6.0", "@wrnexus/i18n": "^0.6.0", "@wrnexus/plugin": "^0.6.0", "@wrnexus/router": "^0.6.0", "@wrnexus/styles": "^0.6.0", "@wrnexus/syntax": "^0.6.0", "@wrnexus/ui": "^0.6.0", "@wrnexus/validation": "^0.6.0" }, "bin": { "wrnexus": "dist/index.js" } }, "sha512-i8MtPLLCQL0cACd907UL1ljeDCNU8U6HKcnUzz52P2eIAZ8k+LlI3M32TX7obivLv15i4MH8fXXldzL1f8eb8A=="], - "@wrnexus/compiler": ["@wrnexus/compiler@0.5.13", "", { "dependencies": { "@wrnexus/syntax": "^0.5.13" } }, "sha512-M1Sxwuz8VKQRJxdpJPk8mzlaWy0x/SLhzBi8ZiDQrDBP5/JDXao/ybpV7MCHnhGvWTl/VhB/Vqdn5x0oHLWzdg=="], + "@wrnexus/compiler": ["@wrnexus/compiler@0.6.0", "", { "dependencies": { "@wrnexus/store": "^0.6.0", "@wrnexus/syntax": "^0.6.0" } }, "sha512-AYKebrDqGcn3nqJWSpoOEio3EYppT3kLQTO6J6BRy+WyChxX1MuN16XjZAJaLFGybf22zw8WfCuaXLjpS/HpGg=="], - "@wrnexus/core": ["@wrnexus/core@0.5.13", "", {}, "sha512-k0kx6HVNikzl5K5dCpkIFFD8W5vaPahzWruTVv45UhfC3WyMN45Mlm34S/lJh2vBFk6Pe/5M5Jvsd7rxSbRKCw=="], + "@wrnexus/core": ["@wrnexus/core@0.6.0", "", {}, "sha512-X2UJhmAeXoyvpSGQ/2zPOzgFPwr+bMYeOjf/KV8f+ULf02pM8zvyQNV3Fft4GaUl7LwZG8gD5b1XwUIFWS500Q=="], - "@wrnexus/csr": ["@wrnexus/csr@0.5.13", "", { "dependencies": { "@wrnexus/core": "^0.5.13" } }, "sha512-k+WoFDBnlHwU9yRX/k6W2jrQfoHVXUxiSo4l2v1KMz+Xszj+meHLwc14MoXLR1+FQb3+guwKygwQAzBKkBaKgA=="], + "@wrnexus/csr": ["@wrnexus/csr@0.6.0", "", { "dependencies": { "@wrnexus/core": "^0.6.0" } }, "sha512-6ll6D4HmoCdNkWB+bpWgKmFkrFlaANDSWZAXv/g3oTOvq+FKUza47WqEXhR29NFKqJO9mTYW684KA3uZAOe6bg=="], - "@wrnexus/db": ["@wrnexus/db@0.5.13", "", {}, "sha512-bd+jhkv8oZy4FVfhCP8Iv8r1IFwN99G53gkYRmyix3BNzQMrcrREJsYvmt5S2EsHLwkpR/ExfN/xrytav2bQVA=="], + "@wrnexus/db": ["@wrnexus/db@0.6.0", "", {}, "sha512-Sgn9QJ8kIuoD0MktuqH89xlWAxlaV6qb+SDzaZ9MpOjMc4cAZpD5MWHMJKmWZgqyiLRCqJLHz4HKfEsstGdM4Q=="], - "@wrnexus/dev-server": ["@wrnexus/dev-server@0.5.13", "", { "dependencies": { "@wrnexus/compiler": "^0.5.13", "@wrnexus/core": "^0.5.13", "@wrnexus/csr": "^0.5.13", "@wrnexus/db": "^0.5.13", "@wrnexus/dev-toolbar": "^0.5.13", "@wrnexus/i18n": "^0.5.13", "@wrnexus/plugin": "^0.5.13", "@wrnexus/pubsub": "^0.5.13", "@wrnexus/router": "^0.5.13", "@wrnexus/ssr": "^0.5.13", "@wrnexus/styles": "^0.5.13", "@wrnexus/ui": "^0.5.13", "@wrnexus/uploader": "^0.5.13", "@wrnexus/validation": "^0.5.13" } }, "sha512-2EtNXqFRXiWio8IbFA3NOyS/oFb1cb0f6KnlKJmkiyZ8djItWMj044Di2C5E9xJ6L+394tsai3fSPtUlPAlt9w=="], + "@wrnexus/dev-server": ["@wrnexus/dev-server@0.6.0", "", { "dependencies": { "@wrnexus/compiler": "^0.6.0", "@wrnexus/core": "^0.6.0", "@wrnexus/csr": "^0.6.0", "@wrnexus/db": "^0.6.0", "@wrnexus/dev-toolbar": "^0.6.0", "@wrnexus/i18n": "^0.6.0", "@wrnexus/plugin": "^0.6.0", "@wrnexus/pubsub": "^0.6.0", "@wrnexus/router": "^0.6.0", "@wrnexus/ssr": "^0.6.0", "@wrnexus/store": "^0.6.0", "@wrnexus/styles": "^0.6.0", "@wrnexus/ui": "^0.6.0", "@wrnexus/uploader": "^0.6.0", "@wrnexus/validation": "^0.6.0" } }, "sha512-2DuKrJjE8WfHlBiDwBCpCTJhBGSRTttebatLpmvYtO6LB560VoPJVdsNucJ/p6jGK6F8Kg1sbSyLlupaw9mx2w=="], - "@wrnexus/dev-toolbar": ["@wrnexus/dev-toolbar@0.5.13", "", {}, "sha512-8m2SVGTClMXXsyS6e2F4elK7KBcvV9KvFcSL6K71IC6zkGivwBO0ZnrAg5p6CSclagINub+O5xAKaaU7Cuug1Q=="], + "@wrnexus/dev-toolbar": ["@wrnexus/dev-toolbar@0.6.0", "", {}, "sha512-LY0Hq7liLXrspOM+GgHuwQY2pmEqG1EjMaz4u0iVUMNt7JjuJxzzz1b3DlotJbMdvsEy8GKDosPW92WbT96QNQ=="], - "@wrnexus/encryption": ["@wrnexus/encryption@0.5.13", "", {}, "sha512-JSWGfsUJhjpsikXdI+VbKwaGBMiMiKIr74I8BXwBZKOfQ0iQXCnNu5ATUXaQbCKlo2Itts3sNe717ZL4emjgPw=="], + "@wrnexus/encryption": ["@wrnexus/encryption@0.6.0", "", {}, "sha512-kJHiwUVD1qCFGZos7yWGvIkvg9ayk3o6BP2K8z/8wa2WkWt+f59DA0M66fDWffa08pP6/rlghbpDSTjGl2zZ9Q=="], - "@wrnexus/helpers": ["@wrnexus/helpers@0.5.13", "", { "dependencies": { "@wrnexus/core": "^0.5.13" } }, "sha512-truqSiX11SjJlbDazc8KcikRhg/uqiSoJdVLOyta0EbNMfTWz6NQiw60oFPYkzRv5KysrR4ZuEjueDIlzIpoFQ=="], + "@wrnexus/helpers": ["@wrnexus/helpers@0.6.0", "", { "dependencies": { "@wrnexus/core": "^0.6.0" } }, "sha512-qQ1k2pd3TIr4Hb7YgN4On0YpmNjXAQ95YghvANmXcJLziqeSZYeOqJ6l6vLqTbVwyskyvbRd7FfhJkPWWfpb4A=="], - "@wrnexus/i18n": ["@wrnexus/i18n@0.5.13", "", { "dependencies": { "@wrnexus/core": "^0.5.13" } }, "sha512-7otRWDv+7j1TYAW+uqV6KZA4uX86bOL1//1mvoFfAtUMvvPRmpTvlQP3hl2KD9qVvK1Cvcz9veRnmKYMiFO+lg=="], + "@wrnexus/i18n": ["@wrnexus/i18n@0.6.0", "", { "dependencies": { "@wrnexus/core": "^0.6.0" } }, "sha512-LkTI1XyPKB2Yzuo/lWtlyADihLH+gDJ/t/K3628vh7p2S6RHV7K6ng/uNRtmMch2cOGl+rqzA+mOT3xe8Mk7Xg=="], - "@wrnexus/jwt": ["@wrnexus/jwt@0.5.13", "", {}, "sha512-uwsgWoxWyr8N66jUzJ25k0o5oe0vR4HzX0O60jKKsvoldFQm614RVqv5Fzk4a7bXXF/avJsvt6N6e+RaIyIaqQ=="], + "@wrnexus/jwt": ["@wrnexus/jwt@0.6.0", "", {}, "sha512-Gy9cZufdeWfRaQLQ7JkPuQvKp4Qqn5vLM1NwU3fmPwUDo0hW0zGbPcu14aoZWlhvqC3B5iXI8kFayCQ4Y0C0nA=="], - "@wrnexus/mobile": ["@wrnexus/mobile@0.5.13", "", { "dependencies": { "@wrnexus/native": "^0.5.13" } }, "sha512-aD3oSNA/6TvqM1raMGeIyvGAJ/1sFCTJIbLpc+y5C7Hafskk96jqZrSB7HRo2GiUpdhCo+nnF+zfFu+6e8iNoQ=="], + "@wrnexus/mobile": ["@wrnexus/mobile@0.6.0", "", { "dependencies": { "@wrnexus/native": "^0.6.0" } }, "sha512-AihigbRXqRdWX/Yrzwc9NVjI2HuZkQa3XMUcMGfOKC0paWoeSvSDMksamHjARvYhTYgKpcJ0FCTDeiMvdcV35w=="], - "@wrnexus/native": ["@wrnexus/native@0.5.13", "", {}, "sha512-uD9FbI226QAogTCp/rU+qxNU/uvVLASzguGoWMnbQ1ZoL35BxY5UX5x3/ElamHhv3ilIsbRMWwBCu263OiIgXw=="], + "@wrnexus/native": ["@wrnexus/native@0.6.0", "", {}, "sha512-HV8KCTC3ufLJqk+oafJ3+PdnEm5Uui2ncBeAyFfYOX4ysZnyi7vJzlfPgBTwJu9phJ7yn9yPXaTxIUVUjWcyMw=="], - "@wrnexus/oauth": ["@wrnexus/oauth@0.5.13", "", {}, "sha512-lzlckro/cz80D3dsGsN/oxxLZoX7jGkTHVED5zjvrRqwYJ9EMJwm59AX1M9hsgz7qYkD/l+hlUTsmMYrgpREoA=="], + "@wrnexus/oauth": ["@wrnexus/oauth@0.6.0", "", {}, "sha512-Nd7ktLa0HX0wX+Q2W+gCQWcSC7eKuZjb2VwIb88cs+OfHm1Vl8vCkk683ZwRIp29DF1kQfCWvKwaYI7FAvJxeQ=="], - "@wrnexus/plugin": ["@wrnexus/plugin@0.5.13", "", { "dependencies": { "@wrnexus/syntax": "^0.5.13" } }, "sha512-ZqiTXwlvYUig5Vd261bMIvYHNP1b83ebqXCWf4dwljP+yjWzpT1XZFT+4tT7KIBHPtJmEjIiUDoj/NrTl2iqfg=="], + "@wrnexus/plugin": ["@wrnexus/plugin@0.6.0", "", { "dependencies": { "@wrnexus/syntax": "^0.6.0" } }, "sha512-rl+HmN9jXzDONRZDiZ/Ny4iMxDp0HpSXkvBXJNLC3H97FEO4vAfD5yso3FxShkvEjUwiUVIPgF5uaCdqOSAxZg=="], - "@wrnexus/pubsub": ["@wrnexus/pubsub@0.5.13", "", {}, "sha512-SOWg8UkEVtPZKPxxQzXrydvX2TAQOHMaPXs/zvpz0/LHUOmRSfWJ7J+xVeQWkFyucY60jy0jYeRMkYj7+HH5mw=="], + "@wrnexus/pubsub": ["@wrnexus/pubsub@0.6.0", "", {}, "sha512-wu2DyioqoIb2C8KJSiV59schm+dZRwYPT9atLYBIcSYnbp8tbNpU1ybtOWrBbAlmDsS0GY2NnR9NH0dgORMoXg=="], - "@wrnexus/queue": ["@wrnexus/queue@0.5.13", "", {}, "sha512-yCHPii5RmM8h7vZaSK2yzlWfZQa72J08HItr+92RryEW+boNYmMB2lqzdtE184A526t//vN8X0sCZtmujImBoQ=="], + "@wrnexus/queue": ["@wrnexus/queue@0.6.0", "", {}, "sha512-vwSOnzT4Et6rMidd4AvPm1//Jfnq22ddWL/yhVe/ishhxEK3rNfQfIxHVehUDozHLT+hEua7NwO0wP3YTD2+jA=="], - "@wrnexus/reactive": ["@wrnexus/reactive@0.5.13", "", {}, "sha512-dkPRFkxTUDPaa0cC8epeziWZBpvUDDoOjT53SecixK3lVdEyzzXqqrXHsQgiIvcVFMu6rFiJJLmCz0llX7TTcg=="], + "@wrnexus/reactive": ["@wrnexus/reactive@0.6.0", "", {}, "sha512-lw0TTu69xXxNcCr5KB7KXYf4gBrSmR0PICANj47+jxnn6rhaWmKWJBvYiXNmHHe+zVf9GSwjT+qIi2bbgv71Rw=="], - "@wrnexus/router": ["@wrnexus/router@0.5.13", "", { "dependencies": { "@wrnexus/compiler": "^0.5.13", "@wrnexus/core": "^0.5.13" } }, "sha512-vk47k3aKOsGx5eHl3p3XGX868i44m6qYblq9vGrJuEAWNQCHa8OzfKWpJYuAeEF7zNHyRymAFbNzK+LEG5p3ag=="], + "@wrnexus/router": ["@wrnexus/router@0.6.0", "", { "dependencies": { "@wrnexus/compiler": "^0.6.0", "@wrnexus/core": "^0.6.0" } }, "sha512-KzB4g0lHVT/WfmcIB0vhYDxRr5BDV4LIoMSzIzRlUWlFDSw6yVqoQEyUJ6DMhGGiah0ieoxsbjAsfnirlSlgfA=="], - "@wrnexus/ssr": ["@wrnexus/ssr@0.5.13", "", { "dependencies": { "@wrnexus/core": "^0.5.13" } }, "sha512-GBjeYchP+xL8RAZDNyAgP7BUA/+r/BI6S+AuSDGBvgnGFhhB8pEoulmgdZsM64m55BTeE+7kc6LQuzK83msHjQ=="], + "@wrnexus/ssr": ["@wrnexus/ssr@0.6.0", "", { "dependencies": { "@wrnexus/core": "^0.6.0", "@wrnexus/store": "^0.6.0" } }, "sha512-IQn1G9HkiB52A1BHlOFXJCtPDn3WmoQxUfqWdkTcE+FZ5CdyCfrYvBIS2YrtAnqixZ0liHxyH04OnAO/8hcmiQ=="], - "@wrnexus/styles": ["@wrnexus/styles@0.5.13", "", { "dependencies": { "@wrnexus/core": "^0.5.13", "@wrnexus/plugin": "^0.5.13", "@wrnexus/uploader": "^0.5.13" } }, "sha512-V1rEbIoUtMUmOXC986VPcdyl87knogP7Mo3i8hTEddvD/uhpgq+6twicp8idNMaqKu47W2yqL7MitDUYKHDblg=="], + "@wrnexus/store": ["@wrnexus/store@0.6.0", "", {}, "sha512-q2u1mSYNwn8k1kFFLEgL8nm9mXljug28O+1aavGWSOME3uYTeiJUv3XgL+zUqhXK+XED12FwmzXG3SPATfjg9A=="], - "@wrnexus/syntax": ["@wrnexus/syntax@0.5.13", "", {}, "sha512-u9GI7SBq0pd0pvqbOF0BqNYYkYW6FKy+oE6n6DkynoLfKKc3wOkMDMVXxKNieRPPDZVgyR87S0eg8CZn/TmhlA=="], + "@wrnexus/styles": ["@wrnexus/styles@0.6.0", "", { "dependencies": { "@wrnexus/core": "^0.6.0", "@wrnexus/plugin": "^0.6.0", "@wrnexus/uploader": "^0.6.0" } }, "sha512-mNHxCT+/SHOtvStSbiOzj3A2+EHbLGAzbAXQM81inAN0Vf6gIK8lNIMau+9ckXSXoiYBq2LpH5pzg9V87T9e1A=="], - "@wrnexus/test": ["@wrnexus/test@0.5.13", "", {}, "sha512-8KPblDS4YKlKlpW6h2Q5gS1lSWtv42IOi6CA+VCufVPDJNVBkecFSEPbTYyPzhGJTeN/gLteru8pD97G+Crrgw=="], + "@wrnexus/syntax": ["@wrnexus/syntax@0.6.0", "", {}, "sha512-k+tZtXMD4c+roZCuYAOYYCRNGUV4Ki75oqUJ1JWhqg2huGprHrld7JKVM0KHou2RODTZ2c3GAry5n29F9T39lw=="], - "@wrnexus/tracking": ["@wrnexus/tracking@0.5.13", "", {}, "sha512-iTP7bz/CBT+V/zvS7XIr0x7em9ro1l8go6rYssQx1ClMNQS3xtSVgk9aoqjkH6JCRQJZj5VN5Xj9lLhW7KNDTQ=="], + "@wrnexus/test": ["@wrnexus/test@0.6.0", "", {}, "sha512-mZWbU2Fqu4uFRI+5o+N7ZBCLMOvnc1XEUUqTRH2N+S8cEaMAka3M1dwZxw8p0tp8rfjtxlpJ4E0UQGyINhsutw=="], - "@wrnexus/ui": ["@wrnexus/ui@0.5.13", "", { "dependencies": { "@wrnexus/core": "^0.5.13" } }, "sha512-1kX7+DCK6dDjFTwpgKv+VzuoQde1mv9y++MY+i706OrQololh7yBJmNJcDGiFP2MqRZqXvU+RUYj4DCr8MoWVA=="], + "@wrnexus/tracking": ["@wrnexus/tracking@0.6.0", "", {}, "sha512-kvi5QavFdd4Cmzck5npOl3nWTw+Vgc8odx0Fm8CBDZs6hJwvUPRrqfRmL1TxsNdzhn7mh6W8y9RTcEsKiRy8cg=="], - "@wrnexus/uploader": ["@wrnexus/uploader@0.5.13", "", { "dependencies": { "@wrnexus/core": "^0.5.13" } }, "sha512-UHzd1OiD8SIUsqacirkQzsiDMeyqrJiNy1uiHOhGzQE6uekHZi5TEzzL5WJ/6ERe20ee04BVDWYv0wmMLX31eg=="], + "@wrnexus/typecheck": ["@wrnexus/typecheck@0.6.0", "", { "dependencies": { "@wrnexus/syntax": "^0.6.0", "typescript": "^5.5.0" } }, "sha512-UObLm/YPR4QNw5Y9jp4YIg5c9GH3orl52iv4c1JXi9a/19RppZmbG0GoLk7AtRdKl3TsHVSuOgnRsw5pd3Zp8Q=="], - "@wrnexus/validation": ["@wrnexus/validation@0.5.13", "", {}, "sha512-CAC47yMuQI9KjoyTJV5rTgA2AYhcNIFPCxS7YlHz3LrDPew1RLzfwhv+bbqshGZ3wvm4pFcJYqG9Ynm9PbXoKQ=="], + "@wrnexus/ui": ["@wrnexus/ui@0.6.0", "", { "dependencies": { "@wrnexus/core": "^0.6.0" } }, "sha512-fSj6vo7u4TN2rnpEWaC+FIyIWEGLYcXNs4KT9vM4M/BeRlru/R9a1MYrvxQichDtGITEHCFbDjuBzGPByLZC7Q=="], + + "@wrnexus/uploader": ["@wrnexus/uploader@0.6.0", "", { "dependencies": { "@wrnexus/core": "^0.6.0" } }, "sha512-db+Q72SMh4uJYVcmVFbQP+vhtt27KVMGYqs1QLGAFdTkn7Db5RMyijVWssIixm1zVDl7jKwAPYpfhbHfz7MS5Q=="], + + "@wrnexus/validation": ["@wrnexus/validation@0.6.0", "", {}, "sha512-JY/wIrPhlyQHO/gbEL2Y9mucE7TqlTrNzJK3sMv8Ob0Yc/0Dy3rpqy8tXSvvBqpPQVp3/hjMdeR9x5B2H0LG5Q=="], "acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="], @@ -529,28 +535,6 @@ "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], - "@wrnexus/auth/@wrnexus/authz": ["@wrnexus/authz@0.5.10", "", {}, "sha512-qpOlc93yYWf6Hdk5Mb5ob+ZTm8LA+n8aQPC0P3RNXIIyxh4QzXWy9QbUY16U+Ars9xGwJzhEjbcKxa8BX41JAA=="], - - "@wrnexus/auth/@wrnexus/captcha": ["@wrnexus/captcha@0.5.10", "", { "dependencies": { "@wrnexus/core": "^0.5.10", "@wrnexus/plugin": "^0.5.10", "@wrnexus/validation": "^0.5.10" } }, "sha512-juZfwVHuWwqn2dRl5cQYVg4YvDtthd+NAUoC6TQx+9JCr72GczBRwOPZTCEIPPTPZ2IgCTzdne6lqcnATIwj4w=="], - - "@wrnexus/auth/@wrnexus/core": ["@wrnexus/core@0.5.10", "", {}, "sha512-qW32pBXQ1C3IOL6GqchwfHCne1PjGdsaSQJJlV/w5bvysil3/R4g9plwhhUeUOoUitdJnHwpP7g3nNT6yQfPFw=="], - - "@wrnexus/auth/@wrnexus/db": ["@wrnexus/db@0.5.10", "", {}, "sha512-tyfgcNm5mM6qo4TEbSBqyjwBNPoZd3YWiP6RSl29YYUCvXK4hX0V+IxDCJz8aa8/pRSbmbB0GCBYRaF7MWsd9w=="], - - "@wrnexus/auth/@wrnexus/encryption": ["@wrnexus/encryption@0.5.10", "", {}, "sha512-V7yD1KS6BJDIRY/e5WRJRoIZszpLPF1Sj3xQtGERGl/0kWh1pucQ2AVlew6vnJsDBZ8brtso04mbZU48FO1Uzw=="], - - "@wrnexus/auth/@wrnexus/jwt": ["@wrnexus/jwt@0.5.10", "", {}, "sha512-wG+NFc+/6uXKGIaXYz5ZZoLar9zS5GsBaiAsFp0a0PrliStiSzDueKhBCcmsz4koRKcSLUDWenxML8V1edADHg=="], - - "@wrnexus/auth/@wrnexus/oauth": ["@wrnexus/oauth@0.5.10", "", {}, "sha512-oSl9w5mt3nvY3YSfdiAdNsrnJ+cvaaY/eU9ziaAfvyaT1qPRsCVQKanw5UA4WBcXtNAE7Irp6FV24H+Xwbge+g=="], - - "@wrnexus/auth/@wrnexus/plugin": ["@wrnexus/plugin@0.5.10", "", { "dependencies": { "@wrnexus/syntax": "^0.5.10" } }, "sha512-Rdlb7VRfbYVLMCUqT2IdWrdTmj0DH2vK6nihYP4WGOPRa0W1ywpENeMkak+TdUJRABKAV1DFeaGRFLAar+JBMg=="], - - "@wrnexus/auth/@wrnexus/queue": ["@wrnexus/queue@0.5.10", "", {}, "sha512-D4+1k1pWBLi3gRg/q43GG5/XXNiraH/3n0cwGURoLKLEoLBwSzmG573O4sbRPkiv/jG40r9BwhiM18PAM4ztyw=="], - - "@wrnexus/auth/@wrnexus/ui": ["@wrnexus/ui@0.5.11", "", { "dependencies": { "@wrnexus/core": "^0.5.4" } }, "sha512-xXbUQfVYCSuu8IiBXIc2nuIfQdh8/jVzerkjQmH0v1Ojqxd8S7I6bLyl1jZL9udLRXxePiRFiTYAsB6ibJVTFQ=="], - - "@wrnexus/auth/@wrnexus/validation": ["@wrnexus/validation@0.5.10", "", {}, "sha512-DnowzMfykcq4o8nAjAZmtwf1JgNtzjBNPcRUK/DrkLGXNm0AXdGtPu2n4hZZEcI6JLlS5XmkM+ys1oob8bYIkg=="], - "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="], "lightningcss/detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], @@ -559,8 +543,6 @@ "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@5.0.7", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA=="], - "@wrnexus/auth/@wrnexus/plugin/@wrnexus/syntax": ["@wrnexus/syntax@0.5.10", "", {}, "sha512-SYQz+RtkFxDBNYOP+96rOXGoWrVchg5TkKN/KhIHCzp2zgfdBDyf1Kx8ZYZJTiujznBtYunEry3EfhLhknl5XA=="], - "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="], "@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], diff --git a/docs/documentation-coverage-matrix.md b/docs/documentation-coverage-matrix.md index 623b5eb0..4e8e774d 100644 --- a/docs/documentation-coverage-matrix.md +++ b/docs/documentation-coverage-matrix.md @@ -26,10 +26,12 @@ | @wrnexus/reactive | /packages/reactive | Architecture/package guide | Planned | Generator coverage | Preview | No standalone CI fixture | | @wrnexus/router | /packages/router | Architecture/package guide | Planned | Generator coverage | Preview | No standalone CI fixture | | @wrnexus/ssr | /packages/ssr | Architecture/package guide | Planned | Generator coverage | Preview | No standalone CI fixture | +| @wrnexus/store | /packages/store | Architecture/package guide | Planned | Generator coverage | Preview | No standalone CI fixture | | @wrnexus/styles | /packages/styles | Architecture/package guide | Planned | Generator coverage | Preview | No standalone CI fixture | | @wrnexus/syntax | /packages/syntax | Architecture/package guide | Planned | Generator coverage | Preview | No standalone CI fixture | | @wrnexus/test | /packages/test | Architecture/package guide | Planned | Generator coverage | Preview | No standalone CI fixture | | @wrnexus/tracking | /packages/tracking | Architecture/package guide | Planned | Generator coverage | Preview | No standalone CI fixture | +| @wrnexus/typecheck | /packages/typecheck | Architecture/package guide | Planned | Generator coverage | Preview | No standalone CI fixture | | @wrnexus/ui | /packages/ui | Architecture/package guide | Planned | Generator coverage | Preview | No standalone CI fixture | | @wrnexus/uploader | /packages/uploader | /guides/uploads | Planned | Generator coverage | Preview | No standalone CI fixture | | @wrnexus/validation | /packages/validation | /guides/forms-and-validation | Planned | Generator coverage | Preview | No standalone CI fixture | diff --git a/docs/release-access-status.md b/docs/release-access-status.md index 815dacba..41e39e50 100644 --- a/docs/release-access-status.md +++ b/docs/release-access-status.md @@ -2,6 +2,6 @@ ## Decision: Mode B — Private Developer Preview -Active version: 0.5.13, derived from package.json#wrnexus.version. All 31 installed @wrnexus packages resolve to 0.5.13 and npm reports restricted access. The repository remote is a private WorkRoot Git service and no public license file exists. +Active version: 0.6.0, derived from package.json#wrnexus.version. All 33 installed @wrnexus packages resolve to 0.6.0 and npm reports restricted access. The repository remote is a private WorkRoot Git service and no public license file exists. -External users cannot execute an installation without approved private registry credentials. The truthful CTA is Request preview access. After approval, the canonical command is bunx @wrnexus/cli@0.5.13 create my-app. Tokens must never appear in documentation or source. +External users cannot execute an installation without approved private registry credentials. The truthful CTA is Request preview access. After approval, the canonical command is bunx @wrnexus/cli@0.6.0 create my-app. Tokens must never appear in documentation or source. diff --git a/docs/site-audit.md b/docs/site-audit.md index 223a231d..f4c07154 100644 --- a/docs/site-audit.md +++ b/docs/site-audit.md @@ -1,18 +1,18 @@ # WRNexusJS site audit -Date: 2026-07-13. Baseline: Bun 1.3.14, framework 0.5.13. +Date: 2026-07-13. Baseline: Bun 1.3.14, framework 0.6.0. ## Baseline results - authenticated private-registry installation: pass. -- docs generation: pass (31 package pages plus portal and guide pages). +- docs generation: pass (33 package pages plus portal and guide pages). - tests, lint, formatting, and production build are required by the release check. - package access remains restricted/private. - repository: private WorkRoot Git remote; no public license file exists. ## Findings -Package documentation, discovery assets, and AI-readable references are generated from the installed release. The 0.5.13 portal includes the helpers package, workspace app addition, and safe forward-auth login redirect guidance. +Package documentation, discovery assets, and AI-readable references are generated from the installed release. The 0.6.0 portal includes the helpers package, workspace app addition, and safe forward-auth login redirect guidance. ## Audit limitations diff --git a/package-lock.json b/package-lock.json index 15712de4..32888071 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,43 +10,45 @@ "dependencies": { "@iconify-json/lucide": "^1.2.118", "@iconify/tailwind4": "^1.2.3", - "@wrnexus/ai": "^0.5.13", - "@wrnexus/auth": "^0.5.13", - "@wrnexus/authz": "^0.5.13", - "@wrnexus/captcha": "^0.5.13", - "@wrnexus/compiler": "^0.5.13", - "@wrnexus/core": "^0.5.13", - "@wrnexus/csr": "^0.5.13", - "@wrnexus/db": "^0.5.13", - "@wrnexus/dev-server": "^0.5.13", - "@wrnexus/dev-toolbar": "^0.5.13", - "@wrnexus/encryption": "^0.5.13", - "@wrnexus/helpers": "^0.5.13", - "@wrnexus/i18n": "^0.5.13", - "@wrnexus/jwt": "^0.5.13", - "@wrnexus/mobile": "^0.5.13", - "@wrnexus/native": "^0.5.13", - "@wrnexus/oauth": "^0.5.13", - "@wrnexus/plugin": "^0.5.13", - "@wrnexus/pubsub": "^0.5.13", - "@wrnexus/queue": "^0.5.13", - "@wrnexus/reactive": "^0.5.13", - "@wrnexus/router": "^0.5.13", - "@wrnexus/ssr": "^0.5.13", - "@wrnexus/styles": "^0.5.13", - "@wrnexus/syntax": "^0.5.13", - "@wrnexus/test": "^0.5.13", - "@wrnexus/tracking": "^0.5.13", - "@wrnexus/ui": "^0.5.13", - "@wrnexus/uploader": "^0.5.13", - "@wrnexus/validation": "^0.5.13" + "@wrnexus/ai": "^0.6.0", + "@wrnexus/auth": "^0.6.0", + "@wrnexus/authz": "^0.6.0", + "@wrnexus/captcha": "^0.6.0", + "@wrnexus/compiler": "^0.6.0", + "@wrnexus/core": "^0.6.0", + "@wrnexus/csr": "^0.6.0", + "@wrnexus/db": "^0.6.0", + "@wrnexus/dev-server": "^0.6.0", + "@wrnexus/dev-toolbar": "^0.6.0", + "@wrnexus/encryption": "^0.6.0", + "@wrnexus/helpers": "^0.6.0", + "@wrnexus/i18n": "^0.6.0", + "@wrnexus/jwt": "^0.6.0", + "@wrnexus/mobile": "^0.6.0", + "@wrnexus/native": "^0.6.0", + "@wrnexus/oauth": "^0.6.0", + "@wrnexus/plugin": "^0.6.0", + "@wrnexus/pubsub": "^0.6.0", + "@wrnexus/queue": "^0.6.0", + "@wrnexus/reactive": "^0.6.0", + "@wrnexus/router": "^0.6.0", + "@wrnexus/ssr": "^0.6.0", + "@wrnexus/store": "^0.6.0", + "@wrnexus/styles": "^0.6.0", + "@wrnexus/syntax": "^0.6.0", + "@wrnexus/test": "^0.6.0", + "@wrnexus/tracking": "^0.6.0", + "@wrnexus/typecheck": "^0.6.0", + "@wrnexus/ui": "^0.6.0", + "@wrnexus/uploader": "^0.6.0", + "@wrnexus/validation": "^0.6.0" }, "devDependencies": { "@eslint/js": "^9.0.0", "@tailwindcss/cli": "^4.0.0", "@types/bun": "latest", "@types/node": "^26.1.1", - "@wrnexus/cli": "^0.5.13", + "@wrnexus/cli": "^0.6.0", "eslint": "^9.0.0", "prettier": "latest", "tailwindcss": "^4.0.0", @@ -1306,78 +1308,78 @@ } }, "node_modules/@wrnexus/ai": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/ai/-/ai-0.5.13.tgz", - "integrity": "sha512-rPn2m4dReg3iLEr4wn95DZjFPxSWZLSQ+JxHp9jo+0gOY13Z/5dVVI1pl1bDhmrcrs/Fwj1DQcTSkfJeOCt4lw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/ai/-/ai-0.6.0.tgz", + "integrity": "sha512-Hj76672ZHnG03MV58gcrulWii8hxbfAVlR7T/2INnGxKRIOKHJa+pVZoAl7TVOPXRFPqVwgrkATa+vK6/dhg8g==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/auth": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/auth/-/auth-0.5.13.tgz", - "integrity": "sha512-ZEwz+Bpj/lJYHRNwgPexSxLrMDU6pbLJlaFpf8oiV838fspkfXvpyK93t1/z5iix2k/vqgbyL9KIQU+W6t/pIA==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/auth/-/auth-0.6.0.tgz", + "integrity": "sha512-pqka4koIRZoy2Wn5CK4wETSI4nVuFCiAyI7nS4Qs4Wt2pPdJVGF8CDCKuTLOqwwufs4s5Bm5+L8QuB9txdAO0Q==", "license": "MIT", "dependencies": { - "@wrnexus/authz": "^0.5.4", - "@wrnexus/captcha": "^0.5.9", - "@wrnexus/core": "^0.5.4", - "@wrnexus/db": "^0.5.7", - "@wrnexus/encryption": "^0.5.4", - "@wrnexus/jwt": "^0.5.4", - "@wrnexus/oauth": "^0.5.4", - "@wrnexus/plugin": "^0.5.4", - "@wrnexus/queue": "^0.5.4", - "@wrnexus/ui": "^0.5.10", - "@wrnexus/validation": "^0.5.5" + "@wrnexus/authz": "^0.6.0", + "@wrnexus/captcha": "^0.6.0", + "@wrnexus/core": "^0.6.0", + "@wrnexus/db": "^0.6.0", + "@wrnexus/encryption": "^0.6.0", + "@wrnexus/jwt": "^0.6.0", + "@wrnexus/oauth": "^0.6.0", + "@wrnexus/plugin": "^0.6.0", + "@wrnexus/queue": "^0.6.0", + "@wrnexus/ui": "^0.6.0", + "@wrnexus/validation": "^0.6.0" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/authz": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/authz/-/authz-0.5.13.tgz", - "integrity": "sha512-OG+8hsTrNc3yXfQg9s4B1TApxSsvHQeNKoqMf/02rb3fR5KJU5KCYpZ4AHjkuWDScI6Gs1Y6lZVb88mzagmzHQ==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/authz/-/authz-0.6.0.tgz", + "integrity": "sha512-9y5CwL62mLwKzopt9Wl0z/yi895HDL1H7QadcYK4zVFymAo8qlaM/kpgnG+K+yE5qGLam6rC97d60KPhqDb4bA==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/captcha": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/captcha/-/captcha-0.5.13.tgz", - "integrity": "sha512-mG163tf9oZ+qRN9/5idZpSg6SCimRr0KKMtXNzAJaA7pbdi+Y81cZq0stnM7VDe+3cHEy6Z1xc1cyGupI67eLQ==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/captcha/-/captcha-0.6.0.tgz", + "integrity": "sha512-r0V2rhWXkK/3RtVl4toMUQFfYDdUDS49rSkrxWBOvnUCRMs2qsFvSYPt1odC1fZ9kQkVcmNYuUPBh8YapjGixg==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.5.13", - "@wrnexus/plugin": "^0.5.13", - "@wrnexus/validation": "^0.5.13" + "@wrnexus/core": "^0.6.0", + "@wrnexus/plugin": "^0.6.0", + "@wrnexus/validation": "^0.6.0" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/cli": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/cli/-/cli-0.5.13.tgz", - "integrity": "sha512-Wkkdc7OuQ/jFc6VRn7OTb9Wjs17845qa7dPJewGrpib4+oWul7TurI6od18vIVC4zDmb8AHDbhm3Cs7gpmJjyw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/cli/-/cli-0.6.0.tgz", + "integrity": "sha512-i8MtPLLCQL0cACd907UL1ljeDCNU8U6HKcnUzz52P2eIAZ8k+LlI3M32TX7obivLv15i4MH8fXXldzL1f8eb8A==", "dev": true, "license": "MIT", "dependencies": { - "@wrnexus/compiler": "^0.5.13", - "@wrnexus/core": "^0.5.13", - "@wrnexus/csr": "^0.5.13", - "@wrnexus/db": "^0.5.13", - "@wrnexus/dev-server": "^0.5.13", - "@wrnexus/i18n": "^0.5.13", - "@wrnexus/plugin": "^0.5.13", - "@wrnexus/router": "^0.5.13", - "@wrnexus/styles": "^0.5.13", - "@wrnexus/syntax": "^0.5.13", - "@wrnexus/ui": "^0.5.13", - "@wrnexus/validation": "^0.5.13" + "@wrnexus/compiler": "^0.6.0", + "@wrnexus/core": "^0.6.0", + "@wrnexus/csr": "^0.6.0", + "@wrnexus/db": "^0.6.0", + "@wrnexus/dev-server": "^0.6.0", + "@wrnexus/i18n": "^0.6.0", + "@wrnexus/plugin": "^0.6.0", + "@wrnexus/router": "^0.6.0", + "@wrnexus/styles": "^0.6.0", + "@wrnexus/syntax": "^0.6.0", + "@wrnexus/ui": "^0.6.0", + "@wrnexus/validation": "^0.6.0" }, "bin": { "wrnexus": "dist/index.js" @@ -1387,286 +1389,311 @@ } }, "node_modules/@wrnexus/compiler": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/compiler/-/compiler-0.5.13.tgz", - "integrity": "sha512-M1Sxwuz8VKQRJxdpJPk8mzlaWy0x/SLhzBi8ZiDQrDBP5/JDXao/ybpV7MCHnhGvWTl/VhB/Vqdn5x0oHLWzdg==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/compiler/-/compiler-0.6.0.tgz", + "integrity": "sha512-AYKebrDqGcn3nqJWSpoOEio3EYppT3kLQTO6J6BRy+WyChxX1MuN16XjZAJaLFGybf22zw8WfCuaXLjpS/HpGg==", "license": "MIT", "dependencies": { - "@wrnexus/syntax": "^0.5.13" + "@wrnexus/store": "^0.6.0", + "@wrnexus/syntax": "^0.6.0" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/core": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/core/-/core-0.5.13.tgz", - "integrity": "sha512-k0kx6HVNikzl5K5dCpkIFFD8W5vaPahzWruTVv45UhfC3WyMN45Mlm34S/lJh2vBFk6Pe/5M5Jvsd7rxSbRKCw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/core/-/core-0.6.0.tgz", + "integrity": "sha512-X2UJhmAeXoyvpSGQ/2zPOzgFPwr+bMYeOjf/KV8f+ULf02pM8zvyQNV3Fft4GaUl7LwZG8gD5b1XwUIFWS500Q==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/csr": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/csr/-/csr-0.5.13.tgz", - "integrity": "sha512-k+WoFDBnlHwU9yRX/k6W2jrQfoHVXUxiSo4l2v1KMz+Xszj+meHLwc14MoXLR1+FQb3+guwKygwQAzBKkBaKgA==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/csr/-/csr-0.6.0.tgz", + "integrity": "sha512-6ll6D4HmoCdNkWB+bpWgKmFkrFlaANDSWZAXv/g3oTOvq+FKUza47WqEXhR29NFKqJO9mTYW684KA3uZAOe6bg==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.5.13" + "@wrnexus/core": "^0.6.0" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/db": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/db/-/db-0.5.13.tgz", - "integrity": "sha512-bd+jhkv8oZy4FVfhCP8Iv8r1IFwN99G53gkYRmyix3BNzQMrcrREJsYvmt5S2EsHLwkpR/ExfN/xrytav2bQVA==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/db/-/db-0.6.0.tgz", + "integrity": "sha512-Sgn9QJ8kIuoD0MktuqH89xlWAxlaV6qb+SDzaZ9MpOjMc4cAZpD5MWHMJKmWZgqyiLRCqJLHz4HKfEsstGdM4Q==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/dev-server": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/dev-server/-/dev-server-0.5.13.tgz", - "integrity": "sha512-2EtNXqFRXiWio8IbFA3NOyS/oFb1cb0f6KnlKJmkiyZ8djItWMj044Di2C5E9xJ6L+394tsai3fSPtUlPAlt9w==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/dev-server/-/dev-server-0.6.0.tgz", + "integrity": "sha512-2DuKrJjE8WfHlBiDwBCpCTJhBGSRTttebatLpmvYtO6LB560VoPJVdsNucJ/p6jGK6F8Kg1sbSyLlupaw9mx2w==", "license": "MIT", "dependencies": { - "@wrnexus/compiler": "^0.5.13", - "@wrnexus/core": "^0.5.13", - "@wrnexus/csr": "^0.5.13", - "@wrnexus/db": "^0.5.13", - "@wrnexus/dev-toolbar": "^0.5.13", - "@wrnexus/i18n": "^0.5.13", - "@wrnexus/plugin": "^0.5.13", - "@wrnexus/pubsub": "^0.5.13", - "@wrnexus/router": "^0.5.13", - "@wrnexus/ssr": "^0.5.13", - "@wrnexus/styles": "^0.5.13", - "@wrnexus/ui": "^0.5.13", - "@wrnexus/uploader": "^0.5.13", - "@wrnexus/validation": "^0.5.13" + "@wrnexus/compiler": "^0.6.0", + "@wrnexus/core": "^0.6.0", + "@wrnexus/csr": "^0.6.0", + "@wrnexus/db": "^0.6.0", + "@wrnexus/dev-toolbar": "^0.6.0", + "@wrnexus/i18n": "^0.6.0", + "@wrnexus/plugin": "^0.6.0", + "@wrnexus/pubsub": "^0.6.0", + "@wrnexus/router": "^0.6.0", + "@wrnexus/ssr": "^0.6.0", + "@wrnexus/store": "^0.6.0", + "@wrnexus/styles": "^0.6.0", + "@wrnexus/ui": "^0.6.0", + "@wrnexus/uploader": "^0.6.0", + "@wrnexus/validation": "^0.6.0" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/dev-toolbar": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/dev-toolbar/-/dev-toolbar-0.5.13.tgz", - "integrity": "sha512-8m2SVGTClMXXsyS6e2F4elK7KBcvV9KvFcSL6K71IC6zkGivwBO0ZnrAg5p6CSclagINub+O5xAKaaU7Cuug1Q==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/dev-toolbar/-/dev-toolbar-0.6.0.tgz", + "integrity": "sha512-LY0Hq7liLXrspOM+GgHuwQY2pmEqG1EjMaz4u0iVUMNt7JjuJxzzz1b3DlotJbMdvsEy8GKDosPW92WbT96QNQ==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/encryption": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/encryption/-/encryption-0.5.13.tgz", - "integrity": "sha512-JSWGfsUJhjpsikXdI+VbKwaGBMiMiKIr74I8BXwBZKOfQ0iQXCnNu5ATUXaQbCKlo2Itts3sNe717ZL4emjgPw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/encryption/-/encryption-0.6.0.tgz", + "integrity": "sha512-kJHiwUVD1qCFGZos7yWGvIkvg9ayk3o6BP2K8z/8wa2WkWt+f59DA0M66fDWffa08pP6/rlghbpDSTjGl2zZ9Q==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/helpers": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/helpers/-/helpers-0.5.13.tgz", - "integrity": "sha512-truqSiX11SjJlbDazc8KcikRhg/uqiSoJdVLOyta0EbNMfTWz6NQiw60oFPYkzRv5KysrR4ZuEjueDIlzIpoFQ==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/helpers/-/helpers-0.6.0.tgz", + "integrity": "sha512-qQ1k2pd3TIr4Hb7YgN4On0YpmNjXAQ95YghvANmXcJLziqeSZYeOqJ6l6vLqTbVwyskyvbRd7FfhJkPWWfpb4A==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.5.13" + "@wrnexus/core": "^0.6.0" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/i18n": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/i18n/-/i18n-0.5.13.tgz", - "integrity": "sha512-7otRWDv+7j1TYAW+uqV6KZA4uX86bOL1//1mvoFfAtUMvvPRmpTvlQP3hl2KD9qVvK1Cvcz9veRnmKYMiFO+lg==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/i18n/-/i18n-0.6.0.tgz", + "integrity": "sha512-LkTI1XyPKB2Yzuo/lWtlyADihLH+gDJ/t/K3628vh7p2S6RHV7K6ng/uNRtmMch2cOGl+rqzA+mOT3xe8Mk7Xg==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.5.13" + "@wrnexus/core": "^0.6.0" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/jwt": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/jwt/-/jwt-0.5.13.tgz", - "integrity": "sha512-uwsgWoxWyr8N66jUzJ25k0o5oe0vR4HzX0O60jKKsvoldFQm614RVqv5Fzk4a7bXXF/avJsvt6N6e+RaIyIaqQ==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/jwt/-/jwt-0.6.0.tgz", + "integrity": "sha512-Gy9cZufdeWfRaQLQ7JkPuQvKp4Qqn5vLM1NwU3fmPwUDo0hW0zGbPcu14aoZWlhvqC3B5iXI8kFayCQ4Y0C0nA==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/mobile": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/mobile/-/mobile-0.5.13.tgz", - "integrity": "sha512-aD3oSNA/6TvqM1raMGeIyvGAJ/1sFCTJIbLpc+y5C7Hafskk96jqZrSB7HRo2GiUpdhCo+nnF+zfFu+6e8iNoQ==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/mobile/-/mobile-0.6.0.tgz", + "integrity": "sha512-AihigbRXqRdWX/Yrzwc9NVjI2HuZkQa3XMUcMGfOKC0paWoeSvSDMksamHjARvYhTYgKpcJ0FCTDeiMvdcV35w==", "license": "MIT", "dependencies": { - "@wrnexus/native": "^0.5.13" + "@wrnexus/native": "^0.6.0" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/native": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/native/-/native-0.5.13.tgz", - "integrity": "sha512-uD9FbI226QAogTCp/rU+qxNU/uvVLASzguGoWMnbQ1ZoL35BxY5UX5x3/ElamHhv3ilIsbRMWwBCu263OiIgXw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/native/-/native-0.6.0.tgz", + "integrity": "sha512-HV8KCTC3ufLJqk+oafJ3+PdnEm5Uui2ncBeAyFfYOX4ysZnyi7vJzlfPgBTwJu9phJ7yn9yPXaTxIUVUjWcyMw==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/oauth": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/oauth/-/oauth-0.5.13.tgz", - "integrity": "sha512-lzlckro/cz80D3dsGsN/oxxLZoX7jGkTHVED5zjvrRqwYJ9EMJwm59AX1M9hsgz7qYkD/l+hlUTsmMYrgpREoA==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/oauth/-/oauth-0.6.0.tgz", + "integrity": "sha512-Nd7ktLa0HX0wX+Q2W+gCQWcSC7eKuZjb2VwIb88cs+OfHm1Vl8vCkk683ZwRIp29DF1kQfCWvKwaYI7FAvJxeQ==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/plugin": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/plugin/-/plugin-0.5.13.tgz", - "integrity": "sha512-ZqiTXwlvYUig5Vd261bMIvYHNP1b83ebqXCWf4dwljP+yjWzpT1XZFT+4tT7KIBHPtJmEjIiUDoj/NrTl2iqfg==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/plugin/-/plugin-0.6.0.tgz", + "integrity": "sha512-rl+HmN9jXzDONRZDiZ/Ny4iMxDp0HpSXkvBXJNLC3H97FEO4vAfD5yso3FxShkvEjUwiUVIPgF5uaCdqOSAxZg==", "license": "MIT", "dependencies": { - "@wrnexus/syntax": "^0.5.13" + "@wrnexus/syntax": "^0.6.0" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/pubsub": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/pubsub/-/pubsub-0.5.13.tgz", - "integrity": "sha512-SOWg8UkEVtPZKPxxQzXrydvX2TAQOHMaPXs/zvpz0/LHUOmRSfWJ7J+xVeQWkFyucY60jy0jYeRMkYj7+HH5mw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/pubsub/-/pubsub-0.6.0.tgz", + "integrity": "sha512-wu2DyioqoIb2C8KJSiV59schm+dZRwYPT9atLYBIcSYnbp8tbNpU1ybtOWrBbAlmDsS0GY2NnR9NH0dgORMoXg==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/queue": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/queue/-/queue-0.5.13.tgz", - "integrity": "sha512-yCHPii5RmM8h7vZaSK2yzlWfZQa72J08HItr+92RryEW+boNYmMB2lqzdtE184A526t//vN8X0sCZtmujImBoQ==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/queue/-/queue-0.6.0.tgz", + "integrity": "sha512-vwSOnzT4Et6rMidd4AvPm1//Jfnq22ddWL/yhVe/ishhxEK3rNfQfIxHVehUDozHLT+hEua7NwO0wP3YTD2+jA==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/reactive": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/reactive/-/reactive-0.5.13.tgz", - "integrity": "sha512-dkPRFkxTUDPaa0cC8epeziWZBpvUDDoOjT53SecixK3lVdEyzzXqqrXHsQgiIvcVFMu6rFiJJLmCz0llX7TTcg==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/reactive/-/reactive-0.6.0.tgz", + "integrity": "sha512-lw0TTu69xXxNcCr5KB7KXYf4gBrSmR0PICANj47+jxnn6rhaWmKWJBvYiXNmHHe+zVf9GSwjT+qIi2bbgv71Rw==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/router": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/router/-/router-0.5.13.tgz", - "integrity": "sha512-vk47k3aKOsGx5eHl3p3XGX868i44m6qYblq9vGrJuEAWNQCHa8OzfKWpJYuAeEF7zNHyRymAFbNzK+LEG5p3ag==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/router/-/router-0.6.0.tgz", + "integrity": "sha512-KzB4g0lHVT/WfmcIB0vhYDxRr5BDV4LIoMSzIzRlUWlFDSw6yVqoQEyUJ6DMhGGiah0ieoxsbjAsfnirlSlgfA==", "license": "MIT", "dependencies": { - "@wrnexus/compiler": "^0.5.13", - "@wrnexus/core": "^0.5.13" + "@wrnexus/compiler": "^0.6.0", + "@wrnexus/core": "^0.6.0" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/ssr": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/ssr/-/ssr-0.5.13.tgz", - "integrity": "sha512-GBjeYchP+xL8RAZDNyAgP7BUA/+r/BI6S+AuSDGBvgnGFhhB8pEoulmgdZsM64m55BTeE+7kc6LQuzK83msHjQ==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/ssr/-/ssr-0.6.0.tgz", + "integrity": "sha512-IQn1G9HkiB52A1BHlOFXJCtPDn3WmoQxUfqWdkTcE+FZ5CdyCfrYvBIS2YrtAnqixZ0liHxyH04OnAO/8hcmiQ==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.5.13" + "@wrnexus/core": "^0.6.0", + "@wrnexus/store": "^0.6.0" }, "engines": { "bun": ">=1.3.0" } }, + "node_modules/@wrnexus/store": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/store/-/store-0.6.0.tgz", + "integrity": "sha512-q2u1mSYNwn8k1kFFLEgL8nm9mXljug28O+1aavGWSOME3uYTeiJUv3XgL+zUqhXK+XED12FwmzXG3SPATfjg9A==", + "license": "MIT", + "engines": { + "bun": ">=1.3.0" + } + }, "node_modules/@wrnexus/styles": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/styles/-/styles-0.5.13.tgz", - "integrity": "sha512-V1rEbIoUtMUmOXC986VPcdyl87knogP7Mo3i8hTEddvD/uhpgq+6twicp8idNMaqKu47W2yqL7MitDUYKHDblg==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/styles/-/styles-0.6.0.tgz", + "integrity": "sha512-mNHxCT+/SHOtvStSbiOzj3A2+EHbLGAzbAXQM81inAN0Vf6gIK8lNIMau+9ckXSXoiYBq2LpH5pzg9V87T9e1A==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.5.13", - "@wrnexus/plugin": "^0.5.13", - "@wrnexus/uploader": "^0.5.13" + "@wrnexus/core": "^0.6.0", + "@wrnexus/plugin": "^0.6.0", + "@wrnexus/uploader": "^0.6.0" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/syntax": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/syntax/-/syntax-0.5.13.tgz", - "integrity": "sha512-u9GI7SBq0pd0pvqbOF0BqNYYkYW6FKy+oE6n6DkynoLfKKc3wOkMDMVXxKNieRPPDZVgyR87S0eg8CZn/TmhlA==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/syntax/-/syntax-0.6.0.tgz", + "integrity": "sha512-k+tZtXMD4c+roZCuYAOYYCRNGUV4Ki75oqUJ1JWhqg2huGprHrld7JKVM0KHou2RODTZ2c3GAry5n29F9T39lw==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/test": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/test/-/test-0.5.13.tgz", - "integrity": "sha512-8KPblDS4YKlKlpW6h2Q5gS1lSWtv42IOi6CA+VCufVPDJNVBkecFSEPbTYyPzhGJTeN/gLteru8pD97G+Crrgw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/test/-/test-0.6.0.tgz", + "integrity": "sha512-mZWbU2Fqu4uFRI+5o+N7ZBCLMOvnc1XEUUqTRH2N+S8cEaMAka3M1dwZxw8p0tp8rfjtxlpJ4E0UQGyINhsutw==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/tracking": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/tracking/-/tracking-0.5.13.tgz", - "integrity": "sha512-iTP7bz/CBT+V/zvS7XIr0x7em9ro1l8go6rYssQx1ClMNQS3xtSVgk9aoqjkH6JCRQJZj5VN5Xj9lLhW7KNDTQ==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/tracking/-/tracking-0.6.0.tgz", + "integrity": "sha512-kvi5QavFdd4Cmzck5npOl3nWTw+Vgc8odx0Fm8CBDZs6hJwvUPRrqfRmL1TxsNdzhn7mh6W8y9RTcEsKiRy8cg==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, - "node_modules/@wrnexus/ui": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/ui/-/ui-0.5.13.tgz", - "integrity": "sha512-1kX7+DCK6dDjFTwpgKv+VzuoQde1mv9y++MY+i706OrQololh7yBJmNJcDGiFP2MqRZqXvU+RUYj4DCr8MoWVA==", + "node_modules/@wrnexus/typecheck": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/typecheck/-/typecheck-0.6.0.tgz", + "integrity": "sha512-UObLm/YPR4QNw5Y9jp4YIg5c9GH3orl52iv4c1JXi9a/19RppZmbG0GoLk7AtRdKl3TsHVSuOgnRsw5pd3Zp8Q==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.5.13" + "@wrnexus/syntax": "^0.6.0", + "typescript": "^5.5.0" + }, + "engines": { + "bun": ">=1.3.0" + } + }, + "node_modules/@wrnexus/ui": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/ui/-/ui-0.6.0.tgz", + "integrity": "sha512-fSj6vo7u4TN2rnpEWaC+FIyIWEGLYcXNs4KT9vM4M/BeRlru/R9a1MYrvxQichDtGITEHCFbDjuBzGPByLZC7Q==", + "license": "MIT", + "dependencies": { + "@wrnexus/core": "^0.6.0" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/uploader": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/uploader/-/uploader-0.5.13.tgz", - "integrity": "sha512-UHzd1OiD8SIUsqacirkQzsiDMeyqrJiNy1uiHOhGzQE6uekHZi5TEzzL5WJ/6ERe20ee04BVDWYv0wmMLX31eg==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/uploader/-/uploader-0.6.0.tgz", + "integrity": "sha512-db+Q72SMh4uJYVcmVFbQP+vhtt27KVMGYqs1QLGAFdTkn7Db5RMyijVWssIixm1zVDl7jKwAPYpfhbHfz7MS5Q==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.5.13" + "@wrnexus/core": "^0.6.0" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/validation": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@wrnexus/validation/-/validation-0.5.13.tgz", - "integrity": "sha512-CAC47yMuQI9KjoyTJV5rTgA2AYhcNIFPCxS7YlHz3LrDPew1RLzfwhv+bbqshGZ3wvm4pFcJYqG9Ynm9PbXoKQ==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wrnexus/validation/-/validation-0.6.0.tgz", + "integrity": "sha512-JY/wIrPhlyQHO/gbEL2Y9mucE7TqlTrNzJK3sMv8Ob0Yc/0Dy3rpqy8tXSvvBqpPQVp3/hjMdeR9x5B2H0LG5Q==", "license": "MIT", "engines": { "bun": ">=1.3.0" @@ -3125,7 +3152,6 @@ }, "node_modules/typescript": { "version": "5.9.3", - "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", diff --git a/package.json b/package.json index aef21f81..f7272f20 100644 --- a/package.json +++ b/package.json @@ -27,43 +27,45 @@ "dependencies": { "@iconify-json/lucide": "^1.2.118", "@iconify/tailwind4": "^1.2.3", - "@wrnexus/ai": "^0.5.13", - "@wrnexus/authz": "^0.5.13", - "@wrnexus/compiler": "^0.5.13", - "@wrnexus/core": "^0.5.13", - "@wrnexus/csr": "^0.5.13", - "@wrnexus/db": "^0.5.13", - "@wrnexus/dev-server": "^0.5.13", - "@wrnexus/encryption": "^0.5.13", - "@wrnexus/helpers": "^0.5.13", - "@wrnexus/i18n": "^0.5.13", - "@wrnexus/jwt": "^0.5.13", - "@wrnexus/mobile": "^0.5.13", - "@wrnexus/native": "^0.5.13", - "@wrnexus/oauth": "^0.5.13", - "@wrnexus/pubsub": "^0.5.13", - "@wrnexus/queue": "^0.5.13", - "@wrnexus/reactive": "^0.5.13", - "@wrnexus/router": "^0.5.13", - "@wrnexus/ssr": "^0.5.13", - "@wrnexus/styles": "^0.5.13", - "@wrnexus/test": "^0.5.13", - "@wrnexus/tracking": "^0.5.13", - "@wrnexus/ui": "^0.5.13", - "@wrnexus/uploader": "^0.5.13", - "@wrnexus/validation": "^0.5.13", - "@wrnexus/dev-toolbar": "^0.5.13", - "@wrnexus/syntax": "^0.5.13", - "@wrnexus/plugin": "^0.5.13", - "@wrnexus/captcha": "^0.5.13", - "@wrnexus/auth": "^0.5.13" + "@wrnexus/ai": "^0.6.0", + "@wrnexus/authz": "^0.6.0", + "@wrnexus/compiler": "^0.6.0", + "@wrnexus/core": "^0.6.0", + "@wrnexus/csr": "^0.6.0", + "@wrnexus/db": "^0.6.0", + "@wrnexus/dev-server": "^0.6.0", + "@wrnexus/encryption": "^0.6.0", + "@wrnexus/helpers": "^0.6.0", + "@wrnexus/i18n": "^0.6.0", + "@wrnexus/jwt": "^0.6.0", + "@wrnexus/mobile": "^0.6.0", + "@wrnexus/native": "^0.6.0", + "@wrnexus/oauth": "^0.6.0", + "@wrnexus/pubsub": "^0.6.0", + "@wrnexus/queue": "^0.6.0", + "@wrnexus/reactive": "^0.6.0", + "@wrnexus/router": "^0.6.0", + "@wrnexus/ssr": "^0.6.0", + "@wrnexus/styles": "^0.6.0", + "@wrnexus/test": "^0.6.0", + "@wrnexus/tracking": "^0.6.0", + "@wrnexus/ui": "^0.6.0", + "@wrnexus/uploader": "^0.6.0", + "@wrnexus/validation": "^0.6.0", + "@wrnexus/dev-toolbar": "^0.6.0", + "@wrnexus/syntax": "^0.6.0", + "@wrnexus/plugin": "^0.6.0", + "@wrnexus/captcha": "^0.6.0", + "@wrnexus/auth": "^0.6.0", + "@wrnexus/store": "^0.6.0", + "@wrnexus/typecheck": "^0.6.0" }, "devDependencies": { "@eslint/js": "^9.0.0", "@tailwindcss/cli": "^4.0.0", "@types/bun": "latest", "@types/node": "^26.1.1", - "@wrnexus/cli": "^0.5.13", + "@wrnexus/cli": "^0.6.0", "eslint": "^9.0.0", "prettier": "latest", "tailwindcss": "^4.0.0", @@ -71,6 +73,6 @@ "typescript-eslint": "latest" }, "wrnexus": { - "version": "0.5.13" + "version": "0.6.0" } } diff --git a/public/docs-index.json b/public/docs-index.json index 0a8074fb..3a4c9c38 100644 --- a/public/docs-index.json +++ b/public/docs-index.json @@ -1,5 +1,5 @@ { - "version": "0.5.13", + "version": "0.6.0", "status": "private-developer-preview", "generatedAt": "2026-07-13", "documents": [ @@ -7,511 +7,525 @@ "url": "/", "title": "WRNexusJS", "section": "portal", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/access", "title": "access", "section": "portal", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/getting-started", "title": "getting started", "section": "portal", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/tutorial", "title": "tutorial", "section": "portal", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/architecture", "title": "architecture", "section": "portal", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/language", "title": "language", "section": "portal", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages", "title": "packages", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/guides/project-structure", "title": "project structure", "section": "guide", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/guides/routing", "title": "routing", "section": "guide", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/guides/pages-and-components", "title": "pages and components", "section": "guide", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/guides/server-data", "title": "server data", "section": "guide", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/guides/api-routes", "title": "api routes", "section": "guide", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/guides/middleware", "title": "middleware", "section": "guide", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/guides/forms-and-validation", "title": "forms and validation", "section": "guide", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/guides/authentication", "title": "authentication", "section": "guide", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/guides/authorization", "title": "authorization", "section": "guide", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/guides/security", "title": "security", "section": "guide", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/guides/database", "title": "database", "section": "guide", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/guides/uploads", "title": "uploads", "section": "guide", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/guides/realtime", "title": "realtime", "section": "guide", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/guides/pubsub", "title": "pubsub", "section": "guide", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/guides/queues", "title": "queues", "section": "guide", - "version": "0.5.13", + "version": "0.6.0", "stability": "experimental" }, { "url": "/guides/testing", "title": "testing", "section": "guide", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/guides/workspaces-and-gateway", "title": "workspaces and gateway", "section": "guide", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/guides/deployment", "title": "deployment", "section": "guide", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/guides/configuration-and-profiles", "title": "configuration and profiles", "section": "guide", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/guides/i18n-and-themes", "title": "i18n and themes", "section": "guide", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/guides/mobile", "title": "mobile", "section": "guide", - "version": "0.5.13", + "version": "0.6.0", "stability": "experimental" }, { "url": "/guides/observability", "title": "observability", "section": "guide", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/guides/upgrading", "title": "upgrading", "section": "guide", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/guides/troubleshooting", "title": "troubleshooting", "section": "guide", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/examples", "title": "examples", "section": "portal", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/showcase", "title": "showcase", "section": "portal", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/benchmarks", "title": "benchmarks", "section": "portal", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/roadmap", "title": "roadmap", "section": "portal", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/changelog", "title": "changelog", "section": "portal", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { - "url": "/releases/0.5.13", - "title": "0.5.13", + "url": "/releases/0.6.0", + "title": "0.6.0", "section": "portal", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/security", "title": "security", "section": "portal", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/support", "title": "support", "section": "portal", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/license", "title": "license", "section": "portal", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/search", "title": "search", "section": "portal", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/404", "title": "404", "section": "portal", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/ai", "title": "ai", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/auth", "title": "auth", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/authz", "title": "authz", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/captcha", "title": "captcha", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/cli", "title": "cli", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/compiler", "title": "compiler", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/core", "title": "core", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/csr", "title": "csr", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/db", "title": "db", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/dev-server", "title": "dev server", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/dev-toolbar", "title": "dev toolbar", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/encryption", "title": "encryption", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/helpers", "title": "helpers", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/i18n", "title": "i18n", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/jwt", "title": "jwt", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/mobile", "title": "mobile", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "experimental" }, { "url": "/packages/native", "title": "native", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/oauth", "title": "oauth", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/plugin", "title": "plugin", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/pubsub", "title": "pubsub", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/queue", "title": "queue", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/reactive", "title": "reactive", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/router", "title": "router", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/ssr", "title": "ssr", "section": "package", - "version": "0.5.13", + "version": "0.6.0", + "stability": "preview" + }, + { + "url": "/packages/store", + "title": "store", + "section": "package", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/styles", "title": "styles", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/syntax", "title": "syntax", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/test", "title": "test", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/tracking", "title": "tracking", "section": "package", - "version": "0.5.13", + "version": "0.6.0", + "stability": "preview" + }, + { + "url": "/packages/typecheck", + "title": "typecheck", + "section": "package", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/ui", "title": "ui", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/uploader", "title": "uploader", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" }, { "url": "/packages/validation", "title": "validation", "section": "package", - "version": "0.5.13", + "version": "0.6.0", "stability": "preview" } ] diff --git a/public/llms-full.txt b/public/llms-full.txt index 81858148..4ad3fb29 100644 --- a/public/llms-full.txt +++ b/public/llms-full.txt @@ -1,6 +1,6 @@ -# WRNexusJS documentation 0.5.13 +# WRNexusJS documentation 0.6.0 -Status: Private Developer Preview. This site documents 31 release-aligned packages. +Status: Private Developer Preview. This site documents 33 release-aligned packages. # WrNexus @@ -279,7 +279,7 @@ wrnexus eject # copy a Wire UI component's .wrn into app/compone 4. Style with Tailwind utility classes in the view, or theme tokens (`var(--wire-*)`), or `style { }`. 5. Never emit React/JSX, a manual router, or client-side island JS — the framework handles hydration. -Release: WRNexusJS 0.5.13 +Release: WRNexusJS 0.6.0 # Canonical documentation locations @@ -288,7 +288,7 @@ Release: WRNexusJS 0.5.13 # Installed package documentation -The following README files and declarations come from the installed private 0.5.13 release. +The following README files and declarations come from the installed private 0.6.0 release. ## @wrnexus/ai @@ -2074,8 +2074,8 @@ A file opens with `page ` or `component ` followed by a `{ ... }` bo ### Exported TypeScript declarations ```ts -import { PageAst as PageAst$1, WrnDiagnostic } from '@wrnexus/syntax'; -export { ActionBlock, ApiBlock, Attr, ComputedDecl, DataApiBlock, DataMode, EffectBlock, EventDecl, LexError, Lexer, LoadBlock, ModeFunctionsBlock, PageAst, ParseError, PropDecl, RealtimeBlock, SeoBlock, StateDecl, ViewNode, WrnDiagnostic, assertValidAst, diagnose, diagnosticFromError, eraseFunctionTypes, formatDiagnostic, inferredRuntimeType, parse, runtimeTypeOf } from '@wrnexus/syntax'; +import { PageAst as PageAst$1, StructuredImportDecl, WrnDiagnostic } from '@wrnexus/syntax'; +export { ActionBlock, ApiBlock, Attr, ComputedDecl, DataApiBlock, DataMode, EffectBlock, EventDecl, LexError, Lexer, LoadBlock, ModeFunctionsBlock, OutputDecl, PageAst, ParseError, PropDecl, RealtimeBlock, RuntimeFunctionDecl, SeoBlock, StateDecl, StateRuntime, StoreKind, StructuredImportDecl, ViewNode, WrnDiagnostic, assertValidAst, diagnose, diagnosticFromError, eraseFunctionTypes, formatDiagnostic, inferredRuntimeType, parse, runtimeTypeOf } from '@wrnexus/syntax'; import { PageAst } from '@wrnexus/syntax/parser'; /** @@ -2089,7 +2089,7 @@ import { PageAst } from '@wrnexus/syntax/parser'; * api="" -> SSR/client data binding declared in a mode block * ssrGet/ssrText -> legacy server-side API fetch + render * csrGet/csrText -> legacy browser-side API fetch + render - * style -> an inline page stylesheet + * style -> tagged local stylesheet metadata promoted by SSR * functions -> server-only helpers for API/realtime code * api M /p {b} -> export const M = async (ctx) => { b } * realtime {..} -> export const websocket = { evt(ws, ...args) { b } } @@ -2097,6 +2097,115 @@ import { PageAst } from '@wrnexus/syntax/parser'; declare function generate(ast: PageAst): string; +interface ComponentContractMetadata { + name: string; + kind: PageAst$1["kind"]; + props: Array<{ + name: string; + type: string; + required: boolean; + default?: string; + options?: string[]; + }>; + outputs: Array<{ + name: string; + payloadName?: string; + payloadType?: string; + }>; + functions: Array<{ + name: string; + runtime: string; + async: boolean; + parameters: Array<{ + name: string; + type: string; + optional: boolean; + }>; + returnType: string; + }>; + states: Array<{ + name: string; + runtime: string; + type: string; + initializer: string; + }>; + computed: Array<{ + name: string; + type: string; + expression: string; + }>; + imports: Array<{ + source: string; + typeOnly: boolean; + defaultImport?: string; + namedImports: string[]; + }>; +} +declare function createComponentContract(ast: PageAst$1): ComponentContractMetadata; + +interface RpcManifestEntry { + id: string; + component: string; + function: string; + parameters: Array<{ + name: string; + type: string; + optional: boolean; + }>; + returnType: string; +} +declare function rpcManifest(ast: PageAst$1): RpcManifestEntry[]; +declare function generateServerFunctionsModule(ast: PageAst$1): string; + +interface CompileTargets { + server: string; + browser: string; + declarations: string; + contract: ReturnType; + rpc: ReturnType; +} +declare function generateTargets(ast: PageAst$1): CompileTargets; + +declare function generateBrowserModule(ast: PageAst$1): string; + +declare function generateDeclarations(ast: PageAst$1): string; + +declare function generateStoreModule(ast: PageAst$1): string; +/** Standalone browser artifact for an imported `.wrn` store. */ +declare function generateStoreBrowserModule(ast: PageAst$1): string; + +type ImportMode = "legacy" | "compatible" | "explicit"; +interface ImportResolverOptions { + appRoot: string; + mode?: ImportMode; + aliases?: Record; +} +interface ResolvedImport { + declaration: StructuredImportDecl; + resolved?: string; + diagnostic?: { + code: string; + message: string; + severity: "error" | "warning"; + }; +} +declare function resolveWrnImport(declaration: StructuredImportDecl, importer: string, options: ImportResolverOptions): ResolvedImport; +declare function resolveWrnImports(declarations: StructuredImportDecl[], importer: string, options: ImportResolverOptions): ResolvedImport[]; + +interface WrnSourceMapEntry { + generatedLine: number; + sourceLine: number; + sourceColumn: number; + kind: string; +} +interface WrnSourceMap { + version: 1; + source: string; + generated: string; + mappings: WrnSourceMapEntry[]; +} +declare function createWrnSourceMap(source: string, generated: string): WrnSourceMap; + declare class NativeCompileError extends Error { constructor(message: string); } @@ -2161,7 +2270,7 @@ declare function compileWireFile(source: string, filePath?: string): string; /** Richer entry point returning the AST and structured diagnostics. */ declare function compile(source: string, filePath?: string): CompileResult; -export { type CompilationCache, type CompilationCacheEntry, type CompilationCacheOptions, type CompileResult, DependencyGraph, NativeCompileError, compilationKey, compile, compileNativeWireFile, compileWireFile, createCompilationCache, generate, generateNative }; +export { type CompilationCache, type CompilationCacheEntry, type CompilationCacheOptions, type CompileResult, DependencyGraph, NativeCompileError, compilationKey, compile, compileNativeWireFile, compileWireFile, createCompilationCache, createComponentContract, createWrnSourceMap, generate, generateBrowserModule, generateDeclarations, generateNative, generateServerFunctionsModule, generateStoreBrowserModule, generateStoreModule, generateTargets, resolveWrnImport, resolveWrnImports, rpcManifest }; ``` --- @@ -3754,6 +3863,52 @@ declare const NAV_RUNTIME: string; */ declare const REALTIME_RUNTIME: string; +type OutputHandler = (payload: T) => void | Promise; +interface OutputHost extends HTMLElement { + __wrnexusOutputHandlers?: Map>; +} +declare function registerOutputHandler(host: OutputHost, name: string, handler: OutputHandler): () => void; +declare function invokeOutput(host: OutputHost, name: string, payload?: T): Promise; +declare function createOutputProxy void>>(host: OutputHost): T; + +interface ServerCallOptions { + endpoint?: string; + signal?: AbortSignal; + headers?: HeadersInit; + csrfToken?: string; +} +declare class WrnServerCallError extends Error { + readonly code: string; + readonly status: number; + readonly details?: unknown | undefined; + constructor(message: string, code: string, status: number, details?: unknown | undefined); +} +declare function callServerFunction(component: string, functionName: string, args: TInput, options?: ServerCallOptions): Promise; +declare function createServerProxy Promise>>(component: string, options?: ServerCallOptions): T; + +declare function collectRefs(root: ParentNode): Record; + +interface ClientModuleScope { + output: Record void>; + server: Record Promise>; + props: Readonly>; + refs: Record; +} +declare function loadClientFunctions(url: string, scope: ClientModuleScope): Promise unknown>>; +declare function invalidateClientModule(url: string): void; + +interface HydrationScopeApi { + get(name: string): unknown; + set(name: string, value: unknown): void; + call(name: string, ...args: unknown[]): unknown; + snapshot(): Readonly>; + dispose(): void; +} +interface WrnexusBrowserGlobals { + __wrnexusHydrateScopes?(root?: ParentNode): void; + __wrnexusDisposeBehaviors?(root?: ParentNode): void; +} + /** * @wrnexus/csr — the browser reactive runtime. * @@ -3770,7 +3925,7 @@ declare function getNavRuntime(): string; /** The realtime client runtime served at `/__wrnexus/realtime.js`. */ declare function getRealtimeRuntime(): string; -export { NAV_RUNTIME, REACTIVE_RUNTIME, REALTIME_RUNTIME, getNavRuntime, getReactiveRuntime, getRealtimeRuntime }; +export { type ClientModuleScope, type HydrationScopeApi, NAV_RUNTIME, type OutputHandler, type OutputHost, REACTIVE_RUNTIME, REALTIME_RUNTIME, type ServerCallOptions, WrnServerCallError, type WrnexusBrowserGlobals, callServerFunction, collectRefs, createOutputProxy, createServerProxy, getNavRuntime, getReactiveRuntime, getRealtimeRuntime, invalidateClientModule, invokeOutput, loadClientFunctions, registerOutputHandler }; ``` --- @@ -7460,6 +7615,8 @@ interface Router { components: ComponentRef[]; /** Named page layouts (`app/layouts/.wrn`); a page picks one via `layout`. */ layouts: ComponentRef[]; + /** Typed global/page stores discovered under `app/stores/`. */ + stores: ComponentRef[]; /** Validation schemas (`app/schemas/.ts`) shared by API + forms. */ schemas: ComponentRef[]; matchPage(pathname: string): RouteMatch | null; @@ -7631,6 +7788,9 @@ return new Response(html, { headers: { "content-type": "text/html; charset=utf-8 ```ts import { PageMeta, SeoConfig } from '@wrnexus/core'; +export { RpcContext, RpcHandlerOptions, RpcManifestContract, RpcParameterContract, RpcRequestPayload, createRpcHandler } from './rpc.js'; +export { disposeRequestStores, renderStoreHydration, requestStoreContainer } from './store-context.js'; +import '@wrnexus/store'; /** * @wrnexus/ssr — server-side rendering. @@ -7671,6 +7831,8 @@ interface RenderOptions { defaultTitle?: string; /** Raw HTML injected at the end of `` (trusted, framework-controlled). */ extraHead?: string; + /** CSP nonce applied to framework-promoted `.wrn` style blocks. */ + styleNonce?: string; /** Raw HTML injected at the end of `` (trusted, framework-controlled). */ extraBody?: string; /** Attributes for the `` element, e.g. ` data-theme="dark"` (trusted). */ @@ -7689,6 +7851,16 @@ interface RenderOptions { * out of its element or attribute. */ declare function renderDocument(opts: RenderOptions): string; +interface ExtractedWrnexusStyles { + html: string; + styles: string; +} +/** + * Promote compiler-emitted `.wrn` style blocks out of rendered markup and into + * the document head. They are emitted after global stylesheets, deduplicated by + * stable id, ordered layout -> page -> component, and nonce-tagged for CSP. + */ +declare function extractWrnexusStyles(html: string, nonce?: string): ExtractedWrnexusStyles; interface StreamRenderOptions extends Omit { body: string | Promise | AsyncIterable; } @@ -7700,7 +7872,68 @@ interface StreamRenderOptions extends Omit { declare function renderDocumentStream(opts: StreamRenderOptions): ReadableStream; declare function streamDocumentResponse(opts: StreamRenderOptions, init?: ResponseInit): Response; -export { type RenderOptions, type RenderScript, type ScriptAsset, type StreamRenderOptions, renderDocument, renderDocumentStream, streamDocumentResponse }; +export { type RenderOptions, type RenderScript, type ScriptAsset, type StreamRenderOptions, extractWrnexusStyles, renderDocument, renderDocumentStream, streamDocumentResponse }; +``` + +--- + +## @wrnexus/store + +Documentation URL: https://wrnexusjs.dev/packages/store + +# @wrnexus/store + +@wrnexus/store — part of the WrNexus framework. + +Part of the WrNexus framework. + +### Exported TypeScript declarations + +```ts +import { StoreMutation, StoreFunction, StoreDefinition, StoreInstance, StoreCombinedState } from './types.js'; +export { PersistenceStorage, StoreActionContext, StoreActionDefinition, StoreInstanceCore, StoreKind, StoreLifecycleContext, StorePersistenceConfig, StoreRuntime } from './types.js'; + +declare function defineStore, A extends Record = Record, CS extends object = Record, SS extends object = Record>(definition: StoreDefinition): StoreDefinition; +interface StoreContainerOptions { + runtime: "server" | "client"; + request?: unknown; + routeId?: string; + hydration?: Record; + onMutation?: (mutation: StoreMutation) => void; +} +declare class StoreContainer { + readonly runtime: "server" | "client"; + readonly request?: unknown; + readonly routeId?: string; + private readonly instances; + private readonly hydration; + private readonly onMutation?; + private readonly lastMutations; + constructor(options: StoreContainerOptions); + use, CS extends object, SS extends object>(definition: StoreDefinition): Promise, C, A>>; + serialize(): Record; + inspect(): Array<{ + name: string; + kind: "global" | "page"; + state: Readonly>; + computed: Readonly>; + lastAction?: string; + changed: string[]; + hydrationSource: "server" | "persistence" | "initial"; + }>; + hotUpdate, CS extends object, SS extends object>(definition: StoreDefinition): Promise<{ + preserved: string[]; + reset: string[]; + }>; + disposePageStores(): Promise; + dispose(): Promise; +} +declare function createStoreContainer(options: StoreContainerOptions): StoreContainer; +declare function createStoreInstance, CS extends object, SS extends object>(definition: StoreDefinition, options: Omit & { + hydration?: unknown; +}): StoreInstance, C, A>; + +export { StoreCombinedState, StoreContainer, type StoreContainerOptions, StoreDefinition, StoreFunction, StoreInstance, StoreMutation, createStoreContainer, createStoreInstance, defineStore }; ``` --- @@ -8305,9 +8538,46 @@ interface NavigationConfig { */ mode?: "client" | "document"; } +interface ImportsConfig { + mode?: "legacy" | "compatible" | "explicit"; + autoImport?: boolean; + aliases?: Record; +} +interface TypesConfig { + strict?: boolean; + noImplicitAny?: boolean; + strictNullChecks?: boolean; + checkTemplates?: boolean; + checkComponentProps?: boolean; + generateDeclarations?: boolean; + globalTypes?: string; +} +interface FunctionsConfig { + legacyDefaultRuntime?: "current" | "client" | "server" | "shared"; +} +interface StoresConfig { + strictMutations?: boolean; + persistence?: boolean; +} +interface CompatibilityConfig { + legacyEmit?: boolean; + legacyEventProps?: boolean; + legacyComponentDiscovery?: boolean; + stringLayouts?: boolean; +} interface AppConfig { /** Compiler/dev/build plugins, resolved in deterministic pre/normal/post order. */ plugins?: PluginInput; + /** WRN v0.6 explicit import and compatibility resolution. */ + imports?: ImportsConfig; + /** TypeScript-backed .wrn type checking and declaration generation. */ + types?: TypesConfig; + /** Legacy function runtime behavior for existing applications. */ + functions?: FunctionsConfig; + /** Typed global/page store behavior. */ + stores?: StoresConfig; + /** Temporary v0.5 syntax compatibility switches. */ + compatibility?: CompatibilityConfig; /** Opt-in APIs that are not yet covered by stable compatibility guarantees. */ experimental?: ExperimentalConfig; /** Route and asset budgets plus build analyzer behavior. */ @@ -8506,10 +8776,10 @@ See `docs/WRN-LANGUAGE-SPEC-1.0.md` in the WRNexusJS repository. ```ts export { LexError, Lexer } from './tokenizer.js'; -export { ActionBlock, ApiBlock, Attr, ComputedDecl, DataApiBlock, DataMode, EffectBlock, EventDecl, LifecycleBlock, LoadBlock, ModeFunctionsBlock, PageAst, ParseError, PropDecl, RealtimeBlock, RealtimeHandler, SeoBlock, StateDecl, VOID_ELEMENTS, ViewNode, WatchBlock, parse, parseHtmlView } from './parser.js'; +export { A as ActionBlock, a as ApiBlock, b as Attr, C as ComputedDecl, D as DataApiBlock, c as DataMode, E as EffectBlock, d as EventDecl, F as FunctionParameterDecl, e as FunctionRuntime, L as LifecycleBlock, f as LoadBlock, M as ModeFunctionsBlock, O as OutputDecl, P as PageAst, g as ParseError, h as PersistDecl, i as PropDecl, R as RealtimeBlock, j as RealtimeHandler, k as RuntimeFunctionDecl, S as SeoBlock, l as StateDecl, m as StateRuntime, n as StoreKind, o as StoreLifecycleDecl, p as StructuredImportDecl, V as VOID_ELEMENTS, q as ViewNode, W as WatchBlock, r as parse, s as parseComputedDeclarations, t as parseHtmlView, u as parseOutputs, v as parsePersist, w as parseRuntimeFunctions, x as parseStateDeclarations, y as parseStoreLifecycle, z as parseStructuredImports, B as stripRuntimeFunctionModifiers } from './parser-BGaF5Zdu.js'; export { RuntimeType, eraseFunctionTypes, inferredRuntimeType, runtimeTypeOf, validateTypedInitializer } from './types.js'; import { WrnDiagnostic } from './diagnostics.js'; -export { DiagnoseOptions, WrnDiagnosticSeverity, WrnSourcePosition, assertValidAst, classifyParseError, diagnose, diagnosticFromError, formatDiagnostic, isHydrationStrategy, isRuntimeTarget, positionAt } from './diagnostics.js'; +export { DiagnoseOptions, WrnDiagnosticSeverity, WrnSourcePosition, assertValidAst, classifyParseError, containsReadonlyPropMutation, diagnose, diagnosticFromError, formatDiagnostic, isHydrationStrategy, isRuntimeTarget, positionAt } from './diagnostics.js'; export { WRN_DIAGNOSTIC_CODES, WRN_HYDRATION_STRATEGIES, WRN_LANGUAGE_VERSION, WRN_ROOT_KINDS, WRN_ROOT_MEMBERS, WRN_RUNTIME_TARGETS, WrnHydrationStrategy, WrnRootKind, WrnRootMember, WrnRuntimeTarget } from './spec.js'; /** Current stable syntax contract. Bump only when parsers/codegen need migration. */ @@ -9008,6 +9278,70 @@ export { type ErrorEvent, type ErrorSink, type TelemetryEnvelope, type Telemetry --- +## @wrnexus/typecheck + +Documentation URL: https://wrnexusjs.dev/packages/typecheck + +# @wrnexus/typecheck + +@wrnexus/typecheck — part of the WrNexus framework. + +Part of the WrNexus framework. + +### Exported TypeScript declarations + +```ts +import { PageAst } from '@wrnexus/syntax'; +export { componentContract, storeContract } from './contracts.js'; +export { findAppRoot, loadApplicationTypes } from './project.js'; + +interface WrnTypeDiagnostic { + code: string; + category: "error" | "warning" | "info"; + message: string; + file: string; + line: number; + column: number; + length: number; + expected?: string; + received?: string; + hint?: string; + related?: { + file: string; + line: number; + column: number; + message: string; + }; +} +interface TypecheckOptions { + filePath?: string; + appRoot?: string; + strict?: boolean; + noImplicitAny?: boolean; + strictNullChecks?: boolean; + checkRuntimeBoundaries?: boolean; +} +interface SourceMapping { + virtualStartLine: number; + virtualEndLine: number; + sourceStartLine: number; + sourceStartColumn: number; +} +interface VirtualTypeScriptModule { + ast: PageAst; + fileName: string; + code: string; + mappings: SourceMapping[]; +} +declare function virtualTypeScriptModule(source: string, filePath?: string, appRoot?: string): VirtualTypeScriptModule; +declare function checkWrnSource(source: string, options?: TypecheckOptions): WrnTypeDiagnostic[]; +declare function checkWrnFile(filePath: string, options?: Omit): WrnTypeDiagnostic[]; + +export { type TypecheckOptions, type VirtualTypeScriptModule, type WrnTypeDiagnostic, checkWrnFile, checkWrnSource, virtualTypeScriptModule }; +``` + +--- + ## @wrnexus/ui Documentation URL: https://wrnexusjs.dev/packages/ui @@ -10154,7 +10488,7 @@ Showcase: https://component.wrnexusjs.dev/ Mount: (legacy: data-component="Accordion") Category: base Purpose: Theme-aware, responsive accordion component. -Props: size: string = "default", color: string = "primary", variant: string = "default", class: string = "", id: string = "accordion", items: string = [], defaultOpen: string = [], multiple: boolean = false, alwaysOpen: boolean = false, disabled: boolean = false, indicator: string = "plus", indicatorPosition: string = "start", showIndicator: boolean = true, bordered: boolean = false, separated: boolean = false, flush: boolean = false, contentItalic: boolean = false +Props: size: string = "default", color: string = "primary", variant: string = "default", class: string = "", id: string = "accordion", items: unknown[] = [], defaultOpen: unknown[] = [], multiple: boolean = false, alwaysOpen: boolean = false, disabled: boolean = false, indicator: string = "plus", indicatorPosition: string = "start", showIndicator: boolean = true, bordered: boolean = false, separated: boolean = false, flush: boolean = false, contentItalic: boolean = false Slots: none Events: change, open, close @@ -10162,54 +10496,57 @@ Events: change, open, close ```wrn component Accordion { - props { - size = "default" - color = "primary" - variant = "default" - class = "" - - id = "accordion" - items = [] - defaultOpen = [] - multiple = false - alwaysOpen = false - disabled = false - - indicator = "plus" - indicatorPosition = "start" - showIndicator = true - bordered = false - separated = false - flush = false - contentItalic = false - - @event change = function - @event open = function - @event close = function + outputs { + change(payload: { value?: string | number | boolean | null; values?: Array; sourceEvent?: Event; [key: string]: string | number | boolean | null | object } | string | number | boolean | null) + open(payload: { sourceEvent?: Event; [key: string]: string | number | boolean | null | object }) + close(payload: { sourceEvent?: Event; [key: string]: string | number | boolean | null | object }) } + props { + size: string = "default" + color: string = "primary" + variant: string = "default" + class: string = "" + + id: string = "accordion" + items: unknown[] = [] + defaultOpen: unknown[] = [] + multiple: boolean = false + alwaysOpen: boolean = false + disabled: boolean = false + + indicator: string = "plus" + indicatorPosition: string = "start" + showIndicator: boolean = true + bordered: boolean = false + separated: boolean = false + flush: boolean = false + contentItalic: boolean = false + +} + state openValues = defaultOpen functions { - function itemValue(item, index) { + shared function itemValue(item, index) { return item.value !== undefined && item.value !== "" ? String(item.value) : String(index) } - function nestedValue(parent, parentIndex, item, index) { + shared function nestedValue(parent, parentIndex, item, index) { return itemValue(parent, parentIndex) + "." + itemValue(item, index) } - function isOpen(value) { + shared function isOpen(value) { return openValues.includes(value) } - function allowsMultiple() { + shared function allowsMultiple() { return multiple || alwaysOpen } - function dispatchAccordionEvent(sourceEvent, eventName, value, item, root, customEvent) { + client function dispatchAccordionEvent(sourceEvent, eventName, value, item, root, customEvent) { root = sourceEvent.currentTarget.closest("[data-wrn-accordion]") if (!root) { @@ -10227,7 +10564,7 @@ component Accordion { root.dispatchEvent(customEvent) } - function toggleItem(sourceEvent, value, item, wasOpen) { + client function toggleItem(sourceEvent, value, item, wasOpen) { if (disabled || item.disabled) { return } @@ -10374,7 +10711,7 @@ Showcase: https://component.wrnexusjs.dev/ Mount: (legacy: data-component="AdvancedDatePicker") Category: integrations Purpose: Theme-aware, responsive advanced date picker component. -Props: size: string = "default", color: string = "primary", title: string = "Advanced Date Picker", description: string = "", items: string = [], variant: string = "default", class: string = "" +Props: size: string = "default", color: string = "primary", title: string = "Advanced Date Picker", description: string = "", items: unknown[] = [], variant: string = "default", class: string = "" Slots: default Events: input, change, open, close, clear @@ -10382,19 +10719,22 @@ Events: input, change, open, close, clear ```wrn component AdvancedDatePicker { + outputs { + input(payload: { value?: string | number | boolean | null; values?: Array; sourceEvent?: Event; [key: string]: string | number | boolean | null | object } | string | number | boolean | null) + change(payload: { value?: string | number | boolean | null; values?: Array; sourceEvent?: Event; [key: string]: string | number | boolean | null | object } | string | number | boolean | null) + open(payload: { sourceEvent?: Event; [key: string]: string | number | boolean | null | object }) + close(payload: { sourceEvent?: Event; [key: string]: string | number | boolean | null | object }) + clear(payload: { value?: string | number | boolean | null; values?: Array; sourceEvent?: Event; [key: string]: string | number | boolean | null | object } | string | number | boolean | null) + } + props { - @event input = function - @event change = function - @event open = function - @event close = function - @event clear = function - size = "default" - color = "primary" - title = "Advanced Date Picker" - description = "" - items = [] - variant = "default" - class = "" +size: string = "default" + color: string = "primary" + title: string = "Advanced Date Picker" + description: string = "" + items: unknown[] = [] + variant: string = "default" + class: string = "" } view {
    @@ -10415,7 +10755,7 @@ Showcase: https://component.wrnexusjs.dev/ Mount: (legacy: data-component="AdvancedRangeSlider") Category: integrations Purpose: Theme-aware, responsive advanced range slider component. -Props: size: string = "default", color: string = "primary", title: string = "Advanced Range Slider", description: string = "", items: string = [], variant: string = "default", class: string = "" +Props: size: string = "default", color: string = "primary", title: string = "Advanced Range Slider", description: string = "", items: unknown[] = [], variant: string = "default", class: string = "" Slots: default Events: input, change, start, end @@ -10423,18 +10763,21 @@ Events: input, change, start, end ```wrn component AdvancedRangeSlider { + outputs { + input(payload: { value?: string | number | boolean | null; values?: Array; sourceEvent?: Event; [key: string]: string | number | boolean | null | object } | string | number | boolean | null) + change(payload: { value?: string | number | boolean | null; values?: Array; sourceEvent?: Event; [key: string]: string | number | boolean | null | object } | string | number | boolean | null) + start(payload: { sourceEvent?: Event; [key: string]: string | number | boolean | null | object }) + end(payload: { sourceEvent?: Event; [key: string]: string | number | boolean | null | object }) + } + props { - @event input = function - @event change = function - @event start = function - @event end = function - size = "default" - color = "primary" - title = "Advanced Range Slider" - description = "" - items = [] - variant = "default" - class = "" + size: string = "default" + color: string = "primary" + title: string = "Advanced Range Slider" + description: string = "" + items: unknown[] = [] + variant: string = "default" + class: string = "" } view {
    @@ -10455,7 +10798,7 @@ Showcase: https://component.wrnexusjs.dev/ Mount: (legacy: data-component="AdvancedSelect") Category: advanced-forms Purpose: Theme-aware, responsive advanced select component. -Props: size: string = "default", color: string = "primary", label: string = "Advanced Select", name: string = "", value: string = "", values: string = [], options: string = [], groups: string = [], placeholder: string = "Select an option", placeholderIcon: string = "", searchPlaceholder: string = "Search options…", multiple: boolean = false, searchable: boolean = true, defaultOpen: boolean = false, clearable: boolean = true, allowEmpty: boolean = true, tags: boolean = false, disabled: boolean = false, required: boolean = false, invalid: boolean = false, validationMessage: string = "", helpText: string = "", loading: boolean = false, loadingLabel: string = "Loading options…", emptyLabel: string = "No options found", selectedOptionsLabel: string = "Selected options", clearLabel: string = "Clear selection", createLabel: string = "Create", loadMoreLabel: string = "Load more", searchMode: string = "contains", searchFields: string = "label,description", minSearchLength: number = 0, searchResultLimit: number = 0, maxSelections: number = 0, showCounter: boolean = false, counterTemplate: string = "{selected} selected", optionTemplate: string = "default", selectedTemplate: string = "default", closeOnSelect: boolean = true, scrollToSelected: boolean = true, fixed: boolean = false, placement: string = "bottom", remote: boolean = false, remoteUrl: string = "", remoteQueryParam: string = "q", remoteDebounce: number = 250, remoteAutoLoad: boolean = true, infinite: boolean = false, hasMore: boolean = false, page: number = 1, class: string = "" +Props: size: string = "default", color: string = "primary", label: string = "Advanced Select", name: string = "", value: string = "", values: unknown[] = [], options: unknown[] = [], groups: unknown[] = [], placeholder: string = "Select an option", placeholderIcon: string = "", searchPlaceholder: string = "Search options…", multiple: boolean = false, searchable: boolean = true, defaultOpen: boolean = false, clearable: boolean = true, allowEmpty: boolean = true, tags: boolean = false, disabled: boolean = false, required: boolean = false, invalid: boolean = false, validationMessage: string = "", helpText: string = "", loading: boolean = false, loadingLabel: string = "Loading options…", emptyLabel: string = "No options found", selectedOptionsLabel: string = "Selected options", clearLabel: string = "Clear selection", createLabel: string = "Create", loadMoreLabel: string = "Load more", searchMode: string = "contains", searchFields: string = "label,description", minSearchLength: number = 0, searchResultLimit: number = 0, maxSelections: number = 0, showCounter: boolean = false, counterTemplate: string = "{selected} selected", optionTemplate: string = "default", selectedTemplate: string = "default", closeOnSelect: boolean = true, scrollToSelected: boolean = true, fixed: boolean = false, placement: string = "bottom", remote: boolean = false, remoteUrl: string = "", remoteQueryParam: string = "q", remoteDebounce: number = 250, remoteAutoLoad: boolean = true, infinite: boolean = false, hasMore: boolean = false, page: number = 1, class: string = "" Slots: none Events: search, select, change, clear, open, close, load, error @@ -10463,84 +10806,87 @@ Events: search, select, change, clear, open, close, load, error ```wrn component AdvancedSelect { + outputs { + search(payload: { value?: string | number | boolean | null; values?: Array; sourceEvent?: Event; [key: string]: string | number | boolean | null | object } | string | number | boolean | null) + select(payload: { value?: string | number | boolean | null; values?: Array; sourceEvent?: Event; [key: string]: string | number | boolean | null | object } | string | number | boolean | null) + change(payload: { value?: string | number | boolean | null; values?: Array; sourceEvent?: Event; [key: string]: string | number | boolean | null | object } | string | number | boolean | null) + clear(payload: { value?: string | number | boolean | null; values?: Array; sourceEvent?: Event; [key: string]: string | number | boolean | null | object } | string | number | boolean | null) + open(payload: { sourceEvent?: Event; [key: string]: string | number | boolean | null | object }) + close(payload: { sourceEvent?: Event; [key: string]: string | number | boolean | null | object }) + load(payload: { sourceEvent?: Event; [key: string]: string | number | boolean | null | object }) + error(payload: { error: Error | string; sourceEvent?: Event; [key: string]: string | number | boolean | null | object } | Error | string) + } + props { - size = "default" - color = "primary" - label = "Advanced Select" - name = "" - value = "" - values = [] - options = [] - groups = [] - placeholder = "Select an option" - placeholderIcon = "" - searchPlaceholder = "Search options…" - multiple = false - searchable = true - defaultOpen = false - clearable = true - allowEmpty = true - tags = false - disabled = false - required = false - invalid = false - validationMessage = "" - helpText = "" - loading = false - loadingLabel = "Loading options…" - emptyLabel = "No options found" - selectedOptionsLabel = "Selected options" - clearLabel = "Clear selection" - createLabel = "Create" - loadMoreLabel = "Load more" - searchMode = "contains" - searchFields = "label,description" - minSearchLength = 0 - searchResultLimit = 0 - maxSelections = 0 - showCounter = false - counterTemplate = "{selected} selected" - optionTemplate = "default" - selectedTemplate = "default" - closeOnSelect = true - scrollToSelected = true - fixed = false - placement = "bottom" - remote = false - remoteUrl = "" - remoteQueryParam = "q" - remoteDebounce = 250 - remoteAutoLoad = true - infinite = false - hasMore = false - page = 1 - class = "" - @event search = function - @event select = function - @event change = function - @event clear = function - @event open = function - @event close = function - @event load = function - @event error = function + size: string = "default" + color: string = "primary" + label: string = "Advanced Select" + name: string = "" + value: string = "" + values: unknown[] = [] + options: unknown[] = [] + groups: unknown[] = [] + placeholder: string = "Select an option" + placeholderIcon: string = "" + searchPlaceholder: string = "Search options…" + multiple: boolean = false + searchable: boolean = true + defaultOpen: boolean = false + clearable: boolean = true + allowEmpty: boolean = true + tags: boolean = false + disabled: boolean = false + required: boolean = false + invalid: boolean = false + validationMessage: string = "" + helpText: string = "" + loading: boolean = false + loadingLabel: string = "Loading options…" + emptyLabel: string = "No options found" + selectedOptionsLabel: string = "Selected options" + clearLabel: string = "Clear selection" + createLabel: string = "Create" + loadMoreLabel: string = "Load more" + searchMode: string = "contains" + searchFields: string = "label,description" + minSearchLength: number = 0 + searchResultLimit: number = 0 + maxSelections: number = 0 + showCounter: boolean = false + counterTemplate: string = "{selected} selected" + optionTemplate: string = "default" + selectedTemplate: string = "default" + closeOnSelect: boolean = true + scrollToSelected: boolean = true + fixed: boolean = false + placement: string = "bottom" + remote: boolean = false + remoteUrl: string = "" + remoteQueryParam: string = "q" + remoteDebounce: number = 250 + remoteAutoLoad: boolean = true + infinite: boolean = false + hasMore: boolean = false + page: number = 1 + class: string = "" } state open = defaultOpen - state query = "" - state activeIndex = -1 + state query: string = "" + state activeIndex: number = -1 state selectedValue = value state selectedValues = values functions { - function allOptions() { + shared function allOptions() { return [...groups.flatMap((group) => group.options || []), ...options] } - function searchableText(option) { + shared function searchableText(option) { return ((option.label || "") + " " + (option.description || "")).toLowerCase() } - function matches(option) { + shared function matches(option) { if (!query || query.length < Number(minSearchLength || 0)) { return true } @@ -10553,22 +10899,22 @@ component AdvancedSelect { return searchableText(option).includes(query.toLowerCase()) } - function matchingOptions(list) { + shared function matchingOptions(list) { return list.filter((option) => matches(option)) } - function visibleOptions(list) { + shared function visibleOptions(list) { if (searchResultLimit > 0) { return matchingOptions(list).slice(0, Number(searchResultLimit)) } return matchingOptions(list) } - function flatVisibleOptions() { + shared function flatVisibleOptions() { return visibleOptions(allOptions()) } - function isSelected(option) { + shared function isSelected(option) { return ( multiple ? selectedValues.includes(option.value) @@ -10576,15 +10922,15 @@ component AdvancedSelect { ) } - function selectedOptions() { + shared function selectedOptions() { return allOptions().filter((option) => isSelected(option)) } - function selectedCount() { + shared function selectedCount() { return multiple ? selectedValues.length : selectedValue ? 1 : 0 } - function counterText() { + shared function counterText() { return ( maxSelections ? selectedCount() + " / " + maxSelections + " selected" @@ -10592,7 +10938,7 @@ component AdvancedSelect { ) } - function selectedText() { + shared function selectedText() { return ( multiple ? selectedValues.join(", ") @@ -10602,11 +10948,11 @@ component AdvancedSelect { ) } - function triggerText() { + shared function triggerText() { return selectedCount() ? selectedText() : placeholder } - function canSelect(option) { + shared function canSelect(option) { if (option.disabled) { return false } @@ -10619,7 +10965,7 @@ component AdvancedSelect { return selectedCount() < maxSelections } - function chooseSingle(option) { + shared function chooseSingle(option) { if (!canSelect(option)) { return } @@ -10630,7 +10976,7 @@ component AdvancedSelect { } } - function chooseMultiple(option) { + shared function chooseMultiple(option) { if (!canSelect(option)) { return } @@ -10642,7 +10988,7 @@ component AdvancedSelect { query = "" } - function chooseOption(option) { + shared function chooseOption(option) { if (multiple) { chooseMultiple(option) return @@ -10650,7 +10996,7 @@ component AdvancedSelect { chooseSingle(option) } - function clearSelection(event) { + client function clearSelection(event) { event.stopPropagation() selectedValue = "" selectedValues = [] @@ -10658,7 +11004,7 @@ component AdvancedSelect { open = false } - function toggle() { + shared function toggle() { if (disabled) { return; }; @@ -10666,14 +11012,14 @@ component AdvancedSelect { activeIndex = open && flatVisibleOptions().length ? 0 : -1; } - function moveActive(direction) { + shared function moveActive(direction) { if (!flatVisibleOptions().length) { return } activeIndex = (activeIndex + direction + flatVisibleOptions().length) % flatVisibleOptions().length } - function handleKeydown(event) { + client function handleKeydown(event) { if (disabled) { return } @@ -10707,7 +11053,7 @@ component AdvancedSelect { } } - function optionIndex(option) { + shared function optionIndex(option) { return flatVisibleOptions().findIndex((item) => item.value === option.value) } } @@ -10928,7 +11274,7 @@ Showcase: https://component.wrnexusjs.dev/ Mount: (legacy: data-component="Alert") Category: base Purpose: Theme-aware, responsive alert component. -Props: size: string = "default", color: string = "info", variant: string = "soft", class: string = "", radius: string = "md", shadow: string = "sm", title: string = "Alert", description: string = "", items: string = [], actions: string = [], showIcon: boolean = false, icon: string = "", dismissible: boolean = false, dismissLabel: string = "Dismiss alert", role: string = "alert", live: string = "polite", linkLabel: string = "", linkHref: string = "", actionLabel: string = "", actionHref: string = "", compact: boolean = false +Props: size: string = "default", color: string = "info", variant: string = "soft", class: string = "", radius: string = "md", shadow: string = "sm", title: string = "Alert", description: string = "", items: unknown[] = [], actions: unknown[] = [], showIcon: boolean = false, icon: string = "", dismissible: boolean = false, dismissLabel: string = "Dismiss alert", role: string = "alert", live: string = "polite", linkLabel: string = "", linkHref: string = "", actionLabel: string = "", actionHref: string = "", compact: boolean = false Slots: none Events: dismiss, action @@ -10936,40 +11282,43 @@ Events: dismiss, action ```wrn component Alert { - props { - size = "default" - color = "info" - variant = "soft" - class = "" - radius = "md" - shadow = "sm" - - title = "Alert" - description = "" - items = [] - actions = [] - - showIcon = false - icon = "" - dismissible = false - dismissLabel = "Dismiss alert" - role = "alert" - live = "polite" - - linkLabel = "" - linkHref = "" - actionLabel = "" - actionHref = "" - compact = false - - @event dismiss = function - @event action = function + outputs { + dismiss(payload: { sourceEvent?: Event; [key: string]: string | number | boolean | null | object }) + action(payload: { sourceEvent?: Event; [key: string]: string | number | boolean | null | object }) } - state visible = true + props { + size: string = "default" + color: string = "info" + variant: string = "soft" + class: string = "" + radius: string = "md" + shadow: string = "sm" + + title: string = "Alert" + description: string = "" + items: unknown[] = [] + actions: unknown[] = [] + + showIcon: boolean = false + icon: string = "" + dismissible: boolean = false + dismissLabel: string = "Dismiss alert" + role: string = "alert" + live: string = "polite" + + linkLabel: string = "" + linkHref: string = "" + actionLabel: string = "" + actionHref: string = "" + compact: boolean = false + + } + + state visible: boolean = true functions { - function dispatchAlertEvent(sourceEvent, eventName, action, root, customEvent) { + client function dispatchAlertEvent(sourceEvent, eventName, action, root, customEvent) { root = sourceEvent.currentTarget.closest("[data-wrn-alert]") if (!root) { @@ -10987,12 +11336,12 @@ component Alert { root.dispatchEvent(customEvent) } - function dismissAlert(sourceEvent) { + client function dismissAlert(sourceEvent) { visible = false dispatchAlertEvent(sourceEvent, "dismiss", null) } - function selectAction(sourceEvent, action) { + client function selectAction(sourceEvent, action) { dispatchAlertEvent(sourceEvent, "action", action) } } @@ -11085,145 +11434,632 @@ component Alert { Showcase: https://component.wrnexusjs.dev/ Mount: (legacy: data-component="AnnouncementBar") -Category: blocks -Purpose: Accessible public announcement, emergency, maintenance, or status bar. -Props: badge: string = "", badgeIcon: string = "", message: string = "Announcement", description: string = "", icon: string = "icon-[lucide--megaphone]", actionLabel: string = "", actionHref: string = "", actionIcon: string = "", dismissible: boolean = false, dismissLabel: string = "Dismiss announcement", sticky: boolean = false, compact: boolean = false, size: string = "default", color: string = "primary", variant: string = "soft", role: string = "status", live: string = "polite", class: string = "" +Category: marketing +Purpose: Publish a responsive notice with badge, icon, supporting copy, action, dismiss behavior, and width controls. +Props: badge: string = "", badgeIcon: string = "", message: string = "Announcement", description: string = "", icon: string = "icon-[lucide--megaphone]", actionLabel: string = "", actionHref: string = "", actionIcon: string = "", dismissible: boolean = false, dismissLabel: string = "Dismiss announcement", sticky: boolean = false, compact: boolean = false, size: string = "default", width: string = "default", color: string = "primary", variant: string = "soft", role: string = "status", live: string = "polite", class: string = "" Slots: none -Events: none +Events: dismiss ### Complete .wrn source contract ```wrn component AnnouncementBar { - props { - badge = "" - badgeIcon = "" - message = "Announcement" - description = "" - icon = "icon-[lucide--megaphone]" - actionLabel = "" - actionHref = "" - actionIcon = "" - dismissible = false - dismissLabel = "Dismiss announcement" - sticky = false - compact = false - size = "default" - color = "primary" - variant = "soft" - role = "status" - live = "polite" - class = "" + outputs { + dismiss(payload: { sourceEvent?: Event; [key: string]: string | number | boolean | null | object }) } - state dismissed = false + props { +badge: string = "" + badgeIcon: string = "" + message: string = "Announcement" + description: string = "" + icon: string = "icon-[lucide--megaphone]" + actionLabel: string = "" + actionHref: string = "" + actionIcon: string = "" + dismissible: boolean = false + dismissLabel: string = "Dismiss announcement" + sticky: boolean = false + compact: boolean = false + size: string = "default" + width: string = "default" + color: string = "primary" + variant: string = "soft" + role: string = "status" + live: string = "polite" + class: string = "" + } + + state dismissed: boolean = false view { } + + style { + .wire-announcement { + --announcement-accent: var(--wire-color-primary); + --announcement-contrast: var(--wire-color-primary-contrast, #ffffff); + --announcement-soft: var(--wire-color-primary-soft); + --announcement-muted: var(--wire-color-primary-muted); + + position: relative; + z-index: 40; + display: block; + width: 100vw; + max-width: 100vw; + margin-inline: calc(50% - 50vw); + color: var(--wire-color-text); + } + + .wire-announcement__surface { + width: min(calc(100% - 2rem), 72rem); + margin-inline: auto; + } + + .wire-announcement[data-width="wide"] .wire-announcement__surface { + width: min(calc(100% - 2rem), 90rem); + } + + .wire-announcement[data-width="full"] .wire-announcement__surface { + width: 100%; + max-width: none; + margin-inline: 0; + border-inline: 0; + border-radius: 0; + } + + .wire-announcement[data-sticky="true"] { + position: sticky; + top: 0; + } + + .wire-announcement[data-color="secondary"] { + --announcement-accent: var(--wire-color-secondary); + --announcement-contrast: var(--wire-color-secondary-contrast, #ffffff); + --announcement-soft: var(--wire-color-secondary-soft); + --announcement-muted: var(--wire-color-secondary-muted); + } + + .wire-announcement[data-color="info"] { + --announcement-accent: var(--wire-color-info); + --announcement-contrast: var(--wire-color-info-contrast, #ffffff); + --announcement-soft: var(--wire-color-info-soft); + --announcement-muted: var(--wire-color-info-muted); + } + + .wire-announcement[data-color="success"] { + --announcement-accent: var(--wire-color-success); + --announcement-contrast: var(--wire-color-success-contrast, #ffffff); + --announcement-soft: var(--wire-color-success-soft); + --announcement-muted: var(--wire-color-success-muted); + } + + .wire-announcement[data-color="warning"] { + --announcement-accent: var(--wire-color-warning); + --announcement-contrast: var(--wire-color-warning-contrast, #111827); + --announcement-soft: var(--wire-color-warning-soft); + --announcement-muted: var(--wire-color-warning-muted); + } + + .wire-announcement[data-color="danger"] { + --announcement-accent: var(--wire-color-danger); + --announcement-contrast: var(--wire-color-danger-contrast, #ffffff); + --announcement-soft: var(--wire-color-danger-soft); + --announcement-muted: var(--wire-color-danger-muted); + } + + .wire-announcement__surface { + position: relative; + isolation: isolate; + overflow: hidden; + background: var(--wire-color-surface-raised); + border: 1px solid var(--wire-color-border); + border-radius: 1.25rem; + box-shadow: + 0 1px 2px rgb(0 0 0 / 0.04), + 0 12px 32px rgb(0 0 0 / 0.08); + } + + .wire-announcement[data-variant="soft"] .wire-announcement__surface { + background: + linear-gradient( + 135deg, + color-mix(in srgb, var(--announcement-soft) 86%, var(--wire-color-surface-raised)), + var(--wire-color-surface-raised) + ); + border-color: color-mix(in srgb, var(--announcement-accent) 28%, var(--wire-color-border)); + } + + .wire-announcement[data-variant="outline"] .wire-announcement__surface { + background: transparent; + border-color: color-mix(in srgb, var(--announcement-accent) 46%, var(--wire-color-border)); + box-shadow: none; + } + + .wire-announcement[data-variant="minimal"] .wire-announcement__surface { + background: transparent; + border-color: transparent; + border-radius: 0; + box-shadow: none; + } + + .wire-announcement[data-variant="solid"] { + color: var(--announcement-contrast); + } + + .wire-announcement[data-variant="solid"] .wire-announcement__surface { + background: + radial-gradient( + circle at 8% 15%, + color-mix(in srgb, var(--announcement-contrast) 14%, transparent), + transparent 30% + ), + linear-gradient( + 135deg, + color-mix(in srgb, var(--announcement-accent) 96%, white 4%), + color-mix(in srgb, var(--announcement-accent) 76%, black 24%) + ); + border-color: color-mix(in srgb, var(--announcement-contrast) 28%, transparent); + box-shadow: + 0 1px 0 color-mix(in srgb, var(--announcement-contrast) 20%, transparent) inset, + 0 18px 46px color-mix(in srgb, var(--announcement-accent) 30%, transparent); + } + + .wire-announcement__accent { + position: absolute; + z-index: -1; + inset-block: 0; + inset-inline-start: 0; + width: 0.25rem; + background: var(--announcement-accent); + } + + .wire-announcement[data-variant="solid"] .wire-announcement__accent, + .wire-announcement[data-variant="minimal"] .wire-announcement__accent { + display: none; + } + + .wire-announcement__glow { + position: absolute; + z-index: -1; + display: block; + border-radius: 999px; + pointer-events: none; + filter: blur(3rem); + opacity: 0.28; + } + + .wire-announcement__glow--one { + width: 16rem; + height: 16rem; + inset-block-start: -10rem; + inset-inline-end: -4rem; + background: var(--announcement-muted); + } + + .wire-announcement__glow--two { + width: 10rem; + height: 10rem; + inset-block-end: -7rem; + inset-inline-start: 28%; + background: var(--announcement-soft); + opacity: 0.18; + } + + .wire-announcement[data-variant="solid"] .wire-announcement__glow { + background: var(--announcement-contrast); + opacity: 0.1; + } + + .wire-announcement[data-variant="minimal"] .wire-announcement__glow { + display: none; + } + + .wire-announcement__inner { + position: relative; + display: flex; + flex-direction: column; + gap: 1rem; + width: 100%; + padding: 1rem 1.125rem; + } + + .wire-announcement[data-size="sm"] .wire-announcement__inner, + .wire-announcement[data-compact="true"] .wire-announcement__inner { + padding-block: 0.75rem; + } + + .wire-announcement[data-size="lg"] .wire-announcement__inner { + padding: 1.25rem 1.5rem; + } + + .wire-announcement__content { + display: flex; + align-items: flex-start; + gap: 0.875rem; + min-width: 0; + } + + .wire-announcement__icon { + display: inline-flex; + flex: 0 0 auto; + align-items: center; + justify-content: center; + width: 2.75rem; + height: 2.75rem; + color: var(--announcement-accent); + background: var(--announcement-soft); + border: 1px solid color-mix(in srgb, var(--announcement-accent) 20%, transparent); + border-radius: 0.875rem; + box-shadow: 0 8px 20px color-mix(in srgb, var(--announcement-accent) 12%, transparent); + } + + .wire-announcement__icon > span { + width: 1.2rem; + height: 1.2rem; + } + + .wire-announcement[data-size="sm"] .wire-announcement__icon, + .wire-announcement[data-compact="true"] .wire-announcement__icon { + width: 2.35rem; + height: 2.35rem; + border-radius: 0.75rem; + } + + .wire-announcement[data-size="lg"] .wire-announcement__icon { + width: 3.15rem; + height: 3.15rem; + } + + .wire-announcement[data-variant="solid"] .wire-announcement__icon { + color: var(--announcement-contrast); + background: color-mix(in srgb, var(--announcement-contrast) 12%, transparent); + border-color: color-mix(in srgb, var(--announcement-contrast) 22%, transparent); + box-shadow: none; + } + + .wire-announcement__copy { + flex: 1 1 auto; + min-width: 0; + padding-top: 0.1rem; + } + + .wire-announcement__headline { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 0.55rem 0.8rem; + } + + .wire-announcement__badge { + display: inline-flex; + flex: 0 0 auto; + align-items: center; + gap: 0.35rem; + min-height: 1.6rem; + padding: 0.25rem 0.65rem; + color: var(--announcement-accent); + font-size: 0.6875rem; + font-weight: 700; + line-height: 1; + white-space: nowrap; + background: var(--announcement-soft); + border: 1px solid color-mix(in srgb, var(--announcement-accent) 22%, transparent); + border-radius: 999px; + } + + .wire-announcement__badge > span:first-child:not(:last-child) { + width: 0.8rem; + height: 0.8rem; + } + + .wire-announcement[data-variant="solid"] .wire-announcement__badge { + color: var(--announcement-contrast); + background: color-mix(in srgb, var(--announcement-contrast) 13%, transparent); + border-color: color-mix(in srgb, var(--announcement-contrast) 24%, transparent); + } + + .wire-announcement__message { + margin: 0; + color: var(--wire-color-text); + font-size: 0.9375rem; + font-weight: 650; + line-height: 1.5; + } + + .wire-announcement[data-size="sm"] .wire-announcement__message, + .wire-announcement[data-compact="true"] .wire-announcement__message { + font-size: 0.875rem; + } + + .wire-announcement[data-size="lg"] .wire-announcement__message { + font-size: 1rem; + } + + .wire-announcement[data-variant="solid"] .wire-announcement__message { + color: var(--announcement-contrast); + } + + .wire-announcement__description { + max-width: 52rem; + margin: 0.28rem 0 0; + color: var(--wire-color-text-muted); + font-size: 0.8125rem; + line-height: 1.55; + } + + .wire-announcement[data-size="lg"] .wire-announcement__description { + font-size: 0.875rem; + } + + .wire-announcement[data-variant="solid"] .wire-announcement__description { + color: color-mix(in srgb, var(--announcement-contrast) 76%, transparent); + } + + .wire-announcement__actions { + display: flex; + flex: 0 0 auto; + align-items: center; + gap: 0.55rem; + padding-inline-start: 3.625rem; + } + + .wire-announcement__action, + .wire-announcement__dismiss { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 2.5rem; + color: var(--wire-color-text); + font-size: 0.8125rem; + font-weight: 650; + text-decoration: none; + background: var(--wire-color-surface-raised); + border: 1px solid var(--wire-color-border); + border-radius: 0.75rem; + box-shadow: 0 5px 14px rgb(0 0 0 / 0.06); + transition: + transform 160ms ease, + border-color 160ms ease, + background-color 160ms ease, + box-shadow 160ms ease; + } + + .wire-announcement__action { + gap: 0.45rem; + padding: 0.55rem 0.9rem; + } + + .wire-announcement__action > span:last-child { + width: 0.95rem; + height: 0.95rem; + transition: transform 160ms ease; + } + + .wire-announcement__dismiss { + width: 2.5rem; + padding: 0; + cursor: pointer; + } + + .wire-announcement__dismiss > span { + width: 1rem; + height: 1rem; + } + + .wire-announcement__action:hover, + .wire-announcement__dismiss:hover { + transform: translateY(-1px); + border-color: color-mix(in srgb, var(--announcement-accent) 42%, var(--wire-color-border)); + box-shadow: 0 8px 20px rgb(0 0 0 / 0.1); + } + + .wire-announcement__action:hover > span:last-child { + transform: translateX(0.16rem); + } + + .wire-announcement__action:focus-visible, + .wire-announcement__dismiss:focus-visible { + outline: 2px solid var(--wire-color-focus, var(--announcement-accent)); + outline-offset: 3px; + } + + .wire-announcement[data-variant="solid"] .wire-announcement__action { + color: var(--announcement-accent); + background: var(--announcement-contrast); + border-color: transparent; + box-shadow: 0 8px 22px color-mix(in srgb, black 18%, transparent); + } + + .wire-announcement[data-variant="solid"] .wire-announcement__dismiss { + color: var(--announcement-contrast); + background: color-mix(in srgb, var(--announcement-contrast) 13%, transparent); + border-color: color-mix(in srgb, var(--announcement-contrast) 24%, transparent); + box-shadow: none; + } + + .wire-announcement[data-variant="solid"] .wire-announcement__action:hover { + background: color-mix(in srgb, var(--announcement-contrast) 92%, transparent); + } + + .wire-announcement[data-variant="solid"] .wire-announcement__dismiss:hover { + background: color-mix(in srgb, var(--announcement-contrast) 20%, transparent); + border-color: color-mix(in srgb, var(--announcement-contrast) 34%, transparent); + } + + @media (min-width: 768px) { + .wire-announcement__inner { + flex-direction: row; + align-items: center; + justify-content: space-between; + gap: 1.5rem; + } + + .wire-announcement__content { + flex: 1 1 auto; + } + + .wire-announcement__actions { + justify-content: flex-end; + padding-inline-start: 0; + } + } + + @media (max-width: 639px) { + .wire-announcement__surface, + .wire-announcement[data-width="wide"] .wire-announcement__surface { + width: calc(100% - 1rem); + } + + .wire-announcement[data-width="full"] .wire-announcement__surface { + width: 100%; + border-radius: 0; + } + + .wire-announcement__surface { + border-radius: 1rem; + } + + .wire-announcement__inner { + padding-inline: 0.9rem; + } + + .wire-announcement__actions { + width: 100%; + padding-inline-start: 3.625rem; + } + + .wire-announcement__action { + flex: 1 1 auto; + } + } + + @media (prefers-reduced-motion: reduce) { + .wire-announcement__action, + .wire-announcement__dismiss, + .wire-announcement__action > span:last-child { + transition: none; + } + + .wire-announcement__action:hover, + .wire-announcement__dismiss:hover, + .wire-announcement__action:hover > span:last-child { + transform: none; + } + } + } } ``` @@ -11233,8 +12069,8 @@ component AnnouncementBar { Showcase: https://component.wrnexusjs.dev/ Mount: (legacy: data-component="AuthForm") -Category: forms -Purpose: Reusable authentication form for sign-in, registration, recovery, reset, and MFA. +Category: core +Purpose: Reusable auth form component. Props: size: string = "default", color: string = "primary", mode: string = "sign-in", action: string = "/api/auth/login", method: string = "post", title: string = "Sign in", description: string = "", returnTo: string = "", schema: string = "", showRemember: boolean = true, showName: boolean = true, submitLabel: string = "Continue", class: string = "" Slots: default Events: submit, change, input, focus, blur @@ -11243,29 +12079,32 @@ Events: submit, change, input, focus, blur ```wrn component AuthForm { + outputs { + submit(payload: { event: Event; mode: string; action: string }) + change(payload: { value?: string | number | boolean | null; values?: Array; sourceEvent?: Event; [key: string]: string | number | boolean | null | object } | string | number | boolean | null) + input(payload: { value?: string | number | boolean | null; values?: Array; sourceEvent?: Event; [key: string]: string | number | boolean | null | object } | string | number | boolean | null) + focus(payload: { sourceEvent?: Event; [key: string]: string | number | boolean | null | object }) + blur(payload: { sourceEvent?: Event; [key: string]: string | number | boolean | null | object }) + } + props { - @event submit = function - @event change = function - @event input = function - @event focus = function - @event blur = function - size = "default" - color = "primary" - mode = "sign-in" - action = "/api/auth/login" - method = "post" - title = "Sign in" - description = "" - returnTo = "" - schema = "" - showRemember = true - showName = true - submitLabel = "Continue" - class = "" +size: string = "default" + color: string = "primary" + mode: string = "sign-in" + action: string = "/api/auth/login" + method: string = "post" + title: string = "Sign in" + description: string = "" + returnTo: string = "" + schema: string = "" + showRemember: boolean = true + showName: boolean = true + submitLabel: string = "Continue" + class: string = "" } functions { - function schemaName() { + shared function schemaName() { if (schema) return schema if (mode === "sign-in") return "auth-login" if (mode === "register") return "auth-register" @@ -11275,12 +12114,12 @@ component AuthForm { return "auth-empty" } - function submitForm(event) { - $emit("submit", { event: event, mode: mode, action: action }) + client function submitForm(event) { + output.submit({ event: event, mode: mode, action: action }) } - function fieldEvent(type, event) { - const detail = event.detail || {} - $emit(type, { event: event, name: detail.name || "", value: detail.value || "" }) + client function fieldEvent(type, payload) { + const detail = payload || {} + output[type]({ sourceEvent: detail.sourceEvent, name: detail.name || "", value: detail.value || "" }) } } @@ -11296,20 +12135,20 @@ component AuthForm { data-schema="{schemaName()}" data-wrnexus-runtime="auth" novalidate="true" - @submit="submitForm($event)" + @submit="submitForm(event)" > {#if returnTo}{/if} {#if mode === "register" && showName} - + {/if} {#if mode === "sign-in" || mode === "register" || mode === "recover"} - + {/if} {#if mode === "sign-in" || mode === "register" || mode === "reset"} - + {/if} {#if mode === "register" || mode === "reset"} - + {/if} {#if mode === "mfa"} @@ -11334,9 +12173,9 @@ component AuthForm { Showcase: https://component.wrnexusjs.dev/ Mount: (legacy: data-component="AuthSplitLayout") -Category: layout -Purpose: Responsive 50/50 authentication layout with content and form regions. -Props: size: string = "default", color: string = "primary", eyebrow: string = "Secure identity", title: string = "Welcome back", description: string = "", brand: string = "Police Management System", features: string = [], class: string = "" +Category: core +Purpose: Reusable auth split layout component. +Props: size: string = "default", color: string = "primary", eyebrow: string = "Secure identity", title: string = "Welcome back", description: string = "", brand: string = "Police Management System", features: unknown[] = [], class: string = "" Slots: aside-extra, form Events: none @@ -11345,14 +12184,14 @@ Events: none ```wrn component AuthSplitLayout { props { - size = "default" - color = "primary" - eyebrow = "Secure identity" - title = "Welcome back" - description = "" - brand = "Police Management System" - features = [] - class = "" + size: string = "default" + color: string = "primary" + eyebrow: string = "Secure identity" + title: string = "Welcome back" + description: string = "" + brand: string = "Police Management System" + features: unknown[] = [] + class: string = "" } view { @@ -11444,31 +12283,34 @@ Events: load, error, click ```wrn component Avatar { + outputs { + load(payload: { sourceEvent?: Event; [key: string]: string | number | boolean | null | object }) + error(payload: { error: Error | string; sourceEvent?: Event; [key: string]: string | number | boolean | null | object } | Error | string) + click(payload: { sourceEvent?: Event; [key: string]: string | number | boolean | null | object }) + } + props { - @event load = function - @event error = function - @event click = function - src = "" - alt = "" - initials = "" - size = "md" - color = "primary" - variant = "solid" - shape = "circle" +src: string = "" + alt: string = "" + initials: string = "" + size: string = "md" + color: string = "primary" + variant: string = "solid" + shape: string = "circle" - status = "" - statusLabel = "" - statusPosition = "bottom" + status: string = "" + statusLabel: string = "" + statusPosition: string = "bottom" - badge = "" - badgeIcon = "" - badgeLabel = "" + badge: string = "" + badgeIcon: string = "" + badgeLabel: string = "" - tooltip = "" - name = "" - description = "" - loading = "lazy" - class = "" + tooltip: string = "" + name: string = "" + description: string = "" + loading: string = "lazy" + class: string = "" } view { @@ -11540,7 +12382,7 @@ Showcase: https://component.wrnexusjs.dev/ Mount: (legacy: data-component="AvatarGroup") Category: base Purpose: Theme-aware, responsive avatar group component. -Props: items: string = [], size: string = "md", color: string = "primary", variant: string = "solid", shape: string = "circle", layout: string = "stack", maxVisible: number = 4, columns: number = 3, borderColor: string = "", showTooltips: boolean = true, overflowLabel: string = "Show remaining members", class: string = "" +Props: items: unknown[] = [], size: string = "md", color: string = "primary", variant: string = "solid", shape: string = "circle", layout: string = "stack", maxVisible: number = 4, columns: number = 3, borderColor: string = "", showTooltips: boolean = true, overflowLabel: string = "Show remaining members", class: string = "" Slots: none Events: overflow @@ -11548,35 +12390,38 @@ Events: overflow ```wrn component AvatarGroup { - props { - items = [] - size = "md" - color = "primary" - variant = "solid" - shape = "circle" - layout = "stack" - maxVisible = 4 - columns = 3 - borderColor = "" - showTooltips = true - overflowLabel = "Show remaining members" - class = "" - - @event overflow = function + outputs { + overflow(payload: { sourceEvent?: Event; value: string | number | boolean | null | object; [key: string]: string | number | boolean | null | object } | string | number | boolean | null | object[]) } - state overflowOpen = false + props { + items: unknown[] = [] + size: string = "md" + color: string = "primary" + variant: string = "solid" + shape: string = "circle" + layout: string = "stack" + maxVisible: number = 4 + columns: number = 3 + borderColor: string = "" + showTooltips: boolean = true + overflowLabel: string = "Show remaining members" + class: string = "" + +} + + state overflowOpen: boolean = false functions { - function visibleMembers() { + shared function visibleMembers() { return items.slice(0, Number(maxVisible)) } - function hiddenMembers() { + shared function hiddenMembers() { return items.slice(Number(maxVisible)) } - function toggleOverflow(sourceEvent, root, customEvent) { + client function toggleOverflow(sourceEvent, root, customEvent) { overflowOpen = !overflowOpen root = sourceEvent.currentTarget.closest("[data-wrn-avatar-group]") @@ -11707,8 +12552,8 @@ component AvatarGroup { Showcase: https://component.wrnexusjs.dev/ Mount: (legacy: data-component="BackToTop") Category: navigation -Purpose: Accessible scroll-to-top control with visibility threshold. -Props: threshold: number = 500, label: string = "Back to top", ariaLabel: string = "Scroll back to top", icon: string = "icon-[lucide--arrow-up]", position: string = "right", offset: string = "md", behavior: string = "smooth", showProgress: boolean = false, size: string = "default", color: string = "primary", variant: string = "solid", class: string = "" +Purpose: Provide a responsive floating control that returns long pages to the top and can show scroll progress. +Props: threshold: number = 500, label: string = "Back to top", ariaLabel: string = "Scroll back to top", icon: string = "icon-[lucide--arrow-up]", position: string = "right", offset: string = "md", behavior: string = "smooth", showProgress: boolean = false, showLabel: boolean = false, alwaysVisible: boolean = false, size: string = "default", color: string = "primary", variant: string = "solid", shape: string = "round", class: string = "" Slots: none Events: none @@ -11717,70 +12562,338 @@ Events: none ```wrn component BackToTop { props { - threshold = 500 - label = "Back to top" - ariaLabel = "Scroll back to top" - icon = "icon-[lucide--arrow-up]" - position = "right" - offset = "md" - behavior = "smooth" - showProgress = false - size = "default" - color = "primary" - variant = "solid" - class = "" + threshold: number = 500 + label: string = "Back to top" + ariaLabel: string = "Scroll back to top" + icon: string = "icon-[lucide--arrow-up]" + position: string = "right" + offset: string = "md" + behavior: string = "smooth" + showProgress: boolean = false + showLabel: boolean = false + alwaysVisible: boolean = false + size: string = "default" + color: string = "primary" + variant: string = "solid" + shape: string = "round" + class: string = "" } - state visible = false - state progress = 0 + state visible: boolean = false + state progress: number = 0 view { } style { - .wire-back-to-top-progress { + .wire-back-to-top { + --back-accent: var(--wire-color-primary); + --back-accent-hover: var(--wire-color-primary-hover); + --back-accent-soft: var(--wire-color-primary-soft); + --back-contrast: var(--wire-color-primary-contrast); + + position: fixed; + z-index: 70; + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 3rem; + min-height: 3rem; + padding: 0; + color: var(--back-contrast); + background: transparent; + border: 0; + border-radius: 999px; + cursor: pointer; + filter: drop-shadow(0 14px 30px color-mix(in srgb, black 22%, transparent)); + transition: + transform 180ms ease, + opacity 180ms ease, + filter 180ms ease; + } + + .wire-back-to-top[data-color="secondary"] { + --back-accent: var(--wire-color-secondary); + --back-accent-hover: var(--wire-color-secondary-hover); + --back-accent-soft: var(--wire-color-secondary-soft); + --back-contrast: var(--wire-color-secondary-contrast); + } + + .wire-back-to-top[data-color="info"] { + --back-accent: var(--wire-color-info); + --back-accent-hover: var(--wire-color-info-hover); + --back-accent-soft: var(--wire-color-info-soft); + --back-contrast: var(--wire-color-info-contrast); + } + + .wire-back-to-top[data-color="success"] { + --back-accent: var(--wire-color-success); + --back-accent-hover: var(--wire-color-success-hover); + --back-accent-soft: var(--wire-color-success-soft); + --back-contrast: var(--wire-color-success-contrast); + } + + .wire-back-to-top[data-color="warning"] { + --back-accent: var(--wire-color-warning); + --back-accent-hover: var(--wire-color-warning-hover); + --back-accent-soft: var(--wire-color-warning-soft); + --back-contrast: var(--wire-color-warning-contrast); + } + + .wire-back-to-top[data-color="danger"] { + --back-accent: var(--wire-color-danger); + --back-accent-hover: var(--wire-color-danger-hover); + --back-accent-soft: var(--wire-color-danger-soft); + --back-contrast: var(--wire-color-danger-contrast); + } + + .wire-back-to-top[data-position="right"] { + right: 1.5rem; + } + + .wire-back-to-top[data-position="left"] { + left: 1.5rem; + } + + .wire-back-to-top[data-position="center"] { + left: 50%; + transform: translateX(-50%); + } + + .wire-back-to-top[data-position="center"]:hover { + transform: translateX(-50%) translateY(-3px); + } + + .wire-back-to-top[data-offset="sm"] { + bottom: 1rem; + } + + .wire-back-to-top[data-offset="md"] { + bottom: 1.5rem; + } + + .wire-back-to-top[data-offset="lg"] { + bottom: 2rem; + } + + .wire-back-to-top[data-offset="xl"] { + bottom: 3rem; + } + + .wire-back-to-top[data-size="sm"] { + min-width: 2.5rem; + min-height: 2.5rem; + } + + .wire-back-to-top[data-size="lg"] { + min-width: 3.5rem; + min-height: 3.5rem; + } + + .wire-back-to-top[data-show-label="true"] { + min-width: 0; + } + + .wire-back-to-top:hover { + transform: translateY(-3px); + filter: drop-shadow(0 18px 36px color-mix(in srgb, var(--back-accent) 24%, transparent)); + } + + .wire-back-to-top:active { + transform: translateY(-1px) scale(0.98); + } + + .wire-back-to-top__surface { + position: relative; + z-index: 2; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.55rem; + min-width: 3rem; + min-height: 3rem; + padding: 0.75rem; + color: var(--back-contrast); + background: + linear-gradient(145deg, color-mix(in srgb, white 10%, transparent), transparent 56%), + var(--back-accent); + border: 1px solid color-mix(in srgb, white 18%, transparent); + border-radius: inherit; + box-shadow: + 0 1px 0 color-mix(in srgb, white 20%, transparent) inset, + 0 10px 24px color-mix(in srgb, black 18%, transparent); + backdrop-filter: blur(12px); + transition: + background-color 160ms ease, + border-color 160ms ease, + color 160ms ease; + } + + .wire-back-to-top[data-size="sm"] .wire-back-to-top__surface { + min-width: 2.5rem; + min-height: 2.5rem; + padding: 0.58rem; + } + + .wire-back-to-top[data-size="lg"] .wire-back-to-top__surface { + min-width: 3.5rem; + min-height: 3.5rem; + padding: 0.9rem; + } + + .wire-back-to-top[data-show-label="true"] .wire-back-to-top__surface { + min-width: 0; + padding-inline: 1rem; + } + + .wire-back-to-top[data-variant="outline"] .wire-back-to-top__surface { + color: var(--back-accent); + background: color-mix(in srgb, var(--wire-color-surface-raised) 88%, transparent); + border-color: color-mix(in srgb, var(--back-accent) 46%, var(--wire-color-border)); + } + + .wire-back-to-top[data-variant="soft"] .wire-back-to-top__surface { + color: var(--back-accent); + background: color-mix(in srgb, var(--back-accent-soft) 88%, var(--wire-color-surface-raised)); + border-color: color-mix(in srgb, var(--back-accent) 22%, var(--wire-color-border)); + } + + .wire-back-to-top[data-variant="ghost"] .wire-back-to-top__surface { + color: var(--back-accent); + background: color-mix(in srgb, var(--wire-color-surface-raised) 68%, transparent); + border-color: transparent; + box-shadow: none; + } + + .wire-back-to-top[data-variant="minimal"] .wire-back-to-top__surface { + color: var(--back-accent); + background: transparent; + border-color: transparent; + box-shadow: none; + backdrop-filter: none; + } + + .wire-back-to-top[data-shape="rounded"] { + border-radius: 0.9rem; + } + + .wire-back-to-top[data-shape="pill"] { + border-radius: 999px; + } + + .wire-back-to-top__progress { + position: absolute; + inset: -0.22rem; + z-index: 1; + border-radius: inherit; background: conic-gradient( - currentColor var(--wire-back-to-top-progress), - transparent var(--wire-back-to-top-progress) + var(--back-accent) var(--wire-back-to-top-progress), + color-mix(in srgb, var(--wire-color-border) 72%, transparent) var(--wire-back-to-top-progress) ); - opacity: 0.22; + mask: radial-gradient(farthest-side, transparent calc(100% - 0.18rem), #000 calc(100% - 0.17rem)); + -webkit-mask: radial-gradient(farthest-side, transparent calc(100% - 0.18rem), #000 calc(100% - 0.17rem)); + pointer-events: none; + } + + .wire-back-to-top__icon { + width: 1.1rem; + height: 1.1rem; + flex: 0 0 auto; + } + + .wire-back-to-top[data-size="sm"] .wire-back-to-top__icon { + width: 0.95rem; + height: 0.95rem; + } + + .wire-back-to-top[data-size="lg"] .wire-back-to-top__icon { + width: 1.25rem; + height: 1.25rem; + } + + .wire-back-to-top__label { + white-space: nowrap; + font-size: 0.78rem; + font-weight: 700; + line-height: 1; + } + + .wire-back-to-top__sr { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; + } + + .wire-back-to-top:focus-visible { + outline: 2px solid var(--wire-color-focus); + outline-offset: 4px; + } + + @media (max-width: 639px) { + .wire-back-to-top[data-position="right"] { + right: 1rem; + } + + .wire-back-to-top[data-position="left"] { + left: 1rem; + } + + .wire-back-to-top[data-offset="lg"], + .wire-back-to-top[data-offset="xl"] { + bottom: 1.25rem; + } + } + + @media (prefers-reduced-motion: reduce) { + .wire-back-to-top, + .wire-back-to-top__surface { + transition: none; + } + + .wire-back-to-top:hover, + .wire-back-to-top[data-position="center"]:hover { + transform: none; + } } } } @@ -11802,40 +12915,43 @@ Events: dismiss ```wrn component Badge { - props { - label = "Badge" - size = "md" - color = "primary" - variant = "solid" - shape = "pill" - class = "" - - icon = "" - iconPosition = "start" - dot = false - dotOnly = false - dotLabel = "Status" - animated = false - - avatarSrc = "" - avatarAlt = "" - dismissible = false - dismissLabel = "Remove badge" - truncate = false - maxWidth = "12rem" - - anchorLabel = "" - anchorIcon = "" - placement = "inline" - anchorLabelText = "Badge anchor" - - @event dismiss = function + outputs { + dismiss(payload: { sourceEvent?: Event; [key: string]: string | number | boolean | null | object }) } - state visible = true + props { + label: string = "Badge" + size: string = "md" + color: string = "primary" + variant: string = "solid" + shape: string = "pill" + class: string = "" + + icon: string = "" + iconPosition: string = "start" + dot: boolean = false + dotOnly: boolean = false + dotLabel: string = "Status" + animated: boolean = false + + avatarSrc: string = "" + avatarAlt: string = "" + dismissible: boolean = false + dismissLabel: string = "Remove badge" + truncate: boolean = false + maxWidth: string = "12rem" + + anchorLabel: string = "" + anchorIcon: string = "" + placement: string = "inline" + anchorLabelText: string = "Badge anchor" + +} + + state visible: boolean = true functions { - function dismissBadge(sourceEvent, root, customEvent) { + client function dismissBadge(sourceEvent, root, customEvent) { visible = false root = sourceEvent.currentTarget.closest("[data-wrn-badge]") customEvent = document.createEvent("CustomEvent") @@ -11922,19 +13038,19 @@ Events: none ```wrn component Blockquote { props { - quote = "I just wanted to say that I'm very happy with my purchase so far. The documentation is outstanding - clear and detailed." - citation = "" - citationTitle = "" - citationUrl = "" - avatarSrc = "" - avatarAlt = "" - size = "md" - color = "primary" - align = "left" - variant = "default" - quoteMark = true - italic = true - class = "" + quote: string = "I just wanted to say that I'm very happy with my purchase so far. The documentation is outstanding - clear and detailed." + citation: string = "" + citationTitle: string = "" + citationUrl: string = "" + avatarSrc: string = "" + avatarAlt: string = "" + size: string = "md" + color: string = "primary" + align: string = "left" + variant: string = "default" + quoteMark: boolean = true + italic: boolean = true + class: string = "" } view { @@ -11996,32 +13112,336 @@ component Blockquote { Showcase: https://component.wrnexusjs.dev/ Mount: (legacy: data-component="Breadcrumb") Category: navigation -Purpose: Theme-aware, responsive breadcrumb component. -Props: size: string = "default", color: string = "primary", label: string = "Breadcrumb", items: string = [], active: string = "", orientation: string = "horizontal", class: string = "" -Slots: default -Events: navigate, click +Purpose: Show responsive hierarchical navigation with home support, separators, current-page state, sizes, and selection events. +Props: label: string = "Breadcrumb", items: unknown[] = [], active: string = "", separator: string = "chevron", showHome: boolean = false, homeLabel: string = "Home", homeHref: string = "/", homeIcon: string = "icon-[lucide--house]", size: string = "default", color: string = "primary", variant: string = "minimal", class: string = "" +Slots: none +Events: select ### Complete .wrn source contract ```wrn component Breadcrumb { - props { - @event navigate = function - @event click = function - size = "default" - color = "primary" - label = "Breadcrumb" - items = [] - active = "" - orientation = "horizontal" - class = "" + outputs { + select(payload: { value?: string | number | boolean | null; values?: Array; sourceEvent?: Event; [key: string]: string | number | boolean | null | object } | string | number | boolean | null) } + + props { +label: string = "Breadcrumb" + items: unknown[] = [] + active: string = "" + separator: string = "chevron" + showHome: boolean = false + homeLabel: string = "Home" + homeHref: string = "/" + homeIcon: string = "icon-[lucide--house]" + size: string = "default" + color: string = "primary" + variant: string = "minimal" + class: string = "" + } + view { -