nitro_kit 2.0.0.alpha.3 → 2.0.0.alpha.4

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 (96) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +179 -0
  3. data/README.md +22 -26
  4. data/STYLE_GUIDE.md +10 -0
  5. data/app/assets/stylesheets/nitro_kit-tailwind-v4.css +3 -3
  6. data/app/assets/stylesheets/nitro_kit.css +1220 -572
  7. data/app/components/nitro_kit/accordion.rb +1 -19
  8. data/app/components/nitro_kit/alert.rb +1 -11
  9. data/app/components/nitro_kit/app_navigation.rb +44 -9
  10. data/app/components/nitro_kit/appearance_picker.rb +10 -1
  11. data/app/components/nitro_kit/badge.rb +13 -4
  12. data/app/components/nitro_kit/combobox.rb +1 -17
  13. data/app/components/nitro_kit/command_palette.rb +1 -0
  14. data/app/components/nitro_kit/dropzone.rb +1 -1
  15. data/app/components/nitro_kit/form_builder.rb +1 -1
  16. data/app/components/nitro_kit/select.rb +1 -14
  17. data/app/components/nitro_kit/tabs.rb +1 -0
  18. data/app/javascript/controllers/nk/command_palette_controller.js +4 -0
  19. data/app/javascript/controllers/nk/tabs_controller.js +13 -1
  20. data/docs/agent_guide.md +63 -138
  21. data/docs/agent_native_spec.md +72 -400
  22. data/docs/browser_support.md +77 -188
  23. data/docs/component_contracts.md +56 -36
  24. data/docs/customization.md +675 -89
  25. data/docs/hotwire.md +61 -99
  26. data/docs/initialization_prompt.md +27 -57
  27. data/docs/migration_1_to_2.md +34 -18
  28. data/docs/patterns/application_foundation.md +45 -121
  29. data/docs/patterns/crud_resource.md +44 -129
  30. data/docs/patterns/destructive_action.md +45 -102
  31. data/docs/patterns/flash_and_toast.md +18 -36
  32. data/docs/patterns/inline_edit.md +21 -44
  33. data/docs/patterns/queryable_collection.md +65 -161
  34. data/docs/patterns/resource_form.md +33 -81
  35. data/docs/rails_conventions.md +38 -78
  36. data/docs/rails_integration.md +96 -474
  37. data/lib/nitro_kit/installation.rb +11 -3
  38. data/lib/nitro_kit/migration_inventory.rb +15 -8
  39. data/lib/nitro_kit/version.rb +1 -1
  40. data/plugins/nitro-kit/skills/nitro-kit-rails/SKILL.md +7 -0
  41. data/plugins/nitro-kit/skills/nitro-kit-ui/SKILL.md +15 -8
  42. data/src/stylesheets/nitro_kit/components/accordion.css +4 -4
  43. data/src/stylesheets/nitro_kit/components/alert.css +20 -29
  44. data/src/stylesheets/nitro_kit/components/app_navigation.css +74 -2
  45. data/src/stylesheets/nitro_kit/components/app_shell.css +3 -3
  46. data/src/stylesheets/nitro_kit/components/appearance_picker.css +20 -8
  47. data/src/stylesheets/nitro_kit/components/auth_shell.css +2 -2
  48. data/src/stylesheets/nitro_kit/components/avatar.css +12 -8
  49. data/src/stylesheets/nitro_kit/components/avatar_stack.css +12 -10
  50. data/src/stylesheets/nitro_kit/components/badge.css +13 -9
  51. data/src/stylesheets/nitro_kit/components/button.css +42 -25
  52. data/src/stylesheets/nitro_kit/components/card.css +2 -2
  53. data/src/stylesheets/nitro_kit/components/checkbox.css +29 -46
  54. data/src/stylesheets/nitro_kit/components/checkbox_group.css +3 -3
  55. data/src/stylesheets/nitro_kit/components/combobox.css +6 -6
  56. data/src/stylesheets/nitro_kit/components/command_palette.css +62 -4
  57. data/src/stylesheets/nitro_kit/components/container.css +6 -6
  58. data/src/stylesheets/nitro_kit/components/control_group.css +9 -9
  59. data/src/stylesheets/nitro_kit/components/danger_zone.css +6 -6
  60. data/src/stylesheets/nitro_kit/components/data_section.css +4 -4
  61. data/src/stylesheets/nitro_kit/components/details_table.css +7 -5
  62. data/src/stylesheets/nitro_kit/components/dialog.css +3 -3
  63. data/src/stylesheets/nitro_kit/components/dropdown.css +7 -7
  64. data/src/stylesheets/nitro_kit/components/dropzone.css +7 -7
  65. data/src/stylesheets/nitro_kit/components/empty_state.css +4 -4
  66. data/src/stylesheets/nitro_kit/components/field.css +2 -2
  67. data/src/stylesheets/nitro_kit/components/fieldset.css +2 -2
  68. data/src/stylesheets/nitro_kit/components/flex.css +1 -1
  69. data/src/stylesheets/nitro_kit/components/grid.css +1 -1
  70. data/src/stylesheets/nitro_kit/components/icon.css +5 -5
  71. data/src/stylesheets/nitro_kit/components/input.css +33 -6
  72. data/src/stylesheets/nitro_kit/components/page_header.css +4 -4
  73. data/src/stylesheets/nitro_kit/components/pagination.css +3 -3
  74. data/src/stylesheets/nitro_kit/components/pagination_bar.css +2 -2
  75. data/src/stylesheets/nitro_kit/components/palette.css +140 -72
  76. data/src/stylesheets/nitro_kit/components/progressive_image.css +1 -1
  77. data/src/stylesheets/nitro_kit/components/radio_button.css +28 -33
  78. data/src/stylesheets/nitro_kit/components/radio_button_group.css +6 -6
  79. data/src/stylesheets/nitro_kit/components/rich_text_area.css +2 -2
  80. data/src/stylesheets/nitro_kit/components/select.css +24 -8
  81. data/src/stylesheets/nitro_kit/components/settings_layout.css +5 -5
  82. data/src/stylesheets/nitro_kit/components/settings_section.css +2 -2
  83. data/src/stylesheets/nitro_kit/components/sheet.css +10 -10
  84. data/src/stylesheets/nitro_kit/components/stat_grid.css +1 -1
  85. data/src/stylesheets/nitro_kit/components/switch.css +34 -40
  86. data/src/stylesheets/nitro_kit/components/table.css +8 -4
  87. data/src/stylesheets/nitro_kit/components/tabs.css +5 -1
  88. data/src/stylesheets/nitro_kit/components/textarea.css +20 -5
  89. data/src/stylesheets/nitro_kit/components/toast.css +11 -58
  90. data/src/stylesheets/nitro_kit/components/toolbar.css +2 -2
  91. data/src/stylesheets/nitro_kit/components/tooltip.css +4 -0
  92. data/src/stylesheets/nitro_kit/components/typeset.css +4 -4
  93. data/src/stylesheets/nitro_kit/reset.css +6 -6
  94. data/src/stylesheets/nitro_kit/tokens.css +497 -74
  95. metadata +1 -2
  96. data/docs/new_app_strategy.md +0 -22
@@ -1,5 +1,9 @@
1
1
  # Customizing Nitro Kit
2
2
 
3
+ **Audience:** Application developers and coding agents changing Nitro Kit
4
+ themes or composing application-owned UI. The first sections are task guidance;
5
+ the final token tables are exhaustive reference.
6
+
3
7
  Nitro Kit owns component Ruby, markup, behavior, and default CSS. Applications customize the system by overriding the public `--nk-*` custom properties, composing components into application UI, and occasionally creating a narrow subclass. Applications do not copy or edit Nitro components.
4
8
 
5
9
  ## Stylesheet order
@@ -13,7 +17,8 @@ Load browser styles in this order:
13
17
  5. Application styles, including Nitro token overrides.
14
18
 
15
19
  `NitroKit::AppearanceBootstrap` precedes every entry in this list. The install
16
- generator owns this ordering and can safely be rerun. For example, an
20
+ generator applies this order when it can identify conventional layout entries
21
+ unambiguously; otherwise it reports manual work. For example, an
17
22
  application with Lexxy and no Tailwind has exactly three stylesheet entries:
18
23
 
19
24
  ```erb
@@ -199,12 +204,14 @@ Treat related tokens as a system:
199
204
  - Density changes should coordinate `--nk-space` with all five control-height tokens. Changing one component's internal gap is not a public theme contract.
200
205
  - Font changes normally set `--nk-font-sans`; set `--nk-font-mono`, text sizes, line heights, or weights only when the whole type system calls for it.
201
206
 
202
- Check foreground pairs and focus indicators for contrast in both appearances. The semantic names describe use, not a fixed hue: `danger` can be a project-appropriate destructive color, but it should remain recognizably destructive everywhere it appears.
207
+ Check foreground pairs and focus indicators for contrast in both appearances. The semantic names describe use, not a fixed hue: `destructive` can be a project-appropriate red, but it should remain recognizably destructive everywhere it appears.
203
208
 
204
209
  ## Theme customizer
205
210
 
206
- The interactive theme customizer lives on the documentation site at
207
- [nitrokit.dev/customize](https://nitrokit.dev/customize). Pick an accent, neutral, radius, density, font, and application shell, watch a complete workspace update, then copy deterministic CSS containing only changed public tokens plus a copyable `AppShell` composition for the selected layout.
211
+ The interactive theme customizer lives at
212
+ [nitrokit.dev/customize](https://nitrokit.dev/customize). It previews accent,
213
+ neutral, radius, density, typography, and appearance choices, then copies the
214
+ changed public tokens.
208
215
 
209
216
  Paste the CSS into an application-owned stylesheet such as `app/assets/stylesheets/nitro_theme.css`, then load that stylesheet after Nitro Kit and any compiled Tailwind CSS:
210
217
 
@@ -421,7 +428,11 @@ end
421
428
 
422
429
  Change only `layout:` to `:topbar` or `:hybrid`; the same `brand`, `navigation`, `topbar`, and `main` declarations remain valid. Nitro owns the responsive breakpoint, narrow drawer, focus management, sticky regions, and one reflowed navigation DOM tree. Do not clone navigation for mobile or add route registries to the shell.
423
430
 
424
- The gallery has complete executable examples for [sidebar](/gallery/compositions/application-sidebar), [topbar](/gallery/compositions/application-topbar), and [hybrid](/gallery/compositions/application-hybrid) applications. Each route contains multiple populated, empty, loading, long-content, missing-content, or error combinations.
431
+ The gallery has executable examples for
432
+ [sidebar](https://gallery.nitrokit.dev/gallery/compositions/application-sidebar),
433
+ [topbar](https://gallery.nitrokit.dev/gallery/compositions/application-topbar),
434
+ and [hybrid](https://gallery.nitrokit.dev/gallery/compositions/application-hybrid)
435
+ applications.
425
436
 
426
437
  ## Rails forms and Hotwire
427
438
 
@@ -482,105 +493,680 @@ Use `@theme inline` when a Tailwind theme variable references another custom pro
482
493
 
483
494
  ## Public token reference
484
495
 
485
- The following 85 variables are the complete public token set. Theme-independent tokens are declared on `:root`. Appearance tokens have light, dark, and system-fallback values. Derived tokens have defaults expressed in terms of other public tokens and remain overrideable.
496
+ The following variables are the complete public token set. Theme-independent tokens are declared on `:root`. Appearance tokens have light, dark, and system-fallback values. Derived tokens have defaults expressed in terms of other public tokens and remain overrideable.
486
497
 
487
498
  ### Typography
488
499
 
489
- | Token | Role |
490
- | --------------------------- | ---------------------------------- |
491
- | `--nk-font-sans` | Default UI font family. |
492
- | `--nk-font-mono` | Monospace font family. |
493
- | `--nk-text-xs` | Extra-small text size. |
494
- | `--nk-text-sm` | Small text size. |
495
- | `--nk-text-base` | Base text size. |
496
- | `--nk-text-lg` | Large text size. |
497
- | `--nk-text-xl` | Extra-large text size. |
498
- | `--nk-text-2xl` | Largest shipped display text size. |
499
- | `--nk-leading-tight` | Tight line-height ratio. |
500
- | `--nk-leading-normal` | Default line-height ratio. |
501
- | `--nk-leading-relaxed` | Relaxed line-height ratio. |
502
- | `--nk-font-weight-normal` | Normal text weight. |
503
- | `--nk-font-weight-medium` | Medium text weight. |
504
- | `--nk-font-weight-semibold` | Semibold text weight. |
505
- | `--nk-font-weight-bold` | Bold text weight. |
506
- | `--nk-typeset-font-body` | Typeset body font family. |
507
- | `--nk-typeset-font-heading` | Typeset heading font family. |
508
- | `--nk-typeset-font-mono` | Typeset code font family. |
509
- | `--nk-typeset-size` | Typeset base text size. |
510
- | `--nk-typeset-leading` | Typeset body line-height ratio. |
511
- | `--nk-typeset-flow` | Typeset vertical rhythm unit. |
500
+ | Token | Role |
501
+ | --------------------------- | -------------------------------------------------------------------- |
502
+ | `--nk-font-sans` | Default UI font family. |
503
+ | `--nk-font-mono` | Monospace font family. |
504
+ | `--nk-text-xs` | Extra-small text size. |
505
+ | `--nk-text-sm` | Small text size. |
506
+ | `--nk-text-base` | Base text size. |
507
+ | `--nk-text-lg` | Large text size. |
508
+ | `--nk-text-xl` | Extra-large text size. |
509
+ | `--nk-text-2xl` | Largest shipped display text size. |
510
+ | `--nk-leading-tight` | Tight line-height ratio. |
511
+ | `--nk-leading-normal` | Default line-height ratio. |
512
+ | `--nk-leading-relaxed` | Relaxed line-height ratio. |
513
+ | `--nk-font-weight-normal` | Normal text weight. |
514
+ | `--nk-font-weight-medium` | Medium text weight. |
515
+ | `--nk-font-weight-semibold` | Semibold text weight. |
516
+ | `--nk-font-weight-bold` | Bold text weight. |
517
+ | `--nk-title-page-size` | Page title size; the one top-level heading. |
518
+ | `--nk-title-page-weight` | Page title weight. |
519
+ | `--nk-title-section-size` | Section title size: data, settings, and danger sections. |
520
+ | `--nk-title-section-weight` | Section title weight. |
521
+ | `--nk-title-surface-size` | Surface title size: cards, dialogs, sheets, empty states, fieldsets. |
522
+ | `--nk-title-surface-weight` | Surface title weight. |
523
+ | `--nk-title-compact-size` | Compact title size: legends, alert and toast titles. |
524
+ | `--nk-title-compact-weight` | Compact title weight. |
525
+ | `--nk-typeset-font-body` | Typeset body font family. |
526
+ | `--nk-typeset-font-heading` | Typeset heading font family. |
527
+ | `--nk-typeset-font-mono` | Typeset code font family. |
528
+ | `--nk-typeset-size` | Typeset base text size. |
529
+ | `--nk-typeset-leading` | Typeset body line-height ratio. |
530
+ | `--nk-typeset-flow` | Typeset vertical rhythm unit. |
512
531
 
513
532
  ### Spacing and dimensions
514
533
 
515
- | Token | Role |
516
- | ------------------------ | --------------------------------------------------------------- |
517
- | `--nk-space` | Base spacing unit multiplied throughout components and layouts. |
518
- | `--nk-control-height-xs` | Extra-small control height. |
519
- | `--nk-control-height-sm` | Small control height. |
520
- | `--nk-control-height-md` | Default control height. |
521
- | `--nk-control-height-lg` | Large control height. |
522
- | `--nk-control-height-xl` | Extra-large control height. |
523
- | `--nk-content-sm` | Small Container maximum width. |
524
- | `--nk-content-md` | Medium Container maximum width. |
525
- | `--nk-content-lg` | Large Container maximum width. |
526
- | `--nk-content-xl` | Extra-large Container maximum width. |
534
+ | Token | Role |
535
+ | ----------------------------- | --------------------------------------------------------------- |
536
+ | `--nk-space` | Base spacing unit multiplied throughout components and layouts. |
537
+ | `--nk-control-height-xs` | Extra-small control height. |
538
+ | `--nk-control-height-sm` | Small control height. |
539
+ | `--nk-control-height-md` | Default control height. |
540
+ | `--nk-control-height-lg` | Large control height. |
541
+ | `--nk-control-height-xl` | Extra-large control height. |
542
+ | `--nk-choice-size-md` | Checkbox and radio box size. |
543
+ | `--nk-choice-size-lg` | Large checkbox and radio box size. |
544
+ | `--nk-icon-size-xs` | Extra-small Icon size. |
545
+ | `--nk-icon-size-sm` | Small Icon size. |
546
+ | `--nk-icon-size-md` | Default Icon size; also sizes owned status icons. |
547
+ | `--nk-icon-size-lg` | Large Icon size. |
548
+ | `--nk-icon-size-xl` | Extra-large Icon size. |
549
+ | `--nk-avatar-size-xs` | Extra-small Avatar size. |
550
+ | `--nk-avatar-size-sm` | Small Avatar size. |
551
+ | `--nk-avatar-size-md` | Default Avatar size. |
552
+ | `--nk-avatar-size-lg` | Large Avatar size. |
553
+ | `--nk-control-padding-inline` | Inline padding shared by buttons and data-entry controls. |
554
+ | `--nk-content-sm` | Small Container maximum width. |
555
+ | `--nk-content-md` | Medium Container maximum width. |
556
+ | `--nk-content-lg` | Large Container maximum width. |
557
+ | `--nk-content-xl` | Extra-large Container maximum width. |
527
558
 
528
559
  ### Shape, borders, and focus
529
560
 
530
- | Token | Role |
531
- | -------------------- | ------------------------------------------------------------------------------------------ |
532
- | `--nk-radius-xs` | Extra-small corner radius. |
533
- | `--nk-radius-sm` | Small corner radius. |
534
- | `--nk-radius-md` | Default control corner radius. |
535
- | `--nk-radius-lg` | Large surface corner radius. |
536
- | `--nk-radius-xl` | Extra-large overlay corner radius. |
537
- | `--nk-radius-full` | Fully rounded pills and circles. |
538
- | `--nk-button-radius` | Optional Button-only radius override; the default `initial` preserves size-specific radii. |
539
- | `--nk-border-width` | Default border and separator width. |
540
- | `--nk-focus-width` | Focus-ring width. |
541
- | `--nk-focus-offset` | Focus-ring offset. |
561
+ | Token | Role |
562
+ | ----------------------- | ------------------------------------------------------------------------------------------ |
563
+ | `--nk-radius-xs` | Extra-small corner radius. |
564
+ | `--nk-radius-sm` | Small corner radius. |
565
+ | `--nk-radius-md` | Default control corner radius. |
566
+ | `--nk-radius-lg` | Large surface corner radius. |
567
+ | `--nk-radius-xl` | Extra-large overlay corner radius. |
568
+ | `--nk-radius-full` | Fully rounded pills and circles. |
569
+ | `--nk-button-radius` | Optional Button-only radius override; the default `initial` preserves size-specific radii. |
570
+ | `--nk-border-width` | Default border and separator width. |
571
+ | `--nk-focus-width` | Focus-ring width. |
572
+ | `--nk-focus-offset` | Focus-ring offset. |
573
+ | `--nk-disabled-opacity` | Opacity of disabled controls and options. |
542
574
 
543
575
  ### Elevation and motion
544
576
 
545
- | Token | Role |
546
- | ---------------------- | ------------------------------------- |
547
- | `--nk-shadow-sm` | Low surface elevation. |
548
- | `--nk-shadow-md` | Medium floating elevation. |
549
- | `--nk-shadow-lg` | High overlay elevation. |
550
- | `--nk-duration-fast` | Fast interaction duration. |
551
- | `--nk-duration-normal` | Default interaction duration. |
552
- | `--nk-duration-slow` | Deliberate overlay or image duration. |
553
- | `--nk-ease` | Default transition timing function. |
577
+ | Token | Role |
578
+ | ---------------------- | -------------------------------------------------- |
579
+ | `--nk-shadow-xs` | Raised control shadow, such as the default Button. |
580
+ | `--nk-shadow-sm` | Low surface elevation. |
581
+ | `--nk-shadow-md` | Medium floating elevation. |
582
+ | `--nk-shadow-lg` | High overlay elevation. |
583
+ | `--nk-duration-fast` | Fast interaction duration. |
584
+ | `--nk-duration-normal` | Default interaction duration. |
585
+ | `--nk-duration-slow` | Deliberate overlay or image duration. |
586
+ | `--nk-ease` | Default transition timing function. |
554
587
 
555
588
  ### Semantic colors
556
589
 
557
- | Token | Role |
558
- | ------------------------------- | ---------------------------------------------------------------------- |
559
- | `--nk-color-canvas` | Page canvas and overscroll; light zinc uses a zinc-25-like near-white. |
560
- | `--nk-color-surface` | Default component surface. |
561
- | `--nk-color-surface-hover` | Derived interactive surface hover. |
562
- | `--nk-color-elevated` | Raised or inset-neutral surface. |
563
- | `--nk-color-foreground` | Primary text and icon color. |
564
- | `--nk-color-muted` | Quiet fill. |
565
- | `--nk-color-muted-foreground` | Secondary text and icon color. |
566
- | `--nk-color-border` | Borders and separators. |
567
- | `--nk-color-focus` | Focus indicator. |
568
- | `--nk-color-primary` | Primary action and selected-state fill. |
569
- | `--nk-color-primary-hover` | Derived primary interaction hover. |
570
- | `--nk-color-primary-foreground` | Content placed on primary fill. |
571
- | `--nk-color-neutral` | Neutral status fill or marker. |
572
- | `--nk-color-neutral-content` | Strong neutral status content. |
573
- | `--nk-color-info` | Informational status fill or marker. |
574
- | `--nk-color-info-content` | Informational status content. |
575
- | `--nk-color-success` | Successful status fill or marker. |
576
- | `--nk-color-success-content` | Successful status content. |
577
- | `--nk-color-warning` | Warning status fill or marker. |
578
- | `--nk-color-warning-content` | Warning status content. |
579
- | `--nk-color-danger` | Destructive action and error fill. |
580
- | `--nk-color-danger-hover` | Derived destructive interaction hover. |
581
- | `--nk-color-danger-foreground` | Content placed on destructive fill. |
582
- | `--nk-color-danger-content` | Error and destructive status content. |
583
- | `--nk-color-overlay` | Modal and drawer backdrop. |
590
+ | Token | Role |
591
+ | ----------------------------------- | ---------------------------------------------------------------------- |
592
+ | `--nk-color-canvas` | Page canvas and overscroll; light zinc uses a zinc-25-like near-white. |
593
+ | `--nk-color-surface` | Default component surface. |
594
+ | `--nk-color-surface-hover` | Derived interactive surface hover. |
595
+ | `--nk-color-elevated` | Raised or inset-neutral surface. |
596
+ | `--nk-color-foreground` | Primary text and icon color. |
597
+ | `--nk-color-muted` | Quiet fill. |
598
+ | `--nk-color-muted-foreground` | Secondary text and icon color. |
599
+ | `--nk-color-border` | Borders and separators. |
600
+ | `--nk-color-focus` | Focus indicator. |
601
+ | `--nk-color-primary` | Primary action and selected-state fill. |
602
+ | `--nk-color-primary-hover` | Derived primary interaction hover. |
603
+ | `--nk-color-primary-foreground` | Content placed on primary fill. |
604
+ | `--nk-color-neutral` | Neutral status fill or marker. |
605
+ | `--nk-color-neutral-content` | Strong neutral status content. |
606
+ | `--nk-color-info` | Informational status fill or marker. |
607
+ | `--nk-color-info-content` | Informational status content. |
608
+ | `--nk-color-success` | Successful status fill or marker. |
609
+ | `--nk-color-success-content` | Successful status content. |
610
+ | `--nk-color-warning` | Warning status fill or marker. |
611
+ | `--nk-color-warning-content` | Warning status content. |
612
+ | `--nk-color-destructive` | Destructive action and error fill. |
613
+ | `--nk-color-destructive-hover` | Derived destructive interaction hover. |
614
+ | `--nk-color-destructive-foreground` | Content placed on destructive fill. |
615
+ | `--nk-color-destructive-content` | Error and destructive status content. |
616
+ | `--nk-color-overlay` | Modal and drawer backdrop. |
617
+
618
+ The five status families — neutral, info, success, warning, and destructive — carry
619
+ two roles each. `--nk-color-{family}` is the fill axis: strong marks, icons, and
620
+ fills such as the destructive Button or an upload marker. The tint axis
621
+ `--nk-palette-{family}` drives the soft surfaces of `Badge`, `Alert`, and
622
+ `Toast::Item`, and defaults to the same scale steps as the matching hue family,
623
+ so an `info` badge renders exactly like a `blue` badge out of the box:
624
+
625
+ ```css
626
+ :root {
627
+ --nk-palette-success: var(--nk-teal-400);
628
+ }
629
+ :root,
630
+ [data-theme="light"] {
631
+ --nk-palette-success-content: var(--nk-teal-800);
632
+ }
633
+ @media (prefers-color-scheme: dark) {
634
+ :root:not([data-theme]) {
635
+ --nk-palette-success-content: var(--nk-teal-200);
636
+ }
637
+ }
638
+ [data-theme="dark"] {
639
+ --nk-palette-success-content: var(--nk-teal-200);
640
+ }
641
+ ```
642
+
643
+ That override retints successful badges, alerts, and toasts together — and only
644
+ them; a decorative `green` badge stays green, and success fills elsewhere keep
645
+ following `--nk-color-success`. The paired `-content` role carries the
646
+ foreground, so change both to keep contrast in hand. Components tint at their
647
+ own strength — a Badge reads more strongly than an Alert — but they never
648
+ disagree about the hue.
649
+
650
+ ### Color scales
651
+
652
+ Every color in the system samples these scales. The five neutral families —
653
+ slate, gray, zinc, neutral, and stone — and the seventeen chromatic families
654
+ each ship all eleven steps. Steps 50-200 are tints and surfaces, 400-600 are
655
+ accents and markers, and 700-950 are content colors. Scale steps are
656
+ appearance independent; the semantic roles above sample different steps per
657
+ appearance.
658
+
659
+ White and black anchor the poles. Overriding them retints every pure-white
660
+ surface and every overlay, for warm-paper or true-black themes:
661
+
662
+ | Token | Value |
663
+ | ------------ | ------ |
664
+ | `--nk-white` | `#fff` |
665
+ | `--nk-black` | `#000` |
666
+
667
+ The default theme is zinc: `--nk-color-foreground` is `--nk-zinc-900`,
668
+ `--nk-color-border` is `--nk-zinc-200`, and so on. Swapping the neutral or the
669
+ accent means re-pointing roles at another family, not inventing values:
670
+
671
+ ```css
672
+ /* A cooler, slate-based neutral in both appearances. */
673
+ :root,
674
+ [data-theme="light"] {
675
+ --nk-color-foreground: var(--nk-slate-900);
676
+ --nk-color-muted: var(--nk-slate-100);
677
+ --nk-color-muted-foreground: var(--nk-slate-500);
678
+ --nk-color-border: var(--nk-slate-200);
679
+ --nk-color-neutral: var(--nk-slate-500);
680
+ --nk-color-neutral-content: var(--nk-slate-700);
681
+ --nk-palette-neutral: var(--nk-slate-400);
682
+ --nk-palette-neutral-content: var(--nk-slate-700);
683
+ }
684
+
685
+ @media (prefers-color-scheme: dark) {
686
+ :root:not([data-theme]) {
687
+ --nk-color-canvas: var(--nk-slate-950);
688
+ --nk-color-surface: color-mix(
689
+ in oklab,
690
+ var(--nk-slate-950) 45%,
691
+ var(--nk-slate-900)
692
+ );
693
+ --nk-color-elevated: var(--nk-slate-900);
694
+ --nk-color-foreground: var(--nk-slate-100);
695
+ --nk-color-muted: var(--nk-slate-800);
696
+ --nk-color-muted-foreground: var(--nk-slate-400);
697
+ --nk-color-border: var(--nk-slate-700);
698
+ --nk-color-neutral: var(--nk-slate-400);
699
+ --nk-color-neutral-content: var(--nk-slate-200);
700
+ --nk-palette-neutral-content: var(--nk-slate-200);
701
+ }
702
+ }
703
+
704
+ [data-theme="dark"] {
705
+ --nk-color-canvas: var(--nk-slate-950);
706
+ --nk-color-surface: color-mix(
707
+ in oklab,
708
+ var(--nk-slate-950) 45%,
709
+ var(--nk-slate-900)
710
+ );
711
+ --nk-color-elevated: var(--nk-slate-900);
712
+ --nk-color-foreground: var(--nk-slate-100);
713
+ --nk-color-muted: var(--nk-slate-800);
714
+ --nk-color-muted-foreground: var(--nk-slate-400);
715
+ --nk-color-border: var(--nk-slate-700);
716
+ --nk-color-neutral: var(--nk-slate-400);
717
+ --nk-color-neutral-content: var(--nk-slate-200);
718
+ --nk-palette-neutral-content: var(--nk-slate-200);
719
+ }
720
+ ```
721
+
722
+ A neutral swap is most visible in dark appearance, where canvas and surfaces
723
+ sit on the 800-950 steps and the families genuinely diverge — slate carries
724
+ many times the chroma of zinc there. In light appearance the default canvas
725
+ and surface are near-white customs with no family identity, so the swap shows
726
+ only in borders, muted fills, and text. For a light canvas that follows the
727
+ family too, add `--nk-color-canvas: var(--nk-slate-50)`.
728
+
729
+ An accent works the same way through the primary role:
730
+
731
+ ```css
732
+ :root,
733
+ [data-theme="light"] {
734
+ --nk-color-primary: var(--nk-indigo-600);
735
+ --nk-color-primary-foreground: white;
736
+ --nk-color-focus: var(--nk-indigo-600);
737
+ }
738
+
739
+ @media (prefers-color-scheme: dark) {
740
+ :root:not([data-theme]) {
741
+ --nk-color-primary: var(--nk-indigo-500);
742
+ --nk-color-primary-foreground: var(--nk-indigo-50);
743
+ --nk-color-focus: var(--nk-indigo-500);
744
+ }
745
+ }
746
+
747
+ [data-theme="dark"] {
748
+ --nk-color-primary: var(--nk-indigo-500);
749
+ --nk-color-primary-foreground: var(--nk-indigo-50);
750
+ --nk-color-focus: var(--nk-indigo-500);
751
+ }
752
+ ```
753
+
754
+ Values mirror `src/stylesheets/nitro_kit/tokens.css`, which is authoritative.
755
+
756
+ #### Slate
757
+
758
+ | Token | Value |
759
+ | ---------------- | -------------------------- |
760
+ | `--nk-slate-50` | `oklch(98.4% 0.004 247.3)` |
761
+ | `--nk-slate-100` | `oklch(96.8% 0.006 249.8)` |
762
+ | `--nk-slate-200` | `oklch(93.6% 0.013 252.5)` |
763
+ | `--nk-slate-300` | `oklch(85.9% 0.023 254.2)` |
764
+ | `--nk-slate-400` | `oklch(71.2% 0.038 255.7)` |
765
+ | `--nk-slate-500` | `oklch(55.7% 0.045 257.6)` |
766
+ | `--nk-slate-600` | `oklch(45% 0.045 257.1)` |
767
+ | `--nk-slate-700` | `oklch(36.4% 0.043 257.5)` |
768
+ | `--nk-slate-800` | `oklch(28.5% 0.042 260.9)` |
769
+ | `--nk-slate-900` | `oklch(20.6% 0.042 263.3)` |
770
+ | `--nk-slate-950` | `oklch(12.9% 0.042 265.8)` |
771
+
772
+ #### Gray
773
+
774
+ | Token | Value |
775
+ | --------------- | -------------------------- |
776
+ | `--nk-gray-50` | `oklch(98.5% 0.002 250.4)` |
777
+ | `--nk-gray-100` | `oklch(96.7% 0.002 260.5)` |
778
+ | `--nk-gray-200` | `oklch(93.6% 0.005 264.1)` |
779
+ | `--nk-gray-300` | `oklch(86.2% 0.011 259.5)` |
780
+ | `--nk-gray-400` | `oklch(71.4% 0.02 261.5)` |
781
+ | `--nk-gray-500` | `oklch(55.6% 0.027 261.6)` |
782
+ | `--nk-gray-600` | `oklch(44.9% 0.031 260.0)` |
783
+ | `--nk-gray-700` | `oklch(36.4% 0.033 256.9)` |
784
+ | `--nk-gray-800` | `oklch(28.6% 0.034 260.1)` |
785
+ | `--nk-gray-900` | `oklch(20.7% 0.033 261.5)` |
786
+ | `--nk-gray-950` | `oklch(13% 0.028 262.7)` |
787
+
788
+ #### Zinc
789
+
790
+ | Token | Value |
791
+ | --------------- | -------------------------- |
792
+ | `--nk-zinc-50` | `oklch(98.5% 0 none)` |
793
+ | `--nk-zinc-100` | `oklch(96.7% 0.001 286.4)` |
794
+ | `--nk-zinc-200` | `oklch(93% 0.003 286.3)` |
795
+ | `--nk-zinc-300` | `oklch(86.1% 0.007 286.3)` |
796
+ | `--nk-zinc-400` | `oklch(71.4% 0.013 286.1)` |
797
+ | `--nk-zinc-500` | `oklch(55.5% 0.017 285.9)` |
798
+ | `--nk-zinc-600` | `oklch(44.7% 0.016 285.8)` |
799
+ | `--nk-zinc-700` | `oklch(36% 0.012 285.9)` |
800
+ | `--nk-zinc-800` | `oklch(28.2% 0.008 285.9)` |
801
+ | `--nk-zinc-900` | `oklch(20.8% 0.005 285.9)` |
802
+ | `--nk-zinc-950` | `oklch(14% 0.005 285.8)` |
803
+
804
+ #### Neutral
805
+
806
+ | Token | Value |
807
+ | ------------------ | --------------------- |
808
+ | `--nk-neutral-50` | `oklch(98.5% 0 none)` |
809
+ | `--nk-neutral-100` | `oklch(97% 0 none)` |
810
+ | `--nk-neutral-200` | `oklch(93.2% 0 none)` |
811
+ | `--nk-neutral-300` | `oklch(86% 0 none)` |
812
+ | `--nk-neutral-400` | `oklch(71.6% 0 none)` |
813
+ | `--nk-neutral-500` | `oklch(55.7% 0 none)` |
814
+ | `--nk-neutral-600` | `oklch(44.7% 0 none)` |
815
+ | `--nk-neutral-700` | `oklch(36.1% 0 none)` |
816
+ | `--nk-neutral-800` | `oklch(27.8% 0 none)` |
817
+ | `--nk-neutral-900` | `oklch(20.7% 0 none)` |
818
+ | `--nk-neutral-950` | `oklch(14.3% 0 none)` |
819
+
820
+ #### Stone
821
+
822
+ | Token | Value |
823
+ | ---------------- | -------------------------- |
824
+ | `--nk-stone-50` | `oklch(98.5% 0.001 114.2)` |
825
+ | `--nk-stone-100` | `oklch(97% 0.001 85.2)` |
826
+ | `--nk-stone-200` | `oklch(93.3% 0.003 64.5)` |
827
+ | `--nk-stone-300` | `oklch(85.9% 0.005 52.4)` |
828
+ | `--nk-stone-400` | `oklch(71.5% 0.01 56.1)` |
829
+ | `--nk-stone-500` | `oklch(55.7% 0.012 62.1)` |
830
+ | `--nk-stone-600` | `oklch(45% 0.012 71.1)` |
831
+ | `--nk-stone-700` | `oklch(36.4% 0.01 62.3)` |
832
+ | `--nk-stone-800` | `oklch(27.8% 0.007 44.5)` |
833
+ | `--nk-stone-900` | `oklch(21.1% 0.006 46.3)` |
834
+ | `--nk-stone-950` | `oklch(14.7% 0.004 51.8)` |
835
+
836
+ #### Red
837
+
838
+ | Token | Value |
839
+ | -------------- | ------------------------- |
840
+ | `--nk-red-50` | `oklch(97% 0.013 17.5)` |
841
+ | `--nk-red-100` | `oklch(93.9% 0.029 17.5)` |
842
+ | `--nk-red-200` | `oklch(88.4% 0.061 18.3)` |
843
+ | `--nk-red-300` | `oklch(80.2% 0.113 19.7)` |
844
+ | `--nk-red-400` | `oklch(71% 0.183 22.3)` |
845
+ | `--nk-red-500` | `oklch(63.6% 0.237 25.3)` |
846
+ | `--nk-red-600` | `oklch(57.5% 0.235 27.3)` |
847
+ | `--nk-red-700` | `oklch(50.7% 0.207 27.6)` |
848
+ | `--nk-red-800` | `oklch(45.3% 0.178 26.7)` |
849
+ | `--nk-red-900` | `oklch(38.6% 0.14 25.9)` |
850
+ | `--nk-red-950` | `oklch(26.8% 0.093 25.8)` |
851
+
852
+ #### Orange
853
+
854
+ | Token | Value |
855
+ | ----------------- | ------------------------- |
856
+ | `--nk-orange-50` | `oklch(98.1% 0.015 73.9)` |
857
+ | `--nk-orange-100` | `oklch(95.2% 0.038 74.5)` |
858
+ | `--nk-orange-200` | `oklch(90.3% 0.075 71.7)` |
859
+ | `--nk-orange-300` | `oklch(83% 0.124 65.1)` |
860
+ | `--nk-orange-400` | `oklch(75.3% 0.173 56.1)` |
861
+ | `--nk-orange-500` | `oklch(70.5% 0.203 47.6)` |
862
+ | `--nk-orange-600` | `oklch(64.6% 0.212 41.1)` |
863
+ | `--nk-orange-700` | `oklch(55.3% 0.185 38.4)` |
864
+ | `--nk-orange-800` | `oklch(48% 0.158 37.7)` |
865
+ | `--nk-orange-900` | `oklch(39.8% 0.122 37.7)` |
866
+ | `--nk-orange-950` | `oklch(27.6% 0.079 36.7)` |
867
+
868
+ #### Amber
869
+
870
+ | Token | Value |
871
+ | ---------------- | ------------------------- |
872
+ | `--nk-amber-50` | `oklch(98.8% 0.016 94.9)` |
873
+ | `--nk-amber-100` | `oklch(96% 0.069 96.5)` |
874
+ | `--nk-amber-200` | `oklch(92.4% 0.118 95.3)` |
875
+ | `--nk-amber-300` | `oklch(87.9% 0.167 92.1)` |
876
+ | `--nk-amber-400` | `oklch(82.8% 0.179 84.4)` |
877
+ | `--nk-amber-500` | `oklch(76.9% 0.178 70.1)` |
878
+ | `--nk-amber-600` | `oklch(66.6% 0.169 58.3)` |
879
+ | `--nk-amber-700` | `oklch(55.5% 0.153 49.1)` |
880
+ | `--nk-amber-800` | `oklch(48.1% 0.135 46.1)` |
881
+ | `--nk-amber-900` | `oklch(40.4% 0.112 45.4)` |
882
+ | `--nk-amber-950` | `oklch(28.9% 0.077 46.2)` |
883
+
884
+ #### Yellow
885
+
886
+ | Token | Value |
887
+ | ----------------- | -------------------------- |
888
+ | `--nk-yellow-50` | `oklch(98.7% 0.021 102.2)` |
889
+ | `--nk-yellow-100` | `oklch(97.3% 0.071 103.1)` |
890
+ | `--nk-yellow-200` | `oklch(94.5% 0.13 101.7)` |
891
+ | `--nk-yellow-300` | `oklch(90.4% 0.175 97.8)` |
892
+ | `--nk-yellow-400` | `oklch(85.2% 0.189 91.9)` |
893
+ | `--nk-yellow-500` | `oklch(79.5% 0.174 86.0)` |
894
+ | `--nk-yellow-600` | `oklch(68.1% 0.152 75.8)` |
895
+ | `--nk-yellow-700` | `oklch(55.6% 0.125 66.6)` |
896
+ | `--nk-yellow-800` | `oklch(48.3% 0.111 61.5)` |
897
+ | `--nk-yellow-900` | `oklch(41.1% 0.094 57.5)` |
898
+ | `--nk-yellow-950` | `oklch(29.6% 0.067 54.1)` |
899
+
900
+ #### Lime
901
+
902
+ | Token | Value |
903
+ | --------------- | -------------------------- |
904
+ | `--nk-lime-50` | `oklch(98.6% 0.026 120.7)` |
905
+ | `--nk-lime-100` | `oklch(96.8% 0.076 122.4)` |
906
+ | `--nk-lime-200` | `oklch(93.8% 0.129 124.4)` |
907
+ | `--nk-lime-300` | `oklch(89.7% 0.195 126.6)` |
908
+ | `--nk-lime-400` | `oklch(84.1% 0.228 128.9)` |
909
+ | `--nk-lime-500` | `oklch(76.8% 0.223 130.8)` |
910
+ | `--nk-lime-600` | `oklch(64.8% 0.19 131.7)` |
911
+ | `--nk-lime-700` | `oklch(53.5% 0.147 131.5)` |
912
+ | `--nk-lime-800` | `oklch(46.2% 0.125 131.0)` |
913
+ | `--nk-lime-900` | `oklch(39.5% 0.1 131.1)` |
914
+ | `--nk-lime-950` | `oklch(28.4% 0.073 132.0)` |
915
+
916
+ #### Green
917
+
918
+ | Token | Value |
919
+ | ---------------- | -------------------------- |
920
+ | `--nk-green-50` | `oklch(98.1% 0.017 155.9)` |
921
+ | `--nk-green-100` | `oklch(96.3% 0.046 156.6)` |
922
+ | `--nk-green-200` | `oklch(92.6% 0.088 156.1)` |
923
+ | `--nk-green-300` | `oklch(86.7% 0.151 154.3)` |
924
+ | `--nk-green-400` | `oklch(79.8% 0.204 151.8)` |
925
+ | `--nk-green-500` | `oklch(72.3% 0.209 149.6)` |
926
+ | `--nk-green-600` | `oklch(62.7% 0.184 149.2)` |
927
+ | `--nk-green-700` | `oklch(52.9% 0.145 150.0)` |
928
+ | `--nk-green-800` | `oklch(45.6% 0.121 151.4)` |
929
+ | `--nk-green-900` | `oklch(38.3% 0.094 152.4)` |
930
+ | `--nk-green-950` | `oklch(27.6% 0.066 153.1)` |
931
+
932
+ #### Emerald
933
+
934
+ | Token | Value |
935
+ | ------------------ | -------------------------- |
936
+ | `--nk-emerald-50` | `oklch(97.9% 0.019 165.4)` |
937
+ | `--nk-emerald-100` | `oklch(95% 0.056 164.5)` |
938
+ | `--nk-emerald-200` | `oklch(90.6% 0.095 164.0)` |
939
+ | `--nk-emerald-300` | `oklch(84.2% 0.143 164.5)` |
940
+ | `--nk-emerald-400` | `oklch(76.7% 0.167 163.3)` |
941
+ | `--nk-emerald-500` | `oklch(69.6% 0.16 162.5)` |
942
+ | `--nk-emerald-600` | `oklch(59.6% 0.135 163.2)` |
943
+ | `--nk-emerald-700` | `oklch(50.8% 0.108 165.5)` |
944
+ | `--nk-emerald-800` | `oklch(44% 0.09 167.0)` |
945
+ | `--nk-emerald-900` | `oklch(36.9% 0.074 169.2)` |
946
+ | `--nk-emerald-950` | `oklch(27.1% 0.052 172.3)` |
947
+
948
+ #### Teal
949
+
950
+ | Token | Value |
951
+ | --------------- | -------------------------- |
952
+ | `--nk-teal-50` | `oklch(98.3% 0.011 180.8)` |
953
+ | `--nk-teal-100` | `oklch(95.5% 0.057 180.5)` |
954
+ | `--nk-teal-200` | `oklch(91.1% 0.097 180.6)` |
955
+ | `--nk-teal-300` | `oklch(85.2% 0.136 181.0)` |
956
+ | `--nk-teal-400` | `oklch(77.8% 0.142 181.9)` |
957
+ | `--nk-teal-500` | `oklch(70.3% 0.13 182.5)` |
958
+ | `--nk-teal-600` | `oklch(60.1% 0.108 184.6)` |
959
+ | `--nk-teal-700` | `oklch(51% 0.089 186.6)` |
960
+ | `--nk-teal-800` | `oklch(44.5% 0.077 187.6)` |
961
+ | `--nk-teal-900` | `oklch(37.6% 0.062 189.0)` |
962
+ | `--nk-teal-950` | `oklch(28.6% 0.047 192.0)` |
963
+
964
+ #### Cyan
965
+
966
+ | Token | Value |
967
+ | --------------- | -------------------------- |
968
+ | `--nk-cyan-50` | `oklch(98.3% 0.017 201.2)` |
969
+ | `--nk-cyan-100` | `oklch(95.8% 0.045 202.8)` |
970
+ | `--nk-cyan-200` | `oklch(91.8% 0.083 205.0)` |
971
+ | `--nk-cyan-300` | `oklch(86.2% 0.126 207.5)` |
972
+ | `--nk-cyan-400` | `oklch(78.9% 0.144 211.5)` |
973
+ | `--nk-cyan-500` | `oklch(71.5% 0.133 215.3)` |
974
+ | `--nk-cyan-600` | `oklch(61% 0.116 221.6)` |
975
+ | `--nk-cyan-700` | `oklch(52% 0.097 223.4)` |
976
+ | `--nk-cyan-800` | `oklch(45.5% 0.085 224.7)` |
977
+ | `--nk-cyan-900` | `oklch(38.8% 0.07 227.1)` |
978
+ | `--nk-cyan-950` | `oklch(30.9% 0.056 229.8)` |
979
+
980
+ #### Sky
981
+
982
+ | Token | Value |
983
+ | -------------- | -------------------------- |
984
+ | `--nk-sky-50` | `oklch(97.8% 0.011 237.7)` |
985
+ | `--nk-sky-100` | `oklch(94.9% 0.026 234.2)` |
986
+ | `--nk-sky-200` | `oklch(90% 0.059 232.1)` |
987
+ | `--nk-sky-300` | `oklch(82.7% 0.108 230.2)` |
988
+ | `--nk-sky-400` | `oklch(75.3% 0.153 232.8)` |
989
+ | `--nk-sky-500` | `oklch(68.5% 0.159 237.3)` |
990
+ | `--nk-sky-600` | `oklch(58.8% 0.148 242.0)` |
991
+ | `--nk-sky-700` | `oklch(50.1% 0.124 242.7)` |
992
+ | `--nk-sky-800` | `oklch(44.5% 0.104 241.2)` |
993
+ | `--nk-sky-900` | `oklch(38.1% 0.089 241.3)` |
994
+ | `--nk-sky-950` | `oklch(30.1% 0.067 242.7)` |
995
+
996
+ #### Blue
997
+
998
+ | Token | Value |
999
+ | --------------- | -------------------------- |
1000
+ | `--nk-blue-50` | `oklch(96.8% 0.015 255.3)` |
1001
+ | `--nk-blue-100` | `oklch(93.6% 0.03 254.3)` |
1002
+ | `--nk-blue-200` | `oklch(88.2% 0.059 253.8)` |
1003
+ | `--nk-blue-300` | `oklch(80.4% 0.101 252.6)` |
1004
+ | `--nk-blue-400` | `oklch(70.9% 0.155 254.7)` |
1005
+ | `--nk-blue-500` | `oklch(62.1% 0.205 259.4)` |
1006
+ | `--nk-blue-600` | `oklch(54.9% 0.244 262.8)` |
1007
+ | `--nk-blue-700` | `oklch(48.4% 0.239 264.6)` |
1008
+ | `--nk-blue-800` | `oklch(43.2% 0.201 265.2)` |
1009
+ | `--nk-blue-900` | `oklch(37% 0.15 266.0)` |
1010
+ | `--nk-blue-950` | `oklch(28.8% 0.087 267.6)` |
1011
+
1012
+ #### Indigo
1013
+
1014
+ | Token | Value |
1015
+ | ----------------- | -------------------------- |
1016
+ | `--nk-indigo-50` | `oklch(96.2% 0.018 272.3)` |
1017
+ | `--nk-indigo-100` | `oklch(93% 0.033 272.8)` |
1018
+ | `--nk-indigo-200` | `oklch(87% 0.063 273.7)` |
1019
+ | `--nk-indigo-300` | `oklch(78% 0.112 275.2)` |
1020
+ | `--nk-indigo-400` | `oklch(67.6% 0.173 276.7)` |
1021
+ | `--nk-indigo-500` | `oklch(58.4% 0.23 277.2)` |
1022
+ | `--nk-indigo-600` | `oklch(51.4% 0.257 277.0)` |
1023
+ | `--nk-indigo-700` | `oklch(45.3% 0.241 277.0)` |
1024
+ | `--nk-indigo-800` | `oklch(40.7% 0.196 277.4)` |
1025
+ | `--nk-indigo-900` | `oklch(34.9% 0.146 278.8)` |
1026
+ | `--nk-indigo-950` | `oklch(26.4% 0.088 281.2)` |
1027
+
1028
+ #### Violet
1029
+
1030
+ | Token | Value |
1031
+ | ----------------- | -------------------------- |
1032
+ | `--nk-violet-50` | `oklch(96.8% 0.016 294.0)` |
1033
+ | `--nk-violet-100` | `oklch(94.5% 0.027 293.9)` |
1034
+ | `--nk-violet-200` | `oklch(89.2% 0.058 293.8)` |
1035
+ | `--nk-violet-300` | `oklch(80.8% 0.106 293.4)` |
1036
+ | `--nk-violet-400` | `oklch(70.3% 0.173 293.4)` |
1037
+ | `--nk-violet-500` | `oklch(60.6% 0.24 292.7)` |
1038
+ | `--nk-violet-600` | `oklch(54.2% 0.279 292.7)` |
1039
+ | `--nk-violet-700` | `oklch(48.8% 0.269 292.7)` |
1040
+ | `--nk-violet-800` | `oklch(43.8% 0.234 293.2)` |
1041
+ | `--nk-violet-900` | `oklch(37.1% 0.192 292.8)` |
1042
+ | `--nk-violet-950` | `oklch(28.8% 0.139 291.6)` |
1043
+
1044
+ #### Purple
1045
+
1046
+ | Token | Value |
1047
+ | ----------------- | -------------------------- |
1048
+ | `--nk-purple-50` | `oklch(97.4% 0.014 308.2)` |
1049
+ | `--nk-purple-100` | `oklch(95.2% 0.029 307.4)` |
1050
+ | `--nk-purple-200` | `oklch(90.1% 0.061 306.7)` |
1051
+ | `--nk-purple-300` | `oklch(82.1% 0.114 306.3)` |
1052
+ | `--nk-purple-400` | `oklch(71.4% 0.193 305.5)` |
1053
+ | `--nk-purple-500` | `oklch(62.7% 0.255 303.9)` |
1054
+ | `--nk-purple-600` | `oklch(55.7% 0.286 302.3)` |
1055
+ | `--nk-purple-700` | `oklch(49.6% 0.261 302.2)` |
1056
+ | `--nk-purple-800` | `oklch(44.1% 0.22 303.7)` |
1057
+ | `--nk-purple-900` | `oklch(37.3% 0.182 304.0)` |
1058
+ | `--nk-purple-950` | `oklch(29.5% 0.145 303.3)` |
1059
+
1060
+ #### Fuchsia
1061
+
1062
+ | Token | Value |
1063
+ | ------------------ | -------------------------- |
1064
+ | `--nk-fuchsia-50` | `oklch(97.7% 0.017 319.8)` |
1065
+ | `--nk-fuchsia-100` | `oklch(95.2% 0.035 319.4)` |
1066
+ | `--nk-fuchsia-200` | `oklch(90.3% 0.075 319.7)` |
1067
+ | `--nk-fuchsia-300` | `oklch(82.9% 0.143 321.2)` |
1068
+ | `--nk-fuchsia-400` | `oklch(74.3% 0.228 322.1)` |
1069
+ | `--nk-fuchsia-500` | `oklch(66.5% 0.291 322.3)` |
1070
+ | `--nk-fuchsia-600` | `oklch(59.1% 0.283 322.9)` |
1071
+ | `--nk-fuchsia-700` | `oklch(51.8% 0.243 323.8)` |
1072
+ | `--nk-fuchsia-800` | `oklch(45.9% 0.211 324.8)` |
1073
+ | `--nk-fuchsia-900` | `oklch(39.1% 0.171 325.5)` |
1074
+ | `--nk-fuchsia-950` | `oklch(30.1% 0.135 325.7)` |
1075
+
1076
+ #### Pink
1077
+
1078
+ | Token | Value |
1079
+ | --------------- | -------------------------- |
1080
+ | `--nk-pink-50` | `oklch(97.1% 0.015 343.1)` |
1081
+ | `--nk-pink-100` | `oklch(94.9% 0.027 342.4)` |
1082
+ | `--nk-pink-200` | `oklch(89.9% 0.062 343.3)` |
1083
+ | `--nk-pink-300` | `oklch(81.7% 0.125 346.0)` |
1084
+ | `--nk-pink-400` | `oklch(72.6% 0.196 349.7)` |
1085
+ | `--nk-pink-500` | `oklch(65.2% 0.242 354.8)` |
1086
+ | `--nk-pink-600` | `oklch(59.2% 0.239 0.2)` |
1087
+ | `--nk-pink-700` | `oklch(52.5% 0.213 3.9)` |
1088
+ | `--nk-pink-800` | `oklch(46.8% 0.188 3.7)` |
1089
+ | `--nk-pink-900` | `oklch(39.8% 0.152 3.1)` |
1090
+ | `--nk-pink-950` | `oklch(29.3% 0.109 3.2)` |
1091
+
1092
+ #### Rose
1093
+
1094
+ | Token | Value |
1095
+ | --------------- | ------------------------- |
1096
+ | `--nk-rose-50` | `oklch(96.9% 0.015 12.9)` |
1097
+ | `--nk-rose-100` | `oklch(94.2% 0.027 11.4)` |
1098
+ | `--nk-rose-200` | `oklch(89% 0.058 10.9)` |
1099
+ | `--nk-rose-300` | `oklch(80.7% 0.112 11.2)` |
1100
+ | `--nk-rose-400` | `oklch(71.3% 0.184 13.5)` |
1101
+ | `--nk-rose-500` | `oklch(64.5% 0.244 16.2)` |
1102
+ | `--nk-rose-600` | `oklch(58.6% 0.243 17.6)` |
1103
+ | `--nk-rose-700` | `oklch(51.4% 0.212 16.9)` |
1104
+ | `--nk-rose-800` | `oklch(46.4% 0.185 13.4)` |
1105
+ | `--nk-rose-900` | `oklch(40% 0.157 10.9)` |
1106
+ | `--nk-rose-950` | `oklch(28.1% 0.107 11.4)` |
1107
+
1108
+ ### Tint palette
1109
+
1110
+ `Badge` carries two color vocabularies on one `color:` option. The semantic
1111
+ families answer "what does this mean"; the seventeen decorative hues answer
1112
+ "which color is this", for categorical labelling where meaning is not the
1113
+ point. Both resolve through `--nk-palette-*` tint roles.
1114
+
1115
+ The distinction is deliberate: `color: :destructive` follows `--nk-palette-destructive`
1116
+ and moves when an application rethemes its destructive tint, while `color:
1117
+ :red` follows `--nk-palette-red` and stays red. By default the two agree —
1118
+ each semantic family samples the same scale steps as its hue family, so
1119
+ `destructive` and `red` render identically until a theme separates them.
1120
+
1121
+ Each tint is appearance independent; the paired `-content` foreground resolves
1122
+ per appearance so labels stay readable in both.
1123
+
1124
+ | Token | Role |
1125
+ | ---------------------------------- | ----------------------------------------- |
1126
+ | `--nk-palette-neutral` | Neutral status tint; defaults to zinc. |
1127
+ | `--nk-palette-neutral-content` | Neutral status content on that tint. |
1128
+ | `--nk-palette-info` | Info status tint; defaults to blue. |
1129
+ | `--nk-palette-info-content` | Info status content on that tint. |
1130
+ | `--nk-palette-success` | Success status tint; defaults to green. |
1131
+ | `--nk-palette-success-content` | Success status content on that tint. |
1132
+ | `--nk-palette-warning` | Warning status tint; defaults to amber. |
1133
+ | `--nk-palette-warning-content` | Warning status content on that tint. |
1134
+ | `--nk-palette-destructive` | Destructive status tint; defaults to red. |
1135
+ | `--nk-palette-destructive-content` | Destructive status content on that tint. |
1136
+ | `--nk-palette-red` | Red tint and marker. |
1137
+ | `--nk-palette-red-content` | Red content on that tint. |
1138
+ | `--nk-palette-orange` | Orange tint and marker. |
1139
+ | `--nk-palette-orange-content` | Orange content on that tint. |
1140
+ | `--nk-palette-amber` | Amber tint and marker. |
1141
+ | `--nk-palette-amber-content` | Amber content on that tint. |
1142
+ | `--nk-palette-yellow` | Yellow tint and marker. |
1143
+ | `--nk-palette-yellow-content` | Yellow content on that tint. |
1144
+ | `--nk-palette-lime` | Lime tint and marker. |
1145
+ | `--nk-palette-lime-content` | Lime content on that tint. |
1146
+ | `--nk-palette-green` | Green tint and marker. |
1147
+ | `--nk-palette-green-content` | Green content on that tint. |
1148
+ | `--nk-palette-emerald` | Emerald tint and marker. |
1149
+ | `--nk-palette-emerald-content` | Emerald content on that tint. |
1150
+ | `--nk-palette-teal` | Teal tint and marker. |
1151
+ | `--nk-palette-teal-content` | Teal content on that tint. |
1152
+ | `--nk-palette-cyan` | Cyan tint and marker. |
1153
+ | `--nk-palette-cyan-content` | Cyan content on that tint. |
1154
+ | `--nk-palette-sky` | Sky tint and marker. |
1155
+ | `--nk-palette-sky-content` | Sky content on that tint. |
1156
+ | `--nk-palette-blue` | Blue tint and marker. |
1157
+ | `--nk-palette-blue-content` | Blue content on that tint. |
1158
+ | `--nk-palette-indigo` | Indigo tint and marker. |
1159
+ | `--nk-palette-indigo-content` | Indigo content on that tint. |
1160
+ | `--nk-palette-violet` | Violet tint and marker. |
1161
+ | `--nk-palette-violet-content` | Violet content on that tint. |
1162
+ | `--nk-palette-purple` | Purple tint and marker. |
1163
+ | `--nk-palette-purple-content` | Purple content on that tint. |
1164
+ | `--nk-palette-fuchsia` | Fuchsia tint and marker. |
1165
+ | `--nk-palette-fuchsia-content` | Fuchsia content on that tint. |
1166
+ | `--nk-palette-pink` | Pink tint and marker. |
1167
+ | `--nk-palette-pink-content` | Pink content on that tint. |
1168
+ | `--nk-palette-rose` | Rose tint and marker. |
1169
+ | `--nk-palette-rose-content` | Rose content on that tint. |
584
1170
 
585
1171
  ### Default button colors
586
1172