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
@@ -1,14 +1,24 @@
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);
@@ -16,27 +26,12 @@
16
26
  }
17
27
 
18
28
  :where(
19
- [data-nk="radio-button"][data-size="lg"] > [data-slot="radio-button-label"]
20
- ) {
21
- grid-template-columns: 1.5rem minmax(0, 1fr);
22
- }
23
-
24
- :where(
25
- [data-nk="radio-button"] [data-slot="radio-button-control"],
26
- [data-nk="radio-button"] [data-slot="radio-button-indicator"]
27
- ) {
29
+ [data-nk="radio-button"] [data-slot="radio-button-control"],
30
+ [data-nk="radio-button"] [data-slot="radio-button-indicator"]
31
+ ) {
28
32
  grid-area: 1 / 1;
29
- inline-size: 1.125rem;
30
- block-size: 1.125rem;
31
- }
32
-
33
- :where(
34
- [data-nk="radio-button"][data-size="lg"] [data-slot="radio-button-control"],
35
- [data-nk="radio-button"][data-size="lg"]
36
- [data-slot="radio-button-indicator"]
37
- ) {
38
- inline-size: 1.5rem;
39
- block-size: 1.5rem;
33
+ inline-size: var(--_nk-choice-size);
34
+ block-size: var(--_nk-choice-size);
40
35
  }
41
36
 
42
37
  :where([data-nk="radio-button"] [data-slot="radio-button-control"]) {
@@ -54,11 +49,14 @@
54
49
  background: var(--nk-color-surface);
55
50
  border: var(--nk-border-width) solid var(--nk-color-border);
56
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);
57
55
  }
58
56
 
59
57
  :where([data-nk="radio-button"] [data-slot="radio-button-indicator"])::after {
60
- inline-size: 0.5rem;
61
- block-size: 0.5rem;
58
+ inline-size: calc(var(--_nk-choice-size) * 0.44);
59
+ block-size: calc(var(--_nk-choice-size) * 0.44);
62
60
  content: "";
63
61
  background: var(--nk-color-primary);
64
62
  border-radius: inherit;
@@ -67,15 +65,13 @@
67
65
 
68
66
  :where([data-nk="radio-button"] [data-slot="radio-button-label-text"]) {
69
67
  display: block;
70
- }
71
-
72
- :where([data-nk="radio-button"] [data-slot="radio-button-content"]) {
73
68
  grid-column: 2;
74
69
  }
75
70
 
76
- :where([data-nk="radio-button"] [data-slot="radio-button-description"]) {
71
+ :where([data-nk="radio-button"] > [data-slot="radio-button-description"]) {
77
72
  display: block;
78
73
  margin-block-start: var(--nk-space);
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;
@@ -84,44 +80,50 @@
84
80
 
85
81
  @layer nitro-kit.state {
86
82
  :where(
87
- [data-nk="radio-button"]
88
- [data-slot="radio-button-control"]:checked
89
- + [data-slot="radio-button-indicator"]
90
- ) {
83
+ [data-nk="radio-button"]
84
+ [data-slot="radio-button-control"]:checked
85
+ + [data-slot="radio-button-indicator"]
86
+ ) {
91
87
  border-color: var(--nk-color-primary);
92
88
  }
93
89
 
94
90
  :where(
95
- [data-nk="radio-button"]
96
- [data-slot="radio-button-control"]:checked
97
- + [data-slot="radio-button-indicator"]
98
- )::after {
91
+ [data-nk="radio-button"]
92
+ [data-slot="radio-button-control"]:checked
93
+ + [data-slot="radio-button-indicator"]
94
+ )::after {
99
95
  opacity: 1;
100
96
  }
101
97
 
102
98
  :where(
103
- [data-nk="radio-button"]
104
- [data-slot="radio-button-control"]:focus-visible
105
- + [data-slot="radio-button-indicator"]
106
- ) {
99
+ [data-nk="radio-button"]
100
+ [data-slot="radio-button-control"]:focus-visible
101
+ + [data-slot="radio-button-indicator"]
102
+ ) {
107
103
  outline: var(--nk-focus-width) solid var(--nk-color-focus);
108
104
  outline-offset: var(--nk-focus-offset);
109
105
  }
110
106
 
111
107
  :where([data-nk="radio-button"][data-disabled="true"]) {
112
108
  cursor: not-allowed;
113
- opacity: 0.6;
109
+ opacity: var(--nk-disabled-opacity);
114
110
  }
115
111
 
116
112
  /* The server error describes the submitted value. Once the user picks a
117
113
  value that satisfies the control's own constraints the error is stale, so
118
- 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
119
115
  touches the control, so an untouched invalid radio keeps its border. */
120
116
  :where(
121
- [data-nk="radio-button"]
122
- [data-slot="radio-button-control"][aria-invalid="true"]:not(:user-valid)
123
- + [data-slot="radio-button-indicator"]
124
- ) {
125
- border-color: var(--nk-color-danger);
117
+ [data-nk="radio-button"]
118
+ [data-slot="radio-button-control"][aria-invalid="true"]:not(:user-valid)
119
+ + [data-slot="radio-button-indicator"]
120
+ ) {
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
+ }
126
128
  }
127
129
  }
@@ -7,17 +7,17 @@
7
7
  }
8
8
 
9
9
  :where(
10
- [data-nk="radio-button-group"] > [data-slot="radio-button-group-legend"]
11
- ) {
10
+ [data-nk="radio-button-group"] > [data-slot="radio-button-group-legend"]
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(
18
- [data-nk="radio-button-group"]
19
- > [data-slot="radio-button-group-description"]
20
- ) {
18
+ [data-nk="radio-button-group"]
19
+ > [data-slot="radio-button-group-description"]
20
+ ) {
21
21
  margin-block-start: var(--nk-space);
22
22
  color: var(--nk-color-muted-foreground);
23
23
  font-size: var(--nk-text-sm);
@@ -25,66 +25,66 @@
25
25
  }
26
26
 
27
27
  :where(
28
- [data-nk="radio-button-group"] > [data-slot="radio-button-group-choices"]
29
- ) {
28
+ [data-nk="radio-button-group"] > [data-slot="radio-button-group-choices"]
29
+ ) {
30
30
  display: grid;
31
31
  gap: var(--nk-space);
32
32
  margin-block-start: calc(var(--nk-space) * 2);
33
33
  }
34
34
 
35
35
  :where(
36
- [data-nk="radio-button-group"][data-presentation="list"][data-orientation="vertical"]
37
- > [data-slot="radio-button-group-choices"]
38
- ) {
36
+ [data-nk="radio-button-group"][data-presentation="list"][data-orientation="vertical"]
37
+ > [data-slot="radio-button-group-choices"]
38
+ ) {
39
39
  gap: 0;
40
40
  }
41
41
 
42
42
  :where(
43
- [data-nk="radio-button-group"][data-orientation="horizontal"]
44
- > [data-slot="radio-button-group-choices"]
45
- ) {
43
+ [data-nk="radio-button-group"][data-orientation="horizontal"]
44
+ > [data-slot="radio-button-group-choices"]
45
+ ) {
46
46
  display: flex;
47
47
  flex-wrap: wrap;
48
48
  gap: calc(var(--nk-space) * 4);
49
49
  }
50
50
 
51
51
  :where(
52
- [data-nk="radio-button-group"][data-presentation="cards"]
53
- > [data-slot="radio-button-group-choices"]
54
- > [data-slot="radio-button-group-choice"]
55
- ) {
52
+ [data-nk="radio-button-group"][data-presentation="cards"]
53
+ > [data-slot="radio-button-group-choices"]
54
+ > [data-slot="radio-button-group-choice"]
55
+ ) {
56
56
  inline-size: 100%;
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(
64
- [data-nk="radio-button-group"][data-presentation="segmented"]
65
- > [data-slot="radio-button-group-choices"]
66
- ) {
64
+ [data-nk="radio-button-group"][data-presentation="segmented"]
65
+ > [data-slot="radio-button-group-choices"]
66
+ ) {
67
67
  display: inline-flex;
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(
75
- [data-nk="radio-button-group"][data-presentation="segmented"]
76
- > [data-slot="radio-button-group-choices"]
77
- > [data-slot="radio-button-group-choice"]
78
- ) {
75
+ [data-nk="radio-button-group"][data-presentation="segmented"]
76
+ > [data-slot="radio-button-group-choices"]
77
+ > [data-slot="radio-button-group-choice"]
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(
85
- [data-nk="radio-button-group"][data-presentation="segmented"]
86
- [data-slot="radio-button-indicator"]
87
- ) {
85
+ [data-nk="radio-button-group"][data-presentation="segmented"]
86
+ [data-slot="radio-button-indicator"]
87
+ ) {
88
88
  display: none;
89
89
  }
90
90
 
@@ -94,9 +94,9 @@
94
94
  centred between the segment's own paddings and makes the entire segment
95
95
  clickable. */
96
96
  :where(
97
- [data-nk="radio-button-group"][data-presentation="segmented"]
98
- [data-slot="radio-button-label"]
99
- ) {
97
+ [data-nk="radio-button-group"][data-presentation="segmented"]
98
+ [data-slot="radio-button-label"]
99
+ ) {
100
100
  position: relative;
101
101
  display: flex;
102
102
  gap: 0;
@@ -106,9 +106,9 @@
106
106
  }
107
107
 
108
108
  :where(
109
- [data-nk="radio-button-group"][data-presentation="segmented"]
110
- [data-slot="radio-button-control"]
111
- ) {
109
+ [data-nk="radio-button-group"][data-presentation="segmented"]
110
+ [data-slot="radio-button-control"]
111
+ ) {
112
112
  position: absolute;
113
113
  inset: 0;
114
114
  inline-size: 100%;
@@ -118,13 +118,13 @@
118
118
 
119
119
  @layer nitro-kit.state {
120
120
  :where(
121
- [data-nk="radio-button-group"][data-presentation="cards"]
122
- > [data-slot="radio-button-group-choices"]
123
- > [data-slot="radio-button-group-choice"]:has(input:checked),
124
- [data-nk="radio-button-group"][data-presentation="segmented"]
125
- > [data-slot="radio-button-group-choices"]
126
- > [data-slot="radio-button-group-choice"]:has(input:checked)
127
- ) {
121
+ [data-nk="radio-button-group"][data-presentation="cards"]
122
+ > [data-slot="radio-button-group-choices"]
123
+ > [data-slot="radio-button-group-choice"]:has(input:checked),
124
+ [data-nk="radio-button-group"][data-presentation="segmented"]
125
+ > [data-slot="radio-button-group-choices"]
126
+ > [data-slot="radio-button-group-choice"]:has(input:checked)
127
+ ) {
128
128
  background: var(--nk-color-surface);
129
129
  border-color: var(--nk-color-primary);
130
130
  box-shadow: var(--nk-shadow-sm);
@@ -133,10 +133,10 @@
133
133
  /* The segmented indicator is hidden, so the focus ring belongs to the native
134
134
  radio that now covers the segment. */
135
135
  :where(
136
- [data-nk="radio-button-group"][data-presentation="segmented"]
137
- [data-slot="radio-button-control"]:focus-visible
138
- ) {
139
- border-radius: calc(var(--nk-radius-md) - var(--nk-space));
136
+ [data-nk="radio-button-group"][data-presentation="segmented"]
137
+ [data-slot="radio-button-control"]:focus-visible
138
+ ) {
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
  }
@@ -5,9 +5,14 @@
5
5
  --lexxy-color-text-subtle: var(--nk-color-muted-foreground);
6
6
  --lexxy-color-link: var(--nk-color-primary);
7
7
  --lexxy-color-accent-dark: var(--nk-color-primary);
8
+ --lexxy-color-ink: var(--nk-color-foreground);
9
+ --lexxy-color-ink-medium: var(--nk-color-muted-foreground);
10
+ --lexxy-color-ink-inverted: var(--nk-color-primary-foreground);
8
11
  --lexxy-color-ink-lighter: var(--nk-color-border);
9
12
  --lexxy-color-ink-lightest: var(--nk-color-muted);
10
- --lexxy-radius: var(--nk-radius-md);
13
+ --lexxy-color-selected: var(--nk-color-muted);
14
+ --lexxy-color-selected-hover: var(--nk-color-border);
15
+ --lexxy-radius: var(--nk-radius-lg);
11
16
  display: block;
12
17
  inline-size: 100%;
13
18
  }
@@ -19,3 +24,13 @@
19
24
  min-block-size: calc(var(--nk-space) * 24);
20
25
  }
21
26
  }
27
+
28
+ @layer nitro-kit.state {
29
+ :where(
30
+ [data-nk="rich-text-area"]
31
+ > [data-slot="rich-text-area-editor"]
32
+ > [aria-invalid="true"]
33
+ ) {
34
+ border-color: var(--nk-color-destructive);
35
+ }
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,15 +41,22 @@
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
  }
45
48
 
46
- :where(
47
- [data-nk="select"]:has(> [data-slot="select-control"][multiple])
48
- > [data-slot="select-icon"]
49
- ) {
50
- display: none;
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
+ }
51
60
  }
52
61
  }
53
62
 
@@ -59,12 +68,12 @@
59
68
 
60
69
  :where([data-nk="select"] > [data-slot="select-control"]:disabled) {
61
70
  cursor: not-allowed;
62
- opacity: 0.6;
71
+ opacity: var(--nk-disabled-opacity);
63
72
  }
64
73
 
65
74
  :where(
66
- [data-nk="select"] > [data-slot="select-control"][aria-invalid="true"]
67
- ) {
68
- border-color: var(--nk-color-danger);
75
+ [data-nk="select"] > [data-slot="select-control"][aria-invalid="true"]
76
+ ) {
77
+ border-color: var(--nk-color-destructive);
69
78
  }
70
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
- [data-nk="settings-layout"] > [data-slot="settings-layout-navigation"],
12
- [data-nk="settings-layout"] > [data-slot="settings-layout-content"]
13
- ) {
14
- min-width: 0;
11
+ [data-nk="settings-layout"] > [data-slot="settings-layout-navigation"],
12
+ [data-nk="settings-layout"] > [data-slot="settings-layout-content"]
13
+ ) {
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);
@@ -52,47 +52,50 @@
52
52
  /* Emphasis alone marks the current destination without adding a decorative
53
53
  edge or a filled block that would outweigh the content beside it. */
54
54
  :where(
55
- [data-nk="settings-layout"]
56
- [data-slot="settings-layout-item-link"][data-state="current"]
57
- ) {
55
+ [data-nk="settings-layout"]
56
+ [data-slot="settings-layout-item-link"][data-state="current"]
57
+ ) {
58
58
  color: var(--nk-color-foreground);
59
59
  font-weight: var(--nk-font-weight-semibold);
60
60
  }
61
61
 
62
62
  :where(
63
- [data-nk="settings-layout"]
64
- [data-slot="settings-layout-item-link"][data-state="current"]
65
- [data-slot="settings-layout-item-icon"]
66
- ) {
63
+ [data-nk="settings-layout"]
64
+ [data-slot="settings-layout-item-link"][data-state="current"]
65
+ [data-slot="settings-layout-item-icon"]
66
+ ) {
67
67
  color: var(--nk-color-foreground);
68
68
  }
69
69
 
70
70
  @media (hover: hover) {
71
71
  :where(
72
- [data-nk="settings-layout"] [data-slot="settings-layout-item-link"]:hover
73
- ) {
72
+ [data-nk="settings-layout"]
73
+ [data-slot="settings-layout-item-link"]:hover
74
+ ) {
74
75
  color: var(--nk-color-foreground);
75
76
  background: color-mix(in oklab, var(--nk-color-muted) 60%, transparent);
76
77
  }
77
78
  }
78
79
 
79
80
  :where(
80
- [data-nk="settings-layout"]
81
- [data-slot="settings-layout-item-link"]:focus-visible
82
- ) {
81
+ [data-nk="settings-layout"]
82
+ [data-slot="settings-layout-item-link"]:focus-visible
83
+ ) {
83
84
  outline: var(--nk-focus-width) solid var(--nk-color-focus);
84
85
  outline-offset: calc(var(--nk-focus-offset) * -1);
85
86
  }
86
87
 
87
88
  @media (prefers-reduced-motion: reduce) {
88
89
  :where(
89
- [data-nk="settings-layout"] [data-slot="settings-layout-item-link"]
90
- ) {
90
+ [data-nk="settings-layout"] [data-slot="settings-layout-item-link"]
91
+ ) {
91
92
  transition-duration: 0.01ms;
92
93
  }
93
94
  }
95
+ }
94
96
 
95
- @media (max-width: 48rem) {
97
+ @layer nitro-kit.compound {
98
+ @media (width < 48rem) {
96
99
  :where([data-nk="settings-layout"]) {
97
100
  grid-template-columns: minmax(0, 1fr);
98
101
  }
@@ -0,0 +1,84 @@
1
+ @layer nitro-kit.base {
2
+ :where([data-nk="settings-section"]) {
3
+ display: grid;
4
+ grid-template-columns: minmax(10rem, 14rem) minmax(0, 1fr);
5
+ column-gap: calc(var(--nk-space) * 8);
6
+ row-gap: calc(var(--nk-space) * 5);
7
+ align-items: start;
8
+ min-inline-size: 0;
9
+ color: var(--nk-color-foreground);
10
+ }
11
+
12
+ :where([data-nk="settings-section"] > [data-slot="settings-section-header"]) {
13
+ display: grid;
14
+ gap: calc(var(--nk-space) * 2);
15
+ }
16
+
17
+ :where([data-nk="settings-section"] [data-slot="settings-section-title"]) {
18
+ font-size: var(--nk-title-section-size);
19
+ font-weight: var(--nk-title-section-weight);
20
+ line-height: var(--nk-leading-tight);
21
+ text-wrap: balance;
22
+ }
23
+
24
+ :where(
25
+ [data-nk="settings-section"] [data-slot="settings-section-description"]
26
+ ) {
27
+ max-inline-size: var(--nk-content-lg);
28
+ color: var(--nk-color-muted-foreground);
29
+ font-size: var(--nk-text-sm);
30
+ line-height: var(--nk-leading-relaxed);
31
+ text-wrap: pretty;
32
+ }
33
+
34
+ :where([data-nk="settings-section"] > [data-slot="settings-section-form"]) {
35
+ display: grid;
36
+ grid-column: 2;
37
+ gap: calc(var(--nk-space) * 4);
38
+ inline-size: 100%;
39
+ max-inline-size: var(--nk-content-lg);
40
+ }
41
+
42
+ :where([data-nk="settings-section"] > [data-slot="settings-section-status"]) {
43
+ grid-column: 2;
44
+ inline-size: 100%;
45
+ max-inline-size: var(--nk-content-lg);
46
+ }
47
+
48
+ :where(
49
+ [data-nk="settings-section"] > [data-slot="settings-section-form"] > form
50
+ ) {
51
+ display: grid;
52
+ gap: calc(var(--nk-space) * 5);
53
+ }
54
+
55
+ :where(
56
+ [data-nk="settings-section"]
57
+ > [data-slot="settings-section-form"]
58
+ > form
59
+ > [data-nk="button"]
60
+ ) {
61
+ justify-self: start;
62
+ }
63
+
64
+ :where([data-nk="settings-section"] + [data-nk="settings-section"]) {
65
+ padding-block-start: calc(var(--nk-space) * 8);
66
+ border-block-start: var(--nk-border-width) solid var(--nk-color-border);
67
+ }
68
+ }
69
+
70
+ @layer nitro-kit.compound {
71
+ @media (width < 48rem) {
72
+ :where([data-nk="settings-section"]) {
73
+ grid-template-columns: minmax(0, 1fr);
74
+ row-gap: calc(var(--nk-space) * 4);
75
+ }
76
+
77
+ :where(
78
+ [data-nk="settings-section"] > [data-slot="settings-section-status"],
79
+ [data-nk="settings-section"] > [data-slot="settings-section-form"]
80
+ ) {
81
+ grid-column: 1;
82
+ }
83
+ }
84
+ }