nitro_kit 2.0.0.alpha.3 → 2.0.0.alpha.5

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 (101) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +194 -0
  3. data/README.md +34 -23
  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 +85 -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 +33 -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 +19 -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/.codex-plugin/plugin.json +4 -4
  41. data/plugins/nitro-kit/skills/nitro-kit-hotwire/SKILL.md +12 -0
  42. data/plugins/nitro-kit/skills/nitro-kit-hotwire/agents/openai.yaml +1 -1
  43. data/plugins/nitro-kit/skills/nitro-kit-rails/SKILL.md +22 -0
  44. data/plugins/nitro-kit/skills/nitro-kit-rails/agents/openai.yaml +1 -1
  45. data/plugins/nitro-kit/skills/nitro-kit-ui/SKILL.md +33 -11
  46. data/plugins/nitro-kit/skills/nitro-kit-ui/agents/openai.yaml +1 -1
  47. data/src/stylesheets/nitro_kit/components/accordion.css +4 -4
  48. data/src/stylesheets/nitro_kit/components/alert.css +20 -29
  49. data/src/stylesheets/nitro_kit/components/app_navigation.css +74 -2
  50. data/src/stylesheets/nitro_kit/components/app_shell.css +3 -3
  51. data/src/stylesheets/nitro_kit/components/appearance_picker.css +20 -8
  52. data/src/stylesheets/nitro_kit/components/auth_shell.css +2 -2
  53. data/src/stylesheets/nitro_kit/components/avatar.css +12 -8
  54. data/src/stylesheets/nitro_kit/components/avatar_stack.css +12 -10
  55. data/src/stylesheets/nitro_kit/components/badge.css +13 -9
  56. data/src/stylesheets/nitro_kit/components/button.css +42 -25
  57. data/src/stylesheets/nitro_kit/components/card.css +2 -2
  58. data/src/stylesheets/nitro_kit/components/checkbox.css +29 -46
  59. data/src/stylesheets/nitro_kit/components/checkbox_group.css +3 -3
  60. data/src/stylesheets/nitro_kit/components/combobox.css +6 -6
  61. data/src/stylesheets/nitro_kit/components/command_palette.css +62 -4
  62. data/src/stylesheets/nitro_kit/components/container.css +6 -6
  63. data/src/stylesheets/nitro_kit/components/control_group.css +9 -9
  64. data/src/stylesheets/nitro_kit/components/danger_zone.css +6 -6
  65. data/src/stylesheets/nitro_kit/components/data_section.css +4 -4
  66. data/src/stylesheets/nitro_kit/components/details_table.css +7 -5
  67. data/src/stylesheets/nitro_kit/components/dialog.css +3 -3
  68. data/src/stylesheets/nitro_kit/components/dropdown.css +7 -7
  69. data/src/stylesheets/nitro_kit/components/dropzone.css +7 -7
  70. data/src/stylesheets/nitro_kit/components/empty_state.css +4 -4
  71. data/src/stylesheets/nitro_kit/components/field.css +2 -2
  72. data/src/stylesheets/nitro_kit/components/fieldset.css +2 -2
  73. data/src/stylesheets/nitro_kit/components/flex.css +1 -1
  74. data/src/stylesheets/nitro_kit/components/grid.css +1 -1
  75. data/src/stylesheets/nitro_kit/components/icon.css +5 -5
  76. data/src/stylesheets/nitro_kit/components/input.css +33 -6
  77. data/src/stylesheets/nitro_kit/components/page_header.css +4 -4
  78. data/src/stylesheets/nitro_kit/components/pagination.css +3 -3
  79. data/src/stylesheets/nitro_kit/components/pagination_bar.css +2 -2
  80. data/src/stylesheets/nitro_kit/components/palette.css +140 -72
  81. data/src/stylesheets/nitro_kit/components/progressive_image.css +1 -1
  82. data/src/stylesheets/nitro_kit/components/radio_button.css +28 -33
  83. data/src/stylesheets/nitro_kit/components/radio_button_group.css +6 -6
  84. data/src/stylesheets/nitro_kit/components/rich_text_area.css +2 -2
  85. data/src/stylesheets/nitro_kit/components/select.css +24 -8
  86. data/src/stylesheets/nitro_kit/components/settings_layout.css +5 -5
  87. data/src/stylesheets/nitro_kit/components/settings_section.css +2 -2
  88. data/src/stylesheets/nitro_kit/components/sheet.css +10 -10
  89. data/src/stylesheets/nitro_kit/components/stat_grid.css +1 -1
  90. data/src/stylesheets/nitro_kit/components/switch.css +34 -40
  91. data/src/stylesheets/nitro_kit/components/table.css +8 -4
  92. data/src/stylesheets/nitro_kit/components/tabs.css +5 -1
  93. data/src/stylesheets/nitro_kit/components/textarea.css +20 -5
  94. data/src/stylesheets/nitro_kit/components/toast.css +11 -58
  95. data/src/stylesheets/nitro_kit/components/toolbar.css +2 -2
  96. data/src/stylesheets/nitro_kit/components/tooltip.css +4 -0
  97. data/src/stylesheets/nitro_kit/components/typeset.css +4 -4
  98. data/src/stylesheets/nitro_kit/reset.css +6 -6
  99. data/src/stylesheets/nitro_kit/tokens.css +497 -74
  100. metadata +1 -2
  101. data/docs/new_app_strategy.md +0 -22
@@ -1,113 +1,181 @@
1
+ /* The semantic palette shared by Badge, Alert, and Toast.
2
+ *
3
+ * Every family resolves through the public `--nk-palette-*` tint axis, which
4
+ * samples the color scales and is already appearance-aware, so a component
5
+ * never restates a hue. Semantic families default to the same steps as their
6
+ * hue families -- `info` renders exactly like `blue` -- and an application
7
+ * that rethemes a tint role moves all three components at once. `-content`
8
+ * carries the paired foreground; the base role carries the tinting accent.
9
+ *
10
+ * Alert and Toast are the same kind of thing — a status message — so they also
11
+ * share one tinted surface and border. Only the components that own a different
12
+ * job, such as Badge's compact label, set their own tint strength.
13
+ */
1
14
  @layer nitro-kit.variant {
2
15
  :where(
3
- [data-nk="badge"][data-color="zinc"],
4
16
  [data-nk="badge"][data-color="neutral"],
5
- [data-nk="alert"][data-variant="default"]
17
+ [data-nk="alert"][data-variant="default"],
18
+ [data-nk="toast-item"][data-variant="default"]
6
19
  ) {
7
- --_nk-palette-light: oklch(37% 0.013 285.805);
8
- --_nk-palette-dark: oklch(92% 0.004 286.32);
9
- --_nk-palette-tint: oklch(70.5% 0.015 286.067);
20
+ --_nk-semantic-accent: var(--nk-palette-neutral);
21
+ --_nk-semantic-content: var(--nk-palette-neutral-content);
10
22
  }
11
23
 
12
24
  :where(
13
- [data-nk="badge"][data-color="red"],
14
- [data-nk="badge"][data-color="danger"],
15
- [data-nk="alert"][data-variant="error"]
25
+ [data-nk="badge"][data-color="info"],
26
+ [data-nk="alert"][data-variant="info"],
27
+ [data-nk="toast-item"][data-variant="info"]
16
28
  ) {
17
- --_nk-palette-light: oklch(50.5% 0.213 27.518);
18
- --_nk-palette-dark: oklch(88.5% 0.062 18.334);
19
- --_nk-palette-tint: oklch(70.4% 0.191 22.216);
29
+ --_nk-semantic-accent: var(--nk-palette-info);
30
+ --_nk-semantic-content: var(--nk-palette-info-content);
20
31
  }
21
- :where([data-nk="badge"][data-color="orange"]) {
22
- --_nk-palette-light: oklch(55.3% 0.195 38.402);
23
- --_nk-palette-dark: oklch(90.1% 0.076 70.697);
24
- --_nk-palette-tint: oklch(75% 0.183 55.934);
32
+
33
+ :where(
34
+ [data-nk="badge"][data-color="success"],
35
+ [data-nk="alert"][data-variant="success"],
36
+ [data-nk="toast-item"][data-variant="success"]
37
+ ) {
38
+ --_nk-semantic-accent: var(--nk-palette-success);
39
+ --_nk-semantic-content: var(--nk-palette-success-content);
25
40
  }
41
+
26
42
  :where(
27
- [data-nk="badge"][data-color="amber"],
28
43
  [data-nk="badge"][data-color="warning"],
29
- [data-nk="alert"][data-variant="warning"]
44
+ [data-nk="alert"][data-variant="warning"],
45
+ [data-nk="toast-item"][data-variant="warning"]
46
+ ) {
47
+ --_nk-semantic-accent: var(--nk-palette-warning);
48
+ --_nk-semantic-content: var(--nk-palette-warning-content);
49
+ }
50
+
51
+ /* Action components and Alert say `destructive`; Toast announces `error`.
52
+ Both spellings resolve to the destructive family, and this is the only
53
+ place they meet. */
54
+ :where(
55
+ [data-nk="badge"][data-color="destructive"],
56
+ [data-nk="alert"][data-variant="destructive"],
57
+ [data-nk="toast-item"][data-variant="error"]
30
58
  ) {
31
- --_nk-palette-light: oklch(55% 0.163 48.998);
32
- --_nk-palette-dark: oklch(92.4% 0.12 95.746);
33
- --_nk-palette-tint: oklch(82.8% 0.189 84.429);
59
+ --_nk-semantic-accent: var(--nk-palette-destructive);
60
+ --_nk-semantic-content: var(--nk-palette-destructive-content);
61
+ }
62
+
63
+ /* The shared status treatment. Defined once so Alert and Toast cannot drift
64
+ apart again, and so a third status component inherits it by opting in. */
65
+ :where([data-nk="alert"], [data-nk="toast-item"]) {
66
+ --_nk-semantic-tint: 12%;
67
+ --_nk-semantic-surface: color-mix(
68
+ in oklab,
69
+ var(--_nk-semantic-accent) var(--_nk-semantic-tint),
70
+ var(--nk-color-surface)
71
+ );
72
+ --_nk-semantic-border: color-mix(
73
+ in oklab,
74
+ var(--_nk-semantic-accent) 45%,
75
+ transparent
76
+ );
77
+ }
78
+
79
+ /* Dark appearances need a stronger tint to separate the surface from the
80
+ page behind it. */
81
+ :where([data-theme="dark"])
82
+ :where([data-nk="alert"], [data-nk="toast-item"]) {
83
+ --_nk-semantic-tint: 20%;
84
+ }
85
+
86
+ @media (prefers-color-scheme: dark) {
87
+ :where(:root:not([data-theme]))
88
+ :where([data-nk="alert"], [data-nk="toast-item"]) {
89
+ --_nk-semantic-tint: 20%;
90
+ }
91
+ }
92
+
93
+ /* The decorative hues. These name a color rather than a meaning, so they
94
+ follow `--nk-palette-*` and stay put when an application rethemes its
95
+ semantic families. `red` and `destructive` are deliberately different: one is
96
+ a color, the other is whatever destructive currently means. */
97
+ :where([data-nk="badge"][data-color="red"]) {
98
+ --_nk-semantic-accent: var(--nk-palette-red);
99
+ --_nk-semantic-content: var(--nk-palette-red-content);
100
+ }
101
+
102
+ :where([data-nk="badge"][data-color="orange"]) {
103
+ --_nk-semantic-accent: var(--nk-palette-orange);
104
+ --_nk-semantic-content: var(--nk-palette-orange-content);
34
105
  }
106
+
107
+ :where([data-nk="badge"][data-color="amber"]) {
108
+ --_nk-semantic-accent: var(--nk-palette-amber);
109
+ --_nk-semantic-content: var(--nk-palette-amber-content);
110
+ }
111
+
35
112
  :where([data-nk="badge"][data-color="yellow"]) {
36
- --_nk-palette-light: oklch(47.6% 0.114 61.907);
37
- --_nk-palette-dark: oklch(94.5% 0.129 101.54);
38
- --_nk-palette-tint: oklch(85.2% 0.199 91.936);
113
+ --_nk-semantic-accent: var(--nk-palette-yellow);
114
+ --_nk-semantic-content: var(--nk-palette-yellow-content);
39
115
  }
116
+
40
117
  :where([data-nk="badge"][data-color="lime"]) {
41
- --_nk-palette-light: oklch(45.3% 0.124 130.933);
42
- --_nk-palette-dark: oklch(93.8% 0.127 124.321);
43
- --_nk-palette-tint: oklch(84.1% 0.238 128.85);
118
+ --_nk-semantic-accent: var(--nk-palette-lime);
119
+ --_nk-semantic-content: var(--nk-palette-lime-content);
44
120
  }
45
- :where(
46
- [data-nk="badge"][data-color="green"],
47
- [data-nk="badge"][data-color="success"],
48
- [data-nk="alert"][data-variant="success"]
49
- ) {
50
- --_nk-palette-light: oklch(44.8% 0.119 151.328);
51
- --_nk-palette-dark: oklch(92.5% 0.084 155.995);
52
- --_nk-palette-tint: oklch(79.2% 0.209 151.711);
121
+
122
+ :where([data-nk="badge"][data-color="green"]) {
123
+ --_nk-semantic-accent: var(--nk-palette-green);
124
+ --_nk-semantic-content: var(--nk-palette-green-content);
53
125
  }
126
+
54
127
  :where([data-nk="badge"][data-color="emerald"]) {
55
- --_nk-palette-light: oklch(43.2% 0.095 166.913);
56
- --_nk-palette-dark: oklch(90.5% 0.093 164.15);
57
- --_nk-palette-tint: oklch(76.5% 0.177 163.223);
128
+ --_nk-semantic-accent: var(--nk-palette-emerald);
129
+ --_nk-semantic-content: var(--nk-palette-emerald-content);
58
130
  }
131
+
59
132
  :where([data-nk="badge"][data-color="teal"]) {
60
- --_nk-palette-light: oklch(43.7% 0.078 188.216);
61
- --_nk-palette-dark: oklch(91% 0.096 180.426);
62
- --_nk-palette-tint: oklch(77.7% 0.152 181.912);
133
+ --_nk-semantic-accent: var(--nk-palette-teal);
134
+ --_nk-semantic-content: var(--nk-palette-teal-content);
63
135
  }
136
+
64
137
  :where([data-nk="badge"][data-color="cyan"]) {
65
- --_nk-palette-light: oklch(45% 0.085 224.283);
66
- --_nk-palette-dark: oklch(91.7% 0.08 205.041);
67
- --_nk-palette-tint: oklch(78.9% 0.154 211.53);
138
+ --_nk-semantic-accent: var(--nk-palette-cyan);
139
+ --_nk-semantic-content: var(--nk-palette-cyan-content);
68
140
  }
141
+
69
142
  :where([data-nk="badge"][data-color="sky"]) {
70
- --_nk-palette-light: oklch(44.3% 0.11 240.79);
71
- --_nk-palette-dark: oklch(90.1% 0.058 230.902);
72
- --_nk-palette-tint: oklch(74.6% 0.16 232.661);
143
+ --_nk-semantic-accent: var(--nk-palette-sky);
144
+ --_nk-semantic-content: var(--nk-palette-sky-content);
73
145
  }
74
- :where(
75
- [data-nk="badge"][data-color="blue"],
76
- [data-nk="badge"][data-color="info"],
77
- [data-nk="alert"][data-variant="info"]
78
- ) {
79
- --_nk-palette-light: oklch(42.4% 0.199 265.638);
80
- --_nk-palette-dark: oklch(88.2% 0.059 254.128);
81
- --_nk-palette-tint: oklch(70.7% 0.165 254.624);
146
+
147
+ :where([data-nk="badge"][data-color="blue"]) {
148
+ --_nk-semantic-accent: var(--nk-palette-blue);
149
+ --_nk-semantic-content: var(--nk-palette-blue-content);
82
150
  }
151
+
83
152
  :where([data-nk="badge"][data-color="indigo"]) {
84
- --_nk-palette-light: oklch(45.7% 0.24 277.023);
85
- --_nk-palette-dark: oklch(87% 0.065 274.039);
86
- --_nk-palette-tint: oklch(67.3% 0.182 276.935);
153
+ --_nk-semantic-accent: var(--nk-palette-indigo);
154
+ --_nk-semantic-content: var(--nk-palette-indigo-content);
87
155
  }
156
+
88
157
  :where([data-nk="badge"][data-color="violet"]) {
89
- --_nk-palette-light: oklch(49.1% 0.27 292.581);
90
- --_nk-palette-dark: oklch(89.4% 0.057 293.283);
91
- --_nk-palette-tint: oklch(70.2% 0.183 293.541);
158
+ --_nk-semantic-accent: var(--nk-palette-violet);
159
+ --_nk-semantic-content: var(--nk-palette-violet-content);
92
160
  }
161
+
93
162
  :where([data-nk="badge"][data-color="purple"]) {
94
- --_nk-palette-light: oklch(49.6% 0.265 301.924);
95
- --_nk-palette-dark: oklch(90.2% 0.063 306.703);
96
- --_nk-palette-tint: oklch(71.4% 0.203 305.504);
163
+ --_nk-semantic-accent: var(--nk-palette-purple);
164
+ --_nk-semantic-content: var(--nk-palette-purple-content);
97
165
  }
166
+
98
167
  :where([data-nk="badge"][data-color="fuchsia"]) {
99
- --_nk-palette-light: oklch(51.8% 0.253 323.949);
100
- --_nk-palette-dark: oklch(90.3% 0.076 319.62);
101
- --_nk-palette-tint: oklch(74% 0.238 322.16);
168
+ --_nk-semantic-accent: var(--nk-palette-fuchsia);
169
+ --_nk-semantic-content: var(--nk-palette-fuchsia-content);
102
170
  }
171
+
103
172
  :where([data-nk="badge"][data-color="pink"]) {
104
- --_nk-palette-light: oklch(52.5% 0.223 3.958);
105
- --_nk-palette-dark: oklch(89.9% 0.061 343.231);
106
- --_nk-palette-tint: oklch(71.8% 0.202 349.761);
173
+ --_nk-semantic-accent: var(--nk-palette-pink);
174
+ --_nk-semantic-content: var(--nk-palette-pink-content);
107
175
  }
176
+
108
177
  :where([data-nk="badge"][data-color="rose"]) {
109
- --_nk-palette-light: oklch(51.4% 0.222 16.935);
110
- --_nk-palette-dark: oklch(89.2% 0.058 10.001);
111
- --_nk-palette-tint: oklch(71.2% 0.194 13.428);
178
+ --_nk-semantic-accent: var(--nk-palette-rose);
179
+ --_nk-semantic-content: var(--nk-palette-rose-content);
112
180
  }
113
181
  }
@@ -47,7 +47,7 @@
47
47
  > [data-slot="progressive-image-placeholder"]
48
48
  ) {
49
49
  z-index: 1;
50
- filter: blur(1rem);
50
+ filter: blur(calc(var(--nk-space) * 4));
51
51
  opacity: 0;
52
52
  transform: scale(1.05);
53
53
  }
@@ -1,44 +1,37 @@
1
1
  @layer nitro-kit.base {
2
+ /* Every dimension derives from one choice size, matching Checkbox: the two
3
+ sizes are one rule apart and the dot keeps its proportion at either. The
4
+ dot previously stayed at its medium size inside a large radio; deriving it
5
+ scales it with the control. */
2
6
  :where([data-nk="radio-button"]) {
7
+ --_nk-choice-size: var(--nk-choice-size-md);
8
+
3
9
  display: inline-grid;
4
10
  min-inline-size: var(--nk-control-height-md);
5
11
  min-block-size: var(--nk-control-height-md);
6
12
  color: var(--nk-color-foreground);
7
13
  }
8
14
 
15
+ :where([data-nk="radio-button"][data-size="lg"]) {
16
+ --_nk-choice-size: var(--nk-choice-size-lg);
17
+ }
18
+
9
19
  :where([data-nk="radio-button"] > [data-slot="radio-button-label"]) {
10
20
  display: grid;
11
- grid-template-columns: 1.125rem minmax(0, 1fr);
21
+ grid-template-columns: var(--_nk-choice-size) minmax(0, 1fr);
12
22
  gap: calc(var(--nk-space) * 2);
13
23
  align-items: center;
14
24
  min-block-size: var(--nk-control-height-md);
15
25
  cursor: pointer;
16
26
  }
17
27
 
18
- :where(
19
- [data-nk="radio-button"][data-size="lg"]
20
- > [data-slot="radio-button-label"]
21
- ) {
22
- grid-template-columns: 1.5rem minmax(0, 1fr);
23
- }
24
-
25
28
  :where(
26
29
  [data-nk="radio-button"] [data-slot="radio-button-control"],
27
30
  [data-nk="radio-button"] [data-slot="radio-button-indicator"]
28
31
  ) {
29
32
  grid-area: 1 / 1;
30
- inline-size: 1.125rem;
31
- block-size: 1.125rem;
32
- }
33
-
34
- :where(
35
- [data-nk="radio-button"][data-size="lg"]
36
- [data-slot="radio-button-control"],
37
- [data-nk="radio-button"][data-size="lg"]
38
- [data-slot="radio-button-indicator"]
39
- ) {
40
- inline-size: 1.5rem;
41
- block-size: 1.5rem;
33
+ inline-size: var(--_nk-choice-size);
34
+ block-size: var(--_nk-choice-size);
42
35
  }
43
36
 
44
37
  :where([data-nk="radio-button"] [data-slot="radio-button-control"]) {
@@ -56,11 +49,14 @@
56
49
  background: var(--nk-color-surface);
57
50
  border: var(--nk-border-width) solid var(--nk-color-border);
58
51
  border-radius: var(--nk-radius-full);
52
+ transition:
53
+ background-color var(--nk-duration-fast) var(--nk-ease),
54
+ border-color var(--nk-duration-fast) var(--nk-ease);
59
55
  }
60
56
 
61
57
  :where([data-nk="radio-button"] [data-slot="radio-button-indicator"])::after {
62
- inline-size: 0.5rem;
63
- block-size: 0.5rem;
58
+ inline-size: calc(var(--_nk-choice-size) * 0.44);
59
+ block-size: calc(var(--_nk-choice-size) * 0.44);
64
60
  content: "";
65
61
  background: var(--nk-color-primary);
66
62
  border-radius: inherit;
@@ -75,18 +71,11 @@
75
71
  :where([data-nk="radio-button"] > [data-slot="radio-button-description"]) {
76
72
  display: block;
77
73
  margin-block-start: var(--nk-space);
78
- padding-inline-start: calc(1.125rem + (var(--nk-space) * 2));
74
+ padding-inline-start: calc(var(--_nk-choice-size) + (var(--nk-space) * 2));
79
75
  color: var(--nk-color-muted-foreground);
80
76
  font-size: var(--nk-text-sm);
81
77
  text-wrap: pretty;
82
78
  }
83
-
84
- :where(
85
- [data-nk="radio-button"][data-size="lg"]
86
- > [data-slot="radio-button-description"]
87
- ) {
88
- padding-inline-start: calc(1.5rem + (var(--nk-space) * 2));
89
- }
90
79
  }
91
80
 
92
81
  @layer nitro-kit.state {
@@ -117,18 +106,24 @@
117
106
 
118
107
  :where([data-nk="radio-button"][data-disabled="true"]) {
119
108
  cursor: not-allowed;
120
- opacity: 0.6;
109
+ opacity: var(--nk-disabled-opacity);
121
110
  }
122
111
 
123
112
  /* The server error describes the submitted value. Once the user picks a
124
113
  value that satisfies the control's own constraints the error is stale, so
125
- the danger border stands down. `:user-valid` never matches before the user
114
+ the destructive border stands down. `:user-valid` never matches before the user
126
115
  touches the control, so an untouched invalid radio keeps its border. */
127
116
  :where(
128
117
  [data-nk="radio-button"]
129
118
  [data-slot="radio-button-control"][aria-invalid="true"]:not(:user-valid)
130
119
  + [data-slot="radio-button-indicator"]
131
120
  ) {
132
- border-color: var(--nk-color-danger);
121
+ border-color: var(--nk-color-destructive);
122
+ }
123
+
124
+ @media (prefers-reduced-motion: reduce) {
125
+ :where([data-nk="radio-button"] [data-slot="radio-button-indicator"]) {
126
+ transition-duration: 0.01ms;
127
+ }
133
128
  }
134
129
  }
@@ -10,8 +10,8 @@
10
10
  [data-nk="radio-button-group"] > [data-slot="radio-button-group-legend"]
11
11
  ) {
12
12
  padding: 0;
13
- font-size: var(--nk-text-sm);
14
- font-weight: var(--nk-font-weight-semibold);
13
+ font-size: var(--nk-title-compact-size);
14
+ font-weight: var(--nk-title-compact-weight);
15
15
  }
16
16
 
17
17
  :where(
@@ -57,7 +57,7 @@
57
57
  padding: calc(var(--nk-space) * 3);
58
58
  background: var(--nk-color-surface);
59
59
  border: var(--nk-border-width) solid var(--nk-color-border);
60
- border-radius: var(--nk-radius-md);
60
+ border-radius: var(--nk-radius-lg);
61
61
  }
62
62
 
63
63
  :where(
@@ -68,7 +68,7 @@
68
68
  gap: 0;
69
69
  padding: var(--nk-space);
70
70
  background: var(--nk-color-muted);
71
- border-radius: var(--nk-radius-md);
71
+ border-radius: var(--nk-radius-lg);
72
72
  }
73
73
 
74
74
  :where(
@@ -78,7 +78,7 @@
78
78
  ) {
79
79
  min-inline-size: 0;
80
80
  padding-inline: calc(var(--nk-space) * 3);
81
- border-radius: calc(var(--nk-radius-md) - var(--nk-space));
81
+ border-radius: calc(var(--nk-radius-lg) - var(--nk-space));
82
82
  }
83
83
 
84
84
  :where(
@@ -136,7 +136,7 @@
136
136
  [data-nk="radio-button-group"][data-presentation="segmented"]
137
137
  [data-slot="radio-button-control"]:focus-visible
138
138
  ) {
139
- border-radius: calc(var(--nk-radius-md) - var(--nk-space));
139
+ border-radius: calc(var(--nk-radius-lg) - var(--nk-space));
140
140
  outline: var(--nk-focus-width) solid var(--nk-color-focus);
141
141
  outline-offset: calc(var(--nk-focus-offset) * -1);
142
142
  }
@@ -12,7 +12,7 @@
12
12
  --lexxy-color-ink-lightest: var(--nk-color-muted);
13
13
  --lexxy-color-selected: var(--nk-color-muted);
14
14
  --lexxy-color-selected-hover: var(--nk-color-border);
15
- --lexxy-radius: var(--nk-radius-md);
15
+ --lexxy-radius: var(--nk-radius-lg);
16
16
  display: block;
17
17
  inline-size: 100%;
18
18
  }
@@ -31,6 +31,6 @@
31
31
  > [data-slot="rich-text-area-editor"]
32
32
  > [aria-invalid="true"]
33
33
  ) {
34
- border-color: var(--nk-color-danger);
34
+ border-color: var(--nk-color-destructive);
35
35
  }
36
36
  }
@@ -9,13 +9,15 @@
9
9
  grid-area: 1 / 1;
10
10
  inline-size: 100%;
11
11
  min-block-size: var(--nk-control-height-md);
12
- padding-inline: calc(var(--nk-space) * 3) calc(var(--nk-space) * 9);
12
+ padding-inline: var(--nk-control-padding-inline)
13
+ calc(var(--nk-control-padding-inline) * 2 + var(--nk-space) * 4);
13
14
  color: inherit;
14
15
  font: inherit;
16
+ font-size: var(--nk-text-base);
15
17
  appearance: none;
16
18
  background: var(--nk-color-surface);
17
19
  border: var(--nk-border-width) solid var(--nk-color-border);
18
- border-radius: var(--nk-radius-md);
20
+ border-radius: var(--nk-radius-lg);
19
21
  transition:
20
22
  border-color var(--nk-duration-normal) var(--nk-ease),
21
23
  box-shadow var(--nk-duration-normal) var(--nk-ease);
@@ -25,9 +27,9 @@
25
27
  grid-area: 1 / 1;
26
28
  align-self: center;
27
29
  justify-self: end;
28
- inline-size: 1rem;
29
- block-size: 1rem;
30
- margin-inline-end: calc(var(--nk-space) * 3);
30
+ inline-size: calc(var(--nk-space) * 4);
31
+ block-size: calc(var(--nk-space) * 4);
32
+ margin-inline-end: var(--nk-control-padding-inline);
31
33
  color: var(--nk-color-muted-foreground);
32
34
  pointer-events: none;
33
35
  }
@@ -39,9 +41,23 @@
39
41
 
40
42
  :where([data-nk="select"] > [data-slot="select-control"][multiple]) {
41
43
  min-block-size: calc(var(--nk-control-height-md) * 3);
42
- padding: calc(var(--nk-space) * 2) calc(var(--nk-space) * 3);
44
+ padding-block: calc(var(--nk-space) * 2);
45
+ padding-inline: var(--nk-control-padding-inline);
43
46
  appearance: auto;
44
47
  }
48
+
49
+ /* Matches the Input width split. */
50
+ @media (min-width: 48rem) {
51
+ :where([data-nk="select"] > [data-slot="select-control"]) {
52
+ font-size: var(--nk-text-sm);
53
+ }
54
+ }
55
+
56
+ @media (prefers-reduced-motion: reduce) {
57
+ :where([data-nk="select"] > [data-slot="select-control"]) {
58
+ transition-duration: 0.01ms;
59
+ }
60
+ }
45
61
  }
46
62
 
47
63
  @layer nitro-kit.state {
@@ -52,12 +68,12 @@
52
68
 
53
69
  :where([data-nk="select"] > [data-slot="select-control"]:disabled) {
54
70
  cursor: not-allowed;
55
- opacity: 0.6;
71
+ opacity: var(--nk-disabled-opacity);
56
72
  }
57
73
 
58
74
  :where(
59
75
  [data-nk="select"] > [data-slot="select-control"][aria-invalid="true"]
60
76
  ) {
61
- border-color: var(--nk-color-danger);
77
+ border-color: var(--nk-color-destructive);
62
78
  }
63
79
  }
@@ -4,25 +4,25 @@
4
4
  grid-template-columns: minmax(10rem, 14rem) minmax(0, 1fr);
5
5
  gap: calc(var(--nk-space) * 6);
6
6
  align-items: start;
7
- min-width: 0;
7
+ min-inline-size: 0;
8
8
  }
9
9
 
10
10
  :where(
11
11
  [data-nk="settings-layout"] > [data-slot="settings-layout-navigation"],
12
12
  [data-nk="settings-layout"] > [data-slot="settings-layout-content"]
13
13
  ) {
14
- min-width: 0;
14
+ min-inline-size: 0;
15
15
  }
16
16
 
17
17
  :where([data-nk="settings-layout"] [data-slot="settings-layout-items"]) {
18
18
  display: flex;
19
19
  flex-direction: column;
20
20
  gap: var(--nk-space);
21
- min-width: 0;
21
+ min-inline-size: 0;
22
22
  }
23
23
 
24
24
  :where([data-nk="settings-layout"] [data-slot="settings-layout-item"]) {
25
- min-width: 0;
25
+ min-inline-size: 0;
26
26
  }
27
27
 
28
28
  :where([data-nk="settings-layout"] [data-slot="settings-layout-item-link"]) {
@@ -36,7 +36,7 @@
36
36
  font-weight: var(--nk-font-weight-medium);
37
37
  line-height: var(--nk-leading-tight);
38
38
  text-decoration: none;
39
- border-radius: var(--nk-radius-md);
39
+ border-radius: var(--nk-radius-lg);
40
40
  transition:
41
41
  color var(--nk-duration-normal) var(--nk-ease),
42
42
  background-color var(--nk-duration-normal) var(--nk-ease);
@@ -15,8 +15,8 @@
15
15
  }
16
16
 
17
17
  :where([data-nk="settings-section"] [data-slot="settings-section-title"]) {
18
- font-size: var(--nk-text-xl);
19
- font-weight: var(--nk-font-weight-bold);
18
+ font-size: var(--nk-title-section-size);
19
+ font-weight: var(--nk-title-section-weight);
20
20
  line-height: var(--nk-leading-tight);
21
21
  text-wrap: balance;
22
22
  }
@@ -7,7 +7,7 @@
7
7
  position: fixed;
8
8
  inset-block: 0;
9
9
  max-block-size: none;
10
- height: 100dvh;
10
+ block-size: 100dvh;
11
11
  margin-block: 0;
12
12
  padding: calc(var(--nk-space) * 6);
13
13
  overflow: auto;
@@ -28,15 +28,15 @@
28
28
  }
29
29
 
30
30
  :where([data-nk="sheet"][data-size="sm"] > [data-slot="sheet-panel"]) {
31
- width: min(calc(100% - (var(--nk-space) * 8)), 20rem);
31
+ inline-size: min(calc(100% - (var(--nk-space) * 8)), 20rem);
32
32
  }
33
33
 
34
34
  :where([data-nk="sheet"][data-size="md"] > [data-slot="sheet-panel"]) {
35
- width: min(calc(100% - (var(--nk-space) * 8)), 28rem);
35
+ inline-size: min(calc(100% - (var(--nk-space) * 8)), 28rem);
36
36
  }
37
37
 
38
38
  :where([data-nk="sheet"][data-size="lg"] > [data-slot="sheet-panel"]) {
39
- width: min(calc(100% - (var(--nk-space) * 8)), 40rem);
39
+ inline-size: min(calc(100% - (var(--nk-space) * 8)), 40rem);
40
40
  }
41
41
 
42
42
  :where([data-nk="sheet"] > [data-slot="sheet-panel"])::backdrop {
@@ -52,8 +52,8 @@
52
52
 
53
53
  :where([data-nk="sheet"] [data-slot="sheet-title"]) {
54
54
  padding-inline-end: calc(var(--nk-space) * 10);
55
- font-size: var(--nk-text-lg);
56
- font-weight: var(--nk-font-weight-bold);
55
+ font-size: var(--nk-title-surface-size);
56
+ font-weight: var(--nk-title-surface-weight);
57
57
  line-height: var(--nk-leading-tight);
58
58
  }
59
59
 
@@ -76,13 +76,13 @@
76
76
  :where(
77
77
  [data-nk="sheet"][data-side="left"] > [data-slot="sheet-panel"][open]
78
78
  ) {
79
- --_nk-sheet-from: -1rem;
79
+ --_nk-sheet-from: calc(var(--nk-space) * -4);
80
80
  }
81
81
 
82
82
  :where(
83
83
  [data-nk="sheet"][data-side="right"] > [data-slot="sheet-panel"][open]
84
84
  ) {
85
- --_nk-sheet-from: 1rem;
85
+ --_nk-sheet-from: calc(var(--nk-space) * 4);
86
86
  }
87
87
 
88
88
  /* Sides are logical, but translateX is physical; RTL flips the slide so the
@@ -91,14 +91,14 @@
91
91
  [data-nk="sheet"][data-side="left"]:dir(rtl)
92
92
  > [data-slot="sheet-panel"][open]
93
93
  ) {
94
- --_nk-sheet-from: 1rem;
94
+ --_nk-sheet-from: calc(var(--nk-space) * 4);
95
95
  }
96
96
 
97
97
  :where(
98
98
  [data-nk="sheet"][data-side="right"]:dir(rtl)
99
99
  > [data-slot="sheet-panel"][open]
100
100
  ) {
101
- --_nk-sheet-from: -1rem;
101
+ --_nk-sheet-from: calc(var(--nk-space) * -4);
102
102
  }
103
103
 
104
104
  @keyframes nk-sheet-enter {
@@ -21,7 +21,7 @@
21
21
  display: grid;
22
22
  align-content: start;
23
23
  gap: calc(var(--nk-space) * 2);
24
- min-height: 100%;
24
+ min-block-size: 100%;
25
25
  padding: calc(var(--nk-space) * 5);
26
26
  background: var(--nk-color-surface);
27
27
  border: var(--nk-border-width) solid var(--nk-color-border);