@mich8060/chg-design-system 0.1.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 (260) hide show
  1. package/.github/workflows/figma-sync.yml +30 -0
  2. package/ARCHITECTURE_FIX.md +241 -0
  3. package/LICENSE +21 -0
  4. package/README.lib.md +103 -0
  5. package/README.md +177 -0
  6. package/figma.config.json +9 -0
  7. package/package.json +67 -0
  8. package/package.lib.json +49 -0
  9. package/public/data/figma-variables.json +40026 -0
  10. package/public/favicon.ico +0 -0
  11. package/public/index.html +46 -0
  12. package/public/logo192.png +0 -0
  13. package/public/logo512.png +0 -0
  14. package/public/manifest.json +25 -0
  15. package/public/robots.txt +3 -0
  16. package/public/styles/tokens.css +1994 -0
  17. package/scripts/index.js +896 -0
  18. package/scripts/publish-lib.js +150 -0
  19. package/scripts/validate.js +94 -0
  20. package/src/App.css +457 -0
  21. package/src/App.css.map +1 -0
  22. package/src/App.js +161 -0
  23. package/src/App.scss +548 -0
  24. package/src/App.test.js +8 -0
  25. package/src/assets/images/.gitkeep +0 -0
  26. package/src/assets/images/doctors/Avatar-1.png +0 -0
  27. package/src/assets/images/doctors/Avatar-10.png +0 -0
  28. package/src/assets/images/doctors/Avatar-11.png +0 -0
  29. package/src/assets/images/doctors/Avatar-12.png +0 -0
  30. package/src/assets/images/doctors/Avatar-13.png +0 -0
  31. package/src/assets/images/doctors/Avatar-14.png +0 -0
  32. package/src/assets/images/doctors/Avatar-15.png +0 -0
  33. package/src/assets/images/doctors/Avatar-16.png +0 -0
  34. package/src/assets/images/doctors/Avatar-17.png +0 -0
  35. package/src/assets/images/doctors/Avatar-18.png +0 -0
  36. package/src/assets/images/doctors/Avatar-19.png +0 -0
  37. package/src/assets/images/doctors/Avatar-2.png +0 -0
  38. package/src/assets/images/doctors/Avatar-20.png +0 -0
  39. package/src/assets/images/doctors/Avatar-21.png +0 -0
  40. package/src/assets/images/doctors/Avatar-3.png +0 -0
  41. package/src/assets/images/doctors/Avatar-4.png +0 -0
  42. package/src/assets/images/doctors/Avatar-5.png +0 -0
  43. package/src/assets/images/doctors/Avatar-6.png +0 -0
  44. package/src/assets/images/doctors/Avatar-7.png +0 -0
  45. package/src/assets/images/doctors/Avatar-8.png +0 -0
  46. package/src/assets/images/doctors/Avatar-9.png +0 -0
  47. package/src/assets/images/doctors/Avatar.png +0 -0
  48. package/src/assets/images/doctors/index.js +141 -0
  49. package/src/data/figma-variables.json +90305 -0
  50. package/src/index.js +20 -0
  51. package/src/index.scss +10 -0
  52. package/src/pages/AccordionDemo.jsx +206 -0
  53. package/src/pages/AccordionDemo.scss +34 -0
  54. package/src/pages/ActionMenuDemo.jsx +957 -0
  55. package/src/pages/ActionMenuDemo.scss +34 -0
  56. package/src/pages/AvatarDemo.jsx +328 -0
  57. package/src/pages/AvatarDemo.scss +40 -0
  58. package/src/pages/BadgeDemo.jsx +254 -0
  59. package/src/pages/BadgeDemo.scss +40 -0
  60. package/src/pages/BorderRadiusDemo.jsx +112 -0
  61. package/src/pages/BorderRadiusDemo.scss +50 -0
  62. package/src/pages/BrandingDemo.jsx +117 -0
  63. package/src/pages/BreadcrumbDemo.jsx +172 -0
  64. package/src/pages/ButtonDemo.jsx +708 -0
  65. package/src/pages/ButtonDemo.scss +34 -0
  66. package/src/pages/CheckboxDemo.jsx +194 -0
  67. package/src/pages/ChipDemo.jsx +359 -0
  68. package/src/pages/ChipDemo.scss +40 -0
  69. package/src/pages/ColorsDemo.jsx +566 -0
  70. package/src/pages/ColorsDemo.scss +243 -0
  71. package/src/pages/ComponentsUsage.jsx +401 -0
  72. package/src/pages/DatepickerDemo.jsx +223 -0
  73. package/src/pages/DividerDemo.jsx +337 -0
  74. package/src/pages/DotStatusDemo.jsx +223 -0
  75. package/src/pages/DropdownDemo.jsx +229 -0
  76. package/src/pages/FieldDemo.jsx +253 -0
  77. package/src/pages/FigmaVariablesDemo.jsx +426 -0
  78. package/src/pages/FigmaVariablesDemo.scss +316 -0
  79. package/src/pages/FileUploadDemo.jsx +186 -0
  80. package/src/pages/FlexDemo.jsx +144 -0
  81. package/src/pages/FlexDemo.scss +119 -0
  82. package/src/pages/FontInstallation.jsx +252 -0
  83. package/src/pages/FontInstallation.scss +40 -0
  84. package/src/pages/Home.jsx +3156 -0
  85. package/src/pages/IconDemo.jsx +1680 -0
  86. package/src/pages/ImageAspectDemo.jsx +152 -0
  87. package/src/pages/InputDemo.jsx +245 -0
  88. package/src/pages/Installation.jsx +257 -0
  89. package/src/pages/Installation.scss +40 -0
  90. package/src/pages/KeyDemo.jsx +184 -0
  91. package/src/pages/MenuDemo.jsx +139 -0
  92. package/src/pages/MicroCalendarDemo.jsx +165 -0
  93. package/src/pages/PaginationDemo.jsx +176 -0
  94. package/src/pages/PillToggleDemo.jsx +212 -0
  95. package/src/pages/ProgressCircleDemo.jsx +206 -0
  96. package/src/pages/ProgressIndicatorDemo.jsx +227 -0
  97. package/src/pages/RadioDemo.jsx +282 -0
  98. package/src/pages/ShadowsDemo.jsx +118 -0
  99. package/src/pages/ShadowsDemo.scss +93 -0
  100. package/src/pages/SliderDemo.jsx +226 -0
  101. package/src/pages/SpacingDemo.jsx +160 -0
  102. package/src/pages/SpacingDemo.scss +107 -0
  103. package/src/pages/StatusDemo.jsx +196 -0
  104. package/src/pages/StepsDemo.jsx +308 -0
  105. package/src/pages/TableDemo.jsx +376 -0
  106. package/src/pages/TabsDemo.jsx +221 -0
  107. package/src/pages/ToastDemo.jsx +195 -0
  108. package/src/pages/ToggleDemo.jsx +187 -0
  109. package/src/pages/TokensDemo.jsx +637 -0
  110. package/src/pages/TokensDemo.scss +270 -0
  111. package/src/pages/TokensUsage.jsx +220 -0
  112. package/src/pages/TooltipDemo.jsx +170 -0
  113. package/src/pages/TypographyDemo.jsx +229 -0
  114. package/src/pages/TypographyDemo.scss +105 -0
  115. package/src/pages/UtilitiesDemo.jsx +381 -0
  116. package/src/pages/UtilitiesDemo.scss +214 -0
  117. package/src/reportWebVitals.js +13 -0
  118. package/src/setupTests.js +5 -0
  119. package/src/styles/_typography.scss +932 -0
  120. package/src/styles/_utilities.scss +3635 -0
  121. package/src/styles/_variables.scss +887 -0
  122. package/src/styles/prism-custom.css +206 -0
  123. package/src/styles/prism-custom.css.map +1 -0
  124. package/src/styles/prism-custom.scss +205 -0
  125. package/src/styles/tokens.css +4416 -0
  126. package/src/styles/tokens.css.map +1 -0
  127. package/src/styles/tokens.scss +1456 -0
  128. package/src/ui/Accordion/Accordion.jsx +70 -0
  129. package/src/ui/Accordion/Accordion.scss +82 -0
  130. package/src/ui/Accordion/index.js +1 -0
  131. package/src/ui/ActionMenu/ActionMenu.jsx +383 -0
  132. package/src/ui/ActionMenu/ActionMenu.scss +198 -0
  133. package/src/ui/ActionMenu/index.js +1 -0
  134. package/src/ui/Avatar/Avatar.jsx +49 -0
  135. package/src/ui/Avatar/Avatar.scss +82 -0
  136. package/src/ui/Avatar/index.js +1 -0
  137. package/src/ui/Badge/Badge.jsx +64 -0
  138. package/src/ui/Badge/Badge.scss +84 -0
  139. package/src/ui/Badge/index.js +1 -0
  140. package/src/ui/Branding/Branding.jsx +65 -0
  141. package/src/ui/Branding/Branding.scss +116 -0
  142. package/src/ui/Branding/index.js +1 -0
  143. package/src/ui/Breadcrumb/Breadcrumb.jsx +162 -0
  144. package/src/ui/Breadcrumb/Breadcrumb.scss +46 -0
  145. package/src/ui/Breadcrumb/index.js +2 -0
  146. package/src/ui/Button/Button.figma.tsx +49 -0
  147. package/src/ui/Button/Button.jsx +135 -0
  148. package/src/ui/Button/Button.scss +188 -0
  149. package/src/ui/Button/index.js +1 -0
  150. package/src/ui/Card/Card.jsx +25 -0
  151. package/src/ui/Card/Card.scss +47 -0
  152. package/src/ui/Card/index.js +1 -0
  153. package/src/ui/Checkbox/Checkbox.jsx +70 -0
  154. package/src/ui/Checkbox/Checkbox.scss +96 -0
  155. package/src/ui/Checkbox/index.js +1 -0
  156. package/src/ui/Chip/Chip.jsx +104 -0
  157. package/src/ui/Chip/Chip.scss +118 -0
  158. package/src/ui/Chip/index.js +1 -0
  159. package/src/ui/CopyButton/CopyButton.jsx +102 -0
  160. package/src/ui/CopyButton/CopyButton.scss +56 -0
  161. package/src/ui/CopyButton/index.js +1 -0
  162. package/src/ui/Datepicker/Datepicker.jsx +326 -0
  163. package/src/ui/Datepicker/Datepicker.scss +187 -0
  164. package/src/ui/Datepicker/index.js +2 -0
  165. package/src/ui/Divider/Divider.jsx +89 -0
  166. package/src/ui/Divider/Divider.scss +112 -0
  167. package/src/ui/Divider/index.js +1 -0
  168. package/src/ui/DotStatus/DotStatus.jsx +64 -0
  169. package/src/ui/DotStatus/DotStatus.scss +87 -0
  170. package/src/ui/DotStatus/index.js +1 -0
  171. package/src/ui/Dropdown/Dropdown.jsx +200 -0
  172. package/src/ui/Dropdown/Dropdown.scss +156 -0
  173. package/src/ui/Dropdown/index.js +1 -0
  174. package/src/ui/Field/Field.jsx +89 -0
  175. package/src/ui/Field/Field.scss +119 -0
  176. package/src/ui/Field/index.js +1 -0
  177. package/src/ui/FileUpload/FileUpload.figma.tsx +28 -0
  178. package/src/ui/FileUpload/FileUpload.jsx +153 -0
  179. package/src/ui/FileUpload/FileUpload.scss +78 -0
  180. package/src/ui/FileUpload/index.js +2 -0
  181. package/src/ui/Flex/Flex.jsx +42 -0
  182. package/src/ui/Flex/Flex.scss +119 -0
  183. package/src/ui/Flex/index.js +1 -0
  184. package/src/ui/Icon/Icon.figma.tsx +22 -0
  185. package/src/ui/Icon/Icon.jsx +47 -0
  186. package/src/ui/Icon/index.js +1 -0
  187. package/src/ui/ImageAspect/ImageAspect.jsx +56 -0
  188. package/src/ui/ImageAspect/ImageAspect.scss +62 -0
  189. package/src/ui/ImageAspect/index.js +1 -0
  190. package/src/ui/Input/Input.figma.tsx +35 -0
  191. package/src/ui/Input/Input.jsx +68 -0
  192. package/src/ui/Input/Input.scss +64 -0
  193. package/src/ui/Input/index.js +2 -0
  194. package/src/ui/Key/Key.jsx +37 -0
  195. package/src/ui/Key/Key.scss +34 -0
  196. package/src/ui/Key/index.js +1 -0
  197. package/src/ui/Menu/Menu.jsx +389 -0
  198. package/src/ui/Menu/Menu.scss +382 -0
  199. package/src/ui/Menu/index.js +1 -0
  200. package/src/ui/MicroCalendar/MicroCalendar.jsx +392 -0
  201. package/src/ui/MicroCalendar/MicroCalendar.scss +277 -0
  202. package/src/ui/MicroCalendar/index.js +1 -0
  203. package/src/ui/Pagination/Pagination.jsx +237 -0
  204. package/src/ui/Pagination/Pagination.scss +182 -0
  205. package/src/ui/Pagination/index.js +1 -0
  206. package/src/ui/PillToggle/PillToggle.jsx +56 -0
  207. package/src/ui/PillToggle/PillToggle.scss +84 -0
  208. package/src/ui/PillToggle/index.js +1 -0
  209. package/src/ui/Playground/Playground.jsx +524 -0
  210. package/src/ui/Playground/Playground.scss +310 -0
  211. package/src/ui/Playground/index.js +2 -0
  212. package/src/ui/ProgressCircle/ProgressCircle.jsx +147 -0
  213. package/src/ui/ProgressCircle/ProgressCircle.scss +143 -0
  214. package/src/ui/ProgressCircle/index.js +1 -0
  215. package/src/ui/ProgressIndicator/ProgressIndicator.jsx +92 -0
  216. package/src/ui/ProgressIndicator/ProgressIndicator.scss +133 -0
  217. package/src/ui/ProgressIndicator/index.js +1 -0
  218. package/src/ui/Radio/Radio.jsx +57 -0
  219. package/src/ui/Radio/Radio.scss +84 -0
  220. package/src/ui/Radio/index.js +1 -0
  221. package/src/ui/Slider/Slider.jsx +283 -0
  222. package/src/ui/Slider/Slider.scss +156 -0
  223. package/src/ui/Slider/index.js +1 -0
  224. package/src/ui/Status/Status.jsx +66 -0
  225. package/src/ui/Status/Status.scss +90 -0
  226. package/src/ui/Status/index.js +1 -0
  227. package/src/ui/Steps/Steps.jsx +201 -0
  228. package/src/ui/Steps/Steps.scss +240 -0
  229. package/src/ui/Steps/index.js +1 -0
  230. package/src/ui/Table/Table.jsx +143 -0
  231. package/src/ui/Table/Table.scss +90 -0
  232. package/src/ui/Table/index.js +1 -0
  233. package/src/ui/Tabs/TabItem.jsx +86 -0
  234. package/src/ui/Tabs/Tabs.figma.tsx +30 -0
  235. package/src/ui/Tabs/Tabs.jsx +318 -0
  236. package/src/ui/Tabs/Tabs.scss +164 -0
  237. package/src/ui/Tabs/Untitled +1 -0
  238. package/src/ui/Tabs/index.js +3 -0
  239. package/src/ui/Tag/Tag.figma.tsx +29 -0
  240. package/src/ui/Tag/Tag.jsx +93 -0
  241. package/src/ui/Tag/Tag.scss +229 -0
  242. package/src/ui/Tag/index.js +2 -0
  243. package/src/ui/Textarea/Textarea.figma.tsx +35 -0
  244. package/src/ui/Textarea/Textarea.jsx +68 -0
  245. package/src/ui/Textarea/Textarea.scss +69 -0
  246. package/src/ui/Textarea/index.js +2 -0
  247. package/src/ui/Toast/Toast.jsx +75 -0
  248. package/src/ui/Toast/Toast.scss +132 -0
  249. package/src/ui/Toast/index.js +2 -0
  250. package/src/ui/Toggle/Toggle.jsx +73 -0
  251. package/src/ui/Toggle/Toggle.scss +139 -0
  252. package/src/ui/Toggle/index.js +1 -0
  253. package/src/ui/Tooltip/Tooltip.figma.tsx +24 -0
  254. package/src/ui/Tooltip/Tooltip.jsx +123 -0
  255. package/src/ui/Tooltip/Tooltip.scss +80 -0
  256. package/src/ui/Tooltip/index.js +2 -0
  257. package/src/ui/index.js +63 -0
  258. package/src/utils/formatDate.js +27 -0
  259. package/src/utils/headerVariants.js +69 -0
  260. package/vite.config.lib.js +55 -0
@@ -0,0 +1,223 @@
1
+ import React, { useState } from "react";
2
+ import { Link } from "react-router-dom";
3
+ import DotStatus from "../ui/DotStatus/DotStatus";
4
+ import Flex from "../ui/Flex/Flex";
5
+ import Breadcrumb from "../ui/Breadcrumb/Breadcrumb";
6
+ import Divider from "../ui/Divider/Divider";
7
+ import { formatLastUpdated } from "../utils/formatDate";
8
+
9
+ /**
10
+ * Dot Status Component Demo & Documentation
11
+ *
12
+ * This page demonstrates the Dot Status component and its various configurations.
13
+ *
14
+ * ## Dot Status Component Props:
15
+ *
16
+ * ### Optional Props:
17
+ * - `variant` (string): Color variant
18
+ * - Options: 'light-gray', 'red', 'orange', 'yellow', 'light-green', 'green', 'blue', 'dark-blue', 'teal', 'purple', 'pink', 'magenta', 'dark-red', 'dark-gray'
19
+ * - Default: 'blue'
20
+ *
21
+ * - `size` (string): Size variant
22
+ * - Options: 'small', 'medium', 'large'
23
+ * - Default: 'medium'
24
+ *
25
+ * - `outline` (boolean): Whether to show an outline/border around the dot
26
+ * - Default: false
27
+ *
28
+ * ## Usage Examples:
29
+ *
30
+ * Basic dot status:
31
+ * ```jsx
32
+ * <DotStatus variant="green" />
33
+ * ```
34
+ *
35
+ * Dot status with outline:
36
+ * ```jsx
37
+ * <DotStatus variant="red" outline={true} />
38
+ * ```
39
+ *
40
+ * Different sizes:
41
+ * ```jsx
42
+ * <DotStatus variant="blue" size="small" />
43
+ * <DotStatus variant="blue" size="medium" />
44
+ * <DotStatus variant="blue" size="large" />
45
+ * ```
46
+ */
47
+
48
+ const variants = [
49
+ "light-gray",
50
+ "red",
51
+ "orange",
52
+ "yellow",
53
+ "light-green",
54
+ "green",
55
+ "blue",
56
+ "dark-blue",
57
+ "teal",
58
+ "purple",
59
+ "pink",
60
+ "magenta",
61
+ "dark-red",
62
+ "dark-gray",
63
+ ];
64
+
65
+ const sizes = ["small", "medium", "large"];
66
+
67
+ export default function DotStatusDemo() {
68
+
69
+ return (
70
+ <section className="page">
71
+ <header className="page__header">
72
+ <div className="page__header-container">
73
+ <Breadcrumb />
74
+ <div className="page__header-info">
75
+ <div className="page__header-content">
76
+ <h1 className="page__header-title">Dot Status</h1>
77
+ <p className="page__header-description">
78
+ The Dot Status component provides visual status indicators using
79
+ colored circular dots. Perfect for showing online/offline status, task
80
+ states, or any categorical information. Supports multiple color
81
+ variants, sizes, and optional outline styling.
82
+ </p>
83
+ </div>
84
+ <div className="page__header-metadata">
85
+ <div className="page__metadata-row">
86
+ <p className="page__metadata-label">Author</p>
87
+ <a
88
+ href="https://chgit.slack.com/team/U06V9C0K06S"
89
+ className="page__metadata-link"
90
+ target="_blank"
91
+ rel="noopener noreferrer"
92
+ >
93
+ @Michael-Stevens
94
+ </a>
95
+ </div>
96
+ <div className="page__metadata-row">
97
+ <p className="page__metadata-label">Last updated</p>
98
+ <p className="page__metadata-value">{formatLastUpdated()}</p>
99
+ </div>
100
+ <div className="page__metadata-row">
101
+ <p className="page__metadata-label">Version</p>
102
+ <Flex direction="row" gap="8" alignItems="center">
103
+ <p className="page__metadata-value">1.0.0</p>
104
+ <span className="page__version-badge">BETA</span>
105
+ </Flex>
106
+ </div>
107
+ </div>
108
+ </div>
109
+ </div>
110
+ </header>
111
+ <main className="page__content">
112
+ <div className="page__examples-section">
113
+ <div className="demo-group">
114
+ <h2 className="demo-group__heading">Color Variants</h2>
115
+ <p className="demo-group__description">
116
+ Dot Status supports multiple color variants to represent different states or categories. Each variant uses a distinct color to provide clear visual distinction.
117
+ </p>
118
+ <Flex direction="row" gap="16" wrap={true} alignItems="center" className="demo-content">
119
+ {variants.map((variant) => (
120
+ <Flex key={variant} direction="row" gap="8" alignItems="center">
121
+ <DotStatus variant={variant} />
122
+ <span>{variant}</span>
123
+ </Flex>
124
+ ))}
125
+ </Flex>
126
+ </div>
127
+
128
+ <div className="demo-group">
129
+ <h2 className="demo-group__heading">Sizes</h2>
130
+ <p className="demo-group__description">
131
+ Dot Status comes in three sizes: small, medium (default), and large. Choose the size that best fits your layout and visual hierarchy.
132
+ </p>
133
+ <Flex direction="row" gap="24" wrap={true} alignItems="center" className="demo-content">
134
+ {sizes.map((size) => (
135
+ <Flex key={size} direction="row" gap="8" alignItems="center">
136
+ <DotStatus variant="blue" size={size} />
137
+ <span>{size}</span>
138
+ </Flex>
139
+ ))}
140
+ </Flex>
141
+ </div>
142
+
143
+ <div className="demo-group">
144
+ <h2 className="demo-group__heading">With Outline</h2>
145
+ <p className="demo-group__description">
146
+ The outline variant adds a border around the dot, providing additional visual definition and making the status indicator more prominent.
147
+ </p>
148
+ <Flex direction="row" gap="16" wrap={true} alignItems="center" className="demo-content">
149
+ <Flex direction="row" gap="8" alignItems="center">
150
+ <DotStatus variant="green" outline />
151
+ <span>Green with outline</span>
152
+ </Flex>
153
+ <Flex direction="row" gap="8" alignItems="center">
154
+ <DotStatus variant="red" outline />
155
+ <span>Red with outline</span>
156
+ </Flex>
157
+ <Flex direction="row" gap="8" alignItems="center">
158
+ <DotStatus variant="blue" outline />
159
+ <span>Blue with outline</span>
160
+ </Flex>
161
+ <Flex direction="row" gap="8" alignItems="center">
162
+ <DotStatus variant="yellow" outline />
163
+ <span>Yellow with outline</span>
164
+ </Flex>
165
+ </Flex>
166
+ </div>
167
+
168
+ <div className="demo-group">
169
+ <h2 className="demo-group__heading">Usage Examples</h2>
170
+ <p className="demo-group__description">
171
+ Common use cases for Dot Status include showing online/offline status, task states, priority levels, or any categorical information.
172
+ </p>
173
+ <Flex direction="column" gap="16" className="demo-content">
174
+ <Flex direction="row" gap="12" alignItems="center">
175
+ <DotStatus variant="green" />
176
+ <span>Online</span>
177
+ </Flex>
178
+ <Flex direction="row" gap="12" alignItems="center">
179
+ <DotStatus variant="red" />
180
+ <span>Offline</span>
181
+ </Flex>
182
+ <Flex direction="row" gap="12" alignItems="center">
183
+ <DotStatus variant="yellow" />
184
+ <span>Away</span>
185
+ </Flex>
186
+ <Flex direction="row" gap="12" alignItems="center">
187
+ <DotStatus variant="blue" />
188
+ <span>Active</span>
189
+ </Flex>
190
+ <Flex direction="row" gap="12" alignItems="center">
191
+ <DotStatus variant="orange" />
192
+ <span>Pending</span>
193
+ </Flex>
194
+ </Flex>
195
+ </div>
196
+ </div>
197
+
198
+ <Divider variant="solid" />
199
+
200
+ <div className="page__tabs-content-container">
201
+ <div className="demo-group">
202
+ <div className="page__navigation">
203
+ <Link
204
+ to="/divider"
205
+ className="page__nav-link page__nav-link--prev"
206
+ >
207
+ <span className="page__nav-label">Previous</span>
208
+ <span className="page__nav-title">Divider</span>
209
+ </Link>
210
+ <Link
211
+ to="/dropdown"
212
+ className="page__nav-link page__nav-link--next"
213
+ >
214
+ <span className="page__nav-label">Next</span>
215
+ <span className="page__nav-title">Dropdown</span>
216
+ </Link>
217
+ </div>
218
+ </div>
219
+ </div>
220
+ </main>
221
+ </section>
222
+ );
223
+ }
@@ -0,0 +1,229 @@
1
+ import React, { useState } from "react";
2
+ import { Link } from "react-router-dom";
3
+ import Dropdown from "../ui/Dropdown/Dropdown";
4
+ import Flex from "../ui/Flex/Flex";
5
+ import Breadcrumb from "../ui/Breadcrumb/Breadcrumb";
6
+ import Divider from "../ui/Divider/Divider";
7
+ import { formatLastUpdated } from "../utils/formatDate";
8
+
9
+ /**
10
+ * Dropdown Component Demo & Documentation
11
+ *
12
+ * This page demonstrates the Dropdown component and its various configurations.
13
+ *
14
+ * ## Dropdown Component Props:
15
+ *
16
+ * ### Required Props:
17
+ * - `options` (array): Array of option objects with { value, label } or array of strings
18
+ *
19
+ * ### Optional Props:
20
+ * - `value` (string|number): Currently selected value
21
+ * - `onChange` (function): Callback when selection changes (receives new value)
22
+ * - `placeholder` (string): Placeholder text when no option is selected (default: 'Select an option')
23
+ * - `state` (string): Visual state: 'default', 'focused', 'error', 'disabled'
24
+ * - `label` (string): Label text for the dropdown
25
+ * - `disabled` (boolean): Whether the dropdown is disabled
26
+ *
27
+ * ## Usage Examples:
28
+ *
29
+ * Basic dropdown:
30
+ * ```jsx
31
+ * <Dropdown
32
+ * options={['Option 1', 'Option 2', 'Option 3']}
33
+ * value={selectedValue}
34
+ * onChange={setSelectedValue}
35
+ * />
36
+ * ```
37
+ *
38
+ * Dropdown with custom options:
39
+ * ```jsx
40
+ * <Dropdown
41
+ * options={[
42
+ * { value: '1', label: 'First Option' },
43
+ * { value: '2', label: 'Second Option' }
44
+ * ]}
45
+ * value={selectedValue}
46
+ * onChange={setSelectedValue}
47
+ * />
48
+ * ```
49
+ */
50
+
51
+ const simpleOptions = [
52
+ "Option 1",
53
+ "Option 2",
54
+ "Option 3",
55
+ "Option 4",
56
+ "Option 5",
57
+ ];
58
+
59
+ const customOptions = [
60
+ { value: "apple", label: "Apple" },
61
+ { value: "banana", label: "Banana" },
62
+ { value: "cherry", label: "Cherry" },
63
+ { value: "date", label: "Date" },
64
+ { value: "elderberry", label: "Elderberry" },
65
+ ];
66
+
67
+ export default function DropdownDemo() {
68
+ const [defaultValue, setDefaultValue] = useState("");
69
+ const [focusedValue, setFocusedValue] = useState("");
70
+ const [errorValue, setErrorValue] = useState("");
71
+ const [customValue, setCustomValue] = useState("");
72
+ const [labeledValue, setLabeledValue] = useState("");
73
+
74
+ return (
75
+ <section className="page">
76
+ <header className="page__header">
77
+ <div className="page__header-container">
78
+ <Breadcrumb />
79
+ <div className="page__header-info">
80
+ <div className="page__header-content">
81
+ <h1 className="page__header-title">Dropdown</h1>
82
+ <p className="page__header-description">
83
+ The Dropdown component provides a custom select input with support for
84
+ different states, keyboard navigation, and accessibility features. It
85
+ can be used as a replacement for native select elements with enhanced
86
+ styling and functionality.
87
+ </p>
88
+ </div>
89
+ <div className="page__header-metadata">
90
+ <div className="page__metadata-row">
91
+ <p className="page__metadata-label">Author</p>
92
+ <a
93
+ href="https://chgit.slack.com/team/U06V9C0K06S"
94
+ className="page__metadata-link"
95
+ target="_blank"
96
+ rel="noopener noreferrer"
97
+ >
98
+ @Michael-Stevens
99
+ </a>
100
+ </div>
101
+ <div className="page__metadata-row">
102
+ <p className="page__metadata-label">Last updated</p>
103
+ <p className="page__metadata-value">{formatLastUpdated()}</p>
104
+ </div>
105
+ <div className="page__metadata-row">
106
+ <p className="page__metadata-label">Version</p>
107
+ <Flex direction="row" gap="8" alignItems="center">
108
+ <p className="page__metadata-value">1.0.0</p>
109
+ <span className="page__version-badge">BETA</span>
110
+ </Flex>
111
+ </div>
112
+ </div>
113
+ </div>
114
+ </div>
115
+ </header>
116
+ <main className="page__content">
117
+ <div className="page__examples-section">
118
+ <div className="demo-group">
119
+ <h2 className="demo-group__heading">Basic Usage</h2>
120
+ <p className="demo-group__description">
121
+ A simple dropdown with string options. Click to open and select an option from the list.
122
+ </p>
123
+ <div className="demo-content">
124
+ <Dropdown
125
+ options={simpleOptions}
126
+ value={defaultValue}
127
+ onChange={setDefaultValue}
128
+ placeholder="Select an option"
129
+ />
130
+ </div>
131
+ </div>
132
+
133
+ <div className="demo-group">
134
+ <h2 className="demo-group__heading">With Custom Options</h2>
135
+ <p className="demo-group__description">
136
+ Dropdowns can use custom option objects with separate value and label properties. This is useful when the display text differs from the underlying value.
137
+ </p>
138
+ <div className="demo-content">
139
+ <Dropdown
140
+ options={customOptions}
141
+ value={customValue}
142
+ onChange={setCustomValue}
143
+ placeholder="Choose a fruit"
144
+ />
145
+ </div>
146
+ </div>
147
+
148
+ <div className="demo-group">
149
+ <h2 className="demo-group__heading">With Label</h2>
150
+ <p className="demo-group__description">
151
+ Dropdowns can include a label above the control to provide context and improve accessibility.
152
+ </p>
153
+ <div className="demo-content">
154
+ <Dropdown
155
+ options={simpleOptions}
156
+ value={labeledValue}
157
+ onChange={setLabeledValue}
158
+ label="Select an option"
159
+ placeholder="Choose..."
160
+ />
161
+ </div>
162
+ </div>
163
+
164
+ <div className="demo-group">
165
+ <h2 className="demo-group__heading">States</h2>
166
+ <p className="demo-group__description">
167
+ Dropdowns support different visual states including default, focused, error, and disabled. The focused state is automatically applied when the dropdown is active.
168
+ </p>
169
+ <Flex direction="column" gap="16" className="demo-content">
170
+ <Dropdown
171
+ options={simpleOptions}
172
+ value={focusedValue}
173
+ onChange={setFocusedValue}
174
+ state="focused"
175
+ placeholder="Focused state"
176
+ />
177
+ <Dropdown
178
+ options={simpleOptions}
179
+ value={errorValue}
180
+ onChange={setErrorValue}
181
+ state="error"
182
+ placeholder="Error state"
183
+ />
184
+ </Flex>
185
+ </div>
186
+
187
+ <div className="demo-group">
188
+ <h2 className="demo-group__heading">Disabled State</h2>
189
+ <p className="demo-group__description">
190
+ Disabled dropdowns prevent user interaction and are typically used when the selection is not applicable in the current context.
191
+ </p>
192
+ <div className="demo-content">
193
+ <Dropdown
194
+ options={simpleOptions}
195
+ value="Option 1"
196
+ onChange={() => {}}
197
+ disabled
198
+ placeholder="Disabled dropdown"
199
+ />
200
+ </div>
201
+ </div>
202
+ </div>
203
+
204
+ <Divider variant="solid" />
205
+
206
+ <div className="page__tabs-content-container">
207
+ <div className="demo-group">
208
+ <div className="page__navigation">
209
+ <Link
210
+ to="/dot-status"
211
+ className="page__nav-link page__nav-link--prev"
212
+ >
213
+ <span className="page__nav-label">Previous</span>
214
+ <span className="page__nav-title">Dot Status</span>
215
+ </Link>
216
+ <Link
217
+ to="/field"
218
+ className="page__nav-link page__nav-link--next"
219
+ >
220
+ <span className="page__nav-label">Next</span>
221
+ <span className="page__nav-title">Field</span>
222
+ </Link>
223
+ </div>
224
+ </div>
225
+ </div>
226
+ </main>
227
+ </section>
228
+ );
229
+ }