@cascivo/mcp 0.1.0 → 0.1.1
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/README.md +32 -9
- package/dist/index.d.mts +48 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +144 -11
- package/dist/index.mjs.map +1 -1
- package/dist/registry.json +1244 -103
- package/package.json +3 -3
- package/readme.body.md +31 -8
package/dist/registry.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": "0.0.0",
|
|
3
|
-
"generatedAt": "2026-06-
|
|
3
|
+
"generatedAt": "2026-06-19",
|
|
4
4
|
"components": [
|
|
5
5
|
{
|
|
6
6
|
"name": "accordion",
|
|
@@ -340,6 +340,130 @@
|
|
|
340
340
|
}
|
|
341
341
|
}
|
|
342
342
|
},
|
|
343
|
+
{
|
|
344
|
+
"name": "app-shell",
|
|
345
|
+
"type": "component",
|
|
346
|
+
"description": "Sticky-header + full-height side-nav + single-scroll-container layout with an animated, accessible nav toggle.",
|
|
347
|
+
"category": "layout",
|
|
348
|
+
"version": "0.0.0",
|
|
349
|
+
"files": [
|
|
350
|
+
"https://raw.githubusercontent.com/urbanisierung/cascivo/main/packages/components/src/app-shell/app-shell.tsx",
|
|
351
|
+
"https://raw.githubusercontent.com/urbanisierung/cascivo/main/packages/components/src/app-shell/app-shell.module.css"
|
|
352
|
+
],
|
|
353
|
+
"dependencies": ["@cascivo/core"],
|
|
354
|
+
"tags": ["shell", "layout", "sidebar", "navigation", "drawer", "responsive", "sticky"],
|
|
355
|
+
"meta": {
|
|
356
|
+
"name": "AppShell",
|
|
357
|
+
"description": "Sticky-header + full-height side-nav + single-scroll-container layout with an animated, accessible nav toggle.",
|
|
358
|
+
"category": "layout",
|
|
359
|
+
"states": ["open", "closed"],
|
|
360
|
+
"variants": [],
|
|
361
|
+
"sizes": [],
|
|
362
|
+
"props": [
|
|
363
|
+
{
|
|
364
|
+
"name": "header",
|
|
365
|
+
"type": "ReactNode",
|
|
366
|
+
"required": true,
|
|
367
|
+
"description": "Top bar (typically a ShellHeader). If a React element, its onMenuClick/menuExpanded are bound to the nav toggle."
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
"name": "nav",
|
|
371
|
+
"type": "ReactNode",
|
|
372
|
+
"required": false,
|
|
373
|
+
"description": "Side navigation (typically a SideNav). Fills full height and scrolls internally."
|
|
374
|
+
},
|
|
375
|
+
{
|
|
376
|
+
"name": "children",
|
|
377
|
+
"type": "ReactNode",
|
|
378
|
+
"required": true,
|
|
379
|
+
"description": "Main content, rendered inside the single scroll container."
|
|
380
|
+
},
|
|
381
|
+
{
|
|
382
|
+
"name": "footer",
|
|
383
|
+
"type": "ReactNode",
|
|
384
|
+
"required": false,
|
|
385
|
+
"description": "Optional footer pinned below the content area."
|
|
386
|
+
},
|
|
387
|
+
{
|
|
388
|
+
"name": "open",
|
|
389
|
+
"type": "boolean",
|
|
390
|
+
"required": false,
|
|
391
|
+
"description": "Controlled nav open/visible state. Omit for uncontrolled."
|
|
392
|
+
},
|
|
393
|
+
{
|
|
394
|
+
"name": "defaultOpen",
|
|
395
|
+
"type": "boolean",
|
|
396
|
+
"required": false,
|
|
397
|
+
"description": "Initial open state when uncontrolled. Defaults open on desktop, closed on small screens."
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
"name": "onOpenChange",
|
|
401
|
+
"type": "(open: boolean) => void",
|
|
402
|
+
"required": false,
|
|
403
|
+
"description": "Fired when the nav requests open/close (burger, Escape, scrim)."
|
|
404
|
+
}
|
|
405
|
+
],
|
|
406
|
+
"tokens": [
|
|
407
|
+
"--cascivo-shell-aside-inline-size",
|
|
408
|
+
"--cascivo-shell-panel-inline-size",
|
|
409
|
+
"--cascivo-motion-emphasis",
|
|
410
|
+
"--cascivo-z-raised",
|
|
411
|
+
"--cascivo-z-overlay",
|
|
412
|
+
"--cascivo-color-foreground",
|
|
413
|
+
"--cascivo-color-background"
|
|
414
|
+
],
|
|
415
|
+
"accessibility": {
|
|
416
|
+
"role": "none",
|
|
417
|
+
"wcag": "2.2-AA",
|
|
418
|
+
"keyboard": ["Escape"]
|
|
419
|
+
},
|
|
420
|
+
"examples": [
|
|
421
|
+
{
|
|
422
|
+
"title": "Header + SideNav + content",
|
|
423
|
+
"code": "<AppShell\n header={<ShellHeader brand={{ name: 'Acme' }} />}\n nav={<SideNav items={items} />}\n>\n <h1>Dashboard</h1>\n</AppShell>",
|
|
424
|
+
"description": "The burger in ShellHeader toggles the SideNav automatically."
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
"title": "Controlled open",
|
|
428
|
+
"code": "<AppShell header={header} nav={nav} open={open.value} onOpenChange={(v) => (open.value = v)}>\n …\n</AppShell>"
|
|
429
|
+
}
|
|
430
|
+
],
|
|
431
|
+
"dependencies": ["@cascivo/core"],
|
|
432
|
+
"tags": ["shell", "layout", "sidebar", "navigation", "drawer", "responsive", "sticky"],
|
|
433
|
+
"intent": {
|
|
434
|
+
"whenToUse": [
|
|
435
|
+
"Building an application screen with a persistent header and side navigation",
|
|
436
|
+
"You want the header burger to toggle the side nav with an animated, accessible show/hide out of the box",
|
|
437
|
+
"You need one scroll container (the main area) with a fixed header and full-height nav"
|
|
438
|
+
],
|
|
439
|
+
"whenNotToUse": [
|
|
440
|
+
"Marketing/document pages where the whole page should scroll — use a plain Header instead",
|
|
441
|
+
"A single, always-visible sidebar with no toggle — compose SideNav directly"
|
|
442
|
+
],
|
|
443
|
+
"antiPatterns": [
|
|
444
|
+
{
|
|
445
|
+
"bad": "Animating the nav collapse with grid-template-columns: 1fr → 0fr on an auto-width sidebar",
|
|
446
|
+
"good": "AppShell animates an explicit inline-size (desktop) / transform (mobile drawer)",
|
|
447
|
+
"why": "fr units have no definite size to resolve against on a shrink-to-fit flex item, so the track never animates"
|
|
448
|
+
}
|
|
449
|
+
],
|
|
450
|
+
"related": [
|
|
451
|
+
{
|
|
452
|
+
"name": "ShellHeader",
|
|
453
|
+
"relationship": "pairs-with",
|
|
454
|
+
"reason": "Provides the top bar and burger AppShell binds to the nav"
|
|
455
|
+
},
|
|
456
|
+
{
|
|
457
|
+
"name": "SideNav",
|
|
458
|
+
"relationship": "pairs-with",
|
|
459
|
+
"reason": "The side navigation AppShell lays out full-height"
|
|
460
|
+
}
|
|
461
|
+
],
|
|
462
|
+
"a11yRationale": "The hidden nav uses transform/inline-size + inert (never display:none alone), so it stays in the a11y tree and is keyboard-reachable when open while leaving the tab order when closed; Escape and a scrim close the mobile drawer and focus returns to the toggle.",
|
|
463
|
+
"flexibility": []
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
},
|
|
343
467
|
{
|
|
344
468
|
"name": "aspect-ratio",
|
|
345
469
|
"type": "component",
|
|
@@ -547,6 +671,128 @@
|
|
|
547
671
|
}
|
|
548
672
|
}
|
|
549
673
|
},
|
|
674
|
+
{
|
|
675
|
+
"name": "avatar-group",
|
|
676
|
+
"type": "component",
|
|
677
|
+
"description": "Overlapping stack of avatars with a max cap and an i18n-labelled +N overflow chip",
|
|
678
|
+
"category": "display",
|
|
679
|
+
"version": "0.0.0",
|
|
680
|
+
"files": [
|
|
681
|
+
"https://raw.githubusercontent.com/urbanisierung/cascivo/main/packages/components/src/avatar-group/avatar-group.tsx",
|
|
682
|
+
"https://raw.githubusercontent.com/urbanisierung/cascivo/main/packages/components/src/avatar-group/avatar-group.module.css"
|
|
683
|
+
],
|
|
684
|
+
"dependencies": ["@cascivo/core", "@cascivo/components"],
|
|
685
|
+
"tags": ["avatar", "group", "stack", "overflow", "display"],
|
|
686
|
+
"meta": {
|
|
687
|
+
"name": "AvatarGroup",
|
|
688
|
+
"description": "Overlapping stack of avatars with a max cap and an i18n-labelled +N overflow chip",
|
|
689
|
+
"category": "display",
|
|
690
|
+
"states": ["default"],
|
|
691
|
+
"variants": [],
|
|
692
|
+
"sizes": [],
|
|
693
|
+
"props": [
|
|
694
|
+
{
|
|
695
|
+
"name": "max",
|
|
696
|
+
"type": "number",
|
|
697
|
+
"required": false,
|
|
698
|
+
"description": "Cap the number of visible avatars"
|
|
699
|
+
},
|
|
700
|
+
{
|
|
701
|
+
"name": "total",
|
|
702
|
+
"type": "number",
|
|
703
|
+
"required": false,
|
|
704
|
+
"description": "Override the total count used for the +N chip"
|
|
705
|
+
},
|
|
706
|
+
{
|
|
707
|
+
"name": "spacing",
|
|
708
|
+
"type": "'sm' | 'md' | 'lg'",
|
|
709
|
+
"required": false,
|
|
710
|
+
"default": "md"
|
|
711
|
+
},
|
|
712
|
+
{
|
|
713
|
+
"name": "isGrid",
|
|
714
|
+
"type": "boolean",
|
|
715
|
+
"required": false,
|
|
716
|
+
"default": "false"
|
|
717
|
+
},
|
|
718
|
+
{
|
|
719
|
+
"name": "labels",
|
|
720
|
+
"type": "AvatarGroupLabels",
|
|
721
|
+
"required": false
|
|
722
|
+
}
|
|
723
|
+
],
|
|
724
|
+
"tokens": [
|
|
725
|
+
"--cascivo-color-surface",
|
|
726
|
+
"--cascivo-color-text-muted",
|
|
727
|
+
"--cascivo-space-2",
|
|
728
|
+
"--cascivo-text-xs"
|
|
729
|
+
],
|
|
730
|
+
"accessibility": {
|
|
731
|
+
"role": "group",
|
|
732
|
+
"wcag": "2.2-AA",
|
|
733
|
+
"keyboard": []
|
|
734
|
+
},
|
|
735
|
+
"examples": [
|
|
736
|
+
{
|
|
737
|
+
"title": "Basic",
|
|
738
|
+
"code": "<AvatarGroup><Avatar fallback=\"A\" /><Avatar fallback=\"B\" /><Avatar fallback=\"C\" /></AvatarGroup>"
|
|
739
|
+
},
|
|
740
|
+
{
|
|
741
|
+
"title": "With max",
|
|
742
|
+
"code": "<AvatarGroup max={3}>{users.map((u) => <Avatar key={u.id} src={u.src} alt={u.name} />)}</AvatarGroup>"
|
|
743
|
+
},
|
|
744
|
+
{
|
|
745
|
+
"title": "Grid",
|
|
746
|
+
"code": "<AvatarGroup isGrid max={8}>{avatars}</AvatarGroup>"
|
|
747
|
+
}
|
|
748
|
+
],
|
|
749
|
+
"dependencies": ["@cascivo/core", "@cascivo/components"],
|
|
750
|
+
"tags": ["avatar", "group", "stack", "overflow", "display"],
|
|
751
|
+
"intent": {
|
|
752
|
+
"whenToUse": [
|
|
753
|
+
"Showing several people compactly as an overlapping stack (collaborators, attendees, reviewers)",
|
|
754
|
+
"Capping a long list of avatars with a +N overflow chip",
|
|
755
|
+
"A facepile in a card header, table cell, or activity row"
|
|
756
|
+
],
|
|
757
|
+
"whenNotToUse": [
|
|
758
|
+
"A single identity with a name — use User or Avatar",
|
|
759
|
+
"A selectable list of people — use a list/menu with checkboxes"
|
|
760
|
+
],
|
|
761
|
+
"antiPatterns": [
|
|
762
|
+
{
|
|
763
|
+
"bad": "<AvatarGroup>{hundredsOfAvatars}</AvatarGroup> with no max",
|
|
764
|
+
"good": "<AvatarGroup max={5} total={120}>{avatars}</AvatarGroup>",
|
|
765
|
+
"why": "Without a max the row grows unbounded; a cap plus total keeps it compact and accurate"
|
|
766
|
+
}
|
|
767
|
+
],
|
|
768
|
+
"related": [
|
|
769
|
+
{
|
|
770
|
+
"name": "Avatar",
|
|
771
|
+
"relationship": "contains",
|
|
772
|
+
"reason": "AvatarGroup arranges Avatar children and adds an overflow chip"
|
|
773
|
+
},
|
|
774
|
+
{
|
|
775
|
+
"name": "User",
|
|
776
|
+
"relationship": "alternative",
|
|
777
|
+
"reason": "Use User for a single labelled identity row"
|
|
778
|
+
}
|
|
779
|
+
],
|
|
780
|
+
"a11yRationale": "The stack is a labelled group; the +N chip carries an i18n-defaulted aria-label (\"{count} more\") so the hidden count is announced, not conveyed by the chip text alone",
|
|
781
|
+
"flexibility": [
|
|
782
|
+
{
|
|
783
|
+
"area": "spacing",
|
|
784
|
+
"level": "flexible",
|
|
785
|
+
"note": "Pick the overlap that fits the surrounding density"
|
|
786
|
+
},
|
|
787
|
+
{
|
|
788
|
+
"area": "overflow label",
|
|
789
|
+
"level": "strict",
|
|
790
|
+
"note": "The +N label must come from i18n (builtin.avatarGroup.more or a labels override)"
|
|
791
|
+
}
|
|
792
|
+
]
|
|
793
|
+
}
|
|
794
|
+
}
|
|
795
|
+
},
|
|
550
796
|
{
|
|
551
797
|
"name": "badge",
|
|
552
798
|
"type": "component",
|
|
@@ -581,11 +827,32 @@
|
|
|
581
827
|
}
|
|
582
828
|
],
|
|
583
829
|
"tokens": [
|
|
830
|
+
"--cascivo-font-sans",
|
|
831
|
+
"--cascivo-font-medium",
|
|
832
|
+
"--cascivo-radius-badge",
|
|
833
|
+
"--cascivo-space-1",
|
|
834
|
+
"--cascivo-space-2",
|
|
835
|
+
"--cascivo-space-3",
|
|
836
|
+
"--cascivo-text-xs",
|
|
837
|
+
"--cascivo-leading-normal",
|
|
584
838
|
"--cascivo-color-accent",
|
|
585
|
-
"--cascivo-color-
|
|
586
|
-
"--cascivo-color-
|
|
587
|
-
"--cascivo-color-
|
|
588
|
-
"--cascivo-
|
|
839
|
+
"--cascivo-color-text-on-accent",
|
|
840
|
+
"--cascivo-color-bg-subtle",
|
|
841
|
+
"--cascivo-color-text",
|
|
842
|
+
"--cascivo-color-border",
|
|
843
|
+
"--cascivo-color-border-strong",
|
|
844
|
+
"--cascivo-color-success-subtle",
|
|
845
|
+
"--cascivo-color-success-foreground",
|
|
846
|
+
"--cascivo-color-warning-subtle",
|
|
847
|
+
"--cascivo-color-warning-foreground",
|
|
848
|
+
"--cascivo-color-destructive-subtle",
|
|
849
|
+
"--cascivo-color-destructive-foreground",
|
|
850
|
+
"--cascivo-color-primary",
|
|
851
|
+
"--cascivo-color-primary-content",
|
|
852
|
+
"--cascivo-color-info",
|
|
853
|
+
"--cascivo-color-info-content",
|
|
854
|
+
"--cascivo-color-error",
|
|
855
|
+
"--cascivo-color-error-content"
|
|
589
856
|
],
|
|
590
857
|
"accessibility": {
|
|
591
858
|
"role": "status",
|
|
@@ -920,7 +1187,8 @@
|
|
|
920
1187
|
"--cascivo-color-text-on-accent",
|
|
921
1188
|
"--cascivo-color-destructive",
|
|
922
1189
|
"--cascivo-radius-button",
|
|
923
|
-
"--cascivo-focus-ring"
|
|
1190
|
+
"--cascivo-focus-ring",
|
|
1191
|
+
"--cascivo-disabled-opacity"
|
|
924
1192
|
],
|
|
925
1193
|
"accessibility": {
|
|
926
1194
|
"role": "button",
|
|
@@ -2015,7 +2283,7 @@
|
|
|
2015
2283
|
{
|
|
2016
2284
|
"name": "code-snippet",
|
|
2017
2285
|
"type": "component",
|
|
2018
|
-
"description": "Displays code (inline, single-line, or multi-line) with an optional copy button
|
|
2286
|
+
"description": "Displays code (inline, single-line, or multi-line) with an optional copy button, lightweight built-in syntax highlighting for bash/css/js/ts, and an optional terminal-window look",
|
|
2019
2287
|
"category": "display",
|
|
2020
2288
|
"version": "0.0.0",
|
|
2021
2289
|
"files": [
|
|
@@ -2023,10 +2291,22 @@
|
|
|
2023
2291
|
"https://raw.githubusercontent.com/urbanisierung/cascivo/main/packages/components/src/code-snippet/code-snippet.module.css"
|
|
2024
2292
|
],
|
|
2025
2293
|
"dependencies": ["@cascivo/core", "@cascivo/i18n"],
|
|
2026
|
-
"tags": [
|
|
2294
|
+
"tags": [
|
|
2295
|
+
"display",
|
|
2296
|
+
"code",
|
|
2297
|
+
"snippet",
|
|
2298
|
+
"copy",
|
|
2299
|
+
"pre",
|
|
2300
|
+
"syntax-highlighting",
|
|
2301
|
+
"terminal",
|
|
2302
|
+
"bash",
|
|
2303
|
+
"css",
|
|
2304
|
+
"js",
|
|
2305
|
+
"ts"
|
|
2306
|
+
],
|
|
2027
2307
|
"meta": {
|
|
2028
2308
|
"name": "CodeSnippet",
|
|
2029
|
-
"description": "Displays code (inline, single-line, or multi-line) with an optional copy button
|
|
2309
|
+
"description": "Displays code (inline, single-line, or multi-line) with an optional copy button, lightweight built-in syntax highlighting for bash/css/js/ts, and an optional terminal-window look",
|
|
2030
2310
|
"category": "display",
|
|
2031
2311
|
"states": ["idle", "copied"],
|
|
2032
2312
|
"variants": ["inline", "single", "multi"],
|
|
@@ -2049,7 +2329,19 @@
|
|
|
2049
2329
|
},
|
|
2050
2330
|
"examples": [],
|
|
2051
2331
|
"dependencies": ["@cascivo/core", "@cascivo/i18n"],
|
|
2052
|
-
"tags": [
|
|
2332
|
+
"tags": [
|
|
2333
|
+
"display",
|
|
2334
|
+
"code",
|
|
2335
|
+
"snippet",
|
|
2336
|
+
"copy",
|
|
2337
|
+
"pre",
|
|
2338
|
+
"syntax-highlighting",
|
|
2339
|
+
"terminal",
|
|
2340
|
+
"bash",
|
|
2341
|
+
"css",
|
|
2342
|
+
"js",
|
|
2343
|
+
"ts"
|
|
2344
|
+
],
|
|
2053
2345
|
"intent": {
|
|
2054
2346
|
"whenToUse": [
|
|
2055
2347
|
"Showing a command, token, or path the user is expected to copy",
|
|
@@ -2058,7 +2350,7 @@
|
|
|
2058
2350
|
],
|
|
2059
2351
|
"whenNotToUse": [
|
|
2060
2352
|
"An editable code input — use a textarea or code editor",
|
|
2061
|
-
"
|
|
2353
|
+
"Whole source files needing folding, diagnostics, or many languages — use a dedicated viewer; the built-in highlighter is a presentational scan for bash/css/js/ts only"
|
|
2062
2354
|
],
|
|
2063
2355
|
"antiPatterns": [
|
|
2064
2356
|
{
|
|
@@ -2707,6 +2999,159 @@
|
|
|
2707
2999
|
}
|
|
2708
3000
|
}
|
|
2709
3001
|
},
|
|
3002
|
+
{
|
|
3003
|
+
"name": "comparison",
|
|
3004
|
+
"type": "component",
|
|
3005
|
+
"description": "Reveals the difference between two layers with a draggable divider",
|
|
3006
|
+
"category": "display",
|
|
3007
|
+
"version": "0.0.0",
|
|
3008
|
+
"files": [
|
|
3009
|
+
"https://raw.githubusercontent.com/urbanisierung/cascivo/main/packages/components/src/comparison/comparison.tsx",
|
|
3010
|
+
"https://raw.githubusercontent.com/urbanisierung/cascivo/main/packages/components/src/comparison/comparison.module.css"
|
|
3011
|
+
],
|
|
3012
|
+
"dependencies": ["@cascivo/core", "@cascivo/i18n"],
|
|
3013
|
+
"tags": ["comparison", "before-after", "image", "slider", "display"],
|
|
3014
|
+
"meta": {
|
|
3015
|
+
"name": "Comparison",
|
|
3016
|
+
"description": "Reveals the difference between two layers with a draggable divider",
|
|
3017
|
+
"category": "display",
|
|
3018
|
+
"states": ["default"],
|
|
3019
|
+
"variants": [],
|
|
3020
|
+
"sizes": [],
|
|
3021
|
+
"props": [
|
|
3022
|
+
{
|
|
3023
|
+
"name": "after",
|
|
3024
|
+
"type": "ReactNode",
|
|
3025
|
+
"required": true,
|
|
3026
|
+
"description": "Base layer shown underneath"
|
|
3027
|
+
},
|
|
3028
|
+
{
|
|
3029
|
+
"name": "before",
|
|
3030
|
+
"type": "ReactNode",
|
|
3031
|
+
"required": true,
|
|
3032
|
+
"description": "Top layer revealed up to the divider"
|
|
3033
|
+
},
|
|
3034
|
+
{
|
|
3035
|
+
"name": "position",
|
|
3036
|
+
"type": "number",
|
|
3037
|
+
"required": false,
|
|
3038
|
+
"description": "Divider position 0–100 (controlled)"
|
|
3039
|
+
},
|
|
3040
|
+
{
|
|
3041
|
+
"name": "defaultPosition",
|
|
3042
|
+
"type": "number",
|
|
3043
|
+
"required": false,
|
|
3044
|
+
"default": "50"
|
|
3045
|
+
},
|
|
3046
|
+
{
|
|
3047
|
+
"name": "onPositionChange",
|
|
3048
|
+
"type": "(position: number) => void",
|
|
3049
|
+
"required": false
|
|
3050
|
+
},
|
|
3051
|
+
{
|
|
3052
|
+
"name": "orientation",
|
|
3053
|
+
"type": "'horizontal' | 'vertical'",
|
|
3054
|
+
"required": false,
|
|
3055
|
+
"default": "horizontal"
|
|
3056
|
+
},
|
|
3057
|
+
{
|
|
3058
|
+
"name": "keyboardStep",
|
|
3059
|
+
"type": "number",
|
|
3060
|
+
"required": false,
|
|
3061
|
+
"default": "5"
|
|
3062
|
+
},
|
|
3063
|
+
{
|
|
3064
|
+
"name": "label",
|
|
3065
|
+
"type": "string",
|
|
3066
|
+
"required": false
|
|
3067
|
+
}
|
|
3068
|
+
],
|
|
3069
|
+
"tokens": [
|
|
3070
|
+
"--cascivo-radius-md",
|
|
3071
|
+
"--cascivo-radius-full",
|
|
3072
|
+
"--cascivo-color-surface",
|
|
3073
|
+
"--cascivo-color-border",
|
|
3074
|
+
"--cascivo-color-focus-ring",
|
|
3075
|
+
"--cascivo-shadow-sm",
|
|
3076
|
+
"--cascivo-target-min-coarse"
|
|
3077
|
+
],
|
|
3078
|
+
"accessibility": {
|
|
3079
|
+
"role": "slider",
|
|
3080
|
+
"wcag": "2.2-AA",
|
|
3081
|
+
"keyboard": [
|
|
3082
|
+
"ArrowLeft",
|
|
3083
|
+
"ArrowRight",
|
|
3084
|
+
"ArrowUp",
|
|
3085
|
+
"ArrowDown",
|
|
3086
|
+
"Home",
|
|
3087
|
+
"End",
|
|
3088
|
+
"PageUp",
|
|
3089
|
+
"PageDown"
|
|
3090
|
+
],
|
|
3091
|
+
"apgPattern": "slider"
|
|
3092
|
+
},
|
|
3093
|
+
"examples": [
|
|
3094
|
+
{
|
|
3095
|
+
"title": "Image before/after",
|
|
3096
|
+
"code": "<Comparison before={<img src=\"/edited.jpg\" alt=\"\" />} after={<img src=\"/original.jpg\" alt=\"Original\" />} label=\"Reveal edited image\" />"
|
|
3097
|
+
},
|
|
3098
|
+
{
|
|
3099
|
+
"title": "Vertical",
|
|
3100
|
+
"code": "<Comparison orientation=\"vertical\" before={<Before />} after={<After />} />"
|
|
3101
|
+
},
|
|
3102
|
+
{
|
|
3103
|
+
"title": "Controlled",
|
|
3104
|
+
"code": "<Comparison position={position} onPositionChange={setPosition} before={<Before />} after={<After />} />"
|
|
3105
|
+
}
|
|
3106
|
+
],
|
|
3107
|
+
"dependencies": ["@cascivo/core", "@cascivo/i18n"],
|
|
3108
|
+
"tags": ["comparison", "before-after", "image", "slider", "display"],
|
|
3109
|
+
"intent": {
|
|
3110
|
+
"whenToUse": [
|
|
3111
|
+
"Showing the difference between two versions of similar content (before/after edits, original vs processed)",
|
|
3112
|
+
"Letting users interactively reveal one image or panel over another",
|
|
3113
|
+
"Side-by-side visual demos where a draggable divider is clearer than two static images"
|
|
3114
|
+
],
|
|
3115
|
+
"whenNotToUse": [
|
|
3116
|
+
"Comparing more than two items — use a layout or table instead",
|
|
3117
|
+
"Non-visual data comparison — use a table or chart",
|
|
3118
|
+
"Static side-by-side images with no need for an interactive reveal"
|
|
3119
|
+
],
|
|
3120
|
+
"antiPatterns": [
|
|
3121
|
+
{
|
|
3122
|
+
"bad": "<Comparison before={<Before />} after={<After />} /> with no label",
|
|
3123
|
+
"good": "<Comparison label=\"Reveal edited photo\" before={<Before />} after={<After />} />",
|
|
3124
|
+
"why": "The divider is a slider; without a label assistive tech announces an unnamed control"
|
|
3125
|
+
}
|
|
3126
|
+
],
|
|
3127
|
+
"related": [
|
|
3128
|
+
{
|
|
3129
|
+
"name": "Slider",
|
|
3130
|
+
"relationship": "alternative",
|
|
3131
|
+
"reason": "Use Slider for selecting a numeric value rather than revealing layered content"
|
|
3132
|
+
},
|
|
3133
|
+
{
|
|
3134
|
+
"name": "Carousel",
|
|
3135
|
+
"relationship": "alternative",
|
|
3136
|
+
"reason": "Use Carousel to step through more than two pieces of content"
|
|
3137
|
+
}
|
|
3138
|
+
],
|
|
3139
|
+
"a11yRationale": "The divider is a role=\"slider\" with aria-valuemin/max/now and full keyboard support (Arrow/Home/End/PageUp/PageDown); aria-orientation reflects the axis so the value and direction are conveyed without sight",
|
|
3140
|
+
"flexibility": [
|
|
3141
|
+
{
|
|
3142
|
+
"area": "orientation",
|
|
3143
|
+
"level": "flexible",
|
|
3144
|
+
"note": "Horizontal or vertical depending on the content"
|
|
3145
|
+
},
|
|
3146
|
+
{
|
|
3147
|
+
"area": "label",
|
|
3148
|
+
"level": "strict",
|
|
3149
|
+
"note": "Provide a label (or rely on the i18n default) so the slider is named"
|
|
3150
|
+
}
|
|
3151
|
+
]
|
|
3152
|
+
}
|
|
3153
|
+
}
|
|
3154
|
+
},
|
|
2710
3155
|
{
|
|
2711
3156
|
"name": "contained-list",
|
|
2712
3157
|
"type": "component",
|
|
@@ -5126,7 +5571,7 @@
|
|
|
5126
5571
|
}
|
|
5127
5572
|
],
|
|
5128
5573
|
"tokens": [
|
|
5129
|
-
"--cascivo-font-
|
|
5574
|
+
"--cascivo-font-display",
|
|
5130
5575
|
"--cascivo-font-semibold",
|
|
5131
5576
|
"--cascivo-leading-tight",
|
|
5132
5577
|
"--cascivo-tracking-tight",
|
|
@@ -5340,99 +5785,252 @@
|
|
|
5340
5785
|
"name": "asChild",
|
|
5341
5786
|
"type": "boolean",
|
|
5342
5787
|
"required": false,
|
|
5343
|
-
"default": "false"
|
|
5788
|
+
"default": "false"
|
|
5789
|
+
},
|
|
5790
|
+
{
|
|
5791
|
+
"name": "disabled",
|
|
5792
|
+
"type": "boolean",
|
|
5793
|
+
"required": false,
|
|
5794
|
+
"default": "false"
|
|
5795
|
+
},
|
|
5796
|
+
{
|
|
5797
|
+
"name": "onClick",
|
|
5798
|
+
"type": "React.MouseEventHandler<HTMLButtonElement>",
|
|
5799
|
+
"required": false
|
|
5800
|
+
}
|
|
5801
|
+
],
|
|
5802
|
+
"tokens": [
|
|
5803
|
+
"--cascivo-control-height-sm",
|
|
5804
|
+
"--cascivo-control-height-md",
|
|
5805
|
+
"--cascivo-control-height-lg",
|
|
5806
|
+
"--cascivo-button-radius",
|
|
5807
|
+
"--cascivo-radius-control",
|
|
5808
|
+
"--cascivo-color-primary",
|
|
5809
|
+
"--cascivo-color-primary-fg",
|
|
5810
|
+
"--cascivo-color-bg-subtle",
|
|
5811
|
+
"--cascivo-color-border",
|
|
5812
|
+
"--cascivo-color-surface",
|
|
5813
|
+
"--cascivo-focus-ring"
|
|
5814
|
+
],
|
|
5815
|
+
"accessibility": {
|
|
5816
|
+
"role": "button",
|
|
5817
|
+
"wcag": "2.2-AA",
|
|
5818
|
+
"keyboard": ["Enter", "Space"],
|
|
5819
|
+
"apgPattern": "button",
|
|
5820
|
+
"forcedColors": true
|
|
5821
|
+
},
|
|
5822
|
+
"examples": [
|
|
5823
|
+
{
|
|
5824
|
+
"title": "Ghost",
|
|
5825
|
+
"code": "<IconButton label=\"Settings\"><GearIcon /></IconButton>"
|
|
5826
|
+
},
|
|
5827
|
+
{
|
|
5828
|
+
"title": "Filled",
|
|
5829
|
+
"code": "<IconButton label=\"Add\" variant=\"filled\" icon={<PlusIcon />} />"
|
|
5830
|
+
},
|
|
5831
|
+
{
|
|
5832
|
+
"title": "As link",
|
|
5833
|
+
"code": "<IconButton label=\"Home\" asChild><a href=\"/\"><HomeIcon /></a></IconButton>"
|
|
5834
|
+
}
|
|
5835
|
+
],
|
|
5836
|
+
"dependencies": ["@cascivo/core"],
|
|
5837
|
+
"tags": ["action", "icon", "compact", "toolbar"],
|
|
5838
|
+
"intent": {
|
|
5839
|
+
"whenToUse": [
|
|
5840
|
+
"A compact, recognizable action where an icon alone communicates intent (close, edit, more)",
|
|
5841
|
+
"Dense toolbars or table rows where a text label would not fit"
|
|
5842
|
+
],
|
|
5843
|
+
"whenNotToUse": [
|
|
5844
|
+
"The action is not universally recognizable by its icon — use a Button with a text label",
|
|
5845
|
+
"Navigating between pages — use an anchor (optionally via asChild)"
|
|
5846
|
+
],
|
|
5847
|
+
"antiPatterns": [
|
|
5848
|
+
{
|
|
5849
|
+
"bad": "<IconButton label=\"\"><TrashIcon /></IconButton>",
|
|
5850
|
+
"good": "<IconButton label=\"Delete item\"><TrashIcon /></IconButton>",
|
|
5851
|
+
"why": "An icon-only control has no visible text, so the label prop is the only accessible name screen readers can announce"
|
|
5852
|
+
}
|
|
5853
|
+
],
|
|
5854
|
+
"related": [
|
|
5855
|
+
{
|
|
5856
|
+
"name": "Button",
|
|
5857
|
+
"relationship": "alternative",
|
|
5858
|
+
"reason": "Use a Button when the action needs a visible text label"
|
|
5859
|
+
},
|
|
5860
|
+
{
|
|
5861
|
+
"name": "ButtonGroup",
|
|
5862
|
+
"relationship": "contained-by",
|
|
5863
|
+
"reason": "Icon buttons are commonly joined into a toolbar via ButtonGroup"
|
|
5864
|
+
}
|
|
5865
|
+
],
|
|
5866
|
+
"a11yRationale": "Renders a native <button> with a mandatory aria-label so the icon-only control always exposes an accessible name; focus, role, and Enter/Space activation come from the platform",
|
|
5867
|
+
"content": {
|
|
5868
|
+
"tone": "Imperative verb describing the action",
|
|
5869
|
+
"notes": "The label is announced to screen readers; be specific (e.g. \"Delete item\", not \"Delete\")"
|
|
5870
|
+
},
|
|
5871
|
+
"flexibility": [
|
|
5872
|
+
{
|
|
5873
|
+
"area": "token names",
|
|
5874
|
+
"level": "strict",
|
|
5875
|
+
"note": "Sizing must resolve to --cascivo-control-height-* so it stays square and aligned with other controls"
|
|
5876
|
+
},
|
|
5877
|
+
{
|
|
5878
|
+
"area": "icon choice",
|
|
5879
|
+
"level": "flexible",
|
|
5880
|
+
"note": "Any single icon node; consumer owns the icon set"
|
|
5881
|
+
}
|
|
5882
|
+
]
|
|
5883
|
+
}
|
|
5884
|
+
}
|
|
5885
|
+
},
|
|
5886
|
+
{
|
|
5887
|
+
"name": "image",
|
|
5888
|
+
"type": "component",
|
|
5889
|
+
"description": "Image with load state, blur-up placeholder, graceful fallback, and optional zoom",
|
|
5890
|
+
"category": "display",
|
|
5891
|
+
"version": "0.0.0",
|
|
5892
|
+
"files": [
|
|
5893
|
+
"https://raw.githubusercontent.com/urbanisierung/cascivo/main/packages/components/src/image/image.tsx",
|
|
5894
|
+
"https://raw.githubusercontent.com/urbanisierung/cascivo/main/packages/components/src/image/image.module.css"
|
|
5895
|
+
],
|
|
5896
|
+
"dependencies": ["@cascivo/core"],
|
|
5897
|
+
"tags": ["image", "media", "display", "loading"],
|
|
5898
|
+
"meta": {
|
|
5899
|
+
"name": "Image",
|
|
5900
|
+
"description": "Image with load state, blur-up placeholder, graceful fallback, and optional zoom",
|
|
5901
|
+
"category": "display",
|
|
5902
|
+
"states": ["loading", "loaded", "error"],
|
|
5903
|
+
"variants": [],
|
|
5904
|
+
"sizes": [],
|
|
5905
|
+
"props": [
|
|
5906
|
+
{
|
|
5907
|
+
"name": "src",
|
|
5908
|
+
"type": "string",
|
|
5909
|
+
"required": false
|
|
5910
|
+
},
|
|
5911
|
+
{
|
|
5912
|
+
"name": "alt",
|
|
5913
|
+
"type": "string",
|
|
5914
|
+
"required": false
|
|
5915
|
+
},
|
|
5916
|
+
{
|
|
5917
|
+
"name": "fallbackSrc",
|
|
5918
|
+
"type": "string",
|
|
5919
|
+
"required": false,
|
|
5920
|
+
"description": "Image shown if src fails to load"
|
|
5921
|
+
},
|
|
5922
|
+
{
|
|
5923
|
+
"name": "width",
|
|
5924
|
+
"type": "string | number",
|
|
5925
|
+
"required": false
|
|
5926
|
+
},
|
|
5927
|
+
{
|
|
5928
|
+
"name": "height",
|
|
5929
|
+
"type": "string | number",
|
|
5930
|
+
"required": false
|
|
5931
|
+
},
|
|
5932
|
+
{
|
|
5933
|
+
"name": "radius",
|
|
5934
|
+
"type": "'none' | 'sm' | 'md' | 'lg' | 'full'",
|
|
5935
|
+
"required": false,
|
|
5936
|
+
"default": "md"
|
|
5937
|
+
},
|
|
5938
|
+
{
|
|
5939
|
+
"name": "zoom",
|
|
5940
|
+
"type": "boolean",
|
|
5941
|
+
"required": false,
|
|
5942
|
+
"default": "false"
|
|
5943
|
+
},
|
|
5944
|
+
{
|
|
5945
|
+
"name": "removeWrapper",
|
|
5946
|
+
"type": "boolean",
|
|
5947
|
+
"required": false,
|
|
5948
|
+
"default": "false",
|
|
5949
|
+
"description": "Render a bare <img> with no wrapper, placeholder, or zoom"
|
|
5344
5950
|
},
|
|
5345
5951
|
{
|
|
5346
|
-
"name": "
|
|
5952
|
+
"name": "isBlurred",
|
|
5347
5953
|
"type": "boolean",
|
|
5348
5954
|
"required": false,
|
|
5349
5955
|
"default": "false"
|
|
5350
|
-
},
|
|
5351
|
-
{
|
|
5352
|
-
"name": "onClick",
|
|
5353
|
-
"type": "React.MouseEventHandler<HTMLButtonElement>",
|
|
5354
|
-
"required": false
|
|
5355
5956
|
}
|
|
5356
5957
|
],
|
|
5357
5958
|
"tokens": [
|
|
5358
|
-
"--cascivo-
|
|
5359
|
-
"--cascivo-
|
|
5360
|
-
"--cascivo-
|
|
5361
|
-
"--cascivo-
|
|
5362
|
-
"--cascivo-radius-
|
|
5363
|
-
"--cascivo-color-primary",
|
|
5364
|
-
"--cascivo-color-primary-fg",
|
|
5959
|
+
"--cascivo-radius-none",
|
|
5960
|
+
"--cascivo-radius-sm",
|
|
5961
|
+
"--cascivo-radius-md",
|
|
5962
|
+
"--cascivo-radius-lg",
|
|
5963
|
+
"--cascivo-radius-full",
|
|
5365
5964
|
"--cascivo-color-bg-subtle",
|
|
5366
5965
|
"--cascivo-color-border",
|
|
5367
|
-
"--cascivo-
|
|
5368
|
-
"--cascivo-focus-ring"
|
|
5966
|
+
"--cascivo-space-12"
|
|
5369
5967
|
],
|
|
5370
5968
|
"accessibility": {
|
|
5371
|
-
"role": "
|
|
5969
|
+
"role": "img",
|
|
5372
5970
|
"wcag": "2.2-AA",
|
|
5373
|
-
"keyboard": [
|
|
5374
|
-
"
|
|
5375
|
-
"forcedColors": true
|
|
5971
|
+
"keyboard": [],
|
|
5972
|
+
"reducedMotion": true
|
|
5376
5973
|
},
|
|
5377
5974
|
"examples": [
|
|
5378
5975
|
{
|
|
5379
|
-
"title": "
|
|
5380
|
-
"code": "<
|
|
5976
|
+
"title": "Basic",
|
|
5977
|
+
"code": "<Image src=\"/photo.jpg\" alt=\"A photo\" width={320} height={240} />"
|
|
5381
5978
|
},
|
|
5382
5979
|
{
|
|
5383
|
-
"title": "
|
|
5384
|
-
"code": "<
|
|
5980
|
+
"title": "With fallback",
|
|
5981
|
+
"code": "<Image src=\"/broken.jpg\" fallbackSrc=\"/placeholder.jpg\" alt=\"A photo\" />"
|
|
5385
5982
|
},
|
|
5386
5983
|
{
|
|
5387
|
-
"title": "
|
|
5388
|
-
"code": "<
|
|
5984
|
+
"title": "Blurred placeholder",
|
|
5985
|
+
"code": "<Image src=\"/photo.jpg\" alt=\"A photo\" isBlurred />"
|
|
5986
|
+
},
|
|
5987
|
+
{
|
|
5988
|
+
"title": "Hover zoom",
|
|
5989
|
+
"code": "<Image src=\"/photo.jpg\" alt=\"A photo\" zoom />"
|
|
5389
5990
|
}
|
|
5390
5991
|
],
|
|
5391
5992
|
"dependencies": ["@cascivo/core"],
|
|
5392
|
-
"tags": ["
|
|
5993
|
+
"tags": ["image", "media", "display", "loading"],
|
|
5393
5994
|
"intent": {
|
|
5394
5995
|
"whenToUse": [
|
|
5395
|
-
"
|
|
5396
|
-
"
|
|
5996
|
+
"Displaying a content image that should show a placeholder while loading and degrade gracefully on error",
|
|
5997
|
+
"Photos, thumbnails, or media that benefit from a blur-up placeholder or hover zoom",
|
|
5998
|
+
"Any image where a broken src should fall back rather than show a broken-image icon"
|
|
5397
5999
|
],
|
|
5398
6000
|
"whenNotToUse": [
|
|
5399
|
-
"
|
|
5400
|
-
"
|
|
6001
|
+
"Identity thumbnails for a person or entity — use Avatar",
|
|
6002
|
+
"Purely decorative shapes or a fixed-ratio layout box with no load behavior — use AspectRatio"
|
|
5401
6003
|
],
|
|
5402
6004
|
"antiPatterns": [
|
|
5403
6005
|
{
|
|
5404
|
-
"bad": "<
|
|
5405
|
-
"good": "<
|
|
5406
|
-
"why": "
|
|
6006
|
+
"bad": "<Image src=\"/photo.jpg\" /> with no alt",
|
|
6007
|
+
"good": "<Image src=\"/photo.jpg\" alt=\"Sunset over the bay\" />",
|
|
6008
|
+
"why": "Without alt the image is invisible to assistive tech; pass an empty alt only for decorative images"
|
|
5407
6009
|
}
|
|
5408
6010
|
],
|
|
5409
6011
|
"related": [
|
|
5410
6012
|
{
|
|
5411
|
-
"name": "
|
|
6013
|
+
"name": "Avatar",
|
|
5412
6014
|
"relationship": "alternative",
|
|
5413
|
-
"reason": "Use
|
|
6015
|
+
"reason": "Use Avatar for identity thumbnails with an initials fallback"
|
|
5414
6016
|
},
|
|
5415
6017
|
{
|
|
5416
|
-
"name": "
|
|
5417
|
-
"relationship": "
|
|
5418
|
-
"reason": "
|
|
6018
|
+
"name": "AspectRatio",
|
|
6019
|
+
"relationship": "alternative",
|
|
6020
|
+
"reason": "Use AspectRatio for a ratio box that does not own image load behavior"
|
|
5419
6021
|
}
|
|
5420
6022
|
],
|
|
5421
|
-
"a11yRationale": "
|
|
5422
|
-
"content": {
|
|
5423
|
-
"tone": "Imperative verb describing the action",
|
|
5424
|
-
"notes": "The label is announced to screen readers; be specific (e.g. \"Delete item\", not \"Delete\")"
|
|
5425
|
-
},
|
|
6023
|
+
"a11yRationale": "role=\"img\" with alt names the image; on error it shows a fallback image or neutral box so layout survives; the blur-up and zoom transitions are disabled under prefers-reduced-motion",
|
|
5426
6024
|
"flexibility": [
|
|
5427
6025
|
{
|
|
5428
|
-
"area": "
|
|
5429
|
-
"level": "
|
|
5430
|
-
"note": "
|
|
6026
|
+
"area": "radius",
|
|
6027
|
+
"level": "flexible",
|
|
6028
|
+
"note": "Pick the corner radius that matches the surrounding surface"
|
|
5431
6029
|
},
|
|
5432
6030
|
{
|
|
5433
|
-
"area": "
|
|
5434
|
-
"level": "
|
|
5435
|
-
"note": "
|
|
6031
|
+
"area": "token names",
|
|
6032
|
+
"level": "strict",
|
|
6033
|
+
"note": "Radius and placeholder colors must resolve to --cascivo-* tokens"
|
|
5436
6034
|
}
|
|
5437
6035
|
]
|
|
5438
6036
|
}
|
|
@@ -6994,6 +7592,13 @@
|
|
|
6994
7592
|
"type": "'sm' | 'md' | 'lg'",
|
|
6995
7593
|
"required": false,
|
|
6996
7594
|
"default": "md"
|
|
7595
|
+
},
|
|
7596
|
+
{
|
|
7597
|
+
"name": "draggable",
|
|
7598
|
+
"type": "boolean",
|
|
7599
|
+
"required": false,
|
|
7600
|
+
"default": "false",
|
|
7601
|
+
"description": "Allow dragging the dialog by its header"
|
|
6997
7602
|
}
|
|
6998
7603
|
],
|
|
6999
7604
|
"tokens": [
|
|
@@ -8961,6 +9566,131 @@
|
|
|
8961
9566
|
}
|
|
8962
9567
|
}
|
|
8963
9568
|
},
|
|
9569
|
+
{
|
|
9570
|
+
"name": "qr-code",
|
|
9571
|
+
"type": "component",
|
|
9572
|
+
"description": "Encodes a URL or short text into a scannable SVG QR code",
|
|
9573
|
+
"category": "display",
|
|
9574
|
+
"version": "0.0.0",
|
|
9575
|
+
"files": [
|
|
9576
|
+
"https://raw.githubusercontent.com/urbanisierung/cascivo/main/packages/components/src/qr-code/qr-code.tsx",
|
|
9577
|
+
"https://raw.githubusercontent.com/urbanisierung/cascivo/main/packages/components/src/qr-code/qr-code.module.css"
|
|
9578
|
+
],
|
|
9579
|
+
"dependencies": ["@cascivo/core", "@cascivo/i18n"],
|
|
9580
|
+
"tags": ["qr", "qr-code", "barcode", "encode", "display"],
|
|
9581
|
+
"meta": {
|
|
9582
|
+
"name": "QrCode",
|
|
9583
|
+
"description": "Encodes a URL or short text into a scannable SVG QR code",
|
|
9584
|
+
"category": "display",
|
|
9585
|
+
"states": ["default"],
|
|
9586
|
+
"variants": [],
|
|
9587
|
+
"sizes": [],
|
|
9588
|
+
"props": [
|
|
9589
|
+
{
|
|
9590
|
+
"name": "value",
|
|
9591
|
+
"type": "string",
|
|
9592
|
+
"required": true,
|
|
9593
|
+
"description": "Text or URL to encode"
|
|
9594
|
+
},
|
|
9595
|
+
{
|
|
9596
|
+
"name": "size",
|
|
9597
|
+
"type": "number",
|
|
9598
|
+
"required": false,
|
|
9599
|
+
"default": "128"
|
|
9600
|
+
},
|
|
9601
|
+
{
|
|
9602
|
+
"name": "errorCorrection",
|
|
9603
|
+
"type": "'L' | 'M' | 'Q' | 'H'",
|
|
9604
|
+
"required": false,
|
|
9605
|
+
"default": "M",
|
|
9606
|
+
"description": "Higher levels tolerate more damage but hold less data"
|
|
9607
|
+
},
|
|
9608
|
+
{
|
|
9609
|
+
"name": "radius",
|
|
9610
|
+
"type": "string",
|
|
9611
|
+
"required": false,
|
|
9612
|
+
"description": "CSS length rounding the corners"
|
|
9613
|
+
},
|
|
9614
|
+
{
|
|
9615
|
+
"name": "fill",
|
|
9616
|
+
"type": "string",
|
|
9617
|
+
"required": false,
|
|
9618
|
+
"default": "currentColor"
|
|
9619
|
+
},
|
|
9620
|
+
{
|
|
9621
|
+
"name": "background",
|
|
9622
|
+
"type": "string",
|
|
9623
|
+
"required": false,
|
|
9624
|
+
"default": "transparent"
|
|
9625
|
+
},
|
|
9626
|
+
{
|
|
9627
|
+
"name": "label",
|
|
9628
|
+
"type": "string",
|
|
9629
|
+
"required": false
|
|
9630
|
+
}
|
|
9631
|
+
],
|
|
9632
|
+
"tokens": ["--cascivo-color-text"],
|
|
9633
|
+
"accessibility": {
|
|
9634
|
+
"role": "img",
|
|
9635
|
+
"wcag": "2.2-AA",
|
|
9636
|
+
"keyboard": []
|
|
9637
|
+
},
|
|
9638
|
+
"examples": [
|
|
9639
|
+
{
|
|
9640
|
+
"title": "URL",
|
|
9641
|
+
"code": "<QrCode value=\"https://cascivo.dev\" />"
|
|
9642
|
+
},
|
|
9643
|
+
{
|
|
9644
|
+
"title": "High error correction",
|
|
9645
|
+
"code": "<QrCode value=\"https://cascivo.dev\" errorCorrection=\"H\" size={200} />"
|
|
9646
|
+
},
|
|
9647
|
+
{
|
|
9648
|
+
"title": "Custom colors",
|
|
9649
|
+
"code": "<QrCode value=\"cascivo\" fill=\"var(--cascivo-color-accent)\" background=\"var(--cascivo-color-surface)\" />"
|
|
9650
|
+
}
|
|
9651
|
+
],
|
|
9652
|
+
"dependencies": ["@cascivo/core", "@cascivo/i18n"],
|
|
9653
|
+
"tags": ["qr", "qr-code", "barcode", "encode", "display"],
|
|
9654
|
+
"intent": {
|
|
9655
|
+
"whenToUse": [
|
|
9656
|
+
"Letting users scan a URL, contact, or short token with a phone camera",
|
|
9657
|
+
"Bridging print or screen to a digital destination",
|
|
9658
|
+
"Sharing a link where typing it would be error-prone"
|
|
9659
|
+
],
|
|
9660
|
+
"whenNotToUse": [
|
|
9661
|
+
"Encoding long or sensitive payloads — QR codes are public and capacity-limited",
|
|
9662
|
+
"Where a plain, copyable link or button is more accessible"
|
|
9663
|
+
],
|
|
9664
|
+
"antiPatterns": [
|
|
9665
|
+
{
|
|
9666
|
+
"bad": "<QrCode value={veryLongString} />",
|
|
9667
|
+
"good": "<QrCode value=\"https://cascivo.dev/s/abc\" />",
|
|
9668
|
+
"why": "Long payloads force a dense, hard-to-scan code; encode a short URL that redirects instead"
|
|
9669
|
+
}
|
|
9670
|
+
],
|
|
9671
|
+
"related": [
|
|
9672
|
+
{
|
|
9673
|
+
"name": "CopyButton",
|
|
9674
|
+
"relationship": "pairs-with",
|
|
9675
|
+
"reason": "Offer a copyable link alongside the QR code for non-camera contexts"
|
|
9676
|
+
}
|
|
9677
|
+
],
|
|
9678
|
+
"a11yRationale": "Rendered as role=\"img\" with an accessible label so screen-reader users know a QR code is present; the underlying link should also be available as text since a QR code is not operable by assistive tech",
|
|
9679
|
+
"flexibility": [
|
|
9680
|
+
{
|
|
9681
|
+
"area": "errorCorrection",
|
|
9682
|
+
"level": "flexible",
|
|
9683
|
+
"note": "Raise to Q/H when the code may be printed small or partially obscured"
|
|
9684
|
+
},
|
|
9685
|
+
{
|
|
9686
|
+
"area": "colors",
|
|
9687
|
+
"level": "flexible",
|
|
9688
|
+
"note": "Defaults to currentColor; keep sufficient contrast between fill and background to stay scannable"
|
|
9689
|
+
}
|
|
9690
|
+
]
|
|
9691
|
+
}
|
|
9692
|
+
}
|
|
9693
|
+
},
|
|
8964
9694
|
{
|
|
8965
9695
|
"name": "radial-progress",
|
|
8966
9696
|
"type": "component",
|
|
@@ -9377,83 +10107,188 @@
|
|
|
9377
10107
|
"name": "disabled",
|
|
9378
10108
|
"type": "boolean",
|
|
9379
10109
|
"required": false,
|
|
9380
|
-
"default": "false"
|
|
10110
|
+
"default": "false"
|
|
10111
|
+
},
|
|
10112
|
+
{
|
|
10113
|
+
"name": "readOnly",
|
|
10114
|
+
"type": "boolean",
|
|
10115
|
+
"required": false,
|
|
10116
|
+
"default": "false"
|
|
10117
|
+
},
|
|
10118
|
+
{
|
|
10119
|
+
"name": "labels",
|
|
10120
|
+
"type": "RatingGroupLabels",
|
|
10121
|
+
"required": false
|
|
10122
|
+
}
|
|
10123
|
+
],
|
|
10124
|
+
"tokens": [
|
|
10125
|
+
"--cascivo-color-warning",
|
|
10126
|
+
"--cascivo-color-border-strong",
|
|
10127
|
+
"--cascivo-color-accent",
|
|
10128
|
+
"--cascivo-radius-sm"
|
|
10129
|
+
],
|
|
10130
|
+
"accessibility": {
|
|
10131
|
+
"role": "radiogroup",
|
|
10132
|
+
"wcag": "2.2-AA",
|
|
10133
|
+
"keyboard": ["Tab", "Space", "Enter"]
|
|
10134
|
+
},
|
|
10135
|
+
"examples": [
|
|
10136
|
+
{
|
|
10137
|
+
"title": "Basic",
|
|
10138
|
+
"code": "<RatingGroup value={3} onValueChange={() => {}} />"
|
|
10139
|
+
},
|
|
10140
|
+
{
|
|
10141
|
+
"title": "Read only",
|
|
10142
|
+
"code": "<RatingGroup value={4} readOnly />"
|
|
10143
|
+
}
|
|
10144
|
+
],
|
|
10145
|
+
"dependencies": ["@cascivo/core"],
|
|
10146
|
+
"tags": ["form", "rating", "stars", "input", "feedback"],
|
|
10147
|
+
"intent": {
|
|
10148
|
+
"whenToUse": [
|
|
10149
|
+
"Capturing a discrete subjective rating on a small fixed scale (e.g. 1–5 stars)",
|
|
10150
|
+
"Displaying an existing rating read-only as a compact star summary"
|
|
10151
|
+
],
|
|
10152
|
+
"whenNotToUse": [
|
|
10153
|
+
"Choosing along a continuous or large numeric range — use Slider",
|
|
10154
|
+
"Entering an exact bounded number with steppers — use NumberInput",
|
|
10155
|
+
"A non-rating single choice among labeled options — use Radio or SegmentedControl"
|
|
10156
|
+
],
|
|
10157
|
+
"antiPatterns": [
|
|
10158
|
+
{
|
|
10159
|
+
"bad": "<Slider min={1} max={5} step={1} /> labeled as a star rating",
|
|
10160
|
+
"good": "<RatingGroup value={rating} onValueChange={setRating} />",
|
|
10161
|
+
"why": "A slider communicates a continuous magnitude; RatingGroup uses radio semantics so each star is an exclusive discrete choice announced as \"N of M stars\""
|
|
10162
|
+
}
|
|
10163
|
+
],
|
|
10164
|
+
"related": [
|
|
10165
|
+
{
|
|
10166
|
+
"name": "Slider",
|
|
10167
|
+
"relationship": "alternative",
|
|
10168
|
+
"reason": "Use for continuous or larger numeric ranges"
|
|
10169
|
+
},
|
|
10170
|
+
{
|
|
10171
|
+
"name": "NumberInput",
|
|
10172
|
+
"relationship": "alternative",
|
|
10173
|
+
"reason": "Use when an exact typed number is needed rather than a rating"
|
|
10174
|
+
}
|
|
10175
|
+
],
|
|
10176
|
+
"a11yRationale": "Each star is a <button role=\"radio\"> inside a role=\"radiogroup\" with aria-checked on the selected value and an aria-label like \"3 of 5 stars\"; when readOnly or disabled the stars drop out of the tab order so a non-interactive rating is not announced as actionable.",
|
|
10177
|
+
"flexibility": [
|
|
10178
|
+
{
|
|
10179
|
+
"area": "token names",
|
|
10180
|
+
"level": "strict",
|
|
10181
|
+
"note": "Star styling must resolve to the listed --cascivo-* tokens"
|
|
10182
|
+
},
|
|
10183
|
+
{
|
|
10184
|
+
"area": "scale and labels",
|
|
10185
|
+
"level": "flexible",
|
|
10186
|
+
"note": "max sets the scale and labels.rating customizes the per-star announcement"
|
|
10187
|
+
}
|
|
10188
|
+
]
|
|
10189
|
+
}
|
|
10190
|
+
}
|
|
10191
|
+
},
|
|
10192
|
+
{
|
|
10193
|
+
"name": "relative-time",
|
|
10194
|
+
"type": "component",
|
|
10195
|
+
"description": "Displays a date as a localized phrase relative to now, auto-updating",
|
|
10196
|
+
"category": "display",
|
|
10197
|
+
"version": "0.0.0",
|
|
10198
|
+
"files": [
|
|
10199
|
+
"https://raw.githubusercontent.com/urbanisierung/cascivo/main/packages/components/src/relative-time/relative-time.tsx",
|
|
10200
|
+
"https://raw.githubusercontent.com/urbanisierung/cascivo/main/packages/components/src/relative-time/relative-time.module.css"
|
|
10201
|
+
],
|
|
10202
|
+
"dependencies": ["@cascivo/core", "@cascivo/i18n"],
|
|
10203
|
+
"tags": ["time", "date", "relative", "i18n", "display"],
|
|
10204
|
+
"meta": {
|
|
10205
|
+
"name": "RelativeTime",
|
|
10206
|
+
"description": "Displays a date as a localized phrase relative to now, auto-updating",
|
|
10207
|
+
"category": "display",
|
|
10208
|
+
"states": ["default"],
|
|
10209
|
+
"variants": [],
|
|
10210
|
+
"sizes": [],
|
|
10211
|
+
"props": [
|
|
10212
|
+
{
|
|
10213
|
+
"name": "date",
|
|
10214
|
+
"type": "Date | number | string",
|
|
10215
|
+
"required": true
|
|
10216
|
+
},
|
|
10217
|
+
{
|
|
10218
|
+
"name": "sync",
|
|
10219
|
+
"type": "boolean",
|
|
10220
|
+
"required": false,
|
|
10221
|
+
"default": "true"
|
|
9381
10222
|
},
|
|
9382
10223
|
{
|
|
9383
|
-
"name": "
|
|
9384
|
-
"type": "
|
|
10224
|
+
"name": "now",
|
|
10225
|
+
"type": "number",
|
|
9385
10226
|
"required": false,
|
|
9386
|
-
"
|
|
10227
|
+
"description": "Override \"now\" (ms); disables the interval"
|
|
9387
10228
|
},
|
|
9388
10229
|
{
|
|
9389
|
-
"name": "
|
|
9390
|
-
"type": "
|
|
10230
|
+
"name": "format",
|
|
10231
|
+
"type": "Intl.RelativeTimeFormatOptions",
|
|
9391
10232
|
"required": false
|
|
9392
10233
|
}
|
|
9393
10234
|
],
|
|
9394
|
-
"tokens": [
|
|
9395
|
-
"--cascivo-color-warning",
|
|
9396
|
-
"--cascivo-color-border-strong",
|
|
9397
|
-
"--cascivo-color-accent",
|
|
9398
|
-
"--cascivo-radius-sm"
|
|
9399
|
-
],
|
|
10235
|
+
"tokens": [],
|
|
9400
10236
|
"accessibility": {
|
|
9401
|
-
"role": "
|
|
10237
|
+
"role": "time",
|
|
9402
10238
|
"wcag": "2.2-AA",
|
|
9403
|
-
"keyboard": [
|
|
10239
|
+
"keyboard": []
|
|
9404
10240
|
},
|
|
9405
10241
|
"examples": [
|
|
9406
10242
|
{
|
|
9407
10243
|
"title": "Basic",
|
|
9408
|
-
"code": "<
|
|
10244
|
+
"code": "<RelativeTime date={post.createdAt} />"
|
|
9409
10245
|
},
|
|
9410
10246
|
{
|
|
9411
|
-
"title": "
|
|
9412
|
-
"code": "<
|
|
10247
|
+
"title": "Natural language",
|
|
10248
|
+
"code": "<RelativeTime date={date} format={{ numeric: \"auto\" }} />"
|
|
10249
|
+
},
|
|
10250
|
+
{
|
|
10251
|
+
"title": "Static (no ticking)",
|
|
10252
|
+
"code": "<RelativeTime date={date} sync={false} />"
|
|
9413
10253
|
}
|
|
9414
10254
|
],
|
|
9415
|
-
"dependencies": ["@cascivo/core"],
|
|
9416
|
-
"tags": ["
|
|
10255
|
+
"dependencies": ["@cascivo/core", "@cascivo/i18n"],
|
|
10256
|
+
"tags": ["time", "date", "relative", "i18n", "display"],
|
|
9417
10257
|
"intent": {
|
|
9418
10258
|
"whenToUse": [
|
|
9419
|
-
"
|
|
9420
|
-
"
|
|
10259
|
+
"Showing how long ago something happened in human terms (\"3 minutes ago\")",
|
|
10260
|
+
"Timestamps in feeds, comments, and activity logs where recency matters more than precision",
|
|
10261
|
+
"Anywhere a self-updating relative time is friendlier than an absolute date"
|
|
9421
10262
|
],
|
|
9422
10263
|
"whenNotToUse": [
|
|
9423
|
-
"
|
|
9424
|
-
"
|
|
9425
|
-
"A non-rating single choice among labeled options — use Radio or SegmentedControl"
|
|
10264
|
+
"Precise timestamps in tables or audit logs — use formatDate for an exact, sortable value",
|
|
10265
|
+
"Dates far in the past/future where \"2 years ago\" is less useful than the actual date"
|
|
9426
10266
|
],
|
|
9427
10267
|
"antiPatterns": [
|
|
9428
10268
|
{
|
|
9429
|
-
"bad": "<
|
|
9430
|
-
"good": "<
|
|
9431
|
-
"why": "
|
|
10269
|
+
"bad": "<RelativeTime date={date} /> as the only representation of a legal/audit timestamp",
|
|
10270
|
+
"good": "<time>{formatDate(date)}</time> for exact records; RelativeTime for casual recency",
|
|
10271
|
+
"why": "Relative phrases lose precision; the exact date belongs in records (RelativeTime still exposes it via title/datetime)"
|
|
9432
10272
|
}
|
|
9433
10273
|
],
|
|
9434
10274
|
"related": [
|
|
9435
10275
|
{
|
|
9436
|
-
"name": "
|
|
9437
|
-
"relationship": "
|
|
9438
|
-
"reason": "Use
|
|
9439
|
-
},
|
|
9440
|
-
{
|
|
9441
|
-
"name": "NumberInput",
|
|
9442
|
-
"relationship": "alternative",
|
|
9443
|
-
"reason": "Use when an exact typed number is needed rather than a rating"
|
|
10276
|
+
"name": "Stat",
|
|
10277
|
+
"relationship": "pairs-with",
|
|
10278
|
+
"reason": "Use alongside Stat to timestamp a metric’s last update"
|
|
9444
10279
|
}
|
|
9445
10280
|
],
|
|
9446
|
-
"a11yRationale": "
|
|
10281
|
+
"a11yRationale": "Renders a native <time> element with a machine-readable datetime and the absolute date in the title, so the precise instant is available even though the visible text is relative",
|
|
9447
10282
|
"flexibility": [
|
|
9448
10283
|
{
|
|
9449
|
-
"area": "
|
|
9450
|
-
"level": "
|
|
9451
|
-
"note": "
|
|
10284
|
+
"area": "format",
|
|
10285
|
+
"level": "flexible",
|
|
10286
|
+
"note": "Pass Intl.RelativeTimeFormat options (e.g. numeric: \"auto\") to tune the wording"
|
|
9452
10287
|
},
|
|
9453
10288
|
{
|
|
9454
|
-
"area": "
|
|
10289
|
+
"area": "sync",
|
|
9455
10290
|
"level": "flexible",
|
|
9456
|
-
"note": "
|
|
10291
|
+
"note": "Disable ticking for static contexts or long-past dates"
|
|
9457
10292
|
}
|
|
9458
10293
|
]
|
|
9459
10294
|
}
|
|
@@ -9625,6 +10460,13 @@
|
|
|
9625
10460
|
"default": "vertical",
|
|
9626
10461
|
"description": "Which axes may scroll"
|
|
9627
10462
|
},
|
|
10463
|
+
{
|
|
10464
|
+
"name": "edges",
|
|
10465
|
+
"type": "'shadow' | 'mask' | 'none'",
|
|
10466
|
+
"required": false,
|
|
10467
|
+
"default": "shadow",
|
|
10468
|
+
"description": "Edge affordance: box-shadow, a mask-image fade, or none"
|
|
10469
|
+
},
|
|
9628
10470
|
{
|
|
9629
10471
|
"name": "children",
|
|
9630
10472
|
"type": "ReactNode",
|
|
@@ -12934,6 +13776,127 @@
|
|
|
12934
13776
|
}
|
|
12935
13777
|
}
|
|
12936
13778
|
},
|
|
13779
|
+
{
|
|
13780
|
+
"name": "toc",
|
|
13781
|
+
"type": "component",
|
|
13782
|
+
"description": "Table of contents with scroll-spy highlighting of the active section",
|
|
13783
|
+
"category": "navigation",
|
|
13784
|
+
"version": "0.0.0",
|
|
13785
|
+
"files": [
|
|
13786
|
+
"https://raw.githubusercontent.com/urbanisierung/cascivo/main/packages/components/src/toc/toc.tsx",
|
|
13787
|
+
"https://raw.githubusercontent.com/urbanisierung/cascivo/main/packages/components/src/toc/toc.module.css"
|
|
13788
|
+
],
|
|
13789
|
+
"dependencies": ["@cascivo/core", "@cascivo/i18n"],
|
|
13790
|
+
"tags": ["toc", "table-of-contents", "navigation", "scroll-spy", "anchor"],
|
|
13791
|
+
"meta": {
|
|
13792
|
+
"name": "Toc",
|
|
13793
|
+
"description": "Table of contents with scroll-spy highlighting of the active section",
|
|
13794
|
+
"category": "navigation",
|
|
13795
|
+
"states": [],
|
|
13796
|
+
"variants": [],
|
|
13797
|
+
"sizes": [],
|
|
13798
|
+
"props": [
|
|
13799
|
+
{
|
|
13800
|
+
"name": "items",
|
|
13801
|
+
"type": "{ id: string; label: string; level?: number }[]",
|
|
13802
|
+
"required": true
|
|
13803
|
+
},
|
|
13804
|
+
{
|
|
13805
|
+
"name": "activeId",
|
|
13806
|
+
"type": "string",
|
|
13807
|
+
"required": false,
|
|
13808
|
+
"description": "Controlled active item id; disables built-in scroll-spy when set"
|
|
13809
|
+
},
|
|
13810
|
+
{
|
|
13811
|
+
"name": "onActiveChange",
|
|
13812
|
+
"type": "(id: string) => void",
|
|
13813
|
+
"required": false
|
|
13814
|
+
},
|
|
13815
|
+
{
|
|
13816
|
+
"name": "labels",
|
|
13817
|
+
"type": "{ nav?: string }",
|
|
13818
|
+
"required": false
|
|
13819
|
+
},
|
|
13820
|
+
{
|
|
13821
|
+
"name": "className",
|
|
13822
|
+
"type": "string",
|
|
13823
|
+
"required": false
|
|
13824
|
+
}
|
|
13825
|
+
],
|
|
13826
|
+
"tokens": [
|
|
13827
|
+
"--cascivo-font-sans",
|
|
13828
|
+
"--cascivo-color-text",
|
|
13829
|
+
"--cascivo-color-text-muted",
|
|
13830
|
+
"--cascivo-color-accent",
|
|
13831
|
+
"--cascivo-focus-ring",
|
|
13832
|
+
"--cascivo-target-min-coarse"
|
|
13833
|
+
],
|
|
13834
|
+
"accessibility": {
|
|
13835
|
+
"role": "navigation",
|
|
13836
|
+
"wcag": "2.2-AA",
|
|
13837
|
+
"keyboard": ["Tab", "Enter"]
|
|
13838
|
+
},
|
|
13839
|
+
"examples": [
|
|
13840
|
+
{
|
|
13841
|
+
"title": "Basic",
|
|
13842
|
+
"code": "<Toc items={[{ id: 'intro', label: 'Introduction' }, { id: 'usage', label: 'Usage' }, { id: 'api', label: 'API', level: 3 }]} />"
|
|
13843
|
+
},
|
|
13844
|
+
{
|
|
13845
|
+
"title": "Controlled active item",
|
|
13846
|
+
"code": "<Toc activeId=\"usage\" items={[{ id: 'intro', label: 'Introduction' }, { id: 'usage', label: 'Usage' }]} />",
|
|
13847
|
+
"description": "Pass activeId to drive the highlight yourself; scroll-spy is disabled."
|
|
13848
|
+
}
|
|
13849
|
+
],
|
|
13850
|
+
"dependencies": ["@cascivo/core", "@cascivo/i18n"],
|
|
13851
|
+
"tags": ["toc", "table-of-contents", "navigation", "scroll-spy", "anchor"],
|
|
13852
|
+
"intent": {
|
|
13853
|
+
"whenToUse": [
|
|
13854
|
+
"Long-form pages (docs, articles) that benefit from in-page jump links",
|
|
13855
|
+
"Highlighting which section is currently in view as the reader scrolls"
|
|
13856
|
+
],
|
|
13857
|
+
"whenNotToUse": [
|
|
13858
|
+
"Top-level site navigation between pages — use NavigationMenu or SideNav",
|
|
13859
|
+
"Showing hierarchy depth of the current page — use Breadcrumb"
|
|
13860
|
+
],
|
|
13861
|
+
"antiPatterns": [
|
|
13862
|
+
{
|
|
13863
|
+
"bad": "Using Toc as the primary site navigation between routes",
|
|
13864
|
+
"good": "<NavigationMenu> / <SideNav> for cross-page navigation",
|
|
13865
|
+
"why": "Toc links to sections within the current document, not to other pages"
|
|
13866
|
+
}
|
|
13867
|
+
],
|
|
13868
|
+
"related": [
|
|
13869
|
+
{
|
|
13870
|
+
"name": "SideNav",
|
|
13871
|
+
"relationship": "alternative",
|
|
13872
|
+
"reason": "SideNav navigates between pages; Toc navigates within one page"
|
|
13873
|
+
},
|
|
13874
|
+
{
|
|
13875
|
+
"name": "Breadcrumb",
|
|
13876
|
+
"relationship": "alternative",
|
|
13877
|
+
"reason": "Breadcrumb shows ancestor hierarchy; Toc shows in-page sections"
|
|
13878
|
+
}
|
|
13879
|
+
],
|
|
13880
|
+
"a11yRationale": "Rendered as a <nav> landmark with a label; entries are real anchor links and the active one is marked aria-current=\"location\" so assistive tech announces the current section",
|
|
13881
|
+
"content": {
|
|
13882
|
+
"tone": "Short labels matching the section headings",
|
|
13883
|
+
"notes": "Labels should mirror the on-page heading text"
|
|
13884
|
+
},
|
|
13885
|
+
"flexibility": [
|
|
13886
|
+
{
|
|
13887
|
+
"area": "activeId",
|
|
13888
|
+
"level": "flexible",
|
|
13889
|
+
"note": "Control the highlight externally, or omit it for built-in scroll-spy"
|
|
13890
|
+
},
|
|
13891
|
+
{
|
|
13892
|
+
"area": "token names",
|
|
13893
|
+
"level": "strict",
|
|
13894
|
+
"note": "Colors, focus ring, and touch target must resolve to --cascivo-* tokens"
|
|
13895
|
+
}
|
|
13896
|
+
]
|
|
13897
|
+
}
|
|
13898
|
+
}
|
|
13899
|
+
},
|
|
12937
13900
|
{
|
|
12938
13901
|
"name": "toggle",
|
|
12939
13902
|
"type": "component",
|
|
@@ -13646,6 +14609,112 @@
|
|
|
13646
14609
|
}
|
|
13647
14610
|
}
|
|
13648
14611
|
},
|
|
14612
|
+
{
|
|
14613
|
+
"name": "user",
|
|
14614
|
+
"type": "component",
|
|
14615
|
+
"description": "Identity composite: an avatar with a name, description, and optional action slot",
|
|
14616
|
+
"category": "display",
|
|
14617
|
+
"version": "0.0.0",
|
|
14618
|
+
"files": [
|
|
14619
|
+
"https://raw.githubusercontent.com/urbanisierung/cascivo/main/packages/components/src/user/user.tsx",
|
|
14620
|
+
"https://raw.githubusercontent.com/urbanisierung/cascivo/main/packages/components/src/user/user.module.css"
|
|
14621
|
+
],
|
|
14622
|
+
"dependencies": ["@cascivo/core", "@cascivo/components"],
|
|
14623
|
+
"tags": ["user", "avatar", "identity", "display"],
|
|
14624
|
+
"meta": {
|
|
14625
|
+
"name": "User",
|
|
14626
|
+
"description": "Identity composite: an avatar with a name, description, and optional action slot",
|
|
14627
|
+
"category": "display",
|
|
14628
|
+
"states": ["default"],
|
|
14629
|
+
"variants": [],
|
|
14630
|
+
"sizes": [],
|
|
14631
|
+
"props": [
|
|
14632
|
+
{
|
|
14633
|
+
"name": "name",
|
|
14634
|
+
"type": "ReactNode",
|
|
14635
|
+
"required": true
|
|
14636
|
+
},
|
|
14637
|
+
{
|
|
14638
|
+
"name": "description",
|
|
14639
|
+
"type": "ReactNode",
|
|
14640
|
+
"required": false
|
|
14641
|
+
},
|
|
14642
|
+
{
|
|
14643
|
+
"name": "avatarProps",
|
|
14644
|
+
"type": "AvatarProps",
|
|
14645
|
+
"required": false,
|
|
14646
|
+
"description": "Forwarded to the composed <Avatar>"
|
|
14647
|
+
}
|
|
14648
|
+
],
|
|
14649
|
+
"tokens": [
|
|
14650
|
+
"--cascivo-color-text",
|
|
14651
|
+
"--cascivo-color-text-muted",
|
|
14652
|
+
"--cascivo-space-3",
|
|
14653
|
+
"--cascivo-text-sm",
|
|
14654
|
+
"--cascivo-text-xs"
|
|
14655
|
+
],
|
|
14656
|
+
"accessibility": {
|
|
14657
|
+
"role": "group",
|
|
14658
|
+
"wcag": "2.2-AA",
|
|
14659
|
+
"keyboard": []
|
|
14660
|
+
},
|
|
14661
|
+
"examples": [
|
|
14662
|
+
{
|
|
14663
|
+
"title": "Basic",
|
|
14664
|
+
"code": "<User name=\"Jane Doe\" description=\"jane@acme.com\" avatarProps={{ src: \"/jane.jpg\", alt: \"Jane Doe\" }} />"
|
|
14665
|
+
},
|
|
14666
|
+
{
|
|
14667
|
+
"title": "With action",
|
|
14668
|
+
"code": "<User name=\"Jane Doe\" description=\"Admin\"><IconButton aria-label=\"More\" /></User>"
|
|
14669
|
+
}
|
|
14670
|
+
],
|
|
14671
|
+
"dependencies": ["@cascivo/core", "@cascivo/components"],
|
|
14672
|
+
"tags": ["user", "avatar", "identity", "display"],
|
|
14673
|
+
"intent": {
|
|
14674
|
+
"whenToUse": [
|
|
14675
|
+
"Showing a person with their name and a secondary line (email, role) next to an avatar",
|
|
14676
|
+
"Identity rows inside menus, tables, navbars, and account switchers",
|
|
14677
|
+
"A compact, labelled identity primitive too granular for a page-section block"
|
|
14678
|
+
],
|
|
14679
|
+
"whenNotToUse": [
|
|
14680
|
+
"Just an image with no name/description — use Avatar directly",
|
|
14681
|
+
"A full profile card with rich content — compose a Card instead"
|
|
14682
|
+
],
|
|
14683
|
+
"antiPatterns": [
|
|
14684
|
+
{
|
|
14685
|
+
"bad": "<User name=\"\" avatarProps={{ src: \"/jane.jpg\" }} />",
|
|
14686
|
+
"good": "<User name=\"Jane Doe\" avatarProps={{ src: \"/jane.jpg\", alt: \"Jane Doe\" }} />",
|
|
14687
|
+
"why": "The name is the accessible identity label; an empty name leaves the avatar unlabelled"
|
|
14688
|
+
}
|
|
14689
|
+
],
|
|
14690
|
+
"related": [
|
|
14691
|
+
{
|
|
14692
|
+
"name": "Avatar",
|
|
14693
|
+
"relationship": "contains",
|
|
14694
|
+
"reason": "User wraps Avatar and forwards avatarProps to it"
|
|
14695
|
+
},
|
|
14696
|
+
{
|
|
14697
|
+
"name": "AvatarGroup",
|
|
14698
|
+
"relationship": "alternative",
|
|
14699
|
+
"reason": "Use AvatarGroup to show several identities as an overlapping stack"
|
|
14700
|
+
}
|
|
14701
|
+
],
|
|
14702
|
+
"a11yRationale": "The composite is a labelled group; the name provides the accessible identity and the avatar carries its own role=\"img\"/alt — no redundant roles",
|
|
14703
|
+
"flexibility": [
|
|
14704
|
+
{
|
|
14705
|
+
"area": "description",
|
|
14706
|
+
"level": "flexible",
|
|
14707
|
+
"note": "Any ReactNode — email, role, or a status line"
|
|
14708
|
+
},
|
|
14709
|
+
{
|
|
14710
|
+
"area": "token names",
|
|
14711
|
+
"level": "strict",
|
|
14712
|
+
"note": "Name and description colors must resolve to --cascivo-* tokens"
|
|
14713
|
+
}
|
|
14714
|
+
]
|
|
14715
|
+
}
|
|
14716
|
+
}
|
|
14717
|
+
},
|
|
13649
14718
|
{
|
|
13650
14719
|
"name": "visually-hidden",
|
|
13651
14720
|
"type": "component",
|
|
@@ -18157,6 +19226,24 @@
|
|
|
18157
19226
|
"dark": "/blocks/screenshots/dashboard-table-dark.png"
|
|
18158
19227
|
}
|
|
18159
19228
|
},
|
|
19229
|
+
{
|
|
19230
|
+
"name": "faq",
|
|
19231
|
+
"type": "block",
|
|
19232
|
+
"displayName": "FAQ Accordion",
|
|
19233
|
+
"description": "Frequently-asked-questions section composed from the Accordion component, with a centered, readable measure.",
|
|
19234
|
+
"category": "marketing",
|
|
19235
|
+
"version": "0.0.0",
|
|
19236
|
+
"files": [
|
|
19237
|
+
"https://raw.githubusercontent.com/urbanisierung/cascivo/main/packages/components/src/blocks/faq/faq.tsx",
|
|
19238
|
+
"https://raw.githubusercontent.com/urbanisierung/cascivo/main/packages/components/src/blocks/faq/faq.module.css"
|
|
19239
|
+
],
|
|
19240
|
+
"dependencies": ["@cascivo/react"],
|
|
19241
|
+
"tags": ["marketing", "faq", "accordion", "questions"],
|
|
19242
|
+
"screenshot": {
|
|
19243
|
+
"light": "/blocks/screenshots/faq-light.png",
|
|
19244
|
+
"dark": "/blocks/screenshots/faq-dark.png"
|
|
19245
|
+
}
|
|
19246
|
+
},
|
|
18160
19247
|
{
|
|
18161
19248
|
"name": "marketing-features",
|
|
18162
19249
|
"type": "block",
|
|
@@ -18193,6 +19280,24 @@
|
|
|
18193
19280
|
"dark": "/blocks/screenshots/marketing-hero-dark.png"
|
|
18194
19281
|
}
|
|
18195
19282
|
},
|
|
19283
|
+
{
|
|
19284
|
+
"name": "pricing",
|
|
19285
|
+
"type": "block",
|
|
19286
|
+
"displayName": "Pricing Tiers",
|
|
19287
|
+
"description": "Responsive three-tier pricing section composed from Card, Badge, and Button, with a highlighted featured plan.",
|
|
19288
|
+
"category": "marketing",
|
|
19289
|
+
"version": "0.0.0",
|
|
19290
|
+
"files": [
|
|
19291
|
+
"https://raw.githubusercontent.com/urbanisierung/cascivo/main/packages/components/src/blocks/pricing/pricing.tsx",
|
|
19292
|
+
"https://raw.githubusercontent.com/urbanisierung/cascivo/main/packages/components/src/blocks/pricing/pricing.module.css"
|
|
19293
|
+
],
|
|
19294
|
+
"dependencies": ["@cascivo/react"],
|
|
19295
|
+
"tags": ["marketing", "pricing", "plans", "cards"],
|
|
19296
|
+
"screenshot": {
|
|
19297
|
+
"light": "/blocks/screenshots/pricing-light.png",
|
|
19298
|
+
"dark": "/blocks/screenshots/pricing-dark.png"
|
|
19299
|
+
}
|
|
19300
|
+
},
|
|
18196
19301
|
{
|
|
18197
19302
|
"name": "settings-profile",
|
|
18198
19303
|
"type": "block",
|
|
@@ -18210,6 +19315,42 @@
|
|
|
18210
19315
|
"light": "/blocks/screenshots/settings-profile-light.png",
|
|
18211
19316
|
"dark": "/blocks/screenshots/settings-profile-dark.png"
|
|
18212
19317
|
}
|
|
19318
|
+
},
|
|
19319
|
+
{
|
|
19320
|
+
"name": "site-footer",
|
|
19321
|
+
"type": "block",
|
|
19322
|
+
"displayName": "Site Footer",
|
|
19323
|
+
"description": "Multi-column site footer composed from Link and Separator, with a brand blurb, link columns, and a legal row.",
|
|
19324
|
+
"category": "marketing",
|
|
19325
|
+
"version": "0.0.0",
|
|
19326
|
+
"files": [
|
|
19327
|
+
"https://raw.githubusercontent.com/urbanisierung/cascivo/main/packages/components/src/blocks/site-footer/site-footer.tsx",
|
|
19328
|
+
"https://raw.githubusercontent.com/urbanisierung/cascivo/main/packages/components/src/blocks/site-footer/site-footer.module.css"
|
|
19329
|
+
],
|
|
19330
|
+
"dependencies": ["@cascivo/react"],
|
|
19331
|
+
"tags": ["marketing", "footer", "navigation", "links"],
|
|
19332
|
+
"screenshot": {
|
|
19333
|
+
"light": "/blocks/screenshots/site-footer-light.png",
|
|
19334
|
+
"dark": "/blocks/screenshots/site-footer-dark.png"
|
|
19335
|
+
}
|
|
19336
|
+
},
|
|
19337
|
+
{
|
|
19338
|
+
"name": "testimonials",
|
|
19339
|
+
"type": "block",
|
|
19340
|
+
"displayName": "Testimonials",
|
|
19341
|
+
"description": "Responsive testimonial grid composed from Card and Avatar, with a quote and attribution per card.",
|
|
19342
|
+
"category": "marketing",
|
|
19343
|
+
"version": "0.0.0",
|
|
19344
|
+
"files": [
|
|
19345
|
+
"https://raw.githubusercontent.com/urbanisierung/cascivo/main/packages/components/src/blocks/testimonials/testimonials.tsx",
|
|
19346
|
+
"https://raw.githubusercontent.com/urbanisierung/cascivo/main/packages/components/src/blocks/testimonials/testimonials.module.css"
|
|
19347
|
+
],
|
|
19348
|
+
"dependencies": ["@cascivo/react"],
|
|
19349
|
+
"tags": ["marketing", "testimonials", "social-proof", "cards"],
|
|
19350
|
+
"screenshot": {
|
|
19351
|
+
"light": "/blocks/screenshots/testimonials-light.png",
|
|
19352
|
+
"dark": "/blocks/screenshots/testimonials-dark.png"
|
|
19353
|
+
}
|
|
18213
19354
|
}
|
|
18214
19355
|
]
|
|
18215
19356
|
}
|