@revolist/revogrid 4.14.7 → 4.14.8

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.
Files changed (56) hide show
  1. package/dist/cjs/loader.cjs.js +1 -1
  2. package/dist/cjs/revo-grid.cjs.entry.js +3 -1
  3. package/dist/cjs/revo-grid.cjs.entry.js.map +1 -1
  4. package/dist/cjs/revo-grid.cjs.js +1 -1
  5. package/dist/cjs/revogr-attribution_7.cjs.entry.js +27 -48
  6. package/dist/cjs/revogr-attribution_7.cjs.entry.js.map +1 -1
  7. package/dist/cjs/revogr-data_4.cjs.entry.js +28 -12
  8. package/dist/cjs/revogr-data_4.cjs.entry.js.map +1 -1
  9. package/dist/cjs/{throttle-250327e5.js → throttle-c7ae5154.js} +46 -7
  10. package/dist/cjs/throttle-c7ae5154.js.map +1 -0
  11. package/dist/collection/components/revoGrid/revo-grid.js +3 -1
  12. package/dist/collection/components/revoGrid/revo-grid.js.map +1 -1
  13. package/dist/collection/components/revoGrid/viewport.resize.service.js +4 -1
  14. package/dist/collection/components/revoGrid/viewport.resize.service.js.map +1 -1
  15. package/dist/collection/components/scroll/revogr-viewport-scroll.js +23 -10
  16. package/dist/collection/components/scroll/revogr-viewport-scroll.js.map +1 -1
  17. package/dist/collection/components/scrollable/revogr-scroll-virtual.js +63 -83
  18. package/dist/collection/components/scrollable/revogr-scroll-virtual.js.map +1 -1
  19. package/dist/collection/services/local.scroll.timer.js +45 -6
  20. package/dist/collection/services/local.scroll.timer.js.map +1 -1
  21. package/dist/esm/loader.js +1 -1
  22. package/dist/esm/revo-grid.entry.js +3 -1
  23. package/dist/esm/revo-grid.entry.js.map +1 -1
  24. package/dist/esm/revo-grid.js +1 -1
  25. package/dist/esm/revogr-attribution_7.entry.js +27 -48
  26. package/dist/esm/revogr-attribution_7.entry.js.map +1 -1
  27. package/dist/esm/revogr-data_4.entry.js +28 -12
  28. package/dist/esm/revogr-data_4.entry.js.map +1 -1
  29. package/dist/{revo-grid/throttle-9dcf4e1f.js → esm/throttle-7c83ca69.js} +46 -7
  30. package/dist/esm/throttle-7c83ca69.js.map +1 -0
  31. package/dist/revo-grid/revo-grid.entry.js +3 -1
  32. package/dist/revo-grid/revo-grid.entry.js.map +1 -1
  33. package/dist/revo-grid/revo-grid.esm.js +1 -1
  34. package/dist/revo-grid/revogr-attribution_7.entry.js +27 -48
  35. package/dist/revo-grid/revogr-attribution_7.entry.js.map +1 -1
  36. package/dist/revo-grid/revogr-data_4.entry.js +28 -12
  37. package/dist/revo-grid/revogr-data_4.entry.js.map +1 -1
  38. package/dist/{esm/throttle-9dcf4e1f.js → revo-grid/throttle-7c83ca69.js} +46 -7
  39. package/dist/revo-grid/throttle-7c83ca69.js.map +1 -0
  40. package/dist/types/components/scrollable/revogr-scroll-virtual.d.ts +9 -8
  41. package/dist/types/components.d.ts +17 -9
  42. package/dist/types/services/local.scroll.timer.d.ts +7 -1
  43. package/hydrate/index.js +104 -67
  44. package/hydrate/index.mjs +104 -67
  45. package/package.json +1 -1
  46. package/standalone/local.scroll.timer.js +45 -6
  47. package/standalone/local.scroll.timer.js.map +1 -1
  48. package/standalone/revo-grid.js +3 -1
  49. package/standalone/revo-grid.js.map +1 -1
  50. package/standalone/revogr-scroll-virtual2.js +29 -49
  51. package/standalone/revogr-scroll-virtual2.js.map +1 -1
  52. package/standalone/revogr-viewport-scroll2.js +27 -11
  53. package/standalone/revogr-viewport-scroll2.js.map +1 -1
  54. package/dist/cjs/throttle-250327e5.js.map +0 -1
  55. package/dist/esm/throttle-9dcf4e1f.js.map +0 -1
  56. package/dist/revo-grid/throttle-9dcf4e1f.js.map +0 -1
@@ -56,8 +56,9 @@ const RevogrScrollVirtual = /*@__PURE__*/ proxyCustomElement(class RevogrScrollV
56
56
  this.scrollVirtual = createEvent(this, "scrollvirtual", 7);
57
57
  this.scrollSize = 0;
58
58
  this.dimension = 'rgRow';
59
- this.viewportStore = undefined;
60
- this.dimensionStore = undefined;
59
+ this.realSize = undefined;
60
+ this.virtualSize = undefined;
61
+ this.clientSize = undefined;
61
62
  }
62
63
  async setScroll(e) {
63
64
  var _a;
@@ -69,8 +70,8 @@ const RevogrScrollVirtual = /*@__PURE__*/ proxyCustomElement(class RevogrScrollV
69
70
  if (e.coordinate) {
70
71
  this.autohideScrollPlugin.checkScroll({
71
72
  scrollSize: this.scrollSize,
72
- contentSize: this.dimensionStore.get('realSize'),
73
- virtualSize: this.viewportStore.get('virtualSize'),
73
+ contentSize: this.realSize,
74
+ virtualSize: this.virtualSize,
74
75
  });
75
76
  }
76
77
  }
@@ -91,20 +92,6 @@ const RevogrScrollVirtual = /*@__PURE__*/ proxyCustomElement(class RevogrScrollV
91
92
  }
92
93
  return e;
93
94
  }
94
- set size(s) {
95
- this.autohideScrollPlugin.setScrollSize(s);
96
- if (this.dimension === 'rgRow') {
97
- this.element.style.minWidth = `${s}px`;
98
- return;
99
- }
100
- this.element.style.minHeight = `${s}px`;
101
- }
102
- get size() {
103
- if (this.dimension === 'rgRow') {
104
- return this.element.clientHeight;
105
- }
106
- return this.element.clientWidth;
107
- }
108
95
  connectedCallback() {
109
96
  this.autohideScrollPlugin = new AutohideScrollPlugin(this.element);
110
97
  this.localScrollTimer = new LocalScrollTimer('ontouchstart' in document.documentElement ? 0 : 10);
@@ -125,37 +112,23 @@ const RevogrScrollVirtual = /*@__PURE__*/ proxyCustomElement(class RevogrScrollV
125
112
  this.scrollSize = getScrollbarSize(document);
126
113
  }
127
114
  componentDidRender() {
128
- const type = this.dimension === 'rgRow' ? 'scrollHeight' : 'scrollWidth';
129
- // Get scrollbar size once during component initialization
130
- const scrollbarSize = this.scrollSize;
131
- // Calculate if content exceeds viewport size
132
- // Add scrollbar size to the comparison to account for other dimension's scrollbar
133
- const hasScroll = this.element[type] > this.size + scrollbarSize;
134
- // Set scroll size based on whether scroll is needed
135
- this.size = hasScroll ? this.scrollSize : 0;
136
- let additionalScrollbarSize = 0;
115
+ let scrollSize = 0;
137
116
  if (this.dimension === 'rgRow') {
138
- additionalScrollbarSize =
139
- this.element.scrollWidth > this.element.clientWidth
140
- ? scrollbarSize
141
- : 0;
117
+ scrollSize = this.element.scrollHeight > this.element.clientHeight ? this.scrollSize : 0;
118
+ this.element.style.minWidth = `${scrollSize}px`;
142
119
  }
143
120
  else {
144
- additionalScrollbarSize =
145
- this.element.scrollHeight > this.element.clientHeight
146
- ? scrollbarSize
147
- : 0;
121
+ scrollSize = this.element.scrollWidth > this.element.clientWidth ? this.scrollSize : 0;
122
+ this.element.style.minHeight = `${scrollSize}px`;
148
123
  }
149
- const clientSize = this.size + additionalScrollbarSize;
124
+ this.autohideScrollPlugin.setScrollSize(scrollSize);
150
125
  this.localScrollService.setParams({
151
- contentSize: this.dimensionStore.get('realSize'),
152
- // Add scrollbar size to clientSize if other dimension has scroll
153
- clientSize,
154
- virtualSize: this.viewportStore.get('clientSize'),
126
+ contentSize: this.realSize,
127
+ clientSize: this.dimension === 'rgRow' ? this.element.clientHeight : this.element.clientWidth,
128
+ virtualSize: this.clientSize,
155
129
  }, this.dimension);
156
130
  }
157
131
  onScroll(e) {
158
- var _a;
159
132
  if (!(e.target instanceof Element)) {
160
133
  return;
161
134
  }
@@ -164,24 +137,31 @@ const RevogrScrollVirtual = /*@__PURE__*/ proxyCustomElement(class RevogrScrollV
164
137
  if (this.dimension === 'rgRow') {
165
138
  type = 'scrollTop';
166
139
  }
167
- // apply after throttling
168
- if (this.localScrollTimer.isReady(this.dimension, target[type] || 0)) {
140
+ const setScroll = () => {
141
+ var _a;
169
142
  (_a = this.localScrollService) === null || _a === void 0 ? void 0 : _a.scroll(target[type] || 0, this.dimension);
143
+ };
144
+ // apply after throttling
145
+ if (this.localScrollTimer.isReady(this.dimension, target[type])) {
146
+ setScroll();
147
+ }
148
+ else {
149
+ this.localScrollTimer.throttleLastScrollUpdate(this.dimension, target[type] || 0, () => setScroll());
170
150
  }
171
151
  }
172
152
  render() {
173
- const sizeType = this.dimension === 'rgRow' ? 'height' : 'width';
174
- const size = getContentSize(this.dimensionStore.get('realSize'), this.size, this.viewportStore.get('clientSize'));
175
- return (h(Host, { key: '94ccf82880ca9a3b0b1a87e94553f3c6ea6e885a', onScroll: (e) => this.onScroll(e) }, h("div", { key: '3518b4db297114195e4ef9bd3555d08bae08daa9', style: {
176
- [sizeType]: `${size}px`,
153
+ const size = getContentSize(this.realSize, this.dimension === 'rgRow' ? this.element.clientHeight : this.element.clientWidth, this.clientSize);
154
+ return (h(Host, { key: '57f81ec9deb2395e96b283338c03b9ad44f1e929', onScroll: (e) => this.onScroll(e) }, h("div", { key: '1a8c869adab53b362c351dae8d53664f33c4212c', style: {
155
+ [this.dimension === 'rgRow' ? 'height' : 'width']: `${size}px`,
177
156
  } })));
178
157
  }
179
158
  get element() { return this; }
180
159
  static get style() { return RevogrScrollVirtualStyle0; }
181
160
  }, [0, "revogr-scroll-virtual", {
182
161
  "dimension": [1],
183
- "viewportStore": [16],
184
- "dimensionStore": [16],
162
+ "realSize": [2, "real-size"],
163
+ "virtualSize": [2, "virtual-size"],
164
+ "clientSize": [2, "client-size"],
185
165
  "setScroll": [64],
186
166
  "changeScroll": [64]
187
167
  }]);
@@ -1 +1 @@
1
- {"file":"revogr-scroll-virtual2.js","mappings":"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","names":[],"sources":["src/components/scrollable/autohide-scroll.plugin.ts","src/components/scrollable/revogr-scroll-style.scss?tag=revogr-scroll-virtual","src/components/scrollable/revogr-scroll-virtual.tsx"],"sourcesContent":["\n\n/**\n * Autohide scroll for MacOS when scroll is visible only for 1 sec\n */\nexport class AutohideScrollPlugin {\n private autohideScrollTimeout = 0;\n constructor(private element: HTMLElement) {\n }\n\n /**\n * When scroll size updates set it up for autohide\n */\n setScrollSize(s: number) {\n if (!s) {\n this.element.setAttribute('autohide', 'true');\n } else {\n this.element.removeAttribute('autohide');\n }\n }\n\n /**\n * On each scroll check if it's time to show\n */\n checkScroll({\n scrollSize,\n contentSize,\n virtualSize,\n }: {\n scrollSize: number;\n contentSize: number;\n virtualSize: number;\n }) {\n const hasScroll = contentSize > virtualSize;\n const isHidden = !scrollSize && hasScroll;\n if (isHidden) {\n this.element.setAttribute('visible', 'true');\n this.autohideScrollTimeout = this.show(\n this.element,\n this.autohideScrollTimeout,\n );\n }\n }\n\n private show(element?: HTMLElement, timeout?: number): number {\n clearTimeout(timeout);\n return Number(\n setTimeout(() => {\n element?.removeAttribute('visible');\n }, 1000),\n );\n }\n clear() {\n clearTimeout(this.autohideScrollTimeout);\n }\n}\n","revogr-scroll-virtual {\n $min-size: 20px;\n\n // show scroll only for 1 sec\n &[autohide] {\n position: absolute;\n z-index: 100 !important;\n\n &.vertical {\n top: 0;\n right: 0;\n\n &[visible] {\n min-width: $min-size !important;\n }\n }\n\n &.horizontal {\n bottom: 0;\n left: 0;\n\n &[visible] {\n min-height: $min-size !important;\n }\n }\n }\n\n &.vertical {\n overflow-y: auto;\n overflow-x: hidden;\n height: 100%;\n\n > div {\n width: 1px;\n }\n }\n\n &.horizontal {\n overflow-x: auto;\n overflow-y: hidden;\n width: 100%;\n\n > div {\n height: 1px;\n }\n }\n}\n","import {\n Component,\n Element as StencilElement,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n} from '@stencil/core';\nimport LocalScrollService, {\n getContentSize,\n} from '../../services/local.scroll.service';\nimport type {\n DimensionType,\n ViewportState,\n DimensionSettingsState,\n ViewPortScrollEvent,\n} from '@type';\nimport { AutohideScrollPlugin } from './autohide-scroll.plugin';\nimport { LocalScrollTimer } from '../../services/local.scroll.timer';\nimport { type Observable, getScrollbarSize } from '../../utils';\n\n/**\n * Virtual scroll component\n */\n@Component({\n tag: 'revogr-scroll-virtual',\n styleUrl: 'revogr-scroll-style.scss',\n})\nexport class RevogrScrollVirtual {\n /**\n * Scroll dimension (`X` - `rgCol` or `Y` - `rgRow`)\n */\n @Prop() dimension: DimensionType = 'rgRow';\n\n /**\n * Viewport\n */\n @Prop() viewportStore!: Observable<ViewportState>;\n /**\n * Dimensions\n */\n @Prop() dimensionStore!: Observable<DimensionSettingsState>;\n\n /**\n * Scroll event\n */\n @Event({ eventName: 'scrollvirtual' })\n scrollVirtual: EventEmitter<ViewPortScrollEvent>;\n\n @StencilElement() element: HTMLElement;\n private autohideScrollPlugin: AutohideScrollPlugin;\n private scrollSize = 0;\n private localScrollService: LocalScrollService;\n private localScrollTimer: LocalScrollTimer;\n\n @Method()\n async setScroll(e: ViewPortScrollEvent): Promise<void> {\n if (this.dimension !== e.dimension) {\n return;\n }\n this.localScrollTimer.latestScrollUpdate(e.dimension);\n this.localScrollService?.setScroll(e);\n if (e.coordinate) {\n this.autohideScrollPlugin.checkScroll({\n scrollSize: this.scrollSize,\n contentSize: this.dimensionStore.get('realSize'),\n virtualSize: this.viewportStore.get('virtualSize'),\n });\n }\n }\n\n /**\n * Update if `delta` exists in case we don't know current position or if it's external change\n */\n @Method()\n async changeScroll(e: ViewPortScrollEvent): Promise<ViewPortScrollEvent> {\n if (e.delta) {\n switch (e.dimension) {\n case 'rgCol':\n e.coordinate = this.element.scrollLeft + e.delta;\n break;\n case 'rgRow':\n e.coordinate = this.element.scrollTop + e.delta;\n break;\n }\n this.setScroll(e);\n }\n return e;\n }\n\n set size(s: number) {\n this.autohideScrollPlugin.setScrollSize(s);\n if (this.dimension === 'rgRow') {\n this.element.style.minWidth = `${s}px`;\n return;\n }\n this.element.style.minHeight = `${s}px`;\n }\n\n get size(): number {\n if (this.dimension === 'rgRow') {\n return this.element.clientHeight;\n }\n return this.element.clientWidth;\n }\n\n connectedCallback() {\n this.autohideScrollPlugin = new AutohideScrollPlugin(this.element);\n this.localScrollTimer = new LocalScrollTimer(\n 'ontouchstart' in document.documentElement ? 0 : 10,\n );\n this.localScrollService = new LocalScrollService({\n runScroll: e => this.scrollVirtual.emit(e),\n applyScroll: e => {\n this.localScrollTimer.setCoordinate(e);\n const type = e.dimension === 'rgRow' ? 'scrollTop' : 'scrollLeft';\n // this will trigger on scroll event\n this.element[type] = e.coordinate;\n },\n });\n }\n\n disconnectedCallback() {\n this.autohideScrollPlugin.clear();\n }\n\n componentWillLoad() {\n this.scrollSize = getScrollbarSize(document);\n }\n\n componentDidRender() {\n const type = this.dimension === 'rgRow' ? 'scrollHeight' : 'scrollWidth';\n // Get scrollbar size once during component initialization\n const scrollbarSize = this.scrollSize;\n // Calculate if content exceeds viewport size\n // Add scrollbar size to the comparison to account for other dimension's scrollbar\n const hasScroll = this.element[type] > this.size + scrollbarSize;\n // Set scroll size based on whether scroll is needed\n this.size = hasScroll ? this.scrollSize : 0;\n\n let additionalScrollbarSize = 0;\n if (this.dimension === 'rgRow') {\n additionalScrollbarSize =\n this.element.scrollWidth > this.element.clientWidth\n ? scrollbarSize\n : 0;\n } else {\n additionalScrollbarSize =\n this.element.scrollHeight > this.element.clientHeight\n ? scrollbarSize\n : 0;\n }\n\n const clientSize = this.size + additionalScrollbarSize;\n\n this.localScrollService.setParams(\n {\n contentSize: this.dimensionStore.get('realSize'),\n // Add scrollbar size to clientSize if other dimension has scroll\n clientSize,\n virtualSize: this.viewportStore.get('clientSize'),\n },\n this.dimension,\n );\n }\n\n onScroll(e: MouseEvent) {\n if (!(e.target instanceof Element)) {\n return;\n }\n const target = e.target;\n let type: 'scrollLeft' | 'scrollTop' = 'scrollLeft';\n if (this.dimension === 'rgRow') {\n type = 'scrollTop';\n }\n // apply after throttling\n if (this.localScrollTimer.isReady(this.dimension, target[type] || 0)) {\n this.localScrollService?.scroll(target[type] || 0, this.dimension);\n }\n }\n\n render() {\n const sizeType = this.dimension === 'rgRow' ? 'height' : 'width';\n const size = getContentSize(\n this.dimensionStore.get('realSize'),\n this.size,\n this.viewportStore.get('clientSize'), // content viewport size\n );\n return (\n <Host onScroll={(e: MouseEvent) => this.onScroll(e)}>\n <div\n style={{\n [sizeType]: `${size}px`,\n }}\n />\n </Host>\n );\n }\n}\n"],"version":3}
1
+ {"file":"revogr-scroll-virtual2.js","mappings":"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","names":[],"sources":["src/components/scrollable/autohide-scroll.plugin.ts","src/components/scrollable/revogr-scroll-style.scss?tag=revogr-scroll-virtual","src/components/scrollable/revogr-scroll-virtual.tsx"],"sourcesContent":["\n\n/**\n * Autohide scroll for MacOS when scroll is visible only for 1 sec\n */\nexport class AutohideScrollPlugin {\n private autohideScrollTimeout = 0;\n constructor(private element: HTMLElement) {\n }\n\n /**\n * When scroll size updates set it up for autohide\n */\n setScrollSize(s: number) {\n if (!s) {\n this.element.setAttribute('autohide', 'true');\n } else {\n this.element.removeAttribute('autohide');\n }\n }\n\n /**\n * On each scroll check if it's time to show\n */\n checkScroll({\n scrollSize,\n contentSize,\n virtualSize,\n }: {\n scrollSize: number;\n contentSize: number;\n virtualSize: number;\n }) {\n const hasScroll = contentSize > virtualSize;\n const isHidden = !scrollSize && hasScroll;\n if (isHidden) {\n this.element.setAttribute('visible', 'true');\n this.autohideScrollTimeout = this.show(\n this.element,\n this.autohideScrollTimeout,\n );\n }\n }\n\n private show(element?: HTMLElement, timeout?: number): number {\n clearTimeout(timeout);\n return Number(\n setTimeout(() => {\n element?.removeAttribute('visible');\n }, 1000),\n );\n }\n clear() {\n clearTimeout(this.autohideScrollTimeout);\n }\n}\n","revogr-scroll-virtual {\n $min-size: 20px;\n\n // show scroll only for 1 sec\n &[autohide] {\n position: absolute;\n z-index: 100 !important;\n\n &.vertical {\n top: 0;\n right: 0;\n\n &[visible] {\n min-width: $min-size !important;\n }\n }\n\n &.horizontal {\n bottom: 0;\n left: 0;\n\n &[visible] {\n min-height: $min-size !important;\n }\n }\n }\n\n &.vertical {\n overflow-y: auto;\n overflow-x: hidden;\n height: 100%;\n\n > div {\n width: 1px;\n }\n }\n\n &.horizontal {\n overflow-x: auto;\n overflow-y: hidden;\n width: 100%;\n\n > div {\n height: 1px;\n }\n }\n}\n","import {\n Component,\n Element as StencilElement,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n} from '@stencil/core';\nimport LocalScrollService, {\n getContentSize,\n} from '../../services/local.scroll.service';\nimport type {\n DimensionType,\n ViewPortScrollEvent,\n} from '@type';\nimport { AutohideScrollPlugin } from './autohide-scroll.plugin';\nimport { LocalScrollTimer } from '../../services/local.scroll.timer';\nimport { getScrollbarSize } from '../../utils';\n\n/**\n * Virtual scroll component\n */\n@Component({\n tag: 'revogr-scroll-virtual',\n styleUrl: 'revogr-scroll-style.scss',\n})\nexport class RevogrScrollVirtual {\n /**\n * Scroll dimension (`X` - `rgCol` or `Y` - `rgRow`)\n */\n @Prop() dimension: DimensionType = 'rgRow';\n\n /**\n * Dimensions\n */\n @Prop() realSize!: number;\n\n /**\n * Virtual size\n */\n @Prop() virtualSize!: number;\n\n /**\n * Client size\n */\n @Prop() clientSize!: number;\n\n /**\n * Scroll event\n */\n @Event({ eventName: 'scrollvirtual' })\n scrollVirtual: EventEmitter<ViewPortScrollEvent>;\n\n @StencilElement() element: HTMLElement;\n private autohideScrollPlugin: AutohideScrollPlugin;\n private scrollSize = 0;\n private localScrollService: LocalScrollService;\n private localScrollTimer: LocalScrollTimer;\n\n @Method()\n async setScroll(e: ViewPortScrollEvent): Promise<void> {\n if (this.dimension !== e.dimension) {\n return;\n }\n this.localScrollTimer.latestScrollUpdate(e.dimension);\n this.localScrollService?.setScroll(e);\n if (e.coordinate) {\n this.autohideScrollPlugin.checkScroll({\n scrollSize: this.scrollSize,\n contentSize: this.realSize,\n virtualSize: this.virtualSize,\n });\n }\n }\n\n /**\n * Update if `delta` exists in case we don't know current position or if it's external change\n */\n @Method()\n async changeScroll(e: ViewPortScrollEvent): Promise<ViewPortScrollEvent> {\n if (e.delta) {\n switch (e.dimension) {\n case 'rgCol':\n e.coordinate = this.element.scrollLeft + e.delta;\n break;\n case 'rgRow':\n e.coordinate = this.element.scrollTop + e.delta;\n break;\n }\n this.setScroll(e);\n }\n return e;\n }\n\n connectedCallback() {\n this.autohideScrollPlugin = new AutohideScrollPlugin(this.element);\n this.localScrollTimer = new LocalScrollTimer(\n 'ontouchstart' in document.documentElement ? 0 : 10,\n );\n this.localScrollService = new LocalScrollService({\n runScroll: e => this.scrollVirtual.emit(e),\n applyScroll: e => {\n this.localScrollTimer.setCoordinate(e);\n const type = e.dimension === 'rgRow' ? 'scrollTop' : 'scrollLeft';\n // this will trigger on scroll event\n this.element[type] = e.coordinate;\n },\n });\n }\n\n disconnectedCallback() {\n this.autohideScrollPlugin.clear();\n }\n\n componentWillLoad() {\n this.scrollSize = getScrollbarSize(document);\n }\n\n componentDidRender() {\n let scrollSize = 0;\n if (this.dimension === 'rgRow') {\n scrollSize = this.element.scrollHeight > this.element.clientHeight ? this.scrollSize : 0;\n this.element.style.minWidth = `${scrollSize}px`;\n } else {\n scrollSize = this.element.scrollWidth > this.element.clientWidth ? this.scrollSize : 0;\n this.element.style.minHeight = `${scrollSize}px`;\n }\n this.autohideScrollPlugin.setScrollSize(scrollSize);\n this.localScrollService.setParams(\n {\n contentSize: this.realSize,\n clientSize: this.dimension === 'rgRow' ? this.element.clientHeight : this.element.clientWidth,\n virtualSize: this.clientSize,\n },\n this.dimension,\n );\n }\n\n onScroll(e: MouseEvent) {\n if (!(e.target instanceof Element)) {\n return;\n }\n const target = e.target;\n let type: 'scrollLeft' | 'scrollTop' = 'scrollLeft';\n if (this.dimension === 'rgRow') {\n type = 'scrollTop';\n }\n\n const setScroll = () => {\n this.localScrollService?.scroll(target[type] || 0, this.dimension);\n };\n // apply after throttling\n if (this.localScrollTimer.isReady(this.dimension, target[type])) {\n setScroll();\n } else {\n this.localScrollTimer.throttleLastScrollUpdate(this.dimension, target[type] || 0, () => setScroll());\n }\n }\n\n render() {\n const size = getContentSize(\n this.realSize,\n this.dimension === 'rgRow' ? this.element.clientHeight : this.element.clientWidth,\n this.clientSize, // content viewport size\n );\n return (\n <Host onScroll={(e: MouseEvent) => this.onScroll(e)}>\n <div\n style={{\n [this.dimension === 'rgRow' ? 'height' : 'width']: `${size}px`,\n }}\n />\n </Host>\n );\n }\n}\n"],"version":3}
@@ -77,7 +77,10 @@ class GridResizeService {
77
77
  };
78
78
  (_a = this.resize) === null || _a === void 0 ? void 0 : _a.call(this, entry, this.previousSize);
79
79
  this.previousSize = entry;
80
- }, 10);
80
+ }, 40, {
81
+ leading: false,
82
+ trailing: true,
83
+ });
81
84
  this.init(el);
82
85
  }
83
86
  async init(el) {
@@ -203,30 +206,37 @@ const RevogrViewportScroll = /*@__PURE__*/ proxyCustomElement(class RevogrViewpo
203
206
  this.resizeService = new GridResizeService(this.horizontalScroll, (entry, previousSize) => {
204
207
  var _a, _b, _c, _d, _e, _f, _g, _h;
205
208
  const els = {};
209
+ let calculatedHeight = 0;
206
210
  if (entry.height !== previousSize.height) {
207
- let height = entry.height || 0;
208
- if (height) {
209
- height -=
211
+ calculatedHeight = entry.height || 0;
212
+ if (calculatedHeight) {
213
+ calculatedHeight -=
210
214
  ((_b = (_a = this.header) === null || _a === void 0 ? void 0 : _a.clientHeight) !== null && _b !== void 0 ? _b : 0) +
211
215
  ((_d = (_c = this.footer) === null || _c === void 0 ? void 0 : _c.clientHeight) !== null && _d !== void 0 ? _d : 0);
212
216
  }
213
217
  els.rgRow = {
214
- size: height,
218
+ size: calculatedHeight,
215
219
  contentSize: this.contentHeight,
216
220
  scroll: (_f = (_e = this.verticalScroll) === null || _e === void 0 ? void 0 : _e.scrollTop) !== null && _f !== void 0 ? _f : 0,
217
221
  noScroll: false,
218
222
  };
219
223
  }
224
+ let calculatedWidth = 0;
220
225
  if (entry.width !== previousSize.width) {
226
+ calculatedWidth = entry.width || 0;
221
227
  els.rgCol = {
222
- size: entry.width || 0,
228
+ size: calculatedWidth,
223
229
  contentSize: this.contentWidth,
224
230
  scroll: this.horizontalScroll.scrollLeft,
225
231
  noScroll: this.colType !== 'rgCol',
226
232
  };
227
233
  }
228
- for (const [dim, item] of Object.entries(els)) {
229
- const dimension = dim;
234
+ // Process changes in order: width first, then height
235
+ const dimensions = ['rgCol', 'rgRow'];
236
+ for (const dimension of dimensions) {
237
+ const item = els[dimension];
238
+ if (!item)
239
+ continue;
230
240
  this.resizeViewport.emit({
231
241
  dimension,
232
242
  size: item.size,
@@ -291,7 +301,7 @@ const RevogrViewportScroll = /*@__PURE__*/ proxyCustomElement(class RevogrViewpo
291
301
  this.setScrollVisibility('rgCol', this.horizontalScroll.clientWidth, this.contentWidth);
292
302
  }
293
303
  render() {
294
- return (h(Host, { key: 'c8c94171231164105fad7a6f53743db615dc123a', onWheel: this.horizontalMouseWheel, onScroll: (e) => this.applyScroll('rgCol', e) }, h("div", { key: 'd33774605170a5ba43e41e3d3133130eeda1a6fb', class: "inner-content-table", style: { width: `${this.contentWidth}px` } }, h("div", { key: '3cf14b0fd2fce937f5f28b205fbd2402d0de3cb4', class: "header-wrapper", ref: e => (this.header = e) }, h("slot", { key: '14ce896ee001c614553744c2e4d8d680bf4e6d15', name: HEADER_SLOT })), h("div", { key: '46b937e0fc75a71f983b739e0c8179c2dc8115ac', class: "vertical-inner", ref: el => (this.verticalScroll = el), onWheel: this.verticalMouseWheel, onScroll: (e) => this.applyScroll('rgRow', e) }, h("div", { key: 'cf775690b0eef973f205659973ea23e376bc64d6', class: "content-wrapper", style: { height: `${this.contentHeight}px` } }, h("slot", { key: '63b50bb02edda40839829e7b54825953d3634906', name: CONTENT_SLOT }))), h("div", { key: 'c28e2f9d0524a8d0adc86d6a7d78b1ce15831edd', class: "footer-wrapper", ref: e => (this.footer = e) }, h("slot", { key: 'bd24b24482d201ad91c279d09f3bcc0f2bc58370', name: FOOTER_SLOT })))));
304
+ return (h(Host, { key: '08e10c135ea0a9089463ae5d81a4a7dc7f9c028c', onWheel: this.horizontalMouseWheel, onScroll: (e) => this.applyScroll('rgCol', e) }, h("div", { key: '2ff353b190f088a005f0fca3ad3eddf9f6728734', class: "inner-content-table", style: { width: `${this.contentWidth}px` } }, h("div", { key: '17d95d8baa8cef75f2b2373d283948b62b891fb3', class: "header-wrapper", ref: e => (this.header = e) }, h("slot", { key: 'cd8606829aaccbb2edad9a2dbe03600284f0af86', name: HEADER_SLOT })), h("div", { key: '77ffa873bb313a8940ef0032f938ce66e8e83e10', class: "vertical-inner", ref: el => (this.verticalScroll = el), onWheel: this.verticalMouseWheel, onScroll: (e) => this.applyScroll('rgRow', e) }, h("div", { key: 'cbf25a96eb5e71eed34f68ec341a8758e0bf213c', class: "content-wrapper", style: { height: `${this.contentHeight}px` } }, h("slot", { key: '5818ff4be234171f0759fcadf70e0bed6fd74f31', name: CONTENT_SLOT }))), h("div", { key: '7ab569e4451fb381f48cc4e03b103866a47b35b6', class: "footer-wrapper", ref: e => (this.footer = e) }, h("slot", { key: 'ce1860fa42d6661dd78fe1609cf50ed93da0c5f7', name: FOOTER_SLOT })))));
295
305
  }
296
306
  /**
297
307
  * Extra layer for scroll event monitoring, where MouseWheel event is not passing
@@ -321,10 +331,16 @@ const RevogrViewportScroll = /*@__PURE__*/ proxyCustomElement(class RevogrViewpo
321
331
  * Applies change on scroll event only if mousewheel event happened some time ago
322
332
  */
323
333
  applyOnScroll(type, coordinate, outside = false) {
324
- var _a;
334
+ const lastScrollUpdate = () => {
335
+ var _a;
336
+ (_a = this.localScrollService) === null || _a === void 0 ? void 0 : _a.scroll(coordinate, type, undefined, undefined, outside);
337
+ };
325
338
  // apply after throttling
326
339
  if (this.localScrollTimer.isReady(type, coordinate)) {
327
- (_a = this.localScrollService) === null || _a === void 0 ? void 0 : _a.scroll(coordinate, type, undefined, undefined, outside);
340
+ lastScrollUpdate();
341
+ }
342
+ else {
343
+ this.localScrollTimer.throttleLastScrollUpdate(type, coordinate, () => lastScrollUpdate());
328
344
  }
329
345
  }
330
346
  /**
@@ -1 +1 @@
1
- {"file":"revogr-viewport-scroll2.js","mappings":"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","names":[],"sources":["src/components/revoGrid/viewport.helpers.ts","src/utils/resize-observer.polifill.ts","src/components/revoGrid/viewport.resize.service.ts","src/components/scroll/revogr-viewport-scroll-style.scss?tag=revogr-viewport-scroll","src/components/scroll/revogr-viewport-scroll.tsx"],"sourcesContent":["/**\n * Collects data for pinned columns in the required @ViewportProps format.\n */\n\nimport type {\n DimensionRows,\n MultiDimensionType,\n SlotType,\n Cell,\n ViewportColumn,\n ColumnRegular,\n DimensionCols,\n ViewportState,\n DimensionSettingsState,\n DataType,\n} from '@type';\nimport type { Observable } from '../../utils';\nimport type { DSourceState } from '../../store';\n/**\n * Represents the slot names for the viewport slots.\n */\nexport const HEADER_SLOT = 'header'; // Slot name for the header slot\nexport const FOOTER_SLOT = 'footer'; // Slot name for the footer slot\nexport const CONTENT_SLOT = 'content'; // Slot name for the content slot\nexport const DATA_SLOT = 'data'; // Slot name for the data slot\n\n/**\n * Returns the last visible cell in the viewport for a given row type.\n * Coordinates are not zero-based and are relative to the viewport.\n * If needed to be zero-based they can be adjusted by subtracting 1.\n */\nexport function getLastCell(\n data: ViewportColumn,\n rowType: MultiDimensionType,\n): Cell {\n // Get the last visible column count from the viewport column data.\n const lastVisibleColumnCount = data.viewports[data.colType].store.get('realCount');\n\n // Get the last visible row count for the given row type from the viewport column data.\n const lastVisibleRowCount = data.viewports[rowType].store.get('realCount');\n\n // Return the last visible cell with the last visible column count and row count.\n return {\n x: lastVisibleColumnCount,\n y: lastVisibleRowCount,\n };\n}\n\n/**\n * Represents the partition of viewport data.\n */\nexport type VPPartition = {\n colData: Observable<DSourceState<ColumnRegular, DimensionCols>>;\n viewportCol: Observable<ViewportState>;\n viewportRow: Observable<ViewportState>;\n lastCell: Cell;\n slot: SlotType;\n type: DimensionRows;\n canDrag: boolean;\n position: Cell;\n dataStore: Observable<DSourceState<DataType, DimensionRows>>;\n dimensionCol: Observable<DimensionSettingsState>;\n dimensionRow: Observable<DimensionSettingsState>;\n style?: { height: string };\n};\n\nexport function viewportDataPartition(\n data: ViewportColumn,\n type: DimensionRows,\n slot: SlotType,\n fixed?: boolean,\n): VPPartition {\n return {\n colData: data.colStore,\n viewportCol: data.viewports[data.colType].store,\n viewportRow: data.viewports[type].store,\n // lastCell is the last real coordinate + 1\n lastCell: getLastCell(data, type),\n slot,\n type,\n canDrag: !fixed,\n position: data.position,\n dataStore: data.rowStores[type].store,\n dimensionCol: data.dimensions[data.colType].store,\n dimensionRow: data.dimensions[type].store,\n style: fixed\n ? { height: `${data.dimensions[type].store.get('realSize')}px` }\n : undefined,\n };\n}\n","export async function resizeObserver() {\n if (!('ResizeObserver' in window)) {\n const module = await import('@juggle/resize-observer');\n (window as Window & typeof globalThis).ResizeObserver = (module.ResizeObserver as unknown) as typeof ResizeObserver;\n }\n}\n","import throttle from 'lodash/throttle';\nimport { resizeObserver } from '../../utils/resize-observer.polifill';\n\ntype ResizeEntry = {\n width: number;\n height: number;\n};\nexport default class GridResizeService {\n private resizeObserver: ResizeObserver | null = null;\n private previousSize: ResizeEntry = {\n width: 0,\n height: 0,\n };\n private readonly apply = throttle(\n (e: ReadonlyArray<ResizeObserverEntry>) => {\n if (!e.length) {\n return;\n }\n const entry = {\n width: e[0].contentRect.width,\n height: e[0].contentRect.height,\n };\n this.resize?.(entry, this.previousSize);\n this.previousSize = entry;\n },\n 10,\n );\n constructor(\n el: HTMLElement,\n private readonly resize: (\n entry: ResizeEntry,\n previousSize: ResizeEntry,\n ) => void,\n ) {\n this.init(el);\n }\n\n async init(el: HTMLElement): Promise<void> {\n await resizeObserver();\n this.resizeObserver = new ResizeObserver(this.apply);\n this.resizeObserver?.observe(el);\n }\n\n public destroy() {\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n }\n}\n","@mixin noScroll {\n /* Hide scrollbar for IE and Edge */\n -ms-overflow-style: none;\n scrollbar-width: none; /* Firefox */\n /* Hide scrollbar for Chrome, Safari and Opera */\n &::-webkit-scrollbar {\n display: none;\n -webkit-appearance: none;\n }\n}\n\n.rowHeaders {\n z-index: 2;\n font-size: 10px;\n display: flex;\n height: 100%;\n\n revogr-data .rgCell {\n text-align: center;\n }\n\n .rgCell {\n padding: 0 1em !important;\n min-width: 100%;\n }\n}\n\nrevogr-viewport-scroll {\n @include noScroll;\n\n overflow-x: auto;\n overflow-y: hidden;\n position: relative;\n z-index: 1;\n height: 100%;\n\n &.colPinStart,\n &.colPinEnd {\n z-index: 2;\n }\n\n // make sure it would work\n &.colPinEnd:has(.active) {\n overflow: visible;\n }\n\n &.rgCol {\n flex-grow: 1;\n }\n\n .content-wrapper {\n overflow: hidden;\n }\n\n .inner-content-table {\n display: flex;\n flex-direction: column;\n max-height: 100%;\n width: 100%;\n min-width: 100%;\n position: relative;\n z-index: 0;\n }\n\n .vertical-inner {\n overflow-y: auto;\n position: relative;\n width: 100%;\n flex-grow: 1;\n outline: none; // avoid accessibility focus issue\n @include noScroll;\n\n revogr-data,\n revogr-overlay-selection {\n height: 100%;\n }\n }\n}\n","import {\n Component,\n Event,\n EventEmitter,\n h,\n Method,\n Element,\n Prop,\n Host,\n Listen,\n} from '@stencil/core';\n\nimport GridResizeService from '../revoGrid/viewport.resize.service';\nimport LocalScrollService from '../../services/local.scroll.service';\nimport { LocalScrollTimer } from '../../services/local.scroll.timer';\nimport {\n CONTENT_SLOT,\n FOOTER_SLOT,\n HEADER_SLOT,\n} from '../revoGrid/viewport.helpers';\nimport type {\n DimensionCols,\n DimensionType,\n ElementScroll,\n ScrollCoordinateEvent,\n ViewPortResizeEvent,\n ViewPortScrollEvent,\n} from '@type';\n\ntype Delta = 'deltaX' | 'deltaY';\ntype LocalScrollEvent = {\n preventDefault(): void;\n} & { [x in Delta]: number };\n\n/**\n * Viewport scroll component for RevoGrid\n * @slot - content\n * @slot header - header\n * @slot footer - footer\n */\n@Component({\n tag: 'revogr-viewport-scroll',\n styleUrl: 'revogr-viewport-scroll-style.scss',\n})\nexport class RevogrViewportScroll implements ElementScroll {\n /**\n * Enable row header\n */\n @Prop() readonly rowHeader: boolean;\n\n /**\n * Width of inner content\n */\n @Prop() contentWidth = 0;\n /**\n * Height of inner content\n */\n @Prop() contentHeight = 0;\n\n @Prop() colType!: DimensionCols | 'rowHeaders';\n\n /**\n * Before scroll event\n */\n @Event({ eventName: 'scrollviewport', bubbles: true })\n scrollViewport: EventEmitter<ViewPortScrollEvent>;\n /**\n * Viewport resize\n */\n @Event({ eventName: 'resizeviewport' })\n resizeViewport: EventEmitter<ViewPortResizeEvent>;\n\n /**\n * Triggered on scroll change, can be used to get information about scroll visibility\n */\n @Event() scrollchange: EventEmitter<{\n type: DimensionType;\n hasScroll: boolean;\n }>;\n\n /**\n * Silently scroll to coordinate\n * Made to align negative coordinates for mobile devices\n */\n @Event({ eventName: 'scrollviewportsilent' })\n silentScroll: EventEmitter<ViewPortScrollEvent>;\n\n @Element() horizontalScroll: HTMLElement;\n\n private verticalScroll?: HTMLElement;\n private header?: HTMLElement;\n private footer?: HTMLElement;\n\n /**\n * Static functions to bind wheel change\n */\n private horizontalMouseWheel: (e: Partial<LocalScrollEvent>) => void;\n private verticalMouseWheel: (e: Partial<LocalScrollEvent>) => void;\n\n private resizeService?: GridResizeService;\n private localScrollService: LocalScrollService;\n private localScrollTimer: LocalScrollTimer;\n\n @Method() async setScroll(e: ViewPortScrollEvent) {\n this.localScrollTimer.latestScrollUpdate(e.dimension);\n this.localScrollService?.setScroll(e);\n }\n\n /**\n * update on delta in case we don't know existing position or external change\n * @param e\n */\n @Method() async changeScroll(e: ViewPortScrollEvent, silent = false) {\n if (silent) {\n if (e.coordinate && this.verticalScroll) {\n switch (e.dimension) {\n // for mobile devices to skip negative scroll loop. only on vertical scroll\n case 'rgRow':\n this.verticalScroll.style.transform = `translateY(${-1 * e.coordinate}px)`;\n break;\n }\n }\n return;\n }\n if (e.delta) {\n switch (e.dimension) {\n case 'rgCol':\n e.coordinate = this.horizontalScroll.scrollLeft + e.delta;\n break;\n case 'rgRow':\n e.coordinate = (this.verticalScroll?.scrollTop ?? 0) + e.delta;\n break;\n }\n this.setScroll(e);\n }\n return e;\n }\n\n /**\n * Dispatch this event to trigger vertical mouse wheel from plugins\n */\n @Listen('mousewheel-vertical') mousewheelVertical({\n detail: e,\n }: CustomEvent<LocalScrollEvent>) {\n this.verticalMouseWheel(e);\n }\n /**\n * Dispatch this event to trigger horizontal mouse wheel from plugins\n */\n @Listen('mousewheel-horizontal') mousewheelHorizontal({\n detail: e,\n }: CustomEvent<LocalScrollEvent>) {\n this.horizontalMouseWheel(e);\n }\n /**\n * Allows to use outside listener\n */\n @Listen('scroll-coordinate') scrollApply({\n detail: { type, coordinate },\n }: CustomEvent<ScrollCoordinateEvent>) {\n this.applyOnScroll(type, coordinate, true);\n }\n\n connectedCallback() {\n /**\n * Bind scroll functions for farther usage\n */\n // allow mousewheel for all devices including mobile\n this.verticalMouseWheel = this.onVerticalMouseWheel.bind(\n this,\n 'rgRow',\n 'deltaY',\n );\n this.horizontalMouseWheel = this.onHorizontalMouseWheel.bind(\n this,\n 'rgCol',\n 'deltaX',\n );\n this.localScrollTimer = new LocalScrollTimer(\n 'ontouchstart' in document.documentElement ? 0 : 10,\n );\n /**\n * Create local scroll service\n */\n this.localScrollService = new LocalScrollService({\n // to improve safari smoothnes on scroll\n // skipAnimationFrame: isSafariDesktop(),\n runScroll: e => this.scrollViewport.emit(e),\n applyScroll: e => {\n this.localScrollTimer.setCoordinate(e);\n switch (e.dimension) {\n case 'rgCol':\n // this will trigger on scroll event\n this.horizontalScroll.scrollLeft = e.coordinate;\n break;\n case 'rgRow':\n if (this.verticalScroll) {\n // this will trigger on scroll event\n this.verticalScroll.scrollTop = e.coordinate;\n // for mobile devices to skip negative scroll loop. only on vertical scroll\n if (this.verticalScroll.style.transform) {\n this.verticalScroll.style.transform = '';\n }\n }\n break;\n }\n },\n });\n }\n\n componentDidLoad() {\n // track horizontal viewport resize\n this.resizeService = new GridResizeService(\n this.horizontalScroll,\n (entry, previousSize) => {\n const els: Partial<\n Record<\n DimensionType,\n {\n size: number;\n contentSize: number;\n scroll: number;\n noScroll: boolean;\n }\n >\n > = {};\n if (entry.height !== previousSize.height) {\n let height = entry.height || 0;\n if (height) {\n height -=\n (this.header?.clientHeight ?? 0) +\n (this.footer?.clientHeight ?? 0);\n }\n els.rgRow = {\n size: height,\n contentSize: this.contentHeight,\n scroll: this.verticalScroll?.scrollTop ?? 0,\n noScroll: false,\n };\n }\n if (entry.width !== previousSize.width) {\n els.rgCol = {\n size: entry.width || 0,\n contentSize: this.contentWidth,\n scroll: this.horizontalScroll.scrollLeft,\n noScroll: this.colType !== 'rgCol',\n };\n }\n\n for (const [dim, item] of Object.entries(els)) {\n const dimension = dim as DimensionType;\n this.resizeViewport.emit({\n dimension,\n size: item.size,\n rowHeader: this.rowHeader,\n });\n if (item.noScroll) {\n continue;\n }\n this.localScrollService?.scroll(item.scroll ?? 0, dimension, true);\n // track scroll visibility on outer element change\n this.setScrollVisibility(dimension, item.size, item.contentSize);\n }\n },\n );\n }\n\n /**\n * Check if scroll present or not per type\n * Trigger this method on inner content size change or on outer element size change\n * If inner content bigger then outer size then scroll is present and mousewheel binding required\n * @param type - dimension type 'rgRow/y' or 'rgCol/x'\n * @param size - outer content size\n * @param innerContentSize - inner content size\n */\n setScrollVisibility(\n type: DimensionType,\n size: number,\n innerContentSize: number,\n ) {\n // test if scroll present\n const hasScroll = size < innerContentSize;\n let el: HTMLElement | undefined;\n // event reference for binding\n switch (type) {\n case 'rgCol':\n el = this.horizontalScroll;\n break;\n case 'rgRow':\n el = this.verticalScroll;\n break;\n }\n // based on scroll visibility assign or remove class and event\n if (hasScroll) {\n el?.classList.add(`scroll-${type}`);\n } else {\n el?.classList.remove(`scroll-${type}`);\n }\n this.scrollchange.emit({ type, hasScroll });\n }\n\n disconnectedCallback() {\n this.resizeService?.destroy();\n }\n\n async componentDidRender() {\n this.localScrollService.setParams(\n {\n contentSize: this.contentHeight,\n clientSize: this.verticalScroll?.clientHeight ?? 0,\n virtualSize: 0,\n },\n 'rgRow',\n );\n\n this.localScrollService.setParams(\n {\n contentSize: this.contentWidth,\n clientSize: this.horizontalScroll.clientWidth,\n virtualSize: 0,\n },\n 'rgCol',\n );\n this.setScrollVisibility(\n 'rgRow',\n this.verticalScroll?.clientHeight ?? 0,\n this.contentHeight,\n );\n this.setScrollVisibility(\n 'rgCol',\n this.horizontalScroll.clientWidth,\n this.contentWidth,\n );\n }\n\n render() {\n return (\n <Host\n onWheel={this.horizontalMouseWheel}\n onScroll={(e: UIEvent) => this.applyScroll('rgCol', e)}\n >\n <div\n class=\"inner-content-table\"\n style={{ width: `${this.contentWidth}px` }}\n >\n <div class=\"header-wrapper\" ref={e => (this.header = e)}>\n <slot name={HEADER_SLOT} />\n </div>\n <div\n class=\"vertical-inner\"\n ref={el => (this.verticalScroll = el)}\n onWheel={this.verticalMouseWheel}\n onScroll={(e: MouseEvent) => this.applyScroll('rgRow', e)}\n >\n <div\n class=\"content-wrapper\"\n style={{ height: `${this.contentHeight}px` }}\n >\n <slot name={CONTENT_SLOT} />\n </div>\n </div>\n <div class=\"footer-wrapper\" ref={e => (this.footer = e)}>\n <slot name={FOOTER_SLOT} />\n </div>\n </div>\n </Host>\n );\n }\n /**\n * Extra layer for scroll event monitoring, where MouseWheel event is not passing\n * We need to trigger scroll event in case there is no mousewheel event\n */\n @Method() async applyScroll(type: DimensionType, e: UIEvent) {\n if (!(e.target instanceof HTMLElement)) {\n return;\n }\n let scroll = 0;\n switch (type) {\n case 'rgCol':\n scroll = e.target.scrollLeft;\n break;\n case 'rgRow':\n scroll = e.target.scrollTop;\n break;\n }\n\n // for mobile devices to skip negative scroll loop\n if (scroll < 0) {\n this.silentScroll.emit({ dimension: type, coordinate: scroll });\n return;\n }\n this.applyOnScroll(type, scroll);\n }\n\n /**\n * Applies change on scroll event only if mousewheel event happened some time ago\n */\n private applyOnScroll(\n type: DimensionType,\n coordinate: number,\n outside = false,\n ) {\n // apply after throttling\n if (this.localScrollTimer.isReady(type, coordinate)) {\n this.localScrollService?.scroll(\n coordinate,\n type,\n undefined,\n undefined,\n outside,\n );\n }\n }\n\n /**\n * On vertical mousewheel event\n * @param type\n * @param delta\n * @param e\n */\n private onVerticalMouseWheel(\n type: DimensionType,\n delta: Delta,\n e: LocalScrollEvent,\n ) {\n const scrollTop = this.verticalScroll?.scrollTop ?? 0;\n const clientHeight = this.verticalScroll?.clientHeight ?? 0;\n const scrollHeight = this.verticalScroll?.scrollHeight ?? 0;\n\n // Detect if the user has reached the bottom\n const atBottom = scrollTop + clientHeight >= scrollHeight && e.deltaY > 0;\n const atTop = scrollTop === 0 && e.deltaY < 0;\n if (!atBottom && !atTop) {\n e.preventDefault?.();\n }\n const pos = scrollTop + e[delta];\n this.localScrollService?.scroll(pos, type, undefined, e[delta]);\n this.localScrollTimer.latestScrollUpdate(type);\n }\n\n /**\n * On horizontal mousewheel event\n * @param type\n * @param delta\n * @param e\n */\n private onHorizontalMouseWheel(\n type: DimensionType,\n delta: Delta,\n e: LocalScrollEvent,\n ) {\n if (!e.deltaX) {\n return;\n }\n const { scrollLeft, scrollWidth, clientWidth } = this.horizontalScroll;\n\n // Detect if the user has reached the right end\n const atRight = scrollLeft + clientWidth >= scrollWidth && e.deltaX > 0;\n\n // Detect if the user has reached the left end\n const atLeft = scrollLeft === 0 && e.deltaX < 0;\n if (!atRight && !atLeft) {\n e.preventDefault?.();\n }\n const pos = scrollLeft + e[delta];\n this.localScrollService?.scroll(pos, type, undefined, e[delta]);\n this.localScrollTimer.latestScrollUpdate(type);\n }\n}\n"],"version":3}
1
+ {"file":"revogr-viewport-scroll2.js","mappings":"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","names":[],"sources":["src/components/revoGrid/viewport.helpers.ts","src/utils/resize-observer.polifill.ts","src/components/revoGrid/viewport.resize.service.ts","src/components/scroll/revogr-viewport-scroll-style.scss?tag=revogr-viewport-scroll","src/components/scroll/revogr-viewport-scroll.tsx"],"sourcesContent":["/**\n * Collects data for pinned columns in the required @ViewportProps format.\n */\n\nimport type {\n DimensionRows,\n MultiDimensionType,\n SlotType,\n Cell,\n ViewportColumn,\n ColumnRegular,\n DimensionCols,\n ViewportState,\n DimensionSettingsState,\n DataType,\n} from '@type';\nimport type { Observable } from '../../utils';\nimport type { DSourceState } from '../../store';\n/**\n * Represents the slot names for the viewport slots.\n */\nexport const HEADER_SLOT = 'header'; // Slot name for the header slot\nexport const FOOTER_SLOT = 'footer'; // Slot name for the footer slot\nexport const CONTENT_SLOT = 'content'; // Slot name for the content slot\nexport const DATA_SLOT = 'data'; // Slot name for the data slot\n\n/**\n * Returns the last visible cell in the viewport for a given row type.\n * Coordinates are not zero-based and are relative to the viewport.\n * If needed to be zero-based they can be adjusted by subtracting 1.\n */\nexport function getLastCell(\n data: ViewportColumn,\n rowType: MultiDimensionType,\n): Cell {\n // Get the last visible column count from the viewport column data.\n const lastVisibleColumnCount = data.viewports[data.colType].store.get('realCount');\n\n // Get the last visible row count for the given row type from the viewport column data.\n const lastVisibleRowCount = data.viewports[rowType].store.get('realCount');\n\n // Return the last visible cell with the last visible column count and row count.\n return {\n x: lastVisibleColumnCount,\n y: lastVisibleRowCount,\n };\n}\n\n/**\n * Represents the partition of viewport data.\n */\nexport type VPPartition = {\n colData: Observable<DSourceState<ColumnRegular, DimensionCols>>;\n viewportCol: Observable<ViewportState>;\n viewportRow: Observable<ViewportState>;\n lastCell: Cell;\n slot: SlotType;\n type: DimensionRows;\n canDrag: boolean;\n position: Cell;\n dataStore: Observable<DSourceState<DataType, DimensionRows>>;\n dimensionCol: Observable<DimensionSettingsState>;\n dimensionRow: Observable<DimensionSettingsState>;\n style?: { height: string };\n};\n\nexport function viewportDataPartition(\n data: ViewportColumn,\n type: DimensionRows,\n slot: SlotType,\n fixed?: boolean,\n): VPPartition {\n return {\n colData: data.colStore,\n viewportCol: data.viewports[data.colType].store,\n viewportRow: data.viewports[type].store,\n // lastCell is the last real coordinate + 1\n lastCell: getLastCell(data, type),\n slot,\n type,\n canDrag: !fixed,\n position: data.position,\n dataStore: data.rowStores[type].store,\n dimensionCol: data.dimensions[data.colType].store,\n dimensionRow: data.dimensions[type].store,\n style: fixed\n ? { height: `${data.dimensions[type].store.get('realSize')}px` }\n : undefined,\n };\n}\n","export async function resizeObserver() {\n if (!('ResizeObserver' in window)) {\n const module = await import('@juggle/resize-observer');\n (window as Window & typeof globalThis).ResizeObserver = (module.ResizeObserver as unknown) as typeof ResizeObserver;\n }\n}\n","import throttle from 'lodash/throttle';\nimport { resizeObserver } from '../../utils/resize-observer.polifill';\n\ntype ResizeEntry = {\n width: number;\n height: number;\n};\nexport default class GridResizeService {\n private resizeObserver: ResizeObserver | null = null;\n private previousSize: ResizeEntry = {\n width: 0,\n height: 0,\n };\n private readonly apply = throttle(\n (e: ReadonlyArray<ResizeObserverEntry>) => {\n if (!e.length) {\n return;\n }\n const entry = {\n width: e[0].contentRect.width,\n height: e[0].contentRect.height,\n };\n this.resize?.(entry, this.previousSize);\n this.previousSize = entry;\n },\n 40,\n {\n leading: false,\n trailing: true,\n }\n );\n constructor(\n el: HTMLElement,\n private readonly resize: (\n entry: ResizeEntry,\n previousSize: ResizeEntry,\n ) => void,\n ) {\n this.init(el);\n }\n\n async init(el: HTMLElement): Promise<void> {\n await resizeObserver();\n this.resizeObserver = new ResizeObserver(this.apply);\n this.resizeObserver?.observe(el);\n }\n\n public destroy() {\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n }\n}\n","@mixin noScroll {\n /* Hide scrollbar for IE and Edge */\n -ms-overflow-style: none;\n scrollbar-width: none; /* Firefox */\n /* Hide scrollbar for Chrome, Safari and Opera */\n &::-webkit-scrollbar {\n display: none;\n -webkit-appearance: none;\n }\n}\n\n.rowHeaders {\n z-index: 2;\n font-size: 10px;\n display: flex;\n height: 100%;\n\n revogr-data .rgCell {\n text-align: center;\n }\n\n .rgCell {\n padding: 0 1em !important;\n min-width: 100%;\n }\n}\n\nrevogr-viewport-scroll {\n @include noScroll;\n\n overflow-x: auto;\n overflow-y: hidden;\n position: relative;\n z-index: 1;\n height: 100%;\n\n &.colPinStart,\n &.colPinEnd {\n z-index: 2;\n }\n\n // make sure it would work\n &.colPinEnd:has(.active) {\n overflow: visible;\n }\n\n &.rgCol {\n flex-grow: 1;\n }\n\n .content-wrapper {\n overflow: hidden;\n }\n\n .inner-content-table {\n display: flex;\n flex-direction: column;\n max-height: 100%;\n width: 100%;\n min-width: 100%;\n position: relative;\n z-index: 0;\n }\n\n .vertical-inner {\n overflow-y: auto;\n position: relative;\n width: 100%;\n flex-grow: 1;\n outline: none; // avoid accessibility focus issue\n @include noScroll;\n\n revogr-data,\n revogr-overlay-selection {\n height: 100%;\n }\n }\n}\n","import {\n Component,\n Event,\n EventEmitter,\n h,\n Method,\n Element,\n Prop,\n Host,\n Listen,\n} from '@stencil/core';\n\nimport GridResizeService from '../revoGrid/viewport.resize.service';\nimport LocalScrollService from '../../services/local.scroll.service';\nimport { LocalScrollTimer } from '../../services/local.scroll.timer';\nimport {\n CONTENT_SLOT,\n FOOTER_SLOT,\n HEADER_SLOT,\n} from '../revoGrid/viewport.helpers';\nimport type {\n DimensionCols,\n DimensionType,\n ElementScroll,\n ScrollCoordinateEvent,\n ViewPortResizeEvent,\n ViewPortScrollEvent,\n} from '@type';\n\ntype Delta = 'deltaX' | 'deltaY';\ntype LocalScrollEvent = {\n preventDefault(): void;\n} & { [x in Delta]: number };\n\n/**\n * Viewport scroll component for RevoGrid\n * @slot - content\n * @slot header - header\n * @slot footer - footer\n */\n@Component({\n tag: 'revogr-viewport-scroll',\n styleUrl: 'revogr-viewport-scroll-style.scss',\n})\nexport class RevogrViewportScroll implements ElementScroll {\n /**\n * Enable row header\n */\n @Prop() readonly rowHeader: boolean;\n\n /**\n * Width of inner content\n */\n @Prop() contentWidth = 0;\n /**\n * Height of inner content\n */\n @Prop() contentHeight = 0;\n\n @Prop() colType!: DimensionCols | 'rowHeaders';\n\n /**\n * Before scroll event\n */\n @Event({ eventName: 'scrollviewport', bubbles: true })\n scrollViewport: EventEmitter<ViewPortScrollEvent>;\n /**\n * Viewport resize\n */\n @Event({ eventName: 'resizeviewport' })\n resizeViewport: EventEmitter<ViewPortResizeEvent>;\n\n /**\n * Triggered on scroll change, can be used to get information about scroll visibility\n */\n @Event() scrollchange: EventEmitter<{\n type: DimensionType;\n hasScroll: boolean;\n }>;\n\n /**\n * Silently scroll to coordinate\n * Made to align negative coordinates for mobile devices\n */\n @Event({ eventName: 'scrollviewportsilent' })\n silentScroll: EventEmitter<ViewPortScrollEvent>;\n\n @Element() horizontalScroll: HTMLElement;\n\n private verticalScroll?: HTMLElement;\n private header?: HTMLElement;\n private footer?: HTMLElement;\n\n /**\n * Static functions to bind wheel change\n */\n private horizontalMouseWheel: (e: Partial<LocalScrollEvent>) => void;\n private verticalMouseWheel: (e: Partial<LocalScrollEvent>) => void;\n\n private resizeService?: GridResizeService;\n private localScrollService: LocalScrollService;\n private localScrollTimer: LocalScrollTimer;\n\n @Method() async setScroll(e: ViewPortScrollEvent) {\n this.localScrollTimer.latestScrollUpdate(e.dimension);\n this.localScrollService?.setScroll(e);\n }\n\n /**\n * update on delta in case we don't know existing position or external change\n * @param e\n */\n @Method() async changeScroll(e: ViewPortScrollEvent, silent = false) {\n if (silent) {\n if (e.coordinate && this.verticalScroll) {\n switch (e.dimension) {\n // for mobile devices to skip negative scroll loop. only on vertical scroll\n case 'rgRow':\n this.verticalScroll.style.transform = `translateY(${-1 * e.coordinate}px)`;\n break;\n }\n }\n return;\n }\n if (e.delta) {\n switch (e.dimension) {\n case 'rgCol':\n e.coordinate = this.horizontalScroll.scrollLeft + e.delta;\n break;\n case 'rgRow':\n e.coordinate = (this.verticalScroll?.scrollTop ?? 0) + e.delta;\n break;\n }\n this.setScroll(e);\n }\n return e;\n }\n\n /**\n * Dispatch this event to trigger vertical mouse wheel from plugins\n */\n @Listen('mousewheel-vertical') mousewheelVertical({\n detail: e,\n }: CustomEvent<LocalScrollEvent>) {\n this.verticalMouseWheel(e);\n }\n /**\n * Dispatch this event to trigger horizontal mouse wheel from plugins\n */\n @Listen('mousewheel-horizontal') mousewheelHorizontal({\n detail: e,\n }: CustomEvent<LocalScrollEvent>) {\n this.horizontalMouseWheel(e);\n }\n /**\n * Allows to use outside listener\n */\n @Listen('scroll-coordinate') scrollApply({\n detail: { type, coordinate },\n }: CustomEvent<ScrollCoordinateEvent>) {\n this.applyOnScroll(type, coordinate, true);\n }\n\n connectedCallback() {\n /**\n * Bind scroll functions for farther usage\n */\n // allow mousewheel for all devices including mobile\n this.verticalMouseWheel = this.onVerticalMouseWheel.bind(\n this,\n 'rgRow',\n 'deltaY',\n );\n this.horizontalMouseWheel = this.onHorizontalMouseWheel.bind(\n this,\n 'rgCol',\n 'deltaX',\n );\n this.localScrollTimer = new LocalScrollTimer(\n 'ontouchstart' in document.documentElement ? 0 : 10,\n );\n /**\n * Create local scroll service\n */\n this.localScrollService = new LocalScrollService({\n // to improve safari smoothnes on scroll\n // skipAnimationFrame: isSafariDesktop(),\n runScroll: e => this.scrollViewport.emit(e),\n applyScroll: e => {\n this.localScrollTimer.setCoordinate(e);\n switch (e.dimension) {\n case 'rgCol':\n // this will trigger on scroll event\n this.horizontalScroll.scrollLeft = e.coordinate;\n break;\n case 'rgRow':\n if (this.verticalScroll) {\n // this will trigger on scroll event\n this.verticalScroll.scrollTop = e.coordinate;\n // for mobile devices to skip negative scroll loop. only on vertical scroll\n if (this.verticalScroll.style.transform) {\n this.verticalScroll.style.transform = '';\n }\n }\n break;\n }\n },\n });\n }\n\n componentDidLoad() {\n // track horizontal viewport resize\n this.resizeService = new GridResizeService(\n this.horizontalScroll,\n (entry, previousSize) => {\n const els: Partial<\n Record<\n DimensionType,\n {\n size: number;\n contentSize: number;\n scroll: number;\n noScroll: boolean;\n }\n >\n > = {};\n\n let calculatedHeight = 0;\n if (entry.height !== previousSize.height) {\n calculatedHeight = entry.height || 0;\n if (calculatedHeight) {\n calculatedHeight -=\n (this.header?.clientHeight ?? 0) +\n (this.footer?.clientHeight ?? 0);\n }\n\n els.rgRow = {\n size: calculatedHeight,\n contentSize: this.contentHeight,\n scroll: this.verticalScroll?.scrollTop ?? 0,\n noScroll: false,\n };\n }\n let calculatedWidth = 0;\n if (entry.width !== previousSize.width) {\n calculatedWidth = entry.width || 0;\n els.rgCol = {\n size: calculatedWidth,\n contentSize: this.contentWidth,\n scroll: this.horizontalScroll.scrollLeft,\n noScroll: this.colType !== 'rgCol',\n };\n }\n\n // Process changes in order: width first, then height\n const dimensions: DimensionType[] = ['rgCol', 'rgRow'];\n for (const dimension of dimensions) {\n const item = els[dimension];\n if (!item) continue;\n this.resizeViewport.emit({\n dimension,\n size: item.size,\n rowHeader: this.rowHeader,\n });\n if (item.noScroll) {\n continue;\n }\n this.localScrollService?.scroll(item.scroll ?? 0, dimension, true);\n // track scroll visibility on outer element change\n this.setScrollVisibility(dimension, item.size, item.contentSize);\n }\n },\n );\n }\n\n /**\n * Check if scroll present or not per type\n * Trigger this method on inner content size change or on outer element size change\n * If inner content bigger then outer size then scroll is present and mousewheel binding required\n * @param type - dimension type 'rgRow/y' or 'rgCol/x'\n * @param size - outer content size\n * @param innerContentSize - inner content size\n */\n setScrollVisibility(\n type: DimensionType,\n size: number,\n innerContentSize: number,\n ) {\n // test if scroll present\n const hasScroll = size < innerContentSize;\n let el: HTMLElement | undefined;\n // event reference for binding\n switch (type) {\n case 'rgCol':\n el = this.horizontalScroll;\n break;\n case 'rgRow':\n el = this.verticalScroll;\n break;\n }\n // based on scroll visibility assign or remove class and event\n if (hasScroll) {\n el?.classList.add(`scroll-${type}`);\n } else {\n el?.classList.remove(`scroll-${type}`);\n }\n this.scrollchange.emit({ type, hasScroll });\n }\n\n disconnectedCallback() {\n this.resizeService?.destroy();\n }\n\n async componentDidRender() {\n this.localScrollService.setParams(\n {\n contentSize: this.contentHeight,\n clientSize: this.verticalScroll?.clientHeight ?? 0,\n virtualSize: 0,\n },\n 'rgRow',\n );\n\n this.localScrollService.setParams(\n {\n contentSize: this.contentWidth,\n clientSize: this.horizontalScroll.clientWidth,\n virtualSize: 0,\n },\n 'rgCol',\n );\n this.setScrollVisibility(\n 'rgRow',\n this.verticalScroll?.clientHeight ?? 0,\n this.contentHeight,\n );\n this.setScrollVisibility(\n 'rgCol',\n this.horizontalScroll.clientWidth,\n this.contentWidth,\n );\n }\n\n render() {\n return (\n <Host\n onWheel={this.horizontalMouseWheel}\n onScroll={(e: UIEvent) => this.applyScroll('rgCol', e)}\n >\n <div\n class=\"inner-content-table\"\n style={{ width: `${this.contentWidth}px` }}\n >\n <div class=\"header-wrapper\" ref={e => (this.header = e)}>\n <slot name={HEADER_SLOT} />\n </div>\n <div\n class=\"vertical-inner\"\n ref={el => (this.verticalScroll = el)}\n onWheel={this.verticalMouseWheel}\n onScroll={(e: MouseEvent) => this.applyScroll('rgRow', e)}\n >\n <div\n class=\"content-wrapper\"\n style={{ height: `${this.contentHeight}px` }}\n >\n <slot name={CONTENT_SLOT} />\n </div>\n </div>\n <div class=\"footer-wrapper\" ref={e => (this.footer = e)}>\n <slot name={FOOTER_SLOT} />\n </div>\n </div>\n </Host>\n );\n }\n /**\n * Extra layer for scroll event monitoring, where MouseWheel event is not passing\n * We need to trigger scroll event in case there is no mousewheel event\n */\n @Method() async applyScroll(type: DimensionType, e: UIEvent) {\n if (!(e.target instanceof HTMLElement)) {\n return;\n }\n let scroll = 0;\n switch (type) {\n case 'rgCol':\n scroll = e.target.scrollLeft;\n break;\n case 'rgRow':\n scroll = e.target.scrollTop;\n break;\n }\n\n // for mobile devices to skip negative scroll loop\n if (scroll < 0) {\n this.silentScroll.emit({ dimension: type, coordinate: scroll });\n return;\n }\n this.applyOnScroll(type, scroll);\n }\n\n /**\n * Applies change on scroll event only if mousewheel event happened some time ago\n */\n private applyOnScroll(\n type: DimensionType,\n coordinate: number,\n outside = false,\n ) {\n const lastScrollUpdate = () => {\n this.localScrollService?.scroll(\n coordinate,\n type,\n undefined,\n undefined,\n outside,\n );\n };\n // apply after throttling\n if (this.localScrollTimer.isReady(type, coordinate)) {\n lastScrollUpdate();\n } else {\n this.localScrollTimer.throttleLastScrollUpdate(type, coordinate, () => lastScrollUpdate());\n }\n }\n\n /**\n * On vertical mousewheel event\n * @param type\n * @param delta\n * @param e\n */\n private onVerticalMouseWheel(\n type: DimensionType,\n delta: Delta,\n e: LocalScrollEvent,\n ) {\n const scrollTop = this.verticalScroll?.scrollTop ?? 0;\n const clientHeight = this.verticalScroll?.clientHeight ?? 0;\n const scrollHeight = this.verticalScroll?.scrollHeight ?? 0;\n\n // Detect if the user has reached the bottom\n const atBottom = scrollTop + clientHeight >= scrollHeight && e.deltaY > 0;\n const atTop = scrollTop === 0 && e.deltaY < 0;\n if (!atBottom && !atTop) {\n e.preventDefault?.();\n }\n const pos = scrollTop + e[delta];\n this.localScrollService?.scroll(pos, type, undefined, e[delta]);\n this.localScrollTimer.latestScrollUpdate(type);\n }\n\n /**\n * On horizontal mousewheel event\n * @param type\n * @param delta\n * @param e\n */\n private onHorizontalMouseWheel(\n type: DimensionType,\n delta: Delta,\n e: LocalScrollEvent,\n ) {\n if (!e.deltaX) {\n return;\n }\n const { scrollLeft, scrollWidth, clientWidth } = this.horizontalScroll;\n\n // Detect if the user has reached the right end\n const atRight = scrollLeft + clientWidth >= scrollWidth && e.deltaX > 0;\n\n // Detect if the user has reached the left end\n const atLeft = scrollLeft === 0 && e.deltaX < 0;\n if (!atRight && !atLeft) {\n e.preventDefault?.();\n }\n const pos = scrollLeft + e[delta];\n this.localScrollService?.scroll(pos, type, undefined, e[delta]);\n this.localScrollTimer.latestScrollUpdate(type);\n }\n}\n"],"version":3}
@@ -1 +0,0 @@
1
- {"file":"throttle-250327e5.js","mappings":"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","names":["scaleValue","isObject","debounce"],"sources":["src/services/local.scroll.service.ts","src/services/local.scroll.timer.ts","node_modules/lodash/throttle.js"],"sourcesContent":["import type { DimensionType, ViewPortScrollEvent } from '@type';\nimport { scaleValue } from '../utils';\n\ninterface Config {\n skipAnimationFrame?: boolean;\n // scroll event inited and direction cached\n // scrollingService.proxyScroll get tiggered\n // setScroll event called from scrollingService\n runScroll(e: ViewPortScrollEvent): void;\n // all operation finished, apply scroll values\n applyScroll(e: ViewPortScrollEvent): void;\n}\n\ntype Params = {\n contentSize: number;\n virtualContentSize?: number;\n clientSize: number;\n virtualSize: number;\n maxSize?: number;\n};\n\nconst initialParams: Params = {\n contentSize: 0,\n clientSize: 0,\n virtualSize: 0,\n maxSize: 0,\n};\nconst NO_COORDINATE = -1;\n\n/**\n * Based on content size, client size and virtual size\n * return full size\n */\nexport function getContentSize(\n contentSize: number,\n clientSize: number,\n virtualSize = 0,\n): number {\n if (virtualSize > contentSize) {\n return 0;\n }\n return contentSize + (virtualSize ? clientSize - virtualSize : 0);\n}\n\nexport default class LocalScrollService {\n private preventArtificialScroll: Record<DimensionType, (() => void) | null> = {\n rgRow: null,\n rgCol: null,\n };\n // to check if scroll changed\n private previousScroll: Record<DimensionType, number> = {\n rgRow: NO_COORDINATE,\n rgCol: NO_COORDINATE,\n };\n private params: Record<DimensionType, Params> = {\n rgRow: { ...initialParams },\n rgCol: { ...initialParams },\n };\n\n constructor(private cfg: Config) {}\n\n setParams(params: Params, dimension: DimensionType) {\n const virtualContentSize = getContentSize(\n params.contentSize,\n params.clientSize,\n params.virtualSize,\n );\n this.params[dimension] = {\n ...params,\n maxSize: virtualContentSize - params.clientSize,\n virtualContentSize,\n };\n }\n\n // apply scroll values after scroll done\n async setScroll(e: ViewPortScrollEvent) {\n this.cancelScroll(e.dimension);\n\n // start frame animation\n const frameAnimation = new Promise<void>((resolve, reject) => {\n // for example safari desktop has issues with animation frame\n if (this.cfg.skipAnimationFrame) {\n return resolve();\n }\n const animationId = window.requestAnimationFrame(() => {\n resolve();\n });\n this.preventArtificialScroll[e.dimension] = reject.bind(\n null,\n animationId,\n );\n });\n\n try {\n await frameAnimation;\n const params = this.getParams(e.dimension);\n e.coordinate = Math.ceil(e.coordinate);\n this.previousScroll[e.dimension] = this.wrapCoordinate(\n e.coordinate,\n params,\n );\n this.preventArtificialScroll[e.dimension] = null;\n this.cfg.applyScroll({\n ...e,\n coordinate: params.virtualSize\n ? this.convert(e.coordinate, params, false)\n : e.coordinate,\n });\n } catch (id) {\n window.cancelAnimationFrame(id);\n }\n }\n\n /**\n * On scroll event started\n */\n scroll(\n coordinate: number,\n dimension: DimensionType,\n force = false,\n delta?: number,\n outside = false,\n ) {\n // cancel all previous scrolls for same dimension\n this.cancelScroll(dimension);\n\n // drop if no change\n if (!force && this.previousScroll[dimension] === coordinate) {\n this.previousScroll[dimension] = NO_COORDINATE;\n return;\n }\n\n const param = this.getParams(dimension);\n // let component know about scroll event started\n this.cfg.runScroll({\n dimension: dimension,\n coordinate: param.virtualSize\n ? this.convert(coordinate, param)\n : coordinate,\n delta,\n outside,\n });\n }\n\n private getParams(dimension: DimensionType): Params {\n return this.params[dimension];\n }\n\n // check if scroll outside of region to avoid looping\n private wrapCoordinate(c: number, param: Params): number {\n if (c < 0) {\n return NO_COORDINATE;\n }\n\n if (typeof param.maxSize === 'number' && c > param.maxSize) {\n return param.maxSize;\n }\n return c;\n }\n\n // prevent already started scroll, performance optimization\n private cancelScroll(dimension: DimensionType) {\n this.preventArtificialScroll[dimension]?.();\n this.preventArtificialScroll[dimension] = null;\n }\n\n /* convert virtual to real and back, scale range */\n private convert(pos: number, param: Params, toReal = true): number {\n const minRange = param.clientSize;\n const from: [number, number] = [0, (param.virtualContentSize ?? minRange) - minRange];\n const to: [number, number] = [0, param.contentSize - param.virtualSize];\n if (toReal) {\n return scaleValue(pos, from, to);\n }\n return scaleValue(pos, to, from);\n }\n}\n","import type { DimensionType } from '@type';\n/**\n * Apply changes only if mousewheel event happened some time ago (scrollThrottling)\n */\nexport class LocalScrollTimer {\n /**\n * Last mw event time for trigger scroll function below\n * If mousewheel function was ignored we still need to trigger render\n */\n private mouseWheelScrollTimestamp: Record<DimensionType, number> = {\n rgCol: 0,\n rgRow: 0,\n };\n private lastKnownScrollCoordinate: Record<DimensionType, number> = {\n rgCol: 0,\n rgRow: 0,\n };\n\n constructor(private scrollThrottling = 10) {}\n\n setCoordinate(e: { dimension: DimensionType; coordinate: number }) {\n this.lastKnownScrollCoordinate[e.dimension] = e.coordinate;\n }\n\n /**\n * Remember last mw event time\n */\n latestScrollUpdate(dimension: DimensionType) {\n this.mouseWheelScrollTimestamp[dimension] = new Date().getTime();\n }\n\n /**\n * Check if scroll is ready to accept new value\n */\n isReady(type: DimensionType, coordinate: number) {\n const change = new Date().getTime() - this.mouseWheelScrollTimestamp[type];\n // apply after throttling\n return (\n change > this.scrollThrottling &&\n coordinate !== this.lastKnownScrollCoordinate[type]\n );\n }\n}\n","import debounce from './debounce.js';\nimport isObject from './isObject.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n}\n\nexport default throttle;\n"],"version":3}
@@ -1 +0,0 @@
1
- {"file":"throttle-9dcf4e1f.js","mappings":"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","names":[],"sources":["src/services/local.scroll.service.ts","src/services/local.scroll.timer.ts","node_modules/lodash/throttle.js"],"sourcesContent":["import type { DimensionType, ViewPortScrollEvent } from '@type';\nimport { scaleValue } from '../utils';\n\ninterface Config {\n skipAnimationFrame?: boolean;\n // scroll event inited and direction cached\n // scrollingService.proxyScroll get tiggered\n // setScroll event called from scrollingService\n runScroll(e: ViewPortScrollEvent): void;\n // all operation finished, apply scroll values\n applyScroll(e: ViewPortScrollEvent): void;\n}\n\ntype Params = {\n contentSize: number;\n virtualContentSize?: number;\n clientSize: number;\n virtualSize: number;\n maxSize?: number;\n};\n\nconst initialParams: Params = {\n contentSize: 0,\n clientSize: 0,\n virtualSize: 0,\n maxSize: 0,\n};\nconst NO_COORDINATE = -1;\n\n/**\n * Based on content size, client size and virtual size\n * return full size\n */\nexport function getContentSize(\n contentSize: number,\n clientSize: number,\n virtualSize = 0,\n): number {\n if (virtualSize > contentSize) {\n return 0;\n }\n return contentSize + (virtualSize ? clientSize - virtualSize : 0);\n}\n\nexport default class LocalScrollService {\n private preventArtificialScroll: Record<DimensionType, (() => void) | null> = {\n rgRow: null,\n rgCol: null,\n };\n // to check if scroll changed\n private previousScroll: Record<DimensionType, number> = {\n rgRow: NO_COORDINATE,\n rgCol: NO_COORDINATE,\n };\n private params: Record<DimensionType, Params> = {\n rgRow: { ...initialParams },\n rgCol: { ...initialParams },\n };\n\n constructor(private cfg: Config) {}\n\n setParams(params: Params, dimension: DimensionType) {\n const virtualContentSize = getContentSize(\n params.contentSize,\n params.clientSize,\n params.virtualSize,\n );\n this.params[dimension] = {\n ...params,\n maxSize: virtualContentSize - params.clientSize,\n virtualContentSize,\n };\n }\n\n // apply scroll values after scroll done\n async setScroll(e: ViewPortScrollEvent) {\n this.cancelScroll(e.dimension);\n\n // start frame animation\n const frameAnimation = new Promise<void>((resolve, reject) => {\n // for example safari desktop has issues with animation frame\n if (this.cfg.skipAnimationFrame) {\n return resolve();\n }\n const animationId = window.requestAnimationFrame(() => {\n resolve();\n });\n this.preventArtificialScroll[e.dimension] = reject.bind(\n null,\n animationId,\n );\n });\n\n try {\n await frameAnimation;\n const params = this.getParams(e.dimension);\n e.coordinate = Math.ceil(e.coordinate);\n this.previousScroll[e.dimension] = this.wrapCoordinate(\n e.coordinate,\n params,\n );\n this.preventArtificialScroll[e.dimension] = null;\n this.cfg.applyScroll({\n ...e,\n coordinate: params.virtualSize\n ? this.convert(e.coordinate, params, false)\n : e.coordinate,\n });\n } catch (id) {\n window.cancelAnimationFrame(id);\n }\n }\n\n /**\n * On scroll event started\n */\n scroll(\n coordinate: number,\n dimension: DimensionType,\n force = false,\n delta?: number,\n outside = false,\n ) {\n // cancel all previous scrolls for same dimension\n this.cancelScroll(dimension);\n\n // drop if no change\n if (!force && this.previousScroll[dimension] === coordinate) {\n this.previousScroll[dimension] = NO_COORDINATE;\n return;\n }\n\n const param = this.getParams(dimension);\n // let component know about scroll event started\n this.cfg.runScroll({\n dimension: dimension,\n coordinate: param.virtualSize\n ? this.convert(coordinate, param)\n : coordinate,\n delta,\n outside,\n });\n }\n\n private getParams(dimension: DimensionType): Params {\n return this.params[dimension];\n }\n\n // check if scroll outside of region to avoid looping\n private wrapCoordinate(c: number, param: Params): number {\n if (c < 0) {\n return NO_COORDINATE;\n }\n\n if (typeof param.maxSize === 'number' && c > param.maxSize) {\n return param.maxSize;\n }\n return c;\n }\n\n // prevent already started scroll, performance optimization\n private cancelScroll(dimension: DimensionType) {\n this.preventArtificialScroll[dimension]?.();\n this.preventArtificialScroll[dimension] = null;\n }\n\n /* convert virtual to real and back, scale range */\n private convert(pos: number, param: Params, toReal = true): number {\n const minRange = param.clientSize;\n const from: [number, number] = [0, (param.virtualContentSize ?? minRange) - minRange];\n const to: [number, number] = [0, param.contentSize - param.virtualSize];\n if (toReal) {\n return scaleValue(pos, from, to);\n }\n return scaleValue(pos, to, from);\n }\n}\n","import type { DimensionType } from '@type';\n/**\n * Apply changes only if mousewheel event happened some time ago (scrollThrottling)\n */\nexport class LocalScrollTimer {\n /**\n * Last mw event time for trigger scroll function below\n * If mousewheel function was ignored we still need to trigger render\n */\n private mouseWheelScrollTimestamp: Record<DimensionType, number> = {\n rgCol: 0,\n rgRow: 0,\n };\n private lastKnownScrollCoordinate: Record<DimensionType, number> = {\n rgCol: 0,\n rgRow: 0,\n };\n\n constructor(private scrollThrottling = 10) {}\n\n setCoordinate(e: { dimension: DimensionType; coordinate: number }) {\n this.lastKnownScrollCoordinate[e.dimension] = e.coordinate;\n }\n\n /**\n * Remember last mw event time\n */\n latestScrollUpdate(dimension: DimensionType) {\n this.mouseWheelScrollTimestamp[dimension] = new Date().getTime();\n }\n\n /**\n * Check if scroll is ready to accept new value\n */\n isReady(type: DimensionType, coordinate: number) {\n const change = new Date().getTime() - this.mouseWheelScrollTimestamp[type];\n // apply after throttling\n return (\n change > this.scrollThrottling &&\n coordinate !== this.lastKnownScrollCoordinate[type]\n );\n }\n}\n","import debounce from './debounce.js';\nimport isObject from './isObject.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n}\n\nexport default throttle;\n"],"version":3}
@@ -1 +0,0 @@
1
- {"file":"throttle-9dcf4e1f.js","mappings":"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","names":[],"sources":["src/services/local.scroll.service.ts","src/services/local.scroll.timer.ts","node_modules/lodash/throttle.js"],"sourcesContent":["import type { DimensionType, ViewPortScrollEvent } from '@type';\nimport { scaleValue } from '../utils';\n\ninterface Config {\n skipAnimationFrame?: boolean;\n // scroll event inited and direction cached\n // scrollingService.proxyScroll get tiggered\n // setScroll event called from scrollingService\n runScroll(e: ViewPortScrollEvent): void;\n // all operation finished, apply scroll values\n applyScroll(e: ViewPortScrollEvent): void;\n}\n\ntype Params = {\n contentSize: number;\n virtualContentSize?: number;\n clientSize: number;\n virtualSize: number;\n maxSize?: number;\n};\n\nconst initialParams: Params = {\n contentSize: 0,\n clientSize: 0,\n virtualSize: 0,\n maxSize: 0,\n};\nconst NO_COORDINATE = -1;\n\n/**\n * Based on content size, client size and virtual size\n * return full size\n */\nexport function getContentSize(\n contentSize: number,\n clientSize: number,\n virtualSize = 0,\n): number {\n if (virtualSize > contentSize) {\n return 0;\n }\n return contentSize + (virtualSize ? clientSize - virtualSize : 0);\n}\n\nexport default class LocalScrollService {\n private preventArtificialScroll: Record<DimensionType, (() => void) | null> = {\n rgRow: null,\n rgCol: null,\n };\n // to check if scroll changed\n private previousScroll: Record<DimensionType, number> = {\n rgRow: NO_COORDINATE,\n rgCol: NO_COORDINATE,\n };\n private params: Record<DimensionType, Params> = {\n rgRow: { ...initialParams },\n rgCol: { ...initialParams },\n };\n\n constructor(private cfg: Config) {}\n\n setParams(params: Params, dimension: DimensionType) {\n const virtualContentSize = getContentSize(\n params.contentSize,\n params.clientSize,\n params.virtualSize,\n );\n this.params[dimension] = {\n ...params,\n maxSize: virtualContentSize - params.clientSize,\n virtualContentSize,\n };\n }\n\n // apply scroll values after scroll done\n async setScroll(e: ViewPortScrollEvent) {\n this.cancelScroll(e.dimension);\n\n // start frame animation\n const frameAnimation = new Promise<void>((resolve, reject) => {\n // for example safari desktop has issues with animation frame\n if (this.cfg.skipAnimationFrame) {\n return resolve();\n }\n const animationId = window.requestAnimationFrame(() => {\n resolve();\n });\n this.preventArtificialScroll[e.dimension] = reject.bind(\n null,\n animationId,\n );\n });\n\n try {\n await frameAnimation;\n const params = this.getParams(e.dimension);\n e.coordinate = Math.ceil(e.coordinate);\n this.previousScroll[e.dimension] = this.wrapCoordinate(\n e.coordinate,\n params,\n );\n this.preventArtificialScroll[e.dimension] = null;\n this.cfg.applyScroll({\n ...e,\n coordinate: params.virtualSize\n ? this.convert(e.coordinate, params, false)\n : e.coordinate,\n });\n } catch (id) {\n window.cancelAnimationFrame(id);\n }\n }\n\n /**\n * On scroll event started\n */\n scroll(\n coordinate: number,\n dimension: DimensionType,\n force = false,\n delta?: number,\n outside = false,\n ) {\n // cancel all previous scrolls for same dimension\n this.cancelScroll(dimension);\n\n // drop if no change\n if (!force && this.previousScroll[dimension] === coordinate) {\n this.previousScroll[dimension] = NO_COORDINATE;\n return;\n }\n\n const param = this.getParams(dimension);\n // let component know about scroll event started\n this.cfg.runScroll({\n dimension: dimension,\n coordinate: param.virtualSize\n ? this.convert(coordinate, param)\n : coordinate,\n delta,\n outside,\n });\n }\n\n private getParams(dimension: DimensionType): Params {\n return this.params[dimension];\n }\n\n // check if scroll outside of region to avoid looping\n private wrapCoordinate(c: number, param: Params): number {\n if (c < 0) {\n return NO_COORDINATE;\n }\n\n if (typeof param.maxSize === 'number' && c > param.maxSize) {\n return param.maxSize;\n }\n return c;\n }\n\n // prevent already started scroll, performance optimization\n private cancelScroll(dimension: DimensionType) {\n this.preventArtificialScroll[dimension]?.();\n this.preventArtificialScroll[dimension] = null;\n }\n\n /* convert virtual to real and back, scale range */\n private convert(pos: number, param: Params, toReal = true): number {\n const minRange = param.clientSize;\n const from: [number, number] = [0, (param.virtualContentSize ?? minRange) - minRange];\n const to: [number, number] = [0, param.contentSize - param.virtualSize];\n if (toReal) {\n return scaleValue(pos, from, to);\n }\n return scaleValue(pos, to, from);\n }\n}\n","import type { DimensionType } from '@type';\n/**\n * Apply changes only if mousewheel event happened some time ago (scrollThrottling)\n */\nexport class LocalScrollTimer {\n /**\n * Last mw event time for trigger scroll function below\n * If mousewheel function was ignored we still need to trigger render\n */\n private mouseWheelScrollTimestamp: Record<DimensionType, number> = {\n rgCol: 0,\n rgRow: 0,\n };\n private lastKnownScrollCoordinate: Record<DimensionType, number> = {\n rgCol: 0,\n rgRow: 0,\n };\n\n constructor(private scrollThrottling = 10) {}\n\n setCoordinate(e: { dimension: DimensionType; coordinate: number }) {\n this.lastKnownScrollCoordinate[e.dimension] = e.coordinate;\n }\n\n /**\n * Remember last mw event time\n */\n latestScrollUpdate(dimension: DimensionType) {\n this.mouseWheelScrollTimestamp[dimension] = new Date().getTime();\n }\n\n /**\n * Check if scroll is ready to accept new value\n */\n isReady(type: DimensionType, coordinate: number) {\n const change = new Date().getTime() - this.mouseWheelScrollTimestamp[type];\n // apply after throttling\n return (\n change > this.scrollThrottling &&\n coordinate !== this.lastKnownScrollCoordinate[type]\n );\n }\n}\n","import debounce from './debounce.js';\nimport isObject from './isObject.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n}\n\nexport default throttle;\n"],"version":3}