@ketvietlab/design-system 0.1.24 → 0.1.29
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/README.md +29 -0
- package/dist/atlas/island-runtime.d.mts +2 -0
- package/dist/atlas/island-runtime.d.mts.map +1 -0
- package/dist/atlas/island-runtime.mjs +2 -0
- package/dist/atlas/island-runtime.mjs.map +1 -0
- package/dist/atlas/relation-select-hydration.d.ts +2 -0
- package/dist/atlas/relation-select-hydration.d.ts.map +1 -0
- package/dist/atlas/relation-select-hydration.js +40 -0
- package/dist/atlas/relation-select-hydration.js.map +1 -0
- package/dist/atlas-cli.d.ts.map +1 -1
- package/dist/atlas-cli.js +18 -3
- package/dist/atlas-cli.js.map +1 -1
- package/dist/catalogue/index.js +1 -1
- package/dist/catalogue/inventory-policy.json +49 -0
- package/dist/catalogue/inventory.generated.js +1 -1
- package/dist/catalogue/inventory.generated.js.map +1 -1
- package/dist/catalogue/inventory.generated.json +2613 -1092
- package/dist/catalogue/registry.d.ts.map +1 -1
- package/dist/catalogue/registry.js +18 -0
- package/dist/catalogue/registry.js.map +1 -1
- package/dist/catalogue/specimens.d.ts.map +1 -1
- package/dist/catalogue/specimens.js +130 -10
- package/dist/catalogue/specimens.js.map +1 -1
- package/dist/contract/index.d.ts.map +1 -1
- package/dist/contract/index.js +10 -0
- package/dist/contract/index.js.map +1 -1
- package/dist/foundations/tokens.css +34 -26
- package/dist/index.d.ts +14 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -3
- package/dist/index.js.map +1 -1
- package/dist/interactions/ket-table/demo.d.ts +4 -0
- package/dist/interactions/ket-table/demo.d.ts.map +1 -0
- package/dist/interactions/ket-table/demo.js +147 -0
- package/dist/interactions/ket-table/demo.js.map +1 -0
- package/dist/interactions/ket-table/index.d.ts +199 -0
- package/dist/interactions/ket-table/index.d.ts.map +1 -0
- package/dist/interactions/ket-table/index.js +376 -0
- package/dist/interactions/ket-table/index.js.map +1 -0
- package/dist/interactions/ket-table/styles.css +282 -0
- package/dist/interactions/lightbox/demo.d.ts +3 -0
- package/dist/interactions/lightbox/demo.d.ts.map +1 -0
- package/dist/interactions/lightbox/demo.js +21 -0
- package/dist/interactions/lightbox/demo.js.map +1 -0
- package/dist/interactions/lightbox/index.d.ts +58 -0
- package/dist/interactions/lightbox/index.d.ts.map +1 -0
- package/dist/interactions/lightbox/index.js +220 -0
- package/dist/interactions/lightbox/index.js.map +1 -0
- package/dist/interactions/lightbox/styles.css +153 -0
- package/dist/interactions/relation-select/demo.d.ts +3 -0
- package/dist/interactions/relation-select/demo.d.ts.map +1 -0
- package/dist/interactions/relation-select/demo.js +36 -0
- package/dist/interactions/relation-select/demo.js.map +1 -0
- package/dist/interactions/relation-select/index.d.ts +87 -0
- package/dist/interactions/relation-select/index.d.ts.map +1 -0
- package/dist/interactions/relation-select/index.js +307 -0
- package/dist/interactions/relation-select/index.js.map +1 -0
- package/dist/interactions/relation-select/styles.css +311 -0
- package/dist/interactions/reorder-list/index.d.ts +23 -0
- package/dist/interactions/reorder-list/index.d.ts.map +1 -0
- package/dist/interactions/reorder-list/index.js +15 -0
- package/dist/interactions/reorder-list/index.js.map +1 -0
- package/dist/interactions/reorder-list/runtime.d.ts +5 -0
- package/dist/interactions/reorder-list/runtime.d.ts.map +1 -0
- package/dist/interactions/reorder-list/runtime.js +85 -0
- package/dist/interactions/reorder-list/runtime.js.map +1 -0
- package/dist/interactions/reorder-list/styles.css +33 -0
- package/dist/interactions/search-filter/demo.d.ts +3 -0
- package/dist/interactions/search-filter/demo.d.ts.map +1 -0
- package/dist/interactions/search-filter/demo.js +74 -0
- package/dist/interactions/search-filter/demo.js.map +1 -0
- package/dist/interactions/search-filter/index.d.ts +153 -0
- package/dist/interactions/search-filter/index.d.ts.map +1 -0
- package/dist/interactions/search-filter/index.js +824 -0
- package/dist/interactions/search-filter/index.js.map +1 -0
- package/dist/interactions/search-filter/styles.css +580 -0
- package/dist/layouts/app-navigation/index.d.ts +11 -5
- package/dist/layouts/app-navigation/index.d.ts.map +1 -1
- package/dist/layouts/app-navigation/index.js +5 -3
- package/dist/layouts/app-navigation/index.js.map +1 -1
- package/dist/layouts/app-navigation/styles.css +50 -0
- package/dist/layouts/page-identity/index.d.ts +2 -0
- package/dist/layouts/page-identity/index.d.ts.map +1 -1
- package/dist/layouts/page-identity/index.js +2 -2
- package/dist/layouts/page-identity/index.js.map +1 -1
- package/dist/layouts/shell/index.d.ts +34 -1
- package/dist/layouts/shell/index.d.ts.map +1 -1
- package/dist/layouts/shell/index.js +26 -2
- package/dist/layouts/shell/index.js.map +1 -1
- package/dist/layouts/shell/styles.css +283 -0
- package/dist/patterns/data-table/styles.css +1 -1
- package/dist/patterns/list-page/index.d.ts +10 -3
- package/dist/patterns/list-page/index.d.ts.map +1 -1
- package/dist/patterns/list-page/index.js +10 -6
- package/dist/patterns/list-page/index.js.map +1 -1
- package/dist/patterns/list-page/responsive.css +1 -5
- package/dist/patterns/list-page/styles.css +25 -3
- package/dist/patterns/modal-sheet/index.d.ts +2 -0
- package/dist/patterns/modal-sheet/index.d.ts.map +1 -1
- package/dist/patterns/modal-sheet/index.js +3 -1
- package/dist/patterns/modal-sheet/index.js.map +1 -1
- package/dist/patterns/record-form/styles.css +34 -0
- package/dist/primitives/actions/index.d.ts +4 -0
- package/dist/primitives/actions/index.d.ts.map +1 -1
- package/dist/primitives/actions/index.js +2 -2
- package/dist/primitives/actions/index.js.map +1 -1
- package/dist/primitives/actions/styles.css +9 -0
- package/dist/primitives/feedback/styles.css +4 -1
- package/dist/primitives/status/index.d.ts +12 -1
- package/dist/primitives/status/index.d.ts.map +1 -1
- package/dist/primitives/status/index.js +16 -1
- package/dist/primitives/status/index.js.map +1 -1
- package/dist/primitives/status/styles.css +28 -0
- package/dist/record/formatted-values/index.d.ts +2 -1
- package/dist/record/formatted-values/index.d.ts.map +1 -1
- package/dist/record/formatted-values/index.js +2 -1
- package/dist/record/formatted-values/index.js.map +1 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +129 -2
- package/dist/runtime/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
@layer ket.app {
|
|
2
|
+
:where([data-kv-design-system]) [data-ui="ket-table"] {
|
|
3
|
+
display: flex;
|
|
4
|
+
flex-direction: column;
|
|
5
|
+
gap: var(--kv-space-2);
|
|
6
|
+
}
|
|
7
|
+
:where([data-kv-design-system]) [data-ui="ket-table"][data-busy="true"] {
|
|
8
|
+
opacity: 0.75;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
:where([data-kv-design-system]) [data-ui="kt-scroll"] {
|
|
12
|
+
width: 100%;
|
|
13
|
+
overflow-x: auto;
|
|
14
|
+
border: 1px solid var(--kv-panel-border);
|
|
15
|
+
border-radius: var(--kv-radius-md);
|
|
16
|
+
background: var(--kv-table-bg);
|
|
17
|
+
}
|
|
18
|
+
:where([data-kv-design-system]) [data-ui="kt-tools"] {
|
|
19
|
+
display: flex;
|
|
20
|
+
justify-content: flex-end;
|
|
21
|
+
}
|
|
22
|
+
:where([data-kv-design-system]) [data-ui="kt-caption"] {
|
|
23
|
+
padding: var(--kv-space-3);
|
|
24
|
+
text-align: start;
|
|
25
|
+
color: var(--kv-text-secondary);
|
|
26
|
+
}
|
|
27
|
+
:where([data-kv-design-system])
|
|
28
|
+
[data-ui="ket-table"][data-gutter="compact"]
|
|
29
|
+
:is([data-ui="kt-col"], [data-ui="kt-cell"]) {
|
|
30
|
+
padding-inline: var(--kv-space-2);
|
|
31
|
+
}
|
|
32
|
+
:where([data-kv-design-system]) [data-ui="kt-grid"] {
|
|
33
|
+
width: 100%;
|
|
34
|
+
min-width: 38rem;
|
|
35
|
+
border-collapse: separate;
|
|
36
|
+
border-spacing: 0;
|
|
37
|
+
background: transparent;
|
|
38
|
+
font-size: var(--kv-text-sm);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
:where([data-kv-design-system]) [data-ui="kt-col"] {
|
|
42
|
+
height: var(--kv-table-header-height);
|
|
43
|
+
padding: 0 var(--kv-space-3);
|
|
44
|
+
border-bottom: 1px solid var(--kv-table-border);
|
|
45
|
+
background: var(--kv-table-header-bg);
|
|
46
|
+
color: var(--kv-table-header-text);
|
|
47
|
+
font-size: var(--kv-text-2xs);
|
|
48
|
+
font-weight: var(--kv-weight-semibold);
|
|
49
|
+
text-align: left;
|
|
50
|
+
text-transform: none;
|
|
51
|
+
white-space: nowrap;
|
|
52
|
+
}
|
|
53
|
+
/* Badge deliberately shrinks-and-breaks (`overflow-wrap: anywhere`) for tight
|
|
54
|
+
spaces elsewhere in the system; inside a table cell that reads as one
|
|
55
|
+
character per line once the column gets squeezed. `nowrap` on the cell
|
|
56
|
+
alone doesn't stop it — Badge's own rule re-declares `white-space: normal`
|
|
57
|
+
on itself, which wins for its own text — so it needs overriding directly. */
|
|
58
|
+
:where([data-kv-design-system]) [data-ui="kt-cell"] [data-ui="badge"] {
|
|
59
|
+
white-space: nowrap;
|
|
60
|
+
}
|
|
61
|
+
:where([data-kv-design-system]) [data-ui="kt-col"][data-align="end"] {
|
|
62
|
+
text-align: right;
|
|
63
|
+
}
|
|
64
|
+
:where([data-kv-design-system]) [data-ui="kt-sort-button"] {
|
|
65
|
+
text-decoration: none;
|
|
66
|
+
display: inline-flex;
|
|
67
|
+
align-items: center;
|
|
68
|
+
gap: 0.25rem;
|
|
69
|
+
padding: 0;
|
|
70
|
+
border: 0;
|
|
71
|
+
background: transparent;
|
|
72
|
+
color: inherit;
|
|
73
|
+
font: inherit;
|
|
74
|
+
font-weight: inherit;
|
|
75
|
+
text-transform: inherit;
|
|
76
|
+
cursor: pointer;
|
|
77
|
+
}
|
|
78
|
+
:where([data-kv-design-system]) [data-ui="kt-sort-icon"] {
|
|
79
|
+
font-size: var(--kv-text-xs);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
:where([data-kv-design-system]) [data-ui="kt-select-col"],
|
|
83
|
+
:where([data-kv-design-system]) [data-ui="kt-select-cell"] {
|
|
84
|
+
position: relative;
|
|
85
|
+
z-index: 1;
|
|
86
|
+
width: 2.5rem;
|
|
87
|
+
min-width: 2.5rem;
|
|
88
|
+
text-align: center;
|
|
89
|
+
}
|
|
90
|
+
:where([data-kv-design-system]) [data-ui="kt-select-col"] {
|
|
91
|
+
height: var(--kv-table-header-height);
|
|
92
|
+
border-bottom: 1px solid var(--kv-table-border);
|
|
93
|
+
background: var(--kv-table-header-bg);
|
|
94
|
+
}
|
|
95
|
+
:where([data-kv-design-system]) [data-ui="kt-select-cell"] {
|
|
96
|
+
height: var(--kv-row-height);
|
|
97
|
+
border-bottom: 1px solid var(--kv-table-border);
|
|
98
|
+
background: var(--kv-table-row-bg);
|
|
99
|
+
vertical-align: middle;
|
|
100
|
+
}
|
|
101
|
+
:where([data-kv-design-system]) [data-ui="kt-select-all"],
|
|
102
|
+
:where([data-kv-design-system]) [data-ui="kt-row-select"] {
|
|
103
|
+
width: 0.875rem;
|
|
104
|
+
height: 0.875rem;
|
|
105
|
+
margin: 0;
|
|
106
|
+
accent-color: var(--kv-color-accent);
|
|
107
|
+
}
|
|
108
|
+
:where([data-kv-design-system]) [data-ui="kt-select-persisted"] {
|
|
109
|
+
position: absolute;
|
|
110
|
+
width: 0;
|
|
111
|
+
height: 0;
|
|
112
|
+
overflow: hidden;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
:where([data-kv-design-system]) [data-ui="kt-row"] {
|
|
116
|
+
position: relative;
|
|
117
|
+
background: var(--kv-table-row-bg);
|
|
118
|
+
}
|
|
119
|
+
:where([data-kv-design-system]) [data-ui="kt-row"]:hover {
|
|
120
|
+
background: var(--kv-surface-hover);
|
|
121
|
+
}
|
|
122
|
+
:where([data-kv-design-system]) [data-ui="kt-row"][data-selected="true"] {
|
|
123
|
+
background: var(--kv-accent-subtle);
|
|
124
|
+
}
|
|
125
|
+
:where([data-kv-design-system]) [data-ui="kt-cell"] {
|
|
126
|
+
height: var(--kv-row-height);
|
|
127
|
+
padding: 0.4375rem var(--kv-space-3);
|
|
128
|
+
border-bottom: 1px solid var(--kv-table-border);
|
|
129
|
+
white-space: nowrap;
|
|
130
|
+
vertical-align: middle;
|
|
131
|
+
}
|
|
132
|
+
:where([data-kv-design-system]) [data-ui="kt-cell"][data-align="end"] {
|
|
133
|
+
text-align: right;
|
|
134
|
+
}
|
|
135
|
+
:where([data-kv-design-system]) [data-ui="kt-row-link"] {
|
|
136
|
+
color: inherit;
|
|
137
|
+
text-decoration: none;
|
|
138
|
+
}
|
|
139
|
+
:where([data-kv-design-system]) [data-ui="kt-row-link"][data-primary="true"]::after {
|
|
140
|
+
position: absolute;
|
|
141
|
+
inset: 0;
|
|
142
|
+
content: "";
|
|
143
|
+
}
|
|
144
|
+
:where([data-kv-design-system])
|
|
145
|
+
[data-ui="kt-cell"]
|
|
146
|
+
:is(a:not([data-primary="true"]), button, input, select) {
|
|
147
|
+
position: relative;
|
|
148
|
+
z-index: 1;
|
|
149
|
+
}
|
|
150
|
+
:where([data-kv-design-system]) [data-ui="kt-person"] {
|
|
151
|
+
display: inline-flex;
|
|
152
|
+
align-items: center;
|
|
153
|
+
gap: var(--kv-space-2);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
:where([data-kv-design-system]) [data-ui="kt-group-row"] [data-ui="kt-group-cell"] {
|
|
157
|
+
padding: var(--kv-space-2) var(--kv-space-3);
|
|
158
|
+
border-bottom: 1px solid var(--kv-table-border);
|
|
159
|
+
background: var(--kv-table-header-bg);
|
|
160
|
+
}
|
|
161
|
+
:where([data-kv-design-system]) [data-ui="kt-group-toggle"] {
|
|
162
|
+
text-decoration: none;
|
|
163
|
+
display: inline-flex;
|
|
164
|
+
align-items: center;
|
|
165
|
+
gap: var(--kv-space-2);
|
|
166
|
+
border: 0;
|
|
167
|
+
background: transparent;
|
|
168
|
+
color: inherit;
|
|
169
|
+
font: inherit;
|
|
170
|
+
font-weight: var(--kv-weight-semibold);
|
|
171
|
+
cursor: pointer;
|
|
172
|
+
}
|
|
173
|
+
:where([data-kv-design-system]) [data-ui="kt-group-indent"] {
|
|
174
|
+
display: inline-block;
|
|
175
|
+
inline-size: calc(var(--kt-group-depth, 0) * var(--kv-space-4));
|
|
176
|
+
}
|
|
177
|
+
:where([data-kv-design-system]) [data-ui="kt-group-count"] {
|
|
178
|
+
padding: 0 0.375rem;
|
|
179
|
+
border-radius: var(--kv-radius-sm);
|
|
180
|
+
background: var(--kv-panel-bg-subtle);
|
|
181
|
+
color: var(--kv-text-secondary);
|
|
182
|
+
font-size: var(--kv-text-2xs);
|
|
183
|
+
font-weight: var(--kv-weight-semibold);
|
|
184
|
+
}
|
|
185
|
+
:where([data-kv-design-system]) [data-ui="kt-group-pager"] td {
|
|
186
|
+
padding: var(--kv-space-2) var(--kv-space-3);
|
|
187
|
+
border-bottom: 1px solid var(--kv-table-border);
|
|
188
|
+
background: var(--kv-table-row-bg);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
:where([data-kv-design-system]) [data-ui="kt-pager"] {
|
|
192
|
+
display: flex;
|
|
193
|
+
align-items: center;
|
|
194
|
+
justify-content: flex-end;
|
|
195
|
+
gap: var(--kv-space-2);
|
|
196
|
+
}
|
|
197
|
+
:where([data-kv-design-system]) [data-ui="kt-pager-label"] {
|
|
198
|
+
color: var(--kv-text-secondary);
|
|
199
|
+
font-size: var(--kv-text-sm);
|
|
200
|
+
}
|
|
201
|
+
:where([data-kv-design-system]) [data-ui="kt-pager-button"] {
|
|
202
|
+
text-decoration: none;
|
|
203
|
+
display: inline-flex;
|
|
204
|
+
align-items: center;
|
|
205
|
+
justify-content: center;
|
|
206
|
+
inline-size: 1.75rem;
|
|
207
|
+
block-size: 1.75rem;
|
|
208
|
+
border: 1px solid var(--kv-border-default);
|
|
209
|
+
border-radius: var(--kv-radius-sm);
|
|
210
|
+
background: var(--kv-panel-bg);
|
|
211
|
+
color: var(--kv-text-main);
|
|
212
|
+
cursor: pointer;
|
|
213
|
+
}
|
|
214
|
+
:where([data-kv-design-system]) [data-ui="kt-pager-button"]:is(:hover, :focus-visible):not(:disabled) {
|
|
215
|
+
background: var(--kv-surface-hover);
|
|
216
|
+
}
|
|
217
|
+
:where([data-kv-design-system]) [data-ui="kt-pager-button"]:disabled {
|
|
218
|
+
color: var(--kv-text-disabled);
|
|
219
|
+
cursor: not-allowed;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
@media (max-width: 48rem) {
|
|
224
|
+
:where([data-kv-design-system]) [data-ui="ket-table"][data-responsive="stack"] [data-ui="kt-grid"] {
|
|
225
|
+
min-width: 0;
|
|
226
|
+
}
|
|
227
|
+
:where([data-kv-design-system]) [data-ui="ket-table"][data-responsive="stack"] thead {
|
|
228
|
+
position: absolute;
|
|
229
|
+
clip-path: inset(50%);
|
|
230
|
+
inline-size: 1px;
|
|
231
|
+
block-size: 1px;
|
|
232
|
+
overflow: hidden;
|
|
233
|
+
}
|
|
234
|
+
:where([data-kv-design-system]) [data-ui="ket-table"][data-responsive="stack"] [data-ui="kt-row"] {
|
|
235
|
+
display: grid;
|
|
236
|
+
padding: var(--kv-space-2);
|
|
237
|
+
border-bottom: 1px solid var(--kv-table-border);
|
|
238
|
+
}
|
|
239
|
+
:where([data-kv-design-system]) [data-ui="ket-table"][data-responsive="stack"] [data-ui="kt-cell"] {
|
|
240
|
+
display: flex;
|
|
241
|
+
min-height: var(--kv-row-height);
|
|
242
|
+
height: auto;
|
|
243
|
+
gap: var(--kv-space-3);
|
|
244
|
+
justify-content: space-between;
|
|
245
|
+
white-space: normal;
|
|
246
|
+
}
|
|
247
|
+
:where([data-kv-design-system]) [data-ui="ket-table"][data-responsive="stack"] [data-ui="kt-cell"]::before {
|
|
248
|
+
content: attr(data-label);
|
|
249
|
+
color: var(--kv-text-secondary);
|
|
250
|
+
font-weight: var(--kv-weight-semibold);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
@layer ket.app {
|
|
255
|
+
:where([data-kv-design-system]) [data-ui="kt-selection-target"] {
|
|
256
|
+
position: relative;
|
|
257
|
+
z-index: 1;
|
|
258
|
+
display: inline-flex;
|
|
259
|
+
align-items: center;
|
|
260
|
+
justify-content: center;
|
|
261
|
+
min-inline-size: var(--kv-space-6);
|
|
262
|
+
min-block-size: var(--kv-space-6);
|
|
263
|
+
vertical-align: middle;
|
|
264
|
+
cursor: pointer;
|
|
265
|
+
}
|
|
266
|
+
:where([data-kv-design-system]) [data-ui="kt-scroll"]:focus-visible {
|
|
267
|
+
outline: 2px solid var(--kv-accent);
|
|
268
|
+
outline-offset: -2px;
|
|
269
|
+
}
|
|
270
|
+
@media (max-width: 48rem) {
|
|
271
|
+
:where([data-kv-design-system]) [data-ui="ket-table"] {
|
|
272
|
+
--kv-row-height: var(--kv-touch-target);
|
|
273
|
+
}
|
|
274
|
+
:where([data-kv-design-system]) [data-ui="kt-selection-target"] {
|
|
275
|
+
min-inline-size: var(--kv-touch-target);
|
|
276
|
+
min-block-size: var(--kv-touch-target);
|
|
277
|
+
}
|
|
278
|
+
:where([data-kv-design-system]) [data-ui="kt-select-cell"] {
|
|
279
|
+
padding-block: 0;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demo.d.ts","sourceRoot":"","sources":["../../../../../../packages/design-system/src/interactions/lightbox/demo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAQjD,eAAO,MAAM,kBAAkB,EAAE,cAiBhC,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// Inline SVG pictures, so the catalogue specimen needs no network or asset files.
|
|
2
|
+
const picture = (fill, label) => `data:image/svg+xml,${encodeURIComponent(`<svg xmlns="http://www.w3.org/2000/svg" width="960" height="720" viewBox="0 0 960 720"><rect width="960" height="720" fill="${fill}"/><text x="480" y="380" font-family="sans-serif" font-size="64" fill="#fff" text-anchor="middle">${label}</text></svg>`)}`;
|
|
3
|
+
export const lightboxDemoConfig = {
|
|
4
|
+
thumbnails: 'all',
|
|
5
|
+
items: [
|
|
6
|
+
{ src: picture('#1d4ed8', 'Front'), alt: 'Jacket, front', caption: 'Front' },
|
|
7
|
+
{ src: picture('#b45309', 'Back'), alt: 'Jacket, back', caption: 'Back' },
|
|
8
|
+
{ src: picture('#047857', 'Detail'), alt: 'Jacket, collar detail', caption: 'Collar detail' },
|
|
9
|
+
],
|
|
10
|
+
labels: {
|
|
11
|
+
open: 'Open {alt}',
|
|
12
|
+
close: 'Close',
|
|
13
|
+
previous: 'Previous image',
|
|
14
|
+
next: 'Next image',
|
|
15
|
+
zoomIn: 'Zoom in',
|
|
16
|
+
zoomOut: 'Zoom out',
|
|
17
|
+
counter: '{index} / {total}',
|
|
18
|
+
empty: 'No image',
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=demo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demo.js","sourceRoot":"","sources":["../../../../../../../packages/design-system/src/interactions/lightbox/demo.ts"],"names":[],"mappings":"AAEA,kFAAkF;AAClF,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,KAAa,EAAU,EAAE,CACtD,sBAAsB,kBAAkB,CACtC,+HAA+H,IAAI,qGAAqG,KAAK,eAAe,CAC7P,EAAE,CAAA;AAEL,MAAM,CAAC,MAAM,kBAAkB,GAAmB;IAChD,UAAU,EAAE,KAAK;IACjB,KAAK,EAAE;QACL,EAAE,GAAG,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE;QAC5E,EAAE,GAAG,EAAE,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE;QACzE,EAAE,GAAG,EAAE,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,uBAAuB,EAAE,OAAO,EAAE,eAAe,EAAE;KAC9F;IACD,MAAM,EAAE;QACN,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,gBAAgB;QAC1B,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,UAAU;QACnB,OAAO,EAAE,mBAAmB;QAC5B,KAAK,EAAE,UAAU;KAClB;CACF,CAAA"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { IslandController, IslandProps, TemplateResult } from '@ketvietlab/ketjs-view';
|
|
2
|
+
export declare const HOOKS: readonly ['lightbox', 'lightbox-thumbs', 'lightbox-thumb', 'lightbox-empty', 'lightbox-layer', 'lightbox-backdrop', 'lightbox-toolbar', 'lightbox-counter', 'lightbox-tool', 'lightbox-stage', 'lightbox-image', 'lightbox-nav', 'lightbox-caption'];
|
|
3
|
+
export type LightboxItem = {
|
|
4
|
+
src: string;
|
|
5
|
+
alt: string;
|
|
6
|
+
/** A smaller rendition for the trigger; the full `src` is used when omitted. */
|
|
7
|
+
thumbnail?: string | null;
|
|
8
|
+
caption?: string | null;
|
|
9
|
+
};
|
|
10
|
+
export type LightboxLabels = {
|
|
11
|
+
/** The trigger's accessible name, `{alt}` interpolated. */
|
|
12
|
+
open: string;
|
|
13
|
+
close: string;
|
|
14
|
+
previous: string;
|
|
15
|
+
next: string;
|
|
16
|
+
zoomIn: string;
|
|
17
|
+
zoomOut: string;
|
|
18
|
+
/** `{index}` and `{total}` interpolated. */
|
|
19
|
+
counter: string;
|
|
20
|
+
/** Shown in place of a thumbnail when there are no items. */
|
|
21
|
+
empty?: string;
|
|
22
|
+
};
|
|
23
|
+
export type LightboxConfig = {
|
|
24
|
+
items: readonly LightboxItem[];
|
|
25
|
+
labels: LightboxLabels;
|
|
26
|
+
/** `first` shows one thumbnail that opens the whole set; `all` shows one per item. */
|
|
27
|
+
thumbnails?: 'first' | 'all';
|
|
28
|
+
size?: 'small' | 'medium' | 'large';
|
|
29
|
+
};
|
|
30
|
+
export type LightboxIslandProps = {
|
|
31
|
+
id: string;
|
|
32
|
+
config: LightboxConfig;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* The viewer without a trigger of its own: whatever renders thumbnails (a record's
|
|
36
|
+
* image field, the rows of a variant editor) calls `open` with the set to show and
|
|
37
|
+
* places `layer()` anywhere in its own view. `attach` wires the keyboard once, for
|
|
38
|
+
* the lifetime of the island that owns it.
|
|
39
|
+
*/
|
|
40
|
+
export type LightboxController = {
|
|
41
|
+
open: (items: readonly LightboxItem[], at: number, trigger: EventTarget | null) => void;
|
|
42
|
+
close: () => void;
|
|
43
|
+
isOpen: () => boolean;
|
|
44
|
+
layer: () => TemplateResult | null;
|
|
45
|
+
attach: (lifetime: AbortSignal) => void;
|
|
46
|
+
};
|
|
47
|
+
export declare function createLightbox(labels: LightboxLabels, id?: string): LightboxController;
|
|
48
|
+
/** A thumbnail — or one per item — that opens the whole set in the viewer. */
|
|
49
|
+
export declare function createLightboxView(props: LightboxIslandProps): IslandController;
|
|
50
|
+
/** One thumbnail button, for a view that drives its own `createLightbox` controller. */
|
|
51
|
+
export declare const LightboxThumb: (props: {
|
|
52
|
+
item: LightboxItem;
|
|
53
|
+
labels: Pick<LightboxLabels, 'open'>;
|
|
54
|
+
size?: 'small' | 'medium' | 'large';
|
|
55
|
+
onOpen: (trigger: EventTarget | null) => void;
|
|
56
|
+
}) => TemplateResult;
|
|
57
|
+
export declare const lightbox: (props: IslandProps) => IslandController;
|
|
58
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../packages/design-system/src/interactions/lightbox/index.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAE3F,eAAO,MAAM,KAAK,YAChB,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,CACV,CAAA;AAEV,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAA;IACf,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,SAAS,YAAY,EAAE,CAAA;IAC9B,MAAM,EAAE,cAAc,CAAA;IACtB,sFAAsF;IACtF,UAAU,CAAC,EAAE,OAAO,GAAG,KAAK,CAAA;IAC5B,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,CAAA;AAWxE;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAA;IACvF,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,MAAM,EAAE,MAAM,OAAO,CAAA;IACrB,KAAK,EAAE,MAAM,cAAc,GAAG,IAAI,CAAA;IAClC,MAAM,EAAE,CAAC,QAAQ,EAAE,WAAW,KAAK,IAAI,CAAA;CACxC,CAAA;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,SAAa,GAAG,kBAAkB,CA+P1F;AAED,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,GAAG,gBAAgB,CAwC/E;AAED,wFAAwF;AACxF,eAAO,MAAM,aAAa,UAAW;IACnC,IAAI,EAAE,YAAY,CAAA;IAClB,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;IACpC,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAA;IACnC,MAAM,EAAE,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAA;CAC9C,KAAG,cAWH,CAAA;AAED,eAAO,MAAM,QAAQ,UAAW,WAAW,KAAG,gBACe,CAAA"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "@ketvietlab/ketjs-view/jsx-runtime";
|
|
2
|
+
// A Fancybox-style image viewer, as a ketjs-view island: a thumbnail (or a row of
|
|
3
|
+
// them) that opens a full-screen stage over several images, with zoom (buttons,
|
|
4
|
+
// wheel, keyboard, tap), pan (drag), pinch-to-zoom (two fingers), previous/next
|
|
5
|
+
// (buttons, arrow keys) and a counter.
|
|
6
|
+
//
|
|
7
|
+
// Like relation-select, it owns reactive state rather than being a static control
|
|
8
|
+
// wired by the shared delegator — zoom level, pan offset and the open item all
|
|
9
|
+
// change on every pointer move. A consuming app mounts it through its own island
|
|
10
|
+
// runtime; everything it needs (the images, the labels) arrives as JSON props.
|
|
11
|
+
import { each, signal } from '@ketvietlab/ketjs-view';
|
|
12
|
+
export const HOOKS = [
|
|
13
|
+
'lightbox',
|
|
14
|
+
'lightbox-thumbs',
|
|
15
|
+
'lightbox-thumb',
|
|
16
|
+
'lightbox-empty',
|
|
17
|
+
'lightbox-layer',
|
|
18
|
+
'lightbox-backdrop',
|
|
19
|
+
'lightbox-toolbar',
|
|
20
|
+
'lightbox-counter',
|
|
21
|
+
'lightbox-tool',
|
|
22
|
+
'lightbox-stage',
|
|
23
|
+
'lightbox-image',
|
|
24
|
+
'lightbox-nav',
|
|
25
|
+
'lightbox-caption',
|
|
26
|
+
];
|
|
27
|
+
const MIN_ZOOM = 1;
|
|
28
|
+
const MAX_ZOOM = 4;
|
|
29
|
+
const ZOOM_STEP = 0.5;
|
|
30
|
+
const fill = (template, params) => template.replace(/\{(\w+)\}/g, (_, name) => String(params[name] ?? `{${name}}`));
|
|
31
|
+
const clamp = (value, min, max) => Math.min(max, Math.max(min, value));
|
|
32
|
+
export function createLightbox(labels, id = 'lightbox') {
|
|
33
|
+
const items = signal([]);
|
|
34
|
+
const open = signal(false);
|
|
35
|
+
const index = signal(0);
|
|
36
|
+
const zoom = signal(MIN_ZOOM);
|
|
37
|
+
const pan = signal({ x: 0, y: 0 });
|
|
38
|
+
let returnFocus = null;
|
|
39
|
+
// Every pointer down on the stage, so two fingers read as a pinch and one as a pan.
|
|
40
|
+
const pointers = new Map();
|
|
41
|
+
let gesture = null;
|
|
42
|
+
const resetView = () => {
|
|
43
|
+
zoom.set(MIN_ZOOM);
|
|
44
|
+
pan.set({ x: 0, y: 0 });
|
|
45
|
+
};
|
|
46
|
+
const show = (set, at, trigger) => {
|
|
47
|
+
if (!set.length)
|
|
48
|
+
return;
|
|
49
|
+
returnFocus = trigger instanceof HTMLElement ? trigger : null;
|
|
50
|
+
items.set(set);
|
|
51
|
+
index.set(clamp(at, 0, set.length - 1));
|
|
52
|
+
resetView();
|
|
53
|
+
open.set(true);
|
|
54
|
+
queueMicrotask(() => {
|
|
55
|
+
if (typeof document === 'undefined')
|
|
56
|
+
return;
|
|
57
|
+
document.getElementById(`${id}-lightbox-close`)?.focus();
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
const hide = () => {
|
|
61
|
+
if (!open())
|
|
62
|
+
return;
|
|
63
|
+
open.set(false);
|
|
64
|
+
resetView();
|
|
65
|
+
pointers.clear();
|
|
66
|
+
gesture = null;
|
|
67
|
+
returnFocus?.focus();
|
|
68
|
+
returnFocus = null;
|
|
69
|
+
};
|
|
70
|
+
const step = (delta) => {
|
|
71
|
+
const total = items().length;
|
|
72
|
+
if (total < 2)
|
|
73
|
+
return;
|
|
74
|
+
index.set((index() + delta + total) % total);
|
|
75
|
+
resetView();
|
|
76
|
+
};
|
|
77
|
+
const zoomTo = (next) => {
|
|
78
|
+
const value = clamp(next, MIN_ZOOM, MAX_ZOOM);
|
|
79
|
+
zoom.set(value);
|
|
80
|
+
// Back at fit size there is nothing to pan across.
|
|
81
|
+
if (value === MIN_ZOOM)
|
|
82
|
+
pan.set({ x: 0, y: 0 });
|
|
83
|
+
};
|
|
84
|
+
const centerOf = () => {
|
|
85
|
+
const points = [...pointers.values()];
|
|
86
|
+
if (!points.length)
|
|
87
|
+
return { x: 0, y: 0 };
|
|
88
|
+
return {
|
|
89
|
+
x: points.reduce((sum, point) => sum + point.x, 0) / points.length,
|
|
90
|
+
y: points.reduce((sum, point) => sum + point.y, 0) / points.length,
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
const distanceOf = () => {
|
|
94
|
+
const [a, b] = [...pointers.values()];
|
|
95
|
+
return a && b ? Math.hypot(a.x - b.x, a.y - b.y) : 0;
|
|
96
|
+
};
|
|
97
|
+
const endPointer = (event, completed) => {
|
|
98
|
+
// At fit size a horizontal swipe with one finger moves to the neighbouring image.
|
|
99
|
+
if (completed && gesture && pointers.size === 1 && zoom() === MIN_ZOOM && gesture.distance === null) {
|
|
100
|
+
const dx = event.clientX - gesture.start.x;
|
|
101
|
+
if (Math.abs(dx) > 60 && Math.abs(dx) > Math.abs(event.clientY - gesture.start.y))
|
|
102
|
+
step(dx < 0 ? 1 : -1);
|
|
103
|
+
}
|
|
104
|
+
pointers.delete(event.pointerId);
|
|
105
|
+
event.currentTarget?.releasePointerCapture?.(event.pointerId);
|
|
106
|
+
if (!pointers.size) {
|
|
107
|
+
// Keep `moved` until the click that follows this pointerup has been read.
|
|
108
|
+
const finished = gesture;
|
|
109
|
+
if (finished && completed)
|
|
110
|
+
setTimeout(() => (gesture === finished ? (gesture = null) : null), 0);
|
|
111
|
+
else
|
|
112
|
+
gesture = null;
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
// One finger lifted from a pinch: carry on as a pan from where things are now.
|
|
116
|
+
if (gesture)
|
|
117
|
+
gesture = { ...gesture, start: centerOf(), origin: pan(), zoom: zoom(), distance: null };
|
|
118
|
+
};
|
|
119
|
+
const layer = () => {
|
|
120
|
+
const set = items();
|
|
121
|
+
const item = set[index()];
|
|
122
|
+
if (!open() || !item)
|
|
123
|
+
return null;
|
|
124
|
+
const scale = zoom();
|
|
125
|
+
const offset = pan();
|
|
126
|
+
const many = set.length > 1;
|
|
127
|
+
return (_jsxs("div", { "data-ui": "lightbox-layer", role: "dialog", "aria-modal": "true", "aria-label": item.alt, id: `${id}-lightbox`, children: [_jsx("div", { "data-ui": "lightbox-backdrop", "aria-hidden": "true", onClick: hide }), _jsxs("div", { "data-ui": "lightbox-toolbar", children: [_jsx("span", { "data-ui": "lightbox-counter", "aria-live": "polite", children: many ? fill(labels.counter, { index: index() + 1, total: set.length }) : '' }), _jsx("button", { type: "button", "data-ui": "lightbox-tool", "data-tool": "zoom-out", "aria-label": labels.zoomOut, title: labels.zoomOut, disabled: scale <= MIN_ZOOM, onClick: () => zoomTo(scale - ZOOM_STEP), children: "\u2212" }), _jsx("button", { type: "button", "data-ui": "lightbox-tool", "data-tool": "zoom-in", "aria-label": labels.zoomIn, title: labels.zoomIn, disabled: scale >= MAX_ZOOM, onClick: () => zoomTo(scale + ZOOM_STEP), children: "+" }), _jsx("button", { type: "button", "data-ui": "lightbox-tool", "data-tool": "close", id: `${id}-lightbox-close`, "aria-label": labels.close, title: labels.close, onClick: hide, children: "\u00D7" })] }), _jsx("div", { role: "presentation", "data-ui": "lightbox-stage", "data-zoomed": String(scale > MIN_ZOOM), onClick: (event) => {
|
|
128
|
+
// A click on the empty stage around the picture closes, like the backdrop.
|
|
129
|
+
if (event.target === event.currentTarget && !gesture?.moved)
|
|
130
|
+
hide();
|
|
131
|
+
}, onWheel: (event) => {
|
|
132
|
+
event.preventDefault();
|
|
133
|
+
zoomTo(zoom() * (event.deltaY < 0 ? 1.15 : 1 / 1.15));
|
|
134
|
+
}, onPointerDown: (event) => {
|
|
135
|
+
pointers.set(event.pointerId, { x: event.clientX, y: event.clientY });
|
|
136
|
+
event.currentTarget.setPointerCapture?.(event.pointerId);
|
|
137
|
+
gesture = {
|
|
138
|
+
start: centerOf(),
|
|
139
|
+
origin: pan(),
|
|
140
|
+
zoom: zoom(),
|
|
141
|
+
distance: pointers.size > 1 ? distanceOf() : null,
|
|
142
|
+
moved: gesture?.moved === true && pointers.size > 1,
|
|
143
|
+
};
|
|
144
|
+
}, onPointerMove: (event) => {
|
|
145
|
+
if (!gesture || !pointers.has(event.pointerId))
|
|
146
|
+
return;
|
|
147
|
+
pointers.set(event.pointerId, { x: event.clientX, y: event.clientY });
|
|
148
|
+
const center = centerOf();
|
|
149
|
+
const dx = center.x - gesture.start.x;
|
|
150
|
+
const dy = center.y - gesture.start.y;
|
|
151
|
+
if (Math.abs(dx) + Math.abs(dy) > 4)
|
|
152
|
+
gesture.moved = true;
|
|
153
|
+
if (pointers.size > 1 && gesture.distance) {
|
|
154
|
+
// Pinch: scale by how far the fingers spread since they both came down.
|
|
155
|
+
zoomTo(gesture.zoom * (distanceOf() / gesture.distance));
|
|
156
|
+
gesture.moved = true;
|
|
157
|
+
}
|
|
158
|
+
if (zoom() > MIN_ZOOM)
|
|
159
|
+
pan.set({ x: gesture.origin.x + dx, y: gesture.origin.y + dy });
|
|
160
|
+
}, onPointerUp: (event) => endPointer(event, true), onPointerCancel: (event) => endPointer(event, false), children: _jsx("img", { "data-ui": "lightbox-image", src: item.src, alt: item.alt, draggable: "false", style: `transform: translate(${offset.x}px, ${offset.y}px) scale(${scale})`, onClick: () => {
|
|
161
|
+
// A tap (not the end of a pan or pinch) toggles between fit and 2×.
|
|
162
|
+
if (!gesture?.moved)
|
|
163
|
+
zoomTo(zoom() > MIN_ZOOM ? MIN_ZOOM : 2);
|
|
164
|
+
} }) }), many ? (_jsx("button", { type: "button", "data-ui": "lightbox-nav", "data-direction": "previous", "aria-label": labels.previous, title: labels.previous, onClick: () => step(-1), children: "\u2039" })) : null, many ? (_jsx("button", { type: "button", "data-ui": "lightbox-nav", "data-direction": "next", "aria-label": labels.next, title: labels.next, onClick: () => step(1), children: "\u203A" })) : null, item.caption ? _jsx("p", { "data-ui": "lightbox-caption", children: item.caption }) : null] }));
|
|
165
|
+
};
|
|
166
|
+
const attach = (lifetime) => {
|
|
167
|
+
// Capture phase: an enclosing record modal also closes on Escape, and the
|
|
168
|
+
// viewer on top of it must be the only layer that answers.
|
|
169
|
+
document.addEventListener('keydown', (event) => {
|
|
170
|
+
if (!open())
|
|
171
|
+
return;
|
|
172
|
+
if (event.key === 'Escape')
|
|
173
|
+
hide();
|
|
174
|
+
else if (event.key === 'ArrowLeft')
|
|
175
|
+
step(-1);
|
|
176
|
+
else if (event.key === 'ArrowRight')
|
|
177
|
+
step(1);
|
|
178
|
+
else if (event.key === '+' || event.key === '=')
|
|
179
|
+
zoomTo(zoom() + ZOOM_STEP);
|
|
180
|
+
else if (event.key === '-')
|
|
181
|
+
zoomTo(zoom() - ZOOM_STEP);
|
|
182
|
+
else
|
|
183
|
+
return;
|
|
184
|
+
event.preventDefault();
|
|
185
|
+
event.stopImmediatePropagation();
|
|
186
|
+
}, { signal: lifetime, capture: true });
|
|
187
|
+
lifetime.addEventListener('abort', () => {
|
|
188
|
+
open.set(false);
|
|
189
|
+
pointers.clear();
|
|
190
|
+
gesture = null;
|
|
191
|
+
});
|
|
192
|
+
};
|
|
193
|
+
return { open: show, close: hide, isOpen: () => open(), layer, attach };
|
|
194
|
+
}
|
|
195
|
+
/** A thumbnail — or one per item — that opens the whole set in the viewer. */
|
|
196
|
+
export function createLightboxView(props) {
|
|
197
|
+
const { id, config } = props;
|
|
198
|
+
const labels = config.labels;
|
|
199
|
+
const items = config.items;
|
|
200
|
+
const viewer = createLightbox(labels, id);
|
|
201
|
+
const thumbs = () => {
|
|
202
|
+
const shown = config.thumbnails === 'all' ? items : items.slice(0, 1);
|
|
203
|
+
if (!shown.length)
|
|
204
|
+
return (_jsx("span", { "data-ui": "lightbox-empty", "data-size": config.size ?? 'medium', children: labels.empty ?? '' }));
|
|
205
|
+
return (_jsx("div", { "data-ui": "lightbox-thumbs", children: each([...shown], (item) => item.src, (item) => LightboxThumb({
|
|
206
|
+
item,
|
|
207
|
+
labels,
|
|
208
|
+
size: config.size,
|
|
209
|
+
onOpen: (trigger) => viewer.open(items, items.indexOf(item), trigger),
|
|
210
|
+
})) }));
|
|
211
|
+
};
|
|
212
|
+
return {
|
|
213
|
+
view: () => (_jsxs("div", { "data-ui": "lightbox", id: id, children: [thumbs(), viewer.layer()] })),
|
|
214
|
+
mount: ({ lifetime }) => viewer.attach(lifetime),
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/** One thumbnail button, for a view that drives its own `createLightbox` controller. */
|
|
218
|
+
export const LightboxThumb = (props) => (_jsx("button", { type: "button", "data-ui": "lightbox-thumb", "data-size": props.size ?? 'medium', "aria-label": fill(props.labels.open, { alt: props.item.alt }), "aria-haspopup": "dialog", onClick: (event) => props.onOpen(event.currentTarget), children: _jsx("img", { src: props.item.thumbnail ?? props.item.src, alt: "", loading: "lazy", decoding: "async" }) }));
|
|
219
|
+
export const lightbox = (props) => createLightboxView(props);
|
|
220
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/design-system/src/interactions/lightbox/index.tsx"],"names":[],"mappings":"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"}
|