Commit Graph

21167 Commits

Author SHA1 Message Date
Andrey Antukh
d202b60674 ♻️ Convert typography-advanced-options to modern * suffix format
Rename typography-advanced-options -> typography-advanced-options*,
convert props visible?->is-visible, editable?->is-editable,
local?->is-local, and update the call site in typography-entry.
2026-04-07 13:15:18 +02:00
Andrey Antukh
e720643a08 ♻️ Convert colors-group to modern * suffix
Rename colors-group -> colors-group*. Rename boolean props:
force-open? -> is-force-open, local? -> is-local,
multi-colors? -> is-multi-colors, multi-assets? -> is-multi-assets.
Update recursive self-call and call site in colors-section*.
2026-04-07 13:15:18 +02:00
Andrey Antukh
0c4ebbbb36 ♻️ Convert grid-cell/options and set-self-alignment to modern * suffix
Rename options -> options*, set-self-alignment -> set-self-alignment*.
Rename prop is-col? -> is-col. Update all 9 call sites to [:> ...] syntax.
2026-04-07 13:15:18 +02:00
Andrey Antukh
a3b3526aa5 ♻️ Convert frame-grid and grid-options to modern * suffix
Rename grid-options -> grid-options*, frame-grid -> frame-grid*.
Update internal call and call site in shapes/frame.cljs to [:> ...] syntax.
2026-04-07 13:15:18 +02:00
Andrey Antukh
129999d2fb ♻️ Convert svg-attrs-menu and attribute-value to modern * suffix
Rename attribute-value -> attribute-value*, svg-attrs-menu -> svg-attrs-menu*.
Update all call sites (circle, path, svg_raw, rect, group) to use [:> ...] syntax.
2026-04-07 13:15:18 +02:00
Andrey Antukh
814f1539ea ♻️ Convert history-entry-details to modern rumext * format
Rename to history-entry-details* and update internal call site.
2026-04-07 13:15:18 +02:00
Andrey Antukh
0adfdf000c ♻️ Convert text-menu and sub-components to modern rumext * format
Rename text-align-options, text-direction-options, vertical-align,
grow-options, text-decoration-options and text-menu to their * variants.
Update all call sites in shapes/text.cljs, shapes/group.cljs and
shapes/multiple.cljs.
2026-04-07 13:15:18 +02:00
Andrey Antukh
19af1d7b5b ♻️ Update shapes option panels to use blur-menu*, constraints-menu* and stroke-menu*
Update :refer imports and all [:& ...] call sites to [:> ...*] for
blur-menu*, constraints-menu* and stroke-menu* across all nine
shapes-specific options panels.
2026-04-07 13:15:18 +02:00
Andrey Antukh
6709653f67 ♻️ Convert blur-menu, constraints-menu and stroke-menu to modern rumext * format
Rename components to blur-menu*, constraints-menu* and stroke-menu*.
2026-04-07 13:15:18 +02:00
Andrey Antukh
4a7b7e7177 ♻️ Convert text-edition-outline to modern rumext * format
Rename to text-edition-outline*, update call sites in viewport.cljs and
viewport_wasm.cljs to [:> text-edition-outline* ...].
2026-04-07 13:15:18 +02:00
Andrey Antukh
d4efd41839 ♻️ Convert image-upload to modern rumext * format
Rename to image-upload*, update internal call site in top-toolbar* to
[:> image-upload*].
2026-04-07 13:15:18 +02:00
Andrey Antukh
9a0dc1ef6e ♻️ Convert text-palette-ctx-menu to modern rumext * format
Rename to text-palette-ctx-menu*, rename show-menu? prop to show-menu,
update call site in palette.cljs to [:> text-palette-ctx-menu* ...].
2026-04-07 13:15:18 +02:00
Andrey Antukh
a1c324f280 ♻️ Update colorpicker.cljs call sites for migrated sub-components
Update :refer imports and call sites from [:& ...] to [:> ...] for
color-inputs*, harmony-selector*, hsva-selector* and libraries*.
2026-04-07 13:15:18 +02:00
Andrey Antukh
42c005dfc1 ♻️ Convert libraries to modern rumext * format
Rename component to libraries*.
2026-04-07 13:15:18 +02:00
Andrey Antukh
cdebe0f23e ♻️ Convert color-inputs to modern rumext * format
Rename component to color-inputs*.
2026-04-07 13:15:18 +02:00
Andrey Antukh
c0d9abc61d ♻️ Convert hsva-selector to modern rumext * format
Rename to hsva-selector*, update all four [:& slider-selector ...]
call sites to [:> slider-selector* ...] with renamed props.
2026-04-07 13:15:18 +02:00
Andrey Antukh
95abde4acf ♻️ Convert harmony-selector to modern rumext * format
Rename to harmony-selector*, update slider-selector call sites to
[:> slider-selector* ...] with is-vertical/is-reverse props, and
drop the redundant :vertical key that was previously alongside :vertical?.
2026-04-07 13:15:18 +02:00
Andrey Antukh
836db2cdac ♻️ Convert value-saturation-selector to modern rumext * format
Rename to value-saturation-selector*, update internal call site to
[:> value-saturation-selector* ...], and update slider-selector call
sites to [:> slider-selector* ...].
2026-04-07 13:15:13 +02:00
Andrey Antukh
543a57c337 ♻️ Convert slider-selector to modern rumext * format
Rename component to slider-selector*, convert vertical? to is-vertical
and reverse? to is-reverse throughout the component body.
2026-04-07 13:15:07 +02:00
Andrey Antukh
2c4d158d66 ♻️ Convert text-palette components to modern * format
Convert typography-item, palette and text-palette to typography-item*,
palette* and text-palette* using {:keys [...]} destructuring. Rename
prop name-only? to is-name-only in typography-item*. Update internal
call sites to [:> ...] and update the :refer import in palette.cljs.
2026-04-07 13:15:01 +02:00
Andrey Antukh
92f40679cc ♻️ Convert active-sessions to modern * component format
Convert active-sessions to active-sessions* (zero-prop component).
Update call site in right_header.cljs to use [:> ...] and update the
:refer import accordingly.
2026-04-07 13:14:56 +02:00
Andrey Antukh
edb0232fc5 ♻️ Convert coordinates to modern * component format
Convert coordinates to coordinates* using {:keys [...]} destructuring
and rename prop colorpalette? to is-colorpalette. Update call site in
workspace.cljs to use [:> ...] with new prop name.
2026-04-07 13:14:50 +02:00
Andrey Antukh
b4d01db9e0 ♻️ Convert viewport-scrollbars to modern * component format
Convert viewport-scrollbars to viewport-scrollbars* using {:keys [...]}
destructuring and update call sites in viewport.cljs and viewport_wasm.cljs
to use [:> ...].
2026-04-07 13:14:43 +02:00
Andrey Antukh
10c5128fa8 ♻️ Convert shape-distance-segment to modern * component format
Convert shape-distance-segment to shape-distance-segment* using {:keys [...]}
destructuring and update its internal call site in shape-distance to use [:> ...].
2026-04-07 13:14:37 +02:00
Andrey Antukh
57135725d0 🐛 Fix get-snap call in snap-feedback* using JS props object
Modern rumext *-suffix components receive props as JS objects, not
Clojure maps. snap-feedback* was pushing the raw props object into the
rx/subject and get-snap was destructuring it as a Clojure map, causing
all keys to resolve to nil.

Fix by:
- Changing get-snap to take positional arguments (coord, shapes,
  page-id, remove-snap, zoom) instead of a map-destructured opts arg
- Building an explicit Clojure map from the bound locals before pushing
  to the subject
- Destructuring that map inside the rx/switch-map callback and calling
  get-snap with positional args

Also mark get-snap and add-point-to-snaps as private (defn-), consistent
with the other helpers in the namespace — none are referenced externally.
2026-04-07 13:14:14 +02:00
Andrey Antukh
8b2fb5c61e ♻️ Rename ?-ending props in modernized workspace viewport components
Apply prop naming rules to all * components migrated in the previous batch:
- remove-snap? -> remove-snap in snap-feedback* (and get-snap helper)
- selected? -> is-selected in interaction-path*
- hover-disabled? -> is-hover-disabled in overlay-marker* and interactions*
- show-rulers? -> show-rulers in viewport-frame*

Update all internal and external call sites consistently.
2026-04-07 13:14:14 +02:00
Andrey Antukh
ba982b5d0e ♻️ Convert gradient handler components to modern rumext format
Migrate shadow, gradient-color-handler, and gradient-handler-transformed
from legacy mf/defc format to modern * suffix format. These components
are rendered during gradient editing with zero props optimization applied.
Internal call sites in gradient-handler-transformed and
gradient-handlers-impl updated to use [:> component* props] syntax.
2026-04-07 13:14:14 +02:00
Andrey Antukh
c5c2294f8d ♻️ Convert frame-grid components to modern rumext format
Migrate square-grid, layout-grid, grid-display-frame, and frame-grid
from legacy mf/defc format to modern * suffix format. These four
components render grid patterns per-frame with zero props optimization.
All internal and external call sites updated to use [:> component* props]
syntax.
2026-04-07 13:14:14 +02:00
Andrey Antukh
afaca57e78 ♻️ Convert rulers components to modern rumext format
Migrate rulers-text, viewport-frame, and selection-area from legacy
mf/defc format to modern * suffix format. These three components in
the always-visible rulers layer had zero props optimization applied.
Internal call sites in the parent rulers component updated to use
[:> component* props] syntax.
2026-04-07 13:14:13 +02:00
Andrey Antukh
d8a8767a32 ♻️ Convert interactions components to modern rumext format
Migrate interaction-marker, interaction-path, interaction-handle,
overlay-marker, and interactions from legacy mf/defc format to modern
* suffix format. These five components had zero props optimization
applied, causing implicit JS object wrapping on every render. All
internal and external call sites updated to use [:> component* props]
syntax.
2026-04-07 13:14:13 +02:00
Andrey Antukh
77058f868a ♻️ Convert frame-title to modern rumext format
Migrate frame-title from legacy mf/defc format to modern * suffix
format. The component was using legacy implicit props wrapping without
::mf/wrap-props false or ::mf/props :obj, causing unnecessary JS
object conversion overhead on each render. The parent frame-titles*
call site updated to use [:> frame-title* props] syntax.
2026-04-07 13:14:13 +02:00
Andrey Antukh
38516ea399 ♻️ Convert snap-points components to modern rumext format
Migrate snap-point, snap-line, snap-feedback, and snap-points from
legacy mf/defc format to modern * suffix format. This enables
optimized props handling by the rumext macro, eliminating implicit
JS object wrapping overhead on each render. All internal and
external call sites updated to use [:> component* props] syntax.
2026-04-07 13:14:13 +02:00
Luis de Dios
e99b6ec213 🐛 Fix MCP active tab switching (#8856) 2026-04-07 10:58:04 +02:00
Eva Marco
67734c5835 🐛 Fix hover on layers (#8885) 2026-04-07 10:57:27 +02:00
Alonso Torres
11d9c09a2e 🐛 Fix problem with dashboard thumbnails (#8862) 2026-04-07 10:10:08 +02:00
Aitor Moreno
0f389fe3ad Merge pull request #8881 from penpot/azazeln28-fix-text-editor-v2-tests
🐛 Fix text-editor v2 waitForIdle not having a timeout
2026-04-06 13:13:05 +02:00
Aitor Moreno
9aa2abff2e 🐛 Fix text-editor v2 waitForIdle not having a timeout 2026-04-06 12:37:57 +02:00
Aitor Moreno
4205e283ea Merge pull request #8835 from penpot/superalex-fix-text-editor-mixed-selection-styles
🐛 Fix spurious mixed text styles on multi-span selection
2026-04-06 09:33:29 +02:00
Elena Torro
68760c8e26 🎉 Improve text inner stroke rendering 2026-04-02 12:00:08 +02:00
alonso.torres
cbe3a3f33e 🐛 Fix problem when changing grow-type 2026-04-02 11:44:41 +02:00
Andrey Antukh
f7e1bcf87f 🐛 Handle plugin errors gracefully without crashing the UI (#8810)
* 🐛 Handle plugin errors gracefully without crashing the UI

Plugin errors (like 'Set is not a constructor') were propagating to the
global error handler and showing the exception page. This fix:

- Uses a WeakMap to track plugin errors (works in SES hardened environment)
- Wraps setTimeout/setInterval handlers to mark errors and re-throw them
- Frontend global handler checks isPluginError and logs to console

Plugin errors are now logged to console with 'Plugin Error' prefix but
don't crash the main application or show the exception page.

Signed-off-by: AI Agent <agent@penpot.app>

*  Improved handling of plugin errors on initialization

*  Fix test and linter

---------

Signed-off-by: AI Agent <agent@penpot.app>
Co-authored-by: alonso.torres <alonso.torres@kaleidos.net>
2026-04-01 11:37:27 +02:00
Andrey Antukh
8fcbfadd49 Merge remote-tracking branch 'origin/main' into staging 2026-04-01 11:30:21 +02:00
Belén Albeza
8c1cf3623b 🔧 Update action checkout to v6 (#8861) 2026-04-01 11:29:55 +02:00
Andrey Antukh
d3ac824912 🐛 Fix ICounted error on numeric-input token dropdown keyboard nav (#8803)
The options stored in options-ref is a delay (lazy value). In
on-token-key-down, it was passed raw to next-focus-index without being
dereferenced first, causing count to be called on a JS object that does
not implement ICounted.

Fix: dereference the delay in on-token-key-down (matching the existing
pattern in on-key-down), and make next-focus-index itself also handle
delays defensively. Add unit tests covering the delay case.
2026-04-01 11:21:01 +02:00
Andrey Antukh
350cc01b72 🐛 Fix frontend test script 2026-04-01 11:10:28 +02:00
Andrey Antukh
8289120ea4 Replace pnpx with pnpm exec in render-wasm build script
The pnpx tries to fetch esbuild instead of using the already installed
version.
2026-04-01 11:10:28 +02:00
Andrey Antukh
103af0e31a 📎 Fix inconsistencies on error report context data 2026-04-01 10:26:04 +02:00
Andrey Antukh
a04dd6cbfd Merge remote-tracking branch 'origin/main' into staging 2026-04-01 09:22:52 +02:00
Andrey Antukh
0ad5baa5d9 🐛 Fix mcp build script 2026-03-31 19:59:32 +02:00
Andrey Antukh
d3c77130bc Merge pull request #8852 from penpot/niwinz-staging-handle-bad-token-sets
🐛 Allow read/decode token-sets with bad names
2026-03-31 18:11:14 +02:00