tr]:last:border-b-0",
48 | className,
49 | )}
50 | {...props}
51 | />
52 | );
53 | }
54 |
55 | function TableRow({ className, ...props }: React.ComponentProps<"tr">) {
56 | return (
57 |
65 | );
66 | }
67 |
68 | function TableHead({ className, ...props }: React.ComponentProps<"th">) {
69 | return (
70 | [role=checkbox]]:translate-y-[2px]",
74 | className,
75 | )}
76 | {...props}
77 | />
78 | );
79 | }
80 |
81 | function TableCell({ className, ...props }: React.ComponentProps<"td">) {
82 | return (
83 | | [role=checkbox]]:translate-y-[2px]",
87 | className,
88 | )}
89 | {...props}
90 | />
91 | );
92 | }
93 |
94 | function TableCaption({
95 | className,
96 | ...props
97 | }: React.ComponentProps<"caption">) {
98 | return (
99 |
104 | );
105 | }
106 |
107 | export {
108 | Table,
109 | TableHeader,
110 | TableBody,
111 | TableFooter,
112 | TableHead,
113 | TableRow,
114 | TableCell,
115 | TableCaption,
116 | };
117 |
--------------------------------------------------------------------------------
/components/ui/tooltip.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import * as React from "react";
4 | import * as TooltipPrimitive from "@radix-ui/react-tooltip";
5 |
6 | import { cn } from "@/lib/utils";
7 |
8 | function TooltipProvider({
9 | delayDuration = 0,
10 | ...props
11 | }: React.ComponentProps) {
12 | return (
13 |
18 | );
19 | }
20 |
21 | function Tooltip({
22 | ...props
23 | }: React.ComponentProps) {
24 | return (
25 |
26 |
27 |
28 | );
29 | }
30 |
31 | function TooltipTrigger({
32 | ...props
33 | }: React.ComponentProps) {
34 | return ;
35 | }
36 |
37 | function TooltipContent({
38 | className,
39 | sideOffset = 0,
40 | children,
41 | ...props
42 | }: React.ComponentProps) {
43 | return (
44 |
45 |
54 | {children}
55 |
56 |
57 |
58 | );
59 | }
60 |
61 | export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
62 |
--------------------------------------------------------------------------------
/data/ag-grid.yml:
--------------------------------------------------------------------------------
1 | title: ag-Grid
2 | homeUrl: https://www.ag-grid.com/
3 | demoUrl: https://www.ag-grid.com/example.php
4 | githubRepo: ag-grid/ag-grid
5 | npmPackage: ag-grid-community
6 | license: MIT or Commercial License
7 | revenueModel: Free for Personal Use
8 | description: >
9 | Our mission is simple: Build the best datagrid in the world.
10 | Born out of frustration with existing solutions, ag-Grid evolved from a
11 | side project to becoming the leading JavaScript datagrid on the market.
12 | frameworks:
13 | vanilla: true
14 | react: true
15 | angular: true
16 | vue: true
17 | features:
18 | accessible: true
19 | copyPaste: Premium feature
20 | csvExport: Premium feature
21 | customEditors: true
22 | customFormatters: true
23 | draggableRows: true
24 | editable: true
25 | fillDown: Premium feature
26 | fillRight: Premium feature
27 | filtering: Set filtering is premium, the rest is free
28 | formulas: Premium feature
29 | freezableCols: true
30 | headless: false
31 | i18n: true
32 | maintained: true
33 | mergeCells: true
34 | openSource: true
35 | pagination: true
36 | pdfExport: false
37 | pivots: Premium feature
38 | rangeSelection: Premium feature
39 | resizableCols: true
40 | responsive: false
41 | rowGrouping: Premium feature
42 | rowSelection: true
43 | serverSide: Premium feature
44 | sorting: Premium feature
45 | trees: Premium feature
46 | typescript: true
47 | xlsxExport: true
48 | virtualization: true
49 |
--------------------------------------------------------------------------------
/data/angular-ui-grid.yml:
--------------------------------------------------------------------------------
1 | title: Angular UI Grid
2 | homeUrl: http://ui-grid.info/
3 | demoUrl: http://ui-grid.info/
4 | githubRepo: angular-ui/ui-grid
5 | npmPackage: angular-ui-grid
6 | license: MIT License
7 | revenueModel: Free
8 | description: >
9 | A data grid for AngularJS; part of the AngularUI suite.
10 | Native AngularJS implementation, no jQuery.
11 | Performs well with large data sets; even 10,000+ rows
12 | Plugin architecture allows you to use only the features you need.
13 | frameworks:
14 | angular: true
15 | features:
16 | accessible: true
17 | copyPaste: false
18 | csvExport: false
19 | customEditors: true
20 | customFormatters: true
21 | draggableRows: false
22 | editable: true
23 | fillDown: false
24 | fillRight: false
25 | filtering: true
26 | formulas: false
27 | freezableCols: true
28 | headless: false
29 | i18n: true
30 | maintained: true
31 | mergeCells: false
32 | openSource: true
33 | pagination: true
34 | pdfExport: false
35 | pivots: false
36 | rangeSelection: true
37 | resizableCols: true
38 | responsive: false
39 | rowGrouping: true
40 | rowSelection: true
41 | serverSide: true
42 | sorting: true
43 | trees: true
44 | typescript: Third-party types available via DefinitelyTyped
45 | xlsxExport: false
46 | virtualization: true
47 |
--------------------------------------------------------------------------------
/data/antv-s2.yml:
--------------------------------------------------------------------------------
1 | title: AntV S2
2 | homeUrl: https://s2.antv.antgroup.com/
3 | demoUrl: https://s2.antv.antgroup.com/examples/
4 | githubRepo: antvis/S2
5 | npmPackage: "@antv/s2"
6 | license: MIT License
7 | revenueModel: Free
8 | description: >
9 | A practical visualization library for tabular analysis with support for up to millions of data.
10 | frameworks:
11 | vanilla: true
12 | react: true
13 | vue: true
14 | features:
15 | accessible: true
16 | copyPaste: true
17 | csvExport: true
18 | customEditors: true
19 | customFormatters: true
20 | draggableRows: false
21 | editable: true
22 | fillDown: false
23 | fillRight: false
24 | filtering: true
25 | formulas: false
26 | freezableCols: true
27 | headless: true
28 | i18n: true
29 | maintained: true
30 | mergeCells: false
31 | openSource: true
32 | pagination: true
33 | pdfExport: false
34 | pivots: true
35 | rangeSelection: true
36 | resizableCols: true
37 | responsive: true
38 | rowGrouping: true
39 | rowSelection: true
40 | serverSide: false
41 | sorting: true
42 | trees: true
43 | xlsxExport: false
44 | virtualization: true
45 |
--------------------------------------------------------------------------------
/data/backgrid.yml:
--------------------------------------------------------------------------------
1 | title: Backgrid.js
2 | homeUrl: http://backgridjs.com/
3 | demoUrl: http://backgridjs.com/#basic-example
4 | githubRepo: cloudflarearchive/backgrid
5 | npmPackage: backgrid
6 | license: MIT License
7 | revenueModel: Free
8 | description: >
9 | JqGrid is an Ajax-enabled JavaScript control that provides solutions for
10 | representing and manipulating tabular data on the web.
11 | frameworks:
12 | jquery: true
13 | features:
14 | accessible: true
15 | copyPaste: false
16 | csvExport: false
17 | customEditors: false
18 | customFormatters: true
19 | draggableRows: false
20 | editable: true
21 | fillDown: false
22 | fillRight: false
23 | filtering: false
24 | formulas: false
25 | freezableCols: false
26 | headless: false
27 | i18n: false
28 | maintained: false
29 | mergeCells: false
30 | openSource: true
31 | pagination: "With extension"
32 | pdfExport: false
33 | pivots: false
34 | rangeSelection: false
35 | resizableCols: false
36 | responsive: false
37 | rowGrouping: false
38 | rowSelection: false
39 | serverSide: false
40 | sorting: true
41 | trees: false
42 | typescript: Third-party types available via DefinitelyTyped
43 | xlsxExport: false
44 | virtualization: false
45 |
--------------------------------------------------------------------------------
/data/bryntum-grid.yml:
--------------------------------------------------------------------------------
1 | title: Bryntum Grid
2 | homeUrl: https://www.bryntum.com/products/grid/
3 | demoUrl: https://www.bryntum.com/examples/grid/
4 | githubRepo: null
5 | npmPackage: null
6 | license: Custom License
7 | revenueModel: Commercial with Trial
8 | description: >
9 | The Bryntum Grid is a powerful and high performance table component for the
10 | web. Since it is built with pure JavaScript, it works with the framework
11 | you are already using.
12 | frameworks:
13 | vanilla: true
14 | angular: true
15 | react: true
16 | vue: true
17 | features:
18 | accessible: false
19 | copyPaste: false
20 | csvExport: false
21 | customEditors: true
22 | customFormatters: true
23 | draggableRows: true
24 | editable: true
25 | fillDown: false
26 | fillRight: false
27 | filtering: true
28 | formulas: false
29 | freezableCols: true
30 | headless: false
31 | i18n: true
32 | maintained: true
33 | mergeCells: false
34 | openSource: false
35 | pagination: true
36 | pdfExport: true
37 | pivots: false
38 | rangeSelection: true
39 | resizableCols: true
40 | responsive: true
41 | rowGrouping: true
42 | rowSelection: false
43 | serverSide: true
44 | sorting: true
45 | trees: true
46 | xlsxExport: true
47 | virtualization: true
48 |
--------------------------------------------------------------------------------
/data/canvas-datagrid.yml:
--------------------------------------------------------------------------------
1 | title: canvas-datagrid
2 | homeUrl: https://canvas-datagrid.js.org/#readme
3 | demoUrl: https://canvas-datagrid.js.org/examples
4 | githubRepo: TonyGermaneri/canvas-datagrid
5 | npmPackage: canvas-datagrid
6 | license: BSD 3-Clause License
7 | revenueModel: Free
8 | description: >
9 | Excel-like data grid with a rich API, extensible styling, small file size,
10 | and native support for touch devices. Single canvas element, drawn in
11 | immediate mode, data size does not impact performance. W3C Web Component
12 | and works in all frameworks.
13 | frameworks:
14 | angular: https://canvas-datagrid.js.org/#more-demos
15 | jquery: https://canvas-datagrid.js.org/#more-demos
16 | react: https://canvas-datagrid.js.org/reactExample.html
17 | vanilla: true
18 | vue: https://canvas-datagrid.js.org/vueExample.html
19 | features:
20 | accessible: true
21 | copyPaste: true
22 | csvExport: false
23 | customEditors: false
24 | customFormatters: Formatters can format plain text only.
25 | draggableRows: true
26 | editable: true
27 | fillDown: false
28 | fillRight: false
29 | filtering: true
30 | formulas: false
31 | freezableCols: true
32 | headless: false
33 | i18n: false
34 | maintained: true
35 | mergeCells: false
36 | openSource: true
37 | pagination: true
38 | pdfExport: false
39 | pivots: false
40 | rangeSelection: true
41 | resizableCols: true
42 | responsive: false
43 | rowGrouping: false
44 | rowSelection: true
45 | serverSide: false
46 | sorting: true
47 | trees: false
48 | xlsxExport: false
49 | virtualization: true
50 |
--------------------------------------------------------------------------------
/data/cheetah-grid.yml:
--------------------------------------------------------------------------------
1 | title: Cheetah Grid
2 | homeUrl: https://future-architect.github.io/cheetah-grid/
3 | demoUrl: https://future-architect.github.io/cheetah-grid/#/
4 | githubRepo: future-architect/cheetah-grid
5 | npmPackage: cheetah-grid
6 | license: MIT
7 | revenueModel: Free
8 | description: High-performance JavaScript data table component that works on canvas. Designed for handling large datasets with 1M+ records efficiently through canvas-based rendering.
9 | frameworks:
10 | react: true
11 | svelte: false
12 | vue: true
13 | angular: true
14 | ember: false
15 | jquery: false
16 | vanilla: true
17 | features:
18 | accessible: false
19 | copyPaste: false
20 | csvExport: false
21 | customEditors: true
22 | customFormatters: true
23 | draggableRows: false
24 | editable: true
25 | fillDown: false
26 | fillRight: false
27 | filtering: true
28 | formulas: false
29 | freezableCols: true
30 | headless: false
31 | i18n: false
32 | maintained: true
33 | mergeCells: false
34 | openSource: true
35 | pagination: false
36 | pdfExport: false
37 | pivots: false
38 | rangeSelection: false
39 | resizableCols: true
40 | responsive: false
41 | rowGrouping: false
42 | rowSelection: true
43 | search: false
44 | serverSide: false
45 | sorting: true
46 | trees: false
47 | typescript: true
48 | xlsxExport: false
49 | virtualization: true
50 |
--------------------------------------------------------------------------------
/data/clusterize.yml:
--------------------------------------------------------------------------------
1 | title: Clusterize.js
2 | homeUrl: https://clusterize.js.org/
3 | demoUrl: https://clusterize.js.org/
4 | githubRepo: NeXTs/Clusterize.js
5 | npmPackage: clusterize.js
6 | license: GPLv3 or Commercial License
7 | revenueModel: Free for Personal Use
8 | description: >
9 | A fast, tiny plugin for vanilla JavaScript to display large data sets easily.
10 | frameworks:
11 | vanilla: true
12 | vue: https://www.npmjs.com/package/vue-clusterize
13 | react: https://www.npmjs.com/package/react-clusterize
14 | features:
15 | accessible: false
16 | copyPaste: false
17 | csvExport: false
18 | customEditors: false
19 | customFormatters: false
20 | draggableRows: false
21 | editable: false
22 | fillDown: false
23 | fillRight: false
24 | filtering: false
25 | formulas: false
26 | freezableCols: false
27 | headless: Optional
28 | i18n: false
29 | maintained: false
30 | mergeCells: false
31 | openSource: true
32 | pagination: false
33 | pdfExport: false
34 | pivots: false
35 | rangeSelection: false
36 | resizableCols: false
37 | responsive: false
38 | rowGrouping: false
39 | rowSelection: false
40 | serverSide: false
41 | sorting: false
42 | trees: false
43 | xlsxExport: false
44 | virtualization: true
45 |
--------------------------------------------------------------------------------
/data/datagridxl.yml:
--------------------------------------------------------------------------------
1 | title: DataGridXL
2 | homeUrl: https://www.datagridxl.com/
3 | demoUrl: https://www.datagridxl.com/demos/
4 | githubRepo: DataGridXL/DataGridXL2
5 | npmPackage: null
6 | license: Custom License
7 | revenueModel: Free for Personal Use
8 | description: >
9 | No-nonsense super fast Excel-like data grid library with support for up to 1 million cells.
10 | frameworks:
11 | vanilla: true
12 | react: https://www.datagridxl.com/docs/react
13 | vue: https://www.datagridxl.com/docs/vue
14 | angular: https://www.datagridxl.com/docs/angular
15 | features:
16 | accessible: false
17 | copyPaste: true
18 | csvExport: false
19 | customEditors: false
20 | customFormatters: false
21 | draggableRows: true
22 | editable: true
23 | fillDown: true
24 | fillRight: true
25 | filtering: false
26 | formulas: false
27 | freezableCols: false
28 | headless: false
29 | i18n: true
30 | maintained: true
31 | mergeCells: false
32 | openSource: false
33 | pagination: false
34 | pdfExport: false
35 | pivots: false
36 | rangeSelection: true
37 | resizableCols: true
38 | responsive: true
39 | rowGrouping: false
40 | rowSelection: true
41 | serverSide: false
42 | sorting: true
43 | trees: false
44 | xlsxExport: false
45 | virtualization: true
46 |
--------------------------------------------------------------------------------
/data/datatables.yml:
--------------------------------------------------------------------------------
1 | title: DataTables
2 | homeUrl: https://www.datatables.net/
3 | demoUrl: https://www.datatables.net/examples/index
4 | githubRepo: DataTables/DataTables
5 | npmPackage: datatables
6 | license: MIT License
7 | revenueModel: Premium Support
8 | description: >
9 | A highly flexible tool, built upon the foundations of progressive
10 | enhancement, that adds all of these advanced features to any HTML table.
11 | frameworks:
12 | jquery: true
13 | react: https://www.npmjs.com/package/datatables-react
14 | angular: https://www.npmjs.com/package/angular-datatables
15 | features:
16 | accessible: true
17 | copyPaste: false
18 | csvExport: false
19 | customEditors: false
20 | customFormatters: true
21 | draggableRows: false
22 | editable: With inline form elements or modal
23 | fillDown: false
24 | fillRight: false
25 | filtering: true
26 | formulas: false
27 | freezableCols: false
28 | headless: Optional
29 | i18n: true
30 | maintained: true
31 | mergeCells: false
32 | openSource: true
33 | pagination: true
34 | pdfExport: false
35 | pivots: false
36 | rangeSelection: false
37 | resizableCols: false
38 | responsive: true
39 | rowGrouping: true
40 | rowSelection: false
41 | serverSide: true
42 | sorting: true
43 | trees: false
44 | typescript: Third-party types available via DefinitelyTyped
45 | xlsxExport: false
46 | virtualization: true
47 |
--------------------------------------------------------------------------------
/data/devextreme.yml:
--------------------------------------------------------------------------------
1 | title: DevExtreme
2 | homeUrl: https://js.devexpress.com/Overview/DataGrid/
3 | demoUrl: https://js.devexpress.com/Demos/WidgetsGallery/Demo/DataGrid/Overview/jQuery/Light/
4 | githubRepo:
5 | npmPackage:
6 | license: Custom License
7 | revenueModel: Free for Personal Use
8 | description: >
9 | Built for speed and ready to tackle your toughest business challenge.
10 | With integrated server-side support for data filtering, paging, sorting, record grouping, and summary
11 | computations extremely large datasets are never an issue for the DevExtreme Data Grid.
12 | frameworks:
13 | vanilla: true
14 | react: https://devexpress.github.io/devextreme-reactive/react/grid/
15 | angular: true
16 | vue: true
17 | features:
18 | accessible: true
19 | copyPaste: false
20 | csvExport: false
21 | customEditors: true
22 | customFormatters: true
23 | draggableRows: true
24 | editable: true
25 | fillDown: false
26 | fillRight: false
27 | filtering: true
28 | formulas: false
29 | freezableCols: true
30 | i18n: true
31 | maintained: true
32 | mergeCells: false
33 | openSource: false
34 | pagination: true
35 | pdfExport: true
36 | pivots: Separate component, see https://js.devexpress.com/Documentation/Guide/UI_Components/PivotGrid
37 | rangeSelection: false
38 | resizableCols: true
39 | responsive: false
40 | rowGrouping: true
41 | rowSelection: true
42 | serverSide: true
43 | sorting: true
44 | trees: Separate component, see https://js.devexpress.com/Documentation/Guide/UI_Components/TreeList/Getting_Started_with_TreeList/
45 | typescript: true
46 | xlsxExport: true
47 | virtualization: true
48 |
--------------------------------------------------------------------------------
/data/dgrid.yml:
--------------------------------------------------------------------------------
1 | title: dGrid
2 | homeUrl: https://dgrid.io/
3 | demoUrl: null
4 | githubRepo: dojo/dojo1-dgrid
5 | npmPackage: dgrid
6 | license: BSD
7 | revenueModel: Free
8 | description: Next-generation grid component that takes full advantage of modern browsers and object stores. Lightweight, modular, and easily extensible, built by SitePen for the Dojo ecosystem.
9 |
10 | frameworks:
11 | react: false
12 | svelte: false
13 | vue: false
14 | angular: false
15 | ember: false
16 | jquery: false
17 | vanilla: true
18 |
19 | features:
20 | accessible: true
21 | copyPaste: false
22 | csvExport: false
23 | customEditors: true
24 | customFormatters: true
25 | draggableRows: false
26 | editable: true
27 | fillDown: false
28 | fillRight: false
29 | filtering: false
30 | formulas: false
31 | freezableCols: true
32 | headless: false
33 | i18n: false
34 | maintained: false
35 | mergeCells: false
36 | openSource: true
37 | pagination: true
38 | pdfExport: false
39 | pivots: false
40 | rangeSelection: false
41 | resizableCols: true
42 | responsive: true
43 | rowGrouping: false
44 | rowSelection: true
45 | search: false
46 | serverSide: true
47 | sorting: true
48 | trees: true
49 | typescript: false
50 | xlsxExport: false
51 | virtualization: true
52 |
--------------------------------------------------------------------------------
/data/dhtmlx-grid.yml:
--------------------------------------------------------------------------------
1 | title: DHTMLX Grid
2 | homeUrl: https://dhtmlx.com/docs/products/
3 | demoUrl: https://dhtmlx.com/docs/products/
4 | githubRepo: null
5 | npmPackage: null
6 | license: Commercial
7 | revenueModel: Commercial
8 | description: Professional JavaScript data grid widget by DHTMLX. Feature-rich grid component with advanced data management capabilities, export functionality, and extensive customization options for enterprise applications.
9 |
10 | frameworks:
11 | react: true
12 | svelte: false
13 | vue: true
14 | angular: true
15 | ember: false
16 | jquery: false
17 | vanilla: true
18 |
19 | features:
20 | accessible: false
21 | copyPaste: true
22 | csvExport: true
23 | customEditors: true
24 | customFormatters: true
25 | draggableRows: true
26 | editable: true
27 | fillDown: false
28 | fillRight: false
29 | filtering: true
30 | formulas: false
31 | freezableCols: true
32 | headless: false
33 | i18n: false
34 | maintained: true
35 | mergeCells: false
36 | openSource: false
37 | pagination: true
38 | pdfExport: true
39 | pivots: false
40 | rangeSelection: true
41 | resizableCols: true
42 | responsive: true
43 | rowGrouping: true
44 | rowSelection: true
45 | search: true
46 | serverSide: true
47 | sorting: true
48 | trees: false
49 | typescript: false
50 | xlsxExport: true
51 | virtualization: true
52 |
--------------------------------------------------------------------------------
/data/ember-table.yml:
--------------------------------------------------------------------------------
1 | title: Ember Table
2 | homeUrl: https://opensource.addepar.com/ember-table
3 | demoUrl: https://opensource.addepar.com/ember-table/docs/guides/main/basic-table
4 | githubRepo: Addepar/ember-table
5 | npmPackage: ember-table
6 | license: MIT License
7 | revenueModel: Free
8 | description: >
9 | An addon to support large data set and a number of features around table.
10 | Ember Table can handle over 100,000 rows without any rendering or
11 | performance issue.
12 | frameworks:
13 | ember: true
14 | features:
15 | accessible: true
16 | copyPaste: false
17 | csvExport: false
18 | customEditors: false
19 | customFormatters: true
20 | draggableRows: false
21 | editable: false
22 | fillDown: false
23 | fillRight: false
24 | filtering: false
25 | formulas: false
26 | freezableCols: false
27 | headless: false
28 | i18n: false
29 | maintained: true
30 | mergeCells: false
31 | openSource: true
32 | pagination: false
33 | pdfExport: false
34 | pivots: false
35 | rangeSelection: false
36 | resizableCols: true
37 | responsive: false
38 | rowGrouping: false
39 | rowSelection: true
40 | serverSide: false
41 | sorting: true
42 | trees: true
43 | xlsxExport: false
44 | virtualization: false
45 |
--------------------------------------------------------------------------------
/data/fancygrid.yml:
--------------------------------------------------------------------------------
1 | title: FancyGrid
2 | homeUrl: https://fancygrid.com/
3 | demoUrl: https://fancygrid.com/gallery/
4 | githubRepo: FancyGrid/FancyGrid
5 | npmPackage: fancygrid
6 | license: Custom License
7 | revenueModel: Commercial 60-day Trial
8 | description: >
9 | JavaScript grid library with charts integration and server communication.
10 | frameworks:
11 | angular: true
12 | react: true
13 | vanilla: true
14 | vue: true
15 | features:
16 | accessible: false
17 | copyPaste: true
18 | csvExport: true
19 | customEditors: true
20 | customFormatters: true
21 | draggableRows: true
22 | editable: true
23 | fillDown: false
24 | fillRight: false
25 | filtering: true
26 | formulas: false
27 | freezableCols: true
28 | headless: false
29 | i18n: true
30 | maintained: true
31 | mergeCells: false
32 | openSource: true
33 | pagination: true
34 | pdfExport: false
35 | pivots: false
36 | rangeSelection: true
37 | resizableCols: true
38 | responsive: true
39 | rowGrouping: true
40 | rowSelection: true
41 | serverSide: true
42 | sorting: true
43 | trees: true
44 | typescript: true
45 | xlsxExport: true
46 | virtualization: true
47 |
--------------------------------------------------------------------------------
/data/flexmonster.yml:
--------------------------------------------------------------------------------
1 | title: Flexmonster
2 | homeUrl: https://www.flexmonster.com/
3 | demoUrl: https://www.flexmonster.com/demos/
4 | githubRepo: null
5 | npmPackage: flexmonster
6 | license: Custom License
7 | revenueModel: Commercial 30-day Trial
8 | description: >
9 | The most powerful JavaScript tool for visualizing your business data.
10 | frameworks:
11 | angular: true
12 | react: true
13 | vanilla: true
14 | vue: true
15 | features:
16 | accessible: false
17 | copyPaste: true
18 | csvExport: true
19 | customEditors: false
20 | customFormatters: true
21 | draggableRows: false
22 | editable: false
23 | fillDown: false
24 | fillRight: false
25 | filtering: true
26 | formulas: true
27 | freezableCols: true
28 | headless: false
29 | i18n: true
30 | maintained: true
31 | mergeCells: false
32 | openSource: "Framework-specific additions are open-source but the core library is not."
33 | pagination: false
34 | pdfExport: true
35 | pivots: true
36 | rangeSelection: false
37 | resizableCols: true
38 | responsive: false
39 | rowGrouping: false
40 | rowSelection: false
41 | serverSide: true
42 | sorting: true
43 | trees: true
44 | typescript: true
45 | xlsxExport: true
46 | virtualization: true
47 |
--------------------------------------------------------------------------------
/data/frappe-datatable.yml:
--------------------------------------------------------------------------------
1 | title: Frappe DataTable
2 | homeUrl: https://frappe.io/datatable
3 | demoUrl: https://frappe.io/datatable
4 | githubRepo: frappe/datatable
5 | npmPackage: frappe-datatable
6 | license: MIT
7 | revenueModel: Free
8 | description: Modern datatable library for the web. Built by Frappe Technologies for ERPNext, it's a simple, modern and interactive datatable library for displaying tabular data with no jQuery dependency.
9 |
10 | frameworks:
11 | react: false
12 | svelte: false
13 | vue: false
14 | angular: false
15 | ember: false
16 | jquery: false
17 | vanilla: true
18 |
19 | features:
20 | accessible: false
21 | copyPaste: false
22 | csvExport: false
23 | customEditors: false
24 | customFormatters: true
25 | draggableRows: false
26 | editable: true
27 | fillDown: false
28 | fillRight: false
29 | filtering: true
30 | formulas: false
31 | freezableCols: false
32 | headless: false
33 | i18n: false
34 | maintained: true
35 | mergeCells: false
36 | openSource: true
37 | pagination: false
38 | pdfExport: false
39 | pivots: false
40 | rangeSelection: false
41 | resizableCols: true
42 | responsive: true
43 | rowGrouping: false
44 | rowSelection: true
45 | search: false
46 | serverSide: false
47 | sorting: true
48 | trees: true
49 | typescript: false
50 | xlsxExport: false
51 | virtualization: false
52 |
--------------------------------------------------------------------------------
/data/functional-data-grid.yml:
--------------------------------------------------------------------------------
1 | title: Functional Data Grid
2 | homeUrl: https://github.com/energydrink9/functional-data-grid
3 | demoUrl: https://energydrink9.github.io/functional-data-grid-examples/
4 | githubRepo: energydrink9/functional-data-grid
5 | npmPackage: functional-data-grid
6 | license: MIT License
7 | revenueModel: Donations
8 | description: >
9 | This is a library made with React and React-Virtualized for creating rich
10 | data grids. It's really fast and is being used in production with tens of
11 | thousands of elements.
12 | frameworks:
13 | react: true
14 | features:
15 | accessible: false
16 | copyPaste: false
17 | csvExport: false
18 | customEditors: false
19 | customFormatters: true
20 | draggableRows: false
21 | editable: false
22 | fillDown: false
23 | fillRight: false
24 | filtering: true
25 | formulas: false
26 | freezableCols: false
27 | headless: false
28 | i18n: false
29 | maintained: true
30 | mergeCells: false
31 | openSource: true
32 | pagination: false
33 | pdfExport: false
34 | pivots: false
35 | rangeSelection: false
36 | resizableCols: true
37 | responsive: false
38 | rowGrouping: true
39 | rowSelection: false
40 | serverSide: false
41 | sorting: true
42 | trees: false
43 | xlsxExport: false
44 | virtualization: true
45 |
--------------------------------------------------------------------------------
/data/glide-data-grid.yml:
--------------------------------------------------------------------------------
1 | title: Glide Data Grid
2 | homeUrl: https://grid.glideapps.com/
3 | demoUrl: https://quicktype.github.io/glide-data-grid/?path=/story/glide-data-grid-docs--getting-started
4 | githubRepo: glideapps/glide-data-grid
5 | npmPackage: "@glideapps/glide-data-grid"
6 | license: MIT License
7 | revenueModel: Free
8 | description: >
9 | Glide Data Grid is a no compromise, outrageously fast data grid for your React project, with rich rendering and TypeScript support.
10 | frameworks:
11 | react: true
12 | features:
13 | accessible: true
14 | copyPaste: true
15 | csvExport: false
16 | customEditors: true
17 | customFormatters: true
18 | draggableRows: true
19 | editable: true
20 | fillDown: true
21 | fillRight: true
22 | filtering: false
23 | formulas: false
24 | freezableCols: true
25 | headless: false
26 | i18n: true
27 | maintained: true
28 | mergeCells: Partial (column spanning but not row spanning)
29 | openSource: true
30 | pagination: false
31 | pdfExport: false
32 | pivots: false
33 | rangeSelection: true
34 | resizableCols: true
35 | responsive: true
36 | rowGrouping: false
37 | rowSelection: true
38 | search: true
39 | serverSide: true
40 | sorting: true
41 | trees: false
42 | typescript: true
43 | xlsxExport: false
44 | virtualization: true
45 |
--------------------------------------------------------------------------------
/data/grid-js.yml:
--------------------------------------------------------------------------------
1 | title: Grid.js
2 | homeUrl: https://gridjs.io/
3 | demoUrl: https://gridjs.io/docs/examples/hello-world/
4 | githubRepo: grid-js/gridjs
5 | npmPackage: gridjs
6 | ignoreBundlephobia: true
7 | license: MIT License
8 | revenueModel: Free
9 | description: >
10 | Grid.js is a free and open-source HTML table plugin written in TypeScript.
11 | frameworks:
12 | vanilla: true
13 | react: true
14 | features:
15 | accessible: true
16 | copyPaste: false
17 | csvExport: false
18 | customEditors: false
19 | customFormatters: false
20 | draggableRows: false
21 | editable: false
22 | fillDown: false
23 | fillRight: false
24 | filtering: false
25 | formulas: false
26 | freezableCols: false
27 | headless: false
28 | i18n: false
29 | maintained: true
30 | mergeCells: false
31 | openSource: true
32 | pagination: true
33 | pdfExport: false
34 | pivots: false
35 | rangeSelection: false
36 | resizableCols: false
37 | responsive: true
38 | rowGrouping: false
39 | rowSelection: false
40 | serverSide: true
41 | sorting: true
42 | trees: false
43 | typescript: true
44 | xlsxExport: false
45 | virtualization: false
46 |
--------------------------------------------------------------------------------
/data/handsontable.yml:
--------------------------------------------------------------------------------
1 | title: Handsontable
2 | homeUrl: https://handsontable.com
3 | demoUrl: https://handsontable.com/examples
4 | githubRepo: handsontable/handsontable
5 | npmPackage: handsontable
6 | license: Custom License
7 | revenueModel: Free for Personal Use
8 | description: >
9 | JavaScript data grid that looks and feels like a spreadsheet. Minimalistic,
10 | Excel-like grid component for web apps.
11 | frameworks:
12 | angular: true
13 | react: true
14 | vanilla: true
15 | vue: true
16 | features:
17 | accessible: false
18 | copyPaste: true
19 | csvExport: true
20 | customEditors: true
21 | customFormatters: true
22 | draggableRows: true
23 | editable: true
24 | fillDown: true
25 | fillRight: true
26 | filtering: true
27 | formulas: false
28 | freezableCols: true
29 | headless: false
30 | i18n: true
31 | maintained: true
32 | mergeCells: true
33 | openSource: true
34 | pagination: false
35 | pdfExport: false
36 | pivots: false
37 | rangeSelection: true
38 | resizableCols: true
39 | responsive: false
40 | rowGrouping: false
41 | rowSelection: true
42 | serverSide: false
43 | sorting: true
44 | trees: false
45 | xlsxExport: false
46 | virtualization: true
47 |
--------------------------------------------------------------------------------
/data/ipgrid.yml:
--------------------------------------------------------------------------------
1 | title: ipgrid
2 | homeUrl: http://www.inspireproduction.co.za/
3 | demoUrl: http://www.inspireproduction.co.za/#/demo-ui/jquery-spreadsheet
4 | githubRepo: marzsocks/ipgrid
5 | npmPackage: null
6 | license: MIT License
7 | revenueModel: Donations
8 | description: >
9 | Spreadsheet is a fully functional native javascript spreadsheet. It is
10 | inspired by Google sheets, shares similar functionality, but is 100%
11 | original hand coded.
12 | frameworks:
13 | jquery: true
14 | features:
15 | accessible: true
16 | copyPaste: false
17 | csvExport: false
18 | customEditors: false
19 | customFormatters: true
20 | draggableRows: true
21 | editable: true
22 | fillDown: false
23 | fillRight: false
24 | filtering: false
25 | formulas: true
26 | freezableCols: false
27 | headless: false
28 | i18n: false
29 | maintained: false
30 | mergeCells: false
31 | openSource: true
32 | pagination: false
33 | pdfExport: false
34 | pivots: false
35 | rangeSelection: true
36 | resizableCols: true
37 | responsive: false
38 | rowGrouping: true
39 | rowSelection: true
40 | serverSide: false
41 | sorting: true
42 | trees: false
43 | xlsxExport: false
44 | virtualization: true
45 |
--------------------------------------------------------------------------------
/data/jqgrid.yml:
--------------------------------------------------------------------------------
1 | title: jqGrid
2 | homeUrl: http://guriddo.net/
3 | demoUrl: http://guriddo.net/?page_id=119
4 | githubRepo: tonytomov/jqGrid
5 | npmPackage: jqGrid
6 | ignoreBundlephobia: true
7 | license: CC-BY-NC-3.0 or Commerical License
8 | revenueModel: Free for Personal Use / Commercial License
9 | description: >
10 | JqGrid is an Ajax-enabled JavaScript control that provides solutions for
11 | representing and manipulating tabular data on the web.
12 | frameworks:
13 | jquery: true
14 | features:
15 | accessible: true
16 | copyPaste: true
17 | csvExport: true
18 | customEditors: false
19 | customFormatters: true
20 | draggableRows: true
21 | editable: true
22 | fillDown: false
23 | fillRight: false
24 | filtering: true
25 | formulas: false
26 | freezableCols: false
27 | headless: false
28 | i18n: false
29 | maintained: true
30 | mergeCells: false
31 | openSource: true
32 | pagination: true
33 | pdfExport: false
34 | pivots: true
35 | rangeSelection: false
36 | resizableCols: true
37 | responsive: false
38 | rowGrouping: true
39 | rowSelection: true
40 | serverSide: true
41 | sorting: true
42 | trees: "With limited levels of depth"
43 | xlsxExport: true
44 | virtualization: true
45 |
--------------------------------------------------------------------------------
/data/jqwidgets.yml:
--------------------------------------------------------------------------------
1 | title: jQWidgets
2 | homeUrl: https://www.jqwidgets.com/
3 | demoUrl: https://www.jqwidgets.com/jquery-widgets-demo/demos/jqxgrid/index.htm
4 | githubRepo: jqwidgets/jQWidgets
5 | npmPackage: null
6 | license: Commercial or Creative Commons (Non-Commercial)
7 | revenueModel: Commercial License Required for Commercial Use
8 | description: >
9 | A comprehensive JavaScript UI library with 70+ widgets built entirely
10 | from scratch. Features a powerful jQuery Grid widget with advanced data
11 | visualization, editing, sorting, filtering, and grouping capabilities.
12 | Works across devices and browsers with professional themes and
13 | localization support.
14 | frameworks:
15 | jquery: true
16 | angular: true
17 | react: true
18 | vue: true
19 | vanilla: true
20 | features:
21 | accessible: true
22 | copyPaste: true
23 | csvExport: true
24 | customEditors: true
25 | customFormatters: true
26 | draggableRows: true
27 | editable: true
28 | fillDown: false
29 | fillRight: false
30 | filtering: true
31 | formulas: false
32 | freezableCols: true
33 | headless: false
34 | i18n: true
35 | maintained: true
36 | mergeCells: false
37 | openSource: false
38 | pagination: true
39 | pdfExport: true
40 | pivots: false
41 | rangeSelection: true
42 | resizableCols: true
43 | responsive: true
44 | rowGrouping: true
45 | rowSelection: true
46 | search: true
47 | serverSide: true
48 | sorting: true
49 | trees: true
50 | typescript: true
51 | xlsxExport: true
52 | virtualization: true
53 |
--------------------------------------------------------------------------------
/data/jspreadsheet-ce.yml:
--------------------------------------------------------------------------------
1 | title: Jspreadsheet CE
2 | homeUrl: https://bossanova.uk/jspreadsheet/v4
3 | demoUrl: https://bossanova.uk/jspreadsheet/v4/examples
4 | githubRepo: jspreadsheet/ce
5 | npmPackage: jspreadsheet-ce
6 | license: MIT License
7 | revenueModel: Free
8 | description: >
9 | Jspreadsheet CE (formerly Jexcel) is a lightweight vanilla javascript plugin to
10 | create amazing web-based online interactive tables and spreadsheets
11 | compatible with other spreadsheet softwares.
12 | frameworks:
13 | vanilla: true
14 | react: true
15 | angular: true
16 | vue: true
17 | jquery: true
18 | features:
19 | accessible: false
20 | copyPaste: true
21 | csvExport: true
22 | customEditors: true
23 | customFormatters: true
24 | draggableRows: true
25 | editable: true
26 | fillDown: true
27 | fillRight: true
28 | filtering: true
29 | formulas: true
30 | freezableCols: true
31 | headless: false
32 | i18n: false
33 | maintained: true
34 | mergeCells: false
35 | openSource: true
36 | pagination: true
37 | pdfExport: false
38 | pivots: false
39 | rangeSelection: true
40 | resizableCols: true
41 | responsive: false
42 | rowGrouping: false
43 | rowSelection: true
44 | search: true
45 | serverSide: false
46 | sorting: true
47 | trees: false
48 | typescript: Third-party types available via DefinitelyTyped
49 | xlsxExport: true
50 | virtualization: "Only lazy-loading of rows."
51 |
--------------------------------------------------------------------------------
/data/jspreadsheet-pro.yml:
--------------------------------------------------------------------------------
1 | title: Jspreadsheet Pro
2 | homeUrl: https://jspreadsheet.com
3 | demoUrl: https://jspreadsheet.com/demo
4 | githubRepo: jspreadsheet/pro
5 | npmPackage: jspreadsheet
6 | license: Commercial License
7 | revenueModel: Subscription or One-Time Fee
8 | description: >
9 | Jspreadsheet is a lightweight Vanilla JavaScript plugin that help developers to create exceptional web-based interactive data grid with spreadsheet controls.
10 | frameworks:
11 | vanilla: true
12 | react: true
13 | angular: true
14 | vue: true
15 | jquery: true
16 | features:
17 | accessible: false
18 | copyPaste: true
19 | csvExport: true
20 | customEditors: true
21 | customFormatters: true
22 | draggableRows: true
23 | editable: true
24 | fillDown: true
25 | fillRight: true
26 | filtering: true
27 | formulas: true
28 | freezableCols: true
29 | headless: true
30 | i18n: false
31 | maintained: true
32 | mergeCells: false
33 | openSource: false
34 | pagination: true
35 | pdfExport: true
36 | pivots: true
37 | rangeSelection: true
38 | resizableCols: true
39 | responsive: true
40 | rowGrouping: true
41 | rowSelection: true
42 | serverSide: false
43 | sorting: true
44 | trees: false
45 | typescript: true
46 | xlsxExport: true
47 | virtualization: true
48 |
--------------------------------------------------------------------------------
/data/jtable.yml:
--------------------------------------------------------------------------------
1 | title: jTable
2 | homeUrl: http://www.jtable.org/
3 | demoUrl: http://www.jtable.org/Demo
4 | githubRepo: volosoft/jtable
5 | npmPackage: jtable
6 | license: MIT License
7 | revenueModel: Free
8 | description: >
9 | jTable is a jQuery plugin that is used to create AJAX based CRUD tables without coding HTML or Javascript.
10 | frameworks:
11 | jquery: true
12 | features:
13 | accessible: true
14 | copyPaste: false
15 | csvExport: false
16 | customEditors: false
17 | customFormatters: false
18 | draggableRows: false
19 | editable: "With modal dialog"
20 | fillDown: false
21 | fillRight: false
22 | filtering: true
23 | formulas: false
24 | freezableCols: false
25 | headless: false
26 | i18n: true
27 | maintained: false
28 | mergeCells: false
29 | openSource: true
30 | pagination: true
31 | pdfExport: false
32 | pivots: false
33 | rangeSelection: false
34 | resizableCols: true
35 | responsive: false
36 | rowGrouping: false
37 | rowSelection: false
38 | serverSide: true
39 | sorting: true
40 | trees: false
41 | xlsxExport: false
42 | virtualization: false
43 |
--------------------------------------------------------------------------------
/data/kendo-ui-angular.yml:
--------------------------------------------------------------------------------
1 | title: Kendo UI for Angular
2 | homeUrl: https://www.telerik.com/kendo-angular-ui/components/grid/
3 | demoUrl: https://www.telerik.com/kendo-angular-ui/components/grid/
4 | githubRepo: telerik/kendo-angular
5 | npmPackage: "@progress/kendo-angular-grid"
6 | license: Custom License
7 | revenueModel: Commercial 30-day Trial
8 | description: >
9 | The Kendo UI for Angular Data Grid (Table) provides 100+ ready-to-use features
10 | covering everything from paging, sorting, filtering, editing, and grouping
11 | to row and column virtualization, export to PDF and Excel and
12 | accessibility.
13 | frameworks:
14 | angular: true
15 | features:
16 | accessible: true
17 | copyPaste: false
18 | csvExport: false
19 | customEditors: true
20 | customFormatters: true
21 | draggableRows: false
22 | editable: true
23 | fillDown: false
24 | fillRight: false
25 | filtering: true
26 | formulas: false
27 | freezableCols: true
28 | headless: false
29 | i18n: true
30 | maintained: true
31 | mergeCells: false
32 | openSource: false
33 | pagination: true
34 | pdfExport: true
35 | pivots: false
36 | rangeSelection: false
37 | resizableCols: true
38 | responsive: true
39 | rowGrouping: true
40 | rowSelection: true
41 | serverSide: true
42 | sorting: true
43 | trees: A dedicated TreeList component is available for working with hierarchical data.
44 | typescript: true
45 | xlsxExport: true
46 | virtualization: true
47 |
--------------------------------------------------------------------------------
/data/kendo-ui-grid.yml:
--------------------------------------------------------------------------------
1 | title: Kendo UI Grid
2 | homeUrl: https://www.telerik.com/kendo-ui/grid
3 | demoUrl: https://demos.telerik.com/kendo-ui/grid/index
4 | githubRepo: telerik/kendo-ui-core
5 | npmPackage: "@progress/kendo-ui"
6 | license: Custom License
7 | revenueModel: Commercial 30-day Trial
8 | description: >
9 | Kendo UI's Responsive and Adaptive HTML5 Grid widget provides 100+
10 | ready-to-use features from paging, sorting, filtering, editing, grouping
11 | and group paging to row and column virtualization, export to PDF and Excel,
12 | accessibility, globalization and RTL support.
13 | frameworks:
14 | jquery: true
15 | features:
16 | accessible: true
17 | copyPaste: false
18 | csvExport: false
19 | customEditors: true
20 | customFormatters: true
21 | draggableRows: false
22 | editable: true
23 | fillDown: false
24 | fillRight: false
25 | filtering: true
26 | formulas: false
27 | freezableCols: true
28 | headless: false
29 | i18n: true
30 | maintained: true
31 | mergeCells: false
32 | openSource: false
33 | pagination: true
34 | pdfExport: true
35 | pivots: A dedicated PivotGrid widget is available for working with pivot tables.
36 | rangeSelection: true
37 | resizableCols: true
38 | responsive: true
39 | rowGrouping: true
40 | rowSelection: true
41 | serverSide: true
42 | sorting: true
43 | trees: A dedicated TreeList widget is available for working with hierarchical data.
44 | typescript: true
45 | xlsxExport: true
46 | virtualization: true
47 |
--------------------------------------------------------------------------------
/data/kendo-ui-spreadsheet.yml:
--------------------------------------------------------------------------------
1 | title: Kendo UI Spreadsheet
2 | homeUrl: https://www.telerik.com/kendo-ui/spreadsheet
3 | demoUrl: https://demos.telerik.com/kendo-ui/spreadsheet/index
4 | githubRepo: telerik/kendo-ui-core
5 | npmPackage: "@progress/kendo-ui"
6 | license: Custom License
7 | revenueModel: Commercial 30-day Trial
8 | description: >
9 | Kendo UI's Spreadsheet allows you to edit and visualize tabular data by
10 | using cell formatting options, styles, and themes. Sorting, filtering,
11 | export and import features are ready-to-use out of the box. You can bind to
12 | a data source, create custom editors, use cell comments, validation and
13 | much more.
14 | frameworks:
15 | jquery: true
16 | features:
17 | accessible: true
18 | copyPaste: true
19 | csvExport: true
20 | customEditors: true
21 | customFormatters: true
22 | draggableRows: false
23 | editable: true
24 | fillDown: true
25 | fillRight: true
26 | filtering: true
27 | formulas: true
28 | freezableCols: true
29 | headless: false
30 | i18n: true
31 | maintained: true
32 | mergeCells: false
33 | openSource: false
34 | pagination: false
35 | pdfExport: true
36 | pivots: A dedicated PivotGrid widget is available for working with pivot tables.
37 | rangeSelection: true
38 | resizableCols: true
39 | responsive: true
40 | rowGrouping: false
41 | rowSelection: true
42 | serverSide: true
43 | sorting: true
44 | trees: A dedicated TreeList widget is available for working with hierarchical data.
45 | typescript: true
46 | xlsxExport: true
47 | virtualization: false
48 |
--------------------------------------------------------------------------------
/data/kendo-ui-vue.yml:
--------------------------------------------------------------------------------
1 | title: Kendo UI for Vue
2 | homeUrl: https://www.telerik.com/kendo-vue-ui/components/grid/
3 | demoUrl: https://www.telerik.com/kendo-vue-ui/components/grid/
4 | githubRepo: telerik/kendo-vue
5 | npmPackage: "@progress/kendo-vue-grid"
6 | license: Custom License
7 | revenueModel: Commercial 30-day Trial
8 | description: >
9 | The Kendo UI for Vue Data Grid (Table) provides 100+ ready-to-use features
10 | covering everything from paging, sorting, filtering, editing, and grouping
11 | to row and column virtualization, export to PDF and Excel and
12 | accessibility.
13 | frameworks:
14 | vue: true
15 | features:
16 | accessible: true
17 | copyPaste: false
18 | csvExport: false
19 | customEditors: true
20 | customFormatters: true
21 | draggableRows: true
22 | editable: true
23 | fillDown: false
24 | fillRight: false
25 | filtering: true
26 | formulas: false
27 | freezableCols: true
28 | headless: false
29 | i18n: true
30 | maintained: true
31 | mergeCells: false
32 | openSource: false
33 | pagination: true
34 | pdfExport: true
35 | pivots: false
36 | rangeSelection: false
37 | resizableCols: true
38 | responsive: false
39 | rowGrouping: true
40 | rowSelection: true
41 | serverSide: true
42 | sorting: true
43 | trees: false
44 | typescript: true
45 | xlsxExport: true
46 | virtualization: true
47 |
--------------------------------------------------------------------------------
/data/kendoreact-data-grid.yml:
--------------------------------------------------------------------------------
1 | title: KendoReact Data Grid
2 | homeUrl: https://www.telerik.com/kendo-react-ui/components/grid/
3 | demoUrl: https://www.telerik.com/kendo-react-ui/components/grid/
4 | githubRepo: telerik/kendo-react
5 | npmPackage: "@progress/kendo-react-grid"
6 | license: Custom License
7 | revenueModel: Commercial 30-day Trial
8 | description: >
9 | The KendoReact Data Grid (Table) provides 100+ ready-to-use features
10 | covering everything from paging, sorting, filtering, editing, and grouping
11 | to row and column virtualization, export to PDF and Excel and
12 | accessibility.
13 | frameworks:
14 | react: true
15 | features:
16 | accessible: true
17 | copyPaste: false
18 | csvExport: false
19 | customEditors: true
20 | customFormatters: true
21 | draggableRows: true
22 | editable: true
23 | fillDown: false
24 | fillRight: false
25 | filtering: true
26 | formulas: false
27 | freezableCols: true
28 | headless: false
29 | i18n: true
30 | maintained: true
31 | mergeCells: false
32 | openSource: false
33 | pagination: true
34 | pdfExport: true
35 | pivots: false
36 | rangeSelection: false
37 | resizableCols: true
38 | responsive: false
39 | rowGrouping: true
40 | rowSelection: true
41 | serverSide: true
42 | sorting: true
43 | trees: A dedicated TreeList component is available for working with hierarchical data.
44 | typescript: true
45 | xlsxExport: true
46 | virtualization: true
47 |
--------------------------------------------------------------------------------
/data/lemonade-data-grid.yml:
--------------------------------------------------------------------------------
1 | title: Lemonade Data Grid
2 | homeUrl: https://lemonadejs.net/components/data-grid
3 | demoUrl: https://lemonadejs.net/components/data-grid#examples
4 | githubRepo: lemonadejs/data-grid
5 | npmPackage: "@lemonadejs/data-grid"
6 | license: MIT License
7 | revenueModel: Free
8 | description: >
9 | The LemonadeJS data grid is a lightweight and highly customizable JavaScript component that provides a solution for rendering data in rows and columns. It offers features like search, filter, pagination, and in-cell editing.
10 | frameworks:
11 | vanilla: true
12 | react: true
13 | jquery: true
14 | features:
15 | csvExport: true
16 | editable: true
17 | sorting: true
18 | formulas: true
19 | maintained: true
20 | mergeCells: false
21 | openSource: true
22 | pagination: true
23 | search: true
24 | typescript: true
25 |
--------------------------------------------------------------------------------
/data/luckysheet.yml:
--------------------------------------------------------------------------------
1 | title: Luckysheet
2 | homeUrl: https://dream-num.github.io/LuckysheetDocs/guide/
3 | demoUrl: https://dream-num.github.io/LuckysheetDemo/
4 | githubRepo: dream-num/Luckysheet
5 | npmPackage: luckysheet
6 | license: MIT License
7 | revenueModel: Free (Asks for sponsors)
8 | description: >
9 | Luckysheet is an online spreadsheet like excel that is powerful, simple to
10 | configure, and completely open source.
11 | frameworks:
12 | vanilla: true
13 | react: true
14 | angular: false
15 | vue: true
16 | features:
17 | accessible: false
18 | copyPaste: true
19 | csvExport: false
20 | customEditors: false
21 | customFormatters: false
22 | draggableRows: false
23 | editable: true
24 | fillDown: true
25 | fillRight: true
26 | filtering: true
27 | formulas: true
28 | freezableCols: false
29 | headless: false
30 | i18n: true
31 | maintained: true
32 | mergeCells: false
33 | openSource: true
34 | pagination: false
35 | pdfExport: false
36 | pivots: true
37 | rangeSelection: true
38 | resizableCols: true
39 | responsive: false
40 | rowGrouping: false
41 | rowSelection: true
42 | search: true
43 | serverSide: false
44 | sorting: true
45 | trees: false
46 | xlsxExport: With the Luckyexcel plugin
47 | virtualization: true
48 |
--------------------------------------------------------------------------------
/data/mantine-react-table.yml:
--------------------------------------------------------------------------------
1 | title: Mantine React Table
2 | homeUrl: https://www.mantine-react-table.com/
3 | demoUrl: https://www.mantine-react-table.com/docs/examples/basic
4 | githubRepo: KevinVandy/mantine-react-table
5 | npmPackage: mantine-react-table
6 | license: MIT License
7 | revenueModel: Free
8 | description: >
9 | A fully featured Mantine V7 implementation of TanStack React Table V8,
10 | forked from Material React Table. Built with Mantine components instead
11 | of Material UI, making it more suitable for Tailwind users and those
12 | preferring a more "pure" CSS component library.
13 | frameworks:
14 | react: true
15 | features:
16 | accessible: true
17 | copyPaste: true
18 | csvExport: true
19 | customEditors: true
20 | customFormatters: true
21 | draggableRows: true
22 | editable: true
23 | fillDown: false
24 | fillRight: false
25 | filtering: true
26 | formulas: false
27 | freezableCols: true
28 | headless: false
29 | i18n: true
30 | maintained: true
31 | mergeCells: false
32 | openSource: true
33 | pagination: true
34 | pdfExport: true
35 | pivots: false
36 | rangeSelection: true
37 | resizableCols: true
38 | responsive: true
39 | rowGrouping: true
40 | rowSelection: true
41 | search: true
42 | serverSide: true
43 | sorting: true
44 | trees: true
45 | typescript: true
46 | xlsxExport: true
47 | virtualization: true
48 |
--------------------------------------------------------------------------------
/data/material-react-table.yml:
--------------------------------------------------------------------------------
1 | title: Material React Table
2 | homeUrl: https://www.material-react-table.com/
3 | demoUrl: https://www.material-react-table.com/docs/examples/basic
4 | githubRepo: KevinVandy/material-react-table
5 | npmPackage: material-react-table
6 | license: MIT License
7 | revenueModel: Free
8 | description: >
9 | A fully featured Material UI V6 implementation of TanStack React Table V8,
10 | written from the ground up in TypeScript. Batteries-included React table
11 | library that attempts to provide all the table features you need while
12 | trying to stay highly performant and lightweight.
13 | frameworks:
14 | react: true
15 | features:
16 | accessible: true
17 | copyPaste: true
18 | csvExport: true
19 | customEditors: true
20 | customFormatters: true
21 | draggableRows: true
22 | editable: true
23 | fillDown: false
24 | fillRight: false
25 | filtering: true
26 | formulas: false
27 | freezableCols: true
28 | headless: false
29 | i18n: true
30 | maintained: true
31 | mergeCells: false
32 | openSource: true
33 | pagination: true
34 | pdfExport: true
35 | pivots: false
36 | rangeSelection: true
37 | resizableCols: true
38 | responsive: true
39 | rowGrouping: true
40 | rowSelection: true
41 | search: true
42 | serverSide: true
43 | sorting: true
44 | trees: true
45 | typescript: true
46 | xlsxExport: true
47 | virtualization: true
48 |
--------------------------------------------------------------------------------
/data/mui-x-datagrid.yml:
--------------------------------------------------------------------------------
1 | title: MUI X Data Grid
2 | homeUrl: https://mui.com/x/
3 | demoUrl: https://mui.com/x/react-data-grid/demo/
4 | githubRepo: mui/mui-x
5 | npmPackage: "@mui/x-data-grid"
6 | license: MIT or Commercial License
7 | revenueModel: Premium Features and Support
8 | description: >
9 | Build complex and data-rich applications using a growing list of advanced
10 | React components. We're kicking it off with the most powerful Data Grid on the
11 | market.
12 | frameworks:
13 | react: true
14 | features:
15 | accessible: true
16 | copyPaste: false
17 | csvExport: Premium feature
18 | customEditors: false
19 | customFormatters: true
20 | draggableRows: Premium feature
21 | editable: true
22 | fillDown: false
23 | fillRight: false
24 | filtering: true
25 | formulas: false
26 | freezableCols: Premium feature
27 | headless: false
28 | i18n: true
29 | maintained: true
30 | mergeCells: false
31 | openSource: true
32 | pagination: true
33 | pdfExport: Premium feature
34 | pivots: Premium feature
35 | rangeSelection: false
36 | resizableCols: true
37 | responsive: false
38 | rowGrouping: Premium feature
39 | serverSide: true
40 | sorting: true
41 | trees: Premium feature
42 | typescript: true
43 | xlsxExport: Premium feature
44 | virtualization: true
45 |
--------------------------------------------------------------------------------
/data/ng-table.yml:
--------------------------------------------------------------------------------
1 | title: ng-table
2 | homeUrl: https://esvit.github.io/ng-table/
3 | demoUrl: null
4 | githubRepo: esvit/ng-table
5 | npmPackage: ng-table
6 | ignoreBundlephobia: true
7 | license: BSD 3-Clause License
8 | revenueModel: Free
9 | description: >
10 | Simple table with sorting and filtering on AngularJS.
11 | frameworks:
12 | angular: true
13 | features:
14 | accessible: false
15 | copyPaste: false
16 | csvExport: false
17 | customEditors: false
18 | customFormatters: true
19 | draggableRows: false
20 | editable: "With row-wide 'Edit' button"
21 | fillDown: false
22 | fillRight: false
23 | filtering: true
24 | formulas: false
25 | freezableCols: false
26 | headless: false
27 | i18n: false
28 | maintained: false
29 | mergeCells: false
30 | openSource: true
31 | pagination: true
32 | pdfExport: false
33 | pivots: false
34 | rangeSelection: false
35 | resizableCols: false
36 | responsive: false
37 | rowGrouping: false
38 | rowSelection: false
39 | serverSide: false
40 | sorting: true
41 | trees: false
42 | xlsxExport: false
43 | virtualization: false
44 |
--------------------------------------------------------------------------------
/data/paramquery.yml:
--------------------------------------------------------------------------------
1 | title: ParamQuery
2 | homeUrl: https://paramquery.com/
3 | demoUrl: https://paramquery.com/demos
4 | githubRepo: paramquery/grid
5 | npmPackage: pqgrid
6 | ignoreBundlephobia: true
7 | license: GPLv3 or Commercial License
8 | revenueModel: Free (Vanilla JS Only) and Pro Versions
9 | description: >
10 | ParamQuery Grid is an open source initiative for the web whose easy to use
11 | interface is inspired by MS Excel and Google spreadsheets. Angular, React,
12 | and Vue support is available with a paid Pro license.
13 | frameworks:
14 | vanilla: true
15 | angular: true
16 | react: true
17 | vue: true
18 | features:
19 | accessible: true
20 | copyPaste: true
21 | csvExport: true
22 | customEditors: true
23 | customFormatters: true
24 | draggableRows: true
25 | editable: true
26 | fillDown: true
27 | fillRight: true
28 | filtering: true
29 | formulas: false
30 | freezableCols: true
31 | headless: false
32 | i18n: true
33 | maintained: true
34 | mergeCells: false
35 | openSource: true
36 | pagination: true
37 | pdfExport: false
38 | pivots: true
39 | rangeSelection: true
40 | resizableCols: true
41 | responsive: false
42 | rowGrouping: true
43 | rowSelection: true
44 | serverSide: true
45 | sorting: true
46 | trees: true
47 | xlsxExport: true
48 | virtualization: true
49 |
--------------------------------------------------------------------------------
/data/react-base-table.yml:
--------------------------------------------------------------------------------
1 | title: React Base Table
2 | homeUrl: https://autodesk.github.io/react-base-table/
3 | demoUrl: https://autodesk.github.io/react-base-table/examples/default
4 | githubRepo: Autodesk/react-base-table
5 | npmPackage: react-base-table
6 | license: MIT License
7 | revenueModel: Free
8 | description: >
9 | A react table component to display large datasets with high performance and
10 | flexibility.
11 | frameworks:
12 | react: true
13 | features:
14 | accessible: false
15 | copyPaste: false
16 | csvExport: false
17 | customEditors: true
18 | customFormatters: true
19 | draggableRows: true
20 | editable: true
21 | fillDown: false
22 | fillRight: false
23 | filtering: false
24 | formulas: false
25 | freezableCols: true
26 | headless: false
27 | i18n: false
28 | maintained: true
29 | mergeCells: false
30 | openSource: true
31 | pagination: false
32 | pdfExport: false
33 | pivots: false
34 | rangeSelection: false
35 | resizableCols: true
36 | responsive: false
37 | rowGrouping: true
38 | rowSelection: true
39 | serverSide: true
40 | sorting: true
41 | trees: false
42 | xlsxExport: false
43 | virtualization: true
44 |
--------------------------------------------------------------------------------
/data/react-data-grid.yml:
--------------------------------------------------------------------------------
1 | title: React Data Grid
2 | homeUrl: https://github.com/adazzle/react-data-grid#readme
3 | demoUrl: https://adazzle.github.io/react-data-grid/
4 | githubRepo: adazzle/react-data-grid
5 | npmPackage: react-data-grid
6 | license: MIT License
7 | revenueModel: Free
8 | description: >
9 | Excel-like data grid component built with React. Lightning fast rendering,
10 | rich editing and formatting, configurable & customizable, packed full of
11 | Excel features.
12 | frameworks:
13 | react: true
14 | features:
15 | accessible: false
16 | copyPaste: Only within the grid. System clipboard not supported.
17 | csvExport: false
18 | customEditors: true
19 | customFormatters: true
20 | draggableRows: true
21 | editable: true
22 | fillDown: true
23 | fillRight: false
24 | filtering: true
25 | formulas: false
26 | freezableCols: true
27 | headless: false
28 | i18n: false
29 | maintained: true
30 | mergeCells: false
31 | openSource: true
32 | pagination: false
33 | pdfExport: false
34 | pivots: false
35 | rangeSelection: false
36 | resizableCols: true
37 | responsive: false
38 | rowGrouping: true
39 | rowSelection: true
40 | serverSide: false
41 | sorting: true
42 | trees: true
43 | typescript: true
44 | xlsxExport: false
45 | virtualization: true
46 |
--------------------------------------------------------------------------------
/data/react-pivot.yml:
--------------------------------------------------------------------------------
1 | title: React-Pivot
2 | homeUrl: https://davidguttman.github.io/react-pivot/
3 | demoUrl: https://davidguttman.github.io/react-pivot/
4 | githubRepo: davidguttman/react-pivot
5 | npmPackage: react-pivot
6 | ignoreBundlephobia: true
7 | license: MIT License
8 | revenueModel: Free
9 | description: >
10 | React-Pivot is a data-grid component with pivot-table-like functionality
11 | for data display, filtering, and exploration.
12 | frameworks:
13 | react: true
14 | vanilla: true
15 | features:
16 | accessible: true
17 | copyPaste: false
18 | csvExport: true
19 | customEditors: false
20 | customFormatters: false
21 | draggableRows: false
22 | editable: false
23 | fillDown: false
24 | fillRight: false
25 | filtering: false
26 | formulas: false
27 | freezableCols: false
28 | headless: false
29 | i18n: false
30 | maintained: true
31 | mergeCells: false
32 | openSource: true
33 | pagination: false
34 | pdfExport: false
35 | pivots: true
36 | rangeSelection: false
37 | resizableCols: false
38 | responsive: false
39 | rowGrouping: false
40 | rowSelection: false
41 | serverSide: false
42 | sorting: false
43 | trees: false
44 | xlsxExport: false
45 | virtualization: false
46 |
--------------------------------------------------------------------------------
/data/react-spreadsheet-grid.yml:
--------------------------------------------------------------------------------
1 | title: React Spreadsheet Grid
2 | homeUrl: https://denisraslov.github.io/grid/
3 | demoUrl: https://denisraslov.github.io/grid/
4 | githubRepo: denisraslov/react-spreadsheet-grid
5 | npmPackage: react-spreadsheet-grid
6 | license: MIT License
7 | revenueModel: Free
8 | description: >
9 | An Excel-like grid component for React with custom cell editors, performant
10 | scroll & resizable columns.
11 | frameworks:
12 | react: true
13 | features:
14 | accessible: true
15 | copyPaste: false
16 | csvExport: false
17 | customEditors: false
18 | customFormatters: true
19 | draggableRows: false
20 | editable: true
21 | fillDown: false
22 | fillRight: false
23 | filtering: false
24 | formulas: false
25 | freezableCols: false
26 | headless: false
27 | i18n: false
28 | maintained: true
29 | mergeCells: false
30 | openSource: true
31 | pagination: false
32 | pdfExport: false
33 | pivots: false
34 | rangeSelection: false
35 | resizableCols: true
36 | responsive: false
37 | rowGrouping: false
38 | rowSelection: false
39 | serverSide: false
40 | sorting: false
41 | trees: false
42 | typescript: true
43 | xlsxExport: false
44 | virtualization: true
45 |
--------------------------------------------------------------------------------
/data/react-spreadsheet.yml:
--------------------------------------------------------------------------------
1 | title: React-Spreadsheet-Component
2 | homeUrl: https://github.com/felixrieseberg/React-Spreadsheet-Component
3 | demoUrl: https://felixrieseberg.github.io/React-Spreadsheet-Component/
4 | githubRepo: felixrieseberg/React-Spreadsheet-Component
5 | npmPackage: react-spreadsheet-component
6 | license: MIT License
7 | revenueModel: Free
8 | description: >
9 | This is a spreadsheet component built in Facebook's ReactJS.
10 | frameworks:
11 | react: true
12 | features:
13 | accessible: true
14 | copyPaste: false
15 | csvExport: false
16 | customEditors: false
17 | customFormatters: false
18 | draggableRows: false
19 | editable: true
20 | fillDown: false
21 | fillRight: false
22 | filtering: false
23 | formulas: false
24 | freezableCols: false
25 | headless: false
26 | i18n: false
27 | maintained: false
28 | mergeCells: false
29 | openSource: true
30 | pagination: false
31 | pdfExport: false
32 | pivots: false
33 | rangeSelection: false
34 | resizableCols: false
35 | responsive: false
36 | rowGrouping: false
37 | rowSelection: false
38 | serverSide: false
39 | sorting: false
40 | trees: false
41 | xlsxExport: false
42 | virtualization: false
43 |
--------------------------------------------------------------------------------
/data/react-virtualized-pivot.yml:
--------------------------------------------------------------------------------
1 | title: React Virtualized Pivot
2 | homeUrl: https://github.com/turnerniles/react-virtualized-pivot
3 | demoUrl: https://turnerniles.github.io/react-virtualized-pivot/
4 | githubRepo: turnerniles/react-virtualized-pivot
5 | npmPackage: react-virtualized-pivot
6 | license: MIT License
7 | revenueModel: Free
8 | description: >
9 | react-virtualized-pivot is a React.js pivot table UI built on top of
10 | react-virtualized and quick-pivot.
11 | frameworks:
12 | react: true
13 | features:
14 | accessible: false
15 | copyPaste: false
16 | csvExport: false
17 | customEditors: false
18 | customFormatters: false
19 | draggableRows: false
20 | editable: false
21 | fillDown: false
22 | fillRight: false
23 | filtering: false
24 | formulas: false
25 | freezableCols: false
26 | headless: false
27 | i18n: false
28 | maintained: false
29 | mergeCells: false
30 | openSource: true
31 | pagination: false
32 | pdfExport: false
33 | pivots: true
34 | rangeSelection: false
35 | resizableCols: false
36 | responsive: false
37 | rowGrouping: false
38 | rowSelection: false
39 | serverSide: false
40 | sorting: true
41 | trees: false
42 | xlsxExport: false
43 | virtualization: true
44 |
--------------------------------------------------------------------------------
/data/react-window.yml:
--------------------------------------------------------------------------------
1 | title: react-window
2 | homeUrl: https://github.com/bvaughn/react-window#react-window
3 | demoUrl: https://react-window.now.sh/
4 | githubRepo: bvaughn/react-window
5 | npmPackage: react-window
6 | license: MIT License
7 | revenueModel: Free
8 | description: >
9 | React components for efficiently rendering large lists and tabular data.
10 | frameworks:
11 | react: true
12 | features:
13 | accessible: false
14 | copyPaste: false
15 | csvExport: false
16 | customEditors: false
17 | customFormatters: true
18 | draggableRows: false
19 | editable: false
20 | fillDown: false
21 | fillRight: false
22 | filtering: false
23 | formulas: false
24 | freezableCols: false
25 | headless: true
26 | i18n: false
27 | maintained: true
28 | mergeCells: false
29 | openSource: true
30 | pagination: false
31 | pdfExport: false
32 | pivots: false
33 | rangeSelection: false
34 | resizableCols: false
35 | responsive: false
36 | rowGrouping: false
37 | rowSelection: false
38 | serverSide: false
39 | sorting: false
40 | trees: false
41 | typescript: Third-party types available via DefinitelyTyped
42 | xlsxExport: false
43 | virtualization: true
44 |
--------------------------------------------------------------------------------
/data/revo-grid.yml:
--------------------------------------------------------------------------------
1 | title: Revo Grid
2 | homeUrl: https://revolist.github.io/revogrid/
3 | demoUrl: https://revolist.github.io/revogrid/demo/
4 | githubRepo: revolist/revogrid
5 | npmPackage: "@revolist/revogrid"
6 | license: MIT License
7 | revenueModel: Free
8 | description: >
9 | Revolutionary Spreadsheet Data Grid component.
10 | Built according to the latest reactivity concepts.
11 | Super fast, full of features with advanced customization level.
12 | frameworks:
13 | vanilla: true
14 | react: true
15 | angular: true
16 | vue: true
17 | svelte: true
18 | features:
19 | accessible: true
20 | copyPaste: Only within the grid. System clipboard not supported.
21 | csvExport: true
22 | customEditors: true
23 | customFormatters: true
24 | draggableRows: true
25 | editable: true
26 | fillDown: true
27 | fillRight: true
28 | filtering: true
29 | formulas: false
30 | freezableCols: true
31 | headless: false
32 | i18n: false
33 | maintained: true
34 | mergeCells: false
35 | openSource: true
36 | pagination: false
37 | pdfExport: false
38 | pivots: false
39 | rangeSelection: true
40 | resizableCols: true
41 | responsive: true
42 | rowGrouping: false
43 | rowSelection: true
44 | serverSide: false
45 | sorting: true
46 | trees: false
47 | typescript: true
48 | xlsxExport: false
49 | virtualization: true
50 |
--------------------------------------------------------------------------------
/data/sencha-ext-angular.yml:
--------------------------------------------------------------------------------
1 | title: Sencha ExtAngular
2 | homeUrl: https://www.sencha.com/products/extangular/
3 | demoUrl: https://examples.sencha.com/ExtAngular/
4 | githubRepo: sencha/ext-angular
5 | npmPackage: "@sencha/ext-angular-modern"
6 | license: Custom License
7 | revenueModel: Commercial 30-day Trial
8 | description: >
9 | ExtAngular includes a comprehensive set of 115+ components for Angular
10 | developers, including grid, tree grid, pivot grid, charts, D3
11 | visualizations, trees, calendar, buttons, menus and more. All components
12 | are professionally tested and supported, and designed to work together.
13 | frameworks:
14 | angular: true
15 | features:
16 | accessible: true
17 | copyPaste: true
18 | csvExport: true
19 | customEditors: true
20 | customFormatters: true
21 | draggableRows: true
22 | editable: true
23 | fillDown: true
24 | fillRight: true
25 | filtering: true
26 | formulas: false
27 | freezableCols: true
28 | headless: false
29 | i18n: false
30 | maintained: true
31 | mergeCells: false
32 | openSource: false
33 | pagination: true
34 | pdfExport: false
35 | pivots: false
36 | rangeSelection: true
37 | resizableCols: true
38 | responsive: false
39 | rowGrouping: true
40 | rowSelection: true
41 | serverSide: true
42 | sorting: true
43 | trees: true
44 | xlsxExport: true
45 | virtualization: true
46 |
--------------------------------------------------------------------------------
/data/sencha-ext-gen.yml:
--------------------------------------------------------------------------------
1 | title: Sencha Ext JS
2 | homeUrl: https://www.sencha.com/products/extjs/
3 | demoUrl: https://examples.sencha.com/extjs/
4 | githubRepo: sencha/ext-gen
5 | npmPackage: "@sencha/ext-gen"
6 | ignoreBundlephobia: true
7 | license: Custom License
8 | revenueModel: Commercial 30-day Trial
9 | description: >
10 | Ext JS provides the industry's most comprehensive collection of
11 | high-performance, customizable UI widgets - including HTML5 grids, trees,
12 | lists, forms, menus, toolbars, panels, windows, and much more.
13 | frameworks:
14 | vanilla: true
15 | features:
16 | accessible: true
17 | copyPaste: true
18 | csvExport: true
19 | customEditors: true
20 | customFormatters: true
21 | draggableRows: true
22 | editable: true
23 | fillDown: true
24 | fillRight: true
25 | filtering: true
26 | formulas: false
27 | freezableCols: true
28 | headless: false
29 | i18n: false
30 | maintained: true
31 | mergeCells: false
32 | openSource: false
33 | pagination: true
34 | pdfExport: false
35 | pivots: false
36 | rangeSelection: true
37 | resizableCols: true
38 | responsive: false
39 | rowGrouping: true
40 | rowSelection: true
41 | serverSide: true
42 | sorting: true
43 | trees: true
44 | xlsxExport: true
45 | virtualization: true
46 |
--------------------------------------------------------------------------------
/data/sencha-ext-react.yml:
--------------------------------------------------------------------------------
1 | title: Sencha ExtReact
2 | homeUrl: https://www.sencha.com/products/extreact/
3 | demoUrl: https://examples.sencha.com/ExtReact/
4 | githubRepo: sencha/ext-react
5 | npmPackage: "@sencha/ext-react-modern"
6 | license: Custom License
7 | revenueModel: Commercial 30-day Trial
8 | description: >
9 | ExtReact provides the most comprehensive set of components for React
10 | developers, including grid, tree grid, pivot grid, charts, D3 visualizations,
11 | trees, calendar, buttons, menus and more, with more than 115 professionally
12 | tested and supported components that are all designed to work together.
13 | frameworks:
14 | react: true
15 | features:
16 | accessible: true
17 | copyPaste: true
18 | csvExport: true
19 | customEditors: true
20 | customFormatters: true
21 | draggableRows: true
22 | editable: true
23 | fillDown: true
24 | fillRight: true
25 | filtering: true
26 | formulas: false
27 | freezableCols: true
28 | headless: false
29 | i18n: false
30 | maintained: true
31 | mergeCells: false
32 | openSource: false
33 | pagination: true
34 | pdfExport: false
35 | pivots: false
36 | rangeSelection: true
37 | resizableCols: true
38 | responsive: false
39 | rowGrouping: true
40 | rowSelection: true
41 | serverSide: true
42 | sorting: true
43 | trees: true
44 | xlsxExport: true
45 | virtualization: true
46 |
--------------------------------------------------------------------------------
/data/sensei-grid.yml:
--------------------------------------------------------------------------------
1 | title: Sensei Grid
2 | homeUrl: https://datazenit.com/static/sensei-grid/examples/index.html
3 | demoUrl: https://datazenit.com/static/sensei-grid/examples/index.html
4 | githubRepo: datazenit/sensei-grid
5 | npmPackage: null
6 | license: MIT License
7 | revenueModel: Free
8 | description: >
9 | Simple data grid library written in JavaScript. The data grid is part of
10 | Datazenit, a web-based database administration tool.
11 | frameworks:
12 | jquery: true
13 | features:
14 | accessible: true
15 | copyPaste: false
16 | csvExport: false
17 | customEditors: true
18 | customFormatters: true
19 | draggableRows: false
20 | editable: true
21 | fillDown: false
22 | fillRight: false
23 | filtering: false
24 | formulas: false
25 | freezableCols: false
26 | headless: false
27 | i18n: false
28 | maintained: no
29 | mergeCells: false
30 | openSource: true
31 | pagination: false
32 | pdfExport: false
33 | pivots: false
34 | rangeSelection: false
35 | resizableCols: false
36 | responsive: false
37 | rowGrouping: false
38 | rowSelection: false
39 | serverSide: false
40 | sorting: true
41 | trees: false
42 | xlsxExport: false
43 | virtualization: false
44 |
--------------------------------------------------------------------------------
/data/shadcn-data-table.yml:
--------------------------------------------------------------------------------
1 | title: shadcn/ui Data Table
2 | homeUrl: https://ui.shadcn.com/docs/components/data-table
3 | demoUrl: https://ui.shadcn.com/blocks
4 | githubRepo: null
5 | npmPackage: null
6 | license: MIT License
7 | revenueModel: Free
8 | description: >
9 | Powerful table and datagrids built using TanStack Table with shadcn/ui components.
10 | A comprehensive guide for building custom data tables with sorting, filtering,
11 | pagination, and row selection using headless UI principles.
12 | frameworks:
13 | react: true
14 | features:
15 | accessible: true
16 | copyPaste: false
17 | csvExport: false
18 | customEditors: true
19 | customFormatters: true
20 | draggableRows: false
21 | editable: false
22 | fillDown: false
23 | fillRight: false
24 | filtering: true
25 | formulas: false
26 | freezableCols: false
27 | headless: false
28 | i18n: true
29 | maintained: true
30 | mergeCells: false
31 | openSource: true
32 | pagination: true
33 | pdfExport: false
34 | pivots: false
35 | rangeSelection: false
36 | resizableCols: false
37 | responsive: false
38 | rowGrouping: false
39 | rowSelection: true
40 | serverSide: true
41 | sorting: true
42 | trees: false
43 | typescript: true
44 | xlsxExport: false
45 | virtualization: false
46 |
--------------------------------------------------------------------------------
/data/shadcn-table.yml:
--------------------------------------------------------------------------------
1 | title: shadcn-table
2 | homeUrl: https://www.diceui.com/docs/components/data-table
3 | demoUrl: https://tablecn.com/
4 | githubRepo: https://github.com/sadmann7/shadcn-table
5 | npmPackage: null
6 | license: MIT License
7 | revenueModel: Free
8 | description: >
9 | A powerful shadcn table component with server-side sorting, filtering, and pagination.
10 | Built with TanStack Table and shadcn. Features advanced filtering with Notion/Airtable-like
11 | capabilities and Linear-style filter menu for command palette filtering.
12 | frameworks:
13 | react: true
14 | features:
15 | accessible: true
16 | copyPaste: false
17 | csvExport: false
18 | customEditors: true
19 | customFormatters: true
20 | draggableRows: false
21 | editable: false
22 | fillDown: false
23 | fillRight: false
24 | filtering: true
25 | formulas: false
26 | freezableCols: false
27 | headless: false
28 | i18n: false
29 | maintained: true
30 | mergeCells: false
31 | openSource: true
32 | pagination: true
33 | pdfExport: false
34 | pivots: false
35 | rangeSelection: false
36 | resizableCols: false
37 | responsive: true
38 | rowGrouping: false
39 | rowSelection: true
40 | serverSide: true
41 | sorting: true
42 | trees: false
43 | typescript: true
44 | xlsxExport: false
45 | virtualization: false
46 |
--------------------------------------------------------------------------------
/data/slickgrid.yml:
--------------------------------------------------------------------------------
1 | title: SlickGrid
2 | homeUrl: https://slickgrid.net/
3 | demoUrl: https://github.com/6pac/SlickGrid/wiki/Examples
4 | githubRepo: 6pac/SlickGrid
5 | npmPackage: slickgrid
6 | license: MIT License
7 | revenueModel: Free
8 | description: >
9 | SlickGrid is a fully open-source, javascript, client-side grid control
10 | designed to take an external component as a datasource, and that means
11 | SlickGrid should be compatible with a wide range of modern data-centric
12 | frameworks.
13 | frameworks:
14 | vanilla: true
15 | angular: https://github.com/ghiscoding/slickgrid-universal
16 | react: https://github.com/ghiscoding/slickgrid-universal
17 | vue: https://github.com/ghiscoding/slickgrid-universal
18 | features:
19 | accessible: false
20 | copyPaste: false
21 | csvExport: true
22 | customEditors: true
23 | customFormatters: true
24 | draggableRows: true
25 | editable: true
26 | fillDown: false
27 | fillRight: false
28 | filtering: true
29 | formulas: false
30 | freezableCols: true
31 | headless: false
32 | i18n: true
33 | maintained: true
34 | mergeCells: false
35 | openSource: true
36 | pagination: true
37 | pdfExport: false
38 | pivots: false
39 | rangeSelection: true
40 | resizableCols: true
41 | responsive: true
42 | rowGrouping: true
43 | rowSelection: true
44 | serverSide: true
45 | sorting: true
46 | trees: true
47 | typescript: true
48 | xlsxExport: true
49 | virtualization: true
50 |
--------------------------------------------------------------------------------
/data/smart-grid.yml:
--------------------------------------------------------------------------------
1 | title: Smart.Grid
2 | homeUrl: https://www.htmlelements.com/docs/grid/
3 | demoUrl: https://www.htmlelements.com/demos/grid/overview/
4 | githubRepo: HTMLElements/smart-webcomponents
5 | npmPackage: "@smarthtmlelements/smart-elements"
6 | ignoreBundlephobia: true
7 | license: Custom License
8 | revenueModel: Community and Enterprise Versions
9 | description: >
10 | Smart.Grid represents a Data Grid component which displays tabular data. It
11 | allows you to sort, filter, edit, group the data.
12 | frameworks:
13 | angular: true
14 | react: true
15 | vanilla: true
16 | vue: true
17 | features:
18 | accessible: true
19 | copyPaste: false
20 | csvExport: true
21 | customEditors: true
22 | customFormatters: true
23 | draggableRows: true
24 | editable: true
25 | fillDown: true
26 | fillRight: true
27 | filtering: true
28 | formulas: false
29 | freezableCols: true
30 | headless: false
31 | i18n: true
32 | maintained: true
33 | mergeCells: false
34 | openSource: true
35 | pagination: true
36 | pdfExport: true
37 | pivots: false
38 | rangeSelection: true
39 | resizableCols: true
40 | responsive: true
41 | rowGrouping: true
42 | rowSelection: true
43 | serverSide: false
44 | sorting: true
45 | trees: true
46 | xlsxExport: true
47 | virtualization: true
48 |
--------------------------------------------------------------------------------
/data/smart-table.yml:
--------------------------------------------------------------------------------
1 | title: Smart Table
2 | homeUrl: https://lorenzofox3.github.io/smart-table-website/
3 | demoUrl: https://lorenzofox3.github.io/smart-table-website/#examples-section
4 | githubRepo: lorenzofox3/Smart-Table
5 | npmPackage: angular-smart-table
6 | license: MIT License
7 | revenueModel: Free
8 | description: >
9 | Smart Table is a table module for angular js. It is lightweight (around 3kb
10 | minified) and has no other dependencies than Angular itself.
11 | frameworks:
12 | angular: true
13 | features:
14 | accessible: true
15 | copyPaste: false
16 | csvExport: false
17 | customEditors: false
18 | customFormatters: false
19 | draggableRows: false
20 | editable: true
21 | fillDown: false
22 | fillRight: false
23 | filtering: true
24 | formulas: false
25 | freezableCols: false
26 | headless: false
27 | i18n: false
28 | maintained: false
29 | mergeCells: false
30 | openSource: true
31 | pagination: true
32 | pdfExport: false
33 | pivots: false
34 | rangeSelection: false
35 | resizableCols: false
36 | responsive: false
37 | rowGrouping: false
38 | rowSelection: true
39 | serverSide: false
40 | sorting: true
41 | trees: false
42 | xlsxExport: false
43 | virtualization: false
44 |
--------------------------------------------------------------------------------
/data/sou-react-table.yml:
--------------------------------------------------------------------------------
1 | title: Sou React Table
2 | homeUrl: https://miadwang.github.io/sou-react-table/
3 | demoUrl: https://miadwang.github.io/sou-react-table/
4 | githubRepo: miadwang/sou-react-table
5 | npmPackage: sou-react-table
6 | license: MIT License
7 | revenueModel: Free
8 | description: >
9 | A spreadsheet component for React with simple and clean spreadsheet-like
10 | features.
11 | frameworks:
12 | react: true
13 | features:
14 | accessible: true
15 | copyPaste: true
16 | csvExport: false
17 | customEditors: false
18 | customFormatters: false
19 | draggableRows: false
20 | editable: true
21 | fillDown: true
22 | fillRight: true
23 | filtering: false
24 | formulas: false
25 | freezableCols: false
26 | headless: false
27 | i18n: false
28 | maintained: false
29 | mergeCells: false
30 | openSource: true
31 | pagination: false
32 | pdfExport: false
33 | pivots: false
34 | rangeSelection: true
35 | resizableCols: false
36 | responsive: false
37 | rowGrouping: false
38 | rowSelection: false
39 | serverSide: false
40 | sorting: true
41 | trees: false
42 | xlsxExport: false
43 | virtualization: false
44 |
--------------------------------------------------------------------------------
/data/spreadjs.yml:
--------------------------------------------------------------------------------
1 | title: SpreadJS
2 | homeUrl: https://developer.mescius.com/spreadjs
3 | demoUrl: https://developer.mescius.com/spreadjs/demos/
4 | githubRepo: null
5 | npmPackage: "@grapecity/spread-sheets"
6 | license: Commercial License
7 | revenueModel: Custom License
8 | description: >
9 | Deliver true Excel-like spreadsheet experiences, fast - with zero dependencies on Excel. Create financial, budgeting/forecasting, scientific, engineering, healthcare, insurance, and many other similar JavaScript spreadsheet business applications.
10 | frameworks:
11 | vanilla: true
12 | react: true
13 | vue: true
14 | angular: true
15 | features:
16 | accessible: Keyboard controls work well, but the entire sheet is rendered to a canvas, which can hinder accessibility
17 | copyPaste: true
18 | csvExport: true
19 | customEditors: true
20 | customFormatters: true
21 | draggableRows: true
22 | editable: true
23 | fillDown: true
24 | fillRight: true
25 | filtering: true
26 | formulas: true
27 | freezableCols: true
28 | headless: false
29 | i18n: true
30 | maintained: true
31 | mergeCells: false
32 | openSource: false
33 | pagination: true
34 | pdfExport: true
35 | pivots: true
36 | rangeSelection: true
37 | resizableCols: true
38 | responsive: false
39 | rowGrouping: true
40 | rowSelection: true
41 | serverSide: true
42 | sorting: true
43 | trees: false
44 | typescript: true
45 | xlsxExport: true
46 | virtualization: true
47 |
--------------------------------------------------------------------------------
/data/svar-datagrid.yml:
--------------------------------------------------------------------------------
1 | title: SVAR DataGrid
2 | homeUrl: https://svar.dev/svelte/datagrid/
3 | demoUrl: https://docs.svar.dev/svelte/grid/samples/#/base/willow
4 | githubRepo: svar-widgets/grid
5 | npmPackage: wx-svelte-grid
6 | license: MIT License
7 | revenueModel: Free
8 | description: >
9 | SVAR DataGrid is a lightweight and blazing-fast data grid component
10 | with a rich feature set including in-cell editing, sorting, filtering,
11 | virtual scrolling, pagination, keyboard navigation, and special helper
12 | for server-side integration. Available in both Svelte and React versions.
13 | frameworks:
14 | react: true
15 | svelte: true
16 | features:
17 | accessible: true
18 | customEditors: true
19 | customFormatters: true
20 | draggableRows: true
21 | editable: true
22 | filtering: true
23 | freezableCols: true
24 | i18n: true
25 | maintained: true
26 | mergeCells: false
27 | openSource: true
28 | pagination: true
29 | resizableCols: true
30 | responsive: true
31 | rowGrouping: true
32 | rowSelection: true
33 | serverSide: true
34 | sorting: true
35 | trees: true
36 | xlsxExport: true
37 | virtualization: true
38 |
--------------------------------------------------------------------------------
/data/syncfusion-datagrid.yml:
--------------------------------------------------------------------------------
1 | title: SyncFusion DataGrid
2 | homeUrl: https://www.syncfusion.com/javascript-ui-controls/js-data-grid
3 | demoUrl: https://ej2.syncfusion.com/demos/#/material/grid/grid-overview.html
4 | githubRepo: syncfusion/ej2-grids
5 | npmPackage: "@syncfusion/ej2-grids"
6 | license: Custom License
7 | revenueModel: Commercial License
8 | description: >
9 | HTML5/JavaScript Grid/DataGrid is a feature-rich control for displaying
10 | data in a tabular format. Its wide range of functionalities includes data
11 | binding, editing, Excel-like filtering, custom sorting, aggregating rows,
12 | selection, and support for Excel, CSV, and PDF formats.
13 | frameworks:
14 | react: true
15 | angular: true
16 | vue: true
17 | features:
18 | accessible: true
19 | copyPaste: false
20 | csvExport: true
21 | customEditors: true
22 | customFormatters: true
23 | draggableRows: false
24 | editable: true
25 | fillDown: false
26 | fillRight: false
27 | filtering: true
28 | formulas: false
29 | freezableCols: true
30 | headless: false
31 | i18n: true
32 | maintained: true
33 | mergeCells: false
34 | openSource: true
35 | pagination: true
36 | pdfExport: true
37 | pivots: false
38 | rangeSelection: false
39 | resizableCols: true
40 | responsive: false
41 | rowGrouping: true
42 | rowSelection: true
43 | serverSide: true
44 | sorting: true
45 | trees: false
46 | xlsxExport: true
47 | virtualization: true
48 |
--------------------------------------------------------------------------------
/data/tabulator.yml:
--------------------------------------------------------------------------------
1 | title: Tabulator
2 | homeUrl: http://tabulator.info/
3 | demoUrl: http://tabulator.info/examples/
4 | githubRepo: olifolkerd/tabulator
5 | npmPackage: tabulator-tables
6 | license: MIT License
7 | revenueModel: Donate via Patreon or PayPal
8 | description: >
9 | The easy to use, fully featured, interactive table JavaScript library.
10 | Tabulator allows you to create interactive tables in seconds from any HTML
11 | Table, JavaScript Array, AJAX data source or JSON formatted data.
12 | frameworks:
13 | vanilla: true
14 | jquery: true
15 | react: https://www.npmjs.com/package/react-tabulator
16 | angular: https://www.npmjs.com/package/ng-tabulator-tables
17 | vue: https://www.npmjs.com/package/vue-tabulator
18 | features:
19 | accessible: true
20 | copyPaste: true
21 | csvExport: true
22 | customEditors: true
23 | customFormatters: true
24 | draggableRows: true
25 | editable: true
26 | fillDown: false
27 | fillRight: false
28 | filtering: true
29 | formulas: false
30 | freezableCols: true
31 | headless: false
32 | i18n: true
33 | maintained: true
34 | mergeCells: false
35 | openSource: true
36 | pagination: false
37 | pdfExport: false
38 | pivots: false
39 | rangeSelection: true
40 | resizableCols: true
41 | responsive: true
42 | rowGrouping: true
43 | rowSelection: true
44 | serverSide: "Support lazy loading of rows."
45 | sorting: true
46 | trees: false
47 | typescript: Third-party types available via DefinitelyTyped
48 | xlsxExport: true
49 | virtualization: true
50 |
--------------------------------------------------------------------------------
/data/tanstack-table.yml:
--------------------------------------------------------------------------------
1 | title: TanStack Table
2 | homeUrl: https://tanstack.com/table/latest
3 | demoUrl: https://tanstack.com/table/latest/docs/framework/react/examples/basic
4 | githubRepo: TanStack/table
5 | npmPackage: "@tanstack/react-table"
6 | license: MIT License
7 | revenueModel: Free
8 | description: Headless UI for building powerful tables & datagrids for React, Solid, Vue, Svelte and TS/JS.
9 |
10 | frameworks:
11 | vanilla: true
12 | react: true
13 | vue: true
14 | svelte: true
15 |
16 | features:
17 | accessible: Adding these tags is up to you.
18 | copyPaste: false
19 | csvExport: false
20 | customEditors: true
21 | customFormatters: true
22 | draggableRows: true
23 | editable: true
24 | fillDown: false
25 | fillRight: false
26 | filtering: true
27 | formulas: false
28 | freezableCols: false
29 | headless: true
30 | i18n: Internationalization is up to you.
31 | maintained: true
32 | mergeCells: false
33 | openSource: true
34 | pagination: true
35 | pdfExport: false
36 | pivots: false
37 | rangeSelection: false
38 | resizableCols: true
39 | responsive: Adding responsiveness is up to you (see examples)
40 | rowGrouping: true
41 | rowSelection: true
42 | serverSide: false
43 | sorting: true
44 | trees: true
45 | typescript: true
46 | xlsxExport: false
47 | virtualization: Using react-window (see examples)
48 |
--------------------------------------------------------------------------------
/data/tui-grid.yml:
--------------------------------------------------------------------------------
1 | title: TOAST UI Grid
2 | homeUrl: https://nhn.github.io/tui.grid/latest/
3 | demoUrl: https://nhn.github.io/tui.grid/latest/tutorial-example01-basic
4 | githubRepo: nhn/tui.grid
5 | npmPackage: tui-grid
6 | license: MIT License
7 | revenueModel: Free
8 | description: >
9 | TOAST UI Grid is a powerful widget which allows you to visualize and edit
10 | data via its table representation.
11 | frameworks:
12 | vanilla: true
13 | vue: https://www.npmjs.com/package/@toast-ui/vue-grid
14 | react: https://www.npmjs.com/package/@toast-ui/react-grid
15 | features:
16 | accessible: true
17 | copyPaste: true
18 | csvExport: false
19 | customEditors: true
20 | customFormatters: true
21 | draggableRows: false
22 | editable: true
23 | fillDown: false
24 | fillRight: false
25 | filtering: true
26 | formulas: false
27 | freezableCols: true
28 | headless: false
29 | i18n: true
30 | maintained: true
31 | mergeCells: false
32 | openSource: true
33 | pagination: true
34 | pdfExport: false
35 | pivots: false
36 | rangeSelection: true
37 | resizableCols: true
38 | responsive: false
39 | rowGrouping: false
40 | rowSelection: false
41 | serverSide: true
42 | sorting: true
43 | trees: true
44 | xlsxExport: false
45 | virtualization: true
46 |
--------------------------------------------------------------------------------
/data/visactor-vtable.yml:
--------------------------------------------------------------------------------
1 | title: VisActor VTable
2 | homeUrl: https://visactor.io/vtable
3 | demoUrl: https://visactor.io/vtable/example
4 | githubRepo: VisActor/VTable
5 | npmPackage: "@visactor/vtable"
6 | license: MIT License
7 | revenueModel: Free
8 | description: >
9 | VTable is not just a high-performance multidimensional data analysis table, but also a grid artist that creates art between rows and columns.
10 | frameworks:
11 | vanilla: true
12 | react: true
13 | features:
14 | accessible: true
15 | copyPaste: true
16 | csvExport: true
17 | customFormatters: true
18 | draggableRows: true
19 | customEditors: true
20 | editable: true
21 | filtering: true
22 | formulas: false
23 | freezableCols: true
24 | headless: true
25 | i18n: true
26 | maintained: true
27 | mergeCells: false
28 | openSource: true
29 | pagination: true
30 | pivots: true
31 | rangeSelection: true
32 | resizableCols: true
33 | responsive: true
34 | rowGrouping: true
35 | rowSelection: true
36 | sorting: true
37 | trees: true
38 | xlsxExport: true
39 | virtualization: true
40 |
--------------------------------------------------------------------------------
/data/w2ui.yml:
--------------------------------------------------------------------------------
1 | title: w2ui
2 | homeUrl: http://w2ui.com/
3 | demoUrl: http://w2ui.com/web/demos/#!grid/grid-1
4 | githubRepo: vitmalina/w2ui
5 | npmPackage: w2ui
6 | license: MIT License
7 | revenueModel: Free
8 | description: >
9 | w2ui is a modern and intuitive JavaScript UI library for building rich
10 | data-driven web applications. The library has a small footprint and
11 | requires only jQuery (1.9+) as a dependency.
12 | frameworks:
13 | jquery: true
14 | features:
15 | accessible: true
16 | copyPaste: false
17 | csvExport: false
18 | customEditors: false
19 | customFormatters: true
20 | draggableRows: true
21 | editable: true
22 | fillDown: false
23 | fillRight: false
24 | filtering: true
25 | formulas: false
26 | freezableCols: true
27 | headless: false
28 | i18n: false
29 | maintained: true
30 | mergeCells: false
31 | openSource: true
32 | pagination: false
33 | pdfExport: false
34 | pivots: false
35 | rangeSelection: false
36 | resizableCols: true
37 | responsive: false
38 | rowGrouping: false
39 | rowSelection: true
40 | serverSide: false
41 | sorting: true
42 | trees: false
43 | typescript: Third-party types available via DefinitelyTyped
44 | xlsxExport: false
45 | virtualization: false
46 |
--------------------------------------------------------------------------------
/data/wijmo-flexgrid.yml:
--------------------------------------------------------------------------------
1 | title: Wijmo FlexGrid
2 | homeUrl: https://www.grapecity.com/wijmo/flexgrid-javascript-data-grid
3 | demoUrl: https://www.grapecity.com/wijmo/demos/Grid/Overview/purejs
4 | githubRepo:
5 | npmPackage: "@grapecity/wijmo.all"
6 | license: Custom License
7 | revenueModel: Commercial License
8 | description: >
9 | Improve your applications by leveraging the best JavaScript datagrid in the industry with Wijmo's FlexGrid. FlexGrid provides a familiar, Excel-like experience. FlexGrid provides customizable cells with cell templates and themes. With extensive API documentation and hundreds of demos, as well as first-class support, we've got the tools to help you create the datagrid that your application needs.
10 | frameworks:
11 | vanilla: true
12 | react: true
13 | angular: true
14 | vue: true
15 | features:
16 | accessible: true
17 | copyPaste: true
18 | csvExport: true
19 | customEditors: true
20 | customFormatters: true
21 | draggableRows: true
22 | editable: true
23 | fillDown: false
24 | fillRight: false
25 | filtering: true
26 | formulas: false
27 | freezableCols: true
28 | headless: false
29 | i18n: true
30 | maintained: true
31 | mergeCells: false
32 | openSource: false
33 | pagination: true
34 | pdfExport: true
35 | pivots: true
36 | rangeSelection: true
37 | resizableCols: true
38 | responsive: true
39 | rowGrouping: true
40 | rowSelection: true
41 | serverSide: true
42 | sorting: true
43 | trees: true
44 | typescript: true
45 | xlsxExport: true
46 | virtualization: true
47 |
--------------------------------------------------------------------------------
/data/wijmo-grid.yml:
--------------------------------------------------------------------------------
1 | title: Wijmo Grid
2 | homeUrl: https://www.grapecity.com/wijmo
3 | demoUrl: https://www.grapecity.com/wijmo/demos/Grid/Overview/purejs
4 | githubRepo: null
5 | npmPackage: wijmo
6 | license: Commercial
7 | revenueModel: Commercial
8 | description: Enterprise-grade JavaScript data grid component by GrapeCity. Part of the Wijmo UI controls suite, offering comprehensive data visualization and editing capabilities for business applications.
9 |
10 | frameworks:
11 | react: true
12 | svelte: false
13 | vue: true
14 | angular: true
15 | ember: false
16 | jquery: false
17 | vanilla: true
18 |
19 | features:
20 | accessible: true
21 | copyPaste: true
22 | csvExport: true
23 | customEditors: true
24 | customFormatters: true
25 | draggableRows: true
26 | editable: true
27 | fillDown: true
28 | fillRight: true
29 | filtering: true
30 | formulas: false
31 | freezableCols: true
32 | headless: false
33 | i18n: true
34 | maintained: true
35 | mergeCells: false
36 | openSource: false
37 | pagination: true
38 | pdfExport: true
39 | pivots: false
40 | rangeSelection: true
41 | resizableCols: true
42 | responsive: true
43 | rowGrouping: true
44 | rowSelection: true
45 | search: true
46 | serverSide: true
47 | sorting: true
48 | trees: true
49 | typescript: true
50 | xlsxExport: true
51 | virtualization: true
52 |
--------------------------------------------------------------------------------
/lib/cache.ts:
--------------------------------------------------------------------------------
1 | import * as crypto from "crypto";
2 | import {
3 | existsSync,
4 | mkdirSync,
5 | readFileSync,
6 | unlinkSync,
7 | writeFileSync,
8 | } from "fs";
9 | import { join } from "path";
10 |
11 | //
12 | // This is a simple filesystem cache because, amazingly, nothing on npm seemed
13 | // to be this simple and this is easy to write.
14 | //
15 |
16 | const expiryInMs = 1000 * 60 * 60 * 24;
17 |
18 | // Put the cache in the .next/cache/jsgrids directory so that it is
19 | // automatically cached by Vercel.
20 | const basedir = join(process.cwd(), ".next/cache/jsgrids");
21 | mkdirSync(basedir, { recursive: true });
22 | console.log("cache: base directory is %s", basedir);
23 |
24 | const keyToFilename = (key: string): string => {
25 | const hash = crypto.createHash("sha256");
26 | hash.update(key);
27 | return hash.digest("hex") + ".json";
28 | };
29 |
30 | const get = (key: string): any => {
31 | const path = join(basedir, keyToFilename(key));
32 | if (!existsSync(path)) {
33 | console.log("cache: miss for %s", key);
34 | return null;
35 | }
36 |
37 | const obj = JSON.parse(readFileSync(path, "utf8"));
38 | if (obj?.expiration >= Date.now()) {
39 | return obj?.data;
40 | } else {
41 | console.log("cache: expired %s", key);
42 | return null;
43 | }
44 | };
45 |
46 | const set = (key: string, data: any): void => {
47 | console.log("cache: write %s", key);
48 | const path = join(basedir, keyToFilename(key));
49 | const obj = JSON.stringify({
50 | expiration: Date.now() + expiryInMs,
51 | data,
52 | });
53 | writeFileSync(path, obj, "utf8");
54 | };
55 |
56 | const clear = (key: string): void => {
57 | console.log("cache: clear %s", key);
58 | const path = join(basedir, keyToFilename(key));
59 | if (existsSync(path)) unlinkSync(path);
60 | };
61 |
62 | // Syntactic sugar to heop with the most common pattern.
63 | const fetch = async (key: string, fn: () => Promise): Promise => {
64 | const cached = get(key);
65 | if (cached) return cached;
66 |
67 | const fresh = await fn();
68 | if (fresh) set(key, fresh);
69 | return fresh;
70 | };
71 |
72 | export { get, set, clear, fetch };
73 |
--------------------------------------------------------------------------------
/lib/features.ts:
--------------------------------------------------------------------------------
1 | //
2 | // All library features are defined here. "important" means we should highlight
3 | // when a library _doesn't_ have this feature.
4 | //
5 |
6 | export const Features = {
7 | accessible: {
8 | title: "Accessible",
9 | abbreviation: "A11y",
10 | description:
11 | "Uses semantic markup or ARIA attributes to make the interface less challenging to use.",
12 | important: false,
13 | },
14 | copyPaste: {
15 | title: "Copy and Paste",
16 | abbreviation: "C&P",
17 | description: "Supports copy and paste, preferably to the system clipboard.",
18 | important: false,
19 | },
20 | csvExport: {
21 | title: "CSV Export",
22 | abbreviation: "CSV",
23 | description:
24 | "The library has built-in functionality which lets you download a CSV file.",
25 | important: false,
26 | },
27 | customEditors: {
28 | title: "Custom Editors",
29 | abbreviation: "Edit",
30 | description:
31 | "The library lets you create your own dynamic cell value editor widgets.",
32 | important: false,
33 | },
34 | customFormatters: {
35 | title: "Custom Formatters",
36 | abbreviation: "Fmt",
37 | description:
38 | "The library lets you customize how data is shown in each grid cell.",
39 | important: false,
40 | },
41 | draggableRows: {
42 | title: "Draggable Rows",
43 | abbreviation: "Drag",
44 | description: "Allows rows to be reordered by dragging.",
45 | important: false,
46 | },
47 | editable: {
48 | title: "Editable Cells",
49 | abbreviation: "Edit",
50 | description: "Cell values can be changed to update data in memory.",
51 | important: false,
52 | },
53 | fillDown: {
54 | title: "Fill Down",
55 | abbreviation: "FD",
56 | description:
57 | "A drag handle or keyboard shortcut can be used to copy a value or formula to cells below the selected cell.",
58 | important: false,
59 | },
60 | fillRight: {
61 | title: "Fill Right",
62 | abbreviation: "FR",
63 | description:
64 | "A drag handle or keyboard shortcut can be used to copy a value or formula to cells to the right of the selected cell.",
65 | important: false,
66 | },
67 | filtering: {
68 | title: "Filtering",
69 | abbreviation: "Filt",
70 | description:
71 | "The library or interface has provisions for only showing rows that meet certain criteria. (Different from searching.)",
72 | important: false,
73 | },
74 | formulas: {
75 | title: "Formula Support",
76 | abbreviation: "Form",
77 | description:
78 | "The library has built-in support for deriving cell values from other cells.",
79 | important: false,
80 | },
81 | freezableCols: {
82 | title: "Freezable Columns",
83 | abbreviation: "FC",
84 | description:
85 | "The library lets you make columns persist on one or both sides of the grid.",
86 | important: false,
87 | },
88 | headless: {
89 | title: "Headless",
90 | abbreviation: "HL",
91 | description:
92 | "There is no user interface provided by default; this library is logic-only.",
93 | important: false,
94 | },
95 | i18n: {
96 | title: "i18n",
97 | abbreviation: "i18n",
98 | description: "Has features for internationalization and localization.",
99 | important: false,
100 | },
101 | maintained: {
102 | title: "Maintained",
103 | abbreviation: "Mnt",
104 | description:
105 | "Whether this library is under active development, or has recently-fixed bugs, or is so wonderfully stable that it doesn't need maintenance.",
106 | important: true,
107 | },
108 | mergeCells: {
109 | title: "Merge Cells",
110 | abbreviation: "Merge",
111 | description: "Supports merging cells.",
112 | important: false,
113 | },
114 | openSource: {
115 | title: "Open-source",
116 | abbreviation: "OSS",
117 | description:
118 | "Whether the source for this library is hosting in an online version control system.",
119 | important: true,
120 | },
121 | pagination: {
122 | title: "Pagination",
123 | abbreviation: "Page",
124 | description:
125 | "Supports a widget to navigate through pages of rows as opposed to scrolling.",
126 | important: false,
127 | },
128 | pdfExport: {
129 | title: "PDF Export",
130 | abbreviation: "PDF",
131 | description:
132 | "The library has built-in functionality which lets you download a PDF.",
133 | important: false,
134 | },
135 | pivots: {
136 | title: "Pivot Tables",
137 | abbreviation: "Pvt",
138 | description: "Has support for pivot tables.",
139 | important: false,
140 | },
141 | rangeSelection: {
142 | title: "Range Selection",
143 | abbreviation: "Rng",
144 | description: "An arbitrary block of cells can be selected.",
145 | important: false,
146 | },
147 | resizableCols: {
148 | title: "Resizable Columns",
149 | abbreviation: "Rsz",
150 | description: "The user interface lets you resize columns by dragging.",
151 | important: false,
152 | },
153 | responsive: {
154 | title: "Responsive",
155 | abbreviation: "Resp",
156 | description: "Works well on tablet and mobile devices.",
157 | important: false,
158 | },
159 | rowGrouping: {
160 | title: "Row Grouping",
161 | abbreviation: "Grp",
162 | description:
163 | "Whether rows be grouped and preferably collapsed and expanded.",
164 | important: false,
165 | },
166 | rowSelection: {
167 | title: "Row Selection",
168 | abbreviation: "Sel",
169 | description: "Entire rows can be selected.",
170 | important: false,
171 | },
172 | search: {
173 | title: "Search",
174 | abbreviation: "Srch",
175 | description:
176 | "Lets users search cells and jump to their location, and maybe replace values, too. (Different from filtering.)",
177 | important: false,
178 | },
179 | serverSide: {
180 | title: "Server-Side",
181 | abbreviation: "SS",
182 | description:
183 | "Has the ability to use external data sources to fetch, filter, and sort data.",
184 | important: false,
185 | },
186 | sorting: {
187 | title: "Sorting",
188 | abbreviation: "Sort",
189 | description:
190 | "The library or interface has provisions for ordering rows given certain criteria.",
191 | important: false,
192 | },
193 | trees: {
194 | title: "Tree Data",
195 | abbreviation: "Tree",
196 | description: "Has support for hierarchical data.",
197 | important: false,
198 | },
199 | typescript: {
200 | title: "TypeScript",
201 | abbreviation: "TS",
202 | description:
203 | "The library provides TypeScript type definitions or is written in TypeScript.",
204 | important: true,
205 | },
206 | xlsxExport: {
207 | title: "XLSX Export",
208 | abbreviation: "XLSX",
209 | description:
210 | "The library has built-in functionality which lets you download an Excel workbook.",
211 | important: false,
212 | },
213 | virtualization: {
214 | title: "Virtualization",
215 | abbreviation: "Virt",
216 | description:
217 | "Uses a technique to greatly reduce DOM elements and increase performance.",
218 | important: false,
219 | },
220 | } as const;
221 |
222 | export type FeatureName = keyof typeof Features;
223 |
224 | export const FeatureNames = Object.keys(Features) as FeatureName[];
225 | FeatureNames.sort();
226 |
--------------------------------------------------------------------------------
/lib/fetcher.ts:
--------------------------------------------------------------------------------
1 | import pRetry from "p-retry";
2 | import pThrottle from "p-throttle";
3 | import * as cache from "./cache";
4 |
5 | const throttler = pThrottle({ limit: 1, interval: 750 });
6 |
7 | // Hammering APIs usually leads to trouble, and we don't really care about build
8 | // time, so let's be nice.
9 | const throttledFetch = throttler(async (url: string) => {
10 | const { GITHUB_TOKEN, VERCEL_URL, VERCEL_GITHUB_COMMIT_SHA } = process.env;
11 | if (!GITHUB_TOKEN) {
12 | throw new Error(
13 | "Please set a GITHUB_TOKEN. Otherwise you'll quickly exceed GitHub's API rate limits.",
14 | );
15 | }
16 |
17 | console.log("fetcher: get %s", url);
18 | try {
19 | // Be nice to our APIs. (File a GitHub issue if we aren't!)
20 | const ua = VERCEL_URL
21 | ? `jsgrids.statico.io (Netlify build ${VERCEL_URL} for commit ${VERCEL_GITHUB_COMMIT_SHA})`
22 | : `jsgrids.statico.io (local development)`;
23 | const headers: any = {
24 | "User-Agent": ua,
25 | };
26 |
27 | if (GITHUB_TOKEN && /github.com/.test(url)) {
28 | headers.Authorization = `token ${GITHUB_TOKEN}`;
29 | headers.Accept = "application/vnd.github.v3+json";
30 | }
31 |
32 | if (/bundlephobia/.test(url)) {
33 | // bundle-phobia-cli does something like this so let's follow suit.
34 | headers["X-Bundlephobia-User"] = ua;
35 | }
36 |
37 | const fn = async () => {
38 | const res = await fetch(url, { headers });
39 | const resHeaders = Object.fromEntries(res.headers.entries());
40 | const data = await res.json();
41 | if (!res.ok) {
42 | throw new Error(`Request to ${url} failed with status ${res.status}`);
43 | }
44 | return { headers: resHeaders, data };
45 | };
46 |
47 | return await pRetry(fn, {
48 | minTimeout: 3000,
49 | factor: 1,
50 | retries: 3,
51 | onFailedAttempt: (err) => {
52 | console.log(
53 | "fetcher: failed %s, attempt number = %d, retries left = %d",
54 | url,
55 | err.attemptNumber,
56 | err.retriesLeft,
57 | );
58 | },
59 | });
60 | } catch (err: any) {
61 | const res = err.response;
62 | const status = res?.status;
63 | const resHeaders = Object.fromEntries(res?.headers.entries());
64 | console.log(
65 | "fetcher: failed %s - status=%s, headers=%o - %s",
66 | url,
67 | status,
68 | resHeaders,
69 | err,
70 | );
71 | throw err;
72 | }
73 | });
74 |
75 | const cachedThrottledFetch = async (url: string) =>
76 | cache.fetch(url, () => throttledFetch(url));
77 |
78 | export default cachedThrottledFetch;
79 |
--------------------------------------------------------------------------------
/lib/frameworks.ts:
--------------------------------------------------------------------------------
1 | import { DiJqueryLogo } from "react-icons/di";
2 | import { FaAngular, FaEmber, FaReact, FaVuejs } from "react-icons/fa";
3 | import { IoLogoJavascript } from "react-icons/io";
4 | import { SiSvelte } from "react-icons/si";
5 | import { FrameworkName } from "./libraries";
6 |
7 | // An ordered set of all framework names.
8 | export const FrameworkNames: FrameworkName[] = [
9 | "react",
10 | "svelte",
11 | "vue",
12 | "angular",
13 | "ember",
14 | "jquery",
15 | "vanilla",
16 | ];
17 |
18 | export const FrameworkTitles = {
19 | react: "React",
20 | svelte: "Svelte",
21 | vue: "Vue.js",
22 | angular: "Angular",
23 | ember: "Ember.js",
24 | jquery: "jQuery",
25 | vanilla: "Vanilla JavaScript (no framework)",
26 | };
27 |
28 | export const FrameworkIcons = {
29 | react: FaReact,
30 | vue: FaVuejs,
31 | angular: FaAngular,
32 | svelte: SiSvelte,
33 | ember: FaEmber,
34 | jquery: DiJqueryLogo,
35 | vanilla: IoLogoJavascript,
36 | };
37 |
--------------------------------------------------------------------------------
/lib/libraries.ts:
--------------------------------------------------------------------------------
1 | import { readdirSync, readFileSync } from "fs";
2 | import { basename, join } from "path";
3 | import { parse as parseYaml } from "yaml";
4 | import { z } from "zod";
5 | import { fromZodError } from "zod-validation-error";
6 | import { Features } from "./features";
7 | import fetcher from "./fetcher";
8 |
9 | //
10 | // Yes, these types and things seem pretty overcomplicated, but it sure makes
11 | // importing data and working with TypeScript a lot easier.
12 | //
13 |
14 | const URL = z.string().url("Must be a valid URL");
15 |
16 | const GitHubRepo = z.string().refine((str: string) => /^\S+\/\S+$/.test(str), {
17 | message: "Must be a username/repo pair",
18 | });
19 |
20 | const Feature = z.union([z.boolean(), URL, z.string()], {
21 | message:
22 | "Must be a valid URL, boolean, or string (which will show a warming)",
23 | });
24 |
25 | const FrameworkValue = z
26 | .union([URL, z.boolean()], {
27 | message: "Must be a valid URL or boolean",
28 | })
29 | .optional();
30 |
31 | const Frameworks = z.object({
32 | vanilla: FrameworkValue,
33 | react: FrameworkValue,
34 | vue: FrameworkValue,
35 | svelte: FrameworkValue,
36 | angular: FrameworkValue,
37 | jquery: FrameworkValue,
38 | ember: FrameworkValue,
39 | });
40 |
41 | export type FrameworkName = keyof z.infer;
42 |
43 | // Validate and type the data we get from the YAML files in `data`.
44 | const ImportedYAMLInfo = z.object({
45 | title: z.string(),
46 | description: z.string(),
47 | homeUrl: z.union([URL, z.null()]),
48 | demoUrl: z.union([URL, z.null()]),
49 | githubRepo: z.union([GitHubRepo, z.null()]),
50 | npmPackage: z.union([z.string(), z.null()]),
51 | ignoreBundlephobia: z.boolean().optional(),
52 | license: z.union([z.string(), z.null()]),
53 | revenueModel: z.union([z.string(), z.null()]),
54 | frameworks: Frameworks,
55 | features: z.record(z.string(), Feature),
56 | });
57 |
58 | // Allow additional information to be added to the library info dictionaries.
59 | const AugmentedInfo = z.object({
60 | ...ImportedYAMLInfo.shape,
61 | id: z.string(),
62 | github: z
63 | .object({
64 | url: URL,
65 | stars: z.number(),
66 | forks: z.number(),
67 | openIssues: z.number(),
68 | watchers: z.number(),
69 | subscribers: z.number(),
70 | network: z.number(),
71 | contributors: z.number(),
72 | })
73 | .optional(),
74 | npm: z
75 | .object({
76 | url: URL,
77 | downloads: z.number(),
78 | })
79 | .optional(),
80 | bundlephobia: z
81 | .union([
82 | z.object({
83 | url: URL,
84 | rawSize: z.number(),
85 | gzipSize: z.number(),
86 | }),
87 | z.null(),
88 | ])
89 | .optional(),
90 | });
91 |
92 | // Make the final thing we return read-only.
93 | const LibraryInfo = AugmentedInfo.readonly();
94 |
95 | type ImportedYAMLInfo = z.infer;
96 | type AugmentedInfo = z.infer;
97 | export type LibraryInfo = z.infer;
98 |
99 | const allowedFeatures = new Set(Object.keys(Features));
100 |
101 | // Get all the library data, fetching from APIs or using the cache as necessary.
102 | export const getLibraries = async (): Promise => {
103 | // Get paths to all YAML files.
104 | const dataDir = join(process.cwd(), "data");
105 | const paths = readdirSync(dataDir)
106 | .filter((name) => /\.yml$/.test(name))
107 | .map((name) => join(dataDir, name));
108 |
109 | const items: AugmentedInfo[] = [];
110 | await Promise.all(
111 | paths.map(async (path) => {
112 | const id = basename(path, ".yml");
113 |
114 | // Load raw YAML data and make sure it validates.
115 | const obj = parseYaml(readFileSync(path, "utf8"));
116 | if (typeof obj !== "object") {
117 | throw new Error(`Expected ${path} to be an object`);
118 | }
119 |
120 | let item: AugmentedInfo;
121 | try {
122 | const importedData = ImportedYAMLInfo.parse(obj);
123 | item = AugmentedInfo.parse({ id, ...importedData });
124 | } catch (err: any) {
125 | const validationError = fromZodError(err);
126 | throw new Error(`${path} didn't validate: ${validationError}`);
127 | }
128 |
129 | for (const key in item.features) {
130 | if (!allowedFeatures.has(key)) {
131 | throw new Error(`In ${path}, unexpected feature "${key}"`);
132 | }
133 | }
134 |
135 | // Populate GitHub data if the library has a GitHub repo.
136 | if (item.githubRepo) {
137 | const { data: repo } = await fetcher(
138 | `https://api.github.com/repos/${item.githubRepo}`,
139 | );
140 | if (repo.error) {
141 | throw new Error(
142 | `GitHub repo ${item.githubRepo} error: ${repo.error}`,
143 | );
144 | }
145 | if (repo.full_name !== item.githubRepo) {
146 | throw new Error(
147 | `GitHub repo ${item.githubRepo} has moved to ${repo.full_name}`,
148 | );
149 | }
150 |
151 | const pageSize = 100;
152 | const url = `https://api.github.com/repos/${item.githubRepo}/contributors?per_page=${pageSize}`;
153 | const res1 = await fetcher(url);
154 | const data2: any = res1.data;
155 | let contributors;
156 | if (data2.length < pageSize || !res1.headers.link) {
157 | contributors = data2.length;
158 | } else {
159 | const link = res1.headers.link ?? "";
160 | const parts = link.split(",");
161 | const lastPart =
162 | parts.find((s: string) => /rel="last"/.test(s)) ?? "";
163 | const match = lastPart.match(/\bpage=(\d+)/);
164 | const lastPage = Number(match ? match[1] : 1);
165 | const res2 = await fetcher(`${url}&page=${lastPage}`);
166 | const data3: any = res2.data;
167 | const total = pageSize * (lastPage - 1) + data3.length;
168 | contributors = total;
169 | }
170 |
171 | item.github = {
172 | url: repo.html_url,
173 | stars: repo.stargazers_count,
174 | forks: repo.forks_count,
175 | openIssues: repo.open_issues_count,
176 | watchers: repo.watchers_count,
177 | subscribers: repo.subscribers_count,
178 | network: repo.network_count,
179 | contributors,
180 | };
181 | }
182 |
183 | // Populate NPM data if the library has an NPM package name.
184 | if (item.npmPackage) {
185 | const name = item.npmPackage;
186 | const res = await fetcher(
187 | `https://api.npmjs.org/downloads/point/last-week/${name}`,
188 | );
189 | const data: any = res.data;
190 | const npm = {
191 | url: `https://www.npmjs.com/package/${name}`,
192 | downloads: data.downloads,
193 | };
194 | item.npm = npm;
195 | }
196 |
197 | // Grab bundle sizes from Bundlephobia.
198 | if (item.npmPackage && item.ignoreBundlephobia !== true) {
199 | const name = item.npmPackage;
200 | const url = `https://bundlephobia.com/result?p=${name}`;
201 | try {
202 | const { data } = await fetcher(
203 | `https://bundlephobia.com/api/size?package=${name}`,
204 | );
205 | item.bundlephobia = {
206 | url,
207 | rawSize: data.size || 0,
208 | gzipSize: data.gzip || 0,
209 | };
210 | } catch (err) {
211 | // Bundlephobia constantly errors out, even after retrying. So let's do
212 | // the best we can and signal to the frontend that the API is broken.
213 | console.log("libraries: giving up getting bundle size for %s", name);
214 | item.bundlephobia = { url, rawSize: -1, gzipSize: -1 };
215 | }
216 | }
217 |
218 | try {
219 | items.push(AugmentedInfo.parse(item));
220 | } catch (err: any) {
221 | const validationError = fromZodError(err);
222 | throw new Error(`AugmentedInfo for ${path}: ${validationError}`);
223 | }
224 | }),
225 | );
226 |
227 | // Just a quick sanity check here.
228 | if (items.length !== paths.length) {
229 | throw new Error(
230 | `Incomplete data. Parsed ${paths.length} YAML files but only got ${items.length} info objects.`,
231 | );
232 | }
233 |
234 | return items;
235 | };
236 |
--------------------------------------------------------------------------------
/lib/sorting.ts:
--------------------------------------------------------------------------------
1 | import { FeatureName } from "./features";
2 | import { LibraryInfo } from "./libraries";
3 |
4 | export type SortOption = {
5 | key: "popularity" | "stars" | "downloads";
6 | title: string;
7 | description?: string;
8 | fn: (a: LibraryInfo, b: LibraryInfo) => number;
9 | };
10 |
11 | export type SortOptionKey = SortOption["key"];
12 | export const SortOptions: SortOption[] = [
13 | {
14 | key: "popularity",
15 | title: "Popularity",
16 | description: "GitHub stars + NPM downloads",
17 | fn: (a, b) => {
18 | const av = (a.github?.stars || 0) + (a.npm?.downloads || 0);
19 | const bv = (b.github?.stars || 0) + (b.npm?.downloads || 0);
20 | return bv - av;
21 | },
22 | },
23 | {
24 | key: "stars",
25 | title: "GitHub Stars",
26 | fn: (a, b) => (b.github?.stars || 0) - (a.github?.stars || 0),
27 | },
28 | {
29 | key: "downloads",
30 | title: "NPM Weekly Downloads",
31 | fn: (a, b) => (b.npm?.downloads || 0) - (a.npm?.downloads || 0),
32 | },
33 | ];
34 |
35 | // Sort the features by negative ones first, then positive, then middling.
36 | // Only important negative features are shown, which is why they're first.
37 | export const sortedFeatureNames = (
38 | features: LibraryInfo["features"],
39 | ): FeatureName[] =>
40 | Object.keys(features).sort((a, b) => {
41 | const av = features[a];
42 | const bv = features[b];
43 | if (!av) {
44 | return -1;
45 | } else if (!bv) {
46 | return 1;
47 | } else if (av === true && bv === true) {
48 | return a.localeCompare(b);
49 | } else if (typeof av === "string" && /premium/i.test(av)) {
50 | return 1;
51 | } else if (typeof bv === "string" && /premium/i.test(bv)) {
52 | return -1;
53 | } else if (typeof av === "string" && typeof bv === "string") {
54 | return a.localeCompare(b);
55 | } else if (av === true) {
56 | return -1;
57 | } else if (bv === true) {
58 | return 1;
59 | } else {
60 | return a.localeCompare(b);
61 | }
62 | }) as FeatureName[];
63 |
64 | export const hasAllKeys = (obj: any, keys: Iterable) => {
65 | for (const key of Array.from(keys)) {
66 | if (!obj[key]) {
67 | return false;
68 | }
69 | }
70 | return true;
71 | };
72 |
--------------------------------------------------------------------------------
/lib/store.ts:
--------------------------------------------------------------------------------
1 | import { create } from "zustand";
2 | import { FeatureName } from "./features";
3 | import { FrameworkName } from "./libraries";
4 | import { SortOptionKey, SortOptions } from "./sorting";
5 |
6 | type FilterState = {
7 | sort: SortOptionKey;
8 | framework: FrameworkName | null;
9 | features: Set;
10 | license: string | null;
11 | viewMode: "cards" | "table";
12 | };
13 |
14 | type FilterActions = {
15 | setSort: (sort: SortOptionKey) => void;
16 | setFramework: (framework: FrameworkName | null) => void;
17 | setFeatures: (features: Set) => void;
18 | setLicense: (license: string | null) => void;
19 | setViewMode: (viewMode: "cards" | "table") => void;
20 | updateFilters: (updater: (prev: FilterState) => FilterState) => void;
21 | };
22 |
23 | type FilterStore = FilterState & FilterActions;
24 |
25 | export const useFilterStore = create((set) => ({
26 | // Initial state
27 | sort: SortOptions[0].key,
28 | framework: null,
29 | features: new Set(),
30 | license: null,
31 | viewMode: "cards",
32 |
33 | // Actions
34 | setSort: (sort) => set({ sort }),
35 | setFramework: (framework) => set({ framework }),
36 | setFeatures: (features) => set({ features }),
37 | setLicense: (license) => set({ license }),
38 | setViewMode: (viewMode) => set({ viewMode }),
39 | updateFilters: (updater) =>
40 | set((state) => {
41 | const {
42 | setSort,
43 | setFramework,
44 | setFeatures,
45 | setLicense,
46 | setViewMode,
47 | updateFilters,
48 | ...currentState
49 | } = state;
50 | return updater(currentState);
51 | }),
52 | }));
53 |
--------------------------------------------------------------------------------
/lib/ui-constants.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * UI Constants
3 | * Contains reusable constants for UI components
4 | */
5 |
6 | export const HERO_PATTERN_GRID_BACKGROUND = `url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='100' viewBox='0 0 100 100'%3E%3Cg fill-rule='evenodd'%3E%3Cg fill='%2363B3ED' fill-opacity='0.4'%3E%3Cpath opacity='.5' d='M96 95h4v1h-4v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9zm-1 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9z'/%3E%3Cpath d='M6 5V0H5v5H0v1h5v94h1V6h94V5H6z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E")`;
7 |
--------------------------------------------------------------------------------
/lib/utils.ts:
--------------------------------------------------------------------------------
1 | import { clsx, type ClassValue } from "clsx";
2 | import { twMerge } from "tailwind-merge";
3 |
4 | export function cn(...inputs: ClassValue[]) {
5 | return twMerge(clsx(inputs));
6 | }
7 |
--------------------------------------------------------------------------------
/next.config.ts:
--------------------------------------------------------------------------------
1 | import type { NextConfig } from "next";
2 |
3 | const nextConfig: NextConfig = {
4 | staticPageGenerationTimeout: 300,
5 | };
6 |
7 | export default nextConfig;
8 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "jsgrids",
3 | "version": "1.0.0",
4 | "license": "MIT",
5 | "private": true,
6 | "scripts": {
7 | "dev": "next dev --turbopack",
8 | "build": "next build",
9 | "export": "next export",
10 | "start": "next start",
11 | "prepare": "husky install"
12 | },
13 | "dependencies": {
14 | "@babel/core": "^7.27.1",
15 | "@radix-ui/react-checkbox": "^1.3.2",
16 | "@radix-ui/react-popover": "^1.1.14",
17 | "@radix-ui/react-select": "^2.2.5",
18 | "@radix-ui/react-slot": "^1.2.3",
19 | "@radix-ui/react-tooltip": "^1.2.7",
20 | "class-variance-authority": "^0.7.1",
21 | "clsx": "^2.1.1",
22 | "date-fns": "^4.1.0",
23 | "filesize": "^10.1.6",
24 | "lucide-react": "^0.511.0",
25 | "next": "^15.3.2",
26 | "next-themes": "^0.4.6",
27 | "p-retry": "^6.2.1",
28 | "p-throttle": "^7.0.0",
29 | "react": "^19.1.0",
30 | "react-dom": "^19.1.0",
31 | "react-github-corner": "^2.5.0",
32 | "react-icons": "^5.5.0",
33 | "tailwind-merge": "^3.3.0",
34 | "yaml": "^2.8.0",
35 | "zod": "^3.25.28",
36 | "zod-validation-error": "^3.4.1",
37 | "zustand": "^5.0.5"
38 | },
39 | "devDependencies": {
40 | "@tailwindcss/postcss": "^4",
41 | "@types/node": "^22.15.21",
42 | "@types/react": "^19.1.5",
43 | "husky": ">=9.1.7",
44 | "lint-staged": ">=16.0.0",
45 | "prettier": "^3.5.3",
46 | "tailwindcss": "^4",
47 | "tw-animate-css": "^1.3.0",
48 | "typescript": "^5.8.3"
49 | },
50 | "lint-staged": {
51 | "**/*": "prettier --write --ignore-unknown",
52 | "*.{js,ts,jsx,tsx,css,md}": "prettier --write"
53 | },
54 | "packageManager": "pnpm@9.12.3+sha512.cce0f9de9c5a7c95bef944169cc5dfe8741abfb145078c0d508b868056848a87c81e626246cb60967cbd7fd29a6c062ef73ff840d96b3c86c40ac92cf4a813ee"
55 | }
56 |
--------------------------------------------------------------------------------
/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | const config = {
2 | plugins: ["@tailwindcss/postcss"],
3 | };
4 |
5 | export default config;
6 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/statico/jsgrids/1071201d5df9588d8c04bf6417109ec3eb285d12/public/favicon.ico
--------------------------------------------------------------------------------
/public/favicon.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/statico/jsgrids/1071201d5df9588d8c04bf6417109ec3eb285d12/public/favicon.jpg
--------------------------------------------------------------------------------
/public/jsgrids.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/statico/jsgrids/1071201d5df9588d8c04bf6417109ec3eb285d12/public/jsgrids.png
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | User-agent: *
2 | Allow: /
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2017",
4 | "lib": ["dom", "dom.iterable", "esnext"],
5 | "allowJs": true,
6 | "skipLibCheck": true,
7 | "strict": true,
8 | "noEmit": true,
9 | "esModuleInterop": true,
10 | "module": "esnext",
11 | "moduleResolution": "bundler",
12 | "resolveJsonModule": true,
13 | "isolatedModules": true,
14 | "jsx": "preserve",
15 | "incremental": true,
16 | "plugins": [
17 | {
18 | "name": "next"
19 | }
20 | ],
21 | "paths": {
22 | "@/*": ["./*"]
23 | }
24 | },
25 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
26 | "exclude": ["node_modules"]
27 | }
28 |
--------------------------------------------------------------------------------
|