@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.
Files changed (136) hide show
  1. package/CHANGELOG.md +199 -0
  2. package/README.md +117 -0
  3. package/dist/android/colors.xml +94 -0
  4. package/dist/android/dimens.xml +49 -0
  5. package/dist/css/juno-fonts.css +45 -0
  6. package/dist/css/juno-tokens.css +345 -0
  7. package/dist/css/juno.css +4481 -0
  8. package/dist/flutter/juno_tokens.dart +143 -0
  9. package/dist/fonts/b612-400.woff2 +0 -0
  10. package/dist/fonts/b612-700.woff2 +0 -0
  11. package/dist/fonts/b612-mono-400.woff2 +0 -0
  12. package/dist/fonts/b612-mono-700.woff2 +0 -0
  13. package/dist/icons/juno-icons.svg +69 -0
  14. package/dist/ios/JunoTokens.swift +149 -0
  15. package/dist/js/tokens.d.ts +11 -0
  16. package/dist/js/tokens.js +244 -0
  17. package/dist/json/tokens.json +921 -0
  18. package/dist/scss/_juno-tokens.scss +176 -0
  19. package/package.json +92 -0
  20. package/src/css/base.css +120 -0
  21. package/src/css/components/accordion.css +83 -0
  22. package/src/css/components/alert.css +90 -0
  23. package/src/css/components/avatar.css +82 -0
  24. package/src/css/components/badge.css +55 -0
  25. package/src/css/components/breadcrumb.css +64 -0
  26. package/src/css/components/button.css +59 -0
  27. package/src/css/components/card.css +68 -0
  28. package/src/css/components/checkbox.css +89 -0
  29. package/src/css/components/chip.css +89 -0
  30. package/src/css/components/divider.css +50 -0
  31. package/src/css/components/dock.css +74 -0
  32. package/src/css/components/dot.css +35 -0
  33. package/src/css/components/drawer.css +80 -0
  34. package/src/css/components/field.css +37 -0
  35. package/src/css/components/gauge.css +78 -0
  36. package/src/css/components/icon.css +35 -0
  37. package/src/css/components/input.css +60 -0
  38. package/src/css/components/list.css +135 -0
  39. package/src/css/components/loader.css +159 -0
  40. package/src/css/components/menu.css +114 -0
  41. package/src/css/components/modal.css +161 -0
  42. package/src/css/components/navbar.css +103 -0
  43. package/src/css/components/pagination.css +72 -0
  44. package/src/css/components/pillbar.css +111 -0
  45. package/src/css/components/popover.css +73 -0
  46. package/src/css/components/rail.css +96 -0
  47. package/src/css/components/readout.css +45 -0
  48. package/src/css/components/segmented.css +99 -0
  49. package/src/css/components/select.css +38 -0
  50. package/src/css/components/skeleton.css +62 -0
  51. package/src/css/components/slider.css +117 -0
  52. package/src/css/components/spark.css +26 -0
  53. package/src/css/components/stepper.css +121 -0
  54. package/src/css/components/switch.css +131 -0
  55. package/src/css/components/table.css +443 -0
  56. package/src/css/components/tabs.css +66 -0
  57. package/src/css/components/thumb.css +69 -0
  58. package/src/css/components/toast.css +109 -0
  59. package/src/css/components/toggle-button.css +91 -0
  60. package/src/css/components/tooltip.css +155 -0
  61. package/src/css/density.css +40 -0
  62. package/src/css/fonts.css +45 -0
  63. package/src/css/layout.css +99 -0
  64. package/src/css/typescale.css +27 -0
  65. package/src/css/utilities.css +76 -0
  66. package/src/fonts/LICENSE +93 -0
  67. package/src/fonts/b612-400.woff2 +0 -0
  68. package/src/fonts/b612-700.woff2 +0 -0
  69. package/src/fonts/b612-mono-400.woff2 +0 -0
  70. package/src/fonts/b612-mono-700.woff2 +0 -0
  71. package/src/icons/LICENSE +21 -0
  72. package/src/icons/arrow-clockwise.svg +1 -0
  73. package/src/icons/arrow-down.svg +1 -0
  74. package/src/icons/arrow-left.svg +1 -0
  75. package/src/icons/arrow-right.svg +1 -0
  76. package/src/icons/arrow-up.svg +1 -0
  77. package/src/icons/arrows-clockwise.svg +1 -0
  78. package/src/icons/arrows-out.svg +1 -0
  79. package/src/icons/bell.svg +1 -0
  80. package/src/icons/calendar-blank.svg +1 -0
  81. package/src/icons/caret-down.svg +1 -0
  82. package/src/icons/caret-left.svg +1 -0
  83. package/src/icons/caret-right.svg +1 -0
  84. package/src/icons/caret-up.svg +1 -0
  85. package/src/icons/chat-circle.svg +1 -0
  86. package/src/icons/check-circle.svg +1 -0
  87. package/src/icons/check.svg +1 -0
  88. package/src/icons/clock.svg +1 -0
  89. package/src/icons/cloud-arrow-down.svg +1 -0
  90. package/src/icons/cloud.svg +1 -0
  91. package/src/icons/copy.svg +1 -0
  92. package/src/icons/cpu.svg +1 -0
  93. package/src/icons/dots-three-vertical.svg +1 -0
  94. package/src/icons/dots-three.svg +1 -0
  95. package/src/icons/download.svg +1 -0
  96. package/src/icons/envelope.svg +1 -0
  97. package/src/icons/eye-slash.svg +1 -0
  98. package/src/icons/eye.svg +1 -0
  99. package/src/icons/file.svg +1 -0
  100. package/src/icons/film-strip.svg +1 -0
  101. package/src/icons/floppy-disk.svg +1 -0
  102. package/src/icons/folder.svg +1 -0
  103. package/src/icons/funnel.svg +1 -0
  104. package/src/icons/gear.svg +1 -0
  105. package/src/icons/hard-drives.svg +1 -0
  106. package/src/icons/heart.svg +1 -0
  107. package/src/icons/hexagon.svg +1 -0
  108. package/src/icons/house.svg +1 -0
  109. package/src/icons/images.svg +1 -0
  110. package/src/icons/info.svg +1 -0
  111. package/src/icons/link.svg +1 -0
  112. package/src/icons/list.svg +1 -0
  113. package/src/icons/lock-open.svg +1 -0
  114. package/src/icons/lock.svg +1 -0
  115. package/src/icons/magnifying-glass.svg +1 -0
  116. package/src/icons/minus.svg +1 -0
  117. package/src/icons/moon.svg +1 -0
  118. package/src/icons/pencil-simple.svg +1 -0
  119. package/src/icons/play.svg +1 -0
  120. package/src/icons/plus.svg +1 -0
  121. package/src/icons/puzzle-piece.svg +1 -0
  122. package/src/icons/question.svg +1 -0
  123. package/src/icons/sliders-horizontal.svg +1 -0
  124. package/src/icons/sliders.svg +1 -0
  125. package/src/icons/squares-four.svg +1 -0
  126. package/src/icons/star.svg +1 -0
  127. package/src/icons/sun.svg +1 -0
  128. package/src/icons/trash.svg +1 -0
  129. package/src/icons/upload-simple.svg +1 -0
  130. package/src/icons/upload.svg +1 -0
  131. package/src/icons/user.svg +1 -0
  132. package/src/icons/users.svg +1 -0
  133. package/src/icons/warning-circle.svg +1 -0
  134. package/src/icons/warning.svg +1 -0
  135. package/src/icons/x-circle.svg +1 -0
  136. 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
+ }