Merge branch 'excalidraw:master' into main

This commit is contained in:
Ashley Trinh 2025-04-02 09:59:06 -07:00 committed by GitHub
commit 2cb821da7f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
21 changed files with 177 additions and 205 deletions

View file

@ -48,3 +48,6 @@ UNWEjuqNMi/lwAErS9fFa2oJlWyT8U7zzv/5kQREkxZI6y9v0AF3qcbsy2731FnD
s9ChJvOUW9toIab2gsIdrKW8ZNpu084ZFVKb6LNjvIXI1Se4oMTHeszXzNptzlot s9ChJvOUW9toIab2gsIdrKW8ZNpu084ZFVKb6LNjvIXI1Se4oMTHeszXzNptzlot
kdxxjOoaQMAyfljFSot1F1FlU6MQlag7UnFGvFjRHN1JI5q4K+n3a67DX+TMyRqS kdxxjOoaQMAyfljFSot1F1FlU6MQlag7UnFGvFjRHN1JI5q4K+n3a67DX+TMyRqS
HQIDAQAB' HQIDAQAB'
# set to true in .env.development.local to disable the prevent unload dialog
VITE_APP_DISABLE_PREVENT_UNLOAD=

View file

@ -608,7 +608,13 @@ const ExcalidrawWrapper = () => {
excalidrawAPI.getSceneElements(), excalidrawAPI.getSceneElements(),
) )
) { ) {
preventUnload(event); if (import.meta.env.VITE_APP_DISABLE_PREVENT_UNLOAD !== "true") {
preventUnload(event);
} else {
console.warn(
"preventing unload disabled (VITE_APP_DISABLE_PREVENT_UNLOAD)",
);
}
} }
}; };
window.addEventListener(EVENT.BEFORE_UNLOAD, unloadHandler); window.addEventListener(EVENT.BEFORE_UNLOAD, unloadHandler);

View file

@ -301,7 +301,13 @@ class Collab extends PureComponent<CollabProps, CollabState> {
// the purpose is to run in immediately after user decides to stay // the purpose is to run in immediately after user decides to stay
this.saveCollabRoomToFirebase(syncableElements); this.saveCollabRoomToFirebase(syncableElements);
preventUnload(event); if (import.meta.env.VITE_APP_DISABLE_PREVENT_UNLOAD !== "true") {
preventUnload(event);
} else {
console.warn(
"preventing unload disabled (VITE_APP_DISABLE_PREVENT_UNLOAD)",
);
}
} }
}); });

View file

@ -2,6 +2,8 @@ import oc from "open-color";
import type { Merge } from "./utility-types"; import type { Merge } from "./utility-types";
export const COLOR_OUTLINE_CONTRAST_THRESHOLD = 240;
// FIXME can't put to utils.ts rn because of circular dependency // FIXME can't put to utils.ts rn because of circular dependency
const pick = <R extends Record<string, any>, K extends readonly (keyof R)[]>( const pick = <R extends Record<string, any>, K extends readonly (keyof R)[]>(
source: R, source: R,

View file

@ -27,16 +27,22 @@
.color-picker__top-picks { .color-picker__top-picks {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center;
} }
.color-picker__button { .color-picker__button {
--radius: 0.25rem; --radius: 4px;
--size: 1.375rem;
&.has-outline {
box-shadow: inset 0 0 0 1px #d9d9d9;
}
padding: 0; padding: 0;
margin: 0; margin: 0;
width: 1.35rem; width: var(--size);
height: 1.35rem; height: var(--size);
border: 1px solid var(--color-gray-30); border: 0;
border-radius: var(--radius); border-radius: var(--radius);
filter: var(--theme-filter); filter: var(--theme-filter);
background-color: var(--swatch-color); background-color: var(--swatch-color);
@ -45,16 +51,20 @@
font-family: inherit; font-family: inherit;
box-sizing: border-box; box-sizing: border-box;
&:hover { &:hover:not(.active):not(.color-picker__button--large) {
transform: scale(1.075);
}
&:hover:not(.active).color-picker__button--large {
&::after { &::after {
content: ""; content: "";
position: absolute; position: absolute;
top: -2px; top: -1px;
left: -2px; left: -1px;
right: -2px; right: -1px;
bottom: -2px; bottom: -1px;
box-shadow: 0 0 0 1px var(--color-gray-30); box-shadow: 0 0 0 1px var(--color-gray-30);
border-radius: calc(var(--radius) + 1px); border-radius: var(--radius);
filter: var(--theme-filter); filter: var(--theme-filter);
} }
} }
@ -62,13 +72,14 @@
&.active { &.active {
.color-picker__button-outline { .color-picker__button-outline {
position: absolute; position: absolute;
top: -2px; --offset: -1px;
left: -2px; top: var(--offset);
right: -2px; left: var(--offset);
bottom: -2px; right: var(--offset);
bottom: var(--offset);
box-shadow: 0 0 0 1px var(--color-primary-darkest); box-shadow: 0 0 0 1px var(--color-primary-darkest);
z-index: 1; // due hover state so this has preference z-index: 1; // due hover state so this has preference
border-radius: calc(var(--radius) + 1px); border-radius: var(--radius);
filter: var(--theme-filter); filter: var(--theme-filter);
} }
} }
@ -123,10 +134,11 @@
.color-picker__button__hotkey-label { .color-picker__button__hotkey-label {
position: absolute; position: absolute;
right: 4px; right: 5px;
bottom: 4px; bottom: 3px;
filter: none; filter: none;
font-size: 11px; font-size: 11px;
font-weight: 500;
} }
.color-picker { .color-picker {

View file

@ -2,7 +2,11 @@ import * as Popover from "@radix-ui/react-popover";
import clsx from "clsx"; import clsx from "clsx";
import { useRef } from "react"; import { useRef } from "react";
import { COLOR_PALETTE, isTransparent } from "@excalidraw/common"; import {
COLOR_OUTLINE_CONTRAST_THRESHOLD,
COLOR_PALETTE,
isTransparent,
} from "@excalidraw/common";
import type { ColorTuple, ColorPaletteCustom } from "@excalidraw/common"; import type { ColorTuple, ColorPaletteCustom } from "@excalidraw/common";
@ -19,7 +23,7 @@ import { ColorInput } from "./ColorInput";
import { Picker } from "./Picker"; import { Picker } from "./Picker";
import PickerHeading from "./PickerHeading"; import PickerHeading from "./PickerHeading";
import { TopPicks } from "./TopPicks"; import { TopPicks } from "./TopPicks";
import { activeColorPickerSectionAtom } from "./colorPickerUtils"; import { activeColorPickerSectionAtom, isColorDark } from "./colorPickerUtils";
import "./ColorPicker.scss"; import "./ColorPicker.scss";
@ -190,6 +194,7 @@ const ColorPickerTrigger = ({
type="button" type="button"
className={clsx("color-picker__button active-color properties-trigger", { className={clsx("color-picker__button active-color properties-trigger", {
"is-transparent": color === "transparent" || !color, "is-transparent": color === "transparent" || !color,
"has-outline": !isColorDark(color, COLOR_OUTLINE_CONTRAST_THRESHOLD),
})} })}
aria-label={label} aria-label={label}
style={color ? { "--swatch-color": color } : undefined} style={color ? { "--swatch-color": color } : undefined}

View file

@ -40,7 +40,7 @@ export const CustomColorList = ({
tabIndex={-1} tabIndex={-1}
type="button" type="button"
className={clsx( className={clsx(
"color-picker__button color-picker__button--large", "color-picker__button color-picker__button--large has-outline",
{ {
active: color === c, active: color === c,
"is-transparent": c === "transparent" || !c, "is-transparent": c === "transparent" || !c,
@ -56,7 +56,7 @@ export const CustomColorList = ({
key={i} key={i}
> >
<div className="color-picker__button-outline" /> <div className="color-picker__button-outline" />
<HotkeyLabel color={c} keyLabel={i + 1} isCustomColor /> <HotkeyLabel color={c} keyLabel={i + 1} />
</button> </button>
); );
})} })}

View file

@ -1,24 +1,22 @@
import React from "react"; import React from "react";
import { getContrastYIQ } from "./colorPickerUtils"; import { isColorDark } from "./colorPickerUtils";
interface HotkeyLabelProps { interface HotkeyLabelProps {
color: string; color: string;
keyLabel: string | number; keyLabel: string | number;
isCustomColor?: boolean;
isShade?: boolean; isShade?: boolean;
} }
const HotkeyLabel = ({ const HotkeyLabel = ({
color, color,
keyLabel, keyLabel,
isCustomColor = false,
isShade = false, isShade = false,
}: HotkeyLabelProps) => { }: HotkeyLabelProps) => {
return ( return (
<div <div
className="color-picker__button__hotkey-label" className="color-picker__button__hotkey-label"
style={{ style={{
color: getContrastYIQ(color, isCustomColor), color: isColorDark(color) ? "#fff" : "#000",
}} }}
> >
{isShade && "⇧"} {isShade && "⇧"}

View file

@ -65,7 +65,7 @@ const PickerColorList = ({
tabIndex={-1} tabIndex={-1}
type="button" type="button"
className={clsx( className={clsx(
"color-picker__button color-picker__button--large", "color-picker__button color-picker__button--large has-outline",
{ {
active: colorObj?.colorName === key, active: colorObj?.colorName === key,
"is-transparent": color === "transparent" || !color, "is-transparent": color === "transparent" || !color,

View file

@ -55,7 +55,7 @@ export const ShadeList = ({ hex, onChange, palette }: ShadeListProps) => {
key={i} key={i}
type="button" type="button"
className={clsx( className={clsx(
"color-picker__button color-picker__button--large", "color-picker__button color-picker__button--large has-outline",
{ active: i === shade }, { active: i === shade },
)} )}
aria-label="Shade" aria-label="Shade"

View file

@ -1,11 +1,14 @@
import clsx from "clsx"; import clsx from "clsx";
import { import {
COLOR_OUTLINE_CONTRAST_THRESHOLD,
DEFAULT_CANVAS_BACKGROUND_PICKS, DEFAULT_CANVAS_BACKGROUND_PICKS,
DEFAULT_ELEMENT_BACKGROUND_PICKS, DEFAULT_ELEMENT_BACKGROUND_PICKS,
DEFAULT_ELEMENT_STROKE_PICKS, DEFAULT_ELEMENT_STROKE_PICKS,
} from "@excalidraw/common"; } from "@excalidraw/common";
import { isColorDark } from "./colorPickerUtils";
import type { ColorPickerType } from "./colorPickerUtils"; import type { ColorPickerType } from "./colorPickerUtils";
interface TopPicksProps { interface TopPicksProps {
@ -51,6 +54,10 @@ export const TopPicks = ({
className={clsx("color-picker__button", { className={clsx("color-picker__button", {
active: color === activeColor, active: color === activeColor,
"is-transparent": color === "transparent" || !color, "is-transparent": color === "transparent" || !color,
"has-outline": !isColorDark(
color,
COLOR_OUTLINE_CONTRAST_THRESHOLD,
),
})} })}
style={{ "--swatch-color": color }} style={{ "--swatch-color": color }}
key={color} key={color}

View file

@ -93,19 +93,42 @@ export type ActiveColorPickerSectionAtomType =
export const activeColorPickerSectionAtom = export const activeColorPickerSectionAtom =
atom<ActiveColorPickerSectionAtomType>(null); atom<ActiveColorPickerSectionAtomType>(null);
const calculateContrast = (r: number, g: number, b: number) => { const calculateContrast = (r: number, g: number, b: number): number => {
const yiq = (r * 299 + g * 587 + b * 114) / 1000; const yiq = (r * 299 + g * 587 + b * 114) / 1000;
return yiq >= 160 ? "black" : "white"; return yiq;
}; };
// inspiration from https://stackoverflow.com/a/11868398 // YIQ algo, inspiration from https://stackoverflow.com/a/11868398
export const getContrastYIQ = (bgHex: string, isCustomColor: boolean) => { export const isColorDark = (color: string, threshold = 160): boolean => {
if (isCustomColor) { // no color ("") -> assume it default to black
const style = new Option().style; if (!color) {
style.color = bgHex; return true;
}
if (style.color) { if (color === "transparent") {
const rgb = style.color return false;
}
// a string color (white etc) or any other format -> convert to rgb by way
// of creating a DOM node and retrieving the computeStyle
if (!color.startsWith("#")) {
const node = document.createElement("div");
node.style.color = color;
if (node.style.color) {
// making invisible so document doesn't reflow (hopefully).
// display=none works too, but supposedly not in all browsers
node.style.position = "absolute";
node.style.visibility = "hidden";
node.style.width = "0";
node.style.height = "0";
// needs to be in DOM else browser won't compute the style
document.body.appendChild(node);
const computedColor = getComputedStyle(node).color;
document.body.removeChild(node);
// computed style is in rgb() format
const rgb = computedColor
.replace(/^(rgb|rgba)\(/, "") .replace(/^(rgb|rgba)\(/, "")
.replace(/\)$/, "") .replace(/\)$/, "")
.replace(/\s/g, "") .replace(/\s/g, "")
@ -114,20 +137,17 @@ export const getContrastYIQ = (bgHex: string, isCustomColor: boolean) => {
const g = parseInt(rgb[1]); const g = parseInt(rgb[1]);
const b = parseInt(rgb[2]); const b = parseInt(rgb[2]);
return calculateContrast(r, g, b); return calculateContrast(r, g, b) < threshold;
} }
// invalid color -> assume it default to black
return true;
} }
// TODO: ? is this wanted? const r = parseInt(color.slice(1, 3), 16);
if (bgHex === "transparent") { const g = parseInt(color.slice(3, 5), 16);
return "black"; const b = parseInt(color.slice(5, 7), 16);
}
const r = parseInt(bgHex.substring(1, 3), 16); return calculateContrast(r, g, b) < threshold;
const g = parseInt(bgHex.substring(3, 5), 16);
const b = parseInt(bgHex.substring(5, 7), 16);
return calculateContrast(r, g, b);
}; };
export type ColorPickerType = export type ColorPickerType =

View file

@ -6,7 +6,7 @@
.range-wrapper { .range-wrapper {
position: relative; position: relative;
padding-top: 10px; padding-top: 10px;
padding-bottom: 30px; padding-bottom: 25px;
} }
.range-input { .range-input {

View file

@ -2,10 +2,12 @@
.drag-input-container { .drag-input-container {
display: flex; display: flex;
width: 100%; width: 100%;
border-radius: var(--border-radius-lg);
&:focus-within { &:focus-within {
box-shadow: 0 0 0 1px var(--color-primary-darkest); box-shadow: 0 0 0 1px var(--color-primary-darkest);
border-radius: var(--border-radius-md); border-radius: var(--border-radius-md);
background: transparent;
} }
} }
@ -16,24 +18,14 @@
.drag-input-label { .drag-input-label {
flex-shrink: 0; flex-shrink: 0;
border: 1px solid var(--default-border-color); border: 0;
border-right: 0; padding: 0 0.5rem 0 0.25rem;
padding: 0 0.5rem 0 0.75rem;
min-width: 1rem; min-width: 1rem;
width: 1.5rem;
height: 2rem; height: 2rem;
box-sizing: border-box; box-sizing: content-box;
color: var(--popup-text-color); color: var(--popup-text-color);
:root[dir="ltr"] & {
border-radius: var(--border-radius-md) 0 0 var(--border-radius-md);
}
:root[dir="rtl"] & {
border-radius: 0 var(--border-radius-md) var(--border-radius-md) 0;
border-right: 1px solid var(--default-border-color);
border-left: 0;
}
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@ -51,20 +43,8 @@
border: 0; border: 0;
outline: none; outline: none;
height: 2rem; height: 2rem;
border: 1px solid var(--default-border-color);
border-left: 0;
letter-spacing: 0.4px; letter-spacing: 0.4px;
:root[dir="ltr"] & {
border-radius: 0 var(--border-radius-md) var(--border-radius-md) 0;
}
:root[dir="rtl"] & {
border-radius: var(--border-radius-md) 0 0 var(--border-radius-md);
border-left: 1px solid var(--default-border-color);
border-right: 0;
}
padding: 0.5rem; padding: 0.5rem;
padding-left: 0.25rem; padding-left: 0.25rem;
appearance: none; appearance: none;

View file

@ -41,6 +41,10 @@
div + div { div + div {
text-align: right; text-align: right;
} }
&:empty {
display: none;
}
} }
&__row--heading { &__row--heading {

View file

@ -289,7 +289,11 @@ export const StatsInner = memo(
</StatsRow> </StatsRow>
)} )}
<StatsRow heading data-testid="stats-element-type"> <StatsRow
heading
data-testid="stats-element-type"
style={{ margin: "0.3125rem 0" }}
>
{appState.croppingElementId {appState.croppingElementId
? t("labels.imageCropping") ? t("labels.imageCropping")
: t(`element.${singleElement.type}`)} : t(`element.${singleElement.type}`)}

View file

@ -148,7 +148,7 @@
--border-radius-lg: 0.5rem; --border-radius-lg: 0.5rem;
--color-surface-high: #f1f0ff; --color-surface-high: #f1f0ff;
--color-surface-mid: #f2f2f7; --color-surface-mid: #f6f6f9;
--color-surface-low: #ececf4; --color-surface-low: #ececf4;
--color-surface-lowest: #ffffff; --color-surface-lowest: #ffffff;
--color-on-surface: #1b1b1f; --color-on-surface: #1b1b1f;
@ -252,7 +252,7 @@
--color-logo-text: #e2dfff; --color-logo-text: #e2dfff;
--color-surface-high: hsl(245, 10%, 21%); --color-surface-high: #2e2d39;
--color-surface-low: hsl(240, 8%, 15%); --color-surface-low: hsl(240, 8%, 15%);
--color-surface-mid: hsl(240 6% 10%); --color-surface-mid: hsl(240 6% 10%);
--color-surface-lowest: hsl(0, 0%, 7%); --color-surface-lowest: hsl(0, 0%, 7%);

View file

@ -221,7 +221,7 @@ const restoreElementWithProperties = <
"customData" in extra ? extra.customData : element.customData; "customData" in extra ? extra.customData : element.customData;
} }
return { const ret = {
// spread the original element properties to not lose unknown ones // spread the original element properties to not lose unknown ones
// for forward-compatibility // for forward-compatibility
...element, ...element,
@ -230,6 +230,12 @@ const restoreElementWithProperties = <
...getNormalizedDimensions(base), ...getNormalizedDimensions(base),
...extra, ...extra,
} as unknown as T; } as unknown as T;
// strip legacy props (migrated in previous steps)
delete ret.strokeSharpness;
delete ret.boundElementIds;
return ret;
}; };
const restoreElement = ( const restoreElement = (

View file

@ -76,7 +76,7 @@
"@excalidraw/mermaid-to-excalidraw": "1.1.2", "@excalidraw/mermaid-to-excalidraw": "1.1.2",
"@excalidraw/random-username": "1.1.0", "@excalidraw/random-username": "1.1.0",
"@radix-ui/react-popover": "1.1.6", "@radix-ui/react-popover": "1.1.6",
"@radix-ui/react-tabs": "1.0.2", "@radix-ui/react-tabs": "1.1.3",
"browser-fs-access": "0.29.1", "browser-fs-access": "0.29.1",
"canvas-roundrect-polyfill": "0.0.1", "canvas-roundrect-polyfill": "0.0.1",
"clsx": "1.1.1", "clsx": "1.1.1",

View file

@ -572,7 +572,7 @@ exports[`<Excalidraw/> > Test UIOptions prop > Test canvasActions > should rende
class="color-picker__top-picks" class="color-picker__top-picks"
> >
<button <button
class="color-picker__button active" class="color-picker__button active has-outline"
data-testid="color-top-pick-#ffffff" data-testid="color-top-pick-#ffffff"
style="--swatch-color: #ffffff;" style="--swatch-color: #ffffff;"
title="#ffffff" title="#ffffff"
@ -583,7 +583,7 @@ exports[`<Excalidraw/> > Test UIOptions prop > Test canvasActions > should rende
/> />
</button> </button>
<button <button
class="color-picker__button" class="color-picker__button has-outline"
data-testid="color-top-pick-#f8f9fa" data-testid="color-top-pick-#f8f9fa"
style="--swatch-color: #f8f9fa;" style="--swatch-color: #f8f9fa;"
title="#f8f9fa" title="#f8f9fa"
@ -594,7 +594,7 @@ exports[`<Excalidraw/> > Test UIOptions prop > Test canvasActions > should rende
/> />
</button> </button>
<button <button
class="color-picker__button" class="color-picker__button has-outline"
data-testid="color-top-pick-#f5faff" data-testid="color-top-pick-#f5faff"
style="--swatch-color: #f5faff;" style="--swatch-color: #f5faff;"
title="#f5faff" title="#f5faff"
@ -605,7 +605,7 @@ exports[`<Excalidraw/> > Test UIOptions prop > Test canvasActions > should rende
/> />
</button> </button>
<button <button
class="color-picker__button" class="color-picker__button has-outline"
data-testid="color-top-pick-#fffce8" data-testid="color-top-pick-#fffce8"
style="--swatch-color: #fffce8;" style="--swatch-color: #fffce8;"
title="#fffce8" title="#fffce8"
@ -616,7 +616,7 @@ exports[`<Excalidraw/> > Test UIOptions prop > Test canvasActions > should rende
/> />
</button> </button>
<button <button
class="color-picker__button" class="color-picker__button has-outline"
data-testid="color-top-pick-#fdf8f6" data-testid="color-top-pick-#fdf8f6"
style="--swatch-color: #fdf8f6;" style="--swatch-color: #fdf8f6;"
title="#fdf8f6" title="#fdf8f6"
@ -635,7 +635,7 @@ exports[`<Excalidraw/> > Test UIOptions prop > Test canvasActions > should rende
aria-expanded="false" aria-expanded="false"
aria-haspopup="dialog" aria-haspopup="dialog"
aria-label="Canvas background" aria-label="Canvas background"
class="color-picker__button active-color properties-trigger" class="color-picker__button active-color properties-trigger has-outline"
data-state="closed" data-state="closed"
style="--swatch-color: #ffffff;" style="--swatch-color: #ffffff;"
title="Show background color picker" title="Show background color picker"

157
yarn.lock
View file

@ -1003,7 +1003,7 @@
"@babel/plugin-transform-modules-commonjs" "^7.25.9" "@babel/plugin-transform-modules-commonjs" "^7.25.9"
"@babel/plugin-transform-typescript" "^7.25.9" "@babel/plugin-transform-typescript" "^7.25.9"
"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.14.6", "@babel/runtime@^7.16.3", "@babel/runtime@^7.8.4": "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.6", "@babel/runtime@^7.16.3", "@babel/runtime@^7.8.4":
version "7.26.9" version "7.26.9"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.9.tgz#aa4c6facc65b9cb3f87d75125ffd47781b475433" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.9.tgz#aa4c6facc65b9cb3f87d75125ffd47781b475433"
integrity sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg== integrity sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==
@ -2220,13 +2220,6 @@
resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==
"@radix-ui/primitive@1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.0.0.tgz#e1d8ef30b10ea10e69c76e896f608d9276352253"
integrity sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==
dependencies:
"@babel/runtime" "^7.13.10"
"@radix-ui/primitive@1.1.1": "@radix-ui/primitive@1.1.1":
version "1.1.1" version "1.1.1"
resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.1.1.tgz#fc169732d755c7fbad33ba8d0cd7fd10c90dc8e3" resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.1.1.tgz#fc169732d755c7fbad33ba8d0cd7fd10c90dc8e3"
@ -2239,47 +2232,30 @@
dependencies: dependencies:
"@radix-ui/react-primitive" "2.0.2" "@radix-ui/react-primitive" "2.0.2"
"@radix-ui/react-collection@1.0.1": "@radix-ui/react-collection@1.1.2":
version "1.0.1" version "1.1.2"
resolved "https://registry.yarnpkg.com/@radix-ui/react-collection/-/react-collection-1.0.1.tgz#259506f97c6703b36291826768d3c1337edd1de5" resolved "https://registry.yarnpkg.com/@radix-ui/react-collection/-/react-collection-1.1.2.tgz#b45eccca1cb902fd078b237316bd9fa81e621e15"
integrity sha512-uuiFbs+YCKjn3X1DTSx9G7BHApu4GHbi3kgiwsnFUbOKCrwejAJv4eE4Vc8C0Oaxt9T0aV4ox0WCOdx+39Xo+g== integrity sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw==
dependencies: dependencies:
"@babel/runtime" "^7.13.10" "@radix-ui/react-compose-refs" "1.1.1"
"@radix-ui/react-compose-refs" "1.0.0" "@radix-ui/react-context" "1.1.1"
"@radix-ui/react-context" "1.0.0" "@radix-ui/react-primitive" "2.0.2"
"@radix-ui/react-primitive" "1.0.1" "@radix-ui/react-slot" "1.1.2"
"@radix-ui/react-slot" "1.0.1"
"@radix-ui/react-compose-refs@1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz#37595b1f16ec7f228d698590e78eeed18ff218ae"
integrity sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==
dependencies:
"@babel/runtime" "^7.13.10"
"@radix-ui/react-compose-refs@1.1.1": "@radix-ui/react-compose-refs@1.1.1":
version "1.1.1" version "1.1.1"
resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz#6f766faa975f8738269ebb8a23bad4f5a8d2faec" resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz#6f766faa975f8738269ebb8a23bad4f5a8d2faec"
integrity sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw== integrity sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==
"@radix-ui/react-context@1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.0.0.tgz#f38e30c5859a9fb5e9aa9a9da452ee3ed9e0aee0"
integrity sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==
dependencies:
"@babel/runtime" "^7.13.10"
"@radix-ui/react-context@1.1.1": "@radix-ui/react-context@1.1.1":
version "1.1.1" version "1.1.1"
resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.1.1.tgz#82074aa83a472353bb22e86f11bcbd1c61c4c71a" resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.1.1.tgz#82074aa83a472353bb22e86f11bcbd1c61c4c71a"
integrity sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q== integrity sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==
"@radix-ui/react-direction@1.0.0": "@radix-ui/react-direction@1.1.0":
version "1.0.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/@radix-ui/react-direction/-/react-direction-1.0.0.tgz#a2e0b552352459ecf96342c79949dd833c1e6e45" resolved "https://registry.yarnpkg.com/@radix-ui/react-direction/-/react-direction-1.1.0.tgz#a7d39855f4d077adc2a1922f9c353c5977a09cdc"
integrity sha512-2HV05lGUgYcA6xgLQ4BKPDmtL+QbIZYH5fCOTAOOcJ5O0QbWS3i9lKaurLzliYUDhORI2Qr3pyjhJh44lKA3rQ== integrity sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==
dependencies:
"@babel/runtime" "^7.13.10"
"@radix-ui/react-dismissable-layer@1.1.5": "@radix-ui/react-dismissable-layer@1.1.5":
version "1.1.5" version "1.1.5"
@ -2306,14 +2282,6 @@
"@radix-ui/react-primitive" "2.0.2" "@radix-ui/react-primitive" "2.0.2"
"@radix-ui/react-use-callback-ref" "1.1.0" "@radix-ui/react-use-callback-ref" "1.1.0"
"@radix-ui/react-id@1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-1.0.0.tgz#8d43224910741870a45a8c9d092f25887bb6d11e"
integrity sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==
dependencies:
"@babel/runtime" "^7.13.10"
"@radix-ui/react-use-layout-effect" "1.0.0"
"@radix-ui/react-id@1.1.0": "@radix-ui/react-id@1.1.0":
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-1.1.0.tgz#de47339656594ad722eb87f94a6b25f9cffae0ed" resolved "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-1.1.0.tgz#de47339656594ad722eb87f94a6b25f9cffae0ed"
@ -2366,15 +2334,6 @@
"@radix-ui/react-primitive" "2.0.2" "@radix-ui/react-primitive" "2.0.2"
"@radix-ui/react-use-layout-effect" "1.1.0" "@radix-ui/react-use-layout-effect" "1.1.0"
"@radix-ui/react-presence@1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.0.0.tgz#814fe46df11f9a468808a6010e3f3ca7e0b2e84a"
integrity sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==
dependencies:
"@babel/runtime" "^7.13.10"
"@radix-ui/react-compose-refs" "1.0.0"
"@radix-ui/react-use-layout-effect" "1.0.0"
"@radix-ui/react-presence@1.1.2": "@radix-ui/react-presence@1.1.2":
version "1.1.2" version "1.1.2"
resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.1.2.tgz#bb764ed8a9118b7ec4512da5ece306ded8703cdc" resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.1.2.tgz#bb764ed8a9118b7ec4512da5ece306ded8703cdc"
@ -2383,14 +2342,6 @@
"@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-compose-refs" "1.1.1"
"@radix-ui/react-use-layout-effect" "1.1.0" "@radix-ui/react-use-layout-effect" "1.1.0"
"@radix-ui/react-primitive@1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-1.0.1.tgz#c1ebcce283dd2f02e4fbefdaa49d1cb13dbc990a"
integrity sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA==
dependencies:
"@babel/runtime" "^7.13.10"
"@radix-ui/react-slot" "1.0.1"
"@radix-ui/react-primitive@2.0.2": "@radix-ui/react-primitive@2.0.2":
version "2.0.2" version "2.0.2"
resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-2.0.2.tgz#ac8b7854d87b0d7af388d058268d9a7eb64ca8ef" resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-2.0.2.tgz#ac8b7854d87b0d7af388d058268d9a7eb64ca8ef"
@ -2398,29 +2349,20 @@
dependencies: dependencies:
"@radix-ui/react-slot" "1.1.2" "@radix-ui/react-slot" "1.1.2"
"@radix-ui/react-roving-focus@1.0.2": "@radix-ui/react-roving-focus@1.1.2":
version "1.0.2" version "1.1.2"
resolved "https://registry.yarnpkg.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.2.tgz#d8ac2e3b8006697bdfc2b0eb06bef7e15b6245de" resolved "https://registry.yarnpkg.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.2.tgz#815d051a54299114a68db6eb8d34c41a3c0a646f"
integrity sha512-HLK+CqD/8pN6GfJm3U+cqpqhSKYAWiOJDe+A+8MfxBnOue39QEeMa43csUn2CXCHQT0/mewh1LrrG4tfkM9DMA== integrity sha512-zgMQWkNO169GtGqRvYrzb0Zf8NhMHS2DuEB/TiEmVnpr5OqPU3i8lfbxaAmC2J/KYuIQxyoQQ6DxepyXp61/xw==
dependencies: dependencies:
"@babel/runtime" "^7.13.10" "@radix-ui/primitive" "1.1.1"
"@radix-ui/primitive" "1.0.0" "@radix-ui/react-collection" "1.1.2"
"@radix-ui/react-collection" "1.0.1" "@radix-ui/react-compose-refs" "1.1.1"
"@radix-ui/react-compose-refs" "1.0.0" "@radix-ui/react-context" "1.1.1"
"@radix-ui/react-context" "1.0.0" "@radix-ui/react-direction" "1.1.0"
"@radix-ui/react-direction" "1.0.0" "@radix-ui/react-id" "1.1.0"
"@radix-ui/react-id" "1.0.0" "@radix-ui/react-primitive" "2.0.2"
"@radix-ui/react-primitive" "1.0.1" "@radix-ui/react-use-callback-ref" "1.1.0"
"@radix-ui/react-use-callback-ref" "1.0.0" "@radix-ui/react-use-controllable-state" "1.1.0"
"@radix-ui/react-use-controllable-state" "1.0.0"
"@radix-ui/react-slot@1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.0.1.tgz#e7868c669c974d649070e9ecbec0b367ee0b4d81"
integrity sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==
dependencies:
"@babel/runtime" "^7.13.10"
"@radix-ui/react-compose-refs" "1.0.0"
"@radix-ui/react-slot@1.1.2": "@radix-ui/react-slot@1.1.2":
version "1.1.2" version "1.1.2"
@ -2429,41 +2371,25 @@
dependencies: dependencies:
"@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-compose-refs" "1.1.1"
"@radix-ui/react-tabs@1.0.2": "@radix-ui/react-tabs@1.1.3":
version "1.0.2" version "1.1.3"
resolved "https://registry.yarnpkg.com/@radix-ui/react-tabs/-/react-tabs-1.0.2.tgz#8f5ec73ca41b151a413bdd6e00553408ff34ce07" resolved "https://registry.yarnpkg.com/@radix-ui/react-tabs/-/react-tabs-1.1.3.tgz#c47c8202dc676dea47676215863d2ef9b141c17a"
integrity sha512-gOUwh+HbjCuL0UCo8kZ+kdUEG8QtpdO4sMQduJ34ZEz0r4922g9REOBM+vIsfwtGxSug4Yb1msJMJYN2Bk8TpQ== integrity sha512-9mFyI30cuRDImbmFF6O2KUJdgEOsGh9Vmx9x/Dh9tOhL7BngmQPQfwW4aejKm5OHpfWIdmeV6ySyuxoOGjtNng==
dependencies: dependencies:
"@babel/runtime" "^7.13.10" "@radix-ui/primitive" "1.1.1"
"@radix-ui/primitive" "1.0.0" "@radix-ui/react-context" "1.1.1"
"@radix-ui/react-context" "1.0.0" "@radix-ui/react-direction" "1.1.0"
"@radix-ui/react-direction" "1.0.0" "@radix-ui/react-id" "1.1.0"
"@radix-ui/react-id" "1.0.0" "@radix-ui/react-presence" "1.1.2"
"@radix-ui/react-presence" "1.0.0" "@radix-ui/react-primitive" "2.0.2"
"@radix-ui/react-primitive" "1.0.1" "@radix-ui/react-roving-focus" "1.1.2"
"@radix-ui/react-roving-focus" "1.0.2" "@radix-ui/react-use-controllable-state" "1.1.0"
"@radix-ui/react-use-controllable-state" "1.0.0"
"@radix-ui/react-use-callback-ref@1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz#9e7b8b6b4946fe3cbe8f748c82a2cce54e7b6a90"
integrity sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==
dependencies:
"@babel/runtime" "^7.13.10"
"@radix-ui/react-use-callback-ref@1.1.0": "@radix-ui/react-use-callback-ref@1.1.0":
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz#bce938ca413675bc937944b0d01ef6f4a6dc5bf1" resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz#bce938ca413675bc937944b0d01ef6f4a6dc5bf1"
integrity sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw== integrity sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==
"@radix-ui/react-use-controllable-state@1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz#a64deaafbbc52d5d407afaa22d493d687c538b7f"
integrity sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==
dependencies:
"@babel/runtime" "^7.13.10"
"@radix-ui/react-use-callback-ref" "1.0.0"
"@radix-ui/react-use-controllable-state@1.1.0": "@radix-ui/react-use-controllable-state@1.1.0":
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz#1321446857bb786917df54c0d4d084877aab04b0" resolved "https://registry.yarnpkg.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz#1321446857bb786917df54c0d4d084877aab04b0"
@ -2478,13 +2404,6 @@
dependencies: dependencies:
"@radix-ui/react-use-callback-ref" "1.1.0" "@radix-ui/react-use-callback-ref" "1.1.0"
"@radix-ui/react-use-layout-effect@1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz#2fc19e97223a81de64cd3ba1dc42ceffd82374dc"
integrity sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==
dependencies:
"@babel/runtime" "^7.13.10"
"@radix-ui/react-use-layout-effect@1.1.0": "@radix-ui/react-use-layout-effect@1.1.0":
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz#3c2c8ce04827b26a39e442ff4888d9212268bd27" resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz#3c2c8ce04827b26a39e442ff4888d9212268bd27"