@vibes.diy/prompts 14.3.203 → 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.
- package/llms/access.md +4 -4
- package/llms/backend.md +1 -1
- package/llms/blockly.md +2 -2
- package/llms/bluesky.md +1 -1
- package/llms/board-games.md +3 -3
- package/llms/calendar.md +1 -1
- package/llms/callai.md +4 -4
- package/llms/connections.md +1 -1
- package/llms/create-vibe.md +3 -3
- package/llms/fireproof.md +7 -7
- package/llms/github.md +2 -2
- package/llms/image-gen.md +2 -2
- package/llms/index.d.ts +28 -28
- package/llms/index.js +84 -84
- package/llms/index.js.map +1 -1
- package/llms/maps.md +1 -1
- package/llms/match-style.md +1 -1
- package/llms/motion.md +7 -7
- package/llms/p5.md +1 -1
- package/llms/physics.md +2 -2
- package/llms/reskin.md +21 -21
- package/llms/richtext.md +5 -5
- package/llms/spotify.md +1 -1
- package/llms/stripe-subscriptions.md +1 -1
- package/llms/stripe.md +3 -3
- package/llms/strudel.md +3 -3
- package/llms/three-js.md +4 -4
- package/llms/touch-games.js +1 -1
- package/llms/touch-games.js.map +1 -1
- package/llms/touch-games.md +3 -3
- package/llms/ui-blog.d.ts +2 -0
- package/llms/ui-blog.js +7 -0
- package/llms/ui-blog.js.map +1 -0
- package/llms/{pouf-blog.md → ui-blog.md} +10 -10
- package/llms/ui-booking.d.ts +2 -0
- package/llms/ui-booking.js +7 -0
- package/llms/ui-booking.js.map +1 -0
- package/llms/{pouf-booking.md → ui-booking.md} +8 -8
- package/llms/ui-calendar.d.ts +2 -0
- package/llms/ui-calendar.js +7 -0
- package/llms/ui-calendar.js.map +1 -0
- package/llms/{pouf-calendar.md → ui-calendar.md} +5 -5
- package/llms/ui-chat.d.ts +2 -0
- package/llms/ui-chat.js +7 -0
- package/llms/ui-chat.js.map +1 -0
- package/llms/{pouf-chat.md → ui-chat.md} +4 -4
- package/llms/ui-contact.d.ts +2 -0
- package/llms/ui-contact.js +7 -0
- package/llms/ui-contact.js.map +1 -0
- package/llms/{pouf-contact.md → ui-contact.md} +7 -7
- package/llms/ui-course.d.ts +2 -0
- package/llms/ui-course.js +7 -0
- package/llms/ui-course.js.map +1 -0
- package/llms/{pouf-course.md → ui-course.md} +9 -9
- package/llms/ui-crm.d.ts +2 -0
- package/llms/ui-crm.js +7 -0
- package/llms/ui-crm.js.map +1 -0
- package/llms/{pouf-crm.md → ui-crm.md} +5 -5
- package/llms/ui-dashboard.d.ts +2 -0
- package/llms/ui-dashboard.js +7 -0
- package/llms/ui-dashboard.js.map +1 -0
- package/llms/{pouf-dashboard.md → ui-dashboard.md} +7 -7
- package/llms/ui-editorial.d.ts +2 -0
- package/llms/ui-editorial.js +7 -0
- package/llms/ui-editorial.js.map +1 -0
- package/llms/{pouf-editorial.md → ui-editorial.md} +5 -5
- package/llms/ui-event.d.ts +2 -0
- package/llms/ui-event.js +7 -0
- package/llms/ui-event.js.map +1 -0
- package/llms/{pouf-event.md → ui-event.md} +5 -5
- package/llms/ui-feed.d.ts +2 -0
- package/llms/ui-feed.js +7 -0
- package/llms/ui-feed.js.map +1 -0
- package/llms/{pouf-feed.md → ui-feed.md} +5 -5
- package/llms/ui-game.d.ts +2 -0
- package/llms/ui-game.js +7 -0
- package/llms/ui-game.js.map +1 -0
- package/llms/{pouf-game.md → ui-game.md} +6 -6
- package/llms/ui-inbox.d.ts +2 -0
- package/llms/ui-inbox.js +7 -0
- package/llms/ui-inbox.js.map +1 -0
- package/llms/{pouf-inbox.md → ui-inbox.md} +5 -5
- package/llms/ui-inventory.d.ts +2 -0
- package/llms/ui-inventory.js +7 -0
- package/llms/ui-inventory.js.map +1 -0
- package/llms/{pouf-inventory.md → ui-inventory.md} +5 -5
- package/llms/ui-kanban.d.ts +2 -0
- package/llms/ui-kanban.js +7 -0
- package/llms/ui-kanban.js.map +1 -0
- package/llms/{pouf-kanban.md → ui-kanban.md} +5 -5
- package/llms/ui-landing.d.ts +2 -0
- package/llms/ui-landing.js +7 -0
- package/llms/ui-landing.js.map +1 -0
- package/llms/{pouf-landing.md → ui-landing.md} +6 -6
- package/llms/ui-login.d.ts +2 -0
- package/llms/ui-login.js +7 -0
- package/llms/ui-login.js.map +1 -0
- package/llms/{pouf-login.md → ui-login.md} +7 -7
- package/llms/ui-music.d.ts +2 -0
- package/llms/ui-music.js +7 -0
- package/llms/ui-music.js.map +1 -0
- package/llms/{pouf-music.md → ui-music.md} +6 -6
- package/llms/ui-onboarding.d.ts +2 -0
- package/llms/ui-onboarding.js +7 -0
- package/llms/ui-onboarding.js.map +1 -0
- package/llms/{pouf-onboarding.md → ui-onboarding.md} +5 -5
- package/llms/ui-pricing.d.ts +2 -0
- package/llms/ui-pricing.js +7 -0
- package/llms/ui-pricing.js.map +1 -0
- package/llms/{pouf-pricing.md → ui-pricing.md} +5 -5
- package/llms/ui-profile.d.ts +2 -0
- package/llms/ui-profile.js +7 -0
- package/llms/ui-profile.js.map +1 -0
- package/llms/{pouf-profile.md → ui-profile.md} +4 -4
- package/llms/ui-quiz.d.ts +2 -0
- package/llms/ui-quiz.js +7 -0
- package/llms/ui-quiz.js.map +1 -0
- package/llms/{pouf-quiz.md → ui-quiz.md} +6 -6
- package/llms/ui-settings.d.ts +2 -0
- package/llms/ui-settings.js +7 -0
- package/llms/ui-settings.js.map +1 -0
- package/llms/{pouf-settings.md → ui-settings.md} +5 -5
- package/llms/ui-storefront.d.ts +2 -0
- package/llms/ui-storefront.js +7 -0
- package/llms/ui-storefront.js.map +1 -0
- package/llms/{pouf-storefront.md → ui-storefront.md} +9 -9
- package/llms/ui-support.d.ts +2 -0
- package/llms/ui-support.js +7 -0
- package/llms/ui-support.js.map +1 -0
- package/llms/{pouf-support.md → ui-support.md} +5 -5
- package/llms/ui-testimonials.d.ts +2 -0
- package/llms/ui-testimonials.js +7 -0
- package/llms/ui-testimonials.js.map +1 -0
- package/llms/{pouf-testimonials.md → ui-testimonials.md} +6 -6
- package/llms/ui-todo.d.ts +2 -0
- package/llms/ui-todo.js +7 -0
- package/llms/ui-todo.js.map +1 -0
- package/llms/{pouf-todo.md → ui-todo.md} +5 -5
- package/llms/ui-weather.d.ts +2 -0
- package/llms/ui-weather.js +7 -0
- package/llms/ui-weather.js.map +1 -0
- package/llms/{pouf-weather.md → ui-weather.md} +5 -5
- package/llms/use-vibe.md +4 -4
- package/llms/use-viewer.md +5 -5
- package/llms/voxel.md +1 -1
- package/llms/web-audio.md +12 -12
- package/llms/worlds.md +3 -3
- package/llms/youtube.md +1 -1
- package/package.json +5 -5
- package/system-prompt-initial-instant.md +3 -3
- package/system-prompt.md +3 -3
- package/themes/colorsets.js +7 -7
- package/themes/colorsets.js.map +1 -1
- package/themes/looks/pouf/brief.md +87 -87
- package/themes/looks/pouf/catalog.generated.d.ts +1 -1
- package/themes/looks/pouf/catalog.generated.js +17 -17
- package/themes/looks/pouf/catalog.generated.js.map +1 -1
- package/themes/looks/pouf/variety.js +4 -4
- package/themes/looks/pouf/variety.js.map +1 -1
- package/llms/pouf-blog.d.ts +0 -2
- package/llms/pouf-blog.js +0 -6
- package/llms/pouf-blog.js.map +0 -1
- package/llms/pouf-booking.d.ts +0 -2
- package/llms/pouf-booking.js +0 -6
- package/llms/pouf-booking.js.map +0 -1
- package/llms/pouf-calendar.d.ts +0 -2
- package/llms/pouf-calendar.js +0 -6
- package/llms/pouf-calendar.js.map +0 -1
- package/llms/pouf-chat.d.ts +0 -2
- package/llms/pouf-chat.js +0 -6
- package/llms/pouf-chat.js.map +0 -1
- package/llms/pouf-contact.d.ts +0 -2
- package/llms/pouf-contact.js +0 -6
- package/llms/pouf-contact.js.map +0 -1
- package/llms/pouf-course.d.ts +0 -2
- package/llms/pouf-course.js +0 -6
- package/llms/pouf-course.js.map +0 -1
- package/llms/pouf-crm.d.ts +0 -2
- package/llms/pouf-crm.js +0 -6
- package/llms/pouf-crm.js.map +0 -1
- package/llms/pouf-dashboard.d.ts +0 -2
- package/llms/pouf-dashboard.js +0 -6
- package/llms/pouf-dashboard.js.map +0 -1
- package/llms/pouf-editorial.d.ts +0 -2
- package/llms/pouf-editorial.js +0 -6
- package/llms/pouf-editorial.js.map +0 -1
- package/llms/pouf-event.d.ts +0 -2
- package/llms/pouf-event.js +0 -6
- package/llms/pouf-event.js.map +0 -1
- package/llms/pouf-feed.d.ts +0 -2
- package/llms/pouf-feed.js +0 -6
- package/llms/pouf-feed.js.map +0 -1
- package/llms/pouf-game.d.ts +0 -2
- package/llms/pouf-game.js +0 -6
- package/llms/pouf-game.js.map +0 -1
- package/llms/pouf-inbox.d.ts +0 -2
- package/llms/pouf-inbox.js +0 -6
- package/llms/pouf-inbox.js.map +0 -1
- package/llms/pouf-inventory.d.ts +0 -2
- package/llms/pouf-inventory.js +0 -6
- package/llms/pouf-inventory.js.map +0 -1
- package/llms/pouf-kanban.d.ts +0 -2
- package/llms/pouf-kanban.js +0 -6
- package/llms/pouf-kanban.js.map +0 -1
- package/llms/pouf-landing.d.ts +0 -2
- package/llms/pouf-landing.js +0 -6
- package/llms/pouf-landing.js.map +0 -1
- package/llms/pouf-login.d.ts +0 -2
- package/llms/pouf-login.js +0 -6
- package/llms/pouf-login.js.map +0 -1
- package/llms/pouf-music.d.ts +0 -2
- package/llms/pouf-music.js +0 -6
- package/llms/pouf-music.js.map +0 -1
- package/llms/pouf-onboarding.d.ts +0 -2
- package/llms/pouf-onboarding.js +0 -6
- package/llms/pouf-onboarding.js.map +0 -1
- package/llms/pouf-pricing.d.ts +0 -2
- package/llms/pouf-pricing.js +0 -6
- package/llms/pouf-pricing.js.map +0 -1
- package/llms/pouf-profile.d.ts +0 -2
- package/llms/pouf-profile.js +0 -6
- package/llms/pouf-profile.js.map +0 -1
- package/llms/pouf-quiz.d.ts +0 -2
- package/llms/pouf-quiz.js +0 -6
- package/llms/pouf-quiz.js.map +0 -1
- package/llms/pouf-settings.d.ts +0 -2
- package/llms/pouf-settings.js +0 -6
- package/llms/pouf-settings.js.map +0 -1
- package/llms/pouf-storefront.d.ts +0 -2
- package/llms/pouf-storefront.js +0 -6
- package/llms/pouf-storefront.js.map +0 -1
- package/llms/pouf-support.d.ts +0 -2
- package/llms/pouf-support.js +0 -6
- package/llms/pouf-support.js.map +0 -1
- package/llms/pouf-testimonials.d.ts +0 -2
- package/llms/pouf-testimonials.js +0 -6
- package/llms/pouf-testimonials.js.map +0 -1
- package/llms/pouf-todo.d.ts +0 -2
- package/llms/pouf-todo.js +0 -6
- package/llms/pouf-todo.js.map +0 -1
- package/llms/pouf-weather.d.ts +0 -2
- package/llms/pouf-weather.js +0 -6
- package/llms/pouf-weather.js.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Chat
|
|
2
2
|
|
|
3
3
|
A group conversation split into rooms: a crew's chat with a room per trip, a band's thread per song, a household's rooms for groceries and plans, a class's channel per project. Reach for it whenever the app's core is people sending each other short messages that read top to bottom as they arrive. Rooms and messages persist and arrive live, so everyone in the app sees a new message as soon as it is sent, on every device.
|
|
4
4
|
|
|
5
|
-
Built from @vibes.diy/
|
|
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 room list opens with the `Heading` and a muted coun
|
|
|
13
13
|
import React, { useEffect, useRef, 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, RowCard, Skeleton, Stack, Text } from "@vibes.diy/
|
|
17
|
-
import { ScrollArea } from "@vibes.diy/
|
|
16
|
+
import { Button, Card, Empty, Field, Heading, Icon, IconButton, Input, Row, RowCard, Skeleton, Stack, Text } from "@vibes.diy/ui";
|
|
17
|
+
import { ScrollArea } from "@vibes.diy/ui/interactive";
|
|
18
18
|
|
|
19
19
|
const when = (ms) => new Date(ms).toLocaleTimeString([], { hour: "numeric", minute: "2-digit" });
|
|
20
20
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-contact.js","sourceRoot":"","sources":["../../jsr/llms/ui-contact.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,eAAe,GAAc;IACxC,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,CAAC,cAAc,CAAC;IACzB,KAAK,EAAE,eAAe;IACtB,WAAW,EAAE,mEAAmE;CACjF,CAAC"}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Contact
|
|
2
2
|
|
|
3
3
|
A get-in-touch section where someone leaves their name, email, a topic and a message for the people behind the app: a photography studio's enquiry form, a community garden's question box, a band's booking request. Reach for it whenever the app's job is to collect a note and say clearly that it arrived. Every message persists as its own document, so the team can read and answer them later (the inbox block is the reading side).
|
|
4
4
|
|
|
5
|
-
Built from @vibes.diy/
|
|
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: send a note. A `Grid cols="sidebar"` puts the pitch beside the form: an `info` `Badge` with the reply time, an `Eyebrow`, the `Heading` and a muted line, then two tight `Card`s that tilt, each fronted by a small `
|
|
9
|
+
One view with one job: send a note. A `Grid cols="sidebar"` puts the pitch beside the form: an `info` `Badge` with the reply time, an `Eyebrow`, the `Heading` and a muted line, then two tight `Card`s that tilt, each fronted by a small `IconTile` (`info` mail, `idle` clock). The form sits on its own `Card`: name and email `Input`s, a topic `Select` and a message `Textarea`, each in a `Field`. It is checked in plain state on submit, with each error on its own `Field`, its control `invalid` and focus moved to the first one. `Send message` is the view's one lead and shows `loading` while the write lands. Each message is one document, stamped with the sender's handle when they are signed in. The form waits on its `can` verdict from `useVibe("contact")`: a `Skeleton` inside an `aria-busy` wrapper while it resolves, a `Sign in to send a message` lead wired to `requestLogin()` when sending is closed to a signed-out visitor, and a sentence in the app's own words when it is closed to someone already signed in. Where `access.js` lets a signed-out visitor write, they can still send; their note is kept on this device until they sign in. So their confirmation says that honestly (`Your note is waiting`), and its lead is `Sign in to send it`, wired to `useViewer().requestLogin()`. A signed-in sender sees `Message sent` in an `Empty`, with a quiet `Send another message`.
|
|
10
10
|
|
|
11
11
|
### `App.jsx`
|
|
12
12
|
```jsx
|
|
13
13
|
import React, { useRef, useState } from "react";
|
|
14
14
|
import { useFireproof } from "use-fireproof";
|
|
15
15
|
import { useViewer, useVibe } from "use-vibes";
|
|
16
|
-
import { Badge,
|
|
17
|
-
import { Select } from "@vibes.diy/
|
|
16
|
+
import { Badge, IconTile, Button, Card, Empty, Eyebrow, Field, Grid, Heading, Input, Row, Skeleton, Stack, Text, Textarea } from "@vibes.diy/ui";
|
|
17
|
+
import { Select } from "@vibes.diy/ui/interactive";
|
|
18
18
|
|
|
19
19
|
const TOPICS = [
|
|
20
20
|
{ value: "booking", label: "Book a shoot" },
|
|
@@ -194,7 +194,7 @@ export default function App() {
|
|
|
194
194
|
</Stack>
|
|
195
195
|
<Card variant="tight" motion="tilt-left">
|
|
196
196
|
<Row gap={3} wrap={false} align="top">
|
|
197
|
-
<
|
|
197
|
+
<IconTile icon="mail" tone="info" size="sm" />
|
|
198
198
|
<Stack gap={1}>
|
|
199
199
|
<Text>Prefer email?</Text>
|
|
200
200
|
<Text size="sm" muted>
|
|
@@ -205,7 +205,7 @@ export default function App() {
|
|
|
205
205
|
</Card>
|
|
206
206
|
<Card variant="tight" motion="tilt-right">
|
|
207
207
|
<Row gap={3} wrap={false} align="top">
|
|
208
|
-
<
|
|
208
|
+
<IconTile icon="clock" tone="idle" size="sm" />
|
|
209
209
|
<Stack gap={1}>
|
|
210
210
|
<Text>Read by a person</Text>
|
|
211
211
|
<Text size="sm" muted>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-course.js","sourceRoot":"","sources":["../../jsr/llms/ui-course.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,4DAA4D;CAC1E,CAAC"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Course
|
|
2
2
|
|
|
3
3
|
A course outline someone works through lesson by lesson: a beginner pottery class, new staff training at a café, a study plan for an exam, a coding bootcamp's first week. Reach for it whenever the app's core is an ordered set of lessons, each with a rough length, that a person marks complete while a bar shows how far along they are. The lessons and each person's completions persist, so progress is waiting on the next visit and on every device, and every learner keeps their own.
|
|
4
4
|
|
|
5
|
-
Built from @vibes.diy/
|
|
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
|
-
Two views, one job each. The outline opens with the `Heading` and a muted count beside a quiet `Add lesson` button that opens a `Dialog` with the lesson form. A `Card` holds the person's progress: a `Progress` bar toned `up`, the percent and minutes left in `Text`,
|
|
9
|
+
Two views, one job each. The outline opens with the `Heading` and a muted count beside a quiet `Add lesson` button that opens a `Dialog` with the lesson form. A `Card` holds the person's progress: a `Progress` bar toned `up`, the percent and minutes left in `Text`, an `IconTile` (`info` target while lessons remain, `up` trophy once they are all done) and a `Continue` button, the outline's one lead, that opens the next unfinished lesson. Each lesson is a clickable `RowCard` with a small `IconTile`, a muted line for its kind and length, its title and a `Badge` (`up` done, `idle` to do); an `Empty` stands in before the first lesson. Opening a lesson swaps in the lesson view: a quiet `IconButton` to go back, the kind as an `info` `Badge`, the title as the `Heading`, `Metric`s for the time and the lesson's place in the course, and `Mark complete` as that view's lead (or, once done, a quiet `Mark not done` beside a `Next lesson` lead). A completion is its own document with a deterministic `_id` per lesson and person, so each learner's progress is theirs and marking twice lands on one document. Every write waits on its `can` verdict from `useVibe("course")`: the lesson form and the completion buttons show a `Skeleton` inside an `aria-busy` wrapper while the verdict resolves and a sentence in the app's own words when that write is closed to this visitor. Progress belongs to a person, so a visitor who has not signed in sees a `Sign in to track progress` button wired to `useViewer().requestLogin()` instead of the completion buttons.
|
|
10
10
|
|
|
11
11
|
### `App.jsx`
|
|
12
12
|
```jsx
|
|
@@ -15,7 +15,7 @@ import { useFireproof } from "use-fireproof";
|
|
|
15
15
|
import { useViewer, useVibe } from "use-vibes";
|
|
16
16
|
import {
|
|
17
17
|
Badge,
|
|
18
|
-
|
|
18
|
+
IconTile,
|
|
19
19
|
Button,
|
|
20
20
|
Card,
|
|
21
21
|
Empty,
|
|
@@ -32,8 +32,8 @@ import {
|
|
|
32
32
|
Spacer,
|
|
33
33
|
Stack,
|
|
34
34
|
Text,
|
|
35
|
-
} from "@vibes.diy/
|
|
36
|
-
import { Dialog, Progress, Select, Toaster, toast } from "@vibes.diy/
|
|
35
|
+
} from "@vibes.diy/ui";
|
|
36
|
+
import { Dialog, Progress, Select, Toaster, toast } from "@vibes.diy/ui/interactive";
|
|
37
37
|
|
|
38
38
|
const KINDS = [
|
|
39
39
|
{ value: "Lesson", label: "Lesson" },
|
|
@@ -247,7 +247,7 @@ export default function App() {
|
|
|
247
247
|
</Row>
|
|
248
248
|
)}
|
|
249
249
|
</Stack>
|
|
250
|
-
<
|
|
250
|
+
<IconTile icon={finished ? "trophy" : "target"} tone={finished ? "up" : "info"} size="md" />
|
|
251
251
|
</Row>
|
|
252
252
|
</Card>
|
|
253
253
|
)}
|
|
@@ -263,7 +263,7 @@ export default function App() {
|
|
|
263
263
|
return (
|
|
264
264
|
<RowCard key={lesson._id} onClick={() => setOpenId(lesson._id)}>
|
|
265
265
|
<Row gap={3} wrap={false}>
|
|
266
|
-
<
|
|
266
|
+
<IconTile icon={done ? "ok" : lesson.kind === "Quiz" ? "wand" : "play"} tone={done ? "up" : "idle"} size="sm" />
|
|
267
267
|
<Stack gap={1}>
|
|
268
268
|
<Text size="sm" muted>
|
|
269
269
|
{lesson.kind} · {MINUTES.format(lesson.minutes)}
|
|
@@ -280,7 +280,7 @@ export default function App() {
|
|
|
280
280
|
)}
|
|
281
281
|
</Stack>
|
|
282
282
|
)}
|
|
283
|
-
<div className="
|
|
283
|
+
<div className="ui-toasts">
|
|
284
284
|
<Toaster />
|
|
285
285
|
</div>
|
|
286
286
|
</main>
|
package/llms/ui-crm.d.ts
ADDED
package/llms/ui-crm.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-crm.js","sourceRoot":"","sources":["../../jsr/llms/ui-crm.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,WAAW,GAAc;IACpC,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,CAAC,UAAU,CAAC;IACrB,KAAK,EAAE,WAAW;IAClB,WAAW,EAAE,kEAAkE;CAChF,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
#
|
|
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/
|
|
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/
|
|
37
|
-
import { Dialog, Select, Toaster, toast } from "@vibes.diy/
|
|
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="
|
|
315
|
+
<div className="ui-toasts">
|
|
316
316
|
<Toaster />
|
|
317
317
|
</div>
|
|
318
318
|
</main>
|
|
@@ -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
|
-
#
|
|
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/
|
|
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/
|
|
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/
|
|
34
|
-
import { Select, Toaster, toast } from "@vibes.diy/
|
|
35
|
-
import { AreaChart } from "@vibes.diy/
|
|
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="
|
|
258
|
+
<div className="ui-toasts">
|
|
259
259
|
<Toaster />
|
|
260
260
|
</div>
|
|
261
261
|
</main>
|
|
@@ -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
|
-
#
|
|
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/
|
|
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/
|
|
36
|
-
import { Dialog, Toaster, toast } from "@vibes.diy/
|
|
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="
|
|
231
|
+
<div className="ui-toasts">
|
|
232
232
|
<Toaster />
|
|
233
233
|
</div>
|
|
234
234
|
</main>
|
package/llms/ui-event.js
ADDED
|
@@ -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
|
-
#
|
|
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/
|
|
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/
|
|
35
|
-
import { Dialog, Select, Toaster, toast } from "@vibes.diy/
|
|
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="
|
|
221
|
+
<div className="ui-toasts">
|
|
222
222
|
<Toaster />
|
|
223
223
|
</div>
|
|
224
224
|
</main>
|
package/llms/ui-feed.js
ADDED
|
@@ -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
|
-
#
|
|
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/
|
|
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/
|
|
17
|
-
import { Confirm, Toaster, toast } from "@vibes.diy/
|
|
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="
|
|
234
|
+
<div className="ui-toasts">
|
|
235
235
|
<Toaster />
|
|
236
236
|
</div>
|
|
237
237
|
</main>
|
package/llms/ui-game.js
ADDED
|
@@ -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
|
-
#
|
|
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/
|
|
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` `
|
|
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,
|
|
17
|
-
import { Progress } from "@vibes.diy/
|
|
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
|
-
<
|
|
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>
|
package/llms/ui-inbox.js
ADDED
|
@@ -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
|
-
#
|
|
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/
|
|
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/
|
|
17
|
-
import { Confirm, Dialog, Toaster, toast } from "@vibes.diy/
|
|
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="
|
|
316
|
+
<div className="ui-toasts">
|
|
317
317
|
<Toaster />
|
|
318
318
|
</div>
|
|
319
319
|
</main>
|
|
@@ -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
|
-
#
|
|
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/
|
|
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/
|
|
35
|
-
import { Dialog, Toaster, toast } from "@vibes.diy/
|
|
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="
|
|
329
|
+
<div className="ui-toasts">
|
|
330
330
|
<Toaster />
|
|
331
331
|
</div>
|
|
332
332
|
</main>
|
|
@@ -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"}
|