@svelte-atoms/core 1.0.0-alpha.27 → 1.0.0-alpha.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +852 -645
- package/dist/components/accordion/accordion-root.svelte +61 -61
- package/dist/components/accordion/item/accordion-item-body.svelte +42 -42
- package/dist/components/accordion/item/accordion-item-header.svelte +50 -50
- package/dist/components/accordion/item/accordion-item-indicator.svelte +50 -50
- package/dist/components/accordion/item/accordion-item-root.svelte +65 -65
- package/dist/components/alert/alert-actions.svelte +43 -42
- package/dist/components/alert/alert-close-button.svelte +70 -72
- package/dist/components/alert/alert-content.svelte +43 -42
- package/dist/components/alert/alert-description.svelte +42 -41
- package/dist/components/alert/alert-icon.svelte +47 -46
- package/dist/components/alert/alert-root.svelte +103 -102
- package/dist/components/alert/alert-title.svelte +42 -41
- package/dist/components/alert/alert.stories.svelte +384 -23
- package/dist/components/alert/alert.stories.svelte.d.ts +2 -5
- package/dist/components/atom/html-atom.svelte +207 -201
- package/dist/components/atom/html-atom.svelte.d.ts +1 -1
- package/dist/components/atom/snippet-renderer.svelte +5 -0
- package/dist/components/atom/snippet-renderer.svelte.d.ts +5 -0
- package/dist/components/avatar/avatar.stories.svelte.d.ts +1 -1
- package/dist/components/badge/badge.stories.svelte.d.ts +1 -1
- package/dist/components/breadcrumb/breadcrumb.stories.svelte.d.ts +1 -1
- package/dist/components/button/button.stories.svelte +17 -14
- package/dist/components/calendar/atoms.d.ts +5 -0
- package/dist/components/calendar/atoms.js +5 -0
- package/dist/components/calendar/bond.svelte.d.ts +72 -0
- package/dist/components/calendar/bond.svelte.js +132 -0
- package/dist/components/calendar/calendar-body.svelte +107 -0
- package/dist/components/calendar/calendar-body.svelte.d.ts +8 -0
- package/dist/components/calendar/calendar-day.svelte +96 -0
- package/dist/components/calendar/calendar-day.svelte.d.ts +4 -0
- package/dist/components/calendar/calendar-header.svelte +29 -0
- package/dist/components/calendar/calendar-header.svelte.d.ts +6 -0
- package/dist/components/calendar/calendar-root.svelte +206 -0
- package/dist/components/calendar/calendar-root.svelte.d.ts +8 -0
- package/dist/components/calendar/calendar-week-day.svelte +34 -0
- package/dist/components/calendar/calendar-week-day.svelte.d.ts +9 -0
- package/dist/components/calendar/calendar.css +26 -0
- package/dist/components/calendar/calendar.stories.svelte +31 -0
- package/dist/components/calendar/calendar.stories.svelte.d.ts +26 -0
- package/dist/components/calendar/index.d.ts +4 -0
- package/dist/components/calendar/index.js +4 -0
- package/dist/components/calendar/runes.svelte.d.ts +3 -0
- package/dist/components/calendar/runes.svelte.js +25 -0
- package/dist/components/calendar/types.d.ts +62 -0
- package/dist/components/calendar/types.js +1 -0
- package/dist/components/card/card-body.svelte +39 -39
- package/dist/components/card/card-description.svelte +41 -41
- package/dist/components/card/card-footer.svelte +41 -41
- package/dist/components/card/card-header.svelte +41 -41
- package/dist/components/card/card-media.svelte +41 -41
- package/dist/components/card/card-root.svelte +91 -91
- package/dist/components/card/card-subtitle.svelte +41 -41
- package/dist/components/card/card-title.svelte +45 -45
- package/dist/components/collapsible/collapsible-body.svelte +39 -39
- package/dist/components/collapsible/collapsible-header.svelte +39 -39
- package/dist/components/collapsible/collapsible-indicator.svelte +50 -50
- package/dist/components/collapsible/collapsible-root.svelte +66 -66
- package/dist/components/combobox/combobox-root.svelte +65 -65
- package/dist/components/container/container.stories.svelte.d.ts +1 -1
- package/dist/components/contextmenu/contextmenu-trigger.svelte.d.ts +1 -1
- package/dist/components/datagrid/bond.svelte.d.ts +2 -2
- package/dist/components/datagrid/datagrid-body.svelte +37 -37
- package/dist/components/datagrid/datagrid-checkbox.svelte +101 -101
- package/dist/components/datagrid/datagrid-footer.svelte +34 -34
- package/dist/components/datagrid/datagrid-header.svelte +49 -49
- package/dist/components/datagrid/datagrid-root.svelte +2 -2
- package/dist/components/datagrid/datagrid.css +5 -47
- package/dist/components/datagrid/td/datagrid-td.svelte +66 -66
- package/dist/components/datagrid/th/datagrid-th.svelte +106 -106
- package/dist/components/datagrid/tr/datagrid-tr.svelte +88 -88
- package/dist/components/datagrid/types.d.ts +1 -1
- package/dist/components/date-picker/atoms.d.ts +3 -0
- package/dist/components/date-picker/atoms.js +3 -0
- package/dist/components/date-picker/bond.svelte.d.ts +67 -0
- package/dist/components/date-picker/bond.svelte.js +174 -0
- package/dist/components/date-picker/date-picker-calendar.svelte +67 -0
- package/dist/components/date-picker/date-picker-calendar.svelte.d.ts +4 -0
- package/dist/components/date-picker/date-picker-header.svelte +100 -0
- package/dist/components/date-picker/date-picker-header.svelte.d.ts +4 -0
- package/dist/components/date-picker/date-picker-months.svelte +142 -0
- package/dist/components/date-picker/date-picker-months.svelte.d.ts +4 -0
- package/dist/components/date-picker/date-picker-root.svelte +95 -0
- package/dist/components/date-picker/date-picker-root.svelte.d.ts +4 -0
- package/dist/components/date-picker/date-picker-years.svelte +205 -0
- package/dist/components/date-picker/date-picker-years.svelte.d.ts +4 -0
- package/dist/components/date-picker/date-picker.stories.svelte +42 -0
- package/dist/components/date-picker/date-picker.stories.svelte.d.ts +3 -0
- package/dist/components/date-picker/index.d.ts +3 -0
- package/dist/components/date-picker/index.js +3 -0
- package/dist/components/date-picker/types.d.ts +53 -0
- package/dist/components/date-picker/types.js +1 -0
- package/dist/components/dialog/dialog-body.svelte +39 -39
- package/dist/components/dialog/dialog-close-button.svelte +58 -58
- package/dist/components/dialog/dialog-content.svelte +1 -1
- package/dist/components/dialog/dialog-description.svelte +40 -40
- package/dist/components/dialog/dialog-footer.svelte +39 -39
- package/dist/components/dialog/dialog-header.svelte +39 -39
- package/dist/components/dialog/dialog-root.svelte +110 -110
- package/dist/components/dialog/dialog-title.svelte +41 -41
- package/dist/components/drawer/drawer-backdrop.svelte +38 -38
- package/dist/components/drawer/drawer-body.svelte +42 -42
- package/dist/components/drawer/drawer-content.svelte +42 -42
- package/dist/components/drawer/drawer-description.svelte +44 -44
- package/dist/components/drawer/drawer-footer.svelte +41 -41
- package/dist/components/drawer/drawer-header.svelte +43 -43
- package/dist/components/drawer/drawer-root.svelte +93 -93
- package/dist/components/drawer/drawer-title.svelte +44 -44
- package/dist/components/dropdown/dropdown-query.svelte +54 -54
- package/dist/components/dropdown/dropdown-root.svelte +59 -59
- package/dist/components/dropdown/dropdown-trigger.svelte +41 -41
- package/dist/components/dropdown/dropdown-value.svelte +60 -60
- package/dist/components/element/types.d.ts +1 -1
- package/dist/components/form/bond.svelte.d.ts +1 -1
- package/dist/components/form/field/field-control.svelte +48 -48
- package/dist/components/form/field/field-label.svelte +24 -24
- package/dist/components/form/field/field-root.svelte +59 -59
- package/dist/components/icon/icon.svelte +44 -44
- package/dist/components/image/image.stories.svelte.d.ts +1 -1
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.js +4 -0
- package/dist/components/input/input-control.svelte +103 -103
- package/dist/components/label/label.svelte +25 -25
- package/dist/components/lazy/index.d.ts +1 -0
- package/dist/components/lazy/index.js +1 -0
- package/dist/components/lazy/lazy.stories.svelte +35 -0
- package/dist/components/lazy/lazy.stories.svelte.d.ts +19 -0
- package/dist/components/lazy/lazy.svelte +28 -0
- package/dist/components/lazy/lazy.svelte.d.ts +5 -0
- package/dist/components/lazy/types.d.ts +10 -0
- package/dist/components/lazy/types.js +1 -0
- package/dist/components/menu/menu-list.svelte +40 -39
- package/dist/components/menu/menu-list.svelte.d.ts +1 -0
- package/dist/components/popover/popover-arrow.svelte +111 -111
- package/dist/components/popover/popover-content.svelte +178 -139
- package/dist/components/popover/popover-root.svelte +16 -17
- package/dist/components/popover/popover.stories.svelte +0 -15
- package/dist/components/portal/portal-root.svelte +83 -83
- package/dist/components/portal/teleport.svelte +50 -50
- package/dist/components/qr-code/index.d.ts +2 -0
- package/dist/components/qr-code/index.js +2 -0
- package/dist/components/qr-code/qr-code.stories.svelte +27 -0
- package/dist/components/qr-code/qr-code.stories.svelte.d.ts +26 -0
- package/dist/components/qr-code/qr-code.svelte +75 -0
- package/dist/components/qr-code/qr-code.svelte.d.ts +4 -0
- package/dist/components/qr-code/types.d.ts +14 -0
- package/dist/components/qr-code/types.js +1 -0
- package/dist/components/radio/radio.svelte +109 -109
- package/dist/components/radio/types.svelte.d.ts +1 -1
- package/dist/components/scrollable/scrollable-container.svelte +82 -82
- package/dist/components/scrollable/scrollable-content.svelte +41 -41
- package/dist/components/scrollable/scrollable-root.svelte +100 -100
- package/dist/components/scrollable/scrollable-thumb.svelte +75 -75
- package/dist/components/scrollable/scrollable-track.svelte +59 -59
- package/dist/components/scrollable/scrollable.stories.svelte.d.ts +1 -1
- package/dist/components/sidebar/bond.svelte.d.ts +0 -5
- package/dist/components/sidebar/bond.svelte.js +1 -12
- package/dist/components/sidebar/sidebar-content.svelte +39 -39
- package/dist/components/sidebar/sidebar-content.svelte.d.ts +2 -2
- package/dist/components/sidebar/sidebar-root.svelte +41 -68
- package/dist/components/sidebar/sidebar-root.svelte.d.ts +2 -2
- package/dist/components/sidebar/sidebar.stories.svelte +54 -52
- package/dist/components/sidebar/types.d.ts +6 -6
- package/dist/components/tabs/tab/tab-body.svelte +52 -52
- package/dist/components/tabs/tab/tab-description.svelte +41 -41
- package/dist/components/tabs/tab/tab-header.svelte +71 -71
- package/dist/components/tabs/tab/tab-root.svelte +86 -86
- package/dist/components/toast/toast-description.svelte +38 -38
- package/dist/components/toast/toast-root.svelte +61 -61
- package/dist/components/toast/toast-title.svelte +35 -35
- package/dist/components/tree/tree-body.svelte +39 -39
- package/dist/components/tree/tree-header.svelte +54 -54
- package/dist/components/tree/tree-indicator.svelte +40 -40
- package/dist/components/tree/tree-root.svelte +65 -65
- package/dist/components/virtual/virtual-root.svelte +239 -239
- package/dist/context/preset.svelte.d.ts +1 -1
- package/dist/icons/icon-arrow-down.svelte.d.ts +1 -1
- package/dist/icons/icon-checkmark.svelte.d.ts +1 -1
- package/dist/icons/icon-close.svelte.d.ts +1 -1
- package/dist/icons/icon-more-vert.svelte.d.ts +1 -1
- package/dist/runes/container.svelte.d.ts +2 -2
- package/dist/shared/bond.svelte.d.ts +1 -1
- package/dist/utils/state.d.ts +1 -1
- package/dist/utils/state.js +2 -1
- package/llm/variants.md +650 -103
- package/package.json +465 -437
|
@@ -1,83 +1,83 @@
|
|
|
1
|
-
<script module lang="ts">
|
|
2
|
-
export type { PortalOuterProps } from './types';
|
|
3
|
-
</script>
|
|
4
|
-
|
|
5
|
-
<script lang="ts" generics="E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base">
|
|
6
|
-
import type { Snippet } from 'svelte';
|
|
7
|
-
import type { HTMLAttributes } from 'svelte/elements';
|
|
8
|
-
import type { PortalOuterProps } from './types';
|
|
9
|
-
import { PortalsBond, PortalBond, PortalState, type PortalStateProps } from '.';
|
|
10
|
-
import { RootBond } from '../root';
|
|
11
|
-
import type { RootPortals } from '../root/root.svelte';
|
|
12
|
-
import {
|
|
13
|
-
HtmlAtom,
|
|
14
|
-
type ElementType,
|
|
15
|
-
type HtmlAtomProps,
|
|
16
|
-
type Base
|
|
17
|
-
} from '../atom';
|
|
18
|
-
import { defineProperty, defineState } from '../../utils';
|
|
19
|
-
|
|
20
|
-
type Element = ElementType<E>;
|
|
21
|
-
|
|
22
|
-
let {
|
|
23
|
-
class: klass = '',
|
|
24
|
-
id,
|
|
25
|
-
factory = _factory,
|
|
26
|
-
children = undefined,
|
|
27
|
-
onmount = undefined,
|
|
28
|
-
ondestroy = undefined,
|
|
29
|
-
animate = undefined,
|
|
30
|
-
enter = undefined,
|
|
31
|
-
exit = undefined,
|
|
32
|
-
initial = undefined,
|
|
33
|
-
...restProps
|
|
34
|
-
}: PortalOuterProps<E, B> & HTMLAttributes<Element> = $props();
|
|
35
|
-
|
|
36
|
-
const rootBond = RootBond.get();
|
|
37
|
-
const portalsBond = PortalsBond.get();
|
|
38
|
-
|
|
39
|
-
const bondProps = defineState<PortalStateProps>([defineProperty('id', () => id)]);
|
|
40
|
-
const bond = factory(bondProps).share() as PortalBond;
|
|
41
|
-
|
|
42
|
-
portalsBond?.state.set(id, bond);
|
|
43
|
-
|
|
44
|
-
$effect(() => {
|
|
45
|
-
if (rootBond) {
|
|
46
|
-
rootBond.state.setPortal(id, bond);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return () => {
|
|
50
|
-
portalsBond?.state.delete(id);
|
|
51
|
-
bond.destroy();
|
|
52
|
-
};
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
const rootProps = $derived({
|
|
56
|
-
...bond.root(),
|
|
57
|
-
...restProps
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
function _factory(props: typeof bondProps) {
|
|
61
|
-
const portalState = new PortalState(() => props);
|
|
62
|
-
return new PortalBond(portalState);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export function getBond() {
|
|
66
|
-
return bond;
|
|
67
|
-
}
|
|
68
|
-
</script>
|
|
69
|
-
|
|
70
|
-
<HtmlAtom
|
|
71
|
-
{bond}
|
|
72
|
-
preset="portal"
|
|
73
|
-
class={['border-border pointer-events-none', '$preset', klass]}
|
|
74
|
-
enter={enter?.bind(bond.state)}
|
|
75
|
-
exit={exit?.bind(bond.state)}
|
|
76
|
-
initial={initial?.bind(bond.state)}
|
|
77
|
-
animate={animate?.bind(bond.state)}
|
|
78
|
-
onmount={onmount?.bind(bond.state)}
|
|
79
|
-
ondestroy={ondestroy?.bind(bond.state)}
|
|
80
|
-
{...rootProps}
|
|
81
|
-
>
|
|
82
|
-
{@render children?.()}
|
|
83
|
-
</HtmlAtom>
|
|
1
|
+
<script module lang="ts">
|
|
2
|
+
export type { PortalOuterProps } from './types';
|
|
3
|
+
</script>
|
|
4
|
+
|
|
5
|
+
<script lang="ts" generics="E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base">
|
|
6
|
+
import type { Snippet } from 'svelte';
|
|
7
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
8
|
+
import type { PortalOuterProps } from './types';
|
|
9
|
+
import { PortalsBond, PortalBond, PortalState, type PortalStateProps } from '.';
|
|
10
|
+
import { RootBond } from '../root';
|
|
11
|
+
import type { RootPortals } from '../root/root.svelte';
|
|
12
|
+
import {
|
|
13
|
+
HtmlAtom,
|
|
14
|
+
type ElementType,
|
|
15
|
+
type HtmlAtomProps,
|
|
16
|
+
type Base
|
|
17
|
+
} from '../atom';
|
|
18
|
+
import { defineProperty, defineState } from '../../utils';
|
|
19
|
+
|
|
20
|
+
type Element = ElementType<E>;
|
|
21
|
+
|
|
22
|
+
let {
|
|
23
|
+
class: klass = '',
|
|
24
|
+
id,
|
|
25
|
+
factory = _factory,
|
|
26
|
+
children = undefined,
|
|
27
|
+
onmount = undefined,
|
|
28
|
+
ondestroy = undefined,
|
|
29
|
+
animate = undefined,
|
|
30
|
+
enter = undefined,
|
|
31
|
+
exit = undefined,
|
|
32
|
+
initial = undefined,
|
|
33
|
+
...restProps
|
|
34
|
+
}: PortalOuterProps<E, B> & HTMLAttributes<Element> = $props();
|
|
35
|
+
|
|
36
|
+
const rootBond = RootBond.get();
|
|
37
|
+
const portalsBond = PortalsBond.get();
|
|
38
|
+
|
|
39
|
+
const bondProps = defineState<PortalStateProps>([defineProperty('id', () => id)]);
|
|
40
|
+
const bond = factory(bondProps).share() as PortalBond;
|
|
41
|
+
|
|
42
|
+
portalsBond?.state.set(id, bond);
|
|
43
|
+
|
|
44
|
+
$effect(() => {
|
|
45
|
+
if (rootBond) {
|
|
46
|
+
rootBond.state.setPortal(id, bond);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return () => {
|
|
50
|
+
portalsBond?.state.delete(id);
|
|
51
|
+
bond.destroy();
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
const rootProps = $derived({
|
|
56
|
+
...bond.root(),
|
|
57
|
+
...restProps
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
function _factory(props: typeof bondProps) {
|
|
61
|
+
const portalState = new PortalState(() => props);
|
|
62
|
+
return new PortalBond(portalState);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function getBond() {
|
|
66
|
+
return bond;
|
|
67
|
+
}
|
|
68
|
+
</script>
|
|
69
|
+
|
|
70
|
+
<HtmlAtom
|
|
71
|
+
{bond}
|
|
72
|
+
preset="portal"
|
|
73
|
+
class={['border-border pointer-events-none', '$preset', klass]}
|
|
74
|
+
enter={enter?.bind(bond.state)}
|
|
75
|
+
exit={exit?.bind(bond.state)}
|
|
76
|
+
initial={initial?.bind(bond.state)}
|
|
77
|
+
animate={animate?.bind(bond.state)}
|
|
78
|
+
onmount={onmount?.bind(bond.state)}
|
|
79
|
+
ondestroy={ondestroy?.bind(bond.state)}
|
|
80
|
+
{...rootProps}
|
|
81
|
+
>
|
|
82
|
+
{@render children?.()}
|
|
83
|
+
</HtmlAtom>
|
|
@@ -1,50 +1,50 @@
|
|
|
1
|
-
<script module lang="ts">
|
|
2
|
-
export type { TeleportProps } from './types';
|
|
3
|
-
</script>
|
|
4
|
-
|
|
5
|
-
<script lang="ts" generics="E extends HtmlElementTagName = 'div', B extends Base = Base">
|
|
6
|
-
import type { HTMLAttributes } from 'svelte/elements';
|
|
7
|
-
import type { TeleportProps } from './types';
|
|
8
|
-
import { HtmlAtom, type HtmlAtomProps, type Base } from '../atom';
|
|
9
|
-
import type { HtmlElementTagName, HtmlElementType } from '../element';
|
|
10
|
-
import { PortalsBond } from './portals';
|
|
11
|
-
import { RootBond } from '../root/bond.svelte';
|
|
12
|
-
import { port } from './utils';
|
|
13
|
-
import type { PortalBond } from '.';
|
|
14
|
-
|
|
15
|
-
type Element = HtmlElementType<E>;
|
|
16
|
-
|
|
17
|
-
let { portal, as, base, children, ...restProps }: TeleportProps<E, B> & HTMLAttributes<Element> =
|
|
18
|
-
$props();
|
|
19
|
-
|
|
20
|
-
const portalsBond = PortalsBond.get();
|
|
21
|
-
const rootBond = RootBond.get();
|
|
22
|
-
|
|
23
|
-
const portalBond = $derived.by(() => {
|
|
24
|
-
if (typeof portal === 'string') {
|
|
25
|
-
return portalsBond?.state?.get(portal!) ?? rootBond?.state?.getPortal(portal!);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
return portal;
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
const targetElement = $derived(portalBond?.targetElement);
|
|
32
|
-
|
|
33
|
-
function _port(node: HTMLElement) {
|
|
34
|
-
const hidden = node.hidden;
|
|
35
|
-
|
|
36
|
-
node.hidden = true;
|
|
37
|
-
|
|
38
|
-
const unport = port(node, targetElement);
|
|
39
|
-
|
|
40
|
-
node.hidden = hidden;
|
|
41
|
-
|
|
42
|
-
return unport;
|
|
43
|
-
}
|
|
44
|
-
</script>
|
|
45
|
-
|
|
46
|
-
{#if targetElement && portal}
|
|
47
|
-
<HtmlAtom {@attach _port} as={as as E} {base} {...restProps}>
|
|
48
|
-
{@render children?.({ portal: portalBond })}
|
|
49
|
-
</HtmlAtom>
|
|
50
|
-
{/if}
|
|
1
|
+
<script module lang="ts">
|
|
2
|
+
export type { TeleportProps } from './types';
|
|
3
|
+
</script>
|
|
4
|
+
|
|
5
|
+
<script lang="ts" generics="E extends HtmlElementTagName = 'div', B extends Base = Base">
|
|
6
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
7
|
+
import type { TeleportProps } from './types';
|
|
8
|
+
import { HtmlAtom, type HtmlAtomProps, type Base } from '../atom';
|
|
9
|
+
import type { HtmlElementTagName, HtmlElementType } from '../element';
|
|
10
|
+
import { PortalsBond } from './portals';
|
|
11
|
+
import { RootBond } from '../root/bond.svelte';
|
|
12
|
+
import { port } from './utils';
|
|
13
|
+
import type { PortalBond } from '.';
|
|
14
|
+
|
|
15
|
+
type Element = HtmlElementType<E>;
|
|
16
|
+
|
|
17
|
+
let { portal, as, base, children, ...restProps }: TeleportProps<E, B> & HTMLAttributes<Element> =
|
|
18
|
+
$props();
|
|
19
|
+
|
|
20
|
+
const portalsBond = PortalsBond.get();
|
|
21
|
+
const rootBond = RootBond.get();
|
|
22
|
+
|
|
23
|
+
const portalBond = $derived.by(() => {
|
|
24
|
+
if (typeof portal === 'string') {
|
|
25
|
+
return portalsBond?.state?.get(portal!) ?? rootBond?.state?.getPortal(portal!);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return portal;
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
const targetElement = $derived(portalBond?.targetElement);
|
|
32
|
+
|
|
33
|
+
function _port(node: HTMLElement) {
|
|
34
|
+
const hidden = node.hidden;
|
|
35
|
+
|
|
36
|
+
node.hidden = true;
|
|
37
|
+
|
|
38
|
+
const unport = port(node, targetElement);
|
|
39
|
+
|
|
40
|
+
node.hidden = hidden;
|
|
41
|
+
|
|
42
|
+
return unport;
|
|
43
|
+
}
|
|
44
|
+
</script>
|
|
45
|
+
|
|
46
|
+
{#if targetElement && portal}
|
|
47
|
+
<HtmlAtom {@attach _port} as={as as E} {base} {...restProps}>
|
|
48
|
+
{@render children?.({ portal: portalBond })}
|
|
49
|
+
</HtmlAtom>
|
|
50
|
+
{/if}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<script module>
|
|
2
|
+
import { defineMeta } from '@storybook/addon-svelte-csf';
|
|
3
|
+
import QrCodeComponent from './qr-code.svelte';
|
|
4
|
+
import { Root } from '../root';
|
|
5
|
+
|
|
6
|
+
const { Story } = defineMeta({
|
|
7
|
+
title: 'Atoms/QR Code'
|
|
8
|
+
});
|
|
9
|
+
</script>
|
|
10
|
+
|
|
11
|
+
<script>
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
<Story name="QR Code">
|
|
15
|
+
{#snippet children(args)}
|
|
16
|
+
<Root>
|
|
17
|
+
{#snippet children({})}
|
|
18
|
+
<div class="flex h-full w-full items-center justify-center">
|
|
19
|
+
<QrCodeComponent
|
|
20
|
+
class="text-primary-foreground bg-primary size-64 rounded-2xl p-1"
|
|
21
|
+
value="Hello World 123"
|
|
22
|
+
/>
|
|
23
|
+
</div>
|
|
24
|
+
{/snippet}
|
|
25
|
+
</Root>
|
|
26
|
+
{/snippet}
|
|
27
|
+
</Story>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export default QrCode;
|
|
2
|
+
type QrCode = SvelteComponent<{
|
|
3
|
+
[x: string]: never;
|
|
4
|
+
}, {
|
|
5
|
+
[evt: string]: CustomEvent<any>;
|
|
6
|
+
}, {}> & {
|
|
7
|
+
$$bindings?: string;
|
|
8
|
+
};
|
|
9
|
+
declare const QrCode: $$__sveltets_2_IsomorphicComponent<{
|
|
10
|
+
[x: string]: never;
|
|
11
|
+
}, {
|
|
12
|
+
[evt: string]: CustomEvent<any>;
|
|
13
|
+
}, {}, {}, string>;
|
|
14
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
15
|
+
new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
|
|
16
|
+
$$bindings?: Bindings;
|
|
17
|
+
} & Exports;
|
|
18
|
+
(internal: unknown, props: {
|
|
19
|
+
$$events?: Events;
|
|
20
|
+
$$slots?: Slots;
|
|
21
|
+
}): Exports & {
|
|
22
|
+
$set?: any;
|
|
23
|
+
$on?: any;
|
|
24
|
+
};
|
|
25
|
+
z_$$bindings?: Bindings;
|
|
26
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { QRCodeBrowser } from '@qrcode-js/browser';
|
|
3
|
+
import { HtmlAtom } from '../atom';
|
|
4
|
+
import type { QRCodeProps } from './types';
|
|
5
|
+
|
|
6
|
+
type Render = typeof QRCodeBrowser;
|
|
7
|
+
|
|
8
|
+
let {
|
|
9
|
+
class: klass = '',
|
|
10
|
+
value = '',
|
|
11
|
+
finder = {
|
|
12
|
+
round: 0.5
|
|
13
|
+
},
|
|
14
|
+
dots = {
|
|
15
|
+
scale: 0.75,
|
|
16
|
+
round: 1
|
|
17
|
+
},
|
|
18
|
+
drawFunction = 'telegram',
|
|
19
|
+
gradient = undefined,
|
|
20
|
+
logo = undefined,
|
|
21
|
+
margin = undefined,
|
|
22
|
+
qr = undefined,
|
|
23
|
+
...restProps
|
|
24
|
+
}: QRCodeProps = $props();
|
|
25
|
+
|
|
26
|
+
let canvasElement: HTMLCanvasElement | undefined = $state();
|
|
27
|
+
|
|
28
|
+
let clientWidth = $state(0);
|
|
29
|
+
let isReady = $state(false);
|
|
30
|
+
let render: Render | undefined = $state();
|
|
31
|
+
let computedColor = $state('black');
|
|
32
|
+
|
|
33
|
+
import('@qrcode-js/browser').then((result) => {
|
|
34
|
+
render = result.QRCodeBrowser;
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
$effect(() => {
|
|
38
|
+
if (!canvasElement) return;
|
|
39
|
+
if (!render) return;
|
|
40
|
+
if (!isReady) render;
|
|
41
|
+
|
|
42
|
+
// Get the computed color from the canvas element
|
|
43
|
+
computedColor = getComputedStyle(canvasElement).color;
|
|
44
|
+
|
|
45
|
+
const qrcode = render(canvasElement);
|
|
46
|
+
|
|
47
|
+
qrcode.setOptions({
|
|
48
|
+
text: value,
|
|
49
|
+
size: clientWidth,
|
|
50
|
+
color: computedColor,
|
|
51
|
+
dots,
|
|
52
|
+
finder,
|
|
53
|
+
drawFunction,
|
|
54
|
+
...(gradient && { gradient }),
|
|
55
|
+
...(margin && { margin }),
|
|
56
|
+
...(logo && { logo }),
|
|
57
|
+
...(qr && { qr })
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
qrcode.draw();
|
|
61
|
+
});
|
|
62
|
+
</script>
|
|
63
|
+
|
|
64
|
+
<HtmlAtom class={[klass]} {...restProps}>
|
|
65
|
+
<div bind:clientWidth class="size-full">
|
|
66
|
+
<canvas
|
|
67
|
+
{@attach (node) => {
|
|
68
|
+
canvasElement = node;
|
|
69
|
+
isReady = true;
|
|
70
|
+
}}
|
|
71
|
+
width={clientWidth}
|
|
72
|
+
height={clientWidth}
|
|
73
|
+
></canvas>
|
|
74
|
+
</div>
|
|
75
|
+
</HtmlAtom>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { QRCodeBrowser } from '@qrcode-js/browser';
|
|
2
|
+
type QRCodeOptions = Parameters<ReturnType<typeof QRCodeBrowser>['setOptions']>[0];
|
|
3
|
+
export type QRCodeProps = {
|
|
4
|
+
class?: string;
|
|
5
|
+
value: string;
|
|
6
|
+
finder?: QRCodeOptions['finder'];
|
|
7
|
+
dots?: QRCodeOptions['dots'];
|
|
8
|
+
drawFunction?: QRCodeOptions['drawFunction'];
|
|
9
|
+
gradient?: QRCodeOptions['gradient'];
|
|
10
|
+
logo?: QRCodeOptions['logo'];
|
|
11
|
+
margin?: QRCodeOptions['margin'];
|
|
12
|
+
qr?: QRCodeOptions['qr'];
|
|
13
|
+
};
|
|
14
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,109 +1,109 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { getRadioGroupContext } from './context';
|
|
3
|
-
import { Stack } from '../stack';
|
|
4
|
-
import { toClassValue } from '../../utils';
|
|
5
|
-
import { HtmlAtom, type Base } from '../atom';
|
|
6
|
-
|
|
7
|
-
const radioGroupContext = getRadioGroupContext();
|
|
8
|
-
|
|
9
|
-
let {
|
|
10
|
-
class: klass = '',
|
|
11
|
-
value = $bindable(undefined),
|
|
12
|
-
group = $bindable(),
|
|
13
|
-
id = undefined,
|
|
14
|
-
name = undefined,
|
|
15
|
-
disabled = false,
|
|
16
|
-
required = false,
|
|
17
|
-
readonly = false,
|
|
18
|
-
onchange = undefined,
|
|
19
|
-
oninput = undefined,
|
|
20
|
-
checkedContent = undefined,
|
|
21
|
-
...restProps
|
|
22
|
-
} = $props();
|
|
23
|
-
|
|
24
|
-
const _disabled = $derived(radioGroupContext?.disabled);
|
|
25
|
-
const _required = $derived(radioGroupContext?.required);
|
|
26
|
-
const _readonly = $derived(radioGroupContext?.readonly);
|
|
27
|
-
const _name = $derived(radioGroupContext?.name);
|
|
28
|
-
|
|
29
|
-
const proxy = {
|
|
30
|
-
get current() {
|
|
31
|
-
return radioGroupContext?.value ?? group;
|
|
32
|
-
},
|
|
33
|
-
set current(v) {
|
|
34
|
-
group = v;
|
|
35
|
-
if (radioGroupContext) {
|
|
36
|
-
radioGroupContext.value = v;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
const isDisabled = $derived(_disabled || disabled);
|
|
42
|
-
const isRequired = $derived(_required || required);
|
|
43
|
-
const isReadonly = $derived(_readonly || readonly);
|
|
44
|
-
const isChecked = $derived(proxy.current === value);
|
|
45
|
-
|
|
46
|
-
function handleChange(ev: Event) {
|
|
47
|
-
const checked = (ev.currentTarget as HTMLInputElement)?.checked ?? false;
|
|
48
|
-
|
|
49
|
-
onchange?.(ev, {
|
|
50
|
-
checked,
|
|
51
|
-
value: checked,
|
|
52
|
-
type: 'boolean'
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
function handleInput(ev: Event) {
|
|
57
|
-
const currentTarget = ev.currentTarget as HTMLInputElement;
|
|
58
|
-
const _checked = currentTarget?.checked ?? false;
|
|
59
|
-
|
|
60
|
-
oninput?.(ev, {
|
|
61
|
-
checked: _checked,
|
|
62
|
-
value: _checked,
|
|
63
|
-
type: 'boolean'
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
if (ev.defaultPrevented) {
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
</script>
|
|
71
|
-
|
|
72
|
-
<Stack.Root
|
|
73
|
-
preset="radio"
|
|
74
|
-
class={[
|
|
75
|
-
'text-foreground bg-input box-border inline-flex aspect-square size-4 max-w-fit cursor-pointer place-items-center rounded-full border p-0',
|
|
76
|
-
isDisabled && 'pointer-events-none opacity-50',
|
|
77
|
-
'$preset',
|
|
78
|
-
toClassValue.apply(null, [klass, {}])
|
|
79
|
-
]}
|
|
80
|
-
as="label"
|
|
81
|
-
{...restProps}
|
|
82
|
-
>
|
|
83
|
-
<Stack.Item class="pointer-events-none flex size-full">
|
|
84
|
-
<input
|
|
85
|
-
bind:group={proxy.current}
|
|
86
|
-
{id}
|
|
87
|
-
{value}
|
|
88
|
-
class="pointer-events-auto size-0 opacity-0"
|
|
89
|
-
type="radio"
|
|
90
|
-
name={_name ?? name}
|
|
91
|
-
disabled={isDisabled}
|
|
92
|
-
required={isRequired}
|
|
93
|
-
readonly={isReadonly}
|
|
94
|
-
onchange={handleChange}
|
|
95
|
-
oninput={handleInput}
|
|
96
|
-
/>
|
|
97
|
-
</Stack.Item>
|
|
98
|
-
|
|
99
|
-
{#if isChecked}
|
|
100
|
-
{#if checkedContent}
|
|
101
|
-
<HtmlAtom
|
|
102
|
-
class="rounded-inherit pointer-events-none size-1/2 bg-current"
|
|
103
|
-
base={checkedContent}
|
|
104
|
-
/>
|
|
105
|
-
{:else}
|
|
106
|
-
<Stack.Item class="rounded-inherit pointer-events-none size-1/2 bg-current"></Stack.Item>
|
|
107
|
-
{/if}
|
|
108
|
-
{/if}
|
|
109
|
-
</Stack.Root>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { getRadioGroupContext } from './context';
|
|
3
|
+
import { Stack } from '../stack';
|
|
4
|
+
import { toClassValue } from '../../utils';
|
|
5
|
+
import { HtmlAtom, type Base } from '../atom';
|
|
6
|
+
|
|
7
|
+
const radioGroupContext = getRadioGroupContext();
|
|
8
|
+
|
|
9
|
+
let {
|
|
10
|
+
class: klass = '',
|
|
11
|
+
value = $bindable(undefined),
|
|
12
|
+
group = $bindable(),
|
|
13
|
+
id = undefined,
|
|
14
|
+
name = undefined,
|
|
15
|
+
disabled = false,
|
|
16
|
+
required = false,
|
|
17
|
+
readonly = false,
|
|
18
|
+
onchange = undefined,
|
|
19
|
+
oninput = undefined,
|
|
20
|
+
checkedContent = undefined,
|
|
21
|
+
...restProps
|
|
22
|
+
} = $props();
|
|
23
|
+
|
|
24
|
+
const _disabled = $derived(radioGroupContext?.disabled);
|
|
25
|
+
const _required = $derived(radioGroupContext?.required);
|
|
26
|
+
const _readonly = $derived(radioGroupContext?.readonly);
|
|
27
|
+
const _name = $derived(radioGroupContext?.name);
|
|
28
|
+
|
|
29
|
+
const proxy = {
|
|
30
|
+
get current() {
|
|
31
|
+
return radioGroupContext?.value ?? group;
|
|
32
|
+
},
|
|
33
|
+
set current(v) {
|
|
34
|
+
group = v;
|
|
35
|
+
if (radioGroupContext) {
|
|
36
|
+
radioGroupContext.value = v;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const isDisabled = $derived(_disabled || disabled);
|
|
42
|
+
const isRequired = $derived(_required || required);
|
|
43
|
+
const isReadonly = $derived(_readonly || readonly);
|
|
44
|
+
const isChecked = $derived(proxy.current === value);
|
|
45
|
+
|
|
46
|
+
function handleChange(ev: Event) {
|
|
47
|
+
const checked = (ev.currentTarget as HTMLInputElement)?.checked ?? false;
|
|
48
|
+
|
|
49
|
+
onchange?.(ev, {
|
|
50
|
+
checked,
|
|
51
|
+
value: checked,
|
|
52
|
+
type: 'boolean'
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function handleInput(ev: Event) {
|
|
57
|
+
const currentTarget = ev.currentTarget as HTMLInputElement;
|
|
58
|
+
const _checked = currentTarget?.checked ?? false;
|
|
59
|
+
|
|
60
|
+
oninput?.(ev, {
|
|
61
|
+
checked: _checked,
|
|
62
|
+
value: _checked,
|
|
63
|
+
type: 'boolean'
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
if (ev.defaultPrevented) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
</script>
|
|
71
|
+
|
|
72
|
+
<Stack.Root
|
|
73
|
+
preset="radio"
|
|
74
|
+
class={[
|
|
75
|
+
'text-foreground bg-input box-border inline-flex aspect-square size-4 max-w-fit cursor-pointer place-items-center rounded-full border p-0',
|
|
76
|
+
isDisabled && 'pointer-events-none opacity-50',
|
|
77
|
+
'$preset',
|
|
78
|
+
toClassValue.apply(null, [klass, {}])
|
|
79
|
+
]}
|
|
80
|
+
as="label"
|
|
81
|
+
{...restProps}
|
|
82
|
+
>
|
|
83
|
+
<Stack.Item class="pointer-events-none flex size-full">
|
|
84
|
+
<input
|
|
85
|
+
bind:group={proxy.current}
|
|
86
|
+
{id}
|
|
87
|
+
{value}
|
|
88
|
+
class="pointer-events-auto size-0 opacity-0"
|
|
89
|
+
type="radio"
|
|
90
|
+
name={_name ?? name}
|
|
91
|
+
disabled={isDisabled}
|
|
92
|
+
required={isRequired}
|
|
93
|
+
readonly={isReadonly}
|
|
94
|
+
onchange={handleChange}
|
|
95
|
+
oninput={handleInput}
|
|
96
|
+
/>
|
|
97
|
+
</Stack.Item>
|
|
98
|
+
|
|
99
|
+
{#if isChecked}
|
|
100
|
+
{#if checkedContent}
|
|
101
|
+
<HtmlAtom
|
|
102
|
+
class="rounded-inherit pointer-events-none size-1/2 bg-current"
|
|
103
|
+
base={checkedContent}
|
|
104
|
+
/>
|
|
105
|
+
{:else}
|
|
106
|
+
<Stack.Item class="rounded-inherit pointer-events-none size-1/2 bg-current"></Stack.Item>
|
|
107
|
+
{/if}
|
|
108
|
+
{/if}
|
|
109
|
+
</Stack.Root>
|