@deijose/nix-js 2.5.3 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/dist/lib/form.cjs +1 -1
- package/dist/lib/form.js +1 -1
- package/dist/lib/index.d.ts +1 -1
- package/dist/lib/nix/form.d.ts +47 -4
- package/dist/lib/nix/index.d.ts +1 -1
- package/package.json +1 -1
- package/dist/lib/nix/template_old.d.ts +0 -116
package/README.md
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/@deijose/nix-js)
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
|
5
|
-
[]()
|
|
6
6
|
[]()
|
|
7
|
-
[]()
|
|
8
8
|
[]()
|
|
9
9
|
[](https://nix-js.dev/)
|
|
10
10
|
|
|
@@ -13,7 +13,7 @@ A lightweight, fully reactive micro-framework for building modern web UIs — no
|
|
|
13
13
|
**[→ Documentation & Live Demo](https://nix-js.dev/)**
|
|
14
14
|
|
|
15
15
|
```
|
|
16
|
-
~24 KB minified · ~
|
|
16
|
+
~24 KB minified · ~14 KB gzipped · zero dependencies · TypeScript-first · ES2022
|
|
17
17
|
```
|
|
18
18
|
|
|
19
19
|
## Installation
|
|
@@ -113,7 +113,7 @@ Everything ships in a single zero-dependency import:
|
|
|
113
113
|
| **Templates** | `` html` ` ``, `repeat`, `ref`, `portal`, `transition`, `showWhen` |
|
|
114
114
|
| **Components** | `NixTemplate` (function components), `NixComponent` (lifecycle class), `mount`, children & named slots |
|
|
115
115
|
| **Router** | `createRouter`, `RouterView`, `Link`, `nixRouter`, `RouterKey`, guards, nested routes, named routes (`name` + `navigate({ name })`), `mount(..., { router })` |
|
|
116
|
-
| **Forms** | `nixField`, `createForm`, built-in validators, Zod/Valibot interop |
|
|
116
|
+
| **Forms** | `nixField`, `createForm`, `nixFieldArray`, built-in validators, programmatic value setting, Zod/Valibot interop |
|
|
117
117
|
| **State** | `createStore`, `provide`, `inject`, `createInjectionKey` |
|
|
118
118
|
| **Async** | `suspend` (with `invalidate` for re-fetching), `lazy` |
|
|
119
119
|
| **Error handling** | `createErrorBoundary` |
|
package/dist/lib/form.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./signals.cjs");function t(e="Required"){return t=>null==t||""===t||Array.isArray(t)&&0===t.length?e:null}function n(e,t){return
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./signals.cjs");function t(e="Required"){return t=>null==t||""===t||Array.isArray(t)&&0===t.length?e:null}function n(e,t){return l=>"string"==typeof l&&l.length<e?t??`Minimum ${e} characters`:null}function r(e,t){return l=>"string"==typeof l&&l.length>e?t??`Maximum ${e} characters`:null}function i(e,t="Invalid format"){return l=>"string"!=typeof l||e.test(l)?null:t}function a(e="Invalid email"){return i(/^[^\s@]+@[^\s@]+\.[^\s@]+$/,e)}function o(e,t){return l=>"number"==typeof l&&l<e?t??`Minimum value is ${e}`:null}function s(e,t){return l=>"number"==typeof l&&l>e?t??`Maximum value is ${e}`:null}function c(e){return e}var l={required:t,minLength:n,maxLength:r,email:a,pattern:i,min:o,max:s};function u(e,t){return{...e,...t}}function d(t,l=[],r="blur",n){let u=e.signal(t),i=e.signal(!1),o=e.signal(!1),a=e.signal(null),s=e.signal(!1),f=t,c=!0,v=e.effect(()=>{u.value,c?c=!1:null!==a.peek()&&(a.value=null)}),d=e.computed(()=>{if(a.value)return a.value;let e=n?.();for(let t of l){let l=t(u.value,e);if(l)return l}return null}),p=e.computed(()=>("input"===r?o.value||i.value:"submit"===r?s.value:i.value)?d.value:null);return{value:u,error:p,rawError:d,touched:i,dirty:o,onInput:e=>{u.value=function(e){if(!e||!("value"in e))return t;let l=e,r=l.value;return"boolean"==typeof t?!0===l.checked||!function(e){return"checkbox"===e.type||"radio"===e.type}(l)&&("true"===r||"1"===r||"false"!==r&&"0"!==r&&""!==r&&t):"number"==typeof t?""===r?NaN:Number(r):r}(e.target),o.value=!0},onBlur:()=>{i.value=!0},reset:function(){e.batch(()=>{u.value=f,i.value=!1,o.value=!1,a.value=null,s.value=!1})},setValue:function(t,l={}){let{shouldTouch:r=!1,shouldDirty:n=!0,shouldValidate:a=!0}=l;e.batch(()=>{u.value=t,n&&(o.value=!0),r&&(i.value=!0),a&&(s.value=!0)})},_setExternalError:function(e){a.value=e,e&&(i.value=!0)},_forceVisible:function(){i.value=!0,s.value=!0},_setInitialValue:function(e){f=e},_dispose:function(){v(),p.dispose(),d.dispose()}}}function f(t,l={},r="blur"){function n(e){let t={};for(let n in e){let u=l[n]??[];t[n]=d(e[n],u,r)}return t}let u=e.signal(t.map(n)),i=t,o=e.computed(()=>u.value.length);return{fields:u,append:function(e){u.value=[...u.value,n(e)]},remove:function(e){let t=u.value;if(!(e<0||e>=t.length)){for(let l in t[e])t[e][l]._dispose();u.value=t.filter((t,l)=>l!==e)}},move:function(e,t){let l=[...u.value];if(e<0||e>=l.length||t<0||t>=l.length||e===t)return;let[r]=l.splice(e,1);l.splice(t,0,r),u.value=l},replace:function(e,t){let l=[...u.value];if(!(e<0||e>=l.length)){for(let t in l[e])l[e][t]._dispose();l[e]=n(t),u.value=l}},length:o,setValues:function(e){for(let e of u.value)for(let t in e)e[t]._dispose();u.value=e.map(n)},patchValues:function(e){let t=[...u.value];for(let l=0;l<e.length;l++){let r=e[l];if(l>=t.length){t.push(n(r));continue}let u=t[l];for(let[e,t]of Object.entries(r))u[e]&&u[e].setValue(t,{shouldDirty:!1,shouldTouch:!1,shouldValidate:!1})}u.value=t},reset:function(e){e&&(i=e);for(let e of u.value)for(let t in e)e[t]._dispose();u.value=i.map(n)},_dispose:function(){for(let e of u.value)for(let t in e)e[t]._dispose();o.dispose()}}}function p(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function m(e,t="",l=[]){for(let[r,n]of Object.entries(e)){let e=t?`${t}.${r}`:r;p(n)&&Object.keys(n).length>0?m(n,e,l):l.push([e,n])}return l}function h(e,t,l){let r=t.split("."),n=e;for(let e=0;e<r.length-1;e++){let t=r[e];p(n[t])||(n[t]={}),n=n[t]}n[r[r.length-1]]=l}function g(t,l={}){let r=l.validateOn??"blur",n={},u=l.validators;function i(){let e={};for(let t in n)h(e,t,n[t].value.value);return e}for(let[e,l]of m(t))n[e]=d(l,u?.[e]??[],r,i);let o=e.signal(!1),a=e.signal(0),s=e.computed(()=>i()),f=e.computed(()=>{let e={};for(let t in n){let l=n[t].error.value;l&&(e[t]=l)}return e}),c=e.computed(()=>{for(let e in n)if(n[e].rawError.value)return!1;return!0}),v=e.computed(()=>{for(let e in n)if(n[e].error.value)return!1;return!0}),p=e.computed(()=>{for(let e in n)if(n[e].dirty.value)return!0;return!1}),g=e.computed(()=>{for(let e in n)if(n[e].touched.value)return!0;return!1});function y(e){for(let t in e)n[t]?._setExternalError(e[t]??null)}return{fields:n,values:s,errors:f,canSubmit:c,valid:v,dirty:p,touched:g,isSubmitting:o,submitCount:a,handleSubmit:function(e){return t=>{t.preventDefault(),a.value++;for(let e in n)n[e]._forceVisible();let r=s.value;if(l.validate){let e=l.validate(r);if(e){let t={},l=!1;for(let r in e){let n=e[r],u=Array.isArray(n)?n[0]??null:n??null;u&&(t[r]=u,l=!0)}if(l)return void y(t)}}for(let e in n)if(n[e].rawError.value)return;let u=e(r);u instanceof Promise&&(o.value=!0,u.finally(()=>{o.value=!1}).catch(()=>{}))}},reset:function(e){if(e)for(let[t,l]of m(e)){let e=n[t];e&&e._setInitialValue(l)}for(let e in n)n[e].reset();o.value=!1,a.value=0},setValue:function(e,t,l={}){let r=n[e];r&&r.setValue(t,l)},setValues:function(t,l={}){let{keepDirty:r=!1,keepTouched:u=!1,keepErrors:i=!0}=l;e.batch(()=>{for(let[e,l]of m(t)){let t=n[e];t&&(t.setValue(l,{shouldDirty:!r,shouldTouch:!1,shouldValidate:!i}),u||(t.touched.value=!1))}})},setErrors:y,dispose:function(){s.dispose(),f.dispose(),c.dispose(),v.dispose(),p.dispose(),g.dispose();for(let e in n)n[e]._dispose()}}}exports.createForm=g,exports.createValidator=c,exports.email=a,exports.extendValidators=u,exports.max=s,exports.maxLength=r,exports.min=o,exports.minLength=n,exports.nixField=d,exports.nixFieldArray=f,exports.pattern=i,exports.required=t,exports.validators=l;
|
package/dist/lib/form.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{batch as e,computed as t,effect as n,signal as r}from"./signals.js";function i(e="Required"){return t=>null==t||""===t||Array.isArray(t)&&0===t.length?e:null}function a(e,t){return
|
|
1
|
+
import{batch as e,computed as t,effect as n,signal as r}from"./signals.js";function i(e="Required"){return t=>null==t||""===t||Array.isArray(t)&&0===t.length?e:null}function a(e,t){return l=>"string"==typeof l&&l.length<e?t??`Minimum ${e} characters`:null}function o(e,t){return l=>"string"==typeof l&&l.length>e?t??`Maximum ${e} characters`:null}function s(e,t="Invalid format"){return l=>"string"!=typeof l||e.test(l)?null:t}function c(e="Invalid email"){return s(/^[^\s@]+@[^\s@]+\.[^\s@]+$/,e)}function l(e,t){return l=>"number"==typeof l&&l<e?t??`Minimum value is ${e}`:null}function u(e,t){return l=>"number"==typeof l&&l>e?t??`Maximum value is ${e}`:null}function d(e){return e}var f={required:i,minLength:a,maxLength:o,email:c,pattern:s,min:l,max:u};function p(e,t){return{...e,...t}}function m(l,u=[],i="blur",a){let o=r(l),s=r(!1),f=r(!1),c=r(null),v=r(!1),d=l,p=!0,h=n(()=>{o.value,p?p=!1:null!==c.peek()&&(c.value=null)}),m=t(()=>{if(c.value)return c.value;let e=a?.();for(let t of u){let l=t(o.value,e);if(l)return l}return null}),g=t(()=>("input"===i?f.value||s.value:"submit"===i?v.value:s.value)?m.value:null);return{value:o,error:g,rawError:m,touched:s,dirty:f,onInput:e=>{o.value=function(e){if(!e||!("value"in e))return l;let t=e,r=t.value;return"boolean"==typeof l?!0===t.checked||!function(e){return"checkbox"===e.type||"radio"===e.type}(t)&&("true"===r||"1"===r||"false"!==r&&"0"!==r&&""!==r&&l):"number"==typeof l?""===r?NaN:Number(r):r}(e.target),f.value=!0},onBlur:()=>{s.value=!0},reset:function(){e(()=>{o.value=d,s.value=!1,f.value=!1,c.value=null,v.value=!1})},setValue:function(t,l={}){let{shouldTouch:r=!1,shouldDirty:n=!0,shouldValidate:u=!0}=l;e(()=>{o.value=t,n&&(f.value=!0),r&&(s.value=!0),u&&(v.value=!0)})},_setExternalError:function(e){c.value=e,e&&(s.value=!0)},_forceVisible:function(){s.value=!0,v.value=!0},_setInitialValue:function(e){d=e},_dispose:function(){h(),g.dispose(),m.dispose()}}}function h(e,l={},n="blur"){function u(e){let t={};for(let r in e){let u=l[r]??[];t[r]=m(e[r],u,n)}return t}let i=r(e.map(u)),a=e,o=t(()=>i.value.length);return{fields:i,append:function(e){i.value=[...i.value,u(e)]},remove:function(e){let t=i.value;if(!(e<0||e>=t.length)){for(let l in t[e])t[e][l]._dispose();i.value=t.filter((t,l)=>l!==e)}},move:function(e,t){let l=[...i.value];if(e<0||e>=l.length||t<0||t>=l.length||e===t)return;let[r]=l.splice(e,1);l.splice(t,0,r),i.value=l},replace:function(e,t){let l=[...i.value];if(!(e<0||e>=l.length)){for(let t in l[e])l[e][t]._dispose();l[e]=u(t),i.value=l}},length:o,setValues:function(e){for(let e of i.value)for(let t in e)e[t]._dispose();i.value=e.map(u)},patchValues:function(e){let t=[...i.value];for(let l=0;l<e.length;l++){let r=e[l];if(l>=t.length){t.push(u(r));continue}let n=t[l];for(let[e,t]of Object.entries(r))n[e]&&n[e].setValue(t,{shouldDirty:!1,shouldTouch:!1,shouldValidate:!1})}i.value=t},reset:function(e){e&&(a=e);for(let e of i.value)for(let t in e)e[t]._dispose();i.value=a.map(u)},_dispose:function(){for(let e of i.value)for(let t in e)e[t]._dispose();o.dispose()}}}function g(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function _(e,t="",l=[]){for(let[r,n]of Object.entries(e)){let e=t?`${t}.${r}`:r;g(n)&&Object.keys(n).length>0?_(n,e,l):l.push([e,n])}return l}function v(e,t,l){let r=t.split("."),n=e;for(let e=0;e<r.length-1;e++){let t=r[e];g(n[t])||(n[t]={}),n=n[t]}n[r[r.length-1]]=l}function y(l,n={}){let u=n.validateOn??"blur",i={},a=n.validators;function o(){let e={};for(let t in i)v(e,t,i[t].value.value);return e}for(let[e,t]of _(l))i[e]=m(t,a?.[e]??[],u,o);let s=r(!1),f=r(0),c=t(()=>o()),d=t(()=>{let e={};for(let t in i){let l=i[t].error.value;l&&(e[t]=l)}return e}),p=t(()=>{for(let e in i)if(i[e].rawError.value)return!1;return!0}),h=t(()=>{for(let e in i)if(i[e].error.value)return!1;return!0}),g=t(()=>{for(let e in i)if(i[e].dirty.value)return!0;return!1}),y=t(()=>{for(let e in i)if(i[e].touched.value)return!0;return!1});function b(e){for(let t in e)i[t]?._setExternalError(e[t]??null)}return{fields:i,values:c,errors:d,canSubmit:p,valid:h,dirty:g,touched:y,isSubmitting:s,submitCount:f,handleSubmit:function(e){return t=>{t.preventDefault(),f.value++;for(let e in i)i[e]._forceVisible();let l=c.value;if(n.validate){let e=n.validate(l);if(e){let t={},l=!1;for(let r in e){let n=e[r],u=Array.isArray(n)?n[0]??null:n??null;u&&(t[r]=u,l=!0)}if(l)return void b(t)}}for(let e in i)if(i[e].rawError.value)return;let r=e(l);r instanceof Promise&&(s.value=!0,r.finally(()=>{s.value=!1}).catch(()=>{}))}},reset:function(e){if(e)for(let[t,l]of _(e)){let e=i[t];e&&e._setInitialValue(l)}for(let e in i)i[e].reset();s.value=!1,f.value=0},setValue:function(e,t,l={}){let r=i[e];r&&r.setValue(t,l)},setValues:function(t,l={}){let{keepDirty:r=!1,keepTouched:n=!1,keepErrors:u=!0}=l;e(()=>{for(let[e,l]of _(t)){let t=i[e];t&&(t.setValue(l,{shouldDirty:!r,shouldTouch:!1,shouldValidate:!u}),n||(t.touched.value=!1))}})},setErrors:b,dispose:function(){c.dispose(),d.dispose(),p.dispose(),h.dispose(),g.dispose(),y.dispose();for(let e in i)i[e]._dispose()}}}export{y as createForm,d as createValidator,c as email,p as extendValidators,u as max,o as maxLength,l as min,a as minLength,m as nixField,h as nixFieldArray,s as pattern,i as required,f as validators};
|
package/dist/lib/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { Signal, signal, effect, computed, batch, watch, untrack, nextTick, html, repeat, ref, showWhen, portal, createPortalOutlet, portalOutlet, provideOutlet, injectOutlet, createErrorBoundary, transition, mount, NixComponent, createStore, persistPlugin, loggerPlugin, guardPlugin, bridgePlugin, createRouter, RouterView, Link, nixRouter, RouterKey, _hasActiveRouter, suspend, lazy, provide, inject, createInjectionKey, nixField, nixFieldArray, createForm, required, minLength, maxLength, email, pattern, min, max, createValidator, validators, extendValidators, } from "./nix";
|
|
2
|
-
export type { WatchOptions, NixTemplate, NixMountHandle, MountOptions, KeyedList, NixRef, PortalOutlet, ErrorFallback, TransitionOptions, TransitionContent, Store, StoreSignals, NixPlugin, Router, NamedRouteLocation, RouteLocation, RouteRecord, RouterOptions, NavigationGuard, NavigationGuardResult, AfterEachHook, ResolvedRoute, ScrollPosition, ScrollBehavior, RouterMode, NavigationDirection, NavigationIntent, NavigationAction, NavigateOptions, SuspenseOptions, InjectionKey, Validator, ValidateOn, FieldState, FieldArrayState, FieldErrors, FormState, FormOptions, ValidatorsBase, NixChildren, } from "./nix";
|
|
2
|
+
export type { WatchOptions, NixTemplate, NixMountHandle, MountOptions, KeyedList, NixRef, PortalOutlet, ErrorFallback, TransitionOptions, TransitionContent, Store, StoreSignals, NixPlugin, Router, NamedRouteLocation, RouteLocation, RouteRecord, RouterOptions, NavigationGuard, NavigationGuardResult, AfterEachHook, ResolvedRoute, ScrollPosition, ScrollBehavior, RouterMode, NavigationDirection, NavigationIntent, NavigationAction, NavigateOptions, SuspenseOptions, InjectionKey, DeepPartial, Validator, ValidateOn, FieldState, FieldArrayState, FieldErrors, FormState, FormOptions, ValidatorsBase, NixChildren, } from "./nix";
|
package/dist/lib/nix/form.d.ts
CHANGED
|
@@ -69,6 +69,18 @@ export interface FieldState<T> {
|
|
|
69
69
|
readonly onBlur: () => void;
|
|
70
70
|
/** Reset to initial value and clear touched/dirty/error state. */
|
|
71
71
|
reset(): void;
|
|
72
|
+
/**
|
|
73
|
+
* Set the field value programmatically.
|
|
74
|
+
*
|
|
75
|
+
* @param value — new value for the field.
|
|
76
|
+
* @param options — control whether to touch/dirty the field and whether to force
|
|
77
|
+
* validation visibility.
|
|
78
|
+
*/
|
|
79
|
+
setValue(value: T, options?: {
|
|
80
|
+
shouldTouch?: boolean;
|
|
81
|
+
shouldDirty?: boolean;
|
|
82
|
+
shouldValidate?: boolean;
|
|
83
|
+
}): void;
|
|
72
84
|
/**
|
|
73
85
|
* @internal — inject an external error message (server / schema validator).
|
|
74
86
|
* The error clears automatically when the user next edits the field.
|
|
@@ -76,6 +88,8 @@ export interface FieldState<T> {
|
|
|
76
88
|
_setExternalError(msg: string | null): void;
|
|
77
89
|
/** @internal — force error visibility (e.g., on submit). */
|
|
78
90
|
_forceVisible(): void;
|
|
91
|
+
/** @internal — update the stored initial value so a later reset() returns here. */
|
|
92
|
+
_setInitialValue(value: T): void;
|
|
79
93
|
/** @internal — dispose computed signals. */
|
|
80
94
|
_dispose(): void;
|
|
81
95
|
}
|
|
@@ -100,8 +114,12 @@ export interface FieldArrayState<T extends Record<string, unknown>> {
|
|
|
100
114
|
replace(index: number, value: T): void;
|
|
101
115
|
/** Number of items in the array. Reactive. */
|
|
102
116
|
readonly length: Signal<number>;
|
|
103
|
-
/**
|
|
104
|
-
|
|
117
|
+
/** Replaces the whole array with a new list of items. */
|
|
118
|
+
setValues(items: T[]): void;
|
|
119
|
+
/** Patches existing items and appends any extras without touching untouched items. */
|
|
120
|
+
patchValues(items: Partial<T>[]): void;
|
|
121
|
+
/** Resets the array to its initial value, optionally updating that initial value. */
|
|
122
|
+
reset(items?: T[]): void;
|
|
105
123
|
/** @internal */
|
|
106
124
|
_dispose(): void;
|
|
107
125
|
}
|
|
@@ -130,6 +148,9 @@ export type FieldErrors<T extends Record<string, unknown>> = {
|
|
|
130
148
|
export type FormValidators<T extends Record<string, unknown>> = {
|
|
131
149
|
[K in keyof T]?: Validator<T[K], T>[];
|
|
132
150
|
} & Record<string, Validator<any, any>[] | undefined>;
|
|
151
|
+
export type DeepPartial<T> = T extends object ? {
|
|
152
|
+
[P in keyof T]?: DeepPartial<T[P]>;
|
|
153
|
+
} : T;
|
|
133
154
|
export interface FormState<T extends Record<string, unknown>> {
|
|
134
155
|
/** Individual field states — access value, error, event handlers. */
|
|
135
156
|
fields: FormFields<T>;
|
|
@@ -191,8 +212,30 @@ export interface FormState<T extends Record<string, unknown>> {
|
|
|
191
212
|
* 5. Manages `isSubmitting` across async callbacks
|
|
192
213
|
*/
|
|
193
214
|
handleSubmit(fn: (values: T) => void | Promise<void>): (e: Event) => void;
|
|
194
|
-
/**
|
|
195
|
-
|
|
215
|
+
/**
|
|
216
|
+
* Reset all fields to their initial values. If `newInitialValues` is provided,
|
|
217
|
+
* it becomes the new baseline and subsequent reset() calls will use it.
|
|
218
|
+
*/
|
|
219
|
+
reset(newInitialValues?: T): void;
|
|
220
|
+
/**
|
|
221
|
+
* Set a single field value by its path (top-level or nested dot-path).
|
|
222
|
+
*/
|
|
223
|
+
setValue(path: string, value: unknown, options?: {
|
|
224
|
+
shouldTouch?: boolean;
|
|
225
|
+
shouldDirty?: boolean;
|
|
226
|
+
shouldValidate?: boolean;
|
|
227
|
+
}): void;
|
|
228
|
+
/**
|
|
229
|
+
* Set multiple field values at once.
|
|
230
|
+
*
|
|
231
|
+
* @param values — partial object with top-level and/or nested values.
|
|
232
|
+
* @param options — control whether to preserve existing touched/dirty/error state.
|
|
233
|
+
*/
|
|
234
|
+
setValues(values: DeepPartial<T>, options?: {
|
|
235
|
+
keepDirty?: boolean;
|
|
236
|
+
keepTouched?: boolean;
|
|
237
|
+
keepErrors?: boolean;
|
|
238
|
+
}): void;
|
|
196
239
|
/**
|
|
197
240
|
* Inject external errors (e.g., from a server response) into specific fields.
|
|
198
241
|
* Each field's error clears automatically the next time the user edits it.
|
package/dist/lib/nix/index.d.ts
CHANGED
|
@@ -16,4 +16,4 @@ export type { SuspenseOptions } from "./async";
|
|
|
16
16
|
export { provide, inject, createInjectionKey } from "./context";
|
|
17
17
|
export type { InjectionKey } from "./context";
|
|
18
18
|
export { nixField, nixFieldArray, createForm, required, minLength, maxLength, email, pattern, min, max, createValidator, validators, extendValidators, } from "./form";
|
|
19
|
-
export type { Validator, ValidateOn, FieldState, FieldArrayState, FieldErrors, FormState, FormOptions, ValidatorsBase } from "./form";
|
|
19
|
+
export type { DeepPartial, Validator, ValidateOn, FieldState, FieldArrayState, FieldErrors, FormState, FormOptions, ValidatorsBase } from "./form";
|
package/package.json
CHANGED
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
import type { NixComponent } from "./lifecycle";
|
|
2
|
-
export interface NixTemplate {
|
|
3
|
-
readonly __isNixTemplate: true;
|
|
4
|
-
/** Mounts the template into a container element (public / root API). */
|
|
5
|
-
mount(container: Element | string): NixMountHandle;
|
|
6
|
-
/** @internal Renders before `before` node (or appends to `parent`). Returns cleanup. */
|
|
7
|
-
_render(parent: Node, before: Node | null): () => void;
|
|
8
|
-
}
|
|
9
|
-
export interface NixMountHandle {
|
|
10
|
-
unmount(): void;
|
|
11
|
-
}
|
|
12
|
-
/** Direct reference to a DOM element, assigned on mount and cleared on unmount. */
|
|
13
|
-
export interface NixRef<T extends Element = Element> {
|
|
14
|
-
el: T | null;
|
|
15
|
-
}
|
|
16
|
-
/** Creates an empty `NixRef`. Use as `ref` attribute value in templates. */
|
|
17
|
-
export declare function ref<T extends Element = Element>(): NixRef<T>;
|
|
18
|
-
/** Toggles element visibility via `display: none` without unmounting. */
|
|
19
|
-
export declare function showWhen(el: HTMLElement, condition: boolean): void;
|
|
20
|
-
/** Keyed list result for efficient DOM diffing via `repeat()`. */
|
|
21
|
-
export interface KeyedList<T = unknown> {
|
|
22
|
-
readonly __isKeyedList: true;
|
|
23
|
-
readonly items: T[];
|
|
24
|
-
readonly keyFn: (item: T, index: number) => string | number;
|
|
25
|
-
readonly renderFn: (item: T, index: number) => NixTemplate | NixComponent;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Creates a keyed list for efficient DOM reconciliation.
|
|
29
|
-
* Use instead of `.map()` when the list changes frequently.
|
|
30
|
-
*/
|
|
31
|
-
export declare function repeat<T>(items: T[], keyFn: (item: T, index: number) => string | number, renderFn: (item: T, index: number) => NixTemplate | NixComponent): KeyedList<T>;
|
|
32
|
-
/**
|
|
33
|
-
* Renders `content` into `target` instead of the current tree position.
|
|
34
|
-
* Useful for modals, tooltips, and overlays that must escape overflow clipping.
|
|
35
|
-
* Returns a NixTemplate — works inside reactive conditionals.
|
|
36
|
-
*
|
|
37
|
-
* @param content Template or component to render.
|
|
38
|
-
* @param target CSS selector, Element, PortalOutlet, or NixRef. Defaults to `document.body`.
|
|
39
|
-
*/
|
|
40
|
-
/** Opaque token for a named portal target. */
|
|
41
|
-
export interface PortalOutlet {
|
|
42
|
-
readonly __isPortalOutlet: true;
|
|
43
|
-
/** @internal */
|
|
44
|
-
_container: Element | null;
|
|
45
|
-
}
|
|
46
|
-
/** Creates a PortalOutlet token for decoupled portal targeting. */
|
|
47
|
-
export declare function createPortalOutlet(): PortalOutlet;
|
|
48
|
-
/** Declares the DOM anchor for a PortalOutlet inside a template. */
|
|
49
|
-
export declare function portalOutlet(outlet: PortalOutlet): NixTemplate;
|
|
50
|
-
export declare function portal(content: NixTemplate | NixComponent, target?: Element | string | PortalOutlet | NixRef<Element>): NixTemplate;
|
|
51
|
-
/** Provides a PortalOutlet to descendant components via dependency injection. */
|
|
52
|
-
export declare function provideOutlet(outlet: PortalOutlet): void;
|
|
53
|
-
/** Injects the nearest PortalOutlet provided by an ancestor. */
|
|
54
|
-
export declare function injectOutlet(): PortalOutlet | undefined;
|
|
55
|
-
/** Fallback: a static template/component, or a factory receiving the error. */
|
|
56
|
-
export type ErrorFallback = NixTemplate | NixComponent | ((err: unknown) => NixTemplate | NixComponent);
|
|
57
|
-
/**
|
|
58
|
-
* Wraps `content` in an error boundary. If rendering or a reactive update
|
|
59
|
-
* throws, the boundary tears down the broken subtree and renders `fallback`.
|
|
60
|
-
*/
|
|
61
|
-
export declare function createErrorBoundary(content: NixTemplate | NixComponent, fallback: ErrorFallback): NixTemplate;
|
|
62
|
-
/**
|
|
63
|
-
* Options for `transition()`. All class-name overrides are optional — by
|
|
64
|
-
* default they are derived from `name` (default `"nix"`).
|
|
65
|
-
*
|
|
66
|
-
* | phase | from class | active class | to class |
|
|
67
|
-
* |--------------|-------------------|---------------------|-----------------|
|
|
68
|
-
* | enter | `{n}-enter-from` | `{n}-enter-active` | `{n}-enter-to` |
|
|
69
|
-
* | leave | `{n}-leave-from` | `{n}-leave-active` | `{n}-leave-to` |
|
|
70
|
-
*/
|
|
71
|
-
export interface TransitionOptions {
|
|
72
|
-
/**
|
|
73
|
-
* Prefix for all generated CSS classes. Default `"nix"`.
|
|
74
|
-
* e.g. `name: "fade"` generates `.fade-enter-from`, `.fade-leave-to`, …
|
|
75
|
-
*/
|
|
76
|
-
name?: string;
|
|
77
|
-
/** Override the enter-from class individually. */
|
|
78
|
-
enterFrom?: string;
|
|
79
|
-
/** Override the enter-active class individually. */
|
|
80
|
-
enterActive?: string;
|
|
81
|
-
/** Override the enter-to class individually. */
|
|
82
|
-
enterTo?: string;
|
|
83
|
-
/** Override the leave-from class individually. */
|
|
84
|
-
leaveFrom?: string;
|
|
85
|
-
/** Override the leave-active class individually. */
|
|
86
|
-
leaveActive?: string;
|
|
87
|
-
/** Override the leave-to class individually. */
|
|
88
|
-
leaveTo?: string;
|
|
89
|
-
/**
|
|
90
|
-
* When `true` the enter transition also plays on the very first render
|
|
91
|
-
* (similar to Vue's `appear`). Default `false`.
|
|
92
|
-
*/
|
|
93
|
-
appear?: boolean;
|
|
94
|
-
/**
|
|
95
|
-
* Fallback duration in **milliseconds** used when no `transition-duration`
|
|
96
|
-
* or `animation-duration` is found on the element via `getComputedStyle`.
|
|
97
|
-
*/
|
|
98
|
-
duration?: number;
|
|
99
|
-
/** Called synchronously right before the enter classes are added. */
|
|
100
|
-
onBeforeEnter?: (el: Element) => void;
|
|
101
|
-
/** Called after the enter transition has fully completed. */
|
|
102
|
-
onAfterEnter?: (el: Element) => void;
|
|
103
|
-
/** Called synchronously right before the leave classes are added. */
|
|
104
|
-
onBeforeLeave?: (el: Element) => void;
|
|
105
|
-
/** Called after the leave transition has fully completed and the DOM is removed. */
|
|
106
|
-
onAfterLeave?: (el: Element) => void;
|
|
107
|
-
}
|
|
108
|
-
/** Content that can be wrapped with `transition()`. */
|
|
109
|
-
export type TransitionContent = NixTemplate | NixComponent | (() => NixTemplate | NixComponent | null);
|
|
110
|
-
/**
|
|
111
|
-
* Wraps content with CSS class-based enter/leave transitions.
|
|
112
|
-
* Static content plays enter on mount (only with `appear: true`).
|
|
113
|
-
* Reactive `() => Template | null` auto-animates enter/leave on toggle.
|
|
114
|
-
*/
|
|
115
|
-
export declare function transition(content: TransitionContent, options?: TransitionOptions): NixTemplate;
|
|
116
|
-
export declare function html(strings: TemplateStringsArray, ...values: unknown[]): NixTemplate;
|