I need to mock nanoid for the ephemeral state fuzz tests, to create
repeatable test runs. In order to do that properly it needs to have a
consistent version among all our packages.
At the same time I'm removing some old unused params in AppOptions
### Change Type
<!-- 💡 Indicate the type of change your pull request is. -->
<!-- 🤷♀️ If you're not sure, don't select anything -->
<!-- ✂️ Feel free to delete unselected options -->
<!-- To select one, put an x in the box: [x] -->
- [ ] `patch` — Bug Fix
- [ ] `minor` — New Feature
- [x] `major` — Breaking Change
- [ ] `dependencies` — Dependency Update (publishes a `patch` release,
for devDependencies use `internal`)
- [ ] `documentation` — Changes to the documentation only (will not
publish a new version)
- [ ] `tests` — Changes to any testing-related code only (will not
publish a new version)
- [ ] `internal` — Any other changes that don't affect the published
package (will not publish a new version)
### Release Notes
- Remove unused userId and instanceId props from AppOptions
This PR fixes the appearance of tabs in labels and text when exporting
images.
This involved refactoring our CSS-text-to-multiline-SVG-text.
### Test Plan
1. Create a text or geo shape with a label that includes a tab character
at the beginning of a line (e.g. jsx)
2. Copy the image as SVG and paste
### Release Note
- Fixes a bug with trailing tab characters in text labels on image
export
Fixes the issue outlined in #1325.
### Test Plan
In firefox
1. Enable clipboard in firefox by going to `about:config` and enabling
`dom.events.asyncClipboard.clipboardItem` (remember to turn it off
afterwards)
2. Test that `copy-as -> PNG` copies the image
In other browsers
1. Test that `copy-as -> PNG` still copies the image
### Release Notes
- Fix "copy as png" in firefox when
`dom.events.asyncClipboard.clipboardItem` is enabled
The assets package now only exports esm-formatted .js files. There's one
for each strategy - import-based, and meta.url-based. These are directly
generated as .js and .d.ts files rather than generated as .ts and
converted to js/dts through other means.
As this package depends on esm-specific stuff to function, we don't
publish a cjs version any more.
### Change Type
<!-- 💡 Indicate the type of change your pull request is. -->
<!-- 🤷♀️ If you're not sure, don't select anything -->
<!-- ✂️ Feel free to delete unselected options -->
<!-- To select one, put an x in the box: [x] -->
- [ ] `patch` — Bug Fix
- [ ] `minor` — New Feature
- [x] `major` — Breaking Change
- [ ] `dependencies` — Dependency Update (publishes a `patch` release,
for devDependencies use `internal`)
- [ ] `documentation` — Changes to the documentation only (will not
publish a new version)
- [ ] `tests` — Changes to any testing-related code only (will not
publish a new version)
- [ ] `internal` — Any other changes that don't affect the published
package (will not publish a new version)
### Release Notes
- [dev] If you're using the `@tldraw/assets` package, you need to update
your code to `import { getAssetUrlsByImport } from
'@tldraw/assets/imports'` instead of `import { getBundlerAssetUrls }
from '@tldraw/assets`
Our private tlsync package currently depends on the editor package,
which balloons the size of the cloudflare worker. It also makes it so
that any change to any package triggers a worker refresh, which makes
working on multiplayer stuff kinda miserable.
This is the first PR to fix that problem.
The second PR will need to resolve TLSyncClient's dependency on the
debugFlags somehow. Easiest would be to just remove the offending flag,
but we might want cross-bublic debug flags at some point in the future
so I'll try to find a low-cost way to make that happen while making
`tlsync` not depend on `editor`.
cc @TodePond since you added the flag in question
(`tldrawResetConnectionEveryPing`)
### Release Note
- internal moving stuff around
This PR adds a `check-box` geo shape.
![Kapture 2023-05-08 at 15 31
49](https://user-images.githubusercontent.com/23072548/236853749-99ba786f-73a4-4b65-86ca-f2cdac61a903.gif)
It also improves some logic around the `onClick` shape util handler and
some surprisingly related fixes to point hit testing.
### Test Plan
1. Create a geo shape
2. Set it as a checkbox style
3. *easter egg* double click while holding alt to toggle between
check-box and rectangle
- [x] Unit Tests
### Release Note
- Adds checkbox geo shape.
This PR has been hijacked! 🗑️🦝🦝🦝
The <Canvas> component was previously split into an <SVGLayer> and an
<HTMLLayer>, mainly due to the complexity around translating SVGs.
However, this was done before we learned that SVGs can have overflow:
visible, so it turns out that we don't really need the SVGLayer at all.
This PR now refactors away SVG Layer.
It also updates the class name prefix in editor from `rs-` to `tl-` and
does a few other small changes.
---------
Co-authored-by: Steve Ruiz <steveruizok@gmail.com>
This PR adds docs for the methods in the TLShapeUtil class.
I think that it's a good page to have docs on, as it shows people what's
possible with the custom shape API.
Currently, our docs are not showing `@param` info for lots of methods,
including the ones added in this PR.
I'll do fix for that in a follow-up PR, so that it's easier to review.
---
Note: Moving forward, we probably want to consider **_where_** these
docs are shown, and how we achieve that.
For example, do we put the docs for these methods in:
* The docs page for the `TLShapeUtil` class?
* The docs pages for the handler types, eg:
[`OnResizeHandler`](http://localhost:3000/gen/editor/OnResizeHandler-type)?
* Both?
Right now, I opted for putting them in the the TLShapeUtil class, as it
keeps them all in one place, and it's what we already do for some
others.
We should consider both - what works best for the docs? and what works
best for code editors?
---
This PR also includes a fix to our pre-commit step that @SomeHats did.
Right now this examples app looks exactly the same as our old examples
app, but there are a couple of tiny differences:
- We use `vite` instead of our own esbuild setup for development and
bundling
- We use `@tldraw/assets` for smart asset hashing instead of copying the
assets to a public folder
You can use `@tldraw/assets` with vite with a bunch of extra config, but
it (plus a bunch of other bundlers) also support a special syntax for
specifying asset urls: `new URL('./my/asset.svg',
import.meta.url).href`. This approach is more standards-complient, but
doesn't work with every bundler just yet. This diff also adds a
url-based version of `@tldraw/assets`, although I'd like to tweak the
entry point - right now you need to import from
`@tldraw/assets/lib/urls`, but i'd like to find a way to get this to
`@tldraw/assets/urls` or something at some point.
There are a couple other extra fixes in here:
- vscode builds were broken, they're fixed now!
- there's also a little tweak to the `getBundlerAssetUrls` API to allow
passing in a function instead of an object for URL formatting
- there are new internal-only functions for injecting asset urls
globally instead of passing them in via react props. this means we can
get the benefits of cacheable URLs without having to clutter our
examples by passing them in
In this PR I'm adding new versions of the `LiveCollaborators` and
`Collaborators` components for the ephemeral state work. They are behind
a feature flag for now.
Temporarily moving us to a prerelease of this dep. This resolves an
issue where the mobile style menu popover couldn't be closed by tapping
the style button again. See
https://github.com/radix-ui/primitives/issues/2105 for details
This PR improves the language selection.
Previously, we would miss the user's languages that included a locale.
For example, if a user's languages were `['en-US', 'fr'], then they
would get 'fr' because 'en-US' wasn't in our table—though 'en' was!
We were already doing the splitting elsewhere but now we do it here,
too.
### Release Note
- Improves default language
---------
Co-authored-by: Lu[ke] Wilson <l2wilson94@gmail.com>
This PR adds
- A new `TLInstancePresence` record type, to collect info about the
presence state in a particular instance of the editor. This will
eventually be used to sync presence data instead of sending
instance-only state across the wire.
- **Record Scopes**
`RecordType` now has a `scope` property which can be one of three
things:
- `document`: the record belongs to the document and should be synced
and persisted freely. Currently: `TLDocument`, `TLPage`, `TLShape`, and
`TLAsset`
- `instance`: the record belongs to a single instance of the store and
should not be synced at all. It should not be persisted directly in most
cases, but rather compiled into a kind of 'instance configuration' to
store alongside the local document data so that when reopening the
associated document it can remember some of the previous instance state.
Currently: `TLInstance`, `TLInstancePageState`, `TLCamera`, `TLUser`,
`TLUserDocument`, `TLUserPresence`
- `presence`: the record belongs to a single instance of the store and
should not be persisted, but may be synced using the special presence
sync protocol. Currently just `TLInstancePresence`
This sets us up for the following changes, which are gonna be pretty
high-impact in terms of integrating tldraw into existing systems:
- Removing `instanceId` as a config option. Each instance gets a
randomly generated ID.
- We'd replace it with an `instanceConfig` option that has stuff like
selectedIds, camera positions, and so on. Then it's up to library users
to get and reinstate the instance config at persistence boundaries.
- Removing `userId` as config option, and removing the `TLUser` type
altogether.
- We might need to revisit when doing auth-enabled features like locking
shapes, but I suspect that will be separate.
* create new ids for new shapes and map old parent ids to new ids
* duplicate bindings and update shape handles
* spacing
Co-authored-by: Bruno <33330711+bybruno@users.noreply.github.com>
* Update duplicatePage.ts
* Update duplicatePage.ts
Co-authored-by: Bruno <33330711+bybruno@users.noreply.github.com>
Co-authored-by: Steve Ruiz <steveruizok@gmail.com>
* Add support for custom cursor components
* Add tests for the custom cursor props
* Make the main tldraw app take the components prop
* feat: add the ability to hide cursors
* Update cursor props
* Update imports
Co-authored-by: Judicael <46365844+judicaelandria@users.noreply.github.com>
Co-authored-by: Steve Ruiz <steveruizok@gmail.com>
* feat: change icon when panning
* add support for panning with the middle mouse
* Remove state at top tldraw
* logic tweaks
* accept middle clicks on objects
* Update useCursor.ts
Co-authored-by: Steve Ruiz <steveruizok@gmail.com>
* Remove leftover references to removed Electron app
(Experimental Electron app was purged in #893)
* Correct thanking organization in CONTRIBUTING.md
* Remove reference to pressure (ease) in Vec.pointsBetween description
Used to have an "ease" param, removed in #163
* Make links to core examples from core/README.md more explicit
* made Tooltip wrap ToolButton instead of the other way around for items in ActionButton
* removes unnecessary icon variant
* Add tooltips to align/distribute
Co-authored-by: Steve Ruiz <steveruizok@gmail.com>
* fix help icon size on mobile
* Fix menu closing on mobile
* Fix position of help button
* Remove variants
* Update HelpPanel.tsx
Co-authored-by: Steve Ruiz <steveruizok@gmail.com>
* Update prettier to latest
* Add format command
* Create .prettierignore
* Add prettier plugin sort imports
* Update prettier config
* Update prettier config
* Update .prettierignore
* Fix @babel/parser conflict
https://github.com/trivago/prettier-plugin-sort-imports/issues/156
* Revert "Update .prettierignore"
This reverts commit 282e5b838376f16b3df7f4c1f99f1106baaffea4.
* Revert change for apps/www/pages/v/[id].tsx
* Sort imports
Moves the third party imports to the top, "~" imports in middle, and "./" at last
* Sorting of the specifiers
in an import declarations
* [www] use path vs "../"
* [core] use path "~" vs "../"
* [tldraw] use path "~" vs "../.../"
* [tldraw] use path "~" vs "../"
* [tldraw] Cleanup
* Update prettier config
* Last use path "~" vs "../.../"
* [www] Fix order of the third party imports
* Clean prettier config
* Only the first letter in capital
* Spelling corrections
* Correction of wrong translations
* Best common translation
* Specify the direction of rotation
* Translate to French
* Better translation for this actions
* Revert to preferring the use of "zoom"
* It's better to know on what it acts
* Missing of hyphen
* Better for user focus
- It's better for the user focus to not use the same action verb for two opposite actions (to.front/to.back)
- Specifies the unit of motion for (forward/backward)
* Removes the direction of rotation
* Better alternative for copy/export as
Also, this indicates that we will be able to choose the file format when copying/exporting.
* feat: add "Back to content" missing translation
* fix: style
* reverted of translations except for main.json and fr
* Prefer declarative use with an html element
* Edit Farsi translations (#788)
* Add a Ukrainian translation (#786)
* Add a Ukrainian translation
* Clarify some strings in the Ukrainian translation
* feat: change dock position (#774)
* feat: change dock position
* fix grid row and column
* add top position
* fix responsive for the top position
* change content side
* fix overflowing menu
* [improvement] theme on body (#790)
* Update Tldraw.tsx
* Add theme on body, adjust dark page options dialog
* fix test
* Preparing for global integration (#775)
* Update translations.ts
* Create en.json
* Make main translation default
* Remove unused locale property of translation
Co-authored-by: Steve Ruiz <steveruizok@gmail.com>
* Fix language menu
* Update ar.json (#793)
* feature/add Hebrew translations (#792)
* hebrew translations
* pr fixes
Co-authored-by: Steve Ruiz <steveruizok@gmail.com>
* fix toolspanel item position (#791)
* fix toolspanel item position
* add translation
Co-authored-by: Steve Ruiz <steveruizok@gmail.com>
* Add remote caching
* Adds link to translation guide (#794)
Co-authored-by: Baahar Ebrahimi <108254874+Baahaarmast@users.noreply.github.com>
Co-authored-by: walking-octopus <46994949+walking-octopus@users.noreply.github.com>
Co-authored-by: Judicael <46365844+judicaelandria@users.noreply.github.com>
Co-authored-by: Ali Alhaidary <75235623+ali-alhaidary@users.noreply.github.com>
Co-authored-by: gadi246 <gadi246@gmail.com>
* Translated to German
Translated the page to German.
There may be some inaccurate translations, because some phrases depend on context i.e. "to fit" or "binding handles", but it is comprehensible in German.
* Update de.json
* Update de.json
Updated some translations with respect to their context
Co-authored-by: Steve Ruiz <steveruizok@gmail.com>
* Translated to German
Translated the page to German.
There may be some inaccurate translations, because some phrases depend on context i.e. "to fit" or "binding handles", but it is comprehensible in German.
* Update de.json
* feat: add norwegian translation
* arrange text in alphabetical order
* sort by code
* rename en.json to main.json
Co-authored-by: Steve Ruiz <steveruizok@gmail.com>
* Upgrade Liveblocks packages to 0.17
* Convert app to recommended Liveblocks 0.17 setup
* Convert multiplayer example to recommended Liveblocks 0.17 setup
* Convert multiplayer-with-images example to recommended Liveblocks 0.17 setup
* Fix React rendering issue for multiplayer app
This bug could manifest after _navigating_ internally to the Multiplayer
example app. Liveblocks Storage would seem to remain empty, but Presence
would still seem to work. In other words, you'd see cursors flying, but
no document contents.
This did not happen when doing a full page load.
This bug only occurs in React strict mode.
* update onPatch and onCommand
* "Add event callbacks for `onSessionStart` and `onSessionEnd`"
* Adds edit state
* Pass callbacks to app
* Remove console logs
* interpolate cursor only when not in session
* Update multiplayer icon
* Fix a few things
Co-authored-by: Steve Ruiz <steveruizok@gmail.com>
* feat: add translation
* modal, left menu translation
* primary tools translation
* render with intl provider for testing
restore file
* french translation done
* context menu translation and test
* added italian
* Add menu to select language
* translation for the word language
* bump dev deps
Bump react on www
* Fix types
* update dependencies
* pre-release
* Delete lask.config.json
Co-authored-by: Enrico <franciscono.enry@gmail.com>
Co-authored-by: Steve Ruiz <steveruizok@gmail.com>
* fix: Pointer position is incorrect if Tldraw is drawing in a scrolling container
fix https://github.com/tldraw/tldraw/issues/661
* Add example for scrolling
Co-authored-by: Steve Ruiz <steveruizok@gmail.com>