@leafer-in/scroller 1.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/LICENSE +21 -0
- package/README.md +1 -0
- package/dist/scroller.cjs +259 -0
- package/dist/scroller.esm.js +257 -0
- package/dist/scroller.esm.min.js +2 -0
- package/dist/scroller.esm.min.js.map +1 -0
- package/dist/scroller.js +249 -0
- package/dist/scroller.min.cjs +2 -0
- package/dist/scroller.min.cjs.map +1 -0
- package/dist/scroller.min.js +2 -0
- package/dist/scroller.min.js.map +1 -0
- package/package.json +37 -0
- package/src/Scroller.ts +290 -0
- package/src/config.ts +15 -0
- package/src/decorate.ts +15 -0
- package/src/index.ts +32 -0
- package/types/index.d.ts +47 -0
package/dist/scroller.js
ADDED
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
this.LeaferIN = this.LeaferIN || {};
|
|
2
|
+
|
|
3
|
+
this.LeaferIN.scroller = function(exports, core) {
|
|
4
|
+
"use strict";
|
|
5
|
+
const config = {
|
|
6
|
+
theme: "light",
|
|
7
|
+
style: {
|
|
8
|
+
dragBoundsType: "outer",
|
|
9
|
+
strokeAlign: "center",
|
|
10
|
+
strokeWidthFixed: "zoom-in",
|
|
11
|
+
width: 6,
|
|
12
|
+
height: 6,
|
|
13
|
+
opacity: .5,
|
|
14
|
+
cornerRadius: 3,
|
|
15
|
+
hoverStyle: {
|
|
16
|
+
opacity: .6
|
|
17
|
+
},
|
|
18
|
+
pressStyle: {
|
|
19
|
+
opacity: .66
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
size: 6,
|
|
23
|
+
endsMargin: 2,
|
|
24
|
+
sideMargin: 2,
|
|
25
|
+
minSize: 10,
|
|
26
|
+
scaleFixed: "zoom-in",
|
|
27
|
+
scrollType: "both",
|
|
28
|
+
hideOnActionEnd: "hover"
|
|
29
|
+
};
|
|
30
|
+
const tempBounds = new core.Bounds, {float: float} = core.MathHelper, {clone: clone, assign: assign} = core.DataHelper;
|
|
31
|
+
class Scroller extends core.Group {
|
|
32
|
+
get canUse() {
|
|
33
|
+
return this.target.hasScroller;
|
|
34
|
+
}
|
|
35
|
+
constructor(target) {
|
|
36
|
+
super();
|
|
37
|
+
this.targetWorldBounds = new core.Bounds;
|
|
38
|
+
this.viewportBounds = new core.Bounds;
|
|
39
|
+
this.contentBounds = new core.Bounds;
|
|
40
|
+
this.scrollXBounds = new core.Bounds;
|
|
41
|
+
this.scrollYBounds = new core.Bounds;
|
|
42
|
+
this.target = target;
|
|
43
|
+
this.config = clone(config);
|
|
44
|
+
this.updateConfig();
|
|
45
|
+
this.__listenEvents();
|
|
46
|
+
target.waitLeafer(() => {
|
|
47
|
+
this.parent = target;
|
|
48
|
+
this.__bindLeafer(target.leafer);
|
|
49
|
+
});
|
|
50
|
+
if (this.mergedConfig.hideOnActionEnd) this.opacity = 0;
|
|
51
|
+
}
|
|
52
|
+
static registerTheme(theme, themeConfig) {
|
|
53
|
+
S.themeMap[theme] = themeConfig;
|
|
54
|
+
}
|
|
55
|
+
static getTheme(theme) {
|
|
56
|
+
return theme && S.themeMap[theme];
|
|
57
|
+
}
|
|
58
|
+
static hasTheme(theme) {
|
|
59
|
+
return theme && !!S.themeMap[theme];
|
|
60
|
+
}
|
|
61
|
+
updateConfig() {
|
|
62
|
+
const {scrollConfig: scrollConfig} = this.target;
|
|
63
|
+
const themeConfig = S.getTheme(scrollConfig && S.hasTheme(scrollConfig.theme) && scrollConfig.theme || this.config.theme);
|
|
64
|
+
const mergedConfig = this.mergedConfig = clone(this.config);
|
|
65
|
+
assign(mergedConfig, themeConfig);
|
|
66
|
+
if (scrollConfig) assign(mergedConfig, scrollConfig);
|
|
67
|
+
this.updateStyle(mergedConfig.style);
|
|
68
|
+
}
|
|
69
|
+
updateStyle(style) {
|
|
70
|
+
if (!this.scrollXBar) this.addMany(this.scrollXBar = new core.Box, this.scrollYBar = new core.Box);
|
|
71
|
+
const {scrollXBar: scrollXBar, scrollYBar: scrollYBar} = this;
|
|
72
|
+
scrollXBar.set(style);
|
|
73
|
+
scrollYBar.set(style);
|
|
74
|
+
scrollXBar.draggable = "x";
|
|
75
|
+
scrollYBar.draggable = "y";
|
|
76
|
+
}
|
|
77
|
+
update(check = true) {
|
|
78
|
+
if (this.dragScrolling) return;
|
|
79
|
+
const {target: target, targetOverflow: targetOverflow, targetWorldBounds: targetWorldBounds, viewportBounds: viewportBounds, contentBounds: contentBounds} = this, layout = target.__layout, {overflow: overflow} = target.__;
|
|
80
|
+
const {childrenRenderBounds: childrenRenderBounds} = layout;
|
|
81
|
+
const {boxBounds: boxBounds, worldBoxBounds: worldBoxBounds} = layout;
|
|
82
|
+
const isSameWorldBounds = check && targetOverflow === overflow && targetWorldBounds.isSame(worldBoxBounds);
|
|
83
|
+
const isSameConfig = layout.scrollConfigChanged ? (this.updateConfig(), layout.scrollConfigChanged = false) : true;
|
|
84
|
+
const nowContentBounds = tempBounds.set(viewportBounds).add(childrenRenderBounds);
|
|
85
|
+
if (isSameWorldBounds && isSameConfig && contentBounds.isSame(nowContentBounds)) return;
|
|
86
|
+
this.targetOverflow = overflow;
|
|
87
|
+
viewportBounds.set(boxBounds);
|
|
88
|
+
targetWorldBounds.set(worldBoxBounds);
|
|
89
|
+
contentBounds.set(nowContentBounds);
|
|
90
|
+
const {scrollXBar: scrollXBar, scrollYBar: scrollYBar} = this, {size: size, endsMargin: endsMargin, minSize: minSize} = this.mergedConfig, {width: width, height: height} = viewportBounds;
|
|
91
|
+
this.contentRealX = contentBounds.x - target.scrollX;
|
|
92
|
+
this.contentRealY = contentBounds.y - target.scrollY;
|
|
93
|
+
this.ratioX = viewportBounds.width / contentBounds.width;
|
|
94
|
+
this.ratioY = viewportBounds.height / contentBounds.height;
|
|
95
|
+
const min = size + endsMargin * 2 + minSize;
|
|
96
|
+
scrollXBar.visible = float(contentBounds.width) > float(width) && overflow !== "y-scroll" && width > min;
|
|
97
|
+
scrollYBar.visible = float(contentBounds.height) > float(height) && overflow !== "x-scroll" && height > min;
|
|
98
|
+
this.updateScrollBar();
|
|
99
|
+
}
|
|
100
|
+
updateScrollBar() {
|
|
101
|
+
const {target: target, viewportBounds: viewportBounds, contentBounds: contentBounds, ratioX: ratioX, ratioY: ratioY, scrollXBar: scrollXBar, scrollYBar: scrollYBar, scrollXBounds: scrollXBounds, scrollYBounds: scrollYBounds} = this;
|
|
102
|
+
let {size: size, cornerRadius: cornerRadius, endsMargin: endsMargin, sideMargin: sideMargin, minSize: minSize, scaleFixed: scaleFixed, scrollType: scrollType} = this.mergedConfig;
|
|
103
|
+
const scale = scaleFixed ? target.getClampRenderScale() : 1;
|
|
104
|
+
endsMargin /= scale;
|
|
105
|
+
sideMargin /= scale;
|
|
106
|
+
size /= scale;
|
|
107
|
+
if (core.isUndefined(cornerRadius)) cornerRadius = size / 2;
|
|
108
|
+
if (scrollXBar.visible) {
|
|
109
|
+
scrollXBounds.set(viewportBounds).shrink([ endsMargin, scrollYBar.visible ? size + sideMargin : endsMargin, sideMargin, endsMargin ]);
|
|
110
|
+
const scrollRatioX = this.scrollRatioX = scrollXBounds.width / contentBounds.width;
|
|
111
|
+
scrollXBar.set({
|
|
112
|
+
x: scrollXBounds.x - contentBounds.x * scrollRatioX,
|
|
113
|
+
y: scrollXBounds.maxY - size,
|
|
114
|
+
width: Math.max(scrollXBounds.width * ratioX, minSize),
|
|
115
|
+
height: size,
|
|
116
|
+
cornerRadius: cornerRadius,
|
|
117
|
+
dragBounds: scrollXBounds,
|
|
118
|
+
hittable: scrollType !== "move"
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
if (scrollYBar.visible) {
|
|
122
|
+
scrollYBounds.set(viewportBounds).shrink([ endsMargin, sideMargin, scrollXBar.visible ? size + sideMargin : endsMargin, endsMargin ]);
|
|
123
|
+
const scrollRatioY = this.scrollRatioY = scrollYBounds.height / contentBounds.height;
|
|
124
|
+
scrollYBar.set({
|
|
125
|
+
x: scrollYBounds.maxX - size,
|
|
126
|
+
y: scrollYBounds.y - contentBounds.y * scrollRatioY,
|
|
127
|
+
width: size,
|
|
128
|
+
height: Math.max(scrollYBounds.height * ratioY, minSize),
|
|
129
|
+
cornerRadius: cornerRadius,
|
|
130
|
+
dragBounds: scrollYBounds,
|
|
131
|
+
hittable: scrollType !== "move"
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
this.x = -this.target.scrollX;
|
|
135
|
+
this.y = -this.target.scrollY;
|
|
136
|
+
core.LeafHelper.updateAllMatrix(this);
|
|
137
|
+
core.BranchHelper.updateBounds(this);
|
|
138
|
+
core.LeafHelper.updateAllChange(this);
|
|
139
|
+
}
|
|
140
|
+
onDrag(e) {
|
|
141
|
+
if (this.mergedConfig.scrollType === "move") return;
|
|
142
|
+
this.dragScrolling = true;
|
|
143
|
+
const {scrollXBar: scrollXBar, scrollYBar: scrollYBar, target: target, scrollXBounds: scrollXBounds, scrollYBounds: scrollYBounds} = this;
|
|
144
|
+
const scrollX = e.current === scrollXBar;
|
|
145
|
+
if (scrollX) target.scrollX = -((scrollXBar.x - scrollXBounds.x) / this.scrollRatioX + this.contentRealX); else target.scrollY = -((scrollYBar.y - scrollYBounds.y) / this.scrollRatioY + this.contentRealY);
|
|
146
|
+
}
|
|
147
|
+
onDragEnd() {
|
|
148
|
+
if (this.mergedConfig.scrollType === "move") return;
|
|
149
|
+
this.dragScrolling = false;
|
|
150
|
+
}
|
|
151
|
+
onMove(e) {
|
|
152
|
+
if (!this.canUse) return;
|
|
153
|
+
this.onEnter();
|
|
154
|
+
const {scrollType: scrollType, stopDefault: stopDefault} = this.mergedConfig;
|
|
155
|
+
if (scrollType === "drag") return;
|
|
156
|
+
const {viewportBounds: viewportBounds, contentBounds: contentBounds, scrollXBar: scrollXBar, scrollYBar: scrollYBar} = this;
|
|
157
|
+
if (scrollXBar.visible || scrollYBar.visible) {
|
|
158
|
+
const move = e.getInnerMove(this.target);
|
|
159
|
+
core.DragBoundsHelper.getValidMove(contentBounds, viewportBounds, "inner", move, true);
|
|
160
|
+
let needStop;
|
|
161
|
+
if (move.x && scrollXBar.visible) this.target.scrollX += move.x, needStop = true;
|
|
162
|
+
if (move.y && scrollYBar.visible) this.target.scrollY += move.y, needStop = true;
|
|
163
|
+
if (needStop || stopDefault) e.stop();
|
|
164
|
+
if (stopDefault) e.stopDefault();
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
onMoveEnd(e) {
|
|
168
|
+
if (!this.canUse) return;
|
|
169
|
+
if (!this.target.hit(e)) this.onLeave();
|
|
170
|
+
}
|
|
171
|
+
onEnter() {
|
|
172
|
+
if (!this.canUse) return;
|
|
173
|
+
clearTimeout(this.hideTimer);
|
|
174
|
+
this.killAnimate();
|
|
175
|
+
this.opacity = 1;
|
|
176
|
+
}
|
|
177
|
+
onLeave() {
|
|
178
|
+
if (!this.canUse) return;
|
|
179
|
+
clearTimeout(this.hideTimer);
|
|
180
|
+
if (this.mergedConfig.hideOnActionEnd) this.hideTimer = setTimeout(() => {
|
|
181
|
+
this.set({
|
|
182
|
+
opacity: 0
|
|
183
|
+
}, core.Plugin.has("animate"));
|
|
184
|
+
}, 600);
|
|
185
|
+
}
|
|
186
|
+
onResize() {
|
|
187
|
+
if (this.canUse) this.update();
|
|
188
|
+
}
|
|
189
|
+
__listenEvents() {
|
|
190
|
+
const {scrollXBar: scrollXBar, scrollYBar: scrollYBar, target: target} = this;
|
|
191
|
+
this.__eventIds = [ scrollXBar.on_(core.DragEvent.DRAG, this.onDrag, this), scrollXBar.on_(core.DragEvent.END, this.onDragEnd, this), scrollYBar.on_(core.DragEvent.DRAG, this.onDrag, this), scrollYBar.on_(core.DragEvent.END, this.onDragEnd, this), target.on_(core.PointerEvent.ENTER, this.onEnter, this), target.on_(core.PointerEvent.LEAVE, this.onLeave, this), target.on_(core.MoveEvent.BEFORE_MOVE, this.onMove, this), target.on_(core.MoveEvent.END, this.onMoveEnd, this), target.on_(core.BoundsEvent.WORLD, this.onResize, this), target.on_(core.ChildEvent.DESTROY, this.destroy, this) ];
|
|
192
|
+
}
|
|
193
|
+
__removeListenEvents() {
|
|
194
|
+
this.off_(this.__eventIds);
|
|
195
|
+
}
|
|
196
|
+
destroy() {
|
|
197
|
+
if (!this.destroyed) {
|
|
198
|
+
this.__removeListenEvents();
|
|
199
|
+
const {target: target} = this;
|
|
200
|
+
target.scroller = target.topChildren = target.hasScroller = undefined;
|
|
201
|
+
this.target = this.config = null;
|
|
202
|
+
super.destroy();
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
Scroller.themeMap = {};
|
|
207
|
+
const S = Scroller;
|
|
208
|
+
function scrollConfigType(defaultValue) {
|
|
209
|
+
return core.decorateLeafAttr(defaultValue, key => core.attr({
|
|
210
|
+
set(value) {
|
|
211
|
+
if (this.__setAttr(key, value)) {
|
|
212
|
+
const layout = this.__layout;
|
|
213
|
+
layout.scrollConfigChanged = true;
|
|
214
|
+
core.doBoundsType(this);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}));
|
|
218
|
+
}
|
|
219
|
+
core.Plugin.add("scroller");
|
|
220
|
+
const box = core.Box.prototype;
|
|
221
|
+
core.Box.addAttr("scrollConfig", undefined, scrollConfigType);
|
|
222
|
+
box.__checkScroll = function(isScrollMode) {
|
|
223
|
+
if (isScrollMode && this.isOverflow) {
|
|
224
|
+
if (!this.scroller) {
|
|
225
|
+
this.scroller = new Scroller(this);
|
|
226
|
+
if (!this.topChildren) this.topChildren = [];
|
|
227
|
+
this.topChildren.push(this.scroller);
|
|
228
|
+
}
|
|
229
|
+
this.hasScroller = true;
|
|
230
|
+
} else {
|
|
231
|
+
if (this.hasScroller && !this.scroller.dragScrolling) {
|
|
232
|
+
this.hasScroller = undefined;
|
|
233
|
+
this.scroller.update();
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
Scroller.registerTheme("light", {
|
|
238
|
+
style: {
|
|
239
|
+
fill: "black"
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
Scroller.registerTheme("dark", {
|
|
243
|
+
style: {
|
|
244
|
+
fill: "white"
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
exports.Scroller = Scroller;
|
|
248
|
+
return exports;
|
|
249
|
+
}({}, LeaferUI);
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var t=require("@leafer-ui/core");const e={theme:"light",style:{dragBoundsType:"outer",strokeAlign:"center",strokeWidthFixed:"zoom-in",width:6,height:6,opacity:.5,cornerRadius:3,hoverStyle:{opacity:.6},pressStyle:{opacity:.66}},size:6,endsMargin:2,sideMargin:2,minSize:10,scaleFixed:"zoom-in",scrollType:"both",hideOnActionEnd:"hover"},s=new t.Bounds,{float:i}=t.MathHelper,{clone:o,assign:r}=t.DataHelper;class n extends t.Group{get canUse(){return this.target.hasScroller}constructor(s){super(),this.targetWorldBounds=new t.Bounds,this.viewportBounds=new t.Bounds,this.contentBounds=new t.Bounds,this.scrollXBounds=new t.Bounds,this.scrollYBounds=new t.Bounds,this.target=s,this.config=o(e),this.updateConfig(),this.__listenEvents(),s.waitLeafer(()=>{this.parent=s,this.__bindLeafer(s.leafer)}),this.mergedConfig.hideOnActionEnd&&(this.opacity=0)}static registerTheme(t,e){l.themeMap[t]=e}static getTheme(t){return t&&l.themeMap[t]}static hasTheme(t){return t&&!!l.themeMap[t]}updateConfig(){const{scrollConfig:t}=this.target,e=l.getTheme(t&&l.hasTheme(t.theme)&&t.theme||this.config.theme),s=this.mergedConfig=o(this.config);r(s,e),t&&r(s,t),this.updateStyle(s.style)}updateStyle(e){this.scrollXBar||this.addMany(this.scrollXBar=new t.Box,this.scrollYBar=new t.Box);const{scrollXBar:s,scrollYBar:i}=this;s.set(e),i.set(e),s.draggable="x",i.draggable="y"}update(t=!0){if(this.dragScrolling)return;const{target:e,targetOverflow:o,targetWorldBounds:r,viewportBounds:n,contentBounds:l}=this,h=e.__layout,{overflow:a}=e.__,{childrenRenderBounds:d}=h,{boxBounds:c,worldBoxBounds:g}=h,u=t&&o===a&&r.isSame(g),p=!h.scrollConfigChanged||(this.updateConfig(),h.scrollConfigChanged=!1),v=s.set(n).add(d);if(u&&p&&l.isSame(v))return;this.targetOverflow=a,n.set(c),r.set(g),l.set(v);const{scrollXBar:B,scrollYBar:f}=this,{size:m,endsMargin:y,minSize:E}=this.mergedConfig,{width:_,height:w}=n;this.contentRealX=l.x-e.scrollX,this.contentRealY=l.y-e.scrollY,this.ratioX=n.width/l.width,this.ratioY=n.height/l.height;const x=m+2*y+E;B.visible=i(l.width)>i(_)&&"y-scroll"!==a&&_>x,f.visible=i(l.height)>i(w)&&"x-scroll"!==a&&w>x,this.updateScrollBar()}updateScrollBar(){const{target:e,viewportBounds:s,contentBounds:i,ratioX:o,ratioY:r,scrollXBar:n,scrollYBar:l,scrollXBounds:h,scrollYBounds:a}=this;let{size:d,cornerRadius:c,endsMargin:g,sideMargin:u,minSize:p,scaleFixed:v,scrollType:B}=this.mergedConfig;const f=v?e.getClampRenderScale():1;if(g/=f,u/=f,d/=f,t.isUndefined(c)&&(c=d/2),n.visible){h.set(s).shrink([g,l.visible?d+u:g,u,g]);const t=this.scrollRatioX=h.width/i.width;n.set({x:h.x-i.x*t,y:h.maxY-d,width:Math.max(h.width*o,p),height:d,cornerRadius:c,dragBounds:h,hittable:"move"!==B})}if(l.visible){a.set(s).shrink([g,u,n.visible?d+u:g,g]);const t=this.scrollRatioY=a.height/i.height;l.set({x:a.maxX-d,y:a.y-i.y*t,width:d,height:Math.max(a.height*r,p),cornerRadius:c,dragBounds:a,hittable:"move"!==B})}this.x=-this.target.scrollX,this.y=-this.target.scrollY,t.LeafHelper.updateAllMatrix(this),t.BranchHelper.updateBounds(this),t.LeafHelper.updateAllChange(this)}onDrag(t){if("move"===this.mergedConfig.scrollType)return;this.dragScrolling=!0;const{scrollXBar:e,scrollYBar:s,target:i,scrollXBounds:o,scrollYBounds:r}=this;t.current===e?i.scrollX=-((e.x-o.x)/this.scrollRatioX+this.contentRealX):i.scrollY=-((s.y-r.y)/this.scrollRatioY+this.contentRealY)}onDragEnd(){"move"!==this.mergedConfig.scrollType&&(this.dragScrolling=!1)}onMove(e){if(!this.canUse)return;this.onEnter();const{scrollType:s,stopDefault:i}=this.mergedConfig;if("drag"===s)return;const{viewportBounds:o,contentBounds:r,scrollXBar:n,scrollYBar:l}=this;if(n.visible||l.visible){const s=e.getInnerMove(this.target);let h;t.DragBoundsHelper.getValidMove(r,o,"inner",s,!0),s.x&&n.visible&&(this.target.scrollX+=s.x,h=!0),s.y&&l.visible&&(this.target.scrollY+=s.y,h=!0),(h||i)&&e.stop(),i&&e.stopDefault()}}onMoveEnd(t){this.canUse&&(this.target.hit(t)||this.onLeave())}onEnter(){this.canUse&&(clearTimeout(this.hideTimer),this.killAnimate(),this.opacity=1)}onLeave(){this.canUse&&(clearTimeout(this.hideTimer),this.mergedConfig.hideOnActionEnd&&(this.hideTimer=setTimeout(()=>{this.set({opacity:0},t.Plugin.has("animate"))},600)))}onResize(){this.canUse&&this.update()}__listenEvents(){const{scrollXBar:e,scrollYBar:s,target:i}=this;this.__eventIds=[e.on_(t.DragEvent.DRAG,this.onDrag,this),e.on_(t.DragEvent.END,this.onDragEnd,this),s.on_(t.DragEvent.DRAG,this.onDrag,this),s.on_(t.DragEvent.END,this.onDragEnd,this),i.on_(t.PointerEvent.ENTER,this.onEnter,this),i.on_(t.PointerEvent.LEAVE,this.onLeave,this),i.on_(t.MoveEvent.BEFORE_MOVE,this.onMove,this),i.on_(t.MoveEvent.END,this.onMoveEnd,this),i.on_(t.BoundsEvent.WORLD,this.onResize,this),i.on_(t.ChildEvent.DESTROY,this.destroy,this)]}__removeListenEvents(){this.off_(this.__eventIds)}destroy(){if(!this.destroyed){this.__removeListenEvents();const{target:t}=this;t.scroller=t.topChildren=t.hasScroller=void 0,this.target=this.config=null,super.destroy()}}}n.themeMap={};const l=n;t.Plugin.add("scroller");const h=t.Box.prototype;t.Box.addAttr("scrollConfig",void 0,function(e){return t.decorateLeafAttr(e,e=>t.attr({set(s){if(this.__setAttr(e,s)){this.__layout.scrollConfigChanged=!0,t.doBoundsType(this)}}}))}),h.__checkScroll=function(t){t&&this.isOverflow?(this.scroller||(this.scroller=new n(this),this.topChildren||(this.topChildren=[]),this.topChildren.push(this.scroller)),this.hasScroller=!0):this.hasScroller&&!this.scroller.dragScrolling&&(this.hasScroller=void 0,this.scroller.update())},n.registerTheme("light",{style:{fill:"black"}}),n.registerTheme("dark",{style:{fill:"white"}}),exports.Scroller=n;
|
|
2
|
+
//# sourceMappingURL=scroller.min.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scroller.min.cjs","sources":["../../../../../../src/preview/packages/scroller/src/config.ts","../../../../../../src/preview/packages/scroller/src/Scroller.ts","../../../../../../src/preview/packages/scroller/src/index.ts","../../../../../../src/preview/packages/scroller/src/decorate.ts"],"sourcesContent":["import { IScrollConfig } from '@leafer-ui/interface'\n\n\nexport const config: IScrollConfig = {\n theme: 'light',\n style: { dragBoundsType: 'outer', strokeAlign: 'center', strokeWidthFixed: 'zoom-in', width: 6, height: 6, opacity: 0.5, cornerRadius: 3, hoverStyle: { opacity: 0.6 }, pressStyle: { opacity: 0.66 } },\n size: 6,\n endsMargin: 2,\n sideMargin: 2,\n minSize: 10,\n scaleFixed: 'zoom-in',\n scrollType: 'both',\n hideOnActionEnd: 'hover'\n}\n\n","import { IBounds, IBox, IBoxInputData, IEventListenerId, IOverflow, IScroller, IScrollConfig, IScrollTheme, IObject } from '@leafer-ui/interface'\nimport { Group, Box, Bounds, DataHelper, DragEvent, LeafHelper, MoveEvent, DragBoundsHelper, ChildEvent, PointerEvent, Plugin, MathHelper, BranchHelper, isUndefined, BoundsEvent } from '@leafer-ui/core'\n\nimport { config } from './config'\n\n\nconst tempBounds = new Bounds(), { float } = MathHelper, { clone, assign } = DataHelper\n\nexport class Scroller extends Group implements IScroller {\n\n // 主题 map\n static themeMap: IObject = {}\n\n\n public target: IBox\n\n public config: IScrollConfig\n public mergedConfig: IScrollConfig\n\n public scrollXBar: IBox\n public scrollYBar: IBox\n\n // viewport 区域 / 内容区域\n public ratioX: number\n public ratioY: number\n\n // 滚动区域 / 内容区域\n public scrollRatioX: number\n public scrollRatioY: number\n\n // scroll之前的内容真实定位\n public contentRealX: number\n public contentRealY: number\n\n public dragScrolling: boolean\n\n // 用于比对数据,节流\n public targetOverflow: IOverflow\n public targetWorldBounds: IBounds = new Bounds()\n\n // viewport 与 内容区域\n public viewportBounds: IBounds = new Bounds()\n public contentBounds: IBounds = new Bounds()\n\n // 相对 viewport 区域收缩了一点边距\n public scrollXBounds: IBounds = new Bounds()\n public scrollYBounds: IBounds = new Bounds()\n\n\n protected get canUse(): boolean { return this.target.hasScroller }\n\n protected hideTimer: any\n\n protected __eventIds: IEventListenerId[]\n\n constructor(target: IBox) {\n super()\n this.target = target\n this.config = clone(config)\n this.updateConfig()\n this.__listenEvents()\n\n target.waitLeafer(() => {\n this.parent = target\n this.__bindLeafer(target.leafer)\n })\n\n if (this.mergedConfig.hideOnActionEnd) this.opacity = 0\n }\n\n\n static registerTheme(theme: IScrollTheme, themeConfig: IScrollConfig): void {\n S.themeMap[theme] = themeConfig\n }\n\n static getTheme(theme: IScrollTheme): IScrollConfig {\n return theme && S.themeMap[theme]\n }\n\n static hasTheme(theme: IScrollTheme): boolean {\n return theme && !!S.themeMap[theme]\n }\n\n\n public updateConfig(): void {\n const { scrollConfig } = this.target\n const themeConfig = S.getTheme((scrollConfig && S.hasTheme(scrollConfig.theme) && scrollConfig.theme) || this.config.theme)\n const mergedConfig: IScrollConfig = this.mergedConfig = clone(this.config)\n assign(mergedConfig, themeConfig)\n if (scrollConfig) assign(mergedConfig, scrollConfig)\n this.updateStyle(mergedConfig.style)\n }\n\n public updateStyle(style: IBoxInputData): void {\n if (!this.scrollXBar) this.addMany(this.scrollXBar = new Box(), this.scrollYBar = new Box())\n const { scrollXBar, scrollYBar } = this\n scrollXBar.set(style)\n scrollYBar.set(style)\n scrollXBar.draggable = 'x'\n scrollYBar.draggable = 'y'\n }\n\n public update(check: boolean = true): void {\n if (this.dragScrolling) return\n\n const { target, targetOverflow, targetWorldBounds, viewportBounds, contentBounds } = this, layout = target.__layout, { overflow } = target.__\n\n const { childrenRenderBounds } = layout // 内容 bounds\n const { boxBounds, worldBoxBounds } = layout // 容器 bounds\n\n const isSameWorldBounds = check && targetOverflow === overflow && targetWorldBounds.isSame(worldBoxBounds)\n const isSameConfig = layout.scrollConfigChanged ? (this.updateConfig(), layout.scrollConfigChanged = false) : true\n\n const nowContentBounds = tempBounds.set(viewportBounds).add(childrenRenderBounds)\n\n if (isSameWorldBounds && isSameConfig && contentBounds.isSame(nowContentBounds)) return // 节流\n\n this.targetOverflow = overflow\n viewportBounds.set(boxBounds)\n targetWorldBounds.set(worldBoxBounds)\n contentBounds.set(nowContentBounds)\n\n const { scrollXBar, scrollYBar } = this, { size, endsMargin, minSize } = this.mergedConfig, { width, height } = viewportBounds\n\n this.contentRealX = contentBounds.x - target.scrollX\n this.contentRealY = contentBounds.y - target.scrollY\n\n this.ratioX = viewportBounds.width / contentBounds.width\n this.ratioY = viewportBounds.height / contentBounds.height\n\n const min = size + endsMargin * 2 + minSize\n scrollXBar.visible = float(contentBounds.width) > float(width) && overflow !== 'y-scroll' && width > min\n scrollYBar.visible = float(contentBounds.height) > float(height) && overflow !== 'x-scroll' && height > min\n\n this.updateScrollBar()\n }\n\n public updateScrollBar() {\n const { target, viewportBounds, contentBounds, ratioX, ratioY, scrollXBar, scrollYBar, scrollXBounds, scrollYBounds } = this\n let { size, cornerRadius, endsMargin, sideMargin, minSize, scaleFixed, scrollType } = this.mergedConfig\n const scale = scaleFixed ? target.getClampRenderScale() : 1\n\n endsMargin /= scale\n sideMargin /= scale\n size /= scale\n if (isUndefined(cornerRadius)) cornerRadius = size / 2\n\n if (scrollXBar.visible) {\n scrollXBounds.set(viewportBounds).shrink([endsMargin, scrollYBar.visible ? size + sideMargin : endsMargin, sideMargin, endsMargin])\n const scrollRatioX = this.scrollRatioX = scrollXBounds.width / contentBounds.width\n\n scrollXBar.set({\n x: scrollXBounds.x - contentBounds.x * scrollRatioX,\n y: scrollXBounds.maxY - size,\n width: Math.max(scrollXBounds.width * ratioX, minSize),\n height: size,\n cornerRadius,\n dragBounds: scrollXBounds,\n hittable: scrollType !== 'move'\n })\n }\n\n if (scrollYBar.visible) {\n scrollYBounds.set(viewportBounds).shrink([endsMargin, sideMargin, scrollXBar.visible ? size + sideMargin : endsMargin, endsMargin])\n const scrollRatioY = this.scrollRatioY = scrollYBounds.height / contentBounds.height\n\n scrollYBar.set({\n x: scrollYBounds.maxX - size,\n y: scrollYBounds.y - contentBounds.y * scrollRatioY,\n width: size,\n height: Math.max(scrollYBounds.height * ratioY, minSize),\n cornerRadius,\n dragBounds: scrollYBounds,\n hittable: scrollType !== 'move'\n })\n }\n\n this.x = -this.target.scrollX\n this.y = -this.target.scrollY\n\n LeafHelper.updateAllMatrix(this)\n BranchHelper.updateBounds(this)\n LeafHelper.updateAllChange(this)\n }\n\n protected onDrag(e: DragEvent): void {\n if (this.mergedConfig.scrollType === 'move') return\n\n this.dragScrolling = true\n\n const { scrollXBar, scrollYBar, target, scrollXBounds, scrollYBounds } = this\n const scrollX = e.current === scrollXBar\n\n if (scrollX) target.scrollX = -((scrollXBar.x - scrollXBounds.x) / this.scrollRatioX + this.contentRealX)\n else target.scrollY = -((scrollYBar.y - scrollYBounds.y) / this.scrollRatioY + this.contentRealY)\n }\n\n protected onDragEnd(): void {\n if (this.mergedConfig.scrollType === 'move') return\n\n this.dragScrolling = false\n }\n\n protected onMove(e: MoveEvent): void {\n if (!this.canUse) return\n\n this.onEnter()\n\n const { scrollType, stopDefault } = this.mergedConfig\n if (scrollType === 'drag') return\n\n const { viewportBounds, contentBounds, scrollXBar, scrollYBar } = this\n if (scrollXBar.visible || scrollYBar.visible) {\n const move = e.getInnerMove(this.target)\n DragBoundsHelper.getValidMove(contentBounds, viewportBounds, 'inner', move, true)\n\n let needStop: boolean\n if (move.x && scrollXBar.visible) this.target.scrollX += move.x, needStop = true\n if (move.y && scrollYBar.visible) this.target.scrollY += move.y, needStop = true\n if (needStop || stopDefault) e.stop()\n if (stopDefault) e.stopDefault()\n }\n }\n\n protected onMoveEnd(e: MoveEvent): void {\n if (!this.canUse) return\n\n if (!this.target.hit(e)) this.onLeave()\n }\n\n protected onEnter() {\n if (!this.canUse) return\n\n clearTimeout(this.hideTimer)\n\n this.killAnimate()\n this.opacity = 1\n }\n\n protected onLeave() {\n if (!this.canUse) return\n\n clearTimeout(this.hideTimer)\n\n if (this.mergedConfig.hideOnActionEnd) this.hideTimer = setTimeout(() => {\n this.set({ opacity: 0 }, Plugin.has('animate'))\n }, 600)\n }\n\n protected onResize() {\n if (this.canUse) this.update()\n }\n\n protected __listenEvents(): void {\n const { scrollXBar, scrollYBar, target } = this\n this.__eventIds = [\n scrollXBar.on_(DragEvent.DRAG, this.onDrag, this),\n scrollXBar.on_(DragEvent.END, this.onDragEnd, this),\n\n scrollYBar.on_(DragEvent.DRAG, this.onDrag, this),\n scrollYBar.on_(DragEvent.END, this.onDragEnd, this),\n\n target.on_(PointerEvent.ENTER, this.onEnter, this),\n target.on_(PointerEvent.LEAVE, this.onLeave, this),\n\n target.on_(MoveEvent.BEFORE_MOVE, this.onMove, this),\n target.on_(MoveEvent.END, this.onMoveEnd, this),\n\n target.on_(BoundsEvent.WORLD, this.onResize, this), // 更新\n target.on_(ChildEvent.DESTROY, this.destroy, this)\n ]\n }\n\n protected __removeListenEvents(): void {\n this.off_(this.__eventIds)\n }\n\n public destroy(): void {\n if (!this.destroyed) {\n this.__removeListenEvents()\n const { target } = this\n target.scroller = target.topChildren = target.hasScroller = undefined\n this.target = this.config = null\n super.destroy()\n }\n }\n\n}\n\nconst S = Scroller","export { Scroller } from './Scroller'\n\nimport { Plugin, Box } from '@leafer-ui/core'\nimport { Scroller } from './Scroller'\nimport { scrollConfigType } from './decorate'\n\n\nPlugin.add('scroller')\n\n\nconst box = Box.prototype\n\nBox.addAttr('scrollConfig', undefined, scrollConfigType)\n\nbox.__checkScroll = function (isScrollMode: boolean) {\n if (isScrollMode && this.isOverflow) {\n if (!this.scroller) {\n this.scroller = new Scroller(this)\n if (!this.topChildren) this.topChildren = []\n this.topChildren.push(this.scroller)\n }\n this.hasScroller = true\n } else {\n if (this.hasScroller && !this.scroller.dragScrolling) {\n this.hasScroller = undefined\n this.scroller.update()\n }\n }\n}\n\nScroller.registerTheme('light', { style: { fill: 'black' } }) // 白天模式\nScroller.registerTheme('dark', { style: { fill: 'white' } }) // 夜间模式","import { IValue } from '@leafer-ui/interface'\nimport { decorateLeafAttr, attr, doBoundsType } from '@leafer-ui/core'\n\n\nexport function scrollConfigType(defaultValue?: IValue) {\n return decorateLeafAttr(defaultValue, (key: string) => attr({\n set(value: IValue) {\n if (this.__setAttr(key, value)) {\n const layout = this.__layout\n layout.scrollConfigChanged = true\n doBoundsType(this)\n }\n }\n }))\n}\n"],"names":["config","theme","style","dragBoundsType","strokeAlign","strokeWidthFixed","width","height","opacity","cornerRadius","hoverStyle","pressStyle","size","endsMargin","sideMargin","minSize","scaleFixed","scrollType","hideOnActionEnd","tempBounds","Bounds","float","MathHelper","clone","assign","DataHelper","Scroller","Group","canUse","this","target","hasScroller","constructor","super","targetWorldBounds","viewportBounds","contentBounds","scrollXBounds","scrollYBounds","updateConfig","__listenEvents","waitLeafer","parent","__bindLeafer","leafer","mergedConfig","registerTheme","themeConfig","S","themeMap","getTheme","hasTheme","scrollConfig","updateStyle","scrollXBar","addMany","Box","scrollYBar","set","draggable","update","check","dragScrolling","targetOverflow","layout","__layout","overflow","__","childrenRenderBounds","boxBounds","worldBoxBounds","isSameWorldBounds","isSame","isSameConfig","scrollConfigChanged","nowContentBounds","add","contentRealX","x","scrollX","contentRealY","y","scrollY","ratioX","ratioY","min","visible","updateScrollBar","scale","getClampRenderScale","isUndefined","shrink","scrollRatioX","maxY","Math","max","dragBounds","hittable","scrollRatioY","maxX","LeafHelper","updateAllMatrix","BranchHelper","updateBounds","updateAllChange","onDrag","e","current","onDragEnd","onMove","onEnter","stopDefault","move","getInnerMove","needStop","DragBoundsHelper","getValidMove","stop","onMoveEnd","hit","onLeave","clearTimeout","hideTimer","killAnimate","setTimeout","Plugin","has","onResize","__eventIds","on_","DragEvent","DRAG","END","PointerEvent","ENTER","LEAVE","MoveEvent","BEFORE_MOVE","BoundsEvent","WORLD","ChildEvent","DESTROY","destroy","__removeListenEvents","off_","destroyed","scroller","topChildren","undefined","box","prototype","addAttr","defaultValue","decorateLeafAttr","key","attr","value","__setAttr","doBoundsType","__checkScroll","isScrollMode","isOverflow","push","fill"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
this.LeaferIN=this.LeaferIN||{},this.LeaferIN.scroller=function(t,e){"use strict";const s={theme:"light",style:{dragBoundsType:"outer",strokeAlign:"center",strokeWidthFixed:"zoom-in",width:6,height:6,opacity:.5,cornerRadius:3,hoverStyle:{opacity:.6},pressStyle:{opacity:.66}},size:6,endsMargin:2,sideMargin:2,minSize:10,scaleFixed:"zoom-in",scrollType:"both",hideOnActionEnd:"hover"},i=new e.Bounds,{float:o}=e.MathHelper,{clone:r,assign:n}=e.DataHelper;class l extends e.Group{get canUse(){return this.target.hasScroller}constructor(t){super(),this.targetWorldBounds=new e.Bounds,this.viewportBounds=new e.Bounds,this.contentBounds=new e.Bounds,this.scrollXBounds=new e.Bounds,this.scrollYBounds=new e.Bounds,this.target=t,this.config=r(s),this.updateConfig(),this.__listenEvents(),t.waitLeafer(()=>{this.parent=t,this.__bindLeafer(t.leafer)}),this.mergedConfig.hideOnActionEnd&&(this.opacity=0)}static registerTheme(t,e){h.themeMap[t]=e}static getTheme(t){return t&&h.themeMap[t]}static hasTheme(t){return t&&!!h.themeMap[t]}updateConfig(){const{scrollConfig:t}=this.target,e=h.getTheme(t&&h.hasTheme(t.theme)&&t.theme||this.config.theme),s=this.mergedConfig=r(this.config);n(s,e),t&&n(s,t),this.updateStyle(s.style)}updateStyle(t){this.scrollXBar||this.addMany(this.scrollXBar=new e.Box,this.scrollYBar=new e.Box);const{scrollXBar:s,scrollYBar:i}=this;s.set(t),i.set(t),s.draggable="x",i.draggable="y"}update(t=!0){if(this.dragScrolling)return;const{target:e,targetOverflow:s,targetWorldBounds:r,viewportBounds:n,contentBounds:l}=this,h=e.__layout,{overflow:a}=e.__,{childrenRenderBounds:d}=h,{boxBounds:c,worldBoxBounds:g}=h,u=t&&s===a&&r.isSame(g),p=!h.scrollConfigChanged||(this.updateConfig(),h.scrollConfigChanged=!1),v=i.set(n).add(d);if(u&&p&&l.isSame(v))return;this.targetOverflow=a,n.set(c),r.set(g),l.set(v);const{scrollXBar:B,scrollYBar:f}=this,{size:m,endsMargin:y,minSize:E}=this.mergedConfig,{width:_,height:w}=n;this.contentRealX=l.x-e.scrollX,this.contentRealY=l.y-e.scrollY,this.ratioX=n.width/l.width,this.ratioY=n.height/l.height;const x=m+2*y+E;B.visible=o(l.width)>o(_)&&"y-scroll"!==a&&_>x,f.visible=o(l.height)>o(w)&&"x-scroll"!==a&&w>x,this.updateScrollBar()}updateScrollBar(){const{target:t,viewportBounds:s,contentBounds:i,ratioX:o,ratioY:r,scrollXBar:n,scrollYBar:l,scrollXBounds:h,scrollYBounds:a}=this;let{size:d,cornerRadius:c,endsMargin:g,sideMargin:u,minSize:p,scaleFixed:v,scrollType:B}=this.mergedConfig;const f=v?t.getClampRenderScale():1;if(g/=f,u/=f,d/=f,e.isUndefined(c)&&(c=d/2),n.visible){h.set(s).shrink([g,l.visible?d+u:g,u,g]);const t=this.scrollRatioX=h.width/i.width;n.set({x:h.x-i.x*t,y:h.maxY-d,width:Math.max(h.width*o,p),height:d,cornerRadius:c,dragBounds:h,hittable:"move"!==B})}if(l.visible){a.set(s).shrink([g,u,n.visible?d+u:g,g]);const t=this.scrollRatioY=a.height/i.height;l.set({x:a.maxX-d,y:a.y-i.y*t,width:d,height:Math.max(a.height*r,p),cornerRadius:c,dragBounds:a,hittable:"move"!==B})}this.x=-this.target.scrollX,this.y=-this.target.scrollY,e.LeafHelper.updateAllMatrix(this),e.BranchHelper.updateBounds(this),e.LeafHelper.updateAllChange(this)}onDrag(t){if("move"===this.mergedConfig.scrollType)return;this.dragScrolling=!0;const{scrollXBar:e,scrollYBar:s,target:i,scrollXBounds:o,scrollYBounds:r}=this;t.current===e?i.scrollX=-((e.x-o.x)/this.scrollRatioX+this.contentRealX):i.scrollY=-((s.y-r.y)/this.scrollRatioY+this.contentRealY)}onDragEnd(){"move"!==this.mergedConfig.scrollType&&(this.dragScrolling=!1)}onMove(t){if(!this.canUse)return;this.onEnter();const{scrollType:s,stopDefault:i}=this.mergedConfig;if("drag"===s)return;const{viewportBounds:o,contentBounds:r,scrollXBar:n,scrollYBar:l}=this;if(n.visible||l.visible){const s=t.getInnerMove(this.target);let h;e.DragBoundsHelper.getValidMove(r,o,"inner",s,!0),s.x&&n.visible&&(this.target.scrollX+=s.x,h=!0),s.y&&l.visible&&(this.target.scrollY+=s.y,h=!0),(h||i)&&t.stop(),i&&t.stopDefault()}}onMoveEnd(t){this.canUse&&(this.target.hit(t)||this.onLeave())}onEnter(){this.canUse&&(clearTimeout(this.hideTimer),this.killAnimate(),this.opacity=1)}onLeave(){this.canUse&&(clearTimeout(this.hideTimer),this.mergedConfig.hideOnActionEnd&&(this.hideTimer=setTimeout(()=>{this.set({opacity:0},e.Plugin.has("animate"))},600)))}onResize(){this.canUse&&this.update()}__listenEvents(){const{scrollXBar:t,scrollYBar:s,target:i}=this;this.__eventIds=[t.on_(e.DragEvent.DRAG,this.onDrag,this),t.on_(e.DragEvent.END,this.onDragEnd,this),s.on_(e.DragEvent.DRAG,this.onDrag,this),s.on_(e.DragEvent.END,this.onDragEnd,this),i.on_(e.PointerEvent.ENTER,this.onEnter,this),i.on_(e.PointerEvent.LEAVE,this.onLeave,this),i.on_(e.MoveEvent.BEFORE_MOVE,this.onMove,this),i.on_(e.MoveEvent.END,this.onMoveEnd,this),i.on_(e.BoundsEvent.WORLD,this.onResize,this),i.on_(e.ChildEvent.DESTROY,this.destroy,this)]}__removeListenEvents(){this.off_(this.__eventIds)}destroy(){if(!this.destroyed){this.__removeListenEvents();const{target:t}=this;t.scroller=t.topChildren=t.hasScroller=void 0,this.target=this.config=null,super.destroy()}}}l.themeMap={};const h=l;e.Plugin.add("scroller");const a=e.Box.prototype;return e.Box.addAttr("scrollConfig",void 0,function(t){return e.decorateLeafAttr(t,t=>e.attr({set(s){if(this.__setAttr(t,s)){this.__layout.scrollConfigChanged=!0,e.doBoundsType(this)}}}))}),a.__checkScroll=function(t){t&&this.isOverflow?(this.scroller||(this.scroller=new l(this),this.topChildren||(this.topChildren=[]),this.topChildren.push(this.scroller)),this.hasScroller=!0):this.hasScroller&&!this.scroller.dragScrolling&&(this.hasScroller=void 0,this.scroller.update())},l.registerTheme("light",{style:{fill:"black"}}),l.registerTheme("dark",{style:{fill:"white"}}),t.Scroller=l,t}({},LeaferUI);
|
|
2
|
+
//# sourceMappingURL=scroller.min.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scroller.min.js","sources":["../../../../../../src/preview/packages/scroller/src/config.ts","../../../../../../src/preview/packages/scroller/src/Scroller.ts","../../../../../../src/preview/packages/scroller/src/index.ts","../../../../../../src/preview/packages/scroller/src/decorate.ts"],"sourcesContent":["import { IScrollConfig } from '@leafer-ui/interface'\n\n\nexport const config: IScrollConfig = {\n theme: 'light',\n style: { dragBoundsType: 'outer', strokeAlign: 'center', strokeWidthFixed: 'zoom-in', width: 6, height: 6, opacity: 0.5, cornerRadius: 3, hoverStyle: { opacity: 0.6 }, pressStyle: { opacity: 0.66 } },\n size: 6,\n endsMargin: 2,\n sideMargin: 2,\n minSize: 10,\n scaleFixed: 'zoom-in',\n scrollType: 'both',\n hideOnActionEnd: 'hover'\n}\n\n","import { IBounds, IBox, IBoxInputData, IEventListenerId, IOverflow, IScroller, IScrollConfig, IScrollTheme, IObject } from '@leafer-ui/interface'\nimport { Group, Box, Bounds, DataHelper, DragEvent, LeafHelper, MoveEvent, DragBoundsHelper, ChildEvent, PointerEvent, Plugin, MathHelper, BranchHelper, isUndefined, BoundsEvent } from '@leafer-ui/core'\n\nimport { config } from './config'\n\n\nconst tempBounds = new Bounds(), { float } = MathHelper, { clone, assign } = DataHelper\n\nexport class Scroller extends Group implements IScroller {\n\n // 主题 map\n static themeMap: IObject = {}\n\n\n public target: IBox\n\n public config: IScrollConfig\n public mergedConfig: IScrollConfig\n\n public scrollXBar: IBox\n public scrollYBar: IBox\n\n // viewport 区域 / 内容区域\n public ratioX: number\n public ratioY: number\n\n // 滚动区域 / 内容区域\n public scrollRatioX: number\n public scrollRatioY: number\n\n // scroll之前的内容真实定位\n public contentRealX: number\n public contentRealY: number\n\n public dragScrolling: boolean\n\n // 用于比对数据,节流\n public targetOverflow: IOverflow\n public targetWorldBounds: IBounds = new Bounds()\n\n // viewport 与 内容区域\n public viewportBounds: IBounds = new Bounds()\n public contentBounds: IBounds = new Bounds()\n\n // 相对 viewport 区域收缩了一点边距\n public scrollXBounds: IBounds = new Bounds()\n public scrollYBounds: IBounds = new Bounds()\n\n\n protected get canUse(): boolean { return this.target.hasScroller }\n\n protected hideTimer: any\n\n protected __eventIds: IEventListenerId[]\n\n constructor(target: IBox) {\n super()\n this.target = target\n this.config = clone(config)\n this.updateConfig()\n this.__listenEvents()\n\n target.waitLeafer(() => {\n this.parent = target\n this.__bindLeafer(target.leafer)\n })\n\n if (this.mergedConfig.hideOnActionEnd) this.opacity = 0\n }\n\n\n static registerTheme(theme: IScrollTheme, themeConfig: IScrollConfig): void {\n S.themeMap[theme] = themeConfig\n }\n\n static getTheme(theme: IScrollTheme): IScrollConfig {\n return theme && S.themeMap[theme]\n }\n\n static hasTheme(theme: IScrollTheme): boolean {\n return theme && !!S.themeMap[theme]\n }\n\n\n public updateConfig(): void {\n const { scrollConfig } = this.target\n const themeConfig = S.getTheme((scrollConfig && S.hasTheme(scrollConfig.theme) && scrollConfig.theme) || this.config.theme)\n const mergedConfig: IScrollConfig = this.mergedConfig = clone(this.config)\n assign(mergedConfig, themeConfig)\n if (scrollConfig) assign(mergedConfig, scrollConfig)\n this.updateStyle(mergedConfig.style)\n }\n\n public updateStyle(style: IBoxInputData): void {\n if (!this.scrollXBar) this.addMany(this.scrollXBar = new Box(), this.scrollYBar = new Box())\n const { scrollXBar, scrollYBar } = this\n scrollXBar.set(style)\n scrollYBar.set(style)\n scrollXBar.draggable = 'x'\n scrollYBar.draggable = 'y'\n }\n\n public update(check: boolean = true): void {\n if (this.dragScrolling) return\n\n const { target, targetOverflow, targetWorldBounds, viewportBounds, contentBounds } = this, layout = target.__layout, { overflow } = target.__\n\n const { childrenRenderBounds } = layout // 内容 bounds\n const { boxBounds, worldBoxBounds } = layout // 容器 bounds\n\n const isSameWorldBounds = check && targetOverflow === overflow && targetWorldBounds.isSame(worldBoxBounds)\n const isSameConfig = layout.scrollConfigChanged ? (this.updateConfig(), layout.scrollConfigChanged = false) : true\n\n const nowContentBounds = tempBounds.set(viewportBounds).add(childrenRenderBounds)\n\n if (isSameWorldBounds && isSameConfig && contentBounds.isSame(nowContentBounds)) return // 节流\n\n this.targetOverflow = overflow\n viewportBounds.set(boxBounds)\n targetWorldBounds.set(worldBoxBounds)\n contentBounds.set(nowContentBounds)\n\n const { scrollXBar, scrollYBar } = this, { size, endsMargin, minSize } = this.mergedConfig, { width, height } = viewportBounds\n\n this.contentRealX = contentBounds.x - target.scrollX\n this.contentRealY = contentBounds.y - target.scrollY\n\n this.ratioX = viewportBounds.width / contentBounds.width\n this.ratioY = viewportBounds.height / contentBounds.height\n\n const min = size + endsMargin * 2 + minSize\n scrollXBar.visible = float(contentBounds.width) > float(width) && overflow !== 'y-scroll' && width > min\n scrollYBar.visible = float(contentBounds.height) > float(height) && overflow !== 'x-scroll' && height > min\n\n this.updateScrollBar()\n }\n\n public updateScrollBar() {\n const { target, viewportBounds, contentBounds, ratioX, ratioY, scrollXBar, scrollYBar, scrollXBounds, scrollYBounds } = this\n let { size, cornerRadius, endsMargin, sideMargin, minSize, scaleFixed, scrollType } = this.mergedConfig\n const scale = scaleFixed ? target.getClampRenderScale() : 1\n\n endsMargin /= scale\n sideMargin /= scale\n size /= scale\n if (isUndefined(cornerRadius)) cornerRadius = size / 2\n\n if (scrollXBar.visible) {\n scrollXBounds.set(viewportBounds).shrink([endsMargin, scrollYBar.visible ? size + sideMargin : endsMargin, sideMargin, endsMargin])\n const scrollRatioX = this.scrollRatioX = scrollXBounds.width / contentBounds.width\n\n scrollXBar.set({\n x: scrollXBounds.x - contentBounds.x * scrollRatioX,\n y: scrollXBounds.maxY - size,\n width: Math.max(scrollXBounds.width * ratioX, minSize),\n height: size,\n cornerRadius,\n dragBounds: scrollXBounds,\n hittable: scrollType !== 'move'\n })\n }\n\n if (scrollYBar.visible) {\n scrollYBounds.set(viewportBounds).shrink([endsMargin, sideMargin, scrollXBar.visible ? size + sideMargin : endsMargin, endsMargin])\n const scrollRatioY = this.scrollRatioY = scrollYBounds.height / contentBounds.height\n\n scrollYBar.set({\n x: scrollYBounds.maxX - size,\n y: scrollYBounds.y - contentBounds.y * scrollRatioY,\n width: size,\n height: Math.max(scrollYBounds.height * ratioY, minSize),\n cornerRadius,\n dragBounds: scrollYBounds,\n hittable: scrollType !== 'move'\n })\n }\n\n this.x = -this.target.scrollX\n this.y = -this.target.scrollY\n\n LeafHelper.updateAllMatrix(this)\n BranchHelper.updateBounds(this)\n LeafHelper.updateAllChange(this)\n }\n\n protected onDrag(e: DragEvent): void {\n if (this.mergedConfig.scrollType === 'move') return\n\n this.dragScrolling = true\n\n const { scrollXBar, scrollYBar, target, scrollXBounds, scrollYBounds } = this\n const scrollX = e.current === scrollXBar\n\n if (scrollX) target.scrollX = -((scrollXBar.x - scrollXBounds.x) / this.scrollRatioX + this.contentRealX)\n else target.scrollY = -((scrollYBar.y - scrollYBounds.y) / this.scrollRatioY + this.contentRealY)\n }\n\n protected onDragEnd(): void {\n if (this.mergedConfig.scrollType === 'move') return\n\n this.dragScrolling = false\n }\n\n protected onMove(e: MoveEvent): void {\n if (!this.canUse) return\n\n this.onEnter()\n\n const { scrollType, stopDefault } = this.mergedConfig\n if (scrollType === 'drag') return\n\n const { viewportBounds, contentBounds, scrollXBar, scrollYBar } = this\n if (scrollXBar.visible || scrollYBar.visible) {\n const move = e.getInnerMove(this.target)\n DragBoundsHelper.getValidMove(contentBounds, viewportBounds, 'inner', move, true)\n\n let needStop: boolean\n if (move.x && scrollXBar.visible) this.target.scrollX += move.x, needStop = true\n if (move.y && scrollYBar.visible) this.target.scrollY += move.y, needStop = true\n if (needStop || stopDefault) e.stop()\n if (stopDefault) e.stopDefault()\n }\n }\n\n protected onMoveEnd(e: MoveEvent): void {\n if (!this.canUse) return\n\n if (!this.target.hit(e)) this.onLeave()\n }\n\n protected onEnter() {\n if (!this.canUse) return\n\n clearTimeout(this.hideTimer)\n\n this.killAnimate()\n this.opacity = 1\n }\n\n protected onLeave() {\n if (!this.canUse) return\n\n clearTimeout(this.hideTimer)\n\n if (this.mergedConfig.hideOnActionEnd) this.hideTimer = setTimeout(() => {\n this.set({ opacity: 0 }, Plugin.has('animate'))\n }, 600)\n }\n\n protected onResize() {\n if (this.canUse) this.update()\n }\n\n protected __listenEvents(): void {\n const { scrollXBar, scrollYBar, target } = this\n this.__eventIds = [\n scrollXBar.on_(DragEvent.DRAG, this.onDrag, this),\n scrollXBar.on_(DragEvent.END, this.onDragEnd, this),\n\n scrollYBar.on_(DragEvent.DRAG, this.onDrag, this),\n scrollYBar.on_(DragEvent.END, this.onDragEnd, this),\n\n target.on_(PointerEvent.ENTER, this.onEnter, this),\n target.on_(PointerEvent.LEAVE, this.onLeave, this),\n\n target.on_(MoveEvent.BEFORE_MOVE, this.onMove, this),\n target.on_(MoveEvent.END, this.onMoveEnd, this),\n\n target.on_(BoundsEvent.WORLD, this.onResize, this), // 更新\n target.on_(ChildEvent.DESTROY, this.destroy, this)\n ]\n }\n\n protected __removeListenEvents(): void {\n this.off_(this.__eventIds)\n }\n\n public destroy(): void {\n if (!this.destroyed) {\n this.__removeListenEvents()\n const { target } = this\n target.scroller = target.topChildren = target.hasScroller = undefined\n this.target = this.config = null\n super.destroy()\n }\n }\n\n}\n\nconst S = Scroller","export { Scroller } from './Scroller'\n\nimport { Plugin, Box } from '@leafer-ui/core'\nimport { Scroller } from './Scroller'\nimport { scrollConfigType } from './decorate'\n\n\nPlugin.add('scroller')\n\n\nconst box = Box.prototype\n\nBox.addAttr('scrollConfig', undefined, scrollConfigType)\n\nbox.__checkScroll = function (isScrollMode: boolean) {\n if (isScrollMode && this.isOverflow) {\n if (!this.scroller) {\n this.scroller = new Scroller(this)\n if (!this.topChildren) this.topChildren = []\n this.topChildren.push(this.scroller)\n }\n this.hasScroller = true\n } else {\n if (this.hasScroller && !this.scroller.dragScrolling) {\n this.hasScroller = undefined\n this.scroller.update()\n }\n }\n}\n\nScroller.registerTheme('light', { style: { fill: 'black' } }) // 白天模式\nScroller.registerTheme('dark', { style: { fill: 'white' } }) // 夜间模式","import { IValue } from '@leafer-ui/interface'\nimport { decorateLeafAttr, attr, doBoundsType } from '@leafer-ui/core'\n\n\nexport function scrollConfigType(defaultValue?: IValue) {\n return decorateLeafAttr(defaultValue, (key: string) => attr({\n set(value: IValue) {\n if (this.__setAttr(key, value)) {\n const layout = this.__layout\n layout.scrollConfigChanged = true\n doBoundsType(this)\n }\n }\n }))\n}\n"],"names":["config","theme","style","dragBoundsType","strokeAlign","strokeWidthFixed","width","height","opacity","cornerRadius","hoverStyle","pressStyle","size","endsMargin","sideMargin","minSize","scaleFixed","scrollType","hideOnActionEnd","tempBounds","Bounds","float","MathHelper","clone","assign","DataHelper","Scroller","Group","canUse","this","target","hasScroller","constructor","super","targetWorldBounds","viewportBounds","contentBounds","scrollXBounds","scrollYBounds","updateConfig","__listenEvents","waitLeafer","parent","__bindLeafer","leafer","mergedConfig","registerTheme","themeConfig","S","themeMap","getTheme","hasTheme","scrollConfig","updateStyle","scrollXBar","addMany","Box","scrollYBar","set","draggable","update","check","dragScrolling","targetOverflow","layout","__layout","overflow","__","childrenRenderBounds","boxBounds","worldBoxBounds","isSameWorldBounds","isSame","isSameConfig","scrollConfigChanged","nowContentBounds","add","contentRealX","x","scrollX","contentRealY","y","scrollY","ratioX","ratioY","min","visible","updateScrollBar","scale","getClampRenderScale","isUndefined","shrink","scrollRatioX","maxY","Math","max","dragBounds","hittable","scrollRatioY","maxX","LeafHelper","updateAllMatrix","BranchHelper","updateBounds","updateAllChange","onDrag","e","current","onDragEnd","onMove","onEnter","stopDefault","move","getInnerMove","needStop","DragBoundsHelper","getValidMove","stop","onMoveEnd","hit","onLeave","clearTimeout","hideTimer","killAnimate","setTimeout","Plugin","has","onResize","__eventIds","on_","DragEvent","DRAG","END","PointerEvent","ENTER","LEAVE","MoveEvent","BEFORE_MOVE","BoundsEvent","WORLD","ChildEvent","DESTROY","destroy","__removeListenEvents","off_","destroyed","scroller","topChildren","undefined","box","prototype","addAttr","defaultValue","decorateLeafAttr","key","attr","value","__setAttr","doBoundsType","__checkScroll","isScrollMode","isOverflow","push","fill"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@leafer-in/scroller",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "@leafer-in/scroller",
|
|
5
|
+
"author": "Chao (Leafer) Wan",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "dist/scroller.esm.min.js",
|
|
9
|
+
"exports": {
|
|
10
|
+
"import": "./dist/scroller.esm.min.js",
|
|
11
|
+
"require": "./dist/scroller.min.cjs",
|
|
12
|
+
"types": "./types/index.d.ts"
|
|
13
|
+
},
|
|
14
|
+
"types": "types/index.d.ts",
|
|
15
|
+
"unpkg": "dist/scroller.min.js",
|
|
16
|
+
"jsdelivr": "dist/scroller.min.js",
|
|
17
|
+
"files": ["src","types","dist"],
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "https://github.com/leaferjs/leafer-in.git"
|
|
21
|
+
},
|
|
22
|
+
"homepage": "https://github.com/leaferjs/leafer-in/tree/main/packages/scroller",
|
|
23
|
+
"bugs": "https://github.com/leaferjs/leafer-in/issues",
|
|
24
|
+
"keywords": [
|
|
25
|
+
"leafer scroller",
|
|
26
|
+
"leafer-scroller",
|
|
27
|
+
"leafer-in",
|
|
28
|
+
"scroller",
|
|
29
|
+
"leafer-ui",
|
|
30
|
+
"leaferjs"
|
|
31
|
+
],
|
|
32
|
+
"peerDependencies": {
|
|
33
|
+
"@leafer-ui/core": "^1.9.10",
|
|
34
|
+
"@leafer-ui/interface": "^1.9.10",
|
|
35
|
+
"@leafer-in/interface": "^1.9.10"
|
|
36
|
+
}
|
|
37
|
+
}
|