Browse Source

Refactor to Stitches Core (#89)

* Refactor www/styles to Stitches Core

* Update package.json

* Begin refactor of `tldraw`

* More refactoring

* A bit more

* little bit more

* Update yarn.lock

* Drops React dependencies to 16.8

Co-authored-by: Steve Ruiz <steveruizok@gmail.com>
main
Pedro Duarte 4 years ago
parent
commit
f8b2fe1c85
No account linked to committer's email address
47 changed files with 686 additions and 21924 deletions
  1. 2
    4
      package.json
  2. 5
    5
      packages/core/package.json
  3. 3
    2
      packages/core/src/types.ts
  4. 6
    6
      packages/dev/package.json
  5. 1
    3
      packages/intersect/package.json
  6. 6
    7
      packages/tldraw/package.json
  7. 35
    36
      packages/tldraw/src/components/context-menu/context-menu.tsx
  8. 15
    15
      packages/tldraw/src/components/menu/menu.tsx
  9. 17
    17
      packages/tldraw/src/components/page-options-dialog/page-options-dialog.tsx
  10. 19
    21
      packages/tldraw/src/components/page-panel/page-panel.tsx
  11. 2
    2
      packages/tldraw/src/components/shared/buttons-row.tsx
  12. 39
    18
      packages/tldraw/src/components/shared/context-menu.tsx
  13. 5
    5
      packages/tldraw/src/components/shared/dialog.tsx
  14. 39
    18
      packages/tldraw/src/components/shared/dropdown-menu.tsx
  15. 2
    2
      packages/tldraw/src/components/shared/floating-container.tsx
  16. 2
    2
      packages/tldraw/src/components/shared/icon-button.tsx
  17. 2
    2
      packages/tldraw/src/components/shared/icon-wrapper.tsx
  18. 4
    4
      packages/tldraw/src/components/shared/kbd.tsx
  19. 11
    7
      packages/tldraw/src/components/shared/menu.tsx
  20. 10
    2
      packages/tldraw/src/components/shared/radio-group.tsx
  21. 2
    2
      packages/tldraw/src/components/shared/row-button.tsx
  22. 14
    9
      packages/tldraw/src/components/shared/tooltip.tsx
  23. 47
    37
      packages/tldraw/src/components/style-panel/align-distribute.tsx
  24. 3
    3
      packages/tldraw/src/components/style-panel/quick-color-select.tsx
  25. 4
    6
      packages/tldraw/src/components/style-panel/quick-dash-select.tsx
  26. 4
    5
      packages/tldraw/src/components/style-panel/quick-fill-select.tsx
  27. 3
    5
      packages/tldraw/src/components/style-panel/quick-size-select.tsx
  28. 41
    41
      packages/tldraw/src/components/style-panel/shapes-functions.tsx
  29. 29
    26
      packages/tldraw/src/components/style-panel/style-panel.tsx
  30. 3
    3
      packages/tldraw/src/components/style-panel/styled.tsx
  31. 9
    9
      packages/tldraw/src/components/tldraw/tldraw.tsx
  32. 8
    6
      packages/tldraw/src/components/tools-panel/back-to-content.tsx
  33. 7
    7
      packages/tldraw/src/components/tools-panel/status-bar.tsx
  34. 41
    35
      packages/tldraw/src/components/tools-panel/styled.tsx
  35. 23
    23
      packages/tldraw/src/components/tools-panel/tools-panel.tsx
  36. 3
    3
      packages/tldraw/src/components/tools-panel/undo-redo.tsx
  37. 3
    3
      packages/tldraw/src/components/tools-panel/zoom.tsx
  38. 7
    9
      packages/tldraw/src/shape/shapes/text/text.tsx
  39. 2
    2
      packages/tldraw/src/styles/index.ts
  40. 4
    4
      packages/tldraw/src/styles/stitches.config.ts
  41. 1
    3
      packages/vec/package.json
  42. 1
    1
      packages/www/package.json
  43. 24
    22
      packages/www/pages/sponsorware.tsx
  44. 3
    3
      packages/www/styles/index.ts
  45. 4
    4
      packages/www/styles/stitches.config.ts
  46. 0
    21325
      tsconfig.tsbuildinfo
  47. 171
    150
      yarn.lock

+ 2
- 4
package.json View File

@@ -39,8 +39,8 @@
39 39
     "@testing-library/react": "^12.0.0",
40 40
     "@types/jest": "^27.0.1",
41 41
     "@types/node": "^15.0.1",
42
-    "@types/react": "^17.0.19",
43
-    "@types/react-dom": "^17.0.9",
42
+    "@types/react": "^16.9.55",
43
+    "@types/react-dom": "^16.9.9",
44 44
     "@typescript-eslint/eslint-plugin": "^4.19.0",
45 45
     "@typescript-eslint/parser": "^4.19.0",
46 46
     "babel-jest": "^27.1.0",
@@ -49,8 +49,6 @@
49 49
     "init-package-json": "^2.0.4",
50 50
     "jest": "^27.1.0",
51 51
     "lerna": "^3.22.1",
52
-    "react": "^17.0.2",
53
-    "react-dom": "^17.0.2",
54 52
     "resize-observer-polyfill": "^1.5.1",
55 53
     "ts-jest": "^27.0.5",
56 54
     "tslib": "^2.3.0",

+ 5
- 5
packages/core/package.json View File

@@ -37,8 +37,8 @@
37 37
     "@herbcaudill/tscpaths": "^0.0.17",
38 38
     "@types/jest": "^27.0.1",
39 39
     "@types/node": "^16.7.10",
40
-    "@types/react": "^17.0.16",
41
-    "@types/react-dom": "^17.0.9",
40
+    "@types/react": "^16.9.55",
41
+    "@types/react-dom": "^16.9.9",
42 42
     "@typescript-eslint/eslint-plugin": "^4.30.0",
43 43
     "@typescript-eslint/parser": "^4.30.0",
44 44
     "esbuild": "^0.12.24",
@@ -53,8 +53,8 @@
53 53
     "typescript": "^4.4.2"
54 54
   },
55 55
   "peerDependencies": {
56
-    "react": "^17.0.2",
57
-    "react-dom": "^17.0.2"
56
+    "react": ">=16.8",
57
+    "react-dom": "^16.8 || ^17.0"
58 58
   },
59 59
   "dependencies": {
60 60
     "@tldraw/intersect": "^0.0.95",
@@ -62,4 +62,4 @@
62 62
     "@use-gesture/react": "^10.0.0-beta.24"
63 63
   },
64 64
   "gitHead": "5cb031ddc264846ec6732d7179511cddea8ef034"
65
-}
65
+}

+ 3
- 2
packages/core/src/types.ts View File

@@ -3,10 +3,11 @@
3 3
 /* --------------------- Primary -------------------- */
4 4
 
5 5
 import type React from 'react'
6
-import type { ForwardedRef } from 'react'
7 6
 
8 7
 export type Patch<T> = Partial<{ [P in keyof T]: T | Partial<T> | Patch<T[P]> }>
9 8
 
9
+type ForwardedRef<T> = ((instance: T | null) => void) | React.MutableRefObject<T | null> | null
10
+
10 11
 export interface TLPage<T extends TLShape, B extends TLBinding> {
11 12
   id: string
12 13
   name?: string
@@ -296,7 +297,7 @@ export type TLShapeUtil<
296 297
   Component(
297 298
     this: TLShapeUtil<T, E, M>,
298 299
     props: TLRenderInfo<T, E, M>,
299
-    ref: React.ForwardedRef<E>
300
+    ref: ForwardedRef<E>
300 301
   ): React.ReactElement<TLRenderInfo<T, E, M>, E['tagName']>
301 302
 
302 303
   Indicator(

+ 6
- 6
packages/dev/package.json View File

@@ -21,15 +21,15 @@
21 21
   "dependencies": {
22 22
     "@tldraw/tldraw": "^0.0.95",
23 23
     "idb": "^6.1.2",
24
-    "react": "^17.0.2",
25
-    "react-dom": "^17.0.2",
26 24
     "react-router": "^5.2.1",
27
-    "react-router-dom": "^5.3.0"
25
+    "react-router-dom": "^5.3.0",
26
+    "react": ">=16.8",
27
+    "react-dom": "^16.8 || ^17.0"
28 28
   },
29 29
   "devDependencies": {
30 30
     "@types/node": "^14.14.35",
31
-    "@types/react": "^17.0.3",
32
-    "@types/react-dom": "^17.0.2",
31
+    "@types/react": "^16.9.55",
32
+    "@types/react-dom": "^16.9.9",
33 33
     "@types/react-router-dom": "^5.1.8",
34 34
     "concurrently": "6.0.1",
35 35
     "create-serve": "1.0.1",
@@ -38,4 +38,4 @@
38 38
     "typescript": "4.2.3"
39 39
   },
40 40
   "gitHead": "a7dac0f83ad998e205c2aab58182cb4ba4e099a6"
41
-}
41
+}

+ 1
- 3
packages/intersect/package.json View File

@@ -42,8 +42,6 @@
42 42
     "esbuild": "^0.12.24",
43 43
     "eslint": "^7.32.0",
44 44
     "lerna": "^4.0.0",
45
-    "react": "^17.0.2",
46
-    "react-dom": "^17.0.2",
47 45
     "ts-node": "^10.2.1",
48 46
     "tslib": "^2.3.1",
49 47
     "typedoc": "^0.22.3",
@@ -53,4 +51,4 @@
53 51
     "@tldraw/vec": "^0.0.95"
54 52
   },
55 53
   "gitHead": "5cb031ddc264846ec6732d7179511cddea8ef034"
56
-}
54
+}

+ 6
- 7
packages/tldraw/package.json View File

@@ -36,15 +36,13 @@
36 36
     "@babel/preset-env": "^7.15.4",
37 37
     "@types/jest": "^27.0.1",
38 38
     "@types/node": "^16.7.10",
39
-    "@types/react": "^17.0.16",
40
-    "@types/react-dom": "^17.0.9",
39
+    "@types/react": "^16.9.55",
40
+    "@types/react-dom": "^16.9.9",
41 41
     "@typescript-eslint/eslint-plugin": "^4.30.0",
42 42
     "@typescript-eslint/parser": "^4.30.0",
43 43
     "esbuild": "^0.12.24",
44 44
     "eslint": "^7.32.0",
45 45
     "lerna": "^4.0.0",
46
-    "react": "^17.0.2",
47
-    "react-dom": "^17.0.2",
48 46
     "ts-node": "^10.2.1",
49 47
     "tsconfig-replace-paths": "^0.0.5",
50 48
     "tslib": "^2.3.1",
@@ -52,8 +50,8 @@
52 50
     "typescript": "^4.4.2"
53 51
   },
54 52
   "peerDependencies": {
55
-    "react": "^17.0.2",
56
-    "react-dom": "^17.0.2"
53
+    "react": ">=16.8",
54
+    "react-dom": "^16.8 || ^17.0"
57 55
   },
58 56
   "dependencies": {
59 57
     "@radix-ui/react-alert-dialog": "^0.0.20",
@@ -64,6 +62,7 @@
64 62
     "@radix-ui/react-id": "^0.0.6",
65 63
     "@radix-ui/react-radio-group": "^0.0.18",
66 64
     "@radix-ui/react-tooltip": "^0.0.20",
65
+    "@stitches/core": "^1.2.0",
67 66
     "@stitches/react": "^1.0.0",
68 67
     "@tldraw/core": "^0.0.95",
69 68
     "@tldraw/intersect": "^0.0.95",
@@ -73,4 +72,4 @@
73 72
     "rko": "^0.5.25"
74 73
   },
75 74
   "gitHead": "5cb031ddc264846ec6732d7179511cddea8ef034"
76
-}
75
+}

+ 35
- 36
packages/tldraw/src/components/context-menu/context-menu.tsx View File

@@ -1,21 +1,21 @@
1 1
 import * as React from 'react'
2
-import styled from '~styles'
2
+import css from '~styles'
3 3
 import { Utils } from '@tldraw/core'
4 4
 import * as RadixContextMenu from '@radix-ui/react-context-menu'
5 5
 import { useTLDrawContext } from '~hooks'
6 6
 import { Data, AlignType, DistributeType, StretchType } from '~types'
7 7
 import {
8
-  Kbd,
9
-  IconWrapper,
8
+  kbd,
9
+  iconWrapper,
10 10
   breakpoints,
11
-  RowButton,
11
+  rowButton,
12 12
   ContextMenuArrow,
13 13
   ContextMenuDivider,
14 14
   ContextMenuButton,
15 15
   ContextMenuSubMenu,
16 16
   ContextMenuIconButton,
17 17
   ContextMenuRoot,
18
-  MenuContent,
18
+  menuContent,
19 19
 } from '../shared'
20 20
 import {
21 21
   ChevronRightIcon,
@@ -128,20 +128,20 @@ export const ContextMenu = React.memo(({ children }: ContextMenuProps): JSX.Elem
128 128
   return (
129 129
     <ContextMenuRoot>
130 130
       <RadixContextMenu.Trigger>{children}</RadixContextMenu.Trigger>
131
-      <MenuContent as={RadixContextMenu.Content} ref={rContent}>
131
+      <RadixContextMenu.Content className={menuContent()} ref={rContent}>
132 132
         {hasSelection ? (
133 133
           <>
134 134
             <ContextMenuButton onSelect={handleFlipHorizontal}>
135 135
               <span>Flip Horizontal</span>
136
-              <Kbd variant="menu">⇧H</Kbd>
136
+              <kbd className={kbd({ variant: 'menu' })}>⇧H</kbd>
137 137
             </ContextMenuButton>
138 138
             <ContextMenuButton onSelect={handleFlipVertical}>
139 139
               <span>Flip Vertical</span>
140
-              <Kbd variant="menu">⇧V</Kbd>
140
+              <kbd className={kbd({ variant: 'menu' })}>⇧V</kbd>
141 141
             </ContextMenuButton>
142 142
             <ContextMenuButton onSelect={handleDuplicate}>
143 143
               <span>Duplicate</span>
144
-              <Kbd variant="menu">#D</Kbd>
144
+              <kbd className={kbd({ variant: 'menu' })}>#D</kbd>
145 145
             </ContextMenuButton>
146 146
             <ContextMenuDivider />
147 147
             {hasGroupSelected ||
@@ -150,13 +150,13 @@ export const ContextMenu = React.memo(({ children }: ContextMenuProps): JSX.Elem
150 150
                   {hasGroupSelected && (
151 151
                     <ContextMenuButton onSelect={handleGroup}>
152 152
                       <span>Ungroup</span>
153
-                      <Kbd variant="menu">#⇧G</Kbd>
153
+                      <kbd className={kbd({ variant: 'menu' })}>#⇧G</kbd>
154 154
                     </ContextMenuButton>
155 155
                   )}
156 156
                   {hasTwoOrMore && (
157 157
                     <ContextMenuButton onSelect={handleGroup}>
158 158
                       <span>Group</span>
159
-                      <Kbd variant="menu">#G</Kbd>
159
+                      <kbd className={kbd({ variant: 'menu' })}>#G</kbd>
160 160
                     </ContextMenuButton>
161 161
                   )}
162 162
                 </>
@@ -164,19 +164,19 @@ export const ContextMenu = React.memo(({ children }: ContextMenuProps): JSX.Elem
164 164
             <ContextMenuSubMenu label="Move">
165 165
               <ContextMenuButton onSelect={handleMoveToFront}>
166 166
                 <span>To Front</span>
167
-                <Kbd variant="menu">#⇧]</Kbd>
167
+                <kbd className={kbd({ variant: 'menu' })}>#⇧]</kbd>
168 168
               </ContextMenuButton>
169 169
               <ContextMenuButton onSelect={handleMoveForward}>
170 170
                 <span>Forward</span>
171
-                <Kbd variant="menu">#]</Kbd>
171
+                <kbd className={kbd({ variant: 'menu' })}>#]</kbd>
172 172
               </ContextMenuButton>
173 173
               <ContextMenuButton onSelect={handleMoveBackward}>
174 174
                 <span>Backward</span>
175
-                <Kbd variant="menu">#[</Kbd>
175
+                <kbd className={kbd({ variant: 'menu' })}>#[</kbd>
176 176
               </ContextMenuButton>
177 177
               <ContextMenuButton onSelect={handleMoveToBack}>
178 178
                 <span>To Back</span>
179
-                <Kbd variant="menu">#⇧[</Kbd>
179
+                <kbd className={kbd({ variant: 'menu' })}>#⇧[</kbd>
180 180
               </ContextMenuButton>
181 181
             </ContextMenuSubMenu>
182 182
             <MoveToPageMenu />
@@ -186,11 +186,11 @@ export const ContextMenu = React.memo(({ children }: ContextMenuProps): JSX.Elem
186 186
             <ContextMenuDivider />
187 187
             <ContextMenuButton onSelect={handleCopy}>
188 188
               <span>Copy</span>
189
-              <Kbd variant="menu">#C</Kbd>
189
+              <kbd className={kbd({ variant: 'menu' })}>#C</kbd>
190 190
             </ContextMenuButton>
191 191
             <ContextMenuButton onSelect={handleCopySvg}>
192 192
               <span>Copy to SVG</span>
193
-              <Kbd variant="menu">⇧#C</Kbd>
193
+              <kbd className={kbd({ variant: 'menu' })}>⇧#C</kbd>
194 194
             </ContextMenuButton>
195 195
             {isDebugMode && (
196 196
               <ContextMenuButton onSelect={handleCopyJson}>
@@ -199,31 +199,31 @@ export const ContextMenu = React.memo(({ children }: ContextMenuProps): JSX.Elem
199 199
             )}
200 200
             <ContextMenuButton onSelect={handlePaste}>
201 201
               <span>Paste</span>
202
-              <Kbd variant="menu">#V</Kbd>
202
+              <kbd className={kbd({ variant: 'menu' })}>#V</kbd>
203 203
             </ContextMenuButton>
204 204
             <ContextMenuDivider />
205 205
             <ContextMenuButton onSelect={handleDelete}>
206 206
               <span>Delete</span>
207
-              <Kbd variant="menu">⌫</Kbd>
207
+              <kbd className={kbd({ variant: 'menu' })}>⌫</kbd>
208 208
             </ContextMenuButton>
209 209
           </>
210 210
         ) : (
211 211
           <>
212 212
             <ContextMenuButton onSelect={handlePaste}>
213 213
               <span>Paste</span>
214
-              <Kbd variant="menu">#V</Kbd>
214
+              <kbd className={kbd({ variant: 'menu' })}>#V</kbd>
215 215
             </ContextMenuButton>
216 216
             <ContextMenuButton onSelect={handleUndo}>
217 217
               <span>Undo</span>
218
-              <Kbd variant="menu">#Z</Kbd>
218
+              <kbd className={kbd({ variant: 'menu' })}>#Z</kbd>
219 219
             </ContextMenuButton>
220 220
             <ContextMenuButton onSelect={handleRedo}>
221 221
               <span>Redo</span>
222
-              <Kbd variant="menu">#⇧Z</Kbd>
222
+              <kbd className={kbd({ variant: 'menu' })}>#⇧Z</kbd>
223 223
             </ContextMenuButton>
224 224
           </>
225 225
         )}
226
-      </MenuContent>
226
+      </RadixContextMenu.Content>
227 227
     </ContextMenuRoot>
228 228
   )
229 229
 })
@@ -278,17 +278,16 @@ function AlignDistributeSubMenu({
278 278
 
279 279
   return (
280 280
     <ContextMenuRoot>
281
-      <RadixContextMenu.TriggerItem as={RowButton} bp={breakpoints}>
281
+      <RadixContextMenu.TriggerItem className={rowButton({ bp: breakpoints })}>
282 282
         <span>Align / Distribute</span>
283
-        <IconWrapper size="small">
283
+        <div className={iconWrapper({ size: 'small' })}>
284 284
           <ChevronRightIcon />
285
-        </IconWrapper>
285
+        </div>
286 286
       </RadixContextMenu.TriggerItem>
287
-      <StyledGrid
288
-        as={RadixContextMenu.Content}
287
+      <RadixContextMenu.Content
288
+        className={grid({ selectedStyle: hasThreeOrMore ? 'threeOrMore' : 'twoOrMore' })}
289 289
         sideOffset={2}
290 290
         alignOffset={-2}
291
-        selectedStyle={hasThreeOrMore ? 'threeOrMore' : 'twoOrMore'}
292 291
       >
293 292
         <ContextMenuIconButton onSelect={alignLeft}>
294 293
           <AlignLeftIcon />
@@ -326,12 +325,12 @@ function AlignDistributeSubMenu({
326 325
           </ContextMenuIconButton>
327 326
         )}
328 327
         <ContextMenuArrow offset={13} />
329
-      </StyledGrid>
328
+      </RadixContextMenu.Content>
330 329
     </ContextMenuRoot>
331 330
   )
332 331
 }
333 332
 
334
-const StyledGrid = styled(MenuContent, {
333
+const grid = css(menuContent, {
335 334
   display: 'grid',
336 335
   variants: {
337 336
     selectedStyle: {
@@ -361,13 +360,13 @@ function MoveToPageMenu(): JSX.Element | null {
361 360
 
362 361
   return (
363 362
     <ContextMenuRoot>
364
-      <RadixContextMenu.TriggerItem as={RowButton} bp={breakpoints}>
363
+      <RadixContextMenu.TriggerItem className={rowButton({ bp: breakpoints })}>
365 364
         <span>Move To Page</span>
366
-        <IconWrapper size="small">
365
+        <div className={iconWrapper({ size: 'small' })}>
367 366
           <ChevronRightIcon />
368
-        </IconWrapper>
367
+        </div>
369 368
       </RadixContextMenu.TriggerItem>
370
-      <MenuContent as={RadixContextMenu.Content} sideOffset={2} alignOffset={-2}>
369
+      <RadixContextMenu.Content className={menuContent()} sideOffset={2} alignOffset={-2}>
371 370
         {sorted.map(({ id, name }, i) => (
372 371
           <ContextMenuButton
373 372
             key={id}
@@ -378,7 +377,7 @@ function MoveToPageMenu(): JSX.Element | null {
378 377
           </ContextMenuButton>
379 378
         ))}
380 379
         <ContextMenuArrow offset={13} />
381
-      </MenuContent>
380
+      </RadixContextMenu.Content>
382 381
     </ContextMenuRoot>
383 382
   )
384 383
 }

+ 15
- 15
packages/tldraw/src/components/menu/menu.tsx View File

@@ -2,16 +2,16 @@ import * as React from 'react'
2 2
 import { ExitIcon, HamburgerMenuIcon } from '@radix-ui/react-icons'
3 3
 import * as DropdownMenu from '@radix-ui/react-dropdown-menu'
4 4
 import {
5
-  FloatingContainer,
5
+  floatingContainer,
6 6
   DropdownMenuRoot,
7
-  MenuContent,
8
-  IconButton,
7
+  menuContent,
8
+  iconButton,
9 9
   breakpoints,
10 10
   DropdownMenuButton,
11 11
   DropdownMenuSubMenu,
12 12
   DropdownMenuDivider,
13
-  IconWrapper,
14
-  Kbd,
13
+  iconWrapper,
14
+  kbd,
15 15
 } from '~components/shared'
16 16
 import { useTLDrawContext } from '~hooks'
17 17
 import { Preferences } from './preferences'
@@ -38,43 +38,43 @@ export const Menu = React.memo(() => {
38 38
   }, [tlstate])
39 39
 
40 40
   return (
41
-    <FloatingContainer>
41
+    <div className={floatingContainer()}>
42 42
       <DropdownMenuRoot>
43
-        <DropdownMenu.Trigger as={IconButton} bp={breakpoints}>
43
+        <DropdownMenu.Trigger className={iconButton({ bp: breakpoints })}>
44 44
           <HamburgerMenuIcon />
45 45
         </DropdownMenu.Trigger>
46
-        <DropdownMenu.Content as={MenuContent} sideOffset={8} align="end">
46
+        <DropdownMenu.Content className={menuContent()} sideOffset={8} align="end">
47 47
           <DropdownMenuButton onSelect={handleNew}>
48 48
             <span>New Project</span>
49
-            <Kbd variant="menu">#N</Kbd>
49
+            <kbd className={kbd({ variant: 'menu' })}>#N</kbd>
50 50
           </DropdownMenuButton>
51 51
           <DropdownMenuDivider />
52 52
           <DropdownMenuButton disabled onSelect={handleLoad}>
53 53
             <span>Open...</span>
54
-            <Kbd variant="menu">#L</Kbd>
54
+            <kbd className={kbd({ variant: 'menu' })}>#L</kbd>
55 55
           </DropdownMenuButton>
56 56
           <RecentFiles />
57 57
           <DropdownMenuDivider />
58 58
           <DropdownMenuButton disabled onSelect={handleSave}>
59 59
             <span>Save</span>
60
-            <Kbd variant="menu">#S</Kbd>
60
+            <kbd className={kbd({ variant: 'menu' })}>#S</kbd>
61 61
           </DropdownMenuButton>
62 62
           <DropdownMenuButton disabled onSelect={handleSave}>
63 63
             <span>Save As...</span>
64
-            <Kbd variant="menu">⇧#S</Kbd>
64
+            <kbd className={kbd({ variant: 'menu' })}>⇧#S</kbd>
65 65
           </DropdownMenuButton>
66 66
           <DropdownMenuDivider />
67 67
           <Preferences />
68 68
           <DropdownMenuDivider />
69 69
           <DropdownMenuButton disabled onSelect={handleSignOut}>
70 70
             <span>Sign Out</span>
71
-            <IconWrapper size="small">
71
+            <div className={iconWrapper({ size: 'small' })}>
72 72
               <ExitIcon />
73
-            </IconWrapper>
73
+            </div>
74 74
           </DropdownMenuButton>
75 75
         </DropdownMenu.Content>
76 76
       </DropdownMenuRoot>
77
-    </FloatingContainer>
77
+    </div>
78 78
   )
79 79
 })
80 80
 

+ 17
- 17
packages/tldraw/src/components/page-options-dialog/page-options-dialog.tsx View File

@@ -3,11 +3,11 @@ import * as Dialog from '@radix-ui/react-alert-dialog'
3 3
 import { MixerVerticalIcon } from '@radix-ui/react-icons'
4 4
 import {
5 5
   breakpoints,
6
-  IconButton,
7
-  DialogOverlay,
8
-  DialogContent,
9
-  RowButton,
10
-  Divider,
6
+  iconButton,
7
+  dialogOverlay,
8
+  dialogContent,
9
+  rowButton,
10
+  divider,
11 11
 } from '~components/shared'
12 12
 import type { Data, TLDrawPage } from '~types'
13 13
 import { useTLDrawContext } from '~hooks'
@@ -76,30 +76,30 @@ export function PageOptionsDialog({ page, onOpen, onClose }: PageOptionsDialogPr
76 76
 
77 77
   return (
78 78
     <Dialog.Root open={isOpen} onOpenChange={handleOpenChange}>
79
-      <Dialog.Trigger as={IconButton} bp={breakpoints} size="small" data-shy="true">
79
+      <Dialog.Trigger className={iconButton({ bp: breakpoints, size: 'small' })} data-shy="true">
80 80
         <MixerVerticalIcon />
81 81
       </Dialog.Trigger>
82
-      <Dialog.Overlay as={DialogOverlay} />
83
-      <Dialog.Content as={DialogContent} onKeyDown={stopPropagation} onKeyUp={stopPropagation}>
84
-        <Dialog.Action as={RowButton} bp={breakpoints} onClick={handleRename}>
82
+      <Dialog.Overlay className={dialogOverlay()} />
83
+      <Dialog.Content
84
+        className={dialogContent()}
85
+        onKeyDown={stopPropagation}
86
+        onKeyUp={stopPropagation}
87
+      >
88
+        <Dialog.Action className={rowButton({ bp: breakpoints })} onClick={handleRename}>
85 89
           Rename
86 90
         </Dialog.Action>
87
-        <Dialog.Action as={RowButton} bp={breakpoints} onClick={handleDuplicate}>
91
+        <Dialog.Action className={rowButton({ bp: breakpoints })} onClick={handleDuplicate}>
88 92
           Duplicate
89 93
         </Dialog.Action>
90 94
         <Dialog.Action
91
-          as={RowButton}
92
-          bp={breakpoints}
95
+          className={rowButton({ bp: breakpoints, warn: true })}
93 96
           disabled={!canDelete}
94 97
           onClick={handleDelete}
95
-          warn={true}
96 98
         >
97 99
           Delete
98 100
         </Dialog.Action>
99
-        <Divider />
100
-        <Dialog.Cancel as={RowButton} bp={breakpoints}>
101
-          Cancel
102
-        </Dialog.Cancel>
101
+        <div className={divider()} />
102
+        <Dialog.Cancel className={rowButton({ bp: breakpoints })}>Cancel</Dialog.Cancel>
103 103
       </Dialog.Content>
104 104
     </Dialog.Root>
105 105
   )

+ 19
- 21
packages/tldraw/src/components/page-panel/page-panel.tsx View File

@@ -5,13 +5,13 @@ import {
5 5
   breakpoints,
6 6
   DropdownMenuButton,
7 7
   DropdownMenuDivider,
8
-  RowButton,
9
-  MenuContent,
10
-  FloatingContainer,
11
-  IconWrapper,
8
+  rowButton,
9
+  menuContent,
10
+  floatingContainer,
11
+  iconWrapper,
12 12
 } from '~components/shared'
13 13
 import { PageOptionsDialog } from '~components/page-options-dialog'
14
-import styled from '~styles'
14
+import css from '~styles'
15 15
 import { useTLDrawContext } from '~hooks'
16 16
 import type { Data } from '~types'
17 17
 
@@ -51,14 +51,14 @@ export function PagePanel(): JSX.Element {
51 51
 
52 52
   return (
53 53
     <DropdownMenu.Root dir="ltr" open={isOpen} onOpenChange={handleOpenChange}>
54
-      <FloatingContainer>
55
-        <RowButton as={DropdownMenu.Trigger} bp={breakpoints} variant="noIcon">
54
+      <div className={floatingContainer()}>
55
+        <DropdownMenu.Trigger className={rowButton({ bp: breakpoints, variant: 'noIcon' })}>
56 56
           <span>{currentPageName || 'Page'}</span>
57
-        </RowButton>
58
-      </FloatingContainer>
59
-      <MenuContent as={DropdownMenu.Content} sideOffset={8} align="start">
57
+        </DropdownMenu.Trigger>
58
+      </div>
59
+      <DropdownMenu.Content className={menuContent()} sideOffset={8} align="start">
60 60
         {isOpen && <PageMenuContent onClose={handleClose} />}
61
-      </MenuContent>
61
+      </DropdownMenu.Content>
62 62
     </DropdownMenu.Root>
63 63
   )
64 64
 }
@@ -86,36 +86,34 @@ function PageMenuContent({ onClose }: { onClose: () => void }) {
86 86
     <>
87 87
       <DropdownMenu.RadioGroup value={currentPageId} onValueChange={handleChangePage}>
88 88
         {sortedPages.map((page) => (
89
-          <ButtonWithOptions key={page.id}>
89
+          <div className={buttonWithOptions()} key={page.id}>
90 90
             <DropdownMenu.RadioItem
91
-              as={RowButton}
92
-              bp={breakpoints}
91
+              className={rowButton({ bp: breakpoints, variant: 'pageButton' })}
93 92
               value={page.id}
94
-              variant="pageButton"
95 93
             >
96 94
               <span>{page.name || 'Page'}</span>
97 95
               <DropdownMenu.ItemIndicator>
98
-                <IconWrapper size="small">
96
+                <div className={iconWrapper({ size: 'small' })}>
99 97
                   <CheckIcon />
100
-                </IconWrapper>
98
+                </div>
101 99
               </DropdownMenu.ItemIndicator>
102 100
             </DropdownMenu.RadioItem>
103 101
             <PageOptionsDialog page={page} onClose={onClose} />
104
-          </ButtonWithOptions>
102
+          </div>
105 103
         ))}
106 104
       </DropdownMenu.RadioGroup>
107 105
       <DropdownMenuDivider />
108 106
       <DropdownMenuButton onSelect={handleCreatePage}>
109 107
         <span>Create Page</span>
110
-        <IconWrapper size="small">
108
+        <div className={iconWrapper({ size: 'small' })}>
111 109
           <PlusIcon />
112
-        </IconWrapper>
110
+        </div>
113 111
       </DropdownMenuButton>
114 112
     </>
115 113
   )
116 114
 }
117 115
 
118
-const ButtonWithOptions = styled('div', {
116
+const buttonWithOptions = css({
119 117
   display: 'grid',
120 118
   gridTemplateColumns: '1fr auto',
121 119
   gridAutoFlow: 'column',

+ 2
- 2
packages/tldraw/src/components/shared/buttons-row.tsx View File

@@ -1,10 +1,10 @@
1
-import styled from '~styles'
1
+import css from '~styles'
2 2
 
3 3
 /* -------------------------------------------------- */
4 4
 /*                     Buttons Row                    */
5 5
 /* -------------------------------------------------- */
6 6
 
7
-export const ButtonsRow = styled('div', {
7
+export const buttonsRow = css({
8 8
   position: 'relative',
9 9
   display: 'flex',
10 10
   width: '100%',

+ 39
- 18
packages/tldraw/src/components/shared/context-menu.tsx View File

@@ -11,11 +11,11 @@ import {
11 11
   CheckboxItem as CMCheckboxItem,
12 12
 } from '@radix-ui/react-context-menu'
13 13
 import { breakpoints } from './breakpoints'
14
-import { RowButton } from './row-button'
15
-import { IconButton } from './icon-button'
16
-import { IconWrapper } from './icon-wrapper'
17
-import { MenuContent } from './menu'
18
-import styled from '~styles'
14
+import { rowButton } from './row-button'
15
+import { iconButton } from './icon-button'
16
+import { iconWrapper } from './icon-wrapper'
17
+import { menuContent } from './menu'
18
+import css from '~styles'
19 19
 
20 20
 /* -------------------------------------------------- */
21 21
 /*                    Context Menu                   */
@@ -42,13 +42,13 @@ export interface ContextMenuSubMenuProps {
42 42
 export function ContextMenuSubMenu({ children, label }: ContextMenuSubMenuProps): JSX.Element {
43 43
   return (
44 44
     <CMRoot dir="ltr">
45
-      <CMTriggerItem as={RowButton} bp={breakpoints}>
45
+      <CMTriggerItem className={rowButton({ bp: breakpoints })}>
46 46
         <span>{label}</span>
47
-        <IconWrapper size="small">
47
+        <div className={iconWrapper({ size: 'small' })}>
48 48
           <ChevronRightIcon />
49
-        </IconWrapper>
49
+        </div>
50 50
       </CMTriggerItem>
51
-      <CMContent as={MenuContent} sideOffset={2} alignOffset={-2}>
51
+      <CMContent className={menuContent()} sideOffset={2} alignOffset={-2}>
52 52
         {children}
53 53
         <ContextMenuArrow offset={13} />
54 54
       </CMContent>
@@ -56,16 +56,38 @@ export function ContextMenuSubMenu({ children, label }: ContextMenuSubMenuProps)
56 56
   )
57 57
 }
58 58
 
59
-export const ContextMenuDivider = styled(CMSeparator, {
59
+const contextMenuDivider = css({
60 60
   backgroundColor: '$hover',
61 61
   height: 1,
62 62
   margin: '$2 -$2',
63 63
 })
64 64
 
65
-export const ContextMenuArrow = styled(CMArrow, {
65
+export const ContextMenuDivider = React.forwardRef<
66
+  React.ElementRef<typeof CMSeparator>,
67
+  React.ComponentProps<typeof CMSeparator>
68
+>((props, forwardedRef) => (
69
+  <CMSeparator
70
+    {...props}
71
+    ref={forwardedRef}
72
+    className={contextMenuDivider({ className: props.className })}
73
+  />
74
+))
75
+
76
+const contextMenuArrow = css({
66 77
   fill: '$panel',
67 78
 })
68 79
 
80
+export const ContextMenuArrow = React.forwardRef<
81
+  React.ElementRef<typeof CMArrow>,
82
+  React.ComponentProps<typeof CMArrow>
83
+>((props, forwardedRef) => (
84
+  <CMArrow
85
+    {...props}
86
+    ref={forwardedRef}
87
+    className={contextMenuArrow({ className: props.className })}
88
+  />
89
+))
90
+
69 91
 export interface ContextMenuButtonProps {
70 92
   onSelect?: () => void
71 93
   disabled?: boolean
@@ -78,9 +100,9 @@ export function ContextMenuButton({
78 100
   disabled = false,
79 101
 }: ContextMenuButtonProps): JSX.Element {
80 102
   return (
81
-    <RowButton as={CMItem} bp={breakpoints} disabled={disabled} onSelect={onSelect}>
103
+    <CMItem className={rowButton({ bp: breakpoints })} disabled={disabled} onSelect={onSelect}>
82 104
       {children}
83
-    </RowButton>
105
+    </CMItem>
84 106
   )
85 107
 }
86 108
 
@@ -96,7 +118,7 @@ export function ContextMenuIconButton({
96 118
   disabled = false,
97 119
 }: ContextMenuIconButtonProps): JSX.Element {
98 120
   return (
99
-    <CMItem as={IconButton} bp={breakpoints} disabled={disabled} onSelect={onSelect}>
121
+    <CMItem className={iconButton({ bp: breakpoints })} disabled={disabled} onSelect={onSelect}>
100 122
       {children}
101 123
     </CMItem>
102 124
   )
@@ -117,17 +139,16 @@ export function ContextMenuCheckboxItem({
117 139
 }: ContextMenuCheckboxItemProps): JSX.Element {
118 140
   return (
119 141
     <CMCheckboxItem
120
-      as={RowButton}
121
-      bp={breakpoints}
142
+      className={rowButton({ bp: breakpoints })}
122 143
       onCheckedChange={onCheckedChange}
123 144
       checked={checked}
124 145
       disabled={disabled}
125 146
     >
126 147
       {children}
127 148
       <CMItemIndicator>
128
-        <IconWrapper size="small">
149
+        <div className={iconWrapper({ size: 'small' })}>
129 150
           <CheckIcon />
130
-        </IconWrapper>
151
+        </div>
131 152
       </CMItemIndicator>
132 153
     </CMCheckboxItem>
133 154
   )

+ 5
- 5
packages/tldraw/src/components/shared/dialog.tsx View File

@@ -1,10 +1,10 @@
1
-import styled from '~styles'
1
+import css from '~styles'
2 2
 
3 3
 /* -------------------------------------------------- */
4 4
 /*                       Dialog                       */
5 5
 /* -------------------------------------------------- */
6 6
 
7
-export const DialogContent = styled('div', {
7
+export const dialogContent = css({
8 8
   position: 'absolute',
9 9
   top: '50%',
10 10
   left: '50%',
@@ -26,7 +26,7 @@ export const DialogContent = styled('div', {
26 26
   },
27 27
 })
28 28
 
29
-export const DialogOverlay = styled('div', {
29
+export const dialogOverlay = css({
30 30
   backgroundColor: 'rgba(0, 0, 0, .15)',
31 31
   position: 'fixed',
32 32
   top: 0,
@@ -35,11 +35,11 @@ export const DialogOverlay = styled('div', {
35 35
   left: 0,
36 36
 })
37 37
 
38
-export const DialogInputWrapper = styled('div', {
38
+export const dialogInputWrapper = css({
39 39
   padding: '$4 $2',
40 40
 })
41 41
 
42
-export const DialogTitleRow = styled('div', {
42
+export const dialogTitleRow = css({
43 43
   display: 'flex',
44 44
   padding: '0 0 0 $4',
45 45
   alignItems: 'center',

+ 39
- 18
packages/tldraw/src/components/shared/dropdown-menu.tsx View File

@@ -14,12 +14,12 @@ import {
14 14
 
15 15
 import { Tooltip } from './tooltip'
16 16
 import { breakpoints } from './breakpoints'
17
-import { RowButton } from './row-button'
18
-import { IconButton } from './icon-button'
19
-import { IconWrapper } from './icon-wrapper'
20
-import { MenuContent } from './menu'
17
+import { rowButton } from './row-button'
18
+import { iconButton } from './icon-button'
19
+import { iconWrapper } from './icon-wrapper'
20
+import { menuContent } from './menu'
21 21
 
22
-import styled from '~styles'
22
+import css from '~styles'
23 23
 
24 24
 /* -------------------------------------------------- */
25 25
 /*                    Dropdown Menu                   */
@@ -56,13 +56,13 @@ export function DropdownMenuSubMenu({
56 56
 }: DropdownMenuSubMenuProps): JSX.Element {
57 57
   return (
58 58
     <DMRoot dir="ltr">
59
-      <DMTriggerItem as={RowButton} bp={breakpoints} disabled={disabled}>
59
+      <DMTriggerItem className={rowButton({ bp: breakpoints })} disabled={disabled}>
60 60
         <span>{label}</span>
61
-        <IconWrapper size="small">
61
+        <div className={iconWrapper({ size: 'small' })}>
62 62
           <ChevronRightIcon />
63
-        </IconWrapper>
63
+        </div>
64 64
       </DMTriggerItem>
65
-      <DMContent as={MenuContent} sideOffset={2} alignOffset={-2}>
65
+      <DMContent className={menuContent()} sideOffset={2} alignOffset={-2}>
66 66
         {children}
67 67
         <DropdownMenuArrow offset={13} />
68 68
       </DMContent>
@@ -70,7 +70,7 @@ export function DropdownMenuSubMenu({
70 70
   )
71 71
 }
72 72
 
73
-export const DropdownMenuDivider = styled(DMSeparator, {
73
+export const dropdownMenuDivider = css({
74 74
   backgroundColor: '$hover',
75 75
   height: 1,
76 76
   marginTop: '$2',
@@ -79,10 +79,32 @@ export const DropdownMenuDivider = styled(DMSeparator, {
79 79
   marginLeft: '-$2',
80 80
 })
81 81
 
82
-export const DropdownMenuArrow = styled(DMArrow, {
82
+export const DropdownMenuDivider = React.forwardRef<
83
+  React.ElementRef<typeof DMSeparator>,
84
+  React.ComponentProps<typeof DMSeparator>
85
+>((props, forwardedRef) => (
86
+  <DMSeparator
87
+    {...props}
88
+    ref={forwardedRef}
89
+    className={dropdownMenuDivider({ className: props.className })}
90
+  />
91
+))
92
+
93
+export const dropdownMenuArrow = css({
83 94
   fill: '$panel',
84 95
 })
85 96
 
97
+export const DropdownMenuArrow = React.forwardRef<
98
+  React.ElementRef<typeof DMArrow>,
99
+  React.ComponentProps<typeof DMArrow>
100
+>((props, forwardedRef) => (
101
+  <DMArrow
102
+    {...props}
103
+    ref={forwardedRef}
104
+    className={dropdownMenuArrow({ className: props.className })}
105
+  />
106
+))
107
+
86 108
 export interface DropdownMenuButtonProps {
87 109
   onSelect?: () => void
88 110
   disabled?: boolean
@@ -95,7 +117,7 @@ export function DropdownMenuButton({
95 117
   disabled = false,
96 118
 }: DropdownMenuButtonProps): JSX.Element {
97 119
   return (
98
-    <DMItem as={RowButton} bp={breakpoints} disabled={disabled} onSelect={onSelect}>
120
+    <DMItem className={rowButton({ bp: breakpoints })} disabled={disabled} onSelect={onSelect}>
99 121
       {children}
100 122
     </DMItem>
101 123
   )
@@ -113,7 +135,7 @@ export function DropdownMenuIconButton({
113 135
   disabled = false,
114 136
 }: DropdownMenuIconButtonProps): JSX.Element {
115 137
   return (
116
-    <DMItem as={IconButton} bp={breakpoints} disabled={disabled} onSelect={onSelect}>
138
+    <DMItem className={iconButton({ bp: breakpoints })} disabled={disabled} onSelect={onSelect}>
117 139
       {children}
118 140
     </DMItem>
119 141
   )
@@ -133,7 +155,7 @@ export function DropdownMenuIconTriggerButton({
133 155
   disabled = false,
134 156
 }: DropdownMenuIconTriggerButtonProps): JSX.Element {
135 157
   return (
136
-    <DMTrigger as={IconButton} bp={breakpoints} disabled={disabled}>
158
+    <DMTrigger className={iconButton({ bp: breakpoints })} disabled={disabled}>
137 159
       <Tooltip label={label} kbd={kbd}>
138 160
         {children}
139 161
       </Tooltip>
@@ -156,17 +178,16 @@ export function DropdownMenuCheckboxItem({
156 178
 }: MenuCheckboxItemProps): JSX.Element {
157 179
   return (
158 180
     <DMCheckboxItem
159
-      as={RowButton}
160
-      bp={breakpoints}
181
+      className={rowButton({ bp: breakpoints })}
161 182
       onCheckedChange={onCheckedChange}
162 183
       checked={checked}
163 184
       disabled={disabled}
164 185
     >
165 186
       {children}
166 187
       <DMItemIndicator>
167
-        <IconWrapper size="small">
188
+        <div className={iconWrapper({ size: 'small' })}>
168 189
           <CheckIcon />
169
-        </IconWrapper>
190
+        </div>
170 191
       </DMItemIndicator>
171 192
     </DMCheckboxItem>
172 193
   )

+ 2
- 2
packages/tldraw/src/components/shared/floating-container.tsx View File

@@ -1,10 +1,10 @@
1
-import styled from '~styles'
1
+import css from '~styles'
2 2
 
3 3
 /* -------------------------------------------------- */
4 4
 /*                 Floating Container                 */
5 5
 /* -------------------------------------------------- */
6 6
 
7
-export const FloatingContainer = styled('div', {
7
+export const floatingContainer = css({
8 8
   backgroundColor: '$panel',
9 9
   border: '1px solid $panel',
10 10
   borderRadius: '4px',

+ 2
- 2
packages/tldraw/src/components/shared/icon-button.tsx View File

@@ -1,10 +1,10 @@
1
-import styled from '~styles'
1
+import css from '~styles'
2 2
 
3 3
 /* -------------------------------------------------- */
4 4
 /*                     Icon Button                    */
5 5
 /* -------------------------------------------------- */
6 6
 
7
-export const IconButton = styled('button', {
7
+export const iconButton = css({
8 8
   position: 'relative',
9 9
   height: '32px',
10 10
   width: '32px',

+ 2
- 2
packages/tldraw/src/components/shared/icon-wrapper.tsx View File

@@ -1,10 +1,10 @@
1
-import styled from '~styles'
1
+import css from '~styles'
2 2
 
3 3
 /* -------------------------------------------------- */
4 4
 /*                    Icon Wrapper                    */
5 5
 /* -------------------------------------------------- */
6 6
 
7
-export const IconWrapper = styled('div', {
7
+export const iconWrapper = css({
8 8
   height: '100%',
9 9
   borderRadius: '4px',
10 10
   marginRight: '1px',

+ 4
- 4
packages/tldraw/src/components/shared/kbd.tsx View File

@@ -1,5 +1,5 @@
1 1
 import * as React from 'react'
2
-import styled from '~styles'
2
+import css from '~styles'
3 3
 import { Utils } from '@tldraw/core'
4 4
 
5 5
 /* -------------------------------------------------- */
@@ -18,18 +18,18 @@ export function Kbd({
18 18
   children: string
19 19
 }): JSX.Element | null {
20 20
   return (
21
-    <StyledKbd variant={variant}>
21
+    <kbd className={kbd({ variant })}>
22 22
       {children
23 23
         .replaceAll('#', commandKey())
24 24
         .split('')
25 25
         .map((k, i) => (
26 26
           <span key={i}>{k}</span>
27 27
         ))}
28
-    </StyledKbd>
28
+    </kbd>
29 29
   )
30 30
 }
31 31
 
32
-export const StyledKbd = styled('kbd', {
32
+export const kbd = css({
33 33
   marginLeft: '$3',
34 34
   textShadow: '$2',
35 35
   textAlign: 'center',

+ 11
- 7
packages/tldraw/src/components/shared/menu.tsx View File

@@ -1,12 +1,12 @@
1 1
 import { breakpoints } from './breakpoints'
2
-import styled from '~styles'
3
-import { RowButton } from './row-button'
2
+import css from '~styles'
3
+import { rowButton } from './row-button'
4 4
 
5 5
 /* -------------------------------------------------- */
6 6
 /*                        Menu                        */
7 7
 /* -------------------------------------------------- */
8 8
 
9
-export const MenuContent = styled('div', {
9
+export const menuContent = css({
10 10
   position: 'relative',
11 11
   overflow: 'hidden',
12 12
   userSelect: 'none',
@@ -21,7 +21,7 @@ export const MenuContent = styled('div', {
21 21
   font: '$ui',
22 22
 })
23 23
 
24
-export const Divider = styled('div', {
24
+export const divider = css({
25 25
   backgroundColor: '$hover',
26 26
   height: 1,
27 27
   marginTop: '$2',
@@ -42,13 +42,17 @@ export function MenuButton({
42 42
   children: React.ReactNode
43 43
 }): JSX.Element {
44 44
   return (
45
-    <RowButton bp={breakpoints} disabled={disabled} warn={warn} onSelect={onSelect}>
45
+    <button
46
+      className={rowButton({ bp: breakpoints, warn })}
47
+      disabled={disabled}
48
+      onSelect={onSelect}
49
+    >
46 50
       {children}
47
-    </RowButton>
51
+    </button>
48 52
   )
49 53
 }
50 54
 
51
-export const MenuTextInput = styled('input', {
55
+export const menuTextInput = css({
52 56
   backgroundColor: '$panel',
53 57
   border: 'none',
54 58
   padding: '$4 $3',

+ 10
- 2
packages/tldraw/src/components/shared/radio-group.tsx View File

@@ -1,10 +1,18 @@
1
-import styled from '~styles'
1
+import React from 'react'
2
+import css from '~styles'
2 3
 import { Root as RGRoot } from '@radix-ui/react-radio-group'
3 4
 
4 5
 /* -------------------------------------------------- */
5 6
 /*                     Radio Group                    */
6 7
 /* -------------------------------------------------- */
7 8
 
8
-export const Group = styled(RGRoot, {
9
+export const group = css({
9 10
   display: 'flex',
10 11
 })
12
+
13
+export const Group = React.forwardRef<
14
+  React.ElementRef<typeof RGRoot>,
15
+  React.ComponentProps<typeof RGRoot>
16
+>((props, forwardedRef) => (
17
+  <RGRoot {...props} ref={forwardedRef} className={group({ className: props.className })} />
18
+))

+ 2
- 2
packages/tldraw/src/components/shared/row-button.tsx View File

@@ -1,10 +1,10 @@
1
-import styled from '~styles'
1
+import css from '~styles'
2 2
 
3 3
 /* -------------------------------------------------- */
4 4
 /*                     Row Button                     */
5 5
 /* -------------------------------------------------- */
6 6
 
7
-export const RowButton = styled('button', {
7
+export const rowButton = css({
8 8
   position: 'relative',
9 9
   display: 'flex',
10 10
   width: '100%',

+ 14
- 9
packages/tldraw/src/components/shared/tooltip.tsx View File

@@ -1,7 +1,7 @@
1 1
 import * as RadixTooltip from '@radix-ui/react-tooltip'
2 2
 import * as React from 'react'
3
-import styled from '~styles'
4
-import { Kbd } from './kbd'
3
+import css from '~styles'
4
+import { kbd } from './kbd'
5 5
 
6 6
 /* -------------------------------------------------- */
7 7
 /*                       Tooltip                      */
@@ -14,20 +14,25 @@ interface TooltipProps {
14 14
   side?: 'bottom' | 'left' | 'right' | 'top'
15 15
 }
16 16
 
17
-export function Tooltip({ children, label, kbd, side = 'top' }: TooltipProps): JSX.Element {
17
+export function Tooltip({
18
+  children,
19
+  label,
20
+  kbd: kbdProp,
21
+  side = 'top',
22
+}: TooltipProps): JSX.Element {
18 23
   return (
19 24
     <RadixTooltip.Root>
20 25
       <RadixTooltip.Trigger as="span">{children}</RadixTooltip.Trigger>
21
-      <StyledContent side={side} sideOffset={8}>
26
+      <RadixTooltip.Content className={content()} side={side} sideOffset={8}>
22 27
         {label}
23
-        {kbd ? <Kbd variant="tooltip">{kbd}</Kbd> : null}
24
-        <StyledArrow />
25
-      </StyledContent>
28
+        {kbdProp ? <kbd className={kbd({ variant: 'tooltip' })}>{kbdProp}</kbd> : null}
29
+        <RadixTooltip.Arrow className={arrow()} />
30
+      </RadixTooltip.Content>
26 31
     </RadixTooltip.Root>
27 32
   )
28 33
 }
29 34
 
30
-const StyledContent = styled(RadixTooltip.Content, {
35
+const content = css({
31 36
   borderRadius: 3,
32 37
   padding: '$3 $3 $3 $3',
33 38
   fontSize: '$1',
@@ -40,7 +45,7 @@ const StyledContent = styled(RadixTooltip.Content, {
40 45
   userSelect: 'none',
41 46
 })
42 47
 
43
-const StyledArrow = styled(RadixTooltip.Arrow, {
48
+const arrow = css({
44 49
   fill: '$tooltipBg',
45 50
   margin: '0 8px',
46 51
 })

+ 47
- 37
packages/tldraw/src/components/style-panel/align-distribute.tsx View File

@@ -13,7 +13,7 @@ import {
13 13
 } from '@radix-ui/react-icons'
14 14
 import { AlignType, DistributeType, StretchType } from '~types'
15 15
 import { useTLDrawContext } from '~hooks'
16
-import { breakpoints, ButtonsRow, IconButton } from '../shared'
16
+import { breakpoints, buttonsRow, iconButton } from '../shared'
17 17
 
18 18
 export interface AlignDistributeProps {
19 19
   hasTwoOrMore: boolean
@@ -66,70 +66,80 @@ export const AlignDistribute = React.memo(
66 66
 
67 67
     return (
68 68
       <>
69
-        <ButtonsRow>
70
-          <IconButton bp={breakpoints} size="small" disabled={!hasTwoOrMore} onClick={alignLeft}>
69
+        <div className={buttonsRow()}>
70
+          <button
71
+            className={iconButton({ bp: breakpoints, size: 'small' })}
72
+            disabled={!hasTwoOrMore}
73
+            onClick={alignLeft}
74
+          >
71 75
             <AlignLeftIcon />
72
-          </IconButton>
73
-          <IconButton
74
-            bp={breakpoints}
75
-            size="small"
76
+          </button>
77
+          <button
78
+            className={iconButton({ bp: breakpoints, size: 'small' })}
76 79
             disabled={!hasTwoOrMore}
77 80
             onClick={alignCenterHorizontal}
78 81
           >
79 82
             <AlignCenterHorizontallyIcon />
80
-          </IconButton>
81
-          <IconButton bp={breakpoints} size="small" disabled={!hasTwoOrMore} onClick={alignRight}>
83
+          </button>
84
+          <button
85
+            className={iconButton({ bp: breakpoints, size: 'small' })}
86
+            disabled={!hasTwoOrMore}
87
+            onClick={alignRight}
88
+          >
82 89
             <AlignRightIcon />
83
-          </IconButton>
84
-          <IconButton
85
-            bp={breakpoints}
86
-            size="small"
90
+          </button>
91
+          <button
92
+            className={iconButton({ bp: breakpoints, size: 'small' })}
87 93
             disabled={!hasTwoOrMore}
88 94
             onClick={stretchHorizontally}
89 95
           >
90 96
             <StretchHorizontallyIcon />
91
-          </IconButton>
92
-          <IconButton
93
-            bp={breakpoints}
94
-            size="small"
97
+          </button>
98
+          <button
99
+            className={iconButton({ bp: breakpoints, size: 'small' })}
95 100
             disabled={!hasThreeOrMore}
96 101
             onClick={distributeHorizontally}
97 102
           >
98 103
             <SpaceEvenlyHorizontallyIcon />
99
-          </IconButton>
100
-        </ButtonsRow>
101
-        <ButtonsRow>
102
-          <IconButton bp={breakpoints} size="small" disabled={!hasTwoOrMore} onClick={alignTop}>
104
+          </button>
105
+        </div>
106
+        <div className={buttonsRow()}>
107
+          <button
108
+            className={iconButton({ bp: breakpoints, size: 'small' })}
109
+            disabled={!hasTwoOrMore}
110
+            onClick={alignTop}
111
+          >
103 112
             <AlignTopIcon />
104
-          </IconButton>
105
-          <IconButton
106
-            bp={breakpoints}
107
-            size="small"
113
+          </button>
114
+          <button
115
+            className={iconButton({ bp: breakpoints, size: 'small' })}
108 116
             disabled={!hasTwoOrMore}
109 117
             onClick={alignCenterVertical}
110 118
           >
111 119
             <AlignCenterVerticallyIcon />
112
-          </IconButton>
113
-          <IconButton bp={breakpoints} size="small" disabled={!hasTwoOrMore} onClick={alignBottom}>
120
+          </button>
121
+          <button
122
+            className={iconButton({ bp: breakpoints, size: 'small' })}
123
+            disabled={!hasTwoOrMore}
124
+            onClick={alignBottom}
125
+          >
114 126
             <AlignBottomIcon />
115
-          </IconButton>
116
-          <IconButton
117
-            bp={breakpoints}
118
-            size="small"
127
+          </button>
128
+          <button
129
+            className={iconButton({ bp: breakpoints, size: 'small' })}
119 130
             disabled={!hasTwoOrMore}
120 131
             onClick={stretchVertically}
121 132
           >
122 133
             <StretchVerticallyIcon />
123
-          </IconButton>
124
-          <IconButton
125
-            bp={breakpoints}
126
-            size="small"
134
+          </button>
135
+          <button
136
+            className={iconButton({ bp: breakpoints, size: 'small' })}
127 137
             disabled={!hasThreeOrMore}
128 138
             onClick={distributeVertically}
129 139
           >
130 140
             <SpaceEvenlyVerticallyIcon />
131
-          </IconButton>
132
-        </ButtonsRow>
141
+          </button>
142
+        </div>
133 143
       </>
134 144
     )
135 145
   }

+ 3
- 3
packages/tldraw/src/components/style-panel/quick-color-select.tsx View File

@@ -1,6 +1,6 @@
1 1
 import * as React from 'react'
2 2
 import * as DropdownMenu from '@radix-ui/react-dropdown-menu'
3
-import { BoxIcon, StyleDropdownItem, StyleDropdownContent } from './styled'
3
+import { BoxIcon, dropdownItem, dropdownContent } from './styled'
4 4
 import { DropdownMenuIconTriggerButton } from '../shared'
5 5
 import { strokes } from '~shape'
6 6
 import { useTheme, useTLDrawContext } from '~hooks'
@@ -28,11 +28,11 @@ export const QuickColorSelect = React.memo((): JSX.Element => {
28 28
         <DropdownMenu.DropdownMenuRadioGroup
29 29
           value={color as string}
30 30
           onValueChange={handleColorChange}
31
-          as={StyleDropdownContent}
31
+          className={dropdownContent()}
32 32
         >
33 33
           {Object.keys(strokes[theme]).map((colorStyle: string) => (
34 34
             <DropdownMenu.DropdownMenuRadioItem
35
-              as={StyleDropdownItem}
35
+              className={dropdownItem()}
36 36
               key={colorStyle}
37 37
               title={colorStyle}
38 38
               value={colorStyle}

+ 4
- 6
packages/tldraw/src/components/style-panel/quick-dash-select.tsx View File

@@ -6,8 +6,8 @@ import {
6 6
   DashDottedIcon,
7 7
   DashSolidIcon,
8 8
   DashDashedIcon,
9
-  StyleDropdownContent,
10
-  StyleDropdownItem,
9
+  dropdownContent,
10
+  dropdownItem,
11 11
 } from './styled'
12 12
 import { useTLDrawContext } from '~hooks'
13 13
 import { DashStyle, Data } from '~types'
@@ -36,16 +36,14 @@ export const QuickDashSelect = React.memo((): JSX.Element => {
36 36
       <DropdownMenuIconTriggerButton label="Dash">{dashes[dash]}</DropdownMenuIconTriggerButton>
37 37
       <DropdownMenu.Content sideOffset={8}>
38 38
         <DropdownMenu.DropdownMenuRadioGroup
39
-          as={StyleDropdownContent}
40
-          direction="vertical"
39
+          className={dropdownContent({ direction: 'vertical' })}
41 40
           value={dash}
42 41
           onValueChange={changeDashStyle}
43 42
         >
44 43
           {Object.keys(DashStyle).map((dashStyle: string) => (
45 44
             <DropdownMenu.DropdownMenuRadioItem
46
-              as={StyleDropdownItem}
45
+              className={dropdownItem({ isActive: dash === dashStyle })}
47 46
               key={dashStyle}
48
-              isActive={dash === dashStyle}
49 47
               value={dashStyle}
50 48
             >
51 49
               {dashes[dashStyle as DashStyle]}

+ 4
- 5
packages/tldraw/src/components/style-panel/quick-fill-select.tsx View File

@@ -1,7 +1,7 @@
1 1
 import * as React from 'react'
2 2
 import * as Checkbox from '@radix-ui/react-checkbox'
3 3
 import { BoxIcon, IsFilledFillIcon } from './styled'
4
-import { breakpoints, Tooltip, IconButton, IconWrapper } from '../shared'
4
+import { breakpoints, Tooltip, iconButton, iconWrapper } from '../shared'
5 5
 import { useTLDrawContext } from '~hooks'
6 6
 import type { Data } from '~types'
7 7
 
@@ -20,18 +20,17 @@ export const QuickFillSelect = React.memo((): JSX.Element => {
20 20
   return (
21 21
     <Checkbox.Root
22 22
       dir="ltr"
23
-      as={IconButton}
24
-      bp={breakpoints}
23
+      className={iconButton({ bp: breakpoints })}
25 24
       checked={isFilled}
26 25
       onCheckedChange={handleIsFilledChange}
27 26
     >
28 27
       <Tooltip label="Fill">
29
-        <IconWrapper>
28
+        <div className={iconWrapper()}>
30 29
           <BoxIcon />
31 30
           <Checkbox.Indicator>
32 31
             <IsFilledFillIcon />
33 32
           </Checkbox.Indicator>
34
-        </IconWrapper>
33
+        </div>
35 34
       </Tooltip>
36 35
     </Checkbox.Root>
37 36
   )

+ 3
- 5
packages/tldraw/src/components/style-panel/quick-size-select.tsx View File

@@ -2,7 +2,7 @@ import * as React from 'react'
2 2
 import * as DropdownMenu from '@radix-ui/react-dropdown-menu'
3 3
 import { DropdownMenuIconTriggerButton } from '../shared/dropdown-menu'
4 4
 import { CircleIcon } from '../icons'
5
-import { StyleDropdownContent, StyleDropdownItem } from './styled'
5
+import { dropdownContent, dropdownItem } from './styled'
6 6
 import { Data, SizeStyle } from '~types'
7 7
 import { useTLDrawContext } from '~hooks'
8 8
 
@@ -31,16 +31,14 @@ export const QuickSizeSelect = React.memo((): JSX.Element => {
31 31
       </DropdownMenuIconTriggerButton>
32 32
       <DropdownMenu.Content sideOffset={8}>
33 33
         <DropdownMenu.DropdownMenuRadioGroup
34
-          as={StyleDropdownContent}
35
-          direction="vertical"
34
+          className={dropdownContent({ direction: 'vertical' })}
36 35
           value={size}
37 36
           onValueChange={changeSizeStyle}
38 37
         >
39 38
           {Object.keys(SizeStyle).map((sizeStyle: string) => (
40 39
             <DropdownMenu.DropdownMenuRadioItem
41 40
               key={sizeStyle}
42
-              as={StyleDropdownItem}
43
-              isActive={size === sizeStyle}
41
+              className={dropdownItem({ isActive: size === sizeStyle })}
44 42
               value={sizeStyle}
45 43
             >
46 44
               <CircleIcon size={sizes[sizeStyle as SizeStyle]} />

+ 41
- 41
packages/tldraw/src/components/style-panel/shapes-functions.tsx View File

@@ -1,5 +1,5 @@
1 1
 import * as React from 'react'
2
-import { IconButton, ButtonsRow, breakpoints } from '../shared'
2
+import { iconButton, buttonsRow, breakpoints } from '../shared'
3 3
 import { Trash } from '../icons'
4 4
 import { Tooltip } from '../shared/tooltip'
5 5
 import {
@@ -108,108 +108,108 @@ export const ShapesFunctions = React.memo(() => {
108 108
 
109 109
   return (
110 110
     <>
111
-      <ButtonsRow>
112
-        <IconButton
113
-          bp={breakpoints}
111
+      <div className={buttonsRow()}>
112
+        <button
113
+          className={iconButton({ bp: breakpoints, size: 'small' })}
114 114
           disabled={!hasSelection}
115
-          size="small"
116 115
           onClick={handleDuplicate}
117 116
         >
118 117
           <Tooltip label="Duplicate" kbd={`#D`}>
119 118
             <CopyIcon />
120 119
           </Tooltip>
121
-        </IconButton>
120
+        </button>
122 121
 
123
-        <IconButton disabled={!hasSelection} size="small" onClick={handleRotate}>
122
+        <button
123
+          className={iconButton({ size: 'small' })}
124
+          disabled={!hasSelection}
125
+          onClick={handleRotate}
126
+        >
124 127
           <Tooltip label="Rotate">
125 128
             <RotateCounterClockwiseIcon />
126 129
           </Tooltip>
127
-        </IconButton>
130
+        </button>
128 131
 
129
-        <IconButton
130
-          bp={breakpoints}
132
+        <button
133
+          className={iconButton({ bp: breakpoints, size: 'small' })}
131 134
           disabled={!hasSelection}
132
-          size="small"
133 135
           onClick={handleToggleLocked}
134 136
         >
135 137
           <Tooltip label="Toogle Locked" kbd={`#L`}>
136 138
             {isAllLocked ? <LockClosedIcon /> : <LockOpen1Icon opacity={0.4} />}
137 139
           </Tooltip>
138
-        </IconButton>
140
+        </button>
139 141
 
140
-        <IconButton
141
-          bp={breakpoints}
142
+        <button
143
+          className={iconButton({ bp: breakpoints, size: 'small' })}
142 144
           disabled={!hasSelection}
143
-          size="small"
144 145
           onClick={handleToggleAspectRatio}
145 146
         >
146 147
           <Tooltip label="Toogle Aspect Ratio Lock">
147 148
             <AspectRatioIcon opacity={isAllAspectLocked ? 1 : 0.4} />
148 149
           </Tooltip>
149
-        </IconButton>
150
+        </button>
150 151
 
151
-        <IconButton
152
-          bp={breakpoints}
152
+        <button
153
+          className={iconButton({ bp: breakpoints, size: 'small' })}
153 154
           disabled={!isAllGrouped && !hasMultipleSelection}
154
-          size="small"
155 155
           onClick={handleGroup}
156 156
         >
157 157
           <Tooltip label="Group" kbd={`#G`}>
158 158
             <GroupIcon opacity={isAllGrouped ? 1 : 0.4} />
159 159
           </Tooltip>
160
-        </IconButton>
161
-      </ButtonsRow>
162
-      <ButtonsRow>
163
-        <IconButton
164
-          bp={breakpoints}
160
+        </button>
161
+      </div>
162
+      <div className={buttonsRow()}>
163
+        <button
164
+          className={iconButton({ bp: breakpoints, size: 'small' })}
165 165
           disabled={!hasSelection}
166
-          size="small"
167 166
           onClick={handleMoveToBack}
168 167
         >
169 168
           <Tooltip label="Move to Back" kbd={`#⇧[`}>
170 169
             <PinBottomIcon />
171 170
           </Tooltip>
172
-        </IconButton>
171
+        </button>
173 172
 
174
-        <IconButton
175
-          bp={breakpoints}
173
+        <button
174
+          className={iconButton({ bp: breakpoints, size: 'small' })}
176 175
           disabled={!hasSelection}
177
-          size="small"
178 176
           onClick={handleMoveBackward}
179 177
         >
180 178
           <Tooltip label="Move Backward" kbd={`#[`}>
181 179
             <ArrowDownIcon />
182 180
           </Tooltip>
183
-        </IconButton>
181
+        </button>
184 182
 
185
-        <IconButton
186
-          bp={breakpoints}
183
+        <button
184
+          className={iconButton({ bp: breakpoints, size: 'small' })}
187 185
           disabled={!hasSelection}
188
-          size="small"
189 186
           onClick={handleMoveForward}
190 187
         >
191 188
           <Tooltip label="Move Forward" kbd={`#]`}>
192 189
             <ArrowUpIcon />
193 190
           </Tooltip>
194
-        </IconButton>
191
+        </button>
195 192
 
196
-        <IconButton
197
-          bp={breakpoints}
193
+        <button
194
+          className={iconButton({ bp: breakpoints, size: 'small' })}
198 195
           disabled={!hasSelection}
199
-          size="small"
200 196
           onClick={handleMoveToFront}
201 197
         >
202 198
           <Tooltip label="More to Front" kbd={`#⇧]`}>
203 199
             <PinTopIcon />
204 200
           </Tooltip>
205
-        </IconButton>
201
+        </button>
206 202
 
207
-        <IconButton bp={breakpoints} disabled={!hasSelection} size="small" onClick={handleDelete}>
203
+        <button
204
+          className={iconButton({ bp: breakpoints, size: 'small' })}
205
+          disabled={!hasSelection}
206
+          onClick={handleDelete}
207
+        >
208 208
           <Tooltip label="Delete" kbd="⌫">
209 209
             <Trash />
210 210
           </Tooltip>
211
-        </IconButton>
212
-      </ButtonsRow>
211
+        </button>
212
+      </div>
213 213
     </>
214 214
   )
215 215
 })

+ 29
- 26
packages/tldraw/src/components/style-panel/style-panel.tsx View File

@@ -10,14 +10,14 @@ import { QuickSizeSelect } from './quick-size-select'
10 10
 import { QuickDashSelect } from './quick-dash-select'
11 11
 import { QuickFillSelect } from './quick-fill-select'
12 12
 import { Tooltip } from '../shared/tooltip'
13
-import { Kbd } from '../shared/kbd'
13
+import { kbd } from '../shared/kbd'
14 14
 import {
15
-  IconButton,
16
-  ButtonsRow,
15
+  iconButton,
16
+  buttonsRow,
17 17
   breakpoints,
18
-  RowButton,
19
-  FloatingContainer,
20
-  Divider,
18
+  rowButton,
19
+  floatingContainer,
20
+  divider,
21 21
 } from '../shared'
22 22
 
23 23
 const isStyleOpenSelector = (s: Data) => s.appState.isStyleOpen
@@ -27,25 +27,24 @@ export function StylePanel(): JSX.Element {
27 27
   const isOpen = useSelector(isStyleOpenSelector)
28 28
 
29 29
   return (
30
-    <FloatingContainer direction="column">
31
-      <ButtonsRow>
30
+    <div className={floatingContainer({ direction: 'column' })}>
31
+      <div className={buttonsRow()}>
32 32
         <QuickColorSelect />
33 33
         <QuickSizeSelect />
34 34
         <QuickDashSelect />
35 35
         <QuickFillSelect />
36
-        <IconButton
37
-          bp={breakpoints}
36
+        <button
37
+          className={iconButton({ bp: breakpoints, size: 'small' })}
38 38
           title="Style"
39
-          size="small"
40 39
           onPointerDown={tlstate.toggleStylePanel}
41 40
         >
42 41
           <Tooltip label={isOpen ? 'Close' : 'More'}>
43 42
             {isOpen ? <Cross2Icon /> : <DotsHorizontalIcon />}
44 43
           </Tooltip>
45
-        </IconButton>
46
-      </ButtonsRow>
44
+        </button>
45
+      </div>
47 46
       {isOpen && <SelectedShapeContent />}
48
-    </FloatingContainer>
47
+    </div>
49 48
   )
50 49
 }
51 50
 
@@ -72,26 +71,30 @@ function SelectedShapeContent(): JSX.Element {
72 71
 
73 72
   return (
74 73
     <>
75
-      <Divider />
74
+      <div className={divider()} />
76 75
       <ShapesFunctions />
77
-      <Divider />
76
+      <div className={divider()} />
78 77
       <AlignDistribute
79 78
         hasTwoOrMore={selectedShapesCount > 1}
80 79
         hasThreeOrMore={selectedShapesCount > 2}
81 80
       />
82
-      <Divider />
83
-      <RowButton bp={breakpoints} disabled={selectedShapesCount === 0} onClick={handleCopy}>
81
+      <div className={divider()} />
82
+      <button
83
+        className={rowButton({ bp: breakpoints })}
84
+        disabled={selectedShapesCount === 0}
85
+        onClick={handleCopy}
86
+      >
84 87
         <span>Copy</span>
85
-        {showKbds && <Kbd variant="menu">#C</Kbd>}
86
-      </RowButton>
87
-      <RowButton bp={breakpoints} onClick={handlePaste}>
88
+        {showKbds && <kbd className={kbd({ variant: 'menu' })}>#C</kbd>}
89
+      </button>
90
+      <button className={rowButton({ bp: breakpoints })} onClick={handlePaste}>
88 91
         <span>Paste</span>
89
-        {showKbds && <Kbd variant="menu">#V</Kbd>}
90
-      </RowButton>
91
-      <RowButton bp={breakpoints} onClick={handleCopySvg}>
92
+        {showKbds && <kbd className={kbd({ variant: 'menu' })}>#V</kbd>}
93
+      </button>
94
+      <button className={rowButton({ bp: breakpoints })} onClick={handleCopySvg}>
92 95
         <span>Copy to SVG</span>
93
-        {showKbds && <Kbd variant="menu">⇧#C</Kbd>}
94
-      </RowButton>
96
+        {showKbds && <kbd className={kbd({ variant: 'menu' })}>⇧#C</kbd>}
97
+      </button>
95 98
     </>
96 99
   )
97 100
 }

+ 3
- 3
packages/tldraw/src/components/style-panel/styled.tsx View File

@@ -1,7 +1,7 @@
1 1
 import * as React from 'react'
2
-import styled from '~styles'
2
+import css from '~styles'
3 3
 
4
-export const StyleDropdownContent = styled('div', {
4
+export const dropdownContent = css({
5 5
   display: 'grid',
6 6
   padding: 4,
7 7
   gridTemplateColumns: 'repeat(4, 1fr)',
@@ -19,7 +19,7 @@ export const StyleDropdownContent = styled('div', {
19 19
   },
20 20
 })
21 21
 
22
-export const StyleDropdownItem = styled('button', {
22
+export const dropdownItem = css({
23 23
   height: '32px',
24 24
   width: '32px',
25 25
   backgroundColor: '$panel',

+ 9
- 9
packages/tldraw/src/components/tldraw/tldraw.tsx View File

@@ -1,7 +1,7 @@
1 1
 import * as React from 'react'
2 2
 import { IdProvider } from '@radix-ui/react-id'
3 3
 import { Renderer } from '@tldraw/core'
4
-import styled from '~styles'
4
+import css from '~styles'
5 5
 import { Data, TLDrawDocument, TLDrawStatus } from '~types'
6 6
 import { TLDrawState } from '~state'
7 7
 import { TLDrawContext, useCustomFonts, useKeyboardShortcuts, useTLDrawContext } from '~hooks'
@@ -146,7 +146,7 @@ function InnerTldraw({
146 146
   }, [currentPageId, tlstate])
147 147
 
148 148
   return (
149
-    <Layout>
149
+    <div className={layout()}>
150 150
       <ContextMenu>
151 151
         <Renderer
152 152
           page={page}
@@ -205,18 +205,18 @@ function InnerTldraw({
205 205
           onMount={tlstate.handleMount}
206 206
         />
207 207
       </ContextMenu>
208
-      <MenuButtons>
208
+      <div className={menuButtons()}>
209 209
         <Menu />
210 210
         <PagePanel />
211
-      </MenuButtons>
212
-      <Spacer />
211
+      </div>
212
+      <div className={spacer()} />
213 213
       <StylePanel />
214 214
       <ToolsPanel />
215
-    </Layout>
215
+    </div>
216 216
   )
217 217
 }
218 218
 
219
-const Layout = styled('div', {
219
+const layout = css({
220 220
   position: 'absolute',
221 221
   height: '100%',
222 222
   width: '100%',
@@ -245,11 +245,11 @@ const Layout = styled('div', {
245 245
   },
246 246
 })
247 247
 
248
-const Spacer = styled('div', {
248
+const spacer = css({
249 249
   flexGrow: 2,
250 250
 })
251 251
 
252
-const MenuButtons = styled('div', {
252
+const menuButtons = css({
253 253
   display: 'flex',
254 254
   gap: 8,
255 255
 })

+ 8
- 6
packages/tldraw/src/components/tools-panel/back-to-content.tsx View File

@@ -1,6 +1,6 @@
1 1
 import * as React from 'react'
2
-import { FloatingContainer, RowButton } from '../shared'
3
-import styled from '~styles'
2
+import { floatingContainer, rowButton } from '../shared'
3
+import css from '~styles'
4 4
 import type { Data } from '~types'
5 5
 import { useTLDrawContext } from '~hooks'
6 6
 
@@ -16,13 +16,15 @@ export const BackToContent = React.memo(() => {
16 16
   if (!isEmptyCanvas) return null
17 17
 
18 18
   return (
19
-    <BackToContentButton>
20
-      <RowButton onClick={tlstate.zoomToContent}>Back to content</RowButton>
21
-    </BackToContentButton>
19
+    <div className={backToContentButton()}>
20
+      <button className={rowButton()} onClick={tlstate.zoomToContent}>
21
+        Back to content
22
+      </button>
23
+    </div>
22 24
   )
23 25
 })
24 26
 
25
-const BackToContentButton = styled(FloatingContainer, {
27
+const backToContentButton = css(floatingContainer, {
26 28
   pointerEvents: 'all',
27 29
   width: 'fit-content',
28 30
   gridRow: 1,

+ 7
- 7
packages/tldraw/src/components/tools-panel/status-bar.tsx View File

@@ -1,7 +1,7 @@
1 1
 import * as React from 'react'
2 2
 import { useTLDrawContext } from '~hooks'
3 3
 import type { Data } from '~types'
4
-import styled from '~styles'
4
+import css from '~styles'
5 5
 
6 6
 const statusSelector = (s: Data) => s.appState.status.current
7 7
 const activeToolSelector = (s: Data) => s.appState.activeTool
@@ -12,15 +12,15 @@ export function StatusBar(): JSX.Element | null {
12 12
   const activeTool = useSelector(activeToolSelector)
13 13
 
14 14
   return (
15
-    <StatusBarContainer size={{ '@sm': 'small' }}>
16
-      <Section>
15
+    <div className={statusBarContainer({ size: { '@sm': 'small' } })}>
16
+      <div className={section()}>
17 17
         {activeTool} | {status}
18
-      </Section>
19
-    </StatusBarContainer>
18
+      </div>
19
+    </div>
20 20
   )
21 21
 }
22 22
 
23
-const StatusBarContainer = styled('div', {
23
+const statusBarContainer = css({
24 24
   height: 40,
25 25
   userSelect: 'none',
26 26
   borderTop: '1px solid $border',
@@ -44,7 +44,7 @@ const StatusBarContainer = styled('div', {
44 44
   },
45 45
 })
46 46
 
47
-const Section = styled('div', {
47
+const section = css({
48 48
   whiteSpace: 'nowrap',
49 49
   overflow: 'hidden',
50 50
 })

+ 41
- 35
packages/tldraw/src/components/tools-panel/styled.tsx View File

@@ -1,9 +1,9 @@
1 1
 import * as React from 'react'
2
-import { FloatingContainer } from '../shared'
2
+import { floatingContainer } from '../shared'
3 3
 import { Tooltip } from '../shared/tooltip'
4
-import styled from '~styles'
4
+import css from '~styles'
5 5
 
6
-export const ToolButton = styled('button', {
6
+export const toolButton = css({
7 7
   position: 'relative',
8 8
   height: '32px',
9 9
   width: '32px',
@@ -38,7 +38,7 @@ export const ToolButton = styled('button', {
38 38
   },
39 39
 })
40 40
 
41
-export const PrimaryToolButton = styled(ToolButton, {
41
+export const primaryToolButton = css(toolButton, {
42 42
   variants: {
43 43
     bp: {
44 44
       mobile: {
@@ -65,7 +65,7 @@ export const PrimaryToolButton = styled(ToolButton, {
65 65
   },
66 66
 })
67 67
 
68
-export const SecondaryToolButton = styled(ToolButton, {
68
+export const secondaryToolButton = css(toolButton, {
69 69
   variants: {
70 70
     bp: {
71 71
       mobile: {
@@ -92,7 +92,7 @@ export const SecondaryToolButton = styled(ToolButton, {
92 92
   },
93 93
 })
94 94
 
95
-export const TertiaryToolButton = styled(ToolButton, {
95
+export const tertiaryToolButton = css(toolButton, {
96 96
   variants: {
97 97
     bp: {
98 98
       mobile: {
@@ -139,20 +139,22 @@ export function PrimaryButton({
139 139
 }: PrimaryToolButtonProps): JSX.Element {
140 140
   return (
141 141
     <Tooltip label={label[0].toUpperCase() + label.slice(1)} kbd={kbd}>
142
-      <PrimaryToolButton
143
-        name={label}
144
-        bp={{
145
-          '@initial': 'mobile',
146
-          '@sm': 'small',
147
-          '@md': 'medium',
148
-          '@lg': 'large',
149
-        }}
142
+      <button
143
+        className={primaryToolButton({
144
+          bp: {
145
+            '@initial': 'mobile',
146
+            '@sm': 'small',
147
+            '@md': 'medium',
148
+            '@lg': 'large',
149
+          },
150
+          name: label,
151
+          isActive,
152
+        })}
150 153
         onClick={onClick}
151 154
         onDoubleClick={onDoubleClick}
152
-        isActive={isActive}
153 155
       >
154 156
         {children}
155
-      </PrimaryToolButton>
157
+      </button>
156 158
     </Tooltip>
157 159
   )
158 160
 }
@@ -176,20 +178,22 @@ export function SecondaryButton({
176 178
 }: SecondaryToolButtonProps): JSX.Element {
177 179
   return (
178 180
     <Tooltip label={label[0].toUpperCase() + label.slice(1)} kbd={kbd}>
179
-      <SecondaryToolButton
180
-        name={label}
181
-        bp={{
182
-          '@initial': 'mobile',
183
-          '@sm': 'small',
184
-          '@md': 'medium',
185
-          '@lg': 'large',
186
-        }}
181
+      <button
182
+        className={secondaryToolButton({
183
+          bp: {
184
+            '@initial': 'mobile',
185
+            '@sm': 'small',
186
+            '@md': 'medium',
187
+            '@lg': 'large',
188
+          },
189
+          name: label,
190
+          isActive,
191
+        })}
187 192
         onClick={onClick}
188 193
         onDoubleClick={onDoubleClick}
189
-        isActive={isActive}
190 194
       >
191 195
         {children}
192
-      </SecondaryToolButton>
196
+      </button>
193 197
     </Tooltip>
194 198
   )
195 199
 }
@@ -211,24 +215,26 @@ export function TertiaryButton({
211 215
 }: TertiaryToolProps): JSX.Element {
212 216
   return (
213 217
     <Tooltip label={label[0].toUpperCase() + label.slice(1)} kbd={kbd}>
214
-      <TertiaryToolButton
218
+      <button
219
+        className={tertiaryToolButton({
220
+          bp: {
221
+            '@initial': 'mobile',
222
+            '@sm': 'small',
223
+            '@md': 'medium',
224
+            '@lg': 'large',
225
+          },
226
+        })}
215 227
         name={label}
216
-        bp={{
217
-          '@initial': 'mobile',
218
-          '@sm': 'small',
219
-          '@md': 'medium',
220
-          '@lg': 'large',
221
-        }}
222 228
         onClick={onClick}
223 229
         onDoubleClick={onDoubleClick}
224 230
       >
225 231
         {children}
226
-      </TertiaryToolButton>
232
+      </button>
227 233
     </Tooltip>
228 234
   )
229 235
 }
230 236
 
231
-export const TertiaryButtonsContainer = styled(FloatingContainer, {
237
+export const tertiaryButtonsContainer = css(floatingContainer, {
232 238
   boxShadow: '$3',
233 239
   variants: {
234 240
     bp: {

+ 23
- 23
packages/tldraw/src/components/tools-panel/tools-panel.tsx View File

@@ -9,11 +9,11 @@ import {
9 9
   SquareIcon,
10 10
   TextIcon,
11 11
 } from '@radix-ui/react-icons'
12
-import styled from '~styles'
12
+import css from '~styles'
13 13
 import { Data, TLDrawShapeType } from '~types'
14 14
 import { useTLDrawContext } from '~hooks'
15 15
 import { StatusBar } from './status-bar'
16
-import { FloatingContainer } from '../shared'
16
+import { floatingContainer } from '../shared'
17 17
 import { PrimaryButton, SecondaryButton } from './styled'
18 18
 import { UndoRedo } from './undo-redo'
19 19
 import { Zoom } from './zoom'
@@ -57,10 +57,10 @@ export const ToolsPanel = React.memo((): JSX.Element => {
57 57
   }, [tlstate])
58 58
 
59 59
   return (
60
-    <ToolsPanelContainer>
61
-      <LeftWrap size={{ '@initial': 'mobile', '@sm': 'small' }}>
60
+    <div className={toolsPanelContainer()}>
61
+      <div className={leftWrap({ size: { '@initial': 'mobile', '@sm': 'small' } })}>
62 62
         <Zoom />
63
-        <FloatingContainer>
63
+        <div className={floatingContainer()}>
64 64
           <SecondaryButton
65 65
             label={'Select'}
66 66
             kbd={'1'}
@@ -69,11 +69,11 @@ export const ToolsPanel = React.memo((): JSX.Element => {
69 69
           >
70 70
             <CursorArrowIcon />
71 71
           </SecondaryButton>
72
-        </FloatingContainer>
73
-      </LeftWrap>
74
-      <CenterWrap>
72
+        </div>
73
+      </div>
74
+      <div className={centerWrap()}>
75 75
         <BackToContent />
76
-        <FloatingContainer>
76
+        <div className={floatingContainer()}>
77 77
           <PrimaryButton
78 78
             kbd={'2'}
79 79
             label={TLDrawShapeType.Draw}
@@ -114,10 +114,10 @@ export const ToolsPanel = React.memo((): JSX.Element => {
114 114
           >
115 115
             <TextIcon />
116 116
           </PrimaryButton>
117
-        </FloatingContainer>
118
-      </CenterWrap>
119
-      <RightWrap size={{ '@initial': 'mobile', '@sm': 'small' }}>
120
-        <FloatingContainer>
117
+        </div>
118
+      </div>
119
+      <div className={rightWrap({ size: { '@initial': 'mobile', '@sm': 'small' } })}>
120
+        <div className={floatingContainer()}>
121 121
           <SecondaryButton
122 122
             kbd={'7'}
123 123
             label={'Lock Tool'}
@@ -126,19 +126,19 @@ export const ToolsPanel = React.memo((): JSX.Element => {
126 126
           >
127 127
             {isToolLocked ? <LockClosedIcon /> : <LockOpen1Icon />}
128 128
           </SecondaryButton>
129
-        </FloatingContainer>
129
+        </div>
130 130
         <UndoRedo />
131
-      </RightWrap>
131
+      </div>
132 132
       {isDebugMode && (
133
-        <StatusWrap>
133
+        <div className={statusWrap()}>
134 134
           <StatusBar />
135
-        </StatusWrap>
135
+        </div>
136 136
       )}
137
-    </ToolsPanelContainer>
137
+    </div>
138 138
   )
139 139
 })
140 140
 
141
-const ToolsPanelContainer = styled('div', {
141
+const toolsPanelContainer = css({
142 142
   position: 'absolute',
143 143
   bottom: 0,
144 144
   left: 0,
@@ -160,7 +160,7 @@ const ToolsPanelContainer = styled('div', {
160 160
   },
161 161
 })
162 162
 
163
-const CenterWrap = styled('div', {
163
+const centerWrap = css({
164 164
   gridRow: 1,
165 165
   gridColumn: 2,
166 166
   display: 'flex',
@@ -171,7 +171,7 @@ const CenterWrap = styled('div', {
171 171
   gap: 12,
172 172
 })
173 173
 
174
-const LeftWrap = styled('div', {
174
+const leftWrap = css({
175 175
   gridRow: 1,
176 176
   gridColumn: 1,
177 177
   display: 'flex',
@@ -198,7 +198,7 @@ const LeftWrap = styled('div', {
198 198
   },
199 199
 })
200 200
 
201
-const RightWrap = styled('div', {
201
+const rightWrap = css({
202 202
   gridRow: 1,
203 203
   gridColumn: 3,
204 204
   display: 'flex',
@@ -225,7 +225,7 @@ const RightWrap = styled('div', {
225 225
   },
226 226
 })
227 227
 
228
-const StatusWrap = styled('div', {
228
+const statusWrap = css({
229 229
   gridRow: 2,
230 230
   gridColumn: '1 / span 3',
231 231
 })

+ 3
- 3
packages/tldraw/src/components/tools-panel/undo-redo.tsx View File

@@ -1,6 +1,6 @@
1 1
 import * as React from 'react'
2 2
 import { useTLDrawContext } from '~hooks'
3
-import { TertiaryButton, TertiaryButtonsContainer } from './styled'
3
+import { TertiaryButton, tertiaryButtonsContainer } from './styled'
4 4
 import { Undo, Redo, Trash } from '../icons'
5 5
 
6 6
 export const UndoRedo = React.memo((): JSX.Element => {
@@ -15,7 +15,7 @@ export const UndoRedo = React.memo((): JSX.Element => {
15 15
   }, [tlstate])
16 16
 
17 17
   return (
18
-    <TertiaryButtonsContainer bp={{ '@initial': 'mobile', '@sm': 'small' }}>
18
+    <div className={tertiaryButtonsContainer({ bp: { '@initial': 'mobile', '@sm': 'small' } })}>
19 19
       <TertiaryButton label="Undo" kbd="#Z" onClick={tlstate.undo}>
20 20
         <Undo />
21 21
       </TertiaryButton>
@@ -25,6 +25,6 @@ export const UndoRedo = React.memo((): JSX.Element => {
25 25
       <TertiaryButton label="Delete" kbd="⌫" onClick={handleDelete} onDoubleClick={handleClear}>
26 26
         <Trash />
27 27
       </TertiaryButton>
28
-    </TertiaryButtonsContainer>
28
+    </div>
29 29
   )
30 30
 })

+ 3
- 3
packages/tldraw/src/components/tools-panel/zoom.tsx View File

@@ -1,6 +1,6 @@
1 1
 import * as React from 'react'
2 2
 import { ZoomInIcon, ZoomOutIcon } from '@radix-ui/react-icons'
3
-import { TertiaryButton, TertiaryButtonsContainer } from './styled'
3
+import { TertiaryButton, tertiaryButtonsContainer } from './styled'
4 4
 import { useTLDrawContext } from '~hooks'
5 5
 import type { Data } from '~types'
6 6
 
@@ -8,7 +8,7 @@ export const Zoom = React.memo((): JSX.Element => {
8 8
   const { tlstate } = useTLDrawContext()
9 9
 
10 10
   return (
11
-    <TertiaryButtonsContainer bp={{ '@initial': 'mobile', '@sm': 'small' }}>
11
+    <div className={tertiaryButtonsContainer({ bp: { '@initial': 'mobile', '@sm': 'small' } })}>
12 12
       <TertiaryButton label="Zoom Out" kbd={`#−`} onClick={tlstate.zoomOut}>
13 13
         <ZoomOutIcon />
14 14
       </TertiaryButton>
@@ -16,7 +16,7 @@ export const Zoom = React.memo((): JSX.Element => {
16 16
         <ZoomInIcon />
17 17
       </TertiaryButton>
18 18
       <ZoomCounter />
19
-    </TertiaryButtonsContainer>
19
+    </div>
20 20
   )
21 21
 })
22 22
 

+ 7
- 9
packages/tldraw/src/shape/shapes/text/text.tsx View File

@@ -4,7 +4,7 @@ import { HTMLContainer, TLBounds, Utils, ShapeUtil } from '@tldraw/core'
4 4
 import { Vec } from '@tldraw/vec'
5 5
 import { getShapeStyle, getFontStyle, defaultStyle } from '~shape/shape-styles'
6 6
 import { TextShape, TLDrawShapeType, TLDrawToolType, TLDrawMeta } from '~types'
7
-import styled from '~styles'
7
+import css from '~styles'
8 8
 import TextAreaUtils from './text-utils'
9 9
 
10 10
 const LETTER_SPACING = -1.5
@@ -162,9 +162,9 @@ export const Text = new ShapeUtil<TextShape, HTMLDivElement, TLDrawMeta>(() => (
162 162
 
163 163
     return (
164 164
       <HTMLContainer ref={ref} {...events}>
165
-        <StyledWrapper isEditing={isEditing} onPointerDown={handlePointerDown}>
166
-          <StyledTextArea
167
-            id={shape.id + '_svg'}
165
+        <div className={wrapper({ isEditing })} onPointerDown={handlePointerDown}>
166
+          <textarea
167
+            className={textArea({ isEditing, isBinding })}
168 168
             ref={rInput}
169 169
             style={{
170 170
               font,
@@ -185,14 +185,12 @@ export const Text = new ShapeUtil<TextShape, HTMLDivElement, TLDrawMeta>(() => (
185 185
             onKeyDown={handleKeyDown}
186 186
             onPointerDown={handlePointerDown}
187 187
             autoFocus={isEditing}
188
-            isEditing={isEditing}
189
-            isBinding={isBinding}
190 188
             readOnly={!isEditing}
191 189
             wrap="off"
192 190
             dir="auto"
193 191
             datatype="wysiwyg"
194 192
           />
195
-        </StyledWrapper>
193
+        </div>
196 194
       </HTMLContainer>
197 195
     )
198 196
   },
@@ -298,7 +296,7 @@ export const Text = new ShapeUtil<TextShape, HTMLDivElement, TLDrawMeta>(() => (
298 296
 /*                       Helpers                      */
299 297
 /* -------------------------------------------------- */
300 298
 
301
-const StyledWrapper = styled('div', {
299
+const wrapper = css({
302 300
   width: '100%',
303 301
   height: '100%',
304 302
   variants: {
@@ -313,7 +311,7 @@ const StyledWrapper = styled('div', {
313 311
   },
314 312
 })
315 313
 
316
-const StyledTextArea = styled('textarea', {
314
+const textArea = css({
317 315
   position: 'absolute',
318 316
   top: 'var(--tl-padding)',
319 317
   left: 'var(--tl-padding)',

+ 2
- 2
packages/tldraw/src/styles/index.ts View File

@@ -1,5 +1,5 @@
1
-import styled from './stitches.config'
1
+import css from './stitches.config'
2 2
 
3 3
 export * from './stitches.config'
4 4
 
5
-export default styled
5
+export default css

+ 4
- 4
packages/tldraw/src/styles/stitches.config.ts View File

@@ -1,6 +1,6 @@
1
-import { createStitches, defaultThemeMap } from '@stitches/react'
1
+import { createStitches, defaultThemeMap } from '@stitches/core'
2 2
 
3
-const { styled, css, createTheme, getCssText } = createStitches({
3
+const { css, createTheme, getCssText } = createStitches({
4 4
   themeMap: {
5 5
     ...defaultThemeMap,
6 6
   },
@@ -134,6 +134,6 @@ const dark = createTheme({
134 134
   },
135 135
 })
136 136
 
137
-export default styled
137
+export default css
138 138
 
139
-export { css, getCssText, dark }
139
+export { getCssText, dark }

+ 1
- 3
packages/vec/package.json View File

@@ -42,12 +42,10 @@
42 42
     "esbuild": "^0.12.24",
43 43
     "eslint": "^7.32.0",
44 44
     "lerna": "^4.0.0",
45
-    "react": "^17.0.2",
46
-    "react-dom": "^17.0.2",
47 45
     "ts-node": "^10.2.1",
48 46
     "tslib": "^2.3.1",
49 47
     "typedoc": "^0.22.3",
50 48
     "typescript": "^4.4.2"
51 49
   },
52 50
   "gitHead": "5cb031ddc264846ec6732d7179511cddea8ef034"
53
-}
51
+}

+ 1
- 1
packages/www/package.json View File

@@ -34,4 +34,4 @@
34 34
     "typescript": "^4.4.2"
35 35
   },
36 36
   "gitHead": "838fabdbff1a66d4d7ee8aa5c5d117bc55acbff2"
37
-}
37
+}

+ 24
- 22
packages/www/pages/sponsorware.tsx View File

@@ -1,4 +1,4 @@
1
-import styled from 'styles'
1
+import css from 'styles'
2 2
 import { getSession, signin, signout, useSession } from 'next-auth/client'
3 3
 import { GetServerSideProps } from 'next'
4 4
 import Link from 'next/link'
@@ -13,11 +13,13 @@ export default function Sponsorware(): JSX.Element {
13 13
       <Head>
14 14
         <title>tldraw</title>
15 15
       </Head>
16
-      <OuterContent>
17
-        <Content
18
-          size={{
19
-            '@sm': 'small',
20
-          }}
16
+      <div className={outerContent()}>
17
+        <div
18
+          className={content({
19
+            size: {
20
+              '@sm': 'small',
21
+            },
22
+          })}
21 23
         >
22 24
           <h1>tldraw (is sponsorware)</h1>
23 25
           <p>
@@ -50,13 +52,13 @@ export default function Sponsorware(): JSX.Element {
50 52
             </a>{' '}
51 53
             (at any level) and sign in below.
52 54
           </p>
53
-          <ButtonGroup>
55
+          <div className={buttonGroup()}>
54 56
             {session ? (
55 57
               <>
56
-                <Button onClick={() => signout()} variant={'secondary'}>
58
+                <button className={button({ variant: 'secondary' })} onClick={() => signout()}>
57 59
                   Sign Out
58
-                </Button>
59
-                <Detail>
60
+                </button>
61
+                <p className={detail()}>
60 62
                   Signed in as {session?.user?.name} ({session?.user?.email}), but it looks like
61 63
                   you&apos;re not yet a sponsor.
62 64
                   <br />
@@ -69,19 +71,19 @@ export default function Sponsorware(): JSX.Element {
69 71
                     Twitter
70 72
                   </a>
71 73
                   .
72
-                </Detail>
74
+                </p>
73 75
               </>
74 76
             ) : (
75 77
               <>
76
-                <Button onClick={() => signin('github')} variant={'primary'}>
78
+                <button className={button({ variant: 'primary' })} onClick={() => signin('github')}>
77 79
                   {loading ? 'Loading...' : 'Sign in With Github'}
78
-                </Button>
79
-                <Detail>Already a sponsor? Just sign in to visit the app.</Detail>
80
+                </button>
81
+                <p className={detail()}>Already a sponsor? Just sign in to visit the app.</p>
80 82
               </>
81 83
             )}
82
-          </ButtonGroup>
83
-        </Content>
84
-      </OuterContent>
84
+          </div>
85
+        </div>
86
+      </div>
85 87
     </>
86 88
   )
87 89
 }
@@ -96,7 +98,7 @@ export const getServerSideProps: GetServerSideProps = async (context) => {
96 98
   }
97 99
 }
98 100
 
99
-const OuterContent = styled('div', {
101
+const outerContent = css({
100 102
   backgroundColor: '$canvas',
101 103
   padding: '8px 8px 64px 8px',
102 104
   margin: '0 auto',
@@ -113,7 +115,7 @@ const OuterContent = styled('div', {
113 115
   height: '100%',
114 116
 })
115 117
 
116
-const Content = styled('div', {
118
+const content = css({
117 119
   width: '720px',
118 120
   padding: '8px 16px',
119 121
   maxWidth: '100%',
@@ -161,18 +163,18 @@ const Content = styled('div', {
161 163
   },
162 164
 })
163 165
 
164
-const ButtonGroup = styled('div', {
166
+const buttonGroup = css({
165 167
   display: 'grid',
166 168
   gap: '16px',
167 169
   margin: '40px 0 32px 0',
168 170
 })
169 171
 
170
-const Detail = styled('p', {
172
+const detail = css({
171 173
   fontSize: '$2',
172 174
   textAlign: 'center',
173 175
 })
174 176
 
175
-const Button = styled('button', {
177
+const button = css({
176 178
   cursor: 'pointer',
177 179
   width: '100%',
178 180
   padding: '12px 0',

+ 3
- 3
packages/www/styles/index.ts View File

@@ -1,4 +1,4 @@
1
-import styled, { css, getCssText, globalStyles, light, dark } from './stitches.config'
1
+import css, { getCssText, globalStyles, light, dark } from './stitches.config'
2 2
 
3
-export default styled
4
-export { css, getCssText, globalStyles, light, dark }
3
+export default css
4
+export { getCssText, globalStyles, light, dark }

+ 4
- 4
packages/www/styles/stitches.config.ts View File

@@ -1,6 +1,6 @@
1
-import { createStitches, defaultThemeMap } from '@stitches/react'
1
+import { createStitches, defaultThemeMap } from '@stitches/core'
2 2
 
3
-const { styled, css, globalCss, createTheme, getCssText } = createStitches({
3
+const { css, globalCss, createTheme, getCssText } = createStitches({
4 4
   themeMap: {
5 5
     ...defaultThemeMap,
6 6
   },
@@ -140,6 +140,6 @@ const globalStyles = globalCss({
140 140
   '*': { boxSizing: 'border-box' },
141 141
 })
142 142
 
143
-export default styled
143
+export default css
144 144
 
145
-export { css, getCssText, globalStyles, light, dark }
145
+export { getCssText, globalStyles, light, dark }

+ 0
- 21325
tsconfig.tsbuildinfo
File diff suppressed because it is too large
View File


+ 171
- 150
yarn.lock View File

@@ -164,18 +164,18 @@
164 164
     "@babel/types" "^7.15.4"
165 165
 
166 166
 "@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.15.4":
167
-  version "7.15.4"
168
-  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz#962cc629a7f7f9a082dd62d0307fa75fe8788d7c"
169
-  integrity sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw==
167
+  version "7.15.7"
168
+  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz#7da80c8cbc1f02655d83f8b79d25866afe50d226"
169
+  integrity sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw==
170 170
   dependencies:
171 171
     "@babel/helper-module-imports" "^7.15.4"
172 172
     "@babel/helper-replace-supers" "^7.15.4"
173 173
     "@babel/helper-simple-access" "^7.15.4"
174 174
     "@babel/helper-split-export-declaration" "^7.15.4"
175
-    "@babel/helper-validator-identifier" "^7.14.9"
175
+    "@babel/helper-validator-identifier" "^7.15.7"
176 176
     "@babel/template" "^7.15.4"
177 177
     "@babel/traverse" "^7.15.4"
178
-    "@babel/types" "^7.15.4"
178
+    "@babel/types" "^7.15.6"
179 179
 
180 180
 "@babel/helper-optimise-call-expression@^7.15.4":
181 181
   version "7.15.4"
@@ -229,10 +229,10 @@
229 229
   dependencies:
230 230
     "@babel/types" "^7.15.4"
231 231
 
232
-"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9":
233
-  version "7.14.9"
234
-  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48"
235
-  integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==
232
+"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7":
233
+  version "7.15.7"
234
+  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389"
235
+  integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==
236 236
 
237 237
 "@babel/helper-validator-option@^7.14.5":
238 238
   version "7.14.5"
@@ -268,9 +268,9 @@
268 268
     js-tokens "^4.0.0"
269 269
 
270 270
 "@babel/parser@^7.1.0", "@babel/parser@^7.15.4", "@babel/parser@^7.15.5", "@babel/parser@^7.7.2":
271
-  version "7.15.6"
272
-  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.6.tgz#043b9aa3c303c0722e5377fef9197f4cf1796549"
273
-  integrity sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q==
271
+  version "7.15.7"
272
+  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.7.tgz#0c3ed4a2eb07b165dfa85b3cc45c727334c4edae"
273
+  integrity sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g==
274 274
 
275 275
 "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.15.4":
276 276
   version "7.15.4"
@@ -2884,9 +2884,9 @@
2884 2884
     read-package-json-fast "^2.0.1"
2885 2885
 
2886 2886
 "@octokit/auth-token@^2.4.0", "@octokit/auth-token@^2.4.4":
2887
-  version "2.4.5"
2888
-  resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.5.tgz#568ccfb8cb46f36441fac094ce34f7a875b197f3"
2889
-  integrity sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA==
2887
+  version "2.5.0"
2888
+  resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.5.0.tgz#27c37ea26c205f28443402477ffd261311f21e36"
2889
+  integrity sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==
2890 2890
   dependencies:
2891 2891
     "@octokit/types" "^6.0.3"
2892 2892
 
@@ -2921,10 +2921,10 @@
2921 2921
     "@octokit/types" "^6.0.3"
2922 2922
     universal-user-agent "^6.0.0"
2923 2923
 
2924
-"@octokit/openapi-types@^10.1.5":
2925
-  version "10.1.5"
2926
-  resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-10.1.5.tgz#deafbec805896ae963d7d3846e70b18003cafda1"
2927
-  integrity sha512-OoShNYzhAU8p8JbGHe1rRs1GIErRtmN2230AQCJAjL5lc0AUU5OhppVe6693HIZ2eCBLUhoLPhnnnmQ5ASH7Wg==
2924
+"@octokit/openapi-types@^10.2.2":
2925
+  version "10.2.2"
2926
+  resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-10.2.2.tgz#6c1c839d7d169feabaf1d2a69c79439c75d979cd"
2927
+  integrity sha512-EVcXQ+ZrC04cg17AMg1ofocWMxHDn17cB66ZHgYc0eUwjFtxS0oBzkyw2VqIrHBwVgtfoYrq1WMQfQmMjUwthw==
2928 2928
 
2929 2929
 "@octokit/plugin-enterprise-rest@^6.0.1":
2930 2930
   version "6.0.1"
@@ -2939,11 +2939,11 @@
2939 2939
     "@octokit/types" "^2.0.1"
2940 2940
 
2941 2941
 "@octokit/plugin-paginate-rest@^2.16.0":
2942
-  version "2.16.2"
2943
-  resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.16.2.tgz#9ca5bebbaf3e6672b345502f89ae4ef3be6c2ddd"
2944
-  integrity sha512-WF5/MTPnFgYH6rMGuxBvbxX2S/3ygNWylakgD7njKES0Qwk5e+d/L6r/BYXSw7B6xJJ3hlwIAmUmOxxYrR+Q8A==
2942
+  version "2.16.3"
2943
+  resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.16.3.tgz#6dbf74a12a53e04da6ca731d4c93f20c0b5c6fe9"
2944
+  integrity sha512-kdc65UEsqze/9fCISq6BxLzeB9qf0vKvKojIfzgwf4tEF+Wy6c9dXnPFE6vgpoDFB1Z5Jek5WFVU6vL1w22+Iw==
2945 2945
   dependencies:
2946
-    "@octokit/types" "^6.27.2"
2946
+    "@octokit/types" "^6.28.1"
2947 2947
 
2948 2948
 "@octokit/plugin-request-log@^1.0.0", "@octokit/plugin-request-log@^1.0.4":
2949 2949
   version "1.0.4"
@@ -2959,11 +2959,11 @@
2959 2959
     deprecation "^2.3.1"
2960 2960
 
2961 2961
 "@octokit/plugin-rest-endpoint-methods@^5.9.0":
2962
-  version "5.10.3"
2963
-  resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.10.3.tgz#9207e8e893d980d7828d85950bbb460b187146f2"
2964
-  integrity sha512-eAT4gje+VR9xdSlhuHWNXsNLpiODqdqz8jqShMgaxRH82Le2nS6EV6LAo3QPZ05Fso5oGmDfJF6eq9vs1cEhdA==
2962
+  version "5.10.4"
2963
+  resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.10.4.tgz#97e85eb7375e30b9bf193894670f9da205e79408"
2964
+  integrity sha512-Dh+EAMCYR9RUHwQChH94Skl0lM8Fh99auT8ggck/xTzjJrwVzvsd0YH68oRPqp/HxICzmUjLfaQ9sy1o1sfIiA==
2965 2965
   dependencies:
2966
-    "@octokit/types" "^6.27.2"
2966
+    "@octokit/types" "^6.28.1"
2967 2967
     deprecation "^2.3.1"
2968 2968
 
2969 2969
 "@octokit/request-error@^1.0.2":
@@ -3035,12 +3035,12 @@
3035 3035
   dependencies:
3036 3036
     "@types/node" ">= 8"
3037 3037
 
3038
-"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.27.2":
3039
-  version "6.27.2"
3040
-  resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.27.2.tgz#b6f88d002aa06104f46ccaec0aaa8a5de1bf262c"
3041
-  integrity sha512-AgajmAJh7LhStgaEaNoY1N7znst2q07CKZVdnVB/V4tmitMbk+qijmD0IkkSKulXE5RVLbJjQikJF9+XLqhsVA==
3038
+"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.28.1":
3039
+  version "6.28.1"
3040
+  resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.28.1.tgz#ab990d1fe952226055e81c7650480e6bacfb877c"
3041
+  integrity sha512-XlxDoQLFO5JnFZgKVQTYTvXRsQFfr/GwDUU108NJ9R5yFPkA2qXhTJjYuul3vE4eLXP40FA2nysOu2zd6boE+w==
3042 3042
   dependencies:
3043
-    "@octokit/openapi-types" "^10.1.5"
3043
+    "@octokit/openapi-types" "^10.2.2"
3044 3044
 
3045 3045
 "@panva/asn1.js@^1.0.0":
3046 3046
   version "1.0.0"
@@ -3576,10 +3576,15 @@
3576 3576
   resolved "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.3.tgz#1185726610acc37317ddab11c3c7f9066966bd20"
3577 3577
   integrity sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg==
3578 3578
 
3579
+"@stitches/core@^1.2.0":
3580
+  version "1.2.0"
3581
+  resolved "https://registry.yarnpkg.com/@stitches/core/-/core-1.2.0.tgz#5d507e1d27af1363265dbfdfd419d8e11262efce"
3582
+  integrity sha512-UjZHg9aWpqnRGtyewmNFEwtceRAiK7O1CjAGTBtN9bbw2N02SRZFYCTLUMxpFZi4J7juBQJKxbc7yvi+Y4Qg2g==
3583
+
3579 3584
 "@stitches/react@^1.0.0":
3580
-  version "1.1.0"
3581
-  resolved "https://registry.yarnpkg.com/@stitches/react/-/react-1.1.0.tgz#49342e085528d689b983682e112b79c5a0b0efb4"
3582
-  integrity sha512-g1XZsmB3tFL5i9aaBx0+P4C83j3vf/PEmLc5e9PlumE5c6q3zsdbbOVr4ZC52eGm4MCvM+2bbAJ++rtTUa6ahw==
3585
+  version "1.2.0"
3586
+  resolved "https://registry.yarnpkg.com/@stitches/react/-/react-1.2.0.tgz#cdb69256d76bcb4753417d59bc42da21fd603ba1"
3587
+  integrity sha512-GuMh610X3oJB2pdywARg1jccjAEvrDbq4iwy1SernR/4o1FX5SOTJZIjC4CquagZQjL00KFV8Cwfq/12FS6aBg==
3583 3588
 
3584 3589
 "@surma/rollup-plugin-off-main-thread@^1.4.1":
3585 3590
   version "1.4.2"
@@ -3762,14 +3767,14 @@
3762 3767
   integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==
3763 3768
 
3764 3769
 "@types/node@*", "@types/node@>= 8", "@types/node@^16.7.10":
3765
-  version "16.9.1"
3766
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-16.9.1.tgz#0611b37db4246c937feef529ddcc018cf8e35708"
3767
-  integrity sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==
3770
+  version "16.9.4"
3771
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-16.9.4.tgz#a12f0ee7847cf17a97f6fdf1093cb7a9af23cca4"
3772
+  integrity sha512-KDazLNYAGIuJugdbULwFZULF9qQ13yNWEBFnfVpqlpgAAo6H/qnM9RjBgh0A0kmHf3XxAKLdN5mTIng9iUvVLA==
3768 3773
 
3769 3774
 "@types/node@^14.14.35":
3770
-  version "14.17.15"
3771
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.15.tgz#d5ebfb62a69074ebb85cbe0529ad917bb8f2bae8"
3772
-  integrity sha512-D1sdW0EcSCmNdLKBGMYb38YsHUS6JcM7yQ6sLQ9KuZ35ck7LYCKE7kYFHOO59ayFOY3zobWVZxf4KXhYHcHYFA==
3775
+  version "14.17.17"
3776
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.17.tgz#4ec7b71bbcb01a4e55455b60b18b1b6a783fe31d"
3777
+  integrity sha512-niAjcewgEYvSPCZm3OaM9y6YQrL2SEPH9PymtE6fuZAvFiP6ereCcvApGl2jKTq7copTIguX3PBvfP08LN4LvQ==
3773 3778
 
3774 3779
 "@types/node@^15.0.1":
3775 3780
   version "15.14.9"
@@ -3796,7 +3801,14 @@
3796 3801
   resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11"
3797 3802
   integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==
3798 3803
 
3799
-"@types/react-dom@^17.0.2", "@types/react-dom@^17.0.9":
3804
+"@types/react-dom@^16.9.9":
3805
+  version "16.9.14"
3806
+  resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.14.tgz#674b8f116645fe5266b40b525777fc6bb8eb3bcd"
3807
+  integrity sha512-FIX2AVmPTGP30OUJ+0vadeIFJJ07Mh1m+U0rxfgyW34p3rTlXI+nlenvAxNn4BP36YyI9IJ/+UJ7Wu22N1pI7A==
3808
+  dependencies:
3809
+    "@types/react" "^16"
3810
+
3811
+"@types/react-dom@^17.0.9":
3800 3812
   version "17.0.9"
3801 3813
   resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.9.tgz#441a981da9d7be117042e1a6fd3dac4b30f55add"
3802 3814
   integrity sha512-wIvGxLfgpVDSAMH5utdL9Ngm5Owu0VsGmldro3ORLXV8CShrL8awVj06NuEXFQ5xyaYfdca7Sgbk/50Ri1GdPg==
@@ -3804,9 +3816,9 @@
3804 3816
     "@types/react" "*"
3805 3817
 
3806 3818
 "@types/react-router-dom@^5.1.8":
3807
-  version "5.1.8"
3808
-  resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.1.8.tgz#bf3e1c8149b3d62eaa206d58599de82df0241192"
3809
-  integrity sha512-03xHyncBzG0PmDmf8pf3rehtjY0NpUj7TIN46FrT5n1ZWHPZvXz32gUyNboJ+xsL8cpg8bQVLcllptcQHvocrw==
3819
+  version "5.1.9"
3820
+  resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.1.9.tgz#e8a8f687351ecc8c68bb4161d7e4b9df4994416e"
3821
+  integrity sha512-Go0vxZSigXTyXx8xPkGiBrrc3YbBs82KE14WENMLS6TSUKcRFSmYVbL19zFOnNFqJhqrPqEs2h5eUpJhSRrwZw==
3810 3822
   dependencies:
3811 3823
     "@types/history" "*"
3812 3824
     "@types/react" "*"
@@ -3820,10 +3832,19 @@
3820 3832
     "@types/history" "*"
3821 3833
     "@types/react" "*"
3822 3834
 
3823
-"@types/react@*", "@types/react@^17.0.16", "@types/react@^17.0.19", "@types/react@^17.0.3":
3824
-  version "17.0.20"
3825
-  resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.20.tgz#a4284b184d47975c71658cd69e759b6bd37c3b8c"
3826
-  integrity sha512-wWZrPlihslrPpcKyCSlmIlruakxr57/buQN1RjlIeaaTWDLtJkTtRW429MoQJergvVKc4IWBpRhWw7YNh/7GVA==
3835
+"@types/react@*", "@types/react@^17.0.19":
3836
+  version "17.0.21"
3837
+  resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.21.tgz#069c43177cd419afaab5ce26bb4e9056549f7ea6"
3838
+  integrity sha512-GzzXCpOthOjXvrAUFQwU/svyxu658cwu00Q9ugujS4qc1zXgLFaO0kS2SLOaMWLt2Jik781yuHCWB7UcYdGAeQ==
3839
+  dependencies:
3840
+    "@types/prop-types" "*"
3841
+    "@types/scheduler" "*"
3842
+    csstype "^3.0.2"
3843
+
3844
+"@types/react@^16", "@types/react@^16.9.55":
3845
+  version "16.14.15"
3846
+  resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.15.tgz#95d8fa3148050e94bcdc5751447921adbe19f9e6"
3847
+  integrity sha512-jOxlBV9RGZhphdeqJTCv35VZOkjY+XIEY2owwSk84BNDdDv2xS6Csj6fhi+B/q30SR9Tz8lDNt/F2Z5RF3TrRg==
3827 3848
   dependencies:
3828 3849
     "@types/prop-types" "*"
3829 3850
     "@types/scheduler" "*"
@@ -3982,17 +4003,17 @@
3982 4003
     "@typescript-eslint/types" "4.31.1"
3983 4004
     eslint-visitor-keys "^2.0.0"
3984 4005
 
3985
-"@use-gesture/core@^10.0.0-beta.25":
3986
-  version "10.0.0-beta.25"
3987
-  resolved "https://registry.yarnpkg.com/@use-gesture/core/-/core-10.0.0-beta.25.tgz#4e652cb5ef679bd04a213ef0952d9e95a48960ef"
3988
-  integrity sha512-of0lh9pMjsps6Xxn9CqLd8dJynpWvqvHMmhcY8HelLopEDAKusCSM2ACrx+gR83hBKjYrmJBXuwfMLUebZFCrA==
4006
+"@use-gesture/core@^10.0.0-beta.26":
4007
+  version "10.0.0-beta.26"
4008
+  resolved "https://registry.yarnpkg.com/@use-gesture/core/-/core-10.0.0-beta.26.tgz#275a69ed65c6463cb59872a6f0b24b66212e8bf5"
4009
+  integrity sha512-Y+fwWlYHzGlc/c4aE3fUkQy7cE4+Tbd1CWQqAlO4czN2nGpgZksW7V98FMgCHrmMGXi+VdNSTS8WBHmw8kq3Zg==
3989 4010
 
3990 4011
 "@use-gesture/react@^10.0.0-beta.24":
3991
-  version "10.0.0-beta.25"
3992
-  resolved "https://registry.yarnpkg.com/@use-gesture/react/-/react-10.0.0-beta.25.tgz#f3034aa4fb539fefec7b44468265238b92a89594"
3993
-  integrity sha512-bXwlYRP503Tl6iK+WxVH9Tm/S5C7lBSdKWgahEKcV6N0NKqCVkkMqz1Nrbmd51Hrexa4JGpoxNvZ7tzrVDfedw==
4012
+  version "10.0.0-beta.26"
4013
+  resolved "https://registry.yarnpkg.com/@use-gesture/react/-/react-10.0.0-beta.26.tgz#9b5c3a9111d6cda62de125612fb830efcc1df571"
4014
+  integrity sha512-TENwg1CgB+okRTBWvcMtEaKYgQvktU0ezG4sQdo/mqZXNvTzuk9g/qK4v++8UzIhj/srqRp49NPBbY0qzsgg1w==
3994 4015
   dependencies:
3995
-    "@use-gesture/core" "^10.0.0-beta.25"
4016
+    "@use-gesture/core" "^10.0.0-beta.26"
3996 4017
 
3997 4018
 "@zkochan/cmd-shim@^3.1.0":
3998 4019
   version "3.1.0"
@@ -4167,9 +4188,9 @@ ansi-regex@^4.1.0:
4167 4188
   integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
4168 4189
 
4169 4190
 ansi-regex@^5.0.0:
4170
-  version "5.0.0"
4171
-  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
4172
-  integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
4191
+  version "5.0.1"
4192
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
4193
+  integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
4173 4194
 
4174 4195
 ansi-styles@^2.2.1:
4175 4196
   version "2.2.1"
@@ -4298,7 +4319,7 @@ array-ify@^1.0.0:
4298 4319
   resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece"
4299 4320
   integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=
4300 4321
 
4301
-array-includes@^3.1.1, array-includes@^3.1.2, array-includes@^3.1.3:
4322
+array-includes@^3.1.1, array-includes@^3.1.3:
4302 4323
   version "3.1.3"
4303 4324
   resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a"
4304 4325
   integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==
@@ -4999,9 +5020,9 @@ camelcase@^6.2.0:
4999 5020
   integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==
5000 5021
 
5001 5022
 caniuse-lite@^1.0.30001202, caniuse-lite@^1.0.30001219, caniuse-lite@^1.0.30001228, caniuse-lite@^1.0.30001254:
5002
-  version "1.0.30001257"
5003
-  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001257.tgz#150aaf649a48bee531104cfeda57f92ce587f6e5"
5004
-  integrity sha512-JN49KplOgHSXpIsVSF+LUyhD8PUp6xPpAXeRrrcBh4KBeP7W864jHn6RvzJgDlrReyeVjMFJL3PLpPvKIxlIHA==
5023
+  version "1.0.30001258"
5024
+  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001258.tgz#b604eed80cc54a578e4bf5a02ae3ed49f869d252"
5025
+  integrity sha512-RBByOG6xWXUp0CR2/WU2amXz3stjKpSl5J1xU49F1n2OxD//uBZO4wCKUiG+QMGf7CHGfDDcqoKriomoGVxTeA==
5005 5026
 
5006 5027
 caseless@~0.12.0:
5007 5028
   version "0.12.0"
@@ -5539,17 +5560,17 @@ copy-descriptor@^0.1.0:
5539 5560
   integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
5540 5561
 
5541 5562
 core-js-compat@^3.14.0, core-js-compat@^3.16.0:
5542
-  version "3.17.3"
5543
-  resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.17.3.tgz#b39c8e4dec71ecdc735c653ce5233466e561324e"
5544
-  integrity sha512-+in61CKYs4hQERiADCJsdgewpdl/X0GhEX77pjKgbeibXviIt2oxEjTc8O2fqHX8mDdBrDvX8MYD/RYsBv4OiA==
5563
+  version "3.18.0"
5564
+  resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.18.0.tgz#fb360652201e8ac8da812718c008cd0482ed9b42"
5565
+  integrity sha512-tRVjOJu4PxdXjRMEgbP7lqWy1TWJu9a01oBkn8d+dNrhgmBwdTkzhHZpVJnEmhISLdoJI1lX08rcBcHi3TZIWg==
5545 5566
   dependencies:
5546 5567
     browserslist "^4.17.0"
5547 5568
     semver "7.0.0"
5548 5569
 
5549 5570
 core-js-pure@^3.16.0:
5550
-  version "3.17.3"
5551
-  resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.17.3.tgz#98ea3587188ab7ef4695db6518eeb71aec42604a"
5552
-  integrity sha512-YusrqwiOTTn8058JDa0cv9unbXdIiIgcgI9gXso0ey4WgkFLd3lYlV9rp9n7nDCsYxXsMDTjA4m1h3T348mdlQ==
5571
+  version "3.18.0"
5572
+  resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.18.0.tgz#e5187347bae66448c9e2d67c01c34c4df3261dc5"
5573
+  integrity sha512-ZnK+9vyuMhKulIGqT/7RHGRok8RtkHMEX/BGPHkHx+ouDkq+MUvf9mfIgdqhpmPDu8+V5UtRn/CbCRc9I4lX4w==
5553 5574
 
5554 5575
 core-js@^2.5.3:
5555 5576
   version "2.6.12"
@@ -5771,9 +5792,9 @@ data-urls@^2.0.0:
5771 5792
     whatwg-url "^8.0.0"
5772 5793
 
5773 5794
 date-fns@^2.16.1:
5774
-  version "2.23.0"
5775
-  resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.23.0.tgz#4e886c941659af0cf7b30fafdd1eaa37e88788a9"
5776
-  integrity sha512-5ycpauovVyAk0kXNZz6ZoB9AYMZB4DObse7P3BPWmyEjXNORTI8EJ6X0uaSAq4sCHzM1uajzrkr6HnsLQpxGXA==
5795
+  version "2.24.0"
5796
+  resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.24.0.tgz#7d86dc0d93c87b76b63d213b4413337cfd1c105d"
5797
+  integrity sha512-6ujwvwgPID6zbI0o7UbURi2vlLDR9uP26+tW6Lg+Ji3w7dd0i3DOcjcClLjLPranT60SSEFBwdSyYwn/ZkPIuw==
5777 5798
 
5778 5799
 dateformat@^3.0.0:
5779 5800
   version "3.0.3"
@@ -6094,9 +6115,9 @@ ejs@^2.6.1:
6094 6115
   integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
6095 6116
 
6096 6117
 electron-to-chromium@^1.3.723, electron-to-chromium@^1.3.830:
6097
-  version "1.3.838"
6098
-  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.838.tgz#d178b34a268c750c0444ba69e4c94d4c4fb3aa0d"
6099
-  integrity sha512-65O6UJiyohFAdX/nc6KJ0xG/4zOn7XCO03kQNNbCeMRGxlWTLzc6Uyi0tFNQuuGWqySZJi8CD2KXPXySVYmzMA==
6118
+  version "1.3.843"
6119
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.843.tgz#671489bd2f59fd49b76adddc1aa02c88cd38a5c0"
6120
+  integrity sha512-OWEwAbzaVd1Lk9MohVw8LxMXFlnYd9oYTYxfX8KS++kLLjDfbovLOcEEXwRhG612dqGQ6+44SZvim0GXuBRiKg==
6100 6121
 
6101 6122
 elliptic@^6.5.3:
6102 6123
   version "6.5.4"
@@ -6370,9 +6391,9 @@ eslint-plugin-react-hooks@^4.2.0:
6370 6391
   integrity sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==
6371 6392
 
6372 6393
 eslint-plugin-react@^7.23.1:
6373
-  version "7.25.1"
6374
-  resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.25.1.tgz#9286b7cd9bf917d40309760f403e53016eda8331"
6375
-  integrity sha512-P4j9K1dHoFXxDNP05AtixcJEvIT6ht8FhYKsrkY0MPCPaUMYijhpWwNiRDZVtA8KFuZOkGSeft6QwH8KuVpJug==
6394
+  version "7.25.2"
6395
+  resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.25.2.tgz#d567a217d306b76dd110561f28074e2328ae38f8"
6396
+  integrity sha512-elx4585wgmryanJK4C5IoSKQyVZ+e7H0t2JOOtJNBql0cuercvSShvRReuLBbfx8687yW5yv+UL7pXwMsd6adQ==
6376 6397
   dependencies:
6377 6398
     array-includes "^3.1.3"
6378 6399
     array.prototype.flatmap "^1.2.4"
@@ -8809,11 +8830,11 @@ jsprim@^1.2.2:
8809 8830
     verror "1.10.0"
8810 8831
 
8811 8832
 "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.1.0:
8812
-  version "3.2.0"
8813
-  resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz#41108d2cec408c3453c1bbe8a4aae9e1e2bd8f82"
8814
-  integrity sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==
8833
+  version "3.2.1"
8834
+  resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz#720b97bfe7d901b927d87c3773637ae8ea48781b"
8835
+  integrity sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==
8815 8836
   dependencies:
8816
-    array-includes "^3.1.2"
8837
+    array-includes "^3.1.3"
8817 8838
     object.assign "^4.1.2"
8818 8839
 
8819 8840
 jwa@^1.4.1:
@@ -9318,9 +9339,9 @@ map-obj@^2.0.0:
9318 9339
   integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk=
9319 9340
 
9320 9341
 map-obj@^4.0.0:
9321
-  version "4.2.1"
9322
-  resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.2.1.tgz#e4ea399dbc979ae735c83c863dd31bdf364277b7"
9323
-  integrity sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==
9342
+  version "4.3.0"
9343
+  resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a"
9344
+  integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==
9324 9345
 
9325 9346
 map-visit@^1.0.0:
9326 9347
   version "1.0.0"
@@ -9329,10 +9350,10 @@ map-visit@^1.0.0:
9329 9350
   dependencies:
9330 9351
     object-visit "^1.0.0"
9331 9352
 
9332
-marked@^3.0.3:
9333
-  version "3.0.3"
9334
-  resolved "https://registry.yarnpkg.com/marked/-/marked-3.0.3.tgz#d81ff0f9e29cef0a177327fe009b460f31aa5862"
9335
-  integrity sha512-4oIDhVSQ2s+xNCfek9OnZgCQR/WykGCom02JzIIvi4Pme+MIwPYqvGVW8CQWOXeoZu0TtVB6pTxIuoLm+dKqDA==
9353
+marked@^3.0.4:
9354
+  version "3.0.4"
9355
+  resolved "https://registry.yarnpkg.com/marked/-/marked-3.0.4.tgz#b8a1539e5e05c6ea9e93f15c0bad1d54ce890406"
9356
+  integrity sha512-jBo8AOayNaEcvBhNobg6/BLhdsK3NvnKWJg33MAAPbvTWiG4QBn9gpW1+7RssrKu4K1dKlN+0goVQwV41xEfOA==
9336 9357
 
9337 9358
 md5.js@^1.3.4:
9338 9359
   version "1.3.5"
@@ -9566,9 +9587,9 @@ minipass@^2.3.5, minipass@^2.6.0, minipass@^2.9.0:
9566 9587
     yallist "^3.0.0"
9567 9588
 
9568 9589
 minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3:
9569
-  version "3.1.3"
9570
-  resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd"
9571
-  integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==
9590
+  version "3.1.5"
9591
+  resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.5.tgz#71f6251b0a33a49c01b3cf97ff77eda030dff732"
9592
+  integrity sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==
9572 9593
   dependencies:
9573 9594
     yallist "^4.0.0"
9574 9595
 
@@ -11108,7 +11129,7 @@ raw-body@2.4.1:
11108 11129
     iconv-lite "0.4.24"
11109 11130
     unpipe "1.0.0"
11110 11131
 
11111
-react-dom@17.0.2, react-dom@^17.0.2:
11132
+react-dom@17.0.2, "react-dom@^16.8 || ^17.0", react-dom@^17.0.2:
11112 11133
   version "17.0.2"
11113 11134
   resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23"
11114 11135
   integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==
@@ -11196,7 +11217,7 @@ react-style-singleton@^2.1.0:
11196 11217
     invariant "^2.2.4"
11197 11218
     tslib "^1.0.0"
11198 11219
 
11199
-react@17.0.2, react@^17.0.2:
11220
+react@17.0.2, react@>=16.8, react@^17.0.2:
11200 11221
   version "17.0.2"
11201 11222
   resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037"
11202 11223
   integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==
@@ -11401,14 +11422,14 @@ reflect-metadata@^0.1.13:
11401 11422
   resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08"
11402 11423
   integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==
11403 11424
 
11404
-regenerate-unicode-properties@^8.2.0:
11405
-  version "8.2.0"
11406
-  resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec"
11407
-  integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==
11425
+regenerate-unicode-properties@^9.0.0:
11426
+  version "9.0.0"
11427
+  resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326"
11428
+  integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==
11408 11429
   dependencies:
11409
-    regenerate "^1.4.0"
11430
+    regenerate "^1.4.2"
11410 11431
 
11411
-regenerate@^1.4.0:
11432
+regenerate@^1.4.2:
11412 11433
   version "1.4.2"
11413 11434
   resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
11414 11435
   integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
@@ -11447,26 +11468,26 @@ regexpp@^3.1.0:
11447 11468
   integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
11448 11469
 
11449 11470
 regexpu-core@^4.7.1:
11450
-  version "4.7.1"
11451
-  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6"
11452
-  integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==
11453
-  dependencies:
11454
-    regenerate "^1.4.0"
11455
-    regenerate-unicode-properties "^8.2.0"
11456
-    regjsgen "^0.5.1"
11457
-    regjsparser "^0.6.4"
11458
-    unicode-match-property-ecmascript "^1.0.4"
11459
-    unicode-match-property-value-ecmascript "^1.2.0"
11460
-
11461
-regjsgen@^0.5.1:
11471
+  version "4.8.0"
11472
+  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0"
11473
+  integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==
11474
+  dependencies:
11475
+    regenerate "^1.4.2"
11476
+    regenerate-unicode-properties "^9.0.0"
11477
+    regjsgen "^0.5.2"
11478
+    regjsparser "^0.7.0"
11479
+    unicode-match-property-ecmascript "^2.0.0"
11480
+    unicode-match-property-value-ecmascript "^2.0.0"
11481
+
11482
+regjsgen@^0.5.2:
11462 11483
   version "0.5.2"
11463 11484
   resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733"
11464 11485
   integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==
11465 11486
 
11466
-regjsparser@^0.6.4:
11467
-  version "0.6.9"
11468
-  resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.9.tgz#b489eef7c9a2ce43727627011429cf833a7183e6"
11469
-  integrity sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==
11487
+regjsparser@^0.7.0:
11488
+  version "0.7.0"
11489
+  resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968"
11490
+  integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==
11470 11491
   dependencies:
11471 11492
     jsesc "~0.5.0"
11472 11493
 
@@ -11880,7 +11901,7 @@ shell-quote@1.7.2:
11880 11901
   resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2"
11881 11902
   integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==
11882 11903
 
11883
-shiki@^0.9.10:
11904
+shiki@^0.9.11:
11884 11905
   version "0.9.11"
11885 11906
   resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.9.11.tgz#07d75dab2abb6dc12a01f79a397cb1c391fa22d8"
11886 11907
   integrity sha512-tjruNTLFhU0hruCPoJP0y+B9LKOmcqUhTpxn7pcJB3fa+04gFChuEmxmrUfOJ7ZO6Jd+HwMnDHgY3lv3Tqonuw==
@@ -11899,9 +11920,9 @@ side-channel@^1.0.4:
11899 11920
     object-inspect "^1.9.0"
11900 11921
 
11901 11922
 signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3:
11902
-  version "3.0.3"
11903
-  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
11904
-  integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
11923
+  version "3.0.4"
11924
+  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.4.tgz#366a4684d175b9cab2081e3681fda3747b6c51d7"
11925
+  integrity sha512-rqYhcAnZ6d/vTPGghdrw7iumdcbXpsk1b8IG/rz+VWV51DM0p7XCtMoJ3qhPLIbp3tvyt3pKRbaaEMZYpHto8Q==
11905 11926
 
11906 11927
 sisteransi@^1.0.5:
11907 11928
   version "1.0.5"
@@ -11985,9 +12006,9 @@ socks-proxy-agent@^5.0.0:
11985 12006
     socks "^2.3.3"
11986 12007
 
11987 12008
 socks-proxy-agent@^6.0.0:
11988
-  version "6.0.0"
11989
-  resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.0.0.tgz#9f8749cdc05976505fa9f9a958b1818d0e60573b"
11990
-  integrity sha512-FIgZbQWlnjVEQvMkylz64/rUggGtrKstPnx8OZyYFG0tAFR8CSBtpXxSwbFLHyeXFn/cunFL7MpuSOvDSOPo9g==
12009
+  version "6.1.0"
12010
+  resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.1.0.tgz#869cf2d7bd10fea96c7ad3111e81726855e285c3"
12011
+  integrity sha512-57e7lwCN4Tzt3mXz25VxOErJKXlPfXmkMLnk310v/jwW20jWRVcgsOit+xNkN3eIEdB47GwnfAEBLacZ/wVIKg==
11991 12012
   dependencies:
11992 12013
     agent-base "^6.0.2"
11993 12014
     debug "^4.3.1"
@@ -12186,9 +12207,9 @@ ssri@^8.0.0, ssri@^8.0.1:
12186 12207
     minipass "^3.1.1"
12187 12208
 
12188 12209
 stack-utils@^2.0.3:
12189
-  version "2.0.3"
12190
-  resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277"
12191
-  integrity sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==
12210
+  version "2.0.5"
12211
+  resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5"
12212
+  integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==
12192 12213
   dependencies:
12193 12214
     escape-string-regexp "^2.0.0"
12194 12215
 
@@ -13009,15 +13030,15 @@ typedarray@^0.0.6:
13009 13030
   integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
13010 13031
 
13011 13032
 typedoc@^0.22.3:
13012
-  version "0.22.3"
13013
-  resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.22.3.tgz#c67aaeef22702d84267bda12dc13f192dbf9d89e"
13014
-  integrity sha512-EOWf9Vf3Vfb/jzBzr87uoLybQw9fx3iyXLUcpQn9F2Ks1/ZJN9iGeBbYRU+VNqrWvV4T+aS7Ife7GFEJUf0ohQ==
13033
+  version "0.22.4"
13034
+  resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.22.4.tgz#039ac59fcdb9a8674471dc20e1623efb12be4114"
13035
+  integrity sha512-M/a8NnPxq3/iZNNVjzFCK5gu4m//HTJIPbSS0JQVbkHJPP9wyepR12agylWTSqeVZe0xsbidVtO26+PP7iD/jw==
13015 13036
   dependencies:
13016 13037
     glob "^7.1.7"
13017 13038
     lunr "^2.3.9"
13018
-    marked "^3.0.3"
13039
+    marked "^3.0.4"
13019 13040
     minimatch "^3.0.4"
13020
-    shiki "^0.9.10"
13041
+    shiki "^0.9.11"
13021 13042
 
13022 13043
 typeorm@^0.2.30:
13023 13044
   version "0.2.37"
@@ -13091,28 +13112,28 @@ unbox-primitive@^1.0.1:
13091 13112
     has-symbols "^1.0.2"
13092 13113
     which-boxed-primitive "^1.0.2"
13093 13114
 
13094
-unicode-canonical-property-names-ecmascript@^1.0.4:
13095
-  version "1.0.4"
13096
-  resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
13097
-  integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==
13115
+unicode-canonical-property-names-ecmascript@^2.0.0:
13116
+  version "2.0.0"
13117
+  resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc"
13118
+  integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==
13098 13119
 
13099
-unicode-match-property-ecmascript@^1.0.4:
13100
-  version "1.0.4"
13101
-  resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c"
13102
-  integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==
13120
+unicode-match-property-ecmascript@^2.0.0:
13121
+  version "2.0.0"
13122
+  resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3"
13123
+  integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==
13103 13124
   dependencies:
13104
-    unicode-canonical-property-names-ecmascript "^1.0.4"
13105
-    unicode-property-aliases-ecmascript "^1.0.4"
13125
+    unicode-canonical-property-names-ecmascript "^2.0.0"
13126
+    unicode-property-aliases-ecmascript "^2.0.0"
13106 13127
 
13107
-unicode-match-property-value-ecmascript@^1.2.0:
13108
-  version "1.2.0"
13109
-  resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531"
13110
-  integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==
13128
+unicode-match-property-value-ecmascript@^2.0.0:
13129
+  version "2.0.0"
13130
+  resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714"
13131
+  integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==
13111 13132
 
13112
-unicode-property-aliases-ecmascript@^1.0.4:
13113
-  version "1.1.0"
13114
-  resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4"
13115
-  integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==
13133
+unicode-property-aliases-ecmascript@^2.0.0:
13134
+  version "2.0.0"
13135
+  resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8"
13136
+  integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==
13116 13137
 
13117 13138
 union-value@^1.0.0:
13118 13139
   version "1.0.1"

Loading…
Cancel
Save