@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,5 @@
1
+ # media
2
+
3
+ ## 0.0.1
4
+
5
+ Initial release.
@@ -0,0 +1,37 @@
1
+ /* shortwind: media@0.0.1 sha:dfc85633101b0637 */
2
+
3
+ /* @guide
4
+ @avatar (with @avatar-sm/lg) is a round user image; @thumb is a small square
5
+ thumbnail. For responsive embeds use @aspect-square or @aspect-video. Avatars
6
+ are circular by default — don't restyle the radius.
7
+ */
8
+
9
+ /* User/profile avatar. */
10
+ @recipe avatar {
11
+ inline-flex h-10 w-10 items-center justify-center overflow-hidden rounded-full bg-muted text-sm font-medium text-muted-foreground
12
+ }
13
+
14
+ /* Small avatar. */
15
+ @recipe avatar-sm {
16
+ @avatar h-6 w-6 text-xs
17
+ }
18
+
19
+ /* Large avatar. */
20
+ @recipe avatar-lg {
21
+ @avatar h-14 w-14 text-base
22
+ }
23
+
24
+ /* Small image thumbnail. */
25
+ @recipe thumb {
26
+ h-16 w-16 rounded-md object-cover
27
+ }
28
+
29
+ /* 1:1 aspect-ratio wrapper. */
30
+ @recipe aspect-square {
31
+ aspect-square w-full overflow-hidden rounded-md
32
+ }
33
+
34
+ /* 16:9 aspect-ratio wrapper. */
35
+ @recipe aspect-video {
36
+ aspect-video w-full overflow-hidden rounded-md
37
+ }
@@ -0,0 +1,37 @@
1
+ /* shortwind: media@0.0.1 sha:dfc85633101b0637 */
2
+
3
+ /* @guide
4
+ @avatar (with @avatar-sm/lg) is a round user image; @thumb is a small square
5
+ thumbnail. For responsive embeds use @aspect-square or @aspect-video. Avatars
6
+ are circular by default — don't restyle the radius.
7
+ */
8
+
9
+ /* User/profile avatar. */
10
+ @recipe avatar {
11
+ inline-flex h-10 w-10 items-center justify-center overflow-hidden rounded-full bg-muted text-sm font-medium text-muted-foreground
12
+ }
13
+
14
+ /* Small avatar. */
15
+ @recipe avatar-sm {
16
+ @avatar h-6 w-6 text-xs
17
+ }
18
+
19
+ /* Large avatar. */
20
+ @recipe avatar-lg {
21
+ @avatar h-14 w-14 text-base
22
+ }
23
+
24
+ /* Small image thumbnail. */
25
+ @recipe thumb {
26
+ h-16 w-16 rounded-md object-cover
27
+ }
28
+
29
+ /* 1:1 aspect-ratio wrapper. */
30
+ @recipe aspect-square {
31
+ aspect-square w-full overflow-hidden rounded-md
32
+ }
33
+
34
+ /* 16:9 aspect-ratio wrapper. */
35
+ @recipe aspect-video {
36
+ aspect-video w-full overflow-hidden rounded-md
37
+ }
@@ -0,0 +1,5 @@
1
+ # navigation
2
+
3
+ ## 0.0.1
4
+
5
+ Initial release.
@@ -0,0 +1,38 @@
1
+ /* shortwind: navigation@0.0.1 sha:73150057219b648a */
2
+
3
+ /* @guide
4
+ @nav is the container; links are @nav-link with @nav-link-active for the
5
+ current page. Tabs mirror that pair: @tab and @tab-active. Use @breadcrumb
6
+ for trail navigation. Active and inactive are separate recipes — swap the
7
+ whole class rather than combining them.
8
+ */
9
+
10
+ /* Top-level nav container. */
11
+ @recipe nav {
12
+ flex items-center gap-1
13
+ }
14
+
15
+ /* Inactive nav link with hover/focus states. */
16
+ @recipe nav-link {
17
+ inline-flex items-center gap-2 rounded-md px-3 py-1.5 text-sm font-medium text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring
18
+ }
19
+
20
+ /* Active nav link. */
21
+ @recipe nav-link-active {
22
+ inline-flex items-center gap-2 rounded-md bg-muted px-3 py-1.5 text-sm font-medium text-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring
23
+ }
24
+
25
+ /* Breadcrumb trail container. */
26
+ @recipe breadcrumb {
27
+ flex items-center gap-1.5 text-sm text-muted-foreground
28
+ }
29
+
30
+ /* Inactive tab control. */
31
+ @recipe tab {
32
+ inline-flex items-center gap-2 border-b-2 border-transparent px-3 py-2 text-sm font-medium text-muted-foreground transition-colors hover:border-border hover:text-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring
33
+ }
34
+
35
+ /* Active tab control. */
36
+ @recipe tab-active {
37
+ inline-flex items-center gap-2 border-b-2 border-primary px-3 py-2 text-sm font-medium text-primary focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring
38
+ }
@@ -0,0 +1,38 @@
1
+ /* shortwind: navigation@0.0.1 sha:73150057219b648a */
2
+
3
+ /* @guide
4
+ @nav is the container; links are @nav-link with @nav-link-active for the
5
+ current page. Tabs mirror that pair: @tab and @tab-active. Use @breadcrumb
6
+ for trail navigation. Active and inactive are separate recipes — swap the
7
+ whole class rather than combining them.
8
+ */
9
+
10
+ /* Top-level nav container. */
11
+ @recipe nav {
12
+ flex items-center gap-1
13
+ }
14
+
15
+ /* Inactive nav link with hover/focus states. */
16
+ @recipe nav-link {
17
+ inline-flex items-center gap-2 rounded-md px-3 py-1.5 text-sm font-medium text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring
18
+ }
19
+
20
+ /* Active nav link. */
21
+ @recipe nav-link-active {
22
+ inline-flex items-center gap-2 rounded-md bg-muted px-3 py-1.5 text-sm font-medium text-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring
23
+ }
24
+
25
+ /* Breadcrumb trail container. */
26
+ @recipe breadcrumb {
27
+ flex items-center gap-1.5 text-sm text-muted-foreground
28
+ }
29
+
30
+ /* Inactive tab control. */
31
+ @recipe tab {
32
+ inline-flex items-center gap-2 border-b-2 border-transparent px-3 py-2 text-sm font-medium text-muted-foreground transition-colors hover:border-border hover:text-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring
33
+ }
34
+
35
+ /* Active tab control. */
36
+ @recipe tab-active {
37
+ inline-flex items-center gap-2 border-b-2 border-primary px-3 py-2 text-sm font-medium text-primary focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring
38
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "starter": ["card", "button", "layout", "text", "form"],
3
+ "app": ["card", "button", "layout", "text", "form", "badge", "table", "dialog", "list", "navigation", "feedback", "tooltip"],
4
+ "content": ["card", "button", "layout", "text", "form", "badge", "code", "list", "media", "empty"],
5
+ "all": "*"
6
+ }
@@ -0,0 +1,5 @@
1
+ # progress
2
+
3
+ ## 0.0.1
4
+
5
+ Initial release.
@@ -0,0 +1,22 @@
1
+ /* shortwind: progress@0.0.1 sha:37210e32d2cd555f */
2
+
3
+ /* @guide
4
+ A bar is two pieces: @progress-track (the background) wrapping @progress-bar
5
+ (the fill). For an indeterminate state use @spinner instead — it's a
6
+ standalone loader, not a bar.
7
+ */
8
+
9
+ /* Progress bar track (background). */
10
+ @recipe progress-track {
11
+ h-2 w-full overflow-hidden rounded-full bg-muted
12
+ }
13
+
14
+ /* Progress bar fill. */
15
+ @recipe progress-bar {
16
+ h-full rounded-full bg-primary transition-all
17
+ }
18
+
19
+ /* Indeterminate loading spinner. */
20
+ @recipe spinner {
21
+ inline-block h-4 w-4 animate-spin rounded-full border-2 border-border border-t-primary
22
+ }
@@ -0,0 +1,22 @@
1
+ /* shortwind: progress@0.0.1 sha:37210e32d2cd555f */
2
+
3
+ /* @guide
4
+ A bar is two pieces: @progress-track (the background) wrapping @progress-bar
5
+ (the fill). For an indeterminate state use @spinner instead — it's a
6
+ standalone loader, not a bar.
7
+ */
8
+
9
+ /* Progress bar track (background). */
10
+ @recipe progress-track {
11
+ h-2 w-full overflow-hidden rounded-full bg-muted
12
+ }
13
+
14
+ /* Progress bar fill. */
15
+ @recipe progress-bar {
16
+ h-full rounded-full bg-primary transition-all
17
+ }
18
+
19
+ /* Indeterminate loading spinner. */
20
+ @recipe spinner {
21
+ inline-block h-4 w-4 animate-spin rounded-full border-2 border-border border-t-primary
22
+ }
@@ -0,0 +1,44 @@
1
+ /* shortwind: badge@0.0.1 sha:8548b9a7305a0a59 */
2
+
3
+ /* @guide
4
+ @badge is the neutral default; tone variants @badge-success/warning/danger/
5
+ info carry their own color; @badge-outline is unfilled. One tone per badge.
6
+ @badge-base is a color-less shell for building custom tones — not for direct
7
+ use.
8
+ */
9
+
10
+ /* Badge shell — shape, sizing, focus ring. No bg/text/border color so
11
+ variants can supply their own tone without conflicts. */
12
+ @recipe badge-base {
13
+ inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2
14
+ }
15
+
16
+ /* Default neutral badge. */
17
+ @recipe badge {
18
+ inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-xs font-medium text-muted-foreground
19
+ }
20
+
21
+ /* Success tone badge. */
22
+ @recipe badge-success {
23
+ inline-flex items-center gap-1 rounded-full bg-green-100 px-2 py-0.5 text-xs font-medium text-green-800 dark:bg-green-900 dark:text-green-200
24
+ }
25
+
26
+ /* Warning tone badge. */
27
+ @recipe badge-warning {
28
+ inline-flex items-center gap-1 rounded-full bg-amber-100 px-2 py-0.5 text-xs font-medium text-amber-800 dark:bg-amber-900 dark:text-amber-200
29
+ }
30
+
31
+ /* Danger tone badge. */
32
+ @recipe badge-danger {
33
+ inline-flex items-center gap-1 rounded-full bg-destructive/15 px-2 py-0.5 text-xs font-medium text-destructive
34
+ }
35
+
36
+ /* Info tone badge. */
37
+ @recipe badge-info {
38
+ inline-flex items-center gap-1 rounded-full bg-primary/15 px-2 py-0.5 text-xs font-medium text-primary
39
+ }
40
+
41
+ /* Outline badge — no fill. */
42
+ @recipe badge-outline {
43
+ inline-flex items-center gap-1 rounded-full border border-border px-2 py-0.5 text-xs font-medium text-foreground
44
+ }
@@ -0,0 +1,74 @@
1
+ /* shortwind: button@0.0.1 sha:777fa510c4ab4aeb */
2
+
3
+ /* @guide
4
+ Name order is @btn-<intent>[-<size>]: intent first (primary/secondary/ghost/
5
+ danger/outline), size second (sm/lg; omit for default). One intent per
6
+ button — never combine @btn-primary with @btn-danger. @btn-ghost is text-only,
7
+ @btn-outline is bordered with no fill, @btn-icon is a square icon button.
8
+ @btn-base is the shared shell; don't use it on its own.
9
+ */
10
+
11
+ /* Shared button base — sizing, focus ring, disabled state. */
12
+ @recipe btn-base {
13
+ inline-flex items-center justify-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring disabled:cursor-not-allowed disabled:opacity-50
14
+ }
15
+
16
+ /* Primary call-to-action button. */
17
+ @recipe btn-primary {
18
+ @btn-base bg-primary text-primary-foreground hover:bg-primary/90
19
+ }
20
+
21
+ /* Small primary button. */
22
+ @recipe btn-primary-sm {
23
+ @btn-primary px-3 py-1.5 text-xs
24
+ }
25
+
26
+ /* Large primary button. */
27
+ @recipe btn-primary-lg {
28
+ @btn-primary px-6 py-3 text-base
29
+ }
30
+
31
+ /* Secondary button — bordered surface tone. */
32
+ @recipe btn-secondary {
33
+ @btn-base border border-border bg-secondary text-secondary-foreground hover:bg-secondary/80
34
+ }
35
+
36
+ /* Small secondary button. */
37
+ @recipe btn-secondary-sm {
38
+ @btn-secondary px-3 py-1.5 text-xs
39
+ }
40
+
41
+ /* Large secondary button. */
42
+ @recipe btn-secondary-lg {
43
+ @btn-secondary px-6 py-3 text-base
44
+ }
45
+
46
+ /* Ghost button — text only, no background. */
47
+ @recipe btn-ghost {
48
+ @btn-base text-foreground hover:bg-muted
49
+ }
50
+
51
+ /* Small ghost button. */
52
+ @recipe btn-ghost-sm {
53
+ @btn-ghost px-3 py-1.5 text-xs
54
+ }
55
+
56
+ /* Large ghost button. */
57
+ @recipe btn-ghost-lg {
58
+ @btn-ghost px-6 py-3 text-base
59
+ }
60
+
61
+ /* Destructive button. */
62
+ @recipe btn-danger {
63
+ @btn-base bg-destructive text-destructive-foreground hover:bg-destructive/90
64
+ }
65
+
66
+ /* Outline button — bordered without fill. */
67
+ @recipe btn-outline {
68
+ @btn-base border border-primary text-primary hover:bg-primary/10
69
+ }
70
+
71
+ /* Square icon-only button. */
72
+ @recipe btn-icon {
73
+ inline-flex h-9 w-9 items-center justify-center rounded-md text-foreground transition-colors hover:bg-muted focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring disabled:cursor-not-allowed disabled:opacity-50
74
+ }
@@ -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,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,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,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
+ }