@typed/ui 0.1.5 → 0.2.0

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,6 @@
1
+ {
2
+ "main": "../dist/cjs/Anchor.js",
3
+ "module": "../dist/esm/Anchor.js",
4
+ "types": "../dist/dts/Anchor.d.ts",
5
+ "sideEffects": []
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../dist/cjs/Link.js",
3
+ "module": "../dist/esm/Link.js",
4
+ "types": "../dist/dts/Link.d.ts",
5
+ "sideEffects": []
6
+ }
package/dist/cjs/index.js CHANGED
@@ -25,4 +25,26 @@ Object.keys(_Link).forEach(function (key) {
25
25
  }
26
26
  });
27
27
  });
28
+ var _useClickAway = /*#__PURE__*/require("./useClickAway.js");
29
+ Object.keys(_useClickAway).forEach(function (key) {
30
+ if (key === "default" || key === "__esModule") return;
31
+ if (key in exports && exports[key] === _useClickAway[key]) return;
32
+ Object.defineProperty(exports, key, {
33
+ enumerable: true,
34
+ get: function () {
35
+ return _useClickAway[key];
36
+ }
37
+ });
38
+ });
39
+ var _usePagination = /*#__PURE__*/require("./usePagination.js");
40
+ Object.keys(_usePagination).forEach(function (key) {
41
+ if (key === "default" || key === "__esModule") return;
42
+ if (key in exports && exports[key] === _usePagination[key]) return;
43
+ Object.defineProperty(exports, key, {
44
+ enumerable: true,
45
+ get: function () {
46
+ return _usePagination[key];
47
+ }
48
+ });
49
+ });
28
50
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_Anchor","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get","_Link"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":";;;;;AAOA,IAAAA,OAAA,gBAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,OAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,OAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAT,OAAA,CAAAK,GAAA;IAAA;EAAA;AAAA;AAIA,IAAAK,KAAA,gBAAAT,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAO,KAAA,EAAAN,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAK,KAAA,CAAAL,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAC,KAAA,CAAAL,GAAA;IAAA;EAAA;AAAA"}
1
+ {"version":3,"file":"index.js","names":["_Anchor","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get","_Link","_useClickAway","_usePagination"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":";;;;;AA6BA,IAAAA,OAAA,gBAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,OAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,OAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAT,OAAA,CAAAK,GAAA;IAAA;EAAA;AAAA;AAIA,IAAAK,KAAA,gBAAAT,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAO,KAAA,EAAAN,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAK,KAAA,CAAAL,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAC,KAAA,CAAAL,GAAA;IAAA;EAAA;AAAA;AAKA,IAAAM,aAAA,gBAAAV,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAQ,aAAA,EAAAP,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAM,aAAA,CAAAN,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAE,aAAA,CAAAN,GAAA;IAAA;EAAA;AAAA;AAKA,IAAAO,cAAA,gBAAAX,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAS,cAAA,EAAAR,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAO,cAAA,CAAAP,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAG,cAAA,CAAAP,GAAA;IAAA;EAAA;AAAA"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.addEventListeners = addEventListeners;
7
+ var Fx = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@typed/fx/Fx"));
8
+ var Effect = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Effect"));
9
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
10
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
11
+ function addEventListeners(target, ...events) {
12
+ return Fx.fromEmitter(emitter => {
13
+ events.forEach(event => target.addEventListener(event, emitter.succeed));
14
+ return Effect.addFinalizer(() => Effect.sync(() => {
15
+ events.forEach(event => target.addEventListener(event, emitter.succeed));
16
+ }));
17
+ });
18
+ }
19
+ //# sourceMappingURL=addEventListener.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addEventListener.js","names":["Fx","_interopRequireWildcard","require","Effect","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","addEventListeners","target","events","fromEmitter","emitter","forEach","event","addEventListener","succeed","addFinalizer","sync"],"sources":["../../../src/internal/addEventListener.ts"],"sourcesContent":[null],"mappings":";;;;;;AACA,IAAAA,EAAA,gBAAAC,uBAAA,eAAAC,OAAA;AAEA,IAAAC,MAAA,gBAAAF,uBAAA,eAAAC,OAAA;AAAuC,SAAAE,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAJ,wBAAAI,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,OAAAQ,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAjB,CAAA,EAAAc,CAAA,SAAAI,CAAA,GAAAR,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAI,CAAA,KAAAA,CAAA,CAAAX,GAAA,IAAAW,CAAA,CAAAC,GAAA,IAAAR,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAI,CAAA,IAAAV,CAAA,CAAAM,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAN,CAAA,CAAAH,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAgB,GAAA,CAAAnB,CAAA,EAAAQ,CAAA,GAAAA,CAAA;AAEjC,SAAUY,iBAAiBA,CAC/BC,MAAS,EACT,GAAGC,MAAc;EAEjB,OAAO3B,EAAE,CAAC4B,WAAW,CAA+EC,OAAO,IAAI;IAC7GF,MAAM,CAACG,OAAO,CAAEC,KAAK,IAAKL,MAAM,CAACM,gBAAgB,CAACD,KAAe,EAAEF,OAAO,CAACI,OAAc,CAAC,CAAC;IAE3F,OAAO9B,MAAM,CAAC+B,YAAY,CAAC,MACzB/B,MAAM,CAACgC,IAAI,CAAC,MAAK;MACfR,MAAM,CAACG,OAAO,CAAEC,KAAK,IAAKL,MAAM,CAACM,gBAAgB,CAACD,KAAe,EAAEF,OAAO,CAACI,OAAc,CAAC,CAAC;IAC7F,CAAC,CAAC,CACH;EACH,CAAC,CAAC;AACJ"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.onClickAway = onClickAway;
7
+ exports.useClickAway = useClickAway;
8
+ var _Document = /*#__PURE__*/require("@typed/dom/Document");
9
+ var Fx = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@typed/fx/Fx"));
10
+ var _ElementSource = /*#__PURE__*/require("@typed/template/ElementSource");
11
+ var _effect = /*#__PURE__*/require("effect");
12
+ var _addEventListener = /*#__PURE__*/require("./internal/addEventListener");
13
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
14
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
15
+ /**
16
+ * @since 1.0.0
17
+ */
18
+
19
+ /**
20
+ * @since 1.0.0
21
+ */
22
+ function useClickAway(refs, f) {
23
+ return Fx.forkScoped(onClickAway(refs, f));
24
+ }
25
+ /**
26
+ * @since 1.0.0
27
+ */
28
+ function onClickAway(refs, f) {
29
+ return Fx.fromFxEffect(_Document.Document.with(document => {
30
+ const events = (0, _addEventListener.addEventListeners)(document, "click", "touchend", "contextmenu");
31
+ const elements = Fx.map(Fx.combine(refs), els => els.flatMap(_ElementSource.getElements));
32
+ return Fx.mapEffect(Fx.compact(Fx.snapshot(events, elements, containsRefs)), f);
33
+ }));
34
+ }
35
+ const containsRefs = (event, refs) => _effect.Effect.sync(() => {
36
+ const target = event.target;
37
+ if (target === null || refs.some(c => c === target || c.contains(target))) {
38
+ return _effect.Option.none();
39
+ } else {
40
+ return _effect.Option.some(event);
41
+ }
42
+ });
43
+ //# sourceMappingURL=useClickAway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useClickAway.js","names":["_Document","require","Fx","_interopRequireWildcard","_ElementSource","_effect","_addEventListener","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","useClickAway","refs","f","forkScoped","onClickAway","fromFxEffect","Document","with","document","events","addEventListeners","elements","map","combine","els","flatMap","getElements","mapEffect","compact","snapshot","containsRefs","event","Effect","sync","target","some","c","contains","Option","none"],"sources":["../../src/useClickAway.ts"],"sourcesContent":[null],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.usePagination = usePagination;
7
+ var Computed = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@typed/fx/Computed"));
8
+ var RefSubject = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@typed/fx/RefSubject"));
9
+ var _effect = /*#__PURE__*/require("effect");
10
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
11
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
12
+ /**
13
+ * @since 1.0.0
14
+ */
15
+
16
+ /**
17
+ * @since 1.0.0
18
+ */
19
+ function usePagination(items, options = {}) {
20
+ return _effect.Effect.gen(function* (_) {
21
+ const ctx = yield* _(_effect.Effect.context());
22
+ const page = yield* _(RefSubject.of(options.initialPage ?? 0));
23
+ const pageSize = yield* _(RefSubject.of(options.initialPageSize ?? 10));
24
+ const canGoBack = page.map(x => x > 0);
25
+ const combined = Computed.provide(Computed.combine([page, pageSize, items]), ctx);
26
+ const canGoForward = combined.map(([page, pageSize, results]) => page < Math.ceil(results.length / pageSize - 1));
27
+ const getTotalPages = _effect.Effect.provide(_effect.Effect.gen(function* ($) {
28
+ const currentPageSize = yield* $(pageSize);
29
+ const results = yield* $(items);
30
+ return Math.ceil(results.length / currentPageSize - 1);
31
+ }), ctx);
32
+ const goBack = page.update(x => Math.max(x - 1, 0));
33
+ const goForward = page.updateEffect(currentPage => _effect.Effect.gen(function* ($) {
34
+ const totalPages = yield* $(getTotalPages);
35
+ const nextPage = Math.min(currentPage + 1, totalPages);
36
+ return nextPage;
37
+ }));
38
+ const goToStart = page.set(0);
39
+ const goToEnd = page.updateEffect(() => getTotalPages);
40
+ const paginated = combined.map(([page, pageSize, results]) => {
41
+ const start = page * pageSize;
42
+ const end = start + pageSize;
43
+ return results.slice(start, end);
44
+ });
45
+ const viewing = combined.map(([page, pageSize, results]) => {
46
+ const start = page * pageSize;
47
+ const end = start + pageSize;
48
+ const total = results.length;
49
+ return {
50
+ from: start + 1,
51
+ to: Math.min(end, total),
52
+ total
53
+ };
54
+ });
55
+ return {
56
+ page,
57
+ pageSize,
58
+ canGoBack,
59
+ canGoForward,
60
+ goBack,
61
+ goForward,
62
+ goToStart,
63
+ goToEnd,
64
+ paginated,
65
+ viewing
66
+ };
67
+ });
68
+ }
69
+ //# sourceMappingURL=usePagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePagination.js","names":["Computed","_interopRequireWildcard","require","RefSubject","_effect","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","usePagination","items","options","Effect","gen","_","ctx","context","page","of","initialPage","pageSize","initialPageSize","canGoBack","map","x","combined","provide","combine","canGoForward","results","Math","ceil","length","getTotalPages","$","currentPageSize","goBack","update","max","goForward","updateEffect","currentPage","totalPages","nextPage","min","goToStart","goToEnd","paginated","start","end","slice","viewing","total","from","to"],"sources":["../../src/usePagination.ts"],"sourcesContent":[null],"mappings":"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"}
@@ -9,4 +9,12 @@ export * from "./Anchor.js";
9
9
  * @since 1.0.0
10
10
  */
11
11
  export * from "./Link.js";
12
+ /**
13
+ * @since 1.0.0
14
+ */
15
+ export * from "./useClickAway.js";
16
+ /**
17
+ * @since 1.0.0
18
+ */
19
+ export * from "./usePagination.js";
12
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,cAAc,aAAa,CAAA;AAC3B;;GAEG;AACH,cAAc,WAAW,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwBH;;GAEG;AACH,cAAc,aAAa,CAAA;AAC3B;;GAEG;AACH,cAAc,WAAW,CAAA;AAEzB;;GAEG;AACH,cAAc,mBAAmB,CAAA;AAEjC;;GAEG;AACH,cAAc,oBAAoB,CAAA"}
@@ -0,0 +1,5 @@
1
+ import type { EventWithCurrentTarget } from "@typed/dom/EventTarget";
2
+ import * as Fx from "@typed/fx/Fx";
3
+ import type { DefaultEventMap } from "@typed/template/ElementSource";
4
+ export declare function addEventListeners<T extends EventTarget, Events extends ReadonlyArray<keyof DefaultEventMap<T>>>(target: T, ...events: Events): Fx.Fx<never, never, EventWithCurrentTarget<T, DefaultEventMap<T>[Events[number]]>>;
5
+ //# sourceMappingURL=addEventListener.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addEventListener.d.ts","sourceRoot":"","sources":["../../../src/internal/addEventListener.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AACpE,OAAO,KAAK,EAAE,MAAM,cAAc,CAAA;AAClC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAGpE,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,WAAW,EAAE,MAAM,SAAS,aAAa,CAAC,MAAM,eAAe,CAAC,CAAC,CAAC,CAAC,EAC7G,MAAM,EAAE,CAAC,EACT,GAAG,MAAM,EAAE,MAAM,sFAWlB"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import { Document } from "@typed/dom/Document";
5
+ import type { EventWithCurrentTarget } from "@typed/dom/EventTarget";
6
+ import * as Fx from "@typed/fx/Fx";
7
+ import type * as ElementRef from "@typed/template/ElementRef";
8
+ import type { Fiber, Scope } from "effect";
9
+ import { Effect } from "effect";
10
+ /**
11
+ * @since 1.0.0
12
+ */
13
+ export declare function useClickAway<Refs extends ReadonlyArray<ElementRef.ElementRef<any>>, R2>(refs: Refs, f: (event: EventWithCurrentTarget<Document, MouseEvent | TouchEvent>) => Effect.Effect<R2, never, unknown>): Effect.Effect<Document | Scope.Scope | R2, never, Fiber.RuntimeFiber<never, void>>;
14
+ /**
15
+ * @since 1.0.0
16
+ */
17
+ export declare function onClickAway<Refs extends ReadonlyArray<ElementRef.ElementRef<any>>, R2, E2, B>(refs: Refs, f: (event: EventWithCurrentTarget<Document, MouseEvent | TouchEvent>) => Effect.Effect<R2, E2, B>): Fx.Fx<Document | R2, E2, B>;
18
+ //# sourceMappingURL=useClickAway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useClickAway.d.ts","sourceRoot":"","sources":["../../src/useClickAway.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AACpE,OAAO,KAAK,EAAE,MAAM,cAAc,CAAA;AAClC,OAAO,KAAK,KAAK,UAAU,MAAM,4BAA4B,CAAA;AAG7D,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC1C,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAA;AAGvC;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,SAAS,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EACrF,IAAI,EAAE,IAAI,EACV,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,CAAC,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,GACzG,MAAM,CAAC,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,KAAK,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAEpF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,SAAS,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAC3F,IAAI,EAAE,IAAI,EACV,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,CAAC,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,GAChG,EAAE,CAAC,EAAE,CAAC,QAAQ,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAa7B"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import * as Computed from "@typed/fx/Computed";
5
+ import type { Scope } from "effect";
6
+ import { Effect } from "effect";
7
+ /**
8
+ * @since 1.0.0
9
+ */
10
+ export type PaginationOptions = {
11
+ readonly initialPage?: number;
12
+ readonly initialPageSize?: number;
13
+ };
14
+ /**
15
+ * @since 1.0.0
16
+ */
17
+ export interface Pagination<E, A> {
18
+ readonly page: Computed.Computed<never, never, number>;
19
+ readonly pageSize: Computed.Computed<never, never, number>;
20
+ readonly canGoBack: Computed.Computed<never, never, boolean>;
21
+ readonly canGoForward: Computed.Computed<never, E, boolean>;
22
+ readonly paginated: Computed.Computed<never, E, ReadonlyArray<A>>;
23
+ readonly viewing: Computed.Computed<never, E, Viewing>;
24
+ readonly goBack: Effect.Effect<never, never, number>;
25
+ readonly goForward: Effect.Effect<never, E, number>;
26
+ readonly goToStart: Effect.Effect<never, never, number>;
27
+ readonly goToEnd: Effect.Effect<never, E, number>;
28
+ }
29
+ /**
30
+ * @since 1.0.0
31
+ */
32
+ export interface Viewing {
33
+ readonly from: number;
34
+ readonly to: number;
35
+ readonly total: number;
36
+ }
37
+ /**
38
+ * @since 1.0.0
39
+ */
40
+ export declare function usePagination<R, E, A>(items: Computed.Computed<R, E, ReadonlyArray<A>>, options?: PaginationOptions): Effect.Effect<R | Scope.Scope, never, Pagination<E, A>>;
41
+ //# sourceMappingURL=usePagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePagination.d.ts","sourceRoot":"","sources":["../../src/usePagination.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,QAAQ,MAAM,oBAAoB,CAAA;AAE9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAClC,CAAA;AAED;;GAEG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC,EAAE,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IACtD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IAC1D,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;IAC5D,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,CAAA;IAC3D,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;IACjE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,CAAA;IAEtD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IACpD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,CAAA;IACnD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IACvD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,CAAA;CAClD;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACnC,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,EAChD,OAAO,GAAE,iBAAsB,GAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAqEzD"}
package/dist/esm/index.js CHANGED
@@ -1,6 +1,27 @@
1
1
  /**
2
2
  * @since 1.0.0
3
3
  */
4
+ // TODO:
5
+ // Form + Fields/FieldGroups
6
+ // Masking
7
+ // Accordion
8
+ // Button
9
+ // Select
10
+ // MultiSelect
11
+ // Drag and drop
12
+ // Popovers
13
+ // Portals
14
+ // Menu
15
+ // Trees
16
+ // Modals
17
+ // Search/Autocomplete
18
+ // Tables
19
+ // Editable Tables
20
+ // File uploads
21
+ // Focus management
22
+ // Toasts
23
+ // Virtualization
24
+ // Optimistic UI helpers??
4
25
  /**
5
26
  * @since 1.0.0
6
27
  */
@@ -9,4 +30,12 @@ export * from "./Anchor.js";
9
30
  * @since 1.0.0
10
31
  */
11
32
  export * from "./Link.js";
33
+ /**
34
+ * @since 1.0.0
35
+ */
36
+ export * from "./useClickAway.js";
37
+ /**
38
+ * @since 1.0.0
39
+ */
40
+ export * from "./usePagination.js";
12
41
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,cAAc,aAAa,CAAA;AAC3B;;GAEG;AACH,cAAc,WAAW,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,QAAQ;AACR,4BAA4B;AAC5B,UAAU;AACV,YAAY;AACZ,SAAS;AACT,SAAS;AACT,cAAc;AACd,gBAAgB;AAChB,WAAW;AACX,UAAU;AACV,OAAO;AACP,QAAQ;AACR,SAAS;AACT,sBAAsB;AACtB,SAAS;AACT,kBAAkB;AAClB,eAAe;AACf,mBAAmB;AACnB,SAAS;AACT,iBAAiB;AACjB,0BAA0B;AAE1B;;GAEG;AACH,cAAc,aAAa,CAAA;AAC3B;;GAEG;AACH,cAAc,WAAW,CAAA;AAEzB;;GAEG;AACH,cAAc,mBAAmB,CAAA;AAEjC;;GAEG;AACH,cAAc,oBAAoB,CAAA"}
@@ -0,0 +1,11 @@
1
+ import * as Fx from "@typed/fx/Fx";
2
+ import * as Effect from "effect/Effect";
3
+ export function addEventListeners(target, ...events) {
4
+ return Fx.fromEmitter((emitter) => {
5
+ events.forEach((event) => target.addEventListener(event, emitter.succeed));
6
+ return Effect.addFinalizer(() => Effect.sync(() => {
7
+ events.forEach((event) => target.addEventListener(event, emitter.succeed));
8
+ }));
9
+ });
10
+ }
11
+ //# sourceMappingURL=addEventListener.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addEventListener.js","sourceRoot":"","sources":["../../../src/internal/addEventListener.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,cAAc,CAAA;AAElC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,MAAM,UAAU,iBAAiB,CAC/B,MAAS,EACT,GAAG,MAAc;IAEjB,OAAO,EAAE,CAAC,WAAW,CAA8E,CAAC,OAAO,EAAE,EAAE;QAC7G,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAe,EAAE,OAAO,CAAC,OAAc,CAAC,CAAC,CAAA;QAE3F,OAAO,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAC9B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YACf,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAe,EAAE,OAAO,CAAC,OAAc,CAAC,CAAC,CAAA;QAC7F,CAAC,CAAC,CACH,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import { Document } from "@typed/dom/Document";
5
+ import * as Fx from "@typed/fx/Fx";
6
+ import { getElements } from "@typed/template/ElementSource";
7
+ import { Effect, Option } from "effect";
8
+ import { addEventListeners } from "./internal/addEventListener";
9
+ /**
10
+ * @since 1.0.0
11
+ */
12
+ export function useClickAway(refs, f) {
13
+ return Fx.forkScoped(onClickAway(refs, f));
14
+ }
15
+ /**
16
+ * @since 1.0.0
17
+ */
18
+ export function onClickAway(refs, f) {
19
+ return Fx.fromFxEffect(Document.with((document) => {
20
+ const events = addEventListeners(document, "click", "touchend", "contextmenu");
21
+ const elements = Fx.map(Fx.combine(refs), (els) => els.flatMap(getElements));
22
+ return Fx.mapEffect(Fx.compact(Fx.snapshot(events, elements, containsRefs)), f);
23
+ }));
24
+ }
25
+ const containsRefs = (event, refs) => Effect.sync(() => {
26
+ const target = event.target;
27
+ if (target === null ||
28
+ refs.some((c) => c === target ||
29
+ c.contains(target))) {
30
+ return Option.none();
31
+ }
32
+ else {
33
+ return Option.some(event);
34
+ }
35
+ });
36
+ //# sourceMappingURL=useClickAway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useClickAway.js","sourceRoot":"","sources":["../../src/useClickAway.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAE9C,OAAO,KAAK,EAAE,MAAM,cAAc,CAAA;AAElC,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAG3D,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAE/D;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAU,EACV,CAA0G;IAE1G,OAAO,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,IAAU,EACV,CAAiG;IAEjG,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;QAChD,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC,CAAA;QAC9E,MAAM,QAAQ,GAAG,EAAE,CAAC,GAAG,CACrB,EAAE,CAAC,OAAO,CAAC,IAAoD,CAAC,EAChE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAClC,CAAA;QAED,OAAO,EAAE,CAAC,SAAS,CACjB,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,EACvD,CAAC,CACF,CAAA;IACH,CAAC,CAAC,CAAC,CAAA;AACL,CAAC;AAED,MAAM,YAAY,GAAG,CAAC,KAAgE,EAAE,IAA4B,EAAE,EAAE,CACtH,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;IACf,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;IAE3B,IACE,MAAM,KAAK,IAAI;QACf,IAAI,CAAC,IAAI,CACP,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,KAAK,MAAM;YACZ,CAAC,CAAC,QAAQ,CAAC,MAAiB,CAAC,CAChC,EACD,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,EAAE,CAAA;IACtB,CAAC;SAAM,CAAC;QACN,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC3B,CAAC;AACH,CAAC,CAAC,CAAA"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import * as Computed from "@typed/fx/Computed";
5
+ import * as RefSubject from "@typed/fx/RefSubject";
6
+ import { Effect } from "effect";
7
+ /**
8
+ * @since 1.0.0
9
+ */
10
+ export function usePagination(items, options = {}) {
11
+ return Effect.gen(function* (_) {
12
+ const ctx = yield* _(Effect.context());
13
+ const page = yield* _(RefSubject.of(options.initialPage ?? 0));
14
+ const pageSize = yield* _(RefSubject.of(options.initialPageSize ?? 10));
15
+ const canGoBack = page.map((x) => x > 0);
16
+ const combined = Computed.provide(Computed.combine([page, pageSize, items]), ctx);
17
+ const canGoForward = combined.map(([page, pageSize, results]) => page < Math.ceil(results.length / pageSize - 1));
18
+ const getTotalPages = Effect.provide(Effect.gen(function* ($) {
19
+ const currentPageSize = yield* $(pageSize);
20
+ const results = yield* $(items);
21
+ return Math.ceil(results.length / currentPageSize - 1);
22
+ }), ctx);
23
+ const goBack = page.update((x) => Math.max(x - 1, 0));
24
+ const goForward = page.updateEffect((currentPage) => Effect.gen(function* ($) {
25
+ const totalPages = yield* $(getTotalPages);
26
+ const nextPage = Math.min(currentPage + 1, totalPages);
27
+ return nextPage;
28
+ }));
29
+ const goToStart = page.set(0);
30
+ const goToEnd = page.updateEffect(() => getTotalPages);
31
+ const paginated = combined.map(([page, pageSize, results]) => {
32
+ const start = page * pageSize;
33
+ const end = start + pageSize;
34
+ return results.slice(start, end);
35
+ });
36
+ const viewing = combined.map(([page, pageSize, results]) => {
37
+ const start = page * pageSize;
38
+ const end = start + pageSize;
39
+ const total = results.length;
40
+ return {
41
+ from: start + 1,
42
+ to: Math.min(end, total),
43
+ total
44
+ };
45
+ });
46
+ return {
47
+ page,
48
+ pageSize,
49
+ canGoBack,
50
+ canGoForward,
51
+ goBack,
52
+ goForward,
53
+ goToStart,
54
+ goToEnd,
55
+ paginated,
56
+ viewing
57
+ };
58
+ });
59
+ }
60
+ //# sourceMappingURL=usePagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePagination.js","sourceRoot":"","sources":["../../src/usePagination.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@typed/ui",
3
- "version": "0.1.5",
3
+ "version": "0.2.0",
4
4
  "description": "",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -10,18 +10,18 @@
10
10
  "sideEffects": [],
11
11
  "author": "Typed contributors",
12
12
  "dependencies": {
13
- "@effect/platform": "^0.31.1",
14
- "@effect/schema": "0.49.4",
15
- "csstype": "^3.1.2",
16
- "effect": "2.0.0-next.56",
17
- "@typed/context": "0.19.2",
18
- "@typed/dom": "8.19.2",
19
- "@typed/environment": "0.1.3",
20
- "@typed/fx": "1.18.4",
21
- "@typed/navigation": "0.6.4",
22
- "@typed/route": "1.0.4",
23
- "@typed/router": "0.19.5",
24
- "@typed/template": "0.1.4"
13
+ "@effect/platform": "^0.37.5",
14
+ "@effect/schema": "0.53.3",
15
+ "csstype": "^3.1.3",
16
+ "effect": "2.0.0-next.60",
17
+ "@typed/context": "0.20.0",
18
+ "@typed/environment": "0.2.0",
19
+ "@typed/fx": "1.19.0",
20
+ "@typed/navigation": "0.7.0",
21
+ "@typed/route": "1.1.0",
22
+ "@typed/dom": "8.20.0",
23
+ "@typed/template": "0.2.0",
24
+ "@typed/router": "0.20.0"
25
25
  },
26
26
  "main": "./dist/cjs/index.js",
27
27
  "module": "./dist/esm/index.js",
@@ -42,6 +42,16 @@
42
42
  "types": "./dist/dts/Link.d.ts",
43
43
  "import": "./dist/esm/Link.js",
44
44
  "default": "./dist/cjs/Link.js"
45
+ },
46
+ "./useClickAway": {
47
+ "types": "./dist/dts/useClickAway.d.ts",
48
+ "import": "./dist/esm/useClickAway.js",
49
+ "default": "./dist/cjs/useClickAway.js"
50
+ },
51
+ "./usePagination": {
52
+ "types": "./dist/dts/usePagination.d.ts",
53
+ "import": "./dist/esm/usePagination.js",
54
+ "default": "./dist/cjs/usePagination.js"
45
55
  }
46
56
  },
47
57
  "typesVersions": {
@@ -51,6 +61,12 @@
51
61
  ],
52
62
  "Link": [
53
63
  "./dist/dts/Link.d.ts"
64
+ ],
65
+ "useClickAway": [
66
+ "./dist/dts/useClickAway.d.ts"
67
+ ],
68
+ "usePagination": [
69
+ "./dist/dts/usePagination.d.ts"
54
70
  ]
55
71
  }
56
72
  }
package/src/index.ts CHANGED
@@ -2,6 +2,28 @@
2
2
  * @since 1.0.0
3
3
  */
4
4
 
5
+ // TODO:
6
+ // Form + Fields/FieldGroups
7
+ // Masking
8
+ // Accordion
9
+ // Button
10
+ // Select
11
+ // MultiSelect
12
+ // Drag and drop
13
+ // Popovers
14
+ // Portals
15
+ // Menu
16
+ // Trees
17
+ // Modals
18
+ // Search/Autocomplete
19
+ // Tables
20
+ // Editable Tables
21
+ // File uploads
22
+ // Focus management
23
+ // Toasts
24
+ // Virtualization
25
+ // Optimistic UI helpers??
26
+
5
27
  /**
6
28
  * @since 1.0.0
7
29
  */
@@ -10,3 +32,13 @@ export * from "./Anchor.js"
10
32
  * @since 1.0.0
11
33
  */
12
34
  export * from "./Link.js"
35
+
36
+ /**
37
+ * @since 1.0.0
38
+ */
39
+ export * from "./useClickAway.js"
40
+
41
+ /**
42
+ * @since 1.0.0
43
+ */
44
+ export * from "./usePagination.js"
@@ -0,0 +1,19 @@
1
+ import type { EventWithCurrentTarget } from "@typed/dom/EventTarget"
2
+ import * as Fx from "@typed/fx/Fx"
3
+ import type { DefaultEventMap } from "@typed/template/ElementSource"
4
+ import * as Effect from "effect/Effect"
5
+
6
+ export function addEventListeners<T extends EventTarget, Events extends ReadonlyArray<keyof DefaultEventMap<T>>>(
7
+ target: T,
8
+ ...events: Events
9
+ ) {
10
+ return Fx.fromEmitter<never, never, EventWithCurrentTarget<T, DefaultEventMap<T>[Events[number]]>>((emitter) => {
11
+ events.forEach((event) => target.addEventListener(event as string, emitter.succeed as any))
12
+
13
+ return Effect.addFinalizer(() =>
14
+ Effect.sync(() => {
15
+ events.forEach((event) => target.addEventListener(event as string, emitter.succeed as any))
16
+ })
17
+ )
18
+ })
19
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+
5
+ import { Document } from "@typed/dom/Document"
6
+ import type { EventWithCurrentTarget } from "@typed/dom/EventTarget"
7
+ import * as Fx from "@typed/fx/Fx"
8
+ import type * as ElementRef from "@typed/template/ElementRef"
9
+ import { getElements } from "@typed/template/ElementSource"
10
+ import type { Rendered } from "@typed/wire"
11
+ import type { Fiber, Scope } from "effect"
12
+ import { Effect, Option } from "effect"
13
+ import { addEventListeners } from "./internal/addEventListener"
14
+
15
+ /**
16
+ * @since 1.0.0
17
+ */
18
+ export function useClickAway<Refs extends ReadonlyArray<ElementRef.ElementRef<any>>, R2>(
19
+ refs: Refs,
20
+ f: (event: EventWithCurrentTarget<Document, MouseEvent | TouchEvent>) => Effect.Effect<R2, never, unknown>
21
+ ): Effect.Effect<Document | Scope.Scope | R2, never, Fiber.RuntimeFiber<never, void>> {
22
+ return Fx.forkScoped(onClickAway(refs, f))
23
+ }
24
+
25
+ /**
26
+ * @since 1.0.0
27
+ */
28
+ export function onClickAway<Refs extends ReadonlyArray<ElementRef.ElementRef<any>>, R2, E2, B>(
29
+ refs: Refs,
30
+ f: (event: EventWithCurrentTarget<Document, MouseEvent | TouchEvent>) => Effect.Effect<R2, E2, B>
31
+ ): Fx.Fx<Document | R2, E2, B> {
32
+ return Fx.fromFxEffect(Document.with((document) => {
33
+ const events = addEventListeners(document, "click", "touchend", "contextmenu")
34
+ const elements = Fx.map(
35
+ Fx.combine(refs as ReadonlyArray<Fx.Fx<never, never, Rendered>>),
36
+ (els) => els.flatMap(getElements)
37
+ )
38
+
39
+ return Fx.mapEffect(
40
+ Fx.compact(Fx.snapshot(events, elements, containsRefs)),
41
+ f
42
+ )
43
+ }))
44
+ }
45
+
46
+ const containsRefs = (event: EventWithCurrentTarget<Document, MouseEvent | TouchEvent>, refs: ReadonlyArray<Element>) =>
47
+ Effect.sync(() => {
48
+ const target = event.target
49
+
50
+ if (
51
+ target === null ||
52
+ refs.some(
53
+ (c) =>
54
+ c === target ||
55
+ c.contains(target as Element)
56
+ )
57
+ ) {
58
+ return Option.none()
59
+ } else {
60
+ return Option.some(event)
61
+ }
62
+ })
@@ -0,0 +1,119 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+
5
+ import * as Computed from "@typed/fx/Computed"
6
+ import * as RefSubject from "@typed/fx/RefSubject"
7
+ import type { Scope } from "effect"
8
+ import { Effect } from "effect"
9
+
10
+ /**
11
+ * @since 1.0.0
12
+ */
13
+ export type PaginationOptions = {
14
+ readonly initialPage?: number // 0
15
+ readonly initialPageSize?: number // 10
16
+ }
17
+
18
+ /**
19
+ * @since 1.0.0
20
+ */
21
+ export interface Pagination<E, A> {
22
+ readonly page: Computed.Computed<never, never, number>
23
+ readonly pageSize: Computed.Computed<never, never, number>
24
+ readonly canGoBack: Computed.Computed<never, never, boolean>
25
+ readonly canGoForward: Computed.Computed<never, E, boolean>
26
+ readonly paginated: Computed.Computed<never, E, ReadonlyArray<A>>
27
+ readonly viewing: Computed.Computed<never, E, Viewing>
28
+
29
+ readonly goBack: Effect.Effect<never, never, number>
30
+ readonly goForward: Effect.Effect<never, E, number>
31
+ readonly goToStart: Effect.Effect<never, never, number>
32
+ readonly goToEnd: Effect.Effect<never, E, number>
33
+ }
34
+
35
+ /**
36
+ * @since 1.0.0
37
+ */
38
+ export interface Viewing {
39
+ readonly from: number
40
+ readonly to: number
41
+ readonly total: number
42
+ }
43
+
44
+ /**
45
+ * @since 1.0.0
46
+ */
47
+ export function usePagination<R, E, A>(
48
+ items: Computed.Computed<R, E, ReadonlyArray<A>>,
49
+ options: PaginationOptions = {}
50
+ ): Effect.Effect<R | Scope.Scope, never, Pagination<E, A>> {
51
+ return Effect.gen(function*(_) {
52
+ const ctx = yield* _(Effect.context<R>())
53
+ const page: RefSubject.RefSubject<never, never, number> = yield* _(RefSubject.of(options.initialPage ?? 0))
54
+ const pageSize: RefSubject.RefSubject<never, never, number> = yield* _(RefSubject.of(options.initialPageSize ?? 10))
55
+ const canGoBack: Computed.Computed<never, never, boolean> = page.map((x) => x > 0)
56
+ const combined: Computed.Computed<never, E, readonly [number, number, ReadonlyArray<A>]> = Computed.provide(
57
+ Computed.combine([page, pageSize, items] as const),
58
+ ctx
59
+ )
60
+ const canGoForward: Computed.Computed<never, E, boolean> = combined.map(
61
+ ([page, pageSize, results]) => page < Math.ceil(results.length / pageSize - 1)
62
+ )
63
+
64
+ const getTotalPages: Effect.Effect<never, E, number> = Effect.provide(
65
+ Effect.gen(function*($) {
66
+ const currentPageSize = yield* $(pageSize)
67
+ const results = yield* $(items)
68
+
69
+ return Math.ceil(results.length / currentPageSize - 1)
70
+ }),
71
+ ctx
72
+ )
73
+ const goBack: Effect.Effect<never, never, number> = page.update((x) => Math.max(x - 1, 0))
74
+ const goForward: Effect.Effect<never, E, number> = page.updateEffect((currentPage) =>
75
+ Effect.gen(function*($) {
76
+ const totalPages = yield* $(getTotalPages)
77
+ const nextPage = Math.min(currentPage + 1, totalPages)
78
+
79
+ return nextPage
80
+ })
81
+ )
82
+ const goToStart: Effect.Effect<never, never, number> = page.set(0)
83
+ const goToEnd: Effect.Effect<never, E, number> = page.updateEffect(() => getTotalPages)
84
+
85
+ const paginated: Computed.Computed<never, E, ReadonlyArray<A>> = combined.map(([page, pageSize, results]) => {
86
+ const start = page * pageSize
87
+ const end = start + pageSize
88
+
89
+ return results.slice(start, end)
90
+ })
91
+
92
+ const viewing: Computed.Computed<never, E, Viewing> = combined.map(
93
+ ([page, pageSize, results]) => {
94
+ const start = page * pageSize
95
+ const end = start + pageSize
96
+ const total = results.length
97
+
98
+ return {
99
+ from: start + 1,
100
+ to: Math.min(end, total),
101
+ total
102
+ }
103
+ }
104
+ )
105
+
106
+ return {
107
+ page,
108
+ pageSize,
109
+ canGoBack,
110
+ canGoForward,
111
+ goBack,
112
+ goForward,
113
+ goToStart,
114
+ goToEnd,
115
+ paginated,
116
+ viewing
117
+ } as const
118
+ })
119
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../dist/cjs/useClickAway.js",
3
+ "module": "../dist/esm/useClickAway.js",
4
+ "types": "../dist/dts/useClickAway.d.ts",
5
+ "sideEffects": []
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../dist/cjs/usePagination.js",
3
+ "module": "../dist/esm/usePagination.js",
4
+ "types": "../dist/dts/usePagination.d.ts",
5
+ "sideEffects": []
6
+ }