aural-ui 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (308) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +456 -0
  3. package/dist/components/aspect-ratio/AspectRatio.stories.tsx +1327 -0
  4. package/dist/components/aspect-ratio/index.tsx +10 -0
  5. package/dist/components/aspect-ratio/meta.ts +8 -0
  6. package/dist/components/avatar/Avatar.stories.tsx +645 -0
  7. package/dist/components/avatar/index.tsx +50 -0
  8. package/dist/components/avatar/meta.ts +8 -0
  9. package/dist/components/badge/Badge.stories.tsx +169 -0
  10. package/dist/components/badge/index.tsx +28 -0
  11. package/dist/components/badge/meta.ts +6 -0
  12. package/dist/components/banner/Banner.stories.tsx +475 -0
  13. package/dist/components/banner/index.tsx +256 -0
  14. package/dist/components/banner/meta.ts +36 -0
  15. package/dist/components/button/Button.stories.tsx +74 -0
  16. package/dist/components/button/index.tsx +158 -0
  17. package/dist/components/button/meta.ts +33 -0
  18. package/dist/components/card/Card.stories.tsx +377 -0
  19. package/dist/components/card/index.tsx +85 -0
  20. package/dist/components/card/meta.ts +14 -0
  21. package/dist/components/char-count/CharCount.stories.tsx +334 -0
  22. package/dist/components/char-count/index.tsx +51 -0
  23. package/dist/components/char-count/meta.ts +13 -0
  24. package/dist/components/checkbox/Checkbox.stories.tsx +209 -0
  25. package/dist/components/checkbox/index.tsx +34 -0
  26. package/dist/components/checkbox/meta.ts +19 -0
  27. package/dist/components/chip/Chip.stories.tsx +207 -0
  28. package/dist/components/chip/index.tsx +92 -0
  29. package/dist/components/chip/meta.ts +17 -0
  30. package/dist/components/circular-loader/CircularLoader.stories.tsx +741 -0
  31. package/dist/components/circular-loader/index.tsx +138 -0
  32. package/dist/components/circular-loader/meta.ts +11 -0
  33. package/dist/components/collapsible/Collapsible.stories.tsx +319 -0
  34. package/dist/components/collapsible/index.tsx +158 -0
  35. package/dist/components/collapsible/meta.ts +22 -0
  36. package/dist/components/command/Command.stories.tsx +996 -0
  37. package/dist/components/command/index.tsx +324 -0
  38. package/dist/components/command/meta.ts +18 -0
  39. package/dist/components/dialog/Dialog.stories.tsx +963 -0
  40. package/dist/components/dialog/index.tsx +250 -0
  41. package/dist/components/dialog/meta.ts +28 -0
  42. package/dist/components/divider/Divider.stories.tsx +633 -0
  43. package/dist/components/divider/index.tsx +181 -0
  44. package/dist/components/divider/meta.ts +12 -0
  45. package/dist/components/dot-loader/DotLoader.stories.tsx +352 -0
  46. package/dist/components/dot-loader/index.tsx +78 -0
  47. package/dist/components/dot-loader/meta.ts +14 -0
  48. package/dist/components/dropdown/Dropdown.stories.tsx +1210 -0
  49. package/dist/components/dropdown/index.tsx +479 -0
  50. package/dist/components/dropdown/meta.ts +21 -0
  51. package/dist/components/form/Form.stories.tsx +320 -0
  52. package/dist/components/form/index.tsx +183 -0
  53. package/dist/components/form/meta.ts +11 -0
  54. package/dist/components/helper-text/HelperText.stories.tsx +254 -0
  55. package/dist/components/helper-text/index.tsx +102 -0
  56. package/dist/components/helper-text/meta.ts +18 -0
  57. package/dist/components/hover-card/HoverCard.stories.tsx +1328 -0
  58. package/dist/components/hover-card/index.tsx +42 -0
  59. package/dist/components/hover-card/meta.ts +12 -0
  60. package/dist/components/icon-button/IconButton.stories.tsx +252 -0
  61. package/dist/components/icon-button/index.tsx +130 -0
  62. package/dist/components/icon-button/meta.ts +20 -0
  63. package/dist/components/if-else/if-else.stories.tsx +100 -0
  64. package/dist/components/if-else/index.tsx +56 -0
  65. package/dist/components/if-else/meta.ts +6 -0
  66. package/dist/components/index.ts +70 -0
  67. package/dist/components/input/Input.stories.tsx +431 -0
  68. package/dist/components/input/index.tsx +487 -0
  69. package/dist/components/input/meta.ts +28 -0
  70. package/dist/components/label/Label.stories.tsx +200 -0
  71. package/dist/components/label/index.tsx +43 -0
  72. package/dist/components/label/meta.ts +14 -0
  73. package/dist/components/list/List.stories.tsx +963 -0
  74. package/dist/components/list/index.tsx +567 -0
  75. package/dist/components/list/meta.ts +24 -0
  76. package/dist/components/marquee/Marquee.stories.tsx +819 -0
  77. package/dist/components/marquee/index.tsx +107 -0
  78. package/dist/components/marquee/meta.ts +6 -0
  79. package/dist/components/overlay/Overlay.stories.tsx +954 -0
  80. package/dist/components/overlay/index.tsx +58 -0
  81. package/dist/components/overlay/meta.ts +10 -0
  82. package/dist/components/pagination/Pagination.stories.tsx +354 -0
  83. package/dist/components/pagination/index.tsx +455 -0
  84. package/dist/components/pagination/meta.ts +29 -0
  85. package/dist/components/popover/Popover.stories.tsx +1037 -0
  86. package/dist/components/popover/index.tsx +67 -0
  87. package/dist/components/popover/meta.ts +12 -0
  88. package/dist/components/radio/Radio.stories.tsx +146 -0
  89. package/dist/components/radio/index.tsx +41 -0
  90. package/dist/components/radio/meta.ts +19 -0
  91. package/dist/components/resizable/Resizable.stories.tsx +866 -0
  92. package/dist/components/resizable/index.tsx +55 -0
  93. package/dist/components/resizable/meta.ts +12 -0
  94. package/dist/components/scroll-area/ScrollArea.stories.tsx +1104 -0
  95. package/dist/components/scroll-area/index.tsx +55 -0
  96. package/dist/components/scroll-area/meta.ts +8 -0
  97. package/dist/components/search/Search.stories.tsx +678 -0
  98. package/dist/components/search/index.tsx +141 -0
  99. package/dist/components/search/meta.ts +6 -0
  100. package/dist/components/select/Select.stories.tsx +962 -0
  101. package/dist/components/select/index.tsx +512 -0
  102. package/dist/components/select/meta.ts +40 -0
  103. package/dist/components/sheet/Sheet.stories.tsx +1060 -0
  104. package/dist/components/sheet/index.tsx +440 -0
  105. package/dist/components/sheet/meta.ts +38 -0
  106. package/dist/components/skelton/Skelton.stories.tsx +859 -0
  107. package/dist/components/skelton/index.tsx +17 -0
  108. package/dist/components/skelton/meta.ts +6 -0
  109. package/dist/components/slider/Slider.stories.tsx +876 -0
  110. package/dist/components/slider/index.tsx +156 -0
  111. package/dist/components/slider/meta.ts +29 -0
  112. package/dist/components/stepper/Stepper.stories.tsx +639 -0
  113. package/dist/components/stepper/index.tsx +650 -0
  114. package/dist/components/stepper/meta.ts +19 -0
  115. package/dist/components/switch/Switch.stories.tsx +85 -0
  116. package/dist/components/switch/index.tsx +37 -0
  117. package/dist/components/switch/meta.ts +24 -0
  118. package/dist/components/switch-case/SwitchCase.stories.tsx +209 -0
  119. package/dist/components/switch-case/index.tsx +89 -0
  120. package/dist/components/switch-case/meta.ts +6 -0
  121. package/dist/components/table/Table.stories.tsx +1095 -0
  122. package/dist/components/table/index.tsx +113 -0
  123. package/dist/components/table/meta.ts +20 -0
  124. package/dist/components/tabs/Tabs.stories.tsx +1379 -0
  125. package/dist/components/tabs/index.tsx +186 -0
  126. package/dist/components/tabs/meta.ts +25 -0
  127. package/dist/components/tag/Tag.stories.tsx +625 -0
  128. package/dist/components/tag/index.tsx +320 -0
  129. package/dist/components/tag/meta.ts +52 -0
  130. package/dist/components/textarea/TextArea.stories.tsx +723 -0
  131. package/dist/components/textarea/index.tsx +480 -0
  132. package/dist/components/textarea/meta.ts +23 -0
  133. package/dist/components/toast/Toast.stories.tsx +1427 -0
  134. package/dist/components/toast/index.tsx +26 -0
  135. package/dist/components/toast/meta.ts +19 -0
  136. package/dist/components/toggle/Toggle.stories.tsx +1093 -0
  137. package/dist/components/toggle/index.tsx +44 -0
  138. package/dist/components/toggle/meta.ts +19 -0
  139. package/dist/components/tooltip/Tooltip.stories.tsx +1548 -0
  140. package/dist/components/tooltip/index.tsx +304 -0
  141. package/dist/components/tooltip/meta.ts +21 -0
  142. package/dist/components/typography/Typography.stories.tsx +197 -0
  143. package/dist/components/typography/index.tsx +184 -0
  144. package/dist/components/typography/meta.ts +38 -0
  145. package/dist/fonts/LabGrotesque-Regular.ttf +0 -0
  146. package/dist/fonts/LabGrotesqueTRIAL-Bold.otf +0 -0
  147. package/dist/fonts/LabGrotesqueTRIAL-Light.otf +0 -0
  148. package/dist/fonts/LabGrotesqueTRIAL-Medium.otf +0 -0
  149. package/dist/fonts/LabGrotesqueTRIAL-Regular.otf +0 -0
  150. package/dist/fonts/PPSupplySans-Regular (1).otf +0 -0
  151. package/dist/fonts/PPSupplySans-Regular.otf +0 -0
  152. package/dist/fonts/PPSupplySans-Ultralight.otf +0 -0
  153. package/dist/hooks/index.ts +3 -0
  154. package/dist/hooks/use-previous/UsePrevious.stories.tsx +997 -0
  155. package/dist/hooks/use-previous/index.ts +15 -0
  156. package/dist/hooks/use-previous/meta.ts +6 -0
  157. package/dist/hooks/use-standalone-pagination/UseStandalonePagination.stories.tsx +983 -0
  158. package/dist/hooks/use-standalone-pagination/index.ts +146 -0
  159. package/dist/hooks/use-standalone-pagination/meta.ts +6 -0
  160. package/dist/icons/Icons.stories.tsx +29 -0
  161. package/dist/icons/alert-icon/AlertIcon.stories.tsx +991 -0
  162. package/dist/icons/alert-icon/index.tsx +48 -0
  163. package/dist/icons/alert-icon/meta.ts +8 -0
  164. package/dist/icons/all-icons.tsx +738 -0
  165. package/dist/icons/angle-down-icon/AngleDownIcon.stories.tsx +1031 -0
  166. package/dist/icons/angle-down-icon/index.tsx +25 -0
  167. package/dist/icons/angle-down-icon/meta.ts +8 -0
  168. package/dist/icons/arrow-box-left-icon/ArrowBoxLeftIcon.stories.tsx +1080 -0
  169. package/dist/icons/arrow-box-left-icon/index.tsx +24 -0
  170. package/dist/icons/arrow-box-left-icon/meta.ts +8 -0
  171. package/dist/icons/arrow-right-icon/ArrowRightIcon.stories.tsx +1151 -0
  172. package/dist/icons/arrow-right-icon/index.tsx +26 -0
  173. package/dist/icons/arrow-right-icon/meta.ts +8 -0
  174. package/dist/icons/arrow-right-up-icon/ArrowRightUpIcon.stories.tsx +1273 -0
  175. package/dist/icons/arrow-right-up-icon/index.tsx +24 -0
  176. package/dist/icons/arrow-right-up-icon/meta.ts +8 -0
  177. package/dist/icons/art-board-icon/ArtBoardIcon.stories.tsx +670 -0
  178. package/dist/icons/art-board-icon/index.tsx +24 -0
  179. package/dist/icons/art-board-icon/meta.ts +7 -0
  180. package/dist/icons/audio-bar-icon/AudioBarIcon.stories.tsx +1244 -0
  181. package/dist/icons/audio-bar-icon/index.tsx +19 -0
  182. package/dist/icons/audio-bar-icon/meta.ts +8 -0
  183. package/dist/icons/bubble-check-icon/BubbleCheckIcon.stories.tsx +1239 -0
  184. package/dist/icons/bubble-check-icon/index.tsx +24 -0
  185. package/dist/icons/bubble-check-icon/meta.ts +8 -0
  186. package/dist/icons/bubble-crossed-icon/BubbleCrossedIcon.stories.tsx +1228 -0
  187. package/dist/icons/bubble-crossed-icon/index.tsx +24 -0
  188. package/dist/icons/bubble-crossed-icon/meta.ts +8 -0
  189. package/dist/icons/bubble-sparkle-icon/BubbleSparkleIcon.stories.tsx +912 -0
  190. package/dist/icons/bubble-sparkle-icon/index.tsx +26 -0
  191. package/dist/icons/bubble-sparkle-icon/meta.ts +8 -0
  192. package/dist/icons/chevron-double-left-icon/ChevronDoubleLeftIcon.stories.tsx +1021 -0
  193. package/dist/icons/chevron-double-left-icon/index.tsx +34 -0
  194. package/dist/icons/chevron-double-left-icon/meta.ts +8 -0
  195. package/dist/icons/chevron-double-right-icon/ChevronDoubleRightIcon.stories.tsx +1021 -0
  196. package/dist/icons/chevron-double-right-icon/index.tsx +34 -0
  197. package/dist/icons/chevron-double-right-icon/meta.ts +8 -0
  198. package/dist/icons/chevron-down-icon/ChevronDownIcon.stories.tsx +1001 -0
  199. package/dist/icons/chevron-down-icon/index.tsx +27 -0
  200. package/dist/icons/chevron-down-icon/meta.ts +8 -0
  201. package/dist/icons/chevron-left-icon/ChevronLeftIcon.stories.tsx +1029 -0
  202. package/dist/icons/chevron-left-icon/index.tsx +27 -0
  203. package/dist/icons/chevron-left-icon/meta.ts +8 -0
  204. package/dist/icons/chevron-right-icon/ChevronRightIcon.stories.tsx +1021 -0
  205. package/dist/icons/chevron-right-icon/index.tsx +27 -0
  206. package/dist/icons/chevron-right-icon/meta.ts +8 -0
  207. package/dist/icons/chevron-up-icon/ChevronUpIcon.stories.tsx +1036 -0
  208. package/dist/icons/chevron-up-icon/index.tsx +27 -0
  209. package/dist/icons/chevron-up-icon/meta.ts +8 -0
  210. package/dist/icons/command-icon/CommandIcon.stories.tsx +1098 -0
  211. package/dist/icons/command-icon/index.tsx +24 -0
  212. package/dist/icons/command-icon/meta.ts +8 -0
  213. package/dist/icons/cross-circle-icon/CrossCircleIcon.stories.tsx +1061 -0
  214. package/dist/icons/cross-circle-icon/index.tsx +23 -0
  215. package/dist/icons/cross-circle-icon/meta.ts +8 -0
  216. package/dist/icons/cross-icon/CrossIcon.stories.tsx +1027 -0
  217. package/dist/icons/cross-icon/index.tsx +24 -0
  218. package/dist/icons/cross-icon/meta.ts +8 -0
  219. package/dist/icons/edit-big-icon/EditBigIcon.stories.tsx +1092 -0
  220. package/dist/icons/edit-big-icon/index.tsx +22 -0
  221. package/dist/icons/edit-big-icon/meta.ts +8 -0
  222. package/dist/icons/eye-close-icon/EyeCloseIcon.stories.tsx +1090 -0
  223. package/dist/icons/eye-close-icon/index.tsx +26 -0
  224. package/dist/icons/eye-close-icon/meta.ts +8 -0
  225. package/dist/icons/eye-open-icon/EyeOpenIcon.stories.tsx +1098 -0
  226. package/dist/icons/eye-open-icon/index.tsx +24 -0
  227. package/dist/icons/eye-open-icon/meta.ts +8 -0
  228. package/dist/icons/feature-shine-icon/FeatureShineIcon.stories.tsx +1071 -0
  229. package/dist/icons/feature-shine-icon/index.tsx +29 -0
  230. package/dist/icons/feature-shine-icon/meta.ts +8 -0
  231. package/dist/icons/file-chart-icon/FileChartIcon.stories.tsx +1115 -0
  232. package/dist/icons/file-chart-icon/index.tsx +24 -0
  233. package/dist/icons/file-chart-icon/meta.ts +8 -0
  234. package/dist/icons/file-text-icon/FileTextIcon.stories.tsx +668 -0
  235. package/dist/icons/file-text-icon/index.tsx +24 -0
  236. package/dist/icons/file-text-icon/meta.ts +8 -0
  237. package/dist/icons/grip-vertical-icon/GripVerticalIcon.stories.tsx +1239 -0
  238. package/dist/icons/grip-vertical-icon/index.tsx +28 -0
  239. package/dist/icons/grip-vertical-icon/meta.ts +8 -0
  240. package/dist/icons/image-icon/ImageIcon.stories.tsx +1181 -0
  241. package/dist/icons/image-icon/index.tsx +24 -0
  242. package/dist/icons/image-icon/meta.ts +8 -0
  243. package/dist/icons/import-folder-icon/ImportFolderIcon.stories.tsx +1248 -0
  244. package/dist/icons/import-folder-icon/index.tsx +22 -0
  245. package/dist/icons/import-folder-icon/meta.ts +8 -0
  246. package/dist/icons/index.ts +46 -0
  247. package/dist/icons/light-bulb-simple-icon/LightBulbSimpleIcon.stories.tsx +1272 -0
  248. package/dist/icons/light-bulb-simple-icon/index.tsx +24 -0
  249. package/dist/icons/light-bulb-simple-icon/meta.ts +8 -0
  250. package/dist/icons/magic-book-icon/MagicBookIcon.stories.tsx +1245 -0
  251. package/dist/icons/magic-book-icon/index.tsx +32 -0
  252. package/dist/icons/magic-book-icon/meta.ts +8 -0
  253. package/dist/icons/maintenance-icon/MaintenanceIcon.stories.tsx +1251 -0
  254. package/dist/icons/maintenance-icon/index.tsx +23 -0
  255. package/dist/icons/maintenance-icon/meta.ts +8 -0
  256. package/dist/icons/message-icon/MessageIcon.stories.tsx +595 -0
  257. package/dist/icons/message-icon/index.tsx +30 -0
  258. package/dist/icons/message-icon/meta.ts +8 -0
  259. package/dist/icons/move-horizontal-icon/MoveHorizontalIcon.stories.tsx +1245 -0
  260. package/dist/icons/move-horizontal-icon/index.tsx +23 -0
  261. package/dist/icons/move-horizontal-icon/meta.ts +8 -0
  262. package/dist/icons/move-vertical-icon/MoveVerticalIcon.stories.tsx +1196 -0
  263. package/dist/icons/move-vertical-icon/index.tsx +23 -0
  264. package/dist/icons/move-vertical-icon/meta.ts +8 -0
  265. package/dist/icons/page-search-icon/PageSearchIcon.stories.tsx +1167 -0
  266. package/dist/icons/page-search-icon/index.tsx +21 -0
  267. package/dist/icons/page-search-icon/meta.ts +8 -0
  268. package/dist/icons/pencil-icon/PencilIcon.stories.tsx +1131 -0
  269. package/dist/icons/pencil-icon/index.tsx +21 -0
  270. package/dist/icons/pencil-icon/meta.ts +8 -0
  271. package/dist/icons/plus-icon/PlusIcon.stories.tsx +1151 -0
  272. package/dist/icons/plus-icon/index.tsx +24 -0
  273. package/dist/icons/plus-icon/meta.ts +8 -0
  274. package/dist/icons/search-icon/SearchIcon.stories.tsx +1181 -0
  275. package/dist/icons/search-icon/index.tsx +24 -0
  276. package/dist/icons/search-icon/meta.ts +8 -0
  277. package/dist/icons/site-logo-icon/SiteLogoIcon.stories.tsx +1167 -0
  278. package/dist/icons/site-logo-icon/index.tsx +79 -0
  279. package/dist/icons/site-logo-icon/meta.ts +8 -0
  280. package/dist/icons/spinner-gradient-icon/SpinnerGradientIcon.stories.tsx +637 -0
  281. package/dist/icons/spinner-gradient-icon/index.tsx +53 -0
  282. package/dist/icons/spinner-gradient-icon/meta.ts +8 -0
  283. package/dist/icons/spinner-solid-icon/SpinnerSolidIcon.stories.tsx +644 -0
  284. package/dist/icons/spinner-solid-icon/index.tsx +59 -0
  285. package/dist/icons/spinner-solid-icon/meta.ts +8 -0
  286. package/dist/icons/spinner-solid-neutral-icon/SpinnerSolidINeutralcon.stories.tsx +736 -0
  287. package/dist/icons/spinner-solid-neutral-icon/index.tsx +53 -0
  288. package/dist/icons/spinner-solid-neutral-icon/meta.ts +8 -0
  289. package/dist/icons/tick-circle-icon/TickCircleIcon.stories.tsx +1204 -0
  290. package/dist/icons/tick-circle-icon/index.tsx +23 -0
  291. package/dist/icons/tick-circle-icon/meta.ts +8 -0
  292. package/dist/icons/tick-icon/TickIcon.stories.tsx +1340 -0
  293. package/dist/icons/tick-icon/index.tsx +24 -0
  294. package/dist/icons/tick-icon/meta.ts +8 -0
  295. package/dist/icons/trash-icon/TrashIcon.stories.tsx +996 -0
  296. package/dist/icons/trash-icon/index.tsx +24 -0
  297. package/dist/icons/trash-icon/meta.ts +8 -0
  298. package/dist/icons/upload-icon/UploadIcon.stories.tsx +947 -0
  299. package/dist/icons/upload-icon/index.tsx +24 -0
  300. package/dist/icons/upload-icon/meta.ts +8 -0
  301. package/dist/icons/vertical-menu-icon/VerticalMenuIcon.stories.tsx +1045 -0
  302. package/dist/icons/vertical-menu-icon/index.tsx +27 -0
  303. package/dist/icons/vertical-menu-icon/meta.ts +8 -0
  304. package/dist/index.d.ts +6 -0
  305. package/dist/index.js +206 -0
  306. package/dist/lib/utils.ts +6 -0
  307. package/dist/styles/aural-theme.css +1008 -0
  308. package/package.json +142 -0
@@ -0,0 +1,859 @@
1
+ import React from "react"
2
+ import { Badge } from "@components/badge"
3
+ import { Button } from "@components/button"
4
+ import type { Meta, StoryObj } from "@storybook/react"
5
+
6
+ import { Skeleton } from "."
7
+
8
+ const meta: Meta<typeof Skeleton> = {
9
+ title: "Components/UI/Skeleton",
10
+ component: Skeleton,
11
+ parameters: {
12
+ layout: "fullscreen",
13
+ backgrounds: {
14
+ default: "dark",
15
+ values: [
16
+ { name: "dark", value: "#0a0a0a" },
17
+ { name: "light", value: "#ffffff" },
18
+ ],
19
+ },
20
+ docs: {
21
+ description: {
22
+ component: `
23
+ # Skeleton Component
24
+
25
+ A loading placeholder component that displays animated shimmer effects while content is being loaded. It helps improve perceived performance by showing users that content is loading.
26
+
27
+ ## Features
28
+
29
+ - **Animated Pulse**: Smooth pulse animation for loading states
30
+ - **Flexible Sizing**: Easily customizable with Tailwind classes
31
+ - **Accessible**: Uses proper ARIA attributes for screen readers
32
+ - **Lightweight**: Simple, performant implementation
33
+ - **Customizable**: Override styles with className prop
34
+ - **Rounded Corners**: Default rounded styling that can be customized
35
+
36
+ ## Usage Examples
37
+
38
+ ### Basic Skeleton
39
+ \`\`\`tsx
40
+ <Skeleton className="h-4 w-full" />
41
+ \`\`\`
42
+
43
+ ### Text Lines
44
+ \`\`\`tsx
45
+ <div className="space-y-2">
46
+ <Skeleton className="h-4 w-full" />
47
+ <Skeleton className="h-4 w-3/4" />
48
+ <Skeleton className="h-4 w-1/2" />
49
+ </div>
50
+ \`\`\`
51
+
52
+ ### Avatar Skeleton
53
+ \`\`\`tsx
54
+ <Skeleton className="h-12 w-12 rounded-full" />
55
+ \`\`\`
56
+
57
+ ### Card Skeleton
58
+ \`\`\`tsx
59
+ <div className="space-y-3">
60
+ <Skeleton className="h-48 w-full rounded-lg" />
61
+ <Skeleton className="h-4 w-2/3" />
62
+ <Skeleton className="h-4 w-1/2" />
63
+ </div>
64
+ \`\`\`
65
+
66
+ ### Button Skeleton
67
+ \`\`\`tsx
68
+ <Skeleton className="h-10 w-24 rounded-md" />
69
+ \`\`\`
70
+ `,
71
+ },
72
+ },
73
+ },
74
+ tags: ["autodocs"],
75
+ }
76
+
77
+ export default meta
78
+ type Story = StoryObj<typeof Skeleton>
79
+
80
+ // 1. Basic Skeleton Sizes
81
+ export const BasicSizes: Story = {
82
+ render: () => (
83
+ <div className="space-y-8 p-8">
84
+ <div className="space-y-4">
85
+ <h3 className="text-lg font-medium text-white">Basic Skeleton Sizes</h3>
86
+
87
+ {/* Small elements */}
88
+ <div className="space-y-3">
89
+ <h4 className="text-sm font-medium text-white/70">Small Elements</h4>
90
+ <div className="space-y-2">
91
+ <div className="flex items-center gap-2">
92
+ <span className="w-16 text-xs text-white/60">Badge:</span>
93
+ <Skeleton className="h-5 w-16" />
94
+ </div>
95
+ <div className="flex items-center gap-2">
96
+ <span className="w-16 text-xs text-white/60">Tag:</span>
97
+ <Skeleton className="h-6 w-20" />
98
+ </div>
99
+ <div className="flex items-center gap-2">
100
+ <span className="w-16 text-xs text-white/60">Icon:</span>
101
+ <Skeleton className="h-4 w-4" />
102
+ </div>
103
+ </div>
104
+ </div>
105
+
106
+ {/* Text elements */}
107
+ <div className="space-y-3">
108
+ <h4 className="text-sm font-medium text-white/70">Text Elements</h4>
109
+ <div className="space-y-2">
110
+ <div className="flex items-center gap-2">
111
+ <span className="w-16 text-xs text-white/60">Line:</span>
112
+ <Skeleton className="h-4 w-full" />
113
+ </div>
114
+ <div className="flex items-center gap-2">
115
+ <span className="w-16 text-xs text-white/60">Short:</span>
116
+ <Skeleton className="h-4 w-3/4" />
117
+ </div>
118
+ <div className="flex items-center gap-2">
119
+ <span className="w-16 text-xs text-white/60">Word:</span>
120
+ <Skeleton className="h-4 w-1/2" />
121
+ </div>
122
+ <div className="flex items-center gap-2">
123
+ <span className="w-16 text-xs text-white/60">Title:</span>
124
+ <Skeleton className="h-6 w-2/3" />
125
+ </div>
126
+ <div className="flex items-center gap-2">
127
+ <span className="w-16 text-xs text-white/60">Heading:</span>
128
+ <Skeleton className="h-8 w-1/2" />
129
+ </div>
130
+ </div>
131
+ </div>
132
+
133
+ {/* Interactive elements */}
134
+ <div className="space-y-3">
135
+ <h4 className="text-sm font-medium text-white/70">
136
+ Interactive Elements
137
+ </h4>
138
+ <div className="space-y-2">
139
+ <div className="flex items-center gap-2">
140
+ <span className="w-16 text-xs text-white/60">Button:</span>
141
+ <Skeleton className="h-10 w-24" />
142
+ </div>
143
+ <div className="flex items-center gap-2">
144
+ <span className="w-16 text-xs text-white/60">Input:</span>
145
+ <Skeleton className="h-10 w-64" />
146
+ </div>
147
+ <div className="flex items-center gap-2">
148
+ <span className="w-16 text-xs text-white/60">Select:</span>
149
+ <Skeleton className="h-10 w-48" />
150
+ </div>
151
+ </div>
152
+ </div>
153
+
154
+ {/* Shape variations */}
155
+ <div className="space-y-3">
156
+ <h4 className="text-sm font-medium text-white/70">
157
+ Shape Variations
158
+ </h4>
159
+ <div className="flex items-center gap-4">
160
+ <div className="text-center">
161
+ <Skeleton className="h-12 w-12 rounded-full" />
162
+ <p className="mt-1 text-xs text-white/60">Circle</p>
163
+ </div>
164
+ <div className="text-center">
165
+ <Skeleton className="h-12 w-12 rounded-none" />
166
+ <p className="mt-1 text-xs text-white/60">Square</p>
167
+ </div>
168
+ <div className="text-center">
169
+ <Skeleton className="h-12 w-16 rounded-lg" />
170
+ <p className="mt-1 text-xs text-white/60">Rounded</p>
171
+ </div>
172
+ <div className="text-center">
173
+ <Skeleton className="h-6 w-32 rounded-full" />
174
+ <p className="mt-1 text-xs text-white/60">Pill</p>
175
+ </div>
176
+ </div>
177
+ </div>
178
+ </div>
179
+ </div>
180
+ ),
181
+ parameters: {
182
+ docs: {
183
+ description: {
184
+ story:
185
+ "Various skeleton sizes and shapes for different UI elements including text, buttons, inputs, and icons with different border radius options.",
186
+ },
187
+ },
188
+ },
189
+ }
190
+
191
+ // 2. Text Content Skeletons
192
+ export const TextContentSkeletons: Story = {
193
+ render: () => (
194
+ <div className="space-y-8 p-8">
195
+ <h3 className="text-lg font-medium text-white">Text Content Skeletons</h3>
196
+
197
+ {/* Paragraph skeleton */}
198
+ <div className="space-y-4">
199
+ <h4 className="text-sm font-medium text-white/70">Paragraph</h4>
200
+ <div className="space-y-2">
201
+ <Skeleton className="h-4 w-full" />
202
+ <Skeleton className="h-4 w-full" />
203
+ <Skeleton className="h-4 w-3/4" />
204
+ </div>
205
+ </div>
206
+
207
+ {/* Article skeleton */}
208
+ <div className="space-y-4">
209
+ <h4 className="text-sm font-medium text-white/70">Article</h4>
210
+ <div className="space-y-3">
211
+ <Skeleton className="h-8 w-2/3" /> {/* Title */}
212
+ <Skeleton className="h-4 w-1/3" /> {/* Meta info */}
213
+ <div className="space-y-2">
214
+ <Skeleton className="h-4 w-full" />
215
+ <Skeleton className="h-4 w-full" />
216
+ <Skeleton className="h-4 w-5/6" />
217
+ </div>
218
+ <div className="space-y-2">
219
+ <Skeleton className="h-4 w-full" />
220
+ <Skeleton className="h-4 w-4/5" />
221
+ </div>
222
+ </div>
223
+ </div>
224
+
225
+ {/* List skeleton */}
226
+ <div className="space-y-4">
227
+ <h4 className="text-sm font-medium text-white/70">List Items</h4>
228
+ <div className="space-y-3">
229
+ {Array.from({ length: 4 }, (_, i) => (
230
+ <div key={i} className="flex items-center gap-3">
231
+ <Skeleton className="h-2 w-2 rounded-full" />
232
+ <Skeleton className="h-4 flex-1" />
233
+ </div>
234
+ ))}
235
+ </div>
236
+ </div>
237
+
238
+ {/* Comments skeleton */}
239
+ <div className="space-y-4">
240
+ <h4 className="text-sm font-medium text-white/70">Comments</h4>
241
+ <div className="space-y-4">
242
+ {Array.from({ length: 3 }, (_, i) => (
243
+ <div key={i} className="flex gap-3">
244
+ <Skeleton className="h-8 w-8 rounded-full" />
245
+ <div className="flex-1 space-y-2">
246
+ <Skeleton className="h-3 w-24" />
247
+ <Skeleton className="h-4 w-full" />
248
+ <Skeleton className="h-4 w-3/4" />
249
+ </div>
250
+ </div>
251
+ ))}
252
+ </div>
253
+ </div>
254
+ </div>
255
+ ),
256
+ parameters: {
257
+ docs: {
258
+ description: {
259
+ story:
260
+ "Skeleton layouts for various text content including paragraphs, articles, lists, and comment sections.",
261
+ },
262
+ },
263
+ },
264
+ }
265
+
266
+ // 3. Card Layout Skeletons
267
+ export const CardLayoutSkeletons: Story = {
268
+ render: () => (
269
+ <div className="space-y-8 p-8">
270
+ <h3 className="text-lg font-medium text-white">Card Layout Skeletons</h3>
271
+
272
+ <div className="grid grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-3">
273
+ {/* Basic card */}
274
+ <div className="rounded-lg border border-white/10 bg-white/5 p-4">
275
+ <div className="space-y-3">
276
+ <Skeleton className="h-32 w-full rounded-md" />
277
+ <Skeleton className="h-5 w-3/4" />
278
+ <div className="space-y-2">
279
+ <Skeleton className="h-4 w-full" />
280
+ <Skeleton className="h-4 w-2/3" />
281
+ </div>
282
+ <Skeleton className="h-9 w-20" />
283
+ </div>
284
+ </div>
285
+
286
+ {/* Profile card */}
287
+ <div className="rounded-lg border border-white/10 bg-white/5 p-4">
288
+ <div className="space-y-4">
289
+ <div className="flex items-center gap-3">
290
+ <Skeleton className="h-12 w-12 rounded-full" />
291
+ <div className="space-y-2">
292
+ <Skeleton className="h-4 w-24" />
293
+ <Skeleton className="h-3 w-16" />
294
+ </div>
295
+ </div>
296
+ <div className="space-y-2">
297
+ <Skeleton className="h-4 w-full" />
298
+ <Skeleton className="h-4 w-3/4" />
299
+ </div>
300
+ <div className="flex gap-2">
301
+ <Skeleton className="h-8 w-16" />
302
+ <Skeleton className="h-8 w-20" />
303
+ </div>
304
+ </div>
305
+ </div>
306
+
307
+ {/* Product card */}
308
+ <div className="rounded-lg border border-white/10 bg-white/5 p-4">
309
+ <div className="space-y-3">
310
+ <Skeleton className="h-40 w-full rounded-md" />
311
+ <div className="space-y-2">
312
+ <Skeleton className="h-5 w-full" />
313
+ <div className="flex items-center justify-between">
314
+ <Skeleton className="h-6 w-16" />
315
+ <Skeleton className="h-4 w-12" />
316
+ </div>
317
+ </div>
318
+ <div className="flex gap-2">
319
+ <Skeleton className="h-9 flex-1" />
320
+ <Skeleton className="h-9 w-9" />
321
+ </div>
322
+ </div>
323
+ </div>
324
+
325
+ {/* Stats card */}
326
+ <div className="rounded-lg border border-white/10 bg-white/5 p-4">
327
+ <div className="space-y-4">
328
+ <div className="flex items-center justify-between">
329
+ <Skeleton className="h-5 w-24" />
330
+ <Skeleton className="h-6 w-6 rounded-md" />
331
+ </div>
332
+ <Skeleton className="h-8 w-16" />
333
+ <div className="space-y-2">
334
+ <div className="flex justify-between">
335
+ <Skeleton className="h-3 w-12" />
336
+ <Skeleton className="h-3 w-8" />
337
+ </div>
338
+ <Skeleton className="h-2 w-full rounded-full" />
339
+ </div>
340
+ </div>
341
+ </div>
342
+
343
+ {/* Media card */}
344
+ <div className="rounded-lg border border-white/10 bg-white/5 p-4">
345
+ <div className="space-y-3">
346
+ <div className="flex items-center gap-3">
347
+ <Skeleton className="h-10 w-10 rounded-full" />
348
+ <div className="space-y-1">
349
+ <Skeleton className="h-4 w-20" />
350
+ <Skeleton className="h-3 w-16" />
351
+ </div>
352
+ </div>
353
+ <Skeleton className="h-48 w-full rounded-md" />
354
+ <div className="space-y-2">
355
+ <Skeleton className="h-4 w-full" />
356
+ <Skeleton className="h-4 w-1/2" />
357
+ </div>
358
+ <div className="flex justify-between">
359
+ <div className="flex gap-2">
360
+ <Skeleton className="h-8 w-12" />
361
+ <Skeleton className="h-8 w-12" />
362
+ </div>
363
+ <Skeleton className="h-8 w-8" />
364
+ </div>
365
+ </div>
366
+ </div>
367
+
368
+ {/* Dashboard widget */}
369
+ <div className="rounded-lg border border-white/10 bg-white/5 p-4">
370
+ <div className="space-y-4">
371
+ <div className="flex items-center justify-between">
372
+ <Skeleton className="h-5 w-32" />
373
+ <Skeleton className="h-6 w-16 rounded-full" />
374
+ </div>
375
+ <div className="grid grid-cols-2 gap-4">
376
+ <div className="space-y-1">
377
+ <Skeleton className="h-6 w-12" />
378
+ <Skeleton className="h-3 w-16" />
379
+ </div>
380
+ <div className="space-y-1">
381
+ <Skeleton className="h-6 w-16" />
382
+ <Skeleton className="h-3 w-12" />
383
+ </div>
384
+ </div>
385
+ <Skeleton className="h-24 w-full rounded-md" />
386
+ </div>
387
+ </div>
388
+ </div>
389
+ </div>
390
+ ),
391
+ parameters: {
392
+ docs: {
393
+ description: {
394
+ story:
395
+ "Comprehensive card layout skeletons for different content types including basic cards, profiles, products, stats, media, and dashboard widgets.",
396
+ },
397
+ },
398
+ },
399
+ }
400
+
401
+ // 4. Table Skeleton
402
+ export const TableSkeleton: Story = {
403
+ render: () => (
404
+ <div className="space-y-8 p-8">
405
+ <h3 className="text-lg font-medium text-white">Table Skeleton</h3>
406
+
407
+ <div className="space-y-4">
408
+ {/* Table header */}
409
+ <div className="grid grid-cols-4 gap-4 border-b border-white/10 pb-3">
410
+ <Skeleton className="h-4 w-16" />
411
+ <Skeleton className="h-4 w-20" />
412
+ <Skeleton className="h-4 w-12" />
413
+ <Skeleton className="h-4 w-14" />
414
+ </div>
415
+
416
+ {/* Table rows */}
417
+ {Array.from({ length: 6 }, (_, i) => (
418
+ <div key={i} className="grid grid-cols-4 gap-4 py-3">
419
+ <div className="flex items-center gap-2">
420
+ <Skeleton className="h-8 w-8 rounded-full" />
421
+ <Skeleton className="h-4 w-24" />
422
+ </div>
423
+ <Skeleton className="h-4 w-32" />
424
+ <Skeleton className="h-6 w-16 rounded-full" />
425
+ <div className="flex gap-1">
426
+ <Skeleton className="h-8 w-8" />
427
+ <Skeleton className="h-8 w-8" />
428
+ </div>
429
+ </div>
430
+ ))}
431
+ </div>
432
+
433
+ {/* Pagination skeleton */}
434
+ <div className="flex items-center justify-between border-t border-white/10 pt-4">
435
+ <Skeleton className="h-4 w-32" />
436
+ <div className="flex gap-1">
437
+ <Skeleton className="h-8 w-8" />
438
+ <Skeleton className="h-8 w-8" />
439
+ <Skeleton className="h-8 w-8" />
440
+ <Skeleton className="h-8 w-12" />
441
+ </div>
442
+ </div>
443
+ </div>
444
+ ),
445
+ parameters: {
446
+ docs: {
447
+ description: {
448
+ story:
449
+ "Table skeleton with headers, rows containing avatars, text, badges, and action buttons, plus pagination controls.",
450
+ },
451
+ },
452
+ },
453
+ }
454
+
455
+ // 5. Form Skeleton
456
+ export const FormSkeleton: Story = {
457
+ render: () => (
458
+ <div className="space-y-8 p-8">
459
+ <h3 className="text-lg font-medium text-white">Form Skeleton</h3>
460
+
461
+ <div className="mx-auto max-w-md space-y-6">
462
+ {/* Form header */}
463
+ <div className="space-y-2">
464
+ <Skeleton className="h-8 w-48" />
465
+ <Skeleton className="h-4 w-full" />
466
+ </div>
467
+
468
+ {/* Form fields */}
469
+ <div className="space-y-4">
470
+ {/* Text input */}
471
+ <div className="space-y-2">
472
+ <Skeleton className="h-4 w-16" />
473
+ <Skeleton className="h-10 w-full" />
474
+ </div>
475
+
476
+ {/* Email input */}
477
+ <div className="space-y-2">
478
+ <Skeleton className="h-4 w-12" />
479
+ <Skeleton className="h-10 w-full" />
480
+ </div>
481
+
482
+ {/* Select */}
483
+ <div className="space-y-2">
484
+ <Skeleton className="h-4 w-20" />
485
+ <Skeleton className="h-10 w-full" />
486
+ </div>
487
+
488
+ {/* Textarea */}
489
+ <div className="space-y-2">
490
+ <Skeleton className="h-4 w-18" />
491
+ <Skeleton className="h-24 w-full" />
492
+ </div>
493
+
494
+ {/* Checkbox group */}
495
+ <div className="space-y-3">
496
+ <Skeleton className="h-4 w-24" />
497
+ <div className="space-y-2">
498
+ {Array.from({ length: 3 }, (_, i) => (
499
+ <div key={i} className="flex items-center gap-2">
500
+ <Skeleton className="h-4 w-4" />
501
+ <Skeleton className="h-4 w-32" />
502
+ </div>
503
+ ))}
504
+ </div>
505
+ </div>
506
+
507
+ {/* Radio group */}
508
+ <div className="space-y-3">
509
+ <Skeleton className="h-4 w-20" />
510
+ <div className="space-y-2">
511
+ {Array.from({ length: 2 }, (_, i) => (
512
+ <div key={i} className="flex items-center gap-2">
513
+ <Skeleton className="h-4 w-4 rounded-full" />
514
+ <Skeleton className="h-4 w-28" />
515
+ </div>
516
+ ))}
517
+ </div>
518
+ </div>
519
+ </div>
520
+
521
+ {/* Form actions */}
522
+ <div className="flex gap-3 pt-4">
523
+ <Skeleton className="h-10 flex-1" />
524
+ <Skeleton className="h-10 w-20" />
525
+ </div>
526
+ </div>
527
+ </div>
528
+ ),
529
+ parameters: {
530
+ docs: {
531
+ description: {
532
+ story:
533
+ "Complete form skeleton with various input types including text fields, selects, textareas, checkboxes, radio buttons, and action buttons.",
534
+ },
535
+ },
536
+ },
537
+ }
538
+
539
+ // 6. Loading States Simulation
540
+ export const LoadingStatesSimulation: Story = {
541
+ render: () => {
542
+ const [loadingStates, setLoadingStates] = React.useState({
543
+ profile: true,
544
+ content: true,
545
+ cards: true,
546
+ table: true,
547
+ })
548
+
549
+ React.useEffect(() => {
550
+ // Simulate different loading times
551
+ const timers = [
552
+ setTimeout(
553
+ () => setLoadingStates((prev) => ({ ...prev, profile: false })),
554
+ 1000
555
+ ),
556
+ setTimeout(
557
+ () => setLoadingStates((prev) => ({ ...prev, content: false })),
558
+ 2000
559
+ ),
560
+ setTimeout(
561
+ () => setLoadingStates((prev) => ({ ...prev, cards: false })),
562
+ 3000
563
+ ),
564
+ setTimeout(
565
+ () => setLoadingStates((prev) => ({ ...prev, table: false })),
566
+ 4000
567
+ ),
568
+ ]
569
+
570
+ return () => timers.forEach(clearTimeout)
571
+ }, [])
572
+
573
+ const resetLoadingStates = () => {
574
+ setLoadingStates({
575
+ profile: true,
576
+ content: true,
577
+ cards: true,
578
+ table: true,
579
+ })
580
+ }
581
+
582
+ return (
583
+ <div className="space-y-8 p-8">
584
+ <div className="flex items-center justify-between">
585
+ <h3 className="text-lg font-medium text-white">
586
+ Loading States Simulation
587
+ </h3>
588
+ <Button onClick={resetLoadingStates} size="sm">
589
+ Reset Loading
590
+ </Button>
591
+ </div>
592
+
593
+ <div className="grid grid-cols-1 gap-6 lg:grid-cols-2">
594
+ {/* Profile section */}
595
+ <div className="space-y-4">
596
+ <h4 className="text-sm font-medium text-white/70">
597
+ Profile Section
598
+ </h4>
599
+ <div className="rounded-lg border border-white/10 bg-white/5 p-4">
600
+ {loadingStates.profile ? (
601
+ <div className="flex items-center gap-4">
602
+ <Skeleton className="h-16 w-16 rounded-full" />
603
+ <div className="space-y-2">
604
+ <Skeleton className="h-6 w-32" />
605
+ <Skeleton className="h-4 w-24" />
606
+ <Skeleton className="h-4 w-40" />
607
+ </div>
608
+ </div>
609
+ ) : (
610
+ <div className="flex items-center gap-4">
611
+ <div className="h-16 w-16 rounded-full bg-gradient-to-r from-blue-500 to-purple-500" />
612
+ <div>
613
+ <h3 className="text-lg font-medium text-white">John Doe</h3>
614
+ <p className="text-sm text-white/60">Software Engineer</p>
615
+ <p className="text-sm text-white/80">
616
+ Building amazing user experiences
617
+ </p>
618
+ </div>
619
+ </div>
620
+ )}
621
+ </div>
622
+ </div>
623
+
624
+ {/* Content section */}
625
+ <div className="space-y-4">
626
+ <h4 className="text-sm font-medium text-white/70">
627
+ Content Section
628
+ </h4>
629
+ <div className="rounded-lg border border-white/10 bg-white/5 p-4">
630
+ {loadingStates.content ? (
631
+ <div className="space-y-3">
632
+ <Skeleton className="h-6 w-3/4" />
633
+ <div className="space-y-2">
634
+ <Skeleton className="h-4 w-full" />
635
+ <Skeleton className="h-4 w-full" />
636
+ <Skeleton className="h-4 w-2/3" />
637
+ </div>
638
+ </div>
639
+ ) : (
640
+ <div className="space-y-3">
641
+ <h3 className="text-lg font-medium text-white">
642
+ Article Title
643
+ </h3>
644
+ <p className="text-sm text-white/80">
645
+ This is the actual content that was loading. It demonstrates
646
+ how the skeleton transforms into real content seamlessly.
647
+ </p>
648
+ </div>
649
+ )}
650
+ </div>
651
+ </div>
652
+
653
+ {/* Cards section */}
654
+ <div className="space-y-4 lg:col-span-2">
655
+ <h4 className="text-sm font-medium text-white/70">Cards Grid</h4>
656
+ <div className="grid grid-cols-1 gap-4 md:grid-cols-3">
657
+ {Array.from({ length: 3 }, (_, i) => (
658
+ <div
659
+ key={i}
660
+ className="rounded-lg border border-white/10 bg-white/5 p-4"
661
+ >
662
+ {loadingStates.cards ? (
663
+ <div className="space-y-3">
664
+ <Skeleton className="h-24 w-full rounded-md" />
665
+ <Skeleton className="h-5 w-3/4" />
666
+ <Skeleton className="h-4 w-1/2" />
667
+ <Skeleton className="h-9 w-20" />
668
+ </div>
669
+ ) : (
670
+ <div className="space-y-3">
671
+ <div className="h-24 w-full rounded-md bg-gradient-to-r from-green-400 to-blue-500" />
672
+ <h3 className="font-medium text-white">Card {i + 1}</h3>
673
+ <p className="text-sm text-white/60">Description text</p>
674
+ <Badge color="neutral">Active</Badge>
675
+ </div>
676
+ )}
677
+ </div>
678
+ ))}
679
+ </div>
680
+ </div>
681
+
682
+ {/* Table section */}
683
+ <div className="space-y-4 lg:col-span-2">
684
+ <h4 className="text-sm font-medium text-white/70">Data Table</h4>
685
+ <div className="rounded-lg border border-white/10 bg-white/5 p-4">
686
+ {loadingStates.table ? (
687
+ <div className="space-y-3">
688
+ <div className="grid grid-cols-3 gap-4">
689
+ <Skeleton className="h-4 w-16" />
690
+ <Skeleton className="h-4 w-20" />
691
+ <Skeleton className="h-4 w-12" />
692
+ </div>
693
+ {Array.from({ length: 3 }, (_, i) => (
694
+ <div key={i} className="grid grid-cols-3 gap-4">
695
+ <Skeleton className="h-4 w-24" />
696
+ <Skeleton className="h-4 w-32" />
697
+ <Skeleton className="h-4 w-16" />
698
+ </div>
699
+ ))}
700
+ </div>
701
+ ) : (
702
+ <div className="space-y-3">
703
+ <div className="grid grid-cols-3 gap-4 font-medium text-white">
704
+ <div>Name</div>
705
+ <div>Email</div>
706
+ <div>Status</div>
707
+ </div>
708
+ {[
709
+ {
710
+ name: "Alice Johnson",
711
+ email: "alice@example.com",
712
+ status: "Active",
713
+ },
714
+ {
715
+ name: "Bob Smith",
716
+ email: "bob@example.com",
717
+ status: "Inactive",
718
+ },
719
+ {
720
+ name: "Carol Williams",
721
+ email: "carol@example.com",
722
+ status: "Active",
723
+ },
724
+ ].map((row, i) => (
725
+ <div
726
+ key={i}
727
+ className="grid grid-cols-3 gap-4 text-white/80"
728
+ >
729
+ <div>{row.name}</div>
730
+ <div>{row.email}</div>
731
+ <div>
732
+ <Badge
733
+ color={
734
+ row.status === "Active" ? "positive" : "neutral"
735
+ }
736
+ >
737
+ {row.status}
738
+ </Badge>
739
+ </div>
740
+ </div>
741
+ ))}
742
+ </div>
743
+ )}
744
+ </div>
745
+ </div>
746
+ </div>
747
+ </div>
748
+ )
749
+ },
750
+ parameters: {
751
+ docs: {
752
+ description: {
753
+ story:
754
+ "Interactive demonstration of loading states with timed transitions from skeleton to real content, showing how skeletons improve perceived performance.",
755
+ },
756
+ },
757
+ },
758
+ }
759
+
760
+ // 7. Custom Styling
761
+ export const CustomStyling: Story = {
762
+ render: () => (
763
+ <div className="space-y-8 p-8">
764
+ <h3 className="text-lg font-medium text-white">
765
+ Custom Styling Examples
766
+ </h3>
767
+
768
+ <div className="grid grid-cols-1 gap-6 md:grid-cols-2">
769
+ {/* Different colors */}
770
+ <div className="space-y-4">
771
+ <h4 className="text-sm font-medium text-white/70">
772
+ Color Variations
773
+ </h4>
774
+ <div className="space-y-3">
775
+ <div className="flex items-center gap-2">
776
+ <span className="w-16 text-xs text-white/60">Default:</span>
777
+ <Skeleton className="h-4 flex-1" />
778
+ </div>
779
+ <div className="flex items-center gap-2">
780
+ <span className="w-16 text-xs text-white/60">Blue:</span>
781
+ <Skeleton className="h-4 flex-1 bg-blue-500/20" />
782
+ </div>
783
+ <div className="flex items-center gap-2">
784
+ <span className="w-16 text-xs text-white/60">Green:</span>
785
+ <Skeleton className="h-4 flex-1 bg-green-500/20" />
786
+ </div>
787
+ <div className="flex items-center gap-2">
788
+ <span className="w-16 text-xs text-white/60">Purple:</span>
789
+ <Skeleton className="h-4 flex-1 bg-purple-500/20" />
790
+ </div>
791
+ </div>
792
+ </div>
793
+
794
+ {/* Different animations */}
795
+ <div className="space-y-4">
796
+ <h4 className="text-sm font-medium text-white/70">
797
+ Animation Variations
798
+ </h4>
799
+ <div className="space-y-3">
800
+ <div className="flex items-center gap-2">
801
+ <span className="w-16 text-xs text-white/60">Pulse:</span>
802
+ <Skeleton className="h-4 flex-1" />
803
+ </div>
804
+ <div className="flex items-center gap-2">
805
+ <span className="w-16 text-xs text-white/60">Bounce:</span>
806
+ <Skeleton className="h-4 flex-1 animate-bounce" />
807
+ </div>
808
+ <div className="flex items-center gap-2">
809
+ <span className="w-16 text-xs text-white/60">Ping:</span>
810
+ <Skeleton className="h-4 flex-1 animate-ping" />
811
+ </div>
812
+ <div className="flex items-center gap-2">
813
+ <span className="w-16 text-xs text-white/60">None:</span>
814
+ <Skeleton className="h-4 flex-1 animate-none" />
815
+ </div>
816
+ </div>
817
+ </div>
818
+
819
+ {/* Complex layouts */}
820
+ <div className="space-y-4 md:col-span-2">
821
+ <h4 className="text-sm font-medium text-white/70">Complex Layout</h4>
822
+ <div className="grid grid-cols-12 gap-4">
823
+ <div className="col-span-2">
824
+ <Skeleton className="h-12 w-full rounded-full" />
825
+ </div>
826
+ <div className="col-span-8 space-y-2">
827
+ <Skeleton className="h-3 w-full" />
828
+ <Skeleton className="h-3 w-3/4" />
829
+ <Skeleton className="h-3 w-1/2" />
830
+ </div>
831
+ <div className="col-span-2">
832
+ <Skeleton className="h-12 w-full" />
833
+ </div>
834
+ </div>
835
+ </div>
836
+
837
+ {/* Gradient skeletons */}
838
+ <div className="space-y-4 md:col-span-2">
839
+ <h4 className="text-sm font-medium text-white/70">
840
+ Gradient Backgrounds
841
+ </h4>
842
+ <div className="space-y-3">
843
+ <Skeleton className="h-4 w-full bg-gradient-to-r from-blue-500/20 to-purple-500/20" />
844
+ <Skeleton className="h-4 w-3/4 bg-gradient-to-r from-green-500/20 to-blue-500/20" />
845
+ <Skeleton className="h-4 w-1/2 bg-gradient-to-r from-pink-500/20 to-yellow-500/20" />
846
+ </div>
847
+ </div>
848
+ </div>
849
+ </div>
850
+ ),
851
+ parameters: {
852
+ docs: {
853
+ description: {
854
+ story:
855
+ "Custom styling options for skeleton components including different colors, animations, gradient backgrounds, and complex layouts.",
856
+ },
857
+ },
858
+ },
859
+ }