@ceriousdevtech/vue-cerious-scroll 1.0.6 → 1.0.7

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/CHANGELOG.md CHANGED
@@ -5,6 +5,14 @@ All notable changes to vue-cerious-scroll will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.0.7] - 2026-06-24
9
+
10
+ ### Fixed
11
+ - **`provide()` values from the component using `<CeriousScroll>` now reach `inject()` inside rows** ([#1](https://github.com/ceriousdevtech/vue-cerious-scroll/issues/1)). Rows (and the table header) are rendered as detached vnode trees via Vue's `render()`, so injection resolved only against the app context's `provides` — app-level/plugin provides worked, but local `provide()` on the owning component did not. The wrapper now renders rows with the owning component instance's `provides` (which prototype-chains to the app provides), so component-level, plugin, and app-level provide/inject all work inside virtualized rows. When the owner provides nothing, behavior is unchanged.
12
+
13
+ ### Changed
14
+ - Updated the core engine dependency to `@ceriousdevtech/cerious-scroll@^1.0.8` (native-scrollbar drag rendering is now coalesced to one render per frame, with no per-row layout thrash on fast drags).
15
+
8
16
  ## [1.0.6] - 2026-06-11
9
17
 
10
18
  ### Changed
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("vue"),N=require("@ceriousdevtech/cerious-scroll"),M="data-cerious-scroll-content",q="data-cerious-scroll-row";function L(e){const u=e.querySelector(`[${M}]`);if(u)return u;const o=document.createElement("div");return o.setAttribute(M,""),o.style.position="relative",o.style.width="100%",o.style.height="100%",o.style.overflowY="clip",o.style.overflowX="auto",e.appendChild(o),o}function B(e,u){const o=l=>{const n=l.detail;n&&u({percentage:n.percentage,currentElement:n.currentElement,scrollOffset:n.scrollOffset,result:{element:n.result.element,offset:n.result.offset}})},g=l=>{const n=l.detail;n&&u({percentage:n.percentage,currentElement:n.element,scrollOffset:n.scrollOffset,result:{element:n.element,offset:n.scrollOffset}})};return e.addEventListener("cerious-viewport-change",o),e.addEventListener("viewport-change",g),()=>{e.removeEventListener("cerious-viewport-change",o),e.removeEventListener("viewport-change",g)}}function j(e,u){const o=typeof e=="number"?e:typeof u=="number"?u:void 0;if(o===void 0||Number.isNaN(o))throw new Error("useCeriousScroll: provide `totalElements` or `items`.");return Math.max(1,Math.floor(o))}function P(e){var I,A;const u=(I=r.getCurrentInstance())==null?void 0:I.appContext,o=r.ref(null),g=r.shallowRef(null);let l=null;const n=new Map;let s=null;const b=((A=e.options)==null?void 0:A.layout)==="table";let d=null;const H=t=>{if(!e.renderHeader)return;d==null||d();const c=u??null,a=r.effectScope(!0);a.run(()=>r.watchEffect(()=>{const f=e.renderHeader(),m=Array.isArray(f)?f:[f];for(const i of m)r.isVNode(i)&&(i.appContext=c);const h=r.h(r.Fragment,m);h.appContext=c,r.render(h,t)},{flush:"sync"})),d=()=>a.stop()},R=()=>r.toValue(e.autoRender)??!0,x=t=>{if(e.getItem)return e.getItem(t);const c=r.toValue(e.items);return c?c[t]:void 0},F=(t,c)=>{const a=u??null,f=r.effectScope(!0);return f.run(()=>r.watchEffect(()=>{const m=e.renderItem(x(t),t),h=Array.isArray(m)?m:[m];for(const p of h)r.isVNode(p)&&(p.appContext=a);const i=r.h(r.Fragment,h);i.appContext=a,r.render(i,c)},{flush:"sync"})),()=>f.stop()},T=t=>{t.stop(),r.render(null,t.mount),t.mount.remove()},y=()=>{var p;if(!l)return null;const{scroller:t,contentEl:c,container:a}=l,f=a.clientHeight||a.offsetHeight||0,m=(v,E)=>{const w=document.createElement("div");b&&(w.style.display="contents"),w.setAttribute(q,String(v)),E.appendChild(w);const C=F(v,w);n.set(v,{el:E,mount:w,stop:C})},h=t.renderViewport(f,c,m),i=new Set(t.getRenderedIndices());return n.forEach((v,E)=>{i.has(E)||(T(v),n.delete(E))}),(p=e.onMeasuredViewport)==null||p.call(e,h),h},V=t=>{if(!l)return;const c=l;l=null,c.unsubscribe(),t&&(s={currentElement:c.scroller.currentElement,scrollOffset:c.scroller.scrollOffset}),n.forEach(a=>T(a)),n.clear(),d==null||d(),d=null,c.contentEl.textContent="",c.scroller.detachScrollbar(c.container),c.scroller.dispose(),g.value=null},O=t=>{var v,E,w;const c=L(t),a=e.options??{},f=a.onScroll,m={...a,onScroll:()=>{f==null||f(),R()&&y()}};if(b&&e.renderHeader){const C=(v=a.table)==null?void 0:v.header;m.table={...a.table,header:S=>{C==null||C(S),H(S)}}}const h=j(r.toValue(e.totalElements),((E=r.toValue(e.items))==null?void 0:E.length)??null),i=new N.CeriousScroll(t,h,m);s&&(i.currentElement=Math.min(s.currentElement,h-1),i.scrollOffset=s.scrollOffset,s=null);const p=B(t,C=>{var S;(S=e.onViewportChange)==null||S.call(e,C)});l={scroller:i,contentEl:c,container:t,unsubscribe:p},g.value=i,(w=e.onReady)==null||w.call(e,i),R()&&requestAnimationFrame(()=>y())},_=()=>{V(!0);const t=o.value;t&&O(t)};return r.onMounted(()=>{const t=o.value;t&&O(t)}),r.onBeforeUnmount(()=>{V(!1)}),r.watch(()=>[r.toValue(e.totalElements),r.toValue(e.items)],()=>{var c;if(!l)return;const t=j(r.toValue(e.totalElements),((c=r.toValue(e.items))==null?void 0:c.length)??null);l.scroller.totalElements!==t&&_()}),{containerRef:o,scroller:g,render:y,jumpToElement:t=>l?(l.scroller.jumpToElement(t),y()):null,scrollToPercentage:t=>l?(l.scroller.handleScrollPercentage(t),y()):null,reset:()=>l?(l.scroller.reset(),y()):null,recalculate:()=>l?(l.scroller.clearAllCaches(),y()):null}}const U=r.defineComponent({name:"CeriousScroll",props:{totalElements:{type:Number,default:null},items:{type:Array,default:null},getItem:{type:Function,default:void 0},renderItem:{type:Function,default:void 0},options:{type:Object,default:void 0},autoRender:{type:Boolean,default:!0}},emits:{"viewport-change":e=>!0,"measured-viewport":e=>!0,ready:e=>!0},setup(e,{slots:u,emit:o,expose:g}){const l=(s,b)=>{var d;return e.renderItem?e.renderItem(s,b):(d=u.item)==null?void 0:d.call(u,{item:s,index:b})},n=P({totalElements:()=>e.totalElements,items:()=>e.items,getItem:e.getItem?s=>e.getItem(s):void 0,renderItem:l,renderHeader:u.header?()=>u.header():void 0,options:e.options,autoRender:()=>e.autoRender,onViewportChange:s=>o("viewport-change",s),onMeasuredViewport:s=>o("measured-viewport",s),onReady:s=>o("ready",s)});return g({scroller:n.scroller,render:n.render,jumpToElement:n.jumpToElement,scrollToPercentage:n.scrollToPercentage,reset:n.reset,recalculate:n.recalculate}),()=>{var s;return r.h("div",{ref:n.containerRef,style:{position:"relative",overflow:"hidden"}},(s=u.default)==null?void 0:s.call(u))}}});Object.defineProperty(exports,"CeriousScrollEngine",{enumerable:!0,get:()=>N.CeriousScroll});exports.CeriousScroll=U;exports.useCeriousScroll=P;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("vue"),j=require("@ceriousdevtech/cerious-scroll"),A="data-cerious-scroll-content",_="data-cerious-scroll-row";function q(e){const l=e.querySelector(`[${A}]`);if(l)return l;const c=document.createElement("div");return c.setAttribute(A,""),c.style.position="relative",c.style.width="100%",c.style.height="100%",c.style.overflowY="clip",c.style.overflowX="auto",e.appendChild(c),c}function L(e,l){const c=m=>{const o=m.detail;o&&l({percentage:o.percentage,currentElement:o.currentElement,scrollOffset:o.scrollOffset,result:{element:o.result.element,offset:o.result.offset}})},y=m=>{const o=m.detail;o&&l({percentage:o.percentage,currentElement:o.element,scrollOffset:o.scrollOffset,result:{element:o.element,offset:o.scrollOffset}})};return e.addEventListener("cerious-viewport-change",c),e.addEventListener("viewport-change",y),()=>{e.removeEventListener("cerious-viewport-change",c),e.removeEventListener("viewport-change",y)}}function O(e,l){const c=typeof e=="number"?e:typeof l=="number"?l:void 0;if(c===void 0||Number.isNaN(c))throw new Error("useCeriousScroll: provide `totalElements` or `items`.");return Math.max(1,Math.floor(c))}function P(e){var I;const l=n.getCurrentInstance(),c=l==null?void 0:l.provides,y=l?{...l.appContext,provides:c??l.appContext.provides}:void 0,m=n.ref(null),o=n.shallowRef(null);let t=null;const v=new Map,S=((I=e.options)==null?void 0:I.layout)==="table";let g=null;const M=r=>{if(!e.renderHeader)return;g==null||g();const u=y??null,s=n.effectScope(!0);s.run(()=>n.watchEffect(()=>{const i=e.renderHeader(),a=Array.isArray(i)?i:[i];for(const d of a)n.isVNode(d)&&(d.appContext=u);const f=n.h(n.Fragment,a);f.appContext=u,n.render(f,r)},{flush:"sync"})),g=()=>s.stop()},R=()=>n.toValue(e.autoRender)??!0,N=r=>{if(e.getItem)return e.getItem(r);const u=n.toValue(e.items);return u?u[r]:void 0},x=(r,u)=>{const s=y??null,i=n.effectScope(!0);return i.run(()=>n.watchEffect(()=>{const a=e.renderItem(N(r),r),f=Array.isArray(a)?a:[a];for(const C of f)n.isVNode(C)&&(C.appContext=s);const d=n.h(n.Fragment,f);d.appContext=s,n.render(d,u)},{flush:"sync"})),()=>i.stop()},V=r=>{r.stop(),n.render(null,r.mount),r.mount.remove()},h=()=>{var C;if(!t)return null;const{scroller:r,contentEl:u,container:s}=t,i=s.clientHeight||s.offsetHeight||0,a=(p,E)=>{const w=document.createElement("div");S&&(w.style.display="contents"),w.setAttribute(_,String(p)),E.appendChild(w);const b=x(p,w);v.set(p,{el:E,mount:w,stop:b})},f=r.renderViewport(i,u,a),d=new Set(r.getRenderedIndices());return v.forEach((p,E)=>{d.has(E)||(V(p),v.delete(E))}),(C=e.onMeasuredViewport)==null||C.call(e,f),f},H=r=>{if(!t)return;const u=t;t=null,u.unsubscribe(),v.forEach(s=>V(s)),v.clear(),g==null||g(),g=null,u.contentEl.textContent="",u.scroller.detachScrollbar(u.container),u.scroller.dispose(),o.value=null},F=r=>{var p,E,w;const u=q(r),s=e.options??{},i=s.onScroll,a={...s,onScroll:()=>{i==null||i(),R()&&h()}};if(S&&e.renderHeader){const b=(p=s.table)==null?void 0:p.header;a.table={...s.table,header:T=>{b==null||b(T),M(T)}}}const f=O(n.toValue(e.totalElements),((E=n.toValue(e.items))==null?void 0:E.length)??null),d=new j.CeriousScroll(r,f,a),C=L(r,b=>{var T;(T=e.onViewportChange)==null||T.call(e,b)});t={scroller:d,contentEl:u,container:r,unsubscribe:C},o.value=d,(w=e.onReady)==null||w.call(e,d),R()&&requestAnimationFrame(()=>h())};return n.onMounted(()=>{const r=m.value;r&&F(r)}),n.onBeforeUnmount(()=>{H()}),n.watch(()=>[n.toValue(e.totalElements),n.toValue(e.items)],()=>{var u;if(!t)return;const r=O(n.toValue(e.totalElements),((u=n.toValue(e.items))==null?void 0:u.length)??null);t.scroller.totalElements!==r&&(t.scroller.updateTotalElements(r),t.scroller.currentElement>r-1&&t.scroller.jumpToElement(r-1),R()&&h(),t.scroller.syncScrollbar())}),{containerRef:m,scroller:o,render:h,jumpToElement:r=>t?(t.scroller.jumpToElement(r),h()):null,scrollToPercentage:r=>t?(t.scroller.handleScrollPercentage(r),h()):null,reset:()=>t?(t.scroller.reset(),h()):null,recalculate:()=>t?(t.scroller.clearAllCaches(),h()):null}}const B=n.defineComponent({name:"CeriousScroll",props:{totalElements:{type:Number,default:null},items:{type:Array,default:null},getItem:{type:Function,default:void 0},renderItem:{type:Function,default:void 0},options:{type:Object,default:void 0},autoRender:{type:Boolean,default:!0}},emits:{"viewport-change":e=>!0,"measured-viewport":e=>!0,ready:e=>!0},setup(e,{slots:l,emit:c,expose:y}){const m=(t,v)=>{var S;return e.renderItem?e.renderItem(t,v):(S=l.item)==null?void 0:S.call(l,{item:t,index:v})},o=P({totalElements:()=>e.totalElements,items:()=>e.items,getItem:e.getItem?t=>e.getItem(t):void 0,renderItem:m,renderHeader:l.header?()=>l.header():void 0,options:e.options,autoRender:()=>e.autoRender,onViewportChange:t=>c("viewport-change",t),onMeasuredViewport:t=>c("measured-viewport",t),onReady:t=>c("ready",t)});return y({scroller:o.scroller,render:o.render,jumpToElement:o.jumpToElement,scrollToPercentage:o.scrollToPercentage,reset:o.reset,recalculate:o.recalculate}),()=>{var t;return n.h("div",{ref:o.containerRef,style:{position:"relative",overflow:"hidden"}},(t=l.default)==null?void 0:t.call(l))}}});Object.defineProperty(exports,"CeriousScrollEngine",{enumerable:!0,get:()=>j.CeriousScroll});exports.CeriousScroll=B;exports.useCeriousScroll=P;
package/dist/index.js CHANGED
@@ -1,156 +1,145 @@
1
- import { getCurrentInstance as U, ref as W, shallowRef as X, onMounted as Y, onBeforeUnmount as z, watch as D, toValue as w, effectScope as N, watchEffect as j, isVNode as H, h as I, Fragment as P, render as T, defineComponent as G } from "vue";
2
- import { CeriousScroll as J } from "@ceriousdevtech/cerious-scroll";
3
- import { CeriousScroll as ie } from "@ceriousdevtech/cerious-scroll";
4
- const _ = "data-cerious-scroll-content", K = "data-cerious-scroll-row";
5
- function Q(e) {
6
- const c = e.querySelector(`[${_}]`);
7
- if (c) return c;
8
- const n = document.createElement("div");
9
- return n.setAttribute(_, ""), n.style.position = "relative", n.style.width = "100%", n.style.height = "100%", n.style.overflowY = "clip", n.style.overflowX = "auto", e.appendChild(n), n;
1
+ import { getCurrentInstance as B, ref as U, shallowRef as W, onMounted as X, onBeforeUnmount as Y, watch as z, toValue as w, effectScope as V, watchEffect as j, isVNode as M, h as A, Fragment as N, render as S, defineComponent as D } from "vue";
2
+ import { CeriousScroll as G } from "@ceriousdevtech/cerious-scroll";
3
+ import { CeriousScroll as ue } from "@ceriousdevtech/cerious-scroll";
4
+ const P = "data-cerious-scroll-content", J = "data-cerious-scroll-row";
5
+ function K(e) {
6
+ const o = e.querySelector(`[${P}]`);
7
+ if (o) return o;
8
+ const l = document.createElement("div");
9
+ return l.setAttribute(P, ""), l.style.position = "relative", l.style.width = "100%", l.style.height = "100%", l.style.overflowY = "clip", l.style.overflowX = "auto", e.appendChild(l), l;
10
10
  }
11
- function Z(e, c) {
12
- const n = (o) => {
13
- const r = o.detail;
14
- r && c({
15
- percentage: r.percentage,
16
- currentElement: r.currentElement,
17
- scrollOffset: r.scrollOffset,
18
- result: { element: r.result.element, offset: r.result.offset }
11
+ function Q(e, o) {
12
+ const l = (m) => {
13
+ const n = m.detail;
14
+ n && o({
15
+ percentage: n.percentage,
16
+ currentElement: n.currentElement,
17
+ scrollOffset: n.scrollOffset,
18
+ result: { element: n.result.element, offset: n.result.offset }
19
19
  });
20
- }, h = (o) => {
21
- const r = o.detail;
22
- r && c({
23
- percentage: r.percentage,
24
- currentElement: r.element,
25
- scrollOffset: r.scrollOffset,
26
- result: { element: r.element, offset: r.scrollOffset }
20
+ }, y = (m) => {
21
+ const n = m.detail;
22
+ n && o({
23
+ percentage: n.percentage,
24
+ currentElement: n.element,
25
+ scrollOffset: n.scrollOffset,
26
+ result: { element: n.element, offset: n.scrollOffset }
27
27
  });
28
28
  };
29
- return e.addEventListener("cerious-viewport-change", n), e.addEventListener("viewport-change", h), () => {
30
- e.removeEventListener("cerious-viewport-change", n), e.removeEventListener("viewport-change", h);
29
+ return e.addEventListener("cerious-viewport-change", l), e.addEventListener("viewport-change", y), () => {
30
+ e.removeEventListener("cerious-viewport-change", l), e.removeEventListener("viewport-change", y);
31
31
  };
32
32
  }
33
- function F(e, c) {
34
- const n = typeof e == "number" ? e : typeof c == "number" ? c : void 0;
35
- if (n === void 0 || Number.isNaN(n))
33
+ function H(e, o) {
34
+ const l = typeof e == "number" ? e : typeof o == "number" ? o : void 0;
35
+ if (l === void 0 || Number.isNaN(l))
36
36
  throw new Error("useCeriousScroll: provide `totalElements` or `items`.");
37
- return Math.max(1, Math.floor(n));
37
+ return Math.max(1, Math.floor(l));
38
38
  }
39
- function k(e) {
40
- var V, x;
41
- const c = (V = U()) == null ? void 0 : V.appContext, n = W(null), h = X(null);
42
- let o = null;
43
- const r = /* @__PURE__ */ new Map();
44
- let s = null;
45
- const b = ((x = e.options) == null ? void 0 : x.layout) === "table";
46
- let f = null;
47
- const L = (t) => {
39
+ function Z(e) {
40
+ var x;
41
+ const o = B(), l = o == null ? void 0 : o.provides, y = o ? { ...o.appContext, provides: l ?? o.appContext.provides } : void 0, m = U(null), n = W(null);
42
+ let t = null;
43
+ const f = /* @__PURE__ */ new Map(), T = ((x = e.options) == null ? void 0 : x.layout) === "table";
44
+ let v = null;
45
+ const _ = (r) => {
48
46
  if (!e.renderHeader) return;
49
- f == null || f();
50
- const l = c ?? null, u = N(!0);
51
- u.run(
47
+ v == null || v();
48
+ const c = y ?? null, s = V(!0);
49
+ s.run(
52
50
  () => j(
53
51
  () => {
54
- const a = e.renderHeader(), d = Array.isArray(a) ? a : [a];
55
- for (const i of d) H(i) && (i.appContext = l);
56
- const m = I(P, d);
57
- m.appContext = l, T(m, t);
52
+ const u = e.renderHeader(), i = Array.isArray(u) ? u : [u];
53
+ for (const a of i) M(a) && (a.appContext = c);
54
+ const d = A(N, i);
55
+ d.appContext = c, S(d, r);
58
56
  },
59
57
  { flush: "sync" }
60
58
  )
61
- ), f = () => u.stop();
62
- }, O = () => w(e.autoRender) ?? !0, $ = (t) => {
63
- if (e.getItem) return e.getItem(t);
64
- const l = w(e.items);
65
- return l ? l[t] : void 0;
66
- }, q = (t, l) => {
67
- const u = c ?? null, a = N(!0);
68
- return a.run(
59
+ ), v = () => s.stop();
60
+ }, I = () => w(e.autoRender) ?? !0, F = (r) => {
61
+ if (e.getItem) return e.getItem(r);
62
+ const c = w(e.items);
63
+ return c ? c[r] : void 0;
64
+ }, L = (r, c) => {
65
+ const s = y ?? null, u = V(!0);
66
+ return u.run(
69
67
  () => j(
70
68
  () => {
71
- const d = e.renderItem($(t), t), m = Array.isArray(d) ? d : [d];
72
- for (const y of m)
73
- H(y) && (y.appContext = u);
74
- const i = I(P, m);
75
- i.appContext = u, T(i, l);
69
+ const i = e.renderItem(F(r), r), d = Array.isArray(i) ? i : [i];
70
+ for (const C of d)
71
+ M(C) && (C.appContext = s);
72
+ const a = A(N, d);
73
+ a.appContext = s, S(a, c);
76
74
  },
77
75
  { flush: "sync" }
78
76
  )
79
- ), () => a.stop();
80
- }, S = (t) => {
81
- t.stop(), T(null, t.mount), t.mount.remove();
82
- }, p = () => {
83
- var y;
84
- if (!o) return null;
85
- const { scroller: t, contentEl: l, container: u } = o, a = u.clientHeight || u.offsetHeight || 0, d = (v, g) => {
77
+ ), () => u.stop();
78
+ }, O = (r) => {
79
+ r.stop(), S(null, r.mount), r.mount.remove();
80
+ }, h = () => {
81
+ var C;
82
+ if (!t) return null;
83
+ const { scroller: r, contentEl: c, container: s } = t, u = s.clientHeight || s.offsetHeight || 0, i = (g, p) => {
86
84
  const E = document.createElement("div");
87
- b && (E.style.display = "contents"), E.setAttribute(K, String(v)), g.appendChild(E);
88
- const C = q(v, E);
89
- r.set(v, { el: g, mount: E, stop: C });
90
- }, m = t.renderViewport(a, l, d), i = new Set(t.getRenderedIndices());
91
- return r.forEach((v, g) => {
92
- i.has(g) || (S(v), r.delete(g));
93
- }), (y = e.onMeasuredViewport) == null || y.call(e, m), m;
94
- }, A = (t) => {
95
- if (!o) return;
96
- const l = o;
97
- o = null, l.unsubscribe(), t && (s = {
98
- currentElement: l.scroller.currentElement,
99
- scrollOffset: l.scroller.scrollOffset
100
- }), r.forEach((u) => S(u)), r.clear(), f == null || f(), f = null, l.contentEl.textContent = "", l.scroller.detachScrollbar(l.container), l.scroller.dispose(), h.value = null;
101
- }, M = (t) => {
102
- var v, g, E;
103
- const l = Q(t), u = e.options ?? {}, a = u.onScroll, d = {
104
- ...u,
85
+ T && (E.style.display = "contents"), E.setAttribute(J, String(g)), p.appendChild(E);
86
+ const b = L(g, E);
87
+ f.set(g, { el: p, mount: E, stop: b });
88
+ }, d = r.renderViewport(u, c, i), a = new Set(r.getRenderedIndices());
89
+ return f.forEach((g, p) => {
90
+ a.has(p) || (O(g), f.delete(p));
91
+ }), (C = e.onMeasuredViewport) == null || C.call(e, d), d;
92
+ }, $ = (r) => {
93
+ if (!t) return;
94
+ const c = t;
95
+ t = null, c.unsubscribe(), f.forEach((s) => O(s)), f.clear(), v == null || v(), v = null, c.contentEl.textContent = "", c.scroller.detachScrollbar(c.container), c.scroller.dispose(), n.value = null;
96
+ }, q = (r) => {
97
+ var g, p, E;
98
+ const c = K(r), s = e.options ?? {}, u = s.onScroll, i = {
99
+ ...s,
105
100
  onScroll: () => {
106
- a == null || a(), O() && p();
101
+ u == null || u(), I() && h();
107
102
  }
108
103
  };
109
- if (b && e.renderHeader) {
110
- const C = (v = u.table) == null ? void 0 : v.header;
111
- d.table = {
112
- ...u.table,
104
+ if (T && e.renderHeader) {
105
+ const b = (g = s.table) == null ? void 0 : g.header;
106
+ i.table = {
107
+ ...s.table,
113
108
  header: (R) => {
114
- C == null || C(R), L(R);
109
+ b == null || b(R), _(R);
115
110
  }
116
111
  };
117
112
  }
118
- const m = F(w(e.totalElements), ((g = w(e.items)) == null ? void 0 : g.length) ?? null), i = new J(t, m, d);
119
- s && (i.currentElement = Math.min(s.currentElement, m - 1), i.scrollOffset = s.scrollOffset, s = null);
120
- const y = Z(t, (C) => {
113
+ const d = H(w(e.totalElements), ((p = w(e.items)) == null ? void 0 : p.length) ?? null), a = new G(r, d, i), C = Q(r, (b) => {
121
114
  var R;
122
- (R = e.onViewportChange) == null || R.call(e, C);
115
+ (R = e.onViewportChange) == null || R.call(e, b);
123
116
  });
124
- o = { scroller: i, contentEl: l, container: t, unsubscribe: y }, h.value = i, (E = e.onReady) == null || E.call(e, i), O() && requestAnimationFrame(() => p());
125
- }, B = () => {
126
- A(!0);
127
- const t = n.value;
128
- t && M(t);
117
+ t = { scroller: a, contentEl: c, container: r, unsubscribe: C }, n.value = a, (E = e.onReady) == null || E.call(e, a), I() && requestAnimationFrame(() => h());
129
118
  };
130
- return Y(() => {
131
- const t = n.value;
132
- t && M(t);
133
- }), z(() => {
134
- A(!1);
135
- }), D(
119
+ return X(() => {
120
+ const r = m.value;
121
+ r && q(r);
122
+ }), Y(() => {
123
+ $();
124
+ }), z(
136
125
  () => [w(e.totalElements), w(e.items)],
137
126
  () => {
138
- var l;
139
- if (!o) return;
140
- const t = F(w(e.totalElements), ((l = w(e.items)) == null ? void 0 : l.length) ?? null);
141
- o.scroller.totalElements !== t && B();
127
+ var c;
128
+ if (!t) return;
129
+ const r = H(w(e.totalElements), ((c = w(e.items)) == null ? void 0 : c.length) ?? null);
130
+ t.scroller.totalElements !== r && (t.scroller.updateTotalElements(r), t.scroller.currentElement > r - 1 && t.scroller.jumpToElement(r - 1), I() && h(), t.scroller.syncScrollbar());
142
131
  }
143
132
  ), {
144
- containerRef: n,
145
- scroller: h,
146
- render: p,
147
- jumpToElement: (t) => o ? (o.scroller.jumpToElement(t), p()) : null,
148
- scrollToPercentage: (t) => o ? (o.scroller.handleScrollPercentage(t), p()) : null,
149
- reset: () => o ? (o.scroller.reset(), p()) : null,
150
- recalculate: () => o ? (o.scroller.clearAllCaches(), p()) : null
133
+ containerRef: m,
134
+ scroller: n,
135
+ render: h,
136
+ jumpToElement: (r) => t ? (t.scroller.jumpToElement(r), h()) : null,
137
+ scrollToPercentage: (r) => t ? (t.scroller.handleScrollPercentage(r), h()) : null,
138
+ reset: () => t ? (t.scroller.reset(), h()) : null,
139
+ recalculate: () => t ? (t.scroller.clearAllCaches(), h()) : null
151
140
  };
152
141
  }
153
- const ce = G({
142
+ const le = D({
154
143
  name: "CeriousScroll",
155
144
  props: {
156
145
  /** Total item count. Falls back to `items.length` when omitted. */
@@ -177,50 +166,50 @@ const ce = G({
177
166
  /** Emitted once the underlying engine instance is ready (and after recreation). */
178
167
  ready: (e) => !0
179
168
  },
180
- setup(e, { slots: c, emit: n, expose: h }) {
181
- const o = (s, b) => {
182
- var f;
183
- return e.renderItem ? e.renderItem(s, b) : (f = c.item) == null ? void 0 : f.call(c, { item: s, index: b });
184
- }, r = k({
169
+ setup(e, { slots: o, emit: l, expose: y }) {
170
+ const m = (t, f) => {
171
+ var T;
172
+ return e.renderItem ? e.renderItem(t, f) : (T = o.item) == null ? void 0 : T.call(o, { item: t, index: f });
173
+ }, n = Z({
185
174
  totalElements: () => e.totalElements,
186
175
  items: () => e.items,
187
- getItem: e.getItem ? (s) => e.getItem(s) : void 0,
188
- renderItem: o,
176
+ getItem: e.getItem ? (t) => e.getItem(t) : void 0,
177
+ renderItem: m,
189
178
  // Table mode: declarative header. Render the `#header` slot (a <tr> of
190
179
  // <th>s) into the engine's <thead>. `undefined` when no slot is provided.
191
- renderHeader: c.header ? () => c.header() : void 0,
180
+ renderHeader: o.header ? () => o.header() : void 0,
192
181
  // Engine options are consumed at creation; reading the prop once matches
193
182
  // that contract (remount via `:key` to apply new engine options).
194
183
  options: e.options,
195
184
  autoRender: () => e.autoRender,
196
- onViewportChange: (s) => n("viewport-change", s),
197
- onMeasuredViewport: (s) => n("measured-viewport", s),
198
- onReady: (s) => n("ready", s)
185
+ onViewportChange: (t) => l("viewport-change", t),
186
+ onMeasuredViewport: (t) => l("measured-viewport", t),
187
+ onReady: (t) => l("ready", t)
199
188
  });
200
- return h({
189
+ return y({
201
190
  /** The underlying engine instance (`null` before mount). */
202
- scroller: r.scroller,
203
- render: r.render,
204
- jumpToElement: r.jumpToElement,
205
- scrollToPercentage: r.scrollToPercentage,
206
- reset: r.reset,
207
- recalculate: r.recalculate
191
+ scroller: n.scroller,
192
+ render: n.render,
193
+ jumpToElement: n.jumpToElement,
194
+ scrollToPercentage: n.scrollToPercentage,
195
+ reset: n.reset,
196
+ recalculate: n.recalculate
208
197
  }), () => {
209
- var s;
210
- return I(
198
+ var t;
199
+ return A(
211
200
  "div",
212
201
  {
213
- ref: r.containerRef,
202
+ ref: n.containerRef,
214
203
  // User-supplied class/style/attrs fall through and merge onto this root.
215
204
  style: { position: "relative", overflow: "hidden" }
216
205
  },
217
- (s = c.default) == null ? void 0 : s.call(c)
206
+ (t = o.default) == null ? void 0 : t.call(o)
218
207
  );
219
208
  };
220
209
  }
221
210
  });
222
211
  export {
223
- ce as CeriousScroll,
224
- ie as CeriousScrollEngine,
225
- k as useCeriousScroll
212
+ le as CeriousScroll,
213
+ ue as CeriousScrollEngine,
214
+ Z as useCeriousScroll
226
215
  };
@@ -61,6 +61,7 @@ export interface UseCeriousScrollResult {
61
61
  *
62
62
  * Rows are rendered with the host component's `appContext`, so globally
63
63
  * registered components, directives, and installed plugins are available inside
64
- * each row.
64
+ * each row — and with the owning component instance's `provides`, so local
65
+ * `provide()` values reach `inject()` inside rows too (see below).
65
66
  */
66
67
  export declare function useCeriousScroll<TItem = unknown>(opts: UseCeriousScrollOptions<TItem>): UseCeriousScrollResult;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ceriousdevtech/vue-cerious-scroll",
3
- "version": "1.0.6",
3
+ "version": "1.0.7",
4
4
  "description": "Vue 3 bindings for CeriousScroll — high-performance virtual scrolling with O(1) memory and no height estimation",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -57,7 +57,7 @@
57
57
  "demo:build": "vite build --config demo/vite.config.ts"
58
58
  },
59
59
  "dependencies": {
60
- "@ceriousdevtech/cerious-scroll": "^1.0.7"
60
+ "@ceriousdevtech/cerious-scroll": "^1.0.8"
61
61
  },
62
62
  "peerDependencies": {
63
63
  "vue": "^3.3.0"