@onepercentio/one-ui 0.13.9-rc2 → 0.14.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/WebpackConfigs/scripts/css-inliner.ts +19 -14
- package/dist/hooks/ui/usePaginationControls.d.ts +1 -1
- package/dist/hooks/ui/usePaginationControls.js +51 -4
- package/dist/hooks/ui/usePaginationControls.js.map +1 -1
- package/dist/utils/html.utils.d.ts +1 -0
- package/dist/utils/html.utils.js +8 -0
- package/dist/utils/html.utils.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
function getTextNodesIn(elem: HTMLElement): ChildNode[] {
|
|
2
2
|
var textNodes: ChildNode[] = [];
|
|
3
3
|
if (elem) {
|
|
4
|
-
for (var nodes = elem.childNodes, i = nodes.length; i--;) {
|
|
5
|
-
var node = nodes[i],
|
|
4
|
+
for (var nodes = elem.childNodes, i = nodes.length; i--; ) {
|
|
5
|
+
var node = nodes[i],
|
|
6
|
+
nodeType = node.nodeType;
|
|
6
7
|
if (nodeType == 3) {
|
|
7
|
-
|
|
8
|
-
}
|
|
9
|
-
else if (nodeType == 1 || nodeType == 9 || nodeType == 11) {
|
|
8
|
+
textNodes.push(node);
|
|
9
|
+
} else if (nodeType == 1 || nodeType == 9 || nodeType == 11) {
|
|
10
10
|
textNodes = textNodes.concat(getTextNodesIn(node as HTMLElement));
|
|
11
11
|
}
|
|
12
12
|
}
|
|
@@ -23,6 +23,8 @@ export default function inlineCSS() {
|
|
|
23
23
|
allEls.forEach((el) => {
|
|
24
24
|
const styles = window.getComputedStyle(el);
|
|
25
25
|
|
|
26
|
+
if (el.getAttribute("data-debug")) console.log(styles);
|
|
27
|
+
|
|
26
28
|
const inlined = Array.from(styles)
|
|
27
29
|
.map((k) => `${k}: ${styles.getPropertyValue(k)}`)
|
|
28
30
|
.join("; ")
|
|
@@ -35,16 +37,19 @@ export default function inlineCSS() {
|
|
|
35
37
|
el.setAttribute("style", s);
|
|
36
38
|
});
|
|
37
39
|
|
|
38
|
-
getTextNodesIn(document.body).forEach(n => {
|
|
39
|
-
n.replaceWith(
|
|
40
|
-
.
|
|
41
|
-
|
|
42
|
-
(
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
40
|
+
getTextNodesIn(document.body).forEach((n) => {
|
|
41
|
+
n.replaceWith(
|
|
42
|
+
...n.textContent
|
|
43
|
+
.split(/\n/g)
|
|
44
|
+
.reduce(
|
|
45
|
+
(r, txt, i, arr) =>
|
|
46
|
+
arr.length - 1 === i
|
|
47
|
+
? [...r, txt]
|
|
48
|
+
: [...r, txt, document.createElement("br")],
|
|
49
|
+
[] as (Node | string)[]
|
|
50
|
+
)
|
|
46
51
|
);
|
|
47
|
-
})
|
|
52
|
+
});
|
|
48
53
|
|
|
49
54
|
if (process.env.NODE_ENV !== "test")
|
|
50
55
|
document.querySelectorAll("style").forEach((e) => e.remove());
|
|
@@ -2,7 +2,7 @@ import { RefObject } from "react";
|
|
|
2
2
|
/**
|
|
3
3
|
* This hook handles the display of pagination controls for the user to move to another page
|
|
4
4
|
*/
|
|
5
|
-
export default function usePaginationControls(containerRef: RefObject<HTMLDivElement>, { snapToPage, baseWidth, snapToCutElement, }?: {
|
|
5
|
+
export default function usePaginationControls(containerRef: RefObject<HTMLDivElement>, { snapToPage, baseWidth, snapToCutElement: _snapToCutElement, }?: {
|
|
6
6
|
snapToPage?: boolean;
|
|
7
7
|
baseWidth?: number;
|
|
8
8
|
/** This will scroll only until the partially visible element is at the border, instead of scrolling all the container */
|
|
@@ -22,6 +22,17 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
22
22
|
__setModuleDefault(result, mod);
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
26
|
+
var t = {};
|
|
27
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
28
|
+
t[p] = s[p];
|
|
29
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
30
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
31
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
32
|
+
t[p[i]] = s[p[i]];
|
|
33
|
+
}
|
|
34
|
+
return t;
|
|
35
|
+
};
|
|
25
36
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
37
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
38
|
};
|
|
@@ -32,22 +43,23 @@ const react_1 = __importStar(require("react"));
|
|
|
32
43
|
const FadeIn_1 = __importDefault(require("../../components/FadeIn"));
|
|
33
44
|
const OneUIProvider_1 = require("../../context/OneUIProvider");
|
|
34
45
|
const usePaginationControls_module_scss_1 = __importDefault(require("./usePaginationControls.module.scss"));
|
|
46
|
+
const html_utils_1 = require("../../utils/html.utils");
|
|
35
47
|
/**
|
|
36
48
|
* This hook handles the display of pagination controls for the user to move to another page
|
|
37
49
|
*/
|
|
38
|
-
function usePaginationControls(containerRef, { snapToPage, baseWidth, snapToCutElement, } = {}) {
|
|
50
|
+
function usePaginationControls(containerRef, { snapToPage, baseWidth, snapToCutElement: _snapToCutElement, } = {}) {
|
|
39
51
|
const [[leftControl, rightControl], setControls] = (0, react_1.useState)([false, false]);
|
|
40
52
|
const LeftControl = (0, OneUIProvider_1.useOneUIConfig)("hook.ui.usePaginationControls.LeftControl");
|
|
41
53
|
const RightControl = (0, OneUIProvider_1.useOneUIConfig)("hook.ui.usePaginationControls.RightControl");
|
|
42
54
|
const className = (0, OneUIProvider_1.useOneUIConfig)("hook.ui.usePaginationControls.className", "");
|
|
43
|
-
function move(direction) {
|
|
55
|
+
function move(direction, snapToCutElement = _snapToCutElement) {
|
|
44
56
|
return () => {
|
|
45
57
|
if (snapToCutElement !== null && snapToCutElement !== void 0 ? snapToCutElement : false) {
|
|
46
58
|
const childBaseWidth = baseWidth || containerRef.current.firstElementChild.clientWidth;
|
|
47
59
|
const howMuchDoesTheScrollAddsUpTo = containerRef.current.scrollLeft / childBaseWidth -
|
|
48
60
|
Math.floor(containerRef.current.scrollLeft / childBaseWidth);
|
|
49
61
|
const howMuchElementsFitOnAPage = containerRef.current.clientWidth / childBaseWidth;
|
|
50
|
-
const howMuchElementsFullyFitOnAPage = Math.floor(howMuchElementsFitOnAPage);
|
|
62
|
+
const howMuchElementsFullyFitOnAPage = Math.floor(howMuchElementsFitOnAPage) || 1;
|
|
51
63
|
const directionScale = direction === "l"
|
|
52
64
|
? 1 - howMuchDoesTheScrollAddsUpTo
|
|
53
65
|
: howMuchDoesTheScrollAddsUpTo;
|
|
@@ -57,6 +69,7 @@ function usePaginationControls(containerRef, { snapToPage, baseWidth, snapToCutE
|
|
|
57
69
|
const howMuchToScroll = (containerRef.current.clientWidth -
|
|
58
70
|
childBaseWidth * howMuchOfTheRemainingElementIsShown) *
|
|
59
71
|
(direction === "l" ? -1 : 1);
|
|
72
|
+
console.log("Scrolling", containerRef.current, "to", howMuchToScroll);
|
|
60
73
|
containerRef.current.scrollBy({
|
|
61
74
|
left: howMuchToScroll,
|
|
62
75
|
behavior: "smooth",
|
|
@@ -94,8 +107,42 @@ function usePaginationControls(containerRef, { snapToPage, baseWidth, snapToCutE
|
|
|
94
107
|
const el = containerRef.current;
|
|
95
108
|
const throttledCheck = (0, throttle_1.default)(checkControlsRequirement, 1000 / 4);
|
|
96
109
|
checkControlsRequirement();
|
|
110
|
+
let startingX;
|
|
111
|
+
let lastX;
|
|
112
|
+
const onTouchStart = (_a) => {
|
|
113
|
+
var { touches } = _a, e = __rest(_a, ["touches"]);
|
|
114
|
+
if (!(0, html_utils_1.isSameTarget)(e))
|
|
115
|
+
return;
|
|
116
|
+
const { pageX } = touches.item(0);
|
|
117
|
+
startingX = pageX;
|
|
118
|
+
console.log(startingX);
|
|
119
|
+
};
|
|
120
|
+
const onTouchMove = (_a) => {
|
|
121
|
+
var { touches } = _a, e = __rest(_a, ["touches"]);
|
|
122
|
+
if (!(0, html_utils_1.isSameTarget)(e))
|
|
123
|
+
return;
|
|
124
|
+
const touch = touches.item(0);
|
|
125
|
+
lastX = touch.pageX;
|
|
126
|
+
console.log(lastX.toFixed(0), startingX === null || startingX === void 0 ? void 0 : startingX.toFixed(0));
|
|
127
|
+
};
|
|
128
|
+
const onTouchEnd = (e) => {
|
|
129
|
+
if (!lastX)
|
|
130
|
+
return;
|
|
131
|
+
const dir = lastX > startingX ? "l" : "r";
|
|
132
|
+
console.log("Moving to", dir);
|
|
133
|
+
move(dir, true)();
|
|
134
|
+
startingX = undefined;
|
|
135
|
+
};
|
|
97
136
|
el.addEventListener("scroll", throttledCheck);
|
|
98
|
-
|
|
137
|
+
el.addEventListener("touchstart", onTouchStart);
|
|
138
|
+
el.addEventListener("touchend", onTouchEnd);
|
|
139
|
+
el.addEventListener("touchmove", onTouchMove);
|
|
140
|
+
return () => {
|
|
141
|
+
el.removeEventListener("scroll", throttledCheck);
|
|
142
|
+
el.removeEventListener("touchstart", onTouchStart);
|
|
143
|
+
el.removeEventListener("touchend", onTouchEnd);
|
|
144
|
+
el.removeEventListener("touchend", onTouchEnd);
|
|
145
|
+
};
|
|
99
146
|
}, []);
|
|
100
147
|
return {
|
|
101
148
|
controls: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePaginationControls.js","sourceRoot":"","sources":["../../../src/hooks/ui/usePaginationControls.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"usePaginationControls.js","sourceRoot":"","sources":["../../../src/hooks/ui/usePaginationControls.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function isSameTarget({ target, currentTarget }: Event): boolean;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isSameTarget = void 0;
|
|
4
|
+
function isSameTarget({ target, currentTarget }) {
|
|
5
|
+
return target === currentTarget;
|
|
6
|
+
}
|
|
7
|
+
exports.isSameTarget = isSameTarget;
|
|
8
|
+
//# sourceMappingURL=html.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.utils.js","sourceRoot":"","sources":["../../src/utils/html.utils.ts"],"names":[],"mappings":";;;AAAA,SAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,aAAa,EAAS;IAC3D,OAAO,MAAM,KAAK,aAAa,CAAC;AAClC,CAAC;AAFD,oCAEC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@onepercentio/one-ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"description": "A set of reusable components created through the development of Onepercent projects",
|
|
5
5
|
"repository": "git@github.com:onepercentio/one-ui.git",
|
|
6
6
|
"author": "Murilo Oliveira de Araujo <murilo.araujo@onepercent.io>",
|