authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-09-05 22:07:28-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-09-05 22:07:28-07:00
log226abe5f916ff828d8be2c19f1148b10feebfe43
tree1e412cb274a63e61e63645014828077313bd284e
parentfdcc491e0b36245d4b4c74d1fd338d874f4ec84f
signature Signed by PGP key B5690EEEBB952194

refactor(web): keep feature component helpers private (#10226)


31 files changed, 46 insertions(+), 79 deletions(-)

apps/web/src/components/BranchToolbarEnvModeSelector.tsx+1-1
......@@ -18,7 +18,7 @@ import {
1818 SelectValue,
1919} from "./ui/select";
2020
21export const PREVIOUS_WORKTREE_SELECT_VALUE = "previous-worktree";
21const PREVIOUS_WORKTREE_SELECT_VALUE = "previous-worktree";
2222
2323interface BranchToolbarEnvModeSelectorProps {
2424 envLocked: boolean;
apps/web/src/components/ConfirmDialogHost.tsx+1-1
......@@ -23,7 +23,7 @@ type ConfirmationCopy = {
2323 readonly description: string | null;
2424};
2525
26export function resolveConfirmDialogCopy(message: string): ConfirmationCopy {
26function resolveConfirmDialogCopy(message: string): ConfirmationCopy {
2727 const normalizedMessage = message.trim();
2828 const lines = normalizedMessage.split("\n");
2929 const questionLineIndex = lines.findIndex((line) => line.trim().endsWith("?"));
apps/web/src/components/DiffPanel.tsx-2
......@@ -104,8 +104,6 @@ interface DiffPanelProps {
104104 workspaceMutationId: string | null;
105105}
106106
107export { DiffWorkerPoolProvider } from "./DiffWorkerPoolProvider";
108
109107export default function DiffPanel({
110108 mode = "inline",
111109 composerDraftTarget,
apps/web/src/components/EnvironmentMachineIcon.tsx+2-2
......@@ -23,7 +23,7 @@ function LucideLike(props: SVGProps<SVGSVGElement>) {
2323}
2424
2525/** A Mac mini: squat rounded slab with a front-edge LED. */
26export function MacMiniIcon(props: SVGProps<SVGSVGElement>) {
26function MacMiniIcon(props: SVGProps<SVGSVGElement>) {
2727 return (
2828 <LucideLike {...props}>
2929 <rect width="20" height="8" x="2" y="8" rx="2" />
......@@ -33,7 +33,7 @@ export function MacMiniIcon(props: SVGProps<SVGSVGElement>) {
3333}
3434
3535/** A Mac Studio: the same slab twice as tall, ports along the front foot. */
36export function MacStudioIcon(props: SVGProps<SVGSVGElement>) {
36function MacStudioIcon(props: SVGProps<SVGSVGElement>) {
3737 return (
3838 <LucideLike {...props}>
3939 <rect width="18" height="14" x="3" y="5" rx="2" />
apps/web/src/components/LegacySidebar.tsx+1-1
......@@ -354,7 +354,7 @@ interface SidebarThreadRowProps {
354354 ) => boolean;
355355}
356356
357export const SidebarThreadRow = memo(function SidebarThreadRow(props: SidebarThreadRowProps) {
357const SidebarThreadRow = memo(function SidebarThreadRow(props: SidebarThreadRowProps) {
358358 const {
359359 orderedProjectThreadKeys,
360360 isActive,
apps/web/src/components/ProviderUpdateLaunchNotification.logic.ts+2-2
......@@ -220,7 +220,7 @@ export function providerUpdateNotificationKey(
220220 return parts.length > 0 ? parts.join("|") : null;
221221}
222222
223export function formatProviderList(providers: ReadonlyArray<Pick<ServerProvider, "driver">>) {
223function formatProviderList(providers: ReadonlyArray<Pick<ServerProvider, "driver">>) {
224224 const names = providers.map(
225225 (provider) => PROVIDER_DISPLAY_NAMES[provider.driver] ?? provider.driver,
226226 );
......@@ -249,7 +249,7 @@ export function shouldShowPrimaryProviderUpdateToast(view: ProviderUpdateToastVi
249249 return view.phase !== "running";
250250}
251251
252export function getProviderUpdateRunningToastView(providerCount: number): ProviderUpdateToastView {
252function getProviderUpdateRunningToastView(providerCount: number): ProviderUpdateToastView {
253253 return {
254254 phase: "running",
255255 type: "loading",
apps/web/src/components/Sidebar.logic.ts+4-11
......@@ -15,7 +15,7 @@ import type { SidebarThreadSummary, Thread } from "../types";
1515import { cn } from "../lib/utils";
1616import { isLatestTurnSettled } from "../session-logic";
1717
18export const THREAD_SELECTION_SAFE_SELECTOR = "[data-thread-item], [data-thread-selection-safe]";
18const THREAD_SELECTION_SAFE_SELECTOR = "[data-thread-item], [data-thread-selection-safe]";
1919export const THREAD_JUMP_HINT_SHOW_DELAY_MS = 200;
2020// Visible sidebar rows are prewarmed into the thread-detail cache so opening a
2121// nearby thread usually reuses an already-hot subscription. Each prewarmed
......@@ -23,10 +23,10 @@ export const THREAD_JUMP_HINT_SHOW_DELAY_MS = 200;
2323// activities, growing as agents work) for as long as the row stays visible,
2424// so this limit is a direct renderer-heap and server-load multiplier — keep
2525// it small; cold opens still render instantly from the cached snapshot.
26export const SIDEBAR_THREAD_PREWARM_LIMIT = 3;
26const SIDEBAR_THREAD_PREWARM_LIMIT = 3;
2727// A small buffer keeps the next few rows warm without leasing every row that
2828// content-visibility leaves mounted below the scroll viewport.
29export const SIDEBAR_ROW_SUBSCRIPTION_OVERSCAN_PX = 160;
29const SIDEBAR_ROW_SUBSCRIPTION_OVERSCAN_PX = 160;
3030
3131export function useSidebarRowSubscriptionLease(isActive: boolean): {
3232 readonly leaseLiveStatus: boolean;
......@@ -544,13 +544,6 @@ export function resolveSidebarThreadStatus(thread: SidebarThreadStatusInput): Si
544544 return "ready";
545545}
546546
547/** NaN-safe Date.parse for sort comparators: a malformed timestamp must not
548 poison the whole ordering, so it sinks to the epoch instead. */
549export function parseTimestampMs(isoDate: string): number {
550 const parsed = Date.parse(isoDate);
551 return Number.isNaN(parsed) ? 0 : parsed;
552}
553
554547/** First VALID timestamp wins: `a ?? b` falls through on null, but a present-
555548 yet-malformed string must also fall through to the next candidate rather
556549 than sink the row to the epoch. */
......@@ -567,7 +560,7 @@ export function firstValidTimestampMs(
567560
568561/** String twin of firstValidTimestampMs for callers that need the ISO string
569562 (display labels, tick anchors) rather than epoch ms. */
570export function firstValidTimestamp(
563function firstValidTimestamp(
571564 ...candidates: ReadonlyArray<string | null | undefined>
572565): string | null {
573566 for (const candidate of candidates) {
apps/web/src/components/ThreadCommandSubtitle.tsx+1-2
......@@ -15,8 +15,7 @@ export type ThreadCommandSubtitleVariant =
1515 | "favicon-workspace"
1616 | "favicon-branch-harness";
1717
18export const THREAD_COMMAND_SUBTITLE_VARIANT: ThreadCommandSubtitleVariant =
19 "favicon-workspace-harness";
18const THREAD_COMMAND_SUBTITLE_VARIANT: ThreadCommandSubtitleVariant = "favicon-workspace-harness";
2019
2120export const COMMAND_PALETTE_META_ICON_CLASS = "size-3 shrink-0 text-muted-foreground/70";
2221
apps/web/src/components/chat/ComposerPendingElementContexts.tsx+1-1
......@@ -39,7 +39,7 @@ function buildTooltipContent(context: ElementContextDraft): string {
3939 return lines.join("\n");
4040}
4141
42export function ComposerPendingElementContextChip({
42function ComposerPendingElementContextChip({
4343 context,
4444 onRemove,
4545}: ComposerPendingElementContextChipProps) {
apps/web/src/components/chat/ComposerPendingTerminalContexts.tsx-22
......@@ -1,4 +1,3 @@
1import { cn } from "~/lib/utils";
21import {
32 type TerminalContextDraft,
43 formatTerminalContextLabel,
......@@ -6,11 +5,6 @@ import {
65} from "~/lib/terminalContext";
76import { TerminalContextInlineChip } from "./TerminalContextInlineChip";
87
9interface ComposerPendingTerminalContextsProps {
10 contexts: ReadonlyArray<TerminalContextDraft>;
11 className?: string;
12}
13
148interface ComposerPendingTerminalContextChipProps {
159 context: TerminalContextDraft;
1610}
......@@ -26,19 +20,3 @@ export function ComposerPendingTerminalContextChip({
2620
2721 return <TerminalContextInlineChip label={label} tooltipText={tooltipText} expired={expired} />;
2822}
29
30export function ComposerPendingTerminalContexts(props: ComposerPendingTerminalContextsProps) {
31 const { contexts, className } = props;
32
33 if (contexts.length === 0) {
34 return null;
35 }
36
37 return (
38 <div className={cn("flex flex-wrap gap-1.5", className)}>
39 {contexts.map((context) => (
40 <ComposerPendingTerminalContextChip key={context.id} context={context} />
41 ))}
42 </div>
43 );
44}
apps/web/src/components/chat/ContextWindowMeter.logic.ts+2-2
......@@ -9,8 +9,8 @@ import {
99} from "../../providerInstances";
1010import { getTriggerDisplayModelName, type ModelEsque } from "./providerIconUtils";
1111
12export const CLAUDE_RESUME_COMPACTION_MINUTES = 70;
13export const CLAUDE_RESUME_COMPACTION_TOKENS = 100_000;
12const CLAUDE_RESUME_COMPACTION_MINUTES = 70;
13const CLAUDE_RESUME_COMPACTION_TOKENS = 100_000;
1414
1515export function providerSupportsManualCompaction(
1616 provider: ProviderInstanceEntry | null | undefined,
apps/web/src/components/chat/MessagesTimeline.logic.ts+8-9
......@@ -14,7 +14,6 @@ import {
1414} from "@t3tools/client-runtime/work-log/presentation";
1515export {
1616 normalizeCompactToolLabel,
17 summarizeToolGroup,
1817 toolGroupAction,
1918} from "@t3tools/client-runtime/work-log/presentation";
2019import {
......@@ -31,11 +30,11 @@ import { type ChatMessage, type ProposedPlan, type TurnDiffSummary } from "../..
3130import { type MessageId, type OrchestrationLatestTurn, type TurnId } from "@t3tools/contracts";
3231import { formatWorkspaceRelativePath } from "../../filePathDisplay";
3332
34export const TIMELINE_MINIMAP_ITEM_SPACING = 8;
33const TIMELINE_MINIMAP_ITEM_SPACING = 8;
3534export const TIMELINE_MINIMAP_MIN_ITEMS = 2;
36export const TIMELINE_MINIMAP_MAX_HEIGHT_CSS = "calc(100vh - 18rem)";
37export const TIMELINE_CONTENT_MAX_WIDTH = 768;
38export const TIMELINE_MINIMAP_PERSISTENT_GUTTER = 48;
35const TIMELINE_MINIMAP_MAX_HEIGHT_CSS = "calc(100vh - 18rem)";
36const TIMELINE_CONTENT_MAX_WIDTH = 768;
37const TIMELINE_MINIMAP_PERSISTENT_GUTTER = 48;
3938
4039function singleToolCallLabel(entry: WorkLogEntry): string {
4140 const toolPresentation = resolveWorkEntryToolPresentation(entry, "completed");
......@@ -145,7 +144,7 @@ export interface TimelineEndState {
145144 * A small pixel band (instead of the 1px isAtEnd epsilon alone) keeps re-arming
146145 * reliable while streaming content is still growing under the viewport.
147146 */
148export const TIMELINE_FOLLOW_REARM_THRESHOLD_PX = 40;
147const TIMELINE_FOLLOW_REARM_THRESHOLD_PX = 40;
149148
150149export function resolveTimelineIsAtEnd(state: TimelineEndState | undefined): boolean | undefined {
151150 if (!state) {
......@@ -207,9 +206,9 @@ export function resolveTimelineMinimapHasPersistentGutter(viewportWidth: number)
207206 return sideGutter >= TIMELINE_MINIMAP_PERSISTENT_GUTTER;
208207}
209208
210export const TIMELINE_MINIMAP_HIT_STRIP_LEFT = 12;
211export const TIMELINE_MINIMAP_HIT_STRIP_MAX_WIDTH = 40;
212export const TIMELINE_MINIMAP_EXPANDED_HIT_STRIP_WIDTH = "22rem";
209const TIMELINE_MINIMAP_HIT_STRIP_LEFT = 12;
210const TIMELINE_MINIMAP_HIT_STRIP_MAX_WIDTH = 40;
211const TIMELINE_MINIMAP_EXPANDED_HIT_STRIP_WIDTH = "22rem";
213212
214213/**
215214 * The minimap overlays the viewport's left edge while the content column is
apps/web/src/components/chat/externalLinkContextMenu.ts+1-1
......@@ -35,7 +35,7 @@ const EXTERNAL_LINK_CONTEXT_MENU_ITEMS = [
3535 * whole menu with the one item that cannot be honoured is what left a right-click on a link
3636 * showing the platform's cut-and-paste menu instead of a way to copy the link.
3737 */
38export function externalLinkContextMenuItems(options: {
38function externalLinkContextMenuItems(options: {
3939 readonly canOpenInPreview: boolean;
4040 readonly threadLinkAction?: "link-to-thread" | "unlink-from-thread" | undefined;
4141}): readonly ContextMenuItem<ExternalLinkContextMenuAction>[] {
apps/web/src/components/cloud/CloudEnvironmentConnectList.tsx+1-1
......@@ -32,7 +32,7 @@ export interface SavedCloudEnvironmentConnection {
3232 readonly connection: EnvironmentConnectionPresentation;
3333}
3434
35export function RemoteEnvironmentRowsSkeleton() {
35function RemoteEnvironmentRowsSkeleton() {
3636 return (
3737 <div className={ITEM_ROW_CLASSNAME}>
3838 <div className={ITEM_ROW_INNER_CLASSNAME}>
apps/web/src/components/composerFooterLayout.ts+1-1
......@@ -1,6 +1,6 @@
11export const COMPOSER_FOOTER_COMPACT_BREAKPOINT_PX = 620;
22export const COMPOSER_FOOTER_WIDE_ACTIONS_COMPACT_BREAKPOINT_PX = 780;
3export const RESTING_COMPOSER_IMAGE_THUMBNAIL_LIMIT = 3;
3const RESTING_COMPOSER_IMAGE_THUMBNAIL_LIMIT = 3;
44
55export function getRestingComposerImagePreviewCounts(imageCount: number): {
66 visibleCount: number;
apps/web/src/components/files/projectFilesQueryState.ts+1-1
......@@ -33,7 +33,7 @@ interface ProjectQueryState<A> {
3333 readonly refresh: () => void;
3434}
3535
36export function getProjectEntriesQueryAtom(environmentId: EnvironmentId, cwd: string) {
36function getProjectEntriesQueryAtom(environmentId: EnvironmentId, cwd: string) {
3737 return projectEnvironment.listEntries({ environmentId, input: { cwd } });
3838}
3939
apps/web/src/components/media/MediaActions.tsx+1-1
......@@ -33,7 +33,7 @@ function mediaFileName(source: MediaActionSource): string {
3333}
3434
3535/** Explicit byte operations get fresh capabilities without replacing a player's active source. */
36export function useMediaActions(source: MediaActionSource) {
36function useMediaActions(source: MediaActionSource) {
3737 const createAssetUrl = useAtomQueryRunner(assetEnvironment.createUrl, {
3838 reportFailure: false,
3939 refresh: true,
apps/web/src/components/preview/previewAutomationErrors.ts+1-1
......@@ -216,7 +216,7 @@ export const PreviewAutomationHostError = Schema.Union([
216216]);
217217export type PreviewAutomationHostError = typeof PreviewAutomationHostError.Type;
218218
219export const isPreviewAutomationHostError = Schema.is(PreviewAutomationHostError);
219const isPreviewAutomationHostError = Schema.is(PreviewAutomationHostError);
220220
221221export function serializePreviewAutomationHostError(
222222 error: PreviewAutomationHostError,
apps/web/src/components/preview/previewMiniPlayerLayout.ts+1-1
......@@ -4,7 +4,7 @@ export const PREVIEW_MINI_PLAYER_EDGE_GAP = 12;
44// The mini-player shell straddles this webview at 47 and 49; dialogs begin at 50.
55export const PREVIEW_MINI_PLAYER_WEBVIEW_Z_INDEX = 48;
66export const PREVIEW_MINI_PLAYER_DEFAULT_SIZE = { width: 320, height: 200 } as const;
7export const PREVIEW_MINI_PLAYER_MIN_SIZE = { width: 240, height: 150 } as const;
7const PREVIEW_MINI_PLAYER_MIN_SIZE = { width: 240, height: 150 } as const;
88
99export function clampPreviewMiniPlayerSize(
1010 size: PreviewMiniPlayerSize,
apps/web/src/components/projectScriptEditor.tsx+1-1
......@@ -49,7 +49,7 @@ import { Popover, PopoverPopup, PopoverTrigger } from "./ui/popover";
4949import { Switch } from "./ui/switch";
5050import { Textarea } from "./ui/textarea";
5151
52export const SCRIPT_ICONS: Array<{ id: ProjectScriptIcon; label: string }> = [
52const SCRIPT_ICONS: Array<{ id: ProjectScriptIcon; label: string }> = [
5353 { id: "play", label: "Play" },
5454 { id: "test", label: "Test" },
5555 { id: "lint", label: "Lint" },
apps/web/src/components/pullRequest/PullRequestCodeTab.tsx+1-1
......@@ -187,7 +187,7 @@ function getReviewPositionAnchor(position: PullRequestReviewPosition): {
187187 * host sit under the line they were written on, and a new comment joins the review being
188188 * drafted rather than being posted as it is typed.
189189 */
190export function PullRequestCodeTab({
190function PullRequestCodeTab({
191191 environmentId,
192192 reference,
193193 detail,
apps/web/src/components/pullRequest/pullRequestLinkContextMenu.ts+1-1
......@@ -8,7 +8,7 @@ import { toastManager } from "../ui/toast";
88export type PullRequestLinkContextMenuAction = "copy-link" | "open-external";
99
1010/** Named for the host rather than "externally": the point is where you will land. */
11export const OPEN_ON_HOST_LABELS: Partial<Record<string, string>> = {
11const OPEN_ON_HOST_LABELS: Partial<Record<string, string>> = {
1212 github: "Open on GitHub",
1313 gitlab: "Open on GitLab",
1414 bitbucket: "Open on Bitbucket",
apps/web/src/components/pullRequest/pullRequestList.logic.ts+1-1
......@@ -67,7 +67,7 @@ export type PullRequestViewers = PullRequestListResult["viewers"];
6767/** A row plus the environment that read it, where the caller has one to give. */
6868type ScopedEntry = PullRequestListEntry & { readonly environmentId?: string };
6969
70export const pullRequestViewerKey = (entry: ScopedEntry): string =>
70const pullRequestViewerKey = (entry: ScopedEntry): string =>
7171 `${entry.environmentId ?? ""} ${entry.host}`;
7272
7373const GROUP_LABELS: Record<PullRequestGroupKey, string> = {
apps/web/src/components/pullRequest/pullRequestListPreferences.ts+1-1
......@@ -37,7 +37,7 @@ export type PullRequestListPreferencePatch = {
3737 [Key in keyof PullRequestListPreferences]?: PullRequestListPreferences[Key] | undefined;
3838};
3939
40export const DEFAULT_PULL_REQUEST_LIST_PREFERENCES = {
40const DEFAULT_PULL_REQUEST_LIST_PREFERENCES = {
4141 involvement: "all",
4242 state: "open",
4343} as const satisfies PullRequestListPreferences;
apps/web/src/components/settings/KeybindingsSettings.logic.ts+1-1
......@@ -291,7 +291,7 @@ function titleCaseCommandSegment(segment: string): string {
291291 return words.join(" ");
292292}
293293
294export function normalizeShortcutKeyToken(key: string): string | null {
294function normalizeShortcutKeyToken(key: string): string | null {
295295 const normalized = key.toLowerCase();
296296 if (
297297 normalized === "meta" ||
apps/web/src/components/settings/ProjectSettingsPanel.tsx+3-3
......@@ -127,14 +127,14 @@ const ProjectIconPickerDialog = lazy(() =>
127127 })),
128128);
129129
130export const PROJECT_GROUPING_MODE_LABELS: Record<SidebarProjectGroupingMode, string> = {
130const PROJECT_GROUPING_MODE_LABELS: Record<SidebarProjectGroupingMode, string> = {
131131 repository: "Group by repository",
132132 repository_path: "Group by repository path",
133133 separate: "Keep separate",
134134};
135135
136136/** Logical project groups for the settings page, sorted by display name. */
137export function useSettingsProjectGroups(): SidebarProjectSnapshot[] {
137function useSettingsProjectGroups(): SidebarProjectSnapshot[] {
138138 const projects = useProjects();
139139 const projectGroupingSettings = useClientSettings(selectProjectGroupingSettings);
140140 const primaryEnvironmentId = usePrimaryEnvironmentId();
......@@ -253,7 +253,7 @@ function ProjectSettingsBreadcrumb({ projectKey }: { projectKey: string }) {
253253 );
254254}
255255
256export function ProjectSettingsPanel({ projectKey }: { projectKey: string }) {
256function ProjectSettingsPanel({ projectKey }: { projectKey: string }) {
257257 const groups = useSettingsProjectGroups();
258258 const navigate = useNavigate();
259259
apps/web/src/components/settings/SettingsSidebarNav.tsx+1-1
......@@ -80,7 +80,7 @@ const SETTINGS_SECTION_ICONS: Readonly<
8080 "/settings/archived": ArchiveIcon,
8181};
8282
83export const SETTINGS_NAV_ITEMS: ReadonlyArray<{
83const SETTINGS_NAV_ITEMS: ReadonlyArray<{
8484 label: string;
8585 to: SettingsPath;
8686 icon: ComponentType<{ className?: string }>;
apps/web/src/components/settings/ThemeWireframe.tsx+1-1
......@@ -4,7 +4,7 @@ import type { ThemeCardPreviewColors } from "./ThemePreviewCircles";
44// A simple miniature of the app: sidebar, a short conversation, the
55// composer, and the orchestrator panel floating over the interface as an
66// island with horizontal agent rows.
7export function ThemeWireframePane({
7function ThemeWireframePane({
88 colors,
99 clip,
1010}: {
apps/web/src/components/settings/customModelEditor.logic.ts+2-2
......@@ -104,7 +104,7 @@ export const DESCRIPTOR_PRESETS_BY_KIND: Partial<
104104};
105105
106106let nextKey = 0;
107export function newEditorKey(): string {
107function newEditorKey(): string {
108108 nextKey += 1;
109109 return `k${nextKey}`;
110110}
......@@ -140,7 +140,7 @@ export function emptyEditorChoice(): EditorChoice {
140140 * by built-in runtime profiles a custom entry does not have, so they are
141141 * dropped rather than stored as a plain option value.
142142 */
143export function descriptorToEditor(descriptor: ProviderOptionDescriptor): EditorDescriptor {
143function descriptorToEditor(descriptor: ProviderOptionDescriptor): EditorDescriptor {
144144 const promptInjected = new Set(
145145 descriptor.type === "select" ? (descriptor.promptInjectedValues ?? []) : [],
146146 );
apps/web/src/components/settings/providerDriverMeta.ts+2-2
......@@ -43,7 +43,7 @@ export interface ProviderClientDefinition {
4343 readonly badgeLabel?: string;
4444}
4545
46export const PROVIDER_CLIENT_DEFINITIONS: readonly ProviderClientDefinition[] = [
46const PROVIDER_CLIENT_DEFINITIONS: readonly ProviderClientDefinition[] = [
4747 {
4848 value: ProviderDriverKind.make("codex"),
4949 label: "Codex",
......@@ -84,7 +84,7 @@ export const PROVIDER_CLIENT_DEFINITIONS: readonly ProviderClientDefinition[] =
8484 },
8585];
8686
87export const PROVIDER_CLIENT_DEFINITION_BY_VALUE: Partial<
87const PROVIDER_CLIENT_DEFINITION_BY_VALUE: Partial<
8888 Record<ProviderDriverKind, ProviderClientDefinition>
8989> = Object.fromEntries(
9090 PROVIDER_CLIENT_DEFINITIONS.map((definition) => [definition.value, definition]),
apps/web/src/components/settings/themeInspector.ts+1-1
......@@ -14,7 +14,7 @@ const THEME_PAINT_KIND_ORDER: ReadonlyArray<ThemePaintKind> = [
1414 "foreground",
1515];
1616
17export const THEME_INSPECTOR_MATCH_ATTRIBUTE = "data-theme-inspector-match";
17const THEME_INSPECTOR_MATCH_ATTRIBUTE = "data-theme-inspector-match";
1818
1919const THEME_TOKEN_PROBE_ATTRIBUTE = "data-theme-token-probe";
2020const THEME_TOKEN_PROBE_COLOR = "#01fea7";