@shortwind/catalog 0.1.0-beta.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.
- package/dist/expand.js +3 -0
- package/dist/expand@0.0.1.js +3 -0
- package/dist/registry/badge/CHANGELOG.md +5 -0
- package/dist/registry/badge.css +44 -0
- package/dist/registry/badge@0.0.1.css +44 -0
- package/dist/registry/button/CHANGELOG.md +5 -0
- package/dist/registry/button.css +74 -0
- package/dist/registry/button@0.0.1.css +74 -0
- package/dist/registry/card/CHANGELOG.md +5 -0
- package/dist/registry/card.css +43 -0
- package/dist/registry/card@0.0.1.css +43 -0
- package/dist/registry/code/CHANGELOG.md +5 -0
- package/dist/registry/code.css +22 -0
- package/dist/registry/code@0.0.1.css +22 -0
- package/dist/registry/dialog/CHANGELOG.md +5 -0
- package/dist/registry/dialog.css +33 -0
- package/dist/registry/dialog@0.0.1.css +33 -0
- package/dist/registry/empty/CHANGELOG.md +5 -0
- package/dist/registry/empty.css +27 -0
- package/dist/registry/empty@0.0.1.css +27 -0
- package/dist/registry/feedback/CHANGELOG.md +5 -0
- package/dist/registry/feedback.css +47 -0
- package/dist/registry/feedback@0.0.1.css +47 -0
- package/dist/registry/form/CHANGELOG.md +5 -0
- package/dist/registry/form.css +67 -0
- package/dist/registry/form@0.0.1.css +67 -0
- package/dist/registry/icon/CHANGELOG.md +5 -0
- package/dist/registry/icon.css +27 -0
- package/dist/registry/icon@0.0.1.css +27 -0
- package/dist/registry/index.json +23 -0
- package/dist/registry/layout/CHANGELOG.md +5 -0
- package/dist/registry/layout.css +70 -0
- package/dist/registry/layout@0.0.1.css +70 -0
- package/dist/registry/list/CHANGELOG.md +5 -0
- package/dist/registry/list.css +37 -0
- package/dist/registry/list@0.0.1.css +37 -0
- package/dist/registry/manifest.json +1867 -0
- package/dist/registry/media/CHANGELOG.md +5 -0
- package/dist/registry/media.css +37 -0
- package/dist/registry/media@0.0.1.css +37 -0
- package/dist/registry/navigation/CHANGELOG.md +5 -0
- package/dist/registry/navigation.css +38 -0
- package/dist/registry/navigation@0.0.1.css +38 -0
- package/dist/registry/presets.json +6 -0
- package/dist/registry/progress/CHANGELOG.md +5 -0
- package/dist/registry/progress.css +22 -0
- package/dist/registry/progress@0.0.1.css +22 -0
- package/dist/registry/recipes/badge.css +44 -0
- package/dist/registry/recipes/button.css +74 -0
- package/dist/registry/recipes/card.css +43 -0
- package/dist/registry/recipes/code.css +22 -0
- package/dist/registry/recipes/dialog.css +33 -0
- package/dist/registry/recipes/empty.css +27 -0
- package/dist/registry/recipes/feedback.css +47 -0
- package/dist/registry/recipes/form.css +67 -0
- package/dist/registry/recipes/icon.css +27 -0
- package/dist/registry/recipes/layout.css +70 -0
- package/dist/registry/recipes/list.css +37 -0
- package/dist/registry/recipes/media.css +37 -0
- package/dist/registry/recipes/navigation.css +38 -0
- package/dist/registry/recipes/progress.css +22 -0
- package/dist/registry/recipes/skeleton.css +22 -0
- package/dist/registry/recipes/surface.css +45 -0
- package/dist/registry/recipes/table.css +37 -0
- package/dist/registry/recipes/text.css +59 -0
- package/dist/registry/recipes/tooltip.css +11 -0
- package/dist/registry/skeleton/CHANGELOG.md +5 -0
- package/dist/registry/skeleton.css +22 -0
- package/dist/registry/skeleton@0.0.1.css +22 -0
- package/dist/registry/surface/CHANGELOG.md +5 -0
- package/dist/registry/surface.css +45 -0
- package/dist/registry/surface@0.0.2.css +45 -0
- package/dist/registry/table/CHANGELOG.md +5 -0
- package/dist/registry/table.css +37 -0
- package/dist/registry/table@0.0.1.css +37 -0
- package/dist/registry/text/CHANGELOG.md +5 -0
- package/dist/registry/text.css +59 -0
- package/dist/registry/text@0.0.1.css +59 -0
- package/dist/registry/tooltip/CHANGELOG.md +5 -0
- package/dist/registry/tooltip.css +11 -0
- package/dist/registry/tooltip@0.0.1.css +11 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +33 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/* shortwind: card@0.0.1 sha:4813cef10cd21824 */
|
|
2
|
+
|
|
3
|
+
/* @guide
|
|
4
|
+
Pick exactly one container: @card (default), @card-elevated (raised shadow),
|
|
5
|
+
@card-flat (no border), or @card-interactive (clickable hover/focus) — don't
|
|
6
|
+
stack two container variants on one element. Lay out the inside with
|
|
7
|
+
@card-header / @card-body / @card-footer.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/* Default content card with border, padding, and surface color. */
|
|
11
|
+
@recipe card {
|
|
12
|
+
rounded-lg border border-border bg-card text-card-foreground p-4
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/* Card with raised shadow for emphasis. */
|
|
16
|
+
@recipe card-elevated {
|
|
17
|
+
@card shadow-md
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/* Card without border, on a muted surface. */
|
|
21
|
+
@recipe card-flat {
|
|
22
|
+
rounded-lg bg-muted text-foreground p-4
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/* Clickable card with hover and focus-visible states. */
|
|
26
|
+
@recipe card-interactive {
|
|
27
|
+
@card cursor-pointer transition-shadow hover:shadow-md focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* Card header region with bottom divider. */
|
|
31
|
+
@recipe card-header {
|
|
32
|
+
mb-3 border-b border-border pb-3
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/* Card body region. */
|
|
36
|
+
@recipe card-body {
|
|
37
|
+
py-1
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/* Card footer with top divider and right-aligned actions. */
|
|
41
|
+
@recipe card-footer {
|
|
42
|
+
mt-3 flex items-center justify-end gap-2 border-t border-border pt-3
|
|
43
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/* shortwind: code@0.0.1 sha:cc8d2b0bedb5b453 */
|
|
2
|
+
|
|
3
|
+
/* @guide
|
|
4
|
+
@code-inline for a code span inside prose, @code-block for a multi-line
|
|
5
|
+
preformatted block, @kbd for a keyboard-shortcut hint. Pick by context, not
|
|
6
|
+
by size.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/* Inline code span. */
|
|
10
|
+
@recipe code-inline {
|
|
11
|
+
rounded bg-muted px-1.5 py-0.5 font-mono text-[0.875em] text-foreground
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* Block of preformatted code. */
|
|
15
|
+
@recipe code-block {
|
|
16
|
+
overflow-x-auto rounded-md border border-border bg-muted p-4 font-mono text-sm leading-6 text-foreground
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* Keyboard shortcut hint. */
|
|
20
|
+
@recipe kbd {
|
|
21
|
+
inline-flex items-center rounded border border-border bg-muted px-1.5 py-0.5 font-mono text-xs text-foreground shadow-sm
|
|
22
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/* shortwind: code@0.0.1 sha:cc8d2b0bedb5b453 */
|
|
2
|
+
|
|
3
|
+
/* @guide
|
|
4
|
+
@code-inline for a code span inside prose, @code-block for a multi-line
|
|
5
|
+
preformatted block, @kbd for a keyboard-shortcut hint. Pick by context, not
|
|
6
|
+
by size.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/* Inline code span. */
|
|
10
|
+
@recipe code-inline {
|
|
11
|
+
rounded bg-muted px-1.5 py-0.5 font-mono text-[0.875em] text-foreground
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* Block of preformatted code. */
|
|
15
|
+
@recipe code-block {
|
|
16
|
+
overflow-x-auto rounded-md border border-border bg-muted p-4 font-mono text-sm leading-6 text-foreground
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* Keyboard shortcut hint. */
|
|
20
|
+
@recipe kbd {
|
|
21
|
+
inline-flex items-center rounded border border-border bg-muted px-1.5 py-0.5 font-mono text-xs text-foreground shadow-sm
|
|
22
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/* shortwind: dialog@0.0.1 sha:b4dbf853e99fce75 */
|
|
2
|
+
|
|
3
|
+
/* @guide
|
|
4
|
+
A modal is three layers: @dialog-overlay (dimmed backdrop), @dialog (the
|
|
5
|
+
centering wrapper), and @dialog-content (the panel). Structure the panel with
|
|
6
|
+
@dialog-header and @dialog-footer. Don't put content styling on @dialog
|
|
7
|
+
itself — it's only the positioner.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/* Modal dialog wrapper — covers the viewport, centers content. */
|
|
11
|
+
@recipe dialog {
|
|
12
|
+
fixed inset-0 z-50 flex items-center justify-center p-4
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/* Dimmed overlay behind the dialog. */
|
|
16
|
+
@recipe dialog-overlay {
|
|
17
|
+
fixed inset-0 z-40 bg-black/50
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/* Dialog content panel. */
|
|
21
|
+
@recipe dialog-content {
|
|
22
|
+
relative z-50 w-full max-w-md rounded-lg border border-border bg-popover text-popover-foreground p-6 shadow-xl
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/* Dialog header region with title. */
|
|
26
|
+
@recipe dialog-header {
|
|
27
|
+
mb-4 flex flex-col gap-1
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* Dialog footer with right-aligned actions. */
|
|
31
|
+
@recipe dialog-footer {
|
|
32
|
+
mt-6 flex items-center justify-end gap-2
|
|
33
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/* shortwind: dialog@0.0.1 sha:b4dbf853e99fce75 */
|
|
2
|
+
|
|
3
|
+
/* @guide
|
|
4
|
+
A modal is three layers: @dialog-overlay (dimmed backdrop), @dialog (the
|
|
5
|
+
centering wrapper), and @dialog-content (the panel). Structure the panel with
|
|
6
|
+
@dialog-header and @dialog-footer. Don't put content styling on @dialog
|
|
7
|
+
itself — it's only the positioner.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/* Modal dialog wrapper — covers the viewport, centers content. */
|
|
11
|
+
@recipe dialog {
|
|
12
|
+
fixed inset-0 z-50 flex items-center justify-center p-4
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/* Dimmed overlay behind the dialog. */
|
|
16
|
+
@recipe dialog-overlay {
|
|
17
|
+
fixed inset-0 z-40 bg-black/50
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/* Dialog content panel. */
|
|
21
|
+
@recipe dialog-content {
|
|
22
|
+
relative z-50 w-full max-w-md rounded-lg border border-border bg-popover text-popover-foreground p-6 shadow-xl
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/* Dialog header region with title. */
|
|
26
|
+
@recipe dialog-header {
|
|
27
|
+
mb-4 flex flex-col gap-1
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* Dialog footer with right-aligned actions. */
|
|
31
|
+
@recipe dialog-footer {
|
|
32
|
+
mt-6 flex items-center justify-end gap-2
|
|
33
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/* shortwind: empty@0.0.1 sha:003168e1b4a395c5 */
|
|
2
|
+
|
|
3
|
+
/* @guide
|
|
4
|
+
@empty is the container for a no-data state; fill it with @empty-icon,
|
|
5
|
+
@empty-title, and @empty-description. These are slots for that pattern — use
|
|
6
|
+
@heading-* / @body from the text family for ordinary copy.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/* Empty-state container. */
|
|
10
|
+
@recipe empty {
|
|
11
|
+
flex flex-col items-center justify-center gap-3 rounded-md border border-dashed border-border p-8 text-center
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* Empty-state icon slot. */
|
|
15
|
+
@recipe empty-icon {
|
|
16
|
+
flex h-12 w-12 items-center justify-center rounded-full bg-muted text-muted-foreground
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* Empty-state title text. */
|
|
20
|
+
@recipe empty-title {
|
|
21
|
+
text-base font-semibold text-foreground
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* Empty-state supporting description. */
|
|
25
|
+
@recipe empty-description {
|
|
26
|
+
max-w-sm text-sm text-muted-foreground
|
|
27
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/* shortwind: empty@0.0.1 sha:003168e1b4a395c5 */
|
|
2
|
+
|
|
3
|
+
/* @guide
|
|
4
|
+
@empty is the container for a no-data state; fill it with @empty-icon,
|
|
5
|
+
@empty-title, and @empty-description. These are slots for that pattern — use
|
|
6
|
+
@heading-* / @body from the text family for ordinary copy.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/* Empty-state container. */
|
|
10
|
+
@recipe empty {
|
|
11
|
+
flex flex-col items-center justify-center gap-3 rounded-md border border-dashed border-border p-8 text-center
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* Empty-state icon slot. */
|
|
15
|
+
@recipe empty-icon {
|
|
16
|
+
flex h-12 w-12 items-center justify-center rounded-full bg-muted text-muted-foreground
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* Empty-state title text. */
|
|
20
|
+
@recipe empty-title {
|
|
21
|
+
text-base font-semibold text-foreground
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* Empty-state supporting description. */
|
|
25
|
+
@recipe empty-description {
|
|
26
|
+
max-w-sm text-sm text-muted-foreground
|
|
27
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/* shortwind: feedback@0.0.1 sha:818868f6af179bcf */
|
|
2
|
+
|
|
3
|
+
/* @guide
|
|
4
|
+
Inline messages use @alert (neutral) or a tone variant @alert-success/
|
|
5
|
+
warning/danger/info — one tone each. @callout is a left-accent inline note,
|
|
6
|
+
@toast is a floating notification, @banner spans the full viewport width.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/* Default informational alert. */
|
|
10
|
+
@recipe alert {
|
|
11
|
+
flex items-start gap-3 rounded-md border border-border bg-card p-4 text-sm text-card-foreground
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* Success alert. */
|
|
15
|
+
@recipe alert-success {
|
|
16
|
+
flex items-start gap-3 rounded-md border border-green-200 bg-green-50 p-4 text-sm text-green-900 dark:border-green-900 dark:bg-green-950 dark:text-green-100
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* Warning alert. */
|
|
20
|
+
@recipe alert-warning {
|
|
21
|
+
flex items-start gap-3 rounded-md border border-amber-200 bg-amber-50 p-4 text-sm text-amber-900 dark:border-amber-900 dark:bg-amber-950 dark:text-amber-100
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* Danger alert. */
|
|
25
|
+
@recipe alert-danger {
|
|
26
|
+
flex items-start gap-3 rounded-md border border-destructive/30 bg-destructive/10 p-4 text-sm text-destructive
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/* Informational alert. */
|
|
30
|
+
@recipe alert-info {
|
|
31
|
+
flex items-start gap-3 rounded-md border border-primary/30 bg-primary/10 p-4 text-sm text-primary
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* Inline callout — flush left edge accent. */
|
|
35
|
+
@recipe callout {
|
|
36
|
+
border-l-4 border-primary bg-primary/10 p-4 text-sm text-foreground
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/* Floating toast notification. */
|
|
40
|
+
@recipe toast {
|
|
41
|
+
pointer-events-auto flex items-start gap-3 rounded-md border border-border bg-popover p-4 text-sm text-popover-foreground shadow-lg
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* Full-width banner spanning the viewport. */
|
|
45
|
+
@recipe banner {
|
|
46
|
+
w-full bg-primary px-4 py-2 text-center text-sm font-medium text-primary-foreground
|
|
47
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/* shortwind: feedback@0.0.1 sha:818868f6af179bcf */
|
|
2
|
+
|
|
3
|
+
/* @guide
|
|
4
|
+
Inline messages use @alert (neutral) or a tone variant @alert-success/
|
|
5
|
+
warning/danger/info — one tone each. @callout is a left-accent inline note,
|
|
6
|
+
@toast is a floating notification, @banner spans the full viewport width.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/* Default informational alert. */
|
|
10
|
+
@recipe alert {
|
|
11
|
+
flex items-start gap-3 rounded-md border border-border bg-card p-4 text-sm text-card-foreground
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* Success alert. */
|
|
15
|
+
@recipe alert-success {
|
|
16
|
+
flex items-start gap-3 rounded-md border border-green-200 bg-green-50 p-4 text-sm text-green-900 dark:border-green-900 dark:bg-green-950 dark:text-green-100
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* Warning alert. */
|
|
20
|
+
@recipe alert-warning {
|
|
21
|
+
flex items-start gap-3 rounded-md border border-amber-200 bg-amber-50 p-4 text-sm text-amber-900 dark:border-amber-900 dark:bg-amber-950 dark:text-amber-100
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* Danger alert. */
|
|
25
|
+
@recipe alert-danger {
|
|
26
|
+
flex items-start gap-3 rounded-md border border-destructive/30 bg-destructive/10 p-4 text-sm text-destructive
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/* Informational alert. */
|
|
30
|
+
@recipe alert-info {
|
|
31
|
+
flex items-start gap-3 rounded-md border border-primary/30 bg-primary/10 p-4 text-sm text-primary
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* Inline callout — flush left edge accent. */
|
|
35
|
+
@recipe callout {
|
|
36
|
+
border-l-4 border-primary bg-primary/10 p-4 text-sm text-foreground
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/* Floating toast notification. */
|
|
40
|
+
@recipe toast {
|
|
41
|
+
pointer-events-auto flex items-start gap-3 rounded-md border border-border bg-popover p-4 text-sm text-popover-foreground shadow-lg
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* Full-width banner spanning the viewport. */
|
|
45
|
+
@recipe banner {
|
|
46
|
+
w-full bg-primary px-4 py-2 text-center text-sm font-medium text-primary-foreground
|
|
47
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/* shortwind: form@0.0.1 sha:bc12a9cc520a2d85 */
|
|
2
|
+
|
|
3
|
+
/* @guide
|
|
4
|
+
Wrap each label+control+message in @field (use @field-error for the invalid
|
|
5
|
+
state); group related fields with @fieldset. Controls are bare: @input,
|
|
6
|
+
@textarea, @select, @checkbox, @radio, plus @input-error for invalid text
|
|
7
|
+
and @input-shell for the transparent shadcn-style shell. Helper text is
|
|
8
|
+
@help. There is no @form-group (use @field), @form-input (use @input),
|
|
9
|
+
@form-helper (use @help) or @form-checkbox (use @checkbox); the field label
|
|
10
|
+
recipe is @label, in the text family.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/* Text input field. */
|
|
14
|
+
@recipe input {
|
|
15
|
+
block w-full rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:border-ring focus:outline-2 focus:outline-offset-2 focus:outline-ring disabled:cursor-not-allowed disabled:opacity-50
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/* shadcn/dinachi-style input shell — transparent background, h-9, file/
|
|
19
|
+
placeholder/selection/aria-invalid/focus-visible states baked in. */
|
|
20
|
+
@recipe input-shell {
|
|
21
|
+
flex h-9 w-full min-w-0 rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-xs outline-none transition-[color,box-shadow] placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:border-destructive aria-invalid:ring-destructive/20 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm dark:bg-input/30 dark:aria-invalid:ring-destructive/40
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* Input in error state. */
|
|
25
|
+
@recipe input-error {
|
|
26
|
+
@input border-destructive focus:border-destructive focus:outline-destructive
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/* Multi-line textarea. */
|
|
30
|
+
@recipe textarea {
|
|
31
|
+
block w-full rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:border-ring focus:outline-2 focus:outline-offset-2 focus:outline-ring disabled:cursor-not-allowed disabled:opacity-50
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* Native select control. */
|
|
35
|
+
@recipe select {
|
|
36
|
+
block w-full rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground focus:border-ring focus:outline-2 focus:outline-offset-2 focus:outline-ring disabled:cursor-not-allowed disabled:opacity-50
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/* Checkbox input. */
|
|
40
|
+
@recipe checkbox {
|
|
41
|
+
h-4 w-4 rounded border-input text-primary focus:outline-2 focus:outline-offset-2 focus:outline-ring
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* Radio input. */
|
|
45
|
+
@recipe radio {
|
|
46
|
+
h-4 w-4 border-input text-primary focus:outline-2 focus:outline-offset-2 focus:outline-ring
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/* Form field wrapper — label + input + help/error. */
|
|
50
|
+
@recipe field {
|
|
51
|
+
flex flex-col gap-1.5
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/* Form field in error state. */
|
|
55
|
+
@recipe field-error {
|
|
56
|
+
flex flex-col gap-1.5
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* Grouped form section with optional legend. */
|
|
60
|
+
@recipe fieldset {
|
|
61
|
+
flex flex-col gap-4 rounded-md border border-border p-4
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/* Field-level helper text. */
|
|
65
|
+
@recipe help {
|
|
66
|
+
text-xs text-muted-foreground
|
|
67
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/* shortwind: form@0.0.1 sha:bc12a9cc520a2d85 */
|
|
2
|
+
|
|
3
|
+
/* @guide
|
|
4
|
+
Wrap each label+control+message in @field (use @field-error for the invalid
|
|
5
|
+
state); group related fields with @fieldset. Controls are bare: @input,
|
|
6
|
+
@textarea, @select, @checkbox, @radio, plus @input-error for invalid text
|
|
7
|
+
and @input-shell for the transparent shadcn-style shell. Helper text is
|
|
8
|
+
@help. There is no @form-group (use @field), @form-input (use @input),
|
|
9
|
+
@form-helper (use @help) or @form-checkbox (use @checkbox); the field label
|
|
10
|
+
recipe is @label, in the text family.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/* Text input field. */
|
|
14
|
+
@recipe input {
|
|
15
|
+
block w-full rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:border-ring focus:outline-2 focus:outline-offset-2 focus:outline-ring disabled:cursor-not-allowed disabled:opacity-50
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/* shadcn/dinachi-style input shell — transparent background, h-9, file/
|
|
19
|
+
placeholder/selection/aria-invalid/focus-visible states baked in. */
|
|
20
|
+
@recipe input-shell {
|
|
21
|
+
flex h-9 w-full min-w-0 rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-xs outline-none transition-[color,box-shadow] placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:border-destructive aria-invalid:ring-destructive/20 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm dark:bg-input/30 dark:aria-invalid:ring-destructive/40
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* Input in error state. */
|
|
25
|
+
@recipe input-error {
|
|
26
|
+
@input border-destructive focus:border-destructive focus:outline-destructive
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/* Multi-line textarea. */
|
|
30
|
+
@recipe textarea {
|
|
31
|
+
block w-full rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:border-ring focus:outline-2 focus:outline-offset-2 focus:outline-ring disabled:cursor-not-allowed disabled:opacity-50
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* Native select control. */
|
|
35
|
+
@recipe select {
|
|
36
|
+
block w-full rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground focus:border-ring focus:outline-2 focus:outline-offset-2 focus:outline-ring disabled:cursor-not-allowed disabled:opacity-50
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/* Checkbox input. */
|
|
40
|
+
@recipe checkbox {
|
|
41
|
+
h-4 w-4 rounded border-input text-primary focus:outline-2 focus:outline-offset-2 focus:outline-ring
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* Radio input. */
|
|
45
|
+
@recipe radio {
|
|
46
|
+
h-4 w-4 border-input text-primary focus:outline-2 focus:outline-offset-2 focus:outline-ring
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/* Form field wrapper — label + input + help/error. */
|
|
50
|
+
@recipe field {
|
|
51
|
+
flex flex-col gap-1.5
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/* Form field in error state. */
|
|
55
|
+
@recipe field-error {
|
|
56
|
+
flex flex-col gap-1.5
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* Grouped form section with optional legend. */
|
|
60
|
+
@recipe fieldset {
|
|
61
|
+
flex flex-col gap-4 rounded-md border border-border p-4
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/* Field-level helper text. */
|
|
65
|
+
@recipe help {
|
|
66
|
+
text-xs text-muted-foreground
|
|
67
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/* shortwind: icon@0.0.1 sha:fab3b2d3a0c089fb */
|
|
2
|
+
|
|
3
|
+
/* @guide
|
|
4
|
+
Size an icon with @icon-sm/md/lg (16/20/24px) — these set width and height
|
|
5
|
+
only; add @icon-muted for secondary color. They're for SVG/icon elements, not
|
|
6
|
+
to be confused with @btn-icon (the icon button in the button family).
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/* Small icon — 16px. */
|
|
10
|
+
@recipe icon-sm {
|
|
11
|
+
h-4 w-4 shrink-0
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* Default icon size — 20px. */
|
|
15
|
+
@recipe icon-md {
|
|
16
|
+
h-5 w-5 shrink-0
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* Large icon — 24px. */
|
|
20
|
+
@recipe icon-lg {
|
|
21
|
+
h-6 w-6 shrink-0
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* Icon with muted color. */
|
|
25
|
+
@recipe icon-muted {
|
|
26
|
+
text-muted-foreground
|
|
27
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/* shortwind: icon@0.0.1 sha:fab3b2d3a0c089fb */
|
|
2
|
+
|
|
3
|
+
/* @guide
|
|
4
|
+
Size an icon with @icon-sm/md/lg (16/20/24px) — these set width and height
|
|
5
|
+
only; add @icon-muted for secondary color. They're for SVG/icon elements, not
|
|
6
|
+
to be confused with @btn-icon (the icon button in the button family).
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/* Small icon — 16px. */
|
|
10
|
+
@recipe icon-sm {
|
|
11
|
+
h-4 w-4 shrink-0
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* Default icon size — 20px. */
|
|
15
|
+
@recipe icon-md {
|
|
16
|
+
h-5 w-5 shrink-0
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* Large icon — 24px. */
|
|
20
|
+
@recipe icon-lg {
|
|
21
|
+
h-6 w-6 shrink-0
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* Icon with muted color. */
|
|
25
|
+
@recipe icon-muted {
|
|
26
|
+
text-muted-foreground
|
|
27
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"families": [
|
|
3
|
+
"badge",
|
|
4
|
+
"button",
|
|
5
|
+
"card",
|
|
6
|
+
"code",
|
|
7
|
+
"dialog",
|
|
8
|
+
"empty",
|
|
9
|
+
"feedback",
|
|
10
|
+
"form",
|
|
11
|
+
"icon",
|
|
12
|
+
"layout",
|
|
13
|
+
"list",
|
|
14
|
+
"media",
|
|
15
|
+
"navigation",
|
|
16
|
+
"progress",
|
|
17
|
+
"skeleton",
|
|
18
|
+
"surface",
|
|
19
|
+
"table",
|
|
20
|
+
"text",
|
|
21
|
+
"tooltip"
|
|
22
|
+
]
|
|
23
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/* shortwind: layout@0.0.1 sha:48a2a7b6e1a5d7ad */
|
|
2
|
+
|
|
3
|
+
/* @guide
|
|
4
|
+
Composition primitives. @stack-* stacks children vertically (flex-col);
|
|
5
|
+
@row* lays them out horizontally (flex-row). Choose the gap with the size
|
|
6
|
+
suffix (xs/sm/md/lg on stacks). Use @grid-2/3/4 only for true multi-column
|
|
7
|
+
grids, @center to center on both axes, @full to fill the parent. Common
|
|
8
|
+
slips: there is no @flex-row (use @row) or @flex-col (use a @stack-*), and
|
|
9
|
+
the grids are @grid-3, not @grid-cols-3.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/* Vertical stack with extra-small gap. */
|
|
13
|
+
@recipe stack-xs {
|
|
14
|
+
flex flex-col gap-1
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/* Vertical stack with small gap. */
|
|
18
|
+
@recipe stack-sm {
|
|
19
|
+
flex flex-col gap-2
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/* Vertical stack with medium gap. */
|
|
23
|
+
@recipe stack-md {
|
|
24
|
+
flex flex-col gap-4
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/* Vertical stack with large gap. */
|
|
28
|
+
@recipe stack-lg {
|
|
29
|
+
flex flex-col gap-8
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/* Horizontal row with default gap and centered items. */
|
|
33
|
+
@recipe row {
|
|
34
|
+
flex flex-row items-center gap-2
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/* Horizontal row with space between children. */
|
|
38
|
+
@recipe row-between {
|
|
39
|
+
flex flex-row items-center justify-between gap-2
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* Horizontal row aligned to the end. */
|
|
43
|
+
@recipe row-end {
|
|
44
|
+
flex flex-row items-center justify-end gap-2
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/* Two-column responsive grid. */
|
|
48
|
+
@recipe grid-2 {
|
|
49
|
+
grid grid-cols-1 gap-4 sm:grid-cols-2
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/* Three-column responsive grid. */
|
|
53
|
+
@recipe grid-3 {
|
|
54
|
+
grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/* Four-column responsive grid. */
|
|
58
|
+
@recipe grid-4 {
|
|
59
|
+
grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* Center content horizontally and vertically. */
|
|
63
|
+
@recipe center {
|
|
64
|
+
flex items-center justify-center
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/* Fill the available width and height. */
|
|
68
|
+
@recipe full {
|
|
69
|
+
h-full w-full
|
|
70
|
+
}
|