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
@@ -30,11 +30,13 @@
30
30
  text-underline-offset: 0.16em;
31
31
  }
32
32
 
33
- :where(
34
- [data-nk="details-table"] [data-slot="details-table-link"]:hover,
35
- [data-nk="details-table"] [data-slot="details-table-record"]:hover
36
- ) {
37
- text-decoration-color: currentcolor;
33
+ @media (hover: hover) {
34
+ :where(
35
+ [data-nk="details-table"] [data-slot="details-table-link"]:hover,
36
+ [data-nk="details-table"] [data-slot="details-table-record"]:hover
37
+ ) {
38
+ text-decoration-color: currentcolor;
39
+ }
38
40
  }
39
41
 
40
42
  :where([data-nk="details-table"] [data-slot="details-table-file"]) {
@@ -28,8 +28,8 @@
28
28
  }
29
29
 
30
30
  :where([data-nk="dialog"] [data-slot="dialog-title"]) {
31
- font-size: var(--nk-text-lg);
32
- font-weight: var(--nk-font-weight-bold);
31
+ font-size: var(--nk-title-surface-size);
32
+ font-weight: var(--nk-title-surface-weight);
33
33
  line-height: var(--nk-leading-tight);
34
34
  text-wrap: balance;
35
35
  }
@@ -67,7 +67,7 @@
67
67
  @keyframes nk-dialog-enter {
68
68
  from {
69
69
  opacity: 0;
70
- transform: translateY(0.5rem) scale(0.98);
70
+ transform: translateY(calc(var(--nk-space) * 2)) scale(0.98);
71
71
  }
72
72
  to {
73
73
  opacity: 1;
@@ -9,7 +9,7 @@
9
9
  z-index: 50;
10
10
  display: none;
11
11
  min-inline-size: 12rem;
12
- max-inline-size: min(24rem, calc(100vw - (var(--nk-space) * 8)));
12
+ max-inline-size: min(24rem, calc(100% - (var(--nk-space) * 8)));
13
13
  max-block-size: min(24rem, calc(100dvh - (var(--nk-space) * 8)));
14
14
  inset: var(--nk-space);
15
15
  inset: var(--_nk-overlay-top, var(--nk-space)) auto auto
@@ -56,7 +56,7 @@
56
56
  cursor: pointer;
57
57
  background: transparent;
58
58
  border: 0;
59
- border-radius: var(--nk-radius-md);
59
+ border-radius: calc(var(--nk-radius-lg) - var(--nk-space));
60
60
  transition:
61
61
  color var(--nk-duration-normal) var(--nk-ease),
62
62
  background-color var(--nk-duration-normal) var(--nk-ease);
@@ -86,7 +86,7 @@
86
86
  [data-nk="dropdown"]
87
87
  [data-slot="dropdown-item"][data-variant="destructive"]
88
88
  ) {
89
- color: var(--nk-color-danger-content);
89
+ color: var(--nk-color-destructive-content);
90
90
  }
91
91
 
92
92
  :where(
@@ -117,8 +117,8 @@
117
117
  [aria-disabled="true"]
118
118
  )
119
119
  ) {
120
- color: var(--nk-color-danger-foreground);
121
- background: var(--nk-color-danger);
120
+ color: var(--nk-color-destructive-foreground);
121
+ background: var(--nk-color-destructive);
122
122
  }
123
123
  }
124
124
 
@@ -132,7 +132,7 @@
132
132
  [data-slot="dropdown-item"]:is(:disabled, [aria-disabled="true"])
133
133
  ) {
134
134
  cursor: not-allowed;
135
- opacity: 0.6;
135
+ opacity: var(--nk-disabled-opacity);
136
136
  }
137
137
 
138
138
  :where([data-nk="dropdown"] > [data-slot="dropdown-content"]:popover-open) {
@@ -142,7 +142,7 @@
142
142
  @keyframes nk-dropdown-enter {
143
143
  from {
144
144
  opacity: 0;
145
- transform: translateY(-0.25rem) scale(0.98);
145
+ transform: translateY(calc(var(--nk-space) * -1)) scale(0.98);
146
146
  }
147
147
  to {
148
148
  opacity: 1;
@@ -41,7 +41,7 @@
41
41
  color: var(--nk-color-foreground);
42
42
  background: var(--nk-color-canvas);
43
43
  border: var(--nk-border-width) solid var(--nk-color-border);
44
- border-radius: var(--nk-radius-md);
44
+ border-radius: var(--nk-radius-lg);
45
45
  }
46
46
 
47
47
  :where(
@@ -90,13 +90,13 @@
90
90
  padding: calc(var(--nk-space) * 2);
91
91
  background: var(--nk-color-canvas);
92
92
  border: var(--nk-border-width) solid var(--nk-color-border);
93
- border-radius: var(--nk-radius-md);
93
+ border-radius: var(--nk-radius-lg);
94
94
  }
95
95
 
96
96
  :where([data-nk="dropzone"] [data-slot="dropzone-preview-image"]) {
97
97
  grid-row: span 2;
98
- inline-size: 3rem;
99
- block-size: 3rem;
98
+ inline-size: calc(var(--nk-space) * 12);
99
+ block-size: calc(var(--nk-space) * 12);
100
100
  object-fit: cover;
101
101
  border-radius: var(--nk-radius-sm);
102
102
  }
@@ -152,12 +152,12 @@
152
152
  }
153
153
 
154
154
  :where([data-nk="dropzone"][data-state="error"]) {
155
- border-color: var(--nk-color-danger);
155
+ border-color: var(--nk-color-destructive);
156
156
  }
157
157
 
158
158
  :where([data-nk="dropzone"][data-state="disabled"]) {
159
159
  cursor: not-allowed;
160
- opacity: 0.6;
160
+ opacity: var(--nk-disabled-opacity);
161
161
  }
162
162
 
163
163
  :where(
@@ -186,7 +186,7 @@
186
186
  }
187
187
 
188
188
  :where([data-nk="dropzone"] > [data-slot="dropzone-error"]) {
189
- color: var(--nk-color-danger-content);
189
+ color: var(--nk-color-destructive-content);
190
190
  font-size: var(--nk-text-sm);
191
191
  }
192
192
  }
@@ -13,15 +13,15 @@
13
13
  }
14
14
 
15
15
  :where([data-nk="empty-state"] > [data-slot="empty-state-icon"]) {
16
- inline-size: 2rem;
17
- block-size: 2rem;
16
+ inline-size: calc(var(--nk-space) * 8);
17
+ block-size: calc(var(--nk-space) * 8);
18
18
  color: var(--nk-color-muted-foreground);
19
19
  }
20
20
 
21
21
  :where([data-nk="empty-state"] > [data-slot="empty-state-title"]) {
22
22
  max-inline-size: var(--nk-content-md);
23
- font-size: var(--nk-text-lg);
24
- font-weight: var(--nk-font-weight-bold);
23
+ font-size: var(--nk-title-surface-size);
24
+ font-weight: var(--nk-title-surface-weight);
25
25
  line-height: var(--nk-leading-tight);
26
26
  text-wrap: balance;
27
27
  }
@@ -18,7 +18,7 @@
18
18
 
19
19
  :where([data-nk="field"] > [data-slot="field-error"]) {
20
20
  padding: 0;
21
- color: var(--nk-color-danger-content);
21
+ color: var(--nk-color-destructive-content);
22
22
  font-size: var(--nk-text-sm);
23
23
  list-style: none;
24
24
  }
@@ -78,6 +78,6 @@
78
78
  [data-nk="field"][data-state="invalid"]
79
79
  > [data-slot="field-control"][data-nk="input"]
80
80
  ) {
81
- border-color: var(--nk-color-danger);
81
+ border-color: var(--nk-color-destructive);
82
82
  }
83
83
  }
@@ -8,8 +8,8 @@
8
8
 
9
9
  :where([data-nk="fieldset"] > [data-slot="fieldset-legend"]) {
10
10
  padding: 0;
11
- font-size: var(--nk-text-lg);
12
- font-weight: var(--nk-font-weight-semibold);
11
+ font-size: var(--nk-title-surface-size);
12
+ font-weight: var(--nk-title-surface-weight);
13
13
  line-height: var(--nk-leading-tight);
14
14
  }
15
15
 
@@ -1,7 +1,7 @@
1
1
  @layer nitro-kit.base {
2
2
  :where([data-nk="flex"]) {
3
3
  display: flex;
4
- min-width: 0;
4
+ min-inline-size: 0;
5
5
  flex-direction: var(--_nk-flex-direction);
6
6
  flex-wrap: var(--_nk-flex-wrap);
7
7
  gap: var(--_nk-layout-gap);
@@ -1,7 +1,7 @@
1
1
  @layer nitro-kit.base {
2
2
  :where([data-nk="grid"]) {
3
3
  display: grid;
4
- min-width: 0;
4
+ min-inline-size: 0;
5
5
  grid-template-columns: repeat(var(--_nk-grid-columns), minmax(0, 1fr));
6
6
  gap: var(--_nk-layout-gap);
7
7
  }
@@ -9,18 +9,18 @@
9
9
 
10
10
  @layer nitro-kit.size {
11
11
  :where([data-nk="icon"][data-size="xs"]) {
12
- --_nk-icon-size: 0.75rem;
12
+ --_nk-icon-size: var(--nk-icon-size-xs);
13
13
  }
14
14
  :where([data-nk="icon"][data-size="sm"]) {
15
- --_nk-icon-size: 1rem;
15
+ --_nk-icon-size: var(--nk-icon-size-sm);
16
16
  }
17
17
  :where([data-nk="icon"][data-size="md"]) {
18
- --_nk-icon-size: 1.25rem;
18
+ --_nk-icon-size: var(--nk-icon-size-md);
19
19
  }
20
20
  :where([data-nk="icon"][data-size="lg"]) {
21
- --_nk-icon-size: 1.75rem;
21
+ --_nk-icon-size: var(--nk-icon-size-lg);
22
22
  }
23
23
  :where([data-nk="icon"][data-size="xl"]) {
24
- --_nk-icon-size: 2.25rem;
24
+ --_nk-icon-size: var(--nk-icon-size-xl);
25
25
  }
26
26
  }
@@ -5,20 +5,20 @@
5
5
  display: block;
6
6
  inline-size: 100%;
7
7
  min-block-size: var(--nk-control-height-md);
8
- padding-inline: calc(var(--nk-space) * 3);
8
+ padding-inline: var(--nk-control-padding-inline);
9
9
  color: var(--nk-color-foreground);
10
10
  font-size: var(--nk-text-base);
11
11
  background: var(--nk-color-surface);
12
12
  border: var(--nk-border-width) solid var(--nk-color-border);
13
- border-radius: var(--nk-radius-md);
13
+ border-radius: var(--nk-radius-lg);
14
14
  transition:
15
15
  border-color var(--nk-duration-normal) var(--nk-ease),
16
16
  box-shadow var(--nk-duration-normal) var(--nk-ease);
17
17
  }
18
18
 
19
19
  :where([data-nk="input"][type="checkbox"], [data-nk="input"][type="radio"]) {
20
- inline-size: 1.125rem;
21
- block-size: 1.125rem;
20
+ inline-size: var(--nk-choice-size-md);
21
+ block-size: var(--nk-choice-size-md);
22
22
  accent-color: var(--nk-color-primary);
23
23
  }
24
24
 
@@ -55,6 +55,33 @@
55
55
  border-inline-end: var(--nk-border-width) solid
56
56
  var(--nk-button-default-border);
57
57
  }
58
+
59
+ /* Data-entry controls read --nk-text-base below the md breakpoint, where
60
+ a focused control under 16px would zoom the viewport, and --nk-text-sm
61
+ from md up, beside 14px labels and body text. */
62
+ @media (min-width: 48rem) {
63
+ :where(
64
+ [data-nk="input"]:not(
65
+ [type="checkbox"],
66
+ [type="radio"],
67
+ [type="hidden"]
68
+ )
69
+ ) {
70
+ font-size: var(--nk-text-sm);
71
+ }
72
+ }
73
+
74
+ @media (prefers-reduced-motion: reduce) {
75
+ :where(
76
+ [data-nk="input"]:not(
77
+ [type="checkbox"],
78
+ [type="radio"],
79
+ [type="hidden"]
80
+ )
81
+ ) {
82
+ transition-duration: 0.01ms;
83
+ }
84
+ }
58
85
  }
59
86
 
60
87
  @layer nitro-kit.state {
@@ -78,10 +105,10 @@
78
105
 
79
106
  :where([data-nk="input"]:disabled) {
80
107
  cursor: not-allowed;
81
- opacity: 0.6;
108
+ opacity: var(--nk-disabled-opacity);
82
109
  }
83
110
 
84
111
  :where([data-nk="input"][aria-invalid="true"]) {
85
- border-color: var(--nk-color-danger);
112
+ border-color: var(--nk-color-destructive);
86
113
  }
87
114
  }
@@ -13,15 +13,15 @@
13
13
  }
14
14
 
15
15
  :where([data-nk="page-header"] > [data-slot="page-header-title"]) {
16
- max-width: var(--nk-content-lg);
17
- font-size: var(--nk-text-2xl);
18
- font-weight: var(--nk-font-weight-bold);
16
+ max-inline-size: var(--nk-content-lg);
17
+ font-size: var(--nk-title-page-size);
18
+ font-weight: var(--nk-title-page-weight);
19
19
  line-height: var(--nk-leading-tight);
20
20
  text-wrap: balance;
21
21
  }
22
22
 
23
23
  :where([data-nk="page-header"] > [data-slot="page-header-description"]) {
24
- max-width: var(--nk-content-lg);
24
+ max-inline-size: var(--nk-content-lg);
25
25
  color: var(--nk-color-muted-foreground);
26
26
  font-size: var(--nk-text-sm);
27
27
  line-height: var(--nk-leading-relaxed);
@@ -32,8 +32,8 @@
32
32
  > [data-slot="pagination-ellipsis-label"]
33
33
  ) {
34
34
  position: absolute;
35
- width: 1px;
36
- height: 1px;
35
+ inline-size: 1px;
36
+ block-size: 1px;
37
37
  padding: 0;
38
38
  margin: -1px;
39
39
  overflow: hidden;
@@ -102,7 +102,7 @@
102
102
  font-size: var(--nk-text-sm);
103
103
  font-weight: var(--nk-font-weight-medium);
104
104
  border: var(--nk-border-width) solid var(--nk-color-border);
105
- border-radius: var(--nk-radius-md);
105
+ border-radius: var(--nk-radius-lg);
106
106
  }
107
107
 
108
108
  :where(
@@ -1,7 +1,7 @@
1
1
  @layer nitro-kit.base {
2
2
  :where([data-nk="pagination-bar"]) {
3
3
  display: flex;
4
- min-width: 0;
4
+ min-inline-size: 0;
5
5
  flex-wrap: wrap;
6
6
  align-items: center;
7
7
  justify-content: space-between;
@@ -9,7 +9,7 @@
9
9
  }
10
10
 
11
11
  :where([data-nk="pagination-bar"] > [data-slot="pagination-bar-summary"]) {
12
- min-width: 0;
12
+ min-inline-size: 0;
13
13
  margin: 0;
14
14
  color: var(--nk-color-muted-foreground);
15
15
  font-size: var(--nk-text-sm);
@@ -1,113 +1,181 @@
1
+ /* The semantic palette shared by Badge, Alert, and Toast.
2
+ *
3
+ * Every family resolves through the public `--nk-palette-*` tint axis, which
4
+ * samples the color scales and is already appearance-aware, so a component
5
+ * never restates a hue. Semantic families default to the same steps as their
6
+ * hue families -- `info` renders exactly like `blue` -- and an application
7
+ * that rethemes a tint role moves all three components at once. `-content`
8
+ * carries the paired foreground; the base role carries the tinting accent.
9
+ *
10
+ * Alert and Toast are the same kind of thing — a status message — so they also
11
+ * share one tinted surface and border. Only the components that own a different
12
+ * job, such as Badge's compact label, set their own tint strength.
13
+ */
1
14
  @layer nitro-kit.variant {
2
15
  :where(
3
- [data-nk="badge"][data-color="zinc"],
4
16
  [data-nk="badge"][data-color="neutral"],
5
- [data-nk="alert"][data-variant="default"]
17
+ [data-nk="alert"][data-variant="default"],
18
+ [data-nk="toast-item"][data-variant="default"]
6
19
  ) {
7
- --_nk-palette-light: oklch(37% 0.013 285.805);
8
- --_nk-palette-dark: oklch(92% 0.004 286.32);
9
- --_nk-palette-tint: oklch(70.5% 0.015 286.067);
20
+ --_nk-semantic-accent: var(--nk-palette-neutral);
21
+ --_nk-semantic-content: var(--nk-palette-neutral-content);
10
22
  }
11
23
 
12
24
  :where(
13
- [data-nk="badge"][data-color="red"],
14
- [data-nk="badge"][data-color="danger"],
15
- [data-nk="alert"][data-variant="error"]
25
+ [data-nk="badge"][data-color="info"],
26
+ [data-nk="alert"][data-variant="info"],
27
+ [data-nk="toast-item"][data-variant="info"]
16
28
  ) {
17
- --_nk-palette-light: oklch(50.5% 0.213 27.518);
18
- --_nk-palette-dark: oklch(88.5% 0.062 18.334);
19
- --_nk-palette-tint: oklch(70.4% 0.191 22.216);
29
+ --_nk-semantic-accent: var(--nk-palette-info);
30
+ --_nk-semantic-content: var(--nk-palette-info-content);
20
31
  }
21
- :where([data-nk="badge"][data-color="orange"]) {
22
- --_nk-palette-light: oklch(55.3% 0.195 38.402);
23
- --_nk-palette-dark: oklch(90.1% 0.076 70.697);
24
- --_nk-palette-tint: oklch(75% 0.183 55.934);
32
+
33
+ :where(
34
+ [data-nk="badge"][data-color="success"],
35
+ [data-nk="alert"][data-variant="success"],
36
+ [data-nk="toast-item"][data-variant="success"]
37
+ ) {
38
+ --_nk-semantic-accent: var(--nk-palette-success);
39
+ --_nk-semantic-content: var(--nk-palette-success-content);
25
40
  }
41
+
26
42
  :where(
27
- [data-nk="badge"][data-color="amber"],
28
43
  [data-nk="badge"][data-color="warning"],
29
- [data-nk="alert"][data-variant="warning"]
44
+ [data-nk="alert"][data-variant="warning"],
45
+ [data-nk="toast-item"][data-variant="warning"]
46
+ ) {
47
+ --_nk-semantic-accent: var(--nk-palette-warning);
48
+ --_nk-semantic-content: var(--nk-palette-warning-content);
49
+ }
50
+
51
+ /* Action components and Alert say `destructive`; Toast announces `error`.
52
+ Both spellings resolve to the destructive family, and this is the only
53
+ place they meet. */
54
+ :where(
55
+ [data-nk="badge"][data-color="destructive"],
56
+ [data-nk="alert"][data-variant="destructive"],
57
+ [data-nk="toast-item"][data-variant="error"]
30
58
  ) {
31
- --_nk-palette-light: oklch(55% 0.163 48.998);
32
- --_nk-palette-dark: oklch(92.4% 0.12 95.746);
33
- --_nk-palette-tint: oklch(82.8% 0.189 84.429);
59
+ --_nk-semantic-accent: var(--nk-palette-destructive);
60
+ --_nk-semantic-content: var(--nk-palette-destructive-content);
61
+ }
62
+
63
+ /* The shared status treatment. Defined once so Alert and Toast cannot drift
64
+ apart again, and so a third status component inherits it by opting in. */
65
+ :where([data-nk="alert"], [data-nk="toast-item"]) {
66
+ --_nk-semantic-tint: 12%;
67
+ --_nk-semantic-surface: color-mix(
68
+ in oklab,
69
+ var(--_nk-semantic-accent) var(--_nk-semantic-tint),
70
+ var(--nk-color-surface)
71
+ );
72
+ --_nk-semantic-border: color-mix(
73
+ in oklab,
74
+ var(--_nk-semantic-accent) 45%,
75
+ transparent
76
+ );
77
+ }
78
+
79
+ /* Dark appearances need a stronger tint to separate the surface from the
80
+ page behind it. */
81
+ :where([data-theme="dark"])
82
+ :where([data-nk="alert"], [data-nk="toast-item"]) {
83
+ --_nk-semantic-tint: 20%;
84
+ }
85
+
86
+ @media (prefers-color-scheme: dark) {
87
+ :where(:root:not([data-theme]))
88
+ :where([data-nk="alert"], [data-nk="toast-item"]) {
89
+ --_nk-semantic-tint: 20%;
90
+ }
91
+ }
92
+
93
+ /* The decorative hues. These name a color rather than a meaning, so they
94
+ follow `--nk-palette-*` and stay put when an application rethemes its
95
+ semantic families. `red` and `destructive` are deliberately different: one is
96
+ a color, the other is whatever destructive currently means. */
97
+ :where([data-nk="badge"][data-color="red"]) {
98
+ --_nk-semantic-accent: var(--nk-palette-red);
99
+ --_nk-semantic-content: var(--nk-palette-red-content);
100
+ }
101
+
102
+ :where([data-nk="badge"][data-color="orange"]) {
103
+ --_nk-semantic-accent: var(--nk-palette-orange);
104
+ --_nk-semantic-content: var(--nk-palette-orange-content);
34
105
  }
106
+
107
+ :where([data-nk="badge"][data-color="amber"]) {
108
+ --_nk-semantic-accent: var(--nk-palette-amber);
109
+ --_nk-semantic-content: var(--nk-palette-amber-content);
110
+ }
111
+
35
112
  :where([data-nk="badge"][data-color="yellow"]) {
36
- --_nk-palette-light: oklch(47.6% 0.114 61.907);
37
- --_nk-palette-dark: oklch(94.5% 0.129 101.54);
38
- --_nk-palette-tint: oklch(85.2% 0.199 91.936);
113
+ --_nk-semantic-accent: var(--nk-palette-yellow);
114
+ --_nk-semantic-content: var(--nk-palette-yellow-content);
39
115
  }
116
+
40
117
  :where([data-nk="badge"][data-color="lime"]) {
41
- --_nk-palette-light: oklch(45.3% 0.124 130.933);
42
- --_nk-palette-dark: oklch(93.8% 0.127 124.321);
43
- --_nk-palette-tint: oklch(84.1% 0.238 128.85);
118
+ --_nk-semantic-accent: var(--nk-palette-lime);
119
+ --_nk-semantic-content: var(--nk-palette-lime-content);
44
120
  }
45
- :where(
46
- [data-nk="badge"][data-color="green"],
47
- [data-nk="badge"][data-color="success"],
48
- [data-nk="alert"][data-variant="success"]
49
- ) {
50
- --_nk-palette-light: oklch(44.8% 0.119 151.328);
51
- --_nk-palette-dark: oklch(92.5% 0.084 155.995);
52
- --_nk-palette-tint: oklch(79.2% 0.209 151.711);
121
+
122
+ :where([data-nk="badge"][data-color="green"]) {
123
+ --_nk-semantic-accent: var(--nk-palette-green);
124
+ --_nk-semantic-content: var(--nk-palette-green-content);
53
125
  }
126
+
54
127
  :where([data-nk="badge"][data-color="emerald"]) {
55
- --_nk-palette-light: oklch(43.2% 0.095 166.913);
56
- --_nk-palette-dark: oklch(90.5% 0.093 164.15);
57
- --_nk-palette-tint: oklch(76.5% 0.177 163.223);
128
+ --_nk-semantic-accent: var(--nk-palette-emerald);
129
+ --_nk-semantic-content: var(--nk-palette-emerald-content);
58
130
  }
131
+
59
132
  :where([data-nk="badge"][data-color="teal"]) {
60
- --_nk-palette-light: oklch(43.7% 0.078 188.216);
61
- --_nk-palette-dark: oklch(91% 0.096 180.426);
62
- --_nk-palette-tint: oklch(77.7% 0.152 181.912);
133
+ --_nk-semantic-accent: var(--nk-palette-teal);
134
+ --_nk-semantic-content: var(--nk-palette-teal-content);
63
135
  }
136
+
64
137
  :where([data-nk="badge"][data-color="cyan"]) {
65
- --_nk-palette-light: oklch(45% 0.085 224.283);
66
- --_nk-palette-dark: oklch(91.7% 0.08 205.041);
67
- --_nk-palette-tint: oklch(78.9% 0.154 211.53);
138
+ --_nk-semantic-accent: var(--nk-palette-cyan);
139
+ --_nk-semantic-content: var(--nk-palette-cyan-content);
68
140
  }
141
+
69
142
  :where([data-nk="badge"][data-color="sky"]) {
70
- --_nk-palette-light: oklch(44.3% 0.11 240.79);
71
- --_nk-palette-dark: oklch(90.1% 0.058 230.902);
72
- --_nk-palette-tint: oklch(74.6% 0.16 232.661);
143
+ --_nk-semantic-accent: var(--nk-palette-sky);
144
+ --_nk-semantic-content: var(--nk-palette-sky-content);
73
145
  }
74
- :where(
75
- [data-nk="badge"][data-color="blue"],
76
- [data-nk="badge"][data-color="info"],
77
- [data-nk="alert"][data-variant="info"]
78
- ) {
79
- --_nk-palette-light: oklch(42.4% 0.199 265.638);
80
- --_nk-palette-dark: oklch(88.2% 0.059 254.128);
81
- --_nk-palette-tint: oklch(70.7% 0.165 254.624);
146
+
147
+ :where([data-nk="badge"][data-color="blue"]) {
148
+ --_nk-semantic-accent: var(--nk-palette-blue);
149
+ --_nk-semantic-content: var(--nk-palette-blue-content);
82
150
  }
151
+
83
152
  :where([data-nk="badge"][data-color="indigo"]) {
84
- --_nk-palette-light: oklch(45.7% 0.24 277.023);
85
- --_nk-palette-dark: oklch(87% 0.065 274.039);
86
- --_nk-palette-tint: oklch(67.3% 0.182 276.935);
153
+ --_nk-semantic-accent: var(--nk-palette-indigo);
154
+ --_nk-semantic-content: var(--nk-palette-indigo-content);
87
155
  }
156
+
88
157
  :where([data-nk="badge"][data-color="violet"]) {
89
- --_nk-palette-light: oklch(49.1% 0.27 292.581);
90
- --_nk-palette-dark: oklch(89.4% 0.057 293.283);
91
- --_nk-palette-tint: oklch(70.2% 0.183 293.541);
158
+ --_nk-semantic-accent: var(--nk-palette-violet);
159
+ --_nk-semantic-content: var(--nk-palette-violet-content);
92
160
  }
161
+
93
162
  :where([data-nk="badge"][data-color="purple"]) {
94
- --_nk-palette-light: oklch(49.6% 0.265 301.924);
95
- --_nk-palette-dark: oklch(90.2% 0.063 306.703);
96
- --_nk-palette-tint: oklch(71.4% 0.203 305.504);
163
+ --_nk-semantic-accent: var(--nk-palette-purple);
164
+ --_nk-semantic-content: var(--nk-palette-purple-content);
97
165
  }
166
+
98
167
  :where([data-nk="badge"][data-color="fuchsia"]) {
99
- --_nk-palette-light: oklch(51.8% 0.253 323.949);
100
- --_nk-palette-dark: oklch(90.3% 0.076 319.62);
101
- --_nk-palette-tint: oklch(74% 0.238 322.16);
168
+ --_nk-semantic-accent: var(--nk-palette-fuchsia);
169
+ --_nk-semantic-content: var(--nk-palette-fuchsia-content);
102
170
  }
171
+
103
172
  :where([data-nk="badge"][data-color="pink"]) {
104
- --_nk-palette-light: oklch(52.5% 0.223 3.958);
105
- --_nk-palette-dark: oklch(89.9% 0.061 343.231);
106
- --_nk-palette-tint: oklch(71.8% 0.202 349.761);
173
+ --_nk-semantic-accent: var(--nk-palette-pink);
174
+ --_nk-semantic-content: var(--nk-palette-pink-content);
107
175
  }
176
+
108
177
  :where([data-nk="badge"][data-color="rose"]) {
109
- --_nk-palette-light: oklch(51.4% 0.222 16.935);
110
- --_nk-palette-dark: oklch(89.2% 0.058 10.001);
111
- --_nk-palette-tint: oklch(71.2% 0.194 13.428);
178
+ --_nk-semantic-accent: var(--nk-palette-rose);
179
+ --_nk-semantic-content: var(--nk-palette-rose-content);
112
180
  }
113
181
  }
@@ -47,7 +47,7 @@
47
47
  > [data-slot="progressive-image-placeholder"]
48
48
  ) {
49
49
  z-index: 1;
50
- filter: blur(1rem);
50
+ filter: blur(calc(var(--nk-space) * 4));
51
51
  opacity: 0;
52
52
  transform: scale(1.05);
53
53
  }