@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.
- package/.github/workflows/figma-sync.yml +30 -0
- package/ARCHITECTURE_FIX.md +241 -0
- package/LICENSE +21 -0
- package/README.lib.md +103 -0
- package/README.md +177 -0
- package/figma.config.json +9 -0
- package/package.json +67 -0
- package/package.lib.json +49 -0
- package/public/data/figma-variables.json +40026 -0
- package/public/favicon.ico +0 -0
- package/public/index.html +46 -0
- package/public/logo192.png +0 -0
- package/public/logo512.png +0 -0
- package/public/manifest.json +25 -0
- package/public/robots.txt +3 -0
- package/public/styles/tokens.css +1994 -0
- package/scripts/index.js +896 -0
- package/scripts/publish-lib.js +150 -0
- package/scripts/validate.js +94 -0
- package/src/App.css +457 -0
- package/src/App.css.map +1 -0
- package/src/App.js +161 -0
- package/src/App.scss +548 -0
- package/src/App.test.js +8 -0
- package/src/assets/images/.gitkeep +0 -0
- package/src/assets/images/doctors/Avatar-1.png +0 -0
- package/src/assets/images/doctors/Avatar-10.png +0 -0
- package/src/assets/images/doctors/Avatar-11.png +0 -0
- package/src/assets/images/doctors/Avatar-12.png +0 -0
- package/src/assets/images/doctors/Avatar-13.png +0 -0
- package/src/assets/images/doctors/Avatar-14.png +0 -0
- package/src/assets/images/doctors/Avatar-15.png +0 -0
- package/src/assets/images/doctors/Avatar-16.png +0 -0
- package/src/assets/images/doctors/Avatar-17.png +0 -0
- package/src/assets/images/doctors/Avatar-18.png +0 -0
- package/src/assets/images/doctors/Avatar-19.png +0 -0
- package/src/assets/images/doctors/Avatar-2.png +0 -0
- package/src/assets/images/doctors/Avatar-20.png +0 -0
- package/src/assets/images/doctors/Avatar-21.png +0 -0
- package/src/assets/images/doctors/Avatar-3.png +0 -0
- package/src/assets/images/doctors/Avatar-4.png +0 -0
- package/src/assets/images/doctors/Avatar-5.png +0 -0
- package/src/assets/images/doctors/Avatar-6.png +0 -0
- package/src/assets/images/doctors/Avatar-7.png +0 -0
- package/src/assets/images/doctors/Avatar-8.png +0 -0
- package/src/assets/images/doctors/Avatar-9.png +0 -0
- package/src/assets/images/doctors/Avatar.png +0 -0
- package/src/assets/images/doctors/index.js +141 -0
- package/src/data/figma-variables.json +90305 -0
- package/src/index.js +20 -0
- package/src/index.scss +10 -0
- package/src/pages/AccordionDemo.jsx +206 -0
- package/src/pages/AccordionDemo.scss +34 -0
- package/src/pages/ActionMenuDemo.jsx +957 -0
- package/src/pages/ActionMenuDemo.scss +34 -0
- package/src/pages/AvatarDemo.jsx +328 -0
- package/src/pages/AvatarDemo.scss +40 -0
- package/src/pages/BadgeDemo.jsx +254 -0
- package/src/pages/BadgeDemo.scss +40 -0
- package/src/pages/BorderRadiusDemo.jsx +112 -0
- package/src/pages/BorderRadiusDemo.scss +50 -0
- package/src/pages/BrandingDemo.jsx +117 -0
- package/src/pages/BreadcrumbDemo.jsx +172 -0
- package/src/pages/ButtonDemo.jsx +708 -0
- package/src/pages/ButtonDemo.scss +34 -0
- package/src/pages/CheckboxDemo.jsx +194 -0
- package/src/pages/ChipDemo.jsx +359 -0
- package/src/pages/ChipDemo.scss +40 -0
- package/src/pages/ColorsDemo.jsx +566 -0
- package/src/pages/ColorsDemo.scss +243 -0
- package/src/pages/ComponentsUsage.jsx +401 -0
- package/src/pages/DatepickerDemo.jsx +223 -0
- package/src/pages/DividerDemo.jsx +337 -0
- package/src/pages/DotStatusDemo.jsx +223 -0
- package/src/pages/DropdownDemo.jsx +229 -0
- package/src/pages/FieldDemo.jsx +253 -0
- package/src/pages/FigmaVariablesDemo.jsx +426 -0
- package/src/pages/FigmaVariablesDemo.scss +316 -0
- package/src/pages/FileUploadDemo.jsx +186 -0
- package/src/pages/FlexDemo.jsx +144 -0
- package/src/pages/FlexDemo.scss +119 -0
- package/src/pages/FontInstallation.jsx +252 -0
- package/src/pages/FontInstallation.scss +40 -0
- package/src/pages/Home.jsx +3156 -0
- package/src/pages/IconDemo.jsx +1680 -0
- package/src/pages/ImageAspectDemo.jsx +152 -0
- package/src/pages/InputDemo.jsx +245 -0
- package/src/pages/Installation.jsx +257 -0
- package/src/pages/Installation.scss +40 -0
- package/src/pages/KeyDemo.jsx +184 -0
- package/src/pages/MenuDemo.jsx +139 -0
- package/src/pages/MicroCalendarDemo.jsx +165 -0
- package/src/pages/PaginationDemo.jsx +176 -0
- package/src/pages/PillToggleDemo.jsx +212 -0
- package/src/pages/ProgressCircleDemo.jsx +206 -0
- package/src/pages/ProgressIndicatorDemo.jsx +227 -0
- package/src/pages/RadioDemo.jsx +282 -0
- package/src/pages/ShadowsDemo.jsx +118 -0
- package/src/pages/ShadowsDemo.scss +93 -0
- package/src/pages/SliderDemo.jsx +226 -0
- package/src/pages/SpacingDemo.jsx +160 -0
- package/src/pages/SpacingDemo.scss +107 -0
- package/src/pages/StatusDemo.jsx +196 -0
- package/src/pages/StepsDemo.jsx +308 -0
- package/src/pages/TableDemo.jsx +376 -0
- package/src/pages/TabsDemo.jsx +221 -0
- package/src/pages/ToastDemo.jsx +195 -0
- package/src/pages/ToggleDemo.jsx +187 -0
- package/src/pages/TokensDemo.jsx +637 -0
- package/src/pages/TokensDemo.scss +270 -0
- package/src/pages/TokensUsage.jsx +220 -0
- package/src/pages/TooltipDemo.jsx +170 -0
- package/src/pages/TypographyDemo.jsx +229 -0
- package/src/pages/TypographyDemo.scss +105 -0
- package/src/pages/UtilitiesDemo.jsx +381 -0
- package/src/pages/UtilitiesDemo.scss +214 -0
- package/src/reportWebVitals.js +13 -0
- package/src/setupTests.js +5 -0
- package/src/styles/_typography.scss +932 -0
- package/src/styles/_utilities.scss +3635 -0
- package/src/styles/_variables.scss +887 -0
- package/src/styles/prism-custom.css +206 -0
- package/src/styles/prism-custom.css.map +1 -0
- package/src/styles/prism-custom.scss +205 -0
- package/src/styles/tokens.css +4416 -0
- package/src/styles/tokens.css.map +1 -0
- package/src/styles/tokens.scss +1456 -0
- package/src/ui/Accordion/Accordion.jsx +70 -0
- package/src/ui/Accordion/Accordion.scss +82 -0
- package/src/ui/Accordion/index.js +1 -0
- package/src/ui/ActionMenu/ActionMenu.jsx +383 -0
- package/src/ui/ActionMenu/ActionMenu.scss +198 -0
- package/src/ui/ActionMenu/index.js +1 -0
- package/src/ui/Avatar/Avatar.jsx +49 -0
- package/src/ui/Avatar/Avatar.scss +82 -0
- package/src/ui/Avatar/index.js +1 -0
- package/src/ui/Badge/Badge.jsx +64 -0
- package/src/ui/Badge/Badge.scss +84 -0
- package/src/ui/Badge/index.js +1 -0
- package/src/ui/Branding/Branding.jsx +65 -0
- package/src/ui/Branding/Branding.scss +116 -0
- package/src/ui/Branding/index.js +1 -0
- package/src/ui/Breadcrumb/Breadcrumb.jsx +162 -0
- package/src/ui/Breadcrumb/Breadcrumb.scss +46 -0
- package/src/ui/Breadcrumb/index.js +2 -0
- package/src/ui/Button/Button.figma.tsx +49 -0
- package/src/ui/Button/Button.jsx +135 -0
- package/src/ui/Button/Button.scss +188 -0
- package/src/ui/Button/index.js +1 -0
- package/src/ui/Card/Card.jsx +25 -0
- package/src/ui/Card/Card.scss +47 -0
- package/src/ui/Card/index.js +1 -0
- package/src/ui/Checkbox/Checkbox.jsx +70 -0
- package/src/ui/Checkbox/Checkbox.scss +96 -0
- package/src/ui/Checkbox/index.js +1 -0
- package/src/ui/Chip/Chip.jsx +104 -0
- package/src/ui/Chip/Chip.scss +118 -0
- package/src/ui/Chip/index.js +1 -0
- package/src/ui/CopyButton/CopyButton.jsx +102 -0
- package/src/ui/CopyButton/CopyButton.scss +56 -0
- package/src/ui/CopyButton/index.js +1 -0
- package/src/ui/Datepicker/Datepicker.jsx +326 -0
- package/src/ui/Datepicker/Datepicker.scss +187 -0
- package/src/ui/Datepicker/index.js +2 -0
- package/src/ui/Divider/Divider.jsx +89 -0
- package/src/ui/Divider/Divider.scss +112 -0
- package/src/ui/Divider/index.js +1 -0
- package/src/ui/DotStatus/DotStatus.jsx +64 -0
- package/src/ui/DotStatus/DotStatus.scss +87 -0
- package/src/ui/DotStatus/index.js +1 -0
- package/src/ui/Dropdown/Dropdown.jsx +200 -0
- package/src/ui/Dropdown/Dropdown.scss +156 -0
- package/src/ui/Dropdown/index.js +1 -0
- package/src/ui/Field/Field.jsx +89 -0
- package/src/ui/Field/Field.scss +119 -0
- package/src/ui/Field/index.js +1 -0
- package/src/ui/FileUpload/FileUpload.figma.tsx +28 -0
- package/src/ui/FileUpload/FileUpload.jsx +153 -0
- package/src/ui/FileUpload/FileUpload.scss +78 -0
- package/src/ui/FileUpload/index.js +2 -0
- package/src/ui/Flex/Flex.jsx +42 -0
- package/src/ui/Flex/Flex.scss +119 -0
- package/src/ui/Flex/index.js +1 -0
- package/src/ui/Icon/Icon.figma.tsx +22 -0
- package/src/ui/Icon/Icon.jsx +47 -0
- package/src/ui/Icon/index.js +1 -0
- package/src/ui/ImageAspect/ImageAspect.jsx +56 -0
- package/src/ui/ImageAspect/ImageAspect.scss +62 -0
- package/src/ui/ImageAspect/index.js +1 -0
- package/src/ui/Input/Input.figma.tsx +35 -0
- package/src/ui/Input/Input.jsx +68 -0
- package/src/ui/Input/Input.scss +64 -0
- package/src/ui/Input/index.js +2 -0
- package/src/ui/Key/Key.jsx +37 -0
- package/src/ui/Key/Key.scss +34 -0
- package/src/ui/Key/index.js +1 -0
- package/src/ui/Menu/Menu.jsx +389 -0
- package/src/ui/Menu/Menu.scss +382 -0
- package/src/ui/Menu/index.js +1 -0
- package/src/ui/MicroCalendar/MicroCalendar.jsx +392 -0
- package/src/ui/MicroCalendar/MicroCalendar.scss +277 -0
- package/src/ui/MicroCalendar/index.js +1 -0
- package/src/ui/Pagination/Pagination.jsx +237 -0
- package/src/ui/Pagination/Pagination.scss +182 -0
- package/src/ui/Pagination/index.js +1 -0
- package/src/ui/PillToggle/PillToggle.jsx +56 -0
- package/src/ui/PillToggle/PillToggle.scss +84 -0
- package/src/ui/PillToggle/index.js +1 -0
- package/src/ui/Playground/Playground.jsx +524 -0
- package/src/ui/Playground/Playground.scss +310 -0
- package/src/ui/Playground/index.js +2 -0
- package/src/ui/ProgressCircle/ProgressCircle.jsx +147 -0
- package/src/ui/ProgressCircle/ProgressCircle.scss +143 -0
- package/src/ui/ProgressCircle/index.js +1 -0
- package/src/ui/ProgressIndicator/ProgressIndicator.jsx +92 -0
- package/src/ui/ProgressIndicator/ProgressIndicator.scss +133 -0
- package/src/ui/ProgressIndicator/index.js +1 -0
- package/src/ui/Radio/Radio.jsx +57 -0
- package/src/ui/Radio/Radio.scss +84 -0
- package/src/ui/Radio/index.js +1 -0
- package/src/ui/Slider/Slider.jsx +283 -0
- package/src/ui/Slider/Slider.scss +156 -0
- package/src/ui/Slider/index.js +1 -0
- package/src/ui/Status/Status.jsx +66 -0
- package/src/ui/Status/Status.scss +90 -0
- package/src/ui/Status/index.js +1 -0
- package/src/ui/Steps/Steps.jsx +201 -0
- package/src/ui/Steps/Steps.scss +240 -0
- package/src/ui/Steps/index.js +1 -0
- package/src/ui/Table/Table.jsx +143 -0
- package/src/ui/Table/Table.scss +90 -0
- package/src/ui/Table/index.js +1 -0
- package/src/ui/Tabs/TabItem.jsx +86 -0
- package/src/ui/Tabs/Tabs.figma.tsx +30 -0
- package/src/ui/Tabs/Tabs.jsx +318 -0
- package/src/ui/Tabs/Tabs.scss +164 -0
- package/src/ui/Tabs/Untitled +1 -0
- package/src/ui/Tabs/index.js +3 -0
- package/src/ui/Tag/Tag.figma.tsx +29 -0
- package/src/ui/Tag/Tag.jsx +93 -0
- package/src/ui/Tag/Tag.scss +229 -0
- package/src/ui/Tag/index.js +2 -0
- package/src/ui/Textarea/Textarea.figma.tsx +35 -0
- package/src/ui/Textarea/Textarea.jsx +68 -0
- package/src/ui/Textarea/Textarea.scss +69 -0
- package/src/ui/Textarea/index.js +2 -0
- package/src/ui/Toast/Toast.jsx +75 -0
- package/src/ui/Toast/Toast.scss +132 -0
- package/src/ui/Toast/index.js +2 -0
- package/src/ui/Toggle/Toggle.jsx +73 -0
- package/src/ui/Toggle/Toggle.scss +139 -0
- package/src/ui/Toggle/index.js +1 -0
- package/src/ui/Tooltip/Tooltip.figma.tsx +24 -0
- package/src/ui/Tooltip/Tooltip.jsx +123 -0
- package/src/ui/Tooltip/Tooltip.scss +80 -0
- package/src/ui/Tooltip/index.js +2 -0
- package/src/ui/index.js +63 -0
- package/src/utils/formatDate.js +27 -0
- package/src/utils/headerVariants.js +69 -0
- 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
|
+
}
|