@vibes.diy/prompts 14.3.59 → 14.3.65

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 (160) hide show
  1. package/llms/access.md +4 -0
  2. package/llms/index.d.ts +29 -1
  3. package/llms/index.js +84 -0
  4. package/llms/index.js.map +1 -1
  5. package/llms/pouf-blog.d.ts +2 -0
  6. package/llms/pouf-blog.js +6 -0
  7. package/llms/pouf-blog.js.map +1 -0
  8. package/llms/pouf-blog.md +305 -0
  9. package/llms/pouf-booking.d.ts +2 -0
  10. package/llms/pouf-booking.js +6 -0
  11. package/llms/pouf-booking.js.map +1 -0
  12. package/llms/pouf-booking.md +397 -0
  13. package/llms/pouf-calendar.d.ts +2 -0
  14. package/llms/pouf-calendar.js +6 -0
  15. package/llms/pouf-calendar.js.map +1 -0
  16. package/llms/pouf-calendar.md +352 -0
  17. package/llms/pouf-chat.d.ts +2 -0
  18. package/llms/pouf-chat.js +6 -0
  19. package/llms/pouf-chat.js.map +1 -0
  20. package/llms/pouf-chat.md +220 -0
  21. package/llms/pouf-contact.d.ts +2 -0
  22. package/llms/pouf-contact.js +6 -0
  23. package/llms/pouf-contact.js.map +1 -0
  24. package/llms/pouf-contact.md +231 -0
  25. package/llms/pouf-course.d.ts +2 -0
  26. package/llms/pouf-course.js +6 -0
  27. package/llms/pouf-course.js.map +1 -0
  28. package/llms/pouf-course.md +299 -0
  29. package/llms/pouf-crm.d.ts +2 -0
  30. package/llms/pouf-crm.js +6 -0
  31. package/llms/pouf-crm.js.map +1 -0
  32. package/llms/pouf-crm.md +330 -0
  33. package/llms/pouf-dashboard.d.ts +2 -0
  34. package/llms/pouf-dashboard.js +6 -0
  35. package/llms/pouf-dashboard.js.map +1 -0
  36. package/llms/pouf-dashboard.md +269 -0
  37. package/llms/pouf-editorial.d.ts +2 -0
  38. package/llms/pouf-editorial.js +6 -0
  39. package/llms/pouf-editorial.js.map +1 -0
  40. package/llms/pouf-editorial.md +247 -0
  41. package/llms/pouf-event.d.ts +2 -0
  42. package/llms/pouf-event.js +6 -0
  43. package/llms/pouf-event.js.map +1 -0
  44. package/llms/pouf-event.md +237 -0
  45. package/llms/pouf-feed.d.ts +2 -0
  46. package/llms/pouf-feed.js +6 -0
  47. package/llms/pouf-feed.js.map +1 -0
  48. package/llms/pouf-feed.md +249 -0
  49. package/llms/pouf-game.d.ts +2 -0
  50. package/llms/pouf-game.js +6 -0
  51. package/llms/pouf-game.js.map +1 -0
  52. package/llms/pouf-game.md +273 -0
  53. package/llms/pouf-inbox.d.ts +2 -0
  54. package/llms/pouf-inbox.js +6 -0
  55. package/llms/pouf-inbox.js.map +1 -0
  56. package/llms/pouf-inbox.md +317 -0
  57. package/llms/pouf-inventory.d.ts +2 -0
  58. package/llms/pouf-inventory.js +6 -0
  59. package/llms/pouf-inventory.js.map +1 -0
  60. package/llms/pouf-inventory.md +345 -0
  61. package/llms/pouf-kanban.d.ts +2 -0
  62. package/llms/pouf-kanban.js +6 -0
  63. package/llms/pouf-kanban.js.map +1 -0
  64. package/llms/pouf-kanban.md +235 -0
  65. package/llms/pouf-landing.d.ts +2 -0
  66. package/llms/pouf-landing.js +6 -0
  67. package/llms/pouf-landing.js.map +1 -0
  68. package/llms/pouf-landing.md +222 -0
  69. package/llms/pouf-login.d.ts +2 -0
  70. package/llms/pouf-login.js +6 -0
  71. package/llms/pouf-login.js.map +1 -0
  72. package/llms/pouf-login.md +162 -0
  73. package/llms/pouf-music.d.ts +2 -0
  74. package/llms/pouf-music.js +6 -0
  75. package/llms/pouf-music.js.map +1 -0
  76. package/llms/pouf-music.md +190 -0
  77. package/llms/pouf-onboarding.d.ts +2 -0
  78. package/llms/pouf-onboarding.js +6 -0
  79. package/llms/pouf-onboarding.js.map +1 -0
  80. package/llms/pouf-onboarding.md +227 -0
  81. package/llms/pouf-pricing.d.ts +2 -0
  82. package/llms/pouf-pricing.js +6 -0
  83. package/llms/pouf-pricing.js.map +1 -0
  84. package/llms/pouf-pricing.md +193 -0
  85. package/llms/pouf-profile.d.ts +2 -0
  86. package/llms/pouf-profile.js +6 -0
  87. package/llms/pouf-profile.js.map +1 -0
  88. package/llms/pouf-profile.md +177 -0
  89. package/llms/pouf-quiz.d.ts +2 -0
  90. package/llms/pouf-quiz.js +6 -0
  91. package/llms/pouf-quiz.js.map +1 -0
  92. package/llms/pouf-quiz.md +267 -0
  93. package/llms/pouf-settings.d.ts +2 -0
  94. package/llms/pouf-settings.js +6 -0
  95. package/llms/pouf-settings.js.map +1 -0
  96. package/llms/pouf-settings.md +220 -0
  97. package/llms/pouf-storefront.d.ts +2 -0
  98. package/llms/pouf-storefront.js +6 -0
  99. package/llms/pouf-storefront.js.map +1 -0
  100. package/llms/pouf-storefront.md +293 -0
  101. package/llms/pouf-support.d.ts +2 -0
  102. package/llms/pouf-support.js +6 -0
  103. package/llms/pouf-support.js.map +1 -0
  104. package/llms/pouf-support.md +322 -0
  105. package/llms/pouf-testimonials.d.ts +2 -0
  106. package/llms/pouf-testimonials.js +6 -0
  107. package/llms/pouf-testimonials.js.map +1 -0
  108. package/llms/pouf-testimonials.md +156 -0
  109. package/llms/pouf-todo.d.ts +2 -0
  110. package/llms/pouf-todo.js +6 -0
  111. package/llms/pouf-todo.js.map +1 -0
  112. package/llms/pouf-todo.md +179 -0
  113. package/llms/pouf-weather.d.ts +2 -0
  114. package/llms/pouf-weather.js +6 -0
  115. package/llms/pouf-weather.js.map +1 -0
  116. package/llms/pouf-weather.md +186 -0
  117. package/llms/use-viewer.md +3 -0
  118. package/package.json +5 -4
  119. package/prompts.js +2 -2
  120. package/prompts.js.map +1 -1
  121. package/style-prompts.d.ts +1 -1
  122. package/style-prompts.js +2 -0
  123. package/style-prompts.js.map +1 -1
  124. package/themes/colors/aqua.yaml +79 -0
  125. package/themes/colors/brutalist.yaml +4 -4
  126. package/themes/colors/celery.yaml +79 -0
  127. package/themes/colors/home.yaml +79 -0
  128. package/themes/colors/house.yaml +2 -2
  129. package/themes/colors/lilac.yaml +79 -0
  130. package/themes/colors/mint.yaml +79 -0
  131. package/themes/colors/peach.yaml +79 -0
  132. package/themes/colors/periwinkle.yaml +79 -0
  133. package/themes/colors/rose.yaml +79 -0
  134. package/themes/colorsets-bundle.js +654 -6
  135. package/themes/colorsets-bundle.js.map +1 -1
  136. package/themes/colorsets.d.ts +3 -2
  137. package/themes/colorsets.js +84 -2
  138. package/themes/colorsets.js.map +1 -1
  139. package/themes/index.d.ts +1 -0
  140. package/themes/index.js +1 -0
  141. package/themes/index.js.map +1 -1
  142. package/themes/looks/index.d.ts +3 -1
  143. package/themes/looks/index.js +44 -7
  144. package/themes/looks/index.js.map +1 -1
  145. package/themes/looks/pouf/brief.md +144 -0
  146. package/themes/looks/pouf/catalog.generated.d.ts +16 -0
  147. package/themes/looks/pouf/catalog.generated.js +764 -0
  148. package/themes/looks/pouf/catalog.generated.js.map +1 -0
  149. package/themes/looks/pouf/variety.d.ts +4 -0
  150. package/themes/looks/pouf/variety.js +36 -0
  151. package/themes/looks/pouf/variety.js.map +1 -0
  152. package/themes/palette-gen.d.ts +5 -0
  153. package/themes/palette-gen.js +55 -1
  154. package/themes/palette-gen.js.map +1 -1
  155. package/themes/pouf-rooms.d.ts +47 -0
  156. package/themes/pouf-rooms.js +274 -0
  157. package/themes/pouf-rooms.js.map +1 -0
  158. package/themes/style-presets.d.ts +2 -0
  159. package/themes/style-presets.js +29 -1
  160. package/themes/style-presets.js.map +1 -1
@@ -0,0 +1,144 @@
1
+ The pouf look is a room full of cushions. The whole room is already built: `@vibes.diy/pouf` ships every surface, control and layout this look needs, each one carrying the cushion recipe, the corner, the ink and the press. An app on this look is composed from those components and their props, and the room's colours arrive through them, so a palette change restyles the app without a line of it changing.
2
+
3
+ ## Composition
4
+
5
+ One view does one job. Let everything on screen serve it; a second job gets its own view, tab or sheet. Content lives on cushions: a group of related things sits in a `Card`, a list is one `RowCard` per item, a headline number is a `Stat`, an empty list is an `Empty`, and the closing ask on a page is a `CTA`. Those are the only raised surfaces. A cushion is never hand-made out of a bordered `div`; if something needs to float, it is a `Card`.
6
+
7
+ Every view has exactly one lead: the single element wearing `tone="purple"`, usually the primary `Button`. Everything else steps back. Most tone-taking components default to the lead — `Button`, `Badge`, `Dot`, `Blob`, `Avatar`, `Progress`, `CTA`, `NavLink`, `ToggleGroup`, chart series — so set `tone` explicitly on every badge, dot, blob, avatar, bar and status mark, and leave the default only on the one lead. A second button takes `variant="quiet"` or a meaning tone (`down` for delete). Three components default to an untaught tone and always get one: `Tabs` and `Segmented` take `tone="info"`, `Highlight` takes `tone="orange"`. `Confirm` defaults to the decorative fill, so a destructive ask passes `tone="down"`.
8
+
9
+ Open a view with a `Heading level={1}`, then the job; each section gets a `Heading level={2}`, and every run of words is `Text`, `muted` for metadata such as a timestamp.
10
+
11
+ ## Layout
12
+
13
+ Placement is a layout primitive, never a utility class. `Stack` stacks children vertically with an even `gap`; `Row` lays them side by side with `gap`, `align`, `justify` and `wrap`, and a `Spacer` inside a `Row` pushes what follows to the far end. `Grid` places cards in two, three or four columns, or main plus side with `cols="sidebar"`, and stacks them on a phone by itself. An app with several sections wears a `Shell` with a `Sidebar` of `NavLink`s beside the main column, and a `BottomNav` on a phone. When a primitive cannot express the placement, a plain wrapping `div` carries the spacing, never the component.
14
+
15
+ The gap scale runs from `1` to `6`: `gap={3}` between the parts of a card, `gap={5}` or `gap={6}` between sections. Give the page air; cushions never touch.
16
+
17
+ ## Tones
18
+
19
+ A tone names a meaning, not a colour. Choose it by what the thing says:
20
+
21
+ - `up` — good, done, saved, growing.
22
+ - `down` — bad, failed, destructive: delete, remove, over budget.
23
+ - `warn` — needs attention soon: due today, running low.
24
+ - `info` — a neutral notice: a tip, a count, a status with no verdict.
25
+ - `idle` — quiet and passive: paused, archived, not started.
26
+ - `purple` — this room's lead colour, whatever its hue. It marks the one call to action in a view.
27
+ - `orange` — the decorative fill, for ornament only: a `Highlight` on one word, a `Blob` that fronts a feature. Never a verdict.
28
+
29
+ Tone names are slot names, not hues. In another room `purple` may paint teal and `up` may paint blue; the meaning holds while the colour moves, which is why an app never reasons about the hue it will get.
30
+
31
+ ## Components
32
+
33
+ Every control below exists; use it instead of a hand-built element.
34
+
35
+ <!-- pouf-catalog:start -->
36
+
37
+ - `AlertBell` (`@vibes.diy/pouf`) — A bell button with an unread count that opens the session's alert history. Props: `alerts` (required) AlertBellItem[]; `unread` (required) number; `connected` (required); `onOpen` (required) () => void
38
+ - `Badge` (`@vibes.diy/pouf`) — A small tonal label for a count, category or state. Props: `tone` up|down|warn|info|idle|purple (lead)|orange (decorative)
39
+ - `Blob` (`@vibes.diy/pouf`) — A tonal icon tile that fronts a stat, list row or feature. Props: `icon` (required) IconLike; `tone` up|down|warn|info|idle|purple (lead)|orange (decorative); `size` sm|md|lg
40
+ - `Breadcrumb` (`@vibes.diy/pouf`) — Shows where the current page sits in a hierarchy, with links back up. Props: `items` (required) BreadcrumbItem[]
41
+ - `Button` (`@vibes.diy/pouf`) — The action button; give one primary action per area. Props: `tone` up|down|warn|info|idle|purple (lead)|orange (decorative); `size` sm|md|lg; `variant` solid|quiet; `block`; `disabled`; `loading`; `type` button|submit
42
+ - `CTA` (`@vibes.diy/pouf`) — A call-to-action banner: a big tonal cushion with a headline and an action. Props: `title` (required) string; `action` (required) ReactNode; `tone` purple (lead)|pink|blue|mint|yellow|surface
43
+ - `Card` (`@vibes.diy/pouf`) — The raised surface that groups related content into a panel. Props: `variant` default|flush|tight; `motion` none|lift|tilt-left|tilt-right
44
+ - `Dot` (`@vibes.diy/pouf`) — A status dot. Props: `tone` up|down|warn|info|idle|purple (lead)|orange (decorative)
45
+ - `Empty` (`@vibes.diy/pouf`) — The empty state for a list or panel with nothing in it yet. Props: `title` (required) string
46
+ - `ErrorBoundary` (`@vibes.diy/pouf`) — Catches render crashes so one broken part can't blank the whole page. Props: `name` (required) string
47
+ - `ErrorNote` (`@vibes.diy/pouf`) — An inline message that says a request or action failed.
48
+ - `Eyebrow` (`@vibes.diy/pouf`) — A small uppercase label above a section heading.
49
+ - `Field` (`@vibes.diy/pouf`) — Wraps a form control with its label, hint and error text. Props: `label` (required) string; `children` (required) (id: string, describedBy: string | undefined) => ReactNode
50
+ - `Figure` (`@vibes.diy/pouf`) — An image, framed in clay. Props: `src` (required) string; `alt` (required) string; `width` (required) number; `height` (required) number
51
+ - `Footer` (`@vibes.diy/pouf`) — A site footer on one big cushion: brand block plus columns of links, with an optional bottom note. Props: `brand` (required) ReactNode
52
+ - `Freshness` (`@vibes.diy/pouf`) — Speaks only when the data on screen can no longer be trusted. Props: `at` (required) number; `isError`
53
+ - `Grid` (`@vibes.diy/pouf`) — Lays children out in columns, or main plus side, stacking on narrow screens. Props: `cols` 2|3|4|sidebar; `gap` 1|2|3|4|5|6
54
+ - `Heading` (`@vibes.diy/pouf`) — A page or section heading at level 1, 2 or 3. Props: `level` 1|2|3
55
+ - `Highlight` (`@vibes.diy/pouf`) — Puts a tonal swatch behind a word or short phrase to make it pop. Props: `tone` up|down|warn|info|idle|purple (lead)|orange (decorative)
56
+ - `Icon` (`@vibes.diy/pouf`) — A named glyph from the built-in icon set. Props: `name` (required) up|down|warn|info|idle|overview|chart|log|channels|activity|lab|history|performance|settings|database|menu|flat|ok|fail|off|live|draft|target|alerts|add|remove|search|close|expand|prev|next|photo|heart|heart-filled|comment|play|pause|rewind|forward|sun|cloud|rain|star|calendar|clock|user|users|mail|lock|send|home|trophy|flame|sparkle|music|cart|tag|dots|sword|shield|wand|smile|card|pin|wind|drop; `size` sm|md|lg
57
+ - `IconButton` (`@vibes.diy/pouf`) — A square, labelled icon action. Props: `icon` (required) ReactNode; `label` (required) string; `tone` up|down|warn|info|idle|purple (lead)|orange (decorative); `size` sm|md|lg; `variant` solid|quiet; `disabled`; `loading`; `type` button|submit
58
+ - `Input` (`@vibes.diy/pouf`) — A single-line text field; wrap it in Field for its label. Props: `value` (required) string; `onChange` (required) (value: string) => void; `inputMode` search|none|email|tel|text|url|numeric|decimal; `spellCheck`; `required`; `mono`; `invalid`; `disabled`; `bare`
59
+ - `Metric` (`@vibes.diy/pouf`) — A labelled readout: small muted label, value beneath. Props: `label` (required) string; `value` (required) ReactNode; `num`; `mono`
60
+ - `ModeBanner` (`@vibes.diy/pouf`) — The draft/live (or any two-mode) indicator. Props: `live` (required)
61
+ - `NavLink` (`@vibes.diy/pouf`) — A navigation link that marks itself active on the current path. Props: `href` (required) string; `currentPath` (required) string; `icon` (required) IconLike; `tone` up|down|warn|info|idle|purple (lead)|orange (decorative)
62
+ - `Navbar` (`@vibes.diy/pouf`) — A top navigation bar on a floating cushion. Props: `brand` (required) ReactNode
63
+ - `NumberInput` (`@vibes.diy/pouf`) — A numeric field with step buttons; wrap it in Field for its label. Props: `value` (required) string; `onChange` (required) (value: string) => void; `invalid`; `disabled`
64
+ - `Pagination` (`@vibes.diy/pouf`) — Previous and next page controls with a page indicator for long lists. Props: `page` (required) number; `total` (required) number; `onChange` (required) (page: number) => void
65
+ - `Row` (`@vibes.diy/pouf`) — Lays children out horizontally with a gap, alignment and wrapping. Props: `gap` 1|2|3|4|5|6; `align` center|top; `justify` start|center|between|end; `wrap`
66
+ - `RowCard` (`@vibes.diy/pouf`) — One raised row per item in a list; clickable when given onClick. Props: `selected`
67
+ - `Segmented` (`@vibes.diy/pouf`) — A mutually-exclusive choice: grid vs list, draft vs live, and similar. Props: `value` (required) T; `onChange` (required) (value: T) => void; `options` (required) SegmentedOption<T>[]; `label` (required) string; `tone` up|down|warn|info|idle|purple (lead)|orange (decorative)
68
+ - `Shell` (`@vibes.diy/pouf`) — The page frame: a sidebar column beside the main content.
69
+ - `Sidebar` (`@vibes.diy/pouf`) — The side navigation column inside Shell. Props: `mobile` show|hide
70
+ - `Skeleton` (`@vibes.diy/pouf`) — A loading placeholder shaped like the text, row or card it stands in for. Props: `variant` text|row|card
71
+ - `Spacer` (`@vibes.diy/pouf`) — Pushes the items after it to the far end of a Row.
72
+ - `Stack` (`@vibes.diy/pouf`) — Stacks children vertically with an even gap. Props: `gap` 1|2|3|4|5|6
73
+ - `Stat` (`@vibes.diy/pouf`) — A headline figure on its own cushion. Props: `label` (required) string; `value` (required) string; `icon` (required) IconLike; `tone` (required) up|down|warn|info|idle|purple (lead)|orange (decorative)
74
+ - `Status` (`@vibes.diy/pouf`) — A labelled status dot that turns unknown when its reading goes stale. Props: `label` (required) string; `tone` (required) up|down|warn|info|idle|purple (lead)|orange (decorative)
75
+ - `Table` (`@vibes.diy/pouf`) — A data table with typed columns; rows can be clickable. Props: `columns` (required) TableColumn<T>[]; `rows` (required) T[]; `getKey` (required) (row: T) => string
76
+ - `Text` (`@vibes.diy/pouf`) — Body text: size, muted, numeric and monospace variants. Props: `size` sm|md; `muted`; `num`; `mono`; `truncate`
77
+ - `Textarea` (`@vibes.diy/pouf`) — A multi-line text field; wrap it in Field for its label. Props: `value` (required) string; `onChange` (required) (value: string) => void; `spellCheck`; `required`; `mono`; `invalid`; `disabled`
78
+ - `Accordion` (`@vibes.diy/pouf/interactive`) — A stack of expandable sections with one open at a time. Props: `items` (required) AccordionItem[]
79
+ - `AspectRatio` (`@vibes.diy/pouf/interactive`) — Holds media at a fixed width-to-height ratio.
80
+ - `Avatar` (`@vibes.diy/pouf/interactive`) — A person's picture, with initials or an icon when there is none. Props: `tone` up|down|warn|info|idle|purple (lead)|orange (decorative); `size` sm|md|lg
81
+ - `BottomNav` (`@vibes.diy/pouf/interactive`) — Mobile bottom navigation. Props: `primary` (required) NavItem[]; `groups` (required) NavGroup[]; `currentPath` (required) string
82
+ - `Checkbox` (`@vibes.diy/pouf/interactive`) — A labelled on/off checkbox. Props: `checked` (required) boolean | "indeterminate"; `onChange` (required) (checked: boolean | "indeterminate") => void; `disabled`; `hideLabel`
83
+ - `Collapsible` (`@vibes.diy/pouf/interactive`) — A single section that shows or hides its content from a trigger. Props: `trigger` (required) ReactNode; `open`
84
+ - `Combobox` (`@vibes.diy/pouf/interactive`) — A text field with suggestions: pick from the list or type a new value. Props: `value` (required) string; `onChange` (required) (value: string) => void; `options` (required) string[]; `loading`; `mono`
85
+ - `Confirm` (`@vibes.diy/pouf/interactive`) — Asks the person to confirm before an irreversible action such as a delete. Props: `title` (required) string; `body` (required) string; `confirmLabel` (required) string; `cancelLabel` (required) string; `onConfirm` (required) () => void; `tone` up|down|warn|info|idle|purple (lead)|orange (decorative); `loading`
86
+ - `ContextMenu` (`@vibes.diy/pouf/interactive`) — A menu of actions that opens on right-click or long-press. Props: `items` (required) (MenuEntry | "separator")[]
87
+ - `Dialog` (`@vibes.diy/pouf/interactive`) — A modal window for a focused task or form. Props: `trigger` (required) ReactNode; `title` (required) string; `open`; `size` md|lg
88
+ - `DropdownMenu` (`@vibes.diy/pouf/interactive`) — A menu of actions that opens from a trigger button. Props: `items` (required) ("separator" | MenuItem)[]
89
+ - `HoverCard` (`@vibes.diy/pouf/interactive`) — A preview card that appears on hover over its trigger. Props: `content` (required) ReactNode; `side` top|right|bottom|left; `align` start|center|end
90
+ - `Menubar` (`@vibes.diy/pouf/interactive`) — An application menu bar (File / Edit / View…). Props: `menus` (required) MenubarMenu[]
91
+ - `Progress` (`@vibes.diy/pouf/interactive`) — A progress bar for a value out of a maximum. Props: `value` (required) number; `tone` up|down|warn|info|idle|purple (lead)|orange (decorative)
92
+ - `RadioGroup` (`@vibes.diy/pouf/interactive`) — A labelled set of options where exactly one is chosen. Props: `value` (required) string; `onChange` (required) (value: string) => void; `options` (required) RadioOption[]; `label` (required) string; `disabled`
93
+ - `ScrollArea` (`@vibes.diy/pouf/interactive`) — A fixed-height region that scrolls its own content.
94
+ - `Select` (`@vibes.diy/pouf/interactive`) — A dropdown for picking one option from a list. Props: `value` (required) string; `onChange` (required) (value: string) => void; `options` (required) SelectOption[]; `disabled`
95
+ - `Separator` (`@vibes.diy/pouf/interactive`) — A thin divider line between groups of content.
96
+ - `Sheet` (`@vibes.diy/pouf/interactive`) — A panel that slides in from the side for secondary tasks. Props: `title` (required) string; `open`
97
+ - `Slider` (`@vibes.diy/pouf/interactive`) — Picks a number in a range by dragging. Props: `value` (required) number[]; `onChange` (required) (value: number[]) => void; `disabled`
98
+ - `Switch` (`@vibes.diy/pouf/interactive`) — A labelled on/off toggle for a setting that applies at once. Props: `checked` (required); `onChange` (required) (checked: boolean) => void; `disabled`
99
+ - `Tabs` (`@vibes.diy/pouf/interactive`) — Switches between panels of content under one heading. Props: `tabs` (required) Tab[]; `value` (required) string; `onChange` (required) (value: string) => void; `tone` up|down|warn|info|idle|purple (lead)|orange (decorative)
100
+ - `Toast` (`@vibes.diy/pouf/interactive`) — One alert message with a severity and a dismiss button. Props: `id` (required) number; `severity` (required) critical|info; `onDismiss` (required) (id: number) => void
101
+ - `ToastViewport` (`@vibes.diy/pouf/interactive`) — Renders a list of alert messages your app keeps in state. Props: `toasts` (required) ToastItem[]; `onDismiss` (required) (id: number) => void
102
+ - `Toaster` (`@vibes.diy/pouf/interactive`) — Mount once in the app so toast() calls appear on screen.
103
+ - `ToggleGroup` (`@vibes.diy/pouf/interactive`) — A row of toggle buttons where several can be on at once. Props: `value` (required) string[]; `onChange` (required) (value: string[]) => void; `options` (required) ToggleOption[]; `label` (required) string; `tone` up|down|warn|info|idle|purple (lead)|orange (decorative)
104
+ - `Tooltip` (`@vibes.diy/pouf/interactive`) — A short hint on hover or focus; needs a TooltipProvider above it. Props: `tip` (required) string
105
+ - `TooltipProvider` (`@vibes.diy/pouf/interactive`) — Wrap the app once; every Tooltip must sit inside it.
106
+ - `AreaChart` (`@vibes.diy/pouf/charts`) — An area chart of one or more series over a category axis. Props: `data` (required) Record<string, unknown>[]; `dataKey` (required) string; `series` (required) ChartSeries[]; `stacked`
107
+ - `BarChart` (`@vibes.diy/pouf/charts`) — A bar chart of one or more series, optionally stacked. Props: `data` (required) Record<string, unknown>[]; `dataKey` (required) string; `series` (required) ChartSeries[]; `stacked`
108
+ - `LineChart` (`@vibes.diy/pouf/charts`) — A line chart of one or more series over a category axis. Props: `data` (required) Record<string, unknown>[]; `dataKey` (required) string; `series` (required) ChartSeries[]
109
+ - `PieChart` (`@vibes.diy/pouf/charts`) — A pie or donut chart of parts of a whole. Props: `data` (required) PieSlice[]; `donut`; `labelled`
110
+
111
+ <!-- pouf-catalog:end -->
112
+
113
+ What the lines above leave out:
114
+
115
+ - `Field` takes a render function as its child and hands it the control's `id` and `describedBy`: `<Field label="Title" hint="Shown on the card">{(id, describedBy) => <Input id={id} describedBy={describedBy} value={title} onChange={setTitle} />}</Field>`. `Select`, `Textarea` and `NumberInput` wire up the same way.
116
+ - `Input`, `Textarea`, `NumberInput`, `Select` and `Combobox` call `onChange` with the new value itself, not an event: `onChange={setTitle}`, never `e.target.value`. `NumberInput` passes its value as a string.
117
+ - `TableColumn<T>` is `{ key, header, render: (row) => node, align?: "left" | "right", mono?, truncate?, sort?: (a, b) => number }`.
118
+ - `SelectOption` is `{ value, label }`, both strings.
119
+ - `ChartSeries` is `{ key, label?, tone? }`: `key` names a field of each `data` row and `dataKey` names the category field; a `PieChart` slice is `{ key, label, value, tone? }`.
120
+ - Toasts: mount `Toaster` once near the root inside the one wrapper that positions the stack, `<div className="pouf-toasts"><Toaster /></div>`, then call `toast("Saved")`, `toast.success(…)` or `toast.error(…)` from anywhere; `toast` is imported from `@vibes.diy/pouf/interactive` beside `Toaster`. A `ToastViewport` for alerts the app keeps in its own state sits inside the same wrapper.
121
+ - No pouf component accepts `className` or `style`. Change one with its props; place it with `Stack`, `Row` or `Grid` (`cols="sidebar"` for main plus side), or a plain wrapping `div`.
122
+ - A person is never a plain element: a person is `useViewer()`'s `<ViewerTag userHandle={...} />` and picking one is its `<HandleInput />`.
123
+
124
+ ## DO
125
+
126
+ - Give each view one job and build it from cushions: `Card`, `RowCard`, `Stat`, `Empty`, `CTA`.
127
+ - Let exactly one element per view wear `tone="purple"`, and give every other `Button` `variant="quiet"` or a tone that states its meaning.
128
+ - Set `tone` explicitly on every `Badge`, `Dot`, `Blob`, `Avatar`, `Progress`, `Tabs`, `Segmented`, `Highlight` and chart series, and pass `tone="down"` to a `Confirm` that deletes.
129
+ - Place everything with `Stack`, `Row` and `Grid`, using the `gap` prop for air and `Grid cols="sidebar"` for main plus side.
130
+ - Pick each tone by meaning: `up` for done, `down` for destructive, `warn` for needs attention, `info` for a neutral notice, `idle` for quiet.
131
+ - Wrap every form control in a `Field` and pass its `id` and `describedBy` through the render function.
132
+ - Show a `Skeleton` while data loads, an `Empty` when a list has nothing yet and an `ErrorNote` when a request fails.
133
+ - Ask before an irreversible action with `Confirm`, and acknowledge a finished one with `toast`.
134
+ - Render a person with `<ViewerTag userHandle={...} />` and pick one with `<HandleInput />`.
135
+
136
+ ## DON'T
137
+
138
+ - Do not put `className` or `style` on a pouf component; use its `tone`, `size` and `variant` props or wrap it in a layout primitive.
139
+ - Do not write a hex, rgb or named colour, or an arbitrary colour class such as `bg-[…]`, anywhere in the app.
140
+ - Do not hand-build a `<button>`, a `<select>`, a checkbox, radio or range `<input>`, a modal or an overlay; `Button`, `Select`, `Checkbox`, `RadioGroup`, `Slider`, `Dialog`, `Sheet` and `Confirm` already exist.
141
+ - Do not put two leads in one view: one `tone="purple"` element, and no other component left on its lead-tone default.
142
+ - Do not describe or choose a tone by hue; `up` is a meaning, and `purple` is whatever lead colour the room wears.
143
+ - Do not draw a cushion by hand with borders, rounded corners or shadows on a `div`; reach for `Card` or `RowCard`.
144
+ - Do not write a `:root` block or redefine any `var(--…)` the app already ships.
@@ -0,0 +1,16 @@
1
+ export type PoufEntry = "index" | "interactive" | "charts";
2
+ export declare const POUF_ENTRY_SPECIFIER: Readonly<Record<PoufEntry, string>>;
3
+ export interface PoufCatalogEntry {
4
+ readonly name: string;
5
+ readonly entry: PoufEntry;
6
+ readonly purpose: string;
7
+ readonly props: readonly {
8
+ readonly name: string;
9
+ readonly values?: readonly string[];
10
+ readonly type?: string;
11
+ readonly required: boolean;
12
+ }[];
13
+ }
14
+ export declare const POUF_CATALOG: readonly PoufCatalogEntry[];
15
+ export declare const POUF_COMPONENT_NAMES: Readonly<Record<PoufEntry, readonly string[]>>;
16
+ export declare const POUF_CATALOG_MD = "- `AlertBell` (`@vibes.diy/pouf`) \u2014 A bell button with an unread count that opens the session's alert history. Props: `alerts` (required) AlertBellItem[]; `unread` (required) number; `connected` (required); `onOpen` (required) () => void\n- `Badge` (`@vibes.diy/pouf`) \u2014 A small tonal label for a count, category or state. Props: `tone` up|down|warn|info|idle|purple (lead)|orange (decorative)\n- `Blob` (`@vibes.diy/pouf`) \u2014 A tonal icon tile that fronts a stat, list row or feature. Props: `icon` (required) IconLike; `tone` up|down|warn|info|idle|purple (lead)|orange (decorative); `size` sm|md|lg\n- `Breadcrumb` (`@vibes.diy/pouf`) \u2014 Shows where the current page sits in a hierarchy, with links back up. Props: `items` (required) BreadcrumbItem[]\n- `Button` (`@vibes.diy/pouf`) \u2014 The action button; give one primary action per area. Props: `tone` up|down|warn|info|idle|purple (lead)|orange (decorative); `size` sm|md|lg; `variant` solid|quiet; `block`; `disabled`; `loading`; `type` button|submit\n- `CTA` (`@vibes.diy/pouf`) \u2014 A call-to-action banner: a big tonal cushion with a headline and an action. Props: `title` (required) string; `action` (required) ReactNode; `tone` purple (lead)|pink|blue|mint|yellow|surface\n- `Card` (`@vibes.diy/pouf`) \u2014 The raised surface that groups related content into a panel. Props: `variant` default|flush|tight; `motion` none|lift|tilt-left|tilt-right\n- `Dot` (`@vibes.diy/pouf`) \u2014 A status dot. Props: `tone` up|down|warn|info|idle|purple (lead)|orange (decorative)\n- `Empty` (`@vibes.diy/pouf`) \u2014 The empty state for a list or panel with nothing in it yet. Props: `title` (required) string\n- `ErrorBoundary` (`@vibes.diy/pouf`) \u2014 Catches render crashes so one broken part can't blank the whole page. Props: `name` (required) string\n- `ErrorNote` (`@vibes.diy/pouf`) \u2014 An inline message that says a request or action failed.\n- `Eyebrow` (`@vibes.diy/pouf`) \u2014 A small uppercase label above a section heading.\n- `Field` (`@vibes.diy/pouf`) \u2014 Wraps a form control with its label, hint and error text. Props: `label` (required) string; `children` (required) (id: string, describedBy: string | undefined) => ReactNode\n- `Figure` (`@vibes.diy/pouf`) \u2014 An image, framed in clay. Props: `src` (required) string; `alt` (required) string; `width` (required) number; `height` (required) number\n- `Footer` (`@vibes.diy/pouf`) \u2014 A site footer on one big cushion: brand block plus columns of links, with an optional bottom note. Props: `brand` (required) ReactNode\n- `Freshness` (`@vibes.diy/pouf`) \u2014 Speaks only when the data on screen can no longer be trusted. Props: `at` (required) number; `isError`\n- `Grid` (`@vibes.diy/pouf`) \u2014 Lays children out in columns, or main plus side, stacking on narrow screens. Props: `cols` 2|3|4|sidebar; `gap` 1|2|3|4|5|6\n- `Heading` (`@vibes.diy/pouf`) \u2014 A page or section heading at level 1, 2 or 3. Props: `level` 1|2|3\n- `Highlight` (`@vibes.diy/pouf`) \u2014 Puts a tonal swatch behind a word or short phrase to make it pop. Props: `tone` up|down|warn|info|idle|purple (lead)|orange (decorative)\n- `Icon` (`@vibes.diy/pouf`) \u2014 A named glyph from the built-in icon set. Props: `name` (required) up|down|warn|info|idle|overview|chart|log|channels|activity|lab|history|performance|settings|database|menu|flat|ok|fail|off|live|draft|target|alerts|add|remove|search|close|expand|prev|next|photo|heart|heart-filled|comment|play|pause|rewind|forward|sun|cloud|rain|star|calendar|clock|user|users|mail|lock|send|home|trophy|flame|sparkle|music|cart|tag|dots|sword|shield|wand|smile|card|pin|wind|drop; `size` sm|md|lg\n- `IconButton` (`@vibes.diy/pouf`) \u2014 A square, labelled icon action. Props: `icon` (required) ReactNode; `label` (required) string; `tone` up|down|warn|info|idle|purple (lead)|orange (decorative); `size` sm|md|lg; `variant` solid|quiet; `disabled`; `loading`; `type` button|submit\n- `Input` (`@vibes.diy/pouf`) \u2014 A single-line text field; wrap it in Field for its label. Props: `value` (required) string; `onChange` (required) (value: string) => void; `inputMode` search|none|email|tel|text|url|numeric|decimal; `spellCheck`; `required`; `mono`; `invalid`; `disabled`; `bare`\n- `Metric` (`@vibes.diy/pouf`) \u2014 A labelled readout: small muted label, value beneath. Props: `label` (required) string; `value` (required) ReactNode; `num`; `mono`\n- `ModeBanner` (`@vibes.diy/pouf`) \u2014 The draft/live (or any two-mode) indicator. Props: `live` (required)\n- `NavLink` (`@vibes.diy/pouf`) \u2014 A navigation link that marks itself active on the current path. Props: `href` (required) string; `currentPath` (required) string; `icon` (required) IconLike; `tone` up|down|warn|info|idle|purple (lead)|orange (decorative)\n- `Navbar` (`@vibes.diy/pouf`) \u2014 A top navigation bar on a floating cushion. Props: `brand` (required) ReactNode\n- `NumberInput` (`@vibes.diy/pouf`) \u2014 A numeric field with step buttons; wrap it in Field for its label. Props: `value` (required) string; `onChange` (required) (value: string) => void; `invalid`; `disabled`\n- `Pagination` (`@vibes.diy/pouf`) \u2014 Previous and next page controls with a page indicator for long lists. Props: `page` (required) number; `total` (required) number; `onChange` (required) (page: number) => void\n- `Row` (`@vibes.diy/pouf`) \u2014 Lays children out horizontally with a gap, alignment and wrapping. Props: `gap` 1|2|3|4|5|6; `align` center|top; `justify` start|center|between|end; `wrap`\n- `RowCard` (`@vibes.diy/pouf`) \u2014 One raised row per item in a list; clickable when given onClick. Props: `selected`\n- `Segmented` (`@vibes.diy/pouf`) \u2014 A mutually-exclusive choice: grid vs list, draft vs live, and similar. Props: `value` (required) T; `onChange` (required) (value: T) => void; `options` (required) SegmentedOption<T>[]; `label` (required) string; `tone` up|down|warn|info|idle|purple (lead)|orange (decorative)\n- `Shell` (`@vibes.diy/pouf`) \u2014 The page frame: a sidebar column beside the main content.\n- `Sidebar` (`@vibes.diy/pouf`) \u2014 The side navigation column inside Shell. Props: `mobile` show|hide\n- `Skeleton` (`@vibes.diy/pouf`) \u2014 A loading placeholder shaped like the text, row or card it stands in for. Props: `variant` text|row|card\n- `Spacer` (`@vibes.diy/pouf`) \u2014 Pushes the items after it to the far end of a Row.\n- `Stack` (`@vibes.diy/pouf`) \u2014 Stacks children vertically with an even gap. Props: `gap` 1|2|3|4|5|6\n- `Stat` (`@vibes.diy/pouf`) \u2014 A headline figure on its own cushion. Props: `label` (required) string; `value` (required) string; `icon` (required) IconLike; `tone` (required) up|down|warn|info|idle|purple (lead)|orange (decorative)\n- `Status` (`@vibes.diy/pouf`) \u2014 A labelled status dot that turns unknown when its reading goes stale. Props: `label` (required) string; `tone` (required) up|down|warn|info|idle|purple (lead)|orange (decorative)\n- `Table` (`@vibes.diy/pouf`) \u2014 A data table with typed columns; rows can be clickable. Props: `columns` (required) TableColumn<T>[]; `rows` (required) T[]; `getKey` (required) (row: T) => string\n- `Text` (`@vibes.diy/pouf`) \u2014 Body text: size, muted, numeric and monospace variants. Props: `size` sm|md; `muted`; `num`; `mono`; `truncate`\n- `Textarea` (`@vibes.diy/pouf`) \u2014 A multi-line text field; wrap it in Field for its label. Props: `value` (required) string; `onChange` (required) (value: string) => void; `spellCheck`; `required`; `mono`; `invalid`; `disabled`\n- `Accordion` (`@vibes.diy/pouf/interactive`) \u2014 A stack of expandable sections with one open at a time. Props: `items` (required) AccordionItem[]\n- `AspectRatio` (`@vibes.diy/pouf/interactive`) \u2014 Holds media at a fixed width-to-height ratio.\n- `Avatar` (`@vibes.diy/pouf/interactive`) \u2014 A person's picture, with initials or an icon when there is none. Props: `tone` up|down|warn|info|idle|purple (lead)|orange (decorative); `size` sm|md|lg\n- `BottomNav` (`@vibes.diy/pouf/interactive`) \u2014 Mobile bottom navigation. Props: `primary` (required) NavItem[]; `groups` (required) NavGroup[]; `currentPath` (required) string\n- `Checkbox` (`@vibes.diy/pouf/interactive`) \u2014 A labelled on/off checkbox. Props: `checked` (required) boolean | \"indeterminate\"; `onChange` (required) (checked: boolean | \"indeterminate\") => void; `disabled`; `hideLabel`\n- `Collapsible` (`@vibes.diy/pouf/interactive`) \u2014 A single section that shows or hides its content from a trigger. Props: `trigger` (required) ReactNode; `open`\n- `Combobox` (`@vibes.diy/pouf/interactive`) \u2014 A text field with suggestions: pick from the list or type a new value. Props: `value` (required) string; `onChange` (required) (value: string) => void; `options` (required) string[]; `loading`; `mono`\n- `Confirm` (`@vibes.diy/pouf/interactive`) \u2014 Asks the person to confirm before an irreversible action such as a delete. Props: `title` (required) string; `body` (required) string; `confirmLabel` (required) string; `cancelLabel` (required) string; `onConfirm` (required) () => void; `tone` up|down|warn|info|idle|purple (lead)|orange (decorative); `loading`\n- `ContextMenu` (`@vibes.diy/pouf/interactive`) \u2014 A menu of actions that opens on right-click or long-press. Props: `items` (required) (MenuEntry | \"separator\")[]\n- `Dialog` (`@vibes.diy/pouf/interactive`) \u2014 A modal window for a focused task or form. Props: `trigger` (required) ReactNode; `title` (required) string; `open`; `size` md|lg\n- `DropdownMenu` (`@vibes.diy/pouf/interactive`) \u2014 A menu of actions that opens from a trigger button. Props: `items` (required) (\"separator\" | MenuItem)[]\n- `HoverCard` (`@vibes.diy/pouf/interactive`) \u2014 A preview card that appears on hover over its trigger. Props: `content` (required) ReactNode; `side` top|right|bottom|left; `align` start|center|end\n- `Menubar` (`@vibes.diy/pouf/interactive`) \u2014 An application menu bar (File / Edit / View\u2026). Props: `menus` (required) MenubarMenu[]\n- `Progress` (`@vibes.diy/pouf/interactive`) \u2014 A progress bar for a value out of a maximum. Props: `value` (required) number; `tone` up|down|warn|info|idle|purple (lead)|orange (decorative)\n- `RadioGroup` (`@vibes.diy/pouf/interactive`) \u2014 A labelled set of options where exactly one is chosen. Props: `value` (required) string; `onChange` (required) (value: string) => void; `options` (required) RadioOption[]; `label` (required) string; `disabled`\n- `ScrollArea` (`@vibes.diy/pouf/interactive`) \u2014 A fixed-height region that scrolls its own content.\n- `Select` (`@vibes.diy/pouf/interactive`) \u2014 A dropdown for picking one option from a list. Props: `value` (required) string; `onChange` (required) (value: string) => void; `options` (required) SelectOption[]; `disabled`\n- `Separator` (`@vibes.diy/pouf/interactive`) \u2014 A thin divider line between groups of content.\n- `Sheet` (`@vibes.diy/pouf/interactive`) \u2014 A panel that slides in from the side for secondary tasks. Props: `title` (required) string; `open`\n- `Slider` (`@vibes.diy/pouf/interactive`) \u2014 Picks a number in a range by dragging. Props: `value` (required) number[]; `onChange` (required) (value: number[]) => void; `disabled`\n- `Switch` (`@vibes.diy/pouf/interactive`) \u2014 A labelled on/off toggle for a setting that applies at once. Props: `checked` (required); `onChange` (required) (checked: boolean) => void; `disabled`\n- `Tabs` (`@vibes.diy/pouf/interactive`) \u2014 Switches between panels of content under one heading. Props: `tabs` (required) Tab[]; `value` (required) string; `onChange` (required) (value: string) => void; `tone` up|down|warn|info|idle|purple (lead)|orange (decorative)\n- `Toast` (`@vibes.diy/pouf/interactive`) \u2014 One alert message with a severity and a dismiss button. Props: `id` (required) number; `severity` (required) critical|info; `onDismiss` (required) (id: number) => void\n- `ToastViewport` (`@vibes.diy/pouf/interactive`) \u2014 Renders a list of alert messages your app keeps in state. Props: `toasts` (required) ToastItem[]; `onDismiss` (required) (id: number) => void\n- `Toaster` (`@vibes.diy/pouf/interactive`) \u2014 Mount once in the app so toast() calls appear on screen.\n- `ToggleGroup` (`@vibes.diy/pouf/interactive`) \u2014 A row of toggle buttons where several can be on at once. Props: `value` (required) string[]; `onChange` (required) (value: string[]) => void; `options` (required) ToggleOption[]; `label` (required) string; `tone` up|down|warn|info|idle|purple (lead)|orange (decorative)\n- `Tooltip` (`@vibes.diy/pouf/interactive`) \u2014 A short hint on hover or focus; needs a TooltipProvider above it. Props: `tip` (required) string\n- `TooltipProvider` (`@vibes.diy/pouf/interactive`) \u2014 Wrap the app once; every Tooltip must sit inside it.\n- `AreaChart` (`@vibes.diy/pouf/charts`) \u2014 An area chart of one or more series over a category axis. Props: `data` (required) Record<string, unknown>[]; `dataKey` (required) string; `series` (required) ChartSeries[]; `stacked`\n- `BarChart` (`@vibes.diy/pouf/charts`) \u2014 A bar chart of one or more series, optionally stacked. Props: `data` (required) Record<string, unknown>[]; `dataKey` (required) string; `series` (required) ChartSeries[]; `stacked`\n- `LineChart` (`@vibes.diy/pouf/charts`) \u2014 A line chart of one or more series over a category axis. Props: `data` (required) Record<string, unknown>[]; `dataKey` (required) string; `series` (required) ChartSeries[]\n- `PieChart` (`@vibes.diy/pouf/charts`) \u2014 A pie or donut chart of parts of a whole. Props: `data` (required) PieSlice[]; `donut`; `labelled`";