nitro_kit 2.0.0.alpha.2 → 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 (138) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +229 -1
  3. data/README.md +25 -10
  4. data/STYLE_GUIDE.md +47 -5
  5. data/app/assets/stylesheets/nitro_kit-tailwind-v4.css +3 -3
  6. data/app/assets/stylesheets/nitro_kit.css +2820 -1816
  7. data/app/components/nitro_kit/accordion.rb +2 -26
  8. data/app/components/nitro_kit/alert.rb +1 -11
  9. data/app/components/nitro_kit/app_navigation.rb +45 -11
  10. data/app/components/nitro_kit/app_shell.rb +1 -7
  11. data/app/components/nitro_kit/appearance_picker.rb +11 -12
  12. data/app/components/nitro_kit/avatar.rb +6 -1
  13. data/app/components/nitro_kit/avatar_stack.rb +3 -0
  14. data/app/components/nitro_kit/badge.rb +13 -4
  15. data/app/components/nitro_kit/button_group.rb +2 -2
  16. data/app/components/nitro_kit/checkbox.rb +7 -4
  17. data/app/components/nitro_kit/checkbox_group.rb +0 -25
  18. data/app/components/nitro_kit/combobox.rb +4 -33
  19. data/app/components/nitro_kit/command_palette.rb +42 -59
  20. data/app/components/nitro_kit/component.rb +57 -5
  21. data/app/components/nitro_kit/danger_zone.rb +5 -1
  22. data/app/components/nitro_kit/data_section.rb +28 -4
  23. data/app/components/nitro_kit/details_table.rb +19 -8
  24. data/app/components/nitro_kit/dialog.rb +23 -19
  25. data/app/components/nitro_kit/dropdown.rb +1 -6
  26. data/app/components/nitro_kit/dropzone.rb +4 -15
  27. data/app/components/nitro_kit/empty_state.rb +21 -2
  28. data/app/components/nitro_kit/field.rb +35 -11
  29. data/app/components/nitro_kit/form_builder.rb +1 -2
  30. data/app/components/nitro_kit/progressive_image.rb +2 -2
  31. data/app/components/nitro_kit/radio_button.rb +7 -4
  32. data/app/components/nitro_kit/radio_button_group.rb +0 -25
  33. data/app/components/nitro_kit/select.rb +4 -17
  34. data/app/components/nitro_kit/settings_layout.rb +17 -4
  35. data/app/components/nitro_kit/{form_section.rb → settings_section.rb} +18 -11
  36. data/app/components/nitro_kit/sheet.rb +29 -20
  37. data/app/components/nitro_kit/stat_grid.rb +18 -2
  38. data/app/components/nitro_kit/table.rb +22 -3
  39. data/app/components/nitro_kit/tabs.rb +2 -13
  40. data/app/components/nitro_kit/toast.rb +4 -2
  41. data/app/components/nitro_kit/toolbar.rb +2 -0
  42. data/app/components/nitro_kit/tooltip.rb +7 -10
  43. data/app/javascript/controllers/nk/app_shell_controller.js +3 -3
  44. data/app/javascript/controllers/nk/appearance_controller.js +6 -0
  45. data/app/javascript/controllers/nk/combobox_controller.js +51 -1
  46. data/app/javascript/controllers/nk/command_palette_controller.js +25 -11
  47. data/app/javascript/controllers/nk/dialog_controller.js +54 -0
  48. data/app/javascript/controllers/nk/dropdown_controller.js +45 -0
  49. data/app/javascript/controllers/nk/dropzone_controller.js +2 -2
  50. data/app/javascript/controllers/nk/progressive_image_controller.js +11 -7
  51. data/app/javascript/controllers/nk/tabs_controller.js +21 -2
  52. data/app/javascript/controllers/nk/tooltip_controller.js +9 -0
  53. data/config/locales/en.yml +4 -1
  54. data/docs/agent_guide.md +63 -123
  55. data/docs/agent_native_spec.md +72 -383
  56. data/docs/browser_support.md +82 -0
  57. data/docs/component_contracts.md +108 -82
  58. data/docs/customization.md +689 -91
  59. data/docs/hotwire.md +50 -76
  60. data/docs/initialization_prompt.md +26 -31
  61. data/docs/migration_1_to_2.md +88 -30
  62. data/docs/patterns/application_foundation.md +45 -119
  63. data/docs/patterns/crud_resource.md +44 -126
  64. data/docs/patterns/destructive_action.md +45 -77
  65. data/docs/patterns/flash_and_toast.md +18 -36
  66. data/docs/patterns/inline_edit.md +21 -44
  67. data/docs/patterns/queryable_collection.md +65 -161
  68. data/docs/patterns/resource_form.md +33 -81
  69. data/docs/rails_conventions.md +38 -75
  70. data/docs/rails_integration.md +96 -446
  71. data/lib/generators/nitro_kit/upgrade_smoke_tests_generator.rb +12 -0
  72. data/lib/nitro_kit/installation.rb +20 -7
  73. data/lib/nitro_kit/migration_inventory.rb +275 -8
  74. data/lib/nitro_kit/upgrade_smoke_test.rb +10 -12
  75. data/lib/nitro_kit/version.rb +1 -1
  76. data/lib/rails/commands/nitro_kit/nitro_kit_command.rb +10 -3
  77. data/plugins/nitro-kit/skills/nitro-kit-hotwire/SKILL.md +4 -0
  78. data/plugins/nitro-kit/skills/nitro-kit-rails/SKILL.md +13 -1
  79. data/plugins/nitro-kit/skills/nitro-kit-ui/SKILL.md +32 -15
  80. data/src/stylesheets/nitro_kit/components/accordion.css +44 -44
  81. data/src/stylesheets/nitro_kit/components/alert.css +27 -36
  82. data/src/stylesheets/nitro_kit/components/app_navigation.css +92 -20
  83. data/src/stylesheets/nitro_kit/components/app_shell.css +199 -196
  84. data/src/stylesheets/nitro_kit/components/appearance_picker.css +61 -39
  85. data/src/stylesheets/nitro_kit/components/auth_shell.css +2 -2
  86. data/src/stylesheets/nitro_kit/components/avatar.css +15 -11
  87. data/src/stylesheets/nitro_kit/components/avatar_stack.css +48 -29
  88. data/src/stylesheets/nitro_kit/components/badge.css +13 -9
  89. data/src/stylesheets/nitro_kit/components/button.css +121 -79
  90. data/src/stylesheets/nitro_kit/components/button_group.css +19 -14
  91. data/src/stylesheets/nitro_kit/components/card.css +12 -6
  92. data/src/stylesheets/nitro_kit/components/checkbox.css +54 -67
  93. data/src/stylesheets/nitro_kit/components/checkbox_group.css +16 -16
  94. data/src/stylesheets/nitro_kit/components/combobox.css +39 -29
  95. data/src/stylesheets/nitro_kit/components/command_palette.css +110 -51
  96. data/src/stylesheets/nitro_kit/components/container.css +6 -6
  97. data/src/stylesheets/nitro_kit/components/control_group.css +61 -67
  98. data/src/stylesheets/nitro_kit/components/danger_zone.css +8 -8
  99. data/src/stylesheets/nitro_kit/components/data_section.css +4 -4
  100. data/src/stylesheets/nitro_kit/components/details_table.css +17 -15
  101. data/src/stylesheets/nitro_kit/components/dialog.css +8 -5
  102. data/src/stylesheets/nitro_kit/components/dropdown.css +36 -30
  103. data/src/stylesheets/nitro_kit/components/dropzone.css +78 -35
  104. data/src/stylesheets/nitro_kit/components/empty_state.css +7 -7
  105. data/src/stylesheets/nitro_kit/components/field.css +32 -28
  106. data/src/stylesheets/nitro_kit/components/field_group.css +13 -0
  107. data/src/stylesheets/nitro_kit/components/fieldset.css +8 -2
  108. data/src/stylesheets/nitro_kit/components/flex.css +1 -1
  109. data/src/stylesheets/nitro_kit/components/grid.css +1 -1
  110. data/src/stylesheets/nitro_kit/components/icon.css +5 -5
  111. data/src/stylesheets/nitro_kit/components/input.css +42 -8
  112. data/src/stylesheets/nitro_kit/components/layout.css +165 -165
  113. data/src/stylesheets/nitro_kit/components/page_header.css +7 -7
  114. data/src/stylesheets/nitro_kit/components/pagination.css +58 -49
  115. data/src/stylesheets/nitro_kit/components/pagination_bar.css +9 -9
  116. data/src/stylesheets/nitro_kit/components/palette.css +145 -77
  117. data/src/stylesheets/nitro_kit/components/progressive_image.css +45 -55
  118. data/src/stylesheets/nitro_kit/components/radio_button.css +48 -46
  119. data/src/stylesheets/nitro_kit/components/radio_button_group.css +49 -49
  120. data/src/stylesheets/nitro_kit/components/rich_text_area.css +16 -1
  121. data/src/stylesheets/nitro_kit/components/select.css +24 -15
  122. data/src/stylesheets/nitro_kit/components/settings_layout.css +26 -23
  123. data/src/stylesheets/nitro_kit/components/settings_section.css +84 -0
  124. data/src/stylesheets/nitro_kit/components/sheet.css +30 -10
  125. data/src/stylesheets/nitro_kit/components/stat_grid.css +11 -10
  126. data/src/stylesheets/nitro_kit/components/switch.css +60 -62
  127. data/src/stylesheets/nitro_kit/components/table.css +43 -35
  128. data/src/stylesheets/nitro_kit/components/tabs.css +48 -40
  129. data/src/stylesheets/nitro_kit/components/textarea.css +20 -5
  130. data/src/stylesheets/nitro_kit/components/toast.css +11 -47
  131. data/src/stylesheets/nitro_kit/components/toolbar.css +16 -41
  132. data/src/stylesheets/nitro_kit/components/tooltip.css +38 -29
  133. data/src/stylesheets/nitro_kit/components/typeset.css +150 -4
  134. data/src/stylesheets/nitro_kit/reset.css +15 -15
  135. data/src/stylesheets/nitro_kit/tokens.css +501 -79
  136. metadata +4 -4
  137. data/docs/new_app_strategy.md +0 -22
  138. data/src/stylesheets/nitro_kit/components/form_section.css +0 -71
@@ -8,13 +8,13 @@
8
8
 
9
9
  :where([data-nk="checkbox-group"] > [data-slot="checkbox-group-legend"]) {
10
10
  padding: 0;
11
- font-size: var(--nk-text-sm);
12
- font-weight: var(--nk-font-weight-semibold);
11
+ font-size: var(--nk-title-compact-size);
12
+ font-weight: var(--nk-title-compact-weight);
13
13
  }
14
14
 
15
15
  :where(
16
- [data-nk="checkbox-group"] > [data-slot="checkbox-group-description"]
17
- ) {
16
+ [data-nk="checkbox-group"] > [data-slot="checkbox-group-description"]
17
+ ) {
18
18
  margin-block-start: var(--nk-space);
19
19
  color: var(--nk-color-muted-foreground);
20
20
  font-size: var(--nk-text-sm);
@@ -28,33 +28,33 @@
28
28
  }
29
29
 
30
30
  :where(
31
- [data-nk="checkbox-group"][data-orientation="horizontal"]
32
- > [data-slot="checkbox-group-choices"]
33
- ) {
31
+ [data-nk="checkbox-group"][data-orientation="horizontal"]
32
+ > [data-slot="checkbox-group-choices"]
33
+ ) {
34
34
  display: flex;
35
35
  flex-wrap: wrap;
36
36
  gap: calc(var(--nk-space) * 4);
37
37
  }
38
38
 
39
39
  :where(
40
- [data-nk="checkbox-group"][data-presentation="cards"]
41
- > [data-slot="checkbox-group-choices"]
42
- > [data-slot="checkbox-group-choice"]
43
- ) {
40
+ [data-nk="checkbox-group"][data-presentation="cards"]
41
+ > [data-slot="checkbox-group-choices"]
42
+ > [data-slot="checkbox-group-choice"]
43
+ ) {
44
44
  inline-size: 100%;
45
45
  padding: calc(var(--nk-space) * 3);
46
46
  background: var(--nk-color-surface);
47
47
  border: var(--nk-border-width) solid var(--nk-color-border);
48
- border-radius: var(--nk-radius-md);
48
+ border-radius: var(--nk-radius-lg);
49
49
  }
50
50
  }
51
51
 
52
52
  @layer nitro-kit.state {
53
53
  :where(
54
- [data-nk="checkbox-group"][data-presentation="cards"]
55
- > [data-slot="checkbox-group-choices"]
56
- > [data-slot="checkbox-group-choice"]:has(input:checked)
57
- ) {
54
+ [data-nk="checkbox-group"][data-presentation="cards"]
55
+ > [data-slot="checkbox-group-choices"]
56
+ > [data-slot="checkbox-group-choice"]:has(input:checked)
57
+ ) {
58
58
  border-color: var(--nk-color-primary);
59
59
  box-shadow: 0 0 0 var(--nk-border-width) var(--nk-color-primary);
60
60
  }
@@ -29,8 +29,8 @@
29
29
 
30
30
  :where([data-nk="combobox"] > [data-slot="combobox-status"]) {
31
31
  position: absolute;
32
- width: 1px;
33
- height: 1px;
32
+ inline-size: 1px;
33
+ block-size: 1px;
34
34
  padding: 0;
35
35
  margin: -1px;
36
36
  overflow: hidden;
@@ -44,7 +44,7 @@
44
44
  position: fixed;
45
45
  z-index: 50;
46
46
  inline-size: max(var(--_nk-combobox-width, 12rem), 12rem);
47
- max-inline-size: min(28rem, calc(100vw - (var(--nk-space) * 8)));
47
+ max-inline-size: min(28rem, calc(100% - (var(--nk-space) * 8)));
48
48
  max-block-size: 15rem;
49
49
  margin-block: var(--nk-space);
50
50
  padding: var(--nk-space);
@@ -69,7 +69,7 @@
69
69
  font-size: var(--nk-text-sm);
70
70
  line-height: var(--nk-leading-normal);
71
71
  cursor: pointer;
72
- border-radius: var(--nk-radius-md);
72
+ border-radius: calc(var(--nk-radius-lg) - var(--nk-space));
73
73
  transition:
74
74
  color var(--nk-duration-normal) var(--nk-ease),
75
75
  background-color var(--nk-duration-normal) var(--nk-ease);
@@ -79,12 +79,22 @@
79
79
  display: block;
80
80
  }
81
81
 
82
+ :where([data-nk="combobox"] [data-slot="combobox-empty"]) {
83
+ display: flex;
84
+ align-items: center;
85
+ min-block-size: var(--nk-control-height-md);
86
+ padding-block: var(--nk-space);
87
+ padding-inline: calc(var(--nk-space) * 3);
88
+ color: var(--nk-color-muted-foreground);
89
+ font-size: var(--nk-text-sm);
90
+ }
91
+
82
92
  :where(
83
- [data-nk="combobox"]
84
- > [data-slot="combobox-listbox"]
85
- > [data-slot="combobox-option"]
86
- > [data-slot="combobox-option-description"]
87
- ) {
93
+ [data-nk="combobox"]
94
+ > [data-slot="combobox-listbox"]
95
+ > [data-slot="combobox-option"]
96
+ > [data-slot="combobox-option-description"]
97
+ ) {
88
98
  display: block;
89
99
  margin-block-start: calc(var(--nk-space) * 0.5);
90
100
  color: var(--nk-color-muted-foreground);
@@ -95,44 +105,44 @@
95
105
 
96
106
  @layer nitro-kit.state {
97
107
  :where(
98
- [data-nk="combobox"]
99
- [data-slot="combobox-option"]:is(
100
- [data-active="true"],
101
- [aria-selected="true"]
102
- )
103
- ) {
108
+ [data-nk="combobox"]
109
+ [data-slot="combobox-option"]:is(
110
+ [data-active="true"],
111
+ [aria-selected="true"]
112
+ )
113
+ ) {
104
114
  background: var(--nk-color-muted);
105
115
  }
106
116
 
107
117
  :where(
108
- [data-nk="combobox"]
109
- > [data-slot="combobox-listbox"]
110
- > [data-slot="combobox-option"]:is(
111
- [data-active="true"],
112
- [aria-selected="true"]
113
- )
114
- > [data-slot="combobox-option-description"]
115
- ) {
118
+ [data-nk="combobox"]
119
+ > [data-slot="combobox-listbox"]
120
+ > [data-slot="combobox-option"]:is(
121
+ [data-active="true"],
122
+ [aria-selected="true"]
123
+ )
124
+ > [data-slot="combobox-option-description"]
125
+ ) {
116
126
  color: var(--nk-color-foreground);
117
127
  }
118
128
 
119
129
  :where(
120
- [data-nk="combobox"] [data-slot="combobox-option"][aria-disabled="true"]
121
- ) {
130
+ [data-nk="combobox"] [data-slot="combobox-option"][aria-disabled="true"]
131
+ ) {
122
132
  cursor: not-allowed;
123
- opacity: 0.6;
133
+ opacity: var(--nk-disabled-opacity);
124
134
  }
125
135
 
126
136
  :where(
127
- [data-nk="combobox"] > [data-slot="combobox-listbox"][data-state="open"]
128
- ) {
137
+ [data-nk="combobox"] > [data-slot="combobox-listbox"][data-state="open"]
138
+ ) {
129
139
  animation: nk-combobox-enter var(--nk-duration-normal) var(--nk-ease);
130
140
  }
131
141
 
132
142
  @keyframes nk-combobox-enter {
133
143
  from {
134
144
  opacity: 0;
135
- transform: translateY(-0.25rem);
145
+ transform: translateY(calc(var(--nk-space) * -1));
136
146
  }
137
147
  to {
138
148
  opacity: 1;
@@ -3,20 +3,25 @@
3
3
  inline-size: 100%;
4
4
  }
5
5
 
6
+ /* The trigger reads as the search input it opens: Input's plain border,
7
+ radius, and surface instead of Button's raised treatment. */
6
8
  :where([data-nk="command-palette"] > [data-slot="command-palette-trigger"]) {
7
9
  justify-content: start;
8
10
  inline-size: 100%;
9
11
  color: var(--nk-color-muted-foreground);
10
12
  font-weight: var(--nk-font-weight-normal);
11
13
  background: var(--nk-color-surface);
14
+ border-color: var(--nk-color-border);
15
+ border-block-end-color: var(--nk-color-border);
16
+ border-radius: var(--nk-radius-lg);
12
17
  box-shadow: none;
13
18
  }
14
19
 
15
20
  :where(
16
- [data-nk="command-palette"]
17
- > [data-slot="command-palette-trigger"]
18
- > [data-slot="button-label"]
19
- ) {
21
+ [data-nk="command-palette"]
22
+ > [data-slot="command-palette-trigger"]
23
+ > [data-slot="button-label"]
24
+ ) {
20
25
  display: flex;
21
26
  flex: 1 1 auto;
22
27
  gap: calc(var(--nk-space) * 2);
@@ -25,13 +30,24 @@
25
30
  }
26
31
 
27
32
  :where(
28
- [data-nk="command-palette"] [data-slot="command-palette-trigger-label"]
29
- ) {
33
+ [data-nk="command-palette"] [data-slot="command-palette-trigger-label"]
34
+ ) {
30
35
  overflow: hidden;
31
36
  text-overflow: ellipsis;
32
37
  white-space: nowrap;
33
38
  }
34
39
 
40
+ /* The chip floats at the trigger's end with the same inset on its top,
41
+ end, and bottom sides, so the trigger's text padding stands down. */
42
+ :where(
43
+ [data-nk="command-palette"]
44
+ > [data-slot="command-palette-trigger"]:has(
45
+ [data-slot="command-palette-shortcut"]
46
+ )
47
+ ) {
48
+ padding-inline-end: calc(var(--nk-space) * 2 - var(--nk-border-width));
49
+ }
50
+
35
51
  :where([data-nk="command-palette"] [data-slot="command-palette-shortcut"]) {
36
52
  flex: 0 0 auto;
37
53
  margin-inline-start: auto;
@@ -46,6 +62,16 @@
46
62
  border-radius: var(--nk-radius-sm);
47
63
  }
48
64
 
65
+ /* The panel hugs its results and stops growing at the cap; past it, the
66
+ shrinkable list scrolls. The flex display applies only while open, so
67
+ the closed dialog keeps the user-agent's display: none. */
68
+ :where(
69
+ [data-nk="command-palette"] > [data-slot="command-palette-panel"][open]
70
+ ) {
71
+ display: flex;
72
+ flex-direction: column;
73
+ }
74
+
49
75
  :where([data-nk="command-palette"] > [data-slot="command-palette-panel"]) {
50
76
  inline-size: min(calc(100% - (var(--nk-space) * 8)), var(--nk-content-md));
51
77
  max-block-size: min(36rem, calc(100dvh - (var(--nk-space) * 8)));
@@ -59,19 +85,29 @@
59
85
  box-shadow: var(--nk-shadow-lg);
60
86
  }
61
87
 
88
+ /* The modal palette anchors near the viewport top, so hugging grows and
89
+ shrinks downward and the top edge never jumps while filtering. The
90
+ non-enhanced fallback keeps the centered default. */
91
+ :where(
92
+ [data-nk="command-palette"] > [data-slot="command-palette-panel"]:modal
93
+ ) {
94
+ margin-block: 12dvh auto;
95
+ max-block-size: min(36rem, calc(88dvh - var(--nk-space) * 4));
96
+ }
97
+
62
98
  :where(
63
- [data-nk="command-palette"] > [data-slot="command-palette-panel"]
64
- )::backdrop {
99
+ [data-nk="command-palette"] > [data-slot="command-palette-panel"]
100
+ )::backdrop {
65
101
  background: var(--nk-color-overlay);
66
102
  }
67
103
 
68
104
  :where(
69
- [data-nk="command-palette"] [data-slot="command-palette-title"],
70
- [data-nk="command-palette"] [data-slot="command-palette-status"]
71
- ) {
105
+ [data-nk="command-palette"] [data-slot="command-palette-title"],
106
+ [data-nk="command-palette"] [data-slot="command-palette-status"]
107
+ ) {
72
108
  position: absolute;
73
- width: 1px;
74
- height: 1px;
109
+ inline-size: 1px;
110
+ block-size: 1px;
75
111
  padding: 0;
76
112
  margin: -1px;
77
113
  overflow: hidden;
@@ -83,6 +119,7 @@
83
119
 
84
120
  :where([data-nk="command-palette"] [data-slot="command-palette-search"]) {
85
121
  display: flex;
122
+ flex: 0 0 auto;
86
123
  gap: calc(var(--nk-space) * 2);
87
124
  align-items: center;
88
125
  padding: calc(var(--nk-space) * 2);
@@ -90,19 +127,19 @@
90
127
  }
91
128
 
92
129
  :where(
93
- [data-nk="command-palette"]
94
- > [data-slot="command-palette-panel"]
95
- > [data-slot="command-palette-close"]
96
- ) {
130
+ [data-nk="command-palette"]
131
+ > [data-slot="command-palette-panel"]
132
+ > [data-slot="command-palette-close"]
133
+ ) {
97
134
  margin-block: calc(var(--nk-space) * 2);
98
135
  margin-inline: auto calc(var(--nk-space) * 2);
99
136
  }
100
137
 
101
138
  :where(
102
- [data-nk="command-palette"][data-enhanced]
103
- > [data-slot="command-palette-panel"]
104
- > [data-slot="command-palette-close"]
105
- ) {
139
+ [data-nk="command-palette"][data-enhanced]
140
+ > [data-slot="command-palette-panel"]
141
+ > [data-slot="command-palette-close"]
142
+ ) {
106
143
  position: absolute;
107
144
  z-index: 1;
108
145
  inset-block-start: calc(var(--nk-space) * 2);
@@ -111,23 +148,23 @@
111
148
  }
112
149
 
113
150
  :where(
114
- [data-nk="command-palette"][data-enhanced]
115
- [data-slot="command-palette-search"]
116
- ) {
151
+ [data-nk="command-palette"][data-enhanced]
152
+ [data-slot="command-palette-search"]
153
+ ) {
117
154
  padding-inline-end: calc(
118
155
  var(--nk-control-height-md) + (var(--nk-space) * 4)
119
156
  );
120
157
  }
121
158
 
122
159
  :where(
123
- [data-nk="command-palette"] [data-slot="command-palette-search"][hidden]
124
- ) {
160
+ [data-nk="command-palette"] [data-slot="command-palette-search"][hidden]
161
+ ) {
125
162
  display: none;
126
163
  }
127
164
 
128
165
  :where(
129
- [data-nk="command-palette"] [data-slot="command-palette-search-icon"]
130
- ) {
166
+ [data-nk="command-palette"] [data-slot="command-palette-search-icon"]
167
+ ) {
131
168
  flex: 0 0 auto;
132
169
  margin-inline-start: calc(var(--nk-space) * 2);
133
170
  color: var(--nk-color-muted-foreground);
@@ -138,15 +175,18 @@
138
175
  min-inline-size: 0;
139
176
  }
140
177
 
141
- :where([data-nk="command-palette"])
142
- [data-slot="command-palette-input"]::-webkit-search-cancel-button {
178
+ :where(
179
+ [data-nk="command-palette"] [data-slot="command-palette-input"]
180
+ )::-webkit-search-cancel-button {
143
181
  appearance: none;
144
182
  }
145
183
 
146
184
  :where([data-nk="command-palette"] [data-slot="command-palette-results"]) {
147
185
  display: grid;
186
+ flex: 0 1 auto;
148
187
  gap: var(--nk-space);
149
188
  max-block-size: 26rem;
189
+ min-block-size: 0;
150
190
  padding: calc(var(--nk-space) * 2);
151
191
  overflow-y: auto;
152
192
  overscroll-behavior: contain;
@@ -158,8 +198,8 @@
158
198
  }
159
199
 
160
200
  :where(
161
- [data-nk="command-palette"] [data-slot="command-palette-destination"]
162
- ) {
201
+ [data-nk="command-palette"] [data-slot="command-palette-destination"]
202
+ ) {
163
203
  display: flex;
164
204
  flex-direction: column;
165
205
  justify-content: center;
@@ -170,16 +210,16 @@
170
210
  font-size: var(--nk-text-sm);
171
211
  line-height: var(--nk-leading-normal);
172
212
  text-decoration: none;
173
- border-radius: var(--nk-radius-md);
213
+ border-radius: calc(var(--nk-radius-xl) - var(--nk-space) * 2);
174
214
  transition:
175
215
  color var(--nk-duration-normal) var(--nk-ease),
176
216
  background-color var(--nk-duration-normal) var(--nk-ease);
177
217
  }
178
218
 
179
219
  :where(
180
- [data-nk="command-palette"]
181
- [data-slot="command-palette-destination-description"]
182
- ) {
220
+ [data-nk="command-palette"]
221
+ [data-slot="command-palette-destination-description"]
222
+ ) {
183
223
  margin-block-start: calc(var(--nk-space) * 0.5);
184
224
  color: var(--nk-color-muted-foreground);
185
225
  font-size: var(--nk-text-xs);
@@ -195,21 +235,40 @@
195
235
  }
196
236
  }
197
237
 
238
+ @layer nitro-kit.compound {
239
+ /* The search strip is the field: the icon sits inside it and the nested
240
+ Input drops its own chrome, so the row reads as one input bounded by
241
+ the hairline below. The caret is the focus indicator, matching every
242
+ command palette — a ring on a borderless strip would show permanently,
243
+ because text inputs are always focus-visible. */
244
+ :where([data-nk="command-palette"] [data-slot="command-palette-input"]) {
245
+ background: transparent;
246
+ border-color: transparent;
247
+ }
248
+
249
+ :where(
250
+ [data-nk="command-palette"]
251
+ [data-slot="command-palette-input"]:focus-visible
252
+ ) {
253
+ outline: none;
254
+ }
255
+ }
256
+
198
257
  @layer nitro-kit.state {
199
258
  @media (hover: hover) {
200
259
  :where(
201
- [data-nk="command-palette"]
202
- [data-slot="command-palette-destination"]:hover
203
- ) {
260
+ [data-nk="command-palette"]
261
+ [data-slot="command-palette-destination"]:hover
262
+ ) {
204
263
  color: var(--nk-color-foreground);
205
264
  background: var(--nk-color-muted);
206
265
  }
207
266
  }
208
267
 
209
268
  :where(
210
- [data-nk="command-palette"]
211
- [data-slot="command-palette-destination"]:focus-visible
212
- ) {
269
+ [data-nk="command-palette"]
270
+ [data-slot="command-palette-destination"]:focus-visible
271
+ ) {
213
272
  color: var(--nk-color-foreground);
214
273
  background: var(--nk-color-muted);
215
274
  outline: var(--nk-focus-width) solid var(--nk-color-focus);
@@ -217,23 +276,23 @@
217
276
  }
218
277
 
219
278
  :where(
220
- [data-nk="command-palette"]
221
- [data-slot="command-palette-destination"]:is(:hover, :focus-visible)
222
- [data-slot="command-palette-destination-description"]
223
- ) {
279
+ [data-nk="command-palette"]
280
+ [data-slot="command-palette-destination"]:is(:hover, :focus-visible)
281
+ [data-slot="command-palette-destination-description"]
282
+ ) {
224
283
  color: var(--nk-color-foreground);
225
284
  }
226
285
 
227
286
  :where(
228
- [data-nk="command-palette"] > [data-slot="command-palette-panel"][open]
229
- ) {
287
+ [data-nk="command-palette"] > [data-slot="command-palette-panel"][open]
288
+ ) {
230
289
  animation: nk-command-palette-enter var(--nk-duration-slow) var(--nk-ease);
231
290
  }
232
291
 
233
292
  @keyframes nk-command-palette-enter {
234
293
  from {
235
294
  opacity: 0;
236
- transform: translateY(-0.5rem) scale(0.98);
295
+ transform: translateY(calc(var(--nk-space) * -2)) scale(0.98);
237
296
  }
238
297
  to {
239
298
  opacity: 1;
@@ -247,8 +306,8 @@
247
306
  }
248
307
 
249
308
  :where(
250
- [data-nk="command-palette"] [data-slot="command-palette-destination"]
251
- ) {
309
+ [data-nk="command-palette"] [data-slot="command-palette-destination"]
310
+ ) {
252
311
  transition-duration: 0.01ms;
253
312
  }
254
313
  }
@@ -1,25 +1,25 @@
1
1
  @layer nitro-kit.base {
2
2
  :where([data-nk="container"]) {
3
- width: 100%;
4
- min-width: 0;
3
+ inline-size: 100%;
4
+ min-inline-size: 0;
5
5
  margin-inline: auto;
6
6
  }
7
7
  }
8
8
 
9
9
  @layer nitro-kit.size {
10
10
  :where([data-nk="container"][data-size="sm"]) {
11
- max-width: var(--nk-content-sm);
11
+ max-inline-size: var(--nk-content-sm);
12
12
  }
13
13
 
14
14
  :where([data-nk="container"][data-size="md"]) {
15
- max-width: var(--nk-content-md);
15
+ max-inline-size: var(--nk-content-md);
16
16
  }
17
17
 
18
18
  :where([data-nk="container"][data-size="lg"]) {
19
- max-width: var(--nk-content-lg);
19
+ max-inline-size: var(--nk-content-lg);
20
20
  }
21
21
 
22
22
  :where([data-nk="container"][data-size="xl"]) {
23
- max-width: var(--nk-content-xl);
23
+ max-inline-size: var(--nk-content-xl);
24
24
  }
25
25
  }