@junoput01/junoui 0.2.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 +199 -0
- package/README.md +117 -0
- package/dist/android/colors.xml +94 -0
- package/dist/android/dimens.xml +49 -0
- package/dist/css/juno-fonts.css +45 -0
- package/dist/css/juno-tokens.css +345 -0
- package/dist/css/juno.css +4481 -0
- package/dist/flutter/juno_tokens.dart +143 -0
- package/dist/fonts/b612-400.woff2 +0 -0
- package/dist/fonts/b612-700.woff2 +0 -0
- package/dist/fonts/b612-mono-400.woff2 +0 -0
- package/dist/fonts/b612-mono-700.woff2 +0 -0
- package/dist/icons/juno-icons.svg +69 -0
- package/dist/ios/JunoTokens.swift +149 -0
- package/dist/js/tokens.d.ts +11 -0
- package/dist/js/tokens.js +244 -0
- package/dist/json/tokens.json +921 -0
- package/dist/scss/_juno-tokens.scss +176 -0
- package/package.json +92 -0
- package/src/css/base.css +120 -0
- package/src/css/components/accordion.css +83 -0
- package/src/css/components/alert.css +90 -0
- package/src/css/components/avatar.css +82 -0
- package/src/css/components/badge.css +55 -0
- package/src/css/components/breadcrumb.css +64 -0
- package/src/css/components/button.css +59 -0
- package/src/css/components/card.css +68 -0
- package/src/css/components/checkbox.css +89 -0
- package/src/css/components/chip.css +89 -0
- package/src/css/components/divider.css +50 -0
- package/src/css/components/dock.css +74 -0
- package/src/css/components/dot.css +35 -0
- package/src/css/components/drawer.css +80 -0
- package/src/css/components/field.css +37 -0
- package/src/css/components/gauge.css +78 -0
- package/src/css/components/icon.css +35 -0
- package/src/css/components/input.css +60 -0
- package/src/css/components/list.css +135 -0
- package/src/css/components/loader.css +159 -0
- package/src/css/components/menu.css +114 -0
- package/src/css/components/modal.css +161 -0
- package/src/css/components/navbar.css +103 -0
- package/src/css/components/pagination.css +72 -0
- package/src/css/components/pillbar.css +111 -0
- package/src/css/components/popover.css +73 -0
- package/src/css/components/rail.css +96 -0
- package/src/css/components/readout.css +45 -0
- package/src/css/components/segmented.css +99 -0
- package/src/css/components/select.css +38 -0
- package/src/css/components/skeleton.css +62 -0
- package/src/css/components/slider.css +117 -0
- package/src/css/components/spark.css +26 -0
- package/src/css/components/stepper.css +121 -0
- package/src/css/components/switch.css +131 -0
- package/src/css/components/table.css +443 -0
- package/src/css/components/tabs.css +66 -0
- package/src/css/components/thumb.css +69 -0
- package/src/css/components/toast.css +109 -0
- package/src/css/components/toggle-button.css +91 -0
- package/src/css/components/tooltip.css +155 -0
- package/src/css/density.css +40 -0
- package/src/css/fonts.css +45 -0
- package/src/css/layout.css +99 -0
- package/src/css/typescale.css +27 -0
- package/src/css/utilities.css +76 -0
- package/src/fonts/LICENSE +93 -0
- package/src/fonts/b612-400.woff2 +0 -0
- package/src/fonts/b612-700.woff2 +0 -0
- package/src/fonts/b612-mono-400.woff2 +0 -0
- package/src/fonts/b612-mono-700.woff2 +0 -0
- package/src/icons/LICENSE +21 -0
- package/src/icons/arrow-clockwise.svg +1 -0
- package/src/icons/arrow-down.svg +1 -0
- package/src/icons/arrow-left.svg +1 -0
- package/src/icons/arrow-right.svg +1 -0
- package/src/icons/arrow-up.svg +1 -0
- package/src/icons/arrows-clockwise.svg +1 -0
- package/src/icons/arrows-out.svg +1 -0
- package/src/icons/bell.svg +1 -0
- package/src/icons/calendar-blank.svg +1 -0
- package/src/icons/caret-down.svg +1 -0
- package/src/icons/caret-left.svg +1 -0
- package/src/icons/caret-right.svg +1 -0
- package/src/icons/caret-up.svg +1 -0
- package/src/icons/chat-circle.svg +1 -0
- package/src/icons/check-circle.svg +1 -0
- package/src/icons/check.svg +1 -0
- package/src/icons/clock.svg +1 -0
- package/src/icons/cloud-arrow-down.svg +1 -0
- package/src/icons/cloud.svg +1 -0
- package/src/icons/copy.svg +1 -0
- package/src/icons/cpu.svg +1 -0
- package/src/icons/dots-three-vertical.svg +1 -0
- package/src/icons/dots-three.svg +1 -0
- package/src/icons/download.svg +1 -0
- package/src/icons/envelope.svg +1 -0
- package/src/icons/eye-slash.svg +1 -0
- package/src/icons/eye.svg +1 -0
- package/src/icons/file.svg +1 -0
- package/src/icons/film-strip.svg +1 -0
- package/src/icons/floppy-disk.svg +1 -0
- package/src/icons/folder.svg +1 -0
- package/src/icons/funnel.svg +1 -0
- package/src/icons/gear.svg +1 -0
- package/src/icons/hard-drives.svg +1 -0
- package/src/icons/heart.svg +1 -0
- package/src/icons/hexagon.svg +1 -0
- package/src/icons/house.svg +1 -0
- package/src/icons/images.svg +1 -0
- package/src/icons/info.svg +1 -0
- package/src/icons/link.svg +1 -0
- package/src/icons/list.svg +1 -0
- package/src/icons/lock-open.svg +1 -0
- package/src/icons/lock.svg +1 -0
- package/src/icons/magnifying-glass.svg +1 -0
- package/src/icons/minus.svg +1 -0
- package/src/icons/moon.svg +1 -0
- package/src/icons/pencil-simple.svg +1 -0
- package/src/icons/play.svg +1 -0
- package/src/icons/plus.svg +1 -0
- package/src/icons/puzzle-piece.svg +1 -0
- package/src/icons/question.svg +1 -0
- package/src/icons/sliders-horizontal.svg +1 -0
- package/src/icons/sliders.svg +1 -0
- package/src/icons/squares-four.svg +1 -0
- package/src/icons/star.svg +1 -0
- package/src/icons/sun.svg +1 -0
- package/src/icons/trash.svg +1 -0
- package/src/icons/upload-simple.svg +1 -0
- package/src/icons/upload.svg +1 -0
- package/src/icons/user.svg +1 -0
- package/src/icons/users.svg +1 -0
- package/src/icons/warning-circle.svg +1 -0
- package/src/icons/warning.svg +1 -0
- package/src/icons/x-circle.svg +1 -0
- package/src/icons/x.svg +1 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.2.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 7d8a890: Consumer-driven improvements (from the buzz chat-app integration):
|
|
8
|
+
|
|
9
|
+
- **Fonts self-hosted, CSP-safe.** `base.css` no longer fetches Google Fonts
|
|
10
|
+
cross-origin (broke strict CSP, phoned home). B612/B612 Mono ship as woff2 with
|
|
11
|
+
a local `@font-face` sheet, opt-in via `import 'junoui/fonts.css'` (not bundled
|
|
12
|
+
into `juno.css`). **Behavior change:** consumers that relied on junoui pulling the
|
|
13
|
+
font now get a system fallback until they import `junoui/fonts.css` or load B612
|
|
14
|
+
themselves.
|
|
15
|
+
- **Neutral ramp extended:** new `--juno-data-dim` (faint metadata — timestamps,
|
|
16
|
+
tick labels) and `--juno-border-strong` (divider heavier than the hairline
|
|
17
|
+
border), across all three palettes × both modes and every platform output.
|
|
18
|
+
- **Integration guide** (`docs/integration.md`): import order for app shells, the
|
|
19
|
+
token-bridge recipe, fonts opt-in, "accent is semantic (not a brand hue)", and the
|
|
20
|
+
extension/palette policy.
|
|
21
|
+
|
|
22
|
+
- d96b163: Field-driven components + patterns (first production consumer, a media-server web
|
|
23
|
+
client — features landed generic, origin logged in `docs/roadmap.md`):
|
|
24
|
+
|
|
25
|
+
- **Dense sizes:** `.juno-btn--sm` (toolbar-scale button; documented WCAG tap-min
|
|
26
|
+
trade-off) and `.juno-switch--sm` (quiet 40×20 per-row toggle, no printed legend).
|
|
27
|
+
- **Segmented control:** `.juno-seg` — exclusive-choice pill row on native radios,
|
|
28
|
+
zero JS; `aria-pressed` button flavor for JS-driven apps; `--sm` size; role-colored
|
|
29
|
+
checked pill.
|
|
30
|
+
- **Gauge:** `.juno-gauge` — determinate metric ring (conic-gradient + registered
|
|
31
|
+
`--juno-gauge-value`, no SVG); `--sm`/`--lg`; thresholds stay app policy (recipe
|
|
32
|
+
documented).
|
|
33
|
+
- **Spark:** `.juno-spark` — sparkline size/stroke/role contract; app supplies the
|
|
34
|
+
polyline (junoui still ships no charting).
|
|
35
|
+
- **Micro badge:** `.juno-badge--micro` — mono data-UI atom for provenance/kind tags
|
|
36
|
+
and threshold values.
|
|
37
|
+
- **Rail:** `.juno-rail` — collapsible app-shell nav; active styled via
|
|
38
|
+
`aria-current`, logical edges (RTL-safe).
|
|
39
|
+
- **Content density:** `--juno-tile-min` + `--juno-gap-content` archetype and
|
|
40
|
+
`.juno-grid-auto--tiles`, so media walls re-densify from `data-juno-density`.
|
|
41
|
+
- **Icons:** 14 media/system Phosphor glyphs (squares-four, images, hexagon,
|
|
42
|
+
puzzle-piece, play, film-strip, cloud, cloud-arrow-down, arrows-clockwise, cpu,
|
|
43
|
+
hard-drives, sliders, arrows-out, upload-simple).
|
|
44
|
+
- **Docs:** app-shell recipe (`layout.md#app-shell`), drawer slide-over pattern,
|
|
45
|
+
spark point-generator; new `.juno-sr-only` utility.
|
|
46
|
+
|
|
47
|
+
- 02a983b: Mobile adaptations — components restructure themselves on narrow viewports and
|
|
48
|
+
touch devices, no extra classes for most of it:
|
|
49
|
+
|
|
50
|
+
- `.juno-dock` — new bottom-navigation component, the phone counterpart of the
|
|
51
|
+
rail (sticky, safe-area padded, `aria-current` active styling). App-shell
|
|
52
|
+
swap recipe in `layout.md#app-shell`.
|
|
53
|
+
- Modal becomes a bottom sheet below `bp.sm`: full-width, top corners rounded,
|
|
54
|
+
slides up, footer buttons stretch, body pads past the home indicator.
|
|
55
|
+
- Side drawers cap at `85vw` on phones so a sliver of scrim stays tappable;
|
|
56
|
+
the bottom drawer pads for the home indicator.
|
|
57
|
+
- Toast stack goes full-width along the bottom edge on phones; toasts slide up
|
|
58
|
+
instead of sideways.
|
|
59
|
+
- Tab strip scrolls sideways instead of overflowing — every tab stays
|
|
60
|
+
reachable at any width.
|
|
61
|
+
- `.juno-table--stack` (opt-in) — rows become label/value cards below a 480px
|
|
62
|
+
container; give each `td` a `data-label`. Semantics stay a real `<table>`.
|
|
63
|
+
- Touch ergonomics: under `pointer: coarse` the base layer raises
|
|
64
|
+
`--juno-size-tap-min` to the 44px comfortable target; hover-revealed table
|
|
65
|
+
row actions stay visible under `hover: none`.
|
|
66
|
+
|
|
67
|
+
- e7a117f: Mobile navigation kit — the tab + stack pattern, all CSS:
|
|
68
|
+
|
|
69
|
+
- `.juno-pillbar` — floating pill bar (the iOS-style alternative to the dock):
|
|
70
|
+
2–5 icon destinations or actions in a translucent, blurred, fully-rounded
|
|
71
|
+
capsule hovering above the bottom edge; sticky + safe-area cleared. Active
|
|
72
|
+
styles off `aria-current` (links) / `aria-pressed` (toggles); optional
|
|
73
|
+
`__sep` divider between groups.
|
|
74
|
+
- `.juno-navbar` — stack-navigation top bar: a back control **always on the
|
|
75
|
+
start edge** (caret flips under RTL), centered truncating title, trailing
|
|
76
|
+
actions; sticky, safe-area padded on top.
|
|
77
|
+
- `.juno-list` — grouped rows for vertical data organization (the settings
|
|
78
|
+
pattern): uppercase group header over an `s1` card of hairline-divided rows;
|
|
79
|
+
each row = leading icon + label/support + trailing value, control, or
|
|
80
|
+
drill-in chevron. Interactive rows (`<a>`/`<button>`) get hover; static rows
|
|
81
|
+
don't.
|
|
82
|
+
- Tab + stack shell recipe in `layout.md`: dock/pillbar switches sections,
|
|
83
|
+
navbar backs out of pushed views, list rows do the drilling.
|
|
84
|
+
|
|
85
|
+
- 6eb33da: System-preference detection, all CSS:
|
|
86
|
+
|
|
87
|
+
- **Auto color scheme** — `data-juno-mode` is now optional: without it the
|
|
88
|
+
theme follows the OS via `prefers-color-scheme` (per palette, live). An
|
|
89
|
+
explicit mode pins it, exactly as before. The base layer sets
|
|
90
|
+
`color-scheme` so scrollbars/native form chrome match the effective mode.
|
|
91
|
+
- A palette attribute without a mode now resolves to that palette's dark
|
|
92
|
+
theme (previously fell back to standard's colors).
|
|
93
|
+
- `prefers-contrast: more` → hairline borders step up to `border-strong`.
|
|
94
|
+
- `prefers-reduced-transparency` → the pillbar drops its blur/translucency
|
|
95
|
+
for a solid surface.
|
|
96
|
+
|
|
97
|
+
Showcase: mode control gains **AUTO** (the new default); the quick flip
|
|
98
|
+
button resolves the effective OS mode and pins the opposite; the header
|
|
99
|
+
clock formats in the browser's preferred language.
|
|
100
|
+
|
|
101
|
+
- 9426e38: `.juno-thumb` — media thumbnail frame with a built-in unavailable placeholder.
|
|
102
|
+
Muted glyph on `s2` sits under the media; the image covers it while present.
|
|
103
|
+
Failed media removes itself via the optional stateless
|
|
104
|
+
`onerror="this.remove()"`; known-missing media ships no element and the
|
|
105
|
+
placeholder just shows. `--video` flavor (play glyph), `__label` micro-caption.
|
|
106
|
+
Loading remains `.juno-skeleton`'s job. Pairs with `.juno-grid-auto--tiles`.
|
|
107
|
+
|
|
108
|
+
Also: date & time house format documented in `design-guidelines.md`
|
|
109
|
+
(`dd.mm.yyyy`, 24-hour, `05.07.2026 · 14:32`, en-dash ranges) with an
|
|
110
|
+
`Intl.DateTimeFormat` recipe — content convention, no code.
|
|
111
|
+
|
|
112
|
+
- 6cb57ee: WCAG 2.2 contrast audit — dark-mode surface separation + verified AA/AAA claims.
|
|
113
|
+
|
|
114
|
+
Full measured audit added (`scripts/audit-contrast.mjs`, run with `node`) covering every
|
|
115
|
+
text / status / non-text pair across `standard` · `soft` · `colorblind` × dark · light.
|
|
116
|
+
It surfaced three gaps, now fixed:
|
|
117
|
+
|
|
118
|
+
- **Dark `label` failed AA on the `s3` (selected/overlay) surface** (≈ 4.0:1). Lifted
|
|
119
|
+
dark `label` to `oklch(63% …)` across all three palettes so secondary text now clears
|
|
120
|
+
**1.4.3** Contrast (Minimum), AA (≥ 4.5:1) on **every** surface `s0`–`s3` (≈ 4.6–5.9:1),
|
|
121
|
+
data > label > muted hierarchy preserved.
|
|
122
|
+
- **Dark blocks were imperceptible against the background.** Adjacent surface fills
|
|
123
|
+
differ by only ~1.05:1, and the old dark `border`/`border-strong` sat at 1.2:1/1.7:1 vs
|
|
124
|
+
the base surface — cards, panels and dividers had no visible edge. Lifted dark `border`
|
|
125
|
+
and `border-strong` (standard/colorblind → 30% / 40%, soft → 31% / 41%) to ≈ 1.5:1 /
|
|
126
|
+
2.2:1: a quiet-but-visible hairline. (Container boundaries are decorative and exempt
|
|
127
|
+
from **1.4.11**; component-identifying edges already use `--juno-control-edge*`.)
|
|
128
|
+
- **Colorblind AAA claim was overstated on `s3`** (≈ 6.97:1). Docs corrected: colorblind
|
|
129
|
+
status roles meet **1.4.6** AAA on `s0`–`s2`, AA on `s3` — matching how the `data` AAA
|
|
130
|
+
claim is already surface-scoped. Carbon role hues are unchanged (colorblind-safety).
|
|
131
|
+
|
|
132
|
+
`docs/accessibility.md` Color section rewritten to state the measured, surface-scoped
|
|
133
|
+
guarantees and to mark `muted`/`data-dim` as decorative / WCAG-exempt roles.
|
|
134
|
+
|
|
135
|
+
**Breaking:** dark `--juno-color-*-label`, `-border`, `-border-strong` values change
|
|
136
|
+
across `standard`, `soft`, and `colorblind`. Visual only; no API/class changes.
|
|
137
|
+
|
|
138
|
+
### Patch Changes
|
|
139
|
+
|
|
140
|
+
- 2c14c29: Menu items may be links: `a.juno-menu__item` no longer shows the browser
|
|
141
|
+
underline (nav menus render `<a>`s, not only `<button>`s).
|
|
142
|
+
- 8dbb800: Bundle `utilities.css` last in `juno.css`: role helpers (`.juno--nominal` …) set
|
|
143
|
+
`--juno-role` at the same specificity as component defaults
|
|
144
|
+
(`.juno-gauge { --juno-role: … }`), so with utilities first every same-element
|
|
145
|
+
role recolor silently lost the cascade to the component's own default.
|
|
146
|
+
Utilities-last restores `.juno-badge.juno--warning`, `.juno-gauge.juno--caution`,
|
|
147
|
+
`.juno-spark.juno--nominal`, etc. (Found by the Nexora integration.)
|
|
148
|
+
|
|
149
|
+
All notable changes to junoui are documented here. Format follows
|
|
150
|
+
[Keep a Changelog](https://keepachangelog.com/); the package follows
|
|
151
|
+
[semantic versioning](https://semver.org/). Tokens are the public contract: a
|
|
152
|
+
changed token value or removed token is a breaking change.
|
|
153
|
+
|
|
154
|
+
From 0.1.0 on, entries below the `[Unreleased]` heading are generated by
|
|
155
|
+
[Changesets](https://github.com/changesets/changesets) — add one with
|
|
156
|
+
`npm run changeset` rather than editing this file by hand.
|
|
157
|
+
|
|
158
|
+
## [Unreleased]
|
|
159
|
+
|
|
160
|
+
_Nothing yet — managed by Changesets._
|
|
161
|
+
|
|
162
|
+
## [0.1.0] — 2026-06-30
|
|
163
|
+
|
|
164
|
+
### Added
|
|
165
|
+
|
|
166
|
+
- DTCG token source (`tokens/`): color (3 palettes × dark/light), spacing,
|
|
167
|
+
radius, border, sizing, typography, plus foundation scales — motion,
|
|
168
|
+
z-index, elevation/shadow, opacity.
|
|
169
|
+
- Style Dictionary build → CSS, SCSS, JS/TS, JSON, Android, iOS, Flutter;
|
|
170
|
+
dependency-free OKLCH → sRGB hex conversion for native/Flutter.
|
|
171
|
+
- Theming by attribute: `data-juno-palette` × `data-juno-mode`, with
|
|
172
|
+
`data-juno-density` (comfortable/compact) and `data-juno-text`
|
|
173
|
+
(type-scale via `--juno-font-scale`).
|
|
174
|
+
- Framework-agnostic CSS layer driven by one `--juno-role` property —
|
|
175
|
+
**30+ components**: badge, button, card, readout, status dot, loaders;
|
|
176
|
+
form controls (field, input, select, checkbox, radio, switch, slider);
|
|
177
|
+
overlays (modal, drawer, tooltip, popover, menu); table/data-grid;
|
|
178
|
+
alert + toast; tabs + accordion; **icon** (SVG sprite, Phosphor bold, MIT);
|
|
179
|
+
skeleton, avatar, divider, chip/tag, breadcrumb, pagination, stepper.
|
|
180
|
+
- Loaders — arc, beacon, linear bar; indeterminate (CSS-only) and
|
|
181
|
+
determinate (`--juno-progress`).
|
|
182
|
+
- Responsive layout layer: breakpoint tokens + intrinsic primitives (`stack`,
|
|
183
|
+
`cluster`, `grid-auto`, `sidebar`, `switcher`, `reel`, `center`) +
|
|
184
|
+
container-query reflow.
|
|
185
|
+
- Higher-contrast form controls: shared `--juno-control-edge-strong` on inputs,
|
|
186
|
+
checkbox/radio, toggle buttons, switch, slider; lifted switch/slider knobs.
|
|
187
|
+
- npm packaging with `exports` for every platform (incl. `junoui/icons`);
|
|
188
|
+
`prepare` builds `dist/`.
|
|
189
|
+
- Docs: getting-started, web, native, flutter, design-guidelines, accessibility
|
|
190
|
+
(per-component ARIA contract), generated token reference, per-component specs.
|
|
191
|
+
- Interactive `showcase/` demo (repo-only; excluded from the package).
|
|
192
|
+
- Quality: stylelint + prettier, `node:test` integrity suite, Playwright
|
|
193
|
+
visual-regression snapshots, Changesets-driven versioning + publish, CI gate.
|
|
194
|
+
|
|
195
|
+
### Changed
|
|
196
|
+
|
|
197
|
+
- Raised `label` and `muted` text-role contrast to legible levels across all
|
|
198
|
+
three palettes (hue/chroma kept, lightness adjusted) — placeholder/helper
|
|
199
|
+
text now meets contrast on page + panel surfaces.
|
package/README.md
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# junoui — a modern, accessible UI foundation
|
|
2
|
+
|
|
3
|
+
junoui is a design system for building interfaces that are **modern, futuristic and
|
|
4
|
+
visually pleasing** while staying **highly readable and genuinely accessible** — for
|
|
5
|
+
critical systems where legibility is a safety concern, and for everyday apps that
|
|
6
|
+
simply deserve to feel good to use.
|
|
7
|
+
|
|
8
|
+
Mechanically, it is the single graphics source for your UIs: you build the UI
|
|
9
|
+
skeleton; junoui defines color, spacing, typography, radii and sizing. Tokens are
|
|
10
|
+
authored once and compiled to every platform.
|
|
11
|
+
|
|
12
|
+
## Goals
|
|
13
|
+
|
|
14
|
+
- **Look modern.** A futuristic, cohesive aesthetic — dark-first, high-contrast OKLCH
|
|
15
|
+
color, mono numerics, deliberate density and motion — that reads as considered, not
|
|
16
|
+
decorated.
|
|
17
|
+
- **Be accessible by reference, not by vibes.** Built to the international web
|
|
18
|
+
accessibility standards — **WCAG 2.2** (AA throughout, AAA where it counts) and
|
|
19
|
+
**WAI-ARIA** — and we cite the exact success criteria we meet, per component. See
|
|
20
|
+
[Accessibility](./docs/accessibility.md).
|
|
21
|
+
- **Stay readable.** High text contrast, fixed-width digits that don't jitter,
|
|
22
|
+
color-blind-safe palettes, a low-fatigue `soft` palette, and visible focus at all
|
|
23
|
+
times. Readability is the default, not an option you switch on.
|
|
24
|
+
- **Keep improving.** Usability and accessibility are a moving target; junoui treats
|
|
25
|
+
them as ongoing work — tightening contrast, coverage and standards references release
|
|
26
|
+
over release, never regressing them.
|
|
27
|
+
|
|
28
|
+
**Semantic-first:** color encodes status, never decoration —
|
|
29
|
+
every hue has one role (NOMINAL · ACTIVE · TARGET · CAUTION · WARNING).
|
|
30
|
+
|
|
31
|
+
## Install
|
|
32
|
+
|
|
33
|
+
```sh
|
|
34
|
+
npm install @junoput01/junoui
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
```js
|
|
38
|
+
import '@junoput01/junoui/css'; // styles + 30+ components
|
|
39
|
+
import { TOKENS, getTokens } from '@junoput01/junoui'; // values in JS/TS
|
|
40
|
+
// icons: the SVG sprite resolves at '@junoput01/junoui/icons'
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
```html
|
|
44
|
+
<html data-juno-palette="standard" data-juno-mode="dark">
|
|
45
|
+
<span class="juno-badge juno--warning">WARNING</span>
|
|
46
|
+
<svg class="juno-icon juno--active" aria-hidden="true">
|
|
47
|
+
<use href="node_modules/junoui/dist/icons/juno-icons.svg#juno-i-bell" />
|
|
48
|
+
</svg>
|
|
49
|
+
</html>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
3 palettes (`standard` · `colorblind` · `soft`) × 2 modes (`dark` · `light`),
|
|
53
|
+
switched by two HTML attributes.
|
|
54
|
+
|
|
55
|
+
## Platforms
|
|
56
|
+
|
|
57
|
+
One source → every target. Web keeps authored `oklch()`; native/Flutter get
|
|
58
|
+
build-time sRGB hex (identical rendering).
|
|
59
|
+
|
|
60
|
+
| Web | Native | Cross-platform |
|
|
61
|
+
| ---------------- | -------------------------- | ------------------------------- |
|
|
62
|
+
| CSS, SCSS, JS/TS | Android (xml), iOS (Swift) | Flutter (Dart), JSON (W3C DTCG) |
|
|
63
|
+
|
|
64
|
+
## Documentation
|
|
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 |
|
|
78
|
+
|
|
79
|
+
## Repository
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
tokens/ DTCG token source — the single source of truth
|
|
83
|
+
src/css/ authored CSS layer (base, utilities, components)
|
|
84
|
+
src/icons/ vendored SVG icon sources (Phosphor bold, MIT) → sprite
|
|
85
|
+
dist/ built outputs (generated; gitignored)
|
|
86
|
+
docs/ guides + generated token reference
|
|
87
|
+
showcase/ interactive demo (repo-only — not in the npm package)
|
|
88
|
+
scripts/ build helpers (css bundle, doc gen, color conversion)
|
|
89
|
+
design/ original Claude Design canvas source (reference)
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Develop
|
|
93
|
+
|
|
94
|
+
```sh
|
|
95
|
+
npm install # installs deps and builds dist/ (prepare)
|
|
96
|
+
npm run build # tokens (Style Dictionary) + CSS bundle + icon sprite
|
|
97
|
+
npm run gen-docs # regenerate docs/tokens-reference.md
|
|
98
|
+
npm run showcase # build + serve the showcase at :8137
|
|
99
|
+
npm test # build + node:test integrity suite
|
|
100
|
+
npm run test:visual # Playwright screenshot diff (needs `npx playwright install chromium`)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Edit values in `tokens/`, rebuild, and every platform updates together.
|
|
104
|
+
The interactive demo lives at `showcase/` and is excluded from the published package.
|
|
105
|
+
|
|
106
|
+
## Releasing
|
|
107
|
+
|
|
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).
|
|
114
|
+
|
|
115
|
+
## License
|
|
116
|
+
|
|
117
|
+
MIT
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<!-- junoui color tokens. Generated; do not edit. -->
|
|
3
|
+
<resources>
|
|
4
|
+
<color name="colorblind_dark_nominal">#78A9FF</color>
|
|
5
|
+
<color name="colorblind_dark_active">#BE95FF</color>
|
|
6
|
+
<color name="colorblind_dark_target">#FF7EB6</color>
|
|
7
|
+
<color name="colorblind_dark_caution">#F1C21B</color>
|
|
8
|
+
<color name="colorblind_dark_warning">#FF832B</color>
|
|
9
|
+
<color name="colorblind_dark_data">#EAE7E2</color>
|
|
10
|
+
<color name="colorblind_dark_label">#8C8981</color>
|
|
11
|
+
<color name="colorblind_dark_muted">#625F59</color>
|
|
12
|
+
<color name="colorblind_dark_border">#312D27</color>
|
|
13
|
+
<color name="colorblind_dark_s0">#060402</color>
|
|
14
|
+
<color name="colorblind_dark_s1">#0D0B06</color>
|
|
15
|
+
<color name="colorblind_dark_s2">#16130E</color>
|
|
16
|
+
<color name="colorblind_dark_s3">#221F19</color>
|
|
17
|
+
<color name="colorblind_dark_data_dim">#45423C</color>
|
|
18
|
+
<color name="colorblind_dark_border_strong">#4B4740</color>
|
|
19
|
+
<color name="colorblind_light_nominal">#0043CE</color>
|
|
20
|
+
<color name="colorblind_light_active">#6929C4</color>
|
|
21
|
+
<color name="colorblind_light_target">#9F1853</color>
|
|
22
|
+
<color name="colorblind_light_caution">#7D4F00</color>
|
|
23
|
+
<color name="colorblind_light_warning">#BA4300</color>
|
|
24
|
+
<color name="colorblind_light_data">#0B0906</color>
|
|
25
|
+
<color name="colorblind_light_label">#504D47</color>
|
|
26
|
+
<color name="colorblind_light_muted">#8B8984</color>
|
|
27
|
+
<color name="colorblind_light_border">#C7C4BD</color>
|
|
28
|
+
<color name="colorblind_light_s0">#F8F5EF</color>
|
|
29
|
+
<color name="colorblind_light_s1">#EBE7E0</color>
|
|
30
|
+
<color name="colorblind_light_s2">#DEDAD3</color>
|
|
31
|
+
<color name="colorblind_light_s3">#D1CDC7</color>
|
|
32
|
+
<color name="colorblind_light_data_dim">#A19E99</color>
|
|
33
|
+
<color name="colorblind_light_border_strong">#AEAAA4</color>
|
|
34
|
+
<color name="soft_dark_nominal">#38A065</color>
|
|
35
|
+
<color name="soft_dark_active">#00A8BE</color>
|
|
36
|
+
<color name="soft_dark_target">#9C5CAF</color>
|
|
37
|
+
<color name="soft_dark_caution">#D09945</color>
|
|
38
|
+
<color name="soft_dark_warning">#D15D4D</color>
|
|
39
|
+
<color name="soft_dark_data">#E0DED8</color>
|
|
40
|
+
<color name="soft_dark_label">#8C8982</color>
|
|
41
|
+
<color name="soft_dark_muted">#615F59</color>
|
|
42
|
+
<color name="soft_dark_border">#32302B</color>
|
|
43
|
+
<color name="soft_dark_s0">#070602</color>
|
|
44
|
+
<color name="soft_dark_s1">#0F0D08</color>
|
|
45
|
+
<color name="soft_dark_s2">#181610</color>
|
|
46
|
+
<color name="soft_dark_s3">#24211B</color>
|
|
47
|
+
<color name="soft_dark_data_dim">#47453F</color>
|
|
48
|
+
<color name="soft_dark_border_strong">#4D4A44</color>
|
|
49
|
+
<color name="soft_light_nominal">#00582C</color>
|
|
50
|
+
<color name="soft_light_active">#006174</color>
|
|
51
|
+
<color name="soft_light_target">#673477</color>
|
|
52
|
+
<color name="soft_light_caution">#8A5700</color>
|
|
53
|
+
<color name="soft_light_warning">#86281D</color>
|
|
54
|
+
<color name="soft_light_data">#0A0906</color>
|
|
55
|
+
<color name="soft_light_label">#55524C</color>
|
|
56
|
+
<color name="soft_light_muted">#8A8782</color>
|
|
57
|
+
<color name="soft_light_border">#CDCAC3</color>
|
|
58
|
+
<color name="soft_light_s0">#F4F2EA</color>
|
|
59
|
+
<color name="soft_light_s1">#E7E4DD</color>
|
|
60
|
+
<color name="soft_light_s2">#DAD7D0</color>
|
|
61
|
+
<color name="soft_light_s3">#CDCAC3</color>
|
|
62
|
+
<color name="soft_light_data_dim">#9D9B96</color>
|
|
63
|
+
<color name="soft_light_border_strong">#B4B1AA</color>
|
|
64
|
+
<color name="standard_dark_nominal">#00CB4C</color>
|
|
65
|
+
<color name="standard_dark_active">#00CDDF</color>
|
|
66
|
+
<color name="standard_dark_target">#D63DE6</color>
|
|
67
|
+
<color name="standard_dark_caution">#F4A000</color>
|
|
68
|
+
<color name="standard_dark_warning">#F13A32</color>
|
|
69
|
+
<color name="standard_dark_data">#EAE7E2</color>
|
|
70
|
+
<color name="standard_dark_label">#8C8981</color>
|
|
71
|
+
<color name="standard_dark_muted">#625F59</color>
|
|
72
|
+
<color name="standard_dark_border">#312D27</color>
|
|
73
|
+
<color name="standard_dark_s0">#060402</color>
|
|
74
|
+
<color name="standard_dark_s1">#0D0B06</color>
|
|
75
|
+
<color name="standard_dark_s2">#16130E</color>
|
|
76
|
+
<color name="standard_dark_s3">#221F19</color>
|
|
77
|
+
<color name="standard_dark_data_dim">#45423C</color>
|
|
78
|
+
<color name="standard_dark_border_strong">#4B4740</color>
|
|
79
|
+
<color name="standard_light_nominal">#006400</color>
|
|
80
|
+
<color name="standard_light_active">#006B98</color>
|
|
81
|
+
<color name="standard_light_target">#8B0097</color>
|
|
82
|
+
<color name="standard_light_caution">#9B4C00</color>
|
|
83
|
+
<color name="standard_light_warning">#A10000</color>
|
|
84
|
+
<color name="standard_light_data">#0B0906</color>
|
|
85
|
+
<color name="standard_light_label">#504D47</color>
|
|
86
|
+
<color name="standard_light_muted">#8B8984</color>
|
|
87
|
+
<color name="standard_light_border">#C7C4BD</color>
|
|
88
|
+
<color name="standard_light_s0">#F8F5EF</color>
|
|
89
|
+
<color name="standard_light_s1">#EBE7E0</color>
|
|
90
|
+
<color name="standard_light_s2">#DEDAD3</color>
|
|
91
|
+
<color name="standard_light_s3">#D1CDC7</color>
|
|
92
|
+
<color name="standard_light_data_dim">#A19E99</color>
|
|
93
|
+
<color name="standard_light_border_strong">#AEAAA4</color>
|
|
94
|
+
</resources>
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<!-- junoui dimension tokens. Generated; do not edit. -->
|
|
3
|
+
<resources>
|
|
4
|
+
<dimen name="border_width_1">1dp</dimen>
|
|
5
|
+
<dimen name="border_width_2">2dp</dimen>
|
|
6
|
+
<dimen name="border_width_3">3dp</dimen>
|
|
7
|
+
<dimen name="bp_sm">640dp</dimen>
|
|
8
|
+
<dimen name="bp_md">768dp</dimen>
|
|
9
|
+
<dimen name="bp_lg">1024dp</dimen>
|
|
10
|
+
<dimen name="bp_xl">1280dp</dimen>
|
|
11
|
+
<dimen name="bp_2xl">1536dp</dimen>
|
|
12
|
+
<dimen name="radius_2">2dp</dimen>
|
|
13
|
+
<dimen name="radius_3">3dp</dimen>
|
|
14
|
+
<dimen name="radius_4">4dp</dimen>
|
|
15
|
+
<dimen name="radius_5">5dp</dimen>
|
|
16
|
+
<dimen name="radius_8">8dp</dimen>
|
|
17
|
+
<dimen name="size_tap_min">24dp</dimen>
|
|
18
|
+
<dimen name="size_tap_comfortable">44dp</dimen>
|
|
19
|
+
<dimen name="size_dot_sm">8dp</dimen>
|
|
20
|
+
<dimen name="size_dot_md">10dp</dimen>
|
|
21
|
+
<dimen name="space_2">2dp</dimen>
|
|
22
|
+
<dimen name="space_4">4dp</dimen>
|
|
23
|
+
<dimen name="space_8">8dp</dimen>
|
|
24
|
+
<dimen name="space_10">10dp</dimen>
|
|
25
|
+
<dimen name="space_12">12dp</dimen>
|
|
26
|
+
<dimen name="space_16">16dp</dimen>
|
|
27
|
+
<dimen name="space_20">20dp</dimen>
|
|
28
|
+
<dimen name="space_24">24dp</dimen>
|
|
29
|
+
<dimen name="space_28">28dp</dimen>
|
|
30
|
+
<dimen name="space_32">32dp</dimen>
|
|
31
|
+
<dimen name="space_40">40dp</dimen>
|
|
32
|
+
<dimen name="space_56">56dp</dimen>
|
|
33
|
+
<dimen name="space_72">72dp</dimen>
|
|
34
|
+
<dimen name="space_96">96dp</dimen>
|
|
35
|
+
<dimen name="font_size_10">10sp</dimen>
|
|
36
|
+
<dimen name="font_size_11">11sp</dimen>
|
|
37
|
+
<dimen name="font_size_12">12sp</dimen>
|
|
38
|
+
<dimen name="font_size_13">13sp</dimen>
|
|
39
|
+
<dimen name="font_size_14">14sp</dimen>
|
|
40
|
+
<dimen name="font_size_16">16sp</dimen>
|
|
41
|
+
<dimen name="font_size_18">18sp</dimen>
|
|
42
|
+
<dimen name="font_size_20">20sp</dimen>
|
|
43
|
+
<dimen name="font_size_28">28sp</dimen>
|
|
44
|
+
<dimen name="font_size_32">32sp</dimen>
|
|
45
|
+
<dimen name="font_size_36">36sp</dimen>
|
|
46
|
+
<dimen name="font_size_38">38sp</dimen>
|
|
47
|
+
<dimen name="font_size_48">48sp</dimen>
|
|
48
|
+
<dimen name="font_size_52">52sp</dimen>
|
|
49
|
+
</resources>
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/* ════════════════════════════════════════════════════════════════════
|
|
2
|
+
* junoui — fonts (opt-in)
|
|
3
|
+
* Self-hosted B612 / B612 Mono (@font-face, local woff2). This file is NOT
|
|
4
|
+
* bundled into juno.css — import it separately if you want junoui to supply
|
|
5
|
+
* the typeface, or skip it and load B612 yourself (e.g. @fontsource):
|
|
6
|
+
*
|
|
7
|
+
* import 'junoui/css'; // tokens + components (no network fonts)
|
|
8
|
+
* import 'junoui/fonts.css'; // ← only if you want junoui's fonts
|
|
9
|
+
*
|
|
10
|
+
* Never fetches cross-origin, so it is safe under a strict CSP. Paths are
|
|
11
|
+
* relative to dist/css/, resolving to the woff2 shipped in dist/fonts/.
|
|
12
|
+
* B612 is licensed under the SIL OFL 1.1 — see the fonts' LICENSE.
|
|
13
|
+
* ════════════════════════════════════════════════════════════════════ */
|
|
14
|
+
|
|
15
|
+
@font-face {
|
|
16
|
+
font-family: 'B612';
|
|
17
|
+
font-style: normal;
|
|
18
|
+
font-weight: 400;
|
|
19
|
+
font-display: swap;
|
|
20
|
+
src: url('../fonts/b612-400.woff2') format('woff2');
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@font-face {
|
|
24
|
+
font-family: 'B612';
|
|
25
|
+
font-style: normal;
|
|
26
|
+
font-weight: 700;
|
|
27
|
+
font-display: swap;
|
|
28
|
+
src: url('../fonts/b612-700.woff2') format('woff2');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
@font-face {
|
|
32
|
+
font-family: 'B612 Mono';
|
|
33
|
+
font-style: normal;
|
|
34
|
+
font-weight: 400;
|
|
35
|
+
font-display: swap;
|
|
36
|
+
src: url('../fonts/b612-mono-400.woff2') format('woff2');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
@font-face {
|
|
40
|
+
font-family: 'B612 Mono';
|
|
41
|
+
font-style: normal;
|
|
42
|
+
font-weight: 700;
|
|
43
|
+
font-display: swap;
|
|
44
|
+
src: url('../fonts/b612-mono-700.woff2') format('woff2');
|
|
45
|
+
}
|