ui-lab-registry 0.3.1 → 0.3.2

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 (196) hide show
  1. package/dist/component-dependencies.d.ts +0 -11
  2. package/dist/component-dependencies.d.ts.map +1 -1
  3. package/dist/component-dependencies.js +4 -4
  4. package/dist/component-dependencies.js.map +1 -1
  5. package/dist/components/Color/examples/03-format-switching.d.ts +0 -4
  6. package/dist/components/Color/examples/03-format-switching.d.ts.map +1 -1
  7. package/dist/components/Color/examples/03-format-switching.js +2 -2
  8. package/dist/components/Color/examples/03-format-switching.js.map +1 -1
  9. package/dist/components/Color/examples.json +0 -5
  10. package/dist/components/Command/examples/01-basic-command.js +1 -1
  11. package/dist/components/Command/examples/01-basic-command.js.map +1 -1
  12. package/dist/components/Command/examples.json +1 -1
  13. package/dist/components/Command/index.js +3 -3
  14. package/dist/components/Command/index.js.map +1 -1
  15. package/dist/components/Divider/examples/02-pattern-variants.js +1 -1
  16. package/dist/components/Divider/examples.json +1 -1
  17. package/dist/components/Grid/examples/01-basic-grid.js +1 -1
  18. package/dist/components/Grid/examples/01-basic-grid.js.map +1 -1
  19. package/dist/components/Grid/examples.json +1 -1
  20. package/dist/components/Grid/index.js +2 -2
  21. package/dist/components/Grid/index.js.map +1 -1
  22. package/dist/components/Input/examples/02-validation.js +1 -1
  23. package/dist/components/Input/examples/02-validation.js.map +1 -1
  24. package/dist/components/Input/examples.json +1 -1
  25. package/dist/components/Path/examples.json +0 -5
  26. package/dist/components/Radio/index.js +1 -1
  27. package/dist/components/Select/examples/02-searchable-select.js +1 -1
  28. package/dist/components/Select/examples/02-searchable-select.js.map +1 -1
  29. package/dist/components/Select/examples.json +1 -1
  30. package/dist/components/Tabs/examples/01-basic-tabs.js +2 -2
  31. package/dist/components/Tabs/examples/01-basic-tabs.js.map +1 -1
  32. package/dist/components/Tabs/examples/02-vertical-tabs.js +2 -2
  33. package/dist/components/Tabs/examples/02-vertical-tabs.js.map +1 -1
  34. package/dist/components/Tabs/examples.json +2 -2
  35. package/dist/components/Tabs/index.js +11 -11
  36. package/dist/components/Tabs/index.js.map +1 -1
  37. package/dist/elements/AI/AIChatInput/index.js +1 -1
  38. package/dist/elements/AI/AIChatInput/variations/02-with-suggestions/index.js +1 -1
  39. package/dist/elements/AI/AIChatInput/variations/02-with-suggestions/layout/PromptInputWithSuggestions.js +1 -1
  40. package/dist/elements/AI/AIChatInput/variations.json +2 -2
  41. package/dist/elements/AI/ChainOfThought/index.js +1 -1
  42. package/dist/elements/AI/Chat/index.js +1 -1
  43. package/dist/elements/AI/Chat/variations/02-with-actions/index.js +1 -1
  44. package/dist/elements/AI/Chat/variations.json +1 -1
  45. package/dist/elements/Documentation/CopyPage/index.js +1 -1
  46. package/dist/elements/Documentation/NextArticle/index.js +1 -1
  47. package/dist/elements/Documentation/NextArticle/variations/01-basic/layout/NextArticleCard.js +1 -1
  48. package/dist/elements/Documentation/NextArticle/variations/02-with-icon/layout/NextArticleWithIconCard.js +1 -1
  49. package/dist/elements/Documentation/NextArticle/variations.json +2 -2
  50. package/dist/elements/Documentation/TOC/index.js +1 -1
  51. package/dist/generated-data.d.ts.map +1 -1
  52. package/dist/generated-data.js +213 -947
  53. package/dist/generated-data.js.map +1 -1
  54. package/dist/generated-styles.d.ts.map +1 -1
  55. package/dist/generated-styles.js +171 -63
  56. package/dist/generated-styles.js.map +1 -1
  57. package/dist/generated-styles.json +171 -63
  58. package/dist/patterns/data/data-table-row/metadata.json +3 -3
  59. package/dist/patterns/data/data-table-row/variations/expandable/index.js +1 -1
  60. package/dist/patterns/data/data-table-row/variations/main/index.js +1 -1
  61. package/dist/patterns/data/data-table-row/variations/selectable/index.js +1 -1
  62. package/dist/patterns/data/progress-metric/metadata.json +3 -3
  63. package/dist/patterns/data/progress-metric/variations/colored/index.js +1 -1
  64. package/dist/patterns/data/progress-metric/variations/main/index.js +1 -1
  65. package/dist/patterns/data/progress-metric/variations/stacked/index.js +1 -1
  66. package/dist/patterns/form/labeled-field/metadata.json +4 -4
  67. package/dist/patterns/form/labeled-field/variations/main/index.js +1 -1
  68. package/dist/patterns/form/labeled-field/variations/with-error/index.js +1 -1
  69. package/dist/patterns/form/labeled-field/variations/with-hint/index.js +1 -1
  70. package/dist/patterns/form/select-row/metadata.json +2 -2
  71. package/dist/patterns/form/select-row/variations/main/index.js +1 -1
  72. package/dist/patterns/form/select-row/variations/with-icon/index.js +1 -1
  73. package/dist/patterns/form/toggle-setting-row/metadata.json +2 -2
  74. package/dist/patterns/form/toggle-setting-row/variations/destructive/index.js +1 -1
  75. package/dist/patterns/form/toggle-setting-row/variations/main/index.js +1 -1
  76. package/dist/patterns/interaction/icon-action-bar/variations/compact/index.js +1 -1
  77. package/dist/patterns/layout/media-object/metadata.json +1 -1
  78. package/dist/patterns/layout/media-object/variations/sm/index.js +1 -1
  79. package/dist/patterns/layout/split-row/metadata.json +3 -3
  80. package/dist/patterns/layout/split-row/variations/actions/index.js +1 -1
  81. package/dist/patterns/layout/split-row/variations/main/index.js +1 -1
  82. package/dist/patterns/layout/split-row/variations/meta/index.js +1 -1
  83. package/dist/patterns/layout/stat-block/metadata.json +3 -3
  84. package/dist/patterns/layout/stat-block/variations/compact/index.js +1 -1
  85. package/dist/patterns/layout/stat-block/variations/main/index.js +1 -1
  86. package/dist/patterns/layout/stat-block/variations/with-icon/index.js +1 -1
  87. package/dist/registry.d.ts.map +1 -1
  88. package/dist/registry.js +17 -27
  89. package/dist/registry.js.map +1 -1
  90. package/dist/sections/CTA/variations/02-split/index.js +1 -1
  91. package/dist/sections/CTA/variations.json +1 -1
  92. package/dist/sections/Pricing/variations/01-cards/index.js +1 -1
  93. package/dist/sections/Pricing/variations/02-comparison/index.js +1 -1
  94. package/dist/sections/Pricing/variations.json +2 -2
  95. package/dist/sections/categories.d.ts +0 -11
  96. package/dist/sections/categories.d.ts.map +1 -1
  97. package/dist/sections/categories.js +2 -2
  98. package/dist/sections/categories.js.map +1 -1
  99. package/dist/starters/NextJS/index.js +1 -1
  100. package/dist/types.d.ts +0 -5
  101. package/dist/types.d.ts.map +1 -1
  102. package/dist/utils/load-component-examples.d.ts +3 -2
  103. package/dist/utils/load-component-examples.d.ts.map +1 -1
  104. package/package.json +2 -6
  105. package/src/component-dependencies.ts +4 -4
  106. package/src/components/Anchor/metadata.json +1 -1
  107. package/src/components/Banner/metadata.json +1 -1
  108. package/src/components/Code/metadata.json +1 -1
  109. package/src/components/Color/examples/03-format-switching.tsx +3 -3
  110. package/src/components/Color/examples.json +0 -5
  111. package/src/components/Command/examples/01-basic-command.tsx +1 -1
  112. package/src/components/Command/examples.json +1 -1
  113. package/src/components/Command/index.tsx +3 -3
  114. package/src/components/Date/metadata.json +1 -1
  115. package/src/components/Divider/examples/02-pattern-variants.tsx +3 -3
  116. package/src/components/Divider/examples.json +1 -1
  117. package/src/components/Flex/metadata.json +1 -1
  118. package/src/components/Gallery/metadata.json +1 -1
  119. package/src/components/Grid/examples/01-basic-grid.tsx +1 -1
  120. package/src/components/Grid/examples.json +1 -1
  121. package/src/components/Grid/index.tsx +2 -2
  122. package/src/components/Group/metadata.json +1 -1
  123. package/src/components/Input/examples/02-validation.tsx +2 -2
  124. package/src/components/Input/examples.json +1 -1
  125. package/src/components/List/metadata.json +1 -1
  126. package/src/components/Page/metadata.json +1 -1
  127. package/src/components/Panel/metadata.json +1 -1
  128. package/src/components/Path/examples.json +0 -5
  129. package/src/components/Radio/index.tsx +1 -1
  130. package/src/components/Select/examples/02-searchable-select.tsx +1 -1
  131. package/src/components/Select/examples.json +1 -1
  132. package/src/components/Tabs/examples/01-basic-tabs.tsx +12 -12
  133. package/src/components/Tabs/examples/02-vertical-tabs.tsx +19 -19
  134. package/src/components/Tabs/examples.json +2 -2
  135. package/src/components/Tabs/index.tsx +45 -45
  136. package/src/elements/AI/AIChatInput/index.tsx +2 -2
  137. package/src/elements/AI/AIChatInput/variations/02-with-suggestions/index.tsx +1 -1
  138. package/src/elements/AI/AIChatInput/variations/02-with-suggestions/layout/PromptInputWithSuggestions.tsx +1 -1
  139. package/src/elements/AI/AIChatInput/variations.json +2 -2
  140. package/src/elements/AI/ChainOfThought/index.tsx +1 -1
  141. package/src/elements/AI/Chat/index.tsx +4 -4
  142. package/src/elements/AI/Chat/variations/02-with-actions/index.tsx +3 -3
  143. package/src/elements/AI/Chat/variations.json +1 -1
  144. package/src/elements/Documentation/CopyPage/index.tsx +1 -1
  145. package/src/elements/Documentation/NextArticle/index.tsx +1 -1
  146. package/src/elements/Documentation/NextArticle/variations/01-basic/layout/NextArticleCard.tsx +1 -1
  147. package/src/elements/Documentation/NextArticle/variations/02-with-icon/layout/NextArticleWithIconCard.tsx +1 -1
  148. package/src/elements/Documentation/NextArticle/variations.json +2 -2
  149. package/src/elements/Documentation/TOC/index.tsx +4 -4
  150. package/src/generated-data.ts +213 -947
  151. package/src/generated-styles.ts +171 -63
  152. package/src/patterns/data/data-table-row/metadata.json +4 -4
  153. package/src/patterns/data/data-table-row/variations/expandable/index.tsx +3 -3
  154. package/src/patterns/data/data-table-row/variations/main/index.tsx +2 -2
  155. package/src/patterns/data/data-table-row/variations/selectable/index.tsx +2 -2
  156. package/src/patterns/data/progress-metric/metadata.json +4 -4
  157. package/src/patterns/data/progress-metric/variations/colored/index.tsx +2 -2
  158. package/src/patterns/data/progress-metric/variations/main/index.tsx +2 -2
  159. package/src/patterns/data/progress-metric/variations/stacked/index.tsx +2 -2
  160. package/src/patterns/form/labeled-field/metadata.json +5 -5
  161. package/src/patterns/form/labeled-field/variations/main/index.tsx +1 -1
  162. package/src/patterns/form/labeled-field/variations/with-error/index.tsx +1 -1
  163. package/src/patterns/form/labeled-field/variations/with-hint/index.tsx +1 -1
  164. package/src/patterns/form/select-row/metadata.json +3 -3
  165. package/src/patterns/form/select-row/variations/main/index.tsx +1 -1
  166. package/src/patterns/form/select-row/variations/with-icon/index.tsx +1 -1
  167. package/src/patterns/form/toggle-setting-row/metadata.json +3 -3
  168. package/src/patterns/form/toggle-setting-row/variations/destructive/index.tsx +1 -1
  169. package/src/patterns/form/toggle-setting-row/variations/main/index.tsx +1 -1
  170. package/src/patterns/interaction/icon-action-bar/variations/compact/index.tsx +1 -1
  171. package/src/patterns/layout/media-object/metadata.json +2 -2
  172. package/src/patterns/layout/media-object/variations/sm/index.tsx +2 -2
  173. package/src/patterns/layout/split-row/metadata.json +4 -4
  174. package/src/patterns/layout/split-row/variations/actions/index.tsx +1 -1
  175. package/src/patterns/layout/split-row/variations/main/index.tsx +2 -2
  176. package/src/patterns/layout/split-row/variations/meta/index.tsx +3 -3
  177. package/src/patterns/layout/stat-block/metadata.json +4 -4
  178. package/src/patterns/layout/stat-block/variations/compact/index.tsx +1 -1
  179. package/src/patterns/layout/stat-block/variations/main/index.tsx +1 -1
  180. package/src/patterns/layout/stat-block/variations/with-icon/index.tsx +1 -1
  181. package/src/registry.ts +17 -27
  182. package/src/sections/CTA/variations/02-split/index.tsx +1 -1
  183. package/src/sections/CTA/variations.json +1 -1
  184. package/src/sections/Pricing/variations/01-cards/index.tsx +1 -1
  185. package/src/sections/Pricing/variations/02-comparison/index.tsx +1 -1
  186. package/src/sections/Pricing/variations.json +2 -2
  187. package/src/sections/categories.ts +2 -2
  188. package/src/starters/NextJS/index.tsx +2 -2
  189. package/src/types.ts +1 -1
  190. package/src/utils/load-component-examples.ts +2 -2
  191. package/src/components/Path/examples/01-basic-breadcrumbs.tsx +0 -17
  192. package/src/providers/Theme/examples/01-provider-setup.tsx +0 -37
  193. package/src/providers/Theme/examples/02-toggle-component.tsx +0 -52
  194. package/src/providers/Theme/examples/03-advanced-patterns.tsx +0 -138
  195. package/src/providers/Theme/examples/index.ts +0 -3
  196. package/src/src/generated-styles.ts +0 -1359
@@ -15,19 +15,19 @@
15
15
  ],
16
16
  "complexity": "simple",
17
17
  "notes": "hover:bg-background-900 for interactive rows. group class on the row enables child opacity transitions for action buttons that appear on hover.",
18
- "code": "import { Badge } from 'ui-lab-components'\n\nconst statusVariant = {\n active: 'success',\n pending: 'warning',\n failed: 'danger',\n inactive: 'default',\n} as const\n\nfunction DataTableRow({ primary, secondary, status, timestamp }) {\n return (\n <div className=\"flex items-center gap-4 px-4 py-3 border-b border-background-800 hover:bg-background-900 transition-colors\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-foreground-200 truncate\">{primary}</p>\n <p className=\"text-xs text-foreground-400 truncate\">{secondary}</p>\n </div>\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n <span className=\"text-xs text-foreground-400\">{timestamp}</span>\n <Badge size=\"sm\" variant={statusVariant[status] ?? 'default'}>{status}</Badge>\n </div>\n </div>\n )\n}",
18
+ "code": "import { Badge } from 'ui-lab-components'\n\nconst statusVariant = {\n active: 'success',\n pending: 'warning',\n failed: 'danger',\n inactive: 'default',\n} as const\n\nfunction DataTableRow({ primary, secondary, status, timestamp }) {\n return (\n <div className=\"flex items-center gap-4 px-4 py-3 border-b border-background-800 hover:bg-background-900 transition-colors\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-foreground-200 truncate\">{primary}</p>\n <p className=\"text-sm text-foreground-400 truncate\">{secondary}</p>\n </div>\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n <span className=\"text-sm text-foreground-400\">{timestamp}</span>\n <Badge size=\"sm\" variant={statusVariant[status] ?? 'default'}>{status}</Badge>\n </div>\n </div>\n )\n}",
19
19
  "variations": [
20
20
  {
21
21
  "id": "data-table-row-selectable",
22
22
  "name": "Selectable",
23
23
  "description": "Leading Checkbox for multi-select operations.",
24
- "code": "import { Badge, Checkbox } from 'ui-lab-components'\n\nconst statusVariant = {\n active: 'success',\n pending: 'warning',\n failed: 'danger',\n inactive: 'default',\n} as const\n\nfunction DataTableRowSelectable({ primary, secondary, status, timestamp, isSelected, onChange }) {\n return (\n <div className={`flex items-center gap-4 px-4 py-3 border-b border-background-800 transition-colors ${isSelected ? 'bg-background-900' : 'hover:bg-background-900'}`}>\n <Checkbox isSelected={isSelected} onChange={onChange} aria-label={`Select ${primary}`} />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-foreground-200 truncate\">{primary}</p>\n <p className=\"text-xs text-foreground-400 truncate\">{secondary}</p>\n </div>\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n <span className=\"text-xs text-foreground-400\">{timestamp}</span>\n <Badge size=\"sm\" variant={statusVariant[status] ?? 'default'}>{status}</Badge>\n </div>\n </div>\n )\n}"
24
+ "code": "import { Badge, Checkbox } from 'ui-lab-components'\n\nconst statusVariant = {\n active: 'success',\n pending: 'warning',\n failed: 'danger',\n inactive: 'default',\n} as const\n\nfunction DataTableRowSelectable({ primary, secondary, status, timestamp, isSelected, onChange }) {\n return (\n <div className={`flex items-center gap-4 px-4 py-3 border-b border-background-800 transition-colors ${isSelected ? 'bg-background-900' : 'hover:bg-background-900'}`}>\n <Checkbox isSelected={isSelected} onChange={onChange} aria-label={`Select ${primary}`} />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-foreground-200 truncate\">{primary}</p>\n <p className=\"text-sm text-foreground-400 truncate\">{secondary}</p>\n </div>\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n <span className=\"text-sm text-foreground-400\">{timestamp}</span>\n <Badge size=\"sm\" variant={statusVariant[status] ?? 'default'}>{status}</Badge>\n </div>\n </div>\n )\n}"
25
25
  },
26
26
  {
27
27
  "id": "data-table-row-expandable",
28
28
  "name": "Expandable",
29
29
  "description": "Trailing chevron button that toggles an expanded detail area below the row.",
30
- "code": "import { Badge, Button } from 'ui-lab-components'\nimport { useState } from 'react'\n\nconst statusVariant = {\n active: 'success',\n pending: 'warning',\n failed: 'danger',\n inactive: 'default',\n} as const\n\nfunction DataTableRowExpandable({ primary, secondary, status, timestamp, details }) {\n const [expanded, setExpanded] = useState(false)\n return (\n <div className=\"border-b border-background-800\">\n <div className=\"flex items-center gap-4 px-4 py-3 hover:bg-background-900 transition-colors\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-foreground-200 truncate\">{primary}</p>\n <p className=\"text-xs text-foreground-400 truncate\">{secondary}</p>\n </div>\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n <span className=\"text-xs text-foreground-400\">{timestamp}</span>\n <Badge size=\"sm\" variant={statusVariant[status] ?? 'default'}>{status}</Badge>\n <Button variant=\"ghost\" size=\"sm\" onPress={() => setExpanded(!expanded)} aria-label=\"Toggle details\">\n <svg width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" className={`transition-transform ${expanded ? 'rotate-180' : ''}`}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </Button>\n </div>\n </div>\n {expanded && (\n <div className=\"px-4 pb-3 text-xs text-foreground-400\">{details}</div>\n )}\n </div>\n )\n}"
30
+ "code": "import { Badge, Button } from 'ui-lab-components'\nimport { useState } from 'react'\n\nconst statusVariant = {\n active: 'success',\n pending: 'warning',\n failed: 'danger',\n inactive: 'default',\n} as const\n\nfunction DataTableRowExpandable({ primary, secondary, status, timestamp, details }) {\n const [expanded, setExpanded] = useState(false)\n return (\n <div className=\"border-b border-background-800\">\n <div className=\"flex items-center gap-4 px-4 py-3 hover:bg-background-900 transition-colors\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-foreground-200 truncate\">{primary}</p>\n <p className=\"text-sm text-foreground-400 truncate\">{secondary}</p>\n </div>\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n <span className=\"text-sm text-foreground-400\">{timestamp}</span>\n <Badge size=\"sm\" variant={statusVariant[status] ?? 'default'}>{status}</Badge>\n <Button variant=\"ghost\" size=\"sm\" onPress={() => setExpanded(!expanded)} aria-label=\"Toggle details\">\n <svg width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" className={`transition-transform ${expanded ? 'rotate-180' : ''}`}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </Button>\n </div>\n </div>\n {expanded && (\n <div className=\"px-4 pb-3 text-sm text-foreground-400\">{details}</div>\n )}\n </div>\n )\n}"
31
31
  }
32
32
  ]
33
- }
33
+ }
@@ -13,10 +13,10 @@ function DataTableRowExpandable({ primary, secondary, status, timestamp, details
13
13
  <div className="flex items-center gap-4 px-4 py-3 hover:bg-background-900 transition-colors">
14
14
  <div className="flex-1 min-w-0">
15
15
  <p className="text-sm font-medium text-foreground-200 truncate">{primary}</p>
16
- <p className="text-xs text-foreground-400 truncate">{secondary}</p>
16
+ <p className="text-sm text-foreground-400 truncate">{secondary}</p>
17
17
  </div>
18
18
  <div className="flex items-center gap-2 flex-shrink-0">
19
- <span className="text-xs text-foreground-400">{timestamp}</span>
19
+ <span className="text-sm text-foreground-400">{timestamp}</span>
20
20
  <Badge size="sm" variant={statusVariant[status] ?? 'default'}>{status}</Badge>
21
21
  <Button variant="ghost" size="sm" onPress={() => setExpanded(!expanded)} aria-label="Toggle details">
22
22
  <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24" className={`transition-transform ${expanded ? 'rotate-180' : ''}`}>
@@ -25,7 +25,7 @@ function DataTableRowExpandable({ primary, secondary, status, timestamp, details
25
25
  </Button>
26
26
  </div>
27
27
  </div>
28
- {expanded && <div className="px-4 pb-3 text-xs text-foreground-400">{details}</div>}
28
+ {expanded && <div className="px-4 pb-3 text-sm text-foreground-400">{details}</div>}
29
29
  </div>
30
30
  );
31
31
  }
@@ -8,10 +8,10 @@ function DataTableRow({ primary, secondary, status, timestamp }: { primary: stri
8
8
  <div className="flex items-center gap-4 px-4 py-3 border-b border-background-800 hover:bg-background-900 transition-colors">
9
9
  <div className="flex-1 min-w-0">
10
10
  <p className="text-sm font-medium text-foreground-200 truncate">{primary}</p>
11
- <p className="text-xs text-foreground-400 truncate">{secondary}</p>
11
+ <p className="text-sm text-foreground-400 truncate">{secondary}</p>
12
12
  </div>
13
13
  <div className="flex items-center gap-2 flex-shrink-0">
14
- <span className="text-xs text-foreground-400">{timestamp}</span>
14
+ <span className="text-sm text-foreground-400">{timestamp}</span>
15
15
  <Badge size="sm" variant={statusVariant[status] ?? 'default'}>{status}</Badge>
16
16
  </div>
17
17
  </div>
@@ -19,10 +19,10 @@ function DataTableRowSelectable({ primary, secondary, status, timestamp, isSelec
19
19
  <Checkbox checked={isSelected} onChange={onChange} aria-label={`Select ${primary}`} />
20
20
  <div className="flex-1 min-w-0">
21
21
  <p className="text-sm font-medium text-foreground-200 truncate">{primary}</p>
22
- <p className="text-xs text-foreground-400 truncate">{secondary}</p>
22
+ <p className="text-sm text-foreground-400 truncate">{secondary}</p>
23
23
  </div>
24
24
  <div className="flex items-center gap-2 flex-shrink-0">
25
- <span className="text-xs text-foreground-400">{timestamp}</span>
25
+ <span className="text-sm text-foreground-400">{timestamp}</span>
26
26
  <Badge size="sm" variant={statusVariant[status] ?? 'default'}>{status}</Badge>
27
27
  </div>
28
28
  </div>
@@ -15,19 +15,19 @@
15
15
  ],
16
16
  "complexity": "simple",
17
17
  "notes": "Fixed-width label with flex-1 on the bar prevents layout shift when label text varies. Trailing value is right-aligned with a fixed width.",
18
- "code": "import { Progress } from 'ui-lab-components'\n\nfunction ProgressMetric({ label, value, max = 100 }) {\n const pct = Math.round((value / max) * 100)\n return (\n <div className=\"flex items-center gap-3\">\n <span className=\"text-xs text-foreground-400 w-32 flex-shrink-0 truncate\">{label}</span>\n <Progress value={value} maxValue={max} className=\"flex-1\" />\n <span className=\"text-xs text-foreground-400 w-8 text-right flex-shrink-0 tabular-nums\">{pct}%</span>\n </div>\n )\n}",
18
+ "code": "import { Progress } from 'ui-lab-components'\n\nfunction ProgressMetric({ label, value, max = 100 }) {\n const pct = Math.round((value / max) * 100)\n return (\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm text-foreground-400 w-32 flex-shrink-0 truncate\">{label}</span>\n <Progress value={value} maxValue={max} className=\"flex-1\" />\n <span className=\"text-sm text-foreground-400 w-8 text-right flex-shrink-0 tabular-nums\">{pct}%</span>\n </div>\n )\n}",
19
19
  "variations": [
20
20
  {
21
21
  "id": "progress-metric-stacked",
22
22
  "name": "Stacked",
23
23
  "description": "Label above the bar, value below \u2014 for wider display areas where horizontal space is not constrained.",
24
- "code": "import { Progress } from 'ui-lab-components'\n\nfunction ProgressMetricStacked({ label, value, max = 100 }) {\n const pct = Math.round((value / max) * 100)\n return (\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-medium text-foreground-300\">{label}</span>\n <span className=\"text-xs text-foreground-400 tabular-nums\">{pct}%</span>\n </div>\n <Progress value={value} maxValue={max} />\n </div>\n )\n}"
24
+ "code": "import { Progress } from 'ui-lab-components'\n\nfunction ProgressMetricStacked({ label, value, max = 100 }) {\n const pct = Math.round((value / max) * 100)\n return (\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-foreground-300\">{label}</span>\n <span className=\"text-sm text-foreground-400 tabular-nums\">{pct}%</span>\n </div>\n <Progress value={value} maxValue={max} />\n </div>\n )\n}"
25
25
  },
26
26
  {
27
27
  "id": "progress-metric-colored",
28
28
  "name": "Semantic Color",
29
29
  "description": "Bar color shifts to reflect semantic state \u2014 accent for normal, muted warning for high usage.",
30
- "code": "import { Progress } from 'ui-lab-components'\n\nfunction ProgressMetricColored({ label, value, max = 100 }) {\n const pct = Math.round((value / max) * 100)\n const isHigh = pct >= 80\n return (\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-medium text-foreground-300\">{label}</span>\n <span className={`text-xs tabular-nums ${isHigh ? 'text-foreground-200' : 'text-foreground-400'}`}>\n {pct}%\n </span>\n </div>\n <Progress\n value={value}\n maxValue={max}\n className={isHigh ? 'text-foreground-300' : undefined}\n />\n </div>\n )\n}"
30
+ "code": "import { Progress } from 'ui-lab-components'\n\nfunction ProgressMetricColored({ label, value, max = 100 }) {\n const pct = Math.round((value / max) * 100)\n const isHigh = pct >= 80\n return (\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-foreground-300\">{label}</span>\n <span className={`text-sm tabular-nums ${isHigh ? 'text-foreground-200' : 'text-foreground-400'}`}>\n {pct}%\n </span>\n </div>\n <Progress\n value={value}\n maxValue={max}\n className={isHigh ? 'text-foreground-300' : undefined}\n />\n </div>\n )\n}"
31
31
  }
32
32
  ]
33
- }
33
+ }
@@ -7,8 +7,8 @@ function ProgressMetricColored({ label, value, max = 100 }: { label: string; val
7
7
  return (
8
8
  <div className="flex flex-col gap-1.5">
9
9
  <div className="flex items-center justify-between">
10
- <span className="text-xs font-medium text-foreground-300">{label}</span>
11
- <span className={`text-xs tabular-nums ${isHigh ? 'text-foreground-200' : 'text-foreground-400'}`}>{pct}%</span>
10
+ <span className="text-sm font-medium text-foreground-300">{label}</span>
11
+ <span className={`text-sm tabular-nums ${isHigh ? 'text-foreground-200' : 'text-foreground-400'}`}>{pct}%</span>
12
12
  </div>
13
13
  <Progress value={value} max={max} className={isHigh ? 'text-foreground-300' : undefined} />
14
14
  </div>
@@ -5,9 +5,9 @@ function ProgressMetric({ label, value, max = 100 }: { label: string; value: num
5
5
  const pct = Math.round((value / max) * 100);
6
6
  return (
7
7
  <div className="flex items-center gap-3">
8
- <span className="text-xs text-foreground-400 w-32 flex-shrink-0 truncate">{label}</span>
8
+ <span className="text-sm text-foreground-400 w-32 flex-shrink-0 truncate">{label}</span>
9
9
  <Progress value={value} max={max} className="flex-1" />
10
- <span className="text-xs text-foreground-400 w-8 text-right flex-shrink-0 tabular-nums">{pct}%</span>
10
+ <span className="text-sm text-foreground-400 w-8 text-right flex-shrink-0 tabular-nums">{pct}%</span>
11
11
  </div>
12
12
  );
13
13
  }
@@ -6,8 +6,8 @@ function ProgressMetricStacked({ label, value, max = 100 }: { label: string; val
6
6
  return (
7
7
  <div className="flex flex-col gap-1.5">
8
8
  <div className="flex items-center justify-between">
9
- <span className="text-xs font-medium text-foreground-300">{label}</span>
10
- <span className="text-xs text-foreground-400 tabular-nums">{pct}%</span>
9
+ <span className="text-sm font-medium text-foreground-300">{label}</span>
10
+ <span className="text-sm text-foreground-400 tabular-nums">{pct}%</span>
11
11
  </div>
12
12
  <Progress value={value} max={max} />
13
13
  </div>
@@ -12,20 +12,20 @@
12
12
  "helper"
13
13
  ],
14
14
  "complexity": "simple",
15
- "notes": "gap-1.5 between label and input is the standard spacing. Helper text uses text-foreground-400 at text-xs. Error state replaces helper text with an error message.",
16
- "code": "import { Label, Input } from 'ui-lab-components'\n\nfunction LabeledField({ id, label, placeholder, hint }) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor={id}>{label}</Label>\n <Input id={id} placeholder={placeholder} />\n {hint && <p className=\"text-xs text-foreground-400\">{hint}</p>}\n </div>\n )\n}",
15
+ "notes": "gap-1.5 between label and input is the standard spacing. Helper text uses text-foreground-400 at text-sm. Error state replaces helper text with an error message.",
16
+ "code": "import { Label, Input } from 'ui-lab-components'\n\nfunction LabeledField({ id, label, placeholder, hint }) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor={id}>{label}</Label>\n <Input id={id} placeholder={placeholder} />\n {hint && <p className=\"text-sm text-foreground-400\">{hint}</p>}\n </div>\n )\n}",
17
17
  "variations": [
18
18
  {
19
19
  "id": "labeled-field-with-hint",
20
20
  "name": "With Hint",
21
21
  "description": "Gray helper text below the input providing format or context guidance.",
22
- "code": "import { Label, Input } from 'ui-lab-components'\n\nfunction LabeledFieldWithHint({ id, label, placeholder }) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor={id}>{label}</Label>\n <Input id={id} placeholder={placeholder} />\n <p className=\"text-xs text-foreground-400\">Shown publicly on your profile.</p>\n </div>\n )\n}"
22
+ "code": "import { Label, Input } from 'ui-lab-components'\n\nfunction LabeledFieldWithHint({ id, label, placeholder }) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor={id}>{label}</Label>\n <Input id={id} placeholder={placeholder} />\n <p className=\"text-sm text-foreground-400\">Shown publicly on your profile.</p>\n </div>\n )\n}"
23
23
  },
24
24
  {
25
25
  "id": "labeled-field-with-error",
26
26
  "name": "With Error",
27
27
  "description": "Error message below the input with input in invalid state.",
28
- "code": "import { Label, Input } from 'ui-lab-components'\n\nfunction LabeledFieldWithError({ id, label, placeholder, error }) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor={id}>{label}</Label>\n <Input\n id={id}\n placeholder={placeholder}\n aria-invalid={Boolean(error)}\n aria-describedby={error ? `${id}-error` : undefined}\n />\n {error && (\n <p id={`${id}-error`} className=\"text-xs text-foreground-300 flex items-center gap-1\">\n <span className=\"text-foreground-100\">&#9679;</span> {error}\n </p>\n )}\n </div>\n )\n}"
28
+ "code": "import { Label, Input } from 'ui-lab-components'\n\nfunction LabeledFieldWithError({ id, label, placeholder, error }) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor={id}>{label}</Label>\n <Input\n id={id}\n placeholder={placeholder}\n aria-invalid={Boolean(error)}\n aria-describedby={error ? `${id}-error` : undefined}\n />\n {error && (\n <p id={`${id}-error`} className=\"text-sm text-foreground-300 flex items-center gap-1\">\n <span className=\"text-foreground-100\">&#9679;</span> {error}\n </p>\n )}\n </div>\n )\n}"
29
29
  }
30
30
  ]
31
- }
31
+ }
@@ -6,7 +6,7 @@ function LabeledField({ id, label, placeholder, hint }: { id: string; label: str
6
6
  <div className="flex flex-col gap-1.5">
7
7
  <Label htmlFor={id}>{label}</Label>
8
8
  <Input id={id} placeholder={placeholder} />
9
- {hint && <p className="text-xs text-foreground-400">{hint}</p>}
9
+ {hint && <p className="text-sm text-foreground-400">{hint}</p>}
10
10
  </div>
11
11
  );
12
12
  }
@@ -12,7 +12,7 @@ function LabeledFieldWithError({ id, label, placeholder, error }: { id: string;
12
12
  aria-describedby={error ? `${id}-error` : undefined}
13
13
  />
14
14
  {error && (
15
- <p id={`${id}-error`} className="text-xs text-foreground-300 flex items-center gap-1">
15
+ <p id={`${id}-error`} className="text-sm text-foreground-300 flex items-center gap-1">
16
16
  <span className="text-foreground-100">&#9679;</span> {error}
17
17
  </p>
18
18
  )}
@@ -6,7 +6,7 @@ function LabeledFieldWithHint({ id, label, placeholder }: { id: string; label: s
6
6
  <div className="flex flex-col gap-1.5">
7
7
  <Label htmlFor={id}>{label}</Label>
8
8
  <Input id={id} placeholder={placeholder} />
9
- <p className="text-xs text-foreground-400">Shown publicly on your profile.</p>
9
+ <p className="text-sm text-foreground-400">Shown publicly on your profile.</p>
10
10
  </div>
11
11
  );
12
12
  }
@@ -14,7 +14,7 @@
14
14
  ],
15
15
  "complexity": "simple",
16
16
  "notes": "items-center (not items-start) here because Select is a single-line control that should align with the label's baseline, not float to the top.",
17
- "code": "import { Select, Label } from 'ui-lab-components'\n\nconst options = [\n { id: 'system', label: 'System' },\n { id: 'light', label: 'Light' },\n { id: 'dark', label: 'Dark' },\n]\n\nfunction SelectRow({ id, label, description, defaultValue }) {\n return (\n <div className=\"flex items-center justify-between gap-4 py-3 border-b border-background-800\">\n <div className=\"flex-1 min-w-0\">\n <Label htmlFor={id} className=\"text-sm font-medium text-foreground-200\">\n {label}\n </Label>\n {description && (\n <p className=\"text-xs text-foreground-400 mt-0.5\">{description}</p>\n )}\n </div>\n <Select defaultSelectedKey={defaultValue}>\n {options.map((opt) => (\n <Select.Option key={opt.id} id={opt.id}>{opt.label}</Select.Option>\n ))}\n </Select>\n </div>\n )\n}",
17
+ "code": "import { Select, Label } from 'ui-lab-components'\n\nconst options = [\n { id: 'system', label: 'System' },\n { id: 'light', label: 'Light' },\n { id: 'dark', label: 'Dark' },\n]\n\nfunction SelectRow({ id, label, description, defaultValue }) {\n return (\n <div className=\"flex items-center justify-between gap-4 py-3 border-b border-background-800\">\n <div className=\"flex-1 min-w-0\">\n <Label htmlFor={id} className=\"text-sm font-medium text-foreground-200\">\n {label}\n </Label>\n {description && (\n <p className=\"text-sm text-foreground-400 mt-0.5\">{description}</p>\n )}\n </div>\n <Select defaultSelectedKey={defaultValue}>\n {options.map((opt) => (\n <Select.Option key={opt.id} id={opt.id}>{opt.label}</Select.Option>\n ))}\n </Select>\n </div>\n )\n}",
18
18
  "variations": [
19
19
  {
20
20
  "id": "select-row-inline",
@@ -26,7 +26,7 @@
26
26
  "id": "select-row-with-icon",
27
27
  "name": "With Icon",
28
28
  "description": "Leading icon before the label for visual scanning in longer settings lists.",
29
- "code": "import { Select, Label } from 'ui-lab-components'\n\nconst languages = [\n { id: 'en', label: 'English' },\n { id: 'fr', label: 'French' },\n { id: 'de', label: 'German' },\n]\n\nfunction SelectRowWithIcon({ id, label, description, icon, defaultValue }) {\n return (\n <div className=\"flex items-center gap-4 py-3 border-b border-background-800\">\n <div className=\"w-8 h-8 flex items-center justify-center rounded-md bg-background-800 text-foreground-400 flex-shrink-0\">\n {icon}\n </div>\n <div className=\"flex-1 min-w-0\">\n <Label htmlFor={id} className=\"text-sm font-medium text-foreground-200\">\n {label}\n </Label>\n {description && (\n <p className=\"text-xs text-foreground-400 mt-0.5\">{description}</p>\n )}\n </div>\n <Select defaultSelectedKey={defaultValue}>\n {languages.map((lang) => (\n <Select.Option key={lang.id} id={lang.id}>{lang.label}</Select.Option>\n ))}\n </Select>\n </div>\n )\n}"
29
+ "code": "import { Select, Label } from 'ui-lab-components'\n\nconst languages = [\n { id: 'en', label: 'English' },\n { id: 'fr', label: 'French' },\n { id: 'de', label: 'German' },\n]\n\nfunction SelectRowWithIcon({ id, label, description, icon, defaultValue }) {\n return (\n <div className=\"flex items-center gap-4 py-3 border-b border-background-800\">\n <div className=\"w-8 h-8 flex items-center justify-center rounded-md bg-background-800 text-foreground-400 flex-shrink-0\">\n {icon}\n </div>\n <div className=\"flex-1 min-w-0\">\n <Label htmlFor={id} className=\"text-sm font-medium text-foreground-200\">\n {label}\n </Label>\n {description && (\n <p className=\"text-sm text-foreground-400 mt-0.5\">{description}</p>\n )}\n </div>\n <Select defaultSelectedKey={defaultValue}>\n {languages.map((lang) => (\n <Select.Option key={lang.id} id={lang.id}>{lang.label}</Select.Option>\n ))}\n </Select>\n </div>\n )\n}"
30
30
  }
31
31
  ]
32
- }
32
+ }
@@ -12,7 +12,7 @@ function SelectRow({ id, label, description, defaultValue }: { id: string; label
12
12
  <div className="flex items-center justify-between gap-4 py-3 border-b border-background-800">
13
13
  <div className="flex-1 min-w-0">
14
14
  <Label htmlFor={id} className="text-sm font-medium text-foreground-200">{label}</Label>
15
- {description && <p className="text-xs text-foreground-400 mt-0.5">{description}</p>}
15
+ {description && <p className="text-sm text-foreground-400 mt-0.5">{description}</p>}
16
16
  </div>
17
17
  <Select defaultSelectedKey={defaultValue}>
18
18
  <Select.Trigger><Select.Value /></Select.Trigger>
@@ -22,7 +22,7 @@ function SelectRowWithIcon({ id, label, description, icon, defaultValue }: {
22
22
  <div className="w-8 h-8 flex items-center justify-center rounded-md bg-background-800 text-foreground-400 flex-shrink-0">{icon}</div>
23
23
  <div className="flex-1 min-w-0">
24
24
  <Label htmlFor={id} className="text-sm font-medium text-foreground-200">{label}</Label>
25
- {description && <p className="text-xs text-foreground-400 mt-0.5">{description}</p>}
25
+ {description && <p className="text-sm text-foreground-400 mt-0.5">{description}</p>}
26
26
  </div>
27
27
  <Select defaultSelectedKey={defaultValue}>
28
28
  <Select.Trigger><Select.Value /></Select.Trigger>
@@ -13,7 +13,7 @@
13
13
  ],
14
14
  "complexity": "simple",
15
15
  "notes": "items-start on the outer flex so the switch aligns to the first line of the label text, not centered to the full description block.",
16
- "code": "import { Switch, Label } from 'ui-lab-components'\n\nfunction ToggleSettingRow({ id, label, description, defaultSelected = false }) {\n return (\n <div className=\"flex items-start justify-between gap-4 py-3 border-b border-background-800\">\n <div className=\"flex-1 min-w-0\">\n <Label htmlFor={id} className=\"text-sm font-medium text-foreground-200 cursor-pointer\">\n {label}\n </Label>\n {description && (\n <p className=\"text-xs text-foreground-400 mt-0.5\">{description}</p>\n )}\n </div>\n <Switch id={id} defaultSelected={defaultSelected} />\n </div>\n )\n}",
16
+ "code": "import { Switch, Label } from 'ui-lab-components'\n\nfunction ToggleSettingRow({ id, label, description, defaultSelected = false }) {\n return (\n <div className=\"flex items-start justify-between gap-4 py-3 border-b border-background-800\">\n <div className=\"flex-1 min-w-0\">\n <Label htmlFor={id} className=\"text-sm font-medium text-foreground-200 cursor-pointer\">\n {label}\n </Label>\n {description && (\n <p className=\"text-sm text-foreground-400 mt-0.5\">{description}</p>\n )}\n </div>\n <Switch id={id} defaultSelected={defaultSelected} />\n </div>\n )\n}",
17
17
  "variations": [
18
18
  {
19
19
  "id": "toggle-setting-row-compact",
@@ -25,7 +25,7 @@
25
25
  "id": "toggle-setting-row-destructive",
26
26
  "name": "Destructive",
27
27
  "description": "Label styled to signal a dangerous or irreversible toggle.",
28
- "code": "import { Switch, Label } from 'ui-lab-components'\n\nfunction ToggleSettingRowDestructive({ id, label, description, defaultSelected = false }) {\n return (\n <div className=\"flex items-start justify-between gap-4 py-3 border-b border-background-800\">\n <div className=\"flex-1 min-w-0\">\n <Label htmlFor={id} className=\"text-sm font-medium text-foreground-100 cursor-pointer\">\n {label}\n </Label>\n {description && (\n <p className=\"text-xs text-foreground-400 mt-0.5\">{description}</p>\n )}\n </div>\n <Switch id={id} defaultSelected={defaultSelected} />\n </div>\n )\n}"
28
+ "code": "import { Switch, Label } from 'ui-lab-components'\n\nfunction ToggleSettingRowDestructive({ id, label, description, defaultSelected = false }) {\n return (\n <div className=\"flex items-start justify-between gap-4 py-3 border-b border-background-800\">\n <div className=\"flex-1 min-w-0\">\n <Label htmlFor={id} className=\"text-sm font-medium text-foreground-100 cursor-pointer\">\n {label}\n </Label>\n {description && (\n <p className=\"text-sm text-foreground-400 mt-0.5\">{description}</p>\n )}\n </div>\n <Switch id={id} defaultSelected={defaultSelected} />\n </div>\n )\n}"
29
29
  }
30
30
  ]
31
- }
31
+ }
@@ -6,7 +6,7 @@ function ToggleSettingRowDestructive({ id, label, description, defaultSelected =
6
6
  <div className="flex items-start justify-between gap-4 py-3 border-b border-background-800">
7
7
  <div className="flex-1 min-w-0">
8
8
  <Label htmlFor={id} className="text-sm font-medium text-foreground-100 cursor-pointer">{label}</Label>
9
- {description && <p className="text-xs text-foreground-400 mt-0.5">{description}</p>}
9
+ {description && <p className="text-sm text-foreground-400 mt-0.5">{description}</p>}
10
10
  </div>
11
11
  <Switch id={id} defaultSelected={defaultSelected} />
12
12
  </div>
@@ -6,7 +6,7 @@ function ToggleSettingRow({ id, label, description, defaultSelected = false }: {
6
6
  <div className="flex items-start justify-between gap-4 py-3 border-b border-background-800">
7
7
  <div className="flex-1 min-w-0">
8
8
  <Label htmlFor={id} className="text-sm font-medium text-foreground-200 cursor-pointer">{label}</Label>
9
- {description && <p className="text-xs text-foreground-400 mt-0.5">{description}</p>}
9
+ {description && <p className="text-sm text-foreground-400 mt-0.5">{description}</p>}
10
10
  </div>
11
11
  <Switch id={id} defaultSelected={defaultSelected} />
12
12
  </div>
@@ -28,7 +28,7 @@ export function IconActionBarCompactDemo() {
28
28
  <div className="p-6 flex flex-col gap-0 max-w-md w-full">
29
29
  {['api-deploy-prod', 'run-tests', 'seed-db'].map((label) => (
30
30
  <div key={label} className="flex items-center justify-between px-2 py-1.5 border-b border-background-800">
31
- <span className="text-xs font-mono text-foreground-300">{label}</span>
31
+ <span className="text-sm font-mono text-foreground-300">{label}</span>
32
32
  <IconActionBarCompact onEdit={() => {}} onCopy={() => {}} onDelete={() => {}} />
33
33
  </div>
34
34
  ))}
@@ -20,7 +20,7 @@
20
20
  "id": "media-object-sm",
21
21
  "name": "Small",
22
22
  "description": "Reduced icon size (w-8 h-8) and tighter gap for dense lists.",
23
- "code": "function MediaObjectSm({ icon, title, description }) {\n return (\n <div className=\"flex items-center gap-2\">\n <div className=\"w-8 h-8 flex items-center justify-center rounded-md bg-background-800 text-foreground-300 flex-shrink-0\">\n {icon}\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium text-foreground-200 truncate\">{title}</p>\n <p className=\"text-xs text-foreground-400 truncate\">{description}</p>\n </div>\n </div>\n )\n}"
23
+ "code": "function MediaObjectSm({ icon, title, description }) {\n return (\n <div className=\"flex items-center gap-2\">\n <div className=\"w-8 h-8 flex items-center justify-center rounded-md bg-background-800 text-foreground-300 flex-shrink-0\">\n {icon}\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-foreground-200 truncate\">{title}</p>\n <p className=\"text-sm text-foreground-400 truncate\">{description}</p>\n </div>\n </div>\n )\n}"
24
24
  },
25
25
  {
26
26
  "id": "media-object-lg",
@@ -29,4 +29,4 @@
29
29
  "code": "function MediaObjectLg({ icon, title, description }) {\n return (\n <div className=\"flex items-start gap-4\">\n <div className=\"w-14 h-14 flex items-center justify-center rounded-xl bg-background-800 text-foreground-300 flex-shrink-0\">\n {icon}\n </div>\n <div className=\"min-w-0 pt-1\">\n <p className=\"text-base font-semibold text-foreground-100\">{title}</p>\n <p className=\"text-sm text-foreground-400 mt-1\">{description}</p>\n </div>\n </div>\n )\n}"
30
30
  }
31
31
  ]
32
- }
32
+ }
@@ -12,8 +12,8 @@ function MediaObjectSm({ icon, title, description }: { icon: React.ReactNode; ti
12
12
  <div className="flex items-center gap-2">
13
13
  <div className="w-8 h-8 flex items-center justify-center rounded-md bg-background-800 text-foreground-300 flex-shrink-0">{icon}</div>
14
14
  <div className="min-w-0">
15
- <p className="text-xs font-medium text-foreground-200 truncate">{title}</p>
16
- <p className="text-xs text-foreground-400 truncate">{description}</p>
15
+ <p className="text-sm font-medium text-foreground-200 truncate">{title}</p>
16
+ <p className="text-sm text-foreground-400 truncate">{description}</p>
17
17
  </div>
18
18
  </div>
19
19
  );
@@ -14,19 +14,19 @@
14
14
  ],
15
15
  "complexity": "simple",
16
16
  "notes": "border-b border-background-800 for row separators. flex-shrink-0 on the right side prevents it from wrapping under long titles.",
17
- "code": "import { Badge } from 'ui-lab-components'\n\nfunction SplitRow({ title, description, timestamp, status }) {\n const variant = status === 'active' ? 'success' : status === 'pending' ? 'warning' : 'default'\n return (\n <div className=\"flex items-center gap-4 py-3 border-b border-background-800 hover:bg-background-900 transition-colors px-2 -mx-2 rounded\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-foreground-200 truncate\">{title}</p>\n <p className=\"text-xs text-foreground-400 truncate\">{description}</p>\n </div>\n <div className=\"flex items-center gap-3 flex-shrink-0\">\n <span className=\"text-xs text-foreground-400\">{timestamp}</span>\n <Badge size=\"sm\" variant={variant}>{status}</Badge>\n </div>\n </div>\n )\n}",
17
+ "code": "import { Badge } from 'ui-lab-components'\n\nfunction SplitRow({ title, description, timestamp, status }) {\n const variant = status === 'active' ? 'success' : status === 'pending' ? 'warning' : 'default'\n return (\n <div className=\"flex items-center gap-4 py-3 border-b border-background-800 hover:bg-background-900 transition-colors px-2 -mx-2 rounded\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-foreground-200 truncate\">{title}</p>\n <p className=\"text-sm text-foreground-400 truncate\">{description}</p>\n </div>\n <div className=\"flex items-center gap-3 flex-shrink-0\">\n <span className=\"text-sm text-foreground-400\">{timestamp}</span>\n <Badge size=\"sm\" variant={variant}>{status}</Badge>\n </div>\n </div>\n )\n}",
18
18
  "variations": [
19
19
  {
20
20
  "id": "split-row-actions",
21
21
  "name": "With Actions",
22
22
  "description": "Right side shows icon action buttons instead of metadata.",
23
- "code": "import { Button, Group } from 'ui-lab-components'\n\nfunction SplitRowActions({ title, description, onEdit, onDelete }) {\n return (\n <div className=\"flex items-center gap-4 py-3 border-b border-background-800 group\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-foreground-200 truncate\">{title}</p>\n <p className=\"text-xs text-foreground-400 truncate\">{description}</p>\n </div>\n <div className=\"flex items-center gap-1 flex-shrink-0 opacity-0 group-hover:opacity-100 transition-opacity\">\n <Button variant=\"ghost\" size=\"sm\" onPress={onEdit}>Edit</Button>\n <Button variant=\"ghost\" size=\"sm\" onPress={onDelete}>Delete</Button>\n </div>\n </div>\n )\n}"
23
+ "code": "import { Button, Group } from 'ui-lab-components'\n\nfunction SplitRowActions({ title, description, onEdit, onDelete }) {\n return (\n <div className=\"flex items-center gap-4 py-3 border-b border-background-800 group\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-foreground-200 truncate\">{title}</p>\n <p className=\"text-sm text-foreground-400 truncate\">{description}</p>\n </div>\n <div className=\"flex items-center gap-1 flex-shrink-0 opacity-0 group-hover:opacity-100 transition-opacity\">\n <Button variant=\"ghost\" size=\"sm\" onPress={onEdit}>Edit</Button>\n <Button variant=\"ghost\" size=\"sm\" onPress={onDelete}>Delete</Button>\n </div>\n </div>\n )\n}"
24
24
  },
25
25
  {
26
26
  "id": "split-row-meta",
27
27
  "name": "With Meta",
28
28
  "description": "Right side shows two metadata values (e.g. size + date) in a column.",
29
- "code": "function SplitRowMeta({ title, description, primaryMeta, secondaryMeta }) {\n return (\n <div className=\"flex items-center gap-4 py-3 border-b border-background-800\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-foreground-200 truncate\">{title}</p>\n <p className=\"text-xs text-foreground-400 truncate\">{description}</p>\n </div>\n <div className=\"flex flex-col items-end flex-shrink-0\">\n <span className=\"text-xs font-medium text-foreground-300\">{primaryMeta}</span>\n <span className=\"text-xs text-foreground-500\">{secondaryMeta}</span>\n </div>\n </div>\n )\n}"
29
+ "code": "function SplitRowMeta({ title, description, primaryMeta, secondaryMeta }) {\n return (\n <div className=\"flex items-center gap-4 py-3 border-b border-background-800\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-foreground-200 truncate\">{title}</p>\n <p className=\"text-sm text-foreground-400 truncate\">{description}</p>\n </div>\n <div className=\"flex flex-col items-end flex-shrink-0\">\n <span className=\"text-sm font-medium text-foreground-300\">{primaryMeta}</span>\n <span className=\"text-sm text-foreground-500\">{secondaryMeta}</span>\n </div>\n </div>\n )\n}"
30
30
  }
31
31
  ]
32
- }
32
+ }
@@ -6,7 +6,7 @@ function SplitRowActions({ title, description, onEdit, onDelete }: { title: stri
6
6
  <div className="flex items-center gap-4 py-3 border-b border-background-800 group">
7
7
  <div className="flex-1 min-w-0">
8
8
  <p className="text-sm font-medium text-foreground-200 truncate">{title}</p>
9
- <p className="text-xs text-foreground-400 truncate">{description}</p>
9
+ <p className="text-sm text-foreground-400 truncate">{description}</p>
10
10
  </div>
11
11
  <div className="flex items-center gap-1 flex-shrink-0 opacity-0 group-hover:opacity-100 transition-opacity">
12
12
  <Button variant="ghost" size="sm" onPress={onEdit}>Edit</Button>
@@ -7,10 +7,10 @@ function SplitRow({ title, description, timestamp, status }: { title: string; de
7
7
  <div className="flex items-center gap-4 py-3 border-b border-background-800 hover:bg-background-900 transition-colors px-2 -mx-2 rounded">
8
8
  <div className="flex-1 min-w-0">
9
9
  <p className="text-sm font-medium text-foreground-200 truncate">{title}</p>
10
- <p className="text-xs text-foreground-400 truncate">{description}</p>
10
+ <p className="text-sm text-foreground-400 truncate">{description}</p>
11
11
  </div>
12
12
  <div className="flex items-center gap-3 flex-shrink-0">
13
- <span className="text-xs text-foreground-400">{timestamp}</span>
13
+ <span className="text-sm text-foreground-400">{timestamp}</span>
14
14
  <Badge size="sm" variant={variant as 'success' | 'warning' | 'default'}>{status}</Badge>
15
15
  </div>
16
16
  </div>
@@ -5,11 +5,11 @@ function SplitRowMeta({ title, description, primaryMeta, secondaryMeta }: { titl
5
5
  <div className="flex items-center gap-4 py-3 border-b border-background-800">
6
6
  <div className="flex-1 min-w-0">
7
7
  <p className="text-sm font-medium text-foreground-200 truncate">{title}</p>
8
- <p className="text-xs text-foreground-400 truncate">{description}</p>
8
+ <p className="text-sm text-foreground-400 truncate">{description}</p>
9
9
  </div>
10
10
  <div className="flex flex-col items-end flex-shrink-0">
11
- <span className="text-xs font-medium text-foreground-300">{primaryMeta}</span>
12
- <span className="text-xs text-foreground-500">{secondaryMeta}</span>
11
+ <span className="text-sm font-medium text-foreground-300">{primaryMeta}</span>
12
+ <span className="text-sm text-foreground-500">{secondaryMeta}</span>
13
13
  </div>
14
14
  </div>
15
15
  );
@@ -14,19 +14,19 @@
14
14
  ],
15
15
  "complexity": "simple",
16
16
  "notes": "text-foreground-100 for the value \u2014 maximum contrast since the number is the focal point. text-foreground-400 for the label. Trend uses text-accent-400 for positive indicators.",
17
- "code": "function StatBlock({ value, label, trend }) {\n return (\n <div className=\"flex flex-col gap-1\">\n <p className=\"text-3xl font-bold text-foreground-100 tabular-nums\">{value}</p>\n <p className=\"text-sm text-foreground-400\">{label}</p>\n {trend && (\n <p className=\"text-xs text-accent-400\">{trend}</p>\n )}\n </div>\n )\n}",
17
+ "code": "function StatBlock({ value, label, trend }) {\n return (\n <div className=\"flex flex-col gap-1\">\n <p className=\"text-3xl font-bold text-foreground-100 tabular-nums\">{value}</p>\n <p className=\"text-sm text-foreground-400\">{label}</p>\n {trend && (\n <p className=\"text-sm text-accent-400\">{trend}</p>\n )}\n </div>\n )\n}",
18
18
  "variations": [
19
19
  {
20
20
  "id": "stat-block-compact",
21
21
  "name": "Compact",
22
22
  "description": "Horizontal inline layout \u2014 value and label on one line. For use in dense sidebars and toolbars.",
23
- "code": "function StatBlockCompact({ value, label }) {\n return (\n <div className=\"flex items-baseline gap-2\">\n <span className=\"text-xl font-bold text-foreground-100 tabular-nums\">{value}</span>\n <span className=\"text-xs text-foreground-400\">{label}</span>\n </div>\n )\n}"
23
+ "code": "function StatBlockCompact({ value, label }) {\n return (\n <div className=\"flex items-baseline gap-2\">\n <span className=\"text-xl font-bold text-foreground-100 tabular-nums\">{value}</span>\n <span className=\"text-sm text-foreground-400\">{label}</span>\n </div>\n )\n}"
24
24
  },
25
25
  {
26
26
  "id": "stat-block-with-icon",
27
27
  "name": "With Icon",
28
28
  "description": "Icon in a pill container above the number. Reinforces metric meaning visually.",
29
- "code": "function StatBlockWithIcon({ icon, value, label, trend }) {\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"w-9 h-9 flex items-center justify-center rounded-lg bg-background-800 text-foreground-300\">\n {icon}\n </div>\n <div className=\"flex flex-col gap-0.5\">\n <p className=\"text-2xl font-bold text-foreground-100 tabular-nums\">{value}</p>\n <p className=\"text-sm text-foreground-400\">{label}</p>\n {trend && <p className=\"text-xs text-accent-400\">{trend}</p>}\n </div>\n </div>\n )\n}"
29
+ "code": "function StatBlockWithIcon({ icon, value, label, trend }) {\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"w-9 h-9 flex items-center justify-center rounded-lg bg-background-800 text-foreground-300\">\n {icon}\n </div>\n <div className=\"flex flex-col gap-0.5\">\n <p className=\"text-2xl font-bold text-foreground-100 tabular-nums\">{value}</p>\n <p className=\"text-sm text-foreground-400\">{label}</p>\n {trend && <p className=\"text-sm text-accent-400\">{trend}</p>}\n </div>\n </div>\n )\n}"
30
30
  }
31
31
  ]
32
- }
32
+ }
@@ -4,7 +4,7 @@ function StatBlockCompact({ value, label }: { value: string; label: string }) {
4
4
  return (
5
5
  <div className="flex items-baseline gap-2">
6
6
  <span className="text-xl font-bold text-foreground-100 tabular-nums">{value}</span>
7
- <span className="text-xs text-foreground-400">{label}</span>
7
+ <span className="text-sm text-foreground-400">{label}</span>
8
8
  </div>
9
9
  );
10
10
  }
@@ -5,7 +5,7 @@ function StatBlock({ value, label, trend }: { value: string; label: string; tren
5
5
  <div className="flex flex-col gap-1">
6
6
  <p className="text-3xl font-bold text-foreground-100 tabular-nums">{value}</p>
7
7
  <p className="text-sm text-foreground-400">{label}</p>
8
- {trend && <p className="text-xs text-accent-400">{trend}</p>}
8
+ {trend && <p className="text-sm text-accent-400">{trend}</p>}
9
9
  </div>
10
10
  );
11
11
  }
@@ -14,7 +14,7 @@ function StatBlockWithIcon({ icon, value, label, trend }: { icon: React.ReactNod
14
14
  <div className="flex flex-col gap-0.5">
15
15
  <p className="text-2xl font-bold text-foreground-100 tabular-nums">{value}</p>
16
16
  <p className="text-sm text-foreground-400">{label}</p>
17
- {trend && <p className="text-xs text-accent-400">{trend}</p>}
17
+ {trend && <p className="text-sm text-accent-400">{trend}</p>}
18
18
  </div>
19
19
  </div>
20
20
  );