@sortsys/ui 0.1.6 → 0.1.7
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/dist/dev.js +2031 -0
- package/dist/dev.jsx +1494 -215
- package/dist/index.js +2031 -0
- package/dist/index.jsx +1494 -215
- package/package.json +1 -1
- package/dist/dev.mjs +0 -2
- package/dist/index.mjs +0 -2
package/dist/index.js
ADDED
|
@@ -0,0 +1,2031 @@
|
|
|
1
|
+
import { delegateEvents, template, insert, memo, effect, setAttribute, use, createComponent, addEventListener, className, spread, mergeProps, style, setStyleProperty, Portal } from 'solid-js/web';
|
|
2
|
+
import { createContext, useContext, createSignal, onMount, onCleanup, createEffect, createUniqueId, For, untrack, createMemo, Show, createResource } from 'solid-js';
|
|
3
|
+
import { useLocation, A, useNavigate } from '@solidjs/router';
|
|
4
|
+
|
|
5
|
+
// src/components/SSButton.tsx
|
|
6
|
+
var _tmpl$ = /* @__PURE__ */ template(`<button>`);
|
|
7
|
+
function SSButton(props) {
|
|
8
|
+
const classes = () => ["ss_button", props.isIconOnly ? "ss_button--icon" : "", props.class ?? ""].filter(Boolean).join(" ");
|
|
9
|
+
return (() => {
|
|
10
|
+
var _el$ = _tmpl$();
|
|
11
|
+
addEventListener(_el$, "click", props.onclick, true);
|
|
12
|
+
insert(_el$, () => props.children);
|
|
13
|
+
effect((_p$) => {
|
|
14
|
+
var _v$ = props.type ?? "button", _v$2 = classes(), _v$3 = props.disabled, _v$4 = props.ariaLabel, _v$5 = props.form;
|
|
15
|
+
_v$ !== _p$.e && setAttribute(_el$, "type", _p$.e = _v$);
|
|
16
|
+
_v$2 !== _p$.t && className(_el$, _p$.t = _v$2);
|
|
17
|
+
_v$3 !== _p$.a && (_el$.disabled = _p$.a = _v$3);
|
|
18
|
+
_v$4 !== _p$.o && setAttribute(_el$, "aria-label", _p$.o = _v$4);
|
|
19
|
+
_v$5 !== _p$.i && setAttribute(_el$, "form", _p$.i = _v$5);
|
|
20
|
+
return _p$;
|
|
21
|
+
}, {
|
|
22
|
+
e: void 0,
|
|
23
|
+
t: void 0,
|
|
24
|
+
a: void 0,
|
|
25
|
+
o: void 0,
|
|
26
|
+
i: void 0
|
|
27
|
+
});
|
|
28
|
+
return _el$;
|
|
29
|
+
})();
|
|
30
|
+
}
|
|
31
|
+
delegateEvents(["click"]);
|
|
32
|
+
var _tmpl$2 = /* @__PURE__ */ template(`<div><span class=ss_callout__icon></span><div class=ss_callout__content><span>`);
|
|
33
|
+
function SSCallout(props) {
|
|
34
|
+
const {
|
|
35
|
+
icon,
|
|
36
|
+
color,
|
|
37
|
+
class: className,
|
|
38
|
+
style,
|
|
39
|
+
children,
|
|
40
|
+
...rest
|
|
41
|
+
} = props;
|
|
42
|
+
return (() => {
|
|
43
|
+
var _el$ = _tmpl$2(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.firstChild;
|
|
44
|
+
spread(_el$, mergeProps(rest, {
|
|
45
|
+
"class": `ss_callout ss_callout--${color} ${className ?? ""}`,
|
|
46
|
+
"style": style
|
|
47
|
+
}), false, true);
|
|
48
|
+
insert(_el$2, icon);
|
|
49
|
+
insert(_el$4, children);
|
|
50
|
+
return _el$;
|
|
51
|
+
})();
|
|
52
|
+
}
|
|
53
|
+
var _tmpl$3 = /* @__PURE__ */ template(`<button type=button><span class=ss_chip__label>`);
|
|
54
|
+
var _tmpl$22 = /* @__PURE__ */ template(`<div><span class=ss_chip__label>`);
|
|
55
|
+
var _tmpl$32 = /* @__PURE__ */ template(`<button type=button class=ss_chip__dismiss aria-label=Entfernen><svg xmlns=http://www.w3.org/2000/svg width=24 height=24 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round class="icon icon-tabler icons-tabler-outline icon-tabler-x"><path stroke=none d="M0 0h24v24H0z"fill=none></path><path d="M18 6l-12 12"></path><path d="M6 6l12 12">`);
|
|
56
|
+
function SSChip(props) {
|
|
57
|
+
const commonClass = `ss_chip ss_chip--${props.color ?? "blue"} ${props.class ?? ""}`;
|
|
58
|
+
if ("onclick" in props && props.onclick) {
|
|
59
|
+
return (() => {
|
|
60
|
+
var _el$ = _tmpl$3(), _el$2 = _el$.firstChild;
|
|
61
|
+
addEventListener(_el$, "click", props.onclick, true);
|
|
62
|
+
className(_el$, `${commonClass} ss_chip--clickable`);
|
|
63
|
+
insert(_el$2, () => props.children);
|
|
64
|
+
effect((_$p) => style(_el$, props.style, _$p));
|
|
65
|
+
return _el$;
|
|
66
|
+
})();
|
|
67
|
+
}
|
|
68
|
+
return (() => {
|
|
69
|
+
var _el$3 = _tmpl$22(), _el$4 = _el$3.firstChild;
|
|
70
|
+
className(_el$3, commonClass);
|
|
71
|
+
insert(_el$4, () => props.children);
|
|
72
|
+
insert(_el$3, (() => {
|
|
73
|
+
var _c$ = memo(() => !!("ondismiss" in props && props.ondismiss));
|
|
74
|
+
return () => _c$() && (() => {
|
|
75
|
+
var _el$5 = _tmpl$32();
|
|
76
|
+
addEventListener(_el$5, "click", props.ondismiss, true);
|
|
77
|
+
return _el$5;
|
|
78
|
+
})();
|
|
79
|
+
})(), null);
|
|
80
|
+
effect((_$p) => style(_el$3, props.style, _$p));
|
|
81
|
+
return _el$3;
|
|
82
|
+
})();
|
|
83
|
+
}
|
|
84
|
+
delegateEvents(["click"]);
|
|
85
|
+
var _tmpl$4 = /* @__PURE__ */ template(`<div>`);
|
|
86
|
+
var _tmpl$23 = /* @__PURE__ */ template(`<div class=ss_table__pagination><button type=button class=ss_table__page_button aria-label="Erste Seite"><svg xmlns=http://www.w3.org/2000/svg width=24 height=24 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round class="icon icon-tabler icons-tabler-outline icon-tabler-chevron-left-pipe"><path stroke=none d="M0 0h24v24H0z"fill=none></path><path d="M7 6v12"></path><path d="M18 6l-6 6l6 6"></path></svg></button><button type=button class=ss_table__page_button aria-label="Vorherige Seite"><svg xmlns=http://www.w3.org/2000/svg width=24 height=24 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round class="icon icon-tabler icons-tabler-outline icon-tabler-chevron-left"><path stroke=none d="M0 0h24v24H0z"fill=none></path><path d="M15 6l-6 6l6 6"></path></svg></button><span class=ss_table__page_info>Seite <!> von </span><button type=button class=ss_table__page_button aria-label="N\xE4chste Seite"><svg xmlns=http://www.w3.org/2000/svg width=24 height=24 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round class="icon icon-tabler icons-tabler-outline icon-tabler-chevron-right"><path stroke=none d="M0 0h24v24H0z"fill=none></path><path d="M9 6l6 6l-6 6"></path></svg></button><button type=button class=ss_table__page_button aria-label="Letzte Seite"><svg xmlns=http://www.w3.org/2000/svg width=24 height=24 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round class="icon icon-tabler icons-tabler-outline icon-tabler-chevron-right-pipe"><path stroke=none d="M0 0h24v24H0z"fill=none></path><path d="M6 6l6 6l-6 6"></path><path d="M17 5v13">`);
|
|
87
|
+
var _tmpl$33 = /* @__PURE__ */ template(`<div><div class=ss_table__scroll><table><thead><tr></tr></thead><tbody>`);
|
|
88
|
+
var _tmpl$42 = /* @__PURE__ */ template(`<th>`);
|
|
89
|
+
var _tmpl$5 = /* @__PURE__ */ template(`<button type=button class=ss_table__sort_button><span class=ss_table__sort_icon aria-hidden=true>`);
|
|
90
|
+
var _tmpl$6 = /* @__PURE__ */ template(`<svg xmlns=http://www.w3.org/2000/svg width=24 height=24 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round class="icon icon-tabler icons-tabler-outline icon-tabler-chevron-down"><path stroke=none d="M0 0h24v24H0z"fill=none></path><path d="M6 9l6 6l6 -6">`);
|
|
91
|
+
var _tmpl$7 = /* @__PURE__ */ template(`<svg xmlns=http://www.w3.org/2000/svg width=24 height=24 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round class="icon icon-tabler icons-tabler-outline icon-tabler-chevron-up"><path stroke=none d="M0 0h24v24H0z"fill=none></path><path d="M6 15l6 -6l6 6">`);
|
|
92
|
+
var _tmpl$8 = /* @__PURE__ */ template(`<svg xmlns=http://www.w3.org/2000/svg width=24 height=24 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round class="icon icon-tabler icons-tabler-outline icon-tabler-selector"><path stroke=none d="M0 0h24v24H0z"fill=none></path><path d="M8 9l4 -4l4 4"></path><path d="M16 15l-4 4l-4 -4">`);
|
|
93
|
+
var _tmpl$9 = /* @__PURE__ */ template(`<span class=ss_table__header_label>`);
|
|
94
|
+
var _tmpl$0 = /* @__PURE__ */ template(`<tr>`);
|
|
95
|
+
var _tmpl$1 = /* @__PURE__ */ template(`<td>`);
|
|
96
|
+
function SSDataCell(props) {
|
|
97
|
+
const rendered = createMemo(() => props.render(props.row));
|
|
98
|
+
const [asyncContent] = createResource(async () => {
|
|
99
|
+
const value = rendered();
|
|
100
|
+
if (value && typeof value.then === "function") {
|
|
101
|
+
return await value;
|
|
102
|
+
}
|
|
103
|
+
return null;
|
|
104
|
+
});
|
|
105
|
+
return (() => {
|
|
106
|
+
var _el$ = _tmpl$4();
|
|
107
|
+
insert(_el$, () => {
|
|
108
|
+
const value = rendered();
|
|
109
|
+
if (value && typeof value.then === "function") {
|
|
110
|
+
return asyncContent() ?? "";
|
|
111
|
+
}
|
|
112
|
+
return value;
|
|
113
|
+
});
|
|
114
|
+
return _el$;
|
|
115
|
+
})();
|
|
116
|
+
}
|
|
117
|
+
function SSDataTable(props) {
|
|
118
|
+
const [sortIndex, setSortIndex] = createSignal(-1);
|
|
119
|
+
const [sortDir, setSortDir] = createSignal(null);
|
|
120
|
+
const [page, setPage] = createSignal(1);
|
|
121
|
+
const pageSize = () => Math.max(1, props.pageSize ?? 25);
|
|
122
|
+
const sortedRows = createMemo(() => {
|
|
123
|
+
const index = sortIndex();
|
|
124
|
+
const dir = sortDir();
|
|
125
|
+
if (index < 0 || !dir) return props.rows;
|
|
126
|
+
const column = props.columns[index];
|
|
127
|
+
if (!column?.sortKey) return props.rows;
|
|
128
|
+
const entries = props.rows.map((row, idx) => ({
|
|
129
|
+
row,
|
|
130
|
+
idx,
|
|
131
|
+
key: column.sortKey(row)
|
|
132
|
+
}));
|
|
133
|
+
entries.sort((a, b) => {
|
|
134
|
+
if (a.key === b.key) return a.idx - b.idx;
|
|
135
|
+
if (a.key < b.key) return dir === "asc" ? -1 : 1;
|
|
136
|
+
return dir === "asc" ? 1 : -1;
|
|
137
|
+
});
|
|
138
|
+
return entries.map((entry) => entry.row);
|
|
139
|
+
});
|
|
140
|
+
const totalPages = createMemo(() => {
|
|
141
|
+
return Math.max(1, Math.ceil(sortedRows().length / pageSize()));
|
|
142
|
+
});
|
|
143
|
+
const pagedRows = createMemo(() => {
|
|
144
|
+
const current = Math.min(page(), totalPages());
|
|
145
|
+
const start = (current - 1) * pageSize();
|
|
146
|
+
return sortedRows().slice(start, start + pageSize());
|
|
147
|
+
});
|
|
148
|
+
createEffect(() => {
|
|
149
|
+
if (page() > totalPages()) setPage(totalPages());
|
|
150
|
+
});
|
|
151
|
+
const toggleSort = (index) => {
|
|
152
|
+
if (sortIndex() !== index) {
|
|
153
|
+
setSortIndex(index);
|
|
154
|
+
setSortDir("asc");
|
|
155
|
+
setPage(1);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
if (sortDir() === "asc") {
|
|
159
|
+
setSortDir("desc");
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
if (sortDir() === "desc") {
|
|
163
|
+
setSortIndex(-1);
|
|
164
|
+
setSortDir(null);
|
|
165
|
+
setPage(1);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
setSortDir("asc");
|
|
169
|
+
setPage(1);
|
|
170
|
+
};
|
|
171
|
+
const goToPage = (next) => {
|
|
172
|
+
const safePage = Math.min(Math.max(1, next), totalPages());
|
|
173
|
+
setPage(safePage);
|
|
174
|
+
};
|
|
175
|
+
const paginationPosition = () => props.paginationPosition ?? "bottom";
|
|
176
|
+
const containerClass = () => `ss_table ${paginationPosition() === "top" ? "ss_table--pagination-top" : ""} ${props.class ?? ""}`;
|
|
177
|
+
const paginationBar = () => (() => {
|
|
178
|
+
var _el$2 = _tmpl$23(), _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$4.nextSibling, _el$6 = _el$5.firstChild, _el$8 = _el$6.nextSibling; _el$8.nextSibling; var _el$9 = _el$5.nextSibling, _el$0 = _el$9.nextSibling;
|
|
179
|
+
_el$3.$$click = () => goToPage(1);
|
|
180
|
+
_el$4.$$click = () => goToPage(page() - 1);
|
|
181
|
+
insert(_el$5, page, _el$8);
|
|
182
|
+
insert(_el$5, totalPages, null);
|
|
183
|
+
_el$9.$$click = () => goToPage(page() + 1);
|
|
184
|
+
_el$0.$$click = () => goToPage(totalPages());
|
|
185
|
+
effect((_p$) => {
|
|
186
|
+
var _v$ = page() === 1, _v$2 = page() === 1, _v$3 = page() === totalPages(), _v$4 = page() === totalPages();
|
|
187
|
+
_v$ !== _p$.e && (_el$3.disabled = _p$.e = _v$);
|
|
188
|
+
_v$2 !== _p$.t && (_el$4.disabled = _p$.t = _v$2);
|
|
189
|
+
_v$3 !== _p$.a && (_el$9.disabled = _p$.a = _v$3);
|
|
190
|
+
_v$4 !== _p$.o && (_el$0.disabled = _p$.o = _v$4);
|
|
191
|
+
return _p$;
|
|
192
|
+
}, {
|
|
193
|
+
e: void 0,
|
|
194
|
+
t: void 0,
|
|
195
|
+
a: void 0,
|
|
196
|
+
o: void 0
|
|
197
|
+
});
|
|
198
|
+
return _el$2;
|
|
199
|
+
})();
|
|
200
|
+
return (() => {
|
|
201
|
+
var _el$1 = _tmpl$33(), _el$10 = _el$1.firstChild, _el$11 = _el$10.firstChild, _el$12 = _el$11.firstChild, _el$13 = _el$12.firstChild, _el$14 = _el$12.nextSibling;
|
|
202
|
+
insert(_el$1, (() => {
|
|
203
|
+
var _c$ = memo(() => paginationPosition() === "top");
|
|
204
|
+
return () => _c$() && paginationBar();
|
|
205
|
+
})(), _el$10);
|
|
206
|
+
insert(_el$13, createComponent(For, {
|
|
207
|
+
get each() {
|
|
208
|
+
return props.columns;
|
|
209
|
+
},
|
|
210
|
+
children: (column, index) => {
|
|
211
|
+
const sortable = !!column.sortKey;
|
|
212
|
+
const isActive = () => sortIndex() === index();
|
|
213
|
+
const currentDir = () => isActive() ? sortDir() : null;
|
|
214
|
+
return (() => {
|
|
215
|
+
var _el$15 = _tmpl$42();
|
|
216
|
+
insert(_el$15, sortable ? (() => {
|
|
217
|
+
var _el$16 = _tmpl$5(), _el$17 = _el$16.firstChild;
|
|
218
|
+
_el$16.$$click = () => toggleSort(index());
|
|
219
|
+
insert(_el$16, () => column.label, _el$17);
|
|
220
|
+
insert(_el$17, (() => {
|
|
221
|
+
var _c$3 = memo(() => currentDir() === "asc");
|
|
222
|
+
return () => _c$3() ? _tmpl$6() : memo(() => currentDir() === "desc")() ? _tmpl$7() : _tmpl$8();
|
|
223
|
+
})());
|
|
224
|
+
effect((_p$) => {
|
|
225
|
+
var _v$7 = currentDir() === "asc" ? "ascending" : currentDir() === "desc" ? "descending" : "none", _v$8 = currentDir() ?? "none";
|
|
226
|
+
_v$7 !== _p$.e && setAttribute(_el$16, "aria-sort", _p$.e = _v$7);
|
|
227
|
+
_v$8 !== _p$.t && setAttribute(_el$16, "data-sort", _p$.t = _v$8);
|
|
228
|
+
return _p$;
|
|
229
|
+
}, {
|
|
230
|
+
e: void 0,
|
|
231
|
+
t: void 0
|
|
232
|
+
});
|
|
233
|
+
return _el$16;
|
|
234
|
+
})() : (() => {
|
|
235
|
+
var _el$21 = _tmpl$9();
|
|
236
|
+
insert(_el$21, () => column.label);
|
|
237
|
+
return _el$21;
|
|
238
|
+
})());
|
|
239
|
+
return _el$15;
|
|
240
|
+
})();
|
|
241
|
+
}
|
|
242
|
+
}));
|
|
243
|
+
insert(_el$14, createComponent(For, {
|
|
244
|
+
get each() {
|
|
245
|
+
return pagedRows();
|
|
246
|
+
},
|
|
247
|
+
children: (row) => (() => {
|
|
248
|
+
var _el$22 = _tmpl$0();
|
|
249
|
+
_el$22.$$click = () => props.onRowClick?.(row);
|
|
250
|
+
insert(_el$22, createComponent(For, {
|
|
251
|
+
get each() {
|
|
252
|
+
return props.columns;
|
|
253
|
+
},
|
|
254
|
+
children: (column) => (() => {
|
|
255
|
+
var _el$23 = _tmpl$1();
|
|
256
|
+
insert(_el$23, createComponent(SSDataCell, {
|
|
257
|
+
row,
|
|
258
|
+
get render() {
|
|
259
|
+
return column.render;
|
|
260
|
+
}
|
|
261
|
+
}));
|
|
262
|
+
return _el$23;
|
|
263
|
+
})()
|
|
264
|
+
}));
|
|
265
|
+
effect(() => setAttribute(_el$22, "data-clickable", props.onRowClick ? "true" : void 0));
|
|
266
|
+
return _el$22;
|
|
267
|
+
})()
|
|
268
|
+
}));
|
|
269
|
+
insert(_el$1, (() => {
|
|
270
|
+
var _c$2 = memo(() => paginationPosition() === "bottom");
|
|
271
|
+
return () => _c$2() && paginationBar();
|
|
272
|
+
})(), null);
|
|
273
|
+
effect((_p$) => {
|
|
274
|
+
var _v$5 = containerClass(), _v$6 = props.style;
|
|
275
|
+
_v$5 !== _p$.e && className(_el$1, _p$.e = _v$5);
|
|
276
|
+
_p$.t = style(_el$1, _v$6, _p$.t);
|
|
277
|
+
return _p$;
|
|
278
|
+
}, {
|
|
279
|
+
e: void 0,
|
|
280
|
+
t: void 0
|
|
281
|
+
});
|
|
282
|
+
return _el$1;
|
|
283
|
+
})();
|
|
284
|
+
}
|
|
285
|
+
delegateEvents(["click"]);
|
|
286
|
+
var _tmpl$10 = /* @__PURE__ */ template(`<div class=ss_dropdown__menu role=menu>`);
|
|
287
|
+
var _tmpl$24 = /* @__PURE__ */ template(`<div><button type=button class="ss_dropdown__trigger ss_button ss_button--icon"aria-haspopup=menu>`);
|
|
288
|
+
var _tmpl$34 = /* @__PURE__ */ template(`<svg xmlns=http://www.w3.org/2000/svg width=24 height=24 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round class="icon icon-tabler icons-tabler-outline icon-tabler-dots-vertical"><path stroke=none d="M0 0h24v24H0z"fill=none></path><path d="M11 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path><path d="M11 19a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path><path d="M11 5a1 1 0 1 0 2 0a1 1 0 1 0 -2 0">`);
|
|
289
|
+
var _tmpl$43 = /* @__PURE__ */ template(`<button type=button class=ss_dropdown__item><span class=ss_dropdown__item_icon></span><span class=ss_dropdown__item_label>`);
|
|
290
|
+
var _tmpl$52 = /* @__PURE__ */ template(`<span class=ss_dropdown__item_check aria-hidden=true><svg xmlns=http://www.w3.org/2000/svg width=24 height=24 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round class="icon icon-tabler icons-tabler-outline icon-tabler-check"><path stroke=none d="M0 0h24v24H0z"fill=none></path><path d="M5 12l5 5l10 -10">`);
|
|
291
|
+
function SSDropdown(props) {
|
|
292
|
+
const [open, setOpen] = createSignal(false);
|
|
293
|
+
const [renderMenu, setRenderMenu] = createSignal(false);
|
|
294
|
+
const [menuState, setMenuState] = createSignal("closed");
|
|
295
|
+
let rootRef;
|
|
296
|
+
const close = () => setOpen(false);
|
|
297
|
+
createEffect(() => {
|
|
298
|
+
if (open()) {
|
|
299
|
+
setRenderMenu(true);
|
|
300
|
+
requestAnimationFrame(() => setMenuState("open"));
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
if (!renderMenu()) return;
|
|
304
|
+
setMenuState("closed");
|
|
305
|
+
const timeout = window.setTimeout(() => setRenderMenu(false), 160);
|
|
306
|
+
onCleanup(() => window.clearTimeout(timeout));
|
|
307
|
+
});
|
|
308
|
+
onMount(() => {
|
|
309
|
+
const handlePointerDown = (event) => {
|
|
310
|
+
const target = event.target;
|
|
311
|
+
if (!rootRef || !target) return;
|
|
312
|
+
if (!rootRef.contains(target)) close();
|
|
313
|
+
};
|
|
314
|
+
const handleKeyDown = (event) => {
|
|
315
|
+
if (event.key === "Escape") close();
|
|
316
|
+
};
|
|
317
|
+
document.addEventListener("mousedown", handlePointerDown);
|
|
318
|
+
window.addEventListener("keydown", handleKeyDown);
|
|
319
|
+
onCleanup(() => {
|
|
320
|
+
document.removeEventListener("mousedown", handlePointerDown);
|
|
321
|
+
window.removeEventListener("keydown", handleKeyDown);
|
|
322
|
+
});
|
|
323
|
+
});
|
|
324
|
+
return (() => {
|
|
325
|
+
var _el$ = _tmpl$24(), _el$2 = _el$.firstChild;
|
|
326
|
+
use((el) => rootRef = el, _el$);
|
|
327
|
+
_el$2.$$click = () => setOpen((value) => !value);
|
|
328
|
+
insert(_el$2, () => props.icon ?? _tmpl$34());
|
|
329
|
+
insert(_el$, createComponent(Show, {
|
|
330
|
+
get when() {
|
|
331
|
+
return renderMenu();
|
|
332
|
+
},
|
|
333
|
+
get children() {
|
|
334
|
+
var _el$3 = _tmpl$10();
|
|
335
|
+
insert(_el$3, createComponent(For, {
|
|
336
|
+
get each() {
|
|
337
|
+
return props.items;
|
|
338
|
+
},
|
|
339
|
+
children: (item) => (() => {
|
|
340
|
+
var _el$5 = _tmpl$43(), _el$6 = _el$5.firstChild, _el$7 = _el$6.nextSibling;
|
|
341
|
+
_el$5.$$click = async () => {
|
|
342
|
+
close();
|
|
343
|
+
await item.onclick?.();
|
|
344
|
+
};
|
|
345
|
+
insert(_el$6, () => item.icon);
|
|
346
|
+
insert(_el$7, () => item.label);
|
|
347
|
+
insert(_el$5, (() => {
|
|
348
|
+
var _c$ = memo(() => !!item.checked);
|
|
349
|
+
return () => _c$() && _tmpl$52();
|
|
350
|
+
})(), null);
|
|
351
|
+
effect((_p$) => {
|
|
352
|
+
var _v$5 = item.checked ? "menuitemcheckbox" : "menuitem", _v$6 = item.checked ? "true" : void 0;
|
|
353
|
+
_v$5 !== _p$.e && setAttribute(_el$5, "role", _p$.e = _v$5);
|
|
354
|
+
_v$6 !== _p$.t && setAttribute(_el$5, "aria-checked", _p$.t = _v$6);
|
|
355
|
+
return _p$;
|
|
356
|
+
}, {
|
|
357
|
+
e: void 0,
|
|
358
|
+
t: void 0
|
|
359
|
+
});
|
|
360
|
+
return _el$5;
|
|
361
|
+
})()
|
|
362
|
+
}));
|
|
363
|
+
effect(() => setAttribute(_el$3, "data-state", menuState()));
|
|
364
|
+
return _el$3;
|
|
365
|
+
}
|
|
366
|
+
}), null);
|
|
367
|
+
effect((_p$) => {
|
|
368
|
+
var _v$ = `ss_dropdown ${props.class ?? ""}`, _v$2 = props.style, _v$3 = open(), _v$4 = props.ariaLabel ?? "Aktionen \xF6ffnen";
|
|
369
|
+
_v$ !== _p$.e && className(_el$, _p$.e = _v$);
|
|
370
|
+
_p$.t = style(_el$, _v$2, _p$.t);
|
|
371
|
+
_v$3 !== _p$.a && setAttribute(_el$2, "aria-expanded", _p$.a = _v$3);
|
|
372
|
+
_v$4 !== _p$.o && setAttribute(_el$2, "aria-label", _p$.o = _v$4);
|
|
373
|
+
return _p$;
|
|
374
|
+
}, {
|
|
375
|
+
e: void 0,
|
|
376
|
+
t: void 0,
|
|
377
|
+
a: void 0,
|
|
378
|
+
o: void 0
|
|
379
|
+
});
|
|
380
|
+
return _el$;
|
|
381
|
+
})();
|
|
382
|
+
}
|
|
383
|
+
delegateEvents(["click"]);
|
|
384
|
+
var _tmpl$11 = /* @__PURE__ */ template(`<div><div class=ss_expandable__header role=button tabindex=0><span class=ss_expandable__icon aria-hidden=true></span><span class=ss_expandable__title></span></div><div class=ss_expandable__content style=transition-duration:200ms><div class=ss_expandable__divider_wrapper><div class=ss_expandable__divider>`);
|
|
385
|
+
var _tmpl$25 = /* @__PURE__ */ template(`<svg xmlns=http://www.w3.org/2000/svg width=24 height=24 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round class="icon icon-tabler icons-tabler-outline icon-tabler-chevron-down"><path stroke=none d="M0 0h24v24H0z"fill=none></path><path d="M6 9l6 6l6 -6">`);
|
|
386
|
+
var _tmpl$35 = /* @__PURE__ */ template(`<svg xmlns=http://www.w3.org/2000/svg width=24 height=24 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round class="icon icon-tabler icons-tabler-outline icon-tabler-chevron-right"><path stroke=none d="M0 0h24v24H0z"fill=none></path><path d="M9 6l6 6l-6 6">`);
|
|
387
|
+
var TRANSITION_MS = 200;
|
|
388
|
+
function SSExpandable(props) {
|
|
389
|
+
const [height, setHeight] = createSignal(props.initiallyExpanded ? "auto" : 0);
|
|
390
|
+
const isExpanded = createMemo(() => height() !== 0);
|
|
391
|
+
let contentRef;
|
|
392
|
+
let timeoutId;
|
|
393
|
+
const toggle = () => {
|
|
394
|
+
if (timeoutId) clearTimeout(timeoutId);
|
|
395
|
+
const targetHeight = contentRef?.scrollHeight ?? 0;
|
|
396
|
+
if (isExpanded()) {
|
|
397
|
+
setHeight(targetHeight);
|
|
398
|
+
timeoutId = window.setTimeout(() => setHeight(0), 1);
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
setHeight(targetHeight);
|
|
402
|
+
timeoutId = window.setTimeout(() => setHeight("auto"), TRANSITION_MS);
|
|
403
|
+
};
|
|
404
|
+
onCleanup(() => {
|
|
405
|
+
if (timeoutId) clearTimeout(timeoutId);
|
|
406
|
+
});
|
|
407
|
+
return (() => {
|
|
408
|
+
var _el$ = _tmpl$11(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$2.nextSibling, _el$6 = _el$5.firstChild; _el$6.firstChild;
|
|
409
|
+
_el$2.$$keydown = (event) => {
|
|
410
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
411
|
+
event.preventDefault();
|
|
412
|
+
toggle();
|
|
413
|
+
}
|
|
414
|
+
};
|
|
415
|
+
_el$2.$$click = toggle;
|
|
416
|
+
insert(_el$3, (() => {
|
|
417
|
+
var _c$ = memo(() => !!isExpanded());
|
|
418
|
+
return () => _c$() ? _tmpl$25() : _tmpl$35();
|
|
419
|
+
})());
|
|
420
|
+
insert(_el$4, () => props.title);
|
|
421
|
+
use((el) => contentRef = el, _el$5);
|
|
422
|
+
insert(_el$6, () => props.children, null);
|
|
423
|
+
effect((_p$) => {
|
|
424
|
+
var _v$ = `ss_expandable ${props.class ?? ""}`, _v$2 = props.style, _v$3 = isExpanded() ? "open" : "closed", _v$4 = isExpanded(), _v$5 = typeof height() === "number" ? `${height()}px` : height();
|
|
425
|
+
_v$ !== _p$.e && className(_el$, _p$.e = _v$);
|
|
426
|
+
_p$.t = style(_el$, _v$2, _p$.t);
|
|
427
|
+
_v$3 !== _p$.a && setAttribute(_el$, "data-state", _p$.a = _v$3);
|
|
428
|
+
_v$4 !== _p$.o && setAttribute(_el$2, "aria-expanded", _p$.o = _v$4);
|
|
429
|
+
_v$5 !== _p$.i && setStyleProperty(_el$5, "height", _p$.i = _v$5);
|
|
430
|
+
return _p$;
|
|
431
|
+
}, {
|
|
432
|
+
e: void 0,
|
|
433
|
+
t: void 0,
|
|
434
|
+
a: void 0,
|
|
435
|
+
o: void 0,
|
|
436
|
+
i: void 0
|
|
437
|
+
});
|
|
438
|
+
return _el$;
|
|
439
|
+
})();
|
|
440
|
+
}
|
|
441
|
+
delegateEvents(["click", "keydown"]);
|
|
442
|
+
function createLoading() {
|
|
443
|
+
const [loading, setLoading] = createSignal(false);
|
|
444
|
+
return [loading, async (callback) => {
|
|
445
|
+
if (loading()) return;
|
|
446
|
+
try {
|
|
447
|
+
setLoading(true);
|
|
448
|
+
await callback();
|
|
449
|
+
} finally {
|
|
450
|
+
setLoading(false);
|
|
451
|
+
}
|
|
452
|
+
}];
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
// src/components/SSForm.tsx
|
|
456
|
+
var _tmpl$12 = /* @__PURE__ */ template(`<form class=ss_form>`);
|
|
457
|
+
var _tmpl$26 = /* @__PURE__ */ template(`<div class=ss_form_input><label></label><div class=ss__wrapper>`);
|
|
458
|
+
var _tmpl$36 = /* @__PURE__ */ template(`<textarea>`);
|
|
459
|
+
var _tmpl$44 = /* @__PURE__ */ template(`<input>`);
|
|
460
|
+
var _tmpl$53 = /* @__PURE__ */ template(`<ul class=ss__suggestions>`);
|
|
461
|
+
var _tmpl$62 = /* @__PURE__ */ template(`<li>`);
|
|
462
|
+
var _tmpl$72 = /* @__PURE__ */ template(`<span role=alert>`);
|
|
463
|
+
var _tmpl$82 = /* @__PURE__ */ template(`<div class=ss_form_date><label></label><div class=ss__wrapper><input type=text inputmode=numeric autocomplete=off placeholder=TT.MM.JJJJ><button type=button class=ss_form_date__icon aria-label="Kalender \xF6ffnen"aria-haspopup=dialog><svg xmlns=http://www.w3.org/2000/svg width=24 height=24 viewBox="0 0 24 24"fill=currentColor class="icon icon-tabler icons-tabler-filled icon-tabler-calendar-week"><path stroke=none d="M0 0h24v24H0z"fill=none></path><path d="M16 2c.183 0 .355 .05 .502 .135l.033 .02c.28 .177 .465 .49 .465 .845v1h1a3 3 0 0 1 2.995 2.824l.005 .176v12a3 3 0 0 1 -2.824 2.995l-.176 .005h-12a3 3 0 0 1 -2.995 -2.824l-.005 -.176v-12a3 3 0 0 1 2.824 -2.995l.176 -.005h1v-1a1 1 0 0 1 .514 -.874l.093 -.046l.066 -.025l.1 -.029l.107 -.019l.12 -.007q .083 0 .161 .013l.122 .029l.04 .012l.06 .023c.328 .135 .568 .44 .61 .806l.007 .117v1h6v-1a1 1 0 0 1 1 -1m3 7h-14v9.625c0 .705 .386 1.286 .883 1.366l.117 .009h12c.513 0 .936 -.53 .993 -1.215l.007 -.16z"></path><path d="M9.015 13a1 1 0 0 1 -1 1a1.001 1.001 0 1 1 -.005 -2c.557 0 1.005 .448 1.005 1"></path><path d="M13.015 13a1 1 0 0 1 -1 1a1.001 1.001 0 1 1 -.005 -2c.557 0 1.005 .448 1.005 1"></path><path d="M17.02 13a1 1 0 0 1 -1 1a1.001 1.001 0 1 1 -.005 -2c.557 0 1.005 .448 1.005 1"></path><path d="M12.02 15a1 1 0 0 1 0 2a1.001 1.001 0 1 1 -.005 -2z"></path><path d="M9.015 16a1 1 0 0 1 -1 1a1.001 1.001 0 1 1 -.005 -2c.557 0 1.005 .448 1.005 1">`);
|
|
464
|
+
var _tmpl$92 = /* @__PURE__ */ template(`<div class=ss_form_date__picker role=dialog aria-label="Datum ausw\xE4hlen"><div class=ss_form_date__header><div class=ss_form_date__nav_group><button type=button class=ss_form_date__nav><svg xmlns=http://www.w3.org/2000/svg width=24 height=24 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round class="icon icon-tabler icons-tabler-outline icon-tabler-chevron-left-pipe"><path stroke=none d="M0 0h24v24H0z"fill=none></path><path d="M7 6v12"></path><path d="M18 6l-6 6l6 6"></path></svg></button><button type=button class=ss_form_date__nav><svg xmlns=http://www.w3.org/2000/svg width=24 height=24 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round class="icon icon-tabler icons-tabler-outline icon-tabler-chevron-left"><path stroke=none d="M0 0h24v24H0z"fill=none></path><path d="M15 6l-6 6l6 6"></path></svg></button></div><div class=ss_form_date__title></div><div class=ss_form_date__nav_group><button type=button class=ss_form_date__nav><svg xmlns=http://www.w3.org/2000/svg width=24 height=24 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round class="icon icon-tabler icons-tabler-outline icon-tabler-chevron-right"><path stroke=none d="M0 0h24v24H0z"fill=none></path><path d="M9 6l6 6l-6 6"></path></svg></button><button type=button class=ss_form_date__nav><svg xmlns=http://www.w3.org/2000/svg width=24 height=24 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round class="icon icon-tabler icons-tabler-outline icon-tabler-chevron-right-pipe"><path stroke=none d="M0 0h24v24H0z"fill=none></path><path d="M6 6l6 6l-6 6"></path><path d="M17 5v13"></path></svg></button></div></div><div class=ss_form_date__weekdays></div><div class=ss_form_date__grid>`);
|
|
465
|
+
var _tmpl$02 = /* @__PURE__ */ template(`<span>`);
|
|
466
|
+
var _tmpl$13 = /* @__PURE__ */ template(`<button type=button class=ss_form_date__day>`);
|
|
467
|
+
var _tmpl$102 = /* @__PURE__ */ template(`<span class="ss_form_date__day is-empty">`);
|
|
468
|
+
var _tmpl$112 = /* @__PURE__ */ template(`<div class=ss_form_checkbox><div class=ss__wrapper><input type=checkbox><label>`);
|
|
469
|
+
var _tmpl$122 = /* @__PURE__ */ template(`<div class=ss_form_select><label></label><div class=ss_form_select__field><select></select><span class=ss_form_select__icon aria-hidden=true><svg xmlns=http://www.w3.org/2000/svg width=24 height=24 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round class="icon icon-tabler icons-tabler-outline icon-tabler-chevron-down"><path stroke=none d="M0 0h24v24H0z"fill=none></path><path d="M6 9l6 6l6 -6">`);
|
|
470
|
+
var _tmpl$132 = /* @__PURE__ */ template(`<option>`);
|
|
471
|
+
var _tmpl$14 = /* @__PURE__ */ template(`<div class=ss_form_ac_select><label>`);
|
|
472
|
+
var _tmpl$15 = /* @__PURE__ */ template(`<div class=ss__selection><div class=ss__content></div><button type=button class=ss__clear aria-label="Auswahl entfernen">\xD7`);
|
|
473
|
+
var _tmpl$16 = /* @__PURE__ */ template(`<div class=ss__wrapper><div class=ss__input_row><input>`);
|
|
474
|
+
var _tmpl$17 = /* @__PURE__ */ template(`<span class=ss__prefix role=button>`);
|
|
475
|
+
var _tmpl$18 = /* @__PURE__ */ template(`<div>`);
|
|
476
|
+
var SSFormContext = createContext();
|
|
477
|
+
var SSForm = function(props) {
|
|
478
|
+
const [loading, process] = createLoading();
|
|
479
|
+
const fields = {};
|
|
480
|
+
const context = {
|
|
481
|
+
loading,
|
|
482
|
+
process: (action) => process(() => action(context)),
|
|
483
|
+
field: (name) => fields[name] ?? null,
|
|
484
|
+
setField: (name, field) => {
|
|
485
|
+
fields[name] = field;
|
|
486
|
+
},
|
|
487
|
+
delField: (name) => {
|
|
488
|
+
delete fields[name];
|
|
489
|
+
},
|
|
490
|
+
setValues: (values) => Object.entries(values).forEach(([name, value]) => fields[name]?.setValue(value)),
|
|
491
|
+
getValues: async () => {
|
|
492
|
+
const entries = Object.entries(fields);
|
|
493
|
+
const values = await Promise.all(entries.map(([, field]) => field.getValue()));
|
|
494
|
+
return Object.fromEntries(entries.map(([name], i) => [name, values[i]]));
|
|
495
|
+
},
|
|
496
|
+
validate: () => Promise.all(Object.values(fields).map((field) => field.validate())).then(),
|
|
497
|
+
hasError: () => Object.values(fields).some((field) => field.hasError()),
|
|
498
|
+
submit: () => process(async () => {
|
|
499
|
+
await context.validate();
|
|
500
|
+
if (context.hasError()) return;
|
|
501
|
+
await props.onsubmit?.(context);
|
|
502
|
+
})
|
|
503
|
+
};
|
|
504
|
+
return (() => {
|
|
505
|
+
var _el$ = _tmpl$12();
|
|
506
|
+
_el$.addEventListener("submit", (e) => {
|
|
507
|
+
e.preventDefault();
|
|
508
|
+
context.submit();
|
|
509
|
+
});
|
|
510
|
+
insert(_el$, createComponent(SSFormContext.Provider, {
|
|
511
|
+
value: context,
|
|
512
|
+
get children() {
|
|
513
|
+
return props.children;
|
|
514
|
+
}
|
|
515
|
+
}));
|
|
516
|
+
return _el$;
|
|
517
|
+
})();
|
|
518
|
+
};
|
|
519
|
+
SSForm.Input = function(props) {
|
|
520
|
+
const context = useContext(SSFormContext);
|
|
521
|
+
const [value, setValue] = createSignal("");
|
|
522
|
+
const [error, setError] = createSignal(null);
|
|
523
|
+
const field = {
|
|
524
|
+
getValue: () => {
|
|
525
|
+
const trimmed = value().trim();
|
|
526
|
+
if (!trimmed) return null;
|
|
527
|
+
return trimmed;
|
|
528
|
+
},
|
|
529
|
+
setValue: (value2) => {
|
|
530
|
+
if (typeof value2 === "number") {
|
|
531
|
+
setValue(value2.toLocaleString());
|
|
532
|
+
return;
|
|
533
|
+
}
|
|
534
|
+
setValue(`${value2}`);
|
|
535
|
+
},
|
|
536
|
+
hasError: () => !!error(),
|
|
537
|
+
validate: async () => {
|
|
538
|
+
const rules = [...props.rules ?? []];
|
|
539
|
+
if (props.required) rules.unshift(SSForm.rules.required);
|
|
540
|
+
const value2 = await field.getValue();
|
|
541
|
+
for (const rule of rules) {
|
|
542
|
+
const newError = await rule(value2);
|
|
543
|
+
if (newError) {
|
|
544
|
+
setError(newError);
|
|
545
|
+
return;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
setError(null);
|
|
549
|
+
}
|
|
550
|
+
};
|
|
551
|
+
if (props.name && context) {
|
|
552
|
+
const name = props.name;
|
|
553
|
+
onMount(() => context.setField(name, field));
|
|
554
|
+
onCleanup(() => context.delField(name));
|
|
555
|
+
}
|
|
556
|
+
let suggInitData = null;
|
|
557
|
+
const [suggItems, setSuggItems] = createSignal([]);
|
|
558
|
+
const [suggIndex, setSuggIndex] = createSignal(-1);
|
|
559
|
+
let suggListRef;
|
|
560
|
+
if (props.suggestions) {
|
|
561
|
+
const sugg = props.suggestions;
|
|
562
|
+
const [initialized, setInitialized] = createSignal(!sugg.prepare);
|
|
563
|
+
if (sugg.prepare) onMount(async () => {
|
|
564
|
+
if (!sugg.prepare) return;
|
|
565
|
+
suggInitData = await sugg.prepare();
|
|
566
|
+
setInitialized(true);
|
|
567
|
+
});
|
|
568
|
+
let timeout;
|
|
569
|
+
createEffect(() => {
|
|
570
|
+
clearTimeout(timeout ?? void 0);
|
|
571
|
+
if (!initialized()) return;
|
|
572
|
+
setSuggItems([]);
|
|
573
|
+
const query = value().trim().toLowerCase();
|
|
574
|
+
if (!query) return;
|
|
575
|
+
timeout = setTimeout(async () => {
|
|
576
|
+
const items = await sugg.getItems({
|
|
577
|
+
query,
|
|
578
|
+
init: suggInitData
|
|
579
|
+
});
|
|
580
|
+
setSuggItems(items);
|
|
581
|
+
}, 250);
|
|
582
|
+
});
|
|
583
|
+
onCleanup(() => clearTimeout(timeout ?? void 0));
|
|
584
|
+
}
|
|
585
|
+
createEffect(() => {
|
|
586
|
+
const items = suggItems();
|
|
587
|
+
if (!items.length) {
|
|
588
|
+
setSuggIndex(-1);
|
|
589
|
+
return;
|
|
590
|
+
}
|
|
591
|
+
if (suggIndex() >= items.length) setSuggIndex(items.length - 1);
|
|
592
|
+
});
|
|
593
|
+
const scrollToIndex = (idx) => {
|
|
594
|
+
const list = suggListRef;
|
|
595
|
+
if (!list || idx < 0) return;
|
|
596
|
+
const item = list.querySelectorAll("li")[idx];
|
|
597
|
+
if (!item) return;
|
|
598
|
+
const itemTop = item.offsetTop;
|
|
599
|
+
const itemBottom = itemTop + item.offsetHeight;
|
|
600
|
+
const viewTop = list.scrollTop;
|
|
601
|
+
const viewBottom = viewTop + list.clientHeight;
|
|
602
|
+
if (itemTop < viewTop) list.scrollTop = itemTop;
|
|
603
|
+
else if (itemBottom > viewBottom) list.scrollTop = itemBottom - list.clientHeight;
|
|
604
|
+
};
|
|
605
|
+
const moveIndex = (delta) => {
|
|
606
|
+
const items = suggItems();
|
|
607
|
+
if (!items.length) return;
|
|
608
|
+
const next = Math.max(-1, Math.min(suggIndex() + delta, items.length - 1));
|
|
609
|
+
setSuggIndex(next);
|
|
610
|
+
scrollToIndex(next);
|
|
611
|
+
};
|
|
612
|
+
const selectSuggestion = (item) => {
|
|
613
|
+
setValue(props.suggestions.stringify({
|
|
614
|
+
item,
|
|
615
|
+
init: suggInitData
|
|
616
|
+
}));
|
|
617
|
+
setSuggIndex(-1);
|
|
618
|
+
};
|
|
619
|
+
const handleKeyDown = (e) => {
|
|
620
|
+
if (!suggItems().length) return;
|
|
621
|
+
if (e.key === "ArrowDown") {
|
|
622
|
+
e.preventDefault();
|
|
623
|
+
moveIndex(1);
|
|
624
|
+
} else if (e.key === "ArrowUp") {
|
|
625
|
+
e.preventDefault();
|
|
626
|
+
moveIndex(-1);
|
|
627
|
+
} else if (e.key === "Enter" && suggIndex() >= 0) {
|
|
628
|
+
e.preventDefault();
|
|
629
|
+
const item = suggItems()[suggIndex()];
|
|
630
|
+
if (item) selectSuggestion(item);
|
|
631
|
+
} else if (e.key === "Escape") {
|
|
632
|
+
setSuggIndex(-1);
|
|
633
|
+
}
|
|
634
|
+
};
|
|
635
|
+
const handleInputChange = (next) => {
|
|
636
|
+
setValue(next);
|
|
637
|
+
setSuggIndex(-1);
|
|
638
|
+
};
|
|
639
|
+
const _id = createUniqueId();
|
|
640
|
+
return (() => {
|
|
641
|
+
var _el$2 = _tmpl$26(), _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling;
|
|
642
|
+
insert(_el$3, () => props.label);
|
|
643
|
+
insert(_el$4, (() => {
|
|
644
|
+
var _c$ = memo(() => !!props.textArea);
|
|
645
|
+
return () => _c$() ? (() => {
|
|
646
|
+
var _el$5 = _tmpl$36();
|
|
647
|
+
_el$5.$$keydown = handleKeyDown;
|
|
648
|
+
_el$5.$$input = (e) => handleInputChange(e.target.value);
|
|
649
|
+
effect((_p$) => {
|
|
650
|
+
var _v$ = props.id || _id, _v$2 = props.disabled || context?.loading();
|
|
651
|
+
_v$ !== _p$.e && setAttribute(_el$5, "id", _p$.e = _v$);
|
|
652
|
+
_v$2 !== _p$.t && (_el$5.disabled = _p$.t = _v$2);
|
|
653
|
+
return _p$;
|
|
654
|
+
}, {
|
|
655
|
+
e: void 0,
|
|
656
|
+
t: void 0
|
|
657
|
+
});
|
|
658
|
+
effect(() => _el$5.value = value());
|
|
659
|
+
return _el$5;
|
|
660
|
+
})() : (() => {
|
|
661
|
+
var _el$6 = _tmpl$44();
|
|
662
|
+
_el$6.$$keydown = handleKeyDown;
|
|
663
|
+
_el$6.$$input = (e) => handleInputChange(e.target.value);
|
|
664
|
+
effect((_p$) => {
|
|
665
|
+
var _v$3 = props.id || _id, _v$4 = props.disabled || context?.loading(), _v$5 = props.type;
|
|
666
|
+
_v$3 !== _p$.e && setAttribute(_el$6, "id", _p$.e = _v$3);
|
|
667
|
+
_v$4 !== _p$.t && (_el$6.disabled = _p$.t = _v$4);
|
|
668
|
+
_v$5 !== _p$.a && setAttribute(_el$6, "type", _p$.a = _v$5);
|
|
669
|
+
return _p$;
|
|
670
|
+
}, {
|
|
671
|
+
e: void 0,
|
|
672
|
+
t: void 0,
|
|
673
|
+
a: void 0
|
|
674
|
+
});
|
|
675
|
+
effect(() => _el$6.value = value());
|
|
676
|
+
return _el$6;
|
|
677
|
+
})();
|
|
678
|
+
})(), null);
|
|
679
|
+
insert(_el$4, (() => {
|
|
680
|
+
var _c$2 = memo(() => !!!!suggItems().length);
|
|
681
|
+
return () => _c$2() && (() => {
|
|
682
|
+
var _el$7 = _tmpl$53();
|
|
683
|
+
use((el) => suggListRef = el, _el$7);
|
|
684
|
+
insert(_el$7, createComponent(For, {
|
|
685
|
+
get each() {
|
|
686
|
+
return suggItems();
|
|
687
|
+
},
|
|
688
|
+
children: (item, idx) => {
|
|
689
|
+
const handleSelect = () => {
|
|
690
|
+
const active = document.activeElement;
|
|
691
|
+
if (active instanceof HTMLElement) active.blur();
|
|
692
|
+
selectSuggestion(item);
|
|
693
|
+
};
|
|
694
|
+
return (() => {
|
|
695
|
+
var _el$8 = _tmpl$62();
|
|
696
|
+
_el$8.$$click = handleSelect;
|
|
697
|
+
_el$8.$$pointerdown = (e) => e.preventDefault();
|
|
698
|
+
insert(_el$8, () => props.suggestions.stringify({
|
|
699
|
+
item,
|
|
700
|
+
init: suggInitData
|
|
701
|
+
}));
|
|
702
|
+
effect(() => _el$8.classList.toggle("ss__hovered", !!(idx() === suggIndex())));
|
|
703
|
+
return _el$8;
|
|
704
|
+
})();
|
|
705
|
+
}
|
|
706
|
+
}));
|
|
707
|
+
return _el$7;
|
|
708
|
+
})();
|
|
709
|
+
})(), null);
|
|
710
|
+
insert(_el$2, (() => {
|
|
711
|
+
var _c$3 = memo(() => !!!!error());
|
|
712
|
+
return () => _c$3() && (() => {
|
|
713
|
+
var _el$9 = _tmpl$72();
|
|
714
|
+
insert(_el$9, error);
|
|
715
|
+
return _el$9;
|
|
716
|
+
})();
|
|
717
|
+
})(), null);
|
|
718
|
+
effect(() => setAttribute(_el$3, "for", props.id || _id));
|
|
719
|
+
return _el$2;
|
|
720
|
+
})();
|
|
721
|
+
};
|
|
722
|
+
SSForm.Date = function(props) {
|
|
723
|
+
const context = useContext(SSFormContext);
|
|
724
|
+
const [value, setValue] = createSignal("");
|
|
725
|
+
const [error, setError] = createSignal(null);
|
|
726
|
+
const [open, setOpen] = createSignal(false);
|
|
727
|
+
const [viewDate, setViewDate] = createSignal(/* @__PURE__ */ new Date());
|
|
728
|
+
let containerRef;
|
|
729
|
+
const pad = (num) => `${num}`.padStart(2, "0");
|
|
730
|
+
const formatDate = (date) => {
|
|
731
|
+
const day = pad(date.getDate());
|
|
732
|
+
const month = pad(date.getMonth() + 1);
|
|
733
|
+
const year = date.getFullYear();
|
|
734
|
+
return `${day}.${month}.${year}`;
|
|
735
|
+
};
|
|
736
|
+
const parseDate = (input) => {
|
|
737
|
+
const trimmed = input.trim();
|
|
738
|
+
if (!trimmed) return null;
|
|
739
|
+
const match = /^(\d{1,2})\.(\d{1,2})\.(\d{4})$/.exec(trimmed);
|
|
740
|
+
if (!match) return null;
|
|
741
|
+
const day = Number(match[1]);
|
|
742
|
+
const month = Number(match[2]);
|
|
743
|
+
const year = Number(match[3]);
|
|
744
|
+
if (!day || !month) return null;
|
|
745
|
+
const date = new Date(year, month - 1, day);
|
|
746
|
+
if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) {
|
|
747
|
+
return null;
|
|
748
|
+
}
|
|
749
|
+
return date;
|
|
750
|
+
};
|
|
751
|
+
createEffect(() => {
|
|
752
|
+
if (!open()) return;
|
|
753
|
+
const parsed = parseDate(value());
|
|
754
|
+
setViewDate(parsed ?? /* @__PURE__ */ new Date());
|
|
755
|
+
});
|
|
756
|
+
const field = {
|
|
757
|
+
getValue: () => {
|
|
758
|
+
const trimmed = value().trim();
|
|
759
|
+
if (!trimmed) return null;
|
|
760
|
+
return trimmed;
|
|
761
|
+
},
|
|
762
|
+
setValue: (value2) => {
|
|
763
|
+
if (value2 instanceof Date) {
|
|
764
|
+
setValue(formatDate(value2));
|
|
765
|
+
return;
|
|
766
|
+
}
|
|
767
|
+
setValue(`${value2 ?? ""}`);
|
|
768
|
+
},
|
|
769
|
+
hasError: () => !!error(),
|
|
770
|
+
validate: async () => {
|
|
771
|
+
const rules = [...props.rules ?? []];
|
|
772
|
+
if (props.required) rules.unshift(SSForm.rules.required);
|
|
773
|
+
const value2 = await field.getValue();
|
|
774
|
+
for (const rule of rules) {
|
|
775
|
+
const newError = await rule(value2);
|
|
776
|
+
if (newError) {
|
|
777
|
+
setError(newError);
|
|
778
|
+
return;
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
if (value2 && !parseDate(value2)) {
|
|
782
|
+
setError("Ung\xFCltiges Datum");
|
|
783
|
+
return;
|
|
784
|
+
}
|
|
785
|
+
setError(null);
|
|
786
|
+
}
|
|
787
|
+
};
|
|
788
|
+
if (props.name && context) {
|
|
789
|
+
const name = props.name;
|
|
790
|
+
onMount(() => context.setField(name, field));
|
|
791
|
+
onCleanup(() => context.delField(name));
|
|
792
|
+
}
|
|
793
|
+
const _id = createUniqueId();
|
|
794
|
+
const isSelected = (day) => {
|
|
795
|
+
const parsed = parseDate(value());
|
|
796
|
+
if (!parsed) return false;
|
|
797
|
+
return parsed.getFullYear() === viewDate().getFullYear() && parsed.getMonth() === viewDate().getMonth() && parsed.getDate() === day;
|
|
798
|
+
};
|
|
799
|
+
const isToday = (day) => {
|
|
800
|
+
const today = /* @__PURE__ */ new Date();
|
|
801
|
+
return today.getFullYear() === viewDate().getFullYear() && today.getMonth() === viewDate().getMonth() && today.getDate() === day;
|
|
802
|
+
};
|
|
803
|
+
const buildCalendar = () => {
|
|
804
|
+
const current = viewDate();
|
|
805
|
+
const year = current.getFullYear();
|
|
806
|
+
const month = current.getMonth();
|
|
807
|
+
const firstDay = new Date(year, month, 1);
|
|
808
|
+
const daysInMonth = new Date(year, month + 1, 0).getDate();
|
|
809
|
+
const startOffset = (firstDay.getDay() + 6) % 7;
|
|
810
|
+
const cells = [];
|
|
811
|
+
for (let i = 0; i < startOffset; i += 1) cells.push(null);
|
|
812
|
+
for (let day = 1; day <= daysInMonth; day += 1) cells.push(day);
|
|
813
|
+
while (cells.length % 7 !== 0) cells.push(null);
|
|
814
|
+
return cells;
|
|
815
|
+
};
|
|
816
|
+
const monthLabel = () => {
|
|
817
|
+
return viewDate().toLocaleDateString("de-DE", {
|
|
818
|
+
month: "long",
|
|
819
|
+
year: "numeric"
|
|
820
|
+
});
|
|
821
|
+
};
|
|
822
|
+
const handleSelect = (day) => {
|
|
823
|
+
const next = new Date(viewDate().getFullYear(), viewDate().getMonth(), day);
|
|
824
|
+
setValue(formatDate(next));
|
|
825
|
+
setOpen(false);
|
|
826
|
+
};
|
|
827
|
+
onMount(() => {
|
|
828
|
+
const handleOutside = (event) => {
|
|
829
|
+
if (!open()) return;
|
|
830
|
+
const target = event.target;
|
|
831
|
+
if (containerRef && target && !containerRef.contains(target)) {
|
|
832
|
+
setOpen(false);
|
|
833
|
+
}
|
|
834
|
+
};
|
|
835
|
+
const handleKeyDown = (event) => {
|
|
836
|
+
if (event.key === "Escape") setOpen(false);
|
|
837
|
+
};
|
|
838
|
+
document.addEventListener("mousedown", handleOutside);
|
|
839
|
+
window.addEventListener("keydown", handleKeyDown);
|
|
840
|
+
onCleanup(() => {
|
|
841
|
+
document.removeEventListener("mousedown", handleOutside);
|
|
842
|
+
window.removeEventListener("keydown", handleKeyDown);
|
|
843
|
+
});
|
|
844
|
+
});
|
|
845
|
+
return (() => {
|
|
846
|
+
var _el$0 = _tmpl$82(), _el$1 = _el$0.firstChild, _el$10 = _el$1.nextSibling, _el$11 = _el$10.firstChild, _el$12 = _el$11.nextSibling;
|
|
847
|
+
use((el) => containerRef = el, _el$0);
|
|
848
|
+
insert(_el$1, () => props.label);
|
|
849
|
+
_el$11.addEventListener("focus", () => setOpen(true));
|
|
850
|
+
_el$11.$$input = (e) => setValue(e.target.value);
|
|
851
|
+
_el$12.$$click = () => setOpen((value2) => !value2);
|
|
852
|
+
insert(_el$0, (() => {
|
|
853
|
+
var _c$4 = memo(() => !!open());
|
|
854
|
+
return () => _c$4() && (() => {
|
|
855
|
+
var _el$13 = _tmpl$92(), _el$14 = _el$13.firstChild, _el$15 = _el$14.firstChild, _el$16 = _el$15.firstChild, _el$17 = _el$16.nextSibling, _el$18 = _el$15.nextSibling, _el$19 = _el$18.nextSibling, _el$20 = _el$19.firstChild, _el$21 = _el$20.nextSibling, _el$22 = _el$14.nextSibling, _el$23 = _el$22.nextSibling;
|
|
856
|
+
_el$16.$$click = () => {
|
|
857
|
+
const current = viewDate();
|
|
858
|
+
setViewDate(new Date(current.getFullYear() - 1, current.getMonth(), 1));
|
|
859
|
+
};
|
|
860
|
+
_el$17.$$click = () => {
|
|
861
|
+
const current = viewDate();
|
|
862
|
+
setViewDate(new Date(current.getFullYear(), current.getMonth() - 1, 1));
|
|
863
|
+
};
|
|
864
|
+
insert(_el$18, monthLabel);
|
|
865
|
+
_el$20.$$click = () => {
|
|
866
|
+
const current = viewDate();
|
|
867
|
+
setViewDate(new Date(current.getFullYear(), current.getMonth() + 1, 1));
|
|
868
|
+
};
|
|
869
|
+
_el$21.$$click = () => {
|
|
870
|
+
const current = viewDate();
|
|
871
|
+
setViewDate(new Date(current.getFullYear() + 1, current.getMonth(), 1));
|
|
872
|
+
};
|
|
873
|
+
insert(_el$22, () => ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"].map((day) => (() => {
|
|
874
|
+
var _el$24 = _tmpl$02();
|
|
875
|
+
insert(_el$24, day);
|
|
876
|
+
return _el$24;
|
|
877
|
+
})()));
|
|
878
|
+
insert(_el$23, () => buildCalendar().map((day) => day ? (() => {
|
|
879
|
+
var _el$25 = _tmpl$13();
|
|
880
|
+
_el$25.$$click = () => handleSelect(day);
|
|
881
|
+
insert(_el$25, day);
|
|
882
|
+
effect((_p$) => {
|
|
883
|
+
var _v$10 = !!isSelected(day), _v$11 = !!isToday(day);
|
|
884
|
+
_v$10 !== _p$.e && _el$25.classList.toggle("is-selected", _p$.e = _v$10);
|
|
885
|
+
_v$11 !== _p$.t && _el$25.classList.toggle("is-today", _p$.t = _v$11);
|
|
886
|
+
return _p$;
|
|
887
|
+
}, {
|
|
888
|
+
e: void 0,
|
|
889
|
+
t: void 0
|
|
890
|
+
});
|
|
891
|
+
return _el$25;
|
|
892
|
+
})() : _tmpl$102()));
|
|
893
|
+
return _el$13;
|
|
894
|
+
})();
|
|
895
|
+
})(), null);
|
|
896
|
+
insert(_el$0, (() => {
|
|
897
|
+
var _c$5 = memo(() => !!!!error());
|
|
898
|
+
return () => _c$5() && (() => {
|
|
899
|
+
var _el$27 = _tmpl$72();
|
|
900
|
+
insert(_el$27, error);
|
|
901
|
+
return _el$27;
|
|
902
|
+
})();
|
|
903
|
+
})(), null);
|
|
904
|
+
effect((_p$) => {
|
|
905
|
+
var _v$6 = props.id || _id, _v$7 = props.id || _id, _v$8 = props.disabled || context?.loading(), _v$9 = !props.editable, _v$0 = open(), _v$1 = props.disabled || context?.loading();
|
|
906
|
+
_v$6 !== _p$.e && setAttribute(_el$1, "for", _p$.e = _v$6);
|
|
907
|
+
_v$7 !== _p$.t && setAttribute(_el$11, "id", _p$.t = _v$7);
|
|
908
|
+
_v$8 !== _p$.a && (_el$11.disabled = _p$.a = _v$8);
|
|
909
|
+
_v$9 !== _p$.o && (_el$11.readOnly = _p$.o = _v$9);
|
|
910
|
+
_v$0 !== _p$.i && setAttribute(_el$12, "aria-expanded", _p$.i = _v$0);
|
|
911
|
+
_v$1 !== _p$.n && (_el$12.disabled = _p$.n = _v$1);
|
|
912
|
+
return _p$;
|
|
913
|
+
}, {
|
|
914
|
+
e: void 0,
|
|
915
|
+
t: void 0,
|
|
916
|
+
a: void 0,
|
|
917
|
+
o: void 0,
|
|
918
|
+
i: void 0,
|
|
919
|
+
n: void 0
|
|
920
|
+
});
|
|
921
|
+
effect(() => _el$11.value = value());
|
|
922
|
+
return _el$0;
|
|
923
|
+
})();
|
|
924
|
+
};
|
|
925
|
+
SSForm.Checkbox = function(props) {
|
|
926
|
+
const context = useContext(SSFormContext);
|
|
927
|
+
const [value, setValue] = createSignal(false);
|
|
928
|
+
const [error, setError] = createSignal(null);
|
|
929
|
+
const field = {
|
|
930
|
+
getValue: () => value(),
|
|
931
|
+
setValue: (value2) => setValue(!!value2),
|
|
932
|
+
hasError: () => !!error(),
|
|
933
|
+
validate: async () => {
|
|
934
|
+
const rules = [...props.rules ?? []];
|
|
935
|
+
if (props.required) rules.unshift(SSForm.rules.required);
|
|
936
|
+
const value2 = await field.getValue();
|
|
937
|
+
for (const rule of rules) {
|
|
938
|
+
const newError = await rule(value2);
|
|
939
|
+
if (newError) {
|
|
940
|
+
setError(newError);
|
|
941
|
+
return;
|
|
942
|
+
}
|
|
943
|
+
}
|
|
944
|
+
setError(null);
|
|
945
|
+
}
|
|
946
|
+
};
|
|
947
|
+
if (props.name && context) {
|
|
948
|
+
const name = props.name;
|
|
949
|
+
onMount(() => context.setField(name, field));
|
|
950
|
+
onCleanup(() => context.delField(name));
|
|
951
|
+
}
|
|
952
|
+
const _id = createUniqueId();
|
|
953
|
+
return (() => {
|
|
954
|
+
var _el$28 = _tmpl$112(), _el$29 = _el$28.firstChild, _el$30 = _el$29.firstChild, _el$31 = _el$30.nextSibling;
|
|
955
|
+
_el$30.addEventListener("change", (e) => setValue(e.target.checked));
|
|
956
|
+
insert(_el$31, () => props.label);
|
|
957
|
+
insert(_el$28, (() => {
|
|
958
|
+
var _c$6 = memo(() => !!!!error());
|
|
959
|
+
return () => _c$6() && (() => {
|
|
960
|
+
var _el$32 = _tmpl$72();
|
|
961
|
+
insert(_el$32, error);
|
|
962
|
+
return _el$32;
|
|
963
|
+
})();
|
|
964
|
+
})(), null);
|
|
965
|
+
effect((_p$) => {
|
|
966
|
+
var _v$12 = props.id || _id, _v$13 = props.disabled || context?.loading(), _v$14 = props.id || _id;
|
|
967
|
+
_v$12 !== _p$.e && setAttribute(_el$30, "id", _p$.e = _v$12);
|
|
968
|
+
_v$13 !== _p$.t && (_el$30.disabled = _p$.t = _v$13);
|
|
969
|
+
_v$14 !== _p$.a && setAttribute(_el$31, "for", _p$.a = _v$14);
|
|
970
|
+
return _p$;
|
|
971
|
+
}, {
|
|
972
|
+
e: void 0,
|
|
973
|
+
t: void 0,
|
|
974
|
+
a: void 0
|
|
975
|
+
});
|
|
976
|
+
effect(() => _el$30.checked = value());
|
|
977
|
+
return _el$28;
|
|
978
|
+
})();
|
|
979
|
+
};
|
|
980
|
+
SSForm.useContext = function() {
|
|
981
|
+
const context = useContext(SSFormContext);
|
|
982
|
+
if (!context) return null;
|
|
983
|
+
const {
|
|
984
|
+
setField,
|
|
985
|
+
delField,
|
|
986
|
+
...publicContext
|
|
987
|
+
} = context;
|
|
988
|
+
return publicContext;
|
|
989
|
+
};
|
|
990
|
+
SSForm.Select = function(props) {
|
|
991
|
+
const context = useContext(SSFormContext);
|
|
992
|
+
const [options, setOptions] = createSignal([]);
|
|
993
|
+
const [value, setValue] = createSignal(null);
|
|
994
|
+
const [error, setError] = createSignal(null);
|
|
995
|
+
const handleSetOptions = (result) => {
|
|
996
|
+
const built = result.map((opt) => ({
|
|
997
|
+
id: opt.id,
|
|
998
|
+
label: props.buildOption(opt)
|
|
999
|
+
}));
|
|
1000
|
+
setOptions(built);
|
|
1001
|
+
if (!result.length) {
|
|
1002
|
+
setValue(null);
|
|
1003
|
+
return;
|
|
1004
|
+
}
|
|
1005
|
+
if (value() && built.some((e) => e.id === value())) return;
|
|
1006
|
+
setValue(built[0].id);
|
|
1007
|
+
};
|
|
1008
|
+
createEffect(() => {
|
|
1009
|
+
const newOptions = props.getOptions();
|
|
1010
|
+
if ("then" in newOptions && typeof newOptions.then === "function" || newOptions instanceof Promise) {
|
|
1011
|
+
newOptions.then(handleSetOptions);
|
|
1012
|
+
} else {
|
|
1013
|
+
handleSetOptions(newOptions);
|
|
1014
|
+
}
|
|
1015
|
+
});
|
|
1016
|
+
const field = {
|
|
1017
|
+
getValue: () => {
|
|
1018
|
+
const _value = value();
|
|
1019
|
+
const availableOptions = options();
|
|
1020
|
+
if (!availableOptions.some((e) => e.id === _value)) {
|
|
1021
|
+
return null;
|
|
1022
|
+
}
|
|
1023
|
+
return _value;
|
|
1024
|
+
},
|
|
1025
|
+
setValue: (newValue) => {
|
|
1026
|
+
const availableOptions = options();
|
|
1027
|
+
if (!availableOptions.length) {
|
|
1028
|
+
setValue(null);
|
|
1029
|
+
return;
|
|
1030
|
+
}
|
|
1031
|
+
const defaultOption = availableOptions[0].id;
|
|
1032
|
+
if (typeof newValue !== "string") {
|
|
1033
|
+
setValue(defaultOption);
|
|
1034
|
+
return;
|
|
1035
|
+
}
|
|
1036
|
+
const _newValue = newValue.trim();
|
|
1037
|
+
if (!availableOptions.some((e) => e.id === _newValue)) {
|
|
1038
|
+
setValue(defaultOption);
|
|
1039
|
+
return;
|
|
1040
|
+
}
|
|
1041
|
+
setValue(_newValue);
|
|
1042
|
+
},
|
|
1043
|
+
hasError: () => !!error(),
|
|
1044
|
+
validate: async () => {
|
|
1045
|
+
const availableOptions = options();
|
|
1046
|
+
const value2 = await field.getValue();
|
|
1047
|
+
if (!value2) {
|
|
1048
|
+
setError("Pflichtfeld");
|
|
1049
|
+
return;
|
|
1050
|
+
}
|
|
1051
|
+
if (!availableOptions.some((e) => e.id === value2)) {
|
|
1052
|
+
setError("Option nicht verf\xFCgbar");
|
|
1053
|
+
return;
|
|
1054
|
+
}
|
|
1055
|
+
for (const rule of props.rules ?? []) {
|
|
1056
|
+
const err = await rule(value2);
|
|
1057
|
+
if (err) {
|
|
1058
|
+
setError(err);
|
|
1059
|
+
return;
|
|
1060
|
+
}
|
|
1061
|
+
}
|
|
1062
|
+
setError(null);
|
|
1063
|
+
}
|
|
1064
|
+
};
|
|
1065
|
+
field.setOptions = handleSetOptions;
|
|
1066
|
+
if (props.name && context) {
|
|
1067
|
+
const name = props.name;
|
|
1068
|
+
onMount(() => context.setField(name, field));
|
|
1069
|
+
onCleanup(() => context.delField(name));
|
|
1070
|
+
}
|
|
1071
|
+
const _id = createUniqueId();
|
|
1072
|
+
return (() => {
|
|
1073
|
+
var _el$33 = _tmpl$122(), _el$34 = _el$33.firstChild, _el$35 = _el$34.nextSibling, _el$36 = _el$35.firstChild;
|
|
1074
|
+
insert(_el$34, () => props.label);
|
|
1075
|
+
_el$36.addEventListener("change", (e) => setValue(e.target.value));
|
|
1076
|
+
insert(_el$36, createComponent(For, {
|
|
1077
|
+
get each() {
|
|
1078
|
+
return options();
|
|
1079
|
+
},
|
|
1080
|
+
children: (opt) => (() => {
|
|
1081
|
+
var _el$37 = _tmpl$132();
|
|
1082
|
+
insert(_el$37, () => opt.label);
|
|
1083
|
+
effect(() => _el$37.selected = value() === opt.id);
|
|
1084
|
+
effect(() => _el$37.value = opt.id);
|
|
1085
|
+
return _el$37;
|
|
1086
|
+
})()
|
|
1087
|
+
}));
|
|
1088
|
+
insert(_el$33, (() => {
|
|
1089
|
+
var _c$7 = memo(() => !!!!error());
|
|
1090
|
+
return () => _c$7() && (() => {
|
|
1091
|
+
var _el$38 = _tmpl$72();
|
|
1092
|
+
insert(_el$38, error);
|
|
1093
|
+
return _el$38;
|
|
1094
|
+
})();
|
|
1095
|
+
})(), null);
|
|
1096
|
+
effect((_p$) => {
|
|
1097
|
+
var _v$15 = props.id || _id, _v$16 = props.id || _id, _v$17 = props.disabled || context?.loading();
|
|
1098
|
+
_v$15 !== _p$.e && setAttribute(_el$34, "for", _p$.e = _v$15);
|
|
1099
|
+
_v$16 !== _p$.t && setAttribute(_el$36, "id", _p$.t = _v$16);
|
|
1100
|
+
_v$17 !== _p$.a && (_el$36.disabled = _p$.a = _v$17);
|
|
1101
|
+
return _p$;
|
|
1102
|
+
}, {
|
|
1103
|
+
e: void 0,
|
|
1104
|
+
t: void 0,
|
|
1105
|
+
a: void 0
|
|
1106
|
+
});
|
|
1107
|
+
return _el$33;
|
|
1108
|
+
})();
|
|
1109
|
+
};
|
|
1110
|
+
SSForm.ACSelect = function(props) {
|
|
1111
|
+
const context = useContext(SSFormContext);
|
|
1112
|
+
const [query, setQuery] = createSignal("");
|
|
1113
|
+
const [value, setValue] = createSignal([]);
|
|
1114
|
+
const [error, setError] = createSignal(null);
|
|
1115
|
+
const field = {
|
|
1116
|
+
getValue: () => value(),
|
|
1117
|
+
setValue: (newValue) => setValue(newValue),
|
|
1118
|
+
hasError: () => !!error(),
|
|
1119
|
+
validate: async () => {
|
|
1120
|
+
const value2 = await field.getValue();
|
|
1121
|
+
const min = props.minSelectedItems;
|
|
1122
|
+
const max = props.maxSelectedItems;
|
|
1123
|
+
if (min) {
|
|
1124
|
+
if (value2.length < min) {
|
|
1125
|
+
setError(`Mindestens ${min} ${min > 1 ? "Elemente m\xFCssen" : "Element muss"} ausgew\xE4hlt werden`);
|
|
1126
|
+
return;
|
|
1127
|
+
}
|
|
1128
|
+
}
|
|
1129
|
+
if (max) {
|
|
1130
|
+
if (value2.length > max) {
|
|
1131
|
+
setError(`Maximal ${max} ${max > 1 ? "Elemente d\xFCrfen" : "Element darf"} ausgew\xE4hlt werden`);
|
|
1132
|
+
return;
|
|
1133
|
+
}
|
|
1134
|
+
}
|
|
1135
|
+
for (const rule of props.rules ?? []) {
|
|
1136
|
+
const err = await rule(value2);
|
|
1137
|
+
if (err) {
|
|
1138
|
+
setError(err);
|
|
1139
|
+
return;
|
|
1140
|
+
}
|
|
1141
|
+
}
|
|
1142
|
+
setError(null);
|
|
1143
|
+
}
|
|
1144
|
+
};
|
|
1145
|
+
if (props.name && context) {
|
|
1146
|
+
const name = props.name;
|
|
1147
|
+
onMount(() => context.setField(name, field));
|
|
1148
|
+
onCleanup(() => context.delField(name));
|
|
1149
|
+
}
|
|
1150
|
+
let initData = null;
|
|
1151
|
+
const [initialized, setInitialized] = createSignal(!props.prepare);
|
|
1152
|
+
if (props.prepare) onMount(async () => {
|
|
1153
|
+
if (!props.prepare) return;
|
|
1154
|
+
initData = await props.prepare();
|
|
1155
|
+
setInitialized(true);
|
|
1156
|
+
});
|
|
1157
|
+
const [suggItems, setSuggItems] = createSignal([]);
|
|
1158
|
+
const [suggIndex, setSuggIndex] = createSignal(-1);
|
|
1159
|
+
let suggListRef;
|
|
1160
|
+
let timeout;
|
|
1161
|
+
createEffect(() => {
|
|
1162
|
+
if (!initialized()) return;
|
|
1163
|
+
clearTimeout(timeout);
|
|
1164
|
+
const _query = query().trim().toLowerCase();
|
|
1165
|
+
if (!_query) {
|
|
1166
|
+
setSuggItems(untrack(() => value()));
|
|
1167
|
+
return;
|
|
1168
|
+
}
|
|
1169
|
+
setSuggItems([]);
|
|
1170
|
+
timeout = setTimeout(async () => {
|
|
1171
|
+
const items = await props.getOptions({
|
|
1172
|
+
query: _query,
|
|
1173
|
+
init: initData
|
|
1174
|
+
});
|
|
1175
|
+
setSuggItems(items);
|
|
1176
|
+
}, 250);
|
|
1177
|
+
});
|
|
1178
|
+
createEffect(() => {
|
|
1179
|
+
const _query = query().trim().toLowerCase();
|
|
1180
|
+
if (_query) return;
|
|
1181
|
+
if (suggItems().length !== value().length) setSuggItems(value());
|
|
1182
|
+
});
|
|
1183
|
+
onCleanup(() => clearTimeout(timeout));
|
|
1184
|
+
createEffect(() => {
|
|
1185
|
+
const items = suggItems();
|
|
1186
|
+
if (!items.length) {
|
|
1187
|
+
setSuggIndex(-1);
|
|
1188
|
+
return;
|
|
1189
|
+
}
|
|
1190
|
+
if (suggIndex() >= items.length) setSuggIndex(items.length - 1);
|
|
1191
|
+
});
|
|
1192
|
+
const scrollToIndex = (idx) => {
|
|
1193
|
+
const list = suggListRef;
|
|
1194
|
+
if (!list || idx < 0) return;
|
|
1195
|
+
const item = list.querySelectorAll("li")[idx];
|
|
1196
|
+
if (!item) return;
|
|
1197
|
+
const itemTop = item.offsetTop;
|
|
1198
|
+
const itemBottom = itemTop + item.offsetHeight;
|
|
1199
|
+
const viewTop = list.scrollTop;
|
|
1200
|
+
const viewBottom = viewTop + list.clientHeight;
|
|
1201
|
+
if (itemTop < viewTop) list.scrollTop = itemTop;
|
|
1202
|
+
else if (itemBottom > viewBottom) list.scrollTop = itemBottom - list.clientHeight;
|
|
1203
|
+
};
|
|
1204
|
+
const moveIndex = (delta) => {
|
|
1205
|
+
const items = suggItems();
|
|
1206
|
+
if (!items.length) return;
|
|
1207
|
+
const next = Math.max(-1, Math.min(suggIndex() + delta, items.length - 1));
|
|
1208
|
+
setSuggIndex(next);
|
|
1209
|
+
scrollToIndex(next);
|
|
1210
|
+
};
|
|
1211
|
+
const _id = createUniqueId();
|
|
1212
|
+
const selectedIds = createMemo(() => {
|
|
1213
|
+
return new Set(value().map(({
|
|
1214
|
+
id
|
|
1215
|
+
}) => id));
|
|
1216
|
+
});
|
|
1217
|
+
const selectItem = (item, resetIndex = true) => {
|
|
1218
|
+
const isSelected = selectedIds().has(item.id);
|
|
1219
|
+
if (props.maxSelectedItems === 1) {
|
|
1220
|
+
setValue(isSelected ? [] : [item]);
|
|
1221
|
+
setQuery("");
|
|
1222
|
+
if (resetIndex) setSuggIndex(-1);
|
|
1223
|
+
return;
|
|
1224
|
+
}
|
|
1225
|
+
if (isSelected) {
|
|
1226
|
+
setValue((value2) => value2.filter(({
|
|
1227
|
+
id
|
|
1228
|
+
}) => id !== item.id));
|
|
1229
|
+
} else {
|
|
1230
|
+
setValue((value2) => [...value2.filter(({
|
|
1231
|
+
id
|
|
1232
|
+
}) => id !== item.id), item]);
|
|
1233
|
+
}
|
|
1234
|
+
if (resetIndex) setSuggIndex(-1);
|
|
1235
|
+
};
|
|
1236
|
+
const handleKeyDown = (e) => {
|
|
1237
|
+
if (!suggItems().length) return;
|
|
1238
|
+
if (e.key === "ArrowDown") {
|
|
1239
|
+
e.preventDefault();
|
|
1240
|
+
moveIndex(1);
|
|
1241
|
+
} else if (e.key === "ArrowUp") {
|
|
1242
|
+
e.preventDefault();
|
|
1243
|
+
moveIndex(-1);
|
|
1244
|
+
} else if (e.key === "Enter" && suggIndex() >= 0) {
|
|
1245
|
+
e.preventDefault();
|
|
1246
|
+
const item = suggItems()[suggIndex()];
|
|
1247
|
+
if (item) selectItem(item, false);
|
|
1248
|
+
} else if (e.key === "Escape") {
|
|
1249
|
+
setSuggIndex(-1);
|
|
1250
|
+
}
|
|
1251
|
+
};
|
|
1252
|
+
const isDisabled = () => props.disabled || context?.loading();
|
|
1253
|
+
return (() => {
|
|
1254
|
+
var _el$39 = _tmpl$14(), _el$40 = _el$39.firstChild;
|
|
1255
|
+
insert(_el$40, () => props.label);
|
|
1256
|
+
insert(_el$39, (() => {
|
|
1257
|
+
var _c$8 = memo(() => !!(props.maxSelectedItems === 1 && !!props.renderSelection && value().length === 1));
|
|
1258
|
+
return () => _c$8() ? (() => {
|
|
1259
|
+
var _el$41 = _tmpl$15(), _el$42 = _el$41.firstChild, _el$43 = _el$42.nextSibling;
|
|
1260
|
+
insert(_el$42, () => props.renderSelection({
|
|
1261
|
+
item: value()[0],
|
|
1262
|
+
init: initData
|
|
1263
|
+
}));
|
|
1264
|
+
_el$43.$$click = () => {
|
|
1265
|
+
setValue([]);
|
|
1266
|
+
setQuery("");
|
|
1267
|
+
setTimeout(() => document.getElementById(props.id || _id)?.focus(), 0);
|
|
1268
|
+
};
|
|
1269
|
+
effect(() => _el$43.disabled = isDisabled());
|
|
1270
|
+
return _el$41;
|
|
1271
|
+
})() : (() => {
|
|
1272
|
+
var _el$44 = _tmpl$16(), _el$45 = _el$44.firstChild, _el$46 = _el$45.firstChild;
|
|
1273
|
+
insert(_el$45, (() => {
|
|
1274
|
+
var _c$0 = memo(() => !!!!value().length);
|
|
1275
|
+
return () => _c$0() && (() => {
|
|
1276
|
+
var _el$47 = _tmpl$17();
|
|
1277
|
+
_el$47.$$click = () => {
|
|
1278
|
+
if (isDisabled()) return;
|
|
1279
|
+
setValue([]);
|
|
1280
|
+
};
|
|
1281
|
+
_el$47.$$keydown = (event) => {
|
|
1282
|
+
if (isDisabled()) return;
|
|
1283
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
1284
|
+
event.preventDefault();
|
|
1285
|
+
setValue([]);
|
|
1286
|
+
}
|
|
1287
|
+
};
|
|
1288
|
+
insert(_el$47, () => value().length);
|
|
1289
|
+
effect((_p$) => {
|
|
1290
|
+
var _v$20 = isDisabled() ? -1 : 0, _v$21 = isDisabled() ? "true" : void 0;
|
|
1291
|
+
_v$20 !== _p$.e && setAttribute(_el$47, "tabindex", _p$.e = _v$20);
|
|
1292
|
+
_v$21 !== _p$.t && setAttribute(_el$47, "aria-disabled", _p$.t = _v$21);
|
|
1293
|
+
return _p$;
|
|
1294
|
+
}, {
|
|
1295
|
+
e: void 0,
|
|
1296
|
+
t: void 0
|
|
1297
|
+
});
|
|
1298
|
+
return _el$47;
|
|
1299
|
+
})();
|
|
1300
|
+
})(), _el$46);
|
|
1301
|
+
_el$46.$$keydown = handleKeyDown;
|
|
1302
|
+
_el$46.$$input = (e) => {
|
|
1303
|
+
if (isDisabled()) return;
|
|
1304
|
+
setQuery(e.target.value);
|
|
1305
|
+
setSuggIndex(-1);
|
|
1306
|
+
};
|
|
1307
|
+
insert(_el$44, (() => {
|
|
1308
|
+
var _c$1 = memo(() => !!!!suggItems().length);
|
|
1309
|
+
return () => _c$1() && (() => {
|
|
1310
|
+
var _el$48 = _tmpl$53();
|
|
1311
|
+
use((el) => suggListRef = el, _el$48);
|
|
1312
|
+
insert(_el$48, createComponent(For, {
|
|
1313
|
+
get each() {
|
|
1314
|
+
return suggItems();
|
|
1315
|
+
},
|
|
1316
|
+
children: (item, idx) => {
|
|
1317
|
+
const handleSelect = () => {
|
|
1318
|
+
if (isDisabled()) return;
|
|
1319
|
+
selectItem(item);
|
|
1320
|
+
document.getElementById(props.id || _id)?.focus();
|
|
1321
|
+
};
|
|
1322
|
+
return (() => {
|
|
1323
|
+
var _el$49 = _tmpl$62();
|
|
1324
|
+
_el$49.$$click = handleSelect;
|
|
1325
|
+
_el$49.$$pointerdown = (e) => e.preventDefault();
|
|
1326
|
+
insert(_el$49, () => props.renderItem({
|
|
1327
|
+
item,
|
|
1328
|
+
init: initData
|
|
1329
|
+
}));
|
|
1330
|
+
effect((_p$) => {
|
|
1331
|
+
var _v$22 = !!selectedIds().has(item.id), _v$23 = !!(idx() === suggIndex());
|
|
1332
|
+
_v$22 !== _p$.e && _el$49.classList.toggle("ss__selected", _p$.e = _v$22);
|
|
1333
|
+
_v$23 !== _p$.t && _el$49.classList.toggle("ss__hovered", _p$.t = _v$23);
|
|
1334
|
+
return _p$;
|
|
1335
|
+
}, {
|
|
1336
|
+
e: void 0,
|
|
1337
|
+
t: void 0
|
|
1338
|
+
});
|
|
1339
|
+
return _el$49;
|
|
1340
|
+
})();
|
|
1341
|
+
}
|
|
1342
|
+
}));
|
|
1343
|
+
return _el$48;
|
|
1344
|
+
})();
|
|
1345
|
+
})(), null);
|
|
1346
|
+
effect((_p$) => {
|
|
1347
|
+
var _v$18 = props.id || _id, _v$19 = isDisabled();
|
|
1348
|
+
_v$18 !== _p$.e && setAttribute(_el$46, "id", _p$.e = _v$18);
|
|
1349
|
+
_v$19 !== _p$.t && (_el$46.disabled = _p$.t = _v$19);
|
|
1350
|
+
return _p$;
|
|
1351
|
+
}, {
|
|
1352
|
+
e: void 0,
|
|
1353
|
+
t: void 0
|
|
1354
|
+
});
|
|
1355
|
+
effect(() => _el$46.value = query());
|
|
1356
|
+
return _el$44;
|
|
1357
|
+
})();
|
|
1358
|
+
})(), null);
|
|
1359
|
+
insert(_el$39, (() => {
|
|
1360
|
+
var _c$9 = memo(() => !!!!error());
|
|
1361
|
+
return () => _c$9() && (() => {
|
|
1362
|
+
var _el$50 = _tmpl$72();
|
|
1363
|
+
insert(_el$50, error);
|
|
1364
|
+
return _el$50;
|
|
1365
|
+
})();
|
|
1366
|
+
})(), null);
|
|
1367
|
+
effect(() => setAttribute(_el$40, "for", props.id || _id));
|
|
1368
|
+
return _el$39;
|
|
1369
|
+
})();
|
|
1370
|
+
};
|
|
1371
|
+
SSForm.SubmitButton = function(props) {
|
|
1372
|
+
const context = useContext(SSFormContext);
|
|
1373
|
+
return (() => {
|
|
1374
|
+
var _el$51 = _tmpl$18();
|
|
1375
|
+
insert(_el$51, createComponent(SSButton, {
|
|
1376
|
+
type: "submit",
|
|
1377
|
+
"class": "ss_form_submit",
|
|
1378
|
+
get disabled() {
|
|
1379
|
+
return props.disabled || context?.loading();
|
|
1380
|
+
},
|
|
1381
|
+
get children() {
|
|
1382
|
+
return props.children;
|
|
1383
|
+
}
|
|
1384
|
+
}));
|
|
1385
|
+
return _el$51;
|
|
1386
|
+
})();
|
|
1387
|
+
};
|
|
1388
|
+
SSForm.rules = {
|
|
1389
|
+
required: (value) => !value ? "Pflichtfeld" : null,
|
|
1390
|
+
minLength: (length) => (value) => {
|
|
1391
|
+
if (value === null) value = "";
|
|
1392
|
+
if (typeof value !== "string") {
|
|
1393
|
+
throw new Error(`invalid rule minLength(..) for non-string value ${value}`);
|
|
1394
|
+
}
|
|
1395
|
+
if (value.length < length) return `Mindestens ${length} Zeichen`;
|
|
1396
|
+
return null;
|
|
1397
|
+
},
|
|
1398
|
+
maxLength: (length) => (value) => {
|
|
1399
|
+
if (value === null) value = "";
|
|
1400
|
+
if (typeof value !== "string") {
|
|
1401
|
+
throw new Error(`invalid rule maxLength(..) for non-string value ${value}`);
|
|
1402
|
+
}
|
|
1403
|
+
if (value.length < length) return `Maximal ${length} Zeichen`;
|
|
1404
|
+
return null;
|
|
1405
|
+
},
|
|
1406
|
+
pattern: (pattern) => (value) => {
|
|
1407
|
+
if (value === null) value = "";
|
|
1408
|
+
if (typeof value !== "string") {
|
|
1409
|
+
throw new Error(`invalid rule pattern(..) for non-string value ${value}`);
|
|
1410
|
+
}
|
|
1411
|
+
if (!pattern.test(value)) return "Eingabe widerspricht erwartetem Muster";
|
|
1412
|
+
return null;
|
|
1413
|
+
}
|
|
1414
|
+
};
|
|
1415
|
+
delegateEvents(["input", "keydown", "pointerdown", "click"]);
|
|
1416
|
+
var _tmpl$19 = /* @__PURE__ */ template(`<div><div class=ss_header__text><h3 class=ss_header__title></h3></div><div class=ss_header__actions>`);
|
|
1417
|
+
var _tmpl$27 = /* @__PURE__ */ template(`<h5 class=ss_header__subtitle>`);
|
|
1418
|
+
function SSHeader(props) {
|
|
1419
|
+
return (() => {
|
|
1420
|
+
var _el$ = _tmpl$19(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$2.nextSibling;
|
|
1421
|
+
insert(_el$3, () => props.title);
|
|
1422
|
+
insert(_el$2, (() => {
|
|
1423
|
+
var _c$ = memo(() => !!props.subtitle);
|
|
1424
|
+
return () => _c$() && (() => {
|
|
1425
|
+
var _el$5 = _tmpl$27();
|
|
1426
|
+
insert(_el$5, () => props.subtitle);
|
|
1427
|
+
return _el$5;
|
|
1428
|
+
})();
|
|
1429
|
+
})(), null);
|
|
1430
|
+
insert(_el$4, () => props.actions);
|
|
1431
|
+
effect((_p$) => {
|
|
1432
|
+
var _v$ = `ss_header ${props.class ?? ""}`, _v$2 = props.style;
|
|
1433
|
+
_v$ !== _p$.e && className(_el$, _p$.e = _v$);
|
|
1434
|
+
_p$.t = style(_el$, _v$2, _p$.t);
|
|
1435
|
+
return _p$;
|
|
1436
|
+
}, {
|
|
1437
|
+
e: void 0,
|
|
1438
|
+
t: void 0
|
|
1439
|
+
});
|
|
1440
|
+
return _el$;
|
|
1441
|
+
})();
|
|
1442
|
+
}
|
|
1443
|
+
var _tmpl$20 = /* @__PURE__ */ template(`<div class=ss_modal__footer>`);
|
|
1444
|
+
var _tmpl$28 = /* @__PURE__ */ template(`<div class=ss_modal><div class=ss_modal__backdrop></div><div class=ss_modal__panel role=dialog aria-modal=true tabindex=-1><div class=ss_modal__body><div class=ss_modal__body_inner>`);
|
|
1445
|
+
var _tmpl$37 = /* @__PURE__ */ template(`<svg xmlns=http://www.w3.org/2000/svg width=24 height=24 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round class="icon icon-tabler icons-tabler-outline icon-tabler-x"><path stroke=none d="M0 0h24v24H0z"fill=none></path><path d="M18 6l-12 12"></path><path d="M6 6l12 12">`);
|
|
1446
|
+
var _tmpl$45 = /* @__PURE__ */ template(`<div class=ss_modal__header>`);
|
|
1447
|
+
var _tmpl$54 = /* @__PURE__ */ template(`<h2 class=ss_modal__title>`);
|
|
1448
|
+
var CLOSE_ANIMATION_MS = 180;
|
|
1449
|
+
function SSModal(props) {
|
|
1450
|
+
const [isMounted, setIsMounted] = createSignal(props.open);
|
|
1451
|
+
const [state, setState] = createSignal("closed");
|
|
1452
|
+
const titleId = createUniqueId();
|
|
1453
|
+
let closeTimeout;
|
|
1454
|
+
let rafId;
|
|
1455
|
+
let panelRef;
|
|
1456
|
+
createEffect(() => {
|
|
1457
|
+
if (closeTimeout) clearTimeout(closeTimeout);
|
|
1458
|
+
if (rafId) cancelAnimationFrame(rafId);
|
|
1459
|
+
if (props.open) {
|
|
1460
|
+
if (!isMounted()) setIsMounted(true);
|
|
1461
|
+
setState("closed");
|
|
1462
|
+
rafId = requestAnimationFrame(() => setState("open"));
|
|
1463
|
+
} else {
|
|
1464
|
+
setState("closed");
|
|
1465
|
+
if (isMounted()) {
|
|
1466
|
+
closeTimeout = window.setTimeout(() => setIsMounted(false), CLOSE_ANIMATION_MS);
|
|
1467
|
+
}
|
|
1468
|
+
}
|
|
1469
|
+
});
|
|
1470
|
+
onMount(() => {
|
|
1471
|
+
if (!props.open) return;
|
|
1472
|
+
if (props.lockScroll !== false) {
|
|
1473
|
+
const prev = document.body.style.overflowY;
|
|
1474
|
+
document.body.style.overflowY = "hidden";
|
|
1475
|
+
onCleanup(() => {
|
|
1476
|
+
document.body.style.overflowY = prev;
|
|
1477
|
+
});
|
|
1478
|
+
}
|
|
1479
|
+
rafId = requestAnimationFrame(() => panelRef?.focus());
|
|
1480
|
+
const handleKeyDown = (event) => {
|
|
1481
|
+
if (event.key === "Escape" && props.dismissible !== false) {
|
|
1482
|
+
props.onClose?.();
|
|
1483
|
+
}
|
|
1484
|
+
};
|
|
1485
|
+
window.addEventListener("keydown", handleKeyDown);
|
|
1486
|
+
onCleanup(() => window.removeEventListener("keydown", handleKeyDown));
|
|
1487
|
+
});
|
|
1488
|
+
onCleanup(() => {
|
|
1489
|
+
if (closeTimeout) clearTimeout(closeTimeout);
|
|
1490
|
+
if (rafId) cancelAnimationFrame(rafId);
|
|
1491
|
+
});
|
|
1492
|
+
const handleBackdropClick = () => {
|
|
1493
|
+
if (props.dismissible === false) return;
|
|
1494
|
+
props.onClose?.();
|
|
1495
|
+
};
|
|
1496
|
+
return createComponent(Show, {
|
|
1497
|
+
get when() {
|
|
1498
|
+
return isMounted();
|
|
1499
|
+
},
|
|
1500
|
+
get children() {
|
|
1501
|
+
return createComponent(Portal, {
|
|
1502
|
+
get children() {
|
|
1503
|
+
var _el$ = _tmpl$28(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild;
|
|
1504
|
+
_el$2.$$click = handleBackdropClick;
|
|
1505
|
+
use((el) => panelRef = el, _el$3);
|
|
1506
|
+
insert(_el$3, (() => {
|
|
1507
|
+
var _c$ = memo(() => !!(props.title || props.onClose));
|
|
1508
|
+
return () => _c$() && (() => {
|
|
1509
|
+
var _el$7 = _tmpl$45();
|
|
1510
|
+
insert(_el$7, (() => {
|
|
1511
|
+
var _c$2 = memo(() => !!props.title);
|
|
1512
|
+
return () => _c$2() && (() => {
|
|
1513
|
+
var _el$9 = _tmpl$54();
|
|
1514
|
+
setAttribute(_el$9, "id", titleId);
|
|
1515
|
+
insert(_el$9, () => props.title);
|
|
1516
|
+
return _el$9;
|
|
1517
|
+
})();
|
|
1518
|
+
})(), null);
|
|
1519
|
+
insert(_el$7, createComponent(Show, {
|
|
1520
|
+
get when() {
|
|
1521
|
+
return props.onClose;
|
|
1522
|
+
},
|
|
1523
|
+
get children() {
|
|
1524
|
+
return createComponent(SSButton, {
|
|
1525
|
+
type: "button",
|
|
1526
|
+
"class": "ss_modal__close",
|
|
1527
|
+
isIconOnly: true,
|
|
1528
|
+
ariaLabel: "Dialog schlie\xDFen",
|
|
1529
|
+
onclick: () => {
|
|
1530
|
+
if (props.dismissible === false) return;
|
|
1531
|
+
props.onClose?.();
|
|
1532
|
+
},
|
|
1533
|
+
get children() {
|
|
1534
|
+
return _tmpl$37();
|
|
1535
|
+
}
|
|
1536
|
+
});
|
|
1537
|
+
}
|
|
1538
|
+
}), null);
|
|
1539
|
+
return _el$7;
|
|
1540
|
+
})();
|
|
1541
|
+
})(), _el$4);
|
|
1542
|
+
insert(_el$5, () => props.children);
|
|
1543
|
+
insert(_el$3, createComponent(Show, {
|
|
1544
|
+
get when() {
|
|
1545
|
+
return props.footer;
|
|
1546
|
+
},
|
|
1547
|
+
get children() {
|
|
1548
|
+
var _el$6 = _tmpl$20();
|
|
1549
|
+
insert(_el$6, () => props.footer);
|
|
1550
|
+
return _el$6;
|
|
1551
|
+
}
|
|
1552
|
+
}), null);
|
|
1553
|
+
effect((_p$) => {
|
|
1554
|
+
var _v$ = state(), _v$2 = state() === "closed", _v$3 = !!(props.size === "sm"), _v$4 = !!(props.size === "lg"), _v$5 = !!props.fullscreen, _v$6 = !!props.disableResponsiveFullscreen, _v$7 = props.title ? titleId : void 0;
|
|
1555
|
+
_v$ !== _p$.e && setAttribute(_el$, "data-state", _p$.e = _v$);
|
|
1556
|
+
_v$2 !== _p$.t && setAttribute(_el$, "aria-hidden", _p$.t = _v$2);
|
|
1557
|
+
_v$3 !== _p$.a && _el$3.classList.toggle("ss_modal__panel--sm", _p$.a = _v$3);
|
|
1558
|
+
_v$4 !== _p$.o && _el$3.classList.toggle("ss_modal__panel--lg", _p$.o = _v$4);
|
|
1559
|
+
_v$5 !== _p$.i && _el$3.classList.toggle("ss_modal__panel--fullscreen", _p$.i = _v$5);
|
|
1560
|
+
_v$6 !== _p$.n && _el$3.classList.toggle("ss_modal__panel--no-fullscreen", _p$.n = _v$6);
|
|
1561
|
+
_v$7 !== _p$.s && setAttribute(_el$3, "aria-labelledby", _p$.s = _v$7);
|
|
1562
|
+
return _p$;
|
|
1563
|
+
}, {
|
|
1564
|
+
e: void 0,
|
|
1565
|
+
t: void 0,
|
|
1566
|
+
a: void 0,
|
|
1567
|
+
o: void 0,
|
|
1568
|
+
i: void 0,
|
|
1569
|
+
n: void 0,
|
|
1570
|
+
s: void 0
|
|
1571
|
+
});
|
|
1572
|
+
return _el$;
|
|
1573
|
+
}
|
|
1574
|
+
});
|
|
1575
|
+
}
|
|
1576
|
+
});
|
|
1577
|
+
}
|
|
1578
|
+
delegateEvents(["click"]);
|
|
1579
|
+
var SSModalsContext = createContext();
|
|
1580
|
+
var modalCounter = 0;
|
|
1581
|
+
var nextModalId = () => `ss-modal-${modalCounter++}`;
|
|
1582
|
+
function useSSModals() {
|
|
1583
|
+
const context = useContext(SSModalsContext);
|
|
1584
|
+
if (!context) {
|
|
1585
|
+
throw new Error("useSSModals must be used within SSModalsProvider");
|
|
1586
|
+
}
|
|
1587
|
+
return context;
|
|
1588
|
+
}
|
|
1589
|
+
function DefaultModal(props) {
|
|
1590
|
+
const navigate = useNavigate();
|
|
1591
|
+
const location = useLocation();
|
|
1592
|
+
const [loading, process] = createLoading();
|
|
1593
|
+
const modalProps = () => props.config.modalProps?.({
|
|
1594
|
+
hide: props.hide
|
|
1595
|
+
}) ?? {};
|
|
1596
|
+
const {
|
|
1597
|
+
primaryButtonText,
|
|
1598
|
+
secondaryButtonText,
|
|
1599
|
+
hideSecondaryButton,
|
|
1600
|
+
danger,
|
|
1601
|
+
...rest
|
|
1602
|
+
} = modalProps();
|
|
1603
|
+
return createComponent(SSModal, mergeProps({
|
|
1604
|
+
get open() {
|
|
1605
|
+
return props.visible();
|
|
1606
|
+
},
|
|
1607
|
+
get onClose() {
|
|
1608
|
+
return props.hide;
|
|
1609
|
+
}
|
|
1610
|
+
}, rest, {
|
|
1611
|
+
get footer() {
|
|
1612
|
+
return [!hideSecondaryButton && createComponent(SSButton, {
|
|
1613
|
+
"class": "secondary",
|
|
1614
|
+
get onclick() {
|
|
1615
|
+
return props.hide;
|
|
1616
|
+
},
|
|
1617
|
+
children: secondaryButtonText ?? "Abbrechen"
|
|
1618
|
+
}), createComponent(SSButton, {
|
|
1619
|
+
"class": danger ? "danger" : void 0,
|
|
1620
|
+
onclick: () => process(() => props.config.onPrimaryAction?.({
|
|
1621
|
+
hide: props.hide,
|
|
1622
|
+
navigate,
|
|
1623
|
+
pathname: location.pathname
|
|
1624
|
+
}) ?? props.hide()),
|
|
1625
|
+
get disabled() {
|
|
1626
|
+
return loading();
|
|
1627
|
+
},
|
|
1628
|
+
children: primaryButtonText ?? "Weiter"
|
|
1629
|
+
})];
|
|
1630
|
+
},
|
|
1631
|
+
get children() {
|
|
1632
|
+
return props.config.content({
|
|
1633
|
+
hide: props.hide
|
|
1634
|
+
});
|
|
1635
|
+
}
|
|
1636
|
+
}));
|
|
1637
|
+
}
|
|
1638
|
+
function FormModal(props) {
|
|
1639
|
+
const navigate = useNavigate();
|
|
1640
|
+
const location = useLocation();
|
|
1641
|
+
return createComponent(SSForm, {
|
|
1642
|
+
onsubmit: (context) => props.config.onSubmit({
|
|
1643
|
+
hide: props.hide,
|
|
1644
|
+
context,
|
|
1645
|
+
navigate,
|
|
1646
|
+
pathname: location.pathname
|
|
1647
|
+
}),
|
|
1648
|
+
get children() {
|
|
1649
|
+
return createComponent(FormModalInner, {
|
|
1650
|
+
get visible() {
|
|
1651
|
+
return props.visible;
|
|
1652
|
+
},
|
|
1653
|
+
get hide() {
|
|
1654
|
+
return props.hide;
|
|
1655
|
+
},
|
|
1656
|
+
get config() {
|
|
1657
|
+
return props.config;
|
|
1658
|
+
}
|
|
1659
|
+
});
|
|
1660
|
+
}
|
|
1661
|
+
});
|
|
1662
|
+
}
|
|
1663
|
+
function FormModalInner(props) {
|
|
1664
|
+
const context = SSForm.useContext();
|
|
1665
|
+
if (!context) return null;
|
|
1666
|
+
const modalProps = () => props.config.modalProps?.({
|
|
1667
|
+
hide: props.hide,
|
|
1668
|
+
context
|
|
1669
|
+
}) ?? {};
|
|
1670
|
+
const {
|
|
1671
|
+
primaryButtonText,
|
|
1672
|
+
secondaryButtonText,
|
|
1673
|
+
hideSecondaryButton,
|
|
1674
|
+
danger,
|
|
1675
|
+
...rest
|
|
1676
|
+
} = modalProps();
|
|
1677
|
+
return createComponent(SSModal, mergeProps({
|
|
1678
|
+
get open() {
|
|
1679
|
+
return props.visible();
|
|
1680
|
+
},
|
|
1681
|
+
get onClose() {
|
|
1682
|
+
return props.hide;
|
|
1683
|
+
}
|
|
1684
|
+
}, rest, {
|
|
1685
|
+
get footer() {
|
|
1686
|
+
return [!hideSecondaryButton && createComponent(SSButton, {
|
|
1687
|
+
"class": "secondary",
|
|
1688
|
+
get onclick() {
|
|
1689
|
+
return props.hide;
|
|
1690
|
+
},
|
|
1691
|
+
get disabled() {
|
|
1692
|
+
return context.loading();
|
|
1693
|
+
},
|
|
1694
|
+
children: secondaryButtonText ?? "Abbrechen"
|
|
1695
|
+
}), createComponent(SSButton, {
|
|
1696
|
+
"class": danger ? "danger" : void 0,
|
|
1697
|
+
onclick: () => context.submit(),
|
|
1698
|
+
get disabled() {
|
|
1699
|
+
return context.loading();
|
|
1700
|
+
},
|
|
1701
|
+
children: primaryButtonText ?? "Speichern"
|
|
1702
|
+
})];
|
|
1703
|
+
},
|
|
1704
|
+
get children() {
|
|
1705
|
+
return props.config.content({
|
|
1706
|
+
hide: props.hide,
|
|
1707
|
+
context
|
|
1708
|
+
});
|
|
1709
|
+
}
|
|
1710
|
+
}));
|
|
1711
|
+
}
|
|
1712
|
+
function SSModalsProvider(props) {
|
|
1713
|
+
const [modals, setModals] = createSignal([]);
|
|
1714
|
+
const modalsById = /* @__PURE__ */ new Map();
|
|
1715
|
+
const closeTimeouts = /* @__PURE__ */ new Map();
|
|
1716
|
+
const removeDelayMs = 220;
|
|
1717
|
+
const hide = (id) => {
|
|
1718
|
+
const modal = modalsById.get(id);
|
|
1719
|
+
if (!modal) return;
|
|
1720
|
+
modal.setVisible(false);
|
|
1721
|
+
const existing = closeTimeouts.get(id);
|
|
1722
|
+
if (existing) window.clearTimeout(existing);
|
|
1723
|
+
const timeout = window.setTimeout(() => {
|
|
1724
|
+
setModals((list) => list.filter((modal2) => modal2.id !== id));
|
|
1725
|
+
modalsById.delete(id);
|
|
1726
|
+
closeTimeouts.delete(id);
|
|
1727
|
+
}, removeDelayMs);
|
|
1728
|
+
closeTimeouts.set(id, timeout);
|
|
1729
|
+
};
|
|
1730
|
+
const show = (render) => {
|
|
1731
|
+
const id = nextModalId();
|
|
1732
|
+
const [visible, setVisible] = createSignal(true);
|
|
1733
|
+
const entry = {
|
|
1734
|
+
id,
|
|
1735
|
+
visible,
|
|
1736
|
+
setVisible,
|
|
1737
|
+
render
|
|
1738
|
+
};
|
|
1739
|
+
modalsById.set(id, entry);
|
|
1740
|
+
setModals((list) => [...list, entry]);
|
|
1741
|
+
return id;
|
|
1742
|
+
};
|
|
1743
|
+
const showDefault = (config) => {
|
|
1744
|
+
return show(({
|
|
1745
|
+
hide: hide2,
|
|
1746
|
+
visible
|
|
1747
|
+
}) => createComponent(DefaultModal, {
|
|
1748
|
+
visible,
|
|
1749
|
+
hide: hide2,
|
|
1750
|
+
config
|
|
1751
|
+
}));
|
|
1752
|
+
};
|
|
1753
|
+
const showForm = (config) => {
|
|
1754
|
+
return show(({
|
|
1755
|
+
hide: hide2,
|
|
1756
|
+
visible
|
|
1757
|
+
}) => createComponent(FormModal, {
|
|
1758
|
+
visible,
|
|
1759
|
+
hide: hide2,
|
|
1760
|
+
config
|
|
1761
|
+
}));
|
|
1762
|
+
};
|
|
1763
|
+
onCleanup(() => {
|
|
1764
|
+
closeTimeouts.forEach((timeout) => window.clearTimeout(timeout));
|
|
1765
|
+
closeTimeouts.clear();
|
|
1766
|
+
});
|
|
1767
|
+
return createComponent(SSModalsContext.Provider, {
|
|
1768
|
+
value: {
|
|
1769
|
+
show,
|
|
1770
|
+
showDefault,
|
|
1771
|
+
showForm,
|
|
1772
|
+
hide
|
|
1773
|
+
},
|
|
1774
|
+
get children() {
|
|
1775
|
+
return [memo(() => props.children), createComponent(For, {
|
|
1776
|
+
get each() {
|
|
1777
|
+
return modals();
|
|
1778
|
+
},
|
|
1779
|
+
children: (modal) => {
|
|
1780
|
+
const hideModal = () => hide(modal.id);
|
|
1781
|
+
return modal.render({
|
|
1782
|
+
id: modal.id,
|
|
1783
|
+
hide: hideModal,
|
|
1784
|
+
visible: modal.visible
|
|
1785
|
+
});
|
|
1786
|
+
}
|
|
1787
|
+
})];
|
|
1788
|
+
}
|
|
1789
|
+
});
|
|
1790
|
+
}
|
|
1791
|
+
var _tmpl$21 = /* @__PURE__ */ template(`<div><input type=checkbox class=ss_shell__drawer_toggle_input><header class=ss_shell__header><div class=ss_shell__header_left><label class="ss_shell__drawer_toggle ss_button ss_button--icon"aria-label="Navigation \xF6ffnen"role=button tabindex=0><svg xmlns=http://www.w3.org/2000/svg width=24 height=24 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round class="icon icon-tabler icons-tabler-outline icon-tabler-menu-2"><path stroke=none d="M0 0h24v24H0z"fill=none></path><path d="M4 6l16 0"></path><path d="M4 12l16 0"></path><path d="M4 18l16 0"></path></svg></label><div class=ss_shell__title></div></div><div class=ss_shell__actions></div></header><div class=ss_shell__body><nav class=ss_shell__nav aria-label=Hauptnavigation><div class=ss_shell__nav_inner></div></nav><div class=ss_shell__main></div><label class=ss_shell__scrim aria-label="Navigation schlie\xDFen">`);
|
|
1792
|
+
var _tmpl$29 = /* @__PURE__ */ template(`<div class=ss_shell__nav_list>`);
|
|
1793
|
+
var _tmpl$38 = /* @__PURE__ */ template(`<a class=ss_shell__nav_item><span class=ss_shell__nav_label>`);
|
|
1794
|
+
var _tmpl$46 = /* @__PURE__ */ template(`<span class=ss_shell__nav_icon>`);
|
|
1795
|
+
var _tmpl$55 = /* @__PURE__ */ template(`<button type=button class=ss_shell__nav_item><span class=ss_shell__nav_label>`);
|
|
1796
|
+
var _tmpl$63 = /* @__PURE__ */ template(`<details class=ss_shell__nav_group><summary class=ss_shell__nav_group_header><span class=ss_shell__nav_label></span><span class=ss_shell__nav_group_chevron aria-hidden=true><svg xmlns=http://www.w3.org/2000/svg width=24 height=24 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round class=ss_shell__nav_group_chevron_svg><path stroke=none d="M0 0h24v24H0z"fill=none></path><path d="M9 6l6 6l-6 6"></path></svg></span></summary><div class=ss_shell__nav_group_items>`);
|
|
1797
|
+
var SSShellContext = createContext();
|
|
1798
|
+
function SSShell(props) {
|
|
1799
|
+
const drawerId = createUniqueId();
|
|
1800
|
+
const location = useLocation();
|
|
1801
|
+
const [hrefs, setHrefs] = createSignal([]);
|
|
1802
|
+
const closeDrawer = () => {
|
|
1803
|
+
const input = document.getElementById(drawerId);
|
|
1804
|
+
if (input) input.checked = false;
|
|
1805
|
+
};
|
|
1806
|
+
const registerHref = (href) => {
|
|
1807
|
+
setHrefs((prev) => prev.includes(href) ? prev : [...prev, href]);
|
|
1808
|
+
};
|
|
1809
|
+
const unregisterHref = (href) => {
|
|
1810
|
+
setHrefs((prev) => prev.filter((item) => item !== href));
|
|
1811
|
+
};
|
|
1812
|
+
const activeHref = createMemo(() => {
|
|
1813
|
+
const path = location.pathname;
|
|
1814
|
+
let best = null;
|
|
1815
|
+
for (const href of hrefs()) {
|
|
1816
|
+
if (!path.startsWith(href)) continue;
|
|
1817
|
+
if (!best || href.length > best.length) {
|
|
1818
|
+
best = href;
|
|
1819
|
+
}
|
|
1820
|
+
}
|
|
1821
|
+
return best;
|
|
1822
|
+
});
|
|
1823
|
+
return createComponent(SSShellContext.Provider, {
|
|
1824
|
+
value: {
|
|
1825
|
+
closeDrawer,
|
|
1826
|
+
activeHref,
|
|
1827
|
+
registerHref,
|
|
1828
|
+
unregisterHref
|
|
1829
|
+
},
|
|
1830
|
+
get children() {
|
|
1831
|
+
var _el$ = _tmpl$21(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild, _el$6 = _el$5.nextSibling, _el$7 = _el$4.nextSibling, _el$8 = _el$3.nextSibling, _el$9 = _el$8.firstChild, _el$0 = _el$9.firstChild, _el$1 = _el$9.nextSibling, _el$10 = _el$1.nextSibling;
|
|
1832
|
+
setAttribute(_el$2, "id", drawerId);
|
|
1833
|
+
setAttribute(_el$5, "for", drawerId);
|
|
1834
|
+
insert(_el$6, () => props.title);
|
|
1835
|
+
insert(_el$7, () => props.actions);
|
|
1836
|
+
insert(_el$0, () => props.nav);
|
|
1837
|
+
insert(_el$1, () => props.children);
|
|
1838
|
+
setAttribute(_el$10, "for", drawerId);
|
|
1839
|
+
effect((_p$) => {
|
|
1840
|
+
var _v$ = `ss_shell ${props.class ?? ""}`, _v$2 = props.style;
|
|
1841
|
+
_v$ !== _p$.e && className(_el$, _p$.e = _v$);
|
|
1842
|
+
_p$.t = style(_el$, _v$2, _p$.t);
|
|
1843
|
+
return _p$;
|
|
1844
|
+
}, {
|
|
1845
|
+
e: void 0,
|
|
1846
|
+
t: void 0
|
|
1847
|
+
});
|
|
1848
|
+
return _el$;
|
|
1849
|
+
}
|
|
1850
|
+
});
|
|
1851
|
+
}
|
|
1852
|
+
SSShell.Nav = function(props) {
|
|
1853
|
+
return (() => {
|
|
1854
|
+
var _el$11 = _tmpl$29();
|
|
1855
|
+
insert(_el$11, () => props.children);
|
|
1856
|
+
return _el$11;
|
|
1857
|
+
})();
|
|
1858
|
+
};
|
|
1859
|
+
SSShell.NavLink = function(props) {
|
|
1860
|
+
const context = useContext(SSShellContext);
|
|
1861
|
+
onMount(() => context?.registerHref(props.href));
|
|
1862
|
+
onCleanup(() => context?.unregisterHref(props.href));
|
|
1863
|
+
const isActive = () => context?.activeHref() === props.href;
|
|
1864
|
+
return (() => {
|
|
1865
|
+
var _el$12 = _tmpl$38(), _el$13 = _el$12.firstChild;
|
|
1866
|
+
_el$12.$$click = () => {
|
|
1867
|
+
props.onclick?.();
|
|
1868
|
+
context?.closeDrawer();
|
|
1869
|
+
};
|
|
1870
|
+
insert(_el$12, (() => {
|
|
1871
|
+
var _c$ = memo(() => !!props.icon);
|
|
1872
|
+
return () => _c$() && (() => {
|
|
1873
|
+
var _el$14 = _tmpl$46();
|
|
1874
|
+
insert(_el$14, () => props.icon);
|
|
1875
|
+
return _el$14;
|
|
1876
|
+
})();
|
|
1877
|
+
})(), _el$13);
|
|
1878
|
+
insert(_el$13, () => props.children);
|
|
1879
|
+
effect((_p$) => {
|
|
1880
|
+
var _v$3 = !!isActive(), _v$4 = props.href;
|
|
1881
|
+
_v$3 !== _p$.e && _el$12.classList.toggle("ss_shell__nav_item--active", _p$.e = _v$3);
|
|
1882
|
+
_v$4 !== _p$.t && setAttribute(_el$12, "href", _p$.t = _v$4);
|
|
1883
|
+
return _p$;
|
|
1884
|
+
}, {
|
|
1885
|
+
e: void 0,
|
|
1886
|
+
t: void 0
|
|
1887
|
+
});
|
|
1888
|
+
return _el$12;
|
|
1889
|
+
})();
|
|
1890
|
+
};
|
|
1891
|
+
SSShell.NavAction = function(props) {
|
|
1892
|
+
const context = useContext(SSShellContext);
|
|
1893
|
+
return (() => {
|
|
1894
|
+
var _el$15 = _tmpl$55(), _el$16 = _el$15.firstChild;
|
|
1895
|
+
_el$15.$$click = () => {
|
|
1896
|
+
props.onclick();
|
|
1897
|
+
context?.closeDrawer();
|
|
1898
|
+
};
|
|
1899
|
+
insert(_el$15, (() => {
|
|
1900
|
+
var _c$2 = memo(() => !!props.icon);
|
|
1901
|
+
return () => _c$2() && (() => {
|
|
1902
|
+
var _el$17 = _tmpl$46();
|
|
1903
|
+
insert(_el$17, () => props.icon);
|
|
1904
|
+
return _el$17;
|
|
1905
|
+
})();
|
|
1906
|
+
})(), _el$16);
|
|
1907
|
+
insert(_el$16, () => props.children);
|
|
1908
|
+
return _el$15;
|
|
1909
|
+
})();
|
|
1910
|
+
};
|
|
1911
|
+
SSShell.NavGroup = function(props) {
|
|
1912
|
+
return (() => {
|
|
1913
|
+
var _el$18 = _tmpl$63(), _el$19 = _el$18.firstChild, _el$20 = _el$19.firstChild, _el$21 = _el$19.nextSibling;
|
|
1914
|
+
insert(_el$19, (() => {
|
|
1915
|
+
var _c$3 = memo(() => !!props.icon);
|
|
1916
|
+
return () => _c$3() && (() => {
|
|
1917
|
+
var _el$22 = _tmpl$46();
|
|
1918
|
+
insert(_el$22, () => props.icon);
|
|
1919
|
+
return _el$22;
|
|
1920
|
+
})();
|
|
1921
|
+
})(), _el$20);
|
|
1922
|
+
insert(_el$20, () => props.title);
|
|
1923
|
+
insert(_el$21, () => props.children);
|
|
1924
|
+
effect(() => _el$18.open = props.initiallyExpanded);
|
|
1925
|
+
return _el$18;
|
|
1926
|
+
})();
|
|
1927
|
+
};
|
|
1928
|
+
delegateEvents(["click"]);
|
|
1929
|
+
var _tmpl$30 = /* @__PURE__ */ template(`<div>`);
|
|
1930
|
+
function SSSurface(props) {
|
|
1931
|
+
return (() => {
|
|
1932
|
+
var _el$ = _tmpl$30();
|
|
1933
|
+
insert(_el$, () => props.children);
|
|
1934
|
+
effect((_p$) => {
|
|
1935
|
+
var _v$ = `ss_surface ${props.class ?? ""}`, _v$2 = props.style;
|
|
1936
|
+
_v$ !== _p$.e && className(_el$, _p$.e = _v$);
|
|
1937
|
+
_p$.t = style(_el$, _v$2, _p$.t);
|
|
1938
|
+
return _p$;
|
|
1939
|
+
}, {
|
|
1940
|
+
e: void 0,
|
|
1941
|
+
t: void 0
|
|
1942
|
+
});
|
|
1943
|
+
return _el$;
|
|
1944
|
+
})();
|
|
1945
|
+
}
|
|
1946
|
+
var _tmpl$31 = /* @__PURE__ */ template(`<div><div class=ss_tile__row><div class=ss_tile__content>`);
|
|
1947
|
+
var _tmpl$210 = /* @__PURE__ */ template(`<span class=ss_tile__icon>`);
|
|
1948
|
+
var _tmpl$39 = /* @__PURE__ */ template(`<h5 class=ss_tile__title>`);
|
|
1949
|
+
var _tmpl$47 = /* @__PURE__ */ template(`<h5 class=ss_tile__title><span class=ss_tile__text>`);
|
|
1950
|
+
var _tmpl$56 = /* @__PURE__ */ template(`<div class=ss_tile__subtitle>`);
|
|
1951
|
+
var _tmpl$64 = /* @__PURE__ */ template(`<div class=ss_tile__trailing>`);
|
|
1952
|
+
function SSTile(props) {
|
|
1953
|
+
return (() => {
|
|
1954
|
+
var _el$ = _tmpl$31(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild;
|
|
1955
|
+
insert(_el$2, (() => {
|
|
1956
|
+
var _c$ = memo(() => !!props.icon);
|
|
1957
|
+
return () => _c$() && (() => {
|
|
1958
|
+
var _el$4 = _tmpl$210();
|
|
1959
|
+
insert(_el$4, () => props.icon);
|
|
1960
|
+
return _el$4;
|
|
1961
|
+
})();
|
|
1962
|
+
})(), _el$3);
|
|
1963
|
+
insert(_el$3, (() => {
|
|
1964
|
+
var _c$2 = memo(() => !!props.href);
|
|
1965
|
+
return () => _c$2() ? (() => {
|
|
1966
|
+
var _el$5 = _tmpl$39();
|
|
1967
|
+
insert(_el$5, createComponent(A, {
|
|
1968
|
+
"class": "ss_tile__link",
|
|
1969
|
+
get href() {
|
|
1970
|
+
return props.href;
|
|
1971
|
+
},
|
|
1972
|
+
get onclick() {
|
|
1973
|
+
return props.onLinkClick;
|
|
1974
|
+
},
|
|
1975
|
+
get children() {
|
|
1976
|
+
return props.title;
|
|
1977
|
+
}
|
|
1978
|
+
}));
|
|
1979
|
+
return _el$5;
|
|
1980
|
+
})() : (() => {
|
|
1981
|
+
var _el$6 = _tmpl$47(), _el$7 = _el$6.firstChild;
|
|
1982
|
+
insert(_el$7, () => props.title);
|
|
1983
|
+
return _el$6;
|
|
1984
|
+
})();
|
|
1985
|
+
})(), null);
|
|
1986
|
+
insert(_el$3, (() => {
|
|
1987
|
+
var _c$3 = memo(() => !!props.subtitle);
|
|
1988
|
+
return () => _c$3() && (() => {
|
|
1989
|
+
var _el$8 = _tmpl$56();
|
|
1990
|
+
insert(_el$8, () => props.subtitle);
|
|
1991
|
+
return _el$8;
|
|
1992
|
+
})();
|
|
1993
|
+
})(), null);
|
|
1994
|
+
insert(_el$2, (() => {
|
|
1995
|
+
var _c$4 = memo(() => !!props.trailing);
|
|
1996
|
+
return () => _c$4() && (() => {
|
|
1997
|
+
var _el$9 = _tmpl$64();
|
|
1998
|
+
insert(_el$9, () => props.trailing);
|
|
1999
|
+
return _el$9;
|
|
2000
|
+
})();
|
|
2001
|
+
})(), null);
|
|
2002
|
+
effect((_p$) => {
|
|
2003
|
+
var _v$ = `ss_tile ${props.class ?? ""}`, _v$2 = props.style;
|
|
2004
|
+
_v$ !== _p$.e && className(_el$, _p$.e = _v$);
|
|
2005
|
+
_p$.t = style(_el$, _v$2, _p$.t);
|
|
2006
|
+
return _p$;
|
|
2007
|
+
}, {
|
|
2008
|
+
e: void 0,
|
|
2009
|
+
t: void 0
|
|
2010
|
+
});
|
|
2011
|
+
return _el$;
|
|
2012
|
+
})();
|
|
2013
|
+
}
|
|
2014
|
+
function createSSTile(build) {
|
|
2015
|
+
return function(props) {
|
|
2016
|
+
const built = build(props.data);
|
|
2017
|
+
return createComponent(SSTile, mergeProps(built, {
|
|
2018
|
+
get onLinkClick() {
|
|
2019
|
+
return props.onLinkClick ?? built.onLinkClick;
|
|
2020
|
+
},
|
|
2021
|
+
get href() {
|
|
2022
|
+
return memo(() => !!props.noLink)() ? void 0 : built.href;
|
|
2023
|
+
},
|
|
2024
|
+
get icon() {
|
|
2025
|
+
return memo(() => !!props.noIcon)() ? void 0 : built.icon;
|
|
2026
|
+
}
|
|
2027
|
+
}));
|
|
2028
|
+
};
|
|
2029
|
+
}
|
|
2030
|
+
|
|
2031
|
+
export { SSButton, SSCallout, SSChip, SSDataTable, SSDropdown, SSExpandable, SSForm, SSHeader, SSModal, SSModalsProvider, SSShell, SSSurface, SSTile, createSSTile, useSSModals };
|