Dominic Elm commited on
Commit
fcfef74
·
unverified ·
1 Parent(s): f55b4e5

feat: add file tree breadcrumb (#40)

Browse files
packages/bolt/app/components/chat/CodeBlock.tsx CHANGED
@@ -2,6 +2,7 @@ import { memo, useEffect, useState } from 'react';
2
  import { bundledLanguages, codeToHtml, isSpecialLang, type BundledLanguage, type SpecialLanguage } from 'shiki';
3
  import { classNames } from '~/utils/classNames';
4
  import { createScopedLogger } from '~/utils/logger';
 
5
  import styles from './CodeBlock.module.scss';
6
 
7
  const logger = createScopedLogger('CodeBlock');
 
2
  import { bundledLanguages, codeToHtml, isSpecialLang, type BundledLanguage, type SpecialLanguage } from 'shiki';
3
  import { classNames } from '~/utils/classNames';
4
  import { createScopedLogger } from '~/utils/logger';
5
+
6
  import styles from './CodeBlock.module.scss';
7
 
8
  const logger = createScopedLogger('CodeBlock');
packages/bolt/app/components/workbench/EditorPanel.tsx CHANGED
@@ -20,6 +20,7 @@ import { classNames } from '~/utils/classNames';
20
  import { WORK_DIR } from '~/utils/constants';
21
  import { renderLogger } from '~/utils/logger';
22
  import { isMobile } from '~/utils/mobile';
 
23
  import { FileTree } from './FileTree';
24
  import { Terminal, type TerminalRef } from './terminal/Terminal';
25
 
@@ -67,12 +68,12 @@ export const EditorPanel = memo(
67
  const [activeTerminal, setActiveTerminal] = useState(0);
68
  const [terminalCount, setTerminalCount] = useState(1);
69
 
70
- const activeFile = useMemo(() => {
71
  if (!editorDocument) {
72
- return '';
73
  }
74
 
75
- return editorDocument.filePath.split('/').at(-1);
76
  }, [editorDocument]);
77
 
78
  const activeFileUnsaved = useMemo(() => {
@@ -134,6 +135,7 @@ export const EditorPanel = memo(
134
  <FileTree
135
  className="h-full"
136
  files={files}
 
137
  unsavedFiles={unsavedFiles}
138
  rootFolder={WORK_DIR}
139
  selectedFile={selectedFile}
@@ -143,11 +145,10 @@ export const EditorPanel = memo(
143
  </Panel>
144
  <PanelResizeHandle />
145
  <Panel className="flex flex-col" defaultSize={80} minSize={20}>
146
- <PanelHeader>
147
- {activeFile && (
148
  <div className="flex items-center flex-1 text-sm">
149
- <div className="i-ph:file-duotone mr-2" />
150
- {activeFile}
151
  {activeFileUnsaved && (
152
  <div className="flex gap-1 ml-auto -mr-1.5">
153
  <PanelHeaderButton onClick={onFileSave}>
 
20
  import { WORK_DIR } from '~/utils/constants';
21
  import { renderLogger } from '~/utils/logger';
22
  import { isMobile } from '~/utils/mobile';
23
+ import { FileBreadcrumb } from './FileBreadcrumb';
24
  import { FileTree } from './FileTree';
25
  import { Terminal, type TerminalRef } from './terminal/Terminal';
26
 
 
68
  const [activeTerminal, setActiveTerminal] = useState(0);
69
  const [terminalCount, setTerminalCount] = useState(1);
70
 
71
+ const activeFileSegments = useMemo(() => {
72
  if (!editorDocument) {
73
+ return undefined;
74
  }
75
 
76
+ return editorDocument.filePath.split('/');
77
  }, [editorDocument]);
78
 
79
  const activeFileUnsaved = useMemo(() => {
 
135
  <FileTree
136
  className="h-full"
137
  files={files}
138
+ hideRoot
139
  unsavedFiles={unsavedFiles}
140
  rootFolder={WORK_DIR}
141
  selectedFile={selectedFile}
 
145
  </Panel>
146
  <PanelResizeHandle />
147
  <Panel className="flex flex-col" defaultSize={80} minSize={20}>
148
+ <PanelHeader className="overflow-x-auto">
149
+ {activeFileSegments?.length && (
150
  <div className="flex items-center flex-1 text-sm">
151
+ <FileBreadcrumb pathSegments={activeFileSegments} files={files} onFileSelect={onFileSelect} />
 
152
  {activeFileUnsaved && (
153
  <div className="flex gap-1 ml-auto -mr-1.5">
154
  <PanelHeaderButton onClick={onFileSave}>
packages/bolt/app/components/workbench/FileBreadcrumb.tsx ADDED
@@ -0,0 +1,148 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import * as DropdownMenu from '@radix-ui/react-dropdown-menu';
2
+ import { AnimatePresence, motion, type Variants } from 'framer-motion';
3
+ import { memo, useEffect, useRef, useState } from 'react';
4
+ import type { FileMap } from '~/lib/stores/files';
5
+ import { classNames } from '~/utils/classNames';
6
+ import { WORK_DIR } from '~/utils/constants';
7
+ import { cubicEasingFn } from '~/utils/easings';
8
+ import { renderLogger } from '~/utils/logger';
9
+ import FileTree from './FileTree';
10
+
11
+ const WORK_DIR_REGEX = new RegExp(`^${WORK_DIR.split('/').slice(0, -1).join('/').replaceAll('/', '\\/')}/`);
12
+
13
+ interface FileBreadcrumbProps {
14
+ files?: FileMap;
15
+ pathSegments?: string[];
16
+ onFileSelect?: (filePath: string) => void;
17
+ }
18
+
19
+ const contextMenuVariants = {
20
+ open: {
21
+ y: 0,
22
+ opacity: 1,
23
+ transition: {
24
+ duration: 0.15,
25
+ ease: cubicEasingFn,
26
+ },
27
+ },
28
+ close: {
29
+ y: 6,
30
+ opacity: 0,
31
+ transition: {
32
+ duration: 0.15,
33
+ ease: cubicEasingFn,
34
+ },
35
+ },
36
+ } satisfies Variants;
37
+
38
+ export const FileBreadcrumb = memo<FileBreadcrumbProps>(({ files, pathSegments = [], onFileSelect }) => {
39
+ renderLogger.trace('FileBreadcrumb');
40
+
41
+ const [activeIndex, setActiveIndex] = useState<number | null>(null);
42
+
43
+ const contextMenuRef = useRef<HTMLDivElement | null>(null);
44
+ const segmentRefs = useRef<(HTMLSpanElement | null)[]>([]);
45
+
46
+ const handleSegmentClick = (index: number) => {
47
+ setActiveIndex((prevIndex) => (prevIndex === index ? null : index));
48
+ };
49
+
50
+ useEffect(() => {
51
+ const handleOutsideClick = (event: MouseEvent) => {
52
+ if (
53
+ activeIndex !== null &&
54
+ !contextMenuRef.current?.contains(event.target as Node) &&
55
+ !segmentRefs.current.some((ref) => ref?.contains(event.target as Node))
56
+ ) {
57
+ setActiveIndex(null);
58
+ }
59
+ };
60
+
61
+ document.addEventListener('mousedown', handleOutsideClick);
62
+
63
+ return () => {
64
+ document.removeEventListener('mousedown', handleOutsideClick);
65
+ };
66
+ }, [activeIndex]);
67
+
68
+ if (files === undefined || pathSegments.length === 0) {
69
+ return null;
70
+ }
71
+
72
+ return (
73
+ <div className="flex">
74
+ {pathSegments.map((segment, index) => {
75
+ const isLast = index === pathSegments.length - 1;
76
+
77
+ const path = pathSegments.slice(0, index).join('/');
78
+
79
+ if (!WORK_DIR_REGEX.test(path)) {
80
+ return null;
81
+ }
82
+
83
+ const isActive = activeIndex === index;
84
+
85
+ return (
86
+ <div key={index} className="relative flex items-center">
87
+ <DropdownMenu.Root open={isActive} modal={false}>
88
+ <DropdownMenu.Trigger asChild>
89
+ <span
90
+ ref={(ref) => (segmentRefs.current[index] = ref)}
91
+ className={classNames('flex items-center gap-1.5 cursor-pointer shrink-0', {
92
+ 'text-bolt-elements-textTertiary hover:text-bolt-elements-textPrimary': !isActive,
93
+ 'text-bolt-elements-textPrimary underline': isActive,
94
+ 'pr-4': isLast,
95
+ })}
96
+ onClick={() => handleSegmentClick(index)}
97
+ >
98
+ {isLast && <div className="i-ph:file-duotone" />}
99
+ {segment}
100
+ </span>
101
+ </DropdownMenu.Trigger>
102
+ {index > 0 && !isLast && <span className="i-ph:caret-right inline-block mx-1" />}
103
+ <AnimatePresence>
104
+ {isActive && (
105
+ <DropdownMenu.Portal>
106
+ <DropdownMenu.Content
107
+ className="z-file-tree-breadcrumb"
108
+ asChild
109
+ align="start"
110
+ side="bottom"
111
+ avoidCollisions={false}
112
+ >
113
+ <motion.div
114
+ ref={contextMenuRef}
115
+ initial="close"
116
+ animate="open"
117
+ exit="close"
118
+ variants={contextMenuVariants}
119
+ >
120
+ <div className="rounded-lg overflow-hidden">
121
+ <div className="max-h-[50vh] min-w-[300px] overflow-scroll bg-bolt-elements-background-depth-1 border border-bolt-elements-borderColor shadow-sm rounded-lg">
122
+ <FileTree
123
+ files={files}
124
+ hideRoot
125
+ rootFolder={path}
126
+ collapsed
127
+ allowFolderSelection
128
+ selectedFile={`${path}/${segment}`}
129
+ onFileSelect={(filePath) => {
130
+ setActiveIndex(null);
131
+ onFileSelect?.(filePath);
132
+ }}
133
+ />
134
+ </div>
135
+ </div>
136
+ <DropdownMenu.Arrow className="fill-bolt-elements-borderColor" />
137
+ </motion.div>
138
+ </DropdownMenu.Content>
139
+ </DropdownMenu.Portal>
140
+ )}
141
+ </AnimatePresence>
142
+ </DropdownMenu.Root>
143
+ </div>
144
+ );
145
+ })}
146
+ </div>
147
+ );
148
+ });
packages/bolt/app/components/workbench/FileTree.tsx CHANGED
@@ -13,24 +13,47 @@ interface Props {
13
  selectedFile?: string;
14
  onFileSelect?: (filePath: string) => void;
15
  rootFolder?: string;
 
 
 
16
  hiddenFiles?: Array<string | RegExp>;
17
  unsavedFiles?: Set<string>;
18
  className?: string;
19
  }
20
 
21
  export const FileTree = memo(
22
- ({ files = {}, onFileSelect, selectedFile, rootFolder, hiddenFiles, className, unsavedFiles }: Props) => {
 
 
 
 
 
 
 
 
 
 
 
23
  renderLogger.trace('FileTree');
24
 
25
  const computedHiddenFiles = useMemo(() => [...DEFAULT_HIDDEN_FILES, ...(hiddenFiles ?? [])], [hiddenFiles]);
26
 
27
  const fileList = useMemo(() => {
28
- return buildFileList(files, rootFolder, computedHiddenFiles);
29
- }, [files, rootFolder, computedHiddenFiles]);
30
 
31
- const [collapsedFolders, setCollapsedFolders] = useState(() => new Set<string>());
 
 
 
 
32
 
33
  useEffect(() => {
 
 
 
 
 
34
  setCollapsedFolders((prevCollapsed) => {
35
  const newCollapsed = new Set<string>();
36
 
@@ -42,7 +65,7 @@ export const FileTree = memo(
42
 
43
  return newCollapsed;
44
  });
45
- }, [fileList]);
46
 
47
  const filteredFileList = useMemo(() => {
48
  const list = [];
@@ -109,6 +132,7 @@ export const FileTree = memo(
109
  <Folder
110
  key={fileOrFolder.id}
111
  folder={fileOrFolder}
 
112
  collapsed={collapsedFolders.has(fileOrFolder.fullPath)}
113
  onClick={() => {
114
  toggleCollapseState(fileOrFolder.fullPath);
@@ -131,13 +155,18 @@ export default FileTree;
131
  interface FolderProps {
132
  folder: FolderNode;
133
  collapsed: boolean;
 
134
  onClick: () => void;
135
  }
136
 
137
- function Folder({ folder: { depth, name }, collapsed, onClick }: FolderProps) {
138
  return (
139
  <NodeButton
140
- className="group bg-transparent text-bolt-elements-item-contentDefault hover:text-bolt-elements-item-contentActive hover:bg-bolt-elements-item-backgroundActive"
 
 
 
 
141
  depth={depth}
142
  iconClasses={classNames({
143
  'i-ph:caret-right scale-98': collapsed,
@@ -223,13 +252,18 @@ interface FolderNode extends BaseNode {
223
  kind: 'folder';
224
  }
225
 
226
- function buildFileList(files: FileMap, rootFolder = '/', hiddenFiles: Array<string | RegExp>): Node[] {
 
 
 
 
 
227
  const folderPaths = new Set<string>();
228
  const fileList: Node[] = [];
229
 
230
  let defaultDepth = 0;
231
 
232
- if (rootFolder === '/') {
233
  defaultDepth = 1;
234
  fileList.push({ kind: 'folder', name: '/', depth: 0, id: 0, fullPath: '/' });
235
  }
@@ -251,7 +285,7 @@ function buildFileList(files: FileMap, rootFolder = '/', hiddenFiles: Array<stri
251
  const name = segments[i];
252
  const fullPath = (currentPath += `/${name}`);
253
 
254
- if (!fullPath.startsWith(rootFolder)) {
255
  i++;
256
  continue;
257
  }
@@ -281,7 +315,7 @@ function buildFileList(files: FileMap, rootFolder = '/', hiddenFiles: Array<stri
281
  }
282
  }
283
 
284
- return sortFileList(rootFolder, fileList);
285
  }
286
 
287
  function isHiddenFile(filePath: string, fileName: string, hiddenFiles: Array<string | RegExp>) {
@@ -307,7 +341,7 @@ function isHiddenFile(filePath: string, fileName: string, hiddenFiles: Array<str
307
  *
308
  * @returns A new array of nodes sorted in depth-first order.
309
  */
310
- function sortFileList(rootFolder: string, nodeList: Node[]): Node[] {
311
  logger.trace('sortFileList');
312
 
313
  const nodeMap = new Map<string, Node>();
@@ -335,13 +369,10 @@ function sortFileList(rootFolder: string, nodeList: Node[]): Node[] {
335
  const depthFirstTraversal = (path: string): void => {
336
  const node = nodeMap.get(path);
337
 
338
- if (!node) {
339
- logger.warn(`Node not found for path: ${path}`);
340
- return;
341
  }
342
 
343
- sortedList.push(node);
344
-
345
  const children = childrenMap.get(path);
346
 
347
  if (children) {
@@ -355,7 +386,16 @@ function sortFileList(rootFolder: string, nodeList: Node[]): Node[] {
355
  }
356
  };
357
 
358
- depthFirstTraversal(rootFolder);
 
 
 
 
 
 
 
 
 
359
 
360
  return sortedList;
361
  }
 
13
  selectedFile?: string;
14
  onFileSelect?: (filePath: string) => void;
15
  rootFolder?: string;
16
+ hideRoot?: boolean;
17
+ collapsed?: boolean;
18
+ allowFolderSelection?: boolean;
19
  hiddenFiles?: Array<string | RegExp>;
20
  unsavedFiles?: Set<string>;
21
  className?: string;
22
  }
23
 
24
  export const FileTree = memo(
25
+ ({
26
+ files = {},
27
+ onFileSelect,
28
+ selectedFile,
29
+ rootFolder,
30
+ hideRoot = false,
31
+ collapsed = false,
32
+ allowFolderSelection = false,
33
+ hiddenFiles,
34
+ className,
35
+ unsavedFiles,
36
+ }: Props) => {
37
  renderLogger.trace('FileTree');
38
 
39
  const computedHiddenFiles = useMemo(() => [...DEFAULT_HIDDEN_FILES, ...(hiddenFiles ?? [])], [hiddenFiles]);
40
 
41
  const fileList = useMemo(() => {
42
+ return buildFileList(files, rootFolder, hideRoot, computedHiddenFiles);
43
+ }, [files, rootFolder, hideRoot, computedHiddenFiles]);
44
 
45
+ const [collapsedFolders, setCollapsedFolders] = useState(() => {
46
+ return collapsed
47
+ ? new Set(fileList.filter((item) => item.kind === 'folder').map((item) => item.fullPath))
48
+ : new Set<string>();
49
+ });
50
 
51
  useEffect(() => {
52
+ if (collapsed) {
53
+ setCollapsedFolders(new Set(fileList.filter((item) => item.kind === 'folder').map((item) => item.fullPath)));
54
+ return;
55
+ }
56
+
57
  setCollapsedFolders((prevCollapsed) => {
58
  const newCollapsed = new Set<string>();
59
 
 
65
 
66
  return newCollapsed;
67
  });
68
+ }, [fileList, collapsed]);
69
 
70
  const filteredFileList = useMemo(() => {
71
  const list = [];
 
132
  <Folder
133
  key={fileOrFolder.id}
134
  folder={fileOrFolder}
135
+ selected={allowFolderSelection && selectedFile === fileOrFolder.fullPath}
136
  collapsed={collapsedFolders.has(fileOrFolder.fullPath)}
137
  onClick={() => {
138
  toggleCollapseState(fileOrFolder.fullPath);
 
155
  interface FolderProps {
156
  folder: FolderNode;
157
  collapsed: boolean;
158
+ selected?: boolean;
159
  onClick: () => void;
160
  }
161
 
162
+ function Folder({ folder: { depth, name }, collapsed, selected = false, onClick }: FolderProps) {
163
  return (
164
  <NodeButton
165
+ className={classNames('group', {
166
+ 'bg-transparent text-bolt-elements-item-contentDefault hover:text-bolt-elements-item-contentActive hover:bg-bolt-elements-item-backgroundActive':
167
+ !selected,
168
+ 'bg-bolt-elements-item-backgroundAccent text-bolt-elements-item-contentAccent': selected,
169
+ })}
170
  depth={depth}
171
  iconClasses={classNames({
172
  'i-ph:caret-right scale-98': collapsed,
 
252
  kind: 'folder';
253
  }
254
 
255
+ function buildFileList(
256
+ files: FileMap,
257
+ rootFolder = '/',
258
+ hideRoot: boolean,
259
+ hiddenFiles: Array<string | RegExp>,
260
+ ): Node[] {
261
  const folderPaths = new Set<string>();
262
  const fileList: Node[] = [];
263
 
264
  let defaultDepth = 0;
265
 
266
+ if (rootFolder === '/' && !hideRoot) {
267
  defaultDepth = 1;
268
  fileList.push({ kind: 'folder', name: '/', depth: 0, id: 0, fullPath: '/' });
269
  }
 
285
  const name = segments[i];
286
  const fullPath = (currentPath += `/${name}`);
287
 
288
+ if (!fullPath.startsWith(rootFolder) || (hideRoot && fullPath === rootFolder)) {
289
  i++;
290
  continue;
291
  }
 
315
  }
316
  }
317
 
318
+ return sortFileList(rootFolder, fileList, hideRoot);
319
  }
320
 
321
  function isHiddenFile(filePath: string, fileName: string, hiddenFiles: Array<string | RegExp>) {
 
341
  *
342
  * @returns A new array of nodes sorted in depth-first order.
343
  */
344
+ function sortFileList(rootFolder: string, nodeList: Node[], hideRoot: boolean): Node[] {
345
  logger.trace('sortFileList');
346
 
347
  const nodeMap = new Map<string, Node>();
 
369
  const depthFirstTraversal = (path: string): void => {
370
  const node = nodeMap.get(path);
371
 
372
+ if (node) {
373
+ sortedList.push(node);
 
374
  }
375
 
 
 
376
  const children = childrenMap.get(path);
377
 
378
  if (children) {
 
386
  }
387
  };
388
 
389
+ if (hideRoot) {
390
+ // if root is hidden, start traversal from its immediate children
391
+ const rootChildren = childrenMap.get(rootFolder) || [];
392
+
393
+ for (const child of rootChildren) {
394
+ depthFirstTraversal(child.fullPath);
395
+ }
396
+ } else {
397
+ depthFirstTraversal(rootFolder);
398
+ }
399
 
400
  return sortedList;
401
  }
packages/bolt/app/styles/z-index.scss CHANGED
@@ -24,6 +24,10 @@ $zIndexMax: 999;
24
  z-index: 3;
25
  }
26
 
 
 
 
 
27
  .z-max {
28
  z-index: $zIndexMax;
29
  }
 
24
  z-index: 3;
25
  }
26
 
27
+ .z-file-tree-breadcrumb {
28
+ z-index: $zIndexMax - 1;
29
+ }
30
+
31
  .z-max {
32
  z-index: $zIndexMax;
33
  }
packages/bolt/package.json CHANGED
@@ -36,6 +36,7 @@
36
  "@iconify-json/svg-spinners": "^1.1.2",
37
  "@lezer/highlight": "^1.2.0",
38
  "@nanostores/react": "^0.7.2",
 
39
  "@remix-run/cloudflare": "^2.10.2",
40
  "@remix-run/cloudflare-pages": "^2.10.2",
41
  "@remix-run/react": "^2.10.2",
 
36
  "@iconify-json/svg-spinners": "^1.1.2",
37
  "@lezer/highlight": "^1.2.0",
38
  "@nanostores/react": "^0.7.2",
39
+ "@radix-ui/react-dropdown-menu": "^2.1.1",
40
  "@remix-run/cloudflare": "^2.10.2",
41
  "@remix-run/cloudflare-pages": "^2.10.2",
42
  "@remix-run/react": "^2.10.2",
pnpm-lock.yaml CHANGED
@@ -95,6 +95,9 @@ importers:
95
  '@nanostores/react':
96
  specifier: ^0.7.2
97
 
 
 
98
  '@remix-run/cloudflare':
99
  specifier: ^2.10.2
100
  version: 2.10.2(@cloudflare/[email protected])([email protected])
@@ -1085,6 +1088,21 @@ packages:
1085
  resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==}
1086
  engines: {node: '>=14'}
1087
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1088
  '@humanwhocodes/[email protected]':
1089
  resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
1090
  engines: {node: '>=12.22'}
@@ -1231,6 +1249,263 @@ packages:
1231
  '@polka/[email protected]':
1232
  resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==}
1233
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1234
  '@remix-run/[email protected]':
1235
  resolution: {integrity: sha512-HaOdGkSMhe4zg1M8KDNNKb7VgBIHGpi0/90aLdYmzvZy+yeR0NOdrQh4P6gAYGCGSzqttuPOEIr4laXtBKI7Yg==}
1236
  engines: {node: '>=18.0.0'}
@@ -1883,6 +2158,10 @@ packages:
1883
1884
  resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
1885
 
 
 
 
 
1886
1887
  resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
1888
 
@@ -2372,6 +2651,9 @@ packages:
2372
  resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
2373
  engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
2374
 
 
 
 
2375
2376
  resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
2377
 
@@ -2789,6 +3071,10 @@ packages:
2789
  resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
2790
  engines: {node: '>= 0.4'}
2791
 
 
 
 
 
2792
2793
  resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==}
2794
  engines: {node: '>=8'}
@@ -3011,6 +3297,9 @@ packages:
3011
3012
  resolution: {integrity: sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==}
3013
 
 
 
 
3014
3015
  resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
3016
  engines: {node: '>= 0.10'}
@@ -4205,6 +4494,26 @@ packages:
4205
  resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==}
4206
  engines: {node: '>=0.10.0'}
4207
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4208
4209
  resolution: {integrity: sha512-aMbK3VF8U+VBICG+rwhE0Rr/eFZaRzmNq3akBRL1TrayIpLXz7Rbok0//kYeWj6SQRsjcQ3f4eRplJicM+oL6w==}
4210
  peerDependencies:
@@ -4224,6 +4533,16 @@ packages:
4224
  peerDependencies:
4225
  react: '>=16.8'
4226
 
 
 
 
 
 
 
 
 
 
 
4227
4228
  resolution: {integrity: sha512-mNKt2jBXJg4O7pSdbNUfDdTsK9FIdikfsIE/yUCxbAEXl4HMyJaivrVFcn3Elvt5xvCQYhUZm+hqTIu1UXM3Pw==}
4229
  peerDependencies:
@@ -4874,6 +5193,26 @@ packages:
4874
4875
  resolution: {integrity: sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==}
4876
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4877
4878
  resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==}
4879
  peerDependencies:
@@ -5999,6 +6338,23 @@ snapshots:
5999
 
6000
  '@fastify/[email protected]': {}
6001
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6002
  '@humanwhocodes/[email protected]': {}
6003
 
6004
  '@humanwhocodes/[email protected]': {}
@@ -6206,6 +6562,238 @@ snapshots:
6206
 
6207
  '@polka/[email protected]': {}
6208
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6209
6210
  dependencies:
6211
  '@cloudflare/workers-types': 4.20240620.0
@@ -7092,6 +7680,10 @@ snapshots:
7092
 
7093
7094
 
 
 
 
 
7095
7096
  dependencies:
7097
  dequal: 2.0.3
@@ -7621,6 +8213,8 @@ snapshots:
7621
 
7622
7623
 
 
 
7624
7625
  dependencies:
7626
  dequal: 2.0.3
@@ -8156,6 +8750,8 @@ snapshots:
8156
  has-symbols: 1.0.3
8157
  hasown: 2.0.2
8158
 
 
 
8159
8160
 
8161
@@ -8429,6 +9025,10 @@ snapshots:
8429
 
8430
8431
 
 
 
 
 
8432
8433
 
8434
@@ -9978,6 +10578,25 @@ snapshots:
9978
 
9979
9980
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9981
9982
  dependencies:
9983
  react: 18.3.1
@@ -9995,6 +10614,15 @@ snapshots:
9995
  '@remix-run/router': 1.17.1
9996
  react: 18.3.1
9997
 
 
 
 
 
 
 
 
 
 
9998
9999
  dependencies:
10000
  clsx: 2.1.1
@@ -10742,6 +11370,21 @@ snapshots:
10742
  punycode: 1.4.1
10743
  qs: 6.12.3
10744
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10745
10746
  dependencies:
10747
  react: 18.3.1
 
95
  '@nanostores/react':
96
  specifier: ^0.7.2
97
98
+ '@radix-ui/react-dropdown-menu':
99
+ specifier: ^2.1.1
100
101
  '@remix-run/cloudflare':
102
  specifier: ^2.10.2
103
  version: 2.10.2(@cloudflare/[email protected])([email protected])
 
1088
  resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==}
1089
  engines: {node: '>=14'}
1090
 
1091
+ '@floating-ui/[email protected]':
1092
+ resolution: {integrity: sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==}
1093
+
1094
+ '@floating-ui/[email protected]':
1095
+ resolution: {integrity: sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==}
1096
+
1097
+ '@floating-ui/[email protected]':
1098
+ resolution: {integrity: sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==}
1099
+ peerDependencies:
1100
+ react: '>=16.8.0'
1101
+ react-dom: '>=16.8.0'
1102
+
1103
+ '@floating-ui/[email protected]':
1104
+ resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==}
1105
+
1106
  '@humanwhocodes/[email protected]':
1107
  resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
1108
  engines: {node: '>=12.22'}
 
1249
  '@polka/[email protected]':
1250
  resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==}
1251
 
1252
+ '@radix-ui/[email protected]':
1253
+ resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==}
1254
+
1255
+ '@radix-ui/[email protected]':
1256
+ resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==}
1257
+ peerDependencies:
1258
+ '@types/react': '*'
1259
+ '@types/react-dom': '*'
1260
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1261
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1262
+ peerDependenciesMeta:
1263
+ '@types/react':
1264
+ optional: true
1265
+ '@types/react-dom':
1266
+ optional: true
1267
+
1268
+ '@radix-ui/[email protected]':
1269
+ resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==}
1270
+ peerDependencies:
1271
+ '@types/react': '*'
1272
+ '@types/react-dom': '*'
1273
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1274
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1275
+ peerDependenciesMeta:
1276
+ '@types/react':
1277
+ optional: true
1278
+ '@types/react-dom':
1279
+ optional: true
1280
+
1281
+ '@radix-ui/[email protected]':
1282
+ resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==}
1283
+ peerDependencies:
1284
+ '@types/react': '*'
1285
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1286
+ peerDependenciesMeta:
1287
+ '@types/react':
1288
+ optional: true
1289
+
1290
+ '@radix-ui/[email protected]':
1291
+ resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==}
1292
+ peerDependencies:
1293
+ '@types/react': '*'
1294
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1295
+ peerDependenciesMeta:
1296
+ '@types/react':
1297
+ optional: true
1298
+
1299
+ '@radix-ui/[email protected]':
1300
+ resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==}
1301
+ peerDependencies:
1302
+ '@types/react': '*'
1303
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1304
+ peerDependenciesMeta:
1305
+ '@types/react':
1306
+ optional: true
1307
+
1308
+ '@radix-ui/[email protected]':
1309
+ resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==}
1310
+ peerDependencies:
1311
+ '@types/react': '*'
1312
+ '@types/react-dom': '*'
1313
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1314
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1315
+ peerDependenciesMeta:
1316
+ '@types/react':
1317
+ optional: true
1318
+ '@types/react-dom':
1319
+ optional: true
1320
+
1321
+ '@radix-ui/[email protected]':
1322
+ resolution: {integrity: sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==}
1323
+ peerDependencies:
1324
+ '@types/react': '*'
1325
+ '@types/react-dom': '*'
1326
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1327
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1328
+ peerDependenciesMeta:
1329
+ '@types/react':
1330
+ optional: true
1331
+ '@types/react-dom':
1332
+ optional: true
1333
+
1334
+ '@radix-ui/[email protected]':
1335
+ resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==}
1336
+ peerDependencies:
1337
+ '@types/react': '*'
1338
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1339
+ peerDependenciesMeta:
1340
+ '@types/react':
1341
+ optional: true
1342
+
1343
+ '@radix-ui/[email protected]':
1344
+ resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==}
1345
+ peerDependencies:
1346
+ '@types/react': '*'
1347
+ '@types/react-dom': '*'
1348
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1349
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1350
+ peerDependenciesMeta:
1351
+ '@types/react':
1352
+ optional: true
1353
+ '@types/react-dom':
1354
+ optional: true
1355
+
1356
+ '@radix-ui/[email protected]':
1357
+ resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==}
1358
+ peerDependencies:
1359
+ '@types/react': '*'
1360
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1361
+ peerDependenciesMeta:
1362
+ '@types/react':
1363
+ optional: true
1364
+
1365
+ '@radix-ui/[email protected]':
1366
+ resolution: {integrity: sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ==}
1367
+ peerDependencies:
1368
+ '@types/react': '*'
1369
+ '@types/react-dom': '*'
1370
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1371
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1372
+ peerDependenciesMeta:
1373
+ '@types/react':
1374
+ optional: true
1375
+ '@types/react-dom':
1376
+ optional: true
1377
+
1378
+ '@radix-ui/[email protected]':
1379
+ resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==}
1380
+ peerDependencies:
1381
+ '@types/react': '*'
1382
+ '@types/react-dom': '*'
1383
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1384
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1385
+ peerDependenciesMeta:
1386
+ '@types/react':
1387
+ optional: true
1388
+ '@types/react-dom':
1389
+ optional: true
1390
+
1391
+ '@radix-ui/[email protected]':
1392
+ resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==}
1393
+ peerDependencies:
1394
+ '@types/react': '*'
1395
+ '@types/react-dom': '*'
1396
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1397
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1398
+ peerDependenciesMeta:
1399
+ '@types/react':
1400
+ optional: true
1401
+ '@types/react-dom':
1402
+ optional: true
1403
+
1404
+ '@radix-ui/[email protected]':
1405
+ resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==}
1406
+ peerDependencies:
1407
+ '@types/react': '*'
1408
+ '@types/react-dom': '*'
1409
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1410
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1411
+ peerDependenciesMeta:
1412
+ '@types/react':
1413
+ optional: true
1414
+ '@types/react-dom':
1415
+ optional: true
1416
+
1417
+ '@radix-ui/[email protected]':
1418
+ resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==}
1419
+ peerDependencies:
1420
+ '@types/react': '*'
1421
+ '@types/react-dom': '*'
1422
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1423
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1424
+ peerDependenciesMeta:
1425
+ '@types/react':
1426
+ optional: true
1427
+ '@types/react-dom':
1428
+ optional: true
1429
+
1430
+ '@radix-ui/[email protected]':
1431
+ resolution: {integrity: sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==}
1432
+ peerDependencies:
1433
+ '@types/react': '*'
1434
+ '@types/react-dom': '*'
1435
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1436
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1437
+ peerDependenciesMeta:
1438
+ '@types/react':
1439
+ optional: true
1440
+ '@types/react-dom':
1441
+ optional: true
1442
+
1443
+ '@radix-ui/[email protected]':
1444
+ resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==}
1445
+ peerDependencies:
1446
+ '@types/react': '*'
1447
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1448
+ peerDependenciesMeta:
1449
+ '@types/react':
1450
+ optional: true
1451
+
1452
+ '@radix-ui/[email protected]':
1453
+ resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==}
1454
+ peerDependencies:
1455
+ '@types/react': '*'
1456
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1457
+ peerDependenciesMeta:
1458
+ '@types/react':
1459
+ optional: true
1460
+
1461
+ '@radix-ui/[email protected]':
1462
+ resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==}
1463
+ peerDependencies:
1464
+ '@types/react': '*'
1465
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1466
+ peerDependenciesMeta:
1467
+ '@types/react':
1468
+ optional: true
1469
+
1470
+ '@radix-ui/[email protected]':
1471
+ resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==}
1472
+ peerDependencies:
1473
+ '@types/react': '*'
1474
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1475
+ peerDependenciesMeta:
1476
+ '@types/react':
1477
+ optional: true
1478
+
1479
+ '@radix-ui/[email protected]':
1480
+ resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==}
1481
+ peerDependencies:
1482
+ '@types/react': '*'
1483
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1484
+ peerDependenciesMeta:
1485
+ '@types/react':
1486
+ optional: true
1487
+
1488
+ '@radix-ui/[email protected]':
1489
+ resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==}
1490
+ peerDependencies:
1491
+ '@types/react': '*'
1492
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1493
+ peerDependenciesMeta:
1494
+ '@types/react':
1495
+ optional: true
1496
+
1497
+ '@radix-ui/[email protected]':
1498
+ resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==}
1499
+ peerDependencies:
1500
+ '@types/react': '*'
1501
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1502
+ peerDependenciesMeta:
1503
+ '@types/react':
1504
+ optional: true
1505
+
1506
+ '@radix-ui/[email protected]':
1507
+ resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==}
1508
+
1509
  '@remix-run/[email protected]':
1510
  resolution: {integrity: sha512-HaOdGkSMhe4zg1M8KDNNKb7VgBIHGpi0/90aLdYmzvZy+yeR0NOdrQh4P6gAYGCGSzqttuPOEIr4laXtBKI7Yg==}
1511
  engines: {node: '>=18.0.0'}
 
2158
2159
  resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
2160
 
2161
2162
+ resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==}
2163
+ engines: {node: '>=10'}
2164
+
2165
2166
  resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
2167
 
 
2651
  resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
2652
  engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
2653
 
2654
2655
+ resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
2656
+
2657
2658
  resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
2659
 
 
3071
  resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
3072
  engines: {node: '>= 0.4'}
3073
 
3074
3075
+ resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
3076
+ engines: {node: '>=6'}
3077
+
3078
3079
  resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==}
3080
  engines: {node: '>=8'}
 
3297
3298
  resolution: {integrity: sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==}
3299
 
3300
3301
+ resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
3302
+
3303
3304
  resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
3305
  engines: {node: '>= 0.10'}
 
4494
  resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==}
4495
  engines: {node: '>=0.10.0'}
4496
 
4497
4498
+ resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==}
4499
+ engines: {node: '>=10'}
4500
+ peerDependencies:
4501
+ '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
4502
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
4503
+ peerDependenciesMeta:
4504
+ '@types/react':
4505
+ optional: true
4506
+
4507
4508
+ resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==}
4509
+ engines: {node: '>=10'}
4510
+ peerDependencies:
4511
+ '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
4512
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
4513
+ peerDependenciesMeta:
4514
+ '@types/react':
4515
+ optional: true
4516
+
4517
4518
  resolution: {integrity: sha512-aMbK3VF8U+VBICG+rwhE0Rr/eFZaRzmNq3akBRL1TrayIpLXz7Rbok0//kYeWj6SQRsjcQ3f4eRplJicM+oL6w==}
4519
  peerDependencies:
 
4533
  peerDependencies:
4534
  react: '>=16.8'
4535
 
4536
4537
+ resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==}
4538
+ engines: {node: '>=10'}
4539
+ peerDependencies:
4540
+ '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
4541
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
4542
+ peerDependenciesMeta:
4543
+ '@types/react':
4544
+ optional: true
4545
+
4546
4547
  resolution: {integrity: sha512-mNKt2jBXJg4O7pSdbNUfDdTsK9FIdikfsIE/yUCxbAEXl4HMyJaivrVFcn3Elvt5xvCQYhUZm+hqTIu1UXM3Pw==}
4548
  peerDependencies:
 
5193
5194
  resolution: {integrity: sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==}
5195
 
5196
5197
+ resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==}
5198
+ engines: {node: '>=10'}
5199
+ peerDependencies:
5200
+ '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
5201
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
5202
+ peerDependenciesMeta:
5203
+ '@types/react':
5204
+ optional: true
5205
+
5206
5207
+ resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==}
5208
+ engines: {node: '>=10'}
5209
+ peerDependencies:
5210
+ '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0
5211
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
5212
+ peerDependenciesMeta:
5213
+ '@types/react':
5214
+ optional: true
5215
+
5216
5217
  resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==}
5218
  peerDependencies:
 
6338
 
6339
  '@fastify/[email protected]': {}
6340
 
6341
+ '@floating-ui/[email protected]':
6342
+ dependencies:
6343
+ '@floating-ui/utils': 0.2.7
6344
+
6345
+ '@floating-ui/[email protected]':
6346
+ dependencies:
6347
+ '@floating-ui/core': 1.6.7
6348
+ '@floating-ui/utils': 0.2.7
6349
+
6350
6351
+ dependencies:
6352
+ '@floating-ui/dom': 1.6.10
6353
+ react: 18.3.1
6354
+ react-dom: 18.3.1([email protected])
6355
+
6356
+ '@floating-ui/[email protected]': {}
6357
+
6358
  '@humanwhocodes/[email protected]': {}
6359
 
6360
  '@humanwhocodes/[email protected]': {}
 
6562
 
6563
  '@polka/[email protected]': {}
6564
 
6565
+ '@radix-ui/[email protected]': {}
6566
+
6567
6568
+ dependencies:
6569
+ '@radix-ui/react-primitive': 2.0.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
6570
+ react: 18.3.1
6571
+ react-dom: 18.3.1([email protected])
6572
+ optionalDependencies:
6573
+ '@types/react': 18.3.3
6574
+ '@types/react-dom': 18.3.0
6575
+
6576
6577
+ dependencies:
6578
+ '@radix-ui/react-compose-refs': 1.1.0(@types/[email protected])([email protected])
6579
+ '@radix-ui/react-context': 1.1.0(@types/[email protected])([email protected])
6580
+ '@radix-ui/react-primitive': 2.0.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
6581
+ '@radix-ui/react-slot': 1.1.0(@types/[email protected])([email protected])
6582
+ react: 18.3.1
6583
+ react-dom: 18.3.1([email protected])
6584
+ optionalDependencies:
6585
+ '@types/react': 18.3.3
6586
+ '@types/react-dom': 18.3.0
6587
+
6588
6589
+ dependencies:
6590
+ react: 18.3.1
6591
+ optionalDependencies:
6592
+ '@types/react': 18.3.3
6593
+
6594
6595
+ dependencies:
6596
+ react: 18.3.1
6597
+ optionalDependencies:
6598
+ '@types/react': 18.3.3
6599
+
6600
6601
+ dependencies:
6602
+ react: 18.3.1
6603
+ optionalDependencies:
6604
+ '@types/react': 18.3.3
6605
+
6606
6607
+ dependencies:
6608
+ '@radix-ui/primitive': 1.1.0
6609
+ '@radix-ui/react-compose-refs': 1.1.0(@types/[email protected])([email protected])
6610
+ '@radix-ui/react-primitive': 2.0.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
6611
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/[email protected])([email protected])
6612
+ '@radix-ui/react-use-escape-keydown': 1.1.0(@types/[email protected])([email protected])
6613
+ react: 18.3.1
6614
+ react-dom: 18.3.1([email protected])
6615
+ optionalDependencies:
6616
+ '@types/react': 18.3.3
6617
+ '@types/react-dom': 18.3.0
6618
+
6619
6620
+ dependencies:
6621
+ '@radix-ui/primitive': 1.1.0
6622
+ '@radix-ui/react-compose-refs': 1.1.0(@types/[email protected])([email protected])
6623
+ '@radix-ui/react-context': 1.1.0(@types/[email protected])([email protected])
6624
+ '@radix-ui/react-id': 1.1.0(@types/[email protected])([email protected])
6625
6626
+ '@radix-ui/react-primitive': 2.0.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
6627
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/[email protected])([email protected])
6628
+ react: 18.3.1
6629
+ react-dom: 18.3.1([email protected])
6630
+ optionalDependencies:
6631
+ '@types/react': 18.3.3
6632
+ '@types/react-dom': 18.3.0
6633
+
6634
6635
+ dependencies:
6636
+ react: 18.3.1
6637
+ optionalDependencies:
6638
+ '@types/react': 18.3.3
6639
+
6640
6641
+ dependencies:
6642
+ '@radix-ui/react-compose-refs': 1.1.0(@types/[email protected])([email protected])
6643
+ '@radix-ui/react-primitive': 2.0.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
6644
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/[email protected])([email protected])
6645
+ react: 18.3.1
6646
+ react-dom: 18.3.1([email protected])
6647
+ optionalDependencies:
6648
+ '@types/react': 18.3.3
6649
+ '@types/react-dom': 18.3.0
6650
+
6651
6652
+ dependencies:
6653
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/[email protected])([email protected])
6654
+ react: 18.3.1
6655
+ optionalDependencies:
6656
+ '@types/react': 18.3.3
6657
+
6658
6659
+ dependencies:
6660
+ '@radix-ui/primitive': 1.1.0
6661
+ '@radix-ui/react-collection': 1.1.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
6662
+ '@radix-ui/react-compose-refs': 1.1.0(@types/[email protected])([email protected])
6663
+ '@radix-ui/react-context': 1.1.0(@types/[email protected])([email protected])
6664
+ '@radix-ui/react-direction': 1.1.0(@types/[email protected])([email protected])
6665
+ '@radix-ui/react-dismissable-layer': 1.1.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
6666
+ '@radix-ui/react-focus-guards': 1.1.0(@types/[email protected])([email protected])
6667
+ '@radix-ui/react-focus-scope': 1.1.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
6668
+ '@radix-ui/react-id': 1.1.0(@types/[email protected])([email protected])
6669
6670
6671
+ '@radix-ui/react-presence': 1.1.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
6672
+ '@radix-ui/react-primitive': 2.0.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
6673
+ '@radix-ui/react-roving-focus': 1.1.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
6674
+ '@radix-ui/react-slot': 1.1.0(@types/[email protected])([email protected])
6675
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/[email protected])([email protected])
6676
+ aria-hidden: 1.2.4
6677
+ react: 18.3.1
6678
+ react-dom: 18.3.1([email protected])
6679
+ react-remove-scroll: 2.5.7(@types/[email protected])([email protected])
6680
+ optionalDependencies:
6681
+ '@types/react': 18.3.3
6682
+ '@types/react-dom': 18.3.0
6683
+
6684
6685
+ dependencies:
6686
+ '@floating-ui/react-dom': 2.1.1([email protected]([email protected]))([email protected])
6687
6688
+ '@radix-ui/react-compose-refs': 1.1.0(@types/[email protected])([email protected])
6689
+ '@radix-ui/react-context': 1.1.0(@types/[email protected])([email protected])
6690
+ '@radix-ui/react-primitive': 2.0.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
6691
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/[email protected])([email protected])
6692
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/[email protected])([email protected])
6693
+ '@radix-ui/react-use-rect': 1.1.0(@types/[email protected])([email protected])
6694
+ '@radix-ui/react-use-size': 1.1.0(@types/[email protected])([email protected])
6695
+ '@radix-ui/rect': 1.1.0
6696
+ react: 18.3.1
6697
+ react-dom: 18.3.1([email protected])
6698
+ optionalDependencies:
6699
+ '@types/react': 18.3.3
6700
+ '@types/react-dom': 18.3.0
6701
+
6702
6703
+ dependencies:
6704
+ '@radix-ui/react-primitive': 2.0.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
6705
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/[email protected])([email protected])
6706
+ react: 18.3.1
6707
+ react-dom: 18.3.1([email protected])
6708
+ optionalDependencies:
6709
+ '@types/react': 18.3.3
6710
+ '@types/react-dom': 18.3.0
6711
+
6712
6713
+ dependencies:
6714
+ '@radix-ui/react-compose-refs': 1.1.0(@types/[email protected])([email protected])
6715
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/[email protected])([email protected])
6716
+ react: 18.3.1
6717
+ react-dom: 18.3.1([email protected])
6718
+ optionalDependencies:
6719
+ '@types/react': 18.3.3
6720
+ '@types/react-dom': 18.3.0
6721
+
6722
6723
+ dependencies:
6724
+ '@radix-ui/react-slot': 1.1.0(@types/[email protected])([email protected])
6725
+ react: 18.3.1
6726
+ react-dom: 18.3.1([email protected])
6727
+ optionalDependencies:
6728
+ '@types/react': 18.3.3
6729
+ '@types/react-dom': 18.3.0
6730
+
6731
6732
+ dependencies:
6733
+ '@radix-ui/primitive': 1.1.0
6734
+ '@radix-ui/react-collection': 1.1.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
6735
+ '@radix-ui/react-compose-refs': 1.1.0(@types/[email protected])([email protected])
6736
+ '@radix-ui/react-context': 1.1.0(@types/[email protected])([email protected])
6737
+ '@radix-ui/react-direction': 1.1.0(@types/[email protected])([email protected])
6738
+ '@radix-ui/react-id': 1.1.0(@types/[email protected])([email protected])
6739
+ '@radix-ui/react-primitive': 2.0.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
6740
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/[email protected])([email protected])
6741
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/[email protected])([email protected])
6742
+ react: 18.3.1
6743
+ react-dom: 18.3.1([email protected])
6744
+ optionalDependencies:
6745
+ '@types/react': 18.3.3
6746
+ '@types/react-dom': 18.3.0
6747
+
6748
6749
+ dependencies:
6750
+ '@radix-ui/react-compose-refs': 1.1.0(@types/[email protected])([email protected])
6751
+ react: 18.3.1
6752
+ optionalDependencies:
6753
+ '@types/react': 18.3.3
6754
+
6755
6756
+ dependencies:
6757
+ react: 18.3.1
6758
+ optionalDependencies:
6759
+ '@types/react': 18.3.3
6760
+
6761
6762
+ dependencies:
6763
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/[email protected])([email protected])
6764
+ react: 18.3.1
6765
+ optionalDependencies:
6766
+ '@types/react': 18.3.3
6767
+
6768
6769
+ dependencies:
6770
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/[email protected])([email protected])
6771
+ react: 18.3.1
6772
+ optionalDependencies:
6773
+ '@types/react': 18.3.3
6774
+
6775
6776
+ dependencies:
6777
+ react: 18.3.1
6778
+ optionalDependencies:
6779
+ '@types/react': 18.3.3
6780
+
6781
6782
+ dependencies:
6783
+ '@radix-ui/rect': 1.1.0
6784
+ react: 18.3.1
6785
+ optionalDependencies:
6786
+ '@types/react': 18.3.3
6787
+
6788
6789
+ dependencies:
6790
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/[email protected])([email protected])
6791
+ react: 18.3.1
6792
+ optionalDependencies:
6793
+ '@types/react': 18.3.3
6794
+
6795
+ '@radix-ui/[email protected]': {}
6796
+
6797
6798
  dependencies:
6799
  '@cloudflare/workers-types': 4.20240620.0
 
7680
 
7681
7682
 
7683
7684
+ dependencies:
7685
+ tslib: 2.6.3
7686
+
7687
7688
  dependencies:
7689
  dequal: 2.0.3
 
8213
 
8214
8215
 
8216
8217
+
8218
8219
  dependencies:
8220
  dequal: 2.0.3
 
8750
  has-symbols: 1.0.3
8751
  hasown: 2.0.2
8752
 
8753
8754
+
8755
8756
 
8757
 
9025
 
9026
9027
 
9028
9029
+ dependencies:
9030
+ loose-envify: 1.4.0
9031
+
9032
9033
 
9034
 
10578
 
10579
10580
 
10581
10582
+ dependencies:
10583
+ react: 18.3.1
10584
+ react-style-singleton: 2.2.1(@types/[email protected])([email protected])
10585
+ tslib: 2.6.3
10586
+ optionalDependencies:
10587
+ '@types/react': 18.3.3
10588
+
10589
10590
+ dependencies:
10591
+ react: 18.3.1
10592
+ react-remove-scroll-bar: 2.3.6(@types/[email protected])([email protected])
10593
+ react-style-singleton: 2.2.1(@types/[email protected])([email protected])
10594
+ tslib: 2.6.3
10595
+ use-callback-ref: 1.3.2(@types/[email protected])([email protected])
10596
+ use-sidecar: 1.1.2(@types/[email protected])([email protected])
10597
+ optionalDependencies:
10598
+ '@types/react': 18.3.3
10599
+
10600
10601
  dependencies:
10602
  react: 18.3.1
 
10614
  '@remix-run/router': 1.17.1
10615
  react: 18.3.1
10616
 
10617
10618
+ dependencies:
10619
+ get-nonce: 1.0.1
10620
+ invariant: 2.2.4
10621
+ react: 18.3.1
10622
+ tslib: 2.6.3
10623
+ optionalDependencies:
10624
+ '@types/react': 18.3.3
10625
+
10626
10627
  dependencies:
10628
  clsx: 2.1.1
 
11370
  punycode: 1.4.1
11371
  qs: 6.12.3
11372
 
11373
11374
+ dependencies:
11375
+ react: 18.3.1
11376
+ tslib: 2.6.3
11377
+ optionalDependencies:
11378
+ '@types/react': 18.3.3
11379
+
11380
11381
+ dependencies:
11382
+ detect-node-es: 1.1.0
11383
+ react: 18.3.1
11384
+ tslib: 2.6.3
11385
+ optionalDependencies:
11386
+ '@types/react': 18.3.3
11387
+
11388
11389
  dependencies:
11390
  react: 18.3.1