@keenmate/web-grid 1.0.0-rc02

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +243 -0
  3. package/component-variables.manifest.json +192 -0
  4. package/dist/grid.d.ts +319 -0
  5. package/dist/index.d.ts +4 -0
  6. package/dist/modules/contextmenu/index.d.ts +10 -0
  7. package/dist/modules/datepicker/datepicker.d.ts +79 -0
  8. package/dist/modules/datepicker/formatting.d.ts +44 -0
  9. package/dist/modules/datepicker/index.d.ts +4 -0
  10. package/dist/modules/datepicker/interaction.d.ts +39 -0
  11. package/dist/modules/datepicker/navigation.d.ts +37 -0
  12. package/dist/modules/datepicker/rendering.d.ts +56 -0
  13. package/dist/modules/datepicker/types.d.ts +62 -0
  14. package/dist/modules/dropdown/index.d.ts +4 -0
  15. package/dist/modules/dropdown/input-handlers.d.ts +14 -0
  16. package/dist/modules/dropdown/interaction.d.ts +34 -0
  17. package/dist/modules/dropdown/options.d.ts +33 -0
  18. package/dist/modules/dropdown/rendering.d.ts +11 -0
  19. package/dist/modules/editing/index.d.ts +2 -0
  20. package/dist/modules/editing/lifecycle.d.ts +25 -0
  21. package/dist/modules/editing/renderers.d.ts +39 -0
  22. package/dist/modules/navigation/focus.d.ts +46 -0
  23. package/dist/modules/navigation/index.d.ts +1 -0
  24. package/dist/modules/rendering/display.d.ts +7 -0
  25. package/dist/modules/rendering/index.d.ts +3 -0
  26. package/dist/modules/rendering/table.d.ts +39 -0
  27. package/dist/modules/toolbar/index.d.ts +55 -0
  28. package/dist/modules/tooltip/index.d.ts +1 -0
  29. package/dist/modules/tooltip/tooltip.d.ts +13 -0
  30. package/dist/modules/types.d.ts +32 -0
  31. package/dist/types.d.ts +311 -0
  32. package/dist/web-component.d.ts +277 -0
  33. package/dist/web-grid.js +5370 -0
  34. package/dist/web-grid.umd.js +618 -0
  35. package/package.json +78 -0
  36. package/src/css/_cells.css +77 -0
  37. package/src/css/_dark-mode.css +51 -0
  38. package/src/css/_dialogs.css +121 -0
  39. package/src/css/_dropdown.css +193 -0
  40. package/src/css/_editors.css +184 -0
  41. package/src/css/_header.css +105 -0
  42. package/src/css/_modifiers.css +36 -0
  43. package/src/css/_navigation.css +25 -0
  44. package/src/css/_pagination.css +156 -0
  45. package/src/css/_table.css +90 -0
  46. package/src/css/_toolbar.css +139 -0
  47. package/src/css/_variables.css +265 -0
  48. package/src/css/_virtual-scroll.css +24 -0
  49. package/src/css/main.css +35 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 KeenMate
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,243 @@
1
+ # @keenmate/web-grid
2
+
3
+ A feature-rich, framework-agnostic data grid web component with sorting, filtering, pagination, inline editing, row toolbar, and context menu support.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @keenmate/web-grid
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ### ES Module (recommended)
14
+
15
+ ```html
16
+ <script type="module">
17
+ import '@keenmate/web-grid'
18
+ </script>
19
+
20
+ <web-grid id="grid"></web-grid>
21
+
22
+ <script type="module">
23
+ const grid = document.getElementById('grid')
24
+ grid.items = [
25
+ { id: 1, name: 'Alice', age: 28 },
26
+ { id: 2, name: 'Bob', age: 34 }
27
+ ]
28
+ grid.columns = [
29
+ { field: 'id', title: 'ID', width: '60px' },
30
+ { field: 'name', title: 'Name', sortable: true },
31
+ { field: 'age', title: 'Age', sortable: true }
32
+ ]
33
+ </script>
34
+ ```
35
+
36
+ ### UMD (Script Tag)
37
+
38
+ ```html
39
+ <script src="https://unpkg.com/@keenmate/web-grid"></script>
40
+ <web-grid id="grid"></web-grid>
41
+ ```
42
+
43
+ ## Features
44
+
45
+ - **Sorting** - Click column headers to sort ascending/descending
46
+ - **Filtering** - Per-column text input filters
47
+ - **Pagination** - Configurable page size with navigation
48
+ - **Inline Editing** - 7 editor types with validation support
49
+ - **Navigate Mode** - Spreadsheet-like keyboard navigation
50
+ - **Row Toolbar** - Floating action buttons on hover
51
+ - **Context Menu** - Right-click menu with dynamic options
52
+ - **Dark Mode** - Built-in dark theme support via CSS variables
53
+ - **Shadow DOM** - Encapsulated styles with CSS variable customization
54
+ - **TypeScript** - Full type definitions included
55
+
56
+ ## Properties
57
+
58
+ | Property | Type | Default | Description |
59
+ |----------|------|---------|-------------|
60
+ | `items` | `Array` | `[]` | Data array to display |
61
+ | `columns` | `Array<Column>` | `[]` | Column definitions |
62
+ | `sortable` | `boolean` | `false` | Enable column sorting |
63
+ | `filterable` | `boolean` | `false` | Enable column filtering |
64
+ | `pageable` | `boolean` | `false` | Enable pagination |
65
+ | `pageSize` | `number` | `10` | Rows per page |
66
+ | `editable` | `boolean` | `false` | Enable cell editing |
67
+ | `editTrigger` | `string` | `'dblclick'` | Edit trigger: `'click'`, `'dblclick'`, `'navigate'` |
68
+ | `striped` | `boolean` | `false` | Alternate row colors |
69
+ | `hoverable` | `boolean` | `false` | Highlight row on hover |
70
+ | `showRowToolbar` | `boolean` | `false` | Show row action toolbar |
71
+ | `rowToolbar` | `Array` | `[]` | Toolbar items configuration |
72
+ | `toolbarTrigger` | `string` | `'hover'` | Toolbar trigger: `'hover'`, `'button'` |
73
+ | `contextMenu` | `Array` | `[]` | Context menu items |
74
+
75
+ ## Column Definition
76
+
77
+ ```javascript
78
+ {
79
+ field: 'fieldName', // Data field name (required)
80
+ title: 'Column Title', // Display title
81
+ width: '100px', // Column width
82
+ minWidth: '50px', // Minimum width
83
+ maxWidth: '300px', // Maximum width
84
+ align: 'left', // 'left', 'center', 'right'
85
+ textOverflow: 'wrap', // 'wrap' or 'ellipsis'
86
+ sortable: true, // Enable sorting
87
+ filterable: true, // Enable filtering
88
+ editable: true, // Enable editing
89
+ editor: 'text', // Editor type
90
+ editorOptions: {}, // Editor configuration
91
+ formatCallback: (value, row) => '', // Value formatter
92
+ templateCallback: (row, column) => '', // Custom cell HTML
93
+ cellClassCallback: (value, row) => '', // Dynamic CSS class
94
+ beforeCommitCallback: (ctx) => true // Validation
95
+ }
96
+ ```
97
+
98
+ ## Editor Types
99
+
100
+ | Type | Description | Options |
101
+ |------|-------------|---------|
102
+ | `text` | Text input | `placeholder`, `maxLength`, `inputMode` |
103
+ | `number` | Number input | `min`, `max`, `step` |
104
+ | `checkbox` | Boolean toggle | - |
105
+ | `select` | Dropdown list | `options`, `allowEmpty`, `emptyLabel` |
106
+ | `combobox` | Filterable dropdown | `options`, `placeholder` |
107
+ | `autocomplete` | Async search | `onSearchCallback(query)`, `placeholder`, `minSearchLength` |
108
+ | `date` | Date picker | `min`, `max` |
109
+
110
+ ## Row Toolbar
111
+
112
+ ```javascript
113
+ grid.showRowToolbar = true
114
+ grid.rowToolbar = ['add', 'delete', 'duplicate', 'moveUp', 'moveDown']
115
+
116
+ // Custom items
117
+ grid.rowToolbar = [
118
+ 'add',
119
+ {
120
+ id: 'custom',
121
+ icon: '🔧',
122
+ title: 'Custom Action',
123
+ danger: false,
124
+ onclick: ({ row, rowIndex }) => { /* ... */ }
125
+ }
126
+ ]
127
+ ```
128
+
129
+ ## Context Menu
130
+
131
+ ```javascript
132
+ grid.contextMenu = [
133
+ {
134
+ id: 'view',
135
+ label: 'View Details',
136
+ icon: '👁️',
137
+ visible: (ctx) => true,
138
+ disabled: (ctx) => false,
139
+ danger: false,
140
+ onclick: (ctx) => {}
141
+ }
142
+ ]
143
+ ```
144
+
145
+ ## Events
146
+
147
+ | Event | Detail | Description |
148
+ |-------|--------|-------------|
149
+ | `rowchange` | `{ rowIndex, field, oldValue, newValue, row }` | Cell value changed |
150
+ | `roweditstart` | `{ rowIndex, field, row }` | Edit started |
151
+ | `roweditend` | `{ rowIndex, field, row, committed }` | Edit ended |
152
+ | `rowaction` | `{ action, rowIndex, row }` | Toolbar action |
153
+
154
+ ## Styling
155
+
156
+ WebGrid uses CSS custom properties with a fallback chain:
157
+
158
+ ```css
159
+ web-grid {
160
+ /* Override component variables directly */
161
+ --wg-accent-color: #10b981;
162
+ --wg-header-bg: #f5f5f5;
163
+ }
164
+
165
+ /* Or set base variables for all KeenMate components */
166
+ :root {
167
+ --base-accent-color: #10b981;
168
+ --base-surface-1: #ffffff;
169
+ }
170
+ ```
171
+
172
+ ### Key Variables
173
+
174
+ | Variable | Description |
175
+ |----------|-------------|
176
+ | `--wg-accent-color` | Primary accent color |
177
+ | `--wg-text-color-1` | Primary text color |
178
+ | `--wg-surface-1` | Background color |
179
+ | `--wg-surface-2` | Alternate row/header background |
180
+ | `--wg-border-color` | Border color |
181
+
182
+ ### Component Variables Manifest
183
+
184
+ A machine-readable manifest documenting all CSS variables is included in the package:
185
+
186
+ ```javascript
187
+ import manifest from '@keenmate/web-grid/manifest'
188
+
189
+ console.log(manifest.prefix) // "wg"
190
+ console.log(manifest.baseVariables) // 34 --base-* variables consumed
191
+ console.log(manifest.componentVariables) // 121 --wg-* variables exposed
192
+ ```
193
+
194
+ The manifest follows the [component-variables schema](https://raw.githubusercontent.com/keenmate/schemas/main/component-variables.schema.json) and contains:
195
+
196
+ - **baseVariables** - Theme variables (`--base-*`) the component consumes from `@keenmate/theme-designer`
197
+ - **componentVariables** - Component-specific variables (`--wg-*`) with category and usage descriptions
198
+
199
+ Example entry:
200
+ ```json
201
+ {
202
+ "name": "wg-header-bg",
203
+ "category": "header",
204
+ "usage": "Header row background color"
205
+ }
206
+ ```
207
+
208
+ ### Dark Mode
209
+
210
+ Dark mode is triggered automatically by:
211
+ - OS preference: `@media (prefers-color-scheme: dark)`
212
+ - Attribute: `data-theme="dark"` on ancestor
213
+ - Bootstrap: `data-bs-theme="dark"` on ancestor
214
+ - Class: `.dark` on ancestor (Tailwind CSS)
215
+
216
+ ## Dynamic Cell Styling
217
+
218
+ ```javascript
219
+ // Per-cell styling via column callback
220
+ grid.columns = [{
221
+ field: 'salary',
222
+ cellClassCallback: (value, row) => value > 90000 ? 'high-value' : null
223
+ }]
224
+
225
+ // Per-row styling
226
+ grid.rowClassCallback = (row, index) => row.status === 'inactive' ? 'row-inactive' : null
227
+
228
+ // Inject custom CSS into shadow DOM
229
+ grid.customStylesCallback = () => `
230
+ .high-value { background: #d1fae5 !important; }
231
+ .row-inactive { opacity: 0.5; }
232
+ `
233
+ ```
234
+
235
+ ## Browser Support
236
+
237
+ - Chrome/Edge 88+
238
+ - Firefox 78+
239
+ - Safari 14+
240
+
241
+ ## License
242
+
243
+ MIT
@@ -0,0 +1,192 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/keenmate/schemas/main/component-variables.schema.json",
3
+ "component": "@keenmate/web-grid",
4
+ "prefix": "wg",
5
+ "baseVariables": [
6
+ { "name": "base-accent-color", "required": true, "usage": "Focus rings, active states, editor outline" },
7
+ { "name": "base-accent-color-hover", "required": false, "usage": "Hover states for accent elements" },
8
+ { "name": "base-accent-color-active", "required": false, "usage": "Active/pressed states" },
9
+ { "name": "base-accent-color-light", "required": false, "usage": "Light accent backgrounds" },
10
+ { "name": "base-text-color-1", "required": true, "usage": "Primary cell and header text" },
11
+ { "name": "base-text-color-2", "required": false, "usage": "Secondary text, subtitles" },
12
+ { "name": "base-text-color-3", "required": false, "usage": "Placeholder, disabled, empty state text" },
13
+ { "name": "base-text-on-accent", "required": false, "usage": "Text on accent backgrounds" },
14
+ { "name": "base-surface-1", "required": true, "usage": "Table background, cell background, inputs" },
15
+ { "name": "base-surface-2", "required": true, "usage": "Header background, striped rows, pagination buttons" },
16
+ { "name": "base-surface-3", "required": false, "usage": "Hover states, sorted header, active buttons" },
17
+ { "name": "base-dropdown-bg", "required": false, "usage": "Toolbar, context menu, floating surfaces" },
18
+ { "name": "base-border-color", "required": true, "usage": "Table, cell, header, toolbar borders" },
19
+ { "name": "base-input-bg", "required": false, "usage": "Filter input, editor backgrounds" },
20
+ { "name": "base-input-color", "required": false, "usage": "Input text color" },
21
+ { "name": "base-input-border", "required": false, "usage": "Filter input border" },
22
+ { "name": "base-input-border-hover", "required": false, "usage": "Input border on hover" },
23
+ { "name": "base-input-border-focus", "required": false, "usage": "Focused input border" },
24
+ { "name": "base-input-placeholder-color", "required": false, "usage": "Placeholder text color" },
25
+ { "name": "base-dropdown-box-shadow", "required": false, "usage": "Toolbar, dropdown shadows" },
26
+ { "name": "base-danger-color", "required": false, "usage": "Validation error text, indicators" },
27
+ { "name": "base-danger-bg-light", "required": false, "usage": "Error cell background, danger button hover" },
28
+ { "name": "base-tooltip-bg", "required": false, "usage": "Tooltip background" },
29
+ { "name": "base-font-family", "required": false, "usage": "All text in grid" },
30
+ { "name": "base-font-size-base", "required": false, "usage": "Cell text, editor text (multiplier)" },
31
+ { "name": "base-font-size-sm", "required": false, "usage": "Filter input, pagination, labels (multiplier)" },
32
+ { "name": "base-font-size-xs", "required": false, "usage": "Error messages (multiplier)" },
33
+ { "name": "base-font-size-lg", "required": false, "usage": "Large text elements (multiplier)" },
34
+ { "name": "base-font-weight-normal", "required": false, "usage": "Normal text weight" },
35
+ { "name": "base-font-weight-semibold", "required": false, "usage": "Header text weight" },
36
+ { "name": "base-line-height-normal", "required": false, "usage": "Default line height (multiplier)" },
37
+ { "name": "base-border-radius-sm", "required": false, "usage": "Buttons, inputs, toolbar (multiplier)" },
38
+ { "name": "base-border-radius-md", "required": false, "usage": "Cards, larger elements (multiplier)" },
39
+ { "name": "base-border-radius-lg", "required": false, "usage": "Large rounded elements (multiplier)" }
40
+ ],
41
+ "componentVariables": [
42
+ { "name": "wg-rem", "category": "sizing", "usage": "Base sizing unit for proportional scaling (default: 10px)" },
43
+
44
+ { "name": "wg-accent-color", "category": "accent", "usage": "Primary accent color for interactive elements" },
45
+ { "name": "wg-accent-color-hover", "category": "accent", "usage": "Accent color on hover" },
46
+ { "name": "wg-accent-color-active", "category": "accent", "usage": "Accent color when pressed/active" },
47
+ { "name": "wg-accent-color-light", "category": "accent", "usage": "Light accent for subtle backgrounds" },
48
+
49
+ { "name": "wg-text-color-1", "category": "text", "usage": "Primary text color (headers, cell content)" },
50
+ { "name": "wg-text-color-2", "category": "text", "usage": "Secondary text color" },
51
+ { "name": "wg-text-color-3", "category": "text", "usage": "Tertiary text (placeholders, disabled)" },
52
+ { "name": "wg-text-on-accent", "category": "text", "usage": "Text color on accent backgrounds" },
53
+
54
+ { "name": "wg-surface-1", "category": "surface", "usage": "Primary background (table, cells)" },
55
+ { "name": "wg-surface-2", "category": "surface", "usage": "Secondary background (headers, striped rows)" },
56
+ { "name": "wg-surface-3", "category": "surface", "usage": "Tertiary background (hover states)" },
57
+ { "name": "wg-surface-floating", "category": "surface", "usage": "Floating elements (toolbar, dropdowns)" },
58
+
59
+ { "name": "wg-border-color", "category": "border", "usage": "Default border color" },
60
+ { "name": "wg-border-color-hover", "category": "border", "usage": "Border color on hover" },
61
+
62
+ { "name": "wg-input-bg", "category": "input", "usage": "Input field background" },
63
+ { "name": "wg-input-color", "category": "input", "usage": "Input text color" },
64
+ { "name": "wg-input-border", "category": "input", "usage": "Input border (full shorthand)" },
65
+ { "name": "wg-input-border-hover", "category": "input", "usage": "Input border on hover" },
66
+ { "name": "wg-input-border-focus", "category": "input", "usage": "Input border when focused" },
67
+ { "name": "wg-input-placeholder-color", "category": "input", "usage": "Input placeholder text color" },
68
+
69
+ { "name": "wg-danger-color", "category": "danger", "usage": "Error/danger text and icons" },
70
+ { "name": "wg-danger-bg-light", "category": "danger", "usage": "Light danger background" },
71
+
72
+ { "name": "wg-hover-bg", "category": "state", "usage": "Generic hover background" },
73
+ { "name": "wg-active-bg", "category": "state", "usage": "Generic active/pressed background" },
74
+
75
+ { "name": "wg-font-size-base", "category": "typography", "usage": "Base font size" },
76
+ { "name": "wg-font-size-sm", "category": "typography", "usage": "Small font size" },
77
+ { "name": "wg-font-size-xs", "category": "typography", "usage": "Extra small font size" },
78
+ { "name": "wg-font-size-lg", "category": "typography", "usage": "Large font size" },
79
+ { "name": "wg-line-height-base", "category": "typography", "usage": "Base line height" },
80
+ { "name": "wg-font-weight-normal", "category": "typography", "usage": "Normal font weight" },
81
+ { "name": "wg-font-weight-semibold", "category": "typography", "usage": "Semibold font weight" },
82
+
83
+ { "name": "wg-border-radius-sm", "category": "radius", "usage": "Small border radius" },
84
+ { "name": "wg-border-radius-md", "category": "radius", "usage": "Medium border radius" },
85
+ { "name": "wg-border-radius-lg", "category": "radius", "usage": "Large border radius" },
86
+
87
+ { "name": "wg-spacing-xs", "category": "spacing", "usage": "Extra small spacing (4px)" },
88
+ { "name": "wg-spacing-sm", "category": "spacing", "usage": "Small spacing (8px)" },
89
+ { "name": "wg-spacing-md", "category": "spacing", "usage": "Medium spacing (12px)" },
90
+ { "name": "wg-spacing-lg", "category": "spacing", "usage": "Large spacing (16px)" },
91
+ { "name": "wg-spacing-xl", "category": "spacing", "usage": "Extra large spacing (24px)" },
92
+
93
+ { "name": "wg-table-bg", "category": "table", "usage": "Table background color" },
94
+ { "name": "wg-table-border", "category": "table", "usage": "Table outer border" },
95
+
96
+ { "name": "wg-header-bg", "category": "header", "usage": "Header row background" },
97
+ { "name": "wg-header-bg-hover", "category": "header", "usage": "Header cell hover background" },
98
+ { "name": "wg-header-bg-sorted", "category": "header", "usage": "Sorted column header background" },
99
+ { "name": "wg-header-color", "category": "header", "usage": "Header text color" },
100
+ { "name": "wg-header-border", "category": "header", "usage": "Header bottom border" },
101
+ { "name": "wg-header-padding", "category": "header", "usage": "Header cell padding" },
102
+ { "name": "wg-header-font-weight", "category": "header", "usage": "Header text weight" },
103
+
104
+ { "name": "wg-cell-padding", "category": "cell", "usage": "Cell content padding" },
105
+ { "name": "wg-cell-color", "category": "cell", "usage": "Cell text color" },
106
+ { "name": "wg-cell-border", "category": "cell", "usage": "Cell border" },
107
+ { "name": "wg-cell-bg-hover", "category": "cell", "usage": "Cell hover background" },
108
+ { "name": "wg-cell-bg-editing", "category": "cell", "usage": "Cell background when editing" },
109
+ { "name": "wg-cell-readonly-bg", "category": "cell", "usage": "Read-only cell background" },
110
+
111
+ { "name": "wg-row-border", "category": "row", "usage": "Row border" },
112
+ { "name": "wg-row-bg-even", "category": "row", "usage": "Even row background (striped)" },
113
+ { "name": "wg-row-bg-hover", "category": "row", "usage": "Row hover background" },
114
+
115
+ { "name": "wg-filter-bg", "category": "filter", "usage": "Filter row background" },
116
+ { "name": "wg-filter-border", "category": "filter", "usage": "Filter row border" },
117
+ { "name": "wg-filter-padding", "category": "filter", "usage": "Filter cell padding" },
118
+ { "name": "wg-filter-input-padding", "category": "filter", "usage": "Filter input padding" },
119
+ { "name": "wg-filter-input-bg", "category": "filter", "usage": "Filter input background" },
120
+ { "name": "wg-filter-input-border", "category": "filter", "usage": "Filter input border" },
121
+ { "name": "wg-filter-input-border-focus", "category": "filter", "usage": "Filter input focus border" },
122
+ { "name": "wg-filter-input-border-radius", "category": "filter", "usage": "Filter input border radius" },
123
+ { "name": "wg-filter-input-font-size", "category": "filter", "usage": "Filter input font size" },
124
+
125
+ { "name": "wg-sort-indicator-size", "category": "sort", "usage": "Sort arrow icon size" },
126
+ { "name": "wg-sort-indicator-opacity", "category": "sort", "usage": "Active sort indicator opacity" },
127
+ { "name": "wg-sort-placeholder-opacity", "category": "sort", "usage": "Inactive sort indicator opacity" },
128
+ { "name": "wg-sort-priority-size", "category": "sort", "usage": "Multi-sort priority number size" },
129
+
130
+ { "name": "wg-pagination-padding", "category": "pagination", "usage": "Pagination bar padding" },
131
+ { "name": "wg-pagination-gap", "category": "pagination", "usage": "Gap between pagination elements" },
132
+ { "name": "wg-pagination-bg", "category": "pagination", "usage": "Pagination bar background" },
133
+ { "name": "wg-pagination-border", "category": "pagination", "usage": "Pagination bar border" },
134
+ { "name": "wg-pagination-btn-padding", "category": "pagination", "usage": "Pagination button padding" },
135
+ { "name": "wg-pagination-btn-bg", "category": "pagination", "usage": "Pagination button background" },
136
+ { "name": "wg-pagination-btn-bg-hover", "category": "pagination", "usage": "Pagination button hover background" },
137
+ { "name": "wg-pagination-btn-bg-active", "category": "pagination", "usage": "Pagination button active background" },
138
+ { "name": "wg-pagination-btn-border", "category": "pagination", "usage": "Pagination button border" },
139
+ { "name": "wg-pagination-btn-border-hover", "category": "pagination", "usage": "Pagination button hover border" },
140
+ { "name": "wg-pagination-btn-border-radius", "category": "pagination", "usage": "Pagination button border radius" },
141
+ { "name": "wg-pagination-btn-disabled-opacity", "category": "pagination", "usage": "Disabled button opacity" },
142
+
143
+ { "name": "wg-empty-padding", "category": "empty", "usage": "Empty state message padding" },
144
+ { "name": "wg-empty-color", "category": "empty", "usage": "Empty state text color" },
145
+
146
+ { "name": "wg-error-cell-bg", "category": "error", "usage": "Error cell background" },
147
+ { "name": "wg-error-cell-border", "category": "error", "usage": "Error cell border" },
148
+ { "name": "wg-error-message-color", "category": "error", "usage": "Error message text color" },
149
+ { "name": "wg-error-message-font-size", "category": "error", "usage": "Error message font size" },
150
+ { "name": "wg-error-indicator-color", "category": "error", "usage": "Error indicator icon color" },
151
+
152
+ { "name": "wg-editor-bg", "category": "editor", "usage": "Editor cell background" },
153
+ { "name": "wg-editor-outline", "category": "editor", "usage": "Editor focus outline" },
154
+ { "name": "wg-editor-outline-offset", "category": "editor", "usage": "Editor outline offset" },
155
+ { "name": "wg-editor-validating-opacity", "category": "editor", "usage": "Opacity during validation" },
156
+
157
+ { "name": "wg-dropdown-toggle-right", "category": "dropdown", "usage": "Dropdown toggle right position" },
158
+ { "name": "wg-dropdown-toggle-size", "category": "dropdown", "usage": "Dropdown toggle icon size" },
159
+ { "name": "wg-dropdown-toggle-hitbox", "category": "dropdown", "usage": "Dropdown toggle click area" },
160
+
161
+ { "name": "wg-toolbar-bg", "category": "toolbar", "usage": "Row toolbar background" },
162
+ { "name": "wg-toolbar-border", "category": "toolbar", "usage": "Row toolbar border" },
163
+ { "name": "wg-toolbar-border-radius", "category": "toolbar", "usage": "Row toolbar border radius" },
164
+ { "name": "wg-toolbar-shadow", "category": "toolbar", "usage": "Row toolbar shadow" },
165
+ { "name": "wg-toolbar-divider-color", "category": "toolbar", "usage": "Toolbar divider color" },
166
+ { "name": "wg-toolbar-btn-min-width", "category": "toolbar", "usage": "Toolbar button minimum width" },
167
+ { "name": "wg-toolbar-btn-padding", "category": "toolbar", "usage": "Toolbar button padding" },
168
+ { "name": "wg-toolbar-btn-border-radius", "category": "toolbar", "usage": "Toolbar button border radius" },
169
+ { "name": "wg-toolbar-btn-bg-hover", "category": "toolbar", "usage": "Toolbar button hover background" },
170
+ { "name": "wg-toolbar-btn-bg-active", "category": "toolbar", "usage": "Toolbar button active background" },
171
+ { "name": "wg-toolbar-btn-color", "category": "toolbar", "usage": "Toolbar button icon/text color" },
172
+ { "name": "wg-toolbar-trigger-color", "category": "toolbar", "usage": "Toolbar trigger button color" },
173
+ { "name": "wg-toolbar-trigger-color-hover", "category": "toolbar", "usage": "Toolbar trigger hover color" },
174
+ { "name": "wg-toolbar-trigger-bg-hover", "category": "toolbar", "usage": "Toolbar trigger hover background" },
175
+
176
+ { "name": "wg-tooltip-bg", "category": "tooltip", "usage": "Tooltip background color" },
177
+
178
+ { "name": "wg-context-menu-z-index", "category": "context-menu", "usage": "Context menu z-index" },
179
+ { "name": "wg-context-menu-min-width", "category": "context-menu", "usage": "Context menu minimum width" },
180
+
181
+ { "name": "wg-focus-outline", "category": "focus", "usage": "Navigate mode focus outline" },
182
+ { "name": "wg-focus-outline-offset", "category": "focus", "usage": "Focus outline offset" },
183
+ { "name": "wg-focus-bg", "category": "focus", "usage": "Focused cell background" },
184
+
185
+ { "name": "wg-transition-fast", "category": "transition", "usage": "Fast transition duration" },
186
+ { "name": "wg-transition-normal", "category": "transition", "usage": "Normal transition duration" },
187
+
188
+ { "name": "wg-z-dropdown", "category": "z-index", "usage": "Dropdown z-index layer" },
189
+ { "name": "wg-z-toolbar", "category": "z-index", "usage": "Toolbar z-index layer" },
190
+ { "name": "wg-z-context-menu", "category": "z-index", "usage": "Context menu z-index layer" }
191
+ ]
192
+ }