* [export] rewrite - init
* restore elements + filter deleted in export API (restores #11470 behavior)
* fix snaps
* port export callers added on master to the new API + snaps
- renderOverrides (#12100), sticky notes (#12064) and arrow-label hole
(#10947) tests called the old positional exportToSvg/exportToCanvas
- embedded-scene snapshots gain master's new element fields (created,
baseFontSize, labelPosition); decoded payloads match master's
Claude Opus 5.5 (xhigh)
* restore elements in embedded scene + json clipboard export (restores #12060 behavior)
- master's #12060 made every public export entry point restore its input
(legacy elements reach lower-level code with `created: null`), incl. the
PNG metadata embed and the json clipboard copy in the removed
@excalidraw/utils wrappers
- SVG embed now serializes the restored, non-deleted elements (same as
master's utils path), PNG embed serializes restoreElements(data.elements)
and json clipboard copies the non-deleted restored elements
- port #12060's utils tests to the new API, observing renderers/serializer
instead of the (now identical) scene export functions
Claude Opus 5.5 (xhigh)
* make config.canvasBackgroundColor the single export background knob
- background resolved once in configExportDimension; exportToSvg no longer
reads appState.exportBackground (now omitted from ExportSceneData's
appState type), and honors `canvasBackgroundColor: false`
- outline arrowheads (circle/triangle/diamond_outline, cardinality_zero_*)
are filled with the resolved background color, also when the background
isn't painted (as on master) — the canvas path filled them transparent,
showing the arrow's shaft through them; SVG ignored the config color
- JPEG: `canvasBackgroundColor: false` falls back to the default background
(+ warning) instead of rendering black; no more warning for the default
- callers (exportCanvas, ImageExportDialog, library/chart/publish previews,
AI) pass the background via config only
Claude Opus 5.5 (xhigh)
* resolve export theme before creating frame labels
- frame labels were colored by appState.exportWithDarkMode, ignoring
config.theme (export dialog's dark toggle), and in dark exports the
dark-theme label color got dark-filtered again by the renderer
(#7a7a7a -> #848484)
- theme is now resolved once in configExportDimension; dark labels are
pre-reverted so they render with the editor's frame name color
Claude Opus 5.5 (xhigh)
* drop appState.exportWithDarkMode theme fallback in export
- `config.theme` is the only theme input (defaults to light); the type
already omitted `exportWithDarkMode` from `data.appState`
- callers that relied on the fallback (PublishLibrary item preview, AI
frame export) pass `theme` explicitly, keeping their behavior
Claude Opus 5.5 (xhigh)
* exportToClipboard: don't restore appState before exportToSvg (already restored there)
Claude Opus 5.5 (xhigh)
* remove unused getExportSize, type getCanvasSize's [x, y, width, height] (not Bounds)
Claude Opus 5.5 (xhigh)
* fix typos in export comments/JSDoc
Claude Opus 5.5 (xhigh)
* port with-script-in-browser example to the new export API
- exportToSvg/Blob/Canvas/Clipboard take `{ data, config }`; theme via
`config.theme`, padding 10 kept explicit (new default is 0)
- dropped the no-op `width`/`height` appState overrides from the SVG export
Claude Opus 5.5 (xhigh)
* call getDimensions once, ignore it when widthOrHeight is set
- with an explicit `fit: "contain"`, getDimensions ran twice (the second
time on its own output); it now supplies width/height (+ scale) once,
and `contain` scales the content into that frame
- getDimensions + widthOrHeight both applied; widthOrHeight now wins (with
a warning), like width/height/maxWidthOrHeight already did
- `fit: "none"` (the E+ export server path) renders identically
Claude Opus 5.5 (xhigh)
* type the export size options as mutually exclusive
- `width`/`height`, `maxWidthOrHeight`, `widthOrHeight` and `getDimensions`
are now a union where the unused options are `?: never`, so combining
them is a type error (runtime still ignores/warns for JS callers)
- the `never` keys are remapped over `keyof`, so every option keeps its
JSDoc in completions & hovers (verified via the TS language service)
Claude Opus 5.5 (xhigh)
* replace getDimensions with a `scale` function, round the canvas size
- `config.scale` also accepts `(width, height) => number`, called with the
export dimensions at scale 1 (padding included) — covers content-dependent
scaling (e.g. E+'s pixel budgets) without the getDimensions round trip
- remove `getDimensions`: its returned `scale` replaced `config.scale` and
multiplied the returned size, so callers thinking in output pixels had
to divide it back out
- exportToCanvas rounds the canvas size instead of letting the canvas
truncate it (float noise like 28.999999999999996 lost a pixel); half
pixels now round up (frame label area 20.5px, mermaid preview 89.5px)
Claude Opus 5.5 (xhigh)
* align fit/padding/position export docs with the code
- `fit` defaults to "contain" when `width`/`height` is set, otherwise
"none" (the doc said the opposite); dropped the unimplemented
"x/y force none" claim
- padding is always subtracted for `maxWidthOrHeight`/`widthOrHeight`
(they ignore `fit`), not added
- `position` values are "center" | "topLeft" (doc listed "none")
Claude Opus 5.5 (xhigh)
* derive a missing export width/height from the aspect ratio
- with `fit: "contain"` (the default when a size is given), passing only
`width` or `height` now derives the other from the content's aspect
ratio, as documented — it defaulted to the content's unscaled size,
e.g. `{ height: 50 }` of 200x100 content gave a 200x50 canvas with
60x30 content in wide empty bands (now 80x50 with padding 10)
- with `fit: "none"` the missing side stays the content extent
Claude Opus 5.5 (xhigh)
* default export `fit` to "none" when x/y is set
- `{ x, y, width, height }` was scaled to fit with `x`/`y` silently
ignored (`fit` defaulted to "contain" whenever a size was given); an
explicit region now crops by default, `fit: "contain"` still opts in
(and ignores `x`/`y`, as now documented)
Claude Opus 5.5 (xhigh)
* ignore export x/y when the content is scaled to fit
- with `fit: "contain"`, `maxWidthOrHeight` or `widthOrHeight`, `x`/`y`
shifted the fitted content by a mix of scene units and pixels; they're
now dropped with a warning, which the previous commit already
documented (its "ignored" claim was based on a coincidental probe)
Claude Opus 5.5 (xhigh)
* pad an export x/y region on all sides
- with `position: "center"` (the default), the centering adjustment also
ran on axes pinned by `x`/`y`, shifting the region by the padding: the
canvas started exactly at `x`/`y` with all padding on the right/bottom
(`position: "topLeft"` padded all sides); `position` now only applies to
unpinned axes, as documented
Claude Opus 5.5 (xhigh)
* consolidate exportToCanvas/Blob/Svg into exportScene({ type, data, config })
- `type: "canvas" | "png" | "jpeg" | "svg"`, return type per `type`
(overloads, plus a union overload for dynamic callers); per-type options
are type-checked: `quality` only for jpeg, `embedScene` for png/svg,
`renderEmbeddables`/`skipInliningFonts`/`reuseImages` for svg
- the format replaces `mimeType` (and its "image/jpg" typo handling)
- `appState.exportEmbedScene` -> `config.embedScene` (no longer read
from `data.appState`); `data.files` is optional
- `config.createCanvas` -> `config.environment.createCanvas` (where
#11997's render environment and richtext's text metrics will go)
- exportToCanvas/Blob/Svg are no longer exported (no aliases);
exportToClipboard stays, routed through exportScene
- callers, the with-script-in-browser example and tests ported
Claude Opus 5.5 (xhigh)
* export: take only scene settings from data.appState, frameRendering -> config.frames
- `data.appState` is typed as (and stripped at runtime to) the scene
settings a .excalidraw file stores; the renderer state is built from
those + defaults, so editor state passed in (a live AppState: open
dialog, cropping, frame highlight…) can't affect the output. It only
supplies the default background and what `embedScene` embeds
- `appState.frameRendering` -> `config.frames: { name, outline, clip }`
- editor callers translate their export settings via one internal
`getExportConfigFromAppState`; `exportCanvas` drops its redundant
exportBackground/viewBackgroundColor options
- fixes the editor's SVG export ignoring `exportScale` (the branch's
exportCanvas SVG path had dropped it; master passed it)
Claude Opus 5.5 (xhigh)
* type export positioning options as width/height-only
- `fit`, `position`, `x`, `y`, `origin` move into the size-option union's
`width`/`height` member, so combining them with `maxWidthOrHeight` /
`widthOrHeight` (which ignore them) is a type error; runtime unchanged
(still ignores/warns for JS callers)
- docs stay visible in completions (same `keyof` remap as the size options)
Claude Opus 5.5 (xhigh)
* move export `loadFonts` into `config.environment`
- font loading is a host capability, next to `createCanvas` (svg gets
`environment: { loadFonts }` only, as it creates no canvas)
Claude Opus 5.5 (xhigh)
* changelog: export API (exportScene, config, migration table)
Claude Opus 5.5 (xhigh)
* export: default padding back to 10, canvas at least 1px
- export bounds are geometric (no stroke width), so padding 0 cut half
of the strokes on the content's edge and made flat content (a line)
zero-height — the library/chart/publish previews, which inherited
master's default of 10, rendered blank thumbnails for lines
- canvas dimensions never go below 1px (a 0-sized canvas can't be
encoded); SVG snapshot sizes are back to master's
Claude Opus 5.5 (xhigh)
* export: clamp padding against the fitted size, before deriving from it
- the padding clamp used the content's unpadded size, so flat content (a
horizontal line) lost its padding with maxWidthOrHeight/widthOrHeight
(`{ padding: 10, maxWidthOrHeight: 400 }` → 200x0); it now only
considers the target being fitted into
- a missing width/height was derived before clamping
(`{ height: 10, padding: 10 }` → 0x10, SVG viewBox NaN/Infinity)
- a zero-extent content axis no longer yields a NaN scale under contain
Claude Opus 5.5 (xhigh)
* export: clip frame exports to the frame
- frame clipping was off for exportingFrame (to avoid the rounded
per-element clip), relying on the canvas/SVG edge — which only crops
when the export is exactly the frame; a larger export (size options)
painted children and overlapping elements into the margins, and SVG
frame exports had stopped clipping (master clipped them)
- everything drawn is now clipped to the frame with square corners: a
canvas clip after the background (`renderConfig.clipToFrame`), and an
SVG group with the frame's clip path; the background isn't clipped
Claude Opus 5.5 (xhigh)
* changelog: fill in PR numbers for the placeholder links
Claude Opus 5.5 (xhigh)
- Vendored fractional-indexing and converted to TypeScript
- Stricter index format validation in fractional-indexing
- Added format validation to fractional index validation
---
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
* feat: Move visualdebug to utils and introduce volume bindable volume visualization
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* fix: Move visualdebug to elements
Due to dep circles
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
---------
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* Fixed point binding for simple arrows
Tests added
Fix binding
Remove unneeded params
Unfinished simple arrow avoidance
Fix newly created jumping arrow when gets outside
Do not apply the jumping logic to elbow arrows for new elements
Existing arrows now jump out
Type updates to support fixed binding for simple arrows
Fix crash for elbow arrws in mutateElement()
Refactored simple arrow creation
Updating tests
No confirm threshold when inside biding range
Fix multi-point arrow grid off
Make elbow arrows respect grids
Unbind arrow if bound and moved at shaft of arrow key
Fix binding test
Fix drag unbind when the bound element is in the selection
Do not move mid point for simple arrows bound on both ends
Add test for mobing mid points for simple arrows when bound on the same element on both ends
Fix linear editor bug when both midpoint and endpoint is moved
Fix all point multipoint arrow highlight and binding
Arrow dragging gets a little drag to avoid accidental unbinding
Fixed point binding for simple arrows when the arrow doesn't point to the element
Fix binding disabled use-case triggering arrow editor
Timed binding mode change for simple arrows
Apply fixes
Remove code to unbind on drag
Update simple arrow fixed point when arrow is dragged or moved by arrow keys
Binding highlight fixes
Change bind mode timeout logic
Fix tests
Add Alt bindMode switch
No dragging of arrows when bound, similar to elbow
Fix timeout not taking effect immediately
Bumop z-index for arrows when dragged
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Only transparent bindables allow binding fallthrough
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Fix lint
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Fix point click array creation interaction with fixed point binding
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Restrict new behavior to arrows only
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Allow binding inside images
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Fix already existing fixed binding retention
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Refactor and implement fixed point binding for unfilled elements
Restore drag
Removed point binding
Binding code refactor
Added centered focus point
Binding & focus point debug
Add invariants to check binding integrity in elements
Binding fixes
Small refactors
Completely rewritten binding
Include point updates after binding update
Fix point updates when endpoint dragged and opposite endpoint orbits
centered focus point only for new arrows
Make z-index arrow reorder on bind
Turn off inside binding mode after leaving a shape
Remove invariants from debug
feat: expose `applyTo` options, don't commit empty text element (#9744)
* Expose applyTo options, skip re-draw for empty text
* Don't commit empty text elements
test: added test file for distribute (#9754)
z-index update
Bind mode on precise binding
Fix binding to inside element
Fix initial arrow not following cursor (white dot)
Fix elbow arrow
Fix z-index so it works on hover
Fix fixed angle orbiting
Move point click arrow creation over to common strategy
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Add binding strategy for drag arrow creation
Fix elbow arrow
Fix point handles
Snap to center
Fix transparent shape binding
Internal arrow creation fix
Fix point binding
Fix selection bug
Fix new arrow focus point
Images now always bind inside
Flashing arrow creation on binding band
Add watchState debug method to window.h
Fix debug canvas crash
Remove non-needed bind mode
Fix restore
No keyboard movement when bound
Add actionFinalize when arrow in edit mode
Add drag to the Stats panel when bound arrow is moved
Further simplify curve tracking
Add typing to action register()
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Fix point at finalize
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Fix type errors
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
New arrow binding rules
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Fix cyclical dep
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Fix jiggly arrows
Fix jiggly arrow x2
Long inside-other binding
Click-click binding
Fix arrows
Performance
[PERF] Replace in-place Jacobian derivation with analytical version
Different approach to inside binding
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Fixes
Fix inconsistent arrow start jump out
Change how images are bound to on new arrow creation
Lower timeout
Small insurance fix
Fix curve test
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
No center focus point
90% inside center binding
Fixing tests
fix: Elbow arrow fixes
fix: More arrow fixes
Do not trigger arrow binding for linear elements
fix: Linear elements
fix: Refactor actionFinalize for linear
Binding tests updated
fix: Jump when cursor not moved
fix: history tests
Fix history snapshot
Fix undo issue
fix(eraser): Remove binding from the other element
fix(tests): Update tests
chore: Attempt filtering new set state
Fix excessive history recording
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Fix all tests
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
fix(transform): Fix group resize and rotate
fix(binding): Harmonize binding param usage
fix: Center focus point
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
chore: Trigger build
Remove binding gap
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Binding highlight refactor
fix: Refactored timeout bind mode handling
fix: Center when orbiting
feat: Color change on highlight
Fix orbit binding highlight
fix: hiding arrow
Fix arrow binding
Fix arrow drag selection logic
Binding highlight is now hot pink
Change inside binding logic for start point
Render focus point in debug mode
Fix snap to center
Fix actionFinalize for new arrow creation
fix: snapToCenter()
80% by length
fix: attempt at fixing the dancing arrows
feat: No center snap when start is not bound
Fix centering for existing arrows
tweak binding highlight color
change `appState.suggestedBindings` -> `suggestedBinding` & remove unused code
Refactor delayed bind mode change
Binding highlight rotation support + image support
fix(highlight): Overdraw fixes
feat: Do not allow drag bound arrow closer to the shape than dragging distance
feat: Stroke width adaptive fixed binding distance
chore: More point dragging centralization
New element behavior
Refactor dragging
Fix incorrect highlight sizing
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Fix delayed bind mode for multiElement arrows
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Fix multi-point
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Fix elbow arrows
Simplify state
Small positional fixes
Fix jiggly arrows
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Fixes for arrow dragging
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Elbow arrow fixes
Highlight fixes
Fix elbow arrow binding
Frame highlight
Fix elbow mid-point binding
Fix binding suggestion for disabled binding state
Implement Alt
Remove debug
* CHange new arrow creation
* fix: allow inside binding via timeout if arrow has no startBinding
* fix: Delete invariant violation with arrows
* fix: Deleted arrow causes problems
* fix: Dragging issues
* fix: Dragging fix 2
* fix: Disable drag drag when arrow is bound
* fix: Multipoint arrow opposite point movement
* fix: Ctrl+Alt precedence
* feat: Alt inside start binding mode change
* Fix multipoint arrow orbit
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* fix: Arrow start inside binding switch
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* fix: New arrow never binds inside
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* chore: Small refactor
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* fix: Multi-point arrows and linears
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* fix: Lint
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* feat: Nested shapes handling
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* fix: Overlap behavior
* Alt unbind fix
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* fix: Existing arrow nested bindable
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* fix: Binding suggestions
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* fix: Circular dep
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* fix: snapshots
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* fix: Alt immediate update
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* chore: Laxing on invariants
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* fix: New highlight overdraws arrow
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* fix: Image binding rule changed
* Trigger Rebuild
* fix:Highlight flicker
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* fix: Fully nested shapes
* fix: Tune nested shape binding
* fix: Size-based orbit jump-in
* fix: Binding highlight stroke on sharp bindables
* fix: Nested shape binding
* fix: history
* fix:More precise element nesting check
* feat:Add tolerance to shape nesting detection
* fix: Reverse
* fix:Change center binding to circular
* ignore invisible elements when binding
* feat: Center point with more precise highlight outlines
* fix:Arrow tool hover stuck highlight
* fix:More stroke width for highlight
* POC: highlight center on hover
* tweak binding highlight width
* render highlight on the outside
* fix: Locked elbow arrow creation
* update hints
* reduce timeout
* handle overlap when both elements the same size
* tweak highlight stroke width some more
* fix:Add intersection padding
* fix: New arrow start orbit when nested binds on the end
* fix: Update history snapshot
* feat: Allow inside binding for new arrows in nested cases
* chore: Logic for measurement
* fix: Locked tool + arrow
* feat: Remove center binding
* fix: Jump arrow inside it gets visially too short
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* chore:Basic interactive canvas animation re-render trigger for highlights
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* feat:Highlight animations
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* fix:Refactored and fixed highlight animation
* fix:Poisoned arrow
* fix Arrow edit mode selection
* fix:Tool lock binding behavior restored
* fix:Overlap inside binding
* fix:Animated binding highlight
* alt anims + increase timeout to 700
* tweak animation some more + remove countdown
* fix: False bind timeout indicator
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* feat: better file normalization (#10024)
* feat: better file normalization
* fix lint
* fix png detection
* optimize
* fix type
* fix: increase rejection delay for opening files with legacy api (#8961)
* Increased input change interval to 1000 ms to fix IOS 18 file opening issue
* increase more
---------
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
* feat: library search (#9903)
* feat(utils): add support for search input type in isWritableElement
* feat(i18n): add search text
* feat(cmdp+lib): add search functionality for command pallete and lib menu items
* chore: fix formats, and whitespaces
* fix: opt to optimal code changes
* chore: fix for linting
* focus input on mount
* tweak placeholder
* design and UX changes
* tweak item hover/active/seletected states
* unrelated: move publish button above delete/clear to keep it more stable
* esc to clear search input / close sidebar
* refactor command pallete library stuff
* make library commands bigger
---------
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
* fix: Allow already inside bound arrows to continue inside binding
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* feat: No angle lock over bindable elements
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* feat: Center binding on SHIFT key
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* Fix ghost start binding
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* FEAT: No binding to frame cutout
* feat: Bind to frame when frame-bound object hidden part is approached
* fix: revert preferred selection to box once you switch to `full` UI (#10160)
* fix: mobile UI and other fixes (#10177)
* remove legacy openMenu=shape state and unused actions
* close menus/popups in applicable cases when opening a different one
* split ui z-indexes to account prefer different overlap
* make top canvas area clickable on mobile
* make mobile main menu closable by clicking outside and reduce width
* offset picker popups from viewport border on mobile
* reduce items gap in mobile main menu
* show top picks for canvas bg colors in all ui modes
* fix menu separator visibility on mobile
* fix command palette items not being filtered
* fix: Increase transform handle offset (#10180)
* fix: Increase transform handle offset
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* fix: Temporarily disable transform handles for linear elements on mobile and tablets
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* fix: Linear hidden resize
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* disable mobielOrTablet linear element bbox completely
* fix: Test
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* fix: Lint
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
---------
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
* fix: context menu getting covered (#10199)
* do not show z-index actions on mobile or tablet
* fix: context menu getting covered
* fix lint
* fix style popup getting covered
* put contextmenu z-index above sidebar
---------
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
* feat: More prominent keyboard shortcuts in hints (#10057)
* Initial
* Memoize
* Styling
* Use double angle brackets for keyboard shortcuts
* Use rem in gap
* Use an existing function for substituting tags in a string
* Revert styling
* Avoid unique key warnings
* Styling
* getTransChildren -> nodesFromTextWithTags
* Use height and padding instead of padding only
* Initial new idea
* WIP shortcut substitutions
* Use simple regex for parsing shortcuts
* Use single shortcut for combos
* Use kbd instead of span
* shortcutFromKeyString -> getTaggedShortcutKey
* Bug fix
* FlowChart -> Flowchart
* memo is useless here
* Trigger CI
* Translate in getShortcutKey
* More normalized shortcuts
* improve shortcut normalization and replacement & support multi-key tagged shortcuts
* fix regex
* tweak css
---------
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
* fix: small tweaks to shortcut hints (#10214)
* fix: Test
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* fix: Bind mode
* feat: Support special key shortcut highlight
* fix: Lint
* fix: Remove non-needed function
* fix: Skip frame cutout for hover, but keep shape for binding
* fix: Lint
* fix: Restore removal of deleted elements on restore
* fix: Inside-inside during drag
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* fix: Arrow vanishes when orbit binding to the same element
* feat: Feature flag support
* Simplified binding
* fix: Diamond corner binding
* feat: Binding highlight band re-added
* feat: Settings menu
* fix: Same shape binding
* fix: set radix PropertiesPopover collision boundary (#10221)
* Set collision boundary
* Calculate collisionPadding dynamically based on container
* Add appState offsetTop and offsetLeft to padding calculation.
Refactor collisionPadding calculation to use app state offsets.
* Update PropertiesPopover.tsx
* popover positioning relative to container
* fix: prevent wrap text in a container to only text that are not bound to a container (#10250)
* fix: only enable wrap text in a container when at least one text element selected is unbound
* Trigger Rebuild
---------
Co-authored-by: Mark Tolmacs <mark@lazycat.hu>
* chore: Uncap the nodejs version requirement (#10238)
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
* refactor: single source of truths with editor interface (#10178)
* refactor device to editor interface and derive styles panel
* allow host app to control form factor and ui mode
* add editor interface event listener
* put new props inside UIOptions
* refactor: move related apis into one file
* expose getFormFactor
* privatize the setting of desktop mode and fix snapshots
* refactor and fix test
* remove unimplemented code
* export getFormFactor()
* replace `getFormFactor` with `getEditorInterface`
* remove dead & useless
* comment
* fix ts
---------
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
* chore: Update translations from Crowdin (#7429)
* New translations en.json (Punjabi)
* New translations en.json (Polish)
* New translations en.json (Russian)
* New translations en.json (Turkish)
* New translations en.json (Ukrainian)
* New translations en.json (Chinese Traditional)
* New translations en.json (Vietnamese)
* New translations en.json (Galician)
* New translations en.json (Portuguese, Brazilian)
* New translations en.json (Persian)
* New translations en.json (Khmer)
* New translations en.json (Tamil)
* New translations en.json (Bengali)
* New translations en.json (Marathi)
* New translations en.json (Thai)
* New translations en.json (Norwegian Nynorsk)
* New translations en.json (Kazakh)
* New translations en.json (Latvian)
* New translations en.json (Azerbaijani)
* New translations en.json (Hindi)
* New translations en.json (Burmese)
* New translations en.json (Chinese Traditional, Hong Kong)
* New translations en.json (Sinhala)
* New translations en.json (Uzbek)
* New translations en.json (Norwegian Bokmal)
* New translations en.json (Occitan)
* New translations en.json (German, Switzerland)
* New translations en.json (Bengali, India)
* New translations en.json (Kabyle)
* New translations en.json (Karakalpak)
* New translations en.json (Portuguese)
* New translations en.json (Russian)
* New translations en.json (Marathi)
* New translations en.json (Hindi)
* New translations en.json (German)
* New translations en.json (Chinese Simplified)
* New translations en.json (Polish)
* New translations en.json (Romanian)
* New translations en.json (Korean)
* New translations en.json (Chinese Traditional)
* New translations en.json (Hebrew)
* New translations en.json (Hebrew)
* New translations en.json (Slovak)
* New translations en.json (Slovak)
* New translations en.json (Hungarian)
* New translations en.json (Hungarian)
* New translations en.json (Slovak)
* New translations en.json (Hebrew)
* New translations en.json (Hungarian)
* New translations en.json (Korean)
* New translations en.json (Chinese Traditional)
* New translations en.json (Romanian)
* New translations en.json (French)
* New translations en.json (Spanish)
* New translations en.json (Arabic)
* New translations en.json (Bulgarian)
* New translations en.json (Catalan)
* New translations en.json (Czech)
* New translations en.json (Danish)
* New translations en.json (German)
* New translations en.json (Greek)
* New translations en.json (Basque)
* New translations en.json (Finnish)
* New translations en.json (Italian)
* New translations en.json (Japanese)
* New translations en.json (Kurdish)
* New translations en.json (Lithuanian)
* New translations en.json (Dutch)
* New translations en.json (Punjabi)
* New translations en.json (Polish)
* New translations en.json (Portuguese)
* New translations en.json (Russian)
* New translations en.json (Slovenian)
* New translations en.json (Swedish)
* New translations en.json (Turkish)
* New translations en.json (Ukrainian)
* New translations en.json (Chinese Simplified)
* New translations en.json (Vietnamese)
* New translations en.json (Galician)
* New translations en.json (Portuguese, Brazilian)
* New translations en.json (Indonesian)
* New translations en.json (Persian)
* New translations en.json (Khmer)
* New translations en.json (Tamil)
* New translations en.json (Bengali)
* New translations en.json (Marathi)
* New translations en.json (Thai)
* New translations en.json (Norwegian Nynorsk)
* New translations en.json (Kazakh)
* New translations en.json (Latvian)
* New translations en.json (Azerbaijani)
* New translations en.json (Hindi)
* New translations en.json (Burmese)
* New translations en.json (Chinese Traditional, Hong Kong)
* New translations en.json (Sinhala)
* New translations en.json (Uzbek)
* New translations en.json (Norwegian Bokmal)
* New translations en.json (Occitan)
* New translations en.json (German, Switzerland)
* New translations en.json (Bengali, India)
* New translations en.json (Kabyle)
* New translations en.json (Karakalpak)
* New translations en.json (Romanian)
* New translations en.json (German)
* New translations en.json (Slovenian)
* New translations en.json (Chinese Simplified)
* New translations en.json (Spanish)
* New translations en.json (Russian)
* New translations en.json (Chinese Traditional)
* New translations en.json (Turkish)
* New translations en.json (Slovak)
* New translations en.json (Slovak)
* New translations en.json (Hebrew)
* New translations en.json (Hungarian)
* New translations en.json (Korean)
* New translations en.json (Chinese Traditional)
* New translations en.json (Romanian)
* New translations en.json (French)
* New translations en.json (Spanish)
* New translations en.json (Arabic)
* New translations en.json (Bulgarian)
* New translations en.json (Catalan)
* New translations en.json (Czech)
* New translations en.json (Danish)
* New translations en.json (German)
* New translations en.json (Greek)
* New translations en.json (Basque)
* New translations en.json (Finnish)
* New translations en.json (Italian)
* New translations en.json (Japanese)
* New translations en.json (Kurdish)
* New translations en.json (Lithuanian)
* New translations en.json (Dutch)
* New translations en.json (Punjabi)
* New translations en.json (Polish)
* New translations en.json (Portuguese)
* New translations en.json (Russian)
* New translations en.json (Slovenian)
* New translations en.json (Swedish)
* New translations en.json (Turkish)
* New translations en.json (Ukrainian)
* New translations en.json (Chinese Simplified)
* New translations en.json (Vietnamese)
* New translations en.json (Galician)
* New translations en.json (Portuguese, Brazilian)
* New translations en.json (Indonesian)
* New translations en.json (Persian)
* New translations en.json (Khmer)
* New translations en.json (Tamil)
* New translations en.json (Bengali)
* New translations en.json (Marathi)
* New translations en.json (Thai)
* New translations en.json (Norwegian Nynorsk)
* New translations en.json (Kazakh)
* New translations en.json (Latvian)
* New translations en.json (Azerbaijani)
* New translations en.json (Hindi)
* New translations en.json (Burmese)
* New translations en.json (Chinese Traditional, Hong Kong)
* New translations en.json (Sinhala)
* New translations en.json (Uzbek)
* New translations en.json (Norwegian Bokmal)
* New translations en.json (Occitan)
* New translations en.json (German, Switzerland)
* New translations en.json (Bengali, India)
* New translations en.json (Kabyle)
* New translations en.json (Karakalpak)
* New translations en.json (German)
* New translations en.json (Russian)
* New translations en.json (Romanian)
* New translations en.json (Spanish)
* New translations en.json (Chinese Simplified)
* New translations en.json (Marathi)
* New translations en.json (Hindi)
* New translations en.json (Slovak)
* New translations en.json (German)
* New translations en.json (Portuguese)
* New translations en.json (Romanian)
* New translations en.json (French)
* New translations en.json (Spanish)
* New translations en.json (Arabic)
* New translations en.json (Bulgarian)
* New translations en.json (Catalan)
* New translations en.json (Czech)
* New translations en.json (Danish)
* New translations en.json (German)
* New translations en.json (Greek)
* New translations en.json (Basque)
* New translations en.json (Finnish)
* New translations en.json (Hebrew)
* New translations en.json (Hungarian)
* New translations en.json (Italian)
* New translations en.json (Japanese)
* New translations en.json (Korean)
* New translations en.json (Kurdish)
* New translations en.json (Lithuanian)
* New translations en.json (Dutch)
* New translations en.json (Punjabi)
* New translations en.json (Polish)
* New translations en.json (Portuguese)
* New translations en.json (Russian)
* New translations en.json (Slovak)
* New translations en.json (Slovenian)
* New translations en.json (Swedish)
* New translations en.json (Turkish)
* New translations en.json (Ukrainian)
* New translations en.json (Chinese Simplified)
* New translations en.json (Chinese Traditional)
* New translations en.json (Vietnamese)
* New translations en.json (Galician)
* New translations en.json (Portuguese, Brazilian)
* New translations en.json (Indonesian)
* New translations en.json (Persian)
* New translations en.json (Khmer)
* New translations en.json (Tamil)
* New translations en.json (Bengali)
* New translations en.json (Marathi)
* New translations en.json (Thai)
* New translations en.json (Norwegian Nynorsk)
* New translations en.json (Kazakh)
* New translations en.json (Latvian)
* New translations en.json (Azerbaijani)
* New translations en.json (Hindi)
* New translations en.json (Burmese)
* New translations en.json (Chinese Traditional, Hong Kong)
* New translations en.json (Sinhala)
* New translations en.json (Uzbek)
* New translations en.json (Norwegian Bokmal)
* New translations en.json (Occitan)
* New translations en.json (German, Switzerland)
* New translations en.json (Bengali, India)
* New translations en.json (Kabyle)
* New translations en.json (Karakalpak)
* Auto commit: Calculate translation coverage
* New translations en.json (Chinese Simplified)
* Auto commit: Calculate translation coverage
* New translations en.json (Romanian)
* Auto commit: Calculate translation coverage
* New translations en.json (Romanian)
* Auto commit: Calculate translation coverage
* New translations en.json (French)
* Auto commit: Calculate translation coverage
* New translations en.json (Polish)
* Auto commit: Calculate translation coverage
* New translations en.json (Polish)
* Auto commit: Calculate translation coverage
* New translations en.json (Turkish)
* Auto commit: Calculate translation coverage
* New translations en.json (Turkish)
---------
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
* fix: mobile view ui issues (#10284)
* hide zen mode when formFactor = phone
* tool bar fixes: icon and width
* view mode
* fix lint
* add exit-view-mode button
---------
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
* chore: Update snaps
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* feat: Blue highlight
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* feat: Diagonal binding point
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* chore: Remove settings
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* feat: Jump other binding
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* fix: Hovered arrow mode highlight
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* feat: Alt does not snap
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* chore: Check debug
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* fix: Alt precise positioning
* fix: Jump out to orbit for new arrows when dragged outside
* fix: New arrow preserved projection
* chore: Remove debug
* chore: Introduce different debug color for orbit and other binding modes
* fix: Restore arrow start point when self binding
* fix: Turn of start jump-out
* fix: Tests
* fix: Select the first possible altBindPoint
* fix: Random projection
* fix: Use last point for existing arrows
* fix: Preserve alternate orbit focus point during drag
* fix: Lint
* fix: Update tests
* fix: Elbow arrow direction at binding
* binding gap and distance and binding highlight tweaks
* chore: Naming refactors
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* fix: Tests
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* fix: Alt-duplication copied elements placement (#10152)
* feat: Animation support (#10042)
* fix: banner url (#10315)
* feat: Animation support (#10042)
* fix: Merge discrepancy
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* chore: Remove non-needed code
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* Trigger build
* chore: Remove hint for V1
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* shorten focus point diagonal helpers to fix corner binding cases
* fix: Tests
* fix: Multi-point arrow closeness fallback
* fix: Finalize multipoint arrow on binding area click
* fix: Finalize arrow now truly finalzes
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* fix: Point click arrow creation jumping to orbit
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* fix: Alt+drag movement block
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* fix: Tests
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
* Trigger build
* feat: hide point highlight when dragging
* feat: hide bbox when dragging points
* revert binding gap increase for elbow arrows
* reset selectionLinearElement on tool change
* chore: Remove debug
* feat: Better restore for bindings
* use elementsMap instead of array when passing to restoreElement
* fix: Arrow angle reset
* fix: Arrow angle
* Arrow angle support
* fix trashing cached canvases in `LinearElementEditor.getElementAbsoluteCoords`
---------
Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
* refactor device to editor interface and derive styles panel
* allow host app to control form factor and ui mode
* add editor interface event listener
* put new props inside UIOptions
* refactor: move related apis into one file
* expose getFormFactor
* privatize the setting of desktop mode and fix snapshots
* refactor and fix test
* remove unimplemented code
* export getFormFactor()
* replace `getFormFactor` with `getEditorInterface`
* remove dead & useless
* comment
* fix ts
---------
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
* fix: display error message when local storage quota is exceeded
* add danger alert instead of toast
* tweak text
---------
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
* Remove local elements when there is room data
* Update excalidraw-app/collab/Collab.tsx
---------
Co-authored-by: David Luzar <5153846+dwelle@users.noreply.github.com>