@react-ui-org/react-ui 0.42.0 → 0.44.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/CONTRIBUTING.md +44 -25
- package/README.md +1 -1
- package/dist/lib.development.js +1598 -652
- package/dist/lib.js +1 -9
- package/package.json +49 -48
- package/src/lib/components/{ui/Alert → Alert}/Alert.jsx +17 -14
- package/src/lib/components/{ui/Alert → Alert}/Alert.scss +3 -3
- package/src/lib/components/{ui/Alert → Alert}/README.mdx +6 -6
- package/src/lib/components/{ui/Alert → Alert}/_settings.scss +1 -1
- package/src/lib/components/{ui/Alert → Alert}/_theme.scss +0 -0
- package/src/lib/components/{ui/Alert → Alert}/_tools.scss +0 -0
- package/src/lib/components/{ui/Alert → Alert}/index.js +0 -0
- package/src/lib/components/{ui/Badge → Badge}/Badge.jsx +2 -2
- package/src/lib/components/{ui/Badge → Badge}/Badge.scss +3 -3
- package/src/lib/components/{ui/Badge → Badge}/README.mdx +3 -3
- package/src/lib/components/{ui/Badge → Badge}/index.js +0 -0
- package/src/lib/components/Button/Button.jsx +198 -0
- package/src/lib/components/{ui/Button → Button}/Button.scss +0 -0
- package/src/lib/components/{ui/Button → Button}/README.mdx +160 -75
- package/src/lib/components/Button/_base.scss +148 -0
- package/src/lib/components/{ui/Button → Button}/_priorities.scss +0 -4
- package/src/lib/components/{ui/Button → Button}/_settings.scss +2 -3
- package/src/lib/components/{ui/Button → Button}/_theme.scss +3 -11
- package/src/lib/components/{ui/Button → Button}/_tools.scss +27 -44
- package/src/lib/components/Button/helpers/getRootLabelVisibilityClassName.js +33 -0
- package/src/lib/components/{ui/Button → Button}/helpers/getRootPriorityClassName.js +0 -4
- package/src/lib/components/{ui/Button → Button}/index.js +0 -0
- package/src/lib/components/{ui/ButtonGroup → ButtonGroup}/ButtonGroup.jsx +9 -11
- package/src/lib/components/{ui/ButtonGroup → ButtonGroup}/ButtonGroup.scss +0 -0
- package/src/lib/components/ButtonGroup/ButtonGroupContext.js +3 -0
- package/src/lib/components/{ui/ButtonGroup → ButtonGroup}/README.mdx +26 -2
- package/src/lib/components/ButtonGroup/index.js +2 -0
- package/src/lib/components/{layout/CTA → CTA}/CTA.jsx +5 -2
- package/src/lib/components/{layout/CTA → CTA}/CTA.scss +2 -2
- package/src/lib/components/{layout/CTA → CTA}/CTACenter.jsx +1 -1
- package/src/lib/components/{layout/CTA → CTA}/CTAEnd.jsx +1 -1
- package/src/lib/components/{layout/CTA → CTA}/CTAStart.jsx +1 -1
- package/src/lib/components/{layout/CTA → CTA}/README.mdx +3 -3
- package/src/lib/components/{layout/CTA → CTA}/index.js +0 -0
- package/src/lib/components/{ui/Card → Card}/Card.jsx +6 -4
- package/src/lib/components/{ui/Card → Card}/Card.scss +1 -1
- package/src/lib/components/{ui/Card → Card}/CardBody.jsx +1 -1
- package/src/lib/components/{ui/Card → Card}/CardFooter.jsx +1 -1
- package/src/lib/components/{ui/Card → Card}/README.mdx +2 -2
- package/src/lib/components/{ui/Card → Card}/_theme.scss +0 -0
- package/src/lib/components/{ui/Card → Card}/_tools.scss +0 -0
- package/src/lib/components/{ui/Card → Card}/index.js +0 -0
- package/src/lib/components/{layout/Center → Center}/Center.jsx +1 -1
- package/src/lib/components/{layout/Center → Center}/Center.scss +0 -0
- package/src/lib/components/{layout/Center → Center}/README.mdx +2 -2
- package/src/lib/components/{layout/Center → Center}/index.js +0 -0
- package/src/lib/components/CheckboxField/CheckboxField.jsx +164 -0
- package/src/lib/components/{ui/CheckboxField → CheckboxField}/CheckboxField.scss +5 -5
- package/src/lib/components/{ui/CheckboxField → CheckboxField}/README.mdx +15 -12
- package/src/lib/components/{ui/CheckboxField → CheckboxField}/index.js +0 -0
- package/src/lib/components/FileInputField/FileInputField.jsx +162 -0
- package/src/lib/components/{ui/FileInputField → FileInputField}/FileInputField.scss +5 -5
- package/src/lib/components/{ui/FileInputField → FileInputField}/README.mdx +8 -6
- package/src/lib/components/{ui/FileInputField → FileInputField}/index.js +0 -0
- package/src/lib/components/{layout/FormLayout → FormLayout}/FormLayout.jsx +16 -18
- package/src/lib/components/{layout/FormLayout → FormLayout}/FormLayout.scss +3 -3
- package/src/lib/components/FormLayout/FormLayoutContext.js +3 -0
- package/src/lib/components/{layout/FormLayout → FormLayout}/FormLayoutCustomField.jsx +33 -30
- package/src/lib/components/{layout/FormLayout → FormLayout}/FormLayoutCustomField.scss +4 -4
- package/src/lib/components/{layout/FormLayout → FormLayout}/README.mdx +30 -40
- package/src/lib/components/{layout/FormLayout → FormLayout}/_theme.scss +0 -0
- package/src/lib/components/{layout/FormLayout → FormLayout}/index.js +1 -0
- package/src/lib/components/{layout/Grid → Grid}/Grid.jsx +23 -5
- package/src/lib/components/{layout/Grid → Grid}/Grid.scss +2 -4
- package/src/lib/components/{layout/Grid → Grid}/GridSpan.jsx +10 -3
- package/src/lib/components/{layout/Grid → Grid}/README.mdx +42 -38
- package/src/lib/components/{layout/Grid → Grid}/_theme.scss +1 -2
- package/src/lib/components/{layout/Grid → Grid}/_tools.scss +2 -2
- package/src/lib/components/{layout/Grid → Grid}/helpers/generateResponsiveCustomProperties.js +0 -0
- package/src/lib/components/{layout/Grid → Grid}/index.js +0 -0
- package/src/lib/components/Link/Link.jsx +45 -0
- package/src/lib/components/Link/Link.scss +11 -0
- package/src/lib/components/Link/README.mdx +85 -0
- package/src/lib/components/Link/_theme.scss +4 -0
- package/src/lib/components/Link/index.js +1 -0
- package/src/lib/components/{layout/List → List}/List.jsx +1 -1
- package/src/lib/components/{layout/List → List}/List.scss +2 -2
- package/src/lib/components/{layout/List → List}/ListItem.jsx +1 -1
- package/src/lib/components/{layout/List → List}/README.mdx +2 -2
- package/src/lib/components/{layout/List → List}/_theme.scss +0 -0
- package/src/lib/components/{layout/List → List}/index.js +0 -0
- package/src/lib/components/{layout/Media → Media}/Media.jsx +4 -2
- package/src/lib/components/{layout/Media → Media}/Media.scss +1 -1
- package/src/lib/components/{layout/Media → Media}/MediaBody.jsx +1 -1
- package/src/lib/components/{layout/Media → Media}/MediaObject.jsx +1 -1
- package/src/lib/components/{layout/Media → Media}/README.mdx +2 -2
- package/src/lib/components/{layout/Media → Media}/index.js +0 -0
- package/src/lib/components/{ui/Modal → Modal}/Modal.jsx +28 -27
- package/src/lib/components/{ui/Modal → Modal}/Modal.scss +5 -5
- package/src/lib/components/{ui/Modal → Modal}/README.mdx +40 -40
- package/src/lib/components/{ui/Modal → Modal}/_settings.scss +4 -4
- package/src/lib/components/{ui/Modal → Modal}/_theme.scss +0 -0
- package/src/lib/components/{ui/Modal → Modal}/index.js +0 -0
- package/src/lib/components/{ui/Paper → Paper}/Paper.jsx +8 -1
- package/src/lib/components/{ui/Paper → Paper}/Paper.scss +5 -0
- package/src/lib/components/{ui/Paper → Paper}/README.mdx +14 -2
- package/src/lib/components/{ui/Paper → Paper}/_theme.scss +2 -0
- package/src/lib/components/{ui/Paper → Paper}/index.js +0 -0
- package/src/lib/components/{ui/Radio → Radio}/README.mdx +17 -14
- package/src/lib/components/Radio/Radio.jsx +188 -0
- package/src/lib/components/{ui/Radio → Radio}/Radio.scss +9 -9
- package/src/lib/components/{ui/Radio → Radio}/index.js +0 -0
- package/src/lib/components/{ui/ScrollView → ScrollView}/README.mdx +10 -10
- package/src/lib/components/{ui/ScrollView → ScrollView}/ScrollView.jsx +9 -10
- package/src/lib/components/{ui/ScrollView → ScrollView}/ScrollView.scss +6 -6
- package/src/lib/components/{ui/ScrollView → ScrollView}/_theme.scss +0 -0
- package/src/lib/components/{ui/ScrollView → ScrollView}/index.js +0 -0
- package/src/lib/components/{ui/SelectField → SelectField}/README.mdx +44 -41
- package/src/lib/components/SelectField/SelectField.jsx +219 -0
- package/src/lib/components/{ui/SelectField → SelectField}/SelectField.scss +6 -6
- package/src/lib/components/{ui/SelectField → SelectField}/index.js +0 -0
- package/src/lib/components/{ui/Table → Table}/README.mdx +7 -7
- package/src/lib/components/{ui/Table → Table}/Table.jsx +9 -13
- package/src/lib/components/{ui/Table → Table}/Table.scss +1 -1
- package/src/lib/components/{ui/Table → Table}/_settings.scss +4 -4
- package/src/lib/components/{ui/Table → Table}/index.js +0 -0
- package/src/lib/components/{ui/Tabs → Tabs}/README.mdx +3 -3
- package/src/lib/components/{ui/Tabs → Tabs}/Tabs.jsx +4 -4
- package/src/lib/components/{ui/Tabs → Tabs}/Tabs.scss +1 -1
- package/src/lib/components/{ui/Tabs → Tabs}/TabsItem.jsx +4 -3
- package/src/lib/components/{ui/Tabs → Tabs}/TabsItem.scss +3 -3
- package/src/lib/components/{ui/Tabs → Tabs}/_theme.scss +0 -0
- package/src/lib/components/{ui/Tabs → Tabs}/index.js +0 -0
- package/src/lib/components/{ui/Text → Text}/README.mdx +19 -19
- package/src/lib/components/{ui/Text → Text}/Text.jsx +1 -1
- package/src/lib/components/{ui/Text → Text}/Text.scss +0 -0
- package/src/lib/components/{ui/Text → Text}/helpers/getRootHyphensClassName.js +0 -0
- package/src/lib/components/{ui/Text → Text}/helpers/getRootWordWrappingClassName.js +0 -0
- package/src/lib/components/{ui/Text → Text}/index.js +0 -0
- package/src/lib/components/{ui/TextArea → TextArea}/README.mdx +8 -6
- package/src/lib/components/{ui/TextArea → TextArea}/TextArea.jsx +78 -78
- package/src/lib/components/{ui/TextArea → TextArea}/TextArea.scss +6 -6
- package/src/lib/components/{ui/TextArea → TextArea}/index.js +0 -0
- package/src/lib/components/{ui/TextField → TextField}/README.mdx +7 -6
- package/src/lib/components/{ui/TextField → TextField}/TextField.jsx +20 -23
- package/src/lib/components/{ui/TextField → TextField}/TextField.scss +6 -6
- package/src/lib/components/{ui/TextField → TextField}/index.js +0 -0
- package/src/lib/components/{ui/Toggle → Toggle}/README.mdx +15 -12
- package/src/lib/components/Toggle/Toggle.jsx +163 -0
- package/src/lib/components/{ui/Toggle → Toggle}/Toggle.scss +5 -5
- package/src/lib/components/{ui/Toggle → Toggle}/index.js +0 -0
- package/src/lib/components/{layout/Toolbar → Toolbar}/README.mdx +26 -26
- package/src/lib/components/{layout/Toolbar → Toolbar}/Toolbar.jsx +1 -1
- package/src/lib/components/{layout/Toolbar → Toolbar}/Toolbar.scss +1 -1
- package/src/lib/components/{layout/Toolbar → Toolbar}/ToolbarGroup.jsx +1 -1
- package/src/lib/components/{layout/Toolbar → Toolbar}/ToolbarItem.jsx +1 -1
- package/src/lib/components/{layout/Toolbar → Toolbar}/_theme.scss +0 -0
- package/src/lib/components/{layout/Toolbar → Toolbar}/index.js +0 -0
- package/src/lib/components/{ui/withForwardedRef.jsx → withForwardedRef.jsx} +0 -0
- package/src/lib/helpers/resolveContextOrProp.js +7 -0
- package/src/lib/index.js +34 -35
- package/src/lib/styles/tools/_accessibility.scss +9 -0
- package/src/lib/theme.scss +25 -7
- package/src/lib/components/ui/Button/Button.jsx +0 -191
- package/src/lib/components/ui/Button/_base.scss +0 -154
- package/src/lib/components/ui/Button/helpers/getRootLabelVisibilityClassName.js +0 -11
- package/src/lib/components/ui/ButtonGroup/index.js +0 -1
- package/src/lib/components/ui/CheckboxField/CheckboxField.jsx +0 -173
- package/src/lib/components/ui/FileInputField/FileInputField.jsx +0 -158
- package/src/lib/components/ui/Radio/Radio.jsx +0 -179
- package/src/lib/components/ui/SelectField/SelectField.jsx +0 -214
- package/src/lib/components/ui/Toggle/Toggle.jsx +0 -174
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: Button
|
|
3
|
-
menu: '
|
|
4
|
-
route: /components/
|
|
3
|
+
menu: 'Actions'
|
|
4
|
+
route: /components/button
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Button
|
|
@@ -10,8 +10,8 @@ import {
|
|
|
10
10
|
Playground,
|
|
11
11
|
Props,
|
|
12
12
|
} from 'docz'
|
|
13
|
-
import Icon from '
|
|
14
|
-
import Placeholder from '
|
|
13
|
+
import Icon from '../../../docs/_components/Icon'
|
|
14
|
+
import Placeholder from '../../../docs/_components/Placeholder'
|
|
15
15
|
import Badge from '../Badge'
|
|
16
16
|
import { Button } from './Button'
|
|
17
17
|
|
|
@@ -55,9 +55,6 @@ lowest:
|
|
|
55
55
|
All priorities come in supported
|
|
56
56
|
[component colors](/foundation/colors#component-colors).
|
|
57
57
|
|
|
58
|
-
To complete the list, there is also a [link priority](#link)
|
|
59
|
-
which is reserved for special cases.
|
|
60
|
-
|
|
61
58
|
### Filled
|
|
62
59
|
|
|
63
60
|
The default, high-emphasis priority should be used for primary actions of your
|
|
@@ -121,21 +118,6 @@ the content.
|
|
|
121
118
|
<Button priority="flat" label="Dark" color="dark" />
|
|
122
119
|
</Playground>
|
|
123
120
|
|
|
124
|
-
### Link
|
|
125
|
-
|
|
126
|
-
Link button is more a workaround than a priority level. Use it for what needs
|
|
127
|
-
to appear as navigation to users but where a button must be used due to
|
|
128
|
-
technical reasons. Under normal circumstances, you should always use a link
|
|
129
|
-
HTML element `<a href="…">` for navigation.
|
|
130
|
-
|
|
131
|
-
⚠️ **Avoid using link buttons for actions**, choose flat or outline priority
|
|
132
|
-
instead. This is because users expect navigation to happen when clicking on
|
|
133
|
-
something what looks like a link.
|
|
134
|
-
|
|
135
|
-
<Playground>
|
|
136
|
-
<Button label="Link that needs to be implemented as button" priority="link" />
|
|
137
|
-
</Playground>
|
|
138
|
-
|
|
139
121
|
## Sizes
|
|
140
122
|
|
|
141
123
|
Aside from the default (medium) size, two additional sizes are available: small
|
|
@@ -170,29 +152,55 @@ before or after the button's label.
|
|
|
170
152
|
label="Icon after label"
|
|
171
153
|
afterLabel={<Icon icon="star" />}
|
|
172
154
|
/>
|
|
173
|
-
<Button
|
|
174
|
-
label="Link button with icon"
|
|
175
|
-
beforeLabel={<Icon icon="star" />}
|
|
176
|
-
priority="link"
|
|
177
|
-
/>
|
|
178
155
|
</Playground>
|
|
179
156
|
|
|
180
157
|
### Icon Buttons
|
|
181
158
|
|
|
182
159
|
For clear and simple actions, buttons can visually consist just of an icon.
|
|
183
|
-
Label remains mandatory to keep the button accessible.
|
|
184
|
-
optionally enhance on desktop and display the label once there is enough room
|
|
185
|
-
for it.
|
|
160
|
+
Label remains mandatory to keep the button accessible.
|
|
186
161
|
|
|
187
162
|
<Playground>
|
|
188
163
|
<Button
|
|
189
164
|
label="Icon button"
|
|
190
165
|
labelVisibility="none"
|
|
191
|
-
|
|
166
|
+
beforeLabel={<Icon icon="pencil" />}
|
|
167
|
+
/>
|
|
168
|
+
</Playground>
|
|
169
|
+
|
|
170
|
+
Icon buttons can optionally enhance on a [breakpoint](/foundation/breakpoints)
|
|
171
|
+
of your choice and display label once you know there is enough room for it.
|
|
172
|
+
|
|
173
|
+
📐 Try resizing your browser to see how label visibility changes.
|
|
174
|
+
|
|
175
|
+
<Playground>
|
|
176
|
+
<Button
|
|
177
|
+
label="Label visible from sm up"
|
|
178
|
+
labelVisibility="sm"
|
|
179
|
+
beforeLabel={<Icon icon="pencil" />}
|
|
180
|
+
/>
|
|
181
|
+
<Button
|
|
182
|
+
label="Label visible from md up"
|
|
183
|
+
labelVisibility="md"
|
|
184
|
+
beforeLabel={<Icon icon="pencil" />}
|
|
185
|
+
/>
|
|
186
|
+
<Button
|
|
187
|
+
label="Label visible from lg up"
|
|
188
|
+
labelVisibility="lg"
|
|
189
|
+
beforeLabel={<Icon icon="pencil" />}
|
|
190
|
+
/>
|
|
191
|
+
<Button
|
|
192
|
+
label="Label visible from xl up"
|
|
193
|
+
labelVisibility="xl"
|
|
194
|
+
beforeLabel={<Icon icon="pencil" />}
|
|
195
|
+
/>
|
|
196
|
+
<Button
|
|
197
|
+
label="Label visible from xxl up"
|
|
198
|
+
labelVisibility="xxl"
|
|
199
|
+
beforeLabel={<Icon icon="pencil" />}
|
|
192
200
|
/>
|
|
193
201
|
<Button
|
|
194
|
-
label="
|
|
195
|
-
labelVisibility="
|
|
202
|
+
label="Label visible from xxxl up"
|
|
203
|
+
labelVisibility="xxxl"
|
|
196
204
|
beforeLabel={<Icon icon="pencil" />}
|
|
197
205
|
/>
|
|
198
206
|
</Playground>
|
|
@@ -237,7 +245,7 @@ Badges play nicely with icon buttons, too:
|
|
|
237
245
|
/>
|
|
238
246
|
<Button
|
|
239
247
|
label="Icon button with badge"
|
|
240
|
-
labelVisibility="
|
|
248
|
+
labelVisibility="md"
|
|
241
249
|
priority="outline"
|
|
242
250
|
beforeLabel={<Icon icon="warning-sign" />}
|
|
243
251
|
startCorner={<Badge label={3} color="danger" />}
|
|
@@ -256,46 +264,127 @@ Disabled state makes the action unavailable.
|
|
|
256
264
|
<Button label="Disabled flat button" priority="flat" disabled />
|
|
257
265
|
</Playground>
|
|
258
266
|
|
|
259
|
-
###
|
|
267
|
+
### Feedback State
|
|
268
|
+
|
|
269
|
+
When user's action triggers an asynchronous process on background, the button's
|
|
270
|
+
feedback state can be indicated by showing an icon. The icon replaces button's
|
|
271
|
+
label while retaining original dimensions of the button. Buttons in feedback
|
|
272
|
+
state are automatically disabled to prevent unwanted interaction.
|
|
260
273
|
|
|
261
|
-
|
|
262
|
-
loading state can be indicated by showing a loading icon. Buttons in loading
|
|
263
|
-
state are automatically made disabled to prevent unwanted interaction.
|
|
274
|
+
Filled buttons in feedback state:
|
|
264
275
|
|
|
265
276
|
<Playground>
|
|
266
277
|
<Button
|
|
267
|
-
label="
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
<Icon icon="loading" />
|
|
271
|
-
</span>
|
|
272
|
-
)}
|
|
278
|
+
label="Success"
|
|
279
|
+
color="success"
|
|
280
|
+
feedbackIcon={<Icon icon="success" />}
|
|
273
281
|
/>
|
|
274
282
|
<Button
|
|
275
|
-
label="
|
|
283
|
+
label="Success"
|
|
276
284
|
labelVisibility="none"
|
|
277
|
-
|
|
278
|
-
|
|
285
|
+
color="success"
|
|
286
|
+
feedbackIcon={<Icon icon="success" />}
|
|
287
|
+
endCorner={<Badge color="danger" label={3} />}
|
|
288
|
+
/>
|
|
289
|
+
<Placeholder dark inline>
|
|
290
|
+
<Button
|
|
291
|
+
label="Light"
|
|
292
|
+
color="light"
|
|
293
|
+
feedbackIcon={<Icon icon="success" />}
|
|
294
|
+
/>
|
|
295
|
+
</Placeholder>
|
|
296
|
+
<Button
|
|
297
|
+
label="Dark"
|
|
298
|
+
color="dark"
|
|
299
|
+
feedbackIcon={<Icon icon="success" />}
|
|
300
|
+
/>
|
|
301
|
+
<Button
|
|
302
|
+
label="Primary"
|
|
303
|
+
feedbackIcon={(
|
|
279
304
|
<span className="d-inline-flex animation-spin-counterclockwise">
|
|
280
305
|
<Icon icon="loading" />
|
|
281
306
|
</span>
|
|
282
307
|
)}
|
|
283
308
|
/>
|
|
309
|
+
</Playground>
|
|
310
|
+
|
|
311
|
+
Outline buttons in feedback state:
|
|
312
|
+
|
|
313
|
+
<Playground>
|
|
314
|
+
<Button
|
|
315
|
+
label="Success"
|
|
316
|
+
priority="outline"
|
|
317
|
+
color="success"
|
|
318
|
+
feedbackIcon={<Icon icon="success" />}
|
|
319
|
+
/>
|
|
284
320
|
<Button
|
|
285
|
-
label="
|
|
286
|
-
labelVisibility="
|
|
287
|
-
|
|
288
|
-
|
|
321
|
+
label="Success"
|
|
322
|
+
labelVisibility="none"
|
|
323
|
+
priority="outline"
|
|
324
|
+
color="success"
|
|
325
|
+
feedbackIcon={<Icon icon="success" />}
|
|
326
|
+
endCorner={<Badge color="danger" label={3} />}
|
|
327
|
+
/>
|
|
328
|
+
<Placeholder dark inline>
|
|
329
|
+
<Button
|
|
330
|
+
label="Light"
|
|
331
|
+
priority="outline"
|
|
332
|
+
color="light"
|
|
333
|
+
feedbackIcon={<Icon icon="success" />}
|
|
334
|
+
/>
|
|
335
|
+
</Placeholder>
|
|
336
|
+
<Button
|
|
337
|
+
label="Dark"
|
|
338
|
+
priority="outline"
|
|
339
|
+
color="dark"
|
|
340
|
+
feedbackIcon={<Icon icon="success" />}
|
|
341
|
+
/>
|
|
342
|
+
<Button
|
|
343
|
+
label="Primary"
|
|
344
|
+
priority="outline"
|
|
345
|
+
feedbackIcon={(
|
|
289
346
|
<span className="d-inline-flex animation-spin-counterclockwise">
|
|
290
347
|
<Icon icon="loading" />
|
|
291
348
|
</span>
|
|
292
349
|
)}
|
|
293
|
-
|
|
350
|
+
/>
|
|
351
|
+
</Playground>
|
|
352
|
+
|
|
353
|
+
Flat buttons in feedback state:
|
|
354
|
+
|
|
355
|
+
<Playground>
|
|
356
|
+
<Button
|
|
357
|
+
label="Success"
|
|
358
|
+
priority="flat"
|
|
359
|
+
color="success"
|
|
360
|
+
feedbackIcon={<Icon icon="success" />}
|
|
361
|
+
/>
|
|
362
|
+
<Button
|
|
363
|
+
label="Success"
|
|
364
|
+
labelVisibility="none"
|
|
365
|
+
priority="flat"
|
|
366
|
+
color="success"
|
|
367
|
+
feedbackIcon={<Icon icon="success" />}
|
|
368
|
+
endCorner={<Badge color="danger" label={3} />}
|
|
369
|
+
/>
|
|
370
|
+
<Placeholder dark inline>
|
|
371
|
+
<Button
|
|
372
|
+
label="Light"
|
|
373
|
+
priority="flat"
|
|
374
|
+
color="light"
|
|
375
|
+
feedbackIcon={<Icon icon="success" />}
|
|
376
|
+
/>
|
|
377
|
+
</Placeholder>
|
|
378
|
+
<Button
|
|
379
|
+
label="Dark"
|
|
380
|
+
priority="flat"
|
|
381
|
+
color="dark"
|
|
382
|
+
feedbackIcon={<Icon icon="success" />}
|
|
294
383
|
/>
|
|
295
384
|
<Button
|
|
296
|
-
label="
|
|
297
|
-
|
|
298
|
-
|
|
385
|
+
label="Primary"
|
|
386
|
+
priority="flat"
|
|
387
|
+
feedbackIcon={(
|
|
299
388
|
<span className="d-inline-flex animation-spin-counterclockwise">
|
|
300
389
|
<Icon icon="loading" />
|
|
301
390
|
</span>
|
|
@@ -308,9 +397,10 @@ animation is made.
|
|
|
308
397
|
|
|
309
398
|
## API
|
|
310
399
|
|
|
311
|
-
In addition to the options below, you can
|
|
312
|
-
interfere with the API, and they will be
|
|
313
|
-
|
|
400
|
+
In addition to the options below, you can specify [React synthetic events] or
|
|
401
|
+
any custom HTML attributes that do not interfere with the API, and they will be
|
|
402
|
+
passed to the `button` HTML element. This enables making the component
|
|
403
|
+
interactive and helps improve its accessibility.
|
|
314
404
|
|
|
315
405
|
<Props table of={Button} />
|
|
316
406
|
|
|
@@ -318,9 +408,6 @@ This is useful mainly to improve component's accessibility.
|
|
|
318
408
|
|
|
319
409
|
### Common Theming Options
|
|
320
410
|
|
|
321
|
-
The following theme options are common to all priorities and color variants
|
|
322
|
-
**except** the `link` priority (see [below for more](#link-priority)):
|
|
323
|
-
|
|
324
411
|
| Custom Property | Description |
|
|
325
412
|
|--------------------------------|----------------------------------------------|
|
|
326
413
|
| `--rui-Button__font-weight` | Font weight |
|
|
@@ -351,20 +438,6 @@ Where:
|
|
|
351
438
|
- `color`, `border-color`, or `background` for the `outline` priority,
|
|
352
439
|
- `color` or `background` for the `flat` priority.
|
|
353
440
|
|
|
354
|
-
#### Theming Link Priority
|
|
355
|
-
|
|
356
|
-
The `link` priority is treated a bit different because from the theming point of
|
|
357
|
-
view it doesn't share anything with other priorities. However, it shares
|
|
358
|
-
everything with common links and thus can be adjusted by editing corresponding
|
|
359
|
-
design tokens:
|
|
360
|
-
|
|
361
|
-
| Custom Property | Description |
|
|
362
|
-
|-------------------------------|----------------------------------------------|
|
|
363
|
-
| `--rui-link-color` | Text color |
|
|
364
|
-
| `--rui-link-decoration` | Text decoration, e.g. underline |
|
|
365
|
-
| `--rui-link-hover-color` | Text color on hover |
|
|
366
|
-
| `--rui-link-hover-decoration` | Text decoration on hover |
|
|
367
|
-
|
|
368
441
|
### Theming Sizes
|
|
369
442
|
|
|
370
443
|
Available sizes can be adjusted as follows:
|
|
@@ -470,3 +543,15 @@ Example:
|
|
|
470
543
|
/>
|
|
471
544
|
</div>
|
|
472
545
|
</Playground>
|
|
546
|
+
|
|
547
|
+
### Theming Feedback State
|
|
548
|
+
|
|
549
|
+
Similarly to disabled state, opacity and cursor can be set for buttons in
|
|
550
|
+
feedback state.
|
|
551
|
+
|
|
552
|
+
| Custom Property | Description |
|
|
553
|
+
|-----------------------------------|------------------------------------------------------|
|
|
554
|
+
| `--rui-Button--feedback__opacity` | Opacity of buttons in feedback state |
|
|
555
|
+
| `--rui-Button--feedback__cursor` | Cursor to show on hovering buttons in feedback state |
|
|
556
|
+
|
|
557
|
+
[React synthetic events]: https://reactjs.org/docs/events.html
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
@use 'sass:map';
|
|
2
|
+
@use '../../styles/tools/breakpoint';
|
|
3
|
+
@use 'settings';
|
|
4
|
+
@use 'theme';
|
|
5
|
+
@use 'tools';
|
|
6
|
+
|
|
7
|
+
.root {
|
|
8
|
+
@include tools.button();
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.label {
|
|
12
|
+
display: block;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.beforeLabel,
|
|
16
|
+
.afterLabel,
|
|
17
|
+
.startCorner,
|
|
18
|
+
.endCorner,
|
|
19
|
+
.feedbackIcon {
|
|
20
|
+
display: flex;
|
|
21
|
+
align-items: baseline;
|
|
22
|
+
justify-content: center;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.startCorner,
|
|
26
|
+
.endCorner {
|
|
27
|
+
position: absolute;
|
|
28
|
+
top: -0.35rem;
|
|
29
|
+
z-index: 2;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.startCorner {
|
|
33
|
+
left: 0;
|
|
34
|
+
margin-left: -0.35rem;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.endCorner {
|
|
38
|
+
right: 0;
|
|
39
|
+
margin-right: -0.35rem;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.feedbackIcon {
|
|
43
|
+
position: absolute;
|
|
44
|
+
top: 0;
|
|
45
|
+
right: 0;
|
|
46
|
+
bottom: 0;
|
|
47
|
+
left: 0;
|
|
48
|
+
z-index: 1;
|
|
49
|
+
align-items: center;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.rootSizeSmall {
|
|
53
|
+
@include tools.button-size(small);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.rootSizeMedium {
|
|
57
|
+
@include tools.button-size(medium);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.rootSizeLarge {
|
|
61
|
+
@include tools.button-size(large);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.rootBlock {
|
|
65
|
+
width: 100%;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.hasRootFeedback:disabled {
|
|
69
|
+
opacity: theme.$feedback-opacity;
|
|
70
|
+
cursor: theme.$feedback-cursor;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.hasRootFeedback .label,
|
|
74
|
+
.hasRootFeedback .beforeLabel,
|
|
75
|
+
.hasRootFeedback .afterLabel {
|
|
76
|
+
color: transparent;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.rootGrouped {
|
|
80
|
+
z-index: map.get(settings.$group-z-indexes, button);
|
|
81
|
+
|
|
82
|
+
&:not(:first-child) {
|
|
83
|
+
margin-left: var(--local-gap);
|
|
84
|
+
border-top-left-radius: 0;
|
|
85
|
+
border-bottom-left-radius: 0;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
&:not(:last-child) {
|
|
89
|
+
border-top-right-radius: 0;
|
|
90
|
+
border-bottom-right-radius: 0;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
&:focus,
|
|
94
|
+
&:not(:disabled):hover {
|
|
95
|
+
z-index: map.get(settings.$group-z-indexes, button-hover);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.rootGrouped .startCorner,
|
|
100
|
+
.rootGrouped .endCorner {
|
|
101
|
+
z-index: map.get(settings.$group-z-indexes, button-overflowing-elements);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.withLabelHidden,
|
|
105
|
+
.withLabelVisibleSm,
|
|
106
|
+
.withLabelVisibleMd,
|
|
107
|
+
.withLabelVisibleLg,
|
|
108
|
+
.withLabelVisibleXl,
|
|
109
|
+
.withLabelVisibleXxl,
|
|
110
|
+
.withLabelVisibleXxxl {
|
|
111
|
+
@include tools.hide-label();
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.withLabelVisibleSm {
|
|
115
|
+
@include breakpoint.up(sm) {
|
|
116
|
+
@include tools.show-label();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.withLabelVisibleMd {
|
|
121
|
+
@include breakpoint.up(md) {
|
|
122
|
+
@include tools.show-label();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.withLabelVisibleLg {
|
|
127
|
+
@include breakpoint.up(lg) {
|
|
128
|
+
@include tools.show-label();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.withLabelVisibleXl {
|
|
133
|
+
@include breakpoint.up(xl) {
|
|
134
|
+
@include tools.show-label();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.withLabelVisibleXxl {
|
|
139
|
+
@include breakpoint.up(xxl) {
|
|
140
|
+
@include tools.show-label();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.withLabelVisibleXxxl {
|
|
145
|
+
@include breakpoint.up(xxxl) {
|
|
146
|
+
@include tools.show-label();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
@@ -123,10 +123,6 @@
|
|
|
123
123
|
@include tools.button-color(flat, dark);
|
|
124
124
|
}
|
|
125
125
|
|
|
126
|
-
.rootPriorityLink {
|
|
127
|
-
@include tools.button-link();
|
|
128
|
-
}
|
|
129
|
-
|
|
130
126
|
.rootPriorityFilled.rootGrouped:not(:first-child)::before,
|
|
131
127
|
.rootPriorityFlat.rootGrouped:not(:first-child)::before {
|
|
132
128
|
content: '';
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
@use '
|
|
2
|
-
@use '
|
|
1
|
+
@use '../../styles/theme/typography';
|
|
2
|
+
@use '../../styles/tools/spacing';
|
|
3
3
|
|
|
4
4
|
$font-family: typography.$font-family-base;
|
|
5
5
|
$line-height: typography.$line-height-base;
|
|
6
6
|
$icon-spacing: spacing.of(2);
|
|
7
|
-
$breakpoint: lg;
|
|
8
7
|
|
|
9
8
|
$group-z-indexes: (
|
|
10
9
|
button: auto,
|
|
@@ -6,8 +6,11 @@ $letter-spacing: var(--rui-Button__letter-spacing);
|
|
|
6
6
|
$text-transform: var(--rui-Button__text-transform);
|
|
7
7
|
$border-width: var(--rui-Button__border-width);
|
|
8
8
|
$border-radius: var(--rui-Button__border-radius);
|
|
9
|
+
|
|
9
10
|
$disabled-opacity: var(--rui-Button--disabled__opacity);
|
|
10
11
|
$disabled-cursor: var(--rui-Button--disabled__cursor);
|
|
12
|
+
$feedback-opacity: var(--rui-Button--feedback__opacity);
|
|
13
|
+
$feedback-cursor: var(--rui-Button--feedback__cursor);
|
|
11
14
|
|
|
12
15
|
$group-filled-gap: var(--rui-ButtonGroup--filled__gap);
|
|
13
16
|
$group-filled-separator-width: var(--rui-ButtonGroup--filled__separator__width);
|
|
@@ -19,17 +22,6 @@ $group-flat-separator-color: var(--rui-ButtonGroup--flat__separator__color);
|
|
|
19
22
|
|
|
20
23
|
$group-outline-gap: var(--rui-ButtonGroup--outline__gap);
|
|
21
24
|
|
|
22
|
-
$link-priority-properties: (
|
|
23
|
-
default: (
|
|
24
|
-
color: var(--rui-link-color),
|
|
25
|
-
text-decoration: var(--rui-link-decoration),
|
|
26
|
-
),
|
|
27
|
-
hover: (
|
|
28
|
-
color: var(--rui-link-hover-color),
|
|
29
|
-
text-decoration: var(--rui-link-hover-decoration),
|
|
30
|
-
),
|
|
31
|
-
);
|
|
32
|
-
|
|
33
25
|
$sizes: (
|
|
34
26
|
small: (
|
|
35
27
|
height: var(--rui-Button--small__height),
|
|
@@ -6,9 +6,6 @@
|
|
|
6
6
|
// - outline
|
|
7
7
|
// - flat
|
|
8
8
|
//
|
|
9
|
-
// The “link” priority is treated separately as it doesn't share much of appearance with other
|
|
10
|
-
// variants listed above.
|
|
11
|
-
//
|
|
12
9
|
// 2. Disabled state theming is optional so `default` theme options are used if no `disabled`
|
|
13
10
|
// styling is provided for specific variant.
|
|
14
11
|
//
|
|
@@ -16,15 +13,14 @@
|
|
|
16
13
|
//
|
|
17
14
|
// 4. Icon buttons should appear as squares, that's why width and height is equal here.
|
|
18
15
|
//
|
|
19
|
-
// 5.
|
|
20
|
-
// settings. It might be tempting to use something like `all: initial` or `all: inherit` but it
|
|
21
|
-
// actually causes more harm rather than a useful reset.
|
|
16
|
+
// 5. Use original padding to restore square buttons back to their size.
|
|
22
17
|
|
|
23
18
|
@use 'sass:list';
|
|
24
19
|
@use 'sass:map';
|
|
25
20
|
@use 'sass:math';
|
|
26
|
-
@use '
|
|
27
|
-
@use '
|
|
21
|
+
@use '../../styles/tools/accessibility';
|
|
22
|
+
@use '../../styles/tools/breakpoint';
|
|
23
|
+
@use '../../styles/tools/transition';
|
|
28
24
|
@use 'settings';
|
|
29
25
|
@use 'theme';
|
|
30
26
|
|
|
@@ -65,20 +61,16 @@
|
|
|
65
61
|
}
|
|
66
62
|
}
|
|
67
63
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
border-radius: unset;
|
|
79
|
-
box-shadow: unset;
|
|
80
|
-
user-select: unset;
|
|
81
|
-
transition: unset;
|
|
64
|
+
// 4.
|
|
65
|
+
@mixin _button-square() {
|
|
66
|
+
--rui-local-padding: 0;
|
|
67
|
+
--rui-local-width: var(--rui-local-height);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// 5.
|
|
71
|
+
@mixin _button-size-restore() {
|
|
72
|
+
--rui-local-padding: var(--rui-local-padding-original);
|
|
73
|
+
--rui-local-width: unset;
|
|
82
74
|
}
|
|
83
75
|
|
|
84
76
|
@mixin button() {
|
|
@@ -86,6 +78,7 @@
|
|
|
86
78
|
|
|
87
79
|
position: relative; // 3.
|
|
88
80
|
display: inline-flex;
|
|
81
|
+
column-gap: settings.$icon-spacing;
|
|
89
82
|
align-items: center;
|
|
90
83
|
justify-content: center;
|
|
91
84
|
width: var(--rui-local-width, auto);
|
|
@@ -95,7 +88,6 @@
|
|
|
95
88
|
letter-spacing: theme.$letter-spacing;
|
|
96
89
|
text-align: center;
|
|
97
90
|
text-decoration: none;
|
|
98
|
-
text-overflow: ellipsis;
|
|
99
91
|
text-transform: theme.$text-transform;
|
|
100
92
|
vertical-align: middle;
|
|
101
93
|
color: var(--rui-local-color);
|
|
@@ -126,20 +118,8 @@
|
|
|
126
118
|
|
|
127
119
|
--rui-local-height: #{map.get($properties, height)};
|
|
128
120
|
--rui-local-padding: 0 #{map.get($properties, padding-x)};
|
|
121
|
+
--rui-local-padding-original: 0 #{map.get($properties, padding-x)}; // 5.
|
|
129
122
|
--rui-local-font-size: #{map.get($properties, font-size)};
|
|
130
|
-
|
|
131
|
-
&.withLabelHidden,
|
|
132
|
-
&.withLabelHiddenMobile {
|
|
133
|
-
--rui-local-padding: 0;
|
|
134
|
-
--rui-local-width: #{map.get($properties, height)}; // 4.
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
&.withLabelHiddenMobile {
|
|
138
|
-
@include breakpoint.up(settings.$breakpoint) {
|
|
139
|
-
--rui-local-padding: 0 #{map.get($properties, padding-x)};
|
|
140
|
-
--rui-local-width: auto;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
123
|
}
|
|
144
124
|
|
|
145
125
|
@mixin button-color($priority, $color) {
|
|
@@ -159,15 +139,18 @@
|
|
|
159
139
|
}
|
|
160
140
|
}
|
|
161
141
|
|
|
162
|
-
@mixin
|
|
163
|
-
@include
|
|
142
|
+
@mixin hide-label() {
|
|
143
|
+
@include _button-square();
|
|
144
|
+
|
|
145
|
+
.label {
|
|
146
|
+
@include accessibility.hide-text();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
164
149
|
|
|
165
|
-
|
|
166
|
-
|
|
150
|
+
@mixin show-label() {
|
|
151
|
+
@include _button-size-restore();
|
|
167
152
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
text-decoration: map.get(theme.$link-priority-properties, hover, text-decoration);
|
|
171
|
-
color: map.get(theme.$link-priority-properties, hover, color);
|
|
153
|
+
.label {
|
|
154
|
+
@include accessibility.unhide-text();
|
|
172
155
|
}
|
|
173
156
|
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export default (labelVisibility, styles) => {
|
|
2
|
+
// Intentionally omitting `xs` which means label is visible on all screen sizes.
|
|
3
|
+
|
|
4
|
+
if (labelVisibility === 'sm') {
|
|
5
|
+
return styles.withLabelVisibleSm;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
if (labelVisibility === 'md') {
|
|
9
|
+
return styles.withLabelVisibleMd;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
if (labelVisibility === 'lg') {
|
|
13
|
+
return styles.withLabelVisibleLg;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
if (labelVisibility === 'xl') {
|
|
17
|
+
return styles.withLabelVisibleXl;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (labelVisibility === 'xxl') {
|
|
21
|
+
return styles.withLabelVisibleXxl;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (labelVisibility === 'xxxl') {
|
|
25
|
+
return styles.withLabelVisibleXxxl;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (labelVisibility === 'none') {
|
|
29
|
+
return styles.withLabelHidden;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return null;
|
|
33
|
+
};
|