@jsenv/navi 0.29.89 → 0.29.90

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.
@@ -149,6 +149,21 @@ consistency across the app, not from any single call site.
149
149
  and what a nameless one merges, and what a `<Picker type="object">` needs in
150
150
  its popup (one group, not two controls). Read it before making one value out
151
151
  of several controls, and before putting anything in a picker popup.
152
+ - A time of day, and a span between two of them, come as a pair of components
153
+ and the choice between them is about the GESTURE:
154
+ `TimeSpin`/`TimeRangeSpin` (`src/control/picker/preset/spin_time.jsx`) are
155
+ fields one types in, and `TimeWheel`/`TimeRangeWheel`
156
+ (`src/control/wheel/wheel_time.jsx`) are wheels one turns. Both carry a single
157
+ `"HH:MM"` (or `{ start, end }` for a span), so a form holds one field either
158
+ way. Prefer the wheels whenever a half-written value would be nonsense — a
159
+ time typed digit by digit goes through states that are not times ("1" on its
160
+ way to "18"), each of them bounded and corrected under the fingers, while a
161
+ wheel only ever shows values that exist. Two things only the wheels have:
162
+ the bounds of a span PUSH each other while they turn (`minDuration`) instead
163
+ of being refused at send, and `placeholder` is a position shown without being
164
+ an answer — for a span that is optional ("any time of day") on wheels that
165
+ have no blank row to land on. Read this before writing a time input, and
166
+ before making a pair of wheels say "nothing set" by hand.
152
167
  - `docs/control_group.md` — `<Group>`: several controls reading as one framed
153
168
  object (one border per seam, radius on the outer corners only). Read it
154
169
  before placing bordered controls against each other, and before writing
@@ -146,7 +146,19 @@ are not all there yet:
146
146
  or once a child really acts;
147
147
  - a child arriving **after** the value did is placed from what the group holds,
148
148
  so it shows its part of it. A child arriving with something of its own to show
149
- is answering, and keeps it.
149
+ is answering, and keeps it. A child bound to a `signal` is placed like any
150
+ other — bound is not frozen — and the placement writes the signal, so an
151
+ `<Input type="hidden" signal>` carrying a piece of the answer shows what the
152
+ group holds. Only a child controlled by a `value`/`checked` prop is left
153
+ alone: its owner decides.
154
+
155
+ A group with an `aggregateChildStates` of its own is outside all of this: what
156
+ it returns is taken as the truth, `undefined` included. That is the one way such
157
+ a group says **"I have nothing to say yet"** — return `undefined` while the
158
+ children it needs are missing, and navi leaves the value alone instead of
159
+ publishing an empty shape upward. A group written to always return its keys
160
+ (`{ mode: undefined, levels: [] }`) is claiming an answer nobody gave, and that
161
+ claim overwrites the row above it the moment the popup opens.
150
162
 
151
163
  Together they are what makes the two-hop case work — the form fills the row, the
152
164
  row fills the control in its popup — whatever order the pieces turn up in. Get
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsenv/navi",
3
- "version": "0.29.89",
3
+ "version": "0.29.90",
4
4
  "type": "module",
5
5
  "description": "Library of components including navigation to create frontend applications",
6
6
  "repository": {