@idp.global/catalog 1.1.1
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/assets/v2/draw-41d55381-b162-433d-956c-fe4cd400212e.png +0 -0
- package/assets/v2/draw-bd386bf3-ce94-4452-88da-05ae372fae35.png +0 -0
- package/assets/v2/draw-be69231a-f491-4bd3-9a47-71561ce14c15.png +0 -0
- package/assets/v2/draw-d58859a8-0615-44ec-80fe-626033c888f7.png +0 -0
- package/assets/v2/draw-db67b502-d987-4226-a5f8-d57e3f8d7ba9.png +0 -0
- package/assets/v2/draw-e6ac3ef5-5a93-464d-9d3f-5ae7b7278bdd.png +0 -0
- package/changelog.md +26 -0
- package/dist_bundle/bundle.js +6385 -0
- package/dist_ts_web/00_commitinfo_data.d.ts +8 -0
- package/dist_ts_web/00_commitinfo_data.js +9 -0
- package/dist_ts_web/elements/idp-admin-shell.d.ts +292 -0
- package/dist_ts_web/elements/idp-admin-shell.js +2615 -0
- package/dist_ts_web/elements/idp-approval-card.d.ts +25 -0
- package/dist_ts_web/elements/idp-approval-card.js +274 -0
- package/dist_ts_web/elements/idp-badge.d.ts +14 -0
- package/dist_ts_web/elements/idp-badge.js +135 -0
- package/dist_ts_web/elements/idp-button.d.ts +21 -0
- package/dist_ts_web/elements/idp-button.js +234 -0
- package/dist_ts_web/elements/idp-card.d.ts +15 -0
- package/dist_ts_web/elements/idp-card.js +139 -0
- package/dist_ts_web/elements/idp-checkbox.d.ts +23 -0
- package/dist_ts_web/elements/idp-checkbox.js +233 -0
- package/dist_ts_web/elements/idp-dashboard-window.d.ts +23 -0
- package/dist_ts_web/elements/idp-dashboard-window.js +587 -0
- package/dist_ts_web/elements/idp-data-table.d.ts +45 -0
- package/dist_ts_web/elements/idp-data-table.js +472 -0
- package/dist_ts_web/elements/idp-form-submit.d.ts +20 -0
- package/dist_ts_web/elements/idp-form-submit.js +136 -0
- package/dist_ts_web/elements/idp-form.d.ts +31 -0
- package/dist_ts_web/elements/idp-form.js +197 -0
- package/dist_ts_web/elements/idp-icon.d.ts +18 -0
- package/dist_ts_web/elements/idp-icon.js +204 -0
- package/dist_ts_web/elements/idp-inbox-preview.d.ts +18 -0
- package/dist_ts_web/elements/idp-inbox-preview.js +245 -0
- package/dist_ts_web/elements/idp-input.d.ts +26 -0
- package/dist_ts_web/elements/idp-input.js +249 -0
- package/dist_ts_web/elements/idp-landing-hero.d.ts +15 -0
- package/dist_ts_web/elements/idp-landing-hero.js +209 -0
- package/dist_ts_web/elements/idp-landing-page.d.ts +21 -0
- package/dist_ts_web/elements/idp-landing-page.js +694 -0
- package/dist_ts_web/elements/idp-mobile-frame.d.ts +14 -0
- package/dist_ts_web/elements/idp-mobile-frame.js +195 -0
- package/dist_ts_web/elements/idp-mobile-showcase.d.ts +16 -0
- package/dist_ts_web/elements/idp-mobile-showcase.js +339 -0
- package/dist_ts_web/elements/idp-select.d.ts +28 -0
- package/dist_ts_web/elements/idp-select.js +179 -0
- package/dist_ts_web/elements/idp-toggle.d.ts +15 -0
- package/dist_ts_web/elements/idp-toggle.js +134 -0
- package/dist_ts_web/elements/index.d.ts +20 -0
- package/dist_ts_web/elements/index.js +21 -0
- package/dist_ts_web/elements/tokens.d.ts +21 -0
- package/dist_ts_web/elements/tokens.js +190 -0
- package/dist_ts_web/index.d.ts +1 -0
- package/dist_ts_web/index.js +2 -0
- package/dist_ts_web/pages/index.d.ts +5 -0
- package/dist_ts_web/pages/index.js +23 -0
- package/dist_watch/bundle.js +120699 -0
- package/dist_watch/bundle.js.map +7 -0
- package/dist_watch/index.html +29 -0
- package/html/index.html +29 -0
- package/html/index.ts +39 -0
- package/license +21 -0
- package/package.json +64 -0
- package/readme.md +103 -0
- package/ts_web/00_commitinfo_data.ts +8 -0
- package/ts_web/elements/idp-admin-shell.ts +2664 -0
- package/ts_web/elements/idp-approval-card.ts +182 -0
- package/ts_web/elements/idp-badge.ts +84 -0
- package/ts_web/elements/idp-button.ts +166 -0
- package/ts_web/elements/idp-card.ts +76 -0
- package/ts_web/elements/idp-checkbox.ts +143 -0
- package/ts_web/elements/idp-dashboard-window.ts +564 -0
- package/ts_web/elements/idp-data-table.ts +407 -0
- package/ts_web/elements/idp-form-submit.ts +65 -0
- package/ts_web/elements/idp-form.ts +159 -0
- package/ts_web/elements/idp-icon.ts +263 -0
- package/ts_web/elements/idp-inbox-preview.ts +192 -0
- package/ts_web/elements/idp-input.ts +151 -0
- package/ts_web/elements/idp-landing-hero.ts +165 -0
- package/ts_web/elements/idp-landing-page.ts +655 -0
- package/ts_web/elements/idp-mobile-frame.ts +137 -0
- package/ts_web/elements/idp-mobile-showcase.ts +295 -0
- package/ts_web/elements/idp-select.ts +119 -0
- package/ts_web/elements/idp-toggle.ts +77 -0
- package/ts_web/elements/index.ts +20 -0
- package/ts_web/elements/tokens.ts +193 -0
- package/ts_web/index.ts +1 -0
- package/ts_web/pages/index.ts +26 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { DeesElement, html, property, customElement, css, type TemplateResult } from '@design.estate/dees-element';
|
|
2
|
+
import { idpElementStyles } from './tokens.js';
|
|
3
|
+
|
|
4
|
+
declare global {
|
|
5
|
+
interface HTMLElementTagNameMap {
|
|
6
|
+
'idp-mobile-frame': IdpMobileFrame;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
@customElement('idp-mobile-frame')
|
|
11
|
+
export class IdpMobileFrame extends DeesElement {
|
|
12
|
+
public static demo = () => html`
|
|
13
|
+
<idp-mobile-frame>
|
|
14
|
+
<div style="height: 100%; background: #fff; padding: 72px 20px 20px; box-sizing: border-box;">Screen content</div>
|
|
15
|
+
</idp-mobile-frame>
|
|
16
|
+
`;
|
|
17
|
+
public static demoGroups = ['idp.global v3 device frames'];
|
|
18
|
+
|
|
19
|
+
@property({ type: String })
|
|
20
|
+
public accessor time = '9:41';
|
|
21
|
+
|
|
22
|
+
@property({ type: Boolean, reflect: true })
|
|
23
|
+
public accessor dark = false;
|
|
24
|
+
|
|
25
|
+
public static styles = [
|
|
26
|
+
...idpElementStyles,
|
|
27
|
+
css`
|
|
28
|
+
:host {
|
|
29
|
+
display: inline-block;
|
|
30
|
+
}
|
|
31
|
+
.device {
|
|
32
|
+
position: relative;
|
|
33
|
+
width: 402px;
|
|
34
|
+
height: 874px;
|
|
35
|
+
max-width: 100%;
|
|
36
|
+
border-radius: 48px;
|
|
37
|
+
overflow: hidden;
|
|
38
|
+
background: var(--idp-bg);
|
|
39
|
+
box-shadow: 0 40px 80px rgb(0 0 0 / 0.18), 0 0 0 1px rgb(0 0 0 / 0.12);
|
|
40
|
+
}
|
|
41
|
+
.island {
|
|
42
|
+
position: absolute;
|
|
43
|
+
top: 11px;
|
|
44
|
+
left: 50%;
|
|
45
|
+
z-index: 50;
|
|
46
|
+
width: 126px;
|
|
47
|
+
height: 37px;
|
|
48
|
+
transform: translateX(-50%);
|
|
49
|
+
border-radius: 24px;
|
|
50
|
+
background: #000;
|
|
51
|
+
}
|
|
52
|
+
.status {
|
|
53
|
+
position: absolute;
|
|
54
|
+
inset: 0 0 auto;
|
|
55
|
+
z-index: 40;
|
|
56
|
+
height: 58px;
|
|
57
|
+
display: flex;
|
|
58
|
+
align-items: center;
|
|
59
|
+
justify-content: space-between;
|
|
60
|
+
padding: 18px 28px 0;
|
|
61
|
+
box-sizing: border-box;
|
|
62
|
+
color: var(--idp-fg);
|
|
63
|
+
font-size: 15px;
|
|
64
|
+
font-weight: 650;
|
|
65
|
+
pointer-events: none;
|
|
66
|
+
}
|
|
67
|
+
.status-icons {
|
|
68
|
+
display: inline-flex;
|
|
69
|
+
align-items: center;
|
|
70
|
+
gap: 7px;
|
|
71
|
+
}
|
|
72
|
+
.bar {
|
|
73
|
+
width: 4px;
|
|
74
|
+
border-radius: 999px;
|
|
75
|
+
background: currentColor;
|
|
76
|
+
}
|
|
77
|
+
.screen {
|
|
78
|
+
height: 100%;
|
|
79
|
+
overflow: hidden;
|
|
80
|
+
}
|
|
81
|
+
.home {
|
|
82
|
+
position: absolute;
|
|
83
|
+
left: 0;
|
|
84
|
+
right: 0;
|
|
85
|
+
bottom: 0;
|
|
86
|
+
z-index: 60;
|
|
87
|
+
height: 34px;
|
|
88
|
+
display: flex;
|
|
89
|
+
align-items: flex-end;
|
|
90
|
+
justify-content: center;
|
|
91
|
+
padding-bottom: 8px;
|
|
92
|
+
pointer-events: none;
|
|
93
|
+
}
|
|
94
|
+
.home::before {
|
|
95
|
+
content: '';
|
|
96
|
+
width: 139px;
|
|
97
|
+
height: 5px;
|
|
98
|
+
border-radius: 100px;
|
|
99
|
+
background: color-mix(in srgb, var(--idp-fg), transparent 72%);
|
|
100
|
+
}
|
|
101
|
+
@media (max-width: 520px) {
|
|
102
|
+
:host {
|
|
103
|
+
display: block;
|
|
104
|
+
width: 100%;
|
|
105
|
+
}
|
|
106
|
+
.device {
|
|
107
|
+
width: 100%;
|
|
108
|
+
height: auto;
|
|
109
|
+
aspect-ratio: 402 / 874;
|
|
110
|
+
border-radius: 0;
|
|
111
|
+
}
|
|
112
|
+
.island {
|
|
113
|
+
display: none;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
`,
|
|
117
|
+
];
|
|
118
|
+
|
|
119
|
+
public render(): TemplateResult {
|
|
120
|
+
return html`
|
|
121
|
+
<div class="device">
|
|
122
|
+
<div class="island"></div>
|
|
123
|
+
<div class="status">
|
|
124
|
+
<span>${this.time}</span>
|
|
125
|
+
<span class="status-icons" aria-hidden="true">
|
|
126
|
+
<span class="bar" style="height: 5px"></span>
|
|
127
|
+
<span class="bar" style="height: 8px"></span>
|
|
128
|
+
<span class="bar" style="height: 11px"></span>
|
|
129
|
+
<span style="width: 24px; height: 12px; border: 1.5px solid currentColor; border-radius: 4px;"></span>
|
|
130
|
+
</span>
|
|
131
|
+
</div>
|
|
132
|
+
<div class="screen"><slot></slot></div>
|
|
133
|
+
<div class="home"></div>
|
|
134
|
+
</div>
|
|
135
|
+
`;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import { DeesElement, html, customElement, css, type TemplateResult } from '@design.estate/dees-element';
|
|
2
|
+
import { idpElementStyles } from './tokens.js';
|
|
3
|
+
import './idp-button.js';
|
|
4
|
+
import './idp-icon.js';
|
|
5
|
+
import './idp-inbox-preview.js';
|
|
6
|
+
import './idp-mobile-frame.js';
|
|
7
|
+
|
|
8
|
+
declare global {
|
|
9
|
+
interface HTMLElementTagNameMap {
|
|
10
|
+
'idp-mobile-showcase': IdpMobileShowcase;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
@customElement('idp-mobile-showcase')
|
|
15
|
+
export class IdpMobileShowcase extends DeesElement {
|
|
16
|
+
public static demo = () => html`<idp-mobile-showcase></idp-mobile-showcase>`;
|
|
17
|
+
public static demoGroups = ['idp.global v3 full pages'];
|
|
18
|
+
|
|
19
|
+
public static styles = [
|
|
20
|
+
...idpElementStyles,
|
|
21
|
+
css`
|
|
22
|
+
:host {
|
|
23
|
+
display: block;
|
|
24
|
+
}
|
|
25
|
+
.showcase {
|
|
26
|
+
min-height: 100vh;
|
|
27
|
+
padding: 56px;
|
|
28
|
+
background: radial-gradient(circle at 1px 1px, color-mix(in srgb, var(--idp-fg), transparent 92%) 1px, transparent 0) 0 0 / 24px 24px, var(--idp-bg);
|
|
29
|
+
color: var(--idp-fg);
|
|
30
|
+
}
|
|
31
|
+
.head {
|
|
32
|
+
max-width: 1180px;
|
|
33
|
+
margin: 0 auto 44px;
|
|
34
|
+
}
|
|
35
|
+
.badge {
|
|
36
|
+
display: inline-flex;
|
|
37
|
+
align-items: center;
|
|
38
|
+
gap: 6px;
|
|
39
|
+
margin-bottom: 16px;
|
|
40
|
+
padding: 4px 10px;
|
|
41
|
+
border: 1px solid var(--idp-border);
|
|
42
|
+
border-radius: 999px;
|
|
43
|
+
background: var(--idp-card);
|
|
44
|
+
color: var(--idp-fg-3);
|
|
45
|
+
font-size: 11px;
|
|
46
|
+
font-weight: 500;
|
|
47
|
+
}
|
|
48
|
+
.dot {
|
|
49
|
+
width: 6px;
|
|
50
|
+
height: 6px;
|
|
51
|
+
border-radius: 50%;
|
|
52
|
+
background: var(--idp-ok);
|
|
53
|
+
}
|
|
54
|
+
h1 {
|
|
55
|
+
max-width: 900px;
|
|
56
|
+
margin: 0 0 14px;
|
|
57
|
+
font-family: var(--idp-display);
|
|
58
|
+
font-size: clamp(36px, 5vw, 56px);
|
|
59
|
+
font-weight: 750;
|
|
60
|
+
letter-spacing: -0.035em;
|
|
61
|
+
line-height: 1.05;
|
|
62
|
+
}
|
|
63
|
+
p {
|
|
64
|
+
max-width: 680px;
|
|
65
|
+
margin: 0;
|
|
66
|
+
color: var(--idp-fg-3);
|
|
67
|
+
font-size: 16px;
|
|
68
|
+
line-height: 1.55;
|
|
69
|
+
}
|
|
70
|
+
.tokens {
|
|
71
|
+
display: flex;
|
|
72
|
+
flex-wrap: wrap;
|
|
73
|
+
gap: 24px;
|
|
74
|
+
margin-top: 24px;
|
|
75
|
+
padding: 16px;
|
|
76
|
+
border: 1px solid var(--idp-border);
|
|
77
|
+
border-radius: 12px;
|
|
78
|
+
background: var(--idp-card);
|
|
79
|
+
}
|
|
80
|
+
.token-label {
|
|
81
|
+
margin-bottom: 4px;
|
|
82
|
+
color: var(--idp-muted-fg);
|
|
83
|
+
font-size: 10px;
|
|
84
|
+
font-weight: 700;
|
|
85
|
+
letter-spacing: 0.08em;
|
|
86
|
+
text-transform: uppercase;
|
|
87
|
+
}
|
|
88
|
+
.token-value {
|
|
89
|
+
display: flex;
|
|
90
|
+
align-items: center;
|
|
91
|
+
gap: 8px;
|
|
92
|
+
color: var(--idp-fg);
|
|
93
|
+
font-size: 13px;
|
|
94
|
+
font-weight: 550;
|
|
95
|
+
}
|
|
96
|
+
.swatch {
|
|
97
|
+
width: 18px;
|
|
98
|
+
height: 18px;
|
|
99
|
+
border-radius: 5px;
|
|
100
|
+
background: var(--swatch);
|
|
101
|
+
border: 1px solid var(--idp-border);
|
|
102
|
+
}
|
|
103
|
+
.section {
|
|
104
|
+
max-width: 1180px;
|
|
105
|
+
margin: 0 auto 56px;
|
|
106
|
+
}
|
|
107
|
+
.section-title {
|
|
108
|
+
margin-bottom: 18px;
|
|
109
|
+
color: var(--idp-muted-fg);
|
|
110
|
+
font-family: var(--idp-mono);
|
|
111
|
+
font-size: 12px;
|
|
112
|
+
font-weight: 700;
|
|
113
|
+
letter-spacing: 0.1em;
|
|
114
|
+
text-transform: uppercase;
|
|
115
|
+
}
|
|
116
|
+
.phones {
|
|
117
|
+
display: grid;
|
|
118
|
+
grid-template-columns: repeat(2, minmax(300px, 402px));
|
|
119
|
+
gap: 28px;
|
|
120
|
+
align-items: start;
|
|
121
|
+
}
|
|
122
|
+
.multi {
|
|
123
|
+
display: grid;
|
|
124
|
+
grid-template-columns: 280px minmax(0, 1fr) 360px;
|
|
125
|
+
gap: 28px;
|
|
126
|
+
align-items: start;
|
|
127
|
+
}
|
|
128
|
+
.watch, .ipad, .mac {
|
|
129
|
+
border: 1px solid var(--idp-border);
|
|
130
|
+
background: var(--idp-card);
|
|
131
|
+
box-shadow: 0 20px 50px color-mix(in srgb, var(--idp-fg), transparent 92%);
|
|
132
|
+
}
|
|
133
|
+
.watch {
|
|
134
|
+
width: 236px;
|
|
135
|
+
height: 286px;
|
|
136
|
+
display: grid;
|
|
137
|
+
place-items: center;
|
|
138
|
+
border-radius: 60px;
|
|
139
|
+
background: #09090b;
|
|
140
|
+
color: #fafafa;
|
|
141
|
+
}
|
|
142
|
+
.watch-screen {
|
|
143
|
+
width: 178px;
|
|
144
|
+
display: grid;
|
|
145
|
+
gap: 12px;
|
|
146
|
+
text-align: center;
|
|
147
|
+
}
|
|
148
|
+
.watch-app {
|
|
149
|
+
color: #a1a1aa;
|
|
150
|
+
font-family: var(--idp-mono);
|
|
151
|
+
font-size: 10px;
|
|
152
|
+
letter-spacing: 0.08em;
|
|
153
|
+
text-transform: uppercase;
|
|
154
|
+
}
|
|
155
|
+
.watch-title {
|
|
156
|
+
font-size: 18px;
|
|
157
|
+
font-weight: 700;
|
|
158
|
+
}
|
|
159
|
+
.watch-actions {
|
|
160
|
+
display: grid;
|
|
161
|
+
grid-template-columns: 1fr 1fr;
|
|
162
|
+
gap: 8px;
|
|
163
|
+
}
|
|
164
|
+
.watch-actions button {
|
|
165
|
+
display: inline-flex;
|
|
166
|
+
align-items: center;
|
|
167
|
+
justify-content: center;
|
|
168
|
+
gap: 5px;
|
|
169
|
+
height: 34px;
|
|
170
|
+
border: 1px solid #27272a;
|
|
171
|
+
border-radius: 999px;
|
|
172
|
+
background: #18181b;
|
|
173
|
+
color: #fafafa;
|
|
174
|
+
}
|
|
175
|
+
.watch-actions .approve {
|
|
176
|
+
background: #3b82f6;
|
|
177
|
+
border-color: #3b82f6;
|
|
178
|
+
}
|
|
179
|
+
.ipad {
|
|
180
|
+
min-height: 520px;
|
|
181
|
+
overflow: hidden;
|
|
182
|
+
border-radius: 26px;
|
|
183
|
+
}
|
|
184
|
+
.ipad-shell {
|
|
185
|
+
display: grid;
|
|
186
|
+
grid-template-columns: 220px 1fr;
|
|
187
|
+
min-height: 520px;
|
|
188
|
+
}
|
|
189
|
+
.ipad-sidebar {
|
|
190
|
+
padding: 18px;
|
|
191
|
+
border-right: 1px solid var(--idp-border);
|
|
192
|
+
background: var(--idp-card-2);
|
|
193
|
+
}
|
|
194
|
+
.ipad-main {
|
|
195
|
+
padding: 22px;
|
|
196
|
+
}
|
|
197
|
+
.ipad-card {
|
|
198
|
+
display: flex;
|
|
199
|
+
align-items: flex-start;
|
|
200
|
+
gap: 10px;
|
|
201
|
+
margin-top: 16px;
|
|
202
|
+
padding: 16px;
|
|
203
|
+
border: 1px solid var(--idp-border);
|
|
204
|
+
border-radius: 12px;
|
|
205
|
+
background: var(--idp-card);
|
|
206
|
+
}
|
|
207
|
+
.mac {
|
|
208
|
+
overflow: hidden;
|
|
209
|
+
border-radius: 14px;
|
|
210
|
+
}
|
|
211
|
+
.mac-bar {
|
|
212
|
+
display: flex;
|
|
213
|
+
gap: 6px;
|
|
214
|
+
padding: 11px 14px;
|
|
215
|
+
border-bottom: 1px solid var(--idp-border);
|
|
216
|
+
}
|
|
217
|
+
.tdot {
|
|
218
|
+
width: 10px;
|
|
219
|
+
height: 10px;
|
|
220
|
+
border-radius: 50%;
|
|
221
|
+
}
|
|
222
|
+
.mac-body {
|
|
223
|
+
display: grid;
|
|
224
|
+
gap: 12px;
|
|
225
|
+
padding: 18px;
|
|
226
|
+
}
|
|
227
|
+
.mac-row {
|
|
228
|
+
display: flex;
|
|
229
|
+
align-items: center;
|
|
230
|
+
justify-content: space-between;
|
|
231
|
+
gap: 12px;
|
|
232
|
+
padding: 12px;
|
|
233
|
+
border: 1px solid var(--idp-border);
|
|
234
|
+
border-radius: 10px;
|
|
235
|
+
background: var(--idp-card);
|
|
236
|
+
}
|
|
237
|
+
.inline-muted {
|
|
238
|
+
color: var(--idp-muted-fg);
|
|
239
|
+
}
|
|
240
|
+
.watch-muted {
|
|
241
|
+
color: #a1a1aa;
|
|
242
|
+
}
|
|
243
|
+
.row-label {
|
|
244
|
+
display: inline-flex;
|
|
245
|
+
align-items: center;
|
|
246
|
+
gap: 8px;
|
|
247
|
+
}
|
|
248
|
+
@media (max-width: 1120px) {
|
|
249
|
+
.multi {
|
|
250
|
+
grid-template-columns: 1fr;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
@media (max-width: 900px) {
|
|
254
|
+
.showcase {
|
|
255
|
+
padding: 28px;
|
|
256
|
+
}
|
|
257
|
+
.phones {
|
|
258
|
+
grid-template-columns: 1fr;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
`,
|
|
262
|
+
];
|
|
263
|
+
|
|
264
|
+
public render(): TemplateResult {
|
|
265
|
+
return html`
|
|
266
|
+
<div class="showcase">
|
|
267
|
+
<header class="head">
|
|
268
|
+
<div class="badge"><span class="dot"></span>Mobile redesign - v3 - shadcn tokens</div>
|
|
269
|
+
<h1>A personal identity provider, built across every device you carry.</h1>
|
|
270
|
+
<p>Same four-platform architecture: flat surfaces, 1px borders, neutral palette, and blue accent used only where action is expected.</p>
|
|
271
|
+
<div class="tokens">
|
|
272
|
+
${[
|
|
273
|
+
['Primary', '#18181b', 'zinc-900'],
|
|
274
|
+
['Accent', '#0050b9', 'idp blue'],
|
|
275
|
+
['Muted', '#f4f4f2', 'paper muted'],
|
|
276
|
+
['Border', '#e4e4e7', 'zinc-200'],
|
|
277
|
+
].map((tokenArg) => html`<div><div class="token-label">${tokenArg[0]}</div><div class="token-value"><span class="swatch" style="--swatch:${tokenArg[1]}"></span>${tokenArg[2]}</div></div>`)}
|
|
278
|
+
</div>
|
|
279
|
+
</header>
|
|
280
|
+
<section class="section">
|
|
281
|
+
<div class="section-title">iPhone</div>
|
|
282
|
+
<div class="phones"><idp-inbox-preview></idp-inbox-preview><idp-inbox-preview dark></idp-inbox-preview></div>
|
|
283
|
+
</section>
|
|
284
|
+
<section class="section">
|
|
285
|
+
<div class="section-title">Watch, iPad, Mac</div>
|
|
286
|
+
<div class="multi">
|
|
287
|
+
<div class="watch"><div class="watch-screen"><div class="watch-app">idp.global</div><idp-icon name="shield" size="28" style="margin:0 auto;color:var(--idp-accent-hover)"></idp-icon><div class="watch-title">GitHub wants access</div><div class="watch-muted" style="font-size:12px;">repo:read - Berlin</div><div class="watch-actions"><button><idp-icon name="x" size="13"></idp-icon>Deny</button><button class="approve"><idp-icon name="check" size="13"></idp-icon>Approve</button></div></div></div>
|
|
288
|
+
<div class="ipad"><div class="ipad-shell"><aside class="ipad-sidebar"><strong>Inbox</strong><p>3 pending approvals</p><div class="ipad-card"><idp-icon name="globe" size="16"></idp-icon><div><strong>GitHub OAuth</strong><br/><span class="inline-muted">repo:read - now</span></div></div><div class="ipad-card"><idp-icon name="cloud" size="16"></idp-icon><div><strong>Hetzner Cloud</strong><br/><span class="inline-muted">new network - 8m</span></div></div></aside><main class="ipad-main"><h2>Approval detail</h2><p>Full context before a sensitive action is approved.</p><div class="ipad-card"><idp-icon name="laptop" size="16"></idp-icon><div><strong>Device</strong><br/>MacBook Pro - Safari - Berlin, DE</div></div><div class="ipad-card"><idp-icon name="key" size="16"></idp-icon><div><strong>Requested scopes</strong><br/>openid, profile, email, repo:read</div></div></main></div></div>
|
|
289
|
+
<div class="mac"><div class="mac-bar"><span class="tdot" style="background:#ff5f57"></span><span class="tdot" style="background:#ffbd2e"></span><span class="tdot" style="background:#28c840"></span></div><div class="mac-body"><strong>Menu bar approvals</strong><div class="mac-row"><span class="row-label"><idp-icon name="globe" size="15"></idp-icon>GitHub OAuth</span><idp-button variant="accent" size="sm" icon="check">Approve</idp-button></div><div class="mac-row"><span class="row-label"><idp-icon name="nfc" size="15"></idp-icon>NFC tap - door 4F</span><idp-button variant="ghost" size="sm" icon="chevron-right">Review</idp-button></div><div class="mac-row"><span class="row-label"><idp-icon name="key" size="15"></idp-icon>Key rotation</span><idp-button variant="ghost" size="sm" icon="shield">Confirm</idp-button></div></div></div>
|
|
290
|
+
</div>
|
|
291
|
+
</section>
|
|
292
|
+
</div>
|
|
293
|
+
`;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { DeesElement, html, property, customElement, css, type TemplateResult } from '@design.estate/dees-element';
|
|
2
|
+
import { idpElementStyles } from './tokens.js';
|
|
3
|
+
|
|
4
|
+
export interface IIdpSelectOption {
|
|
5
|
+
option: string;
|
|
6
|
+
key: string;
|
|
7
|
+
payload?: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface IIdpSelectEventDetail {
|
|
11
|
+
key: string;
|
|
12
|
+
payload?: string;
|
|
13
|
+
selectedOption: IIdpSelectOption | null;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
declare global {
|
|
17
|
+
interface HTMLElementTagNameMap {
|
|
18
|
+
'idp-select': IdpSelect;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
@customElement('idp-select')
|
|
23
|
+
export class IdpSelect extends DeesElement {
|
|
24
|
+
public static demo = () => html`
|
|
25
|
+
<idp-select
|
|
26
|
+
label="Organization"
|
|
27
|
+
.options=${[
|
|
28
|
+
{ option: 'Lossless GmbH', key: 'lossless', payload: 'lossless' },
|
|
29
|
+
{ option: '+ Create new...', key: '__create_new__', payload: '__create_new__' },
|
|
30
|
+
]}
|
|
31
|
+
></idp-select>
|
|
32
|
+
`;
|
|
33
|
+
public static demoGroups = ['idp.global v3 primitives'];
|
|
34
|
+
|
|
35
|
+
@property({ type: String })
|
|
36
|
+
public accessor label = '';
|
|
37
|
+
|
|
38
|
+
@property({ type: String })
|
|
39
|
+
public accessor placeholder = 'Select...';
|
|
40
|
+
|
|
41
|
+
@property({ type: Array })
|
|
42
|
+
public accessor options: IIdpSelectOption[] = [];
|
|
43
|
+
|
|
44
|
+
@property({ type: Object })
|
|
45
|
+
public accessor selectedOption: IIdpSelectOption | null = null;
|
|
46
|
+
|
|
47
|
+
@property({ type: Boolean, reflect: true })
|
|
48
|
+
public accessor disabled = false;
|
|
49
|
+
|
|
50
|
+
public static styles = [
|
|
51
|
+
...idpElementStyles,
|
|
52
|
+
css`
|
|
53
|
+
:host {
|
|
54
|
+
display: block;
|
|
55
|
+
}
|
|
56
|
+
label {
|
|
57
|
+
display: grid;
|
|
58
|
+
gap: 6px;
|
|
59
|
+
}
|
|
60
|
+
.label {
|
|
61
|
+
color: var(--idp-fg);
|
|
62
|
+
font-size: 13px;
|
|
63
|
+
font-weight: 500;
|
|
64
|
+
}
|
|
65
|
+
select {
|
|
66
|
+
width: 100%;
|
|
67
|
+
height: 36px;
|
|
68
|
+
box-sizing: border-box;
|
|
69
|
+
padding: 0 34px 0 10px;
|
|
70
|
+
border: 1px solid var(--idp-border);
|
|
71
|
+
border-radius: 8px;
|
|
72
|
+
outline: none;
|
|
73
|
+
background: var(--idp-card);
|
|
74
|
+
color: var(--idp-fg);
|
|
75
|
+
font-family: var(--idp-font);
|
|
76
|
+
font-size: 13px;
|
|
77
|
+
cursor: pointer;
|
|
78
|
+
transition: border-color 120ms ease, box-shadow 120ms ease;
|
|
79
|
+
}
|
|
80
|
+
select:focus {
|
|
81
|
+
border-color: var(--idp-accent);
|
|
82
|
+
box-shadow: 0 0 0 3px color-mix(in srgb, var(--idp-accent), transparent 86%);
|
|
83
|
+
}
|
|
84
|
+
select:disabled {
|
|
85
|
+
cursor: not-allowed;
|
|
86
|
+
opacity: 0.5;
|
|
87
|
+
}
|
|
88
|
+
`,
|
|
89
|
+
];
|
|
90
|
+
|
|
91
|
+
private handleChange(eventArg: Event) {
|
|
92
|
+
const key = (eventArg.target as HTMLSelectElement).value;
|
|
93
|
+
const selectedOption = this.options.find((optionArg) => optionArg.key === key) || null;
|
|
94
|
+
this.selectedOption = selectedOption;
|
|
95
|
+
this.dispatchEvent(new CustomEvent<IIdpSelectEventDetail>('idp-select', {
|
|
96
|
+
detail: {
|
|
97
|
+
key,
|
|
98
|
+
payload: selectedOption?.payload,
|
|
99
|
+
selectedOption,
|
|
100
|
+
},
|
|
101
|
+
bubbles: true,
|
|
102
|
+
composed: true,
|
|
103
|
+
}));
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
public render(): TemplateResult {
|
|
107
|
+
return html`
|
|
108
|
+
<label>
|
|
109
|
+
${this.label ? html`<span class="label">${this.label}</span>` : html``}
|
|
110
|
+
<select .value=${this.selectedOption?.key || ''} ?disabled=${this.disabled} @change=${this.handleChange}>
|
|
111
|
+
<option value="" disabled>${this.placeholder}</option>
|
|
112
|
+
${this.options.map((optionArg) => html`
|
|
113
|
+
<option value=${optionArg.key}>${optionArg.option}</option>
|
|
114
|
+
`)}
|
|
115
|
+
</select>
|
|
116
|
+
</label>
|
|
117
|
+
`;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { DeesElement, html, property, customElement, css, type TemplateResult } from '@design.estate/dees-element';
|
|
2
|
+
import { idpElementStyles } from './tokens.js';
|
|
3
|
+
|
|
4
|
+
declare global {
|
|
5
|
+
interface HTMLElementTagNameMap {
|
|
6
|
+
'idp-toggle': IdpToggle;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
@customElement('idp-toggle')
|
|
11
|
+
export class IdpToggle extends DeesElement {
|
|
12
|
+
public static demo = () => html`<idp-toggle checked></idp-toggle>`;
|
|
13
|
+
public static demoGroups = ['idp.global v3 primitives'];
|
|
14
|
+
|
|
15
|
+
@property({ type: Boolean, reflect: true })
|
|
16
|
+
public accessor checked = false;
|
|
17
|
+
|
|
18
|
+
@property({ type: Boolean, reflect: true })
|
|
19
|
+
public accessor disabled = false;
|
|
20
|
+
|
|
21
|
+
public static styles = [
|
|
22
|
+
...idpElementStyles,
|
|
23
|
+
css`
|
|
24
|
+
:host {
|
|
25
|
+
display: inline-flex;
|
|
26
|
+
}
|
|
27
|
+
button {
|
|
28
|
+
width: 36px;
|
|
29
|
+
height: 20px;
|
|
30
|
+
border: none;
|
|
31
|
+
border-radius: 999px;
|
|
32
|
+
padding: 2px;
|
|
33
|
+
background: var(--idp-border);
|
|
34
|
+
cursor: pointer;
|
|
35
|
+
transition: background 150ms ease;
|
|
36
|
+
}
|
|
37
|
+
:host([checked]) button {
|
|
38
|
+
background: var(--idp-accent);
|
|
39
|
+
}
|
|
40
|
+
:host([disabled]) button {
|
|
41
|
+
opacity: 0.5;
|
|
42
|
+
cursor: not-allowed;
|
|
43
|
+
}
|
|
44
|
+
.knob {
|
|
45
|
+
width: 16px;
|
|
46
|
+
height: 16px;
|
|
47
|
+
border-radius: 999px;
|
|
48
|
+
background: #fff;
|
|
49
|
+
box-shadow: 0 1px 3px rgb(0 0 0 / 0.22);
|
|
50
|
+
transition: transform 150ms ease;
|
|
51
|
+
}
|
|
52
|
+
:host([checked]) .knob {
|
|
53
|
+
transform: translateX(16px);
|
|
54
|
+
}
|
|
55
|
+
`,
|
|
56
|
+
];
|
|
57
|
+
|
|
58
|
+
private toggle() {
|
|
59
|
+
if (this.disabled) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
this.checked = !this.checked;
|
|
63
|
+
this.dispatchEvent(new CustomEvent('idp-toggle-change', {
|
|
64
|
+
detail: { checked: this.checked },
|
|
65
|
+
bubbles: true,
|
|
66
|
+
composed: true,
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
public render(): TemplateResult {
|
|
71
|
+
return html`
|
|
72
|
+
<button role="switch" aria-checked=${this.checked} ?disabled=${this.disabled} @click=${this.toggle}>
|
|
73
|
+
<div class="knob"></div>
|
|
74
|
+
</button>
|
|
75
|
+
`;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export * from './tokens.js';
|
|
2
|
+
export * from './idp-icon.js';
|
|
3
|
+
export * from './idp-button.js';
|
|
4
|
+
export * from './idp-badge.js';
|
|
5
|
+
export * from './idp-card.js';
|
|
6
|
+
export * from './idp-input.js';
|
|
7
|
+
export * from './idp-checkbox.js';
|
|
8
|
+
export * from './idp-form.js';
|
|
9
|
+
export * from './idp-form-submit.js';
|
|
10
|
+
export * from './idp-select.js';
|
|
11
|
+
export * from './idp-data-table.js';
|
|
12
|
+
export * from './idp-toggle.js';
|
|
13
|
+
export * from './idp-approval-card.js';
|
|
14
|
+
export * from './idp-mobile-frame.js';
|
|
15
|
+
export * from './idp-inbox-preview.js';
|
|
16
|
+
export * from './idp-dashboard-window.js';
|
|
17
|
+
export * from './idp-admin-shell.js';
|
|
18
|
+
export * from './idp-landing-hero.js';
|
|
19
|
+
export * from './idp-landing-page.js';
|
|
20
|
+
export * from './idp-mobile-showcase.js';
|