tembro 1.0.3 → 2.0.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 (342) hide show
  1. package/README.md +2 -2
  2. package/dist/components/data-table/data-table.cjs +1 -1
  3. package/dist/components/data-table/data-table.js +68 -68
  4. package/dist/components/display/smart-card.d.ts +8 -8
  5. package/dist/components/patterns/index.cjs +1 -1
  6. package/dist/components/patterns/index.js +4 -4
  7. package/dist/components/patterns/public.cjs +1 -1
  8. package/dist/components/patterns/public.js +4 -4
  9. package/dist/index.cjs +1 -1
  10. package/dist/index.d.ts +0 -1
  11. package/dist/index.js +19 -38
  12. package/dist/showcase/index.cjs +1 -1
  13. package/dist/showcase/index.d.ts +0 -1
  14. package/dist/showcase/index.js +36 -38
  15. package/dist/showcase/package-meta.cjs +1 -1
  16. package/dist/showcase/package-meta.d.ts +2 -2
  17. package/dist/showcase/package-meta.js +1 -1
  18. package/dist/showcase/premium/accordion/mock.cjs +4 -4
  19. package/dist/showcase/premium/accordion/mock.js +1 -1
  20. package/dist/showcase/{families/data-table/types.d.ts → premium/data-table-parts/data.d.ts} +4 -0
  21. package/dist/showcase/{families/data-table → premium/data-table-parts}/data.js +1 -1
  22. package/dist/showcase/premium/data-table-parts/showcase.cjs +1 -1
  23. package/dist/showcase/premium/data-table-parts/showcase.js +1 -1
  24. package/dist/showcase/site-data.cjs +1 -1
  25. package/dist/showcase/site-data.d.ts +6 -6
  26. package/dist/showcase/site-data.js +414 -451
  27. package/dist/showcase/tembro-registry.json.cjs +1 -1
  28. package/dist/showcase/tembro-registry.json.js +1 -1
  29. package/package.json +2 -13
  30. package/packages/cli/dist/index.cjs +17 -17
  31. package/packages/cli/vendor/src/components/data-table/data-table.tsx +22 -13
  32. package/packages/cli/vendor/src/components/display/smart-card.tsx +8 -8
  33. package/packages/cli/vendor/src/index.ts +3 -4
  34. package/packages/cli/vendor/src/showcase/index.ts +5 -6
  35. package/packages/cli/vendor/src/showcase/package-meta.ts +1 -1
  36. package/packages/cli/vendor/src/showcase/premium/accordion/mock.ts +4 -4
  37. package/packages/cli/vendor/src/showcase/{families/data-table → premium/data-table-parts}/data.ts +25 -1
  38. package/packages/cli/vendor/src/showcase/premium/data-table-parts/showcase.tsx +1 -2
  39. package/packages/cli/vendor/src/showcase/site-data.tsx +151 -216
  40. package/packages/cli/vendor/src/showcase/tembro-registry.json +1 -1
  41. package/registry.json +1 -1
  42. package/dist/families/badge-family.cjs +0 -1
  43. package/dist/families/badge-family.d.ts +0 -5
  44. package/dist/families/badge-family.js +0 -5
  45. package/dist/families/card-family.cjs +0 -1
  46. package/dist/families/card-family.d.ts +0 -16
  47. package/dist/families/card-family.js +0 -21
  48. package/dist/families/catalog.cjs +0 -1
  49. package/dist/families/catalog.d.ts +0 -11
  50. package/dist/families/catalog.js +0 -140
  51. package/dist/families/data-table-family.cjs +0 -1
  52. package/dist/families/data-table-family.d.ts +0 -18
  53. package/dist/families/data-table-family.js +0 -29
  54. package/dist/families/docs-adoption.cjs +0 -1
  55. package/dist/families/docs-adoption.d.ts +0 -16
  56. package/dist/families/docs-adoption.js +0 -53
  57. package/dist/families/docs-groups.cjs +0 -1
  58. package/dist/families/docs-groups.d.ts +0 -18
  59. package/dist/families/docs-groups.js +0 -262
  60. package/dist/families/docs-queries.cjs +0 -1
  61. package/dist/families/docs-queries.d.ts +0 -37
  62. package/dist/families/docs-queries.js +0 -50
  63. package/dist/families/docs-routing.cjs +0 -1
  64. package/dist/families/docs-routing.d.ts +0 -17
  65. package/dist/families/docs-routing.js +0 -49
  66. package/dist/families/form-family.cjs +0 -1
  67. package/dist/families/form-family.d.ts +0 -20
  68. package/dist/families/form-family.js +0 -35
  69. package/dist/families/index.cjs +0 -1
  70. package/dist/families/index.d.ts +0 -19
  71. package/dist/families/index.js +0 -20
  72. package/dist/families/input-family.cjs +0 -1
  73. package/dist/families/input-family.d.ts +0 -32
  74. package/dist/families/input-family.js +0 -56
  75. package/dist/families/member-metadata.cjs +0 -1
  76. package/dist/families/member-metadata.d.ts +0 -11
  77. package/dist/families/member-metadata.js +0 -1013
  78. package/dist/families/member-queries.cjs +0 -1
  79. package/dist/families/member-queries.d.ts +0 -6
  80. package/dist/families/member-queries.js +0 -14
  81. package/dist/families/member-snippet-queries.cjs +0 -1
  82. package/dist/families/member-snippet-queries.d.ts +0 -8
  83. package/dist/families/member-snippet-queries.js +0 -30
  84. package/dist/families/member-snippets.cjs +0 -484
  85. package/dist/families/member-snippets.d.ts +0 -11
  86. package/dist/families/member-snippets.js +0 -1061
  87. package/dist/families/migration-map.cjs +0 -1
  88. package/dist/families/migration-map.d.ts +0 -10
  89. package/dist/families/migration-map.js +0 -787
  90. package/dist/families/overlay-family.cjs +0 -1
  91. package/dist/families/overlay-family.d.ts +0 -22
  92. package/dist/families/overlay-family.js +0 -29
  93. package/dist/families/public-surface-rationalization.cjs +0 -1
  94. package/dist/families/public-surface-rationalization.d.ts +0 -169
  95. package/dist/families/public-surface-rationalization.js +0 -296
  96. package/dist/families/queries.cjs +0 -1
  97. package/dist/families/queries.d.ts +0 -12
  98. package/dist/families/queries.js +0 -162
  99. package/dist/families/select-family.cjs +0 -1
  100. package/dist/families/select-family.d.ts +0 -22
  101. package/dist/families/select-family.js +0 -27
  102. package/dist/families/views.cjs +0 -1
  103. package/dist/families/views.d.ts +0 -26
  104. package/dist/families/views.js +0 -45
  105. package/dist/showcase/families/actions/index.cjs +0 -1
  106. package/dist/showcase/families/actions/index.d.ts +0 -2
  107. package/dist/showcase/families/actions/index.js +0 -3
  108. package/dist/showcase/families/actions/mock.cjs +0 -5
  109. package/dist/showcase/families/actions/mock.d.ts +0 -2
  110. package/dist/showcase/families/actions/mock.js +0 -40
  111. package/dist/showcase/families/actions/showcase.cjs +0 -1
  112. package/dist/showcase/families/actions/showcase.d.ts +0 -2
  113. package/dist/showcase/families/actions/showcase.js +0 -53
  114. package/dist/showcase/families/calendar/index.cjs +0 -1
  115. package/dist/showcase/families/calendar/index.d.ts +0 -2
  116. package/dist/showcase/families/calendar/index.js +0 -3
  117. package/dist/showcase/families/calendar/mock.cjs +0 -5
  118. package/dist/showcase/families/calendar/mock.d.ts +0 -2
  119. package/dist/showcase/families/calendar/mock.js +0 -40
  120. package/dist/showcase/families/calendar/showcase.cjs +0 -1
  121. package/dist/showcase/families/calendar/showcase.d.ts +0 -2
  122. package/dist/showcase/families/calendar/showcase.js +0 -60
  123. package/dist/showcase/families/command/index.cjs +0 -1
  124. package/dist/showcase/families/command/index.d.ts +0 -2
  125. package/dist/showcase/families/command/index.js +0 -3
  126. package/dist/showcase/families/command/mock.cjs +0 -5
  127. package/dist/showcase/families/command/mock.d.ts +0 -2
  128. package/dist/showcase/families/command/mock.js +0 -40
  129. package/dist/showcase/families/command/showcase.cjs +0 -1
  130. package/dist/showcase/families/command/showcase.d.ts +0 -2
  131. package/dist/showcase/families/command/showcase.js +0 -40
  132. package/dist/showcase/families/data-table/data.d.ts +0 -5
  133. package/dist/showcase/families/data-table/index.cjs +0 -1
  134. package/dist/showcase/families/data-table/index.d.ts +0 -4
  135. package/dist/showcase/families/data-table/index.js +0 -4
  136. package/dist/showcase/families/data-table/mock.cjs +0 -24
  137. package/dist/showcase/families/data-table/mock.d.ts +0 -2
  138. package/dist/showcase/families/data-table/mock.js +0 -48
  139. package/dist/showcase/families/data-table/showcase.cjs +0 -1
  140. package/dist/showcase/families/data-table/showcase.d.ts +0 -3
  141. package/dist/showcase/families/data-table/showcase.js +0 -751
  142. package/dist/showcase/families/data-table/types.cjs +0 -1
  143. package/dist/showcase/families/data-table/types.js +0 -0
  144. package/dist/showcase/families/display/data.cjs +0 -1
  145. package/dist/showcase/families/display/data.d.ts +0 -6
  146. package/dist/showcase/families/display/data.js +0 -24
  147. package/dist/showcase/families/display/index.cjs +0 -1
  148. package/dist/showcase/families/display/index.d.ts +0 -2
  149. package/dist/showcase/families/display/index.js +0 -3
  150. package/dist/showcase/families/display/mock.cjs +0 -5
  151. package/dist/showcase/families/display/mock.d.ts +0 -2
  152. package/dist/showcase/families/display/mock.js +0 -40
  153. package/dist/showcase/families/display/showcase.cjs +0 -1
  154. package/dist/showcase/families/display/showcase.d.ts +0 -2
  155. package/dist/showcase/families/display/showcase.js +0 -201
  156. package/dist/showcase/families/filters/data.cjs +0 -1
  157. package/dist/showcase/families/filters/data.d.ts +0 -31
  158. package/dist/showcase/families/filters/data.js +0 -61
  159. package/dist/showcase/families/filters/index.cjs +0 -1
  160. package/dist/showcase/families/filters/index.d.ts +0 -2
  161. package/dist/showcase/families/filters/index.js +0 -3
  162. package/dist/showcase/families/filters/mock.cjs +0 -5
  163. package/dist/showcase/families/filters/mock.d.ts +0 -2
  164. package/dist/showcase/families/filters/mock.js +0 -40
  165. package/dist/showcase/families/filters/showcase.cjs +0 -1
  166. package/dist/showcase/families/filters/showcase.d.ts +0 -3
  167. package/dist/showcase/families/filters/showcase.js +0 -213
  168. package/dist/showcase/families/form/data.cjs +0 -1
  169. package/dist/showcase/families/form/data.d.ts +0 -22
  170. package/dist/showcase/families/form/data.js +0 -53
  171. package/dist/showcase/families/form/index.cjs +0 -1
  172. package/dist/showcase/families/form/index.d.ts +0 -4
  173. package/dist/showcase/families/form/index.js +0 -4
  174. package/dist/showcase/families/form/mock.cjs +0 -12
  175. package/dist/showcase/families/form/mock.d.ts +0 -2
  176. package/dist/showcase/families/form/mock.js +0 -40
  177. package/dist/showcase/families/form/showcase.cjs +0 -1
  178. package/dist/showcase/families/form/showcase.d.ts +0 -3
  179. package/dist/showcase/families/form/showcase.js +0 -318
  180. package/dist/showcase/families/form/types.cjs +0 -1
  181. package/dist/showcase/families/form/types.d.ts +0 -9
  182. package/dist/showcase/families/form/types.js +0 -0
  183. package/dist/showcase/families/index.cjs +0 -1
  184. package/dist/showcase/families/index.d.ts +0 -3
  185. package/dist/showcase/families/index.js +0 -96
  186. package/dist/showcase/families/inputs/data.cjs +0 -1
  187. package/dist/showcase/families/inputs/data.d.ts +0 -24
  188. package/dist/showcase/families/inputs/data.js +0 -90
  189. package/dist/showcase/families/inputs/index.cjs +0 -1
  190. package/dist/showcase/families/inputs/index.d.ts +0 -2
  191. package/dist/showcase/families/inputs/index.js +0 -3
  192. package/dist/showcase/families/inputs/mock.cjs +0 -5
  193. package/dist/showcase/families/inputs/mock.d.ts +0 -2
  194. package/dist/showcase/families/inputs/mock.js +0 -40
  195. package/dist/showcase/families/inputs/showcase.cjs +0 -1
  196. package/dist/showcase/families/inputs/showcase.d.ts +0 -3
  197. package/dist/showcase/families/inputs/showcase.js +0 -404
  198. package/dist/showcase/families/layout/index.cjs +0 -1
  199. package/dist/showcase/families/layout/index.d.ts +0 -2
  200. package/dist/showcase/families/layout/index.js +0 -3
  201. package/dist/showcase/families/layout/mock.cjs +0 -5
  202. package/dist/showcase/families/layout/mock.d.ts +0 -2
  203. package/dist/showcase/families/layout/mock.js +0 -40
  204. package/dist/showcase/families/layout/showcase.cjs +0 -1
  205. package/dist/showcase/families/layout/showcase.d.ts +0 -2
  206. package/dist/showcase/families/layout/showcase.js +0 -88
  207. package/dist/showcase/families/navigation/index.cjs +0 -1
  208. package/dist/showcase/families/navigation/index.d.ts +0 -2
  209. package/dist/showcase/families/navigation/index.js +0 -3
  210. package/dist/showcase/families/navigation/mock.cjs +0 -5
  211. package/dist/showcase/families/navigation/mock.d.ts +0 -2
  212. package/dist/showcase/families/navigation/mock.js +0 -40
  213. package/dist/showcase/families/navigation/showcase.cjs +0 -1
  214. package/dist/showcase/families/navigation/showcase.d.ts +0 -2
  215. package/dist/showcase/families/navigation/showcase.js +0 -49
  216. package/dist/showcase/families/notifications/index.cjs +0 -1
  217. package/dist/showcase/families/notifications/index.d.ts +0 -2
  218. package/dist/showcase/families/notifications/index.js +0 -3
  219. package/dist/showcase/families/notifications/mock.cjs +0 -5
  220. package/dist/showcase/families/notifications/mock.d.ts +0 -2
  221. package/dist/showcase/families/notifications/mock.js +0 -40
  222. package/dist/showcase/families/notifications/showcase.cjs +0 -1
  223. package/dist/showcase/families/notifications/showcase.d.ts +0 -1
  224. package/dist/showcase/families/notifications/showcase.js +0 -50
  225. package/dist/showcase/families/overlay/index.cjs +0 -1
  226. package/dist/showcase/families/overlay/index.d.ts +0 -2
  227. package/dist/showcase/families/overlay/index.js +0 -3
  228. package/dist/showcase/families/overlay/mock.cjs +0 -5
  229. package/dist/showcase/families/overlay/mock.d.ts +0 -2
  230. package/dist/showcase/families/overlay/mock.js +0 -40
  231. package/dist/showcase/families/overlay/showcase.cjs +0 -1
  232. package/dist/showcase/families/overlay/showcase.d.ts +0 -1
  233. package/dist/showcase/families/overlay/showcase.js +0 -38
  234. package/dist/showcase/families/patterns/index.cjs +0 -1
  235. package/dist/showcase/families/patterns/index.d.ts +0 -2
  236. package/dist/showcase/families/patterns/index.js +0 -3
  237. package/dist/showcase/families/patterns/mock.cjs +0 -5
  238. package/dist/showcase/families/patterns/mock.d.ts +0 -2
  239. package/dist/showcase/families/patterns/mock.js +0 -40
  240. package/dist/showcase/families/patterns/showcase.cjs +0 -1
  241. package/dist/showcase/families/patterns/showcase.d.ts +0 -1
  242. package/dist/showcase/families/patterns/showcase.js +0 -38
  243. package/dist/showcase/families/types.cjs +0 -1
  244. package/dist/showcase/families/types.d.ts +0 -29
  245. package/dist/showcase/families/types.js +0 -10
  246. package/dist/showcase/families/upload/data.cjs +0 -1
  247. package/dist/showcase/families/upload/data.d.ts +0 -1
  248. package/dist/showcase/families/upload/data.js +0 -10
  249. package/dist/showcase/families/upload/index.cjs +0 -1
  250. package/dist/showcase/families/upload/index.d.ts +0 -2
  251. package/dist/showcase/families/upload/index.js +0 -3
  252. package/dist/showcase/families/upload/mock.cjs +0 -5
  253. package/dist/showcase/families/upload/mock.d.ts +0 -2
  254. package/dist/showcase/families/upload/mock.js +0 -40
  255. package/dist/showcase/families/upload/showcase.cjs +0 -1
  256. package/dist/showcase/families/upload/showcase.d.ts +0 -3
  257. package/dist/showcase/families/upload/showcase.js +0 -133
  258. package/dist/showcase/families/wizard/index.cjs +0 -1
  259. package/dist/showcase/families/wizard/index.d.ts +0 -2
  260. package/dist/showcase/families/wizard/index.js +0 -3
  261. package/dist/showcase/families/wizard/mock.cjs +0 -5
  262. package/dist/showcase/families/wizard/mock.d.ts +0 -2
  263. package/dist/showcase/families/wizard/mock.js +0 -40
  264. package/dist/showcase/families/wizard/showcase.cjs +0 -1
  265. package/dist/showcase/families/wizard/showcase.d.ts +0 -2
  266. package/dist/showcase/families/wizard/showcase.js +0 -56
  267. package/packages/cli/vendor/src/families/badge-family.ts +0 -7
  268. package/packages/cli/vendor/src/families/card-family.ts +0 -26
  269. package/packages/cli/vendor/src/families/catalog.ts +0 -125
  270. package/packages/cli/vendor/src/families/data-table-family.ts +0 -31
  271. package/packages/cli/vendor/src/families/docs-adoption.ts +0 -103
  272. package/packages/cli/vendor/src/families/docs-groups.ts +0 -248
  273. package/packages/cli/vendor/src/families/docs-queries.ts +0 -84
  274. package/packages/cli/vendor/src/families/docs-routing.ts +0 -89
  275. package/packages/cli/vendor/src/families/form-family.ts +0 -37
  276. package/packages/cli/vendor/src/families/index.ts +0 -19
  277. package/packages/cli/vendor/src/families/input-family.ts +0 -61
  278. package/packages/cli/vendor/src/families/member-metadata.ts +0 -1033
  279. package/packages/cli/vendor/src/families/member-queries.ts +0 -28
  280. package/packages/cli/vendor/src/families/member-snippet-queries.ts +0 -54
  281. package/packages/cli/vendor/src/families/member-snippets.ts +0 -1563
  282. package/packages/cli/vendor/src/families/migration-map.ts +0 -161
  283. package/packages/cli/vendor/src/families/overlay-family.ts +0 -31
  284. package/packages/cli/vendor/src/families/public-surface-rationalization.ts +0 -206
  285. package/packages/cli/vendor/src/families/queries.ts +0 -131
  286. package/packages/cli/vendor/src/families/select-family.ts +0 -33
  287. package/packages/cli/vendor/src/families/views.ts +0 -85
  288. package/packages/cli/vendor/src/showcase/families/actions/index.ts +0 -2
  289. package/packages/cli/vendor/src/showcase/families/actions/mock.ts +0 -18
  290. package/packages/cli/vendor/src/showcase/families/actions/showcase.tsx +0 -36
  291. package/packages/cli/vendor/src/showcase/families/calendar/index.ts +0 -2
  292. package/packages/cli/vendor/src/showcase/families/calendar/mock.ts +0 -18
  293. package/packages/cli/vendor/src/showcase/families/calendar/showcase.tsx +0 -33
  294. package/packages/cli/vendor/src/showcase/families/command/index.ts +0 -2
  295. package/packages/cli/vendor/src/showcase/families/command/mock.ts +0 -18
  296. package/packages/cli/vendor/src/showcase/families/command/showcase.tsx +0 -33
  297. package/packages/cli/vendor/src/showcase/families/data-table/index.ts +0 -4
  298. package/packages/cli/vendor/src/showcase/families/data-table/mock.ts +0 -42
  299. package/packages/cli/vendor/src/showcase/families/data-table/showcase.tsx +0 -507
  300. package/packages/cli/vendor/src/showcase/families/data-table/types.ts +0 -25
  301. package/packages/cli/vendor/src/showcase/families/display/data.ts +0 -11
  302. package/packages/cli/vendor/src/showcase/families/display/index.ts +0 -2
  303. package/packages/cli/vendor/src/showcase/families/display/mock.ts +0 -18
  304. package/packages/cli/vendor/src/showcase/families/display/showcase.tsx +0 -113
  305. package/packages/cli/vendor/src/showcase/families/filters/data.ts +0 -18
  306. package/packages/cli/vendor/src/showcase/families/filters/index.ts +0 -2
  307. package/packages/cli/vendor/src/showcase/families/filters/mock.ts +0 -18
  308. package/packages/cli/vendor/src/showcase/families/filters/showcase.tsx +0 -137
  309. package/packages/cli/vendor/src/showcase/families/form/data.ts +0 -37
  310. package/packages/cli/vendor/src/showcase/families/form/index.ts +0 -4
  311. package/packages/cli/vendor/src/showcase/families/form/mock.ts +0 -18
  312. package/packages/cli/vendor/src/showcase/families/form/showcase.tsx +0 -230
  313. package/packages/cli/vendor/src/showcase/families/form/types.ts +0 -10
  314. package/packages/cli/vendor/src/showcase/families/index.ts +0 -37
  315. package/packages/cli/vendor/src/showcase/families/inputs/data.ts +0 -40
  316. package/packages/cli/vendor/src/showcase/families/inputs/index.ts +0 -2
  317. package/packages/cli/vendor/src/showcase/families/inputs/mock.ts +0 -18
  318. package/packages/cli/vendor/src/showcase/families/inputs/showcase.tsx +0 -294
  319. package/packages/cli/vendor/src/showcase/families/layout/index.ts +0 -2
  320. package/packages/cli/vendor/src/showcase/families/layout/mock.ts +0 -18
  321. package/packages/cli/vendor/src/showcase/families/layout/showcase.tsx +0 -57
  322. package/packages/cli/vendor/src/showcase/families/navigation/index.ts +0 -2
  323. package/packages/cli/vendor/src/showcase/families/navigation/mock.ts +0 -18
  324. package/packages/cli/vendor/src/showcase/families/navigation/showcase.tsx +0 -31
  325. package/packages/cli/vendor/src/showcase/families/notifications/index.ts +0 -2
  326. package/packages/cli/vendor/src/showcase/families/notifications/mock.ts +0 -18
  327. package/packages/cli/vendor/src/showcase/families/notifications/showcase.tsx +0 -24
  328. package/packages/cli/vendor/src/showcase/families/overlay/index.ts +0 -2
  329. package/packages/cli/vendor/src/showcase/families/overlay/mock.ts +0 -18
  330. package/packages/cli/vendor/src/showcase/families/overlay/showcase.tsx +0 -23
  331. package/packages/cli/vendor/src/showcase/families/patterns/index.ts +0 -2
  332. package/packages/cli/vendor/src/showcase/families/patterns/mock.ts +0 -18
  333. package/packages/cli/vendor/src/showcase/families/patterns/showcase.tsx +0 -23
  334. package/packages/cli/vendor/src/showcase/families/types.ts +0 -40
  335. package/packages/cli/vendor/src/showcase/families/upload/data.ts +0 -7
  336. package/packages/cli/vendor/src/showcase/families/upload/index.ts +0 -2
  337. package/packages/cli/vendor/src/showcase/families/upload/mock.ts +0 -18
  338. package/packages/cli/vendor/src/showcase/families/upload/showcase.tsx +0 -86
  339. package/packages/cli/vendor/src/showcase/families/wizard/index.ts +0 -2
  340. package/packages/cli/vendor/src/showcase/families/wizard/mock.ts +0 -18
  341. package/packages/cli/vendor/src/showcase/families/wizard/showcase.tsx +0 -39
  342. /package/dist/showcase/{families/data-table → premium/data-table-parts}/data.cjs +0 -0
@@ -1,1061 +0,0 @@
1
- //#region src/families/member-snippets.ts
2
- var e = [
3
- {
4
- component: "Input",
5
- title: "Basic text field",
6
- description: "Start with Input first and enable behavior through props before moving into presets.",
7
- language: "tsx",
8
- variant: "basic",
9
- code: "import { Input } from \"tembro\"\n\n<Input placeholder=\"Email address\" />"
10
- },
11
- {
12
- component: "Input",
13
- title: "Clearable primary field",
14
- description: "Input can own the clear behavior directly when you do not need a separate preset import.",
15
- language: "tsx",
16
- variant: "advanced",
17
- code: "import { Input } from \"tembro\"\n\n<Input\n value={query}\n onValueChange={setQuery}\n placeholder=\"Search customers...\"\n clearable\n trailingAction={<span className=\"text-xs text-muted-foreground\">12 results</span>}\n/>"
18
- },
19
- {
20
- component: "Textarea",
21
- title: "Multi-line notes",
22
- description: "Use Textarea when the same input family needs longer freeform content.",
23
- language: "tsx",
24
- variant: "basic",
25
- code: "import { Textarea } from \"tembro\"\n\n<Textarea placeholder=\"Write release notes or internal guidance...\" rows={5} />"
26
- },
27
- {
28
- component: "SearchInput",
29
- title: "Search filter",
30
- description: "Use the search preset when the base Input needs result-count or shortcut chrome out of the box.",
31
- language: "tsx",
32
- variant: "basic",
33
- code: "import { SearchInput } from \"tembro\"\n\n<SearchInput value={query} onValueChange={setQuery} placeholder=\"Search products...\" />"
34
- },
35
- {
36
- component: "ClearableInput",
37
- title: "Clearable field",
38
- description: "Use the clearable preset when teams want the Input clear action packaged as one helper.",
39
- language: "tsx",
40
- variant: "basic",
41
- code: "import { ClearableInput } from \"tembro\"\n\n<ClearableInput value={keyword} onValueChange={setKeyword} placeholder=\"Keyword\" />"
42
- },
43
- {
44
- component: "PasswordInput",
45
- title: "Password field",
46
- description: "Use the password preset when Input needs a reveal toggle and password-safe defaults.",
47
- language: "tsx",
48
- variant: "basic",
49
- code: "import { PasswordInput } from \"tembro\"\n\n<PasswordInput value={password} onValueChange={setPassword} placeholder=\"Password\" />"
50
- },
51
- {
52
- component: "NumberInput",
53
- title: "Parsed numeric value",
54
- description: "Keep both raw entry and parsed number when needed.",
55
- language: "tsx",
56
- variant: "basic",
57
- code: "import { NumberInput } from \"tembro\"\n\n<NumberInput\n min={0}\n step={1}\n value={quantity}\n onNumberChange={setQuantity}\n placeholder=\"Quantity\"\n/>"
58
- },
59
- {
60
- component: "Slider",
61
- title: "Single-value slider",
62
- description: "Use the slider when a bounded numeric value should be adjusted visually instead of typed.",
63
- language: "tsx",
64
- variant: "basic",
65
- code: "import { Slider } from \"tembro\"\n\n<Slider\n label=\"Density\"\n description=\"Tune content density.\"\n min={0}\n max={100}\n defaultValue={64}\n showValue\n/>"
66
- },
67
- {
68
- component: "RangeSlider",
69
- title: "Range slider",
70
- description: "Use the range slider when one surface should control a min and max bound together.",
71
- language: "tsx",
72
- variant: "basic",
73
- code: "import { RangeSlider } from \"tembro\"\n\n<RangeSlider\n label=\"Revenue range\"\n description=\"Filter between two values.\"\n min={0}\n max={100}\n defaultValue={[20, 80]}\n showValue\n/>"
74
- },
75
- {
76
- component: "Rating",
77
- title: "Rating input",
78
- description: "Use rating for compact sentiment, score, or review capture.",
79
- language: "tsx",
80
- variant: "basic",
81
- code: "import { Rating } from \"tembro\"\n\n<Rating defaultValue={4} labels={{ clear: \"Reset\" }} />"
82
- },
83
- {
84
- component: "MaskedInput",
85
- title: "Custom mask",
86
- description: "MaskedInput is for custom displayed formatting over a raw string value.",
87
- language: "tsx",
88
- variant: "advanced",
89
- code: "import { MaskedInput } from \"tembro\"\n\n<MaskedInput\n value={invoiceCode}\n onValueChange={(masked) => setInvoiceCode(masked)}\n mask={(value) => value.toUpperCase()}\n/>"
90
- },
91
- {
92
- component: "PhoneInput",
93
- title: "Formatted phone entry",
94
- description: "Phone input keeps visible formatting while emitting a normalized value.",
95
- language: "tsx",
96
- variant: "basic",
97
- code: "import { PhoneInput } from \"tembro\"\n\n<PhoneInput value={phone} onValueChange={(masked) => setPhone(masked)} />"
98
- },
99
- {
100
- component: "MoneyInput",
101
- title: "Price field",
102
- description: "Prefix and suffix keep financial context in the field chrome.",
103
- language: "tsx",
104
- variant: "basic",
105
- code: "import { MoneyInput } from \"tembro\"\n\n<MoneyInput\n prefix=\"$\"\n value={price}\n onValueChange={(amount) => setPrice(amount)}\n placeholder=\"0.00\"\n/>"
106
- },
107
- {
108
- component: "QuantityInput",
109
- title: "Stepper quantity field",
110
- description: "Use quantity input when typing and step controls should live together.",
111
- language: "tsx",
112
- variant: "basic",
113
- code: "import { QuantityInput } from \"tembro\"\n\n<QuantityInput value={count} min={1} max={20} onValueChange={setCount} />"
114
- },
115
- {
116
- component: "QuantityStepper",
117
- title: "Stepper-only control",
118
- description: "Use the stepper when free typing should be avoided entirely.",
119
- language: "tsx",
120
- variant: "advanced",
121
- code: "import { QuantityStepper } from \"tembro\"\n\n<QuantityStepper value={count} min={1} max={10} onValueChange={setCount} />"
122
- },
123
- {
124
- component: "OtpInput",
125
- title: "Verification code",
126
- description: "OtpInput handles per-cell focus and paste behavior for short codes.",
127
- language: "tsx",
128
- variant: "basic",
129
- code: "import { OtpInput } from \"tembro\"\n\n<OtpInput value={otp} onValueChange={setOtp} length={6} />"
130
- },
131
- {
132
- component: "ColorInput",
133
- title: "Native color picker",
134
- description: "Use the color preset when browser-native selection is sufficient.",
135
- language: "tsx",
136
- variant: "basic",
137
- code: "import { ColorInput } from \"tembro\"\n\n<ColorInput value={brandColor} onValueChange={setBrandColor} />"
138
- },
139
- {
140
- component: "DateInput",
141
- title: "Simple date capture",
142
- description: "Use the native wrapper when a full date picker is unnecessary.",
143
- language: "tsx",
144
- variant: "basic",
145
- code: "import { DateInput } from \"tembro\"\n\n<DateInput value={startDate} onValueChange={setStartDate} />"
146
- },
147
- {
148
- component: "DateRangeInput",
149
- title: "From and to range",
150
- description: "Use the range preset for lightweight report and filter intervals.",
151
- language: "tsx",
152
- variant: "basic",
153
- code: "import { DateRangeInput } from \"tembro\"\n\n<DateRangeInput value={range} onValueChange={setRange} />"
154
- },
155
- {
156
- component: "FormInput",
157
- title: "Form field wrapper",
158
- description: "Use the universal RHF wrapper when field framing and validation should stay consistent.",
159
- language: "tsx",
160
- variant: "form",
161
- code: "import { FormInput } from \"tembro\"\n\n<FormInput control={control} name=\"email\" label=\"Email\" placeholder=\"Email address\" />"
162
- },
163
- {
164
- component: "FormInput",
165
- title: "Universal search wrapper",
166
- description: "Use kind switching instead of separate wrapper names for common field variants.",
167
- language: "tsx",
168
- variant: "form",
169
- code: "import { FormInput } from \"tembro\"\n\n<FormInput control={control} name=\"query\" kind=\"search\" label=\"Search\" placeholder=\"Search products...\" />"
170
- },
171
- {
172
- component: "FormInput",
173
- title: "Universal number wrapper",
174
- description: "Parsed numeric form state can stay behind the same wrapper contract.",
175
- language: "tsx",
176
- variant: "form",
177
- code: "import { FormInput } from \"tembro\"\n\n <FormInput control={control} name=\"quantity\" kind=\"number\" label=\"Quantity\" min={0} />"
178
- },
179
- {
180
- component: "FormSearchInput",
181
- title: "Search alias migration",
182
- description: "Keep this only while migrating old forms to the universal FormInput entry.",
183
- language: "tsx",
184
- variant: "migration",
185
- code: "import { FormSearchInput } from \"tembro\"\n\n<FormSearchInput control={control} name=\"query\" label=\"Search\" />\n\n// New work:\n// <FormInput control={control} name=\"query\" kind=\"search\" label=\"Search\" />"
186
- },
187
- {
188
- component: "FormPasswordInput",
189
- title: "Password alias migration",
190
- description: "Keep this only while migrating old forms to the universal FormInput entry.",
191
- language: "tsx",
192
- variant: "migration",
193
- code: "import { FormPasswordInput } from \"tembro\"\n\n<FormPasswordInput control={control} name=\"password\" label=\"Password\" />\n\n// New work:\n// <FormInput control={control} name=\"password\" kind=\"password\" label=\"Password\" />"
194
- },
195
- {
196
- component: "FormNumberInput",
197
- title: "Number alias migration",
198
- description: "Keep this only while migrating old forms to the universal FormInput entry.",
199
- language: "tsx",
200
- variant: "migration",
201
- code: "import { FormNumberInput } from \"tembro\"\n\n<FormNumberInput control={control} name=\"quantity\" label=\"Quantity\" min={0} />\n\n// New work:\n// <FormInput control={control} name=\"quantity\" kind=\"number\" label=\"Quantity\" min={0} />"
202
- },
203
- {
204
- component: "FormPhoneInput",
205
- title: "Phone alias migration",
206
- description: "Keep this only while migrating old forms to the universal FormInput entry.",
207
- language: "tsx",
208
- variant: "migration",
209
- code: "import { FormPhoneInput } from \"tembro\"\n\n<FormPhoneInput control={control} name=\"phone\" label=\"Phone\" />\n\n// New work:\n// <FormInput control={control} name=\"phone\" kind=\"phone\" label=\"Phone\" />"
210
- },
211
- {
212
- component: "FormDateInput",
213
- title: "Date alias migration",
214
- description: "Keep this only while migrating old forms to the universal FormInput entry.",
215
- language: "tsx",
216
- variant: "migration",
217
- code: "import { FormDateInput } from \"tembro\"\n\n<FormDateInput control={control} name=\"startDate\" label=\"Start date\" />\n\n// New work:\n// <FormInput control={control} name=\"startDate\" kind=\"date\" label=\"Start date\" />"
218
- },
219
- {
220
- component: "FormDateRangeInput",
221
- title: "Form date range",
222
- description: "Use the plain range wrapper for submitted from/to date objects.",
223
- language: "tsx",
224
- variant: "form",
225
- code: "import { FormDateRangeInput } from \"tembro\"\n\n<FormDateRangeInput control={control} name=\"period\" label=\"Period\" />"
226
- },
227
- {
228
- component: "TagInput",
229
- title: "Freeform tokens",
230
- description: "Only reach for TagInput when repeated freeform values are truly required.",
231
- language: "tsx",
232
- variant: "advanced",
233
- code: "import { TagInput } from \"tembro\"\n\n<TagInput value={tags} onValueChange={setTags} placeholder=\"Add tag\" />"
234
- },
235
- {
236
- component: "Select",
237
- title: "Base select",
238
- description: "Start with Select first and move into members only when option loading or interaction model changes.",
239
- language: "tsx",
240
- variant: "basic",
241
- code: "import { Select } from \"tembro\"\n\n<Select\n value={status}\n onValueChange={setStatus}\n options={[\n { label: \"Active\", value: \"active\" },\n { label: \"Archived\", value: \"archived\" },\n ]}\n/>"
242
- },
243
- {
244
- component: "Select",
245
- title: "Searchable primary select",
246
- description: "Keep local filtering on the main Select surface before reaching for AsyncSelect or Combobox.",
247
- language: "tsx",
248
- variant: "advanced",
249
- code: "import { Select } from \"tembro\"\n\n<Select\n value={owner}\n onValueChange={setOwner}\n searchable\n placeholder=\"Choose owner\"\n options={ownerOptions}\n/>"
250
- },
251
- {
252
- component: "SimpleSelect",
253
- title: "Static options",
254
- description: "Use the static-options helper when teams want a thinner wrapper around the main Select mental model.",
255
- language: "tsx",
256
- variant: "basic",
257
- code: "import { SimpleSelect } from \"tembro\"\n\n<SimpleSelect value={role} onValueChange={setRole} options={roleOptions} />"
258
- },
259
- {
260
- component: "AsyncSelect",
261
- title: "Remote search",
262
- description: "Use the remote member when the main Select surface needs server-backed option loading.",
263
- language: "tsx",
264
- variant: "async",
265
- code: "import { AsyncSelect } from \"tembro\"\n\n<AsyncSelect\n value={userId}\n loadOptions={loadUsers}\n onValueChange={setUserId}\n placeholder=\"Search users...\"\n/>"
266
- },
267
- {
268
- component: "AsyncMultiSelect",
269
- title: "Remote multi select",
270
- description: "Use the remote multi member when selected tags and async loading should live in one selection flow.",
271
- language: "tsx",
272
- variant: "async",
273
- code: "import { AsyncMultiSelect } from \"tembro\"\n\n<AsyncMultiSelect\n value={assigneeIds}\n loadOptions={loadUsers}\n onValueChange={setAssigneeIds}\n/>"
274
- },
275
- {
276
- component: "Combobox",
277
- title: "Keyboard-first selection",
278
- description: "Use Combobox only when fast local filtering matters more than the default Select trigger pattern.",
279
- language: "tsx",
280
- variant: "basic",
281
- code: "import { Combobox } from \"tembro\"\n\n<Combobox value={country} onValueChange={setCountry} options={countryOptions} />"
282
- },
283
- {
284
- component: "FormSelect",
285
- title: "Form select wrapper",
286
- description: "Use the universal RHF wrapper when select state belongs to submitted form data.",
287
- language: "tsx",
288
- variant: "form",
289
- code: "import { FormSelect } from \"tembro\"\n\n<FormSelect control={control} name=\"role\" label=\"Role\" options={roleOptions} />"
290
- },
291
- {
292
- component: "FormSelect",
293
- title: "Universal async wrapper",
294
- description: "Remote option loading can stay behind the same FormSelect contract instead of teaching a new wrapper name first.",
295
- language: "tsx",
296
- variant: "form",
297
- code: "import { FormSelect } from \"tembro\"\n\n<FormSelect control={control} name=\"ownerId\" kind=\"async\" label=\"Owner\" loadOptions={loadUsers} />"
298
- },
299
- {
300
- component: "FormAsyncSelect",
301
- title: "Async alias migration",
302
- description: "Keep this only while migrating old forms to the universal FormSelect entry.",
303
- language: "tsx",
304
- variant: "migration",
305
- code: "import { FormAsyncSelect } from \"tembro\"\n\n<FormAsyncSelect control={control} name=\"ownerId\" label=\"Owner\" loadOptions={loadUsers} />\n\n// New work:\n// <FormSelect control={control} name=\"ownerId\" kind=\"async\" label=\"Owner\" loadOptions={loadUsers} />"
306
- },
307
- {
308
- component: "Card",
309
- title: "Base card",
310
- description: "Use the base card when you need one ready surface with token-driven styling and minimal markup.",
311
- language: "tsx",
312
- variant: "basic",
313
- code: "import { Card } from \"tembro\"\n\n<Card\n title=\"Overview\"\n description=\"Weekly revenue summary\"\n content=\"Revenue summary content\"\n footer=\"Updated just now\"\n/>"
314
- },
315
- {
316
- component: "InfoCard",
317
- title: "Metric summary",
318
- description: "InfoCard is the faster default when the content is already card-shaped.",
319
- language: "tsx",
320
- variant: "basic",
321
- code: "import { InfoCard } from \"tembro\"\n\n<InfoCard title=\"Revenue\" description=\"Current month\" content=\"$48,000\" />"
322
- },
323
- {
324
- component: "StatCard",
325
- title: "Legacy KPI tile",
326
- description: "StatCard still works for migration, but new dashboard surfaces should prefer StatisticCard or InfoCard.",
327
- language: "tsx",
328
- variant: "migration",
329
- code: "import { StatCard } from \"tembro\"\n\n<StatCard title=\"Active users\" value=\"1,284\" change=\"+12%\" /> // prefer StatisticCard for new work"
330
- },
331
- {
332
- component: "StatisticCard",
333
- title: "Structured metric tile",
334
- description: "Use statistic cards when the metric needs label, value, and support context together.",
335
- language: "tsx",
336
- variant: "basic",
337
- code: "import { StatisticCard } from \"tembro\"\n\n<StatisticCard title=\"Conversion\" value=\"4.8%\" description=\"Last 30 days\" />"
338
- },
339
- {
340
- component: "EntityCard",
341
- title: "Entity summary",
342
- description: "Entity cards work well for compact user and record previews.",
343
- language: "tsx",
344
- variant: "basic",
345
- code: "import { EntityCard } from \"tembro\"\n\n<EntityCard title=\"Azamat Jurayev\" description=\"Admin user\" />"
346
- },
347
- {
348
- component: "FileCard",
349
- title: "Attachment preview",
350
- description: "Use file cards for uploads and attached resources.",
351
- language: "tsx",
352
- variant: "basic",
353
- code: "import { FileCard } from \"tembro\"\n\n<FileCard name=\"invoice.pdf\" size=\"2.4 MB\" />"
354
- },
355
- {
356
- component: "SmartCard",
357
- title: "Migration example",
358
- description: "This exists for legacy migration and should not lead new docs.",
359
- language: "tsx",
360
- variant: "migration",
361
- code: "import { SmartCard } from \"tembro\"\n\n<SmartCard title=\"Legacy surface\" description=\"Prefer InfoCard for new work.\" />"
362
- },
363
- {
364
- component: "Badge",
365
- title: "Status through props",
366
- description: "Use Badge props instead of a separate status component.",
367
- language: "tsx",
368
- variant: "basic",
369
- code: "import { Badge } from \"tembro\"\n\n<Badge\n status=\"success\"\n label=\"Active\"\n count={3}\n/>"
370
- },
371
- {
372
- component: "Dialog",
373
- title: "Blocking task dialog",
374
- description: "Use Dialog when focus should stay inside the modal task.",
375
- language: "tsx",
376
- variant: "basic",
377
- code: "import { Dialog, DialogContent, DialogTitle, DialogTrigger, Button } from \"tembro\"\n\n<Dialog>\n <DialogTrigger render={<Button>Edit</Button>} />\n <DialogContent>\n <DialogTitle>Edit customer</DialogTitle>\n </DialogContent>\n</Dialog>"
378
- },
379
- {
380
- component: "Popover",
381
- title: "Anchored content",
382
- description: "Use Popover for rich contextual content attached to a trigger.",
383
- language: "tsx",
384
- variant: "basic",
385
- code: "import { Popover, PopoverContent, PopoverTrigger, Button } from \"tembro\"\n\n<Popover>\n <PopoverTrigger render={<Button variant=\"outline\">Filters</Button>} />\n <PopoverContent>Filter controls</PopoverContent>\n</Popover>"
386
- },
387
- {
388
- component: "DropdownMenu",
389
- title: "Action menu",
390
- description: "Use DropdownMenu for command lists and compact actions.",
391
- language: "tsx",
392
- variant: "basic",
393
- code: "import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, Button } from \"tembro\"\n\n<DropdownMenu>\n <DropdownMenuTrigger render={<Button variant=\"outline\">Actions</Button>} />\n <DropdownMenuContent>\n <DropdownMenuItem>Edit</DropdownMenuItem>\n </DropdownMenuContent>\n</DropdownMenu>"
394
- },
395
- {
396
- component: "Tooltip",
397
- title: "Short helper text",
398
- description: "Use Tooltip only for brief supporting copy.",
399
- language: "tsx",
400
- variant: "basic",
401
- code: "import { Tooltip, Button } from \"tembro\"\n\n<Tooltip content=\"Export selected rows\">\n <Button>Export</Button>\n</Tooltip>"
402
- },
403
- {
404
- component: "HoverCard",
405
- title: "Rich hover preview",
406
- description: "Use HoverCard when hover or focus should reveal richer preview content than a tooltip.",
407
- language: "tsx",
408
- variant: "basic",
409
- code: "import { HoverCard, Button } from \"tembro\"\n\n<HoverCard\n content={\n <div className=\"space-y-1\">\n <p className=\"font-medium\">Azamat UI</p>\n <p className=\"text-sm text-muted-foreground\">Dashboard-focused React component library.</p>\n </div>\n }\n>\n <Button variant=\"outline\">Preview package</Button>\n</HoverCard>"
410
- },
411
- {
412
- component: "RightClickMenu",
413
- title: "Context menu",
414
- description: "Use right-click menus as secondary shortcuts.",
415
- language: "tsx",
416
- variant: "basic",
417
- code: "import { RightClickMenu } from \"tembro\"\n\n<RightClickMenu items={[{ key: \"copy\", label: \"Copy\" }]}>\n <div>Right click this row</div>\n</RightClickMenu>"
418
- },
419
- {
420
- component: "AlertDialog",
421
- title: "Destructive confirmation",
422
- description: "Use AlertDialog for high-risk confirmation flows.",
423
- language: "tsx",
424
- variant: "basic",
425
- code: "import { AlertDialog, Button } from \"tembro\"\n\n<AlertDialog title=\"Delete project?\" actionLabel=\"Delete\">\n <Button variant=\"destructive\">Delete</Button>\n</AlertDialog>"
426
- },
427
- {
428
- component: "ConfirmDialog",
429
- title: "Confirm action",
430
- description: "Use ConfirmDialog for reusable approval and submit confirmations.",
431
- language: "tsx",
432
- variant: "basic",
433
- code: "import { ConfirmDialog, Button } from \"tembro\"\n\n<ConfirmDialog title=\"Publish changes?\" confirmLabel=\"Publish\">\n <Button>Publish</Button>\n</ConfirmDialog>"
434
- },
435
- {
436
- component: "ModalShell",
437
- title: "Structured modal",
438
- description: "Use ModalShell when repeated modals need title, body and footer slots.",
439
- language: "tsx",
440
- variant: "basic",
441
- code: "import { ModalShell, Button } from \"tembro\"\n\n<ModalShell title=\"Invite member\" trigger={<Button>Invite</Button>}>\n Invite form\n</ModalShell>"
442
- },
443
- {
444
- component: "SheetShell",
445
- title: "Side sheet",
446
- description: "Use SheetShell for edge-attached contextual workflows.",
447
- language: "tsx",
448
- variant: "basic",
449
- code: "import { SheetShell, Button } from \"tembro\"\n\n<SheetShell side=\"right\" title=\"Filters\" trigger={<Button>Open filters</Button>}>\n Filter controls\n</SheetShell>"
450
- },
451
- {
452
- component: "Drawer",
453
- title: "Detail drawer",
454
- description: "Use Drawer for record details without leaving the page.",
455
- language: "tsx",
456
- variant: "basic",
457
- code: "import { Drawer, Button } from \"tembro\"\n\n<Drawer title=\"Customer\" trigger={<Button>Open customer</Button>}>\n Customer details\n</Drawer>"
458
- },
459
- {
460
- component: "DialogActions",
461
- title: "Footer actions",
462
- description: "Use DialogActions to keep modal footers aligned.",
463
- language: "tsx",
464
- variant: "basic",
465
- code: "import { DialogActions, Button } from \"tembro\"\n\n<DialogActions>\n <Button variant=\"outline\">Cancel</Button>\n <Button>Save</Button>\n</DialogActions>"
466
- },
467
- {
468
- component: "FormFieldShell",
469
- title: "Custom field shell",
470
- description: "Use the shell when you are composing a custom control by hand.",
471
- language: "tsx",
472
- variant: "basic",
473
- code: "import { FormFieldShell, Input } from \"tembro\"\n\n<FormFieldShell label=\"Workspace name\" description=\"Shown across the admin panel.\">\n <Input placeholder=\"Acme HQ\" />\n</FormFieldShell>"
474
- },
475
- {
476
- component: "FormTextarea",
477
- title: "Textarea wrapper",
478
- description: "Textarea wrapper keeps validation and copy aligned with other fields.",
479
- language: "tsx",
480
- variant: "form",
481
- code: "import { FormTextarea } from \"tembro\"\n\n<FormTextarea control={control} name=\"notes\" label=\"Notes\" rows={4} />"
482
- },
483
- {
484
- component: "FormSwitch",
485
- title: "Boolean field",
486
- description: "Switch wrappers keep label and description wiring aligned with other form fields.",
487
- language: "tsx",
488
- variant: "form",
489
- code: "import { FormSwitch } from \"tembro\"\n\n<FormSwitch control={control} name=\"isActive\" label=\"Active\" />"
490
- },
491
- {
492
- component: "FormDatePicker",
493
- title: "Calendar date field",
494
- description: "Use the calendar wrapper when native date input is too limited.",
495
- language: "tsx",
496
- variant: "form",
497
- code: "import { FormDatePicker } from \"tembro\"\n\n<FormDatePicker control={control} name=\"birthday\" label=\"Birthday\" />"
498
- },
499
- {
500
- component: "FormDateRangePicker",
501
- title: "Calendar range field",
502
- description: "Use the range picker wrapper for visual date interval selection.",
503
- language: "tsx",
504
- variant: "form",
505
- code: "import { FormDateRangePicker } from \"tembro\"\n\n<FormDateRangePicker control={control} name=\"reportingRange\" label=\"Reporting range\" />"
506
- },
507
- {
508
- component: "FormBuilder",
509
- title: "Higher-level form builder",
510
- description: "FormBuilder is for repeated internal patterns, not simple one-off forms.",
511
- language: "tsx",
512
- variant: "advanced",
513
- code: "import { FormBuilder } from \"tembro\"\n\n<FormBuilder\n control={control}\n fields={[{ name: \"email\", type: \"input\", label: \"Email\" }]}\n/>"
514
- },
515
- {
516
- component: "DataTable",
517
- title: "Canonical table",
518
- description: "DataTable owns the main grid surface and table orchestration.",
519
- language: "tsx",
520
- variant: "basic",
521
- code: "import { DataTable } from \"tembro\"\n\n<DataTable columns={columns} data={rows} />"
522
- },
523
- {
524
- component: "DataTableToolbar",
525
- title: "Toolbar composition",
526
- description: "Use the toolbar helper for consistent filters and actions around the grid.",
527
- language: "tsx",
528
- variant: "basic",
529
- code: "import { DataTableToolbar, SearchInput } from \"tembro\"\n\n<DataTableToolbar title=\"Orders\" search={<SearchInput placeholder=\"Search orders...\" />} />"
530
- },
531
- {
532
- component: "DataTablePagination",
533
- title: "Pagination controls",
534
- description: "Use the shared pagination helper to keep table paging UI consistent.",
535
- language: "tsx",
536
- variant: "basic",
537
- code: "import { DataTablePagination } from \"tembro\"\n\n<DataTablePagination pageIndex={pageIndex} pageCount={pageCount} onPageChange={setPageIndex} />"
538
- },
539
- {
540
- component: "DataTableColumnVisibilityMenu",
541
- title: "Hide and show columns",
542
- description: "Column visibility helpers keep personalization aligned with the table system.",
543
- language: "tsx",
544
- variant: "advanced",
545
- code: "import { DataTableColumnVisibilityMenu } from \"tembro\"\n\n<DataTableColumnVisibilityMenu table={table} />"
546
- },
547
- {
548
- component: "DataTableSortableHeader",
549
- title: "Sortable header",
550
- description: "Use the shared header helper instead of custom sort indicator plumbing.",
551
- language: "tsx",
552
- variant: "basic",
553
- code: "import { DataTableSortableHeader } from \"tembro\"\n\nheader: ({ column }) => <DataTableSortableHeader column={column}>Name</DataTableSortableHeader>"
554
- },
555
- {
556
- component: "DataTableRowActions",
557
- title: "Row actions menu",
558
- description: "Use shared row actions when each record needs contextual operations.",
559
- language: "tsx",
560
- variant: "basic",
561
- code: "import { DataTableRowActions } from \"tembro\"\n\n<DataTableRowActions actions={[{ key: \"edit\", label: \"Edit\", onSelect: openEdit }]} />"
562
- },
563
- {
564
- component: "DataTableBulkActions",
565
- title: "Bulk actions bar",
566
- description: "Bulk actions should appear only when a selection exists.",
567
- language: "tsx",
568
- variant: "advanced",
569
- code: "import { DataTableBulkActions } from \"tembro\"\n\n<DataTableBulkActions rows={selectedRows} actions={[{ key: \"delete\", label: \"Delete selected\", onSelect: removeMany }]} />"
570
- },
571
- {
572
- component: "DataTableViewPresets",
573
- title: "Preset views",
574
- description: "Use view presets when users switch between saved table perspectives.",
575
- language: "tsx",
576
- variant: "advanced",
577
- code: "import { DataTableViewPresets } from \"tembro\"\n\n<DataTableViewPresets presets={presets} value={activePreset} onValueChange={setActivePreset} />"
578
- },
579
- {
580
- component: "createDataTableSelectColumn",
581
- title: "Selection column factory",
582
- description: "Use the factory to keep row-selection behavior standardized.",
583
- language: "tsx",
584
- variant: "advanced",
585
- code: "import { createDataTableSelectColumn } from \"tembro\"\n\nconst selectColumn = createDataTableSelectColumn()"
586
- },
587
- {
588
- component: "createDataTableActionsColumn",
589
- title: "Shared actions column",
590
- description: "Column factories reduce repeated row action boilerplate.",
591
- language: "tsx",
592
- variant: "advanced",
593
- code: "import { createDataTableActionsColumn } from \"tembro\"\n\nconst actionsColumn = createDataTableActionsColumn({\n getActions: (_row, order) => [{ key: \"open\", label: \"Open\", onSelect: () => openOrder(order) }],\n})"
594
- },
595
- {
596
- component: "TableExportMenu",
597
- title: "Advanced export flow",
598
- description: "Keep export helpers secondary to the core table experience.",
599
- language: "tsx",
600
- variant: "advanced",
601
- code: "import { TableExportMenu } from \"tembro\"\n\n<TableExportMenu options={[{ key: \"csv\", label: \"Export CSV\", onSelect: exportCsv }]} />"
602
- },
603
- {
604
- component: "TableImportButton",
605
- title: "Import trigger",
606
- description: "Keep import controls secondary to the main grid experience.",
607
- language: "tsx",
608
- variant: "advanced",
609
- code: "import { TableImportButton } from \"tembro\"\n\n<TableImportButton onFilesSelect={handleImport} />"
610
- },
611
- {
612
- component: "Input",
613
- title: "CLI add",
614
- description: "Copy the input source into your app.",
615
- language: "cli",
616
- variant: "cli",
617
- code: "npx tembro add input"
618
- },
619
- {
620
- component: "InlineEditable",
621
- title: "Inline edit field",
622
- description: "Click-to-edit inline text. Commits on Enter or blur, cancels on Escape.",
623
- language: "tsx",
624
- variant: "basic",
625
- code: "import { InlineEditable } from \"tembro\"\n\n<InlineEditable value={name} onValueChange={setName} placeholder=\"Click to edit\" />"
626
- },
627
- {
628
- component: "TrendCard",
629
- title: "Metric with sparkline",
630
- description: "Dashboard metric card showing trend direction and optional sparkline.",
631
- language: "tsx",
632
- variant: "basic",
633
- code: "import { TrendCard } from \"tembro\"\n\n<TrendCard title=\"Revenue\" value=\"$45,231\" change=\"+12.5%\" trend=\"up\" sparkline={[10, 20, 15, 25, 30]} />"
634
- },
635
- {
636
- component: "ComparisonCard",
637
- title: "Side-by-side metrics",
638
- description: "Compare multiple related metrics in one card.",
639
- language: "tsx",
640
- variant: "basic",
641
- code: "import { ComparisonCard } from \"tembro\"\n\n<ComparisonCard\n title=\"Q1 vs Q2\"\n items={[\n { label: \"Revenue\", value: \"$45k\", change: \"+12%\", trend: \"up\" },\n { label: \"Expenses\", value: \"$32k\", change: \"-3%\", trend: \"down\" },\n ]}\n/>"
642
- },
643
- {
644
- component: "DeltaBadge",
645
- title: "Inline trend badge",
646
- description: "Show positive or negative change inline.",
647
- language: "tsx",
648
- variant: "basic",
649
- code: "import { DeltaBadge } from \"tembro\"\n\n<DeltaBadge value=\"+12.5%\" trend=\"up\" />\n<DeltaBadge value=\"-3.2%\" trend=\"down\" />"
650
- },
651
- {
652
- component: "RepeaterField",
653
- title: "Dynamic form array",
654
- description: "Add and remove repeated field groups in a form.",
655
- language: "tsx",
656
- variant: "basic",
657
- code: "import { RepeaterField } from \"tembro\"\n\n<RepeaterField\n value={items}\n onValueChange={setItems}\n createItem={() => ({ name: \"\" })}\n renderItem={(item, i, { remove, update }) => (\n <div className=\"flex gap-2\">\n <input value={item.name} onChange={e => update({ name: e.target.value })} />\n <button onClick={remove}>Remove</button>\n </div>\n )}\n/>"
658
- },
659
- {
660
- component: "Button",
661
- title: "Primary action",
662
- description: "Use Button as the first action surface before reaching for grouped or menu patterns.",
663
- language: "tsx",
664
- variant: "basic",
665
- code: "import { Button } from \"tembro\"\n\n<Button>Save changes</Button>"
666
- },
667
- {
668
- component: "ActionMenu",
669
- title: "Compact actions",
670
- description: "Group several actions behind one trigger when the surface should stay compact.",
671
- language: "tsx",
672
- variant: "basic",
673
- code: "import { ActionMenu } from \"tembro\"\n\n<ActionMenu\n actions={[\n { key: \"edit\", label: \"Edit\", onSelect: () => console.log(\"edit\") },\n { key: \"archive\", label: \"Archive\", onSelect: () => console.log(\"archive\") },\n ]}\n/>"
674
- },
675
- {
676
- component: "CopyButton",
677
- title: "Copy action",
678
- description: "Use CopyButton for IDs, links, and tokens that need one-tap copy feedback.",
679
- language: "tsx",
680
- variant: "basic",
681
- code: "import { CopyButton } from \"tembro\"\n\n<CopyButton value=\"inv_2481\" copyLabel=\"Copy invoice id\" />"
682
- },
683
- {
684
- component: "ButtonGroup",
685
- title: "Grouped actions",
686
- description: "Keep related actions visually aligned without inventing a new primary trigger.",
687
- language: "tsx",
688
- variant: "basic",
689
- code: "import { Button, ButtonGroup } from \"tembro\"\n\n<ButtonGroup>\n <Button variant=\"outline\">Cancel</Button>\n <Button>Save</Button>\n</ButtonGroup>"
690
- },
691
- {
692
- component: "CopyField",
693
- title: "Copy row",
694
- description: "Show a visible value and copy affordance in one compact pattern.",
695
- language: "tsx",
696
- variant: "basic",
697
- code: "import { CopyField } from \"tembro\"\n\n<CopyField label=\"API key\" value=\"sk_live_xxx\" />"
698
- },
699
- {
700
- component: "QuickActionGrid",
701
- title: "Shortcut board",
702
- description: "Use a quick grid when several small actions should stay visible together.",
703
- language: "tsx",
704
- variant: "basic",
705
- code: "import { QuickActionGrid } from \"tembro\"\n\n<QuickActionGrid\n actions={[\n { key: \"invite\", label: \"Invite\" },\n { key: \"export\", label: \"Export\" },\n { key: \"archive\", label: \"Archive\" },\n ]}\n/>"
706
- },
707
- {
708
- component: "Alert",
709
- title: "Inline status",
710
- description: "Use Alert for information, success, warning, or error states inside the page flow.",
711
- language: "tsx",
712
- variant: "basic",
713
- code: "import { Alert } from \"tembro\"\n\n<Alert tone=\"warning\" title=\"Unsaved changes\" description=\"Save before leaving this page.\" />"
714
- },
715
- {
716
- component: "EmptyState",
717
- title: "No data state",
718
- description: "Use EmptyState when a view needs a stronger zero-data message than a plain paragraph.",
719
- language: "tsx",
720
- variant: "basic",
721
- code: "import { EmptyState } from \"tembro\"\n\n<EmptyState title=\"No customers yet\" description=\"Add your first customer to start tracking revenue.\" />"
722
- },
723
- {
724
- component: "LoadingState",
725
- title: "Structured loading",
726
- description: "Prefer LoadingState when loading should include context, not only motion.",
727
- language: "tsx",
728
- variant: "basic",
729
- code: "import { LoadingState } from \"tembro\"\n\n<LoadingState label=\"Loading revenue report...\" description=\"Gathering the latest month-to-date numbers.\" />"
730
- },
731
- {
732
- component: "Progress",
733
- title: "Completion bar",
734
- description: "Use Progress for visible task, upload, or rollout completion.",
735
- language: "tsx",
736
- variant: "basic",
737
- code: "import { Progress } from \"tembro\"\n\n<Progress value={72} label=\"Upload progress\" />"
738
- },
739
- {
740
- component: "ProgressCircle",
741
- title: "Circular status",
742
- description: "Use ProgressCircle when completion is useful but width is limited.",
743
- language: "tsx",
744
- variant: "basic",
745
- code: "import { ProgressCircle } from \"tembro\"\n\n<ProgressCircle value={78} size=\"sm\" />"
746
- },
747
- {
748
- component: "ToastProvider",
749
- title: "Notification host",
750
- description: "Mount the provider once near the app root so features can dispatch toast feedback.",
751
- language: "tsx",
752
- variant: "basic",
753
- code: "import { ToastProvider } from \"tembro\"\n\n<ToastProvider position=\"top-right\">\n <App />\n</ToastProvider>"
754
- },
755
- {
756
- component: "InlineState",
757
- title: "Compact feedback row",
758
- description: "Use InlineState when a card or side panel needs a smaller status treatment.",
759
- language: "tsx",
760
- variant: "basic",
761
- code: "import { InlineState } from \"tembro\"\n\n<InlineState tone=\"info\" title=\"Syncing changes\" description=\"This may take a few seconds.\" />"
762
- },
763
- {
764
- component: "LoadingOverlay",
765
- title: "Blocking local loading",
766
- description: "Keep the surface visible while preventing interaction during a local loading phase.",
767
- language: "tsx",
768
- variant: "basic",
769
- code: "import { LoadingOverlay } from \"tembro\"\n\n<LoadingOverlay loading label=\"Saving changes...\">\n <section>Form content</section>\n</LoadingOverlay>"
770
- },
771
- {
772
- component: "Spinner",
773
- title: "Minimal loading",
774
- description: "Use Spinner only when a tiny loading affordance is enough.",
775
- language: "tsx",
776
- variant: "basic",
777
- code: "import { Spinner } from \"tembro\"\n\n<Spinner label=\"Loading invoices\" />"
778
- },
779
- {
780
- component: "Skeleton",
781
- title: "Loading placeholder",
782
- description: "Keep structure visible while data is loading.",
783
- language: "tsx",
784
- variant: "basic",
785
- code: "import { Skeleton } from \"tembro\"\n\n<Skeleton className=\"h-10 w-full\" />"
786
- },
787
- {
788
- component: "useToast",
789
- title: "Dispatch a toast",
790
- description: "Use the hook after ToastProvider is mounted to trigger transient feedback.",
791
- language: "tsx",
792
- variant: "advanced",
793
- code: "import { Button, useToast } from \"tembro\"\n\nfunction SaveButton() {\n const { push } = useToast()\n\n return <Button onClick={() => push({ title: \"Saved\", description: \"Your changes are live.\" })}>Save</Button>\n}"
794
- },
795
- {
796
- component: "BarChart",
797
- title: "Category comparison",
798
- description: "Use a bar chart when categories should be scanned and compared quickly.",
799
- language: "tsx",
800
- variant: "basic",
801
- code: "import { BarChart } from \"tembro\"\n\n<BarChart data={[{ label: \"Jan\", value: 12 }, { label: \"Feb\", value: 18 }, { label: \"Mar\", value: 15 }]} />"
802
- },
803
- {
804
- component: "LineChart",
805
- title: "Trend line",
806
- description: "Use a line chart for ordered values or time-series movement.",
807
- language: "tsx",
808
- variant: "basic",
809
- code: "import { LineChart } from \"tembro\"\n\n<LineChart values={[12, 16, 18, 15, 22, 24]} showArea />"
810
- },
811
- {
812
- component: "DonutChart",
813
- title: "Part to whole",
814
- description: "Use a donut chart when a compact proportional split needs one central summary.",
815
- language: "tsx",
816
- variant: "basic",
817
- code: "import { DonutChart } from \"tembro\"\n\n<DonutChart\n data={[\n { label: \"Paid\", value: 72, color: \"var(--chart-1)\" },\n { label: \"Pending\", value: 18, color: \"var(--chart-2)\" },\n { label: \"Refunded\", value: 10, color: \"var(--chart-3)\" },\n ]}\n centerLabel=\"Orders\"\n centerValue=\"248\"\n/>"
818
- },
819
- {
820
- component: "MetricGrid",
821
- title: "KPI grid",
822
- description: "Use MetricGrid to keep related KPIs aligned in one responsive surface.",
823
- language: "tsx",
824
- variant: "basic",
825
- code: "import { MetricGrid } from \"tembro\"\n\n<MetricGrid columns={3}>\n <div>Revenue</div>\n <div>MRR</div>\n <div>Churn</div>\n</MetricGrid>"
826
- },
827
- {
828
- component: "ChartFrame",
829
- title: "Chart shell",
830
- description: "Frame chart content with consistent heading and action chrome.",
831
- language: "tsx",
832
- variant: "basic",
833
- code: "import { BarChart, ChartFrame } from \"tembro\"\n\n<ChartFrame title=\"Revenue by month\" description=\"Last 6 months\">\n <BarChart data={[{ label: \"Jan\", value: 12 }, { label: \"Feb\", value: 18 }]} />\n</ChartFrame>"
834
- },
835
- {
836
- component: "ChartLegend",
837
- title: "Series legend",
838
- description: "Explicitly map series names to colors when the chart needs a legend.",
839
- language: "tsx",
840
- variant: "basic",
841
- code: "import { ChartLegend } from \"tembro\"\n\n<ChartLegend\n data={[\n { label: \"Paid\", color: \"var(--chart-1)\" },\n { label: \"Pending\", color: \"var(--chart-2)\" },\n ]}\n/>"
842
- },
843
- {
844
- component: "Sparkline",
845
- title: "Micro trend",
846
- description: "Use Sparkline when a small historical hint should sit beside a KPI.",
847
- language: "tsx",
848
- variant: "basic",
849
- code: "import { Sparkline } from \"tembro\"\n\n<Sparkline values={[5, 8, 7, 12, 11, 15]} />"
850
- },
851
- {
852
- component: "MetricTrend",
853
- title: "Metric with movement",
854
- description: "Bundle current value, delta, and mini-trend in one metric block.",
855
- language: "tsx",
856
- variant: "basic",
857
- code: "import { MetricTrend } from \"tembro\"\n\n<MetricTrend label=\"MRR\" value=\"$24,880\" change=\"+8.1%\" values={[14, 16, 17, 19, 21, 24]} />"
858
- },
859
- {
860
- component: "Statistic",
861
- title: "Single statistic",
862
- description: "Use Statistic for one structured KPI readout with support text.",
863
- language: "tsx",
864
- variant: "basic",
865
- code: "import { Statistic } from \"tembro\"\n\n<Statistic label=\"Active accounts\" value=\"1,248\" description=\"Compared to last week\" />"
866
- },
867
- {
868
- component: "StatisticGrid",
869
- title: "Statistics grid",
870
- description: "Align several structured statistics in one grouped layout.",
871
- language: "tsx",
872
- variant: "basic",
873
- code: "import { StatisticGrid } from \"tembro\"\n\n<StatisticGrid items={[{ label: \"MRR\", value: \"$18k\" }, { label: \"Churn\", value: \"2.1%\" }]} />"
874
- },
875
- {
876
- component: "Sidebar",
877
- title: "Primary app navigation",
878
- description: "Use Sidebar for persistent workspace navigation and nested sections.",
879
- language: "tsx",
880
- variant: "basic",
881
- code: "import { Sidebar } from \"tembro\"\n\n<Sidebar\n items={[\n { label: \"Dashboard\", href: \"/dashboard\", active: true },\n { label: \"Customers\", href: \"/customers\" },\n ]}\n/>"
882
- },
883
- {
884
- component: "PageContainer",
885
- title: "Page width rhythm",
886
- description: "Use PageContainer to keep horizontal page spacing consistent.",
887
- language: "tsx",
888
- variant: "basic",
889
- code: "import { PageContainer } from \"tembro\"\n\n<PageContainer size=\"lg\">\n <section>Page content</section>\n</PageContainer>"
890
- },
891
- {
892
- component: "Tabs",
893
- title: "Section switcher",
894
- description: "Use Tabs for a small set of peer views without leaving the page.",
895
- language: "tsx",
896
- variant: "basic",
897
- code: "import { Tabs, TabsContent, TabsList, TabsTrigger } from \"tembro\"\n\n<Tabs defaultValue=\"overview\">\n <TabsList>\n <TabsTrigger value=\"overview\">Overview</TabsTrigger>\n <TabsTrigger value=\"activity\">Activity</TabsTrigger>\n </TabsList>\n <TabsContent value=\"overview\">Overview content</TabsContent>\n</Tabs>"
898
- },
899
- {
900
- component: "Pagination",
901
- title: "Paged results",
902
- description: "Move through indexed result sets with one reusable pagination surface.",
903
- language: "tsx",
904
- variant: "basic",
905
- code: "import { Pagination } from \"tembro\"\n\n<Pagination page={2} totalPages={12} onPageChange={setPage} />"
906
- },
907
- {
908
- component: "Breadcrumbs",
909
- title: "Location trail",
910
- description: "Show the current nested path back through the app structure.",
911
- language: "tsx",
912
- variant: "basic",
913
- code: "import { Breadcrumbs } from \"tembro\"\n\n<Breadcrumbs items={[{ label: \"Workspace\", href: \"/\" }, { label: \"Customers\", href: \"/customers\" }, { label: \"Acme Corp\" }]} />"
914
- },
915
- {
916
- component: "Wizard",
917
- title: "Multi-step flow",
918
- description: "Use Wizard when the product needs a guided, step-by-step completion flow.",
919
- language: "tsx",
920
- variant: "basic",
921
- code: "import { Wizard } from \"tembro\"\n\n<Wizard steps={[{ id: \"account\", label: \"Account\" }, { id: \"billing\", label: \"Billing\" }]} currentStep={0} />"
922
- },
923
- {
924
- component: "Section",
925
- title: "Page subsection",
926
- description: "Group related page content without promoting it to a primary route.",
927
- language: "tsx",
928
- variant: "basic",
929
- code: "import { Section } from \"tembro\"\n\n<Section title=\"Billing\" description=\"Manage invoice and payment settings.\">\n Billing content\n</Section>"
930
- },
931
- {
932
- component: "AnchorNav",
933
- title: "In-page sections",
934
- description: "Jump between sections inside a long detail page.",
935
- language: "tsx",
936
- variant: "basic",
937
- code: "import { AnchorNav } from \"tembro\"\n\n<AnchorNav items={[{ id: \"overview\", label: \"Overview\" }, { id: \"activity\", label: \"Activity\" }]} />"
938
- },
939
- {
940
- component: "Stepper",
941
- title: "Step progress",
942
- description: "Use Stepper when the UI needs visible progress without the full Wizard shell.",
943
- language: "tsx",
944
- variant: "basic",
945
- code: "import { Stepper } from \"tembro\"\n\n<Stepper steps={[{ id: \"account\", label: \"Account\" }, { id: \"billing\", label: \"Billing\" }]} currentStep={1} />"
946
- },
947
- {
948
- component: "StepperTabs",
949
- title: "Step tabs",
950
- description: "Use StepperTabs when sections read like steps but still switch like tabs.",
951
- language: "tsx",
952
- variant: "basic",
953
- code: "import { StepperTabs } from \"tembro\"\n\n<StepperTabs items={[{ value: \"profile\", label: \"Profile\" }, { value: \"security\", label: \"Security\" }]} value=\"profile\" />"
954
- },
955
- {
956
- component: "SegmentedControl",
957
- title: "Compact switcher",
958
- description: "Use SegmentedControl for very small mutually exclusive sets.",
959
- language: "tsx",
960
- variant: "basic",
961
- code: "import { SegmentedControl } from \"tembro\"\n\n<SegmentedControl options={[{ label: \"Day\", value: \"day\" }, { label: \"Week\", value: \"week\" }]} value=\"week\" />"
962
- },
963
- {
964
- component: "FileUpload",
965
- title: "Generic file flow",
966
- description: "Use FileUpload when users should add, review, and remove uploaded files in one place.",
967
- language: "tsx",
968
- variant: "basic",
969
- code: "import { FileUpload } from \"tembro\"\n\n<FileUpload multiple maxFiles={5} />"
970
- },
971
- {
972
- component: "ImageUpload",
973
- title: "Image-specific upload",
974
- description: "Use ImageUpload when previews and image-oriented UX matter.",
975
- language: "tsx",
976
- variant: "basic",
977
- code: "import { ImageUpload } from \"tembro\"\n\n<ImageUpload maxFiles={1} />"
978
- },
979
- {
980
- component: "Checkbox",
981
- title: "Binary selection",
982
- description: "Use Checkbox for explicit checked and indeterminate selection states.",
983
- language: "tsx",
984
- variant: "basic",
985
- code: "import { Checkbox } from \"tembro\"\n\n<Checkbox checked={selected} onCheckedChange={setSelected} />"
986
- },
987
- {
988
- component: "RadioGroup",
989
- title: "Single choice set",
990
- description: "Use RadioGroup when exactly one visible option should be selected.",
991
- language: "tsx",
992
- variant: "basic",
993
- code: "import { RadioGroup } from \"tembro\"\n\n<RadioGroup value=\"monthly\" onValueChange={setBillingCycle} options={[{ label: \"Monthly\", value: \"monthly\" }, { label: \"Yearly\", value: \"yearly\" }]} />"
994
- },
995
- {
996
- component: "Switch",
997
- title: "Immediate toggle",
998
- description: "Use Switch when turning a setting on or off should feel direct and lightweight.",
999
- language: "tsx",
1000
- variant: "basic",
1001
- code: "import { Switch } from \"tembro\"\n\n<Switch checked={enabled} onCheckedChange={setEnabled} />"
1002
- },
1003
- {
1004
- component: "Table",
1005
- title: "Base table",
1006
- description: "Use Table when rows are simple enough that a full DataTable would be too heavy.",
1007
- language: "tsx",
1008
- variant: "basic",
1009
- code: "import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from \"tembro\"\n\n<Table>\n <TableHeader>\n <TableRow>\n <TableHead>Name</TableHead>\n <TableHead>Status</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n <TableRow>\n <TableCell>Acme</TableCell>\n <TableCell>Active</TableCell>\n </TableRow>\n </TableBody>\n</Table>"
1010
- },
1011
- {
1012
- component: "Accordion",
1013
- title: "Expandable sections",
1014
- description: "Use Accordion when stacked content should reveal details inline.",
1015
- language: "tsx",
1016
- variant: "basic",
1017
- code: "import { Accordion } from \"tembro\"\n\n<Accordion items={[{ value: \"shipping\", title: \"Shipping\", content: \"2-3 business days\" }]} />"
1018
- },
1019
- {
1020
- component: "Collapse",
1021
- title: "Low-level disclosure",
1022
- description: "Use Collapse when you need raw expand and collapse behavior without Accordion’s higher-level API.",
1023
- language: "tsx",
1024
- variant: "basic",
1025
- code: "import { Collapse, CollapseContent, CollapseTrigger } from \"tembro\"\n\n<Collapse>\n <CollapseTrigger>Toggle details</CollapseTrigger>\n <CollapseContent>Hidden content</CollapseContent>\n</Collapse>"
1026
- },
1027
- {
1028
- component: "Calendar",
1029
- title: "Raw calendar",
1030
- description: "Use Calendar when a custom date surface needs the primitive calendar control.",
1031
- language: "tsx",
1032
- variant: "basic",
1033
- code: "import { Calendar } from \"tembro\"\n\n<Calendar mode=\"single\" selected={date} onSelect={setDate} />"
1034
- },
1035
- {
1036
- component: "Divider",
1037
- title: "Section separator",
1038
- description: "Use Divider when content groups need a subtle visual boundary.",
1039
- language: "tsx",
1040
- variant: "basic",
1041
- code: "import { Divider } from \"tembro\"\n\n<Divider />"
1042
- },
1043
- {
1044
- component: "Kbd",
1045
- title: "Shortcut token",
1046
- description: "Show keyboard shortcuts with one consistent keycap style.",
1047
- language: "tsx",
1048
- variant: "basic",
1049
- code: "import { Kbd } from \"tembro\"\n\n<Kbd>Ctrl</Kbd>"
1050
- },
1051
- {
1052
- component: "ScrollBox",
1053
- title: "Local scroll area",
1054
- description: "Use ScrollBox when a panel should scroll internally instead of growing the whole page.",
1055
- language: "tsx",
1056
- variant: "basic",
1057
- code: "import { ScrollBox } from \"tembro\"\n\n<ScrollBox maxHeight={280}>\n <div>Scrollable content</div>\n</ScrollBox>"
1058
- }
1059
- ];
1060
- //#endregion
1061
- export { e as componentSnippetExamples };