@rdna/radiants 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.
Files changed (51) hide show
  1. package/components/core/Accordion/Accordion.dna.json +16 -0
  2. package/components/core/Accordion/Accordion.schema.json +48 -0
  3. package/components/core/Alert/Alert.dna.json +56 -0
  4. package/components/core/Alert/Alert.schema.json +66 -0
  5. package/components/core/Badge/Badge.dna.json +48 -0
  6. package/components/core/Badge/Badge.schema.json +49 -0
  7. package/components/core/Breadcrumbs/Breadcrumbs.dna.json +29 -0
  8. package/components/core/Breadcrumbs/Breadcrumbs.schema.json +39 -0
  9. package/components/core/Button/Button.dna.json +58 -0
  10. package/components/core/Button/Button.schema.json +84 -0
  11. package/components/core/Card/Card.dna.json +21 -0
  12. package/components/core/Card/Card.schema.json +23 -0
  13. package/components/core/Checkbox/Checkbox.dna.json +38 -0
  14. package/components/core/Checkbox/Checkbox.schema.json +55 -0
  15. package/components/core/ContextMenu/ContextMenu.dna.json +25 -0
  16. package/components/core/ContextMenu/ContextMenu.schema.json +30 -0
  17. package/components/core/CountdownTimer/CountdownTimer.dna.json +79 -0
  18. package/components/core/CountdownTimer/CountdownTimer.schema.json +71 -0
  19. package/components/core/Dialog/Dialog.dna.json +28 -0
  20. package/components/core/Dialog/Dialog.schema.json +40 -0
  21. package/components/core/Divider/Divider.dna.json +16 -0
  22. package/components/core/Divider/Divider.schema.json +41 -0
  23. package/components/core/DropdownMenu/DropdownMenu.dna.json +28 -0
  24. package/components/core/DropdownMenu/DropdownMenu.schema.json +55 -0
  25. package/components/core/HelpPanel/HelpPanel.dna.json +24 -0
  26. package/components/core/HelpPanel/HelpPanel.schema.json +47 -0
  27. package/components/core/Input/Input.dna.json +33 -0
  28. package/components/core/Input/Input.schema.json +33 -0
  29. package/components/core/MockStatesPopover/MockStatesPopover.dna.json +33 -0
  30. package/components/core/MockStatesPopover/MockStatesPopover.schema.json +80 -0
  31. package/components/core/Popover/Popover.dna.json +10 -0
  32. package/components/core/Popover/Popover.schema.json +46 -0
  33. package/components/core/Progress/Progress.dna.json +29 -0
  34. package/components/core/Progress/Progress.schema.json +57 -0
  35. package/components/core/Select/Select.dna.json +42 -0
  36. package/components/core/Select/Select.schema.json +66 -0
  37. package/components/core/Sheet/Sheet.dna.json +28 -0
  38. package/components/core/Sheet/Sheet.schema.json +53 -0
  39. package/components/core/Slider/Slider.dna.json +49 -0
  40. package/components/core/Slider/Slider.schema.json +70 -0
  41. package/components/core/Switch/Switch.dna.json +47 -0
  42. package/components/core/Switch/Switch.schema.json +64 -0
  43. package/components/core/Tabs/Tabs.dna.json +39 -0
  44. package/components/core/Tabs/Tabs.schema.json +62 -0
  45. package/components/core/Toast/Toast.dna.json +31 -0
  46. package/components/core/Toast/Toast.schema.json +57 -0
  47. package/components/core/Tooltip/Tooltip.dna.json +46 -0
  48. package/components/core/Tooltip/Tooltip.schema.json +58 -0
  49. package/components/core/Web3ActionBar/Web3ActionBar.dna.json +23 -0
  50. package/components/core/Web3ActionBar/Web3ActionBar.schema.json +50 -0
  51. package/package.json +6 -2
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "Popover",
3
+ "description": "Floating content panel anchored to a trigger element. Supports controlled and uncontrolled states with keyboard accessibility and click-outside dismissal.",
4
+ "subcomponents": ["PopoverTrigger", "PopoverContent"],
5
+ "props": {
6
+ "open": {
7
+ "type": "boolean",
8
+ "description": "Controlled open state for the popover"
9
+ },
10
+ "defaultOpen": {
11
+ "type": "boolean",
12
+ "default": false,
13
+ "description": "Default open state for uncontrolled usage"
14
+ },
15
+ "onOpenChange": {
16
+ "type": "function",
17
+ "description": "Callback when open state changes"
18
+ },
19
+ "position": {
20
+ "type": "enum",
21
+ "values": ["top", "bottom", "left", "right"],
22
+ "default": "bottom",
23
+ "description": "Position of the popover relative to the trigger"
24
+ }
25
+ },
26
+ "slots": {
27
+ "children": {
28
+ "description": "Popover subcomponents (PopoverTrigger, PopoverContent)"
29
+ }
30
+ },
31
+ "variants": {},
32
+ "examples": [
33
+ {
34
+ "name": "Basic popover",
35
+ "code": "<Popover>\n <PopoverTrigger asChild>\n <Button>Open Popover</Button>\n </PopoverTrigger>\n <PopoverContent>\n <p>Popover content goes here.</p>\n </PopoverContent>\n</Popover>"
36
+ },
37
+ {
38
+ "name": "Controlled popover",
39
+ "code": "<Popover open={isOpen} onOpenChange={setIsOpen}>\n <PopoverTrigger asChild>\n <Button>Info</Button>\n </PopoverTrigger>\n <PopoverContent>\n <p>Some helpful information.</p>\n </PopoverContent>\n</Popover>"
40
+ },
41
+ {
42
+ "name": "Popover with position",
43
+ "code": "<Popover position=\"right\">\n <PopoverTrigger asChild>\n <Button variant=\"outline\">More Options</Button>\n </PopoverTrigger>\n <PopoverContent align=\"start\">\n <p>Additional options appear to the right.</p>\n </PopoverContent>\n</Popover>"
44
+ }
45
+ ]
46
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "component": "Progress",
3
+ "description": "Token bindings for Progress component variants",
4
+ "tokenBindings": {
5
+ "track": {
6
+ "background": "surface-primary",
7
+ "border": "edge-primary"
8
+ },
9
+ "fill": {
10
+ "default": "action-primary",
11
+ "success": "status-success",
12
+ "warning": "surface-tertiary",
13
+ "error": "status-error"
14
+ },
15
+ "label": {
16
+ "text": "content-primary",
17
+ "font": "heading"
18
+ }
19
+ },
20
+ "subcomponents": {
21
+ "Spinner": {
22
+ "description": "PixelCode animated loader with completion checkmark",
23
+ "tokenBindings": {
24
+ "text": "content-primary",
25
+ "font": "monospace"
26
+ }
27
+ }
28
+ }
29
+ }
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "Progress",
3
+ "description": "Progress bar with retro pixel-art styling. Displays completion state with optional percentage label.",
4
+ "subcomponents": ["Spinner"],
5
+ "props": {
6
+ "value": {
7
+ "type": "number",
8
+ "required": true,
9
+ "description": "Current progress value (0 to max)"
10
+ },
11
+ "max": {
12
+ "type": "number",
13
+ "default": 100,
14
+ "description": "Maximum progress value"
15
+ },
16
+ "variant": {
17
+ "type": "enum",
18
+ "values": ["default", "success", "warning", "error"],
19
+ "default": "default",
20
+ "description": "Visual variant for different states/meanings"
21
+ },
22
+ "size": {
23
+ "type": "enum",
24
+ "values": ["sm", "md", "lg"],
25
+ "default": "md",
26
+ "description": "Height preset for the progress bar"
27
+ },
28
+ "showLabel": {
29
+ "type": "boolean",
30
+ "default": false,
31
+ "description": "Display percentage label below the bar"
32
+ },
33
+ "className": {
34
+ "type": "string",
35
+ "description": "Additional CSS classes for the container"
36
+ }
37
+ },
38
+ "slots": {},
39
+ "examples": [
40
+ {
41
+ "name": "Default progress",
42
+ "code": "<Progress value={50} />"
43
+ },
44
+ {
45
+ "name": "Success variant with label",
46
+ "code": "<Progress value={75} variant=\"success\" showLabel />"
47
+ },
48
+ {
49
+ "name": "Error variant small",
50
+ "code": "<Progress value={30} variant=\"error\" size=\"sm\" />"
51
+ },
52
+ {
53
+ "name": "Large progress bar",
54
+ "code": "<Progress value={90} size=\"lg\" showLabel />"
55
+ }
56
+ ]
57
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "component": "Select",
3
+ "description": "Token bindings for Select component",
4
+ "tokenBindings": {
5
+ "trigger": {
6
+ "background": "surface-primary",
7
+ "text": "content-primary",
8
+ "textPlaceholder": "content-primary/40",
9
+ "border": "edge-primary",
10
+ "borderError": "status-error",
11
+ "shadow": "edge-primary",
12
+ "focusRing": "edge-focus"
13
+ },
14
+ "dropdown": {
15
+ "background": "surface-primary",
16
+ "border": "edge-primary",
17
+ "shadow": "edge-primary"
18
+ },
19
+ "option": {
20
+ "text": "content-primary",
21
+ "backgroundSelected": "action-primary",
22
+ "backgroundHover": "action-primary"
23
+ }
24
+ },
25
+ "states": {
26
+ "disabled": {
27
+ "opacity": "50%",
28
+ "cursor": "not-allowed"
29
+ },
30
+ "open": {
31
+ "shadowOffset": "3px",
32
+ "transform": "translateY(-0.125rem)"
33
+ },
34
+ "closed": {
35
+ "shadowOffset": "1px"
36
+ },
37
+ "optionDisabled": {
38
+ "opacity": "50%",
39
+ "cursor": "not-allowed"
40
+ }
41
+ }
42
+ }
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "Select",
3
+ "description": "Custom dropdown select with retro styling. Provides a fully accessible select experience with keyboard navigation and customizable states.",
4
+ "props": {
5
+ "options": {
6
+ "type": "array",
7
+ "required": true,
8
+ "description": "Array of option objects with value, label, and optional disabled properties"
9
+ },
10
+ "value": {
11
+ "type": "string",
12
+ "description": "Currently selected value"
13
+ },
14
+ "placeholder": {
15
+ "type": "string",
16
+ "default": "Select...",
17
+ "description": "Placeholder text when no value is selected"
18
+ },
19
+ "onChange": {
20
+ "type": "function",
21
+ "description": "Callback fired when selection changes, receives the selected value"
22
+ },
23
+ "disabled": {
24
+ "type": "boolean",
25
+ "default": false,
26
+ "description": "Disable select interactions"
27
+ },
28
+ "error": {
29
+ "type": "boolean",
30
+ "default": false,
31
+ "description": "Show error state with red border"
32
+ },
33
+ "fullWidth": {
34
+ "type": "boolean",
35
+ "default": false,
36
+ "description": "Expand select to fill container width"
37
+ }
38
+ },
39
+ "slots": {},
40
+ "examples": [
41
+ {
42
+ "name": "Basic select",
43
+ "code": "<Select options={[{value: 'a', label: 'Option A'}, {value: 'b', label: 'Option B'}]} value={selected} onChange={setSelected} />"
44
+ },
45
+ {
46
+ "name": "With placeholder",
47
+ "code": "<Select options={options} placeholder=\"Choose an option...\" onChange={handleChange} />"
48
+ },
49
+ {
50
+ "name": "Full width",
51
+ "code": "<Select options={options} value={selected} onChange={setSelected} fullWidth />"
52
+ },
53
+ {
54
+ "name": "Error state",
55
+ "code": "<Select options={options} value={selected} onChange={setSelected} error />"
56
+ },
57
+ {
58
+ "name": "Disabled",
59
+ "code": "<Select options={options} value={selected} onChange={setSelected} disabled />"
60
+ },
61
+ {
62
+ "name": "With disabled option",
63
+ "code": "<Select options={[{value: 'a', label: 'Option A'}, {value: 'b', label: 'Option B', disabled: true}]} value={selected} onChange={setSelected} />"
64
+ }
65
+ ]
66
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "component": "Sheet",
3
+ "tokenBindings": {
4
+ "overlay": {
5
+ "background": "surface-secondary/50"
6
+ },
7
+ "content": {
8
+ "background": "surface-primary",
9
+ "border": "edge-primary",
10
+ "shadow": "shadow-card"
11
+ },
12
+ "header": {
13
+ "border": "edge-primary/20"
14
+ },
15
+ "title": {
16
+ "text": "content-primary"
17
+ },
18
+ "description": {
19
+ "text": "content-primary/70"
20
+ },
21
+ "body": {
22
+ "text": "content-primary"
23
+ },
24
+ "footer": {
25
+ "border": "edge-primary/20"
26
+ }
27
+ }
28
+ }
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "Sheet",
3
+ "description": "Slide-in panel from screen edges for contextual content, navigation, or forms. Supports all four sides with smooth animations and keyboard accessibility.",
4
+ "subcomponents": ["SheetTrigger", "SheetContent", "SheetHeader", "SheetTitle", "SheetDescription", "SheetBody", "SheetFooter", "SheetClose"],
5
+ "props": {
6
+ "open": {
7
+ "type": "boolean",
8
+ "description": "Controlled open state for the sheet"
9
+ },
10
+ "defaultOpen": {
11
+ "type": "boolean",
12
+ "default": false,
13
+ "description": "Default open state for uncontrolled usage"
14
+ },
15
+ "onOpenChange": {
16
+ "type": "function",
17
+ "description": "Callback when open state changes"
18
+ },
19
+ "side": {
20
+ "type": "enum",
21
+ "values": ["left", "right", "top", "bottom"],
22
+ "default": "right",
23
+ "description": "Side of the screen to slide in from"
24
+ }
25
+ },
26
+ "slots": {
27
+ "children": {
28
+ "description": "Sheet subcomponents (SheetTrigger, SheetContent, etc.)"
29
+ }
30
+ },
31
+ "variants": {
32
+ "side": {
33
+ "left": "Slides in from the left edge",
34
+ "right": "Slides in from the right edge (default)",
35
+ "top": "Slides in from the top edge",
36
+ "bottom": "Slides in from the bottom edge"
37
+ }
38
+ },
39
+ "examples": [
40
+ {
41
+ "name": "Basic sheet",
42
+ "code": "<Sheet>\n <SheetTrigger asChild>\n <Button>Open Sheet</Button>\n </SheetTrigger>\n <SheetContent>\n <SheetHeader>\n <SheetTitle>Sheet Title</SheetTitle>\n <SheetDescription>This is a description of the sheet.</SheetDescription>\n </SheetHeader>\n <SheetBody>\n <p>Sheet content goes here.</p>\n </SheetBody>\n <SheetFooter>\n <SheetClose asChild>\n <Button variant=\"outline\">Close</Button>\n </SheetClose>\n </SheetFooter>\n </SheetContent>\n</Sheet>"
43
+ },
44
+ {
45
+ "name": "Left-side navigation sheet",
46
+ "code": "<Sheet side=\"left\">\n <SheetTrigger asChild>\n <Button iconOnly aria-label=\"Menu\"><MenuIcon /></Button>\n </SheetTrigger>\n <SheetContent>\n <SheetHeader>\n <SheetTitle>Navigation</SheetTitle>\n </SheetHeader>\n <SheetBody>\n <nav>\n <ul>\n <li><a href=\"/home\">Home</a></li>\n <li><a href=\"/settings\">Settings</a></li>\n </ul>\n </nav>\n </SheetBody>\n </SheetContent>\n</Sheet>"
47
+ },
48
+ {
49
+ "name": "Controlled sheet",
50
+ "code": "<Sheet open={isOpen} onOpenChange={setIsOpen}>\n <SheetTrigger asChild>\n <Button>Filters</Button>\n </SheetTrigger>\n <SheetContent>\n <SheetHeader>\n <SheetTitle>Filters</SheetTitle>\n </SheetHeader>\n <SheetBody>\n <p>Filter options here.</p>\n </SheetBody>\n <SheetFooter>\n <Button variant=\"outline\" onClick={() => setIsOpen(false)}>Cancel</Button>\n <Button onClick={applyFilters}>Apply</Button>\n </SheetFooter>\n </SheetContent>\n</Sheet>"
51
+ }
52
+ ]
53
+ }
@@ -0,0 +1,49 @@
1
+ {
2
+ "component": "Slider",
3
+ "description": "Token bindings for Slider component",
4
+ "tokenBindings": {
5
+ "label": {
6
+ "text": "content-primary",
7
+ "font": "heading"
8
+ },
9
+ "value": {
10
+ "text": "content-primary/60",
11
+ "font": "heading"
12
+ },
13
+ "track": {
14
+ "background": "edge-primary/10",
15
+ "border": "edge-primary",
16
+ "focusRing": "edge-focus"
17
+ },
18
+ "fill": {
19
+ "background": "action-primary"
20
+ },
21
+ "thumb": {
22
+ "background": "surface-muted",
23
+ "border": "edge-primary"
24
+ }
25
+ },
26
+ "states": {
27
+ "disabled": {
28
+ "opacity": "50%",
29
+ "cursor": "not-allowed"
30
+ },
31
+ "dragging": {
32
+ "thumbScale": "110%"
33
+ }
34
+ },
35
+ "sizes": {
36
+ "sm": {
37
+ "trackHeight": "0.25rem",
38
+ "thumbSize": "0.75rem"
39
+ },
40
+ "md": {
41
+ "trackHeight": "0.5rem",
42
+ "thumbSize": "1rem"
43
+ },
44
+ "lg": {
45
+ "trackHeight": "0.75rem",
46
+ "thumbSize": "1.25rem"
47
+ }
48
+ }
49
+ }
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "Slider",
3
+ "description": "Numeric range input with draggable thumb. Supports keyboard navigation and customizable sizes.",
4
+ "props": {
5
+ "value": {
6
+ "type": "number",
7
+ "required": true,
8
+ "description": "Current numeric value"
9
+ },
10
+ "onChange": {
11
+ "type": "function",
12
+ "required": true,
13
+ "description": "Callback when value changes: (value: number) => void"
14
+ },
15
+ "min": {
16
+ "type": "number",
17
+ "default": 0,
18
+ "description": "Minimum value"
19
+ },
20
+ "max": {
21
+ "type": "number",
22
+ "default": 100,
23
+ "description": "Maximum value"
24
+ },
25
+ "step": {
26
+ "type": "number",
27
+ "default": 1,
28
+ "description": "Step increment between values"
29
+ },
30
+ "size": {
31
+ "type": "enum",
32
+ "values": ["sm", "md", "lg"],
33
+ "default": "md",
34
+ "description": "Size preset controlling track height and thumb dimensions"
35
+ },
36
+ "disabled": {
37
+ "type": "boolean",
38
+ "default": false,
39
+ "description": "Disable slider interactions"
40
+ },
41
+ "showValue": {
42
+ "type": "boolean",
43
+ "default": false,
44
+ "description": "Display current value next to label"
45
+ },
46
+ "label": {
47
+ "type": "string",
48
+ "description": "Label text displayed above the slider"
49
+ }
50
+ },
51
+ "slots": {},
52
+ "examples": [
53
+ {
54
+ "name": "Basic slider",
55
+ "code": "<Slider value={50} onChange={setValue} />"
56
+ },
57
+ {
58
+ "name": "With label and value display",
59
+ "code": "<Slider value={volume} onChange={setVolume} label=\"Volume\" showValue />"
60
+ },
61
+ {
62
+ "name": "Custom range with step",
63
+ "code": "<Slider value={temp} onChange={setTemp} min={0} max={10} step={0.5} />"
64
+ },
65
+ {
66
+ "name": "Large disabled slider",
67
+ "code": "<Slider value={75} onChange={() => {}} size=\"lg\" disabled />"
68
+ }
69
+ ]
70
+ }
@@ -0,0 +1,47 @@
1
+ {
2
+ "component": "Switch",
3
+ "description": "Token bindings for Switch component",
4
+ "tokenBindings": {
5
+ "track": {
6
+ "border": "edge-primary",
7
+ "backgroundOff": "edge-primary/10",
8
+ "backgroundOn": "action-primary",
9
+ "focusRing": "edge-focus"
10
+ },
11
+ "thumb": {
12
+ "background": "surface-secondary",
13
+ "border": "edge-primary"
14
+ },
15
+ "label": {
16
+ "text": "content-primary",
17
+ "font": "mondwest"
18
+ }
19
+ },
20
+ "states": {
21
+ "disabled": {
22
+ "opacity": "50%",
23
+ "cursor": "not-allowed"
24
+ },
25
+ "checked": {
26
+ "background": "action-primary",
27
+ "thumbTranslate": "size-dependent"
28
+ }
29
+ },
30
+ "sizes": {
31
+ "sm": {
32
+ "trackWidth": "2rem",
33
+ "trackHeight": "1rem",
34
+ "thumbSize": "0.75rem"
35
+ },
36
+ "md": {
37
+ "trackWidth": "2.5rem",
38
+ "trackHeight": "1.25rem",
39
+ "thumbSize": "1rem"
40
+ },
41
+ "lg": {
42
+ "trackWidth": "3rem",
43
+ "trackHeight": "1.5rem",
44
+ "thumbSize": "1.25rem"
45
+ }
46
+ }
47
+ }
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "Switch",
3
+ "description": "On/off toggle control for binary settings. Provides accessible switch interaction with customizable sizes and optional label.",
4
+ "props": {
5
+ "checked": {
6
+ "type": "boolean",
7
+ "required": true,
8
+ "description": "Controlled checked state of the switch"
9
+ },
10
+ "onChange": {
11
+ "type": "function",
12
+ "required": true,
13
+ "description": "Callback fired when checked state changes, receives new checked value"
14
+ },
15
+ "size": {
16
+ "type": "enum",
17
+ "values": ["sm", "md", "lg"],
18
+ "default": "md",
19
+ "description": "Size preset controlling track and thumb dimensions"
20
+ },
21
+ "disabled": {
22
+ "type": "boolean",
23
+ "default": false,
24
+ "description": "Disable switch interactions"
25
+ },
26
+ "label": {
27
+ "type": "string",
28
+ "description": "Optional label text for the switch"
29
+ },
30
+ "labelPosition": {
31
+ "type": "enum",
32
+ "values": ["left", "right"],
33
+ "default": "right",
34
+ "description": "Position of label relative to switch"
35
+ },
36
+ "id": {
37
+ "type": "string",
38
+ "description": "ID for accessibility linking between label and switch"
39
+ }
40
+ },
41
+ "slots": {},
42
+ "examples": [
43
+ {
44
+ "name": "Basic switch",
45
+ "code": "<Switch checked={enabled} onChange={setEnabled} />"
46
+ },
47
+ {
48
+ "name": "With label",
49
+ "code": "<Switch checked={enabled} onChange={setEnabled} label=\"Enable notifications\" />"
50
+ },
51
+ {
52
+ "name": "Label on left",
53
+ "code": "<Switch checked={enabled} onChange={setEnabled} label=\"Dark mode\" labelPosition=\"left\" />"
54
+ },
55
+ {
56
+ "name": "Small size",
57
+ "code": "<Switch checked={enabled} onChange={setEnabled} size=\"sm\" />"
58
+ },
59
+ {
60
+ "name": "Disabled state",
61
+ "code": "<Switch checked={true} onChange={() => {}} disabled label=\"Locked setting\" />"
62
+ }
63
+ ]
64
+ }
@@ -0,0 +1,39 @@
1
+ {
2
+ "component": "Tabs",
3
+ "tokenBindings": {
4
+ "list": {
5
+ "background": "surface-primary",
6
+ "border": "edge-primary"
7
+ },
8
+ "trigger": {
9
+ "text": "content-primary",
10
+ "border": "edge-primary"
11
+ },
12
+ "triggerPill": {
13
+ "inactive": {
14
+ "background": "transparent",
15
+ "hoverBackground": "surface-secondary/5"
16
+ },
17
+ "active": {
18
+ "background": "action-primary",
19
+ "text": "content-primary"
20
+ }
21
+ },
22
+ "triggerLine": {
23
+ "inactive": {
24
+ "background": "transparent",
25
+ "hoverBackground": "surface-primary/50"
26
+ },
27
+ "active": {
28
+ "background": "surface-primary",
29
+ "border": "edge-primary"
30
+ }
31
+ },
32
+ "content": {
33
+ "line": {
34
+ "background": "surface-primary",
35
+ "border": "edge-primary"
36
+ }
37
+ }
38
+ }
39
+ }
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "Tabs",
3
+ "description": "Tab-based navigation with support for pill and line variants. Compound component with TabsList, TabsTrigger, and TabsContent subcomponents.",
4
+ "subcomponents": ["TabsList", "TabsTrigger", "TabsContent"],
5
+ "props": {
6
+ "defaultValue": {
7
+ "type": "string",
8
+ "description": "Default active tab ID for uncontrolled mode"
9
+ },
10
+ "value": {
11
+ "type": "string",
12
+ "description": "Active tab ID for controlled mode"
13
+ },
14
+ "onValueChange": {
15
+ "type": "function",
16
+ "description": "Callback when tab changes (controlled mode)"
17
+ },
18
+ "variant": {
19
+ "type": "enum",
20
+ "values": ["pill", "line"],
21
+ "default": "pill",
22
+ "description": "Visual variant - pill for filled background, line for underline style"
23
+ },
24
+ "layout": {
25
+ "type": "enum",
26
+ "values": ["default", "bottom-tabs"],
27
+ "default": "bottom-tabs",
28
+ "description": "Layout pattern - bottom-tabs for fixed bottom navigation, default for top tabs"
29
+ }
30
+ },
31
+ "slots": {
32
+ "children": {
33
+ "description": "TabsList and TabsContent subcomponents"
34
+ }
35
+ },
36
+ "variants": {
37
+ "pill": {
38
+ "description": "Filled background on active tab with rounded borders"
39
+ },
40
+ "line": {
41
+ "description": "Connected line style with seamless content integration"
42
+ }
43
+ },
44
+ "examples": [
45
+ {
46
+ "name": "Basic tabs (pill variant)",
47
+ "code": "<Tabs defaultValue=\"tab1\">\n <TabsList>\n <TabsTrigger value=\"tab1\">Tab 1</TabsTrigger>\n <TabsTrigger value=\"tab2\">Tab 2</TabsTrigger>\n </TabsList>\n <TabsContent value=\"tab1\">Content for tab 1</TabsContent>\n <TabsContent value=\"tab2\">Content for tab 2</TabsContent>\n</Tabs>"
48
+ },
49
+ {
50
+ "name": "Tabs with icons",
51
+ "code": "<Tabs defaultValue=\"home\" variant=\"pill\">\n <TabsList>\n <TabsTrigger value=\"home\" icon={<HomeIcon />}>Home</TabsTrigger>\n <TabsTrigger value=\"settings\" icon={<SettingsIcon />}>Settings</TabsTrigger>\n </TabsList>\n <TabsContent value=\"home\">Home content</TabsContent>\n <TabsContent value=\"settings\">Settings content</TabsContent>\n</Tabs>"
52
+ },
53
+ {
54
+ "name": "Line variant tabs",
55
+ "code": "<Tabs defaultValue=\"overview\" variant=\"line\">\n <TabsList>\n <TabsTrigger value=\"overview\">Overview</TabsTrigger>\n <TabsTrigger value=\"details\">Details</TabsTrigger>\n </TabsList>\n <TabsContent value=\"overview\">Overview content</TabsContent>\n <TabsContent value=\"details\">Details content</TabsContent>\n</Tabs>"
56
+ },
57
+ {
58
+ "name": "Controlled tabs",
59
+ "code": "<Tabs value={activeTab} onValueChange={setActiveTab}>\n <TabsList>\n <TabsTrigger value=\"first\">First</TabsTrigger>\n <TabsTrigger value=\"second\">Second</TabsTrigger>\n </TabsList>\n <TabsContent value=\"first\">First tab content</TabsContent>\n <TabsContent value=\"second\">Second tab content</TabsContent>\n</Tabs>"
60
+ }
61
+ ]
62
+ }