@jsenv/navi 0.29.492 → 0.29.494
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/dist/dev/jsenv_navi.js +12093 -11347
- package/dist/dev/jsenv_navi.js.map +87 -85
- package/dist/jsenv_navi.js +11557 -10810
- package/dist/jsenv_navi.js.map +87 -85
- package/docs/actions.md +7 -3
- package/docs/control_value.md +3 -1
- package/docs/create_and_edit.md +34 -16
- package/docs/data_states.md +3 -2
- package/docs/drag_interactions.md +15 -0
- package/docs/interactions.md +2 -1
- package/docs/navigation.md +16 -5
- package/docs/network_policy.md +21 -1
- package/docs/popup_lift.md +17 -3
- package/docs/popup_open.md +3 -1
- package/docs/resource.md +37 -3
- package/docs/scroll.md +3 -1
- package/docs/testid.md +1 -1
- package/package.json +2 -2
package/docs/actions.md
CHANGED
|
@@ -456,9 +456,13 @@ on a read-only control — holds everywhere but on a control with
|
|
|
456
456
|
button and a link hold no state to mirror: there, each press is one call). The
|
|
457
457
|
user typing is one cause among several: a `value` prop coming back down after a
|
|
458
458
|
render, a popup control propagating its choice up to the picker holding it, a
|
|
459
|
-
group cascading a value into its children
|
|
460
|
-
|
|
461
|
-
|
|
459
|
+
group cascading a value into its children, a group filling a control it builds
|
|
460
|
+
(a popup's fields at the opening), a new `defaultValue` taken by a field nobody
|
|
461
|
+
edited — all of them reach `uiAction`, so that a signal or a local variable
|
|
462
|
+
listening to it never drifts out of sync. The one value it does not hear is the
|
|
463
|
+
one a control starts on by itself, its own `defaultValue` or `value`: a mirror
|
|
464
|
+
reads that one at mount. Reading it as "the user did something" is the natural
|
|
465
|
+
mistake.
|
|
462
466
|
|
|
463
467
|
The second argument says which one it was. Every event navi dispatches carries
|
|
464
468
|
the event that caused it, and `findEvent(event, type)` walks that chain back:
|
package/docs/control_value.md
CHANGED
|
@@ -291,7 +291,9 @@ or taken back (the action failed, the popup was cancelled).
|
|
|
291
291
|
|
|
292
292
|
This holds for a control, for a group given a `defaultValue` (a selectable list,
|
|
293
293
|
a `ControlGroup`), and for everything inside a picker's popup, which stays
|
|
294
|
-
mounted while closed.
|
|
294
|
+
mounted while closed. An object — a `ControlGroup`, a `Form` — takes it key by
|
|
295
|
+
key: a field holding an edit keeps it, measured against its key of the new
|
|
296
|
+
default, while the fields around it follow.
|
|
295
297
|
|
|
296
298
|
Where the record goes depends on who sends it. A control that saves itself —
|
|
297
299
|
its own `action`, nothing around it to press — takes it as `defaultValue`
|
package/docs/create_and_edit.md
CHANGED
|
@@ -237,22 +237,40 @@ typed in it, and coming back re-reads the resource. There is nothing to restore.
|
|
|
237
237
|
### A screen that stays open after Save
|
|
238
238
|
|
|
239
239
|
Everything above assumes the screen is left on saving. One edited in place —
|
|
240
|
-
a settings panel, saved, then edited again —
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
240
|
+
a settings panel, saved, then edited again — asks three things at once: the
|
|
241
|
+
form holds the record (an untouched Save sends nothing), follows it when it
|
|
242
|
+
moves (another admin, a run ending), and never overwrites what is being typed.
|
|
243
|
+
That is `<Form record>`:
|
|
244
|
+
|
|
245
|
+
```jsx
|
|
246
|
+
<Form action={saveSetting} record={setting}>
|
|
247
|
+
<Input name="interval_minutes" />
|
|
248
|
+
<CheckboxGroup name="sexes" required>
|
|
249
|
+
…
|
|
250
|
+
</CheckboxGroup>
|
|
251
|
+
<Button type="submit" readOnlyWhileFormUnchanged>
|
|
252
|
+
Enregistrer
|
|
253
|
+
</Button>
|
|
254
|
+
</Form>
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
Each named field starts on its key, held. A new record — compared by content,
|
|
258
|
+
so the same one read again is no move — is taken key by key: a field nobody
|
|
259
|
+
touched shows it, a field being typed in keeps what is typed, and the form,
|
|
260
|
+
measured against the new record from then on, reads changed exactly where an
|
|
261
|
+
edit differs from it. Save then sends the edit with the other keys as the
|
|
262
|
+
record now has them, not as they were when the screen opened. A send that went
|
|
263
|
+
through needs nothing more: its answer, landing as the next record, is what
|
|
264
|
+
the form holds. The record may be `undefined` while it loads — no
|
|
265
|
+
`pristineKey`, no `onLoad` copy. Nothing tells the person typing that the
|
|
266
|
+
record moved under their field: their Save is the answer.
|
|
267
|
+
|
|
268
|
+
A single control that saves itself has the same three with
|
|
269
|
+
`defaultValue={record.x}`, which follows and never undoes an edit; held only
|
|
270
|
+
matters to a form. A control bound to a signal of the screen's own takes
|
|
271
|
+
`useSignalSync(record.x)` ([state_binding.md](./state_binding.md)): held and
|
|
272
|
+
following, compared by content, but the record moving overwrites what is being
|
|
273
|
+
typed.
|
|
256
274
|
|
|
257
275
|
What not to write: `useSignal(record.x)` with `key={record.updated_at}` on the
|
|
258
276
|
block. The key throws away what is being typed each time the record moves.
|
package/docs/data_states.md
CHANGED
|
@@ -25,8 +25,9 @@ whether a missing list is a skeleton, a sentence or an illustration.
|
|
|
25
25
|
|
|
26
26
|
## Asking for a state means receiving it as a value
|
|
27
27
|
|
|
28
|
-
Without options, `useAsyncData` **delegates**: it suspends while the
|
|
29
|
-
|
|
28
|
+
Without options, `useAsyncData` **delegates**: it suspends while the action
|
|
29
|
+
runs — a rerun over data already held included — and throws when the action
|
|
30
|
+
failed, so the states are drawn by the
|
|
30
31
|
`<Loading>` and `<ErrorBoundary>` above rather than by the component. Each
|
|
31
32
|
option turns one of those from something done _to_ the component into a value
|
|
32
33
|
the component reads:
|
|
@@ -557,6 +557,21 @@ sends the copy home like any refused carry. Nothing waits on a write still out:
|
|
|
557
557
|
the next drop is answered on its own, so an answer that replays its moves over
|
|
558
558
|
the state it was given keeps two drops in a row in order.
|
|
559
559
|
|
|
560
|
+
One outcome may answer two kinds of drop: a player put on another seat stands
|
|
561
|
+
there at once, the same player dropped on « Free the seat » is asked first, and
|
|
562
|
+
the copy has to wait over the zone while the question is open. `optimistic` is
|
|
563
|
+
then a function of the drop — the `event.detail` the answer reads, without the
|
|
564
|
+
event —, asked as the answer is about to run:
|
|
565
|
+
|
|
566
|
+
```jsx
|
|
567
|
+
land: {
|
|
568
|
+
answer: (event) =>
|
|
569
|
+
event.detail.toId === releaseZoneId ? askRelease(event) : land(event),
|
|
570
|
+
verb: "PATCH",
|
|
571
|
+
optimistic: (detail) => detail.toId !== releaseZoneId,
|
|
572
|
+
},
|
|
573
|
+
```
|
|
574
|
+
|
|
560
575
|
Only `reorder` and `land`: a `move` hands its position over when the answer is
|
|
561
576
|
in, and a throw has nothing to draw at once.
|
|
562
577
|
|
package/docs/interactions.md
CHANGED
|
@@ -111,7 +111,8 @@ A value can also say what it is besides what it does, as
|
|
|
111
111
|
happen, and the policy's words are said where the hand made it — before anything
|
|
112
112
|
moves, for a gesture: a carried thing is not picked up, a swiped row resists like
|
|
113
113
|
a wall. `optimistic` is for a `reorder` or a `land` drawn at once and written
|
|
114
|
-
after
|
|
114
|
+
after — `true`, or a function of the drop deciding it per drop
|
|
115
|
+
([drag_interactions.md](./drag_interactions.md#answered-at-once-optimistic)).
|
|
115
116
|
A falsy `answer` is "not this one" too.
|
|
116
117
|
|
|
117
118
|
### The interactions navi detects
|
package/docs/navigation.md
CHANGED
|
@@ -580,7 +580,9 @@ Five cases, and they are not a policy to configure but five different facts:
|
|
|
580
580
|
further down than that page is tall.
|
|
581
581
|
- **Replacing the entry** (`<Link replace>`, `route.redirectTo()`, a param
|
|
582
582
|
settling) moves nothing: the same place said differently — except in a row of
|
|
583
|
-
tabs, below.
|
|
583
|
+
tabs, below. A link to the address the document is at replaces too, as the
|
|
584
|
+
browser answers it: stacked, it would leave an entry that Back returns to
|
|
585
|
+
without moving.
|
|
584
586
|
- **A reload** lands where one was, as it would have without navi, once the
|
|
585
587
|
page is there ([below](#a-page-that-is-not-whole-yet)).
|
|
586
588
|
|
|
@@ -727,10 +729,19 @@ above the element has laid out, with nothing to tell it how long to wait.
|
|
|
727
729
|
A mark that only designates — the row a notification points at, outlined until
|
|
728
730
|
the reader moves on — is `:target` too, even though it restyles the element: it
|
|
729
731
|
lasts until the page next writes its URL, which is the length of "this one". A
|
|
730
|
-
search param would outlive it, as state the page does not act on.
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
732
|
+
search param would outlive it, as state the page does not act on.
|
|
733
|
+
|
|
734
|
+
Where the target lands is said for the app with `setUrlTargetOptions({ block })`,
|
|
735
|
+
and by a target for itself with `data-url-target-block` — on the element, or on a
|
|
736
|
+
box around it, a list saying it once for its items — read first. `"auto"` is the
|
|
737
|
+
word for a target the app cannot size ahead: one that fits the screen (less the
|
|
738
|
+
scroll-padding its bars reserve) lands in the middle, read with what is around
|
|
739
|
+
it — the row a notification points at —, one taller lands on its top, where
|
|
740
|
+
reading starts — an article of the terms. It is not the default: an `id` on a
|
|
741
|
+
heading is short, and a heading is read from where it starts. A target that
|
|
742
|
+
wants more room before it says so with a scroll-margin (`scrollMarginBlock` on a
|
|
743
|
+
`Box`), which every alignment honours — never a margin computed to push it
|
|
744
|
+
towards the middle, right for one height of row only.
|
|
734
745
|
|
|
735
746
|
### A row of tabs, where a replace IS an arrival
|
|
736
747
|
|
package/docs/network_policy.md
CHANGED
|
@@ -102,7 +102,7 @@ was asked:
|
|
|
102
102
|
|
|
103
103
|
- **A write is refused before the press.** A control holding a write verb's
|
|
104
104
|
instance — `GAME.DELETE`, `GAME.DELETE.bindParams({ id })` — or any control
|
|
105
|
-
|
|
105
|
+
feeding a `<Form>` holding one, is read-only while the policy holds, and
|
|
106
106
|
answers the press with `readOnlyMessage`.
|
|
107
107
|
|
|
108
108
|
Which actions the policy sees: those declaring a verb (`meta.verb`) — every
|
|
@@ -131,6 +131,17 @@ anything moves: a carried thing is not picked up, a swiped row resists as a wall
|
|
|
131
131
|
does. Undeclared, the gesture plays to the end and the write it calls fails
|
|
132
132
|
after — said on the element, the way any refused answer is.
|
|
133
133
|
|
|
134
|
+
What a held form holds is what feeds its write: its fields, and a press that
|
|
135
|
+
sends or updates what it holds. A button or a link asking nothing of that write
|
|
136
|
+
stays pressable — a travel between slides or a step back in a wizard
|
|
137
|
+
(`--navi-left`, `--navi-go-to-slide:recap`, `--navi-back`), a page (a `Link`,
|
|
138
|
+
`--navi-nav-to`), a `uiAction`, a function of its own without `actionVerb` (a
|
|
139
|
+
"Cancel", `ButtonCopyToClipboard`) — and so is a way out (`--navi-close`,
|
|
140
|
+
`--navi-cancel`). The same goes for what a held control holds: a `Link` in the
|
|
141
|
+
popup of a held `Picker` still leads to its page. The form's own read-only and
|
|
142
|
+
busy state hold them all the same; `whenSelfInteractionsBlocked="ignore"` is what
|
|
143
|
+
takes a button out of those too.
|
|
144
|
+
|
|
134
145
|
## Holding writes while reads go out
|
|
135
146
|
|
|
136
147
|
`reads: "network"` keeps the first half of the policy and drops the second: the
|
|
@@ -196,6 +207,15 @@ has nothing to decide which one says why.
|
|
|
196
207
|
/>;
|
|
197
208
|
```
|
|
198
209
|
|
|
210
|
+
A `<Picker>` whose popup is that form is held the same way with
|
|
211
|
+
`openWhileReadOnly={false}` beside `readOnly`. Read-only alone, a picker
|
|
212
|
+
still opens, so that what it holds can be read, and everything in its popup
|
|
213
|
+
is held in turn — the right answer when the sheet has something to show, a
|
|
214
|
+
step for nothing when it only fills a form. When that form is bound to a
|
|
215
|
+
write or declares its `actionVerb`, navi holds it anyway, and marking the
|
|
216
|
+
opener only decides where the refusal is said: on the opener, before
|
|
217
|
+
anything opens, or in the sheet.
|
|
218
|
+
|
|
199
219
|
- **What a screen says on a `NetworkPolicyError`** — "no network" is a fact
|
|
200
220
|
about the device, "offline mode" a decision, "we are only looking" neither;
|
|
201
221
|
`error.reason` is there so the screen says the right one.
|
package/docs/popup_lift.md
CHANGED
|
@@ -24,6 +24,7 @@ and everything below follows from that one fact.
|
|
|
24
24
|
- [A row of cards: one popup that walks](#a-row-of-cards-one-popup-that-walks)
|
|
25
25
|
- [Lifting on the way back only](#lifting-on-the-way-back-only)
|
|
26
26
|
- [What it costs, and where the time goes](#what-it-costs-and-where-the-time-goes)
|
|
27
|
+
- [Less motion](#less-motion)
|
|
27
28
|
- [The wall, and the frame before the movement](#the-wall-and-the-frame-before-the-movement)
|
|
28
29
|
- [What the browser does around it](#what-the-browser-does-around-it)
|
|
29
30
|
|
|
@@ -286,9 +287,9 @@ and dev warns.
|
|
|
286
287
|
|
|
287
288
|
**Tell the collecting close from the others.** Escape, the back button and a
|
|
288
289
|
press on the wall close the dialog too, and usually mean "not now" rather than
|
|
289
|
-
"collect". A `Dialog`'s or a `
|
|
290
|
-
(`e.detail.requester`, the button of a `--navi-close`), and only the
|
|
291
|
-
collects writes the state.
|
|
290
|
+
"collect". A `Dialog`'s, a `Popover`'s or a `Picker`'s `onClose` receives who
|
|
291
|
+
asked (`e.detail.requester`, the button of a `--navi-close`), and only the
|
|
292
|
+
close that collects writes the state.
|
|
292
293
|
The others land nowhere: the fixed `liftAnchor` names nothing, so they wait out
|
|
293
294
|
those 300 ms, fade out, and dev warns.
|
|
294
295
|
|
|
@@ -317,6 +318,19 @@ and one layout. So the lever is the content:
|
|
|
317
318
|
The movement itself is the browser's: once it starts, the content's cost is
|
|
318
319
|
over.
|
|
319
320
|
|
|
321
|
+
## Less motion
|
|
322
|
+
|
|
323
|
+
Under `prefers-reduced-motion: reduce` nothing lifts: the popup opens or closes
|
|
324
|
+
where it stands. Only the movement is gone — the close is the same close,
|
|
325
|
+
`onClose` and `liftAnchor` are read as before, the wall still fades in. Not a
|
|
326
|
+
cross-fade in its place: that is still a view transition, and the page stays
|
|
327
|
+
frozen under its pictures for as long as it plays.
|
|
328
|
+
|
|
329
|
+
A popup's own opening and closing answer the setting too: `scaling` and
|
|
330
|
+
`expand-*` keep their fade and lose their growth, a `slide-from-*` lands at
|
|
331
|
+
once, `fading` is unchanged. So `{ open: "scaling", close: "lifting" }` closes
|
|
332
|
+
with a fade.
|
|
333
|
+
|
|
320
334
|
## The wall, and the frame before the movement
|
|
321
335
|
|
|
322
336
|
The frame the dialog opens on is the picture the movement starts from. On it the
|
package/docs/popup_open.md
CHANGED
|
@@ -1107,7 +1107,9 @@ share sheet per card) pays one element per closed popup at every mount, not a
|
|
|
1107
1107
|
popup: a row may carry the popups of its own actions. It is built at once when
|
|
1108
1108
|
something needs it from the start — open at mount, a `navState`, an `anchor` (a
|
|
1109
1109
|
hover builds the content ahead of the click), or a `mount` other than the
|
|
1110
|
-
default. A `Picker`'s popup is the picker's own, built with it
|
|
1110
|
+
default. A `Picker`'s popup is the picker's own, built with it: it is anchored
|
|
1111
|
+
on the picker's trigger, whose hover builds the content, and every way the
|
|
1112
|
+
picker opens asks its popup directly.
|
|
1111
1113
|
|
|
1112
1114
|
"Closed" is two states, not one — never opened yet, and closed again after an
|
|
1113
1115
|
opening — so the `mount` prop answers both at once:
|
package/docs/resource.md
CHANGED
|
@@ -566,12 +566,20 @@ out with an example in its JSDoc:
|
|
|
566
566
|
parent the store does not hold yet is left alone: its array comes with its
|
|
567
567
|
next read.
|
|
568
568
|
- **`.scopedOne(propertyName, callbacks)`** — every callback returns
|
|
569
|
-
`[ownerId, props | null]`; the property is `
|
|
569
|
+
`[ownerId, props | null]`; the property is `undefined` until the owner's row
|
|
570
|
+
or a callback speaks for it, `null` when that answer holds none. An owner
|
|
571
|
+
the store does not hold yet is left alone: the answer is the action's value,
|
|
572
|
+
and the owner's next read brings its child.
|
|
570
573
|
- **`.scopedMany(propertyName, { idKey, … })`** — `[ownerId, props]`; `PUT` (an
|
|
571
574
|
id rename) `[ownerId, oldId, props]`; `DELETE` `[ownerId, childId]`; any
|
|
572
575
|
`*_MANY` `[ownerId, itemArray]`, which replaces the whole collection;
|
|
573
576
|
`DELETE_MANY` `[ownerId, [childId, …]]`. `idKey` names the child's own key
|
|
574
|
-
inside its owner (`"id"` by default).
|
|
577
|
+
inside its owner (`"id"` by default). Where the collection arrives — a
|
|
578
|
+
`*_MANY` answer, an owner answer embedding the property — each child is set
|
|
579
|
+
to what it received: a field the held child has and the answer lacks becomes
|
|
580
|
+
`undefined`, since nothing else holds a part of a scoped child (a seat
|
|
581
|
+
changing hands keeps nothing of whoever sat there). A singular answer merges
|
|
582
|
+
into the child, as it may carry a part of it.
|
|
575
583
|
|
|
576
584
|
`ownerId` may be `{ [uniqueKey]: value }` when the owner is known by an
|
|
577
585
|
alternate key. A scoped child takes relations of its own —
|
|
@@ -637,7 +645,8 @@ Relationship mutations do **not** invalidate their parent by default. The rules:
|
|
|
637
645
|
(`POST_MANY` included), rerun nothing on the owner: the callback result
|
|
638
646
|
already carries the updated child, or the whole collection. Its own reads
|
|
639
647
|
still follow its `rerunOn` (`POST` covers `POST_MANY` there).
|
|
640
|
-
- `.scopedOne` mutations rerun nothing, ever — the result is the new value
|
|
648
|
+
- `.scopedOne` mutations rerun nothing, ever — the result is the new value,
|
|
649
|
+
and whoever reads the property is drawn again with it.
|
|
641
650
|
- `.one` / `.many` children live in an independent store; mutating them never
|
|
642
651
|
reruns the parent. A `.many()` write changes the parent's array only through
|
|
643
652
|
the answers naming it (`[parentId, …]`, see
|
|
@@ -775,6 +784,31 @@ written in place is; what fails throws into that first run. A cycle is fine: a
|
|
|
775
784
|
rerun is one hop, and it reruns reads only. `createAction`'s `dependencies` take
|
|
776
785
|
the same function form.
|
|
777
786
|
|
|
787
|
+
As written, that `USER` entry reruns every profile and every list of people
|
|
788
|
+
read in the session at each member added or removed — five more requests for
|
|
789
|
+
three profiles and two lists, growing with the session. A member written moves
|
|
790
|
+
the ranks of the group's list, read by slices, and changes no profile: name
|
|
791
|
+
the reads a heard write reaches with `reads`:
|
|
792
|
+
|
|
793
|
+
```js
|
|
794
|
+
const USER = resource("user", {
|
|
795
|
+
dependencies: () => [
|
|
796
|
+
{
|
|
797
|
+
resource: PLAYER_GROUP,
|
|
798
|
+
on: ["addMember", "removeMember"],
|
|
799
|
+
reads: ["GET_RANGE"],
|
|
800
|
+
},
|
|
801
|
+
],
|
|
802
|
+
GET,
|
|
803
|
+
GET_MANY,
|
|
804
|
+
GET_RANGE,
|
|
805
|
+
});
|
|
806
|
+
```
|
|
807
|
+
|
|
808
|
+
`reads` takes `GET`, `GET_MANY` and `GET_RANGE`; left out, all three. Without
|
|
809
|
+
`on`, it applies to every write of the resource. `createAction`'s
|
|
810
|
+
`dependencies` refuse it: an action is one question, asked again whole.
|
|
811
|
+
|
|
778
812
|
## A function calling the verb, or the instance
|
|
779
813
|
|
|
780
814
|
Both forms are real, and what separates them is narrower than it looks:
|
package/docs/scroll.md
CHANGED
|
@@ -129,7 +129,9 @@ today's) — and it is compared by value, so it can be computed at every render.
|
|
|
129
129
|
left and come back to, or the page reloaded, the way the page does (its `id`
|
|
130
130
|
must name one list of the app, see [below](#a-list-that-comes-back-one-id-one-list));
|
|
131
131
|
**`scrollResetOnNavigation`** opts out. A push to its screen is an arrival and
|
|
132
|
-
forgets it
|
|
132
|
+
forgets it — so is a document loaded fresh at its address, typed or reached from
|
|
133
|
+
outside the app, where only a reload or a back/forward load finds it again —
|
|
134
|
+
even when the address names the item one was reading: a link that is
|
|
133
135
|
a return by meaning says `asReturn`, and the list comes back where that address
|
|
134
136
|
was left (see
|
|
135
137
|
[navigation.md](./navigation.md#where-a-navigation-lands-the-scroll)). What it draws there before its source
|
package/docs/testid.md
CHANGED
|
@@ -213,7 +213,7 @@ side holds is a vnode of yours that takes its own.
|
|
|
213
213
|
Navi's own attributes are implementation, not a contract: `data-header`,
|
|
214
214
|
`data-body`, `data-scrollable`, `data-variant`, `data-callout-*`,
|
|
215
215
|
`navi-control*`, `.navi_*` class names, the ids navi generates when none is
|
|
216
|
-
given (`
|
|
216
|
+
given (`navi_<n>`), and the ids it derives from yours (a picker's popup id is built
|
|
217
217
|
from the picker's, so the suffix is navi's even when the base is not). They
|
|
218
218
|
change without notice and without a migration note. The exception is the state
|
|
219
219
|
a guideline doc tells an app to read — `navi-refreshing`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jsenv/navi",
|
|
3
|
-
"version": "0.29.
|
|
3
|
+
"version": "0.29.494",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Library of components including navigation to create frontend applications",
|
|
6
6
|
"repository": {
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"preact": "^11.0.0-rc.2"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@jsenv/dom": "0.17.
|
|
37
|
+
"@jsenv/dom": "0.17.99",
|
|
38
38
|
"@jsenv/humanize": "1.8.11",
|
|
39
39
|
"@jsenv/validity": "0.4.7"
|
|
40
40
|
},
|