@usevyre/ai-context 1.0.0 → 1.1.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.
- package/dist/anti-patterns.json +106 -1
- package/dist/cheat-sheets/buttongroup.md +42 -0
- package/dist/cheat-sheets/combobox.md +37 -0
- package/dist/cheat-sheets/datagrid.md +44 -0
- package/dist/cheat-sheets/index.md +6 -0
- package/dist/cheat-sheets/tag.md +46 -0
- package/dist/cheat-sheets/taggroup.md +33 -0
- package/dist/cheat-sheets/tagsinput.md +35 -0
- package/dist/claude-context.md +198 -1
- package/dist/copilot-instructions.md +198 -1
- package/dist/cursor-rules.md +72 -1
- package/dist/full-context.md +197 -0
- package/dist/index.js +1504 -114
- package/dist/schema.json +373 -5
- package/dist/tokens.json +1 -1
- package/dist/tokens.md +1 -1
- package/dist/version-info.json +117 -65
- package/dist/windsurf-rules.md +198 -1
- package/package.json +1 -1
package/dist/schema.json
CHANGED
|
@@ -1,14 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
-
"version": "
|
|
4
|
-
"generatedAt": "2026-05-
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"generatedAt": "2026-05-15",
|
|
5
5
|
"package": "@usevyre/react",
|
|
6
|
-
"packageVersion": "
|
|
6
|
+
"packageVersion": "1.1.0",
|
|
7
7
|
"validFor": [
|
|
8
|
-
"@usevyre/react@
|
|
9
|
-
"@usevyre/vue@
|
|
8
|
+
"@usevyre/react@1.1.0+",
|
|
9
|
+
"@usevyre/vue@1.1.0+"
|
|
10
10
|
],
|
|
11
11
|
"changelog": {
|
|
12
|
+
"1.1.0": {
|
|
13
|
+
"date": "2026-05-15",
|
|
14
|
+
"breaking": false,
|
|
15
|
+
"summary": "Added 6 components: ButtonGroup, TagsInput, Combobox, DataGrid, Tag, TagGroup"
|
|
16
|
+
},
|
|
17
|
+
"1.0.0": {
|
|
18
|
+
"date": "2026-05-13",
|
|
19
|
+
"breaking": true,
|
|
20
|
+
"summary": "Stable v1.0 release — VyreCode renamed to Code in Vue, BreadcrumbLink + BreadcrumbSeparator added to React, Toast setup updated"
|
|
21
|
+
},
|
|
12
22
|
"0.2.0": {
|
|
13
23
|
"date": "2026-05-08",
|
|
14
24
|
"breaking": false,
|
|
@@ -1273,6 +1283,364 @@
|
|
|
1273
1283
|
"code": "<Heading size=\"2xl\" as=\"h1\">Dashboard</Heading>\n<Lead>Welcome back. Here's what's happening today.</Lead>\n<Text size=\"sm\" style={{ color: 'var(--vyre-color-semantic-text-muted)' }}>Last updated 5 minutes ago.</Text>"
|
|
1274
1284
|
}
|
|
1275
1285
|
]
|
|
1286
|
+
},
|
|
1287
|
+
"ButtonGroup": {
|
|
1288
|
+
"description": "Groups multiple Button components into one visual unit (toolbar, segmented control). Pure layout — no internal state.",
|
|
1289
|
+
"import": "import { ButtonGroup, Button } from \"@usevyre/react\"",
|
|
1290
|
+
"props": {
|
|
1291
|
+
"orientation": {
|
|
1292
|
+
"type": "enum",
|
|
1293
|
+
"values": [
|
|
1294
|
+
"horizontal",
|
|
1295
|
+
"vertical"
|
|
1296
|
+
],
|
|
1297
|
+
"default": "horizontal",
|
|
1298
|
+
"description": "Layout direction of grouped buttons"
|
|
1299
|
+
},
|
|
1300
|
+
"attached": {
|
|
1301
|
+
"type": "boolean",
|
|
1302
|
+
"default": false,
|
|
1303
|
+
"description": "Remove gap so buttons share collapsed borders (segmented control look)"
|
|
1304
|
+
},
|
|
1305
|
+
"size": {
|
|
1306
|
+
"type": "enum",
|
|
1307
|
+
"values": [
|
|
1308
|
+
"sm",
|
|
1309
|
+
"md",
|
|
1310
|
+
"lg",
|
|
1311
|
+
"icon"
|
|
1312
|
+
],
|
|
1313
|
+
"description": "Size forwarded to all child buttons"
|
|
1314
|
+
}
|
|
1315
|
+
},
|
|
1316
|
+
"antiPatterns": [
|
|
1317
|
+
{
|
|
1318
|
+
"pattern": "ButtonGroup variant=\"...\"",
|
|
1319
|
+
"reason": "ButtonGroup has no variant prop — variant goes on each child Button",
|
|
1320
|
+
"fix": "Set variant on each <Button> inside the group"
|
|
1321
|
+
},
|
|
1322
|
+
{
|
|
1323
|
+
"pattern": "ButtonGroup without Button children",
|
|
1324
|
+
"reason": "ButtonGroup is a layout wrapper for Button elements",
|
|
1325
|
+
"fix": "Place <Button> elements as direct children"
|
|
1326
|
+
}
|
|
1327
|
+
],
|
|
1328
|
+
"examples": [
|
|
1329
|
+
{
|
|
1330
|
+
"description": "Segmented control",
|
|
1331
|
+
"code": "<ButtonGroup attached>\n <Button variant=\"secondary\">Day</Button>\n <Button variant=\"secondary\">Week</Button>\n <Button variant=\"secondary\">Month</Button>\n</ButtonGroup>"
|
|
1332
|
+
},
|
|
1333
|
+
{
|
|
1334
|
+
"description": "Vertical group",
|
|
1335
|
+
"code": "<ButtonGroup orientation=\"vertical\" attached>\n <Button variant=\"secondary\">Top</Button>\n <Button variant=\"secondary\">Bottom</Button>\n</ButtonGroup>"
|
|
1336
|
+
}
|
|
1337
|
+
]
|
|
1338
|
+
},
|
|
1339
|
+
"TagsInput": {
|
|
1340
|
+
"description": "Multi-tag input. Type and press Enter or comma to add a tag, click x to remove, Backspace on empty input removes the last tag. Controlled.",
|
|
1341
|
+
"import": "import { TagsInput } from \"@usevyre/react\"",
|
|
1342
|
+
"props": {
|
|
1343
|
+
"value": {
|
|
1344
|
+
"type": "string[]",
|
|
1345
|
+
"description": "Controlled list of tags (required)"
|
|
1346
|
+
},
|
|
1347
|
+
"onChange": {
|
|
1348
|
+
"type": "(tags: string[]) => void",
|
|
1349
|
+
"description": "Called with the new tag array on every change. React only — Vue uses v-model"
|
|
1350
|
+
},
|
|
1351
|
+
"placeholder": {
|
|
1352
|
+
"type": "string",
|
|
1353
|
+
"description": "Input placeholder, hidden when max is reached"
|
|
1354
|
+
},
|
|
1355
|
+
"disabled": {
|
|
1356
|
+
"type": "boolean",
|
|
1357
|
+
"default": false,
|
|
1358
|
+
"description": "Disables all interaction"
|
|
1359
|
+
},
|
|
1360
|
+
"max": {
|
|
1361
|
+
"type": "number",
|
|
1362
|
+
"description": "Maximum number of tags; input is disabled when reached"
|
|
1363
|
+
},
|
|
1364
|
+
"size": {
|
|
1365
|
+
"type": "enum",
|
|
1366
|
+
"values": [
|
|
1367
|
+
"sm",
|
|
1368
|
+
"md",
|
|
1369
|
+
"lg"
|
|
1370
|
+
],
|
|
1371
|
+
"default": "md",
|
|
1372
|
+
"description": "Size scale"
|
|
1373
|
+
}
|
|
1374
|
+
},
|
|
1375
|
+
"antiPatterns": [
|
|
1376
|
+
{
|
|
1377
|
+
"pattern": "TagsInput value={string}",
|
|
1378
|
+
"reason": "value must be a string array, not a string",
|
|
1379
|
+
"fix": "Pass an array: value={['react','vue']}"
|
|
1380
|
+
},
|
|
1381
|
+
{
|
|
1382
|
+
"pattern": "TagsInput without onChange",
|
|
1383
|
+
"reason": "TagsInput is controlled — it needs onChange to update",
|
|
1384
|
+
"fix": "Provide value and onChange (React) or v-model (Vue)"
|
|
1385
|
+
}
|
|
1386
|
+
],
|
|
1387
|
+
"examples": [
|
|
1388
|
+
{
|
|
1389
|
+
"description": "Basic tags input",
|
|
1390
|
+
"code": "const [tags, setTags] = useState<string[]>([]);\n<TagsInput value={tags} onChange={setTags} placeholder=\"Add a tag…\" />"
|
|
1391
|
+
},
|
|
1392
|
+
{
|
|
1393
|
+
"description": "Limited to 5 tags",
|
|
1394
|
+
"code": "<TagsInput value={tags} onChange={setTags} max={5} />"
|
|
1395
|
+
}
|
|
1396
|
+
]
|
|
1397
|
+
},
|
|
1398
|
+
"Combobox": {
|
|
1399
|
+
"description": "Searchable single-select dropdown with typeahead filtering and keyboard navigation. Use when the list is long enough to need search. Differs from Select (no search) and Command (palette).",
|
|
1400
|
+
"import": "import { Combobox } from \"@usevyre/react\"",
|
|
1401
|
+
"props": {
|
|
1402
|
+
"options": {
|
|
1403
|
+
"type": "{ value: string; label: string; disabled?: boolean }[]",
|
|
1404
|
+
"description": "Selectable options (required)"
|
|
1405
|
+
},
|
|
1406
|
+
"value": {
|
|
1407
|
+
"type": "string | null",
|
|
1408
|
+
"description": "Controlled selected value; null clears selection (required)"
|
|
1409
|
+
},
|
|
1410
|
+
"onChange": {
|
|
1411
|
+
"type": "(value: string | null) => void",
|
|
1412
|
+
"description": "Called when selection changes. React only — Vue uses v-model"
|
|
1413
|
+
},
|
|
1414
|
+
"placeholder": {
|
|
1415
|
+
"type": "string",
|
|
1416
|
+
"default": "\"Search…\"",
|
|
1417
|
+
"description": "Input placeholder when nothing is selected"
|
|
1418
|
+
},
|
|
1419
|
+
"disabled": {
|
|
1420
|
+
"type": "boolean",
|
|
1421
|
+
"default": false,
|
|
1422
|
+
"description": "Disables the combobox"
|
|
1423
|
+
},
|
|
1424
|
+
"size": {
|
|
1425
|
+
"type": "enum",
|
|
1426
|
+
"values": [
|
|
1427
|
+
"sm",
|
|
1428
|
+
"md",
|
|
1429
|
+
"lg"
|
|
1430
|
+
],
|
|
1431
|
+
"default": "md",
|
|
1432
|
+
"description": "Height scale"
|
|
1433
|
+
},
|
|
1434
|
+
"emptyText": {
|
|
1435
|
+
"type": "string",
|
|
1436
|
+
"default": "\"No results\"",
|
|
1437
|
+
"description": "Text shown when search matches no options"
|
|
1438
|
+
}
|
|
1439
|
+
},
|
|
1440
|
+
"antiPatterns": [
|
|
1441
|
+
{
|
|
1442
|
+
"pattern": "Combobox value=\"\"",
|
|
1443
|
+
"reason": "Empty selection must be null, not empty string",
|
|
1444
|
+
"fix": "Use value={null} for no selection"
|
|
1445
|
+
},
|
|
1446
|
+
{
|
|
1447
|
+
"pattern": "Combobox options={string[]}",
|
|
1448
|
+
"reason": "options must be objects with value and label",
|
|
1449
|
+
"fix": "Use [{ value: 'ts', label: 'TypeScript' }]"
|
|
1450
|
+
},
|
|
1451
|
+
{
|
|
1452
|
+
"pattern": "Using Combobox for command palette",
|
|
1453
|
+
"reason": "Combobox is single-value select, not an action palette",
|
|
1454
|
+
"fix": "Use Command for command palettes"
|
|
1455
|
+
}
|
|
1456
|
+
],
|
|
1457
|
+
"examples": [
|
|
1458
|
+
{
|
|
1459
|
+
"description": "Searchable language picker",
|
|
1460
|
+
"code": "const [lang, setLang] = useState<string | null>(null);\n<Combobox\n options={[{ value: \"ts\", label: \"TypeScript\" }, { value: \"go\", label: \"Go\" }]}\n value={lang}\n onChange={setLang}\n placeholder=\"Search language…\"\n/>"
|
|
1461
|
+
}
|
|
1462
|
+
]
|
|
1463
|
+
},
|
|
1464
|
+
"DataGrid": {
|
|
1465
|
+
"description": "Table with built-in column sorting, loading skeletons, and empty state. Filtering and pagination are out of scope — compose with the Pagination component.",
|
|
1466
|
+
"import": "import { DataGrid } from \"@usevyre/react\"",
|
|
1467
|
+
"props": {
|
|
1468
|
+
"columns": {
|
|
1469
|
+
"type": "{ key: string; label: string; sortable?: boolean; width?: string }[]",
|
|
1470
|
+
"description": "Column definitions (required)"
|
|
1471
|
+
},
|
|
1472
|
+
"rows": {
|
|
1473
|
+
"type": "Record<string, unknown>[]",
|
|
1474
|
+
"description": "Row data; each object keyed by column key (required)"
|
|
1475
|
+
},
|
|
1476
|
+
"sortKey": {
|
|
1477
|
+
"type": "string",
|
|
1478
|
+
"description": "Controlled active sort column key"
|
|
1479
|
+
},
|
|
1480
|
+
"sortDir": {
|
|
1481
|
+
"type": "enum",
|
|
1482
|
+
"values": [
|
|
1483
|
+
"asc",
|
|
1484
|
+
"desc"
|
|
1485
|
+
],
|
|
1486
|
+
"description": "Controlled sort direction"
|
|
1487
|
+
},
|
|
1488
|
+
"onSort": {
|
|
1489
|
+
"type": "(key: string, dir: 'asc' | 'desc') => void",
|
|
1490
|
+
"description": "Called when a sortable header is clicked. React only — Vue emits sort + v-model:sortKey/sortDir"
|
|
1491
|
+
},
|
|
1492
|
+
"loading": {
|
|
1493
|
+
"type": "boolean",
|
|
1494
|
+
"default": false,
|
|
1495
|
+
"description": "Show skeleton placeholder rows"
|
|
1496
|
+
},
|
|
1497
|
+
"emptyText": {
|
|
1498
|
+
"type": "string",
|
|
1499
|
+
"default": "\"No data\"",
|
|
1500
|
+
"description": "Message shown when rows is empty"
|
|
1501
|
+
},
|
|
1502
|
+
"stickyHeader": {
|
|
1503
|
+
"type": "boolean",
|
|
1504
|
+
"default": false,
|
|
1505
|
+
"description": "Keep the header visible while scrolling"
|
|
1506
|
+
}
|
|
1507
|
+
},
|
|
1508
|
+
"antiPatterns": [
|
|
1509
|
+
{
|
|
1510
|
+
"pattern": "DataGrid expecting built-in pagination",
|
|
1511
|
+
"reason": "DataGrid does not paginate — it only sorts",
|
|
1512
|
+
"fix": "Slice rows yourself and use the Pagination component"
|
|
1513
|
+
},
|
|
1514
|
+
{
|
|
1515
|
+
"pattern": "DataGrid expecting built-in filtering",
|
|
1516
|
+
"reason": "DataGrid does not filter rows",
|
|
1517
|
+
"fix": "Filter the rows array before passing it in"
|
|
1518
|
+
},
|
|
1519
|
+
{
|
|
1520
|
+
"pattern": "sortable without onSort",
|
|
1521
|
+
"reason": "Sorting is controlled — the grid does not sort data itself",
|
|
1522
|
+
"fix": "Handle onSort and sort the rows array in your state"
|
|
1523
|
+
}
|
|
1524
|
+
],
|
|
1525
|
+
"examples": [
|
|
1526
|
+
{
|
|
1527
|
+
"description": "Sortable grid",
|
|
1528
|
+
"code": "const cols = [{ key: \"name\", label: \"Name\", sortable: true }];\n<DataGrid\n columns={cols}\n rows={people}\n sortKey={sortKey}\n sortDir={sortDir}\n onSort={(k, d) => { setSortKey(k); setSortDir(d); }}\n/>"
|
|
1529
|
+
},
|
|
1530
|
+
{
|
|
1531
|
+
"description": "Loading state",
|
|
1532
|
+
"code": "<DataGrid columns={cols} rows={[]} loading />"
|
|
1533
|
+
}
|
|
1534
|
+
]
|
|
1535
|
+
},
|
|
1536
|
+
"Tag": {
|
|
1537
|
+
"description": "Standalone display tag/chip for categories, labels, or filter chips. NOT an input — for tag input use TagsInput. Group multiple with TagGroup.",
|
|
1538
|
+
"import": "import { Tag } from \"@usevyre/react\"",
|
|
1539
|
+
"props": {
|
|
1540
|
+
"variant": {
|
|
1541
|
+
"type": "enum",
|
|
1542
|
+
"values": [
|
|
1543
|
+
"default",
|
|
1544
|
+
"accent",
|
|
1545
|
+
"danger"
|
|
1546
|
+
],
|
|
1547
|
+
"default": "default",
|
|
1548
|
+
"description": "Visual style. default=neutral, accent=brand, danger=destructive/error"
|
|
1549
|
+
},
|
|
1550
|
+
"size": {
|
|
1551
|
+
"type": "enum",
|
|
1552
|
+
"values": [
|
|
1553
|
+
"sm",
|
|
1554
|
+
"md",
|
|
1555
|
+
"lg"
|
|
1556
|
+
],
|
|
1557
|
+
"default": "md",
|
|
1558
|
+
"description": "Size scale"
|
|
1559
|
+
},
|
|
1560
|
+
"onRemove": {
|
|
1561
|
+
"type": "() => void",
|
|
1562
|
+
"description": "React only. When provided, renders a × remove button. Vue: use `removable` prop + @remove event"
|
|
1563
|
+
},
|
|
1564
|
+
"onClick": {
|
|
1565
|
+
"type": "() => void",
|
|
1566
|
+
"description": "React only. When provided, makes the whole tag interactive (keyboard accessible). Vue: use `clickable` prop + @click event"
|
|
1567
|
+
},
|
|
1568
|
+
"disabled": {
|
|
1569
|
+
"type": "boolean",
|
|
1570
|
+
"default": false,
|
|
1571
|
+
"description": "Disables interaction (only relevant with onClick/onRemove)"
|
|
1572
|
+
}
|
|
1573
|
+
},
|
|
1574
|
+
"antiPatterns": [
|
|
1575
|
+
{
|
|
1576
|
+
"pattern": "Tag variant=\"success\"",
|
|
1577
|
+
"reason": "Tag only has default, accent, danger variants (unlike Badge which has more)",
|
|
1578
|
+
"fix": "Use Badge for success/warning/teal status colors; Tag is for categories/filters"
|
|
1579
|
+
},
|
|
1580
|
+
{
|
|
1581
|
+
"pattern": "Using Tag for tag input",
|
|
1582
|
+
"reason": "Tag is display-only, it does not accept typed input",
|
|
1583
|
+
"fix": "Use TagsInput for adding/removing tags via keyboard"
|
|
1584
|
+
},
|
|
1585
|
+
{
|
|
1586
|
+
"pattern": "Tag size=\"xl\"",
|
|
1587
|
+
"reason": "Maximum size is 'lg'",
|
|
1588
|
+
"fix": "Use size=\"lg\""
|
|
1589
|
+
}
|
|
1590
|
+
],
|
|
1591
|
+
"examples": [
|
|
1592
|
+
{
|
|
1593
|
+
"description": "Category tags in a group",
|
|
1594
|
+
"code": "<TagGroup>\n <Tag>Design</Tag>\n <Tag variant=\"accent\">Featured</Tag>\n <Tag>Engineering</Tag>\n</TagGroup>"
|
|
1595
|
+
},
|
|
1596
|
+
{
|
|
1597
|
+
"description": "Removable filter chip (React)",
|
|
1598
|
+
"code": "<Tag onRemove={() => removeFilter(\"react\")}>react</Tag>"
|
|
1599
|
+
},
|
|
1600
|
+
{
|
|
1601
|
+
"description": "Clickable toggle tag (React)",
|
|
1602
|
+
"code": "<Tag onClick={() => toggleFilter(\"vue\")}>vue</Tag>"
|
|
1603
|
+
}
|
|
1604
|
+
]
|
|
1605
|
+
},
|
|
1606
|
+
"TagGroup": {
|
|
1607
|
+
"description": "Read-only container that lays out multiple Tag elements with automatic wrapping and consistent spacing. For tag input use TagsInput.",
|
|
1608
|
+
"import": "import { TagGroup, Tag } from \"@usevyre/react\"",
|
|
1609
|
+
"props": {
|
|
1610
|
+
"gap": {
|
|
1611
|
+
"type": "enum",
|
|
1612
|
+
"values": [
|
|
1613
|
+
"sm",
|
|
1614
|
+
"md",
|
|
1615
|
+
"lg"
|
|
1616
|
+
],
|
|
1617
|
+
"default": "md",
|
|
1618
|
+
"description": "Spacing between tags"
|
|
1619
|
+
},
|
|
1620
|
+
"wrap": {
|
|
1621
|
+
"type": "boolean",
|
|
1622
|
+
"default": true,
|
|
1623
|
+
"description": "Wrap tags onto multiple lines when they overflow; set false for single-line scroll"
|
|
1624
|
+
}
|
|
1625
|
+
},
|
|
1626
|
+
"antiPatterns": [
|
|
1627
|
+
{
|
|
1628
|
+
"pattern": "TagGroup without Tag children",
|
|
1629
|
+
"reason": "TagGroup is a layout wrapper for Tag elements",
|
|
1630
|
+
"fix": "Place <Tag> elements as direct children"
|
|
1631
|
+
},
|
|
1632
|
+
{
|
|
1633
|
+
"pattern": "Using TagGroup for tag input",
|
|
1634
|
+
"reason": "TagGroup is display-only",
|
|
1635
|
+
"fix": "Use TagsInput for an editable tag field"
|
|
1636
|
+
}
|
|
1637
|
+
],
|
|
1638
|
+
"examples": [
|
|
1639
|
+
{
|
|
1640
|
+
"description": "Tag group with mixed variants",
|
|
1641
|
+
"code": "<TagGroup gap=\"sm\">\n <Tag>React</Tag>\n <Tag>Vue</Tag>\n <Tag variant=\"accent\">TypeScript</Tag>\n</TagGroup>"
|
|
1642
|
+
}
|
|
1643
|
+
]
|
|
1276
1644
|
}
|
|
1277
1645
|
}
|
|
1278
1646
|
}
|
package/dist/tokens.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://usevyre.com/schemas/ai-tokens-v1.json",
|
|
3
3
|
"version": "1.0.0",
|
|
4
|
-
"generatedAt": "2026-05-
|
|
4
|
+
"generatedAt": "2026-05-13T00:36:55.284Z",
|
|
5
5
|
"description": "useVyre design tokens — machine-readable reference for AI agents. Use semantic color tokens; never use primitive tokens directly in components.",
|
|
6
6
|
"naming": {
|
|
7
7
|
"convention": "--vyre-[category]-[subcategory]-[variant]",
|
package/dist/tokens.md
CHANGED