@judarn/ui 0.0.0-stage → 0.7.1

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.
@@ -0,0 +1,243 @@
1
+ /* =========================================================================
2
+ JUDARN DESIGN SYSTEM
3
+ components.css – component styles (flat, geometric, no decoration)
4
+ Interaction model: COLOR INVERSION on hover, flat grey on active.
5
+ No shadows, no gradients, no radius (unless structurally motivated).
6
+ ========================================================================= */
7
+
8
+ /* ---- BUTTON ------------------------------------------------------------ */
9
+ .btn {
10
+ font-family: var(--font-sans);
11
+ font-weight: var(--weight-medium);
12
+ letter-spacing: var(--track-body);
13
+ -webkit-appearance: none;
14
+ appearance: none;
15
+ display: inline-flex;
16
+ align-items: center;
17
+ justify-content: center;
18
+ gap: var(--gap-tight);
19
+ border: var(--rule) solid var(--black);
20
+ background: var(--black);
21
+ color: var(--paper);
22
+ cursor: pointer;
23
+ padding: var(--space-2) var(--space-3);
24
+ font-size: var(--size-body);
25
+ line-height: 1.2;
26
+ border-radius: var(--radius-control);
27
+ transition: background-color 120ms linear, color 120ms linear, border-color 120ms linear;
28
+ text-align: center;
29
+ white-space: nowrap;
30
+ }
31
+ .btn:hover { background: var(--white); color: var(--black); border-color: var(--black); } /* invert */
32
+ .btn:active { background: var(--ink-60); border-color: var(--ink-60); color: var(--paper); }
33
+ .btn:focus-visible { outline: var(--rule-bold) solid var(--accent); outline-offset: 2px; }
34
+
35
+ .btn--outline { background: transparent; color: var(--black); border: var(--rule) solid var(--black); }
36
+ .btn--outline:hover { background: var(--black); color: var(--paper); }
37
+ .btn--outline:active { background: var(--ink-60); border-color: var(--ink-60); color: var(--paper); }
38
+
39
+ .btn--secondary { background: var(--jd-surface-recessed); color: var(--black); border: var(--rule) solid var(--ink-30); }
40
+ .btn--secondary:hover { background: var(--white); color: var(--black); border-color: var(--ink-60); }
41
+ .btn--secondary:active { background: var(--ink-60); border-color: var(--ink-60); color: var(--paper); }
42
+
43
+ .btn--ghost { background: transparent; color: var(--black); border-color: transparent; padding-left: 0; padding-right: 0; }
44
+ .btn--ghost:hover { background: transparent; color: var(--black); border-bottom-color: var(--black); }
45
+ .btn--ghost:active { background: transparent; color: var(--ink-60); border-bottom-color: var(--ink-60); }
46
+
47
+ .btn--accent { background: var(--accent); border-color: var(--accent); color: var(--accent-ink); }
48
+ .btn--accent:hover { background: var(--white); color: var(--accent-fg); border-color: var(--accent-fg); }
49
+ .btn--accent:active { filter: none; background: var(--accent); color: var(--accent-ink); }
50
+
51
+ .btn--sm { padding: var(--space-1) var(--space-2); font-size: var(--size-small); min-height: var(--space-touch); }
52
+ .btn--lg { padding: var(--space-3) var(--space-4); font-size: var(--size-body-lg); }
53
+ .btn--block { display: flex; width: 100%; }
54
+
55
+ .btn:disabled, .btn[aria-disabled="true"] {
56
+ background: var(--jd-surface-recessed); color: var(--ink-30); border-color: var(--ink-30);
57
+ cursor: not-allowed; pointer-events: none;
58
+ }
59
+
60
+ /* ---- FIELD (text input / textarea / select) --------------------------- */
61
+ .field { display: flex; flex-direction: column; gap: var(--gap-tight); }
62
+ .field__label {
63
+ font-family: var(--font-sans);
64
+ font-weight: var(--weight-bold);
65
+ font-size: var(--size-label);
66
+ letter-spacing: var(--track-label);
67
+ text-transform: uppercase;
68
+ color: var(--black);
69
+ }
70
+ .field__input {
71
+ font-family: var(--font-sans);
72
+ font-size: var(--size-body);
73
+ color: var(--black);
74
+ background: var(--white);
75
+ border: var(--rule) solid var(--black);
76
+ border-radius: var(--radius-control);
77
+ padding: var(--space-2);
78
+ width: 100%;
79
+ transition: border-color 120ms linear, box-shadow 120ms linear;
80
+ }
81
+ .field__input::placeholder { color: var(--ink-60); }
82
+ .field__input:focus { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent); }
83
+ .field__input:focus-visible { outline: var(--rule-bold) solid var(--accent); outline-offset: 2px; }
84
+ .field__input:disabled { color: var(--ink-30); border-color: var(--ink-30); background: var(--jd-surface-recessed); cursor: not-allowed; }
85
+ .field__input[aria-invalid="true"], .field__input.is-invalid { border-color: var(--signal-error); box-shadow: 0 0 0 1px var(--signal-error); }
86
+ .field__hint { font-size: var(--size-small); color: var(--ink-60); }
87
+ .field__hint.is-error, .field__hint--error { color: var(--signal-error); font-weight: var(--weight-medium); }
88
+ textarea.field__input { resize: vertical; min-height: var(--space-12); line-height: var(--lh-body); }
89
+ select.field__input { cursor: pointer; } /* native appearance keeps the platform chevron */
90
+
91
+ /* ---- CARD -------------------------------------------------------------- */
92
+ .card {
93
+ background: var(--white);
94
+ border: none;
95
+ border-radius: var(--radius-card);
96
+ padding: var(--space-3);
97
+ display: flex;
98
+ flex-direction: column;
99
+ gap: var(--gap-normal);
100
+ }
101
+ .card--flat { border: none; padding: 0; border-radius: 0; }
102
+ .card--compact { padding: var(--space-2); }
103
+ .card--field { background: var(--bg2); border: none; }
104
+ .card__eyebrow { color: var(--accent); } /* type comes from t-label (ADR-0009) */
105
+ .card__title { font-size: var(--size-h4); font-weight: var(--weight-bold); letter-spacing: var(--track-head); }
106
+ .card__body { font-size: var(--size-body); line-height: var(--lh-body); }
107
+ .card__media { aspect-ratio: 3 / 2; background: var(--jd-surface-recessed); border-radius: var(--radius-control); overflow: hidden; }
108
+
109
+ /* ---- BADGE / TAG ------------------------------------------------------- */
110
+ .badge {
111
+ display: inline-flex; align-items: center; gap: var(--gap-tight);
112
+ font-family: var(--font-sans); font-weight: var(--weight-bold);
113
+ font-size: var(--size-label); letter-spacing: var(--track-body);
114
+ padding: 4px var(--space-1); border: var(--rule) solid var(--line);
115
+ background: var(--white); color: var(--black); border-radius: var(--radius-badge); line-height: 1;
116
+ }
117
+ .badge--solid { background: var(--black); color: var(--paper); }
118
+ .badge--accent { background: var(--accent); color: var(--accent-ink); border-color: var(--accent); }
119
+ .badge--accent-outline { color: var(--accent-fg); border-color: var(--accent-fg); }
120
+
121
+ .tag {
122
+ display: inline-flex; align-items: center;
123
+ font-size: var(--size-small); font-weight: var(--weight-medium);
124
+ padding: 4px var(--space-1); border: var(--rule) solid var(--line);
125
+ background: var(--white); border-radius: var(--radius-badge); line-height: 1.2;
126
+ }
127
+
128
+ /* ---- NAVBAR ------------------------------------------------------------ */
129
+ .navbar {
130
+ display: flex; align-items: center; justify-content: space-between;
131
+ padding: var(--space-2) var(--space-3);
132
+ border-bottom: var(--rule-bold) solid var(--line);
133
+ background: var(--white);
134
+ }
135
+ .navbar__brand { font-weight: var(--weight-bold); font-size: var(--size-h4); letter-spacing: var(--track-head); }
136
+ .navbar__links { display: flex; align-items: center; gap: var(--space-3); list-style: none; margin: 0; padding: 0; }
137
+ .navbar__link {
138
+ font-size: var(--size-small); font-weight: var(--weight-medium);
139
+ border-bottom: var(--rule-bold) solid transparent;
140
+ padding-bottom: 2px;
141
+ transition: border-color 120ms linear;
142
+ }
143
+ .navbar__link:hover { border-bottom-color: var(--black); }
144
+ .navbar__link[aria-current="page"] { border-bottom-color: var(--accent); }
145
+
146
+ /* ---- FOOTER ------------------------------------------------------------ */
147
+ .footer {
148
+ border-top: var(--rule-bold) solid var(--line);
149
+ padding: var(--space-6) var(--space-3) var(--space-3);
150
+ background: var(--white);
151
+ display: grid; grid-template-columns: 2fr 1fr 1fr; gap: var(--space-4);
152
+ }
153
+ .footer__col { display: flex; flex-direction: column; gap: var(--gap-tight); }
154
+ .footer__head { margin: 0 0 var(--space-1); color: var(--black); } /* type comes from t-label (ADR-0009) */
155
+ .footer__link { font-size: var(--size-small); color: var(--fg2); }
156
+ .footer__link:hover { color: var(--black); text-decoration: underline; text-underline-offset: 3px; }
157
+
158
+ /* ---- DATA TABLE -------------------------------------------------------- */
159
+ .table { width: 100%; border-collapse: collapse; font-size: var(--size-small); }
160
+ .table th {
161
+ text-align: left; font-weight: var(--weight-bold); font-size: var(--size-label);
162
+ letter-spacing: var(--track-label); text-transform: uppercase;
163
+ padding: var(--space-1) var(--space-2); border-bottom: var(--rule-bold) solid var(--line); color: var(--black);
164
+ }
165
+ .table td { padding: var(--space-2); border-bottom: var(--rule) solid var(--ink-30); color: var(--fg1); }
166
+ .table tbody tr:hover { background: var(--jd-surface-recessed); }
167
+ .table .num { text-align: right; font-variant-numeric: tabular-nums; }
168
+
169
+ /* As-written casing for a field label or column header that holds a unit, a mixed-case term,
170
+ or more than two words (ADR-0009). */
171
+ .field__label.t-as-written,
172
+ .table th.t-as-written,
173
+ .matrix th.t-as-written { text-transform: none; letter-spacing: var(--track-body); }
174
+
175
+ /* ---- LOGO LOCKUP FRAME ------------------------------------------------- */
176
+ .lockup { display: inline-flex; align-items: center; gap: var(--space-2); }
177
+ .lockup--vertical { flex-direction: column; align-items: flex-start; gap: var(--space-2); }
178
+ .lockup--reversed { background: var(--black); color: var(--paper); padding: var(--space-3); }
179
+ .lockup__mark { display: block; flex: none; }
180
+ .lockup__words { display: flex; flex-direction: column; }
181
+ .lockup__name { font-weight: var(--weight-bold); font-size: var(--size-h4); line-height: 1; letter-spacing: var(--track-head); }
182
+ .lockup__tag { color: var(--fg2); margin-top: 4px; } /* type comes from t-label (ADR-0009) */
183
+ .lockup--reversed .lockup__tag { color: var(--ink-30); }
184
+
185
+ /* ---- DATA MATRIX ------------------------------------------------------- */
186
+ .matrix {
187
+ width: 100%;
188
+ border-collapse: collapse;
189
+ font-size: var(--size-small);
190
+ }
191
+ .matrix th {
192
+ text-align: left;
193
+ font-weight: var(--weight-bold);
194
+ font-size: var(--size-label);
195
+ letter-spacing: var(--track-label);
196
+ text-transform: uppercase;
197
+ padding: var(--space-1) var(--space-2);
198
+ border-right: var(--rule) solid var(--line);
199
+ border-bottom: var(--rule-bold) solid var(--line);
200
+ background: var(--white);
201
+ color: var(--black);
202
+ }
203
+ .matrix th:last-child { border-right: none; }
204
+ .matrix td {
205
+ padding: var(--space-1) var(--space-2);
206
+ border-right: var(--rule) solid var(--ink-30);
207
+ border-bottom: var(--rule) solid var(--ink-30);
208
+ color: var(--fg1);
209
+ }
210
+ .matrix td:last-child { border-right: none; }
211
+ .matrix tbody tr:last-child td { border-bottom: none; }
212
+ .matrix tbody tr:hover td { background: var(--jd-surface-recessed); }
213
+ .matrix .num { text-align: right; font-variant-numeric: tabular-nums; }
214
+
215
+ /* ---- HIGH CONTRAST RULE SCALING ---------------------------------------- */
216
+ @media (prefers-contrast: more) {
217
+ .matrix th,
218
+ .matrix td {
219
+ border-right-width: var(--jd-rule-bold);
220
+ border-bottom-width: var(--jd-rule-bold);
221
+ }
222
+ .table th,
223
+ .table td {
224
+ border-bottom-width: var(--jd-rule-bold);
225
+ }
226
+ .field__input {
227
+ border-width: var(--jd-rule-bold);
228
+ }
229
+ }
230
+
231
+ [data-contrast="high"] .matrix th,
232
+ [data-contrast="high"] .matrix td {
233
+ border-right-width: var(--jd-rule-bold);
234
+ border-bottom-width: var(--jd-rule-bold);
235
+ }
236
+ [data-contrast="high"] .table th,
237
+ [data-contrast="high"] .table td {
238
+ border-bottom-width: var(--jd-rule-bold);
239
+ }
240
+ [data-contrast="high"] .field__input {
241
+ border-width: var(--jd-rule-bold);
242
+ }
243
+
@@ -0,0 +1,52 @@
1
+ /* =========================================================================
2
+ JUDARN DESIGN SYSTEM
3
+ styles.css – root global stylesheet (compiler entry point)
4
+ ========================================================================= */
5
+
6
+ @import "./colors_and_type.css";
7
+ @import "./components.css";
8
+
9
+ /* ---- Reset / substrate ------------------------------------------------- */
10
+ *, *::before, *::after { box-sizing: border-box; }
11
+
12
+ html, body {
13
+ margin: 0;
14
+ padding: 0;
15
+ }
16
+
17
+ body {
18
+ font-family: var(--font-sans);
19
+ font-weight: var(--weight-regular);
20
+ font-size: var(--size-body);
21
+ line-height: var(--lh-body);
22
+ color: var(--fg1);
23
+ background: var(--bg1);
24
+ -webkit-font-smoothing: antialiased;
25
+ text-rendering: optimizeLegibility;
26
+ }
27
+
28
+ /* Headings default to bold neo-grotesque, tight tracking */
29
+ h1, h2, h3, h4, h5, h6 {
30
+ font-family: var(--font-sans);
31
+ font-weight: var(--weight-bold);
32
+ letter-spacing: var(--track-head);
33
+ margin: 0;
34
+ }
35
+
36
+ p { margin: 0; text-wrap: pretty; }
37
+
38
+ a { color: inherit; text-decoration: none; }
39
+
40
+ /* Hairline rule – the canonical divider of the system */
41
+ hr {
42
+ border: none;
43
+ border-top: var(--rule) solid var(--line);
44
+ margin: 0;
45
+ }
46
+
47
+ /* ---- Utility: the grid ------------------------------------------------- */
48
+ .jd-grid {
49
+ display: grid;
50
+ grid-template-columns: repeat(12, 1fr);
51
+ gap: var(--gap-normal);
52
+ }
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Judarn Design System – Tailwind CSS v4 Theme Preset
3
+ * Bridges Judarn dual-tier OKLCh tokens and 8/4 grid hierarchy directly into Tailwind v4.
4
+ * Generated from tokens/judarn-tokens.json – do not edit directly.
5
+ */
6
+ @import "./colors_and_type.css";
7
+
8
+ @theme {
9
+ /* Surface & Color Tokens */
10
+ --color-substrate: var(--jd-substrate);
11
+ --color-surface-elevated: var(--jd-surface-elevated);
12
+ --color-surface-recessed: var(--jd-surface-recessed);
13
+ --color-ink-100: var(--jd-ink-100);
14
+ --color-ink-60: var(--jd-ink-60);
15
+ --color-ink-30: var(--jd-ink-30);
16
+ --color-signal-error: var(--jd-signal-error);
17
+ --color-accent: var(--accent);
18
+ --color-accent-fg: var(--accent-fg);
19
+ --color-accent-ink: var(--accent-ink);
20
+
21
+ /* Semantic Aliases. --color-white and --color-black stay at Tailwind's defaults:
22
+ remapping them to scheme-following colours breaks every white-on-fill utility. */
23
+ --color-paper: var(--jd-substrate);
24
+
25
+ /* Typography Font Slots */
26
+ --font-display: var(--jd-font-display);
27
+ --font-body: var(--jd-font-body);
28
+ --font-data: var(--jd-font-data);
29
+ --font-mono: var(--jd-font-mono);
30
+
31
+ /* 8/4 Spatial Hierarchy Grid */
32
+ --spacing-half: var(--jd-space-half);
33
+ --spacing-1: var(--jd-space-1);
34
+ --spacing-2: var(--jd-space-2);
35
+ --spacing-3: var(--jd-space-3);
36
+ --spacing-4: var(--jd-space-4);
37
+ --spacing-touch: var(--jd-space-touch);
38
+ --spacing-6: var(--jd-space-6);
39
+ --spacing-8: var(--jd-space-8);
40
+ --spacing-12: var(--jd-space-12);
41
+ --spacing-16: var(--jd-space-16);
42
+
43
+ /* Hairline Border Rules */
44
+ --border-width-rule: var(--jd-rule);
45
+ --border-width-rule-bold: var(--jd-rule-bold);
46
+ --border-width-rule-heavy: var(--jd-rule-heavy);
47
+
48
+ /* Platform Authority Radii (ADR-0002) */
49
+ --radius-subtle: var(--jd-radius-subtle, 6px);
50
+ --radius-control: var(--jd-radius-control, 10px);
51
+ --radius-card: var(--jd-radius-card, 16px);
52
+ --radius-badge: var(--jd-radius-badge, 9999px);
53
+ --radius-sm: var(--jd-radius-subtle, 6px);
54
+ --radius-md: var(--jd-radius-control, 10px);
55
+ --radius-lg: var(--jd-radius-card, 16px);
56
+ --radius-xl: var(--jd-radius-card, 16px);
57
+ --radius-2xl: var(--jd-radius-card, 16px);
58
+ --radius-full: var(--jd-radius-badge, 9999px);
59
+ }