@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.
Files changed (46) hide show
  1. package/README.md +3 -3
  2. package/package.json +4 -4
  3. package/s/base/index.ts +1 -0
  4. package/s/base/types.ts +5 -0
  5. package/s/base/use.ts +19 -5
  6. package/s/dom/dom.ts +1 -1
  7. package/s/dom/parts/dom-scope.ts +1 -1
  8. package/s/loot/helpers.ts +4 -14
  9. package/s/view/types.ts +6 -0
  10. package/s/view/utils/make-view.ts +12 -2
  11. package/s/view/utils/parts/capsule.ts +5 -3
  12. package/s/view/utils/parts/directive.ts +4 -1
  13. package/s/view/utils/parts/naked.ts +74 -0
  14. package/s/view/utils/parts/sly-view.ts +6 -1
  15. package/x/base/index.d.ts +1 -0
  16. package/x/base/index.js +1 -0
  17. package/x/base/index.js.map +1 -1
  18. package/x/base/types.d.ts +3 -0
  19. package/x/base/types.js +3 -0
  20. package/x/base/types.js.map +1 -0
  21. package/x/base/use.d.ts +16 -2
  22. package/x/base/use.js +18 -4
  23. package/x/base/use.js.map +1 -1
  24. package/x/demo/demo.bundle.min.js +15 -15
  25. package/x/demo/demo.bundle.min.js.map +4 -4
  26. package/x/dom/dom.d.ts +1 -1
  27. package/x/dom/dom.js.map +1 -1
  28. package/x/dom/parts/dom-scope.d.ts +1 -1
  29. package/x/dom/parts/dom-scope.js.map +1 -1
  30. package/x/index.html +2 -2
  31. package/x/loot/helpers.js +4 -9
  32. package/x/loot/helpers.js.map +1 -1
  33. package/x/view/types.d.ts +5 -0
  34. package/x/view/utils/make-view.js +9 -1
  35. package/x/view/utils/make-view.js.map +1 -1
  36. package/x/view/utils/parts/capsule.d.ts +2 -3
  37. package/x/view/utils/parts/capsule.js +5 -4
  38. package/x/view/utils/parts/capsule.js.map +1 -1
  39. package/x/view/utils/parts/directive.js +3 -1
  40. package/x/view/utils/parts/directive.js.map +1 -1
  41. package/x/view/utils/parts/naked.d.ts +18 -0
  42. package/x/view/utils/parts/naked.js +57 -0
  43. package/x/view/utils/parts/naked.js.map +1 -0
  44. package/x/view/utils/parts/sly-view.d.ts +1 -0
  45. package/x/view/utils/parts/sly-view.js +4 -1
  46. 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. *(sly replaces its predecessor, [slate](https://github.com/benevolent-games/slate))*
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
- - ๐Ÿงช testing page โ€” https://sly.e280.org/
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.1",
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.3",
27
- "@e280/stz": "^0.2.14"
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.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
@@ -2,5 +2,6 @@
2
2
  export * from "./utils/states.js"
3
3
  export * from "./css-reset.js"
4
4
  export * from "./element.js"
5
+ export * from "./types.js"
5
6
  export * from "./use.js"
6
7
 
@@ -0,0 +1,5 @@
1
+
2
+ export type Life<V> = [result: V, dispose: () => void]
3
+ export const asLife = <V>(life: Life<V>) => life
4
+ export const asLifeFn = <V>(fn: () => Life<V>) => fn
5
+
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
- wake<V>(fn: () => V) {
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 HTMLElement>(selectorOrElement: string | E, container: Queryable = document) => {
18
+ dom.in = <E extends Queryable>(selectorOrElement: string | E, container: Queryable = document) => {
19
19
  return new Dom(container).in(selectorOrElement)
20
20
  }
21
21
 
@@ -11,7 +11,7 @@ export class Dom<C extends Queryable> {
11
11
 
12
12
  constructor(public element: C) {}
13
13
 
14
- in<E extends HTMLElement>(selectorOrElement: string | E) {
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 isCursorOutsideViewport = !event.relatedTarget || (
17
- event.clientX === 0 &&
18
- event.clientY === 0
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
- import {View, ViewFn} from "../types.js"
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 = SlyView.make()
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 = new AttrWatcher(this.#element, () => this.#renderDebounced())
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
- #capsule = new ViewCapsule(viewFn, settings)
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
- static make() {
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
@@ -1,4 +1,5 @@
1
1
  export * from "./utils/states.js";
2
2
  export * from "./css-reset.js";
3
3
  export * from "./element.js";
4
+ export * from "./types.js";
4
5
  export * from "./use.js";
package/x/base/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  export * from "./utils/states.js";
2
2
  export * from "./css-reset.js";
3
3
  export * from "./element.js";
4
+ export * from "./types.js";
4
5
  export * from "./use.js";
5
6
  //# sourceMappingURL=index.js.map
@@ -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"}
@@ -0,0 +1,3 @@
1
+ export type Life<V> = [result: V, dispose: () => void];
2
+ export declare const asLife: <V>(life: Life<V>) => Life<V>;
3
+ export declare const asLifeFn: <V>(fn: () => Life<V>) => () => Life<V>;
@@ -0,0 +1,3 @@
1
+ export const asLife = (life) => life;
2
+ export const asLifeFn = (fn) => fn;
3
+ //# sourceMappingURL=types.js.map
@@ -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
- life<V>(fn: () => [result: V, dispose: () => void]): V;
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
- wake(fn) {
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":"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"}
1
+ {"version":3,"file":"use.js","sourceRoot":"","sources":["../../s/base/use.ts"],"names":[],"mappings":"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"}