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
@@ -38,6 +38,19 @@
38
38
  --nk-typeset-leading: 1.75;
39
39
  --nk-typeset-flow: 1.25em;
40
40
 
41
+ /* The title scale. Four roles cover every owned title and legend: page
42
+ for the one page heading, section for full-width section headers,
43
+ surface for cards, dialogs, sheets, empty states, and fieldsets, and
44
+ compact for control-group legends and status titles. */
45
+ --nk-title-page-size: var(--nk-text-2xl);
46
+ --nk-title-page-weight: var(--nk-font-weight-bold);
47
+ --nk-title-section-size: var(--nk-text-xl);
48
+ --nk-title-section-weight: var(--nk-font-weight-bold);
49
+ --nk-title-surface-size: var(--nk-text-lg);
50
+ --nk-title-surface-weight: var(--nk-font-weight-bold);
51
+ --nk-title-compact-size: var(--nk-text-sm);
52
+ --nk-title-compact-weight: var(--nk-font-weight-semibold);
53
+
41
54
  --nk-font-weight-normal: 400;
42
55
  --nk-font-weight-medium: 500;
43
56
  --nk-font-weight-semibold: 600;
@@ -56,12 +69,16 @@
56
69
  --nk-border-width: 1px;
57
70
  --nk-focus-width: 2px;
58
71
  --nk-focus-offset: 2px;
72
+ --nk-disabled-opacity: 0.6;
59
73
 
60
- --nk-shadow-sm: 0 1px 2px oklch(0 0 0 / 0.08);
61
- --nk-shadow-md: 0 4px 6px -1px oklch(0 0 0 / 0.1),
62
- 0 2px 4px -2px oklch(0 0 0 / 0.1);
63
- --nk-shadow-lg: 0 10px 15px -3px oklch(0 0 0 / 0.12),
64
- 0 4px 6px -4px oklch(0 0 0 / 0.12);
74
+ --nk-shadow-xs: 0 1px 2px 0
75
+ color-mix(in oklab, var(--nk-black) 5%, transparent);
76
+ --nk-shadow-sm: 0 1px 2px
77
+ color-mix(in oklab, var(--nk-black) 8%, transparent);
78
+ --nk-shadow-md: 0 4px 6px -1px color-mix(in oklab, var(--nk-black) 10%, transparent),
79
+ 0 2px 4px -2px color-mix(in oklab, var(--nk-black) 10%, transparent);
80
+ --nk-shadow-lg: 0 10px 15px -3px color-mix(in oklab, var(--nk-black) 12%, transparent),
81
+ 0 4px 6px -4px color-mix(in oklab, var(--nk-black) 12%, transparent);
65
82
 
66
83
  --nk-duration-fast: 100ms;
67
84
  --nk-duration-normal: 150ms;
@@ -69,11 +86,27 @@
69
86
  --nk-ease: cubic-bezier(0.4, 0, 0.2, 1);
70
87
 
71
88
  --nk-control-height-xs: 1.5rem;
72
- --nk-control-height-sm: 1.75rem;
73
- --nk-control-height-md: 2.5rem;
89
+ --nk-control-height-sm: 2rem;
90
+ --nk-control-height-md: 2.25rem;
74
91
  --nk-control-height-lg: 2.75rem;
75
92
  --nk-control-height-xl: 3.5rem;
76
93
 
94
+ --nk-control-padding-inline: calc(var(--nk-space) * 3);
95
+
96
+ --nk-choice-size-md: 1.125rem;
97
+ --nk-choice-size-lg: 1.5rem;
98
+
99
+ --nk-icon-size-xs: 0.75rem;
100
+ --nk-icon-size-sm: 1rem;
101
+ --nk-icon-size-md: 1.25rem;
102
+ --nk-icon-size-lg: 1.75rem;
103
+ --nk-icon-size-xl: 2.25rem;
104
+
105
+ --nk-avatar-size-xs: 1.5rem;
106
+ --nk-avatar-size-sm: 2rem;
107
+ --nk-avatar-size-md: 3rem;
108
+ --nk-avatar-size-lg: 4rem;
109
+
77
110
  --nk-content-sm: 24rem;
78
111
  --nk-content-md: 32rem;
79
112
  --nk-content-lg: 48rem;
@@ -81,89 +114,479 @@
81
114
 
82
115
  --nk-app-shell-sidebar-width: 16rem;
83
116
  --nk-app-shell-topbar-height: 3.5rem;
117
+
118
+ /* The poles of every scale. */
119
+ --nk-white: #fff;
120
+ --nk-black: #000;
121
+
122
+ /* The color scales. Every family ships all eleven steps, appearance
123
+ independent; the appearance blocks below sample them. 50-200 are tints
124
+ and surfaces, 400-600 accents and markers, 700-950 content.
125
+
126
+ Harmonized derivations of the Tailwind CSS v4 palette (MIT, (c) Tailwind
127
+ Labs Inc.): each family's lightness, chroma, and hue follow smooth local
128
+ fits through the source ramp, bounded to an imperceptible distance
129
+ (OKLab delta E <= 0.01 per value) and never more saturated outside sRGB
130
+ than the source. */
131
+ --nk-slate-50: oklch(98.4% 0.004 247.3);
132
+ --nk-slate-100: oklch(96.8% 0.006 249.8);
133
+ --nk-slate-200: oklch(93.6% 0.013 252.5);
134
+ --nk-slate-300: oklch(85.9% 0.023 254.2);
135
+ --nk-slate-400: oklch(71.2% 0.038 255.7);
136
+ --nk-slate-500: oklch(55.7% 0.045 257.6);
137
+ --nk-slate-600: oklch(45% 0.045 257.1);
138
+ --nk-slate-700: oklch(36.4% 0.043 257.5);
139
+ --nk-slate-800: oklch(28.5% 0.042 260.9);
140
+ --nk-slate-900: oklch(20.6% 0.042 263.3);
141
+ --nk-slate-950: oklch(12.9% 0.042 265.8);
142
+
143
+ --nk-gray-50: oklch(98.5% 0.002 250.4);
144
+ --nk-gray-100: oklch(96.7% 0.002 260.5);
145
+ --nk-gray-200: oklch(93.6% 0.005 264.1);
146
+ --nk-gray-300: oklch(86.2% 0.011 259.5);
147
+ --nk-gray-400: oklch(71.4% 0.02 261.5);
148
+ --nk-gray-500: oklch(55.6% 0.027 261.6);
149
+ --nk-gray-600: oklch(44.9% 0.031 260);
150
+ --nk-gray-700: oklch(36.4% 0.033 256.9);
151
+ --nk-gray-800: oklch(28.6% 0.034 260.1);
152
+ --nk-gray-900: oklch(20.7% 0.033 261.5);
153
+ --nk-gray-950: oklch(13% 0.028 262.7);
154
+
155
+ --nk-zinc-50: oklch(98.5% 0 none);
156
+ --nk-zinc-100: oklch(96.7% 0.001 286.4);
157
+ --nk-zinc-200: oklch(93% 0.003 286.3);
158
+ --nk-zinc-300: oklch(86.1% 0.007 286.3);
159
+ --nk-zinc-400: oklch(71.4% 0.013 286.1);
160
+ --nk-zinc-500: oklch(55.5% 0.017 285.9);
161
+ --nk-zinc-600: oklch(44.7% 0.016 285.8);
162
+ --nk-zinc-700: oklch(36% 0.012 285.9);
163
+ --nk-zinc-800: oklch(28.2% 0.008 285.9);
164
+ --nk-zinc-900: oklch(20.8% 0.005 285.9);
165
+ --nk-zinc-950: oklch(14% 0.005 285.8);
166
+
167
+ --nk-neutral-50: oklch(98.5% 0 none);
168
+ --nk-neutral-100: oklch(97% 0 none);
169
+ --nk-neutral-200: oklch(93.2% 0 none);
170
+ --nk-neutral-300: oklch(86% 0 none);
171
+ --nk-neutral-400: oklch(71.6% 0 none);
172
+ --nk-neutral-500: oklch(55.7% 0 none);
173
+ --nk-neutral-600: oklch(44.7% 0 none);
174
+ --nk-neutral-700: oklch(36.1% 0 none);
175
+ --nk-neutral-800: oklch(27.8% 0 none);
176
+ --nk-neutral-900: oklch(20.7% 0 none);
177
+ --nk-neutral-950: oklch(14.3% 0 none);
178
+
179
+ --nk-stone-50: oklch(98.5% 0.001 114.2);
180
+ --nk-stone-100: oklch(97% 0.001 85.2);
181
+ --nk-stone-200: oklch(93.3% 0.003 64.5);
182
+ --nk-stone-300: oklch(85.9% 0.005 52.4);
183
+ --nk-stone-400: oklch(71.5% 0.01 56.1);
184
+ --nk-stone-500: oklch(55.7% 0.012 62.1);
185
+ --nk-stone-600: oklch(45% 0.012 71.1);
186
+ --nk-stone-700: oklch(36.4% 0.01 62.3);
187
+ --nk-stone-800: oklch(27.8% 0.007 44.5);
188
+ --nk-stone-900: oklch(21.1% 0.006 46.3);
189
+ --nk-stone-950: oklch(14.7% 0.004 51.8);
190
+
191
+ --nk-red-50: oklch(97% 0.013 17.5);
192
+ --nk-red-100: oklch(93.9% 0.029 17.5);
193
+ --nk-red-200: oklch(88.4% 0.061 18.3);
194
+ --nk-red-300: oklch(80.2% 0.113 19.7);
195
+ --nk-red-400: oklch(71% 0.183 22.3);
196
+ --nk-red-500: oklch(63.6% 0.237 25.3);
197
+ --nk-red-600: oklch(57.5% 0.235 27.3);
198
+ --nk-red-700: oklch(50.7% 0.207 27.6);
199
+ --nk-red-800: oklch(45.3% 0.178 26.7);
200
+ --nk-red-900: oklch(38.6% 0.14 25.9);
201
+ --nk-red-950: oklch(26.8% 0.093 25.8);
202
+
203
+ --nk-orange-50: oklch(98.1% 0.015 73.9);
204
+ --nk-orange-100: oklch(95.2% 0.038 74.5);
205
+ --nk-orange-200: oklch(90.3% 0.075 71.7);
206
+ --nk-orange-300: oklch(83% 0.124 65.1);
207
+ --nk-orange-400: oklch(75.3% 0.173 56.1);
208
+ --nk-orange-500: oklch(70.5% 0.203 47.6);
209
+ --nk-orange-600: oklch(64.6% 0.212 41.1);
210
+ --nk-orange-700: oklch(55.3% 0.185 38.4);
211
+ --nk-orange-800: oklch(48% 0.158 37.7);
212
+ --nk-orange-900: oklch(39.8% 0.122 37.7);
213
+ --nk-orange-950: oklch(27.6% 0.079 36.7);
214
+
215
+ --nk-amber-50: oklch(98.8% 0.016 94.9);
216
+ --nk-amber-100: oklch(96% 0.069 96.5);
217
+ --nk-amber-200: oklch(92.4% 0.118 95.3);
218
+ --nk-amber-300: oklch(87.9% 0.167 92.1);
219
+ --nk-amber-400: oklch(82.8% 0.179 84.4);
220
+ --nk-amber-500: oklch(76.9% 0.178 70.1);
221
+ --nk-amber-600: oklch(66.6% 0.169 58.3);
222
+ --nk-amber-700: oklch(55.5% 0.153 49.1);
223
+ --nk-amber-800: oklch(48.1% 0.135 46.1);
224
+ --nk-amber-900: oklch(40.4% 0.112 45.4);
225
+ --nk-amber-950: oklch(28.9% 0.077 46.2);
226
+
227
+ --nk-yellow-50: oklch(98.7% 0.021 102.2);
228
+ --nk-yellow-100: oklch(97.3% 0.071 103.1);
229
+ --nk-yellow-200: oklch(94.5% 0.13 101.7);
230
+ --nk-yellow-300: oklch(90.4% 0.175 97.8);
231
+ --nk-yellow-400: oklch(85.2% 0.189 91.9);
232
+ --nk-yellow-500: oklch(79.5% 0.174 86);
233
+ --nk-yellow-600: oklch(68.1% 0.152 75.8);
234
+ --nk-yellow-700: oklch(55.6% 0.125 66.6);
235
+ --nk-yellow-800: oklch(48.3% 0.111 61.5);
236
+ --nk-yellow-900: oklch(41.1% 0.094 57.5);
237
+ --nk-yellow-950: oklch(29.6% 0.067 54.1);
238
+
239
+ --nk-lime-50: oklch(98.6% 0.026 120.7);
240
+ --nk-lime-100: oklch(96.8% 0.076 122.4);
241
+ --nk-lime-200: oklch(93.8% 0.129 124.4);
242
+ --nk-lime-300: oklch(89.7% 0.195 126.6);
243
+ --nk-lime-400: oklch(84.1% 0.228 128.9);
244
+ --nk-lime-500: oklch(76.8% 0.223 130.8);
245
+ --nk-lime-600: oklch(64.8% 0.19 131.7);
246
+ --nk-lime-700: oklch(53.5% 0.147 131.5);
247
+ --nk-lime-800: oklch(46.2% 0.125 131);
248
+ --nk-lime-900: oklch(39.5% 0.1 131.1);
249
+ --nk-lime-950: oklch(28.4% 0.073 132);
250
+
251
+ --nk-green-50: oklch(98.1% 0.017 155.9);
252
+ --nk-green-100: oklch(96.3% 0.046 156.6);
253
+ --nk-green-200: oklch(92.6% 0.088 156.1);
254
+ --nk-green-300: oklch(86.7% 0.151 154.3);
255
+ --nk-green-400: oklch(79.8% 0.204 151.8);
256
+ --nk-green-500: oklch(72.3% 0.209 149.6);
257
+ --nk-green-600: oklch(62.7% 0.184 149.2);
258
+ --nk-green-700: oklch(52.9% 0.145 150);
259
+ --nk-green-800: oklch(45.6% 0.121 151.4);
260
+ --nk-green-900: oklch(38.3% 0.094 152.4);
261
+ --nk-green-950: oklch(27.6% 0.066 153.1);
262
+
263
+ --nk-emerald-50: oklch(97.9% 0.019 165.4);
264
+ --nk-emerald-100: oklch(95% 0.056 164.5);
265
+ --nk-emerald-200: oklch(90.6% 0.095 164);
266
+ --nk-emerald-300: oklch(84.2% 0.143 164.5);
267
+ --nk-emerald-400: oklch(76.7% 0.167 163.3);
268
+ --nk-emerald-500: oklch(69.6% 0.16 162.5);
269
+ --nk-emerald-600: oklch(59.6% 0.135 163.2);
270
+ --nk-emerald-700: oklch(50.8% 0.108 165.5);
271
+ --nk-emerald-800: oklch(44% 0.09 167);
272
+ --nk-emerald-900: oklch(36.9% 0.074 169.2);
273
+ --nk-emerald-950: oklch(27.1% 0.052 172.3);
274
+
275
+ --nk-teal-50: oklch(98.3% 0.011 180.8);
276
+ --nk-teal-100: oklch(95.5% 0.057 180.5);
277
+ --nk-teal-200: oklch(91.1% 0.097 180.6);
278
+ --nk-teal-300: oklch(85.2% 0.136 181);
279
+ --nk-teal-400: oklch(77.8% 0.142 181.9);
280
+ --nk-teal-500: oklch(70.3% 0.13 182.5);
281
+ --nk-teal-600: oklch(60.1% 0.108 184.6);
282
+ --nk-teal-700: oklch(51% 0.089 186.6);
283
+ --nk-teal-800: oklch(44.5% 0.077 187.6);
284
+ --nk-teal-900: oklch(37.6% 0.062 189);
285
+ --nk-teal-950: oklch(28.6% 0.047 192);
286
+
287
+ --nk-cyan-50: oklch(98.3% 0.017 201.2);
288
+ --nk-cyan-100: oklch(95.8% 0.045 202.8);
289
+ --nk-cyan-200: oklch(91.8% 0.083 205);
290
+ --nk-cyan-300: oklch(86.2% 0.126 207.5);
291
+ --nk-cyan-400: oklch(78.9% 0.144 211.5);
292
+ --nk-cyan-500: oklch(71.5% 0.133 215.3);
293
+ --nk-cyan-600: oklch(61% 0.116 221.6);
294
+ --nk-cyan-700: oklch(52% 0.097 223.4);
295
+ --nk-cyan-800: oklch(45.5% 0.085 224.7);
296
+ --nk-cyan-900: oklch(38.8% 0.07 227.1);
297
+ --nk-cyan-950: oklch(30.9% 0.056 229.8);
298
+
299
+ --nk-sky-50: oklch(97.8% 0.011 237.7);
300
+ --nk-sky-100: oklch(94.9% 0.026 234.2);
301
+ --nk-sky-200: oklch(90% 0.059 232.1);
302
+ --nk-sky-300: oklch(82.7% 0.108 230.2);
303
+ --nk-sky-400: oklch(75.3% 0.153 232.8);
304
+ --nk-sky-500: oklch(68.5% 0.159 237.3);
305
+ --nk-sky-600: oklch(58.8% 0.148 242);
306
+ --nk-sky-700: oklch(50.1% 0.124 242.7);
307
+ --nk-sky-800: oklch(44.5% 0.104 241.2);
308
+ --nk-sky-900: oklch(38.1% 0.089 241.3);
309
+ --nk-sky-950: oklch(30.1% 0.067 242.7);
310
+
311
+ --nk-blue-50: oklch(96.8% 0.015 255.3);
312
+ --nk-blue-100: oklch(93.6% 0.03 254.3);
313
+ --nk-blue-200: oklch(88.2% 0.059 253.8);
314
+ --nk-blue-300: oklch(80.4% 0.101 252.6);
315
+ --nk-blue-400: oklch(70.9% 0.155 254.7);
316
+ --nk-blue-500: oklch(62.1% 0.205 259.4);
317
+ --nk-blue-600: oklch(54.9% 0.244 262.8);
318
+ --nk-blue-700: oklch(48.4% 0.239 264.6);
319
+ --nk-blue-800: oklch(43.2% 0.201 265.2);
320
+ --nk-blue-900: oklch(37% 0.15 266);
321
+ --nk-blue-950: oklch(28.8% 0.087 267.6);
322
+
323
+ --nk-indigo-50: oklch(96.2% 0.018 272.3);
324
+ --nk-indigo-100: oklch(93% 0.033 272.8);
325
+ --nk-indigo-200: oklch(87% 0.063 273.7);
326
+ --nk-indigo-300: oklch(78% 0.112 275.2);
327
+ --nk-indigo-400: oklch(67.6% 0.173 276.7);
328
+ --nk-indigo-500: oklch(58.4% 0.23 277.2);
329
+ --nk-indigo-600: oklch(51.4% 0.257 277);
330
+ --nk-indigo-700: oklch(45.3% 0.241 277);
331
+ --nk-indigo-800: oklch(40.7% 0.196 277.4);
332
+ --nk-indigo-900: oklch(34.9% 0.146 278.8);
333
+ --nk-indigo-950: oklch(26.4% 0.088 281.2);
334
+
335
+ --nk-violet-50: oklch(96.8% 0.016 294);
336
+ --nk-violet-100: oklch(94.5% 0.027 293.9);
337
+ --nk-violet-200: oklch(89.2% 0.058 293.8);
338
+ --nk-violet-300: oklch(80.8% 0.106 293.4);
339
+ --nk-violet-400: oklch(70.3% 0.173 293.4);
340
+ --nk-violet-500: oklch(60.6% 0.24 292.7);
341
+ --nk-violet-600: oklch(54.2% 0.279 292.7);
342
+ --nk-violet-700: oklch(48.8% 0.269 292.7);
343
+ --nk-violet-800: oklch(43.8% 0.234 293.2);
344
+ --nk-violet-900: oklch(37.1% 0.192 292.8);
345
+ --nk-violet-950: oklch(28.8% 0.139 291.6);
346
+
347
+ --nk-purple-50: oklch(97.4% 0.014 308.2);
348
+ --nk-purple-100: oklch(95.2% 0.029 307.4);
349
+ --nk-purple-200: oklch(90.1% 0.061 306.7);
350
+ --nk-purple-300: oklch(82.1% 0.114 306.3);
351
+ --nk-purple-400: oklch(71.4% 0.193 305.5);
352
+ --nk-purple-500: oklch(62.7% 0.255 303.9);
353
+ --nk-purple-600: oklch(55.7% 0.286 302.3);
354
+ --nk-purple-700: oklch(49.6% 0.261 302.2);
355
+ --nk-purple-800: oklch(44.1% 0.22 303.7);
356
+ --nk-purple-900: oklch(37.3% 0.182 304);
357
+ --nk-purple-950: oklch(29.5% 0.145 303.3);
358
+
359
+ --nk-fuchsia-50: oklch(97.7% 0.017 319.8);
360
+ --nk-fuchsia-100: oklch(95.2% 0.035 319.4);
361
+ --nk-fuchsia-200: oklch(90.3% 0.075 319.7);
362
+ --nk-fuchsia-300: oklch(82.9% 0.143 321.2);
363
+ --nk-fuchsia-400: oklch(74.3% 0.228 322.1);
364
+ --nk-fuchsia-500: oklch(66.5% 0.291 322.3);
365
+ --nk-fuchsia-600: oklch(59.1% 0.283 322.9);
366
+ --nk-fuchsia-700: oklch(51.8% 0.243 323.8);
367
+ --nk-fuchsia-800: oklch(45.9% 0.211 324.8);
368
+ --nk-fuchsia-900: oklch(39.1% 0.171 325.5);
369
+ --nk-fuchsia-950: oklch(30.1% 0.135 325.7);
370
+
371
+ --nk-pink-50: oklch(97.1% 0.015 343.1);
372
+ --nk-pink-100: oklch(94.9% 0.027 342.4);
373
+ --nk-pink-200: oklch(89.9% 0.062 343.3);
374
+ --nk-pink-300: oklch(81.7% 0.125 346);
375
+ --nk-pink-400: oklch(72.6% 0.196 349.7);
376
+ --nk-pink-500: oklch(65.2% 0.242 354.8);
377
+ --nk-pink-600: oklch(59.2% 0.239 0.2);
378
+ --nk-pink-700: oklch(52.5% 0.213 3.9);
379
+ --nk-pink-800: oklch(46.8% 0.188 3.7);
380
+ --nk-pink-900: oklch(39.8% 0.152 3.1);
381
+ --nk-pink-950: oklch(29.3% 0.109 3.2);
382
+
383
+ --nk-rose-50: oklch(96.9% 0.015 12.9);
384
+ --nk-rose-100: oklch(94.2% 0.027 11.4);
385
+ --nk-rose-200: oklch(89% 0.058 10.9);
386
+ --nk-rose-300: oklch(80.7% 0.112 11.2);
387
+ --nk-rose-400: oklch(71.3% 0.184 13.5);
388
+ --nk-rose-500: oklch(64.5% 0.244 16.2);
389
+ --nk-rose-600: oklch(58.6% 0.243 17.6);
390
+ --nk-rose-700: oklch(51.4% 0.212 16.9);
391
+ --nk-rose-800: oklch(46.4% 0.185 13.4);
392
+ --nk-rose-900: oklch(40% 0.157 10.9);
393
+ --nk-rose-950: oklch(28.1% 0.107 11.4);
394
+
395
+ /* The tint axis shared by Badge, Alert, and Toast. Semantic families
396
+ default to the same steps as their hue families, so `info` renders
397
+ exactly like `blue`; override --nk-palette-{semantic} to retheme the
398
+ tints without moving the raw hues, and --nk-color-{semantic} to move
399
+ fills and markers. Decorative hues stay the color they name. */
400
+ --nk-palette-neutral: var(--nk-zinc-400);
401
+ --nk-palette-info: var(--nk-blue-400);
402
+ --nk-palette-success: var(--nk-green-400);
403
+ --nk-palette-warning: var(--nk-amber-400);
404
+ --nk-palette-destructive: var(--nk-red-400);
405
+
406
+ --nk-palette-red: var(--nk-red-400);
407
+ --nk-palette-orange: var(--nk-orange-400);
408
+ --nk-palette-amber: var(--nk-amber-400);
409
+ --nk-palette-yellow: var(--nk-yellow-400);
410
+ --nk-palette-lime: var(--nk-lime-400);
411
+ --nk-palette-green: var(--nk-green-400);
412
+ --nk-palette-emerald: var(--nk-emerald-400);
413
+ --nk-palette-teal: var(--nk-teal-400);
414
+ --nk-palette-cyan: var(--nk-cyan-400);
415
+ --nk-palette-sky: var(--nk-sky-400);
416
+ --nk-palette-blue: var(--nk-blue-400);
417
+ --nk-palette-indigo: var(--nk-indigo-400);
418
+ --nk-palette-violet: var(--nk-violet-400);
419
+ --nk-palette-purple: var(--nk-purple-400);
420
+ --nk-palette-fuchsia: var(--nk-fuchsia-400);
421
+ --nk-palette-pink: var(--nk-pink-400);
422
+ --nk-palette-rose: var(--nk-rose-400);
84
423
  }
85
424
 
86
425
  :where(:root, [data-theme="light"]) {
87
426
  color-scheme: light;
88
427
 
89
- --nk-color-canvas: oklch(0.993 0 0);
90
- --nk-color-surface: oklch(1 0 0);
91
- --nk-color-elevated: oklch(0.985 0 0);
92
- --nk-color-foreground: oklch(0.21 0.006 285.885);
93
- --nk-color-muted: oklch(0.967 0.001 286.375);
94
- --nk-color-muted-foreground: oklch(0.552 0.016 285.938);
95
- --nk-color-border: oklch(0.92 0.004 286.32);
96
- --nk-color-focus: oklch(0.546 0.245 262.881);
97
- --nk-color-primary: oklch(0.274 0.006 286.033);
98
- --nk-color-primary-foreground: oklch(1 0 0);
99
- --nk-color-neutral: oklch(0.552 0.016 285.938);
100
- --nk-color-neutral-content: oklch(0.37 0.013 285.805);
101
- --nk-color-info: oklch(0.546 0.245 262.881);
102
- --nk-color-info-content: oklch(0.424 0.199 265.638);
103
- --nk-color-success: oklch(0.627 0.194 149.214);
104
- --nk-color-success-content: oklch(0.393 0.095 152.535);
105
- --nk-color-warning: oklch(0.681 0.162 75.834);
106
- --nk-color-warning-content: oklch(0.421 0.095 57.708);
107
- --nk-color-danger: oklch(0.577 0.237 25.331);
108
- --nk-color-danger-foreground: oklch(1 0 0);
109
- --nk-color-danger-content: oklch(0.444 0.177 26.899);
110
- --nk-color-overlay: oklch(0 0 0 / 0.5);
428
+ --nk-color-canvas: color-mix(
429
+ in oklab,
430
+ var(--nk-zinc-50) 47%,
431
+ var(--nk-white)
432
+ );
433
+ --nk-color-surface: var(--nk-white);
434
+ --nk-color-elevated: var(--nk-zinc-50);
435
+ --nk-color-foreground: var(--nk-zinc-900);
436
+ --nk-color-muted: var(--nk-zinc-100);
437
+ --nk-color-muted-foreground: var(--nk-zinc-500);
438
+ --nk-color-border: var(--nk-zinc-200);
439
+ --nk-color-focus: var(--nk-blue-600);
440
+ --nk-color-primary: var(--nk-zinc-800);
441
+ --nk-color-primary-foreground: var(--nk-white);
442
+ --nk-color-neutral: var(--nk-zinc-500);
443
+ --nk-color-neutral-content: var(--nk-zinc-700);
444
+ --nk-color-info: var(--nk-blue-600);
445
+ --nk-color-info-content: var(--nk-blue-800);
446
+ --nk-color-success: var(--nk-green-600);
447
+ --nk-color-success-content: var(--nk-green-900);
448
+ --nk-color-warning: var(--nk-yellow-600);
449
+ --nk-color-warning-content: var(--nk-yellow-900);
450
+ --nk-color-destructive: var(--nk-red-600);
451
+ --nk-color-destructive-foreground: var(--nk-white);
452
+ --nk-color-destructive-content: var(--nk-red-800);
453
+ --nk-color-overlay: color-mix(in oklab, var(--nk-black) 50%, transparent);
454
+
455
+ --nk-palette-neutral-content: var(--nk-zinc-700);
456
+ --nk-palette-info-content: var(--nk-blue-800);
457
+ --nk-palette-success-content: var(--nk-green-800);
458
+ --nk-palette-warning-content: var(--nk-amber-800);
459
+ --nk-palette-destructive-content: var(--nk-red-700);
460
+
461
+ --nk-palette-red-content: var(--nk-red-700);
462
+ --nk-palette-orange-content: var(--nk-orange-800);
463
+ --nk-palette-amber-content: var(--nk-amber-800);
464
+ --nk-palette-yellow-content: var(--nk-yellow-800);
465
+ --nk-palette-lime-content: var(--nk-lime-800);
466
+ --nk-palette-green-content: var(--nk-green-800);
467
+ --nk-palette-emerald-content: var(--nk-emerald-800);
468
+ --nk-palette-teal-content: var(--nk-teal-800);
469
+ --nk-palette-cyan-content: var(--nk-cyan-800);
470
+ --nk-palette-sky-content: var(--nk-sky-800);
471
+ --nk-palette-blue-content: var(--nk-blue-800);
472
+ --nk-palette-indigo-content: var(--nk-indigo-700);
473
+ --nk-palette-violet-content: var(--nk-violet-700);
474
+ --nk-palette-purple-content: var(--nk-purple-700);
475
+ --nk-palette-fuchsia-content: var(--nk-fuchsia-700);
476
+ --nk-palette-pink-content: var(--nk-pink-700);
477
+ --nk-palette-rose-content: var(--nk-rose-700);
111
478
  }
112
479
 
113
480
  @media (prefers-color-scheme: dark) {
114
481
  :where(:root:not([data-theme])) {
115
482
  color-scheme: dark;
116
483
 
117
- --nk-color-canvas: oklch(0.141 0.005 285.823);
118
- --nk-color-surface: oklch(0.178 0.006 285.885);
119
- --nk-color-elevated: oklch(0.21 0.006 285.885);
120
- --nk-color-foreground: oklch(0.967 0.001 286.375);
121
- --nk-color-muted: oklch(0.274 0.006 286.033);
122
- --nk-color-muted-foreground: oklch(0.705 0.015 286.067);
123
- --nk-color-border: oklch(0.37 0.013 285.805);
124
- --nk-color-focus: oklch(0.488 0.243 264.376);
125
- --nk-color-primary: oklch(1 0 0);
126
- --nk-color-primary-foreground: oklch(0.274 0.006 286.033);
127
- --nk-color-neutral: oklch(0.705 0.015 286.067);
128
- --nk-color-neutral-content: oklch(0.92 0.004 286.32);
129
- --nk-color-info: oklch(0.623 0.214 259.815);
130
- --nk-color-info-content: oklch(0.882 0.059 254.128);
131
- --nk-color-success: oklch(0.723 0.219 149.579);
132
- --nk-color-success-content: oklch(0.925 0.084 155.995);
133
- --nk-color-warning: oklch(0.828 0.189 84.429);
134
- --nk-color-warning-content: oklch(0.945 0.129 101.54);
135
- --nk-color-danger: oklch(0.577 0.245 27.325);
136
- --nk-color-danger-foreground: oklch(0.985 0 0);
137
- --nk-color-danger-content: oklch(0.704 0.191 22.216);
138
- --nk-color-overlay: oklch(0 0 0 / 0.65);
484
+ --nk-color-canvas: var(--nk-zinc-950);
485
+ --nk-color-surface: color-mix(
486
+ in oklab,
487
+ var(--nk-zinc-950) 45%,
488
+ var(--nk-zinc-900)
489
+ );
490
+ --nk-color-elevated: var(--nk-zinc-900);
491
+ --nk-color-foreground: var(--nk-zinc-100);
492
+ --nk-color-muted: var(--nk-zinc-800);
493
+ --nk-color-muted-foreground: var(--nk-zinc-400);
494
+ --nk-color-border: var(--nk-zinc-800);
495
+ --nk-color-focus: var(--nk-blue-700);
496
+ --nk-color-primary: var(--nk-white);
497
+ --nk-color-primary-foreground: var(--nk-zinc-800);
498
+ --nk-color-neutral: var(--nk-zinc-400);
499
+ --nk-color-neutral-content: var(--nk-zinc-200);
500
+ --nk-color-info: var(--nk-blue-500);
501
+ --nk-color-info-content: var(--nk-blue-200);
502
+ --nk-color-success: var(--nk-green-500);
503
+ --nk-color-success-content: var(--nk-green-200);
504
+ --nk-color-warning: var(--nk-amber-400);
505
+ --nk-color-warning-content: var(--nk-yellow-200);
506
+ --nk-color-destructive: var(--nk-red-600);
507
+ --nk-color-destructive-foreground: var(--nk-zinc-50);
508
+ --nk-color-destructive-content: var(--nk-red-400);
509
+ --nk-color-overlay: color-mix(in oklab, var(--nk-black) 65%, transparent);
510
+
511
+ --nk-palette-neutral-content: var(--nk-zinc-200);
512
+ --nk-palette-info-content: var(--nk-blue-200);
513
+ --nk-palette-success-content: var(--nk-green-200);
514
+ --nk-palette-warning-content: var(--nk-amber-200);
515
+ --nk-palette-destructive-content: var(--nk-red-200);
516
+
517
+ --nk-palette-red-content: var(--nk-red-200);
518
+ --nk-palette-orange-content: var(--nk-orange-200);
519
+ --nk-palette-amber-content: var(--nk-amber-200);
520
+ --nk-palette-yellow-content: var(--nk-yellow-200);
521
+ --nk-palette-lime-content: var(--nk-lime-200);
522
+ --nk-palette-green-content: var(--nk-green-200);
523
+ --nk-palette-emerald-content: var(--nk-emerald-200);
524
+ --nk-palette-teal-content: var(--nk-teal-200);
525
+ --nk-palette-cyan-content: var(--nk-cyan-200);
526
+ --nk-palette-sky-content: var(--nk-sky-200);
527
+ --nk-palette-blue-content: var(--nk-blue-200);
528
+ --nk-palette-indigo-content: var(--nk-indigo-200);
529
+ --nk-palette-violet-content: var(--nk-violet-200);
530
+ --nk-palette-purple-content: var(--nk-purple-200);
531
+ --nk-palette-fuchsia-content: var(--nk-fuchsia-200);
532
+ --nk-palette-pink-content: var(--nk-pink-200);
533
+ --nk-palette-rose-content: var(--nk-rose-200);
139
534
  }
140
535
  }
141
536
 
142
537
  :where([data-theme="dark"]) {
143
538
  color-scheme: dark;
144
539
 
145
- --nk-color-canvas: oklch(0.141 0.005 285.823);
146
- --nk-color-surface: oklch(0.178 0.006 285.885);
147
- --nk-color-elevated: oklch(0.21 0.006 285.885);
148
- --nk-color-foreground: oklch(0.967 0.001 286.375);
149
- --nk-color-muted: oklch(0.274 0.006 286.033);
150
- --nk-color-muted-foreground: oklch(0.705 0.015 286.067);
151
- --nk-color-border: oklch(0.37 0.013 285.805);
152
- --nk-color-focus: oklch(0.488 0.243 264.376);
153
- --nk-color-primary: oklch(1 0 0);
154
- --nk-color-primary-foreground: oklch(0.274 0.006 286.033);
155
- --nk-color-neutral: oklch(0.705 0.015 286.067);
156
- --nk-color-neutral-content: oklch(0.92 0.004 286.32);
157
- --nk-color-info: oklch(0.623 0.214 259.815);
158
- --nk-color-info-content: oklch(0.882 0.059 254.128);
159
- --nk-color-success: oklch(0.723 0.219 149.579);
160
- --nk-color-success-content: oklch(0.925 0.084 155.995);
161
- --nk-color-warning: oklch(0.828 0.189 84.429);
162
- --nk-color-warning-content: oklch(0.945 0.129 101.54);
163
- --nk-color-danger: oklch(0.577 0.245 27.325);
164
- --nk-color-danger-foreground: oklch(0.985 0 0);
165
- --nk-color-danger-content: oklch(0.704 0.191 22.216);
166
- --nk-color-overlay: oklch(0 0 0 / 0.65);
540
+ --nk-color-canvas: var(--nk-zinc-950);
541
+ --nk-color-surface: color-mix(
542
+ in oklab,
543
+ var(--nk-zinc-950) 45%,
544
+ var(--nk-zinc-900)
545
+ );
546
+ --nk-color-elevated: var(--nk-zinc-900);
547
+ --nk-color-foreground: var(--nk-zinc-100);
548
+ --nk-color-muted: var(--nk-zinc-800);
549
+ --nk-color-muted-foreground: var(--nk-zinc-400);
550
+ --nk-color-border: var(--nk-zinc-800);
551
+ --nk-color-focus: var(--nk-blue-700);
552
+ --nk-color-primary: var(--nk-white);
553
+ --nk-color-primary-foreground: var(--nk-zinc-800);
554
+ --nk-color-neutral: var(--nk-zinc-400);
555
+ --nk-color-neutral-content: var(--nk-zinc-200);
556
+ --nk-color-info: var(--nk-blue-500);
557
+ --nk-color-info-content: var(--nk-blue-200);
558
+ --nk-color-success: var(--nk-green-500);
559
+ --nk-color-success-content: var(--nk-green-200);
560
+ --nk-color-warning: var(--nk-amber-400);
561
+ --nk-color-warning-content: var(--nk-yellow-200);
562
+ --nk-color-destructive: var(--nk-red-600);
563
+ --nk-color-destructive-foreground: var(--nk-zinc-50);
564
+ --nk-color-destructive-content: var(--nk-red-400);
565
+ --nk-color-overlay: color-mix(in oklab, var(--nk-black) 65%, transparent);
566
+
567
+ --nk-palette-neutral-content: var(--nk-zinc-200);
568
+ --nk-palette-info-content: var(--nk-blue-200);
569
+ --nk-palette-success-content: var(--nk-green-200);
570
+ --nk-palette-warning-content: var(--nk-amber-200);
571
+ --nk-palette-destructive-content: var(--nk-red-200);
572
+
573
+ --nk-palette-red-content: var(--nk-red-200);
574
+ --nk-palette-orange-content: var(--nk-orange-200);
575
+ --nk-palette-amber-content: var(--nk-amber-200);
576
+ --nk-palette-yellow-content: var(--nk-yellow-200);
577
+ --nk-palette-lime-content: var(--nk-lime-200);
578
+ --nk-palette-green-content: var(--nk-green-200);
579
+ --nk-palette-emerald-content: var(--nk-emerald-200);
580
+ --nk-palette-teal-content: var(--nk-teal-200);
581
+ --nk-palette-cyan-content: var(--nk-cyan-200);
582
+ --nk-palette-sky-content: var(--nk-sky-200);
583
+ --nk-palette-blue-content: var(--nk-blue-200);
584
+ --nk-palette-indigo-content: var(--nk-indigo-200);
585
+ --nk-palette-violet-content: var(--nk-violet-200);
586
+ --nk-palette-purple-content: var(--nk-purple-200);
587
+ --nk-palette-fuchsia-content: var(--nk-fuchsia-200);
588
+ --nk-palette-pink-content: var(--nk-pink-200);
589
+ --nk-palette-rose-content: var(--nk-rose-200);
167
590
  }
168
591
 
169
592
  :where(:root, [data-theme]) {
@@ -198,7 +621,7 @@
198
621
  var(--nk-color-primary),
199
622
  transparent 10%
200
623
  );
201
- --nk-color-danger-hover: light-dark(
624
+ --nk-color-destructive-hover: light-dark(
202
625
  oklch(0.54 0.237 25.331),
203
626
  oklch(0.59 0.237 25.331)
204
627
  );
@@ -233,7 +656,7 @@
233
656
  /* Nitro-owned boxes never establish a min-content floor, so long slot
234
657
  content shrinks instead of overflowing its flex or grid parent. */
235
658
  :where([data-nk], [data-nk] [data-slot]) {
236
- min-width: 0;
659
+ min-inline-size: 0;
237
660
  }
238
661
 
239
662
  :where(html, :host) {
@@ -333,7 +756,7 @@
333
756
  }
334
757
 
335
758
  :where(input)::-webkit-date-and-time-value {
336
- min-height: 1lh;
759
+ min-block-size: 1lh;
337
760
  text-align: inherit;
338
761
  }
339
762
 
@@ -348,7 +771,7 @@
348
771
 
349
772
  :where(input)::-webkit-inner-spin-button,
350
773
  :where(input)::-webkit-outer-spin-button {
351
- height: auto;
774
+ block-size: auto;
352
775
  }
353
776
 
354
777
  :where(input):-moz-ui-invalid {
@@ -378,12 +801,12 @@
378
801
  }
379
802
 
380
803
  :where(img, video) {
381
- max-width: 100%;
382
- height: auto;
804
+ max-inline-size: 100%;
805
+ block-size: auto;
383
806
  }
384
807
 
385
808
  :where(hr) {
386
- height: 0;
809
+ block-size: 0;
387
810
  color: inherit;
388
811
  border-top-width: var(--nk-border-width);
389
812
  }
@@ -426,8 +849,8 @@
426
849
  > [data-slot="accordion-trigger"]
427
850
  ) {
428
851
  display: flex;
429
- width: 100%;
430
- min-height: 2.75rem;
852
+ inline-size: 100%;
853
+ min-block-size: var(--nk-control-height-lg);
431
854
  align-items: center;
432
855
  justify-content: space-between;
433
856
  gap: calc(var(--nk-space) * 3);
@@ -466,8 +889,8 @@
466
889
  > [data-slot="accordion-icon"]
467
890
  ) {
468
891
  flex: none;
469
- width: 1rem;
470
- height: 1rem;
892
+ inline-size: var(--nk-icon-size-sm);
893
+ block-size: var(--nk-icon-size-sm);
471
894
  color: var(--nk-color-muted-foreground);
472
895
  transition:
473
896
  color var(--nk-duration-fast) var(--nk-ease),
@@ -532,7 +955,6 @@
532
955
  --_nk-alert-background: var(--nk-color-surface);
533
956
  --_nk-alert-border: var(--nk-color-border);
534
957
  --_nk-alert-foreground: var(--nk-color-foreground);
535
- --_nk-alert-tint-strength: 12%;
536
958
 
537
959
  position: relative;
538
960
  display: grid;
@@ -549,8 +971,8 @@
549
971
  }
550
972
 
551
973
  :where([data-nk="alert"] > [data-slot="alert-title"]) {
552
- font-size: var(--nk-text-base);
553
- font-weight: var(--nk-font-weight-semibold);
974
+ font-size: var(--nk-title-compact-size);
975
+ font-weight: var(--nk-title-compact-weight);
554
976
  line-height: var(--nk-leading-tight);
555
977
  text-wrap: balance;
556
978
  }
@@ -559,11 +981,20 @@
559
981
  grid-template-columns: auto minmax(0, 1fr);
560
982
  }
561
983
 
984
+ /* Centered on the title first line, whatever size the title role
985
+ resolves to, instead of a hand-tuned nudge for one size. */
562
986
  :where([data-nk="alert"] > [data-slot="alert-icon"]) {
987
+ --_nk-alert-icon-size: var(--nk-icon-size-md);
988
+
563
989
  grid-row: 1 / -1;
564
- inline-size: 1.25rem;
565
- block-size: 1.25rem;
566
- margin-block-start: 0.0625rem;
990
+ inline-size: var(--_nk-alert-icon-size);
991
+ block-size: var(--_nk-alert-icon-size);
992
+ margin-block-start: calc(
993
+ (
994
+ var(--nk-title-compact-size) * var(--nk-leading-tight) -
995
+ var(--_nk-alert-icon-size)
996
+ ) / 2
997
+ );
567
998
  }
568
999
 
569
1000
  :where(
@@ -583,30 +1014,13 @@
583
1014
  }
584
1015
 
585
1016
  @layer nitro-kit.variant {
1017
+ /* Colour, tint strength, and appearance switching all come from the shared
1018
+ semantic palette, so an Alert and a Toast of the same variant render
1019
+ identically. */
586
1020
  :where([data-nk="alert"][data-variant]) {
587
- --_nk-alert-background: color-mix(
588
- in oklab,
589
- var(--_nk-palette-tint) var(--_nk-alert-tint-strength),
590
- transparent
591
- );
592
- --_nk-alert-border: color-mix(
593
- in oklab,
594
- var(--_nk-palette-tint) 45%,
595
- transparent
596
- );
597
- --_nk-alert-foreground: var(--_nk-palette-light);
598
- }
599
-
600
- :where([data-theme="dark"] [data-nk="alert"][data-variant]) {
601
- --_nk-alert-foreground: var(--_nk-palette-dark);
602
- --_nk-alert-tint-strength: 20%;
603
- }
604
-
605
- @media (prefers-color-scheme: dark) {
606
- :where(:root:not([data-theme]) [data-nk="alert"][data-variant]) {
607
- --_nk-alert-foreground: var(--_nk-palette-dark);
608
- --_nk-alert-tint-strength: 20%;
609
- }
1021
+ --_nk-alert-background: var(--_nk-semantic-surface);
1022
+ --_nk-alert-border: var(--_nk-semantic-border);
1023
+ --_nk-alert-foreground: var(--_nk-semantic-content);
610
1024
  }
611
1025
  }
612
1026
 
@@ -678,6 +1092,58 @@
678
1092
  line-height: var(--nk-leading-tight);
679
1093
  }
680
1094
 
1095
+ /* A collapsible label is a row like the items around it: same height,
1096
+ same inline padding, symmetric block margins, and the same hover
1097
+ treatment, so the disclosure target is as easy to hit as a destination. */
1098
+ :where(
1099
+ [data-nk="app-navigation"]
1100
+ summary[data-slot="app-navigation-section-label"]
1101
+ ) {
1102
+ display: flex;
1103
+ gap: var(--nk-space);
1104
+ align-items: center;
1105
+ min-block-size: var(--nk-control-height-md);
1106
+ margin: var(--nk-space) 0;
1107
+ padding: calc(var(--nk-space) * 2) calc(var(--nk-space) * 3);
1108
+ list-style: none;
1109
+ user-select: none;
1110
+ cursor: pointer;
1111
+ border-radius: var(--nk-radius-lg);
1112
+ transition:
1113
+ color var(--nk-duration-normal) var(--nk-ease),
1114
+ background-color var(--nk-duration-normal) var(--nk-ease);
1115
+ }
1116
+
1117
+ :where(
1118
+ [data-nk="app-navigation"]
1119
+ summary[data-slot="app-navigation-section-label"]::-webkit-details-marker
1120
+ ) {
1121
+ display: none;
1122
+ }
1123
+
1124
+ :where([data-nk="app-navigation"] [data-slot="app-navigation-section-icon"]) {
1125
+ flex: none;
1126
+ inline-size: var(--nk-icon-size-xs);
1127
+ block-size: var(--nk-icon-size-xs);
1128
+ transition: transform var(--nk-duration-fast) var(--nk-ease);
1129
+ }
1130
+
1131
+ :where(
1132
+ [data-nk="app-navigation"]
1133
+ [data-slot="app-navigation-section-disclosure"]:not([open])
1134
+ [data-slot="app-navigation-section-icon"]
1135
+ ) {
1136
+ transform: rotate(-90deg);
1137
+ }
1138
+
1139
+ @media (prefers-reduced-motion: reduce) {
1140
+ :where(
1141
+ [data-nk="app-navigation"] [data-slot="app-navigation-section-icon"]
1142
+ ) {
1143
+ transition-duration: 0.01ms;
1144
+ }
1145
+ }
1146
+
681
1147
  :where([data-nk="app-navigation"] [data-slot="app-navigation-item"]) {
682
1148
  flex: 0 0 auto;
683
1149
  min-inline-size: 0;
@@ -693,7 +1159,7 @@
693
1159
  font-weight: var(--nk-font-weight-medium);
694
1160
  line-height: var(--nk-leading-tight);
695
1161
  text-decoration: none;
696
- border-radius: var(--nk-radius-md);
1162
+ border-radius: var(--nk-radius-lg);
697
1163
  transition:
698
1164
  color var(--nk-duration-normal) var(--nk-ease),
699
1165
  background-color var(--nk-duration-normal) var(--nk-ease);
@@ -709,6 +1175,7 @@
709
1175
 
710
1176
  :where(
711
1177
  [data-nk="app-navigation"] [data-slot="app-navigation-item-icon"],
1178
+ [data-nk="app-navigation"] [data-slot="app-navigation-item-icon-end"],
712
1179
  [data-nk="app-navigation"] [data-slot="app-navigation-item-badge"]
713
1180
  ) {
714
1181
  flex: 0 0 auto;
@@ -746,13 +1213,32 @@
746
1213
 
747
1214
  @media (hover: hover) {
748
1215
  :where(
749
- [data-nk="app-navigation"] [data-slot="app-navigation-item-link"]:hover
1216
+ [data-nk="app-navigation"] [data-slot="app-navigation-item-link"]:hover,
1217
+ [data-nk="app-navigation"]
1218
+ summary[data-slot="app-navigation-section-label"]:hover
750
1219
  ) {
751
1220
  color: var(--nk-app-shell-sidebar-accent-foreground);
752
1221
  background: var(--nk-app-shell-sidebar-accent);
753
1222
  }
754
1223
  }
755
1224
 
1225
+ :where(
1226
+ [data-nk="app-navigation"]
1227
+ summary[data-slot="app-navigation-section-label"]:focus-visible
1228
+ ) {
1229
+ outline: var(--nk-focus-width) solid var(--nk-color-focus);
1230
+ outline-offset: calc(var(--nk-focus-offset) * -1);
1231
+ }
1232
+
1233
+ @media (prefers-reduced-motion: reduce) {
1234
+ :where(
1235
+ [data-nk="app-navigation"]
1236
+ summary[data-slot="app-navigation-section-label"]
1237
+ ) {
1238
+ transition-duration: 0.01ms;
1239
+ }
1240
+ }
1241
+
756
1242
  :where(
757
1243
  [data-nk="app-navigation"]
758
1244
  [data-slot="app-navigation-item-link"]:focus-visible
@@ -795,7 +1281,7 @@
795
1281
  color: var(--nk-color-primary-foreground);
796
1282
  text-decoration: none;
797
1283
  background: var(--nk-color-primary);
798
- border-radius: var(--nk-radius-md);
1284
+ border-radius: var(--nk-radius-lg);
799
1285
  outline: var(--nk-focus-width) solid var(--nk-color-focus);
800
1286
  transform: translateY(calc(-100% - (var(--nk-space) * 4)));
801
1287
  transition: transform var(--nk-duration-fast) var(--nk-ease);
@@ -850,7 +1336,7 @@
850
1336
  cursor: pointer;
851
1337
  background: transparent;
852
1338
  border: 0;
853
- border-radius: var(--nk-radius-md);
1339
+ border-radius: var(--nk-radius-lg);
854
1340
  transition:
855
1341
  background-color var(--nk-duration-fast) var(--nk-ease),
856
1342
  scale var(--nk-duration-fast) var(--nk-ease);
@@ -1313,7 +1799,7 @@
1313
1799
  flex-direction: column;
1314
1800
  inline-size: min(
1315
1801
  var(--nk-app-shell-sidebar-width),
1316
- calc(100vw - (var(--nk-space) * 12))
1802
+ calc(100% - (var(--nk-space) * 12))
1317
1803
  );
1318
1804
  max-inline-size: 100%;
1319
1805
  block-size: 100vh;
@@ -1391,16 +1877,24 @@
1391
1877
  [data-nk="appearance-picker"] > [data-slot="appearance-picker-legend"]
1392
1878
  ) {
1393
1879
  padding: 0;
1394
- font-size: var(--nk-text-sm);
1395
- font-weight: var(--nk-font-weight-semibold);
1880
+ font-size: var(--nk-title-compact-size);
1881
+ font-weight: var(--nk-title-compact-weight);
1396
1882
  }
1397
1883
 
1884
+ /* The gap below the label exists only when there is a label. */
1398
1885
  :where(
1399
1886
  [data-nk="appearance-picker"] > [data-slot="appearance-picker-options"]
1400
1887
  ) {
1401
1888
  display: flex;
1402
1889
  flex-wrap: wrap;
1403
1890
  gap: calc(var(--nk-space) * 3);
1891
+ }
1892
+
1893
+ :where(
1894
+ [data-nk="appearance-picker"]
1895
+ > [data-slot="appearance-picker-legend"]
1896
+ + [data-slot="appearance-picker-options"]
1897
+ ) {
1404
1898
  margin-block-start: calc(var(--nk-space) * 2);
1405
1899
  }
1406
1900
 
@@ -1411,15 +1905,17 @@
1411
1905
  display: grid;
1412
1906
  }
1413
1907
 
1908
+ /* Like every other control, the segmented row fills its container and the
1909
+ parent owns the available width; the segments share it equally. */
1414
1910
  :where(
1415
1911
  [data-nk="appearance-picker"][data-presentation="segmented"]
1416
1912
  > [data-slot="appearance-picker-options"]
1417
1913
  ) {
1418
- display: inline-flex;
1914
+ display: flex;
1419
1915
  gap: 0;
1420
1916
  padding: var(--nk-space);
1421
1917
  background: var(--nk-color-muted);
1422
- border-radius: var(--nk-radius-md);
1918
+ border-radius: var(--nk-radius-lg);
1423
1919
  }
1424
1920
 
1425
1921
  :where([data-nk="appearance-picker"] [data-slot="appearance-picker-option"]) {
@@ -1434,8 +1930,8 @@
1434
1930
  :where(
1435
1931
  [data-nk="appearance-picker"] [data-slot="appearance-picker-control"]
1436
1932
  ) {
1437
- inline-size: 1.125rem;
1438
- block-size: 1.125rem;
1933
+ inline-size: var(--nk-choice-size-md);
1934
+ block-size: var(--nk-choice-size-md);
1439
1935
  margin: 0;
1440
1936
  accent-color: var(--nk-color-primary);
1441
1937
  cursor: pointer;
@@ -1446,8 +1942,10 @@
1446
1942
  [data-slot="appearance-picker-option"]
1447
1943
  ) {
1448
1944
  position: relative;
1945
+ flex: 1 1 0;
1946
+ justify-content: center;
1449
1947
  padding-inline: calc(var(--nk-space) * 3);
1450
- border-radius: calc(var(--nk-radius-md) - var(--nk-space));
1948
+ border-radius: calc(var(--nk-radius-lg) - var(--nk-space));
1451
1949
  }
1452
1950
 
1453
1951
  :where(
@@ -1471,7 +1969,7 @@
1471
1969
  font: inherit;
1472
1970
  background: var(--nk-color-surface);
1473
1971
  border: var(--nk-border-width) solid var(--nk-color-border);
1474
- border-radius: var(--nk-radius-md);
1972
+ border-radius: var(--nk-radius-lg);
1475
1973
  }
1476
1974
  }
1477
1975
 
@@ -1510,8 +2008,8 @@
1510
2008
  /* Source: src/stylesheets/nitro_kit/components/auth_shell.css */
1511
2009
  @layer nitro-kit.base {
1512
2010
  :where([data-nk="auth-shell"]) {
1513
- width: 100%;
1514
- min-width: 0;
2011
+ inline-size: 100%;
2012
+ min-inline-size: 0;
1515
2013
  padding-block: calc(var(--nk-space) * 8);
1516
2014
  padding-inline: calc(var(--nk-space) * 4);
1517
2015
  }
@@ -1521,11 +2019,15 @@
1521
2019
  @layer nitro-kit.base {
1522
2020
  :where([data-nk="avatar"]) {
1523
2021
  position: relative;
2022
+ /* The ring below carries a z-index, so without a stacking context it
2023
+ would paint above overlapping siblings — in a stack, every ring showed
2024
+ through the avatar covering it. Isolation keeps each avatar atomic. */
2025
+ isolation: isolate;
1524
2026
  display: inline-grid;
1525
2027
  flex: none;
1526
2028
  place-items: center;
1527
- width: var(--_nk-avatar-size);
1528
- height: var(--_nk-avatar-size);
2029
+ inline-size: var(--_nk-avatar-size);
2030
+ block-size: var(--_nk-avatar-size);
1529
2031
  overflow: hidden;
1530
2032
  font-size: var(--_nk-avatar-font-size);
1531
2033
  font-weight: var(--nk-font-weight-medium);
@@ -1552,8 +2054,8 @@
1552
2054
  [data-nk="avatar"] > [data-slot="avatar-image"]
1553
2055
  ) {
1554
2056
  grid-area: 1 / 1;
1555
- width: 100%;
1556
- height: 100%;
2057
+ inline-size: 100%;
2058
+ block-size: 100%;
1557
2059
  border-radius: inherit;
1558
2060
  }
1559
2061
 
@@ -1580,22 +2082,22 @@
1580
2082
 
1581
2083
  @layer nitro-kit.size {
1582
2084
  :where([data-nk="avatar"][data-size="xs"]) {
1583
- --_nk-avatar-size: 1.5rem;
2085
+ --_nk-avatar-size: var(--nk-avatar-size-xs);
1584
2086
  --_nk-avatar-font-size: calc(var(--nk-text-xs) * 0.875);
1585
2087
  }
1586
2088
 
1587
2089
  :where([data-nk="avatar"][data-size="sm"]) {
1588
- --_nk-avatar-size: 2rem;
2090
+ --_nk-avatar-size: var(--nk-avatar-size-sm);
1589
2091
  --_nk-avatar-font-size: var(--nk-text-xs);
1590
2092
  }
1591
2093
 
1592
2094
  :where([data-nk="avatar"][data-size="md"]) {
1593
- --_nk-avatar-size: 3rem;
2095
+ --_nk-avatar-size: var(--nk-avatar-size-md);
1594
2096
  --_nk-avatar-font-size: var(--nk-text-sm);
1595
2097
  }
1596
2098
 
1597
2099
  :where([data-nk="avatar"][data-size="lg"]) {
1598
- --_nk-avatar-size: 4rem;
2100
+ --_nk-avatar-size: var(--nk-avatar-size-lg);
1599
2101
  --_nk-avatar-font-size: var(--nk-text-lg);
1600
2102
  }
1601
2103
  }
@@ -1648,9 +2150,9 @@
1648
2150
  margin-inline-start: 0;
1649
2151
  }
1650
2152
 
2153
+ /* The chip is one of the heads: same fill as the avatar fallbacks and the
2154
+ same hairline ring, drawn as a real border since nothing overlaps it. */
1651
2155
  :where([data-nk="avatar-stack"] > [data-slot="avatar-stack-overflow"]) {
1652
- --_nk-avatar-stack-fill: var(--nk-color-elevated);
1653
-
1654
2156
  /* Preceding avatars are positioned, so the overflow chip must be too or
1655
2157
  their paint order covers its leading "+". */
1656
2158
  position: relative;
@@ -1659,6 +2161,8 @@
1659
2161
  font-weight: var(--nk-font-weight-semibold);
1660
2162
  line-height: 1;
1661
2163
  color: var(--nk-color-muted-foreground);
2164
+ border: var(--nk-border-width) solid
2165
+ color-mix(in oklab, var(--nk-color-foreground) 10%, transparent);
1662
2166
  border-radius: var(--nk-radius-full);
1663
2167
  }
1664
2168
 
@@ -1666,8 +2170,8 @@
1666
2170
  [data-nk="avatar-stack"][data-size="xs"]
1667
2171
  > [data-slot="avatar-stack-overflow"]
1668
2172
  ) {
1669
- width: 1.5rem;
1670
- height: 1.5rem;
2173
+ inline-size: var(--nk-avatar-size-xs);
2174
+ block-size: var(--nk-avatar-size-xs);
1671
2175
  font-size: calc(var(--nk-text-xs) * 0.875);
1672
2176
  }
1673
2177
 
@@ -1675,8 +2179,8 @@
1675
2179
  [data-nk="avatar-stack"][data-size="sm"]
1676
2180
  > [data-slot="avatar-stack-overflow"]
1677
2181
  ) {
1678
- width: 2rem;
1679
- height: 2rem;
2182
+ inline-size: var(--nk-avatar-size-sm);
2183
+ block-size: var(--nk-avatar-size-sm);
1680
2184
  font-size: var(--nk-text-xs);
1681
2185
  }
1682
2186
 
@@ -1684,8 +2188,8 @@
1684
2188
  [data-nk="avatar-stack"][data-size="md"]
1685
2189
  > [data-slot="avatar-stack-overflow"]
1686
2190
  ) {
1687
- width: 3rem;
1688
- height: 3rem;
2191
+ inline-size: var(--nk-avatar-size-md);
2192
+ block-size: var(--nk-avatar-size-md);
1689
2193
  font-size: var(--nk-text-sm);
1690
2194
  }
1691
2195
 
@@ -1693,8 +2197,8 @@
1693
2197
  [data-nk="avatar-stack"][data-size="lg"]
1694
2198
  > [data-slot="avatar-stack-overflow"]
1695
2199
  ) {
1696
- width: 4rem;
1697
- height: 4rem;
2200
+ inline-size: var(--nk-avatar-size-lg);
2201
+ block-size: var(--nk-avatar-size-lg);
1698
2202
  font-size: var(--nk-text-base);
1699
2203
  }
1700
2204
  }
@@ -1702,20 +2206,19 @@
1702
2206
  /* Source: src/stylesheets/nitro_kit/components/badge.css */
1703
2207
  @layer nitro-kit.base {
1704
2208
  :where([data-nk="badge"]) {
1705
- --_nk-badge-color: var(--_nk-palette-light);
1706
2209
  --_nk-badge-tint-strength: 20%;
1707
2210
 
1708
2211
  display: inline-flex;
1709
2212
  align-items: center;
1710
- max-width: 100%;
2213
+ max-inline-size: 100%;
1711
2214
  font-weight: var(--nk-font-weight-medium);
1712
2215
  line-height: var(--nk-leading-tight);
1713
- color: var(--_nk-badge-color);
2216
+ color: var(--_nk-semantic-content);
1714
2217
  white-space: nowrap;
1715
2218
  vertical-align: middle;
1716
2219
  background-color: color-mix(
1717
2220
  in oklab,
1718
- var(--_nk-palette-tint) var(--_nk-badge-tint-strength),
2221
+ var(--_nk-semantic-accent) var(--_nk-badge-tint-strength),
1719
2222
  transparent
1720
2223
  );
1721
2224
  border: var(--nk-border-width) solid transparent;
@@ -1723,7 +2226,7 @@
1723
2226
  }
1724
2227
 
1725
2228
  :where([data-nk="badge"] > [data-slot="badge-label"]) {
1726
- min-width: 0;
2229
+ min-inline-size: 0;
1727
2230
  overflow: hidden;
1728
2231
  white-space: nowrap;
1729
2232
  text-overflow: ellipsis;
@@ -1733,17 +2236,22 @@
1733
2236
  @layer nitro-kit.variant {
1734
2237
  :where([data-nk="badge"][data-variant="outline"]) {
1735
2238
  background-color: transparent;
1736
- border-color: color-mix(in oklab, var(--_nk-palette-tint) 50%, transparent);
2239
+ border-color: color-mix(
2240
+ in oklab,
2241
+ var(--_nk-semantic-accent) 50%,
2242
+ transparent
2243
+ );
1737
2244
  }
1738
2245
 
2246
+ /* Only the tint strength changes with appearance. The colours themselves come
2247
+ from the `--nk-palette-*` roles, whose `-content` half already resolves per
2248
+ appearance. */
1739
2249
  :where([data-theme="dark"] [data-nk="badge"]) {
1740
- --_nk-badge-color: var(--_nk-palette-dark);
1741
2250
  --_nk-badge-tint-strength: 40%;
1742
2251
  }
1743
2252
 
1744
2253
  @media (prefers-color-scheme: dark) {
1745
2254
  :where(:root:not([data-theme]) [data-nk="badge"]) {
1746
- --_nk-badge-color: var(--_nk-palette-dark);
1747
2255
  --_nk-badge-tint-strength: 40%;
1748
2256
  }
1749
2257
  }
@@ -1762,7 +2270,7 @@
1762
2270
 
1763
2271
  @layer nitro-kit.size {
1764
2272
  :where([data-nk="badge"][data-size="xs"]) {
1765
- padding: 0 calc(var(--nk-space) * 1.25);
2273
+ padding: 0 var(--nk-space);
1766
2274
  font-size: var(--nk-text-xs);
1767
2275
  }
1768
2276
 
@@ -1781,11 +2289,11 @@
1781
2289
  @layer nitro-kit.base {
1782
2290
  :where([data-nk="button"]) {
1783
2291
  --_nk-button-height: var(--nk-control-height-md);
1784
- --_nk-button-padding: calc(var(--nk-space) * 4);
2292
+ --_nk-button-padding: var(--nk-control-padding-inline);
1785
2293
  --_nk-button-icon-padding: calc(var(--nk-space) * 3);
1786
2294
  --_nk-button-radius: var(--nk-button-radius, var(--nk-radius-lg));
1787
2295
  --_nk-button-font-size: var(--nk-text-sm);
1788
- --_nk-button-line-height: 1.25rem;
2296
+ --_nk-button-line-height: var(--nk-leading-normal);
1789
2297
  --_nk-button-background: var(--nk-button-default-background);
1790
2298
  --_nk-button-hover-background: var(--nk-button-default-hover-background);
1791
2299
  --_nk-button-foreground: var(--nk-button-default-foreground);
@@ -1799,7 +2307,7 @@
1799
2307
  ),
1800
2308
  var(--nk-button-default-border)
1801
2309
  );
1802
- --_nk-button-shadow: 0 1px 2px 0 oklch(0 0 0 / 0.05);
2310
+ --_nk-button-shadow: var(--nk-shadow-xs);
1803
2311
 
1804
2312
  position: relative;
1805
2313
  display: inline-flex;
@@ -1884,6 +2392,21 @@
1884
2392
  inline-size: var(--_nk-button-height);
1885
2393
  padding-inline: 0;
1886
2394
  }
2395
+
2396
+ /* Touch guidance wants a 44px minimum target. The rendered button keeps
2397
+ its size; an invisible extension expands the tappable area to the large
2398
+ control step on coarse pointers. */
2399
+ @media (pointer: coarse) {
2400
+ :where([data-nk="button"])::after {
2401
+ position: absolute;
2402
+ inset-block-start: 50%;
2403
+ inset-inline-start: 50%;
2404
+ inline-size: max(100%, var(--nk-control-height-lg));
2405
+ block-size: max(100%, var(--nk-control-height-lg));
2406
+ content: "";
2407
+ translate: -50% -50%;
2408
+ }
2409
+ }
1887
2410
  }
1888
2411
 
1889
2412
  @layer nitro-kit.variant {
@@ -1891,27 +2414,31 @@
1891
2414
  --_nk-button-background: var(--nk-color-primary);
1892
2415
  --_nk-button-hover-background: var(--nk-color-primary-hover);
1893
2416
  --_nk-button-foreground: var(--nk-color-primary-foreground);
1894
- --_nk-button-border: light-dark(oklch(0 0 0 / 0.1), transparent);
2417
+ --_nk-button-border: light-dark(
2418
+ color-mix(in oklab, var(--nk-black) 10%, transparent),
2419
+ transparent
2420
+ );
1895
2421
  --_nk-button-border-bottom: var(--_nk-button-border);
1896
- --_nk-button-shadow: inset 0 1px oklch(1 0 0 / 0.2);
2422
+ --_nk-button-shadow: inset 0 1px
2423
+ color-mix(in oklab, var(--nk-white) 20%, transparent);
1897
2424
  }
1898
2425
 
1899
2426
  :where([data-nk="button"][data-variant="destructive"]) {
1900
- --_nk-button-background: var(--nk-color-danger);
1901
- --_nk-button-hover-background: var(--nk-color-danger-hover);
1902
- --_nk-button-foreground: var(--nk-color-danger-foreground);
2427
+ --_nk-button-background: var(--nk-color-destructive);
2428
+ --_nk-button-hover-background: var(--nk-color-destructive-hover);
2429
+ --_nk-button-foreground: var(--nk-color-destructive-foreground);
1903
2430
  --_nk-button-border-width: 0;
1904
2431
  --_nk-button-border: transparent;
1905
2432
  --_nk-button-border-bottom: transparent;
1906
- --_nk-button-shadow: inset 0 1px var(--nk-color-danger),
1907
- inset 0 2px oklch(1 0 0 / 0.15);
2433
+ --_nk-button-shadow: inset 0 1px var(--nk-color-destructive),
2434
+ inset 0 2px color-mix(in oklab, var(--nk-white) 15%, transparent);
1908
2435
  }
1909
2436
 
1910
2437
  :where([data-nk="button"][data-variant="ghost"]) {
1911
2438
  --_nk-button-background: transparent;
1912
2439
  --_nk-button-hover-background: light-dark(
1913
- oklch(0.274 0.006 286.033 / 0.05),
1914
- oklch(1 0 0 / 0.15)
2440
+ color-mix(in oklab, var(--nk-zinc-800) 5%, transparent),
2441
+ color-mix(in oklab, var(--nk-white) 15%, transparent)
1915
2442
  );
1916
2443
  --_nk-button-foreground: var(--nk-color-foreground);
1917
2444
  --_nk-button-border-width: 0;
@@ -1954,22 +2481,21 @@
1954
2481
  --_nk-button-icon-padding: var(--nk-space);
1955
2482
  --_nk-button-radius: var(--nk-button-radius, var(--nk-radius-md));
1956
2483
  --_nk-button-font-size: var(--nk-text-xs);
1957
- --_nk-button-line-height: 1rem;
1958
- --_nk-button-avatar-size: 1rem;
2484
+ --_nk-button-avatar-size: calc(var(--nk-space) * 4);
1959
2485
  --_nk-button-avatar-font-size: calc(var(--nk-text-xs) * 0.75);
1960
2486
  }
1961
2487
 
1962
2488
  :where([data-nk="button"][data-size="sm"]) {
1963
- --_nk-button-height: calc(var(--nk-space) * 8);
2489
+ --_nk-button-height: var(--nk-control-height-sm);
1964
2490
  --_nk-button-padding: calc(var(--nk-space) * 3);
1965
2491
  --_nk-button-icon-padding: calc(var(--nk-space) * 2);
1966
2492
  --_nk-button-radius: var(--nk-button-radius, var(--nk-radius-md));
1967
- --_nk-button-avatar-size: 1.25rem;
2493
+ --_nk-button-avatar-size: calc(var(--nk-space) * 5);
1968
2494
  --_nk-button-avatar-font-size: calc(var(--nk-text-xs) * 0.875);
1969
2495
  }
1970
2496
 
1971
2497
  :where([data-nk="button"][data-size="md"]) {
1972
- --_nk-button-avatar-size: 1.5rem;
2498
+ --_nk-button-avatar-size: calc(var(--nk-space) * 6);
1973
2499
  --_nk-button-avatar-font-size: calc(var(--nk-text-xs) * 0.875);
1974
2500
  }
1975
2501
 
@@ -1977,7 +2503,7 @@
1977
2503
  --_nk-button-height: var(--nk-control-height-lg);
1978
2504
  --_nk-button-padding: calc(var(--nk-space) * 5);
1979
2505
  --_nk-button-icon-padding: calc(var(--nk-space) * 4);
1980
- --_nk-button-avatar-size: 1.75rem;
2506
+ --_nk-button-avatar-size: calc(var(--nk-space) * 7);
1981
2507
  --_nk-button-avatar-font-size: var(--nk-text-xs);
1982
2508
  }
1983
2509
 
@@ -1987,8 +2513,7 @@
1987
2513
  --_nk-button-icon-padding: calc(var(--nk-space) * 7);
1988
2514
  --_nk-button-radius: var(--nk-button-radius, var(--nk-radius-xl));
1989
2515
  --_nk-button-font-size: var(--nk-text-base);
1990
- --_nk-button-line-height: 1.5rem;
1991
- --_nk-button-avatar-size: 2rem;
2516
+ --_nk-button-avatar-size: calc(var(--nk-space) * 8);
1992
2517
  --_nk-button-avatar-font-size: var(--nk-text-xs);
1993
2518
  gap: calc(var(--nk-space) * 4);
1994
2519
  }
@@ -2012,7 +2537,7 @@
2012
2537
  ) {
2013
2538
  pointer-events: none;
2014
2539
  cursor: default;
2015
- opacity: 0.75;
2540
+ opacity: var(--nk-disabled-opacity);
2016
2541
  }
2017
2542
 
2018
2543
  /* Dark surfaces need more than reduced opacity to read a saturated
@@ -2027,7 +2552,7 @@
2027
2552
  ) {
2028
2553
  --_nk-button-background: color-mix(
2029
2554
  in oklab,
2030
- var(--nk-color-danger) 40%,
2555
+ var(--nk-color-destructive) 40%,
2031
2556
  var(--nk-color-surface)
2032
2557
  );
2033
2558
  }
@@ -2042,7 +2567,7 @@
2042
2567
  ) {
2043
2568
  --_nk-button-background: color-mix(
2044
2569
  in oklab,
2045
- var(--nk-color-danger) 40%,
2570
+ var(--nk-color-destructive) 40%,
2046
2571
  var(--nk-color-surface)
2047
2572
  );
2048
2573
  }
@@ -2078,8 +2603,8 @@
2078
2603
 
2079
2604
  @layer nitro-kit.compound {
2080
2605
  :where([data-nk="button"] > [data-slot="button-label"] > [data-nk="avatar"]) {
2081
- width: min(var(--_nk-avatar-size), var(--_nk-button-avatar-size));
2082
- height: min(var(--_nk-avatar-size), var(--_nk-button-avatar-size));
2606
+ inline-size: min(var(--_nk-avatar-size), var(--_nk-button-avatar-size));
2607
+ block-size: min(var(--_nk-avatar-size), var(--_nk-button-avatar-size));
2083
2608
  font-size: min(
2084
2609
  var(--_nk-avatar-font-size),
2085
2610
  var(--_nk-button-avatar-font-size)
@@ -2173,8 +2698,8 @@
2173
2698
  }
2174
2699
 
2175
2700
  :where([data-nk="card"] > [data-slot="card-title"]) {
2176
- font-size: var(--nk-text-lg);
2177
- font-weight: var(--nk-font-weight-bold);
2701
+ font-size: var(--nk-title-surface-size);
2702
+ font-weight: var(--nk-title-surface-weight);
2178
2703
  line-height: var(--nk-leading-tight);
2179
2704
  text-wrap: balance;
2180
2705
  }
@@ -2235,41 +2760,38 @@
2235
2760
 
2236
2761
  /* Source: src/stylesheets/nitro_kit/components/checkbox.css */
2237
2762
  @layer nitro-kit.base {
2763
+ /* Every box dimension derives from one choice size, so the two sizes are one
2764
+ rule apart and the glyph keeps its proportions at either. The check stroke
2765
+ is two border widths and its optical nudge is one, at every size. */
2238
2766
  :where([data-nk="checkbox"]) {
2767
+ --_nk-choice-size: var(--nk-choice-size-md);
2768
+
2239
2769
  display: inline-grid;
2240
2770
  min-inline-size: var(--nk-control-height-md);
2241
2771
  min-block-size: var(--nk-control-height-md);
2242
2772
  color: var(--nk-color-foreground);
2243
2773
  }
2244
2774
 
2775
+ :where([data-nk="checkbox"][data-size="lg"]) {
2776
+ --_nk-choice-size: var(--nk-choice-size-lg);
2777
+ }
2778
+
2245
2779
  :where([data-nk="checkbox"] > [data-slot="checkbox-label"]) {
2246
2780
  display: grid;
2247
- grid-template-columns: 1.125rem minmax(0, 1fr);
2781
+ grid-template-columns: var(--_nk-choice-size) minmax(0, 1fr);
2248
2782
  gap: calc(var(--nk-space) * 2);
2249
2783
  align-items: center;
2250
2784
  min-block-size: var(--nk-control-height-md);
2251
2785
  cursor: pointer;
2252
2786
  }
2253
2787
 
2254
- :where([data-nk="checkbox"][data-size="lg"] > [data-slot="checkbox-label"]) {
2255
- grid-template-columns: 1.5rem minmax(0, 1fr);
2256
- }
2257
-
2258
2788
  :where(
2259
2789
  [data-nk="checkbox"] [data-slot="checkbox-control"],
2260
2790
  [data-nk="checkbox"] [data-slot="checkbox-indicator"]
2261
2791
  ) {
2262
2792
  grid-area: 1 / 1;
2263
- inline-size: 1.125rem;
2264
- block-size: 1.125rem;
2265
- }
2266
-
2267
- :where(
2268
- [data-nk="checkbox"][data-size="lg"] [data-slot="checkbox-control"],
2269
- [data-nk="checkbox"][data-size="lg"] [data-slot="checkbox-indicator"]
2270
- ) {
2271
- inline-size: 1.5rem;
2272
- block-size: 1.5rem;
2793
+ inline-size: var(--_nk-choice-size);
2794
+ block-size: var(--_nk-choice-size);
2273
2795
  }
2274
2796
 
2275
2797
  :where([data-nk="checkbox"] [data-slot="checkbox-control"]) {
@@ -2294,20 +2816,13 @@
2294
2816
  }
2295
2817
 
2296
2818
  :where([data-nk="checkbox"] [data-slot="checkbox-indicator"])::after {
2297
- inline-size: 0.5rem;
2298
- block-size: 0.3rem;
2819
+ inline-size: calc(var(--_nk-choice-size) * 0.44);
2820
+ block-size: calc(var(--_nk-choice-size) * 0.27);
2299
2821
  content: "";
2300
- border-block-end: 0.125rem solid currentcolor;
2301
- border-inline-start: 0.125rem solid currentcolor;
2822
+ border-block-end: calc(var(--nk-border-width) * 2) solid currentcolor;
2823
+ border-inline-start: calc(var(--nk-border-width) * 2) solid currentcolor;
2302
2824
  opacity: 0;
2303
- transform: translateY(-0.0625rem) rotate(-45deg);
2304
- }
2305
-
2306
- :where(
2307
- [data-nk="checkbox"][data-size="lg"] [data-slot="checkbox-indicator"]
2308
- )::after {
2309
- inline-size: 0.625rem;
2310
- block-size: 0.375rem;
2825
+ transform: translateY(calc(var(--nk-border-width) * -1)) rotate(-45deg);
2311
2826
  }
2312
2827
 
2313
2828
  :where([data-nk="checkbox"] [data-slot="checkbox-label-text"]) {
@@ -2318,17 +2833,11 @@
2318
2833
  :where([data-nk="checkbox"] > [data-slot="checkbox-description"]) {
2319
2834
  display: block;
2320
2835
  margin-block-start: var(--nk-space);
2321
- padding-inline-start: calc(1.125rem + (var(--nk-space) * 2));
2836
+ padding-inline-start: calc(var(--_nk-choice-size) + (var(--nk-space) * 2));
2322
2837
  color: var(--nk-color-muted-foreground);
2323
2838
  font-size: var(--nk-text-sm);
2324
2839
  text-wrap: pretty;
2325
2840
  }
2326
-
2327
- :where(
2328
- [data-nk="checkbox"][data-size="lg"] > [data-slot="checkbox-description"]
2329
- ) {
2330
- padding-inline-start: calc(1.5rem + (var(--nk-space) * 2));
2331
- }
2332
2841
  }
2333
2842
 
2334
2843
  @layer nitro-kit.state {
@@ -2355,21 +2864,14 @@
2355
2864
  [data-nk="checkbox"][data-state="indeterminate"]
2356
2865
  [data-slot="checkbox-indicator"]
2357
2866
  )::after {
2358
- inline-size: 0.55rem;
2867
+ inline-size: calc(var(--_nk-choice-size) * 0.49);
2359
2868
  block-size: 0;
2360
- border-block-end: 0.125rem solid currentcolor;
2869
+ border-block-end: calc(var(--nk-border-width) * 2) solid currentcolor;
2361
2870
  border-inline-start: 0;
2362
2871
  opacity: 1;
2363
2872
  transform: none;
2364
2873
  }
2365
2874
 
2366
- :where(
2367
- [data-nk="checkbox"][data-size="lg"][data-state="indeterminate"]
2368
- [data-slot="checkbox-indicator"]
2369
- )::after {
2370
- inline-size: 0.7rem;
2371
- }
2372
-
2373
2875
  :where(
2374
2876
  [data-nk="checkbox"]
2375
2877
  [data-slot="checkbox-control"]:focus-visible
@@ -2381,12 +2883,12 @@
2381
2883
 
2382
2884
  :where([data-nk="checkbox"][data-disabled="true"]) {
2383
2885
  cursor: not-allowed;
2384
- opacity: 0.6;
2886
+ opacity: var(--nk-disabled-opacity);
2385
2887
  }
2386
2888
 
2387
2889
  /* A server-rendered error describes the value that was submitted. Once the
2388
2890
  user has interacted with the control and it satisfies its own constraints,
2389
- that error is stale, so the danger border stands down and the native
2891
+ that error is stale, so the destructive border stands down and the native
2390
2892
  checked treatment takes over again. `:user-valid` never matches before the
2391
2893
  user touches the control, so an untouched invalid checkbox keeps its
2392
2894
  border. */
@@ -2395,7 +2897,13 @@
2395
2897
  [data-slot="checkbox-control"][aria-invalid="true"]:not(:user-valid)
2396
2898
  + [data-slot="checkbox-indicator"]
2397
2899
  ) {
2398
- border-color: var(--nk-color-danger);
2900
+ border-color: var(--nk-color-destructive);
2901
+ }
2902
+
2903
+ @media (prefers-reduced-motion: reduce) {
2904
+ :where([data-nk="checkbox"] [data-slot="checkbox-indicator"]) {
2905
+ transition-duration: 0.01ms;
2906
+ }
2399
2907
  }
2400
2908
  }
2401
2909
 
@@ -2410,8 +2918,8 @@
2410
2918
 
2411
2919
  :where([data-nk="checkbox-group"] > [data-slot="checkbox-group-legend"]) {
2412
2920
  padding: 0;
2413
- font-size: var(--nk-text-sm);
2414
- font-weight: var(--nk-font-weight-semibold);
2921
+ font-size: var(--nk-title-compact-size);
2922
+ font-weight: var(--nk-title-compact-weight);
2415
2923
  }
2416
2924
 
2417
2925
  :where(
@@ -2447,7 +2955,7 @@
2447
2955
  padding: calc(var(--nk-space) * 3);
2448
2956
  background: var(--nk-color-surface);
2449
2957
  border: var(--nk-border-width) solid var(--nk-color-border);
2450
- border-radius: var(--nk-radius-md);
2958
+ border-radius: var(--nk-radius-lg);
2451
2959
  }
2452
2960
  }
2453
2961
 
@@ -2494,8 +3002,8 @@
2494
3002
 
2495
3003
  :where([data-nk="combobox"] > [data-slot="combobox-status"]) {
2496
3004
  position: absolute;
2497
- width: 1px;
2498
- height: 1px;
3005
+ inline-size: 1px;
3006
+ block-size: 1px;
2499
3007
  padding: 0;
2500
3008
  margin: -1px;
2501
3009
  overflow: hidden;
@@ -2509,7 +3017,7 @@
2509
3017
  position: fixed;
2510
3018
  z-index: 50;
2511
3019
  inline-size: max(var(--_nk-combobox-width, 12rem), 12rem);
2512
- max-inline-size: min(28rem, calc(100vw - (var(--nk-space) * 8)));
3020
+ max-inline-size: min(28rem, calc(100% - (var(--nk-space) * 8)));
2513
3021
  max-block-size: 15rem;
2514
3022
  margin-block: var(--nk-space);
2515
3023
  padding: var(--nk-space);
@@ -2534,7 +3042,7 @@
2534
3042
  font-size: var(--nk-text-sm);
2535
3043
  line-height: var(--nk-leading-normal);
2536
3044
  cursor: pointer;
2537
- border-radius: var(--nk-radius-md);
3045
+ border-radius: calc(var(--nk-radius-lg) - var(--nk-space));
2538
3046
  transition:
2539
3047
  color var(--nk-duration-normal) var(--nk-ease),
2540
3048
  background-color var(--nk-duration-normal) var(--nk-ease);
@@ -2595,7 +3103,7 @@
2595
3103
  [data-nk="combobox"] [data-slot="combobox-option"][aria-disabled="true"]
2596
3104
  ) {
2597
3105
  cursor: not-allowed;
2598
- opacity: 0.6;
3106
+ opacity: var(--nk-disabled-opacity);
2599
3107
  }
2600
3108
 
2601
3109
  :where(
@@ -2607,7 +3115,7 @@
2607
3115
  @keyframes nk-combobox-enter {
2608
3116
  from {
2609
3117
  opacity: 0;
2610
- transform: translateY(-0.25rem);
3118
+ transform: translateY(calc(var(--nk-space) * -1));
2611
3119
  }
2612
3120
  to {
2613
3121
  opacity: 1;
@@ -2628,12 +3136,17 @@
2628
3136
  inline-size: 100%;
2629
3137
  }
2630
3138
 
3139
+ /* The trigger reads as the search input it opens: Input's plain border,
3140
+ radius, and surface instead of Button's raised treatment. */
2631
3141
  :where([data-nk="command-palette"] > [data-slot="command-palette-trigger"]) {
2632
3142
  justify-content: start;
2633
3143
  inline-size: 100%;
2634
3144
  color: var(--nk-color-muted-foreground);
2635
3145
  font-weight: var(--nk-font-weight-normal);
2636
3146
  background: var(--nk-color-surface);
3147
+ border-color: var(--nk-color-border);
3148
+ border-block-end-color: var(--nk-color-border);
3149
+ border-radius: var(--nk-radius-lg);
2637
3150
  box-shadow: none;
2638
3151
  }
2639
3152
 
@@ -2657,6 +3170,17 @@
2657
3170
  white-space: nowrap;
2658
3171
  }
2659
3172
 
3173
+ /* The chip floats at the trigger's end with the same inset on its top,
3174
+ end, and bottom sides, so the trigger's text padding stands down. */
3175
+ :where(
3176
+ [data-nk="command-palette"]
3177
+ > [data-slot="command-palette-trigger"]:has(
3178
+ [data-slot="command-palette-shortcut"]
3179
+ )
3180
+ ) {
3181
+ padding-inline-end: calc(var(--nk-space) * 2 - var(--nk-border-width));
3182
+ }
3183
+
2660
3184
  :where([data-nk="command-palette"] [data-slot="command-palette-shortcut"]) {
2661
3185
  flex: 0 0 auto;
2662
3186
  margin-inline-start: auto;
@@ -2671,6 +3195,16 @@
2671
3195
  border-radius: var(--nk-radius-sm);
2672
3196
  }
2673
3197
 
3198
+ /* The panel hugs its results and stops growing at the cap; past it, the
3199
+ shrinkable list scrolls. The flex display applies only while open, so
3200
+ the closed dialog keeps the user-agent's display: none. */
3201
+ :where(
3202
+ [data-nk="command-palette"] > [data-slot="command-palette-panel"][open]
3203
+ ) {
3204
+ display: flex;
3205
+ flex-direction: column;
3206
+ }
3207
+
2674
3208
  :where([data-nk="command-palette"] > [data-slot="command-palette-panel"]) {
2675
3209
  inline-size: min(calc(100% - (var(--nk-space) * 8)), var(--nk-content-md));
2676
3210
  max-block-size: min(36rem, calc(100dvh - (var(--nk-space) * 8)));
@@ -2684,6 +3218,16 @@
2684
3218
  box-shadow: var(--nk-shadow-lg);
2685
3219
  }
2686
3220
 
3221
+ /* The modal palette anchors near the viewport top, so hugging grows and
3222
+ shrinks downward and the top edge never jumps while filtering. The
3223
+ non-enhanced fallback keeps the centered default. */
3224
+ :where(
3225
+ [data-nk="command-palette"] > [data-slot="command-palette-panel"]:modal
3226
+ ) {
3227
+ margin-block: 12dvh auto;
3228
+ max-block-size: min(36rem, calc(88dvh - var(--nk-space) * 4));
3229
+ }
3230
+
2687
3231
  :where(
2688
3232
  [data-nk="command-palette"] > [data-slot="command-palette-panel"]
2689
3233
  )::backdrop {
@@ -2695,8 +3239,8 @@
2695
3239
  [data-nk="command-palette"] [data-slot="command-palette-status"]
2696
3240
  ) {
2697
3241
  position: absolute;
2698
- width: 1px;
2699
- height: 1px;
3242
+ inline-size: 1px;
3243
+ block-size: 1px;
2700
3244
  padding: 0;
2701
3245
  margin: -1px;
2702
3246
  overflow: hidden;
@@ -2708,6 +3252,7 @@
2708
3252
 
2709
3253
  :where([data-nk="command-palette"] [data-slot="command-palette-search"]) {
2710
3254
  display: flex;
3255
+ flex: 0 0 auto;
2711
3256
  gap: calc(var(--nk-space) * 2);
2712
3257
  align-items: center;
2713
3258
  padding: calc(var(--nk-space) * 2);
@@ -2771,8 +3316,10 @@
2771
3316
 
2772
3317
  :where([data-nk="command-palette"] [data-slot="command-palette-results"]) {
2773
3318
  display: grid;
3319
+ flex: 0 1 auto;
2774
3320
  gap: var(--nk-space);
2775
3321
  max-block-size: 26rem;
3322
+ min-block-size: 0;
2776
3323
  padding: calc(var(--nk-space) * 2);
2777
3324
  overflow-y: auto;
2778
3325
  overscroll-behavior: contain;
@@ -2796,7 +3343,7 @@
2796
3343
  font-size: var(--nk-text-sm);
2797
3344
  line-height: var(--nk-leading-normal);
2798
3345
  text-decoration: none;
2799
- border-radius: var(--nk-radius-md);
3346
+ border-radius: calc(var(--nk-radius-xl) - var(--nk-space) * 2);
2800
3347
  transition:
2801
3348
  color var(--nk-duration-normal) var(--nk-ease),
2802
3349
  background-color var(--nk-duration-normal) var(--nk-ease);
@@ -2821,6 +3368,25 @@
2821
3368
  }
2822
3369
  }
2823
3370
 
3371
+ @layer nitro-kit.compound {
3372
+ /* The search strip is the field: the icon sits inside it and the nested
3373
+ Input drops its own chrome, so the row reads as one input bounded by
3374
+ the hairline below. The caret is the focus indicator, matching every
3375
+ command palette — a ring on a borderless strip would show permanently,
3376
+ because text inputs are always focus-visible. */
3377
+ :where([data-nk="command-palette"] [data-slot="command-palette-input"]) {
3378
+ background: transparent;
3379
+ border-color: transparent;
3380
+ }
3381
+
3382
+ :where(
3383
+ [data-nk="command-palette"]
3384
+ [data-slot="command-palette-input"]:focus-visible
3385
+ ) {
3386
+ outline: none;
3387
+ }
3388
+ }
3389
+
2824
3390
  @layer nitro-kit.state {
2825
3391
  @media (hover: hover) {
2826
3392
  :where(
@@ -2859,7 +3425,7 @@
2859
3425
  @keyframes nk-command-palette-enter {
2860
3426
  from {
2861
3427
  opacity: 0;
2862
- transform: translateY(-0.5rem) scale(0.98);
3428
+ transform: translateY(calc(var(--nk-space) * -2)) scale(0.98);
2863
3429
  }
2864
3430
  to {
2865
3431
  opacity: 1;
@@ -2883,27 +3449,27 @@
2883
3449
  /* Source: src/stylesheets/nitro_kit/components/container.css */
2884
3450
  @layer nitro-kit.base {
2885
3451
  :where([data-nk="container"]) {
2886
- width: 100%;
2887
- min-width: 0;
3452
+ inline-size: 100%;
3453
+ min-inline-size: 0;
2888
3454
  margin-inline: auto;
2889
3455
  }
2890
3456
  }
2891
3457
 
2892
3458
  @layer nitro-kit.size {
2893
3459
  :where([data-nk="container"][data-size="sm"]) {
2894
- max-width: var(--nk-content-sm);
3460
+ max-inline-size: var(--nk-content-sm);
2895
3461
  }
2896
3462
 
2897
3463
  :where([data-nk="container"][data-size="md"]) {
2898
- max-width: var(--nk-content-md);
3464
+ max-inline-size: var(--nk-content-md);
2899
3465
  }
2900
3466
 
2901
3467
  :where([data-nk="container"][data-size="lg"]) {
2902
- max-width: var(--nk-content-lg);
3468
+ max-inline-size: var(--nk-content-lg);
2903
3469
  }
2904
3470
 
2905
3471
  :where([data-nk="container"][data-size="xl"]) {
2906
- max-width: var(--nk-content-xl);
3472
+ max-inline-size: var(--nk-content-xl);
2907
3473
  }
2908
3474
  }
2909
3475
 
@@ -2962,7 +3528,7 @@
2962
3528
  }
2963
3529
 
2964
3530
  :where([data-nk="control-group"] > [data-nk="select"] > select) {
2965
- height: 100%;
3531
+ block-size: 100%;
2966
3532
  border-radius: 0;
2967
3533
  }
2968
3534
 
@@ -2983,8 +3549,8 @@
2983
3549
  span[data-slot="control-group-addon"]
2984
3550
  ):first-child
2985
3551
  ) {
2986
- border-start-start-radius: var(--nk-radius-md);
2987
- border-end-start-radius: var(--nk-radius-md);
3552
+ border-start-start-radius: var(--nk-radius-lg);
3553
+ border-end-start-radius: var(--nk-radius-lg);
2988
3554
  }
2989
3555
 
2990
3556
  :where(
@@ -2995,8 +3561,8 @@
2995
3561
  span[data-slot="control-group-addon"]
2996
3562
  ):last-child
2997
3563
  ) {
2998
- border-start-end-radius: var(--nk-radius-md);
2999
- border-end-end-radius: var(--nk-radius-md);
3564
+ border-start-end-radius: var(--nk-radius-lg);
3565
+ border-end-end-radius: var(--nk-radius-lg);
3000
3566
  }
3001
3567
 
3002
3568
  :where(
@@ -3042,13 +3608,13 @@
3042
3608
  }
3043
3609
 
3044
3610
  :where([data-nk="control-group"] > [data-nk="select"]:first-child > select) {
3045
- border-start-start-radius: var(--nk-radius-md);
3046
- border-end-start-radius: var(--nk-radius-md);
3611
+ border-start-start-radius: var(--nk-radius-lg);
3612
+ border-end-start-radius: var(--nk-radius-lg);
3047
3613
  }
3048
3614
 
3049
3615
  :where([data-nk="control-group"] > [data-nk="select"]:last-child > select) {
3050
- border-start-end-radius: var(--nk-radius-md);
3051
- border-end-end-radius: var(--nk-radius-md);
3616
+ border-start-end-radius: var(--nk-radius-lg);
3617
+ border-end-end-radius: var(--nk-radius-lg);
3052
3618
  }
3053
3619
  }
3054
3620
 
@@ -3060,14 +3626,14 @@
3060
3626
  align-items: end;
3061
3627
  gap: calc(var(--nk-space) * 5);
3062
3628
  padding: calc(var(--nk-space) * 6);
3063
- color: var(--nk-color-danger-content);
3629
+ color: var(--nk-color-destructive-content);
3064
3630
  background: color-mix(
3065
3631
  in oklab,
3066
- var(--nk-color-danger) 8%,
3632
+ var(--nk-color-destructive) 8%,
3067
3633
  var(--nk-color-surface)
3068
3634
  );
3069
3635
  border: var(--nk-border-width) solid
3070
- color-mix(in oklab, var(--nk-color-danger) 50%, transparent);
3636
+ color-mix(in oklab, var(--nk-color-destructive) 50%, transparent);
3071
3637
  border-radius: var(--nk-radius-lg);
3072
3638
  }
3073
3639
 
@@ -3078,14 +3644,14 @@
3078
3644
  }
3079
3645
 
3080
3646
  :where([data-nk="danger-zone"] [data-slot="danger-zone-title"]) {
3081
- font-size: var(--nk-text-xl);
3082
- font-weight: var(--nk-font-weight-bold);
3647
+ font-size: var(--nk-title-section-size);
3648
+ font-weight: var(--nk-title-section-weight);
3083
3649
  line-height: var(--nk-leading-tight);
3084
3650
  text-wrap: balance;
3085
3651
  }
3086
3652
 
3087
3653
  :where([data-nk="danger-zone"] [data-slot="danger-zone-description"]) {
3088
- max-width: var(--nk-content-lg);
3654
+ max-inline-size: var(--nk-content-lg);
3089
3655
  font-size: var(--nk-text-sm);
3090
3656
  line-height: var(--nk-leading-relaxed);
3091
3657
  text-wrap: pretty;
@@ -3130,14 +3696,14 @@
3130
3696
  }
3131
3697
 
3132
3698
  :where([data-nk="data-section"] [data-slot="data-section-title"]) {
3133
- font-size: var(--nk-text-xl);
3134
- font-weight: var(--nk-font-weight-bold);
3699
+ font-size: var(--nk-title-section-size);
3700
+ font-weight: var(--nk-title-section-weight);
3135
3701
  line-height: var(--nk-leading-tight);
3136
3702
  text-wrap: balance;
3137
3703
  }
3138
3704
 
3139
3705
  :where([data-nk="data-section"] [data-slot="data-section-description"]) {
3140
- max-width: var(--nk-content-lg);
3706
+ max-inline-size: var(--nk-content-lg);
3141
3707
  color: var(--nk-color-muted-foreground);
3142
3708
  font-size: var(--nk-text-sm);
3143
3709
  line-height: var(--nk-leading-relaxed);
@@ -3146,7 +3712,7 @@
3146
3712
 
3147
3713
  :where([data-nk="data-section"] > [data-slot="data-section-table"]),
3148
3714
  :where([data-nk="data-section"] > [data-slot="data-section-empty-state"]) {
3149
- width: 100%;
3715
+ inline-size: 100%;
3150
3716
  }
3151
3717
  }
3152
3718
 
@@ -3183,11 +3749,13 @@
3183
3749
  text-underline-offset: 0.16em;
3184
3750
  }
3185
3751
 
3186
- :where(
3187
- [data-nk="details-table"] [data-slot="details-table-link"]:hover,
3188
- [data-nk="details-table"] [data-slot="details-table-record"]:hover
3189
- ) {
3190
- text-decoration-color: currentcolor;
3752
+ @media (hover: hover) {
3753
+ :where(
3754
+ [data-nk="details-table"] [data-slot="details-table-link"]:hover,
3755
+ [data-nk="details-table"] [data-slot="details-table-record"]:hover
3756
+ ) {
3757
+ text-decoration-color: currentcolor;
3758
+ }
3191
3759
  }
3192
3760
 
3193
3761
  :where([data-nk="details-table"] [data-slot="details-table-file"]) {
@@ -3236,8 +3804,8 @@
3236
3804
  }
3237
3805
 
3238
3806
  :where([data-nk="dialog"] [data-slot="dialog-title"]) {
3239
- font-size: var(--nk-text-lg);
3240
- font-weight: var(--nk-font-weight-bold);
3807
+ font-size: var(--nk-title-surface-size);
3808
+ font-weight: var(--nk-title-surface-weight);
3241
3809
  line-height: var(--nk-leading-tight);
3242
3810
  text-wrap: balance;
3243
3811
  }
@@ -3275,7 +3843,7 @@
3275
3843
  @keyframes nk-dialog-enter {
3276
3844
  from {
3277
3845
  opacity: 0;
3278
- transform: translateY(0.5rem) scale(0.98);
3846
+ transform: translateY(calc(var(--nk-space) * 2)) scale(0.98);
3279
3847
  }
3280
3848
  to {
3281
3849
  opacity: 1;
@@ -3302,7 +3870,7 @@
3302
3870
  z-index: 50;
3303
3871
  display: none;
3304
3872
  min-inline-size: 12rem;
3305
- max-inline-size: min(24rem, calc(100vw - (var(--nk-space) * 8)));
3873
+ max-inline-size: min(24rem, calc(100% - (var(--nk-space) * 8)));
3306
3874
  max-block-size: min(24rem, calc(100dvh - (var(--nk-space) * 8)));
3307
3875
  inset: var(--nk-space);
3308
3876
  inset: var(--_nk-overlay-top, var(--nk-space)) auto auto
@@ -3349,7 +3917,7 @@
3349
3917
  cursor: pointer;
3350
3918
  background: transparent;
3351
3919
  border: 0;
3352
- border-radius: var(--nk-radius-md);
3920
+ border-radius: calc(var(--nk-radius-lg) - var(--nk-space));
3353
3921
  transition:
3354
3922
  color var(--nk-duration-normal) var(--nk-ease),
3355
3923
  background-color var(--nk-duration-normal) var(--nk-ease);
@@ -3379,7 +3947,7 @@
3379
3947
  [data-nk="dropdown"]
3380
3948
  [data-slot="dropdown-item"][data-variant="destructive"]
3381
3949
  ) {
3382
- color: var(--nk-color-danger-content);
3950
+ color: var(--nk-color-destructive-content);
3383
3951
  }
3384
3952
 
3385
3953
  :where(
@@ -3410,8 +3978,8 @@
3410
3978
  [aria-disabled="true"]
3411
3979
  )
3412
3980
  ) {
3413
- color: var(--nk-color-danger-foreground);
3414
- background: var(--nk-color-danger);
3981
+ color: var(--nk-color-destructive-foreground);
3982
+ background: var(--nk-color-destructive);
3415
3983
  }
3416
3984
  }
3417
3985
 
@@ -3425,7 +3993,7 @@
3425
3993
  [data-slot="dropdown-item"]:is(:disabled, [aria-disabled="true"])
3426
3994
  ) {
3427
3995
  cursor: not-allowed;
3428
- opacity: 0.6;
3996
+ opacity: var(--nk-disabled-opacity);
3429
3997
  }
3430
3998
 
3431
3999
  :where([data-nk="dropdown"] > [data-slot="dropdown-content"]:popover-open) {
@@ -3435,7 +4003,7 @@
3435
4003
  @keyframes nk-dropdown-enter {
3436
4004
  from {
3437
4005
  opacity: 0;
3438
- transform: translateY(-0.25rem) scale(0.98);
4006
+ transform: translateY(calc(var(--nk-space) * -1)) scale(0.98);
3439
4007
  }
3440
4008
  to {
3441
4009
  opacity: 1;
@@ -3494,7 +4062,7 @@
3494
4062
  color: var(--nk-color-foreground);
3495
4063
  background: var(--nk-color-canvas);
3496
4064
  border: var(--nk-border-width) solid var(--nk-color-border);
3497
- border-radius: var(--nk-radius-md);
4065
+ border-radius: var(--nk-radius-lg);
3498
4066
  }
3499
4067
 
3500
4068
  :where(
@@ -3543,13 +4111,13 @@
3543
4111
  padding: calc(var(--nk-space) * 2);
3544
4112
  background: var(--nk-color-canvas);
3545
4113
  border: var(--nk-border-width) solid var(--nk-color-border);
3546
- border-radius: var(--nk-radius-md);
4114
+ border-radius: var(--nk-radius-lg);
3547
4115
  }
3548
4116
 
3549
4117
  :where([data-nk="dropzone"] [data-slot="dropzone-preview-image"]) {
3550
4118
  grid-row: span 2;
3551
- inline-size: 3rem;
3552
- block-size: 3rem;
4119
+ inline-size: calc(var(--nk-space) * 12);
4120
+ block-size: calc(var(--nk-space) * 12);
3553
4121
  object-fit: cover;
3554
4122
  border-radius: var(--nk-radius-sm);
3555
4123
  }
@@ -3605,12 +4173,12 @@
3605
4173
  }
3606
4174
 
3607
4175
  :where([data-nk="dropzone"][data-state="error"]) {
3608
- border-color: var(--nk-color-danger);
4176
+ border-color: var(--nk-color-destructive);
3609
4177
  }
3610
4178
 
3611
4179
  :where([data-nk="dropzone"][data-state="disabled"]) {
3612
4180
  cursor: not-allowed;
3613
- opacity: 0.6;
4181
+ opacity: var(--nk-disabled-opacity);
3614
4182
  }
3615
4183
 
3616
4184
  :where(
@@ -3639,7 +4207,7 @@
3639
4207
  }
3640
4208
 
3641
4209
  :where([data-nk="dropzone"] > [data-slot="dropzone-error"]) {
3642
- color: var(--nk-color-danger-content);
4210
+ color: var(--nk-color-destructive-content);
3643
4211
  font-size: var(--nk-text-sm);
3644
4212
  }
3645
4213
  }
@@ -3709,15 +4277,15 @@
3709
4277
  }
3710
4278
 
3711
4279
  :where([data-nk="empty-state"] > [data-slot="empty-state-icon"]) {
3712
- inline-size: 2rem;
3713
- block-size: 2rem;
4280
+ inline-size: calc(var(--nk-space) * 8);
4281
+ block-size: calc(var(--nk-space) * 8);
3714
4282
  color: var(--nk-color-muted-foreground);
3715
4283
  }
3716
4284
 
3717
4285
  :where([data-nk="empty-state"] > [data-slot="empty-state-title"]) {
3718
4286
  max-inline-size: var(--nk-content-md);
3719
- font-size: var(--nk-text-lg);
3720
- font-weight: var(--nk-font-weight-bold);
4287
+ font-size: var(--nk-title-surface-size);
4288
+ font-weight: var(--nk-title-surface-weight);
3721
4289
  line-height: var(--nk-leading-tight);
3722
4290
  text-wrap: balance;
3723
4291
  }
@@ -3769,7 +4337,7 @@
3769
4337
 
3770
4338
  :where([data-nk="field"] > [data-slot="field-error"]) {
3771
4339
  padding: 0;
3772
- color: var(--nk-color-danger-content);
4340
+ color: var(--nk-color-destructive-content);
3773
4341
  font-size: var(--nk-text-sm);
3774
4342
  list-style: none;
3775
4343
  }
@@ -3829,7 +4397,7 @@
3829
4397
  [data-nk="field"][data-state="invalid"]
3830
4398
  > [data-slot="field-control"][data-nk="input"]
3831
4399
  ) {
3832
- border-color: var(--nk-color-danger);
4400
+ border-color: var(--nk-color-destructive);
3833
4401
  }
3834
4402
  }
3835
4403
 
@@ -3865,8 +4433,8 @@
3865
4433
 
3866
4434
  :where([data-nk="fieldset"] > [data-slot="fieldset-legend"]) {
3867
4435
  padding: 0;
3868
- font-size: var(--nk-text-lg);
3869
- font-weight: var(--nk-font-weight-semibold);
4436
+ font-size: var(--nk-title-surface-size);
4437
+ font-weight: var(--nk-title-surface-weight);
3870
4438
  line-height: var(--nk-leading-tight);
3871
4439
  }
3872
4440
 
@@ -3894,7 +4462,7 @@
3894
4462
  @layer nitro-kit.base {
3895
4463
  :where([data-nk="flex"]) {
3896
4464
  display: flex;
3897
- min-width: 0;
4465
+ min-inline-size: 0;
3898
4466
  flex-direction: var(--_nk-flex-direction);
3899
4467
  flex-wrap: var(--_nk-flex-wrap);
3900
4468
  gap: var(--_nk-layout-gap);
@@ -4351,7 +4919,7 @@
4351
4919
  @layer nitro-kit.base {
4352
4920
  :where([data-nk="grid"]) {
4353
4921
  display: grid;
4354
- min-width: 0;
4922
+ min-inline-size: 0;
4355
4923
  grid-template-columns: repeat(var(--_nk-grid-columns), minmax(0, 1fr));
4356
4924
  gap: var(--_nk-layout-gap);
4357
4925
  }
@@ -4669,19 +5237,19 @@
4669
5237
 
4670
5238
  @layer nitro-kit.size {
4671
5239
  :where([data-nk="icon"][data-size="xs"]) {
4672
- --_nk-icon-size: 0.75rem;
5240
+ --_nk-icon-size: var(--nk-icon-size-xs);
4673
5241
  }
4674
5242
  :where([data-nk="icon"][data-size="sm"]) {
4675
- --_nk-icon-size: 1rem;
5243
+ --_nk-icon-size: var(--nk-icon-size-sm);
4676
5244
  }
4677
5245
  :where([data-nk="icon"][data-size="md"]) {
4678
- --_nk-icon-size: 1.25rem;
5246
+ --_nk-icon-size: var(--nk-icon-size-md);
4679
5247
  }
4680
5248
  :where([data-nk="icon"][data-size="lg"]) {
4681
- --_nk-icon-size: 1.75rem;
5249
+ --_nk-icon-size: var(--nk-icon-size-lg);
4682
5250
  }
4683
5251
  :where([data-nk="icon"][data-size="xl"]) {
4684
- --_nk-icon-size: 2.25rem;
5252
+ --_nk-icon-size: var(--nk-icon-size-xl);
4685
5253
  }
4686
5254
  }
4687
5255
 
@@ -4693,20 +5261,20 @@
4693
5261
  display: block;
4694
5262
  inline-size: 100%;
4695
5263
  min-block-size: var(--nk-control-height-md);
4696
- padding-inline: calc(var(--nk-space) * 3);
5264
+ padding-inline: var(--nk-control-padding-inline);
4697
5265
  color: var(--nk-color-foreground);
4698
5266
  font-size: var(--nk-text-base);
4699
5267
  background: var(--nk-color-surface);
4700
5268
  border: var(--nk-border-width) solid var(--nk-color-border);
4701
- border-radius: var(--nk-radius-md);
5269
+ border-radius: var(--nk-radius-lg);
4702
5270
  transition:
4703
5271
  border-color var(--nk-duration-normal) var(--nk-ease),
4704
5272
  box-shadow var(--nk-duration-normal) var(--nk-ease);
4705
5273
  }
4706
5274
 
4707
5275
  :where([data-nk="input"][type="checkbox"], [data-nk="input"][type="radio"]) {
4708
- inline-size: 1.125rem;
4709
- block-size: 1.125rem;
5276
+ inline-size: var(--nk-choice-size-md);
5277
+ block-size: var(--nk-choice-size-md);
4710
5278
  accent-color: var(--nk-color-primary);
4711
5279
  }
4712
5280
 
@@ -4743,6 +5311,33 @@
4743
5311
  border-inline-end: var(--nk-border-width) solid
4744
5312
  var(--nk-button-default-border);
4745
5313
  }
5314
+
5315
+ /* Data-entry controls read --nk-text-base below the md breakpoint, where
5316
+ a focused control under 16px would zoom the viewport, and --nk-text-sm
5317
+ from md up, beside 14px labels and body text. */
5318
+ @media (min-width: 48rem) {
5319
+ :where(
5320
+ [data-nk="input"]:not(
5321
+ [type="checkbox"],
5322
+ [type="radio"],
5323
+ [type="hidden"]
5324
+ )
5325
+ ) {
5326
+ font-size: var(--nk-text-sm);
5327
+ }
5328
+ }
5329
+
5330
+ @media (prefers-reduced-motion: reduce) {
5331
+ :where(
5332
+ [data-nk="input"]:not(
5333
+ [type="checkbox"],
5334
+ [type="radio"],
5335
+ [type="hidden"]
5336
+ )
5337
+ ) {
5338
+ transition-duration: 0.01ms;
5339
+ }
5340
+ }
4746
5341
  }
4747
5342
 
4748
5343
  @layer nitro-kit.state {
@@ -4766,11 +5361,11 @@
4766
5361
 
4767
5362
  :where([data-nk="input"]:disabled) {
4768
5363
  cursor: not-allowed;
4769
- opacity: 0.6;
5364
+ opacity: var(--nk-disabled-opacity);
4770
5365
  }
4771
5366
 
4772
5367
  :where([data-nk="input"][aria-invalid="true"]) {
4773
- border-color: var(--nk-color-danger);
5368
+ border-color: var(--nk-color-destructive);
4774
5369
  }
4775
5370
  }
4776
5371
 
@@ -5243,15 +5838,15 @@
5243
5838
  }
5244
5839
 
5245
5840
  :where([data-nk="page-header"] > [data-slot="page-header-title"]) {
5246
- max-width: var(--nk-content-lg);
5247
- font-size: var(--nk-text-2xl);
5248
- font-weight: var(--nk-font-weight-bold);
5841
+ max-inline-size: var(--nk-content-lg);
5842
+ font-size: var(--nk-title-page-size);
5843
+ font-weight: var(--nk-title-page-weight);
5249
5844
  line-height: var(--nk-leading-tight);
5250
5845
  text-wrap: balance;
5251
5846
  }
5252
5847
 
5253
5848
  :where([data-nk="page-header"] > [data-slot="page-header-description"]) {
5254
- max-width: var(--nk-content-lg);
5849
+ max-inline-size: var(--nk-content-lg);
5255
5850
  color: var(--nk-color-muted-foreground);
5256
5851
  font-size: var(--nk-text-sm);
5257
5852
  line-height: var(--nk-leading-relaxed);
@@ -5325,8 +5920,8 @@
5325
5920
  > [data-slot="pagination-ellipsis-label"]
5326
5921
  ) {
5327
5922
  position: absolute;
5328
- width: 1px;
5329
- height: 1px;
5923
+ inline-size: 1px;
5924
+ block-size: 1px;
5330
5925
  padding: 0;
5331
5926
  margin: -1px;
5332
5927
  overflow: hidden;
@@ -5395,7 +5990,7 @@
5395
5990
  font-size: var(--nk-text-sm);
5396
5991
  font-weight: var(--nk-font-weight-medium);
5397
5992
  border: var(--nk-border-width) solid var(--nk-color-border);
5398
- border-radius: var(--nk-radius-md);
5993
+ border-radius: var(--nk-radius-lg);
5399
5994
  }
5400
5995
 
5401
5996
  :where(
@@ -5424,7 +6019,7 @@
5424
6019
  @layer nitro-kit.base {
5425
6020
  :where([data-nk="pagination-bar"]) {
5426
6021
  display: flex;
5427
- min-width: 0;
6022
+ min-inline-size: 0;
5428
6023
  flex-wrap: wrap;
5429
6024
  align-items: center;
5430
6025
  justify-content: space-between;
@@ -5432,7 +6027,7 @@
5432
6027
  }
5433
6028
 
5434
6029
  :where([data-nk="pagination-bar"] > [data-slot="pagination-bar-summary"]) {
5435
- min-width: 0;
6030
+ min-inline-size: 0;
5436
6031
  margin: 0;
5437
6032
  color: var(--nk-color-muted-foreground);
5438
6033
  font-size: var(--nk-text-sm);
@@ -5464,117 +6059,185 @@
5464
6059
  }
5465
6060
 
5466
6061
  /* Source: src/stylesheets/nitro_kit/components/palette.css */
6062
+ /* The semantic palette shared by Badge, Alert, and Toast.
6063
+ *
6064
+ * Every family resolves through the public `--nk-palette-*` tint axis, which
6065
+ * samples the color scales and is already appearance-aware, so a component
6066
+ * never restates a hue. Semantic families default to the same steps as their
6067
+ * hue families -- `info` renders exactly like `blue` -- and an application
6068
+ * that rethemes a tint role moves all three components at once. `-content`
6069
+ * carries the paired foreground; the base role carries the tinting accent.
6070
+ *
6071
+ * Alert and Toast are the same kind of thing — a status message — so they also
6072
+ * share one tinted surface and border. Only the components that own a different
6073
+ * job, such as Badge's compact label, set their own tint strength.
6074
+ */
5467
6075
  @layer nitro-kit.variant {
5468
6076
  :where(
5469
- [data-nk="badge"][data-color="zinc"],
5470
6077
  [data-nk="badge"][data-color="neutral"],
5471
- [data-nk="alert"][data-variant="default"]
6078
+ [data-nk="alert"][data-variant="default"],
6079
+ [data-nk="toast-item"][data-variant="default"]
5472
6080
  ) {
5473
- --_nk-palette-light: oklch(37% 0.013 285.805);
5474
- --_nk-palette-dark: oklch(92% 0.004 286.32);
5475
- --_nk-palette-tint: oklch(70.5% 0.015 286.067);
6081
+ --_nk-semantic-accent: var(--nk-palette-neutral);
6082
+ --_nk-semantic-content: var(--nk-palette-neutral-content);
5476
6083
  }
5477
6084
 
5478
6085
  :where(
5479
- [data-nk="badge"][data-color="red"],
5480
- [data-nk="badge"][data-color="danger"],
5481
- [data-nk="alert"][data-variant="error"]
6086
+ [data-nk="badge"][data-color="info"],
6087
+ [data-nk="alert"][data-variant="info"],
6088
+ [data-nk="toast-item"][data-variant="info"]
5482
6089
  ) {
5483
- --_nk-palette-light: oklch(50.5% 0.213 27.518);
5484
- --_nk-palette-dark: oklch(88.5% 0.062 18.334);
5485
- --_nk-palette-tint: oklch(70.4% 0.191 22.216);
6090
+ --_nk-semantic-accent: var(--nk-palette-info);
6091
+ --_nk-semantic-content: var(--nk-palette-info-content);
5486
6092
  }
5487
- :where([data-nk="badge"][data-color="orange"]) {
5488
- --_nk-palette-light: oklch(55.3% 0.195 38.402);
5489
- --_nk-palette-dark: oklch(90.1% 0.076 70.697);
5490
- --_nk-palette-tint: oklch(75% 0.183 55.934);
6093
+
6094
+ :where(
6095
+ [data-nk="badge"][data-color="success"],
6096
+ [data-nk="alert"][data-variant="success"],
6097
+ [data-nk="toast-item"][data-variant="success"]
6098
+ ) {
6099
+ --_nk-semantic-accent: var(--nk-palette-success);
6100
+ --_nk-semantic-content: var(--nk-palette-success-content);
5491
6101
  }
6102
+
5492
6103
  :where(
5493
- [data-nk="badge"][data-color="amber"],
5494
6104
  [data-nk="badge"][data-color="warning"],
5495
- [data-nk="alert"][data-variant="warning"]
6105
+ [data-nk="alert"][data-variant="warning"],
6106
+ [data-nk="toast-item"][data-variant="warning"]
5496
6107
  ) {
5497
- --_nk-palette-light: oklch(55% 0.163 48.998);
5498
- --_nk-palette-dark: oklch(92.4% 0.12 95.746);
5499
- --_nk-palette-tint: oklch(82.8% 0.189 84.429);
6108
+ --_nk-semantic-accent: var(--nk-palette-warning);
6109
+ --_nk-semantic-content: var(--nk-palette-warning-content);
6110
+ }
6111
+
6112
+ /* Action components and Alert say `destructive`; Toast announces `error`.
6113
+ Both spellings resolve to the destructive family, and this is the only
6114
+ place they meet. */
6115
+ :where(
6116
+ [data-nk="badge"][data-color="destructive"],
6117
+ [data-nk="alert"][data-variant="destructive"],
6118
+ [data-nk="toast-item"][data-variant="error"]
6119
+ ) {
6120
+ --_nk-semantic-accent: var(--nk-palette-destructive);
6121
+ --_nk-semantic-content: var(--nk-palette-destructive-content);
6122
+ }
6123
+
6124
+ /* The shared status treatment. Defined once so Alert and Toast cannot drift
6125
+ apart again, and so a third status component inherits it by opting in. */
6126
+ :where([data-nk="alert"], [data-nk="toast-item"]) {
6127
+ --_nk-semantic-tint: 12%;
6128
+ --_nk-semantic-surface: color-mix(
6129
+ in oklab,
6130
+ var(--_nk-semantic-accent) var(--_nk-semantic-tint),
6131
+ var(--nk-color-surface)
6132
+ );
6133
+ --_nk-semantic-border: color-mix(
6134
+ in oklab,
6135
+ var(--_nk-semantic-accent) 45%,
6136
+ transparent
6137
+ );
6138
+ }
6139
+
6140
+ /* Dark appearances need a stronger tint to separate the surface from the
6141
+ page behind it. */
6142
+ :where([data-theme="dark"])
6143
+ :where([data-nk="alert"], [data-nk="toast-item"]) {
6144
+ --_nk-semantic-tint: 20%;
5500
6145
  }
6146
+
6147
+ @media (prefers-color-scheme: dark) {
6148
+ :where(:root:not([data-theme]))
6149
+ :where([data-nk="alert"], [data-nk="toast-item"]) {
6150
+ --_nk-semantic-tint: 20%;
6151
+ }
6152
+ }
6153
+
6154
+ /* The decorative hues. These name a color rather than a meaning, so they
6155
+ follow `--nk-palette-*` and stay put when an application rethemes its
6156
+ semantic families. `red` and `destructive` are deliberately different: one is
6157
+ a color, the other is whatever destructive currently means. */
6158
+ :where([data-nk="badge"][data-color="red"]) {
6159
+ --_nk-semantic-accent: var(--nk-palette-red);
6160
+ --_nk-semantic-content: var(--nk-palette-red-content);
6161
+ }
6162
+
6163
+ :where([data-nk="badge"][data-color="orange"]) {
6164
+ --_nk-semantic-accent: var(--nk-palette-orange);
6165
+ --_nk-semantic-content: var(--nk-palette-orange-content);
6166
+ }
6167
+
6168
+ :where([data-nk="badge"][data-color="amber"]) {
6169
+ --_nk-semantic-accent: var(--nk-palette-amber);
6170
+ --_nk-semantic-content: var(--nk-palette-amber-content);
6171
+ }
6172
+
5501
6173
  :where([data-nk="badge"][data-color="yellow"]) {
5502
- --_nk-palette-light: oklch(47.6% 0.114 61.907);
5503
- --_nk-palette-dark: oklch(94.5% 0.129 101.54);
5504
- --_nk-palette-tint: oklch(85.2% 0.199 91.936);
6174
+ --_nk-semantic-accent: var(--nk-palette-yellow);
6175
+ --_nk-semantic-content: var(--nk-palette-yellow-content);
5505
6176
  }
6177
+
5506
6178
  :where([data-nk="badge"][data-color="lime"]) {
5507
- --_nk-palette-light: oklch(45.3% 0.124 130.933);
5508
- --_nk-palette-dark: oklch(93.8% 0.127 124.321);
5509
- --_nk-palette-tint: oklch(84.1% 0.238 128.85);
6179
+ --_nk-semantic-accent: var(--nk-palette-lime);
6180
+ --_nk-semantic-content: var(--nk-palette-lime-content);
5510
6181
  }
5511
- :where(
5512
- [data-nk="badge"][data-color="green"],
5513
- [data-nk="badge"][data-color="success"],
5514
- [data-nk="alert"][data-variant="success"]
5515
- ) {
5516
- --_nk-palette-light: oklch(44.8% 0.119 151.328);
5517
- --_nk-palette-dark: oklch(92.5% 0.084 155.995);
5518
- --_nk-palette-tint: oklch(79.2% 0.209 151.711);
6182
+
6183
+ :where([data-nk="badge"][data-color="green"]) {
6184
+ --_nk-semantic-accent: var(--nk-palette-green);
6185
+ --_nk-semantic-content: var(--nk-palette-green-content);
5519
6186
  }
6187
+
5520
6188
  :where([data-nk="badge"][data-color="emerald"]) {
5521
- --_nk-palette-light: oklch(43.2% 0.095 166.913);
5522
- --_nk-palette-dark: oklch(90.5% 0.093 164.15);
5523
- --_nk-palette-tint: oklch(76.5% 0.177 163.223);
6189
+ --_nk-semantic-accent: var(--nk-palette-emerald);
6190
+ --_nk-semantic-content: var(--nk-palette-emerald-content);
5524
6191
  }
6192
+
5525
6193
  :where([data-nk="badge"][data-color="teal"]) {
5526
- --_nk-palette-light: oklch(43.7% 0.078 188.216);
5527
- --_nk-palette-dark: oklch(91% 0.096 180.426);
5528
- --_nk-palette-tint: oklch(77.7% 0.152 181.912);
6194
+ --_nk-semantic-accent: var(--nk-palette-teal);
6195
+ --_nk-semantic-content: var(--nk-palette-teal-content);
5529
6196
  }
6197
+
5530
6198
  :where([data-nk="badge"][data-color="cyan"]) {
5531
- --_nk-palette-light: oklch(45% 0.085 224.283);
5532
- --_nk-palette-dark: oklch(91.7% 0.08 205.041);
5533
- --_nk-palette-tint: oklch(78.9% 0.154 211.53);
6199
+ --_nk-semantic-accent: var(--nk-palette-cyan);
6200
+ --_nk-semantic-content: var(--nk-palette-cyan-content);
5534
6201
  }
6202
+
5535
6203
  :where([data-nk="badge"][data-color="sky"]) {
5536
- --_nk-palette-light: oklch(44.3% 0.11 240.79);
5537
- --_nk-palette-dark: oklch(90.1% 0.058 230.902);
5538
- --_nk-palette-tint: oklch(74.6% 0.16 232.661);
6204
+ --_nk-semantic-accent: var(--nk-palette-sky);
6205
+ --_nk-semantic-content: var(--nk-palette-sky-content);
5539
6206
  }
5540
- :where(
5541
- [data-nk="badge"][data-color="blue"],
5542
- [data-nk="badge"][data-color="info"],
5543
- [data-nk="alert"][data-variant="info"]
5544
- ) {
5545
- --_nk-palette-light: oklch(42.4% 0.199 265.638);
5546
- --_nk-palette-dark: oklch(88.2% 0.059 254.128);
5547
- --_nk-palette-tint: oklch(70.7% 0.165 254.624);
6207
+
6208
+ :where([data-nk="badge"][data-color="blue"]) {
6209
+ --_nk-semantic-accent: var(--nk-palette-blue);
6210
+ --_nk-semantic-content: var(--nk-palette-blue-content);
5548
6211
  }
6212
+
5549
6213
  :where([data-nk="badge"][data-color="indigo"]) {
5550
- --_nk-palette-light: oklch(45.7% 0.24 277.023);
5551
- --_nk-palette-dark: oklch(87% 0.065 274.039);
5552
- --_nk-palette-tint: oklch(67.3% 0.182 276.935);
6214
+ --_nk-semantic-accent: var(--nk-palette-indigo);
6215
+ --_nk-semantic-content: var(--nk-palette-indigo-content);
5553
6216
  }
6217
+
5554
6218
  :where([data-nk="badge"][data-color="violet"]) {
5555
- --_nk-palette-light: oklch(49.1% 0.27 292.581);
5556
- --_nk-palette-dark: oklch(89.4% 0.057 293.283);
5557
- --_nk-palette-tint: oklch(70.2% 0.183 293.541);
6219
+ --_nk-semantic-accent: var(--nk-palette-violet);
6220
+ --_nk-semantic-content: var(--nk-palette-violet-content);
5558
6221
  }
6222
+
5559
6223
  :where([data-nk="badge"][data-color="purple"]) {
5560
- --_nk-palette-light: oklch(49.6% 0.265 301.924);
5561
- --_nk-palette-dark: oklch(90.2% 0.063 306.703);
5562
- --_nk-palette-tint: oklch(71.4% 0.203 305.504);
6224
+ --_nk-semantic-accent: var(--nk-palette-purple);
6225
+ --_nk-semantic-content: var(--nk-palette-purple-content);
5563
6226
  }
6227
+
5564
6228
  :where([data-nk="badge"][data-color="fuchsia"]) {
5565
- --_nk-palette-light: oklch(51.8% 0.253 323.949);
5566
- --_nk-palette-dark: oklch(90.3% 0.076 319.62);
5567
- --_nk-palette-tint: oklch(74% 0.238 322.16);
6229
+ --_nk-semantic-accent: var(--nk-palette-fuchsia);
6230
+ --_nk-semantic-content: var(--nk-palette-fuchsia-content);
5568
6231
  }
6232
+
5569
6233
  :where([data-nk="badge"][data-color="pink"]) {
5570
- --_nk-palette-light: oklch(52.5% 0.223 3.958);
5571
- --_nk-palette-dark: oklch(89.9% 0.061 343.231);
5572
- --_nk-palette-tint: oklch(71.8% 0.202 349.761);
6234
+ --_nk-semantic-accent: var(--nk-palette-pink);
6235
+ --_nk-semantic-content: var(--nk-palette-pink-content);
5573
6236
  }
6237
+
5574
6238
  :where([data-nk="badge"][data-color="rose"]) {
5575
- --_nk-palette-light: oklch(51.4% 0.222 16.935);
5576
- --_nk-palette-dark: oklch(89.2% 0.058 10.001);
5577
- --_nk-palette-tint: oklch(71.2% 0.194 13.428);
6239
+ --_nk-semantic-accent: var(--nk-palette-rose);
6240
+ --_nk-semantic-content: var(--nk-palette-rose-content);
5578
6241
  }
5579
6242
  }
5580
6243
 
@@ -5628,7 +6291,7 @@
5628
6291
  > [data-slot="progressive-image-placeholder"]
5629
6292
  ) {
5630
6293
  z-index: 1;
5631
- filter: blur(1rem);
6294
+ filter: blur(calc(var(--nk-space) * 4));
5632
6295
  opacity: 0;
5633
6296
  transform: scale(1.05);
5634
6297
  }
@@ -5711,46 +6374,39 @@
5711
6374
 
5712
6375
  /* Source: src/stylesheets/nitro_kit/components/radio_button.css */
5713
6376
  @layer nitro-kit.base {
6377
+ /* Every dimension derives from one choice size, matching Checkbox: the two
6378
+ sizes are one rule apart and the dot keeps its proportion at either. The
6379
+ dot previously stayed at its medium size inside a large radio; deriving it
6380
+ scales it with the control. */
5714
6381
  :where([data-nk="radio-button"]) {
6382
+ --_nk-choice-size: var(--nk-choice-size-md);
6383
+
5715
6384
  display: inline-grid;
5716
6385
  min-inline-size: var(--nk-control-height-md);
5717
6386
  min-block-size: var(--nk-control-height-md);
5718
6387
  color: var(--nk-color-foreground);
5719
6388
  }
5720
6389
 
6390
+ :where([data-nk="radio-button"][data-size="lg"]) {
6391
+ --_nk-choice-size: var(--nk-choice-size-lg);
6392
+ }
6393
+
5721
6394
  :where([data-nk="radio-button"] > [data-slot="radio-button-label"]) {
5722
6395
  display: grid;
5723
- grid-template-columns: 1.125rem minmax(0, 1fr);
6396
+ grid-template-columns: var(--_nk-choice-size) minmax(0, 1fr);
5724
6397
  gap: calc(var(--nk-space) * 2);
5725
6398
  align-items: center;
5726
6399
  min-block-size: var(--nk-control-height-md);
5727
6400
  cursor: pointer;
5728
6401
  }
5729
6402
 
5730
- :where(
5731
- [data-nk="radio-button"][data-size="lg"]
5732
- > [data-slot="radio-button-label"]
5733
- ) {
5734
- grid-template-columns: 1.5rem minmax(0, 1fr);
5735
- }
5736
-
5737
6403
  :where(
5738
6404
  [data-nk="radio-button"] [data-slot="radio-button-control"],
5739
6405
  [data-nk="radio-button"] [data-slot="radio-button-indicator"]
5740
6406
  ) {
5741
6407
  grid-area: 1 / 1;
5742
- inline-size: 1.125rem;
5743
- block-size: 1.125rem;
5744
- }
5745
-
5746
- :where(
5747
- [data-nk="radio-button"][data-size="lg"]
5748
- [data-slot="radio-button-control"],
5749
- [data-nk="radio-button"][data-size="lg"]
5750
- [data-slot="radio-button-indicator"]
5751
- ) {
5752
- inline-size: 1.5rem;
5753
- block-size: 1.5rem;
6408
+ inline-size: var(--_nk-choice-size);
6409
+ block-size: var(--_nk-choice-size);
5754
6410
  }
5755
6411
 
5756
6412
  :where([data-nk="radio-button"] [data-slot="radio-button-control"]) {
@@ -5768,11 +6424,14 @@
5768
6424
  background: var(--nk-color-surface);
5769
6425
  border: var(--nk-border-width) solid var(--nk-color-border);
5770
6426
  border-radius: var(--nk-radius-full);
6427
+ transition:
6428
+ background-color var(--nk-duration-fast) var(--nk-ease),
6429
+ border-color var(--nk-duration-fast) var(--nk-ease);
5771
6430
  }
5772
6431
 
5773
6432
  :where([data-nk="radio-button"] [data-slot="radio-button-indicator"])::after {
5774
- inline-size: 0.5rem;
5775
- block-size: 0.5rem;
6433
+ inline-size: calc(var(--_nk-choice-size) * 0.44);
6434
+ block-size: calc(var(--_nk-choice-size) * 0.44);
5776
6435
  content: "";
5777
6436
  background: var(--nk-color-primary);
5778
6437
  border-radius: inherit;
@@ -5787,18 +6446,11 @@
5787
6446
  :where([data-nk="radio-button"] > [data-slot="radio-button-description"]) {
5788
6447
  display: block;
5789
6448
  margin-block-start: var(--nk-space);
5790
- padding-inline-start: calc(1.125rem + (var(--nk-space) * 2));
6449
+ padding-inline-start: calc(var(--_nk-choice-size) + (var(--nk-space) * 2));
5791
6450
  color: var(--nk-color-muted-foreground);
5792
6451
  font-size: var(--nk-text-sm);
5793
6452
  text-wrap: pretty;
5794
6453
  }
5795
-
5796
- :where(
5797
- [data-nk="radio-button"][data-size="lg"]
5798
- > [data-slot="radio-button-description"]
5799
- ) {
5800
- padding-inline-start: calc(1.5rem + (var(--nk-space) * 2));
5801
- }
5802
6454
  }
5803
6455
 
5804
6456
  @layer nitro-kit.state {
@@ -5829,19 +6481,25 @@
5829
6481
 
5830
6482
  :where([data-nk="radio-button"][data-disabled="true"]) {
5831
6483
  cursor: not-allowed;
5832
- opacity: 0.6;
6484
+ opacity: var(--nk-disabled-opacity);
5833
6485
  }
5834
6486
 
5835
6487
  /* The server error describes the submitted value. Once the user picks a
5836
6488
  value that satisfies the control's own constraints the error is stale, so
5837
- the danger border stands down. `:user-valid` never matches before the user
6489
+ the destructive border stands down. `:user-valid` never matches before the user
5838
6490
  touches the control, so an untouched invalid radio keeps its border. */
5839
6491
  :where(
5840
6492
  [data-nk="radio-button"]
5841
6493
  [data-slot="radio-button-control"][aria-invalid="true"]:not(:user-valid)
5842
6494
  + [data-slot="radio-button-indicator"]
5843
6495
  ) {
5844
- border-color: var(--nk-color-danger);
6496
+ border-color: var(--nk-color-destructive);
6497
+ }
6498
+
6499
+ @media (prefers-reduced-motion: reduce) {
6500
+ :where([data-nk="radio-button"] [data-slot="radio-button-indicator"]) {
6501
+ transition-duration: 0.01ms;
6502
+ }
5845
6503
  }
5846
6504
  }
5847
6505
 
@@ -5858,8 +6516,8 @@
5858
6516
  [data-nk="radio-button-group"] > [data-slot="radio-button-group-legend"]
5859
6517
  ) {
5860
6518
  padding: 0;
5861
- font-size: var(--nk-text-sm);
5862
- font-weight: var(--nk-font-weight-semibold);
6519
+ font-size: var(--nk-title-compact-size);
6520
+ font-weight: var(--nk-title-compact-weight);
5863
6521
  }
5864
6522
 
5865
6523
  :where(
@@ -5905,7 +6563,7 @@
5905
6563
  padding: calc(var(--nk-space) * 3);
5906
6564
  background: var(--nk-color-surface);
5907
6565
  border: var(--nk-border-width) solid var(--nk-color-border);
5908
- border-radius: var(--nk-radius-md);
6566
+ border-radius: var(--nk-radius-lg);
5909
6567
  }
5910
6568
 
5911
6569
  :where(
@@ -5916,7 +6574,7 @@
5916
6574
  gap: 0;
5917
6575
  padding: var(--nk-space);
5918
6576
  background: var(--nk-color-muted);
5919
- border-radius: var(--nk-radius-md);
6577
+ border-radius: var(--nk-radius-lg);
5920
6578
  }
5921
6579
 
5922
6580
  :where(
@@ -5926,7 +6584,7 @@
5926
6584
  ) {
5927
6585
  min-inline-size: 0;
5928
6586
  padding-inline: calc(var(--nk-space) * 3);
5929
- border-radius: calc(var(--nk-radius-md) - var(--nk-space));
6587
+ border-radius: calc(var(--nk-radius-lg) - var(--nk-space));
5930
6588
  }
5931
6589
 
5932
6590
  :where(
@@ -5984,7 +6642,7 @@
5984
6642
  [data-nk="radio-button-group"][data-presentation="segmented"]
5985
6643
  [data-slot="radio-button-control"]:focus-visible
5986
6644
  ) {
5987
- border-radius: calc(var(--nk-radius-md) - var(--nk-space));
6645
+ border-radius: calc(var(--nk-radius-lg) - var(--nk-space));
5988
6646
  outline: var(--nk-focus-width) solid var(--nk-color-focus);
5989
6647
  outline-offset: calc(var(--nk-focus-offset) * -1);
5990
6648
  }
@@ -6005,7 +6663,7 @@
6005
6663
  --lexxy-color-ink-lightest: var(--nk-color-muted);
6006
6664
  --lexxy-color-selected: var(--nk-color-muted);
6007
6665
  --lexxy-color-selected-hover: var(--nk-color-border);
6008
- --lexxy-radius: var(--nk-radius-md);
6666
+ --lexxy-radius: var(--nk-radius-lg);
6009
6667
  display: block;
6010
6668
  inline-size: 100%;
6011
6669
  }
@@ -6024,7 +6682,7 @@
6024
6682
  > [data-slot="rich-text-area-editor"]
6025
6683
  > [aria-invalid="true"]
6026
6684
  ) {
6027
- border-color: var(--nk-color-danger);
6685
+ border-color: var(--nk-color-destructive);
6028
6686
  }
6029
6687
  }
6030
6688
 
@@ -6040,13 +6698,15 @@
6040
6698
  grid-area: 1 / 1;
6041
6699
  inline-size: 100%;
6042
6700
  min-block-size: var(--nk-control-height-md);
6043
- padding-inline: calc(var(--nk-space) * 3) calc(var(--nk-space) * 9);
6701
+ padding-inline: var(--nk-control-padding-inline)
6702
+ calc(var(--nk-control-padding-inline) * 2 + var(--nk-space) * 4);
6044
6703
  color: inherit;
6045
6704
  font: inherit;
6705
+ font-size: var(--nk-text-base);
6046
6706
  appearance: none;
6047
6707
  background: var(--nk-color-surface);
6048
6708
  border: var(--nk-border-width) solid var(--nk-color-border);
6049
- border-radius: var(--nk-radius-md);
6709
+ border-radius: var(--nk-radius-lg);
6050
6710
  transition:
6051
6711
  border-color var(--nk-duration-normal) var(--nk-ease),
6052
6712
  box-shadow var(--nk-duration-normal) var(--nk-ease);
@@ -6056,9 +6716,9 @@
6056
6716
  grid-area: 1 / 1;
6057
6717
  align-self: center;
6058
6718
  justify-self: end;
6059
- inline-size: 1rem;
6060
- block-size: 1rem;
6061
- margin-inline-end: calc(var(--nk-space) * 3);
6719
+ inline-size: calc(var(--nk-space) * 4);
6720
+ block-size: calc(var(--nk-space) * 4);
6721
+ margin-inline-end: var(--nk-control-padding-inline);
6062
6722
  color: var(--nk-color-muted-foreground);
6063
6723
  pointer-events: none;
6064
6724
  }
@@ -6070,9 +6730,23 @@
6070
6730
 
6071
6731
  :where([data-nk="select"] > [data-slot="select-control"][multiple]) {
6072
6732
  min-block-size: calc(var(--nk-control-height-md) * 3);
6073
- padding: calc(var(--nk-space) * 2) calc(var(--nk-space) * 3);
6733
+ padding-block: calc(var(--nk-space) * 2);
6734
+ padding-inline: var(--nk-control-padding-inline);
6074
6735
  appearance: auto;
6075
6736
  }
6737
+
6738
+ /* Matches the Input width split. */
6739
+ @media (min-width: 48rem) {
6740
+ :where([data-nk="select"] > [data-slot="select-control"]) {
6741
+ font-size: var(--nk-text-sm);
6742
+ }
6743
+ }
6744
+
6745
+ @media (prefers-reduced-motion: reduce) {
6746
+ :where([data-nk="select"] > [data-slot="select-control"]) {
6747
+ transition-duration: 0.01ms;
6748
+ }
6749
+ }
6076
6750
  }
6077
6751
 
6078
6752
  @layer nitro-kit.state {
@@ -6083,13 +6757,13 @@
6083
6757
 
6084
6758
  :where([data-nk="select"] > [data-slot="select-control"]:disabled) {
6085
6759
  cursor: not-allowed;
6086
- opacity: 0.6;
6760
+ opacity: var(--nk-disabled-opacity);
6087
6761
  }
6088
6762
 
6089
6763
  :where(
6090
6764
  [data-nk="select"] > [data-slot="select-control"][aria-invalid="true"]
6091
6765
  ) {
6092
- border-color: var(--nk-color-danger);
6766
+ border-color: var(--nk-color-destructive);
6093
6767
  }
6094
6768
  }
6095
6769
 
@@ -6100,25 +6774,25 @@
6100
6774
  grid-template-columns: minmax(10rem, 14rem) minmax(0, 1fr);
6101
6775
  gap: calc(var(--nk-space) * 6);
6102
6776
  align-items: start;
6103
- min-width: 0;
6777
+ min-inline-size: 0;
6104
6778
  }
6105
6779
 
6106
6780
  :where(
6107
6781
  [data-nk="settings-layout"] > [data-slot="settings-layout-navigation"],
6108
6782
  [data-nk="settings-layout"] > [data-slot="settings-layout-content"]
6109
6783
  ) {
6110
- min-width: 0;
6784
+ min-inline-size: 0;
6111
6785
  }
6112
6786
 
6113
6787
  :where([data-nk="settings-layout"] [data-slot="settings-layout-items"]) {
6114
6788
  display: flex;
6115
6789
  flex-direction: column;
6116
6790
  gap: var(--nk-space);
6117
- min-width: 0;
6791
+ min-inline-size: 0;
6118
6792
  }
6119
6793
 
6120
6794
  :where([data-nk="settings-layout"] [data-slot="settings-layout-item"]) {
6121
- min-width: 0;
6795
+ min-inline-size: 0;
6122
6796
  }
6123
6797
 
6124
6798
  :where([data-nk="settings-layout"] [data-slot="settings-layout-item-link"]) {
@@ -6132,7 +6806,7 @@
6132
6806
  font-weight: var(--nk-font-weight-medium);
6133
6807
  line-height: var(--nk-leading-tight);
6134
6808
  text-decoration: none;
6135
- border-radius: var(--nk-radius-md);
6809
+ border-radius: var(--nk-radius-lg);
6136
6810
  transition:
6137
6811
  color var(--nk-duration-normal) var(--nk-ease),
6138
6812
  background-color var(--nk-duration-normal) var(--nk-ease);
@@ -6216,8 +6890,8 @@
6216
6890
  }
6217
6891
 
6218
6892
  :where([data-nk="settings-section"] [data-slot="settings-section-title"]) {
6219
- font-size: var(--nk-text-xl);
6220
- font-weight: var(--nk-font-weight-bold);
6893
+ font-size: var(--nk-title-section-size);
6894
+ font-weight: var(--nk-title-section-weight);
6221
6895
  line-height: var(--nk-leading-tight);
6222
6896
  text-wrap: balance;
6223
6897
  }
@@ -6294,7 +6968,7 @@
6294
6968
  position: fixed;
6295
6969
  inset-block: 0;
6296
6970
  max-block-size: none;
6297
- height: 100dvh;
6971
+ block-size: 100dvh;
6298
6972
  margin-block: 0;
6299
6973
  padding: calc(var(--nk-space) * 6);
6300
6974
  overflow: auto;
@@ -6315,15 +6989,15 @@
6315
6989
  }
6316
6990
 
6317
6991
  :where([data-nk="sheet"][data-size="sm"] > [data-slot="sheet-panel"]) {
6318
- width: min(calc(100% - (var(--nk-space) * 8)), 20rem);
6992
+ inline-size: min(calc(100% - (var(--nk-space) * 8)), 20rem);
6319
6993
  }
6320
6994
 
6321
6995
  :where([data-nk="sheet"][data-size="md"] > [data-slot="sheet-panel"]) {
6322
- width: min(calc(100% - (var(--nk-space) * 8)), 28rem);
6996
+ inline-size: min(calc(100% - (var(--nk-space) * 8)), 28rem);
6323
6997
  }
6324
6998
 
6325
6999
  :where([data-nk="sheet"][data-size="lg"] > [data-slot="sheet-panel"]) {
6326
- width: min(calc(100% - (var(--nk-space) * 8)), 40rem);
7000
+ inline-size: min(calc(100% - (var(--nk-space) * 8)), 40rem);
6327
7001
  }
6328
7002
 
6329
7003
  :where([data-nk="sheet"] > [data-slot="sheet-panel"])::backdrop {
@@ -6339,8 +7013,8 @@
6339
7013
 
6340
7014
  :where([data-nk="sheet"] [data-slot="sheet-title"]) {
6341
7015
  padding-inline-end: calc(var(--nk-space) * 10);
6342
- font-size: var(--nk-text-lg);
6343
- font-weight: var(--nk-font-weight-bold);
7016
+ font-size: var(--nk-title-surface-size);
7017
+ font-weight: var(--nk-title-surface-weight);
6344
7018
  line-height: var(--nk-leading-tight);
6345
7019
  }
6346
7020
 
@@ -6363,13 +7037,13 @@
6363
7037
  :where(
6364
7038
  [data-nk="sheet"][data-side="left"] > [data-slot="sheet-panel"][open]
6365
7039
  ) {
6366
- --_nk-sheet-from: -1rem;
7040
+ --_nk-sheet-from: calc(var(--nk-space) * -4);
6367
7041
  }
6368
7042
 
6369
7043
  :where(
6370
7044
  [data-nk="sheet"][data-side="right"] > [data-slot="sheet-panel"][open]
6371
7045
  ) {
6372
- --_nk-sheet-from: 1rem;
7046
+ --_nk-sheet-from: calc(var(--nk-space) * 4);
6373
7047
  }
6374
7048
 
6375
7049
  /* Sides are logical, but translateX is physical; RTL flips the slide so the
@@ -6378,14 +7052,14 @@
6378
7052
  [data-nk="sheet"][data-side="left"]:dir(rtl)
6379
7053
  > [data-slot="sheet-panel"][open]
6380
7054
  ) {
6381
- --_nk-sheet-from: 1rem;
7055
+ --_nk-sheet-from: calc(var(--nk-space) * 4);
6382
7056
  }
6383
7057
 
6384
7058
  :where(
6385
7059
  [data-nk="sheet"][data-side="right"]:dir(rtl)
6386
7060
  > [data-slot="sheet-panel"][open]
6387
7061
  ) {
6388
- --_nk-sheet-from: -1rem;
7062
+ --_nk-sheet-from: calc(var(--nk-space) * -4);
6389
7063
  }
6390
7064
 
6391
7065
  @keyframes nk-sheet-enter {
@@ -6430,7 +7104,7 @@
6430
7104
  display: grid;
6431
7105
  align-content: start;
6432
7106
  gap: calc(var(--nk-space) * 2);
6433
- min-height: 100%;
7107
+ min-block-size: 100%;
6434
7108
  padding: calc(var(--nk-space) * 5);
6435
7109
  background: var(--nk-color-surface);
6436
7110
  border: var(--nk-border-width) solid var(--nk-color-border);
@@ -6462,11 +7136,31 @@
6462
7136
 
6463
7137
  /* Source: src/stylesheets/nitro_kit/components/switch.css */
6464
7138
  @layer nitro-kit.base {
7139
+ /* Four declared inputs; everything else derives. The block heights ride the
7140
+ control ramp, the track is the block plus the handle's travel, and the
7141
+ handle inset is whatever centers it inside the bordered track. */
6465
7142
  :where([data-nk="switch"]) {
7143
+ --_nk-switch-block-size: var(--nk-control-height-xs);
7144
+ --_nk-switch-handle-size: calc(var(--nk-space) * 4);
7145
+ --_nk-switch-travel: calc(var(--nk-space) * 4);
7146
+ --_nk-switch-track-size: calc(
7147
+ var(--_nk-switch-block-size) + var(--_nk-switch-travel)
7148
+ );
7149
+ --_nk-switch-pad: calc(
7150
+ (var(--_nk-switch-block-size) - var(--_nk-switch-handle-size)) / 2 -
7151
+ var(--nk-border-width)
7152
+ );
7153
+
6466
7154
  display: inline-grid;
6467
7155
  color: var(--nk-color-foreground);
6468
7156
  }
6469
7157
 
7158
+ :where([data-nk="switch"][data-size="lg"]) {
7159
+ --_nk-switch-block-size: var(--nk-control-height-sm);
7160
+ --_nk-switch-handle-size: calc(var(--nk-space) * 6);
7161
+ --_nk-switch-travel: calc(var(--nk-space) * 5);
7162
+ }
7163
+
6470
7164
  :where([data-nk="switch"] > [data-slot="switch-label"]) {
6471
7165
  display: grid;
6472
7166
  grid-template-columns: auto minmax(0, 1fr);
@@ -6485,8 +7179,8 @@
6485
7179
 
6486
7180
  :where([data-nk="switch"] [data-slot="switch-control"]) {
6487
7181
  z-index: 1;
6488
- inline-size: 2.5rem;
6489
- block-size: 1.5rem;
7182
+ inline-size: var(--_nk-switch-track-size);
7183
+ block-size: var(--_nk-switch-block-size);
6490
7184
  margin: 0;
6491
7185
  cursor: pointer;
6492
7186
  appearance: none;
@@ -6496,9 +7190,9 @@
6496
7190
  :where([data-nk="switch"] [data-slot="switch-track"]) {
6497
7191
  display: flex;
6498
7192
  align-items: center;
6499
- inline-size: 2.5rem;
6500
- block-size: 1.5rem;
6501
- padding: 0.1875rem;
7193
+ inline-size: var(--_nk-switch-track-size);
7194
+ block-size: var(--_nk-switch-block-size);
7195
+ padding: var(--_nk-switch-pad);
6502
7196
  pointer-events: none;
6503
7197
  background: var(--nk-color-muted);
6504
7198
  border: var(--nk-border-width) solid var(--nk-color-border);
@@ -6508,28 +7202,15 @@
6508
7202
  border-color var(--nk-duration-normal) var(--nk-ease);
6509
7203
  }
6510
7204
 
6511
- :where(
6512
- [data-nk="switch"][data-size="lg"] [data-slot="switch-control"],
6513
- [data-nk="switch"][data-size="lg"] [data-slot="switch-track"]
6514
- ) {
6515
- inline-size: 3.25rem;
6516
- block-size: 2rem;
6517
- }
6518
-
6519
7205
  :where([data-nk="switch"] [data-slot="switch-handle"]) {
6520
- inline-size: 1rem;
6521
- block-size: 1rem;
7206
+ inline-size: var(--_nk-switch-handle-size);
7207
+ block-size: var(--_nk-switch-handle-size);
6522
7208
  background: var(--nk-color-surface);
6523
7209
  border-radius: var(--nk-radius-full);
6524
7210
  box-shadow: var(--nk-shadow-sm);
6525
7211
  transition: transform var(--nk-duration-normal) var(--nk-ease);
6526
7212
  }
6527
7213
 
6528
- :where([data-nk="switch"][data-size="lg"] [data-slot="switch-handle"]) {
6529
- inline-size: 1.5rem;
6530
- block-size: 1.5rem;
6531
- }
6532
-
6533
7214
  :where([data-nk="switch"] [data-slot="switch-label-text"]) {
6534
7215
  display: block;
6535
7216
  grid-column: 2;
@@ -6538,18 +7219,14 @@
6538
7219
  :where([data-nk="switch"] > [data-slot="switch-description"]) {
6539
7220
  display: block;
6540
7221
  margin-block-start: var(--nk-space);
6541
- padding-inline-start: calc(2.5rem + (var(--nk-space) * 3));
7222
+ padding-inline-start: calc(
7223
+ var(--_nk-switch-track-size) + (var(--nk-space) * 3)
7224
+ );
6542
7225
  color: var(--nk-color-muted-foreground);
6543
7226
  font-size: var(--nk-text-sm);
6544
7227
  font-weight: var(--nk-font-weight-normal);
6545
7228
  text-wrap: pretty;
6546
7229
  }
6547
-
6548
- :where(
6549
- [data-nk="switch"][data-size="lg"] > [data-slot="switch-description"]
6550
- ) {
6551
- padding-inline-start: calc(3.25rem + (var(--nk-space) * 3));
6552
- }
6553
7230
  }
6554
7231
 
6555
7232
  @layer nitro-kit.state {
@@ -6568,16 +7245,7 @@
6568
7245
  + [data-slot="switch-track"]
6569
7246
  > [data-slot="switch-handle"]
6570
7247
  ) {
6571
- transform: translateX(1rem);
6572
- }
6573
-
6574
- :where(
6575
- [data-nk="switch"][data-size="lg"]
6576
- [data-slot="switch-control"]:checked
6577
- + [data-slot="switch-track"]
6578
- > [data-slot="switch-handle"]
6579
- ) {
6580
- transform: translateX(1.25rem);
7248
+ transform: translateX(var(--_nk-switch-travel));
6581
7249
  }
6582
7250
 
6583
7251
  :where(
@@ -6591,19 +7259,19 @@
6591
7259
 
6592
7260
  :where([data-nk="switch"][data-disabled="true"]) {
6593
7261
  cursor: not-allowed;
6594
- opacity: 0.6;
7262
+ opacity: var(--nk-disabled-opacity);
6595
7263
  }
6596
7264
 
6597
7265
  /* The server error describes the submitted value. Once the user toggles the
6598
7266
  control and it satisfies its own constraints the error is stale, so the
6599
- danger border stands down. `:user-valid` never matches before the user
7267
+ destructive border stands down. `:user-valid` never matches before the user
6600
7268
  touches the control, so an untouched invalid switch keeps its border. */
6601
7269
  :where(
6602
7270
  [data-nk="switch"]
6603
7271
  [data-slot="switch-control"][aria-invalid="true"]:not(:user-valid)
6604
7272
  + [data-slot="switch-track"]
6605
7273
  ) {
6606
- border-color: var(--nk-color-danger);
7274
+ border-color: var(--nk-color-destructive);
6607
7275
  }
6608
7276
  }
6609
7277
 
@@ -6673,9 +7341,14 @@
6673
7341
  text-decoration: none;
6674
7342
  }
6675
7343
 
7344
+ /* Half-strength through the color channel rather than opacity, so the
7345
+ dimming is one declaration and never cascades into descendants. */
6676
7346
  :where([data-nk="table"] [data-slot="table-sort-indicator"]) {
6677
- color: var(--nk-color-muted-foreground);
6678
- opacity: 0.5;
7347
+ color: color-mix(
7348
+ in oklab,
7349
+ var(--nk-color-muted-foreground) 50%,
7350
+ transparent
7351
+ );
6679
7352
  }
6680
7353
  }
6681
7354
 
@@ -6701,7 +7374,6 @@
6701
7374
  [data-slot="table-sort-indicator"]
6702
7375
  ) {
6703
7376
  color: var(--nk-color-primary);
6704
- opacity: 1;
6705
7377
  }
6706
7378
 
6707
7379
  @media (hover: hover) {
@@ -6714,7 +7386,7 @@
6714
7386
  [data-slot="table-sort"]:hover
6715
7387
  [data-slot="table-sort-indicator"]
6716
7388
  ) {
6717
- opacity: 1;
7389
+ color: var(--nk-color-muted-foreground);
6718
7390
  }
6719
7391
  }
6720
7392
 
@@ -6780,6 +7452,10 @@
6780
7452
  padding-block: calc(var(--nk-space) * 4);
6781
7453
  line-height: var(--nk-leading-normal);
6782
7454
  }
7455
+
7456
+ :where([data-nk="tabs"] > [data-slot="tabs-panel"][hidden="until-found"]) {
7457
+ padding-block: 0;
7458
+ }
6783
7459
  }
6784
7460
 
6785
7461
  @layer nitro-kit.variant {
@@ -6872,7 +7548,7 @@
6872
7548
  ) {
6873
7549
  color: var(--nk-color-muted-foreground);
6874
7550
  cursor: not-allowed;
6875
- opacity: 0.55;
7551
+ opacity: var(--nk-disabled-opacity);
6876
7552
  }
6877
7553
 
6878
7554
  @media (prefers-reduced-motion: reduce) {
@@ -6889,19 +7565,34 @@
6889
7565
  :where([data-nk="textarea"]) {
6890
7566
  display: block;
6891
7567
  inline-size: 100%;
6892
- min-block-size: 6rem;
6893
- padding: calc(var(--nk-space) * 2) calc(var(--nk-space) * 3);
7568
+ min-block-size: calc(var(--nk-space) * 24);
7569
+ padding-block: calc(var(--nk-space) * 2);
7570
+ padding-inline: var(--nk-control-padding-inline);
6894
7571
  color: var(--nk-color-foreground);
6895
7572
  font: inherit;
7573
+ font-size: var(--nk-text-base);
6896
7574
  line-height: var(--nk-leading-normal);
6897
7575
  resize: vertical;
6898
7576
  background: var(--nk-color-surface);
6899
7577
  border: var(--nk-border-width) solid var(--nk-color-border);
6900
- border-radius: var(--nk-radius-md);
7578
+ border-radius: var(--nk-radius-lg);
6901
7579
  transition:
6902
7580
  border-color var(--nk-duration-normal) var(--nk-ease),
6903
7581
  box-shadow var(--nk-duration-normal) var(--nk-ease);
6904
7582
  }
7583
+
7584
+ /* Matches the Input width split. */
7585
+ @media (min-width: 48rem) {
7586
+ :where([data-nk="textarea"]) {
7587
+ font-size: var(--nk-text-sm);
7588
+ }
7589
+ }
7590
+
7591
+ @media (prefers-reduced-motion: reduce) {
7592
+ :where([data-nk="textarea"]) {
7593
+ transition-duration: 0.01ms;
7594
+ }
7595
+ }
6905
7596
  }
6906
7597
 
6907
7598
  @layer nitro-kit.state {
@@ -6917,11 +7608,11 @@
6917
7608
 
6918
7609
  :where([data-nk="textarea"]:disabled) {
6919
7610
  cursor: not-allowed;
6920
- opacity: 0.6;
7611
+ opacity: var(--nk-disabled-opacity);
6921
7612
  }
6922
7613
 
6923
7614
  :where([data-nk="textarea"][aria-invalid="true"]) {
6924
- border-color: var(--nk-color-danger);
7615
+ border-color: var(--nk-color-destructive);
6925
7616
  }
6926
7617
  }
6927
7618
 
@@ -6938,7 +7629,7 @@
6938
7629
  inset-block-end: calc(var(--nk-space) * 5);
6939
7630
  display: flex;
6940
7631
  flex-direction: column;
6941
- inline-size: min(26rem, calc(100vw - (var(--nk-space) * 10)));
7632
+ inline-size: min(26rem, calc(100% - (var(--nk-space) * 10)));
6942
7633
  gap: calc(var(--nk-space) * 3);
6943
7634
  margin: 0;
6944
7635
  padding: 0;
@@ -6961,7 +7652,7 @@
6961
7652
  background: var(--_nk-toast-background);
6962
7653
  border: var(--nk-border-width) solid var(--_nk-toast-border);
6963
7654
  border-radius: var(--nk-radius-lg);
6964
- box-shadow: var(--nk-shadow-lg);
7655
+ box-shadow: var(--nk-shadow-md);
6965
7656
  transition:
6966
7657
  opacity var(--nk-duration-normal) var(--nk-ease),
6967
7658
  transform var(--nk-duration-normal) var(--nk-ease);
@@ -6975,8 +7666,8 @@
6975
7666
  }
6976
7667
 
6977
7668
  :where([data-nk="toast-item"] [data-slot="toast-item-title"]) {
6978
- font-size: var(--nk-text-sm);
6979
- font-weight: var(--nk-font-weight-semibold);
7669
+ font-size: var(--nk-title-compact-size);
7670
+ font-weight: var(--nk-title-compact-weight);
6980
7671
  line-height: var(--nk-leading-tight);
6981
7672
  text-wrap: balance;
6982
7673
  }
@@ -6994,60 +7685,13 @@
6994
7685
  }
6995
7686
 
6996
7687
  @layer nitro-kit.variant {
6997
- :where([data-nk="toast-item"][data-variant="info"]) {
6998
- --_nk-toast-background: color-mix(
6999
- in oklab,
7000
- var(--nk-color-info) 10%,
7001
- var(--nk-color-surface)
7002
- );
7003
- --_nk-toast-foreground: var(--nk-color-info-content);
7004
- --_nk-toast-border: color-mix(
7005
- in oklab,
7006
- var(--nk-color-info) 45%,
7007
- transparent
7008
- );
7009
- }
7010
-
7011
- :where([data-nk="toast-item"][data-variant="success"]) {
7012
- --_nk-toast-background: color-mix(
7013
- in oklab,
7014
- var(--nk-color-success) 10%,
7015
- var(--nk-color-surface)
7016
- );
7017
- --_nk-toast-foreground: var(--nk-color-success-content);
7018
- --_nk-toast-border: color-mix(
7019
- in oklab,
7020
- var(--nk-color-success) 45%,
7021
- transparent
7022
- );
7023
- }
7024
-
7025
- :where([data-nk="toast-item"][data-variant="warning"]) {
7026
- --_nk-toast-background: color-mix(
7027
- in oklab,
7028
- var(--nk-color-warning) 10%,
7029
- var(--nk-color-surface)
7030
- );
7031
- --_nk-toast-foreground: var(--nk-color-warning-content);
7032
- --_nk-toast-border: color-mix(
7033
- in oklab,
7034
- var(--nk-color-warning) 45%,
7035
- transparent
7036
- );
7037
- }
7038
-
7039
- :where([data-nk="toast-item"][data-variant="error"]) {
7040
- --_nk-toast-background: color-mix(
7041
- in oklab,
7042
- var(--nk-color-danger) 10%,
7043
- var(--nk-color-surface)
7044
- );
7045
- --_nk-toast-foreground: var(--nk-color-danger-content);
7046
- --_nk-toast-border: color-mix(
7047
- in oklab,
7048
- var(--nk-color-danger) 45%,
7049
- transparent
7050
- );
7688
+ /* Colour, tint strength, and appearance switching all come from the shared
7689
+ semantic palette, so a Toast and an Alert of the same variant render
7690
+ identically. */
7691
+ :where([data-nk="toast-item"][data-variant]) {
7692
+ --_nk-toast-background: var(--_nk-semantic-surface);
7693
+ --_nk-toast-border: var(--_nk-semantic-border);
7694
+ --_nk-toast-foreground: var(--_nk-semantic-content);
7051
7695
  }
7052
7696
  }
7053
7697
 
@@ -7073,7 +7717,7 @@
7073
7717
  @layer nitro-kit.base {
7074
7718
  :where([data-nk="toolbar"]) {
7075
7719
  display: flex;
7076
- min-width: 0;
7720
+ min-inline-size: 0;
7077
7721
  flex-wrap: wrap;
7078
7722
  align-items: center;
7079
7723
  justify-content: space-between;
@@ -7085,7 +7729,7 @@
7085
7729
  [data-nk="toolbar"] > [data-slot="toolbar-trailing"]
7086
7730
  ) {
7087
7731
  display: flex;
7088
- min-width: 0;
7732
+ min-inline-size: 0;
7089
7733
  /* Regions never exceed the toolbar, so nested content such as a
7090
7734
  scrolling ButtonGroup receives real width pressure when stacked. */
7091
7735
  max-inline-size: 100%;
@@ -7135,6 +7779,10 @@
7135
7779
  position: absolute;
7136
7780
  z-index: 50;
7137
7781
  inline-size: max-content;
7782
+ /* Absolutely positioned inside its wrapper, so a percentage would resolve
7783
+ against the trigger, not the viewport. 100vw can overshoot by a classic
7784
+ scrollbar's width, but only below a 22.5rem viewport, where scrollbars
7785
+ overlay. The fixed overlays use 100% of the initial containing block. */
7138
7786
  max-inline-size: min(20rem, calc(100vw - (var(--nk-space) * 8)));
7139
7787
  padding: calc(var(--nk-space) * 1.5) calc(var(--nk-space) * 2.5);
7140
7788
  color: var(--nk-color-foreground);
@@ -7364,7 +8012,7 @@
7364
8012
  border-radius: var(--nk-radius-sm);
7365
8013
  }
7366
8014
  :where([data-nk="typeset"]) > table:not([data-nk], [data-typeset="off"]) {
7367
- width: 100%;
8015
+ inline-size: 100%;
7368
8016
  border-collapse: collapse;
7369
8017
  font-size: 0.925em;
7370
8018
  }
@@ -7508,7 +8156,7 @@
7508
8156
  }
7509
8157
 
7510
8158
  table {
7511
- width: 100%;
8159
+ inline-size: 100%;
7512
8160
  border-collapse: collapse;
7513
8161
  font-size: 0.925em;
7514
8162
  }
@@ -7525,8 +8173,8 @@
7525
8173
  }
7526
8174
 
7527
8175
  :where(img, video, svg) {
7528
- max-width: 100%;
7529
- height: auto;
8176
+ max-inline-size: 100%;
8177
+ block-size: auto;
7530
8178
  border-radius: var(--nk-radius-md);
7531
8179
  }
7532
8180