@usevyre/ai-context 1.2.1 → 1.3.0

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.
@@ -4,7 +4,7 @@ alwaysApply: true
4
4
  ---
5
5
 
6
6
  # useVyre Design System — Cursor Rules
7
- # Version: 1.2.0
7
+ # Version: 1.6.0
8
8
 
9
9
  You are working in a project using the useVyre design system (@usevyre/react).
10
10
  Follow these rules strictly when generating any UI code.
@@ -36,6 +36,18 @@ Never do:
36
36
  - ❌ variant="error" → ✅ Use variant="danger"
37
37
  - ❌ variant="primary" → ✅ Use variant="info" | "success" | "warning" | "danger"
38
38
 
39
+ ## AlertDialog
40
+ Blocking confirmation modal (focus-trapped). Controlled via open + onOpenChange (React) / v-model (Vue). Use for destructive or irreversible actions that need explicit confirm/cancel. For non-blocking inline feedback use Alert; for general dialogs use Modal.
41
+ Import: `import { AlertDialog } from "@usevyre/react"`
42
+
43
+ Valid props:
44
+ - variant: "danger" | "warning" | "info" [default: info]
45
+
46
+ Never do:
47
+ - ❌ AlertDialog without open/onOpenChange (React) or v-model (Vue) → ✅ Drive open from state; close in onOpenChange / via v-model
48
+ - ❌ Using Alert (inline banner) for a confirm/cancel decision → ✅ Use AlertDialog for blocking confirmation; Alert for passive messages
49
+ - ❌ variant="success" or "error" → ✅ Use "danger" for destructive, "warning" to caution, "info" otherwise
50
+
39
51
  ## Avatar
40
52
  User profile image with fallback initials or icon.
41
53
  Import: `import { Avatar } from "@usevyre/react"`
@@ -81,6 +93,7 @@ Never do:
81
93
  - ❌ color="..." → ✅ Use variant prop instead
82
94
  - ❌ icon={...} → ✅ Use leftIcon={...} or rightIcon={...}
83
95
  - ❌ size="icon" without aria-label → ✅ Add aria-label describing the action
96
+ - ❌ padding / margin / marginTop (any spacing prop) on a useVyre component → ✅ Space BETWEEN components with <Stack gap> / <Grid gap>; space AROUND a block with <Box padding/margin> wrapping it
84
97
 
85
98
  ## Calendar
86
99
  Inline date-grid widget (always visible, no input). mode: single | range | multiple, optional time picker. For an input + popover use DatePicker; for start/end ranges with presets use DateRangePicker.
@@ -113,6 +126,7 @@ Valid props:
113
126
 
114
127
  Never do:
115
128
  - ❌ variant="primary" → ✅ Use variant="elevated" | "outlined" | "ghost" | "accent"
129
+ - ❌ padding / margin / marginTop (any spacing prop) on a useVyre component → ✅ Space BETWEEN components with <Stack gap> / <Grid gap>; space AROUND a block with <Box padding/margin> wrapping it
116
130
 
117
131
  ## Checkbox
118
132
  Binary toggle for boolean form values.
@@ -186,6 +200,7 @@ Never do:
186
200
  - ❌ size="icon" → ✅ Use size="sm" | "md" | "lg"
187
201
  - ❌ type="search" for search UI → ✅ Import Command from @usevyre/react for search palettes
188
202
  - ❌ Vue: binding Input/Textarea value without v-model → ✅ Use v-model on <Input>/<Textarea> in Vue; in React use value + onChange
203
+ - ❌ padding / margin / marginTop (any spacing prop) on a useVyre component → ✅ Space BETWEEN components with <Stack gap> / <Grid gap>; space AROUND a block with <Box padding/margin> wrapping it
189
204
 
190
205
  ## Label
191
206
  Accessible form label. Associate with input via htmlFor.
@@ -433,6 +448,86 @@ Never do:
433
448
  - ❌ composer without onSend (React) / @send (Vue) → ✅ Provide onSend / @send to append the message to value
434
449
  - ❌ Treating onSend as (text) only when using allowAttachments → ✅ Handle onSend(text, files) — map files to message attachments and append
435
450
 
451
+ ## Stack
452
+ Full one-dimensional flex layout primitive. USE INSTEAD OF <div style={{display:'flex'}}>. Covers the whole CSS flexbox surface (direction incl. reverse, wrap, align/justify/alignContent/alignSelf, grow/shrink/basis, per-axis gap) with token-locked spacing. Renders a plain <div> (or `as`).
453
+ Import: `import { Stack } from "@usevyre/react"`
454
+
455
+ Valid props:
456
+ - direction: "row" | "column" | "row-reverse" | "column-reverse" [default: row]
457
+ - gap: "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl" [default: md]
458
+ - rowGap: "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
459
+ - columnGap: "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
460
+ - align: "start" | "center" | "end" | "stretch" | "baseline" [default: stretch]
461
+ - justify: "start" | "center" | "end" | "between" | "around" | "evenly" [default: start]
462
+ - alignContent: "start" | "center" | "end" | "stretch" | "between" | "around" | "evenly"
463
+ - alignSelf: "auto" | "start" | "center" | "end" | "stretch" | "baseline"
464
+ - wrap: "nowrap" | "wrap" | "wrap-reverse" [default: nowrap]
465
+ - basis: "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "auto" | "content" | "0"
466
+ - width: "auto" | "full" | "fit" | "screen" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
467
+ - height: "auto" | "full" | "fit" | "screen" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
468
+
469
+ Never do:
470
+ - ❌ <div style={{ display: 'flex', gap: 12 }}> → ✅ Use <Stack gap="md"> — gap is a token
471
+ - ❌ gap={12} or gap="12px" → ✅ Use gap="none|xs|sm|md|lg|xl|2xl"
472
+ - ❌ direction="vertical" / "horizontal" → ✅ Use direction="row" or "column" (also row-reverse / column-reverse)
473
+ - ❌ style={{ width: "100%" }} / style={{ height: 320 }} → ✅ Use the width / height prop: width="full", width="md", height="screen", etc.
474
+
475
+ ## Grid
476
+ Two-dimensional CSS grid primitive. Explicit column/row counts (or auto-fit), auto-flow control, token gap. Pair with GridItem for cell spanning/placement. Renders a plain <div> (or `as`).
477
+ Import: `import { Grid, GridItem } from "@usevyre/react"`
478
+
479
+ Valid props:
480
+ - flow: "row" | "column" | "dense" | "row-dense" | "column-dense"
481
+ - gap: "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl" [default: md]
482
+ - rowGap: "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
483
+ - columnGap: "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
484
+ - align: "start" | "center" | "end" | "stretch" [default: stretch]
485
+ - justify: "start" | "center" | "end" | "stretch"
486
+ - width: "auto" | "full" | "fit" | "screen" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
487
+ - height: "auto" | "full" | "fit" | "screen" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
488
+
489
+ Never do:
490
+ - ❌ <div style={{ display:'grid', gridTemplateColumns:'1fr 1fr 1fr' }}> → ✅ Use <Grid columns={3} gap="md">
491
+ - ❌ columns="3" (string) → ✅ Use columns={3} or columns="auto-fit"
492
+ - ❌ Nested div with inline grid-column for spanning → ✅ Wrap the cell in <GridItem colSpan={2}>
493
+ - ❌ style={{ width: "100%" }} / style={{ height: 320 }} → ✅ Use the width / height prop: width="full", width="md", height="screen", etc.
494
+
495
+ ## GridItem
496
+ Child placement inside <Grid>. Sets column/row span and start lines. Renders a plain <div> (or `as`).
497
+ Import: `import { GridItem } from "@usevyre/react"`
498
+
499
+ Valid props:
500
+
501
+ Never do:
502
+ - ❌ GridItem outside a Grid → ✅ Place <GridItem> directly inside <Grid>
503
+
504
+ ## Box
505
+ Spacing-only container plus a controlled escape hatch. Token padding/margin with shorthand, per-axis (X/Y) and per-side (Top/Right/Bottom/Left) overrides. The `style` prop is an explicit anti-pattern escape hatch. Renders a plain <div> (or `as`).
506
+ Import: `import { Box } from "@usevyre/react"`
507
+
508
+ Valid props:
509
+ - padding: "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
510
+ - paddingX: "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
511
+ - paddingY: "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
512
+ - paddingTop: "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
513
+ - paddingRight: "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
514
+ - paddingBottom: "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
515
+ - paddingLeft: "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
516
+ - margin: "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
517
+ - marginX: "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
518
+ - marginY: "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
519
+ - marginTop: "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
520
+ - marginRight: "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
521
+ - marginBottom: "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
522
+ - marginLeft: "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
523
+ - width: "auto" | "full" | "fit" | "screen" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
524
+ - height: "auto" | "full" | "fit" | "screen" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
525
+
526
+ Never do:
527
+ - ❌ <Box style={{ padding: 16 }}> → ✅ Use <Box padding="md"> (or paddingX/paddingTop/...)
528
+ - ❌ Using Box for flex/grid layout → ✅ Use <Stack> or <Grid>
529
+ - ❌ style={{ width: "100%" }} / style={{ height: 320 }} → ✅ Use the width / height prop: width="full", width="md", height="screen", etc.
530
+
436
531
  ## DateRangePicker
437
532
  Start/end date range picker. Built on Calendar (mode=range) with a friendlier { from, to } object API, a two-month side-by-side view, and preset shortcuts. Use this for report/filter date ranges; use DatePicker for a single date.
438
533
  Import: `import { DateRangePicker } from "@usevyre/react"`
@@ -197,6 +197,45 @@ import { Alert } from "@usevyre/react"
197
197
 
198
198
  ---
199
199
 
200
+ ### AlertDialog
201
+
202
+ Blocking confirmation modal (focus-trapped). Controlled via open + onOpenChange (React) / v-model (Vue). Use for destructive or irreversible actions that need explicit confirm/cancel. For non-blocking inline feedback use Alert; for general dialogs use Modal.
203
+
204
+ ```tsx
205
+ import { AlertDialog } from "@usevyre/react"
206
+
207
+ // Props:
208
+ // open = boolean
209
+ // onOpenChange = function
210
+ // title = string
211
+ // description = string
212
+ // variant = "danger" | "warning" | "info" (default: info)
213
+ // confirmLabel = string (default: Confirm)
214
+ // cancelLabel = string (default: Cancel)
215
+ // onConfirm = function
216
+ // onCancel = function
217
+
218
+ // Examples:
219
+ const [open, setOpen] = useState(false);
220
+ <Button variant="danger" onClick={() => setOpen(true)}>Delete</Button>
221
+ <AlertDialog
222
+ open={open}
223
+ onOpenChange={setOpen}
224
+ variant="danger"
225
+ title="Delete project?"
226
+ description="This cannot be undone."
227
+ confirmLabel="Delete"
228
+ onConfirm={() => deleteProject()}
229
+ />
230
+ ```
231
+
232
+ **Common mistakes:**
233
+ - ❌ `AlertDialog without open/onOpenChange (React) or v-model (Vue)` → Drive open from state; close in onOpenChange / via v-model
234
+ - ❌ `Using Alert (inline banner) for a confirm/cancel decision` → Use AlertDialog for blocking confirmation; Alert for passive messages
235
+ - ❌ `variant="success" or "error"` → Use "danger" for destructive, "warning" to caution, "info" otherwise
236
+
237
+ ---
238
+
200
239
  ### Avatar
201
240
 
202
241
  User profile image with fallback initials or icon.
@@ -300,6 +339,7 @@ import { Button } from "@usevyre/react"
300
339
  - ❌ `color="..."` → Use variant prop instead
301
340
  - ❌ `icon={...}` → Use leftIcon={...} or rightIcon={...}
302
341
  - ❌ `size="icon" without aria-label` → Add aria-label describing the action
342
+ - ❌ `padding / margin / marginTop (any spacing prop) on a useVyre component` → Space BETWEEN components with <Stack gap> / <Grid gap>; space AROUND a block with <Box padding/margin> wrapping it
303
343
 
304
344
  ---
305
345
 
@@ -385,6 +425,7 @@ import { Card, CardHeader, CardBody, CardFooter } from "@usevyre/react"
385
425
 
386
426
  **Common mistakes:**
387
427
  - ❌ `variant="primary"` → Use variant="elevated" | "outlined" | "ghost" | "accent"
428
+ - ❌ `padding / margin / marginTop (any spacing prop) on a useVyre component` → Space BETWEEN components with <Stack gap> / <Grid gap>; space AROUND a block with <Box padding/margin> wrapping it
388
429
 
389
430
  ---
390
431
 
@@ -596,6 +637,7 @@ import { Input } from "@usevyre/react"
596
637
  - ❌ `size="icon"` → Use size="sm" | "md" | "lg"
597
638
  - ❌ `type="search" for search UI` → Import Command from @usevyre/react for search palettes
598
639
  - ❌ `Vue: binding Input/Textarea value without v-model` → Use v-model on <Input>/<Textarea> in Vue; in React use value + onChange
640
+ - ❌ `padding / margin / marginTop (any spacing prop) on a useVyre component` → Space BETWEEN components with <Stack gap> / <Grid gap>; space AROUND a block with <Box padding/margin> wrapping it
599
641
 
600
642
  ---
601
643
 
@@ -1338,6 +1380,157 @@ const messages = [
1338
1380
 
1339
1381
  ---
1340
1382
 
1383
+ ### Stack
1384
+
1385
+ Full one-dimensional flex layout primitive. USE INSTEAD OF <div style={{display:'flex'}}>. Covers the whole CSS flexbox surface (direction incl. reverse, wrap, align/justify/alignContent/alignSelf, grow/shrink/basis, per-axis gap) with token-locked spacing. Renders a plain <div> (or `as`).
1386
+
1387
+ ```tsx
1388
+ import { Stack } from "@usevyre/react"
1389
+
1390
+ // Props:
1391
+ // direction = "row" | "column" | "row-reverse" | "column-reverse" (default: row)
1392
+ // inline = boolean (default: false)
1393
+ // gap = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl" (default: md)
1394
+ // rowGap = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
1395
+ // columnGap = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
1396
+ // align = "start" | "center" | "end" | "stretch" | "baseline" (default: stretch)
1397
+ // justify = "start" | "center" | "end" | "between" | "around" | "evenly" (default: start)
1398
+ // alignContent = "start" | "center" | "end" | "stretch" | "between" | "around" | "evenly"
1399
+ // alignSelf = "auto" | "start" | "center" | "end" | "stretch" | "baseline"
1400
+ // wrap = "nowrap" | "wrap" | "wrap-reverse" (default: nowrap)
1401
+ // grow = number
1402
+ // shrink = number
1403
+ // basis = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "auto" | "content" | "0"
1404
+ // width = "auto" | "full" | "fit" | "screen" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
1405
+ // height = "auto" | "full" | "fit" | "screen" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
1406
+ // as = string (default: div)
1407
+
1408
+ // Examples:
1409
+ <Stack direction="row" gap="md" align="center" justify="between">
1410
+ <Avatar src={user.avatar} />
1411
+ <Text>{user.name}</Text>
1412
+ <Button>Edit</Button>
1413
+ </Stack>
1414
+ <Stack wrap="wrap" rowGap="lg" columnGap="md">
1415
+ {tags.map((t) => <Tag key={t}>{t}</Tag>)}
1416
+ </Stack>
1417
+ ```
1418
+
1419
+ **Common mistakes:**
1420
+ - ❌ `<div style={{ display: 'flex', gap: 12 }}>` → Use <Stack gap="md"> — gap is a token
1421
+ - ❌ `gap={12} or gap="12px"` → Use gap="none|xs|sm|md|lg|xl|2xl"
1422
+ - ❌ `direction="vertical" / "horizontal"` → Use direction="row" or "column" (also row-reverse / column-reverse)
1423
+ - ❌ `style={{ width: "100%" }} / style={{ height: 320 }}` → Use the width / height prop: width="full", width="md", height="screen", etc.
1424
+
1425
+ ---
1426
+
1427
+ ### Grid
1428
+
1429
+ Two-dimensional CSS grid primitive. Explicit column/row counts (or auto-fit), auto-flow control, token gap. Pair with GridItem for cell spanning/placement. Renders a plain <div> (or `as`).
1430
+
1431
+ ```tsx
1432
+ import { Grid, GridItem } from "@usevyre/react"
1433
+
1434
+ // Props:
1435
+ // columns = number | "auto-fit" (default: 1)
1436
+ // rows = number | "auto"
1437
+ // flow = "row" | "column" | "dense" | "row-dense" | "column-dense"
1438
+ // gap = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl" (default: md)
1439
+ // rowGap = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
1440
+ // columnGap = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
1441
+ // align = "start" | "center" | "end" | "stretch" (default: stretch)
1442
+ // justify = "start" | "center" | "end" | "stretch"
1443
+ // width = "auto" | "full" | "fit" | "screen" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
1444
+ // height = "auto" | "full" | "fit" | "screen" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
1445
+ // as = string (default: div)
1446
+
1447
+ // Examples:
1448
+ <Grid columns={3} gap="lg">
1449
+ <GridItem colSpan={2}><Card>Wide</Card></GridItem>
1450
+ <Card>Two</Card>
1451
+ <Card>Three</Card>
1452
+ </Grid>
1453
+ <Grid columns="auto-fit" gap="md">
1454
+ {items.map((i) => <Card key={i.id}>{i.title}</Card>)}
1455
+ </Grid>
1456
+ ```
1457
+
1458
+ **Common mistakes:**
1459
+ - ❌ `<div style={{ display:'grid', gridTemplateColumns:'1fr 1fr 1fr' }}>` → Use <Grid columns={3} gap="md">
1460
+ - ❌ `columns="3" (string)` → Use columns={3} or columns="auto-fit"
1461
+ - ❌ `Nested div with inline grid-column for spanning` → Wrap the cell in <GridItem colSpan={2}>
1462
+ - ❌ `style={{ width: "100%" }} / style={{ height: 320 }}` → Use the width / height prop: width="full", width="md", height="screen", etc.
1463
+
1464
+ ---
1465
+
1466
+ ### GridItem
1467
+
1468
+ Child placement inside <Grid>. Sets column/row span and start lines. Renders a plain <div> (or `as`).
1469
+
1470
+ ```tsx
1471
+ import { GridItem } from "@usevyre/react"
1472
+
1473
+ // Props:
1474
+ // colSpan = number
1475
+ // rowSpan = number
1476
+ // colStart = number
1477
+ // rowStart = number
1478
+ // as = string (default: div)
1479
+
1480
+ // Examples:
1481
+ <Grid columns={4} gap="md">
1482
+ <GridItem colSpan={2}>Featured</GridItem>
1483
+ <div>a</div>
1484
+ <div>b</div>
1485
+ </Grid>
1486
+ ```
1487
+
1488
+ **Common mistakes:**
1489
+ - ❌ `GridItem outside a Grid` → Place <GridItem> directly inside <Grid>
1490
+
1491
+ ---
1492
+
1493
+ ### Box
1494
+
1495
+ Spacing-only container plus a controlled escape hatch. Token padding/margin with shorthand, per-axis (X/Y) and per-side (Top/Right/Bottom/Left) overrides. The `style` prop is an explicit anti-pattern escape hatch. Renders a plain <div> (or `as`).
1496
+
1497
+ ```tsx
1498
+ import { Box } from "@usevyre/react"
1499
+
1500
+ // Props:
1501
+ // padding = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
1502
+ // paddingX = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
1503
+ // paddingY = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
1504
+ // paddingTop = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
1505
+ // paddingRight = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
1506
+ // paddingBottom = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
1507
+ // paddingLeft = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
1508
+ // margin = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
1509
+ // marginX = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
1510
+ // marginY = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
1511
+ // marginTop = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
1512
+ // marginRight = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
1513
+ // marginBottom = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
1514
+ // marginLeft = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
1515
+ // width = "auto" | "full" | "fit" | "screen" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
1516
+ // height = "auto" | "full" | "fit" | "screen" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"
1517
+ // as = string (default: div)
1518
+ // style = React.CSSProperties
1519
+
1520
+ // Examples:
1521
+ <Box as="section" paddingX="lg" paddingY="md">
1522
+ <Heading>Settings</Heading>
1523
+ </Box>
1524
+ <Box marginTop="xl"><Separator /></Box>
1525
+ ```
1526
+
1527
+ **Common mistakes:**
1528
+ - ❌ `<Box style={{ padding: 16 }}>` → Use <Box padding="md"> (or paddingX/paddingTop/...)
1529
+ - ❌ `Using Box for flex/grid layout` → Use <Stack> or <Grid>
1530
+ - ❌ `style={{ width: "100%" }} / style={{ height: 320 }}` → Use the width / height prop: width="full", width="md", height="screen", etc.
1531
+
1532
+ ---
1533
+
1341
1534
  ### DateRangePicker
1342
1535
 
1343
1536
  Start/end date range picker. Built on Calendar (mode=range) with a friendlier { from, to } object API, a two-month side-by-side view, and preset shortcuts. Use this for report/filter date ranges; use DatePicker for a single date.
@@ -1377,6 +1570,9 @@ If you generate these, you are hallucinating.
1377
1570
  - ❌ `<Accordion Accordion without AccordionItem>` → Always compose: Accordion > AccordionItem > AccordionTrigger + AccordionContent
1378
1571
  - ❌ `<Alert variant="error">` → Use variant="danger"
1379
1572
  - ❌ `<Alert variant="primary">` → Use variant="info" | "success" | "warning" | "danger"
1573
+ - ❌ `<AlertDialog AlertDialog without open/onOpenChange (React) or v-model (Vue)>` → Drive open from state; close in onOpenChange / via v-model
1574
+ - ❌ `<AlertDialog Using Alert (inline banner) for a confirm/cancel decision>` → Use AlertDialog for blocking confirmation; Alert for passive messages
1575
+ - ❌ `<AlertDialog variant="success" or "error">` → Use "danger" for destructive, "warning" to caution, "info" otherwise
1380
1576
  - ❌ `<Avatar size="xs">` → Use size="sm"
1381
1577
  - ❌ `<Avatar size="2xl">` → Use size="xl"
1382
1578
  - ❌ `<Badge variant="primary">` → Use variant="accent" for brand color
@@ -1388,11 +1584,13 @@ If you generate these, you are hallucinating.
1388
1584
  - ❌ `<Button color="...">` → Use variant prop instead
1389
1585
  - ❌ `<Button icon={...}>` → Use leftIcon={...} or rightIcon={...}
1390
1586
  - ❌ `<Button size="icon" without aria-label>` → Add aria-label describing the action
1587
+ - ❌ `<Button padding / margin / marginTop (any spacing prop) on a useVyre component>` → Space BETWEEN components with <Stack gap> / <Grid gap>; space AROUND a block with <Box padding/margin> wrapping it
1391
1588
  - ❌ `<Calendar Calendar for an input field that opens a popover>` → Use <DatePicker /> (single date) or <DateRangePicker /> (range)
1392
1589
  - ❌ `<Calendar value as tuple for mode="single">` → Pass value matching mode; use mode="range" for [start,end]
1393
1590
  - ❌ `<DatePicker DatePicker mode="range" for { from, to } object>` → Use <DateRangePicker /> for the { from, to } object API + presets + dual month
1394
1591
  - ❌ `<DatePicker DatePicker without value/onChange>` → Provide value and onChange (e.g. from useState)
1395
1592
  - ❌ `<Card variant="primary">` → Use variant="elevated" | "outlined" | "ghost" | "accent"
1593
+ - ❌ `<Card padding / margin / marginTop (any spacing prop) on a useVyre component>` → Space BETWEEN components with <Stack gap> / <Grid gap>; space AROUND a block with <Box padding/margin> wrapping it
1396
1594
  - ❌ `<Checkbox size="lg">` → Use size="md"
1397
1595
  - ❌ `<RadioGroup <Radio> used outside a <RadioGroup>>` → Always wrap <Radio> in <RadioGroup>
1398
1596
  - ❌ `<RadioGroup RadioGroup without value/onChange (React) or v-model (Vue)>` → Bind value + onChange (React) or v-model (Vue); or defaultValue for uncontrolled in React
@@ -1407,6 +1605,7 @@ If you generate these, you are hallucinating.
1407
1605
  - ❌ `<Input size="icon">` → Use size="sm" | "md" | "lg"
1408
1606
  - ❌ `<Input type="search" for search UI>` → Import Command from @usevyre/react for search palettes
1409
1607
  - ❌ `<Input Vue: binding Input/Textarea value without v-model>` → Use v-model on <Input>/<Textarea> in Vue; in React use value + onChange
1608
+ - ❌ `<Input padding / margin / marginTop (any spacing prop) on a useVyre component>` → Space BETWEEN components with <Stack gap> / <Grid gap>; space AROUND a block with <Box padding/margin> wrapping it
1410
1609
  - ❌ `<Modal size="xl">` → Use size="lg" or size="full"
1411
1610
  - ❌ `<Popover placement="top-center">` → Use placement="top" for centered placement
1412
1611
  - ❌ `<Progress value > 100>` → Normalize your value to 0–100 range before passing
@@ -1443,6 +1642,18 @@ If you generate these, you are hallucinating.
1443
1642
  - ❌ `<Conversation Expecting Conversation to store/append messages>` → Append to your own state in onSend (or @send) and pass it back via value
1444
1643
  - ❌ `<Conversation composer without onSend (React) / @send (Vue)>` → Provide onSend / @send to append the message to value
1445
1644
  - ❌ `<Conversation Treating onSend as (text) only when using allowAttachments>` → Handle onSend(text, files) — map files to message attachments and append
1645
+ - ❌ `<Stack <div style={{ display: 'flex', gap: 12 }}>>` → Use <Stack gap="md"> — gap is a token
1646
+ - ❌ `<Stack gap={12} or gap="12px">` → Use gap="none|xs|sm|md|lg|xl|2xl"
1647
+ - ❌ `<Stack direction="vertical" / "horizontal">` → Use direction="row" or "column" (also row-reverse / column-reverse)
1648
+ - ❌ `<Stack style={{ width: "100%" }} / style={{ height: 320 }}>` → Use the width / height prop: width="full", width="md", height="screen", etc.
1649
+ - ❌ `<Grid <div style={{ display:'grid', gridTemplateColumns:'1fr 1fr 1fr' }}>>` → Use <Grid columns={3} gap="md">
1650
+ - ❌ `<Grid columns="3" (string)>` → Use columns={3} or columns="auto-fit"
1651
+ - ❌ `<Grid Nested div with inline grid-column for spanning>` → Wrap the cell in <GridItem colSpan={2}>
1652
+ - ❌ `<Grid style={{ width: "100%" }} / style={{ height: 320 }}>` → Use the width / height prop: width="full", width="md", height="screen", etc.
1653
+ - ❌ `<GridItem GridItem outside a Grid>` → Place <GridItem> directly inside <Grid>
1654
+ - ❌ `<Box <Box style={{ padding: 16 }}>>` → Use <Box padding="md"> (or paddingX/paddingTop/...)
1655
+ - ❌ `<Box Using Box for flex/grid layout>` → Use <Stack> or <Grid>
1656
+ - ❌ `<Box style={{ width: "100%" }} / style={{ height: 320 }}>` → Use the width / height prop: width="full", width="md", height="screen", etc.
1446
1657
  - ❌ `<DateRangePicker value={[from, to]}>` → Use value={{ from, to }} and read range.from / range.to
1447
1658
  - ❌ `<DateRangePicker DateRangePicker for a single date>` → Use <DatePicker /> for a single date
1448
1659
  - ❌ `<DateRangePicker presets="true" (string)>` → Use the bare prop: presets (or presets={true})