@shortwind/catalog 0.1.0-beta.10

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 (82) hide show
  1. package/README.md +31 -0
  2. package/dist/registry/badge/CHANGELOG.md +5 -0
  3. package/dist/registry/badge.css +44 -0
  4. package/dist/registry/badge@0.0.1.css +44 -0
  5. package/dist/registry/button/CHANGELOG.md +5 -0
  6. package/dist/registry/button.css +74 -0
  7. package/dist/registry/button@0.0.1.css +74 -0
  8. package/dist/registry/card/CHANGELOG.md +5 -0
  9. package/dist/registry/card.css +43 -0
  10. package/dist/registry/card@0.0.1.css +43 -0
  11. package/dist/registry/code/CHANGELOG.md +5 -0
  12. package/dist/registry/code.css +22 -0
  13. package/dist/registry/code@0.0.1.css +22 -0
  14. package/dist/registry/dialog/CHANGELOG.md +5 -0
  15. package/dist/registry/dialog.css +33 -0
  16. package/dist/registry/dialog@0.0.1.css +33 -0
  17. package/dist/registry/empty/CHANGELOG.md +5 -0
  18. package/dist/registry/empty.css +27 -0
  19. package/dist/registry/empty@0.0.1.css +27 -0
  20. package/dist/registry/feedback/CHANGELOG.md +5 -0
  21. package/dist/registry/feedback.css +47 -0
  22. package/dist/registry/feedback@0.0.1.css +47 -0
  23. package/dist/registry/form/CHANGELOG.md +5 -0
  24. package/dist/registry/form.css +67 -0
  25. package/dist/registry/form@0.0.1.css +67 -0
  26. package/dist/registry/icon/CHANGELOG.md +5 -0
  27. package/dist/registry/icon.css +27 -0
  28. package/dist/registry/icon@0.0.1.css +27 -0
  29. package/dist/registry/index.json +23 -0
  30. package/dist/registry/layout/CHANGELOG.md +5 -0
  31. package/dist/registry/layout.css +70 -0
  32. package/dist/registry/layout@0.0.1.css +70 -0
  33. package/dist/registry/list/CHANGELOG.md +5 -0
  34. package/dist/registry/list.css +37 -0
  35. package/dist/registry/list@0.0.1.css +37 -0
  36. package/dist/registry/manifest.json +1867 -0
  37. package/dist/registry/media/CHANGELOG.md +5 -0
  38. package/dist/registry/media.css +37 -0
  39. package/dist/registry/media@0.0.1.css +37 -0
  40. package/dist/registry/navigation/CHANGELOG.md +5 -0
  41. package/dist/registry/navigation.css +38 -0
  42. package/dist/registry/navigation@0.0.1.css +38 -0
  43. package/dist/registry/presets.json +6 -0
  44. package/dist/registry/progress/CHANGELOG.md +5 -0
  45. package/dist/registry/progress.css +22 -0
  46. package/dist/registry/progress@0.0.1.css +22 -0
  47. package/dist/registry/recipes/badge.css +44 -0
  48. package/dist/registry/recipes/button.css +74 -0
  49. package/dist/registry/recipes/card.css +43 -0
  50. package/dist/registry/recipes/code.css +22 -0
  51. package/dist/registry/recipes/dialog.css +33 -0
  52. package/dist/registry/recipes/empty.css +27 -0
  53. package/dist/registry/recipes/feedback.css +47 -0
  54. package/dist/registry/recipes/form.css +67 -0
  55. package/dist/registry/recipes/icon.css +27 -0
  56. package/dist/registry/recipes/layout.css +70 -0
  57. package/dist/registry/recipes/list.css +37 -0
  58. package/dist/registry/recipes/media.css +37 -0
  59. package/dist/registry/recipes/navigation.css +38 -0
  60. package/dist/registry/recipes/progress.css +22 -0
  61. package/dist/registry/recipes/skeleton.css +22 -0
  62. package/dist/registry/recipes/surface.css +45 -0
  63. package/dist/registry/recipes/table.css +37 -0
  64. package/dist/registry/recipes/text.css +59 -0
  65. package/dist/registry/recipes/tooltip.css +11 -0
  66. package/dist/registry/skeleton/CHANGELOG.md +5 -0
  67. package/dist/registry/skeleton.css +22 -0
  68. package/dist/registry/skeleton@0.0.1.css +22 -0
  69. package/dist/registry/surface/CHANGELOG.md +5 -0
  70. package/dist/registry/surface.css +45 -0
  71. package/dist/registry/surface@0.0.2.css +45 -0
  72. package/dist/registry/table/CHANGELOG.md +5 -0
  73. package/dist/registry/table.css +37 -0
  74. package/dist/registry/table@0.0.1.css +37 -0
  75. package/dist/registry/text/CHANGELOG.md +5 -0
  76. package/dist/registry/text.css +59 -0
  77. package/dist/registry/text@0.0.1.css +59 -0
  78. package/dist/registry/tooltip/CHANGELOG.md +5 -0
  79. package/dist/registry/tooltip.css +11 -0
  80. package/dist/registry/tooltip@0.0.1.css +11 -0
  81. package/dist/tsconfig.tsbuildinfo +1 -0
  82. package/package.json +33 -0
package/README.md ADDED
@@ -0,0 +1,31 @@
1
+ # @shortwind/catalog
2
+
3
+ The Shortwind recipe catalog — the built, versioned recipe files that the CLI installs from.
4
+
5
+ [Shortwind](https://shortwind.dev) is a token-efficient class layer for Tailwind: you write short `@recipe` names in `class=`/`className=` and they expand to full Tailwind class clusters at build time.
6
+
7
+ ## You don't install this directly
8
+
9
+ This package is a **source of recipes**, not a runtime dependency. The CLI fetches the latest catalog from npm (falling back to a bundled copy offline) and **copies** the recipe files into your project's `./recipes/`, shadcn-style — so you own and can edit them. It won't appear in your `dependencies` or `devDependencies`.
10
+
11
+ ```bash
12
+ npx @shortwind/cli@beta init # pulls recipes from this catalog into ./recipes/
13
+ ```
14
+
15
+ ## What's inside
16
+
17
+ `dist/registry/` contains the published catalog:
18
+
19
+ - `recipes/<family>.css` — each family's `@recipe` definitions, sealed with a versioned, hash-checked header (`/* shortwind: <family>@<version> sha:<…> */`).
20
+ - `presets.json` — the named install presets (`starter`, `app`, `content`, `all`).
21
+ - `manifest.json` — the family list with versions.
22
+
23
+ Current families:
24
+
25
+ `badge` `button` `card` `code` `dialog` `empty` `feedback` `form` `icon` `layout` `list` `media` `navigation` `progress` `skeleton` `surface` `table` `text` `tooltip`
26
+
27
+ ## Versioning
28
+
29
+ Each family is versioned independently; content changes are machine-checked against a committed ledger so a recipe body can't change without a version bump. The CLI's `upgrade` and `verify` commands use these versions and hashes to keep your vendored copies in sync (or flag intentional edits, which `shortwind reseal` re-signs).
30
+
31
+ Published on the `beta` tag. Docs: <https://shortwind.dev>
@@ -0,0 +1,5 @@
1
+ # badge
2
+
3
+ ## 0.0.1
4
+
5
+ Initial release.
@@ -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,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,5 @@
1
+ # button
2
+
3
+ ## 0.0.1
4
+
5
+ Initial release.
@@ -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,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,5 @@
1
+ # card
2
+
3
+ ## 0.0.1
4
+
5
+ Initial release.
@@ -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,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.