@vibes.diy/prompts 14.3.202 → 14.3.204

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 (247) hide show
  1. package/llms/access.md +4 -4
  2. package/llms/backend.md +1 -1
  3. package/llms/blockly.md +2 -2
  4. package/llms/bluesky.md +1 -1
  5. package/llms/board-games.md +95 -1
  6. package/llms/calendar.md +1 -1
  7. package/llms/callai.md +4 -4
  8. package/llms/connections.md +1 -1
  9. package/llms/create-vibe.md +3 -3
  10. package/llms/fireproof.md +7 -7
  11. package/llms/github.md +6 -2
  12. package/llms/image-gen.md +2 -2
  13. package/llms/index.d.ts +28 -28
  14. package/llms/index.js +84 -84
  15. package/llms/index.js.map +1 -1
  16. package/llms/maps.js +14 -2
  17. package/llms/maps.js.map +1 -1
  18. package/llms/maps.md +212 -9
  19. package/llms/match-style.md +1 -1
  20. package/llms/motion.md +7 -7
  21. package/llms/p5.md +1 -1
  22. package/llms/physics.md +2 -2
  23. package/llms/reskin.js +8 -1
  24. package/llms/reskin.js.map +1 -1
  25. package/llms/reskin.md +99 -20
  26. package/llms/richtext.md +5 -5
  27. package/llms/spotify.md +1 -1
  28. package/llms/stripe-subscriptions.md +1 -1
  29. package/llms/stripe.md +3 -3
  30. package/llms/strudel.md +3 -3
  31. package/llms/three-js.md +4 -4
  32. package/llms/touch-games.js +1 -1
  33. package/llms/touch-games.js.map +1 -1
  34. package/llms/touch-games.md +3 -3
  35. package/llms/ui-blog.d.ts +2 -0
  36. package/llms/ui-blog.js +7 -0
  37. package/llms/ui-blog.js.map +1 -0
  38. package/llms/{pouf-blog.md → ui-blog.md} +10 -10
  39. package/llms/ui-booking.d.ts +2 -0
  40. package/llms/ui-booking.js +7 -0
  41. package/llms/ui-booking.js.map +1 -0
  42. package/llms/{pouf-booking.md → ui-booking.md} +8 -8
  43. package/llms/ui-calendar.d.ts +2 -0
  44. package/llms/ui-calendar.js +7 -0
  45. package/llms/ui-calendar.js.map +1 -0
  46. package/llms/{pouf-calendar.md → ui-calendar.md} +5 -5
  47. package/llms/ui-chat.d.ts +2 -0
  48. package/llms/ui-chat.js +7 -0
  49. package/llms/ui-chat.js.map +1 -0
  50. package/llms/{pouf-chat.md → ui-chat.md} +4 -4
  51. package/llms/ui-contact.d.ts +2 -0
  52. package/llms/ui-contact.js +7 -0
  53. package/llms/ui-contact.js.map +1 -0
  54. package/llms/{pouf-contact.md → ui-contact.md} +7 -7
  55. package/llms/ui-course.d.ts +2 -0
  56. package/llms/ui-course.js +7 -0
  57. package/llms/ui-course.js.map +1 -0
  58. package/llms/{pouf-course.md → ui-course.md} +9 -9
  59. package/llms/ui-crm.d.ts +2 -0
  60. package/llms/ui-crm.js +7 -0
  61. package/llms/ui-crm.js.map +1 -0
  62. package/llms/{pouf-crm.md → ui-crm.md} +5 -5
  63. package/llms/ui-dashboard.d.ts +2 -0
  64. package/llms/ui-dashboard.js +7 -0
  65. package/llms/ui-dashboard.js.map +1 -0
  66. package/llms/{pouf-dashboard.md → ui-dashboard.md} +7 -7
  67. package/llms/ui-editorial.d.ts +2 -0
  68. package/llms/ui-editorial.js +7 -0
  69. package/llms/ui-editorial.js.map +1 -0
  70. package/llms/{pouf-editorial.md → ui-editorial.md} +5 -5
  71. package/llms/ui-event.d.ts +2 -0
  72. package/llms/ui-event.js +7 -0
  73. package/llms/ui-event.js.map +1 -0
  74. package/llms/{pouf-event.md → ui-event.md} +5 -5
  75. package/llms/ui-feed.d.ts +2 -0
  76. package/llms/ui-feed.js +7 -0
  77. package/llms/ui-feed.js.map +1 -0
  78. package/llms/{pouf-feed.md → ui-feed.md} +5 -5
  79. package/llms/ui-game.d.ts +2 -0
  80. package/llms/ui-game.js +7 -0
  81. package/llms/ui-game.js.map +1 -0
  82. package/llms/{pouf-game.md → ui-game.md} +6 -6
  83. package/llms/ui-inbox.d.ts +2 -0
  84. package/llms/ui-inbox.js +7 -0
  85. package/llms/ui-inbox.js.map +1 -0
  86. package/llms/{pouf-inbox.md → ui-inbox.md} +5 -5
  87. package/llms/ui-inventory.d.ts +2 -0
  88. package/llms/ui-inventory.js +7 -0
  89. package/llms/ui-inventory.js.map +1 -0
  90. package/llms/{pouf-inventory.md → ui-inventory.md} +5 -5
  91. package/llms/ui-kanban.d.ts +2 -0
  92. package/llms/ui-kanban.js +7 -0
  93. package/llms/ui-kanban.js.map +1 -0
  94. package/llms/{pouf-kanban.md → ui-kanban.md} +5 -5
  95. package/llms/ui-landing.d.ts +2 -0
  96. package/llms/ui-landing.js +7 -0
  97. package/llms/ui-landing.js.map +1 -0
  98. package/llms/{pouf-landing.md → ui-landing.md} +6 -6
  99. package/llms/ui-login.d.ts +2 -0
  100. package/llms/ui-login.js +7 -0
  101. package/llms/ui-login.js.map +1 -0
  102. package/llms/{pouf-login.md → ui-login.md} +7 -7
  103. package/llms/ui-music.d.ts +2 -0
  104. package/llms/ui-music.js +7 -0
  105. package/llms/ui-music.js.map +1 -0
  106. package/llms/{pouf-music.md → ui-music.md} +6 -6
  107. package/llms/ui-onboarding.d.ts +2 -0
  108. package/llms/ui-onboarding.js +7 -0
  109. package/llms/ui-onboarding.js.map +1 -0
  110. package/llms/{pouf-onboarding.md → ui-onboarding.md} +5 -5
  111. package/llms/ui-pricing.d.ts +2 -0
  112. package/llms/ui-pricing.js +7 -0
  113. package/llms/ui-pricing.js.map +1 -0
  114. package/llms/{pouf-pricing.md → ui-pricing.md} +5 -5
  115. package/llms/ui-profile.d.ts +2 -0
  116. package/llms/ui-profile.js +7 -0
  117. package/llms/ui-profile.js.map +1 -0
  118. package/llms/{pouf-profile.md → ui-profile.md} +4 -4
  119. package/llms/ui-quiz.d.ts +2 -0
  120. package/llms/ui-quiz.js +7 -0
  121. package/llms/ui-quiz.js.map +1 -0
  122. package/llms/{pouf-quiz.md → ui-quiz.md} +6 -6
  123. package/llms/ui-settings.d.ts +2 -0
  124. package/llms/ui-settings.js +7 -0
  125. package/llms/ui-settings.js.map +1 -0
  126. package/llms/{pouf-settings.md → ui-settings.md} +5 -5
  127. package/llms/ui-storefront.d.ts +2 -0
  128. package/llms/ui-storefront.js +7 -0
  129. package/llms/ui-storefront.js.map +1 -0
  130. package/llms/{pouf-storefront.md → ui-storefront.md} +9 -9
  131. package/llms/ui-support.d.ts +2 -0
  132. package/llms/ui-support.js +7 -0
  133. package/llms/ui-support.js.map +1 -0
  134. package/llms/{pouf-support.md → ui-support.md} +5 -5
  135. package/llms/ui-testimonials.d.ts +2 -0
  136. package/llms/ui-testimonials.js +7 -0
  137. package/llms/ui-testimonials.js.map +1 -0
  138. package/llms/{pouf-testimonials.md → ui-testimonials.md} +6 -6
  139. package/llms/ui-todo.d.ts +2 -0
  140. package/llms/ui-todo.js +7 -0
  141. package/llms/ui-todo.js.map +1 -0
  142. package/llms/{pouf-todo.md → ui-todo.md} +5 -5
  143. package/llms/ui-weather.d.ts +2 -0
  144. package/llms/ui-weather.js +7 -0
  145. package/llms/ui-weather.js.map +1 -0
  146. package/llms/{pouf-weather.md → ui-weather.md} +5 -5
  147. package/llms/use-vibe.md +4 -4
  148. package/llms/use-viewer.md +5 -5
  149. package/llms/voxel.md +1 -1
  150. package/llms/web-audio.md +49 -26
  151. package/llms/worlds.md +3 -3
  152. package/llms/youtube.md +1 -1
  153. package/package.json +5 -5
  154. package/system-prompt-initial-instant.md +3 -3
  155. package/system-prompt.md +3 -3
  156. package/themes/colorsets.js +7 -7
  157. package/themes/colorsets.js.map +1 -1
  158. package/themes/looks/pouf/brief.md +87 -85
  159. package/themes/looks/pouf/catalog.generated.d.ts +1 -1
  160. package/themes/looks/pouf/catalog.generated.js +47 -17
  161. package/themes/looks/pouf/catalog.generated.js.map +1 -1
  162. package/themes/looks/pouf/variety.js +4 -4
  163. package/themes/looks/pouf/variety.js.map +1 -1
  164. package/llms/pouf-blog.d.ts +0 -2
  165. package/llms/pouf-blog.js +0 -6
  166. package/llms/pouf-blog.js.map +0 -1
  167. package/llms/pouf-booking.d.ts +0 -2
  168. package/llms/pouf-booking.js +0 -6
  169. package/llms/pouf-booking.js.map +0 -1
  170. package/llms/pouf-calendar.d.ts +0 -2
  171. package/llms/pouf-calendar.js +0 -6
  172. package/llms/pouf-calendar.js.map +0 -1
  173. package/llms/pouf-chat.d.ts +0 -2
  174. package/llms/pouf-chat.js +0 -6
  175. package/llms/pouf-chat.js.map +0 -1
  176. package/llms/pouf-contact.d.ts +0 -2
  177. package/llms/pouf-contact.js +0 -6
  178. package/llms/pouf-contact.js.map +0 -1
  179. package/llms/pouf-course.d.ts +0 -2
  180. package/llms/pouf-course.js +0 -6
  181. package/llms/pouf-course.js.map +0 -1
  182. package/llms/pouf-crm.d.ts +0 -2
  183. package/llms/pouf-crm.js +0 -6
  184. package/llms/pouf-crm.js.map +0 -1
  185. package/llms/pouf-dashboard.d.ts +0 -2
  186. package/llms/pouf-dashboard.js +0 -6
  187. package/llms/pouf-dashboard.js.map +0 -1
  188. package/llms/pouf-editorial.d.ts +0 -2
  189. package/llms/pouf-editorial.js +0 -6
  190. package/llms/pouf-editorial.js.map +0 -1
  191. package/llms/pouf-event.d.ts +0 -2
  192. package/llms/pouf-event.js +0 -6
  193. package/llms/pouf-event.js.map +0 -1
  194. package/llms/pouf-feed.d.ts +0 -2
  195. package/llms/pouf-feed.js +0 -6
  196. package/llms/pouf-feed.js.map +0 -1
  197. package/llms/pouf-game.d.ts +0 -2
  198. package/llms/pouf-game.js +0 -6
  199. package/llms/pouf-game.js.map +0 -1
  200. package/llms/pouf-inbox.d.ts +0 -2
  201. package/llms/pouf-inbox.js +0 -6
  202. package/llms/pouf-inbox.js.map +0 -1
  203. package/llms/pouf-inventory.d.ts +0 -2
  204. package/llms/pouf-inventory.js +0 -6
  205. package/llms/pouf-inventory.js.map +0 -1
  206. package/llms/pouf-kanban.d.ts +0 -2
  207. package/llms/pouf-kanban.js +0 -6
  208. package/llms/pouf-kanban.js.map +0 -1
  209. package/llms/pouf-landing.d.ts +0 -2
  210. package/llms/pouf-landing.js +0 -6
  211. package/llms/pouf-landing.js.map +0 -1
  212. package/llms/pouf-login.d.ts +0 -2
  213. package/llms/pouf-login.js +0 -6
  214. package/llms/pouf-login.js.map +0 -1
  215. package/llms/pouf-music.d.ts +0 -2
  216. package/llms/pouf-music.js +0 -6
  217. package/llms/pouf-music.js.map +0 -1
  218. package/llms/pouf-onboarding.d.ts +0 -2
  219. package/llms/pouf-onboarding.js +0 -6
  220. package/llms/pouf-onboarding.js.map +0 -1
  221. package/llms/pouf-pricing.d.ts +0 -2
  222. package/llms/pouf-pricing.js +0 -6
  223. package/llms/pouf-pricing.js.map +0 -1
  224. package/llms/pouf-profile.d.ts +0 -2
  225. package/llms/pouf-profile.js +0 -6
  226. package/llms/pouf-profile.js.map +0 -1
  227. package/llms/pouf-quiz.d.ts +0 -2
  228. package/llms/pouf-quiz.js +0 -6
  229. package/llms/pouf-quiz.js.map +0 -1
  230. package/llms/pouf-settings.d.ts +0 -2
  231. package/llms/pouf-settings.js +0 -6
  232. package/llms/pouf-settings.js.map +0 -1
  233. package/llms/pouf-storefront.d.ts +0 -2
  234. package/llms/pouf-storefront.js +0 -6
  235. package/llms/pouf-storefront.js.map +0 -1
  236. package/llms/pouf-support.d.ts +0 -2
  237. package/llms/pouf-support.js +0 -6
  238. package/llms/pouf-support.js.map +0 -1
  239. package/llms/pouf-testimonials.d.ts +0 -2
  240. package/llms/pouf-testimonials.js +0 -6
  241. package/llms/pouf-testimonials.js.map +0 -1
  242. package/llms/pouf-todo.d.ts +0 -2
  243. package/llms/pouf-todo.js +0 -6
  244. package/llms/pouf-todo.js.map +0 -1
  245. package/llms/pouf-weather.d.ts +0 -2
  246. package/llms/pouf-weather.js +0 -6
  247. package/llms/pouf-weather.js.map +0 -1
@@ -1,8 +1,8 @@
1
- # Pouf CRM
1
+ # CRM
2
2
 
3
3
  A customer list that remembers where every relationship stands: a design studio's clients, a bakery's wholesale accounts, a freelancer's leads, a nonprofit's donors. Reach for it whenever the app's core is people or companies the person keeps in touch with, each carrying a stage (a lead, active, at risk), a few account details and a running trail of notes. Customers, their stage and every note persist, so the list is where it was left on the next visit and for everyone working the accounts.
4
4
 
5
- Built from @vibes.diy/pouf components; persisted state lives in Fireproof. Every write surface is gated on `useVibe(dbName).can`.
5
+ Built from @vibes.diy/ui components; persisted state lives in Fireproof. Every write surface is gated on `useVibe(dbName).can`.
6
6
 
7
7
  ## The block
8
8
 
@@ -33,8 +33,8 @@ import {
33
33
  Stack,
34
34
  Text,
35
35
  Textarea,
36
- } from "@vibes.diy/pouf";
37
- import { Dialog, Select, Toaster, toast } from "@vibes.diy/pouf/interactive";
36
+ } from "@vibes.diy/ui";
37
+ import { Dialog, Select, Toaster, toast } from "@vibes.diy/ui/interactive";
38
38
 
39
39
  const STAGES = {
40
40
  lead: { label: "Lead", tone: "info" },
@@ -312,7 +312,7 @@ export default function App() {
312
312
  )}
313
313
  </Stack>
314
314
  )}
315
- <div className="pouf-toasts">
315
+ <div className="ui-toasts">
316
316
  <Toaster />
317
317
  </div>
318
318
  </main>
@@ -0,0 +1,2 @@
1
+ import type { LlmConfig } from "./types.js";
2
+ export declare const uiDashboardConfig: LlmConfig;
@@ -0,0 +1,7 @@
1
+ export const uiDashboardConfig = {
2
+ name: "ui-dashboard",
3
+ aliases: ["pouf-dashboard"],
4
+ label: "Dashboard block",
5
+ description: "Sales dashboard with figures, a range chart and a sortable table",
6
+ };
7
+ //# sourceMappingURL=ui-dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-dashboard.js","sourceRoot":"","sources":["../../jsr/llms/ui-dashboard.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,iBAAiB,GAAc;IAC1C,IAAI,EAAE,cAAc;IACpB,OAAO,EAAE,CAAC,gBAAgB,CAAC;IAC3B,KAAK,EAAE,iBAAiB;IACxB,WAAW,EAAE,kEAAkE;CAChF,CAAC"}
@@ -1,12 +1,12 @@
1
- # Pouf Dashboard
1
+ # Dashboard
2
2
 
3
3
  An overview page that turns the records an app keeps into a few headline figures, a chart and a table: a candle shop's sales, a bake sale's takings, a market stall's week, a club's ticket sales. Reach for it whenever the app's core is "how are we doing", answered from things people log. The figures are never typed in by hand: each sale is its own document, and every number, bar and row on the page is computed from those documents when it renders, so the dashboard is current on the next visit and on every device that opens the app.
4
4
 
5
- Built from @vibes.diy/pouf components; persisted state lives in Fireproof. Every write surface is gated on `useVibe(dbName).can`.
5
+ Built from @vibes.diy/ui components; persisted state lives in Fireproof. Every write surface is gated on `useVibe(dbName).can`.
6
6
 
7
7
  ## The block
8
8
 
9
- One view with one job: read the business at a glance. The `Heading` and a muted line open the page, beside a `Segmented` range picker (`tone="info"`) that scopes the money taken, the sales count, the chart and the table. Three `Stat`s follow in a `Grid`, each toned by meaning (`up` for money taken, `info` for a plain count, `warn` for sales still waiting on payment); the unpaid count ignores the range on purpose, because a sale still owed does not stop being owed when it scrolls out of the week. Under them a `Card` holds the `AreaChart` from `@vibes.diy/pouf/charts`, one bucket per day, week or month, its one series toned `up` like the money-taken `Stat` it breaks down. The `Grid cols="sidebar"` below puts the range's latest sales in a `Table` on the main side (sortable columns, the status as a `Badge` read from the stored field: `up` paid, `warn` awaiting payment) and the `Record a sale` form on the side, whose button is the view's one lead and shows `loading` while the write lands. A sale still awaiting payment gets a quiet `Mark paid` in its row, showing `loading` until its write lands. Every write waits on its `can` verdict from `useVibe("sales")`, the database the sales live in: the form shows a `Skeleton` inside an `aria-busy` wrapper while the verdict resolves, a `Sign in to record sales` lead wired to `useViewer().requestLogin()` for a visitor who has not signed in, and a sentence in the app's own words when recording is closed to a signed-in visitor; `Mark paid` renders only where `can.edit(sale).ok`.
9
+ One view with one job: read the business at a glance. The `Heading` and a muted line open the page, beside a `Segmented` range picker (`tone="info"`) that scopes the money taken, the sales count, the chart and the table. Three `Stat`s follow in a `Grid`, each toned by meaning (`up` for money taken, `info` for a plain count, `warn` for sales still waiting on payment); the unpaid count ignores the range on purpose, because a sale still owed does not stop being owed when it scrolls out of the week. Under them a `Card` holds the `AreaChart` from `@vibes.diy/ui/charts`, one bucket per day, week or month, its one series toned `up` like the money-taken `Stat` it breaks down. The `Grid cols="sidebar"` below puts the range's latest sales in a `Table` on the main side (sortable columns, the status as a `Badge` read from the stored field: `up` paid, `warn` awaiting payment) and the `Record a sale` form on the side, whose button is the view's one lead and shows `loading` while the write lands. A sale still awaiting payment gets a quiet `Mark paid` in its row, showing `loading` until its write lands. Every write waits on its `can` verdict from `useVibe("sales")`, the database the sales live in: the form shows a `Skeleton` inside an `aria-busy` wrapper while the verdict resolves, a `Sign in to record sales` lead wired to `useViewer().requestLogin()` for a visitor who has not signed in, and a sentence in the app's own words when recording is closed to a signed-in visitor; `Mark paid` renders only where `can.edit(sale).ok`.
10
10
 
11
11
  ### `App.jsx`
12
12
  ```jsx
@@ -30,9 +30,9 @@ import {
30
30
  Stat,
31
31
  Table,
32
32
  Text,
33
- } from "@vibes.diy/pouf";
34
- import { Select, Toaster, toast } from "@vibes.diy/pouf/interactive";
35
- import { AreaChart } from "@vibes.diy/pouf/charts";
33
+ } from "@vibes.diy/ui";
34
+ import { Select, Toaster, toast } from "@vibes.diy/ui/interactive";
35
+ import { AreaChart } from "@vibes.diy/ui/charts";
36
36
 
37
37
  const MONEY = new Intl.NumberFormat(undefined, { style: "currency", currency: "USD" });
38
38
  const RANGES = [
@@ -255,7 +255,7 @@ export default function App() {
255
255
  {form}
256
256
  </Grid>
257
257
  </Stack>
258
- <div className="pouf-toasts">
258
+ <div className="ui-toasts">
259
259
  <Toaster />
260
260
  </div>
261
261
  </main>
@@ -0,0 +1,2 @@
1
+ import type { LlmConfig } from "./types.js";
2
+ export declare const uiEditorialConfig: LlmConfig;
@@ -0,0 +1,7 @@
1
+ export const uiEditorialConfig = {
2
+ name: "ui-editorial",
3
+ aliases: ["pouf-editorial"],
4
+ label: "Editorial block",
5
+ description: "Story pipeline moving drafts through scheduled to published",
6
+ };
7
+ //# sourceMappingURL=ui-editorial.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-editorial.js","sourceRoot":"","sources":["../../jsr/llms/ui-editorial.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,iBAAiB,GAAc;IAC1C,IAAI,EAAE,cAAc;IACpB,OAAO,EAAE,CAAC,gBAAgB,CAAC;IAC3B,KAAK,EAAE,iBAAiB;IACxB,WAAW,EAAE,6DAA6D;CAC3E,CAAC"}
@@ -1,8 +1,8 @@
1
- # Pouf Editorial
1
+ # Editorial
2
2
 
3
3
  A story pipeline that walks each piece from idea to launch: a school newspaper's desk, a newsletter's post queue, a team blog's calendar, a zine's issue plan. Reach for it whenever the app's core is pieces of writing that each sit in one stage (draft, scheduled, published) and move forward one step at a time. Stories and their stage persist, so the desk is where the team left it on the next visit and for everyone working it.
4
4
 
5
- Built from @vibes.diy/pouf components; persisted state lives in Fireproof. Every write surface is gated on `useVibe(dbName).can`.
5
+ Built from @vibes.diy/ui components; persisted state lives in Fireproof. Every write surface is gated on `useVibe(dbName).can`.
6
6
 
7
7
  ## The block
8
8
 
@@ -32,8 +32,8 @@ import {
32
32
  Spacer,
33
33
  Stack,
34
34
  Text,
35
- } from "@vibes.diy/pouf";
36
- import { Dialog, Toaster, toast } from "@vibes.diy/pouf/interactive";
35
+ } from "@vibes.diy/ui";
36
+ import { Dialog, Toaster, toast } from "@vibes.diy/ui/interactive";
37
37
 
38
38
  const STAGES = {
39
39
  draft: { label: "Draft", plural: "Drafts", empty: "No drafts", tone: "idle" },
@@ -228,7 +228,7 @@ export default function App() {
228
228
  )}
229
229
  </Stack>
230
230
  )}
231
- <div className="pouf-toasts">
231
+ <div className="ui-toasts">
232
232
  <Toaster />
233
233
  </div>
234
234
  </main>
@@ -0,0 +1,2 @@
1
+ import type { LlmConfig } from "./types.js";
2
+ export declare const uiEventConfig: LlmConfig;
@@ -0,0 +1,7 @@
1
+ export const uiEventConfig = {
2
+ name: "ui-event",
3
+ aliases: ["pouf-event"],
4
+ label: "Event block",
5
+ description: "Guest check-in desk with arrivals count, search and attendance filter",
6
+ };
7
+ //# sourceMappingURL=ui-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-event.js","sourceRoot":"","sources":["../../jsr/llms/ui-event.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,aAAa,GAAc;IACtC,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,CAAC,YAAY,CAAC;IACvB,KAAK,EAAE,aAAa;IACpB,WAAW,EAAE,uEAAuE;CACrF,CAAC"}
@@ -1,8 +1,8 @@
1
- # Pouf Event
1
+ # Event
2
2
 
3
3
  A check-in desk for the door of an event: an astronomy night's arrivals, a wedding reception, a meetup's RSVPs, a workshop's sign-in sheet. Reach for it whenever the app's core is a list of people expected somewhere who get marked as arrived, with a running count of who is in and who is still on the way. Guests and their check-ins persist, so every volunteer at the door sees the same list on their own phone and it survives a reload.
4
4
 
5
- Built from @vibes.diy/pouf components; persisted state lives in Fireproof. Every write surface is gated on `useVibe(dbName).can`.
5
+ Built from @vibes.diy/ui components; persisted state lives in Fireproof. Every write surface is gated on `useVibe(dbName).can`.
6
6
 
7
7
  ## The block
8
8
 
@@ -31,8 +31,8 @@ import {
31
31
  Stack,
32
32
  Stat,
33
33
  Text,
34
- } from "@vibes.diy/pouf";
35
- import { Dialog, Select, Toaster, toast } from "@vibes.diy/pouf/interactive";
34
+ } from "@vibes.diy/ui";
35
+ import { Dialog, Select, Toaster, toast } from "@vibes.diy/ui/interactive";
36
36
 
37
37
  const NUMBER = new Intl.NumberFormat();
38
38
 
@@ -218,7 +218,7 @@ export default function App() {
218
218
  </Stack>
219
219
  )}
220
220
  </Stack>
221
- <div className="pouf-toasts">
221
+ <div className="ui-toasts">
222
222
  <Toaster />
223
223
  </div>
224
224
  </main>
@@ -0,0 +1,2 @@
1
+ import type { LlmConfig } from "./types.js";
2
+ export declare const uiFeedConfig: LlmConfig;
@@ -0,0 +1,7 @@
1
+ export const uiFeedConfig = {
2
+ name: "ui-feed",
3
+ aliases: ["pouf-feed"],
4
+ label: "Feed block",
5
+ description: "Social feed to post updates, like them and reply in comments",
6
+ };
7
+ //# sourceMappingURL=ui-feed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-feed.js","sourceRoot":"","sources":["../../jsr/llms/ui-feed.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,YAAY,GAAc;IACrC,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,CAAC,WAAW,CAAC;IACtB,KAAK,EAAE,YAAY;IACnB,WAAW,EAAE,8DAA8D;CAC5E,CAAC"}
@@ -1,8 +1,8 @@
1
- # Pouf Feed
1
+ # Feed
2
2
 
3
3
  A stream of short posts that people write, like and talk under: a club's news board, a family update wall, a class's shout-outs, a team's wins channel. Reach for it whenever the app's core is people posting a few sentences for each other and reacting to what others posted. Posts, likes and comments persist, so the conversation is waiting on the next visit and on every device that opens the app.
4
4
 
5
- Built from @vibes.diy/pouf components; persisted state lives in Fireproof. Every write surface is gated on `useVibe(dbName).can`.
5
+ Built from @vibes.diy/ui components; persisted state lives in Fireproof. Every write surface is gated on `useVibe(dbName).can`.
6
6
 
7
7
  ## The block
8
8
 
@@ -13,8 +13,8 @@ One view with one job: the feed. The `Heading` and a muted count open the page;
13
13
  import React, { useState } from "react";
14
14
  import { useFireproof } from "use-fireproof";
15
15
  import { useViewer, useVibe } from "use-vibes";
16
- import { Button, Card, Empty, Field, Heading, Icon, IconButton, Input, Row, Skeleton, Spacer, Stack, Text, Textarea } from "@vibes.diy/pouf";
17
- import { Confirm, Toaster, toast } from "@vibes.diy/pouf/interactive";
16
+ import { Button, Card, Empty, Field, Heading, Icon, IconButton, Input, Row, Skeleton, Spacer, Stack, Text, Textarea } from "@vibes.diy/ui";
17
+ import { Confirm, Toaster, toast } from "@vibes.diy/ui/interactive";
18
18
 
19
19
  const when = (ms) => new Date(ms).toLocaleString([], { month: "short", day: "numeric", hour: "numeric", minute: "2-digit" });
20
20
 
@@ -231,7 +231,7 @@ export default function App() {
231
231
  </Stack>
232
232
  )}
233
233
  </Stack>
234
- <div className="pouf-toasts">
234
+ <div className="ui-toasts">
235
235
  <Toaster />
236
236
  </div>
237
237
  </main>
@@ -0,0 +1,2 @@
1
+ import type { LlmConfig } from "./types.js";
2
+ export declare const uiGameConfig: LlmConfig;
@@ -0,0 +1,7 @@
1
+ export const uiGameConfig = {
2
+ name: "ui-game",
3
+ aliases: ["pouf-game"],
4
+ label: "Game block",
5
+ description: "Turn-based game screen with health bars, inventory and saved high scores",
6
+ };
7
+ //# sourceMappingURL=ui-game.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-game.js","sourceRoot":"","sources":["../../jsr/llms/ui-game.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,YAAY,GAAc;IACrC,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,CAAC,WAAW,CAAC;IACtB,KAAK,EAAE,YAAY;IACnB,WAAW,EAAE,0EAA0E;CACxF,CAAC"}
@@ -1,20 +1,20 @@
1
- # Pouf Game
1
+ # Game
2
2
 
3
3
  A small turn-based game screen with a scoreboard that remembers: a boss fight for friends, a kids' dungeon run, a classroom quiz battle, a quick office break game. Reach for it whenever the app's core is a short run someone plays through, with bars that move, a few items to equip and a high-score table to beat. The run itself lives in the page while it is played; each finished run that someone saves is its own score document, so the leaderboard is there on the next visit and for everyone who opens the app.
4
4
 
5
- Built from @vibes.diy/pouf components; persisted state lives in Fireproof. Every write surface is gated on `useVibe(dbName).can`.
5
+ Built from @vibes.diy/ui components; persisted state lives in Fireproof. Every write surface is gated on `useVibe(dbName).can`.
6
6
 
7
7
  ## The block
8
8
 
9
- One view with one job: play the run, then post the score. An `Eyebrow`, the `Heading` and two `Stat`s (this run's score `info`, the visitor's best `up`) open the page. The fight sits on a `Card`: the boss's health as a `Progress` toned `down`, the player's as `up` (turning `warn` when low), the spell charge as `info`, each with a muted numeric readout, and `Attack` as the view's one lead beside a quiet `Cast spell`. The boss hits back after every move it survives, a cast that only charges included, so attacking and casting both cost health and the scores spread out instead of piling up at one ceiling. The inventory is one clickable `RowCard` per item with a decorative `orange` `Blob`, its name and effect in `Text`, and a `Badge` for its state (`up` equipped, `idle` not). When the run ends the actions give way to the result: `Save score` becomes the lead, with `loading` while the write lands, and a quiet `Play again`. The leaderboard `Table` shows each player's best saved run, the player as a `ViewerTag`. Saving waits on its `can` verdict from `useVibe("arcade")`, the database the scores live in: a `Skeleton` inside an `aria-busy` wrapper while it resolves, a `Sign in to save your score` lead wired to `useViewer().requestLogin()` for a visitor who has not signed in, and a sentence in the app's own words when saving is closed. Anyone can play without signing in. The finished run lives only in the page until it is saved, so if signing in reloads the app that run is gone; the copy says so rather than promising otherwise.
9
+ One view with one job: play the run, then post the score. An `Eyebrow`, the `Heading` and two `Stat`s (this run's score `info`, the visitor's best `up`) open the page. The fight sits on a `Card`: the boss's health as a `Progress` toned `down`, the player's as `up` (turning `warn` when low), the spell charge as `info`, each with a muted numeric readout, and `Attack` as the view's one lead beside a quiet `Cast spell`. The boss hits back after every move it survives, a cast that only charges included, so attacking and casting both cost health and the scores spread out instead of piling up at one ceiling. The inventory is one clickable `RowCard` per item with a decorative `orange` `IconTile`, its name and effect in `Text`, and a `Badge` for its state (`up` equipped, `idle` not). When the run ends the actions give way to the result: `Save score` becomes the lead, with `loading` while the write lands, and a quiet `Play again`. The leaderboard `Table` shows each player's best saved run, the player as a `ViewerTag`. Saving waits on its `can` verdict from `useVibe("arcade")`, the database the scores live in: a `Skeleton` inside an `aria-busy` wrapper while it resolves, a `Sign in to save your score` lead wired to `useViewer().requestLogin()` for a visitor who has not signed in, and a sentence in the app's own words when saving is closed. Anyone can play without signing in. The finished run lives only in the page until it is saved, so if signing in reloads the app that run is gone; the copy says so rather than promising otherwise.
10
10
 
11
11
  ### `App.jsx`
12
12
  ```jsx
13
13
  import React, { useState } from "react";
14
14
  import { useFireproof } from "use-fireproof";
15
15
  import { useViewer, useVibe } from "use-vibes";
16
- import { Badge, Blob, Button, Card, Empty, Eyebrow, Grid, Heading, Row, RowCard, Skeleton, Stack, Stat, Table, Text } from "@vibes.diy/pouf";
17
- import { Progress } from "@vibes.diy/pouf/interactive";
16
+ import { Badge, IconTile, Button, Card, Empty, Eyebrow, Grid, Heading, Row, RowCard, Skeleton, Stack, Stat, Table, Text } from "@vibes.diy/ui";
17
+ import { Progress } from "@vibes.diy/ui/interactive";
18
18
 
19
19
  const BOSS_MAX = 120;
20
20
  // The boss's counter-hit: 10 to 16 each turn, less whatever armour blocks.
@@ -219,7 +219,7 @@ export default function App() {
219
219
  <RowCard key={item.id} onClick={used || over ? undefined : () => toggleItem(item)}>
220
220
  <Row justify="between" wrap={false}>
221
221
  <Row gap={3} wrap={false}>
222
- <Blob icon={item.icon} tone="orange" size="sm" />
222
+ <IconTile icon={item.icon} tone="orange" size="sm" />
223
223
  <Stack gap={1}>
224
224
  <Text>{item.name}</Text>
225
225
  <Text size="sm" muted>
@@ -0,0 +1,2 @@
1
+ import type { LlmConfig } from "./types.js";
2
+ export declare const uiInboxConfig: LlmConfig;
@@ -0,0 +1,7 @@
1
+ export const uiInboxConfig = {
2
+ name: "ui-inbox",
3
+ aliases: ["pouf-inbox"],
4
+ label: "Inbox block",
5
+ description: "Shared inbox to send notes, search, read, reply and archive",
6
+ };
7
+ //# sourceMappingURL=ui-inbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-inbox.js","sourceRoot":"","sources":["../../jsr/llms/ui-inbox.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,aAAa,GAAc;IACtC,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,CAAC,YAAY,CAAC;IACvB,KAAK,EAAE,aAAa;IACpB,WAAW,EAAE,6DAA6D;CAC3E,CAAC"}
@@ -1,8 +1,8 @@
1
- # Pouf Inbox
1
+ # Inbox
2
2
 
3
3
  A shared mailbox of notes that people send in and a few people read, answer and file away: a residents' committee inbox, workshop feedback, a club's suggestion box, a family's requests for the weekend. Reach for it whenever the app's core is messages that arrive one at a time, each with a subject, and get opened, replied to and archived. Notes and replies persist, so the inbox, what has been read and what has been archived are the same on the next visit and for everyone who opens it.
4
4
 
5
- Built from @vibes.diy/pouf components; persisted state lives in Fireproof. Every write surface is gated on `useVibe(dbName).can`.
5
+ Built from @vibes.diy/ui components; persisted state lives in Fireproof. Every write surface is gated on `useVibe(dbName).can`.
6
6
 
7
7
  ## The block
8
8
 
@@ -13,8 +13,8 @@ Two views, one job each. The list opens with the `Heading` and a muted unread co
13
13
  import React, { useState } from "react";
14
14
  import { useFireproof } from "use-fireproof";
15
15
  import { useViewer, useVibe } from "use-vibes";
16
- import { Button, Card, Dot, Empty, Field, Heading, Icon, IconButton, Input, Row, RowCard, Segmented, Skeleton, Spacer, Stack, Text, Textarea } from "@vibes.diy/pouf";
17
- import { Confirm, Dialog, Toaster, toast } from "@vibes.diy/pouf/interactive";
16
+ import { Button, Card, Dot, Empty, Field, Heading, Icon, IconButton, Input, Row, RowCard, Segmented, Skeleton, Spacer, Stack, Text, Textarea } from "@vibes.diy/ui";
17
+ import { Confirm, Dialog, Toaster, toast } from "@vibes.diy/ui/interactive";
18
18
 
19
19
  const BOXES = [
20
20
  { value: "inbox", label: "Inbox" },
@@ -313,7 +313,7 @@ export default function App() {
313
313
  )}
314
314
  </Stack>
315
315
  )}
316
- <div className="pouf-toasts">
316
+ <div className="ui-toasts">
317
317
  <Toaster />
318
318
  </div>
319
319
  </main>
@@ -0,0 +1,2 @@
1
+ import type { LlmConfig } from "./types.js";
2
+ export declare const uiInventoryConfig: LlmConfig;
@@ -0,0 +1,7 @@
1
+ export const uiInventoryConfig = {
2
+ name: "ui-inventory",
3
+ aliases: ["pouf-inventory"],
4
+ label: "Inventory block",
5
+ description: "Stock list with low-stock alerts, receiving and per-item details",
6
+ };
7
+ //# sourceMappingURL=ui-inventory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-inventory.js","sourceRoot":"","sources":["../../jsr/llms/ui-inventory.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,iBAAiB,GAAc;IAC1C,IAAI,EAAE,cAAc;IACpB,OAAO,EAAE,CAAC,gBAAgB,CAAC;IAC3B,KAAK,EAAE,iBAAiB;IACxB,WAAW,EAAE,kEAAkE;CAChF,CAAC"}
@@ -1,8 +1,8 @@
1
- # Pouf Inventory
1
+ # Inventory
2
2
 
3
3
  A stock list that says what is ready to sell and what needs reordering: a candle shop's shelves, a food pantry's cupboard, a makerspace's supplies, a café's dry goods. Reach for it whenever the app's core is items counted on hand, each with a level at which it should be restocked, and deliveries that bring the counts back up. Items and every delivery persist, so the stockroom reads the same on the next visit and for everyone keeping it.
4
4
 
5
- Built from @vibes.diy/pouf components; persisted state lives in Fireproof. Every write surface is gated on `useVibe(dbName).can`.
5
+ Built from @vibes.diy/ui components; persisted state lives in Fireproof. Every write surface is gated on `useVibe(dbName).can`.
6
6
 
7
7
  ## The block
8
8
 
@@ -31,8 +31,8 @@ import {
31
31
  Stat,
32
32
  Table,
33
33
  Text,
34
- } from "@vibes.diy/pouf";
35
- import { Dialog, Toaster, toast } from "@vibes.diy/pouf/interactive";
34
+ } from "@vibes.diy/ui";
35
+ import { Dialog, Toaster, toast } from "@vibes.diy/ui/interactive";
36
36
 
37
37
  const NUMBER = new Intl.NumberFormat();
38
38
  const MONEY = new Intl.NumberFormat(undefined, { style: "currency", currency: "USD" });
@@ -326,7 +326,7 @@ export default function App() {
326
326
  </Grid>
327
327
  )}
328
328
  </Stack>
329
- <div className="pouf-toasts">
329
+ <div className="ui-toasts">
330
330
  <Toaster />
331
331
  </div>
332
332
  </main>
@@ -0,0 +1,2 @@
1
+ import type { LlmConfig } from "./types.js";
2
+ export declare const uiKanbanConfig: LlmConfig;
@@ -0,0 +1,7 @@
1
+ export const uiKanbanConfig = {
2
+ name: "ui-kanban",
3
+ aliases: ["pouf-kanban"],
4
+ label: "Kanban block",
5
+ description: "Kanban board with columns and cards you drag between them",
6
+ };
7
+ //# sourceMappingURL=ui-kanban.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-kanban.js","sourceRoot":"","sources":["../../jsr/llms/ui-kanban.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,cAAc,GAAc;IACvC,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,CAAC,aAAa,CAAC;IACxB,KAAK,EAAE,cAAc;IACrB,WAAW,EAAE,2DAA2D;CACzE,CAAC"}
@@ -1,8 +1,8 @@
1
- # Pouf Kanban
1
+ # Kanban
2
2
 
3
3
  A board of cards in columns that move left to right as work gets done: a renovation's to do, doing and done, a sprint board, a hiring pipeline, a content calendar from idea to published. Reach for it whenever the app's core is items that pass through a fixed set of stages and the person wants to see every stage at once. Cards and the column each sits in persist, so the board looks the same on the next visit and for everyone who opens it.
4
4
 
5
- Built from @vibes.diy/pouf components; persisted state lives in Fireproof. Every write surface is gated on `useVibe(dbName).can`.
5
+ Built from @vibes.diy/ui components; persisted state lives in Fireproof. Every write surface is gated on `useVibe(dbName).can`.
6
6
 
7
7
  ## The block
8
8
 
@@ -13,8 +13,8 @@ One view with one job: the board. The `Heading` and a muted count open the page,
13
13
  import React, { useEffect, useState } from "react";
14
14
  import { useFireproof } from "use-fireproof";
15
15
  import { useViewer, useVibe } from "use-vibes";
16
- import { Badge, Button, Card, Empty, Field, Grid, Heading, Icon, IconButton, Input, Row, RowCard, Skeleton, Stack, Text } from "@vibes.diy/pouf";
17
- import { Confirm, DropdownMenu, Toaster, toast } from "@vibes.diy/pouf/interactive";
16
+ import { Badge, Button, Card, Empty, Field, Grid, Heading, Icon, IconButton, Input, Row, RowCard, Skeleton, Stack, Text } from "@vibes.diy/ui";
17
+ import { Confirm, DropdownMenu, Toaster, toast } from "@vibes.diy/ui/interactive";
18
18
 
19
19
  const COLUMNS = [
20
20
  { key: "todo", title: "To do", tone: "idle" },
@@ -217,7 +217,7 @@ export default function App() {
217
217
  })}
218
218
  </Grid>
219
219
  </Stack>
220
- <div className="pouf-toasts">
220
+ <div className="ui-toasts">
221
221
  <Toaster />
222
222
  </div>
223
223
  </main>
@@ -0,0 +1,2 @@
1
+ import type { LlmConfig } from "./types.js";
2
+ export declare const uiLandingConfig: LlmConfig;
@@ -0,0 +1,7 @@
1
+ export const uiLandingConfig = {
2
+ name: "ui-landing",
3
+ aliases: ["pouf-landing"],
4
+ label: "Landing block",
5
+ description: "Marketing landing page with hero, features, story and a waitlist sign-up",
6
+ };
7
+ //# sourceMappingURL=ui-landing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-landing.js","sourceRoot":"","sources":["../../jsr/llms/ui-landing.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,eAAe,GAAc;IACxC,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,CAAC,cAAc,CAAC;IACzB,KAAK,EAAE,eAAe;IACtB,WAAW,EAAE,0EAA0E;CACxF,CAAC"}
@@ -1,19 +1,19 @@
1
- # Pouf Landing
1
+ # Landing
2
2
 
3
3
  A one-page marketing site with a waitlist: the launch page for a pottery class, a neighbourhood tool library, a new podcast, a supper club, a side-project app before it opens. Reach for it when the app's job is to explain one thing well (a hero, what it does, a story from someone who tried it) and to let interested people put their name down. Each person on the waitlist is one small document, so the count on the page is real and nobody signs up twice.
4
4
 
5
- Built from @vibes.diy/pouf components; persisted state lives in Fireproof. Every write surface is gated on `useVibe(dbName).can`.
5
+ Built from @vibes.diy/ui components; persisted state lives in Fireproof. Every write surface is gated on `useVibe(dbName).can`.
6
6
 
7
7
  ## The block
8
8
 
9
- One page with one job: get the reader onto the waitlist. A `Navbar` carries the brand (a decorative `orange` `Blob` and the name), in-page links and a quiet `Join` that scrolls to the sign-up. The hero is a `Grid cols="sidebar"`: an `info` `Badge`, the `Heading level={1}` with one word in an `orange` `Highlight`, a muted pitch, the waitlist action and a muted count of who has joined; beside it a `Card` of `Metric`s says what the reader gets. The waitlist action is the page's one lead: `Join the waitlist`, with `loading` from the click until the live query shows the new sign-up, so the button can't reappear and fire twice in between. Once joined it turns into an `up` `Badge` and a quiet `Leave the list`. Three feature `Card`s (each fronted by a decorative `orange` `Blob`, tilted with `motion`) explain how it works, a `Card` holds one story from an early user, and a closing `CTA` on the quiet `surface` tone sends the reader back up to the sign-up with a quiet button, so the page never shows two leads. A `Footer` repeats the in-page links. Joining waits on its `can` verdict from `useVibe("waitlist")`, the database the sign-ups live in: a `Skeleton` inside an `aria-busy` wrapper while it resolves, a `Sign in to join the waitlist` lead wired to `useViewer().requestLogin()` for a visitor who has not signed in, and a neutral sentence in the app's own words when sign-ups are closed. `Leave the list` renders only where `can.delete` allows it. The list keeps who joined and when, never an email address.
9
+ One page with one job: get the reader onto the waitlist. A `Navbar` carries the brand (a decorative `orange` `IconTile` and the name), in-page links and a quiet `Join` that scrolls to the sign-up. The hero is a `Grid cols="sidebar"`: an `info` `Badge`, the `Heading level={1}` with one word in an `orange` `Highlight`, a muted pitch, the waitlist action and a muted count of who has joined; beside it a `Card` of `Metric`s says what the reader gets. The waitlist action is the page's one lead: `Join the waitlist`, with `loading` from the click until the live query shows the new sign-up, so the button can't reappear and fire twice in between. Once joined it turns into an `up` `Badge` and a quiet `Leave the list`. Three feature `Card`s (each fronted by a decorative `orange` `IconTile`, tilted with `motion`) explain how it works, a `Card` holds one story from an early user, and a closing `CTA` on the quiet `surface` tone sends the reader back up to the sign-up with a quiet button, so the page never shows two leads. A `Footer` repeats the in-page links. Joining waits on its `can` verdict from `useVibe("waitlist")`, the database the sign-ups live in: a `Skeleton` inside an `aria-busy` wrapper while it resolves, a `Sign in to join the waitlist` lead wired to `useViewer().requestLogin()` for a visitor who has not signed in, and a neutral sentence in the app's own words when sign-ups are closed. `Leave the list` renders only where `can.delete` allows it. The list keeps who joined and when, never an email address.
10
10
 
11
11
  ### `App.jsx`
12
12
  ```jsx
13
13
  import React, { useEffect, useState } from "react";
14
14
  import { useFireproof } from "use-fireproof";
15
15
  import { useViewer, useVibe } from "use-vibes";
16
- import { Badge, Blob, Button, Card, CTA, Eyebrow, Footer, Grid, Heading, Highlight, Metric, Navbar, Row, Skeleton, Stack, Text } from "@vibes.diy/pouf";
16
+ import { Badge, IconTile, Button, Card, CTA, Eyebrow, Footer, Grid, Heading, Highlight, Metric, Navbar, Row, Skeleton, Stack, Text } from "@vibes.diy/ui";
17
17
 
18
18
  const NAME = "The Tool Shed";
19
19
  const STEPS = [
@@ -28,7 +28,7 @@ const LINKS = [
28
28
 
29
29
  const brand = (
30
30
  <Row gap={2} wrap={false}>
31
- <Blob icon="home" tone="orange" size="sm" />
31
+ <IconTile icon="home" tone="orange" size="sm" />
32
32
  <Text>{NAME}</Text>
33
33
  </Row>
34
34
  );
@@ -165,7 +165,7 @@ export default function App() {
165
165
  {STEPS.map((s, i) => (
166
166
  <Card key={s.title} motion={i % 2 === 0 ? "tilt-left" : "tilt-right"}>
167
167
  <Stack gap={3}>
168
- <Blob icon={s.icon} tone="orange" />
168
+ <IconTile icon={s.icon} tone="orange" />
169
169
  <Heading level={3}>{s.title}</Heading>
170
170
  <Text size="sm" muted>
171
171
  {s.body}
@@ -0,0 +1,2 @@
1
+ import type { LlmConfig } from "./types.js";
2
+ export declare const uiLoginConfig: LlmConfig;
@@ -0,0 +1,7 @@
1
+ export const uiLoginConfig = {
2
+ name: "ui-login",
3
+ aliases: ["pouf-login"],
4
+ label: "Login block",
5
+ description: "App-local join form for display name and bio; not sign-in auth",
6
+ };
7
+ //# sourceMappingURL=ui-login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-login.js","sourceRoot":"","sources":["../../jsr/llms/ui-login.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,aAAa,GAAc;IACtC,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,CAAC,YAAY,CAAC;IACvB,KAAK,EAAE,aAAa;IACpB,WAAW,EAAE,gEAAgE;CAC9E,CAAC"}
@@ -1,20 +1,20 @@
1
- # Pouf Login
1
+ # Login
2
2
 
3
3
  The join step a member sees once they are signed in: a quilting circle's "tell us who you are", a writing group's member card, a team space's first-visit profile. Reach for it whenever the app wants its own profile for each person (the name they go by here, a short bio) before they take part. It is **not** a sign-in form: the platform owns sign-in, so this block never asks for an email, a password or a magic link. The visitor signs in through `useViewer().requestLogin()`, and only then fills in the profile the app keeps. Each profile persists, so a member joins once and finds their card on every visit and device.
4
4
 
5
- Built from @vibes.diy/pouf components; persisted state lives in Fireproof. Every write surface is gated on `useVibe(dbName).can`.
5
+ Built from @vibes.diy/ui components; persisted state lives in Fireproof. Every write surface is gated on `useVibe(dbName).can`.
6
6
 
7
7
  ## The block
8
8
 
9
- One centred `Card` with one job: get this person a profile. A `Blob` (`info`, user), the `Heading` and a muted line open it, and a muted count says how many members have joined. A visitor who has not signed in gets a `Sign in to join` button, the card's one lead, wired to `requestLogin()`; there is no email or password field anywhere, because sign-in is the platform's. A signed-in visitor gets the profile form: a display name `Input` and a short-bio `Textarea`, each in its own `Field` with its own error and `invalid` control, validated in plain state on submit; `Join the club` (or `Save profile` once they have one) is the lead and shows `loading` while the write lands. Each profile is one document with a deterministic `_id` per person (`profile:<handle>`), so saving twice updates the same card instead of adding a second. The write waits on its `can` verdict from `useVibe("members")`: `can.create` of the draft for a new profile, `can.edit` of the saved one after that; while the verdict resolves a `Skeleton` sits inside an `aria-busy` wrapper, and a sentence in the app's own words replaces the form when joining is closed to this visitor. A saved profile shows as a `Badge` toned `up` and a `toast`.
9
+ One centred `Card` with one job: get this person a profile. An `IconTile` (`info`, user), the `Heading` and a muted line open it, and a muted count says how many members have joined. A visitor who has not signed in gets a `Sign in to join` button, the card's one lead, wired to `requestLogin()`; there is no email or password field anywhere, because sign-in is the platform's. A signed-in visitor gets the profile form: a display name `Input` and a short-bio `Textarea`, each in its own `Field` with its own error and `invalid` control, validated in plain state on submit; `Join the club` (or `Save profile` once they have one) is the lead and shows `loading` while the write lands. Each profile is one document with a deterministic `_id` per person (`profile:<handle>`), so saving twice updates the same card instead of adding a second. The write waits on its `can` verdict from `useVibe("members")`: `can.create` of the draft for a new profile, `can.edit` of the saved one after that; while the verdict resolves a `Skeleton` sits inside an `aria-busy` wrapper, and a sentence in the app's own words replaces the form when joining is closed to this visitor. A saved profile shows as a `Badge` toned `up` and a `toast`.
10
10
 
11
11
  ### `App.jsx`
12
12
  ```jsx
13
13
  import React, { useState } from "react";
14
14
  import { useFireproof } from "use-fireproof";
15
15
  import { useViewer, useVibe } from "use-vibes";
16
- import { Badge, Blob, Button, Card, Field, Heading, Input, Row, Skeleton, Stack, Text, Textarea } from "@vibes.diy/pouf";
17
- import { Toaster, toast } from "@vibes.diy/pouf/interactive";
16
+ import { Badge, IconTile, Button, Card, Field, Heading, Input, Row, Skeleton, Stack, Text, Textarea } from "@vibes.diy/ui";
17
+ import { Toaster, toast } from "@vibes.diy/ui/interactive";
18
18
 
19
19
  const BIO_MAX = 160;
20
20
 
@@ -116,7 +116,7 @@ export default function App() {
116
116
  <Card>
117
117
  <Stack gap={5}>
118
118
  <Stack gap={3}>
119
- <Blob icon="user" tone="info" />
119
+ <IconTile icon="user" tone="info" />
120
120
  <Stack gap={1}>
121
121
  <Heading level={1}>{saved ? `Hi, ${saved.name}` : "Join the club"}</Heading>
122
122
  <Text muted>{saved ? "Update how other members see you." : "Pick the name you go by here and say hello."}</Text>
@@ -143,7 +143,7 @@ export default function App() {
143
143
  )}
144
144
  </Stack>
145
145
  </Card>
146
- <div className="pouf-toasts">
146
+ <div className="ui-toasts">
147
147
  <Toaster />
148
148
  </div>
149
149
  </main>
@@ -0,0 +1,2 @@
1
+ import type { LlmConfig } from "./types.js";
2
+ export declare const uiMusicConfig: LlmConfig;
@@ -0,0 +1,7 @@
1
+ export const uiMusicConfig = {
2
+ name: "ui-music",
3
+ aliases: ["pouf-music"],
4
+ label: "Music block",
5
+ description: "Music player UI with a queue, transport and saved likes",
6
+ };
7
+ //# sourceMappingURL=ui-music.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-music.js","sourceRoot":"","sources":["../../jsr/llms/ui-music.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,aAAa,GAAc;IACtC,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,CAAC,YAAY,CAAC;IACvB,KAAK,EAAE,aAAa;IACpB,WAAW,EAAE,yDAAyD;CACvE,CAAC"}