nitro_kit 2.0.0.alpha.1 → 2.0.0.alpha.3
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +71 -1
- data/README.md +24 -3
- data/STYLE_GUIDE.md +37 -5
- data/app/assets/stylesheets/nitro_kit.css +1733 -1363
- data/app/components/nitro_kit/accordion.rb +1 -7
- data/app/components/nitro_kit/app_navigation.rb +1 -2
- data/app/components/nitro_kit/app_shell.rb +1 -7
- data/app/components/nitro_kit/appearance_picker.rb +1 -11
- data/app/components/nitro_kit/avatar.rb +6 -1
- data/app/components/nitro_kit/avatar_stack.rb +3 -0
- data/app/components/nitro_kit/button_group.rb +2 -2
- data/app/components/nitro_kit/checkbox.rb +7 -4
- data/app/components/nitro_kit/checkbox_group.rb +5 -27
- data/app/components/nitro_kit/combobox.rb +3 -16
- data/app/components/nitro_kit/command_palette.rb +41 -59
- data/app/components/nitro_kit/component.rb +57 -5
- data/app/components/nitro_kit/danger_zone.rb +5 -1
- data/app/components/nitro_kit/data_section.rb +28 -4
- data/app/components/nitro_kit/details_table.rb +19 -8
- data/app/components/nitro_kit/dialog.rb +23 -19
- data/app/components/nitro_kit/dropdown.rb +1 -6
- data/app/components/nitro_kit/dropzone.rb +3 -14
- data/app/components/nitro_kit/empty_state.rb +21 -2
- data/app/components/nitro_kit/field.rb +36 -12
- data/app/components/nitro_kit/form_builder.rb +0 -1
- data/app/components/nitro_kit/progressive_image.rb +2 -2
- data/app/components/nitro_kit/radio_button.rb +7 -4
- data/app/components/nitro_kit/radio_button_group.rb +5 -27
- data/app/components/nitro_kit/select.rb +3 -3
- data/app/components/nitro_kit/settings_layout.rb +17 -4
- data/app/components/nitro_kit/{form_section.rb → settings_section.rb} +18 -11
- data/app/components/nitro_kit/sheet.rb +29 -20
- data/app/components/nitro_kit/stat_grid.rb +18 -2
- data/app/components/nitro_kit/table.rb +22 -3
- data/app/components/nitro_kit/tabs.rb +1 -13
- data/app/components/nitro_kit/toast.rb +4 -2
- data/app/components/nitro_kit/toolbar.rb +2 -0
- data/app/components/nitro_kit/tooltip.rb +7 -10
- data/app/javascript/controllers/nk/app_shell_controller.js +3 -3
- data/app/javascript/controllers/nk/appearance_controller.js +6 -0
- data/app/javascript/controllers/nk/combobox_controller.js +51 -1
- data/app/javascript/controllers/nk/command_palette_controller.js +21 -11
- data/app/javascript/controllers/nk/dialog_controller.js +54 -0
- data/app/javascript/controllers/nk/dropdown_controller.js +45 -0
- data/app/javascript/controllers/nk/dropzone_controller.js +2 -2
- data/app/javascript/controllers/nk/progressive_image_controller.js +11 -7
- data/app/javascript/controllers/nk/tabs_controller.js +8 -1
- data/app/javascript/controllers/nk/tooltip_controller.js +9 -0
- data/config/locales/en.yml +4 -1
- data/docs/agent_guide.md +31 -16
- data/docs/agent_native_spec.md +29 -12
- data/docs/browser_support.md +193 -0
- data/docs/component_contracts.md +88 -82
- data/docs/customization.md +27 -15
- data/docs/hotwire.md +15 -3
- data/docs/initialization_prompt.md +31 -6
- data/docs/migration_1_to_2.md +61 -19
- data/docs/new_app_strategy.md +4 -6
- data/docs/patterns/application_foundation.md +6 -4
- data/docs/patterns/crud_resource.md +6 -3
- data/docs/patterns/destructive_action.md +25 -0
- data/docs/patterns/resource_form.md +1 -1
- data/docs/rails_conventions.md +4 -1
- data/docs/rails_integration.md +39 -11
- data/lib/generators/nitro_kit/upgrade_smoke_tests_generator.rb +12 -0
- data/lib/nitro_kit/installation.rb +9 -4
- data/lib/nitro_kit/migration_inventory.rb +268 -8
- data/lib/nitro_kit/upgrade_smoke_test.rb +12 -14
- data/lib/nitro_kit/version.rb +1 -1
- data/lib/rails/commands/nitro_kit/nitro_kit_command.rb +10 -3
- data/plugins/nitro-kit/skills/nitro-kit-hotwire/SKILL.md +4 -0
- data/plugins/nitro-kit/skills/nitro-kit-rails/SKILL.md +6 -1
- data/plugins/nitro-kit/skills/nitro-kit-ui/SKILL.md +18 -8
- data/src/stylesheets/nitro_kit/components/accordion.css +40 -40
- data/src/stylesheets/nitro_kit/components/alert.css +10 -10
- data/src/stylesheets/nitro_kit/components/app_navigation.css +19 -19
- data/src/stylesheets/nitro_kit/components/app_shell.css +196 -193
- data/src/stylesheets/nitro_kit/components/appearance_picker.css +41 -31
- data/src/stylesheets/nitro_kit/components/avatar.css +3 -3
- data/src/stylesheets/nitro_kit/components/avatar_stack.css +36 -19
- data/src/stylesheets/nitro_kit/components/button.css +83 -58
- data/src/stylesheets/nitro_kit/components/button_group.css +19 -14
- data/src/stylesheets/nitro_kit/components/card.css +11 -5
- data/src/stylesheets/nitro_kit/components/checkbox.css +40 -36
- data/src/stylesheets/nitro_kit/components/checkbox_group.css +13 -13
- data/src/stylesheets/nitro_kit/components/combobox.css +33 -23
- data/src/stylesheets/nitro_kit/components/command_palette.css +48 -47
- data/src/stylesheets/nitro_kit/components/control_group.css +52 -58
- data/src/stylesheets/nitro_kit/components/danger_zone.css +3 -3
- data/src/stylesheets/nitro_kit/components/data_section.css +1 -1
- data/src/stylesheets/nitro_kit/components/details_table.css +13 -13
- data/src/stylesheets/nitro_kit/components/dialog.css +6 -3
- data/src/stylesheets/nitro_kit/components/dropdown.css +29 -23
- data/src/stylesheets/nitro_kit/components/dropzone.css +78 -26
- data/src/stylesheets/nitro_kit/components/empty_state.css +6 -6
- data/src/stylesheets/nitro_kit/components/field.css +30 -26
- data/src/stylesheets/nitro_kit/components/field_group.css +13 -0
- data/src/stylesheets/nitro_kit/components/fieldset.css +6 -0
- data/src/stylesheets/nitro_kit/components/input.css +9 -2
- data/src/stylesheets/nitro_kit/components/layout.css +165 -165
- data/src/stylesheets/nitro_kit/components/page_header.css +8 -9
- data/src/stylesheets/nitro_kit/components/pagination.css +55 -46
- data/src/stylesheets/nitro_kit/components/pagination_bar.css +7 -7
- data/src/stylesheets/nitro_kit/components/palette.css +21 -21
- data/src/stylesheets/nitro_kit/components/progressive_image.css +44 -54
- data/src/stylesheets/nitro_kit/components/radio_button.css +36 -29
- data/src/stylesheets/nitro_kit/components/radio_button_group.css +43 -43
- data/src/stylesheets/nitro_kit/components/rich_text_area.css +15 -0
- data/src/stylesheets/nitro_kit/components/select.css +2 -9
- data/src/stylesheets/nitro_kit/components/settings_layout.css +21 -18
- data/src/stylesheets/nitro_kit/components/settings_section.css +84 -0
- data/src/stylesheets/nitro_kit/components/sheet.css +23 -3
- data/src/stylesheets/nitro_kit/components/stat_grid.css +10 -9
- data/src/stylesheets/nitro_kit/components/switch.css +37 -33
- data/src/stylesheets/nitro_kit/components/table.css +37 -27
- data/src/stylesheets/nitro_kit/components/tabs.css +43 -39
- data/src/stylesheets/nitro_kit/components/toast.css +20 -9
- data/src/stylesheets/nitro_kit/components/toolbar.css +14 -39
- data/src/stylesheets/nitro_kit/components/tooltip.css +34 -29
- data/src/stylesheets/nitro_kit/components/typeset.css +147 -1
- data/src/stylesheets/nitro_kit/reset.css +9 -9
- data/src/stylesheets/nitro_kit/tokens.css +11 -12
- metadata +4 -4
- data/docs/implementation_plan.md +0 -279
- data/src/stylesheets/nitro_kit/components/form_section.css +0 -71
|
@@ -1,4 +1,126 @@
|
|
|
1
1
|
@layer nitro-kit.base {
|
|
2
|
+
/*
|
|
3
|
+
* Reduced fallback for engines without @scope. Every selector is anchored
|
|
4
|
+
* explicitly at the Typeset root; only direct, non-Nitro/non-opted-out
|
|
5
|
+
* content is supported, so nested boundaries cannot inherit these rules.
|
|
6
|
+
*/
|
|
7
|
+
:where([data-nk="typeset"]) {
|
|
8
|
+
font-family: var(--nk-typeset-font-body);
|
|
9
|
+
font-size: var(--nk-typeset-size);
|
|
10
|
+
line-height: var(--nk-typeset-leading);
|
|
11
|
+
color: var(--nk-color-foreground);
|
|
12
|
+
overflow-wrap: break-word;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
:where([data-nk="typeset"])
|
|
16
|
+
> :where(p, ul, ol, dl, blockquote, pre, figure, table, details, hr):not(
|
|
17
|
+
[data-nk],
|
|
18
|
+
[data-typeset="off"]
|
|
19
|
+
) {
|
|
20
|
+
margin-block: var(--nk-typeset-flow) 0;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
:where([data-nk="typeset"])
|
|
24
|
+
> :where(h1, h2, h3, h4, h5, h6):not([data-nk], [data-typeset="off"]) {
|
|
25
|
+
margin-block: calc(var(--nk-typeset-flow) * 1.4) 0;
|
|
26
|
+
font-family: var(--nk-typeset-font-heading);
|
|
27
|
+
font-weight: var(--nk-font-weight-bold);
|
|
28
|
+
line-height: var(--nk-leading-tight);
|
|
29
|
+
text-wrap: balance;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
:where([data-nk="typeset"]) > h1:not([data-nk], [data-typeset="off"]) {
|
|
33
|
+
font-size: 2em;
|
|
34
|
+
}
|
|
35
|
+
:where([data-nk="typeset"]) > h2:not([data-nk], [data-typeset="off"]) {
|
|
36
|
+
font-size: 1.5em;
|
|
37
|
+
}
|
|
38
|
+
:where([data-nk="typeset"]) > h3:not([data-nk], [data-typeset="off"]) {
|
|
39
|
+
font-size: 1.25em;
|
|
40
|
+
}
|
|
41
|
+
:where([data-nk="typeset"]) > h4:not([data-nk], [data-typeset="off"]) {
|
|
42
|
+
font-size: 1.125em;
|
|
43
|
+
}
|
|
44
|
+
:where([data-nk="typeset"])
|
|
45
|
+
> :where(h5, h6):not([data-nk], [data-typeset="off"]) {
|
|
46
|
+
font-size: 1em;
|
|
47
|
+
}
|
|
48
|
+
:where([data-nk="typeset"]) > :where(a:not([data-nk], [data-typeset="off"])),
|
|
49
|
+
:where([data-nk="typeset"])
|
|
50
|
+
> :where(
|
|
51
|
+
p,
|
|
52
|
+
h1,
|
|
53
|
+
h2,
|
|
54
|
+
h3,
|
|
55
|
+
h4,
|
|
56
|
+
h5,
|
|
57
|
+
h6,
|
|
58
|
+
ul,
|
|
59
|
+
ol,
|
|
60
|
+
dl,
|
|
61
|
+
blockquote,
|
|
62
|
+
figure,
|
|
63
|
+
details
|
|
64
|
+
):not([data-nk], [data-typeset="off"])
|
|
65
|
+
:where(a) {
|
|
66
|
+
color: inherit;
|
|
67
|
+
font-weight: var(--nk-font-weight-medium);
|
|
68
|
+
text-decoration-line: underline;
|
|
69
|
+
text-decoration-color: color-mix(in oklab, currentColor 35%, transparent);
|
|
70
|
+
text-decoration-thickness: from-font;
|
|
71
|
+
text-underline-offset: 0.15em;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
:where([data-nk="typeset"])
|
|
75
|
+
> :where(ul, ol):not([data-nk], [data-typeset="off"]) {
|
|
76
|
+
padding-inline-start: 1.5em;
|
|
77
|
+
}
|
|
78
|
+
:where([data-nk="typeset"]) > ul:not([data-nk], [data-typeset="off"]) {
|
|
79
|
+
list-style-type: disc;
|
|
80
|
+
}
|
|
81
|
+
:where([data-nk="typeset"]) > ol:not([data-nk], [data-typeset="off"]) {
|
|
82
|
+
list-style-type: decimal;
|
|
83
|
+
}
|
|
84
|
+
:where([data-nk="typeset"]) > pre:not([data-nk], [data-typeset="off"]) {
|
|
85
|
+
overflow-x: auto;
|
|
86
|
+
padding: calc(var(--nk-space) * 4);
|
|
87
|
+
color: var(--nk-color-foreground);
|
|
88
|
+
font-family: var(--nk-typeset-font-mono);
|
|
89
|
+
font-size: 0.875em;
|
|
90
|
+
line-height: var(--nk-leading-relaxed);
|
|
91
|
+
background: var(--nk-color-muted);
|
|
92
|
+
border-radius: var(--nk-radius-md);
|
|
93
|
+
}
|
|
94
|
+
:where([data-nk="typeset"])
|
|
95
|
+
> pre:not([data-nk], [data-typeset="off"])
|
|
96
|
+
> code {
|
|
97
|
+
font: inherit;
|
|
98
|
+
}
|
|
99
|
+
:where([data-nk="typeset"])
|
|
100
|
+
> :not(pre, [data-nk], [data-typeset="off"])
|
|
101
|
+
> code {
|
|
102
|
+
padding: 0.15em 0.35em;
|
|
103
|
+
font-family: var(--nk-typeset-font-mono);
|
|
104
|
+
font-size: 0.875em;
|
|
105
|
+
background: var(--nk-color-muted);
|
|
106
|
+
border-radius: var(--nk-radius-sm);
|
|
107
|
+
}
|
|
108
|
+
:where([data-nk="typeset"]) > table:not([data-nk], [data-typeset="off"]) {
|
|
109
|
+
width: 100%;
|
|
110
|
+
border-collapse: collapse;
|
|
111
|
+
font-size: 0.925em;
|
|
112
|
+
}
|
|
113
|
+
:where([data-nk="typeset"])
|
|
114
|
+
> table:not([data-nk], [data-typeset="off"])
|
|
115
|
+
> :where(thead, tbody, tfoot)
|
|
116
|
+
> tr
|
|
117
|
+
> :where(th, td) {
|
|
118
|
+
padding: calc(var(--nk-space) * 2) calc(var(--nk-space) * 3);
|
|
119
|
+
text-align: start;
|
|
120
|
+
vertical-align: top;
|
|
121
|
+
border-block-end: var(--nk-border-width) solid var(--nk-color-border);
|
|
122
|
+
}
|
|
123
|
+
|
|
2
124
|
@scope ([data-nk="typeset"]) to (
|
|
3
125
|
[data-nk]:not([data-nk="typeset"]),
|
|
4
126
|
[data-typeset="off"]
|
|
@@ -18,7 +140,7 @@
|
|
|
18
140
|
:where(h1, h2, h3, h4, h5, h6) {
|
|
19
141
|
margin-block: calc(var(--nk-typeset-flow) * 1.4) 0;
|
|
20
142
|
font-family: var(--nk-typeset-font-heading);
|
|
21
|
-
font-weight: var(--nk-font-weight-
|
|
143
|
+
font-weight: var(--nk-font-weight-bold);
|
|
22
144
|
line-height: var(--nk-leading-tight);
|
|
23
145
|
text-wrap: balance;
|
|
24
146
|
}
|
|
@@ -172,6 +294,30 @@
|
|
|
172
294
|
}
|
|
173
295
|
|
|
174
296
|
@layer nitro-kit.state {
|
|
297
|
+
:where([data-nk="typeset"])
|
|
298
|
+
> :where(a:not([data-nk], [data-typeset="off"])):focus-visible,
|
|
299
|
+
:where([data-nk="typeset"])
|
|
300
|
+
> :where(
|
|
301
|
+
p,
|
|
302
|
+
h1,
|
|
303
|
+
h2,
|
|
304
|
+
h3,
|
|
305
|
+
h4,
|
|
306
|
+
h5,
|
|
307
|
+
h6,
|
|
308
|
+
ul,
|
|
309
|
+
ol,
|
|
310
|
+
dl,
|
|
311
|
+
blockquote,
|
|
312
|
+
figure,
|
|
313
|
+
details
|
|
314
|
+
):not([data-nk], [data-typeset="off"])
|
|
315
|
+
:where(a):focus-visible {
|
|
316
|
+
outline: var(--nk-focus-width) solid var(--nk-color-focus);
|
|
317
|
+
outline-offset: var(--nk-focus-offset);
|
|
318
|
+
border-radius: var(--nk-radius-xs);
|
|
319
|
+
}
|
|
320
|
+
|
|
175
321
|
@scope ([data-nk="typeset"]) to (
|
|
176
322
|
[data-nk]:not([data-nk="typeset"]),
|
|
177
323
|
[data-typeset="off"]
|
|
@@ -97,10 +97,10 @@
|
|
|
97
97
|
}
|
|
98
98
|
|
|
99
99
|
:where(
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
100
|
+
button,
|
|
101
|
+
input:is([type="button"], [type="reset"], [type="submit"]),
|
|
102
|
+
label[for]
|
|
103
|
+
),
|
|
104
104
|
::file-selector-button {
|
|
105
105
|
cursor: pointer;
|
|
106
106
|
}
|
|
@@ -144,11 +144,11 @@
|
|
|
144
144
|
/* Only Nitro-owned lists lose their markers. Prose lists keep real markers,
|
|
145
145
|
and `typeset` restores its own in the `nitro-kit.base` layer. */
|
|
146
146
|
:where(
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
147
|
+
ol[data-nk],
|
|
148
|
+
ul[data-nk],
|
|
149
|
+
menu[data-nk],
|
|
150
|
+
[data-nk] :is(ol, ul, menu)[data-slot]
|
|
151
|
+
) {
|
|
152
152
|
list-style: none;
|
|
153
153
|
}
|
|
154
154
|
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
@layer nitro-kit.tokens {
|
|
2
2
|
:where(:root) {
|
|
3
|
-
--nk-font-sans:
|
|
4
|
-
ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji",
|
|
3
|
+
--nk-font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji",
|
|
5
4
|
"Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
|
6
|
-
--nk-font-mono:
|
|
7
|
-
|
|
8
|
-
"Courier New", monospace;
|
|
5
|
+
--nk-font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
|
|
6
|
+
"Liberation Mono", "Courier New", monospace;
|
|
9
7
|
|
|
10
8
|
--nk-text-xs: 0.75rem;
|
|
11
9
|
--nk-text-sm: 0.875rem;
|
|
@@ -38,16 +36,17 @@
|
|
|
38
36
|
--nk-radius-lg: 0.5rem;
|
|
39
37
|
--nk-radius-xl: 0.75rem;
|
|
40
38
|
--nk-radius-full: 9999px;
|
|
39
|
+
--nk-button-radius: initial;
|
|
41
40
|
|
|
42
41
|
--nk-border-width: 1px;
|
|
43
42
|
--nk-focus-width: 2px;
|
|
44
43
|
--nk-focus-offset: 2px;
|
|
45
44
|
|
|
46
45
|
--nk-shadow-sm: 0 1px 2px oklch(0 0 0 / 0.08);
|
|
47
|
-
--nk-shadow-md:
|
|
48
|
-
0
|
|
49
|
-
--nk-shadow-lg:
|
|
50
|
-
0
|
|
46
|
+
--nk-shadow-md: 0 4px 6px -1px oklch(0 0 0 / 0.1),
|
|
47
|
+
0 2px 4px -2px oklch(0 0 0 / 0.1);
|
|
48
|
+
--nk-shadow-lg: 0 10px 15px -3px oklch(0 0 0 / 0.12),
|
|
49
|
+
0 4px 6px -4px oklch(0 0 0 / 0.12);
|
|
51
50
|
|
|
52
51
|
--nk-duration-fast: 100ms;
|
|
53
52
|
--nk-duration-normal: 150ms;
|
|
@@ -90,7 +89,7 @@
|
|
|
90
89
|
--nk-color-success-content: oklch(0.393 0.095 152.535);
|
|
91
90
|
--nk-color-warning: oklch(0.681 0.162 75.834);
|
|
92
91
|
--nk-color-warning-content: oklch(0.421 0.095 57.708);
|
|
93
|
-
--nk-color-danger: oklch(0.
|
|
92
|
+
--nk-color-danger: oklch(0.577 0.237 25.331);
|
|
94
93
|
--nk-color-danger-foreground: oklch(1 0 0);
|
|
95
94
|
--nk-color-danger-content: oklch(0.444 0.177 26.899);
|
|
96
95
|
--nk-color-overlay: oklch(0 0 0 / 0.5);
|
|
@@ -185,8 +184,8 @@
|
|
|
185
184
|
transparent 10%
|
|
186
185
|
);
|
|
187
186
|
--nk-color-danger-hover: light-dark(
|
|
188
|
-
oklch(0.
|
|
189
|
-
oklch(0.
|
|
187
|
+
oklch(0.54 0.237 25.331),
|
|
188
|
+
oklch(0.59 0.237 25.331)
|
|
190
189
|
);
|
|
191
190
|
--nk-app-shell-background: var(--nk-color-canvas);
|
|
192
191
|
--nk-app-shell-sidebar-background: var(--nk-color-surface);
|
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.
|
|
4
|
+
version: 2.0.0.alpha.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Mikkel Malmberg
|
|
@@ -128,7 +128,6 @@ files:
|
|
|
128
128
|
- app/components/nitro_kit/fieldset.rb
|
|
129
129
|
- app/components/nitro_kit/flex.rb
|
|
130
130
|
- app/components/nitro_kit/form_builder.rb
|
|
131
|
-
- app/components/nitro_kit/form_section.rb
|
|
132
131
|
- app/components/nitro_kit/grid.rb
|
|
133
132
|
- app/components/nitro_kit/icon.rb
|
|
134
133
|
- app/components/nitro_kit/input.rb
|
|
@@ -144,6 +143,7 @@ files:
|
|
|
144
143
|
- app/components/nitro_kit/rich_text_area.rb
|
|
145
144
|
- app/components/nitro_kit/select.rb
|
|
146
145
|
- app/components/nitro_kit/settings_layout.rb
|
|
146
|
+
- app/components/nitro_kit/settings_section.rb
|
|
147
147
|
- app/components/nitro_kit/sheet.rb
|
|
148
148
|
- app/components/nitro_kit/stat_grid.rb
|
|
149
149
|
- app/components/nitro_kit/switch.rb
|
|
@@ -176,10 +176,10 @@ files:
|
|
|
176
176
|
- config/locales/en.yml
|
|
177
177
|
- docs/agent_guide.md
|
|
178
178
|
- docs/agent_native_spec.md
|
|
179
|
+
- docs/browser_support.md
|
|
179
180
|
- docs/component_contracts.md
|
|
180
181
|
- docs/customization.md
|
|
181
182
|
- docs/hotwire.md
|
|
182
|
-
- docs/implementation_plan.md
|
|
183
183
|
- docs/initialization_prompt.md
|
|
184
184
|
- docs/migration_1_to_2.md
|
|
185
185
|
- docs/new_app_strategy.md
|
|
@@ -239,7 +239,6 @@ files:
|
|
|
239
239
|
- src/stylesheets/nitro_kit/components/field_group.css
|
|
240
240
|
- src/stylesheets/nitro_kit/components/fieldset.css
|
|
241
241
|
- src/stylesheets/nitro_kit/components/flex.css
|
|
242
|
-
- src/stylesheets/nitro_kit/components/form_section.css
|
|
243
242
|
- src/stylesheets/nitro_kit/components/grid.css
|
|
244
243
|
- src/stylesheets/nitro_kit/components/icon.css
|
|
245
244
|
- src/stylesheets/nitro_kit/components/input.css
|
|
@@ -255,6 +254,7 @@ files:
|
|
|
255
254
|
- src/stylesheets/nitro_kit/components/rich_text_area.css
|
|
256
255
|
- src/stylesheets/nitro_kit/components/select.css
|
|
257
256
|
- src/stylesheets/nitro_kit/components/settings_layout.css
|
|
257
|
+
- src/stylesheets/nitro_kit/components/settings_section.css
|
|
258
258
|
- src/stylesheets/nitro_kit/components/sheet.css
|
|
259
259
|
- src/stylesheets/nitro_kit/components/stat_grid.css
|
|
260
260
|
- src/stylesheets/nitro_kit/components/switch.css
|
data/docs/implementation_plan.md
DELETED
|
@@ -1,279 +0,0 @@
|
|
|
1
|
-
# Nitro Kit 2.0 implementation record
|
|
2
|
-
|
|
3
|
-
This document records the staged delivery program used for the agent-native pivot. `tk` is the source of truth for live status and dependency order; ticket IDs below connect durable design intent to executable work. Candidate lists in early stages are historical investigation prompts, not current public API. The settled contract lives in [`agent_native_spec.md`](agent_native_spec.md) and [`component_contracts.md`](component_contracts.md).
|
|
4
|
-
|
|
5
|
-
Nitro Kit 2.0 is allowed to break 1.x completely. Each stage should leave one simpler system behind rather than maintaining parallel APIs.
|
|
6
|
-
|
|
7
|
-
The original implementation program reached release-quality consolidation. Component migration, evidence-gathering flows, accepted layout/block extraction, the expanded gallery, 1.x removal, documentation, packaging, and browser verification are retained here as history; later contract revisions such as responsive Flex/Grid remain tracked in `tk` and the canonical contract documents.
|
|
8
|
-
|
|
9
|
-
## Definition of done
|
|
10
|
-
|
|
11
|
-
The 2.0 pivot is complete when:
|
|
12
|
-
|
|
13
|
-
- Every component is constructed directly from Phlex with explicit Ruby options.
|
|
14
|
-
- Nitro Kit owns the Ruby, markup contract, behavior, CSS, examples, and documentation.
|
|
15
|
-
- No Nitro-authored component, layout, block, flow, or gallery subject emits `class`, `style`, or an escape marker.
|
|
16
|
-
- Applications can theme the system through documented `--nk-*` variables and compose or subclass components.
|
|
17
|
-
- Rails forms, routes, assets, Turbo Frames, and Turbo Streams remain first-class.
|
|
18
|
-
- The gem does not expose `nk_*` view helpers, copied-component generators, a Tailwind runtime, or a template-buffer bridge.
|
|
19
|
-
- The complete catalog renders through explicit Rails routes in light/dark and narrow/wide states.
|
|
20
|
-
- Keyboard behavior and Turbo lifecycle behavior pass browser tests.
|
|
21
|
-
- The full Ruby, CSS, JavaScript formatting, package, and browser checks pass from a clean checkout.
|
|
22
|
-
|
|
23
|
-
## Delivery rules
|
|
24
|
-
|
|
25
|
-
Every migration ticket follows the same sequence:
|
|
26
|
-
|
|
27
|
-
1. Define the smallest explicit Ruby API and closed vocabularies.
|
|
28
|
-
2. Render native, self-describing HTML with `data-nk` and qualified `data-slot` identities.
|
|
29
|
-
3. Preserve Rails and accessibility semantics before visual styling.
|
|
30
|
-
4. Add static zero-specificity CSS driven by public theme tokens and private mechanics variables.
|
|
31
|
-
5. Add focused render, invalid-option, reserved-attribute, and integration tests.
|
|
32
|
-
6. Add representative and exhaustive gallery examples without classes or escape hatches.
|
|
33
|
-
7. Verify the family independently before allowing dependent flows to use it.
|
|
34
|
-
|
|
35
|
-
No compatibility layer should survive merely to keep a legacy example green. Replace the example and delete the obsolete API.
|
|
36
|
-
|
|
37
|
-
## Stage 0 — ownership and execution scaffold
|
|
38
|
-
|
|
39
|
-
Tickets: `nk-rzxf`, `nk-g3qu`
|
|
40
|
-
|
|
41
|
-
- Work on the dedicated `2.0-agent-native` branch.
|
|
42
|
-
- Keep the agent-native specification, component contracts, repository guidance, and this plan tracked with the gem.
|
|
43
|
-
- Track the entire program in the workspace-level `.tickets` database.
|
|
44
|
-
- Record implementation decisions and verification counts on each ticket before closing it.
|
|
45
|
-
|
|
46
|
-
Gate: an agent can explain who owns Ruby, markup, CSS, behavior, theming, composition, and the class escape hatch by reading the tracked docs.
|
|
47
|
-
|
|
48
|
-
## Stage 1 — kernel and distribution foundation
|
|
49
|
-
|
|
50
|
-
Tickets: `nk-6q5i`, `nk-fooc`, `nk-rx0j`
|
|
51
|
-
|
|
52
|
-
- Replace permissive attributes with explicit component options plus `html:`, `aria:`, and `data:` boundaries.
|
|
53
|
-
- Centralize identity, slot attachment, reserved attributes, validation, additive Stimulus data, and `desperately_need_a_class:`.
|
|
54
|
-
- Build deterministic layered CSS from split plain-CSS sources.
|
|
55
|
-
- Ship the built stylesheet, optional Tailwind adapter, importmap pins, and controllers from the gem without vendored third-party JavaScript.
|
|
56
|
-
- Prove the engine still boots when importmap-rails is absent.
|
|
57
|
-
|
|
58
|
-
Gate: a minimal Rails app can render and style a Nitro component without copying sources or configuring Tailwind or JavaScript pins.
|
|
59
|
-
|
|
60
|
-
## Stage 2 — representative vertical slice
|
|
61
|
-
|
|
62
|
-
Ticket: `nk-g3x1`
|
|
63
|
-
|
|
64
|
-
Migrate Button/Icon, Card, Input/Field/FormBuilder, Table, and Dialog all the way through Ruby, HTML, CSS, behavior, Rails integration, tests, and gallery routes.
|
|
65
|
-
|
|
66
|
-
Use this slice to settle:
|
|
67
|
-
|
|
68
|
-
- Direct compound-component methods and nested slot ownership.
|
|
69
|
-
- Native attribute boundaries and error messages.
|
|
70
|
-
- Intrinsic versus stretch sizing.
|
|
71
|
-
- Rails form names, IDs, values, errors, multipart behavior, and checkbox semantics.
|
|
72
|
-
- Native dialog behavior, stable ARIA relationships, and Stimulus cleanup.
|
|
73
|
-
- The explicit gallery catalog and route contract.
|
|
74
|
-
|
|
75
|
-
Gate: the slice is classless, invalid options fail immediately, focused tests pass, and its examples render through real Rails routes with Nitro CSS alone.
|
|
76
|
-
|
|
77
|
-
## Stage 3 — complete atom migration
|
|
78
|
-
|
|
79
|
-
Tickets: `nk-t17c`, `nk-b18t`, `nk-7lkw`, `nk-4r36`, `nk-i4xu`, `nk-19gd`
|
|
80
|
-
|
|
81
|
-
### Display
|
|
82
|
-
|
|
83
|
-
Migrate Alert, Avatar, AvatarStack, Badge, and Icon. Cover semantic intents, long content, image/fallback behavior, overflow, sizes, labeled/decorative icons, and nested combinations.
|
|
84
|
-
|
|
85
|
-
### Actions and navigation
|
|
86
|
-
|
|
87
|
-
Migrate ButtonGroup and Pagination. Preserve native links/buttons, current-page semantics, disabled previous/next controls, ellipses, compact ranges, and stable labels.
|
|
88
|
-
|
|
89
|
-
### Forms
|
|
90
|
-
|
|
91
|
-
Migrate Label, Textarea, Select, Checkbox, CheckboxGroup, RadioButton, RadioButtonGroup, Switch, FieldGroup, Fieldset, and all FormBuilder methods. Cover:
|
|
92
|
-
|
|
93
|
-
- Bound and unbound forms.
|
|
94
|
-
- Required, disabled, readonly, checked, indeterminate, invalid, prompt, and empty states.
|
|
95
|
-
- Array and nested parameter names.
|
|
96
|
-
- Active Model values and errors.
|
|
97
|
-
- Multipart uploads and native file-input constraints.
|
|
98
|
-
- Accessible descriptions, legends, labels, and error relationships.
|
|
99
|
-
|
|
100
|
-
### Structured content
|
|
101
|
-
|
|
102
|
-
Migrate Accordion and Tabs alongside the Card and Table slice. Require deterministic IDs and keys, direct compound APIs, semantic table structure, and keyboard-visible state.
|
|
103
|
-
|
|
104
|
-
### Interaction
|
|
105
|
-
|
|
106
|
-
Migrate Dropdown, Tooltip, Combobox, and Toast alongside Dialog. Require closed placement/state APIs, visible ARIA/data state, keyboard behavior, native controls where possible, and complete disconnect cleanup.
|
|
107
|
-
|
|
108
|
-
Gate: every shipped atom has a classless direct-Phlex API, static CSS, focused tests, exhaustive examples, and no dependency on a legacy helper.
|
|
109
|
-
|
|
110
|
-
## Stage 4 — Rails and Hotwire proof
|
|
111
|
-
|
|
112
|
-
Ticket: `nk-19gd`
|
|
113
|
-
|
|
114
|
-
- Exercise `form_with` directly from Phlex using `NitroKit::FormBuilder`.
|
|
115
|
-
- Prove route helpers, DOM ID helpers, CSRF behavior, model errors, submit paths, and multipart forms.
|
|
116
|
-
- Render Turbo Frames and Turbo Streams from direct-Phlex pages.
|
|
117
|
-
- Add one small validation submit path that demonstrates the real request/response loop.
|
|
118
|
-
- Document the supported Rails boundary and show examples without introducing Nitro view helpers.
|
|
119
|
-
|
|
120
|
-
Gate: Rails supplies framework semantics while Phlex remains the only general UI composition language.
|
|
121
|
-
|
|
122
|
-
## Stage 5 — gallery infrastructure and exhaustive combinations
|
|
123
|
-
|
|
124
|
-
Tickets: `nk-q4mj`, `nk-put2`, `nk-jp63`, `nk-5028`, `nk-t23x`, `nk-rtwj`, `nk-8mh8`, `nk-t66i`, `nk-vnwu`
|
|
125
|
-
|
|
126
|
-
- Keep one explicit catalog of component, block, and flow entries.
|
|
127
|
-
- Render the shell, pages, sections, examples, samples, and notes in Phlex.
|
|
128
|
-
- Pair every preview with highlighted, copyable Ruby extracted from the exact rendering block or concrete flow method.
|
|
129
|
-
- Generate route contract tests from the catalog.
|
|
130
|
-
- Assert every subject has stable Nitro identities and no `class`, `style`, or escape markers.
|
|
131
|
-
- Add meaningful Cartesian coverage without mechanically showing nonsense combinations.
|
|
132
|
-
|
|
133
|
-
Required pressure cases:
|
|
134
|
-
|
|
135
|
-
- All closed variants and sizes.
|
|
136
|
-
- Default, hover/focus-capable, disabled, readonly, invalid, empty, loading-like, open, and selected states where meaningful.
|
|
137
|
-
- Short, long, wrapped, numeric, missing-image, and high-item-count content.
|
|
138
|
-
- Nested atoms and compound slots.
|
|
139
|
-
- Light and dark themes.
|
|
140
|
-
- Narrow and wide viewports.
|
|
141
|
-
- Forms, tables, overlays, and navigation used together rather than only in isolation.
|
|
142
|
-
|
|
143
|
-
Gate: every catalog entry succeeds through an explicit route and the gallery itself requires no Tailwind or ERB templates.
|
|
144
|
-
|
|
145
|
-
## Stage 6 — atom-only product flows
|
|
146
|
-
|
|
147
|
-
Tickets: `nk-31ne`, `nk-7d05`, `nk-q37g`, `nk-tcig`, `nk-32vc`
|
|
148
|
-
|
|
149
|
-
Build realistic screens before inventing layout abstractions:
|
|
150
|
-
|
|
151
|
-
- Authentication, registration, password reset, and verification.
|
|
152
|
-
- Onboarding progress, validation, resume, and completion.
|
|
153
|
-
- Dashboard overview, statistics, recent records, and activity.
|
|
154
|
-
- Profile, preferences, account, and destructive settings.
|
|
155
|
-
- Billing plans, payment methods, invoices, and upgrade states.
|
|
156
|
-
- Users search, filters, pagination, empty state, and detail.
|
|
157
|
-
- Team members, invitations, roles, and removal confirmation.
|
|
158
|
-
- API credential empty, create, reveal-once, list, and revoke states.
|
|
159
|
-
|
|
160
|
-
Use deterministic PORO data and explicit state slugs. Record repeated layout and responsibility friction in `notes/block_candidates.md`; do not abstract a one-off screen.
|
|
161
|
-
|
|
162
|
-
Gate: all required product states exist using atoms and plain Phlex composition, and repeated structures are backed by concrete evidence.
|
|
163
|
-
|
|
164
|
-
## Stage 7 — evidence-driven layouts and blocks
|
|
165
|
-
|
|
166
|
-
Tickets: `nk-okls`, `nk-bjv5`, `nk-b8eg`
|
|
167
|
-
|
|
168
|
-
Extract the smallest vocabulary that removes proven repetition. The evidence pass accepted:
|
|
169
|
-
|
|
170
|
-
- Layouts: VStack, HStack, the three-column Grid, and Container.
|
|
171
|
-
- Shell: AuthShell.
|
|
172
|
-
- Sections and blocks: SettingsLayout, Toolbar, PaginationBar, PageHeader, StatGrid, DataSection, FormSection, DangerZone, and EmptyState.
|
|
173
|
-
|
|
174
|
-
This list records the first extraction decision. It has since been superseded: `VStack` and `HStack` were removed in favor of unified responsive `Flex`, and the fixed three-column Grid became a responsive 1–12-column `Grid`. See the canonical specification and component contracts for the current API.
|
|
175
|
-
|
|
176
|
-
At that stage, the evidence pass deferred Spacer, Split, Frame, AppShell, MarketingShell, AuthenticationPanel, and ProgressSteps because their responsibilities were not stable across enough domains. A later application-layout mandate supplied enough evidence to accept AppShell; the other deferred candidates remain outside 2.0. The settled contracts, rather than this historical stage record, live in [`agent_native_spec.md`](agent_native_spec.md) and [`component_contracts.md`](component_contracts.md).
|
|
177
|
-
|
|
178
|
-
Each abstraction must:
|
|
179
|
-
|
|
180
|
-
- Have one clear responsibility.
|
|
181
|
-
- Use closed layout options.
|
|
182
|
-
- Own only structure that actually repeats.
|
|
183
|
-
- Accept atoms/content through direct Ruby composition.
|
|
184
|
-
- Emit classless self-describing markup.
|
|
185
|
-
- Include examples showing reuse in at least two flows.
|
|
186
|
-
|
|
187
|
-
Then rewrite the atom-only flows with blocks and compare the result. Delete abstractions that do not make application code meaningfully clearer.
|
|
188
|
-
|
|
189
|
-
Gate: flow code describes product intent, while layouts and blocks remain a small coherent vocabulary rather than a second page framework.
|
|
190
|
-
|
|
191
|
-
## Stage 8 — expanded application gallery
|
|
192
|
-
|
|
193
|
-
Tickets: `nk-pmcn`, `nk-q1tc`, `nk-oi4y`, `nk-gn4s`, `nk-ky42`
|
|
194
|
-
|
|
195
|
-
Extend the block-based gallery across:
|
|
196
|
-
|
|
197
|
-
- Data detail, activity, audit, uploads, and integrations.
|
|
198
|
-
- Billing, authentication, onboarding, team, and API states.
|
|
199
|
-
- System error, permission, empty, loading-like, and marketing states.
|
|
200
|
-
- Changelog, support, and help experiences.
|
|
201
|
-
|
|
202
|
-
Prefer depth of state over disconnected decorative pages. Each flow should show success, empty/error, destructive/confirmation, and constrained-width behavior where applicable.
|
|
203
|
-
|
|
204
|
-
Gate: the gallery demonstrates that the vocabulary can build a credible Rails product, not only isolated controls.
|
|
205
|
-
|
|
206
|
-
## Stage 9 — remove the old system
|
|
207
|
-
|
|
208
|
-
Ticket: `nk-u534`
|
|
209
|
-
|
|
210
|
-
- Delete all `nk_*` view helpers and automatic variant aliases.
|
|
211
|
-
- Delete copied-component generators, schemas, manifests, and installation paths.
|
|
212
|
-
- Delete the Action View/template capture bridge and legacy builder path.
|
|
213
|
-
- Remove Tailwind Merge and consumer Tailwind dependencies.
|
|
214
|
-
- Remove legacy ERB test pages, Tailwind assets, and obsolete tests.
|
|
215
|
-
- Audit packaged gem files and runtime dependencies.
|
|
216
|
-
|
|
217
|
-
Gate: repository-wide searches find no public legacy invocation, copied-source promise, internal component class string, or required Tailwind runtime.
|
|
218
|
-
|
|
219
|
-
## Stage 10 — browser behavior and lifecycle verification
|
|
220
|
-
|
|
221
|
-
Tickets: `nk-352j`, `nk-6ivz`, `nk-gxwn`, `nk-lij5`, `nk-tkds`
|
|
222
|
-
|
|
223
|
-
- Enumerate every catalog URL and state in a real browser.
|
|
224
|
-
- Exercise keyboard order, arrows, Escape, Enter/Space, tab trapping/return, and focus visibility.
|
|
225
|
-
- Exercise open/close, select, filter, validation, submit, and destructive confirmation paths.
|
|
226
|
-
- Navigate through Turbo Drive, Frames, Streams, and morph refreshes; look for duplicate controllers and leaked listeners/positioners/timers.
|
|
227
|
-
- Review representative pages at narrow/wide sizes and light/dark themes.
|
|
228
|
-
- Check for horizontal overflow, clipped overlays, unstable layout, unreadable content, and broken focus state.
|
|
229
|
-
|
|
230
|
-
Gate: browser coverage proves both route completeness and interaction lifecycle behavior.
|
|
231
|
-
|
|
232
|
-
## Stage 11 — release-quality consolidation
|
|
233
|
-
|
|
234
|
-
Tickets: `nk-g3qu`, `nk-obb7`
|
|
235
|
-
|
|
236
|
-
- Reconcile actual component APIs with `docs/component_contracts.md` and `STYLE_GUIDE.md`.
|
|
237
|
-
- Document Rails integration, theming tokens, composition, subclass caveats, and the escape hatch.
|
|
238
|
-
- Run a data-structure review for duplicated collections, scattered state, and invalid intermediate states.
|
|
239
|
-
- Run a simplification pass and remove compatibility branches, duplicate validation, dead CSS, dead JavaScript, and unused dependencies.
|
|
240
|
-
- Audit all CSS selectors for zero specificity and owner scoping.
|
|
241
|
-
- Audit all controllers for disconnect cleanup and Turbo safety.
|
|
242
|
-
- Run the complete test, lint, format, CSS build/check, package, route, and browser suites.
|
|
243
|
-
|
|
244
|
-
Gate: every child of `nk-rzxf` is closed with evidence and the repository contains one coherent 2.0 architecture.
|
|
245
|
-
|
|
246
|
-
## Stage 12 — deterministic agent installation
|
|
247
|
-
|
|
248
|
-
Ticket: `2an-5ayl`
|
|
249
|
-
|
|
250
|
-
- Ship concise Nitro Kit Rails, Hotwire, and UI skills that resolve the
|
|
251
|
-
installed gem before acting.
|
|
252
|
-
- Add a setup-only generator that installs the skills for Codex and Claude and
|
|
253
|
-
maintains a bounded `AGENTS.md` section without copying component source.
|
|
254
|
-
- Add diagnostics for the resolved version, agent guidance, Hotwire wiring,
|
|
255
|
-
Phlex Kit inclusion, stylesheet loading, and Nitro Kit 1.x shadows.
|
|
256
|
-
- Print or copy an initialization prompt without launching an agent.
|
|
257
|
-
- Make guided and Pro eval profiles run the real installer and name Nitro Kit
|
|
258
|
-
2.x explicitly; retain cold profiles for diagnostic comparisons.
|
|
259
|
-
|
|
260
|
-
Gate: installation is idempotent, preserves application-owned instructions,
|
|
261
|
-
routes agents to version-matched doctrine, and is exercised by the eval
|
|
262
|
-
harness.
|
|
263
|
-
|
|
264
|
-
## Verification matrix
|
|
265
|
-
|
|
266
|
-
| Surface | Required verification |
|
|
267
|
-
| ------------- | ------------------------------------------------------------------------------------------------- |
|
|
268
|
-
| Ruby API | Focused construction/render tests; invalid vocabulary; missing content; reserved attributes |
|
|
269
|
-
| Markup | Native semantics; stable IDs; ARIA relationships; `data-nk`; qualified `data-slot`; visible state |
|
|
270
|
-
| CSS | Deterministic build/check; zero-specificity owner-scoped selectors; token audit; light/dark |
|
|
271
|
-
| Rails | Real `form_with`; Active Model; routes/DOM IDs; multipart; validation submit; Frame/Stream |
|
|
272
|
-
| JavaScript | Keyboard behavior; open/close/select; disconnect cleanup; Turbo navigation and morph |
|
|
273
|
-
| Gallery | Catalog routes; exact escaped source; copy behavior; no class/style/escape; narrow/wide |
|
|
274
|
-
| Packaging | Engine boot with optional integrations absent; gem contents and dependencies audited |
|
|
275
|
-
| Documentation | Specification, contracts, style guide, Rails boundary, theming, examples, repository commands |
|
|
276
|
-
|
|
277
|
-
## Execution and handoff
|
|
278
|
-
|
|
279
|
-
Use `tk ready` to select dependency-safe work. Preparatory parallel work is permitted only when the orchestrator explicitly assigns non-overlapping ownership. Every handoff names changed files, behavior decisions, focused test counts, and known failures. The orchestrator independently reviews and reproduces meaningful checks before closing a feature ticket.
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
@layer nitro-kit.base {
|
|
2
|
-
:where([data-nk="form-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-width: 0;
|
|
9
|
-
color: var(--nk-color-foreground);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
:where([data-nk="form-section"] > [data-slot="form-section-header"]) {
|
|
13
|
-
display: grid;
|
|
14
|
-
gap: calc(var(--nk-space) * 2);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
:where([data-nk="form-section"] [data-slot="form-section-title"]) {
|
|
18
|
-
font-size: var(--nk-text-xl);
|
|
19
|
-
font-weight: var(--nk-font-weight-semibold);
|
|
20
|
-
line-height: var(--nk-leading-tight);
|
|
21
|
-
text-wrap: balance;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
:where([data-nk="form-section"] [data-slot="form-section-description"]) {
|
|
25
|
-
max-width: var(--nk-content-lg);
|
|
26
|
-
color: var(--nk-color-muted-foreground);
|
|
27
|
-
font-size: var(--nk-text-sm);
|
|
28
|
-
line-height: var(--nk-leading-relaxed);
|
|
29
|
-
text-wrap: pretty;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
:where([data-nk="form-section"] > [data-slot="form-section-form"]) {
|
|
33
|
-
display: grid;
|
|
34
|
-
grid-column: 2;
|
|
35
|
-
gap: calc(var(--nk-space) * 4);
|
|
36
|
-
width: 100%;
|
|
37
|
-
max-width: var(--nk-content-lg);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
:where([data-nk="form-section"] > [data-slot="form-section-status"]) {
|
|
41
|
-
grid-column: 2;
|
|
42
|
-
width: 100%;
|
|
43
|
-
max-width: var(--nk-content-lg);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
:where([data-nk="form-section"] > [data-slot="form-section-form"] > form) {
|
|
47
|
-
display: grid;
|
|
48
|
-
gap: calc(var(--nk-space) * 5);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
:where([data-nk="form-section"] + [data-nk="form-section"]) {
|
|
52
|
-
padding-block-start: calc(var(--nk-space) * 8);
|
|
53
|
-
border-block-start: var(--nk-border-width) solid var(--nk-color-border);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
@layer nitro-kit.state {
|
|
58
|
-
@media (max-width: 48rem) {
|
|
59
|
-
:where([data-nk="form-section"]) {
|
|
60
|
-
grid-template-columns: minmax(0, 1fr);
|
|
61
|
-
row-gap: calc(var(--nk-space) * 4);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
:where(
|
|
65
|
-
[data-nk="form-section"] > [data-slot="form-section-status"],
|
|
66
|
-
[data-nk="form-section"] > [data-slot="form-section-form"]
|
|
67
|
-
) {
|
|
68
|
-
grid-column: 1;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|