@lightningtv/solid 2.9.4 → 2.9.6

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.
@@ -0,0 +1,17 @@
1
+ import * as s from 'solid-js';
2
+ export interface KeepAliveElement {
3
+ id: string;
4
+ owner: s.Owner | null;
5
+ children?: s.JSX.Element;
6
+ routeSignal?: s.Signal<unknown>;
7
+ dispose: () => void;
8
+ }
9
+ export declare const storeElement: (element: KeepAliveElement) => KeepAliveElement | undefined;
10
+ export declare const removeElement: (id: string) => void;
11
+ interface KeepAliveProps {
12
+ id: string;
13
+ }
14
+ export declare const KeepAliveWrapper: (Component: any) => (props: s.ParentProps<KeepAliveProps>) => () => s.JSX.Element;
15
+ export declare const KeepAlive: (props: s.ParentProps<KeepAliveProps>) => () => s.JSX.Element;
16
+ export declare const KeepAliveRoute: (props: any) => s.JSX.Element;
17
+ export {};
@@ -0,0 +1,107 @@
1
+ import { Route } from "@solidjs/router";
2
+ import * as s from 'solid-js';
3
+ const keepAliveElements = new Map();
4
+ export const storeElement = (element) => {
5
+ if (keepAliveElements.has(element.id)) {
6
+ console.warn(`[KeepAlive] Element with id "${element.id}" already in cache. Recreating.`);
7
+ removeElement(element.id);
8
+ }
9
+ keepAliveElements.set(element.id, element);
10
+ return element;
11
+ };
12
+ export const removeElement = (id) => {
13
+ const element = keepAliveElements.get(id);
14
+ if (element) {
15
+ element.dispose();
16
+ keepAliveElements.delete(id);
17
+ }
18
+ };
19
+ function wrapChildren(props) {
20
+ return (<view preserve onRemove={(elm) => (elm.alpha = 0)} onRender={(elm) => {
21
+ elm.alpha = 1;
22
+ elm.children[0]?.setFocus();
23
+ }} forwardFocus={0} transition={{ alpha: true }} {...props}/>);
24
+ }
25
+ export const KeepAliveWrapper = (Component) => {
26
+ return (props) => {
27
+ const existing = keepAliveElements.get(props.id);
28
+ if (!existing) {
29
+ s.createRoot((dispose) => {
30
+ storeElement({
31
+ id: props.id,
32
+ owner: s.getOwner(),
33
+ children: (<view preserve onRemove={(elm) => (elm.alpha = 0)} onRender={(elm) => {
34
+ elm.alpha = 1;
35
+ elm.children[0]?.setFocus();
36
+ }} forwardFocus={0} transition={{ alpha: true }}><Component {...props}/></view>),
37
+ dispose,
38
+ });
39
+ });
40
+ }
41
+ if (existing && !existing.children) {
42
+ existing.children = s.runWithOwner(existing.owner, () => wrapChildren(props));
43
+ }
44
+ return () => {
45
+ const current = keepAliveElements.get(props.id);
46
+ return current?.owner
47
+ ? s.runWithOwner(current.owner, () => current.children)
48
+ : null;
49
+ };
50
+ };
51
+ };
52
+ export const KeepAlive = (props) => {
53
+ const existing = keepAliveElements.get(props.id);
54
+ if (!existing) {
55
+ s.createRoot((dispose) => {
56
+ storeElement({
57
+ id: props.id,
58
+ owner: s.getOwner(),
59
+ children: wrapChildren(props),
60
+ dispose,
61
+ });
62
+ });
63
+ }
64
+ if (existing && !existing.children) {
65
+ existing.children = s.runWithOwner(existing.owner, () => wrapChildren(props));
66
+ }
67
+ return () => {
68
+ const current = keepAliveElements.get(props.id);
69
+ return current?.owner
70
+ ? s.runWithOwner(current.owner, () => current.children)
71
+ : null;
72
+ };
73
+ };
74
+ export const KeepAliveRoute = (props) => {
75
+ const key = props.id || props.path;
76
+ const preload = props.preload ? (preloadProps) => {
77
+ const existing = keepAliveElements.get(props.id);
78
+ if (!existing) {
79
+ s.createRoot((dispose) => {
80
+ storeElement({
81
+ id: key,
82
+ owner: s.getOwner(),
83
+ dispose,
84
+ routeSignal: s.createSignal(),
85
+ });
86
+ });
87
+ }
88
+ const current = keepAliveElements.get(key);
89
+ if (current) {
90
+ const [routeProps, setRouteProps] = current.routeSignal;
91
+ if (routeProps()) {
92
+ setRouteProps(preloadProps);
93
+ return;
94
+ }
95
+ setRouteProps(preloadProps);
96
+ return current?.owner ?
97
+ s.runWithOwner(current.owner, () => {
98
+ return props.preload(routeProps);
99
+ })
100
+ : null;
101
+ }
102
+ } : undefined;
103
+ return (<Route {...props} preload={preload} component={(childProps) => <KeepAlive id={key}>
104
+ {props.component(childProps)}
105
+ </KeepAlive>}/>);
106
+ };
107
+ //# sourceMappingURL=KeepAlive.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeepAlive.jsx","sourceRoot":"","sources":["../../../src/primitives/KeepAlive.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAU9B,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAA4B,CAAC;AAE9D,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,OAAyB,EACK,EAAE;IAChC,IAAI,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,gCAAgC,OAAO,CAAC,EAAE,iCAAiC,CAAC,CAAC;QAC1F,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IACD,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAC3C,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAAU,EAAQ,EAAE;IAChD,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,OAAO,EAAE,CAAC;QAClB,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC,CAAC;AAMF,SAAS,YAAY,CAAC,KAAK;IACzB,OAAO,CACL,CAAC,IAAI,CACH,QAAQ,CACR,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CACnC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE;YAChB,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;YACd,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;QAC9B,CAAC,CAAC,CACF,YAAY,CAAC,CAAC,CAAC,CAAC,CAChB,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAC5B,IAAI,KAAK,CAAC,EACV,CAAC,CAAA;AACP,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,SAAS,EAAE,EAAE;IAC5C,OAAO,CAAC,KAAoC,EAAE,EAAE;QAC9C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QAEhD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE;gBACvB,YAAY,CAAC;oBACX,EAAE,EAAE,KAAK,CAAC,EAAE;oBACZ,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE;oBACnB,QAAQ,EAAE,CAAC,CAAC,IAAI,CACd,QAAQ,CACR,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CACnC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE;4BAChB,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;4BACd,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;wBAC9B,CAAC,CAAC,CACF,YAAY,CAAC,CAAC,CAAC,CAAC,CAChB,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAC7B,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,EAAG,EAAE,IAAI,CAAC,CAAC;oBACjC,OAAO;iBACR,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACnC,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QAChF,CAAC;QAED,OAAO,GAAG,EAAE;YACV,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAChD,OAAO,OAAO,EAAE,KAAK;gBACnB,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;gBACvD,CAAC,CAAC,IAAI,CAAC;QACX,CAAC,CAAC;IACJ,CAAC,CAAA;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAoC,EAAE,EAAE;IAChE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAEhD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE;YACvB,YAAY,CAAC;gBACX,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE;gBACnB,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC;gBAC7B,OAAO;aACR,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACnC,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,OAAO,GAAG,EAAE;QACV,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAChD,OAAO,OAAO,EAAE,KAAK;YACnB,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;YACvD,CAAC,CAAC,IAAI,CAAC;IACX,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,EAAE;IACtC,MAAM,GAAG,GAAG,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC;IAEnC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,EAAE;QAC/C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QAEhD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE;gBACvB,YAAY,CAAC;oBACX,EAAE,EAAE,GAAG;oBACP,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE;oBACnB,OAAO;oBACP,WAAW,EAAE,CAAC,CAAC,YAAY,EAAE;iBAC9B,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,OAAO,EAAE,CAAC;YACd,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;YACxD,IAAI,UAAU,EAAE,EAAE,CAAC;gBACjB,aAAa,CAAC,YAAY,CAAC,CAAC;gBAC5B,OAAO;YACT,CAAC;YACD,aAAa,CAAC,YAAY,CAAC,CAAC;YAC5B,OAAO,OAAO,EAAE,KAAK,CAAC,CAAC;gBACrB,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE;oBACjC,OAAO,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;gBAClC,CAAC,CAAC;gBACF,CAAC,CAAC,IAAI,CAAC;QACT,CAAC;IACH,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CACrB,OAAO,CAAC,CAAC,OAAO,CAAC,CACjB,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,EAAE,CACxB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CACjB;UAAA,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAC9B;QAAA,EAAE,SAAS,CACb,CAAC,EACD,CAAC,CAAC;AACR,CAAC,CAAC"}
@@ -5,18 +5,18 @@ function createLazy(component, props, keyHandler) {
5
5
  // Need at least one item so it can be focused
6
6
  const [offset, setOffset] = createSignal(props.sync ? props.upCount : 0);
7
7
  let timeoutId = null;
8
- createRenderEffect(() => setOffset(offset => Math.max(offset, (props.selected || 0) + 1)));
9
8
  const buffer = createMemo(() => {
10
9
  if (typeof props.buffer === 'number') {
11
10
  return props.buffer;
12
11
  }
13
12
  const scroll = props.scroll || props.style?.scroll;
14
- if (scroll === 'always')
15
- return props.upCount;
13
+ if (!scroll || scroll === 'auto' || scroll === 'always')
14
+ return props.upCount + 1;
16
15
  if (scroll === 'center')
17
- return Math.ceil(props.upCount / 2);
16
+ return Math.ceil(props.upCount / 2) + 1;
18
17
  return 2;
19
18
  });
19
+ createRenderEffect(() => setOffset(offset => Math.max(offset, (props.selected || 0) + buffer())));
20
20
  if (!props.sync || props.eaglerLoad) {
21
21
  createEffect(() => {
22
22
  if (props.each) {
@@ -1 +1 @@
1
- {"version":3,"file":"Lazy.jsx","sourceRoot":"","sources":["../../../src/primitives/Lazy.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Lazy.jsx","sourceRoot":"","sources":["../../../src/primitives/Lazy.tsx"],"names":[],"mappings":"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"}
@@ -21,9 +21,9 @@ function scrollToIndex(index) {
21
21
  this.setFocus();
22
22
  }
23
23
  export const Row = (props) => {
24
- return (<view {...props} selected={props.selected || 0} onLeft={/* @once */chainFunctions(props.onLeft, onLeft)} onRight={/* @once */chainFunctions(props.onRight, onRight)} forwardFocus={/* once */onGridFocus(props.onSelectedChanged)} scrollToIndex={scrollToIndex} onLayout={
24
+ return (<view {...props} selected={props.selected || 0} onLeft={/* @once */chainFunctions(props.onLeft, onLeft)} onRight={/* @once */chainFunctions(props.onRight, onRight)} forwardFocus={/* once */onGridFocus(props.onSelectedChanged)} scrollToIndex={scrollToIndex} onCreate={
25
25
  /* @once */
26
- props.selected ? chainFunctions(props.onLayout, scroll) : props.onLayout} onSelectedChanged={
26
+ props.selected ? chainFunctions(props.onCreate, scroll) : props.onCreate} onSelectedChanged={
27
27
  /* @once */ chainFunctions(props.onSelectedChanged, props.scroll !== 'none' ? scroll : undefined)} style={/* @once */combineStyles(props.style, RowStyles)}/>);
28
28
  };
29
29
  //# sourceMappingURL=Row.jsx.map
@@ -1 +1 @@
1
- {"version":3,"file":"Row.jsx","sourceRoot":"","sources":["../../../src/primitives/Row.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAA2C,MAAM,oBAAoB,CAAC;AAC5F,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EACL,gBAAgB,EAChB,WAAW,GACZ,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGzD,MAAM,SAAS,GAAe;IAC5B,OAAO,EAAE,MAAM;IACf,GAAG,EAAE,EAAE;IACP,UAAU,EAAE;QACV,CAAC,EAAE;YACD,QAAQ,EAAE,GAAG;YACb,MAAM,EAAE,aAAa;SACtB;KACF;CACF,CAAC;AAEF,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACxC,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;AAC1C,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;AAEnC,SAAS,aAAa,CAAoB,KAAa;IACrD,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACtB,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACpB,IAAI,CAAC,QAAQ,EAAE,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,MAAM,GAAG,GAAwB,CAAC,KAAK,EAAE,EAAE;IAChD,OAAO,CACL,CAAC,IAAI,CACH,IAAI,KAAK,CAAC,CACV,QAAQ,CAAC,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,CAC9B,MAAM,CAAC,CAAC,WAAY,cAAc,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CACzD,OAAO,CAAC,CAAC,WAAY,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAC5D,YAAY,CAAC,CAAC,UAAW,WAAW,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAC9D,aAAa,CAAC,CAAC,aAAa,CAAC,CAC7B,QAAQ,CAAC,CAAC;QACR,WAAW;QACX,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAClE,CAAC,CACD,iBAAiB,CAAC,CAAC;QACjB,WAAW,CAAC,cAAc,CACxB,KAAK,CAAC,iBAAiB,EACvB,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAEhD,CAAC,CACD,KAAK,CAAC,CAAC,WAAY,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,EACzD,CACH,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"Row.jsx","sourceRoot":"","sources":["../../../src/primitives/Row.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAqC,MAAM,oBAAoB,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EACL,gBAAgB,EAChB,WAAW,GACZ,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGzD,MAAM,SAAS,GAAe;IAC5B,OAAO,EAAE,MAAM;IACf,GAAG,EAAE,EAAE;IACP,UAAU,EAAE;QACV,CAAC,EAAE;YACD,QAAQ,EAAE,GAAG;YACb,MAAM,EAAE,aAAa;SACtB;KACF;CACF,CAAC;AAEF,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACxC,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;AAC1C,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;AAEnC,SAAS,aAAa,CAAoB,KAAa;IACrD,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACtB,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACpB,IAAI,CAAC,QAAQ,EAAE,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,MAAM,GAAG,GAAwB,CAAC,KAAK,EAAE,EAAE;IAChD,OAAO,CACL,CAAC,IAAI,CACH,IAAI,KAAK,CAAC,CACV,QAAQ,CAAC,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,CAC9B,MAAM,CAAC,CAAC,WAAY,cAAc,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CACzD,OAAO,CAAC,CAAC,WAAY,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAC5D,YAAY,CAAC,CAAC,UAAW,WAAW,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAC9D,aAAa,CAAC,CAAC,aAAa,CAAC,CAC7B,QAAQ,CAAC,CAAC;QACR,WAAW;QACX,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAClE,CAAC,CACD,iBAAiB,CAAC,CAAC;QACjB,WAAW,CAAC,cAAc,CACxB,KAAK,CAAC,iBAAiB,EACvB,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAEhD,CAAC,CACD,KAAK,CAAC,CAAC,WAAY,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,EACzD,CACH,CAAC;AACJ,CAAC,CAAC"}
@@ -25,7 +25,7 @@ export function Suspense(props) {
25
25
  });
26
26
  return <>
27
27
  {suspense() ?? props.fallback}
28
- <view hidden>
28
+ <view hidden forwardFocus={0}>
29
29
  {suspense() ? null : children}
30
30
  </view>
31
31
  </>;
@@ -1 +1 @@
1
- {"version":3,"file":"Suspense.jsx","sourceRoot":"","sources":["../../../src/primitives/Suspense.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAE9B;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,QAAQ,CAAC,KAGxB;IAEC,IAAI,QAAuB,CAAC;IAE5B,IAAI,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;QACxB,IAAI,QAAQ;YACV,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAQ,CAAC,CAAC;QAC9D,CAAC;KACF,CAA+B,CAAC;IAEjC,OAAO,EACL;IAAA,CAAC,QAAQ,EAAE,IAAI,KAAK,CAAC,QAAQ,CAC7B;IAAA,CAAC,IAAI,CAAC,MAAM,CACV;MAAA,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAC/B;IAAA,EAAE,IAAI,CACR;EAAA,GAAG,CAAA;AACL,CAAC"}
1
+ {"version":3,"file":"Suspense.jsx","sourceRoot":"","sources":["../../../src/primitives/Suspense.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAE9B;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,QAAQ,CAAC,KAGxB;IAEC,IAAI,QAAuB,CAAC;IAE5B,IAAI,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;QACxB,IAAI,QAAQ;YACV,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAQ,CAAC,CAAC;QAC9D,CAAC;KACF,CAA+B,CAAC;IAEjC,OAAO,EACL;IAAA,CAAC,QAAQ,EAAE,IAAI,KAAK,CAAC,QAAQ,CAC7B;IAAA,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAC3B;MAAA,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAC/B;IAAA,EAAE,IAAI,CACR;EAAA,GAAG,CAAA;AACL,CAAC"}
@@ -0,0 +1,12 @@
1
+ import * as s from 'solid-js';
2
+ import * as lng from '@lightningtv/solid';
3
+ import * as lngp from '@lightningtv/solid/primitives';
4
+ export type VirtualGridProps<T> = lng.NewOmit<lngp.RowProps, 'children'> & {
5
+ each: readonly T[] | undefined | null | false;
6
+ itemsPerRow: number;
7
+ numberOfRows?: number;
8
+ rowsBuffer?: number;
9
+ onEndReached?: () => void;
10
+ children: (item: s.Accessor<T>, index: s.Accessor<number>) => s.JSX.Element;
11
+ };
12
+ export declare function VirtualGrid<T>(props: VirtualGridProps<T>): s.JSX.Element;
@@ -0,0 +1,135 @@
1
+ import * as s from 'solid-js';
2
+ import * as lng from '@lightningtv/solid';
3
+ import * as lngp from '@lightningtv/solid/primitives';
4
+ import { List } from '@solid-primitives/list';
5
+ import * as utils from '../utils.js';
6
+ const columnScroll = lngp.withScrolling(false);
7
+ const rowStyles = {
8
+ display: 'flex',
9
+ flexWrap: 'wrap',
10
+ gap: 30,
11
+ transition: {
12
+ y: {
13
+ duration: 250,
14
+ easing: 'ease-out',
15
+ },
16
+ },
17
+ };
18
+ function scrollToIndex(index) {
19
+ this.selected = index;
20
+ columnScroll(index, this);
21
+ this.setFocus();
22
+ }
23
+ export function VirtualGrid(props) {
24
+ const bufferSize = () => props.rowsBuffer ?? 2;
25
+ const [cursor, setCursor] = s.createSignal(props.selected ?? 0);
26
+ const items = s.createMemo(() => props.each || []);
27
+ const itemsPerRow = () => props.itemsPerRow;
28
+ const numberOfRows = () => props.numberOfRows ?? 1;
29
+ const totalVisibleItems = () => itemsPerRow() * numberOfRows();
30
+ const start = s.createMemo(() => {
31
+ const perRow = itemsPerRow();
32
+ const newRowIndex = Math.floor(cursor() / perRow);
33
+ return utils.clamp(newRowIndex * perRow - bufferSize() * perRow, 0, Math.max(0, items().length - totalVisibleItems()));
34
+ });
35
+ const end = s.createMemo(() => {
36
+ const perRow = itemsPerRow();
37
+ const newRowIndex = Math.floor(cursor() / perRow);
38
+ return Math.min(items().length, (newRowIndex + bufferSize()) * perRow + totalVisibleItems());
39
+ });
40
+ const [slice, setSlice] = s.createSignal(items().slice(start(), end()));
41
+ let viewRef;
42
+ const onLeft = lngp.handleNavigation('left');
43
+ const onRight = lngp.handleNavigation('right');
44
+ const onUp = function () {
45
+ const perRow = itemsPerRow();
46
+ const selected = this.selected || 0;
47
+ if (selected < perRow)
48
+ return false;
49
+ const newIndex = utils.clamp(selected - perRow, 0, items().length - 1);
50
+ const lastIdx = selected;
51
+ this.selected = newIndex;
52
+ const active = this.children[this.selected];
53
+ if (active instanceof lng.ElementNode) {
54
+ active.setFocus();
55
+ chainedOnSelectedChanged.call(this, this.selected, this, active, lastIdx);
56
+ }
57
+ };
58
+ const onDown = function () {
59
+ const perRow = itemsPerRow();
60
+ const selected = this.selected || 0;
61
+ const newIndex = utils.clamp(selected + perRow, 0, items().length - 1);
62
+ if (newIndex !== selected) {
63
+ const lastIdx = selected;
64
+ this.selected = newIndex;
65
+ const active = this.children[this.selected];
66
+ if (active instanceof lng.ElementNode) {
67
+ active.setFocus();
68
+ chainedOnSelectedChanged.call(this, this.selected, this, active, lastIdx);
69
+ }
70
+ }
71
+ };
72
+ const onSelectedChanged = function (_idx, elm, active, _lastIdx) {
73
+ let idx = _idx;
74
+ let lastIdx = _lastIdx;
75
+ const perRow = itemsPerRow();
76
+ const newRowIndex = Math.floor(idx / perRow);
77
+ const prevRowIndex = Math.floor((lastIdx || 0) / perRow);
78
+ const prevStart = start();
79
+ if (newRowIndex === prevRowIndex)
80
+ return;
81
+ setCursor(prevStart + idx);
82
+ setSlice(items().slice(start(), end()));
83
+ // this.selected is relative to the slice
84
+ // and it doesn't get corrected automatically after children change
85
+ const idxCorrection = prevStart - start();
86
+ if (lastIdx)
87
+ lastIdx += idxCorrection;
88
+ idx += idxCorrection;
89
+ this.selected += idxCorrection;
90
+ if (cursor() >= items().length - perRow * bufferSize()) {
91
+ props.onEndReached?.();
92
+ }
93
+ queueMicrotask(() => {
94
+ const prevRowY = this.y + active.y;
95
+ this.updateLayout();
96
+ // if (prevRowY > active.y) {
97
+ // }
98
+ this.lng.y = prevRowY - active.y;
99
+ // this.y = prevRowY - active.y;
100
+ columnScroll(idx, elm, active, lastIdx);
101
+ });
102
+ };
103
+ const chainedOnSelectedChanged = lngp.chainFunctions(props.onSelectedChanged, onSelectedChanged);
104
+ s.createEffect(s.on([() => props.selected, items], ([selected]) => {
105
+ if (!viewRef || selected == null)
106
+ return;
107
+ const item = items()[selected];
108
+ let active = viewRef.children.find(x => x.item === item);
109
+ const lastSelected = viewRef.selected;
110
+ if (active instanceof lng.ElementNode) {
111
+ viewRef.selected = viewRef.children.indexOf(active);
112
+ chainedOnSelectedChanged.call(viewRef, viewRef.selected, viewRef, active, lastSelected);
113
+ }
114
+ else {
115
+ setSlice(items().slice(start(), end()));
116
+ queueMicrotask(() => {
117
+ viewRef.updateLayout();
118
+ active = viewRef.children.find(x => x.item === item);
119
+ if (active instanceof lng.ElementNode) {
120
+ viewRef.selected = viewRef.children.indexOf(active);
121
+ chainedOnSelectedChanged.call(viewRef, viewRef.selected, viewRef, active, lastSelected);
122
+ }
123
+ });
124
+ }
125
+ }));
126
+ s.createEffect(s.on(items, () => {
127
+ if (!viewRef)
128
+ return;
129
+ setSlice(items().slice(start(), end()));
130
+ }, { defer: true }));
131
+ return (<view {...props} ref={lngp.chainRefs(el => { viewRef = el; }, props.ref)} selected={props.selected || 0} cursor={cursor()} onLeft={/* @once */lngp.chainFunctions(props.onLeft, onLeft)} onRight={/* @once */lngp.chainFunctions(props.onRight, onRight)} onUp={/* @once */lngp.chainFunctions(props.onUp, onUp)} onDown={/* @once */lngp.chainFunctions(props.onDown, onDown)} forwardFocus={/* @once */lngp.onGridFocus(chainedOnSelectedChanged)} onCreate={/* @once */props.selected ? lngp.chainFunctions(props.onCreate, columnScroll) : props.onCreate} scrollToIndex={/* @once */scrollToIndex} onSelectedChanged={/* @once */chainedOnSelectedChanged} style={/* @once */lng.combineStyles(props.style, rowStyles)}>
132
+ <List each={slice()}>{props.children}</List>
133
+ </view>);
134
+ }
135
+ //# sourceMappingURL=VirtualGrid.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VirtualGrid.jsx","sourceRoot":"","sources":["../../../src/primitives/VirtualGrid.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import * as s from 'solid-js';
2
+ import * as lng from '@lightningtv/solid';
3
+ import * as lngp from '@lightningtv/solid/primitives';
4
+ export type VirtualListProps<T> = lng.NewOmit<lngp.RowProps, 'children'> & {
5
+ each: readonly T[] | undefined | null | false;
6
+ displaySize: number;
7
+ bufferSize?: number;
8
+ fallback?: s.JSX.Element;
9
+ children: (item: s.Accessor<T>, index: s.Accessor<number>) => s.JSX.Element;
10
+ };
11
+ export declare function VirtualList<T>(props: VirtualListProps<T>): s.JSX.Element;
@@ -0,0 +1,93 @@
1
+ import * as s from 'solid-js';
2
+ import * as lng from '@lightningtv/solid';
3
+ import * as lngp from '@lightningtv/solid/primitives';
4
+ import { List } from '@solid-primitives/list';
5
+ import * as utils from '../utils.js';
6
+ const rowOnLeft = lngp.handleNavigation('left');
7
+ const rowOnRight = lngp.handleNavigation('right');
8
+ const rowScroll = lngp.withScrolling(true);
9
+ const rowStyles = {
10
+ display: 'flex',
11
+ gap: 30,
12
+ transition: {
13
+ x: {
14
+ duration: 250,
15
+ easing: 'ease-out',
16
+ },
17
+ },
18
+ };
19
+ function scrollToIndex(index) {
20
+ this.selected = index;
21
+ rowScroll(index, this);
22
+ this.setFocus();
23
+ }
24
+ export function VirtualList(props) {
25
+ const [cursor, setCursor] = s.createSignal(props.selected ?? 0);
26
+ const bufferSize = () => props.bufferSize ?? 1;
27
+ const items = s.createMemo(() => props.each || []);
28
+ const start = () => utils.clamp(cursor() - bufferSize(), 0, Math.max(0, items().length - props.displaySize - bufferSize()));
29
+ const end = () => Math.min(items().length, cursor() + props.displaySize + bufferSize());
30
+ const [slice, setSlice] = s.createSignal(items().slice(start(), end()));
31
+ s.createEffect(s.on([() => props.selected, items], ([selected]) => {
32
+ if (!viewRef || !selected)
33
+ return;
34
+ const item = items()[selected];
35
+ let active = viewRef.children.find(x => x.item === item);
36
+ const lastSelected = viewRef.selected;
37
+ if (active instanceof lng.ElementNode) {
38
+ viewRef.selected = viewRef.children.indexOf(active);
39
+ chainedOnSelectedChanged.call(viewRef, viewRef.selected, viewRef, active, lastSelected);
40
+ }
41
+ else {
42
+ setCursor(selected);
43
+ setSlice(items().slice(start(), end()));
44
+ queueMicrotask(() => {
45
+ viewRef.updateLayout();
46
+ active = viewRef.children.find(x => x.item === item);
47
+ if (active instanceof lng.ElementNode) {
48
+ viewRef.selected = viewRef.children.indexOf(active);
49
+ chainedOnSelectedChanged.call(viewRef, viewRef.selected, viewRef, active, lastSelected);
50
+ }
51
+ });
52
+ }
53
+ }));
54
+ s.createEffect(s.on(items, () => {
55
+ if (!viewRef)
56
+ return;
57
+ setSlice(items().slice(start(), end()));
58
+ }, { defer: true }));
59
+ const onSelectedChanged = function (_idx, elm, active, _lastIdx) {
60
+ let idx = _idx;
61
+ let lastIdx = _lastIdx;
62
+ const prevChildX = this.x + active.x;
63
+ const prevStart = start();
64
+ // Update the displayed slice of items
65
+ setCursor(prevStart + idx);
66
+ setSlice(items().slice(start(), end()));
67
+ // this.selected is relative to the slice
68
+ // and it doesn't get corrected automatically after children change
69
+ const idxCorrection = prevStart - start();
70
+ if (lastIdx)
71
+ lastIdx += idxCorrection;
72
+ idx += idxCorrection;
73
+ this.selected += idxCorrection;
74
+ // Microtask & this.updateLayout() to make sure the child position is recalculated
75
+ queueMicrotask(() => {
76
+ this.updateLayout();
77
+ // Correct this.x for changes to children, bypass animation
78
+ this.lng.x = prevChildX - active.x;
79
+ // smoothly scroll to new selected element
80
+ rowScroll(idx, elm, active, lastIdx);
81
+ });
82
+ };
83
+ const chainedOnSelectedChanged = lngp.chainFunctions(props.onSelectedChanged, onSelectedChanged);
84
+ let viewRef;
85
+ return <>
86
+ <view {...props} ref={lngp.chainRefs(el => { viewRef = el; }, props.ref)} selected={props.selected || 0} cursor={cursor()} onLeft={/* @once */lngp.chainFunctions(props.onLeft, rowOnLeft)} onRight={/* @once */lngp.chainFunctions(props.onRight, rowOnRight)} forwardFocus={/* once */lngp.onGridFocus(chainedOnSelectedChanged)} scrollToIndex={scrollToIndex} onCreate={/* @once */props.selected ? lngp.chainFunctions(props.onCreate, rowScroll) : props.onCreate}
87
+ /* lngp.NavigableElement.onSelectedChanged is used by lngp.handleNavigation */
88
+ onSelectedChanged={chainedOnSelectedChanged} style={/* @once */lng.combineStyles(props.style, rowStyles)}>
89
+ <List each={slice()}>{props.children}</List>
90
+ </view>
91
+ </>;
92
+ }
93
+ //# sourceMappingURL=VirtualList.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VirtualList.jsx","sourceRoot":"","sources":["../../../src/primitives/VirtualList.tsx"],"names":[],"mappings":"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"}
@@ -16,6 +16,8 @@ export * from './Suspense.jsx';
16
16
  export * from './Marquee.jsx';
17
17
  export * from './createFocusStack.jsx';
18
18
  export * from './useHold.js';
19
+ export * from './VirtualGrid.jsx';
20
+ export * from './VirtualList.jsx';
19
21
  export { withScrolling } from './utils/withScrolling.js';
20
22
  export { type AnyFunction, chainFunctions, chainRefs, } from './utils/chainFunctions.js';
21
23
  export { handleNavigation, onGridFocus } from './utils/handleNavigation.js';
@@ -16,6 +16,8 @@ export * from './Suspense.jsx';
16
16
  export * from './Marquee.jsx';
17
17
  export * from './createFocusStack.jsx';
18
18
  export * from './useHold.js';
19
+ export * from './VirtualGrid.jsx';
20
+ export * from './VirtualList.jsx';
19
21
  export { withScrolling } from './utils/withScrolling.js';
20
22
  export { chainFunctions, chainRefs, } from './utils/chainFunctions.js';
21
23
  export { handleNavigation, onGridFocus } from './utils/handleNavigation.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/primitives/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAEL,cAAc,EACd,SAAS,GACV,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAkB,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/primitives/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAEL,cAAc,EACd,SAAS,GACV,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAkB,MAAM,4BAA4B,CAAC"}
@@ -6,3 +6,4 @@ import { Accessor } from 'solid-js';
6
6
  export declare function hexColor(color?: string | number): number;
7
7
  export declare function combineStyles<T extends Styles>(style1: T | undefined, style2: T | undefined): T;
8
8
  export declare function combineStylesMemo<T extends Styles>(style1: T | undefined, style2: T | undefined): Accessor<T>;
9
+ export declare const clamp: (value: number, min?: number, max?: number) => number;
package/dist/src/utils.js CHANGED
@@ -43,4 +43,7 @@ export function combineStylesMemo(style1, style2) {
43
43
  ...style1,
44
44
  }));
45
45
  }
46
+ export const clamp = (value, min = 0, max = 100) => min < max
47
+ ? Math.min(Math.max(value, min), max)
48
+ : Math.min(Math.max(value, max), min);
46
49
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAe,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAY,UAAU,EAAE,MAAM,UAAU,CAAC;AAEhD;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,QAAyB,EAAE;IAClD,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,+BAA+B;QAC/B,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,MAAM,CACX,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAC5D,CAAC;QACJ,CAAC;QAED,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,MAAqB,EACrB,MAAqB;IAErB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,MAAO,CAAC;IACjB,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO;QACL,GAAG,MAAM;QACT,GAAG,MAAM;KACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,MAAqB,EACrB,MAAqB;IAErB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,GAAG,EAAE,CAAC,MAAO,CAAC;IACvB,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC;IACtB,CAAC;IAED,OAAO,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;QACvB,GAAG,MAAM;QACT,GAAG,MAAM;KACV,CAAC,CAAC,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAe,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAY,UAAU,EAAE,MAAM,UAAU,CAAC;AAEhD;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,QAAyB,EAAE;IAClD,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,+BAA+B;QAC/B,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,MAAM,CACX,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAC5D,CAAC;QACJ,CAAC;QAED,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,MAAqB,EACrB,MAAqB;IAErB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,MAAO,CAAC;IACjB,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO;QACL,GAAG,MAAM;QACT,GAAG,MAAM;KACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,MAAqB,EACrB,MAAqB;IAErB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,GAAG,EAAE,CAAC,MAAO,CAAC;IACvB,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC;IACtB,CAAC;IAED,OAAO,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;QACvB,GAAG,MAAM;QACT,GAAG,MAAM;KACV,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,CACzD,GAAG,GAAG,GAAG;IACP,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC;IACrC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC"}