From c333fcec32b1f90bf0da6bb14d2609c20e38a74f Mon Sep 17 00:00:00 2001 From: Adam Malczewski Date: Fri, 26 Jun 2026 22:21:55 +0900 Subject: style: switch from tabs to 2-space indentation (incl. svelte) --- src/features/views/index.ts | 16 +-- src/features/views/logic/panels.test.ts | 88 ++++++++-------- src/features/views/logic/panels.ts | 34 +++--- src/features/views/ui/ViewSidebar.svelte | 170 +++++++++++++++--------------- src/features/views/ui/ViewSidebar.test.ts | 76 ++++++------- 5 files changed, 191 insertions(+), 193 deletions(-) (limited to 'src/features/views') diff --git a/src/features/views/index.ts b/src/features/views/index.ts index c4e7f25..164241d 100644 --- a/src/features/views/index.ts +++ b/src/features/views/index.ts @@ -1,15 +1,15 @@ export { - addPanel, - initialPanels, - type PanelsState, - removePanel, - selectKind, - type ViewPanel, + addPanel, + initialPanels, + type PanelsState, + removePanel, + selectKind, + type ViewPanel, } from "./logic/panels"; export { default as ViewSidebar } from "./ui/ViewSidebar.svelte"; /** Public module manifest — aggregated by the shell's "Loaded Modules" view. */ export const manifest = { - name: "views", - description: "Sidebar view panels (dropdown picker + add / remove)", + name: "views", + description: "Sidebar view panels (dropdown picker + add / remove)", } as const; diff --git a/src/features/views/logic/panels.test.ts b/src/features/views/logic/panels.test.ts index edd7d9e..aadbf5e 100644 --- a/src/features/views/logic/panels.test.ts +++ b/src/features/views/logic/panels.test.ts @@ -2,54 +2,54 @@ import { describe, expect, it } from "vitest"; import { addPanel, initialPanels, removePanel, selectKind } from "./panels"; describe("view panels reducer", () => { - it("seeds one empty panel by default", () => { - const s = initialPanels(); - expect(s.panels).toHaveLength(1); - expect(s.panels[0]?.kind).toBeNull(); - }); + it("seeds one empty panel by default", () => { + const s = initialPanels(); + expect(s.panels).toHaveLength(1); + expect(s.panels[0]?.kind).toBeNull(); + }); - it("seeds a panel per provided kind, in order, with unique ids", () => { - const s = initialPanels(["surfaces", null]); - expect(s.panels.map((p) => p.kind)).toEqual(["surfaces", null]); - expect(new Set(s.panels.map((p) => p.id)).size).toBe(2); - }); + it("seeds a panel per provided kind, in order, with unique ids", () => { + const s = initialPanels(["surfaces", null]); + expect(s.panels.map((p) => p.kind)).toEqual(["surfaces", null]); + expect(new Set(s.panels.map((p) => p.id)).size).toBe(2); + }); - it("addPanel appends an empty panel with a fresh id", () => { - const seed = initialPanels(["surfaces"]); - const s = addPanel(seed); - expect(s.panels).toHaveLength(2); - expect(s.panels[1]?.kind).toBeNull(); - expect(s.panels[1]?.id).not.toBe(s.panels[0]?.id); - }); + it("addPanel appends an empty panel with a fresh id", () => { + const seed = initialPanels(["surfaces"]); + const s = addPanel(seed); + expect(s.panels).toHaveLength(2); + expect(s.panels[1]?.kind).toBeNull(); + expect(s.panels[1]?.id).not.toBe(s.panels[0]?.id); + }); - it("addPanel can seed a kind", () => { - const s = addPanel(initialPanels([null]), "surfaces"); - expect(s.panels[1]?.kind).toBe("surfaces"); - }); + it("addPanel can seed a kind", () => { + const s = addPanel(initialPanels([null]), "surfaces"); + expect(s.panels[1]?.kind).toBe("surfaces"); + }); - it("removePanel drops the matching id only", () => { - const seed = initialPanels(["surfaces", null]); - const firstId = seed.panels[0]?.id ?? -1; - const s = removePanel(seed, firstId); - expect(s.panels).toHaveLength(1); - expect(s.panels[0]?.kind).toBeNull(); - }); + it("removePanel drops the matching id only", () => { + const seed = initialPanels(["surfaces", null]); + const firstId = seed.panels[0]?.id ?? -1; + const s = removePanel(seed, firstId); + expect(s.panels).toHaveLength(1); + expect(s.panels[0]?.kind).toBeNull(); + }); - it("selectKind updates only the targeted panel", () => { - const seed = initialPanels([null, null]); - const targetId = seed.panels[1]?.id ?? -1; - const s = selectKind(seed, targetId, "surfaces"); - expect(s.panels[0]?.kind).toBeNull(); - expect(s.panels[1]?.kind).toBe("surfaces"); - }); + it("selectKind updates only the targeted panel", () => { + const seed = initialPanels([null, null]); + const targetId = seed.panels[1]?.id ?? -1; + const s = selectKind(seed, targetId, "surfaces"); + expect(s.panels[0]?.kind).toBeNull(); + expect(s.panels[1]?.kind).toBe("surfaces"); + }); - it("is pure — never mutates the input state", () => { - const seed = initialPanels(["surfaces"]); - const snapshot = JSON.stringify(seed); - const id = seed.panels[0]?.id ?? -1; - addPanel(seed); - removePanel(seed, id); - selectKind(seed, id, null); - expect(JSON.stringify(seed)).toBe(snapshot); - }); + it("is pure — never mutates the input state", () => { + const seed = initialPanels(["surfaces"]); + const snapshot = JSON.stringify(seed); + const id = seed.panels[0]?.id ?? -1; + addPanel(seed); + removePanel(seed, id); + selectKind(seed, id, null); + expect(JSON.stringify(seed)).toBe(snapshot); + }); }); diff --git a/src/features/views/logic/panels.ts b/src/features/views/logic/panels.ts index 38c28fb..fa22be6 100644 --- a/src/features/views/logic/panels.ts +++ b/src/features/views/logic/panels.ts @@ -10,14 +10,14 @@ */ export interface ViewPanel { - readonly id: number; - /** Selected view-kind id, or `null` while the panel still reads "Select a view". */ - readonly kind: string | null; + readonly id: number; + /** Selected view-kind id, or `null` while the panel still reads "Select a view". */ + readonly kind: string | null; } export interface PanelsState { - readonly panels: readonly ViewPanel[]; - readonly nextId: number; + readonly panels: readonly ViewPanel[]; + readonly nextId: number; } /** @@ -25,25 +25,25 @@ export interface PanelsState { * a single preset panel, or `[null]` for one empty "Select a view" panel. */ export function initialPanels(kinds: readonly (string | null)[] = [null]): PanelsState { - let nextId = 0; - const panels = kinds.map((kind) => ({ id: nextId++, kind })); - return { panels, nextId }; + let nextId = 0; + const panels = kinds.map((kind) => ({ id: nextId++, kind })); + return { panels, nextId }; } export function addPanel(state: PanelsState, kind: string | null = null): PanelsState { - return { - panels: [...state.panels, { id: state.nextId, kind }], - nextId: state.nextId + 1, - }; + return { + panels: [...state.panels, { id: state.nextId, kind }], + nextId: state.nextId + 1, + }; } export function removePanel(state: PanelsState, id: number): PanelsState { - return { ...state, panels: state.panels.filter((p) => p.id !== id) }; + return { ...state, panels: state.panels.filter((p) => p.id !== id) }; } export function selectKind(state: PanelsState, id: number, kind: string | null): PanelsState { - return { - ...state, - panels: state.panels.map((p) => (p.id === id ? { ...p, kind } : p)), - }; + return { + ...state, + panels: state.panels.map((p) => (p.id === id ? { ...p, kind } : p)), + }; } diff --git a/src/features/views/ui/ViewSidebar.svelte b/src/features/views/ui/ViewSidebar.svelte index e4a3ee6..e9e8682 100644 --- a/src/features/views/ui/ViewSidebar.svelte +++ b/src/features/views/ui/ViewSidebar.svelte @@ -1,97 +1,95 @@
- {#each state.panels as panel, idx (panel.id)} -
-
- - {#if idx > 0} - - {/if} -
+ {#each state.panels as panel, idx (panel.id)} +
+
+ + {#if idx > 0} + + {/if} +
- {#if panel.kind !== null} -
- {@render content(panel.kind)} -
- {/if} -
- {/each} + {#if panel.kind !== null} +
+ {@render content(panel.kind)} +
+ {/if} +
+ {/each} - +
diff --git a/src/features/views/ui/ViewSidebar.test.ts b/src/features/views/ui/ViewSidebar.test.ts index 8a0049c..0618506 100644 --- a/src/features/views/ui/ViewSidebar.test.ts +++ b/src/features/views/ui/ViewSidebar.test.ts @@ -5,54 +5,54 @@ import { describe, expect, it } from "vitest"; import ViewSidebar from "./ViewSidebar.svelte"; const kinds = [ - { id: "surfaces", label: "Surfaces" }, - { id: "tasks", label: "Tasks" }, + { id: "surfaces", label: "Surfaces" }, + { id: "tasks", label: "Tasks" }, ]; // A raw snippet that echoes the kind it was rendered for, so tests can assert // which view-kind content each panel shows. const content = createRawSnippet<[string]>((kind) => ({ - render: () => `
kind:${kind()}
`, + render: () => `
kind:${kind()}
`, })); describe("ViewSidebar", () => { - it("opens one panel seeded with the first kind and renders its content", () => { - render(ViewSidebar, { props: { kinds, content } }); - expect(screen.getAllByRole("combobox")).toHaveLength(1); - expect(screen.getByTestId("view-content")).toHaveTextContent("kind:surfaces"); - }); + it("opens one panel seeded with the first kind and renders its content", () => { + render(ViewSidebar, { props: { kinds, content } }); + expect(screen.getAllByRole("combobox")).toHaveLength(1); + expect(screen.getByTestId("view-content")).toHaveTextContent("kind:surfaces"); + }); - it("the first panel has no remove button", () => { - render(ViewSidebar, { props: { kinds, content } }); - expect(screen.queryByRole("button", { name: "Remove view" })).toBeNull(); - }); + it("the first panel has no remove button", () => { + render(ViewSidebar, { props: { kinds, content } }); + expect(screen.queryByRole("button", { name: "Remove view" })).toBeNull(); + }); - it("the add button appends a new empty panel", async () => { - const user = userEvent.setup(); - render(ViewSidebar, { props: { kinds, content } }); - await user.click(screen.getByRole("button", { name: "Add view" })); - expect(screen.getAllByRole("combobox")).toHaveLength(2); - // the new panel is empty → only the first panel renders content - expect(screen.getAllByTestId("view-content")).toHaveLength(1); - }); + it("the add button appends a new empty panel", async () => { + const user = userEvent.setup(); + render(ViewSidebar, { props: { kinds, content } }); + await user.click(screen.getByRole("button", { name: "Add view" })); + expect(screen.getAllByRole("combobox")).toHaveLength(2); + // the new panel is empty → only the first panel renders content + expect(screen.getAllByTestId("view-content")).toHaveLength(1); + }); - it("non-first panels can be removed", async () => { - const user = userEvent.setup(); - render(ViewSidebar, { props: { kinds, content } }); - await user.click(screen.getByRole("button", { name: "Add view" })); - const removeButtons = screen.getAllByRole("button", { name: "Remove view" }); - expect(removeButtons).toHaveLength(1); - const target = removeButtons[0]; - if (target === undefined) throw new Error("expected a remove button"); - await user.click(target); - expect(screen.getAllByRole("combobox")).toHaveLength(1); - }); + it("non-first panels can be removed", async () => { + const user = userEvent.setup(); + render(ViewSidebar, { props: { kinds, content } }); + await user.click(screen.getByRole("button", { name: "Add view" })); + const removeButtons = screen.getAllByRole("button", { name: "Remove view" }); + expect(removeButtons).toHaveLength(1); + const target = removeButtons[0]; + if (target === undefined) throw new Error("expected a remove button"); + await user.click(target); + expect(screen.getAllByRole("combobox")).toHaveLength(1); + }); - it("selecting a kind renders that kind's content", async () => { - const user = userEvent.setup(); - render(ViewSidebar, { props: { kinds, content, initial: [null] } }); - expect(screen.queryByTestId("view-content")).toBeNull(); - await user.selectOptions(screen.getByRole("combobox"), "tasks"); - expect(screen.getByTestId("view-content")).toHaveTextContent("kind:tasks"); - }); + it("selecting a kind renders that kind's content", async () => { + const user = userEvent.setup(); + render(ViewSidebar, { props: { kinds, content, initial: [null] } }); + expect(screen.queryByTestId("view-content")).toBeNull(); + await user.selectOptions(screen.getByRole("combobox"), "tasks"); + expect(screen.getByTestId("view-content")).toHaveTextContent("kind:tasks"); + }); }); -- cgit v1.2.3