svelte-multiselect 11.2.4 → 11.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,25 +1,25 @@
1
- import type { MultiSelectProps, Option as T } from './types';
2
- declare function $$render<Option extends T>(): {
3
- props: MultiSelectProps;
1
+ import type { MultiSelectProps } from './types';
2
+ declare function $$render<Option extends import('./types').Option>(): {
3
+ props: MultiSelectProps<Option>;
4
4
  exports: {};
5
- bindings: "input" | "invalid" | "value" | "selected" | "open" | "activeIndex" | "activeOption" | "form_input" | "matchingOptions" | "options" | "outerDiv" | "searchText";
5
+ bindings: "input" | "invalid" | "value" | "selected" | "open" | "activeIndex" | "activeOption" | "form_input" | "matchingOptions" | "maxSelect" | "options" | "outerDiv" | "searchText";
6
6
  slots: {};
7
7
  events: {};
8
8
  };
9
- declare class __sveltets_Render<Option extends T> {
9
+ declare class __sveltets_Render<Option extends import('./types').Option> {
10
10
  props(): ReturnType<typeof $$render<Option>>['props'];
11
11
  events(): ReturnType<typeof $$render<Option>>['events'];
12
12
  slots(): ReturnType<typeof $$render<Option>>['slots'];
13
- bindings(): "input" | "invalid" | "value" | "selected" | "open" | "activeIndex" | "activeOption" | "form_input" | "matchingOptions" | "options" | "outerDiv" | "searchText";
13
+ bindings(): "input" | "invalid" | "value" | "selected" | "open" | "activeIndex" | "activeOption" | "form_input" | "matchingOptions" | "maxSelect" | "options" | "outerDiv" | "searchText";
14
14
  exports(): {};
15
15
  }
16
16
  interface $$IsomorphicComponent {
17
- new <Option extends T>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<Option>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<Option>['props']>, ReturnType<__sveltets_Render<Option>['events']>, ReturnType<__sveltets_Render<Option>['slots']>> & {
17
+ new <Option extends import('./types').Option>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<Option>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<Option>['props']>, ReturnType<__sveltets_Render<Option>['events']>, ReturnType<__sveltets_Render<Option>['slots']>> & {
18
18
  $$bindings?: ReturnType<__sveltets_Render<Option>['bindings']>;
19
19
  } & ReturnType<__sveltets_Render<Option>['exports']>;
20
- <Option extends T>(internal: unknown, props: ReturnType<__sveltets_Render<Option>['props']> & {}): ReturnType<__sveltets_Render<Option>['exports']>;
20
+ <Option extends import('./types').Option>(internal: unknown, props: ReturnType<__sveltets_Render<Option>['props']> & {}): ReturnType<__sveltets_Render<Option>['exports']>;
21
21
  z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
22
22
  }
23
23
  declare const MultiSelect: $$IsomorphicComponent;
24
- type MultiSelect<Option extends T> = InstanceType<typeof MultiSelect<Option>>;
24
+ type MultiSelect<Option extends import('./types').Option> = InstanceType<typeof MultiSelect<Option>>;
25
25
  export default MultiSelect;
@@ -0,0 +1,444 @@
1
+ <script
2
+ lang="ts"
3
+ generics="Route extends string | [string, string] | [string, string[]]"
4
+ >import { click_outside } from './attachments';
5
+ import Icon from './Icon.svelte';
6
+ let { routes = [], children, link, menu_props, link_props, page, labels, ...rest } = $props();
7
+ let is_open = $state(false);
8
+ let hovered_dropdown = $state(null);
9
+ let focused_item_index = $state(-1);
10
+ let is_touch_device = $state(false);
11
+ const panel_id = `nav-menu-${crypto.randomUUID()}`;
12
+ // Detect touch device
13
+ $effect(() => {
14
+ if (typeof globalThis !== `undefined`) {
15
+ is_touch_device = `ontouchstart` in globalThis || navigator.maxTouchPoints > 0;
16
+ }
17
+ });
18
+ function close_menus() {
19
+ is_open = false;
20
+ hovered_dropdown = null;
21
+ focused_item_index = -1;
22
+ }
23
+ function toggle_dropdown(href, focus_first = false) {
24
+ const is_opening = hovered_dropdown !== href;
25
+ hovered_dropdown = hovered_dropdown === href ? null : href;
26
+ focused_item_index = is_opening && focus_first ? 0 : -1;
27
+ // Focus management for keyboard users
28
+ if (is_opening && focus_first) {
29
+ setTimeout(() => {
30
+ const dropdown = document.querySelector(`.dropdown[data-href="${href}"]`);
31
+ const first_link = dropdown?.querySelector(`[role="menuitem"]`);
32
+ first_link?.focus();
33
+ }, 0);
34
+ }
35
+ }
36
+ function onkeydown(event) {
37
+ if (event.key === `Escape`)
38
+ close_menus();
39
+ }
40
+ function handle_dropdown_keydown(event, href, sub_routes) {
41
+ const { key } = event;
42
+ if (key === `Enter` || key === ` `) {
43
+ event.preventDefault();
44
+ toggle_dropdown(href, true);
45
+ return;
46
+ }
47
+ // Arrow key navigation within open dropdown
48
+ if (hovered_dropdown === href && (key === `ArrowDown` || key === `ArrowUp`)) {
49
+ event.preventDefault();
50
+ const direction = key === `ArrowDown` ? 1 : -1;
51
+ const new_index = Math.max(0, Math.min(sub_routes.length - 1, focused_item_index + direction));
52
+ focused_item_index = new_index;
53
+ const dropdown = document.querySelector(`.dropdown[data-href="${href}"]`);
54
+ const links = dropdown?.querySelectorAll(`[role="menuitem"]`);
55
+ links?.[new_index]?.focus();
56
+ }
57
+ // Open dropdown with ArrowDown when closed
58
+ if (hovered_dropdown !== href && key === `ArrowDown`) {
59
+ event.preventDefault();
60
+ toggle_dropdown(href, true);
61
+ }
62
+ }
63
+ function handle_dropdown_item_keydown(event, href) {
64
+ if (event.key === `Escape`) {
65
+ event.preventDefault();
66
+ close_menus();
67
+ // Return focus to dropdown toggle button
68
+ document
69
+ .querySelector(`.dropdown[data-href="${href}"]`)
70
+ ?.querySelector(`[data-dropdown-toggle]`)
71
+ ?.focus();
72
+ }
73
+ }
74
+ function is_current(path) {
75
+ if (path === `/`)
76
+ return page?.url.pathname === `/` ? `page` : undefined;
77
+ // Match exact path or path followed by / to avoid partial matches
78
+ // e.g. /tc-periodic-v2 should not match /tc-periodic
79
+ const pathname = page?.url.pathname;
80
+ const exact_match = pathname === path;
81
+ const prefix_match = pathname?.startsWith(path + `/`);
82
+ return exact_match || prefix_match ? `page` : undefined;
83
+ }
84
+ const is_child_current = (sub_routes) => sub_routes.some((child_path) => is_current(child_path) === `page`);
85
+ function format_label(text, remove_parent = false) {
86
+ const custom_label = labels?.[text];
87
+ if (custom_label)
88
+ return { label: custom_label, style: `` };
89
+ if (remove_parent)
90
+ text = text.split(`/`).filter(Boolean).pop() ?? text;
91
+ const label = text.replace(/^\//, ``).replaceAll(`-`, ` `);
92
+ return { label, style: `text-transform: capitalize` };
93
+ }
94
+ function parse_route(route) {
95
+ if (typeof route === `string`)
96
+ return { href: route, label: route };
97
+ const [first, second] = route;
98
+ return Array.isArray(second)
99
+ ? { href: first, label: first, children: second }
100
+ : { href: first, label: second };
101
+ }
102
+ </script>
103
+
104
+ <svelte:window {onkeydown} />
105
+
106
+ <nav
107
+ {...rest}
108
+ {@attach click_outside({ callback: close_menus })}
109
+ >
110
+ <button
111
+ class="burger"
112
+ type="button"
113
+ onclick={() => is_open = !is_open}
114
+ aria-label="Toggle navigation menu"
115
+ aria-expanded={is_open}
116
+ aria-controls={panel_id}
117
+ >
118
+ <span aria-hidden="true"></span>
119
+ <span aria-hidden="true"></span>
120
+ <span aria-hidden="true"></span>
121
+ </button>
122
+
123
+ <div
124
+ id={panel_id}
125
+ class="menu"
126
+ class:open={is_open}
127
+ tabindex="0"
128
+ role="menu"
129
+ {onkeydown}
130
+ {...menu_props}
131
+ >
132
+ {#each routes as route (JSON.stringify(route))}
133
+ {@const { href, label, children: sub_routes } = parse_route(route)}
134
+
135
+ {#if sub_routes}
136
+ <!-- Dropdown menu item -->
137
+ {@const parent = format_label(label)}
138
+ {@const child_is_active = is_child_current(sub_routes)}
139
+ {@const parent_page_exists = sub_routes.includes(href)}
140
+ {@const filtered_sub_routes = sub_routes.filter((route) => route !== href)}
141
+ <div
142
+ class="dropdown"
143
+ class:active={child_is_active}
144
+ data-href={href}
145
+ role="group"
146
+ aria-current={child_is_active ? `true` : undefined}
147
+ onmouseenter={() => !is_touch_device && (hovered_dropdown = href)}
148
+ onmouseleave={() => !is_touch_device && (hovered_dropdown = null)}
149
+ onfocusin={() => (hovered_dropdown = href)}
150
+ onfocusout={(event) => {
151
+ const next = event.relatedTarget as Node | null
152
+ if (!next || !(event.currentTarget as HTMLElement).contains(next)) {
153
+ hovered_dropdown = null
154
+ }
155
+ }}
156
+ >
157
+ <div>
158
+ {#if parent_page_exists}
159
+ {@const { label, style } = parent}
160
+ <a {href} aria-current={is_current(href)} onclick={close_menus} {style}>
161
+ {@html label}
162
+ </a>
163
+ {:else}
164
+ <span style={parent.style}>{@html parent.label}</span>
165
+ {/if}
166
+ <button
167
+ type="button"
168
+ data-dropdown-toggle
169
+ aria-label="Toggle {parent.label} submenu"
170
+ aria-expanded={hovered_dropdown === href}
171
+ aria-haspopup="true"
172
+ onclick={() => toggle_dropdown(href, false)}
173
+ onkeydown={(event) => handle_dropdown_keydown(event, href, filtered_sub_routes)}
174
+ >
175
+ <Icon
176
+ icon="ChevronExpand"
177
+ style="width: 0.8em; height: 0.8em"
178
+ />
179
+ </button>
180
+ </div>
181
+ <div
182
+ class:visible={hovered_dropdown === href}
183
+ role="menu"
184
+ tabindex="-1"
185
+ onmouseenter={() => !is_touch_device && (hovered_dropdown = href)}
186
+ onmouseleave={() => !is_touch_device && (hovered_dropdown = null)}
187
+ onfocusin={() => (hovered_dropdown = href)}
188
+ onfocusout={(event) => {
189
+ const next = event.relatedTarget as Node | null
190
+ if (!next || !(event.currentTarget as HTMLElement).contains(next)) {
191
+ hovered_dropdown = null
192
+ }
193
+ }}
194
+ >
195
+ {#each filtered_sub_routes as child_href (child_href)}
196
+ {@const child = format_label(child_href, true)}
197
+ {#if link}
198
+ {@render link({ href: child_href, label: child.label })}
199
+ {:else}
200
+ <a
201
+ href={child_href}
202
+ role="menuitem"
203
+ aria-current={is_current(child_href)}
204
+ onclick={close_menus}
205
+ onkeydown={(event) => handle_dropdown_item_keydown(event, href)}
206
+ {...link_props}
207
+ style={`${child.style}; ${link_props?.style ?? ``}`}
208
+ >
209
+ {@html child.label}
210
+ </a>
211
+ {/if}
212
+ {/each}
213
+ </div>
214
+ </div>
215
+ {:else}
216
+ <!-- Regular link item -->
217
+ {@const regular = format_label(label)}
218
+ {#if link}
219
+ {@render link({ href, label })}
220
+ {:else}
221
+ <a
222
+ {href}
223
+ aria-current={is_current(href)}
224
+ onclick={close_menus}
225
+ {...link_props}
226
+ style={`${regular.style}; ${link_props?.style ?? ``}`}
227
+ >
228
+ {@html regular.label}
229
+ </a>
230
+ {/if}
231
+ {/if}
232
+ {/each}
233
+
234
+ {@render children?.({ is_open, panel_id, routes })}
235
+ </div>
236
+ </nav>
237
+
238
+ <style>
239
+ nav {
240
+ position: relative;
241
+ margin: -0.75em auto 1.25em;
242
+ --nav-border-radius: 6pt;
243
+ --nav-surface-bg: light-dark(#fff, #1a1a1a);
244
+ --nav-surface-border: light-dark(rgba(128, 128, 128, 0.25), rgba(200, 200, 200, 0.2));
245
+ --nav-surface-shadow: light-dark(
246
+ 0 2px 8px rgba(0, 0, 0, 0.15),
247
+ 0 4px 12px rgba(0, 0, 0, 0.5)
248
+ );
249
+ }
250
+ .menu {
251
+ display: flex;
252
+ gap: 1em;
253
+ place-content: center;
254
+ place-items: center;
255
+ flex-wrap: wrap;
256
+ padding: 0.5em;
257
+ }
258
+ .menu > a {
259
+ line-height: 1.3;
260
+ padding: 1pt 5pt;
261
+ border-radius: var(--nav-border-radius);
262
+ text-decoration: none;
263
+ color: inherit;
264
+ transition: background-color 0.2s;
265
+ }
266
+ .menu > a:hover {
267
+ background-color: var(--nav-link-bg-hover);
268
+ }
269
+ .menu > a[aria-current='page'] {
270
+ color: var(--nav-link-active-color);
271
+ }
272
+
273
+ /* Dropdown styles */
274
+ .dropdown {
275
+ position: relative;
276
+ }
277
+ .dropdown.active > div:first-child a,
278
+ .dropdown.active > div:first-child span {
279
+ color: var(--nav-link-active-color);
280
+ }
281
+ .dropdown::after {
282
+ content: '';
283
+ position: absolute;
284
+ top: 100%;
285
+ left: 0;
286
+ right: 0;
287
+ height: var(--nav-dropdown-margin, 3pt);
288
+ }
289
+ .dropdown > div:first-child {
290
+ display: flex;
291
+ align-items: center;
292
+ gap: 0;
293
+ border-radius: var(--nav-border-radius);
294
+ transition: background-color 0.2s;
295
+ }
296
+ .dropdown > div:first-child:hover {
297
+ background-color: var(--nav-link-bg-hover);
298
+ }
299
+ .dropdown > div:first-child > a,
300
+ .dropdown > div:first-child > span {
301
+ line-height: 1.3;
302
+ padding: 1pt 5pt;
303
+ text-decoration: none;
304
+ color: inherit;
305
+ border-radius: var(--nav-border-radius) 0 0 var(--nav-border-radius);
306
+ }
307
+ .dropdown > div:first-child > a[aria-current='page'] {
308
+ color: var(--nav-link-active-color);
309
+ }
310
+ .dropdown > div:first-child > button {
311
+ padding: 1pt 3pt;
312
+ border: none;
313
+ background: transparent;
314
+ color: inherit;
315
+ cursor: pointer;
316
+ display: flex;
317
+ align-items: center;
318
+ justify-content: center;
319
+ border-radius: 0 var(--nav-border-radius) var(--nav-border-radius) 0;
320
+ }
321
+ .dropdown > div:last-child {
322
+ position: absolute;
323
+ top: 100%;
324
+ left: 0;
325
+ margin: var(--nav-dropdown-margin, 3pt 0 0 0);
326
+ min-width: max-content;
327
+ background-color: var(--nav-dropdown-bg, var(--nav-surface-bg));
328
+ border: 1px solid var(--nav-dropdown-border-color, var(--nav-surface-border));
329
+ border-radius: var(--nav-border-radius, 6pt);
330
+ box-shadow: var(--nav-dropdown-shadow, var(--nav-surface-shadow));
331
+ padding: var(--nav-dropdown-padding, 2pt 3pt);
332
+ display: none;
333
+ flex-direction: column;
334
+ gap: var(--nav-dropdown-gap, 5pt);
335
+ z-index: var(--nav-dropdown-z-index, 100);
336
+ }
337
+ .dropdown > div:last-child.visible {
338
+ display: flex;
339
+ }
340
+ .dropdown > div:last-child a {
341
+ padding: var(--nav-dropdown-link-padding, 1pt 4pt);
342
+ border-radius: var(--nav-border-radius);
343
+ text-decoration: none;
344
+ color: inherit;
345
+ white-space: nowrap;
346
+ transition: background-color 0.2s;
347
+ }
348
+ .dropdown > div:last-child a:hover {
349
+ background-color: var(--nav-link-bg-hover);
350
+ }
351
+ .dropdown > div:last-child a[aria-current='page'] {
352
+ color: var(--nav-link-active-color);
353
+ }
354
+ /* Mobile burger button */
355
+ .burger {
356
+ display: none;
357
+ position: fixed;
358
+ top: 1rem;
359
+ left: 1rem;
360
+ flex-direction: column;
361
+ justify-content: space-around;
362
+ width: 1.4rem;
363
+ height: 1.4rem;
364
+ background: transparent;
365
+ padding: 0;
366
+ z-index: var(--nav-toggle-btn-z-index, 10);
367
+ }
368
+ .burger span {
369
+ height: 0.18rem;
370
+ background-color: var(--text-color);
371
+ border-radius: 8px;
372
+ transition: all 0.2s linear;
373
+ transform-origin: 1px;
374
+ }
375
+ .burger[aria-expanded='true'] span:first-child {
376
+ transform: rotate(45deg);
377
+ }
378
+ .burger[aria-expanded='true'] span:nth-child(2) {
379
+ opacity: 0;
380
+ }
381
+ .burger[aria-expanded='true'] span:nth-child(3) {
382
+ transform: rotate(-45deg);
383
+ }
384
+ /* Mobile styles */
385
+ @media (max-width: 767px) {
386
+ .burger {
387
+ display: flex;
388
+ }
389
+ .menu {
390
+ position: fixed;
391
+ top: 3rem;
392
+ left: 1rem;
393
+ background-color: var(--nav-surface-bg);
394
+ border: 1px solid var(--nav-surface-border);
395
+ box-shadow: var(--nav-surface-shadow);
396
+ opacity: 0;
397
+ visibility: hidden;
398
+ transition: all 0.3s ease;
399
+ z-index: var(--nav-mobile-z-index, 2);
400
+ flex-direction: column;
401
+ align-items: stretch;
402
+ justify-content: flex-start;
403
+ gap: 0.2em;
404
+ max-width: 90vw;
405
+ border-radius: 6px;
406
+ }
407
+ .menu.open {
408
+ opacity: 1;
409
+ visibility: visible;
410
+ }
411
+ .menu > a,
412
+ .dropdown {
413
+ padding: 2pt 8pt;
414
+ }
415
+
416
+ /* Mobile dropdown styles - show as expandable section */
417
+ .dropdown {
418
+ flex-direction: column;
419
+ align-items: stretch;
420
+ }
421
+ .dropdown > div:first-child {
422
+ display: flex;
423
+ align-items: center;
424
+ justify-content: space-between;
425
+ }
426
+ .dropdown > div:first-child > a,
427
+ .dropdown > div:first-child > span {
428
+ flex: 1;
429
+ border-radius: var(--nav-border-radius);
430
+ }
431
+ .dropdown > div:first-child > button {
432
+ padding: 4pt 8pt;
433
+ border-radius: var(--nav-border-radius);
434
+ }
435
+ .dropdown > div:last-child {
436
+ position: static;
437
+ border: none;
438
+ box-shadow: none;
439
+ margin-top: 0.25em;
440
+ padding: 0 0 0 1em;
441
+ background-color: transparent;
442
+ }
443
+ }
444
+ </style>
@@ -0,0 +1,42 @@
1
+ import type { Page } from '@sveltejs/kit';
2
+ import type { Snippet } from 'svelte';
3
+ import type { HTMLAttributes } from 'svelte/elements';
4
+ declare function $$render<Route extends string | [string, string] | [string, string[]]>(): {
5
+ props: {
6
+ routes: Route[];
7
+ children?: Snippet<[{
8
+ is_open: boolean;
9
+ panel_id: string;
10
+ routes: Route[];
11
+ }]>;
12
+ link?: Snippet<[{
13
+ href: string;
14
+ label: string;
15
+ }]>;
16
+ menu_props?: HTMLAttributes<HTMLDivElement>;
17
+ link_props?: HTMLAttributes<HTMLAnchorElement>;
18
+ page?: Page;
19
+ labels?: Record<string, string>;
20
+ } & Omit<HTMLAttributes<HTMLElement>, "children">;
21
+ exports: {};
22
+ bindings: "";
23
+ slots: {};
24
+ events: {};
25
+ };
26
+ declare class __sveltets_Render<Route extends string | [string, string] | [string, string[]]> {
27
+ props(): ReturnType<typeof $$render<Route>>['props'];
28
+ events(): ReturnType<typeof $$render<Route>>['events'];
29
+ slots(): ReturnType<typeof $$render<Route>>['slots'];
30
+ bindings(): "";
31
+ exports(): {};
32
+ }
33
+ interface $$IsomorphicComponent {
34
+ new <Route extends string | [string, string] | [string, string[]]>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<Route>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<Route>['props']>, ReturnType<__sveltets_Render<Route>['events']>, ReturnType<__sveltets_Render<Route>['slots']>> & {
35
+ $$bindings?: ReturnType<__sveltets_Render<Route>['bindings']>;
36
+ } & ReturnType<__sveltets_Render<Route>['exports']>;
37
+ <Route extends string | [string, string] | [string, string[]]>(internal: unknown, props: ReturnType<__sveltets_Render<Route>['props']> & {}): ReturnType<__sveltets_Render<Route>['exports']>;
38
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
39
+ }
40
+ declare const Nav: $$IsomorphicComponent;
41
+ type Nav<Route extends string | [string, string] | [string, string[]]> = InstanceType<typeof Nav<Route>>;
42
+ export default Nav;
@@ -1,4 +1,4 @@
1
- <script lang="ts">let { items = [], node = `nav`, current = ``, log = `errors`, nav_options = { replace_state: true, no_scroll: true }, titles = { prev: `&larr; Previous`, next: `Next &rarr;` }, onkeyup = ({ prev, next }) => ({ ArrowLeft: prev[0], ArrowRight: next[0] }), prev_snippet, children, between, next_snippet, min_items = 3, ...rest } = $props();
1
+ <script lang="ts" generics="Item extends [string, unknown] = [string, unknown]">let { items = [], node = `nav`, current = ``, log = `errors`, nav_options = { replace_state: true, no_scroll: true }, titles = { prev: `&larr; Previous`, next: `Next &rarr;` }, onkeyup = ({ prev, next }) => ({ ArrowLeft: prev[0], ArrowRight: next[0] }), prev_snippet, children, between, next_snippet, min_items = 3, link_props, ...rest } = $props();
2
2
  // Convert items to consistent [key, value] format
3
3
  let items_arr = $derived((items ?? []).map((itm) => (typeof itm === `string` ? [itm, itm] : itm)));
4
4
  // Calculate prev/next items with wraparound
@@ -56,7 +56,7 @@ export {};
56
56
  {:else}
57
57
  <div>
58
58
  {#if titles.prev}<span>{@html titles.prev}</span>{/if}
59
- <a href={prev[0]}>{prev[0]}</a>
59
+ <a {...link_props} href={prev[0]}>{prev[0]}</a>
60
60
  </div>
61
61
  {/if}
62
62
  {/if}
@@ -69,7 +69,7 @@ export {};
69
69
  {:else}
70
70
  <div>
71
71
  {#if titles.next}<span>{@html titles.next}</span>{/if}
72
- <a href={next[0]}>{next[0]}</a>
72
+ <a {...link_props} href={next[0]}>{next[0]}</a>
73
73
  </div>
74
74
  {/if}
75
75
  {/if}
@@ -1,36 +1,56 @@
1
1
  import type { Snippet } from 'svelte';
2
2
  import type { HTMLAttributes } from 'svelte/elements';
3
- export type Item = [string, unknown];
4
- interface Props extends Omit<HTMLAttributes<HTMLElement>, `children` | `onkeyup`> {
5
- items?: (string | Item)[];
6
- node?: string;
7
- current?: string;
8
- log?: `verbose` | `errors` | `silent`;
9
- nav_options?: {
10
- replace_state: boolean;
11
- no_scroll: boolean;
3
+ declare function $$render<Item extends [string, unknown] = [string, unknown]>(): {
4
+ props: Omit<HTMLAttributes<HTMLElement>, "children" | "onkeyup"> & {
5
+ items?: (string | Item)[];
6
+ node?: string;
7
+ current?: string;
8
+ log?: `verbose` | `errors` | `silent`;
9
+ nav_options?: {
10
+ replace_state: boolean;
11
+ no_scroll: boolean;
12
+ };
13
+ titles?: {
14
+ prev: string;
15
+ next: string;
16
+ };
17
+ onkeyup?: ((obj: {
18
+ prev: Item;
19
+ next: Item;
20
+ }) => Record<string, string | undefined>) | null;
21
+ prev_snippet?: Snippet<[{
22
+ item: Item;
23
+ }]>;
24
+ children?: Snippet<[{
25
+ kind: `prev` | `next`;
26
+ item: Item;
27
+ }]>;
28
+ between?: Snippet<[]>;
29
+ next_snippet?: Snippet<[{
30
+ item: Item;
31
+ }]>;
32
+ min_items?: number;
33
+ link_props?: HTMLAttributes<HTMLAnchorElement>;
12
34
  };
13
- titles?: {
14
- prev: string;
15
- next: string;
16
- };
17
- onkeyup?: ((obj: {
18
- prev: Item;
19
- next: Item;
20
- }) => Record<string, string | undefined>) | null;
21
- prev_snippet?: Snippet<[{
22
- item: Item;
23
- }]>;
24
- children?: Snippet<[{
25
- kind: `prev` | `next`;
26
- item: Item;
27
- }]>;
28
- between?: Snippet<[]>;
29
- next_snippet?: Snippet<[{
30
- item: Item;
31
- }]>;
32
- min_items?: number;
35
+ exports: {};
36
+ bindings: "";
37
+ slots: {};
38
+ events: {};
39
+ };
40
+ declare class __sveltets_Render<Item extends [string, unknown] = [string, unknown]> {
41
+ props(): ReturnType<typeof $$render<Item>>['props'];
42
+ events(): ReturnType<typeof $$render<Item>>['events'];
43
+ slots(): ReturnType<typeof $$render<Item>>['slots'];
44
+ bindings(): "";
45
+ exports(): {};
46
+ }
47
+ interface $$IsomorphicComponent {
48
+ new <Item extends [string, unknown] = [string, unknown]>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<Item>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<Item>['props']>, ReturnType<__sveltets_Render<Item>['events']>, ReturnType<__sveltets_Render<Item>['slots']>> & {
49
+ $$bindings?: ReturnType<__sveltets_Render<Item>['bindings']>;
50
+ } & ReturnType<__sveltets_Render<Item>['exports']>;
51
+ <Item extends [string, unknown] = [string, unknown]>(internal: unknown, props: ReturnType<__sveltets_Render<Item>['props']> & {}): ReturnType<__sveltets_Render<Item>['exports']>;
52
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
33
53
  }
34
- declare const PrevNext: import("svelte").Component<Props, {}, "">;
35
- type PrevNext = ReturnType<typeof PrevNext>;
54
+ declare const PrevNext: $$IsomorphicComponent;
55
+ type PrevNext<Item extends [string, unknown] = [string, unknown]> = InstanceType<typeof PrevNext<Item>>;
36
56
  export default PrevNext;
@@ -1,4 +1,4 @@
1
- <script lang="ts">let { checked = $bindable(false), required = false, input_style = ``, id = null, onclick, onchange, onblur, onkeydown, children, ...rest } = $props();
1
+ <script lang="ts">let { checked = $bindable(false), onkeydown, children, input_props, ...rest } = $props();
2
2
  // normally input type=checkbox toggles on space bar, this handler also responds to enter
3
3
  function handle_keydown(event) {
4
4
  onkeydown?.(event);
@@ -16,13 +16,8 @@ export {};
16
16
  <input
17
17
  type="checkbox"
18
18
  bind:checked
19
- {id}
20
- {required}
19
+ {...input_props}
21
20
  onkeydown={handle_keydown}
22
- {onchange}
23
- {onblur}
24
- {onclick}
25
- style={input_style}
26
21
  />
27
22
  <span></span>
28
23
  </label>
@@ -1,16 +1,11 @@
1
1
  import type { Snippet } from 'svelte';
2
2
  import type { HTMLAttributes } from 'svelte/elements';
3
- interface Props extends HTMLAttributes<HTMLLabelElement> {
3
+ type $$ComponentProps = HTMLAttributes<HTMLLabelElement> & {
4
4
  checked?: boolean;
5
- required?: boolean;
6
- input_style?: string;
7
- id?: string | null;
8
- onclick?: (event: MouseEvent) => void;
9
- onchange?: (event: Event) => void;
10
- onblur?: (event: FocusEvent) => void;
11
5
  onkeydown?: (event: KeyboardEvent) => void;
12
6
  children?: Snippet<[]>;
13
- }
14
- declare const Toggle: import("svelte").Component<Props, {}, "checked">;
7
+ input_props?: HTMLAttributes<HTMLInputElement>;
8
+ };
9
+ declare const Toggle: import("svelte").Component<$$ComponentProps, {}, "checked">;
15
10
  type Toggle = ReturnType<typeof Toggle>;
16
11
  export default Toggle;