nitro_kit 2.0.0.alpha.6 → 2.0.0.beta.2

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 (40) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +68 -1
  3. data/README.md +16 -2
  4. data/STYLE_GUIDE.md +3 -1
  5. data/app/assets/stylesheets/nitro_kit.css +519 -35
  6. data/app/components/nitro_kit/app_shell.rb +41 -5
  7. data/app/components/nitro_kit/avatar.rb +21 -2
  8. data/app/components/nitro_kit/card.rb +28 -1
  9. data/app/javascript/controllers/nk/app_shell_controller.js +64 -2
  10. data/config/locales/en.yml +1 -0
  11. data/docs/agent_native_spec.md +5 -4
  12. data/docs/component_contracts.md +93 -5
  13. data/docs/customization.md +2 -2
  14. data/docs/eject.md +86 -0
  15. data/docs/migration_1_to_2.md +1 -1
  16. data/docs/patterns/application_foundation.md +22 -0
  17. data/docs/patterns/inset_workspace.md +9 -1
  18. data/docs/rails_integration.md +1 -1
  19. data/lib/generators/nitro_kit/eject_generator.rb +26 -0
  20. data/lib/nitro_kit/ejection.rb +136 -0
  21. data/lib/nitro_kit/version.rb +1 -1
  22. data/src/stylesheets/nitro_kit/components/app_navigation.css +4 -1
  23. data/src/stylesheets/nitro_kit/components/app_shell.css +209 -0
  24. data/src/stylesheets/nitro_kit/components/avatar.css +10 -0
  25. data/src/stylesheets/nitro_kit/components/avatar_stack.css +9 -5
  26. data/src/stylesheets/nitro_kit/components/card.css +206 -15
  27. data/src/stylesheets/nitro_kit/components/danger_zone.css +1 -1
  28. data/src/stylesheets/nitro_kit/components/dropzone.css +15 -0
  29. data/src/stylesheets/nitro_kit/components/empty_state.css +3 -3
  30. data/src/stylesheets/nitro_kit/components/field_group.css +6 -2
  31. data/src/stylesheets/nitro_kit/components/pagination_bar.css +3 -0
  32. data/src/stylesheets/nitro_kit/components/progressive_image.css +2 -0
  33. data/src/stylesheets/nitro_kit/components/settings_layout.css +2 -0
  34. data/src/stylesheets/nitro_kit/components/stat_grid.css +4 -4
  35. data/src/stylesheets/nitro_kit/components/toolbar.css +12 -0
  36. data/src/stylesheets/nitro_kit/components/tooltip.css +15 -1
  37. data/src/stylesheets/nitro_kit/components/typeset.css +4 -0
  38. data/src/stylesheets/nitro_kit/reset.css +11 -1
  39. data/src/stylesheets/nitro_kit/tokens.css +3 -2
  40. metadata +5 -2
@@ -1,26 +1,88 @@
1
1
  @layer nitro-kit.base {
2
2
  :where([data-nk="card"]) {
3
3
  --_nk-card-padding: calc(var(--nk-space) * 6);
4
+ --_nk-card-gap: calc(var(--nk-space) * 4);
5
+ --_nk-card-radius: var(--nk-radius-xl);
6
+ --_nk-card-title-size: var(--nk-text-base);
7
+ --_nk-card-title-leading: calc(
8
+ var(--_nk-card-title-size) * var(--nk-leading-tight)
9
+ );
4
10
 
5
11
  display: flex;
6
12
  flex-direction: column;
7
13
  align-items: stretch;
8
- gap: calc(var(--nk-space) * 4);
14
+ gap: var(--_nk-card-gap);
9
15
  padding: var(--_nk-card-padding);
10
16
  color: var(--nk-color-foreground);
11
17
  background: var(--nk-color-surface);
12
18
  border: var(--nk-border-width) solid var(--nk-color-border);
13
- border-radius: var(--nk-radius-lg);
14
- box-shadow: var(--nk-shadow-sm);
19
+ border-radius: var(--_nk-card-radius);
20
+ box-shadow: var(--nk-shadow-xs);
15
21
  }
16
22
 
17
- :where([data-nk="card"] > [data-slot="card-title"]) {
18
- font-size: var(--nk-title-surface-size);
19
- font-weight: var(--nk-title-surface-weight);
20
- line-height: var(--nk-leading-tight);
23
+ :where(
24
+ [data-nk="card"] > [data-slot="card-title"],
25
+ [data-nk="card"] > [data-slot="card-header"] > [data-slot="card-title"]
26
+ ) {
27
+ font-size: var(--_nk-card-title-size);
28
+ font-weight: var(--nk-font-weight-semibold);
29
+ line-height: var(--_nk-card-title-leading);
21
30
  text-wrap: balance;
22
31
  }
23
32
 
33
+ :where(
34
+ [data-nk="card"] > [data-slot="card-description"],
35
+ [data-nk="card"]
36
+ > [data-slot="card-header"]
37
+ > [data-slot="card-description"]
38
+ ) {
39
+ color: var(--nk-color-muted-foreground);
40
+ font-size: var(--nk-text-sm);
41
+ line-height: var(--nk-leading-normal);
42
+ text-wrap: pretty;
43
+ }
44
+
45
+ /* The header pairs a title and description with trailing actions centred
46
+ beside them. Actions take negative block margins so a small button never
47
+ makes a title-only header taller than its title line. */
48
+ :where([data-nk="card"] > [data-slot="card-header"]) {
49
+ display: grid;
50
+ grid-template-columns: minmax(0, 1fr) auto;
51
+ column-gap: calc(var(--nk-space) * 4);
52
+ align-items: start;
53
+ }
54
+
55
+ :where(
56
+ [data-nk="card"]
57
+ > [data-slot="card-header"]
58
+ > [data-slot="card-title"]
59
+ + [data-slot="card-description"]
60
+ ) {
61
+ margin-block-start: calc(var(--nk-space) * 1);
62
+ }
63
+
64
+ :where([data-nk="card"] > [data-slot="card-header"] > *) {
65
+ grid-column: 1;
66
+ }
67
+
68
+ :where(
69
+ [data-nk="card"] > [data-slot="card-header"] > [data-slot="card-actions"]
70
+ ) {
71
+ grid-column: 2;
72
+ grid-row: 1 / span 2;
73
+ align-self: center;
74
+ margin-block: calc(
75
+ (var(--_nk-card-title-leading) - var(--nk-control-height-sm)) / 2
76
+ );
77
+ }
78
+
79
+ :where([data-nk="card"] [data-slot="card-actions"]) {
80
+ display: flex;
81
+ align-items: center;
82
+ flex-wrap: wrap;
83
+ gap: calc(var(--nk-space) * 2);
84
+ }
85
+
24
86
  :where([data-nk="card"] > [data-slot="card-body"]) {
25
87
  color: var(--nk-color-muted-foreground);
26
88
  font-size: var(--nk-text-sm);
@@ -33,10 +95,96 @@
33
95
  align-items: center;
34
96
  flex-wrap: wrap;
35
97
  gap: calc(var(--nk-space) * 2);
98
+ color: var(--nk-color-muted-foreground);
99
+ font-size: var(--nk-text-sm);
100
+ line-height: var(--nk-leading-normal);
101
+ /* Raw text becomes an anonymous flex item. Include emergency breaks in
102
+ its intrinsic width so long URLs can shrink with the footer. */
103
+ overflow-wrap: anywhere;
104
+ }
105
+
106
+ :where(
107
+ [data-nk="card"] > [data-slot="card-footer"] > [data-slot="card-actions"]
108
+ ) {
109
+ margin-inline-start: auto;
110
+ }
111
+ }
112
+
113
+ @layer nitro-kit.variant {
114
+ :where([data-nk="card"][data-variant="outline"]) {
115
+ background: transparent;
116
+ box-shadow: none;
117
+ }
118
+
119
+ :where([data-nk="card"][data-variant="muted"]) {
120
+ background: color-mix(in oklab, var(--nk-color-foreground) 4%, transparent);
121
+ box-shadow: none;
122
+ }
123
+ }
124
+
125
+ @layer nitro-kit.size {
126
+ :where([data-nk="card"][data-size="sm"]) {
127
+ --_nk-card-padding: calc(var(--nk-space) * 4);
128
+ --_nk-card-gap: calc(var(--nk-space) * 3);
129
+ --_nk-card-radius: var(--nk-radius-lg);
130
+ --_nk-card-title-size: var(--nk-text-sm);
131
+ }
132
+
133
+ :where([data-nk="card"][data-size="lg"]) {
134
+ --_nk-card-padding: calc(var(--nk-space) * 8);
135
+ --_nk-card-gap: calc(var(--nk-space) * 6);
136
+ --_nk-card-radius: calc(var(--nk-radius-xl) + var(--nk-space));
137
+ --_nk-card-title-size: var(--nk-text-lg);
36
138
  }
37
139
  }
38
140
 
39
141
  @layer nitro-kit.compound {
142
+ /* A description directly under a root-level title belongs to it. */
143
+ :where(
144
+ [data-nk="card"] > [data-slot="card-title"] + [data-slot="card-description"]
145
+ ) {
146
+ margin-block-start: calc(var(--nk-space) * 1 - var(--_nk-card-gap));
147
+ }
148
+
149
+ /* A section set apart by a divider at the card's edge is a band: the space
150
+ between the band and the edge matches the space between the band and its
151
+ divider, so a footer's actions or a header's title sit evenly. Full
152
+ regions keep the padding because they bleed through it. */
153
+ :where(
154
+ [data-nk="card"]:has(
155
+ > :first-child:not([data-slot="card-full"]):not(
156
+ [data-slot="card-divider"]
157
+ )
158
+ + [data-slot="card-divider"]
159
+ )
160
+ ) {
161
+ padding-block-start: var(--_nk-card-gap);
162
+ }
163
+
164
+ :where(
165
+ [data-nk="card"]:has(
166
+ > [data-slot="card-divider"]
167
+ + :last-child:not([data-slot="card-full"]):not(
168
+ [data-slot="card-divider"]
169
+ )
170
+ )
171
+ ) {
172
+ padding-block-end: var(--_nk-card-gap);
173
+ }
174
+
175
+ /* When a parent stretches the card, such as a grid row, the spare height
176
+ goes above a trailing footer and its divider, keeping actions on the
177
+ card's bottom edge across a row. */
178
+ :where(
179
+ [data-nk="card"]
180
+ > :not([data-slot="card-divider"])
181
+ + [data-slot="card-footer"]:last-child,
182
+ [data-nk="card"]
183
+ > [data-slot="card-divider"]:has(+ [data-slot="card-footer"]:last-child)
184
+ ) {
185
+ margin-block-start: auto;
186
+ }
187
+
40
188
  /* Only the region that bleeds to the edge clips, never the card itself, so
41
189
  an edge-to-edge image cannot break the card's corners while tooltips,
42
190
  dropdowns, and other overlays inside a card stay free to escape its box. */
@@ -48,27 +196,70 @@
48
196
  :where([data-nk="card"] > [data-slot="card-full"]:first-child) {
49
197
  margin-block-start: calc(var(--_nk-card-padding) * -1);
50
198
  border-start-start-radius: calc(
51
- var(--nk-radius-lg) - var(--nk-border-width)
199
+ var(--_nk-card-radius) - var(--nk-border-width)
200
+ );
201
+ border-start-end-radius: calc(
202
+ var(--_nk-card-radius) - var(--nk-border-width)
52
203
  );
53
- border-start-end-radius: calc(var(--nk-radius-lg) - var(--nk-border-width));
54
204
  }
55
205
 
56
206
  :where([data-nk="card"] > [data-slot="card-full"]:last-child) {
57
207
  margin-block-end: calc(var(--_nk-card-padding) * -1);
58
- border-end-start-radius: calc(var(--nk-radius-lg) - var(--nk-border-width));
59
- border-end-end-radius: calc(var(--nk-radius-lg) - var(--nk-border-width));
208
+ border-end-start-radius: calc(
209
+ var(--_nk-card-radius) - var(--nk-border-width)
210
+ );
211
+ border-end-end-radius: calc(
212
+ var(--_nk-card-radius) - var(--nk-border-width)
213
+ );
60
214
  }
61
215
 
62
216
  /* Full-width media fills the card edge to edge, so the card owns the corner
63
217
  radius and the media drops its own. */
64
218
  :where(
65
- [data-nk="card"]
66
- > [data-slot="card-full"]
67
- :is(img, [data-nk="progressive-image"])
68
- ) {
219
+ [data-nk="card"]
220
+ > [data-slot="card-full"]
221
+ :is(img, [data-nk="progressive-image"])
222
+ ) {
69
223
  border-radius: 0;
70
224
  }
71
225
 
226
+ /* A table bleeding to the card's edges keeps its first and last columns
227
+ and its caption on the card's content gutter. */
228
+ :where(
229
+ [data-nk="card"]
230
+ > [data-slot="card-full"]
231
+ > [data-nk="table"]
232
+ [data-slot="table-header"]:first-child,
233
+ [data-nk="card"]
234
+ > [data-slot="card-full"]
235
+ > [data-nk="table"]
236
+ [data-slot="table-cell"]:first-child
237
+ ) {
238
+ padding-inline-start: var(--_nk-card-padding);
239
+ }
240
+
241
+ :where(
242
+ [data-nk="card"]
243
+ > [data-slot="card-full"]
244
+ > [data-nk="table"]
245
+ [data-slot="table-header"]:last-child,
246
+ [data-nk="card"]
247
+ > [data-slot="card-full"]
248
+ > [data-nk="table"]
249
+ [data-slot="table-cell"]:last-child
250
+ ) {
251
+ padding-inline-end: var(--_nk-card-padding);
252
+ }
253
+
254
+ :where(
255
+ [data-nk="card"]
256
+ > [data-slot="card-full"]
257
+ > [data-nk="table"]
258
+ [data-slot="table-caption"]
259
+ ) {
260
+ padding-inline: var(--_nk-card-padding);
261
+ }
262
+
72
263
  :where([data-nk="card"] > [data-slot="card-divider"]) {
73
264
  margin-inline: calc(var(--_nk-card-padding) * -1);
74
265
  border-block-start: var(--nk-border-width) solid var(--nk-color-border);
@@ -13,7 +13,7 @@
13
13
  );
14
14
  border: var(--nk-border-width) solid
15
15
  color-mix(in oklab, var(--nk-color-destructive) 50%, transparent);
16
- border-radius: var(--nk-radius-lg);
16
+ border-radius: var(--nk-radius-xl);
17
17
  }
18
18
 
19
19
  :where([data-nk="danger-zone"] > [data-slot="danger-zone-header"]) {
@@ -443,3 +443,18 @@
443
443
  }
444
444
  }
445
445
  }
446
+
447
+ @layer nitro-kit.base {
448
+ /* Message children are grid items placed at start, so they size to their
449
+ content; cap them at the cell so one long word wraps inside the target. */
450
+ :where(
451
+ [data-nk="dropzone"]
452
+ [data-slot="dropzone-message"]
453
+ > [data-slot="dropzone-title"],
454
+ [data-nk="dropzone"]
455
+ [data-slot="dropzone-message"]
456
+ > [data-slot="dropzone-description"]
457
+ ) {
458
+ max-inline-size: 100%;
459
+ }
460
+ }
@@ -9,7 +9,7 @@
9
9
  text-align: center;
10
10
  background: var(--nk-color-surface);
11
11
  border: var(--nk-border-width) dashed var(--nk-color-border);
12
- border-radius: var(--nk-radius-lg);
12
+ border-radius: var(--nk-radius-xl);
13
13
  }
14
14
 
15
15
  :where([data-nk="empty-state"] > [data-slot="empty-state-icon"]) {
@@ -19,7 +19,7 @@
19
19
  }
20
20
 
21
21
  :where([data-nk="empty-state"] > [data-slot="empty-state-title"]) {
22
- max-inline-size: var(--nk-content-md);
22
+ max-inline-size: min(100%, var(--nk-content-md));
23
23
  font-size: var(--nk-title-surface-size);
24
24
  font-weight: var(--nk-title-surface-weight);
25
25
  line-height: var(--nk-leading-tight);
@@ -27,7 +27,7 @@
27
27
  }
28
28
 
29
29
  :where([data-nk="empty-state"] > [data-slot="empty-state-description"]) {
30
- max-inline-size: var(--nk-content-md);
30
+ max-inline-size: min(100%, var(--nk-content-md));
31
31
  color: var(--nk-color-muted-foreground);
32
32
  font-size: var(--nk-text-sm);
33
33
  line-height: var(--nk-leading-relaxed);
@@ -12,8 +12,12 @@
12
12
 
13
13
  /* A group keeps the same rhythm at either boundary as the fields inside it,
14
14
  so introductory copy and trailing actions never read as attached to the
15
- nearest control. */
16
- :where(* + [data-nk="field-group"], [data-nk="field-group"] + *) {
15
+ nearest control. Hidden inputs, such as the ones Rails emits at the top of
16
+ every form, are not visible neighbours and do not count. */
17
+ :where(
18
+ :not(input[type="hidden"]) + [data-nk="field-group"],
19
+ [data-nk="field-group"] + :not(input[type="hidden"])
20
+ ) {
17
21
  margin-block-start: calc(var(--nk-space) * 6);
18
22
  }
19
23
  }
@@ -28,6 +28,9 @@
28
28
  @media (width < 48rem) {
29
29
  :where([data-nk="pagination-bar"]) {
30
30
  flex-direction: column;
31
+ /* A wrapping column sizes its line to the widest item, so stretch
32
+ could not narrow anything; one column never needs to wrap. */
33
+ flex-wrap: nowrap;
31
34
  align-items: stretch;
32
35
  }
33
36
 
@@ -70,6 +70,8 @@
70
70
  font-size: var(--nk-text-sm);
71
71
  text-align: center;
72
72
  text-wrap: pretty;
73
+ /* The alt text is an anonymous grid item with a min-content floor. */
74
+ overflow-wrap: anywhere;
73
75
  }
74
76
  }
75
77
 
@@ -29,6 +29,8 @@
29
29
  display: flex;
30
30
  gap: calc(var(--nk-space) * 2);
31
31
  align-items: center;
32
+ /* The label text is an anonymous flex item with a min-content floor. */
33
+ overflow-wrap: anywhere;
32
34
  min-block-size: var(--nk-control-height-sm);
33
35
  padding: var(--nk-space) calc(var(--nk-space) * 2);
34
36
  color: var(--nk-color-muted-foreground);
@@ -22,11 +22,11 @@
22
22
  align-content: start;
23
23
  gap: calc(var(--nk-space) * 2);
24
24
  min-block-size: 100%;
25
- padding: calc(var(--nk-space) * 5);
25
+ padding: calc(var(--nk-space) * 6);
26
26
  background: var(--nk-color-surface);
27
27
  border: var(--nk-border-width) solid var(--nk-color-border);
28
- border-radius: var(--nk-radius-lg);
29
- box-shadow: var(--nk-shadow-sm);
28
+ border-radius: var(--nk-radius-xl);
29
+ box-shadow: var(--nk-shadow-xs);
30
30
  }
31
31
 
32
32
  :where([data-nk="stat-grid"] [data-slot="stat-grid-label"]) {
@@ -38,7 +38,7 @@
38
38
  :where([data-nk="stat-grid"] [data-slot="stat-grid-value"]) {
39
39
  font-size: var(--nk-text-2xl);
40
40
  font-variant-numeric: tabular-nums;
41
- font-weight: var(--nk-font-weight-bold);
41
+ font-weight: var(--nk-font-weight-semibold);
42
42
  line-height: var(--nk-leading-tight);
43
43
  overflow-wrap: anywhere;
44
44
  }
@@ -26,12 +26,24 @@
26
26
  justify-content: flex-end;
27
27
  margin-inline-start: auto;
28
28
  }
29
+
30
+ /* Application content in a region is a flex item; without this a heading
31
+ holding one long word keeps its min-content width and widens the page. */
32
+ :where(
33
+ [data-nk="toolbar"] > [data-slot="toolbar-leading"] > *,
34
+ [data-nk="toolbar"] > [data-slot="toolbar-trailing"] > *
35
+ ) {
36
+ min-inline-size: 0;
37
+ }
29
38
  }
30
39
 
31
40
  @layer nitro-kit.state {
32
41
  @media (width < 48rem) {
33
42
  :where([data-nk="toolbar"]) {
34
43
  flex-direction: column;
44
+ /* A wrapping column sizes its line to the widest item, so stretch
45
+ could not narrow anything; one column never needs to wrap. */
46
+ flex-wrap: nowrap;
35
47
  align-items: stretch;
36
48
  }
37
49
 
@@ -19,6 +19,9 @@
19
19
  line-height: var(--nk-leading-normal);
20
20
  text-wrap: pretty;
21
21
  pointer-events: auto;
22
+ /* Hidden tooltips leave layout entirely; a merely invisible one still
23
+ widens the page when it hangs past the viewport edge. */
24
+ display: none;
22
25
  visibility: hidden;
23
26
  background: var(--nk-color-elevated);
24
27
  border: var(--nk-border-width) solid var(--nk-color-border);
@@ -27,7 +30,8 @@
27
30
  opacity: 0;
28
31
  transition:
29
32
  opacity var(--nk-duration-fast) var(--nk-ease),
30
- visibility var(--nk-duration-fast) var(--nk-ease) allow-discrete;
33
+ visibility var(--nk-duration-fast) var(--nk-ease) allow-discrete,
34
+ display var(--nk-duration-fast) var(--nk-ease) allow-discrete;
31
35
  }
32
36
 
33
37
  :where([data-nk="tooltip"] > [data-slot="tooltip-content"]::before) {
@@ -111,8 +115,13 @@
111
115
  [data-nk="tooltip"]:not([data-dismissed]):focus-within
112
116
  > [data-slot="tooltip-content"]
113
117
  ) {
118
+ display: block;
114
119
  visibility: visible;
115
120
  opacity: 1;
121
+
122
+ @starting-style {
123
+ opacity: 0;
124
+ }
116
125
  }
117
126
 
118
127
  @media (hover: hover) {
@@ -120,8 +129,13 @@
120
129
  [data-nk="tooltip"]:not([data-dismissed]):hover
121
130
  > [data-slot="tooltip-content"]
122
131
  ) {
132
+ display: block;
123
133
  visibility: visible;
124
134
  opacity: 1;
135
+
136
+ @starting-style {
137
+ opacity: 0;
138
+ }
125
139
  }
126
140
  }
127
141
 
@@ -118,6 +118,9 @@
118
118
  padding: calc(var(--nk-space) * 2) calc(var(--nk-space) * 3);
119
119
  text-align: start;
120
120
  vertical-align: top;
121
+ /* Prose tables have no scroll wrapper, so an unbroken email or
122
+ identifier must be allowed to break inside its cell. */
123
+ overflow-wrap: anywhere;
121
124
  border-block-end: var(--nk-border-width) solid var(--nk-color-border);
122
125
  }
123
126
 
@@ -259,6 +262,7 @@
259
262
  padding: calc(var(--nk-space) * 2) calc(var(--nk-space) * 3);
260
263
  text-align: start;
261
264
  vertical-align: top;
265
+ overflow-wrap: anywhere;
262
266
  border-block-end: var(--nk-border-width) solid var(--nk-color-border);
263
267
  }
264
268
 
@@ -17,9 +17,19 @@
17
17
  }
18
18
 
19
19
  /* Nitro-owned boxes never establish a min-content floor, so long slot
20
- content shrinks instead of overflowing its flex or grid parent. */
20
+ content shrinks instead of overflowing its flex or grid parent, and a
21
+ word too long for its line breaks rather than painting past the box.
22
+ `break-word` leaves intrinsic sizing alone, so nothing shrinks that would
23
+ not have shrunk already; `nowrap` slots keep their single line. */
21
24
  :where([data-nk], [data-nk] [data-slot]) {
22
25
  min-inline-size: 0;
26
+ overflow-wrap: break-word;
27
+ }
28
+
29
+ /* A legend sizes to its content regardless of its fieldset, so a long
30
+ label would widen the page; cap it and let it wrap like any label. */
31
+ :where([data-nk] legend) {
32
+ max-inline-size: 100%;
23
33
  }
24
34
 
25
35
  :where(html, :host) {
@@ -25,8 +25,9 @@
25
25
 
26
26
  /* The title scale. Four roles cover every owned title and legend: page
27
27
  for the one page heading, section for full-width section headers,
28
- surface for cards, dialogs, sheets, empty states, and fieldsets, and
29
- compact for control-group legends and status titles. */
28
+ surface for dialogs, sheets, empty states, and fieldsets, and compact
29
+ for control-group legends and status titles. Card titles scale with
30
+ the card's own size instead. */
30
31
  --nk-title-page-size: var(--nk-text-2xl);
31
32
  --nk-title-page-weight: var(--nk-font-weight-bold);
32
33
  --nk-title-section-size: var(--nk-text-xl);
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nitro_kit
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.alpha.6
4
+ version: 2.0.0.beta.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mikkel Malmberg
@@ -179,6 +179,7 @@ files:
179
179
  - docs/browser_support.md
180
180
  - docs/component_contracts.md
181
181
  - docs/customization.md
182
+ - docs/eject.md
182
183
  - docs/hotwire.md
183
184
  - docs/initialization_prompt.md
184
185
  - docs/migration_1_to_2.md
@@ -192,9 +193,11 @@ files:
192
193
  - docs/patterns/resource_form.md
193
194
  - docs/rails_conventions.md
194
195
  - docs/rails_integration.md
196
+ - lib/generators/nitro_kit/eject_generator.rb
195
197
  - lib/generators/nitro_kit/install_generator.rb
196
198
  - lib/generators/nitro_kit/upgrade_smoke_tests_generator.rb
197
199
  - lib/nitro_kit.rb
200
+ - lib/nitro_kit/ejection.rb
198
201
  - lib/nitro_kit/engine.rb
199
202
  - lib/nitro_kit/installation.rb
200
203
  - lib/nitro_kit/migration_inventory.rb
@@ -290,7 +293,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
290
293
  - !ruby/object:Gem::Version
291
294
  version: '0'
292
295
  requirements: []
293
- rubygems_version: 4.0.16
296
+ rubygems_version: 4.0.20
294
297
  specification_version: 4
295
298
  summary: An agent-native Phlex UI system for Rails
296
299
  test_files: []