@cascivo/mcp 0.2.0 → 0.3.3
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/LICENSE +1 -1
- package/README.md +53 -23
- package/dist/context/accordion.md +93 -0
- package/dist/context/action-sheet.md +117 -0
- package/dist/context/alert-dialog.md +122 -0
- package/dist/context/alert.md +110 -0
- package/dist/context/app-shell.md +98 -0
- package/dist/context/aspect-ratio.md +92 -0
- package/dist/context/avatar-group.md +111 -0
- package/dist/context/avatar.md +100 -0
- package/dist/context/badge.md +119 -0
- package/dist/context/block/console-app.md +66 -0
- package/dist/context/block/dashboard-charts.md +61 -0
- package/dist/context/block/empty-dashboard.md +60 -0
- package/dist/context/block/login-page.md +60 -0
- package/dist/context/block/notification-center.md +61 -0
- package/dist/context/block/page-with-breadcrumb.md +54 -0
- package/dist/context/block/settings-form-page.md +60 -0
- package/dist/context/block/sidebar-app.md +55 -0
- package/dist/context/block/stats-cards.md +61 -0
- package/dist/context/block/users-table-page.md +61 -0
- package/dist/context/blockquote.md +95 -0
- package/dist/context/bottom-sheet.md +112 -0
- package/dist/context/breadcrumb.md +106 -0
- package/dist/context/button-group.md +100 -0
- package/dist/context/button.md +117 -0
- package/dist/context/calendar.md +118 -0
- package/dist/context/card.md +90 -0
- package/dist/context/carousel.md +101 -0
- package/dist/context/chart/area-chart.md +99 -0
- package/dist/context/chart/bar-chart.md +114 -0
- package/dist/context/chart/boxplot.md +82 -0
- package/dist/context/chart/bubble-chart.md +80 -0
- package/dist/context/chart/bullet.md +75 -0
- package/dist/context/chart/calendar.md +79 -0
- package/dist/context/chart/candlestick.md +104 -0
- package/dist/context/chart/combo-chart.md +78 -0
- package/dist/context/chart/funnel.md +87 -0
- package/dist/context/chart/gauge.md +87 -0
- package/dist/context/chart/heatmap.md +77 -0
- package/dist/context/chart/histogram.md +74 -0
- package/dist/context/chart/kpi.md +70 -0
- package/dist/context/chart/line-chart.md +113 -0
- package/dist/context/chart/meter.md +71 -0
- package/dist/context/chart/pie-chart.md +126 -0
- package/dist/context/chart/polar.md +92 -0
- package/dist/context/chart/radar.md +81 -0
- package/dist/context/chart/radial-bar.md +96 -0
- package/dist/context/chart/sankey.md +89 -0
- package/dist/context/chart/scatter-chart.md +90 -0
- package/dist/context/chart/sparkline.md +69 -0
- package/dist/context/chart/stream.md +88 -0
- package/dist/context/chart/sunburst.md +93 -0
- package/dist/context/chart/treemap.md +84 -0
- package/dist/context/chat-bubble.md +116 -0
- package/dist/context/checkbox-card.md +104 -0
- package/dist/context/checkbox.md +104 -0
- package/dist/context/code-snippet.md +118 -0
- package/dist/context/code.md +103 -0
- package/dist/context/collapsible.md +104 -0
- package/dist/context/color-picker.md +101 -0
- package/dist/context/combobox.md +125 -0
- package/dist/context/command-menu.md +121 -0
- package/dist/context/comparison.md +117 -0
- package/dist/context/contained-list.md +103 -0
- package/dist/context/context-menu.md +103 -0
- package/dist/context/copy-button.md +106 -0
- package/dist/context/data-list.md +99 -0
- package/dist/context/data-table.md +149 -0
- package/dist/context/date-picker.md +116 -0
- package/dist/context/date-range-picker.md +113 -0
- package/dist/context/dock.md +117 -0
- package/dist/context/drawer.md +111 -0
- package/dist/context/dropdown.md +96 -0
- package/dist/context/editable.md +101 -0
- package/dist/context/editor/code-editor.md +146 -0
- package/dist/context/editor/highlight.md +74 -0
- package/dist/context/empty-state.md +101 -0
- package/dist/context/fab.md +128 -0
- package/dist/context/field.md +118 -0
- package/dist/context/file-uploader.md +121 -0
- package/dist/context/filter.md +129 -0
- package/dist/context/flow/flow-background.md +103 -0
- package/dist/context/flow/flow-canvas.md +82 -0
- package/dist/context/flow/flow-controls.md +84 -0
- package/dist/context/flow/flow-edge.md +128 -0
- package/dist/context/flow/flow-handle.md +83 -0
- package/dist/context/flow/flow-minimap.md +89 -0
- package/dist/context/flow/flow-node.md +97 -0
- package/dist/context/flow/flow-panel.md +75 -0
- package/dist/context/flow/flow-story.md +145 -0
- package/dist/context/flow/flow.md +139 -0
- package/dist/context/form.md +104 -0
- package/dist/context/header-panel.md +96 -0
- package/dist/context/header.md +104 -0
- package/dist/context/heading.md +107 -0
- package/dist/context/hover-card.md +108 -0
- package/dist/context/icon-button.md +115 -0
- package/dist/context/image.md +115 -0
- package/dist/context/indicator.md +95 -0
- package/dist/context/inline-loading.md +101 -0
- package/dist/context/input-group.md +122 -0
- package/dist/context/input.md +101 -0
- package/dist/context/item.md +109 -0
- package/dist/context/join.md +97 -0
- package/dist/context/kbd.md +100 -0
- package/dist/context/label.md +117 -0
- package/dist/context/layout/app-shell.md +85 -0
- package/dist/context/layout/auth-layout.md +74 -0
- package/dist/context/layout/auto-grid.md +69 -0
- package/dist/context/layout/center.md +67 -0
- package/dist/context/layout/columns.md +70 -0
- package/dist/context/layout/dashboard-layout.md +68 -0
- package/dist/context/layout/grid.md +70 -0
- package/dist/context/layout/masonry.md +70 -0
- package/dist/context/layout/page-header.md +75 -0
- package/dist/context/layout/section.md +69 -0
- package/dist/context/layout/settings-layout.md +68 -0
- package/dist/context/layout/spacer.md +64 -0
- package/dist/context/layout/split-view.md +71 -0
- package/dist/context/layout/stack.md +93 -0
- package/dist/context/link.md +112 -0
- package/dist/context/list.md +109 -0
- package/dist/context/log-viewer.md +124 -0
- package/dist/context/menu-button.md +137 -0
- package/dist/context/menu.md +108 -0
- package/dist/context/menubar.md +92 -0
- package/dist/context/modal.md +96 -0
- package/dist/context/multi-select.md +104 -0
- package/dist/context/native-select.md +118 -0
- package/dist/context/navigation-menu.md +95 -0
- package/dist/context/notification.md +116 -0
- package/dist/context/number-input.md +117 -0
- package/dist/context/otp-input.md +98 -0
- package/dist/context/overflow-menu.md +107 -0
- package/dist/context/pagination.md +123 -0
- package/dist/context/password-input.md +100 -0
- package/dist/context/popover.md +108 -0
- package/dist/context/progress-bar.md +107 -0
- package/dist/context/progress-circle.md +101 -0
- package/dist/context/progress-indicator.md +105 -0
- package/dist/context/progress.md +109 -0
- package/dist/context/prose.md +110 -0
- package/dist/context/pull-to-refresh.md +101 -0
- package/dist/context/qr-code.md +101 -0
- package/dist/context/radial-progress.md +117 -0
- package/dist/context/radio-card.md +95 -0
- package/dist/context/radio.md +94 -0
- package/dist/context/rating-group.md +97 -0
- package/dist/context/relative-time.md +90 -0
- package/dist/context/resizable.md +102 -0
- package/dist/context/scroll-area.md +101 -0
- package/dist/context/search.md +113 -0
- package/dist/context/section/cta.md +83 -0
- package/dist/context/section/feature-grid.md +98 -0
- package/dist/context/section/hero.md +101 -0
- package/dist/context/section/media-masonry.md +77 -0
- package/dist/context/section/page-footer.md +101 -0
- package/dist/context/section/stats-band.md +81 -0
- package/dist/context/segmented-control.md +101 -0
- package/dist/context/select.md +101 -0
- package/dist/context/separator.md +88 -0
- package/dist/context/sheet.md +100 -0
- package/dist/context/shell-header.md +105 -0
- package/dist/context/side-nav.md +134 -0
- package/dist/context/skeleton.md +101 -0
- package/dist/context/skip-nav.md +103 -0
- package/dist/context/slider.md +98 -0
- package/dist/context/spinner.md +89 -0
- package/dist/context/stack.md +96 -0
- package/dist/context/stat.md +101 -0
- package/dist/context/status.md +105 -0
- package/dist/context/steps.md +124 -0
- package/dist/context/structured-list.md +107 -0
- package/dist/context/swap.md +100 -0
- package/dist/context/swipe-item.md +110 -0
- package/dist/context/switcher.md +97 -0
- package/dist/context/tabs.md +93 -0
- package/dist/context/tag.md +110 -0
- package/dist/context/tags-input.md +94 -0
- package/dist/context/text.md +111 -0
- package/dist/context/textarea.md +98 -0
- package/dist/context/tile.md +116 -0
- package/dist/context/time-picker.md +102 -0
- package/dist/context/timeline.md +93 -0
- package/dist/context/toast.md +91 -0
- package/dist/context/toc.md +110 -0
- package/dist/context/toggle-group.md +118 -0
- package/dist/context/toggle.md +103 -0
- package/dist/context/toggletip.md +119 -0
- package/dist/context/tooltip.md +92 -0
- package/dist/context/tree-view.md +107 -0
- package/dist/context/user.md +100 -0
- package/dist/context/visually-hidden.md +90 -0
- package/dist/context.json +22456 -0
- package/dist/index.d.mts +3 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +73 -32
- package/dist/index.mjs.map +1 -1
- package/dist/marketplace.json +70 -0
- package/dist/registry.json +2832 -358
- package/dist/tokens.catalog.json +2375 -0
- package/dist/tokens.variants.json +3291 -0
- package/package.json +4 -3
- package/readme.body.md +53 -23
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Text
|
|
2
|
+
|
|
3
|
+
**Category:** display
|
|
4
|
+
**Description:** Body text with size, weight, and muted variants
|
|
5
|
+
|
|
6
|
+
## When to use
|
|
7
|
+
|
|
8
|
+
- Rendering body copy, paragraphs, and inline text in app UI
|
|
9
|
+
- Applying size/weight/muted treatment to secondary or emphasized text
|
|
10
|
+
- Inline emphasis inside flow content (as="span")
|
|
11
|
+
|
|
12
|
+
## When NOT to use
|
|
13
|
+
|
|
14
|
+
- Section or page titles — use Heading for the document outline
|
|
15
|
+
- Long-form authored/markdown content — use Prose
|
|
16
|
+
|
|
17
|
+
## Anti-patterns
|
|
18
|
+
|
|
19
|
+
### Visually-large Text has no heading semantics, so it is missing from the document outline
|
|
20
|
+
|
|
21
|
+
**Bad:** `<Text size="lg" weight="semibold"> used as a page title`
|
|
22
|
+
**Good:** `<Heading level={1}>`
|
|
23
|
+
**Why:** Visually-large Text has no heading semantics, so it is missing from the document outline
|
|
24
|
+
|
|
25
|
+
## Related components
|
|
26
|
+
|
|
27
|
+
- **Heading** (alternative): Heading carries outline semantics; Text is plain body copy
|
|
28
|
+
|
|
29
|
+
## Accessibility rationale
|
|
30
|
+
|
|
31
|
+
Renders the chosen native element (p/span/div) without imposing roles; muted styling keeps contrast within AA so secondary text stays readable
|
|
32
|
+
|
|
33
|
+
## Props
|
|
34
|
+
|
|
35
|
+
| Name | Type | Required | Default | Description |
|
|
36
|
+
| -------- | ------------------------------------ | -------- | ------- | ----------------------------------------------------- |
|
|
37
|
+
| `as` | `'p' \| 'span' \| 'div'` | No | p | The HTML element to render as. |
|
|
38
|
+
| `size` | `'sm' \| 'md' \| 'lg'` | No | md | Visual size of the component (e.g. 'sm', 'md', 'lg'). |
|
|
39
|
+
| `weight` | `'normal' \| 'medium' \| 'semibold'` | No | normal | Font weight ('normal' \| 'medium' \| 'semibold'). |
|
|
40
|
+
| `muted` | `boolean` | No | false | When true, renders in a muted/subtle color. |
|
|
41
|
+
|
|
42
|
+
## Tokens
|
|
43
|
+
|
|
44
|
+
- `--cascivo-font-sans`
|
|
45
|
+
- `--cascivo-font-normal`
|
|
46
|
+
- `--cascivo-font-medium`
|
|
47
|
+
- `--cascivo-font-semibold`
|
|
48
|
+
- `--cascivo-leading-normal`
|
|
49
|
+
- `--cascivo-color-text`
|
|
50
|
+
- `--cascivo-color-text-subtle`
|
|
51
|
+
- `--cascivo-text-sm`
|
|
52
|
+
- `--cascivo-text-base`
|
|
53
|
+
- `--cascivo-text-lg`
|
|
54
|
+
|
|
55
|
+
## Examples
|
|
56
|
+
|
|
57
|
+
### Default
|
|
58
|
+
|
|
59
|
+
```jsx
|
|
60
|
+
<Text>Body copy reads at the base size.</Text>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Muted helper
|
|
64
|
+
|
|
65
|
+
```jsx
|
|
66
|
+
<Text size="sm" muted>
|
|
67
|
+
Secondary information
|
|
68
|
+
</Text>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Inline span
|
|
72
|
+
|
|
73
|
+
Use as="span" inside other flow content
|
|
74
|
+
|
|
75
|
+
```jsx
|
|
76
|
+
<Text as="span" weight="semibold">
|
|
77
|
+
emphasis
|
|
78
|
+
</Text>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Boundaries
|
|
82
|
+
|
|
83
|
+
| Area | Level | Note |
|
|
84
|
+
| ------------------ | -------- | ------------------------------------------------------------ |
|
|
85
|
+
| as / size / weight | flexible | Choose element and treatment to fit context |
|
|
86
|
+
| token names | strict | Font, leading, and color must resolve to --cascivo-\* tokens |
|
|
87
|
+
|
|
88
|
+
## AI context prompt
|
|
89
|
+
|
|
90
|
+
Copy this into an LLM context bar before editing this component:
|
|
91
|
+
|
|
92
|
+
```text
|
|
93
|
+
I am modifying the cascivo Text component (display). Body text with size, weight, and muted variants
|
|
94
|
+
|
|
95
|
+
Architecture constraints — follow exactly:
|
|
96
|
+
- Signals only (useSignal/useComputed/useSignalEffect from @cascivo/core). Never useState/useEffect/useContext/useReducer.
|
|
97
|
+
- Style only through --cascivo-* custom properties. No Tailwind, no inline styles, no CSS-in-JS.
|
|
98
|
+
- Responsive via @container queries on the canonical scale (30rem/40rem/64rem/80rem). Do not use global viewport @media breakpoints.
|
|
99
|
+
- Visual states (hover/focus/active/disabled) via CSS pseudo-classes, not JS.
|
|
100
|
+
- CSS logical properties only (RTL-safe).
|
|
101
|
+
|
|
102
|
+
Text is strictly bound to these tokens — use only these, do not invent token names:
|
|
103
|
+
--cascivo-font-sans, --cascivo-font-normal, --cascivo-font-medium, --cascivo-font-semibold, --cascivo-leading-normal, --cascivo-color-text, --cascivo-color-text-subtle, --cascivo-text-sm, --cascivo-text-base, --cascivo-text-lg
|
|
104
|
+
|
|
105
|
+
Accessibility: role "paragraph", WCAG 2.2-AA. Keep it AA.
|
|
106
|
+
|
|
107
|
+
Do not change (strict): token names — Font, leading, and color must resolve to --cascivo-* tokens
|
|
108
|
+
Flexible: as / size / weight.
|
|
109
|
+
|
|
110
|
+
Do not invent props, tokens, or global viewport media queries.
|
|
111
|
+
```
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Textarea
|
|
2
|
+
|
|
3
|
+
**Category:** inputs
|
|
4
|
+
**Description:** Multi-line text input with optional label, hint, and error state
|
|
5
|
+
|
|
6
|
+
## When to use
|
|
7
|
+
|
|
8
|
+
- Capturing multi-line free text such as messages, descriptions, or comments
|
|
9
|
+
- Input where line breaks are meaningful and the content may wrap to several rows
|
|
10
|
+
- Form fields that benefit from a visible hint or validation error beneath the control
|
|
11
|
+
|
|
12
|
+
## When NOT to use
|
|
13
|
+
|
|
14
|
+
- A single short value like a name or email — use Input
|
|
15
|
+
- A constrained numeric value — use NumberInput
|
|
16
|
+
|
|
17
|
+
## Anti-patterns
|
|
18
|
+
|
|
19
|
+
### A one-line value belongs in Input; a textarea invites unwanted line breaks and submits via Enter differently
|
|
20
|
+
|
|
21
|
+
**Bad:** `<Textarea label="Email" rows={1} />`
|
|
22
|
+
**Good:** `<Input type="email" label="Email" />`
|
|
23
|
+
**Why:** A one-line value belongs in Input; a textarea invites unwanted line breaks and submits via Enter differently
|
|
24
|
+
|
|
25
|
+
## Related components
|
|
26
|
+
|
|
27
|
+
- **Input** (alternative): Use for single-line values
|
|
28
|
+
- **Form** (contained-by): Typically grouped with other fields inside a form
|
|
29
|
+
|
|
30
|
+
## Accessibility rationale
|
|
31
|
+
|
|
32
|
+
Renders a native <textarea> with aria-multiline; hint and error text are associated via aria-describedby and errors use role="alert" with aria-invalid so assistive tech announces validation state.
|
|
33
|
+
|
|
34
|
+
## Props
|
|
35
|
+
|
|
36
|
+
| Name | Type | Required | Default | Description |
|
|
37
|
+
| ---------- | -------------------------------- | -------- | -------- | ------------------------------------------------------------------------------ |
|
|
38
|
+
| `label` | `string` | No | — | Text label for the control. |
|
|
39
|
+
| `hint` | `string` | No | — | Supplementary hint text shown with the control. |
|
|
40
|
+
| `error` | `string` | No | — | Error message shown when the value is invalid. |
|
|
41
|
+
| `rows` | `number` | No | 4 | Number of visible text rows. |
|
|
42
|
+
| `resize` | `'none' \| 'vertical' \| 'both'` | No | vertical | Which directions the textarea can be resized ('none' \| 'vertical' \| 'both'). |
|
|
43
|
+
| `disabled` | `boolean` | No | false | When true, disables the control and removes it from the tab order. |
|
|
44
|
+
|
|
45
|
+
## Tokens
|
|
46
|
+
|
|
47
|
+
- `--cascivo-color-surface`
|
|
48
|
+
- `--cascivo-color-border`
|
|
49
|
+
- `--cascivo-color-accent`
|
|
50
|
+
- `--cascivo-color-destructive`
|
|
51
|
+
- `--cascivo-radius-input`
|
|
52
|
+
- `--cascivo-focus-ring`
|
|
53
|
+
|
|
54
|
+
## Examples
|
|
55
|
+
|
|
56
|
+
### With label
|
|
57
|
+
|
|
58
|
+
```jsx
|
|
59
|
+
<Textarea label="Message" placeholder="Type here…" />
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### With error
|
|
63
|
+
|
|
64
|
+
```jsx
|
|
65
|
+
<Textarea label="Bio" error="Bio is required" />
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Boundaries
|
|
69
|
+
|
|
70
|
+
| Area | Level | Note |
|
|
71
|
+
| --------------- | -------- | -------------------------------------------------------------------------------- |
|
|
72
|
+
| token names | strict | Border/focus/error colors must resolve to --cascivo-color-\* / focus-ring tokens |
|
|
73
|
+
| resize and rows | flexible | Consumer chooses initial rows and whether the field can resize |
|
|
74
|
+
|
|
75
|
+
## AI context prompt
|
|
76
|
+
|
|
77
|
+
Copy this into an LLM context bar before editing this component:
|
|
78
|
+
|
|
79
|
+
```text
|
|
80
|
+
I am modifying the cascivo Textarea component (inputs). Multi-line text input with optional label, hint, and error state
|
|
81
|
+
|
|
82
|
+
Architecture constraints — follow exactly:
|
|
83
|
+
- Signals only (useSignal/useComputed/useSignalEffect from @cascivo/core). Never useState/useEffect/useContext/useReducer.
|
|
84
|
+
- Style only through --cascivo-* custom properties. No Tailwind, no inline styles, no CSS-in-JS.
|
|
85
|
+
- Responsive via @container queries on the canonical scale (30rem/40rem/64rem/80rem). Do not use global viewport @media breakpoints.
|
|
86
|
+
- Visual states (hover/focus/active/disabled) via CSS pseudo-classes, not JS.
|
|
87
|
+
- CSS logical properties only (RTL-safe).
|
|
88
|
+
|
|
89
|
+
Textarea is strictly bound to these tokens — use only these, do not invent token names:
|
|
90
|
+
--cascivo-color-surface, --cascivo-color-border, --cascivo-color-accent, --cascivo-color-destructive, --cascivo-radius-input, --cascivo-focus-ring
|
|
91
|
+
|
|
92
|
+
Accessibility: role "textbox", WCAG 2.2-AA, keyboard: Tab/Shift+Tab. Keep it AA.
|
|
93
|
+
|
|
94
|
+
Do not change (strict): token names — Border/focus/error colors must resolve to --cascivo-color-* / focus-ring tokens
|
|
95
|
+
Flexible: resize and rows.
|
|
96
|
+
|
|
97
|
+
Do not invent props, tokens, or global viewport media queries.
|
|
98
|
+
```
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# Tile
|
|
2
|
+
|
|
3
|
+
**Category:** inputs
|
|
4
|
+
**Description:** A selectable card with radio (single) or checkbox (multi) semantics, toggled by click or keyboard
|
|
5
|
+
|
|
6
|
+
## When to use
|
|
7
|
+
|
|
8
|
+
- A visually rich, clickable choice card in a single- or multi-select group
|
|
9
|
+
- Plan/option pickers where each option needs an icon and supporting content
|
|
10
|
+
- A larger touch target than a plain radio or checkbox
|
|
11
|
+
|
|
12
|
+
## When NOT to use
|
|
13
|
+
|
|
14
|
+
- A simple inline boolean — use Checkbox or Toggle
|
|
15
|
+
- A dense list of text-only options — use RadioGroup or a Select
|
|
16
|
+
|
|
17
|
+
## Anti-patterns
|
|
18
|
+
|
|
19
|
+
### Single (radio) tiles cannot be unselected by clicking; use multi for toggleable behavior
|
|
20
|
+
|
|
21
|
+
**Bad:** `<Tile value="on">Enable</Tile> // used as a standalone on/off control`
|
|
22
|
+
**Good:** `<Tile value="on" selectable="multi">Enable</Tile> // multi allows deselect`
|
|
23
|
+
**Why:** Single (radio) tiles cannot be unselected by clicking; use multi for toggleable behavior
|
|
24
|
+
|
|
25
|
+
## Related components
|
|
26
|
+
|
|
27
|
+
- **RadioCard** (alternative): RadioCard wraps a native input in a group; Tile is a standalone ARIA radio/checkbox
|
|
28
|
+
- **CheckboxCard** (alternative): Use CheckboxCard when native checkbox form semantics are required
|
|
29
|
+
|
|
30
|
+
## Accessibility rationale
|
|
31
|
+
|
|
32
|
+
Exposes role="radio" (single) or role="checkbox" (multi) with aria-checked reflecting selection, is focusable, and toggles on Space/Enter. aria-disabled and a -1 tabindex remove disabled tiles from interaction.
|
|
33
|
+
|
|
34
|
+
## Props
|
|
35
|
+
|
|
36
|
+
| Name | Type | Required | Default | Description |
|
|
37
|
+
| ----------------- | ------------------------- | -------- | ------- | ------------------------------------------------------------------------------------------------- |
|
|
38
|
+
| `value` | `string` | Yes | — | Identifies this tile within a group. |
|
|
39
|
+
| `selected` | `boolean` | No | — | Controlled selected state. |
|
|
40
|
+
| `defaultSelected` | `boolean` | No | — | Initial selected state for uncontrolled use. |
|
|
41
|
+
| `onSelect` | `(value: string) => void` | No | — | Called with this tile's value whenever it is toggled on (or off for multi). |
|
|
42
|
+
| `selectable` | `'single' \| 'multi'` | No | single | Single = radio semantics (toggle on); multi = checkbox semantics (toggle on/off). |
|
|
43
|
+
| `disabled` | `boolean` | No | — | When true, disables the control and removes it from the tab order. |
|
|
44
|
+
| `icon` | `React.ReactNode` | No | — | Optional leading icon/visual. |
|
|
45
|
+
| `asChild` | `boolean` | No | — | When true, renders the child element as the root via Slot, merging props (polymorphic rendering). |
|
|
46
|
+
| `children` | `React.ReactNode` | No | — | Content rendered inside the component. |
|
|
47
|
+
| `className` | `string` | No | — | Additional CSS class names merged onto the root element. |
|
|
48
|
+
|
|
49
|
+
## Tokens
|
|
50
|
+
|
|
51
|
+
- `--cascivo-color-bg`
|
|
52
|
+
- `--cascivo-color-border`
|
|
53
|
+
- `--cascivo-color-border-strong`
|
|
54
|
+
- `--cascivo-color-accent`
|
|
55
|
+
- `--cascivo-color-text`
|
|
56
|
+
- `--cascivo-color-text-muted`
|
|
57
|
+
- `--cascivo-radius-surface`
|
|
58
|
+
- `--cascivo-focus-ring`
|
|
59
|
+
|
|
60
|
+
## Examples
|
|
61
|
+
|
|
62
|
+
### Single-select group
|
|
63
|
+
|
|
64
|
+
```jsx
|
|
65
|
+
<div role="radiogroup" aria-label="Plan">
|
|
66
|
+
<Tile value="starter" selected={plan === 'starter'} onSelect={setPlan}>
|
|
67
|
+
Starter
|
|
68
|
+
</Tile>
|
|
69
|
+
<Tile value="pro" selected={plan === 'pro'} onSelect={setPlan}>
|
|
70
|
+
Pro
|
|
71
|
+
</Tile>
|
|
72
|
+
</div>
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Multi-select with icon
|
|
76
|
+
|
|
77
|
+
Multi tiles toggle on and off like a checkbox.
|
|
78
|
+
|
|
79
|
+
```jsx
|
|
80
|
+
<Tile value="notifications" selectable="multi" icon={<BellIcon />} defaultSelected>
|
|
81
|
+
Email notifications
|
|
82
|
+
</Tile>
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Boundaries
|
|
86
|
+
|
|
87
|
+
| Area | Level | Note |
|
|
88
|
+
| -------------- | -------- | ---------------------------------------------------------------- |
|
|
89
|
+
| selectable | strict | single (radio, select-only) \| multi (checkbox, toggle) |
|
|
90
|
+
| selected state | flexible | Controlled (selected/onSelect) or uncontrolled (defaultSelected) |
|
|
91
|
+
| element | flexible | asChild renders onto a custom element via Slot |
|
|
92
|
+
|
|
93
|
+
## AI context prompt
|
|
94
|
+
|
|
95
|
+
Copy this into an LLM context bar before editing this component:
|
|
96
|
+
|
|
97
|
+
```text
|
|
98
|
+
I am modifying the cascivo Tile component (inputs). A selectable card with radio (single) or checkbox (multi) semantics, toggled by click or keyboard
|
|
99
|
+
|
|
100
|
+
Architecture constraints — follow exactly:
|
|
101
|
+
- Signals only (useSignal/useComputed/useSignalEffect from @cascivo/core). Never useState/useEffect/useContext/useReducer.
|
|
102
|
+
- Style only through --cascivo-* custom properties. No Tailwind, no inline styles, no CSS-in-JS.
|
|
103
|
+
- Responsive via @container queries on the canonical scale (30rem/40rem/64rem/80rem). Do not use global viewport @media breakpoints.
|
|
104
|
+
- Visual states (hover/focus/active/disabled) via CSS pseudo-classes, not JS.
|
|
105
|
+
- CSS logical properties only (RTL-safe).
|
|
106
|
+
|
|
107
|
+
Tile is strictly bound to these tokens — use only these, do not invent token names:
|
|
108
|
+
--cascivo-color-bg, --cascivo-color-border, --cascivo-color-border-strong, --cascivo-color-accent, --cascivo-color-text, --cascivo-color-text-muted, --cascivo-radius-surface, --cascivo-focus-ring
|
|
109
|
+
|
|
110
|
+
Accessibility: role "radio", WCAG 2.2-AA, keyboard: Enter/Space. Keep it AA.
|
|
111
|
+
|
|
112
|
+
Do not change (strict): selectable — single (radio, select-only) | multi (checkbox, toggle)
|
|
113
|
+
Flexible: selected state, element.
|
|
114
|
+
|
|
115
|
+
Do not invent props, tokens, or global viewport media queries.
|
|
116
|
+
```
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# TimePicker
|
|
2
|
+
|
|
3
|
+
**Category:** inputs
|
|
4
|
+
**Description:** Native time input wrapper with label, hint, error, and size variants
|
|
5
|
+
|
|
6
|
+
## When to use
|
|
7
|
+
|
|
8
|
+
- Capturing a time of day (HH:mm) in a form, such as a meeting or reminder time
|
|
9
|
+
- You want the native OS time entry UX with built-in formatting and validation
|
|
10
|
+
- A time field that needs a label, hint, error, or min/max bounds
|
|
11
|
+
|
|
12
|
+
## When NOT to use
|
|
13
|
+
|
|
14
|
+
- Picking a calendar date — use DatePicker
|
|
15
|
+
- A free-form or non-time text value — use Input
|
|
16
|
+
|
|
17
|
+
## Anti-patterns
|
|
18
|
+
|
|
19
|
+
### A plain Input cannot enforce time format or offer the native time UI; TimePicker gives parsing and locale handling for free
|
|
20
|
+
|
|
21
|
+
**Bad:** `<Input placeholder="HH:mm" /> // hand-rolled time field`
|
|
22
|
+
**Good:** `<TimePicker label="Start" />`
|
|
23
|
+
**Why:** A plain Input cannot enforce time format or offer the native time UI; TimePicker gives parsing and locale handling for free
|
|
24
|
+
|
|
25
|
+
## Related components
|
|
26
|
+
|
|
27
|
+
- **DatePicker** (alternative): Use when a calendar date is needed instead of a time
|
|
28
|
+
- **Input** (alternative): Use for non-time free-text values
|
|
29
|
+
|
|
30
|
+
## Accessibility rationale
|
|
31
|
+
|
|
32
|
+
Renders a native <input type="time"> so segmented HH/mm entry, format enforcement, and keyboard support come from the platform; error text is linked via aria-describedby with aria-invalid.
|
|
33
|
+
|
|
34
|
+
## Props
|
|
35
|
+
|
|
36
|
+
| Name | Type | Required | Default | Description |
|
|
37
|
+
| -------------- | ------------------------- | -------- | ------- | ------------------------------------------------------------------ |
|
|
38
|
+
| `value` | `string` | No | — | Controlled value (HH:mm) |
|
|
39
|
+
| `defaultValue` | `string` | No | — | The initial value when uncontrolled. |
|
|
40
|
+
| `onChange` | `(value: string) => void` | No | — | Called when the value changes. |
|
|
41
|
+
| `min` | `string` | No | — | Minimum allowed value. |
|
|
42
|
+
| `max` | `string` | No | — | Maximum allowed value. |
|
|
43
|
+
| `step` | `number` | No | — | Increment between allowed values. |
|
|
44
|
+
| `label` | `string` | No | — | Text label for the control. |
|
|
45
|
+
| `hint` | `string` | No | — | Supplementary hint text shown with the control. |
|
|
46
|
+
| `error` | `string` | No | — | Error message shown when the value is invalid. |
|
|
47
|
+
| `size` | `'sm' \| 'md' \| 'lg'` | No | 'md' | Visual size of the component (e.g. 'sm', 'md', 'lg'). |
|
|
48
|
+
| `disabled` | `boolean` | No | — | When true, disables the control and removes it from the tab order. |
|
|
49
|
+
| `className` | `string` | No | — | Additional CSS class names merged onto the root element. |
|
|
50
|
+
|
|
51
|
+
## Tokens
|
|
52
|
+
|
|
53
|
+
- `--cascivo-color-surface`
|
|
54
|
+
- `--cascivo-color-bg-subtle`
|
|
55
|
+
- `--cascivo-color-border`
|
|
56
|
+
- `--cascivo-color-border-strong`
|
|
57
|
+
- `--cascivo-color-text`
|
|
58
|
+
- `--cascivo-color-text-muted`
|
|
59
|
+
- `--cascivo-color-accent`
|
|
60
|
+
- `--cascivo-color-danger`
|
|
61
|
+
- `--cascivo-radius-input`
|
|
62
|
+
- `--cascivo-radius-md`
|
|
63
|
+
|
|
64
|
+
## Examples
|
|
65
|
+
|
|
66
|
+
### Basic time picker
|
|
67
|
+
|
|
68
|
+
```jsx
|
|
69
|
+
<TimePicker label="Meeting time" onChange={(v) => console.log(v)} />
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Boundaries
|
|
73
|
+
|
|
74
|
+
| Area | Level | Note |
|
|
75
|
+
| ------------ | -------- | --------------------------------------------------------------- |
|
|
76
|
+
| value format | strict | Value is a 24-hour HH:mm string driven by the native time input |
|
|
77
|
+
| min/max/step | flexible | Consumer-defined bounds and step granularity |
|
|
78
|
+
|
|
79
|
+
## AI context prompt
|
|
80
|
+
|
|
81
|
+
Copy this into an LLM context bar before editing this component:
|
|
82
|
+
|
|
83
|
+
```text
|
|
84
|
+
I am modifying the cascivo TimePicker component (inputs). Native time input wrapper with label, hint, error, and size variants
|
|
85
|
+
|
|
86
|
+
Architecture constraints — follow exactly:
|
|
87
|
+
- Signals only (useSignal/useComputed/useSignalEffect from @cascivo/core). Never useState/useEffect/useContext/useReducer.
|
|
88
|
+
- Style only through --cascivo-* custom properties. No Tailwind, no inline styles, no CSS-in-JS.
|
|
89
|
+
- Responsive via @container queries on the canonical scale (30rem/40rem/64rem/80rem). Do not use global viewport @media breakpoints.
|
|
90
|
+
- Visual states (hover/focus/active/disabled) via CSS pseudo-classes, not JS.
|
|
91
|
+
- CSS logical properties only (RTL-safe).
|
|
92
|
+
|
|
93
|
+
TimePicker is strictly bound to these tokens — use only these, do not invent token names:
|
|
94
|
+
--cascivo-color-surface, --cascivo-color-bg-subtle, --cascivo-color-border, --cascivo-color-border-strong, --cascivo-color-text, --cascivo-color-text-muted, --cascivo-color-accent, --cascivo-color-danger, --cascivo-radius-input, --cascivo-radius-md
|
|
95
|
+
|
|
96
|
+
Accessibility: role "textbox", WCAG 2.2-AA, keyboard: Tab. Keep it AA.
|
|
97
|
+
|
|
98
|
+
Do not change (strict): value format — Value is a 24-hour HH:mm string driven by the native time input
|
|
99
|
+
Flexible: min/max/step.
|
|
100
|
+
|
|
101
|
+
Do not invent props, tokens, or global viewport media queries.
|
|
102
|
+
```
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Timeline
|
|
2
|
+
|
|
3
|
+
**Category:** display
|
|
4
|
+
**Description:** Ordered sequence of events with status markers and a connector line
|
|
5
|
+
|
|
6
|
+
## When to use
|
|
7
|
+
|
|
8
|
+
- Showing an ordered sequence of events over time (activity feeds, order tracking)
|
|
9
|
+
- Communicating progress through discrete stages with complete/current/upcoming status
|
|
10
|
+
- Presenting a chronological history where order is meaningful
|
|
11
|
+
|
|
12
|
+
## When NOT to use
|
|
13
|
+
|
|
14
|
+
- Interactive multi-step navigation the user controls — use Tabs or a Stepper
|
|
15
|
+
- Unordered lists where sequence carries no meaning — use List
|
|
16
|
+
|
|
17
|
+
## Anti-patterns
|
|
18
|
+
|
|
19
|
+
### Multiple current markers make the active position ambiguous for assistive tech
|
|
20
|
+
|
|
21
|
+
**Bad:** `Marking several items as status="current" at once`
|
|
22
|
+
**Good:** `Exactly one current item so aria-current="step" points to a single position`
|
|
23
|
+
**Why:** Multiple current markers make the active position ambiguous for assistive tech
|
|
24
|
+
|
|
25
|
+
## Related components
|
|
26
|
+
|
|
27
|
+
- **List** (alternative): List is for unordered prose; Timeline conveys ordered, time-stamped events
|
|
28
|
+
|
|
29
|
+
## Accessibility rationale
|
|
30
|
+
|
|
31
|
+
Rendered as an ordered list (ol/li) to convey sequence; the active item carries aria-current="step" and decorative markers are aria-hidden so screen readers read only the text
|
|
32
|
+
|
|
33
|
+
## Props
|
|
34
|
+
|
|
35
|
+
| Name | Type | Required | Default | Description |
|
|
36
|
+
| ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -------- | ------------------------------------ |
|
|
37
|
+
| `items` | `{ id: string; title: ReactNode; description?: ReactNode; time?: string; icon?: ReactNode; status?: "complete" \| "current" \| "upcoming" }[]` | Yes | — | The items to render. |
|
|
38
|
+
| `orientation` | `'vertical' \| 'horizontal'` | No | vertical | Layout orientation of the component. |
|
|
39
|
+
|
|
40
|
+
## Tokens
|
|
41
|
+
|
|
42
|
+
- `--cascivo-color-border`
|
|
43
|
+
- `--cascivo-color-border-strong`
|
|
44
|
+
- `--cascivo-color-surface`
|
|
45
|
+
- `--cascivo-color-success`
|
|
46
|
+
- `--cascivo-color-primary`
|
|
47
|
+
- `--cascivo-radius-full`
|
|
48
|
+
|
|
49
|
+
## Examples
|
|
50
|
+
|
|
51
|
+
### Vertical timeline with statuses
|
|
52
|
+
|
|
53
|
+
```jsx
|
|
54
|
+
<Timeline
|
|
55
|
+
items={[
|
|
56
|
+
{ id: '1', title: 'Order placed', time: '09:00', status: 'complete' },
|
|
57
|
+
{ id: '2', title: 'Shipped', time: '12:30', status: 'current' },
|
|
58
|
+
{ id: '3', title: 'Delivered', status: 'upcoming' },
|
|
59
|
+
]}
|
|
60
|
+
/>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Boundaries
|
|
64
|
+
|
|
65
|
+
| Area | Level | Note |
|
|
66
|
+
| ---------------- | -------- | ---------------------------------------------------------------------- |
|
|
67
|
+
| orientation | flexible | vertical for feeds, horizontal for compact progress strips |
|
|
68
|
+
| status semantics | strict | Use a single current item; status drives marker colour via data-status |
|
|
69
|
+
|
|
70
|
+
## AI context prompt
|
|
71
|
+
|
|
72
|
+
Copy this into an LLM context bar before editing this component:
|
|
73
|
+
|
|
74
|
+
```text
|
|
75
|
+
I am modifying the cascivo Timeline component (display). Ordered sequence of events with status markers and a connector line
|
|
76
|
+
|
|
77
|
+
Architecture constraints — follow exactly:
|
|
78
|
+
- Signals only (useSignal/useComputed/useSignalEffect from @cascivo/core). Never useState/useEffect/useContext/useReducer.
|
|
79
|
+
- Style only through --cascivo-* custom properties. No Tailwind, no inline styles, no CSS-in-JS.
|
|
80
|
+
- Responsive via @container queries on the canonical scale (30rem/40rem/64rem/80rem). Do not use global viewport @media breakpoints.
|
|
81
|
+
- Visual states (hover/focus/active/disabled) via CSS pseudo-classes, not JS.
|
|
82
|
+
- CSS logical properties only (RTL-safe).
|
|
83
|
+
|
|
84
|
+
Timeline is strictly bound to these tokens — use only these, do not invent token names:
|
|
85
|
+
--cascivo-color-border, --cascivo-color-border-strong, --cascivo-color-surface, --cascivo-color-success, --cascivo-color-primary, --cascivo-radius-full
|
|
86
|
+
|
|
87
|
+
Accessibility: role "list", WCAG 2.2-AA. Keep it AA.
|
|
88
|
+
|
|
89
|
+
Do not change (strict): status semantics — Use a single current item; status drives marker colour via data-status
|
|
90
|
+
Flexible: orientation.
|
|
91
|
+
|
|
92
|
+
Do not invent props, tokens, or global viewport media queries.
|
|
93
|
+
```
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Toast
|
|
2
|
+
|
|
3
|
+
**Category:** overlay
|
|
4
|
+
**Description:** Transient notification surfaced via the useToast hook
|
|
5
|
+
|
|
6
|
+
## When to use
|
|
7
|
+
|
|
8
|
+
- Confirming that a background or just-completed action succeeded or failed (e.g. "Saved")
|
|
9
|
+
- Brief, transient feedback that should auto-dismiss without interrupting the task
|
|
10
|
+
- Non-blocking notifications that can stack and disappear on their own
|
|
11
|
+
|
|
12
|
+
## When NOT to use
|
|
13
|
+
|
|
14
|
+
- A persistent, inline message tied to a specific region of the page — use Alert
|
|
15
|
+
- Feedback that requires the user to acknowledge or decide before continuing — use Modal or AlertDialog
|
|
16
|
+
|
|
17
|
+
## Anti-patterns
|
|
18
|
+
|
|
19
|
+
### Toasts auto-dismiss and are easy to miss; a destructive decision needs a blocking dialog the user must confirm
|
|
20
|
+
|
|
21
|
+
**Bad:** `toast({ title: "Delete this account?", duration: 0 })`
|
|
22
|
+
**Good:** `<AlertDialog title="Delete this account?" />`
|
|
23
|
+
**Why:** Toasts auto-dismiss and are easy to miss; a destructive decision needs a blocking dialog the user must confirm
|
|
24
|
+
|
|
25
|
+
## Related components
|
|
26
|
+
|
|
27
|
+
- **Alert** (alternative): Use for persistent inline status that stays until resolved
|
|
28
|
+
- **Modal** (alternative): Use when the user must acknowledge before proceeding
|
|
29
|
+
|
|
30
|
+
## Accessibility rationale
|
|
31
|
+
|
|
32
|
+
Toasts render into a labelled region; non-critical ones use role="status" with aria-live="polite", while destructive variants escalate to role="alert" with aria-live="assertive" so urgency is conveyed without stealing focus.
|
|
33
|
+
|
|
34
|
+
## Props
|
|
35
|
+
|
|
36
|
+
| Name | Type | Required | Default | Description |
|
|
37
|
+
| ------------- | ------------------------------------------------------ | -------- | ------- | ---------------------------------------------------------- |
|
|
38
|
+
| `title` | `string` | Yes | — | Title text for the component. |
|
|
39
|
+
| `description` | `string` | No | — | Supporting description text. |
|
|
40
|
+
| `variant` | `'default' \| 'success' \| 'warning' \| 'destructive'` | No | default | Selects the visual style variant. |
|
|
41
|
+
| `duration` | `number` | No | 5000 | How long (ms) the toast stays visible before auto-dismiss. |
|
|
42
|
+
|
|
43
|
+
## Tokens
|
|
44
|
+
|
|
45
|
+
- `--cascivo-color-surface-overlay`
|
|
46
|
+
- `--cascivo-color-success`
|
|
47
|
+
- `--cascivo-color-warning`
|
|
48
|
+
- `--cascivo-color-destructive`
|
|
49
|
+
- `--cascivo-radius-md`
|
|
50
|
+
- `--cascivo-z-toast`
|
|
51
|
+
|
|
52
|
+
## Examples
|
|
53
|
+
|
|
54
|
+
### Trigger
|
|
55
|
+
|
|
56
|
+
```jsx
|
|
57
|
+
const { toast } = useToast()
|
|
58
|
+
toast({ title: 'Saved', variant: 'success' })
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Boundaries
|
|
62
|
+
|
|
63
|
+
| Area | Level | Note |
|
|
64
|
+
| -------- | -------- | ---------------------------------------------------------------------------------------------- |
|
|
65
|
+
| variant | strict | Limited to default \| success \| warning \| destructive — drives color and live-region urgency |
|
|
66
|
+
| duration | flexible | Consumer can tune auto-dismiss timing (default 5000ms) |
|
|
67
|
+
|
|
68
|
+
## AI context prompt
|
|
69
|
+
|
|
70
|
+
Copy this into an LLM context bar before editing this component:
|
|
71
|
+
|
|
72
|
+
```text
|
|
73
|
+
I am modifying the cascivo Toast component (overlay). Transient notification surfaced via the useToast hook
|
|
74
|
+
|
|
75
|
+
Architecture constraints — follow exactly:
|
|
76
|
+
- Signals only (useSignal/useComputed/useSignalEffect from @cascivo/core). Never useState/useEffect/useContext/useReducer.
|
|
77
|
+
- Style only through --cascivo-* custom properties. No Tailwind, no inline styles, no CSS-in-JS.
|
|
78
|
+
- Responsive via @container queries on the canonical scale (30rem/40rem/64rem/80rem). Do not use global viewport @media breakpoints.
|
|
79
|
+
- Visual states (hover/focus/active/disabled) via CSS pseudo-classes, not JS.
|
|
80
|
+
- CSS logical properties only (RTL-safe).
|
|
81
|
+
|
|
82
|
+
Toast is strictly bound to these tokens — use only these, do not invent token names:
|
|
83
|
+
--cascivo-color-surface-overlay, --cascivo-color-success, --cascivo-color-warning, --cascivo-color-destructive, --cascivo-radius-md, --cascivo-z-toast
|
|
84
|
+
|
|
85
|
+
Accessibility: role "status", WCAG 2.2-AA, keyboard: Tab. Keep it AA.
|
|
86
|
+
|
|
87
|
+
Do not change (strict): variant — Limited to default | success | warning | destructive — drives color and live-region urgency
|
|
88
|
+
Flexible: duration.
|
|
89
|
+
|
|
90
|
+
Do not invent props, tokens, or global viewport media queries.
|
|
91
|
+
```
|