├── .editorconfig
├── .env
├── .github
├── FUNDING.yml
├── ISSUE_TEMPLATE
│ ├── bug_report.md
│ └── feature_request.md
└── workflows
│ ├── codeql-analysis.yml
│ ├── pr.yml
│ └── release.yml
├── .gitignore
├── .idea
├── .gitignore
├── codeStyles
│ ├── Project.xml
│ └── codeStyleConfig.xml
├── inspectionProfiles
│ └── Project_Default.xml
├── jsLibraryMappings.xml
├── jsonSchemas.xml
└── prettier.xml
├── .npmignore
├── .releaserc.json
├── LICENSE
├── README.md
├── index.html
├── jest.config.js
├── netlify.toml
├── package-lock.json
├── package.json
├── renovate.json5
├── src
├── Grid.vue
├── demo
│ ├── App.vue
│ ├── Bem.js
│ ├── Control.vue
│ ├── Header.vue
│ ├── Logo.vue
│ ├── Money.vue
│ ├── Price.vue
│ ├── ProductItem.vue
│ ├── SmartImage.vue
│ ├── main.ts
│ ├── reset.css
│ └── store.ts
├── index.ts
├── pipeline.test.ts
├── pipeline.ts
├── shims-vue.d.ts
└── utilites.ts
├── tsconfig.json
└── vite.config.ts
/.editorconfig:
--------------------------------------------------------------------------------
1 | # EditorConfig is awesome: http://EditorConfig.org
2 |
3 | # top-most EditorConfig file
4 | root = true
5 |
6 | [*]
7 | indent_style = space
8 | indent_size = 2
9 | tab_width = 2
10 | end_of_line = lf
11 | charset = utf-8
12 | trim_trailing_whitespace = true
13 | insert_final_newline = true
14 | max_line_length = 80
15 |
--------------------------------------------------------------------------------
/.env:
--------------------------------------------------------------------------------
1 | VITE_APP_ID=
2 | VITE_SEARCH_ONLY_API_KEY=
3 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: [rocwang]
4 | patreon: # Replace with a single Patreon username
5 | open_collective: # Replace with a single Open Collective username
6 | ko_fi: # Replace with a single Ko-fi username
7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9 | liberapay: # Replace with a single Liberapay username
10 | issuehunt: # Replace with a single IssueHunt username
11 | otechie: # Replace with a single Otechie username
12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
13 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a report to help us improve
4 | title: "[BUG]"
5 | labels: bug
6 | assignees: rocwang
7 |
8 | ---
9 |
10 | **Describe the bug**
11 | A clear and concise description of what the bug is.
12 |
13 | **To Reproduce**
14 | Steps to reproduce the behavior:
15 | 1. Go to '...'
16 | 2. Click on '....'
17 | 3. Scroll down to '....'
18 | 4. See error
19 |
20 | **Expected behavior**
21 | A clear and concise description of what you expected to happen.
22 |
23 | **Screenshots**
24 | If applicable, add screenshots to help explain your problem.
25 |
26 | **Desktop (please complete the following information):**
27 | - OS: [e.g. iOS]
28 | - Browser [e.g. chrome, safari]
29 | - Version [e.g. 22]
30 |
31 | **Smartphone (please complete the following information):**
32 | - Device: [e.g. iPhone6]
33 | - OS: [e.g. iOS8.1]
34 | - Browser [e.g. stock browser, safari]
35 | - Version [e.g. 22]
36 |
37 | **Additional context**
38 | Add any other context about the problem here.
39 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: Suggest an idea for this project
4 | title: "[FEATURE REQUEST]"
5 | labels: enhancement
6 | assignees: rocwang
7 |
8 | ---
9 |
10 | **Is your feature request related to a problem? Please describe.**
11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12 |
13 | **Describe the solution you'd like**
14 | A clear and concise description of what you want to happen.
15 |
16 | **Describe alternatives you've considered**
17 | A clear and concise description of any alternative solutions or features you've considered.
18 |
19 | **Additional context**
20 | Add any other context or screenshots about the feature request here.
21 |
--------------------------------------------------------------------------------
/.github/workflows/codeql-analysis.yml:
--------------------------------------------------------------------------------
1 | # For most projects, this workflow file will not need changing; you simply need
2 | # to commit it to your repository.
3 | #
4 | # You may wish to alter this file to override the set of languages analyzed,
5 | # or to provide custom queries or build logic.
6 | #
7 | # ******** NOTE ********
8 | # We have attempted to detect the languages in your repository. Please check
9 | # the `language` matrix defined below to confirm you have the correct set of
10 | # supported CodeQL languages.
11 | #
12 | name: "CodeQL"
13 |
14 | on:
15 | push:
16 | branches: [ main ]
17 | pull_request:
18 | # The branches below must be a subset of the branches above
19 | branches: [ main ]
20 | schedule:
21 | - cron: '23 13 * * 5'
22 |
23 | jobs:
24 | analyze:
25 | name: Analyze
26 | runs-on: ubuntu-latest
27 | permissions:
28 | actions: read
29 | contents: read
30 | security-events: write
31 |
32 | strategy:
33 | fail-fast: false
34 | matrix:
35 | language: [ 'javascript' ]
36 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
37 | # Learn more:
38 | # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
39 |
40 | steps:
41 | - name: Checkout repository
42 | uses: actions/checkout@v4
43 |
44 | # Initializes the CodeQL tools for scanning.
45 | - name: Initialize CodeQL
46 | uses: github/codeql-action/init@v2
47 | with:
48 | languages: ${{ matrix.language }}
49 | # If you wish to specify custom queries, you can do so here or in a config file.
50 | # By default, queries listed here will override any specified in a config file.
51 | # Prefix the list here with "+" to use these queries and those in the config file.
52 | # queries: ./path/to/local/query, your-org/your-repo/queries@main
53 |
54 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
55 | # If this step fails, then you should remove it and run the build manually (see below)
56 | - name: Autobuild
57 | uses: github/codeql-action/autobuild@v2
58 |
59 | # ℹ️ Command-line programs to run using the OS shell.
60 | # 📚 https://git.io/JvXDl
61 |
62 | # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
63 | # and modify them (or add more) to build your code if your project
64 | # uses a compiled language
65 |
66 | #- run: |
67 | # make bootstrap
68 | # make release
69 |
70 | - name: Perform CodeQL Analysis
71 | uses: github/codeql-action/analyze@v2
72 |
--------------------------------------------------------------------------------
/.github/workflows/pr.yml:
--------------------------------------------------------------------------------
1 | name: Verify PRs
2 |
3 | on:
4 | pull_request:
5 | branches: [ main ]
6 |
7 | # Allows you to run this workflow manually from the Actions tab
8 | workflow_dispatch:
9 |
10 | jobs:
11 | verification:
12 | name: Test & Build
13 | runs-on: ubuntu-latest
14 |
15 | steps:
16 | - name: Checkout
17 | uses: actions/checkout@v4
18 |
19 | - name: Set up Node.js
20 | uses: actions/setup-node@v4
21 | with:
22 | node-version-file: "package.json"
23 | cache: "npm"
24 |
25 | - name: Install dependencies
26 | run: npm --no-update-notifier --no-fund --no-audit ci
27 |
28 | - name: Lint
29 | run: npm run lint
30 |
31 | - name: Unit Test
32 | run: npm test
33 |
34 | - name: Build
35 | run: npm run build
36 |
--------------------------------------------------------------------------------
/.github/workflows/release.yml:
--------------------------------------------------------------------------------
1 | name: Release
2 |
3 | on:
4 | push:
5 | branches: [ main ]
6 |
7 | # Allows you to run this workflow manually from the Actions tab
8 | workflow_dispatch:
9 |
10 | jobs:
11 | release:
12 | name: Test, Build & Release
13 | runs-on: ubuntu-latest
14 | steps:
15 | - name: Checkout
16 | uses: actions/checkout@v4
17 |
18 | - name: Set up Node.js
19 | uses: actions/setup-node@v4
20 | with:
21 | node-version-file: "package.json"
22 | cache: "npm"
23 |
24 | - name: Install dependencies
25 | run: npm --no-update-notifier --no-fund --no-audit ci
26 |
27 | - name: Lint
28 | run: npm run lint
29 |
30 | - name: Unit Test
31 | run: npm test
32 |
33 | - name: Build
34 | run: npm run build
35 |
36 | - name: Semantic Release
37 | env:
38 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
39 | NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
40 | run: npm run semantic-release
41 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .DS_Store
3 | dist
4 | dist-ssr
5 | *.local
6 |
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 | # Datasource local storage ignored files
5 | /dataSources/
6 | /dataSources.local.xml
7 | # Editor-based HTTP Client requests
8 | /httpRequests/
9 |
10 | /aws.xml
11 | /misc.xml
12 | /modules.xml
13 | /vcs.xml
14 | /vue-virtual-scroll-grid.iml
15 | /git_toolbox_prj.xml
16 |
17 |
--------------------------------------------------------------------------------
/.idea/codeStyles/Project.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/.idea/codeStyles/codeStyleConfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/.idea/inspectionProfiles/Project_Default.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/jsLibraryMappings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/jsonSchemas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/.idea/prettier.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | *
2 | !/dist/
3 |
--------------------------------------------------------------------------------
/.releaserc.json:
--------------------------------------------------------------------------------
1 | {
2 | "branches": ["main"],
3 | "dryRun": false
4 | }
5 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 roc
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Virtual Scroll Grid for Vue 3
2 |
3 | This is a reusable component for Vue 3 that renders a list with a huge number of
4 | items (e.g. 1000+ items) as a grid in a performant way.
5 |
6 | - [Demo][demo]
7 | - [NPM Package][npm]
8 |
9 | ## Features
10 |
11 | - Use virtual-scrolling / windowing to render the items, so the number of DOM
12 | nodes is kept low.
13 | - Just use CSS grid to style your grid. Minimum styling opinions form the
14 | library.
15 | - Support using a paginated API to load the items in the background.
16 | - Support rendering placeholders for unloaded items.
17 | - Support both vertical and horizontal scroll.
18 | - Loaded items are cached for better performance.
19 |
20 | ## Code Examples
21 |
22 | - [As an ES module (with a bundler)][esm]
23 | - [As a Universal Module Definition (no bundler)][umd]
24 |
25 | ## Install
26 |
27 | ```shell
28 | npm install vue-virtual-scroll-grid
29 | ```
30 |
31 | ## Available Props
32 |
33 | | Name | Description | Type | Validation |
34 | | -------------------------- | --------------------------------------------------------------------------------- | -------------------------------------------------------------- | ------------------------------------------------------------------- |
35 | | `length` | The number of items in the list | `number` | Required, an integer greater than or equal to 0 |
36 | | `pageProvider` | The callback that returns a page of items as a promise. `pageNumber` start with 0 | `(pageNumber: number, pageSize: number) => Promise` | Required |
37 | | `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 |
38 | | `pageProviderDebounceTime` | Debounce window in milliseconds on the calls to `pageProvider` | `number` | Optional, an integer greater than or equal to 0, defaults to `0` |
39 | | `probeTag` | The HTML tag used as probe element. Default value is `div` | `string` | Optional, any valid HTML tag, defaults to `div` |
40 | | `respectScrollToOnResize` | Snap to the position set by `scrollTo` when the grid container is resized | `boolean` | Optional, defaults to `false` |
41 | | `scrollBehavior` | The behavior of `scrollTo`. Default value is `smooth` | `smooth` | `auto` | Optional, a string to be `smooth` or `auto`, defaults to `smooth` |
42 | | `scrollTo` | Scroll to a specific item by index | `number` | Optional, an integer from 0 to the `length` prop - 1, defaults to 0 |
43 | | `tag` | The HTML tag used as container element. Default value is `div` | `string` | Optional, any valid HTML tag, defaults to `div` |
44 | | `getKey` | The `:key` used on each grid item. Auto-generated, but overwritable via function | `(internalItem: InternalItem) => number \| string` 1| Optional, any valid Function that returns a `string` or `number` |
45 |
46 | Example:
47 |
48 | ```vue
49 |
55 |
56 |
57 | ```
58 |
59 | ## Available Slots
60 |
61 | There are 3 scoped slots: `default`, `placeholder` and `probe`.
62 |
63 | ### The `default` slot
64 |
65 | The `default` slot is used to render a loaded item.
66 |
67 | Props:
68 |
69 | - `item`: the loaded item that is used for rendering your item
70 | element/component.
71 | - `index`: the index of current item within the list.
72 | - `style`: the style object provided by the library that need to be set on the
73 | item element/component.
74 |
75 | Example:
76 |
77 | ```vue
78 |
79 |
{{ item }} {{ index }}
80 |
81 | ```
82 |
83 | ### The`placeholder` slot
84 |
85 | When an item is not loaded, the component/element in the `placeholder` slot will
86 | be used for rendering. The `placeholder` slot is optional. If missing, the space
87 | of unloaded items will be blank until they are loaded.
88 |
89 | Props:
90 |
91 | - `index`: the index of current item within the list.
92 | - `style`: the style object provided by the library that need to be set on the
93 | item element/component.
94 |
95 | Example:
96 |
97 | ```vue
98 |
99 |
Placeholder {{ index }}
100 |
101 | ```
102 |
103 | ### The `probe` slot
104 |
105 | The `probe` slot is used to measure the visual size of grid item. It has no
106 | prop. You can pass the same element/component for the
107 | `placeholder` slot. **If not provided, you must set a fixed height
108 | to `grid-template-rows` on your CSS grid, e.g. `200px`. If provided, make sure
109 | it is styled with the same dimensions as rendered items in the `default`
110 | or `placeholder` slot. Otherwise, the view wouldn't be rendered properly, or the
111 | rendering could be very slow.**
112 |
113 | Example:
114 |
115 | ```vue
116 |
117 |
Probe
118 |
119 | ```
120 |
121 | ## Exposed Public Properties
122 |
123 | * `allItems`: All items memoized by the grid
124 |
125 | ## Scroll Mode
126 |
127 | The library uses `grid-auto-flow` CSS property to infer scroll mode. Set it to
128 | `column` value if you want to enable horizontal scroll.
129 |
130 | ## Caveats
131 |
132 | The library does not require items have foreknown width and height, but do
133 | require them to be styled with the same width and height under a view. E.g. the
134 | items can be 200px x 200px when the view is under 768px and 300px x 500px above
135 | 768px.
136 |
137 | ## Development
138 |
139 | Required environment variables:
140 |
141 | - `VITE_APP_ID`: An Algolia app ID
142 | - `VITE_SEARCH_ONLY_API_KEY`: The search API key for the Algolia app above
143 |
144 | * Setup: `npm install`
145 | * Run dev server: `npm run dev `
146 | * Lint (type check): `npm run lint `
147 | * Build the library: `npm run build `
148 | * Build the demo: `npm run build -- --mode=demo `
149 | * Preview the locally built demo: `npm run serve `
150 |
151 | ### How to Release a New Version
152 |
153 | We use [semantic-release][semantic-release] to release the library on npm
154 | automatically.
155 |
156 | [demo]: https://grid.kiwiberry.nz/
157 | [npm]: https://www.npmjs.com/package/vue-virtual-scroll-grid
158 | [esm]: https://codesandbox.io/s/vue-virtual-scroll-grid-esm-vt27c?file=/App.vue
159 | [umd]: https://codesandbox.io/s/vue-virtual-scroll-grid-umd-k14w5?file=/index.html
160 | [semantic-release]: https://semantic-release.gitbook.io/semantic-release/#how-does-it-work
161 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Vue Virtual Scroll Grid Demo
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/jest.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | roots: ["/src"],
3 | testMatch: [
4 | "**/__tests__/**/*.+(ts|tsx|js)",
5 | "**/?(*.)+(spec|test).+(ts|tsx|js)",
6 | ],
7 | transform: {
8 | "^.+\\.(ts|tsx)$": "ts-jest",
9 | },
10 | testEnvironment: "jsdom",
11 | };
12 |
--------------------------------------------------------------------------------
/netlify.toml:
--------------------------------------------------------------------------------
1 | [Settings]
2 | # Added automatically by the Netlify CLI. It has no effect during normal
3 | # Git-backed deploys.
4 | # ID = "Your_Site_ID"
5 |
6 | # Redirects and headers are GLOBAL for all builds – they do not get scoped to
7 | # contexts no matter where you define them in the file.
8 | # For context-specific rules, use _headers or _redirects files, which are
9 | # PER-DEPLOY.
10 |
11 | [[redirects]]
12 | from = "/index.html"
13 | to = "/"
14 |
15 | # The default HTTP status code is 301, but you can define a different one.
16 | status = 301
17 |
18 | # By default, redirects won't be applied if there's a file with the same
19 | # path as the one defined in the `from` property. Setting `force` to `true`
20 | # will make the redirect rule take precedence over any existing files.
21 | force = true
22 |
23 | # The following redirect is intended for use with most SPAs that handle
24 | # routing internally.
25 | [[redirects]]
26 | from = "/*"
27 | to = "/index.html"
28 | status = 200
29 | force = false
30 |
31 | # Redirect default Netlify subdomain to primary domain
32 | [[redirects]]
33 | from = "https://vue-virtual-scroll-grid.netlify.app"
34 | to = "https://grid.kiwiberry.nz"
35 | status = 301
36 | force = true
37 |
38 | # Long-term cache by default.
39 | [[headers]]
40 | for = "/*"
41 | [headers.values]
42 | Cache-Control = "max-age=31536000"
43 |
44 | # And here are the exceptions:
45 | [[headers]]
46 | for = "/"
47 | [headers.values]
48 | Cache-Control = "no-cache"
49 |
50 | [[headers]]
51 | for = "/*.html"
52 | [headers.values]
53 | Cache-Control = "no-cache"
54 |
55 | [[headers]]
56 | for = "/service-worker.js"
57 | [headers.values]
58 | Cache-Control = "no-cache"
59 |
60 | [[headers]]
61 | for = "/robots.txt"
62 | [headers.values]
63 | Cache-Control = "max-age=86400"
64 |
65 | [[headers]]
66 | for = "/sitemap.txt"
67 | [headers.values]
68 | Cache-Control = "max-age=86400"
69 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vue-virtual-scroll-grid",
3 | "author": "Roc Wong (https://kiwiberry.nz/)",
4 | "repository": {
5 | "type": "git",
6 | "url": "https://github.com/rocwang/vue-virtual-scroll-grid.git"
7 | },
8 | "keywords": [
9 | "vue",
10 | "windowing",
11 | "virtual scroll",
12 | "grid"
13 | ],
14 | "bugs": {
15 | "url": "https://github.com/rocwang/vue-virtual-scroll-grid/issues"
16 | },
17 | "homepage": "https://grid.kiwiberry.nz/",
18 | "files": [
19 | "dist"
20 | ],
21 | "module": "./dist/index.es.js",
22 | "main": "./dist/index.umd.js",
23 | "types": "./dist/index.d.ts",
24 | "exports": {
25 | ".": {
26 | "import": "./dist/index.es.js",
27 | "require": "./dist/index.umd.js",
28 | "types": "./dist/index.d.ts"
29 | }
30 | },
31 | "license": "MIT",
32 | "scripts": {
33 | "gen:types": "vue-tsc --declaration --emitDeclarationOnly --skipLibCheck",
34 | "serve": "vite preview",
35 | "build": "vite build && npm run gen:types",
36 | "build:demo": "vite build --mode demo",
37 | "dev": "vite",
38 | "lint": "vue-tsc --noEmit --skipLibCheck",
39 | "test": "jest",
40 | "preversion": "npm run lint && npm test",
41 | "version": "npm run build",
42 | "postversion": "npm publish --dry-run",
43 | "semantic-release": "semantic-release"
44 | },
45 | "peerDependencies": {
46 | "vue": "^3.2.33"
47 | },
48 | "dependencies": {
49 | "@vueuse/core": "^10.0.0",
50 | "ramda": ">=0.28.0",
51 | "rxjs": "^7.8.0"
52 | },
53 | "devDependencies": {
54 | "@types/jest": "^29.5.0",
55 | "@types/node": "^20.0.0",
56 | "@types/ramda": ">=0.28.23",
57 | "@vitejs/plugin-vue": "^4.1.0",
58 | "algoliasearch": "^4.16.0",
59 | "jest": "^29.5.0",
60 | "jest-environment-jsdom": "^29.5.0",
61 | "lodash-es": "^4.17.21",
62 | "prettier": "^3.0.0",
63 | "semantic-release": "^22.0.5",
64 | "ts-jest": "^29.0.5",
65 | "typescript": "^5.0.3",
66 | "vite": "^4.2.3",
67 | "vue": "^3.2.47",
68 | "vue-tsc": "^1.2.0"
69 | },
70 | "engines": {
71 | "node": ">=14"
72 | },
73 | "volta": {
74 | "node": "20.9.0",
75 | "npm": "10.2.2"
76 | }
77 | }
78 |
--------------------------------------------------------------------------------
/renovate.json5:
--------------------------------------------------------------------------------
1 | {
2 | $schema: "https://docs.renovatebot.com/renovate-schema.json",
3 | extends: ["group:all", "schedule:monthly"],
4 | assignees: ["rocwang"],
5 | timezone: "Pacific/Auckland",
6 | dependencyDashboard: true,
7 | }
8 |
--------------------------------------------------------------------------------
/src/Grid.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
15 |
16 |
17 |
18 |
24 |
30 |
37 |
38 |
39 |
40 |
41 |
191 |
--------------------------------------------------------------------------------
/src/demo/App.vue:
--------------------------------------------------------------------------------
1 |
2 |