diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 000000000..f077c9172 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +yarn test diff --git a/package.json b/package.json index 0e2dcf067..1e1484ae9 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,9 @@ "build:packages": "cd packages/tldraw && yarn build", "publish:patch": "yarn test && yarn build:packages && lerna publish patch", "docs": "lerna run docs", - "docs:watch": "lerna run docs:watch" + "docs:watch": "lerna run docs:watch", + "postinstall": "husky install", + "fix:style": "yarn run prettier ./packages/tldraw/src --write" }, "devDependencies": { "@swc-node/jest": "^1.3.3", @@ -37,9 +39,12 @@ "@typescript-eslint/parser": "^4.19.0", "eslint": "^7.32.0", "fake-indexeddb": "^3.1.3", + "husky": "^7.0.4", "init-package-json": "^2.0.4", "jest": "^27.3.1", "lerna": "^3.22.1", + "lint-staged": "^11.2.6", + "prettier": "^2.4.1", "resize-observer-polyfill": "^1.5.1", "tslib": "^2.3.0", "typedoc": "^0.22.3", @@ -51,6 +56,15 @@ "semi": false, "printWidth": 100 }, + "husky": { + "hooks": { + "pre-commit": "lint-staged", + "pre-push": "test && lint-staged" + } + }, + "lint-staged": { + "*": "fix:style && eslint" + }, "jest": { "setupFilesAfterEnv": [ "/setupTests.ts" diff --git a/packages/tldraw/src/TLDraw.tsx b/packages/tldraw/src/TLDraw.tsx index 033a86180..5ddb5f104 100644 --- a/packages/tldraw/src/TLDraw.tsx +++ b/packages/tldraw/src/TLDraw.tsx @@ -1,20 +1,20 @@ import * as React from 'react' import { IdProvider } from '@radix-ui/react-id' import { Renderer } from '@tldraw/core' -import styled, { dark } from '~styles' +import { styled, dark } from '~styles' import { Data, TLDrawDocument, TLDrawStatus, TLDrawUser } from '~types' import { TLDrawState } from '~state' import { TLDrawContext, TLDrawContextType, - useCustomFonts, + useStylesheet, useKeyboardShortcuts, useTLDrawContext, } from '~hooks' -import { shapeUtils } from '~shape-utils' +import { shapeUtils } from '~state/shapes' import { ToolsPanel } from '~components/ToolsPanel' import { TopPanel } from '~components/TopPanel' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' import { ContextMenu } from '~components/ContextMenu' import { FocusButton } from '~components/FocusButton/FocusButton' @@ -430,7 +430,7 @@ const OneOff = React.memo( focusableRef: React.RefObject }) => { useKeyboardShortcuts(focusableRef) - useCustomFonts() + useStylesheet() React.useEffect(() => { if (autofocus) { diff --git a/packages/tldraw/src/assets/VerveineRegular.woff b/packages/tldraw/src/assets/VerveineRegular.woff deleted file mode 100644 index 098d9fb17..000000000 Binary files a/packages/tldraw/src/assets/VerveineRegular.woff and /dev/null differ diff --git a/packages/tldraw/src/components/ContextMenu/ContextMenu.tsx b/packages/tldraw/src/components/ContextMenu/ContextMenu.tsx index e79caa5ff..a026c037e 100644 --- a/packages/tldraw/src/components/ContextMenu/ContextMenu.tsx +++ b/packages/tldraw/src/components/ContextMenu/ContextMenu.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import styled from '~styles' +import { styled } from '~styles' import * as RadixContextMenu from '@radix-ui/react-context-menu' import { useTLDrawContext } from '~hooks' import { Data, AlignType, DistributeType, StretchType } from '~types' diff --git a/packages/tldraw/src/components/Divider/Divider.tsx b/packages/tldraw/src/components/Divider/Divider.tsx index 406840659..95eaf7468 100644 --- a/packages/tldraw/src/components/Divider/Divider.tsx +++ b/packages/tldraw/src/components/Divider/Divider.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import styled from '~styles' +import { styled } from '~styles' export const Divider = styled('hr', { height: 1, diff --git a/packages/tldraw/src/components/DropdownMenu/DMArrow.tsx b/packages/tldraw/src/components/DropdownMenu/DMArrow.tsx index db5452d7a..9a01f1105 100644 --- a/packages/tldraw/src/components/DropdownMenu/DMArrow.tsx +++ b/packages/tldraw/src/components/DropdownMenu/DMArrow.tsx @@ -1,5 +1,5 @@ import { Arrow } from '@radix-ui/react-dropdown-menu' import { breakpoints } from '~components/breakpoints' -import styled from '~styles/stitches.config' +import { styled } from '~styles/stitches.config' export const DMArrow = styled(Arrow, { fill: '$panel', bp: breakpoints }) diff --git a/packages/tldraw/src/components/DropdownMenu/DMContent.tsx b/packages/tldraw/src/components/DropdownMenu/DMContent.tsx index 90721ad56..4e093c69a 100644 --- a/packages/tldraw/src/components/DropdownMenu/DMContent.tsx +++ b/packages/tldraw/src/components/DropdownMenu/DMContent.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { Content } from '@radix-ui/react-dropdown-menu' -import styled from '~styles/stitches.config' +import { styled } from '~styles/stitches.config' import { MenuContent } from '~components/MenuContent' export interface DMContentProps { diff --git a/packages/tldraw/src/components/DropdownMenu/DMDivider.tsx b/packages/tldraw/src/components/DropdownMenu/DMDivider.tsx index 6e53c348c..37bde57fc 100644 --- a/packages/tldraw/src/components/DropdownMenu/DMDivider.tsx +++ b/packages/tldraw/src/components/DropdownMenu/DMDivider.tsx @@ -1,5 +1,5 @@ import { Separator } from '@radix-ui/react-dropdown-menu' -import styled from '~styles/stitches.config' +import { styled } from '~styles/stitches.config' export const DMDivider = styled(Separator, { backgroundColor: '$hover', diff --git a/packages/tldraw/src/components/DropdownMenu/DMIconButton.tsx b/packages/tldraw/src/components/DropdownMenu/DMIconButton.tsx deleted file mode 100644 index 05c347ca6..000000000 --- a/packages/tldraw/src/components/DropdownMenu/DMIconButton.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import * as React from 'react' -import { Item } from '@radix-ui/react-dropdown-menu' -import { IconButton } from '~components/IconButton/IconButton' - -interface DMIconButtonProps { - onSelect: () => void - disabled?: boolean - children: React.ReactNode -} - -export function DMIconButton({ - onSelect, - children, - disabled = false, -}: DMIconButtonProps): JSX.Element { - return ( - - - {children} - - - ) -} diff --git a/packages/tldraw/src/components/DropdownMenu/DMRadioItem.tsx b/packages/tldraw/src/components/DropdownMenu/DMRadioItem.tsx index aa1915638..1ddf652a0 100644 --- a/packages/tldraw/src/components/DropdownMenu/DMRadioItem.tsx +++ b/packages/tldraw/src/components/DropdownMenu/DMRadioItem.tsx @@ -1,5 +1,5 @@ import { RadioItem } from '@radix-ui/react-dropdown-menu' -import styled from '~styles/stitches.config' +import { styled } from '~styles/stitches.config' export const DMRadioItem = styled(RadioItem, { height: '32px', diff --git a/packages/tldraw/src/components/DropdownMenu/index.tsx b/packages/tldraw/src/components/DropdownMenu/index.tsx index 232f0c0d9..957c0fe45 100644 --- a/packages/tldraw/src/components/DropdownMenu/index.tsx +++ b/packages/tldraw/src/components/DropdownMenu/index.tsx @@ -3,7 +3,6 @@ export * from './DMItem' export * from './DMCheckboxItem' export * from './DMContent' export * from './DMDivider' -export * from './DMIconButton' export * from './DMRadioItem' export * from './DMSubMenu' export * from './DMTriggerIcon' diff --git a/packages/tldraw/src/components/FocusButton/FocusButton.tsx b/packages/tldraw/src/components/FocusButton/FocusButton.tsx index b214fb7f8..4c023ac99 100644 --- a/packages/tldraw/src/components/FocusButton/FocusButton.tsx +++ b/packages/tldraw/src/components/FocusButton/FocusButton.tsx @@ -1,7 +1,7 @@ import { DotFilledIcon } from '@radix-ui/react-icons' import * as React from 'react' import { IconButton } from '~components/IconButton/IconButton' -import styled from '~styles' +import { styled } from '~styles' interface FocusButtonProps { onSelect: () => void diff --git a/packages/tldraw/src/components/IconButton/IconButton.tsx b/packages/tldraw/src/components/IconButton/IconButton.tsx index 63471636b..bfdf20ca6 100644 --- a/packages/tldraw/src/components/IconButton/IconButton.tsx +++ b/packages/tldraw/src/components/IconButton/IconButton.tsx @@ -1,4 +1,4 @@ -import styled from '~styles' +import { styled } from '~styles' export const IconButton = styled('button', { position: 'relative', diff --git a/packages/tldraw/src/components/Kbd/Kbd.tsx b/packages/tldraw/src/components/Kbd/Kbd.tsx index b24cb954b..bc6e9d10a 100644 --- a/packages/tldraw/src/components/Kbd/Kbd.tsx +++ b/packages/tldraw/src/components/Kbd/Kbd.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import styled from '~styles' +import { styled } from '~styles' import { Utils } from '@tldraw/core' /* -------------------------------------------------- */ diff --git a/packages/tldraw/src/components/MenuContent/MenuContent.ts b/packages/tldraw/src/components/MenuContent/MenuContent.ts index 3130108bb..bacd4aa62 100644 --- a/packages/tldraw/src/components/MenuContent/MenuContent.ts +++ b/packages/tldraw/src/components/MenuContent/MenuContent.ts @@ -1,4 +1,4 @@ -import styled from '~styles' +import { styled } from '~styles' export const MenuContent = styled('div', { position: 'relative', diff --git a/packages/tldraw/src/components/Panel/Panel.tsx b/packages/tldraw/src/components/Panel/Panel.tsx index e863778cd..6ff8730ab 100644 --- a/packages/tldraw/src/components/Panel/Panel.tsx +++ b/packages/tldraw/src/components/Panel/Panel.tsx @@ -1,4 +1,4 @@ -import styled from '~styles/stitches.config' +import { styled } from '~styles/stitches.config' export const Panel = styled('div', { backgroundColor: '$panel', diff --git a/packages/tldraw/src/components/RowButton/RowButton.tsx b/packages/tldraw/src/components/RowButton/RowButton.tsx index c49b5f99e..0df3328af 100644 --- a/packages/tldraw/src/components/RowButton/RowButton.tsx +++ b/packages/tldraw/src/components/RowButton/RowButton.tsx @@ -4,7 +4,7 @@ import * as React from 'react' import { breakpoints } from '~components/breakpoints' import { Kbd } from '~components/Kbd' import { SmallIcon } from '~components/SmallIcon' -import styled from '~styles' +import { styled } from '~styles' export interface RowButtonProps { onSelect?: () => void diff --git a/packages/tldraw/src/components/SmallIcon/SmallIcon.tsx b/packages/tldraw/src/components/SmallIcon/SmallIcon.tsx index 6aee4a78d..bd1185aea 100644 --- a/packages/tldraw/src/components/SmallIcon/SmallIcon.tsx +++ b/packages/tldraw/src/components/SmallIcon/SmallIcon.tsx @@ -1,4 +1,4 @@ -import styled from '~styles' +import { styled } from '~styles' export const SmallIcon = styled('div', { height: '100%', diff --git a/packages/tldraw/src/components/ToolButton/ToolButton.tsx b/packages/tldraw/src/components/ToolButton/ToolButton.tsx index 12cb6f108..7eeefe4ed 100644 --- a/packages/tldraw/src/components/ToolButton/ToolButton.tsx +++ b/packages/tldraw/src/components/ToolButton/ToolButton.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import { breakpoints } from '~components/breakpoints' import { Tooltip } from '~components/Tooltip' -import styled from '~styles' +import { styled } from '~styles' export interface ToolButtonProps { onClick?: () => void diff --git a/packages/tldraw/src/components/ToolsPanel/ActionButton.tsx b/packages/tldraw/src/components/ToolsPanel/ActionButton.tsx index b20d00a46..e6f31aa17 100644 --- a/packages/tldraw/src/components/ToolsPanel/ActionButton.tsx +++ b/packages/tldraw/src/components/ToolsPanel/ActionButton.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import { Tooltip } from '~components/Tooltip/Tooltip' import * as DropdownMenu from '@radix-ui/react-dropdown-menu' import { useTLDrawContext } from '~hooks' -import styled from '~styles' +import { styled } from '~styles' import { AlignType, Data, DistributeType, StretchType } from '~types' import { ArrowDownIcon, diff --git a/packages/tldraw/src/components/ToolsPanel/BackToContent.tsx b/packages/tldraw/src/components/ToolsPanel/BackToContent.tsx index ac1224e33..e0d6f341b 100644 --- a/packages/tldraw/src/components/ToolsPanel/BackToContent.tsx +++ b/packages/tldraw/src/components/ToolsPanel/BackToContent.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import styled from '~styles' +import { styled } from '~styles' import type { Data } from '~types' import { useTLDrawContext } from '~hooks' import { RowButton } from '~components/RowButton' diff --git a/packages/tldraw/src/components/ToolsPanel/StatusBar.tsx b/packages/tldraw/src/components/ToolsPanel/StatusBar.tsx index c60557978..fc77e2aea 100644 --- a/packages/tldraw/src/components/ToolsPanel/StatusBar.tsx +++ b/packages/tldraw/src/components/ToolsPanel/StatusBar.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import { useTLDrawContext } from '~hooks' import type { Data } from '~types' -import styled from '~styles' +import { styled } from '~styles' import { breakpoints } from '~components/breakpoints' const statusSelector = (s: Data) => s.appState.status diff --git a/packages/tldraw/src/components/ToolsPanel/ToolsPanel.tsx b/packages/tldraw/src/components/ToolsPanel/ToolsPanel.tsx index 1631471ed..ad1d62185 100644 --- a/packages/tldraw/src/components/ToolsPanel/ToolsPanel.tsx +++ b/packages/tldraw/src/components/ToolsPanel/ToolsPanel.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import styled from '~styles' +import { styled } from '~styles' import type { Data } from '~types' import { useTLDrawContext } from '~hooks' import { StatusBar } from './StatusBar' diff --git a/packages/tldraw/src/components/Tooltip/Tooltip.tsx b/packages/tldraw/src/components/Tooltip/Tooltip.tsx index 7d1aa4693..ed8df37bc 100644 --- a/packages/tldraw/src/components/Tooltip/Tooltip.tsx +++ b/packages/tldraw/src/components/Tooltip/Tooltip.tsx @@ -1,7 +1,7 @@ import * as RadixTooltip from '@radix-ui/react-tooltip' import * as React from 'react' import { Kbd } from '~components/Kbd' -import styled from '~styles' +import { styled } from '~styles' /* -------------------------------------------------- */ /* Tooltip */ diff --git a/packages/tldraw/src/components/TopPanel/ColorMenu.tsx b/packages/tldraw/src/components/TopPanel/ColorMenu.tsx index f58a73341..fba9289e4 100644 --- a/packages/tldraw/src/components/TopPanel/ColorMenu.tsx +++ b/packages/tldraw/src/components/TopPanel/ColorMenu.tsx @@ -1,20 +1,20 @@ import * as React from 'react' import * as DropdownMenu from '@radix-ui/react-dropdown-menu' -import { strokes } from '~shape-utils' -import { useTheme, useTLDrawContext } from '~hooks' -import type { Data, ColorStyle } from '~types' -import CircleIcon from '~components/icons/CircleIcon' +import { strokes } from '~state/shapes/shape-styles' +import { useTLDrawContext } from '~hooks' import { DMContent, DMTriggerIcon } from '~components/DropdownMenu' -import { BoxIcon } from '~components/icons' +import { BoxIcon, CircleIcon } from '~components/icons' import { ToolButton } from '~components/ToolButton' +import type { Data, ColorStyle } from '~types' const selectColor = (s: Data) => s.appState.selectedStyle.color const preventEvent = (e: Event) => e.preventDefault() +const themeSelector = (data: Data) => (data.settings.isDarkMode ? 'dark' : 'light') export const ColorMenu = React.memo((): JSX.Element => { - const { theme } = useTheme() const { tlstate, useSelector } = useTLDrawContext() + const theme = useSelector(themeSelector) const color = useSelector(selectColor) return ( diff --git a/packages/tldraw/src/components/TopPanel/PageMenu.tsx b/packages/tldraw/src/components/TopPanel/PageMenu.tsx index 63168c68d..cb3a09f61 100644 --- a/packages/tldraw/src/components/TopPanel/PageMenu.tsx +++ b/packages/tldraw/src/components/TopPanel/PageMenu.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import * as DropdownMenu from '@radix-ui/react-dropdown-menu' import { PlusIcon, CheckIcon } from '@radix-ui/react-icons' import { PageOptionsDialog } from './PageOptionsDialog' -import styled from '~styles' +import { styled } from '~styles' import { useTLDrawContext } from '~hooks' import type { Data } from '~types' import { DMContent, DMDivider } from '~components/DropdownMenu' diff --git a/packages/tldraw/src/components/TopPanel/PageOptionsDialog.tsx b/packages/tldraw/src/components/TopPanel/PageOptionsDialog.tsx index 9f11e22c8..094b61ec6 100644 --- a/packages/tldraw/src/components/TopPanel/PageOptionsDialog.tsx +++ b/packages/tldraw/src/components/TopPanel/PageOptionsDialog.tsx @@ -4,7 +4,7 @@ import { MixerVerticalIcon } from '@radix-ui/react-icons' import type { Data, TLDrawPage } from '~types' import { useTLDrawContext } from '~hooks' import { RowButton, RowButtonProps } from '~components/RowButton' -import styled from '~styles' +import { styled } from '~styles' import { Divider } from '~components/Divider' import { IconButton } from '~components/IconButton/IconButton' import { SmallIcon } from '~components/SmallIcon' diff --git a/packages/tldraw/src/components/TopPanel/TopPanel.tsx b/packages/tldraw/src/components/TopPanel/TopPanel.tsx index f8d10da91..85ec98fc3 100644 --- a/packages/tldraw/src/components/TopPanel/TopPanel.tsx +++ b/packages/tldraw/src/components/TopPanel/TopPanel.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { Menu } from './Menu' -import styled from '~styles' +import { styled } from '~styles' import { PageMenu } from './PageMenu' import { ZoomMenu } from './ZoomMenu' import { DashMenu } from './DashMenu' diff --git a/packages/tldraw/src/components/TopPanel/ZoomMenu.tsx b/packages/tldraw/src/components/TopPanel/ZoomMenu.tsx index c2520d6e5..796b90483 100644 --- a/packages/tldraw/src/components/TopPanel/ZoomMenu.tsx +++ b/packages/tldraw/src/components/TopPanel/ZoomMenu.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import { useTLDrawContext } from '~hooks' import type { Data } from '~types' -import styled from '~styles' +import { styled } from '~styles' import * as DropdownMenu from '@radix-ui/react-dropdown-menu' import { DMItem, DMContent } from '~components/DropdownMenu' import { ToolButton } from '~components/ToolButton' diff --git a/packages/tldraw/src/components/icons/CheckIcon.tsx b/packages/tldraw/src/components/icons/CheckIcon.tsx deleted file mode 100644 index 19ee800e3..000000000 --- a/packages/tldraw/src/components/icons/CheckIcon.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import * as React from 'react' - -function CheckIcon(props: React.SVGProps): JSX.Element { - return ( - - - - - ) -} - -export default CheckIcon diff --git a/packages/tldraw/src/components/icons/CircleIcon.tsx b/packages/tldraw/src/components/icons/CircleIcon.tsx index 009689b73..e1f64c5e5 100644 --- a/packages/tldraw/src/components/icons/CircleIcon.tsx +++ b/packages/tldraw/src/components/icons/CircleIcon.tsx @@ -1,6 +1,6 @@ import * as React from 'react' -export default function CircleIcon( +export function CircleIcon( props: Pick, 'stroke' | 'fill'> & { size: number } diff --git a/packages/tldraw/src/components/icons/index.ts b/packages/tldraw/src/components/icons/index.ts index 7702dcbe1..aeeb1685a 100644 --- a/packages/tldraw/src/components/icons/index.ts +++ b/packages/tldraw/src/components/icons/index.ts @@ -1,5 +1,4 @@ export * from './BoxIcon' -export * from './CheckIcon' export * from './CircleIcon' export * from './DashDashedIcon' export * from './DashDottedIcon' diff --git a/packages/tldraw/src/hooks/index.ts b/packages/tldraw/src/hooks/index.ts index 27761c4cc..226eb59da 100644 --- a/packages/tldraw/src/hooks/index.ts +++ b/packages/tldraw/src/hooks/index.ts @@ -1,6 +1,6 @@ export * from './useKeyboardShortcuts' export * from './useTLDrawContext' export * from './useTheme' -export * from './useCustomFonts' +export * from './useStylesheet' export * from './useFileSystemHandlers' export * from './useFileSystem' diff --git a/packages/tldraw/src/hooks/useCustomFonts.ts b/packages/tldraw/src/hooks/useCustomFonts.ts deleted file mode 100644 index c80a9c470..000000000 --- a/packages/tldraw/src/hooks/useCustomFonts.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { useStyle, css } from '~hooks/useStyle' - -const customFonts = css` - @import url('https://fonts.googleapis.com/css2?family=Caveat+Brush&display=swap'); -` - -export function useCustomFonts() { - useStyle('tldraw-fonts', customFonts) -} diff --git a/packages/tldraw/src/hooks/useStyle.ts b/packages/tldraw/src/hooks/useStyle.ts deleted file mode 100644 index 7aa82eb24..000000000 --- a/packages/tldraw/src/hooks/useStyle.ts +++ /dev/null @@ -1,30 +0,0 @@ -import * as React from 'react' - -const styles = new Map() - -export const css = (strings: TemplateStringsArray, ...args: unknown[]) => - strings.reduce( - (acc, string, index) => acc + string + (index < args.length ? args[index] : ''), - '' - ) - -export function useStyle(uid: string, rules: string) { - React.useLayoutEffect(() => { - if (styles.get(uid)) { - return () => void null - } - - const style = document.createElement('style') - style.innerHTML = rules - style.setAttribute('id', uid) - document.head.appendChild(style) - styles.set(uid, style) - - return () => { - if (style && document.head.contains(style)) { - document.head.removeChild(style) - styles.delete(uid) - } - } - }, [uid, rules]) -} diff --git a/packages/tldraw/src/hooks/useStylesheet.ts b/packages/tldraw/src/hooks/useStylesheet.ts new file mode 100644 index 000000000..e5c154a95 --- /dev/null +++ b/packages/tldraw/src/hooks/useStylesheet.ts @@ -0,0 +1,25 @@ +import * as React from 'react' + +const styles = new Map() + +const UID = `tldraw-fonts` +const CSS = `@import url('https://fonts.googleapis.com/css2?family=Caveat+Brush&display=swap')` + +export function useStylesheet() { + React.useLayoutEffect(() => { + if (styles.get(UID)) return + + const style = document.createElement('style') + style.innerHTML = CSS + style.setAttribute('id', UID) + document.head.appendChild(style) + styles.set(UID, style) + + return () => { + if (style && document.head.contains(style)) { + document.head.removeChild(style) + styles.delete(UID) + } + } + }, [UID, CSS]) +} diff --git a/packages/tldraw/src/hooks/useTheme.ts b/packages/tldraw/src/hooks/useTheme.ts index 3ccb86505..419b74638 100644 --- a/packages/tldraw/src/hooks/useTheme.ts +++ b/packages/tldraw/src/hooks/useTheme.ts @@ -5,7 +5,6 @@ const themeSelector = (data: Data): Theme => (data.settings.isDarkMode ? 'dark' export function useTheme() { const { tlstate, useSelector } = useTLDrawContext() - const theme = useSelector(themeSelector) return { diff --git a/packages/tldraw/src/index.ts b/packages/tldraw/src/index.ts index b8a7c6603..75fa44917 100644 --- a/packages/tldraw/src/index.ts +++ b/packages/tldraw/src/index.ts @@ -1,5 +1,5 @@ export * from './TLDraw' export * from './types' -export * from './shape-utils' +export * from './state/shapes' export { TLDrawState } from './state' export { useFileSystem } from './hooks' diff --git a/packages/tldraw/src/shape-utils/arrow/index.ts b/packages/tldraw/src/shape-utils/arrow/index.ts deleted file mode 100644 index 3972a3181..000000000 --- a/packages/tldraw/src/shape-utils/arrow/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './arrow' diff --git a/packages/tldraw/src/shape-utils/draw/index.ts b/packages/tldraw/src/shape-utils/draw/index.ts deleted file mode 100644 index edf595698..000000000 --- a/packages/tldraw/src/shape-utils/draw/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './draw' diff --git a/packages/tldraw/src/shape-utils/ellipse/index.ts b/packages/tldraw/src/shape-utils/ellipse/index.ts deleted file mode 100644 index 4978dc84d..000000000 --- a/packages/tldraw/src/shape-utils/ellipse/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './ellipse' diff --git a/packages/tldraw/src/shape-utils/group/index.ts b/packages/tldraw/src/shape-utils/group/index.ts deleted file mode 100644 index ff648b3b5..000000000 --- a/packages/tldraw/src/shape-utils/group/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './group' diff --git a/packages/tldraw/src/shape-utils/index.ts b/packages/tldraw/src/shape-utils/index.ts deleted file mode 100644 index b4e85e0e8..000000000 --- a/packages/tldraw/src/shape-utils/index.ts +++ /dev/null @@ -1,50 +0,0 @@ -import type { TLDrawShapeUtil } from './TLDrawShapeUtil' -import { RectangleUtil } from './rectangle' -import { EllipseUtil } from './ellipse' -import { ArrowUtil } from './arrow' -import { GroupUtil } from './group' -import { StickyUtil } from './sticky' -import { TextUtil } from './text' -import { DrawUtil } from './draw' -import { TLDrawShape, TLDrawShapeType } from '~types' - -export * from './shape-styles' -export * from './TLDrawShapeUtil' - -export const Rectangle = new RectangleUtil() -export const Ellipse = new EllipseUtil() -export const Draw = new DrawUtil() -export const Arrow = new ArrowUtil() -export const Text = new TextUtil() -export const Group = new GroupUtil() -export const Sticky = new StickyUtil() - -// type Utils = RectangleUtil | EllipseUtil | DrawUtil | ArrowUtil | TextUtil | GroupUtil | StickyUtil - -// type MappedByKey> = { -// [P in T[K]]: T extends any ? (P extends T[K] ? T : never) : never -// } - -// export type ShapeUtilsMap = MappedByKey - -// export const getShapeUtils = ( -// type: T | Extract -// ): ShapeUtilsMap[T] => { -// if (typeof type === 'string') return shapeUtils[type] -// return shapeUtils[type.type] -// } - -export const shapeUtils = { - [TLDrawShapeType.Rectangle]: Rectangle, - [TLDrawShapeType.Ellipse]: Ellipse, - [TLDrawShapeType.Draw]: Draw, - [TLDrawShapeType.Arrow]: Arrow, - [TLDrawShapeType.Text]: Text, - [TLDrawShapeType.Group]: Group, - [TLDrawShapeType.Sticky]: Sticky, -} - -export const getShapeUtils = (shape: T | T['type']) => { - if (typeof shape === 'string') return shapeUtils[shape] as unknown as TLDrawShapeUtil - return shapeUtils[shape.type] as unknown as TLDrawShapeUtil -} diff --git a/packages/tldraw/src/shape-utils/rectangle/index.ts b/packages/tldraw/src/shape-utils/rectangle/index.ts deleted file mode 100644 index 1bab6b8ef..000000000 --- a/packages/tldraw/src/shape-utils/rectangle/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './rectangle' diff --git a/packages/tldraw/src/shape-utils/sticky/index.ts b/packages/tldraw/src/shape-utils/sticky/index.ts deleted file mode 100644 index 6f9a20e35..000000000 --- a/packages/tldraw/src/shape-utils/sticky/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './sticky' diff --git a/packages/tldraw/src/shape-utils/text/index.ts b/packages/tldraw/src/shape-utils/text/index.ts deleted file mode 100644 index 1693b5809..000000000 --- a/packages/tldraw/src/shape-utils/text/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './text' diff --git a/packages/tldraw/src/state/tldr.ts b/packages/tldraw/src/state/TLDR.ts similarity index 99% rename from packages/tldraw/src/state/tldr.ts rename to packages/tldraw/src/state/TLDR.ts index 7f9c91060..2604ae8e6 100644 --- a/packages/tldraw/src/state/tldr.ts +++ b/packages/tldraw/src/state/TLDR.ts @@ -1,5 +1,4 @@ import { TLBounds, TLTransformInfo, Utils, TLPageState } from '@tldraw/core' -import { getShapeUtils, TLDrawShapeUtil } from '~shape-utils' import { Data, ShapeStyles, @@ -13,6 +12,8 @@ import { ArrowShape, } from '~types' import { Vec } from '@tldraw/vec' +import type { TLDrawShapeUtil } from './shapes/TLDrawShapeUtil' +import { getShapeUtils } from './shapes' export class TLDR { // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/packages/tldraw/src/state/tlstate.spec.ts b/packages/tldraw/src/state/TLDrawState.spec.ts similarity index 97% rename from packages/tldraw/src/state/tlstate.spec.ts rename to packages/tldraw/src/state/TLDrawState.spec.ts index 6eefebb25..4f2713680 100644 --- a/packages/tldraw/src/state/tlstate.spec.ts +++ b/packages/tldraw/src/state/TLDrawState.spec.ts @@ -1,13 +1,13 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ -import { TLDrawState } from './tlstate' -import { mockDocument, TLStateUtils } from '~test' +import { TLDrawState } from './TLDrawState' +import { mockDocument, TLDrawStateUtils } from '~test' import { ArrowShape, ColorStyle, SessionType, TLDrawShapeType } from '~types' -import type { SelectTool } from './tool/SelectTool' +import type { SelectTool } from './tools/SelectTool' describe('TLDrawState', () => { const tlstate = new TLDrawState() - const tlu = new TLStateUtils(tlstate) + const tlu = new TLDrawStateUtils(tlstate) describe('When copying and pasting...', () => { it('copies a shape', () => { @@ -357,7 +357,7 @@ describe('TLDrawState', () => { .loadDocument(mockDocument) .group(['rect1', 'rect2'], 'groupA') - const tlu = new TLStateUtils(tlstate) + const tlu = new TLDrawStateUtils(tlstate) tlu.clickShape('rect1') expect((tlstate.currentTool as SelectTool).selectedGroupId).toBeUndefined() expect(tlstate.selectedIds).toStrictEqual(['groupA']) @@ -368,7 +368,7 @@ describe('TLDrawState', () => { .loadDocument(mockDocument) .group(['rect1', 'rect2'], 'groupA') - const tlu = new TLStateUtils(tlstate) + const tlu = new TLDrawStateUtils(tlstate) tlu.doubleClickShape('rect1') expect((tlstate.currentTool as SelectTool).selectedGroupId).toStrictEqual('groupA') expect(tlstate.selectedIds).toStrictEqual(['rect1']) @@ -379,7 +379,7 @@ describe('TLDrawState', () => { .loadDocument(mockDocument) .group(['rect1', 'rect2'], 'groupA') - const tlu = new TLStateUtils(tlstate) + const tlu = new TLDrawStateUtils(tlstate) tlu.doubleClickShape('rect1') tlu.clickShape('rect3') expect((tlstate.currentTool as SelectTool).selectedGroupId).toBeUndefined() @@ -392,7 +392,7 @@ describe('TLDrawState', () => { .group(['rect1', 'rect2'], 'groupA') .deselectAll() - const tlu = new TLStateUtils(tlstate) + const tlu = new TLDrawStateUtils(tlstate) tlu.clickShape('rect1', { ctrlKey: true, shiftKey: true }) expect(tlstate.selectedIds).toStrictEqual(['rect1']) @@ -406,7 +406,7 @@ describe('TLDrawState', () => { .loadDocument(mockDocument) .group(['rect1', 'rect2'], 'groupA') - const tlu = new TLStateUtils(tlstate) + const tlu = new TLDrawStateUtils(tlstate) tlu.clickShape('rect1', { ctrlKey: true, shiftKey: true }) expect(tlstate.selectedIds).toStrictEqual(['rect1']) @@ -438,7 +438,7 @@ describe('TLDrawState', () => { ) .selectTool(TLDrawShapeType.Rectangle) - const tlu = new TLStateUtils(tlstate) + const tlu = new TLDrawStateUtils(tlstate) const prevA = tlstate.shapes.map((shape) => shape.id) diff --git a/packages/tldraw/src/state/tlstate.ts b/packages/tldraw/src/state/TLDrawState.ts similarity index 96% rename from packages/tldraw/src/state/tlstate.ts rename to packages/tldraw/src/state/TLDrawState.ts index 6bf628ee0..147e047cc 100644 --- a/packages/tldraw/src/state/tlstate.ts +++ b/packages/tldraw/src/state/TLDrawState.ts @@ -40,17 +40,21 @@ import { ExceptFirst, ExceptFirstTwo, } from '~types' -import { TLDR } from './tldr' -import { defaultStyle, shapeUtils } from '~shape-utils' -import * as Commands from './command' -import { ArgsOfType, getSession } from './session' -import { sample } from './utils' -import { createTools, ToolType } from './tool' -import type { BaseTool } from './tool/BaseTool' +import { + migrate, + FileSystemHandle, + loadFileHandle, + openFromFileSystem, + saveToFileSystem, +} from './data' +import { TLDR } from './TLDR' +import { shapeUtils } from '~state/shapes' +import { defaultStyle } from '~state/shapes/shape-styles' +import * as Commands from './commands' +import { ArgsOfType, getSession } from './sessions' +import { createTools, ToolType } from './tools' +import type { BaseTool } from './tools/BaseTool' import { USER_COLORS, FIT_TO_SCREEN_PADDING } from '~constants' -import { migrate } from './data/migrate' -import { loadFileHandle, openFromFileSystem, saveToFileSystem } from './data/filesystem' -import type { FileSystemHandle } from './data/browser-fs-access' const uuid = Utils.uniqueId() @@ -791,7 +795,7 @@ export class TLDrawState extends StateManager { users: { [uuid]: { id: uuid, - color: sample(USER_COLORS), + color: USER_COLORS[Math.floor(Math.random() * USER_COLORS.length)], point: [100, 100], selectedIds: [], activeShapes: [], @@ -1992,7 +1996,7 @@ export class TLDrawState extends StateManager { */ create = (shapes: TLDrawShape[] = [], bindings: TLDrawBinding[] = []): this => { if (shapes.length === 0) return this - return this.setState(Commands.create(this.state, shapes, bindings)) + return this.setState(Commands.createShapes(this.state, shapes, bindings)) } /** @@ -2002,7 +2006,7 @@ export class TLDrawState extends StateManager { */ patchCreate = (shapes: TLDrawShape[] = [], bindings: TLDrawBinding[] = []): this => { if (shapes.length === 0) return this - return this.patchState(Commands.create(this.state, shapes, bindings).after) + return this.patchState(Commands.createShapes(this.state, shapes, bindings).after) } /** @@ -2030,7 +2034,7 @@ export class TLDrawState extends StateManager { * @param ids The ids of the shapes to change (defaults to selection). */ style = (style: Partial, ids = this.selectedIds): this => { - return this.setState(Commands.style(this.state, ids, style)) + return this.setState(Commands.styleShapes(this.state, ids, style)) } /** @@ -2040,7 +2044,7 @@ export class TLDrawState extends StateManager { */ align = (type: AlignType, ids = this.selectedIds): this => { if (ids.length < 2) return this - return this.setState(Commands.align(this.state, ids, type)) + return this.setState(Commands.alignShapes(this.state, ids, type)) } /** @@ -2050,7 +2054,7 @@ export class TLDrawState extends StateManager { */ distribute = (direction: DistributeType, ids = this.selectedIds): this => { if (ids.length < 3) return this - return this.setState(Commands.distribute(this.state, ids, direction)) + return this.setState(Commands.distributeShapes(this.state, ids, direction)) } /** @@ -2060,7 +2064,7 @@ export class TLDrawState extends StateManager { */ stretch = (direction: StretchType, ids = this.selectedIds): this => { if (ids.length < 2) return this - return this.setState(Commands.stretch(this.state, ids, direction)) + return this.setState(Commands.stretchShapes(this.state, ids, direction)) } /** @@ -2069,7 +2073,7 @@ export class TLDrawState extends StateManager { */ flipHorizontal = (ids = this.selectedIds): this => { if (ids.length === 0) return this - return this.setState(Commands.flip(this.state, ids, FlipType.Horizontal)) + return this.setState(Commands.flipShapes(this.state, ids, FlipType.Horizontal)) } /** @@ -2078,7 +2082,7 @@ export class TLDrawState extends StateManager { */ flipVertical = (ids = this.selectedIds): this => { if (ids.length === 0) return this - return this.setState(Commands.flip(this.state, ids, FlipType.Vertical)) + return this.setState(Commands.flipShapes(this.state, ids, FlipType.Vertical)) } /** @@ -2093,7 +2097,7 @@ export class TLDrawState extends StateManager { ids = this.selectedIds ): this => { if (ids.length === 0) return this - this.setState(Commands.moveToPage(this.state, ids, this.bounds, fromPageId, toPageId)) + this.setState(Commands.moveShapesToPage(this.state, ids, this.bounds, fromPageId, toPageId)) return this } @@ -2103,7 +2107,7 @@ export class TLDrawState extends StateManager { */ moveToBack = (ids = this.selectedIds): this => { if (ids.length === 0) return this - return this.setState(Commands.move(this.state, ids, MoveType.ToBack)) + return this.setState(Commands.reorderShapes(this.state, ids, MoveType.ToBack)) } /** @@ -2112,7 +2116,7 @@ export class TLDrawState extends StateManager { */ moveBackward = (ids = this.selectedIds): this => { if (ids.length === 0) return this - return this.setState(Commands.move(this.state, ids, MoveType.Backward)) + return this.setState(Commands.reorderShapes(this.state, ids, MoveType.Backward)) } /** @@ -2121,7 +2125,7 @@ export class TLDrawState extends StateManager { */ moveForward = (ids = this.selectedIds): this => { if (ids.length === 0) return this - return this.setState(Commands.move(this.state, ids, MoveType.Forward)) + return this.setState(Commands.reorderShapes(this.state, ids, MoveType.Forward)) } /** @@ -2130,7 +2134,7 @@ export class TLDrawState extends StateManager { */ moveToFront = (ids = this.selectedIds): this => { if (ids.length === 0) return this - return this.setState(Commands.move(this.state, ids, MoveType.ToFront)) + return this.setState(Commands.reorderShapes(this.state, ids, MoveType.ToFront)) } /** @@ -2141,7 +2145,9 @@ export class TLDrawState extends StateManager { */ nudge = (delta: number[], isMajor = false, ids = this.selectedIds): this => { if (ids.length === 0) return this - return this.setState(Commands.translate(this.state, ids, Vec.mul(delta, isMajor ? 10 : 1))) + return this.setState( + Commands.translateShapes(this.state, ids, Vec.mul(delta, isMajor ? 10 : 1)) + ) } /** @@ -2151,7 +2157,7 @@ export class TLDrawState extends StateManager { duplicate = (ids = this.selectedIds, point?: number[]): this => { if (this.readOnly) return this if (ids.length === 0) return this - return this.setState(Commands.duplicate(this.state, ids, point)) + return this.setState(Commands.duplicateShapes(this.state, ids, point)) } /** @@ -2171,7 +2177,7 @@ export class TLDrawState extends StateManager { */ toggleHidden = (ids = this.selectedIds): this => { if (ids.length === 0) return this - return this.setState(Commands.toggle(this.state, ids, 'isHidden')) + return this.setState(Commands.toggleShapeProp(this.state, ids, 'isHidden')) } /** @@ -2180,7 +2186,7 @@ export class TLDrawState extends StateManager { */ toggleLocked = (ids = this.selectedIds): this => { if (ids.length === 0) return this - return this.setState(Commands.toggle(this.state, ids, 'isLocked')) + return this.setState(Commands.toggleShapeProp(this.state, ids, 'isLocked')) } /** @@ -2189,7 +2195,7 @@ export class TLDrawState extends StateManager { */ toggleAspectRatioLocked = (ids = this.selectedIds): this => { if (ids.length === 0) return this - return this.setState(Commands.toggle(this.state, ids, 'isAspectRatioLocked')) + return this.setState(Commands.toggleShapeProp(this.state, ids, 'isAspectRatioLocked')) } /** @@ -2199,7 +2205,7 @@ export class TLDrawState extends StateManager { */ toggleDecoration = (handleId: string, ids = this.selectedIds): this => { if (ids.length === 0 || !(handleId === 'start' || handleId === 'end')) return this - return this.setState(Commands.toggleDecoration(this.state, ids, handleId)) + return this.setState(Commands.toggleShapesDecoration(this.state, ids, handleId)) } /** @@ -2209,7 +2215,7 @@ export class TLDrawState extends StateManager { */ rotate = (delta = Math.PI * -0.5, ids = this.selectedIds): this => { if (ids.length === 0) return this - const change = Commands.rotate(this.state, ids, delta) + const change = Commands.rotateShapes(this.state, ids, delta) if (!change) return this return this.setState(change) } @@ -2232,7 +2238,7 @@ export class TLDrawState extends StateManager { if (ids.length < 2) return this - const command = Commands.group(this.state, ids, groupId, pageId) + const command = Commands.groupShapes(this.state, ids, groupId, pageId) if (!command) return this return this.setState(command) } @@ -2250,7 +2256,7 @@ export class TLDrawState extends StateManager { if (groups.length === 0) return this - const command = Commands.ungroup(this.state, ids, groups as GroupShape[], pageId) + const command = Commands.ungroupShapes(this.state, ids, groups as GroupShape[], pageId) if (!command) return this return this.setState(command) } @@ -2582,7 +2588,7 @@ export class TLDrawState extends StateManager { users: { [uuid]: { id: uuid, - color: sample(USER_COLORS), + color: USER_COLORS[0], point: [100, 100], selectedIds: [], activeShapes: [], diff --git a/packages/tldraw/src/state/__snapshots__/tlstate.spec.ts.snap b/packages/tldraw/src/state/__snapshots__/TLDrawState.spec.ts.snap similarity index 100% rename from packages/tldraw/src/state/__snapshots__/tlstate.spec.ts.snap rename to packages/tldraw/src/state/__snapshots__/TLDrawState.spec.ts.snap diff --git a/packages/tldraw/src/state/command/align/index.ts b/packages/tldraw/src/state/command/align/index.ts deleted file mode 100644 index aea979be5..000000000 --- a/packages/tldraw/src/state/command/align/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './align.command' diff --git a/packages/tldraw/src/state/command/change-page/index.ts b/packages/tldraw/src/state/command/change-page/index.ts deleted file mode 100644 index 9bb65fb23..000000000 --- a/packages/tldraw/src/state/command/change-page/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './change-page.command' diff --git a/packages/tldraw/src/state/command/create-page/index.ts b/packages/tldraw/src/state/command/create-page/index.ts deleted file mode 100644 index 3a7e688ee..000000000 --- a/packages/tldraw/src/state/command/create-page/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './create-page.command' diff --git a/packages/tldraw/src/state/command/create/index.ts b/packages/tldraw/src/state/command/create/index.ts deleted file mode 100644 index 23c51abde..000000000 --- a/packages/tldraw/src/state/command/create/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './create.command' diff --git a/packages/tldraw/src/state/command/delete-page/index.ts b/packages/tldraw/src/state/command/delete-page/index.ts deleted file mode 100644 index e2cf32f75..000000000 --- a/packages/tldraw/src/state/command/delete-page/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './delete-page.command' diff --git a/packages/tldraw/src/state/command/delete/index.ts b/packages/tldraw/src/state/command/delete/index.ts deleted file mode 100644 index 8533b6a4d..000000000 --- a/packages/tldraw/src/state/command/delete/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './delete.command' diff --git a/packages/tldraw/src/state/command/distribute/index.ts b/packages/tldraw/src/state/command/distribute/index.ts deleted file mode 100644 index bfd88ac7f..000000000 --- a/packages/tldraw/src/state/command/distribute/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './distribute.command' diff --git a/packages/tldraw/src/state/command/duplicate-page/index.ts b/packages/tldraw/src/state/command/duplicate-page/index.ts deleted file mode 100644 index 88b563600..000000000 --- a/packages/tldraw/src/state/command/duplicate-page/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './duplicate-page.command' diff --git a/packages/tldraw/src/state/command/duplicate/index.ts b/packages/tldraw/src/state/command/duplicate/index.ts deleted file mode 100644 index fb794578c..000000000 --- a/packages/tldraw/src/state/command/duplicate/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './duplicate.command' diff --git a/packages/tldraw/src/state/command/flip/index.ts b/packages/tldraw/src/state/command/flip/index.ts deleted file mode 100644 index d2efac785..000000000 --- a/packages/tldraw/src/state/command/flip/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './flip.command' diff --git a/packages/tldraw/src/state/command/group/index.ts b/packages/tldraw/src/state/command/group/index.ts deleted file mode 100644 index 44b50d441..000000000 --- a/packages/tldraw/src/state/command/group/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './group.command' diff --git a/packages/tldraw/src/state/command/index.ts b/packages/tldraw/src/state/command/index.ts deleted file mode 100644 index 9dedc00cd..000000000 --- a/packages/tldraw/src/state/command/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -export * from './align' -export * from './change-page' -export * from './create-page' -export * from './create' -export * from './delete-page' -export * from './delete' -export * from './distribute' -export * from './duplicate-page' -export * from './duplicate' -export * from './flip' -export * from './group' -export * from './move-to-page' -export * from './move' -export * from './rename-page' -export * from './reset-bounds' -export * from './rotate' -export * from './stretch' -export * from './style' -export * from './toggle-decoration' -export * from './toggle' -export * from './translate' -export * from './ungroup' -export * from './update' diff --git a/packages/tldraw/src/state/command/move-to-page/index.ts b/packages/tldraw/src/state/command/move-to-page/index.ts deleted file mode 100644 index 21ecc899c..000000000 --- a/packages/tldraw/src/state/command/move-to-page/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './move-to-page.command' diff --git a/packages/tldraw/src/state/command/move/index.ts b/packages/tldraw/src/state/command/move/index.ts deleted file mode 100644 index 3a288b43a..000000000 --- a/packages/tldraw/src/state/command/move/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './move.command' diff --git a/packages/tldraw/src/state/command/rename-page/index.ts b/packages/tldraw/src/state/command/rename-page/index.ts deleted file mode 100644 index 950267b07..000000000 --- a/packages/tldraw/src/state/command/rename-page/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './rename-page.command' diff --git a/packages/tldraw/src/state/command/reset-bounds/index.ts b/packages/tldraw/src/state/command/reset-bounds/index.ts deleted file mode 100644 index 1e5b16970..000000000 --- a/packages/tldraw/src/state/command/reset-bounds/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './reset-bounds.command' diff --git a/packages/tldraw/src/state/command/rotate/index.ts b/packages/tldraw/src/state/command/rotate/index.ts deleted file mode 100644 index 3c348e7b0..000000000 --- a/packages/tldraw/src/state/command/rotate/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './rotate.command' diff --git a/packages/tldraw/src/state/command/stretch/index.ts b/packages/tldraw/src/state/command/stretch/index.ts deleted file mode 100644 index 5dd282e9e..000000000 --- a/packages/tldraw/src/state/command/stretch/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './stretch.command' diff --git a/packages/tldraw/src/state/command/style/index.ts b/packages/tldraw/src/state/command/style/index.ts deleted file mode 100644 index d6904ca34..000000000 --- a/packages/tldraw/src/state/command/style/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './style.command' diff --git a/packages/tldraw/src/state/command/toggle-decoration/index.ts b/packages/tldraw/src/state/command/toggle-decoration/index.ts deleted file mode 100644 index 42d32c22e..000000000 --- a/packages/tldraw/src/state/command/toggle-decoration/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './toggle-decoration.command' diff --git a/packages/tldraw/src/state/command/toggle/index.ts b/packages/tldraw/src/state/command/toggle/index.ts deleted file mode 100644 index e2901ec38..000000000 --- a/packages/tldraw/src/state/command/toggle/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './toggle.command' diff --git a/packages/tldraw/src/state/command/translate/index.ts b/packages/tldraw/src/state/command/translate/index.ts deleted file mode 100644 index 04a2748d6..000000000 --- a/packages/tldraw/src/state/command/translate/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './translate.command' diff --git a/packages/tldraw/src/state/command/ungroup/index.ts b/packages/tldraw/src/state/command/ungroup/index.ts deleted file mode 100644 index ab15bf060..000000000 --- a/packages/tldraw/src/state/command/ungroup/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './ungroup.command' diff --git a/packages/tldraw/src/state/command/update/index.ts b/packages/tldraw/src/state/command/update/index.ts deleted file mode 100644 index cc22385b2..000000000 --- a/packages/tldraw/src/state/command/update/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './update.command' diff --git a/packages/tldraw/src/state/command/align/align.command.spec.ts b/packages/tldraw/src/state/commands/alignShapes/alignShapes.spec.ts similarity index 96% rename from packages/tldraw/src/state/command/align/align.command.spec.ts rename to packages/tldraw/src/state/commands/alignShapes/alignShapes.spec.ts index e8228fb31..ff5a6c2c1 100644 --- a/packages/tldraw/src/state/command/align/align.command.spec.ts +++ b/packages/tldraw/src/state/commands/alignShapes/alignShapes.spec.ts @@ -1,6 +1,6 @@ import Vec from '@tldraw/vec' import { TLDrawState } from '~state' -import { mockDocument, TLStateUtils } from '~test' +import { mockDocument, TLDrawStateUtils } from '~test' import { AlignType, TLDrawShapeType } from '~types' describe('Align command', () => { @@ -95,7 +95,7 @@ describe('when aligning groups', () => { tlstate.undo().delete(['rect4']).selectAll().align(AlignType.CenterVertical) - new TLStateUtils(tlstate).expectShapesToBeAtPoints({ + new TLDrawStateUtils(tlstate).expectShapesToBeAtPoints({ rect1: p0, rect2: Vec.add(p0, [100, 100]), rect3: p1, diff --git a/packages/tldraw/src/state/command/align/align.command.ts b/packages/tldraw/src/state/commands/alignShapes/alignShapes.ts similarity index 95% rename from packages/tldraw/src/state/command/align/align.command.ts rename to packages/tldraw/src/state/commands/alignShapes/alignShapes.ts index 8ffbf1948..cc8e5143c 100644 --- a/packages/tldraw/src/state/command/align/align.command.ts +++ b/packages/tldraw/src/state/commands/alignShapes/alignShapes.ts @@ -2,10 +2,10 @@ import { Utils } from '@tldraw/core' import { AlignType, TLDrawCommand, TLDrawShapeType } from '~types' import type { Data } from '~types' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' import Vec from '@tldraw/vec' -export function align(data: Data, ids: string[], type: AlignType): TLDrawCommand { +export function alignShapes(data: Data, ids: string[], type: AlignType): TLDrawCommand { const { currentPageId } = data.appState const initialShapes = ids.map((id) => TLDR.getShape(data, id, currentPageId)) diff --git a/packages/tldraw/src/state/commands/alignShapes/index.ts b/packages/tldraw/src/state/commands/alignShapes/index.ts new file mode 100644 index 000000000..8729e2a61 --- /dev/null +++ b/packages/tldraw/src/state/commands/alignShapes/index.ts @@ -0,0 +1 @@ +export * from './alignShapes' diff --git a/packages/tldraw/src/state/command/change-page/change-page.command.spec.ts b/packages/tldraw/src/state/commands/changePage/changePage.spec.ts similarity index 100% rename from packages/tldraw/src/state/command/change-page/change-page.command.spec.ts rename to packages/tldraw/src/state/commands/changePage/changePage.spec.ts diff --git a/packages/tldraw/src/state/command/change-page/change-page.command.ts b/packages/tldraw/src/state/commands/changePage/changePage.ts similarity index 100% rename from packages/tldraw/src/state/command/change-page/change-page.command.ts rename to packages/tldraw/src/state/commands/changePage/changePage.ts diff --git a/packages/tldraw/src/state/commands/changePage/index.ts b/packages/tldraw/src/state/commands/changePage/index.ts new file mode 100644 index 000000000..c4eb67a15 --- /dev/null +++ b/packages/tldraw/src/state/commands/changePage/index.ts @@ -0,0 +1 @@ +export * from './changePage' diff --git a/packages/tldraw/src/state/command/create-page/create-page.command.spec.ts b/packages/tldraw/src/state/commands/createPage/createPage.spec.ts similarity index 100% rename from packages/tldraw/src/state/command/create-page/create-page.command.spec.ts rename to packages/tldraw/src/state/commands/createPage/createPage.spec.ts diff --git a/packages/tldraw/src/state/command/create-page/create-page.command.ts b/packages/tldraw/src/state/commands/createPage/createPage.ts similarity index 100% rename from packages/tldraw/src/state/command/create-page/create-page.command.ts rename to packages/tldraw/src/state/commands/createPage/createPage.ts diff --git a/packages/tldraw/src/state/commands/createPage/index.ts b/packages/tldraw/src/state/commands/createPage/index.ts new file mode 100644 index 000000000..07775a196 --- /dev/null +++ b/packages/tldraw/src/state/commands/createPage/index.ts @@ -0,0 +1 @@ +export * from './createPage' diff --git a/packages/tldraw/src/state/command/create/create.command.spec.ts b/packages/tldraw/src/state/commands/createShapes/createShapes.spec.ts similarity index 100% rename from packages/tldraw/src/state/command/create/create.command.spec.ts rename to packages/tldraw/src/state/commands/createShapes/createShapes.spec.ts diff --git a/packages/tldraw/src/state/command/create/create.command.ts b/packages/tldraw/src/state/commands/createShapes/createShapes.ts similarity index 95% rename from packages/tldraw/src/state/command/create/create.command.ts rename to packages/tldraw/src/state/commands/createShapes/createShapes.ts index 1fe6c0208..67e35f544 100644 --- a/packages/tldraw/src/state/command/create/create.command.ts +++ b/packages/tldraw/src/state/commands/createShapes/createShapes.ts @@ -1,8 +1,8 @@ import type { Patch } from 'rko' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' import type { TLDrawShape, Data, TLDrawCommand, TLDrawBinding } from '~types' -export function create( +export function createShapes( data: Data, shapes: TLDrawShape[], bindings: TLDrawBinding[] = [] diff --git a/packages/tldraw/src/state/commands/createShapes/index.ts b/packages/tldraw/src/state/commands/createShapes/index.ts new file mode 100644 index 000000000..8b042539f --- /dev/null +++ b/packages/tldraw/src/state/commands/createShapes/index.ts @@ -0,0 +1 @@ +export * from './createShapes' diff --git a/packages/tldraw/src/state/command/delete-page/delete-page.command.spec.ts b/packages/tldraw/src/state/commands/deletePage/deletePage.spec.ts similarity index 100% rename from packages/tldraw/src/state/command/delete-page/delete-page.command.spec.ts rename to packages/tldraw/src/state/commands/deletePage/deletePage.spec.ts diff --git a/packages/tldraw/src/state/command/delete-page/delete-page.command.ts b/packages/tldraw/src/state/commands/deletePage/deletePage.ts similarity index 100% rename from packages/tldraw/src/state/command/delete-page/delete-page.command.ts rename to packages/tldraw/src/state/commands/deletePage/deletePage.ts diff --git a/packages/tldraw/src/state/commands/deletePage/index.ts b/packages/tldraw/src/state/commands/deletePage/index.ts new file mode 100644 index 000000000..28b6c3023 --- /dev/null +++ b/packages/tldraw/src/state/commands/deletePage/index.ts @@ -0,0 +1 @@ +export * from './deletePage' diff --git a/packages/tldraw/src/state/command/delete/delete.command.spec.ts b/packages/tldraw/src/state/commands/deleteShapes/deleteShapes.spec.ts similarity index 100% rename from packages/tldraw/src/state/command/delete/delete.command.spec.ts rename to packages/tldraw/src/state/commands/deleteShapes/deleteShapes.spec.ts diff --git a/packages/tldraw/src/state/command/delete/delete.command.ts b/packages/tldraw/src/state/commands/deleteShapes/deleteShapes.ts similarity index 80% rename from packages/tldraw/src/state/command/delete/delete.command.ts rename to packages/tldraw/src/state/commands/deleteShapes/deleteShapes.ts index 602c5aab9..156f4969a 100644 --- a/packages/tldraw/src/state/command/delete/delete.command.ts +++ b/packages/tldraw/src/state/commands/deleteShapes/deleteShapes.ts @@ -1,8 +1,6 @@ -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' import type { Data, TLDrawCommand } from '~types' -import { removeShapesFromPage } from '../utils/removeShapesFromPage' - -// - [ ] Update parents and possibly delete parents +import { removeShapesFromPage } from '../shared/removeShapesFromPage' export function deleteShapes( data: Data, diff --git a/packages/tldraw/src/state/commands/deleteShapes/index.ts b/packages/tldraw/src/state/commands/deleteShapes/index.ts new file mode 100644 index 000000000..d015ea0e3 --- /dev/null +++ b/packages/tldraw/src/state/commands/deleteShapes/index.ts @@ -0,0 +1 @@ +export * from './deleteShapes' diff --git a/packages/tldraw/src/state/command/distribute/distribute.command.spec.ts b/packages/tldraw/src/state/commands/distributeShapes/distributeShapes.spec.ts similarity index 94% rename from packages/tldraw/src/state/command/distribute/distribute.command.spec.ts rename to packages/tldraw/src/state/commands/distributeShapes/distributeShapes.spec.ts index 884bd69a9..64747f8ca 100644 --- a/packages/tldraw/src/state/command/distribute/distribute.command.spec.ts +++ b/packages/tldraw/src/state/commands/distributeShapes/distributeShapes.spec.ts @@ -1,6 +1,6 @@ import Vec from '@tldraw/vec' import { TLDrawState } from '~state' -import { mockDocument, TLStateUtils } from '~test' +import { mockDocument, TLDrawStateUtils } from '~test' import { AlignType, DistributeType, TLDrawShapeType } from '~types' describe('Distribute command', () => { @@ -59,7 +59,7 @@ describe('when distributing groups', () => { tlstate.undo().delete(['rect4']).selectAll().distribute(DistributeType.Vertical) - new TLStateUtils(tlstate).expectShapesToBeAtPoints({ + new TLDrawStateUtils(tlstate).expectShapesToBeAtPoints({ rect1: p0, rect2: Vec.add(p0, [100, 100]), rect3: p1, diff --git a/packages/tldraw/src/state/command/distribute/distribute.command.ts b/packages/tldraw/src/state/commands/distributeShapes/distributeShapes.ts similarity index 97% rename from packages/tldraw/src/state/command/distribute/distribute.command.ts rename to packages/tldraw/src/state/commands/distributeShapes/distributeShapes.ts index 6ae1efc27..8b554384d 100644 --- a/packages/tldraw/src/state/command/distribute/distribute.command.ts +++ b/packages/tldraw/src/state/commands/distributeShapes/distributeShapes.ts @@ -1,10 +1,10 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ import { Utils } from '@tldraw/core' import { DistributeType, TLDrawShape, Data, TLDrawCommand, TLDrawShapeType } from '~types' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' import Vec from '@tldraw/vec' -export function distribute(data: Data, ids: string[], type: DistributeType): TLDrawCommand { +export function distributeShapes(data: Data, ids: string[], type: DistributeType): TLDrawCommand { const { currentPageId } = data.appState const initialShapes = ids.map((id) => TLDR.getShape(data, id, currentPageId)) diff --git a/packages/tldraw/src/state/commands/distributeShapes/index.ts b/packages/tldraw/src/state/commands/distributeShapes/index.ts new file mode 100644 index 000000000..688fb8540 --- /dev/null +++ b/packages/tldraw/src/state/commands/distributeShapes/index.ts @@ -0,0 +1 @@ +export * from './distributeShapes' diff --git a/packages/tldraw/src/state/command/duplicate-page/duplicate-page.command.spec.ts b/packages/tldraw/src/state/commands/duplicatePage/duplicatePage.spec.ts similarity index 100% rename from packages/tldraw/src/state/command/duplicate-page/duplicate-page.command.spec.ts rename to packages/tldraw/src/state/commands/duplicatePage/duplicatePage.spec.ts diff --git a/packages/tldraw/src/state/command/duplicate-page/duplicate-page.command.ts b/packages/tldraw/src/state/commands/duplicatePage/duplicatePage.ts similarity index 100% rename from packages/tldraw/src/state/command/duplicate-page/duplicate-page.command.ts rename to packages/tldraw/src/state/commands/duplicatePage/duplicatePage.ts diff --git a/packages/tldraw/src/state/commands/duplicatePage/index.ts b/packages/tldraw/src/state/commands/duplicatePage/index.ts new file mode 100644 index 000000000..61500406c --- /dev/null +++ b/packages/tldraw/src/state/commands/duplicatePage/index.ts @@ -0,0 +1 @@ +export * from './duplicatePage' diff --git a/packages/tldraw/src/state/command/duplicate/duplicate.command.spec.ts b/packages/tldraw/src/state/commands/duplicateShapes/duplicateShapes.spec.ts similarity index 99% rename from packages/tldraw/src/state/command/duplicate/duplicate.command.spec.ts rename to packages/tldraw/src/state/commands/duplicateShapes/duplicateShapes.spec.ts index 62e430330..2e89dd472 100644 --- a/packages/tldraw/src/state/command/duplicate/duplicate.command.spec.ts +++ b/packages/tldraw/src/state/commands/duplicateShapes/duplicateShapes.spec.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ import { Utils } from '@tldraw/core' import { TLDrawState } from '~state' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' import { mockDocument } from '~test' import { ArrowShape, SessionType, TLDrawShapeType } from '~types' diff --git a/packages/tldraw/src/state/command/duplicate/duplicate.command.ts b/packages/tldraw/src/state/commands/duplicateShapes/duplicateShapes.ts similarity index 97% rename from packages/tldraw/src/state/command/duplicate/duplicate.command.ts rename to packages/tldraw/src/state/commands/duplicateShapes/duplicateShapes.ts index 4faffb2c4..104734120 100644 --- a/packages/tldraw/src/state/command/duplicate/duplicate.command.ts +++ b/packages/tldraw/src/state/commands/duplicateShapes/duplicateShapes.ts @@ -1,10 +1,10 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ import { Utils } from '@tldraw/core' import { Vec } from '@tldraw/vec' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' import type { Data, PagePartial, TLDrawCommand, TLDrawShape } from '~types' -export function duplicate(data: Data, ids: string[], point?: number[]): TLDrawCommand { +export function duplicateShapes(data: Data, ids: string[], point?: number[]): TLDrawCommand { const { currentPageId } = data.appState const page = TLDR.getPage(data, currentPageId) diff --git a/packages/tldraw/src/state/commands/duplicateShapes/index.ts b/packages/tldraw/src/state/commands/duplicateShapes/index.ts new file mode 100644 index 000000000..8a2d00e7b --- /dev/null +++ b/packages/tldraw/src/state/commands/duplicateShapes/index.ts @@ -0,0 +1 @@ +export * from './duplicateShapes' diff --git a/packages/tldraw/src/state/command/flip/flip.command.spec.ts b/packages/tldraw/src/state/commands/flipShapes/flipShapes.spec.ts similarity index 100% rename from packages/tldraw/src/state/command/flip/flip.command.spec.ts rename to packages/tldraw/src/state/commands/flipShapes/flipShapes.spec.ts diff --git a/packages/tldraw/src/state/command/flip/flip.command.ts b/packages/tldraw/src/state/commands/flipShapes/flipShapes.ts similarity index 94% rename from packages/tldraw/src/state/command/flip/flip.command.ts rename to packages/tldraw/src/state/commands/flipShapes/flipShapes.ts index 51298f6b7..92c5375b6 100644 --- a/packages/tldraw/src/state/command/flip/flip.command.ts +++ b/packages/tldraw/src/state/commands/flipShapes/flipShapes.ts @@ -1,9 +1,9 @@ import { FlipType } from '~types' import { TLBoundsCorner, Utils } from '@tldraw/core' import type { Data, TLDrawCommand } from '~types' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' -export function flip(data: Data, ids: string[], type: FlipType): TLDrawCommand { +export function flipShapes(data: Data, ids: string[], type: FlipType): TLDrawCommand { const { currentPageId } = data.appState const initialShapes = ids.map((id) => TLDR.getShape(data, id, currentPageId)) diff --git a/packages/tldraw/src/state/commands/flipShapes/index.ts b/packages/tldraw/src/state/commands/flipShapes/index.ts new file mode 100644 index 000000000..aee103670 --- /dev/null +++ b/packages/tldraw/src/state/commands/flipShapes/index.ts @@ -0,0 +1 @@ +export * from './flipShapes' diff --git a/packages/tldraw/src/state/command/group/group.command.spec.ts b/packages/tldraw/src/state/commands/groupShapes/groupShapes.spec.ts similarity index 100% rename from packages/tldraw/src/state/command/group/group.command.spec.ts rename to packages/tldraw/src/state/commands/groupShapes/groupShapes.spec.ts diff --git a/packages/tldraw/src/state/command/group/group.command.ts b/packages/tldraw/src/state/commands/groupShapes/groupShapes.ts similarity index 99% rename from packages/tldraw/src/state/command/group/group.command.ts rename to packages/tldraw/src/state/commands/groupShapes/groupShapes.ts index cd05a808c..5bf04d411 100644 --- a/packages/tldraw/src/state/command/group/group.command.ts +++ b/packages/tldraw/src/state/commands/groupShapes/groupShapes.ts @@ -1,10 +1,10 @@ import { TLDrawBinding, TLDrawShape, TLDrawShapeType } from '~types' import { Utils } from '@tldraw/core' import type { Data, TLDrawCommand } from '~types' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' import type { Patch } from 'rko' -export function group( +export function groupShapes( data: Data, ids: string[], groupId: string, diff --git a/packages/tldraw/src/state/commands/groupShapes/index.ts b/packages/tldraw/src/state/commands/groupShapes/index.ts new file mode 100644 index 000000000..6cfe4d886 --- /dev/null +++ b/packages/tldraw/src/state/commands/groupShapes/index.ts @@ -0,0 +1 @@ +export * from './groupShapes' diff --git a/packages/tldraw/src/state/commands/index.ts b/packages/tldraw/src/state/commands/index.ts new file mode 100644 index 000000000..e01365a46 --- /dev/null +++ b/packages/tldraw/src/state/commands/index.ts @@ -0,0 +1,23 @@ +export * from './alignShapes' +export * from './changePage' +export * from './createPage' +export * from './createShapes' +export * from './deletePage' +export * from './deleteShapes' +export * from './distributeShapes' +export * from './duplicatePage' +export * from './duplicateShapes' +export * from './flipShapes' +export * from './groupShapes' +export * from './moveShapesToPage' +export * from './reorderShapes' +export * from './renamePage' +export * from './resetBounds' +export * from './rotateShapes' +export * from './stretchShapes' +export * from './styleShapes' +export * from './toggleShapesDecoration' +export * from './toggleShapesProp' +export * from './translateShapes' +export * from './ungroupShapes' +export * from './updateShapes' diff --git a/packages/tldraw/src/state/commands/moveShapesToPage/index.ts b/packages/tldraw/src/state/commands/moveShapesToPage/index.ts new file mode 100644 index 000000000..7abd1439c --- /dev/null +++ b/packages/tldraw/src/state/commands/moveShapesToPage/index.ts @@ -0,0 +1 @@ +export * from './moveShapesToPage' diff --git a/packages/tldraw/src/state/command/move-to-page/move-to-page.command.spec.ts b/packages/tldraw/src/state/commands/moveShapesToPage/moveShapesToPage.spec.ts similarity index 100% rename from packages/tldraw/src/state/command/move-to-page/move-to-page.command.spec.ts rename to packages/tldraw/src/state/commands/moveShapesToPage/moveShapesToPage.spec.ts diff --git a/packages/tldraw/src/state/command/move-to-page/move-to-page.command.ts b/packages/tldraw/src/state/commands/moveShapesToPage/moveShapesToPage.ts similarity index 98% rename from packages/tldraw/src/state/command/move-to-page/move-to-page.command.ts rename to packages/tldraw/src/state/commands/moveShapesToPage/moveShapesToPage.ts index 22254bbd9..fc2c8e87b 100644 --- a/packages/tldraw/src/state/command/move-to-page/move-to-page.command.ts +++ b/packages/tldraw/src/state/commands/moveShapesToPage/moveShapesToPage.ts @@ -1,10 +1,10 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ import type { ArrowShape, Data, PagePartial, TLDrawCommand, TLDrawShape } from '~types' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' import { Utils, TLBounds } from '@tldraw/core' import { Vec } from '@tldraw/vec' -export function moveToPage( +export function moveShapesToPage( data: Data, ids: string[], viewportBounds: TLBounds, diff --git a/packages/tldraw/src/state/commands/renamePage/index.ts b/packages/tldraw/src/state/commands/renamePage/index.ts new file mode 100644 index 000000000..10fdd15bf --- /dev/null +++ b/packages/tldraw/src/state/commands/renamePage/index.ts @@ -0,0 +1 @@ +export * from './renamePage' diff --git a/packages/tldraw/src/state/command/rename-page/rename-page.command.spec.ts b/packages/tldraw/src/state/commands/renamePage/renamePage.spec.ts similarity index 100% rename from packages/tldraw/src/state/command/rename-page/rename-page.command.spec.ts rename to packages/tldraw/src/state/commands/renamePage/renamePage.spec.ts diff --git a/packages/tldraw/src/state/command/rename-page/rename-page.command.ts b/packages/tldraw/src/state/commands/renamePage/renamePage.ts similarity index 100% rename from packages/tldraw/src/state/command/rename-page/rename-page.command.ts rename to packages/tldraw/src/state/commands/renamePage/renamePage.ts diff --git a/packages/tldraw/src/state/commands/reorderShapes/index.ts b/packages/tldraw/src/state/commands/reorderShapes/index.ts new file mode 100644 index 000000000..4a8fd452c --- /dev/null +++ b/packages/tldraw/src/state/commands/reorderShapes/index.ts @@ -0,0 +1 @@ +export * from './reorderShapes' diff --git a/packages/tldraw/src/state/command/move/move.command.spec.ts b/packages/tldraw/src/state/commands/reorderShapes/reorderShapes.spec.ts similarity index 99% rename from packages/tldraw/src/state/command/move/move.command.spec.ts rename to packages/tldraw/src/state/commands/reorderShapes/reorderShapes.spec.ts index de5f2bbe9..ac4f09d24 100644 --- a/packages/tldraw/src/state/command/move/move.command.spec.ts +++ b/packages/tldraw/src/state/commands/reorderShapes/reorderShapes.spec.ts @@ -1,6 +1,6 @@ import { TLDrawState } from '~state' import { Data, TLDrawShapeType } from '~types' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' const tlstate = new TLDrawState().createShapes( { diff --git a/packages/tldraw/src/state/command/move/move.command.ts b/packages/tldraw/src/state/commands/reorderShapes/reorderShapes.ts similarity index 98% rename from packages/tldraw/src/state/command/move/move.command.ts rename to packages/tldraw/src/state/commands/reorderShapes/reorderShapes.ts index a7359ebbe..ee6457428 100644 --- a/packages/tldraw/src/state/command/move/move.command.ts +++ b/packages/tldraw/src/state/commands/reorderShapes/reorderShapes.ts @@ -1,7 +1,7 @@ import { MoveType, Data, TLDrawShape, TLDrawCommand } from '~types' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' -export function move(data: Data, ids: string[], type: MoveType): TLDrawCommand { +export function reorderShapes(data: Data, ids: string[], type: MoveType): TLDrawCommand { const { currentPageId } = data.appState // Get the unique parent ids for the selected elements diff --git a/packages/tldraw/src/state/commands/resetBounds/index.ts b/packages/tldraw/src/state/commands/resetBounds/index.ts new file mode 100644 index 000000000..40250f116 --- /dev/null +++ b/packages/tldraw/src/state/commands/resetBounds/index.ts @@ -0,0 +1 @@ +export * from './resetBounds' diff --git a/packages/tldraw/src/state/command/reset-bounds/reset-bounds.command.spec.ts b/packages/tldraw/src/state/commands/resetBounds/resetBounds.spec.ts similarity index 98% rename from packages/tldraw/src/state/command/reset-bounds/reset-bounds.command.spec.ts rename to packages/tldraw/src/state/commands/resetBounds/resetBounds.spec.ts index 8889e802b..c49a2ff95 100644 --- a/packages/tldraw/src/state/command/reset-bounds/reset-bounds.command.spec.ts +++ b/packages/tldraw/src/state/commands/resetBounds/resetBounds.spec.ts @@ -1,6 +1,6 @@ import { TLBoundsCorner, Utils } from '@tldraw/core' import { TLDrawState } from '~state' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' import { mockDocument } from '~test' import { SessionType, TLDrawShapeType } from '~types' diff --git a/packages/tldraw/src/state/command/reset-bounds/reset-bounds.command.ts b/packages/tldraw/src/state/commands/resetBounds/resetBounds.ts similarity index 96% rename from packages/tldraw/src/state/command/reset-bounds/reset-bounds.command.ts rename to packages/tldraw/src/state/commands/resetBounds/resetBounds.ts index af6907527..b3fbd6cc2 100644 --- a/packages/tldraw/src/state/command/reset-bounds/reset-bounds.command.ts +++ b/packages/tldraw/src/state/commands/resetBounds/resetBounds.ts @@ -1,5 +1,5 @@ import type { Data, TLDrawCommand } from '~types' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' export function resetBounds(data: Data, ids: string[], pageId: string): TLDrawCommand { const { currentPageId } = data.appState diff --git a/packages/tldraw/src/state/commands/rotateShapes/index.ts b/packages/tldraw/src/state/commands/rotateShapes/index.ts new file mode 100644 index 000000000..79a7f624c --- /dev/null +++ b/packages/tldraw/src/state/commands/rotateShapes/index.ts @@ -0,0 +1 @@ +export * from './rotateShapes' diff --git a/packages/tldraw/src/state/command/rotate/rotate.command.spec.ts b/packages/tldraw/src/state/commands/rotateShapes/rotateShapes.spec.ts similarity index 100% rename from packages/tldraw/src/state/command/rotate/rotate.command.spec.ts rename to packages/tldraw/src/state/commands/rotateShapes/rotateShapes.spec.ts diff --git a/packages/tldraw/src/state/command/rotate/rotate.command.ts b/packages/tldraw/src/state/commands/rotateShapes/rotateShapes.ts similarity index 91% rename from packages/tldraw/src/state/command/rotate/rotate.command.ts rename to packages/tldraw/src/state/commands/rotateShapes/rotateShapes.ts index e1b28ccd5..d76b98216 100644 --- a/packages/tldraw/src/state/command/rotate/rotate.command.ts +++ b/packages/tldraw/src/state/commands/rotateShapes/rotateShapes.ts @@ -1,11 +1,10 @@ import { Utils } from '@tldraw/core' -import { Vec } from '@tldraw/vec' import type { TLDrawCommand, Data, TLDrawShape } from '~types' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' const PI2 = Math.PI * 2 -export function rotate(data: Data, ids: string[], delta = -PI2 / 4): TLDrawCommand | void { +export function rotateShapes(data: Data, ids: string[], delta = -PI2 / 4): TLDrawCommand | void { const { currentPageId } = data.appState // The shapes for the before patch diff --git a/packages/tldraw/src/state/command/utils/removeShapesFromPage.ts b/packages/tldraw/src/state/commands/shared/removeShapesFromPage.ts similarity index 98% rename from packages/tldraw/src/state/command/utils/removeShapesFromPage.ts rename to packages/tldraw/src/state/commands/shared/removeShapesFromPage.ts index 395c13102..90fe2263a 100644 --- a/packages/tldraw/src/state/command/utils/removeShapesFromPage.ts +++ b/packages/tldraw/src/state/commands/shared/removeShapesFromPage.ts @@ -1,4 +1,4 @@ -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' import type { ArrowShape, Data, GroupShape, PagePartial } from '~types' export function removeShapesFromPage(data: Data, ids: string[], pageId: string) { diff --git a/packages/tldraw/src/state/commands/stretchShapes/index.ts b/packages/tldraw/src/state/commands/stretchShapes/index.ts new file mode 100644 index 000000000..5742fa3da --- /dev/null +++ b/packages/tldraw/src/state/commands/stretchShapes/index.ts @@ -0,0 +1 @@ +export * from './stretchShapes' diff --git a/packages/tldraw/src/state/command/stretch/stretch.command.spec.ts b/packages/tldraw/src/state/commands/stretchShapes/stretchShapes.spec.ts similarity index 97% rename from packages/tldraw/src/state/command/stretch/stretch.command.spec.ts rename to packages/tldraw/src/state/commands/stretchShapes/stretchShapes.spec.ts index 4d969e71e..d07e2f5d5 100644 --- a/packages/tldraw/src/state/command/stretch/stretch.command.spec.ts +++ b/packages/tldraw/src/state/commands/stretchShapes/stretchShapes.spec.ts @@ -1,6 +1,6 @@ import { StretchType, RectangleShape, TLDrawShapeType } from '~types' import { TLDrawState } from '~state' -import { mockDocument, TLStateUtils } from '~test' +import { mockDocument, TLDrawStateUtils } from '~test' import Vec from '@tldraw/vec' describe('Stretch command', () => { @@ -95,7 +95,7 @@ describe('when stretching groups', () => { .selectAll() .stretch(StretchType.Vertical) - new TLStateUtils(tlstate).expectShapesToHaveProps({ + new TLDrawStateUtils(tlstate).expectShapesToHaveProps({ rect1: { point: [0, 0], size: [100, 300] }, rect2: { point: [100, 0], size: [100, 300] }, rect3: { point: [200, 0], size: [100, 300] }, diff --git a/packages/tldraw/src/state/command/stretch/stretch.command.ts b/packages/tldraw/src/state/commands/stretchShapes/stretchShapes.ts similarity index 95% rename from packages/tldraw/src/state/command/stretch/stretch.command.ts rename to packages/tldraw/src/state/commands/stretchShapes/stretchShapes.ts index 152c48300..a5713034b 100644 --- a/packages/tldraw/src/state/command/stretch/stretch.command.ts +++ b/packages/tldraw/src/state/commands/stretchShapes/stretchShapes.ts @@ -2,9 +2,9 @@ import { TLBoundsCorner, Utils } from '@tldraw/core' import { StretchType, TLDrawShapeType } from '~types' import type { Data, TLDrawCommand } from '~types' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' -export function stretch(data: Data, ids: string[], type: StretchType): TLDrawCommand { +export function stretchShapes(data: Data, ids: string[], type: StretchType): TLDrawCommand { const { currentPageId } = data.appState const initialShapes = ids.map((id) => TLDR.getShape(data, id, currentPageId)) diff --git a/packages/tldraw/src/state/commands/styleShapes/index.ts b/packages/tldraw/src/state/commands/styleShapes/index.ts new file mode 100644 index 000000000..354cfdeec --- /dev/null +++ b/packages/tldraw/src/state/commands/styleShapes/index.ts @@ -0,0 +1 @@ +export * from './styleShapes' diff --git a/packages/tldraw/src/state/command/style/style.command.spec.ts b/packages/tldraw/src/state/commands/styleShapes/styleShapes.spec.ts similarity index 98% rename from packages/tldraw/src/state/command/style/style.command.spec.ts rename to packages/tldraw/src/state/commands/styleShapes/styleShapes.spec.ts index 70aee082f..245d4d206 100644 --- a/packages/tldraw/src/state/command/style/style.command.spec.ts +++ b/packages/tldraw/src/state/commands/styleShapes/styleShapes.spec.ts @@ -1,5 +1,5 @@ import { TLDrawState } from '~state' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' import { mockDocument } from '~test' import { SizeStyle, TLDrawShapeType } from '~types' diff --git a/packages/tldraw/src/state/command/style/style.command.ts b/packages/tldraw/src/state/commands/styleShapes/styleShapes.ts similarity index 93% rename from packages/tldraw/src/state/command/style/style.command.ts rename to packages/tldraw/src/state/commands/styleShapes/styleShapes.ts index 3cff252fb..7d689d9bd 100644 --- a/packages/tldraw/src/state/command/style/style.command.ts +++ b/packages/tldraw/src/state/commands/styleShapes/styleShapes.ts @@ -1,9 +1,13 @@ import { ShapeStyles, TLDrawCommand, Data, TLDrawShape, TLDrawShapeType, TextShape } from '~types' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' import type { Patch } from 'rko' import Vec from '@tldraw/vec' -export function style(data: Data, ids: string[], changes: Partial): TLDrawCommand { +export function styleShapes( + data: Data, + ids: string[], + changes: Partial +): TLDrawCommand { const { currentPageId } = data.appState const shapeIdsToMutate = ids.flatMap((id) => TLDR.getDocumentBranch(data, id, currentPageId)) diff --git a/packages/tldraw/src/state/commands/toggleShapesDecoration/index.ts b/packages/tldraw/src/state/commands/toggleShapesDecoration/index.ts new file mode 100644 index 000000000..f9d6627ba --- /dev/null +++ b/packages/tldraw/src/state/commands/toggleShapesDecoration/index.ts @@ -0,0 +1 @@ +export * from './toggleShapesDecoration' diff --git a/packages/tldraw/src/state/command/toggle-decoration/toggle-decoration.command.spec.ts b/packages/tldraw/src/state/commands/toggleShapesDecoration/toggleShapesDecoration.spec.ts similarity index 97% rename from packages/tldraw/src/state/command/toggle-decoration/toggle-decoration.command.spec.ts rename to packages/tldraw/src/state/commands/toggleShapesDecoration/toggleShapesDecoration.spec.ts index 3991b09cc..2ea7e50c1 100644 --- a/packages/tldraw/src/state/command/toggle-decoration/toggle-decoration.command.spec.ts +++ b/packages/tldraw/src/state/commands/toggleShapesDecoration/toggleShapesDecoration.spec.ts @@ -1,4 +1,4 @@ -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' import { TLDrawState } from '~state' import { mockDocument } from '~test' import { ArrowShape, Decoration, TLDrawShape, TLDrawShapeType } from '~types' diff --git a/packages/tldraw/src/state/command/toggle-decoration/toggle-decoration.command.ts b/packages/tldraw/src/state/commands/toggleShapesDecoration/toggleShapesDecoration.ts similarity index 95% rename from packages/tldraw/src/state/command/toggle-decoration/toggle-decoration.command.ts rename to packages/tldraw/src/state/commands/toggleShapesDecoration/toggleShapesDecoration.ts index 336d4c851..3fe4cc897 100644 --- a/packages/tldraw/src/state/command/toggle-decoration/toggle-decoration.command.ts +++ b/packages/tldraw/src/state/commands/toggleShapesDecoration/toggleShapesDecoration.ts @@ -1,9 +1,9 @@ import { Decoration } from '~types' import type { ArrowShape, TLDrawCommand, Data } from '~types' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' import type { Patch } from 'rko' -export function toggleDecoration( +export function toggleShapesDecoration( data: Data, ids: string[], decorationId: 'start' | 'end' diff --git a/packages/tldraw/src/state/commands/toggleShapesProp/index.ts b/packages/tldraw/src/state/commands/toggleShapesProp/index.ts new file mode 100644 index 000000000..cdef4509b --- /dev/null +++ b/packages/tldraw/src/state/commands/toggleShapesProp/index.ts @@ -0,0 +1 @@ +export * from './toggleShapesProp' diff --git a/packages/tldraw/src/state/command/toggle/toggle.command.spec.ts b/packages/tldraw/src/state/commands/toggleShapesProp/toggleShapesProp.spec.ts similarity index 100% rename from packages/tldraw/src/state/command/toggle/toggle.command.spec.ts rename to packages/tldraw/src/state/commands/toggleShapesProp/toggleShapesProp.spec.ts diff --git a/packages/tldraw/src/state/command/toggle/toggle.command.ts b/packages/tldraw/src/state/commands/toggleShapesProp/toggleShapesProp.ts similarity index 87% rename from packages/tldraw/src/state/command/toggle/toggle.command.ts rename to packages/tldraw/src/state/commands/toggleShapesProp/toggleShapesProp.ts index 75c226995..1d72f5b62 100644 --- a/packages/tldraw/src/state/command/toggle/toggle.command.ts +++ b/packages/tldraw/src/state/commands/toggleShapesProp/toggleShapesProp.ts @@ -1,7 +1,7 @@ import type { TLDrawShape, Data, TLDrawCommand } from '~types' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' -export function toggle(data: Data, ids: string[], prop: keyof TLDrawShape): TLDrawCommand { +export function toggleShapeProp(data: Data, ids: string[], prop: keyof TLDrawShape): TLDrawCommand { const { currentPageId } = data.appState const initialShapes = ids.map((id) => TLDR.getShape(data, id, currentPageId)) diff --git a/packages/tldraw/src/state/commands/translateShapes/index.ts b/packages/tldraw/src/state/commands/translateShapes/index.ts new file mode 100644 index 000000000..b58c58c12 --- /dev/null +++ b/packages/tldraw/src/state/commands/translateShapes/index.ts @@ -0,0 +1 @@ +export * from './translateShapes' diff --git a/packages/tldraw/src/state/command/translate/translate.command.spec.ts b/packages/tldraw/src/state/commands/translateShapes/translateShapes.spec.ts similarity index 97% rename from packages/tldraw/src/state/command/translate/translate.command.spec.ts rename to packages/tldraw/src/state/commands/translateShapes/translateShapes.spec.ts index 246998e04..a5e7ccbd6 100644 --- a/packages/tldraw/src/state/command/translate/translate.command.spec.ts +++ b/packages/tldraw/src/state/commands/translateShapes/translateShapes.spec.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ import { TLDrawState } from '~state' -import { mockDocument, TLStateUtils } from '~test' +import { mockDocument, TLDrawStateUtils } from '~test' import { ArrowShape, SessionType, TLDrawShapeType } from '~types' describe('Translate command', () => { @@ -129,7 +129,7 @@ describe('When nudging groups', () => { .group(['rect1', 'rect2'], 'groupA') .nudge([1, 1]) - new TLStateUtils(tlstate).expectShapesToBeAtPoints({ + new TLDrawStateUtils(tlstate).expectShapesToBeAtPoints({ rect1: [1, 1], rect2: [101, 101], }) diff --git a/packages/tldraw/src/state/command/translate/translate.command.ts b/packages/tldraw/src/state/commands/translateShapes/translateShapes.ts similarity index 95% rename from packages/tldraw/src/state/command/translate/translate.command.ts rename to packages/tldraw/src/state/commands/translateShapes/translateShapes.ts index 9619c42e5..3f1afffd7 100644 --- a/packages/tldraw/src/state/command/translate/translate.command.ts +++ b/packages/tldraw/src/state/commands/translateShapes/translateShapes.ts @@ -1,8 +1,8 @@ import { Vec } from '@tldraw/vec' import { Data, TLDrawCommand, PagePartial, Session } from '~types' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' -export function translate(data: Data, ids: string[], delta: number[]): TLDrawCommand { +export function translateShapes(data: Data, ids: string[], delta: number[]): TLDrawCommand { const { currentPageId } = data.appState // Clear session cache diff --git a/packages/tldraw/src/state/commands/ungroupShapes/index.ts b/packages/tldraw/src/state/commands/ungroupShapes/index.ts new file mode 100644 index 000000000..0e2b1c91f --- /dev/null +++ b/packages/tldraw/src/state/commands/ungroupShapes/index.ts @@ -0,0 +1 @@ +export * from './ungroupShapes' diff --git a/packages/tldraw/src/state/command/ungroup/ungroup.command.spec.ts b/packages/tldraw/src/state/commands/ungroupShapes/ungroupShapes.spec.ts similarity index 100% rename from packages/tldraw/src/state/command/ungroup/ungroup.command.spec.ts rename to packages/tldraw/src/state/commands/ungroupShapes/ungroupShapes.spec.ts diff --git a/packages/tldraw/src/state/command/ungroup/ungroup.command.ts b/packages/tldraw/src/state/commands/ungroupShapes/ungroupShapes.ts similarity index 98% rename from packages/tldraw/src/state/command/ungroup/ungroup.command.ts rename to packages/tldraw/src/state/commands/ungroupShapes/ungroupShapes.ts index 249898cfc..f8cef5202 100644 --- a/packages/tldraw/src/state/command/ungroup/ungroup.command.ts +++ b/packages/tldraw/src/state/commands/ungroupShapes/ungroupShapes.ts @@ -1,9 +1,9 @@ import type { GroupShape, TLDrawBinding, TLDrawShape } from '~types' import type { Data, TLDrawCommand } from '~types' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' import type { Patch } from 'rko' -export function ungroup( +export function ungroupShapes( data: Data, selectedIds: string[], groupShapes: GroupShape[], diff --git a/packages/tldraw/src/state/commands/updateShapes/index.ts b/packages/tldraw/src/state/commands/updateShapes/index.ts new file mode 100644 index 000000000..4fcd17fdc --- /dev/null +++ b/packages/tldraw/src/state/commands/updateShapes/index.ts @@ -0,0 +1 @@ +export * from './updateShapes' diff --git a/packages/tldraw/src/state/command/update/update.command.spec.ts b/packages/tldraw/src/state/commands/updateShapes/updateShapes.spec.ts similarity index 100% rename from packages/tldraw/src/state/command/update/update.command.spec.ts rename to packages/tldraw/src/state/commands/updateShapes/updateShapes.spec.ts diff --git a/packages/tldraw/src/state/command/update/update.command.ts b/packages/tldraw/src/state/commands/updateShapes/updateShapes.ts similarity index 95% rename from packages/tldraw/src/state/command/update/update.command.ts rename to packages/tldraw/src/state/commands/updateShapes/updateShapes.ts index d285d0636..c51ff82f6 100644 --- a/packages/tldraw/src/state/command/update/update.command.ts +++ b/packages/tldraw/src/state/commands/updateShapes/updateShapes.ts @@ -1,5 +1,5 @@ import type { Data, TLDrawCommand, PagePartial, TLDrawShape } from '~types' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' export function update( data: Data, diff --git a/packages/tldraw/src/state/data/index.ts b/packages/tldraw/src/state/data/index.ts new file mode 100644 index 000000000..0c0eaa264 --- /dev/null +++ b/packages/tldraw/src/state/data/index.ts @@ -0,0 +1,3 @@ +export * from './migrate' +export * from './filesystem' +export * from './browser-fs-access' diff --git a/packages/tldraw/src/state/data/migrate.spec.ts b/packages/tldraw/src/state/data/migrate.spec.ts index 66cd22751..7c693fba0 100644 --- a/packages/tldraw/src/state/data/migrate.spec.ts +++ b/packages/tldraw/src/state/data/migrate.spec.ts @@ -1,7 +1,7 @@ import type { TLDrawDocument } from '~types' import { TLDrawState } from '~state' -import oldDoc from '../../test/old-doc' -import oldDoc2 from '../../test/old-doc-2' +import oldDoc from '~test/documents/old-doc' +import oldDoc2 from '~test/documents/old-doc-2' describe('When migrating bindings', () => { it('migrates a document without a version', () => { diff --git a/packages/tldraw/src/state/index.ts b/packages/tldraw/src/state/index.ts index 45d3420c7..d6f77550e 100644 --- a/packages/tldraw/src/state/index.ts +++ b/packages/tldraw/src/state/index.ts @@ -1 +1 @@ -export * from './tlstate' +export * from './TLDrawState' diff --git a/packages/tldraw/src/state/session/sessions/arrow/index.ts b/packages/tldraw/src/state/session/sessions/arrow/index.ts deleted file mode 100644 index 31fb65b5b..000000000 --- a/packages/tldraw/src/state/session/sessions/arrow/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './arrow.session' diff --git a/packages/tldraw/src/state/session/sessions/brush/index.ts b/packages/tldraw/src/state/session/sessions/brush/index.ts deleted file mode 100644 index d8e5b1834..000000000 --- a/packages/tldraw/src/state/session/sessions/brush/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './brush.session' diff --git a/packages/tldraw/src/state/session/sessions/draw/index.ts b/packages/tldraw/src/state/session/sessions/draw/index.ts deleted file mode 100644 index aff2816cf..000000000 --- a/packages/tldraw/src/state/session/sessions/draw/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './draw.session' diff --git a/packages/tldraw/src/state/session/sessions/grid/index.ts b/packages/tldraw/src/state/session/sessions/grid/index.ts deleted file mode 100644 index 4a1fb0caa..000000000 --- a/packages/tldraw/src/state/session/sessions/grid/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './grid.session' diff --git a/packages/tldraw/src/state/session/sessions/handle/index.ts b/packages/tldraw/src/state/session/sessions/handle/index.ts deleted file mode 100644 index 973107549..000000000 --- a/packages/tldraw/src/state/session/sessions/handle/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './handle.session' diff --git a/packages/tldraw/src/state/session/sessions/index.ts b/packages/tldraw/src/state/session/sessions/index.ts deleted file mode 100644 index 55b3c0c7a..000000000 --- a/packages/tldraw/src/state/session/sessions/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export * from './brush' -export * from './translate' -export * from './transform-single' -export * from './transform' -export * from './draw' -export * from './rotate' -export * from './handle' -export * from './arrow' -export * from './grid' diff --git a/packages/tldraw/src/state/session/sessions/rotate/index.ts b/packages/tldraw/src/state/session/sessions/rotate/index.ts deleted file mode 100644 index acf631207..000000000 --- a/packages/tldraw/src/state/session/sessions/rotate/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './rotate.session' diff --git a/packages/tldraw/src/state/session/sessions/transform-single/index.ts b/packages/tldraw/src/state/session/sessions/transform-single/index.ts deleted file mode 100644 index b1868b800..000000000 --- a/packages/tldraw/src/state/session/sessions/transform-single/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './transform-single.session' diff --git a/packages/tldraw/src/state/session/sessions/transform/index.ts b/packages/tldraw/src/state/session/sessions/transform/index.ts deleted file mode 100644 index 0bed2fe8e..000000000 --- a/packages/tldraw/src/state/session/sessions/transform/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './transform.session' diff --git a/packages/tldraw/src/state/session/sessions/translate/index.ts b/packages/tldraw/src/state/session/sessions/translate/index.ts deleted file mode 100644 index 65826ded9..000000000 --- a/packages/tldraw/src/state/session/sessions/translate/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './translate.session' diff --git a/packages/tldraw/src/state/session/sessions/arrow/arrow.session.spec.ts b/packages/tldraw/src/state/sessions/ArrowSession/ArrowSession.spec.ts similarity index 100% rename from packages/tldraw/src/state/session/sessions/arrow/arrow.session.spec.ts rename to packages/tldraw/src/state/sessions/ArrowSession/ArrowSession.spec.ts diff --git a/packages/tldraw/src/state/session/sessions/arrow/arrow.session.ts b/packages/tldraw/src/state/sessions/ArrowSession/ArrowSession.ts similarity index 99% rename from packages/tldraw/src/state/session/sessions/arrow/arrow.session.ts rename to packages/tldraw/src/state/sessions/ArrowSession/ArrowSession.ts index efe981edc..9dd1ed927 100644 --- a/packages/tldraw/src/state/session/sessions/arrow/arrow.session.ts +++ b/packages/tldraw/src/state/sessions/ArrowSession/ArrowSession.ts @@ -11,9 +11,9 @@ import { } from '~types' import { Vec } from '@tldraw/vec' import { Utils, TLBounds } from '@tldraw/core' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' import { BINDING_DISTANCE } from '~constants' -import { shapeUtils } from '~shape-utils' +import { shapeUtils } from '~state/shapes' export class ArrowSession extends Session { static type = SessionType.Arrow diff --git a/packages/tldraw/src/state/sessions/ArrowSession/index.ts b/packages/tldraw/src/state/sessions/ArrowSession/index.ts new file mode 100644 index 000000000..7f837ba5d --- /dev/null +++ b/packages/tldraw/src/state/sessions/ArrowSession/index.ts @@ -0,0 +1 @@ +export * from './ArrowSession' diff --git a/packages/tldraw/src/state/session/sessions/brush/brush.session.spec.ts b/packages/tldraw/src/state/sessions/BrushSession/BrushSession.spec.ts similarity index 100% rename from packages/tldraw/src/state/session/sessions/brush/brush.session.spec.ts rename to packages/tldraw/src/state/sessions/BrushSession/BrushSession.spec.ts diff --git a/packages/tldraw/src/state/session/sessions/brush/brush.session.ts b/packages/tldraw/src/state/sessions/BrushSession/BrushSession.ts similarity index 99% rename from packages/tldraw/src/state/session/sessions/brush/brush.session.ts rename to packages/tldraw/src/state/sessions/BrushSession/BrushSession.ts index 0dd98d5ed..376f88044 100644 --- a/packages/tldraw/src/state/session/sessions/brush/brush.session.ts +++ b/packages/tldraw/src/state/sessions/BrushSession/BrushSession.ts @@ -1,7 +1,7 @@ import { Utils, TLBounds } from '@tldraw/core' import { Vec } from '@tldraw/vec' import { Data, Session, SessionType, TLDrawPatch, TLDrawStatus } from '~types' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' export class BrushSession extends Session { static type = SessionType.Brush diff --git a/packages/tldraw/src/state/sessions/BrushSession/index.ts b/packages/tldraw/src/state/sessions/BrushSession/index.ts new file mode 100644 index 000000000..3db09b8d1 --- /dev/null +++ b/packages/tldraw/src/state/sessions/BrushSession/index.ts @@ -0,0 +1 @@ +export * from './BrushSession' diff --git a/packages/tldraw/src/state/session/sessions/draw/draw.session.spec.ts b/packages/tldraw/src/state/sessions/DrawSession/DrawSession.spec.ts similarity index 100% rename from packages/tldraw/src/state/session/sessions/draw/draw.session.spec.ts rename to packages/tldraw/src/state/sessions/DrawSession/DrawSession.spec.ts diff --git a/packages/tldraw/src/state/session/sessions/draw/draw.session.ts b/packages/tldraw/src/state/sessions/DrawSession/DrawSession.ts similarity index 99% rename from packages/tldraw/src/state/session/sessions/draw/draw.session.ts rename to packages/tldraw/src/state/sessions/DrawSession/DrawSession.ts index 973811037..084087ccf 100644 --- a/packages/tldraw/src/state/session/sessions/draw/draw.session.ts +++ b/packages/tldraw/src/state/sessions/DrawSession/DrawSession.ts @@ -1,7 +1,7 @@ import { Utils, TLBounds } from '@tldraw/core' import { Vec } from '@tldraw/vec' import { Data, Session, SessionType, TLDrawStatus } from '~types' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' export class DrawSession extends Session { static type = SessionType.Draw diff --git a/packages/tldraw/src/state/sessions/DrawSession/index.ts b/packages/tldraw/src/state/sessions/DrawSession/index.ts new file mode 100644 index 000000000..b7c207594 --- /dev/null +++ b/packages/tldraw/src/state/sessions/DrawSession/index.ts @@ -0,0 +1 @@ +export * from './DrawSession' diff --git a/packages/tldraw/src/state/session/sessions/grid/grid.session.spec.ts b/packages/tldraw/src/state/sessions/GridSession/GridSession.spec.ts similarity index 92% rename from packages/tldraw/src/state/session/sessions/grid/grid.session.spec.ts rename to packages/tldraw/src/state/sessions/GridSession/GridSession.spec.ts index 0c6212227..75fe02b71 100644 --- a/packages/tldraw/src/state/session/sessions/grid/grid.session.spec.ts +++ b/packages/tldraw/src/state/sessions/GridSession/GridSession.spec.ts @@ -1,6 +1,6 @@ import { TLDrawState } from '~state' import { mockDocument } from '~test' -import { GroupShape, SessionType, TLDrawShapeType, TLDrawStatus } from '~types' +import { SessionType, TLDrawStatus } from '~types' describe('Grid session', () => { const tlstate = new TLDrawState() diff --git a/packages/tldraw/src/state/session/sessions/grid/grid.session.ts b/packages/tldraw/src/state/sessions/GridSession/GridSession.ts similarity index 99% rename from packages/tldraw/src/state/session/sessions/grid/grid.session.ts rename to packages/tldraw/src/state/sessions/GridSession/GridSession.ts index bf6918081..d060505d3 100644 --- a/packages/tldraw/src/state/session/sessions/grid/grid.session.ts +++ b/packages/tldraw/src/state/sessions/GridSession/GridSession.ts @@ -13,7 +13,7 @@ import { SessionType, TLDrawShapeType, } from '~types' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' import type { Patch } from 'rko' export class GridSession extends Session { diff --git a/packages/tldraw/src/state/sessions/GridSession/index.ts b/packages/tldraw/src/state/sessions/GridSession/index.ts new file mode 100644 index 000000000..b6c8a53e9 --- /dev/null +++ b/packages/tldraw/src/state/sessions/GridSession/index.ts @@ -0,0 +1 @@ +export * from './GridSession' diff --git a/packages/tldraw/src/state/session/sessions/handle/handle.session.spec.ts b/packages/tldraw/src/state/sessions/HandleSession/HandleSession.spec.ts similarity index 100% rename from packages/tldraw/src/state/session/sessions/handle/handle.session.spec.ts rename to packages/tldraw/src/state/sessions/HandleSession/HandleSession.spec.ts diff --git a/packages/tldraw/src/state/session/sessions/handle/handle.session.ts b/packages/tldraw/src/state/sessions/HandleSession/HandleSession.ts similarity index 98% rename from packages/tldraw/src/state/session/sessions/handle/handle.session.ts rename to packages/tldraw/src/state/sessions/HandleSession/HandleSession.ts index 66ed14d6a..da0da02ee 100644 --- a/packages/tldraw/src/state/session/sessions/handle/handle.session.ts +++ b/packages/tldraw/src/state/sessions/HandleSession/HandleSession.ts @@ -3,7 +3,7 @@ import type { TLBounds } from '@tldraw/core' import { SessionType, ShapesWithProp, TLDrawStatus } from '~types' import { Session } from '~types' import type { Data } from '~types' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' export class HandleSession extends Session { static type = SessionType.Handle diff --git a/packages/tldraw/src/state/sessions/HandleSession/index.ts b/packages/tldraw/src/state/sessions/HandleSession/index.ts new file mode 100644 index 000000000..92d28969b --- /dev/null +++ b/packages/tldraw/src/state/sessions/HandleSession/index.ts @@ -0,0 +1 @@ +export * from './HandleSession' diff --git a/packages/tldraw/src/state/session/sessions/rotate/rotate.session.spec.ts b/packages/tldraw/src/state/sessions/RotateSession/RotateSession.spec.ts similarity index 100% rename from packages/tldraw/src/state/session/sessions/rotate/rotate.session.spec.ts rename to packages/tldraw/src/state/sessions/RotateSession/RotateSession.spec.ts diff --git a/packages/tldraw/src/state/session/sessions/rotate/rotate.session.ts b/packages/tldraw/src/state/sessions/RotateSession/RotateSession.ts similarity index 99% rename from packages/tldraw/src/state/session/sessions/rotate/rotate.session.ts rename to packages/tldraw/src/state/sessions/RotateSession/RotateSession.ts index 0388a1e34..7eaca6839 100644 --- a/packages/tldraw/src/state/session/sessions/rotate/rotate.session.ts +++ b/packages/tldraw/src/state/sessions/RotateSession/RotateSession.ts @@ -2,7 +2,7 @@ import { Utils, TLBounds } from '@tldraw/core' import { Vec } from '@tldraw/vec' import { Session, SessionType, TLDrawShape, TLDrawStatus } from '~types' import type { Data } from '~types' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' export class RotateSession extends Session { static type = SessionType.Rotate diff --git a/packages/tldraw/src/state/sessions/RotateSession/index.ts b/packages/tldraw/src/state/sessions/RotateSession/index.ts new file mode 100644 index 000000000..c84953919 --- /dev/null +++ b/packages/tldraw/src/state/sessions/RotateSession/index.ts @@ -0,0 +1 @@ +export * from './RotateSession' diff --git a/packages/tldraw/src/state/session/sessions/transform/transform.session.spec.ts b/packages/tldraw/src/state/sessions/TransformSession/TransformSession.spec.ts similarity index 99% rename from packages/tldraw/src/state/session/sessions/transform/transform.session.spec.ts rename to packages/tldraw/src/state/sessions/TransformSession/TransformSession.spec.ts index 0d3f01f76..c0c960d60 100644 --- a/packages/tldraw/src/state/session/sessions/transform/transform.session.spec.ts +++ b/packages/tldraw/src/state/sessions/TransformSession/TransformSession.spec.ts @@ -1,7 +1,7 @@ import { TLDrawState } from '~state' import { mockDocument } from '~test' import { TLBoundsCorner, Utils } from '@tldraw/core' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' import { SessionType, TLDrawStatus } from '~types' function getShapeBounds(tlstate: TLDrawState, ...ids: string[]) { diff --git a/packages/tldraw/src/state/session/sessions/transform/transform.session.ts b/packages/tldraw/src/state/sessions/TransformSession/TransformSession.ts similarity index 99% rename from packages/tldraw/src/state/session/sessions/transform/transform.session.ts rename to packages/tldraw/src/state/sessions/TransformSession/TransformSession.ts index ec7d55d2f..98a0ee88a 100644 --- a/packages/tldraw/src/state/session/sessions/transform/transform.session.ts +++ b/packages/tldraw/src/state/sessions/TransformSession/TransformSession.ts @@ -3,7 +3,7 @@ import { Vec } from '@tldraw/vec' import type { TLSnapLine, TLBoundsWithCenter } from '@tldraw/core' import { Session, SessionType, TLDrawShape, TLDrawStatus } from '~types' import type { Data } from '~types' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' import type { Command } from 'rko' import { SLOW_SPEED, SNAP_DISTANCE } from '~constants' diff --git a/packages/tldraw/src/state/sessions/TransformSession/index.ts b/packages/tldraw/src/state/sessions/TransformSession/index.ts new file mode 100644 index 000000000..52134d1b2 --- /dev/null +++ b/packages/tldraw/src/state/sessions/TransformSession/index.ts @@ -0,0 +1 @@ +export * from './TransformSession' diff --git a/packages/tldraw/src/state/session/sessions/transform-single/transform-single.session.spec.ts b/packages/tldraw/src/state/sessions/TransformSingleSession/TransformSingleSession.session.spec.ts similarity index 100% rename from packages/tldraw/src/state/session/sessions/transform-single/transform-single.session.spec.ts rename to packages/tldraw/src/state/sessions/TransformSingleSession/TransformSingleSession.session.spec.ts diff --git a/packages/tldraw/src/state/session/sessions/transform-single/transform-single.session.ts b/packages/tldraw/src/state/sessions/TransformSingleSession/TransformSingleSession.session.ts similarity index 99% rename from packages/tldraw/src/state/session/sessions/transform-single/transform-single.session.ts rename to packages/tldraw/src/state/sessions/TransformSingleSession/TransformSingleSession.session.ts index ed9103a8a..34983a6dc 100644 --- a/packages/tldraw/src/state/session/sessions/transform-single/transform-single.session.ts +++ b/packages/tldraw/src/state/sessions/TransformSingleSession/TransformSingleSession.session.ts @@ -10,7 +10,7 @@ import { Vec } from '@tldraw/vec' import { SessionType, TLDrawShape, TLDrawStatus } from '~types' import { Session } from '~types' import type { Data } from '~types' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' import { SLOW_SPEED, SNAP_DISTANCE } from '~constants' type SnapInfo = diff --git a/packages/tldraw/src/state/sessions/TransformSingleSession/index.ts b/packages/tldraw/src/state/sessions/TransformSingleSession/index.ts new file mode 100644 index 000000000..d5bf394d3 --- /dev/null +++ b/packages/tldraw/src/state/sessions/TransformSingleSession/index.ts @@ -0,0 +1 @@ +export * from './TransformSingleSession.session' diff --git a/packages/tldraw/src/state/session/sessions/translate/translate.session.spec.ts b/packages/tldraw/src/state/sessions/TranslateSession/TranslateSession.spec.ts similarity index 100% rename from packages/tldraw/src/state/session/sessions/translate/translate.session.spec.ts rename to packages/tldraw/src/state/sessions/TranslateSession/TranslateSession.spec.ts diff --git a/packages/tldraw/src/state/session/sessions/translate/translate.session.ts b/packages/tldraw/src/state/sessions/TranslateSession/TranslateSession.ts similarity index 99% rename from packages/tldraw/src/state/session/sessions/translate/translate.session.ts rename to packages/tldraw/src/state/sessions/TranslateSession/TranslateSession.ts index a7aff288d..ed935096e 100644 --- a/packages/tldraw/src/state/session/sessions/translate/translate.session.ts +++ b/packages/tldraw/src/state/sessions/TranslateSession/TranslateSession.ts @@ -14,7 +14,7 @@ import { ArrowBinding, } from '~types' import { SLOW_SPEED, SNAP_DISTANCE } from '~constants' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' import type { Patch } from 'rko' type CloneInfo = diff --git a/packages/tldraw/src/state/sessions/TranslateSession/index.ts b/packages/tldraw/src/state/sessions/TranslateSession/index.ts new file mode 100644 index 000000000..58782777c --- /dev/null +++ b/packages/tldraw/src/state/sessions/TranslateSession/index.ts @@ -0,0 +1 @@ +export * from './TranslateSession' diff --git a/packages/tldraw/src/state/session/about-sessions.md b/packages/tldraw/src/state/sessions/about-sessions.md similarity index 100% rename from packages/tldraw/src/state/session/about-sessions.md rename to packages/tldraw/src/state/sessions/about-sessions.md diff --git a/packages/tldraw/src/state/session/index.ts b/packages/tldraw/src/state/sessions/index.ts similarity index 72% rename from packages/tldraw/src/state/session/index.ts rename to packages/tldraw/src/state/sessions/index.ts index 86b857db1..c91e84194 100644 --- a/packages/tldraw/src/state/session/index.ts +++ b/packages/tldraw/src/state/sessions/index.ts @@ -1,17 +1,13 @@ -export * from './sessions' import { SessionType } from '~types' - -import { - ArrowSession, - BrushSession, - DrawSession, - HandleSession, - RotateSession, - TransformSession, - TransformSingleSession, - TranslateSession, - GridSession, -} from './sessions' +import { ArrowSession } from './ArrowSession' +import { BrushSession } from './BrushSession' +import { DrawSession } from './DrawSession' +import { HandleSession } from './HandleSession' +import { RotateSession } from './RotateSession' +import { TransformSession } from './TransformSession' +import { TransformSingleSession } from './TransformSingleSession' +import { TranslateSession } from './TranslateSession' +import { GridSession } from './GridSession' export interface SessionsMap { [SessionType.Arrow]: typeof ArrowSession diff --git a/packages/tldraw/src/shape-utils/arrow/arrow.spec.tsx b/packages/tldraw/src/state/shapes/ArrowUtil/ArrowUtil.spec.tsx similarity index 83% rename from packages/tldraw/src/shape-utils/arrow/arrow.spec.tsx rename to packages/tldraw/src/state/shapes/ArrowUtil/ArrowUtil.spec.tsx index 4065a5870..cfd36fb41 100644 --- a/packages/tldraw/src/shape-utils/arrow/arrow.spec.tsx +++ b/packages/tldraw/src/state/shapes/ArrowUtil/ArrowUtil.spec.tsx @@ -1,4 +1,4 @@ -import { Arrow } from '../' +import { Arrow } from '..' describe('Arrow shape', () => { it('Creates a shape', () => { diff --git a/packages/tldraw/src/shape-utils/arrow/arrow.tsx b/packages/tldraw/src/state/shapes/ArrowUtil/ArrowUtil.tsx similarity index 68% rename from packages/tldraw/src/shape-utils/arrow/arrow.tsx rename to packages/tldraw/src/state/shapes/ArrowUtil/ArrowUtil.tsx index c881676f5..8ae2083a0 100644 --- a/packages/tldraw/src/shape-utils/arrow/arrow.tsx +++ b/packages/tldraw/src/state/shapes/ArrowUtil/ArrowUtil.tsx @@ -1,30 +1,38 @@ -import * as React from 'react' -import { Utils, SVGContainer, TLBounds, TLPointerInfo } from '@tldraw/core' +import { Utils, TLBounds, TLPointerInfo, SVGContainer } from '@tldraw/core' import { Vec } from '@tldraw/vec' -import getStroke from 'perfect-freehand' import { defaultStyle, getShapeStyle } from '../shape-styles' import { ArrowShape, - DashStyle, TLDrawTransformInfo, Decoration, TLDrawShapeType, TLDrawShape, EllipseShape, - TLDrawMeta, - TLDrawHandle, TLDrawBinding, + DashStyle, + TLDrawMeta, } from '~types' import { TLDrawShapeUtil } from '../TLDrawShapeUtil' import { intersectArcBounds, - intersectCircleCircle, - intersectCircleLineSegment, intersectLineSegmentBounds, intersectRayBounds, intersectRayEllipse, } from '@tldraw/intersect' -import { EASINGS, BINDING_DISTANCE } from '~constants' +import { BINDING_DISTANCE, EASINGS } from '~constants' +import { + getArcPoints, + getArrowArc, + getArrowArcPath, + getArrowPath, + getBendPoint, + getCtp, + getCurvedArrowHeadPoints, + getStraightArrowHeadPoints, + isAngleBetween, + renderCurvedFreehandArrowShaft, + renderFreehandArrowShaft, +} from './arrowHelpers' type T = ArrowShape type E = SVGSVGElement @@ -256,10 +264,8 @@ export class ArrowUtil extends TLDrawShapeUtil { ) }) - Indicator = TLDrawShapeUtil.Indicator(({ shape }) => { - const path = getArrowPath(shape) - - return + Indicator = TLDrawShapeUtil.Indicator(({ shape }) => { + return }) getBounds = (shape: T) => { @@ -600,281 +606,3 @@ export class ArrowUtil extends TLDrawShapeUtil { return nextShape } } - -/* -------------------------------------------------- */ -/* Helpers */ -/* -------------------------------------------------- */ - -function getArrowArcPath(start: TLDrawHandle, end: TLDrawHandle, circle: number[], bend: number) { - return [ - 'M', - start.point[0], - start.point[1], - 'A', - circle[2], - circle[2], - 0, - 0, - bend < 0 ? 0 : 1, - end.point[0], - end.point[1], - ].join(' ') -} - -function getBendPoint(handles: ArrowShape['handles'], bend: number) { - const { start, end } = handles - - const dist = Vec.dist(start.point, end.point) - - const midPoint = Vec.med(start.point, end.point) - - const bendDist = (dist / 2) * bend - - const u = Vec.uni(Vec.vec(start.point, end.point)) - - const point = Vec.round( - Math.abs(bendDist) < 10 ? midPoint : Vec.add(midPoint, Vec.mul(Vec.per(u), bendDist)) - ) - - return point -} - -function renderFreehandArrowShaft(shape: ArrowShape) { - const { style, id } = shape - - const { start, end } = shape.handles - - const getRandom = Utils.rng(id) - - const strokeWidth = getShapeStyle(style).strokeWidth - - const startPoint = shape.decorations?.start - ? Vec.nudge(start.point, end.point, strokeWidth) - : start.point - - const endPoint = shape.decorations?.end - ? Vec.nudge(end.point, start.point, strokeWidth) - : end.point - - const stroke = getStroke([startPoint, endPoint], { - size: strokeWidth, - thinning: 0.618 + getRandom() * 0.2, - easing: EASINGS.easeOutQuad, - simulatePressure: true, - streamline: 0, - last: true, - }) - - const path = Utils.getSvgPathFromStroke(stroke) - - return path -} - -function renderCurvedFreehandArrowShaft( - shape: ArrowShape, - circle: number[], - length: number, - easing: (t: number) => number -) { - const { style, id } = shape - - const { start, end } = shape.handles - - const getRandom = Utils.rng(id) - - const strokeWidth = getShapeStyle(style).strokeWidth - - const center = [circle[0], circle[1]] - - const radius = circle[2] - - const startPoint = shape.decorations?.start - ? Vec.rotWith(start.point, center, strokeWidth / length) - : start.point - - const endPoint = shape.decorations?.end - ? Vec.rotWith(end.point, center, -(strokeWidth / length)) - : end.point - - const startAngle = Vec.angle(center, startPoint) - - const endAngle = Vec.angle(center, endPoint) - - const points: number[][] = [] - - const count = 8 + Math.floor((Math.abs(length) / 20) * 1 + getRandom() / 2) - - for (let i = 0; i < count; i++) { - const t = easing(i / count) - - const angle = Utils.lerpAngles(startAngle, endAngle, t) - - points.push(Vec.round(Vec.nudgeAtAngle(center, angle, radius))) - } - - const stroke = getStroke([startPoint, ...points, endPoint], { - size: 1 + strokeWidth, - thinning: 0.618 + getRandom() * 0.2, - easing: EASINGS.easeOutQuad, - simulatePressure: false, - streamline: 0, - last: true, - }) - - const path = Utils.getSvgPathFromStroke(stroke) - - return path -} - -function getCtp(shape: ArrowShape) { - const { start, end, bend } = shape.handles - return Utils.circleFromThreePoints(start.point, end.point, bend.point) -} - -function getArrowArc(shape: ArrowShape) { - const { start, end, bend } = shape.handles - - const [cx, cy, radius] = Utils.circleFromThreePoints(start.point, end.point, bend.point) - - const center = [cx, cy] - - const length = getArcLength(center, radius, start.point, end.point) - - return { center, radius, length } -} - -function getCurvedArrowHeadPoints( - A: number[], - r1: number, - C: number[], - r2: number, - sweep: boolean -) { - const ints = intersectCircleCircle(A, r1 * 0.618, C, r2).points - - if (!ints) { - console.warn('Could not find an intersection for the arrow head.') - return { left: A, right: A } - } - - const int = sweep ? ints[0] : ints[1] - - const left = int ? Vec.nudge(Vec.rotWith(int, A, Math.PI / 6), A, r1 * -0.382) : A - - const right = int ? Vec.nudge(Vec.rotWith(int, A, -Math.PI / 6), A, r1 * -0.382) : A - - return { left, right } -} - -function getStraightArrowHeadPoints(A: number[], B: number[], r: number) { - const ints = intersectCircleLineSegment(A, r, A, B).points - if (!ints) { - console.warn('Could not find an intersection for the arrow head.') - return { left: A, right: A } - } - - const int = ints[0] - - const left = int ? Vec.rotWith(int, A, Math.PI / 6) : A - - const right = int ? Vec.rotWith(int, A, -Math.PI / 6) : A - - return { left, right } -} - -function getCurvedArrowHeadPath(A: number[], r1: number, C: number[], r2: number, sweep: boolean) { - const { left, right } = getCurvedArrowHeadPoints(A, r1, C, r2, sweep) - - return `M ${left} L ${A} ${right}` -} - -function getStraightArrowHeadPath(A: number[], B: number[], r: number) { - const { left, right } = getStraightArrowHeadPoints(A, B, r) - - return `M ${left} L ${A} ${right}` -} - -function getArrowPath(shape: ArrowShape) { - const { - decorations, - handles: { start, end, bend: _bend }, - style, - } = shape - - const { strokeWidth } = getShapeStyle(style, false) - - const arrowDist = Vec.dist(start.point, end.point) - - const arrowHeadLength = Math.min(arrowDist / 3, strokeWidth * 8) - - const path: (string | number)[] = [] - - const isStraightLine = Vec.dist(_bend.point, Vec.round(Vec.med(start.point, end.point))) < 1 - - if (isStraightLine) { - // Path (line segment) - path.push(`M ${start.point} L ${end.point}`) - - // Start arrow head - if (decorations?.start) { - path.push(getStraightArrowHeadPath(start.point, end.point, arrowHeadLength)) - } - - // End arrow head - if (decorations?.end) { - path.push(getStraightArrowHeadPath(end.point, start.point, arrowHeadLength)) - } - } else { - const { center, radius, length } = getArrowArc(shape) - - // Path (arc) - path.push(`M ${start.point} A ${radius} ${radius} 0 0 ${length > 0 ? '1' : '0'} ${end.point}`) - - // Start Arrow head - if (decorations?.start) { - path.push(getCurvedArrowHeadPath(start.point, arrowHeadLength, center, radius, length < 0)) - } - - // End arrow head - if (decorations?.end) { - path.push(getCurvedArrowHeadPath(end.point, arrowHeadLength, center, radius, length >= 0)) - } - } - - return path.join(' ') -} - -function getArcPoints(shape: ArrowShape) { - const { start, bend, end } = shape.handles - - const points: number[][] = [start.point, end.point] - - if (Vec.dist2(bend.point, Vec.med(start.point, end.point)) > 4) { - // We're an arc, calculate points along the arc - const { center, radius } = getArrowArc(shape) - - const startAngle = Vec.angle(center, start.point) - - const endAngle = Vec.angle(center, end.point) - - for (let i = 1 / 20; i < 1; i += 1 / 20) { - const angle = Utils.lerpAngles(startAngle, endAngle, i) - points.push(Vec.nudgeAtAngle(center, angle, radius)) - } - } - - return points -} - -function isAngleBetween(a: number, b: number, c: number): boolean { - if (c === a || c === b) return true - const PI2 = Math.PI * 2 - const AB = (b - a + PI2) % PI2 - const AC = (c - a + PI2) % PI2 - return AB <= Math.PI !== AC > AB -} - -function getArcLength(C: number[], r: number, A: number[], B: number[]): number { - const sweep = Utils.getSweep(C, A, B) - return r * (2 * Math.PI) * (sweep / (2 * Math.PI)) -} diff --git a/packages/tldraw/src/shape-utils/arrow/__snapshots__/arrow.spec.tsx.snap b/packages/tldraw/src/state/shapes/ArrowUtil/__snapshots__/ArrowUtil.spec.tsx.snap similarity index 100% rename from packages/tldraw/src/shape-utils/arrow/__snapshots__/arrow.spec.tsx.snap rename to packages/tldraw/src/state/shapes/ArrowUtil/__snapshots__/ArrowUtil.spec.tsx.snap diff --git a/packages/tldraw/src/state/shapes/ArrowUtil/arrowHelpers.ts b/packages/tldraw/src/state/shapes/ArrowUtil/arrowHelpers.ts new file mode 100644 index 000000000..697df1b23 --- /dev/null +++ b/packages/tldraw/src/state/shapes/ArrowUtil/arrowHelpers.ts @@ -0,0 +1,292 @@ +import { Utils } from '@tldraw/core' +import { intersectCircleCircle, intersectCircleLineSegment } from '@tldraw/intersect' +import Vec from '@tldraw/vec' +import getStroke from 'perfect-freehand' +import { EASINGS } from '~constants' +import { getShapeStyle } from '../shape-styles' +import type { ArrowShape, TLDrawHandle } from '~types' + +export function getArrowArcPath( + start: TLDrawHandle, + end: TLDrawHandle, + circle: number[], + bend: number +) { + return [ + 'M', + start.point[0], + start.point[1], + 'A', + circle[2], + circle[2], + 0, + 0, + bend < 0 ? 0 : 1, + end.point[0], + end.point[1], + ].join(' ') +} + +export function getBendPoint(handles: ArrowShape['handles'], bend: number) { + const { start, end } = handles + + const dist = Vec.dist(start.point, end.point) + + const midPoint = Vec.med(start.point, end.point) + + const bendDist = (dist / 2) * bend + + const u = Vec.uni(Vec.vec(start.point, end.point)) + + const point = Vec.round( + Math.abs(bendDist) < 10 ? midPoint : Vec.add(midPoint, Vec.mul(Vec.per(u), bendDist)) + ) + + return point +} + +export function renderFreehandArrowShaft(shape: ArrowShape) { + const { style, id } = shape + + const { start, end } = shape.handles + + const getRandom = Utils.rng(id) + + const strokeWidth = getShapeStyle(style).strokeWidth + + const startPoint = shape.decorations?.start + ? Vec.nudge(start.point, end.point, strokeWidth) + : start.point + + const endPoint = shape.decorations?.end + ? Vec.nudge(end.point, start.point, strokeWidth) + : end.point + + const stroke = getStroke([startPoint, endPoint], { + size: strokeWidth, + thinning: 0.618 + getRandom() * 0.2, + easing: EASINGS.easeOutQuad, + simulatePressure: true, + streamline: 0, + last: true, + }) + + const path = Utils.getSvgPathFromStroke(stroke) + + return path +} + +export function renderCurvedFreehandArrowShaft( + shape: ArrowShape, + circle: number[], + length: number, + easing: (t: number) => number +) { + const { style, id } = shape + + const { start, end } = shape.handles + + const getRandom = Utils.rng(id) + + const strokeWidth = getShapeStyle(style).strokeWidth + + const center = [circle[0], circle[1]] + + const radius = circle[2] + + const startPoint = shape.decorations?.start + ? Vec.rotWith(start.point, center, strokeWidth / length) + : start.point + + const endPoint = shape.decorations?.end + ? Vec.rotWith(end.point, center, -(strokeWidth / length)) + : end.point + + const startAngle = Vec.angle(center, startPoint) + + const endAngle = Vec.angle(center, endPoint) + + const points: number[][] = [] + + const count = 8 + Math.floor((Math.abs(length) / 20) * 1 + getRandom() / 2) + + for (let i = 0; i < count; i++) { + const t = easing(i / count) + + const angle = Utils.lerpAngles(startAngle, endAngle, t) + + points.push(Vec.round(Vec.nudgeAtAngle(center, angle, radius))) + } + + const stroke = getStroke([startPoint, ...points, endPoint], { + size: 1 + strokeWidth, + thinning: 0.618 + getRandom() * 0.2, + easing: EASINGS.easeOutQuad, + simulatePressure: false, + streamline: 0, + last: true, + }) + + const path = Utils.getSvgPathFromStroke(stroke) + + return path +} + +export function getCtp(shape: ArrowShape) { + const { start, end, bend } = shape.handles + return Utils.circleFromThreePoints(start.point, end.point, bend.point) +} + +export function getArrowArc(shape: ArrowShape) { + const { start, end, bend } = shape.handles + + const [cx, cy, radius] = Utils.circleFromThreePoints(start.point, end.point, bend.point) + + const center = [cx, cy] + + const length = getArcLength(center, radius, start.point, end.point) + + return { center, radius, length } +} + +export function getCurvedArrowHeadPoints( + A: number[], + r1: number, + C: number[], + r2: number, + sweep: boolean +) { + const ints = intersectCircleCircle(A, r1 * 0.618, C, r2).points + + if (!ints) { + console.warn('Could not find an intersection for the arrow head.') + return { left: A, right: A } + } + + const int = sweep ? ints[0] : ints[1] + + const left = int ? Vec.nudge(Vec.rotWith(int, A, Math.PI / 6), A, r1 * -0.382) : A + + const right = int ? Vec.nudge(Vec.rotWith(int, A, -Math.PI / 6), A, r1 * -0.382) : A + + return { left, right } +} + +export function getStraightArrowHeadPoints(A: number[], B: number[], r: number) { + const ints = intersectCircleLineSegment(A, r, A, B).points + if (!ints) { + console.warn('Could not find an intersection for the arrow head.') + return { left: A, right: A } + } + + const int = ints[0] + + const left = int ? Vec.rotWith(int, A, Math.PI / 6) : A + + const right = int ? Vec.rotWith(int, A, -Math.PI / 6) : A + + return { left, right } +} + +export function getCurvedArrowHeadPath( + A: number[], + r1: number, + C: number[], + r2: number, + sweep: boolean +) { + const { left, right } = getCurvedArrowHeadPoints(A, r1, C, r2, sweep) + + return `M ${left} L ${A} ${right}` +} + +export function getStraightArrowHeadPath(A: number[], B: number[], r: number) { + const { left, right } = getStraightArrowHeadPoints(A, B, r) + + return `M ${left} L ${A} ${right}` +} + +export function getArrowPath(shape: ArrowShape) { + const { + decorations, + handles: { start, end, bend: _bend }, + style, + } = shape + + const { strokeWidth } = getShapeStyle(style, false) + + const arrowDist = Vec.dist(start.point, end.point) + + const arrowHeadLength = Math.min(arrowDist / 3, strokeWidth * 8) + + const path: (string | number)[] = [] + + const isStraightLine = Vec.dist(_bend.point, Vec.round(Vec.med(start.point, end.point))) < 1 + + if (isStraightLine) { + // Path (line segment) + path.push(`M ${start.point} L ${end.point}`) + + // Start arrow head + if (decorations?.start) { + path.push(getStraightArrowHeadPath(start.point, end.point, arrowHeadLength)) + } + + // End arrow head + if (decorations?.end) { + path.push(getStraightArrowHeadPath(end.point, start.point, arrowHeadLength)) + } + } else { + const { center, radius, length } = getArrowArc(shape) + + // Path (arc) + path.push(`M ${start.point} A ${radius} ${radius} 0 0 ${length > 0 ? '1' : '0'} ${end.point}`) + + // Start Arrow head + if (decorations?.start) { + path.push(getCurvedArrowHeadPath(start.point, arrowHeadLength, center, radius, length < 0)) + } + + // End arrow head + if (decorations?.end) { + path.push(getCurvedArrowHeadPath(end.point, arrowHeadLength, center, radius, length >= 0)) + } + } + + return path.join(' ') +} + +export function getArcPoints(shape: ArrowShape) { + const { start, bend, end } = shape.handles + + const points: number[][] = [start.point, end.point] + + if (Vec.dist2(bend.point, Vec.med(start.point, end.point)) > 4) { + // We're an arc, calculate points along the arc + const { center, radius } = getArrowArc(shape) + + const startAngle = Vec.angle(center, start.point) + + const endAngle = Vec.angle(center, end.point) + + for (let i = 1 / 20; i < 1; i += 1 / 20) { + const angle = Utils.lerpAngles(startAngle, endAngle, i) + points.push(Vec.nudgeAtAngle(center, angle, radius)) + } + } + + return points +} + +export function isAngleBetween(a: number, b: number, c: number): boolean { + if (c === a || c === b) return true + const PI2 = Math.PI * 2 + const AB = (b - a + PI2) % PI2 + const AC = (c - a + PI2) % PI2 + return AB <= Math.PI !== AC > AB +} + +export function getArcLength(C: number[], r: number, A: number[], B: number[]): number { + const sweep = Utils.getSweep(C, A, B) + return r * (2 * Math.PI) * (sweep / (2 * Math.PI)) +} diff --git a/packages/tldraw/src/state/shapes/ArrowUtil/index.ts b/packages/tldraw/src/state/shapes/ArrowUtil/index.ts new file mode 100644 index 000000000..4be87d7a7 --- /dev/null +++ b/packages/tldraw/src/state/shapes/ArrowUtil/index.ts @@ -0,0 +1 @@ +export * from './ArrowUtil' diff --git a/packages/tldraw/src/shape-utils/draw/draw.spec.tsx b/packages/tldraw/src/state/shapes/DrawUtil/DrawUtil.spec.tsx similarity index 83% rename from packages/tldraw/src/shape-utils/draw/draw.spec.tsx rename to packages/tldraw/src/state/shapes/DrawUtil/DrawUtil.spec.tsx index 9838d9e70..37c29370f 100644 --- a/packages/tldraw/src/shape-utils/draw/draw.spec.tsx +++ b/packages/tldraw/src/state/shapes/DrawUtil/DrawUtil.spec.tsx @@ -1,4 +1,4 @@ -import { Draw } from '../' +import { Draw } from '..' describe('Draw shape', () => { it('Creates a shape', () => { diff --git a/packages/tldraw/src/shape-utils/draw/draw.tsx b/packages/tldraw/src/state/shapes/DrawUtil/DrawUtil.tsx similarity index 80% rename from packages/tldraw/src/shape-utils/draw/draw.tsx rename to packages/tldraw/src/state/shapes/DrawUtil/DrawUtil.tsx index 2efd51300..538d68b39 100644 --- a/packages/tldraw/src/shape-utils/draw/draw.tsx +++ b/packages/tldraw/src/state/shapes/DrawUtil/DrawUtil.tsx @@ -1,11 +1,11 @@ import * as React from 'react' import { Utils, SVGContainer, TLBounds } from '@tldraw/core' import { Vec } from '@tldraw/vec' -import { getStrokeOutlinePoints, getStrokePoints, StrokeOptions } from 'perfect-freehand' import { defaultStyle, getShapeStyle } from '../shape-styles' import { DrawShape, DashStyle, TLDrawShapeType, TLDrawTransformInfo, TLDrawMeta } from '~types' import { TLDrawShapeUtil } from '../TLDrawShapeUtil' import { intersectBoundsBounds, intersectBoundsPolyline } from '@tldraw/intersect' +import { getDrawStrokePathData, getFillPath, getSolidStrokePathData } from './drawHelpers' type T = DrawShape type E = SVGSVGElement @@ -263,78 +263,3 @@ export class DrawUtil extends TLDrawShapeUtil { ) } } - -/* -------------------------------------------------- */ -/* Helpers */ -/* -------------------------------------------------- */ - -const simulatePressureSettings: StrokeOptions = { - easing: (t) => Math.sin((t * Math.PI) / 2), - simulatePressure: true, -} - -const realPressureSettings: StrokeOptions = { - easing: (t) => t * t, - simulatePressure: false, -} - -function getOptions(shape: T) { - const styles = getShapeStyle(shape.style) - - const options: StrokeOptions = { - size: 1 + styles.strokeWidth * 1.5, - thinning: 0.65, - streamline: 0.65, - smoothing: 0.65, - ...(shape.points[1][2] === 0.5 ? simulatePressureSettings : realPressureSettings), - last: shape.isComplete, - } - - return options -} - -function getFillPath(shape: T) { - if (shape.points.length < 2) return '' - - return Utils.getSvgPathFromStroke( - getStrokePoints(shape.points, getOptions(shape)).map((pt) => pt.point) - ) -} - -function getDrawStrokePoints(shape: T, options: StrokeOptions) { - return getStrokePoints(shape.points, options) -} - -/** - * Get path data for a stroke with the DashStyle.Draw dash style. - */ -function getDrawStrokePathData(shape: T) { - if (shape.points.length < 2) return '' - - const options = getOptions(shape) - - const strokePoints = getDrawStrokePoints(shape, options) - - const stroke = getStrokeOutlinePoints(strokePoints, options) - - const path = Utils.getSvgPathFromStroke(stroke) - - return path -} - -/** - * Get SVG path data for a shape that has a DashStyle other than DashStyles.Draw. - */ -function getSolidStrokePathData(shape: T) { - const { points } = shape - - if (points.length < 2) return 'M 0 0 L 0 0' - - const options = getOptions(shape) - - const strokePoints = getDrawStrokePoints(shape, options).map((pt) => pt.point.slice(0, 2)) - - const path = Utils.getSvgPathFromStroke(strokePoints, false) - - return path -} diff --git a/packages/tldraw/src/shape-utils/draw/__snapshots__/draw.spec.tsx.snap b/packages/tldraw/src/state/shapes/DrawUtil/__snapshots__/DrawUtil.spec.tsx.snap similarity index 100% rename from packages/tldraw/src/shape-utils/draw/__snapshots__/draw.spec.tsx.snap rename to packages/tldraw/src/state/shapes/DrawUtil/__snapshots__/DrawUtil.spec.tsx.snap diff --git a/packages/tldraw/src/state/shapes/DrawUtil/drawHelpers.ts b/packages/tldraw/src/state/shapes/DrawUtil/drawHelpers.ts new file mode 100644 index 000000000..f4f88dbef --- /dev/null +++ b/packages/tldraw/src/state/shapes/DrawUtil/drawHelpers.ts @@ -0,0 +1,75 @@ +import { Utils } from '@tldraw/core' +import { getStrokeOutlinePoints, getStrokePoints, StrokeOptions } from 'perfect-freehand' +import type { DrawShape } from '~types' +import { getShapeStyle } from '../shape-styles' + +const simulatePressureSettings: StrokeOptions = { + easing: (t) => Math.sin((t * Math.PI) / 2), + simulatePressure: true, +} + +const realPressureSettings: StrokeOptions = { + easing: (t) => t * t, + simulatePressure: false, +} + +export function getFreehandOptions(shape: DrawShape) { + const styles = getShapeStyle(shape.style) + + const options: StrokeOptions = { + size: 1 + styles.strokeWidth * 1.5, + thinning: 0.65, + streamline: 0.65, + smoothing: 0.65, + ...(shape.points[1][2] === 0.5 ? simulatePressureSettings : realPressureSettings), + last: shape.isComplete, + } + + return options +} + +export function getFillPath(shape: DrawShape) { + if (shape.points.length < 2) return '' + + return Utils.getSvgPathFromStroke( + getStrokePoints(shape.points, getFreehandOptions(shape)).map((pt) => pt.point) + ) +} + +export function getDrawStrokePoints(shape: DrawShape, options: StrokeOptions) { + return getStrokePoints(shape.points, options) +} + +/** + * Get path data for a stroke with the DashStyle.Draw dash style. + */ +export function getDrawStrokePathData(shape: DrawShape) { + if (shape.points.length < 2) return '' + + const options = getFreehandOptions(shape) + + const strokePoints = getDrawStrokePoints(shape, options) + + const stroke = getStrokeOutlinePoints(strokePoints, options) + + const path = Utils.getSvgPathFromStroke(stroke) + + return path +} + +/** + * Get SVG path data for a shape that has a DashStyle other than DashStyles.Draw. + */ +export function getSolidStrokePathData(shape: DrawShape) { + const { points } = shape + + if (points.length < 2) return 'M 0 0 L 0 0' + + const options = getFreehandOptions(shape) + + const strokePoints = getDrawStrokePoints(shape, options).map((pt) => pt.point.slice(0, 2)) + + const path = Utils.getSvgPathFromStroke(strokePoints, false) + + return path +} diff --git a/packages/tldraw/src/state/shapes/DrawUtil/index.ts b/packages/tldraw/src/state/shapes/DrawUtil/index.ts new file mode 100644 index 000000000..9f96ad802 --- /dev/null +++ b/packages/tldraw/src/state/shapes/DrawUtil/index.ts @@ -0,0 +1 @@ +export * from './DrawUtil' diff --git a/packages/tldraw/src/shape-utils/ellipse/ellipse.spec.tsx b/packages/tldraw/src/state/shapes/EllipseUtil/EllipseUtil.spec.tsx similarity index 83% rename from packages/tldraw/src/shape-utils/ellipse/ellipse.spec.tsx rename to packages/tldraw/src/state/shapes/EllipseUtil/EllipseUtil.spec.tsx index ae77342e0..5bdce15c7 100644 --- a/packages/tldraw/src/shape-utils/ellipse/ellipse.spec.tsx +++ b/packages/tldraw/src/state/shapes/EllipseUtil/EllipseUtil.spec.tsx @@ -1,4 +1,4 @@ -import { Ellipse } from '../' +import { Ellipse } from '..' describe('Ellipse shape', () => { it('Creates a shape', () => { diff --git a/packages/tldraw/src/shape-utils/ellipse/ellipse.tsx b/packages/tldraw/src/state/shapes/EllipseUtil/EllipseUtil.tsx similarity index 77% rename from packages/tldraw/src/shape-utils/ellipse/ellipse.tsx rename to packages/tldraw/src/state/shapes/EllipseUtil/EllipseUtil.tsx index 03f32952e..6cb0e781b 100644 --- a/packages/tldraw/src/shape-utils/ellipse/ellipse.tsx +++ b/packages/tldraw/src/state/shapes/EllipseUtil/EllipseUtil.tsx @@ -1,7 +1,6 @@ import * as React from 'react' import { Utils, SVGContainer, TLBounds } from '@tldraw/core' import { Vec } from '@tldraw/vec' -import { getStrokeOutlinePoints, getStrokePoints } from 'perfect-freehand' import { defaultStyle, getShapeStyle } from '../shape-styles' import { EllipseShape, @@ -11,9 +10,10 @@ import { TLDrawTransformInfo, TLDrawMeta, } from '~types' -import { EASINGS, BINDING_DISTANCE } from '~constants' +import { BINDING_DISTANCE } from '~constants' import { TLDrawShapeUtil } from '../TLDrawShapeUtil' import { intersectLineSegmentEllipse, intersectRayEllipse } from '@tldraw/intersect' +import { getEllipseIndicatorPathData, getEllipsePath } from './ellipseHelpers' type T = EllipseShape type E = SVGSVGElement @@ -294,87 +294,3 @@ export class EllipseUtil extends TLDrawShapeUtil { } } } - -/* -------------------------------------------------- */ -/* Helpers */ -/* -------------------------------------------------- */ - -function getEllipseStrokePoints(shape: EllipseShape, boundsCenter: number[]) { - const { - id, - radius: [radiusX, radiusY], - point, - style, - } = shape - - const { strokeWidth } = getShapeStyle(style) - - const getRandom = Utils.rng(id) - - const center = Vec.sub(boundsCenter, point) - - const rx = radiusX + getRandom() * strokeWidth * 2 - const ry = radiusY + getRandom() * strokeWidth * 2 - - const perimeter = Utils.perimeterOfEllipse(rx, ry) - - const points: number[][] = [] - - const start = Math.PI + Math.PI * getRandom() - - const extra = Math.abs(getRandom()) - - const count = Math.max(16, perimeter / 10) - - for (let i = 0; i < count; i++) { - const t = EASINGS.easeInOutSine(i / (count + 1)) - const rads = start * 2 + Math.PI * (2 + extra) * t - const c = Math.cos(rads) - const s = Math.sin(rads) - points.push([rx * c + center[0], ry * s + center[1], t + 0.5 + getRandom() / 2]) - } - - return getStrokePoints(points, { - size: 1 + strokeWidth * 2, - thinning: 0.618, - end: { taper: perimeter / 8 }, - start: { taper: perimeter / 12 }, - streamline: 0, - simulatePressure: true, - }) -} - -function getEllipsePath(shape: EllipseShape, boundsCenter: number[]) { - const { - id, - radius: [radiusX, radiusY], - style, - } = shape - - const { strokeWidth } = getShapeStyle(style) - - const getRandom = Utils.rng(id) - - const rx = radiusX + getRandom() * strokeWidth * 2 - const ry = radiusY + getRandom() * strokeWidth * 2 - - const perimeter = Utils.perimeterOfEllipse(rx, ry) - - return Utils.getSvgPathFromStroke( - getStrokeOutlinePoints(getEllipseStrokePoints(shape, boundsCenter), { - size: 1 + strokeWidth * 2, - thinning: 0.618, - end: { taper: perimeter / 8 }, - start: { taper: perimeter / 12 }, - streamline: 0, - simulatePressure: true, - }) - ) -} - -function getEllipseIndicatorPathData(shape: EllipseShape, boundsCenter: number[]) { - return Utils.getSvgPathFromStroke( - getEllipseStrokePoints(shape, boundsCenter).map((pt) => pt.point.slice(0, 2)), - false - ) -} diff --git a/packages/tldraw/src/shape-utils/ellipse/__snapshots__/ellipse.spec.tsx.snap b/packages/tldraw/src/state/shapes/EllipseUtil/__snapshots__/EllipseUtil.spec.tsx.snap similarity index 100% rename from packages/tldraw/src/shape-utils/ellipse/__snapshots__/ellipse.spec.tsx.snap rename to packages/tldraw/src/state/shapes/EllipseUtil/__snapshots__/EllipseUtil.spec.tsx.snap diff --git a/packages/tldraw/src/state/shapes/EllipseUtil/ellipseHelpers.ts b/packages/tldraw/src/state/shapes/EllipseUtil/ellipseHelpers.ts new file mode 100644 index 000000000..6cf6d5e57 --- /dev/null +++ b/packages/tldraw/src/state/shapes/EllipseUtil/ellipseHelpers.ts @@ -0,0 +1,86 @@ +import { Utils } from '@tldraw/core' +import Vec from '@tldraw/vec' +import { getStrokeOutlinePoints, getStrokePoints } from 'perfect-freehand' +import { EASINGS } from '~constants' +import type { EllipseShape } from '~types' +import { getShapeStyle } from '../shape-styles' + +export function getEllipseStrokePoints(shape: EllipseShape, boundsCenter: number[]) { + const { + id, + radius: [radiusX, radiusY], + point, + style, + } = shape + + const { strokeWidth } = getShapeStyle(style) + + const getRandom = Utils.rng(id) + + const center = Vec.sub(boundsCenter, point) + + const rx = radiusX + getRandom() * strokeWidth * 2 + const ry = radiusY + getRandom() * strokeWidth * 2 + + const perimeter = Utils.perimeterOfEllipse(rx, ry) + + const points: number[][] = [] + + const start = Math.PI + Math.PI * getRandom() + + const extra = Math.abs(getRandom()) + + const count = Math.max(16, perimeter / 10) + + for (let i = 0; i < count; i++) { + const t = EASINGS.easeInOutSine(i / (count + 1)) + const rads = start * 2 + Math.PI * (2 + extra) * t + const c = Math.cos(rads) + const s = Math.sin(rads) + points.push([rx * c + center[0], ry * s + center[1], t + 0.5 + getRandom() / 2]) + } + + return getStrokePoints(points, { + size: 1 + strokeWidth * 2, + thinning: 0.618, + end: { taper: perimeter / 8 }, + start: { taper: perimeter / 12 }, + streamline: 0, + simulatePressure: true, + }) +} + +export function getEllipsePath(shape: EllipseShape, boundsCenter: number[]) { + const { + id, + radius: [radiusX, radiusY], + style, + } = shape + + const { strokeWidth } = getShapeStyle(style) + + const getRandom = Utils.rng(id) + + const rx = radiusX + getRandom() * strokeWidth * 2 + const ry = radiusY + getRandom() * strokeWidth * 2 + + const perimeter = Utils.perimeterOfEllipse(rx, ry) + + return Utils.getSvgPathFromStroke( + getStrokeOutlinePoints(getEllipseStrokePoints(shape, boundsCenter), { + size: 1 + strokeWidth * 2, + thinning: 0.618, + end: { taper: perimeter / 8 }, + start: { taper: perimeter / 12 }, + streamline: 0, + simulatePressure: true, + }) + ) +} + +export function getEllipseIndicatorPathData(shape: EllipseShape, boundsCenter: number[]) { + return Utils.getSvgPathFromStroke( + getEllipseStrokePoints(shape, boundsCenter).map((pt) => pt.point.slice(0, 2)), + false + ) +} diff --git a/packages/tldraw/src/state/shapes/EllipseUtil/index.ts b/packages/tldraw/src/state/shapes/EllipseUtil/index.ts new file mode 100644 index 000000000..64ca676c0 --- /dev/null +++ b/packages/tldraw/src/state/shapes/EllipseUtil/index.ts @@ -0,0 +1 @@ +export * from './EllipseUtil' diff --git a/packages/tldraw/src/shape-utils/group/group.spec.tsx b/packages/tldraw/src/state/shapes/GroupUtil/GroupUtil.spec.tsx similarity index 83% rename from packages/tldraw/src/shape-utils/group/group.spec.tsx rename to packages/tldraw/src/state/shapes/GroupUtil/GroupUtil.spec.tsx index 2d6347b56..66e074681 100644 --- a/packages/tldraw/src/shape-utils/group/group.spec.tsx +++ b/packages/tldraw/src/state/shapes/GroupUtil/GroupUtil.spec.tsx @@ -1,4 +1,4 @@ -import { Group } from '../' +import { Group } from '..' describe('Group shape', () => { it('Creates a shape', () => { diff --git a/packages/tldraw/src/shape-utils/group/group.tsx b/packages/tldraw/src/state/shapes/GroupUtil/GroupUtil.tsx similarity index 99% rename from packages/tldraw/src/shape-utils/group/group.tsx rename to packages/tldraw/src/state/shapes/GroupUtil/GroupUtil.tsx index c3d109ea6..d6d52f74d 100644 --- a/packages/tldraw/src/shape-utils/group/group.tsx +++ b/packages/tldraw/src/state/shapes/GroupUtil/GroupUtil.tsx @@ -1,11 +1,11 @@ import * as React from 'react' +import { styled } from '~styles' import { Utils, SVGContainer } from '@tldraw/core' import { defaultStyle } from '../shape-styles' import { TLDrawShapeType, GroupShape, ColorStyle, TLDrawMeta } from '~types' -import { getBoundsRectangle } from '../shared' import { BINDING_DISTANCE } from '~constants' import { TLDrawShapeUtil } from '../TLDrawShapeUtil' -import styled from '~styles' +import { getBoundsRectangle } from '../shared' type T = GroupShape type E = SVGSVGElement diff --git a/packages/tldraw/src/shape-utils/group/__snapshots__/group.spec.tsx.snap b/packages/tldraw/src/state/shapes/GroupUtil/__snapshots__/GroupUtil.spec.tsx.snap similarity index 100% rename from packages/tldraw/src/shape-utils/group/__snapshots__/group.spec.tsx.snap rename to packages/tldraw/src/state/shapes/GroupUtil/__snapshots__/GroupUtil.spec.tsx.snap diff --git a/packages/tldraw/src/state/shapes/GroupUtil/index.ts b/packages/tldraw/src/state/shapes/GroupUtil/index.ts new file mode 100644 index 000000000..9538eaf52 --- /dev/null +++ b/packages/tldraw/src/state/shapes/GroupUtil/index.ts @@ -0,0 +1 @@ +export * from './GroupUtil' diff --git a/packages/tldraw/src/shape-utils/rectangle/rectangle.spec.tsx b/packages/tldraw/src/state/shapes/RectangleUtil/RectangleUtil.spec.tsx similarity index 82% rename from packages/tldraw/src/shape-utils/rectangle/rectangle.spec.tsx rename to packages/tldraw/src/state/shapes/RectangleUtil/RectangleUtil.spec.tsx index f761e60fe..b1285949f 100644 --- a/packages/tldraw/src/shape-utils/rectangle/rectangle.spec.tsx +++ b/packages/tldraw/src/state/shapes/RectangleUtil/RectangleUtil.spec.tsx @@ -1,4 +1,4 @@ -import { Rectangle } from '../' +import { Rectangle } from '..' describe('Rectangle shape', () => { it('Creates a shape', () => { diff --git a/packages/tldraw/src/shape-utils/rectangle/rectangle.tsx b/packages/tldraw/src/state/shapes/RectangleUtil/RectangleUtil.tsx similarity index 100% rename from packages/tldraw/src/shape-utils/rectangle/rectangle.tsx rename to packages/tldraw/src/state/shapes/RectangleUtil/RectangleUtil.tsx diff --git a/packages/tldraw/src/shape-utils/rectangle/__snapshots__/rectangle.spec.tsx.snap b/packages/tldraw/src/state/shapes/RectangleUtil/__snapshots__/RectangleUtil.spec.tsx.snap similarity index 100% rename from packages/tldraw/src/shape-utils/rectangle/__snapshots__/rectangle.spec.tsx.snap rename to packages/tldraw/src/state/shapes/RectangleUtil/__snapshots__/RectangleUtil.spec.tsx.snap diff --git a/packages/tldraw/src/state/shapes/RectangleUtil/index.ts b/packages/tldraw/src/state/shapes/RectangleUtil/index.ts new file mode 100644 index 000000000..5471552d9 --- /dev/null +++ b/packages/tldraw/src/state/shapes/RectangleUtil/index.ts @@ -0,0 +1 @@ +export * from './RectangleUtil' diff --git a/packages/tldraw/src/shape-utils/sticky/sticky.spec.tsx b/packages/tldraw/src/state/shapes/StickyUtil/StickyUtil.spec.tsx similarity index 86% rename from packages/tldraw/src/shape-utils/sticky/sticky.spec.tsx rename to packages/tldraw/src/state/shapes/StickyUtil/StickyUtil.spec.tsx index 650223f63..9215bea18 100644 --- a/packages/tldraw/src/shape-utils/sticky/sticky.spec.tsx +++ b/packages/tldraw/src/state/shapes/StickyUtil/StickyUtil.spec.tsx @@ -1,4 +1,4 @@ -import { Sticky } from '../' +import { Sticky } from '..' describe('Post-It shape', () => { it('Creates a shape', () => { diff --git a/packages/tldraw/src/shape-utils/sticky/sticky.tsx b/packages/tldraw/src/state/shapes/StickyUtil/StickyUtil.tsx similarity index 99% rename from packages/tldraw/src/shape-utils/sticky/sticky.tsx rename to packages/tldraw/src/state/shapes/StickyUtil/StickyUtil.tsx index 3eb3f9cdf..d7f496f44 100644 --- a/packages/tldraw/src/shape-utils/sticky/sticky.tsx +++ b/packages/tldraw/src/state/shapes/StickyUtil/StickyUtil.tsx @@ -6,7 +6,7 @@ import { StickyShape, TLDrawMeta, TLDrawShapeType, TLDrawTransformInfo } from '~ import { getBoundsRectangle, TextAreaUtils } from '../shared' import { TLDrawShapeUtil } from '../TLDrawShapeUtil' import { getStickyFontStyle, getStickyShapeStyle } from '../shape-styles' -import styled from '~styles' +import { styled } from '~styles' import Vec from '@tldraw/vec' type T = StickyShape diff --git a/packages/tldraw/src/state/shapes/StickyUtil/index.ts b/packages/tldraw/src/state/shapes/StickyUtil/index.ts new file mode 100644 index 000000000..b29c6daca --- /dev/null +++ b/packages/tldraw/src/state/shapes/StickyUtil/index.ts @@ -0,0 +1 @@ +export * from './StickyUtil' diff --git a/packages/tldraw/src/shape-utils/TLDrawShapeUtil.tsx b/packages/tldraw/src/state/shapes/TLDrawShapeUtil/TLDrawShapeUtil.tsx similarity index 100% rename from packages/tldraw/src/shape-utils/TLDrawShapeUtil.tsx rename to packages/tldraw/src/state/shapes/TLDrawShapeUtil/TLDrawShapeUtil.tsx diff --git a/packages/tldraw/src/state/shapes/TLDrawShapeUtil/index.ts b/packages/tldraw/src/state/shapes/TLDrawShapeUtil/index.ts new file mode 100644 index 000000000..d6b602fcf --- /dev/null +++ b/packages/tldraw/src/state/shapes/TLDrawShapeUtil/index.ts @@ -0,0 +1 @@ +export * from './TLDrawShapeUtil' diff --git a/packages/tldraw/src/shape-utils/text/text.spec.tsx b/packages/tldraw/src/state/shapes/TextUtil/TextUtil.spec.tsx similarity index 83% rename from packages/tldraw/src/shape-utils/text/text.spec.tsx rename to packages/tldraw/src/state/shapes/TextUtil/TextUtil.spec.tsx index 09558a63f..b33ac2087 100644 --- a/packages/tldraw/src/shape-utils/text/text.spec.tsx +++ b/packages/tldraw/src/state/shapes/TextUtil/TextUtil.spec.tsx @@ -1,4 +1,4 @@ -import { Text } from '../' +import { Text } from '..' describe('Text shape', () => { it('Creates a shape', () => { diff --git a/packages/tldraw/src/shape-utils/text/text.tsx b/packages/tldraw/src/state/shapes/TextUtil/TextUtil.tsx similarity index 99% rename from packages/tldraw/src/shape-utils/text/text.tsx rename to packages/tldraw/src/state/shapes/TextUtil/TextUtil.tsx index f8d1c2ecf..36d5b0127 100644 --- a/packages/tldraw/src/shape-utils/text/text.tsx +++ b/packages/tldraw/src/state/shapes/TextUtil/TextUtil.tsx @@ -6,7 +6,7 @@ import { TextShape, TLDrawMeta, TLDrawShapeType, TLDrawTransformInfo } from '~ty import { TextAreaUtils } from '../shared' import { BINDING_DISTANCE } from '~constants' import { TLDrawShapeUtil } from '../TLDrawShapeUtil' -import styled from '~styles' +import { styled } from '~styles' import Vec from '@tldraw/vec' type T = TextShape diff --git a/packages/tldraw/src/shape-utils/text/__snapshots__/text.spec.tsx.snap b/packages/tldraw/src/state/shapes/TextUtil/__snapshots__/TextUtil.spec.tsx.snap similarity index 100% rename from packages/tldraw/src/shape-utils/text/__snapshots__/text.spec.tsx.snap rename to packages/tldraw/src/state/shapes/TextUtil/__snapshots__/TextUtil.spec.tsx.snap diff --git a/packages/tldraw/src/state/shapes/TextUtil/index.ts b/packages/tldraw/src/state/shapes/TextUtil/index.ts new file mode 100644 index 000000000..b0156cde7 --- /dev/null +++ b/packages/tldraw/src/state/shapes/TextUtil/index.ts @@ -0,0 +1 @@ +export * from './TextUtil' diff --git a/packages/tldraw/src/shape-utils/about-shape-utils.md b/packages/tldraw/src/state/shapes/about-shape-utils.md similarity index 100% rename from packages/tldraw/src/shape-utils/about-shape-utils.md rename to packages/tldraw/src/state/shapes/about-shape-utils.md diff --git a/packages/tldraw/src/state/shapes/index.ts b/packages/tldraw/src/state/shapes/index.ts new file mode 100644 index 000000000..7d2dbb4ce --- /dev/null +++ b/packages/tldraw/src/state/shapes/index.ts @@ -0,0 +1,32 @@ +import type { TLDrawShapeUtil } from './TLDrawShapeUtil' +import { RectangleUtil } from './RectangleUtil' +import { EllipseUtil } from './EllipseUtil' +import { ArrowUtil } from './ArrowUtil' +import { GroupUtil } from './GroupUtil' +import { StickyUtil } from './StickyUtil' +import { TextUtil } from './TextUtil' +import { DrawUtil } from './DrawUtil' +import { TLDrawShape, TLDrawShapeType } from '~types' + +export const Rectangle = new RectangleUtil() +export const Ellipse = new EllipseUtil() +export const Draw = new DrawUtil() +export const Arrow = new ArrowUtil() +export const Text = new TextUtil() +export const Group = new GroupUtil() +export const Sticky = new StickyUtil() + +export const shapeUtils = { + [TLDrawShapeType.Rectangle]: Rectangle, + [TLDrawShapeType.Ellipse]: Ellipse, + [TLDrawShapeType.Draw]: Draw, + [TLDrawShapeType.Arrow]: Arrow, + [TLDrawShapeType.Text]: Text, + [TLDrawShapeType.Group]: Group, + [TLDrawShapeType.Sticky]: Sticky, +} + +export const getShapeUtils = (shape: T | T['type']) => { + if (typeof shape === 'string') return shapeUtils[shape] as unknown as TLDrawShapeUtil + return shapeUtils[shape.type] as unknown as TLDrawShapeUtil +} diff --git a/packages/tldraw/src/shape-utils/shape-styles.ts b/packages/tldraw/src/state/shapes/shape-styles.ts similarity index 100% rename from packages/tldraw/src/shape-utils/shape-styles.ts rename to packages/tldraw/src/state/shapes/shape-styles.ts diff --git a/packages/tldraw/src/shape-utils/shared.tsx b/packages/tldraw/src/state/shapes/shared/TextAreaUtils.ts similarity index 76% rename from packages/tldraw/src/shape-utils/shared.tsx rename to packages/tldraw/src/state/shapes/shared/TextAreaUtils.ts index ad4fda5d9..41e61f657 100644 --- a/packages/tldraw/src/shape-utils/shared.tsx +++ b/packages/tldraw/src/state/shapes/shared/TextAreaUtils.ts @@ -1,91 +1,7 @@ -import { Vec } from '@tldraw/vec' -import { TLBounds, TLShape, TLTransformInfo, Utils } from '@tldraw/core' - -/** - * Transform a rectangular shape. - * @param shape - * @param bounds - * @param param2 - */ -export function transformRectangle( - shape: T, - bounds: TLBounds, - { initialShape, transformOrigin, scaleX, scaleY }: TLTransformInfo -) { - if (shape.rotation || initialShape.isAspectRatioLocked) { - const size = Vec.round(Vec.mul(initialShape.size, Math.min(Math.abs(scaleX), Math.abs(scaleY)))) - - const point = Vec.round([ - bounds.minX + - (bounds.width - shape.size[0]) * (scaleX < 0 ? 1 - transformOrigin[0] : transformOrigin[0]), - bounds.minY + - (bounds.height - shape.size[1]) * - (scaleY < 0 ? 1 - transformOrigin[1] : transformOrigin[1]), - ]) - - const rotation = - (scaleX < 0 && scaleY >= 0) || (scaleY < 0 && scaleX >= 0) - ? initialShape.rotation - ? -initialShape.rotation - : 0 - : initialShape.rotation - - return { - size, - point, - rotation, - } - } else { - return { - point: Vec.round([bounds.minX, bounds.minY]), - size: Vec.round([bounds.width, bounds.height]), - } - } -} - -/** - * Transform a single rectangular shape. - * @param shape - * @param bounds - */ -export function transformSingleRectangle( - shape: T, - bounds: TLBounds -) { - return { - size: Vec.round([bounds.width, bounds.height]), - point: Vec.round([bounds.minX, bounds.minY]), - } -} - -/** - * Find the bounds of a rectangular shape. - * @param shape - * @param boundsCache - */ -export function getBoundsRectangle( - shape: T, - boundsCache: WeakMap -) { - const bounds = Utils.getFromCache(boundsCache, shape, () => { - const [width, height] = shape.size - return { - minX: 0, - maxX: width, - minY: 0, - maxY: height, - width, - height, - } - }) - - return Utils.translateBounds(bounds, shape.point) -} - // Adapted (mostly copied) the work of https://github.com/fregante // Copyright (c) Federico Brigante (bfred.it) -type ReplacerCallback = (substring: string, ...args: any[]) => string +type ReplacerCallback = (substring: string, ...args: unknown[]) => string const INDENT = ' ' diff --git a/packages/tldraw/src/state/shapes/shared/getBoundsRectangle.ts b/packages/tldraw/src/state/shapes/shared/getBoundsRectangle.ts new file mode 100644 index 000000000..0a9546bfa --- /dev/null +++ b/packages/tldraw/src/state/shapes/shared/getBoundsRectangle.ts @@ -0,0 +1,25 @@ +import { TLBounds, TLShape, Utils } from '@tldraw/core' + +/** + * Find the bounds of a rectangular shape. + * @param shape + * @param boundsCache + */ +export function getBoundsRectangle( + shape: T, + boundsCache: WeakMap +) { + const bounds = Utils.getFromCache(boundsCache, shape, () => { + const [width, height] = shape.size + return { + minX: 0, + maxX: width, + minY: 0, + maxY: height, + width, + height, + } + }) + + return Utils.translateBounds(bounds, shape.point) +} diff --git a/packages/tldraw/src/state/shapes/shared/index.ts b/packages/tldraw/src/state/shapes/shared/index.ts new file mode 100644 index 000000000..6f75660ff --- /dev/null +++ b/packages/tldraw/src/state/shapes/shared/index.ts @@ -0,0 +1,4 @@ +export * from './getBoundsRectangle' +export * from './transformRectangle' +export * from './transformSingleRectangle' +export * from './TextAreaUtils' diff --git a/packages/tldraw/src/state/shapes/shared/transformRectangle.ts b/packages/tldraw/src/state/shapes/shared/transformRectangle.ts new file mode 100644 index 000000000..a81c274bc --- /dev/null +++ b/packages/tldraw/src/state/shapes/shared/transformRectangle.ts @@ -0,0 +1,44 @@ +import type { TLBounds, TLShape, TLTransformInfo } from '@tldraw/core' +import Vec from '@tldraw/vec' + +/** + * Transform a rectangular shape. + * @param shape + * @param bounds + * @param param2 + */ +export function transformRectangle( + shape: T, + bounds: TLBounds, + { initialShape, transformOrigin, scaleX, scaleY }: TLTransformInfo +) { + if (shape.rotation || initialShape.isAspectRatioLocked) { + const size = Vec.round(Vec.mul(initialShape.size, Math.min(Math.abs(scaleX), Math.abs(scaleY)))) + + const point = Vec.round([ + bounds.minX + + (bounds.width - shape.size[0]) * (scaleX < 0 ? 1 - transformOrigin[0] : transformOrigin[0]), + bounds.minY + + (bounds.height - shape.size[1]) * + (scaleY < 0 ? 1 - transformOrigin[1] : transformOrigin[1]), + ]) + + const rotation = + (scaleX < 0 && scaleY >= 0) || (scaleY < 0 && scaleX >= 0) + ? initialShape.rotation + ? -initialShape.rotation + : 0 + : initialShape.rotation + + return { + size, + point, + rotation, + } + } else { + return { + point: Vec.round([bounds.minX, bounds.minY]), + size: Vec.round([bounds.width, bounds.height]), + } + } +} diff --git a/packages/tldraw/src/state/shapes/shared/transformSingleRectangle.ts b/packages/tldraw/src/state/shapes/shared/transformSingleRectangle.ts new file mode 100644 index 000000000..9e064fea7 --- /dev/null +++ b/packages/tldraw/src/state/shapes/shared/transformSingleRectangle.ts @@ -0,0 +1,17 @@ +import type { TLBounds, TLShape } from '@tldraw/core' +import Vec from '@tldraw/vec' + +/** + * Transform a single rectangular shape. + * @param shape + * @param bounds + */ +export function transformSingleRectangle( + shape: T, + bounds: TLBounds +) { + return { + size: Vec.round([bounds.width, bounds.height]), + point: Vec.round([bounds.minX, bounds.minY]), + } +} diff --git a/packages/tldraw/src/state/tool/ArrowTool/ArrowTool.spec.ts b/packages/tldraw/src/state/tools/ArrowTool/ArrowTool.spec.ts similarity index 100% rename from packages/tldraw/src/state/tool/ArrowTool/ArrowTool.spec.ts rename to packages/tldraw/src/state/tools/ArrowTool/ArrowTool.spec.ts diff --git a/packages/tldraw/src/state/tool/ArrowTool/ArrowTool.ts b/packages/tldraw/src/state/tools/ArrowTool/ArrowTool.ts similarity index 96% rename from packages/tldraw/src/state/tool/ArrowTool/ArrowTool.ts rename to packages/tldraw/src/state/tools/ArrowTool/ArrowTool.ts index e0001d0ea..1e0246b4a 100644 --- a/packages/tldraw/src/state/tool/ArrowTool/ArrowTool.ts +++ b/packages/tldraw/src/state/tools/ArrowTool/ArrowTool.ts @@ -1,6 +1,6 @@ import Vec from '@tldraw/vec' import { Utils, TLPointerEventHandler } from '@tldraw/core' -import { Arrow } from '~shape-utils' +import { Arrow } from '~state/shapes' import { SessionType, TLDrawShapeType } from '~types' import { BaseTool, Status } from '../BaseTool' diff --git a/packages/tldraw/src/state/tool/ArrowTool/index.ts b/packages/tldraw/src/state/tools/ArrowTool/index.ts similarity index 100% rename from packages/tldraw/src/state/tool/ArrowTool/index.ts rename to packages/tldraw/src/state/tools/ArrowTool/index.ts diff --git a/packages/tldraw/src/state/tool/BaseTool/BaseTool.ts b/packages/tldraw/src/state/tools/BaseTool/BaseTool.ts similarity index 100% rename from packages/tldraw/src/state/tool/BaseTool/BaseTool.ts rename to packages/tldraw/src/state/tools/BaseTool/BaseTool.ts diff --git a/packages/tldraw/src/state/tool/BaseTool/index.ts b/packages/tldraw/src/state/tools/BaseTool/index.ts similarity index 100% rename from packages/tldraw/src/state/tool/BaseTool/index.ts rename to packages/tldraw/src/state/tools/BaseTool/index.ts diff --git a/packages/tldraw/src/state/tool/DrawTool/DrawTool.spec.ts b/packages/tldraw/src/state/tools/DrawTool/DrawTool.spec.ts similarity index 100% rename from packages/tldraw/src/state/tool/DrawTool/DrawTool.spec.ts rename to packages/tldraw/src/state/tools/DrawTool/DrawTool.spec.ts diff --git a/packages/tldraw/src/state/tool/DrawTool/DrawTool.ts b/packages/tldraw/src/state/tools/DrawTool/DrawTool.ts similarity index 97% rename from packages/tldraw/src/state/tool/DrawTool/DrawTool.ts rename to packages/tldraw/src/state/tools/DrawTool/DrawTool.ts index 1ef93f712..209574bd0 100644 --- a/packages/tldraw/src/state/tool/DrawTool/DrawTool.ts +++ b/packages/tldraw/src/state/tools/DrawTool/DrawTool.ts @@ -1,6 +1,6 @@ import Vec from '@tldraw/vec' import { Utils, TLPointerEventHandler } from '@tldraw/core' -import { Draw } from '~shape-utils' +import { Draw } from '~state/shapes' import { SessionType, TLDrawShapeType } from '~types' import { BaseTool, Status } from '../BaseTool' diff --git a/packages/tldraw/src/state/tool/DrawTool/index.ts b/packages/tldraw/src/state/tools/DrawTool/index.ts similarity index 100% rename from packages/tldraw/src/state/tool/DrawTool/index.ts rename to packages/tldraw/src/state/tools/DrawTool/index.ts diff --git a/packages/tldraw/src/state/tool/EllipseTool/EllipseTool.spec.ts b/packages/tldraw/src/state/tools/EllipseTool/EllipseTool.spec.ts similarity index 100% rename from packages/tldraw/src/state/tool/EllipseTool/EllipseTool.spec.ts rename to packages/tldraw/src/state/tools/EllipseTool/EllipseTool.spec.ts diff --git a/packages/tldraw/src/state/tool/EllipseTool/EllipseTool.ts b/packages/tldraw/src/state/tools/EllipseTool/EllipseTool.ts similarity index 96% rename from packages/tldraw/src/state/tool/EllipseTool/EllipseTool.ts rename to packages/tldraw/src/state/tools/EllipseTool/EllipseTool.ts index 446e6f7d4..a127c128c 100644 --- a/packages/tldraw/src/state/tool/EllipseTool/EllipseTool.ts +++ b/packages/tldraw/src/state/tools/EllipseTool/EllipseTool.ts @@ -1,6 +1,6 @@ import Vec from '@tldraw/vec' import { Utils, TLPointerEventHandler, TLBoundsCorner } from '@tldraw/core' -import { Ellipse } from '~shape-utils' +import { Ellipse } from '~state/shapes' import { SessionType, TLDrawShapeType } from '~types' import { BaseTool, Status } from '../BaseTool' diff --git a/packages/tldraw/src/state/tool/EllipseTool/index.ts b/packages/tldraw/src/state/tools/EllipseTool/index.ts similarity index 100% rename from packages/tldraw/src/state/tool/EllipseTool/index.ts rename to packages/tldraw/src/state/tools/EllipseTool/index.ts diff --git a/packages/tldraw/src/state/tool/RectangleTool/RectangleTool.spec.ts b/packages/tldraw/src/state/tools/RectangleTool/RectangleTool.spec.ts similarity index 100% rename from packages/tldraw/src/state/tool/RectangleTool/RectangleTool.spec.ts rename to packages/tldraw/src/state/tools/RectangleTool/RectangleTool.spec.ts diff --git a/packages/tldraw/src/state/tool/RectangleTool/RectangleTool.ts b/packages/tldraw/src/state/tools/RectangleTool/RectangleTool.ts similarity index 96% rename from packages/tldraw/src/state/tool/RectangleTool/RectangleTool.ts rename to packages/tldraw/src/state/tools/RectangleTool/RectangleTool.ts index 8afa6eb44..62f683fa4 100644 --- a/packages/tldraw/src/state/tool/RectangleTool/RectangleTool.ts +++ b/packages/tldraw/src/state/tools/RectangleTool/RectangleTool.ts @@ -1,6 +1,6 @@ import Vec from '@tldraw/vec' import { Utils, TLPointerEventHandler, TLBoundsCorner } from '@tldraw/core' -import { Rectangle } from '~shape-utils' +import { Rectangle } from '~state/shapes' import { SessionType, TLDrawShapeType } from '~types' import { BaseTool, Status } from '../BaseTool' diff --git a/packages/tldraw/src/state/tool/RectangleTool/index.ts b/packages/tldraw/src/state/tools/RectangleTool/index.ts similarity index 100% rename from packages/tldraw/src/state/tool/RectangleTool/index.ts rename to packages/tldraw/src/state/tools/RectangleTool/index.ts diff --git a/packages/tldraw/src/state/tool/SelectTool/SelectTool.spec.ts b/packages/tldraw/src/state/tools/SelectTool/SelectTool.spec.ts similarity index 87% rename from packages/tldraw/src/state/tool/SelectTool/SelectTool.spec.ts rename to packages/tldraw/src/state/tools/SelectTool/SelectTool.spec.ts index 79d8d3626..1baa0b202 100644 --- a/packages/tldraw/src/state/tool/SelectTool/SelectTool.spec.ts +++ b/packages/tldraw/src/state/tools/SelectTool/SelectTool.spec.ts @@ -1,5 +1,5 @@ import { TLDrawState } from '~state' -import { mockDocument, TLStateUtils } from '~test' +import { mockDocument, TLDrawStateUtils } from '~test' import { SessionType, TLDrawShapeType } from '~types' import { SelectTool } from '.' @@ -60,7 +60,7 @@ describe('When double clicking link controls', () => { it('moves all linked shapes when center is dragged', () => { const tlstate = new TLDrawState().loadDocument(doc).select('rect2') - const tlu = new TLStateUtils(tlstate) + const tlu = new TLDrawStateUtils(tlstate) tlu .pointBoundsHandle('center') @@ -82,7 +82,7 @@ describe('When double clicking link controls', () => { it('moves all upstream shapes when center is dragged', () => { const tlstate = new TLDrawState().loadDocument(doc).select('rect2') - const tlu = new TLStateUtils(tlstate) + const tlu = new TLDrawStateUtils(tlstate) tlu.pointBoundsHandle('left').movePointer({ x: 100, y: 100 }) @@ -93,7 +93,7 @@ describe('When double clicking link controls', () => { it('moves all downstream shapes when center is dragged', () => { const tlstate = new TLDrawState().loadDocument(doc).select('rect2') - const tlu = new TLStateUtils(tlstate) + const tlu = new TLDrawStateUtils(tlstate) tlu.pointBoundsHandle('right').movePointer({ x: 100, y: 100 }) @@ -104,14 +104,14 @@ describe('When double clicking link controls', () => { it('selects all linked shapes when center is double clicked', () => { const tlstate = new TLDrawState().loadDocument(doc).select('rect2') - const tlu = new TLStateUtils(tlstate) + const tlu = new TLDrawStateUtils(tlstate) tlu.doubleClickBoundHandle('center').expectSelectedIdsToBe(['rect2', 'rect1', 'rect3']) }) it('selects all linked shapes and arrows when center is double clicked while holding shift', () => { const tlstate = new TLDrawState().loadDocument(doc).select('rect2') - const tlu = new TLStateUtils(tlstate) + const tlu = new TLDrawStateUtils(tlstate) tlu .doubleClickBoundHandle('center', { shiftKey: true }) @@ -120,14 +120,14 @@ describe('When double clicking link controls', () => { it('selects all upstream linked shapes when left is double clicked', () => { const tlstate = new TLDrawState().loadDocument(doc).select('rect2') - const tlu = new TLStateUtils(tlstate) + const tlu = new TLDrawStateUtils(tlstate) tlu.doubleClickBoundHandle('left').expectSelectedIdsToBe(['rect1', 'rect2']) }) it('selects all upstream linked shapes and arrows when left is double clicked with shift', () => { const tlstate = new TLDrawState().loadDocument(doc).select('rect2') - const tlu = new TLStateUtils(tlstate) + const tlu = new TLDrawStateUtils(tlstate) tlu .doubleClickBoundHandle('left', { shiftKey: true }) @@ -136,14 +136,14 @@ describe('When double clicking link controls', () => { it('selects all downstream linked shapes when right is double clicked', () => { const tlstate = new TLDrawState().loadDocument(doc).select('rect2') - const tlu = new TLStateUtils(tlstate) + const tlu = new TLDrawStateUtils(tlstate) tlu.doubleClickBoundHandle('right').expectSelectedIdsToBe(['rect2', 'rect3']) }) it('selects all downstream linked shapes and arrows when right is double clicked with shift', () => { const tlstate = new TLDrawState().loadDocument(doc).select('rect2') - const tlu = new TLStateUtils(tlstate) + const tlu = new TLDrawStateUtils(tlstate) tlu .doubleClickBoundHandle('right', { shiftKey: true }) @@ -155,7 +155,7 @@ describe('When selecting grouped shapes', () => { it('Selects the group on single click', () => { const tlstate = new TLDrawState().loadDocument(mockDocument).group(['rect1', 'rect2'], 'groupA') - new TLStateUtils(tlstate).clickShape('rect1') + new TLDrawStateUtils(tlstate).clickShape('rect1') expect(tlstate.selectedIds).toStrictEqual(['groupA']) }) @@ -163,7 +163,7 @@ describe('When selecting grouped shapes', () => { it('Drills in and selects the child on double click', () => { const tlstate = new TLDrawState().loadDocument(mockDocument).group(['rect1', 'rect2'], 'groupA') - new TLStateUtils(tlstate).doubleClickShape('rect1') + new TLDrawStateUtils(tlstate).doubleClickShape('rect1') expect(tlstate.selectedIds).toStrictEqual(['rect1']) }) @@ -171,7 +171,7 @@ describe('When selecting grouped shapes', () => { it('Selects a sibling on single click after drilling', () => { const tlstate = new TLDrawState().loadDocument(mockDocument).group(['rect1', 'rect2'], 'groupA') - new TLStateUtils(tlstate).doubleClickShape('rect1').clickShape('rect2') + new TLDrawStateUtils(tlstate).doubleClickShape('rect1').clickShape('rect2') expect(tlstate.selectedIds).toStrictEqual(['rect2']) }) @@ -182,7 +182,7 @@ describe('When selecting grouped shapes', () => { .selectAll() .group(['rect1', 'rect2'], 'groupA') - new TLStateUtils(tlstate).doubleClickShape('rect1').clickShape('rect3').clickShape('rect1') + new TLDrawStateUtils(tlstate).doubleClickShape('rect1').clickShape('rect3').clickShape('rect1') expect(tlstate.selectedIds).toStrictEqual(['groupA']) }) @@ -197,7 +197,7 @@ describe('When selecting grouped shapes', () => { }) .group(['rect1', 'rect2', 'text1'], 'groupA') - new TLStateUtils(tlstate).doubleClickShape('text1') + new TLDrawStateUtils(tlstate).doubleClickShape('text1') expect(tlstate.selectedIds).toStrictEqual(['text1']) expect(tlstate.pageState.editingId).toBeUndefined() @@ -213,7 +213,7 @@ describe('When selecting grouped shapes', () => { }) .group(['rect1', 'rect2', 'text1'], 'groupA') - new TLStateUtils(tlstate).doubleClickShape('text1').doubleClickShape('text1') + new TLDrawStateUtils(tlstate).doubleClickShape('text1').doubleClickShape('text1') expect(tlstate.selectedIds).toStrictEqual(['text1']) expect(tlstate.pageState.editingId).toBe('text1') diff --git a/packages/tldraw/src/state/tool/SelectTool/SelectTool.ts b/packages/tldraw/src/state/tools/SelectTool/SelectTool.ts similarity index 99% rename from packages/tldraw/src/state/tool/SelectTool/SelectTool.ts rename to packages/tldraw/src/state/tools/SelectTool/SelectTool.ts index fb59d5e31..dbac3da25 100644 --- a/packages/tldraw/src/state/tool/SelectTool/SelectTool.ts +++ b/packages/tldraw/src/state/tools/SelectTool/SelectTool.ts @@ -12,7 +12,7 @@ import { import { SessionType, TLDrawShapeType } from '~types' import { BaseTool } from '../BaseTool' import Vec from '@tldraw/vec' -import { TLDR } from '~state/tldr' +import { TLDR } from '~state/TLDR' import { CLONING_DISTANCE } from '~constants' enum Status { diff --git a/packages/tldraw/src/state/tool/SelectTool/index.ts b/packages/tldraw/src/state/tools/SelectTool/index.ts similarity index 100% rename from packages/tldraw/src/state/tool/SelectTool/index.ts rename to packages/tldraw/src/state/tools/SelectTool/index.ts diff --git a/packages/tldraw/src/state/tool/StickyTool/StickyTool.spec.ts b/packages/tldraw/src/state/tools/StickyTool/StickyTool.spec.ts similarity index 100% rename from packages/tldraw/src/state/tool/StickyTool/StickyTool.spec.ts rename to packages/tldraw/src/state/tools/StickyTool/StickyTool.spec.ts diff --git a/packages/tldraw/src/state/tool/StickyTool/StickyTool.ts b/packages/tldraw/src/state/tools/StickyTool/StickyTool.ts similarity index 97% rename from packages/tldraw/src/state/tool/StickyTool/StickyTool.ts rename to packages/tldraw/src/state/tools/StickyTool/StickyTool.ts index e96baca50..dbc2ad0fd 100644 --- a/packages/tldraw/src/state/tool/StickyTool/StickyTool.ts +++ b/packages/tldraw/src/state/tools/StickyTool/StickyTool.ts @@ -1,7 +1,7 @@ import Vec from '@tldraw/vec' import type { TLPointerEventHandler } from '@tldraw/core' import { Utils } from '@tldraw/core' -import { Sticky } from '~shape-utils' +import { Sticky } from '~state/shapes' import { SessionType, TLDrawShapeType } from '~types' import { BaseTool, Status } from '../BaseTool' diff --git a/packages/tldraw/src/state/tool/StickyTool/index.ts b/packages/tldraw/src/state/tools/StickyTool/index.ts similarity index 100% rename from packages/tldraw/src/state/tool/StickyTool/index.ts rename to packages/tldraw/src/state/tools/StickyTool/index.ts diff --git a/packages/tldraw/src/state/tool/TextTool/TextTool.spec.ts b/packages/tldraw/src/state/tools/TextTool/TextTool.spec.ts similarity index 100% rename from packages/tldraw/src/state/tool/TextTool/TextTool.spec.ts rename to packages/tldraw/src/state/tools/TextTool/TextTool.spec.ts diff --git a/packages/tldraw/src/state/tool/TextTool/TextTool.ts b/packages/tldraw/src/state/tools/TextTool/TextTool.ts similarity index 100% rename from packages/tldraw/src/state/tool/TextTool/TextTool.ts rename to packages/tldraw/src/state/tools/TextTool/TextTool.ts diff --git a/packages/tldraw/src/state/tool/TextTool/index.ts b/packages/tldraw/src/state/tools/TextTool/index.ts similarity index 100% rename from packages/tldraw/src/state/tool/TextTool/index.ts rename to packages/tldraw/src/state/tools/TextTool/index.ts diff --git a/packages/tldraw/src/state/tool/about-tools.md b/packages/tldraw/src/state/tools/about-tools.md similarity index 100% rename from packages/tldraw/src/state/tool/about-tools.md rename to packages/tldraw/src/state/tools/about-tools.md diff --git a/packages/tldraw/src/state/tool/index.ts b/packages/tldraw/src/state/tools/index.ts similarity index 100% rename from packages/tldraw/src/state/tool/index.ts rename to packages/tldraw/src/state/tools/index.ts diff --git a/packages/tldraw/src/state/utils.spec.ts b/packages/tldraw/src/state/utils.spec.ts deleted file mode 100644 index 079e3e62e..000000000 --- a/packages/tldraw/src/state/utils.spec.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Utils } from '@tldraw/core' - -describe('deep merge', () => { - it('merges an object', () => { - const a = { a: 1, b: 2 } - const b = { ...a, a: 2 } - const c = Utils.deepMerge(a, b) - expect(c.a).toBe(2) - expect(c.b).toBe(a.b) - }) - - it('merges a complex object', () => { - const a = { a: 1, b: { name: 'steve', age: 93 } } - const b = { a: 2 } - const c = Utils.deepMerge(a, b) - expect(c.a).toBe(2) - expect(c.b === a.b).toBeTruthy() - }) -}) diff --git a/packages/tldraw/src/state/utils.ts b/packages/tldraw/src/state/utils.ts deleted file mode 100644 index b383af1cb..000000000 --- a/packages/tldraw/src/state/utils.ts +++ /dev/null @@ -1 +0,0 @@ -export const sample = (arr: any[]) => arr[Math.floor(Math.random() * arr.length)] diff --git a/packages/tldraw/src/styles/index.ts b/packages/tldraw/src/styles/index.ts index e2a943291..db90ccb44 100644 --- a/packages/tldraw/src/styles/index.ts +++ b/packages/tldraw/src/styles/index.ts @@ -1,5 +1 @@ -import css from './stitches.config' - export * from './stitches.config' - -export default css diff --git a/packages/tldraw/src/styles/stitches.config.ts b/packages/tldraw/src/styles/stitches.config.ts index a4df5337b..30aabca23 100644 --- a/packages/tldraw/src/styles/stitches.config.ts +++ b/packages/tldraw/src/styles/stitches.config.ts @@ -1,6 +1,6 @@ import { createStitches, defaultThemeMap } from '@stitches/react' -const { styled, createTheme, getCssText } = createStitches({ +const { styled, createTheme } = createStitches({ themeMap: { ...defaultThemeMap, }, @@ -104,7 +104,7 @@ const { styled, createTheme, getCssText } = createStitches({ }, }) -const dark = createTheme({ +export const dark = createTheme({ colors: { brushFill: 'rgba(180, 180, 180, .05)', brushStroke: 'rgba(180, 180, 180, .25)', @@ -146,6 +146,4 @@ const dark = createTheme({ }, }) -export default styled - -export { getCssText, dark } +export { styled } diff --git a/packages/tldraw/src/test/state-utils.tsx b/packages/tldraw/src/test/TLDrawStateUtils.tsx similarity index 99% rename from packages/tldraw/src/test/state-utils.tsx rename to packages/tldraw/src/test/TLDrawStateUtils.tsx index 7f1866366..b700704d5 100644 --- a/packages/tldraw/src/test/state-utils.tsx +++ b/packages/tldraw/src/test/TLDrawStateUtils.tsx @@ -11,7 +11,7 @@ interface PointerOptions { ctrlKey?: boolean } -export class TLStateUtils { +export class TLDrawStateUtils { tlstate: TLDrawState constructor(tlstate: TLDrawState) { diff --git a/packages/tldraw/src/test/old-doc-2.ts b/packages/tldraw/src/test/documents/old-doc-2.ts similarity index 100% rename from packages/tldraw/src/test/old-doc-2.ts rename to packages/tldraw/src/test/documents/old-doc-2.ts diff --git a/packages/tldraw/src/test/old-doc.ts b/packages/tldraw/src/test/documents/old-doc.ts similarity index 100% rename from packages/tldraw/src/test/old-doc.ts rename to packages/tldraw/src/test/documents/old-doc.ts diff --git a/packages/tldraw/src/test/index.ts b/packages/tldraw/src/test/index.ts index 1a19cb05b..35a1aec6f 100644 --- a/packages/tldraw/src/test/index.ts +++ b/packages/tldraw/src/test/index.ts @@ -1,3 +1,3 @@ -export * from './mock-document' +export * from './mockDocument' export * from './renderWithContext' -export * from './state-utils' +export * from './TLDrawStateUtils' diff --git a/packages/tldraw/src/test/mock-document.tsx b/packages/tldraw/src/test/mockDocument.tsx similarity index 100% rename from packages/tldraw/src/test/mock-document.tsx rename to packages/tldraw/src/test/mockDocument.tsx diff --git a/packages/tldraw/src/test/renderWithContext.tsx b/packages/tldraw/src/test/renderWithContext.tsx index 64a86612d..55d139b03 100644 --- a/packages/tldraw/src/test/renderWithContext.tsx +++ b/packages/tldraw/src/test/renderWithContext.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import { IdProvider } from '@radix-ui/react-id' import { TLDrawState } from '~state' import { useKeyboardShortcuts, TLDrawContext } from '~hooks' -import { mockDocument } from './mock-document' +import { mockDocument } from './mockDocument' import { render } from '@testing-library/react' export const Wrapper: React.FC = ({ children }) => { diff --git a/www/.babelrc b/www/.babelrc deleted file mode 100644 index 83b3b8ea0..000000000 --- a/www/.babelrc +++ /dev/null @@ -1,11 +0,0 @@ -{ - "presets": [ - [ - "next/babel", - { - "preset-env": { "targets": { "node": true } } - } - ] - ], - "plugins": [] -} diff --git a/www/pages/sponsorware.tsx b/www/pages/sponsorware.tsx index cc9972728..b2038940c 100644 --- a/www/pages/sponsorware.tsx +++ b/www/pages/sponsorware.tsx @@ -1,4 +1,4 @@ -import styled from 'styles' +import { styled } from 'styles' import { getSession, signin, signout, useSession } from 'next-auth/client' import { GetServerSideProps } from 'next' import Link from 'next/link' diff --git a/www/styles/index.ts b/www/styles/index.ts index e96cafccd..db90ccb44 100644 --- a/www/styles/index.ts +++ b/www/styles/index.ts @@ -1,4 +1 @@ -import css, { getCssText, globalStyles, light, dark } from './stitches.config' - -export default css -export { getCssText, globalStyles, light, dark } +export * from './stitches.config' diff --git a/www/styles/stitches.config.ts b/www/styles/stitches.config.ts index d9bbc93ba..fb909e452 100644 --- a/www/styles/stitches.config.ts +++ b/www/styles/stitches.config.ts @@ -141,6 +141,4 @@ const globalStyles = globalCss({ '*': { boxSizing: 'border-box' }, }) -export default styled - -export { getCssText, globalStyles, light, dark } +export { styled, getCssText, globalStyles, light, dark } diff --git a/yarn.lock b/yarn.lock index 1127eeb72..4ab3b7f16 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3177,6 +3177,11 @@ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + "@types/prettier@^2.1.5": version "2.4.1" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.1.tgz#e1303048d5389563e130f5bdd89d37a99acb75eb" @@ -3447,6 +3452,14 @@ agentkeepalive@^3.4.1: dependencies: humanize-ms "^1.2.1" +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" @@ -3487,7 +3500,7 @@ ansi-escapes@^3.2.0: resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== -ansi-escapes@^4.2.1: +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -4394,6 +4407,11 @@ classnames@2.2.6: resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + clean-webpack-plugin@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz#72947d4403d452f38ed61a9ff0ada8122aacd729" @@ -4408,6 +4426,13 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + cli-highlight@^2.1.11: version "2.1.11" resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf" @@ -4420,6 +4445,14 @@ cli-highlight@^2.1.11: parse5-htmlparser2-tree-adapter "^6.0.0" yargs "^16.0.0" +cli-truncate@2.1.0, cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + cli-width@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" @@ -4457,6 +4490,11 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= +clone@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -4504,11 +4542,16 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colorette@^1.2.2: +colorette@^1.2.2, colorette@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== +colorette@^2.0.16: + version "2.0.16" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" + integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== + columnify@^1.5.4: version "1.5.4" resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" @@ -4534,6 +4577,11 @@ commander@^3.0.2: resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== +commander@^8.2.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + common-tags@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" @@ -4771,6 +4819,17 @@ cosmiconfig@^5.1.0: js-yaml "^3.13.1" parse-json "^4.0.0" +cosmiconfig@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + create-ecdh@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" @@ -4968,7 +5027,7 @@ debug@3.1.0: dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== @@ -5315,7 +5374,7 @@ enhanced-resolve@^5.7.0: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@^2.3.5: +enquirer@^2.3.5, enquirer@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -5815,7 +5874,7 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^5.0.0: +execa@^5.0.0, execa@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== @@ -6741,6 +6800,11 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" +husky@^7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535" + integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== + iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -8130,6 +8194,40 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= +lint-staged@^11.2.6: + version "11.2.6" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-11.2.6.tgz#f477b1af0294db054e5937f171679df63baa4c43" + integrity sha512-Vti55pUnpvPE0J9936lKl0ngVeTdSZpEdTNhASbkaWX7J5R9OEifo1INBGQuGW4zmy6OG+TcWPJ3m5yuy5Q8Tg== + dependencies: + cli-truncate "2.1.0" + colorette "^1.4.0" + commander "^8.2.0" + cosmiconfig "^7.0.1" + debug "^4.3.2" + enquirer "^2.3.6" + execa "^5.1.1" + listr2 "^3.12.2" + micromatch "^4.0.4" + normalize-path "^3.0.0" + please-upgrade-node "^3.2.0" + string-argv "0.3.1" + stringify-object "3.3.0" + supports-color "8.1.1" + +listr2@^3.12.2: + version "3.13.3" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.13.3.tgz#d8f6095c9371b382c9b1c2bc33c5941d8e177f11" + integrity sha512-VqAgN+XVfyaEjSaFewGPcDs5/3hBbWVaX1VgWv2f52MF7US45JuARlArULctiB44IIcEk3JF7GtoFCLqEdeuPA== + dependencies: + cli-truncate "^2.1.0" + clone "^2.1.2" + colorette "^2.0.16" + log-update "^4.0.0" + p-map "^4.0.0" + rxjs "^7.4.0" + through "^2.3.8" + wrap-ansi "^7.0.0" + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -8315,6 +8413,16 @@ lodash@^4.17.12, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.2.1, lodash@^4.7.0: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -9225,7 +9333,7 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" -onetime@^5.1.2: +onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== @@ -9353,6 +9461,13 @@ p-map@^2.0.0, p-map@^2.1.0: resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + p-pipe@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-1.2.0.tgz#4b1a11399a11520a67790ee5a0c1d5881d6befe9" @@ -9672,6 +9787,13 @@ platform@1.3.6: resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== +please-upgrade-node@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" + integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== + dependencies: + semver-compare "^1.0.0" + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -9708,6 +9830,11 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= +prettier@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c" + integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA== + pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" @@ -10421,6 +10548,14 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -10509,6 +10644,13 @@ rxjs@^6.4.0, rxjs@^6.6.3: dependencies: tslib "^1.9.0" +rxjs@^7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.4.0.tgz#a12a44d7eebf016f5ff2441b87f28c9a51cebc68" + integrity sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w== + dependencies: + tslib "~2.1.0" + safari-14-idb-fix@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/safari-14-idb-fix/-/safari-14-idb-fix-1.0.6.tgz#cbaabc33a4500c44b5c432d6c525b0ed9b68bb65" @@ -10574,6 +10716,11 @@ schema-utils@^3.1.1: ajv "^6.12.5" ajv-keywords "^3.5.2" +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= + "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.1.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -10717,6 +10864,15 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + slice-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" @@ -11014,6 +11170,11 @@ strict-uri-encode@^2.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= +string-argv@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== + string-hash@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" @@ -11106,7 +11267,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -stringify-object@^3.3.0: +stringify-object@3.3.0, stringify-object@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== @@ -11232,6 +11393,13 @@ stylis@3.5.4: resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe" integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q== +supports-color@8.1.1, supports-color@^8.0.0, supports-color@^8.1.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -11251,13 +11419,6 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0, supports-color@^8.1.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-hyperlinks@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" @@ -11423,7 +11584,7 @@ through2@^4.0.0: dependencies: readable-stream "3" -through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6: +through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -11583,6 +11744,11 @@ tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== +tslib@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" + integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -12322,6 +12488,15 @@ wrap-ansi@^5.1.0: string-width "^3.0.0" strip-ansi "^5.0.0" +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -12440,6 +12615,11 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + yargonaut@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/yargonaut/-/yargonaut-1.1.4.tgz#c64f56432c7465271221f53f5cc517890c3d6e0c"