@e280/sly 0.2.1 โ 0.2.3
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 +3 -3
- package/package.json +4 -4
- package/s/base/index.ts +1 -0
- package/s/base/types.ts +5 -0
- package/s/base/use.ts +19 -5
- package/s/dom/dom.ts +1 -1
- package/s/dom/parts/dom-scope.ts +1 -1
- package/s/loot/helpers.ts +4 -14
- package/s/view/types.ts +6 -0
- package/s/view/utils/make-view.ts +12 -2
- package/s/view/utils/parts/capsule.ts +5 -3
- package/s/view/utils/parts/directive.ts +4 -1
- package/s/view/utils/parts/naked.ts +74 -0
- package/s/view/utils/parts/sly-view.ts +6 -1
- package/x/base/index.d.ts +1 -0
- package/x/base/index.js +1 -0
- package/x/base/index.js.map +1 -1
- package/x/base/types.d.ts +3 -0
- package/x/base/types.js +3 -0
- package/x/base/types.js.map +1 -0
- package/x/base/use.d.ts +16 -2
- package/x/base/use.js +18 -4
- package/x/base/use.js.map +1 -1
- package/x/demo/demo.bundle.min.js +15 -15
- package/x/demo/demo.bundle.min.js.map +4 -4
- package/x/dom/dom.d.ts +1 -1
- package/x/dom/dom.js.map +1 -1
- package/x/dom/parts/dom-scope.d.ts +1 -1
- package/x/dom/parts/dom-scope.js.map +1 -1
- package/x/index.html +2 -2
- package/x/loot/helpers.js +4 -9
- package/x/loot/helpers.js.map +1 -1
- package/x/view/types.d.ts +5 -0
- package/x/view/utils/make-view.js +9 -1
- package/x/view/utils/make-view.js.map +1 -1
- package/x/view/utils/parts/capsule.d.ts +2 -3
- package/x/view/utils/parts/capsule.js +5 -4
- package/x/view/utils/parts/capsule.js.map +1 -1
- package/x/view/utils/parts/directive.js +3 -1
- package/x/view/utils/parts/directive.js.map +1 -1
- package/x/view/utils/parts/naked.d.ts +18 -0
- package/x/view/utils/parts/naked.js +57 -0
- package/x/view/utils/parts/naked.js.map +1 -0
- package/x/view/utils/parts/sly-view.d.ts +1 -0
- package/x/view/utils/parts/sly-view.js +4 -1
- package/x/view/utils/parts/sly-view.js.map +1 -1
package/README.md
CHANGED
|
@@ -4,9 +4,8 @@
|
|
|
4
4
|
# ๐ฆ sly
|
|
5
5
|
> *mischievous shadow views*
|
|
6
6
|
|
|
7
|
-
[@e280](https://e280.org/)'s new [lit](https://lit.dev/)-based frontend webdev library.
|
|
7
|
+
[@e280](https://e280.org/)'s new [lit](https://lit.dev/)-based frontend webdev library.
|
|
8
8
|
|
|
9
|
-
- **โจ[shiny](https://shiny.e280.org/)โจ** โ our wip component library https://shiny.e280.org/
|
|
10
9
|
- ๐ [**#views**](#views) โ shadow-dom'd, hooks-based, componentizable
|
|
11
10
|
- ๐ชต [**#base-element**](#base-element) โ for a more classical experience
|
|
12
11
|
- ๐ช [**#dom**](#dom) โ the "it's not jquery" multitool
|
|
@@ -14,7 +13,8 @@
|
|
|
14
13
|
- โณ [**#loaders**](#loaders) โ animated loading spinners for rendering ops
|
|
15
14
|
- ๐
[**#spa**](#spa) โ hash routing for your spa-day
|
|
16
15
|
- ๐ช [**#loot**](#loot) โ drag-and-drop facilities
|
|
17
|
-
- ๐งช
|
|
16
|
+
- ๐งช https://sly.e280.org/ โ our testing page
|
|
17
|
+
- **โจ[shiny](https://shiny.e280.org/)โจ** โ our wip component library
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@e280/sly",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3",
|
|
4
4
|
"description": "web shadow views",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -23,12 +23,12 @@
|
|
|
23
23
|
"lit": "^3.3.1"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@e280/strata": "^0.2.
|
|
27
|
-
"@e280/stz": "^0.2.
|
|
26
|
+
"@e280/strata": "^0.2.4",
|
|
27
|
+
"@e280/stz": "^0.2.15"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@e280/science": "^0.1.4",
|
|
31
|
-
"@e280/scute": "^0.1.
|
|
31
|
+
"@e280/scute": "^0.1.2",
|
|
32
32
|
"http-server": "^14.1.1",
|
|
33
33
|
"npm-run-all": "^4.1.5",
|
|
34
34
|
"typescript": "^5.9.3"
|
package/s/base/index.ts
CHANGED
package/s/base/types.ts
ADDED
package/s/base/use.ts
CHANGED
|
@@ -49,35 +49,47 @@ export class Use {
|
|
|
49
49
|
this.attrs = useAttrs(this)
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
+
/** number of times this view has been rendered */
|
|
52
53
|
get renderCount() {
|
|
53
54
|
return this.#runs
|
|
54
55
|
}
|
|
55
56
|
|
|
57
|
+
/** promise that resolves when this view next renders */
|
|
56
58
|
get rendered() {
|
|
57
59
|
return this.#rendered.promise
|
|
58
60
|
}
|
|
59
61
|
|
|
62
|
+
/** set the 'name' html attribute on the host element */
|
|
60
63
|
name(name: string) {
|
|
61
64
|
this.once(() => this.element.setAttribute("view", name))
|
|
62
65
|
}
|
|
63
66
|
|
|
67
|
+
/** attach stylesheets into the view's shadow dom */
|
|
64
68
|
styles(...styles: CSSResultGroup[]) {
|
|
65
69
|
this.once(() => applyStyles(this.shadow, styles))
|
|
66
70
|
}
|
|
67
71
|
|
|
68
|
-
/** alias for 'styles' */
|
|
72
|
+
/** attach stylesheets into the view's shadow dom (alias for 'styles') */
|
|
69
73
|
css(...styles: CSSResultGroup[]) {
|
|
70
74
|
return this.styles(...styles)
|
|
71
75
|
}
|
|
72
76
|
|
|
77
|
+
/** run a fn at initialization, and return a value */
|
|
73
78
|
once<V>(fn: () => V) {
|
|
74
79
|
return this.#values.guarantee(this.#position++, fn) as V
|
|
75
80
|
}
|
|
76
81
|
|
|
82
|
+
/** setup a mount/unmount lifecycle (your mount fn returns an unmount fn) */
|
|
77
83
|
mount(fn: () => () => void) {
|
|
78
84
|
return this.once(() => this.#mounts.mount(fn))
|
|
79
85
|
}
|
|
80
86
|
|
|
87
|
+
/** run fn each time mounted, return a value */
|
|
88
|
+
wake<V>(fn: () => V) {
|
|
89
|
+
return this.life(() => [fn(), () => {}])
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** mount/unmount lifecycle, but also return a value */
|
|
81
93
|
life<V>(fn: () => [result: V, dispose: () => void]) {
|
|
82
94
|
let r: V | undefined
|
|
83
95
|
this.mount(() => {
|
|
@@ -88,18 +100,17 @@ export class Use {
|
|
|
88
100
|
return r as V
|
|
89
101
|
}
|
|
90
102
|
|
|
91
|
-
|
|
92
|
-
return this.life(() => [fn(), () => {}])
|
|
93
|
-
}
|
|
94
|
-
|
|
103
|
+
/** attach event listeners on mount (they get cleaned up on unmount) */
|
|
95
104
|
events(spec: EveSpec) {
|
|
96
105
|
return this.mount(() => eve(this.element, spec))
|
|
97
106
|
}
|
|
98
107
|
|
|
108
|
+
/** helper for setting up internal states (its a dom api, look up `ElementInternals: states`) */
|
|
99
109
|
states<S extends string = string>() {
|
|
100
110
|
return this.once(() => new States<S>(this.element))
|
|
101
111
|
}
|
|
102
112
|
|
|
113
|
+
/** setup typed html attribute access */
|
|
103
114
|
op = (() => {
|
|
104
115
|
const that = this
|
|
105
116
|
function op<V>(f: () => Promise<V>) {
|
|
@@ -110,6 +121,7 @@ export class Use {
|
|
|
110
121
|
return op
|
|
111
122
|
})()
|
|
112
123
|
|
|
124
|
+
/** use a strata signal */
|
|
113
125
|
signal = (() => {
|
|
114
126
|
const that = this
|
|
115
127
|
function sig<V>(value: V, options?: Partial<SignalOptions>) {
|
|
@@ -124,10 +136,12 @@ export class Use {
|
|
|
124
136
|
return sig
|
|
125
137
|
})()
|
|
126
138
|
|
|
139
|
+
/** use a derived strata signal */
|
|
127
140
|
derived<V>(formula: () => V, options?: Partial<SignalOptions>) {
|
|
128
141
|
return this.once(() => signal.derived<V>(formula, options))
|
|
129
142
|
}
|
|
130
143
|
|
|
144
|
+
/** use a lazy strata signal */
|
|
131
145
|
lazy<V>(formula: () => V, options?: Partial<SignalOptions>) {
|
|
132
146
|
return this.once(() => signal.lazy<V>(formula, options))
|
|
133
147
|
}
|
package/s/dom/dom.ts
CHANGED
|
@@ -15,7 +15,7 @@ export function dom<E extends Element>(selector: string, container: Queryable =
|
|
|
15
15
|
return queryRequire<E>(selector, container)
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
dom.in = <E extends
|
|
18
|
+
dom.in = <E extends Queryable>(selectorOrElement: string | E, container: Queryable = document) => {
|
|
19
19
|
return new Dom(container).in(selectorOrElement)
|
|
20
20
|
}
|
|
21
21
|
|
package/s/dom/parts/dom-scope.ts
CHANGED
|
@@ -11,7 +11,7 @@ export class Dom<C extends Queryable> {
|
|
|
11
11
|
|
|
12
12
|
constructor(public element: C) {}
|
|
13
13
|
|
|
14
|
-
in<E extends
|
|
14
|
+
in<E extends Queryable>(selectorOrElement: string | E) {
|
|
15
15
|
return new Dom<E>(
|
|
16
16
|
(typeof selectorOrElement === "string")
|
|
17
17
|
? queryRequire(selectorOrElement, this.element) as E
|
package/s/loot/helpers.ts
CHANGED
|
@@ -13,19 +13,9 @@ export function files(event: DragEvent) {
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
export function outsideCurrentTarget(event: DragEvent) {
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
)
|
|
20
|
-
|
|
21
|
-
if (isCursorOutsideViewport)
|
|
22
|
-
return true
|
|
23
|
-
|
|
24
|
-
const rect = (event.currentTarget as any).getBoundingClientRect()
|
|
25
|
-
const withinX = event.clientX >= rect.left && event.clientX <= rect.right
|
|
26
|
-
const withinY = event.clientY >= rect.top && event.clientY <= rect.bottom
|
|
27
|
-
const cursorOutsideCurrentTarget = !(withinX && withinY)
|
|
28
|
-
|
|
29
|
-
return cursorOutsideCurrentTarget
|
|
16
|
+
const currentTarget = event.currentTarget as HTMLElement
|
|
17
|
+
const relatedTarget = event.relatedTarget as HTMLElement
|
|
18
|
+
const nulled = !currentTarget || !relatedTarget
|
|
19
|
+
return nulled || !currentTarget.contains(relatedTarget)
|
|
30
20
|
}
|
|
31
21
|
|
package/s/view/types.ts
CHANGED
|
@@ -24,6 +24,7 @@ export type View<Props extends any[]> = {
|
|
|
24
24
|
ComponentClass<B, Props>
|
|
25
25
|
)
|
|
26
26
|
}
|
|
27
|
+
naked: (host: HTMLElement) => NakedView<Props>
|
|
27
28
|
}
|
|
28
29
|
|
|
29
30
|
export type ViewProps<V extends View<any>> = (
|
|
@@ -37,3 +38,8 @@ export type ComponentClass<B extends Constructor<BaseElement>, Props extends any
|
|
|
37
38
|
new(): InstanceType<B>
|
|
38
39
|
} & B
|
|
39
40
|
|
|
41
|
+
export type NakedView<Props extends any[]> = {
|
|
42
|
+
host: HTMLElement
|
|
43
|
+
render: (...props: Props) => void
|
|
44
|
+
}
|
|
45
|
+
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
|
|
2
2
|
import {Constructor} from "@e280/stz"
|
|
3
3
|
import {DirectiveResult} from "lit/async-directive.js"
|
|
4
|
-
|
|
4
|
+
|
|
5
|
+
import {NakedView, View, ViewFn} from "../types.js"
|
|
5
6
|
import {ViewChain} from "./parts/chain.js"
|
|
6
|
-
import {BaseElement} from "../../base/element.js"
|
|
7
7
|
import {ViewContext} from "./parts/context.js"
|
|
8
|
+
import {BaseElement} from "../../base/element.js"
|
|
8
9
|
import {makeComponent} from "./make-component.js"
|
|
9
10
|
import {makeViewDirective} from "./parts/directive.js"
|
|
11
|
+
import {NakedContext, NakedCapsule} from "./parts/naked.js"
|
|
10
12
|
|
|
11
13
|
export function makeView<Props extends any[]>(
|
|
12
14
|
viewFn: ViewFn<Props>,
|
|
@@ -43,6 +45,14 @@ export function makeView<Props extends any[]>(
|
|
|
43
45
|
)
|
|
44
46
|
})
|
|
45
47
|
|
|
48
|
+
v.naked = (host: HTMLElement): NakedView<Props> => {
|
|
49
|
+
const naked = new NakedCapsule(host, viewFn, settings)
|
|
50
|
+
return {
|
|
51
|
+
host,
|
|
52
|
+
render: (...props: Props) => naked.update(new NakedContext(props)),
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
46
56
|
return v
|
|
47
57
|
}
|
|
48
58
|
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
|
|
2
2
|
import {debounce} from "@e280/stz"
|
|
3
3
|
import {ViewFn} from "../../types.js"
|
|
4
|
-
import {SlyView} from "./sly-view.js"
|
|
5
4
|
import {dom} from "../../../dom/dom.js"
|
|
6
5
|
import {ViewContext} from "./context.js"
|
|
7
6
|
import {Reactor} from "../../../base/utils/reactor.js"
|
|
@@ -11,18 +10,20 @@ import {_disconnect, _reconnect, _wrap, Use} from "../../../base/use.js"
|
|
|
11
10
|
|
|
12
11
|
/** controls the rendering of view context into an element. */
|
|
13
12
|
export class ViewCapsule<Props extends any[]> {
|
|
14
|
-
#element
|
|
13
|
+
#element: HTMLElement
|
|
15
14
|
#reactor = new Reactor()
|
|
16
15
|
|
|
17
16
|
#use: Use
|
|
18
17
|
#shadow: ShadowRoot
|
|
19
18
|
#context!: ViewContext<Props>
|
|
20
|
-
#attrWatcher
|
|
19
|
+
#attrWatcher: AttrWatcher
|
|
21
20
|
|
|
22
21
|
constructor(
|
|
22
|
+
host: HTMLElement,
|
|
23
23
|
private viewFn: ViewFn<Props>,
|
|
24
24
|
private settings: ShadowRootInit,
|
|
25
25
|
) {
|
|
26
|
+
this.#element = host
|
|
26
27
|
this.#shadow = this.#element.attachShadow(this.settings)
|
|
27
28
|
this.#use = new Use(
|
|
28
29
|
this.#element,
|
|
@@ -30,6 +31,7 @@ export class ViewCapsule<Props extends any[]> {
|
|
|
30
31
|
this.#renderNow,
|
|
31
32
|
this.#renderDebounced,
|
|
32
33
|
)
|
|
34
|
+
this.#attrWatcher = new AttrWatcher(this.#element, () => this.#renderDebounced())
|
|
33
35
|
}
|
|
34
36
|
|
|
35
37
|
update(context: ViewContext<Props>) {
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
|
|
2
2
|
import {AsyncDirective, directive, DirectiveResult} from "lit/async-directive.js"
|
|
3
|
+
|
|
4
|
+
import {SlyView} from "./sly-view.js"
|
|
3
5
|
import {ViewFn} from "../../types.js"
|
|
4
6
|
import {ViewCapsule} from "./capsule.js"
|
|
5
7
|
import {ViewContext} from "./context.js"
|
|
@@ -11,7 +13,8 @@ export function makeViewDirective<Props extends any[]>(
|
|
|
11
13
|
) {
|
|
12
14
|
|
|
13
15
|
return directive(class ViewDirective extends AsyncDirective {
|
|
14
|
-
#
|
|
16
|
+
#host = SlyView.make()
|
|
17
|
+
#capsule = new ViewCapsule(this.#host, viewFn, settings)
|
|
15
18
|
|
|
16
19
|
render(context: ViewContext<Props>) {
|
|
17
20
|
return this.#capsule.update(context)
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
|
|
2
|
+
import {debounce} from "@e280/stz"
|
|
3
|
+
import {ViewFn} from "../../types.js"
|
|
4
|
+
import {dom} from "../../../dom/dom.js"
|
|
5
|
+
import {AttrValue} from "../../../dom/types.js"
|
|
6
|
+
import {Reactor} from "../../../base/utils/reactor.js"
|
|
7
|
+
import {attrSet} from "../../../dom/attrs/parts/attr-fns.js"
|
|
8
|
+
import {AttrWatcher} from "../../../base/utils/attr-watcher.js"
|
|
9
|
+
import {_disconnect, _reconnect, _wrap, Use} from "../../../base/use.js"
|
|
10
|
+
|
|
11
|
+
/** the information we need to render a view. */
|
|
12
|
+
export class NakedContext<Props extends any[]> {
|
|
13
|
+
attrs = new Map<string, AttrValue>()
|
|
14
|
+
constructor(public props: Props) {}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** controls the rendering of view context into an element. */
|
|
18
|
+
export class NakedCapsule<Props extends any[]> {
|
|
19
|
+
#element: HTMLElement
|
|
20
|
+
#reactor = new Reactor()
|
|
21
|
+
|
|
22
|
+
#use: Use
|
|
23
|
+
#shadow: ShadowRoot
|
|
24
|
+
#context!: NakedContext<Props>
|
|
25
|
+
#attrWatcher: AttrWatcher
|
|
26
|
+
|
|
27
|
+
constructor(
|
|
28
|
+
host: HTMLElement,
|
|
29
|
+
private viewFn: ViewFn<Props>,
|
|
30
|
+
private settings: ShadowRootInit,
|
|
31
|
+
) {
|
|
32
|
+
this.#element = host
|
|
33
|
+
this.#shadow = this.#element.attachShadow(this.settings)
|
|
34
|
+
this.#use = new Use(
|
|
35
|
+
this.#element,
|
|
36
|
+
this.#shadow,
|
|
37
|
+
this.#renderNow,
|
|
38
|
+
this.#renderDebounced,
|
|
39
|
+
)
|
|
40
|
+
this.#attrWatcher = new AttrWatcher(this.#element, () => this.#renderDebounced())
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
update(context: NakedContext<Props>) {
|
|
44
|
+
this.#context = context
|
|
45
|
+
this.#renderNow()
|
|
46
|
+
return this.#element
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
#renderNow = () => {
|
|
50
|
+
this.#use[_wrap](() => {
|
|
51
|
+
const content = this.#reactor.effect(
|
|
52
|
+
() => this.viewFn(this.#use)(...this.#context.props),
|
|
53
|
+
() => this.#renderDebounced(),
|
|
54
|
+
)
|
|
55
|
+
attrSet.entries(this.#element, this.#context.attrs)
|
|
56
|
+
dom.render(this.#shadow, content)
|
|
57
|
+
this.#attrWatcher.start()
|
|
58
|
+
})
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
#renderDebounced = debounce(0, this.#renderNow)
|
|
62
|
+
|
|
63
|
+
disconnected() {
|
|
64
|
+
this.#use[_disconnect]()
|
|
65
|
+
this.#reactor.clear()
|
|
66
|
+
this.#attrWatcher.stop()
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
reconnected() {
|
|
70
|
+
this.#use[_reconnect]()
|
|
71
|
+
this.#attrWatcher.start()
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
@@ -4,11 +4,16 @@ import {dom} from "../../../dom/dom.js"
|
|
|
4
4
|
/** <sly-view> element that views are rendered into. */
|
|
5
5
|
export class SlyView extends HTMLElement {
|
|
6
6
|
static #registered = false
|
|
7
|
-
|
|
7
|
+
|
|
8
|
+
static register() {
|
|
8
9
|
if (!this.#registered) {
|
|
9
10
|
dom.register({SlyView}, {soft: true, upgrade: true})
|
|
10
11
|
this.#registered = true
|
|
11
12
|
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
static make() {
|
|
16
|
+
this.register()
|
|
12
17
|
return document.createElement("sly-view") as SlyView
|
|
13
18
|
}
|
|
14
19
|
}
|
package/x/base/index.d.ts
CHANGED
package/x/base/index.js
CHANGED
package/x/base/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../s/base/index.ts"],"names":[],"mappings":"AACA,cAAc,mBAAmB,CAAA;AACjC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../s/base/index.ts"],"names":[],"mappings":"AACA,cAAc,mBAAmB,CAAA;AACjC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA"}
|
package/x/base/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../s/base/types.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAAG,CAAI,IAAa,EAAE,EAAE,CAAC,IAAI,CAAA;AAChD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAI,EAAiB,EAAE,EAAE,CAAC,EAAE,CAAA"}
|
package/x/base/use.d.ts
CHANGED
|
@@ -18,28 +18,42 @@ export declare class Use {
|
|
|
18
18
|
[_disconnect](): void;
|
|
19
19
|
[_reconnect](): void;
|
|
20
20
|
constructor(element: HTMLElement, shadow: ShadowRoot, renderNow: () => void, render: () => Promise<void>);
|
|
21
|
+
/** number of times this view has been rendered */
|
|
21
22
|
get renderCount(): number;
|
|
23
|
+
/** promise that resolves when this view next renders */
|
|
22
24
|
get rendered(): Promise<void>;
|
|
25
|
+
/** set the 'name' html attribute on the host element */
|
|
23
26
|
name(name: string): void;
|
|
27
|
+
/** attach stylesheets into the view's shadow dom */
|
|
24
28
|
styles(...styles: CSSResultGroup[]): void;
|
|
25
|
-
/** alias for 'styles' */
|
|
29
|
+
/** attach stylesheets into the view's shadow dom (alias for 'styles') */
|
|
26
30
|
css(...styles: CSSResultGroup[]): void;
|
|
31
|
+
/** run a fn at initialization, and return a value */
|
|
27
32
|
once<V>(fn: () => V): V;
|
|
33
|
+
/** setup a mount/unmount lifecycle (your mount fn returns an unmount fn) */
|
|
28
34
|
mount(fn: () => () => void): void;
|
|
29
|
-
|
|
35
|
+
/** run fn each time mounted, return a value */
|
|
30
36
|
wake<V>(fn: () => V): V;
|
|
37
|
+
/** mount/unmount lifecycle, but also return a value */
|
|
38
|
+
life<V>(fn: () => [result: V, dispose: () => void]): V;
|
|
39
|
+
/** attach event listeners on mount (they get cleaned up on unmount) */
|
|
31
40
|
events(spec: EveSpec): void;
|
|
41
|
+
/** helper for setting up internal states (its a dom api, look up `ElementInternals: states`) */
|
|
32
42
|
states<S extends string = string>(): States<S>;
|
|
43
|
+
/** setup typed html attribute access */
|
|
33
44
|
op: {
|
|
34
45
|
<V>(f: () => Promise<V>): Op<V>;
|
|
35
46
|
load: <V>(f: () => Promise<V>) => Op<V>;
|
|
36
47
|
promise<V>(p: Promise<V>): Op<V>;
|
|
37
48
|
};
|
|
49
|
+
/** use a strata signal */
|
|
38
50
|
signal: {
|
|
39
51
|
<V>(value: V, options?: Partial<SignalOptions>): import("@e280/strata/signals").SignalFn<V>;
|
|
40
52
|
derived<V>(formula: () => V, options?: Partial<SignalOptions>): import("@e280/strata/signals").DerivedFn<V>;
|
|
41
53
|
lazy<V>(formula: () => V, options?: Partial<SignalOptions>): import("@e280/strata/signals").LazyFn<V>;
|
|
42
54
|
};
|
|
55
|
+
/** use a derived strata signal */
|
|
43
56
|
derived<V>(formula: () => V, options?: Partial<SignalOptions>): import("@e280/strata/signals").DerivedFn<V>;
|
|
57
|
+
/** use a lazy strata signal */
|
|
44
58
|
lazy<V>(formula: () => V, options?: Partial<SignalOptions>): import("@e280/strata/signals").LazyFn<V>;
|
|
45
59
|
}
|
package/x/base/use.js
CHANGED
|
@@ -43,28 +43,39 @@ export class Use {
|
|
|
43
43
|
this.render = render;
|
|
44
44
|
this.attrs = useAttrs(this);
|
|
45
45
|
}
|
|
46
|
+
/** number of times this view has been rendered */
|
|
46
47
|
get renderCount() {
|
|
47
48
|
return this.#runs;
|
|
48
49
|
}
|
|
50
|
+
/** promise that resolves when this view next renders */
|
|
49
51
|
get rendered() {
|
|
50
52
|
return this.#rendered.promise;
|
|
51
53
|
}
|
|
54
|
+
/** set the 'name' html attribute on the host element */
|
|
52
55
|
name(name) {
|
|
53
56
|
this.once(() => this.element.setAttribute("view", name));
|
|
54
57
|
}
|
|
58
|
+
/** attach stylesheets into the view's shadow dom */
|
|
55
59
|
styles(...styles) {
|
|
56
60
|
this.once(() => applyStyles(this.shadow, styles));
|
|
57
61
|
}
|
|
58
|
-
/** alias for 'styles' */
|
|
62
|
+
/** attach stylesheets into the view's shadow dom (alias for 'styles') */
|
|
59
63
|
css(...styles) {
|
|
60
64
|
return this.styles(...styles);
|
|
61
65
|
}
|
|
66
|
+
/** run a fn at initialization, and return a value */
|
|
62
67
|
once(fn) {
|
|
63
68
|
return this.#values.guarantee(this.#position++, fn);
|
|
64
69
|
}
|
|
70
|
+
/** setup a mount/unmount lifecycle (your mount fn returns an unmount fn) */
|
|
65
71
|
mount(fn) {
|
|
66
72
|
return this.once(() => this.#mounts.mount(fn));
|
|
67
73
|
}
|
|
74
|
+
/** run fn each time mounted, return a value */
|
|
75
|
+
wake(fn) {
|
|
76
|
+
return this.life(() => [fn(), () => { }]);
|
|
77
|
+
}
|
|
78
|
+
/** mount/unmount lifecycle, but also return a value */
|
|
68
79
|
life(fn) {
|
|
69
80
|
let r;
|
|
70
81
|
this.mount(() => {
|
|
@@ -74,15 +85,15 @@ export class Use {
|
|
|
74
85
|
});
|
|
75
86
|
return r;
|
|
76
87
|
}
|
|
77
|
-
|
|
78
|
-
return this.life(() => [fn(), () => { }]);
|
|
79
|
-
}
|
|
88
|
+
/** attach event listeners on mount (they get cleaned up on unmount) */
|
|
80
89
|
events(spec) {
|
|
81
90
|
return this.mount(() => eve(this.element, spec));
|
|
82
91
|
}
|
|
92
|
+
/** helper for setting up internal states (its a dom api, look up `ElementInternals: states`) */
|
|
83
93
|
states() {
|
|
84
94
|
return this.once(() => new States(this.element));
|
|
85
95
|
}
|
|
96
|
+
/** setup typed html attribute access */
|
|
86
97
|
op = (() => {
|
|
87
98
|
const that = this;
|
|
88
99
|
function op(f) {
|
|
@@ -92,6 +103,7 @@ export class Use {
|
|
|
92
103
|
op.promise = (p) => this.once(() => Op.promise(p));
|
|
93
104
|
return op;
|
|
94
105
|
})();
|
|
106
|
+
/** use a strata signal */
|
|
95
107
|
signal = (() => {
|
|
96
108
|
const that = this;
|
|
97
109
|
function sig(value, options) {
|
|
@@ -105,9 +117,11 @@ export class Use {
|
|
|
105
117
|
};
|
|
106
118
|
return sig;
|
|
107
119
|
})();
|
|
120
|
+
/** use a derived strata signal */
|
|
108
121
|
derived(formula, options) {
|
|
109
122
|
return this.once(() => signal.derived(formula, options));
|
|
110
123
|
}
|
|
124
|
+
/** use a lazy strata signal */
|
|
111
125
|
lazy(formula, options) {
|
|
112
126
|
return this.once(() => signal.lazy(formula, options));
|
|
113
127
|
}
|
package/x/base/use.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use.js","sourceRoot":"","sources":["../../s/base/use.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,KAAK,EAAE,IAAI,EAAC,MAAM,WAAW,CAAA;AACrC,OAAO,EAAC,MAAM,EAAgB,MAAM,sBAAsB,CAAA;AAE1D,OAAO,EAAC,EAAE,EAAC,MAAM,cAAc,CAAA;AAC/B,OAAO,EAAC,MAAM,EAAC,MAAM,mBAAmB,CAAA;AACxC,OAAO,EAAC,MAAM,EAAC,MAAM,mBAAmB,CAAA;AACxC,OAAO,EAAC,GAAG,EAAU,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAC,WAAW,EAAC,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAC,QAAQ,EAAW,MAAM,sBAAsB,CAAA;AAEvD,MAAM,CAAC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAA;AAC7B,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,EAAE,CAAA;AACnC,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,EAAE,CAAA;AAElC,MAAM,OAAO,GAAG;IA2BN;IACA;IACA;IACA;IA7BA,KAAK,CAAU;IAExB,KAAK,GAAG,CAAC,CAAA;IACT,SAAS,GAAG,CAAC,CAAA;IACb,OAAO,GAAG,IAAI,IAAI,EAAe,CAAA;IACjC,SAAS,GAAG,KAAK,EAAE,CAAA;IACnB,OAAO,GAAG,IAAI,MAAM,EAAE,CAErB;IAAA,CAAC,KAAK,CAAC,CAAI,EAAW;QACtB,IAAI,CAAC,KAAK,EAAE,CAAA;QACZ,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;QAClB,IAAI,CAAC,SAAS,GAAG,KAAK,EAAE,CAAA;QACxB,MAAM,MAAM,GAAG,EAAE,EAAE,CAAA;QACnB,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAA;QACxB,OAAO,MAAM,CAAA;IACd,CAAC;IAED,CAAC;IAAA,CAAC,WAAW,CAAC;QACb,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAA;IAC1B,CAAC;IAED,CAAC;IAAA,CAAC,UAAU,CAAC;QACZ,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAA;IAC1B,CAAC;IAED,YACS,OAAoB,EACpB,MAAkB,EAClB,SAAqB,EACrB,MAA2B;QAH3B,YAAO,GAAP,OAAO,CAAa;QACpB,WAAM,GAAN,MAAM,CAAY;QAClB,cAAS,GAAT,SAAS,CAAY;QACrB,WAAM,GAAN,MAAM,CAAqB;QAEnC,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC5B,CAAC;IAED,IAAI,WAAW;QACd,OAAO,IAAI,CAAC,KAAK,CAAA;IAClB,CAAC;IAED,IAAI,QAAQ;QACX,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAA;IAC9B,CAAC;IAED,IAAI,CAAC,IAAY;QAChB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;IACzD,CAAC;IAED,MAAM,CAAC,GAAG,MAAwB;QACjC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAClD,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"use.js","sourceRoot":"","sources":["../../s/base/use.ts"],"names":[],"mappings":"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"}
|