@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.
Files changed (83) hide show
  1. package/dist/expand.js +3 -0
  2. package/dist/expand@0.0.1.js +3 -0
  3. package/dist/registry/badge/CHANGELOG.md +5 -0
  4. package/dist/registry/badge.css +44 -0
  5. package/dist/registry/badge@0.0.1.css +44 -0
  6. package/dist/registry/button/CHANGELOG.md +5 -0
  7. package/dist/registry/button.css +74 -0
  8. package/dist/registry/button@0.0.1.css +74 -0
  9. package/dist/registry/card/CHANGELOG.md +5 -0
  10. package/dist/registry/card.css +43 -0
  11. package/dist/registry/card@0.0.1.css +43 -0
  12. package/dist/registry/code/CHANGELOG.md +5 -0
  13. package/dist/registry/code.css +22 -0
  14. package/dist/registry/code@0.0.1.css +22 -0
  15. package/dist/registry/dialog/CHANGELOG.md +5 -0
  16. package/dist/registry/dialog.css +33 -0
  17. package/dist/registry/dialog@0.0.1.css +33 -0
  18. package/dist/registry/empty/CHANGELOG.md +5 -0
  19. package/dist/registry/empty.css +27 -0
  20. package/dist/registry/empty@0.0.1.css +27 -0
  21. package/dist/registry/feedback/CHANGELOG.md +5 -0
  22. package/dist/registry/feedback.css +47 -0
  23. package/dist/registry/feedback@0.0.1.css +47 -0
  24. package/dist/registry/form/CHANGELOG.md +5 -0
  25. package/dist/registry/form.css +67 -0
  26. package/dist/registry/form@0.0.1.css +67 -0
  27. package/dist/registry/icon/CHANGELOG.md +5 -0
  28. package/dist/registry/icon.css +27 -0
  29. package/dist/registry/icon@0.0.1.css +27 -0
  30. package/dist/registry/index.json +23 -0
  31. package/dist/registry/layout/CHANGELOG.md +5 -0
  32. package/dist/registry/layout.css +70 -0
  33. package/dist/registry/layout@0.0.1.css +70 -0
  34. package/dist/registry/list/CHANGELOG.md +5 -0
  35. package/dist/registry/list.css +37 -0
  36. package/dist/registry/list@0.0.1.css +37 -0
  37. package/dist/registry/manifest.json +1867 -0
  38. package/dist/registry/media/CHANGELOG.md +5 -0
  39. package/dist/registry/media.css +37 -0
  40. package/dist/registry/media@0.0.1.css +37 -0
  41. package/dist/registry/navigation/CHANGELOG.md +5 -0
  42. package/dist/registry/navigation.css +38 -0
  43. package/dist/registry/navigation@0.0.1.css +38 -0
  44. package/dist/registry/presets.json +6 -0
  45. package/dist/registry/progress/CHANGELOG.md +5 -0
  46. package/dist/registry/progress.css +22 -0
  47. package/dist/registry/progress@0.0.1.css +22 -0
  48. package/dist/registry/recipes/badge.css +44 -0
  49. package/dist/registry/recipes/button.css +74 -0
  50. package/dist/registry/recipes/card.css +43 -0
  51. package/dist/registry/recipes/code.css +22 -0
  52. package/dist/registry/recipes/dialog.css +33 -0
  53. package/dist/registry/recipes/empty.css +27 -0
  54. package/dist/registry/recipes/feedback.css +47 -0
  55. package/dist/registry/recipes/form.css +67 -0
  56. package/dist/registry/recipes/icon.css +27 -0
  57. package/dist/registry/recipes/layout.css +70 -0
  58. package/dist/registry/recipes/list.css +37 -0
  59. package/dist/registry/recipes/media.css +37 -0
  60. package/dist/registry/recipes/navigation.css +38 -0
  61. package/dist/registry/recipes/progress.css +22 -0
  62. package/dist/registry/recipes/skeleton.css +22 -0
  63. package/dist/registry/recipes/surface.css +45 -0
  64. package/dist/registry/recipes/table.css +37 -0
  65. package/dist/registry/recipes/text.css +59 -0
  66. package/dist/registry/recipes/tooltip.css +11 -0
  67. package/dist/registry/skeleton/CHANGELOG.md +5 -0
  68. package/dist/registry/skeleton.css +22 -0
  69. package/dist/registry/skeleton@0.0.1.css +22 -0
  70. package/dist/registry/surface/CHANGELOG.md +5 -0
  71. package/dist/registry/surface.css +45 -0
  72. package/dist/registry/surface@0.0.2.css +45 -0
  73. package/dist/registry/table/CHANGELOG.md +5 -0
  74. package/dist/registry/table.css +37 -0
  75. package/dist/registry/table@0.0.1.css +37 -0
  76. package/dist/registry/text/CHANGELOG.md +5 -0
  77. package/dist/registry/text.css +59 -0
  78. package/dist/registry/text@0.0.1.css +59 -0
  79. package/dist/registry/tooltip/CHANGELOG.md +5 -0
  80. package/dist/registry/tooltip.css +11 -0
  81. package/dist/registry/tooltip@0.0.1.css +11 -0
  82. package/dist/tsconfig.tsbuildinfo +1 -0
  83. 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,5 @@
1
+ # code
2
+
3
+ ## 0.0.1
4
+
5
+ Initial release.
@@ -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,5 @@
1
+ # dialog
2
+
3
+ ## 0.0.1
4
+
5
+ Initial release.
@@ -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,5 @@
1
+ # empty
2
+
3
+ ## 0.0.1
4
+
5
+ Initial release.
@@ -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,5 @@
1
+ # feedback
2
+
3
+ ## 0.0.1
4
+
5
+ Initial release.
@@ -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,5 @@
1
+ # form
2
+
3
+ ## 0.0.1
4
+
5
+ Initial release.
@@ -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,5 @@
1
+ # icon
2
+
3
+ ## 0.0.1
4
+
5
+ Initial release.
@@ -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,5 @@
1
+ # layout
2
+
3
+ ## 0.0.1
4
+
5
+ Initial release.
@@ -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
+ }