@tldraw/tldraw 5.0.1 → 5.1.0-canary.0c9c9b6282a5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist-cjs/index.js CHANGED
@@ -19,7 +19,7 @@ var import_tldraw = require("tldraw");
19
19
  __reExport(index_exports, require("tldraw"), module.exports);
20
20
  (0, import_tldraw.registerTldrawLibraryVersion)(
21
21
  "@tldraw/tldraw",
22
- "5.0.1",
22
+ "5.1.0-canary.0c9c9b6282a5",
23
23
  "cjs"
24
24
  );
25
25
  //# sourceMappingURL=index.js.map
@@ -2,7 +2,7 @@ import { registerTldrawLibraryVersion } from "tldraw";
2
2
  export * from "tldraw";
3
3
  registerTldrawLibraryVersion(
4
4
  "@tldraw/tldraw",
5
- "5.0.1",
5
+ "5.1.0-canary.0c9c9b6282a5",
6
6
  "esm"
7
7
  );
8
8
  //# sourceMappingURL=index.mjs.map
package/package.json CHANGED
@@ -1,73 +1,73 @@
1
1
  {
2
- "name": "@tldraw/tldraw",
3
- "description": "A tiny little drawing editor.",
4
- "version": "5.0.1",
5
- "author": {
6
- "name": "tldraw Inc.",
7
- "email": "hello@tldraw.com"
8
- },
9
- "homepage": "https://tldraw.dev",
10
- "license": "SEE LICENSE IN LICENSE.md",
11
- "repository": {
12
- "type": "git",
13
- "url": "https://github.com/tldraw/tldraw"
14
- },
15
- "bugs": {
16
- "url": "https://github.com/tldraw/tldraw/issues"
17
- },
18
- "keywords": [
19
- "tldraw",
20
- "sdk",
21
- "drawing",
22
- "app",
23
- "development",
24
- "whiteboard",
25
- "canvas",
26
- "infinite"
27
- ],
28
- "main": "dist-cjs/index.js",
29
- "scripts": {
30
- "test-ci": "yarn run -T vitest run --passWithNoTests",
31
- "test": "yarn run -T vitest --passWithNoTests",
32
- "test-coverage": "yarn run -T vitest run --coverage --passWithNoTests",
33
- "predev": "node ./scripts/copy-css-files.mjs",
34
- "dev": "chokidar '../tldraw/tldraw.css' -c 'node ./scripts/copy-css-files.mjs'",
35
- "prebuild": "node ./scripts/copy-css-files.mjs",
36
- "build": "yarn run -T tsx ../../internal/scripts/build-package.ts",
37
- "build-api": "yarn run -T tsx ../../internal/scripts/build-api.ts",
38
- "prepack": "yarn run -T tsx ../../internal/scripts/prepack.ts",
39
- "postpack": "../../internal/scripts/postpack.sh",
40
- "pack-tarball": "yarn pack",
41
- "lint": "yarn run -T tsx ../../internal/scripts/lint.ts"
42
- },
43
- "files": [
44
- "tldraw.css",
45
- "dist-esm",
46
- "dist-cjs",
47
- "src"
48
- ],
49
- "dependencies": {
50
- "tldraw": "5.0.1"
51
- },
52
- "peerDependencies": {
53
- "react": "^18.2.0 || ^19.2.1",
54
- "react-dom": "^18.2.0 || ^19.2.1"
55
- },
56
- "devDependencies": {
57
- "@types/react": "^19.2.7",
58
- "@types/react-dom": "^19.2.3",
59
- "chokidar-cli": "^3.0.0",
60
- "lazyrepo": "0.0.0-alpha.27",
61
- "react": "^19.2.1",
62
- "react-dom": "^19.2.1"
63
- },
64
- "module": "dist-esm/index.mjs",
65
- "source": "src/index.ts",
66
- "exports": {
67
- ".": {
68
- "import": "./dist-esm/index.mjs",
69
- "require": "./dist-cjs/index.js"
70
- },
71
- "./tldraw.css": "./tldraw.css"
72
- }
2
+ "name": "@tldraw/tldraw",
3
+ "description": "A tiny little drawing editor.",
4
+ "version": "5.1.0-canary.0c9c9b6282a5",
5
+ "author": {
6
+ "name": "tldraw Inc.",
7
+ "email": "hello@tldraw.com"
8
+ },
9
+ "homepage": "https://tldraw.dev",
10
+ "license": "SEE LICENSE IN LICENSE.md",
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/tldraw/tldraw"
14
+ },
15
+ "bugs": {
16
+ "url": "https://github.com/tldraw/tldraw/issues"
17
+ },
18
+ "keywords": [
19
+ "tldraw",
20
+ "sdk",
21
+ "drawing",
22
+ "app",
23
+ "development",
24
+ "whiteboard",
25
+ "canvas",
26
+ "infinite"
27
+ ],
28
+ "main": "dist-cjs/index.js",
29
+ "scripts": {
30
+ "test-ci": "yarn run -T vitest run --passWithNoTests",
31
+ "test": "yarn run -T vitest --passWithNoTests",
32
+ "test-coverage": "yarn run -T vitest run --coverage --passWithNoTests",
33
+ "predev": "node ./scripts/copy-css-files.mjs",
34
+ "dev": "chokidar '../tldraw/tldraw.css' -c 'node ./scripts/copy-css-files.mjs'",
35
+ "prebuild": "node ./scripts/copy-css-files.mjs",
36
+ "build": "yarn run -T tsx ../../internal/scripts/build-package.ts",
37
+ "build-api": "yarn run -T tsx ../../internal/scripts/build-api.ts",
38
+ "prepack": "yarn run -T tsx ../../internal/scripts/prepack.ts",
39
+ "postpack": "../../internal/scripts/postpack.sh",
40
+ "pack-tarball": "yarn pack",
41
+ "lint": "yarn run -T tsx ../../internal/scripts/lint.ts"
42
+ },
43
+ "files": [
44
+ "tldraw.css",
45
+ "dist-esm",
46
+ "dist-cjs",
47
+ "src"
48
+ ],
49
+ "dependencies": {
50
+ "tldraw": "workspace:*"
51
+ },
52
+ "peerDependencies": {
53
+ "react": "^18.2.0 || ^19.2.1",
54
+ "react-dom": "^18.2.0 || ^19.2.1"
55
+ },
56
+ "devDependencies": {
57
+ "@types/react": "^19.2.7",
58
+ "@types/react-dom": "^19.2.3",
59
+ "chokidar-cli": "^3.0.0",
60
+ "lazyrepo": "0.0.0-alpha.27",
61
+ "react": "^19.2.1",
62
+ "react-dom": "^19.2.1"
63
+ },
64
+ "module": "dist-esm/index.mjs",
65
+ "source": "src/index.ts",
66
+ "exports": {
67
+ ".": {
68
+ "import": "./dist-esm/index.mjs",
69
+ "require": "./dist-cjs/index.js"
70
+ },
71
+ "./tldraw.css": "./tldraw.css"
72
+ }
73
73
  }
package/tldraw.css CHANGED
@@ -1634,6 +1634,10 @@ it from receiving any pointer events or affecting the cursor. */
1634
1634
  font-size: 12px;
1635
1635
  flex-grow: 2;
1636
1636
  text-align: start;
1637
+ min-width: 0;
1638
+ overflow: hidden;
1639
+ text-overflow: ellipsis;
1640
+ white-space: nowrap;
1637
1641
  }
1638
1642
 
1639
1643
  /*
@@ -1885,6 +1889,11 @@ it from receiving any pointer events or affecting the cursor. */
1885
1889
  text-align: center;
1886
1890
  }
1887
1891
 
1892
+ .tlui-zoom-menu__button[data-state='open']::after {
1893
+ background: linear-gradient(0deg, rgba(144, 144, 144, 0) 0%, var(--tl-color-muted-2) 100%);
1894
+ opacity: 1;
1895
+ }
1896
+
1888
1897
  /* --------------------- Layout --------------------- */
1889
1898
 
1890
1899
  .tlui-layout {
@@ -2337,237 +2346,250 @@ it from receiving any pointer events or affecting the cursor. */
2337
2346
  /* ------------------- Page Select ------------------ */
2338
2347
 
2339
2348
  .tlui-page-menu__wrapper {
2340
- position: relative;
2341
2349
  display: flex;
2342
2350
  flex-direction: column;
2343
- width: 260px;
2344
- height: fit-content;
2345
- max-height: 50vh;
2351
+ width: 220px;
2346
2352
  }
2347
2353
 
2348
2354
  .tlui-page-menu__trigger {
2349
2355
  width: auto;
2350
2356
  }
2351
2357
 
2352
- .tlui-page-menu__header {
2353
- display: flex;
2354
- flex-direction: row;
2355
- align-items: center;
2356
- width: 100%;
2357
- height: 40px;
2358
- padding-inline-start: var(--tl-space-4);
2359
- border-bottom: 1px solid var(--tl-color-divider);
2358
+ .tlui-page-menu__trigger[data-state='open']::after {
2359
+ background: linear-gradient(180deg, rgba(144, 144, 144, 0) 0%, var(--tl-color-muted-2) 100%);
2360
+ opacity: 1;
2360
2361
  }
2361
2362
 
2362
- .tlui-page-menu__header > .tlui-button:nth-of-type(1) {
2363
- margin-right: -4px;
2363
+ .tlui-page-menu__list {
2364
+ flex: 0 0 auto;
2365
+ overflow-x: hidden;
2366
+ overflow-y: auto;
2367
+ scrollbar-width: none;
2368
+ -ms-overflow-style: none;
2364
2369
  }
2365
2370
 
2366
- .tlui-page-menu__header__title {
2367
- color: var(--tl-color-text);
2368
- font-size: 12px;
2369
- flex-grow: 2;
2371
+ .tlui-page-menu__list::-webkit-scrollbar {
2372
+ display: none;
2370
2373
  }
2371
2374
 
2372
- .tlui-page-menu__name {
2373
- flex-grow: 2;
2374
- text-align: start;
2375
+ .tlui-page-menu__list__content {
2376
+ position: relative;
2375
2377
  overflow: hidden;
2376
- text-overflow: ellipsis;
2377
- white-space: nowrap;
2378
2378
  }
2379
2379
 
2380
- .tlui-page-menu__list {
2380
+ .tlui-page-menu__resize-handle {
2381
+ flex: 0 0 auto;
2381
2382
  position: relative;
2382
- touch-action: auto;
2383
- flex-direction: column;
2384
- max-height: 100%;
2385
- overflow-x: hidden;
2386
- overflow-y: auto;
2387
- touch-action: auto;
2383
+ height: 1px;
2384
+ cursor: ns-resize;
2385
+ touch-action: none;
2386
+ background: var(--tl-color-divider);
2387
+ transition: background-color ease-in-out 150ms 80ms;
2388
+ z-index: 999;
2388
2389
  }
2389
2390
 
2390
- .tlui-page-menu__item {
2391
- position: relative;
2391
+ /* Hit test area */
2392
+ .tlui-page-menu__resize-handle::after {
2393
+ content: '';
2394
+ position: absolute;
2395
+ inset: -4px 0;
2396
+ background: none;
2397
+ z-index: 2000;
2398
+ pointer-events: all;
2392
2399
  }
2393
2400
 
2394
- .tlui-page_menu__item__submenu[data-isediting='true'] > .tlui-button[data-state='open'] {
2395
- opacity: 1;
2401
+ /* Thick blue indicator */
2402
+ .tlui-page-menu__resize-handle::before {
2403
+ content: '';
2404
+ position: absolute;
2405
+ top: 0;
2406
+ left: 0;
2407
+ right: 0;
2408
+ height: 1.5px;
2409
+ background: transparent;
2410
+ pointer-events: none;
2411
+ z-index: 2001;
2396
2412
  }
2397
2413
 
2398
- @media (hover: hover) {
2399
- .tlui-page-menu__item:hover > .tlui-page_menu__item__submenu > .tlui-button {
2400
- opacity: 1;
2401
- }
2414
+ .tlui-page-menu__resize-handle[data-resizing='true']::before {
2415
+ background: var(--tl-color-selected);
2416
+ transition: none;
2402
2417
  }
2403
2418
 
2404
- .tlui-page-menu__item:nth-of-type(n + 2) {
2405
- margin-top: -4px;
2419
+ .tlui-page-menu__create-button {
2420
+ flex: 0 0 auto;
2421
+ margin: 0;
2406
2422
  }
2407
2423
 
2408
2424
  .tlui-page-menu__item__button {
2409
- width: 100%;
2410
- }
2411
-
2412
- .tlui-page-menu__item__button:not(:only-child) {
2413
- flex-grow: 2;
2414
- margin-inline-end: -2px;
2425
+ flex: 1 1 auto;
2426
+ min-width: 0px;
2415
2427
  }
2416
2428
 
2417
- .tlui-page-menu__item__button > span {
2418
- display: block;
2419
- flex-grow: 2;
2420
- text-align: start;
2421
- overflow: hidden;
2422
- text-overflow: ellipsis;
2423
- white-space: nowrap;
2429
+ .tlui-page-menu__item__button::after,
2430
+ .tlui-page-menu__item__drag-handle::after {
2431
+ content: none;
2424
2432
  }
2425
2433
 
2426
- .tlui-page-menu__item__button > span {
2434
+ .tlui-page-menu__item__button > .tlui-button__label {
2427
2435
  padding-inline-end: calc(40px - 12px);
2428
2436
  }
2429
2437
 
2430
- @media (hover: hover) {
2431
- .tlui-page-menu__item__button > span {
2432
- padding-inline-end: 0px;
2433
- }
2434
-
2435
- .tlui-page-menu__item:hover > .tlui-page-menu__item__button > span {
2436
- padding-inline-end: calc(40px - 12px);
2437
- }
2438
- }
2439
-
2440
- .tlui-page-menu__item__button__checkbox {
2441
- padding-inline-start: 35px;
2442
- }
2443
-
2444
- .tlui-page-menu__item__button__check {
2445
- position: absolute;
2446
- inset-inline-start: 0px;
2447
- width: 24px;
2448
- padding-inline-start: 10px;
2449
- display: inline-flex;
2450
- align-items: center;
2451
- justify-content: center;
2452
- color: var(--tl-color-text);
2453
- }
2454
-
2455
- .tlui-page_menu__item__sortable {
2438
+ .tlui-page-menu__item {
2456
2439
  position: absolute;
2457
2440
  top: 0px;
2458
2441
  inset-inline-start: 0px;
2459
2442
  width: 100%;
2460
- height: fit-content;
2443
+ height: 40px;
2461
2444
  display: flex;
2462
2445
  flex-direction: row;
2463
2446
  align-items: center;
2464
2447
  overflow: hidden;
2448
+ transition: transform 0.08s ease-out;
2449
+ }
2450
+
2451
+ .tlui-page-menu__item::before {
2452
+ content: '';
2453
+ position: absolute;
2454
+ inset: 4px;
2455
+ border-radius: var(--tl-radius-2);
2456
+ background: var(--tl-color-muted-2);
2457
+ opacity: 0;
2458
+ pointer-events: none;
2459
+ }
2460
+
2461
+ .tlui-page-menu__item > * {
2462
+ position: relative;
2465
2463
  z-index: var(--tl-layer-above);
2466
2464
  }
2467
2465
 
2468
- .tlui-page_menu__item__sortable__title {
2466
+ .tlui-page-menu__item[data-iscurrent='true']:not([data-editing='true'])::before {
2467
+ background: var(--tl-color-hint);
2468
+ opacity: 1;
2469
+ }
2470
+
2471
+ .tlui-page-menu__item__title {
2469
2472
  flex: 1;
2473
+ height: 40px;
2474
+ position: relative;
2470
2475
  }
2471
2476
 
2472
- .tlui-page_menu__item__sortable__title > .tlui-input__wrapper {
2477
+ .tlui-page-menu__item__title::before {
2478
+ content: '';
2479
+ position: absolute;
2480
+ inset: 4px;
2481
+ border-radius: var(--tl-radius-2);
2482
+ border: 1px solid var(--tl-color-primary);
2483
+ pointer-events: none;
2484
+ }
2485
+
2486
+ .tlui-page-menu__item__title > .tlui-input__wrapper {
2473
2487
  height: 100%;
2474
2488
  }
2475
2489
 
2476
- .tlui-page_menu__item__sortable:focus-visible {
2477
- z-index: var(--tl-layer-focused-input);
2490
+ .tlui-page-menu__item[data-dragging='true'],
2491
+ .tlui-page-menu__item[data-dragging='true'] .tlui-page-menu__item__button,
2492
+ .tlui-page-menu__item[data-dragging='true'] .tlui-page-menu__item__drag-handle {
2493
+ cursor: grabbing;
2494
+ transition: none;
2478
2495
  }
2479
2496
 
2480
- .tlui-page_menu__item__sortable__handle {
2481
- touch-action: none;
2482
- width: 32px;
2483
- min-width: 0px;
2484
- height: 40px;
2485
- cursor: grab;
2497
+ .tlui-page-menu__item[data-dragging='true'] {
2498
+ background: var(--tl-color-panel);
2499
+ opacity: 1;
2500
+ }
2501
+
2502
+ .tlui-page-menu__item__drag-handle {
2503
+ flex: 0 0 32px;
2504
+ min-width: 32px;
2505
+ padding: 0px;
2486
2506
  color: var(--tl-color-text-3);
2487
- flex-shrink: 0;
2488
- margin-inline-end: -9px;
2507
+ cursor: grab;
2508
+ touch-action: none;
2489
2509
  }
2490
2510
 
2491
- .tlui-page_menu__item__sortable__handle:active {
2492
- cursor: grabbing;
2511
+ .tlui-page-menu__item__drag-handle > .tlui-icon {
2512
+ position: relative;
2513
+ inset-inline-start: 1px;
2514
+ }
2515
+
2516
+ .tlui-page-menu__item__drag-handle + .tlui-page-menu__item__button {
2517
+ padding-inline-start: 0px;
2493
2518
  }
2494
2519
 
2495
2520
  .tlui-page-menu__item__input {
2496
2521
  margin-inline-start: 12px;
2497
- height: 100%;
2498
2522
  }
2499
2523
 
2500
- /* The more menu has complex CSS here: */
2501
- /* If the user can hover, then visible but opacity zero until hover */
2502
- /* If the user cannot hover, then not displayed unless editing, and then opacity 1 */
2503
-
2504
- .tlui-page_menu__item__submenu {
2505
- pointer-events: all;
2524
+ .tlui-page-menu__item__submenu {
2506
2525
  position: absolute;
2507
2526
  inset-inline-end: 0px;
2508
2527
  top: 0px;
2509
2528
  height: 100%;
2510
- cursor: pointer;
2511
- margin: 0px;
2512
- margin-inline-start: -2px;
2513
2529
  z-index: 10;
2514
2530
  }
2515
2531
 
2516
- .tlui-page_menu__item__submenu > .tlui-button {
2532
+ .tlui-page-menu__item__submenu > .tlui-button {
2517
2533
  opacity: 0;
2534
+ color: var(--tl-color-text-3);
2535
+ }
2536
+
2537
+ .tlui-page-menu__item__submenu > .tlui-button::after {
2538
+ content: none;
2518
2539
  }
2519
2540
 
2520
- .tlui-page_menu__item__sortable:focus-visible > .tlui-page_menu__item__submenu > .tlui-button,
2521
- .tlui-page_menu__item__submenu[data-isediting='true'],
2522
- .tlui-page_menu__item__submenu > .tlui-button[data-state='open'],
2523
- .tlui-page_menu__item__submenu > .tlui-button:focus-visible {
2541
+ .tlui-page-menu__item:has(.tlui-button:focus-visible)
2542
+ > .tlui-page-menu__item__submenu
2543
+ > .tlui-button,
2544
+ .tlui-page-menu__item__submenu > .tlui-button[data-state='open'],
2545
+ .tlui-page-menu__item__submenu > .tlui-button:focus-visible {
2524
2546
  opacity: 1;
2525
2547
  }
2526
2548
 
2527
- .tlui-page_menu__item__submenu > .tlui-button[data-state='open']::after {
2528
- background: linear-gradient(90deg, rgba(144, 144, 144, 0) 0%, var(--tl-color-muted-2) 100%);
2549
+ /* Hide the kebab while any row is being dragged: :hover sticks during pointer */
2550
+ /* capture, which would otherwise leave the kebab visible mid-drag. */
2551
+ .tlui-page-menu__list__content[data-dragging='true']
2552
+ .tlui-page-menu__item
2553
+ > .tlui-page-menu__item__submenu
2554
+ > .tlui-button {
2555
+ opacity: 0;
2556
+ }
2557
+
2558
+ .tl-container[data-coarse='true'] .tlui-page-menu__item__submenu > .tlui-button {
2529
2559
  opacity: 1;
2530
2560
  }
2531
2561
 
2532
- .tl-container[dir='rtl'] .tlui-page_menu__item__submenu > .tlui-button[data-state='open']::after {
2533
- background: linear-gradient(270deg, rgba(144, 144, 144, 0) 0%, var(--tl-color-muted-2) 100%);
2562
+ .tl-container[data-coarse='true'] .tlui-page-menu__item__button > .tlui-button__label {
2563
+ padding-inline-end: calc(40px - 12px);
2534
2564
  }
2535
2565
 
2536
2566
  @media (hover: hover) {
2537
- .tlui-page_menu__item__submenu > .tlui-button[data-state='open']:not(:hover)::after {
2538
- background: linear-gradient(90deg, rgba(144, 144, 144, 0) 0%, var(--tl-color-muted-2) 100%);
2539
- opacity: 1;
2567
+ .tlui-page-menu__resize-handle:hover::before {
2568
+ background: var(--tl-color-selected);
2569
+ height: 2px;
2570
+ transition: background-color 150ms 80ms;
2540
2571
  }
2541
2572
 
2542
- .tl-container[dir='rtl']
2543
- .tlui-page_menu__item__submenu
2544
- > .tlui-button[data-state='open']:not(:hover)::after {
2545
- background: linear-gradient(270deg, rgba(144, 144, 144, 0) 0%, var(--tl-color-muted-2) 100%);
2573
+ .tlui-page-menu__item:not([data-editing='true']):hover::before {
2574
+ opacity: 1;
2546
2575
  }
2547
- }
2548
2576
 
2549
- .tl-container[data-coarse='true'] .tlui-page_menu__item__submenu > .tlui-button {
2550
- opacity: 1;
2551
- }
2552
-
2553
- .tlui-button__icon {
2554
- padding: 0px;
2555
- }
2577
+ .tlui-page-menu__item:hover > .tlui-page-menu__item__submenu > .tlui-button {
2578
+ opacity: 1;
2579
+ }
2556
2580
 
2557
- .tlui-page-menu__item__button .tlui-button__icon {
2558
- margin-inline-end: 4px;
2559
- }
2581
+ .tlui-page-menu__item__button > .tlui-button__label {
2582
+ padding-inline-end: 0px;
2583
+ }
2560
2584
 
2561
- @media (hover: hover) {
2562
- .tlui-page_menu__item__submenu[data-isediting='true'] > .tlui-button {
2563
- opacity: 0;
2585
+ .tlui-page-menu__item:hover > .tlui-page-menu__item__button > .tlui-button__label {
2586
+ padding-inline-end: calc(40px - 12px);
2564
2587
  }
2565
2588
 
2566
- .tlui-page_menu__item__submenu:hover > .tlui-button {
2567
- opacity: 1;
2589
+ .tlui-page-menu__item__submenu > .tlui-button:hover {
2590
+ color: var(--tl-color-text);
2568
2591
  }
2569
2592
  }
2570
-
2571
2593
  /* -------------- Skip to main content -------------- */
2572
2594
 
2573
2595
  .tl-skip-to-main-content {