@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.
Files changed (84) hide show
  1. package/CHANGELOG.md +251 -0
  2. package/README.md +23 -19
  3. package/dist/css/juno-custom-media.css +32 -0
  4. package/dist/css/juno.css +1355 -40
  5. package/dist/icons/inline.js +22 -0
  6. package/docs/accessibility.md +188 -0
  7. package/docs/boot-shell.md +295 -0
  8. package/docs/components/README.md +71 -0
  9. package/docs/components/accordion.md +49 -0
  10. package/docs/components/alert.md +46 -0
  11. package/docs/components/avatar.md +45 -0
  12. package/docs/components/badge.md +35 -0
  13. package/docs/components/breadcrumb.md +31 -0
  14. package/docs/components/button.md +32 -0
  15. package/docs/components/card.md +41 -0
  16. package/docs/components/checkbox.md +41 -0
  17. package/docs/components/chip.md +44 -0
  18. package/docs/components/divider.md +32 -0
  19. package/docs/components/dock.md +215 -0
  20. package/docs/components/drawer.md +100 -0
  21. package/docs/components/field.md +44 -0
  22. package/docs/components/fold-slot.md +31 -0
  23. package/docs/components/gauge.md +48 -0
  24. package/docs/components/icon-loader.md +122 -0
  25. package/docs/components/icon.md +70 -0
  26. package/docs/components/input.md +45 -0
  27. package/docs/components/list.md +76 -0
  28. package/docs/components/load-state.md +131 -0
  29. package/docs/components/loader.md +88 -0
  30. package/docs/components/menu.md +54 -0
  31. package/docs/components/modal.md +52 -0
  32. package/docs/components/navbar.md +53 -0
  33. package/docs/components/pagination.md +42 -0
  34. package/docs/components/pillbar.md +211 -0
  35. package/docs/components/popover.md +43 -0
  36. package/docs/components/rail.md +54 -0
  37. package/docs/components/readout.md +39 -0
  38. package/docs/components/reload.md +41 -0
  39. package/docs/components/segmented.md +46 -0
  40. package/docs/components/select.md +33 -0
  41. package/docs/components/skeleton.md +45 -0
  42. package/docs/components/slider.md +48 -0
  43. package/docs/components/spark.md +51 -0
  44. package/docs/components/status.md +30 -0
  45. package/docs/components/stepper.md +46 -0
  46. package/docs/components/switch.md +38 -0
  47. package/docs/components/table.md +126 -0
  48. package/docs/components/tabs.md +61 -0
  49. package/docs/components/thumb.md +81 -0
  50. package/docs/components/toast.md +48 -0
  51. package/docs/components/toggle-button.md +40 -0
  52. package/docs/components/tooltip.md +63 -0
  53. package/docs/design-guidelines.md +173 -0
  54. package/docs/flutter.md +42 -0
  55. package/docs/getting-started.md +93 -0
  56. package/docs/integration.md +95 -0
  57. package/docs/ios-conformance.md +224 -0
  58. package/docs/layout.md +271 -0
  59. package/docs/native.md +52 -0
  60. package/docs/roadmap.md +106 -0
  61. package/docs/tokens-reference.md +223 -0
  62. package/docs/web.md +95 -0
  63. package/package.json +7 -3
  64. package/src/css/base.css +171 -1
  65. package/src/css/components/dock.css +335 -0
  66. package/src/css/components/drawer.css +40 -3
  67. package/src/css/components/fold-slot.css +44 -0
  68. package/src/css/components/icon-loader.css +67 -0
  69. package/src/css/components/icon.css +6 -4
  70. package/src/css/components/load-state.css +136 -0
  71. package/src/css/components/loader.css +6 -0
  72. package/src/css/components/menu.css +4 -0
  73. package/src/css/components/modal.css +24 -3
  74. package/src/css/components/navbar.css +5 -1
  75. package/src/css/components/pillbar.css +222 -7
  76. package/src/css/components/rail.css +8 -0
  77. package/src/css/components/reload.css +48 -0
  78. package/src/css/components/skeleton.css +41 -13
  79. package/src/css/components/tabs.css +5 -0
  80. package/src/css/components/thumb.css +63 -1
  81. package/src/css/components/toast.css +5 -1
  82. package/src/css/density.css +22 -0
  83. package/src/css/layout.css +95 -5
  84. 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
- | [Accessibility](./docs/accessibility.md) | WCAG 2.2 + WAI-ARIA references, focus, motion, targets, RTL |
74
- | [Token reference](./docs/tokens-reference.md) | Every token + value + platform name (generated) |
75
- | [Components](./docs/components/README.md) | 30+ forms, overlays, table, alerts, tabs, icons, nav, more |
76
- | [Contributing](./CONTRIBUTING.md) | Add tokens/components, lint, test, release |
77
- | [Roadmap](./docs/roadmap.md) | Missing capabilities, prioritised |
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 + changelog are automated with [Changesets](https://github.com/changesets/changesets).
109
- Add a changeset with your change (`npm run changeset`). This repo does not allow
110
- GitHub Actions to create pull requests, so prepare the "Version Packages" PR manually
111
- with `npm run version`; once that PR is merged, CI publishes to npm. Bump by the token
112
- contract: remove/rename a token or class major, additive minor, fix → patch. See
113
- [CONTRIBUTING](./CONTRIBUTING.md#releasing).
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);