superdesk-ui-framework 3.0.66 → 3.0.68
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/components/_list-item.scss +22 -11
- package/app-typescript/components/Autocomplete.tsx +9 -3
- package/app-typescript/components/Badge.tsx +16 -2
- package/app-typescript/components/Dropdown.tsx +3 -1
- package/app-typescript/components/DropdownFirst.tsx +14 -2
- package/app-typescript/components/DurationInput.tsx +19 -4
- package/app-typescript/components/EmptyState.tsx +11 -2
- package/app-typescript/components/Layouts/Panel.tsx +12 -1
- package/app-typescript/components/Lists/ContentList.tsx +5 -1
- package/app-typescript/components/Modal.tsx +10 -1
- package/app-typescript/components/Navigation/BottomNav.tsx +9 -2
- package/app-typescript/components/Navigation/QuickNavBar.tsx +10 -2
- package/app-typescript/components/Navigation/SideBarMenu.tsx +9 -4
- package/app-typescript/components/SidebarMenu.tsx +8 -1
- package/app-typescript/components/TabList.tsx +5 -1
- package/app-typescript/components/TagInput.tsx +4 -1
- package/app-typescript/components/ThemeSelector.tsx +13 -2
- package/app-typescript/components/TreeMenu.tsx +127 -122
- package/app-typescript/components/TreeSelect/TreeSelect.tsx +157 -141
- package/app-typescript/components/WithPortal.tsx +49 -0
- package/app-typescript/components/avatar/avatar-image.tsx +2 -0
- package/app-typescript/components/avatar/avatar.tsx +2 -1
- package/dist/examples.bundle.js +1446 -1318
- package/dist/playgrounds/planning.html +121 -43
- package/dist/playgrounds/react-playgrounds/CoreLayout.tsx +398 -385
- package/dist/playgrounds/react-playgrounds/EditorTest.tsx +359 -365
- package/dist/playgrounds/react-playgrounds/FirstPlayground.tsx +33 -33
- package/dist/playgrounds/react-playgrounds/Multiedit.tsx +227 -231
- package/dist/playgrounds/react-playgrounds/PageLayoutTest.tsx +41 -38
- package/dist/playgrounds/react-playgrounds/PersonalProfile.tsx +76 -96
- package/dist/playgrounds/react-playgrounds/RundownEditor.tsx +73 -101
- package/dist/playgrounds/react-playgrounds/Rundowns.tsx +788 -729
- package/dist/playgrounds/react-playgrounds/SamsPlayground.tsx +35 -26
- package/dist/playgrounds/react-playgrounds/TestGround.tsx +99 -128
- package/dist/playgrounds/react-playgrounds/UiPlayground.tsx +40 -25
- package/dist/playgrounds/react-playgrounds/components/GraphicButton.tsx +6 -5
- package/dist/playgrounds/react-playgrounds/components/Layout.tsx +0 -2
- package/dist/playgrounds/react-playgrounds/components/SearchBar.tsx +16 -9
- package/dist/playgrounds/react-playgrounds/tsconfig.json +4 -0
- package/dist/superdesk-ui.bundle.css +24 -14
- package/dist/superdesk-ui.bundle.js +830 -727
- package/dist/vendor.bundle.js +14 -14
- package/examples/pages/playgrounds/planning.html +121 -43
- package/examples/pages/playgrounds/react-playgrounds/CoreLayout.tsx +398 -385
- package/examples/pages/playgrounds/react-playgrounds/EditorTest.tsx +359 -365
- package/examples/pages/playgrounds/react-playgrounds/FirstPlayground.tsx +33 -33
- package/examples/pages/playgrounds/react-playgrounds/Multiedit.tsx +227 -231
- package/examples/pages/playgrounds/react-playgrounds/PageLayoutTest.tsx +41 -38
- package/examples/pages/playgrounds/react-playgrounds/PersonalProfile.tsx +76 -96
- package/examples/pages/playgrounds/react-playgrounds/RundownEditor.tsx +73 -101
- package/examples/pages/playgrounds/react-playgrounds/Rundowns.tsx +788 -729
- package/examples/pages/playgrounds/react-playgrounds/SamsPlayground.tsx +35 -26
- package/examples/pages/playgrounds/react-playgrounds/TestGround.tsx +99 -128
- package/examples/pages/playgrounds/react-playgrounds/UiPlayground.tsx +40 -25
- package/examples/pages/playgrounds/react-playgrounds/components/GraphicButton.tsx +6 -5
- package/examples/pages/playgrounds/react-playgrounds/components/Layout.tsx +0 -2
- package/examples/pages/playgrounds/react-playgrounds/components/SearchBar.tsx +16 -9
- package/examples/pages/playgrounds/react-playgrounds/tsconfig.json +4 -0
- package/package.json +3 -2
- package/react/components/Autocomplete.js +2 -2
- package/react/components/Badge.js +1 -1
- package/react/components/Dropdown.js +3 -1
- package/react/components/DropdownFirst.js +6 -2
- package/react/components/DurationInput.js +5 -1
- package/react/components/EmptyState.js +2 -1
- package/react/components/Lists/ContentList.js +1 -1
- package/react/components/Navigation/BottomNav.js +4 -1
- package/react/components/Navigation/QuickNavBar.js +2 -1
- package/react/components/Navigation/SideBarMenu.js +3 -1
- package/react/components/TabList.js +2 -1
- package/react/components/TagInput.js +1 -1
- package/react/components/TreeSelect/TreeSelect.d.ts +3 -2
- package/react/components/TreeSelect/TreeSelect.js +81 -73
- package/react/components/WithPortal.d.ts +14 -0
- package/react/components/WithPortal.js +69 -0
- package/react/components/avatar/avatar.js +2 -1
- /package/dist/playgrounds/dummy-data/{items.js → items.ts} +0 -0
- /package/examples/pages/playgrounds/dummy-data/{items.js → items.ts} +0 -0
@@ -549,22 +549,34 @@ $sd-ListItem-column-border: var(--sd-colour-line--x-light);
|
|
549
549
|
|
550
550
|
// NESTED list items
|
551
551
|
.sd-list-item-nested {
|
552
|
-
|
553
|
-
|
554
|
-
|
552
|
+
--parent-item-height: 58px;
|
553
|
+
display: grid;
|
554
|
+
grid-template-rows: var(--parent-item-height) 0fr;
|
555
|
+
transition: grid-template-rows 0.3s ease-out;
|
556
|
+
& > .sd-list-item {
|
557
|
+
max-height: var(--parent-item-height);
|
558
|
+
height: var(--parent-item-height);
|
559
|
+
}
|
555
560
|
}
|
556
561
|
|
557
562
|
.sd-list-item-nested__childs {
|
558
563
|
position: relative;
|
559
564
|
z-index: 0;
|
560
|
-
|
561
|
-
|
565
|
+
overflow: hidden !important;
|
566
|
+
display: grid;
|
567
|
+
grid-template-rows: 1fr;
|
562
568
|
margin-inline-start: 1rem;
|
569
|
+
transition: all 0.3s ease-out;
|
563
570
|
|
564
571
|
.sd-list-item {
|
565
572
|
margin-block-start: 0;
|
566
573
|
border-block-start: 1px solid var(--sd-colour-line--x-light);
|
567
574
|
}
|
575
|
+
.sd-list-item-nested__childs-inner {
|
576
|
+
overflow: hidden;
|
577
|
+
opacity: 0;
|
578
|
+
transition: opacity 0.2s ease-out;
|
579
|
+
}
|
568
580
|
}
|
569
581
|
|
570
582
|
.sd-list-item-nested__parent {
|
@@ -574,19 +586,18 @@ $sd-ListItem-column-border: var(--sd-colour-line--x-light);
|
|
574
586
|
|
575
587
|
.sd-list-item-nested--collapsed {
|
576
588
|
.sd-list-item-nested__childs {
|
577
|
-
transition: all ease-in 0.2s;
|
578
|
-
max-height: 0;
|
579
589
|
opacity: 0;
|
580
|
-
margin-block-end: 0;
|
581
|
-
overflow: hidden;
|
582
590
|
}
|
583
591
|
}
|
584
592
|
|
585
593
|
.sd-list-item-nested--expanded {
|
594
|
+
grid-template-rows: var(--parent-item-height) 1fr;
|
586
595
|
.sd-list-item-nested__childs {
|
587
|
-
|
588
|
-
max-height: 114rem;
|
596
|
+
grid-template-rows: 1fr;
|
589
597
|
opacity: 1;
|
598
|
+
.sd-list-item-nested__childs-inner {
|
599
|
+
opacity: 1;
|
600
|
+
}
|
590
601
|
}
|
591
602
|
}
|
592
603
|
|
@@ -146,9 +146,15 @@ export class Autocomplete extends React.Component<IProps, IState> {
|
|
146
146
|
onChange={(event: {originalEvent: Event, value: any}) => this.handleChange(event)}
|
147
147
|
onSelect={(event: {originalEvent: Event, value: any}) => this.handleSelect(event)} />
|
148
148
|
|
149
|
-
{this.props.isSearchField && this.state.selectedItem
|
150
|
-
<button
|
151
|
-
|
149
|
+
{this.props.isSearchField && this.state.selectedItem
|
150
|
+
? <button
|
151
|
+
className="sd-searchbar__cancel"
|
152
|
+
onClick={() => this.handleInputClear()}
|
153
|
+
>
|
154
|
+
<i className="icon-remove-sign" aria-label="remove-sign" />
|
155
|
+
</button>
|
156
|
+
: null
|
157
|
+
}
|
152
158
|
|
153
159
|
{!this.props.isSearchField ?
|
154
160
|
<div className='sd-input__message-box'>
|
@@ -22,11 +22,25 @@ export class Badge extends React.PureComponent<IProps> {
|
|
22
22
|
return (
|
23
23
|
<div className='element-with-badge' data-test-id={this.props['data-test-id']}>
|
24
24
|
{this.props.children}
|
25
|
-
<span
|
25
|
+
<span
|
26
|
+
className={classes}
|
27
|
+
style={{backgroundColor: this.props.hexColor}}
|
28
|
+
data-test-id="badge-content"
|
29
|
+
>
|
30
|
+
{this.props.text}
|
31
|
+
</span>
|
26
32
|
</div>
|
27
33
|
);
|
28
34
|
} else {
|
29
|
-
return
|
35
|
+
return (
|
36
|
+
<span
|
37
|
+
className={classes}
|
38
|
+
style={{backgroundColor: this.props.hexColor}}
|
39
|
+
data-test-id={this.props['data-test-id']}
|
40
|
+
>
|
41
|
+
{this.props.text}
|
42
|
+
</span>
|
43
|
+
);
|
30
44
|
}
|
31
45
|
}
|
32
46
|
}
|
@@ -259,7 +259,9 @@ export const Dropdown = ({
|
|
259
259
|
<div ref={buttonRef} style={{ display: 'content' }}>
|
260
260
|
{(() => {
|
261
261
|
const attrs = {
|
262
|
-
className: children.props.className
|
262
|
+
className: children.props.className
|
263
|
+
? (children.props.className + ' dropdown__toggle dropdown-toggle')
|
264
|
+
: 'dropdown__toggle dropdown-toggle',
|
263
265
|
'aria-haspopup': "menu",
|
264
266
|
'aria-expanded': open,
|
265
267
|
onClick: toggleDisplay,
|
@@ -125,7 +125,13 @@ export const DropdownFirst = ({
|
|
125
125
|
if (headerFooter) {
|
126
126
|
return (
|
127
127
|
<div className={classes} >
|
128
|
-
<button
|
128
|
+
<button
|
129
|
+
className={navDropdown
|
130
|
+
? 'dropdown__toggle navbtn dropdown-toggle'
|
131
|
+
: 'dropdown__toggle nav-btn dropdown-toggle'
|
132
|
+
}
|
133
|
+
onClick={isOpen}
|
134
|
+
>
|
129
135
|
{icon ?
|
130
136
|
(<i className={"icon-" + icon}></i>) :
|
131
137
|
(<React.Fragment>{name}<span className="dropdown__caret"></span></React.Fragment>)
|
@@ -157,7 +163,13 @@ export const DropdownFirst = ({
|
|
157
163
|
} else {
|
158
164
|
return (
|
159
165
|
<div className={classes} >
|
160
|
-
<button
|
166
|
+
<button
|
167
|
+
className={navDropdown
|
168
|
+
? 'dropdown__toggle navbtn dropdown-toggle'
|
169
|
+
: 'dropdown__toggle nav-btn dropdown-toggle'
|
170
|
+
}
|
171
|
+
onClick={isOpen}
|
172
|
+
>
|
161
173
|
{icon ?
|
162
174
|
(<i className={"icon-" + icon}></i>) :
|
163
175
|
(<React.Fragment>{name}<span className="dropdown__caret"></span></React.Fragment>)
|
@@ -261,7 +261,13 @@ export class DurationInput extends React.PureComponent<IProps, IState> {
|
|
261
261
|
}
|
262
262
|
|
263
263
|
handleFocusOnKeyUp(event: React.KeyboardEvent<HTMLInputElement>, ref: HTMLInputElement | null) {
|
264
|
-
if (
|
264
|
+
if (
|
265
|
+
event.key !== 'ArrowRight'
|
266
|
+
&& event.key !== 'ArrowLeft'
|
267
|
+
&& event.key !== 'ArrowUp'
|
268
|
+
&& event.key !== 'ArrowDown'
|
269
|
+
&& event.key !== 'Backspace'
|
270
|
+
) {
|
265
271
|
if ((event.keyCode > 46 && event.keyCode < 58) || (event.keyCode > 95 && event.keyCode < 106)) {
|
266
272
|
const target = event.target as HTMLInputElement;
|
267
273
|
if (target.value.length >= 2) {
|
@@ -278,9 +284,18 @@ export class DurationInput extends React.PureComponent<IProps, IState> {
|
|
278
284
|
if (this.props.preview) {
|
279
285
|
return (
|
280
286
|
<div className='sd-input__duration-input-preview'>
|
281
|
-
<div
|
282
|
-
|
283
|
-
|
287
|
+
<div>
|
288
|
+
<span className='duration-input-preview'>{this.state.hours}</span>
|
289
|
+
<span className='sd-input__suffix'>h</span>
|
290
|
+
</div>
|
291
|
+
<div>
|
292
|
+
<span className='duration-input-preview'>{this.state.minutes}</span>
|
293
|
+
<span className='sd-input__suffix'>m</span>
|
294
|
+
</div>
|
295
|
+
<div>
|
296
|
+
<span className='duration-input-preview'>{this.state.seconds}</span>
|
297
|
+
<span className='sd-input__suffix'>s</span>
|
298
|
+
</div>
|
284
299
|
</div>
|
285
300
|
);
|
286
301
|
}
|
@@ -16,10 +16,19 @@ export class EmptyState extends React.PureComponent<IProps> {
|
|
16
16
|
[`content-state__image--${this.props.size}`]: this.props.size || this.props.size !== undefined,
|
17
17
|
});
|
18
18
|
|
19
|
-
let image = require(
|
19
|
+
let image = require(
|
20
|
+
`../../app/img/empty_states/empty-state--${
|
21
|
+
this.props.size ? this.props.size : 'small'
|
22
|
+
}-${
|
23
|
+
this.props.illustration ? this.props.illustration : '1'
|
24
|
+
}.svg`,
|
25
|
+
);
|
20
26
|
|
21
27
|
return (
|
22
|
-
<div className={
|
28
|
+
<div className={
|
29
|
+
'content-state--empty-container'
|
30
|
+
+ (this.props.absolutePositioned ? ' content-state__empty-container--absolute' : '')}
|
31
|
+
>
|
23
32
|
<div className='content-state__empty-info'>
|
24
33
|
<figure className={classes}>
|
25
34
|
<img src={image} alt={this.props.illustration} />
|
@@ -11,7 +11,18 @@ interface IPropsPanel {
|
|
11
11
|
side?: 'left' | 'right';
|
12
12
|
theme?: 'light' | 'dark';
|
13
13
|
className?: string;
|
14
|
-
size?:
|
14
|
+
size?:
|
15
|
+
'xx-small'
|
16
|
+
| 'x-small'
|
17
|
+
| 'small'
|
18
|
+
| 'medium'
|
19
|
+
| 'large'
|
20
|
+
| 'x-large'
|
21
|
+
| 'xx-large'
|
22
|
+
| 'xxx-large'
|
23
|
+
| 'full'
|
24
|
+
| 'auto'
|
25
|
+
| {custom: React.CSSProperties['width']};
|
15
26
|
background?: 'transparent' | 'light' | 'grey'; // defaults to light (white)
|
16
27
|
open?: boolean;
|
17
28
|
}
|
@@ -66,7 +66,11 @@ class ContentListItem extends React.PureComponent<IPropsItem> {
|
|
66
66
|
}
|
67
67
|
{this.props.itemColum.map((item, index) => {
|
68
68
|
return <div
|
69
|
-
className={`
|
69
|
+
className={`
|
70
|
+
sd-list-item__column
|
71
|
+
${item.fullwidth && 'sd-list-item__column--grow'}
|
72
|
+
${!item.border && 'sd-list-item__column--no-border'}`
|
73
|
+
}
|
70
74
|
key={index}>
|
71
75
|
{item.itemRow.map((e, i) => {
|
72
76
|
return (
|
@@ -13,7 +13,16 @@ interface IProps {
|
|
13
13
|
contentBg?: 'default' | 'medium' | 'dark';
|
14
14
|
contentPadding?: 'none' | 'small' | 'medium' | 'large';
|
15
15
|
size?: 'small' | 'medium' | 'large' | 'x-large';
|
16
|
-
position?:
|
16
|
+
position?:
|
17
|
+
"center"
|
18
|
+
| "top"
|
19
|
+
| "bottom"
|
20
|
+
| "left"
|
21
|
+
| "right"
|
22
|
+
| "top-left"
|
23
|
+
| "top-right"
|
24
|
+
| "bottom-left"
|
25
|
+
| "bottom-right";
|
17
26
|
maximized?: boolean;
|
18
27
|
maximizable?: boolean;
|
19
28
|
headerTemplate?: JSX.Element | string;
|
@@ -58,8 +58,15 @@ export class BottomNav extends React.PureComponent<IProps, IState> {
|
|
58
58
|
<ul className='sd-bottom-nav-list'>
|
59
59
|
{this.props.items.map((item, index) => {
|
60
60
|
return (
|
61
|
-
<li
|
62
|
-
|
61
|
+
<li
|
62
|
+
key={index}
|
63
|
+
className={
|
64
|
+
'sd-bottom-nav-list__item'
|
65
|
+
+ (item['active']
|
66
|
+
? ' sd-bottom-nav-list__item--active'
|
67
|
+
: (index === this.state.index ? ' sd-bottom-nav-list__item--active' : ''))
|
68
|
+
}
|
69
|
+
>
|
63
70
|
<a className='sd-bottom-nav-list__item-title' onClick={(event) => {
|
64
71
|
this.handleClick(index);
|
65
72
|
item.onClick(event);
|
@@ -76,7 +76,12 @@ export class QuickNavBar extends React.PureComponent<IProps, IState> {
|
|
76
76
|
);
|
77
77
|
} else {
|
78
78
|
return (
|
79
|
-
<li
|
79
|
+
<li
|
80
|
+
key={index}
|
81
|
+
data-sd-tooltip={item['tooltip']}
|
82
|
+
data-flow='right'
|
83
|
+
className="sd-quickbar-menu__list-item"
|
84
|
+
>
|
80
85
|
<a role='button' aria-label={item['tooltip']} className={'sd-quickbar__btn'}
|
81
86
|
onClick={() => this.handleClick(item, index, event)}>
|
82
87
|
<Icon size={'small'} name={item['icon']} />
|
@@ -98,7 +103,10 @@ export class QuickNavBar extends React.PureComponent<IProps, IState> {
|
|
98
103
|
<li key={index} data-sd-tooltip={item['tooltip']} data-flow='right'>
|
99
104
|
<a role='button'
|
100
105
|
aria-label={item['tooltip']}
|
101
|
-
className={
|
106
|
+
className={
|
107
|
+
'sd-quickbar__btn'
|
108
|
+
+ (index === this.state.index ? ' sd-quickbar__btn--active' : '')
|
109
|
+
}
|
102
110
|
onClick={() => this.handleClick(item, index, event)}>
|
103
111
|
<Icon size={'small'} name={item['icon']} />
|
104
112
|
</a>
|
@@ -67,9 +67,13 @@ export class SideBarMenu extends React.PureComponent<IProps, IState> {
|
|
67
67
|
data-sd-tooltip={item['tooltip']}
|
68
68
|
data-flow='right'
|
69
69
|
className={item.hover ? 'authoring-active__item' : ''}>
|
70
|
-
<a
|
71
|
-
|
72
|
-
|
70
|
+
<a
|
71
|
+
className={'sd-sidebar-menu__btn'
|
72
|
+
+ (this.state.hover ? ' sd-sidebar-menu__btn--closed ' : '')
|
73
|
+
+ (item['active']
|
74
|
+
? ' sd-sidebar-menu__btn--active'
|
75
|
+
: (index === this.state.index ? ' sd-sidebar-menu__btn--active' : '')
|
76
|
+
)}
|
73
77
|
onClick={() => {
|
74
78
|
this.handleClick(index);
|
75
79
|
if (item.hover) {
|
@@ -78,7 +82,8 @@ export class SideBarMenu extends React.PureComponent<IProps, IState> {
|
|
78
82
|
item.onCLick();
|
79
83
|
}
|
80
84
|
}
|
81
|
-
}}
|
85
|
+
}}
|
86
|
+
>
|
82
87
|
<span className='sd-sidebar-menu__main-icon '>
|
83
88
|
<Icon size={item['size']} name={item['icon']} />
|
84
89
|
</span>
|
@@ -50,7 +50,14 @@ export class SidebarMenu extends React.PureComponent<IProps, IState> {
|
|
50
50
|
} else {
|
51
51
|
return (
|
52
52
|
<li key={index} data-sd-tooltip={item['tooltip']} data-flow='right'>
|
53
|
-
<a className={
|
53
|
+
<a className={
|
54
|
+
'sd-sidebar-menu__btn'
|
55
|
+
+ (index === this.state.closeIndex ? ' sd-sidebar-menu__btn--closed ' : '')
|
56
|
+
+ (item['active']
|
57
|
+
? ' sd-sidebar-menu__btn--active'
|
58
|
+
: (index === this.state.index ? ' sd-sidebar-menu__btn--active' : '')
|
59
|
+
)
|
60
|
+
}
|
54
61
|
onClick={() => this.handleClick(index)}>
|
55
62
|
<span className='sd-sidebar-menu__main-icon '>
|
56
63
|
<Icon size={item['size']} name={item['icon']} />
|
@@ -63,7 +63,11 @@ class TabList extends React.PureComponent<ITabList, IState> {
|
|
63
63
|
onClick={() => this.handleChange(index)}
|
64
64
|
role='tab'
|
65
65
|
aria-selected={this.state.index === index ? 'true' : 'false'}
|
66
|
-
className={
|
66
|
+
className={
|
67
|
+
'sd-nav-tabs__tab'
|
68
|
+
+ (this.state.index === index ? ' sd-nav-tabs__tab--active' : '')
|
69
|
+
}
|
70
|
+
>
|
67
71
|
<span>{item.props.label}</span>
|
68
72
|
</button>)}
|
69
73
|
</div>
|
@@ -41,7 +41,10 @@ export class TagInput extends React.Component<IProps> {
|
|
41
41
|
tabindex={this.props.tabindex}
|
42
42
|
>
|
43
43
|
<Chips
|
44
|
-
className={`
|
44
|
+
className={`
|
45
|
+
tags-input--multi-select sd-input__input
|
46
|
+
${this.props.disabled ? ' tags-input__padding-disabled' : ''}`
|
47
|
+
}
|
45
48
|
allowDuplicate={false}
|
46
49
|
separator=","
|
47
50
|
onChange={(event) => onChange(event.value)}
|
@@ -40,12 +40,23 @@ export class ThemeSelector extends React.Component<IProps> {
|
|
40
40
|
<div className='sd-theme-selector__item'
|
41
41
|
key={index}
|
42
42
|
tabIndex={-1}>
|
43
|
-
<figure
|
43
|
+
<figure
|
44
|
+
className="sd-theme-selector__item-thumb"
|
45
|
+
data-theme={item.theme + '-ui'}
|
46
|
+
aria-hidden="true"
|
47
|
+
>
|
44
48
|
<svg viewBox="0 0 156 94" xmlns="http://www.w3.org/2000/svg">
|
45
49
|
<g fill="none" fillRule="evenodd">
|
46
50
|
<path d="m0 0h156v94h-156z" fill="var(--sd-colour-panel-bg--100)" />
|
47
51
|
<circle cx="144" cy="33" fill="var(--color-text-lighter)" r="4" />
|
48
|
-
<rect
|
52
|
+
<rect
|
53
|
+
fill="var(--sd-colour-interactive)"
|
54
|
+
height="15"
|
55
|
+
rx="2"
|
56
|
+
width="58"
|
57
|
+
x="91"
|
58
|
+
y="71"
|
59
|
+
/>
|
49
60
|
<g fill="var(--sd-colour-btn-bg-neutral)">
|
50
61
|
<rect height="15" rx="2" width="58" x="29" y="52" />
|
51
62
|
<rect height="15" rx="2" width="58" x="29" y="71" />
|