@xcelsior/ui-spreadsheets 1.0.6 → 1.0.8
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/.turbo/turbo-build.log +22 -0
- package/CHANGELOG.md +6 -0
- package/dist/index.d.mts +6 -4
- package/dist/index.d.ts +6 -4
- package/dist/index.js +87 -29
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +87 -29
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/components/CommentModals.tsx +63 -6
- package/src/components/Spreadsheet.stories.tsx +11 -0
- package/src/components/Spreadsheet.tsx +35 -17
- package/src/components/SpreadsheetCell.tsx +200 -197
- package/src/types.ts +5 -3
- package/.turbo/turbo-lint.log +0 -61
|
@@ -28,37 +28,37 @@ const cellPaddingNormal = 'px-2 py-1';
|
|
|
28
28
|
* ```
|
|
29
29
|
*/
|
|
30
30
|
const SpreadsheetCell: React.FC<SpreadsheetCellProps> = ({
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
31
|
+
value,
|
|
32
|
+
column,
|
|
33
|
+
row,
|
|
34
|
+
rowIndex,
|
|
35
|
+
rowId,
|
|
36
|
+
isEditable = false,
|
|
37
|
+
isEditing = false,
|
|
38
|
+
isFocused = false,
|
|
39
|
+
isRowSelected = false,
|
|
40
|
+
isRowHovered = false,
|
|
41
|
+
highlightColor,
|
|
42
|
+
hasComments = false,
|
|
43
|
+
unresolvedCommentCount = 0,
|
|
44
|
+
isCopied = false,
|
|
45
|
+
compactMode = false,
|
|
46
|
+
isPinned = false,
|
|
47
|
+
pinSide,
|
|
48
|
+
leftOffset = 0,
|
|
49
|
+
rightOffset = 0,
|
|
50
|
+
onClick,
|
|
51
|
+
onChange,
|
|
52
|
+
onConfirm,
|
|
53
|
+
onCancel,
|
|
54
|
+
onCopyDown,
|
|
55
|
+
onCopyToSelected,
|
|
56
|
+
onHighlight,
|
|
57
|
+
onAddComment,
|
|
58
|
+
onViewComments,
|
|
59
|
+
hasSelectedRows = false,
|
|
60
|
+
className,
|
|
61
|
+
}) => {
|
|
62
62
|
const [localValue, setLocalValue] = useState(value);
|
|
63
63
|
const inputRef = useRef<HTMLInputElement>(null);
|
|
64
64
|
const selectRef = useRef<HTMLSelectElement>(null);
|
|
@@ -83,12 +83,11 @@ const SpreadsheetCell: React.FC<SpreadsheetCellProps> = ({
|
|
|
83
83
|
const handleKeyDown = (e: React.KeyboardEvent) => {
|
|
84
84
|
if (e.key === 'Enter') {
|
|
85
85
|
e.preventDefault();
|
|
86
|
-
onConfirm?.();
|
|
86
|
+
onConfirm?.(localValue);
|
|
87
87
|
} else if (e.key === 'Escape') {
|
|
88
88
|
e.preventDefault();
|
|
89
89
|
e.stopPropagation(); // Prevent global escape handler from clearing focus
|
|
90
90
|
setLocalValue(value);
|
|
91
|
-
onChange?.(value);
|
|
92
91
|
onCancel?.();
|
|
93
92
|
}
|
|
94
93
|
};
|
|
@@ -126,60 +125,64 @@ const SpreadsheetCell: React.FC<SpreadsheetCellProps> = ({
|
|
|
126
125
|
const renderEditInput = () => {
|
|
127
126
|
if (column.type === 'select' && column.options) {
|
|
128
127
|
return (
|
|
129
|
-
|
|
130
|
-
|
|
128
|
+
<select
|
|
129
|
+
ref={selectRef}
|
|
130
|
+
value={localValue ?? ''}
|
|
131
|
+
onChange={(e) => {
|
|
132
|
+
const newValue = e.target.value;
|
|
133
|
+
setLocalValue(newValue);
|
|
134
|
+
onConfirm?.(newValue);
|
|
135
|
+
}}
|
|
136
|
+
onKeyDown={handleKeyDown}
|
|
137
|
+
onBlur={() => onConfirm?.(localValue)}
|
|
138
|
+
className={cn(
|
|
139
|
+
'w-full border border-gray-300 rounded text-xs focus:outline-none focus:ring-1 focus:ring-blue-500',
|
|
140
|
+
compactMode ? 'px-1 py-0.5' : 'px-2 py-1'
|
|
141
|
+
)}
|
|
142
|
+
>
|
|
143
|
+
{column.options.map((option) => (
|
|
144
|
+
<option key={option} value={option}>
|
|
145
|
+
{option}
|
|
146
|
+
</option>
|
|
147
|
+
))}
|
|
148
|
+
</select>
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return (
|
|
153
|
+
<input
|
|
154
|
+
ref={inputRef}
|
|
155
|
+
type={column.type === 'number' ? 'number' : 'text'}
|
|
156
|
+
step={column.type === 'number' ? '0.01' : undefined}
|
|
131
157
|
value={localValue ?? ''}
|
|
132
158
|
onChange={(e) => {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
159
|
+
const newValue =
|
|
160
|
+
column.type === 'number'
|
|
161
|
+
? e.target.value === ''
|
|
162
|
+
? ''
|
|
163
|
+
: parseFloat(e.target.value)
|
|
164
|
+
: e.target.value;
|
|
165
|
+
setLocalValue(newValue);
|
|
136
166
|
}}
|
|
137
167
|
onKeyDown={handleKeyDown}
|
|
138
|
-
onBlur={() => onConfirm?.()}
|
|
168
|
+
onBlur={() => onConfirm?.(localValue)}
|
|
169
|
+
autoComplete="off"
|
|
170
|
+
autoCorrect="off"
|
|
171
|
+
autoCapitalize="off"
|
|
172
|
+
spellCheck={false}
|
|
139
173
|
className={cn(
|
|
140
|
-
|
|
141
|
-
|
|
174
|
+
'w-full border border-gray-300 rounded text-xs focus:outline-none focus:ring-1 focus:ring-blue-500 bg-yellow-50',
|
|
175
|
+
compactMode ? 'px-1 py-0.5' : 'px-2 py-1'
|
|
142
176
|
)}
|
|
143
|
-
|
|
144
|
-
{column.options.map((option) => (
|
|
145
|
-
<option key={option} value={option}>
|
|
146
|
-
{option}
|
|
147
|
-
</option>
|
|
148
|
-
))}
|
|
149
|
-
</select>
|
|
150
|
-
);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
return (
|
|
154
|
-
<input
|
|
155
|
-
ref={inputRef}
|
|
156
|
-
type={column.type === 'number' ? 'number' : 'text'}
|
|
157
|
-
step={column.type === 'number' ? '0.01' : undefined}
|
|
158
|
-
value={localValue ?? ''}
|
|
159
|
-
onChange={(e) => {
|
|
160
|
-
const newValue =
|
|
161
|
-
column.type === 'number'
|
|
162
|
-
? e.target.value === ''
|
|
163
|
-
? ''
|
|
164
|
-
: parseFloat(e.target.value)
|
|
165
|
-
: e.target.value;
|
|
166
|
-
setLocalValue(newValue);
|
|
167
|
-
onChange?.(newValue);
|
|
168
|
-
}}
|
|
169
|
-
onKeyDown={handleKeyDown}
|
|
170
|
-
onBlur={() => onConfirm?.()}
|
|
171
|
-
className={cn(
|
|
172
|
-
'w-full border border-gray-300 rounded text-xs focus:outline-none focus:ring-1 focus:ring-blue-500 bg-yellow-50',
|
|
173
|
-
compactMode ? 'px-1 py-0.5' : 'px-2 py-1'
|
|
174
|
-
)}
|
|
175
|
-
/>
|
|
177
|
+
/>
|
|
176
178
|
);
|
|
177
179
|
};
|
|
178
180
|
|
|
179
181
|
const cellPadding = compactMode ? cellPaddingCompact : cellPaddingNormal;
|
|
180
182
|
|
|
181
183
|
const handleCellKeyDown = (e: React.KeyboardEvent<HTMLTableCellElement>) => {
|
|
182
|
-
|
|
184
|
+
// Only handle space key when not editing to allow typing spaces in inputs
|
|
185
|
+
if (e.key === ' ' && !isEditing) {
|
|
183
186
|
e.preventDefault();
|
|
184
187
|
onClick?.(e as unknown as React.MouseEvent);
|
|
185
188
|
}
|
|
@@ -198,135 +201,135 @@ const SpreadsheetCell: React.FC<SpreadsheetCellProps> = ({
|
|
|
198
201
|
}
|
|
199
202
|
|
|
200
203
|
return (
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
{/* Action buttons - show on hover, except comment indicator which is always visible */}
|
|
238
|
-
<div className="flex items-center gap-0.5 shrink-0">
|
|
239
|
-
{/* Copy down button - hover only */}
|
|
240
|
-
{value !== null && value !== undefined && value !== '' && onCopyDown && (
|
|
241
|
-
<button
|
|
242
|
-
type="button"
|
|
243
|
-
onClick={(e) => {
|
|
244
|
-
e.stopPropagation();
|
|
245
|
-
onCopyDown();
|
|
246
|
-
}}
|
|
247
|
-
className="opacity-0 group-hover:opacity-100 transition-opacity p-0.5 bg-gray-100 hover:bg-gray-200 rounded"
|
|
248
|
-
title="Copy value down to rows below"
|
|
249
|
-
>
|
|
250
|
-
<HiOutlineClipboardCopy className="h-2.5 w-2.5 text-gray-500" />
|
|
251
|
-
</button>
|
|
252
|
-
)}
|
|
204
|
+
<td
|
|
205
|
+
onClick={onClick}
|
|
206
|
+
onKeyDown={handleCellKeyDown}
|
|
207
|
+
data-cell-id={`${rowId}-${column.id}`}
|
|
208
|
+
className={cn(
|
|
209
|
+
'border border-gray-200 text-xs group cursor-pointer transition-colors',
|
|
210
|
+
cellPadding,
|
|
211
|
+
column.align === 'right' && 'text-right',
|
|
212
|
+
column.align === 'center' && 'text-center',
|
|
213
|
+
isCopied && 'animate-pulse',
|
|
214
|
+
isFocused && 'ring-2 ring-blue-500 ring-inset',
|
|
215
|
+
isPinned ? 'z-20' : 'z-0',
|
|
216
|
+
className
|
|
217
|
+
)}
|
|
218
|
+
style={{
|
|
219
|
+
backgroundColor: getBackgroundColor(),
|
|
220
|
+
minWidth: column.minWidth || column.width,
|
|
221
|
+
...positionStyles,
|
|
222
|
+
}}
|
|
223
|
+
>
|
|
224
|
+
{isEditing ? (
|
|
225
|
+
renderEditInput()
|
|
226
|
+
) : (
|
|
227
|
+
<div className="flex items-center gap-1 relative">
|
|
228
|
+
{/* Main content */}
|
|
229
|
+
<div
|
|
230
|
+
className={cn(
|
|
231
|
+
'flex-1 truncate',
|
|
232
|
+
isEditable &&
|
|
233
|
+
'cursor-text hover:bg-gray-50 px-0.5 rounded min-h-[18px] flex items-center bg-yellow-50/50'
|
|
234
|
+
)}
|
|
235
|
+
title={String(value ?? '')}
|
|
236
|
+
>
|
|
237
|
+
{renderContent()}
|
|
238
|
+
</div>
|
|
253
239
|
|
|
254
|
-
{/*
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
</button>
|
|
271
|
-
)}
|
|
240
|
+
{/* Action buttons - show on hover, except comment indicator which is always visible */}
|
|
241
|
+
<div className="flex items-center gap-0.5 shrink-0">
|
|
242
|
+
{/* Copy down button - hover only */}
|
|
243
|
+
{value !== null && value !== undefined && value !== '' && onCopyDown && (
|
|
244
|
+
<button
|
|
245
|
+
type="button"
|
|
246
|
+
onClick={(e) => {
|
|
247
|
+
e.stopPropagation();
|
|
248
|
+
onCopyDown();
|
|
249
|
+
}}
|
|
250
|
+
className="opacity-0 group-hover:opacity-100 transition-opacity p-0.5 bg-gray-100 hover:bg-gray-200 rounded"
|
|
251
|
+
title="Copy value down to rows below"
|
|
252
|
+
>
|
|
253
|
+
<HiOutlineClipboardCopy className="h-2.5 w-2.5 text-gray-500" />
|
|
254
|
+
</button>
|
|
255
|
+
)}
|
|
272
256
|
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
257
|
+
{/* Copy to selected button - hover only */}
|
|
258
|
+
{hasSelectedRows &&
|
|
259
|
+
value !== null &&
|
|
260
|
+
value !== undefined &&
|
|
261
|
+
value !== '' &&
|
|
262
|
+
onCopyToSelected && (
|
|
263
|
+
<button
|
|
264
|
+
type="button"
|
|
265
|
+
onClick={(e) => {
|
|
266
|
+
e.stopPropagation();
|
|
267
|
+
onCopyToSelected();
|
|
268
|
+
}}
|
|
269
|
+
className="opacity-0 group-hover:opacity-100 transition-opacity p-0.5 bg-green-100 hover:bg-green-200 rounded"
|
|
270
|
+
title="Copy to selected rows"
|
|
271
|
+
>
|
|
272
|
+
<HiOutlineClipboardCheck className="h-2.5 w-2.5 text-green-600" />
|
|
273
|
+
</button>
|
|
288
274
|
)}
|
|
289
|
-
/>
|
|
290
|
-
</button>
|
|
291
|
-
)}
|
|
292
275
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
276
|
+
{/* Highlight button - hover only */}
|
|
277
|
+
{onHighlight && (
|
|
278
|
+
<button
|
|
279
|
+
type="button"
|
|
280
|
+
onClick={(e) => {
|
|
281
|
+
e.stopPropagation();
|
|
282
|
+
onHighlight();
|
|
283
|
+
}}
|
|
284
|
+
className="opacity-0 group-hover:opacity-100 transition-opacity p-0.5 bg-gray-100 hover:bg-gray-200 rounded"
|
|
285
|
+
title="Highlight cell"
|
|
286
|
+
>
|
|
287
|
+
<AiFillHighlight
|
|
288
|
+
className={cn(
|
|
289
|
+
'h-2.5 w-2.5',
|
|
290
|
+
highlightColor ? 'text-amber-500' : 'text-gray-500'
|
|
291
|
+
)}
|
|
292
|
+
/>
|
|
293
|
+
</button>
|
|
294
|
+
)}
|
|
295
|
+
|
|
296
|
+
{/* Comment button - always visible when has comments, hover only when adding */}
|
|
297
|
+
{hasComments && onViewComments ? (
|
|
298
|
+
<button
|
|
299
|
+
type="button"
|
|
300
|
+
onClick={(e) => {
|
|
301
|
+
e.stopPropagation();
|
|
302
|
+
onViewComments();
|
|
303
|
+
}}
|
|
304
|
+
className="p-0.5 bg-amber-100 hover:bg-amber-200 rounded transition-colors flex items-center gap-0.5"
|
|
305
|
+
title={`${unresolvedCommentCount} comment(s) - click to view`}
|
|
306
|
+
>
|
|
307
|
+
<FaComment className="h-2.5 w-2.5 text-amber-500" />
|
|
308
|
+
{unresolvedCommentCount > 0 && (
|
|
309
|
+
<span className="text-[9px] font-medium text-amber-600">
|
|
307
310
|
{unresolvedCommentCount > 99
|
|
308
|
-
|
|
309
|
-
|
|
311
|
+
? '99+'
|
|
312
|
+
: unresolvedCommentCount}
|
|
310
313
|
</span>
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
314
|
+
)}
|
|
315
|
+
</button>
|
|
316
|
+
) : onAddComment ? (
|
|
317
|
+
<button
|
|
318
|
+
type="button"
|
|
319
|
+
onClick={(e) => {
|
|
320
|
+
e.stopPropagation();
|
|
321
|
+
onAddComment();
|
|
322
|
+
}}
|
|
323
|
+
className="opacity-0 group-hover:opacity-100 transition-opacity p-0.5 bg-gray-100 hover:bg-gray-200 rounded"
|
|
324
|
+
title="Add comment"
|
|
325
|
+
>
|
|
326
|
+
<FaRegComment className="h-2.5 w-2.5 text-gray-500" />
|
|
327
|
+
</button>
|
|
328
|
+
) : null}
|
|
329
|
+
</div>
|
|
326
330
|
</div>
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
</td>
|
|
331
|
+
)}
|
|
332
|
+
</td>
|
|
330
333
|
);
|
|
331
334
|
};
|
|
332
335
|
|
package/src/types.ts
CHANGED
|
@@ -312,6 +312,8 @@ export interface SpreadsheetProps<T = any> {
|
|
|
312
312
|
onRowDoubleClick?: (row: T, rowIndex: number) => void;
|
|
313
313
|
/** Callback when a row is cloned/duplicated */
|
|
314
314
|
onRowClone?: (row: T, rowId: string | number) => void;
|
|
315
|
+
/** Callback when a row is deleted */
|
|
316
|
+
onRowDelete?: (row: T, rowId: string | number) => void;
|
|
315
317
|
/** Callback when a cell comment is added */
|
|
316
318
|
onAddCellComment?: (rowId: string | number, columnId: string, comment: string) => void;
|
|
317
319
|
/** Callback when row highlight is toggled */
|
|
@@ -439,10 +441,10 @@ export interface SpreadsheetCellProps {
|
|
|
439
441
|
rightOffset?: number;
|
|
440
442
|
/** Callback when cell is clicked */
|
|
441
443
|
onClick?: (event: React.MouseEvent) => void;
|
|
442
|
-
/** Callback when cell value changes */
|
|
444
|
+
/** Callback when cell value changes (only called on blur/confirm, not during typing) */
|
|
443
445
|
onChange?: (newValue: any) => void;
|
|
444
|
-
/** Callback when editing is confirmed */
|
|
445
|
-
onConfirm?: () => void;
|
|
446
|
+
/** Callback when editing is confirmed, receives the final value */
|
|
447
|
+
onConfirm?: (finalValue?: any) => void;
|
|
446
448
|
/** Callback when editing is cancelled */
|
|
447
449
|
onCancel?: () => void;
|
|
448
450
|
/** Callback to copy value down */
|
package/.turbo/turbo-lint.log
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
> @xcelsior/ui-spreadsheets@1.0.3 lint /Users/tuannguyen/Work/xcelsior-packages/packages/ui/ui-spreadsheets
|
|
3
|
-
> biome check . && tsc
|
|
4
|
-
|
|
5
|
-
[0m at src/components/Spreadsheet.tsx[0m[0m:[0m[0m779[0m[0m:[0m[0m49[0m[0m [0m[0m]8;;https://biomejs.dev/linter/rules/use-key-with-click-events\lint/a11y/useKeyWithClickEvents]8;;\[0m[0m [0m[0m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m[0m
|
|
6
|
-
|
|
7
|
-
[0m[0m [0m[0m[1m[33m⚠[0m[0m [0m[0m[33mEnforce to have the [0m[0m[1m[33monClick[0m[0m[33m mouse event with the [0m[0m[1m[33monKeyUp[0m[0m[33m, the [0m[0m[1m[33monKeyDown[0m[0m[33m, or the [0m[0m[1m[33monKeyPress[0m[0m[33m keyboard event.[0m[0m
|
|
8
|
-
[0m[0m [0m[0m
|
|
9
|
-
[0m[0m [0m[0m [0m[0m[1m777 │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m{[0m[0m/[0m[0m*[0m[0m [0m[0mR[0m[0mo[0m[0mw[0m[0m [0m[0mI[0m[0mn[0m[0md[0m[0me[0m[0mx[0m[0m [0m[0mC[0m[0mo[0m[0ml[0m[0mu[0m[0mm[0m[0mn[0m[0m [0m[0m*[0m[0m/[0m[0m}[0m[0m
|
|
10
|
-
[0m[0m [0m[0m [0m[0m[1m778 │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m{[0m[0me[0m[0mf[0m[0mf[0m[0me[0m[0mc[0m[0mt[0m[0mi[0m[0mv[0m[0me[0m[0mS[0m[0mh[0m[0mo[0m[0mw[0m[0mR[0m[0mo[0m[0mw[0m[0mI[0m[0mn[0m[0md[0m[0me[0m[0mx[0m[0m [0m[0m&[0m[0m&[0m[0m [0m[0m([0m[0m
|
|
11
|
-
[0m[0m [0m[0m[1m[31m>[0m[0m [0m[0m[1m779 │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m<[0m[0mt[0m[0md[0m[0m
|
|
12
|
-
[0m[0m [0m[0m [0m[0m [0m[0m [0m[0m[1m │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m[1m[31m^[0m[0m[1m[31m^[0m[0m[1m[31m^[0m[0m
|
|
13
|
-
[0m[0m [0m[0m[1m[31m>[0m[0m [0m[0m[1m780 │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0mo[0m[0mn[0m[0mC[0m[0ml[0m[0mi[0m[0mc[0m[0mk[0m[0m=[0m[0m{[0m[0m([0m[0me[0m[0m)[0m[0m [0m[0m=[0m[0m>[0m[0m [0m[0mh[0m[0ma[0m[0mn[0m[0md[0m[0ml[0m[0me[0m[0mR[0m[0mo[0m[0mw[0m[0mS[0m[0me[0m[0ml[0m[0me[0m[0mc[0m[0mt[0m[0m([0m[0mr[0m[0mo[0m[0mw[0m[0mI[0m[0md[0m[0m,[0m[0m [0m[0me[0m[0m)[0m[0m}[0m[0m
|
|
14
|
-
[0m[0m [0m[0m [0m[0m [0m[0m [0m[0m[1m ...
|
|
15
|
-
[0m[0m [0m[0m[1m[31m>[0m[0m [0m[0m[1m806 │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m}[0m[0m}[0m[0m
|
|
16
|
-
[0m[0m [0m[0m[1m[31m>[0m[0m [0m[0m[1m807 │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m>[0m[0m
|
|
17
|
-
[0m[0m [0m[0m [0m[0m [0m[0m [0m[0m[1m │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m[1m[31m^[0m[0m
|
|
18
|
-
[0m[0m [0m[0m [0m[0m[1m808 │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m<[0m[0md[0m[0mi[0m[0mv[0m[0m [0m[0mc[0m[0ml[0m[0ma[0m[0ms[0m[0ms[0m[0mN[0m[0ma[0m[0mm[0m[0me[0m[0m=[0m[0m{[0m[0m'[0m[0mr[0m[0me[0m[0ml[0m[0ma[0m[0mt[0m[0mi[0m[0mv[0m[0me[0m[0m'[0m[0m}[0m[0m>[0m[0m
|
|
19
|
-
[0m[0m [0m[0m [0m[0m[1m809 │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m{[0m[0m/[0m[0m*[0m[0m [0m[0mR[0m[0mo[0m[0mw[0m[0m [0m[0mn[0m[0mu[0m[0mm[0m[0mb[0m[0me[0m[0mr[0m[0m [0m[0m*[0m[0m/[0m[0m}[0m[0m
|
|
20
|
-
[0m[0m [0m[0m
|
|
21
|
-
[0m[0m [0m[0m[1m[34mℹ[0m[0m [0m[0m[34mActions triggered using mouse events should have corresponding keyboard events to account for keyboard-only navigation.[0m[0m
|
|
22
|
-
[0m[0m [0m[0m
|
|
23
|
-
[0m
|
|
24
|
-
[0m at src/components/SpreadsheetFilterDropdown.tsx[0m[0m:[0m[0m188[0m[0m:[0m[0m9[0m[0m [0m[0m]8;;https://biomejs.dev/linter/rules/no-static-element-interactions\lint/a11y/noStaticElementInteractions]8;;\[0m[0m [0m[0m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m[0m
|
|
25
|
-
|
|
26
|
-
[0m[0m [0m[0m[1m[33m⚠[0m[0m [0m[0m[33mStatic Elements should not be interactive.[0m[0m
|
|
27
|
-
[0m[0m [0m[0m
|
|
28
|
-
[0m[0m [0m[0m [0m[0m[1m187 │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0mr[0m[0me[0m[0mt[0m[0mu[0m[0mr[0m[0mn[0m[0m [0m[0m([0m[0m
|
|
29
|
-
[0m[0m [0m[0m[1m[31m>[0m[0m [0m[0m[1m188 │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m<[0m[0md[0m[0mi[0m[0mv[0m[0m
|
|
30
|
-
[0m[0m [0m[0m [0m[0m [0m[0m [0m[0m[1m │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m[1m[31m^[0m[0m[1m[31m^[0m[0m[1m[31m^[0m[0m[1m[31m^[0m[0m
|
|
31
|
-
[0m[0m [0m[0m[1m[31m>[0m[0m [0m[0m[1m189 │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0mr[0m[0me[0m[0mf[0m[0m=[0m[0m{[0m[0md[0m[0mr[0m[0mo[0m[0mp[0m[0md[0m[0mo[0m[0mw[0m[0mn[0m[0mR[0m[0me[0m[0mf[0m[0m}[0m[0m
|
|
32
|
-
[0m[0m [0m[0m [0m[0m [0m[0m [0m[0m[1m ...
|
|
33
|
-
[0m[0m [0m[0m[1m[31m>[0m[0m [0m[0m[1m194 │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0mo[0m[0mn[0m[0mC[0m[0ml[0m[0mi[0m[0mc[0m[0mk[0m[0m=[0m[0m{[0m[0m([0m[0me[0m[0m)[0m[0m [0m[0m=[0m[0m>[0m[0m [0m[0me[0m[0m.[0m[0ms[0m[0mt[0m[0mo[0m[0mp[0m[0mP[0m[0mr[0m[0mo[0m[0mp[0m[0ma[0m[0mg[0m[0ma[0m[0mt[0m[0mi[0m[0mo[0m[0mn[0m[0m([0m[0m)[0m[0m}[0m[0m
|
|
34
|
-
[0m[0m [0m[0m[1m[31m>[0m[0m [0m[0m[1m195 │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m>[0m[0m
|
|
35
|
-
[0m[0m [0m[0m [0m[0m [0m[0m [0m[0m[1m │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m[1m[31m^[0m[0m
|
|
36
|
-
[0m[0m [0m[0m [0m[0m[1m196 │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m<[0m[0md[0m[0mi[0m[0mv[0m[0m [0m[0mc[0m[0ml[0m[0ma[0m[0ms[0m[0ms[0m[0mN[0m[0ma[0m[0mm[0m[0me[0m[0m=[0m[0m"[0m[0mp[0m[0mx[0m[0m-[0m[0m3[0m[0m [0m[0mp[0m[0my[0m[0m-[0m[0m2[0m[0m [0m[0mb[0m[0mo[0m[0mr[0m[0md[0m[0me[0m[0mr[0m[0m-[0m[0mb[0m[0m [0m[0mb[0m[0mo[0m[0mr[0m[0md[0m[0me[0m[0mr[0m[0m-[0m[0mg[0m[0mr[0m[0ma[0m[0my[0m[0m-[0m[0m2[0m[0m0[0m[0m0[0m[0m [0m[0mb[0m[0mg[0m[0m-[0m[0mg[0m[0mr[0m[0ma[0m[0my[0m[0m-[0m[0m5[0m[0m0[0m[0m"[0m[0m>[0m[0m
|
|
37
|
-
[0m[0m [0m[0m [0m[0m[1m197 │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m<[0m[0ms[0m[0mp[0m[0ma[0m[0mn[0m[0m [0m[0mc[0m[0ml[0m[0ma[0m[0ms[0m[0ms[0m[0mN[0m[0ma[0m[0mm[0m[0me[0m[0m=[0m[0m"[0m[0mt[0m[0me[0m[0mx[0m[0mt[0m[0m-[0m[0mx[0m[0ms[0m[0m [0m[0mf[0m[0mo[0m[0mn[0m[0mt[0m[0m-[0m[0mm[0m[0me[0m[0md[0m[0mi[0m[0mu[0m[0mm[0m[0m [0m[0mt[0m[0me[0m[0mx[0m[0mt[0m[0m-[0m[0mg[0m[0mr[0m[0ma[0m[0my[0m[0m-[0m[0m7[0m[0m0[0m[0m0[0m[0m"[0m[0m>[0m[0mF[0m[0mi[0m[0ml[0m[0mt[0m[0me[0m[0mr[0m[0m:[0m[0m [0m[0m{[0m[0mc[0m[0mo[0m[0ml[0m[0mu[0m[0mm[0m[0mn[0m[0m.[0m[0ml[0m[0ma[0m[0mb[0m[0me[0m[0ml[0m[0m}[0m[0m<[0m[0m/[0m[0ms[0m[0mp[0m[0ma[0m[0mn[0m[0m>[0m[0m
|
|
38
|
-
[0m[0m [0m[0m
|
|
39
|
-
[0m[0m [0m[0m[1m[34mℹ[0m[0m [0m[0m[34mTo add interactivity such as a mouse or key event listener to a static element, give the element an appropriate role value.[0m[0m
|
|
40
|
-
[0m[0m [0m[0m
|
|
41
|
-
[0m
|
|
42
|
-
[0m at src/components/SpreadsheetFilterDropdown.tsx[0m[0m:[0m[0m188[0m[0m:[0m[0m9[0m[0m [0m[0m]8;;https://biomejs.dev/linter/rules/use-key-with-click-events\lint/a11y/useKeyWithClickEvents]8;;\[0m[0m [0m[0m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m[0m
|
|
43
|
-
|
|
44
|
-
[0m[0m [0m[0m[1m[33m⚠[0m[0m [0m[0m[33mEnforce to have the [0m[0m[1m[33monClick[0m[0m[33m mouse event with the [0m[0m[1m[33monKeyUp[0m[0m[33m, the [0m[0m[1m[33monKeyDown[0m[0m[33m, or the [0m[0m[1m[33monKeyPress[0m[0m[33m keyboard event.[0m[0m
|
|
45
|
-
[0m[0m [0m[0m
|
|
46
|
-
[0m[0m [0m[0m [0m[0m[1m187 │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0mr[0m[0me[0m[0mt[0m[0mu[0m[0mr[0m[0mn[0m[0m [0m[0m([0m[0m
|
|
47
|
-
[0m[0m [0m[0m[1m[31m>[0m[0m [0m[0m[1m188 │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m<[0m[0md[0m[0mi[0m[0mv[0m[0m
|
|
48
|
-
[0m[0m [0m[0m [0m[0m [0m[0m [0m[0m[1m │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m[1m[31m^[0m[0m[1m[31m^[0m[0m[1m[31m^[0m[0m[1m[31m^[0m[0m
|
|
49
|
-
[0m[0m [0m[0m[1m[31m>[0m[0m [0m[0m[1m189 │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0mr[0m[0me[0m[0mf[0m[0m=[0m[0m{[0m[0md[0m[0mr[0m[0mo[0m[0mp[0m[0md[0m[0mo[0m[0mw[0m[0mn[0m[0mR[0m[0me[0m[0mf[0m[0m}[0m[0m
|
|
50
|
-
[0m[0m [0m[0m [0m[0m [0m[0m [0m[0m[1m ...
|
|
51
|
-
[0m[0m [0m[0m[1m[31m>[0m[0m [0m[0m[1m194 │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0mo[0m[0mn[0m[0mC[0m[0ml[0m[0mi[0m[0mc[0m[0mk[0m[0m=[0m[0m{[0m[0m([0m[0me[0m[0m)[0m[0m [0m[0m=[0m[0m>[0m[0m [0m[0me[0m[0m.[0m[0ms[0m[0mt[0m[0mo[0m[0mp[0m[0mP[0m[0mr[0m[0mo[0m[0mp[0m[0ma[0m[0mg[0m[0ma[0m[0mt[0m[0mi[0m[0mo[0m[0mn[0m[0m([0m[0m)[0m[0m}[0m[0m
|
|
52
|
-
[0m[0m [0m[0m[1m[31m>[0m[0m [0m[0m[1m195 │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m>[0m[0m
|
|
53
|
-
[0m[0m [0m[0m [0m[0m [0m[0m [0m[0m[1m │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m[1m[31m^[0m[0m
|
|
54
|
-
[0m[0m [0m[0m [0m[0m[1m196 │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m<[0m[0md[0m[0mi[0m[0mv[0m[0m [0m[0mc[0m[0ml[0m[0ma[0m[0ms[0m[0ms[0m[0mN[0m[0ma[0m[0mm[0m[0me[0m[0m=[0m[0m"[0m[0mp[0m[0mx[0m[0m-[0m[0m3[0m[0m [0m[0mp[0m[0my[0m[0m-[0m[0m2[0m[0m [0m[0mb[0m[0mo[0m[0mr[0m[0md[0m[0me[0m[0mr[0m[0m-[0m[0mb[0m[0m [0m[0mb[0m[0mo[0m[0mr[0m[0md[0m[0me[0m[0mr[0m[0m-[0m[0mg[0m[0mr[0m[0ma[0m[0my[0m[0m-[0m[0m2[0m[0m0[0m[0m0[0m[0m [0m[0mb[0m[0mg[0m[0m-[0m[0mg[0m[0mr[0m[0ma[0m[0my[0m[0m-[0m[0m5[0m[0m0[0m[0m"[0m[0m>[0m[0m
|
|
55
|
-
[0m[0m [0m[0m [0m[0m[1m197 │ [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m [0m[0m<[0m[0ms[0m[0mp[0m[0ma[0m[0mn[0m[0m [0m[0mc[0m[0ml[0m[0ma[0m[0ms[0m[0ms[0m[0mN[0m[0ma[0m[0mm[0m[0me[0m[0m=[0m[0m"[0m[0mt[0m[0me[0m[0mx[0m[0mt[0m[0m-[0m[0mx[0m[0ms[0m[0m [0m[0mf[0m[0mo[0m[0mn[0m[0mt[0m[0m-[0m[0mm[0m[0me[0m[0md[0m[0mi[0m[0mu[0m[0mm[0m[0m [0m[0mt[0m[0me[0m[0mx[0m[0mt[0m[0m-[0m[0mg[0m[0mr[0m[0ma[0m[0my[0m[0m-[0m[0m7[0m[0m0[0m[0m0[0m[0m"[0m[0m>[0m[0mF[0m[0mi[0m[0ml[0m[0mt[0m[0me[0m[0mr[0m[0m:[0m[0m [0m[0m{[0m[0mc[0m[0mo[0m[0ml[0m[0mu[0m[0mm[0m[0mn[0m[0m.[0m[0ml[0m[0ma[0m[0mb[0m[0me[0m[0ml[0m[0m}[0m[0m<[0m[0m/[0m[0ms[0m[0mp[0m[0ma[0m[0mn[0m[0m>[0m[0m
|
|
56
|
-
[0m[0m [0m[0m
|
|
57
|
-
[0m[0m [0m[0m[1m[34mℹ[0m[0m [0m[0m[34mActions triggered using mouse events should have corresponding keyboard events to account for keyboard-only navigation.[0m[0m
|
|
58
|
-
[0m[0m [0m[0m
|
|
59
|
-
[0m
|
|
60
|
-
[0m[34mChecked [0m[0m[34m29[0m[0m[34m [0m[0m[34mfiles[0m[0m[34m in [0m[0m[34m11[0m[0m[2m[34mms[0m[0m[34m.[0m[0m[34m No fixes applied.[0m[0m
|
|
61
|
-
[0m[0m[33mFound [0m[0m[33m3[0m[0m[33m warnings.[0m
|