@e280/sly 0.2.0-2 → 0.2.0-21

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 (285) hide show
  1. package/README.md +552 -98
  2. package/package.json +12 -5
  3. package/s/base/element.ts +76 -0
  4. package/s/base/index.ts +5 -0
  5. package/s/{views → base}/use.ts +17 -18
  6. package/s/base/utils/attr-watcher.ts +22 -0
  7. package/s/base/utils/reactor.ts +32 -0
  8. package/s/base/utils/use-attrs.ts +27 -0
  9. package/s/demo/demo.bundle.ts +9 -5
  10. package/s/demo/views/counter.ts +21 -24
  11. package/s/demo/views/demo.ts +10 -6
  12. package/s/demo/views/fastcount.ts +29 -0
  13. package/s/demo/views/loaders.ts +7 -7
  14. package/s/dom/attrs/attrs.ts +21 -0
  15. package/s/dom/attrs/parts/attr-fns.ts +38 -0
  16. package/s/dom/attrs/parts/attr-proxies.ts +35 -0
  17. package/s/dom/attrs/parts/attr-spec.ts +29 -0
  18. package/s/dom/attrs/parts/on-attrs.ts +8 -0
  19. package/s/dom/dom.ts +46 -16
  20. package/s/dom/index.ts +4 -0
  21. package/s/dom/parts/el.ts +14 -0
  22. package/s/dom/parts/eve.ts +24 -0
  23. package/s/dom/{register.ts → parts/register.ts} +2 -7
  24. package/s/dom/types.ts +39 -2
  25. package/s/index.html.ts +4 -2
  26. package/s/index.ts +7 -18
  27. package/s/loaders/index.barrel.ts +9 -0
  28. package/s/loaders/index.ts +3 -0
  29. package/s/loaders/make.ts +14 -0
  30. package/s/loaders/mock.ts +11 -0
  31. package/s/{ops/loaders → loaders}/parts/anims.ts +1 -1
  32. package/s/{ops/loaders → loaders}/parts/ascii-anim.ts +4 -3
  33. package/s/{ops/loaders → loaders}/parts/error-display.ts +2 -2
  34. package/s/loaders/types.ts +6 -0
  35. package/s/loot/drag-and-drops.ts +82 -0
  36. package/s/loot/{drop.ts → drops.ts} +8 -17
  37. package/s/loot/helpers.ts +3 -3
  38. package/s/loot/index.barrel.ts +5 -0
  39. package/s/loot/index.ts +1 -3
  40. package/s/ops/index.ts +5 -0
  41. package/s/ops/op.ts +3 -2
  42. package/s/spa/index.barrel.ts +6 -0
  43. package/s/spa/index.ts +3 -0
  44. package/s/spa/plumbing/braces.ts +76 -0
  45. package/s/spa/plumbing/primitives.ts +85 -0
  46. package/s/spa/plumbing/router-core.ts +49 -0
  47. package/s/spa/plumbing/types.ts +45 -0
  48. package/s/spa/router.ts +49 -0
  49. package/s/spa/spa.test.ts +91 -0
  50. package/s/tests.test.ts +4 -1
  51. package/s/view/index.ts +6 -0
  52. package/s/view/types.ts +40 -0
  53. package/s/view/utils/make-component.ts +34 -0
  54. package/s/view/utils/make-view.ts +48 -0
  55. package/s/view/utils/parts/capsule.ts +67 -0
  56. package/s/view/utils/parts/chain.ts +33 -0
  57. package/s/view/utils/parts/context.ts +10 -0
  58. package/s/view/utils/parts/directive.ts +29 -0
  59. package/s/view/utils/parts/set-attrs.ts +33 -0
  60. package/s/view/utils/parts/sly-view.ts +15 -0
  61. package/s/view/view.ts +24 -0
  62. package/x/base/css-reset.js.map +1 -0
  63. package/x/base/element.d.ts +19 -0
  64. package/x/base/element.js +52 -0
  65. package/x/base/element.js.map +1 -0
  66. package/x/base/index.d.ts +3 -0
  67. package/x/base/index.js +4 -0
  68. package/x/base/index.js.map +1 -0
  69. package/x/{views → base}/use.d.ts +5 -5
  70. package/x/{views → base}/use.js +9 -11
  71. package/x/base/use.js.map +1 -0
  72. package/x/base/utils/apply-styles.js.map +1 -0
  73. package/x/base/utils/attr-watcher.d.ts +8 -0
  74. package/x/base/utils/attr-watcher.js +20 -0
  75. package/x/base/utils/attr-watcher.js.map +1 -0
  76. package/x/base/utils/mounts.js.map +1 -0
  77. package/x/base/utils/reactor.d.ts +5 -0
  78. package/x/base/utils/reactor.js +25 -0
  79. package/x/base/utils/reactor.js.map +1 -0
  80. package/x/base/utils/use-attrs.d.ts +11 -0
  81. package/x/base/utils/use-attrs.js +19 -0
  82. package/x/base/utils/use-attrs.js.map +1 -0
  83. package/x/demo/demo.bundle.js +8 -4
  84. package/x/demo/demo.bundle.js.map +1 -1
  85. package/x/demo/demo.bundle.min.js +19 -22
  86. package/x/demo/demo.bundle.min.js.map +4 -4
  87. package/x/demo/views/counter.d.ts +374 -1
  88. package/x/demo/views/counter.js +19 -22
  89. package/x/demo/views/counter.js.map +1 -1
  90. package/x/demo/views/demo.d.ts +4 -1
  91. package/x/demo/views/demo.js +10 -5
  92. package/x/demo/views/demo.js.map +1 -1
  93. package/x/demo/views/fastcount.d.ts +12 -0
  94. package/x/demo/views/fastcount.js +21 -0
  95. package/x/demo/views/fastcount.js.map +1 -0
  96. package/x/demo/views/loaders.js +6 -6
  97. package/x/demo/views/loaders.js.map +1 -1
  98. package/x/dom/attrs/attrs.d.ts +20 -0
  99. package/x/dom/attrs/attrs.js +17 -0
  100. package/x/dom/attrs/attrs.js.map +1 -0
  101. package/x/dom/attrs/parts/attr-fns.d.ts +13 -0
  102. package/x/dom/attrs/parts/attr-fns.js +42 -0
  103. package/x/dom/attrs/parts/attr-fns.js.map +1 -0
  104. package/x/dom/attrs/parts/attr-proxies.d.ts +8 -0
  105. package/x/dom/attrs/parts/attr-proxies.js +21 -0
  106. package/x/dom/attrs/parts/attr-proxies.js.map +1 -0
  107. package/x/dom/attrs/parts/attr-spec.d.ts +3 -0
  108. package/x/dom/attrs/parts/attr-spec.js +21 -0
  109. package/x/dom/attrs/parts/attr-spec.js.map +1 -0
  110. package/x/dom/attrs/parts/on-attrs.d.ts +2 -0
  111. package/x/dom/attrs/parts/on-attrs.js +7 -0
  112. package/x/dom/attrs/parts/on-attrs.js.map +1 -0
  113. package/x/dom/dom.d.ts +22 -7
  114. package/x/dom/dom.js +32 -12
  115. package/x/dom/dom.js.map +1 -1
  116. package/x/dom/index.d.ts +2 -0
  117. package/x/dom/index.js +3 -0
  118. package/x/dom/index.js.map +1 -0
  119. package/x/dom/parts/dashify.js.map +1 -0
  120. package/x/dom/parts/el.d.ts +2 -0
  121. package/x/dom/parts/el.js +7 -0
  122. package/x/dom/parts/el.js.map +1 -0
  123. package/x/dom/parts/eve.d.ts +7 -0
  124. package/x/dom/parts/eve.js +16 -0
  125. package/x/dom/parts/eve.js.map +1 -0
  126. package/x/dom/{register.d.ts → parts/register.d.ts} +2 -6
  127. package/x/dom/parts/register.js.map +1 -0
  128. package/x/dom/types.d.ts +14 -2
  129. package/x/index.d.ts +7 -15
  130. package/x/index.html +6 -4
  131. package/x/index.html.js +4 -2
  132. package/x/index.html.js.map +1 -1
  133. package/x/index.js +7 -15
  134. package/x/index.js.map +1 -1
  135. package/x/loaders/index.barrel.d.ts +6 -0
  136. package/x/loaders/index.barrel.js +7 -0
  137. package/x/loaders/index.barrel.js.map +1 -0
  138. package/x/loaders/index.d.ts +1 -0
  139. package/x/loaders/index.js +2 -0
  140. package/x/loaders/index.js.map +1 -0
  141. package/x/loaders/make.d.ts +3 -0
  142. package/x/loaders/make.js +6 -0
  143. package/x/loaders/make.js.map +1 -0
  144. package/x/loaders/mock.d.ts +2 -0
  145. package/x/loaders/mock.js +8 -0
  146. package/x/loaders/mock.js.map +1 -0
  147. package/x/{ops/loaders → loaders}/parts/anims.d.ts +1 -1
  148. package/x/loaders/parts/anims.js.map +1 -0
  149. package/x/{ops/loaders → loaders}/parts/ascii-anim.d.ts +2 -2
  150. package/x/{ops/loaders → loaders}/parts/ascii-anim.js +2 -2
  151. package/x/loaders/parts/ascii-anim.js.map +1 -0
  152. package/x/loaders/parts/error-display.d.ts +1 -0
  153. package/x/{ops/loaders → loaders}/parts/error-display.js +2 -2
  154. package/x/loaders/parts/error-display.js.map +1 -0
  155. package/x/loaders/types.d.ts +3 -0
  156. package/x/loaders/types.js.map +1 -0
  157. package/x/loot/drag-and-drops.d.ts +30 -0
  158. package/x/loot/drag-and-drops.js +63 -0
  159. package/x/loot/drag-and-drops.js.map +1 -0
  160. package/x/loot/{drop.d.ts → drops.d.ts} +3 -5
  161. package/x/loot/drops.js +25 -0
  162. package/x/loot/drops.js.map +1 -0
  163. package/x/loot/helpers.d.ts +3 -3
  164. package/x/loot/helpers.js +3 -3
  165. package/x/loot/helpers.js.map +1 -1
  166. package/x/loot/index.barrel.d.ts +3 -0
  167. package/x/loot/index.barrel.js +4 -0
  168. package/x/loot/index.barrel.js.map +1 -0
  169. package/x/loot/index.d.ts +1 -3
  170. package/x/loot/index.js +1 -3
  171. package/x/loot/index.js.map +1 -1
  172. package/x/ops/index.d.ts +3 -0
  173. package/x/ops/index.js +4 -0
  174. package/x/ops/index.js.map +1 -0
  175. package/x/ops/op.d.ts +2 -2
  176. package/x/ops/op.js +3 -2
  177. package/x/ops/op.js.map +1 -1
  178. package/x/spa/index.barrel.d.ts +4 -0
  179. package/x/spa/index.barrel.js +3 -0
  180. package/x/spa/index.barrel.js.map +1 -0
  181. package/x/spa/index.d.ts +1 -0
  182. package/x/spa/index.js +2 -0
  183. package/x/spa/index.js.map +1 -0
  184. package/x/spa/plumbing/braces.d.ts +12 -0
  185. package/x/spa/plumbing/braces.js +55 -0
  186. package/x/spa/plumbing/braces.js.map +1 -0
  187. package/x/spa/plumbing/primitives.d.ts +22 -0
  188. package/x/spa/plumbing/primitives.js +65 -0
  189. package/x/spa/plumbing/primitives.js.map +1 -0
  190. package/x/spa/plumbing/router-core.d.ts +13 -0
  191. package/x/spa/plumbing/router-core.js +38 -0
  192. package/x/spa/plumbing/router-core.js.map +1 -0
  193. package/x/spa/plumbing/types.d.ts +35 -0
  194. package/x/spa/plumbing/types.js +2 -0
  195. package/x/spa/plumbing/types.js.map +1 -0
  196. package/x/spa/router.d.ts +16 -0
  197. package/x/spa/router.js +39 -0
  198. package/x/spa/router.js.map +1 -0
  199. package/x/spa/spa.test.d.ts +15 -0
  200. package/x/spa/spa.test.js +78 -0
  201. package/x/spa/spa.test.js.map +1 -0
  202. package/x/tests.test.js +4 -1
  203. package/x/tests.test.js.map +1 -1
  204. package/x/view/index.d.ts +4 -0
  205. package/x/view/index.js +5 -0
  206. package/x/view/index.js.map +1 -0
  207. package/x/view/types.d.ts +22 -0
  208. package/x/view/types.js +2 -0
  209. package/x/{views → view}/types.js.map +1 -1
  210. package/x/view/utils/make-component.d.ts +5 -0
  211. package/x/view/utils/make-component.js +17 -0
  212. package/x/view/utils/make-component.js.map +1 -0
  213. package/x/view/utils/make-view.d.ts +2 -0
  214. package/x/view/utils/make-view.js +24 -0
  215. package/x/view/utils/make-view.js.map +1 -0
  216. package/x/view/utils/parts/capsule.d.ts +13 -0
  217. package/x/view/utils/parts/capsule.js +49 -0
  218. package/x/view/utils/parts/capsule.js.map +1 -0
  219. package/x/view/utils/parts/chain.d.ts +11 -0
  220. package/x/view/utils/parts/chain.js +21 -0
  221. package/x/view/utils/parts/chain.js.map +1 -0
  222. package/x/view/utils/parts/context.d.ts +8 -0
  223. package/x/view/utils/parts/context.js +10 -0
  224. package/x/view/utils/parts/context.js.map +1 -0
  225. package/x/view/utils/parts/directive.d.ts +5 -0
  226. package/x/view/utils/parts/directive.js +18 -0
  227. package/x/view/utils/parts/directive.js.map +1 -0
  228. package/x/view/utils/parts/set-attrs.d.ts +3 -0
  229. package/x/view/utils/parts/set-attrs.js +21 -0
  230. package/x/view/utils/parts/set-attrs.js.map +1 -0
  231. package/x/view/utils/parts/sly-view.d.ts +5 -0
  232. package/x/view/utils/parts/sly-view.js +13 -0
  233. package/x/view/utils/parts/sly-view.js.map +1 -0
  234. package/x/view/view.d.ts +11 -0
  235. package/x/view/view.js +15 -0
  236. package/x/view/view.js.map +1 -0
  237. package/s/loot/drag-drop.ts +0 -76
  238. package/s/ops/loaders/make-loader.ts +0 -18
  239. package/s/views/attributes.ts +0 -89
  240. package/s/views/types.ts +0 -40
  241. package/s/views/utils/apply-attrs.ts +0 -33
  242. package/s/views/view.ts +0 -150
  243. package/x/dom/dashify.js.map +0 -1
  244. package/x/dom/register.js.map +0 -1
  245. package/x/loot/drag-drop.d.ts +0 -29
  246. package/x/loot/drag-drop.js +0 -54
  247. package/x/loot/drag-drop.js.map +0 -1
  248. package/x/loot/drop.js +0 -32
  249. package/x/loot/drop.js.map +0 -1
  250. package/x/ops/loaders/make-loader.d.ts +0 -5
  251. package/x/ops/loaders/make-loader.js +0 -7
  252. package/x/ops/loaders/make-loader.js.map +0 -1
  253. package/x/ops/loaders/parts/anims.js.map +0 -1
  254. package/x/ops/loaders/parts/ascii-anim.js.map +0 -1
  255. package/x/ops/loaders/parts/error-display.d.ts +0 -1
  256. package/x/ops/loaders/parts/error-display.js.map +0 -1
  257. package/x/views/attributes.d.ts +0 -10
  258. package/x/views/attributes.js +0 -46
  259. package/x/views/attributes.js.map +0 -1
  260. package/x/views/css-reset.js.map +0 -1
  261. package/x/views/types.d.ts +0 -31
  262. package/x/views/use.js.map +0 -1
  263. package/x/views/utils/apply-attrs.d.ts +0 -2
  264. package/x/views/utils/apply-attrs.js +0 -21
  265. package/x/views/utils/apply-attrs.js.map +0 -1
  266. package/x/views/utils/apply-styles.js.map +0 -1
  267. package/x/views/utils/mounts.js.map +0 -1
  268. package/x/views/view.d.ts +0 -9
  269. package/x/views/view.js +0 -116
  270. package/x/views/view.js.map +0 -1
  271. /package/s/{views → base}/css-reset.ts +0 -0
  272. /package/s/{views → base}/utils/apply-styles.ts +0 -0
  273. /package/s/{views → base}/utils/mounts.ts +0 -0
  274. /package/s/dom/{dashify.ts → parts/dashify.ts} +0 -0
  275. /package/x/{views → base}/css-reset.d.ts +0 -0
  276. /package/x/{views → base}/css-reset.js +0 -0
  277. /package/x/{views → base}/utils/apply-styles.d.ts +0 -0
  278. /package/x/{views → base}/utils/apply-styles.js +0 -0
  279. /package/x/{views → base}/utils/mounts.d.ts +0 -0
  280. /package/x/{views → base}/utils/mounts.js +0 -0
  281. /package/x/dom/{dashify.d.ts → parts/dashify.d.ts} +0 -0
  282. /package/x/dom/{dashify.js → parts/dashify.js} +0 -0
  283. /package/x/dom/{register.js → parts/register.js} +0 -0
  284. /package/x/{ops/loaders → loaders}/parts/anims.js +0 -0
  285. /package/x/{views → loaders}/types.js +0 -0
package/s/dom/dom.ts CHANGED
@@ -1,23 +1,38 @@
1
1
 
2
2
  import {render} from "lit"
3
- import {register} from "./register.js"
4
- import {Content} from "../views/types.js"
5
- import {Queryable, Renderable} from "./types.js"
3
+ import {el} from "./parts/el.js"
4
+ import {AttrSpec} from "./types.js"
5
+ import {attrs} from "./attrs/attrs.js"
6
+ import {Content} from "../view/types.js"
7
+ import {eve, EveSpec} from "./parts/eve.js"
8
+ import {register} from "./parts/register.js"
9
+
10
+ export type Renderable = HTMLElement | ShadowRoot | DocumentFragment
11
+ export type Queryable = HTMLElement | ShadowRoot | Element | Document | DocumentFragment
12
+
13
+ function require<E extends Element>(
14
+ container: Queryable,
15
+ selector: string,
16
+ ) {
17
+ const e = container.querySelector<E>(selector)
18
+ if (!e) throw new Error(`element not found (${selector})`)
19
+ return e
20
+ }
6
21
 
7
22
  export class Dom<C extends Queryable> {
8
23
  constructor(public element: C) {}
9
24
 
10
- in<E extends HTMLElement>(elementOrSelector: E | string) {
11
- return new Dom(
12
- typeof elementOrSelector === "string"
13
- ? this.require<E>(elementOrSelector)
14
- : elementOrSelector
25
+ in<E extends HTMLElement>(selectorOrElement: string | E) {
26
+ return new Dom<E>(
27
+ (typeof selectorOrElement === "string")
28
+ ? require(this.element, selectorOrElement) as E
29
+ : selectorOrElement
15
30
  )
16
31
  }
17
32
 
18
33
  require<E extends Element = HTMLElement>(selector: string) {
19
34
  const e = this.element.querySelector<E>(selector)
20
- if (!e) throw new Error(`$1 ${selector} not found`)
35
+ if (!e) throw new Error(`element not found (${selector})`)
21
36
  return e
22
37
  }
23
38
 
@@ -32,20 +47,35 @@ export class Dom<C extends Queryable> {
32
47
  render(...content: Content[]) {
33
48
  return render(content, this.element as Renderable)
34
49
  }
35
- }
36
50
 
37
- export function dom(selector: string) {
38
- return new Dom(document).require(selector)
51
+ attrs() {
52
+ return attrs(this.element as HTMLElement)
53
+ }
54
+
55
+ events(spec: EveSpec) {
56
+ return eve(this.element, spec)
57
+ }
39
58
  }
40
59
 
41
- const doc = new Dom(document)
42
- dom.register = register
43
- dom.render = (container: Renderable, ...content: Content[]) => {
44
- return render(content, container)
60
+ export function dom<E extends Queryable>(selector: string): E
61
+ export function dom<E extends Queryable>(element: E): Dom<E>
62
+ export function dom<E extends Queryable>(selectorOrElement: string | E): E | Dom<E> {
63
+ return (typeof selectorOrElement === "string")
64
+ ? require(document, selectorOrElement) as E
65
+ : new Dom(selectorOrElement)
45
66
  }
46
67
 
68
+ const doc = new Dom(document)
47
69
  dom.in = doc.in.bind(doc)
48
70
  dom.require = doc.require.bind(doc)
49
71
  dom.maybe = doc.maybe.bind(doc)
50
72
  dom.all = doc.all.bind(doc)
51
73
 
74
+ dom.el = el
75
+ dom.events = eve
76
+ dom.attrs = attrs
77
+ dom.register = register
78
+ dom.render = (container: Renderable, ...content: Content[]) => {
79
+ return render(content, container)
80
+ }
81
+
package/s/dom/index.ts ADDED
@@ -0,0 +1,4 @@
1
+
2
+ export * from "./types.js"
3
+ export * from "./dom.js"
4
+
@@ -0,0 +1,14 @@
1
+
2
+ import {AttrValue} from "../../view/types.js"
3
+ import {setAttrs} from "../../view/utils/parts/set-attrs.js"
4
+
5
+ export function el<E extends HTMLElement>(
6
+ tagName: string,
7
+ attrs: Record<string, AttrValue>,
8
+ ) {
9
+
10
+ const element = document.createElement(tagName) as E
11
+ setAttrs(element, Object.entries(attrs))
12
+ return element
13
+ }
14
+
@@ -0,0 +1,24 @@
1
+
2
+ export type EveFn = (event: any) => void
3
+ export type EveConfig = [options: AddEventListenerOptions, fn: EveFn]
4
+ export type EveHandler = EveFn | EveConfig
5
+ export type EveSpec = {[eventName: string]: EveHandler}
6
+
7
+ export function eve(target: EventTarget, events: EveSpec) {
8
+ let detachers: (() => void)[] = []
9
+
10
+ for (const [eventName, handler] of Object.entries(events)) {
11
+ if (typeof handler === "function") {
12
+ target.addEventListener(eventName, handler)
13
+ detachers.push(() => target.removeEventListener(eventName, handler))
14
+ }
15
+ else {
16
+ const [options, fn] = handler
17
+ target.addEventListener(eventName, fn, options)
18
+ detachers.push(() => target.removeEventListener(eventName, fn))
19
+ }
20
+ }
21
+
22
+ return () => detachers.forEach(d => d())
23
+ }
24
+
@@ -1,11 +1,6 @@
1
1
 
2
2
  import {dashify} from "./dashify.js"
3
- import {HTMLElementClasses} from "./types.js"
4
-
5
- export type RegistrationOptions = {
6
- soft: boolean
7
- upgrade: boolean
8
- }
3
+ import {HTMLElementClasses, RegisterOptions} from "../types.js"
9
4
 
10
5
  /**
11
6
  * register custom elements (web components) to the dom
@@ -21,7 +16,7 @@ export type RegistrationOptions = {
21
16
  */
22
17
  export function register<E extends HTMLElementClasses>(
23
18
  elements: E,
24
- options: Partial<RegistrationOptions> = {},
19
+ options: Partial<RegisterOptions> = {},
25
20
  ) {
26
21
 
27
22
  const {
package/s/dom/types.ts CHANGED
@@ -1,8 +1,45 @@
1
1
 
2
- export type Renderable = HTMLElement | ShadowRoot | DocumentFragment
3
- export type Queryable = HTMLElement | ShadowRoot | Element | Document | DocumentFragment
2
+ import {attrs} from "./attrs/attrs.js"
3
+
4
+ // attrs
5
+
6
+ export type AttrKind = (
7
+ | typeof String
8
+ | typeof Number
9
+ | typeof Boolean
10
+ )
11
+
12
+ export type AttrType<H extends AttrKind> = (
13
+ H extends typeof String
14
+ ? string | undefined
15
+
16
+ : H extends typeof Number
17
+ ? number | undefined
18
+
19
+ : H extends typeof Boolean
20
+ ? boolean
21
+
22
+ : never
23
+ )
24
+
25
+ export type AttrSpec = {
26
+ [key: string]: AttrKind
27
+ }
28
+
29
+ export type AttrTypes<A extends AttrSpec> = {
30
+ [P in keyof A]: AttrType<A[P]>
31
+ }
32
+
33
+ export type Attrs = ReturnType<typeof attrs>
34
+
35
+ // register
4
36
 
5
37
  export type HTMLElementClasses = {
6
38
  [key: string]: {new(...args: any[]): HTMLElement}
7
39
  }
8
40
 
41
+ export type RegisterOptions = {
42
+ soft: boolean
43
+ upgrade: boolean
44
+ }
45
+
package/s/index.html.ts CHANGED
@@ -29,8 +29,10 @@ export default ssg.page(import.meta.url, async orb => ({
29
29
  <h1>sly testing page</h1>
30
30
  <p><a href="https://github.com/e280/sly">github.com/e280/sly</a></p>
31
31
  <p class=lil>v${orb.packageVersion()}</p>
32
- <demo-counter>component</demo-counter>
33
- <div class=demo></div>
32
+
33
+ <fastcount-element></fastcount-element>
34
+ <counter-component start=280 step=2>component</counter-component>
35
+ <demo-component></demo-component>
34
36
  `,
35
37
  }))
36
38
 
package/s/index.ts CHANGED
@@ -1,20 +1,9 @@
1
1
 
2
- export * from "./dom/dashify.js"
3
- export * from "./dom/register.js"
4
- export * from "./dom/types.js"
5
-
6
- export * from "./ops/loaders/make-loader.js"
7
- export * from "./ops/loaders/parts/ascii-anim.js"
8
- export * from "./ops/loaders/parts/error-display.js"
9
- export * from "./ops/op.js"
10
- export * from "./ops/podium.js"
11
- export * from "./ops/types.js"
12
-
13
- export * as loot from "./loot/index.js"
14
-
15
- export * from "./views/attributes.js"
16
- export * from "./views/css-reset.js"
17
- export * from "./views/types.js"
18
- export * from "./views/use.js"
19
- export * from "./views/view.js"
2
+ export * from "./base/index.js"
3
+ export * from "./dom/index.js"
4
+ export * from "./loaders/index.js"
5
+ export * from "./loot/index.js"
6
+ export * from "./ops/index.js"
7
+ export * from "./spa/index.js"
8
+ export * from "./view/index.js"
20
9
 
@@ -0,0 +1,9 @@
1
+
2
+ export * as anims from "./parts/anims.js"
3
+ export * from "./parts/ascii-anim.js"
4
+ export * from "./parts/error-display.js"
5
+ export * from "./make.js"
6
+ export * from "./mock.js"
7
+ export * from "./types.js"
8
+
9
+
@@ -0,0 +1,3 @@
1
+
2
+ export * as loaders from "./index.barrel.js"
3
+
@@ -0,0 +1,14 @@
1
+
2
+ import {Loader} from "./types.js"
3
+ import {earth} from "./parts/anims.js"
4
+ import type {Content} from "../view/types.js"
5
+ import {ErrorDisplay} from "./parts/error-display.js"
6
+
7
+ export function make(
8
+ loading: () => Content = earth,
9
+ error: (error: any) => Content = (error: any) => ErrorDisplay(error),
10
+ ): Loader {
11
+
12
+ return (op, ready) => op.select({loading, ready, error})
13
+ }
14
+
@@ -0,0 +1,11 @@
1
+
2
+ import {Loader} from "./types.js"
3
+
4
+ export function mock(): Loader {
5
+ return (op, ready) => op.select({
6
+ ready,
7
+ loading: () => `[loading]`,
8
+ error: () => `[error]`,
9
+ })
10
+ }
11
+
@@ -1,6 +1,6 @@
1
1
 
2
2
  import {makeAsciiAnim} from "./ascii-anim.js"
3
- import {Content} from "../../../views/types.js"
3
+ import type {Content} from "../../view/types.js"
4
4
 
5
5
  const fast = 20
6
6
  const mid = 10
@@ -2,9 +2,9 @@
2
2
  import {css} from "lit"
3
3
  import {nap, repeat} from "@e280/stz"
4
4
 
5
- import {view} from "../../../views/view.js"
6
- import {Content} from "../../../views/types.js"
7
- import {cssReset} from "../../../views/css-reset.js"
5
+ import {view} from "../../view/view.js"
6
+ import {Content} from "../../view/types.js"
7
+ import {cssReset} from "../../base/css-reset.js"
8
8
 
9
9
  export function makeAsciiAnim(hz: number, frames: string[]): () => Content {
10
10
  return () => AsciiAnim({hz, frames})
@@ -17,6 +17,7 @@ export const AsciiAnim = view(use => ({hz, frames}: {
17
17
 
18
18
  use.name("loading")
19
19
  use.styles(cssReset, style)
20
+
20
21
  const frame = use.signal(0)
21
22
 
22
23
  use.mount(() => repeat(async() => {
@@ -1,7 +1,7 @@
1
1
 
2
2
  import {css, html} from "lit"
3
- import {view} from "../../../views/view.js"
4
- import {cssReset} from "../../../views/css-reset.js"
3
+ import {view} from "../../view/view.js"
4
+ import {cssReset} from "../../base/css-reset.js"
5
5
 
6
6
  export const ErrorDisplay = view(use => (error: any) => {
7
7
  use.name("error")
@@ -0,0 +1,6 @@
1
+
2
+ import type {Op} from "../ops/op.js"
3
+ import type {Content} from "../view/types.js"
4
+
5
+ export type Loader = <V>(op: Op<V>, ready: (value: V) => Content) => Content
6
+
@@ -0,0 +1,82 @@
1
+
2
+ import {signal} from "@e280/strata"
3
+ import {Drops} from "./drops.js"
4
+ import {outsideCurrentTarget} from "./helpers.js"
5
+
6
+ /** respond to user dragging-and-dropping things around on a webpage */
7
+ export class DragAndDrops<Draggy, Droppy> {
8
+
9
+ /** what is currently being dragged */
10
+ $draggy = signal<Draggy | undefined>(undefined)
11
+
12
+ /** what dropzone are we curently hovering over */
13
+ $droppy = signal<Droppy | undefined>(undefined)
14
+
15
+ constructor(private params: {
16
+
17
+ /** accept a dropped item that was declared within this system */
18
+ acceptDrop: (event: DragEvent, draggy: Draggy, droppy: Droppy) => void
19
+
20
+ /** also accept drops on the side */
21
+ backchannelDrops?: Drops
22
+ }) {}
23
+
24
+ get dragging() {
25
+ return this.$draggy()
26
+ }
27
+
28
+ get hovering() {
29
+ return this.$droppy()
30
+ }
31
+
32
+ /** make event listeners to attach to your dragzone(s) */
33
+ dragzone = (getDraggy: () => Draggy) => ({
34
+ draggable: "true",
35
+
36
+ dragstart: (_: DragEvent) => {
37
+ this.$draggy.value = getDraggy()
38
+ },
39
+
40
+ dragend: (_: DragEvent) => {
41
+ this.$draggy.value = undefined
42
+ this.$droppy.value = undefined
43
+ },
44
+ })
45
+
46
+ /** make event listeners to attach to your dropzones(s) */
47
+ dropzone = (getDroppy: () => Droppy) => ({
48
+ dragenter: (_: DragEvent) => {},
49
+
50
+ dragover: (event: DragEvent) => {
51
+ event.preventDefault()
52
+ if (this.$draggy())
53
+ this.$droppy.value = getDroppy()
54
+ else
55
+ this.params.backchannelDrops?.dragover(event)
56
+ },
57
+
58
+ dragleave: (event: DragEvent) => {
59
+ if (outsideCurrentTarget(event))
60
+ this.$droppy.value = undefined
61
+ this.params.backchannelDrops?.dragleave(event)
62
+ },
63
+
64
+ drop: (event: DragEvent) => {
65
+ event.preventDefault()
66
+ const {acceptDrop} = this.params
67
+ const draggy = this.$draggy()
68
+ const droppy = this.$droppy()
69
+ try {
70
+ if (draggy && droppy)
71
+ acceptDrop(event, draggy, droppy)
72
+ else
73
+ this.params.backchannelDrops?.drop(event)
74
+ }
75
+ finally {
76
+ this.$draggy.value = undefined
77
+ this.$droppy.value = undefined
78
+ }
79
+ },
80
+ })
81
+ }
82
+
@@ -1,10 +1,10 @@
1
1
 
2
2
  import {signal} from "@e280/strata"
3
- import {dragIsOutsideCurrentTarget} from "./helpers.js"
3
+ import {outsideCurrentTarget} from "./helpers.js"
4
4
 
5
- /** dropzone that accepts dropped stuff like files */
6
- export class Drop {
7
- #$indicator = signal(false)
5
+ /** dropzone that accepts user-dropped stuff like files */
6
+ export class Drops {
7
+ $indicator = signal(false)
8
8
 
9
9
  constructor(private params: {
10
10
 
@@ -15,28 +15,19 @@ export class Drop {
15
15
  acceptDrop: (event: DragEvent) => void
16
16
  }) {}
17
17
 
18
- get indicator() {
19
- return this.#$indicator.value
20
- }
21
-
22
- resetIndicator = () => {
23
- this.#$indicator.value = false
24
- }
25
-
26
18
  dragover = (event: DragEvent) => {
27
19
  event.preventDefault()
28
- if (this.params.predicate(event))
29
- this.#$indicator.value = true
20
+ this.$indicator.value = this.params.predicate(event)
30
21
  }
31
22
 
32
23
  dragleave = (event: DragEvent) => {
33
- if (dragIsOutsideCurrentTarget(event))
34
- this.#$indicator.value = false
24
+ if (outsideCurrentTarget(event))
25
+ this.$indicator.value = false
35
26
  }
36
27
 
37
28
  drop = (event: DragEvent) => {
38
29
  event.preventDefault()
39
- this.#$indicator.value = false
30
+ this.$indicator.value = false
40
31
  if (this.params.predicate(event))
41
32
  this.params.acceptDrop(event)
42
33
  }
package/s/loot/helpers.ts CHANGED
@@ -1,18 +1,18 @@
1
1
 
2
- export function dragHasFiles(event: DragEvent) {
2
+ export function hasFiles(event: DragEvent) {
3
3
  return !!(
4
4
  event.dataTransfer &&
5
5
  event.dataTransfer.types.includes("Files")
6
6
  )
7
7
  }
8
8
 
9
- export function droppedFiles(event: DragEvent) {
9
+ export function files(event: DragEvent) {
10
10
  return event.dataTransfer
11
11
  ? Array.from(event.dataTransfer.files)
12
12
  : []
13
13
  }
14
14
 
15
- export function dragIsOutsideCurrentTarget(event: DragEvent) {
15
+ export function outsideCurrentTarget(event: DragEvent) {
16
16
  const isCursorOutsideViewport = !event.relatedTarget || (
17
17
  event.clientX === 0 &&
18
18
  event.clientY === 0
@@ -0,0 +1,5 @@
1
+
2
+ export * from "./drag-and-drops.js"
3
+ export * from "./drops.js"
4
+ export * from "./helpers.js"
5
+
package/s/loot/index.ts CHANGED
@@ -1,5 +1,3 @@
1
1
 
2
- export * from "./drag-drop.js"
3
- export * from "./drop.js"
4
- export * from "./helpers.js"
2
+ export * as loot from "./index.barrel.js"
5
3
 
package/s/ops/index.ts ADDED
@@ -0,0 +1,5 @@
1
+
2
+ export * from "./op.js"
3
+ export * from "./podium.js"
4
+ export * from "./types.js"
5
+
package/s/ops/op.ts CHANGED
@@ -16,7 +16,7 @@ export class Op<V> {
16
16
  return op
17
17
  }
18
18
 
19
- static fn<V>(fn: () => Promise<V>) {
19
+ static load<V>(fn: () => Promise<V>) {
20
20
  return this.promise(fn())
21
21
  }
22
22
 
@@ -69,12 +69,13 @@ export class Op<V> {
69
69
  return value
70
70
  }
71
71
  catch (error) {
72
+ console.error(error)
72
73
  if (count === this.#count)
73
74
  await this.setError(error)
74
75
  }
75
76
  }
76
77
 
77
- async fn(fn: () => Promise<V>) {
78
+ async load(fn: () => Promise<V>) {
78
79
  return this.promise(fn())
79
80
  }
80
81
 
@@ -0,0 +1,6 @@
1
+
2
+ export {route} from "./plumbing/braces.js"
3
+ export type {Navigable} from "./plumbing/primitives.js"
4
+ export {RouterOptions, Hasher, Route, Routes, Navigables, Params} from "./plumbing/types.js"
5
+ export {Router} from "./router.js"
6
+
package/s/spa/index.ts ADDED
@@ -0,0 +1,3 @@
1
+
2
+ export * as spa from "./index.barrel.js"
3
+
@@ -0,0 +1,76 @@
1
+
2
+ import {Hasher, Route} from "./types.js"
3
+ import type {Content} from "../../view/types.js"
4
+
5
+ type ParamKeys<S extends string> =
6
+ S extends `${string}{${infer P}}${infer R}` ? (string & P) | ParamKeys<R> : never
7
+
8
+ type ParamsOf<S extends string> =
9
+ [ParamKeys<S>] extends [never] ? {} : { [K in ParamKeys<S>]: string }
10
+
11
+ type ParamsTuple<S extends string> =
12
+ keyof ParamsOf<S> extends never ? [] : [ParamsOf<S>]
13
+
14
+ export function hasher<S extends string>(spec: S): Hasher<ParamsTuple<S>> {
15
+ if (!spec.startsWith("#/"))
16
+ throw new Error(`hash route spec must start with "#/"`)
17
+
18
+ const specparts = spec.split("/")
19
+ const braceregex = /\{([^\}\/]+)\}/
20
+
21
+ function parse(hash: string): ParamsTuple<S> | null {
22
+ if (!hash.startsWith("#/"))
23
+ throw new Error(`hash must start with "#/"`)
24
+
25
+ const hashparts = hash.split("/")
26
+ const params: Record<string, string> = {}
27
+
28
+ if (hashparts.length !== specparts.length)
29
+ return null
30
+
31
+ for (const [index, specpart] of specparts.entries()) {
32
+ const hashpart = hashparts.at(index)
33
+ if (hashpart === undefined) return null
34
+ const bracematch = specpart.match(braceregex)
35
+ try {
36
+ if (bracematch) params[bracematch[1]] = decodeURIComponent(hashpart)
37
+ else if (hashpart !== specpart) return null
38
+ }
39
+ catch {
40
+ return null
41
+ }
42
+ }
43
+
44
+ return (Object.keys(params).length === 0)
45
+ ? ([] as ParamsTuple<S>)
46
+ : ([params as ParamsOf<S>] as ParamsTuple<S>)
47
+ }
48
+
49
+ function make(...[braces]: any[]): string {
50
+ const get = (param: string) => {
51
+ const p = param as any
52
+ if (p in braces) return braces[p]
53
+ else throw new Error(`missing param "${p}"`)
54
+ }
55
+ return specparts.map(specpart => {
56
+ const bracematch = specpart.match(braceregex)
57
+ return bracematch
58
+ ? encodeURIComponent(get(bracematch[1]))
59
+ : specpart
60
+ }).join("/")
61
+ }
62
+
63
+ return {parse, make}
64
+ }
65
+
66
+ export function route<S extends string>(
67
+ spec: S,
68
+ fn: (...params: ParamsTuple<S>) => Promise<Content>,
69
+ ): Route<ParamsTuple<S>> {
70
+
71
+ return {
72
+ hasher: hasher(spec),
73
+ fn,
74
+ }
75
+ }
76
+