@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.
- package/Anchor/package.json +6 -0
- package/Link/package.json +6 -0
- package/dist/cjs/index.js +22 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/internal/addEventListener.js +19 -0
- package/dist/cjs/internal/addEventListener.js.map +1 -0
- package/dist/cjs/useClickAway.js +43 -0
- package/dist/cjs/useClickAway.js.map +1 -0
- package/dist/cjs/usePagination.js +69 -0
- package/dist/cjs/usePagination.js.map +1 -0
- package/dist/dts/index.d.ts +8 -0
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/dts/internal/addEventListener.d.ts +5 -0
- package/dist/dts/internal/addEventListener.d.ts.map +1 -0
- package/dist/dts/useClickAway.d.ts +18 -0
- package/dist/dts/useClickAway.d.ts.map +1 -0
- package/dist/dts/usePagination.d.ts +41 -0
- package/dist/dts/usePagination.d.ts.map +1 -0
- package/dist/esm/index.js +29 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internal/addEventListener.js +11 -0
- package/dist/esm/internal/addEventListener.js.map +1 -0
- package/dist/esm/useClickAway.js +36 -0
- package/dist/esm/useClickAway.js.map +1 -0
- package/dist/esm/usePagination.js +60 -0
- package/dist/esm/usePagination.js.map +1 -0
- package/package.json +29 -13
- package/src/index.ts +32 -0
- package/src/internal/addEventListener.ts +19 -0
- package/src/useClickAway.ts +62 -0
- package/src/usePagination.ts +119 -0
- package/useClickAway/package.json +6 -0
- package/usePagination/package.json +6 -0
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
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -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":";;;;;
|
|
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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"}
|
package/dist/dts/index.d.ts
CHANGED
|
@@ -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
|
package/dist/dts/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
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
|
package/dist/esm/index.js.map
CHANGED
|
@@ -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.
|
|
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.
|
|
14
|
-
"@effect/schema": "0.
|
|
15
|
-
"csstype": "^3.1.
|
|
16
|
-
"effect": "2.0.0-next.
|
|
17
|
-
"@typed/context": "0.
|
|
18
|
-
"@typed/
|
|
19
|
-
"@typed/
|
|
20
|
-
"@typed/
|
|
21
|
-
"@typed/
|
|
22
|
-
"@typed/
|
|
23
|
-
"@typed/
|
|
24
|
-
"@typed/
|
|
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
|
+
}
|