@visns-studio/visns-components 6.5.5 → 6.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/components/DataGrid.jsx +97 -48
- package/src/components/generic/GenericAuth.jsx +23 -1
- package/src/components/generic/GenericIndex.jsx +35 -3
- package/src/components/generic/GenericMain.jsx +8 -0
- package/src/components/styles/DataGrid.module.scss +11 -11
- package/src/components/styles/Field.module.scss +5 -5
- package/src/components/styles/GenericDetail.module.scss +6 -3
- package/src/components/styles/GenericIndex.module.scss +9 -2
- package/src/components/styles/GenericMain.module.scss +57 -4
- package/src/components/styles/Navigation.module.scss +11 -7
- package/src/components/styles/_controls.scss +4 -4
- package/src/components/styles/density.css +85 -0
- package/src/components/styles/global-datagrid.css +50 -167
- package/src/components/utils/useDensity.js +225 -0
- package/src/index.js +4 -0
|
@@ -1,3 +1,56 @@
|
|
|
1
|
+
/* ============================================================================
|
|
2
|
+
Density hooks (page, controls, grid, fields, detail)
|
|
3
|
+
----------------------------------------------------------------------------
|
|
4
|
+
The second half of the set documented at the top of Navigation.module.scss,
|
|
5
|
+
written the same way: every declaration carrying one of these reads
|
|
6
|
+
`var(--hook, <the value it always had>)`, so a project that sets none of them
|
|
7
|
+
renders byte-identically to before. They exist for the density system — an
|
|
8
|
+
app overrides them on `:root` in its own global stylesheet to tighten (or
|
|
9
|
+
loosen) the whole UI without forking a component.
|
|
10
|
+
|
|
11
|
+
Page shell — this file
|
|
12
|
+
--page-gutter-y vertical padding of the content gutter
|
|
13
|
+
(`.padding` / `.paddingSimple`).
|
|
14
|
+
default: var(--spacing-lg)
|
|
15
|
+
--page-gutter-x horizontal padding of the same.
|
|
16
|
+
default: clamp(var(--spacing-md), 3vw, var(--spacing-xl))
|
|
17
|
+
--page-gutter-narrow the flat gutter used below 960px, both axes.
|
|
18
|
+
default: var(--spacing-md)
|
|
19
|
+
--page-max-width cap on the content column's width. default: 2200px
|
|
20
|
+
--content-header-height the page's own content-header band. default: 52.5px
|
|
21
|
+
|
|
22
|
+
Controls — _controls.scss
|
|
23
|
+
--control-height min-height of every button (`button-base`) and
|
|
24
|
+
input (`input-base`). default: 2.5rem
|
|
25
|
+
--control-height-sm min-height of the small button variant.
|
|
26
|
+
default: 2rem
|
|
27
|
+
--input-padding-x horizontal padding inside an input. default: 0.65rem
|
|
28
|
+
|
|
29
|
+
Data grid — DataGrid.module.scss, global-datagrid.css
|
|
30
|
+
--grid-toolbar-height height of the toolbar / search strip and the
|
|
31
|
+
buttons sitting in it (11 declarations).
|
|
32
|
+
default: 38px
|
|
33
|
+
--grid-cell-padding padding inside a grid body cell. default: 6px 8px
|
|
34
|
+
--grid-checkbox-col-width width of the row-select checkbox column, held
|
|
35
|
+
in step with checkboxColWidth in
|
|
36
|
+
utils/useDensity.js. default: 60px
|
|
37
|
+
|
|
38
|
+
Fields — Field.module.scss
|
|
39
|
+
--field-pocket-size min-height of a file-list row. default: 36px
|
|
40
|
+
--field-pocket-size-sm the square trash chip on that row. default: 28px
|
|
41
|
+
--field-suggestion-font-size type size of the email-suggestion list
|
|
42
|
+
(kept in step with react-select). default: 14px
|
|
43
|
+
|
|
44
|
+
Detail / index — GenericDetail.module.scss, GenericIndex.module.scss
|
|
45
|
+
--detail-max-width cap on the wide modal, shared by both files so the
|
|
46
|
+
two surfaces stay the same width. default: 1400px
|
|
47
|
+
--detail-prose-width measure of a description paragraph. default: 70ch
|
|
48
|
+
--detail-panel-max-width cap on the centred empty-state panel. default: 600px
|
|
49
|
+
|
|
50
|
+
Nav-bar hooks (`--nav-*`, including `--nav-logo-height`) are documented at
|
|
51
|
+
the top of Navigation.module.scss and are not repeated here.
|
|
52
|
+
========================================================================= */
|
|
53
|
+
|
|
1
54
|
.header {
|
|
2
55
|
background: var(--primary-color);
|
|
3
56
|
color: var(--primary-color);
|
|
@@ -36,7 +89,7 @@
|
|
|
36
89
|
border-bottom: 1px solid rgba(0, 0, 0, 0.14);
|
|
37
90
|
box-sizing: border-box;
|
|
38
91
|
padding: 1em;
|
|
39
|
-
height: 52.5px;
|
|
92
|
+
height: var(--content-header-height, 52.5px);
|
|
40
93
|
box-shadow: 1px 0px 0px rgba(255, 255, 255, 0.5);
|
|
41
94
|
display: flex;
|
|
42
95
|
flex-wrap: nowrap;
|
|
@@ -94,13 +147,13 @@
|
|
|
94
147
|
and on a phone gave the same gutter as a desktop. */
|
|
95
148
|
.padding,
|
|
96
149
|
.paddingSimple {
|
|
97
|
-
padding: var(--spacing-lg) clamp(var(--spacing-md), 3vw, var(--spacing-xl));
|
|
150
|
+
padding: var(--page-gutter-y, var(--spacing-lg)) var(--page-gutter-x, clamp(var(--spacing-md), 3vw, var(--spacing-xl)));
|
|
98
151
|
/* Long lines of data are hard to track across an ultrawide screen. This
|
|
99
152
|
is generous enough never to bite on a laptop. */
|
|
100
|
-
max-width: 2200px;
|
|
153
|
+
max-width: var(--page-max-width, 2200px);
|
|
101
154
|
margin: 0 auto;
|
|
102
155
|
|
|
103
156
|
@media (max-width: 960px) {
|
|
104
|
-
padding: var(--spacing-md) var(--spacing-md);
|
|
157
|
+
padding: var(--page-gutter-narrow, var(--spacing-md)) var(--page-gutter-narrow, var(--spacing-md));
|
|
105
158
|
}
|
|
106
159
|
}
|
|
@@ -34,6 +34,10 @@
|
|
|
34
34
|
chips. default: 4px
|
|
35
35
|
--nav-dropdown-item-padding padding on a dropdown menu row.
|
|
36
36
|
default: 8px 20px
|
|
37
|
+
--nav-logo-height height of the logo plate, and the same figure
|
|
38
|
+
everywhere the rail, the content header and the
|
|
39
|
+
mobile drawer offset themselves by it.
|
|
40
|
+
default: 50px
|
|
37
41
|
|
|
38
42
|
Two deliberate omissions: the icon-to-label gap inside a nav item and the
|
|
39
43
|
padding on the chips themselves are internal alignment, not density — the
|
|
@@ -711,7 +715,7 @@
|
|
|
711
715
|
A project whose page background is the same colour can merge the
|
|
712
716
|
plate into the rail instead: `--nav-logo-bg: var(--nav-bg)`. */
|
|
713
717
|
background: var(--nav-logo-bg, rgba(var(--tertiary-color-rgb), 0.95));
|
|
714
|
-
height: 50px;
|
|
718
|
+
height: var(--nav-logo-height, 50px);
|
|
715
719
|
display: flex;
|
|
716
720
|
flex-wrap: nowrap;
|
|
717
721
|
justify-content: center;
|
|
@@ -727,7 +731,7 @@
|
|
|
727
731
|
width: 100%;
|
|
728
732
|
position: relative;
|
|
729
733
|
overflow-y: auto; /* Enable vertical scrolling */
|
|
730
|
-
max-height: calc(100vh - 50px); /* Subtract the logo height */
|
|
734
|
+
max-height: calc(100vh - var(--nav-logo-height, 50px)); /* Subtract the logo height */
|
|
731
735
|
scrollbar-width: none; /* Firefox */
|
|
732
736
|
-ms-overflow-style: none; /* IE and Edge */
|
|
733
737
|
|
|
@@ -1029,7 +1033,7 @@
|
|
|
1029
1033
|
background: var(--tertiary-color);
|
|
1030
1034
|
box-sizing: border-box;
|
|
1031
1035
|
padding: 0.15rem;
|
|
1032
|
-
height: 50px;
|
|
1036
|
+
height: var(--nav-logo-height, 50px);
|
|
1033
1037
|
box-shadow: var(--box-shadow-small);
|
|
1034
1038
|
display: flex;
|
|
1035
1039
|
flex-wrap: nowrap;
|
|
@@ -1150,8 +1154,8 @@
|
|
|
1150
1154
|
below it: start the drawer under the 50px header instead of
|
|
1151
1155
|
letting the header paint over the drawer's top row. This also
|
|
1152
1156
|
keeps the hamburger tappable while the drawer is open. */
|
|
1153
|
-
top: 50px;
|
|
1154
|
-
height: calc(100% - 50px);
|
|
1157
|
+
top: var(--nav-logo-height, 50px);
|
|
1158
|
+
height: calc(100% - var(--nav-logo-height, 50px));
|
|
1155
1159
|
transform: translateX(-2000px);
|
|
1156
1160
|
transition: all 0.55s cubic-bezier(0.25, 0.8, 0.25, 1);
|
|
1157
1161
|
will-change: transform;
|
|
@@ -1214,13 +1218,13 @@
|
|
|
1214
1218
|
|
|
1215
1219
|
.content--full {
|
|
1216
1220
|
/* The 50px bar is still there below this width. */
|
|
1217
|
-
min-height: calc(100vh - 50px);
|
|
1221
|
+
min-height: calc(100vh - var(--nav-logo-height, 50px));
|
|
1218
1222
|
}
|
|
1219
1223
|
|
|
1220
1224
|
.drawer-backdrop {
|
|
1221
1225
|
display: block;
|
|
1222
1226
|
position: fixed;
|
|
1223
|
-
top: 50px;
|
|
1227
|
+
top: var(--nav-logo-height, 50px);
|
|
1224
1228
|
left: 0;
|
|
1225
1229
|
right: 0;
|
|
1226
1230
|
bottom: 0;
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
justify-content: center;
|
|
18
18
|
gap: 0.4rem;
|
|
19
19
|
width: max-content;
|
|
20
|
-
min-height: 2.5rem;
|
|
20
|
+
min-height: var(--control-height, 2.5rem);
|
|
21
21
|
padding: 0 var(--spacing-md);
|
|
22
22
|
border: 1px solid transparent;
|
|
23
23
|
border-radius: var(--radius-sm);
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
}
|
|
103
103
|
|
|
104
104
|
@mixin button-small {
|
|
105
|
-
min-height: 2rem;
|
|
105
|
+
min-height: var(--control-height-sm, 2rem);
|
|
106
106
|
padding: 0 var(--spacing-sm);
|
|
107
107
|
font-size: var(--font-size-xs);
|
|
108
108
|
}
|
|
@@ -111,8 +111,8 @@
|
|
|
111
111
|
|
|
112
112
|
@mixin input-base {
|
|
113
113
|
width: 100%;
|
|
114
|
-
min-height: 2.5rem;
|
|
115
|
-
padding: 0 0.65rem;
|
|
114
|
+
min-height: var(--control-height, 2.5rem);
|
|
115
|
+
padding: 0 var(--input-padding-x, 0.65rem);
|
|
116
116
|
border: 1px solid var(--border-color);
|
|
117
117
|
border-radius: var(--radius-sm);
|
|
118
118
|
background: var(--paper);
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/* ============================================================================
|
|
2
|
+
Display density
|
|
3
|
+
----------------------------------------------------------------------------
|
|
4
|
+
One opt-in mode — `large` — for the projects that run on a shop-floor
|
|
5
|
+
monitor, a wall-mounted screen or in front of someone who would rather not
|
|
6
|
+
lean in. Everything in this file hangs off `:root[data-density='large']`,
|
|
7
|
+
and that attribute is only ever written by GenericAuth when the app passes
|
|
8
|
+
the `density` prop:
|
|
9
|
+
|
|
10
|
+
<GenericAuth density="large" ... />
|
|
11
|
+
|
|
12
|
+
No prop, no attribute, no rule in here matches — an app that never opts in
|
|
13
|
+
renders exactly as it always has. There is nothing to import, disable or
|
|
14
|
+
fork on that path.
|
|
15
|
+
|
|
16
|
+
The lever is rem, not a table of overrides. `font-size: 112.5%` on the root
|
|
17
|
+
takes the browser's 16px up to 18px, and every rem-based token, control,
|
|
18
|
+
gap and type size in the library follows on its own — that is most of the
|
|
19
|
+
mode, done once. The custom properties below only exist to catch what rem
|
|
20
|
+
cannot reach: the px-valued hooks the components expose (row heights, cell
|
|
21
|
+
padding, fixed chrome heights, pocket squares) and the page-width caps that
|
|
22
|
+
should simply stop capping when the screen is being used as a big screen.
|
|
23
|
+
|
|
24
|
+
Overriding a value
|
|
25
|
+
------------------
|
|
26
|
+
Apps override any of these from their own global stylesheet with the more
|
|
27
|
+
specific selector:
|
|
28
|
+
|
|
29
|
+
html:root[data-density='large'] {
|
|
30
|
+
--control-height: 3rem;
|
|
31
|
+
--grid-cell-padding: 12px 14px;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
`html:root[...]` outweighs the plain `:root[...]` used here on specificity
|
|
35
|
+
alone, so it wins no matter which stylesheet the bundler emits first — no
|
|
36
|
+
`!important`, no import-order archaeology.
|
|
37
|
+
|
|
38
|
+
The root font-size has its own escape hatch so an app can dial the whole
|
|
39
|
+
mode up or down without restating a single hook:
|
|
40
|
+
|
|
41
|
+
html:root[data-density='large'] { --density-root-font-size: 125%; }
|
|
42
|
+
|
|
43
|
+
Anything the app sets on plain `:root` stays the shared value for both
|
|
44
|
+
densities — set it here only when `large` should differ.
|
|
45
|
+
========================================================================= */
|
|
46
|
+
|
|
47
|
+
:root[data-density='large'] {
|
|
48
|
+
font-size: var(--density-root-font-size, 112.5%);
|
|
49
|
+
|
|
50
|
+
/* Page frame — a large display is asked for width, so stop capping it. */
|
|
51
|
+
--page-max-width: none;
|
|
52
|
+
--page-gutter-x: clamp(0.5rem, 1vw, 1rem);
|
|
53
|
+
--page-gutter-y: 0.75rem;
|
|
54
|
+
--page-gutter-narrow: 0.5rem;
|
|
55
|
+
|
|
56
|
+
/* Controls */
|
|
57
|
+
--control-height: 2.75rem;
|
|
58
|
+
--control-height-sm: 2.25rem;
|
|
59
|
+
|
|
60
|
+
/* Data grid — px, because the grid measures and lays out in px. */
|
|
61
|
+
--grid-toolbar-height: 46px;
|
|
62
|
+
--grid-cell-padding: 9px 10px;
|
|
63
|
+
--grid-checkbox-col-width: 72px;
|
|
64
|
+
|
|
65
|
+
/* Fixed chrome */
|
|
66
|
+
--content-header-height: 60px;
|
|
67
|
+
--nav-logo-height: 56px;
|
|
68
|
+
|
|
69
|
+
/* Field pockets (the square icon/affix tiles beside an input) */
|
|
70
|
+
--field-pocket-size: 44px;
|
|
71
|
+
--field-pocket-size-sm: 34px;
|
|
72
|
+
--field-suggestion-font-size: 16px;
|
|
73
|
+
|
|
74
|
+
/* Detail pages */
|
|
75
|
+
--detail-max-width: 1600px;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* The row-select checkbox column, one step wider again on a tablet view —
|
|
79
|
+
the row is 60px tall there, so the tap zone should be square-ish. The JS
|
|
80
|
+
side of this number lives in utils/useDensity.js (checkboxColWidth); the
|
|
81
|
+
two must agree, since the grid lays the column out from the JS value and
|
|
82
|
+
these custom properties only hold the cell against Inovua's inline width. */
|
|
83
|
+
:root[data-density='large'] body.tablet-mode {
|
|
84
|
+
--grid-checkbox-col-width: 80px;
|
|
85
|
+
}
|
|
@@ -45,10 +45,14 @@ div[role="tooltip"],
|
|
|
45
45
|
border-radius: 0 !important;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
/* Ensure consistent border radius for cells and reduce padding for compact rows
|
|
49
|
-
|
|
48
|
+
/* Ensure consistent border radius for cells and reduce padding for compact rows.
|
|
49
|
+
:not(--no-padding): the grid zeroes padding inline on its spacer/expand
|
|
50
|
+
cells (group nesting columns) and sizes them width:0 when unused — an
|
|
51
|
+
unconditional !important here re-inflates those to pure padding and
|
|
52
|
+
shifts group rows out of line with the headers. */
|
|
53
|
+
.InovuaReactDataGrid__cell:not(.InovuaReactDataGrid__cell--no-padding) {
|
|
50
54
|
border-radius: 0 !important;
|
|
51
|
-
padding: 6px 8px !important; /* Reduced from default padding */
|
|
55
|
+
padding: var(--grid-cell-padding, 6px 8px) !important; /* Reduced from default padding */
|
|
52
56
|
}
|
|
53
57
|
|
|
54
58
|
/* Word wrap enabled cells - specific class for columns with wordWrap: true */
|
|
@@ -84,10 +88,13 @@ body.tablet-mode .InovuaReactDataGrid__cell.cell-word-wrap span {
|
|
|
84
88
|
max-height: 100% !important;
|
|
85
89
|
}
|
|
86
90
|
|
|
87
|
-
body.tablet-mode
|
|
91
|
+
body.tablet-mode
|
|
92
|
+
.InovuaReactDataGrid__cell.cell-word-wrap:not(
|
|
93
|
+
.InovuaReactDataGrid__cell--no-padding
|
|
94
|
+
) {
|
|
88
95
|
height: 100% !important;
|
|
89
96
|
align-items: center !important;
|
|
90
|
-
padding: 6px 8px !important;
|
|
97
|
+
padding: var(--grid-cell-padding, 6px 8px) !important;
|
|
91
98
|
}
|
|
92
99
|
|
|
93
100
|
body.tablet-mode .InovuaReactDataGrid__cell.cell-word-wrap > div {
|
|
@@ -103,10 +110,10 @@ body.tablet-mode .InovuaReactDataGrid__cell.cell-word-wrap > div {
|
|
|
103
110
|
overflow: hidden !important;
|
|
104
111
|
}
|
|
105
112
|
|
|
106
|
-
/*
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
113
|
+
/* NOTE: this fork renders header cells as .InovuaReactDataGrid__column-header
|
|
114
|
+
(there is no __header-cell class in its DOM), so header padding is left to
|
|
115
|
+
the module stylesheet; a __header-cell padding rule that used to sit here
|
|
116
|
+
was dead code and has been removed. */
|
|
110
117
|
|
|
111
118
|
/* Fix for focus outline */
|
|
112
119
|
.InovuaReactDataGrid:focus,
|
|
@@ -115,173 +122,49 @@ body.tablet-mode .InovuaReactDataGrid__cell.cell-word-wrap > div {
|
|
|
115
122
|
box-shadow: 0 0 0 2px rgba(var(--primary-rgb, 59, 130, 246), 0.2) !important;
|
|
116
123
|
}
|
|
117
124
|
|
|
118
|
-
/* Checkbox column
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
.InovuaReactDataGrid__cell[data-column-id='__checkbox-column']
|
|
138
|
-
input[type='checkbox'] {
|
|
139
|
-
width: 20px !important;
|
|
140
|
-
height: 20px !important;
|
|
141
|
-
margin: 0 !important;
|
|
142
|
-
cursor: pointer !important;
|
|
143
|
-
position: relative !important;
|
|
144
|
-
z-index: 2 !important;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/* Create larger touch target area around checkbox */
|
|
148
|
-
.InovuaReactDataGrid__cell[data-column-id='__checkbox-column']
|
|
149
|
-
.InovuaReactDataGrid__checkbox-wrapper,
|
|
150
|
-
.InovuaReactDataGrid__cell[data-column-id='__checkbox-column']
|
|
125
|
+
/* Checkbox column.
|
|
126
|
+
|
|
127
|
+
The rules that used to live here keyed every declaration on
|
|
128
|
+
[data-column-id='__checkbox-column'] — an attribute this datagrid fork has
|
|
129
|
+
never rendered — so none of them ever matched: not the 60px width pins,
|
|
130
|
+
not the 44px touch wrappers. Discovered Aug 2026 when the column collapsed
|
|
131
|
+
to the grid's internal 40px default with no CSS backstop to catch it.
|
|
132
|
+
|
|
133
|
+
The column's width is owned by the JS side (checkboxColumnProps in
|
|
134
|
+
DataGrid.jsx, fed from utils/useDensity.js checkboxColWidth); CSS cannot
|
|
135
|
+
safely fight the grid's layout engine on width. What CSS can usefully add
|
|
136
|
+
is glyph size and cursor, on the classes that actually exist:
|
|
137
|
+
.InovuaReactDataGrid__checkbox is the toolkit checkbox root in body cells
|
|
138
|
+
(it draws a 16px svg with a proper viewBox, so CSS sizing scales it
|
|
139
|
+
cleanly), and the header cell holds a native input rendered by
|
|
140
|
+
DataGrid.jsx. Gated on large density; default-density apps keep the
|
|
141
|
+
rendering they have always had. */
|
|
142
|
+
:root[data-density='large']
|
|
143
|
+
.InovuaReactDataGrid__cell
|
|
151
144
|
.InovuaReactDataGrid__checkbox {
|
|
152
|
-
|
|
153
|
-
align-items: center !important;
|
|
154
|
-
justify-content: center !important;
|
|
155
|
-
min-height: 44px !important;
|
|
156
|
-
min-width: 44px !important;
|
|
157
|
-
padding: 12px !important;
|
|
158
|
-
margin: -12px !important;
|
|
159
|
-
cursor: pointer !important;
|
|
160
|
-
border-radius: 4px !important;
|
|
161
|
-
transition: background-color 0.2s ease !important;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/* Touch-friendly hover effect for the entire cell */
|
|
165
|
-
.InovuaReactDataGrid__cell[data-column-id='__checkbox-column']:hover {
|
|
166
|
-
background-color: rgba(var(--primary-rgb, 59, 130, 246), 0.05) !important;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/* Touch-friendly hover effect for checkbox wrapper */
|
|
170
|
-
.InovuaReactDataGrid__cell[data-column-id='__checkbox-column']
|
|
171
|
-
.InovuaReactDataGrid__checkbox-wrapper:hover,
|
|
172
|
-
.InovuaReactDataGrid__cell[data-column-id='__checkbox-column']
|
|
173
|
-
.InovuaReactDataGrid__checkbox:hover {
|
|
174
|
-
background-color: rgba(var(--primary-rgb, 59, 130, 246), 0.1) !important;
|
|
145
|
+
cursor: pointer;
|
|
175
146
|
}
|
|
176
147
|
|
|
177
|
-
|
|
178
|
-
.
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
max-width: 60px !important;
|
|
148
|
+
:root[data-density='large']
|
|
149
|
+
.InovuaReactDataGrid__cell
|
|
150
|
+
.InovuaReactDataGrid__checkbox svg {
|
|
151
|
+
width: 22px;
|
|
152
|
+
height: 22px;
|
|
183
153
|
}
|
|
184
154
|
|
|
185
|
-
.
|
|
155
|
+
/* !important because global.css draws every non-react-toggle checkbox at a
|
|
156
|
+
fixed 14px !important — an inline style cannot beat that, and neither can
|
|
157
|
+
this rule without its own !important. The header cell in this fork is
|
|
158
|
+
.InovuaReactDataGrid__column-header (never __header-cell). */
|
|
159
|
+
:root[data-density='large']
|
|
160
|
+
.InovuaReactDataGrid__column-header
|
|
186
161
|
input[type='checkbox'] {
|
|
187
|
-
width:
|
|
188
|
-
height:
|
|
189
|
-
|
|
190
|
-
cursor: pointer !important;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
/* Prevent text selection in checkbox column */
|
|
194
|
-
.InovuaReactDataGrid__cell[data-column-id='__checkbox-column'] {
|
|
195
|
-
user-select: none !important;
|
|
196
|
-
-webkit-user-select: none !important;
|
|
197
|
-
-moz-user-select: none !important;
|
|
198
|
-
-ms-user-select: none !important;
|
|
162
|
+
width: 22px !important;
|
|
163
|
+
height: 22px !important;
|
|
164
|
+
cursor: pointer;
|
|
199
165
|
}
|
|
200
166
|
|
|
201
|
-
/* Additional checkbox styling for better UX */
|
|
202
|
-
.InovuaReactDataGrid__cell[data-column-id='__checkbox-column']
|
|
203
|
-
.InovuaReactDataGrid__cell-content {
|
|
204
|
-
display: flex !important;
|
|
205
|
-
align-items: center !important;
|
|
206
|
-
justify-content: center !important;
|
|
207
|
-
width: 100% !important;
|
|
208
|
-
height: 100% !important;
|
|
209
|
-
}
|
|
210
167
|
|
|
211
|
-
/* Focus styles for accessibility */
|
|
212
|
-
.InovuaReactDataGrid__cell[data-column-id='__checkbox-column']
|
|
213
|
-
input[type='checkbox']:focus {
|
|
214
|
-
outline: 2px solid rgba(var(--primary-rgb, 59, 130, 246), 0.5) !important;
|
|
215
|
-
outline-offset: 2px !important;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/* Ensure checkbox column doesn't interfere with row hover */
|
|
219
|
-
.InovuaReactDataGrid__row:hover
|
|
220
|
-
.InovuaReactDataGrid__cell[data-column-id='__checkbox-column'] {
|
|
221
|
-
background-color: inherit !important;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
/* Mobile-specific improvements - Compact version */
|
|
225
|
-
@media (max-width: 768px) {
|
|
226
|
-
.InovuaReactDataGrid__cell[data-column-id='__checkbox-column'] {
|
|
227
|
-
min-width: 70px !important;
|
|
228
|
-
width: 70px !important;
|
|
229
|
-
max-width: 70px !important;
|
|
230
|
-
padding: 8px 12px !important; /* Reduced padding for compact rows */
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
.InovuaReactDataGrid__cell[data-column-id='__checkbox-column']
|
|
234
|
-
input[type='checkbox'] {
|
|
235
|
-
width: 24px !important;
|
|
236
|
-
height: 24px !important;
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
.InovuaReactDataGrid__cell[data-column-id='__checkbox-column']
|
|
240
|
-
.InovuaReactDataGrid__checkbox-wrapper,
|
|
241
|
-
.InovuaReactDataGrid__cell[data-column-id='__checkbox-column']
|
|
242
|
-
.InovuaReactDataGrid__checkbox {
|
|
243
|
-
min-height: 48px !important;
|
|
244
|
-
min-width: 48px !important;
|
|
245
|
-
padding: 16px !important;
|
|
246
|
-
margin: -16px !important;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
.InovuaReactDataGrid__header-cell[data-column-id='__checkbox-column'] {
|
|
250
|
-
min-width: 70px !important;
|
|
251
|
-
width: 70px !important;
|
|
252
|
-
max-width: 70px !important;
|
|
253
|
-
padding: 8px 12px !important; /* Reduced padding for compact rows */
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
.InovuaReactDataGrid__header-cell[data-column-id='__checkbox-column']
|
|
257
|
-
input[type='checkbox'] {
|
|
258
|
-
width: 24px !important;
|
|
259
|
-
height: 24px !important;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
/* Touch device specific improvements - Compact version */
|
|
264
|
-
@media (hover: none) and (pointer: coarse) {
|
|
265
|
-
.InovuaReactDataGrid__cell[data-column-id='__checkbox-column'] {
|
|
266
|
-
padding: 12px !important; /* Reduced padding for compact rows */
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
.InovuaReactDataGrid__cell[data-column-id='__checkbox-column']
|
|
270
|
-
input[type='checkbox'] {
|
|
271
|
-
width: 28px !important;
|
|
272
|
-
height: 28px !important;
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
.InovuaReactDataGrid__cell[data-column-id='__checkbox-column']
|
|
276
|
-
.InovuaReactDataGrid__checkbox-wrapper,
|
|
277
|
-
.InovuaReactDataGrid__cell[data-column-id='__checkbox-column']
|
|
278
|
-
.InovuaReactDataGrid__checkbox {
|
|
279
|
-
min-height: 52px !important;
|
|
280
|
-
min-width: 52px !important;
|
|
281
|
-
padding: 18px !important;
|
|
282
|
-
margin: -18px !important;
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
168
|
|
|
286
169
|
/* Group expand/collapse icon fixes - Enhanced for better visibility */
|
|
287
170
|
.InovuaReactDataGrid__group-expand-icon,
|