7k-design-system 1.1.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.
Files changed (89) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/CONSUMER_GUIDE.md +109 -50
  3. package/DESIGN.md +631 -439
  4. package/README.md +76 -75
  5. package/SKILL.md +107 -78
  6. package/build/icons/icon-7kgroup-light.svg +10 -0
  7. package/build/icons/icon-7kgroup.svg +10 -0
  8. package/build/icons/icon-7kminato-light.svg +10 -0
  9. package/build/icons/icon-7kminato.svg +10 -0
  10. package/build/icons/icon-base.svg +10 -0
  11. package/build/icons/icon-inari-light.svg +10 -0
  12. package/build/icons/icon-inari.svg +10 -0
  13. package/dist/7k-design-system.css +1 -1
  14. package/dist/animations.css +1 -1
  15. package/dist/build/icons/icon-7kgroup-light.svg +10 -0
  16. package/dist/build/icons/icon-7kgroup.svg +10 -0
  17. package/dist/build/icons/icon-7kminato-light.svg +10 -0
  18. package/dist/build/icons/icon-7kminato.svg +10 -0
  19. package/dist/build/icons/icon-base.svg +10 -0
  20. package/dist/build/icons/icon-inari-light.svg +10 -0
  21. package/dist/build/icons/icon-inari.svg +10 -0
  22. package/dist/components.css +1 -1
  23. package/dist/mockServiceWorker.js +361 -0
  24. package/dist/projects.css +1 -0
  25. package/dist/react/components/Alert.d.ts +2 -0
  26. package/dist/react/components/Avatar.d.ts +2 -0
  27. package/dist/react/{react/components → components}/Badge.d.ts +0 -1
  28. package/dist/react/{react/components → components}/Button.d.ts +0 -1
  29. package/dist/react/components/Card.d.ts +4 -0
  30. package/dist/react/components/Checkbox.d.ts +2 -0
  31. package/dist/react/components/Drawer.d.ts +2 -0
  32. package/dist/react/components/Icon.d.ts +2 -0
  33. package/dist/react/{react/components → components}/Input.d.ts +0 -1
  34. package/dist/react/components/IsometricBackground.d.ts +2 -0
  35. package/dist/react/components/Listbox.d.ts +2 -0
  36. package/dist/react/components/Modal.d.ts +4 -0
  37. package/dist/react/components/Nav.d.ts +3 -0
  38. package/dist/react/components/Progress.d.ts +2 -0
  39. package/dist/react/components/ProjectIcon.d.ts +6 -0
  40. package/dist/react/components/Radio.d.ts +2 -0
  41. package/dist/react/components/Select.d.ts +3 -0
  42. package/dist/react/components/Skeleton.d.ts +2 -0
  43. package/dist/react/components/Spinner.d.ts +2 -0
  44. package/dist/react/components/Tabs.d.ts +8 -0
  45. package/dist/react/components/TextureOverlay.d.ts +2 -0
  46. package/dist/react/components/Toast.d.ts +2 -0
  47. package/dist/react/components/Toggle.d.ts +2 -0
  48. package/dist/react/components/Tooltip.d.ts +2 -0
  49. package/dist/react/index.cjs +1 -1
  50. package/dist/react/index.d.ts +32 -0
  51. package/dist/react/index.js +1188 -128
  52. package/dist/react/mockServiceWorker.js +361 -0
  53. package/dist/react/theme/ProjectProvider.d.ts +14 -0
  54. package/dist/react/{react/theme → theme}/ThemeContext.d.ts +0 -1
  55. package/dist/react/{react/theme → theme}/ThemeProvider.d.ts +0 -1
  56. package/dist/react/theme/projects.d.ts +4 -0
  57. package/dist/react/theme/useProject.d.ts +2 -0
  58. package/dist/react/{react/theme → theme}/useTheme.d.ts +0 -1
  59. package/dist/react/types.d.ts +160 -0
  60. package/dist/textures.css +1 -1
  61. package/dist/tokens.css +1 -1
  62. package/package.json +49 -35
  63. package/dist/preview/brand-assets.html +0 -83
  64. package/dist/preview/colors-primary.html +0 -101
  65. package/dist/preview/components-buttons.html +0 -84
  66. package/dist/preview/spacing-tokens.html +0 -79
  67. package/dist/preview/textures-backgrounds.html +0 -102
  68. package/dist/preview/typography-specimens.html +0 -73
  69. package/dist/react/react/components/Badge.stories.d.ts +0 -12
  70. package/dist/react/react/components/Button.stories.d.ts +0 -16
  71. package/dist/react/react/components/Input.stories.d.ts +0 -11
  72. package/dist/react/react/components/ThemeToggle.stories.d.ts +0 -7
  73. package/dist/react/react/index.d.ts +0 -8
  74. package/dist/react/react/types.d.ts +0 -33
  75. package/dist/react/stories/Components.stories.d.ts +0 -10
  76. package/dist/react/stories/Textures.stories.d.ts +0 -11
  77. package/preview/brand-assets.html +0 -83
  78. package/preview/colors-primary.html +0 -101
  79. package/preview/components-buttons.html +0 -84
  80. package/preview/spacing-tokens.html +0 -79
  81. package/preview/textures-backgrounds.html +0 -102
  82. package/preview/typography-specimens.html +0 -73
  83. /package/build/{icon.svg → icons/icon.svg} +0 -0
  84. /package/build/{logo-7k-light.svg → logos/logo-7k-light.svg} +0 -0
  85. /package/build/{logo-7k.svg → logos/logo-7k.svg} +0 -0
  86. /package/dist/build/{icon.svg → icons/icon.svg} +0 -0
  87. /package/dist/build/{logo-7k-light.svg → logos/logo-7k-light.svg} +0 -0
  88. /package/dist/build/{logo-7k.svg → logos/logo-7k.svg} +0 -0
  89. /package/dist/react/{react/components → components}/ThemeToggle.d.ts +0 -0
package/CHANGELOG.md CHANGED
@@ -1,3 +1,19 @@
1
+ # [1.2.0](https://github.com/7K-Group/7k-design-system/compare/v1.1.1...v1.2.0) (2026-10-08)
2
+
3
+
4
+ ### Features
5
+
6
+ * modernize design system — naming standardization, Inari project, accent-driven UI ([#65](https://github.com/7K-Group/7k-design-system/issues/65)) ([b160a60](https://github.com/7K-Group/7k-design-system/commit/b160a60b4373c6a8fb1d91446397f8cd6b84ef80))
7
+
8
+ ## [1.1.1](https://github.com/7K-Group/7k-design-system/compare/v1.1.0...v1.1.1) (2026-08-13)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * add missing perms ([b0e54a3](https://github.com/7K-Group/7k-design-system/commit/b0e54a3be2ff1248736e3c0de379c61a02af750d))
14
+ * do not run ci on main and cd ([f38dce0](https://github.com/7K-Group/7k-design-system/commit/f38dce02bcb8e938b916a59acfede57225e18905))
15
+ * release process failing ([ab488bc](https://github.com/7K-Group/7k-design-system/commit/ab488bc40537ed54dc04a606eef668da317a812b))
16
+
1
17
  # [1.1.0](https://github.com/7K-Group/7k-design-system/compare/v1.0.0...v1.1.0) (2026-06-05)
2
18
 
3
19
 
@@ -22,6 +38,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
22
38
  ## [Unreleased]
23
39
 
24
40
  ### Added
41
+ - `.btn-modern-glow-secondary` variant (cyan/per-project outline + glow) — completes the `glow-secondary` Button variant that React and the consumer guide already referenced
42
+ - `.btn-modern:disabled` / `[aria-disabled='true']` styling (40% opacity, no pointer events, glow removed) for all button variants
43
+ - `.select-native:disabled`, `.checkbox`/`.radio`/`.toggle` disabled styling (`:has(input:disabled)`, 40% opacity)
44
+ - Visible keyboard focus rings for custom `Checkbox`, `Radio`, and `Toggle` controls (`:has(input:focus-visible)`)
45
+ - Missing status variant classes: `.toast-info`, `.alert-info`, `.alert-danger` (the React `Alert` `danger` variant emitted an unstyled class), `.alert-content`, `.alert-close`, `.toast-content`, plus focus-visible styles for dismiss buttons
46
+ - `.card-static:hover` reset so `Card hover={false}` actually disables the hover lift
47
+ - `.spinner-cyan` and `.icon-box-cyan` classes (previously documented but unimplemented)
48
+ - Modal: Escape key closes, Tab focus is trapped inside the dialog while open
49
+ - Drawer: Escape key closes, focus returns to the triggering element
50
+ - Tabs: ARIA APG keyboard support (Arrow/Home/End moves selection, roving tabindex), `TabPanel` is focusable
51
+ - `tests/States.test.tsx` covering the new interaction states
25
52
  - Production-ready build pipeline with Vite, PostCSS, and autoprefixer
26
53
  - TypeScript configuration and type definitions for React UI kit
27
54
  - ESLint, Prettier, and Stylelint configurations for code quality
@@ -35,6 +62,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
35
62
  - Self-hosted Geist font strategy with CDN fallback
36
63
 
37
64
  ### Changed
65
+ - **Contrast (WCAG AA, dark theme):** `--text-tertiary` now maps to `--neutral-400` (was `--neutral-500`, 3.5–3.7:1) and `--text-disabled` to `--neutral-600` (was `--neutral-700`, 1.75:1); `.badge-neutral` uses `--status-neutral`; primary/glow button `:active` text is now white (was magenta on muted fill, 3.0:1). Visual change is subtle but visible — captions and disabled elements read slightly brighter
66
+ - `Input` with an `error` now applies the `.error` class (danger border) in addition to `aria-invalid`
67
+ - Component CSS now consumes semantic tokens instead of raw ramps (`.input:focus` → `--border-focus`; badge/toast/alert status colors → `--status-*`; `.table td`/`.modal-body` → `--text-secondary`)
68
+ - Hard-coded z-index values replaced with `--z-*` tokens in `.tooltip-content`, `.combobox-menu`, and Modal/Drawer/Tooltip inline styles
69
+ - Shimmer animation now uses theme-aware `--texture-*` tokens (works in light theme)
70
+ - Light theme: `--shadow-inset` corrected to a black inner shadow; the `prefers-color-scheme: light` media block now yields to an explicit `data-theme` attribute
71
+ - DESIGN.md, SKILL.md, and CONSUMER_GUIDE.md synced with implemented class names, button variants, modifier names, and token values
38
72
  - Converted React UI kit from plain JS to TypeScript with proper component patterns
39
73
  - Refactored CSS to eliminate hard-coded colors in favor of design tokens
40
74
  - Updated `package.json` with proper `exports`, `engines`, and `types` fields
package/CONSUMER_GUIDE.md CHANGED
@@ -72,9 +72,9 @@ import '7k-design-system/css/animations';
72
72
 
73
73
  ```html
74
74
  <!-- Buttons -->
75
- <button class="btn-modern btn-modern-primary">Primary</button>
76
- <button class="btn-modern btn-modern-secondary">Secondary</button>
77
- <button class="btn-modern btn-modern-ghost">Ghost</button>
75
+ <button class="btn btn-primary">Primary</button>
76
+ <button class="btn btn-secondary">Secondary</button>
77
+ <button class="btn btn-ghost">Ghost</button>
78
78
 
79
79
  <!-- Forms -->
80
80
  <input class="input" placeholder="Enter text" />
@@ -116,16 +116,16 @@ All CSS custom properties are available globally:
116
116
  background: var(--bg-elevated);
117
117
  color: var(--text-primary);
118
118
  border: 2px solid var(--border-default);
119
-
119
+
120
120
  /* Typography */
121
121
  font-family: var(--font-sans);
122
122
  font-size: var(--text-body);
123
123
  line-height: var(--leading-normal);
124
-
124
+
125
125
  /* Spacing */
126
126
  padding: var(--space-4);
127
127
  gap: var(--space-2);
128
-
128
+
129
129
  /* Brand accent */
130
130
  border-color: var(--brand-primary);
131
131
  }
@@ -194,7 +194,7 @@ import { useTheme } from '7k-design-system/react';
194
194
 
195
195
  function ThemeAwareComponent() {
196
196
  const { theme, toggleTheme, setTheme } = useTheme();
197
-
197
+
198
198
  return (
199
199
  <div>
200
200
  <p>Current theme: {theme}</p>
@@ -212,11 +212,12 @@ function ThemeAwareComponent() {
212
212
 
213
213
  ```tsx
214
214
  <Button
215
- variant="primary" // 'primary' | 'secondary' | 'ghost' | 'glow' | 'glow-cyan' | 'glow-grid' | 'danger'
216
- size="md" // 'sm' | 'md' | 'lg'
215
+ variant="primary" // 'primary' | 'secondary' | 'ghost' | 'glow' | 'accent' | 'glow-accent' | 'glow-secondary' | 'danger'
216
+ size="md" // 'sm' | 'md' | 'lg'
217
217
  disabled={false}
218
+ loading={false}
218
219
  onClick={() => {}}
219
- type="button" // 'button' | 'submit' | 'reset'
220
+ type="button" // 'button' | 'submit' | 'reset'
220
221
  >
221
222
  Click me
222
223
  </Button>
@@ -226,11 +227,13 @@ function ThemeAwareComponent() {
226
227
 
227
228
  ```tsx
228
229
  <Input
229
- type="text" // any HTML input type
230
+ type="text" // any HTML input type
230
231
  placeholder="Hint"
231
232
  disabled={false}
232
233
  value={value}
233
234
  onChange={(value) => setValue(value)}
235
+ label="Email"
236
+ error="Required"
234
237
  />
235
238
  ```
236
239
 
@@ -238,37 +241,96 @@ function ThemeAwareComponent() {
238
241
 
239
242
  ```tsx
240
243
  <Badge
241
- variant="default" // 'default' | 'success' | 'warning' | 'danger' | 'info' | 'neutral'
244
+ variant="default" // 'default' | 'accent' | 'success' | 'warning' | 'danger' | 'info' | 'neutral'
245
+ role="status"
242
246
  >
243
247
  Status
244
248
  </Badge>
245
249
  ```
246
250
 
251
+ #### Card
252
+
253
+ ```tsx
254
+ <Card texture="halftone" hover={true}>
255
+ <CardHeader>Title</CardHeader>
256
+ <CardBody>Content</CardBody>
257
+ </Card>
258
+ ```
259
+
260
+ #### Modal
261
+
262
+ ```tsx
263
+ <Modal open={isOpen} onClose={close} texture="noise" aria-labelledby="modal-title">
264
+ <ModalHeader>
265
+ <h2 id="modal-title">Title</h2>
266
+ </ModalHeader>
267
+ <p>Content</p>
268
+ <ModalFooter>
269
+ <Button onClick={close}>Close</Button>
270
+ </ModalFooter>
271
+ </Modal>
272
+ ```
273
+
274
+ Accessibility notes: `Modal` closes on **Escape**, traps **Tab** focus inside the dialog while open, and restores focus to the triggering element on close. Always pass `aria-labelledby` (or `aria-label`). `Drawer` supports Escape and focus restoration as well.
275
+
276
+ #### Toast
277
+
278
+ ```tsx
279
+ <Toast
280
+ variant="success" // 'default' | 'success' | 'error' | 'warning' | 'info'
281
+ onDismiss={() => setShow(false)}
282
+ >
283
+ Deployed
284
+ </Toast>
285
+ ```
286
+
287
+ Mount toasts in a fixed container at the top of your app (they use `role="status"`/`role="alert"` and the `slide-up-reveal` animation). Example container:
288
+
289
+ ```tsx
290
+ <div style={{ position: 'fixed', bottom: 24, right: 24, zIndex: 'var(--z-toast)', display: 'grid', gap: 8 }}>
291
+ {toasts.map((t) => <Toast key={t.id} {...t} />)}
292
+ </div>
293
+ ```
294
+
295
+ #### Layout helpers
296
+
297
+ ```tsx
298
+ <TextureOverlay texture="halftone" animate>...</TextureOverlay>
299
+ <IsometricBackground pattern="grid" animated>...</IsometricBackground>
300
+ ```
301
+
302
+ #### Forms
303
+
304
+ ```tsx
305
+ <Checkbox label="Accept" />
306
+ <Radio label="Option" name="group" />
307
+ <Toggle label="Enable" checked={on} onChange={setOn} />
308
+ <Select><option>A</option></Select>
309
+ <Listbox options={[{ value: 'a', label: 'A' }]} value={v} onChange={setV} />
310
+ <Textarea rows={4} />
311
+ ```
312
+
313
+ Form notes: passing `error` to `Input` adds the `.error` class (danger border) and wires `aria-invalid` + an alert-role message automatically (for `Textarea`/`Select`, add the `error` class and `aria-invalid` manually). Custom `Checkbox`/`Radio`/`Toggle` render a visually-hidden native input — keyboard focus shows a magenta focus ring on the custom control via `:focus-visible`. `Tabs` supports full arrow-key / Home / End navigation with roving tabindex per the ARIA tabs pattern.
314
+
247
315
  ---
248
316
 
249
317
  ## Project Customization
250
318
 
251
- Each 7K sub-project can override the accent color while keeping the same base design.
319
+ The parent 7K brand uses magenta primary + cyan secondary. Each sub-project can theme the secondary accent while keeping the same base design.
252
320
 
253
321
  ### Override Accent Colors
254
322
 
255
323
  ```css
256
324
  /* project-neon.css */
257
325
  .project-neon {
258
- /* Circle project — cyan accent */
259
- --accent-circle: var(--cyan-500);
326
+ /* 7KMinato — cyan takes over the full brand chain */
327
+ --brand-secondary: var(--cyan-500);
260
328
  }
261
329
 
262
- /* project-grid.css */
263
- .project-grid {
264
- /* Grid project — acid green accent */
265
- --accent-grid: var(--acid-500);
266
- }
267
-
268
- /* project-ember.css */
269
- .project-ember {
270
- /* Line project — orange accent */
271
- --accent-line: var(--ember-500);
330
+ /* project-inari.css */
331
+ .project-inari {
332
+ /* Inari — burnt orange takes over the full brand chain */
333
+ --brand-secondary: var(--inari-500);
272
334
  }
273
335
  ```
274
336
 
@@ -279,9 +341,9 @@ Each 7K sub-project can override the accent color while keeping the same base de
279
341
  function App() {
280
342
  return (
281
343
  <ThemeProvider>
282
- <div className="project-neon">
344
+ <ProjectProvider defaultProject="circle">
283
345
  <YourApp />
284
- </div>
346
+ </ProjectProvider>
285
347
  </ThemeProvider>
286
348
  );
287
349
  }
@@ -363,29 +425,31 @@ import { Button, ThemeToggle } from '7k-design-system/react';
363
425
  export function Home() {
364
426
  return (
365
427
  <div className="project-neon">
366
- <nav style={{
367
- position: 'sticky',
368
- top: 0,
369
- display: 'flex',
370
- justifyContent: 'space-between',
371
- padding: '12px 24px',
372
- background: 'var(--bg-base)',
373
- borderBottom: '2px solid var(--border-default)'
374
- }}>
428
+ <nav
429
+ style={{
430
+ position: 'sticky',
431
+ top: 0,
432
+ display: 'flex',
433
+ justifyContent: 'space-between',
434
+ padding: '12px 24px',
435
+ background: 'var(--bg-base)',
436
+ borderBottom: '2px solid var(--border-default)',
437
+ }}
438
+ >
375
439
  <span className="mono-label">7K GROUP</span>
376
440
  <ThemeToggle />
377
441
  </nav>
378
442
 
379
- <section
380
- className="scanline"
381
- style={{
443
+ <section
444
+ className="scanline"
445
+ style={{
382
446
  minHeight: '80vh',
383
447
  display: 'flex',
384
448
  flexDirection: 'column',
385
449
  alignItems: 'center',
386
450
  justifyContent: 'center',
387
451
  textAlign: 'center',
388
- padding: 'var(--space-8)'
452
+ padding: 'var(--space-8)',
389
453
  }}
390
454
  >
391
455
  <span className="mono-label" style={{ color: 'var(--brand-primary)' }}>
@@ -395,8 +459,8 @@ export function Home() {
395
459
  Built for Midnight
396
460
  </h1>
397
461
  <p className="body-lg" style={{ maxWidth: '600px', marginTop: 'var(--space-4)' }}>
398
- A multi-project technology company crafting infrastructure,
399
- AI pipelines, and digital products.
462
+ A multi-project technology company crafting infrastructure, AI pipelines, and digital
463
+ products.
400
464
  </p>
401
465
  <div style={{ display: 'flex', gap: 'var(--space-3)', marginTop: 'var(--space-6)' }}>
402
466
  <Button variant="glow">Explore Projects</Button>
@@ -404,15 +468,10 @@ export function Home() {
404
468
  </div>
405
469
  </section>
406
470
 
407
- <section
408
- className="halftone-md"
409
- style={{ padding: 'var(--space-8)' }}
410
- >
471
+ <section className="halftone-md" style={{ padding: 'var(--space-8)' }}>
411
472
  <span className="mono-label">PHILOSOPHY</span>
412
473
  <h2 className="h2">Dark First</h2>
413
- <p className="body">
414
- We design for the dark. Light mode is opt-in, not default.
415
- </p>
474
+ <p className="body">We design for the dark. Light mode is opt-in, not default.</p>
416
475
  </section>
417
476
  </div>
418
477
  );
@@ -466,6 +525,6 @@ Make sure your `tsconfig.json` includes:
466
525
  ## Next Steps
467
526
 
468
527
  1. Run `npm run storybook` in the design system repo to explore all components
469
- 2. Open `preview/*.html` files to see token values rendered
528
+ 2. Browse the Tokens, Textures, and Components stories to see token values rendered
470
529
  3. Read `DESIGN.md` for detailed design principles and constraints
471
530
  4. Check `CONTRIBUTING.md` if you want to contribute back