@junoput01/junoui 0.2.0 → 0.4.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/CHANGELOG.md +251 -0
- package/README.md +23 -19
- package/dist/css/juno-custom-media.css +32 -0
- package/dist/css/juno.css +1355 -40
- package/dist/icons/inline.js +22 -0
- package/docs/accessibility.md +188 -0
- package/docs/boot-shell.md +295 -0
- package/docs/components/README.md +71 -0
- package/docs/components/accordion.md +49 -0
- package/docs/components/alert.md +46 -0
- package/docs/components/avatar.md +45 -0
- package/docs/components/badge.md +35 -0
- package/docs/components/breadcrumb.md +31 -0
- package/docs/components/button.md +32 -0
- package/docs/components/card.md +41 -0
- package/docs/components/checkbox.md +41 -0
- package/docs/components/chip.md +44 -0
- package/docs/components/divider.md +32 -0
- package/docs/components/dock.md +215 -0
- package/docs/components/drawer.md +100 -0
- package/docs/components/field.md +44 -0
- package/docs/components/fold-slot.md +31 -0
- package/docs/components/gauge.md +48 -0
- package/docs/components/icon-loader.md +122 -0
- package/docs/components/icon.md +70 -0
- package/docs/components/input.md +45 -0
- package/docs/components/list.md +76 -0
- package/docs/components/load-state.md +131 -0
- package/docs/components/loader.md +88 -0
- package/docs/components/menu.md +54 -0
- package/docs/components/modal.md +52 -0
- package/docs/components/navbar.md +53 -0
- package/docs/components/pagination.md +42 -0
- package/docs/components/pillbar.md +211 -0
- package/docs/components/popover.md +43 -0
- package/docs/components/rail.md +54 -0
- package/docs/components/readout.md +39 -0
- package/docs/components/reload.md +41 -0
- package/docs/components/segmented.md +46 -0
- package/docs/components/select.md +33 -0
- package/docs/components/skeleton.md +45 -0
- package/docs/components/slider.md +48 -0
- package/docs/components/spark.md +51 -0
- package/docs/components/status.md +30 -0
- package/docs/components/stepper.md +46 -0
- package/docs/components/switch.md +38 -0
- package/docs/components/table.md +126 -0
- package/docs/components/tabs.md +61 -0
- package/docs/components/thumb.md +81 -0
- package/docs/components/toast.md +48 -0
- package/docs/components/toggle-button.md +40 -0
- package/docs/components/tooltip.md +63 -0
- package/docs/design-guidelines.md +173 -0
- package/docs/flutter.md +42 -0
- package/docs/getting-started.md +93 -0
- package/docs/integration.md +95 -0
- package/docs/ios-conformance.md +224 -0
- package/docs/layout.md +271 -0
- package/docs/native.md +52 -0
- package/docs/roadmap.md +106 -0
- package/docs/tokens-reference.md +223 -0
- package/docs/web.md +95 -0
- package/package.json +7 -3
- package/src/css/base.css +171 -1
- package/src/css/components/dock.css +335 -0
- package/src/css/components/drawer.css +40 -3
- package/src/css/components/fold-slot.css +44 -0
- package/src/css/components/icon-loader.css +67 -0
- package/src/css/components/icon.css +6 -4
- package/src/css/components/load-state.css +136 -0
- package/src/css/components/loader.css +6 -0
- package/src/css/components/menu.css +4 -0
- package/src/css/components/modal.css +24 -3
- package/src/css/components/navbar.css +5 -1
- package/src/css/components/pillbar.css +222 -7
- package/src/css/components/rail.css +8 -0
- package/src/css/components/reload.css +48 -0
- package/src/css/components/skeleton.css +41 -13
- package/src/css/components/tabs.css +5 -0
- package/src/css/components/thumb.css +63 -1
- package/src/css/components/toast.css +5 -1
- package/src/css/density.css +22 -0
- package/src/css/layout.css +95 -5
- package/src/css/utilities.css +4 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,256 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.4.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- ff7a437: `.juno-drawer--bottom` is a real bottom sheet: rounded top corners, a decorative
|
|
8
|
+
grab handle (`.juno-sheet__handle`), a height knob `--juno-sheet-h` (default
|
|
9
|
+
`60dvh`) capped by `--juno-sheet-max` (`92dvh`), and safe-area padding moved to
|
|
10
|
+
`.juno-modal__body` so a scrolling sheet's last row clears the home indicator.
|
|
11
|
+
Docs state the contract the app still owns — `showModal()`, focus trap, `inert`
|
|
12
|
+
background, dismiss — and that `<dialog>` is the only supported sheet root.
|
|
13
|
+
Fixes 20260802-019.
|
|
14
|
+
- 8fba3e8: Emit the breakpoints as named media queries — `@junoput01/junoui/css/custom-media`
|
|
15
|
+
ships `--juno-below-*` / `--juno-from-*` generated from the same
|
|
16
|
+
`tokens/core/breakpoint.json`, so consumers stop copying `767.98px` by hand.
|
|
17
|
+
Shipped as its own opt-in file because `@custom-media` needs a build step
|
|
18
|
+
(postcss-custom-media); each entry documents the plain literal to use without
|
|
19
|
+
one. A new build test asserts every breakpoint literal hardcoded in `src/css`
|
|
20
|
+
matches a generated boundary, so the tokens are mechanically the source of
|
|
21
|
+
truth rather than by convention. Fixes 20260802-024.
|
|
22
|
+
- b04aa26: `data-juno-density="auto"` — an opt-in density that renders as `comfortable`
|
|
23
|
+
everywhere except a narrow coarse-pointer viewport, where content spacing
|
|
24
|
+
re-densifies to the `compact` values. It never touches `min-height` or
|
|
25
|
+
`--juno-size-tap-min`, so it cannot regress the WCAG tap-target guarantees.
|
|
26
|
+
Nothing changes for existing `comfortable` / `compact` consumers. Fixes 20260802-023.
|
|
27
|
+
- 3b18db8: Dock gains `.juno-dock--collapsible`: the whole bar folds into a single
|
|
28
|
+
circular `.juno-dock__knob` at the inline-end edge, driven by one inherited
|
|
29
|
+
custom prop the app writes per scroll frame — `--juno-dock-fold` (0 open … 1
|
|
30
|
+
circle) — so the fold can track the gesture. Two phases split at
|
|
31
|
+
`--juno-dock-fold-split`: shrink in place to `--juno-dock-fold-scale`, then
|
|
32
|
+
slide shut to `--juno-dock-collapsed-size`; `data-juno-collapsed` is the
|
|
33
|
+
app-set end state that drops the `.juno-dock__tray` items from the tab order
|
|
34
|
+
and reveals the knob. Composes with `--pill`/`--float`/`--fixed`; zero JS.
|
|
35
|
+
Extracted from nexora's shipped scroll-fold so the mechanism lives in the
|
|
36
|
+
design system and apps keep only the scroll wiring.
|
|
37
|
+
- 2682b04: Dock gains composable variants: `--float` (floating capsule chrome, labels kept)
|
|
38
|
+
and `--icon` (labels hidden, active state moves to a circular bubble) — together
|
|
39
|
+
they reproduce the existing `--pill` look from two independent pieces — plus
|
|
40
|
+
`--juno-dock-scale`, a shrink-on-scroll knob whose transition duration is
|
|
41
|
+
authored through `--juno-motion-scale` so reduced motion collapses it. Also
|
|
42
|
+
fixes the partial border reset on `.juno-dock__item`, which left the UA default
|
|
43
|
+
border on three sides of a `<button>` item. Fixes 20260802-015.
|
|
44
|
+
- 4616add: New `.juno-fold` — animated presence for a member of any row: the slot stays
|
|
45
|
+
mounted and folds its definite width (`--juno-fold-size`) to zero with a fade,
|
|
46
|
+
leaving the tab order at the end of the fold, driven by the app-set
|
|
47
|
+
`data-juno-in` attribute. `--juno-fold-gap` swallows the row's gap so the row
|
|
48
|
+
closes completely. Extracted from nexora's scroll-to-top slot so the generic
|
|
49
|
+
animation lives in the design system.
|
|
50
|
+
- e450769: Publish a gesture-surface convention: `.juno-gesture-surface` marks an element
|
|
51
|
+
whose pointer events app JS fully owns (`touch-action` via `--juno-touch-action`,
|
|
52
|
+
plus the callout / selection / tap-highlight resets the UA otherwise applies),
|
|
53
|
+
with `.juno-pan-x` / `.juno-pan-y` as single-axis escape hatches. Opt-in classes
|
|
54
|
+
only — nothing changes unless applied. This is community convention, not Apple
|
|
55
|
+
guidance; no primary source names these properties for iOS. Fixes 20260802-021.
|
|
56
|
+
- 3675ad7: Ship a JS-readable motion contract. `prefers-reduced-motion` is a CSS media
|
|
57
|
+
query, so imperative JS (smooth-scroll choices, rAF-driven transforms) could
|
|
58
|
+
never see it without its own `matchMedia` listener. The base layer now exposes
|
|
59
|
+
`--juno-motion` (`auto` | `none`) and `--juno-motion-scale` (`1` | `0`) on
|
|
60
|
+
`:root`, flipped inside the existing reduced-motion query — one
|
|
61
|
+
`getComputedStyle` read decides. `--juno-motion-scale` also lets CSS author a
|
|
62
|
+
duration as `calc(var(--juno-motion-duration-base) * var(--juno-motion-scale))`
|
|
63
|
+
instead of repeating a per-component media query. Additive. Closes 20260802-011.
|
|
64
|
+
- 8fba3e8: Encode a load-state vocabulary so nothing spins forever: `.juno-shimmer` (work
|
|
65
|
+
in progress, no ETA), `.juno-fault` (terminal failure), and `.juno-empty`
|
|
66
|
+
(loaded, nothing to show), plus an optional CSS-only `.juno-state` /
|
|
67
|
+
`data-juno-when` switch that shows one treatment at a time. Zero JS — deciding
|
|
68
|
+
when a load becomes a fault stays the app's call; junoui ships the look and the
|
|
69
|
+
ARIA contract (documented in `accessibility.md`). `.juno-shimmer` reuses
|
|
70
|
+
skeleton's keyframe rather than forking a second shimmer. Fixes 20260802-014.
|
|
71
|
+
- 721d2e7: Mobile pill / loading primitives — absorbed from an app that hand-rolled them
|
|
72
|
+
(nexora `feat/mobile-ui`), so the next consumer gets them plug-and-play.
|
|
73
|
+
Almost all additive; a11y contract in `accessibility.md`. Filed as a pre-1.0
|
|
74
|
+
_minor_ (the breaking-capable channel) because two existing surfaces move:
|
|
75
|
+
`.juno-icon-loader` now stacks **every** child on its centre cell, and the
|
|
76
|
+
bottom-sheet / snackbar safe-area fix restores padding that Chromium was
|
|
77
|
+
silently dropping — see the last two bullets.
|
|
78
|
+
|
|
79
|
+
- **Pillbar placement + input slot** — `.juno-pillbar--top-right` /
|
|
80
|
+
`--top-left` / `--bottom-right` / `--bottom-left` pin the pill as a floating
|
|
81
|
+
corner cluster (safe-area-clamped, keeps the blur/border/shadow) instead of
|
|
82
|
+
the centered bottom bar. `.juno-pillbar__input` is a borderless in-pill
|
|
83
|
+
search field held at a `max(16px, …)` font floor so iOS Safari never
|
|
84
|
+
zoom-jumps on focus.
|
|
85
|
+
- **Dock pill variant** — `.juno-dock--pill` + `.juno-dock__bubble`: the
|
|
86
|
+
full-width bar becomes a floating rounded pill with big glyphs in circular
|
|
87
|
+
bubbles, labels hidden (each item then **requires** an `aria-label`), active
|
|
88
|
+
reads as a bubble fill. Folds in the `--juno-icon-size` footgun fix (scoped).
|
|
89
|
+
- **Reload indicator** — `.juno-reload` + `.juno-reload__dot`: the
|
|
90
|
+
non-blocking counterpart to the skeleton for refetch-over-content. Fixed
|
|
91
|
+
centered `role="status"` dot with a soft halo, `pointer-events: none`, gentle
|
|
92
|
+
`juno-pulse` (new shared keyframe).
|
|
93
|
+
- **Inline icon sprite helper** — `@junoput01/junoui/icons/inline`: a tiny
|
|
94
|
+
generated module that injects the sprite into the document once so icons use
|
|
95
|
+
reliable same-document `<use href="#juno-i-…">` refs (external refs
|
|
96
|
+
intermittently drop in Safari). Auto-installs on import; exports
|
|
97
|
+
`installJunoIcons(doc)`.
|
|
98
|
+
- **Safe-area clearance tokens** — `--juno-dock-clearance` /
|
|
99
|
+
`--juno-pillbar-clearance` (web-only CSS custom props, geometry + safe area
|
|
100
|
+
folded in): a floating-nav consumer writes `padding-block-end:
|
|
101
|
+
var(--juno-dock-clearance)` on its scroller and stays correct if the dock
|
|
102
|
+
geometry changes.
|
|
103
|
+
- **`.juno-icon-loader` generalised to _the_ ring-a-control primitive** — the
|
|
104
|
+
ring stroke is now a custom prop (`--juno-icon-loader-ring-width`, default
|
|
105
|
+
`0.14em`) alongside the existing `--juno-icon-loader-ring`, and every child
|
|
106
|
+
— not just `.juno-icon` — shares the centre cell. A host with a definite box
|
|
107
|
+
sets the diameter to that box and the ring hugs its edge without the box
|
|
108
|
+
resizing when the arc appears. `.juno-dock__bubble` is exactly that: pair it
|
|
109
|
+
with `.juno-icon-loader` and an indeterminate `.juno-arc` rings the bubble
|
|
110
|
+
edge while a section loads. There is one ring mechanism, not two.
|
|
111
|
+
_Upgrade note:_ a `.juno-icon-loader` with children beyond the icon + arc
|
|
112
|
+
used to lay them out in extra grid cells; they now stack on the centre cell.
|
|
113
|
+
- **Safe-area `calc()` fix** — the bottom-sheet body and the narrow-viewport
|
|
114
|
+
toast stack passed a **unitless** `0` as the `env(safe-area-inset-bottom)`
|
|
115
|
+
fallback inside `calc()`. A unitless `0` is a `<number>`, so the sum is
|
|
116
|
+
invalid and Chromium dropped the whole declaration — losing the constant
|
|
117
|
+
padding term on every device without a safe area. Fallback is now `0px`, so
|
|
118
|
+
the padding lands as designed (a small, intended, visible shift).
|
|
119
|
+
|
|
120
|
+
- 643d85e: Pillbar gains `.juno-pillbar--collapsible`: the whole pill folds into a single
|
|
121
|
+
circular `.juno-pillbar__toggle` and animates back to full width when tapped.
|
|
122
|
+
State is the toggle's `aria-expanded` (app-owned, zero JS, same convention as
|
|
123
|
+
`__item`'s `aria-pressed`), read via `:has()` so toggle/tray DOM order is free.
|
|
124
|
+
The `.juno-pillbar__tray` animates `grid-template-columns: 0fr ↔ 1fr` — the
|
|
125
|
+
only widely-supported transition to an intrinsic width (Safari 16+) — and goes
|
|
126
|
+
`visibility: hidden` at the end of the slide so collapsed items leave the tab
|
|
127
|
+
order. `__toggle` shares `__overflow`'s circle chrome; existing markup renders
|
|
128
|
+
unchanged.
|
|
129
|
+
- cae069b: Pillbar publishes its geometry as custom props (`--juno-pillbar-item`, `-gap`,
|
|
130
|
+
`-pad`, `-edge`) so an app-side capacity planner reads real values instead of
|
|
131
|
+
hardcoding pixel constants in JS, and adds `.juno-pillbar__overflow` — a "more"
|
|
132
|
+
trigger styled like an item that anchors a `.juno-menu` through the native
|
|
133
|
+
Popover API, zero JS. junoui ships the dock point; which items overflow stays
|
|
134
|
+
app policy. Computed output for existing markup is unchanged. Fixes 20260802-012.
|
|
135
|
+
- 7a653cf: Ship `.juno-scroller` — the scroll-container primitive every scrolling region in
|
|
136
|
+
the library was re-deriving by hand: overflow axis, `overscroll-behavior`, and
|
|
137
|
+
snap type as overridable custom props, plus `--x`/`--y`/`--bare` modifiers and a
|
|
138
|
+
`.juno-snap` child helper. `.juno-reel` becomes its horizontal-mandatory-snap
|
|
139
|
+
preset and reads `scroll-snap-type` from `--juno-scroller-snap`, so the mode is
|
|
140
|
+
overridable per instance instead of hardcoded (default unchanged). The props are
|
|
141
|
+
only read as `var()` fallbacks and never declared on the element, so a reel
|
|
142
|
+
nested inside a scroller keeps its own snap. Fixes 20260802-017.
|
|
143
|
+
- e564c0c: Skeleton gains a content-box mode — `.juno-skeleton--tile` sized by
|
|
144
|
+
`--juno-skeleton-ratio` (default square) for media grids, so the layout doesn't
|
|
145
|
+
jump on load — and the shimmer moves to the compositor: a `::before` band
|
|
146
|
+
animated on `transform` only, never `background-position`, so it stops
|
|
147
|
+
repainting the gradient every frame. The local reduced-motion override is
|
|
148
|
+
dropped in favour of the global one in the base layer.
|
|
149
|
+
- 56b2b3c: `.juno-thumb` gains an aspect-locked frame (`--juno-thumb-ratio`, default
|
|
150
|
+
square) so a media wall's scroll height is stable before anything loads, a
|
|
151
|
+
`--selected` state drawn as an inset outline (never a border — a border would
|
|
152
|
+
reflow the frame), a `--flush` variant for full-bleed tiles, and four
|
|
153
|
+
`__corner` slots for badges/duration chips. Corner modifiers are named
|
|
154
|
+
`--top-start` / `--top-end` / `--bottom-start` / `--bottom-end`, matching the
|
|
155
|
+
logical insets they use, so they flip correctly under `dir="rtl"`. Additive:
|
|
156
|
+
existing markup sets `aspect-ratio` inline, which still wins. Fixes 20260802-018.
|
|
157
|
+
|
|
158
|
+
### Patch Changes
|
|
159
|
+
|
|
160
|
+
- 5a85ae8: `.juno-icon-loader` is documented as what it always was — a primitive that rings
|
|
161
|
+
**any** control (button, badge, avatar), not just a nav icon; the single-cell
|
|
162
|
+
grid never cared what it wrapped. Adds `.juno-arc--smooth`, a continuous-rotation
|
|
163
|
+
modifier for indeterminate arcs, because the default 12-step sweep reads as
|
|
164
|
+
jitter under ~24px. No second ringing mechanism was introduced. Fixes 20260802-013.
|
|
165
|
+
- 2a95eab: docs: boot-shell guide — the five-rung boot ladder (pre-bundle shell with token
|
|
166
|
+
literals, cache-aware chrome, default-screen-only bundle, background warming,
|
|
167
|
+
offline shell), with the sync-guard rules for the literal copies it requires.
|
|
168
|
+
- def7651: `.juno-icon` no longer pins `--juno-icon-size` on the element itself; the
|
|
169
|
+
`1.25em` default now lives in the `var()` fallback. An ancestor that sets
|
|
170
|
+
`--juno-icon-size` for contextual sizing (e.g. `.juno-list__chevron`) is no
|
|
171
|
+
longer shadowed, so it actually reaches the glyph. Explicit `--sm/--lg/--xl`
|
|
172
|
+
modifiers are unaffected. Fixes the footgun in 20260727-011.
|
|
173
|
+
- eb639cc: Add `docs/ios-conformance.md` — the sourced iOS metric contract. Records what
|
|
174
|
+
junoui encodes and why (Apple pt = 1 CSS px, the WCAG 24/44 split, safe-area
|
|
175
|
+
opt-in, the `max()`-vs-addition rule, viewport-unit families), names the
|
|
176
|
+
folklore it deliberately does not encode (the deleted "44pt minimum" HIG
|
|
177
|
+
sentence, the non-existent "Apple 8pt grid"), and flags what is unverified (the
|
|
178
|
+
16px focus-zoom rule, iOS 26 behavior). Fixes 20260803-031.
|
|
179
|
+
- b04aa26: `.juno-label` reads an optional `--juno-label-size`, falling back to the existing
|
|
180
|
+
token, so a consumer can resize labels from an ancestor instead of cloning the
|
|
181
|
+
class. The knob is never declared on the element itself — only read as a `var()`
|
|
182
|
+
fallback — so it cannot shadow an ancestor's value. Fixes 20260802-025.
|
|
183
|
+
- e0f3765: `.juno-modal__body` is now the real scroll port the docs already promised. The
|
|
184
|
+
surface caps its own height (85dvh as a bottom sheet) and sets `overflow:
|
|
185
|
+
hidden`, so a tall body was clipped and unreachable; `[open]` is now a flex
|
|
186
|
+
column and the body carries `min-block-size: 0; overflow-y: auto`. It also gets
|
|
187
|
+
`overscroll-behavior: contain`, so hitting the end of a sheet no longer chains
|
|
188
|
+
the scroll to the page behind it (the rubber-band-under-the-sheet effect on
|
|
189
|
+
iOS). Fixes 20260803-029.
|
|
190
|
+
- 4dd3ef4: Tappable primitives (`.juno-btn`, dock/pillbar/tabs/list/menu items, segmented
|
|
191
|
+
options, chips, toggle buttons) now carry `touch-action: manipulation`, opting
|
|
192
|
+
out of double-tap-to-zoom so a browser no longer waits after the first tap to
|
|
193
|
+
see whether a second is coming — the late, mushy tap a phone UI is built on.
|
|
194
|
+
Panning and pinch-zoom are preserved (never `none`, which would be an a11y
|
|
195
|
+
regression), and it is applied outside the coarse-pointer query so hybrid
|
|
196
|
+
touch devices that report a fine pointer still get it. Fixes 20260803-038.
|
|
197
|
+
- 352b9ca: Close a WCAG 2.5.8 gap on the phone-only surfaces. `.juno-menu__item` (dock
|
|
198
|
+
overflow routes here on phones) and `.juno-navbar__actions > *` now hold
|
|
199
|
+
`min-block-size: var(--juno-size-tap-min)`, which auto-promotes to 44px on
|
|
200
|
+
coarse pointers — so nothing routed onto touch falls under the tap minimum.
|
|
201
|
+
The UA tap-highlight square is now suppressed on the interactive surfaces
|
|
202
|
+
(`.juno-btn`, dock/pillbar/tabs/list/menu items) under `pointer: coarse`, and
|
|
203
|
+
the navbar usage example no longer recommends `.juno-btn--sm` (which is
|
|
204
|
+
deliberately below the tap minimum) on a touch top bar. Fixes 20260802-020.
|
|
205
|
+
- d00697b: Document the `viewport-fit=cover` requirement and make the showcase honour it.
|
|
206
|
+
iOS defaults `viewport-fit` to `auto` and WebKit reports every
|
|
207
|
+
`env(safe-area-inset-*)` as `0` unless the page opts in with `cover` — so every
|
|
208
|
+
safe-area guarantee in the library (dock, pillbar, navbar, drawer, toast,
|
|
209
|
+
app-shell, and the `--juno-*-clearance` tokens) was silently a no-op for any
|
|
210
|
+
consumer who did not already know the trick, including junoui's own showcase.
|
|
211
|
+
Adds the meta to all 13 showcase pages, states it as a hard requirement in
|
|
212
|
+
getting-started + layout docs, and adds a build test so a page cannot lose it
|
|
213
|
+
again. Fixes 20260803-028.
|
|
214
|
+
- 53bc4cd: Fix two silent WebKit failures. `backdrop-filter` was shipped unprefixed only,
|
|
215
|
+
but Safari needed `-webkit-backdrop-filter` until 18 — so the frosted glass on
|
|
216
|
+
the pillbar, pill dock and modal scrim simply did not render on iOS 17 and
|
|
217
|
+
earlier, on exactly the floating chrome the mobile set is built around. And
|
|
218
|
+
`scrollbar-width: none` only reached Safari 18.2, so the scrollable tab strip
|
|
219
|
+
still showed a bar on older iOS; it now carries the `::-webkit-scrollbar`
|
|
220
|
+
fallback the other scrollers already had.
|
|
221
|
+
|
|
222
|
+
## 0.3.0
|
|
223
|
+
|
|
224
|
+
### Minor Changes
|
|
225
|
+
|
|
226
|
+
- a7fb0b8: App-shell composition primitive + nav ergonomics — all CSS, all additive:
|
|
227
|
+
|
|
228
|
+
- `.juno-app-shell` — the standard product frame as classes instead of a
|
|
229
|
+
copy-pasted `<style>` block: `__body` column, `__topbar`, and a `__main`
|
|
230
|
+
scroller with a dock/pillbar pinned at its foot. Encodes `100dvh` (dock isn't
|
|
231
|
+
clipped by mobile browser chrome), main-as-scroller (dock stays put with no
|
|
232
|
+
`sticky`/`fixed`), and safe-area insets. Knob: `--juno-app-shell-topbar-size`.
|
|
233
|
+
- `.juno-rail--responsive` — the rail self-hides below `md`, so the rail↔dock
|
|
234
|
+
swap is one modifier instead of hanging `.juno-hide-below-md` yourself. rail.css
|
|
235
|
+
now cross-references the dock pairing.
|
|
236
|
+
- Viewport helpers extended to `sm` (640px) and `lg` (1024px), each with
|
|
237
|
+
`hide-below-*` / `hide-from-*`, plus readable `show-from-*` / `show-below-*`
|
|
238
|
+
inverse aliases.
|
|
239
|
+
- `.juno-dock--fixed` (pins flush to the foot) / `.juno-pillbar--fixed` (fixes
|
|
240
|
+
to the viewport, still floating its gap above the foot) — for
|
|
241
|
+
page-scroll shells, where `position: sticky` won't pin on a non-overflowing
|
|
242
|
+
column and the bar would land mid-content. Prefer `.juno-app-shell`, which
|
|
243
|
+
avoids the problem entirely.
|
|
244
|
+
- `.juno-icon-loader` — a nav destination's icon ringed by the spinning
|
|
245
|
+
[arc](../docs/components/loader.md) while its section loads. Icon static on
|
|
246
|
+
top; ring sized in `em`, pointer-transparent, kept concentric with a
|
|
247
|
+
single-cell grid (never `translate`, which the arc's rotation would clobber).
|
|
248
|
+
- Touch inputs hold a 16px font floor on coarse pointers, so iOS Safari no
|
|
249
|
+
longer zooms the page when a text field is focused.
|
|
250
|
+
- `docs/` now ships in the npm tarball, so the paths README and the CSS
|
|
251
|
+
comments point at (e.g. `docs/layout.md#app-shell`) resolve inside
|
|
252
|
+
`node_modules` for consumers.
|
|
253
|
+
|
|
3
254
|
## 0.2.0
|
|
4
255
|
|
|
5
256
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -44,7 +44,7 @@ import { TOKENS, getTokens } from '@junoput01/junoui'; // values in JS/TS
|
|
|
44
44
|
<html data-juno-palette="standard" data-juno-mode="dark">
|
|
45
45
|
<span class="juno-badge juno--warning">WARNING</span>
|
|
46
46
|
<svg class="juno-icon juno--active" aria-hidden="true">
|
|
47
|
-
<use href="node_modules/junoui/dist/icons/juno-icons.svg#juno-i-bell" />
|
|
47
|
+
<use href="node_modules/@junoput01/junoui/dist/icons/juno-icons.svg#juno-i-bell" />
|
|
48
48
|
</svg>
|
|
49
49
|
</html>
|
|
50
50
|
```
|
|
@@ -63,18 +63,20 @@ build-time sRGB hex (identical rendering).
|
|
|
63
63
|
|
|
64
64
|
## Documentation
|
|
65
65
|
|
|
66
|
-
| |
|
|
67
|
-
| -------------------------------------------------------------------------------- |
|
|
68
|
-
| [Getting started](./docs/getting-started.md) | Install, model, what ships
|
|
69
|
-
| [Integration](./docs/integration.md) | Consuming in an app: import order, fonts, token bridge
|
|
70
|
-
| [Web](./docs/web.md) · [Native](./docs/native.md) · [Flutter](./docs/flutter.md) | Per-platform usage
|
|
71
|
-
| [Design guidelines](./docs/design-guidelines.md) | Color semantics, a11y — for any tool
|
|
72
|
-
| [Layout](./docs/layout.md) | Responsive primitives + container queries (how blocks adapt)
|
|
73
|
-
| [
|
|
74
|
-
| [
|
|
75
|
-
| [
|
|
76
|
-
| [
|
|
77
|
-
| [
|
|
66
|
+
| | |
|
|
67
|
+
| -------------------------------------------------------------------------------- | ------------------------------------------------------------- |
|
|
68
|
+
| [Getting started](./docs/getting-started.md) | Install, model, what ships |
|
|
69
|
+
| [Integration](./docs/integration.md) | Consuming in an app: import order, fonts, token bridge |
|
|
70
|
+
| [Web](./docs/web.md) · [Native](./docs/native.md) · [Flutter](./docs/flutter.md) | Per-platform usage |
|
|
71
|
+
| [Design guidelines](./docs/design-guidelines.md) | Color semantics, a11y — for any tool |
|
|
72
|
+
| [Layout](./docs/layout.md) | Responsive primitives + container queries (how blocks adapt) |
|
|
73
|
+
| [Boot shell](./docs/boot-shell.md) | Fast first paint: pre-bundle shell, lazy screens, warming |
|
|
74
|
+
| [Accessibility](./docs/accessibility.md) | WCAG 2.2 + WAI-ARIA references, focus, motion, targets, RTL |
|
|
75
|
+
| [iOS conformance](./docs/ios-conformance.md) | Sourced iOS metrics — safe areas, tap targets, viewport units |
|
|
76
|
+
| [Token reference](./docs/tokens-reference.md) | Every token + value + platform name (generated) |
|
|
77
|
+
| [Components](./docs/components/README.md) | 30+ — forms, overlays, table, alerts, tabs, icons, nav, more |
|
|
78
|
+
| [Contributing](./CONTRIBUTING.md) | Add tokens/components, lint, test, release |
|
|
79
|
+
| [Roadmap](./docs/roadmap.md) | Missing capabilities, prioritised |
|
|
78
80
|
|
|
79
81
|
## Repository
|
|
80
82
|
|
|
@@ -105,12 +107,14 @@ The interactive demo lives at `showcase/` and is excluded from the published pac
|
|
|
105
107
|
|
|
106
108
|
## Releasing
|
|
107
109
|
|
|
108
|
-
Versioning
|
|
109
|
-
Add a changeset with your
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
110
|
+
Versioning, changelog and npm publish are fully automated with
|
|
111
|
+
[Changesets](https://github.com/changesets/changesets). Add a changeset with your
|
|
112
|
+
change (`npm run changeset`) and open your PR. On merge to `main`, the Changesets
|
|
113
|
+
GitHub Action opens (or updates) a **"chore: version packages"** PR that applies the
|
|
114
|
+
pending changesets and bumps the version; merging _that_ PR — once no changesets
|
|
115
|
+
remain — publishes `@junoput01/junoui` to npm automatically. No manual `npm run
|
|
116
|
+
version` step. Bump by the token contract: remove/rename a token or class → major,
|
|
117
|
+
additive → minor, fix → patch. See [CONTRIBUTING](./CONTRIBUTING.md#releasing).
|
|
114
118
|
|
|
115
119
|
## License
|
|
116
120
|
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* junoui breakpoints as named media queries.
|
|
3
|
+
* REQUIRES a build step — `@custom-media` has no native browser support:
|
|
4
|
+
* postcss([ require('postcss-custom-media') ])
|
|
5
|
+
* Not running postcss? Use the plain literal shown in each comment instead.
|
|
6
|
+
* Generated by Style Dictionary — do not edit by hand.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/* sm = 640px — small — phone landscape.
|
|
10
|
+
no postcss? write (width <= 639.98px) / (width >= 640px) */
|
|
11
|
+
@custom-media --juno-below-sm (width <= 639.98px);
|
|
12
|
+
@custom-media --juno-from-sm (width >= 640px);
|
|
13
|
+
|
|
14
|
+
/* md = 768px — medium — tablet.
|
|
15
|
+
no postcss? write (width <= 767.98px) / (width >= 768px) */
|
|
16
|
+
@custom-media --juno-below-md (width <= 767.98px);
|
|
17
|
+
@custom-media --juno-from-md (width >= 768px);
|
|
18
|
+
|
|
19
|
+
/* lg = 1024px — large — laptop.
|
|
20
|
+
no postcss? write (width <= 1023.98px) / (width >= 1024px) */
|
|
21
|
+
@custom-media --juno-below-lg (width <= 1023.98px);
|
|
22
|
+
@custom-media --juno-from-lg (width >= 1024px);
|
|
23
|
+
|
|
24
|
+
/* xl = 1280px — extra-large — desktop.
|
|
25
|
+
no postcss? write (width <= 1279.98px) / (width >= 1280px) */
|
|
26
|
+
@custom-media --juno-below-xl (width <= 1279.98px);
|
|
27
|
+
@custom-media --juno-from-xl (width >= 1280px);
|
|
28
|
+
|
|
29
|
+
/* 2xl = 1536px — 2x large — wide desktop.
|
|
30
|
+
no postcss? write (width <= 1535.98px) / (width >= 1536px) */
|
|
31
|
+
@custom-media --juno-below-2xl (width <= 1535.98px);
|
|
32
|
+
@custom-media --juno-from-2xl (width >= 1536px);
|