@nexub/themes 1.0.0 → 1.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nexub/themes",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "description": "CSS theme files for Nexub Design System — light, dark, and brand themes (Leap, Bookub, Payub, Founderub) as importable CSS.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/Nexub-AI/nexub-ds#readme",
@@ -36,6 +36,7 @@
36
36
  "./founderub": "./src/founderub.css"
37
37
  },
38
38
  "dependencies": {
39
- "@nexub/tokens": "1.0.0"
39
+ "@fontsource-variable/plus-jakarta-sans": "^5.3.0",
40
+ "@nexub/tokens": "1.2.0"
40
41
  }
41
42
  }
package/src/base.css CHANGED
@@ -2,6 +2,11 @@
2
2
  Global resets, focus ring, body, scrollbar, reduced-motion.
3
3
  Import this once at the root of your app before light.css or dark.css. */
4
4
 
5
+ /* Plus Jakarta Sans — the Nexub DS typeface. Self-hosted (OFL-1.1) via
6
+ Fontsource; variable weights 200–800, normal + italic. Subsets load on
7
+ demand via unicode-range, so only the glyphs a page uses are fetched. */
8
+ @import '@fontsource-variable/plus-jakarta-sans/wght.css';
9
+ @import '@fontsource-variable/plus-jakarta-sans/wght-italic.css';
5
10
  @import '@nexub/tokens/css';
6
11
 
7
12
  /* ─── Semantic shorthand aliases ───────────────────────────────────────────
@@ -36,14 +41,49 @@
36
41
  --color-info-bg: var(--color-semantic-info-bg);
37
42
  --color-info-border: var(--color-semantic-info-border);
38
43
 
44
+ /* Focus ring follows the theme's ring tokens (the tokens default is a fixed
45
+ white/blue pair, wrong in dark mode and brand themes). */
46
+ --shadow-focus: 0 0 0 2px var(--color-ring-offset), 0 0 0 4px var(--color-ring-default);
47
+
48
+ /* Form-control boundaries (WCAG 1.4.11 needs >= 3:1 against the page).
49
+ Separate from --color-border-default, which cards/dividers keep light. */
50
+ --color-border-input: #848e9f;
51
+
39
52
  /* placeholder text (PKG-B01) */
40
- --color-text-placeholder: var(--color-text-subtle);
53
+ --color-text-placeholder: var(--color-text-muted);
41
54
 
42
55
  /* tone text aliases — used by Heading tone prop + HelperText (PKG-H01) */
43
- --color-text-info: var(--color-semantic-info-default);
44
- --color-text-success: var(--color-semantic-success-default);
45
- --color-text-warning: var(--color-semantic-warning-default);
46
- --color-text-danger: var(--color-semantic-error-default);
56
+ /* -strong passes WCAG AA as text in both light (dark shade) and dark (light shade). */
57
+ --color-text-info: var(--color-semantic-info-strong);
58
+ --color-text-success: var(--color-semantic-success-strong);
59
+ --color-text-warning: var(--color-semantic-warning-strong);
60
+ --color-text-danger: var(--color-semantic-error-strong);
61
+
62
+ /* Solid fills under white text. Fixed shades (they do NOT flip in dark mode)
63
+ chosen so white text is >= 4.5:1 (WCAG AA). Brand themes override accent. */
64
+ --color-fill-primary: var(--color-brand-primary-600);
65
+ --color-fill-primary-hover: var(--color-brand-primary-700);
66
+ --color-fill-info: var(--color-brand-primary-600);
67
+ --color-fill-info-hover: var(--color-brand-primary-700);
68
+ --color-fill-success: #047857;
69
+ --color-fill-success-hover: #065f46;
70
+ --color-fill-warning: #b45309;
71
+ --color-fill-warning-hover: #92400e;
72
+ --color-fill-danger: #b91c1c;
73
+ --color-fill-danger-hover: #991b1b;
74
+ --color-fill-leap: var(--color-accent-leap-600);
75
+ --color-fill-leap-hover: var(--color-accent-leap-700);
76
+ --color-fill-bookub: var(--color-accent-bookub-700);
77
+ --color-fill-bookub-hover: var(--color-accent-bookub-800);
78
+ --color-fill-payub: var(--color-accent-payub-600);
79
+ --color-fill-payub-hover: var(--color-accent-payub-700);
80
+ --color-fill-founderub: var(--color-accent-founderub-700);
81
+ --color-fill-founderub-hover: var(--color-accent-founderub-800);
82
+ --color-fill-accent: var(--color-fill-primary);
83
+ --color-fill-accent-hover: var(--color-fill-primary-hover);
84
+
85
+ /* scrim behind modal surfaces (Dialog, AlertDialog, Sheet/Drawer, CommandPalette) */
86
+ --color-overlay: rgb(0 0 0 / 0.5);
47
87
 
48
88
  /* accent fallback — used without any brand theme applied (PKG-B03) */
49
89
  --color-accent-500: var(--color-brand-primary-500);
@@ -100,6 +140,13 @@ html {
100
140
  text-size-adjust: 100%;
101
141
  }
102
142
 
143
+ /* Form controls don't inherit fonts by default — without this, apps that
144
+ don't use Tailwind's preflight would render buttons/inputs in the system UI
145
+ font instead of Plus Jakarta Sans. */
146
+ button, input, select, textarea, optgroup {
147
+ font-family: inherit;
148
+ }
149
+
103
150
  body {
104
151
  min-height: 100vh;
105
152
  margin: 0;
@@ -189,3 +236,14 @@ code, kbd, pre, samp {
189
236
  from { transform: translateX(0); }
190
237
  to { transform: translateX(-50%); }
191
238
  }
239
+
240
+ /* ─── Drawer / Sheet (vaul 1.1.2) ─────────────────────────────────────────────
241
+ vaul's own styles. vaul normally injects these in a <style> tag when
242
+ @nexub/react loads, which strict CSP pages block; @nexub/react strips that
243
+ and ships them here instead. Verbatim copy: the @nexub/react build fails if
244
+ it no longer matches vaul. One rule is left out: vaul's invalid
245
+ `[data-vaul-handle-hitarea]:{…}` media rule, which browsers ignore and strict
246
+ CSS parsers (lightningcss, Turbopack) reject. */
247
+ [data-vaul-drawer]{touch-action:none;will-change:transform;transition:transform .5s cubic-bezier(.32, .72, 0, 1);animation-duration:.5s;animation-timing-function:cubic-bezier(0.32,0.72,0,1)}[data-vaul-drawer][data-vaul-snap-points=false][data-vaul-drawer-direction=bottom][data-state=open]{animation-name:slideFromBottom}[data-vaul-drawer][data-vaul-snap-points=false][data-vaul-drawer-direction=bottom][data-state=closed]{animation-name:slideToBottom}[data-vaul-drawer][data-vaul-snap-points=false][data-vaul-drawer-direction=top][data-state=open]{animation-name:slideFromTop}[data-vaul-drawer][data-vaul-snap-points=false][data-vaul-drawer-direction=top][data-state=closed]{animation-name:slideToTop}[data-vaul-drawer][data-vaul-snap-points=false][data-vaul-drawer-direction=left][data-state=open]{animation-name:slideFromLeft}[data-vaul-drawer][data-vaul-snap-points=false][data-vaul-drawer-direction=left][data-state=closed]{animation-name:slideToLeft}[data-vaul-drawer][data-vaul-snap-points=false][data-vaul-drawer-direction=right][data-state=open]{animation-name:slideFromRight}[data-vaul-drawer][data-vaul-snap-points=false][data-vaul-drawer-direction=right][data-state=closed]{animation-name:slideToRight}[data-vaul-drawer][data-vaul-snap-points=true][data-vaul-drawer-direction=bottom]{transform:translate3d(0,var(--initial-transform,100%),0)}[data-vaul-drawer][data-vaul-snap-points=true][data-vaul-drawer-direction=top]{transform:translate3d(0,calc(var(--initial-transform,100%) * -1),0)}[data-vaul-drawer][data-vaul-snap-points=true][data-vaul-drawer-direction=left]{transform:translate3d(calc(var(--initial-transform,100%) * -1),0,0)}[data-vaul-drawer][data-vaul-snap-points=true][data-vaul-drawer-direction=right]{transform:translate3d(var(--initial-transform,100%),0,0)}[data-vaul-drawer][data-vaul-delayed-snap-points=true][data-vaul-drawer-direction=top]{transform:translate3d(0,var(--snap-point-height,0),0)}[data-vaul-drawer][data-vaul-delayed-snap-points=true][data-vaul-drawer-direction=bottom]{transform:translate3d(0,var(--snap-point-height,0),0)}[data-vaul-drawer][data-vaul-delayed-snap-points=true][data-vaul-drawer-direction=left]{transform:translate3d(var(--snap-point-height,0),0,0)}[data-vaul-drawer][data-vaul-delayed-snap-points=true][data-vaul-drawer-direction=right]{transform:translate3d(var(--snap-point-height,0),0,0)}[data-vaul-overlay][data-vaul-snap-points=false]{animation-duration:.5s;animation-timing-function:cubic-bezier(0.32,0.72,0,1)}[data-vaul-overlay][data-vaul-snap-points=false][data-state=open]{animation-name:fadeIn}[data-vaul-overlay][data-state=closed]{animation-name:fadeOut}[data-vaul-animate=false]{animation:none!important}[data-vaul-overlay][data-vaul-snap-points=true]{opacity:0;transition:opacity .5s cubic-bezier(.32, .72, 0, 1)}[data-vaul-overlay][data-vaul-snap-points=true]{opacity:1}[data-vaul-drawer]:not([data-vaul-custom-container=true])::after{content:'';position:absolute;background:inherit;background-color:inherit}[data-vaul-drawer][data-vaul-drawer-direction=top]::after{top:initial;bottom:100%;left:0;right:0;height:200%}[data-vaul-drawer][data-vaul-drawer-direction=bottom]::after{top:100%;bottom:initial;left:0;right:0;height:200%}[data-vaul-drawer][data-vaul-drawer-direction=left]::after{left:initial;right:100%;top:0;bottom:0;width:200%}[data-vaul-drawer][data-vaul-drawer-direction=right]::after{left:100%;right:initial;top:0;bottom:0;width:200%}[data-vaul-overlay][data-vaul-snap-points=true]:not([data-vaul-snap-points-overlay=true]):not(
248
+ [data-state=closed]
249
+ ){opacity:0}[data-vaul-overlay][data-vaul-snap-points-overlay=true]{opacity:1}[data-vaul-handle]{display:block;position:relative;opacity:.7;background:#e2e2e4;margin-left:auto;margin-right:auto;height:5px;width:32px;border-radius:1rem;touch-action:pan-y}[data-vaul-handle]:active,[data-vaul-handle]:hover{opacity:1}[data-vaul-handle-hitarea]{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:max(100%,2.75rem);height:max(100%,2.75rem);touch-action:inherit}@media (hover:hover) and (pointer:fine){[data-vaul-drawer]{user-select:none}}@keyframes fadeIn{from{opacity:0}to{opacity:1}}@keyframes fadeOut{to{opacity:0}}@keyframes slideFromBottom{from{transform:translate3d(0,var(--initial-transform,100%),0)}to{transform:translate3d(0,0,0)}}@keyframes slideToBottom{to{transform:translate3d(0,var(--initial-transform,100%),0)}}@keyframes slideFromTop{from{transform:translate3d(0,calc(var(--initial-transform,100%) * -1),0)}to{transform:translate3d(0,0,0)}}@keyframes slideToTop{to{transform:translate3d(0,calc(var(--initial-transform,100%) * -1),0)}}@keyframes slideFromLeft{from{transform:translate3d(calc(var(--initial-transform,100%) * -1),0,0)}to{transform:translate3d(0,0,0)}}@keyframes slideToLeft{to{transform:translate3d(calc(var(--initial-transform,100%) * -1),0,0)}}@keyframes slideFromRight{from{transform:translate3d(var(--initial-transform,100%),0,0)}to{transform:translate3d(0,0,0)}}@keyframes slideToRight{to{transform:translate3d(var(--initial-transform,100%),0,0)}}
package/src/bookub.css CHANGED
@@ -14,4 +14,6 @@
14
14
  --color-accent-900: var(--color-accent-bookub-900);
15
15
  --color-accent-950: var(--color-accent-bookub-950);
16
16
  --color-ring-default: var(--color-accent-bookub-500);
17
+ --color-fill-accent: var(--color-fill-bookub);
18
+ --color-fill-accent-hover: var(--color-fill-bookub-hover);
17
19
  }
package/src/dark.css CHANGED
@@ -3,8 +3,7 @@
3
3
  Apply via [data-theme='dark'] on an ancestor (typically <html>),
4
4
  or automatically via prefers-color-scheme when no explicit theme is set. */
5
5
 
6
- [data-theme='dark'],
7
- :root:not([data-theme]) {
6
+ [data-theme='dark'] {
8
7
  /* ── Background ─────────────────────────────────────────────────────── */
9
8
  --color-bg-default: #0b1220;
10
9
  --color-bg-subtle: #0f172a;
@@ -26,6 +25,7 @@
26
25
  --color-border-subtle: #162032;
27
26
  --color-border-strong: #334155;
28
27
  --color-border-inverse: #cbd5e1;
28
+ --color-border-input: #64748b;
29
29
 
30
30
  /* ── Ring ────────────────────────────────────────────────────────────── */
31
31
  --color-ring-default: #60a5fa;
@@ -86,6 +86,7 @@
86
86
  --color-border-subtle: #162032;
87
87
  --color-border-strong: #334155;
88
88
  --color-border-inverse: #cbd5e1;
89
+ --color-border-input: #64748b;
89
90
 
90
91
  --color-ring-default: #60a5fa;
91
92
  --color-ring-offset: #0b1220;
package/src/founderub.css CHANGED
@@ -14,4 +14,6 @@
14
14
  --color-accent-900: var(--color-accent-founderub-900);
15
15
  --color-accent-950: var(--color-accent-founderub-950);
16
16
  --color-ring-default: var(--color-accent-founderub-500);
17
+ --color-fill-accent: var(--color-fill-founderub);
18
+ --color-fill-accent-hover: var(--color-fill-founderub-hover);
17
19
  }
package/src/leap.css CHANGED
@@ -14,4 +14,6 @@
14
14
  --color-accent-900: var(--color-accent-leap-900);
15
15
  --color-accent-950: var(--color-accent-leap-950);
16
16
  --color-ring-default: var(--color-accent-leap-500);
17
+ --color-fill-accent: var(--color-fill-leap);
18
+ --color-fill-accent-hover: var(--color-fill-leap-hover);
17
19
  }
package/src/light.css CHANGED
@@ -22,6 +22,7 @@
22
22
  --color-border-subtle: #f1f5f9;
23
23
  --color-border-strong: #94a3b8;
24
24
  --color-border-inverse: #334155;
25
+ --color-border-input: #848e9f;
25
26
 
26
27
  --color-ring-default: #4099f1;
27
28
  --color-ring-offset: #ffffff;
package/src/payub.css CHANGED
@@ -14,4 +14,6 @@
14
14
  --color-accent-900: var(--color-accent-payub-900);
15
15
  --color-accent-950: var(--color-accent-payub-950);
16
16
  --color-ring-default: var(--color-accent-payub-500);
17
+ --color-fill-accent: var(--color-fill-payub);
18
+ --color-fill-accent-hover: var(--color-fill-payub-hover);
17
19
  }