From 9e96ccd649eda8cf0fa2f4ac63bce55ab0601bbd Mon Sep 17 00:00:00 2001 From: Adam Leith Date: Fri, 10 Apr 2026 12:09:30 +0100 Subject: [PATCH 01/10] sidebar and project switcher => quill --- apps/code/package.json | 1 + .../features/command/components/Command.tsx | 122 ++-- .../sidebar/components/ProjectSwitcher.tsx | 296 +++------ .../sidebar/components/SidebarContent.tsx | 2 +- .../sidebar/components/SidebarItem.tsx | 36 +- .../sidebar/components/SidebarMenu.tsx | 7 +- .../sidebar/components/TaskListView.tsx | 16 +- .../sidebar/components/items/HomeItem.tsx | 3 + apps/code/src/renderer/stores/themeStore.ts | 10 + apps/code/src/renderer/styles/globals.css | 1 + apps/code/src/renderer/styles/quill.css | 105 +++ pnpm-lock.yaml | 600 +++++++++++++++++- 12 files changed, 908 insertions(+), 291 deletions(-) create mode 100644 apps/code/src/renderer/styles/quill.css diff --git a/apps/code/package.json b/apps/code/package.json index f765eca1d..2d3a32447 100644 --- a/apps/code/package.json +++ b/apps/code/package.json @@ -190,6 +190,7 @@ "rehype-sanitize": "^6.0.0", "remark-breaks": "^4.0.0", "remark-gfm": "^4.0.1", + "shadcn": "^4.1.2", "smol-toml": "^1.6.0", "sonner": "^2.0.7", "striptags": "^3.2.0", diff --git a/apps/code/src/renderer/features/command/components/Command.tsx b/apps/code/src/renderer/features/command/components/Command.tsx index e112110e2..90e887100 100644 --- a/apps/code/src/renderer/features/command/components/Command.tsx +++ b/apps/code/src/renderer/features/command/components/Command.tsx @@ -1,17 +1,25 @@ -import { Command as CmdkCommand } from "cmdk"; +import { + CommandDialog, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, + CommandRoot, +} from "cmdk"; import React from "react"; import "./Command.css"; -interface CommandRootProps extends React.ComponentProps { +type CommandRootProps = React.ComponentPropsWithoutRef & { className?: string; -} +}; -const CommandRoot = React.forwardRef< - React.ElementRef, +const CommandRootWrapper = React.forwardRef< + React.ElementRef, CommandRootProps >(({ className, ...props }, ref) => { return ( - { +type CommandInputProps = React.ComponentPropsWithoutRef & { className?: string; -} +}; -const CommandInput = React.forwardRef< - React.ElementRef, +const CommandInputWrapper = React.forwardRef< + React.ElementRef, CommandInputProps >(({ className, ...props }, ref) => { - return ; + return ; }); -CommandInput.displayName = "CommandInput"; +CommandInputWrapper.displayName = "CommandInput"; -interface CommandListProps - extends React.ComponentProps { +type CommandListProps = React.ComponentPropsWithoutRef & { className?: string; -} +}; -const CommandList = React.forwardRef< - React.ElementRef, +const CommandListWrapper = React.forwardRef< + React.ElementRef, CommandListProps >(({ className, ...props }, ref) => { return ( - { +type CommandItemProps = React.ComponentPropsWithoutRef & { className?: string; -} +}; -const CommandItem = React.forwardRef< - React.ElementRef, +const CommandItemWrapper = React.forwardRef< + React.ElementRef, CommandItemProps >(({ className, ...props }, ref) => { return ( - { +type CommandGroupProps = React.ComponentPropsWithoutRef & { className?: string; heading?: string; -} +}; -const CommandGroup = React.forwardRef< - React.ElementRef, +const CommandGroupWrapper = React.forwardRef< + React.ElementRef, CommandGroupProps >(({ className, heading, children, ...props }, ref) => { return ( - + {heading && (
{heading}
)} {children} -
+ ); }); -CommandGroup.displayName = "CommandGroup"; +CommandGroupWrapper.displayName = "CommandGroup"; -interface CommandEmptyProps - extends React.ComponentProps { +type CommandEmptyProps = React.ComponentPropsWithoutRef & { className?: string; -} +}; -const CommandEmpty = React.forwardRef< - React.ElementRef, +const CommandEmptyWrapper = React.forwardRef< + React.ElementRef, CommandEmptyProps >(({ className, ...props }, ref) => { return ( - { +type CommandDialogProps = React.ComponentPropsWithoutRef< + typeof CommandDialog +> & { className?: string; contentClassName?: string; -} +}; -const CommandDialog = ({ +const CommandDialogWrapper = ({ className, contentClassName, children, ...props }: CommandDialogProps) => { return ( - {children} - + ); }; -CommandDialog.displayName = "CommandDialog"; +CommandDialogWrapper.displayName = "CommandDialog"; export const Command = { - Root: CommandRoot, - Dialog: CommandDialog, - Input: CommandInput, - List: CommandList, - Item: CommandItem, - Group: CommandGroup, - Empty: CommandEmpty, + Root: CommandRootWrapper, + Dialog: CommandDialogWrapper, + Input: CommandInputWrapper, + List: CommandListWrapper, + Item: CommandItemWrapper, + Group: CommandGroupWrapper, + Empty: CommandEmptyWrapper, }; diff --git a/apps/code/src/renderer/features/sidebar/components/ProjectSwitcher.tsx b/apps/code/src/renderer/features/sidebar/components/ProjectSwitcher.tsx index 7c0f12cfb..09b09596c 100644 --- a/apps/code/src/renderer/features/sidebar/components/ProjectSwitcher.tsx +++ b/apps/code/src/renderer/features/sidebar/components/ProjectSwitcher.tsx @@ -8,9 +8,6 @@ import { useProjects } from "@features/projects/hooks/useProjects"; import { useSettingsDialogStore } from "@features/settings/stores/settingsDialogStore"; import { ArrowSquareOut, - CaretDown, - CaretRight, - CaretUp, Check, DiscordLogo, FolderSimple, @@ -21,51 +18,40 @@ import { ShieldCheck, SignOut, } from "@phosphor-icons/react"; -import { - Box, - Dialog, - DropdownMenu, - Flex, - Popover, - Text, -} from "@radix-ui/themes"; +import { Box, Dialog, Flex, Text } from "@radix-ui/themes"; import { trpcClient } from "@renderer/trpc/client"; import { getCloudUrlFromRegion } from "@shared/constants/oauth"; import { isMac } from "@utils/platform"; -import { useCallback, useEffect, useRef, useState } from "react"; +import { useState } from "react"; import "./ProjectSwitcher.css"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuTrigger, + Item, + ItemActions, + ItemContent, + ItemDescription, + ItemTitle, + Kbd, +} from "@posthog/quill-primitives"; +import { ChevronRightIcon } from "lucide-react"; export function ProjectSwitcher() { const [popoverOpen, setPopoverOpen] = useState(false); const [dialogOpen, setDialogOpen] = useState(false); - const [learnMoreOpen, setLearnMoreOpen] = useState(false); - const learnMoreTimeout = useRef>(undefined); - - const openLearnMore = useCallback(() => { - clearTimeout(learnMoreTimeout.current); - setLearnMoreOpen(true); - }, []); - - const closeLearnMore = useCallback(() => { - learnMoreTimeout.current = setTimeout(() => setLearnMoreOpen(false), 150); - }, []); - useEffect(() => { - if (!popoverOpen) { - clearTimeout(learnMoreTimeout.current); - setLearnMoreOpen(false); - } - }, [popoverOpen]); const cloudRegion = useAuthStateValue((state) => state.cloudRegion); const selectProjectMutation = useSelectProjectMutation(); const logoutMutation = useLogoutMutation(); - const { - groupedProjects, - currentProject, - currentProjectId, - currentUser, - isLoading, - } = useProjects(); + const { groupedProjects, currentProject, currentProjectId, currentUser } = + useProjects(); const handleProjectSelect = (projectId: number) => { if (projectId !== currentProjectId) { @@ -121,77 +107,50 @@ export function ProjectSwitcher() { return ( <> - { - setPopoverOpen(open); - if (!open) setLearnMoreOpen(false); - }} - > - - - + + + {currentProject?.name ?? "No project selected"} + + + {currentUser?.email ?? "No email"} + + + + + + + } + /> - - + {currentUser ? ( - <> - {currentUser.first_name && ( - - {currentUser.first_name} - {currentUser.last_name && ` ${currentUser.last_name}`} - - )} - - {currentUser.email} - - + + + + {currentUser.first_name && ( + + {currentUser.first_name} + {currentUser.last_name && ` ${currentUser.last_name}`} + + )} + + {currentUser.email} + + ) : ( <> @@ -200,121 +159,76 @@ export function ProjectSwitcher() { )} - - + Change project + - + Create project + - + - + Join our Discord + - - - - - - + + + Learn more + + + handleOpenExternal("https://posthog.com/code") } > - PostHog Code Website - - - + + handleOpenExternal("https://posthog.com/privacy") } > - Privacy Policy - - - + Privacy Policy + + + - - Keyboard Shortcuts - - {isMac ? "⌘/" : "Ctrl+/"} - - - - - + Keyboard Shortcuts + + {isMac ? "⌘/" : "Ctrl+/"} + + + + - + + + Settings + + {isMac ? "⌘," : "Ctrl+,"} + + - + - + Log out + - - + + No projects found. - {groupedProjects.map((group) => + {groupedProjects.flatMap((group) => group.projects.map((project) => ( { )} - + diff --git a/apps/code/src/renderer/features/sidebar/components/SidebarItem.tsx b/apps/code/src/renderer/features/sidebar/components/SidebarItem.tsx index 41d6d3b84..9144fa945 100644 --- a/apps/code/src/renderer/features/sidebar/components/SidebarItem.tsx +++ b/apps/code/src/renderer/features/sidebar/components/SidebarItem.tsx @@ -1,3 +1,4 @@ +import { Button, type ButtonProps, cn } from "@posthog/quill-primitives"; import type { SidebarItemAction } from "../types"; const INDENT_SIZE = 8; @@ -16,6 +17,7 @@ interface SidebarItemProps { onContextMenu?: (e: React.MouseEvent) => void; action?: SidebarItemAction; endContent?: React.ReactNode; + variant?: ButtonProps["variant"]; } export function SidebarItem({ @@ -24,56 +26,50 @@ export function SidebarItem({ label, subtitle, isActive, - isDimmed, draggable, onDragStart, onClick, onDoubleClick, onContextMenu, endContent, + variant = "default", }: SidebarItemProps) { return ( - + ); } diff --git a/apps/code/src/renderer/features/sidebar/components/SidebarMenu.tsx b/apps/code/src/renderer/features/sidebar/components/SidebarMenu.tsx index c36a746f8..8f1027765 100644 --- a/apps/code/src/renderer/features/sidebar/components/SidebarMenu.tsx +++ b/apps/code/src/renderer/features/sidebar/components/SidebarMenu.tsx @@ -257,15 +257,16 @@ function SidebarMenuComponent() { overflowX: "hidden", }} > - + - + - + - - {label} - - {endContent} - + + {label} + {endContent ? {endContent} : null} + ); } @@ -454,7 +456,7 @@ export function TaskListView({ ) : ( - + {flatTasks.map((task) => ( void; + variant?: ButtonProps["variant"]; } export function NewTaskItem({ isActive, onClick }: NewTaskItemProps) { @@ -20,6 +22,7 @@ export function NewTaskItem({ isActive, onClick }: NewTaskItemProps) { label="New task" isActive={isActive} onClick={onClick} + variant="primary" /> ); } diff --git a/apps/code/src/renderer/stores/themeStore.ts b/apps/code/src/renderer/stores/themeStore.ts index 4ccbea84d..7b1c3031c 100644 --- a/apps/code/src/renderer/stores/themeStore.ts +++ b/apps/code/src/renderer/stores/themeStore.ts @@ -80,3 +80,13 @@ mediaQuery.addEventListener("change", () => { useThemeStore.setState({ isDarkMode: mediaQuery.matches }); } }); + +// Sync the .dark class on so CSS that uses .dark selector (e.g. quill +// color tokens) switches correctly. Radix Themes uses its own `appearance` prop +// and doesn't toggle this class. +function syncDarkClass(isDarkMode: boolean) { + document.documentElement.classList.toggle("dark", isDarkMode); +} + +syncDarkClass(useThemeStore.getState().isDarkMode); +useThemeStore.subscribe((state) => syncDarkClass(state.isDarkMode)); diff --git a/apps/code/src/renderer/styles/globals.css b/apps/code/src/renderer/styles/globals.css index 8193f1328..fb8f94601 100644 --- a/apps/code/src/renderer/styles/globals.css +++ b/apps/code/src/renderer/styles/globals.css @@ -2,6 +2,7 @@ @import "@radix-ui/themes/styles.css" layer(radix); @import "tailwindcss"; @config "../../../tailwind.config.js"; +@import "./quill.css"; @font-face { font-family: "Berkeley Mono"; diff --git a/apps/code/src/renderer/styles/quill.css b/apps/code/src/renderer/styles/quill.css new file mode 100644 index 000000000..564bca43b --- /dev/null +++ b/apps/code/src/renderer/styles/quill.css @@ -0,0 +1,105 @@ +/* + * Quill Design System integration + * + * Imports quill's color tokens as CSS custom properties and maps them + * to Tailwind theme colors so quill component classes (bg-primary, + * text-muted-foreground, etc.) generate correctly. + * + * Only color mappings are imported — spacing, fonts, shadows, and radius + * are intentionally omitted to avoid overriding the app's existing theme. + */ + +/* CSS custom properties for quill colors (light + dark via :root / .dark) */ +@import "@posthog/quill-tokens/color-system.css"; + +/* Animations and CSS resets used by quill primitives */ +@import "tw-animate-css"; +@import "shadcn/tailwind.css"; + +/* Register quill color tokens as Tailwind theme values (inline = no CSS output) */ +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-destructive: var(--destructive); + --color-destructive-foreground: var(--destructive-foreground); + --color-success: var(--success); + --color-success-foreground: var(--success-foreground); + --color-warning: var(--warning); + --color-warning-foreground: var(--warning-foreground); + --color-info: var(--info); + --color-info-foreground: var(--info-foreground); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-fill-hover: var(--fill-hover); + --color-fill-active: var(--fill-active); + --color-fill-expanded: var(--fill-expanded); + --color-fill-selected: var(--fill-selected); + + /* Quill font sizes — rem() uses 16px base (rem = px / 16) and matches fontSize in source of truth. + * See: export const fontSize = { + * xxs: [rem(10), { lineHeight: rem(12) }], // 0.625rem (10px), 0.75rem (12px) + * xs: [rem(12), { lineHeight: rem(16) }], // 0.75rem (12px), 1rem (16px) + * sm: [rem(14), { lineHeight: rem(20) }], // 0.875rem (14px), 1.25rem (20px) + * base:[rem(16), { lineHeight: rem(24) }], // 1rem (16px), 1.5rem (24px) + * lg: [rem(18), { lineHeight: rem(28) }], // 1.125rem (18px), 1.75rem (28px) + * xl: [rem(20), { lineHeight: rem(28) }], // 1.25rem (20px), 1.75rem (28px) + * '2xl':[rem(24), { lineHeight: rem(32) }], // 1.5rem (24px), 2rem (32px) + * } + */ + + --text-xxs: 0.625rem; /* 10px */ + --text-xxs--line-height: 0.75rem; /* 12px */ + --text-xs: 0.75rem; /* 12px */ + --text-xs--line-height: 1rem; /* 16px */ + --text-sm: 0.875rem; /* 14px */ + --text-sm--line-height: 1.25rem; /* 20px */ + --text-base: 1rem; /* 16px */ + --text-base--line-height: 1.5rem; /* 24px */ + --text-lg: 1.125rem; /* 18px */ + --text-lg--line-height: 1.75rem; /* 28px */ + --text-xl: 1.25rem; /* 20px */ + --text-xl--line-height: 1.75rem; /* 28px */ + --text-2xl: 1.5rem; /* 24px */ + --text-2xl--line-height: 2rem; /* 32px */ + + /* Quill line heights — the Radix preset replaces default lineHeight + * (tight/snug/normal/relaxed) with numbered scales (1-9). */ + --leading-tight: 1.25; + --leading-snug: 1.375; + --leading-normal: 1.5; + --leading-relaxed: 1.625; + --leading-loose: 2; + + /* Quill radius — uses --radius base from color-system.css. + * The Radix preset replaces default borderRadius (sm/md/lg) with + * numbered scales (1-6), so quill components need these re-added. */ + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --radius-2xl: calc(var(--radius) + 8px); + --radius-3xl: calc(var(--radius) + 12px); + --radius-4xl: calc(var(--radius) + 16px); + + /* Quill shadows — the Radix preset replaces default shadows (sm/md/lg) + * with numbered scales (1-6), so quill components need these re-added. */ + --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.3); + --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -2px rgba(0, 0, 0, 0.3); + --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.3), 0 4px 6px -4px rgba(0, 0, 0, 0.3); +} + +/* Scan quill package dist files so Tailwind generates their utility classes */ +@source "../../../node_modules/@posthog/quill-primitives/dist/"; +@source "../../../node_modules/@posthog/quill-components/dist/"; +@source "../../../node_modules/@posthog/quill-blocks/dist/"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4b2ed4a97..a433fab1f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -171,16 +171,16 @@ importers: version: 0.0.48(prop-types@15.8.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@posthog/quill-blocks': specifier: link:/Users/adamleithp/Dev/posthog/packages/quill/packages/blocks - version: link:../../../../../adamleithp/Dev/posthog/packages/quill/packages/blocks + version: link:../../../posthog/packages/quill/packages/blocks '@posthog/quill-components': specifier: link:/Users/adamleithp/Dev/posthog/packages/quill/packages/components - version: link:../../../../../adamleithp/Dev/posthog/packages/quill/packages/components + version: link:../../../posthog/packages/quill/packages/components '@posthog/quill-primitives': specifier: link:/Users/adamleithp/Dev/posthog/packages/quill/packages/primitives - version: link:../../../../../adamleithp/Dev/posthog/packages/quill/packages/primitives + version: link:../../../posthog/packages/quill/packages/primitives '@posthog/quill-tokens': specifier: link:/Users/adamleithp/Dev/posthog/packages/quill/packages/tokens - version: link:../../../../../adamleithp/Dev/posthog/packages/quill/packages/tokens + version: link:../../../posthog/packages/quill/packages/tokens '@posthog/shared': specifier: workspace:* version: link:../../packages/shared @@ -349,6 +349,9 @@ importers: remark-gfm: specifier: ^4.0.1 version: 4.0.1 + shadcn: + specifier: ^4.1.2 + version: 4.1.2(@types/node@24.12.0)(typescript@5.9.3) smol-toml: specifier: ^1.6.0 version: 1.6.0 @@ -1612,9 +1615,19 @@ packages: '@dnd-kit/state@0.1.21': resolution: {integrity: sha512-pdhntEPvn/QttcF295bOJpWiLsRqA/Iczh1ODOJUxGiR+E4GkYVz9VapNNm9gDq6ST0tr/e1Q2xBztUHlJqQgA==} + '@dotenvx/dotenvx@1.60.1': + resolution: {integrity: sha512-pPKqhE/HiaPDfbSf6doJnxeqzLszWP4eLICB89wRDZGaBaLzGpa3RgahVYIauBonaEWT8oxqAyacWKHtD+n3hQ==} + hasBin: true + '@drizzle-team/brocli@0.10.2': resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} + '@ecies/ciphers@0.2.6': + resolution: {integrity: sha512-patgsRPKGkhhoBjETV4XxD0En4ui5fbX0hzayqI3M8tvNMGUoUvmyYAIWwlxBc1KX5cturfqByYdj5bYGRpN9g==} + engines: {bun: '>=1', deno: '>=2.7.10', node: '>=16'} + peerDependencies: + '@noble/ciphers': ^1.0.0 + '@electron-forge/cli@7.11.1': resolution: {integrity: sha512-pk8AoLsr7t7LBAt0cFD06XFA6uxtPdvtLx06xeal7O9o7GHGCbj29WGwFoJ8Br/ENM0Ho868S3PrAn1PtBXt5g==} engines: {node: '>= 16.4.0'} @@ -3138,6 +3151,18 @@ packages: '@napi-rs/wasm-runtime@1.1.1': resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + '@noble/ciphers@1.3.0': + resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.9.7': + resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -4608,6 +4633,9 @@ packages: cpu: [x64] os: [win32] + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@shikijs/core@3.23.0': resolution: {integrity: sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==} @@ -4645,6 +4673,10 @@ packages: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} @@ -5063,6 +5095,9 @@ packages: react: '>=18.2.0' typescript: '>=5.7.2' + '@ts-morph/common@0.27.0': + resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==} + '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} @@ -5218,6 +5253,9 @@ packages: '@types/use-sync-external-store@0.0.6': resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} + '@types/validate-npm-package-name@4.0.2': + resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==} + '@types/wrap-ansi@3.0.0': resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} @@ -5858,6 +5896,10 @@ packages: call-me-maybe@1.0.2: resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} @@ -6023,6 +6065,9 @@ packages: react: ^18 || ^19 || ^19.0.0-rc react-dom: ^18 || ^19 || ^19.0.0-rc + code-block-writer@13.0.3: + resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} + color-convert@0.5.3: resolution: {integrity: sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling==} @@ -6169,6 +6214,15 @@ packages: resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} engines: {node: '>= 0.10'} + cosmiconfig@9.0.1: + resolution: {integrity: sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + crelt@1.0.6: resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} @@ -6217,6 +6271,10 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + data-urls@5.0.0: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} @@ -6267,6 +6325,14 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} + dedent@1.7.2: + resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -6517,6 +6583,10 @@ packages: ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + eciesjs@0.4.18: + resolution: {integrity: sha512-wG99Zcfcys9fZux7Cft8BAX/YrOJLJSZ3jyYPfhZHqN2E+Ffx+QXBDsv3gubEgPtV6dTzJMSQUwk1H98/t/0wQ==} + engines: {bun: '>=1', deno: '>=2', node: '>=16'} + ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -6749,10 +6819,18 @@ packages: resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} engines: {node: '>=6'} + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} + execa@9.6.1: + resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} + engines: {node: ^18.19.0 || >=20.5.0} + exif-parser@0.1.12: resolution: {integrity: sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==} @@ -7047,12 +7125,20 @@ packages: picomatch: optional: true + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + fflate@0.4.8: resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==} fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + file-icon@6.0.0: resolution: {integrity: sha512-cNWEJlqKoqcCt8v9ybKL1k69oHqbmEdNSHKUI2o/RmrCiBnG+yJXThfIeljiqfEs/PW1HeazJj2/SJABhtaawQ==} engines: {node: '>=20'} @@ -7141,6 +7227,10 @@ packages: engines: {node: '>=18.3.0'} hasBin: true + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -7230,6 +7320,9 @@ packages: resolution: {integrity: sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==} engines: {node: '>=10'} + fuzzysort@3.1.0: + resolution: {integrity: sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==} + fzf@0.5.2: resolution: {integrity: sha512-Tt4kuxLXFKHy8KT40zwsUPUkg1CrsgY25FxA2U/j/0WgEDCk3ddc/zLTCCcbSHX9FcKtLuVaDGtGE/STWC+j3Q==} @@ -7263,6 +7356,10 @@ packages: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} + get-own-enumerable-keys@1.0.0: + resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==} + engines: {node: '>=14.16'} + get-package-info@1.0.0: resolution: {integrity: sha512-SCbprXGAPdIhKAXiG+Mk6yeoFH61JlYunqdFQFHDtLjJlDjFf6x07dsS8acO+xWt52jpdVo49AlVDnUVK1sDNw==} engines: {node: '>= 4.0'} @@ -7283,10 +7380,18 @@ packages: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + get-tsconfig@4.13.1: resolution: {integrity: sha512-EoY1N2xCn44xU6750Sx7OjOIT59FkmstNc3X6y5xpz7D5cBtZRe/3pSlTkDJgqsOk3WwZPkWfonhhUJfttQo3w==} @@ -7501,10 +7606,18 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} + humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} @@ -7559,6 +7672,10 @@ packages: immer@11.1.3: resolution: {integrity: sha512-6jQTc5z0KJFtr1UgFpIL3N9XSC3saRaI9PwWtzM2pSqkNGtiNkYY2OSwkOGDK2XcTRcLb1pi/aNkKZz0nxVH4Q==} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + imul@1.0.1: resolution: {integrity: sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==} engines: {node: '>=0.10.0'} @@ -7665,6 +7782,10 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-in-ssh@1.0.0: + resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} + engines: {node: '>=20'} + is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -7674,6 +7795,10 @@ packages: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + is-lambda@1.0.1: resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} @@ -7690,6 +7815,10 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-obj@3.0.0: + resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} + engines: {node: '>=12'} + is-plain-obj@2.1.0: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} engines: {node: '>=8'} @@ -7707,18 +7836,38 @@ packages: is-property@1.0.2: resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + is-regexp@3.1.0: + resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} + engines: {node: '>=12'} + is-stream@1.1.0: resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} engines: {node: '>=0.10.0'} + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + is-what@5.5.0: resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} engines: {node: '>=18'} @@ -7923,6 +8072,10 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + knip@5.83.0: resolution: {integrity: sha512-FfmaHMntpZB13B1oJQMSs1hTOZxd0TOn+FYB3oWEI02XlxTW3RH4H7d8z5Us3g0ziHCYyl7z0B1xi8ENP3QEKA==} engines: {node: '>=18.18.0'} @@ -8250,6 +8403,10 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} + log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} + log-update@5.0.1: resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -8827,6 +8984,11 @@ packages: node-api-version@0.2.1: resolution: {integrity: sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==} + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -8836,6 +8998,10 @@ packages: encoding: optional: true + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-forge@1.3.3: resolution: {integrity: sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==} engines: {node: '>= 6.13.0'} @@ -8886,10 +9052,18 @@ packages: resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} engines: {node: '>=4'} + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + npm-run-path@5.3.0: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -8919,6 +9093,10 @@ packages: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} + object-treeify@1.1.33: + resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} + engines: {node: '>= 10'} + obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} @@ -8966,6 +9144,10 @@ packages: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} + open@11.0.0: + resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} + engines: {node: '>=20'} + open@7.4.2: resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} engines: {node: '>=8'} @@ -8988,6 +9170,10 @@ packages: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} + ora@8.2.0: + resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} + engines: {node: '>=18'} + orderedmap@2.1.1: resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} @@ -9063,6 +9249,10 @@ packages: pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + parse-author@2.0.0: resolution: {integrity: sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw==} engines: {node: '>=0.10.0'} @@ -9086,6 +9276,14 @@ packages: resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} engines: {node: '>=0.10.0'} + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + parse-png@2.1.0: resolution: {integrity: sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==} engines: {node: '>=10'} @@ -9112,6 +9310,9 @@ packages: xstate: optional: true + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} @@ -9297,6 +9498,10 @@ packages: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} + postcss-selector-parser@7.1.1: + resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} + engines: {node: '>=4'} + postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -9359,6 +9564,10 @@ packages: engines: {node: '>=14.0.0'} hasBin: true + powershell-utils@0.1.0: + resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} + engines: {node: '>=20'} + preact@10.28.3: resolution: {integrity: sha512-tCmoRkPQLpBeWzpmbhryairGnhW9tKV6c6gr/w+RhoRoKEJwsjzipwp//1oCpGPOchvSLaAPlpcJi9MwMmoPyA==} @@ -9395,6 +9604,10 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} + proc-log@2.0.1: resolution: {integrity: sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -9895,6 +10108,10 @@ packages: resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -10082,6 +10299,10 @@ packages: resolution: {integrity: sha512-TPbeg0b7ylrswdGCji8FRGFAKuqbpQlLbL8SOle3j1iHSs5Ob5mhvMAxWN2UItOjgALAB5Zp3fmMfj8mbWvXKw==} engines: {node: '>=10'} + shadcn@4.1.2: + resolution: {integrity: sha512-qNQcCavkbYsgBj+X09tF2bTcwRd8abR880bsFkDU2kMqceMCLAm5c+cLg7kWDhfh1H9g08knpQ5ZEf6y/co16g==} + hasBin: true + shallowequal@1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} @@ -10279,6 +10500,10 @@ packages: std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + storybook@10.2.0: resolution: {integrity: sha512-fIQnFtpksRRgHR1CO1onGX3djaog4qsW/c5U8arqYTkUEr2TaWpn05mIJDOBoPJFlOdqFrB4Ttv0PZJxV7avhw==} hasBin: true @@ -10321,6 +10546,10 @@ packages: stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + stringify-object@5.0.0: + resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==} + engines: {node: '>=14.16'} + strip-ansi@5.2.0: resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} engines: {node: '>=6'} @@ -10341,10 +10570,18 @@ packages: resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} engines: {node: '>=0.10.0'} + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -10663,6 +10900,9 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + ts-morph@26.0.0: + resolution: {integrity: sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==} + ts-pattern@5.9.0: resolution: {integrity: sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==} @@ -10840,6 +11080,10 @@ packages: resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} engines: {node: '>=4'} + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} @@ -10977,6 +11221,10 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + validate-npm-package-name@7.0.2: + resolution: {integrity: sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==} + engines: {node: ^20.17.0 || >=22.9.0} + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -11192,6 +11440,10 @@ packages: web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + web-tree-sitter@0.24.7: resolution: {integrity: sha512-CdC/TqVFbXqR+C51v38hv6wOPatKEUGxa39scAeFSm98wIhZxAYonhRQPSMmfZ2w7JDI0zQDdzdmgtNk06/krQ==} @@ -11261,6 +11513,11 @@ packages: engines: {node: '>= 8'} hasBin: true + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + which@5.0.0: resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} engines: {node: ^18.17.0 || >=20.5.0} @@ -11336,6 +11593,10 @@ packages: resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} engines: {node: '>=18'} + wsl-utils@0.3.1: + resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} + engines: {node: '>=20'} + xcode@3.0.1: resolution: {integrity: sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==} engines: {node: '>=10.0.0'} @@ -11404,10 +11665,18 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yocto-spinner@1.1.0: + resolution: {integrity: sha512-/BY0AUXnS7IKO354uLLA2eRcWiqDifEbd6unXCsOxkFDAkhgUL3PH9X2bFoaU0YchnDXsF+iKleeTLJGckbXfA==} + engines: {node: '>=18.19'} + yoctocolors-cjs@2.1.3: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + yoga-wasm-web@0.3.3: resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==} @@ -12491,8 +12760,25 @@ snapshots: '@preact/signals-core': 1.13.0 tslib: 2.8.1 + '@dotenvx/dotenvx@1.60.1': + dependencies: + commander: 11.1.0 + dotenv: 17.2.3 + eciesjs: 0.4.18 + execa: 5.1.1 + fdir: 6.5.0(picomatch@4.0.3) + ignore: 5.3.2 + object-treeify: 1.1.33 + picomatch: 4.0.3 + which: 4.0.0 + yocto-spinner: 1.1.0 + '@drizzle-team/brocli@0.10.2': {} + '@ecies/ciphers@0.2.6(@noble/ciphers@1.3.0)': + dependencies: + '@noble/ciphers': 1.3.0 + '@electron-forge/cli@7.11.1(encoding@0.1.13)(esbuild@0.25.12)': dependencies: '@electron-forge/core': 7.11.1(encoding@0.1.13)(esbuild@0.25.12) @@ -13636,7 +13922,6 @@ snapshots: '@inquirer/type': 3.0.10(@types/node@24.12.0) optionalDependencies: '@types/node': 24.12.0 - optional: true '@inquirer/confirm@5.1.21(@types/node@25.2.0)': dependencies: @@ -13657,7 +13942,6 @@ snapshots: yoctocolors-cjs: 2.1.3 optionalDependencies: '@types/node': 24.12.0 - optional: true '@inquirer/core@10.3.2(@types/node@25.2.0)': dependencies: @@ -13762,7 +14046,6 @@ snapshots: '@inquirer/type@3.0.10(@types/node@24.12.0)': optionalDependencies: '@types/node': 24.12.0 - optional: true '@inquirer/type@3.0.10(@types/node@25.2.0)': optionalDependencies: @@ -14356,6 +14639,28 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) + '@modelcontextprotocol/sdk@1.27.1(zod@3.25.76)': + dependencies: + '@hono/node-server': 1.19.9(hono@4.11.7) + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + content-type: 1.0.5 + cors: 2.8.6 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.6 + express: 5.2.1 + express-rate-limit: 8.3.1(express@5.2.1) + hono: 4.11.7 + jose: 6.2.1 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + transitivePeerDependencies: + - supports-color + '@modelcontextprotocol/sdk@1.27.1(zod@4.3.6)': dependencies: '@hono/node-server': 1.19.9(hono@4.11.7) @@ -14394,6 +14699,14 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true + '@noble/ciphers@1.3.0': {} + + '@noble/curves@1.9.7': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/hashes@1.8.0': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -15872,6 +16185,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.57.1': optional: true + '@sec-ant/readable-stream@0.4.1': {} + '@shikijs/core@3.23.0': dependencies: '@shikijs/types': 3.23.0 @@ -15922,6 +16237,8 @@ snapshots: '@sindresorhus/is@4.6.0': {} + '@sindresorhus/merge-streams@4.0.0': {} + '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 @@ -16362,6 +16679,12 @@ snapshots: react: 19.1.0 typescript: 5.9.3 + '@ts-morph/common@0.27.0': + dependencies: + fast-glob: 3.3.3 + minimatch: 10.1.2 + path-browserify: 1.0.1 + '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 @@ -16541,6 +16864,8 @@ snapshots: '@types/use-sync-external-store@0.0.6': {} + '@types/validate-npm-package-name@4.0.2': {} + '@types/wrap-ansi@3.0.0': {} '@types/yargs-parser@21.0.3': {} @@ -17350,6 +17675,8 @@ snapshots: call-me-maybe@1.0.2: {} + callsites@3.1.0: {} + camelcase-css@2.0.1: {} camelcase@5.3.1: {} @@ -17513,6 +17840,8 @@ snapshots: - '@types/react' - '@types/react-dom' + code-block-writer@13.0.3: {} + color-convert@0.5.3: optional: true @@ -17648,6 +17977,15 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 + cosmiconfig@9.0.1(typescript@5.9.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.9.3 + crelt@1.0.6: {} cross-dirname@0.1.0: {} @@ -17696,6 +18034,8 @@ snapshots: csstype@3.2.3: {} + data-uri-to-buffer@4.0.1: {} + data-urls@5.0.0: dependencies: whatwg-mimetype: 4.0.0 @@ -17731,6 +18071,8 @@ snapshots: dependencies: mimic-response: 3.1.0 + dedent@1.7.2: {} + deep-eql@5.0.2: {} deep-extend@0.6.0: {} @@ -17885,6 +18227,13 @@ snapshots: dependencies: safe-buffer: 5.2.1 + eciesjs@0.4.18: + dependencies: + '@ecies/ciphers': 0.2.6(@noble/ciphers@1.3.0) + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + ee-first@1.1.1: {} electron-installer-dmg@5.0.1: @@ -18180,6 +18529,18 @@ snapshots: signal-exit: 3.0.7 strip-eof: 1.0.0 + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + execa@8.0.1: dependencies: cross-spawn: 7.0.6 @@ -18192,6 +18553,21 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 + execa@9.6.1: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.3.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.2 + exif-parser@0.1.12: {} expand-template@2.0.3: {} @@ -18557,10 +18933,19 @@ snapshots: optionalDependencies: picomatch: 4.0.3 + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + fflate@0.4.8: {} fflate@0.8.2: {} + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + file-icon@6.0.0: dependencies: p-map: 7.0.4 @@ -18667,6 +19052,10 @@ snapshots: dependencies: fd-package-json: 2.0.0 + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + forwarded@0.2.0: {} framer-motion@12.31.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): @@ -18746,6 +19135,8 @@ snapshots: fuse.js@7.1.0: {} + fuzzysort@3.1.0: {} + fzf@0.5.2: {} galactus@1.0.0: @@ -18787,6 +19178,8 @@ snapshots: get-nonce@1.0.1: {} + get-own-enumerable-keys@1.0.0: {} + get-package-info@1.0.0: dependencies: bluebird: 3.7.2 @@ -18811,8 +19204,15 @@ snapshots: dependencies: pump: 3.0.3 + get-stream@6.0.1: {} + get-stream@8.0.1: {} + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + get-tsconfig@4.13.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -19127,8 +19527,12 @@ snapshots: transitivePeerDependencies: - supports-color + human-signals@2.1.0: {} + human-signals@5.0.0: {} + human-signals@8.0.1: {} + humanize-ms@1.2.1: dependencies: ms: 2.1.3 @@ -19170,6 +19574,11 @@ snapshots: immer@11.1.3: {} + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + imul@1.0.1: optional: true @@ -19251,12 +19660,16 @@ snapshots: is-hexadecimal@2.0.1: {} + is-in-ssh@1.0.0: {} + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 is-interactive@1.0.0: {} + is-interactive@2.0.0: {} + is-lambda@1.0.1: {} is-my-ip-valid@1.0.1: @@ -19275,6 +19688,8 @@ snapshots: is-number@7.0.0: {} + is-obj@3.0.0: {} + is-plain-obj@2.1.0: {} is-plain-obj@4.1.0: {} @@ -19286,12 +19701,22 @@ snapshots: is-property@1.0.2: optional: true + is-regexp@3.1.0: {} + is-stream@1.1.0: {} + is-stream@2.0.1: {} + is-stream@3.0.0: {} + is-stream@4.0.1: {} + is-unicode-supported@0.1.0: {} + is-unicode-supported@1.3.0: {} + + is-unicode-supported@2.1.0: {} + is-what@5.5.0: {} is-wsl@2.2.0: @@ -19578,6 +20003,8 @@ snapshots: kleur@3.0.3: {} + kleur@4.1.5: {} + knip@5.83.0(@types/node@25.2.0)(typescript@5.9.3): dependencies: '@nodelib/fs.walk': 1.2.8 @@ -19847,6 +20274,11 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 + log-symbols@6.0.0: + dependencies: + chalk: 5.6.2 + is-unicode-supported: 1.3.0 + log-update@5.0.1: dependencies: ansi-escapes: 5.0.0 @@ -20707,7 +21139,6 @@ snapshots: typescript: 5.9.3 transitivePeerDependencies: - '@types/node' - optional: true msw@2.12.8(@types/node@25.2.0)(typescript@5.9.3): dependencies: @@ -20800,12 +21231,20 @@ snapshots: dependencies: semver: 7.7.3 + node-domexception@1.0.0: {} + node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 optionalDependencies: encoding: 0.1.13 + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + node-forge@1.3.3: {} node-gyp@11.5.0: @@ -20863,10 +21302,19 @@ snapshots: dependencies: path-key: 2.0.1 + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + nth-check@2.1.1: dependencies: boolbase: 1.0.0 @@ -20888,6 +21336,8 @@ snapshots: object-keys@1.1.1: optional: true + object-treeify@1.1.33: {} + obug@2.1.1: {} omggif@1.0.10: {} @@ -20937,6 +21387,15 @@ snapshots: is-inside-container: 1.0.0 wsl-utils: 0.1.0 + open@11.0.0: + dependencies: + default-browser: 5.5.0 + define-lazy-prop: 3.0.0 + is-in-ssh: 1.0.0 + is-inside-container: 1.0.0 + powershell-utils: 0.1.0 + wsl-utils: 0.3.1 + open@7.4.2: dependencies: is-docker: 2.2.1 @@ -20975,6 +21434,18 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 + ora@8.2.0: + dependencies: + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.2.0 + strip-ansi: 7.1.2 + orderedmap@2.1.1: {} os-tmpdir@1.0.2: {} @@ -21050,6 +21521,10 @@ snapshots: pako@1.0.11: {} + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + parse-author@2.0.0: dependencies: author-regex: 1.0.0 @@ -21082,6 +21557,15 @@ snapshots: dependencies: error-ex: 1.3.4 + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.29.0 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-ms@4.0.0: {} + parse-png@2.1.0: dependencies: pngjs: 3.4.0 @@ -21104,6 +21588,8 @@ snapshots: transitivePeerDependencies: - supports-color + path-browserify@1.0.1: {} + path-exists@3.0.0: {} path-exists@4.0.0: {} @@ -21258,6 +21744,11 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 + postcss-selector-parser@7.1.1: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + postcss-value-parser@4.2.0: {} postcss@8.4.49: @@ -21309,6 +21800,8 @@ snapshots: dependencies: commander: 9.5.0 + powershell-utils@0.1.0: {} + preact@10.28.3: {} prebuild-install@7.1.3: @@ -21346,6 +21839,10 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 + pretty-ms@9.3.0: + dependencies: + parse-ms: 4.0.0 + proc-log@2.0.1: {} proc-log@4.2.0: {} @@ -22046,6 +22543,8 @@ snapshots: resolve-alpn@1.2.1: {} + resolve-from@4.0.0: {} + resolve-from@5.0.0: {} resolve-global@1.0.0: @@ -22278,6 +22777,49 @@ snapshots: sf-symbols-typescript@2.2.0: {} + shadcn@4.1.2(@types/node@24.12.0)(typescript@5.9.3): + dependencies: + '@babel/core': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0) + '@babel/preset-typescript': 7.28.5(@babel/core@7.29.0) + '@dotenvx/dotenvx': 1.60.1 + '@modelcontextprotocol/sdk': 1.27.1(zod@3.25.76) + '@types/validate-npm-package-name': 4.0.2 + browserslist: 4.28.1 + commander: 14.0.3 + cosmiconfig: 9.0.1(typescript@5.9.3) + dedent: 1.7.2 + deepmerge: 4.3.1 + diff: 8.0.3 + execa: 9.6.1 + fast-glob: 3.3.3 + fs-extra: 11.3.3 + fuzzysort: 3.1.0 + https-proxy-agent: 7.0.6 + kleur: 4.1.5 + msw: 2.12.8(@types/node@24.12.0)(typescript@5.9.3) + node-fetch: 3.3.2 + open: 11.0.0 + ora: 8.2.0 + postcss: 8.5.6 + postcss-selector-parser: 7.1.1 + prompts: 2.4.2 + recast: 0.23.11 + stringify-object: 5.0.0 + tailwind-merge: 3.5.0 + ts-morph: 26.0.0 + tsconfig-paths: 4.2.0 + validate-npm-package-name: 7.0.2 + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + transitivePeerDependencies: + - '@cfworker/json-schema' + - '@types/node' + - babel-plugin-macros + - supports-color + - typescript + shallowequal@1.1.0: {} shebang-command@1.2.0: @@ -22481,6 +23023,8 @@ snapshots: std-env@3.10.0: {} + stdin-discarder@0.2.2: {} + storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@storybook/global': 5.0.0 @@ -22539,6 +23083,12 @@ snapshots: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 + stringify-object@5.0.0: + dependencies: + get-own-enumerable-keys: 1.0.0 + is-obj: 3.0.0 + is-regexp: 3.1.0 + strip-ansi@5.2.0: dependencies: ansi-regex: 4.1.1 @@ -22555,8 +23105,12 @@ snapshots: strip-eof@1.0.0: {} + strip-final-newline@2.0.0: {} + strip-final-newline@3.0.0: {} + strip-final-newline@4.0.0: {} + strip-indent@3.0.0: dependencies: min-indent: 1.0.1 @@ -22866,6 +23420,11 @@ snapshots: ts-interface-checker@0.1.13: {} + ts-morph@26.0.0: + dependencies: + '@ts-morph/common': 0.27.0 + code-block-writer: 13.0.3 + ts-pattern@5.9.0: {} ts-toolbelt@9.6.0: {} @@ -23021,6 +23580,8 @@ snapshots: unicode-property-aliases-ecmascript@2.2.0: {} + unicorn-magic@0.3.0: {} + unified@11.0.5: dependencies: '@types/unist': 3.0.3 @@ -23155,6 +23716,8 @@ snapshots: validate-npm-package-name@5.0.1: {} + validate-npm-package-name@7.0.2: {} + vary@1.1.2: {} vaul@1.1.2(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): @@ -23415,6 +23978,8 @@ snapshots: web-namespaces@2.0.1: {} + web-streams-polyfill@3.3.3: {} + web-tree-sitter@0.24.7: {} web-vitals@5.1.0: {} @@ -23495,6 +24060,10 @@ snapshots: dependencies: isexe: 2.0.0 + which@4.0.0: + dependencies: + isexe: 3.1.1 + which@5.0.0: dependencies: isexe: 3.1.1 @@ -23549,6 +24118,11 @@ snapshots: dependencies: is-wsl: 3.1.0 + wsl-utils@0.3.1: + dependencies: + is-wsl: 3.1.0 + powershell-utils: 0.1.0 + xcode@3.0.1: dependencies: simple-plist: 1.3.1 @@ -23606,10 +24180,20 @@ snapshots: yocto-queue@0.1.0: {} + yocto-spinner@1.1.0: + dependencies: + yoctocolors: 2.1.2 + yoctocolors-cjs@2.1.3: {} + yoctocolors@2.1.2: {} + yoga-wasm-web@0.3.3: {} + zod-to-json-schema@3.25.1(zod@3.25.76): + dependencies: + zod: 3.25.76 + zod-to-json-schema@3.25.1(zod@4.3.6): dependencies: zod: 4.3.6 From 17bac2ea2be3314f1be61914321f24720f464480 Mon Sep 17 00:00:00 2001 From: Adam Leith Date: Fri, 10 Apr 2026 12:12:13 +0100 Subject: [PATCH 02/10] small change --- apps/code/src/renderer/components/ui/KeyHint.tsx | 7 ++++--- .../renderer/features/sidebar/components/SidebarItem.tsx | 4 +--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/apps/code/src/renderer/components/ui/KeyHint.tsx b/apps/code/src/renderer/components/ui/KeyHint.tsx index e6ee2cbac..60079a066 100644 --- a/apps/code/src/renderer/components/ui/KeyHint.tsx +++ b/apps/code/src/renderer/components/ui/KeyHint.tsx @@ -1,3 +1,4 @@ +import { Kbd } from "@posthog/quill-primitives"; import type React from "react"; interface KeyHintProps { @@ -7,7 +8,7 @@ interface KeyHintProps { export function KeyHint({ children, style }: KeyHintProps) { return ( - - {children} - + {children as string} + ); } diff --git a/apps/code/src/renderer/features/sidebar/components/SidebarItem.tsx b/apps/code/src/renderer/features/sidebar/components/SidebarItem.tsx index 9144fa945..b0c7d44d0 100644 --- a/apps/code/src/renderer/features/sidebar/components/SidebarItem.tsx +++ b/apps/code/src/renderer/features/sidebar/components/SidebarItem.tsx @@ -40,9 +40,7 @@ export function SidebarItem({ variant={variant} className={cn( "group focus-visible:-outline-offset-2 flex w-full text-left transition-colors focus-visible:outline-2 focus-visible:outline-accent-8", - variant === "primary" - ? "data-active:opacity-50" - : "data-active:bg-fill-active", + variant === "primary" && "data-active:opacity-50", )} data-active={isActive || undefined} draggable={draggable} From f83e53e08defa318e4a66503935eee023ba1bba1 Mon Sep 17 00:00:00 2001 From: Adam Leith Date: Fri, 10 Apr 2026 12:31:05 +0100 Subject: [PATCH 03/10] fix sidebar item active --- .../renderer/features/sidebar/components/SidebarItem.tsx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/apps/code/src/renderer/features/sidebar/components/SidebarItem.tsx b/apps/code/src/renderer/features/sidebar/components/SidebarItem.tsx index b0c7d44d0..6ac9a8c62 100644 --- a/apps/code/src/renderer/features/sidebar/components/SidebarItem.tsx +++ b/apps/code/src/renderer/features/sidebar/components/SidebarItem.tsx @@ -40,9 +40,10 @@ export function SidebarItem({ variant={variant} className={cn( "group focus-visible:-outline-offset-2 flex w-full text-left transition-colors focus-visible:outline-2 focus-visible:outline-accent-8", - variant === "primary" && "data-active:opacity-50", + "data-active:bg-fill-active", + variant === "primary" && "data-active:bg-secondary/70", )} - data-active={isActive || undefined} + data-active={isActive} draggable={draggable} onDragStart={onDragStart} style={{ @@ -55,9 +56,7 @@ export function SidebarItem({ {icon ? {icon} : null} - + {label} {endContent} From 4d0371ff18bcb8f29196a68159d58f9a81e77eaf Mon Sep 17 00:00:00 2001 From: Adam Leith Date: Fri, 10 Apr 2026 23:07:28 +0100 Subject: [PATCH 04/10] quill update --- apps/code/package.json | 5 +- .../src/renderer/components/ui/KeyHint.tsx | 2 +- .../sidebar/components/ProjectSwitcher.tsx | 2 +- .../sidebar/components/SidebarItem.tsx | 2 +- .../sidebar/components/TaskListView.tsx | 2 +- .../sidebar/components/items/HomeItem.tsx | 2 +- apps/code/src/renderer/styles/quill.css | 106 +----------------- pnpm-lock.yaml | 17 +-- 8 files changed, 16 insertions(+), 122 deletions(-) diff --git a/apps/code/package.json b/apps/code/package.json index 2d3a32447..c5cc698aa 100644 --- a/apps/code/package.json +++ b/apps/code/package.json @@ -130,10 +130,7 @@ "@posthog/electron-trpc": "workspace:*", "@posthog/git": "workspace:*", "@posthog/hedgehog-mode": "^0.0.48", - "@posthog/quill-blocks": "link:/Users/adamleithp/Dev/posthog/packages/quill/packages/blocks", - "@posthog/quill-components": "link:/Users/adamleithp/Dev/posthog/packages/quill/packages/components", - "@posthog/quill-primitives": "link:/Users/adamleithp/Dev/posthog/packages/quill/packages/primitives", - "@posthog/quill-tokens": "link:/Users/adamleithp/Dev/posthog/packages/quill/packages/tokens", + "@posthog/quill": "link:/Users/adamleithp/Dev/posthog/packages/quill/packages/quill", "@posthog/shared": "workspace:*", "@radix-ui/react-collapsible": "^1.1.12", "@radix-ui/react-icons": "^1.3.2", diff --git a/apps/code/src/renderer/components/ui/KeyHint.tsx b/apps/code/src/renderer/components/ui/KeyHint.tsx index 60079a066..4c5cb068b 100644 --- a/apps/code/src/renderer/components/ui/KeyHint.tsx +++ b/apps/code/src/renderer/components/ui/KeyHint.tsx @@ -1,4 +1,4 @@ -import { Kbd } from "@posthog/quill-primitives"; +import { Kbd } from "@posthog/quill"; import type React from "react"; interface KeyHintProps { diff --git a/apps/code/src/renderer/features/sidebar/components/ProjectSwitcher.tsx b/apps/code/src/renderer/features/sidebar/components/ProjectSwitcher.tsx index 09b09596c..ad1542982 100644 --- a/apps/code/src/renderer/features/sidebar/components/ProjectSwitcher.tsx +++ b/apps/code/src/renderer/features/sidebar/components/ProjectSwitcher.tsx @@ -40,7 +40,7 @@ import { ItemDescription, ItemTitle, Kbd, -} from "@posthog/quill-primitives"; +} from "@posthog/quill"; import { ChevronRightIcon } from "lucide-react"; export function ProjectSwitcher() { diff --git a/apps/code/src/renderer/features/sidebar/components/SidebarItem.tsx b/apps/code/src/renderer/features/sidebar/components/SidebarItem.tsx index 6ac9a8c62..03be80f12 100644 --- a/apps/code/src/renderer/features/sidebar/components/SidebarItem.tsx +++ b/apps/code/src/renderer/features/sidebar/components/SidebarItem.tsx @@ -1,4 +1,4 @@ -import { Button, type ButtonProps, cn } from "@posthog/quill-primitives"; +import { Button, type ButtonProps, cn } from "@posthog/quill"; import type { SidebarItemAction } from "../types"; const INDENT_SIZE = 8; diff --git a/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx b/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx index 7a55bcb1b..591276239 100644 --- a/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx +++ b/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx @@ -13,7 +13,7 @@ import { User, Users, } from "@phosphor-icons/react"; -import { MenuLabel } from "@posthog/quill-primitives"; +import { MenuLabel } from "@posthog/quill"; import { Box, Flex, Popover, Text } from "@radix-ui/themes"; import { useWorkspace } from "@renderer/features/workspace/hooks/useWorkspace"; import { normalizeRepoKey } from "@shared/utils/repo"; diff --git a/apps/code/src/renderer/features/sidebar/components/items/HomeItem.tsx b/apps/code/src/renderer/features/sidebar/components/items/HomeItem.tsx index 3f9e2f78e..77abd7b17 100644 --- a/apps/code/src/renderer/features/sidebar/components/items/HomeItem.tsx +++ b/apps/code/src/renderer/features/sidebar/components/items/HomeItem.tsx @@ -1,6 +1,6 @@ import { Tooltip } from "@components/ui/Tooltip"; import { EnvelopeSimple, Plus } from "@phosphor-icons/react"; -import type { ButtonProps } from "@posthog/quill-primitives"; +import type { ButtonProps } from "@posthog/quill"; import { Badge } from "@radix-ui/themes"; import { formatHotkey, diff --git a/apps/code/src/renderer/styles/quill.css b/apps/code/src/renderer/styles/quill.css index 564bca43b..4d37b960e 100644 --- a/apps/code/src/renderer/styles/quill.css +++ b/apps/code/src/renderer/styles/quill.css @@ -1,105 +1,11 @@ /* * Quill Design System integration * - * Imports quill's color tokens as CSS custom properties and maps them - * to Tailwind theme colors so quill component classes (bg-primary, - * text-muted-foreground, etc.) generate correctly. + * Single pre-compiled stylesheet from @posthog/quill — contains color tokens + * (light + dark), the @theme inline mappings, font sizes / line heights / + * radii / shadows, and every utility class used by quill components. * - * Only color mappings are imported — spacing, fonts, shadows, and radius - * are intentionally omitted to avoid overriding the app's existing theme. + * Nothing else is needed on the consumer side: no @source directives, no + * tw-animate-css, no shadcn/tailwind.css. See PostHog/posthog#54137. */ - -/* CSS custom properties for quill colors (light + dark via :root / .dark) */ -@import "@posthog/quill-tokens/color-system.css"; - -/* Animations and CSS resets used by quill primitives */ -@import "tw-animate-css"; -@import "shadcn/tailwind.css"; - -/* Register quill color tokens as Tailwind theme values (inline = no CSS output) */ -@theme inline { - --color-background: var(--background); - --color-foreground: var(--foreground); - --color-card: var(--card); - --color-card-foreground: var(--card-foreground); - --color-popover: var(--popover); - --color-popover-foreground: var(--popover-foreground); - --color-primary: var(--primary); - --color-primary-foreground: var(--primary-foreground); - --color-secondary: var(--secondary); - --color-secondary-foreground: var(--secondary-foreground); - --color-muted: var(--muted); - --color-muted-foreground: var(--muted-foreground); - --color-destructive: var(--destructive); - --color-destructive-foreground: var(--destructive-foreground); - --color-success: var(--success); - --color-success-foreground: var(--success-foreground); - --color-warning: var(--warning); - --color-warning-foreground: var(--warning-foreground); - --color-info: var(--info); - --color-info-foreground: var(--info-foreground); - --color-border: var(--border); - --color-input: var(--input); - --color-ring: var(--ring); - --color-fill-hover: var(--fill-hover); - --color-fill-active: var(--fill-active); - --color-fill-expanded: var(--fill-expanded); - --color-fill-selected: var(--fill-selected); - - /* Quill font sizes — rem() uses 16px base (rem = px / 16) and matches fontSize in source of truth. - * See: export const fontSize = { - * xxs: [rem(10), { lineHeight: rem(12) }], // 0.625rem (10px), 0.75rem (12px) - * xs: [rem(12), { lineHeight: rem(16) }], // 0.75rem (12px), 1rem (16px) - * sm: [rem(14), { lineHeight: rem(20) }], // 0.875rem (14px), 1.25rem (20px) - * base:[rem(16), { lineHeight: rem(24) }], // 1rem (16px), 1.5rem (24px) - * lg: [rem(18), { lineHeight: rem(28) }], // 1.125rem (18px), 1.75rem (28px) - * xl: [rem(20), { lineHeight: rem(28) }], // 1.25rem (20px), 1.75rem (28px) - * '2xl':[rem(24), { lineHeight: rem(32) }], // 1.5rem (24px), 2rem (32px) - * } - */ - - --text-xxs: 0.625rem; /* 10px */ - --text-xxs--line-height: 0.75rem; /* 12px */ - --text-xs: 0.75rem; /* 12px */ - --text-xs--line-height: 1rem; /* 16px */ - --text-sm: 0.875rem; /* 14px */ - --text-sm--line-height: 1.25rem; /* 20px */ - --text-base: 1rem; /* 16px */ - --text-base--line-height: 1.5rem; /* 24px */ - --text-lg: 1.125rem; /* 18px */ - --text-lg--line-height: 1.75rem; /* 28px */ - --text-xl: 1.25rem; /* 20px */ - --text-xl--line-height: 1.75rem; /* 28px */ - --text-2xl: 1.5rem; /* 24px */ - --text-2xl--line-height: 2rem; /* 32px */ - - /* Quill line heights — the Radix preset replaces default lineHeight - * (tight/snug/normal/relaxed) with numbered scales (1-9). */ - --leading-tight: 1.25; - --leading-snug: 1.375; - --leading-normal: 1.5; - --leading-relaxed: 1.625; - --leading-loose: 2; - - /* Quill radius — uses --radius base from color-system.css. - * The Radix preset replaces default borderRadius (sm/md/lg) with - * numbered scales (1-6), so quill components need these re-added. */ - --radius-sm: calc(var(--radius) - 4px); - --radius-md: calc(var(--radius) - 2px); - --radius-lg: var(--radius); - --radius-xl: calc(var(--radius) + 4px); - --radius-2xl: calc(var(--radius) + 8px); - --radius-3xl: calc(var(--radius) + 12px); - --radius-4xl: calc(var(--radius) + 16px); - - /* Quill shadows — the Radix preset replaces default shadows (sm/md/lg) - * with numbered scales (1-6), so quill components need these re-added. */ - --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.3); - --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -2px rgba(0, 0, 0, 0.3); - --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.3), 0 4px 6px -4px rgba(0, 0, 0, 0.3); -} - -/* Scan quill package dist files so Tailwind generates their utility classes */ -@source "../../../node_modules/@posthog/quill-primitives/dist/"; -@source "../../../node_modules/@posthog/quill-components/dist/"; -@source "../../../node_modules/@posthog/quill-blocks/dist/"; +@import "@posthog/quill/styles.css"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a433fab1f..ffbb2ccda 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -169,18 +169,9 @@ importers: '@posthog/hedgehog-mode': specifier: ^0.0.48 version: 0.0.48(prop-types@15.8.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@posthog/quill-blocks': - specifier: link:/Users/adamleithp/Dev/posthog/packages/quill/packages/blocks - version: link:../../../posthog/packages/quill/packages/blocks - '@posthog/quill-components': - specifier: link:/Users/adamleithp/Dev/posthog/packages/quill/packages/components - version: link:../../../posthog/packages/quill/packages/components - '@posthog/quill-primitives': - specifier: link:/Users/adamleithp/Dev/posthog/packages/quill/packages/primitives - version: link:../../../posthog/packages/quill/packages/primitives - '@posthog/quill-tokens': - specifier: link:/Users/adamleithp/Dev/posthog/packages/quill/packages/tokens - version: link:../../../posthog/packages/quill/packages/tokens + '@posthog/quill': + specifier: link:/Users/adamleithp/Dev/posthog/packages/quill/packages/quill + version: link:../../../posthog/packages/quill/packages/quill '@posthog/shared': specifier: workspace:* version: link:../../packages/shared @@ -21607,7 +21598,7 @@ snapshots: path-scurry@1.11.1: dependencies: lru-cache: 10.4.3 - minipass: 7.1.2 + minipass: 7.1.3 path-scurry@2.0.1: dependencies: From 9da6257125cc1dba6cf4cd20eed06f6ad0a54975 Mon Sep 17 00:00:00 2001 From: Adam Leith Date: Sat, 11 Apr 2026 00:20:37 +0100 Subject: [PATCH 05/10] quill update again --- .../sidebar/components/SidebarItem.tsx | 8 ++----- .../sidebar/components/items/HomeItem.tsx | 1 - apps/code/src/renderer/styles/globals.css | 2 +- apps/code/src/renderer/styles/quill.css | 16 +++++++++----- pnpm-lock.yaml | 21 +++++++++---------- 5 files changed, 24 insertions(+), 24 deletions(-) diff --git a/apps/code/src/renderer/features/sidebar/components/SidebarItem.tsx b/apps/code/src/renderer/features/sidebar/components/SidebarItem.tsx index 03be80f12..59bc0edef 100644 --- a/apps/code/src/renderer/features/sidebar/components/SidebarItem.tsx +++ b/apps/code/src/renderer/features/sidebar/components/SidebarItem.tsx @@ -1,4 +1,4 @@ -import { Button, type ButtonProps, cn } from "@posthog/quill"; +import { Button, cn } from "@posthog/quill"; import type { SidebarItemAction } from "../types"; const INDENT_SIZE = 8; @@ -17,7 +17,6 @@ interface SidebarItemProps { onContextMenu?: (e: React.MouseEvent) => void; action?: SidebarItemAction; endContent?: React.ReactNode; - variant?: ButtonProps["variant"]; } export function SidebarItem({ @@ -32,18 +31,15 @@ export function SidebarItem({ onDoubleClick, onContextMenu, endContent, - variant = "default", }: SidebarItemProps) { return ( - - + + + + } + /> + - - - - Organize - - - - - - + Organize + + setOrganizeMode(value as typeof organizeMode) + } + > + + By project + + + Chronological list + + -
+ - - - Sort by - - - - - - + Sort by + setSortMode(value as typeof sortMode)} + > + Created + Updated + - {import.meta.env.DEV && ( - <> -
+ {import.meta.env.DEV && ( + <> + - - - Show - - - - - - - - )} - - - + Show + setShowAllUsers(value === "all")} + > + + My tasks + + + All tasks + + + + )} + + ); } diff --git a/apps/code/src/renderer/styles/globals.css b/apps/code/src/renderer/styles/globals.css index 328d7492d..0bd95683a 100644 --- a/apps/code/src/renderer/styles/globals.css +++ b/apps/code/src/renderer/styles/globals.css @@ -1,4 +1,4 @@ -@layer theme, base, radix, components, utilities; +@layer theme, base, quill, radix, components, utilities; @import "@radix-ui/themes/styles.css" layer(radix); @import "tailwindcss"; @import "./quill.css"; diff --git a/apps/code/src/renderer/styles/quill.css b/apps/code/src/renderer/styles/quill.css index 4acd4e3a8..51cf5e94e 100644 --- a/apps/code/src/renderer/styles/quill.css +++ b/apps/code/src/renderer/styles/quill.css @@ -5,13 +5,23 @@ * font sizes / leading / radii / shadows, and every utility class used * by quill components. No consumer Tailwind setup needed for this part. * + * Imported into `layer(quill)` so that Quill's utility classes land + * *below* our own `@layer utilities` in the cascade. Without this, + * Quill's pre-compiled `.px-2` (loaded after our Tailwind output) + * would beat our own `.pr-0` from later source order, even though + * tailwind-merge emits both classes correctly. The layer ordering is + * declared in globals.css: `theme, base, radix, quill, components, + * utilities` — anything we author always wins over a Quill primitive's + * internal class. + * * - theme.css: opt-in @theme inline block — registers quill's design * tokens with our own Tailwind v4 instance so that authoring utilities * like `bg-fill-active`, `text-muted-foreground`, or `data-active:bg-secondary` * in our own components actually compiles. Without this our Tailwind * has no idea `--color-fill-active` exists and silently drops the class. + * NOT layered — `@theme` is compile-time metadata, not cascade output. * * See PostHog/posthog#54137. */ -@import "@posthog/quill/styles.css"; +@import "@posthog/quill/styles.css" layer(quill); @import "@posthog/quill/theme.css"; From b7316163c05a9861da5454cce0f1937badcf1cdf Mon Sep 17 00:00:00 2001 From: Adam Leith Date: Sun, 12 Apr 2026 23:13:59 +0100 Subject: [PATCH 08/10] sidebar section now using quill button --- .../features/sidebar/components/SidebarSection.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/code/src/renderer/features/sidebar/components/SidebarSection.tsx b/apps/code/src/renderer/features/sidebar/components/SidebarSection.tsx index a896abe35..5ad90433b 100644 --- a/apps/code/src/renderer/features/sidebar/components/SidebarSection.tsx +++ b/apps/code/src/renderer/features/sidebar/components/SidebarSection.tsx @@ -1,5 +1,6 @@ import { Tooltip } from "@components/ui/Tooltip"; import { CaretDownIcon, CaretRightIcon, Plus } from "@phosphor-icons/react"; +import { Button } from "@posthog/quill"; import * as Collapsible from "@radix-ui/react-collapsible"; import { useState } from "react"; @@ -36,13 +37,12 @@ export function SidebarSection({ return ( - + {children} From 50b70df64b08206b060f426d198bf89b3fd9615b Mon Sep 17 00:00:00 2001 From: Adam Leith Date: Wed, 15 Apr 2026 10:12:25 +0100 Subject: [PATCH 09/10] looking good --- apps/code/package.json | 3 +- .../sidebar/components/SidebarItem.tsx | 5 +- .../sidebar/components/SidebarMenu.tsx | 14 +++--- .../sidebar/components/TaskListView.tsx | 5 +- apps/code/src/renderer/styles/globals.css | 49 ++++++++++++++++++- apps/code/src/renderer/styles/quill.css | 27 ---------- pnpm-lock.yaml | 28 +++++------ 7 files changed, 70 insertions(+), 61 deletions(-) delete mode 100644 apps/code/src/renderer/styles/quill.css diff --git a/apps/code/package.json b/apps/code/package.json index ea8279465..d250aaaa1 100644 --- a/apps/code/package.json +++ b/apps/code/package.json @@ -130,8 +130,7 @@ "@posthog/electron-trpc": "workspace:*", "@posthog/git": "workspace:*", "@posthog/hedgehog-mode": "^0.0.48", - "@posthog/quill": "0.1.0-alpha.0", - "@posthog/quill-tokens": "0.1.0-alpha.0", + "@posthog/quill": "0.1.0-alpha.6", "@posthog/shared": "workspace:*", "@radix-ui/react-collapsible": "^1.1.12", "@radix-ui/react-icons": "^1.3.2", diff --git a/apps/code/src/renderer/features/sidebar/components/SidebarItem.tsx b/apps/code/src/renderer/features/sidebar/components/SidebarItem.tsx index 59bc0edef..fb1d79088 100644 --- a/apps/code/src/renderer/features/sidebar/components/SidebarItem.tsx +++ b/apps/code/src/renderer/features/sidebar/components/SidebarItem.tsx @@ -17,6 +17,7 @@ interface SidebarItemProps { onContextMenu?: (e: React.MouseEvent) => void; action?: SidebarItemAction; endContent?: React.ReactNode; + disabled?: boolean; } export function SidebarItem({ @@ -31,13 +32,14 @@ export function SidebarItem({ onDoubleClick, onContextMenu, endContent, + disabled, }: SidebarItemProps) { return (