superdesk-ui-framework 4.0.82 → 4.0.83
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/app/styles/_tag-labels.scss +57 -31
- package/app/styles/components/_list-item.scss +0 -1
- package/app/styles/design-tokens/_new-colors.scss +1 -1
- package/app-typescript/components/Tag.tsx +3 -1
- package/dist/components/Badges.tsx +2 -2
- package/dist/components/Tags.tsx +33 -0
- package/dist/design/checkbox-and-radio.html +4 -2
- package/dist/design/icon-buttons.html +210 -0
- package/dist/design/modals-and-dialogs.html +2 -2
- package/dist/design/switch.html +7 -5
- package/dist/examples.bundle.css +29 -8
- package/dist/examples.bundle.js +205 -15
- package/dist/superdesk-ui.bundle.css +99 -29
- package/dist/superdesk-ui.bundle.js +2 -1
- package/package.json +1 -1
- package/react/components/Tag.d.ts +2 -1
- package/react/components/Tag.js +2 -1
|
@@ -15,41 +15,41 @@ $tag-bg-colors: (
|
|
|
15
15
|
/// Coloring classes. A map of classes to output in the CSS.
|
|
16
16
|
$tag-label-palette: $tag-bg-colors !default;
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
18
|
+
:root {
|
|
19
|
+
--tag-label-height: calc(3 * var(--base-increment));
|
|
20
|
+
--tag-label-height-small: calc(2.25 * var(--base-increment));
|
|
21
|
+
--tag-label-padding: 1em 1em;
|
|
22
|
+
--tag-label-padding-small: 1em;
|
|
23
|
+
|
|
24
|
+
--tag-label-font-size: var(--text-size-small);
|
|
25
|
+
--tag-label-font-size-small: 1.1rem;
|
|
26
|
+
|
|
27
|
+
--tag-label-minwidth: 1.8em;
|
|
28
|
+
--tag-label-radius: var(--b-radius--full);
|
|
29
|
+
--tag-label-lineheight: 1.1;
|
|
30
|
+
}
|
|
31
31
|
|
|
32
32
|
/// Generates the base styles for a badge.
|
|
33
33
|
@mixin tag-label {
|
|
34
34
|
display: inline-flex;
|
|
35
35
|
align-items: center;
|
|
36
|
-
min-width:
|
|
36
|
+
min-width: var(--tag-label-minwidth);
|
|
37
37
|
padding: 0;
|
|
38
|
-
padding-inline:
|
|
39
|
-
border-radius:
|
|
40
|
-
font-size:
|
|
38
|
+
padding-inline: var(--tag-label-padding);
|
|
39
|
+
border-radius: var(--tag-label-radius);
|
|
40
|
+
font-size: var(--tag-label-font-size);
|
|
41
|
+
line-height: var(--tag-label-lineheight);
|
|
41
42
|
position: relative;
|
|
42
43
|
text-align: center;
|
|
43
44
|
font-weight: 400;
|
|
44
45
|
transition: background-color .2s ease-out, opacity .1s ease-out;
|
|
45
|
-
height:
|
|
46
|
+
height: var(--tag-label-height);
|
|
46
47
|
color: var(--color-text);
|
|
47
48
|
}
|
|
48
49
|
|
|
49
50
|
.tag-label {
|
|
50
51
|
@include tag-label;
|
|
51
|
-
background:
|
|
52
|
-
|
|
52
|
+
background: var(--sd-colour__tag-label-Bg--1);
|
|
53
53
|
@each $name, $color in $tag-label-palette {
|
|
54
54
|
&.tag-label--#{$name} {
|
|
55
55
|
background: $color;
|
|
@@ -75,7 +75,7 @@ $tag-label-lineheight: 100% !default;
|
|
|
75
75
|
text-decoration: none;
|
|
76
76
|
text-align: center;
|
|
77
77
|
vertical-align: middle;
|
|
78
|
-
border-radius:
|
|
78
|
+
border-radius: var(--b-radius--full);
|
|
79
79
|
background-color: var(--sd-colour__tag-label-remove-Bg);
|
|
80
80
|
color: var(--color-text);
|
|
81
81
|
cursor: pointer;
|
|
@@ -102,7 +102,7 @@ $tag-label-lineheight: 100% !default;
|
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
104
|
|
|
105
|
-
|
|
105
|
+
&:active {
|
|
106
106
|
background-color: var(--sd-colour__tag-label-remove-Bg--hover);
|
|
107
107
|
|
|
108
108
|
[class^="icon-"], [class*=" icon-"] {
|
|
@@ -113,29 +113,57 @@ $tag-label-lineheight: 100% !default;
|
|
|
113
113
|
}
|
|
114
114
|
|
|
115
115
|
&.tag-label--inverse {
|
|
116
|
-
color:
|
|
117
|
-
background-color:
|
|
116
|
+
color: var(--sd-colour__tag-label-Txt--inverse);
|
|
117
|
+
background-color: var(--sd-colour__tag-label-Bg--inverse);
|
|
118
118
|
}
|
|
119
|
-
|
|
120
119
|
.tag-label--text-wrapper {
|
|
121
120
|
display: flex;
|
|
122
121
|
align-items: center;
|
|
123
122
|
justify-content: center;
|
|
124
|
-
gap:
|
|
123
|
+
gap: var(--gap-0-5);
|
|
125
124
|
}
|
|
126
|
-
|
|
127
125
|
.tag-label--text-label {
|
|
128
126
|
opacity: 0.7;
|
|
129
127
|
}
|
|
128
|
+
|
|
129
|
+
&.tag-label--small {
|
|
130
|
+
height: var(--tag-label-height-small);
|
|
131
|
+
font-size: var(--tag-label-font-size-small);
|
|
132
|
+
padding-inline: var(--tag-label-padding-small);
|
|
133
|
+
letter-spacing: 0.025em;
|
|
134
|
+
.tag-label__remove {
|
|
135
|
+
height: 1.4rem;
|
|
136
|
+
width: 1.4rem;
|
|
137
|
+
margin-inline-start: 0.6rem;
|
|
138
|
+
margin-inline-end: -0.9rem;
|
|
139
|
+
|
|
140
|
+
[class^="icon-"], [class*=" icon-"] {
|
|
141
|
+
--icon-size: 1.rem;
|
|
142
|
+
font-size: var(--icon-size);
|
|
143
|
+
height: var(--icon-size);
|
|
144
|
+
width: var(--icon-size);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
&.tag-label--square {
|
|
148
|
+
padding-inline-start: var(--space--1);
|
|
149
|
+
}
|
|
150
|
+
&.tag-label--draggable {
|
|
151
|
+
border-radius: var(--b-radius--small);
|
|
152
|
+
padding-inline-start: 4px;
|
|
153
|
+
.drag-handle-wrapper {
|
|
154
|
+
margin-inline-end: 6px;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
130
158
|
}
|
|
131
159
|
|
|
132
160
|
.tag-label--square {
|
|
133
|
-
border-radius:
|
|
161
|
+
border-radius: var(--b-radius--small);
|
|
134
162
|
padding-inline-start: var(--space--1);
|
|
135
163
|
}
|
|
136
164
|
|
|
137
165
|
.tag-label--draggable {
|
|
138
|
-
border-radius:
|
|
166
|
+
border-radius: var(--b-radius--small);
|
|
139
167
|
padding-inline-start: 6px;
|
|
140
168
|
.drag-handle-wrapper {
|
|
141
169
|
margin-inline-end: 6px;
|
|
@@ -157,11 +185,9 @@ $tag-label-lineheight: 100% !default;
|
|
|
157
185
|
|
|
158
186
|
.sd-search-tags__tag-list {
|
|
159
187
|
margin: 0.6rem 0;
|
|
160
|
-
|
|
161
188
|
&:empty {
|
|
162
189
|
padding: 0 !important;
|
|
163
190
|
}
|
|
164
|
-
|
|
165
191
|
.sd-search-tags__tag {
|
|
166
192
|
margin-inline-start: 2px !important;
|
|
167
193
|
margin-inline-end: 2px !important;
|
|
@@ -657,7 +657,7 @@
|
|
|
657
657
|
--color-text-subdued: hsla(214, 13%, 60%, 1);
|
|
658
658
|
--color-text--inverse: hsla(214, 13%, 98%, 1);
|
|
659
659
|
--color-icon-default: hsla(214, 13%, 30%, 1);
|
|
660
|
-
--sd-slugline-color:
|
|
660
|
+
--sd-slugline-color: hsl(197, 100%, 25%) !important;
|
|
661
661
|
--sd-time-schedule-color: hsla(268, 100%, 25%, 1);
|
|
662
662
|
--sd-navy-color: hsla(240, 100%, 25%, 1);
|
|
663
663
|
|
|
@@ -6,6 +6,7 @@ interface IProps {
|
|
|
6
6
|
text: string;
|
|
7
7
|
label?: string;
|
|
8
8
|
keyValue?: number;
|
|
9
|
+
size?: 'small' | 'normal'; // default normal
|
|
9
10
|
shade?: 'light' | 'darker' | 'highlight1' | 'highlight2' | 'inverse'; // default light
|
|
10
11
|
shape?: 'round' | 'square'; // default round
|
|
11
12
|
readOnly?: boolean;
|
|
@@ -13,11 +14,12 @@ interface IProps {
|
|
|
13
14
|
onClick?(): void;
|
|
14
15
|
}
|
|
15
16
|
|
|
16
|
-
export const Tag = ({text, keyValue, shade, shape, readOnly, onClick, label, draggable}: IProps) => {
|
|
17
|
+
export const Tag = ({text, keyValue, shade, shape, readOnly, onClick, label, draggable, size}: IProps) => {
|
|
17
18
|
let classes = classNames('tag-label', {
|
|
18
19
|
[`tag-label--${shade}`]: shade && shade !== 'light',
|
|
19
20
|
'tag-label--square': shape === 'square',
|
|
20
21
|
'tag-label--draggable': draggable === true,
|
|
22
|
+
[`tag-label--${size}`]: size !== 'normal' && size !== undefined,
|
|
21
23
|
});
|
|
22
24
|
|
|
23
25
|
const removeButton =
|
|
@@ -158,13 +158,13 @@ export default class BadgeDoc extends React.Component {
|
|
|
158
158
|
<Markup.ReactMarkupPreview>
|
|
159
159
|
<div className="docs-page__content-row">
|
|
160
160
|
<Badge text="8" type="primary">
|
|
161
|
-
<Button text="
|
|
161
|
+
<Button text="secondary" type="secondary" onClick={() => false} />
|
|
162
162
|
</Badge>
|
|
163
163
|
<Badge text="6">
|
|
164
164
|
<Button text="primary" type="primary" onClick={() => false} />
|
|
165
165
|
</Badge>
|
|
166
166
|
<Badge text="4" type="highlight">
|
|
167
|
-
<Button text="
|
|
167
|
+
<Button text="tertiary" type="tertiary" onClick={() => false} />
|
|
168
168
|
</Badge>
|
|
169
169
|
</div>
|
|
170
170
|
</Markup.ReactMarkupPreview>
|
package/dist/components/Tags.tsx
CHANGED
|
@@ -6,6 +6,7 @@ import {Tag, Prop, PropsList} from '../../../app-typescript';
|
|
|
6
6
|
interface ITag {
|
|
7
7
|
tags: Array<any>;
|
|
8
8
|
tags2: Array<any>;
|
|
9
|
+
tags3: Array<any>;
|
|
9
10
|
}
|
|
10
11
|
export default class TagDoc extends React.Component<{}, ITag> {
|
|
11
12
|
constructor(props) {
|
|
@@ -23,6 +24,17 @@ export default class TagDoc extends React.Component<{}, ITag> {
|
|
|
23
24
|
tags2: [
|
|
24
25
|
{text: 'Tag with label', label: 'Label'},
|
|
25
26
|
{text: 'I am', draggable: true, label: 'Draggable'},
|
|
27
|
+
{text: 'Tag with label', label: 'Label', size: 'small'},
|
|
28
|
+
{text: 'I am', draggable: true, label: 'Draggable', size: 'small'},
|
|
29
|
+
],
|
|
30
|
+
tags3: [
|
|
31
|
+
{text: 'This is a small tag', size: 'small'},
|
|
32
|
+
{text: 'Another small tag', size: 'small', shade: 'darker'},
|
|
33
|
+
{text: 'Inverse small tag', size: 'small', shade: 'inverse'},
|
|
34
|
+
{text: 'Lorem ipsum', size: 'small', shade: 'highlight1'},
|
|
35
|
+
{text: 'Dolor amet ', size: 'small', shade: 'highlight2', shape: 'square'},
|
|
36
|
+
{text: 'Read only small tag', size: 'small', readOnly: true},
|
|
37
|
+
{text: 'Draggable small tag', size: 'small', draggable: true},
|
|
26
38
|
],
|
|
27
39
|
};
|
|
28
40
|
this.handleClick = this.handleClick.bind(this);
|
|
@@ -68,6 +80,26 @@ export default class TagDoc extends React.Component<{}, ITag> {
|
|
|
68
80
|
label={tag.label}
|
|
69
81
|
readOnly={tag.readOnly}
|
|
70
82
|
draggable={tag.draggable}
|
|
83
|
+
size={tag.size}
|
|
84
|
+
onClick={() => this.handleClick(index)}
|
|
85
|
+
/>
|
|
86
|
+
</React.Fragment>
|
|
87
|
+
);
|
|
88
|
+
})}
|
|
89
|
+
</div>
|
|
90
|
+
<div className="docs-page__content-row d-flex gap-1 mt-1">
|
|
91
|
+
{this.state.tags3.map((tag, index) => {
|
|
92
|
+
return (
|
|
93
|
+
<React.Fragment key={index}>
|
|
94
|
+
<Tag
|
|
95
|
+
keyValue={index}
|
|
96
|
+
text={tag.text}
|
|
97
|
+
shade={tag.shade}
|
|
98
|
+
shape={tag.shape}
|
|
99
|
+
label={tag.label}
|
|
100
|
+
readOnly={tag.readOnly}
|
|
101
|
+
draggable={tag.draggable}
|
|
102
|
+
size={tag.size}
|
|
71
103
|
onClick={() => this.handleClick(index)}
|
|
72
104
|
/>
|
|
73
105
|
</React.Fragment>
|
|
@@ -99,6 +131,7 @@ export default class TagDoc extends React.Component<{}, ITag> {
|
|
|
99
131
|
text={tag.text}
|
|
100
132
|
label={tag.label}
|
|
101
133
|
draggable={tag.draggable}
|
|
134
|
+
size={tag.size}
|
|
102
135
|
onClick={() => this.handleClick2(index)}
|
|
103
136
|
/>
|
|
104
137
|
</React.Fragment>
|
|
@@ -44,7 +44,9 @@
|
|
|
44
44
|
</div>
|
|
45
45
|
</div>
|
|
46
46
|
|
|
47
|
-
<
|
|
47
|
+
<hr class="sd-content-divider sd-content-divider--horizontal sd-content-divider--margin-large" role="separator" />
|
|
48
|
+
|
|
49
|
+
<h3 class="docs-page__h3 mt-0 mb-3">Component Usage</h3>
|
|
48
50
|
<ul class="docs-page__unordered-list mt-1 mb-5">
|
|
49
51
|
<li><strong>RadioGroup:</strong> Required for all radio button implementations - handles spacing, orientation, and group behavior automatically.</li>
|
|
50
52
|
<li><strong>Checkbox:</strong> Individual checkbox component for single or multiple checkbox implementations</li>
|
|
@@ -65,7 +67,7 @@
|
|
|
65
67
|
<img src="/illustration-small--react.svg" alt="Components">
|
|
66
68
|
</figure>
|
|
67
69
|
<label class="docs-page__graphic-btn-label">
|
|
68
|
-
<span>View
|
|
70
|
+
<span>View RadioGroup component</span>
|
|
69
71
|
<span class="docs-page__small-text">Components</span>
|
|
70
72
|
</label>
|
|
71
73
|
</a>
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
<section class="docs-page__container">
|
|
2
|
+
<h1 class="docs-page__h2">Icon Button Guidelines</h1>
|
|
3
|
+
<p class="docs-page__paragraph docs-page__paragraph--large">Icon buttons provide a compact way to trigger actions while maintaining clean interfaces. Since icons communicate meaning without text, choosing the right icon and providing clear tooltips becomes critical for usability. The <code>IconButton</code> component ensures consistent styling and behavior across all icon-based actions.</p>
|
|
4
|
+
|
|
5
|
+
<h3 class="docs-page__h3 mt-5">Icon Selection</h3>
|
|
6
|
+
<h4 class="docs-page__h4 mt-3">Choose Recognizable Icons</h4>
|
|
7
|
+
<p class="docs-page__paragraph">Use icons that clearly represent their action. When in doubt, prioritize universal symbols over creative interpretations.</p>
|
|
8
|
+
|
|
9
|
+
<div class="docs-page__content-block d-flex flex-wrap gap-3">
|
|
10
|
+
<div class="docs-page__do-dont-block docs-page__do-dont-block--do">
|
|
11
|
+
<h4 class="docs-page__do-dont-block-title">Do</h4>
|
|
12
|
+
<div class="docs-page__do-dont-block-content mt-0">
|
|
13
|
+
<ul class="docs-page__unordered-list">
|
|
14
|
+
<li>Magnifying glass for search</li>
|
|
15
|
+
<li>Pencil or edit icon for editing</li>
|
|
16
|
+
<li>Download arrow for downloads</li>
|
|
17
|
+
<li>Settings gear for configuration</li>
|
|
18
|
+
</ul>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
<div class="docs-page__do-dont-block docs-page__do-dont-block--dont">
|
|
22
|
+
<h4 class="docs-page__do-dont-block-title">Don't</h4>
|
|
23
|
+
<div class="docs-page__do-dont-block-content">
|
|
24
|
+
<ul class="docs-page__unordered-list mt-1">
|
|
25
|
+
<li>Abstract or ambiguous icons that require explanation</li>
|
|
26
|
+
<li>Icons that could have multiple interpretations</li>
|
|
27
|
+
<li>Custom icons when standard ones exist</li>
|
|
28
|
+
</ul>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
|
|
33
|
+
<h4 class="docs-page__h4 mt-4">Icon Meaning Consistency</h4>
|
|
34
|
+
<p class="docs-page__paragraph">Use the same icon for the same action throughout the application. Users learn and expect consistency.</p>
|
|
35
|
+
|
|
36
|
+
<div class="docs-page__content-block d-flex flex-wrap gap-3">
|
|
37
|
+
<div class="docs-page__do-dont-block docs-page__do-dont-block--do">
|
|
38
|
+
<h4 class="docs-page__do-dont-block-title">Do</h4>
|
|
39
|
+
<div class="docs-page__do-dont-block-content">
|
|
40
|
+
<p class="docs-page__paragraph">
|
|
41
|
+
Use the same edit icon across all edit functions in your app.
|
|
42
|
+
</p>
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
45
|
+
<div class="docs-page__do-dont-block docs-page__do-dont-block--dont">
|
|
46
|
+
<h4 class="docs-page__do-dont-block-title">Don't</h4>
|
|
47
|
+
<div class="docs-page__do-dont-block-content">
|
|
48
|
+
<p class="docs-page__paragraph">
|
|
49
|
+
Use different edit icons (pencil, pen, edit text) for similar editing actions.
|
|
50
|
+
</p>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
<hr class="sd-content-divider sd-content-divider--horizontal sd-content-divider--margin-large sd-content-divider--dashed" role="separator" />
|
|
57
|
+
|
|
58
|
+
<h3 class="docs-page__h3 mt-5">Tooltip Guidelines</h3>
|
|
59
|
+
<h4 class="docs-page__h4 mt-3">Always Provide Tooltips</h4>
|
|
60
|
+
<p class="docs-page__paragraph">Every icon button must have a descriptive tooltip that clearly states what will happen when clicked.</p>
|
|
61
|
+
|
|
62
|
+
<div class="docs-page__content-block d-flex flex-wrap gap-3">
|
|
63
|
+
<div class="docs-page__do-dont-block docs-page__do-dont-block--do">
|
|
64
|
+
<h4 class="docs-page__do-dont-block-title">Do</h4>
|
|
65
|
+
<div class="docs-page__do-dont-block-content">
|
|
66
|
+
<ul class="docs-page__unordered-list">
|
|
67
|
+
<li>"Delete item"</li>
|
|
68
|
+
<li>"Edit profile settings"</li>
|
|
69
|
+
<li>"Download report as PDF"</li>
|
|
70
|
+
<li>"Close dialog"</li>
|
|
71
|
+
</ul>
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
<div class="docs-page__do-dont-block docs-page__do-dont-block--dont">
|
|
75
|
+
<h4 class="docs-page__do-dont-block-title">Don't</h4>
|
|
76
|
+
<div class="docs-page__do-dont-block-content">
|
|
77
|
+
<ul class="docs-page__unordered-list">
|
|
78
|
+
<li>"Delete" (too vague)</li>
|
|
79
|
+
<li>"Edit" (edit what?)</li>
|
|
80
|
+
<li>"Download" (download what format?)</li>
|
|
81
|
+
<li>"Close" (close what?)</li>
|
|
82
|
+
</ul>
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
</div>
|
|
86
|
+
|
|
87
|
+
<h4 class="docs-page__h4 mt-4">Tooltip Language</h4>
|
|
88
|
+
<p class="docs-page__paragraph">Use action-oriented language that describes the outcome, not just the icon name.</p>
|
|
89
|
+
|
|
90
|
+
<div class="docs-page__content-block d-flex flex-wrap gap-3">
|
|
91
|
+
<div class="docs-page__do-dont-block docs-page__do-dont-block--do">
|
|
92
|
+
<h4 class="docs-page__do-dont-block-title">Do</h4>
|
|
93
|
+
<div class="docs-page__do-dont-block-content">
|
|
94
|
+
<p class="docs-page__paragraph">"Remove item from list" instead of "X button"</p>
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
<div class="docs-page__do-dont-block docs-page__do-dont-block--dont">
|
|
98
|
+
<h4 class="docs-page__do-dont-block-title">Don't</h4>
|
|
99
|
+
<div class="docs-page__do-dont-block-content">
|
|
100
|
+
<p class="docs-page__paragraph">"Trash can" or "Delete icon"</p>
|
|
101
|
+
</div>
|
|
102
|
+
</div>
|
|
103
|
+
</div>
|
|
104
|
+
|
|
105
|
+
<hr class="sd-content-divider sd-content-divider--horizontal sd-content-divider--margin-large sd-content-divider--dashed" role="separator" />
|
|
106
|
+
|
|
107
|
+
<h3 class="docs-page__h3 mt-5 d-flex items-center gap-1">
|
|
108
|
+
Close <span class="docs-page__icon-wrapper"><i class="icon-close-small" aria-hidden="true"></i></span> vs
|
|
109
|
+
Delete <span class="docs-page__icon-wrapper"><i class="icon-trash" aria-hidden="true"></i></span> Icons
|
|
110
|
+
</h3>
|
|
111
|
+
|
|
112
|
+
<p class="docs-page__paragraph">Understanding when to use close versus delete icons is crucial for user expectations and preventing destructive actions. This is a common source of confusion that can lead to inconsistent user experiences.</p>
|
|
113
|
+
|
|
114
|
+
<h4 class="docs-page__h4 mt-4 d-flex items-center gap-1">Use Close <span class="docs-page__icon-wrapper"><i class="icon-close-small" aria-hidden="true"></i></span> icon for:</h4>
|
|
115
|
+
<h5 class="docs-page__h5 mt-2">Temporary removals or dismissals:</h5>
|
|
116
|
+
<ul class="docs-page__unordered-list mt-2 mb-2">
|
|
117
|
+
<li>Recommended in most cases but can be skipped occasionally</li>
|
|
118
|
+
<li>Rare exception: large and complex modals where actions happen inside the content area</li>
|
|
119
|
+
<li>Main action buttons always aligned to the right</li>
|
|
120
|
+
<li>Primary action positioned far right</li>
|
|
121
|
+
</ul>
|
|
122
|
+
<p class="docs-page__paragraph mt-0"><strong>Characteristics:</strong> Reversible, non-destructive, affects UI state rather than data.</p>
|
|
123
|
+
|
|
124
|
+
<h4 class="docs-page__h4 mt-4 d-flex items-center gap-1">Use Delete <span class="docs-page__icon-wrapper"><i class="icon-trash" aria-hidden="true"></i></span> icon for:</h4>
|
|
125
|
+
<h5 class="docs-page__h5 mt-2">Permanent data removal:</h5>
|
|
126
|
+
<ul class="docs-page__unordered-list mt-2 mb-2">
|
|
127
|
+
<li>Deleting files, records, or database entries</li>
|
|
128
|
+
<li>Removing user-created content permanently</li>
|
|
129
|
+
<li>Deleting accounts or user profiles</li>
|
|
130
|
+
<li>Deleting articles</li>
|
|
131
|
+
</ul>
|
|
132
|
+
<p class="docs-page__paragraph mt-0"><strong>Characteristics:</strong> Usually irreversible, destructive, affects actual data.</p>
|
|
133
|
+
|
|
134
|
+
<h4 class="docs-page__h4 mt-4 ">Examples</h4>
|
|
135
|
+
|
|
136
|
+
<div class="docs-page__content-block d-flex flex-wrap gap-3">
|
|
137
|
+
<div class="docs-page__do-dont-block docs-page__do-dont-block--do">
|
|
138
|
+
<h4 class="docs-page__do-dont-block-title d-flex items-center gap-0-5">Do - Close <span class="docs-page__icon-wrapper"><i class="icon-close-small" aria-hidden="true"></i></span> icon</h4>
|
|
139
|
+
<div class="docs-page__do-dont-block-content mt-0">
|
|
140
|
+
<ul class="docs-page__unordered-list">
|
|
141
|
+
<li>Closing a modal dialog: "Close dialog"</li>
|
|
142
|
+
<li>Removing an item from related content: "Remove from related"</li>
|
|
143
|
+
<li>Dismissing a notification: "Dismiss notification"</li>
|
|
144
|
+
<li>Closing a sidebar: "Close preview"</li>
|
|
145
|
+
</ul>
|
|
146
|
+
</div>
|
|
147
|
+
</div>
|
|
148
|
+
<div class="docs-page__do-dont-block docs-page__do-dont-block--do">
|
|
149
|
+
<h4 class="docs-page__do-dont-block-title d-flex items-center gap-0-5">Do - Delete <span class="docs-page__icon-wrapper"><i class="icon-trash" aria-hidden="true"></i></span> icon</h4>
|
|
150
|
+
<div class="docs-page__do-dont-block-content">
|
|
151
|
+
<ul class="docs-page__unordered-list mt-1">
|
|
152
|
+
<li>Deleting a user account: "Delete account permanently"</li>
|
|
153
|
+
<li>Removing a saved document: "Delete document"</li>
|
|
154
|
+
<li>Deleting a database record: "Delete customer record"</li>
|
|
155
|
+
</ul>
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
<div class="docs-page__do-dont-block docs-page__do-dont-block--dont">
|
|
159
|
+
<h4 class="docs-page__do-dont-block-title">Don't</h4>
|
|
160
|
+
<div class="docs-page__do-dont-block-content">
|
|
161
|
+
<ul class="docs-page__unordered-list mt-1">
|
|
162
|
+
<li>Using trash icon to close dialogs or dismiss notifications</li>
|
|
163
|
+
<li>Using close (×) icon for permanent deletions</li>
|
|
164
|
+
<li>Mixing these icons inconsistently for similar actions</li>
|
|
165
|
+
</ul>
|
|
166
|
+
</div>
|
|
167
|
+
</div>
|
|
168
|
+
</div>
|
|
169
|
+
|
|
170
|
+
<hr class="sd-content-divider sd-content-divider--horizontal sd-content-divider--margin-large" role="separator" />
|
|
171
|
+
|
|
172
|
+
<h3 class="docs-page__h3 mt-0">Accessibility Considerations</h3>
|
|
173
|
+
<h4 class="docs-page__h4 mt-2">Color and Contrast</h4>
|
|
174
|
+
<p class="docs-page__paragraph mt-0">Icons should meet accessibility contrast requirements. Don't rely on color alone to convey meaning.</p>
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
<h4 class="docs-page__h4 mt-5">Screen Readers</h4>
|
|
179
|
+
<p class="docs-page__paragraph mt-0">The <code>IconButton</code> component requires an ARIA label as a mandatory prop, which serves dual purposes: providing screen reader accessibility and generating the tooltip text. Screen reader support is built directly into the component.</p>
|
|
180
|
+
|
|
181
|
+
<hr class="sd-content-divider sd-content-divider--horizontal sd-content-divider--margin-large" role="separator" />
|
|
182
|
+
|
|
183
|
+
<h3 class="docs-page__h3 mt-0 mb-3">Component Usage</h3>
|
|
184
|
+
|
|
185
|
+
<ul class="docs-page__unordered-list mt-1 mb-5" style="max-width: 85ch;">
|
|
186
|
+
<li><strong>IconButton:</strong> Use for all icon-based actions with proper icon selection and mandatory tooltips for clear user communication.</li>
|
|
187
|
+
<li><strong>ButtonGroup:</strong> When grouping multiple icon buttons, use the <code>ButtonGroup</code> component for consistent spacing and alignment. The same spacing principles that apply to regular button grouping apply here.</li>
|
|
188
|
+
</ul>
|
|
189
|
+
|
|
190
|
+
<div class="docs-page__button-grid">
|
|
191
|
+
<a class="docs-page__graphic-btn" href="#/components/icon-buttons" target="_blank">
|
|
192
|
+
<figure class="docs-page__graphic-btn-graphic">
|
|
193
|
+
<img src="/illustration-small--react.svg" alt="React components">
|
|
194
|
+
</figure>
|
|
195
|
+
<label class="docs-page__graphic-btn-label">
|
|
196
|
+
<span>View IconButton component</span>
|
|
197
|
+
<span class="docs-page__small-text">Components</span>
|
|
198
|
+
</label>
|
|
199
|
+
</a>
|
|
200
|
+
<a class="docs-page__graphic-btn" href="#/components/button-groups" target="_blank">
|
|
201
|
+
<figure class="docs-page__graphic-btn-graphic">
|
|
202
|
+
<img src="/illustration-small--react.svg" alt="React components">
|
|
203
|
+
</figure>
|
|
204
|
+
<label class="docs-page__graphic-btn-label">
|
|
205
|
+
<span>View ButtonGroup component</span>
|
|
206
|
+
<span class="docs-page__small-text">Components</span>
|
|
207
|
+
</label>
|
|
208
|
+
</a>
|
|
209
|
+
</div>
|
|
210
|
+
</section>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<section class="docs-page__container">
|
|
2
|
-
<h1 class="docs-page__h2">Modals & Dialogs</h1>
|
|
2
|
+
<h1 class="docs-page__h2">Modals & Dialogs Guidelines</h1>
|
|
3
3
|
<p class="docs-page__paragraph docs-page__paragraph--large">Dialogs and modals are essential components in Superdesk, used frequently for everything from quick confirmations to complex workflows. Given the sophisticated nature of content management, our modals often contain substantial functionality. Consistent structure and content guidelines help users navigate these interfaces confidently.</p>
|
|
4
4
|
|
|
5
5
|
<h3 class="docs-page__h3 mt-5">Structure</h3>
|
|
@@ -156,7 +156,7 @@
|
|
|
156
156
|
</figure>
|
|
157
157
|
<figcaption class="docs-page__figure-caption">
|
|
158
158
|
<p class="docs-page__caption-heading docs-page__caption-heading--do">Do.</p>
|
|
159
|
-
<p class="docs-page__caption-text">Use consistent spacing between buttons in the footer. The same spacing principles from our Button Guidelines apply here - use the <code>ButtonGroup</code> component when possible, or the <code>--gap-1</code> spacing variable for custom layouts. For more detailed information, see the guidelines for the <a href="#/design/buttons">Button component</a>.</p>
|
|
159
|
+
<p class="docs-page__caption-text">Use consistent spacing between buttons in the footer. The same spacing principles from our Button Guidelines apply here - use the <code>ButtonGroup</code> component when possible, or the <code>--gap-1</code> spacing variable for custom layouts. For more detailed information, see the guidelines for the <a class="docs-page__link" href="#/design/buttons">Button component</a>.</p>
|
|
160
160
|
</figcaption>
|
|
161
161
|
</div>
|
|
162
162
|
<div class="docs-page__content-block-item">
|
package/dist/design/switch.html
CHANGED
|
@@ -42,26 +42,28 @@
|
|
|
42
42
|
</div>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
|
-
<
|
|
45
|
+
<hr class="sd-content-divider sd-content-divider--horizontal sd-content-divider--margin-large" role="separator" />
|
|
46
|
+
|
|
47
|
+
<h3 class="docs-page__h3 mt-0 mb-3">Component Usage</h3>
|
|
46
48
|
<ul class="docs-page__unordered-list mt-1 mb-5">
|
|
47
49
|
<li><strong>Switch:</strong> Individual switch component for single or multiple switch implementations</li>
|
|
48
50
|
<li><strong>SwitchGroup:</strong> Used to group multiple <code>Switch</code> components with consistent spacing and alignment</li>
|
|
49
51
|
</ul>
|
|
50
52
|
|
|
51
|
-
<h4 class="docs-page__h4 mt-5 mb-2">When to
|
|
53
|
+
<h4 class="docs-page__h4 mt-5 mb-2">When to use Switches vs Checkboxes</h4>
|
|
52
54
|
<ul class="docs-page__unordered-list mt-1 mb-5">
|
|
53
55
|
<li><strong>Switches:</strong> For settings that take effect immediately (toggle dark mode, enable notifications)</li>
|
|
54
56
|
<li><strong>Checkboxes:</strong> For selections that require confirmation or submission (form selections, bulk actions)</li>
|
|
55
57
|
</ul>
|
|
56
58
|
|
|
57
59
|
<div class="docs-page__button-grid">
|
|
58
|
-
<a class="docs-page__graphic-btn" href="#/
|
|
60
|
+
<a class="docs-page__graphic-btn" href="#/components/switch" target="_blank">
|
|
59
61
|
<figure class="docs-page__graphic-btn-graphic">
|
|
60
62
|
<img src="/illustration-small--react.svg" alt="React components">
|
|
61
63
|
</figure>
|
|
62
64
|
<label class="docs-page__graphic-btn-label">
|
|
63
|
-
<span>View
|
|
64
|
-
<span class="docs-page__small-text">
|
|
65
|
+
<span>View Switch component</span>
|
|
66
|
+
<span class="docs-page__small-text">Components</span>
|
|
65
67
|
</label>
|
|
66
68
|
</a>
|
|
67
69
|
</div>
|
package/dist/examples.bundle.css
CHANGED
|
@@ -492,7 +492,7 @@ hr {
|
|
|
492
492
|
.docs-page__h3 {
|
|
493
493
|
font-size: 32px;
|
|
494
494
|
font-weight: 700;
|
|
495
|
-
line-height:
|
|
495
|
+
line-height: 1.2;
|
|
496
496
|
font-family: 'Merriweather', serif;
|
|
497
497
|
margin: 2em 0 0.4em 0;
|
|
498
498
|
}
|
|
@@ -502,11 +502,17 @@ hr {
|
|
|
502
502
|
.docs-page__h4 {
|
|
503
503
|
font-size: 22px;
|
|
504
504
|
font-weight: 700;
|
|
505
|
-
line-height:
|
|
505
|
+
line-height: 1.2;
|
|
506
506
|
font-family: 'Merriweather', serif;
|
|
507
507
|
margin: 1em 0 0.2em 0;
|
|
508
508
|
color: var(--color-text-muted);
|
|
509
509
|
}
|
|
510
|
+
.docs-page__h5 {
|
|
511
|
+
font-size: 18px;
|
|
512
|
+
font-weight: 600;
|
|
513
|
+
line-height: 1.2;
|
|
514
|
+
margin: 0 0 0.25em;
|
|
515
|
+
}
|
|
510
516
|
.docs-page__group-heading {
|
|
511
517
|
font-size: 36px;
|
|
512
518
|
font-weight: 300;
|
|
@@ -743,9 +749,14 @@ hr {
|
|
|
743
749
|
overflow-y: auto;
|
|
744
750
|
position: relative;
|
|
745
751
|
background-color: var(--docs-page-color-bg-00);
|
|
746
|
-
|
|
747
|
-
color: var(--sd-colour-interactive);
|
|
748
|
-
text-decoration: dotted;
|
|
752
|
+
.docs-page__link {
|
|
753
|
+
color: var(--sd-colour-interactive--text);
|
|
754
|
+
text-decoration: underline dotted;
|
|
755
|
+
transition: all 0.2s ease;
|
|
756
|
+
&:hover {
|
|
757
|
+
color: var(--sd-colour-interactive);
|
|
758
|
+
text-decoration: underline;
|
|
759
|
+
}
|
|
749
760
|
}
|
|
750
761
|
}
|
|
751
762
|
.docs-page__masthead {
|
|
@@ -1434,6 +1445,15 @@ doc-gif-img:hover img {
|
|
|
1434
1445
|
cursor: pointer;
|
|
1435
1446
|
}
|
|
1436
1447
|
|
|
1448
|
+
.docs-page__icon-wrapper {
|
|
1449
|
+
display: inline-flex;
|
|
1450
|
+
align-items: center;
|
|
1451
|
+
justify-content: center;
|
|
1452
|
+
padding: var(--space--1);
|
|
1453
|
+
background-color: var(--sd-item__main-Bg);
|
|
1454
|
+
border-radius: var(--b-radius--full);
|
|
1455
|
+
}
|
|
1456
|
+
|
|
1437
1457
|
.docs-page__container table {
|
|
1438
1458
|
margin-bottom: 32px;
|
|
1439
1459
|
border-color: var(--docs-page-border__table) !important;
|
|
@@ -1463,7 +1483,6 @@ doc-gif-img:hover img {
|
|
|
1463
1483
|
position: sticky;
|
|
1464
1484
|
top: 0;
|
|
1465
1485
|
background-color: var(--docs-page-color-bg-00);
|
|
1466
|
-
border-bottom:;
|
|
1467
1486
|
}
|
|
1468
1487
|
|
|
1469
1488
|
.docs-page__container table.utilities-table tbody td {
|
|
@@ -1536,7 +1555,6 @@ pre[class*='language-'] {
|
|
|
1536
1555
|
border: 1px solid var(--sd-colour-line--medium);
|
|
1537
1556
|
flex: 1 1%;
|
|
1538
1557
|
min-width: 400px;
|
|
1539
|
-
|
|
1540
1558
|
&.docs-page__do-dont-block--do {
|
|
1541
1559
|
.docs-page__do-dont-block-title {
|
|
1542
1560
|
border-color: var(--color-success-highlight);
|
|
@@ -1544,7 +1562,6 @@ pre[class*='language-'] {
|
|
|
1544
1562
|
background-color: var(--color-success-translucent);
|
|
1545
1563
|
}
|
|
1546
1564
|
}
|
|
1547
|
-
|
|
1548
1565
|
&.docs-page__do-dont-block--dont {
|
|
1549
1566
|
.docs-page__do-dont-block-title {
|
|
1550
1567
|
border-color: var(--color-alert-highlight);
|
|
@@ -1568,6 +1585,10 @@ pre[class*='language-'] {
|
|
|
1568
1585
|
.docs-page__unordered-list {
|
|
1569
1586
|
margin-block: var(--space--1-5);
|
|
1570
1587
|
}
|
|
1588
|
+
.docs-page__paragraph {
|
|
1589
|
+
margin: 0;
|
|
1590
|
+
padding: var(--space--1);
|
|
1591
|
+
}
|
|
1571
1592
|
}
|
|
1572
1593
|
|
|
1573
1594
|
/*// extra large screen media query /100em = 1600px/*/
|