diff --git a/README.md b/README.md index c317850..49ce50b 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,7 @@ npm install vue-virtual-scroll-grid | `pageProviderDebounceTime` | Debounce window in milliseconds on the calls to `pageProvider` | `number` | Optional, an integer greater than or equal to 0 | | `pageSize` | The number of items in a page from the item provider (e.g. a backend API) | `number` | Required, an integer greater than or equal to 1 | | `scrollTo` | Scroll to a specific item by index | `number` | Optional, an integer from 0 to the `length` prop - 1 | +| `scrollBehavior` | The behavior of `scrollTo`. Default value is `smooth` | `smooth` | `auto` | Optional, a string to be `smooth` or `auto` | Example: diff --git a/package-lock.json b/package-lock.json index dcba27f..f021b77 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,7 +28,7 @@ "vue-tsc": ">=0.34.11" }, "engines": { - "node": ">=17" + "node": ">=14" }, "peerDependencies": { "vue": "^3.2.33" diff --git a/src/Grid.vue b/src/Grid.vue index aa3b25f..cc66f8c 100644 --- a/src/Grid.vue +++ b/src/Grid.vue @@ -85,6 +85,12 @@ export default defineComponent({ required: false, validator: (value: number) => Number.isInteger(value) && value >= 0, }, + scrollBehavior: { + type: String as PropType<"smooth" | "auto">, + required: false, + default: "smooth", + validator: (value: string) => ["smooth", "auto"].includes(value) + } }, setup(props) { // template refs @@ -114,7 +120,7 @@ export default defineComponent({ onUpdated( once(() => { scrollAction$.subscribe(([el, top]: ScrollAction) => { - el.scrollTo({ top, behavior: "smooth" }); + el.scrollTo({ top, behavior: props.scrollBehavior }); }); }) ); diff --git a/src/demo/App.vue b/src/demo/App.vue index 9e8cbd1..29d7040 100644 --- a/src/demo/App.vue +++ b/src/demo/App.vue @@ -7,6 +7,7 @@ :pageProvider="pageProvider" :pageProviderDebounceTime="0" :scrollTo="scrollTo" + :scrollBehavior="scrollBehavior" :class="$style.grid" > @@ -109,6 +138,7 @@ export default defineComponent({ "length pageProvider" auto "pageSize pageProvider" auto "scrollTo pageProvider" auto + "scrollBehavior pageProvider" auto / 2fr 1fr; place-items: center stretch; grid-gap: 1.5rem; @@ -134,6 +164,14 @@ export default defineComponent({ grid-area: scrollTo; } +.scrollBehaviorProvider { + grid-area: scrollBehavior; + place-self: stretch; + display: flex; + flex-flow: column nowrap; + justify-content: flex-start; +} + .radioList { flex: 1 1 auto; display: flex; @@ -171,7 +209,7 @@ export default defineComponent({ font-weight: 700; } -.category { +.category, .scrollBehavior { font-weight: 700; margin-bottom: 1rem; } @@ -179,11 +217,11 @@ export default defineComponent({ @media (min-width: 760px) { .root { grid-template: - "length pageSize pageProvider scrollTo" auto - / 2fr 2fr 2fr 1fr; + "length pageSize pageProvider scrollTo scrollBehavior" auto + / 2fr 2fr 2fr 1fr 1fr; } - .category { + .category, .scrollBehavior { margin-bottom: 0.5rem; } diff --git a/src/demo/store.ts b/src/demo/store.ts index 0bbf441..4585367 100644 --- a/src/demo/store.ts +++ b/src/demo/store.ts @@ -5,6 +5,7 @@ import { curry, prop } from "ramda"; export const length = ref(1000); export const pageSize = ref(40); export const scrollTo = ref(undefined); +export const scrollBehavior = ref("smooth"); export type Collection = "" | "all-mens" | "womens-view-all"; export const collection = ref("");