@social.io/catalog 1.3.0 → 2.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/.smartconfig.json +51 -0
- package/dist_bundle/bundle.js +5455 -3248
- package/dist_ts_web/00_commitinfo_data.js +3 -3
- package/dist_ts_web/elements/index.d.ts +21 -3
- package/dist_ts_web/elements/index.js +28 -7
- package/dist_ts_web/elements/sio-ai-card.d.ts +39 -0
- package/dist_ts_web/elements/sio-ai-card.js +229 -0
- package/dist_ts_web/elements/sio-avatar.d.ts +46 -0
- package/dist_ts_web/elements/sio-avatar.js +379 -0
- package/dist_ts_web/elements/sio-bucket-header.d.ts +36 -0
- package/dist_ts_web/elements/sio-bucket-header.js +197 -0
- package/dist_ts_web/elements/sio-button.d.ts +7 -3
- package/dist_ts_web/elements/sio-button.js +253 -152
- package/dist_ts_web/elements/sio-channel-rail.d.ts +38 -0
- package/dist_ts_web/elements/sio-channel-rail.js +288 -0
- package/dist_ts_web/elements/sio-chip.d.ts +25 -0
- package/dist_ts_web/elements/sio-chip.js +188 -0
- package/dist_ts_web/elements/sio-cmdk.d.ts +59 -0
- package/dist_ts_web/elements/sio-cmdk.js +471 -0
- package/dist_ts_web/elements/sio-combox.d.ts +55 -1
- package/dist_ts_web/elements/sio-combox.js +458 -261
- package/dist_ts_web/elements/sio-composer.d.ts +48 -0
- package/dist_ts_web/elements/sio-composer.js +357 -0
- package/dist_ts_web/elements/sio-conversation-selector.d.ts +41 -1
- package/dist_ts_web/elements/sio-conversation-selector.js +426 -238
- package/dist_ts_web/elements/sio-conversation-view.d.ts +34 -6
- package/dist_ts_web/elements/sio-conversation-view.js +738 -564
- package/dist_ts_web/elements/sio-dropdown-menu.d.ts +6 -6
- package/dist_ts_web/elements/sio-dropdown-menu.js +223 -169
- package/dist_ts_web/elements/sio-fab.d.ts +23 -5
- package/dist_ts_web/elements/sio-fab.js +259 -235
- package/dist_ts_web/elements/sio-glass-toolbar.d.ts +22 -0
- package/dist_ts_web/elements/sio-glass-toolbar.js +178 -0
- package/dist_ts_web/elements/sio-icon.d.ts +1 -0
- package/dist_ts_web/elements/sio-icon.js +254 -94
- package/dist_ts_web/elements/sio-image-lightbox.d.ts +3 -4
- package/dist_ts_web/elements/sio-image-lightbox.js +282 -191
- package/dist_ts_web/elements/sio-inset-list.d.ts +28 -0
- package/dist_ts_web/elements/sio-inset-list.js +191 -0
- package/dist_ts_web/elements/sio-kbd.d.ts +16 -0
- package/dist_ts_web/elements/sio-kbd.js +117 -0
- package/dist_ts_web/elements/sio-list-row.d.ts +55 -0
- package/dist_ts_web/elements/sio-list-row.js +462 -0
- package/dist_ts_web/elements/sio-logo-render.d.ts +42 -0
- package/dist_ts_web/elements/sio-logo-render.js +306 -0
- package/dist_ts_web/elements/sio-logo.d.ts +64 -0
- package/dist_ts_web/elements/sio-logo.js +393 -0
- package/dist_ts_web/elements/sio-message-input.d.ts +25 -4
- package/dist_ts_web/elements/sio-message-input.js +231 -226
- package/dist_ts_web/elements/sio-paper-thumb.d.ts +24 -0
- package/dist_ts_web/elements/sio-paper-thumb.js +293 -0
- package/dist_ts_web/elements/sio-pdf-viewer.d.ts +2 -0
- package/dist_ts_web/elements/sio-pdf-viewer.js +344 -244
- package/dist_ts_web/elements/sio-segmented.d.ts +32 -0
- package/dist_ts_web/elements/sio-segmented.js +217 -0
- package/dist_ts_web/elements/sio-step-timeline.d.ts +28 -0
- package/dist_ts_web/elements/sio-step-timeline.js +222 -0
- package/dist_ts_web/elements/sio-tab-bar.d.ts +36 -0
- package/dist_ts_web/elements/sio-tab-bar.js +232 -0
- package/dist_ts_web/elements/sio-unread-badge.d.ts +25 -0
- package/dist_ts_web/elements/sio-unread-badge.js +203 -0
- package/dist_ts_web/elements/sio-waveform.d.ts +34 -0
- package/dist_ts_web/elements/sio-waveform.js +304 -0
- package/dist_ts_web/elements/tokens.d.ts +70 -0
- package/dist_ts_web/elements/tokens.js +277 -0
- package/dist_ts_web/pages/firstpage.d.ts +5 -0
- package/dist_ts_web/pages/firstpage.js +21 -2
- package/dist_ts_web/pages/mainpage.d.ts +6 -0
- package/dist_ts_web/pages/mainpage.js +111 -39
- package/{license → license.md} +3 -1
- package/package.json +23 -29
- package/readme.hints.md +82 -0
- package/readme.md +113 -146
- package/ts_web/00_commitinfo_data.ts +2 -2
- package/ts_web/elements/index.ts +31 -7
- package/ts_web/elements/sio-ai-card.ts +175 -0
- package/ts_web/elements/sio-avatar.ts +295 -0
- package/ts_web/elements/sio-bucket-header.ts +157 -0
- package/ts_web/elements/sio-button.ts +149 -127
- package/ts_web/elements/sio-channel-rail.ts +256 -0
- package/ts_web/elements/sio-chip.ts +134 -0
- package/ts_web/elements/sio-cmdk.ts +461 -0
- package/ts_web/elements/sio-combox.ts +327 -204
- package/ts_web/elements/sio-composer.ts +306 -0
- package/ts_web/elements/sio-conversation-selector.ts +350 -228
- package/ts_web/elements/sio-conversation-view.ts +573 -457
- package/ts_web/elements/sio-dropdown-menu.ts +112 -130
- package/ts_web/elements/sio-fab.ts +192 -227
- package/ts_web/elements/sio-glass-toolbar.ts +140 -0
- package/ts_web/elements/sio-icon.ts +147 -25
- package/ts_web/elements/sio-image-lightbox.ts +62 -64
- package/ts_web/elements/sio-inset-list.ts +140 -0
- package/ts_web/elements/sio-kbd.ts +80 -0
- package/ts_web/elements/sio-list-row.ts +393 -0
- package/ts_web/elements/sio-logo-render.ts +367 -0
- package/ts_web/elements/sio-logo.ts +311 -0
- package/ts_web/elements/sio-message-input.ts +142 -221
- package/ts_web/elements/sio-paper-thumb.ts +244 -0
- package/ts_web/elements/sio-pdf-viewer.ts +58 -60
- package/ts_web/elements/sio-segmented.ts +183 -0
- package/ts_web/elements/sio-step-timeline.ts +179 -0
- package/ts_web/elements/sio-tab-bar.ts +195 -0
- package/ts_web/elements/sio-unread-badge.ts +147 -0
- package/ts_web/elements/sio-waveform.ts +239 -0
- package/ts_web/elements/tokens.ts +297 -0
- package/ts_web/pages/firstpage.ts +20 -1
- package/ts_web/pages/mainpage.ts +111 -39
- package/dist_bundle/bundle.js.map +0 -7
- package/dist_ts_web/elements/00colors.d.ts +0 -108
- package/dist_ts_web/elements/00colors.js +0 -137
- package/dist_ts_web/elements/00fonts.d.ts +0 -60
- package/dist_ts_web/elements/00fonts.js +0 -129
- package/dist_ts_web/elements/00tokens.d.ts +0 -123
- package/dist_ts_web/elements/00tokens.js +0 -176
- package/dist_ts_web/elements/sio-conversation-list.d.ts +0 -20
- package/dist_ts_web/elements/sio-conversation-list.js +0 -495
- package/dist_ts_web/elements/sio-recorder.d.ts +0 -60
- package/dist_ts_web/elements/sio-recorder.js +0 -173
- package/dist_ts_web/elements/sio-subwidget-conversations.d.ts +0 -16
- package/dist_ts_web/elements/sio-subwidget-conversations.js +0 -350
- package/dist_ts_web/elements/sio-subwidget-onboardme.d.ts +0 -7
- package/dist_ts_web/elements/sio-subwidget-onboardme.js +0 -243
- package/dist_watch/bundle.js +0 -81694
- package/dist_watch/bundle.js.map +0 -7
- package/dist_watch/index.html +0 -25
- package/npmextra.json +0 -19
- package/ts_web/elements/00colors.ts +0 -164
- package/ts_web/elements/00fonts.ts +0 -145
- package/ts_web/elements/00tokens.ts +0 -197
- package/ts_web/elements/sio-recorder.ts +0 -213
|
@@ -3,16 +3,22 @@ import {
|
|
|
3
3
|
html,
|
|
4
4
|
property,
|
|
5
5
|
customElement,
|
|
6
|
-
cssManager,
|
|
7
6
|
css,
|
|
8
|
-
unsafeCSS,
|
|
9
7
|
type TemplateResult,
|
|
10
8
|
} from '@design.estate/dees-element';
|
|
11
9
|
|
|
12
|
-
|
|
13
|
-
import
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
import { sioElementStyles } from './tokens.js';
|
|
11
|
+
import './sio-icon.js';
|
|
12
|
+
|
|
13
|
+
export type TSioButtonType =
|
|
14
|
+
| 'default'
|
|
15
|
+
| 'primary'
|
|
16
|
+
| 'secondary'
|
|
17
|
+
| 'destructive'
|
|
18
|
+
| 'outline'
|
|
19
|
+
| 'ghost';
|
|
20
|
+
export type TSioButtonSize = 'sm' | 'default' | 'lg';
|
|
21
|
+
export type TSioButtonStatus = 'normal' | 'pending' | 'success' | 'error';
|
|
16
22
|
|
|
17
23
|
declare global {
|
|
18
24
|
interface HTMLElementTagNameMap {
|
|
@@ -23,15 +29,45 @@ declare global {
|
|
|
23
29
|
@customElement('sio-button')
|
|
24
30
|
export class SioButton extends DeesElement {
|
|
25
31
|
public static demo = () => html`
|
|
26
|
-
<div
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
<
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
<div
|
|
33
|
+
style="display: flex; flex-direction: column; gap: 20px; padding: 24px; background: var(--sio-bg); border-radius: 14px;"
|
|
34
|
+
>
|
|
35
|
+
<div style="display: flex; gap: 10px; flex-wrap: wrap; align-items: center;">
|
|
36
|
+
<sio-button type="primary">
|
|
37
|
+
<sio-icon icon="pencil" size="15"></sio-icon>
|
|
38
|
+
Compose
|
|
39
|
+
</sio-button>
|
|
40
|
+
<sio-button type="secondary">
|
|
41
|
+
<sio-icon icon="archive" size="15"></sio-icon>
|
|
42
|
+
Archive
|
|
43
|
+
</sio-button>
|
|
44
|
+
<sio-button type="outline">
|
|
45
|
+
<sio-icon icon="clock" size="15"></sio-icon>
|
|
46
|
+
Move to Later
|
|
47
|
+
</sio-button>
|
|
48
|
+
<sio-button type="ghost">Dismiss</sio-button>
|
|
49
|
+
<sio-button type="destructive">
|
|
50
|
+
<sio-icon icon="trash" size="15"></sio-icon>
|
|
51
|
+
Delete thread
|
|
52
|
+
</sio-button>
|
|
53
|
+
</div>
|
|
54
|
+
<div style="display: flex; gap: 10px; flex-wrap: wrap; align-items: center;">
|
|
55
|
+
<sio-button type="primary" size="sm">Reply</sio-button>
|
|
56
|
+
<sio-button type="secondary" size="sm">Forward</sio-button>
|
|
57
|
+
<sio-button type="primary">Mark as Done</sio-button>
|
|
58
|
+
<sio-button type="primary" size="lg">
|
|
59
|
+
<sio-icon icon="send" size="17"></sio-icon>
|
|
60
|
+
Send
|
|
61
|
+
</sio-button>
|
|
62
|
+
<sio-button type="outline" size="lg">Save draft</sio-button>
|
|
63
|
+
</div>
|
|
64
|
+
<div style="display: flex; gap: 10px; flex-wrap: wrap; align-items: center;">
|
|
65
|
+
<sio-button type="primary" status="pending">Sending…</sio-button>
|
|
66
|
+
<sio-button type="primary" status="success">Sent</sio-button>
|
|
67
|
+
<sio-button type="destructive" status="error">Failed</sio-button>
|
|
68
|
+
<sio-button type="primary" disabled>Compose</sio-button>
|
|
69
|
+
<sio-button type="secondary" disabled>Archive</sio-button>
|
|
70
|
+
</div>
|
|
35
71
|
</div>
|
|
36
72
|
`;
|
|
37
73
|
|
|
@@ -39,23 +75,22 @@ export class SioButton extends DeesElement {
|
|
|
39
75
|
public accessor text: string = '';
|
|
40
76
|
|
|
41
77
|
@property({ type: String })
|
|
42
|
-
public accessor type:
|
|
78
|
+
public accessor type: TSioButtonType = 'default';
|
|
43
79
|
|
|
44
80
|
@property({ type: String })
|
|
45
|
-
public accessor size:
|
|
81
|
+
public accessor size: TSioButtonSize = 'default';
|
|
46
82
|
|
|
47
83
|
@property({ type: Boolean, reflect: true })
|
|
48
84
|
public accessor disabled: boolean = false;
|
|
49
85
|
|
|
50
86
|
@property({ type: String })
|
|
51
|
-
public accessor status:
|
|
87
|
+
public accessor status: TSioButtonStatus = 'normal';
|
|
52
88
|
|
|
53
89
|
public static styles = [
|
|
54
|
-
|
|
90
|
+
...sioElementStyles,
|
|
55
91
|
css`
|
|
56
92
|
:host {
|
|
57
93
|
display: inline-block;
|
|
58
|
-
font-family: ${unsafeCSS(fontFamilies.sans)};
|
|
59
94
|
}
|
|
60
95
|
|
|
61
96
|
:host([disabled]) {
|
|
@@ -68,210 +103,199 @@ export class SioButton extends DeesElement {
|
|
|
68
103
|
align-items: center;
|
|
69
104
|
justify-content: center;
|
|
70
105
|
white-space: nowrap;
|
|
71
|
-
border
|
|
72
|
-
|
|
73
|
-
font-
|
|
106
|
+
border: var(--sio-hairline) solid transparent;
|
|
107
|
+
border-radius: var(--sio-radius);
|
|
108
|
+
font-family: var(--sio-font-sf);
|
|
109
|
+
font-weight: 600;
|
|
74
110
|
line-height: 1;
|
|
75
|
-
|
|
76
|
-
|
|
111
|
+
transition:
|
|
112
|
+
background 120ms ease,
|
|
113
|
+
color 120ms ease,
|
|
114
|
+
border-color 120ms ease,
|
|
115
|
+
transform 80ms ease;
|
|
77
116
|
cursor: pointer;
|
|
78
117
|
user-select: none;
|
|
79
118
|
outline: none;
|
|
80
|
-
border: none;
|
|
81
119
|
gap: 6px;
|
|
82
120
|
}
|
|
83
121
|
|
|
84
|
-
|
|
122
|
+
.button:active:not(.disabled) {
|
|
123
|
+
transform: scale(0.98);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.button:focus-visible {
|
|
127
|
+
outline: 2px solid color-mix(in oklab, var(--sio-tint) 40%, transparent);
|
|
128
|
+
outline-offset: 2px;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/* Size ramp — SF footnote/subheadline tracking */
|
|
85
132
|
.button.size-sm {
|
|
86
|
-
height:
|
|
87
|
-
padding: 0
|
|
88
|
-
font-size:
|
|
133
|
+
height: 28px;
|
|
134
|
+
padding: 0 10px;
|
|
135
|
+
font-size: 12px;
|
|
136
|
+
letter-spacing: 0;
|
|
137
|
+
gap: 5px;
|
|
89
138
|
}
|
|
90
139
|
|
|
91
140
|
.button.size-default {
|
|
92
141
|
height: 36px;
|
|
93
|
-
padding: 0
|
|
94
|
-
font-size:
|
|
142
|
+
padding: 0 14px;
|
|
143
|
+
font-size: 13px;
|
|
144
|
+
letter-spacing: -0.08px;
|
|
95
145
|
}
|
|
96
146
|
|
|
97
147
|
.button.size-lg {
|
|
98
|
-
height:
|
|
99
|
-
padding: 0
|
|
148
|
+
height: 44px;
|
|
149
|
+
padding: 0 20px;
|
|
100
150
|
font-size: 15px;
|
|
151
|
+
letter-spacing: -0.24px;
|
|
101
152
|
}
|
|
102
153
|
|
|
103
|
-
/*
|
|
104
|
-
.button.default
|
|
105
|
-
|
|
106
|
-
|
|
154
|
+
/* default falls back to the secondary look (iOS gray fill) */
|
|
155
|
+
.button.default,
|
|
156
|
+
.button.secondary {
|
|
157
|
+
background: var(--sio-surface-2);
|
|
158
|
+
color: var(--sio-label);
|
|
107
159
|
}
|
|
108
160
|
|
|
109
|
-
.button.default:hover:not(.disabled)
|
|
110
|
-
|
|
161
|
+
.button.default:hover:not(.disabled),
|
|
162
|
+
.button.secondary:hover:not(.disabled) {
|
|
163
|
+
background: color-mix(in oklab, var(--sio-label) 10%, transparent);
|
|
111
164
|
}
|
|
112
165
|
|
|
113
|
-
.button.default:active:not(.disabled)
|
|
114
|
-
|
|
166
|
+
.button.default:active:not(.disabled),
|
|
167
|
+
.button.secondary:active:not(.disabled) {
|
|
168
|
+
background: color-mix(in oklab, var(--sio-label) 14%, transparent);
|
|
115
169
|
}
|
|
116
170
|
|
|
171
|
+
/* primary — solid system tint. The on-tint label is white in both
|
|
172
|
+
themes per the v7 spec (solid tint/red fills always carry white). */
|
|
117
173
|
.button.primary {
|
|
118
|
-
background:
|
|
119
|
-
color:
|
|
174
|
+
background: var(--sio-tint);
|
|
175
|
+
color: #ffffff;
|
|
120
176
|
}
|
|
121
177
|
|
|
122
178
|
.button.primary:hover:not(.disabled) {
|
|
123
|
-
background:
|
|
179
|
+
background: var(--sio-tint-hover);
|
|
124
180
|
}
|
|
125
181
|
|
|
126
182
|
.button.primary:active:not(.disabled) {
|
|
127
|
-
background:
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/* Secondary variant */
|
|
131
|
-
.button.secondary {
|
|
132
|
-
background: transparent;
|
|
133
|
-
color: ${bdTheme('hsl(0 0% 15%)', 'hsl(0 0% 95%)')};
|
|
134
|
-
box-shadow: inset 0 0 0 1px ${bdTheme('hsl(0 0% 85%)', 'hsl(0 0% 25%)')};
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
.button.secondary:hover:not(.disabled) {
|
|
138
|
-
background: ${bdTheme('hsl(0 0% 96%)', 'hsl(0 0% 15%)')};
|
|
183
|
+
background: color-mix(in oklab, var(--sio-tint) 88%, var(--sio-label));
|
|
139
184
|
}
|
|
140
185
|
|
|
141
|
-
|
|
142
|
-
background: ${bdTheme('hsl(0 0% 92%)', 'hsl(0 0% 12%)')};
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/* Destructive variant */
|
|
186
|
+
/* destructive — solid system red */
|
|
146
187
|
.button.destructive {
|
|
147
|
-
background:
|
|
148
|
-
color:
|
|
188
|
+
background: var(--sio-red);
|
|
189
|
+
color: #ffffff;
|
|
149
190
|
}
|
|
150
191
|
|
|
151
192
|
.button.destructive:hover:not(.disabled) {
|
|
152
|
-
background:
|
|
153
|
-
color: white;
|
|
193
|
+
background: color-mix(in oklab, var(--sio-red) 88%, var(--sio-label));
|
|
154
194
|
}
|
|
155
195
|
|
|
156
196
|
.button.destructive:active:not(.disabled) {
|
|
157
|
-
background:
|
|
158
|
-
color: white;
|
|
197
|
+
background: color-mix(in oklab, var(--sio-red) 80%, var(--sio-label));
|
|
159
198
|
}
|
|
160
199
|
|
|
200
|
+
/* outline — hairline ring, quiet label */
|
|
161
201
|
.button.outline {
|
|
162
202
|
background: transparent;
|
|
163
|
-
color:
|
|
164
|
-
|
|
203
|
+
color: var(--sio-label);
|
|
204
|
+
border-color: var(--sio-separator-opaque);
|
|
165
205
|
}
|
|
166
206
|
|
|
167
207
|
.button.outline:hover:not(.disabled) {
|
|
168
|
-
|
|
169
|
-
box-shadow: inset 0 0 0 1.5px ${bdTheme('hsl(0 0% 70%)', 'hsl(0 0% 50%)')};
|
|
208
|
+
background: var(--sio-surface-2);
|
|
170
209
|
}
|
|
171
210
|
|
|
172
211
|
.button.outline:active:not(.disabled) {
|
|
173
|
-
background:
|
|
212
|
+
background: color-mix(in oklab, var(--sio-label) 10%, transparent);
|
|
174
213
|
}
|
|
175
214
|
|
|
215
|
+
/* ghost — bare label, fill on hover */
|
|
176
216
|
.button.ghost {
|
|
177
217
|
background: transparent;
|
|
178
|
-
color:
|
|
218
|
+
color: var(--sio-label-2);
|
|
179
219
|
}
|
|
180
220
|
|
|
181
221
|
.button.ghost:hover:not(.disabled) {
|
|
182
|
-
color:
|
|
183
|
-
background:
|
|
222
|
+
color: var(--sio-label);
|
|
223
|
+
background: var(--sio-surface-2);
|
|
184
224
|
}
|
|
185
225
|
|
|
186
226
|
.button.ghost:active:not(.disabled) {
|
|
187
|
-
background:
|
|
227
|
+
background: color-mix(in oklab, var(--sio-label) 10%, transparent);
|
|
188
228
|
}
|
|
189
229
|
|
|
190
230
|
/* Status states */
|
|
191
231
|
.button.pending {
|
|
192
232
|
pointer-events: none;
|
|
193
|
-
opacity: 0.
|
|
233
|
+
opacity: 0.75;
|
|
194
234
|
}
|
|
195
235
|
|
|
196
236
|
.spinner {
|
|
197
|
-
|
|
198
|
-
left: ${unsafeCSS(spacing["3"])};
|
|
199
|
-
animation: spin 1s linear infinite;
|
|
237
|
+
animation: spin 900ms linear infinite;
|
|
200
238
|
}
|
|
201
239
|
|
|
202
240
|
@keyframes spin {
|
|
203
|
-
from {
|
|
204
|
-
|
|
241
|
+
from {
|
|
242
|
+
transform: rotate(0deg);
|
|
243
|
+
}
|
|
244
|
+
to {
|
|
245
|
+
transform: rotate(360deg);
|
|
246
|
+
}
|
|
205
247
|
}
|
|
206
248
|
|
|
207
249
|
.button.success {
|
|
208
|
-
background:
|
|
209
|
-
color:
|
|
250
|
+
background: var(--sio-green);
|
|
251
|
+
color: #ffffff;
|
|
210
252
|
pointer-events: none;
|
|
211
253
|
}
|
|
212
254
|
|
|
213
255
|
.button.error {
|
|
214
|
-
background:
|
|
215
|
-
color:
|
|
256
|
+
background: var(--sio-red);
|
|
257
|
+
color: #ffffff;
|
|
216
258
|
pointer-events: none;
|
|
217
259
|
}
|
|
218
260
|
|
|
219
261
|
/* Disabled state */
|
|
220
262
|
.button.disabled {
|
|
221
|
-
opacity: 0.
|
|
263
|
+
opacity: 0.45;
|
|
222
264
|
cursor: not-allowed;
|
|
223
265
|
transform: none !important;
|
|
224
266
|
}
|
|
225
267
|
|
|
226
|
-
/* Focus state */
|
|
227
|
-
.button:focus-visible {
|
|
228
|
-
outline: 2px solid ${bdTheme('hsl(0 0% 15% / 0.2)', 'hsl(0 0% 95% / 0.2)')};
|
|
229
|
-
outline-offset: 2px;
|
|
230
|
-
}
|
|
231
|
-
|
|
232
268
|
/* Icon sizing within buttons */
|
|
233
269
|
.button sio-icon {
|
|
234
|
-
width: 16px;
|
|
235
|
-
height: 16px;
|
|
236
270
|
flex-shrink: 0;
|
|
237
271
|
}
|
|
238
|
-
|
|
239
|
-
.button.size-sm sio-icon {
|
|
240
|
-
width: 14px;
|
|
241
|
-
height: 14px;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
.button.size-lg sio-icon {
|
|
245
|
-
width: 18px;
|
|
246
|
-
height: 18px;
|
|
247
|
-
}
|
|
248
272
|
`,
|
|
249
273
|
];
|
|
250
274
|
|
|
251
275
|
public render(): TemplateResult {
|
|
252
276
|
const buttonClasses = [
|
|
253
277
|
'button',
|
|
254
|
-
this.type
|
|
278
|
+
this.type,
|
|
255
279
|
`size-${this.size}`,
|
|
256
280
|
this.disabled ? 'disabled' : '',
|
|
257
281
|
this.status,
|
|
258
|
-
]
|
|
282
|
+
]
|
|
283
|
+
.filter(Boolean)
|
|
284
|
+
.join(' ');
|
|
285
|
+
|
|
286
|
+
const statusIconSize = this.size === 'sm' ? 13 : this.size === 'lg' ? 17 : 15;
|
|
259
287
|
|
|
260
288
|
return html`
|
|
261
|
-
<button
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
` : ''}
|
|
272
|
-
${this.status === 'error' ? html`
|
|
273
|
-
<sio-icon icon="x" size="16"></sio-icon>
|
|
274
|
-
` : ''}
|
|
289
|
+
<button class="${buttonClasses}" ?disabled=${this.disabled} @click=${this.handleClick}>
|
|
290
|
+
${this.status === 'pending'
|
|
291
|
+
? html`<sio-icon class="spinner" icon="loader" size=${statusIconSize}></sio-icon>`
|
|
292
|
+
: ''}
|
|
293
|
+
${this.status === 'success'
|
|
294
|
+
? html`<sio-icon icon="check" size=${statusIconSize}></sio-icon>`
|
|
295
|
+
: ''}
|
|
296
|
+
${this.status === 'error'
|
|
297
|
+
? html`<sio-icon icon="x" size=${statusIconSize}></sio-icon>`
|
|
298
|
+
: ''}
|
|
275
299
|
<slot>${this.text}</slot>
|
|
276
300
|
</button>
|
|
277
301
|
`;
|
|
@@ -283,9 +307,7 @@ export class SioButton extends DeesElement {
|
|
|
283
307
|
event.stopPropagation();
|
|
284
308
|
return;
|
|
285
309
|
}
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
// Let the native click bubble normally
|
|
289
|
-
// Don't dispatch a custom event to avoid double-triggering
|
|
310
|
+
// Let the native click bubble normally — no synthetic event, so
|
|
311
|
+
// consumers never see a double trigger.
|
|
290
312
|
}
|
|
291
|
-
}
|
|
313
|
+
}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DeesElement,
|
|
3
|
+
html,
|
|
4
|
+
property,
|
|
5
|
+
customElement,
|
|
6
|
+
css,
|
|
7
|
+
type TemplateResult,
|
|
8
|
+
} from '@design.estate/dees-element';
|
|
9
|
+
import { sioElementStyles } from './tokens.js';
|
|
10
|
+
import './sio-icon.js';
|
|
11
|
+
import './sio-logo.js';
|
|
12
|
+
|
|
13
|
+
declare global {
|
|
14
|
+
interface HTMLElementTagNameMap {
|
|
15
|
+
'sio-channel-rail': SioChannelRail;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface ISioChannelRailItem {
|
|
20
|
+
id: string;
|
|
21
|
+
label: string;
|
|
22
|
+
color: string;
|
|
23
|
+
icon: string;
|
|
24
|
+
unread?: number;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface ISioChannelSelectDetail {
|
|
28
|
+
id: string;
|
|
29
|
+
channel: ISioChannelRailItem;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* The v7 channel set — All / Mail / Chats / Calls / Letters
|
|
34
|
+
* (prototype: SIO_CHANNELS in SocialIOData.jsx).
|
|
35
|
+
*/
|
|
36
|
+
const defaultChannels: ISioChannelRailItem[] = [
|
|
37
|
+
{ id: 'all', label: 'All', color: 'var(--sio-blue)', icon: 'grid-2x2' },
|
|
38
|
+
{ id: 'mail', label: 'Mail', color: 'var(--sio-ch-mail)', icon: 'mail' },
|
|
39
|
+
{ id: 'chats', label: 'Chats', color: 'var(--sio-ch-chats)', icon: 'message-circle' },
|
|
40
|
+
{ id: 'calls', label: 'Calls', color: 'var(--sio-ch-calls)', icon: 'phone' },
|
|
41
|
+
{ id: 'letters', label: 'Letters', color: 'var(--sio-ch-letters)', icon: 'file-text' },
|
|
42
|
+
];
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* sio-channel-rail — the 64px channel column at the very left of the
|
|
46
|
+
* desktop window (v7 prototype: SIOChannelRail in
|
|
47
|
+
* SocialIODesktopChannels.jsx).
|
|
48
|
+
*
|
|
49
|
+
* Each item stacks an 18px icon over a 10px label; the active item gets a
|
|
50
|
+
* rounded-10 chip and its channel color, and every item can carry an unread
|
|
51
|
+
* badge (channel-colored pill at top -5 / right -9 with a 2px ring cut out
|
|
52
|
+
* of the rail). Selecting a channel dispatches `channel-select` with
|
|
53
|
+
* `{ id, channel }` (bubbles, composed).
|
|
54
|
+
*/
|
|
55
|
+
@customElement('sio-channel-rail')
|
|
56
|
+
export class SioChannelRail extends DeesElement {
|
|
57
|
+
public static demo = () => html`
|
|
58
|
+
<div style="display: flex; gap: 24px; font-family: var(--sio-font-sf);">
|
|
59
|
+
<!-- busy morning: unreads on every channel -->
|
|
60
|
+
<div
|
|
61
|
+
style="display: flex; height: 340px; border-radius: 12px; overflow: hidden; border: var(--sio-hairline) solid var(--sio-separator);"
|
|
62
|
+
>
|
|
63
|
+
<sio-channel-rail
|
|
64
|
+
active="mail"
|
|
65
|
+
.channels=${[
|
|
66
|
+
{ id: 'all', label: 'All', color: 'var(--sio-blue)', icon: 'grid-2x2', unread: 3 },
|
|
67
|
+
{ id: 'mail', label: 'Mail', color: 'var(--sio-ch-mail)', icon: 'mail', unread: 4 },
|
|
68
|
+
{ id: 'chats', label: 'Chats', color: 'var(--sio-ch-chats)', icon: 'message-circle', unread: 7 },
|
|
69
|
+
{ id: 'calls', label: 'Calls', color: 'var(--sio-ch-calls)', icon: 'phone', unread: 1 },
|
|
70
|
+
{ id: 'letters', label: 'Letters', color: 'var(--sio-ch-letters)', icon: 'file-text', unread: 2 },
|
|
71
|
+
]}
|
|
72
|
+
></sio-channel-rail>
|
|
73
|
+
<div style="width: 210px; background: var(--sio-surface); padding: 14px 16px;">
|
|
74
|
+
<div style="font-size: 13px; font-weight: 600; color: var(--sio-label);">Inbox</div>
|
|
75
|
+
<div style="margin-top: 2px; font-size: 11px; color: var(--sio-label-3);">
|
|
76
|
+
4 unread · Feed 12 · Paper 4
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
|
|
81
|
+
<!-- Letters active, all clear -->
|
|
82
|
+
<div
|
|
83
|
+
style="display: flex; height: 340px; border-radius: 12px; overflow: hidden; border: var(--sio-hairline) solid var(--sio-separator);"
|
|
84
|
+
>
|
|
85
|
+
<sio-channel-rail active="letters"></sio-channel-rail>
|
|
86
|
+
<div style="width: 210px; background: var(--sio-surface); padding: 14px 16px;">
|
|
87
|
+
<div style="font-size: 13px; font-weight: 600; color: var(--sio-label);">Letters</div>
|
|
88
|
+
<div style="margin-top: 2px; font-size: 11px; color: var(--sio-label-3);">
|
|
89
|
+
Scan station online · 1 queued
|
|
90
|
+
</div>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
94
|
+
`;
|
|
95
|
+
|
|
96
|
+
@property({ type: Array })
|
|
97
|
+
public accessor channels: ISioChannelRailItem[] = defaultChannels;
|
|
98
|
+
|
|
99
|
+
@property({ type: String })
|
|
100
|
+
public accessor active = 'mail';
|
|
101
|
+
|
|
102
|
+
public static styles = [
|
|
103
|
+
...sioElementStyles,
|
|
104
|
+
css`
|
|
105
|
+
:host {
|
|
106
|
+
display: block;
|
|
107
|
+
height: 100%;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/* Rail chrome: the systemGray fill composited over the canvas —
|
|
111
|
+
#E8E8EC light / #1C1C1F dark, matching the design's #EDEDEE/#17171A
|
|
112
|
+
from tokens alone. */
|
|
113
|
+
.rail {
|
|
114
|
+
width: 64px;
|
|
115
|
+
height: 100%;
|
|
116
|
+
box-sizing: border-box;
|
|
117
|
+
display: flex;
|
|
118
|
+
flex-direction: column;
|
|
119
|
+
align-items: stretch;
|
|
120
|
+
gap: 2px;
|
|
121
|
+
padding: 10px 8px;
|
|
122
|
+
background-color: var(--sio-bg);
|
|
123
|
+
background-image: linear-gradient(var(--sio-surface-2), var(--sio-surface-2));
|
|
124
|
+
border-right: var(--sio-hairline) solid var(--sio-separator);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.brand {
|
|
128
|
+
height: 35px;
|
|
129
|
+
box-sizing: border-box;
|
|
130
|
+
display: flex;
|
|
131
|
+
align-items: flex-start;
|
|
132
|
+
justify-content: center;
|
|
133
|
+
padding: 2px 0 9px;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.item {
|
|
137
|
+
appearance: none;
|
|
138
|
+
border: none;
|
|
139
|
+
margin: 0;
|
|
140
|
+
position: relative;
|
|
141
|
+
padding: 8px 0;
|
|
142
|
+
border-radius: var(--sio-radius);
|
|
143
|
+
background: transparent;
|
|
144
|
+
display: flex;
|
|
145
|
+
flex-direction: column;
|
|
146
|
+
align-items: center;
|
|
147
|
+
gap: 3px;
|
|
148
|
+
font-family: var(--sio-font-sf);
|
|
149
|
+
cursor: pointer;
|
|
150
|
+
-webkit-tap-highlight-color: transparent;
|
|
151
|
+
transition: background 120ms ease, color 120ms ease;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.item.active {
|
|
155
|
+
background: color-mix(in oklab, var(--sio-label) 5%, transparent);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
.item:focus-visible {
|
|
159
|
+
outline: 2px solid color-mix(in oklab, var(--sio-tint) 40%, transparent);
|
|
160
|
+
outline-offset: -2px;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.glyph {
|
|
164
|
+
position: relative;
|
|
165
|
+
display: flex;
|
|
166
|
+
align-items: center;
|
|
167
|
+
justify-content: center;
|
|
168
|
+
color: var(--sio-label-3);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.item.active .glyph {
|
|
172
|
+
color: var(--_channel-color, var(--sio-tint));
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.badge {
|
|
176
|
+
position: absolute;
|
|
177
|
+
top: -5px;
|
|
178
|
+
right: -9px;
|
|
179
|
+
min-width: 15px;
|
|
180
|
+
height: 15px;
|
|
181
|
+
padding: 0 4px;
|
|
182
|
+
box-sizing: border-box;
|
|
183
|
+
border-radius: 8px;
|
|
184
|
+
background: var(--_channel-color, var(--sio-tint));
|
|
185
|
+
/* fixed foreground on the theme-stable channel palette */
|
|
186
|
+
color: #ffffff;
|
|
187
|
+
font-size: 10px;
|
|
188
|
+
font-weight: 700;
|
|
189
|
+
font-variant-numeric: tabular-nums;
|
|
190
|
+
display: flex;
|
|
191
|
+
align-items: center;
|
|
192
|
+
justify-content: center;
|
|
193
|
+
line-height: 1;
|
|
194
|
+
/* 2px ring in the rail's own chrome tone */
|
|
195
|
+
box-shadow: 0 0 0 2px color-mix(in srgb, var(--sio-label) 8%, var(--sio-bg));
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
.label {
|
|
199
|
+
font-size: 10px;
|
|
200
|
+
font-weight: 500;
|
|
201
|
+
letter-spacing: 0.02px;
|
|
202
|
+
line-height: 1.25;
|
|
203
|
+
color: var(--sio-label-2);
|
|
204
|
+
white-space: nowrap;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
.item.active .label {
|
|
208
|
+
font-weight: 600;
|
|
209
|
+
color: var(--sio-label);
|
|
210
|
+
}
|
|
211
|
+
`,
|
|
212
|
+
];
|
|
213
|
+
|
|
214
|
+
public render(): TemplateResult {
|
|
215
|
+
return html`
|
|
216
|
+
<nav class="rail" part="rail">
|
|
217
|
+
<div class="brand" part="brand">
|
|
218
|
+
<sio-logo size="24" no-entrance no-hover aria-hidden="true"></sio-logo>
|
|
219
|
+
</div>
|
|
220
|
+
${this.channels.map(
|
|
221
|
+
(channel) => html`
|
|
222
|
+
<button
|
|
223
|
+
type="button"
|
|
224
|
+
class="item ${channel.id === this.active ? 'active' : ''}"
|
|
225
|
+
style="--_channel-color: ${channel.color}"
|
|
226
|
+
aria-current=${channel.id === this.active ? 'page' : 'false'}
|
|
227
|
+
@click=${() => this.handleSelect(channel)}
|
|
228
|
+
>
|
|
229
|
+
<span class="glyph">
|
|
230
|
+
<sio-icon icon=${channel.icon} size="18" .strokeWidth=${1.7}></sio-icon>
|
|
231
|
+
${channel.unread
|
|
232
|
+
? html`<span class="badge">${channel.unread}</span>`
|
|
233
|
+
: html``}
|
|
234
|
+
</span>
|
|
235
|
+
<span class="label">${channel.label}</span>
|
|
236
|
+
</button>
|
|
237
|
+
`,
|
|
238
|
+
)}
|
|
239
|
+
</nav>
|
|
240
|
+
`;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
private handleSelect(channel: ISioChannelRailItem): void {
|
|
244
|
+
if (channel.id === this.active) {
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
this.active = channel.id;
|
|
248
|
+
this.dispatchEvent(
|
|
249
|
+
new CustomEvent<ISioChannelSelectDetail>('channel-select', {
|
|
250
|
+
detail: { id: channel.id, channel },
|
|
251
|
+
bubbles: true,
|
|
252
|
+
composed: true,
|
|
253
|
+
}),
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
}
|