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,1239 @@
1
+ import React from "react"
2
+ import type { Meta, StoryObj } from "@storybook/react"
3
+
4
+ import { GripVerticalIcon } from "."
5
+
6
+ const meta: Meta<typeof GripVerticalIcon> = {
7
+ title: "Icons/GripVerticalIcon",
8
+ component: GripVerticalIcon,
9
+ parameters: {
10
+ layout: "fullscreen",
11
+ backgrounds: {
12
+ default: "dark",
13
+ values: [
14
+ { name: "dark", value: "#0a0a0a" },
15
+ { name: "darker", value: "#000000" },
16
+ { name: "light", value: "#ffffff" },
17
+ ],
18
+ },
19
+ docs: {
20
+ page: () => (
21
+ <>
22
+ {/* Override default docs styling */}
23
+ <style>
24
+ {`
25
+ .sbdocs-wrapper {
26
+ padding: 0 ;
27
+ max-width: none ;
28
+ background: transparent ;
29
+ }
30
+ .sbdocs-content {
31
+ max-width: none ;
32
+ padding: 0 ;
33
+ margin: 0 ;
34
+ background: transparent ;
35
+ }
36
+ .docs-story {
37
+ background: transparent ;
38
+ }
39
+ .sbdocs {
40
+ background: transparent ;
41
+ }
42
+ body {
43
+ background: #0a0a0a ;
44
+ }
45
+ #storybook-docs {
46
+ background: #0a0a0a ;
47
+ }
48
+ .sbdocs-preview {
49
+ background: transparent ;
50
+ border: none ;
51
+ }
52
+ .sbdocs-h1, .sbdocs-h2, .sbdocs-h3, .sbdocs-h4, .sbdocs-h5, .sbdocs-h6 {
53
+ color: white ;
54
+ }
55
+ .sbdocs-p, .sbdocs-li {
56
+ color: rgba(255, 255, 255, 0.7) ;
57
+ }
58
+ .sbdocs-code {
59
+ background: rgba(255, 255, 255, 0.1) ;
60
+ color: rgba(168, 85, 247, 1) ;
61
+ border: 1px solid rgba(255, 255, 255, 0.1) ;
62
+ }
63
+ .sbdocs-pre {
64
+ background: rgba(0, 0, 0, 0.4) ;
65
+ border: 1px solid rgba(255, 255, 255, 0.1) ;
66
+ }
67
+ .sbdocs-table {
68
+ background: rgba(255, 255, 255, 0.05) ;
69
+ border: 1px solid rgba(255, 255, 255, 0.1) ;
70
+ }
71
+ .sbdocs-table th {
72
+ background: rgba(255, 255, 255, 0.05) ;
73
+ color: white ;
74
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1) ;
75
+ }
76
+ .sbdocs-table td {
77
+ color: rgba(255, 255, 255, 0.7) ;
78
+ border-bottom: 1px solid rgba(255, 255, 255, 0.05) ;
79
+ }
80
+ @keyframes wiggle {
81
+ 0%, 100% { transform: rotate(-3deg); }
82
+ 50% { transform: rotate(3deg); }
83
+ }
84
+ .animate-wiggle {
85
+ animation: wiggle 0.5s ease-in-out infinite;
86
+ }
87
+ `}
88
+ </style>
89
+
90
+ <div className="min-h-screen bg-gradient-to-br from-gray-900 via-purple-900/20 to-gray-900">
91
+ {/* Header */}
92
+ <div className="relative overflow-hidden border-b border-white/10 bg-black/20 backdrop-blur-xl">
93
+ <div className="absolute inset-0 bg-gradient-to-r from-gray-500/10 via-transparent to-blue-500/10" />
94
+ <div className="relative !mx-auto max-w-7xl px-6 py-16">
95
+ <div className="!space-y-6 text-center">
96
+ <div className="!mx-auto flex h-24 w-24 items-center justify-center rounded-2xl border border-gray-500/30 bg-gradient-to-br from-gray-500/20 to-blue-500/20">
97
+ <GripVerticalIcon className="h-12 w-12 text-gray-400" />
98
+ </div>
99
+ <h1 className="!text-fm-primary text-5xl font-bold">
100
+ GripVerticalIcon
101
+ </h1>
102
+ <p className="!mx-auto max-w-3xl text-xl leading-relaxed !text-white/70">
103
+ A versatile vertical grip icon featuring two columns of
104
+ three dots each, commonly used as a drag handle indicator
105
+ for vertical movement and reordering operations. Perfect for
106
+ sortable lists, draggable cards, and interactive elements.
107
+ Built with accessibility in mind using Radix UI's
108
+ AccessibleIcon wrapper.
109
+ </p>
110
+
111
+ {/* Stats */}
112
+ <div className="flex items-center justify-center gap-8 pt-8">
113
+ <div className="text-center">
114
+ <div className="text-3xl font-bold text-gray-300">
115
+ Draggable
116
+ </div>
117
+ <div className="text-sm text-white/60">
118
+ Vertical movement
119
+ </div>
120
+ </div>
121
+ <div className="h-8 w-px bg-white/20" />
122
+ <div className="text-center">
123
+ <div className="text-3xl font-bold text-blue-300">
124
+ Sortable
125
+ </div>
126
+ <div className="text-sm text-white/60">
127
+ Reordering controls
128
+ </div>
129
+ </div>
130
+ <div className="h-8 w-px bg-white/20" />
131
+ <div className="text-center">
132
+ <div className="text-3xl font-bold text-cyan-300">
133
+ Interactive
134
+ </div>
135
+ <div className="text-sm text-white/60">
136
+ Touch-friendly
137
+ </div>
138
+ </div>
139
+ </div>
140
+ </div>
141
+ </div>
142
+ </div>
143
+
144
+ {/* Content */}
145
+ <div className="!mx-auto max-w-7xl !space-y-16 px-6 py-12">
146
+ {/* Quick Usage */}
147
+ <div className="!space-y-8">
148
+ <h2 className="text-center text-3xl font-bold !text-white">
149
+ Quick Start
150
+ </h2>
151
+ <div className="grid grid-cols-1 gap-8 lg:grid-cols-2">
152
+ <div className="!space-y-4">
153
+ <h3 className="text-xl font-semibold !text-gray-300">
154
+ Basic Usage
155
+ </h3>
156
+ <div className="rounded-lg bg-black/40 p-4">
157
+ <pre className="overflow-x-auto text-sm !text-green-300">
158
+ {`import { GripVerticalIcon } from "@icons/grip-vertical-icon"
159
+
160
+ function SortableItem() {
161
+ return (
162
+ <div className="flex items-center gap-3 p-3">
163
+ <GripVerticalIcon className="h-4 w-4 text-gray-400 cursor-move " />
164
+ <span>Draggable List Item</span>
165
+ </div>
166
+ )
167
+ }`}
168
+ </pre>
169
+ </div>
170
+ </div>
171
+
172
+ <div className="!space-y-4">
173
+ <h3 className="text-xl font-semibold !text-gray-300">
174
+ Live Preview
175
+ </h3>
176
+ <div className="flex h-32 items-center justify-center rounded-lg border border-white/10 bg-white/5">
177
+ <div className="flex items-center gap-3 rounded-lg border border-gray-500/20 bg-gray-500/10 px-4 py-3">
178
+ <GripVerticalIcon className="h-4 w-4 cursor-move text-gray-400" />
179
+ <span className="text-white">Draggable List Item</span>
180
+ </div>
181
+ </div>
182
+ </div>
183
+ </div>
184
+ </div>
185
+
186
+ {/* Props Documentation */}
187
+ <div className="!space-y-8">
188
+ <h2 className="text-center text-3xl font-bold !text-white">
189
+ Props & Configuration
190
+ </h2>
191
+
192
+ <div className="overflow-hidden rounded-lg border border-white/10 bg-white/5">
193
+ <div className="bg-white/5 p-4">
194
+ <h3 className="text-xl font-semibold !text-white">Props</h3>
195
+ </div>
196
+ <table className="!my-0 w-full">
197
+ <thead className="bg-white/5">
198
+ <tr className="border-b border-white/10">
199
+ <th className="px-6 py-4 text-left text-sm font-semibold !text-white">
200
+ Prop
201
+ </th>
202
+ <th className="px-6 py-4 text-left text-sm font-semibold !text-white">
203
+ Type
204
+ </th>
205
+ <th className="px-6 py-4 text-left text-sm font-semibold !text-white">
206
+ Default
207
+ </th>
208
+ <th className="px-6 py-4 text-left text-sm font-semibold !text-white">
209
+ Description
210
+ </th>
211
+ </tr>
212
+ </thead>
213
+ <tbody>
214
+ <tr className="border-b border-white/5">
215
+ <td className="px-6 py-4 font-mono text-sm !text-gray-300">
216
+ width
217
+ </td>
218
+ <td className="px-6 py-4 text-sm !text-white/70">
219
+ number | string
220
+ </td>
221
+ <td className="px-6 py-4 text-sm !text-white/50">24</td>
222
+ <td className="px-6 py-4 text-sm !text-white/70">
223
+ Width of the icon in pixels
224
+ </td>
225
+ </tr>
226
+ <tr className="border-b border-white/5 !bg-black/10">
227
+ <td className="px-6 py-4 font-mono text-sm !text-gray-300">
228
+ height
229
+ </td>
230
+ <td className="px-6 py-4 text-sm !text-white/70">
231
+ number | string
232
+ </td>
233
+ <td className="px-6 py-4 text-sm !text-white/50">24</td>
234
+ <td className="px-6 py-4 text-sm !text-white/70">
235
+ Height of the icon in pixels
236
+ </td>
237
+ </tr>
238
+ <tr className="border-b border-white/5">
239
+ <td className="px-6 py-4 font-mono text-sm !text-gray-300">
240
+ stroke
241
+ </td>
242
+ <td className="px-6 py-4 text-sm !text-white/70">
243
+ string
244
+ </td>
245
+ <td className="px-6 py-4 text-sm !text-white/50">
246
+ currentColor
247
+ </td>
248
+ <td className="px-6 py-4 text-sm !text-white/70">
249
+ Stroke color of the dots
250
+ </td>
251
+ </tr>
252
+ <tr className="border-b border-white/5 !bg-black/10">
253
+ <td className="px-6 py-4 font-mono text-sm !text-gray-300">
254
+ strokeWidth
255
+ </td>
256
+ <td className="px-6 py-4 text-sm !text-white/70">
257
+ string | number
258
+ </td>
259
+ <td className="px-6 py-4 text-sm !text-white/50">2</td>
260
+ <td className="px-6 py-4 text-sm !text-white/70">
261
+ Stroke width of the dots
262
+ </td>
263
+ </tr>
264
+ <tr className="border-b border-white/5">
265
+ <td className="px-6 py-4 font-mono text-sm !text-gray-300">
266
+ fill
267
+ </td>
268
+ <td className="px-6 py-4 text-sm !text-white/70">
269
+ string
270
+ </td>
271
+ <td className="px-6 py-4 text-sm !text-white/50">
272
+ none
273
+ </td>
274
+ <td className="px-6 py-4 text-sm !text-white/70">
275
+ Fill color of the dots
276
+ </td>
277
+ </tr>
278
+ <tr className="border-b border-white/5 !bg-black/10">
279
+ <td className="px-6 py-4 font-mono text-sm !text-gray-300">
280
+ className
281
+ </td>
282
+ <td className="px-6 py-4 text-sm !text-white/70">
283
+ string
284
+ </td>
285
+ <td className="px-6 py-4 text-sm !text-white/50">-</td>
286
+ <td className="px-6 py-4 text-sm !text-white/70">
287
+ CSS classes for styling (use for overrides)
288
+ </td>
289
+ </tr>
290
+ <tr className="!bg-black/10">
291
+ <td className="px-6 py-4 font-mono text-sm !text-gray-300">
292
+ ...svgProps
293
+ </td>
294
+ <td className="px-6 py-4 text-sm !text-white/70">
295
+ SVGProps
296
+ </td>
297
+ <td className="px-6 py-4 text-sm !text-white/50">-</td>
298
+ <td className="px-6 py-4 text-sm !text-white/70">
299
+ All standard SVG element props
300
+ </td>
301
+ </tr>
302
+ </tbody>
303
+ </table>
304
+ </div>
305
+ </div>
306
+
307
+ {/* Size Variations */}
308
+ <div className="!space-y-8">
309
+ <h2 className="text-center text-3xl font-bold !text-white">
310
+ Size Variations
311
+ </h2>
312
+ <div className="rounded-lg border border-white/10 bg-white/5 p-8">
313
+ <div className="!space-y-6">
314
+ <div className="grid grid-cols-1 gap-8 md:grid-cols-2">
315
+ <div className="!space-y-4">
316
+ <h3 className="text-lg font-semibold !text-gray-300">
317
+ Standard Sizes
318
+ </h3>
319
+ <div className="flex items-end gap-6 rounded-lg bg-black/20 p-6">
320
+ <div className="text-center">
321
+ <GripVerticalIcon className="!mx-auto mb-2 h-3 w-3 text-gray-400" />
322
+ <span className="text-xs text-white/60">12px</span>
323
+ </div>
324
+ <div className="text-center">
325
+ <GripVerticalIcon className="!mx-auto mb-2 h-4 w-4 text-gray-400" />
326
+ <span className="text-xs text-white/60">16px</span>
327
+ </div>
328
+ <div className="text-center">
329
+ <GripVerticalIcon className="!mx-auto mb-2 h-5 w-5 text-gray-400" />
330
+ <span className="text-xs text-white/60">20px</span>
331
+ </div>
332
+ <div className="text-center">
333
+ <GripVerticalIcon className="!mx-auto mb-2 h-6 w-6 text-gray-400" />
334
+ <span className="text-xs text-white/60">24px</span>
335
+ </div>
336
+ <div className="text-center">
337
+ <GripVerticalIcon className="!mx-auto mb-2 h-8 w-8 text-gray-400" />
338
+ <span className="text-xs text-white/60">32px</span>
339
+ </div>
340
+ <div className="text-center">
341
+ <GripVerticalIcon className="!mx-auto mb-2 h-12 w-12 text-gray-400" />
342
+ <span className="text-xs text-white/60">48px</span>
343
+ </div>
344
+ </div>
345
+ </div>
346
+
347
+ <div className="!space-y-4">
348
+ <h3 className="text-lg font-semibold !text-gray-300">
349
+ Code Example
350
+ </h3>
351
+ <div className="rounded-lg bg-black/40 p-4">
352
+ <pre className="overflow-x-auto text-sm !text-cyan-300">
353
+ {`// Small (16px)
354
+ <GripVerticalIcon className="h-4 w-4 " />
355
+
356
+ // Medium (24px)
357
+ <GripVerticalIcon className="h-6 w-6 " />
358
+
359
+ // Large (32px)
360
+ <GripVerticalIcon className="h-8 w-8 " />
361
+
362
+ // Custom size with cursor
363
+ <GripVerticalIcon
364
+ width={40}
365
+ height={40}
366
+ className="cursor-move "
367
+ />`}
368
+ </pre>
369
+ </div>
370
+ </div>
371
+ </div>
372
+ </div>
373
+ </div>
374
+ </div>
375
+
376
+ {/* Color Variations */}
377
+ <div className="!space-y-8">
378
+ <h2 className="text-center text-3xl font-bold !text-white">
379
+ Color Variations
380
+ </h2>
381
+ <div className="grid grid-cols-1 gap-8 lg:grid-cols-2">
382
+ <div className="!space-y-4">
383
+ <h3 className="text-lg font-semibold !text-gray-300">
384
+ Semantic Colors
385
+ </h3>
386
+ <div className="!space-y-4 rounded-lg border border-white/10 bg-white/5 p-6">
387
+ <div className="flex items-center gap-4">
388
+ <GripVerticalIcon className="h-6 w-6 text-gray-400" />
389
+ <div>
390
+ <div className="text-sm font-medium text-white">
391
+ Default
392
+ </div>
393
+ <div className="text-xs text-white/60">
394
+ text-gray-400
395
+ </div>
396
+ </div>
397
+ </div>
398
+ <div className="flex items-center gap-4">
399
+ <GripVerticalIcon className="h-6 w-6 text-white/50" />
400
+ <div>
401
+ <div className="text-sm font-medium text-white">
402
+ Muted
403
+ </div>
404
+ <div className="text-xs text-white/60">
405
+ text-white/50
406
+ </div>
407
+ </div>
408
+ </div>
409
+ <div className="flex items-center gap-4">
410
+ <GripVerticalIcon className="h-6 w-6 text-blue-400" />
411
+ <div>
412
+ <div className="text-sm font-medium text-white">
413
+ Primary
414
+ </div>
415
+ <div className="text-xs text-white/60">
416
+ text-blue-400
417
+ </div>
418
+ </div>
419
+ </div>
420
+ <div className="flex items-center gap-4">
421
+ <GripVerticalIcon className="h-6 w-6 text-white/30" />
422
+ <div>
423
+ <div className="text-sm font-medium text-white">
424
+ Disabled
425
+ </div>
426
+ <div className="text-xs text-white/60">
427
+ text-white/30
428
+ </div>
429
+ </div>
430
+ </div>
431
+ </div>
432
+ </div>
433
+
434
+ <div className="!space-y-4">
435
+ <h3 className="text-lg font-semibold !text-gray-300">
436
+ Custom Colors
437
+ </h3>
438
+ <div className="rounded-lg bg-black/40 p-4">
439
+ <pre className="overflow-x-auto text-sm !text-green-300">
440
+ {`// Using Tailwind classes with
441
+ <GripVerticalIcon className="h-6 w-6 text-gray-400 " />
442
+ <GripVerticalIcon className="h-6 w-6 text-blue-500 " />
443
+
444
+ // Using CSS custom properties
445
+ <GripVerticalIcon
446
+ className="h-6 w-6 "
447
+ style={{ color: 'var(--color-primary)' }}
448
+ />
449
+
450
+ // Direct stroke prop for filled variant
451
+ <GripVerticalIcon
452
+ width={24}
453
+ height={24}
454
+ stroke="#6b7280"
455
+ fill="currentColor"
456
+ />`}
457
+ </pre>
458
+ </div>
459
+ </div>
460
+ </div>
461
+ </div>
462
+
463
+ {/* Usage Examples */}
464
+ <div className="!space-y-8">
465
+ <h2 className="text-center text-3xl font-bold !text-white">
466
+ Usage Examples
467
+ </h2>
468
+
469
+ <div className="grid grid-cols-1 gap-8 lg:grid-cols-2">
470
+ {/* Sortable List */}
471
+ <div className="!space-y-4">
472
+ <h3 className="text-lg font-semibold !text-gray-300">
473
+ Sortable List
474
+ </h3>
475
+ <div className="!space-y-4">
476
+ <div className="rounded-lg border border-white/10 bg-white/5 p-4">
477
+ <div className="!space-y-2">
478
+ {[
479
+ "First Task",
480
+ "Second Task",
481
+ "Third Task",
482
+ "Fourth Task",
483
+ ].map((task, index) => (
484
+ <div
485
+ key={index}
486
+ className="flex items-center gap-3 rounded border border-white/10 bg-white/5 p-3 transition-colors hover:bg-white/10"
487
+ >
488
+ <GripVerticalIcon className="h-4 w-4 cursor-move text-white/40 transition-colors hover:text-white/70" />
489
+ <span className="flex-1 text-sm text-white">
490
+ {task}
491
+ </span>
492
+ <span className="text-xs text-white/40">
493
+ #{index + 1}
494
+ </span>
495
+ </div>
496
+ ))}
497
+ </div>
498
+ </div>
499
+ <div className="rounded-lg bg-black/40 p-4">
500
+ <pre className="overflow-x-auto text-sm !text-green-300">
501
+ {`// Sortable list item
502
+ <div className="flex items-center gap-3 p-3 border border-white/10 bg-white/5 rounded hover:bg-white/10 transition-colors">
503
+ <GripVerticalIcon className="h-4 w-4 cursor-move text-white/40 hover:text-white/70 transition-colors " />
504
+ <span className="flex-1 text-sm text-white">First Task</span>
505
+ <span className="text-xs text-white/40">#1</span>
506
+ </div>`}
507
+ </pre>
508
+ </div>
509
+ </div>
510
+ </div>
511
+
512
+ {/* Draggable Cards */}
513
+ <div className="!space-y-4">
514
+ <h3 className="text-lg font-semibold !text-gray-300">
515
+ Draggable Cards
516
+ </h3>
517
+ <div className="!space-y-4">
518
+ <div className="grid grid-cols-1 gap-4">
519
+ {["Project Alpha", "Project Beta", "Project Gamma"].map(
520
+ (project, index) => (
521
+ <div
522
+ key={index}
523
+ className="relative rounded-lg border border-white/10 bg-white/5 p-4 transition-colors hover:bg-white/10"
524
+ >
525
+ <div className="absolute top-3 right-3">
526
+ <GripVerticalIcon className="h-4 w-4 cursor-move text-white/30 transition-colors hover:text-white/60" />
527
+ </div>
528
+ <h5 className="mb-2 text-sm font-medium !text-white">
529
+ {project}
530
+ </h5>
531
+ <p className="text-xs !text-white/60">
532
+ Drag to reorder this card
533
+ </p>
534
+ <div className="mt-3 flex gap-2">
535
+ <div className="h-2 w-2 rounded-full bg-green-400"></div>
536
+ <div className="h-2 w-2 rounded-full bg-yellow-400"></div>
537
+ <div className="h-2 w-2 rounded-full bg-red-400"></div>
538
+ </div>
539
+ </div>
540
+ )
541
+ )}
542
+ </div>
543
+ <div className="rounded-lg bg-black/40 p-4">
544
+ <pre className="overflow-x-auto text-sm !text-green-300">
545
+ {`// Draggable card
546
+ <div className="relative border border-white/10 bg-white/5 p-4 rounded-lg hover:bg-white/10 transition-colors">
547
+ <div className="absolute top-3 right-3">
548
+ <GripVerticalIcon className="h-4 w-4 cursor-move text-white/30 hover:text-white/60 transition-colors " />
549
+ </div>
550
+ <h5 className="mb-2 text-sm font-medium text-white">Project Alpha</h5>
551
+ <p className="text-xs text-white/60">Drag to reorder this card</p>
552
+ </div>`}
553
+ </pre>
554
+ </div>
555
+ </div>
556
+ </div>
557
+
558
+ {/* Table Rows */}
559
+ <div className="!space-y-4">
560
+ <h3 className="text-lg font-semibold !text-gray-300">
561
+ Sortable Table Rows
562
+ </h3>
563
+ <div className="!space-y-4">
564
+ <div className="overflow-hidden rounded-lg border border-white/10 bg-white/5">
565
+ <div className="grid grid-cols-12 gap-4 border-b border-white/10 bg-white/5 p-3">
566
+ <div className="col-span-1"></div>
567
+ <div className="col-span-4 text-xs font-medium text-white/70">
568
+ Name
569
+ </div>
570
+ <div className="col-span-3 text-xs font-medium text-white/70">
571
+ Status
572
+ </div>
573
+ <div className="col-span-2 text-xs font-medium text-white/70">
574
+ Priority
575
+ </div>
576
+ <div className="col-span-2 text-xs font-medium text-white/70">
577
+ Date
578
+ </div>
579
+ </div>
580
+ {[
581
+ {
582
+ name: "User Interface Design",
583
+ status: "In Progress",
584
+ priority: "High",
585
+ date: "2024-03-15",
586
+ },
587
+ {
588
+ name: "Backend Development",
589
+ status: "Pending",
590
+ priority: "Medium",
591
+ date: "2024-03-20",
592
+ },
593
+ {
594
+ name: "Testing & QA",
595
+ status: "Not Started",
596
+ priority: "Low",
597
+ date: "2024-03-25",
598
+ },
599
+ ].map((row, index) => (
600
+ <div
601
+ key={index}
602
+ className="grid grid-cols-12 gap-4 border-b border-white/10 p-3 transition-colors hover:bg-white/5"
603
+ >
604
+ <div className="col-span-1 flex items-center">
605
+ <GripVerticalIcon className="h-4 w-4 cursor-move text-white/30 transition-colors hover:text-white/60" />
606
+ </div>
607
+ <div className="col-span-4 text-sm text-white">
608
+ {row.name}
609
+ </div>
610
+ <div className="col-span-3 text-sm text-white/70">
611
+ {row.status}
612
+ </div>
613
+ <div className="col-span-2 text-sm text-white/70">
614
+ {row.priority}
615
+ </div>
616
+ <div className="col-span-2 text-sm text-white/70">
617
+ {row.date}
618
+ </div>
619
+ </div>
620
+ ))}
621
+ </div>
622
+ <div className="rounded-lg bg-black/40 p-4">
623
+ <pre className="overflow-x-auto text-sm !text-green-300">
624
+ {`// Table row with drag handle
625
+ <div className="grid grid-cols-12 gap-4 p-3 border-b border-white/10 hover:bg-white/5 transition-colors">
626
+ <div className="col-span-1 flex items-center">
627
+ <GripVerticalIcon className="h-4 w-4 cursor-move text-white/30 hover:text-white/60 transition-colors " />
628
+ </div>
629
+ <div className="col-span-4 text-sm text-white">User Interface Design</div>
630
+ <div className="col-span-3 text-sm text-white/70">In Progress</div>
631
+ <div className="col-span-2 text-sm text-white/70">High</div>
632
+ <div className="col-span-2 text-sm text-white/70">2024-03-15</div>
633
+ </div>`}
634
+ </pre>
635
+ </div>
636
+ </div>
637
+ </div>
638
+
639
+ {/* Menu Items */}
640
+ <div className="!space-y-4">
641
+ <h3 className="text-lg font-semibold !text-gray-300">
642
+ Reorderable Menu
643
+ </h3>
644
+ <div className="!space-y-4">
645
+ <div className="max-w-xs rounded-lg border border-white/10 bg-white/5 p-2">
646
+ {[
647
+ "Dashboard",
648
+ "Projects",
649
+ "Team",
650
+ "Settings",
651
+ "Help",
652
+ ].map((item, index) => (
653
+ <div
654
+ key={index}
655
+ className="flex cursor-pointer items-center gap-3 rounded p-2 transition-colors hover:bg-white/10"
656
+ >
657
+ <GripVerticalIcon className="h-3 w-3 cursor-move text-white/30" />
658
+ <span className="flex-1 text-sm text-white">
659
+ {item}
660
+ </span>
661
+ <span className="text-xs text-white/40">
662
+ ⌘{index + 1}
663
+ </span>
664
+ </div>
665
+ ))}
666
+ </div>
667
+ <div className="rounded-lg bg-black/40 p-4">
668
+ <pre className="overflow-x-auto text-sm !text-green-300">
669
+ {`// Menu item with drag handle
670
+ <div className="flex items-center gap-3 p-2 rounded hover:bg-white/10 transition-colors cursor-pointer">
671
+ <GripVerticalIcon className="h-3 w-3 cursor-move text-white/30 " />
672
+ <span className="flex-1 text-sm text-white">Dashboard</span>
673
+ <span className="text-xs text-white/40">⌘1</span>
674
+ </div>`}
675
+ </pre>
676
+ </div>
677
+ </div>
678
+ </div>
679
+ </div>
680
+ </div>
681
+
682
+ {/* Interactive States */}
683
+ <div className="!space-y-8">
684
+ <h2 className="text-center text-3xl font-bold !text-white">
685
+ Interactive States & Animations
686
+ </h2>
687
+ <div className="grid grid-cols-1 gap-8 lg:grid-cols-2">
688
+ <div className="!space-y-4">
689
+ <h3 className="text-lg font-semibold !text-gray-300">
690
+ Hover & Focus States
691
+ </h3>
692
+ <div className="!space-y-4 rounded-lg border border-white/10 bg-white/5 p-6">
693
+ <div className="flex items-center gap-4">
694
+ <GripVerticalIcon className="h-6 w-6 text-white/60 transition-colors hover:text-white" />
695
+ <div>
696
+ <div className="text-sm font-medium text-white">
697
+ Color Change
698
+ </div>
699
+ <div className="text-xs text-white/60">
700
+ hover:text-white
701
+ </div>
702
+ </div>
703
+ </div>
704
+ <div className="flex items-center gap-4">
705
+ <GripVerticalIcon className="h-6 w-6 text-white transition-transform hover:scale-110" />
706
+ <div>
707
+ <div className="text-sm font-medium text-white">
708
+ Scale Effect
709
+ </div>
710
+ <div className="text-xs text-white/60">
711
+ hover:scale-110
712
+ </div>
713
+ </div>
714
+ </div>
715
+ <div className="flex items-center gap-4">
716
+ <div
717
+ className="rounded p-2 focus:ring-2 focus:ring-blue-500 focus:outline-none"
718
+ tabIndex={0}
719
+ >
720
+ <GripVerticalIcon className="h-6 w-6 text-white" />
721
+ </div>
722
+ <div>
723
+ <div className="text-sm font-medium text-white">
724
+ Focus Ring
725
+ </div>
726
+ <div className="text-xs text-white/60">
727
+ focus:ring-2
728
+ </div>
729
+ </div>
730
+ </div>
731
+ <div className="flex items-center gap-4">
732
+ <GripVerticalIcon className="animate-wiggle h-6 w-6 text-purple-400" />
733
+ <div>
734
+ <div className="text-sm font-medium text-white">
735
+ Wiggle Animation
736
+ </div>
737
+ <div className="text-xs text-white/60">
738
+ Custom animation
739
+ </div>
740
+ </div>
741
+ </div>
742
+ </div>
743
+ </div>
744
+
745
+ <div className="!space-y-4">
746
+ <h3 className="text-lg font-semibold !text-gray-300">
747
+ Cursor Styles
748
+ </h3>
749
+ <div className="rounded-lg bg-black/40 p-4">
750
+ <pre className="overflow-x-auto text-sm !text-cyan-300">
751
+ {`// Different cursor styles for grip icons
752
+ <GripVerticalIcon className="h-6 w-6 cursor-move " />
753
+ <GripVerticalIcon className="h-6 w-6 cursor-grab hover:cursor-grabbing " />
754
+ <GripVerticalIcon className="h-6 w-6 cursor-ns-resize " />
755
+
756
+ // With interactive feedback
757
+ <GripVerticalIcon className="h-6 w-6 text-white/60 hover:text-white transition-colors cursor-move " />
758
+
759
+ // Wiggle animation keyframes
760
+ @keyframes wiggle {
761
+ 0%, 100% { transform: rotate(-3deg); }
762
+ 50% { transform: rotate(3deg); }
763
+ }
764
+
765
+ .animate-wiggle {
766
+ animation: wiggle 0.5s ease-in-out infinite;
767
+ }`}
768
+ </pre>
769
+ </div>
770
+ </div>
771
+ </div>
772
+ </div>
773
+
774
+ {/* Accessibility */}
775
+ <div className="!space-y-8">
776
+ <h2 className="text-center text-3xl font-bold !text-white">
777
+ Accessibility Features
778
+ </h2>
779
+ <div className="grid grid-cols-1 gap-8 md:grid-cols-2">
780
+ <div className="!space-y-4 rounded-lg border border-white/10 bg-white/5 p-6">
781
+ <h3 className="text-lg font-semibold !text-green-300">
782
+ ✅ Built-in Features
783
+ </h3>
784
+ <ul className="!space-y-2 text-sm !text-white/70">
785
+ <li className="!text-white/70">
786
+ Uses Radix UI AccessibleIcon wrapper
787
+ </li>
788
+ <li className="!text-white/70">
789
+ Provides screen reader label "Grip Vertical icon"
790
+ </li>
791
+ <li className="!text-white/70">
792
+ Supports keyboard navigation when interactive
793
+ </li>
794
+ <li className="!text-white/70">
795
+ Maintains proper color contrast ratios
796
+ </li>
797
+ <li className="!text-white/70">
798
+ Scales with user's font size preferences
799
+ </li>
800
+ </ul>
801
+ </div>
802
+
803
+ <div className="!space-y-4 rounded-lg border border-white/10 bg-white/5 p-6">
804
+ <h3 className="text-lg font-semibold !text-gray-300">
805
+ 💡 Best Practices
806
+ </h3>
807
+ <ul className="!space-y-2 text-sm text-white/70">
808
+ <li className="!text-white/70">
809
+ Always wrap in focusable elements (button, div with
810
+ tabIndex)
811
+ </li>
812
+ <li className="!text-white/70">
813
+ Provide clear ARIA labels explaining drag functionality
814
+ </li>
815
+ <li className="!text-white/70">
816
+ Include keyboard instructions for reordering
817
+ </li>
818
+ <li className="!text-white/70">
819
+ Use appropriate cursor styles (cursor-move, cursor-grab)
820
+ </li>
821
+ <li className="!text-white/70">
822
+ Ensure sufficient touch target size (minimum 44px)
823
+ </li>
824
+ </ul>
825
+ </div>
826
+ </div>
827
+
828
+ <div className="rounded-lg border border-white/10 bg-white/5 p-6">
829
+ <h3 className="mb-4 text-lg font-semibold !text-purple-300">
830
+ Proper ARIA Implementation
831
+ </h3>
832
+ <div className="grid grid-cols-1 gap-6 lg:grid-cols-2">
833
+ <div className="rounded-lg bg-black/40 p-4">
834
+ <pre className="overflow-x-auto text-sm !text-cyan-300">
835
+ {`// Keyboard accessible drag handle
836
+ <button
837
+ aria-label="Reorder item - use arrow keys to move"
838
+ className="p-2 rounded focus:ring-2 focus:ring-blue-500 focus:outline-none"
839
+ tabIndex={0}
840
+ onKeyDown={(e) => {
841
+ if (e.key === 'ArrowUp') handleMoveUp()
842
+ if (e.key === 'ArrowDown') handleMoveDown()
843
+ }}
844
+ >
845
+ <GripVerticalIcon className="h-4 w-4 text-gray-400 " />
846
+ </button>
847
+
848
+ // Sortable list with instructions
849
+ <div
850
+ role="list"
851
+ aria-describedby="sort-instructions"
852
+ >
853
+ {/* List items */}
854
+ </div>
855
+ <div id="sort-instructions" className="sr-only">
856
+ Use arrow keys to reorder items, or drag with mouse
857
+ </div>`}
858
+ </pre>
859
+ </div>
860
+ <div className="!space-y-4">
861
+ <p className="text-sm !text-white/70">
862
+ When using GripVerticalIcon for interactive reordering,
863
+ provide keyboard alternatives and clear instructions for
864
+ screen reader users.
865
+ </p>
866
+ <div className="rounded-lg border border-gray-500/20 bg-gray-500/10 p-4">
867
+ <div className="flex items-center gap-2 text-sm text-gray-200">
868
+ <GripVerticalIcon className="h-4 w-4" />
869
+ <span>
870
+ Screen readers announce "Grip Vertical icon" for
871
+ context
872
+ </span>
873
+ </div>
874
+ </div>
875
+ </div>
876
+ </div>
877
+ </div>
878
+ </div>
879
+
880
+ {/* Related Icons */}
881
+ <div className="!space-y-8">
882
+ <h2 className="text-center text-3xl font-bold !text-white">
883
+ Related Icons
884
+ </h2>
885
+ <div className="grid grid-cols-2 gap-6 md:grid-cols-4">
886
+ <div className="!space-y-3 rounded-lg border border-white/10 bg-white/5 p-4 text-center">
887
+ <div className="!mx-auto flex h-12 w-12 items-center justify-center rounded-lg bg-gray-500/20">
888
+ <span className="!text-2xl !text-white">⋮⋮</span>
889
+ </div>
890
+ <div>
891
+ <div className="font-medium text-white">
892
+ GripHorizontalIcon
893
+ </div>
894
+ <div className="text-xs text-white/60">
895
+ Horizontal movement
896
+ </div>
897
+ </div>
898
+ </div>
899
+ <div className="!space-y-3 rounded-lg border border-white/10 bg-white/5 p-4 text-center">
900
+ <div className="!mx-auto flex h-12 w-12 items-center justify-center rounded-lg bg-blue-500/20">
901
+ <span className="text-2xl">↕️</span>
902
+ </div>
903
+ <div>
904
+ <div className="font-medium text-white">MoveIcon</div>
905
+ <div className="text-xs text-white/60">
906
+ All directions
907
+ </div>
908
+ </div>
909
+ </div>
910
+ <div className="!space-y-3 rounded-lg border border-white/10 bg-white/5 p-4 text-center">
911
+ <div className="!mx-auto flex h-12 w-12 items-center justify-center rounded-lg bg-green-500/20">
912
+ <span className="text-2xl">⤴️</span>
913
+ </div>
914
+ <div>
915
+ <div className="font-medium text-white">DragIcon</div>
916
+ <div className="text-xs text-white/60">
917
+ Drag operations
918
+ </div>
919
+ </div>
920
+ </div>
921
+ <div className="!space-y-3 rounded-lg border border-white/10 bg-white/5 p-4 text-center">
922
+ <div className="!mx-auto flex h-12 w-12 items-center justify-center rounded-lg bg-purple-500/20">
923
+ <span className="text-2xl">⚡</span>
924
+ </div>
925
+ <div>
926
+ <div className="font-medium text-white">SortIcon</div>
927
+ <div className="text-xs text-white/60">
928
+ Sorting controls
929
+ </div>
930
+ </div>
931
+ </div>
932
+ </div>
933
+ </div>
934
+ </div>
935
+
936
+ {/* Footer */}
937
+ <div className="border-t border-white/10 bg-black/20 backdrop-blur-xl">
938
+ <div className="!mx-auto max-w-7xl px-6 py-8">
939
+ <div className="!space-y-4 text-center">
940
+ <p className="!text-white/60">
941
+ GripVerticalIcon is part of the Aural UI icon library, built
942
+ with drag-and-drop interactions and accessibility in mind.
943
+ </p>
944
+ <p className="text-sm !text-white/40">
945
+ All icons use Radix UI's AccessibleIcon for screen reader
946
+ compatibility and follow WCAG guidelines for interactive
947
+ elements.
948
+ </p>
949
+ </div>
950
+ </div>
951
+ </div>
952
+ </div>
953
+ </>
954
+ ),
955
+ },
956
+ },
957
+ tags: ["autodocs"],
958
+ argTypes: {
959
+ width: {
960
+ control: { type: "range", min: 8, max: 96, step: 2 },
961
+ description: "Width of the icon in pixels",
962
+ },
963
+ height: {
964
+ control: { type: "range", min: 8, max: 96, step: 2 },
965
+ description: "Height of the icon in pixels",
966
+ },
967
+ stroke: {
968
+ control: "color",
969
+ description: "Stroke color of the dots",
970
+ },
971
+ strokeWidth: {
972
+ control: { type: "range", min: 0.5, max: 4, step: 0.5 },
973
+ description: "Stroke width of the dots",
974
+ },
975
+ fill: {
976
+ control: "color",
977
+ description: "Fill color of the dots",
978
+ },
979
+ className: {
980
+ control: "text",
981
+ description: "CSS classes for styling (use for overrides)",
982
+ },
983
+ },
984
+ }
985
+
986
+ export default meta
987
+ type Story = StoryObj<typeof GripVerticalIcon>
988
+
989
+ // Story parameters for consistent dark theme
990
+ const storyParameters = {
991
+ backgrounds: {
992
+ default: "dark",
993
+ values: [
994
+ { name: "dark", value: "#0a0a0a" },
995
+ { name: "darker", value: "#000000" },
996
+ ],
997
+ },
998
+ }
999
+
1000
+ export const Default: Story = {
1001
+ args: {
1002
+ className: "h-6 w-6 text-gray-400 ",
1003
+ },
1004
+ parameters: storyParameters,
1005
+ render: (args) => (
1006
+ <div className="flex h-32 min-h-dvh items-center justify-center rounded-lg bg-gradient-to-br from-gray-900 to-gray-800">
1007
+ <GripVerticalIcon {...args} />
1008
+ </div>
1009
+ ),
1010
+ }
1011
+
1012
+ export const SizeVariations: Story = {
1013
+ parameters: {
1014
+ ...storyParameters,
1015
+ docs: {
1016
+ description: {
1017
+ story:
1018
+ "GripVerticalIcon in different sizes, from small UI elements to large drag handles.",
1019
+ },
1020
+ },
1021
+ },
1022
+ render: () => (
1023
+ <div className="flex h-64 min-h-dvh items-center justify-center gap-8 rounded-lg bg-gradient-to-br from-gray-900 to-gray-800 p-8">
1024
+ <div className="text-center">
1025
+ <GripVerticalIcon className="!mx-auto mb-2 h-3 w-3 text-gray-400" />
1026
+ <span className="text-xs text-white/60">12px</span>
1027
+ </div>
1028
+ <div className="text-center">
1029
+ <GripVerticalIcon className="!mx-auto mb-2 h-4 w-4 text-gray-400" />
1030
+ <span className="text-xs text-white/60">16px</span>
1031
+ </div>
1032
+ <div className="text-center">
1033
+ <GripVerticalIcon className="!mx-auto mb-2 h-5 w-5 text-gray-400" />
1034
+ <span className="text-xs text-white/60">20px</span>
1035
+ </div>
1036
+ <div className="text-center">
1037
+ <GripVerticalIcon className="!mx-auto mb-2 h-6 w-6 text-gray-400" />
1038
+ <span className="text-xs text-white/60">24px</span>
1039
+ </div>
1040
+ <div className="text-center">
1041
+ <GripVerticalIcon className="!mx-auto mb-2 h-8 w-8 text-gray-400" />
1042
+ <span className="text-xs text-white/60">32px</span>
1043
+ </div>
1044
+ <div className="text-center">
1045
+ <GripVerticalIcon className="!mx-auto mb-2 h-12 w-12 text-gray-400" />
1046
+ <span className="text-xs text-white/60">48px</span>
1047
+ </div>
1048
+ </div>
1049
+ ),
1050
+ }
1051
+
1052
+ export const ColorVariations: Story = {
1053
+ parameters: {
1054
+ ...storyParameters,
1055
+ docs: {
1056
+ description: {
1057
+ story:
1058
+ "GripVerticalIcon in different colors for various interaction states and contexts.",
1059
+ },
1060
+ },
1061
+ },
1062
+ render: () => (
1063
+ <div className="grid min-h-dvh grid-cols-2 items-center justify-center gap-6 rounded-lg bg-gradient-to-br from-gray-900 to-gray-800 p-8 md:grid-cols-4">
1064
+ <div className="text-center">
1065
+ <div className="!mx-auto mb-3 flex h-16 w-16 items-center justify-center rounded-lg border border-gray-500/30 bg-gray-500/20">
1066
+ <GripVerticalIcon className="h-8 w-8 text-gray-400" />
1067
+ </div>
1068
+ <div className="text-sm font-medium text-white">Default</div>
1069
+ <div className="text-xs text-gray-400">text-gray-400</div>
1070
+ </div>
1071
+ <div className="text-center">
1072
+ <div className="!mx-auto mb-3 flex h-16 w-16 items-center justify-center rounded-lg border border-white/30 bg-white/20">
1073
+ <GripVerticalIcon className="h-8 w-8 text-white/50" />
1074
+ </div>
1075
+ <div className="text-sm font-medium text-white">Muted</div>
1076
+ <div className="text-xs text-white/50">text-white/50</div>
1077
+ </div>
1078
+ <div className="text-center">
1079
+ <div className="!mx-auto mb-3 flex h-16 w-16 items-center justify-center rounded-lg border border-blue-500/30 bg-blue-500/20">
1080
+ <GripVerticalIcon className="h-8 w-8 text-blue-400" />
1081
+ </div>
1082
+ <div className="text-sm font-medium text-white">Primary</div>
1083
+ <div className="text-xs text-blue-400">text-blue-400</div>
1084
+ </div>
1085
+ <div className="text-center">
1086
+ <div className="!mx-auto mb-3 flex h-16 w-16 items-center justify-center rounded-lg border border-white/10 bg-white/5">
1087
+ <GripVerticalIcon className="h-8 w-8 text-white/30" />
1088
+ </div>
1089
+ <div className="text-sm font-medium text-white">Disabled</div>
1090
+ <div className="text-xs text-white/30">text-white/30</div>
1091
+ </div>
1092
+ </div>
1093
+ ),
1094
+ }
1095
+
1096
+ export const UsageExamples: Story = {
1097
+ parameters: {
1098
+ ...storyParameters,
1099
+ docs: {
1100
+ description: {
1101
+ story:
1102
+ "Real-world usage examples showing GripVerticalIcon in different drag-and-drop contexts.",
1103
+ },
1104
+ },
1105
+ },
1106
+ render: () => (
1107
+ <div className="min-h-dvh !space-y-8 rounded-lg bg-gradient-to-br from-gray-900 to-gray-800 p-8">
1108
+ {/* Sortable List */}
1109
+ <div className="!space-y-2">
1110
+ <h3 className="text-sm font-medium text-white">Sortable List</h3>
1111
+ <div className="rounded-lg border border-white/10 bg-white/5 p-4">
1112
+ <div className="!space-y-2">
1113
+ {["First Task", "Second Task", "Third Task"].map((task, index) => (
1114
+ <div
1115
+ key={index}
1116
+ className="flex items-center gap-3 rounded border border-white/10 bg-white/5 p-3 transition-colors hover:bg-white/10"
1117
+ >
1118
+ <GripVerticalIcon className="h-4 w-4 cursor-move text-white/40 transition-colors hover:text-white/70" />
1119
+ <span className="flex-1 text-sm text-white">{task}</span>
1120
+ <span className="text-xs text-white/40">#{index + 1}</span>
1121
+ </div>
1122
+ ))}
1123
+ </div>
1124
+ </div>
1125
+ </div>
1126
+
1127
+ {/* Draggable Cards */}
1128
+ <div className="!space-y-2">
1129
+ <h3 className="text-sm font-medium text-white">Draggable Cards</h3>
1130
+ <div className="grid grid-cols-1 gap-4 md:grid-cols-2">
1131
+ {["Project Alpha", "Project Beta"].map((project, index) => (
1132
+ <div
1133
+ key={index}
1134
+ className="relative rounded-lg border border-white/10 bg-white/5 p-4 transition-colors hover:bg-white/10"
1135
+ >
1136
+ <div className="absolute top-3 right-3">
1137
+ <GripVerticalIcon className="h-4 w-4 cursor-move text-white/30 transition-colors hover:text-white/60" />
1138
+ </div>
1139
+ <h5 className="mb-2 text-sm font-medium text-white">{project}</h5>
1140
+ <p className="text-xs text-white/60">Drag to reorder this card</p>
1141
+ </div>
1142
+ ))}
1143
+ </div>
1144
+ </div>
1145
+
1146
+ {/* Menu Items */}
1147
+ <div className="!space-y-2">
1148
+ <h3 className="text-sm font-medium text-white">Reorderable Menu</h3>
1149
+ <div className="max-w-xs rounded-lg border border-white/10 bg-white/5 p-2">
1150
+ {["Dashboard", "Projects", "Settings"].map((item, index) => (
1151
+ <div
1152
+ key={index}
1153
+ className="flex cursor-pointer items-center gap-3 rounded p-2 transition-colors hover:bg-white/10"
1154
+ >
1155
+ <GripVerticalIcon className="h-3 w-3 cursor-move text-white/30" />
1156
+ <span className="flex-1 text-sm text-white">{item}</span>
1157
+ </div>
1158
+ ))}
1159
+ </div>
1160
+ </div>
1161
+ </div>
1162
+ ),
1163
+ }
1164
+
1165
+ export const InteractiveStates: Story = {
1166
+ parameters: {
1167
+ ...storyParameters,
1168
+ docs: {
1169
+ description: {
1170
+ story:
1171
+ "Interactive states showing hover effects, animations, and cursor styles for the grip icon.",
1172
+ },
1173
+ },
1174
+ },
1175
+ render: () => (
1176
+ <div className="min-h-dvh !space-y-8 rounded-lg bg-gradient-to-br from-gray-900 to-gray-800 p-8">
1177
+ <div className="!space-y-4">
1178
+ <h3 className="text-sm font-medium text-white/70">Hover Effects</h3>
1179
+ <div className="flex gap-8">
1180
+ <div className="flex flex-col items-center gap-2">
1181
+ <GripVerticalIcon className="h-8 w-8 text-white/60 transition-colors hover:text-white" />
1182
+ <span className="text-xs text-white/60">Color Change</span>
1183
+ </div>
1184
+ <div className="flex flex-col items-center gap-2">
1185
+ <GripVerticalIcon className="h-8 w-8 text-white transition-transform hover:scale-110" />
1186
+ <span className="text-xs text-white/60">Scale Up</span>
1187
+ </div>
1188
+ <div className="flex flex-col items-center gap-2">
1189
+ <GripVerticalIcon className="animate-wiggle h-8 w-8 text-purple-400" />
1190
+ <span className="text-xs text-white/60">Wiggle Animation</span>
1191
+ </div>
1192
+ </div>
1193
+ </div>
1194
+
1195
+ <div className="!space-y-4">
1196
+ <h3 className="text-sm font-medium text-white/70">Cursor States</h3>
1197
+ <div className="flex gap-8">
1198
+ <div className="flex flex-col items-center gap-2">
1199
+ <GripVerticalIcon className="h-8 w-8 cursor-move text-white" />
1200
+ <span className="text-xs text-white/60">cursor-move</span>
1201
+ </div>
1202
+ <div className="flex flex-col items-center gap-2">
1203
+ <GripVerticalIcon className="h-8 w-8 cursor-grab text-white hover:cursor-grabbing" />
1204
+ <span className="text-xs text-white/60">cursor-grab</span>
1205
+ </div>
1206
+ <div className="flex flex-col items-center gap-2">
1207
+ <GripVerticalIcon className="h-8 w-8 cursor-ns-resize text-white" />
1208
+ <span className="text-xs text-white/60">cursor-ns-resize</span>
1209
+ </div>
1210
+ </div>
1211
+ </div>
1212
+ </div>
1213
+ ),
1214
+ }
1215
+
1216
+ export const Playground: Story = {
1217
+ parameters: {
1218
+ ...storyParameters,
1219
+ docs: {
1220
+ description: {
1221
+ story:
1222
+ "Interactive playground to experiment with different GripVerticalIcon configurations.",
1223
+ },
1224
+ },
1225
+ },
1226
+ args: {
1227
+ width: 32,
1228
+ height: 32,
1229
+ className: "text-gray-400 cursor-move ",
1230
+ strokeWidth: 2,
1231
+ },
1232
+ render: (args) => (
1233
+ <div className="flex h-64 min-h-dvh items-center justify-center rounded-lg bg-gradient-to-br from-gray-900 to-gray-800">
1234
+ <div className="rounded-lg border border-white/10 bg-white/5 p-8">
1235
+ <GripVerticalIcon {...args} />
1236
+ </div>
1237
+ </div>
1238
+ ),
1239
+ }