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