a tool for shared writing and social publishing
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

added tooltips to text toolbar

celine ac144017 554e1637

+1026 -159
+1 -1
components/BlockOptions.tsx
··· 174 174 id="block-link-input" 175 175 type="url" 176 176 className="w-full grow border-none outline-none bg-transparent " 177 - placeholder="www.leaflet.pub" 177 + placeholder="add a link..." 178 178 value={linkValue} 179 179 onChange={(e) => setLinkValue(e.target.value)} 180 180 onBlur={() => setLinkOpen(false)}
+1 -1
components/Cards.tsx
··· 9 9 import { Replicache } from "replicache"; 10 10 import { Fact, ReplicacheMutators, useReplicache } from "src/replicache"; 11 11 import * as Popover from "@radix-ui/react-popover"; 12 - import { MoreOptionsTiny, DeleteSmall, CloseTiny } from "./Icons"; 12 + import { MoreOptionsTiny, DeleteSmall, CloseTiny, PopoverArrow } from "./Icons"; 13 13 import { useToaster } from "./Toast"; 14 14 import { ShareOptions } from "./ShareOptions"; 15 15 import { MenuItem, Menu } from "./Layout";
+26
components/Icons.tsx
··· 607 607 </svg> 608 608 ); 609 609 }; 610 + 611 + // OTHER ICONS 612 + 613 + export const PopoverArrow = ( 614 + props: { arrowFill: string; arrowStroke: string } & Props, 615 + ) => { 616 + return ( 617 + <svg 618 + {...props} 619 + width="16" 620 + height="8" 621 + viewBox="0 0 16 8" 622 + fill="none" 623 + xmlns="http://www.w3.org/2000/svg" 624 + > 625 + <path 626 + d="M15.1975 0L0.951538 0.00460007L8.07229 7.31325L15.1975 0Z" 627 + fill={props.arrowFill} 628 + /> 629 + <path 630 + d="M16 0L8.35386 7.84887C8.15753 8.05038 7.83922 8.05038 7.64289 7.84887L0 0.00420923L1.42188 0.00424847L7.99837 6.75428L14.579 0H16Z" 631 + fill={props.arrowStroke} 632 + /> 633 + </svg> 634 + ); 635 + };
+10
components/Layout.tsx
··· 25 25 </button> 26 26 ); 27 27 }; 28 + 29 + export const ShortcutKey = (props: { children: React.ReactNode }) => { 30 + return ( 31 + <span> 32 + <code className="min-w-6 w-fit text-xs text-primary bg-border-light border border-secondary rounded-md px-0.5 flex justify-center "> 33 + {props.children} 34 + </code> 35 + </span> 36 + ); 37 + };
+3 -4
components/Toolbar/LinkButton.tsx
··· 34 34 props.setToolBarState("link"); 35 35 }} 36 36 disabled={focusedEditor?.editor.selection.empty} 37 + tooltipContent={<div className="text-accent underline">Inline Link</div>} 37 38 > 38 39 <LinkTextToolbarSmall /> 39 40 </ToolbarButton> ··· 69 70 70 71 return ( 71 72 <div className="w-full flex items-center gap-[6px]"> 72 - <ToolbarButton onClick={() => props.onClose()}> 73 - <LinkTextToolbarSmall /> 74 - </ToolbarButton> 73 + <LinkTextToolbarSmall /> 75 74 <Separator classname="h-6" /> 76 75 <input 77 76 autoFocus 78 77 className="w-full grow bg-transparent border-none outline-none " 79 - placeholder="www.leaflet.pub" 78 + placeholder="add a link..." 80 79 value={linkValue} 81 80 onChange={(e) => setLinkValue(e.target.value)} 82 81 onKeyDown={(e) => {
+7 -2
components/Toolbar/TextBlockTypeButtons.tsx
··· 49 49 // This Toolbar should close once the user starts typing again 50 50 <div className="flex w-full justify-between items-center gap-4"> 51 51 <div className="flex items-center gap-[6px]"> 52 - <ToolbarButton className="w-10 flex justify-center" active> 52 + <div className="w-8 flex justify-center"> 53 53 <BlockTypeIcon entityID={focusedBlock?.entityID} /> 54 - </ToolbarButton> 54 + </div> 55 55 <Separator classname="h-6" /> 56 56 <ToolbarButton 57 57 onClick={() => { ··· 61 61 blockType?.data.value === "heading" && 62 62 headingLevel?.data.value === 1 63 63 } 64 + tooltipContent={<div className="">Title</div>} 64 65 > 65 66 <Header1Small /> 66 67 </ToolbarButton> ··· 72 73 blockType?.data.value === "heading" && 73 74 headingLevel?.data.value === 2 74 75 } 76 + tooltipContent={<div>Heading</div>} 75 77 > 76 78 <Header2Small /> 77 79 </ToolbarButton> ··· 83 85 blockType?.data.value === "heading" && 84 86 headingLevel?.data.value === 3 85 87 } 88 + tooltipContent={<div>Subheading</div>} 86 89 > 87 90 <Header3Small /> 88 91 </ToolbarButton> ··· 102 105 }} 103 106 active={blockType?.data.value === "text"} 104 107 className="px-[6px]" 108 + tooltipContent={<div>Paragraph</div>} 105 109 > 106 110 Paragraph 107 111 </ToolbarButton> ··· 133 137 let focusedBlock = useUIState((s) => s.focusedBlock); 134 138 return ( 135 139 <ToolbarButton 140 + tooltipContent={<div>Format Text</div>} 136 141 active 137 142 onClick={() => { 138 143 props.setToolbarState("header");
+3
components/Toolbar/TextDecorationButton.tsx
··· 6 6 import { publishAppEvent } from "src/eventBus"; 7 7 import { useEditorStates } from "src/state/useEditorState"; 8 8 import { rangeHasMark } from "src/utils/prosemirror/rangeHasMark"; 9 + import { ShortcutKey } from "components/Layout"; 9 10 10 11 export function TextDecorationButton(props: { 11 12 mark: MarkType; 12 13 attrs?: any; 13 14 icon: React.ReactNode; 15 + tooltipContent: React.ReactNode; 14 16 }) { 15 17 let focusedBlock = useUIState((s) => s.focusedBlock); 16 18 let focusedEditor = useEditorStates((s) => ··· 39 41 e.preventDefault(); 40 42 toggleMarkInFocusedBlock(props.mark, props.attrs); 41 43 }} 44 + tooltipContent={props.tooltipContent} 42 45 > 43 46 {props.icon} 44 47 </ToolbarButton>
+204 -139
components/Toolbar/index.tsx
··· 1 1 "use client"; 2 2 3 - import { useCallback, useEffect, useState } from "react"; 3 + import React, { useCallback, useEffect, useState } from "react"; 4 4 import { 5 5 BoldSmall, 6 6 CloseTiny, ··· 17 17 StrikethroughSmall, 18 18 HighlightSmall, 19 19 CheckTiny, 20 + PopoverArrow, 20 21 } from "components/Icons"; 21 22 import { create } from "zustand"; 22 23 import { combine } from "zustand/middleware"; ··· 42 43 import { generateKeyBetween } from "fractional-indexing"; 43 44 import { focusCard } from "components/Cards"; 44 45 import { addLinkBlock } from "src/utils/addLinkBlock"; 46 + import * as Tooltip from "@radix-ui/react-tooltip"; 47 + import { Separator, ShortcutKey } from "components/Layout"; 45 48 46 49 export const TextToolbar = (props: { cardID: string; blockID: string }) => { 47 50 let { rep } = useReplicache(); ··· 72 75 }, [blockEmpty, selected]); 73 76 74 77 return ( 75 - <div className="flex items-center justify-between w-full gap-6"> 76 - <div className="flex gap-[6px] items-center"> 77 - {toolbarState === "default" ? ( 78 - <> 79 - <TextDecorationButton 80 - mark={schema.marks.strong} 81 - icon={<BoldSmall />} 82 - /> 83 - <TextDecorationButton 84 - mark={schema.marks.em} 85 - icon={<ItalicSmall />} 86 - /> 87 - <TextDecorationButton 88 - mark={schema.marks.strikethrough} 89 - icon={<StrikethroughSmall />} 90 - /> 91 - <div className="flex items-center gap-1"> 78 + <Tooltip.Provider> 79 + <div className="flex items-center justify-between w-full gap-6"> 80 + <div className="flex gap-[6px] items-center"> 81 + {toolbarState === "default" ? ( 82 + <> 92 83 <TextDecorationButton 93 - attrs={{ color: lastUsedHighlight }} 94 - mark={schema.marks.highlight} 95 - icon={<HighlightSmall />} 84 + tooltipContent={ 85 + <div className="flex flex-col gap-1 justify-center"> 86 + <div className="text-center">Bold </div> 87 + <div className="flex gap-1"> 88 + <ShortcutKey> Cntrl </ShortcutKey> +{" "} 89 + <ShortcutKey> B </ShortcutKey> 90 + </div> 91 + </div> 92 + } 93 + mark={schema.marks.strong} 94 + icon={<BoldSmall />} 96 95 /> 97 - <button 98 - onClick={() => { 99 - setToolbarState("highlight"); 100 - }} 101 - className="pr-2" 102 - > 103 - <div 104 - className={`w-2 h-[22px] rounded-[2px] border border-border`} 105 - style={{ 106 - backgroundColor: 107 - lastUsedHighlight === "1" 108 - ? theme.colors["highlight-1"] 109 - : lastUsedHighlight === "2" 110 - ? theme.colors["highlight-2"] 111 - : theme.colors["highlight-3"], 112 - }} 96 + <TextDecorationButton 97 + tooltipContent=<div className="flex flex-col gap-1 justify-center"> 98 + <div className="italic font-normal text-center">Italic</div> 99 + <div className="flex gap-1"> 100 + <ShortcutKey> Cntrl </ShortcutKey> +{" "} 101 + <ShortcutKey> I </ShortcutKey> 102 + </div> 103 + </div> 104 + mark={schema.marks.em} 105 + icon={<ItalicSmall />} 106 + /> 107 + <TextDecorationButton 108 + tooltipContent={ 109 + <div className="flex flex-col gap-1 justify-center"> 110 + <div className="text-center font-normal line-through"> 111 + Strikethrough 112 + </div> 113 + <div className="flex gap-1"> 114 + <ShortcutKey> Cntrl </ShortcutKey> +{" "} 115 + <ShortcutKey> Cmd </ShortcutKey> +{" "} 116 + <ShortcutKey> X </ShortcutKey> 117 + </div> 118 + </div> 119 + } 120 + mark={schema.marks.strikethrough} 121 + icon={<StrikethroughSmall />} 122 + /> 123 + <div className="flex items-center gap-1"> 124 + <TextDecorationButton 125 + tooltipContent={ 126 + <div className="flex flex-col gap-1 justify-center"> 127 + <div className="text-center bg-border-light w-fit rounded-md px-0.5 mx-auto "> 128 + Highlight 129 + </div> 130 + <div className="flex gap-1"> 131 + <ShortcutKey> Cntrl </ShortcutKey> +{" "} 132 + <ShortcutKey> Cmd </ShortcutKey> +{" "} 133 + <ShortcutKey> H </ShortcutKey> 134 + </div> 135 + </div> 136 + } 137 + attrs={{ color: lastUsedHighlight }} 138 + mark={schema.marks.highlight} 139 + icon={<HighlightSmall />} 113 140 /> 114 - </button> 115 - </div> 141 + <button 142 + onClick={() => { 143 + setToolbarState("highlight"); 144 + }} 145 + className="pr-2" 146 + > 147 + <div 148 + className={`w-2 h-[22px] rounded-[2px] border border-border`} 149 + style={{ 150 + backgroundColor: 151 + lastUsedHighlight === "1" 152 + ? theme.colors["highlight-1"] 153 + : lastUsedHighlight === "2" 154 + ? theme.colors["highlight-2"] 155 + : theme.colors["highlight-3"], 156 + }} 157 + /> 158 + </button> 159 + </div> 116 160 117 - <Separator /> 118 - {/* possibly link is only available if text is actively selected */} 119 - <LinkButton setToolBarState={setToolbarState} /> 120 - <Separator /> 121 - <TextBlockTypeButton setToolbarState={setToolbarState} /> 122 - </> 123 - ) : toolbarState === "highlight" ? ( 124 - <HighlightToolbar 125 - onClose={() => setToolbarState("default")} 126 - lastUsedHighlight={lastUsedHighlight} 127 - setLastUsedHighlight={(color: "1" | "2" | "3") => 128 - setlastUsedHighlight(color) 129 - } 130 - /> 131 - ) : toolbarState === "link" ? ( 132 - <LinkEditor onClose={() => setToolbarState("default")} /> 133 - ) : toolbarState === "header" ? ( 134 - <TextBlockTypeButtons onClose={() => setToolbarState("default")} /> 135 - ) : toolbarState === "block" ? ( 136 - <BlockToolbar 137 - setToolbarState={setToolbarState} 138 - onClose={() => { 139 - if (blockEmpty) 140 - useUIState.setState(() => ({ 141 - focusedBlock: { 142 - type: "card", 143 - entityID: props.cardID, 144 - }, 145 - selectedBlock: [], 146 - })); 161 + <Separator classname="h-6" /> 162 + {/* possibly link is only available if text is actively selected */} 163 + <LinkButton setToolBarState={setToolbarState} /> 164 + <Separator classname="h-6" /> 165 + <TextBlockTypeButton setToolbarState={setToolbarState} /> 166 + </> 167 + ) : toolbarState === "highlight" ? ( 168 + <HighlightToolbar 169 + onClose={() => setToolbarState("default")} 170 + lastUsedHighlight={lastUsedHighlight} 171 + setLastUsedHighlight={(color: "1" | "2" | "3") => 172 + setlastUsedHighlight(color) 173 + } 174 + /> 175 + ) : toolbarState === "link" ? ( 176 + <LinkEditor onClose={() => setToolbarState("default")} /> 177 + ) : toolbarState === "header" ? ( 178 + <TextBlockTypeButtons onClose={() => setToolbarState("default")} /> 179 + ) : toolbarState === "block" ? ( 180 + <BlockToolbar 181 + setToolbarState={setToolbarState} 182 + onClose={() => { 183 + if (blockEmpty) 184 + useUIState.setState(() => ({ 185 + focusedBlock: { 186 + type: "card", 187 + entityID: props.cardID, 188 + }, 189 + selectedBlock: [], 190 + })); 191 + setToolbarState("default"); 192 + }} 193 + /> 194 + ) : toolbarState === "linkBlock" ? ( 195 + <LinkBlockToolbar 196 + onClose={() => { 197 + setToolbarState("block"); 198 + }} 199 + /> 200 + ) : null} 201 + </div> 202 + <button 203 + className="hover:text-accent" 204 + onClick={() => { 205 + if (toolbarState === "linkBlock") { 206 + setToolbarState("link"); 207 + } else if (toolbarState === "default") { 208 + useUIState.setState(() => ({ 209 + focusedBlock: { 210 + type: "card", 211 + entityID: props.cardID, 212 + }, 213 + selectedBlock: [], 214 + })); 215 + } else { 147 216 setToolbarState("default"); 148 - }} 149 - /> 150 - ) : toolbarState === "linkBlock" ? ( 151 - <LinkBlockToolbar 152 - onClose={() => { 153 - setToolbarState("block"); 154 - }} 155 - /> 156 - ) : null} 217 + } 218 + }} 219 + > 220 + <CloseTiny /> 221 + </button> 157 222 </div> 158 - <button 159 - onClick={() => { 160 - if (toolbarState === "linkBlock") { 161 - setToolbarState("link"); 162 - } else if (toolbarState === "default") { 163 - useUIState.setState(() => ({ 164 - focusedBlock: { 165 - type: "card", 166 - entityID: props.cardID, 167 - }, 168 - selectedBlock: [], 169 - })); 170 - } else { 171 - setToolbarState("default"); 172 - } 173 - }} 174 - > 175 - <CloseTiny /> 176 - </button> 177 - </div> 223 + </Tooltip.Provider> 178 224 ); 179 225 }; 180 226 ··· 221 267 id="block-link-input" 222 268 type="url" 223 269 className="w-full grow border-none outline-none bg-transparent " 224 - placeholder="www.leaflet.pub" 270 + placeholder="add a link..." 225 271 value={linkValue} 226 272 onChange={(e) => setLinkValue(e.target.value)} 227 273 onKeyDown={(e) => { ··· 254 300 return ( 255 301 <div className="flex w-full justify-between items-center gap-4 text-secondary"> 256 302 <div className="flex items-center gap-[6px]"> 257 - <ToolbarButton onClick={() => props.onClose()}> 258 - <HighlightSmall /> 259 - </ToolbarButton> 260 - <Separator /> 303 + <HighlightSmall /> 304 + <Separator classname="h-6" /> 261 305 <HighlightColorButton 262 306 color="1" 263 307 lastUsedHighlight={props.lastUsedHighlight} ··· 284 328 return ( 285 329 <div className="flex w-full justify-between items-center gap-4"> 286 330 <div className="flex items-center gap-[6px]"> 287 - <ToolbarButton onClick={() => props.onClose()}> 331 + <ToolbarButton 332 + onClick={() => props.onClose()} 333 + tooltipContent={<div></div>} 334 + > 288 335 <ListOrderedSmall /> 289 336 </ToolbarButton> 290 - <Separator /> 291 - <ToolbarButton onClick={() => {}}> 337 + <Separator classname="h-6" /> 338 + <ToolbarButton onClick={() => {}} tooltipContent={<div></div>}> 292 339 <ListUnorderedSmall /> 293 340 </ToolbarButton> 294 - <ToolbarButton onClick={() => {}}> 341 + <ToolbarButton onClick={() => {}} tooltipContent={<div></div>}> 295 342 <ListOrderedSmall /> 296 343 </ToolbarButton> 297 344 298 345 {/* if there is no list and you click and indent button, then it should create a list */} 299 - <ToolbarButton> 346 + <ToolbarButton tooltipContent={<div></div>}> 300 347 <ListIndentIncreaseSmall /> 301 348 </ToolbarButton> 302 - <ToolbarButton> 349 + <ToolbarButton tooltipContent={<div></div>}> 303 350 <ListIndentDecreaseSmall /> 304 351 </ToolbarButton> 305 352 </div> ··· 347 394 return ( 348 395 <div className="flex w-full justify-between items-center gap-4"> 349 396 <div className="flex items-center gap-[6px]"> 350 - <ToolbarButton onClick={() => props.onClose()}> 351 - <BlockSmall /> 352 - </ToolbarButton> 353 - <Separator /> 354 - <ToolbarButton> 397 + <BlockSmall /> 398 + <Separator classname="h-6" /> 399 + <ToolbarButton tooltipContent=<div>Add an Image</div>> 355 400 <label 356 401 className="blockOptionsImage hover:cursor-pointer flex place-items-center" 357 402 onMouseDown={(e) => e.preventDefault()} ··· 380 425 </div> 381 426 </label> 382 427 </ToolbarButton> 383 - <ToolbarButton onClick={() => props.setToolbarState("linkBlock")}> 428 + <ToolbarButton 429 + onClick={() => props.setToolbarState("linkBlock")} 430 + tooltipContent=<div>Add a Link</div> 431 + > 384 432 <BlockLinkSmall /> 385 433 </ToolbarButton> 386 434 <ToolbarButton 435 + tooltipContent=<div>Add a Page</div> 387 436 onClick={async () => { 388 437 if (!focusedBlock || !rep) return; 389 438 let [entity, parent] = await getEntity(); ··· 415 464 export const ToolbarButton = (props: { 416 465 className?: string; 417 466 onClick?: (e: React.MouseEvent) => void; 467 + tooltipContent: React.ReactNode; 418 468 children: React.ReactNode; 419 469 active?: boolean; 420 470 disabled?: boolean; 421 471 }) => { 472 + console.log(props.tooltipContent); 422 473 return ( 423 - <button 424 - disabled={props.disabled} 425 - className={` 426 - rounded-md active:bg-border active:text-primary 427 - ${props.className} 428 - ${ 429 - props.active 430 - ? "bg-border text-primary" 431 - : props.disabled 432 - ? "text-border cursor-not-allowed" 433 - : "text-secondary" 434 - } 435 - `} 436 - onMouseDown={(e) => { 437 - e.preventDefault(); 438 - props.onClick && props.onClick(e); 439 - }} 440 - > 441 - {props.children} 442 - </button> 443 - ); 444 - }; 474 + <Tooltip.Root> 475 + <Tooltip.Trigger 476 + disabled={props.disabled} 477 + className={` 478 + rounded-md active:bg-border active:text-primary 479 + ${props.className} 480 + ${ 481 + props.active 482 + ? "bg-border text-primary" 483 + : props.disabled 484 + ? "text-border cursor-not-allowed" 485 + : "text-secondary hover:bg-border hover:text-primary" 486 + } 487 + `} 488 + onMouseDown={(e) => { 489 + e.preventDefault(); 490 + props.onClick && props.onClick(e); 491 + }} 492 + > 493 + {props.children} 494 + </Tooltip.Trigger> 445 495 446 - const Separator = () => { 447 - return <div className="h-6 border-r border-border" />; 496 + <Tooltip.Portal> 497 + <Tooltip.Content 498 + sideOffset={6} 499 + className="z-10 bg-border rounded-md py-1 px-[6px] font-bold text-secondary text-sm" 500 + > 501 + {props.tooltipContent} 502 + {/* fill={theme.colors["border"]}s */} 503 + <Tooltip.Arrow asChild width={16} height={8} viewBox="0 0 16 8"> 504 + <PopoverArrow 505 + arrowFill={theme.colors["border"]} 506 + arrowStroke="transparent" 507 + /> 508 + </Tooltip.Arrow> 509 + </Tooltip.Content> 510 + </Tooltip.Portal> 511 + </Tooltip.Root> 512 + ); 448 513 };
+770 -12
package-lock.json
··· 13 13 "@nytimes/react-prosemirror": "^0.6.1", 14 14 "@radix-ui/react-popover": "^1.0.7", 15 15 "@radix-ui/react-slider": "^1.1.2", 16 + "@radix-ui/react-tooltip": "^1.1.2", 16 17 "@react-aria/utils": "^3.24.1", 17 18 "@react-spring/web": "^9.7.3", 18 19 "@supabase/ssr": "^0.3.0", ··· 1109 1110 "dependencies": { 1110 1111 "@floating-ui/core": "^1.0.0", 1111 1112 "@floating-ui/utils": "^0.2.0" 1113 + } 1114 + }, 1115 + "node_modules/@floating-ui/react-dom": { 1116 + "version": "2.1.1", 1117 + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.1.tgz", 1118 + "integrity": "sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==", 1119 + "dependencies": { 1120 + "@floating-ui/dom": "^1.0.0" 1121 + }, 1122 + "peerDependencies": { 1123 + "react": ">=16.8.0", 1124 + "react-dom": ">=16.8.0" 1112 1125 } 1113 1126 }, 1114 1127 "node_modules/@floating-ui/utils": { ··· 2415 2428 "@babel/runtime": "^7.13.10" 2416 2429 } 2417 2430 }, 2431 + "node_modules/@radix-ui/react-arrow": { 2432 + "version": "1.1.0", 2433 + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", 2434 + "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==", 2435 + "dependencies": { 2436 + "@radix-ui/react-primitive": "2.0.0" 2437 + }, 2438 + "peerDependencies": { 2439 + "@types/react": "*", 2440 + "@types/react-dom": "*", 2441 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 2442 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 2443 + }, 2444 + "peerDependenciesMeta": { 2445 + "@types/react": { 2446 + "optional": true 2447 + }, 2448 + "@types/react-dom": { 2449 + "optional": true 2450 + } 2451 + } 2452 + }, 2453 + "node_modules/@radix-ui/react-arrow/node_modules/@radix-ui/react-compose-refs": { 2454 + "version": "1.1.0", 2455 + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", 2456 + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", 2457 + "peerDependencies": { 2458 + "@types/react": "*", 2459 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 2460 + }, 2461 + "peerDependenciesMeta": { 2462 + "@types/react": { 2463 + "optional": true 2464 + } 2465 + } 2466 + }, 2467 + "node_modules/@radix-ui/react-arrow/node_modules/@radix-ui/react-primitive": { 2468 + "version": "2.0.0", 2469 + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", 2470 + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", 2471 + "dependencies": { 2472 + "@radix-ui/react-slot": "1.1.0" 2473 + }, 2474 + "peerDependencies": { 2475 + "@types/react": "*", 2476 + "@types/react-dom": "*", 2477 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 2478 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 2479 + }, 2480 + "peerDependenciesMeta": { 2481 + "@types/react": { 2482 + "optional": true 2483 + }, 2484 + "@types/react-dom": { 2485 + "optional": true 2486 + } 2487 + } 2488 + }, 2489 + "node_modules/@radix-ui/react-arrow/node_modules/@radix-ui/react-slot": { 2490 + "version": "1.1.0", 2491 + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", 2492 + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", 2493 + "dependencies": { 2494 + "@radix-ui/react-compose-refs": "1.1.0" 2495 + }, 2496 + "peerDependencies": { 2497 + "@types/react": "*", 2498 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 2499 + }, 2500 + "peerDependenciesMeta": { 2501 + "@types/react": { 2502 + "optional": true 2503 + } 2504 + } 2505 + }, 2418 2506 "node_modules/@radix-ui/react-collection": { 2419 2507 "version": "1.0.3", 2420 2508 "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz", ··· 2492 2580 } 2493 2581 } 2494 2582 }, 2583 + "node_modules/@radix-ui/react-dismissable-layer": { 2584 + "version": "1.1.0", 2585 + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz", 2586 + "integrity": "sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==", 2587 + "dependencies": { 2588 + "@radix-ui/primitive": "1.1.0", 2589 + "@radix-ui/react-compose-refs": "1.1.0", 2590 + "@radix-ui/react-primitive": "2.0.0", 2591 + "@radix-ui/react-use-callback-ref": "1.1.0", 2592 + "@radix-ui/react-use-escape-keydown": "1.1.0" 2593 + }, 2594 + "peerDependencies": { 2595 + "@types/react": "*", 2596 + "@types/react-dom": "*", 2597 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 2598 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 2599 + }, 2600 + "peerDependenciesMeta": { 2601 + "@types/react": { 2602 + "optional": true 2603 + }, 2604 + "@types/react-dom": { 2605 + "optional": true 2606 + } 2607 + } 2608 + }, 2609 + "node_modules/@radix-ui/react-dismissable-layer/node_modules/@radix-ui/primitive": { 2610 + "version": "1.1.0", 2611 + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", 2612 + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" 2613 + }, 2614 + "node_modules/@radix-ui/react-dismissable-layer/node_modules/@radix-ui/react-compose-refs": { 2615 + "version": "1.1.0", 2616 + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", 2617 + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", 2618 + "peerDependencies": { 2619 + "@types/react": "*", 2620 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 2621 + }, 2622 + "peerDependenciesMeta": { 2623 + "@types/react": { 2624 + "optional": true 2625 + } 2626 + } 2627 + }, 2628 + "node_modules/@radix-ui/react-dismissable-layer/node_modules/@radix-ui/react-primitive": { 2629 + "version": "2.0.0", 2630 + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", 2631 + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", 2632 + "dependencies": { 2633 + "@radix-ui/react-slot": "1.1.0" 2634 + }, 2635 + "peerDependencies": { 2636 + "@types/react": "*", 2637 + "@types/react-dom": "*", 2638 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 2639 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 2640 + }, 2641 + "peerDependenciesMeta": { 2642 + "@types/react": { 2643 + "optional": true 2644 + }, 2645 + "@types/react-dom": { 2646 + "optional": true 2647 + } 2648 + } 2649 + }, 2650 + "node_modules/@radix-ui/react-dismissable-layer/node_modules/@radix-ui/react-slot": { 2651 + "version": "1.1.0", 2652 + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", 2653 + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", 2654 + "dependencies": { 2655 + "@radix-ui/react-compose-refs": "1.1.0" 2656 + }, 2657 + "peerDependencies": { 2658 + "@types/react": "*", 2659 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 2660 + }, 2661 + "peerDependenciesMeta": { 2662 + "@types/react": { 2663 + "optional": true 2664 + } 2665 + } 2666 + }, 2667 + "node_modules/@radix-ui/react-dismissable-layer/node_modules/@radix-ui/react-use-callback-ref": { 2668 + "version": "1.1.0", 2669 + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", 2670 + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", 2671 + "peerDependencies": { 2672 + "@types/react": "*", 2673 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 2674 + }, 2675 + "peerDependenciesMeta": { 2676 + "@types/react": { 2677 + "optional": true 2678 + } 2679 + } 2680 + }, 2681 + "node_modules/@radix-ui/react-id": { 2682 + "version": "1.1.0", 2683 + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", 2684 + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", 2685 + "dependencies": { 2686 + "@radix-ui/react-use-layout-effect": "1.1.0" 2687 + }, 2688 + "peerDependencies": { 2689 + "@types/react": "*", 2690 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 2691 + }, 2692 + "peerDependenciesMeta": { 2693 + "@types/react": { 2694 + "optional": true 2695 + } 2696 + } 2697 + }, 2698 + "node_modules/@radix-ui/react-id/node_modules/@radix-ui/react-use-layout-effect": { 2699 + "version": "1.1.0", 2700 + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", 2701 + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", 2702 + "peerDependencies": { 2703 + "@types/react": "*", 2704 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 2705 + }, 2706 + "peerDependenciesMeta": { 2707 + "@types/react": { 2708 + "optional": true 2709 + } 2710 + } 2711 + }, 2495 2712 "node_modules/@radix-ui/react-popover": { 2496 2713 "version": "1.0.7", 2497 2714 "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.0.7.tgz", ··· 2666 2883 } 2667 2884 } 2668 2885 }, 2669 - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-popper/node_modules/@floating-ui/react-dom": { 2670 - "version": "2.1.0", 2671 - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.0.tgz", 2672 - "integrity": "sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==", 2673 - "dependencies": { 2674 - "@floating-ui/dom": "^1.0.0" 2675 - }, 2676 - "peerDependencies": { 2677 - "react": ">=16.8.0", 2678 - "react-dom": ">=16.8.0" 2679 - } 2680 - }, 2681 2886 "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-arrow": { 2682 2887 "version": "1.0.3", 2683 2888 "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz", ··· 2874 3079 } 2875 3080 } 2876 3081 }, 3082 + "node_modules/@radix-ui/react-popper": { 3083 + "version": "1.2.0", 3084 + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz", 3085 + "integrity": "sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==", 3086 + "dependencies": { 3087 + "@floating-ui/react-dom": "^2.0.0", 3088 + "@radix-ui/react-arrow": "1.1.0", 3089 + "@radix-ui/react-compose-refs": "1.1.0", 3090 + "@radix-ui/react-context": "1.1.0", 3091 + "@radix-ui/react-primitive": "2.0.0", 3092 + "@radix-ui/react-use-callback-ref": "1.1.0", 3093 + "@radix-ui/react-use-layout-effect": "1.1.0", 3094 + "@radix-ui/react-use-rect": "1.1.0", 3095 + "@radix-ui/react-use-size": "1.1.0", 3096 + "@radix-ui/rect": "1.1.0" 3097 + }, 3098 + "peerDependencies": { 3099 + "@types/react": "*", 3100 + "@types/react-dom": "*", 3101 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 3102 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3103 + }, 3104 + "peerDependenciesMeta": { 3105 + "@types/react": { 3106 + "optional": true 3107 + }, 3108 + "@types/react-dom": { 3109 + "optional": true 3110 + } 3111 + } 3112 + }, 3113 + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-compose-refs": { 3114 + "version": "1.1.0", 3115 + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", 3116 + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", 3117 + "peerDependencies": { 3118 + "@types/react": "*", 3119 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3120 + }, 3121 + "peerDependenciesMeta": { 3122 + "@types/react": { 3123 + "optional": true 3124 + } 3125 + } 3126 + }, 3127 + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-context": { 3128 + "version": "1.1.0", 3129 + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", 3130 + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", 3131 + "peerDependencies": { 3132 + "@types/react": "*", 3133 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3134 + }, 3135 + "peerDependenciesMeta": { 3136 + "@types/react": { 3137 + "optional": true 3138 + } 3139 + } 3140 + }, 3141 + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-primitive": { 3142 + "version": "2.0.0", 3143 + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", 3144 + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", 3145 + "dependencies": { 3146 + "@radix-ui/react-slot": "1.1.0" 3147 + }, 3148 + "peerDependencies": { 3149 + "@types/react": "*", 3150 + "@types/react-dom": "*", 3151 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 3152 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3153 + }, 3154 + "peerDependenciesMeta": { 3155 + "@types/react": { 3156 + "optional": true 3157 + }, 3158 + "@types/react-dom": { 3159 + "optional": true 3160 + } 3161 + } 3162 + }, 3163 + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-slot": { 3164 + "version": "1.1.0", 3165 + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", 3166 + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", 3167 + "dependencies": { 3168 + "@radix-ui/react-compose-refs": "1.1.0" 3169 + }, 3170 + "peerDependencies": { 3171 + "@types/react": "*", 3172 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3173 + }, 3174 + "peerDependenciesMeta": { 3175 + "@types/react": { 3176 + "optional": true 3177 + } 3178 + } 3179 + }, 3180 + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-use-callback-ref": { 3181 + "version": "1.1.0", 3182 + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", 3183 + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", 3184 + "peerDependencies": { 3185 + "@types/react": "*", 3186 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3187 + }, 3188 + "peerDependenciesMeta": { 3189 + "@types/react": { 3190 + "optional": true 3191 + } 3192 + } 3193 + }, 3194 + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-use-layout-effect": { 3195 + "version": "1.1.0", 3196 + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", 3197 + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", 3198 + "peerDependencies": { 3199 + "@types/react": "*", 3200 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3201 + }, 3202 + "peerDependenciesMeta": { 3203 + "@types/react": { 3204 + "optional": true 3205 + } 3206 + } 3207 + }, 3208 + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-use-size": { 3209 + "version": "1.1.0", 3210 + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", 3211 + "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", 3212 + "dependencies": { 3213 + "@radix-ui/react-use-layout-effect": "1.1.0" 3214 + }, 3215 + "peerDependencies": { 3216 + "@types/react": "*", 3217 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3218 + }, 3219 + "peerDependenciesMeta": { 3220 + "@types/react": { 3221 + "optional": true 3222 + } 3223 + } 3224 + }, 3225 + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/rect": { 3226 + "version": "1.1.0", 3227 + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", 3228 + "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==" 3229 + }, 3230 + "node_modules/@radix-ui/react-portal": { 3231 + "version": "1.1.1", 3232 + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.1.tgz", 3233 + "integrity": "sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==", 3234 + "dependencies": { 3235 + "@radix-ui/react-primitive": "2.0.0", 3236 + "@radix-ui/react-use-layout-effect": "1.1.0" 3237 + }, 3238 + "peerDependencies": { 3239 + "@types/react": "*", 3240 + "@types/react-dom": "*", 3241 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 3242 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3243 + }, 3244 + "peerDependenciesMeta": { 3245 + "@types/react": { 3246 + "optional": true 3247 + }, 3248 + "@types/react-dom": { 3249 + "optional": true 3250 + } 3251 + } 3252 + }, 3253 + "node_modules/@radix-ui/react-portal/node_modules/@radix-ui/react-compose-refs": { 3254 + "version": "1.1.0", 3255 + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", 3256 + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", 3257 + "peerDependencies": { 3258 + "@types/react": "*", 3259 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3260 + }, 3261 + "peerDependenciesMeta": { 3262 + "@types/react": { 3263 + "optional": true 3264 + } 3265 + } 3266 + }, 3267 + "node_modules/@radix-ui/react-portal/node_modules/@radix-ui/react-primitive": { 3268 + "version": "2.0.0", 3269 + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", 3270 + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", 3271 + "dependencies": { 3272 + "@radix-ui/react-slot": "1.1.0" 3273 + }, 3274 + "peerDependencies": { 3275 + "@types/react": "*", 3276 + "@types/react-dom": "*", 3277 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 3278 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3279 + }, 3280 + "peerDependenciesMeta": { 3281 + "@types/react": { 3282 + "optional": true 3283 + }, 3284 + "@types/react-dom": { 3285 + "optional": true 3286 + } 3287 + } 3288 + }, 3289 + "node_modules/@radix-ui/react-portal/node_modules/@radix-ui/react-slot": { 3290 + "version": "1.1.0", 3291 + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", 3292 + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", 3293 + "dependencies": { 3294 + "@radix-ui/react-compose-refs": "1.1.0" 3295 + }, 3296 + "peerDependencies": { 3297 + "@types/react": "*", 3298 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3299 + }, 3300 + "peerDependenciesMeta": { 3301 + "@types/react": { 3302 + "optional": true 3303 + } 3304 + } 3305 + }, 3306 + "node_modules/@radix-ui/react-portal/node_modules/@radix-ui/react-use-layout-effect": { 3307 + "version": "1.1.0", 3308 + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", 3309 + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", 3310 + "peerDependencies": { 3311 + "@types/react": "*", 3312 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3313 + }, 3314 + "peerDependenciesMeta": { 3315 + "@types/react": { 3316 + "optional": true 3317 + } 3318 + } 3319 + }, 3320 + "node_modules/@radix-ui/react-presence": { 3321 + "version": "1.1.0", 3322 + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", 3323 + "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", 3324 + "dependencies": { 3325 + "@radix-ui/react-compose-refs": "1.1.0", 3326 + "@radix-ui/react-use-layout-effect": "1.1.0" 3327 + }, 3328 + "peerDependencies": { 3329 + "@types/react": "*", 3330 + "@types/react-dom": "*", 3331 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 3332 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3333 + }, 3334 + "peerDependenciesMeta": { 3335 + "@types/react": { 3336 + "optional": true 3337 + }, 3338 + "@types/react-dom": { 3339 + "optional": true 3340 + } 3341 + } 3342 + }, 3343 + "node_modules/@radix-ui/react-presence/node_modules/@radix-ui/react-compose-refs": { 3344 + "version": "1.1.0", 3345 + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", 3346 + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", 3347 + "peerDependencies": { 3348 + "@types/react": "*", 3349 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3350 + }, 3351 + "peerDependenciesMeta": { 3352 + "@types/react": { 3353 + "optional": true 3354 + } 3355 + } 3356 + }, 3357 + "node_modules/@radix-ui/react-presence/node_modules/@radix-ui/react-use-layout-effect": { 3358 + "version": "1.1.0", 3359 + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", 3360 + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", 3361 + "peerDependencies": { 3362 + "@types/react": "*", 3363 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3364 + }, 3365 + "peerDependenciesMeta": { 3366 + "@types/react": { 3367 + "optional": true 3368 + } 3369 + } 3370 + }, 2877 3371 "node_modules/@radix-ui/react-primitive": { 2878 3372 "version": "1.0.3", 2879 3373 "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", ··· 2948 3442 } 2949 3443 } 2950 3444 }, 3445 + "node_modules/@radix-ui/react-tooltip": { 3446 + "version": "1.1.2", 3447 + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.2.tgz", 3448 + "integrity": "sha512-9XRsLwe6Yb9B/tlnYCPVUd/TFS4J7HuOZW345DCeC6vKIxQGMZdx21RK4VoZauPD5frgkXTYVS5y90L+3YBn4w==", 3449 + "dependencies": { 3450 + "@radix-ui/primitive": "1.1.0", 3451 + "@radix-ui/react-compose-refs": "1.1.0", 3452 + "@radix-ui/react-context": "1.1.0", 3453 + "@radix-ui/react-dismissable-layer": "1.1.0", 3454 + "@radix-ui/react-id": "1.1.0", 3455 + "@radix-ui/react-popper": "1.2.0", 3456 + "@radix-ui/react-portal": "1.1.1", 3457 + "@radix-ui/react-presence": "1.1.0", 3458 + "@radix-ui/react-primitive": "2.0.0", 3459 + "@radix-ui/react-slot": "1.1.0", 3460 + "@radix-ui/react-use-controllable-state": "1.1.0", 3461 + "@radix-ui/react-visually-hidden": "1.1.0" 3462 + }, 3463 + "peerDependencies": { 3464 + "@types/react": "*", 3465 + "@types/react-dom": "*", 3466 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 3467 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3468 + }, 3469 + "peerDependenciesMeta": { 3470 + "@types/react": { 3471 + "optional": true 3472 + }, 3473 + "@types/react-dom": { 3474 + "optional": true 3475 + } 3476 + } 3477 + }, 3478 + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/primitive": { 3479 + "version": "1.1.0", 3480 + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", 3481 + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" 3482 + }, 3483 + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-compose-refs": { 3484 + "version": "1.1.0", 3485 + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", 3486 + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", 3487 + "peerDependencies": { 3488 + "@types/react": "*", 3489 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3490 + }, 3491 + "peerDependenciesMeta": { 3492 + "@types/react": { 3493 + "optional": true 3494 + } 3495 + } 3496 + }, 3497 + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-context": { 3498 + "version": "1.1.0", 3499 + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", 3500 + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", 3501 + "peerDependencies": { 3502 + "@types/react": "*", 3503 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3504 + }, 3505 + "peerDependenciesMeta": { 3506 + "@types/react": { 3507 + "optional": true 3508 + } 3509 + } 3510 + }, 3511 + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-primitive": { 3512 + "version": "2.0.0", 3513 + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", 3514 + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", 3515 + "dependencies": { 3516 + "@radix-ui/react-slot": "1.1.0" 3517 + }, 3518 + "peerDependencies": { 3519 + "@types/react": "*", 3520 + "@types/react-dom": "*", 3521 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 3522 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3523 + }, 3524 + "peerDependenciesMeta": { 3525 + "@types/react": { 3526 + "optional": true 3527 + }, 3528 + "@types/react-dom": { 3529 + "optional": true 3530 + } 3531 + } 3532 + }, 3533 + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot": { 3534 + "version": "1.1.0", 3535 + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", 3536 + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", 3537 + "dependencies": { 3538 + "@radix-ui/react-compose-refs": "1.1.0" 3539 + }, 3540 + "peerDependencies": { 3541 + "@types/react": "*", 3542 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3543 + }, 3544 + "peerDependenciesMeta": { 3545 + "@types/react": { 3546 + "optional": true 3547 + } 3548 + } 3549 + }, 3550 + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-use-callback-ref": { 3551 + "version": "1.1.0", 3552 + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", 3553 + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", 3554 + "peerDependencies": { 3555 + "@types/react": "*", 3556 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3557 + }, 3558 + "peerDependenciesMeta": { 3559 + "@types/react": { 3560 + "optional": true 3561 + } 3562 + } 3563 + }, 3564 + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-use-controllable-state": { 3565 + "version": "1.1.0", 3566 + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", 3567 + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", 3568 + "dependencies": { 3569 + "@radix-ui/react-use-callback-ref": "1.1.0" 3570 + }, 3571 + "peerDependencies": { 3572 + "@types/react": "*", 3573 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3574 + }, 3575 + "peerDependenciesMeta": { 3576 + "@types/react": { 3577 + "optional": true 3578 + } 3579 + } 3580 + }, 2951 3581 "node_modules/@radix-ui/react-use-callback-ref": { 2952 3582 "version": "1.0.1", 2953 3583 "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz", ··· 2976 3606 "peerDependencies": { 2977 3607 "@types/react": "*", 2978 3608 "react": "^16.8 || ^17.0 || ^18.0" 3609 + }, 3610 + "peerDependenciesMeta": { 3611 + "@types/react": { 3612 + "optional": true 3613 + } 3614 + } 3615 + }, 3616 + "node_modules/@radix-ui/react-use-escape-keydown": { 3617 + "version": "1.1.0", 3618 + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", 3619 + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", 3620 + "dependencies": { 3621 + "@radix-ui/react-use-callback-ref": "1.1.0" 3622 + }, 3623 + "peerDependencies": { 3624 + "@types/react": "*", 3625 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3626 + }, 3627 + "peerDependenciesMeta": { 3628 + "@types/react": { 3629 + "optional": true 3630 + } 3631 + } 3632 + }, 3633 + "node_modules/@radix-ui/react-use-escape-keydown/node_modules/@radix-ui/react-use-callback-ref": { 3634 + "version": "1.1.0", 3635 + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", 3636 + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", 3637 + "peerDependencies": { 3638 + "@types/react": "*", 3639 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 2979 3640 }, 2980 3641 "peerDependenciesMeta": { 2981 3642 "@types/react": { ··· 3017 3678 } 3018 3679 } 3019 3680 }, 3681 + "node_modules/@radix-ui/react-use-rect": { 3682 + "version": "1.1.0", 3683 + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", 3684 + "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", 3685 + "dependencies": { 3686 + "@radix-ui/rect": "1.1.0" 3687 + }, 3688 + "peerDependencies": { 3689 + "@types/react": "*", 3690 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3691 + }, 3692 + "peerDependenciesMeta": { 3693 + "@types/react": { 3694 + "optional": true 3695 + } 3696 + } 3697 + }, 3698 + "node_modules/@radix-ui/react-use-rect/node_modules/@radix-ui/rect": { 3699 + "version": "1.1.0", 3700 + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", 3701 + "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==" 3702 + }, 3020 3703 "node_modules/@radix-ui/react-use-size": { 3021 3704 "version": "1.0.1", 3022 3705 "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz", ··· 3028 3711 "peerDependencies": { 3029 3712 "@types/react": "*", 3030 3713 "react": "^16.8 || ^17.0 || ^18.0" 3714 + }, 3715 + "peerDependenciesMeta": { 3716 + "@types/react": { 3717 + "optional": true 3718 + } 3719 + } 3720 + }, 3721 + "node_modules/@radix-ui/react-visually-hidden": { 3722 + "version": "1.1.0", 3723 + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz", 3724 + "integrity": "sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==", 3725 + "dependencies": { 3726 + "@radix-ui/react-primitive": "2.0.0" 3727 + }, 3728 + "peerDependencies": { 3729 + "@types/react": "*", 3730 + "@types/react-dom": "*", 3731 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 3732 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3733 + }, 3734 + "peerDependenciesMeta": { 3735 + "@types/react": { 3736 + "optional": true 3737 + }, 3738 + "@types/react-dom": { 3739 + "optional": true 3740 + } 3741 + } 3742 + }, 3743 + "node_modules/@radix-ui/react-visually-hidden/node_modules/@radix-ui/react-compose-refs": { 3744 + "version": "1.1.0", 3745 + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", 3746 + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", 3747 + "peerDependencies": { 3748 + "@types/react": "*", 3749 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3750 + }, 3751 + "peerDependenciesMeta": { 3752 + "@types/react": { 3753 + "optional": true 3754 + } 3755 + } 3756 + }, 3757 + "node_modules/@radix-ui/react-visually-hidden/node_modules/@radix-ui/react-primitive": { 3758 + "version": "2.0.0", 3759 + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", 3760 + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", 3761 + "dependencies": { 3762 + "@radix-ui/react-slot": "1.1.0" 3763 + }, 3764 + "peerDependencies": { 3765 + "@types/react": "*", 3766 + "@types/react-dom": "*", 3767 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 3768 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3769 + }, 3770 + "peerDependenciesMeta": { 3771 + "@types/react": { 3772 + "optional": true 3773 + }, 3774 + "@types/react-dom": { 3775 + "optional": true 3776 + } 3777 + } 3778 + }, 3779 + "node_modules/@radix-ui/react-visually-hidden/node_modules/@radix-ui/react-slot": { 3780 + "version": "1.1.0", 3781 + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", 3782 + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", 3783 + "dependencies": { 3784 + "@radix-ui/react-compose-refs": "1.1.0" 3785 + }, 3786 + "peerDependencies": { 3787 + "@types/react": "*", 3788 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 3031 3789 }, 3032 3790 "peerDependenciesMeta": { 3033 3791 "@types/react": {
+1
package.json
··· 15 15 "@nytimes/react-prosemirror": "^0.6.1", 16 16 "@radix-ui/react-popover": "^1.0.7", 17 17 "@radix-ui/react-slider": "^1.1.2", 18 + "@radix-ui/react-tooltip": "^1.1.2", 18 19 "@react-aria/utils": "^3.24.1", 19 20 "@react-spring/web": "^9.7.3", 20 21 "@supabase/ssr": "^0.3.0",