chore(lint): manual cleanup batch 3/3 — finish noArrayIndexKey + format pass
- group 6 finished: convert remaining 9 Array.from skeleton patterns (index, demo, search, history) using KEYS_N + dynamicKeys helpers - biome-ignore for legitimate column-index keys in column-stack components - biome --write format pass Lint count: 218 → 155 (614/769 fixed cumulatively, 80%). Remaining (legacy): 121 noExplicitAny + 42 noNonNullAssertion + ~9 small. These need typed refactors and aren't safe to auto-fix (--unsafe drops the ! assertions and breaks strict TS); deferred to a follow-up. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -291,6 +291,7 @@ export function ModelListColumns({
|
||||
>
|
||||
{columns.map((col, colIdx) => (
|
||||
<div
|
||||
// biome-ignore lint/suspicious/noArrayIndexKey: columns are append/pop only — index is the stable identity here
|
||||
key={colIdx}
|
||||
className={cn(
|
||||
"w-[220px] shrink-0 overflow-y-auto",
|
||||
|
||||
@@ -114,6 +114,7 @@ export function CategoryColumns({
|
||||
>
|
||||
{columns.map((col, colIdx) => (
|
||||
<ColumnPanel
|
||||
// biome-ignore lint/suspicious/noArrayIndexKey: columns are append/pop only — index is the stable identity here
|
||||
key={colIdx}
|
||||
categories={col}
|
||||
selectedId={selectedIds[colIdx]}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
import { api } from "@/lib/api-client";
|
||||
import { Card, CardContent, CardHeader, CardTitle } from "@sase/ui";
|
||||
|
||||
const HISTORY_SKEL_KEYS = ["h0", "h1", "h2"];
|
||||
import { Badge } from "@sase/ui";
|
||||
import { Skeleton } from "@sase/ui";
|
||||
import { useQuery } from "@tanstack/react-query";
|
||||
@@ -24,8 +26,8 @@ function HistoryPage() {
|
||||
|
||||
{isLoading ? (
|
||||
<div className="space-y-4">
|
||||
{[...Array(3)].map((_, i) => (
|
||||
<Skeleton key={i} className="h-24 w-full" />
|
||||
{HISTORY_SKEL_KEYS.map((k) => (
|
||||
<Skeleton key={k} className="h-24 w-full" />
|
||||
))}
|
||||
</div>
|
||||
) : !data || data.length === 0 ? (
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { VehicleSelectModal } from "@/components/vehicles/vehicle-select-modal";
|
||||
import { ApiError, api } from "@/lib/api-client";
|
||||
import { startAction } from "@/lib/faro";
|
||||
import { KEYS_17 } from "@/lib/keys";
|
||||
import { capture } from "@/lib/posthog";
|
||||
import { toast } from "@/lib/toast";
|
||||
import { Badge, Button, Input, Separator } from "@sase/ui";
|
||||
@@ -297,9 +298,9 @@ function SearchPage() {
|
||||
|
||||
{/* 17-segment progress bar */}
|
||||
<div className="flex gap-0.5">
|
||||
{Array.from({ length: 17 }).map((_, i) => (
|
||||
{KEYS_17.map((k, i) => (
|
||||
<div
|
||||
key={i}
|
||||
key={k}
|
||||
className={`h-1.5 flex-1 rounded-full transition-colors duration-200 ${
|
||||
i < vin.length ? "bg-brand" : "bg-muted"
|
||||
}`}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { usePageMeta } from "@/hooks/use-page-meta";
|
||||
import { KEYS_16, KEYS_17 } from "@/lib/keys";
|
||||
import { getUserSettings, setUserSetting } from "@/lib/user-settings";
|
||||
import { Button, Input } from "@sase/ui";
|
||||
import { Link, createFileRoute } from "@tanstack/react-router";
|
||||
@@ -200,9 +201,9 @@ function DemoPage() {
|
||||
|
||||
{/* Progress bar */}
|
||||
<div className="flex gap-0.5">
|
||||
{Array.from({ length: 17 }).map((_, i) => (
|
||||
{KEYS_17.map((k, i) => (
|
||||
<div
|
||||
key={i}
|
||||
key={k}
|
||||
className={`h-1 flex-1 rounded-full transition-colors duration-200 ${
|
||||
i < vin.length ? "bg-brand" : "bg-border"
|
||||
}`}
|
||||
@@ -347,9 +348,9 @@ function DemoPage() {
|
||||
<div className="relative aspect-square bg-muted/50 p-6">
|
||||
{/* Simplified schema grid */}
|
||||
<div className="grid h-full grid-cols-4 grid-rows-4 gap-2">
|
||||
{Array.from({ length: 16 }).map((_, i) => (
|
||||
{KEYS_16.map((k, i) => (
|
||||
<div
|
||||
key={i}
|
||||
key={k}
|
||||
className={`flex items-center justify-center rounded-lg border border-border text-xs text-muted-foreground ${
|
||||
[2, 5, 9, 13].includes(i)
|
||||
? "border-brand/50 bg-brand/10 text-brand"
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { KEYS_17, dynamicKeys } from "@/lib/keys";
|
||||
import { Button, Input, Separator } from "@sase/ui";
|
||||
import { Link, createFileRoute, useNavigate } from "@tanstack/react-router";
|
||||
import {
|
||||
@@ -765,9 +766,9 @@ function HomePage() {
|
||||
|
||||
{/* VIN Progress Bar */}
|
||||
<div className="mx-auto mt-3 flex max-w-xl gap-0.5 px-1">
|
||||
{Array.from({ length: 17 }).map((_, i) => (
|
||||
{KEYS_17.map((k, i) => (
|
||||
<div
|
||||
key={i}
|
||||
key={k}
|
||||
className={`h-1 flex-1 rounded-full transition-colors duration-200 ${
|
||||
i < vin.length ? "bg-brand" : "bg-border"
|
||||
}`}
|
||||
@@ -872,12 +873,12 @@ function HomePage() {
|
||||
<div className="pointer-events-none absolute right-0 top-0 z-10 h-full w-24 bg-gradient-to-l from-background to-transparent" />
|
||||
|
||||
<div className="animate-scroll-left flex w-max gap-8 whitespace-nowrap">
|
||||
{[...BRANDS, ...BRANDS].map((brand, i) => (
|
||||
{[...BRANDS.map((b) => `${b}::a`), ...BRANDS.map((b) => `${b}::b`)].map((id) => (
|
||||
<span
|
||||
key={`${brand}-${i}`}
|
||||
key={id}
|
||||
className="inline-block text-sm font-medium text-muted-foreground transition hover:text-foreground"
|
||||
>
|
||||
{brand}
|
||||
{id.split("::")[0]}
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
@@ -1315,11 +1316,11 @@ function HomePage() {
|
||||
className="group rounded-2xl border border-border bg-surface p-6 transition-all duration-300 hover:-translate-y-1 hover:border-foreground/20 hover:shadow-[var(--shadow-md)]"
|
||||
>
|
||||
<div className="flex gap-0.5">
|
||||
{Array.from({ length: t.rating }).map((_, i) => (
|
||||
{dynamicKeys(t.rating).map((k) => (
|
||||
<svg
|
||||
role="img"
|
||||
aria-label="icon"
|
||||
key={i}
|
||||
key={k}
|
||||
viewBox="0 0 20 20"
|
||||
className="size-3.5 fill-foreground/85"
|
||||
aria-hidden="true"
|
||||
|
||||
Reference in New Issue
Block a user