@kizmann/pico-js 1.0.13 → 2.0.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/README.md +27 -7
- package/dist/pico-js.browser.js +2 -0
- package/dist/pico-js.browser.js.map +1 -0
- package/dist/pico-js.esm.js +2 -0
- package/dist/pico-js.esm.js.map +1 -0
- package/package.json +20 -7
- package/src/dom/DomAttribute.js +374 -0
- package/src/dom/DomBuilder.js +152 -0
- package/src/dom/DomEvent.js +253 -0
- package/src/dom/DomFinder.js +669 -0
- package/src/dom/DomForm.js +57 -0
- package/src/dom/DomGlobal.js +193 -0
- package/src/dom/DomInview.js +332 -0
- package/src/dom/DomMeta.js +66 -0
- package/src/dom/DomObserver.js +57 -0
- package/src/dom/DomRectangle.js +657 -0
- package/src/format/FormatFile.js +54 -0
- package/src/format/FormatOption.js +108 -0
- package/src/format/FormatParam.js +107 -0
- package/src/format/FormatParser.js +156 -0
- package/src/format/FormatUrl.js +75 -0
- package/src/index.browser.js +10 -0
- package/src/index.esm.js +138 -0
- package/src/now/NowDefault.js +533 -0
- package/src/now/NowFormat.js +196 -0
- package/src/now/NowGrid.js +251 -0
- package/src/now/NowHuman.js +118 -0
- package/src/now/NowMatch.js +175 -0
- package/src/now/NowRange.js +70 -0
- package/src/now/NowWalker.js +544 -0
- package/src/tool/scope.js +103 -0
- package/src/utils/Array.js +986 -0
- package/src/utils/Cookie.js +184 -0
- package/src/utils/Data.js +200 -0
- package/src/utils/Dom.js +208 -0
- package/src/utils/Event.js +140 -0
- package/src/utils/Format.js +62 -0
- package/src/utils/Hash.js +164 -0
- package/src/utils/Locale.js +229 -0
- package/src/utils/Mixed.js +887 -0
- package/src/utils/Now.js +234 -0
- package/src/utils/Number.js +238 -0
- package/src/utils/Object.js +655 -0
- package/src/utils/Route.js +67 -0
- package/src/utils/Runner.js +327 -0
- package/src/utils/String.js +618 -0
- package/src/{library/element.js → wip/Element.js} +90 -16
- package/src/{library/map.js → wip/Map.js} +256 -40
- package/types/dom/DomAttribute.d.ts +137 -0
- package/types/dom/DomBuilder.d.ts +67 -0
- package/types/dom/DomEvent.d.ts +103 -0
- package/types/dom/DomFinder.d.ts +321 -0
- package/types/dom/DomForm.d.ts +21 -0
- package/types/dom/DomGlobal.d.ts +79 -0
- package/types/dom/DomInview.d.ts +114 -0
- package/types/dom/DomMeta.d.ts +29 -0
- package/types/dom/DomObserver.d.ts +21 -0
- package/types/dom/DomRectangle.d.ts +270 -0
- package/types/format/FormatFile.d.ts +18 -0
- package/types/format/FormatOption.d.ts +40 -0
- package/types/format/FormatParam.d.ts +39 -0
- package/types/format/FormatParser.d.ts +46 -0
- package/types/format/FormatUrl.d.ts +17 -0
- package/types/index.browser.d.ts +1 -0
- package/types/index.esm.d.ts +52 -0
- package/types/now/NowDefault.d.ts +183 -0
- package/types/now/NowFormat.d.ts +70 -0
- package/types/now/NowGrid.d.ts +107 -0
- package/types/now/NowHuman.d.ts +37 -0
- package/types/now/NowMatch.d.ts +108 -0
- package/types/now/NowRange.d.ts +21 -0
- package/types/now/NowWalker.d.ts +301 -0
- package/types/tool/scope.d.ts +24 -0
- package/types/utils/Array.d.ts +480 -0
- package/types/utils/Cookie.d.ts +60 -0
- package/types/utils/Data.d.ts +91 -0
- package/types/utils/Dom.d.ts +138 -0
- package/types/utils/Event.d.ts +58 -0
- package/types/utils/Format.d.ts +37 -0
- package/types/utils/Hash.d.ts +81 -0
- package/types/utils/Locale.d.ts +115 -0
- package/types/utils/Mixed.d.ts +469 -0
- package/types/utils/Now.d.ts +125 -0
- package/types/utils/Number.d.ts +127 -0
- package/types/utils/Object.d.ts +255 -0
- package/types/utils/Route.d.ts +37 -0
- package/types/utils/Runner.d.ts +139 -0
- package/types/utils/String.d.ts +330 -0
- package/types/wip/Element.d.ts +119 -0
- package/types/wip/Map.d.ts +254 -0
- package/dist/.ignore.js +0 -0
- package/dist/pico-js.js +0 -2
- package/dist/pico-js.js.map +0 -1
- package/src/element/default.js +0 -46
- package/src/element/example.js +0 -58
- package/src/index.js +0 -90
- package/src/library/cookie.js +0 -123
- package/src/library/data.js +0 -111
- package/src/library/event.js +0 -91
- package/src/library/locale.js +0 -84
- package/src/library/queue.js +0 -64
- package/src/library/route.js +0 -28
- package/src/utility/any.js +0 -369
- package/src/utility/array.js +0 -410
- package/src/utility/dom.js +0 -1425
- package/src/utility/now.js +0 -544
- package/src/utility/number.js +0 -128
- package/src/utility/object.js +0 -429
- package/src/utility/string.js +0 -328
- package/types/index.d.ts +0 -77
- package/types/library/cookie.d.ts +0 -10
- package/types/library/data.d.ts +0 -15
- package/types/library/element.d.ts +0 -22
- package/types/library/event.d.ts +0 -13
- package/types/library/locale.d.ts +0 -14
- package/types/library/map.d.ts +0 -43
- package/types/library/queue.d.ts +0 -18
- package/types/library/route.d.ts +0 -11
- package/types/utility/any.d.ts +0 -35
- package/types/utility/array.d.ts +0 -46
- package/types/utility/dom.d.ts +0 -101
- package/types/utility/now.d.ts +0 -79
- package/types/utility/number.d.ts +0 -17
- package/types/utility/object.d.ts +0 -29
- package/types/utility/string.d.ts +0 -26
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { Run, Mix, Obj, Dom } from "#src/index.esm.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @memberof PicoDom
|
|
5
|
+
*/
|
|
6
|
+
export class PicoDomGlobalStatic
|
|
7
|
+
{
|
|
8
|
+
/**
|
|
9
|
+
* Get document ready state
|
|
10
|
+
*
|
|
11
|
+
* @example Dom.getDomState() // => "complete"
|
|
12
|
+
*
|
|
13
|
+
* @returns {string} State string
|
|
14
|
+
*/
|
|
15
|
+
static getDomState()
|
|
16
|
+
{
|
|
17
|
+
return document.readyState;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Check if DOM is ready
|
|
22
|
+
*
|
|
23
|
+
* @example Dom.isDomReady() // => true
|
|
24
|
+
*
|
|
25
|
+
* @returns {boolean} True if ready
|
|
26
|
+
*/
|
|
27
|
+
static isDomReady()
|
|
28
|
+
{
|
|
29
|
+
return Dom.getDomState() === 'complete';
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Check if DOM is complete
|
|
34
|
+
*
|
|
35
|
+
* @example Dom.isDomComplete() // => true
|
|
36
|
+
*
|
|
37
|
+
* @returns {boolean} True if complete
|
|
38
|
+
*/
|
|
39
|
+
static isDomComplete()
|
|
40
|
+
{
|
|
41
|
+
let state = Dom.getDomState();
|
|
42
|
+
|
|
43
|
+
if ( state === 'complete' ) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return state === 'interactive';
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Run callback when ready
|
|
52
|
+
*
|
|
53
|
+
* @example Dom.ready(cb)
|
|
54
|
+
*
|
|
55
|
+
* @param {function} cb Callback fn
|
|
56
|
+
* @param {number} [delay] Execution delay
|
|
57
|
+
* @param {number} [limit] Wait limit
|
|
58
|
+
* @returns {this} Static class
|
|
59
|
+
*/
|
|
60
|
+
static ready(cb, delay = 0, limit = 6000)
|
|
61
|
+
{
|
|
62
|
+
let fn = () => {
|
|
63
|
+
Run.delay(cb, delay);
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
let [el, event] = [
|
|
67
|
+
Dom.find(document), 'DOMContentLoaded'
|
|
68
|
+
];
|
|
69
|
+
|
|
70
|
+
let ready = Dom.isDomReady;
|
|
71
|
+
|
|
72
|
+
if ( ! ready() ) {
|
|
73
|
+
return (el.on(event, fn), this);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
Run.wait(() => {
|
|
77
|
+
if ( ready() ) return (fn(), true);
|
|
78
|
+
}, 10, limit);
|
|
79
|
+
|
|
80
|
+
return this;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Run callback when complete
|
|
85
|
+
*
|
|
86
|
+
* @example Dom.complete(cb)
|
|
87
|
+
*
|
|
88
|
+
* @param {function} cb Callback fn
|
|
89
|
+
* @param {number} [delay] Execution delay
|
|
90
|
+
* @param {number} [limit] Wait limit
|
|
91
|
+
* @returns {this} Static class
|
|
92
|
+
*/
|
|
93
|
+
static complete(cb, delay = 0, limit = 6000)
|
|
94
|
+
{
|
|
95
|
+
let fn = () => {
|
|
96
|
+
Run.delay(cb, delay);
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
let [el, event] = [
|
|
100
|
+
Dom.find(document), 'load'
|
|
101
|
+
];
|
|
102
|
+
|
|
103
|
+
let ready = Dom.isDomComplete;
|
|
104
|
+
|
|
105
|
+
if ( ! ready() ) {
|
|
106
|
+
return (el.on(event, fn), this);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
Run.wait(() => {
|
|
110
|
+
if ( ready() ) return (fn(), true);
|
|
111
|
+
}, 10, limit);
|
|
112
|
+
|
|
113
|
+
return this;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
PicoDomGlobalStatic.required = () => {
|
|
119
|
+
console.error('Dom.required() is not implemented anymore.');
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* @memberof PicoDom
|
|
124
|
+
* @extends {PicoDom}
|
|
125
|
+
*/
|
|
126
|
+
export class PicoDomGlobalInstance
|
|
127
|
+
{
|
|
128
|
+
/**
|
|
129
|
+
* Check if node is complete
|
|
130
|
+
*
|
|
131
|
+
* @example Dom.find("img").isNodeComplete() // => true
|
|
132
|
+
*
|
|
133
|
+
* @returns {boolean} True if complete
|
|
134
|
+
*/
|
|
135
|
+
isNodeComplete()
|
|
136
|
+
{
|
|
137
|
+
if ( this.el == null ) {
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
if ( this.el.naturalWidth ) {
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if ( this.el.naturalHeight ) {
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return !! this.el.complete;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Run callback when loaded
|
|
154
|
+
*
|
|
155
|
+
* @example Dom.find("img").loaded(cb)
|
|
156
|
+
*
|
|
157
|
+
* @param {function} cb Callback fn
|
|
158
|
+
* @param {number} [limit] Wait limit
|
|
159
|
+
* @returns {this} Current instance
|
|
160
|
+
*/
|
|
161
|
+
loaded(cb, limit = 6000)
|
|
162
|
+
{
|
|
163
|
+
if ( ! this.el ) {
|
|
164
|
+
return this;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
let ready = this.isNodeComplete;
|
|
168
|
+
|
|
169
|
+
Run.wait(() => {
|
|
170
|
+
if ( ready.call(this) ) return (cb(), true);
|
|
171
|
+
}, 10, limit);
|
|
172
|
+
|
|
173
|
+
return this;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* @returns {typeof import('#src/utils/Dom.js').PicoDom}
|
|
179
|
+
*/
|
|
180
|
+
export const PicoDomGlobalPlugin = function (self) {
|
|
181
|
+
|
|
182
|
+
Obj.each(Mix.class(PicoDomGlobalStatic), (fn, id) => {
|
|
183
|
+
self[id] = fn;
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
Obj.each(Mix.proto(PicoDomGlobalInstance), (fn, id) => {
|
|
187
|
+
self.prototype[id] = fn;
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
// self.init.push(PicoDomGlobalInstance.constructor);
|
|
191
|
+
|
|
192
|
+
return self;
|
|
193
|
+
}
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
import { Arr, Dom, Mix, Obj } from "#src/index.esm.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @memberof PicoDom
|
|
5
|
+
*/
|
|
6
|
+
export class PicoDomInviewStatic
|
|
7
|
+
{
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Get first inview element Y
|
|
11
|
+
*
|
|
12
|
+
* @example Dom.inviewMaxY(".item")
|
|
13
|
+
*
|
|
14
|
+
* @param {any} options Find options
|
|
15
|
+
* @param {function} [cb] Success callback
|
|
16
|
+
* @returns {any} Found element
|
|
17
|
+
*/
|
|
18
|
+
static inviewMaxY(options, cb = null)
|
|
19
|
+
{
|
|
20
|
+
let defaults = {
|
|
21
|
+
boundry: null, multiple: false, threshold: 0, mode: 'ratio'
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
if ( Mix.isString(options) ) {
|
|
25
|
+
options = { el: options };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
options = {
|
|
29
|
+
...defaults, ...options
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
if ( ! options.el ) {
|
|
33
|
+
throw new Error('Dom.inviewY() requires an element.');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
let args = [
|
|
37
|
+
options.threshold, options.mode, options.boundry
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
let fn = (el) => {
|
|
41
|
+
return Dom.find(el).isInviewY(...args);
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
let els = [];
|
|
45
|
+
|
|
46
|
+
Dom.find(options.el).each((el) => {
|
|
47
|
+
if ( fn(el) ) (cb ? cb(el) : null, els.push(el));
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
if ( options.multiple ) {
|
|
51
|
+
return els;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return Arr.first(els);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Get first inview element X
|
|
59
|
+
*
|
|
60
|
+
* @example Dom.inviewMaxX(".item")
|
|
61
|
+
*
|
|
62
|
+
* @param {any} options Find options
|
|
63
|
+
* @param {function} [cb] Success callback
|
|
64
|
+
* @returns {any} Found element
|
|
65
|
+
*/
|
|
66
|
+
static inviewMaxX(options, cb = null)
|
|
67
|
+
{
|
|
68
|
+
let defaults = {
|
|
69
|
+
boundry: null, multiple: false, threshold: 0, mode: 'ratio'
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
if ( Mix.isString(options) ) {
|
|
73
|
+
options = { el: options };
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
options = {
|
|
77
|
+
...defaults, ...options
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
if ( ! options.el ) {
|
|
81
|
+
throw new Error('Dom.inviewX() requires an element.');
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
let args = [
|
|
85
|
+
options.threshold, options.mode, options.boundry
|
|
86
|
+
];
|
|
87
|
+
|
|
88
|
+
let fn = (el) => {
|
|
89
|
+
return Dom.find(el).isInviewX(...args);
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
let els = [];
|
|
93
|
+
|
|
94
|
+
Dom.find(options.el).each((el) => {
|
|
95
|
+
if ( fn(el) ) (cb ? cb(el) : null, els.push(el));
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
if ( options.multiple ) {
|
|
99
|
+
return els;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return Arr.first(els);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* @memberof PicoDom
|
|
109
|
+
* @extends {PicoDom}
|
|
110
|
+
*/
|
|
111
|
+
export class PicoDomInviewInstance
|
|
112
|
+
{
|
|
113
|
+
/**
|
|
114
|
+
* Get X view offset
|
|
115
|
+
*
|
|
116
|
+
* @example Dom.find("div").viewoffX()
|
|
117
|
+
*
|
|
118
|
+
* @returns {any} Offset object
|
|
119
|
+
*/
|
|
120
|
+
viewoffX()
|
|
121
|
+
{
|
|
122
|
+
if ( this.el == null ) {
|
|
123
|
+
return { top: 0, bot: 0 };
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
let [viewport, width] = [
|
|
127
|
+
Dom.win().innerWidth, this.width()
|
|
128
|
+
];
|
|
129
|
+
|
|
130
|
+
let [offset, scroll] = [
|
|
131
|
+
this.offset('left'), this.parent().scroll('left')
|
|
132
|
+
];
|
|
133
|
+
|
|
134
|
+
let left = Math.max(...[
|
|
135
|
+
0, offset - scroll
|
|
136
|
+
]);
|
|
137
|
+
|
|
138
|
+
let right = Math.max(...[
|
|
139
|
+
0, viewport - (offset + width - scroll)
|
|
140
|
+
]);
|
|
141
|
+
|
|
142
|
+
return { left, right };
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Get X inview pixels
|
|
147
|
+
*
|
|
148
|
+
* @example Dom.find("div").inviewX()
|
|
149
|
+
*
|
|
150
|
+
* @param {any} [boundry] View boundry
|
|
151
|
+
* @returns {number} Inview pixels
|
|
152
|
+
*/
|
|
153
|
+
inviewX(boundry = null)
|
|
154
|
+
{
|
|
155
|
+
let { left, right } = Dom.find(boundry).viewoffY();
|
|
156
|
+
|
|
157
|
+
let [viewport, height] = [
|
|
158
|
+
Dom.win().innerHeight - right - left, this.height()
|
|
159
|
+
];
|
|
160
|
+
|
|
161
|
+
let [offset, scroll] = [
|
|
162
|
+
this.offset('left') + left, this.scroll('left') + left
|
|
163
|
+
];
|
|
164
|
+
|
|
165
|
+
let inview = Math.max(0, scroll + viewport - offset + left);
|
|
166
|
+
|
|
167
|
+
if ( inview > height ) {
|
|
168
|
+
inview = Math.min(height, viewport + height - inview);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return Math.max(0, inview);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Get X inview ratio
|
|
176
|
+
*
|
|
177
|
+
* @example Dom.find("div").inratioX()
|
|
178
|
+
*
|
|
179
|
+
* @param {any} [boundry] View boundry
|
|
180
|
+
* @returns {number} Inview ratio
|
|
181
|
+
*/
|
|
182
|
+
inratioX(boundry = null)
|
|
183
|
+
{
|
|
184
|
+
return 1 / this.width() * this.inviewX(boundry);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Check if is inview X
|
|
189
|
+
*
|
|
190
|
+
* @example Dom.find("div").isInviewX(0.5)
|
|
191
|
+
*
|
|
192
|
+
* @param {number} [threshold] View threshold
|
|
193
|
+
* @param {string} [mode] View mode
|
|
194
|
+
* @param {any} [boundry] View boundry
|
|
195
|
+
* @returns {boolean} True if inview
|
|
196
|
+
*/
|
|
197
|
+
isInviewX(threshold = 0.1, mode = 'ratio', boundry = null)
|
|
198
|
+
{
|
|
199
|
+
if ( mode === 'pixel' ) {
|
|
200
|
+
return this.inviewX(boundry) > threshold;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
return this.inratioX(boundry) > threshold;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Get Y view offset
|
|
208
|
+
*
|
|
209
|
+
* @example Dom.find("div").viewoffY()
|
|
210
|
+
*
|
|
211
|
+
* @returns {any} Offset object
|
|
212
|
+
*/
|
|
213
|
+
viewoffY()
|
|
214
|
+
{
|
|
215
|
+
if ( this.el == null ) {
|
|
216
|
+
return { top: 0, bottom: 0 };
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
let [viewport, height] = [
|
|
220
|
+
Dom.win().innerHeight, this.height()
|
|
221
|
+
];
|
|
222
|
+
|
|
223
|
+
let [offset, scroll] = [
|
|
224
|
+
this.offset('top'), this.parent().scroll('top')
|
|
225
|
+
];
|
|
226
|
+
|
|
227
|
+
let top = Math.max(...[
|
|
228
|
+
0, offset - scroll
|
|
229
|
+
]);
|
|
230
|
+
|
|
231
|
+
let bottom = Math.max(...[
|
|
232
|
+
0, viewport - (offset + height - scroll)
|
|
233
|
+
]);
|
|
234
|
+
|
|
235
|
+
return { top, bottom };
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Get Y inview pixels
|
|
240
|
+
*
|
|
241
|
+
* @example Dom.find("div").inviewY()
|
|
242
|
+
*
|
|
243
|
+
* @param {any} [boundry] View boundry
|
|
244
|
+
* @returns {number} Inview pixels
|
|
245
|
+
*/
|
|
246
|
+
inviewY(boundry = null)
|
|
247
|
+
{
|
|
248
|
+
let { top, bottom } = Dom.find(boundry).viewoffY();
|
|
249
|
+
|
|
250
|
+
let [viewport, height] = [
|
|
251
|
+
Dom.win().innerHeight - bottom - top, this.height()
|
|
252
|
+
];
|
|
253
|
+
|
|
254
|
+
let [offset, scroll] = [
|
|
255
|
+
this.offset('top') + top, this.scroll('top') + top
|
|
256
|
+
];
|
|
257
|
+
|
|
258
|
+
let inview = Math.max(0, scroll + viewport - offset + top);
|
|
259
|
+
|
|
260
|
+
if ( inview > height ) {
|
|
261
|
+
inview = Math.min(height, viewport + height - inview);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
return Math.min(Math.max(0, inview), viewport);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Get Y inview ratio
|
|
269
|
+
*
|
|
270
|
+
* @example Dom.find("div").inratioY()
|
|
271
|
+
*
|
|
272
|
+
* @param {any} [boundry] View boundry
|
|
273
|
+
* @returns {number} Inview ratio
|
|
274
|
+
*/
|
|
275
|
+
inratioY(boundry = null)
|
|
276
|
+
{
|
|
277
|
+
return 1 / this.height() * this.inviewY(boundry);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Check if is inview Y
|
|
282
|
+
*
|
|
283
|
+
* @example Dom.find("div").isInviewY(0.5)
|
|
284
|
+
*
|
|
285
|
+
* @param {number} [threshold] View threshold
|
|
286
|
+
* @param {string} [mode] View mode
|
|
287
|
+
* @param {any} [boundry] View boundry
|
|
288
|
+
* @returns {boolean} True if inview
|
|
289
|
+
*/
|
|
290
|
+
isInviewY(threshold = 0.1, mode = 'ratio', boundry = null)
|
|
291
|
+
{
|
|
292
|
+
if ( mode === 'pixel' ) {
|
|
293
|
+
return this.inviewY(boundry) > threshold;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
return this.inratioY(boundry) > threshold;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* @see PicoDom.inviewY
|
|
302
|
+
*/
|
|
303
|
+
PicoDomInviewInstance.prototype.inviewHeight = function (...args) {
|
|
304
|
+
console.warn('Dom.inviewHeight() is deprecated, use Dom.inviewY() instead.');
|
|
305
|
+
return this.inviewY(...args);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* @see PicoDom.inviewX
|
|
310
|
+
*/
|
|
311
|
+
PicoDomInviewInstance.prototype.inviewWidth = function (...args) {
|
|
312
|
+
console.warn('Dom.inviewWidth() is deprecated, use Dom.inviewX() instead.');
|
|
313
|
+
return this.inviewX(...args);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* @returns {typeof import('#src/utils/Dom.js').PicoDom}
|
|
318
|
+
*/
|
|
319
|
+
export const PicoDomInviewPlugin = function (self) {
|
|
320
|
+
|
|
321
|
+
Obj.each(Mix.class(PicoDomInviewStatic), (fn, id) => {
|
|
322
|
+
self[id] = fn;
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
Obj.each(Mix.proto(PicoDomInviewInstance), (fn, id) => {
|
|
326
|
+
self.prototype[id] = fn;
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
// self.init.push(PicoDomInviewInstance.constructor);
|
|
330
|
+
|
|
331
|
+
return self;
|
|
332
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { Arr, Mix, Obj, Dom, Locale } from "#src/index.esm.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @memberof PicoDom
|
|
5
|
+
*/
|
|
6
|
+
export class PicoDomMetaStatic
|
|
7
|
+
{
|
|
8
|
+
static $meta = {};
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Set document title
|
|
12
|
+
*
|
|
13
|
+
* @example Dom.setMetaTitle("Home")
|
|
14
|
+
*
|
|
15
|
+
* @param {string} value New title
|
|
16
|
+
* @param {string} [glue] Title glue
|
|
17
|
+
* @returns {this} Static class
|
|
18
|
+
*/
|
|
19
|
+
static setMetaTitle(value, glue = ':value - :title')
|
|
20
|
+
{
|
|
21
|
+
if ( ! this.$meta.title ) {
|
|
22
|
+
this.$meta.title = Dom.doc().title;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
document.title = Locale.replace(glue, {
|
|
26
|
+
value, title: this.$meta.title
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
return this;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @see PicoDom.setMetaTitle
|
|
35
|
+
*/
|
|
36
|
+
PicoDomMetaStatic.title = (value) => {
|
|
37
|
+
console.warn('Dom.title() is deprecated, use Dom.setMetaTitle() instead.');
|
|
38
|
+
return Dom.setMetaTitle(value);
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* @memberof PicoDom
|
|
43
|
+
* @extends {PicoDom}
|
|
44
|
+
*/
|
|
45
|
+
export class PicoDomMetaInstance
|
|
46
|
+
{
|
|
47
|
+
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* @returns {typeof import('#src/utils/Dom.js').PicoDom}
|
|
52
|
+
*/
|
|
53
|
+
export const PicoDomMetaPlugin = function (self) {
|
|
54
|
+
|
|
55
|
+
Obj.each(Mix.class(PicoDomMetaStatic), (fn, id) => {
|
|
56
|
+
self[id] = fn;
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
Obj.each(Mix.proto(PicoDomMetaInstance), (fn, id) => {
|
|
60
|
+
self.prototype[id] = fn;
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// self.init.push(PicoDomMetaInstance.constructor);
|
|
64
|
+
|
|
65
|
+
return self;
|
|
66
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Arr, Mix, Obj, Dom } from "#src/index.esm.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @memberof PicoDom
|
|
5
|
+
*/
|
|
6
|
+
export class PicoDomObserverStatic
|
|
7
|
+
{
|
|
8
|
+
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @memberof PicoDom
|
|
13
|
+
* @extends {PicoDom}
|
|
14
|
+
*/
|
|
15
|
+
export class PicoDomObserverInstance
|
|
16
|
+
{
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Get or set element value
|
|
20
|
+
*
|
|
21
|
+
* @example Dom.find("input").value("hello")
|
|
22
|
+
*
|
|
23
|
+
* @param {any} [value] New value
|
|
24
|
+
* @returns {any|this} Value or instance
|
|
25
|
+
*/
|
|
26
|
+
value(value = undefined)
|
|
27
|
+
{
|
|
28
|
+
if ( value === undefined ) {
|
|
29
|
+
return this.el.value;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
this.each((el) => {
|
|
33
|
+
el.value = value;
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
return this;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* @returns {typeof import('#src/utils/Dom.js').PicoDom}
|
|
43
|
+
*/
|
|
44
|
+
export const PicoDomObserverPlugin = function (self) {
|
|
45
|
+
|
|
46
|
+
Obj.each(Mix.class(PicoDomObserverStatic), (fn, id) => {
|
|
47
|
+
self[id] = fn;
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
Obj.each(Mix.proto(PicoDomObserverInstance), (fn, id) => {
|
|
51
|
+
self.prototype[id] = fn;
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// self.init.push(PicoDomObserverInstance.constructor);
|
|
55
|
+
|
|
56
|
+
return self;
|
|
57
|
+
}
|