@duro-app/ui 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/dist/components/ActionBar/ActionBar.meta.d.ts.map +1 -1
  2. package/dist/components/Alert/Alert.meta.d.ts.map +1 -1
  3. package/dist/components/Button/Button.meta.d.ts.map +1 -1
  4. package/dist/components/ButtonGroup/ButtonGroup.meta.d.ts.map +1 -1
  5. package/dist/components/Callout/Callout.meta.d.ts.map +1 -1
  6. package/dist/components/Card/Card.meta.d.ts.map +1 -1
  7. package/dist/components/Checkbox/Checkbox.meta.d.ts.map +1 -1
  8. package/dist/components/CheckboxGroup/CheckboxGroup.meta.d.ts.map +1 -1
  9. package/dist/components/Cluster/Cluster.meta.d.ts.map +1 -1
  10. package/dist/components/ColorInput/ColorInput.meta.d.ts.map +1 -1
  11. package/dist/components/ColorMode/ColorMode.meta.d.ts.map +1 -1
  12. package/dist/components/Combobox/Combobox.meta.d.ts.map +1 -1
  13. package/dist/components/ConfirmDialog/ConfirmDialog.meta.d.ts.map +1 -1
  14. package/dist/components/DetailPanel/DetailPanel.meta.d.ts.map +1 -1
  15. package/dist/components/Dialog/Dialog.meta.d.ts.map +1 -1
  16. package/dist/components/Drawer/Drawer.meta.d.ts.map +1 -1
  17. package/dist/components/Field/Field.meta.d.ts.map +1 -1
  18. package/dist/components/Fieldset/Fieldset.meta.d.ts.map +1 -1
  19. package/dist/components/Form/Form.meta.d.ts.map +1 -1
  20. package/dist/components/Grid/Grid.meta.d.ts.map +1 -1
  21. package/dist/components/Heading/Heading.meta.d.ts.map +1 -1
  22. package/dist/components/Icon/Icon.meta.d.ts.map +1 -1
  23. package/dist/components/Inline/Inline.meta.d.ts.map +1 -1
  24. package/dist/components/Input/Input.meta.d.ts.map +1 -1
  25. package/dist/components/InputGroup/InputGroup.meta.d.ts.map +1 -1
  26. package/dist/components/LinkButton/LinkButton.meta.d.ts.map +1 -1
  27. package/dist/components/List/List.meta.d.ts.map +1 -1
  28. package/dist/components/Menu/Menu.meta.d.ts.map +1 -1
  29. package/dist/components/PageShell/PageShell.meta.d.ts.map +1 -1
  30. package/dist/components/Panel/Panel.meta.d.ts.map +1 -1
  31. package/dist/components/RadioGroup/RadioGroup.meta.d.ts.map +1 -1
  32. package/dist/components/Select/Select.meta.d.ts.map +1 -1
  33. package/dist/components/SideNav/SideNav.meta.d.ts.map +1 -1
  34. package/dist/components/Stack/Stack.meta.d.ts.map +1 -1
  35. package/dist/components/StatusIcon/StatusIcon.meta.d.ts.map +1 -1
  36. package/dist/components/Switch/Switch.meta.d.ts.map +1 -1
  37. package/dist/components/Table/Table.meta.d.ts.map +1 -1
  38. package/dist/components/Tabs/Tabs.meta.d.ts.map +1 -1
  39. package/dist/components/Tag/Tag.meta.d.ts.map +1 -1
  40. package/dist/components/TagGroup/TagGroup.meta.d.ts.map +1 -1
  41. package/dist/components/Text/Text.meta.d.ts.map +1 -1
  42. package/dist/components/Textarea/Textarea.meta.d.ts.map +1 -1
  43. package/dist/components/Toast/Toast.meta.d.ts.map +1 -1
  44. package/dist/components/Toggle/Toggle.meta.d.ts.map +1 -1
  45. package/dist/components/ToggleGroup/ToggleGroup.meta.d.ts.map +1 -1
  46. package/dist/components/VirtualTable/VirtualTable.meta.d.ts.map +1 -1
  47. package/dist/components/component-meta.d.ts +12 -0
  48. package/dist/components/component-meta.d.ts.map +1 -1
  49. package/package.json +2 -2
  50. package/src/components/ActionBar/ActionBar.meta.ts +5 -1
  51. package/src/components/Alert/Alert.meta.ts +1 -0
  52. package/src/components/Button/Button.meta.ts +6 -2
  53. package/src/components/ButtonGroup/ButtonGroup.meta.ts +2 -0
  54. package/src/components/Callout/Callout.meta.ts +1 -0
  55. package/src/components/Card/Card.meta.ts +1 -0
  56. package/src/components/Checkbox/Checkbox.meta.ts +6 -1
  57. package/src/components/CheckboxGroup/CheckboxGroup.meta.ts +12 -2
  58. package/src/components/Cluster/Cluster.meta.ts +10 -2
  59. package/src/components/ColorInput/ColorInput.meta.ts +10 -2
  60. package/src/components/ColorMode/ColorMode.meta.ts +2 -0
  61. package/src/components/Combobox/Combobox.meta.ts +7 -1
  62. package/src/components/ConfirmDialog/ConfirmDialog.meta.ts +10 -2
  63. package/src/components/DetailPanel/DetailPanel.meta.ts +6 -2
  64. package/src/components/Dialog/Dialog.meta.ts +2 -0
  65. package/src/components/Drawer/Drawer.meta.ts +6 -1
  66. package/src/components/Field/Field.meta.ts +8 -4
  67. package/src/components/Fieldset/Fieldset.meta.ts +7 -3
  68. package/src/components/Form/Form.meta.ts +10 -2
  69. package/src/components/Grid/Grid.meta.ts +7 -1
  70. package/src/components/Heading/Heading.meta.ts +5 -1
  71. package/src/components/Icon/Icon.meta.ts +1 -0
  72. package/src/components/Inline/Inline.meta.ts +10 -2
  73. package/src/components/Input/Input.meta.ts +11 -3
  74. package/src/components/InputGroup/InputGroup.meta.ts +6 -1
  75. package/src/components/LinkButton/LinkButton.meta.ts +7 -1
  76. package/src/components/List/List.meta.ts +7 -1
  77. package/src/components/Menu/Menu.meta.ts +6 -2
  78. package/src/components/PageShell/PageShell.meta.ts +6 -2
  79. package/src/components/Panel/Panel.meta.ts +2 -4
  80. package/src/components/RadioGroup/RadioGroup.meta.ts +12 -2
  81. package/src/components/Select/Select.meta.ts +10 -2
  82. package/src/components/SideNav/SideNav.meta.ts +6 -2
  83. package/src/components/Stack/Stack.meta.ts +10 -2
  84. package/src/components/StatusIcon/StatusIcon.meta.ts +10 -2
  85. package/src/components/Switch/Switch.meta.ts +6 -1
  86. package/src/components/Table/Table.meta.ts +5 -1
  87. package/src/components/Tabs/Tabs.meta.ts +5 -1
  88. package/src/components/Tag/Tag.meta.ts +10 -2
  89. package/src/components/TagGroup/TagGroup.meta.ts +11 -3
  90. package/src/components/Text/Text.meta.ts +5 -1
  91. package/src/components/Textarea/Textarea.meta.ts +6 -2
  92. package/src/components/Toast/Toast.meta.ts +2 -0
  93. package/src/components/Toggle/Toggle.meta.ts +11 -3
  94. package/src/components/ToggleGroup/ToggleGroup.meta.ts +6 -2
  95. package/src/components/VirtualTable/VirtualTable.meta.ts +1 -0
  96. package/src/components/component-meta.ts +16 -1
@@ -9,8 +9,16 @@ export const meta: ComponentMeta = {
9
9
  'Non-form interactive UIs — use individual components',
10
10
  ],
11
11
  relatedTo: [
12
- {component: 'Field', relationship: 'Field.Root auto-binds to Form via name prop'},
13
- {component: 'Fieldset', relationship: 'Groups fields visually within a Form'},
12
+ {
13
+ component: 'Field',
14
+ kind: 'composition',
15
+ relationship: 'Field.Root auto-binds to Form via name prop',
16
+ },
17
+ {
18
+ component: 'Fieldset',
19
+ kind: 'composition',
20
+ relationship: 'Groups fields visually within a Form',
21
+ },
14
22
  ],
15
23
  example: `import {Schema} from 'effect'
16
24
 
@@ -11,7 +11,13 @@ export const meta: ComponentMeta = {
11
11
  'Single-column vertical layout — use Stack',
12
12
  'Simple horizontal row — use Inline or Cluster',
13
13
  ],
14
- relatedTo: [{component: 'Stack', relationship: 'Single-column vertical layout'}],
14
+ relatedTo: [
15
+ {
16
+ component: 'Stack',
17
+ kind: 'contrast',
18
+ relationship: 'Grid for multi-column layouts; Stack for a single vertical column',
19
+ },
20
+ ],
15
21
  example: `// Responsive: columns auto-fit based on min width
16
22
  <Grid minColumnWidth="280px" gap="md">
17
23
  <Card>A</Card>
@@ -14,7 +14,11 @@ export const meta: ComponentMeta = {
14
14
  'Non-semantic bold text — use Text with weight',
15
15
  ],
16
16
  relatedTo: [
17
- {component: 'Text', relationship: 'Text for body/label; Heading for semantic headings'},
17
+ {
18
+ component: 'Text',
19
+ kind: 'contrast',
20
+ relationship: 'Text for body/label; Heading for semantic headings',
21
+ },
18
22
  ],
19
23
  example: `<Stack gap="md">
20
24
  <Heading level={1}>Page Title</Heading>
@@ -12,6 +12,7 @@ export const meta: ComponentMeta = {
12
12
  relatedTo: [
13
13
  {
14
14
  component: 'StatusIcon',
15
+ kind: 'composition',
15
16
  relationship: 'StatusIcon wraps Icon with a colored background circle',
16
17
  },
17
18
  ],
@@ -12,8 +12,16 @@ export const meta: ComponentMeta = {
12
12
  'Vertical stacking — use Stack',
13
13
  ],
14
14
  relatedTo: [
15
- {component: 'Cluster', relationship: 'Same but wraps to next line'},
16
- {component: 'Stack', relationship: 'Vertical equivalent'},
15
+ {
16
+ component: 'Cluster',
17
+ kind: 'contrast',
18
+ relationship: 'Cluster wraps when items overflow; Inline stays on one row',
19
+ },
20
+ {
21
+ component: 'Stack',
22
+ kind: 'contrast',
23
+ relationship: 'Stack stacks vertically; Inline lays out horizontally on one row',
24
+ },
17
25
  ],
18
26
  example: `<Inline gap="sm" align="center">
19
27
  <Button>Save</Button>
@@ -6,9 +6,17 @@ export const meta: ComponentMeta = {
6
6
  whenToUse: ['Single-line text entry (text, email, password, url, tel, number, search)'],
7
7
  whenNotToUse: ['Multi-line text — use Textarea', 'Picking from predefined options — use Select'],
8
8
  relatedTo: [
9
- {component: 'Field', relationship: 'Wrap in Field.Root for label + error'},
10
- {component: 'InputGroup', relationship: 'Wrap in InputGroup.Root for prefix/suffix addons'},
11
- {component: 'Textarea', relationship: 'Multi-line variant'},
9
+ {component: 'Field', kind: 'composition', relationship: 'Wrap in Field.Root for label + error'},
10
+ {
11
+ component: 'InputGroup',
12
+ kind: 'composition',
13
+ relationship: 'Wrap in InputGroup.Root for prefix/suffix addons',
14
+ },
15
+ {
16
+ component: 'Textarea',
17
+ kind: 'contrast',
18
+ relationship: 'Input for single-line entry; Textarea for multi-line',
19
+ },
12
20
  ],
13
21
  example: `<Field.Root name="email">
14
22
  <Field.Label>Email</Field.Label>
@@ -17,9 +17,14 @@ export const meta: ComponentMeta = {
17
17
  optional: ['Addon'],
18
18
  },
19
19
  relatedTo: [
20
- {component: 'Input', relationship: 'InputGroup enhances Input with addons'},
20
+ {
21
+ component: 'Input',
22
+ kind: 'composition',
23
+ relationship: 'InputGroup enhances Input with addons',
24
+ },
21
25
  {
22
26
  component: 'Field',
27
+ kind: 'contrast',
23
28
  relationship: 'Field provides label/error; InputGroup provides visual addons',
24
29
  },
25
30
  ],
@@ -11,7 +11,13 @@ export const meta: ComponentMeta = {
11
11
  'Triggering in-page actions — use Button',
12
12
  'Plain text links — use a styled <a> tag',
13
13
  ],
14
- relatedTo: [{component: 'Button', relationship: 'Button for actions; LinkButton for navigation'}],
14
+ relatedTo: [
15
+ {
16
+ component: 'Button',
17
+ kind: 'contrast',
18
+ relationship: 'Button for actions; LinkButton for navigation',
19
+ },
20
+ ],
15
21
  example: `<LinkButton href="/signup" variant="primary">
16
22
  Get started
17
23
  </LinkButton>
@@ -20,11 +20,17 @@ export const meta: ComponentMeta = {
20
20
  relatedTo: [
21
21
  {
22
22
  component: 'Table',
23
+ kind: 'contrast',
23
24
  relationship: 'Table for wide multi-column data; List for narrow compact items',
24
25
  },
25
- {component: 'DetailPanel', relationship: 'List fits naturally inside DetailPanel.Body'},
26
+ {
27
+ component: 'DetailPanel',
28
+ kind: 'composition',
29
+ relationship: 'List fits naturally inside DetailPanel.Body',
30
+ },
26
31
  {
27
32
  component: 'Menu',
33
+ kind: 'contrast',
28
34
  relationship: 'Menu for action menus; List for data display with selection',
29
35
  },
30
36
  ],
@@ -14,8 +14,12 @@ export const meta: ComponentMeta = {
14
14
  optional: ['LinkItem'],
15
15
  },
16
16
  relatedTo: [
17
- {component: 'Select', relationship: 'Select picks values; Menu triggers actions'},
18
- {component: 'Button', relationship: 'Often used as Menu.Trigger content'},
17
+ {
18
+ component: 'Select',
19
+ kind: 'contrast',
20
+ relationship: 'Select picks values; Menu triggers actions',
21
+ },
22
+ {component: 'Button', kind: 'composition', relationship: 'Often used as Menu.Trigger content'},
19
23
  ],
20
24
  example: `<Menu.Root>
21
25
  <Menu.Trigger>
@@ -12,8 +12,12 @@ export const meta: ComponentMeta = {
12
12
  'Sidebar layouts — combine with SideNav manually',
13
13
  ],
14
14
  relatedTo: [
15
- {component: 'Stack', relationship: 'Use Stack for content within PageShell'},
16
- {component: 'SideNav', relationship: 'Often placed alongside PageShell'},
15
+ {
16
+ component: 'Stack',
17
+ kind: 'composition',
18
+ relationship: 'Use Stack for content within PageShell',
19
+ },
20
+ {component: 'SideNav', kind: 'composition', relationship: 'Often placed alongside PageShell'},
17
21
  ],
18
22
  example: `<PageShell maxWidth="lg" padding="md" header={<Heading level={1}>Dashboard</Heading>}>
19
23
  <Stack gap="lg">
@@ -20,14 +20,12 @@ export const meta: ComponentMeta = {
20
20
  relatedTo: [
21
21
  {
22
22
  component: 'Card',
23
+ kind: 'contrast',
23
24
  relationship: 'Card is for shallow, repeated items; Panel is for deep, organized content',
24
25
  },
25
- {
26
- component: 'DetailPanel',
27
- relationship: 'DetailPanel uses Panel internally for its structural layout',
28
- },
29
26
  {
30
27
  component: 'PageShell',
28
+ kind: 'contrast',
31
29
  relationship: 'PageShell is for page-level layout; Panel is for section-level',
32
30
  },
33
31
  ],
@@ -15,10 +15,20 @@ export const meta: ComponentMeta = {
15
15
  relatedTo: [
16
16
  {
17
17
  component: 'CheckboxGroup',
18
+ kind: 'contrast',
18
19
  relationship: 'CheckboxGroup for multi-select; RadioGroup for single-select',
19
20
  },
20
- {component: 'Select', relationship: 'Select for larger option sets or when space is limited'},
21
- {component: 'ToggleGroup', relationship: 'ToggleGroup for toolbar-style selection'},
21
+ {
22
+ component: 'Select',
23
+ kind: 'contrast',
24
+ relationship: 'RadioGroup keeps 2-5 options visible; Select for larger sets or tight space',
25
+ },
26
+ {
27
+ component: 'ToggleGroup',
28
+ kind: 'contrast',
29
+ relationship:
30
+ 'RadioGroup for form single-select; ToggleGroup for segmented/toolbar single-select',
31
+ },
22
32
  ],
23
33
  example: `<RadioGroup.Root defaultValue="email" onValueChange={(v) => console.log(v)}>
24
34
  <RadioGroup.Item value="email">Email</RadioGroup.Item>
@@ -17,8 +17,16 @@ export const meta: ComponentMeta = {
17
17
  optional: ['Value', 'Icon', 'ItemText'],
18
18
  },
19
19
  relatedTo: [
20
- {component: 'Menu', relationship: 'Menu triggers actions; Select picks a value'},
21
- {component: 'ToggleGroup', relationship: 'For visible, small option sets'},
20
+ {
21
+ component: 'Menu',
22
+ kind: 'contrast',
23
+ relationship: 'Menu triggers actions; Select picks a value',
24
+ },
25
+ {
26
+ component: 'ToggleGroup',
27
+ kind: 'contrast',
28
+ relationship: 'Select hides options behind a dropdown; ToggleGroup keeps a small set visible',
29
+ },
22
30
  ],
23
31
  example: `<Select.Root name="role" defaultValue="viewer">
24
32
  <Select.Trigger>
@@ -20,8 +20,12 @@ export const meta: ComponentMeta = {
20
20
  optional: ['Section', 'Group'],
21
21
  },
22
22
  relatedTo: [
23
- {component: 'Tabs', relationship: 'Tabs switch content in-place; SideNav navigates pages'},
24
- {component: 'PageShell', relationship: 'Often placed alongside PageShell'},
23
+ {
24
+ component: 'Tabs',
25
+ kind: 'contrast',
26
+ relationship: 'Tabs switch content in-place; SideNav navigates pages',
27
+ },
28
+ {component: 'PageShell', kind: 'composition', relationship: 'Often placed alongside PageShell'},
25
29
  ],
26
30
  example: `<SideNav.Root defaultValue="identities">
27
31
  {/* Default: always-open sections. Nothing is a click away from being seen. */}
@@ -11,8 +11,16 @@ export const meta: ComponentMeta = {
11
11
  'Grid layouts — use Grid',
12
12
  ],
13
13
  relatedTo: [
14
- {component: 'Inline', relationship: 'Horizontal equivalent (no wrap)'},
15
- {component: 'Cluster', relationship: 'Horizontal equivalent (wraps)'},
14
+ {
15
+ component: 'Inline',
16
+ kind: 'contrast',
17
+ relationship: 'Stack stacks vertically; Inline lays out horizontally on one row',
18
+ },
19
+ {
20
+ component: 'Cluster',
21
+ kind: 'contrast',
22
+ relationship: 'Stack stacks vertically; Cluster lays out horizontally and wraps',
23
+ },
16
24
  ],
17
25
  example: `<Stack gap="md" align="stretch">
18
26
  <Card>First</Card>
@@ -10,8 +10,16 @@ export const meta: ComponentMeta = {
10
10
  ],
11
11
  whenNotToUse: ['Inline icons without background — use Icon', 'Status text labels — use Badge'],
12
12
  relatedTo: [
13
- {component: 'Icon', relationship: 'StatusIcon wraps Icon with background; Icon is bare SVG'},
14
- {component: 'Badge', relationship: 'Badge for text status; StatusIcon for icon status'},
13
+ {
14
+ component: 'Icon',
15
+ kind: 'composition',
16
+ relationship: 'StatusIcon wraps Icon with a colored background circle',
17
+ },
18
+ {
19
+ component: 'Badge',
20
+ kind: 'contrast',
21
+ relationship: 'Badge for text status; StatusIcon for icon status',
22
+ },
15
23
  ],
16
24
  example: `<Inline gap="md">
17
25
  <StatusIcon name="check-circle" variant="success" size="md" />
@@ -14,9 +14,14 @@ export const meta: ComponentMeta = {
14
14
  relatedTo: [
15
15
  {
16
16
  component: 'Checkbox',
17
+ kind: 'contrast',
17
18
  relationship: 'Checkbox for selection/opt-in; Switch for on/off settings',
18
19
  },
19
- {component: 'Toggle', relationship: 'Toggle for toolbar pressed state; Switch for settings'},
20
+ {
21
+ component: 'Toggle',
22
+ kind: 'contrast',
23
+ relationship: 'Toggle for toolbar pressed state; Switch for settings',
24
+ },
20
25
  ],
21
26
  example: `<Switch
22
27
  name="notifications"
@@ -15,7 +15,11 @@ export const meta: ComponentMeta = {
15
15
  required: ['Root', 'Header', 'Body', 'Row', 'HeaderCell', 'Cell'],
16
16
  },
17
17
  relatedTo: [
18
- {component: 'ScrollArea', relationship: 'Wrap Table in ScrollArea for horizontal overflow'},
18
+ {
19
+ component: 'ScrollArea',
20
+ kind: 'composition',
21
+ relationship: 'Wrap Table in ScrollArea for horizontal overflow',
22
+ },
19
23
  ],
20
24
  example: `<Table.Root variant="striped" size="md" columns={3}>
21
25
  <Table.Header>
@@ -16,7 +16,11 @@ export const meta: ComponentMeta = {
16
16
  required: ['Root', 'List', 'Tab', 'Panel'],
17
17
  },
18
18
  relatedTo: [
19
- {component: 'SideNav', relationship: 'For persistent navigation, not content switching'},
19
+ {
20
+ component: 'SideNav',
21
+ kind: 'contrast',
22
+ relationship: 'Tabs switch content in-place; SideNav navigates between pages',
23
+ },
20
24
  ],
21
25
  example: `<Tabs.Root defaultValue="general">
22
26
  <Tabs.List>
@@ -13,8 +13,16 @@ export const meta: ComponentMeta = {
13
13
  'Toggleable selection — use Toggle or ToggleGroup',
14
14
  ],
15
15
  relatedTo: [
16
- {component: 'Badge', relationship: 'Static display variant'},
17
- {component: 'TagGroup', relationship: 'Wrap in TagGroup.Root for collection management'},
16
+ {
17
+ component: 'Badge',
18
+ kind: 'contrast',
19
+ relationship: 'Tag is interactive and removable; Badge is a static label',
20
+ },
21
+ {
22
+ component: 'TagGroup',
23
+ kind: 'composition',
24
+ relationship: 'Wrap in TagGroup.Root for collection management',
25
+ },
18
26
  ],
19
27
  example: `<Tag removable onRemove={() => console.log('removed')}>
20
28
  user@example.com
@@ -14,9 +14,17 @@ export const meta: ComponentMeta = {
14
14
  'Toggle-based selection — use ToggleGroup',
15
15
  ],
16
16
  relatedTo: [
17
- {component: 'Tag', relationship: 'Tag is the item inside TagGroup.List'},
18
- {component: 'Badge', relationship: 'Static display alternative'},
19
- {component: 'Field', relationship: 'Wrap in Field.Root for label + description + error'},
17
+ {component: 'Tag', kind: 'composition', relationship: 'Tag is the item inside TagGroup.List'},
18
+ {
19
+ component: 'Badge',
20
+ kind: 'contrast',
21
+ relationship: 'TagGroup manages an editable collection; Badge is a static label',
22
+ },
23
+ {
24
+ component: 'Field',
25
+ kind: 'composition',
26
+ relationship: 'Wrap in Field.Root for label + description + error',
27
+ },
20
28
  ],
21
29
  example: `<TagGroup.Root name="emails" value={emails} onValueChange={setEmails}>
22
30
  <TagGroup.List aria-label="Emails">
@@ -13,7 +13,11 @@ export const meta: ComponentMeta = {
13
13
  'Form field labels — use Field.Label (auto-binds to form)',
14
14
  ],
15
15
  relatedTo: [
16
- {component: 'Heading', relationship: 'Heading for semantic h1-h6; Text for body/label'},
16
+ {
17
+ component: 'Heading',
18
+ kind: 'contrast',
19
+ relationship: 'Heading for semantic h1-h6; Text for body/label',
20
+ },
17
21
  ],
18
22
  example: `<Stack gap="xs">
19
23
  <Text variant="label">Email</Text>
@@ -6,8 +6,12 @@ export const meta: ComponentMeta = {
6
6
  whenToUse: ['Multi-line text entry (comments, messages, descriptions)'],
7
7
  whenNotToUse: ['Single-line input — use Input'],
8
8
  relatedTo: [
9
- {component: 'Input', relationship: 'Single-line variant'},
10
- {component: 'Field', relationship: 'Wrap in Field.Root for label + error'},
9
+ {
10
+ component: 'Input',
11
+ kind: 'contrast',
12
+ relationship: 'Input for single-line entry; Textarea for multi-line',
13
+ },
14
+ {component: 'Field', kind: 'composition', relationship: 'Wrap in Field.Root for label + error'},
11
15
  ],
12
16
  example: `<Field.Root name="message">
13
17
  <Field.Label>Message</Field.Label>
@@ -16,10 +16,12 @@ export const meta: ComponentMeta = {
16
16
  relatedTo: [
17
17
  {
18
18
  component: 'Alert',
19
+ kind: 'contrast',
19
20
  relationship: 'Alert for inline/in-form status; Toast for action results',
20
21
  },
21
22
  {
22
23
  component: 'ConfirmDialog',
24
+ kind: 'contrast',
23
25
  relationship: 'ConfirmDialog gates a destructive action; Toast reports the outcome',
24
26
  },
25
27
  ],
@@ -13,9 +13,17 @@ export const meta: ComponentMeta = {
13
13
  'Submitting actions — use Button',
14
14
  ],
15
15
  relatedTo: [
16
- {component: 'ToggleGroup', relationship: 'Group of Toggles with single/multi select'},
17
- {component: 'Switch', relationship: 'Switch for settings; Toggle for toolbar actions'},
18
- {component: 'Button', relationship: 'Button for actions; Toggle for state'},
16
+ {
17
+ component: 'ToggleGroup',
18
+ kind: 'composition',
19
+ relationship: 'Group of Toggles with single/multi select',
20
+ },
21
+ {
22
+ component: 'Switch',
23
+ kind: 'contrast',
24
+ relationship: 'Switch for settings; Toggle for toolbar actions',
25
+ },
26
+ {component: 'Button', kind: 'contrast', relationship: 'Button for actions; Toggle for state'},
19
27
  ],
20
28
  example: `// Standalone
21
29
  <Toggle pressed={isBold} onPressedChange={setIsBold} aria-label="Bold">
@@ -13,8 +13,12 @@ export const meta: ComponentMeta = {
13
13
  'Form checkboxes — use Checkbox group in Fieldset',
14
14
  ],
15
15
  relatedTo: [
16
- {component: 'Toggle', relationship: 'Toggle children get group context'},
17
- {component: 'Select', relationship: 'Select for larger option sets'},
16
+ {component: 'Toggle', kind: 'composition', relationship: 'Toggle children get group context'},
17
+ {
18
+ component: 'Select',
19
+ kind: 'contrast',
20
+ relationship: 'Select hides options behind a dropdown; ToggleGroup keeps a small set visible',
21
+ },
18
22
  ],
19
23
  example: `<ToggleGroup
20
24
  value={selected}
@@ -26,6 +26,7 @@ export const meta: ComponentMeta = {
26
26
  relatedTo: [
27
27
  {
28
28
  component: 'Table',
29
+ kind: 'contrast',
29
30
  relationship: 'Table is semantic + paginated; VirtualTable windows large lists',
30
31
  },
31
32
  ],
@@ -3,6 +3,21 @@ export interface ComponentMeta {
3
3
  whenToUse: string[]
4
4
  whenNotToUse: string[]
5
5
  anatomy?: {required: string[]; optional?: string[]}
6
- relatedTo?: Array<{component: string; relationship: string}>
6
+ /**
7
+ * Neighbouring components and how they relate.
8
+ *
9
+ * `kind` is required because the two relationships are not interchangeable
10
+ * and tooling has to tell them apart: `contrast` means the two are
11
+ * alternatives you pick BETWEEN ("Switch for on/off settings; Checkbox for
12
+ * opt-in"), `composition` means one goes INSIDE the other ("Place Input
13
+ * inside Field.Root"). The session-start catalog surfaces the contrast half
14
+ * as a wrong-pick guard, so an edge filed under the wrong kind quietly
15
+ * either disappears from it or pollutes it.
16
+ */
17
+ relatedTo?: Array<{
18
+ component: string
19
+ kind: 'contrast' | 'composition'
20
+ relationship: string
21
+ }>
7
22
  example: string
8
23
  }