@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,34 @@
1
+ .button-demo {
2
+ &__code-block-wrapper {
3
+ position: relative;
4
+ margin: var(--uds-spacing-16) 0;
5
+ }
6
+
7
+ &__code-block {
8
+ background: var(--uds-code-bg);
9
+ border: var(--uds-border-width-1) solid var(--uds-border-primary);
10
+ border-radius: var(--uds-radius-8);
11
+ padding: var(--uds-spacing-16);
12
+ overflow-x: auto;
13
+ max-width: 100%;
14
+ word-break: break-word;
15
+
16
+ // Override Prism base styles to use our custom variables
17
+ pre[class*="language-"] {
18
+ background: transparent;
19
+ margin: 0;
20
+ padding: 0;
21
+ }
22
+
23
+ code[class*="language-"] {
24
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
25
+ font-size: var(--uds-font-size-14);
26
+ line-height: var(--uds-line-20);
27
+ white-space: pre;
28
+ word-wrap: normal;
29
+ display: block;
30
+ overflow-x: auto;
31
+ background: transparent;
32
+ }
33
+ }
34
+ }
@@ -0,0 +1,194 @@
1
+ import React, { useState } from "react";
2
+ import { Link } from "react-router-dom";
3
+ import Checkbox from "../ui/Checkbox/Checkbox";
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
+ export default function CheckboxDemo() {
10
+ const [checked1, setChecked1] = useState(false);
11
+ const [checked2, setChecked2] = useState(true);
12
+ const [checked3, setChecked3] = useState(false);
13
+ const [indeterminate, setIndeterminate] = useState(false);
14
+ const [allSelected, setAllSelected] = useState(false);
15
+ const [items, setItems] = useState({
16
+ item1: false,
17
+ item2: false,
18
+ item3: false,
19
+ });
20
+
21
+ const handleSelectAll = (checked) => {
22
+ setAllSelected(checked);
23
+ setItems({
24
+ item1: checked,
25
+ item2: checked,
26
+ item3: checked,
27
+ });
28
+ };
29
+
30
+ const handleItemChange = (itemKey, checked) => {
31
+ const newItems = { ...items, [itemKey]: checked };
32
+ setItems(newItems);
33
+
34
+ const allChecked = Object.values(newItems).every(Boolean);
35
+ const noneChecked = Object.values(newItems).every((val) => val === false);
36
+ setAllSelected(allChecked);
37
+ setIndeterminate(!allChecked && !noneChecked);
38
+ };
39
+
40
+ return (
41
+ <section className="page">
42
+ <header className="page__header">
43
+ <div className="page__header-container">
44
+ <Breadcrumb />
45
+ <div className="page__header-info">
46
+ <div className="page__header-content">
47
+ <h1 className="page__header-title">Checkbox</h1>
48
+ <p className="page__header-description">
49
+ The Checkbox component allows users to select one or more options from
50
+ a set. Use checkboxes when users need to make multiple selections.
51
+ </p>
52
+ </div>
53
+ <div className="page__header-metadata">
54
+ <div className="page__metadata-row">
55
+ <p className="page__metadata-label">Author</p>
56
+ <a
57
+ href="https://chgit.slack.com/team/U06V9C0K06S"
58
+ className="page__metadata-link"
59
+ target="_blank"
60
+ rel="noopener noreferrer"
61
+ >
62
+ @Michael-Stevens
63
+ </a>
64
+ </div>
65
+ <div className="page__metadata-row">
66
+ <p className="page__metadata-label">Last updated</p>
67
+ <p className="page__metadata-value">{formatLastUpdated()}</p>
68
+ </div>
69
+ <div className="page__metadata-row">
70
+ <p className="page__metadata-label">Version</p>
71
+ <Flex direction="row" gap="8" alignItems="center">
72
+ <p className="page__metadata-value">1.0.0</p>
73
+ <span className="page__version-badge">BETA</span>
74
+ </Flex>
75
+ </div>
76
+ </div>
77
+ </div>
78
+ </div>
79
+ </header>
80
+
81
+ <main className="page__content">
82
+ <div className="page__examples-section">
83
+ <div className="demo-group">
84
+ <h2 className="demo-group__heading">Basic Usage</h2>
85
+ <p className="demo-group__description">
86
+ A simple checkbox for selecting an option. Use checkboxes when users need to make multiple selections from a set of options.
87
+ </p>
88
+ <Flex direction="column" gap="16" className="demo-content">
89
+ <Checkbox
90
+ label="Unchecked checkbox"
91
+ checked={checked1}
92
+ onChange={setChecked1}
93
+ />
94
+ <Checkbox
95
+ label="Checked checkbox"
96
+ checked={checked2}
97
+ onChange={setChecked2}
98
+ />
99
+ <Checkbox
100
+ label="Disabled unchecked"
101
+ checked={false}
102
+ onChange={() => {}}
103
+ disabled
104
+ />
105
+ <Checkbox
106
+ label="Disabled checked"
107
+ checked={true}
108
+ onChange={() => {}}
109
+ disabled
110
+ />
111
+ </Flex>
112
+ </div>
113
+
114
+ <div className="demo-group">
115
+ <h2 className="demo-group__heading">Indeterminate State</h2>
116
+ <p className="demo-group__description">
117
+ The indeterminate state is used when some but not all items in a group are selected. This is commonly used with "Select All" functionality.
118
+ </p>
119
+ <Flex direction="column" gap="16" className="demo-content">
120
+ <Checkbox
121
+ label="Select All"
122
+ checked={allSelected}
123
+ indeterminate={indeterminate}
124
+ onChange={handleSelectAll}
125
+ />
126
+ <div style={{ marginLeft: "24px" }}>
127
+ <Flex direction="column" gap="12">
128
+ <Checkbox
129
+ label="Item 1"
130
+ checked={items.item1}
131
+ onChange={(checked) => handleItemChange("item1", checked)}
132
+ />
133
+ <Checkbox
134
+ label="Item 2"
135
+ checked={items.item2}
136
+ onChange={(checked) => handleItemChange("item2", checked)}
137
+ />
138
+ <Checkbox
139
+ label="Item 3"
140
+ checked={items.item3}
141
+ onChange={(checked) => handleItemChange("item3", checked)}
142
+ />
143
+ </Flex>
144
+ </div>
145
+ </Flex>
146
+ </div>
147
+
148
+ <div className="demo-group">
149
+ <h2 className="demo-group__heading">Different States</h2>
150
+ <p className="demo-group__description">
151
+ Checkboxes support various states including checked, unchecked, disabled, and indeterminate. The indeterminate state is useful for "Select All" scenarios.
152
+ </p>
153
+ <Flex direction="column" gap="16" className="demo-content">
154
+ <Checkbox
155
+ label="Default checkbox"
156
+ checked={checked3}
157
+ onChange={setChecked3}
158
+ />
159
+ <Checkbox
160
+ label="Indeterminate checkbox"
161
+ checked={false}
162
+ indeterminate={true}
163
+ onChange={() => {}}
164
+ />
165
+ </Flex>
166
+ </div>
167
+ </div>
168
+
169
+ <Divider variant="solid" />
170
+
171
+ <div className="page__tabs-content-container">
172
+ <div className="demo-group">
173
+ <div className="page__navigation">
174
+ <Link
175
+ to="/chip"
176
+ className="page__nav-link page__nav-link--prev"
177
+ >
178
+ <span className="page__nav-label">Previous</span>
179
+ <span className="page__nav-title">Chip</span>
180
+ </Link>
181
+ <Link
182
+ to="/datepicker"
183
+ className="page__nav-link page__nav-link--next"
184
+ >
185
+ <span className="page__nav-label">Next</span>
186
+ <span className="page__nav-title">Datepicker</span>
187
+ </Link>
188
+ </div>
189
+ </div>
190
+ </div>
191
+ </main>
192
+ </section>
193
+ );
194
+ }
@@ -0,0 +1,359 @@
1
+ import React, { useEffect } from "react";
2
+ import { Link } from "react-router-dom";
3
+ import Chip from "../ui/Chip/Chip";
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
+ import CopyButton from "../ui/CopyButton/CopyButton";
9
+ import Prism from "prismjs";
10
+ import "../styles/prism-custom.css";
11
+ import "prismjs/components/prism-jsx";
12
+ import "prismjs/components/prism-javascript";
13
+ import "./ChipDemo.scss";
14
+
15
+ const appearances = ["outline", "primary"];
16
+ const shapes = ["pill", "rounded"];
17
+
18
+ export default function ChipDemo() {
19
+ useEffect(() => {
20
+ Prism.highlightAll();
21
+ }, []);
22
+
23
+ return (
24
+ <section className="page">
25
+ <header className="page__header">
26
+ <div className="page__header-container">
27
+ <Breadcrumb />
28
+ <div className="page__header-info">
29
+ <div className="page__header-content">
30
+ <h1 className="page__header-title">Chip</h1>
31
+ <p className="page__header-description">
32
+ The Chip component is used to display labels, tags, or filters. It
33
+ supports various appearance styles, shapes, and icon placements. Hover
34
+ or click the chips to observe their interactive state styling.
35
+ </p>
36
+ </div>
37
+ <div className="page__header-metadata">
38
+ <div className="page__metadata-row">
39
+ <p className="page__metadata-label">Author</p>
40
+ <a
41
+ href="https://chgit.slack.com/team/U06V9C0K06S"
42
+ className="page__metadata-link"
43
+ target="_blank"
44
+ rel="noopener noreferrer"
45
+ >
46
+ @Michael-Stevens
47
+ </a>
48
+ </div>
49
+ <div className="page__metadata-row">
50
+ <p className="page__metadata-label">Last updated</p>
51
+ <p className="page__metadata-value">{formatLastUpdated()}</p>
52
+ </div>
53
+ <div className="page__metadata-row">
54
+ <p className="page__metadata-label">Version</p>
55
+ <Flex direction="row" gap="8" alignItems="center">
56
+ <p className="page__metadata-value">1.0.0</p>
57
+ <span className="page__version-badge">BETA</span>
58
+ </Flex>
59
+ </div>
60
+ </div>
61
+ </div>
62
+ </div>
63
+ </header>
64
+ <main className="page__content">
65
+ <div className="page__examples-section">
66
+ <div className="demo-group">
67
+ <h2 className="demo-group__heading">Appearances</h2>
68
+ <p className="demo-group__description">
69
+ The appearance prop controls the visual style of the chip. Choose from outline for a bordered style or primary for a filled style with brand colors.
70
+ </p>
71
+ <Flex direction="row" gap="16" wrap={true} className="demo-content">
72
+ {appearances.map((appearance) => (
73
+ <Chip
74
+ key={appearance}
75
+ label={appearance}
76
+ appearance={appearance}
77
+ />
78
+ ))}
79
+ </Flex>
80
+ <div className="chip-demo__code-block-wrapper">
81
+ <CopyButton codeString={`import Chip from "../ui/Chip/Chip";
82
+
83
+ // Outline style (default)
84
+ <Chip label="outline" appearance="outline" />
85
+
86
+ // Primary style with brand colors
87
+ <Chip label="primary" appearance="primary" />`} />
88
+ <pre className="chip-demo__code-block">
89
+ <code className="language-jsx">{`import Chip from "../ui/Chip/Chip";
90
+
91
+ // Outline style (default)
92
+ <Chip label="outline" appearance="outline" />
93
+
94
+ // Primary style with brand colors
95
+ <Chip label="primary" appearance="primary" />`}</code>
96
+ </pre>
97
+ </div>
98
+ </div>
99
+
100
+ <div className="demo-group">
101
+ <h2 className="demo-group__heading">Shapes</h2>
102
+ <p className="demo-group__description">
103
+ The shape prop controls the border radius of the chip. Choose from pill for fully rounded corners or rounded for slightly rounded corners.
104
+ </p>
105
+ <Flex direction="row" gap="16" wrap={true} className="demo-content">
106
+ {shapes.map((shape) => (
107
+ <Chip
108
+ key={shape}
109
+ label={shape}
110
+ shape={shape}
111
+ appearance="outline"
112
+ />
113
+ ))}
114
+ </Flex>
115
+ <div className="chip-demo__code-block-wrapper">
116
+ <CopyButton codeString={`import Chip from "../ui/Chip/Chip";
117
+
118
+ // Pill shape (fully rounded)
119
+ <Chip label="pill" shape="pill" />
120
+
121
+ // Rounded shape (slightly rounded corners)
122
+ <Chip label="rounded" shape="rounded" />`} />
123
+ <pre className="chip-demo__code-block">
124
+ <code className="language-jsx">{`import Chip from "../ui/Chip/Chip";
125
+
126
+ // Pill shape (fully rounded)
127
+ <Chip label="pill" shape="pill" />
128
+
129
+ // Rounded shape (slightly rounded corners)
130
+ <Chip label="rounded" shape="rounded" />`}</code>
131
+ </pre>
132
+ </div>
133
+ </div>
134
+
135
+ <div className="demo-group">
136
+ <h2 className="demo-group__heading">With Icons</h2>
137
+ <p className="demo-group__description">
138
+ Chips can display icons on the left, right, or both sides. Icons are useful for actions like closing or filtering.
139
+ </p>
140
+ <Flex direction="row" gap="16" wrap={true} className="demo-content">
141
+ <Chip
142
+ label="Left icon"
143
+ icon="Funnel"
144
+ iconPlacement="left"
145
+ />
146
+ <Chip
147
+ label="Right icon"
148
+ icon="X"
149
+ iconPlacement="right"
150
+ />
151
+ <Chip
152
+ label="Both icons"
153
+ icon="Funnel"
154
+ iconPlacement="both"
155
+ />
156
+ </Flex>
157
+ <div className="chip-demo__code-block-wrapper">
158
+ <CopyButton codeString={`import Chip from "../ui/Chip/Chip";
159
+
160
+ // Icon on the left
161
+ <Chip label="Left icon" icon="Funnel" iconPlacement="left" />
162
+
163
+ // Icon on the right (common for remove/close actions)
164
+ <Chip label="Right icon" icon="X" iconPlacement="right" />
165
+
166
+ // Icons on both sides
167
+ <Chip label="Both icons" icon="Funnel" iconPlacement="both" />`} />
168
+ <pre className="chip-demo__code-block">
169
+ <code className="language-jsx">{`import Chip from "../ui/Chip/Chip";
170
+
171
+ // Icon on the left
172
+ <Chip label="Left icon" icon="Funnel" iconPlacement="left" />
173
+
174
+ // Icon on the right (common for remove/close actions)
175
+ <Chip label="Right icon" icon="X" iconPlacement="right" />
176
+
177
+ // Icons on both sides
178
+ <Chip label="Both icons" icon="Funnel" iconPlacement="both" />`}</code>
179
+ </pre>
180
+ </div>
181
+ </div>
182
+
183
+ <div className="demo-group">
184
+ <h2 className="demo-group__heading">With Badges</h2>
185
+ <p className="demo-group__description">
186
+ Chips can display a badge count to indicate quantity or notifications. Badges appear on the right side of the chip.
187
+ </p>
188
+ <Flex direction="row" gap="16" wrap={true} className="demo-content">
189
+ <Chip
190
+ label="Notifications"
191
+ badge={5}
192
+ badgeVariant="red"
193
+ />
194
+ <Chip
195
+ label="Messages"
196
+ badge={12}
197
+ badgeVariant="blue"
198
+ />
199
+ <Chip
200
+ label="Items"
201
+ badge={99}
202
+ badgeVariant="green"
203
+ />
204
+ </Flex>
205
+ <div className="chip-demo__code-block-wrapper">
206
+ <CopyButton codeString={`import Chip from "../ui/Chip/Chip";
207
+
208
+ // Chip with red badge
209
+ <Chip label="Notifications" badge={5} badgeVariant="red" />
210
+
211
+ // Chip with blue badge
212
+ <Chip label="Messages" badge={12} badgeVariant="blue" />
213
+
214
+ // Chip with green badge
215
+ <Chip label="Items" badge={99} badgeVariant="green" />`} />
216
+ <pre className="chip-demo__code-block">
217
+ <code className="language-jsx">{`import Chip from "../ui/Chip/Chip";
218
+
219
+ // Chip with red badge
220
+ <Chip label="Notifications" badge={5} badgeVariant="red" />
221
+
222
+ // Chip with blue badge
223
+ <Chip label="Messages" badge={12} badgeVariant="blue" />
224
+
225
+ // Chip with green badge
226
+ <Chip label="Items" badge={99} badgeVariant="green" />`}</code>
227
+ </pre>
228
+ </div>
229
+ </div>
230
+
231
+ <div className="demo-group">
232
+ <h2 className="demo-group__heading">Clickable Chips</h2>
233
+ <p className="demo-group__description">
234
+ Chips can be clickable by providing an onClick handler. This is useful for filters, tags, or removable items.
235
+ </p>
236
+ <Flex direction="row" gap="16" wrap={true} className="demo-content">
237
+ <Chip
238
+ label="Clickable chip"
239
+ onClick={() => alert("Chip clicked!")}
240
+ />
241
+ <Chip
242
+ label="Remove"
243
+ icon="X"
244
+ iconPlacement="right"
245
+ onClick={() => alert("Remove clicked!")}
246
+ />
247
+ </Flex>
248
+ <div className="chip-demo__code-block-wrapper">
249
+ <CopyButton codeString={`import Chip from "../ui/Chip/Chip";
250
+
251
+ // Basic clickable chip
252
+ <Chip
253
+ label="Clickable chip"
254
+ onClick={() => handleClick()}
255
+ />
256
+
257
+ // Removable chip with close icon
258
+ <Chip
259
+ label="Remove"
260
+ icon="X"
261
+ iconPlacement="right"
262
+ onClick={() => handleRemove()}
263
+ />`} />
264
+ <pre className="chip-demo__code-block">
265
+ <code className="language-jsx">{`import Chip from "../ui/Chip/Chip";
266
+
267
+ // Basic clickable chip
268
+ <Chip
269
+ label="Clickable chip"
270
+ onClick={() => handleClick()}
271
+ />
272
+
273
+ // Removable chip with close icon
274
+ <Chip
275
+ label="Remove"
276
+ icon="X"
277
+ iconPlacement="right"
278
+ onClick={() => handleRemove()}
279
+ />`}</code>
280
+ </pre>
281
+ </div>
282
+ </div>
283
+
284
+ <div className="demo-group">
285
+ <h2 className="demo-group__heading">Disabled State</h2>
286
+ <p className="demo-group__description">
287
+ Chips can be disabled to prevent interaction. Disabled chips have reduced opacity and cannot be clicked.
288
+ </p>
289
+ <Flex direction="row" gap="16" wrap={true} className="demo-content">
290
+ <Chip
291
+ label="Disabled outline"
292
+ appearance="outline"
293
+ disabled
294
+ />
295
+ <Chip
296
+ label="Disabled primary"
297
+ appearance="primary"
298
+ disabled
299
+ />
300
+ <Chip
301
+ label="Disabled with icon"
302
+ icon="X"
303
+ iconPlacement="right"
304
+ disabled
305
+ />
306
+ </Flex>
307
+ <div className="chip-demo__code-block-wrapper">
308
+ <CopyButton codeString={`import Chip from "../ui/Chip/Chip";
309
+
310
+ // Disabled outline chip
311
+ <Chip label="Disabled outline" appearance="outline" disabled />
312
+
313
+ // Disabled primary chip
314
+ <Chip label="Disabled primary" appearance="primary" disabled />
315
+
316
+ // Disabled chip with icon
317
+ <Chip label="Disabled with icon" icon="X" iconPlacement="right" disabled />`} />
318
+ <pre className="chip-demo__code-block">
319
+ <code className="language-jsx">{`import Chip from "../ui/Chip/Chip";
320
+
321
+ // Disabled outline chip
322
+ <Chip label="Disabled outline" appearance="outline" disabled />
323
+
324
+ // Disabled primary chip
325
+ <Chip label="Disabled primary" appearance="primary" disabled />
326
+
327
+ // Disabled chip with icon
328
+ <Chip label="Disabled with icon" icon="X" iconPlacement="right" disabled />`}</code>
329
+ </pre>
330
+ </div>
331
+ </div>
332
+ </div>
333
+
334
+ <Divider variant="solid" />
335
+
336
+ <div className="page__tabs-content-container">
337
+ <div className="demo-group">
338
+ <div className="page__navigation">
339
+ <Link
340
+ to="/checkbox"
341
+ className="page__nav-link page__nav-link--prev"
342
+ >
343
+ <span className="page__nav-label">Previous</span>
344
+ <span className="page__nav-title">Checkbox</span>
345
+ </Link>
346
+ <Link
347
+ to="/datepicker"
348
+ className="page__nav-link page__nav-link--next"
349
+ >
350
+ <span className="page__nav-label">Next</span>
351
+ <span className="page__nav-title">Datepicker</span>
352
+ </Link>
353
+ </div>
354
+ </div>
355
+ </div>
356
+ </main>
357
+ </section>
358
+ );
359
+ }
@@ -0,0 +1,40 @@
1
+ .chip-demo {
2
+ &__code-block-wrapper {
3
+ position: relative;
4
+ margin: var(--uds-spacing-16) 0;
5
+ }
6
+
7
+ &__code-block {
8
+ background: var(--uds-code-bg);
9
+ border: var(--uds-border-width-1) solid var(--uds-border-primary);
10
+ border-radius: var(--uds-radius-8);
11
+ padding: var(--uds-spacing-16);
12
+ overflow-x: auto;
13
+ max-width: 100%;
14
+ word-break: break-word;
15
+
16
+ // Override Prism base styles to use our custom variables
17
+ pre[class*="language-"] {
18
+ background: transparent;
19
+ margin: 0;
20
+ padding: 0;
21
+ }
22
+
23
+ code[class*="language-"] {
24
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
25
+ font-size: var(--uds-font-size-14);
26
+ line-height: var(--uds-line-20);
27
+ white-space: pre;
28
+ word-wrap: normal;
29
+ display: block;
30
+ overflow-x: auto;
31
+ background: transparent;
32
+ }
33
+ }
34
+ }
35
+
36
+ // Show copy button on hover of code block container
37
+ .chip-demo__code-block-wrapper:hover .copy-button {
38
+ opacity: 1;
39
+ pointer-events: auto;
40
+ }