Compare commits

...

2365 Commits
2.4.2 ... 2.8.1

Author SHA1 Message Date
Brandon Currell
44bc4b7fa4 🐳 Add missing package in the exporter Docker image (#7026)
penpot-exporter requires poppler-utils for exporting to a PDF, but it is missing.
Added the package to the Dockerfile in the RUN section where dependencies are
being installed.

Signed-off-by: Brandon Currell <brandon+git@currell.pw>
2025-08-01 13:00:51 +02:00
Yamila Moreno
5c14f486d7 🐳 Update Imagemagick version 2025-08-01 12:49:11 +02:00
Andrey Antukh
0cbd980b68 🎉 Add imagemagick docker image build scripts (#6925)
* 🎉 Add imagemagick docker image build scripts

* 📎 Add PR feedback changes
2025-08-01 12:48:47 +02:00
Andrey Antukh
2e726b62c3 📎 Update changelog 2025-07-29 20:07:05 +02:00
Andrey Antukh
b68c426cd1 🐛 Fix exception on fills menu when binary-fills flag is active
And multiple shapes are selected.
2025-07-29 15:10:32 +02:00
Andrey Antukh
d00de7d5a4 Merge pull request #6960 from penpot/xaviju-remove-image-shape-type-fix
🐛 Remove image type from inspect tab panels
2025-07-25 12:49:57 +02:00
Xaviju
2fbd4b07e0 🐛 Remove image type from inspect tab panels 2025-07-25 12:08:01 +02:00
Andrey Antukh
523373dfa2 📎 Update .gitignore file 2025-07-23 12:09:15 +02:00
Andrey Antukh
b71ec4bfe0 Simplify docker build script (#6924) 2025-07-21 20:45:03 +02:00
Andrey Antukh
51107c3fc9 🐛 Fix incorrect event name on event constructor 2025-07-21 11:58:48 +02:00
Alejandro Alonso
abef9f3cf7 Merge pull request #6889 from penpot/niwinz-staging-bugfix
🐛 Fix unexpected exception on processing old texts
2025-07-14 07:08:31 +02:00
Andrey Antukh
40c300fa1a 🐛 Fix unexpected exception on processing old texts 2025-07-10 09:22:00 +02:00
Alejandro Alonso
5b704faf79 Merge pull request #6862 from penpot/niwinz-develop-minor-fixes
 Add several improvements
2025-07-07 15:40:20 +02:00
Andrey Antukh
d24eab7241 📎 Update changelog 2025-07-07 15:07:07 +02:00
Andrey Antukh
c8fef97598 Add missing field on get-teams rpc method 2025-07-07 13:36:00 +02:00
Andrey Antukh
44e3e4a641 🔥 Remove image shape inspect pannel
Image shapes are long ago deprecated not used
on penpot
2025-07-07 13:36:00 +02:00
Andrey Antukh
f3616c68a0 Improve decode empty string for path content 2025-07-07 13:36:00 +02:00
Andrey Antukh
9ea3f81bc4 🐛 Clean invalid library colors 2025-07-07 13:35:59 +02:00
Alonso Torres
accd5226d7 🐛 Fix sidebar width in localhost (#6732) 2025-07-07 09:28:52 +02:00
Andrey Antukh
16a1fd14e5 🐛 Fix media translation on text nodes on paste (#6845)
Fix incorrect media translation on paste text with fill images
2025-07-07 09:03:35 +02:00
Aitor Moreno
824bb19c7e Merge pull request #6848 from penpot/niwinz-staging-library-referer
 Add referer field to binfile v3
2025-07-07 09:02:13 +02:00
Aitor Moreno
d0f3e0f0b0 Merge pull request #6853 from penpot/niwinz-staging-path-bool-fixes
🐛 Fix exception on a corner case of creating bool shape
2025-07-07 09:00:57 +02:00
Andrey Antukh
43ba2b05e8 📎 Change current config values for error report explain 2025-07-04 14:51:08 +02:00
Andrey Antukh
d5ccb704b2 🐛 Fix unexpected exception on creating bool shapes 2025-07-04 14:42:09 +02:00
David Barragán Merino
6d21fcc9de 🔧 Fix condition for automatic events (#6849) 2025-07-04 11:57:57 +02:00
Andrey Antukh
77741b49a7 Add tracking for referer on the import-binfile 2025-07-04 11:02:36 +02:00
Andrey Antukh
a7e0cfc609 🎉 Bump 1.0.7 release of the penpot library
Includes the ability to pass referer
2025-07-04 11:02:36 +02:00
Andrey Antukh
50a6355537 🎉 Add options for creating library build context
With the ability to pass referer.
2025-07-04 11:02:36 +02:00
Alejandro Alonso
264aef277d Merge pull request #6847 from penpot/niwinz-staging-error-reports-2
 Add minor improvements to error report on calc bool content
2025-07-04 10:53:02 +02:00
Andrey Antukh
78d0e6d059 Add minor improvements to error report on calc bool content 2025-07-04 10:13:24 +02:00
Alonso Torres
6d41d36b3a 🐛 Fix problem when double click on hidden shapes (#6833) 2025-07-04 09:01:20 +02:00
David Barragán Merino
bb97df373e 🔧 Add Github Action to build and upload artifact (#6840)
Co-authored-by: Francis Santiago <francis.santiago@kaleidos.net>
2025-07-04 08:41:46 +02:00
Alejandro Alonso
a41af032cd Merge pull request #6844 from penpot/niwinz-staging-enhancements
 Improve error reporting
2025-07-03 15:31:20 +02:00
Andrey Antukh
86ee4f55c5 📚 Update docstring 2025-07-03 14:54:00 +02:00
Andrey Antukh
63cd3ae025 Add better error handling for bool creation 2025-07-03 14:54:00 +02:00
Andrey Antukh
cafb7abb53 🎉 Add better syntax facility for ex/try! macro 2025-07-03 14:54:00 +02:00
Andrey Antukh
e5b6c4a9e0 Add minor improvement to error reporter logger 2025-07-03 14:54:00 +02:00
Andrey Antukh
1d5bad5523 💄 Report file-id on file changes exception 2025-07-03 14:54:00 +02:00
Andrey Antukh
96d6868b45 🐛 Add missing fields on get-team-shared-files query 2025-07-03 14:54:00 +02:00
Andrey Antukh
b739d8bd0c 💄 Change default depth on params for error reports 2025-07-03 14:54:00 +02:00
Alejandro Alonso
dd803dc1de Merge pull request #6839 from penpot/niwinz-staging-fix-broken-path
🐛 Add migration for fix undecoded path content
2025-07-03 13:43:59 +02:00
Andrey Antukh
b627c10737 🔥 Remove duplicated check-fn 2025-07-03 10:50:09 +02:00
María Valderrama
95f4a9bd29 Add missing start-plugin event (#6809)
*  Add missing start-plugin event

* 📎 Correct event origin
2025-07-03 10:29:43 +02:00
Andrey Antukh
a2b8f19ff3 🐛 Add migration for fix undecoded path content 2025-07-03 08:40:23 +02:00
Andrey Antukh
898182e3d5 Add minor events props normalization (#6836) 2025-07-02 14:41:48 +02:00
Miguel de Benito Delgado
e03c822b51 🐛 Fix internal error on missing theme setting in profile (#6822) 2025-07-02 10:17:22 +02:00
Eva Marco
a3aabf3b7d 🐛 Fix tooltip position after click (#6830) 2025-07-02 09:56:14 +02:00
Andrés Moya
5c4fd97541 🐛 Allow importing file without any token but with themes or sets (#6796) 2025-06-27 11:32:14 +02:00
Alejandro Alonso
3010abbf64 Merge pull request #6793 from penpot/alotor-fix-plugins-system-theme
🐛 Fix problem with plugins on system theme
2025-06-26 12:30:51 +02:00
alonso.torres
e6a7eed7a9 🐛 Fix problem with plugins on system theme 2025-06-26 12:15:06 +02:00
Alejandro Alonso
daf3b5caa8 🐛 Fix slow color picker (#6780) 2025-06-26 11:07:35 +02:00
Andrey Antukh
34d65ed1c8 Merge pull request #6775 from penpot/superalex-fix-entering-long-project-name
🐛 Fix entering long project name
2025-06-26 10:48:54 +02:00
Alejandro Alonso
27c624ae0f Merge pull request #6787 from penpot/niwinz-staging-hotfix-4
🐛 Several fixes
2025-06-26 09:13:49 +02:00
Andrey Antukh
3831b3034e 🐛 Fix boolean shape migration that causes issues on import 2025-06-26 08:55:09 +02:00
Andrey Antukh
00390a1349 🐛 Add correct is-text-node? predicate to text processing methods 2025-06-26 08:32:11 +02:00
Andrey Antukh
17bfed137c 📎 Add better defaults for text processing on old migrations 2025-06-26 08:32:11 +02:00
Andrey Antukh
77ef26b207 📎 Add srepl script for validate file schema 2025-06-26 08:32:11 +02:00
Andrey Antukh
26239a15f2 📎 Add missing changes on lost-colors fix script 2025-06-25 20:13:35 +02:00
Andrey Antukh
207974fe6c Add minor improvement to color cleaning migration 2025-06-25 19:26:43 +02:00
Andrey Antukh
b52e2fa681 🐛 Add missing version field on get-team-shared-files internal query 2025-06-25 19:24:18 +02:00
Andrey Antukh
bf719b587f Add better shadow cleaning migration 2025-06-25 19:17:58 +02:00
Alejandro Alonso
61109c91e3 Merge pull request #6784 from penpot/niwinz-staging-hotfix-3
🐛 Fix incorrect library color cleaning mechanism
2025-06-25 16:21:58 +02:00
Andrey Antukh
4915a97c2c 📎 Add script for restoring lost colors 2025-06-25 16:10:35 +02:00
Andrey Antukh
903aba5642 🐛 Fix incorrect library color cleaning mechanism 2025-06-25 14:36:33 +02:00
Alejandro Alonso
82583f5079 🐛 Fix entering long project name 2025-06-25 14:21:52 +02:00
Alejandro Alonso
4561392791 🐛 Fix shortcut error pressing G+W from the View Mode (#6772) 2025-06-25 14:14:44 +02:00
Alejandro Alonso
8e8b2acddd Merge pull request #6781 from penpot/niwinz-staging-hotfix-2
🐛 Hot fixes
2025-06-25 13:53:58 +02:00
Andrey Antukh
93cbd99932 🐛 Clear invalid keys from color libraries 2025-06-25 13:38:35 +02:00
Andrey Antukh
15c91a5de5 Make the bool-content normalize migration idempotent 2025-06-25 13:26:32 +02:00
Andrey Antukh
7f2e819789 🐛 Fix migration persistence ordering issue
When migrations are applied to old files
2025-06-25 13:26:25 +02:00
Alejandro Alonso
4947bf480b Merge pull request #6779 from penpot/niwinz-staging-hotfix-2
🐛 Fix regression on changing color type on fills
2025-06-25 12:27:34 +02:00
Alejandro Alonso
c51ae35fc5 Merge pull request #6777 from penpot/niwinz-staging-hotfix-1
🐛 Remove qualified keyword keys from colors
2025-06-25 12:13:53 +02:00
Andrey Antukh
81564dbfa9 🐛 Fix regression on changing color type on fills 2025-06-25 12:12:04 +02:00
Andrey Antukh
56472a95de 🐛 Add missing file migration to get-team-shared-files rpc method 2025-06-25 11:56:11 +02:00
Andrey Antukh
9e5bc3675c 🐛 Remove cider nrepl handler from default nrepl server 2025-06-25 11:41:24 +02:00
Andrey Antukh
787c066357 🐛 Remove qualified keyword keys from colors 2025-06-25 11:23:39 +02:00
Marina López
82bedda604 Add tokens library to dashboard carousel (#6769) 2025-06-25 10:22:19 +02:00
Alejandro Alonso
1b67be2f36 Merge pull request #6773 from penpot/niwinz-staging-paste-regression
🐛 Fix minor regression on paste shapes with fill-image
2025-06-25 10:02:36 +02:00
Andrey Antukh
1a8a9df2b7 🐛 Fix minor regression on paste shapes with fill-image 2025-06-25 09:40:17 +02:00
Alejandro Alonso
e1ce7ec787 Merge pull request #6752 from penpot/niwinz-staging-path-editor-fixes
🐛 Fix incorrect path tool handling on shapes not coerced to path
2025-06-25 07:25:13 +02:00
Andrey Antukh
546b7d5f60 🐛 Fix incorrect path tool handling on shapes not coerced to path 2025-06-24 19:09:38 +02:00
Alejandro Alonso
fb6121bf92 Merge pull request #6765 from penpot/alotor-update-plugins-runtime
⬆️ Update plugins runtime
2025-06-24 13:14:53 +02:00
alonso.torres
8cdcfb70e2 ⬆️ Update plugins runtime 2025-06-24 09:25:12 +02:00
andrés gonzález
8c2dc1f22d 📚 Add DT import/export options to the docs (#6753) 2025-06-23 15:37:57 +02:00
ºelhombretecla
1b041d949c 💄 Add new content for 2.8 release slides (#6729)
* 💄 Add new content for 2.8 release slides

* 📎 Fix linter issues

---------

Co-authored-by: Andrey Antukh <niwi@niwi.nz>
2025-06-23 09:43:55 +02:00
Eva Marco
1a8f36562b 🐛 Fix export button width on design tab (#6744) 2025-06-20 12:04:49 +02:00
Alejandro Alonso
3d0c3013e5 Merge pull request #6746 from penpot/niwinz-staging-path-editor-fixes
 Add missing fixes to the path edition mode
2025-06-20 11:31:17 +02:00
Andrey Antukh
3274a74611 Add missing fixes to the path edition mode 2025-06-20 11:06:48 +02:00
Alejandro Alonso
3a0ac577f8 Merge pull request #6720 from penpot/niwinz-staging-path-editor-fixes
 Fix path edition/drawing state on workspace
2025-06-20 10:34:19 +02:00
Andrés Moya
cf78e68787 🐛 Fix token unapply for text shapes 2025-06-20 10:15:49 +02:00
Alejandro Alonso
43ba30c694 Merge pull request #6741 from penpot/niwinz-staging-join-nodes
🔥 Remove incorrect assert on path segment helper
2025-06-20 08:22:27 +02:00
Andrey Antukh
520ea0e094 🔥 Remove incorrect assert on path segment helper 2025-06-20 08:01:59 +02:00
Andrey Antukh
0c260c626b Make the path creation flow consistent 2025-06-20 07:41:06 +02:00
Andrey Antukh
db4721f692 Forward path edition state from vieweport to editor 2025-06-20 07:41:06 +02:00
Andrey Antukh
f8d63f5d9d 🐛 Fix incorrect path drawing/edition state management 2025-06-20 07:41:06 +02:00
Andrey Antukh
0f46efc117 Merge pull request #6733 from penpot/eva-bugfixing
🐛 Fix some bugs
2025-06-19 15:29:34 +02:00
Eva Marco
909838c8c4 🐛 Fix snap nodes shortcut 2025-06-19 14:01:15 +02:00
Eva Marco
86e36061fb 🐛 Fix multiple values on text 2025-06-19 13:41:35 +02:00
Eva Marco
fbdabcd913 🐛 Fix button width 2025-06-19 12:51:53 +02:00
Alejandro Alonso
191ea3d02a Merge pull request #6637 from penpot/mavalroot-missing-events
 Add missing user experience events
2025-06-19 12:11:07 +02:00
Andrey Antukh
b747ccc382 🎉 Add shortcut helper for creating events 2025-06-19 11:38:08 +02:00
Andrey Antukh
892c9ab12c Add minor code consistency fixes 2025-06-19 11:38:08 +02:00
Eva Marco
b595d5abf8 🐛 Fix radio buttons gap 2025-06-19 11:23:32 +02:00
María Valderrama
cb46d643ac Add missing user experience events 2025-06-19 11:22:58 +02:00
Andrey Antukh
03a82c18cb Merge pull request #6726 from penpot/eva-fix-comment-icon
🐛 Fix comment icon fill
2025-06-19 09:43:02 +02:00
Andrey Antukh
a559547f97 Merge pull request #6727 from penpot/bameda-fix-typo
🐛 Fix a typo
2025-06-19 09:42:35 +02:00
David Barragán Merino
b91d703060 🐛 Fix a typo 2025-06-19 09:34:53 +02:00
Eva Marco
7bde3d0ec1 🐛 Fix comment icon fill 2025-06-19 08:51:29 +02:00
Andrey Antukh
54643b79f6 🐛 Fix exception on changing hex color on colorpicker gradient editor (#6718) 2025-06-18 17:59:14 +02:00
Andrey Antukh
f0b82864dd Merge pull request #6719 from penpot/andy-changelog-update
📚 Update changelog
2025-06-18 15:04:28 +02:00
Andres Gonzalez
29244776f0 📚 Update changelog 2025-06-18 14:11:35 +02:00
Andrey Antukh
40c33c7dcc Merge pull request #6715 from penpot/alotor-bug-fix-workaround
🐛 Fix problem fetching images
2025-06-18 14:09:29 +02:00
alonso.torres
1a6fcb5daf 🐛 Fix problem fetching images 2025-06-18 13:26:15 +02:00
Andrey Antukh
34febfc833 📎 Update indirect dependencies 2025-06-18 13:20:45 +02:00
Andrey Antukh
2c0abea254 📎 Add missing deps for build wasm tests 2025-06-18 12:45:25 +02:00
Andrey Antukh
4524782282 📎 Adapt backend test to devenv changes 2025-06-18 12:35:58 +02:00
Alejandro Alonso
2a5b087aa4 Merge pull request #6714 from penpot/niwinz-staging-fix-path-edition
🐛 Fix unexpected exception on selectiong node on non path shape
2025-06-18 10:45:36 +02:00
Alejandro Alonso
1f034654a0 Merge pull request #6705 from penpot/niwinz-staging-docker-improvements
 Major improvement and update to docker images and devenv
2025-06-18 10:39:51 +02:00
Andrey Antukh
1576016999 Merge pull request #6711 from penpot/elenatorro-11212-fix-right-sidebar-overflow
🐛 Fix right-sidebar width overflow
2025-06-18 10:38:18 +02:00
Andrey Antukh
e3cce104e1 🐛 Fix unexpected exception on selectiong node on non path shape 2025-06-18 10:12:24 +02:00
Alejandro Alonso
a24631ac66 Merge pull request #6710 from penpot/niwinz-staging-path-make-curve-point
🐛 Fix incorrect behavior of `make-curve-point` fn
2025-06-18 10:06:28 +02:00
Andrey Antukh
fd81ea6a84 🔥 Remove commented code 2025-06-18 09:46:15 +02:00
Andrey Antukh
a3c7151157 ⬆️ Update indirect exporter module dependencies 2025-06-18 09:46:15 +02:00
Andrey Antukh
2d4fc3e05f ♻️ Refactor devenv build mechanism
This introduces multistage build process for devenv making
different dependencies build depend on its own (per example, when
jvm version is changed, only the jvm stage is rebuild)

This commit also introduces imagemagick 7.x custom build
in the same way as we have on public docker images, so on
devenv we use the same version.
2025-06-18 09:46:15 +02:00
Andrey Antukh
b01dea20d6 Add imagemagick custom build to backend docker image
This allows us be in control of the imagemagick version and not
depend on the version available on the distro repository, which
right now only ships the legacy 6.x version
2025-06-18 09:46:15 +02:00
Andrey Antukh
3f40a830fd Revisit exporter docker image dependencies
And remove cache for not include unnecessary files on
the docker image.
2025-06-18 09:46:15 +02:00
Andrey Antukh
50e9816526 Use custom jre for backend image
Mainly for reduce the size of the image and not include
not necessary modules. It also starts using multistage
dockerfiles for fetch and setup jdk and node and then
only copy the required files.
2025-06-18 09:46:15 +02:00
Andrey Antukh
4c0165da62 ⬆️ Update node dependency on devenv 2025-06-18 09:46:15 +02:00
Andrey Antukh
42d36bae0a Update several node based dependencies 2025-06-18 09:46:15 +02:00
Andrey Antukh
6dd0f4f164 🔥 Remove unused jvm options from backend start-dev script 2025-06-18 09:46:15 +02:00
Elena Torro
f7c4bd77be 🐛 Fix right-sidebar width overflow 2025-06-18 09:10:01 +02:00
Alejandro Alonso
5d72954611 Merge pull request #6707 from penpot/niwinz-staging-fix-path-join-nodes
🐛 Fix incorrect type handling on path join nodes operation
2025-06-18 07:37:58 +02:00
Alejandro Alonso
9930f54558 Merge pull request #6706 from penpot/niwinz-staging-opacity-fix
🐛 Fix incorrect handling of opacity change on gradient stop
2025-06-18 07:32:34 +02:00
Alejandro Alonso
667c9ddbb9 Merge pull request #6698 from penpot/niwinz-staging-fix-exporter
🐛 Fix incorrect params handling on exporter
2025-06-18 07:29:36 +02:00
Alejandro Alonso
4f09005586 Merge pull request #6694 from penpot/niwinz-staging-fix-profile-lang
🐛 Fix bad initial state on profile settings
2025-06-18 07:26:42 +02:00
Alejandro Alonso
cbc98a761f Merge pull request #6693 from penpot/niwinz-staging-register-regression
🐛 Fix regression on singup flow
2025-06-18 07:23:37 +02:00
Andrey Antukh
c3b306201d 🐛 Fix incorrect behavior of make-curve-point fn 2025-06-17 23:18:34 +02:00
Andrey Antukh
a772b442c8 🐛 Fix incorrect type handling on path join nodes operation 2025-06-17 17:34:37 +02:00
Andrey Antukh
332bbc71c3 🐛 Fix incorrect handling of opacity change on gradient stop 2025-06-17 16:14:10 +02:00
Andrey Antukh
c5b0206bf0 🐛 Add workaround for webkit issue on fileReader (#6697)
On reading blob as data uri
2025-06-17 15:25:58 +02:00
Andrey Antukh
22ca1ab5f9 🐛 Fix incorrect params handling on exporter
that caused unexpected exception on multiple exports
2025-06-16 16:58:03 +02:00
Andrey Antukh
acf0d02c5d Merge pull request #6696 from penpot/eva-add-export-metrics
🎉 Add token export event tag
2025-06-16 16:50:49 +02:00
Eva Marco
5ccf34fdae 🐛 Fix reposition on tooltip 2025-06-16 16:34:53 +02:00
Eva Marco
41c8bba1df ♻️ Remove anonym fn 2025-06-16 16:23:53 +02:00
Eva Marco
325a78a967 🎉 Add token export event tag 2025-06-16 16:20:14 +02:00
mirakernel
409ff31c30 🐛 Avoid crash on empty string in interaction prototype (#6687)
Fixes #6469

Using `uuid/parse` caused a crash when "Relative to" field was set to "auto",
producing an empty string. This change uses `uuid/parse*` instead, which safely
returns nil for invalid or empty inputs, preventing the crash.

Signed-off-by: Dmitriy Mikheev <mirakernel.disroot.org>
Co-authored-by: kira <kira@kira.kira>
2025-06-16 15:19:45 +02:00
Andrey Antukh
8cb42a63e5 🐛 Fix bad initial state on profile settings 2025-06-16 15:05:29 +02:00
Andrey Antukh
2af1feafb6 Merge pull request #6667 from penpot/niwinz-develop-enhacements-2
 Add internal changes to tooltip* ds component
2025-06-16 15:03:42 +02:00
Eva Marco
691a67b595 🐛 Fix tooltip height on safari 2025-06-16 14:45:12 +02:00
Andrey Antukh
f7e94accc3 Add internal performance oriented changes to tooltip* 2025-06-16 14:45:12 +02:00
Andrey Antukh
fc655224af Add memorization to icon-button* ds component 2025-06-16 14:45:12 +02:00
Andrey Antukh
8b0ead6832 🐛 Fix regression on singup flow
Move all params handling to prepare-register, just for consistency
2025-06-16 14:31:30 +02:00
Alejandro Alonso
10ae4dd3f7 Merge pull request #6689 from penpot/niwinz-staging-add-sr-lang
 Add several fixes & enhancements
2025-06-16 13:43:24 +02:00
Andrey Antukh
34d6e86e42 🐛 Fix incorrect theem selection on export progress bar color 2025-06-16 13:42:43 +02:00
Andrey Antukh
481d1ec53a Normalize layout schemas 2025-06-16 13:42:43 +02:00
Andrey Antukh
c6f4ee1974 ⬆️ Update cuerdas dependency
Fixes a corner case with camel->kebab casing
2025-06-16 13:42:41 +02:00
Andrey Antukh
f20032199a 🎉 Add Serbian lang 2025-06-16 13:42:22 +02:00
María Valderrama
d0aac65c76 🐛 Fix misalignments at create account (#6692) 2025-06-16 13:26:33 +02:00
María Valderrama
f21e546bc1 Add import error event (#6690) 2025-06-16 10:39:56 +02:00
Alonso Torres
874a658369 Adds generateFontFaces method to the plugins api (#6682)
*  Adds generateFontFaces method to the plugins api

* ⬆️ Update plugin runtime
2025-06-16 09:28:04 +02:00
Alonso Torres
c254ebd7c3 🐛 Fix problem with import modal style (#6683) 2025-06-16 09:26:35 +02:00
Florian Schrödl
267a3af1e5 💄 Fixes export dialog styling issues (#6673)
* 🐛 Fix text overflow in file list
* 💄 Set monospace font for code-block component
* 💄 Reduce padding
2025-06-11 10:43:02 +02:00
Andrey Antukh
b8ee7cad26 Merge pull request #6663 from penpot/alotor-plugins-bugfixes
 Plugins fixes and enhancements
2025-06-10 15:30:32 +02:00
alonso.torres
26efc9f0c8 📚 Add documentation for new plugin permission 2025-06-10 15:09:22 +02:00
alonso.torres
1d593e1287 ⬆️ Updates plugins runtime 2025-06-10 15:09:22 +02:00
alonso.torres
b34c161fc3 Adds local store proxy in plugins 2025-06-10 15:09:22 +02:00
alonso.torres
ed0c84a069 Exposes board clipContent and showInViewMode properties in plugins 2025-06-10 15:06:31 +02:00
alonso.torres
29466b47fe Adds skipChildren to export parameters 2025-06-10 15:06:30 +02:00
David Barragán Merino
b385f055e0 🐳 Migrate from Redis to Valkey (#6666) 2025-06-10 10:08:10 +02:00
Alejandro Alonso
5faa619bc4 Merge pull request #6664 from penpot/niwinz-hotfix-1
🐛 Add better fix for path transformation
2025-06-10 08:51:51 +02:00
Andrey Antukh
74430aad21 📎 Add missing emsd loading to devenv bashrc 2025-06-09 15:57:31 +02:00
Andrey Antukh
01dda6dd6b 🐛 Add better fix for path transformation 2025-06-09 12:46:53 +02:00
Andrey Antukh
b2bc481672 Merge remote-tracking branch 'origin/develop' into staging 2025-06-09 12:21:09 +02:00
Andrey Antukh
8c337f508b Merge remote-tracking branch 'origin/staging' into develop 2025-06-09 12:20:55 +02:00
Andrey Antukh
f9f45dc612 🐛 Fix path rotation issue (#6662) 2025-06-09 12:14:09 +02:00
Anonymous
93542854c1 🌐 Add translations for: Swedish
Currently translated at 86.6% (1610 of 1857 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/sv/
2025-06-09 11:13:39 +02:00
Anonymous
858f94c6d2 🌐 Add translations for: Dutch
Currently translated at 96.5% (1793 of 1857 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2025-06-09 11:13:38 +02:00
Anonymous
f932d663b0 🌐 Add translations for: Latvian
Currently translated at 96.5% (1793 of 1857 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2025-06-09 11:13:38 +02:00
Anonymous
63631e60cd 🌐 Add translations for: Ukrainian (ukr_UA)
Currently translated at 96.5% (1793 of 1857 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ukr_UA/
2025-06-09 11:13:38 +02:00
Anonymous
6018cd67c5 🌐 Add translations for: Croatian
Currently translated at 87.1% (1619 of 1857 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/hr/
2025-06-09 11:13:37 +02:00
Anonymous
4856d0e957 🌐 Add translations for: Portuguese (Portugal)
Currently translated at 85.7% (1592 of 1857 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2025-06-09 11:13:37 +02:00
Anonymous
995ca4d7d9 🌐 Add translations for: Czech
Currently translated at 87.1% (1618 of 1857 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/cs/
2025-06-09 11:13:37 +02:00
Anonymous
d5d254a7f3 🌐 Add translations for: Italian
Currently translated at 96.5% (1793 of 1857 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2025-06-09 11:13:36 +02:00
Anonymous
69f45dc811 🌐 Add translations for: Chinese (Traditional Han script)
Currently translated at 87.3% (1623 of 1857 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/
2025-06-09 11:13:35 +02:00
Anonymous
7534ad283c 🌐 Add translations for: Hebrew
Currently translated at 96.5% (1793 of 1857 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2025-06-09 11:13:34 +02:00
Anonymous
3d6695171d 🌐 Add translations for: Indonesian
Currently translated at 92.7% (1722 of 1857 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2025-06-09 11:13:34 +02:00
Anonymous
8fa28ce176 🌐 Add translations for: German
Currently translated at 89.9% (1670 of 1857 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2025-06-09 11:13:34 +02:00
Anonymous
f03a0de665 🌐 Add translations for: French
Currently translated at 95.7% (1778 of 1857 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2025-06-09 11:13:34 +02:00
Anonymous
555af2fa52 🌐 Add translations for: English
Currently translated at 99.7% (1852 of 1857 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/en/
2025-06-09 11:13:33 +02:00
Andrey Antukh
0683b20b25 🌐 Rehash and validate translation files 2025-06-09 11:01:08 +02:00
Hosted Weblate
163ae639ff 🌐 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/
2025-06-09 10:57:51 +02:00
Andrey Antukh
354ba91aa6 Merge remote-tracking branch 'weblate/develop' into develop 2025-06-09 10:57:13 +02:00
Andrey Antukh
38d9a9d2d5 📎 Update changelog 2025-06-09 10:29:18 +02:00
Yamila Moreno
beb3d16693 📎 Fix minor typo (#6661) 2025-06-09 10:25:16 +02:00
Andrey Antukh
5770c0cb02 Merge pull request #6625 from penpot/niwinz-develop-enhacements-1
 Several enhacements
2025-06-09 10:24:44 +02:00
Eva Marco
46ce9500fc 🐛 Fix absolute position tooltip message (#6660) 2025-06-09 09:52:35 +02:00
Alejandro Alonso
d008ea9edd Merge pull request #6652 from penpot/elenatorro-fix-load-fonts
🐛 Fix fonts initialization
2025-06-09 09:31:00 +02:00
Eva Marco
eba8d02c18 📚 Update changelog 2025-06-06 15:48:39 +02:00
Florian Schrödl
bb9daf7c03 Add export tokens modal with multi-file export (#6649) 2025-06-06 15:37:10 +02:00
Andrey Antukh
f1232fc461 🐛 Fix issues with old profile theme data 2025-06-06 15:25:49 +02:00
Andrey Antukh
9584e1b02d 📎 Add missing playwright chromium install to devenv 2025-06-06 15:10:52 +02:00
Edgars Andersons
96ccac5085 🌐 Add translations for: Latvian
Currently translated at 99.9% (1807 of 1808 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2025-06-06 13:03:07 +00:00
Ingrid Pigueron
2540d58096 🌐 Add translations for: French
Currently translated at 98.7% (1786 of 1808 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2025-06-06 13:03:05 +00:00
Andrey Antukh
de2695682d Allow encode mailto and self target link in markdown
On translation files
2025-06-06 14:03:52 +02:00
Andrey Antukh
e464d8cf9c 📎 Add library tests to circle-ci config 2025-06-06 14:03:52 +02:00
Andrey Antukh
a8433bcef3 🐛 Fix incorrect decoding of library color 2025-06-06 14:03:52 +02:00
Andrey Antukh
644dd9ff44 🎉 Add support for progress reporting to library export method 2025-06-06 14:03:52 +02:00
Andrey Antukh
27d2724153 🐛 Fix incorrect shape filtering on bool creation on library 2025-06-06 14:03:52 +02:00
Andrey Antukh
c647d122d8 ⬆️ Update frontend dependencies 2025-06-06 14:03:52 +02:00
Andrey Antukh
e4a65f3a04 ⬆️ Update backend dependencies 2025-06-06 14:03:52 +02:00
Andrey Antukh
389f1d6502 ⬆️ Update common dependencies 2025-06-06 14:03:52 +02:00
Andrey Antukh
b91a670198 Replace redis with valkey on devenv compose file 2025-06-06 14:03:52 +02:00
Andrey Antukh
5650629b73 Add minimal wait to run-devenv when no compose is started 2025-06-06 14:01:10 +02:00
Andrey Antukh
a4310b4213 🔥 Remove usage of dm/assert on data.profile ns file 2025-06-06 14:01:10 +02:00
Elena Torro
a8d4b293dc 🐛 Fix loading same resources multiple times 2025-06-06 12:26:35 +02:00
Alejandro Alonso
fec7d5cff2 🐛 Fix detach stroke (#6655) 2025-06-06 12:24:18 +02:00
Alejandro Alonso
5e254ff3f6 Merge pull request #6643 from penpot/azazeln28-refactor-performance-improvements
♻️ Minor performance improvements
2025-06-06 11:38:53 +02:00
Elena Torro
8c20159fb0 🐛 Cache emoji font correctly 2025-06-06 11:28:50 +02:00
Elena Torro
79e1c29306 🐛 Fix emoji detection and load 2025-06-06 11:28:50 +02:00
Aitor Moreno
fcd3e5c34c ♻️ Refactor surface iteration 2025-06-06 10:21:31 +02:00
Eva Marco
8b9f15f414 🐛 Fix select color tooltip error (#6648) 2025-06-05 21:15:00 +02:00
Pablo Alba
b2aaa5f0df ♻️ Remove separate the content of the text of the rest of properties on components updates 2025-06-05 16:43:23 +02:00
Aitor Moreno
8922e7454f ♻️ Refactor some allocations 2025-06-05 15:37:03 +02:00
Alejandro Alonso
4f7d97a31e Merge pull request #6641 from penpot/ladybenko-fix-fills-wasm
🐛 Fix set-shape-fills serialization (wasm renderer)
2025-06-05 14:24:27 +02:00
Stas Haas
e32af5e71e 🌐 Add translations for: German
Currently translated at 92.4% (1672 of 1808 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2025-06-05 14:09:36 +02:00
Ingrid Pigueron
6cb5b812da 🌐 Add translations for: French
Currently translated at 98.0% (1772 of 1808 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2025-06-05 14:09:36 +02:00
Belén Albeza
ca24e23775 🐛 Fix set-shape-fills serialization (wasm renderer) 2025-06-05 14:04:41 +02:00
Alejandro Alonso
28ed62fb2c Merge pull request #6640 from penpot/niwinz-develop-hotfix-1
🐛 Remove fills from paragraph-set nodes on text shapes
2025-06-05 14:03:18 +02:00
Andrey Antukh
9c4b60e95f 🐛 Fix incorrect opacity assignation on changing fill from solid to gradient 2025-06-05 13:34:13 +02:00
Andrey Antukh
6719902647 Add color checks and test of event creation for fills 2025-06-05 13:34:13 +02:00
Andrey Antukh
cf8307af8f 📎 Update changelog 2025-06-05 13:29:51 +02:00
Andrey Antukh
8c54cb764f 🐛 Remove fills from paragraph-set nodes on text shapes 2025-06-05 13:11:39 +02:00
Eva Marco
4a9fef12eb 🐛 Fix url params on invitation link (#6638) 2025-06-05 12:28:53 +02:00
Alejandro Alonso
ea4e69f381 Merge pull request #6633 from penpot/niwinz-develop-hotfix-1
🐛 Fix library color detach operation
2025-06-05 11:04:57 +02:00
Anderson Paulo
5fed12d807 🌐 Add translations for: Portuguese
Currently translated at 5.1% (93 of 1808 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt/
2025-06-05 11:01:50 +02:00
Edgars Andersons
a2f41a7a40 🌐 Add translations for: Latvian
Currently translated at 99.3% (1797 of 1808 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2025-06-05 11:01:47 +02:00
Stas Haas
f4fd9fa13d 🌐 Add translations for: German
Currently translated at 92.3% (1669 of 1808 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2025-06-05 11:01:47 +02:00
Andrés Moya
8a0aa20789 🔧 Renames, privacy adjustments and other small enhancements 2025-06-05 10:58:23 +02:00
Andrés Moya
1b3a200010 🔧 Reorder code for more legibility 2025-06-05 10:58:23 +02:00
Andrés Moya
70263ba901 🔥 Remove unused code 2025-06-05 10:58:23 +02:00
Andrés Moya
5c8f6dd498 🔧 Add internal id to all token entities 2025-06-05 10:58:23 +02:00
Eva Marco
a2abaea637 ♻️ Update button-icon with tooltip component (#6539)
* 🐛 Add tooltip to base icon button

* 🎉 Update id prop

* 🐛 Fix test
2025-06-05 10:18:56 +02:00
Alejandro Alonso
55997a3d4a Merge pull request #6634 from penpot/ladybenko-fit-set-shape-fills
🐛 Fix wasm crash in set_shape_fills (wasm) when fill list is empty
2025-06-05 10:07:34 +02:00
Belén Albeza
a30ab17605 🐛 Fix wasm crash in set_shape_fills (wasm) when fill list is empty 2025-06-05 09:52:51 +02:00
Eva Marco
ab0219876e Add numeric token type (#6575)
*  Add numeric type token

* 🐛 Fix comments
2025-06-05 09:33:54 +02:00
Andrey Antukh
19961f440a 🐛 Fix library color detach operation 2025-06-05 09:33:06 +02:00
Alejandro Alonso
db84eb365b 🐛 Fix strokes migration (#6632) 2025-06-05 08:42:57 +02:00
Marina López
b7f97dbeea 🐛 Subscription review fixes (#6628) 2025-06-04 21:01:48 +02:00
Elenzakaleidos
4cbaef1451 💄 New video in the README.md (#6629)
I added a new video in the readme page cause the previous one had the wrong name

Signed-off-by: Elenzakaleidos <elena.scilinguo@kaleidos.net>
2025-06-04 21:00:49 +02:00
andrés gonzález
e1adbdfd9f 📚 Update changelog (#6616) 2025-06-04 15:12:33 +02:00
Alejandro Alonso
687e1e7b0b Merge pull request #6569 from penpot/niwinz-fills-cleanup
♻️ Clean and sanitize color types
2025-06-04 14:26:12 +02:00
Alejandro Alonso
055ee27be0 🐛 Add migrations to fix colors 2025-06-04 14:01:48 +02:00
Andrés Moya
47af278f5e 🐛 Remove unneeded check 2025-06-04 13:11:16 +02:00
Andrey Antukh
29ad99d685 🐛 Fix incorrect declaration of tokens lib schema decoder 2025-06-04 13:03:51 +02:00
Andrey Antukh
3a8b312f6d 🐛 Fix calculate hash on empty path data instance 2025-06-04 13:03:51 +02:00
Andrey Antukh
8f55269522 🐛 Remove unknown types from stroke style schema 2025-06-04 13:03:51 +02:00
Andrey Antukh
f86ce38f04 🎉 Add Fills binary data type 2025-06-04 13:03:51 +02:00
Andrey Antukh
b97a3f9783 Add tests for common buffers namespace to the cljs test runner 2025-06-04 12:46:49 +02:00
Andrey Antukh
91807151ba Add stricter validation for gradient stop offset
It should be from a number from 0 to 1 inclusive
2025-06-04 12:46:49 +02:00
Andrey Antukh
5c225a51ce Add the ability to retrieve a set of keys from map schemas 2025-06-04 12:46:49 +02:00
Andrey Antukh
3d61924162 ♻️ Change internal naming for PathData cljs impl
For make it more consistent with CLJ impl and move
the equals helper to buffers for make it reusable by
other binary types.
2025-06-04 12:46:49 +02:00
Andrey Antukh
580013bc3f ⬆️ Update shadow-cljs to 3.1.5 2025-06-04 12:46:49 +02:00
Andrey Antukh
9ec5467e2a 🐛 Fix incorrect neested data structure validation on components
This commit upgrades rumext where the issue is fixed. It also
adapts the swatch component for correct data passing.
2025-06-04 12:46:49 +02:00
Andrey Antukh
b113736321 📎 Disable shadow-cljs reload on storybook build 2025-06-04 12:46:49 +02:00
Andrey Antukh
22db773b2e 🔥 Remove unused code from worker import ns 2025-06-04 12:46:49 +02:00
Andrey Antukh
91636ffc41 🐛 Adapt inspect code to color type changes
Still contains broken code because it was already broken
2025-06-04 12:46:49 +02:00
Andrey Antukh
7160334cb9 ♻️ Add stricter validation for colors, fills and strokes 2025-06-04 12:46:49 +02:00
Andrey Antukh
d08d2f49ac Add better defaults for several number schema generators 2025-06-04 12:46:49 +02:00
Andrey Antukh
8f774a3611 Simplify media mime types structs 2025-06-04 12:46:49 +02:00
Andrey Antukh
d9d2cc7b4e Split byte buffer helpers from types path impl 2025-06-04 12:46:49 +02:00
Andrey Antukh
2e0fd6ec1b Merge pull request #6626 from penpot/niwinz-develop-fixes-4
🐛 Several bugfixes
2025-06-04 12:39:39 +02:00
Andrey Antukh
d2d39aad30 Make theme toggle skip "system" theme 2025-06-04 12:24:01 +02:00
Andrey Antukh
d6e0001ac4 🐛 Fix encoding and decoding issue with tokens lib type 2025-06-04 12:12:31 +02:00
Elena Torró
793c01a0a1 Merge pull request #6611 from penpot/elenatorro-add-new-render-texts-docs
📚 Add texts documentation
2025-06-04 10:11:31 +02:00
Elena Torró
bbac5d050e Merge pull request #6623 from penpot/ladybenko-11106-send-all-fills
 Send all fills of a shape in a single wasm call
2025-06-04 09:18:39 +02:00
Alejandro Alonso
5a7d9e3f18 Merge pull request #6609 from penpot/elenatorro-11213-fix-language-font-fallback
🎉 Implement font fallback to support multiple languages
2025-06-03 17:19:39 +02:00
Edgars Andersons
1a921c2750 🌐 Add translations for: Latvian
Currently translated at 99.1% (1792 of 1808 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2025-06-03 14:04:12 +00:00
Yaron Shahrabani
39f145b8b1 🌐 Add translations for: Hebrew
Currently translated at 99.9% (1807 of 1808 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2025-06-03 14:04:10 +00:00
Stas Haas
6611769dc9 🌐 Add translations for: German
Currently translated at 92.2% (1667 of 1808 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2025-06-03 14:04:08 +00:00
Eva Marco
b3d230ba16 📚 Add copyright to docs files (#6618) 2025-06-03 15:49:24 +02:00
Eva Marco
ddae0026fe 🎉 Add metrics to new multi file import (#6610) 2025-06-03 15:48:22 +02:00
Belén Albeza
9fc3f4858a Send all fills of a shape in a single wasm call 2025-06-03 15:37:36 +02:00
andrés gonzález
1120c7c7fb 🐛 Fix copy in error message (#6615) 2025-06-03 12:28:49 +02:00
Andrey Antukh
e9bd44b819 Merge remote-tracking branch 'origin/staging' into develop 2025-06-03 10:44:11 +02:00
Andrey Antukh
2244bf6aa7 Merge remote-tracking branch 'origin/main' into staging 2025-06-03 10:43:39 +02:00
Andrey Antukh
f4ef4a705c Merge tag '2.7.2-RC1' 2025-06-03 10:43:14 +02:00
Elena Torro
c40de5fb87 🎉 Implement font fallback to support multiple languages 2025-06-03 08:21:59 +02:00
Elena Torro
9733c41ae4 🐛 Fix blend mode on merge fills 2025-06-03 08:21:59 +02:00
Alejandro Alonso
fe8d9fdd76 Merge pull request #6614 from penpot/niwinz-staging-backport-1
 Make the hash optional on binfile-v3
2025-06-03 08:13:42 +02:00
Alejandro Alonso
401fa823a0 Merge pull request #6612 from penpot/niwinz-develop-devenv
🐛 Fix build issues on devenv
2025-06-03 07:49:34 +02:00
Andrey Antukh
3da3281a56 🐛 Fix library compatibility issue on media encoding with penpot 2.7 (#6613) 2025-06-02 23:25:39 +02:00
Andrey Antukh
3131eec271 Make the hash optional on binfile-v3
Backport the change from develop
2025-06-02 23:24:35 +02:00
Andrey Antukh
1909189ce0 Use different approach for setup cargo home 2025-06-02 22:29:39 +02:00
Andrey Antukh
0ec0917b6d Add isolated-shell to manage.sh
Instead of attaching to an existing devenv, starts a new one.
2025-06-02 19:13:20 +02:00
Andrey Antukh
0e4c535edc 📎 Print current path on frontend scripts build script 2025-06-02 19:11:55 +02:00
Andrey Antukh
46f330fef3 Move several logic from init to entrypoint on devenv
For make commands consistent independently if they are executed
inside devenv or from manage.sh
2025-06-02 19:10:48 +02:00
Andrey Antukh
f067c86b02 🔥 Remove unnecesary env vars from bashrc (devenv) 2025-06-02 19:10:20 +02:00
Andrey Antukh
2b6a91819b Reduce verbosity of frontend build script 2025-06-02 18:05:11 +02:00
Andrey Antukh
1f652fe364 Remove arm64 build of devenv
Looks unused right now
2025-06-02 17:44:22 +02:00
Elena Torro
4c10aeefe6 📚 Add texts documentation 2025-06-02 16:36:25 +02:00
Andrey Antukh
e70da78a77 Merge remote-tracking branch 'origin/staging' into develop 2025-06-02 12:55:22 +02:00
Andrey Antukh
27ab910a64 📚 Update changelog 2025-06-02 12:36:47 +02:00
Alejandro Alonso
c1fa6be7c4 Merge pull request #6591 from penpot/azazeln28-refactor-render-iteration
♻️ Refactor render iteration
2025-06-02 12:33:19 +02:00
Andrey Antukh
2398c1fc2b Merge pull request #6604 from penpot/alotor-fix-sandbox-runtime
🐛 Add sandbox runtime
2025-06-02 12:30:51 +02:00
Alejandro Alonso
13859f90b9 Merge pull request #6601 from penpot/alotor-fix-move-guides
 Move guides and comments for wasm modifiers
2025-06-02 12:28:01 +02:00
Yamila Moreno
e2724d180b Merge pull request #6497 from penpot/yms-update-coc
📚 Update Code of conduct
2025-06-02 12:20:57 +02:00
Andrey Antukh
c6bccafd98 Merge pull request #6607 from penpot/andy-update-changelog
📚 Update changelog
2025-06-02 12:17:53 +02:00
Andrey Antukh
1357ab34eb 📚 Move library rework changes to its own changelog 2025-06-02 12:16:27 +02:00
Andres Gonzalez
6e9ee3d310 📚 Update changelog 2025-06-02 12:10:32 +02:00
Yamila Moreno
5816695246 📚 Update Code of Conduct 2025-06-02 12:09:20 +02:00
Yamila Moreno
0d9160506b 📚 Add direct link to the CoC 2025-06-02 12:09:20 +02:00
Yamila Moreno
c3c6628bf1 📚 Minor improvement in README / Getting started 2025-06-02 12:09:20 +02:00
Alejandro Alonso
8642ffba46 🐛 Fix frontend build (#6608) 2025-06-02 12:03:08 +02:00
Andrey Antukh
25372c3edf Persist ruler layout flag to local storage 2025-06-02 11:43:13 +02:00
Andrey Antukh
e13d1743da Merge pull request #6598 from penpot/superalex-deprecate-old-image-type
♻️ Migrations for deprecated types and attributes
2025-06-02 11:29:44 +02:00
luisδμ
02d1a1f0b1 Delete variant property when it has no value anywhere after editing a formula (#6586) 2025-06-02 09:50:27 +02:00
Alejandro Alonso
08aeb93710 Merge pull request #6606 from penpot/niwinz-develop-fixes-2
 Fix several issues on penpot library
2025-06-02 07:04:22 +02:00
Alejandro Alonso
04f0f77cd8 Merge pull request #6605 from penpot/niwinz-develop-fixes-1
🐛 Fix default theme setup
2025-06-02 07:02:59 +02:00
Andrey Antukh
15adf1bd06 📎 Set penpot library version to 1.0.2 2025-06-01 11:29:31 +02:00
Andrey Antukh
1080ffc6b8 Add correct library version on the metadata 2025-06-01 11:28:42 +02:00
Andrey Antukh
1450672341 Remove obsolete props from bool style attrs 2025-06-01 11:20:26 +02:00
Andrey Antukh
483e88d6a3 Add more descriptive names for playground samples 2025-06-01 11:20:26 +02:00
Andrey Antukh
9fee16f4a9 🐛 Fix compatibility issue with penpot 2.7 2025-06-01 11:20:26 +02:00
Andrey Antukh
89a09346a5 🐛 Fix incorrect boolean shapes generation on builder 2025-06-01 11:06:00 +02:00
Andrey Antukh
77fa235965 🐛 Fix incorrect boolean shape generation on file builder 2025-06-01 10:25:11 +02:00
Andrey Antukh
03e4ca12be ♻️ Move update-bool from common geom to types path 2025-06-01 10:24:09 +02:00
Andrey Antukh
229c9b8385 📎 Add minor changes to circleci cache management 2025-06-01 09:34:05 +02:00
Andrey Antukh
a4fab5c5bd 🐛 Fix default theme setup
broken on previous commits
2025-06-01 09:30:57 +02:00
Andrey Antukh
d8913ab18b Add minor changes to devenv for avoid repeated deps download (#6600)
*  Add minor changes to devenv for avoid repeated dependency download

*  Add minor changes to devenv for integrate payments service

*  Remove playwright deps install from circleci config

*  Move cargo_home to userspace on devenv start

*  Improve cache management on CI

*  Improve cargo installation

*  Add missing playwright install cmd on CI

*  Install cargo-watch on devenv

---------

Co-authored-by: David Barragán Merino <david.barragan@kaleidos.net>
2025-06-01 09:16:28 +02:00
Edgars Andersons
7ef2f4e67e 🌐 Add translations for: Latvian
Currently translated at 98.8% (1787 of 1808 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2025-05-31 12:03:08 +02:00
Alejandro Alonso
1d065e68f4 🎉 Allow force render mode from get param (#6594) 2025-05-30 20:05:58 +02:00
Miguel de Benito Delgado
c9ceceb7e9 🔥 Remove old code for theme support (#6597) 2025-05-30 16:54:23 +02:00
luisδμ
ad26efaa5d Limit the length of property names and values to 60 chars (#6587) 2025-05-30 16:15:18 +02:00
alonso.torres
a3e17047a4 🐛 Add sandbox runtime 2025-05-30 15:40:36 +02:00
Alejandro Alonso
0552ef55cf Merge pull request #6603 from penpot/alotor-fix-duplicate-shapes
🐛 Fix problem in wasm when duplicate objects
2025-05-30 14:08:01 +02:00
Belén Albeza
d4c6063378 Avoid intercepting get-file-fragment in the playwright test 2025-05-30 13:53:00 +02:00
Belén Albeza
f23e460b2a Fix broken tokens test 2025-05-30 13:53:00 +02:00
Belén Albeza
35b29bb203 🐛 Fix font size input not displaying 'mixed' when needed 2025-05-30 13:53:00 +02:00
Alejandro Alonso
cd02905d1f ♻️ Migrate old fill text attributes 2025-05-30 13:51:05 +02:00
Alejandro Alonso
87d917bc2e ♻️ Deprecate old image type 2025-05-30 13:51:05 +02:00
alonso.torres
e8d1ea24d1 🐛 Fix problem in wasm when duplicate objects 2025-05-30 13:49:56 +02:00
Andrey Antukh
ad842872fb 🐛 Fix unexpected exception on get-team internal method
Because of invalid SQL
2025-05-30 13:49:05 +02:00
Alejandro Alonso
90744c182e Merge pull request #6602 from penpot/elenatorro-11214-use-text-decoration-from-leaf
🐛 Fix reading text-decoration and text-transform from leaf, and fallback to paragraph values
2025-05-30 13:33:58 +02:00
Alejandro Alonso
78aaf28532 Merge pull request #6498 from penpot/niwinz-develop-update-fonts
⬆️ Update google fonts
2025-05-30 13:28:08 +02:00
Elena Torro
4e2f905a26 🐛 Fix reading text-decoration and text-transform from leaf, and fallback to paragraph values 2025-05-30 13:22:39 +02:00
Andrey Antukh
d2cd99ed44 ⬆️ Update google fonts 2025-05-30 13:08:57 +02:00
Alejandro Alonso
885231e9a1 Merge pull request #6512 from penpot/niwinz-develop-custom-deletion-rules
♻️ Normalize logical deletion delay handling
2025-05-30 12:53:37 +02:00
Pablo Alba
baabfe2de8 🎉 Split text and its properties on components updates 2025-05-30 12:36:10 +02:00
alonso.torres
facb0227a0 Move guides and comments for wasm modifiers 2025-05-30 12:15:21 +02:00
Elena Torró
f6fe41af96 🔧 Add texts playground (#6599) 2025-05-30 12:10:34 +02:00
Edgars Andersons
f225fce9a1 🌐 Add translations for: Latvian
Currently translated at 98.4% (1780 of 1808 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2025-05-30 11:01:47 +02:00
Yaron Shahrabani
3570d29575 🌐 Add translations for: Hebrew
Currently translated at 97.1% (1756 of 1808 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2025-05-30 11:01:45 +02:00
Andrey Antukh
f8489a521f Merge pull request #6590 from penpot/niwinz-develop-library-fixes
 Add minor enhancements to penpot library
2025-05-30 10:35:41 +02:00
Andrey Antukh
cc76a42088 Merge pull request #6561 from mdbenito/feature/5030-use-system-theme
 Use system theme
2025-05-30 10:34:46 +02:00
Andrey Antukh
50cc70201d Merge pull request #6578 from penpot/ladybenko-11105-cap-fills
🎉 Disable adding fills in UI when limit has been reached
2025-05-30 10:11:05 +02:00
Belén Albeza
e88b3bae5a 🔥 Remove gulp (#6592) 2025-05-30 10:03:22 +02:00
Aitor Moreno
2b2939b4b7 ♻️ Remove unnecesary sort operation 2025-05-30 09:56:58 +02:00
Miguel de Benito Delgado
6b25720155 🌐 Add missing translation 2025-05-29 20:11:11 +00:00
Miguel de Benito Delgado
96d099b71e Mock .matchMedia in global/window 2025-05-29 20:11:11 +00:00
Miguel de Benito Delgado
fab9e842e8 Support following system color scheme 2025-05-29 22:10:00 +02:00
Miguel de Benito Delgado
ee022e225c 🚧 UI to support switching to system theme 2025-05-29 22:10:00 +02:00
Andrey Antukh
1b3fcb0432 📎 Update circleci workflow 2025-05-29 13:50:39 +02:00
Andrey Antukh
37f88067b9 🔥 Remove library method addComponentInstance 2025-05-29 13:07:44 +02:00
Alejandro Alonso
2650eccd09 🐛 Fix set path attrs (#6589) 2025-05-29 12:27:08 +02:00
Andrey Antukh
969b171510 📎 Prepare for release 1.0.1 of the penpot library 2025-05-29 12:15:17 +02:00
Andrey Antukh
4b22a0ebfb 🐛 Make the library generate output compatible with penpot 2.7.x 2025-05-29 12:08:50 +02:00
Andrey Antukh
eafea7aec9 Merge pull request #6588 from penpot/niwinz-develop-fix-boolean
🐛 Fix incorrect bool shape creation
2025-05-29 11:38:47 +02:00
Belén Albeza
ce23fee292 Limit the amount of fills shown in the UI 2025-05-29 11:26:18 +02:00
Alejandro Alonso
f3d734357a Merge pull request #6409 from penpot/azazeln28-feat-compare-wasm
🎉 Add comparison tool to WASM playground
2025-05-29 11:20:54 +02:00
Andrey Antukh
d31f64796f 🐛 Fix incorrect bool shape creation issue 2025-05-29 11:16:12 +02:00
Andrey Antukh
3a27a5a542 Add minor naming change on process selected fn 2025-05-29 11:15:46 +02:00
Andrey Antukh
2a04f78337 Add common transducers section to common data ns 2025-05-29 11:14:53 +02:00
Aitor Moreno
aeee05c90d 🎉 Add comparison tool to WASM playground 2025-05-29 10:46:38 +02:00
Yamila Moreno
6fc63f14a0 Add configuration for air gapped installations (#6567) 2025-05-29 10:34:47 +02:00
Belén Albeza
f33c1fb530 Update binary fills flag name and add it to supported flags 2025-05-29 10:32:49 +02:00
Andrey Antukh
75170bb043 Merge pull request #6537 from penpot/niwinz-library-publish
 Add minor enhancements to penpot-library for publish it on npm
2025-05-29 09:49:51 +02:00
Belén Albeza
c0a98288d0 🔧 Gate cap with config flag 2025-05-29 09:45:31 +02:00
Belén Albeza
7d5739b663 Add playwright test for disabling adding fills 2025-05-29 09:45:31 +02:00
Elena Torró
fe60016124 Merge pull request #6573 from penpot/elenatorro-11021-text-fixes
🔧 Fix text parsing and transformation
2025-05-29 09:33:05 +02:00
Alejandro Alonso
5c58a04fc2 🐛 Fix inner strokes black background effect 2025-05-29 09:05:30 +02:00
Alejandro Alonso
04a1f8475d Merge pull request #6585 from penpot/alotor-scale-content
 Add scale content to render wasm
2025-05-29 07:32:47 +02:00
Belén Albeza
3c05f09fd1 🔧 Fix unnecessary playwright dependency in root dir (#6577) 2025-05-28 17:09:05 +02:00
María Valderrama
5eaea63ca8 🐛 Fix palette is over sidebar (#6581) 2025-05-28 17:08:23 +02:00
alonso.torres
bcfa9a82ea Add scale content to render wasm 2025-05-28 16:40:57 +02:00
Denys Kisil
d9649eaedd 🌐 Add translations for: Ukrainian (ukr_UA)
Currently translated at 99.7% (1803 of 1808 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ukr_UA/
2025-05-28 16:01:45 +02:00
Belén Albeza
170d35dde2 Disable new fills in UI when the cap is reached 2025-05-28 14:01:26 +02:00
andrés gonzález
2943f80db5 📚 Change help links at the Help Center (#6582) 2025-05-28 13:22:42 +02:00
luisδμ
46b0e4f0e7 Manage empty property values in the combobox in design tab (#6574)
*  Manage empty property values in the combobox in design tab

* 📎 PR changes
2025-05-28 12:41:04 +02:00
Marina López
878952f7b5 Add subscription events (#6563)
*  Add subscription events

* 📎 Fixes PR feedback

* 📎 Fixes PR feedback
2025-05-28 10:50:36 +02:00
Marina López
f84ffc3562 Add history version days for subscriptions (#6571) 2025-05-28 10:49:53 +02:00
Aitor Moreno
e9edebbbb5 📚 Add tile rendering documentation (#6568) 2025-05-28 09:41:07 +02:00
Xavier Julian
14afd58eac 🐛 Display color swatch only on color type tokens 2025-05-28 09:29:26 +02:00
Belén Albeza
827d39a406 💄 Remove ununsed prop on fill-menu component 2025-05-27 15:30:16 +02:00
Belén Albeza
e4a1c373bb Only take N amount of fills 2025-05-27 15:30:11 +02:00
Pablo Alba
be13704934 🐛 Fix access to libs on migration during an import (#6572) 2025-05-27 14:54:17 +02:00
Elena Torro
88e77e3218 🔧 Fix text parsing and transformation 2025-05-27 14:04:27 +02:00
Pablo Alba
443cabe94e Add the ability to access libraries from file migrations 2025-05-27 13:12:34 +02:00
Alejandro Alonso
c7c8e91183 🐛 Fix keep aspect ratio support 2025-05-27 12:20:40 +02:00
Alejandro Alonso
327db5a1a3 🐛 Fix render of paths with empty selrects 2025-05-27 12:20:05 +02:00
Edgars Andersons
bcb74822d2 🌐 Add translations for: Latvian
Currently translated at 97.9% (1771 of 1808 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2025-05-27 09:01:55 +00:00
Yaron Shahrabani
790d422100 🌐 Add translations for: Hebrew
Currently translated at 96.4% (1743 of 1808 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2025-05-27 09:01:54 +00:00
laurentiucotet
419a949816 🌐 Add translations for: Romanian
Currently translated at 71.7% (1298 of 1808 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2025-05-27 09:01:53 +00:00
Ingrid Pigueron
1ad6ee6e38 🌐 Add translations for: French
Currently translated at 97.4% (1761 of 1808 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2025-05-27 09:01:51 +00:00
Andrey Antukh
da10425800 📚 Add readme for library directory 2025-05-27 10:55:49 +02:00
Andrey Antukh
3e4c80fa27 Prepare library to be published on npm 2025-05-27 10:55:49 +02:00
Marina López
179a5654e7 🐛 Fix get current user for plugins api 2025-05-27 10:50:01 +02:00
Marina López
bc38bd6a9c 🐛 Fix team name dropdown menu from dashboard (#6562) 2025-05-27 10:05:19 +02:00
Alejandro Alonso
1c5d182a90 Merge pull request #6559 from penpot/alotor-perf-fixes
🐛 Fix some problems with modifiers
2025-05-27 09:46:37 +02:00
alonso.torres
a85a42d367 🐛 Fix some problems with modifiers 2025-05-27 09:33:33 +02:00
Alejandro Alonso
1a705cee24 Merge pull request #6555 from penpot/niwinz-develop-fix-path-bug-1
🐛 Fix path node type change operation
2025-05-27 09:04:11 +02:00
Eva Marco
a771ca91ab 🐛 Add token units flag to common/flags file (#6557) 2025-05-26 13:53:56 +02:00
Andrey Antukh
4326e2c5a4 Merge remote-tracking branch 'origin/staging' into develop 2025-05-26 13:25:05 +02:00
Andrés Moya
050ffa235c ⬆️ Update cuerdas library (#6556) 2025-05-26 13:22:30 +02:00
Eva Marco
3dfccdaf9b ♻️ Put token settings under config flag (#6551) 2025-05-26 12:57:32 +02:00
Marina López
e5bc369e56 Visual indicators subscription for teams and project settings (#6546)
*  Visual indicators subscription for teams and project settings

* 📎 Fixes PR feedback

---------

Co-authored-by: Andrey Antukh <niwi@niwi.nz>
2025-05-26 12:56:40 +02:00
Andrey Antukh
fdd6502671 📚 Update changelog 2025-05-26 12:41:34 +02:00
Andrey Antukh
e698fd7d35 🐛 Fix path node type change operation 2025-05-26 12:13:52 +02:00
Andrés Moya
5e8929e504 🔧 Refactor token json file import/export 2025-05-26 12:02:26 +02:00
Alejandro Alonso
3ee3ee2059 Merge pull request #6553 from penpot/alotor-bug-fix-grid-editor-problem
🐛 Fix problem with grid editing
2025-05-26 11:40:24 +02:00
alonso.torres
9eacde567d 🐛 Fix problem with grid editing 2025-05-26 11:20:09 +02:00
Alejandro Alonso
ac0b74e11a Merge pull request #6549 from penpot/niwinz-staging-hotfix-1
🐛 Fix incorrect relink operation for stroke image
2025-05-26 09:50:52 +02:00
Stephan Paternotte
24d4871b23 🌐 Add translations for: Dutch
Currently translated at 99.9% (1807 of 1808 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2025-05-25 04:01:45 +00:00
Andrey Antukh
9638fd274f Merge pull request #6547 from penpot/eva-remove-deprecated-props
♻️ Update docs and remove deprecated props
2025-05-24 11:18:53 +02:00
Andrey Antukh
b5d96d312a 🐛 Fix incorrect relink operation for stroke image 2025-05-24 09:16:10 +02:00
Edgars Andersons
f88420efb5 🌐 Add translations for: Latvian
Currently translated at 96.7% (1750 of 1808 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2025-05-23 20:01:44 +02:00
Nicola Bortoletto
c301d95f20 🌐 Add translations for: Italian
Currently translated at 99.7% (1804 of 1808 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2025-05-23 20:01:44 +02:00
Eva Marco
7c072abe28 📚 Update docs without props obj 2025-05-23 12:57:24 +02:00
Eva Marco
603e41bbfd ♻️ Remove mf/props obj from DS components 2025-05-23 12:57:02 +02:00
Pablo Alba
b561ad033c 🐛 Fix restore component when its original parent with layout is deleted 2025-05-23 12:11:35 +02:00
luisδμ
7373056037 Improve formula validating and parsing (#6527) 2025-05-23 12:08:50 +02:00
luisδμ
a9173f672d 🐛 Sanitize inputs for variant property names and values (#6532) 2025-05-23 12:08:39 +02:00
luisδμ
44829ff1ae Use different copies for different variant selection cases (#6544)
*  Use different copies for different variant selection cases

* 📎 PR changes
2025-05-23 12:08:24 +02:00
Andrey Antukh
927ee9e55e Add get-owned-teams rpc method 2025-05-23 11:20:35 +02:00
Xavier Julian
066b252522 Add composition and slots documentation to storybook 2025-05-23 10:12:20 +02:00
luisδμ
556a68a78f Select all variants with errors (#6533) 2025-05-23 09:21:57 +02:00
Belén Albeza
f9bbf2d524 Improve paths deserialization (wasm) (#6501)
* ♻️ Refactor path wasm code to its own wasm submodule

* ♻️ Use unified enum for RawSegmentData and transmute to deserialize

* ♻️ Move set_shape_path_attrs to wasm::paths module

* 💄 Unify repr declarations
2025-05-23 08:48:55 +02:00
alonso.torres
eaaca5629e 🐛 Fix problem with sidebar layout 2025-05-22 18:35:08 +02:00
Andrey Antukh
0df2a12814 Merge remote-tracking branch 'origin/staging' into develop 2025-05-22 13:34:46 +02:00
Andrey Antukh
df27db1996 Merge pull request #6531 from mdbenito/fix/choppy-closest-point
 Fix choppy behaviour of new node on path
2025-05-22 13:24:04 +02:00
Miguel de Benito Delgado
7fc0d15418 🐛 Fix cursor overlap query (#6530)
* 🐛 Fix cursor overlap query. Closes #4472

* 📎 Update CHANGES.md

---------

Signed-off-by: Miguel de Benito Delgado <m.debenito.d@gmail.com>
2025-05-22 13:22:52 +02:00
Eva Marco
99fb905070 🐛 Fix at icon (#6540) 2025-05-22 13:15:09 +02:00
Stephan Paternotte
e74cf1836f 🌐 Add translations for: Dutch
Currently translated at 99.9% (1807 of 1808 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2025-05-22 13:06:02 +02:00
Edgars Andersons
dfdc1ac35b 🌐 Add translations for: Latvian
Currently translated at 96.4% (1743 of 1808 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2025-05-22 13:06:01 +02:00
Yaron Shahrabani
97a5a93694 🌐 Add translations for: Hebrew
Currently translated at 96.2% (1740 of 1808 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2025-05-22 13:06:00 +02:00
Ingrid Pigueron
dd0b8f8f6e 🌐 Add translations for: French
Currently translated at 97.3% (1760 of 1808 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2025-05-22 13:05:58 +02:00
Alejandro Alonso
413fc6de16 Merge pull request #6536 from penpot/niwinz-update-promesa
⬆️ Update dependencies
2025-05-22 12:49:00 +02:00
Aitor Moreno
d54a7d0401 Merge pull request #6526 from penpot/superalex-improve-zoom-performance-and-behaviour
🐛 Fix zoom performance and behaviour
2025-05-22 12:15:38 +02:00
Alejandro Alonso
ed53793d9d 🐛 Fix render shapes in multiple tiles with high dprs (#6538) 2025-05-22 12:10:51 +02:00
María Valderrama
faa68784af 💄 Add styles for external widgets on workspace (#6509)
* 💄 Add styles for Inkeep Chat at workspace

* 📎 Styles review
2025-05-22 11:56:45 +02:00
Aitor Moreno
58b1cf6b0c Merge pull request #6491 from penpot/alotor-perf-pixel-precision
 Pixel precision for new renderer
2025-05-22 11:37:11 +02:00
Andrey Antukh
f9c9e865b5 🐛 Remove unexpected modified-at on binfile-v3 import 2025-05-22 10:53:23 +02:00
Andrey Antukh
ebe321d9d3 ⬆️ Update dependencies on exporter 2025-05-22 10:53:23 +02:00
Andrey Antukh
0683fbd17c ⬆️ Update backend dependencies 2025-05-22 10:53:23 +02:00
Andrey Antukh
09a7ef3e45 ⬆️ Upgrade frontend dependendencies 2025-05-22 10:53:23 +02:00
Andrey Antukh
172b70d8a7 ⬆️ Upgrade promesa library to latest version
That fixes a workaround introduced in previous commits
2025-05-22 10:53:23 +02:00
Alejandro Alonso
3597e5bb54 🐛 Fix zoom performance and behaviour 2025-05-22 10:29:43 +02:00
Eva Marco
949b6d1205 🎉 Add missing translation (#6534) 2025-05-22 10:24:41 +02:00
Eva Marco
c0af77faf7 📚 Add css rules to the UI guide (#6521)
* 📚 Add css rules to UI guide

* 🐛 Solve comments on PR

* 🐛 Add missing class

* 🐛 Improve css modules improvement

* 🐛 Fix width

* 🐛 Fix note
2025-05-22 10:06:03 +02:00
Miguel de Benito Delgado
8f7a674000 🔥 Remove unused fn types.path.segment.path-closest-point 2025-05-21 21:32:18 +02:00
Miguel de Benito Delgado
e4f2dfaa11 Make precision closest point computation depend on zoom 2025-05-21 21:29:40 +02:00
Andrey Antukh
ec29c4f5fe Merge pull request #6528 from penpot/ladybenko-11076-fix-xywh-inputs
🐛 Fix misalignment in measure section (design tab)
2025-05-21 21:05:38 +02:00
Elena Torró
c21f5221bb Merge pull request #6453 from penpot/elenatorro-10900-add-text-fills
🎉 Add text fills
2025-05-21 18:46:04 +02:00
Elena Torro
42ef2f929a 🎉 Add text fills 2025-05-21 18:32:50 +02:00
Belén Albeza
2b21401368 🐛 Fix clip buttons size 2025-05-21 17:08:56 +02:00
Belén Albeza
a5c8063b2c 🐛 Fix presets menu alignment 2025-05-21 17:01:23 +02:00
Belén Albeza
2ad2af2aea 🐛 Fix measures inputs' alignment 2025-05-21 16:58:49 +02:00
Eva Marco
c2ce7c6cf6 🐛 Remove unnecesary icon (#6524) 2025-05-21 15:44:25 +02:00
María Valderrama
47490db4be 💄 Add styles for external widgets on workspace (#6509)
* 💄 Add styles for Inkeep Chat at workspace

* 📎 Styles review
2025-05-21 14:17:48 +02:00
andrés gonzález
a2ac2bc6c6 Change copy as SVG menu order (#6523) 2025-05-21 13:12:33 +02:00
Elena Torró
e80ca7e332 Merge pull request #6439 from penpot/elenatorro-11035-fix-overflow-x-scroll-on-sidebar
🐛 Fix default scroll visibility on layers sidebar
2025-05-21 11:51:32 +02:00
Elena Torro
e4644ff506 🔧 Use scroll only on layers and refactor layer element name 2025-05-21 11:36:24 +02:00
Andrey Antukh
662b926b4b 🌐 Rehash all translations 2025-05-21 11:20:36 +02:00
Miguel de Benito Delgado
6319ed78f9 🌐 Add missing translation strings for error messages (#6519)
* 🌐 Add i18n strings for some error messages

* 🌐 Add fr, de, es translations for some error messages
2025-05-21 11:17:53 +02:00
Eva Marco
3abc8774f6 ♻️ Change translation string from workspace.token to workspace.tokens (#6508)
* ♻️ Change string translation for tokens

* ♻️ Apply find-and-replace on translation files

---------

Co-authored-by: Andrey Antukh <niwi@niwi.nz>
2025-05-21 11:17:05 +02:00
Anonymous
af1c90c252 🌐 Add translations for: Swedish
Currently translated at 89.4% (1612 of 1803 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/sv/
2025-05-21 10:44:23 +02:00
Anonymous
8019ae7840 🌐 Add translations for: Dutch
Currently translated at 95.7% (1726 of 1803 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2025-05-21 10:44:22 +02:00
Anonymous
6bd615ff8b 🌐 Add translations for: Latvian
Currently translated at 95.7% (1726 of 1803 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2025-05-21 10:44:22 +02:00
Anonymous
c4a793d306 🌐 Add translations for: Ukrainian (ukr_UA)
Currently translated at 95.7% (1726 of 1803 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ukr_UA/
2025-05-21 10:44:22 +02:00
Anonymous
631b3ac062 🌐 Add translations for: Croatian
Currently translated at 89.9% (1621 of 1803 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/hr/
2025-05-21 10:44:22 +02:00
Anonymous
48995850fa 🌐 Add translations for: Portuguese (Portugal)
Currently translated at 88.4% (1594 of 1803 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2025-05-21 10:44:21 +02:00
Anonymous
a5c7a2c97b 🌐 Add translations for: Czech
Currently translated at 89.8% (1620 of 1803 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/cs/
2025-05-21 10:44:20 +02:00
Anonymous
3a8285bc69 🌐 Add translations for: Italian
Currently translated at 95.6% (1724 of 1803 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2025-05-21 10:44:20 +02:00
Anonymous
02e3cc089e 🌐 Add translations for: Chinese (Traditional Han script)
Currently translated at 90.1% (1625 of 1803 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/
2025-05-21 10:44:20 +02:00
Anonymous
17e19afcbd 🌐 Add translations for: Hebrew
Currently translated at 95.7% (1726 of 1803 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2025-05-21 10:44:19 +02:00
Anonymous
a2b52a6408 🌐 Add translations for: Indonesian
Currently translated at 95.7% (1726 of 1803 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2025-05-21 10:44:19 +02:00
Anonymous
8cc4b69291 🌐 Add translations for: German
Currently translated at 92.1% (1661 of 1803 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2025-05-21 10:44:19 +02:00
Anonymous
045ddf5829 🌐 Add translations for: Portuguese (Brazil)
Currently translated at 70.9% (1279 of 1803 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2025-05-21 10:44:18 +02:00
Anonymous
1d0335aba6 🌐 Add translations for: French
Currently translated at 95.7% (1727 of 1803 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2025-05-21 10:44:18 +02:00
Anonymous
5412d72236 🌐 Add translations for: Spanish
Currently translated at 98.8% (1782 of 1803 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es/
2025-05-21 10:44:17 +02:00
Anonymous
896ee43212 🌐 Add translations for: English
Currently translated at 99.8% (1800 of 1803 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/en/
2025-05-21 10:44:17 +02:00
alonso.torres
5d42b9793b 🐛 Fix some problems with layouts 2025-05-21 10:42:03 +02:00
alonso.torres
6cd2c712ab Pixel precision for new renderer 2025-05-21 10:42:03 +02:00
Elena Torro
a575410a29 🐛 Fix default scroll visibility on layers sidebar 2025-05-21 10:38:27 +02:00
Hosted Weblate
6b5703c1fe 🌐 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/
2025-05-21 10:38:18 +02:00
Andrey Antukh
22c3d4d807 Merge remote-tracking branch 'weblate/develop' into develop 2025-05-21 10:37:42 +02:00
luisδμ
b0701f6bb4 Control malformed variant formulas (#6473)
*  Control malformed variant strings

* 📎 PR changes

* 📎 PR changes
2025-05-21 10:18:11 +02:00
Alejandro Alonso
0748ef7267 Merge pull request #6518 from penpot/niwinz-staging-tokenslib-json-encoding
🐛 Add json encoding for tokenslib type
2025-05-21 10:17:37 +02:00
Pablo Alba
9bad9b8e91 🐛 Fix restore component when its original parent is deleted (#6517) 2025-05-21 10:05:22 +02:00
Andrey Antukh
9ca4fa752c 🐛 Add json encoding for tokenslib type 2025-05-21 09:59:28 +02:00
Andrey Antukh
b6563f620b 📎 Allow merge commits on commit linter 2025-05-21 09:34:05 +02:00
Andrey Antukh
a63fa2944d Merge remote-tracking branch 'origin/staging' into develop 2025-05-21 09:23:15 +02:00
Miguel de Benito Delgado
fd89c9d82c Avoid double id lookup when calling lookup-page-objects (#6513) 2025-05-20 22:31:40 +02:00
Andrey Antukh
a706907b26 ♻️ Normalize logical deletion to future dates
Instead of managing the ...
2025-05-20 22:25:57 +02:00
Andrey Antukh
a3b4fc9545 🔥 Remove unused function from workspace.media ns 2025-05-20 22:25:57 +02:00
Miguel de Benito Delgado
71bb2556f9 ♻️ Move page setup out of the data.workspace ns (#6502)
* ♻️ Split history workspace.cljs to workspace/pages.cljs - rename file to target-name

* ♻️ Split history workspace.cljs to workspace/pages.cljs - rename source-file to git-split-temp

* ♻️ Split history workspace.cljs to workspace/pages.cljs - restore name of source-file

* ♻️ Cleanup after adding new ns, add exports

* ♻️ Move set-plugin-data to main.data.plugins

* 🐛 Possible bugfix, cherry-picked from commit 8f7c63d6e2 (conflict during refactor)

---------

Co-authored-by: Eva Marco <eva.marco@kaleidos.net>
2025-05-20 22:11:05 +02:00
Miguel de Benito Delgado
f36aa30525 Add copy-as-svg to contextual menu (#6510)
*  Add "copy as svg" to contextual menu

* 🌐 Add a few translations of the new string

* 📚 Document commit message format for translations

* 📎 Log SVG import errors to the console

* 📎 Update CHANGES.md (two PRs)

---------

Signed-off-by: Miguel de Benito Delgado <m.debenito.d@gmail.com>
2025-05-20 22:06:36 +02:00
Eva Marco
8f7c63d6e2 Add base font fallback (#6468)
*  Add base font fallback

* ♻️ Add asserts to change-builder

* 🐛 Change fn name
2025-05-20 17:27:04 +02:00
Andrey Antukh
965b22718f 📚 Update changelog 2025-05-20 15:46:56 +02:00
Miguel de Benito Delgado
48a3d38d82 Add the Shift+ctrl+drag to deselect (#6494)
*  Allow shape deselection using Ctrl+Shift+Drag

*  Allow point deselection using Ctrl+Shift+Drag

*  Properly remember previous selection during addition/removal of shapes

*  Preload point selection in path handle-area-selection

Also: prefer dm/get-in over get-in

*  Highlight path nodes in selection rectangle incrementally
2025-05-20 15:23:05 +02:00
Florian Schroedl
31f642ed25 ♻️ Use rx streams for style dictionary interface 2025-05-20 14:55:07 +02:00
andrés gonzález
9f414b6ecd 📚 Update changelog (#6511) 2025-05-20 14:14:17 +02:00
Alejandro Alonso
334d7833d5 Merge pull request #6490 from penpot/azazeln28-refactor-iteration-performance
♻️ Refactor tile iteration
2025-05-20 13:56:37 +02:00
Alejandro Alonso
ff9c8f5929 Merge pull request #6483 from penpot/niwinz-staging-bugfixes-error-report
🐛 Several bugfixes
2025-05-20 13:54:54 +02:00
Xavier Julian
f7311cbb6b ♻️ Ensure tokens feature integrates design system 2025-05-20 13:52:38 +02:00
Alejandro Alonso
e4c563f917 Merge pull request #6479 from penpot/niwinz-develop-json-encoding-fix
🐛 Fix exception on rendering openapi.json
2025-05-20 13:46:16 +02:00
Andrey Antukh
2d3ad5a88f 📎 Update changelog 2025-05-20 13:30:04 +02:00
Andrey Antukh
1334d733cd 🐛 Fix openapi json generation for :re schemas 2025-05-20 13:29:44 +02:00
Andrey Antukh
004a9f17d3 Add minor js-like type schema formatting improvements 2025-05-20 13:29:44 +02:00
Andrey Antukh
c87fa4f723 Make the rpc doc generation lazy 2025-05-20 13:29:44 +02:00
Andrey Antukh
9378a5786f Replace json library used for generate openapi json 2025-05-20 13:29:44 +02:00
Andrey Antukh
3224ba26f1 ♻️ Replace :any schema with own ::sm/any
That a more specific, json friendly generator
2025-05-20 13:29:44 +02:00
Andrey Antukh
d33a5e6df1 Backport from develop partial improvements to sm/register! helper 2025-05-20 13:29:44 +02:00
Alejandro Alonso
0d60e3d997 Merge pull request #6486 from penpot/niwinz-library-export
 Add .penpot export support for penpot library
2025-05-20 13:27:11 +02:00
Andrey Antukh
645c4a57db Add playground file with example of how to create a component
This also fixes several internal issues related to component
creaton.
2025-05-20 13:06:07 +02:00
Andrey Antukh
778de6adaf Add minimal testing structure 2025-05-20 13:06:07 +02:00
Andrey Antukh
29d23577d2 🎉 Add .penpot (binfile-v3) support for library 2025-05-20 13:06:07 +02:00
Andrey Antukh
1fea1e8f5b 🔥 Remove unused svg parsing code from common 2025-05-20 13:06:07 +02:00
Andrey Antukh
c8a211742a 🔥 Remove already broken and unused internal components-v2 migration code 2025-05-20 13:06:06 +02:00
Andrey Antukh
2da8747485 ♻️ Move library to its own directory 2025-05-20 13:05:52 +02:00
Andrey Antukh
6803c78e80 Change naming and schema registation on tokens lib 2025-05-20 13:05:52 +02:00
Andrey Antukh
d8daea72de ⬆️ Update promesa library 2025-05-20 13:05:52 +02:00
Andrey Antukh
36b162b4fa ♻️ Replace jszip usage with zip.js library 2025-05-20 13:05:52 +02:00
Andrey Antukh
4c487834f0 Add the ability to deref internal state on library file instance 2025-05-20 13:05:52 +02:00
Andrey Antukh
dc7e53881a 🔥 Remove legacy-zip exportation support 2025-05-20 13:05:52 +02:00
Alejandro Alonso
1a01c9ee4a Merge pull request #6500 from penpot/niwinz-develop-svg-fixes
🐛 Fix svg path parsing on uploading svg image
2025-05-20 12:58:48 +02:00
Yamila Moreno
b6be416c7b 📎 Add wasm envvar to manage script 2025-05-20 12:15:14 +02:00
Florian Schroedl
4a27e8d1dd 🐛 Prevent unkown tokens hint always showing 2025-05-20 10:53:04 +02:00
Aitor Moreno
1bc97f9ad0 Merge pull request #6505 from penpot/supearlex-fix-avoid-unncesary-clone-for-new-render
🐛 Avoid unnecesary clone call
2025-05-20 10:07:23 +02:00
Aitor Moreno
aaa57cb17f 🐛 Fix inline styles in code tab (#6428) 2025-05-20 10:05:35 +02:00
Alejandro Alonso
b2d6342422 🐛 Avoid unnecesary clone call 2025-05-20 09:45:19 +02:00
Andrés Moya
ba1e16b55b 🐛 Fix token directory import 2025-05-20 09:42:38 +02:00
Aitor Moreno
ef95e3ecb0 ♻️ Refactor tile iteration 2025-05-19 16:24:52 +02:00
Eva Marco
55d21761fc Add multi file import on tokens (#6444)
*  Implement token multi-file import

* ♻️ Refactor import modal UI

* 🐛 Fix comments

---------

Co-authored-by: Florian Schroedl <flo.schroedl@gmail.com>
2025-05-19 16:12:46 +02:00
Andrey Antukh
0b4a367e9e 🐛 Fix svg path parsing on uploading svg image 2025-05-19 15:35:58 +02:00
Andrey Antukh
8f2ca15ec0 Merge pull request #6495 from mdbenito/refactor/frontend-app-main-data-workspace-clipboard
♻️ Factor clipboard code out of frontend/src/app/main/data/workspace.cljs
2025-05-19 15:20:52 +02:00
Aitor Moreno
21041eb925 Merge pull request #6496 from penpot/superalex-fix-path-performance
🐛 Fix paths performance in new render
2025-05-19 13:57:20 +02:00
Pablo Alba
53cfc29a1f Merge pull request #6425 from penpot/palba-variants-overrides-same-name
 Manage layers with the same name on variants overrides
2025-05-19 13:51:16 +02:00
Alejandro Alonso
96d44e0631 🐛 Fix paths performance in new render 2025-05-19 12:22:42 +02:00
Belén Albeza
8afd217a80 🔧 Enable back clippy rules (#6492)
* 🔧 Fix lint script (rust)

* 🔧 Temporarily add clippy rules to ignore so lint script passes

* 💄 Fix clippy rule crate_in_macro_def

* 💄 Fix clippy rule redundant-static-lifetimes

* 💄 Fix clippy rule unnecessary_cast

* 💄 Fix clippy rule nonminimal_bool

* 💄 Fix clippy rule redundant_pattern_matching

* 💄 Fix clippy rule assign_op_pattern

* 💄 Fix clippy rule needless_lifetimes

* 💄 Fix clippy rule for_kv_map

* 💄 Fix clippy rule ptr_arg

* 💄 Fix clippy rule match_like_matches_macro

* 💄 Fix clippy rule macro_metavars_in_unsafe

* 💄 Fix clippy rule map_clone

* 💄 Fix clippy rule wrong_self_convention

* 💄 Fix clippy rule vec_box

* 💄 Fix clippy rule useless_format

* 💄 Fix clippy rule unwrap_or_default

* 💄 Fix clippy rule unused_unit

* 💄 Fix clippy rule unnecessary_to_owned

* 💄 Fix clippy rule too_many_arguments

* 💄 Fix clippy rule slow_vector_initialization

* 💄 Fix clippy rule single_match

* 💄 Fix clippy rule redundant_field_names

* 💄 Fix clippy rule rendudant_closure

* 💄 Fix clippy rule needless_return

* 💄 Fix clippy rule needless_range_loop

* 💄 Fix clippy rule needless_borrows_for_generic_args

* 💄 Fix clippy rule needless-borrow

* 💄 Fix clippy rule missing_transmute_annotations

* 💄 Fix clippy rule map_entry

* 💄 Fix clippy rule manual_map

* 💄 Fix clippy rule len_zero

* 💄 Fix clippy rule from_over_into

* 💄 Fix clippy rule field_reassign_with_default

* 💄 Fix clippy rule enum_variant_names

* 💄 Fix clippy rule derivable_impls

* 💄 Fix clippy rule clone_on_copy

* 💄 Fix clippy rule box_collection

* 🔧 Make lint script also check test config target

* 🔧 Remove cargo-watch as a lib dependency

* 💄 Fix clippy rule for join_bounds

* 🔧 Fix lint script return code

---------

Co-authored-by: alonso.torres <alonso.torres@kaleidos.net>
2025-05-19 11:14:55 +02:00
Miguel de Benito Delgado
330e49db56 ♻️ Cleanup after adding new ns, add exports 2025-05-18 18:49:59 +02:00
Miguel de Benito Delgado
aa39170d47 ♻️ Split history workspace.cljs to workspace/clipboard.cljs - restore name of source-file 2025-05-18 18:49:07 +02:00
Miguel de Benito Delgado
8fa7a69094 ♻️ Split history workspace.cljs to workspace/clipboard.cljs - resolve conflict and keep both files 2025-05-18 18:49:07 +02:00
Miguel de Benito Delgado
33d989feb2 ♻️ Split history workspace.cljs to workspace/clipboard.cljs - rename source-file to git-split-temp 2025-05-18 18:49:07 +02:00
Miguel de Benito Delgado
e309a57223 ♻️ Split history workspace.cljs to workspace/clipboard.cljs - rename file to target-name 2025-05-18 18:49:07 +02:00
Andrey Antukh
0b289153cb Add the ability to disable wasm on build script 2025-05-18 17:30:41 +02:00
Andrey Antukh
cf274099c4 Improve events/sse internal API
For make code cleaner and more evident for a quick view
2025-05-18 17:30:41 +02:00
Andrey Antukh
6524e75770 💄 Fix check-fn naming on types.container 2025-05-18 17:30:41 +02:00
Andrey Antukh
9b80f7c9b3 💄 Don't return unnecesary object from db query
the return value is already ignored
2025-05-18 17:30:41 +02:00
Andrey Antukh
bf76f328c8 Remove duplicate error logging on sse response 2025-05-18 17:30:41 +02:00
Xavier Julian
051c2a7e99 🐛 Fix sloppy behaviour on tokens value inputs 2025-05-16 15:42:25 +02:00
Xavier Julian
887fa6b77b Add slots feature to DS input component 2025-05-16 15:42:25 +02:00
Andrey Fedorov
d9f98008f4 Add unknown token type reporting 2025-05-16 15:09:36 +02:00
Alejandro Alonso
0cb6e0dee2 🐛 Fix new render zoom (#6488)
* 🐛 Fix new render zoom

* 🐛 Use scale instead of just zoom in get_tiles_for_viewbox

---------

Co-authored-by: Belén Albeza <belen@hey.com>
2025-05-16 10:49:03 +02:00
Andrey Antukh
ad87e9842d Merge pull request #6429 from penpot/yms-update-ubuntu-in-docker-images
🐳 Update docker images and dependencies
2025-05-16 10:38:56 +02:00
Miguel de Benito Delgado
e22a55334e 💄 Rename some namespace aliases for consistency (#6485) 2025-05-15 17:43:02 +02:00
Elena Torró
f5e81debbc Merge pull request #6478 from penpot/ladybenko-11030-fix-dpr-fills
🐛 Fix fills & strokes when dpr > 1
2025-05-15 16:04:30 +02:00
andrés gonzález
ddfd55261d :Books: Update design tokens doc (#6487) 2025-05-15 14:44:51 +02:00
Belén Albeza
300e24b403 🐛 Fix drawing shapes when dpr > 1 2025-05-15 11:01:14 +02:00
Andrey Antukh
a00e7c1061 Merge remote-tracking branch 'origin/staging' into develop 2025-05-15 09:52:31 +02:00
Alonso Torres
ba25ce3098 🐛 Fix share button being displayed with no permissions (#6476)
* 🐛 Fix share button being displayed with no permissions

*  Simplify impl by accessing perms from teams directly

---------

Co-authored-by: Andrey Antukh <niwi@niwi.nz>
2025-05-15 09:49:29 +02:00
Miguel de Benito Delgado
968ea56197 ♻️ Reorganize index management on worker code (#6477)
* ♻️ Factor index management out of app.worker.impl

* 💄 Fix silly spacing

* 💄 Lint
2025-05-15 09:46:49 +02:00
Miguel de Benito Delgado
2635873b9a 📚 Update CONTRIBUTING.md with formatting and linting (#6480) 2025-05-15 09:41:33 +02:00
Alejandro Alonso
f5f1316f0b Merge pull request #6474 from penpot/superalex-develop-paste-html-fix
🐛 Fix exception on paste invalid html
2025-05-14 16:16:53 +02:00
Andrey Antukh
79a164be6d 🐛 Fix exception on paste invalid html 2025-05-14 16:07:01 +02:00
alonso.torres
ecb85778bc 🐛 Fix problem with path edition of shapes 2025-05-14 14:45:29 +02:00
Elena Torró
676c4d2dfe Merge pull request #6472 from penpot/alotor-perf-selrect-modifiers
 Set selrect for new render modifiers
2025-05-14 14:19:38 +02:00
Andrés Moya
5b8d1c1ca6 Merge branch 'hiru-update-tech-guide' 2025-05-14 13:23:38 +02:00
Andrés Moya
24e2948407 📚 Update code samples 2025-05-14 13:22:49 +02:00
Andrés Moya
c569c71306 📚 Update Tech Guide about abstraction levels 2025-05-14 13:22:38 +02:00
Andrés Moya
2cdc241e68 Merge branch 'hiru-update-tech-guide' into staging 2025-05-14 12:00:03 +02:00
Andrés Moya
057bf9bf25 📚 Update code samples 2025-05-14 11:38:55 +02:00
Andrés Moya
2ddcd0ce15 📚 Update Tech Guide about abstraction levels 2025-05-14 11:37:28 +02:00
alonso.torres
fef08dfa18 Set selrect for new render modifiers 2025-05-14 11:21:43 +02:00
Andrey Antukh
831422feaf ⬆️ Update several npm dependencies on frontend module 2025-05-14 10:39:34 +02:00
Andrey Antukh
d01e3085f4 ⬆️ Update yarn to 4.9.1 2025-05-14 10:39:34 +02:00
Andrey Antukh
d9ca82dc15 ⬆️ Update dependencies 2025-05-14 10:39:34 +02:00
Yamila Moreno
1e7127d98a 🐳 Update frontend image to nginx:1.28.0 2025-05-14 10:39:34 +02:00
Yamila Moreno
002ae8b91a 🐳 Update docker images to ubuntu 24.04 2025-05-14 10:39:34 +02:00
Aitor Moreno
6831acb71d Merge pull request #6465 from penpot/superalex-fix-render-wasm-maks
🐛 Fix new render masks
2025-05-14 10:33:52 +02:00
Alejandro Alonso
1f44d53f6b 🐛 Fix new render masks 2025-05-13 15:41:41 +02:00
Alonso Torres
ca2891d441 🐛 Fix problem syncing library colors and typographies (#6467) 2025-05-13 13:28:16 +02:00
Belén Albeza
91fbe8f8ef 🎉 Cap stop amount in UI for wasm (#6438)
* 🎉 Cap in the colorpicker the amount of stops a gradient can have

* 🎉 Cap the stops amount in gradient handlers

* 🎉 Disable add stop in gradient handlers (viewport + colorpicker)

*  Add integration test for gradient limits

* 💄 Address PR suggestion
2025-05-13 10:37:05 +02:00
Miguel de Benito Delgado
69cc4fb4c2 📚 Add missing command to open a repl on frontend process (#6458)
* 📚 Add missing command to open a repl on frontend process

* 📚 Add further information on starting a REPL on the frontend process
2025-05-13 08:10:52 +02:00
Elenzakaleidos
37abb7b237 💄 Update video in readme page (#6461)
Signed-off-by: Elenzakaleidos <elena.scilinguo@kaleidos.net>
2025-05-13 08:10:19 +02:00
Ramiro Andres Sanchez Balo
5fc2208c16 📚 Improve metadata descriptions (#6457) 2025-05-13 08:09:59 +02:00
Alejandro Alonso
c2b67d7c67 Merge pull request #6459 from penpot/superalex-fix-wasm-playground-fills-size
🐛 Fix wasm playground fills size
2025-05-13 06:23:48 +02:00
Pablo Alba
294ce7bb1b 🐛 Fix variants override for nested components (#6421) 2025-05-12 15:50:06 +02:00
Andrey Antukh
a558bfdb2f Merge remote-tracking branch 'origin/staging' into develop 2025-05-12 15:16:19 +02:00
Andrey Antukh
86bcd1b681 🐛 Fix issue on shortcuts restore operation (#6462)
* 🐛 Fix issue on shortcuts restore operation

Happens when the order of shortcuts pop events is inconsistent with
push events. Using less strictly order policy for pop operations
allows relax this and make it eventually consistent.

* 💄 Add cosmetic changes on shortcuts hooks on colorpicker and    wport

* 📎 Update changelog

* 📎 Add PR feedback changes
2025-05-12 15:08:14 +02:00
Elena Torró
33c260c35b Merge pull request #6456 from penpot/alotor-perf-text-grow-2
 Reflow flex on grow text height
2025-05-12 14:16:29 +02:00
Andrey Antukh
94312bb35c Merge remote-tracking branch 'origin/staging' into develop 2025-05-12 13:44:24 +02:00
Andrey Antukh
70b1989f10 Merge tag '2.7.0-RC2' 2025-05-12 13:11:40 +02:00
Alejandro Alonso
eb76d16b3b 🐛 Fix wasm playground fills size 2025-05-12 12:05:10 +02:00
Xavier Julian
c0eaa75232 💄 Fix errors UI on input token for value 2025-05-12 12:03:23 +02:00
Alejandro Alonso
dbb9971482 Merge pull request #6351 from penpot/niwinz-develop-improve-cleaner
 Add cleaner to file-gc
2025-05-12 11:52:01 +02:00
Alejandro Alonso
0828994840 Merge pull request #6419 from penpot/niwinz-refactor-library
♻️ Refactor penpot library
2025-05-12 11:47:00 +02:00
ºelhombretecla
e6b5618bd3 🎉 Add 2.7 release slides (#6440) 2025-05-12 11:38:00 +02:00
Aitor Moreno
9c24d3a521 Merge pull request #6370 from penpot/superalex-improve-zoom-in-zoom-out-performance-2
🎉 Improve zoom in/out performance
2025-05-12 11:22:57 +02:00
Alejandro Alonso
480e0887e3 🎉 Improve zoom in/out performance 2025-05-12 11:10:21 +02:00
Alejandro Alonso
e0e381bdfc Merge pull request #6451 from penpot/niwinz-develop-features-binfile-v1
🐛 Apply migrations in correct order for binfile-v1
2025-05-12 11:08:10 +02:00
Alejandro Alonso
5199b306aa Merge pull request #6446 from penpot/niwinz-staging-bugfixes-2
🐛 Properly propagate export errors from worker to main thread
2025-05-12 10:47:46 +02:00
Alejandro Alonso
8febfaa21e Merge pull request #6447 from penpot/niwinz-staging-bugfixes
 Ensure read-only mode on non-workspace access to file
2025-05-12 10:43:02 +02:00
Aitor Moreno
69062f03ee Merge pull request #6449 from penpot/superalex-add-shapes-buffer
🎉 Add shapes buffer to improve memory allocation
2025-05-12 10:23:34 +02:00
alonso.torres
eb04fa19e1 Reflow flex on grow text height 2025-05-12 09:48:57 +02:00
Alejandro Alonso
03b4fe3558 🎉 Add shapes buffer to improve memory allocation 2025-05-09 15:00:02 +02:00
Andrey Antukh
b349d08155 🐛 Apply migrations in correct order for binfile-v1
The patch was already existed but only applied to binfile-v3,
with this commit, the fix is properly applied to all binfile
formats and for duplicate file operation.
2025-05-09 13:38:13 +02:00
Elena Torró
15e9d92094 Merge pull request #6445 from penpot/elenatorro-11044-fix-parsing-text-spaces
🐛 Fix parsing text spaces
2025-05-09 12:31:17 +02:00
andrés gonzález
5e675dbf0b 📚 Update changelog for 2.7 (#6448) 2025-05-09 12:20:39 +02:00
Elena Torro
a5660819de 🐛 Fix stroke paragraphs 2025-05-09 11:54:51 +02:00
luisδμ
d277fefc87 Improve combobox component (#6424) 2025-05-09 11:33:57 +02:00
Elena Torro
1383010826 🔧 Remove log 2025-05-09 11:23:06 +02:00
Elena Torro
59982c9056 🐛 Fix parsing text spaces 2025-05-09 11:23:00 +02:00
Alejandro Alonso
afcff84e38 Merge pull request #6443 from penpot/niwinz-develop-feaures-bugfix
🐛 Fix incorrect features asignation after file migration
2025-05-09 11:17:27 +02:00
Andrey Antukh
fc5d9659d6 🐛 Properly propagate export errors from worker to main thread 2025-05-09 11:15:04 +02:00
Andrey Antukh
8fa7fa8c4b 🐛 Fix incorrect features asignation after file migration 2025-05-09 10:53:16 +02:00
Elena Torró
23bde76192 Merge pull request #6437 from penpot/elenatorro-add-fill-text-strokes
🎉 Add text stroke fills
2025-05-09 10:41:12 +02:00
BDVGitHub
ca7a80fb83 📚 Update framework version
Fix Svelte version number
2025-05-09 08:46:33 +02:00
BDVGitHub
cf0d9a433d 📚 Chore: Update create-a-plugin.md
Add Svelte and change version to the updated version of in the examples on https://github.com/penpot/plugin-examples
2025-05-09 08:46:33 +02:00
Andrey Antukh
bc20598b3d Don't persist file on several read operations
after applying migrations
2025-05-08 19:15:28 +02:00
Andrey Antukh
9de8ebb52c Add read-only option for files/get-file 2025-05-08 19:12:50 +02:00
alonso.torres
568af52ebc Text grow width/height 2025-05-08 17:59:18 +02:00
Elena Torro
eddabc0d68 🎉 Add text stroke fills 2025-05-08 15:49:58 +02:00
Pablo Alba
6b300d516b 🐛 Fix restore totally deleted variant should add props as name 2025-05-08 15:01:29 +02:00
Andrey Antukh
e271caa32b Merge remote-tracking branch 'origin/staging' into develop 2025-05-08 13:41:11 +02:00
Alonso Torres
9be569c54c 🐛 Fix problem when duplicating grid layout (#6426) 2025-05-08 13:39:47 +02:00
Alonso Torres
7e6a621484 🐛 Restore component fix order inside flex (#6432) 2025-05-08 13:37:59 +02:00
Eva Marco
66b47f9444 🐛 Fix resize bar background (#6435) 2025-05-08 13:37:00 +02:00
Andrey Antukh
694a2084e2 Add file cleaner to file-gc process 2025-05-08 13:35:25 +02:00
Andrey Antukh
fef19a3c80 Add legacy flex dir cleaner 2025-05-08 13:35:25 +02:00
Andrey Antukh
3da8b945ca 📎 Don't send unnecesary features to worker 2025-05-08 13:35:24 +02:00
Andrey Antukh
8f27b82edd Extend cleaner to fix invalid root shapes 2025-05-08 13:34:48 +02:00
Andrés Moya
8b529d308c Merge pull request #6338 from penpot/hiru-rework-abstraction-levels
📚 Update Tech Guide about abstraction levels
2025-05-08 13:32:23 +02:00
Alejandro Alonso
71aa8e5a86 Merge pull request #6434 from penpot/niwinz-staging-webhook-audit
 Add webhook trigger to the audit events
2025-05-08 13:00:04 +02:00
Andrey Antukh
ab01f0b274 Merge remote-tracking branch 'origin/staging' into develop 2025-05-08 12:22:50 +02:00
Andrey Antukh
e203536506 Add webhook trigger to audit events 2025-05-08 11:56:06 +02:00
Eva Marco
b71b9edee7 🐛 Tooltip positioning tunning (#6418) 2025-05-08 11:09:58 +02:00
Elena Torró
bd514c0594 🔧 Fix linting warnings and errors (#6431) 2025-05-08 11:07:36 +02:00
Xavier Julian
36e1ad287c 💄 Fix design review for input component 2025-05-08 10:55:07 +02:00
Florian Schrödl
92f5b5f92b Allow importing token files with reference errors (#6374)
*  Allow importing token files with reference errors

*  Add test for missing references
2025-05-08 10:11:02 +02:00
Andrey Antukh
0b7b6e2c23 ♻️ Refactor penpot library 2025-05-08 09:51:25 +02:00
Elena Torró
46709fb02e Merge pull request #6379 from penpot/ladybenko-10753-fills-serialization
🎉 Serialize as bytes all fill kinds
2025-05-07 18:03:42 +02:00
Elena Torró
61eb2f4a19 🎉 Add text solid strokes (#6384)
* 🎉 Add text strokes

* 🔧 Minor refactor
2025-05-07 17:28:36 +02:00
Belén Albeza
3fe16bd8f9 🐛 Fix history panel shortcut (#6420)
*  Remove duplicate ID in file menu

* 🐛 Fix shortcut for Show Version History

*  Add regression test
2025-05-07 16:49:54 +02:00
Alejandro Alonso
a9725a1aac Merge pull request #6422 from penpot/superalex-add-even-to-power-up-link-from-workspace-menu
🐛 Add event to power up link from workspace menu
2025-05-07 15:13:31 +02:00
Belén Albeza
8f9298fac8 ♻️ Remove redundant calls to add_shape_fill 2025-05-07 14:55:54 +02:00
Alejandro Alonso
c3e76817cd 🐛 Add event to power up link from workspace menu 2025-05-07 13:45:57 +02:00
Andrey Antukh
8bdec66927 Remove the ILazySchema internal abstraction from schema ns 2025-05-07 12:17:24 +02:00
Andrey Antukh
66ee9edaf8 Add minor enhacements and naming fixes on schemas 2025-05-07 12:17:24 +02:00
Andrey Antukh
ffd7bc883d ⬆️ Update shadow-cljs to 3.0.3 on common and frontend 2025-05-07 12:17:23 +02:00
Andrey Antukh
1bcfa4b8dc 🎉 Add facility to define custom js class 2025-05-07 12:17:23 +02:00
Andrey Antukh
99e325acaf 🔥 Remove support from legacy-zip format 2025-05-07 12:14:52 +02:00
Andrey Antukh
8badd1f2eb 💄 Add cosmetic improvements to common scripts/repl
Make it consistent with backend scripts/repl
2025-05-07 12:14:51 +02:00
alonso.torres
44bf276c49 🐛 Remove print 2025-05-07 12:13:47 +02:00
Eva Marco
0f3a4db71e ♻️ Refactor modal/hide! function calls (#6415) 2025-05-07 09:53:07 +02:00
Pablo Alba
751bed4117 Manage overrides on variants switch 2025-05-07 09:29:41 +02:00
Alejandro Alonso
ea095a98ba Merge pull request #6367 from penpot/azazeln28-refactor-flush-and-submit
♻️ Flush and submit
2025-05-07 07:03:22 +02:00
Eva Marco
348a9c82bf Merge pull request #6413 from penpot/eva-fix-tooltip-display-prop
🐛 Fix tooltip display on hide
2025-05-06 19:36:29 +02:00
Eva Marco
e2918f4148 🎉 Create tooltip DS component (#6340)
*  Add new tooltip DS component

* 🎉 Add delay

* 🎉 Update docs and stories

* 🎉 Add configurable delay

* ♻️ Fix comments

* ♻️ Fix comments
2025-05-06 17:15:22 +02:00
Aitor Moreno
c45187eedd Merge pull request #6381 from penpot/alotor-perf-modifiers-refactor
 Apply modifiers changes into data
2025-05-06 15:52:57 +02:00
Elena Torró
eeea5f2cc8 Merge pull request #6411 from penpot/alotor-perf-fix-text-editor-v2-error
🐛 Fix problem with editor v2
2025-05-06 15:03:15 +02:00
alonso.torres
05b6aeef3e 🐛 Fix problem with editor v2 2025-05-06 14:50:10 +02:00
Belén Albeza
6323031b40 📚 Add serialization docs for fills 2025-05-06 14:41:40 +02:00
Andrey Antukh
6ccb6cafaa Merge pull request #6263 from penpot/niwinz-develop-path-data-optimizations-1
 Performance optimizations to path related functions
2025-05-06 13:53:56 +02:00
Andrey Antukh
be26985ca5 Make the fdata/path-data feature no-team-inheritable
And also add helpers for revert it to plain format
2025-05-06 13:39:17 +02:00
Andrey Antukh
2aa2525d0e Add db conn dynamic binding for srepl helpers 2025-05-06 13:39:17 +02:00
Andrey Antukh
7cb2f307d8 Move path-editor from selection handlers 2025-05-06 13:39:17 +02:00
Andrey Antukh
f1a557c372 Add minor performance enhacements to viewport top-bar 2025-05-06 13:39:17 +02:00
Andrey Antukh
202337b135 💄 Add cosmetic improvements for start-editing-selected event fn 2025-05-06 13:39:16 +02:00
Andrey Antukh
4e3abcbd45 🐛 Prevent NPE on get-points 2025-05-06 13:39:16 +02:00
Andrey Antukh
122e5a4b57 🐛 Fix path content json decoding mechanism 2025-05-06 13:39:16 +02:00
Andrey Antukh
1981946480 🐛 Fix incorrect path content handling on converting from shape 2025-05-06 13:39:16 +02:00
Andrey Antukh
7d327d23a2 Make consistent use of .toString with path content 2025-05-06 13:39:16 +02:00
Andrey Antukh
500c27859b 🐛 Fix geom/point zero? predicate to work correctly with mixed numeric types
Using numeric indpendent equality check: `==`
2025-05-06 13:39:16 +02:00
Andrey Antukh
c6f68e6ed1 ♻️ Use LITTLE_ENDIAN instead of BIG_ENDIAND for path encoding 2025-05-06 13:39:15 +02:00
Andrey Antukh
b48faf8fe0 Simplify impl with sharing more code
and use macros for abstract platform differences
2025-05-06 13:39:15 +02:00
Andrey Antukh
fa24ced3a3 🐛 Don't render path editor on editing grid on frame 2025-05-06 13:39:15 +02:00
Andrey Antukh
b9ea2425b9 🔥 Remove legacy path formating code 2025-05-06 13:39:15 +02:00
Andrey Antukh
1abaff9c52 Add minor improvements to curve drawing internal impl 2025-05-06 13:39:15 +02:00
Andrey Antukh
6f2ccabaa2 Coerce PathData float values to double
For avoid equality issues on JVM
2025-05-06 13:39:14 +02:00
Andrey Antukh
1c77126fe6 Implement get-handlers in term of internal reduce
That has an average performance improvement of 64% over
original impl and reduction of generation of object garbage
2025-05-06 13:39:14 +02:00
Andrey Antukh
7196be2a23 🎉 Add support for internal reduce on PathData type 2025-05-06 13:39:14 +02:00
Andrey Antukh
d509b840dc 🔥 Remove unused get-commands fn 2025-05-06 13:39:14 +02:00
Andrey Antukh
61c23877c1 Rename handler->point to get-handler-point 2025-05-06 13:39:14 +02:00
Andrey Antukh
0e61398d67 Optimize handler->point path segment helper fn
More or les x2 speed improvement and reduced the generation
of objects garbage.
2025-05-06 13:39:13 +02:00
Andrey Antukh
f12656463d Add a helper for perform internal lookup on path content 2025-05-06 13:39:13 +02:00
Andrey Antukh
ba9fc37226 🔥 Remove unused fn content->points
Replaced by get-points
2025-05-06 13:39:13 +02:00
Andrey Antukh
60f754f172 Add minor improvements to get-segments-with-points
And rename it from `get-segments`
2025-05-06 13:39:13 +02:00
Andrey Antukh
3a22545158 Replace cmd name usage with segment name
For fix naming inconsistency
2025-05-06 13:39:13 +02:00
Andrey Antukh
1d0020f6e6 Replace duplicate fn get-point with segment->point 2025-05-06 13:39:13 +02:00
Andrey Antukh
f3c3f3e2d8 🔥 Remove legacy-parser1
Unused
2025-05-06 13:39:12 +02:00
Andrey Antukh
9ba0ae5532 Replace command->point with segment->point helper 2025-05-06 13:39:12 +02:00
Andrey Antukh
db73c2eea0 Fix segment param naming on path type helpers 2025-05-06 13:39:12 +02:00
Andrey Antukh
753823c0b3 Reorganize path toString impl 2025-05-06 13:39:12 +02:00
Andrey Antukh
44e8eacb8d Add the ability to provide initial value on path -walk 2025-05-06 13:39:12 +02:00
Andrey Antukh
33bcbd89f1 Optimize calculate-extremities path helper
Heavily used on path edition
2025-05-06 13:39:11 +02:00
Andrey Antukh
b0cbe3cec8 Replace content->points with faster get-points 2025-05-06 13:39:11 +02:00
Andrey Antukh
3ca76c9ef7 ♻️ Refactor path-editor component 2025-05-06 13:39:11 +02:00
Andrey Antukh
93199e1a70 ♻️ Refactor path editor component: path-snap 2025-05-06 13:39:11 +02:00
Andrey Antukh
93a601a1e7 ♻️ Refactor path editor component: path-preview 2025-05-06 13:39:11 +02:00
Andrey Antukh
3d864c4ff1 ♻️ Refactor path editor components: path-handler and path-point 2025-05-06 13:39:11 +02:00
Andrey Antukh
da2f519805 Add get-points helper, a faster alternative to content->points 2025-05-06 13:39:10 +02:00
Andrey Antukh
230e330eb2 Add cache and faster way to iterate over PathData 2025-05-06 13:39:10 +02:00
Andrey Antukh
4f6dffabb4 ♻️ Use new call convention for path drawing components 2025-05-06 13:39:10 +02:00
Andrey Antukh
09c3490cae Add naming improvement to bool content update fn 2025-05-06 13:39:10 +02:00
Andrey Antukh
1fc0203c38 🎉 Add full integration with path data type feature 2025-05-06 13:39:10 +02:00
Andrey Antukh
f545d7b3ea ♻️ Refactor bool shape creation and modification events 2025-05-06 13:39:09 +02:00
Andrey Antukh
b242eb5b32 🔥 Remove unused components-v2 binding on fdata creation 2025-05-06 13:39:09 +02:00
Andrey Antukh
be9e3fa355 Add better error reporting for test check tests 2025-05-06 13:39:09 +02:00
Andrey Antukh
fac93e4ff8 Add serialization support for PathData
For transit and fressian
2025-05-06 13:39:09 +02:00
Belén Albeza
8609db2182 ♻️ Remove unused deserialization code 2025-05-06 13:00:25 +02:00
Belén Albeza
ec73bd640c Use mem::transmute to deserialize raw fill data 2025-05-06 12:38:30 +02:00
Belén Albeza
cba65972dd Use same wasm function to add all types of fills 2025-05-06 12:33:14 +02:00
luisδμ
e62231cfed ♻️ Rename, move and refactor the input-with-values component (#6387)
* 💄 Adapt behaviour when hovering

* ♻️ Rename, refactor and move component

* 📎 PR changes
2025-05-06 11:19:18 +02:00
Aitor Moreno
3249fb43c3 Merge pull request #6378 from penpot/elenatorro-10914-fix-children-render-order
🐛 Render children in the correct order
2025-05-06 09:59:59 +02:00
Pablo Alba
ee0ba15f9e ♻️ Refactor update attrs
* Extract token update from update-attrs

* Split update-attrs in smaller functions for legibility and reusability
2025-05-05 18:14:04 +02:00
Belén Albeza
784aecd1a1 🎉 Add a DTO that handles all fill types 2025-05-05 16:55:00 +02:00
Belén Albeza
173d6c23b0 Serialize image fills in binary 2025-05-05 15:51:21 +02:00
Aitor Moreno
abc1241402 ♻️ Refactor flush and submit 2025-05-05 15:10:20 +02:00
Belén Albeza
f30441626e ♻️ Refactor fills DTOs into separate submodules 2025-05-05 12:33:40 +02:00
Belén Albeza
5ae125db94 Serialize stroke solid fills as bytes (wasm) 2025-05-05 12:33:40 +02:00
Belén Albeza
093fa18839 Serialize solid fills as bytes (wasm) 2025-05-05 12:33:40 +02:00
Belén Albeza
81f18ad7f4 ♻️ Normalize opacity in fills to u8 2025-05-05 12:33:40 +02:00
Belén Albeza
875e019d4f ♻️ Refactor raw gradient data into wasm module 2025-05-05 12:33:40 +02:00
Belén Albeza
8e18a0880e ♻️ Use a single byte to store gradient stop count (wasm) 2025-05-05 12:33:39 +02:00
alonso.torres
36b78e5e21 🐛 Fix restore component restore layout 2025-05-05 11:50:08 +02:00
María Valderrama
86a498fc29 Optimize profile setup flow for better user experience (#6223)
*  Optimize profile setup flow for better user experience

* 📎 Remove extra onboarding step

* 📎 Code review

* 📎 Update changelog

---------

Co-authored-by: Andrey Antukh <niwi@niwi.nz>
2025-05-05 10:42:08 +02:00
Alejandro Alonso
aae81b8a04 🎉 Add wasm playground environment 2025-05-05 09:45:59 +02:00
Xaviju
486f036a11 ♻️ Redesign form input tokens (#6294)
* ♻️ Redesign form input tokens

* ♻️ Redesign form input tokens

---------

Co-authored-by: Xavier Julian <xaviju@proton.me>
2025-05-05 09:05:14 +02:00
Alonso Torres
a2c9d307df 🐛 Fix problem in viewer with the back button (#6385) 2025-05-05 08:54:05 +02:00
Andrés Moya
e52fd90963 💄 Add copyright header to all tokens source files (#6389) 2025-05-01 10:06:17 +02:00
Elena Torro
f8602810eb 🐛 Fix font id serialization 2025-04-30 11:48:07 +02:00
Pablo Alba
219ddfabaf Restore a deleted variant 2025-04-30 11:40:00 +02:00
alonso.torres
d8b3b216e9 🐛 Fix import modal style problem 2025-04-30 10:48:48 +02:00
alonso.torres
88e5209856 Apply modifiers changes into data 2025-04-30 09:34:13 +02:00
Andrey Antukh
c2b13a6d5d 📚 Update changelog 2025-04-29 14:46:15 +02:00
Elena Torro
9eefe13e8b 🐛 Render children in the correct order 2025-04-29 13:39:57 +02:00
Elena Torró
7eab6a2f1d Merge pull request #6372 from penpot/elenatorro-10892-load-emoji-font-lazily
 Load emoji font dynamically when initializing
2025-04-29 13:18:09 +02:00
Elena Torro
2306df5fb7 Load emoji font dynamically when initializing 2025-04-29 13:07:06 +02:00
Andrey Antukh
56ecacee21 Merge remote-tracking branch 'origin/staging' into develop 2025-04-29 11:30:16 +02:00
Andrey Antukh
a60b3d4b08 Merge pull request #6375 from penpot/hiru-move-tokens-staging
🔧 Reorganize tokens data functions
2025-04-29 10:43:13 +02:00
Andrés Moya
b14798b405 🔧 Make private function 2025-04-29 10:28:00 +02:00
Andrés Moya
8382a88efe 🔧 Move errors and warnings to workspace.data 2025-04-29 10:27:56 +02:00
Andrés Moya
53057c4bf2 🔧 Move token update to workspace.data and rename to propagation 2025-04-29 10:27:50 +02:00
Andrés Moya
3e0f38e8c3 🔧 Move token helpers to common.files 2025-04-29 10:27:46 +02:00
Andrés Moya
a5bbe765b9 🔧 Move style-dictionary and tinycolor to main.data 2025-04-29 10:27:42 +02:00
Andrés Moya
4455adc813 🔧 Move token lib edit to workspace.data and remove unused code 2025-04-29 10:27:38 +02:00
Andrés Moya
abca763aa5 🔧 Move token application to workspace.data 2025-04-29 10:27:20 +02:00
Andrés Moya
5c74349de0 🔧 Make private function 2025-04-29 10:11:40 +02:00
Andrés Moya
4a7b72dae1 🔧 Move errors and warnings to workspace.data 2025-04-29 10:11:40 +02:00
Andrés Moya
23e17d7f30 🔧 Move token update to workspace.data and rename to propagation 2025-04-29 10:11:40 +02:00
Andrés Moya
37cf829188 🔧 Move token helpers to common.files 2025-04-29 10:11:40 +02:00
Andrés Moya
f213ffabe1 🔧 Move style-dictionary and tinycolor to main.data 2025-04-29 10:11:40 +02:00
Andrés Moya
a1921bb767 🔧 Move token lib edit to workspace.data and remove unused code 2025-04-29 10:11:40 +02:00
Andrés Moya
213c04bc8a 🔧 Move token application to workspace.data 2025-04-29 10:11:40 +02:00
Pablo Alba
916eb530a0 Close swap panel after doing a swap 2025-04-28 11:23:42 +02:00
Andrey Antukh
1f0644ea91 Merge pull request #6314 from penpot/niwinz-subscriptions-internal-api
 Add prepl api for subscriptions
2025-04-28 10:34:29 +02:00
Andrey Antukh
b20147255a Add better approach for returning subscription on teams response 2025-04-28 10:23:02 +02:00
Andrey Antukh
38728eb342 Add the ability to known the subscription status on teams list 2025-04-28 10:23:02 +02:00
Andrey Antukh
18c7890f65 Add proper impl for retrieving num of editors 2025-04-28 10:23:02 +02:00
Andrey Antukh
1c224609b9 Add prototype for returning number of used slots on customer 2025-04-28 10:23:02 +02:00
Andrey Antukh
4b81468c9c Allow subscription to be nil 2025-04-28 10:23:02 +02:00
Andrey Antukh
cffac2a56a Change schema for subscription 2025-04-28 10:23:02 +02:00
Andrey Antukh
05c0f8d69f 🎉 Add update-customer-subscription prepl method 2025-04-28 10:23:02 +02:00
Andrey Antukh
5db5bc65de 🎉 Add get-customer-prfile prepl rpc method 2025-04-28 10:23:02 +02:00
Andrey Antukh
952ab032f9 🎉 Add authenticate prepl rpc method 2025-04-28 10:23:02 +02:00
Andrey Antukh
2df6f2b8b1 ♻️ Refactor prepl interface
Make prepl to be json message based protocol
instead of clojure expression. This facilitates
implementing internal RPC over socket server.
2025-04-28 10:23:02 +02:00
Andrey Antukh
62a12a64a3 Merge branch 'staging' into develop 2025-04-28 08:44:05 +02:00
Andrey Antukh
6935d54870 Merge branch 'main' into staging 2025-04-28 08:43:54 +02:00
Andrey Antukh
049427c6ca Merge branch 'main' into develop 2025-04-28 08:43:39 +02:00
Andrey Antukh
65e8526ee2 Merge tag '2.6.2-RC4' 2025-04-28 08:43:04 +02:00
alonso.torres
8ce71e792e Add dynamic properties modifiers to WASM 2025-04-25 15:03:24 +02:00
Andrés Moya
202762027f 🐛 Handle swapped nested instances when detaching 2025-04-25 10:00:14 +02:00
Andrés Moya
d95551e651 🔧 Add debug traces to detach copy operation 2025-04-25 10:00:14 +02:00
Elena Torro
44d68ad723 🐛 Calculate text-length in bytes correctly 2025-04-25 09:48:12 +02:00
Elena Torró
9e4c9d3101 Merge pull request #6353 from penpot/ladybenko-10867-comment-crash
🐛 Fix comment loading crash (new renderer viewport)
2025-04-25 08:41:51 +02:00
Andrey Antukh
050692952e Merge remote-tracking branch 'origin/staging' into develop 2025-04-24 15:11:12 +02:00
Xaviju
c96fbfdcd6 📚 Update tokens changelog for 2.6.2 (#6364)
Co-authored-by: Xavier Julian <xaviju@proton.me>
2025-04-24 13:29:56 +02:00
Belén Albeza
ab90d9d01c 🔧 Increase the cap for gradient stops 2025-04-24 12:20:34 +02:00
Belén Albeza
281c0068d9 Embed stop data into RawGradientData 2025-04-24 12:20:34 +02:00
Belén Albeza
e7b74939cb 💄 Change to more idiomatic code in main.rs functions 2025-04-24 12:20:34 +02:00
Elena Torró
c2ae58bf08 🎉 Add text shadows (#6335) 2025-04-24 12:19:41 +02:00
Elena Torró
14e8026e30 🐛 Fix take new lines into account when rendering text (#6337) 2025-04-24 12:16:21 +02:00
Xaviju
eb29a42209 📚 Update tokens changelog for 2.6.2 and 2.7 (#6363)
Co-authored-by: Xavier Julian <xaviju@proton.me>
2025-04-24 11:40:06 +02:00
Pablo Alba
6fdaad1bf4 🐛 Fix corner case when selecting component to switch (#6350) 2025-04-24 10:38:32 +02:00
Elena Torró
dfa6c502dc Improve left sidebar horizontal layers scroll (#6317) 2025-04-24 10:00:15 +02:00
Belén Albeza
b958dcb891 🐛 Fix positioning of comment thread draft (#6357)
* 🐛 Fix positioning of comment thread draft

* 📚 Update changelog
2025-04-24 09:53:07 +02:00
Alejandro Alonso
6e5d64d403 Merge pull request #6362 from penpot/niwinz-staging-bugfixes-2
🐛 Add migration for fix old broken root shapes (file migration)
2025-04-24 09:28:04 +02:00
Andrey Antukh
3e0c2bf1a1 🐛 Add migration for fix root shape 2025-04-24 09:17:33 +02:00
Andrey Antukh
9c4896d72b Merge remote-tracking branch 'origin/staging' into develop 2025-04-24 09:00:13 +02:00
Andrey Antukh
283cdee5d6 Ensure consistency on using d/update-vals on file migrations 2025-04-24 08:55:54 +02:00
Andrey Antukh
ab5e01e54a Ensure we don't leave :components with nil on file data
after aplying migrations
2025-04-24 08:53:30 +02:00
Alejandro Alonso
01fec1a0cf Merge pull request #6339 from penpot/azazeln28-refactor-rebuild-tiles
♻️ Refactor how rebuild_tiles works
2025-04-24 07:38:56 +02:00
Aitor Moreno
caf13eb774 ♻️ Refactor how rebuild_tiles works 2025-04-24 07:34:35 +02:00
Alejandro Alonso
373248e304 Merge pull request #6360 from penpot/niwinz-staging-bugfixes-2
🐛 Fix issues on file data migration handling
2025-04-24 07:30:50 +02:00
Marina López
fef342b489 🐛 Fixed team info settings alignment (#6354) 2025-04-23 22:59:07 +02:00
Pablo Alba
6e9adece1f 🐛 Fix problems cutting-paste a variant to another page or file (#6359) 2025-04-23 22:58:12 +02:00
Andrey Antukh
80308ceafa 🐛 Make http cache aware of missing file data migrations 2025-04-23 18:15:33 +02:00
Andrey Antukh
f65518f865 🐛 Fix incorrect migration application after binfile import 2025-04-23 18:10:52 +02:00
Andrés Moya
c0315e2c30 🔥 Remove redundant schemas (and add some tooling) 2025-04-23 12:27:01 +02:00
Andrés Moya
2f20ccf289 🔥 Remove unused functions 2025-04-23 12:27:01 +02:00
Belén Albeza
1a7d60bb88 🐛 Fix comment loading crash 2025-04-23 12:15:16 +02:00
Alejandro Alonso
90b1895f19 Merge pull request #6352 from penpot/alotor-update-scripts
🐛 Fix wasm scripts
2025-04-23 11:39:15 +02:00
alonso.torres
7945a95522 🐛 Fix wasm scripts 2025-04-23 11:21:24 +02:00
Andrey Antukh
40fe6369cb Merge remote-tracking branch 'origin/staging' into develop 2025-04-23 08:59:33 +02:00
Alejandro Alonso
f155042958 Merge pull request #6345 from penpot/niwinz-staging-add-interaction-cleaning
🐛 Add migration for decoding and cleaning shape interactions
2025-04-23 08:08:31 +02:00
Andrey Antukh
1dd23a3f47 🐛 Invalidate http cache on apply migrations to file on read operation 2025-04-23 07:57:56 +02:00
Alejandro Alonso
55da3ee275 Merge pull request #6349 from penpot/azazeln28-fix-rendering-order
🐛 Fix rendering order
2025-04-23 07:07:27 +02:00
Andrey Antukh
1194e40222 🐛 Properly dispose rx subscription on grid thumbnail component 2025-04-22 21:39:57 +02:00
Andrey Antukh
05fac41534 🐛 Remove feature checking from get-file-data-for-thumbnail rpc method
The prev code has feature resolution race condition and it
in reallity does not need that check.
2025-04-22 21:38:40 +02:00
Andrey Antukh
3f85e89f62 🐛 Send frontend version on worker http requests 2025-04-22 21:26:51 +02:00
Alonso Torres
ee0f8ad19a 🐛 Fix horizontal scroll in viewer (#6347) 2025-04-22 21:03:45 +02:00
Andrey Antukh
b7d7cf233a Fix shadow colors on import penpot files 2025-04-22 19:58:10 +02:00
Aitor Moreno
38a708e12b 🐛 Fix rendering order 2025-04-22 18:49:57 +02:00
Alonso Torres
53dcd94f0d Add support for self mentions (#6341) 2025-04-22 18:49:10 +02:00
Pablo Alba
a3ccc3dfef Select correct component to switch when changing variant property (#6346) 2025-04-22 18:48:18 +02:00
Alonso Torres
bd208c31e2 🐛 Fix update layout on component restore (#6348) 2025-04-22 18:46:21 +02:00
Andrey Antukh
151dc352c8 Don't register shadow schema
It is not really necessary, we can use the
schema var directly.
2025-04-22 17:21:52 +02:00
luisδμ
77d8504baf Selection of several components of a variant at the same time 2025-04-22 15:56:38 +02:00
Andrey Antukh
ccbf17106d 🐛 Add migration for decoding and cleaning shape interactions 2025-04-22 15:04:22 +02:00
Andrey Antukh
95c4d95fd3 📎 Use d/update-vals instead of update-vals on migrations 2025-04-22 15:01:33 +02:00
Aitor Moreno
484772e3b2 Merge pull request #6313 from penpot/superalex-improve-images-performance-wasm
🎉 Improve images performance
2025-04-22 11:36:24 +02:00
Alejandro Alonso
5c7a1fb407 🎉 Improve tile caching 2025-04-22 11:03:21 +02:00
Pablo Alba
064981ff3d Merge remote-tracking branch 'origin/staging' into develop 2025-04-22 10:44:29 +02:00
Pablo Alba
fe003d7496 Add removal of variant container when it becomes empty (#6311) 2025-04-22 09:22:18 +02:00
Pablo Alba
fae1df7f4b 🐛 Fix extract component variant from variant with path (#6303) 2025-04-22 09:18:31 +02:00
Andrey Antukh
a72c07b657 Merge pull request #6309 from penpot/niwinz-staging-bugfixes-2
🐛 Several bugfixes
2025-04-22 09:15:02 +02:00
Florian Schrödl
0bff76e5f1 Don't override user provided color format (#6231) 2025-04-22 09:10:07 +02:00
Elena Torró
c7b062f483 Merge pull request #6278 from penpot/elenatorro-send-leaf-attrs-uint-arr
🔧 Parse text leaves all at once
2025-04-21 14:27:26 +02:00
Elena Torro
83f72f3e41 🔧 Parse text leaves all at once 2025-04-21 13:24:39 +02:00
Aitor Moreno
d8b71d76dd Merge pull request #6225 from penpot/elenatorro-10710-render-text-while-typing
🎉 Render text while typing
2025-04-21 12:33:08 +02:00
Aitor Moreno
a6d2f385af Merge pull request #6266 from penpot/superalex-fix-path-unions
🐛 Fix unions for new render
2025-04-21 11:23:14 +02:00
Pablo Alba
db9e397531 🐛 Fix variant from a shared lib doesnt't show props 2025-04-21 09:25:00 +02:00
Elena Torró
18dea6c3a3 Merge pull request #6298 from penpot/ladybenko-10752-gradient-stops
 Send fill + Stops in a single wasm call
2025-04-21 09:17:26 +02:00
Alejandro Alonso
8ebaecc472 🐛 Fix unions for new render 2025-04-21 08:10:15 +02:00
Unreal Vision
58e0b26493 🌐 Add translations for: French
Currently translated at 100.0% (1730 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2025-04-17 15:01:43 +02:00
Corentin Noël
c75380e063 🌐 Add translations for: French
Currently translated at 100.0% (1730 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2025-04-17 15:01:42 +02:00
Andrey Antukh
708492afeb 💄 Add mainly cosmetic changes to dashboard placeholder components 2025-04-17 09:20:35 +02:00
Andrey Antukh
1305ab3cc6 🐛 Fix issue with empty placeholder on team change 2025-04-17 09:20:34 +02:00
Andrey Antukh
29cc6b4f9c Print the current seed on test.check fail 2025-04-17 09:20:34 +02:00
Andrey Antukh
cc7f0b145c 🐛 Make shape interaction properly decode on binfile import 2025-04-17 09:20:34 +02:00
Andrey Antukh
e69c0c3e27 Make schema uuid parsing fns private 2025-04-17 09:20:34 +02:00
Andrey Antukh
a209966427 🐛 Don't use schema uuid parsing function on websocket ns 2025-04-17 09:20:34 +02:00
Andrey Antukh
d5abbd4220 📎 Add missing entries on the changelog 2025-04-17 09:20:32 +02:00
Andrey Antukh
43a75b64b4 Merge pull request #6318 from penpot/ladybenko-10781-rust-devenv
🔧 Improve Rust dev env
2025-04-17 08:48:50 +02:00
Pablo Alba
70a23a14c4 🐛 Fix allow moving a main component into another 2025-04-16 22:54:30 +02:00
Marina López
93c81ea49c 🐛 Fix pricing CTA to be under a config flag (#6304) 2025-04-16 17:17:47 +02:00
Xaviju
3a741d1c14 🐛 Hide inactive warning if sets are empty (#6295)
* 🐛 Hide inactive warning if sets are empty

* 📎 Add simplified impl with proper comment

---------

Co-authored-by: Xavier Julian <xaviju@proton.me>
Co-authored-by: Andrey Antukh <niwi@niwi.nz>
2025-04-16 17:17:13 +02:00
Pablo Alba
ba442e1549 Allow copy-paste variants into another file (#6319) 2025-04-16 17:12:12 +02:00
Andrés Moya
8c15296d07 Merge branch 'tokens-studio-hyma/99-improve-token-error-messages' into develop 2025-04-16 16:31:53 +02:00
Florian Schroedl
d26464c810 Catch invalid name errors in json 2025-04-16 16:30:47 +02:00
Belén Albeza
8ee202e5a1 🔧 Fix emscripten version in devenv 2025-04-16 15:30:29 +02:00
Belén Albeza
689cddfd0c 🔧 Use cargo env variable for target and allow to override it as well as SKIA_BINARIES_URL 2025-04-16 15:05:31 +02:00
Elena Torró
25950bb5a5 Merge pull request #6312 from penpot/elenatorro-fix-children-removal-regression
🐛 Fix last shape removal
2025-04-16 15:03:26 +02:00
Belén Albeza
1da623e63f 💄 Change naming and args order of write-gradient-fill! 2025-04-16 14:09:24 +02:00
Belén Albeza
4bf9e24d43 ♻️ Avoid using get-prop when unneeded in serializers 2025-04-16 14:09:24 +02:00
Belén Albeza
b41a7b8547 💄 Remove no longer used functions in wasm serialization 2025-04-16 14:09:23 +02:00
Belén Albeza
f500a00d04 ♻️ Extract wasm-functions for fills and strokes out of main.rs 2025-04-16 14:09:19 +02:00
Belén Albeza
64a2a08d24 ♻️ Refactor gradient parsing from bytes 2025-04-16 14:08:38 +02:00
Belén Albeza
1f58f96e88 ♻️ Refactor serializing gradient fill 2025-04-16 14:07:35 +02:00
Belén Albeza
dc3d802d3d 🎉 Serialize radial fills in one go 2025-04-16 14:07:35 +02:00
Belén Albeza
5765d1c56c ♻️ Switch to a f32 offset for gradient stops 2025-04-16 14:07:35 +02:00
Belén Albeza
abcd050c69 ♻️ Adapt linear gradient type so it can be used for radial too (wasm) 2025-04-16 14:07:33 +02:00
Belén Albeza
f40ef26c69 ♻️ Move color and fill serializers to their own sub-namespaces 2025-04-16 14:06:22 +02:00
Belén Albeza
fccd1a5bd7 Send fill + stops data in one call for linear fills 2025-04-16 14:05:39 +02:00
Alejandro Alonso
16012a3881 Merge remote-tracking branch 'origin/staging' into develop 2025-04-16 13:15:18 +02:00
Alejandro Alonso
ddc41027ab Merge pull request #6316 from penpot/palba-fix-instanciate-component
🐛 Fix error while drag an drop a component to the canvas
2025-04-16 13:15:07 +02:00
Pablo Alba
4f931fbe6a 🐛 Fix error while drag an drop a component to the canvas 2025-04-16 13:05:56 +02:00
Marina López
7ada3692cf Design improvements to the Invitations page with an empty state 2025-04-16 12:38:47 +02:00
Elena Torro
1ab5d5027f 🐛 Fix last shape removal 2025-04-16 12:37:29 +02:00
Alejandro Alonso
1f16816fe4 Merge pull request #6310 from penpot/alotor-perf-reparent-modifiers
 Reparent modifiers
2025-04-16 12:21:20 +02:00
alonso.torres
daf048e258 Reparent modifiers 2025-04-16 11:27:51 +02:00
Alejandro Alonso
f3d13005b2 🐛 Fix avoid uncacheable tiles (#6281) 2025-04-16 10:59:24 +02:00
Elena Torró
25a44e1387 Merge pull request #6306 from penpot/ladybenko-fix-raf-macros
🐛 Fix broken test build for rust wasm
2025-04-16 07:15:27 +02:00
Belén Albeza
9e9612cf1f 🐛 Fix broken test build for rust wasm 2025-04-15 16:58:49 +02:00
Aitor Moreno
304c44048f ♻️ Refactor how rAF/cAF is handled (#6241) 2025-04-15 15:45:28 +02:00
Alejandro Alonso
99e64ad387 Merge pull request #6274 from penpot/alotor-perf-grid-layout-modifiers-3
 Modifiers grid multi-span
2025-04-15 13:39:45 +02:00
Marina López
0f0c45af8e Propagate sharing a prototype to editors and viewers (#6297) 2025-04-15 12:50:01 +02:00
Marina López
f2977cf938 Visual indicators for unlimited tier users (#6270)
*  Visual indicators for unlimited tier users

* ♻️ Refactor to organize properly subscription

* ♻️ Refactor with PR feedback

* 💄 Add minor cosmetic changes

---------

Co-authored-by: Andrey Antukh <niwi@niwi.nz>
2025-04-15 12:47:37 +02:00
Andrey Antukh
bb80da137d Merge remote-tracking branch 'origin/staging' into develop 2025-04-15 12:10:53 +02:00
Pablo Alba
f4b16a255c Copy values of same named properties moving a variant into another (#6288)
*  Copy values of same named properties moving a variant into another

*  Add MR changes
2025-04-15 12:06:58 +02:00
Andrey Antukh
b49a4734ff 🐛 Fix srepl helper for restore file snapshots 2025-04-15 11:03:50 +02:00
Marina López
ec8c30f060 Update board presets with newer devices (#6296) 2025-04-15 10:42:46 +02:00
Andrey Antukh
7990400c7a 🐛 Fix srepl helper for restore file snapshots (#6300) 2025-04-15 10:39:51 +02:00
Alejandro Alonso
2aaa2f3033 🐛 Fix template import (#6299) 2025-04-15 10:39:22 +02:00
Alejandro Alonso
202b9f3075 Merge pull request #6284 from penpot/niwinz-staging-several-bugfixes
🐛 Several bugfixes and enhacements
2025-04-15 10:33:59 +02:00
Eva Marco
eee5cf5fb4 Add duplicate sets feature (#6240)
*  Add duplicate sets feature

*  Add test to each module

* 🎉 Fix comments

* 🎉 Remove duplicate from groups

* 🎉 Remove create theme from test

* 🎉 Remove ' from names
2025-04-14 16:22:40 +02:00
Andrey Antukh
be0814cdac Improve internal error reporting 2025-04-14 13:26:12 +02:00
Xavier Julian
f5c699ab7a Improve copy on inactive set warning title 2025-04-14 10:30:48 +02:00
Andrey Antukh
80d719353c Make auth data available before request parsing
For properly report profile-id
2025-04-14 09:23:41 +02:00
Andrey Antukh
fa3fc12594 Sanitize uuid on the rest of code 2025-04-14 09:23:29 +02:00
Andrey Antukh
422a9db07b Sanitize uuid parsing on legacy zip import code 2025-04-14 09:13:35 +02:00
Andrey Antukh
a4145a30f5 🐛 Fix uuid encode/decode on schema 2025-04-14 09:13:34 +02:00
TheScientistPT
3d67c7930c 🌐 Add translations for: Portuguese (Portugal)
Currently translated at 92.3% (1598 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2025-04-13 20:18:26 +02:00
TheScientistPT
b55ec38c35 🌐 Add translations for: Portuguese (Portugal)
Currently translated at 92.2% (1596 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2025-04-11 23:02:00 +02:00
Stas Haas
02a1cfb457 🌐 Add translations for: German
Currently translated at 96.1% (1663 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2025-04-11 23:01:59 +02:00
Corentin Noël
b2ba38b5de 🌐 Add translations for: French
Currently translated at 98.7% (1708 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2025-04-11 23:01:57 +02:00
Pablo Alba
dcf1a593f7 Add playwright tests for cut-copy-paste variants 2025-04-11 15:17:33 +02:00
Pablo Alba
785b61be2f Fix corner cases of duplicate/copy-paste/cut-paste variants 2025-04-11 15:17:33 +02:00
Elena Torró
39c7782019 Merge pull request #6264 from penpot/elenatorro-10681-update-component-color-preview
🐛 Update the component thumbnail on component change
2025-04-11 14:33:07 +02:00
Alejandro Alonso
1c5c51907a Merge remote-tracking branch 'origin/staging' into develop 2025-04-11 14:05:00 +02:00
andrés gonzález
e004671346 📚 Update Recommended storage info (#6275) 2025-04-11 14:02:35 +02:00
alonso.torres
a59014cad0 Modifiers grid multi-span 2025-04-11 13:35:16 +02:00
Andrey Antukh
38e5c161e7 Sanitize plugins uuid parsing 2025-04-11 13:21:26 +02:00
Aitor Moreno
87650de9bc 🐛 Fix color gradient on text positioned incorrectly (#6253) 2025-04-11 11:36:31 +02:00
Florian Schrödl
ee5596067e ⬆️ Upgrade style_dictionary dependency to v5-rc1 (#6283) 2025-04-11 11:31:28 +02:00
Eva Marco
870fec6bbd 🐛 Fix modal hint as context notification (#6276) 2025-04-11 11:27:30 +02:00
Alejandro Alonso
686ab14b43 Merge pull request #6282 from penpot/alotor-fix-bool-wasm
🐛 Fix problem with booleans in wasm
2025-04-11 11:06:31 +02:00
alonso.torres
fced0cf3b1 🐛 Fix problem with booleans in wasm 2025-04-11 10:56:08 +02:00
Andrey Antukh
25dd53290c 🐛 Fix component thumbnail refresh on change
Happens when a component is nested in an other top level frame
2025-04-11 10:40:56 +02:00
Andrey Antukh
a7c1f7ba69 🐛 Fix incorrect undo handling on path edition 2025-04-11 08:54:02 +02:00
Elena Torró
de8e27feb8 Merge pull request #6242 from penpot/ladybenko-10666-builtin-fonts
🎉 Load built-in font and its variants (wasm)
2025-04-11 08:48:31 +02:00
luisδμ
e7144142e5 Add, edit and delete variant properties from layer panel (#6257) 2025-04-10 21:15:23 +02:00
Xavier Julian
b6f2a434cf Display inactive set warning 2025-04-10 15:02:30 +02:00
Alonso Torres
caf558f8dd 🐛 Fix import error messages (#6265) 2025-04-10 14:46:50 +02:00
Florian Schrödl
6f2f1b7a76 ⬆️ Update style dictionary to 4.3.3 (#6260)
Co-authored-by: Andrey Fedorov <oran9e.red@gmail.com>
2025-04-10 14:42:24 +02:00
Elena Torró
744ef1958b Merge pull request #6269 from penpot/elenatorro-fix-render-wasm-tests
🔧 Return the test output
2025-04-10 14:19:02 +02:00
Elena Torro
08b44e1857 🔧 Return the test output 2025-04-10 14:10:05 +02:00
Eva Marco
580b60550c 🐛 Fix notification vertical alignment (#6272) 2025-04-10 13:53:20 +02:00
Florian Schroedl
e9755d437e 🐛 Fix sets and set groups with same name cannot be renamed 2025-04-10 13:27:49 +02:00
Elena Torró
20f695e8d7 Merge pull request #6271 from penpot/ladybenko-fix-test-run
🔧 Update test script to use the right architecture
2025-04-10 13:04:22 +02:00
Belén Albeza
1d7ff1f9e4 🔧 Fix requiring an emscripten macro in non-wasm architectures 2025-04-10 12:52:56 +02:00
Belén Albeza
5b18f1d76d 🔧 Update test script to use the right architecture 2025-04-10 12:50:22 +02:00
Aitor Moreno
d880307a9b 🎉 Add performance measuring functions (#6229) 2025-04-10 11:33:22 +02:00
Eva Marco
e5db66351e 🐛 Fix scroll on token themes modal (#6251)
* 🐛 Fix scroll on token themes modal

* 🐛 Fix collapse set group error
2025-04-10 10:25:08 +02:00
ºelhombretecla
89153eef23 🎉 Increase height presets dropdown (#6185)
* 🎉 Add new measures dropdown height

* 🎉 Add enhancement to CHANGES.md
2025-04-10 10:01:52 +02:00
Alejandro
97c24c8b9c 🐛 Fix merge path nodes with only one node selected (#6248) 2025-04-10 09:08:44 +02:00
Alejandro Alonso
43535ae573 Merge remote-tracking branch 'origin/staging' into develop 2025-04-10 08:40:29 +02:00
Alejandro
b7a8677036 Merge pull request #6262 from penpot/niwinz-staging-clean-data
🐛 Clean workspace state on exit or url change
2025-04-10 08:38:55 +02:00
Alejandro
61643f676c Merge pull request #6249 from penpot/elenatorro-10750-fix-path-nil-svg-attrs
🔧 Do not try to set svg path attrs if none
2025-04-10 06:51:50 +02:00
Alejandro
9b8c8c4971 Merge pull request #6258 from penpot/elenatorro-10756-delete-last-shape
🐛 Remove children correctly
2025-04-10 06:49:41 +02:00
Alejandro
033ca0d56b 🐛 Fix error when an external user tries to export a shape on viewer (#6252) 2025-04-09 16:48:49 +02:00
Alonso Torres
28a6797595 🐛 Fix problem with error detail in toast (#6259) 2025-04-09 16:36:11 +02:00
Andrey Antukh
9ff2160c77 🐛 Clean workspace state on exit or url change 2025-04-09 16:31:49 +02:00
Elena Torro
953db56a0d 🐛 Remove children correctly 2025-04-09 14:39:21 +02:00
Denys Kisil
68ce13368e 🌐 Add translations for: Ukrainian (ukr_UA)
Currently translated at 100.0% (1730 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ukr_UA/
2025-04-09 14:01:41 +02:00
Alejandro Alonso
82cf474863 Merge remote-tracking branch 'origin/staging' into develop 2025-04-09 13:52:54 +02:00
Alejandro
4c77b32171 Merge pull request #6256 from penpot/niwinz-staging-fix-backend-tests
📎 Fix backend tests
2025-04-09 13:52:30 +02:00
Andrey Antukh
34141ce9af 📎 Fix backend tests
Caused by update of image procesing libraries on the devenv docker
image update from debian to ubuntu
2025-04-09 13:37:52 +02:00
Andrey Antukh
edfcac3d5c 🐛 Restore uid assignation on devenv entrypoint 2025-04-09 13:11:12 +02:00
Alejandro Alonso
774e11c827 Merge remote-tracking branch 'origin/staging' into develop 2025-04-09 12:53:18 +02:00
Alejandro
58c867885c Merge pull request #6250 from penpot/alotor-bug-colorpicker
🐛 Fix colorpicker scroll when dropdown displayed
2025-04-09 12:51:17 +02:00
alonso.torres
ccb6e25914 🐛 Fix colorpicker scroll when dropdown displayed 2025-04-09 12:50:55 +02:00
Alejandro
965d2d4036 🐛 Fix webhooks not shown in list (#6254) 2025-04-09 12:46:00 +02:00
Yamila Moreno
9f8d7c9e41 🐳 Improve https documentation 2025-04-09 12:24:43 +02:00
Andrey Antukh
8d352c1f82 Merge branch 'main' into staging 2025-04-09 10:59:37 +02:00
Andrey Antukh
faead09174 Merge tag '2.6.0' 2025-04-09 10:58:39 +02:00
Elena Torro
43f77376b6 🔧 Do not try to set svg path attrs if none 2025-04-09 10:13:39 +02:00
Yamila Moreno
ae3ce1220b 🐳 Improve https documentation 2025-04-09 10:05:18 +02:00
Andrey Antukh
6e3673136a 📎 Update changelog 2025-04-09 09:19:05 +02:00
Belén Albeza
c0ba92f503 🎉 Add support for default font variants (wasm) 2025-04-08 16:45:27 +02:00
Belén Albeza
90cb0357c6 🎉 Swap default font for source sans (wasm) 2025-04-08 14:48:28 +02:00
Alejandro
d55e55ebcc Merge pull request #6237 from penpot/niwinz-upgrade-devenv
⬆️ Upgrade devenv (ubuntu, jvm, node)
2025-04-08 10:50:50 +02:00
Aitor Moreno
c2522329fd Merge pull request #6235 from penpot/alotor-perf-grid-layout-modifiers-2
 Grid layout modifiers
2025-04-08 09:47:42 +02:00
Alejandro
2470c1788e 🐛 Fix render wasm build (#6239) 2025-04-08 09:06:32 +02:00
Pablo Alba
230d259551 Merge pull request #6238 from penpot/luis-improve-input-with-values-doc
📚 Update documentation for input-with-values component
2025-04-07 23:31:40 +02:00
Denys Kisil
a55db1d52b 🌐 Add translations for: Ukrainian (ukr_UA)
Currently translated at 100.0% (1730 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ukr_UA/
2025-04-07 16:01:42 +00:00
Luis de Dios
cb533335c4 📚 Update documentation for input-with-values component 2025-04-07 17:18:21 +02:00
Andrés Moya
a8890e4b13 Merge branch 'tokens-studio-florian-70-sets-in-theme-create' into develop 2025-04-07 17:08:33 +02:00
Florian Schroedl
0281e0dba4 🚧 Explicit state handling 2025-04-07 16:42:43 +02:00
Florian Schroedl
1c209f49fc 🚧 Don't expose state 2025-04-07 16:36:02 +02:00
Yamila Moreno
28caa1d47d 🐛 Fix docker-compose.yaml (#6236) 2025-04-07 16:29:47 +02:00
Andrey Antukh
a4701866a4 ⬆️ Upgrade devenv (ubuntu, jvm, node) 2025-04-07 16:26:04 +02:00
Florian Schroedl
12f72c8ca9 🚧 Show back button only when coming from a modal view 2025-04-07 16:04:18 +02:00
Florian Schroedl
c1165bd12d 🚧 Convert rumext 2025-04-07 16:04:18 +02:00
Florian Schroedl
215fb53c52 🚧 Use use-fn 2025-04-07 16:04:18 +02:00
Florian Schroedl
8df780b237 Allow editing of sets in create theme dialog
♻️ theme-state -> current-theme
2025-04-07 16:04:18 +02:00
Andrés Moya
79679cbb16 Merge branch 'tokens-studio-andrei/91-single-set-import-refactoring' into develop 2025-04-07 15:56:22 +02:00
Andrey Fedorov
fb2db4b918 ♻️ Refactor single set import functionality 2025-04-07 15:48:27 +02:00
Andrey Antukh
05b66f1dcf Merge remote-tracking branch 'origin/develop' into develop 2025-04-07 14:45:29 +02:00
Andrey Antukh
0f1b2003be Merge branch 'staging' into develop 2025-04-07 14:45:08 +02:00
Andrey Antukh
ea6f0abf7c 🐛 Fix regresion on features calculate method on workspace load 2025-04-07 14:32:48 +02:00
Belén Albeza
6f91da9461 🔧 Fix Rust tests (#6208)
* 🔧 Fix test script (rust wasm)

* 🔧 Make code compile in test mode + using aarch64 as a target for tests
2025-04-07 14:08:41 +02:00
Andrey Antukh
45cdfff128 🐛 Fix backend notifications on dashboard 2025-04-07 14:00:26 +02:00
Marina López
8c38e41261 🎉 Consolidate first state of a project (#6150) 2025-04-07 13:15:32 +02:00
alonso.torres
63666fca48 Grid layout modifiers 2025-04-07 11:51:28 +02:00
Andrey Antukh
d279b6c232 📎 Fix linter issues 2025-04-07 11:40:19 +02:00
Andrey Antukh
17f7f920c4 Merge branch 'staging' into develop 2025-04-07 11:32:41 +02:00
Alejandro
3197dfddd9 Merge pull request #6234 from penpot/niwinz-staging-bugfixes-3
🐛 Several bugfixes and backports
2025-04-07 11:15:32 +02:00
Andrey Antukh
b55c86544b 📎 Fix linter issues 2025-04-07 10:52:07 +02:00
Pablo Alba
af1d5b86e1 Merge pull request #6214 from penpot/palba-cleanup-components-v2
♻️ Cleanup of componentsv2
 Add check to avoid open files with components v1
2025-04-07 10:18:53 +02:00
Andrey Antukh
d900516302 Merge branch 'main' into staging 2025-04-07 09:59:27 +02:00
Andrey Antukh
fa68a25bea Merge branch 'warrenjokinen-patch-1' 2025-04-07 09:59:08 +02:00
warrenjokinen
2cc2d34719 📚 Update shortcuts.njk (docs)
minor typo
2025-04-07 09:57:05 +02:00
Andrey Antukh
4640d043e3 ⬆️ Update yarn 2025-04-07 09:21:56 +02:00
Alonso Torres
137e8d042f 🐛 Fix problem with boolean edges (#6218) 2025-04-07 09:19:43 +02:00
Andrey Antukh
bc957893f4 Make feature resolved on team load
That simplifies features retrieval to simple get
2025-04-07 07:50:40 +02:00
Andrey Antukh
b8107ee497 Ensure workspace page loading and intialization process 2025-04-07 07:42:09 +02:00
Andrey Antukh
6b3a988526 Send version and build data to worker configuration 2025-04-07 07:10:40 +02:00
Andrey Antukh
5cb39874a2 Add better error hints on auth ns 2025-04-07 07:10:40 +02:00
Rick Benetti
ee96c5599c 🌐 Add translations for: Portuguese (Brazil)
Currently translated at 74.0% (1281 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2025-04-05 14:07:11 +00:00
Elena Torro
4ceaedcbe8 🎉 Render text while typing 2025-04-04 14:02:02 +02:00
Pablo Alba
f375cc9a82 Add check to avoid open files with components v1 2025-04-04 11:08:30 +02:00
Marina López
9fc671cc17 🐛 Fix wrong path to list all icons in storybook 2025-04-04 10:36:51 +02:00
Elena Torró
5937ed57ce 🎉 Update font and variant on change (#6220) 2025-04-04 10:17:39 +02:00
Aitor Moreno
2e3ed0c23f Merge pull request #6230 from penpot/azazeln28-fix-mem-bytes-alloc-32
🐛 Fix bytes-alloc-32
2025-04-04 09:55:34 +02:00
Aitor Moreno
5d1d2ef289 🐛 Fix bytes-alloc-32 2025-04-04 09:43:48 +02:00
Elena Torró
480c224250 🐛 Fix long file names (#6216)
* 🔧 Add truncate str macro

* 🐛 Use truncate instead of prune to prevent title override

* 💄 Use text-overflow ellipsis on file names

* 📎 Add #10662 to 2.7 bugfixes
2025-04-03 16:06:02 +02:00
Aitor Moreno
cd731c3ad2 ♻️ Refactor heap usage (#6204) 2025-04-03 16:04:51 +02:00
Pablo Alba
3fb3b45fdc Merge pull request #6219 from penpot/niwinz-staging-bugfixes-2
🐛 Several bugfixes and enhancements
2025-04-03 15:49:09 +02:00
Andrey Antukh
9bc49e3381 Merge pull request #6209 from penpot/niwinz-features-enhancement
 Make feature resolved on team load
2025-04-03 15:43:12 +02:00
Andrey Antukh
0816adbaec Send ws messages in verbose format when on development build 2025-04-03 11:40:40 +02:00
Andrey Antukh
1d69941882 🐛 Fix backend notification dialogs 2025-04-03 11:40:40 +02:00
Pablo Alba
f961b75bba ♻️ Cleanup of componentsv2 2025-04-03 11:38:35 +02:00
Andrey Antukh
8f600f334f 🐛 Make accept and cancel handlers optional on actionable* 2025-04-03 11:21:02 +02:00
Andrey Antukh
cf55d12991 📚 Add better docstring for srepl.main/notify! helper 2025-04-03 11:21:02 +02:00
Andrey Antukh
78919df886 🐛 Fix incorrect topic sending on internal srepl notify helper 2025-04-03 10:58:10 +02:00
Marina López
1e16fb8ca2 🐛 Fix horizontal scroll from design tab (#6213) 2025-04-02 20:00:22 +02:00
Elena Torró
c332528185 🐛 Fix render object with pending status (#6215) 2025-04-02 19:58:03 +02:00
Pablo Alba
387c5e67f3 🐛 Fix flick on create variant (#6217) 2025-04-02 19:54:48 +02:00
Elena Torró
2ed780e14d Merge pull request #6205 from penpot/elenatorro-10528-fix-google-font-variant-styles
🐛 Fix Google Fonts load by parsing italic variant ids correctly
2025-04-02 17:16:51 +02:00
Pablo Alba
1b8714fe7f 🐛 Fix position problems cutting-pasting a component 2025-04-02 12:10:18 +02:00
Andrey Antukh
e28f8cae74 Merge remote-tracking branch 'origin/staging' into develop 2025-04-02 10:34:31 +02:00
Andrés Moya
5d600c6715 Change behavior of single set json file import to be coherent (#6211) 2025-04-02 09:41:12 +02:00
Andrey Antukh
ea031a2161 Merge pull request #6210 from penpot/niwinz-staging-bugfixes
🐛 Several bugfixes
2025-04-02 09:19:57 +02:00
Andrey Antukh
87ef98dad5 Consolidate layout/grid feature 2025-04-01 21:15:38 +02:00
Andrey Antukh
4d4a04e9aa Add minor enhacement for error reporting 2025-04-01 20:43:55 +02:00
Andrey Antukh
e6e71e9278 Add minor enhacement for error reporting 2025-04-01 20:24:07 +02:00
Andrey Antukh
02220d02ed ⬆️ Update svgo 2025-04-01 20:01:21 +02:00
Andrey Antukh
ff7b77bda7 ⬆️ Update yarn 2025-04-01 20:01:21 +02:00
Andrey Antukh
f8ffae75c4 Make feature resolved on team load
That simplifies features retrieval to simple get
2025-04-01 20:01:21 +02:00
Andrey Antukh
3ec797f56e 🐛 Validate and decode params on export-binfile 2025-04-01 19:16:35 +02:00
Andrey Antukh
cb350b26a1 Merge remote-tracking branch 'origin/develop' into develop 2025-04-01 18:27:02 +02:00
Andrey Antukh
dccebb0bea Merge remote-tracking branch 'origin/staging' into develop 2025-04-01 18:26:37 +02:00
Elena Torró
4cefbb52e1 Merge pull request #6206 from penpot/azazeln28-fix-not-enough-surfaces
🐛 Fix not enough surfaces
2025-04-01 15:47:59 +02:00
Elena Torro
d757009b48 🐛 Fix Google Fonts load by parsing italic variant ids correctly 2025-04-01 14:01:54 +02:00
Aitor Moreno
ca202711e1 🐛 Fix not enough surfaces 2025-04-01 13:41:33 +02:00
Eva Marco
74f11859e4 🐛 Fix max lenght on assets inputs (#6201) 2025-04-01 13:28:35 +02:00
Andrey Antukh
47f80cf3db 🐛 Make error middleware capture profile-id 2025-04-01 12:30:51 +02:00
Pablo Alba
f04229d8cb 🎉 Allow duplicate/copy-paste/cut-paste variants 2025-04-01 11:07:22 +02:00
Andrey Antukh
076d64df8f Merge remote-tracking branch 'origin/staging' into develop 2025-04-01 11:02:32 +02:00
Andrey Fedorov
a20dd3f955 Fix single set import 2025-04-01 10:57:17 +02:00
Andrey Antukh
982118c942 🐳 Update devenv corepack setup 2025-04-01 10:47:49 +02:00
Andrey Antukh
a51feb8638 📎 Update changelog 2025-04-01 10:47:13 +02:00
Elena Torró
3d7479f9aa 🐛 Fix stroke image rendering (#6189) 2025-04-01 09:55:19 +02:00
Yamila Moreno
9663964790 🐳 Make traefik example easier (#6198) 2025-04-01 09:34:46 +02:00
Elena Torró
76ffc2d268 🔧 Log error on process animation frame (#6182) 2025-04-01 09:01:49 +02:00
Elena Scilinguo
d0d118b31e 📚 Update README.md
Signed-off-by: Elena Scilinguo <elena.scilinguo@kaleidos.net >
2025-04-01 08:51:23 +02:00
Andrés Moya
2c0e18ce1c 🐛 Fix sync of margin and padding tokens in components 2025-03-31 16:19:45 +02:00
Eva Marco
89876ef96f 🐛 Fix UI with long named colors (#6193) 2025-03-31 15:33:30 +02:00
Elena Torró
895b5b2ee1 🐛 Fix new line parsing (#6180) 2025-03-31 14:59:34 +02:00
Rick Benetti
21702c090d 🌐 Add translations for: Portuguese (Brazil)
Currently translated at 73.9% (1280 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2025-03-31 11:06:36 +00:00
Elena Torró
9fd0e9af66 Merge pull request #6178 from penpot/ladybenko-10528-google-fonts
🎉 Render text that uses a google font (wasm)
2025-03-31 11:55:57 +02:00
luisδμ
648a8f9237 Allow modifying property name when a variation is selected (#6174)
*  Change property name when a variation is selected

* 📎 PR changes
2025-03-31 09:12:43 +02:00
Edgars Andersons
c4254106e8 🌐 Add translations for: Latvian
Currently translated at 100.0% (1730 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2025-03-29 13:01:53 +01:00
Xavier Julian
c259b8ed46 🐛 Fix overflow on tokens sidebar 2025-03-28 23:45:01 +01:00
Xavier Julian
b1df0ac194 Add a default 256 maxlength value to all input fields 2025-03-28 23:45:01 +01:00
Aitor Moreno
4e1ae1bc1a Merge pull request #6181 from penpot/superalex-tada-avoid-full-tiles-rebuild-on-set-modifiers
🎉 Avoid full tiles rebuild on set modifiers
2025-03-28 16:27:30 +01:00
Aitor Moreno
b6ac1dea4d 🐛 Fix TileSurfaceCache not deref surfaces 2025-03-28 16:14:37 +01:00
Belén Albeza
219d9af885 ♻️ Simplify font ids 2025-03-28 15:21:42 +01:00
Belén Albeza
c6bba54573 ♻️ Refactor font-related wasm code into a sub-namespace 2025-03-28 15:17:13 +01:00
Belén Albeza
f53cae0faa 🎉 Render text that uses a Google Font 2025-03-28 15:17:12 +01:00
Eva Marco
c1853a71a9 🐛 Fix available resize area (#6186) 2025-03-28 13:15:35 +01:00
Edgars Andersons
981336ed5e 🌐 Add translations for: Latvian
Currently translated at 98.4% (1704 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2025-03-28 11:01:58 +00:00
Linerly
3864ce6855 🌐 Add translations for: Indonesian
Currently translated at 100.0% (1730 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2025-03-28 11:01:57 +00:00
Alejandro Alonso
6953a57333 🎉 Avoid full tiles rebuild on set modifiers 2025-03-28 11:55:54 +01:00
Alejandro
a109f11926 Merge pull request #6187 from penpot/azazeln28-fix-surface-pool-missing-deallocation
🐛 Fix SurfacePool missing deallocation
2025-03-28 11:55:45 +01:00
Alejandro
45c9904e05 Merge pull request #6155 from penpot/azazeln28-feat-cache-extra-tiles
🎉 Cache extra tiles
2025-03-28 11:55:31 +01:00
Aitor Moreno
08fc32cdc6 🎉 Cache extra tiles 2025-03-28 11:34:18 +01:00
Aitor Moreno
6c10f1e364 🐛 Fix SurfacePool missing deallocation 2025-03-28 11:34:04 +01:00
Alejandro
e8549ffb79 Merge pull request #6177 from penpot/azazeln28-feat-sort-viewport-tiles
🎉 Sort viewport tiles by distance to center
2025-03-28 11:32:08 +01:00
Aitor Moreno
8a8d89dfc0 🎉 Sort viewport tiles by distance to center 2025-03-28 11:22:10 +01:00
Pablo Alba
b6c4376217 🐛 Fix bugs from varaints design review 2025-03-28 11:20:10 +01:00
Eva Marco
cbb3f6672f 🐛 Fix asset name on inspect tab (#6173)
Signed-off-by: Eva Marco <eva.marco@kaleidos.net>
2025-03-28 10:38:35 +01:00
Alejandro
bd5e47f5fc Merge pull request #6126 from penpot/elenatorro-10516-fix-stroke-shadows
🐛 Fix stroke shadows
2025-03-28 09:54:39 +01:00
Alejandro
2aa756af38 Merge pull request #6175 from penpot/niwinz-develop-binfile-path-fix
🐛 Fix binfile-v3 importation related to bool shape normalization
2025-03-28 09:46:16 +01:00
Andrey Antukh
78c2840b22 Merge remote-tracking branch 'origin/staging' into develop 2025-03-28 09:45:34 +01:00
Aitor Moreno
af0a516a79 🐛 Fix path editing with wrong selrect (#6168) 2025-03-28 09:43:46 +01:00
Alejandro
cc97a8ffcc Merge pull request #6158 from penpot/niwinz-staging-task-result
🐛 Fix incorrect task result handling
2025-03-28 09:43:11 +01:00
ºelhombretecla
535e8653a0 🎉 Add slides for version 2.6 (#6176) 2025-03-28 09:42:09 +01:00
Andrey Antukh
210e5b0023 🐛 Fix incorrect task result handling
That caused that many task rows in a table not properly marked
as completed and leaved just as scheduled.
2025-03-28 09:10:46 +01:00
Andrey Antukh
651beb4b9c 🐛 Fix binfile-v3 importation related to bool shape normalization 2025-03-28 08:57:47 +01:00
Elena Torro
f4d04a3dcb 🐛 Fix Stroke Shadows
- Move shadows surface responsibility
- Draw shadows directly into DropShadows and InnerShadows surfaces
- Draw stroke shadows directly into Strokes in order
- Clean up old shadow surfaces (Shadow & Overlay)
2025-03-28 08:56:37 +01:00
Elena Torró
d573da55b0 Merge pull request #6179 from penpot/elenatorro-10530-fix-paragraph
🐛 Revert offset change to fix paragraph rendering
2025-03-27 17:29:50 +01:00
Elena Torro
3c4be537d9 🐛 Revert offset change to fix paragraph rendering 2025-03-27 17:17:36 +01:00
Andrés Moya
6a87d5eea9 🐛 Rewrite active tokens calculation algorithm (#6165) 2025-03-27 15:53:17 +00:00
Elena Torró
9800331505 🎉 Improve performance reducing unnecessary calls to set-objects
🎉 Improve performance reducing unnecessary calls to set-objects
2025-03-27 16:19:36 +01:00
Alejandro Alonso
7728d5b317 🎉 Improve performance reducing unnecessary calls to set-objects 2025-03-27 15:47:03 +01:00
Aitor Moreno
8f47ed8b0a Merge pull request #6136 from penpot/superalex-disable-svg-viewport-texts-for-wasm-render
🐛 Disable svg viewport texts for wasm render
2025-03-27 14:46:38 +01:00
Alejandro
c137e682dc Merge pull request #6172 from penpot/elenatorro-10530-fix-text-drag-and-drop
 Render text properly while dragging and resizing the text Shape
2025-03-27 14:18:11 +01:00
Andrey Antukh
14c639a425 🐛 Fix bool type shape normalize migration 2025-03-27 14:15:13 +01:00
Elena Torró
06bfb1ad26 🎉 Add PathData data type
🎉 Add PathData data type
2025-03-27 13:39:54 +01:00
Elena Torro
33c3611345 Render text properly while dragging and resizing the text Shape 2025-03-27 13:04:45 +01:00
Alejandro Alonso
e012046f62 Merge remote-tracking branch 'origin/staging' into develop 2025-03-27 12:12:57 +01:00
Alejandro Alonso
237d9d067d Merge remote-tracking branch 'origin/main' into staging 2025-03-27 12:12:37 +01:00
Alejandro
6519db82d1 Merge pull request #6171 from penpot/mavalroot-install-plugin-bug
🐛 Fix plugin installation error by penpot hub
2025-03-27 12:12:19 +01:00
María Valderrama
0a60cbedb5 🐛 Fix plugin installation error by penpot hub 2025-03-27 11:57:23 +01:00
Andrey Antukh
ebf3730454 Normalize the content prop from bool type (#6162)
Make it the same as path shape, because they are essentially the
same data type
2025-03-27 11:15:48 +01:00
Edgars Andersons
ec0183ce94 🌐 Add translations for: Latvian
Currently translated at 97.6% (1690 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2025-03-27 11:01:53 +01:00
Aitor Moreno
3cf823ffb3 Merge pull request #6137 from penpot/superalex-rendering-wasm-performance
🎉 Avoid rendering too small shapes
2025-03-27 10:22:02 +01:00
Aitor Moreno
6231a9f931 Merge pull request #6130 from penpot/azazeln28-fix-tile-cache-exhaustion
🐛 Fix tile cache exhaustion
2025-03-27 09:51:16 +01:00
Elena Torró
dd30e939ae 📎 Add #9489 bug fix to CHANGELOG
📎 Add #9489 bug fix to CHANGELOG
2025-03-26 14:14:34 +01:00
Elena Torro
6f2e1d3794 📎 Add #9489 bug fix to CHANGELOG 2025-03-26 13:55:42 +01:00
Eva Marco
d7c709607d 🐛 Fix line height on token pills (#6164) 2025-03-26 13:46:55 +01:00
Elena Torró
2e41bd7607 🐛 Fix linecap SVG path property (#6163) 2025-03-26 13:46:35 +01:00
Andrey Antukh
bb7301fb63 Improve libraries loading on workspace (#6141)
*  Improve libraries loading on workspace

*  Add improvements to CSS

---------

Co-authored-by: Eva Marco <evamarcod@gmail.com>
2025-03-26 13:19:48 +01:00
Andrey Antukh
b9907ec401 🎉 Add PathData data type
That replaces the ad-hoc helpers for convert path content from
plain with encapsulated type that implements the appropriate
clojure protocols and interfaces that helps interacting with
binary encoded path data
2025-03-26 13:17:25 +01:00
Andrey Antukh
416e9e8e1d Merge remote-tracking branch 'origin/staging' into develop 2025-03-26 13:15:58 +01:00
Eva Marco
2918c57fb8 🐛 Show broken pills when all sets are disabled (#6161) 2025-03-26 13:13:45 +01:00
Eva Marco
f55e0bf6e3 🐛 Eva Fix context menu for viewer role (#6159) 2025-03-26 12:50:23 +01:00
Alonso Torres
83d41dba6f Serialization of grid layout data (#6148)
*  Add serializators for grid layout properties

*  Extract serializers for wasm api module
2025-03-26 12:10:31 +01:00
Pablo Alba
7284fb539f 🐛 Fix when editing a property name, the wrong property changes name (#6156) 2025-03-26 11:17:48 +01:00
andrés gonzález
3d16fa6f19 📚 Add Design Tokens documentation (#6026)
* 📚 Add Design Tokens documentation

* 📚 Update docs/user-guide/design-tokens/index.njk

Co-authored-by: Madalena Melo <madalena.melo@kaleidos.net>

* 📚 Update docs/user-guide/design-tokens/index.njk

Co-authored-by: Madalena Melo <madalena.melo@kaleidos.net>

* 📚 Update docs/user-guide/design-tokens/index.njk

Co-authored-by: Madalena Melo <madalena.melo@kaleidos.net>

* 📚 Update docs/user-guide/design-tokens/index.njk

Co-authored-by: Madalena Melo <madalena.melo@kaleidos.net>

* 📚 Update docs/user-guide/design-tokens/index.njk

Co-authored-by: Madalena Melo <madalena.melo@kaleidos.net>

* 📚 Changing several things after the PR review

---------

Co-authored-by: Madalena Melo <madalena.melo@kaleidos.net>
2025-03-26 10:51:17 +01:00
Yamila Moreno
c65c4270c3 Merge pull request #6128 from orhtej2/patch-1
📚 Add YunoHost as a self-hosting option
2025-03-26 10:17:51 +01:00
Andrey Antukh
0099c282b6 🐛 Fix tokens set reordering corner case 2025-03-26 09:06:54 +01:00
luisδμ
f932f3efb1 Filter variant by name on layers panel 2025-03-25 21:50:29 +01:00
Andrés Moya
9115e1a3a3 🐛 Fix resolved value when opening the token edit form 2025-03-25 17:12:04 +01:00
Aitor Moreno
60bc88a075 🐛 Fix tile cache exhaustion 2025-03-25 16:35:49 +01:00
ºelhombretecla
a7044c73ba 🐛 Fix libraries carrousel styles (#6140) 2025-03-25 15:51:34 +01:00
luisδμ
dc84ab3e41 🐛 Fix calculate zoom to avoid bubbles to get outside viewbox (#6138)
* 🐛 Fix calculate zoom to avoid bubbles to get outside vbox

* 📎 PR changes
2025-03-25 15:39:47 +01:00
Aitor Moreno
6eb686c06b ♻️ Refactor Custom Fonts allocations (#6146)
* ♻️ Refactor Custom Fonts allocations

* 💄 Remove commented code

---------

Co-authored-by: Belén Albeza <belen@hey.com>
2025-03-25 15:34:11 +01:00
Edgars Andersons
f587ed4ade 🌐 Add translations for: Latvian
Currently translated at 97.1% (1680 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2025-03-25 11:01:54 +00:00
Eva Marco
e81adb241b 🐛 Add underscore as posible name character (#6135) 2025-03-25 10:57:23 +01:00
Alejandro
065b50f5a2 🐛 Fix asynchronous content dependant rendering (#6142)
* 🐛 Fix custom fonts rendering

* 🐛 Fix asynchronous content dependant rendering

* 🎉 Renaming clear_cache to clear_drawing_cache
2025-03-25 09:49:47 +01:00
Marina López
a6133e9c48 🐛 Fix actions when workspace is visited first time (#6129)
* 🐛 Fix actions when workspace is visited first time

* 📎 Fix linter errors

* 🐛 Fix problem with integration test

* 📎 Fix linter errors

* 📎 Fix linter errors

---------

Co-authored-by: alonso.torres <alonso.torres@kaleidos.net>
2025-03-24 18:02:05 +01:00
Alejandro Alonso
85b24e1e8d 🎉 Disable antialias for small shapes 2025-03-24 16:27:43 +01:00
Eva Marco
7bc000517f 🐛 Fix modal position when colopicker is open (#6139) 2025-03-24 16:10:16 +01:00
Xavier Julian
95d9403790 Resize tokens panel on resize 2025-03-24 13:59:51 +01:00
Pablo Alba
9653e72e47 ♻️ Refactor variants
* ♻️ Refactor variants

*  Add MR changes
2025-03-24 13:15:02 +01:00
Alejandro Alonso
a80f114d66 🎉 Avoid rendering too small shapes 2025-03-24 11:49:38 +01:00
Alejandro Alonso
74ae4743d8 🐛 Disable svg viewport texts for wasm render 2025-03-24 11:06:14 +01:00
Andrey Antukh
d1d30e7eb5 Revert "📎 Add workaround for wasm production build failure"
This reverts commit f8a2291a55.
2025-03-24 10:48:22 +01:00
Andrey Antukh
e83be01475 Merge remote-tracking branch 'origin/staging' into develop 2025-03-24 10:42:14 +01:00
Alejandro
5d66eedcc7 Merge pull request #6134 from penpot/azazeln28-fix-render-wasm-build-env
🐛 Fix _build_env release EMCC_CFLAGS
2025-03-24 10:28:28 +01:00
Aitor Moreno
974d43cb08 🐛 Fix _build_env release EMCC_CFLAGS 2025-03-24 10:17:16 +01:00
Aitor Moreno
22efd6574d Merge pull request #6125 from penpot/alotor-perf-flex-layout-2
 Improvements on flex layout positioning
2025-03-24 09:53:30 +01:00
Nicola Bortoletto
bb5a103944 🌐 Add translations for: Italian
Currently translated at 99.8% (1728 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2025-03-23 19:01:53 +00:00
Rick Benetti
34b3520fb2 🌐 Add translations for: Portuguese (Brazil)
Currently translated at 70.9% (1228 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2025-03-23 19:01:52 +00:00
Stephan Paternotte
3217ba5a77 🌐 Add translations for: Dutch
Currently translated at 100.0% (1730 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2025-03-22 18:01:53 +01:00
Nicola Bortoletto
a91caded9e 🌐 Add translations for: Italian
Currently translated at 96.4% (1669 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2025-03-22 18:01:52 +01:00
Stephan Paternotte
05ba1c3e64 🌐 Add translations for: Dutch
Currently translated at 99.0% (1714 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2025-03-21 15:02:01 +00:00
Edgars Andersons
77f025eb8d 🌐 Add translations for: Latvian
Currently translated at 96.0% (1662 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2025-03-21 15:02:00 +00:00
Yaron Shahrabani
aacec1809b 🌐 Add translations for: Hebrew
Currently translated at 100.0% (1730 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2025-03-21 15:01:59 +00:00
Linerly
0435f560a4 🌐 Add translations for: Indonesian
Currently translated at 95.4% (1652 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2025-03-21 15:01:58 +00:00
Stas Haas
766f034e5e 🌐 Add translations for: German
Currently translated at 94.1% (1628 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2025-03-21 15:01:56 +00:00
Ally Tiago
8502d9d21b 🌐 Add translations for: Portuguese (Brazil)
Currently translated at 70.4% (1218 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2025-03-21 15:01:55 +00:00
Rick Benetti
6c874b2bb7 🌐 Add translations for: Portuguese (Brazil)
Currently translated at 70.4% (1218 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2025-03-21 15:01:55 +00:00
Andrey Antukh
f8a2291a55 📎 Add workaround for wasm production build failure 2025-03-21 14:07:02 +01:00
Andrey Antukh
8c302e314f Merge remote-tracking branch 'origin/staging' into develop 2025-03-21 11:17:26 +01:00
Eva Marco
752f74767e 🐛 Fix error copy (#6132) 2025-03-21 10:47:32 +01:00
Andrey Antukh
e5319e04c7 ♻️ Fix naming on token-set group move change operation 2025-03-21 10:23:27 +01:00
Andrey Antukh
e8e9037ef1 🐛 Fix inconsistencies on parsing tokens dtcg json 2025-03-21 10:23:27 +01:00
Andrey Antukh
c6bfae0d63 🐛 Normalize set names on importing themes dtcg json 2025-03-21 10:23:27 +01:00
alonso.torres
a830c27ceb Improvements on flex layout positioning 2025-03-21 10:18:34 +01:00
Andrey Antukh
93bf198073 🐛 Prevent theme replacement on ranaming 2025-03-21 09:22:16 +01:00
Alejandro
4c12af957c Merge pull request #6121 from penpot/superalex-tada-improve-tile-shapes-iteration-2
🎉 Improve tile shapes iteration
2025-03-21 07:30:52 +01:00
Alejandro Alonso
9ea3c54b92 🎉 Improve tile shapes iteration 2025-03-21 07:20:45 +01:00
orhtej2
4be8d77a79 📚 Update unofficial-options.md
Signed-off-by: Mateusz Szymański <2871798+orhtej2@users.noreply.github.com>
2025-03-20 23:59:30 +01:00
Aitor Moreno
4620764111 Merge pull request #6127 from penpot/superalex-fix-wasm-state-warning
🐛 Fix wasm state warning
2025-03-20 18:47:49 +01:00
Alejandro Alonso
ca86137d0f 🐛 Fix wasm state warning 2025-03-20 18:18:50 +01:00
Alejandro Alonso
b299a732c0 Merge remote-tracking branch 'origin/staging' into develop 2025-03-20 18:08:06 +01:00
Alejandro
9fb7456b38 Merge pull request #6111 from penpot/superalex-fix-pen-shortcut-multiple-times
🐛 Fix opening pen with shortcut multiple times breaks toolbar
2025-03-20 18:05:35 +01:00
Eva Marco
b3a3cca9fe 🐛 Fix stroke width validation (#6124) 2025-03-20 17:35:19 +01:00
andrés gonzález
f98009ec54 📚 Add Design Tokens to the Changelog (#6112) 2025-03-20 16:39:14 +01:00
Alejandro
7a4c9d9933 Merge pull request #6122 from penpot/elenatorro-10516-fix-inner-shadow-rendering
🐛 Fix Fill Inner Shadow rendering
2025-03-20 15:46:15 +01:00
Elena Torro
91d15ea221 🐛 Fix Fill Inner Shadows 2025-03-20 15:20:15 +01:00
Andrey Antukh
b043fec0d5 🌐 Validate and rehash translation files 2025-03-20 14:46:46 +01:00
Andrey Antukh
0bab46eb5c Merge remote-tracking branch 'weblate/develop' into develop 2025-03-20 14:45:42 +01:00
Andrey Antukh
82bff09373 🐛 Fix incorrect syntax on spanish translation file 2025-03-20 14:45:20 +01:00
Andrey Antukh
329b2d30d0 Revert "🌐 Sync, validate and rehash translations"
This reverts commit 37a8bf7bfc.
2025-03-20 14:44:57 +01:00
Anonymous
0d65b652d4 🌐 Add translations for: Swedish
Currently translated at 93.1% (1612 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/sv/
2025-03-20 14:42:44 +01:00
Anonymous
9d3c19e86a 🌐 Add translations for: Yoruba
Currently translated at 69.1% (1196 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/yo/
2025-03-20 14:42:43 +01:00
Anonymous
56a7800519 🌐 Add translations for: Hausa
Currently translated at 72.9% (1262 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ha/
2025-03-20 14:42:43 +01:00
Anonymous
ba0cebd713 🌐 Add translations for: Dutch
Currently translated at 94.0% (1627 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2025-03-20 14:42:43 +01:00
Anonymous
e28628d148 🌐 Add translations for: Latvian
Currently translated at 94.0% (1627 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2025-03-20 14:42:42 +01:00
Anonymous
40bc860dc6 🌐 Add translations for: Ukrainian (ukr_UA)
Currently translated at 93.9% (1626 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ukr_UA/
2025-03-20 14:42:42 +01:00
Anonymous
decf32fdd5 🌐 Add translations for: Croatian
Currently translated at 93.8% (1623 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/hr/
2025-03-20 14:42:42 +01:00
Anonymous
d9d6ee9922 🌐 Add translations for: Portuguese (Portugal)
Currently translated at 88.9% (1539 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2025-03-20 14:42:42 +01:00
Anonymous
903609a38f 🌐 Add translations for: Czech
Currently translated at 93.6% (1621 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/cs/
2025-03-20 14:42:41 +01:00
Anonymous
4504903b4c 🌐 Add translations for: Italian
Currently translated at 93.9% (1626 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2025-03-20 14:42:40 +01:00
Anonymous
4bf4972b6e 🌐 Add translations for: Chinese (Traditional Han script)
Currently translated at 93.9% (1626 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/
2025-03-20 14:42:40 +01:00
Anonymous
47e4b41dd2 🌐 Add translations for: Hebrew
Currently translated at 94.0% (1627 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2025-03-20 14:42:39 +01:00
Anonymous
af413ff1c0 🌐 Add translations for: Indonesian
Currently translated at 94.0% (1627 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2025-03-20 14:42:39 +01:00
Anonymous
5fcf0808c6 🌐 Add translations for: German
Currently translated at 94.0% (1627 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2025-03-20 14:42:39 +01:00
Anonymous
fb956b3aa1 🌐 Add translations for: Chinese (Simplified Han script)
Currently translated at 79.3% (1373 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2025-03-20 14:42:38 +01:00
Anonymous
93986af181 🌐 Add translations for: Russian
Currently translated at 83.5% (1446 of 1730 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2025-03-20 14:42:38 +01:00
Andrey Antukh
37a8bf7bfc 🌐 Sync, validate and rehash translations 2025-03-20 14:41:50 +01:00
Elena Torro
e60e36a0e2 🔧 Refactor RenderState scale calculation 2025-03-20 14:36:45 +01:00
Hosted Weblate
199e182399 🌐 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/
2025-03-20 14:31:52 +01:00
Andrey Antukh
a9f4b29f32 Merge remote-tracking branch 'weblate/develop' into develop 2025-03-20 14:31:09 +01:00
Andrey Antukh
22cd43b8a2 Merge remote-tracking branch 'origin/staging' into develop 2025-03-20 14:27:37 +01:00
Andrey Antukh
669533cae6 Merge pull request #6115 from penpot/niwinz-staging-tokens-1
🐛 Fix incorrect absolute frame positioning with measures sidebar
2025-03-20 13:20:08 +01:00
Andrey Antukh
d6efd469e4 🎉 Make the design tokens feature enabled by default 2025-03-20 12:22:37 +01:00
Andrey Antukh
0d4a6fc75f 🐛 Clear selected token set on leave file on workspace 2025-03-20 12:22:37 +01:00
Andrey Antukh
e403194bba 💄 Remove incorrect use of rx/concat on update-shape-position 2025-03-20 12:22:37 +01:00
Andrey Antukh
b8c5a10551 💄 Add minor cosmetic changes to measures menu 2025-03-20 12:22:37 +01:00
Andrey Antukh
7fdb0873db 🐛 Fix incorrect absolute frame positioning with measures sidebar 2025-03-20 12:22:37 +01:00
Alejandro
2d61644b05 Merge pull request #5914 from penpot/azazeln28-feat-tile-rendering
🎉 Tile rendering
2025-03-20 11:25:58 +01:00
Aitor Moreno
084816fb9f 🎉 Tile rendering system 2025-03-20 11:14:14 +01:00
Xavier Julian
68a89556d6 🐛 Add tooltip to empty sets button on theme creation modal 2025-03-20 10:18:28 +01:00
william chen
b5ea90f740 🌐 Add translations for: Chinese (Traditional Han script)
Currently translated at 100.0% (1646 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/
2025-03-20 10:02:52 +01:00
Alejandro Alonso
1a77c1fe36 🐛 Fix opening pen with shortcut multiple times breaks toolbar 2025-03-20 09:19:27 +01:00
Aitor Moreno
4aa1bb7246 Merge pull request #6116 from penpot/alotor-fix-group-constraints
🐛 Fix problem with constraints when creating group
2025-03-19 16:43:54 +01:00
alonso.torres
3a80120bf6 🐛 Fix problem with constraints when creating group 2025-03-19 16:33:50 +01:00
Aitor Moreno
d01eccf912 Merge pull request #6114 from penpot/alotor-fix-plugins-shapows
🐛 Fix problem with default shadows in plugins
2025-03-19 16:15:41 +01:00
alonso.torres
25621f8deb 🐛 Fix problem with default shadows in plugins 2025-03-19 14:51:39 +01:00
Yamila Moreno
dc006bd7f2 Merge pull request #6108 from penpot/yms-improve-self-host-documentation
📚 Improve self host documentation
2025-03-19 14:05:22 +01:00
Eva Marco
629f09089b 🐛 Fix tooltip with only one set and no active (#6107) 2025-03-19 13:54:00 +01:00
Andrey Antukh
e6839e4983 Merge pull request #6106 from penpot/palba--variants-inspect-header
 Add subtitle to inspect tab for components
2025-03-19 13:42:57 +01:00
Andrey Antukh
344ec94a3f Merge pull request #6109 from penpot/superalex-fix-hovering-dashboard-templates
🐛 FIx hovering dashboard templates
2025-03-19 13:42:04 +01:00
Andrey Antukh
62e89258e4 Merge pull request #6101 from penpot/niwinz-develop-token-fixes-4
 Add several improvements to tokens (part 4)
2025-03-19 13:38:46 +01:00
Andrey Antukh
b6bb93f0b6 Improve code convetion related to changes protocol
Partial work, still pending to make changes to other related
changes definitions
2025-03-19 12:52:03 +01:00
Andrey Antukh
39a1d5cc89 🐛 Fix set unexpected deletion on reordering 2025-03-19 12:42:05 +01:00
Andrey Antukh
8fa24de3d4 Merge pull request #6096 from penpot/niwinz-develop-token-fixes-3
 Add several improvements and fixes to tokens (part 3)
2025-03-19 12:30:05 +01:00
Alejandro Alonso
1def5015fb 🐛 FIx hovering dashboard templates 2025-03-19 12:27:13 +01:00
Yamila Moreno
1dbc924d31 📚 Remove docker installation in favour of the official documentation 2025-03-19 12:19:07 +01:00
Yamila Moreno
95da007107 📚 Add a warning about technical knowledge 2025-03-19 12:18:04 +01:00
Pablo Alba
82d3e466be Add subtitle to inspect tab for components 2025-03-19 10:34:19 +01:00
Alejandro
b0dacf6b11 Merge pull request #6105 from penpot/superalex-add-changelog-for-2.7.0
📎 Update changelog (add entry for 2.7.0)
2025-03-19 10:02:49 +01:00
Alejandro Alonso
64d090839d 📎 Update changelog (add entry for 2.7.0) 2025-03-19 09:51:22 +01:00
Alejandro Alonso
633a7eac4e Merge remote-tracking branch 'origin/staging' into develop 2025-03-19 09:47:32 +01:00
Alejandro
357fba5d2b 🐛 Fix selected team not saved (#6104) 2025-03-19 09:46:08 +01:00
Alejandro
b727f2fe1f Merge pull request #6077 from penpot/elenatorro-10516-fix-shadow-rendering
🐛 Fix drop shadows viewport clipping
2025-03-19 08:48:03 +01:00
Andrey Antukh
4453eec687 Persist migrated files on srepl process-file helper 2025-03-18 17:57:52 +01:00
Andrey Antukh
c169eef161 ♻️ Remove tokens lib migrations from file migrations 2025-03-18 17:57:52 +01:00
Eva Marco
17af55d3c8 🐛 Fix lost resolved value on tooltip (#6102) 2025-03-18 17:13:45 +01:00
Andrey Antukh
8df12e5e9c Remove state assignation round-trip on update-dimensions event
Using the lower-level apply-modifiers event, introduced in previous
commit
2025-03-18 16:19:55 +01:00
Andrey Antukh
cd423f23c6 Remove get-hidden-theme from tokens lib protocol 2025-03-18 16:19:55 +01:00
Andrey Antukh
86c2c4cd41 ♻️ Add lower-level impl of apply-modifiers event 2025-03-18 16:19:55 +01:00
Andrey Antukh
d9c4fc3721 Calculate uuid lazily on creating token theme 2025-03-18 16:19:55 +01:00
Andrey Antukh
b91e72d8a1 🐛 Fix typo 2025-03-18 16:19:55 +01:00
Andrey Antukh
6cc96ef679 Add logging for tokens update event operation 2025-03-18 16:19:55 +01:00
Andrey Antukh
28fe951c40 ♻️ Replace usage of dm/assert on several namespaces
And remove the `!` from the name on check functions
2025-03-18 16:19:55 +01:00
Andrey Antukh
22f789e77c Don't put timeout on tokens changes transaction 2025-03-18 16:19:55 +01:00
Eva Marco
2e5138eddc 🐛 Fix error message on invalid json (#6099) 2025-03-18 16:19:17 +01:00
Elena Torro
731c21f082 🐛 Fix drop shadows viewport clipping 2025-03-18 15:56:43 +01:00
Xavier Julian
99d7672284 Validate token name while typing 2025-03-18 14:14:16 +01:00
Andrés Moya
567fdd9619 🐛 Fix initial value of color bullet in form 2025-03-18 12:04:24 +01:00
Yamila Moreno
6067e438a3 📚 Document auto file snapshot (#6085) 2025-03-18 11:40:58 +01:00
Eva Marco
fc17a1742a 🐛 Fix copy on input placeholder (#6097) 2025-03-18 11:30:40 +01:00
al0cam
12d3994f45 🌐 Add translations for: Croatian
Currently translated at 99.6% (1641 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/hr/
2025-03-18 10:01:54 +00:00
Eva Marco
f7f1598e71 🐛 Fix select same set after rename (#6095) 2025-03-18 10:55:44 +01:00
Eva Marco
8caf559a1a 🐛 Fix resolved value on tooltip (#6084) 2025-03-18 10:54:43 +01:00
Elena Torró
e927161ec1 Merge pull request #6066 from penpot/elenatorro-10387-test-emoji-rendering
 Support emoji default font in text rendering
2025-03-18 10:50:20 +01:00
Elena Torro
ba387a892f Support emoji default font in text rendering 2025-03-18 10:33:27 +01:00
Alejandro Alonso
18015bde4f Merge remote-tracking branch 'origin/staging' into develop 2025-03-18 10:14:16 +01:00
Alejandro Alonso
8affefbbab 📎 Update changelog 2025-03-18 10:13:12 +01:00
jdo-odoo
0225919a45 📚 Fix typos in shortcut and insert image section
Signed-off-by: jdo-odoo <108932862+jdo-odoo@users.noreply.github.com>
2025-03-18 10:09:58 +01:00
Pablo Alba
0901807db8 Update inspect-title-bar and copy-button to the new components format 2025-03-18 09:52:32 +01:00
Pablo Alba
625cbfc50a 🎉 Add variants properties to inspect panel 2025-03-18 09:52:32 +01:00
Eva Marco
b2bc5aff68 🐛 Add lost spanish translation (#6089) 2025-03-18 09:25:35 +01:00
Eva Marco
337c61db2c 🐛 Fix not active sets on json import (#6087) 2025-03-18 09:14:30 +01:00
Andrey Antukh
5c2c96fc2e Merge pull request #6086 from penpot/niwinz-develop-token-fixes-2
 Several bugfixes related to tokens (part 2)
2025-03-17 15:50:33 +01:00
Andrey Antukh
04c77a8532 🔥 Remove unused double token resolve operation on sidebar 2025-03-17 14:56:55 +01:00
Andrey Antukh
ebcf5b3177 🐛 Avoid theme overwrite on creating a theme with existing name 2025-03-17 14:56:55 +01:00
Andrey Antukh
9d2117e2ac 📎 Replace use-callback with use-fn on token themes modal 2025-03-17 14:56:55 +01:00
Andrey Antukh
c1c22dc6c6 Merge pull request #6075 from penpot/niwinz-develop-token-fixes-1
 Add several fixes and improvements to tokens
2025-03-17 14:47:21 +01:00
Andrey Antukh
1e10e3818e 🔥 Remove not necessary API from tokens-lib: add-sets 2025-03-17 14:24:55 +01:00
Andrey Antukh
802c67ace4 🔥 Remove unused API from tokens-lib
Removes the protocol method: `get-set-prefixed-path-string`
2025-03-17 14:24:54 +01:00
Andrey Antukh
5c3709b5d8 🔥 Remove unused API from tokens-lib
Removes the protocol method: `get-tokens-tree`
2025-03-17 14:24:54 +01:00
Andrey Antukh
626c65df02 🔥 Remove unnecesary API from tokens lib
Removes the `get-dtcg-tokens-tree` protocol method
2025-03-17 14:24:54 +01:00
Andrey Antukh
f2f492bf3f 🔥 Remove commented code 2025-03-17 14:24:54 +01:00
Andrey Antukh
40f69d320e Show proper toast message on token-set rename error 2025-03-17 14:24:52 +01:00
Andrey Antukh
1893cd306a Improve translation strings for token set drop errors 2025-03-17 14:24:33 +01:00
Andrey Antukh
096b685e2c 🐛 Prevent token-set overwrite on creation and edition 2025-03-17 14:24:02 +01:00
Andrey Antukh
1965490bee 📎 Use proper catch matching on tokens drop operation 2025-03-17 14:24:02 +01:00
Andrey Antukh
559dcabf0e Normalize token name on creation 2025-03-17 14:24:02 +01:00
Andrey Antukh
a9e8d8f8f7 Make the calculate-move-token-set-or-set-group fn private 2025-03-17 14:24:02 +01:00
Alejandro Alonso
dba67eea91 Merge remote-tracking branch 'origin/staging' into develop 2025-03-17 12:52:56 +01:00
Andrey Antukh
70fe6fda83 🔥 Remove unused code 2025-03-17 12:27:20 +01:00
luisδμ
5155cf2b23 🐛 Fix clicking on a comment at the viewer's sidebar is not opening threads (#6083) 2025-03-17 12:25:23 +01:00
elhombretecla
5ca9b95cca 🎉 Adds tips to the file loading screen (#6063)
* 🎉 Add tips to the default loader component

* 📎 Use simplier approach for show tips

This commit also fixes other minor issues

* 📎 Extract to constants the loader path data

* 📎 Use properly tracked translations for loader tips

---------

Co-authored-by: Andrey Antukh <niwi@niwi.nz>
2025-03-17 12:24:44 +01:00
Alonso Torres
fa0da3a695 Flex layout modifiers wasm implementation
*  Flex layout modifiers wasm implementation

*  Flex auto modifiers propagation
2025-03-17 10:46:32 +01:00
Xavier Julian
fa9d8a9b15 Add a tooltip explanation on themes modal sets 2025-03-17 10:21:50 +01:00
Tummas Jóhan Sigvardsen
e3b6b24c5f 🌐 Add translations for: Faroese
Currently translated at 10.0% (165 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2025-03-17 00:01:53 +01:00
Louis Chance
1eb7205c12 🌐 Add translations for: French
Currently translated at 85.3% (1405 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2025-03-17 00:01:52 +01:00
al0cam
92f4bdae03 🌐 Add translations for: Croatian
Currently translated at 87.7% (1445 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/hr/
2025-03-14 22:02:57 +01:00
Vin
bd63a460eb 🌐 Add translations for: Russian
Currently translated at 88.0% (1450 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2025-03-14 22:02:56 +01:00
Andrey Antukh
7403f60366 Merge pull request #6076 from penpot/alotor-fix-problem-inspect
🐛 Fix problem with readonly and inspect
2025-03-14 15:50:01 +01:00
Alejandro Alonso
66295b0adf Merge remote-tracking branch 'origin/staging' into develop 2025-03-14 12:55:44 +01:00
Belén Albeza
eb6d2fb0eb 🎉 Store custom fonts (ttfs) and use them to write texts (wasm) (#6050) 2025-03-14 12:45:15 +01:00
Alejandro
a8c34ccc1a Merge pull request #6070 from penpot/alotor-bugfix-grid-layout
🐛 Fix problem with grid component propagation
2025-03-14 12:39:54 +01:00
alonso.torres
8c501db2fa 🐛 Fix problem with readonly and inspect 2025-03-14 12:24:34 +01:00
alonso.torres
d2fbb9dfa7 🐛 Fix problem with grid component propagation 2025-03-14 11:50:55 +01:00
Andrey Antukh
e4c9b736f7 Merge remote-tracking branch 'origin/staging' into develop 2025-03-14 11:19:47 +01:00
Andrey Antukh
f02f446015 Merge pull request #6071 from penpot/xaviju-10527-tooltip-import-warning
 Add a warning tooltip over import tokens button
2025-03-14 10:00:18 +01:00
Andrey Antukh
05d6d2fcd4 🐛 Fix several corner cases that causes race conditions on workspace and dashboard loading
* 🐛 Fix several race conditions on workspace and dashboard code

It also fixes a corner case that happens when penpot workspace
is loaded in a background tab on firefox.

* 🐛 Add missing team-id prop to several file returning endpoints
2025-03-14 09:55:41 +01:00
Andrey Antukh
d5492442fb Merge pull request #6068 from penpot/alotor-fix-readonly
🐛 Fix problem with readonly and inspect
2025-03-14 09:34:30 +01:00
al0cam
02e975f594 🌐 Add translations for: Croatian
Currently translated at 77.8% (1282 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/hr/
2025-03-13 17:02:00 +00:00
Andrey Antukh
61800d8945 Merge pull request #6074 from penpot/dfelinto-export-webp
🎉 Add support for WEBP format for shape export
2025-03-13 16:24:55 +01:00
Dalai Felinto
f450c9dbe3 🎉 Add support for WEBP format on shape export
It is very convenient to be able to export WEBP right from penpot.
Otherwise users have to first download to PNG then convert it locally.

---

Playwright only supports JPEG and PNG. So in order to support WEBP I had
to first generate a PNG and then convert it afterwards.

Signed-off-by: Dalai Felinto <dalai@blender.org>
2025-03-13 16:15:30 +01:00
Xavier Julian
b46574bef6 Add a warning tooltip over import tokens button 2025-03-13 13:26:41 +01:00
Andrey Antukh
e3b3fa3342 📎 Update changelog 2025-03-13 09:32:19 +01:00
Eva Marco
21b2c0c26a 🐛 Fix token unset when flex layout is applied 2025-03-12 20:03:50 +01:00
alonso.torres
dcbf54fae1 🐛 Fix problem with readonly and inspect 2025-03-12 16:39:31 +01:00
Eva Marco
2fe6fb28e4 🐛 Fix tooltip update when set changes (#6058) 2025-03-12 15:49:07 +01:00
luisδμ
86022a967c Replace overlapping bubbles with a bubble group (#6059) 2025-03-12 14:37:39 +01:00
Eva Marco
0efbebd94f 🎉 Avoid setting token to group shapes (#6055)
* 🎉 Avoid setting token to group shapes

* 📎 Fix on update shape when double click
2025-03-12 14:18:59 +01:00
Marina López
2aee2ea79e 📚 Add US in changes.md 2025-03-12 14:03:50 +01:00
elhombretecla
60a20b6984 Add new toggle and translations 2025-03-12 14:03:50 +01:00
elhombretecla
fd753fb262 💄 Add new css styles 2025-03-12 14:03:50 +01:00
elhombretecla
0ae57a017e Add new carrousel layout 2025-03-12 14:03:50 +01:00
Alejandro
88772a9ced Merge pull request #6061 from penpot/alotor-bug-fills
🐛 Fix problem adding fill
2025-03-12 12:31:43 +01:00
Alejandro Alonso
65647f4aae Merge remote-tracking branch 'origin/staging' into develop 2025-03-12 12:30:11 +01:00
Alejandro
fe04f3e45d Merge pull request #6065 from penpot/superalex-fix-sync-issues-components
🐛 Fix sync issues components
2025-03-12 12:27:25 +01:00
Alejandro Alonso
363c1d5b56 🐛 Fix sync libraries of components 2025-03-12 12:15:00 +01:00
alonso.torres
5e6ccc44fc 🐛 Fix problem adding fill 2025-03-12 10:22:04 +01:00
Andrei Fëdorov
b9df8ad038 ♻️ Simplifies RPC pattern for token themes (#6052)
* ♻️ Add set token theme method schema

* ♻️ Add `:set-token-theme` dispatcher for `process-change` multimenthod

* ♻️ Add `set-token-theme` to the changes builder

* ♻️ Use new method on the frontend

* ♻️ Remove unused token theme methods

* ♻️ Add tests

* ♻️ Add library data to changes

* ♻️ Add new test case

* ♻️ Remove unused binding
2025-03-12 09:29:03 +01:00
Yamila Moreno
3ee3df9b24 Merge pull request #6019 from penpot/yms-improve-troubleshooting-toc
📚 Improve TOC in Troubleshooting section
2025-03-11 16:30:03 +01:00
Yamila Moreno
332657bd1b 📎 Add minor improvements 2025-03-11 16:21:16 +01:00
Eva Marco
474cd1e55a 🐛 Fix migration keyword (#6057) 2025-03-11 16:19:51 +01:00
Andrei Fëdorov
b52e8bc87c ♻️ Simplifies RPC pattern for token sets (#6045)
* ♻️ Add set removal methods to tokens library

* ♻️ Add `set-token-set` method to changes

* ♻️ Add `set-token-set` to changes builder

* ♻️ Use new method in the token set creation

* ♻️ Use `set-token-set` in frontend events

* ♻️ Remove unused binding

* ♻️ Add tests

* ♻️ Remove old API methods

* ♻️ Remove unused parts of schema and multimethods

* ♻️ Make `:tokens` key optional in schema

* ♻️ Add `with-library-data` calls before `set-token-set`

* ♻️ Fix DOM properties error
2025-03-11 16:03:52 +01:00
Yamila Moreno
953f770fdd 📚 Improve TOC for self-hosting guide 2025-03-11 12:45:30 +01:00
Yamila Moreno
c83b9ea305 📚 Improve TOC in Troubleshooting section 2025-03-11 12:45:30 +01:00
Elena Torró
f35723e772 Merge pull request #6048 from penpot/elenatorro-10448-fix-clipping-over-groups
🐛 Fix children clip bounds inheritance
2025-03-11 12:06:40 +01:00
Pablo Alba
415d1a2668 Merge pull request #6032 from penpot/palba-variants-create-with-path
 Create variant from component with path
2025-03-11 11:40:31 +01:00
Alejandro Alonso
b3feb9bffd Merge remote-tracking branch 'origin/staging' into develop 2025-03-11 10:00:17 +01:00
Alejandro
3007aa19a2 Merge pull request #6046 from penpot/eva-fix-storybook-icons-list
🐛 Fix storybook icons list scroll
2025-03-11 09:59:42 +01:00
Eva Marco
e20adda766 🐛 Fix storybook icons list scroll 2025-03-11 09:43:35 +01:00
Denys Kisil
fdeabc15ab 🌐 Add translations for: Ukrainian (ukr_UA)
Currently translated at 99.6% (1641 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ukr_UA/
2025-03-11 09:02:04 +01:00
Alejandro
dfbf0d34b6 Merge pull request #6036 from penpot/elenatorro-10427-update-rust-last-version
🔧 Upgrade rust to v1.85
2025-03-11 08:40:33 +01:00
Eva Marco
0c3fd8a6d9 🎉 Add id to token theme (#6044)
* 🎉 Add id to token theme

* 📎 Fix tests

* 📎 Fixes from review
2025-03-10 18:38:52 +01:00
elenatorro
5b9dd96e02 🐛 Fix children clip bounds inheritance 2025-03-10 15:55:43 +01:00
Xavier Julian
46c89a1bcf Fix stories and add default state to toast 2025-03-10 14:43:41 +01:00
Xavier Julian
721760d679 Add a default appearance to context notifications 2025-03-10 14:43:41 +01:00
elenatorro
2cdb874484 🔧 Upgrade rust to v1.85 2025-03-10 13:33:12 +01:00
Andrés Moya
e5bccc470b Validate if token values are too large 2025-03-10 13:32:16 +01:00
Andrey Fedorov
ba768f8744 🐛 Fix Ci tests for shape proxy in plugin runtime 2025-03-10 13:29:10 +01:00
Andrey Fedorov
a33828467f ♻️ Rename bindings 2025-03-10 13:29:10 +01:00
Andrey Fedorov
6fed0f3b58 ♻️ Remove unused bidings and requirements 2025-03-10 13:29:10 +01:00
Andrey Fedorov
5f3599eaa7 🐛 Fix token dimension application for all relatively positioned shapes 2025-03-10 13:29:10 +01:00
Andrey Fedorov
44ca01aa27 🐛 Fix relative position application for flex children 2025-03-10 13:29:10 +01:00
Xavier Julian
451306f719 Add a maxlenght to input CRUD tokens 2025-03-10 13:25:07 +01:00
Elena Torró
29518f3ba5 Merge pull request #6042 from penpot/elenatorro-10436-fix-rounded-corners-for-images
🐛 Fix rounded corners in image fill
2025-03-10 12:49:50 +01:00
Elena Torró
d74bfd834d Merge pull request #6035 from penpot/elenatorro-10314-allow-mutable-static-only-on-state
🔧 Use with_state and with_current_state macros allowing static…
2025-03-10 12:42:47 +01:00
elenatorro
ac8b5a7bcc 🐛 Fix rounded corners in image fill 2025-03-10 12:16:41 +01:00
Denys Kisil
8363cb7449 🌐 Add translations for: Ukrainian (ukr_UA)
Currently translated at 99.6% (1641 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ukr_UA/
2025-03-09 19:02:05 +01:00
Xavier Julian
390cf6b642 Recalculate token context-menu submenu position 2025-03-07 19:14:07 +01:00
elenatorro
0dbf00a767 🔧 Use with_state and with_current_state macros allowing static_mut_refs only on STATE 2025-03-07 15:24:04 +01:00
Elena Torró
a361e0b990 Merge pull request #5992 from penpot/elenatorro-10314-use-mutex-for-static-mut
🔧 Do not use global static mut variables when possible
2025-03-07 15:20:05 +01:00
elenatorro
3a8ba4cbee 🔧 Avoid using global static mut variables when possible 2025-03-07 15:07:31 +01:00
Elena Torró
d5c9e68a3e 🔧 Update pull request GitHub template (#6022) 2025-03-07 14:45:29 +01:00
Alejandro
253d94c176 Merge pull request #6031 from penpot/fix-problem-flex-reverse
🐛 Fix problem with reverse config in flex
2025-03-07 14:08:25 +01:00
Pablo Alba
fd941e4701 🎉 Update package.json files 2025-03-07 13:59:20 +01:00
Pablo Alba
a99198de48 Filter variants on asset panel 2025-03-07 13:43:04 +01:00
Eva Marco
e729e85c42 ♻️ Create hidden theme on token lib creation (#5991)
* ♻️ Create hidden theme on token lib creation

* 📎 Fix tests

* 🎉 Add migration

* 🎉 Remove comment

* ♻️ Remove unused changes

* 📎 Remove unused fn
2025-03-07 13:17:36 +01:00
Pablo Alba
7eb9325047 Create variant from component with path 2025-03-07 09:54:38 +01:00
alonso.torres
ba4554da79 🐛 Fix problem with reverse config in flex 2025-03-07 09:23:07 +01:00
Alejandro
97fb1e00c2 Merge pull request #6028 from penpot/palba-fix-toolbar-tooltips
🐛 Fix hidden toolbar click event still available
2025-03-07 08:08:06 +01:00
Pablo Alba
3eb332f3d0 🐛 Fix hidden toolbar click event still available 2025-03-07 07:57:04 +01:00
Alejandro Alonso
0d11bafb57 Merge remote-tracking branch 'origin/staging' into develop 2025-03-07 07:54:05 +01:00
Alejandro
3d9fda7a21 Merge pull request #6025 from penpot/eva-fix-storybook-scroll
🐛 Fix scroll on storybook doc files
2025-03-07 07:52:30 +01:00
Alejandro
7a5dea5cfe Merge pull request #6023 from penpot/marina-consolidate-empty-workspace-board-tool
🎉 Consolidate when workspace empty, board tool selected
2025-03-07 07:49:27 +01:00
alonso.torres
e01dfd76e8 Merge remote-tracking branch 'origin/staging' into develop 2025-03-06 16:05:12 +01:00
alonso.torres
b47df2c230 🐛 Fix problem with components and grid layout 2025-03-06 15:43:55 +01:00
Marina López
b8b3cc641a 🎉 Consolidate when workspace empty, board tool selected 2025-03-06 13:31:12 +01:00
Alejandro
854145e435 Merge pull request #6024 from penpot/fix-resize-problem
🐛 Fix problem with new render resize
2025-03-06 12:33:09 +01:00
Eva Marco
09ff7372da 🐛 Fix scroll on storybook doc filesç 2025-03-06 12:29:48 +01:00
alonso.torres
707bfd4241 🐛 Fix problem with new render resize 2025-03-06 12:20:56 +01:00
Andrés Moya
02bc6e62e7 🔧 Use a more correct selector in one test 2025-03-06 10:36:10 +01:00
Andrés Moya
9fde4e2121 🐛 Unapply token when manually changing layout margin and padding 2025-03-06 10:07:59 +01:00
Elena Torró
66eb4fb5ad Merge pull request #6003 from penpot/superalex-update-rust-skia-version
 Update rust skia version to 0.81.0
2025-03-06 09:30:57 +01:00
Alejandro Alonso
e362f423c0 Merge remote-tracking branch 'origin/staging' into develop 2025-03-06 07:36:19 +01:00
Alejandro
f45fa95935 Merge pull request #6017 from penpot/alotor-bugfix
🐛 Fix problem with selection colors
2025-03-06 07:35:26 +01:00
Alejandro
dc08eb7899 Merge pull request #6014 from penpot/marina-plugins-list-lacks-scrolling
🐛 Add scroll to plugins menu list
2025-03-06 07:27:34 +01:00
Marina López
a1e307b4ce 🐛 Add scroll to plugins menu list 2025-03-06 07:26:36 +01:00
Alejandro
a0f16fc038 Merge pull request #6013 from penpot/palba-fix-duplicate-page
🐛 Fix duplicate page with component over frame
2025-03-06 07:25:54 +01:00
Pablo Alba
7c36c76b0d 🐛 Fix duplicate page with component over frame 2025-03-06 07:17:46 +01:00
Alejandro
8488be311e Merge pull request #6011 from penpot/palba-fix-cut-paste-copy
🐛 Fix cut and paste a copy inside its parent
2025-03-06 07:16:51 +01:00
Pablo Alba
2297862d81 🐛 Fix cut and paste a copy inside its parent 2025-03-06 07:08:37 +01:00
Alejandro
539fdfa016 Merge pull request #6010 from penpot/marina-dashboard-sidebar-horizontal-scroll
🐛 Hide horizontal scroll from dashboard sidebar
2025-03-06 07:07:58 +01:00
Marina López
a7f6797499 🐛 Hide horizontal scroll from dashboard sidebar 2025-03-06 07:00:14 +01:00
Alejandro
cc7f745a0a Merge pull request #5966 from penpot/alotor-bug-click-resize
🐛 Fix problem resizing on click
2025-03-06 06:56:45 +01:00
alonso.torres
265675795e 🐛 Fix problem resizing on click 2025-03-06 06:40:47 +01:00
Alejandro Alonso
2c789e48f3 Merge remote-tracking branch 'origin/staging' into develop 2025-03-05 17:07:23 +01:00
alonso.torres
ce02cbc3f1 🐛 Fix problem with selection colors 2025-03-05 14:34:08 +01:00
Alejandro Alonso
b386403fa8 🐛 Fix multiple nav events when open workspace 2025-03-05 12:09:05 +01:00
Alejandro Alonso
0a6e884584 🐛 Remove unnecesary console.log 2025-03-05 12:09:05 +01:00
Xavier Julian
9da6c50cbe Display tokens contextual menu in body through portal 2025-03-05 11:53:37 +01:00
Alejandro Alonso
5c53de8e76 Merge remote-tracking branch 'origin/staging' into develop 2025-03-05 11:00:19 +01:00
Alejandro
06f6a49bce Merge pull request #6008 from penpot/superalex-fix-multiple-nav-events-when-open-workspace
🐛 Fix multiple nav events when open workspace
2025-03-05 10:57:51 +01:00
Alejandro Alonso
afd309c62b 🐛 Fix multiple nav events when open workspace 2025-03-05 10:50:47 +01:00
Alejandro
3cdc826fca Merge pull request #6012 from penpot/hiru-integration-tests
📚 Add some more instructions on running integration tests
2025-03-05 10:48:21 +01:00
Andrés Moya
02292f99ab 📚 Add some more instructions on running integration tests 2025-03-05 10:30:39 +01:00
Xavier Julian
0279e75c4b 🐛 Fix unsetted custom property on notifications 2025-03-04 22:09:11 +01:00
Pablo Alba
44f1798dce 🐛 Fix add variant menu inside a variant 2025-03-04 17:34:04 +01:00
Alejandro Alonso
23468a9908 Update rust skia version to 0.81.0 2025-03-04 16:20:56 +01:00
Pablo Alba
8eb2aaa0a8 🎉 Create a new variant from an existing one 2025-03-04 13:52:40 +01:00
Belén Albeza
aa468e2153 🎉 Render plain text
* 🎉 Serialize text content (wasm)

* ♻️ Refactor functions in main to wasm module

* 🎉 Stub rendering of paragraph text (wasm)

* 📎 Clean up commented code
2025-03-04 11:54:52 +01:00
María Valderrama
9e5de82967 📚 Add mark all as read feature to CHANGES.md 2025-03-04 11:25:16 +01:00
Alonso Torres
856e2be1ca 🐛 Fix problem when creating layouts 2025-03-04 11:04:26 +01:00
elhombretecla
8d4b023d61 💄 Remove underline decoration 2025-03-03 17:12:19 +01:00
Nicola Bortoletto
da43a4d3b4 🌐 Add translations for: Italian
Currently translated at 99.6% (1641 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2025-03-03 16:04:07 +01:00
Andrés Moya
f06f11ad7a 🐛 Avoid crash when applying a token with no active value 2025-03-03 11:25:00 +01:00
Alejandro Alonso
c807e37525 Merge remote-tracking branch 'origin/staging' into develop 2025-03-03 07:16:31 +01:00
Alejandro Alonso
214a89e20d 📎 Update CHANGES.md file 2025-03-03 07:13:23 +01:00
Yamila Moreno
e64cf9f283 Merge pull request #5908 from penpot/yms-proxy-documentation
📚 Document how to use a proxy
2025-02-28 17:18:46 +01:00
Marina López
3a34c51e43 Add pricing page event 2025-02-28 13:04:15 +01:00
Andrey Antukh
c9a8d2bd23 🚧 Tokens (part4) (#5952)
*  Use reduce-kv for creating tokens tree

Instead of reduce

*  Avoid double iteration on spliting text shapes from shapes

On processing color changes

* ♻️ Move the undo transaction out of transform-fill

The undo transaction is a high level construct and it should
be called from the first level events. Low level impl should
not handle transactions at all

*  Use low-level primitives for update-fill token event

* 📎 Add performance logging for style dictionary resolution

* 📎 Replace inline code with a helper

* ♻️ Refactor how fill and stroke color is applied on tokens

* 💄 Fix call convention for component-item-thumbnail component

*  Clean component thumbnail when frame change received

* 📎 Fix tests

---------

Co-authored-by: Eva Marco <evamarcod@gmail.com>
2025-02-28 09:47:13 +01:00
Florian Schrödl
65c6c821e7 🐛 Fix set with spaces not being rename-able via context menu (#5956) 2025-02-28 09:46:52 +01:00
Yamila Moreno
0ff9c44246 🐳 Improve nginx resolvers (#5967) 2025-02-28 09:02:40 +01:00
Yamila Moreno
5bfab454f5 📚 Document how to use a proxy - caddy 2025-02-28 08:43:40 +01:00
Yamila Moreno
5ebde405ea 📚 Document how to use a proxy - nginx 2025-02-28 08:43:40 +01:00
Xavier Julian
6cccacaaab 💄 Improve context menu scanability 2025-02-27 22:45:06 +01:00
Elena Torró
7da97d69b0 🐛 Fix viewer style in fullscreen mode (#5964) 2025-02-27 17:57:05 +01:00
Belén Albeza
f7574009b5 🐛 Fix layout context menu width + position 2025-02-27 17:47:31 +01:00
Belén Albeza
0416e883ca 🐛 Fix rendering order of inner shadows when shape has no fills (wasm) 2025-02-27 17:45:39 +01:00
Alejandro Alonso
c0ccb86e3a Merge remote-tracking branch 'origin/staging' into develop 2025-02-27 15:34:39 +01:00
Alejandro
531b002a5c Merge pull request #5976 from penpot/hotfix-texts
🐛 Fix problems with empty position-data
2025-02-27 15:33:25 +01:00
alonso.torres
3eae3178a2 🐛 Fix problems with empty position-data 2025-02-27 14:31:49 +01:00
william chen
69d21e20c9 🌐 Add translations for: Chinese (Traditional Han script)
Currently translated at 100.0% (1646 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/
2025-02-27 04:02:34 +00:00
Alejandro Alonso
7885f413b8 Merge remote-tracking branch 'origin/staging' into develop 2025-02-26 18:00:51 +01:00
Eva Marco
dfd5c5b508 🐛 Fix height of combobox label (#5944) 2025-02-26 16:54:28 +01:00
Elena Torró
bffbccac50 Merge pull request #5968 from penpot/ladybenko-fix-sampling-options-merge
🐛 Fix messed up rebase re: sampling options
2025-02-26 15:32:26 +01:00
Belén Albeza
12c2d73846 🐛 Fix messed up rebase re: sampling options 2025-02-26 15:18:26 +01:00
luisδμ
2cf3e37b7a 🐛 Fix comment update fails in viewer (#5958)
* 🐛 Fix comment update fails in viewer

* 🐛 Reload team members in workspace but not in viewer
2025-02-26 14:29:51 +01:00
Elena Torró
27d15763f8 🐛 Override default SamplingOptions for ImageFill and set FilterMode (#5961)
* 🐛 Override default SamplingOptions for ImageFill and set FilterMode and MipmapMode to 'Linear' instead of 'Nearest'

* 📎 Use sampling_options from render_state in ImageFill
2025-02-26 14:27:25 +01:00
Alejandro
0eaa43f36b Merge pull request #5930 from penpot/ladybenko-10321-split-fill-strokes
 Split rendering of fills and strokes in separate surfaces
2025-02-26 11:57:37 +01:00
luisδμ
e0b9751b16 Merge pull request #5947 from penpot/luis-fix-design-panel-draft-comment-open
🐛 Fix design panel does not reappear if comment draft is open
2025-02-26 11:33:06 +01:00
Elena Torró
e30834bb2d Enable WEBGL_debug_renderer_info extension before initializing the render (#5959) 2025-02-26 11:32:27 +01:00
Juanfran
fefb946a25 Merge pull request #5951 from penpot/juanfran-expand-padding-margin-apply-token
🐛 Expand padding/margin values on apply token and show 'Mixed' placeholder
2025-02-26 11:15:33 +01:00
Juanfran
2d857ecf2f 🐛 Expand padding/margin values on apply token and show 'Mixed' placeholder 2025-02-26 10:57:51 +01:00
Belén Albeza
2cf179ccf6 ♻️ Add ShapeStrokes surface 2025-02-26 09:51:30 +01:00
Belén Albeza
5ebfc603e6 ♻️ Refactor surfaces (wasm) 2025-02-26 09:50:17 +01:00
Alejandro
ccea9b1564 Merge pull request #5962 from penpot/elenatorro-9339-fix-typo-libraries-es
🐛 Fix typo at libraries modal
2025-02-26 09:32:23 +01:00
luisδμ
5fcf889d3c Merge pull request #5960 from penpot/luis-fix-avoid-post-blank-comment
🐛 Fix avoid enabling post button if blank comment
2025-02-26 09:28:59 +01:00
luisδμ
7247db14b2 Merge pull request #5957 from penpot/luis-fix-mention-users-in-viewer
🐛 Fix mention users in viewer
2025-02-26 09:28:29 +01:00
elenatorro
658e5dce22 🐛 Fix ES typo in libraries modal 2025-02-26 09:22:45 +01:00
Elena Torró
f27cbfa0ec Merge pull request #5953 from penpot/marina-fix-typo-libraries
🐛 Fix typo at libraries modal
2025-02-26 09:12:21 +01:00
william chen
a925d6710a 🌐 Add translations for: Chinese (Traditional Han script)
Currently translated at 88.2% (1453 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/
2025-02-26 03:05:58 +00:00
Luis de Dios
5754c393b9 🐛 Fix avoid enabling post button if blank comment 2025-02-25 18:09:22 +01:00
Luis de Dios
c618efc29e 🐛 Fix mention users in viewer 2025-02-25 15:43:29 +01:00
alonso.torres
80d5272248 Serialize layout data 2025-02-25 15:43:12 +01:00
Andrey Antukh
b4f6177be7 🐛 Move team srepl helpers back to main from helpers (#5955) 2025-02-25 14:56:58 +01:00
Andrés Moya
3907a1783a Include active sets and themes in exported tokens json file (#5806)
*  Add active sets to json decode

* 📎 Fix tests

* 📎 Add encode tests

* 📎 Add decode test

---------

Co-authored-by: Eva Marco <evamarcod@gmail.com>
2025-02-25 14:05:07 +01:00
Marina López
3685f7b32b 🐛 Fix typo at libraries modal 2025-02-25 13:41:26 +01:00
andrés gonzález
06b5304926 📚 New section for Your account (#5941)
* 📚 New section for Your account

* Update docs/user-guide/the-interface/index.njk

Co-authored-by: Madalena Melo <madalena.melo@kaleidos.net>

* Update docs/user-guide/the-interface/index.njk

Co-authored-by: Madalena Melo <madalena.melo@kaleidos.net>

* Update docs/user-guide/the-interface/index.njk

Co-authored-by: Madalena Melo <madalena.melo@kaleidos.net>

---------

Co-authored-by: Madalena Melo <madalena.melo@kaleidos.net>
2025-02-25 13:05:49 +01:00
Andrey Antukh
b676ea7127 Merge remote-tracking branch 'origin/staging' into develop 2025-02-25 12:56:05 +01:00
Xavier Julian
ca65f5ad9a 💄 Improve theme modal with UX enhancements 2025-02-25 12:52:12 +01:00
Elena Torró
3e89b73ca0 📚 Add developer docs about how to test feature flags by team (#5949) 2025-02-25 12:51:00 +01:00
Marina López
8f06fa1026 🎉 Add AB test descriptive board tooltip (#5936)
* 🎉 Add AB test descriptive board tooltip

* 📎 Add changes from feedback
2025-02-25 12:50:16 +01:00
Andrey Antukh
a549d783ba Downgrade s3 sdk for compatibility with minio (#5946)
* 📚 Add `⬇️` emoji to the contributing guide

For cases where we need to downgrade dependencies

*  Downgrade S3 SDK version

Mainly for minio and other S3-compatible services
2025-02-25 12:49:33 +01:00
Alejandro
17e9e836f6 Merge pull request #5950 from penpot/alotor-fix-gradient-strokes
🐛 Fix problem with gradient in strokes
2025-02-25 11:43:49 +01:00
alonso.torres
c48d862d0f 🐛 Fix problem with gradient in strokes 2025-02-25 11:29:57 +01:00
alonso.torres
052282cff9 🐛 Fix problem updating layout when duplicating component 2025-02-25 11:21:41 +01:00
Luis de Dios
91efcd17a2 🐛 Fix design panel does not reappear if comment draft is open 2025-02-25 10:30:11 +01:00
Pablo Alba
6d40166de7 Remove menu options and shortcuts actions over variants 2025-02-25 10:11:14 +01:00
Elena Torró
ab7781b4fa Add dbg panel to enable a team feature flag (#5940)
*  Add dbg panel to enable and disable team feature flags

* 📎 Rename debug to skip-check and do not parse & cast the feature value
2025-02-25 10:09:43 +01:00
Andrey Antukh
6c1e8c3fe8 ⬆️ Update deps (fix compat issues with minio) 2025-02-25 09:39:13 +01:00
luisδμ
7f9a9ad774 🐛 Fix visual glitches in the comment dropdown at the dashboard (#5938) 2025-02-25 09:17:42 +01:00
luisδμ
2219d91e4d 🐛 Fix all comments appear in every page (#5943) 2025-02-25 09:16:46 +01:00
Yamila Moreno
fac2314d62 🔧 Relax secure cookies requirement when non-https public uri is set (#5939) 2025-02-25 09:10:53 +01:00
Andy Li
f5218e207b 🌐 Add translations for: Chinese (Traditional Han script)
Currently translated at 66.1% (1089 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/
2025-02-25 03:04:17 +01:00
william chen
7fb6a095c6 🌐 Add translations for: Chinese (Traditional Han script)
Currently translated at 66.1% (1089 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/
2025-02-25 03:04:16 +01:00
Eva Marco
88669d2e0f 🎉 Add translations to token errors (#5926) 2025-02-24 15:50:47 +01:00
Andrey Antukh
1187d64f69 Merge remote-tracking branch 'origin/staging' into develop 2025-02-24 12:49:04 +01:00
Yamila Moreno
aac61ff229 📚 Document how to troubleshoot Penpot (#5937) 2025-02-24 12:07:47 +01:00
Andrey Antukh
3074fc9ab5 ♻️ Remove deprecated with-atomic and refactor tx-run! (#5915)
* ♻️ Remove deprecated with-atomic and refactor tx-run!

*  Do not hold open connection for the whole clone-template operation
2025-02-24 11:15:44 +01:00
Andrey Antukh
15d09eb0d4 🐛 Fix incorrect data id assignation on creating a snapshot (#5934)
* 📎 Set proper name to relink-refs mechanism function

* 🐛 Fix incorrect id assignation on snapshot file resolution

* ♻️ Use uniform api for file retrieval on file snapshot code
2025-02-24 11:05:16 +01:00
Alejandro
786383c25d Merge pull request #5935 from penpot/niwinz-viewer-bugfix
🐛 Fix incorrect data returned on viewer subapp bundle
2025-02-24 10:41:17 +01:00
elhombretecla
662c3c64a9 Fix 2.5 slides wording (#5925) 2025-02-24 09:39:43 +01:00
Juanfran
9084c184e7 🐛 Filter out recent fonts from search results (#5927) 2025-02-24 09:12:12 +01:00
Elena Torró
bcea19001e Improve readability of RGBA and HSLA values in inspect mode (#5918)
*  Improve readability of RGBA and HSLA values in inspect mode

* 📎 Remove reader conditionals for format common methods
2025-02-24 09:08:42 +01:00
Andrey Antukh
ae718c3328 🐛 Fix incorrect data returned on viewer subapp bundle 2025-02-24 09:03:57 +01:00
Marina López
702bd41047 🐛 Fix error when getting file from libs 2025-02-24 08:26:27 +01:00
Aitor Moreno
9896275fa8 Merge pull request #5932 from penpot/niwinz-objects-gc-bugfix
 Remove automatic cascade on file_change table fk constraint
2025-02-21 14:32:24 +01:00
Andrey Antukh
d2c800fc0f 🐛 Add missing handling of file_change on delete-object task 2025-02-21 14:24:18 +01:00
Andrey Antukh
893f19fa5e Remove automatic cascade on file_change table fk constraint 2025-02-21 14:24:07 +01:00
Andrey Antukh
624750ad16 🐛 Fix incorrect order of execution of internal procs on objects-gc (#5929)
*  Improve efficiency on objects-gc tasks

Replacing db/cursor with db/plan

* 🐛 Use correct order of subprocs on objects-gc

Mainly affects the file deletion

* 📎 Increase chunk-size to 100 on objects-gc
2025-02-21 13:01:20 +01:00
Andrés Moya
1c98c53805 🔧 Add filtering to logs in component sync algorithm 2025-02-21 11:30:02 +01:00
Aitor Moreno
4799f6fe0a ♻️ Refactor rendering surfaces (#5921) 2025-02-21 11:04:12 +01:00
Andrey Antukh
24cb1728b0 🐛 Fix context menu event handling issues (#5917)
* 💄 Change call convention for dashboard grid component

* 🎉 Add helper component for easy portal to document

* 🐛 Fix context menu event handling issues

With this commit, the behavior of context menu and scroll is changed
to: close menu on scroll instead of disabling all pointer events while
menu is open. The previous behavior causes a second event of context
menu open a native browser context menu instead of penpot menu.
2025-02-21 07:57:56 +01:00
Alejandro
7470fb709f Merge pull request #5920 from penpot/alotor-test-apply-modifiers
 Modify shapes geometry instead of transformation matrix
2025-02-21 07:44:32 +01:00
alonso.torres
8c1e18b1cd 🐛 Fix problem with images 2025-02-20 17:57:36 +01:00
alonso.torres
9143187efd Modify shapes geometry instead of transformation matrix 2025-02-20 17:39:17 +01:00
Eva Marco
dda9f62504 🐛 Fix menu shadow color 2025-02-20 17:23:28 +01:00
Aitor Moreno
b661f39422 ♻️ Refactor render shape (#5916) 2025-02-20 16:33:18 +01:00
Aitor Moreno
3a764a9da6 Merge pull request #5919 from penpot/alotor-constraints-2
🐛 Fix problems with constraints resizing
2025-02-20 16:26:46 +01:00
alonso.torres
2341dfb95d 🐛 Fix problems with constraints resizing 2025-02-20 14:20:01 +01:00
Xavier Julian
ff121d2af5 💄 Differentiate empty and not empty token types 2025-02-20 14:12:51 +01:00
Xavier Julian
55d7bab0e6 💄 Spacing on token sets 2025-02-20 13:31:18 +01:00
Juanfran
4a3d951329 Merge pull request #5888 from penpot/juanfran-fix-flaky-add-new-test
 Add more integration tests for tokens
2025-02-20 10:10:00 +01:00
Pablo Alba
014c297458 🎉 Add drag components in or out a variant container 2025-02-20 10:05:01 +01:00
Juanfran
280da72e63 Add more integration tests for tokens 2025-02-20 09:57:31 +01:00
Alejandro Alonso
6277db8d45 🐛 Fix clip for frames with border radius (render wasm) 2025-02-20 09:24:55 +01:00
Andrey Antukh
479f39338b 🐛 Don't send invitation email to profiles that explicitly disallow that
* 🐛 Don't send invitation email to profiles that explicitly disallow that

* 📎 Add changes post feedback

* 📎 Fix typo on changelog
2025-02-20 09:20:28 +01:00
Andrey Antukh
60530a80d9 Merge remote-tracking branch 'origin/staging' into develop 2025-02-20 09:15:00 +01:00
Alejandro
befa5f4c7f Merge pull request #5906 from penpot/niwinz-libraries-fix
🐛 Fix incorrect libraries filtering on workspace
2025-02-20 07:40:24 +01:00
Andrey Antukh
6e92e3b765 🐛 Fix inconsistency on naming
This also a fix of passing incorrect prop :shared-libs
to a component that already expectes :libraries.

It also removes unnecesary use of refs/libraries ref
2025-02-20 07:32:11 +01:00
Andrey Antukh
0e73de17ec 🐛 Fix incorrect libraries filtering on workspace 2025-02-20 07:32:10 +01:00
Alejandro
2dcf692853 Merge pull request #5911 from penpot/niwinz-notifications-post-save-refresh
🐛 Fix incorrect notification assignation after update operation
2025-02-20 07:06:49 +01:00
Alejandro
66f2e0aa5e Merge pull request #5912 from penpot/niwinz-binfile-v3-fixes
🐛 Add proper feature handling for binfile imports
2025-02-20 07:03:59 +01:00
Andrey Antukh
dd6ae81e83 🐛 Add correct feature handling on dbg binfile import 2025-02-19 22:47:55 +01:00
Andrey Antukh
cb8e31e7f8 🐛 Add correct handling of features on clone-template 2025-02-19 22:47:54 +01:00
Andrey Antukh
ca9b5b1b8a 📎 Use standard asserts on binfile common ns 2025-02-19 22:47:54 +01:00
Andrey Antukh
a391d71b60 🐛 Add correct feature handling on binfile import 2025-02-19 22:47:40 +01:00
Andrey Antukh
7d0c19fcc7 🐛 Add correct feature check on manifest reading
Instead on the file save operation so we can raise
exception if something does not match without processing
the whole file
2025-02-19 22:45:08 +01:00
Andrey Antukh
e4ee585704 🐛 Fix incorrect notification assignation after update operation 2025-02-19 17:21:52 +01:00
Andrey Antukh
d79fac7729 Merge remote-tracking branch 'origin/staging' into develop 2025-02-19 17:17:54 +01:00
Marina López
5f61254a75 🐛 Fix library button condition and copy (#5889)
* 🐛 Fix library button condition and copy

* 📎 Add changes from feedback

* 📎 Add changes from feedback
2025-02-19 16:52:35 +01:00
Pablo Alba
195127b099 Add text selection on focus of an input-with-values (#5909) 2025-02-19 16:51:49 +01:00
luisδμ
0784d6b62a 🐛 Fix reposition comment bubbles under viewer role (#5905) 2025-02-19 16:47:53 +01:00
María Valderrama
a3e74c55f1 💄 Add cosmetic changes to notifications buttons (#5902) 2025-02-19 16:45:22 +01:00
Alejandro
7a7fa44f6b 🐛 Fix click prototype flow (#5896) 2025-02-19 16:00:17 +01:00
Juanfran
e408bc9113 Merge pull request #5904 from penpot/juanfran-themes-dropdown-scrollbar-styles
🐛 Fix scrollbar styles in themes dropdown
2025-02-19 15:22:19 +01:00
Yamila Moreno
4b5d304a40 📚 Improve technical guide
* 📚 Improve technical guide

* 📚 Improve technical guide

* 📚 Improve technical guide

* 📚 Improve technical guide

* 📚 Improve technical guide

* 📚 Improve technical guide

* 📚 Improve technical guide

* 📚 Improve technical guide

* 📚 Improve technical guide

* 📚 Improve technical guide
2025-02-19 14:35:40 +01:00
Juanfran
89dc917cb9 🐛 Fix scrollbar styles in themes dropdown 2025-02-19 14:25:43 +01:00
alonso.torres
e7b9ae6415 🐛 Remove fit content shortcut 2025-02-19 13:02:53 +01:00
Elena Torró
f83cdf2f5d 📎 Remove invalid aria label on div (#5898) 2025-02-19 11:42:44 +01:00
luisδμ
4ac52c138c Merge pull request #5895 from penpot/niwinz-bugfix-comments
🐛 Fix unexpected exception on clicking empty area on creating comment
2025-02-19 11:29:21 +01:00
Elena Torró
f3040fc10d 🐛 Pass color format to css formatter (#5890)
* 🐛 Pass color format to css formatter

* 📎 Use get method to retrieve format

* 📎 Add UI test to check background color is correctly copied to clipboard when changing the format
2025-02-19 11:23:52 +01:00
Andrey Antukh
4744085426 🐛 Fix incorrect handling request access with deleted profiles
* 📎 Add minor improvements to team tests

* 🐛 Fix incorrect handling request access with deleted profiles

* 🐛 Fix redirect loop on empty route

Happens when the current profile is deleted from team

* 🐛 Fix urls on request access emails

* 📎 Revert url changes on emails
2025-02-19 11:04:19 +01:00
Andrey Antukh
44acd79081 Merge remote-tracking branch 'origin/staging' into develop 2025-02-19 10:46:55 +01:00
Andrey Antukh
a3e4da0b3d 📎 Update changelog 2025-02-19 10:46:33 +01:00
Elena Torró
73a52e5395 🐛 Fix opacity in frame containers (#5858)
* 🐛 Fix opacity in frame containers

* 📎 Improve readability of frame containers by using class names
2025-02-19 10:44:24 +01:00
Alonso Torres
6cb1aa24cd Add constraints calculation on WASM (#5894)
*  Add constraints calculation on WASM

*  Fix after review
2025-02-19 10:40:04 +01:00
Alejandro
19bae05f41 Merge pull request #5884 from penpot/niwinz-bugfix-4
🐛 Fix update-libraries dialog disappear when clicking outside
2025-02-19 07:53:35 +01:00
Alejandro
02f78d80d7 Merge pull request #5883 from penpot/niwinz-bugfix-3
🐛 Fix incorrect navigation on show-main-component menu option
2025-02-19 07:42:02 +01:00
Alejandro
51202df105 Merge pull request #5885 from penpot/niwinz-bugfix-5
🐛 Fix regression on request-access dialog
2025-02-19 07:15:30 +01:00
Andrey Antukh
cd1eefb214 Add safety checks for node on comment-input* component 2025-02-18 18:33:02 +01:00
Andrey Antukh
869a412c74 🐛 Fix unexpected exception on clicking empty area on creating comment 2025-02-18 18:19:08 +01:00
Andrey Antukh
f5c913d26e Merge remote-tracking branch 'origin/staging' into develop 2025-02-18 17:28:38 +01:00
luisδμ
d019afe667 🐛 Fix incorrect number of replies in comments (#5893) 2025-02-18 17:25:43 +01:00
Andrey Antukh
c41aa56a60 Merge pull request #5869 from penpot/marina-empty-workspace-create-board-tool-default
🎉 Add AB test for empty workspace set board tool by default
2025-02-18 17:24:52 +01:00
Andrey Antukh
7d840722c4 Add abstraction for page emptiness checking 2025-02-18 16:59:00 +01:00
Marina López
272bbdd54a 🎉 Add AB test for empty workspace set board tool by default 2025-02-18 16:57:59 +01:00
Andrey Antukh
fe3fec7a50 🐛 Fix workspace hot reload race condtion
This reverts commit 8139ee3ef9.
2025-02-18 16:49:50 +01:00
Andrey Antukh
c86f14e75d 🐛 Fix color slider not updating the hue of the ramp (#5891)
* 🐛 Fix color slider not updating the hue

*  Add minor enhancements for ramp* component

---------

Co-authored-by: Andrey Fedorov <oran9e.red@gmail.com>
2025-02-18 16:42:11 +01:00
Pablo Alba
65a97167de 🐛 Fix bad value on combobox enter keydown (#5859) 2025-02-18 15:55:22 +01:00
Xavier Julian
0530c57d31 Add placeholder to themes modal 2025-02-18 14:51:33 +01:00
Andrey Antukh
63524dce8d 🐛 Fix regression on request-access dialog 2025-02-18 12:37:04 +01:00
Yamila Moreno
807b8d82e3 🔧 Improve flags documentation (#5863)
* 📎 Fix typo

* 🔧 Enable certain flags by default

* 🔧 Compile all flags in a single source of truth

* 📎 Move all default flags to common

---------

Co-authored-by: Andrey Antukh <niwi@niwi.nz>
2025-02-18 12:36:16 +01:00
Andrey Antukh
3f45863823 🐛 Fix update-libraries dialog disappear when clicking outside 2025-02-18 12:04:10 +01:00
Andrey Antukh
f9f5f0af7d ♻️ Refactor code style on actionable ds component 2025-02-18 12:04:09 +01:00
Andrey Antukh
f98dbef228 Simplify code and use lookup helpers 2025-02-18 12:04:09 +01:00
Andrey Antukh
713d6a31df Add better way to delay a stream for library notification 2025-02-18 12:04:09 +01:00
Andrey Antukh
77f906ae37 Improve notification show params validation assertion 2025-02-18 12:04:09 +01:00
María Valderrama
6a5538bb15 🐛 Fix unreachable Save color style button (#5879)
* 🐛 Fix unreachable Save color style button

* 📎 Fix unreachable Save color style button code review
2025-02-18 11:32:00 +01:00
Andrey Antukh
0ce99968b3 🐛 Fix incorrect navigation on show-main-component menu option 2025-02-18 10:53:32 +01:00
Andrey Antukh
adbe29e3d1 Merge remote-tracking branch 'origin/staging' into develop 2025-02-18 10:25:13 +01:00
Alejandro
5fae07af11 Merge pull request #5880 from penpot/alotor-render-wasm-cache
🐛 Fix problem with cache
2025-02-18 10:20:31 +01:00
Alonso Torres
0900b7a572 🐛 Fix problem with grid layout duplicate positioning (#5877) 2025-02-18 10:17:42 +01:00
alonso.torres
400e5f60f2 🐛 Fix problem with cache 2025-02-18 10:00:57 +01:00
Andrey Antukh
3412a0a18a Merge pull request #5868 from penpot/niwinz-terms-link-fix
🐛 Set correct default for terms link on fonts hero
2025-02-18 09:55:52 +01:00
Pablo Alba
3268225941 🎉 Add variations POC 2025-02-17 16:47:25 +01:00
Eva Marco
5e3b47e455 🎉 Add integration test for bug (#5875) 2025-02-17 16:29:28 +01:00
Xaviju
91fa39705d ♻️ Switch contextual notification component (#5874) 2025-02-17 16:03:13 +01:00
Andrey Antukh
83423a9509 Merge pull request #5864 from penpot/eva-fix-colorpicker-dnd
🐛 Fix add recent color while drag and drop
2025-02-17 15:22:49 +01:00
Andrey Antukh
c41f86f0a4 Merge remote-tracking branch 'origin/staging' into develop 2025-02-17 15:20:33 +01:00
Alonso Torres
ccabaf4552 🐛 Fix style problem with update lib notifications (#5871) 2025-02-17 13:31:29 +01:00
Alonso Torres
ad15ac6c1e 🐛 Fix several problems with navigation in viewer (#5872) 2025-02-17 13:24:15 +01:00
luisδμ
a9340709c8 🐛 Fix open comment in workspace from dashboard notification (#5865) 2025-02-17 12:29:19 +01:00
Alonso Torres
faa3451da9 🐛 Fix problem with board name input style (#5870) 2025-02-17 12:26:04 +01:00
Alonso Torres
0aa95ea058 🐛 Fix problem with copy/paste props (#5867) 2025-02-17 12:25:42 +01:00
Eva Marco
81b741478a 🐛 Fix a little regression on sidebar resize (#5866) 2025-02-17 12:25:07 +01:00
Andrey Antukh
66182152cb 🐛 Set correct default for terms link 2025-02-17 11:51:21 +01:00
Andrey Antukh
b9629b7be6 🔥 Remove unused default flags on frontend 2025-02-17 11:23:46 +01:00
Eva Marco
6c9875e4f9 🐛 Fix add recent color while drag and drop 2025-02-17 10:20:40 +01:00
Juanfran
f6fc2f8808 🐛 Prevent themes dropdown overflow hidden in set sidebar (#5850) 2025-02-17 09:51:10 +01:00
Edgars Andersons
6a0bb2f452 🌐 Add translations for: Latvian
Currently translated at 99.6% (1641 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2025-02-14 16:01:57 +01:00
Amerey.eu
d02f85315a 🌐 Add translations for: Czech
Currently translated at 99.3% (1635 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/cs/
2025-02-14 16:01:56 +01:00
Andrey Antukh
f90c63b5f0 Merge pull request #5834 from penpot/juan-slides-2.5
🎉 Add slides for 2.5 release
2025-02-14 15:52:57 +01:00
Elhombretecla
680e611266 🎉 Add slides for 2.5 version 2025-02-14 15:41:27 +01:00
Andrey Fedorov
aa180e9f3f 🐛 Fix max- min- width height not being applied 2025-02-14 15:26:49 +01:00
Belén Albeza
cad7d75590 🐛 Fix libraries context menu (#5854)
*  Add integration test for Bug #10421

* 🐛 Fix dashboard library item menu

*  Fixup integration test
2025-02-14 14:34:54 +01:00
luisδμ
8c81d48858 Merge pull request #5844 from penpot/luis-refactor-zero-width-space
♻️ Use constant for zero width space
2025-02-14 14:06:28 +01:00
Florian Schroedl
6b773d6b74 🐛 Dont allow hex values without # prefix 2025-02-14 13:52:54 +01:00
Belén Albeza
6cbaacf1e0 🎉 Implement inner shadows (wasm) (#5767)
* 🎉 Implement inner shadows (wasm)

* 🐛 Fix reset canvas problem

---------

Co-authored-by: alonso.torres <alonso.torres@kaleidos.net>
2025-02-14 13:46:30 +01:00
Eva Marco
2ffb77cb4d Merge pull request #5840 from penpot/niwinz-tokens-changes-3
♻️ Token changes (part 3)
2025-02-14 12:55:12 +01:00
Eva Marco
a7ed5228d3 🐛 Fix lost translation strings (#5846)
* 🐛 Fix lost translation strings

* 🐛 Fix form error management internal issues and inconsistencies

* 📎 Add better validation conditons for ::sm/text schema

* 🐛 Add better touched detection mechanism for input and textarea

---------

Co-authored-by: Andrey Antukh <niwi@niwi.nz>
2025-02-14 12:51:14 +01:00
María Valderrama
59a57d6c3f Mark all notifications as read from dashboard (#5805)
*  Mark all notifications as read from dashboard

* ♻️ Mark all notifications as read code review

* ♻️ Mark all notifications as read code review II
2025-02-14 11:48:24 +01:00
Eva Marco
6bb7fa26f4 🐛 Fix rename blocked boards (#5845) 2025-02-14 11:47:16 +01:00
Xaviju
8a332c1402 Add placeholder to set edition (#5848) 2025-02-14 11:46:04 +01:00
Andrey Antukh
37855bfe7f Merge remote-tracking branch 'origin/staging' into develop 2025-02-14 10:35:29 +01:00
Andrey Antukh
8b6a9b373d Improve efficiency and logging on process-files! srepl helper 2025-02-14 10:02:34 +01:00
Andrey Antukh
8139ee3ef9 Revert "🐛 Fix workspace hot reload race condtion (#5851)"
This reverts commit 5d56d28cb6.
2025-02-14 10:02:05 +01:00
Andrey Antukh
f68b0117c4 ♻️ Simplify token creation mechanism 2025-02-14 08:49:31 +01:00
Andrey Antukh
aa867adbd3 ♻️ Add minor refactor on tokenlib object construction and validation 2025-02-14 08:49:30 +01:00
Andrey Antukh
3fd429c72a Merge remote-tracking branch 'origin/staging' into develop 2025-02-13 21:04:52 +01:00
Marina López
af93325fd9 🎉 Consolidate suggested libraries and add library button (#5828) 2025-02-13 20:06:28 +01:00
Pablo Alba
d836cc66da 🐛 Fix unable to drag & drop assets into/outside component groups (#5849) 2025-02-13 17:30:33 +01:00
Andrey Antukh
5d56d28cb6 🐛 Fix workspace hot reload race condtion (#5851)
Mainly ensure that all required paramers for workspace
file and page bootstrap are always available from parameters
and not taken from context
2025-02-13 17:04:34 +01:00
Eva Marco
46d2359107 🐛 Fix empty translation strings (#5847) 2025-02-13 15:48:44 +01:00
Aitor Moreno
39bbb4c2bd Merge pull request #5827 from penpot/superalex-fix-wasm-glitches
🐛 Fix wasm glitches
2025-02-13 15:25:24 +01:00
Alejandro Alonso
64e6d0b1f8 🐛 Fix wasm glitches 2025-02-13 15:16:45 +01:00
Xavier Julian
26a2ef8fb7 ♻️ Create DS context notification component 2025-02-13 13:36:53 +01:00
Alejandro
a6c46ee55c Merge pull request #5819 from penpot/azazeln28-feat-masks
🎉 Feat masks
2025-02-13 13:26:21 +01:00
AzazelN28
f8d58cb74e 🎉 Feat masks 2025-02-13 12:54:18 +01:00
Alejandro
f8820695cc 🐛 Fix incorrect numbering files when new team (#5835) 2025-02-13 11:55:59 +01:00
Andrey Antukh
3ea52a0198 Merge pull request #5784 from penpot/niwinz-tokens-changes-2
 Several performance oriented changes to tokens code (part 2)
2025-02-13 11:47:28 +01:00
Andrey Antukh
054efb3435 Merge pull request #5766 from penpot/niwinz-tokens-changes
 Several changes to tokens
2025-02-13 11:46:58 +01:00
Edgars Andersons
fbd5c404d2 🌐 Add translations for: Latvian
Currently translated at 98.1% (1616 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2025-02-13 11:02:06 +01:00
Nicola Bortoletto
32b65e8dbc 🌐 Add translations for: Italian
Currently translated at 99.6% (1641 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2025-02-13 11:02:04 +01:00
andrés gonzález
2d1d1fee1c 📚 Info about gradients (#5843) 2025-02-13 10:42:56 +01:00
Alejandro
773b4fe02e Merge pull request #5824 from penpot/alotor-propagate-modifiers
 Use skia matrix for internal data
2025-02-13 10:21:58 +01:00
Luis de Dios
4c6f086f82 ♻️ Use constant for zero width space 2025-02-13 09:17:09 +01:00
Elena Torró
1a62e5e42d Merge pull request #5830 from penpot/elenatorro-10118-fix-action-button-size
🐛 Fix Action Buttons size and add example to Storybook
2025-02-12 17:30:43 +01:00
Alonso Torres
688b9f2194 🐛 Fix focus to main component (#5842) 2025-02-12 17:16:14 +01:00
luisδμ
8992eb98ec Merge pull request #5841 from penpot/luis-fix-comments-mentions-keyboard
🐛 Fix keyboard interactions with mentions
2025-02-12 17:03:44 +01:00
elenatorro
f812460158 🐛 Fix Action Buttons size and display, and add example to Storybook 2025-02-12 17:02:20 +01:00
Luis de Dios
638a8a8d3f 🐛 Fix keyboard interactions with mentions 2025-02-12 16:37:51 +01:00
Belén Albeza
fb6cd3d9d4 🐛 Fix "Publish empty library" modal appearing for non-empty libraries (#5838)
* 🐛 Fix 'Publish empty library' modal appearing for non-empty libraries

*  Add integration test for bug 10113
2025-02-12 15:36:01 +01:00
Alonso Torres
fb0e22c16b 🐛 Fix problem with team permissions redirection (#5839) 2025-02-12 15:35:28 +01:00
Andrey Antukh
654c070976 Merge remote-tracking branch 'origin/staging' into develop 2025-02-12 14:37:20 +01:00
Alejandro
6b26adb187 🐛 Fix team doesn't disappear after deletion (#5832) 2025-02-12 14:36:46 +01:00
Alonso Torres
8fe1271690 🐛 Fix problem opening url when page-id didn't exist (#5833)
Co-authored-by: Andrey Antukh <niwi@niwi.nz>
2025-02-12 14:36:05 +01:00
Alonso Torres
ceb90cd9e0 🐛 Fix problem with dashboard multiple selection (#5836) 2025-02-12 14:34:05 +01:00
Florian Schrödl
e776ba1b33 Add margin to spacing token & context menu (#5807) 2025-02-12 14:27:26 +01:00
Alonso Torres
51f924a5e1 🐛 Fix problem with onboarding team invite (#5829)
Co-authored-by: Andrey Antukh <niwi@niwi.nz>
2025-02-12 13:09:37 +01:00
Alonso Torres
fb24a37e83 🐛 Fix problem with grid layout crashing (#5831) 2025-02-12 13:07:41 +01:00
Andrey Antukh
7497371b32 🐛 Fix issue on renaming group 2025-02-12 10:47:39 +01:00
Andrey Antukh
50afc4c507 Remove selection workaround for undo
Always select the first one when no match is found
2025-02-12 10:47:39 +01:00
Andrey Antukh
064e51d24e 🐛 Clear token set edition state on rename 2025-02-12 10:47:38 +01:00
Andrey Antukh
a029ec18a6 🐛 Fix incorrect handling of selected token set 2025-02-12 10:47:36 +01:00
Andrey Antukh
b0a6e5c946 🐛 Fix regression: close context menu on edit token 2025-02-12 10:45:04 +01:00
Andrey Antukh
e8c85d13ff ♻️ Remove sets context abstraction 2025-02-12 10:45:02 +01:00
Andrey Antukh
b228438127 Refactor the rest fot token sets context menu components 2025-02-12 10:41:24 +01:00
Andrey Antukh
1fb48a1e8a Adapt call style convention for token sets context menu component 2025-02-12 10:41:24 +01:00
Andrey Antukh
91b6d498fe Add minor efficiency improvements to tokens import export 2025-02-12 10:41:24 +01:00
Andrey Antukh
efe204c346 Simplify access to can-edit? using react context 2025-02-12 10:41:24 +01:00
Andrey Antukh
4a4cd9492a ♻️ Refactor token set auto selection mechanism
This is a general purpose change that also allows perform
a best effort on selection sets when the name is changed
(per example by moving it into other group).
2025-02-12 10:41:23 +01:00
Andrey Antukh
5446464d7e 📎 Add fixme comment for confusing name 2025-02-12 10:40:36 +01:00
Andrey Antukh
baa5258a43 Declare transducer statically for path split function 2025-02-12 10:40:36 +01:00
Andrey Antukh
df6a679548 Remove duplicated operations from tokens sidebar 2025-02-12 10:40:36 +01:00
Andrey Antukh
3692f17e55 Adapt call style for set-lists component 2025-02-12 10:40:34 +01:00
Andrey Antukh
2bac94ad5c Use new call convention on all components of tokens sidebar 2025-02-12 10:24:48 +01:00
Andrey Antukh
d46d80bd5c Use value equals on selected shapes set 2025-02-12 10:24:48 +01:00
Andrey Antukh
f0e5196659 Add minor optimization to token-pill component 2025-02-12 10:24:48 +01:00
Andrey Antukh
05a459ea19 📎 Add missing license header 2025-02-12 10:24:48 +01:00
Andrey Antukh
8e85d5a02a Add performance oriented refactor to token sidebar and token-pill 2025-02-12 10:24:48 +01:00
Andrey Antukh
81036b9330 Improve handling open-status and tokens selection 2025-02-12 10:24:47 +01:00
Andrey Antukh
c91b7606a0 Add minor efficiency improvements using new call convention 2025-02-12 10:24:47 +01:00
Andrey Antukh
d6e7a331d5 ♻️ Move token-types to changes ns
And rename it to token-properties
2025-02-12 10:24:47 +01:00
Andrey Antukh
831b0baddd Improve efficiency of grouping and sorting token types 2025-02-12 10:24:47 +01:00
Andrey Antukh
e4bf2bd9ad 💄 Internal function rename on tokens sidebar 2025-02-12 10:24:47 +01:00
Andrey Antukh
7a4d8b824e 💄 Rename token-component* to token-group* 2025-02-12 10:24:47 +01:00
Andrey Antukh
ff34d1d5f9 Don't create an additional sequence on iterating for tokens 2025-02-12 10:24:47 +01:00
Andrey Antukh
c1ce24e5f0 Don't sort tokens on each rerender 2025-02-12 10:24:46 +01:00
Andrey Antukh
1f450c83ec Use new component definition convention for token-component 2025-02-12 10:24:46 +01:00
Andrey Antukh
769000da2d 💄 Add cosmetic changes to token-component component 2025-02-12 10:24:46 +01:00
Andrey Antukh
a53c37bc3c Don't create function references for token-pill callbacks 2025-02-12 10:24:46 +01:00
Andrey Antukh
333cc5996c 💄 Add mainly cosmetic changes to tokens pill
Simplify the component logic removing duplicate token prop handling
2025-02-12 10:24:46 +01:00
Andrey Antukh
bccc90f5a2 Don't create keys seq on each rerender on token-pill component 2025-02-12 10:24:45 +01:00
Andrey Antukh
5575a66b8d 📎 Add many FIXME comments on token-pill component 2025-02-12 10:24:45 +01:00
Andrey Antukh
0fee8143dd Don't use seq operations for string includes operation 2025-02-12 10:24:45 +01:00
Andrey Antukh
b6e26d15e1 💄 Add cosmetic changes to tokens sidebar component 2025-02-12 10:24:44 +01:00
Andrey Antukh
7e0b2702de 💄 Add minor cosmetic changes 2025-02-12 10:24:13 +01:00
Andrey Antukh
e46fb9dba7 📎 Add missing copyright header 2025-02-12 10:24:13 +01:00
Andrey Antukh
f4dee75a17 🔥 Remove unused workspace tokens common ns file 2025-02-12 10:24:13 +01:00
Andrey Antukh
6d1ff0cb49 🔥 Remove unused and incorrect ref passed to dropdown component 2025-02-12 10:24:12 +01:00
alonso.torres
3dcabc9502 Use skia matrix for internal data 2025-02-11 16:49:43 +01:00
Eva Marco
10174aa7bc 🐛 Fix uppercase text and copy (#5821) 2025-02-11 16:46:17 +01:00
Andrey Antukh
cd87cbe44e Merge remote-tracking branch 'origin/staging' into develop 2025-02-11 16:09:32 +01:00
Andrey Antukh
4f38d258b5 Merge pull request #5822 from penpot/niwinz-add-features-check-report
 Report restriction errors to logger
2025-02-11 16:00:32 +01:00
Aitor Moreno
4594c7bf0a Merge pull request #5823 from penpot/superalex-render-wasm-cloning
🎉 Remove extra clonings from render wasm
2025-02-11 15:55:58 +01:00
Andrey Antukh
6feae7f359 🐛 Register media-refs on mod-obj 2025-02-11 15:44:12 +01:00
Andrey Antukh
a3bc4ff9f3 🐛 Prevent exception when no file is found on process file srepl helper 2025-02-11 15:43:35 +01:00
Andrey Antukh
df7dd15705 🐛 Make the absorb library aware that file can be nil 2025-02-11 15:42:55 +01:00
Andrey Antukh
8dbf6adfda 🐛 Pass correct media-ref object on fixing media ref script 2025-02-11 15:42:21 +01:00
Andrey Antukh
35f44a6eb4 🐛 Remove duplicate decoding on srepl helper get-file 2025-02-11 14:44:37 +01:00
Stas Haas
bf153eb96b 🌐 Add translations for: German
Currently translated at 99.6% (1641 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2025-02-11 14:22:12 +01:00
Alejandro Alonso
d1a1dafcad 🎉 Remove unnecesary clone for cache image 2025-02-11 14:05:37 +01:00
Alejandro Alonso
246463a3ec 🎉 Remove shape cloning from render wasm 2025-02-11 14:05:37 +01:00
Andrey Antukh
895450c9d5 Report restriction errors to logger 2025-02-11 13:52:12 +01:00
Andrey Antukh
36518e0e6e Fix linter issues 2025-02-11 13:52:12 +01:00
Alejandro
4b4541515c Merge pull request #5809 from penpot/perf-transform-wasm
 Add support for WASM transforms
2025-02-11 12:52:55 +01:00
alonso.torres
1bb337c3dd Add support for WASM transforms 2025-02-11 12:36:44 +01:00
Florian Schrödl
8b380a01e6 ♻️ Simplifies RPC pattern for tokens (#5765)
* ♻️ Refactor to RPC pattern

Co-authored-by: andrei <andrei@hyma.io>

* ♻️ Remove unused alias

* ♻️ Change function signature

---------

Co-authored-by: andrei <andrei@hyma.io>
Co-authored-by: Andrey Fedorov <oran9e.red@gmail.com>
2025-02-11 12:32:28 +01:00
Xaviju
5c32ec8cfa ♻️ Create shared notification utility component 2025-02-11 11:42:06 +01:00
Eva Marco
9660307f00 🐛 Fix opacity valid values (#5820) 2025-02-11 11:28:25 +01:00
Andrey Antukh
a3a757f842 Merge remote-tracking branch 'origin/staging' into develop 2025-02-11 11:25:40 +01:00
Eva Marco
a2727a110e Add resize in percentage option (#5816) 2025-02-11 11:25:11 +01:00
andrés gonzález
898e66fd18 📚 Add info about direct links to boards (#5815) 2025-02-11 10:12:17 +01:00
Aitor Moreno
db55c06c67 🐛 Fix pasted text loses font-family style (#5808) 2025-02-11 10:07:59 +01:00
luisδμ
7eefbc5979 💄 Improve readability of some messages in the browser console (#5814) 2025-02-10 20:05:48 +01:00
luisδμ
bed79d7c27 Merge pull request #5817 from penpot/elenatorro-10135-change-copy-link-text
📎 Make 'Copy link' the default text when copying to clipboard
2025-02-10 18:07:28 +01:00
elenatorro
830be55ee8 📎 Make 'Copy link' the default text when copying to clipboard 2025-02-10 17:47:46 +01:00
andrés gonzález
7d52b55d21 📚 Add info for copy/paste options (#5803) 2025-02-10 16:18:34 +01:00
Juanfran
dd1aba0d05 Merge pull request #5812 from penpot/juanfran-create-edit-token-modal-enter-key
 Add missing enter key for button activation in edit/create tokens modal
2025-02-10 16:10:25 +01:00
Eva Marco
6692f8dce2 Add validation to token opacity (#5802) 2025-02-10 15:04:22 +01:00
luisδμ
7fd0ca2243 🐛 Fix allow a comment length of 750 chars and show error text if exceeded (#5810) 2025-02-10 15:03:07 +01:00
Juanfran
372b3145ea Add missing Enter key for button activation in edit/create tokens modal 2025-02-10 15:02:46 +01:00
Alejandro
8b7a102927 Merge pull request #5804 from penpot/superalex-fix-wasm-frame-clipping
🐛 Fix wasm frame clipping
2025-02-10 14:05:46 +01:00
Juanfran
24e1cf0d7d Merge pull request #5811 from penpot/juanfran-spacing-token-sets
💄 Improve spacing in design token sets
2025-02-10 13:57:02 +01:00
Alejandro Alonso
2ce88283a2 🐛 Fix wasm render frame clipping 2025-02-10 13:54:27 +01:00
Juanfran
2ae2e23b57 💄 Improve spacing in design token sets 2025-02-10 13:37:24 +01:00
Pablo Alba
9c7bb96b1c Add new DS component: InputWithValues (#5777)
*  Add new DS component: InputWithValues

*  Fix MR

*  Fix MR 2
2025-02-10 13:17:30 +01:00
Andrey Antukh
0f49208040 Merge branch 'staging' into develop 2025-02-10 12:01:15 +01:00
Andrey Antukh
f173e15bb3 Merge branch 'main' into staging 2025-02-10 12:00:57 +01:00
Alejandro
8f11a925df 🎉 Non blocking render wasm (#5726) 2025-02-10 11:46:56 +01:00
Andrey Antukh
ccce3bcb8f 🐛 Fix exporter build script 2025-02-10 11:40:14 +01:00
Andrey Antukh
6ca1a84557 🐛 Backport build issue from staging
Related to the devenv update
2025-02-10 10:59:29 +01:00
Andrey Antukh
f65f7d68e6 Merge remote-tracking branch 'origin/staging' into develop 2025-02-10 10:57:04 +01:00
TheScientistPT
f16fcf25e2 🌐 Add translations for: Portuguese (Portugal)
Currently translated at 93.9% (1546 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2025-02-09 21:02:46 +01:00
andrés gonzález
debad85d6d 📚 Add info about fit board to content (#5800) 2025-02-07 16:41:04 +01:00
Linerly
0048f9725d 🌐 Add translations for: Indonesian
Currently translated at 100.0% (1646 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2025-02-07 15:01:51 +01:00
Robson Cardoso dos Santos
4bb5592e75 🌐 Add translations for: Portuguese (Brazil)
Currently translated at 72.7% (1198 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2025-02-07 15:01:51 +01:00
Juanfran
f5b18f953d Enable Enter key for button activation in tokens modal (#5792) 2025-02-07 14:26:09 +01:00
luisδμ
92aa615da4 🐛 Fix users from another teams appear in mentions (#5789) 2025-02-07 12:33:29 +01:00
Eva Marco
b991a94685 🐛 Fix icon visualization on select component (#5801) 2025-02-07 12:32:44 +01:00
Marina López
a98111f68d 🔥 Remove unnecessary prevent and stop (#5799) 2025-02-07 11:07:47 +01:00
Marina López
5fa96315e3 Add event for A/B test first state project (#5791) 2025-02-07 09:51:25 +01:00
andrés gonzález
a4e35ec713 📚 Update FAQ about sharing plugins (#5794) 2025-02-07 09:05:29 +01:00
andrés gonzález
87295eab76 📚 Add info about boards renaming (#5797) 2025-02-07 09:05:12 +01:00
andrés gonzález
028a5ba596 📚 Remove the permissions table (#5795) 2025-02-07 09:04:56 +01:00
Eva Marco
ef9ead8072 🐛 Fix typo on integration test docs (#5796) 2025-02-06 17:42:15 +01:00
Eva Marco
73ff1b4fe5 🐛 Fix menu shadow color (#5793) 2025-02-06 15:56:45 +01:00
Renan Mayrinck
d7fbd3c3bc 🌐 Add translations for: Portuguese (Brazil)
Currently translated at 72.7% (1198 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2025-02-06 14:41:03 +01:00
Robson Cardoso dos Santos
0b62bee90d 🌐 Add translations for: Portuguese (Brazil)
Currently translated at 72.7% (1198 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2025-02-06 14:41:03 +01:00
luisδμ
00b0a59868 🐛 Fix user unread comments appear in every workspace (#5786) 2025-02-06 14:24:30 +01:00
Andres Gonzalez
518ba0ebe7 📚 Add info about import size limit at the user guide 2025-02-06 14:23:05 +01:00
elhombretecla
8a13ce5f91 💄 Change email button styles (#5785) 2025-02-06 14:17:32 +01:00
Florian Schrödl
0c275cf490 🐛 Fix token set selection & rename (#5783)
* 🐛 Fix set selection

* 🐛 Fix set name not being updated

* ♻️ Add better list assertion & test set renaming
2025-02-06 14:16:03 +01:00
Andrey Antukh
8b466ef0a3 Merge remote-tracking branch 'origin/staging' into develop 2025-02-06 12:57:33 +01:00
Eva Marco
09b3868b0e 🐛 Fix flakiness of playwright test for token (#5790) 2025-02-06 12:49:58 +01:00
Pablo Alba
95f727033e Merge pull request #5771 from penpot/superalex-fix-create-new-layers-component-copy
🐛 Fix create new layers in component copy
2025-02-06 12:45:32 +01:00
Belén Albeza
e78100a776 🐛 Fix flakiness of playwright test for bug 10090 (#5787) 2025-02-06 12:12:29 +01:00
Edgars Andersons
a4a88769af 🌐 Add translations for: Latvian
Currently translated at 97.5% (1605 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2025-02-06 12:02:04 +01:00
Denys Kisil
2dce8d09b8 🌐 Add translations for: Ukrainian (ukr_UA)
Currently translated at 99.6% (1641 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ukr_UA/
2025-02-06 12:02:03 +01:00
TheScientistPT
e6e6401702 🌐 Add translations for: Portuguese (Portugal)
Currently translated at 93.6% (1542 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2025-02-06 12:02:01 +01:00
Robson Cardoso dos Santos
e83ece392c 🌐 Add translations for: Portuguese (Brazil)
Currently translated at 70.7% (1164 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2025-02-06 12:02:00 +01:00
Alonso Torres
cdfc0fd988 🐛 Fix problem when changing colorpicker alpha (#5770) 2025-02-06 10:49:42 +01:00
Alejandro Alonso
8aae928796 🐛 Fix create new layers in component copy 2025-02-06 10:43:26 +01:00
Marina López
0b90722d5a 🐛 Fix change flex direction using plugins API 2025-02-06 09:55:25 +01:00
Andrey Antukh
33887711f7 Merge remote-tracking branch 'origin/staging' into develop 2025-02-06 09:38:47 +01:00
Belén Albeza
2cbc09a0e2 🐛 Fix local library being collapsed by default (#5775)
* 🐛 Fix local library being collapsed by default

* ♻️ Move layers tab spec code to its own file
2025-02-06 09:28:51 +01:00
Juanfran
947bd547aa 💄 Improve alignment of design token sets (#5782) 2025-02-06 08:58:02 +01:00
Pablo Alba
c774592b9e 🐛 Fix several bugs for the combination of status and share on workspace (#5773)
*  Add status notification bubble

*  Add file persistance functionality

*  Add new colors

*  Add status tooltips

*  Fix z-index share modal

* 🐛 Fix share modal doesn't register on workspace

* 💄 Fix files formatting

*  Add revision fixes

*  Add revision fixes CI

* 🔥 Remove unused require

---------

Co-authored-by: Elhombretecla <delacruzgarciajuan@gmail.com>
2025-02-05 19:11:44 +01:00
Alonso Torres
3012ccf90a 🐛 Fix problem with email notifications on deleted comments (#5772) 2025-02-05 17:48:41 +01:00
alonso.torres
508531cfc2 ⬆️ Update plugins runtime 2025-02-05 17:43:01 +01:00
alonso.torres
7aa1237833 🐛 Fix problem with root frame parent reference 2025-02-05 17:43:01 +01:00
alonso.torres
66076f1332 🐛 Added upload svg with images method 2025-02-05 17:43:01 +01:00
alonso.torres
9c626d22c7 🐛 Fix problem in plugins with renaming components 2025-02-05 17:43:01 +01:00
alonso.torres
8217bbc7a0 🐛 Fix problems with zoomIntoView 2025-02-05 17:43:01 +01:00
Florian Schrödl
86e0f8ad34 🐛 Fix toggling set groups in theme modal not working (#5733) 2025-02-05 12:21:21 +01:00
Late Night Defender
bb161f9da8 🌐 Add translations for: Thai
Currently translated at 12.5% (206 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/th/
2025-02-04 22:02:01 +01:00
Denys Kisil
07360efd17 🌐 Add translations for: Ukrainian (ukr_UA)
Currently translated at 99.6% (1641 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ukr_UA/
2025-02-04 22:01:59 +01:00
TheScientistPT
7c8eaaa4f9 🌐 Add translations for: Portuguese (Portugal)
Currently translated at 93.3% (1537 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2025-02-04 22:01:58 +01:00
Andrey Antukh
48acc8715b Merge remote-tracking branch 'origin/staging' into develop 2025-02-04 16:01:14 +01:00
Aitor Moreno
b0d0abb0ad 🐛 Fix cursor not preserving white space (#5764) 2025-02-04 15:54:46 +01:00
Aitor Moreno
1f2e36774e 🐛 Fix pasting adds a newline (#5763) 2025-02-04 15:54:17 +01:00
Andrey Antukh
b913c75c41 🔥 Remove unused parameters from backend run template script 2025-02-04 15:36:22 +01:00
Marina López
9b64a6034b 🐛 Fix wrong text and styles from AB test (#5762) 2025-02-04 15:20:22 +01:00
Andrey Antukh
33da02421e 🐛 Fix unexepected exception on importing binfile
Happens when importing binfile with files that has deleted_at
property.
2025-02-04 14:07:23 +01:00
Andrey Antukh
b88ec13448 📎 Fix linter issues 2025-02-04 14:07:23 +01:00
Andrey Antukh
6106e56052 📎 Import from develop github workflows 2025-02-04 14:07:23 +01:00
Andrey Antukh
4bfe4ca230 🐛 Fix incorrect error handling on legacy workspace redirect 2025-02-04 13:35:24 +01:00
elhombretecla
1ac86aced0 Update CHANGES.md 2025-02-04 13:05:05 +01:00
Andrei Fëdorov
9db76f9a15 🎉 Import legacy format tokens (#5695) 2025-02-04 12:50:39 +01:00
Andrey Antukh
df0909483e Merge remote-tracking branch 'origin/staging' into develop 2025-02-04 11:35:03 +01:00
Aitor Moreno
774cf81fc8 🐛 Fix wrong blinking position after paste (#5756) 2025-02-04 11:29:25 +01:00
BDVGitHub
f8ba029b62 📚 Update Penpot Desktop link (#5521)
Change Penpot Desktop link
2025-02-04 11:25:16 +01:00
Aitor Moreno
dbf7b94651 🐛 Fix zoom to fit all didn't fit all (#5673) 2025-02-04 11:00:46 +01:00
Florian Schrödl
ec8109644b Create sets inside folders 2025-02-04 10:59:28 +01:00
elhombretecla
a5dc9eb458 Update CHANGES.md 2025-02-03 15:45:40 +01:00
Pablo Alba
43cde4e5e4 🎉 Add A/B test for first state of a project (#5691) 2025-02-03 12:52:51 +01:00
Andrey Antukh
315b389a66 🐛 Fix name generation and handling on creating objects (files, tokens, ...) (#5745)
*  Update function implementation

*  Add tests for a new function implementation

*  Update function usages according to new signature

*  Update docstrings

*  Use simpler assertion

* 💄 Replace concat with cons on name-seq

* 🐛 Fix incorrect error handling on legacy workspace redirect

---------

Co-authored-by: Andrey Fedorov <oran9e.red@gmail.com>
2025-02-03 12:49:56 +01:00
Andrey Antukh
bce30eb522 Merge pull request #5738 from penpot/niwinz-merge-two-prs
 Apply token value changes to all shapes in all pages
2025-02-03 12:31:07 +01:00
Andrey Antukh
d05d1c6a48 📎 Update changelog (add entry for 2.6.0) 2025-02-03 11:03:35 +01:00
Andrés Moya
1803e32322 🐛 Regenerate text shapes after changing token values 2025-02-03 10:16:31 +01:00
Andrey Antukh
22d5a43c92 Merge pull request #5742 from penpot/yms-improve-docker-compose
🐳 Improve docker compose
2025-02-03 09:53:08 +01:00
Belén Albeza
fe5de94db4 🐛 Fix "Mixed" not showing up for layout padding inputs (#5741)
* 🐛 Fix layout padding inputs not showing 'mixed' text

*  Add integration test
2025-02-03 09:51:26 +01:00
Denys Kisil
01e04843bf 🌐 Add translations for: Ukrainian (ukr_UA)
Currently translated at 99.6% (1641 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ukr_UA/
2025-02-02 14:01:52 +01:00
Linerly
3907f39c29 🌐 Add translations for: Indonesian
Currently translated at 98.9% (1628 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2025-02-01 02:01:53 +01:00
Eva Marco
24281b512e 🐛 Fix thumbnail regeration when changing sets of tokens 2025-01-31 16:35:30 +01:00
Andrés Moya
f4f0478975 Apply token value changes to shapes in all pages 2025-01-31 16:35:30 +01:00
Yamila Moreno
a3381b4880 🐳 Use the same PENPOT_VERSION envvar for all penpot services 2025-01-31 16:19:49 +01:00
Yamila Moreno
c42598d0c6 🐳 Add compose referer for telemetries 2025-01-31 16:05:59 +01:00
Marina López
e486bb4bec 🐛 Add missing shortcut translations (#5740) 2025-01-31 14:16:13 +01:00
Andrey Antukh
87eeb5031c 🐛 Fix issue on new migrations subsystem 2025-01-31 14:09:09 +01:00
Andrey Antukh
d15f0f1fd0 Improve build process
Remove hardcoded yarn version on devenv
2025-01-31 13:39:49 +01:00
Andrey Antukh
f871f88f30 ♻️ Refactor file data migrations subsystem (#5692)
* ♻️ Refactor file data migrations subsystem

* 📎 Add backend scripts/run helper script
2025-01-31 13:37:41 +01:00
Alonso Torres
96e99f6a78 🐛 Fix problem with build script wasm (#5739) 2025-01-31 13:14:38 +01:00
Andrey Antukh
a79315a61c ♻️ Move inspect code outside viewer 2025-01-31 12:24:48 +01:00
Xaviju
d62dc3b416 💄 Improve toast UI visualization (#5727) 2025-01-31 12:17:39 +01:00
luisδμ
0bd4a7d0fc 🐛 Fix bugs in comments (#5734)
* 🐛 Fix could not remove or update new comments without closing and reopening the thread

* 🐛 Fix scroll over long comments using the mouse wheel
2025-01-31 11:57:35 +01:00
Alejandro
d7477cd448 Merge pull request #5665 from penpot/niwinz-instantiate-component-bug-5
🎉 Add srepl fix function for process media refs on a file
2025-01-31 11:56:22 +01:00
Alonso Torres
14aa80e027 🐛 Fix edit name on read-only mode (#5737) 2025-01-31 11:48:52 +01:00
Alonso Torres
0483d1fd93 🐛 Fix paste properties on readonly state (#5736) 2025-01-31 11:47:28 +01:00
Alonso Torres
c3df84d812 🐛 Fix problem with colorpicker on change gradient stops (#5735) 2025-01-31 11:46:48 +01:00
Andrey Antukh
65504fbd91 🐛 Install corepack and yarn globally as user on devenv dockerfile 2025-01-31 10:58:31 +01:00
Stephan Paternotte
c570c0929f 🌐 Add translations for: Dutch
Currently translated at 99.6% (1641 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2025-01-31 00:57:21 +01:00
Denys Kisil
f53473f9e9 🌐 Add translations for: Ukrainian (ukr_UA)
Currently translated at 99.6% (1641 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ukr_UA/
2025-01-31 00:57:20 +01:00
Nicola Bortoletto
39e6d28826 🌐 Add translations for: Italian
Currently translated at 99.6% (1641 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2025-01-31 00:57:18 +01:00
Yaron Shahrabani
0b56d07a67 🌐 Add translations for: Hebrew
Currently translated at 99.6% (1641 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2025-01-31 00:57:17 +01:00
Andrey Antukh
aae8295795 Merge remote-tracking branch 'origin/staging' into develop 2025-01-30 16:24:18 +01:00
Eva Marco
2f1daf0649 🐛 Fix color id on color bullet component (#5731) 2025-01-30 16:21:38 +01:00
Andrey Antukh
7cdb4719bf Merge pull request #5719 from penpot/niwinz-fix-selected-colors
♻️ Add performance refactor for several components related to colors
2025-01-30 16:21:06 +01:00
Andrey Antukh
eac18afa0c 📎 Fix linter issues 2025-01-30 16:19:28 +01:00
Eva Marco
44694eaebe 🐛 Fix padding on colorpicker when selecting an image (#5729) 2025-01-30 14:54:43 +01:00
Andrey Antukh
59c2732014 📎 Import from develop github workflows 2025-01-30 14:51:38 +01:00
Andrey Antukh
1af99f534b 📎 Fix linter issues 2025-01-30 14:41:33 +01:00
Andrey Antukh
f554de8859 Merge remote-tracking branch 'origin/staging' into develop 2025-01-30 14:38:32 +01:00
Andrey Antukh
0870910dcc 🐛 Fix nodejs incompatibility with common tests prepend script (#5730)
* 🐛 Fix nodejs incompatibility with common tests prepend script

* 📎 Fix linter issues

Related to the upcoming update of clj-kondo
2025-01-30 14:32:43 +01:00
Florian Schrödl
773debafda 🐛 Fix border-radius applied to all corners on token update (#5697) 2025-01-30 12:54:19 +01:00
Aitor Moreno
4524d6c216 Merge pull request #5725 from penpot/perf-label-viewport
 Add label to wasm renderer
2025-01-30 12:33:14 +01:00
Juanfran
c5d5fa7561 Merge pull request #5723 from penpot/juanfran-review-replace-combobox
🐛 Fix combobox bg color and dropdown only with options (#9753)
2025-01-30 12:22:24 +01:00
Juanfran
c5644a5fe8 🐛 Fix combobox dropdown visibility when no options are provided (#9753) 2025-01-30 12:12:18 +01:00
alonso.torres
8c310e6e5c Add label to wasm renderer 2025-01-30 11:45:06 +01:00
Andrey Antukh
10ca2b20e4 📎 Update changelog 2025-01-30 11:41:50 +01:00
Marina López
a2ce5efe69 Add has-files prop to create-file event 2025-01-30 11:31:45 +01:00
Alonso Torres
0325d43e96 Add watch script wasm (#5711)
*  Add watch script wasm

* ♻️ Extract common build params for build and watch scripts
2025-01-30 10:40:05 +01:00
luisδμ
45059d73da 🐛 Fix several bugs in comments (#5716)
* ♻️ Remove obsolete CSS code

* 🐛 Fix post a comment with keyboard

* 🐛 Fix show comments cursor on view mode

* 🐛 Fix avoid comment bubbles to appear on top of sidebars

* 🐛 Fix cancel native browser zoom when comment threads are visible
2025-01-30 10:35:47 +01:00
Andrey Antukh
15a896e050 🐛 Add migration for fix files with invalid token-data (#5712)
Because of previous bug that is already fixed
2025-01-30 09:17:02 +01:00
Andrey Antukh
6be3285b52 Merge remote-tracking branch 'weblate/develop' into develop 2025-01-29 23:23:48 +01:00
Anonymous
495f90b23e 🌐 Add translations for: Swedish
Currently translated at 98.6% (1624 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/sv/
2025-01-29 23:23:28 +01:00
Anonymous
ae26e2cc8f 🌐 Add translations for: Dutch
Currently translated at 98.6% (1624 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2025-01-29 23:23:27 +01:00
Anonymous
e66a68f3bb 🌐 Add translations for: Latvian
Currently translated at 96.2% (1585 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2025-01-29 23:23:27 +01:00
Anonymous
845d58715d 🌐 Add translations for: Ukrainian (ukr_UA)
Currently translated at 98.6% (1624 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ukr_UA/
2025-01-29 23:23:26 +01:00
Anonymous
146c647c55 🌐 Add translations for: Czech
Currently translated at 95.6% (1574 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/cs/
2025-01-29 23:23:26 +01:00
Anonymous
886817a41d 🌐 Add translations for: Italian
Currently translated at 98.6% (1624 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2025-01-29 23:23:26 +01:00
Anonymous
431cb78ae0 🌐 Add translations for: Hebrew
Currently translated at 98.6% (1624 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2025-01-29 23:23:25 +01:00
Anonymous
24ae151e5b 🌐 Add translations for: Indonesian
Currently translated at 98.6% (1624 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2025-01-29 23:23:25 +01:00
Anonymous
e61217a337 🌐 Add translations for: Spanish
Currently translated at 99.2% (1633 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es/
2025-01-29 23:23:24 +01:00
Anonymous
1836e11a7c 🌐 Add translations for: English
Currently translated at 99.5% (1639 of 1646 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/en/
2025-01-29 23:23:24 +01:00
Andrey Antukh
cbf104bd3a 📎 Add missing emoji check on commit-checker 2025-01-29 23:22:53 +01:00
Andrey Antukh
9b0f0c6904 🌐 Rehash and validate translations 2025-01-29 23:14:32 +01:00
Andrey Antukh
54bdc83ce4 🐛 Fix issue on translation management script 2025-01-29 23:13:39 +01:00
Aitor Moreno
8145eb89d7 🐛 Fix styles not being inherited (#5717) 2025-01-29 23:06:05 +01:00
Denys Kisil
2c683d849d 🌐 Add translations for: Ukrainian (ukr_UA).
Currently translated at 100.0% (1626 of 1626 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ukr_UA/
2025-01-29 23:02:01 +01:00
Stephan Paternotte
f477828440 🌐 Add translations for: Dutch.
Currently translated at 99.8% (1623 of 1626 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2025-01-29 23:02:00 +01:00
Nicola Bortoletto
fd71872fe4 🌐 Add translations for: Italian.
Currently translated at 100.0% (1626 of 1626 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2025-01-29 23:02:00 +01:00
Linerly
8c04b98cb3 🌐 Add translations for: Indonesian.
Currently translated at 97.1% (1579 of 1626 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2025-01-29 23:01:59 +01:00
Andrey Antukh
8f37cd2c07 Add missing use-memo on page-menu 2025-01-29 21:20:44 +01:00
Andrey Antukh
01268ea14e Add major performance enhacements to shadow menu 2025-01-29 21:09:59 +01:00
Andrey Antukh
b449074425 ♻️ Refactor state management of shadow menu 2025-01-29 21:09:59 +01:00
Andrey Antukh
c2fae0fef2 Add performance enhancements to colorpicker gradients component 2025-01-29 21:09:59 +01:00
Andrey Antukh
e0efa63fa1 🔥 Remove commented code on colorpicker/gradients ns 2025-01-29 21:09:59 +01:00
Andrey Antukh
c504e38f6d 🐛 Fix incorrect key setup on color selection menu 2025-01-29 21:09:59 +01:00
Andrey Antukh
889902080b 📎 Fix linter issues
Related to the upcoming update of clj-kondo
2025-01-29 21:09:59 +01:00
Andrey Antukh
930ad359dd ♻️ Refactor color-row component to new style 2025-01-29 21:09:53 +01:00
Andrey Antukh
7809f2c7e4 💄 Convert color-selected-menu component to new style 2025-01-29 18:27:04 +01:00
Xaviju
995235d669 💄 Fix tokens modal block size when colorpicker is displayed (#5713) 2025-01-29 18:03:26 +01:00
Andrey Antukh
6fa08fc75e 🐛 Fix issue on importing binfile-v3 with tokens (#5714)
* 🐛 Fix issue on importing binfile-v3 with tokens

* 🐛 Fix thumbnails generation (regression)

* 🐛 Fix thumbnails clearing issues (regression)
2025-01-29 16:52:40 +01:00
Juanfran
c82e5f7681 ⬆️ Update plugins runtime (#5715) 2025-01-29 16:19:41 +01:00
Alejandro
16ec8b033a 🐛 Fix wasm render performance flushing drawing surface (#5709) 2025-01-29 14:17:20 +01:00
Andrey Antukh
58c6bbcc0b 🌐 Synchronize translations with weblate
commit c818fa967dca3f77b6d3dc89a2455d47b3695122
Author: Denys Kisil <ossenjoyer@proton.me>
Date:   Mon Jan 27 12:03:55 2025 +0000

    🌐 Add translations for: Ukrainian (ukr_UA).

    Currently translated at 100.0% (1626 of 1626 strings)

    Translation: Penpot/frontend
    Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ukr_UA/

commit 4deb86d68f6096a4d89102087e75ad56fa87a8d0
Author: AlexTECPlayz <alextec70@outlook.com>
Date:   Fri Jan 24 17:59:52 2025 +0000

    🌐 Add translations for: Romanian.

    Currently translated at 79.4% (1292 of 1626 strings)

    Translation: Penpot/frontend
    Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/

commit 6604b7773890b6dcd9b523dad87aa089f97654c2
Author: Denys Kisil <ossenjoyer@proton.me>
Date:   Tue Jan 21 19:00:43 2025 +0000

    🌐 Add translations for: Ukrainian (ukr_UA).

    Currently translated at 100.0% (1626 of 1626 strings)

    Translation: Penpot/frontend
    Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ukr_UA/

commit 2b2e51352cb79ff83a60858c1d61d8776aed0f3b
Author: Denys Kisil <ossenjoyer@proton.me>
Date:   Tue Jan 21 18:40:29 2025 +0000

    🌐 Add translations for: Ukrainian (ukr_UA).

    Currently translated at 100.0% (1626 of 1626 strings)

    Translation: Penpot/frontend
    Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ukr_UA/

commit 9c7ba8b7c8bd2a62c3c1144a1bae13cc987e5947
Author: Henrik Allberg <henrik@thexorb.com>
Date:   Mon Jan 20 09:41:44 2025 +0000

    🌐 Add translations for: Swedish.

    Currently translated at 100.0% (1626 of 1626 strings)

    Translation: Penpot/frontend
    Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/sv/

commit 1a21fa41b2d0919b42c2bea8210eea04132a807d
Author: Stephan Paternotte <stephan@paternottes.net>
Date:   Mon Jan 20 14:17:18 2025 +0000

    🌐 Add translations for: Dutch.

    Currently translated at 100.0% (1626 of 1626 strings)

    Translation: Penpot/frontend
    Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/

commit c13a637a0f2836b8e01555e5e12a7572e2275cfe
Author: Nicola Bortoletto <nicola.bortoletto@live.com>
Date:   Sun Jan 19 22:53:13 2025 +0000

    🌐 Add translations for: Italian.

    Currently translated at 100.0% (1626 of 1626 strings)

    Translation: Penpot/frontend
    Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/

commit f81f866ec9154d20d785791a9a26464008bede23
Author: Stephan Paternotte <stephan@paternottes.net>
Date:   Sat Jan 18 02:39:14 2025 +0000

    🌐 Add translations for: Dutch.

    Currently translated at 99.8% (1623 of 1626 strings)

    Translation: Penpot/frontend
    Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/

commit 74a1de142ad0c0be8f7404067696649f68efba77
Author: Edgars Andersons <Edgars+Weblate@gaitenis.id.lv>
Date:   Sat Jan 18 07:29:53 2025 +0000

    🌐 Add translations for: Latvian.

    Currently translated at 97.6% (1587 of 1626 strings)

    Translation: Penpot/frontend
    Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/

commit f42dfa0c79aef934079ae06a99965bd6878dc295
Author: Nicola Bortoletto <nicola.bortoletto@live.com>
Date:   Sat Jan 18 06:39:28 2025 +0000

    🌐 Add translations for: Italian.

    Currently translated at 100.0% (1626 of 1626 strings)

    Translation: Penpot/frontend
    Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/

commit 3f5462f3fb62d276cee7b4032f1362b5628299c3
Author: Yaron Shahrabani <sh.yaron@gmail.com>
Date:   Sat Jan 18 05:03:49 2025 +0000

    🌐 Add translations for: Hebrew.

    Currently translated at 100.0% (1626 of 1626 strings)

    Translation: Penpot/frontend
    Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/

commit 3fc5a3b3d594d45eff1ee4062ddb8484550178ec
Author: Linerly <linerly@proton.me>
Date:   Sat Jan 18 07:24:13 2025 +0000

    🌐 Add translations for: Indonesian.

    Currently translated at 100.0% (1626 of 1626 strings)

    Translation: Penpot/frontend
    Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/

commit a50c2e8f2ab24ff33831343e8e06a78c7d950d56
Author: Linerly <linerly@proton.me>
Date:   Thu Jan 9 01:25:43 2025 +0000

    🌐 Add translations for: Indonesian.

    Currently translated at 97.1% (1579 of 1626 strings)

    Translation: Penpot/frontend
    Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/

commit fe3fce673b88d26b75de52a635f4c56cf4327e91
Author: Hosted Weblate <hosted@weblate.org>
Date:   Fri Jan 17 10:53:34 2025 +0100

    Update translation files

    Updated by "Cleanup translation files" hook in Weblate.

    Translation: Penpot/frontend
    Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/
2025-01-29 13:00:54 +01:00
Andrey Antukh
a6485b93b7 Merge pull request #5707 from penpot/niwinz-update-selfhost-defaults
 Add the ability to set http body size on docker images
2025-01-29 12:43:17 +01:00
Andrei Fëdorov
51a34c0091 🐛 Fix swapped horizontal and vertical padding (#5708)
* 🐛 Fix swapped horizontal an vertical padding

* 🐛 Fix proper toggling when option `All` is selected
2025-01-29 12:29:41 +01:00
Andrey Antukh
47f1ca9627 Change backend defaults for http body 2025-01-29 12:26:30 +01:00
Andrey Antukh
f252ffb201 Add the ability to overwrite default http body size on docker images
And provide a compose file with good defaults
2025-01-29 12:22:05 +01:00
María Valderrama
48b225f3fe Merge pull request #5704 from penpot/ddb-copy-text
 Copy text content to clipboard
2025-01-29 12:00:26 +01:00
Marina López
0768ef1b8f Add A/B test switching '+' to 'Add file' on hover (#5705) 2025-01-29 11:42:08 +01:00
Andrey Antukh
d9ba107da2 🔧 Update default body size for docker images
Set it to 350MiB, the same as we have on our saas
2025-01-29 11:38:16 +01:00
Andrey Antukh
367d38c65e 🔧 Update commit checker workflow to include capital letters (#5706) 2025-01-29 11:22:10 +01:00
Andrey Antukh
754ba304a7 ⬆️ Update dependencies (#5694)
* ⬆️ Update system dependencies on devenv

* ⬆️ Update partially frontend dependencies

* ⬆️ Update application dependencies

* ⬆️ Update storybook dependency
2025-01-29 11:21:38 +01:00
alonso.torres
f1515a85bf Copy text content to clipboard 2025-01-29 10:52:20 +01:00
Alejandro
ce67550195 🐛 Avoid extra render calls on page initialization with wasm render (#5701) 2025-01-29 10:50:27 +01:00
Alejandro
979de39768 Merge pull request #5702 from penpot/niwinz-github-workflow
 Add github acction for check commit message format
2025-01-29 10:48:35 +01:00
Andrey Antukh
a3ab8e9eb0 📚 Update CONTRIBUTING.md file 2025-01-29 10:40:53 +01:00
Andrey Antukh
e6bc1e66f1 Add commit message format check github action 2025-01-29 10:40:40 +01:00
Andrey Antukh
c165303f83 Merge remote-tracking branch 'origin/staging' into develop 2025-01-29 09:37:39 +01:00
Alonso Torres
34e2eb829b Remove copying props for multiple elements (#5700) 2025-01-28 16:44:44 +01:00
luisδμ
1ebd5be3b1 Merge pull request #5699 from penpot/ddb-empty-comment-disable
🐛 Disable button on empty comments
2025-01-28 16:31:14 +01:00
Alejandro
8eb150fd93 🐛 Fix strokes for render wasm (#5684) 2025-01-28 16:19:09 +01:00
alonso.torres
d854398dae 🐛 Disale button on empty comments 2025-01-28 16:00:09 +01:00
Alejandro
09131f7533 🎉 Render drop shadows (wasm) (#5693)
Co-authored-by: Belén Albeza <belen@hey.com>
2025-01-28 15:10:06 +01:00
Alonso Torres
407b664910 🐛 Fix problem with plugin data null values (#5696) 2025-01-28 14:47:37 +01:00
Florian Schrödl
27dce6fcfa 🎉 Add alpha to token color (#5683)
* 🎉 Add alpha to token color
2025-01-28 14:27:10 +01:00
Xaviju
1d22658818 ♻️ Switch swatch component in style bar 2025-01-28 13:13:34 +01:00
elhombretecla
f1ccb00527 Update CHANGES.md 2025-01-28 13:08:29 +01:00
Alonso Torres
c215214120 Add new components to storybook (#5632)
*  Add new components to storybook

*  Changes after review

*  More changes after review

*  Add file history components to the application

*  Unnest selector
2025-01-28 12:34:15 +01:00
Eva Marco
0cf4d4636a 🐛 Fix set X position from dimensions token (#5685) 2025-01-28 12:24:41 +01:00
Florian Schrödl
b94afe143f 🐛 Update padding only on shapes with layout (#5688) 2025-01-28 11:41:03 +01:00
Eva Marco
10bc2276a6 🐛 Fix notification level on import error (#5689) 2025-01-28 11:40:35 +01:00
Belén Albeza
31145f2805 Merge pull request #5675 from penpot/azazeln28-fix-issue-9900
🐛 Fix Colorpicker shows RGBA inputs when HSVA mode is active
2025-01-28 11:35:04 +01:00
Eva Marco
b27324f903 Merge pull request #5679 from tokens-studio/45-florian-broken-token-create
🐛 Fix broken token create/update when set contains broken tokens
2025-01-28 10:02:42 +01:00
Florian Schroedl
62ca665d55 🐛 Fix tokens not being editable 2025-01-28 09:04:25 +01:00
Florian Schrödl
ef61f9c7aa 🐛 Fix CI breaking * (#5690)
* A rerender introduced by the warning message for token renames shifts
the submit button, which caused playwright to lose the element.
2025-01-27 18:51:10 +01:00
Florian Schrödl
ab72794994 🐛 Fix user cant submit existing token when editing name only (#5658)
* 🐛 Fix user cant submit existing token when editing it
2025-01-27 16:00:24 +01:00
AzazelN28
33192cfdb8 🐛 Fix colorpicker HSVA inputs 2025-01-27 15:38:21 +01:00
Andrey Antukh
6c0954aae9 📚 Update documentation about components-v2 migration script 2025-01-27 13:13:21 +01:00
Andrey Antukh
15f7fac8f4 Add more reasonable default fetch size for db/plan
Making it more general purpose and not only for streaming
2025-01-27 12:53:11 +01:00
Andrey Antukh
349552879e 🔥 Remove already broken v2 migration script 2025-01-27 12:53:11 +01:00
Andrey Antukh
bfe9a2b545 🎉 Add migration-like script for execute media-refs fix 2025-01-27 12:53:11 +01:00
Andrey Antukh
16934b734b 🎉 Add srepl fix function for process media refs on a file 2025-01-27 12:38:12 +01:00
Andrey Antukh
4c1312d4f6 Only create snapshot if file is modified (on srepl helper) 2025-01-27 12:38:12 +01:00
Andrey Antukh
541ed6282f Normalize file retrieving and persistence on binfile, file-gc and helpers 2025-01-27 12:38:10 +01:00
Alonso Torres
92d14e38b5 🐛 Fix problem with multiple color changes (#5680)
* 🐛 Fix problem with multiple color changes

* 🐛 Fixes after review
2025-01-27 12:36:00 +01:00
Alejandro
ea6c679b21 🐛 Fix click on the project name goes to blank dashboard from workspace (#5668) 2025-01-27 12:16:52 +01:00
Andrey Antukh
74bdd72d2f Merge remote-tracking branch 'origin/staging' into develop 2025-01-27 12:12:46 +01:00
Andrey Antukh
471699960f 🐛 Update media references after instantiation of a component (#5652)
🐛 Update media references after instantiation of a component
2025-01-27 11:58:13 +01:00
Alejandro
8f48396556 🐛 Fix remember decision when team hero banner is closed (#5669) 2025-01-27 11:53:10 +01:00
Pablo Alba
8bee050b5b 🐛 On viewer role, start with inspect tab selected (#5676) 2025-01-27 11:45:22 +01:00
Belén Albeza
2726fa04c0 Merge pull request #5667 from penpot/superalex-fix-blend-modes-render-wasm
🐛 Fix blend modes for wasm render
2025-01-27 11:00:38 +01:00
Xaviju
9751afaaec 🐛 Fix styles by webkit on autocomplete 2025-01-27 09:54:04 +01:00
Andrey Antukh
0447f2f861 Merge pull request #5682 from penpot/alotor-fix-component-menu
🐛 Fix problemws with components context menu
2025-01-27 09:53:23 +01:00
Juanfran
18607e6ed9 Merge pull request #5677 from penpot/juanfran-replace-group-select-with-combobox
[Tokens] :sparkles Add combobox to select group in token themes modal
2025-01-27 09:40:33 +01:00
alonso.torres
2d58a5095c 🐛 Fix problems with components context menu 2025-01-27 09:32:12 +01:00
Juanfran
fe3a2902bb :sparkles Add combobox to select group in token themes modal 2025-01-27 09:18:21 +01:00
Xaviju
da273c1168 Add warning when editing a token name 2025-01-24 23:23:59 +01:00
Andrey Antukh
71560c0a53 Backport and merge migrations from staging (#5681) 2025-01-24 19:11:03 +01:00
Eva Marco
48132711b6 Merge pull request #5672 from penpot/superalex-fix-viewer-forward-button-not-working
🐛 Fix view modem forward button not working
2025-01-24 13:58:07 +01:00
Alejandro Alonso
cf53e0d233 🐛 Fix view modem forward button not working 2025-01-24 12:17:22 +01:00
Alonso Torres
7458a35f31 🐛 Fix problem when pasting text (#5671) 2025-01-24 11:26:06 +01:00
Eva Marco
231d875f79 🐛 Fix stroke token errors (#5661)
* 🐛 Fix change on any stroke attribute remove tokens

* 🐛 Fix add new stroke, reorder stroke or remove stroke should remove applied tokens

* 📎 Review fixes
2025-01-24 11:24:26 +01:00
Marina López
25b89ec59f 🐛 added title to workspace page list to display long names 2025-01-24 10:36:09 +01:00
Florian Schroedl
19daffd1c0 Implement drag & drop for set groups
🚧 PR feedback

♻️ Remove unused functions

♻️ Throw on non-allowed changes

🚧 key fixes

🚧 Fix tests

🚧 FMT

🚧 Add set group test

🚧 Remove 'drop' in name

🚧 Add group tests

🚧 FMT

🚧 Always return changes
2025-01-24 09:50:50 +01:00
Andrey Antukh
32f0da7514 🐛 Fix color wrapper choppiness (#5655)
* ♻️ Remove unused state om tokens colorpicker ramp component

* 🐛 Fix color wrapper choppiness

*  Add performance related changes for colorpicker ramp selector

*  Add performance oriented changes to tokens ramp component

---------

Co-authored-by: Andrey Fedorov <oran9e.red@gmail.com>
2025-01-24 09:37:11 +01:00
Alejandro Alonso
f70b05a09e 🐛 Fix blend modes for wasm render 2025-01-24 09:17:46 +01:00
Alejandro Alonso
e7c06fed22 🎉 Improve clipping objects for wasm render 2025-01-24 09:15:41 +01:00
Pablo Alba
2ef22ecd08 🐛 Add migration fixing files with shape-ref cycles (#5663)
* 🐛 Add migration fixing files with shape-ref cycles

* :wip: Add optimized version of migration 62

---------

Co-authored-by: Andrey Antukh <niwi@niwi.nz>
2025-01-23 17:28:13 +01:00
luisδμ
cf25614afb Merge pull request #5662 from penpot/alotor-update-docs
📚 Update devenv documentation
2025-01-23 15:52:18 +01:00
alonso.torres
10f977b6c8 📚 Update devenv documentation 2025-01-23 15:41:49 +01:00
Andrey Antukh
9c60d1cdf9 Merge pull request #5660 from penpot/palba-consolidate-share-workspace
🎉 Consolidate add share button to the workspace
2025-01-23 13:06:16 +01:00
Andrey Antukh
dae7b7cd74 Merge remote-tracking branch 'origin/staging' into develop 2025-01-23 12:53:03 +01:00
Andrey Antukh
080dc4b93c Merge remote-tracking branch 'origin/main' into staging 2025-01-23 12:42:04 +01:00
Andrey Antukh
a123cc4bbe Merge pull request #5653 from penpot/xaviju-9132-implement-metrics
 Add tokens metrics events
2025-01-23 12:37:08 +01:00
Pablo Alba
f0966070eb 🎉 Consolidate add share button to the workspace 2025-01-23 12:33:58 +01:00
Andrey Antukh
ce9d283b7c Merge pull request #5659 from penpot/alotor-storybook-config
🔧 Improved storybook configuration
2025-01-23 12:23:44 +01:00
alonso.torres
33e8c8b3c9 🔧 Improved storybook configuration 2025-01-23 12:06:02 +01:00
Xaviju
7eb9142a4d Add tokens metrics events 2025-01-23 12:00:50 +01:00
Andrey Antukh
b1d053893c 📚 Add minor improvement to plugins creation documentation 2025-01-23 11:36:27 +01:00
Eva Marco
83fe2f35b4 Merge pull request #5647 from penpot/eva-fix-not-referenced-tokens
🐛  Fix not referenced token pills
2025-01-23 11:08:54 +01:00
Belén Albeza
c303b062cb Merge pull request #5645 from penpot/superalex-drag-and-drop-nested-frames
🐛 Fix render wasm frames anidated content drag and drop
2025-01-23 11:04:08 +01:00
Belén Albeza
91990e4e29 Merge pull request #5635 from penpot/superalex-render-wasm-fix-frames-anidated-content
🐛 Fix render wasm frames nested content issues
2025-01-23 11:00:27 +01:00
Andrey Antukh
c2fb9f4c6f 📎 Add missing entry on the changelog file 2025-01-23 10:49:09 +01:00
luisδμ
1787653703 Merge pull request #5646 from penpot/ddb-frame-fit-content
 Resize frame to fit content
2025-01-23 09:56:11 +01:00
Alejandro
19a26e46dc Merge pull request #5654 from penpot/niwinz-clone-template-bug
🐛 Add support for multiple file formats to clone-template
2025-01-23 09:01:39 +01:00
Andrey Antukh
efd4a11ae2 🐛 Add support for multiple formats on clone-template 2025-01-23 08:09:23 +01:00
Andrey Antukh
68bd8152b8 Merge pull request #5633 from penpot/eva-remove-tokens-from-measures
🐛  Fix errors from editable select on measures menu
2025-01-22 18:58:54 +01:00
Eva Marco
9e47a70adf 🐛 Fix errors from editable select on measures menu 2025-01-22 18:20:49 +01:00
Andrey Antukh
fae73a198c Merge remote-tracking branch 'origin/main' into staging 2025-01-22 17:44:24 +01:00
Andrey Antukh
361644b62c Merge pull request #5639 from penpot/superalex-fix-shadows-order
🐛 Fix shadows order
2025-01-22 17:41:33 +01:00
Andrey Antukh
6be1023c0a Merge tag '2.4.2' 2025-01-22 16:34:37 +01:00
Andrey Antukh
778b3dd6bd Merge remote-tracking branch 'origin/staging' into develop 2025-01-22 16:10:32 +01:00
Andrey Antukh
9bfee99672 Merge remote-tracking branch 'origin/main' into staging 2025-01-22 16:10:17 +01:00
Alejandro Alonso
5be92009bc 🐛 Fix extra rotations for frames contained elements with wasm render 2025-01-22 16:06:34 +01:00
Eva Marco
a667256be9 ♻️ Fix some css errors 2025-01-22 15:56:43 +01:00
Eva Marco
482cb26b1a 🐛 Fix lost translation 2025-01-22 15:56:43 +01:00
Eva Marco
cd6e254edb 🐛 Fix broken reference pills 2025-01-22 15:56:34 +01:00
Belén Albeza
69cc72de61 Merge pull request #5447 from penpot/superalex-svg-render-wasm
🎉 SVG raw support and refactor render architecture
2025-01-22 15:56:02 +01:00
Pablo Alba
85d3a052c9 Merge pull request #5641 from penpot/palba-fix-shape-ref-cycle
🐛 Fix shape-ref cycles
2025-01-22 15:48:01 +01:00
AzazelN28
fb4e92d0e8 ♻️ Refactor to make it more ECS friendly 2025-01-22 15:47:36 +01:00
Alejandro Alonso
79df616108 🎉 Basic wasm support for svg attrs and svg defs 2025-01-22 15:47:36 +01:00
Alejandro Alonso
751df46dc9 🎉 Basic wasm fonts support 2025-01-22 15:46:23 +01:00
Alejandro Alonso
6335a183ba 🎉 Improve error messages 2025-01-22 15:46:23 +01:00
Alejandro Alonso
00e19697c6 🎉 Update editorconfig 2025-01-22 15:46:23 +01:00
alonso.torres
f9700eb32e Resize frame to fit content 2025-01-22 14:45:29 +01:00
Yamila Moreno
240f658c3a Merge pull request #5643 from penpot/yms-fix-docker-compose-configuration
🐳 fix docker compose documentation
2025-01-22 14:33:00 +01:00
Pablo Alba
7592530fb4 🐛 Fix shape-ref cycles 2025-01-22 14:08:32 +01:00
Alejandro Alonso
0feb0b0b81 🐛 Fix render wasm frames anidated content drag and drop 2025-01-22 14:03:10 +01:00
Belén Albeza
6573311aab Merge pull request #5642 from penpot/superalex-fix-board-titles-moving-when-drag-and-drop
🐛 Fix board titles movement when drag and drop using render wasm
2025-01-22 14:02:03 +01:00
Alejandro
d046feef28 Merge pull request #5644 from penpot/ladybenko-9784-fix-set-path-content
🐛 Fix crash on set-shape-path-content
2025-01-22 13:55:12 +01:00
Belén Albeza
15b5346922 🐛 Fix crash on set-shape-path-content 2025-01-22 13:40:57 +01:00
Yamila Moreno
31bc7e7c86 🐳 add advice for unsecure configuration 2025-01-22 13:34:48 +01:00
Alejandro Alonso
d987d68565 🐛 Fix board titles movement when drag and drop using render wasm 2025-01-22 12:23:21 +01:00
Yamila Moreno
b3a5e6710f 🐳 improve docs about custom configuration 2025-01-22 12:21:13 +01:00
David Barragán Merino
845f187690 Merge pull request #5630 from penpot/bameda-fix-docker-concurrency-issues
🐳 Ensure that postgresql and redis are running before starting Penpot services
2025-01-22 10:03:26 +01:00
Andrey Antukh
e01feab6c3 Merge pull request #5640 from penpot/superalex-fix-dump-selected
🐛 Fix debug.dump_selected()
2025-01-22 09:29:07 +01:00
Alejandro Alonso
625cfa4c97 🐛 Fix debug.dump_selected() 2025-01-22 08:24:50 +01:00
Alejandro Alonso
35b442d6a7 🐛 Fix shadows order 2025-01-22 07:58:25 +01:00
Andrey Antukh
83bd479176 Merge remote-tracking branch 'origin/staging' into develop 2025-01-21 18:40:28 +01:00
Eva Marco
a79f6a9946 Merge pull request #5634 from tokens-studio/florian/36-stroke-width
🐛 Fix stroke width not updating when applied from dimensions context …
2025-01-21 16:06:08 +01:00
Florian Schroedl
d82ac56d43 🐛 Fix stroke width not updating when applied from dimensions context menu 2025-01-21 14:24:32 +01:00
Eva Marco
aa46ea693e Merge pull request #5629 from penpot/eva-fix-pill-styles
🐛  Fix some styles on token pills
2025-01-21 13:56:24 +01:00
David Barragán Merino
c0c3c60645 🐳 Ensure that postgresql and redis are running before starting Penpot services 2025-01-21 11:40:34 +01:00
Xaviju
ad7dc5bed6 📚 Add semantics and accessibility requirements - review 2025-01-21 11:35:01 +01:00
Eva Marco
23f00e9fe7 🐛 Fix some styles on token pills 2025-01-21 11:09:07 +01:00
Andrey Antukh
642efcb47b Merge remote-tracking branch 'origin/staging' into develop 2025-01-20 23:29:54 +01:00
Andrey Antukh
6ef6a50a1c Merge remote-tracking branch 'origin/staging' into develop 2025-01-20 17:34:21 +01:00
Andrey Antukh
aac52d70bc Merge pull request #5604 from penpot/eva-add-viewer-role-on-tokens 2025-01-20 17:20:04 +01:00
Andrei Fëdorov
69cb70a5ae 🐛 Fix issue where users can import tokens with invalid characters (#5623) 2025-01-20 17:13:58 +01:00
Eva Marco
b406a28d34 Add viewer role to token sets 2025-01-20 17:04:21 +01:00
Eva Marco
ec49ff2878 Add viewer role to token list 2025-01-20 17:04:21 +01:00
Eva Marco
3e2a6d7e0b Add viewer role to theme selection 2025-01-20 17:04:18 +01:00
Eva Marco
554311cd1f 🐛 Fix error with context-menu icon 2025-01-20 17:01:17 +01:00
Andrey Antukh
1395629e5a Merge pull request #5625 from penpot/eva-fix-long-token-names 2025-01-20 16:38:24 +01:00
Andrey Antukh
85c1de4bda Merge pull request #5624 from penpot/yms-update-selfhosting-guide
🐳 improve docker documentation related to the updates
2025-01-20 16:36:40 +01:00
Belén Albeza
3be11e853b Merge pull request #5606 from penpot/superalex-fix-outer-stroke-with-image-fill-artifacts
🐛 Fix outer stroke with image fill extra artifacts
2025-01-20 16:12:21 +01:00
Eva Marco
afcaee62f4 🐛 Add ellipsis to token name after groups if any 2025-01-20 15:51:07 +01:00
Yamila Moreno
d3ad15f19a 🐳 improve docker documentation related to the updates 2025-01-20 15:39:44 +01:00
Andrey Antukh
8dd0a4f275 Merge pull request #5603 from penpot/palba-bugfixing-04
Palba bugfixing 04
2025-01-20 15:36:19 +01:00
Aitor Moreno
013a8c95df Merge pull request #5605 from penpot/niwinz-enhancements-2
 Add performance enhacements
2025-01-20 13:22:07 +01:00
Alejandro
47294dbd65 Merge pull request #5615 from penpot/ladybenko-wasm-cleanup
🐛 Fix WebGL warning when switching pages
2025-01-20 12:50:54 +01:00
Belén Albeza
2f80d337ad 🐛 Fix WebGL warning when switching pages 2025-01-20 12:41:39 +01:00
Andrey Antukh
402eacdb22 Merge remote-tracking branch 'origin/staging' into develop 2025-01-20 12:38:23 +01:00
Andrey Antukh
12ec3b4942 Merge remote-tracking branch 'origin/staging' into develop 2025-01-20 11:06:26 +01:00
Pablo Alba
21f4abf1b8 🐛 Fix history panel doesn't close on esc 2025-01-20 11:02:32 +01:00
Andrey Antukh
83838eed8c Merge remote-tracking branch 'origin/staging' into develop 2025-01-20 09:56:08 +01:00
Alejandro Alonso
5f4f7e422d 🐛 Fix outer stroke with image fill extra artifacts 2025-01-20 09:47:32 +01:00
Andrey Antukh
e2b054bbd1 Merge pull request #5569 from penpot/hiru-export-tokens 2025-01-17 15:45:39 +01:00
Andrés Moya
42d2315f37 🎉 Include tokens library in .penpot files 2025-01-17 15:28:10 +01:00
Andrey Antukh
8bb0a5b28f Merge pull request #5616 from penpot/alotor-bugs-3 2025-01-17 15:25:13 +01:00
Andrey Antukh
a8fd492748 Merge pull request #5612 from penpot/superalex-fix-delete-page
🐛 Fix delete page navigation to first page
2025-01-17 15:22:20 +01:00
alonso.torres
52e5978ed5 🐛 Fix problem with strokes not refreshing in Safari 2025-01-17 14:33:46 +01:00
alonso.torres
e0281b553c 🐛 Fix error when reseting stroke cap 2025-01-17 14:31:02 +01:00
alonso.torres
34a2a8815b 🐛 Fix problem with alt key measures being stuck 2025-01-17 12:30:27 +01:00
Alejandro Alonso
6c25e18f09 🐛 Fix delete page navigation to first page 2025-01-17 12:19:22 +01:00
Andrey Antukh
77477e09a2 Merge pull request #5611 from penpot/translations
📎 Update translations
2025-01-17 10:52:38 +01:00
Andrey Antukh
59c877aac0 Merge remote-tracking branch 'weblate/develop' into translations 2025-01-17 10:42:31 +01:00
Andrey Antukh
2a63f8e966 Add performance oriented refactor on colorpicker libraries component 2025-01-16 21:33:11 +01:00
Andrey Antukh
de2475cca6 Add performance oriented refactor to color palette context menu 2025-01-16 21:04:57 +01:00
Andrey Antukh
068dd5f4bc Add performance oriented refactor for color palette components 2025-01-16 21:04:49 +01:00
Denys Kisil
505a2ecb40 🌐 Add translations for: Ukrainian (ukr_UA).
Currently translated at 99.1% (1582 of 1595 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ukr_UA/
2025-01-16 20:00:42 +01:00
Andrey Antukh
4389750c54 Merge pull request #5596 from penpot/xaviju-9419-swatch-storybook
[TOKENS] 📚 Add gradients to storybook swatch component
2025-01-16 19:00:05 +01:00
Andrey Antukh
6d666c4926 🐛 Fix not properly display library color 2025-01-16 18:58:48 +01:00
Andrey Antukh
f32531b39f ♻️ Refactor how click is handled on assets panel
Remove deep partial application with simple return value signal
if default click handler is intercepted or not.
2025-01-16 18:58:45 +01:00
Andrey Antukh
99d7b7ebf8 ♻️ Use correct function for color transformation
Regression introduced in previous refactor PR
2025-01-16 17:58:04 +01:00
Andrey Antukh
42acdbd135 ♻️ Reorganize common types tests 2025-01-16 17:55:28 +01:00
Andrey Antukh
6b3f70e94b Remove props conversion overhead from measures-menu component 2025-01-16 15:45:14 +01:00
Andrey Antukh
ef7fbc09b0 Add minor optimization to type->options resolution on measures-menu 2025-01-16 15:45:14 +01:00
Andrey Antukh
0b18177925 Add efficiency optimizations to frame options component 2025-01-16 15:45:14 +01:00
Andrey Antukh
9b2315d39d Remove props conversion overhead on shape-options component
With using new rumext call convention with :> handler and * on the
component name.
2025-01-16 15:45:14 +01:00
Andrey Antukh
12fa4fdef5 💄 Add cosmetic changes to common libraries logic ns 2025-01-16 15:45:14 +01:00
Andrey Antukh
e7b0e253d4 Use new convention for components for workspace right and left sidebar 2025-01-16 15:45:14 +01:00
Andrey Antukh
b6aaba456e Merge pull request #5493 from penpot/niwinz-enhancements-1
♻️ Refactor state locality
2025-01-16 15:44:40 +01:00
Andrey Antukh
85746e7cb2 ♻️ Refactor state locality
The main purpose of this refactor is reduce
a custom state from different pages and unify
them under common access patterns
2025-01-16 15:31:18 +01:00
Andrey Antukh
f62aecb383 🐛 Fix incompatibility of binfile exportation with offload feature 2025-01-16 14:37:55 +01:00
Xaviju
c788c9be7a 📚 Add gradients to storybook swatch component 2025-01-16 14:10:36 +01:00
Pablo Alba
fc4221b047 🐛 Fix missing cleanup of storage on bad plugin url 2025-01-16 12:57:28 +01:00
Andrei Fëdorov
5793c526c0 🐛 Fix token file import of Figma generated file (#5591)
* 🐛 Fix token sets selection representation in exported theme

* 🐛 Fix the loss of token set order

* 🐛 Change data shape according to internal representaion

* 🐛 Persist sets order on import according to metadata

* 🐛 Add fallback for nil values

* 🐛 Fix test assertions accoding to the exported json format

* 🐛 Make `:is-source` optional

* ♻️ Fix test description

* ♻️ Remove outdated comment
2025-01-16 12:38:03 +01:00
Andrey Antukh
cf82e42125 Merge remote-tracking branch 'origin/staging' into develop 2025-01-16 12:23:50 +01:00
Andrey Antukh
9594e72bef Merge remote-tracking branch 'origin/staging' into develop 2025-01-16 12:20:45 +01:00
Andrey Antukh
cb650ebf1c Merge remote-tracking branch 'origin/staging' into develop 2025-01-16 10:45:22 +01:00
Andrey Antukh
0c47400802 Merge pull request #5595 from penpot/hiru-fix-detach
🐛 Fix detach when top copy is dangling and nested copy is not
2025-01-15 16:21:12 +01:00
Andrey Antukh
b81f4e913f Merge pull request #5581 from penpot/eva-fix-broken-token-context-menu 2025-01-15 16:18:05 +01:00
luisδμ
66f8ac44e4 Merge pull request #5597 from penpot/fix-problem-comment-area
🐛 Fix problem growing text area
2025-01-15 15:41:12 +01:00
Andrés Moya
933f4410d2 🐛 Fix detach when top copy is dangling and nested copy is not 2025-01-15 15:26:39 +01:00
alonso.torres
007740c106 🐛 Fix problem growing text area 2025-01-15 15:00:11 +01:00
Xaviju
e1b85c8fe6 📚 Add semantics and accessibility requirements 2025-01-15 10:25:07 +01:00
Juanfran
04c8063b4e Merge pull request #5590 from penpot/juanfran-add-set-name-to-tokens-panel-list
[Tokens]  Add set name to tokens panel list
2025-01-15 09:34:47 +01:00
Juanfran
ccbb233866 Add set name to tokens panel list 2025-01-15 09:18:28 +01:00
Andrey Antukh
a55945d7b1 Merge remote-tracking branch 'origin/staging' into develop 2025-01-14 17:47:54 +01:00
Pablo Alba
e106f66ac6 Keep plugin url when user is not logged 2025-01-14 17:31:09 +01:00
Pablo Alba
2f5f31814a 🎉 Allow import a template from a link 2025-01-14 17:31:09 +01:00
luisδμ
0d70ceb264 Merge pull request #5584 from penpot/ddb-comments-fixes
 Open comments from email with parameter
2025-01-14 16:44:19 +01:00
luisδμ
720af06296 Merge pull request #5576 from penpot/ddb-copy-paste-props
 Copy/paste properties an CSS
2025-01-14 16:43:52 +01:00
alonso.torres
920638a149 Open comments from email with parameter 2025-01-14 16:28:48 +01:00
alonso.torres
714a274789 Copy/paste properties an CSS 2025-01-14 16:09:42 +01:00
Andrey Antukh
80d6968156 Merge pull request #5557 from penpot/niwinz-enhancements-4
 Add the ability to export helpers for storybook
2025-01-14 15:38:26 +01:00
Belén Albeza
4d4bf1edd1 Merge pull request #5529 from penpot/azazeln28-refactor-panning-perf
♻️ Refactor panning perf
2025-01-14 15:26:03 +01:00
Eva Marco
68a0d74f0e 🐛 Fix text ellipsis on long token names and grouped tokens 2025-01-14 13:21:42 +01:00
Stas Haas
e7a7db15fb 🌐 Add translations for: German.
Currently translated at 94.3% (1505 of 1595 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2025-01-14 13:00:43 +01:00
Andrey Antukh
55cbc98e55 Add the ability to export helpers for storybook
Also add a note for how pass complex objects on swatch component
2025-01-14 12:43:12 +01:00
Aitor Moreno
97946fc847 Merge pull request #5538 from penpot/ladybenko-rounded-corners
🎉 Rounded corners for rects (wasm)
2025-01-14 12:34:33 +01:00
Belén Albeza
6e7a8c239c 🎉 Implement rounded corners 2025-01-14 11:26:38 +01:00
Andrey Antukh
cd630862d2 Merge pull request #5582 from penpot/niwinz-merge-staging-1
Merge staging into develop
2025-01-14 10:47:25 +01:00
Andrey Antukh
c3d4444c0c Merge remote-tracking branch 'origin/staging' into niwinz-merge-staging-1 2025-01-14 10:35:34 +01:00
Eva Marco
6eea633ca9 🐛 Fix some problems with error handling 2025-01-14 10:24:04 +01:00
Eva Marco
dea866d3a3 🐛 Show icon on broken color reference instead of swatch 2025-01-14 10:07:09 +01:00
Eva Marco
5ce4b0a927 🐛 Delete empty or fuzzy translations 2025-01-14 10:05:12 +01:00
Andrey Antukh
576c912c81 Merge pull request #5574 from penpot/luis-9234-visual-changes-in-comments-fixes
🐛 Fixes several bugs related to new comments
2025-01-13 17:55:34 +01:00
luisddm
658c3309a5 ♻️ Use recommended rumext syntax 2025-01-13 16:55:44 +01:00
AzazelN28
10b32de447 ♻️ Refactor panning/zoom rendering 2025-01-13 15:53:23 +01:00
luisddm
63c3b9987b 🐛 Fix multiline input in comments 2025-01-13 15:14:15 +01:00
Andrey Antukh
a5b2f0e4c3 Merge pull request #5567 from penpot/juanfran-add-component-testing-to-ci
 add component testing to CI
2025-01-13 15:00:39 +01:00
Xaviju
aa9f5fc18f ♻️ Add new swatch size 2025-01-13 14:40:33 +01:00
Eva Marco
9aec9fe6c5 Merge pull request #5570 from penpot/yms-fix-typo
📎 fix typo
2025-01-13 14:14:54 +01:00
Andrey Antukh
b7e6af5538 Merge pull request #5549 from penpot/superalex-fix-strokes-dont-update-correctly
🐛 Fix strokes don't update correctly
2025-01-13 13:42:46 +01:00
Juanfran
7b2c17cc97 Add component testing to CI 2025-01-13 13:24:07 +01:00
Yamila Moreno
780f97216a 📎 fix typo 2025-01-13 13:20:49 +01:00
Andrey Antukh
bebc189061 📎 Clear cache on watch:app and build:app scripts 2025-01-13 13:14:39 +01:00
Alejandro Alonso
642b6b1621 🐛 Fix strokes don't update correctly 2025-01-13 13:14:39 +01:00
luisddm
1662fe5b01 🐛 Fix bubbles getting displaced when thread does not fit in viewport 2025-01-13 12:50:19 +01:00
luisddm
3518f8160c 🐛 Fix passing clojure map as js map 2025-01-13 11:24:32 +01:00
Eva Marco
3af44641de Merge pull request #5566 from penpot/juanfran-storybook-icon-id-prop-fix
🐛 fix icon id prop in storybook
2025-01-13 10:48:01 +01:00
Alejandro
be9c4cc96e Merge pull request #5556 from penpot/niwinz-enhancements-3
 Minor enhancements and rumext reverts
2025-01-13 10:42:05 +01:00
Juanfran
a8105f4a0c 🐛 fix icon id prop in storybook 2025-01-13 10:23:42 +01:00
Belén Albeza
307834b276 Merge pull request #5553 from penpot/niwinz-bugfix-4
Fix incorrect navigate event on component show main instance action
2025-01-13 09:53:28 +01:00
Belén Albeza
10f2d5d09d Merge pull request #5534 from penpot/superalex-render-wasm-blur-support
🎉 Render wasm blur support
2025-01-13 09:42:53 +01:00
Alejandro Alonso
7cc33b1a1a 🎉 Render wasm blur support 2025-01-13 07:48:11 +01:00
Andrey Antukh
717c447f32 ⬆️ Update rumext to v2.20
It includes:

- a revert for recursive transformations for :> handler
- a revert for use-state stable reference handling
- a partial support for malli decoding on props validation
2025-01-10 17:12:06 +01:00
Andrey Antukh
1e20fd7bb6 Log old id on importing binfile-v3 media entries 2025-01-10 17:08:03 +01:00
Andrey Antukh
ff4f0ca1d2 Merge pull request #5554 from penpot/eva-fix-token-status-icon
🐛  Fix token status icon id
2025-01-10 16:02:26 +01:00
Eva Marco
cac323d6b1 🐛 Fix token status icon id 2025-01-10 15:42:40 +01:00
Andrey Antukh
c18a9e5e04 💄 Add minor cosmetic changes to components context menu 2025-01-10 15:10:29 +01:00
Andrey Antukh
4c6e0c1651 🐛 Fix incorrect navegation event to component main instance
when the main instance is located in the same file but a different
page
2025-01-10 15:09:30 +01:00
Andrey Antukh
ceb10bd43c Merge remote-tracking branch 'origin/staging' into develop 2025-01-10 15:01:32 +01:00
Eva Marco
7c2ccb77ae Merge pull request #5552 from penpot/juanfran-toast-storybook-input-error
🐛 fix storybook toast icon prop name
2025-01-10 14:53:40 +01:00
Juanfran
58563f9d54 🐛 fix storybook toast icon prop name 2025-01-10 14:44:50 +01:00
Andrey Antukh
356a28bd7b Merge pull request #5546 from penpot/ladybenko-9061-fix-group-blur
🐛 Fix group blur toggle button icon not updating
2025-01-10 14:38:10 +01:00
Andrey Antukh
1e5af82e03 Merge pull request #5550 from penpot/eva-token-merge-regresion
🐛 Fix regresion on icon* id because of token merge
2025-01-10 14:35:20 +01:00
Eva Marco
0d9db14293 🐛 Fix regresion on icon* id because of token merge 2025-01-10 14:22:33 +01:00
Eva Marco
617a1060a9 Merge pull request #5541 from penpot/fix/juanfran-fix-combobox-design-review
🐛 design review t#9539
2025-01-10 14:14:47 +01:00
Amerey.eu
a83798a773 🌐 Add translations for: Czech.
Currently translated at 98.9% (1579 of 1595 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/cs/
2025-01-10 14:00:33 +01:00
Nicola Bortoletto
0224626f80 🌐 Add translations for: Italian.
Currently translated at 99.1% (1582 of 1595 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2025-01-10 14:00:32 +01:00
Marina López
decec5d152 Merge pull request #5548 from penpot/alotor-bugs-2
🐛 Fix problem selecting shapes wont expand parent
2025-01-10 13:22:27 +01:00
alonso.torres
0f7e06207c 🐛 Fix problem selecting shapes wont expand parent 2025-01-10 13:09:10 +01:00
Juanfran
a69e671a90 🐛 design review t#9539 2025-01-10 12:55:56 +01:00
Marina López
eba2ef91e6 Merge pull request #5544 from penpot/eva-fix-collapsable-button
🐛  Fix collapsable button icon id
2025-01-10 12:48:33 +01:00
Belén Albeza
a71fdd091a 🐛 Fix group blur toggle button icon not updating 2025-01-10 12:14:22 +01:00
Eva Marco
6d34ce58fa 🐛 Fix collapsable button icon id 2025-01-10 11:55:54 +01:00
Andrey Antukh
06c5bbb1ba Merge remote-tracking branch 'origin/staging' into develop 2025-01-10 11:53:46 +01:00
Andrey Antukh
fb84e6d00d Merge pull request #5531 from penpot/marina/improve-zoom-to-frame
🐛 Avoid loading the overview before zoom to frame
2025-01-10 11:00:21 +01:00
Andrey Antukh
50125fe264 🎉 Merge tokens-studio/develoo into develop
commit 82cdf41cc0
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Thu Jan 9 18:43:35 2025 +0100

    💄 Fix lint

commit 29a9d39ecb
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Thu Jan 9 18:34:07 2025 +0100

    🔧 Disable broken test

commit 41e6471cc6
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Thu Jan 9 18:24:06 2025 +0100

    🐛 Small fix

commit 6a68411120
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Thu Jan 9 18:06:23 2025 +0100

     Some code enhancements

commit 170a51f9e5
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Thu Jan 9 14:52:24 2025 +0100

    🔧 Fix merge

commit e9e468ee37
Merge: d980ff05c e5f865099
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Thu Jan 9 14:27:19 2025 +0100

    Merge remote-tracking branch 'origin/develop' into token-studio-develop

commit e5f8650994
Merge: 7e71a26c5 74f807d53
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Thu Jan 9 13:42:00 2025 +0100

    Merge branch 'develop' of github.com:penpot/penpot into develop

commit d980ff05cd
Author: Xaviju <xaviju@gmail.com>
Date:   Tue Jan 7 12:28:41 2025 +0100

    ♻️ refactor swatch component

commit 0c80bf76b8
Merge: a5a1d3af3 97c35a8f9
Author: Eva Marco <evamarcod@gmail.com>
Date:   Thu Jan 9 09:52:53 2025 +0100

    Merge pull request #406 from tokens-studio/eva-token-bugfixing

    Eva token bugfixing

commit a5a1d3af3c
Author: Eva Marco <evamarcod@gmail.com>
Date:   Wed Jan 8 12:25:48 2025 +0100

    🐛 Fix open border radius on token applied

commit 97c35a8f9b
Author: Eva Marco <evamarcod@gmail.com>
Date:   Wed Jan 8 14:28:33 2025 +0100

    🐛 Fix token pill on multiselect

commit 1f5903fa16
Author: Eva Marco <evamarcod@gmail.com>
Date:   Wed Jan 8 14:28:20 2025 +0100

    🐛 Fix partially applied token on Border radius

commit 791cb7e5fe
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jan 2 09:09:11 2025 +0100

     Implement set group toggling

commit d41b4b4e51
Author: Eva Marco <evamarcod@gmail.com>
Date:   Tue Jan 7 11:12:05 2025 +0100

    ♻️ Refactor border radius tooltips

commit 8a2754cae4
Merge: 3bd139286 328cc74c2
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Tue Jan 7 11:04:16 2025 +0100

    Merge pull request #402 from tokens-studio/move-sizing-before

    💄 Move spacing before sizing

commit 328cc74c2c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jan 7 10:55:08 2025 +0100

    💄 Move spacing before sizing

commit 3bd139286a
Merge: a9e20391d 1d608edb2
Author: Eva Marco <evamarcod@gmail.com>
Date:   Fri Jan 3 11:21:12 2025 +0100

    Merge pull request #399 from tokens-studio/eva-fix-border-radius-tooltip

    🐛 Fix border radius tooltip and padding on token pills

commit a9e20391d9
Merge: 6284f42a7 2a1f76ad1
Author: Eva Marco <evamarcod@gmail.com>
Date:   Fri Jan 3 11:20:58 2025 +0100

    Merge pull request #353 from tokens-studio/eva-fix-context-menu

    ♻️ Fix context menu

commit 1d608edb27
Author: Eva Marco <evamarcod@gmail.com>
Date:   Thu Jan 2 14:02:44 2025 +0100

    🐛 Fix layout error and tooltip

commit 2a1f76ad1a
Author: Eva Marco <evamarcod@gmail.com>
Date:   Fri Nov 22 13:54:41 2024 +0100

    ♻️ Fix context menu

commit 6284f42a70
Merge: 272b60969 4e22a7c03
Author: Eva Marco <evamarcod@gmail.com>
Date:   Thu Jan 2 10:36:21 2025 +0100

    Merge pull request #389 from tokens-studio/eva-fix-double-click-cancel

    🐛 Fix double click when canceling a modal

commit 272b609691
Merge: 71f656cc5 f867cb110
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Thu Jan 2 08:53:13 2025 +0100

    Merge pull request #392 from tokens-studio/andrei/338-fix-positioning-of-a-stroke-created-by-token-application

     Change default storke alignment if it's created by token

commit f867cb110f
Author: Andrey Fedorov <oran9e.red@gmail.com>
Date:   Wed Dec 18 10:02:31 2024 +0100

     Fix stroke alignment test

commit f1034c6bcb
Author: Andrey Fedorov <oran9e.red@gmail.com>
Date:   Wed Dec 18 09:53:55 2024 +0100

     Change default storke alignment if it's created by token application

commit 71f656cc5e
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Dec 13 15:45:25 2024 +0100

    🐛 Fix sets breaking from merge

commit fa642d7717
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Dec 13 13:07:34 2024 +0100

    🐛 Fix CI breaking

commit 17a873e9f8
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Fri Dec 13 15:01:22 2024 +0100

    🔧 Restore some things broken in merge

commit d70b101aa1
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Fri Dec 13 13:12:21 2024 +0100

    🔧 A little cleanup

commit d453b584ee
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Fri Dec 13 11:30:21 2024 +0100

    🎉 Add script to un CI tests in dev env

commit 78819c68c9
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Fri Dec 13 11:19:18 2024 +0100

    🐛 Fix border radius and fills tokens

commit 4e22a7c039
Author: Eva Marco <evamarcod@gmail.com>
Date:   Fri Dec 13 10:30:32 2024 +0100

    🐛 Fix double click when canceling a modal

commit cd6d5491fa
Merge: 46a60bc71 7e71a26c5
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Thu Dec 12 17:16:07 2024 +0100

    Merge remote-tracking branch 'origin/develop' into token-studio-develop

commit 7e71a26c50
Merge: 4f845b5c4 1c76587d7
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Thu Dec 12 11:44:24 2024 +0100

    Merge branch 'develop' of github.com:penpot/penpot into develop

commit 46a60bc714
Merge: 797374b2b d899fd687
Author: Eva Marco <evamarcod@gmail.com>
Date:   Thu Dec 12 10:12:42 2024 +0100

    Merge pull request #348 from tokens-studio/eva-token-pill

     Add token status pills

commit 797374b2ba
Merge: edfa80d5b a7c59bb41
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed Dec 11 17:25:56 2024 +0100

    Merge pull request #383 from tokens-studio/andrei/export-import-themes

      Import/Export: Themes #306 [WIP]

commit a7c59bb413
Merge: 2264efa1c 90e0021ce
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed Dec 11 17:25:35 2024 +0100

    Merge pull request #384 from tokens-studio/andrei/369-export-on-file-without-tokens-crashes

    🐛 Export on file without tokens crashes [WIP]

commit 2264efa1cd
Author: Andrey Fedorov <oran9e.red@gmail.com>
Date:   Wed Dec 11 17:13:23 2024 +0100

     Exclude hidden theme

commit 90e0021cec
Author: Andrey Fedorov <oran9e.red@gmail.com>
Date:   Wed Dec 11 13:18:48 2024 +0100

    🐛 Fix export crash when there's no tokens in the project

commit edfa80d5b1
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Wed Dec 11 14:25:24 2024 +0100

    🎉 Automatically unapply tokens when user changes attr values

commit 7e8de9aa24
Author: Andrey Fedorov <oran9e.red@gmail.com>
Date:   Tue Dec 10 12:01:40 2024 +0100

     Fix encoding/decoding tests

commit d0ad149e20
Author: Andrey Fedorov <oran9e.red@gmail.com>
Date:   Tue Dec 10 07:54:48 2024 +0100

     Add themes data to decoding

commit 19ce9e8ce3
Author: Andrey Fedorov <oran9e.red@gmail.com>
Date:   Tue Dec 10 11:55:33 2024 +0100

     Include themes to dtcg encoding

commit 9d67d007fb
Author: Andrey Fedorov <oran9e.red@gmail.com>
Date:   Mon Dec 9 16:32:14 2024 +0100

    📎 Remove trailing space

commit 05ec84ca1b
Merge: 15ba0746c 78d743406
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Tue Dec 10 17:45:55 2024 +0100

    Merge pull request #381 from tokens-studio/florian/rename-set-groups

     Token set group renaming

commit 78d743406b
Merge: 85ed6f140 15ba0746c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Dec 10 17:31:38 2024 +0100

    Merge remote-tracking branch 'origin/token-studio-develop' into florian/rename-set-groups

commit 15ba0746c6
Merge: 88fdafa2c 6e7a5e5c7
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Tue Dec 10 17:23:09 2024 +0100

    Merge pull request #379 from tokens-studio/florian/computed-set-checkmark

    Display computed checkmark next to token set groups

commit 6e7a5e5c7f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Dec 10 17:15:40 2024 +0100

    ♻ Use dm/str

commit 88fdafa2c6
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Mon Dec 2 15:50:20 2024 +0100

    🎉 Add tests to check all types of tokens

commit d51a2640bf
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Thu Nov 28 16:36:10 2024 +0100

    🐛 Avoid marking copies touched when changing token values

commit 99c30dd44f
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Tue Nov 26 19:40:21 2024 +0100

    🎉 Add frontend unit tests

commit ddec03966d
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Tue Nov 26 11:23:02 2024 +0100

    🔧 Partial refactor to move things to common.types

commit d378937a37
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Thu Nov 21 16:39:43 2024 +0100

    🎉 Set touched groups when changing tokens in copies

commit 6077ba6690
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Tue Nov 19 16:14:02 2024 +0100

     Synchronize tokens in components

commit 85ed6f1409
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Dec 10 14:50:34 2024 +0100

    ♻ Unique naming

commit d546bc04f8
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Dec 10 14:49:30 2024 +0100

    ♻ Update docstring

commit d899fd687f
Author: Eva Marco <evamarcod@gmail.com>
Date:   Tue Nov 19 08:37:32 2024 +0100

     Add token status pills

commit 5bac53ea03
Merge: aa292e482 2a766a719
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Dec 10 14:29:00 2024 +0100

    Merge remote-tracking branch 'origin/token-studio-develop' into florian/computed-set-checkmark

commit aa292e4829
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Dec 10 14:04:32 2024 +0100

    🐛 Fix missing active sets in set groups showing partial selection

commit 5ff3469da7
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Dec 10 14:04:11 2024 +0100

    ♻ Accessible checkbox

commit ddc30b7a3c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Dec 9 15:09:44 2024 +0100

     Rename set groups

commit 2a766a7190
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Dec 9 11:52:08 2024 +0100

    ♻ Fix lint

commit 82ce61ef49
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Dec 9 11:44:16 2024 +0100

    ♻ Fix lint

commit 09e5d88835
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Dec 4 17:36:58 2024 +0100

    ♻ Cleanup

commit 8b569005e1
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Dec 4 17:16:35 2024 +0100

     Display active state of children checkmark next to set groups in themes modal

commit 07e3f581d3
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Dec 4 16:58:43 2024 +0100

     Display active state of children checkmark next to set groups

commit 9318c10172
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Dec 4 16:21:09 2024 +0100

     Add function to compute active state of nested sets

commit c6f643b7d5
Merge: bb337361b b9ada1f52
Author: Eva Marco <evamarcod@gmail.com>
Date:   Wed Dec 4 15:53:07 2024 +0100

    Merge pull request #377 from tokens-studio/florian/fix-color-token-bug

    Fix color token bug

commit b9ada1f520
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Dec 3 17:58:30 2024 +0100

    🐛 Fix color token only applying fill

commit 4a06cc04d8
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Dec 3 17:42:40 2024 +0100

     Add test for applying colors

commit bb337361b8
Merge: 1a2fb4e29 ab0cd29af
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Tue Dec 3 17:11:02 2024 +0100

    Merge pull request #371 from tokens-studio/rebase-ui-updates

    Sets UI Updates

commit ab0cd29af9
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Dec 3 17:08:29 2024 +0100

    🚧 Add todo

commit b875804bce
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Dec 3 17:07:46 2024 +0100

    ♻ Use use-fn

commit 656afa8a35
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Dec 3 15:48:54 2024 +0100

    ♻ PR Feedback

commit 1a2fb4e299
Merge: f0735417f 1a1a535e4
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Tue Dec 3 12:47:20 2024 +0100

    Merge pull request #372 from tokens-studio/andrei/fix-token-context-menu-order

     Reorder token context menu

commit 1a1a535e47
Author: Andrey Fedorov <oran9e.red@gmail.com>
Date:   Tue Dec 3 11:19:49 2024 +0100

     Reorder token context menu

commit 53229c03d6
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Dec 3 11:13:51 2024 +0100

     Add context menu item for set groups

commit d34c88b6e4
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Dec 3 10:01:18 2024 +0100

    🐛 Fix selecting a set in the sidebar toggling the active state

commit 1f6512cff0
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Nov 28 10:16:30 2024 +0100

    ♻ Remove unused ref

commit c9414824a5
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Nov 28 09:46:21 2024 +0100

    ♻ Remove unused token files

commit 384616c9a8
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Nov 28 09:32:11 2024 +0100

    ♻ Rename to match ITokenSet glossary

commit 42ee08445b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Nov 28 09:24:16 2024 +0100

     💄 Make sets section not collapsable anymore

commit 27d0f0a7bc
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Nov 28 09:16:38 2024 +0100

    🐛 Fix collapse button triggering rename

commit a0b2b4c55f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Nov 28 09:11:53 2024 +0100

    💄 Remove folder icon

commit 9c7e15f43f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Nov 28 09:09:56 2024 +0100

    💄 Disable group selection

commit f0735417f4
Author: Eva Marco <evamarcod@gmail.com>
Date:   Mon Nov 25 14:11:49 2024 +0100

    ♻️ Update download button icon

commit c8146cf0fe
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Mon Nov 25 16:50:08 2024 +0100

    🐛 Fix edit theme form auto submitting when pressing checkbox (II)

commit 030f074285
Merge: b0252eded 0ea226ede
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Fri Nov 29 12:39:14 2024 +0100

    Merge pull request #365 from tokens-studio/sets-naming

    Rename sets paths/name to match guidelines

commit 0ea226edec
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Nov 28 14:15:47 2024 +0100

    Naming

commit 997cb59ce3
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Nov 28 14:13:28 2024 +0100

    Naming

commit a28ed69113
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Nov 28 13:59:47 2024 +0100

    Fix arg

commit 5cbcdb77c9
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Nov 27 11:29:04 2024 +0100

    Fix token set deletion

commit 44105c2be2
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Nov 27 10:48:11 2024 +0100

    Rename selected-token-set-id -> selected-token-set-path

commit f2c6109dd9
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Nov 27 10:33:48 2024 +0100

    Rename

commit ffe2abc992
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Nov 27 10:22:23 2024 +0100

    Renaming

commit 8772cdf423
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Nov 26 10:59:40 2024 +0100

    Add cancel test

commit 7bce4ab425
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Nov 26 10:56:52 2024 +0100

    Add integration tests for creating sets

commit b5110c2222
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Nov 26 09:21:01 2024 +0100

    ♻ Pass elements directly

commit 18bb717699
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Nov 26 09:04:01 2024 +0100

    Adapt naming

commit d3b88446e2
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Nov 26 08:34:19 2024 +0100

    📚 Add glossary

commit b0252eded7
Merge: db01b6690 ca632c984
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Tue Nov 26 16:14:57 2024 +0100

    Merge pull request #359 from tokens-studio/pr-source-2

    Test deploy 2

commit ca632c9849
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Nov 26 15:09:49 2024 +0100

    Empty

commit db01b66905
Author: Juanfran <juanfran.ag@gmail.com>
Date:   Tue Nov 19 13:59:54 2024 +0100

    🐛 Fix modal overflow and column gap #9055

commit 97e5232b7d
Merge: 76b276073 e4460acfa
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Mon Nov 25 16:51:48 2024 +0100

    Merge pull request #352 from tokens-studio/e2e-tests

     Adds token creation e2e test

commit e4460acfae
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Nov 25 16:41:02 2024 +0100

    ♻ Extract common token setup logic, fix selector

commit 85fa635f66
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Nov 25 11:10:17 2024 +0100

     Check for auto-created set

commit 439ca4b52c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Nov 12 17:26:11 2024 +0100

     Add token creation test

commit 76b2760737
Author: Xaviju <xaviju@gmail.com>
Date:   Fri Nov 22 12:47:53 2024 +0100

    🐛 fix token input color swatch

commit 2464ae1eef
Merge: 0294695ac f79ccd52a
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Thu Nov 21 15:55:07 2024 +0100

    Merge pull request #350 from tokens-studio/sets-reference-bug

    Token Resolving Issues

commit f79ccd52aa
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Nov 21 15:42:20 2024 +0100

    🐛 Fix shape color being removed for missing token references

commit 584f8be751
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Nov 21 15:39:19 2024 +0100

    🐛 Show fallback color for selected inactive set

commit e7b07715a4
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Nov 21 15:38:53 2024 +0100

    🐛 Fix references between separate sets

commit 805432faec
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Nov 21 15:04:33 2024 +0100

    ⬆ Upgrade style-dictionary@4.0.0-prerelease.36

commit 0294695acf
Author: Xaviju <xaviju@gmail.com>
Date:   Thu Nov 21 13:52:57 2024 +0100

    💄 add removed labeled input CSS and improve component slot

commit 0a70f3ccfc
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Thu Nov 21 11:47:11 2024 +0100

    🔧 Pass tests in the CI

commit ddbe53a0ee
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Thu Nov 21 11:25:04 2024 +0100

    💄 Fix linter errors

commit bf1efdc4b6
Merge: faee45de4 7b57509d2
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Thu Nov 21 09:08:27 2024 +0100

    Merge remote-tracking branch 'origin/develop' into token-studio-develop

commit faee45de47
Merge: 133759de9 f1bda7b1f
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed Nov 20 16:26:21 2024 +0100

    Merge pull request #336 from tokens-studio/develop-merge

    Develop Sync

commit f1bda7b1f1
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Nov 20 16:12:21 2024 +0100

    🐛 Fix dropdown menu position out of bounds

commit 75a044e453
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Nov 20 16:03:54 2024 +0100

    🐛 Fix token deletion

commit 9819239d58
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Nov 20 15:53:46 2024 +0100

    🐛 Fix new set not working with no sets

commit 228080043f
Merge: 133759de9 59fdf64c6
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Nov 20 14:51:29 2024 +0100

    Merge remote-tracking branch 'penpot/develop' into token-studio-develop

commit 133759de97
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Nov 20 14:30:56 2024 +0100

    🐛 Fix set creation

commit 3745475252
Merge: 1d2c7dd20 58278867c
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed Nov 20 14:00:28 2024 +0100

    Merge pull request #327 from tokens-studio/named-set-groups-3

    Sets & Sets Group UI

commit 58278867cc
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Nov 20 13:59:09 2024 +0100

    🐛 Fix sets tree not working in themes modal

commit 3afdc72a4e
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Nov 20 13:46:01 2024 +0100

     Restore new sets input

commit a19d85fb10
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Nov 19 16:43:37 2024 +0100

     Render sets and set groups tree

commit 1d2c7dd20e
Merge: 16a90f5e1 a77dd138b
Author: Eva Marco <evamarcod@gmail.com>
Date:   Tue Nov 19 08:43:17 2024 +0100

    Merge pull request #335 from tokens-studio/9310-color-picker

    Color picker full inline size

commit a77dd138b8
Author: Xaviju <xaviju@gmail.com>
Date:   Mon Nov 18 15:11:05 2024 +0100

    💄 allow colorpicker to fill inline space

commit 16a90f5e17
Author: Xaviju <xaviju@gmail.com>
Date:   Mon Oct 28 14:54:20 2024 +0100

     Refactor create token modal

commit 5e0bb5025b
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Wed Nov 13 14:22:57 2024 +0100

    💄 Change naming to conform with Penpot DS

commit bba504a16b
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Wed Nov 13 13:34:09 2024 +0100

    🐛 Fix edit theme form auto submitting when pressing checkbox

commit 2a8ea8db62
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Tue Nov 12 15:45:37 2024 +0100

    🐛 Fix edit button not centered

commit 43b90e764d
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Tue Nov 12 14:25:56 2024 +0100

    🐛 Fix font size of token edit modal

commit 16952a7087
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Tue Nov 12 14:09:38 2024 +0100

    🐛 Fix spacing of theme edit modal

commit ac9735ef03
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Tue Nov 12 14:03:18 2024 +0100

    🐛 Fix new theme modal not opening

commit 951543ae0a
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Wed Oct 30 00:57:11 2024 +0100

    ♻️ Refactor tokens exports toolbar

commit b3c5f8f695
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Thu Nov 7 17:52:14 2024 +0100

    🐛 Hide empty message when creating set

commit cfaf9b8890
Merge: 83e34f5ff 332ecd3f4
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Thu Nov 14 16:14:30 2024 +0100

    Merge pull request #332 from tokens-studio/fix-unit-tests-2

    ♻ Re-enable token tests

commit 83e34f5fff
Merge: b4440aad0 76b763b64
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed Nov 13 10:27:27 2024 +0100

    Merge pull request #323 from tokens-studio/named-set-groups

    ♻ Remove TokenSetGroup [*]

commit 76b763b648
Merge: 3ff084e77 7044c17d8
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed Nov 13 10:27:19 2024 +0100

    Merge pull request #324 from tokens-studio/named-set-groups-2

    Allow sets and set groups at the same level

commit 7044c17d89
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Nov 5 15:48:37 2024 +0100

    ♻ Allow token set grouping - Remove slash to dash conversion

commit 3c5c9a8e14
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Nov 5 15:29:31 2024 +0100

    ♻ Add a prefix to sets and set groups

commit 3ff084e77a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Nov 12 14:03:04 2024 +0100

    ♻ Update only TokensLib to 1.1

commit 332ecd3f4b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Nov 12 13:44:48 2024 +0100

    ♻ Re-enable token tests

commit 3869bcf754
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Nov 5 13:13:31 2024 +0100

    ♻ Remove TokenSetGroup [*]

    [*] We do not need meta data on set groups, this was only necessary for
    defining order in TokensStudio and is not relevant for token implementations.

commit b4440aad04
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Fri Nov 8 16:08:07 2024 +0100

    🔧 Fix wrong code in merge

commit 5fee74cea8
Merge: a34207634 4f845b5c4
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Fri Nov 8 12:38:59 2024 +0100

    Merge remote-tracking branch 'origin/develop' into token-studio-develop

commit 4f845b5c4d
Merge: fb3f74e74 960f095c1
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Fri Nov 8 12:38:34 2024 +0100

    Merge remote-tracking branch 'upstream/develop' into develop

commit a34207634b
Merge: a757556e9 2c4eb96ab
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Fri Nov 8 12:12:31 2024 +0100

    Merge pull request #328 from tokens-studio/fix-merge-issues

    [WIP] Restore style-dictionary prerelease

commit 2c4eb96ab1
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Nov 8 12:03:58 2024 +0100

    Remove comment block

commit 424b930990
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Nov 8 11:59:08 2024 +0100

    Remove patch file

commit cfd291db5e
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Nov 8 11:46:42 2024 +0100

    Restore default

commit c76569e4b7
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Nov 8 11:40:31 2024 +0100

    Downgrade

commit 456da5a46e
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Nov 8 10:16:29 2024 +0100

    🐛 Fix name on fnc crashing the process

commit 072cec7a22
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Nov 8 09:58:42 2024 +0100

    Add testing block

commit a757556e9c
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Thu Nov 7 18:32:09 2024 +0100

    Revert "🐛 Fix import of tinycolor2"

    This reverts commit 8e4574888d.

commit 8e4574888d
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Thu Nov 7 18:17:24 2024 +0100

    🐛 Fix import of tinycolor2

commit 78a1a615d9
Merge: a910f06b2 fb3f74e74
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Thu Nov 7 14:07:58 2024 +0100

    Merge remote-tracking branch 'origin/develop' into token-studio-develop

commit fb3f74e74f
Merge: 20590a5d1 96f8832bc
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Thu Nov 7 14:06:45 2024 +0100

    Merge remote-tracking branch 'upstream/develop' into develop

commit 20590a5d18
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Thu Nov 7 14:02:55 2024 +0100

    🔧 fix

commit e9c32841a9
Merge: 040a94f71 33ff74e53
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Thu Nov 7 13:49:11 2024 +0100

    Merge remote-tracking branch 'upstream/develop' into develop

commit a910f06b2f
Merge: b3b8121d6 3d99c2a5e
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed Nov 6 16:26:19 2024 +0100

    Merge pull request #326 from tokens-studio/stroke-context-menu

    [WIP]  Allow setting stroke-color via context-menu

commit 3d99c2a5eb
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Nov 6 15:43:20 2024 +0100

     Allow setting stroke-color via context-menu

commit 040a94f719
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Tue Nov 5 13:16:56 2024 +0100

    🔧 Disable tokens in dev env by default

commit b3b8121d60
Merge: 32865c41c a33e0a386
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Mon Nov 4 13:45:44 2024 +0100

    Merge pull request #320 from tokens-studio/fix-dot-rename

    🐛 Fix renaming token to other namespace not working

commit a33e0a386e
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Nov 4 13:43:38 2024 +0100

    ♻️Ensure collection return

commit 32865c41c9
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 30 08:49:30 2024 +0100

    ♻ Remove zip.js compability warning when starting shadow-cljs

commit 315431fd49
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Mon Nov 4 13:02:32 2024 +0100

    🔧 Update dependencies

commit b47c5f9e60
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Thu Oct 31 15:18:39 2024 +0100

    🐛 Fix sidebar tabs when there are no design tokens

commit a1fd7a912e
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Wed Oct 30 10:52:08 2024 +0100

    🔧 Use bun only for dev env (is needed to run frontend tests)

commit 60761eec07
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Oct 29 17:06:32 2024 +0100

    🐛 Fix renaming token to other namespace not working

commit 62b859b84e
Merge: bc3ab8981 4f7622cb9
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Tue Oct 29 16:27:25 2024 +0100

    Merge pull request #318 from tokens-studio/fix-delete-set

    🐛 When deleting set remove it from theme

commit 4f7622cb93
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Oct 29 14:19:42 2024 +0100

    🐛 When deleting set remove it from theme

commit bc3ab8981e
Author: Eva Marco <evamarcod@gmail.com>
Date:   Fri Oct 25 14:54:00 2024 +0200

    ♻️ Review sets code and add DS components

commit bef648a63f
Merge: cd7763ca0 0923dcc43
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Mon Oct 28 09:06:34 2024 +0100

    Merge pull request #312 from tokens-studio/import-sd-2

     Import: Verify data with StyleDictionary

commit 0923dcc43f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Oct 25 14:40:14 2024 +0200

    ♻ Make `process-sd-tokens` more readable

commit cd7763ca08
Merge: a1c401594 0ff5df4b8
Author: Andrés Moya <hirunatan@hammo.org>
Date:   Thu Oct 24 14:50:56 2024 +0200

    Merge pull request #313 from tokens-studio/eva-review-themes

    ♻️  Review themes section

commit 0ff5df4b8d
Author: Eva Marco <evamarcod@gmail.com>
Date:   Wed Oct 23 16:28:30 2024 +0200

    ♻️ Review themes section

commit f5596b2b3f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Oct 24 10:13:03 2024 +0200

    🐛 Temporary fix for import on sets with groups (/ delimiter)

commit a1c401594c
Merge: 03ea5414b 52d8bed0f
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Thu Oct 24 09:42:25 2024 +0200

    Merge pull request #314 from tokens-studio/fix/deployment

    Fix/deployment

commit 52d8bed0fc
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Thu Oct 24 09:29:38 2024 +0200

    Remove all gimlet and custom workflow code

commit 66dce0e795
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Oct 22 10:14:47 2024 +0200

     Detect reference errors when importing tokens

commit d3ded00bc6
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 23 14:13:49 2024 +0200

    🐛 Fix text-editor missing from token tests

commit bf3880a21c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 23 10:05:24 2024 +0200

    🐛 Remove box shadow from supported tokens

commit 951f558d1f
Merge: fa8037c4b 03ea5414b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 23 12:05:58 2024 +0200

    Merge branch 'develop' into token-studio-develop

commit 7debdefa22
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Oct 21 16:03:19 2024 +0200

    🐛 Fix outdated notifications map

commit 03ea5414be
Author: Eva Marco <evamarcod@gmail.com>
Date:   Mon Oct 21 17:14:17 2024 +0200

    ♻️ Review create and edit modal

commit 31b5f5cefa
Author: Eva Marco <evamarcod@gmail.com>
Date:   Mon Oct 21 16:36:47 2024 +0200

    ♻️ Format code

commit 96af0f065d
Merge: 2bdbd81a1 77ba6c135
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Mon Oct 21 10:10:55 2024 +0200

    Merge pull request #310 from tokens-studio/fix-set-rename

    🐛 Keep selection when renaming set

commit 77ba6c135e
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Oct 21 10:08:03 2024 +0200

    🐛 Keep selection when renaming set

commit fa8037c4b5
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Oct 17 17:40:25 2024 +0200

    Deploy

commit 2bdbd81a19
Merge: aaac7fb04 9fe4919a2
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Thu Oct 17 17:11:05 2024 +0200

    Merge pull request #308 from tokens-studio/merge-develop-2

    Sync with upstream develop

commit 9fe4919a2b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Oct 17 17:04:19 2024 +0200

    Migrate msg -> ntf

commit 6af6dd1288
Merge: aaac7fb04 b4c2f2eca
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Oct 17 17:03:23 2024 +0200

    Merge branch 'develop' into token-studio-develop

commit aaac7fb041
Merge: 41dc6083c c6ed081a0
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Thu Oct 17 16:41:54 2024 +0200

    Merge pull request #305 from tokens-studio/dtcg-import

    DTCG Tokens Import / Export

commit c6ed081a0b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Oct 10 13:08:35 2024 +0200

     Implement token import / export

commit 41dc6083cf
Merge: bbf5fce0c 85fee87bc
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Thu Oct 10 12:41:38 2024 +0200

    Merge pull request #298 from tokens-studio/dnd

    Sets Drag & Drop

commit 85fee87bc4
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Oct 8 10:24:07 2024 +0200

    🎉 Token Sets dnd re-ordering

commit a85a7d2b2f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Oct 8 17:09:58 2024 +0200

    🐛 Fix logic in oassoc-in-before wher top items couldn't be move to bottom

commit bbf5fce0c9
Merge: bc4969c25 07beef572
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed Oct 9 13:21:38 2024 +0200

    Merge pull request #297 from tokens-studio/feature-flag

     Add feature flag for design tokens

commit 07beef5727
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 9 11:00:51 2024 +0200

    Remove $PENPOT_FLAGS from frontend deployment

commit 11c8fa468f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 9 10:30:59 2024 +0200

    Manually override ff flags

commit b0ec9034dc
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 9 10:09:45 2024 +0200

    Enable FF for gimlet

commit 18e0948b0c
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Mon Oct 7 14:16:08 2024 +0200

     Add feature flag for design tokens

commit bc4969c25d
Merge: d58932c2e 2baa1aa73
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Thu Oct 3 15:44:02 2024 +0200

    Merge pull request #296 from tokens-studio/fix-reference-color-preview

    Fix reference color preview

commit 2baa1aa734
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Oct 3 15:30:39 2024 +0200

    Show resolved color

commit b3e73b9abc
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Oct 3 15:18:41 2024 +0200

    Move over helper

commit 5de1f450c1
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Oct 3 15:14:38 2024 +0200

    Move over token value reference check function

commit d58932c2e5
Merge: 6f086326f 69cc9d02b
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Thu Oct 3 13:26:27 2024 +0200

    Merge pull request #290 from tokens-studio/refactor-themes-sets

    Refactor themes sets

commit 69cc9d02ba
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 17:23:04 2024 +0200

    Cleanup: item->token

commit d097b5b179
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 17:10:26 2024 +0200

    Cleanup

commit 921f4a6660
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 17:10:07 2024 +0200

    Restore all logic tests

commit 1097c1f282
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 17:02:10 2024 +0200

    Restore apply overwrite

commit f9a49f82f8
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 17:00:31 2024 +0200

    Restore apply-multiple

commit f2900c6519
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 16:57:53 2024 +0200

    Cleanup: Sort

commit 1df40ea07a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 16:57:20 2024 +0200

    Restore apply-tokens test

commit eceffda095
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 16:47:17 2024 +0200

    Added todo

commit e55f323d60
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 15:47:59 2024 +0200

    Fix tests

commit 2634388d09
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 14:37:24 2024 +0200

    Remove logging

commit fa6b8cb6de
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 14:31:56 2024 +0200

    Use d/nilf

commit 2b6075d1a2
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 14:21:18 2024 +0200

    Cleanup

commit 306a5e5f85
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 14:20:27 2024 +0200

    Sets don't have a specific order inside themes

commit 5170d328bd
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 14:19:02 2024 +0200

    Fix docstring

commit 4a818d55c8
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 14:18:49 2024 +0200

    Rename, fix docstring

commit bbdc9e95f7
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 14:17:20 2024 +0200

    Add todo

commit b12d5938e0
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 14:10:41 2024 +0200

    Replace generic arg name

commit 041e04dcb1
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 14:09:51 2024 +0200

    Remove unneeded ->

commit a235327c3e
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 11:33:14 2024 +0200

    Cleanup

commit 0ffcda404b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 11:09:52 2024 +0200

    Cleanup

commit 93cc8214fa
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 11:05:39 2024 +0200

    Fix border-radius and sizing panels

commit 845de5d885
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 10:52:48 2024 +0200

    Fix export

commit fdca6e4edf
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 10:46:55 2024 +0200

    Fix measures options

commit 028809f1d5
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 10:22:09 2024 +0200

    Cleanup

commit 053d0fc923
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 10:15:35 2024 +0200

    Cleanup function

commit 0b081d24e0
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 10:03:34 2024 +0200

    Only show warning when string has /

commit 669594e3c1
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 09:42:56 2024 +0200

    Cleanup

commit 57a133e09d
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 09:42:49 2024 +0200

    Add ordered tokens test

commit 43e5367988
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Oct 2 09:42:42 2024 +0200

    Fix testing from cljs

commit fa3e2c90e6
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Oct 1 15:45:14 2024 +0200

    Fix renaming via context menu

commit 7418d1fa2c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Oct 1 15:42:09 2024 +0200

    Dont support token set grouping for now

commit 3681678dc4
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Oct 1 14:40:05 2024 +0200

    Migrate token tests to tokens-lib

commit bca4ea3819
Merge: 9268b18e5 6f086326f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Oct 1 12:58:26 2024 +0200

    Merge remote-tracking branch 'origin/token-studio-develop' into refactor-themes-sets

commit 9268b18e56
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Oct 1 12:53:01 2024 +0200

    Fix edit button

commit f1f2767e2a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Oct 1 12:49:03 2024 +0200

    Activating initial sets by adding them to the token theme

commit 5825fa656b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Oct 1 09:56:03 2024 +0200

    Fix tests

commit 993df23624
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Oct 1 09:55:58 2024 +0200

    Remove unneeded tests

commit 442732117b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Oct 1 09:55:23 2024 +0200

    Disable logic tests for now (nee new setup)

commit 0d870610e1
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Oct 1 09:14:54 2024 +0200

    Fix infer warnings in tokens test

commit 231baac31d
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Sep 30 16:41:51 2024 +0200

    Fix renaming token creating new token

commit 4b39b6970a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Sep 30 16:26:26 2024 +0200

    Fix theme sets not being in order of the root order

commit c5173d2df8
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Sep 30 15:33:17 2024 +0200

    Remove hidden token theme when activating a theme

commit 0ea0834b1a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Sep 30 15:21:15 2024 +0200

    Cleanup

commit bfa90d0347
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Sep 30 15:18:26 2024 +0200

    Fix duplicate token event

commit b0d46e1767
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Sep 30 15:15:05 2024 +0200

    Cleanup

commit 3182ff1e15
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Sep 30 15:08:18 2024 +0200

    Cleanup

commit dc0a1c1555
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Sep 30 15:07:22 2024 +0200

    Cleanup

commit 18d120bbaa
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Sep 30 15:04:12 2024 +0200

    Fix token creation without set

commit c75ab61732
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Sep 30 14:44:42 2024 +0200

    Fix renamed theme staying in active-themes

commit df8f67b5d3
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Sep 30 13:52:50 2024 +0200

    Update workspace tokens

commit 1194eb7c61
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Sep 30 09:39:11 2024 +0200

    Remove unused functions

commit a49992a74e
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Sep 30 09:38:01 2024 +0200

    Fix token updating

commit 5d61ddb385
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Sep 30 09:33:35 2024 +0200

    Fix property applying

commit a59e391b38
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Sep 30 09:19:06 2024 +0200

    Fix token deletion menu

commit cfec4ae958
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Sep 30 09:08:14 2024 +0200

    Cleanup

commit 99a3ed98c9
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Sep 30 08:46:31 2024 +0200

    Only load context menu when open

commit 8c58ed80ac
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Sep 30 08:31:18 2024 +0200

    Fix id

commit 066ee9c489
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Sep 30 08:23:22 2024 +0200

    Tokens in sidebar

commit cce4014fbe
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Sep 27 15:36:07 2024 +0200

    Fix token create

commit b7cedf219b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Sep 27 11:21:30 2024 +0200

    Cleanup

commit 93ed1ded17
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Sep 27 11:14:34 2024 +0200

    Token resolving on add fixed

commit 1d50bacfbc
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Sep 26 17:21:02 2024 +0200

    Fix set renaming not being updated in themes

commit 7c4cbe5265
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Sep 26 16:40:38 2024 +0200

    Cleanup

commit 2f13814285
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Sep 26 16:37:30 2024 +0200

    Cleanup

commit 9f2b96332c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Sep 26 16:16:44 2024 +0200

    Fix up active themes tokens method

commit 577fa2bc81
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Sep 26 15:38:36 2024 +0200

    Cleanup

commit c8494c9931
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Sep 26 15:32:46 2024 +0200

    Remove unused

commit 3843253a5d
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Sep 26 15:27:16 2024 +0200

    Dont render starting slash

commit 5f6a76dfce
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Sep 26 15:24:02 2024 +0200

    Use currently active sets as sets for temporary theme

commit 29a2478bb5
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Sep 26 15:15:50 2024 +0200

    Fix theme group drop-down not updating group value

commit b3ff480e81
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Sep 26 15:08:54 2024 +0200

    Hide temporary theme

commit 2104fc04df
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Sep 26 14:28:27 2024 +0200

    Fix theme select

commit 9c97b31d28
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Sep 26 13:21:53 2024 +0200

    Fix theme creation/editing

commit 895f92e7c2
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Sep 26 12:03:03 2024 +0200

    Hide temporary token theme from user

commit e216d84484
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Sep 26 11:28:14 2024 +0200

    Set toggling without a theme

commit 6f086326f5
Merge: 2f4a012be c755b764a
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed Sep 25 16:22:20 2024 +0200

    Merge pull request #289 from tokens-studio/revert-288-active-themes

    Revert "Adds `active-themes` to `TokensLib`"

commit c755b764a2
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed Sep 25 16:21:53 2024 +0200

    Revert "Adds `active-themes` to `TokensLib`"

commit 0b2b8a71fb
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Sep 25 15:08:52 2024 +0200

    Token deletion

commit 9c1a509fa4
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Sep 25 14:59:20 2024 +0200

    Set renaming

commit d2ed6b5501
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Sep 25 14:45:31 2024 +0200

    Add set

commit 2f4a012beb
Merge: fb38e4378 6d75993fd
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed Sep 25 13:48:41 2024 +0200

    Merge pull request #288 from tokens-studio/active-themes

    Adds `active-themes` to `TokensLib`

commit 99e551925a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Sep 25 11:08:54 2024 +0200

    Updates

commit 4d4c4355ad
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Sep 25 08:33:34 2024 +0200

    Selection by name

commit ec96e7918d
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Sep 25 08:16:29 2024 +0200

    Token theme deletion

commit 844819a50c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Sep 24 15:25:29 2024 +0200

    Activate themes via lib

commit 4c327f38ef
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Sep 23 15:18:46 2024 +0200

    Replace sets

commit f5c122b0db
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Sep 20 14:42:48 2024 +0200

    Remove legacy

commit c6770f43c7
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Sep 20 14:38:53 2024 +0200

    Move out of legacy

commit 43e5e78053
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Sep 20 14:35:47 2024 +0200

    Cleanup

commit f5249196f9
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Sep 20 14:27:19 2024 +0200

    Sets sidebar

commit 501256f16b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Sep 20 09:34:54 2024 +0200

    Disable namespace loading info in console from shadow-cljs

commit 9b2993a344
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Sep 19 16:22:47 2024 +0200

    Fix theme select

commit 191d957984
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Sep 19 16:06:53 2024 +0200

    Use theme listing

commit 743f61f2cd
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Sep 19 15:44:56 2024 +0200

    Adding themes

commit 7758e48c48
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Sep 19 10:52:15 2024 +0200

    Add legacy macro

commit 80e8903754
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Sep 19 10:26:17 2024 +0200

    Refactor: Use tokens-lib for getting tokens theme

commit 6d75993fd7
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Sep 24 14:24:35 2024 +0200

    Move theme-path impl to ITokenTheme

commit 49579d75c6
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Sep 24 13:42:56 2024 +0200

    Simplify as this

commit d7d974242e
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Sep 24 11:18:12 2024 +0200

    Add active-themes to data serialization tests

commit f2569a1c4a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Sep 24 11:13:41 2024 +0200

    Cleanup

commit 44e4e85201
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Sep 24 11:10:07 2024 +0200

    Add schema validation

commit 5e39f33bff
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Sep 24 11:06:12 2024 +0200

    Rename with theme prefix

commit 416297d298
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Sep 23 17:37:16 2024 +0200

    Implement active-themes

commit fb38e4378a
Merge: 1a9d703bb 5b7b343f6
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed Sep 18 18:10:42 2024 +0200

    Merge pull request #273 from tokens-studio/color-token

    Color token

commit 5b7b343f62
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Sep 18 17:25:55 2024 +0200

    Cleanup

commit f5b62a5fc1
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Sep 18 17:23:42 2024 +0200

    Style the form to fit the color ramp exactly

commit 8804d1432e
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Sep 18 17:15:45 2024 +0200

    Update the input field value when chosing color from color ramp

commit 6084c49582
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Sep 18 17:03:18 2024 +0200

    Share color picker effect to set hue slider css variables

commit 2a3fc9e7bd
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Sep 18 17:03:08 2024 +0200

    Pointer

commit 061cd08e66
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Sep 18 11:43:35 2024 +0200

    Remove unused functions

commit 48a8b1bc55
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Sep 18 11:30:32 2024 +0200

    Fix color updating

commit c007170603
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Sep 18 11:28:31 2024 +0200

    Cleanup

commit b68e7af844
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Sep 18 11:27:30 2024 +0200

    Use tinycolor to convert hex color

commit e0e7b98ed7
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Sep 18 11:21:43 2024 +0200

    Docstring

commit 3bd2278dec
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Sep 18 11:15:11 2024 +0200

    Use penpot logging system instead of custom debug flag

commit 77141887a8
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Sep 18 10:57:05 2024 +0200

    Pass in value with error

commit 3a21643158
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Sep 18 10:38:16 2024 +0200

    Add shared error handling

commit 308fff05c3
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Sep 18 10:19:59 2024 +0200

    Dont show name error when editing new token and not touching name field

commit 49ff0df7f6
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Sep 17 16:35:08 2024 +0200

    Add tinycolor bindings

commit 3c4e0e2447
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Sep 16 16:57:01 2024 +0200

    Add color ramp

commit ac51309f81
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Sep 16 15:59:04 2024 +0200

    Add placeholder color swatch

commit 2b886c54e0
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 29 12:52:18 2024 +0200

    Color ramp wip

commit 0b29767c95
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 30 11:51:21 2024 +0200

    Add color token

commit 1a9d703bb1
Merge: 0697e6988 f0a9444ab
Author: Andrés Moya <hirunatan@hammo.org>
Date:   Wed Sep 18 11:00:06 2024 +0200

    Merge pull request #284 from tokens-studio/refactor-theme-groups

    tokens-lib refactor: Get collection of theme groups

commit f0a9444ab6
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Sep 17 10:48:23 2024 +0200

    tokens-lib refactor: Get collection of theme groups

commit 0697e69888
Merge: 1d7536687 0e15da5ed
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Tue Sep 17 09:44:00 2024 +0200

    Merge pull request #283 from tokens-studio/refactor-types-2

    Refactor types 2

commit 0e15da5ede
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Tue Sep 17 00:51:33 2024 +0200

    🔧 Make tokens again a flat ordered map

commit 5f703d6a79
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Mon Sep 16 17:47:05 2024 +0200

    🔧 Make themes a two-level only tree

commit 3a4ec32f8e
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Thu Sep 12 10:04:03 2024 +0200

    🔧 add groups handling v2

commit e2ff6f7ba6
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Thu Sep 5 17:51:02 2024 +0200

    🔧 Add first draft of token set groups attributes

commit fa8f8ac54b
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Thu Sep 5 16:49:29 2024 +0200

    🔧 add groups handling

commit 316d333c96
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Wed Sep 4 02:00:31 2024 +0200

    🔧 Add token themes in tokens-lib custom type

commit 1d7536687a
Merge: 6cba685e8 27073e22e
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Thu Sep 12 17:27:39 2024 +0200

    Merge pull request #282 from tokens-studio/enable-ff

    Enable sets/themes for all

commit 6cba685e87
Merge: 6f37a43be a1e4d6b3b
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Thu Sep 12 13:17:26 2024 +0200

    Merge pull request #281 from tokens-studio/token-refactor-common

    Fixes missing name attribute

commit 27073e22e3
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Sep 12 13:16:35 2024 +0200

    Enable sets/themes for all

commit a1e4d6b3b3
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Sep 12 10:36:05 2024 +0200

    Fix context menu missing name param

commit 309476fdfd
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Sep 12 10:23:45 2024 +0200

    Cleanup

commit 6f37a43be1
Merge: 361b02a76 0dca04733
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed Sep 11 15:35:45 2024 +0200

    Merge pull request #262 from tokens-studio/refactor-types-1

    🔧 Add tokens-lib custom type

commit 361b02a76a
Merge: 1568a7afb 0cd7d4dd7
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed Sep 11 15:11:22 2024 +0200

    Merge pull request #279 from tokens-studio/fix-inspect-tokens-tab

    Disable tokens tab in inspect mode

commit 1568a7afb5
Merge: f5ab6e65f 20e2c4edb
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed Sep 11 15:11:02 2024 +0200

    Merge pull request #278 from tokens-studio/fix-set-token-name

    Allow giving name of tokens in other sets

commit 0cd7d4dd7a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Sep 11 11:09:06 2024 +0200

    Disable tokens tab in inspect mode

commit f5ab6e65fc
Merge: 012e79603 56374171d
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed Sep 11 11:02:55 2024 +0200

    Merge pull request #277 from tokens-studio/group-select-themes

    Themes & Sets: Add groups select to modal

commit 20e2c4edb1
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Sep 11 10:17:46 2024 +0200

    Allow giving name of tokens in other sets

commit 012e79603f
Merge: 27409f43d 9876c2e4f
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed Sep 11 09:09:51 2024 +0200

    Merge pull request #276 from tokens-studio/token-sets-context-menu

    Token Sets & Themes: Sets context menu

commit 56374171d6
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Sep 10 15:44:11 2024 +0200

    Fix theme groups not showing up in create state

commit 281b801112
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Sep 10 15:42:44 2024 +0200

    Show dropdown only when groups exist

commit 21f42021d8
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Sep 10 15:37:01 2024 +0200

    Add groups select

commit df16d0c222
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Sep 10 15:16:52 2024 +0200

    Add abstract dropdown component

commit d54c5476d8
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Sep 10 14:33:45 2024 +0200

    Add dropdown button

commit 9876c2e4fc
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Sep 10 12:51:07 2024 +0200

    Add context menu

commit 0dca047339
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Tue Sep 3 14:20:55 2024 +0200

    fix token update

commit d147d844fb
Author: Andrés Moya <andres.moya@kaleidos.net>
Date:   Fri Aug 16 12:11:18 2024 +0200

    🔧 Add tokens-lib custom type

commit 27409f43d2
Merge: 734acd27b ae5aaf833
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Fri Aug 30 11:15:31 2024 +0200

    Merge pull request #264 from tokens-studio/token-sets-themes-ui

    Token sets themes UI

commit ae5aaf8332
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 29 16:02:22 2024 +0200

    Cleanup

commit 54b754c38c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 29 16:01:31 2024 +0200

    Cleanup

commit ca611c6668
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 29 15:59:58 2024 +0200

    Cleanup

commit 6bae2efe9d
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 29 14:26:11 2024 +0200

    Validate against names in all token sets

commit 734acd27b9
Merge: 93ce6b6eb 1ed6d92d8
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Tue Aug 27 17:09:47 2024 +0200

    Merge pull request #263 from tokens-studio/token-sets-themes

    Token sets themes

commit e363b58774
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Aug 27 15:22:02 2024 +0200

    HACK: Fix empty sets showing up in listing

commit b24b178e29
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Aug 27 15:00:15 2024 +0200

    Make resizable

commit d6823e8583
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Aug 27 14:49:11 2024 +0200

    Always switch to temporary theme when toggling sets in sidebar

commit 3bb99e8f7c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Aug 27 14:37:24 2024 +0200

    Remove default theme name, disable empty themen name submit

commit 3b7432a859
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Aug 27 14:32:26 2024 +0200

    Use non editable context in form

commit 4dd3367bdd
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Aug 27 14:26:06 2024 +0200

    Allow creating token sets

commit d4910ce2fc
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Aug 27 14:25:52 2024 +0200

    Auto select new token sets

commit 4f96550bca
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Aug 27 14:13:29 2024 +0200

    Use context

commit db22beb857
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Aug 27 10:20:38 2024 +0200

    Fix iterating over unordered sets

commit 965016b63f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Aug 27 10:04:12 2024 +0200

    Allow token renaming

commit 293250a30d
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 26 16:35:49 2024 +0200

    Rename

commit 1d599cbf7d
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 26 16:33:07 2024 +0200

    Always render ungroupd themes first

commit 0d2d1a8b8a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 26 16:23:23 2024 +0200

    Link up actions

commit cb46e11162
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 26 16:14:27 2024 +0200

    Add edit button

commit c807baaf7a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 26 15:54:44 2024 +0200

    Add custom select with grouped options

commit f25db592a0
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 26 15:07:58 2024 +0200

    Clone over select

commit 2e23543c11
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 26 15:04:45 2024 +0200

    Show create text when no theme is available

commit 4060b6d40f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 26 15:02:38 2024 +0200

    Style empty state, jump to create theme dialog when no themes exist

commit 7cd9c60fb6
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 26 14:36:00 2024 +0200

    Disable user-selection

commit 5939db771e
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 26 14:34:41 2024 +0200

    Link up delete button & fix create theme ui jumping

commit 1405720e0b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 26 14:32:21 2024 +0200

    Cleanup

commit b5e08c5b8b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 26 14:32:01 2024 +0200

    Add theme creation form

commit f37cf8be5e
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 26 14:31:34 2024 +0200

    Add defaults for theme form

commit 84b5be5547
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 26 14:17:37 2024 +0200

    Fix button being chosen as main button for form submit

commit 7aff690e7b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 26 14:17:30 2024 +0200

    Wire up theme updating

commit 70b570f112
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 26 13:49:57 2024 +0200

    Show only on create

commit 36f92aa241
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 26 13:47:44 2024 +0200

    Allow group and name updating

commit a0dd3f63bf
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 26 13:41:02 2024 +0200

    Allow controlling state of theme editing

commit fe702988f9
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 26 13:40:49 2024 +0200

    Cleanup

commit 12e915dec8
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 23 17:48:43 2024 +0200

    Style edit button

commit a52e20f49d
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 23 17:22:05 2024 +0200

    Cleanup

commit 967fab416a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 23 17:20:20 2024 +0200

    Add back button

commit 3ce2531b42
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 23 17:11:38 2024 +0200

    Design

commit db1250a315
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 23 17:07:47 2024 +0200

    Add footer buttons

commit 6f7b69c7ee
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 23 16:58:49 2024 +0200

    Allow toggling individual set themes

commit 7e7203eb7c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 23 16:44:11 2024 +0200

    Allow passing custom functions

commit 8a20e3a698
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 23 16:34:33 2024 +0200

    Allow tokens sets component to be controlled

commit 1c0233098d
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 23 16:28:06 2024 +0200

    Add sets list for theme

commit c7fa0f2cf8
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 23 16:27:42 2024 +0200

    Cleanup

commit cac421f862
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 23 15:41:32 2024 +0200

    Design

commit 7970440ffc
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 23 15:30:17 2024 +0200

    Toggle theme via ui

commit cc7de14539
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 23 15:08:53 2024 +0200

    Add basic toggle switch

commit d23c5cbbbe
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 23 14:53:22 2024 +0200

    Move the temporary ui to modal

commit b62722bdbb
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 23 14:11:13 2024 +0200

    Add themes modal dialog

commit 1ed6d92d87
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 23 13:36:46 2024 +0200

    Remove margin

commit b48bfde5c8
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 23 11:43:19 2024 +0200

    Automatically open when creating set

commit 1cc1d94a27
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 23 11:42:14 2024 +0200

    Automatically open when adding token

commit 40846b87c2
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 23 11:39:13 2024 +0200

    Add tokens header

commit acc3606cbb
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 23 11:36:54 2024 +0200

    Align Eye

commit 97f119f3da
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 23 11:32:54 2024 +0200

    Add delete set action button

commit 88c899c5c6
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 23 10:17:52 2024 +0200

    Wrap themes ui in header

commit a9a5f69c93
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 23 10:15:37 2024 +0200

    Cleanup

commit bac16aadd8
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 23 10:14:45 2024 +0200

    Migrate to official UI

commit b1cf641587
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 22 14:56:41 2024 +0200

    Fix cancelling set prompt breaking user state

commit e4f01d1d5e
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 22 11:59:06 2024 +0200

    Fix logic

commit 157cc5a994
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 22 11:21:53 2024 +0200

    Automatically show themes and sets on dev and PR previews

commit 37a3fbcec2
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 22 11:02:01 2024 +0200

    Fix not possible naming token to same token name in other set

commit 8343a9f3b5
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 22 10:59:40 2024 +0200

    Fix description

commit 4b47fa5d7a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 22 10:58:31 2024 +0200

    Fix names clash

commit 7a2a521075
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 22 10:54:41 2024 +0200

    Allow passing config

commit 6c802bc132
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 22 09:37:47 2024 +0200

    Rename

commit c130dc39c3
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Aug 21 19:11:53 2024 +0200

    Resolve tokens from other active sets

commit 8264da3a2a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Aug 21 15:36:40 2024 +0200

    Use active sets tokens for form

commit 6c6be35292
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Aug 21 15:12:13 2024 +0200

    Fix token updates not taking order

commit 011fc734f6
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Aug 21 14:42:39 2024 +0200

    Make passing of names-map explicit

commit 7c3716a709
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Aug 21 11:18:52 2024 +0200

    Move temporary ui behind flag

commit 98207b02bf
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Aug 21 11:18:47 2024 +0200

    Remove log

commit 0df89cf60d
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Aug 21 11:17:12 2024 +0200

    Use storage to toggle themes ui

commit 2df577cba2
Merge: 4e81a94d0 93ce6b6eb
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Aug 21 11:04:00 2024 +0200

    Merge remote-tracking branch 'origin/token-studio-develop' into token-sets-themes

commit 4e81a94d0f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Aug 21 11:03:39 2024 +0200

    Remove unused functions

commit 4f02d8b47d
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Aug 21 11:01:23 2024 +0200

    Fix multi run test

commit 74801e72d3
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Aug 21 10:54:22 2024 +0200

    Fix simple token creation / scaffolding test

commit cfefbadb64
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Aug 21 10:29:14 2024 +0200

    Fix id

commit 93ce6b6eb3
Merge: 9dd681c15 f9704fe7a
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Aug 20 22:14:51 2024 +0530

    Merge pull request #256 from tokens-studio/token-sets-ui

    Token sets UI

commit f9704fe7aa
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Aug 20 18:40:02 2024 +0200

    Fix padding without sets

commit 2487f34b72
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Aug 20 21:34:07 2024 +0530

    formatting

commit b3e939d12a
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Aug 20 21:30:59 2024 +0530

    add a hardcoded flag to display/hide token sets section

commit 247e3a1559
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Aug 20 21:25:22 2024 +0530

    fix some styling issues

commit 5b1eaf4b8f
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Aug 20 20:55:02 2024 +0530

    remove unused prop and some optimizations

commit 463ab3c866
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Aug 20 20:41:25 2024 +0530

    change current-set to selected-set

commit 5358cd1c52
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Aug 20 16:14:32 2024 +0200

    Fix tests crashing

commit 3a2f4df387
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Aug 20 17:08:31 2024 +0530

    add source code comment

commit 1a3184d327
Merge: 187ab3166 9dd681c15
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Aug 20 17:02:00 2024 +0530

    Merge branch 'token-studio-develop' into token-sets-ui

commit 187ab31667
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Aug 20 17:00:19 2024 +0530

    format

commit feb5cec84b
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Aug 20 16:57:53 2024 +0530

    ad sets-section wrapper

commit f052b75dac
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Aug 20 16:38:18 2024 +0530

    formatting

commit e62323ac0a
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Aug 20 16:35:33 2024 +0530

    add variable

commit d4c88d4441
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Aug 20 16:32:36 2024 +0530

    remove folder open icon

commit 4bad9fa6f8
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Aug 20 16:30:51 2024 +0530

    add chevron icon

commit e4f5b6005e
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Aug 20 16:30:38 2024 +0530

    move sets-sidebar component to sidebar tokens

commit 98b5791e27
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Aug 20 15:37:37 2024 +0530

    remove set-item-set-selected and remove class

commit 6049c32839
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 19 15:46:42 2024 +0200

    Compute tokens from each activated set

commit 8e02dced2f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 19 10:49:46 2024 +0200

    Extract to function

commit 97436531d0
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 19 10:46:48 2024 +0200

    Showing only active sets

commit 8660c372dc
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 19 09:41:23 2024 +0200

    Add theme deletion

commit 3413d4b42f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 19 09:09:09 2024 +0200

    Add tests

commit 93a23c66ec
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 19 09:01:08 2024 +0200

    Docstrings

commit e8bbb75008
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 19 08:49:03 2024 +0200

    Implement group theme switching

commit 9a745ea8bc
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 19 08:05:19 2024 +0200

    Add active theme toggling

commit f0e0e9334e
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 19 07:29:20 2024 +0200

    Cleanup

commit ae1c30ad56
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 16 14:22:56 2024 +0200

    Allow providing set name

commit e502def755
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 16 14:21:25 2024 +0200

    Show themes

commit 62712ef8da
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 16 13:59:18 2024 +0200

    Cleanup styles

commit 6a7ced3204
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 16 13:36:54 2024 +0200

    Add token set visibility toggle

commit 636c3b822c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 16 12:22:57 2024 +0200

    Example styling

commit c2a045ad5b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 16 11:44:41 2024 +0200

    Add selected sets UI

commit 0f95ddef8f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 16 11:32:36 2024 +0200

    Add new sets to active theme

commit 3e41e7d234
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 16 11:32:20 2024 +0200

    Fix workspace-data key missing

commit 879ef1123f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 16 10:32:59 2024 +0200

    Create temporary theme when creating set

commit 9329513949
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 16 08:04:41 2024 +0200

    Add token set deletion

commit ae39586d8c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 16 07:10:15 2024 +0200

    Add temporary theme

commit 4c1bc81b19
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 16 07:10:08 2024 +0200

    Add name

commit 7406af2e79
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 16 07:09:59 2024 +0200

    Add theme creation

commit 8482a128de
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 16 07:09:17 2024 +0200

    Fix expeted id instead of set

commit 3695ba3438
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 16 07:09:07 2024 +0200

    Add token theme data scaffold

commit 35759792a3
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 16 06:24:15 2024 +0200

    Render grouped themes ui

commit f0aaa29d66
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 16 06:24:03 2024 +0200

    Add type functions

commit cefa498f4d
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 16 06:23:53 2024 +0200

    Add group and selected properties to theme

commit f3d4346c0d
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 15 18:52:42 2024 +0200

    Add create token-set event

commit 1f0c1dbbe6
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 15 18:52:31 2024 +0200

    Update shapes on token set switch

commit 587a2936e6
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 15 18:26:37 2024 +0200

    Add simple UI

commit 73078d802a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 15 18:26:20 2024 +0200

    Add refs

commit eaf568f154
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 15 14:26:22 2024 +0200

    Get tokens from current or first token set

commit ead8a983ab
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 15 14:26:12 2024 +0200

    Move to token-set namespace

commit 9dd681c156
Merge: b2962b560 43e064a76
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Thu Aug 15 12:28:19 2024 +0200

    Merge pull request #254 from tokens-studio/fix-token-editing

    Fix token editing

commit 43e064a768
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 15 10:12:45 2024 +0200

    Update doc string

commit 4bd3b14adb
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 15 10:07:12 2024 +0200

    Add unit to tests

commit e4e488a9ee
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 15 10:03:25 2024 +0200

    Adds style-dictionary test

commit c6d13af071
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 15 09:21:49 2024 +0200

    Fix validation not working while editing [*]

    [*] We've passed the resolved tokens to the validation,
    but the validation needs the original tokens set.

commit 6be2ca8491
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 15 09:21:18 2024 +0200

    Fix resolved value not showing up when editing token

commit b2962b5603
Merge: c7d4db900 ecf4fb8bd
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed Aug 14 19:41:36 2024 +0200

    Merge pull request #251 from tokens-studio/fix-spacing-token

    Fixes design tab spacing token

commit ecf4fb8bd0
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Aug 14 16:52:46 2024 +0200

    Fix popover position

commit 1ba2acea7c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Aug 14 16:39:43 2024 +0200

    Fix crash for applying spacing layout token

commit cf9ef2ae60
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Aug 14 15:33:24 2024 +0200

    Remove unused function

commit 74c6228c25
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Aug 14 17:15:30 2024 +0530

    add dom/stop-propagation

commit 188e7d220a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Aug 14 09:25:17 2024 +0200

    Fix name

commit c7d4db900e
Merge: d8621974c 726b0a267
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed Aug 14 09:16:23 2024 +0200

    Merge pull request #245 from tokens-studio/use-token-name-ref

    Use token name ref

commit 1135b7e2db
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Aug 13 18:30:00 2024 +0200

    Update token sets

commit 71439637aa
Merge: 21c42626a d8621974c
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Aug 13 21:56:06 2024 +0530

    Merge branch 'token-studio-develop' into token-sets-ui

commit 21c42626ae
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Aug 13 21:51:31 2024 +0530

    remove comment

commit 007cf0fb8a
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Aug 13 21:50:55 2024 +0530

    remove comments and unused import

commit 46c73fe51f
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Aug 13 21:44:08 2024 +0530

    formatting

commit 66170eb889
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Aug 13 21:42:08 2024 +0530

    make current-set-id the key on div element

commit 68c0d93f91
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Aug 13 21:12:38 2024 +0530

    change sets list div to ul

commit 7addba71fb
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Aug 13 21:07:52 2024 +0530

    remove debug statements

commit 950257a212
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Aug 13 20:42:42 2024 +0530

    change eye icon size

commit 9aadb8c72f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Aug 13 16:18:24 2024 +0200

    Add test

commit fa230a4224
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Aug 13 19:31:34 2024 +0530

    add folder-open icon and use for open groups

commit 2f2ed0a42f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Aug 13 15:45:38 2024 +0200

    Cleanup

commit a4865522cc
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Aug 13 15:25:36 2024 +0200

    Select token set on create

commit ba31914ca4
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Aug 13 14:41:58 2024 +0200

    Fix typo

commit c275923621
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Aug 13 14:41:49 2024 +0200

    Fix indent

commit ec01ce7550
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Aug 13 14:41:18 2024 +0200

    Ensure vector

commit bcd4b6d9ec
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Aug 13 13:31:43 2024 +0200

    Fix schema errors

commit 547358d579
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Aug 13 11:57:06 2024 +0200

    Add token set changes

commit bcf61f34fe
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Aug 13 14:11:30 2024 +0530

    add current set and selected set

commit ad9a4e7244
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Aug 13 01:17:18 2024 +0530

    Add full lenght highlight

commit 9ff3a135a8
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 12 10:50:47 2024 +0200

    Cleanup

commit 6c3415b92c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Aug 6 14:56:11 2024 +0200

    Differentiate groups and sets

commit dbddd7fb68
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Aug 6 14:26:30 2024 +0200

    Add token themes & sets schema

commit 726b0a2671
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 9 18:04:33 2024 +0200

    Fix :applied-tokens not being updated

commit 51a27c07ec
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 9 18:03:47 2024 +0200

    Use token identifier

commit 9ff4567955
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 9 18:03:20 2024 +0200

    Remove unused function

commit 5552295d61
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Aug 9 17:37:36 2024 +0200

    Add docstring

commit b93b0b209a
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Thu Aug 8 21:40:35 2024 +0530

    Add hover styles and collapse capabilities

commit bb3a22a219
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Thu Aug 8 18:46:58 2024 +0530

    add hide/show icon

commit e992bf0aa6
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 8 15:13:04 2024 +0200

    Fix sizing test

commit 8b8b909fb7
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 8 15:12:28 2024 +0200

    Parse values with unit

commit 2d67a92d64
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 8 11:39:58 2024 +0200

    Fix getter

commit a073520d0e
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 8 11:22:40 2024 +0200

    Restore tests to work with new identifier

commit e27e2d357c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 8 11:09:12 2024 +0200

    Add simple applying test

commit d98e982664
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 8 11:07:32 2024 +0200

    Cleanup

commit 31674db11d
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 8 11:07:24 2024 +0200

    Skip parsing on numbers

commit 0684d893e0
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 8 11:06:49 2024 +0200

    Return resolved & parsed token names map

commit 37f23855e8
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 8 09:52:51 2024 +0200

    Fix re-find only accepting string values throw

commit 2e8e33d701
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 8 09:40:26 2024 +0200

    Add token value parsing function

commit 980238e27b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 8 09:22:32 2024 +0200

    Move find-token-references to token namespace

commit b28a45c2d8
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Thu Aug 8 00:14:36 2024 +0530

    add more changes working tree display

commit fcea989586
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Aug 7 22:39:41 2024 +0530

    add more changes

commit 1434ddb5d5
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Aug 7 20:58:21 2024 +0530

    change fotn color

commit 252797183c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Aug 7 15:14:32 2024 +0200

    Use :name as the token identifier [*]

    [*] Using uuid as the token identiefier for :applied-tokens is not
    correct as we want to merge all sets together by their name, to get the
    final values.

commit d8621974c2
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Aug 7 17:14:05 2024 +0200

    Update with upstream

commit 192f847d50
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Aug 7 17:13:39 2024 +0200

    Ignore rxjs errors

commit c9673ca828
Merge: d7ee804ca 22f3dba84
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Aug 7 16:21:08 2024 +0200

    Merge remote-tracking branch 'penpot/develop' into token-studio-develop

commit d7ee804ca3
Merge: eb9b4be6e edb89bccc
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed Aug 7 12:53:02 2024 +0200

    Merge pull request #243 from tokens-studio/fix-tests

    Temporary fix for tests

commit edb89bcccb
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Aug 7 12:38:24 2024 +0200

    Temporary fix for tests [*]

    [*] Async tests got broken with the latest upstream.

    This will still print a bunch of warnings from rxjs but the tests are
    still running.

commit eb9b4be6ea
Merge: e02611da2 4ae467987
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed Aug 7 08:26:08 2024 +0200

    Merge pull request #241 from tokens-studio/sync-master

    Sync penpot master

commit 02a19a6b33
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Aug 7 00:57:13 2024 +0530

    Next commit

commit 22e497398f
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Aug 7 00:08:12 2024 +0530

    Initial commit

commit 4ae467987a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Aug 6 11:25:31 2024 +0200

    Update changes

commit 3bd0318999
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Aug 6 11:16:38 2024 +0200

    Update lock file

commit dd8780db69
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Aug 6 11:16:30 2024 +0200

    Use register

commit 5fbbdd36fd
Merge: e02611da2 36ac81bb4
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Aug 6 11:06:51 2024 +0200

    Merge remote-tracking branch 'penpot/develop' into token-studio-develop

commit e02611da20
Merge: 57c9d6d3a f7e770192
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Tue Aug 6 10:31:13 2024 +0200

    Merge pull request #238 from tokens-studio/213-opacity-fixes-03

    Fixes Opacity

commit f7e7701923
Merge: 6cb3afe87 57c9d6d3a
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Tue Aug 6 08:23:39 2024 +0200

    Merge branch 'token-studio-develop' into 213-opacity-fixes-03

commit 57c9d6d3a9
Merge: 3c7261e75 fe9bb69c7
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Tue Aug 6 06:38:31 2024 +0200

    Merge pull request #239 from tokens-studio/236-stroke-width-fix

    Fix stroke width applying crash

commit fe9bb69c75
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 5 11:45:32 2024 +0200

    Update CHANGELOG

commit c9d1fe44e9
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 5 11:43:46 2024 +0200

    Add stroke-width test

commit 2a97749d23
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 5 11:42:36 2024 +0200

    Add shape property passing

commit 3826afb76b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 5 11:18:19 2024 +0200

    Fix applying stroke

commit 6cb3afe87f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 5 11:05:49 2024 +0200

    Add opacity tests

commit 62a9dd6582
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 5 10:54:46 2024 +0200

    Cleanup

commit ad468582b3
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 5 10:53:59 2024 +0200

    Add changelog

commit c29024bd62
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Aug 5 10:51:35 2024 +0200

    Dont update values outside of 0..1 (e.g.: 20)

commit 1f88c8288a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 29 11:08:15 2024 +0200

    Parse double to preserve opacity

commit 3c7261e75b
Merge: ab72bdf09 72c5c3ec9
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Fri Aug 2 08:56:30 2024 +0200

    Merge pull request #231 from tokens-studio/update-token-shapes

    Update token shapes

commit 72c5c3ec9a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 1 15:45:37 2024 +0200

    Cleanup

commit 13163a4571
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 1 15:37:53 2024 +0200

    Clean up debugging code

commit 0c757f05e3
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 1 15:37:39 2024 +0200

    Apply actions directly

commit fc6d64fb5d
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 1 15:32:33 2024 +0200

    Fix import

commit 518441e582
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 1 12:12:03 2024 +0200

    Fix spacing token click will add padding

commit fdce370bb6
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 1 12:05:15 2024 +0200

    Disable debug

commit 9ebd743635
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 1 11:09:36 2024 +0200

    Testing comment

commit cc6f34f78a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 1 11:07:02 2024 +0200

    Fix trying to update shapes for deleted tokens crash

commit feb438f882
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 1 10:41:45 2024 +0200

    Safety net

commit 68b32448d1
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 1 10:41:03 2024 +0200

    Fix exact match of diff adding nil attrs group and crashing the app

commit ac27f95091
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 1 09:41:28 2024 +0200

    Fix undo deleting the token on update

commit 68415b6668
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 1 09:14:21 2024 +0200

    Update tokens after shape update

commit e52623c728
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Aug 1 09:13:58 2024 +0200

    Update shapes in one undo step, resolve tokens from state not cache atom

commit a1fefe66ae
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 31 17:26:50 2024 +0200

    Working updates!

commit d22234fe2a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 31 16:51:55 2024 +0200

    Cleanup

commit 0166c38486
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 31 16:43:03 2024 +0200

    Split logical attribute groups

commit 69d9359237
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 31 14:36:09 2024 +0200

    Collecting update functions by attributes

commit 6225f59ea0
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 31 14:04:00 2024 +0200

    Cleanup

commit ab72bdf09c
Merge: dde8ab068 1d4b41750
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Tue Jul 30 08:02:50 2024 +0200

    Merge pull request #224 from tokens-studio/ux-context-menu

    Ux context menu

commit 1d4b417501
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jul 30 06:57:21 2024 +0200

    Fix missing function shorthand

commit f69db7ce9e
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 29 18:43:47 2024 +0200

    Cleanup

commit 5e33eab7d0
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 29 18:31:11 2024 +0200

    Fix position updating

commit 9340ba9cc0
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 29 18:30:59 2024 +0200

    Allow passing custom on-update-shape function

commit ededd23849
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 29 17:48:30 2024 +0200

    Trigger Build

commit b423a9c782
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 29 17:43:32 2024 +0200

    Always update all layout-gap on token pill click

commit 70904dbc64
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 29 16:38:40 2024 +0200

    Trigger Build

commit 9ba4776c8e
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 29 16:34:26 2024 +0200

    Trigger Build

commit c92decedeb
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 29 16:21:42 2024 +0200

    Trigger Build

commit a893a66ec8
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 29 16:07:33 2024 +0200

    Fix crash on applying col/row gap

commit 3f14af9e03
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 29 16:00:46 2024 +0200

    Fix highlighting for dimensions token

commit 596d662ca8
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 29 15:24:17 2024 +0200

    Cleanup

commit 1eea55ad43
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 29 15:09:35 2024 +0200

    Test

commit 55ed79d968
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 29 14:22:37 2024 +0200

    Move to sidebar, should not be rendered in root

commit 6fc370bb30
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 29 14:22:07 2024 +0200

    Fix token position wrong, component gets rendered on user mount

commit 1633f8035e
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 29 13:51:17 2024 +0200

    Indent

commit 9bec2509c9
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 25 10:11:36 2024 +0200

    Better context-menu position, remove hardcoded value

commit 1e481412e8
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 25 09:12:23 2024 +0200

    Remove old token applying events

commit cc41a42dfa
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 25 09:11:03 2024 +0200

    Update CHANGELOG

commit a3a4883875
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 25 08:58:26 2024 +0200

    Cleanup

commit f094654837
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 25 08:56:02 2024 +0200

    Fix only shape ids being applied

commit f93a5ab109
Merge: 957ad0dae dde8ab068
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 25 08:42:17 2024 +0200

    Merge remote-tracking branch 'origin/token-studio-develop' into ux-context-menu

commit 957ad0dae3
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 24 16:21:48 2024 +0200

    Always highlight if one of the attributes is active, but only apply minimal set on pill click

commit b9b4abf1e0
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 24 16:10:41 2024 +0200

    Fix edit modal not opening

commit cb942996a9
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 24 16:05:43 2024 +0200

    Fix render-loop after token was deleted

commit 37bef1e2ea
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 24 16:05:29 2024 +0200

    Cleanup

commit b392c3ba65
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 24 15:46:14 2024 +0200

    Move token change events to changes ns

commit 56e72b5247
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 24 15:29:40 2024 +0200

    Refactor - Separate core into namespaces: changes, token_types

commit 03370c267d
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 24 15:02:10 2024 +0200

    Cleanup

commit d5a03e154b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 24 14:57:33 2024 +0200

    Cleanup

commit 386a4c94ba
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 24 14:51:59 2024 +0200

    Disallow clicking pill when nothing is selected

commit 5e911d814c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 24 14:49:39 2024 +0200

    Show attribute actions only when something is selected

commit 310033fd75
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 24 14:20:08 2024 +0200

    Inline attributes

commit 46250003d3
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 24 14:17:43 2024 +0200

    Reuse all-or-sepearate-actions for border-radius

commit 871402bd84
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 24 14:07:42 2024 +0200

    Fix overriding of existing radius-4

commit 38499e2f1f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 24 14:07:29 2024 +0200

    Fix properties

commit 893e533afe
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 24 14:01:56 2024 +0200

    Cleanup

commit e6889fc92e
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 24 13:41:32 2024 +0200

    Fix typo

commit c11c1e0c03
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 24 13:41:08 2024 +0200

    Use all-or-sepearate-actions for gap

commit 335808bf03
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 24 13:41:00 2024 +0200

    Remove unneeded actions

commit cbd5d42069
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 24 13:36:38 2024 +0200

    Simplify

commit 113fc9891b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 24 13:29:26 2024 +0200

    Simplify component & css

commit fbd2ab833d
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 24 10:59:26 2024 +0200

    Inline separator

commit 08cc777096
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 24 10:58:34 2024 +0200

    Restructure

commit 81c83f9dd4
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 24 10:55:22 2024 +0200

    Recurse tree instead of repetition

commit f20313e7f8
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 24 09:43:28 2024 +0200

    Add dimensions sub-menu

commit 1776591fec
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 24 09:42:09 2024 +0200

    Fix react index warning

commit aa75f30858
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 24 09:19:31 2024 +0200

    Allow type overriding via prop

commit 62f7f8a74f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jul 23 16:35:07 2024 +0200

    Add sizing

commit 65dbafafb8
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jul 23 16:02:14 2024 +0200

    Add width/height applying

commit 214a323682
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jul 23 16:01:56 2024 +0200

    Add abstract method for a all or seperate actions

commit da3f2f820c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jul 23 15:28:13 2024 +0200

    Add generic context menu actions

commit cabc3d3f36
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jul 23 14:55:14 2024 +0200

    Simplify passed prop date

commit bad9056d54
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jul 23 11:35:07 2024 +0200

    Update gap

commit 4cf8b2c143
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jul 23 10:54:23 2024 +0200

    Extract gap as extra function

commit 39822a3b31
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jul 23 10:49:19 2024 +0200

    Add single padding

commit 0e858d880d
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jul 23 10:37:51 2024 +0200

    Add horizontal/vertical padding toggle

commit dde8ab0680
Merge: 64da0983f cb051d2e5
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Jul 23 13:02:21 2024 +0530

    Merge pull request #223 from tokens-studio/fic-spacing-crash-on-non-layout

    Fix app crashing when spacing padding is applied to a shape without a…

commit 2411eeb644
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 22 18:23:12 2024 +0200

    Add separate gap

commit c00023319a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 22 18:13:37 2024 +0200

    Extract data

commit fd2f5537cf
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 22 18:07:16 2024 +0200

    Extract common logic

commit 2836ff2693
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 22 17:07:42 2024 +0200

    Fix actions

commit f731a30f81
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 22 13:54:36 2024 +0200

    Allow removing other attributes with apply-token function

commit 91033d6dea
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 22 11:30:27 2024 +0200

    Fix indent

commit 64da0983f3
Merge: 2f17b79be 337e1c9fa
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Fri Jul 19 00:30:15 2024 +0530

    Merge pull request #222 from tokens-studio/fix-stroke-width-crash

    Fix application crashing when stroke width is applied to a shape with…

commit cb051d2e5b
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Fri Jul 19 00:28:00 2024 +0530

    Fix app crashing when spacing padding is applied to a shape without a layout

commit 337e1c9fa0
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Thu Jul 18 23:13:51 2024 +0530

    Fix application crashing when stroke width is applied to a shape without a stroke

commit 359ec592fb
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 8 15:40:33 2024 +0200

    Single attribute context menu

commit ae2da534e9
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 8 15:40:18 2024 +0200

    Move radius updating to core

commit 9bf763efb3
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 8 15:19:48 2024 +0200

    Add all action

commit 77fe4d556f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 8 15:10:51 2024 +0200

    Convert border-radius to new UX

commit 7b2d11019c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 8 15:10:01 2024 +0200

    Only show atrribute actions when shapes are selected

commit bf994fcd56
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 8 14:40:57 2024 +0200

    Rename

commit 3ad009b515
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 8 14:40:35 2024 +0200

    Fix lint

commit 82b44e6569
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 8 14:40:07 2024 +0200

    Inline concat

commit da0389e304
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 8 14:38:19 2024 +0200

    Improved logic to run once for all shapes

commit 90618ec89a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 8 11:41:25 2024 +0200

    Add separator between default actions and attribute actions

commit 2f17b79bef
Merge: c2777ed6e bc1f27eac
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Mon Jul 8 13:53:10 2024 +0200

    Merge pull request #216 from tokens-studio/ux-improvements

    UX improvements

commit db7391e4cb
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 8 11:40:05 2024 +0200

    Separate entries

commit e75f9a7c7f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 8 11:06:57 2024 +0200

    Add predicate for all test

commit 62ecee2cf8
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 8 10:24:23 2024 +0200

    Add grouping function by type

commit 3c67872d3c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jul 5 14:44:57 2024 +0200

    Add future test cases for providing a toggle all/attributes

commit 5a358e3d0c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jul 5 14:13:14 2024 +0200

    Extract singular token applied predicate

commit bc1f27eac9
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jul 5 09:18:36 2024 +0200

    Trigger Build

commit 0fad53ea6c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jul 5 08:55:01 2024 +0200

    Convert stroke to event

commit c7a46c31b4
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jul 5 08:53:45 2024 +0200

    Convert layout spacing to function

commit c70bb876b2
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jul 5 08:31:38 2024 +0200

    Add changelog

commit 4fc7efd3b7
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 4 16:03:32 2024 +0200

    Restore performance measuring lines

commit 4a329a6318
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 4 15:52:58 2024 +0200

    Override http server

commit 828e3a719f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 4 15:29:42 2024 +0200

    Disable running tests from shadow-cljs directly

commit 785961f7c6
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 4 14:31:50 2024 +0200

    Cleanup

commit 55713275b6
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 4 14:14:06 2024 +0200

    Add test for overriding token

commit f20c08f31b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 4 14:05:20 2024 +0200

    Specify tests

commit 893e790787
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 4 11:41:00 2024 +0200

    Only remove given token

commit b73cdd15e0
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 4 11:28:15 2024 +0200

    Add helper to remove attributes from applied-tokens

commit 658e7ebd0a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 4 11:15:06 2024 +0200

    Cleanup

commit 694baeee0c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 4 11:12:49 2024 +0200

    Add sizing test

commit 7abfaef1cb
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 4 11:08:46 2024 +0200

    Test applying rotation

commit 322c8ef8ec
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 4 11:06:48 2024 +0200

    Update opacity

commit b43d16008f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 4 10:51:08 2024 +0200

    Extract to helpers

commit 1f0f35e754
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 4 10:48:27 2024 +0200

    Remove unused

commit a842cb2d7d
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 4 10:41:57 2024 +0200

    Cleanup

commit 8f806ef1fe
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 4 10:41:46 2024 +0200

    Test single property updates

commit f3261c9b0f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 4 10:41:10 2024 +0200

    Fix emit! side-effect

commit 818aa043ca
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 4 10:40:59 2024 +0200

    Wrap in undo sequence

commit 596480d177
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 4 10:05:36 2024 +0200

    Add test to verify toggle removes token for applied & unapplied

commit ab62c5b4ef
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 4 10:00:58 2024 +0200

    Add helper to apply token to shape

commit 581ced0ab8
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 4 10:00:44 2024 +0200

    Abstract into helper

commit e85de19a5e
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 4 09:29:48 2024 +0200

    Add multiple shapes test

commit 8370fd06d4
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 4 09:29:43 2024 +0200

    Remove cb

commit 3793e98660
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 4 09:29:16 2024 +0200

    Disable complete log

commit b12e59a8d7
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jul 4 09:13:02 2024 +0200

    Rename event to toggle-token

commit 71976ed7e9
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 3 18:24:09 2024 +0200

    Add helpers for creating test tokens

commit 0730ecef46
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 3 17:15:23 2024 +0200

    Cleanup

commit 219d184e6c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 3 17:06:08 2024 +0200

    Add multiple tokens for tests

commit a7e735bd81
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 3 17:04:47 2024 +0200

    Add helper for asnc stores

commit ed7aad6c4e
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 3 16:11:39 2024 +0200

    Async token event tests working

commit e203646085
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 3 11:16:16 2024 +0200

    Naming

commit 1e70a4d714
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 3 11:09:50 2024 +0200

    Implement using rx observables instead of side-effects

commit 97db3c29ca
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jul 3 09:50:54 2024 +0200

    Trying to convert to rx structure

commit 50635ae879
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jul 2 16:06:41 2024 +0200

    Found error in handler logic, need rx streams

commit 3e5126251c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jul 2 15:19:31 2024 +0200

    Add failing logic test

commit 10d92f598c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jul 2 15:03:09 2024 +0200

    Add nodemon watcher

commit c486ea81f4
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jul 2 15:03:04 2024 +0200

    Cleanup

commit f2358b9827
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jul 2 08:22:27 2024 +0200

    Use toggle function

commit c2777ed6e3
Merge: 5c5b37826 224b656d5
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Mon Jul 1 18:43:17 2024 +0200

    Merge pull request #211 from tokens-studio/fix-sub-name-space

    Fix token naming clashes

commit 5cef23267c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 1 14:14:36 2024 +0200

    Move to tokens ns, add test

commit cf07de3bcf
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 1 14:05:06 2024 +0200

    Add tests for token-applied?

commit e38a943ce0
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 1 13:51:20 2024 +0200

    Move token-applied? to token ns

commit 224b656d57
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 1 10:40:38 2024 +0200

    Add CHANGELOG

commit 111be97228
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 1 10:31:16 2024 +0200

    Remove logs

commit ec511cc589
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 1 10:30:03 2024 +0200

    Fix setting token to own path

commit 9d637cbe5e
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 1 10:16:52 2024 +0200

    Path selector test predicate is enough

commit 4a85ef3608
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 1 10:16:15 2024 +0200

    Split path/selector for disallowing creating tokens at path segments

commit a98f59469e
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jul 1 09:56:45 2024 +0200

    Add - to allowed token-name

commit 174d91a519
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jun 28 14:39:36 2024 +0200

    Add function to check if a token can be placed under a name path

commit 48a7c52664
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jun 28 14:17:42 2024 +0200

    Separate errors

commit 2fa152d364
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jun 28 13:51:32 2024 +0200

    Move to token namespace

commit 504369ec13
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jun 28 13:43:41 2024 +0200

    Move tokens-name-tree to core, add test

commit ef5f019200
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jun 28 13:34:54 2024 +0200

    Add helper utility to convert name to path

commit 6da855c741
Merge: 3a500fb8a a4bbef991
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jun 28 11:24:55 2024 +0200

    Merge branch 'fix-token-reference-issue' into 199-branch-name

commit a4bbef9917
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Fri Jun 28 14:43:49 2024 +0530

    Fix token reference issue when name has .

commit 3a500fb8a7
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Jun 26 19:40:06 2024 +0530

    Update CHANGELOG.md with PR link

commit 00dabaf38c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jun 26 16:08:21 2024 +0200

    Remove comment form

commit f24c314d63
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jun 26 16:04:50 2024 +0200

    Update

commit f9530c5a10
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jun 26 16:01:41 2024 +0200

    Restrict token naming

commit 5c5b378262
Merge: 3a594d239 4aac3eee7
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Fri Jun 28 08:19:57 2024 +0200

    Merge pull request #204 from tokens-studio/fix-deploy

    Fix deploy

commit 4aac3eee7f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jun 28 08:18:43 2024 +0200

    Test synchronize

commit 325ad66a46
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jun 28 08:16:26 2024 +0200

    Fix branches not being re-deployed after push

commit 3a594d2393
Merge: bd5a0d2d1 b2a983fd0
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Thu Jun 27 16:31:14 2024 +0200

    Merge pull request #203 from tokens-studio/fix-new-document-token

    Fix creating a token issue on empty document

commit b2a983fd05
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jun 27 16:07:47 2024 +0200

    Fix creating a token issue on empty document

commit bd5a0d2d1b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jun 26 15:06:22 2024 +0200

    Cleanup

commit 19c6c6d3bf
Merge: 7fa31b143 c9a40ee9b
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Jun 26 17:58:01 2024 +0530

    Merge pull request #195 from tokens-studio/json-export-changelog

    Add Json export Changelog

commit c9a40ee9b3
Merge: 350654f96 7fa31b143
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Jun 26 17:57:49 2024 +0530

    Merge branch 'token-studio-develop' into json-export-changelog

commit 350654f968
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Jun 26 17:51:23 2024 +0530

    Update CHANGELOG.md image

commit 7fa31b143e
Merge: 357a0781b bf1c9e2c1
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Jun 26 17:48:08 2024 +0530

    Merge pull request #198 from tokens-studio/json-dtcg-format

    Make tokens JSON export DTCG compatible

commit bf1c9e2c18
Merge: 96bfce13b 357a0781b
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Jun 26 17:47:54 2024 +0530

    Merge branch 'token-studio-develop' into json-dtcg-format

commit 357a0781bb
Merge: 5ca916f8c 86fd667a1
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed Jun 26 14:11:08 2024 +0200

    Merge pull request #194 from tokens-studio/style-dictionar-validation

    Token Insert/Edit Validation + Value Preview

commit 96bfce13be
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Jun 26 17:28:10 2024 +0530

    Update CHANGELOG.md image

commit d6f1e2efc9
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Jun 26 12:36:01 2024 +0530

    Update CHANGELOG

commit 158d5cba31
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Jun 26 12:32:07 2024 +0530

    Make tokens JSON export DTCG compatible

commit aabbe2fd94
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Jun 25 22:34:09 2024 +0530

    Update CHANGELOG

commit 86fd667a11
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 25 17:06:52 2024 +0200

    Hide template section in preview document

commit 56976e2499
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 25 17:04:13 2024 +0200

    Update CHANGELOG

commit 9f6c587c95
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 25 16:46:15 2024 +0200

    Remove duplicate similar errors

commit 9f3e1743a1
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 25 16:45:01 2024 +0200

    Cleanup

commit e1b683f670
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 25 16:43:52 2024 +0200

    Cleanup

commit b4d1ef3fc7
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 25 16:40:48 2024 +0200

    Cleanup

commit b924bbc9c7
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 25 16:39:43 2024 +0200

    Cleanup

commit 656cc00923
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 25 16:38:28 2024 +0200

    Add missing deps

commit b89dc759be
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 25 16:36:21 2024 +0200

    Cleanup

commit 135ecf0e3a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 25 16:33:07 2024 +0200

    Cleanup

commit af374276e4
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 25 16:30:57 2024 +0200

    Extract missing reference error check

commit 2c42ca5a4b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 25 14:24:20 2024 +0200

    Cleanup

commit b905ff7d2c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 25 14:18:07 2024 +0200

    Validate forms again on submit

commit eb123bf8ef
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 25 12:15:14 2024 +0200

    Extract token validation

commit 6e9623153c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 25 11:55:57 2024 +0200

    Remove caching layer for now

commit d0f8e9612a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 25 11:52:39 2024 +0200

    Validate name before submitting

commit 5df0cf545e
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 25 11:33:18 2024 +0200

    Remove form-touched work-around

commit eac7d9288b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 25 11:30:53 2024 +0200

    Fix on-submit taking old ref-values when user submits before errors have been validated

commit 05f6cfc4b0
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 25 11:30:45 2024 +0200

    Remove unneeded state

commit 33131fa943
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 25 11:15:43 2024 +0200

    Restore token saving

commit ca98747dea
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 25 11:02:21 2024 +0200

    Add description with schema

commit d2bdc6c624
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 25 10:40:31 2024 +0200

    Fix ref logic

commit 5ca916f8c4
Merge: 1ca3f2970 ee057c498
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Mon Jun 24 20:53:31 2024 +0530

    Merge pull request #191 from tokens-studio/tokens-json-export

    Tokens json export

commit ee057c498e
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Mon Jun 24 20:44:08 2024 +0530

    Simplify tranform tokens function

commit e0be30bb79
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jun 24 15:58:19 2024 +0200

    Dont show error when unfocusing name input field, but keep form disabled

commit 29e3171bd9
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Mon Jun 24 19:07:53 2024 +0530

    Incorporate styling changes to match Penpot design language

commit c98162d0bf
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jun 24 15:24:22 2024 +0200

    Move callback function to component

commit fb7b11a139
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Mon Jun 24 18:50:36 2024 +0530

    Remove : from token type in export

commit db26b38e81
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Mon Jun 24 18:47:12 2024 +0530

    Modify transform tokens to nest within token names

commit 28f25da9e8
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jun 24 14:29:29 2024 +0200

    Move to tests

commit 111900c122
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jun 24 14:23:28 2024 +0200

    Cleanup

commit 10033ead91
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jun 24 14:23:03 2024 +0200

    Add specific esm testing environment for tokens

commit 2b3f602312
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Mon Jun 24 17:50:24 2024 +0530

    Move json encode functionalities to tokens namespace

commit ba6a6059c1
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jun 24 14:07:21 2024 +0200

    Move to custom ns

commit 69d9c8e88f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jun 24 12:44:29 2024 +0200

    Add esm test

commit ab51b43365
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jun 24 12:44:05 2024 +0200

    Add type

commit 0a73cbc6f1
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Mon Jun 24 14:18:57 2024 +0530

    Move transform and download functionality to core.cljs

commit bbb09567f6
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Mon Jun 24 14:18:35 2024 +0530

    Remove sample json data

commit 5c42514170
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jun 24 09:59:22 2024 +0200

    Add style dictionary find-token-reference test

commit 75bdda6b07
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Sun Jun 23 00:16:15 2024 +0530

    add some formatting

commit 62fc2cf652
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Sun Jun 23 00:10:02 2024 +0530

    Add initial working export tokens-json

commit 5f25bd8a7b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jun 21 19:41:04 2024 +0200

    Add comments

commit 59780a9d4d
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jun 21 19:40:03 2024 +0200

    Add token finding function

commit 598e4d36fc
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jun 21 17:19:59 2024 +0200

    Disable on value error

commit 910485008f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jun 21 17:19:13 2024 +0200

    Fix name not updating button

commit 39eb964cb7
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jun 21 17:18:56 2024 +0200

    Reduce debounce timeout

commit dd62c7fe18
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jun 21 17:00:56 2024 +0200

    Give new tokens without a name a temporary hardcoded string

commit 1dcdddb2db
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jun 21 17:00:45 2024 +0200

    Check for self references

commit 941fb041b6
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jun 21 17:00:00 2024 +0200

    Add form styling

commit 8db47b5877
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jun 21 15:09:46 2024 +0200

    Use initial value

commit 53f01ef46c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jun 21 15:04:30 2024 +0200

    Use input as cache key

commit 35ee732701
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jun 21 14:59:08 2024 +0200

    Debounced update of resolved value

commit f00ac72fbe
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jun 21 10:10:45 2024 +0200

    Revert to use-var

commit e394216f00
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jun 21 10:02:21 2024 +0200

    Move form out of modal specific code

commit 1ca3f29708
Merge: f000a5145 80ec74f77
Author: SorsOps <80043879+SorsOps@users.noreply.github.com>
Date:   Thu Jun 20 17:03:45 2024 +0200

    Merge pull request #190 from tokens-studio/pr-test

    Test

commit 80ec74f77e
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Thu Jun 20 17:00:38 2024 +0200

    Fix resolver and add an oauth2 proxy

commit ef6074a5af
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Thu Jun 20 15:35:33 2024 +0200

    Test

commit f000a51451
Merge: 15041a8b9 125e14615
Author: SorsOps <80043879+SorsOps@users.noreply.github.com>
Date:   Thu Jun 20 13:29:37 2024 +0200

    Merge pull request #189 from tokens-studio/clean-ci

    Fix proxy cache for config map

commit 125e146150
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Thu Jun 20 13:28:13 2024 +0200

    fix proxy cache for config map

commit 15041a8b9a
Merge: 31344a532 5c93cf9cd
Author: SorsOps <80043879+SorsOps@users.noreply.github.com>
Date:   Thu Jun 20 13:04:29 2024 +0200

    Merge pull request #188 from tokens-studio/clean-ci

    Fix font issues

commit 5c93cf9cd3
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Thu Jun 20 13:03:49 2024 +0200

    Fix font issues
    Fix minio resolution not working
    Fix redis auth on by default

commit 31344a5322
Merge: ea5dbe275 867fd2391
Author: SorsOps <80043879+SorsOps@users.noreply.github.com>
Date:   Thu Jun 20 02:18:31 2024 +0200

    Merge pull request #187 from tokens-studio/clean-ci

    Cleanup

commit 867fd23917
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Thu Jun 20 02:15:35 2024 +0200

    Cleanup

commit ea5dbe275e
Merge: dcf4b7ce6 41bd4c621
Author: SorsOps <80043879+SorsOps@users.noreply.github.com>
Date:   Thu Jun 20 02:06:50 2024 +0200

    Merge pull request #185 from tokens-studio/feat/mailslurper

    Feat/mailslurper

commit 41bd4c621f
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Thu Jun 20 02:06:21 2024 +0200

    Last round of changes

commit 228665f5f2
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Thu Jun 20 00:58:10 2024 +0200

    Pr should be a prefix

commit be6b217ef0
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Thu Jun 20 00:49:33 2024 +0200

    Fix to use the sanitize the backend tag

commit 87b1bc12c2
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Thu Jun 20 00:40:10 2024 +0200

    Change asset storage

commit 4b61e0d80c
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Wed Jun 19 21:09:18 2024 +0200

    Fix branch name detection

commit f5514b419a
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Wed Jun 19 21:02:16 2024 +0200

    Use a raw tag

commit 349bdbb776
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Wed Jun 19 20:52:33 2024 +0200

    Change to use branch names instead of shas

commit 0fd4f814d8
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Wed Jun 19 20:47:35 2024 +0200

    Remove node affinity

commit 79b49bae27
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Wed Jun 19 20:31:21 2024 +0200

    Update namespace

commit dcf4b7ce64
Merge: 596c1997b f45789596
Author: SorsOps <80043879+SorsOps@users.noreply.github.com>
Date:   Wed Jun 19 20:16:39 2024 +0200

    Merge pull request #186 from tokens-studio/feat/clean-images

    Add clean images workflow

commit f457895961
Author: SorsOps <80043879+SorsOps@users.noreply.github.com>
Date:   Wed Jun 19 18:15:53 2024 +0000

    Add clean images workflow

commit b40f222d16
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Wed Jun 19 20:06:35 2024 +0200

    Add quote

commit 99d6df4588
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Wed Jun 19 19:58:44 2024 +0200

    Build backend as part of PR

commit 034d5ad5ab
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Wed Jun 19 19:57:19 2024 +0200

    Overhaul penpot chart

commit 885322d479
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jun 19 17:17:00 2024 +0200

    Reestore fields

commit 0830a26be9
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jun 19 17:11:28 2024 +0200

    Add error state for invalid name

commit 905ccfdec9
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Wed Jun 19 16:36:00 2024 +0200

    Capitalize chart

commit e3d73be7c5
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Wed Jun 19 16:35:46 2024 +0200

    Make sure the uppercase goes through

commit 072baf9c7b
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Wed Jun 19 16:30:45 2024 +0200

    Test PR again

commit 3e20e15ffd
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Wed Jun 19 16:22:28 2024 +0200

    Try fix PR chart

commit 6ed788aa5a
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Wed Jun 19 16:15:20 2024 +0200

    Add patch to enable SMTP

commit 0c45d15fe7
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jun 19 16:01:40 2024 +0200

    Variadic function doesn't work for hooks

commit 596c1997b8
Merge: f3d5b10e1 21ef1586f
Author: SorsOps <80043879+SorsOps@users.noreply.github.com>
Date:   Wed Jun 19 15:57:35 2024 +0200

    Merge pull request #184 from tokens-studio/feat/mailslurper

    Move config from chart to include the smtp settings

commit 21ef1586f0
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Wed Jun 19 15:56:03 2024 +0200

    Move config

commit f3d5b10e1f
Merge: 2ce3a180e 3e94d4685
Author: SorsOps <80043879+SorsOps@users.noreply.github.com>
Date:   Wed Jun 19 15:37:02 2024 +0200

    Merge pull request #183 from tokens-studio/feat/mailslurper

    Typo in infra manifest

commit 3e94d46850
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Wed Jun 19 15:35:15 2024 +0200

    Typo

commit 2ce3a180eb
Merge: caa41146c 569db9d1e
Author: SorsOps <80043879+SorsOps@users.noreply.github.com>
Date:   Wed Jun 19 15:27:59 2024 +0200

    Merge pull request #182 from tokens-studio/feat/mailslurper

    Try cleanup namespace control

commit 569db9d1e6
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Wed Jun 19 15:25:12 2024 +0200

    Try cleanup namespace control

commit caa41146c4
Merge: a2292eb38 5e32a5bbf
Author: SorsOps <80043879+SorsOps@users.noreply.github.com>
Date:   Wed Jun 19 14:56:29 2024 +0200

    Merge pull request #181 from tokens-studio/feat/mailslurper

    Remove onechart for simple manifests

commit 5e32a5bbfd
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Wed Jun 19 14:53:21 2024 +0200

    Remove onechart for simple manifests

commit a2292eb387
Merge: 4c236ab42 deb7ba982
Author: SorsOps <80043879+SorsOps@users.noreply.github.com>
Date:   Wed Jun 19 14:43:24 2024 +0200

    Merge pull request #180 from tokens-studio/feat/mailslurper

    Setup mailslurper

commit deb7ba9823
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Wed Jun 19 14:42:04 2024 +0200

    Setup mailslurper

commit 4c236ab423
Merge: 168a5d57d 386bf1bc2
Author: SorsOps <80043879+SorsOps@users.noreply.github.com>
Date:   Wed Jun 19 14:10:43 2024 +0200

    Merge pull request #179 from tokens-studio/fix/persistence

    Add persistence to penpot deploys

commit 386bf1bc2f
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Wed Jun 19 14:09:35 2024 +0200

    Add persistence to penpot deploys

commit 1596dbe155
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jun 19 13:54:09 2024 +0200

    Add function to verify already used names

commit deb9cb1120
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jun 19 11:26:29 2024 +0200

    Remove debugging code

commit f169d49397
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jun 19 11:18:41 2024 +0200

    Remove double cljs conversion

commit 0a73c3aa95
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jun 19 11:09:01 2024 +0200

    Validation in modal

commit 168a5d57d4
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jun 19 10:49:35 2024 +0200

    Add template

commit a4ef2ee8bf
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jun 19 10:42:42 2024 +0200

    Add changelog

commit 83515250da
Merge: 0d4e3e862 5a8a32ddc
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed Jun 19 10:10:43 2024 +0200

    Merge pull request #168 from tokens-studio/style-dictionary

    References & Expressions in Tokens

commit 5a8a32ddc7
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jun 19 09:43:36 2024 +0200

    Remove items with missing references

commit 23de79bd04
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jun 19 09:40:26 2024 +0200

    Remove unneeded function

commit 0d4e3e8629
Merge: 35135635c 0105e4206
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Jun 19 12:58:54 2024 +0530

    Merge pull request #174 from tokens-studio/fix-dimensions-keys-applied

    Fix keys applied when dimensions or sizing token is applied directly

commit 35135635c4
Merge: 2ed3ea6d6 0afddac5d
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Jun 19 12:58:43 2024 +0530

    Merge pull request #175 from tokens-studio/fix-min-max-height-error

    Fix/ min and max height-width application

commit 2ed3ea6d6a
Merge: 1ebd2ee3d 3bbee9532
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Jun 19 12:58:25 2024 +0530

    Merge pull request #177 from tokens-studio/remove-registration-questionnaire

    Remove registration questionnaire

commit 3bbee9532f
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Jun 19 12:38:28 2024 +0530

    Fix error message

commit f99239341f
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Jun 19 12:18:39 2024 +0530

    add message to undo this change in the future

commit f405612a25
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Jun 19 12:16:54 2024 +0530

    Remove Onboarding Questionnaire

commit 0afddac5d1
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Jun 18 23:52:54 2024 +0530

    Fix/ min and max height-width application

commit 0105e42068
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Jun 18 23:21:17 2024 +0530

    Fix keys applied when dimensions or sizing token is applied directly

commit b4d7680cb4
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 18 11:29:02 2024 +0200

    Show resolved value

commit 742bb6de05
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 18 11:28:09 2024 +0200

    Handle tokens with issues in ui

commit a390942722
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 18 11:19:09 2024 +0200

    Resolve token value

commit cf52e873e2
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 18 11:13:26 2024 +0200

    Cleanup

commit 5c2891b247
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 18 11:10:51 2024 +0200

    Use resolved tokens from style-dictionary

commit 9261c53aff
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 18 10:23:52 2024 +0200

    Don't override original value, add resolved value, add missing reference error

commit d65d880845
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 18 09:59:36 2024 +0200

    Silence errors

commit 09609c18ef
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jun 17 17:07:02 2024 +0200

    Remove compile style dictionary

commit f0bc262a18
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jun 17 17:05:51 2024 +0200

    Working version

commit 5a64947b08
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jun 17 16:13:34 2024 +0200

    Add patched StyleDictionary

commit 0a86e3a651
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri Jun 14 10:52:30 2024 +0200

    Simplify

commit c9df90577f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Jun 13 09:27:53 2024 +0200

    Add compiled library

commit 965da83c97
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jun 12 17:14:34 2024 +0200

    Add workspace-tokens helper

commit 9bc48a3a1a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jun 12 17:14:27 2024 +0200

    Allow passing custom cache atom

commit 908cc2240f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jun 12 16:48:13 2024 +0200

    Docs

commit a79d1013bf
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jun 12 16:45:24 2024 +0200

    Prevent reprocessing the style-dictionary cache multiple times

commit 73e8b80521
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jun 12 16:19:39 2024 +0200

    Cleanup

commit 2f45ab1b62
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jun 12 16:19:03 2024 +0200

    Add hook for using resolved tokens cache

commit 0921f8043b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed Jun 12 16:10:02 2024 +0200

    Allow passing of tokens

commit b1b6b5292c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 11 17:52:29 2024 +0200

    Disable invalid token style for now

commit 4fec7d5af2
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 11 17:52:12 2024 +0200

    Applying resolved token value

commit 66b4b892df
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 11 16:43:54 2024 +0200

    Fix data-keys being converted to camel-case

commit 4b90e90974
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 11 16:41:50 2024 +0200

    Backporting resolved tokens to the original structure

commit 1519f8f560
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 11 15:12:30 2024 +0200

    Move to ns

commit e691628648
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 11 10:42:25 2024 +0200

    Test out tokens-studio data

commit efd4c5dcca
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue Jun 11 10:24:12 2024 +0200

    Add performance measuring

commit a5b22d5427
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jun 10 15:50:48 2024 +0200

    Got resolve working

commit 7da772d6a2
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jun 10 11:54:34 2024 +0200

    Add sd function

commit 1023ba866a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jun 10 10:52:03 2024 +0200

    Add StyleDictionary as compiled lib

commit 1ebd2ee3d7
Merge: dc36f4f6d 8d444b4b0
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Fri Jun 14 12:40:44 2024 +0530

    Merge pull request #172 from tokens-studio/hide-unfunctional-token-sections

    Hide non functional token sections

commit 8d444b4b02
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Thu Jun 13 21:33:38 2024 +0530

    Hide non functional token types from UI

commit dc36f4f6d3
Merge: 93c249c77 f10a4f28e
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Thu Jun 13 12:59:49 2024 +0530

    Merge pull request #164 from tokens-studio/other-token-types-context-menu

    Add context menu for opacity, rotation and stroke width tokens

commit f10a4f28ea
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Jun 12 16:18:51 2024 +0530

    Add context menu for opacity, rotation and stroke width

commit 93c249c77a
Merge: 01d2a25c8 3f55536fc
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Jun 12 15:29:30 2024 +0530

    Merge pull request #161 from tokens-studio/dimensions-context-menu

    Dimensions context menu

commit 3f55536fc0
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Mon Jun 10 23:25:11 2024 +0530

    Add custom context menu and fix styling issues with subcontext menu

commit 842b76f3c1
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Fri Jun 7 01:37:26 2024 +0530

    replace 30px with variables

commit e86038d52f
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Fri Jun 7 01:27:18 2024 +0530

    Add CSS to deal with margin before the Sub Context Menu titles

commit 91eb59696c
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Thu Jun 6 23:09:22 2024 +0530

    Remove children attribute and use submenu instead

commit 67a34c91d8
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Jun 5 23:19:43 2024 +0530

    Add leading spaces to subcontext menu titles

commit 307f472528
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Jun 5 22:23:27 2024 +0530

    remove print statement

commit a5c235754c
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Jun 5 22:06:59 2024 +0530

    Cleanup debug statements

commit a98d6b4c07
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Jun 5 22:06:31 2024 +0530

    Add context menu functionalities for dimensions token

commit ed0d9e1cf5
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Jun 5 13:49:18 2024 +0530

    initial dimensions context menu

commit 819c50eaf8
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed Jun 5 13:49:00 2024 +0530

    change dimension to dimensions across

commit 01d2a25c8c
Merge: e8b755c75 ea593221b
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Jun 4 17:02:04 2024 +0530

    Merge pull request #160 from tokens-studio/sizing-token-context-menu

    Add new changes from token-studio-develop merge

commit ea593221b3
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Jun 4 15:52:52 2024 +0530

    Add new changes from token-studio-develop merge

commit e8b755c757
Merge: 202b72dcd 88d3fc234
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Jun 4 15:47:58 2024 +0530

    Merge pull request #159 from tokens-studio/sizing-token-context-menu

    Add context menu functionalities on sizing tokens

commit 88d3fc234d
Merge: a553253d2 202b72dcd
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue Jun 4 15:46:02 2024 +0530

    Resolve merge conflicts in context_menu.cljs

commit 202b72dcd0
Merge: 1056c6b44 057934c88
Author: SorsOps <80043879+SorsOps@users.noreply.github.com>
Date:   Tue Jun 4 11:23:49 2024 +0200

    Merge pull request #132 from tokens-studio/feat/branch-deploys

    Prefer wait over deploy for build

commit 057934c883
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Tue Jun 4 11:11:58 2024 +0200

    Cleanup PR

commit 3b3fbc2ccd
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Tue Jun 4 11:06:00 2024 +0200

    fix deploys

commit 1056c6b448
Merge: dc14933f3 580076355
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Tue Jun 4 10:39:03 2024 +0200

    Merge pull request #158 from tokens-studio/142-when-a-token-is-applied-on-a-shape-in-the-context-menu-there-should-be-check-box-indicating-which-attribute-is-applied

    Show checkmark next to selected token attributes

commit a553253d28
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Mon Jun 3 23:34:51 2024 +0530

    remove println statement

commit 193ad115a2
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Mon Jun 3 23:25:59 2024 +0530

    Add context menu functionalities on sizing tokens

commit 580076355b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jun 3 15:21:08 2024 +0200

    Show checkmark for applied tokens

commit 65942ef63b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jun 3 13:39:26 2024 +0200

    Use set of attributes for action generation

commit c1096e15da
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jun 3 13:39:16 2024 +0200

    Cleanup

commit dc14933f3a
Merge: e89f03393 3c3ef57da
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon Jun 3 10:51:04 2024 +0200

    Merge remote-tracking branch 'penpot/develop' into token-studio-develop

commit e89f03393b
Merge: 5c7e235c9 86e6421b6
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Mon Jun 3 10:48:49 2024 +0200

    Merge pull request #157 from tokens-studio/florian/input-select

    Allow token selection with keyboard from right side

commit 86e6421b68
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri May 31 16:25:30 2024 +0200

    Disable selection when entering with mouse

commit 710fa0d817
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri May 31 16:22:01 2024 +0200

    Allow arrow selection

commit 5c7e235c97
Merge: d624a559a c3cee77ef
Author: Akshay Gupta <akshay@hyma.io>
Date:   Fri May 31 18:31:37 2024 +0530

    Merge pull request #155 from tokens-studio/spacing-context-menu

    Spacing context menu

commit c3cee77efb
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Fri May 31 18:19:42 2024 +0530

    remove unused imports and refactor functions

commit d624a559aa
Merge: 420b8cf52 d16f1c773
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Fri May 31 10:46:51 2024 +0200

    Merge pull request #150 from tokens-studio/flex-row-gap-commit

    Spacing tokens

commit 76347228fe
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Thu May 30 22:25:21 2024 +0530

    Add all spacing token context menu functionalities

commit 84d96a1004
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed May 29 18:47:17 2024 +0530

    Add initial spacing context menu entries

commit d16f1c773e
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 29 14:53:40 2024 +0200

    Change both properties

commit 7376cb634a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 29 14:32:09 2024 +0200

    Add padding x/y tokens

commit 0e7e37afc2
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 29 14:21:33 2024 +0200

    Add padding editable select

commit 28bdf62454
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 29 13:50:31 2024 +0200

    Integrate changes

commit 420b8cf524
Merge: bdefc97c2 c2c0fbf40
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed May 29 13:20:44 2024 +0200

    Merge pull request #146 from tokens-studio/135-flex-row--gap-token-updating-from-the-right-sidebar

    135 flex row  gap token updating from the right sidebar

commit 78f3d54dee
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 29 10:55:40 2024 +0200

    Add commit

commit c2c0fbf40a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 29 09:37:24 2024 +0200

    Add spacing/row options

commit 1ad998de23
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 29 09:28:38 2024 +0200

    Use editable-select for col-gap/row-gap

commit fb5f7e870a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 29 09:23:47 2024 +0200

    Fix drop-down button spacing

commit 5c83247256
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 29 09:20:14 2024 +0200

    Prevent selection on disabled selects

commit c6f5da8873
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 29 09:16:55 2024 +0200

    Move select styles to select component

commit 9a7c944763
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 29 09:04:49 2024 +0200

    Remove unused classname

commit 985d8d33ff
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 29 09:02:26 2024 +0200

    Add event to passed arguments [*]

    [*] Needed for layout_container component

commit 384da8555d
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 29 08:50:50 2024 +0200

    Dynamically pass props to input

commit bdefc97c21
Merge: 144b164fa bb3ee2278
Author: Akshay Gupta <akshay@hyma.io>
Date:   Tue May 28 17:36:59 2024 +0530

    Merge pull request #140 from tokens-studio/general-token-context-menu-functions

    General token context menu functions and specific context menu functions for border radius

commit bb3ee22780
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue May 28 17:03:26 2024 +0530

    pass context menu attributes as map and some minor fixes

commit e02777b855
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Tue May 28 10:23:20 2024 +0200

    Be explicit in tagging for prs

commit 144b164fa0
Merge: 169d71b2d 96a7cf2e9
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Tue May 28 10:06:12 2024 +0200

    Merge pull request #139 from tokens-studio/fix-staging

    Fix staging

commit eeb87e49a2
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Tue May 28 09:58:15 2024 +0200

    Cleanup github token usage

commit 9066ad9e39
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue May 28 02:22:25 2024 +0530

    Add border radius specific context menu functions

commit 464bdf3d9c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon May 27 15:09:36 2024 +0200

    Use single undo operation for width/height change

commit 96a7cf2e98
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon May 27 14:50:55 2024 +0200

    Convert kebab keys into camelCase

commit 47d75e7e2a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon May 27 14:43:28 2024 +0200

    Remove closed for now

commit 6ed5dc138d
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon May 27 14:43:11 2024 +0200

    Fix editing/saving

commit 169d71b2df
Merge: 65563e2d3 6bacd1d66
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Mon May 27 11:22:27 2024 +0200

    Merge pull request #138 from tokens-studio/124-disable-1password-completion

    124 disable 1password completion

commit 6bacd1d663
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon May 27 11:13:05 2024 +0200

    Disable password manager completion

commit 86d7979e1e
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon May 27 11:12:36 2024 +0200

    Remove unused component

commit d1fc43d8d6
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Mon May 27 10:38:35 2024 +0200

    Try force deploy branch PR

commit 370a5d9bb8
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Mon May 27 13:02:24 2024 +0530

    Add initial context menu token specific functionality

commit 65563e2d3c
Merge: 968c6437f 7a8722de1
Author: Akshay Gupta <akshay@hyma.io>
Date:   Fri May 24 18:13:00 2024 +0530

    Merge pull request #133 from tokens-studio/editing-tokens

    :feat editing tokens

commit 968c6437fb
Merge: 75b935187 cbad5033c
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Fri May 24 11:46:45 2024 +0200

    Merge pull request #134 from tokens-studio/123-other-fields-to-update

    Width/Height Token Changing from the sidebar

commit cbad5033c2
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri May 24 11:25:30 2024 +0200

    Cleanup

commit f52e2e3a41
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri May 24 10:34:20 2024 +0200

    Differentiate width/height sizing selected properties

commit 49d9b52b12
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri May 24 10:01:13 2024 +0200

    Cleanup

commit ea9d850412
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri May 24 10:00:43 2024 +0200

    Fix selectionStart not being detectable (selectionStart doesnt work for number)

commit b6061cc4a0
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri May 24 10:00:26 2024 +0200

    Fix instant value change applies shape attributes

commit bc620ba2cd
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri May 24 08:55:04 2024 +0200

    Update width value

commit 595831118d
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri May 24 08:36:28 2024 +0200

    Allow aligning dropwdown to the left

commit 406e8d110c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri May 24 07:34:43 2024 +0200

    De-Applying token

commit 7a8722de1b
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Fri May 24 00:14:17 2024 +0530

    Add ability to edit existing token attributes

commit 5131b79060
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Thu May 23 16:22:31 2024 +0200

    Prefer wait over deploy for build

commit 75b9351871
Merge: 557195cd5 84ad8a6be
Author: SorsOps <80043879+SorsOps@users.noreply.github.com>
Date:   Thu May 23 16:19:31 2024 +0200

    Merge pull request #131 from tokens-studio/feat/branch-deploys

    Test PR deploys

commit 84ad8a6be6
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Thu May 23 15:39:21 2024 +0200

    Escape interpolation

commit f9e1a65631
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Thu May 23 15:23:27 2024 +0200

    Trigger cleanup as well

commit 66f67ddff4
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Thu May 23 15:13:43 2024 +0200

    Test PR deploys

commit 2dd994799c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu May 23 09:41:16 2024 +0200

    Abstract API

commit e181065bda
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu May 23 09:29:17 2024 +0200

    Formatting

commit 1ed692230b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu May 23 09:24:12 2024 +0200

    Abstract functionality

commit 557195cd55
Merge: 2818d097a 80ff7f769
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Thu May 23 11:05:12 2024 +0200

    Merge pull request #130 from tokens-studio/129-bug-file-is-crashing-post-applying-a-border-radius-token-to-a-shape

    Fix non-optional keys breaking staging server

commit 80ff7f769c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu May 23 10:53:18 2024 +0200

    Fix non-optional keys breaking staging server

commit 273a9530ea
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Thu May 23 13:14:28 2024 +0530

    initial edit commit

commit 2818d097ab
Merge: 1a144192a cc0e4af4b
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Thu May 23 08:43:51 2024 +0200

    Merge pull request #128 from tokens-studio/119-higlight-applied-token-in-the-editing-field

    Show token value inside shapes panel (border-radius)

commit cc0e4af4bc
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 22 16:37:19 2024 +0200

    Fix token value not being removed after submit

commit b1379ed7de
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 22 16:35:44 2024 +0200

    Fix refocus prop not being removed

commit 5bccfa9e2f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 22 16:29:18 2024 +0200

    Dont submit token when text is selected

commit 5806ae7426
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 22 16:20:40 2024 +0200

    Abstract functions

commit 2eb5efb274
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 22 16:13:58 2024 +0200

    Cleanup

commit 850bf80ffc
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 22 15:59:22 2024 +0200

    Replace token with value when inserted after token input

commit 6f5930bf15
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 22 15:43:40 2024 +0200

    Clear token value on blur

commit 2efd6e1584
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 22 15:36:26 2024 +0200

    Refocus input on token deletion

commit 86b493522c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 22 15:12:56 2024 +0200

    Remove unneeded focus hack

commit 1a144192a9
Merge: cbfcc5056 04c43acf3
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed May 22 15:00:05 2024 +0200

    Merge pull request #127 from tokens-studio/fix-sass-pipe-break

    Dont break pipe when sass has an error

commit 70336ea45e
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 22 14:26:37 2024 +0200

    Style focused pill

commit 7e79cf274d
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 22 14:17:56 2024 +0200

    Fix input background being clipped on hover

commit 42df426375
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 22 14:13:33 2024 +0200

    Style pill and input combination

commit 7c80f87f30
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 22 14:13:23 2024 +0200

    Show value instead of label, add title

commit 019759392c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 22 10:23:57 2024 +0200

    Unlink token when pressing backspace on empty input field

commit 7da382dfed
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue May 21 15:47:18 2024 +0200

    Clear value when pressing backspace as last action

commit 35f384ce9b
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue May 21 15:40:34 2024 +0200

    Use custom input value logic when token is applied

commit 50354ccb71
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue May 21 15:40:19 2024 +0200

    Fix state being reset at start

commit 975f41bc08
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue May 21 15:21:01 2024 +0200

    Display regular input field when token is applied [*]

    [*] Numeric input renders default 0

commit 04c43acf39
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 22 13:48:13 2024 +0200

    Dont break pipe when sass has an error

commit cbfcc50563
Merge: 44f55308a eb168a6f9
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 22 13:46:26 2024 +0200

    Merge remote-tracking branch 'penpot/develop' into token-studio-develop

commit 44f55308a6
Merge: e874ed5b6 2b1066535
Author: Akshay Gupta <akshay@hyma.io>
Date:   Wed May 22 15:14:54 2024 +0530

    Merge pull request #126 from tokens-studio/rotation-token

    Add ability to apply rotation token

commit 2b10665356
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed May 22 15:11:01 2024 +0530

    close applied tokens map schema

commit 13a8872dbd
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed May 22 15:08:05 2024 +0530

    add rotation to applied tokens schema

commit 3793f1791a
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed May 22 13:08:59 2024 +0530

    Add ability to apply rotation token

commit e874ed5b6c
Merge: cb7d4409e eca133426
Author: Akshay Gupta <akshay@hyma.io>
Date:   Tue May 21 17:11:21 2024 +0530

    Merge pull request #125 from tokens-studio/remember-token-section-state

    Remember token section open/close state

commit eca1334266
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue May 21 16:52:47 2024 +0530

    Remember token section open/close state

commit cb7d4409e2
Merge: a1f09d69b 9b13444c4
Author: Akshay Gupta <akshay@hyma.io>
Date:   Tue May 21 13:28:34 2024 +0530

    Merge pull request #116 from tokens-studio/spacing-token-layout-update

    spacing token to update only row or column gap as per flex direction

commit a1f09d69b0
Merge: 162e7b6c5 344a27602
Author: Akshay Gupta <akshay@hyma.io>
Date:   Tue May 21 13:27:42 2024 +0530

    Merge pull request #117 from tokens-studio/sort-tokens-by-insert-order

    sort tokens by insert order

commit 344a27602b
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Mon May 20 22:25:46 2024 +0530

    sort tokens by insert order

commit 9b13444c44
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Mon May 20 21:59:28 2024 +0530

    spacing token to update only row or column gap as per flex direction

commit 162e7b6c58
Merge: 90ab485e7 5954a8698
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Mon May 20 12:59:50 2024 +0200

    Merge branch 'token-studio-develop' of github.com:tokens-studio/tokens-studio-for-penpot into feat/port-tracking-and-smoke

commit 90ab485e78
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Mon May 20 12:56:43 2024 +0200

    Needs depend on smoke

commit 5954a8698b
Merge: ec36e06b7 851054c61
Author: SorsOps <80043879+SorsOps@users.noreply.github.com>
Date:   Mon May 20 12:45:42 2024 +0200

    Merge pull request #114 from tokens-studio/feat/port-tracking-and-smoke

    Add port label tracking and add a smoke test

commit 851054c617
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Mon May 20 12:11:29 2024 +0200

    Add port label tracking and add a smoke test

commit ec36e06b7b
Merge: 0bd3b0598 3caa9d780
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Fri May 17 14:59:28 2024 +0200

    Merge pull request #113 from tokens-studio/108-custom-editable-select-for-token-completion

    Custom editable select for token completion

commit 3caa9d780a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri May 17 11:37:36 2024 +0200

    Show checkmark icon for applied tokens

commit ad26d9e2d3
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri May 17 10:55:24 2024 +0200

    More styling

commit 85a40d19ed
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri May 17 10:26:32 2024 +0200

    Extract component

commit b61a59d375
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri May 17 10:16:01 2024 +0200

    Extract key down handler

commit ced325e009
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri May 17 10:15:22 2024 +0200

    Return selected item map instead of value [*]

    [*] Multiple tokens could have the same value

commit e69bfb8c54
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri May 17 09:05:18 2024 +0200

    Style select

commit 8dd2ba7d78
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri May 17 09:04:50 2024 +0200

    Fix naming

commit cb980ace44
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri May 17 09:04:35 2024 +0200

    Use regular map for options

commit 165e222117
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri May 17 08:17:51 2024 +0200

    Only show dropdown when options contain items

commit b0dcbae3ac
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri May 17 08:13:55 2024 +0200

    Fix border clipping

commit 6a8887d9cc
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri May 17 08:04:23 2024 +0200

    Remove text transform

commit d2107e7f69
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri May 17 08:02:06 2024 +0200

    Fix width of drop down

commit 91271b9e41
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri May 17 07:57:55 2024 +0200

    Custom editable-select

commit 0bd3b0598b
Merge: 23ee54b4b a3d4d6226
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu May 16 18:43:05 2024 +0200

    Merge remote-tracking branch 'penpot/develop' into token-studio-develop

commit 23ee54b4b7
Merge: bde2b4b3a c654766f8
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Thu May 16 18:37:46 2024 +0200

    Merge pull request #111 from tokens-studio/71-apply-token-from-the-shapes-panel-right-side

    Apply border radius token from the shapes panel

commit bde2b4b3a5
Merge: 3e7a42213 c44ac862f
Author: Akshay Gupta <akshay@hyma.io>
Date:   Thu May 16 17:15:59 2024 +0530

    Merge pull request #110 from tokens-studio/duplicate-token

    add functionality to duplicate token from context menu

commit c44ac862f0
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Thu May 16 15:48:39 2024 +0530

    simplify duplicate token function

commit c654766f87
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu May 16 11:43:37 2024 +0200

    Cleanup outdated props

commit 5205b684e9
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu May 16 11:36:08 2024 +0200

    Fix token not being applied

commit e1ae3d55af
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Thu May 16 14:08:11 2024 +0530

    ad functionality to duplicate token from context menu

commit 23bee8415a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu May 16 09:59:55 2024 +0200

    Fix missing dependency

commit 48c85d7200
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu May 16 09:55:57 2024 +0200

    Simplify token application

commit 0d154679e9
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu May 16 09:44:11 2024 +0200

    Add docstrings

commit c60c5ac34f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu May 16 09:33:20 2024 +0200

    Apply tokens directly to shape

commit cdca00a986
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu May 16 09:02:48 2024 +0200

    Extract token apply function

commit 4e3af1407d
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 15 18:28:04 2024 +0200

    Fix styling of dropdown items?

commit 9a58188dc3
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 15 18:20:47 2024 +0200

    Show border-radius tokens as options

commit d9dbaad281
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 15 18:20:28 2024 +0200

    Add tokens map generators

commit 5e301605ad
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 15 17:44:06 2024 +0200

    Extract token grouping to core

commit 622843f18d
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 15 17:43:49 2024 +0200

    Take tokens as ref

commit 8f852bf48f
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 15 17:26:10 2024 +0200

    Use :as

commit 3e7a422136
Merge: f8972efea 591e33340
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed May 15 17:14:41 2024 +0200

    Merge pull request #104 from tokens-studio/fix-sizing-dimensions-mixup

    Fix sizing/dimensions token mixup

commit 591e333400
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Wed May 15 15:40:07 2024 +0200

    Fix sizing/dimensions token mixup

commit f8972efea0
Merge: d4dd49bdb d69cca2d9
Author: Akshay Gupta <akshay@hyma.io>
Date:   Wed May 15 18:56:42 2024 +0530

    Merge pull request #103 from tokens-studio/simple-context-menu

    fix delimiter mismatch and add missing data/tokens package

commit d69cca2d9c
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed May 15 18:50:30 2024 +0530

    fix delimiter mismatch and add missing data/tokens package

commit d4dd49bdb7
Merge: 157bb01e8 ec5a11731
Author: Akshay Gupta <akshay@hyma.io>
Date:   Wed May 15 18:31:13 2024 +0530

    Merge pull request #97 from tokens-studio/simple-context-menu

    Simple context menu

commit ec5a117318
Merge: d3d454a43 157bb01e8
Author: Akshay Gupta <akshay@hyma.io>
Date:   Wed May 15 18:30:53 2024 +0530

    Merge branch 'token-studio-develop' into simple-context-menu

commit d3d454a43c
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed May 15 14:50:24 2024 +0530

    move delete token to tokens actions section

commit 5fa2048b23
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed May 15 14:40:46 2024 +0530

    re-use workspace context menu entry and fix double nested ul

commit 316db61c8a
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed May 15 13:23:47 2024 +0530

    remove warning modal when deletion of a token

commit fcd7a35b46
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed May 15 12:59:18 2024 +0530

    move context menu functions to data/tokens

commit 157bb01e8f
Merge: b9e9f9fb1 584ac6341
Author: SorsOps <80043879+SorsOps@users.noreply.github.com>
Date:   Tue May 14 16:39:16 2024 +0200

    Merge pull request #99 from tokens-studio/fix/containerization

    Downtune replica amount. Cleanup redis host

commit 584ac6341d
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Tue May 14 16:37:16 2024 +0200

    Downtune replica amount. Cleanup redis host

commit b9e9f9fb13
Merge: d67311b12 4d14d78ee
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Tue May 14 16:27:19 2024 +0200

    Merge pull request #98 from tokens-studio/icons-spacing

    Add more space between icon and label, fix icon offset

commit 4d14d78eed
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue May 14 16:01:11 2024 +0200

    Add more space between icon and label, fix icon offset

commit d67311b126
Merge: 230b271be e6f86cda6
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Tue May 14 15:26:01 2024 +0200

    Merge pull request #96 from tokens-studio/95-placeholder-icons

    Add token placeholder icons

commit 8cb9d9c352
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue May 14 18:48:48 2024 +0530

    Add delete token functionality in context menu

commit 31b487ed86
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue May 14 18:25:08 2024 +0530

    remoev translation function

commit 24f1693684
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Tue May 14 18:10:13 2024 +0530

    Add Context Menu for tokens and simple placeholder functions

commit e6f86cda64
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue May 14 14:24:36 2024 +0200

    Add token placeholder icons

commit 230b271be3
Merge: 740024061 677b28218
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue May 14 12:00:45 2024 +0200

    Merge remote-tracking branch 'penpot/develop' into token-studio-develop

commit 7400240616
Merge: 550045cb3 aa8b1f4c7
Author: SorsOps <80043879+SorsOps@users.noreply.github.com>
Date:   Mon May 13 16:42:34 2024 +0200

    Merge pull request #94 from tokens-studio/fix/containerization

    Chart does auto inject the release name

commit aa8b1f4c73
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Mon May 13 16:41:51 2024 +0200

    Chart does auto inject the release name

commit 550045cb3b
Merge: 50f69936a 60207fd01
Author: SorsOps <80043879+SorsOps@users.noreply.github.com>
Date:   Mon May 13 16:21:37 2024 +0200

    Merge pull request #93 from tokens-studio/fix/containerization

    Circumvent bug

commit 60207fd01e
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Mon May 13 16:21:01 2024 +0200

    Circumvent bug

commit 50f69936a4
Merge: d90755531 f9d4b9f69
Author: SorsOps <80043879+SorsOps@users.noreply.github.com>
Date:   Mon May 13 16:10:32 2024 +0200

    Merge pull request #92 from tokens-studio/fix/containerization

    Add missing secretName

commit f9d4b9f699
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Mon May 13 16:09:56 2024 +0200

    Add missing secretName

commit d907555314
Merge: d3c0abc11 e50a46409
Author: SorsOps <80043879+SorsOps@users.noreply.github.com>
Date:   Mon May 13 15:32:21 2024 +0200

    Merge pull request #90 from tokens-studio/fix/containerization

    Add redis. Ingress should be under front end for some reason

commit e50a46409f
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Mon May 13 15:31:03 2024 +0200

    Add redis. Ingress should be under front end for some reason

commit d3c0abc11a
Merge: 64dc685f2 98d7895e2
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Mon May 13 15:09:48 2024 +0200

    Merge pull request #85 from tokens-studio/84-border-width

    Stroke Width

commit 64dc685f2a
Merge: 071df4074 79ce39612
Author: SorsOps <80043879+SorsOps@users.noreply.github.com>
Date:   Mon May 13 15:07:23 2024 +0200

    Merge pull request #89 from tokens-studio/fix/containerization

    Fix pull secrets needed to be a reference

commit 79ce396122
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Mon May 13 15:06:22 2024 +0200

    Fix pull secrets needed to be a reference

commit 071df4074f
Merge: 309abec88 0ce5c165d
Author: SorsOps <80043879+SorsOps@users.noreply.github.com>
Date:   Mon May 13 14:43:15 2024 +0200

    Merge pull request #88 from tokens-studio/fix/containerization

    Update secrets

commit 0ce5c165db
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Mon May 13 14:41:58 2024 +0200

    Update secrets

commit 309abec88a
Merge: 425155153 10aaa966f
Author: SorsOps <80043879+SorsOps@users.noreply.github.com>
Date:   Mon May 13 14:26:44 2024 +0200

    Merge pull request #87 from tokens-studio/fix/containerization

    Change deploy to use alternate chart as truecharts using a weird helm…

commit 10aaa966f9
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Mon May 13 14:25:07 2024 +0200

    Change deploy to use alternate chart as truecharts using a weird helm dependency

commit 98d7895e2a
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Mon May 13 11:23:30 2024 +0200

    Add stroke-width token

commit 4251551535
Merge: eafd4f01e ae263363e
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Fri May 10 17:36:50 2024 +0200

    Merge pull request #83 from tokens-studio/82-opacity

    Add opacity

commit eafd4f01eb
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Fri May 10 14:34:05 2024 +0200

    Use raw manifests

commit 153ea95a55
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Fri May 10 14:02:34 2024 +0200

    Typo

commit 16c893fa60
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Fri May 10 14:01:08 2024 +0200

    Add matrix for docker build

commit 0e94c9851a
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Fri May 10 13:59:09 2024 +0200

    Move workflow file

commit 07583b5e34
Author: SorsOps <80043879+sorsOps@users.noreply.github.com>
Date:   Fri May 10 13:57:17 2024 +0200

    Add deployment config

commit ae263363ed
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Thu May 9 21:36:38 2024 +0530

    Add opacity

commit 4e3ee7bdab
Merge: 5efcb0f42 42b25479b
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Fri May 10 12:05:06 2024 +0200

    Merge pull request #81 from tokens-studio/value-resolve

    Value resolve

commit 42b25479b3
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri May 10 10:36:56 2024 +0200

    Highlight invalid token values

commit 5813acea02
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri May 10 10:26:22 2024 +0200

    Log whole token

commit df48295903
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri May 10 10:22:09 2024 +0200

    Add resolving function and move to core ns

commit 5efcb0f424
Merge: 2ed4ece23 6d5beb758
Author: Akshay Gupta <akshay@hyma.io>
Date:   Fri May 10 12:25:23 2024 +0530

    Merge pull request #78 from tokens-studio/fix-assets-panel-view

    Fix assets panel tab view

commit 2ed4ece23d
Merge: d81b1f328 9a243e3b4
Author: Akshay Gupta <akshay@hyma.io>
Date:   Fri May 10 12:22:03 2024 +0530

    Merge pull request #76 from tokens-studio/token-pills-wrap

    Add flex wrap to token pills wrapper

commit d81b1f328d
Merge: 68a201374 0c856702c
Author: Akshay Gupta <akshay@hyma.io>
Date:   Fri May 10 12:21:38 2024 +0530

    Merge pull request #80 from tokens-studio/add-spacing-function

    Add simple token spacing application

commit 0c856702c6
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Fri May 10 08:36:40 2024 +0200

    Remove unneeded import

commit 76a38bcb0c
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Thu May 9 21:36:38 2024 +0530

    Add simple token spacing application

commit 6d5beb7583
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Thu May 9 18:42:33 2024 +0530

    Fix assets panel tab view

commit 9a243e3b4f
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Thu May 9 17:51:48 2024 +0530

    Add flex wrap to token pills wrapper

commit 68a201374c
Merge: 11d4496e9 69ed15e78
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed May 8 14:29:15 2024 +0200

    Merge pull request #74 from tokens-studio/70-sort-sections-by-tokens

    Sort token groups

commit 11d4496e9a
Merge: 6fa1d6eec fd3922936
Author: Florian Schrödl <contact@florianschroedl.com>
Date:   Wed May 8 14:29:02 2024 +0200

    Merge pull request #68 from tokens-studio/65-dimensions

    Dimensions Token

commit 6fa1d6eecc
Merge: 6bb4eec80 3d13015e3
Author: Akshay Gupta <akshay@hyma.io>
Date:   Wed May 8 17:52:33 2024 +0530

    Merge pull request #66 from tokens-studio/close-token-modal

    add ability to close modal once save token button is clicked

commit 69ed15e789
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Apr 25 19:00:00 2024 +0200

    Remove search bar

commit e5a7f87d1c
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Apr 25 19:00:00 2024 +0200

    Sort token groups

commit fd39229367
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Apr 25 19:00:00 2024 +0200

    Add shape dimensions updating

commit a9aac4c867
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Apr 25 19:00:00 2024 +0200

    Move emit to the shape update function [*]

    [*] A shape update might need multiple emit functions

commit 3d13015e30
Author: Akshay Gupta <gravity.akshay@gmail.com>
Date:   Wed May 8 15:16:11 2024 +0530

    add ability to close modal once save token button is clicked

commit 28e6db9bb4
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Apr 25 19:00:00 2024 +0200

    Reuse attribute keys from token schema

commit 6bb4eec805
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Apr 25 19:00:00 2024 +0200

    Remove unneeded on-apply prop

commit 76f42a0aec
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Apr 25 19:00:00 2024 +0200

    Cleanup on-apply-token function

commit f71ce60b11
Merge: e5c564041 e7b065ac6
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Tue May 7 14:39:33 2024 +0200

    Merge remote-tracking branch 'penpot/develop' into token-studio-develop

commit e5c5640413
Author: Florian Schroedl <flo.schroedl@gmail.com>
Date:   Thu Apr 25 19:00:00 2024 +0200

    Start tokens studio plugin base
2025-01-10 10:44:08 +01:00
Alejandro
d500058aa9 Merge pull request #5536 from penpot/ladybenko-9722-bool-ops
🎉 Implement boolean operations (wasm)
2025-01-10 09:11:41 +01:00
Andrey Antukh
a1037fb053 Merge remote-tracking branch 'origin/staging' into develop 2025-01-09 17:37:33 +01:00
Belén Albeza
4e5f67676c 🎉 Implement boolean operations (wasm) 2025-01-09 17:14:48 +01:00
Juanfran
1514faca55 Merge pull request #5505 from penpot/eva-fix-select
🐛 Fix some a11y errors on select component
2025-01-09 15:11:13 +01:00
Eva Marco
9d041b130c 🐛 Fix some a11y errors on select component 2025-01-09 13:17:29 +01:00
luisδμ
74f807d539 Merge pull request #5515 from penpot/qol-comments-mentions
 Add mentions to notifications
2025-01-09 12:42:11 +01:00
Belén Albeza
194cca4b64 Merge pull request #5526 from penpot/superalex-render-wasm-stroke-caps
🎉 Stroke caps support for wasm render
2025-01-09 12:35:05 +01:00
Marina López
8df8e384da 🐛 Avoid loading the overview before zoom to frame 2025-01-09 12:22:55 +01:00
Eva Marco
6874f5475c Merge pull request #5530 from penpot/eva-fix-icon-component
🐛  Fix icon* component prop
2025-01-09 12:22:41 +01:00
Eva Marco
5ee87018b9 🐛 Fix icon* component prop 2025-01-09 12:14:38 +01:00
alonso.torres
6e3f9db744 🐛 Fix problem in firefox comments 2025-01-09 12:10:31 +01:00
Alejandro Alonso
13ec04dd65 🎉 Stroke caps support for wasm render 2025-01-09 11:58:36 +01:00
Andrey Antukh
8239b9666b 💄 Use correct frontend url on comment related emails 2025-01-09 11:55:53 +01:00
Andrey Antukh
45d5253915 Add better reusability for comment related queries 2025-01-09 11:55:53 +01:00
Andrey Antukh
aa583b0707 💄 Remove redundant set conversions 2025-01-09 11:55:53 +01:00
Andrey Antukh
1f4fafe781 💄 Remove neesting with ::db/transaction 2025-01-09 11:55:53 +01:00
Andrey Antukh
27c2db6cde 💄 Replace db/query with db/get 2025-01-09 11:55:53 +01:00
Andrey Antukh
5c63a5c58e 💄 Adapt sql style 2025-01-09 11:55:53 +01:00
alonso.torres
b1dda02b47 Add mentions to notifications 2025-01-09 11:55:53 +01:00
Belén Albeza
4bd1e32462 Merge pull request #5518 from penpot/superalex-bugs-wasm-strokes
🐛 Fix wasm render strokes bugs
2025-01-09 10:38:09 +01:00
Stephan Paternotte
f94be2d3f9 🌐 Add translations for: Dutch.
Currently translated at 99.1% (1582 of 1595 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2025-01-09 09:01:53 +01:00
Edgars Andersons
eea0749866 🌐 Add translations for: Latvian.
Currently translated at 99.1% (1582 of 1595 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2025-01-09 09:01:52 +01:00
Linerly
de58977727 🌐 Add translations for: Indonesian.
Currently translated at 100.0% (1595 of 1595 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2025-01-09 09:01:52 +01:00
Alejandro Alonso
bb071489f1 🐛 Fix dotted path widh calculation 2025-01-09 07:23:55 +01:00
Alejandro Alonso
98806defbf 🐛 Open paths should always be rendered with center alignment 2025-01-09 07:23:55 +01:00
Eva Marco
de0eee13af Merge pull request #5527 from penpot/niwinz-bugfix-2
🐛 Fix incorrect navigate event on assets tab click
2025-01-08 17:55:51 +01:00
Andrey Antukh
384f13a9e2 🐛 Fix incorrect navigate event on assets tab click 2025-01-08 17:44:26 +01:00
Aitor Moreno
8ef4850a06 Merge pull request #5522 from penpot/ladybenko-fix-render-all-race
🐛 Fix race condition when rendering the background
2025-01-08 14:47:53 +01:00
Andrey Antukh
0bffca2dc7 🐛 Fix unexpected exception on closing dropdown event
Caused by a incorrect call to the internal dropdown
component
2025-01-08 12:53:27 +01:00
Belén Albeza
3d370de49e 🐛 Fix race condition when rendering the background color before shape tree has been initialized 2025-01-08 12:52:34 +01:00
Belén Albeza
2d955a2256 Merge pull request #5491 from penpot/niwinz-rumext-update
 Update rumext version
2025-01-07 15:04:27 +01:00
Andrey Antukh
f878003ab5 Merge remote-tracking branch 'origin/staging' into develop 2025-01-07 14:54:48 +01:00
Anonymous
27374b1b39 🌐 Add translations for: Italian.
Currently translated at 97.1% (1549 of 1595 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2025-01-07 12:20:29 +01:00
Andrey Antukh
0abe7bbc8b Merge remote-tracking branch 'weblate/develop' into develop 2025-01-07 12:10:35 +01:00
Andrey Antukh
9878656b7f Merge remote-tracking branch 'origin/staging' into develop 2025-01-07 12:00:26 +01:00
Andrey Antukh
c3688d6ab0 📎 Fix issues from previous merge 2025-01-07 11:28:45 +01:00
Andrey Antukh
44f6ec7a24 Merge branch 'staging' into develop 2025-01-07 11:26:06 +01:00
Andrey Antukh
6553861a6c Update rumext version
Mainly for usability and performance improvements
2025-01-07 10:43:23 +01:00
Aitor Moreno
547d34b13b Merge pull request #5514 from penpot/superalex-wasm-stroke-style-support
🎉 Stroke style support for wasm render
2025-01-07 09:13:11 +01:00
Alejandro Alonso
2467e033b7 🎉 Stroke style support for wasm render 2025-01-03 16:39:55 +01:00
Aitor Moreno
e551dd5a99 Merge pull request #5508 from penpot/superalex-basic-stroke-support
🎉 Basic strokes wasm support
2025-01-03 10:52:05 +01:00
Alejandro Alonso
beb9120b2b 🎉 Basic strokes wasm support 2025-01-03 08:32:05 +01:00
Eva Marco
4a349ec050 Merge pull request #5497 from penpot/palba-bugfixing-02
🐛 Bugfixing
2025-01-02 13:48:25 +01:00
Pablo Alba
ad552eaf68 🐛 Fix version history control exit is not intuitive 2025-01-02 12:53:19 +01:00
Pablo Alba
8ae326ed06 🐛 Fix silent crash uploading a font too big 2025-01-02 12:53:19 +01:00
Pablo Alba
6bd1f19e36 🐛 Fix on libraries section, items shouldn't have context menu 2025-01-02 12:53:19 +01:00
Pablo Alba
54c63fef06 🐛 Fix create team modal when user is creating account via invitation 2025-01-02 12:06:54 +01:00
Late Night Defender
4cde30ee85 🌐 Add translations for: Thai.
Currently translated at 13.0% (203 of 1561 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/th/
2024-12-28 17:02:35 +01:00
Pablo Alba
e683564ab2 Merge pull request #5467 from penpot/niwinz-bugfix-4
🐛 Fix invitations and webhooks page shows no data
2024-12-27 13:51:24 +01:00
luisddm
b5e5c4b0dd ♻️ Visual changes in comments 2024-12-27 11:43:51 +01:00
Andrey Antukh
2b31613853 🐛 Fix file deletion exception 2024-12-23 12:56:02 +01:00
Andrey Antukh
8d74d82fd0 ⬆️ Update potok dependency
Improves internal symbol naming for objects created with
ptk/reify. Helps on debugging
2024-12-23 12:41:10 +01:00
Andrey Antukh
585c273cd6 🐛 Fix dashboard fonts section nav link 2024-12-23 12:21:11 +01:00
Andrey Antukh
ff7acea95a Merge remote-tracking branch 'origin/staging' into develop 2024-12-23 10:58:36 +01:00
Andrey Antukh
602ded7e6c Merge remote-tracking branch 'origin/staging' into develop 2024-12-23 09:27:45 +01:00
Alejandro
5001298087 Merge pull request #5473 from penpot/ladybenko-9533-fix-path-rotation
🐛 Fix path rotation
2024-12-23 06:43:53 +01:00
Late Night Defender
a5c6faf639 🌐 Add translations for: Thai.
Currently translated at 10.4% (163 of 1561 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/th/
2024-12-19 19:02:38 +01:00
Denys Kisil
fee4a8ff14 🌐 Add translations for: Ukrainian (ukr_UA).
Currently translated at 99.5% (1554 of 1561 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ukr_UA/
2024-12-19 19:02:38 +01:00
Andrey Antukh
69008fbb90 Merge remote-tracking branch 'origin/staging' into develop 2024-12-18 12:47:05 +01:00
Denys Kisil
62307c56a0 🌐 Add translations for: Ukrainian (ukr_UA).
Currently translated at 99.5% (1554 of 1561 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ukr_UA/
2024-12-15 16:00:22 +01:00
Xaviju
8a4fbf385c 🐛 fix color-bullet props error 2024-12-13 13:52:01 +01:00
Eva Marco
0fafc52ea4 Merge pull request #5474 from penpot/eva-fix-tooltip-border-radius
🐛  Fix border radius tooltip
2024-12-13 13:47:52 +01:00
Andrey Antukh
8f673885a0 Merge remote-tracking branch 'origin/staging' into develop 2024-12-13 13:47:30 +01:00
Eva Marco
feaf027abf 🐛 Fix border radius tooltip 2024-12-13 13:26:13 +01:00
Belén Albeza
e1c5cd6640 🐛 Fix path rotation 2024-12-13 13:03:23 +01:00
Marina López
c61b794ab6 :bug:Fix link when deselecting shapes 2024-12-13 12:29:06 +01:00
Andrey Antukh
eaec46a67b 🐛 Fix incorrect team invitation redirect after login 2024-12-13 10:23:52 +01:00
Marina López
b18ee859b1 Shareable link pointing to a specific board 2024-12-13 09:43:56 +01:00
Andrey Antukh
1b2a38351d 🐛 Fix invitations and webhooks page shows no data
Regression of the routing/state refactor
2024-12-13 09:16:19 +01:00
Pablo Alba
ea43a999e9 💄 css linter adjustment 2024-12-12 12:08:10 +01:00
Pablo Alba
dc360d8096 💄 Minor marging adjustment on penpot free button 2024-12-12 12:06:24 +01:00
Andrey Antukh
1c76587d70 Merge remote-tracking branch 'origin/develop' into develop 2024-12-12 10:56:20 +01:00
Andrey Antukh
4877d17579 Merge remote-tracking branch 'origin/staging' into develop 2024-12-12 10:56:00 +01:00
Aitor Moreno
d4b829ed19 Merge pull request #5454 from penpot/ladybenko-9512-serialization-docs
📚 Serialization docs
2024-12-12 10:36:40 +01:00
Alejandro
953c95315a Merge pull request #5459 from penpot/ladybenko-9516-fix-blend
🐛 Fix blend mode against background
2024-12-12 09:38:34 +01:00
Eva Marco
67b778000a Merge pull request #5451 from penpot/juanfran-t-9383-combobox
 new combobox component to the ds with component testing
2024-12-12 09:35:50 +01:00
Juanfran
2c8a44dfa1 new combobox component to the ds with component testing 2024-12-12 08:33:12 +01:00
andrés gonzález
ca58dc8dc0 Merge pull request #5445 from penpot/andy-docs-formats
📚 User guide import/export section update
2024-12-12 08:24:16 +01:00
andrés gonzález
603485dc62 Merge pull request #5455 from penpot/madalenapmelo-kp-patch-1
📚 File history versions
2024-12-12 08:20:50 +01:00
andy
b983b31cf1 📚 Images and text adjustments 2024-12-12 08:05:34 +01:00
Belén Albeza
5ece9cb4aa Merge pull request #5450 from penpot/palba-free-edition-label
🎉 Add "Penpot free" label
2024-12-11 17:43:28 +01:00
Belén Albeza
21da6ddd4a 🐛 Fix blend mode against background 2024-12-11 16:52:13 +01:00
Pablo Alba
7a959cc490 Merge pull request #5458 from penpot/niwinz-bugfix-3
🐛 Fix incorrect profile refresh after onboarding end step
2024-12-11 16:15:43 +01:00
Belén Albeza
3075848411 Merge pull request #5419 from penpot/alotor-reorder-icon
 Add reorder handler to fills, strokes and shadows
2024-12-11 15:57:28 +01:00
Pablo Alba
5f32227e13 🎉 Add "Penpot free" label 2024-12-11 15:50:22 +01:00
alonso.torres
06da4bd392 Add reorder handler to fills, strokes and shadows 2024-12-11 15:40:36 +01:00
Andrey Antukh
ca743cc7cb 🐛 Fix incorrect profile refresh after onboarding end step
and many other setting screens
2024-12-11 15:20:39 +01:00
Madalena Melo
537cb6cb50 File history versions
https://tree.taiga.io/project/penpot/task/9377
2024-12-11 13:42:17 +01:00
Belén Albeza
ef32acdfab 📚 Add serialization docs for gradient stops and path data 2024-12-11 13:08:49 +01:00
Belén Albeza
c2ffee1683 📚 Add README to rust project 2024-12-11 12:49:09 +01:00
Aitor Moreno
579a5729e6 Merge pull request #5449 from penpot/superalex-render-wasm-custom-skia-binaries-2
🎉 Use custom skia binaries for wasm render
2024-12-11 12:20:02 +01:00
Alejandro Alonso
f50c7a70c2 🎉 Use custom skia binaries for wasm render 2024-12-11 12:06:56 +01:00
Andrey Antukh
7cff0f60a9 Merge remote-tracking branch 'origin/staging' into develop 2024-12-11 12:00:50 +01:00
Alejandro
25a672b958 Merge pull request #5443 from penpot/niwinz-enhancements-1
 Several improvements
2024-12-11 07:29:14 +01:00
Alejandro
777a4c8414 Merge pull request #5444 from penpot/ladybenko-9505-refactor-shapes
♻️ Refactor shapes and render code
2024-12-11 07:10:18 +01:00
andy
6feeb25802 📚 Import/export images replacements and other adjustments 2024-12-10 18:12:11 +01:00
andy
31dc0a074a 📚 New penpot file format 2024-12-10 17:42:32 +01:00
Belén Albeza
c9355a257a ♻️ Refactor custom matrix code into submodule 2024-12-10 16:15:07 +01:00
Belén Albeza
9f7428d44a ♻️ Fix visibility of Shape properties 2024-12-10 16:07:33 +01:00
Andrey Antukh
d8a3c10191 Make modal work through react portal mechanism
The rationale behind this change is to allow use of already
declared react context on modals; because with portals, react
propagates top context to the children, independently if they
are direct descendant on dom or not.
2024-12-10 16:01:50 +01:00
Belén Albeza
c7c43d6313 ♻️ Decouple render and shapes 2024-12-10 15:54:51 +01:00
Belén Albeza
7b1934dcb6 ♻️ Create an ImageStore type 2024-12-10 15:41:50 +01:00
Belén Albeza
967bc75a1c ♻️ Move rendering a single shape to the shape itself 2024-12-10 15:29:49 +01:00
Andrey Antukh
7758d5f747 💄 Add code style optimization to workspace context menu components 2024-12-10 15:08:14 +01:00
Belén Albeza
001aa3f319 ♻️ Refactor into render submodules 2024-12-10 15:03:15 +01:00
Andrey Antukh
5dae6f8fde 🔥 Remove unused refs 2024-12-10 14:57:03 +01:00
Andrey Antukh
838fb73434 📎 Add FIXME note about recent-fonts ref behavior 2024-12-10 14:56:35 +01:00
Andrey Antukh
a12b42c4d5 Simplfy workspace-file-colors ref impl 2024-12-10 14:56:15 +01:00
Andrey Antukh
e5894ceea1 ♻️ Rename workspace-libraries to libraries on state and refs 2024-12-10 14:45:56 +01:00
Belén Albeza
647635a819 Merge pull request #5433 from penpot/superalex-render-wasm-circles-support
🎉 Render wasm ellipses support
2024-12-10 14:41:24 +01:00
Alejandro Alonso
307329cf2e 🎉 Render wasm ellipses support 2024-12-10 14:31:26 +01:00
Belén Albeza
33e70a4108 Merge pull request #5410 from penpot/superalex-radial-gradients-wasm-render
🎉 Support for radial gradients with wasm render
2024-12-10 14:18:09 +01:00
Andrey Antukh
969c6a2e2f 💄 Add syntax optimization for gradient handlers component 2024-12-10 14:04:13 +01:00
Andrey Antukh
848db3f13c Remove components-v2 conditional on inspect right sidebar 2024-12-10 14:03:32 +01:00
Andrey Antukh
cd6a3fd1bb 🔥 Remove unused lenses 2024-12-10 14:02:42 +01:00
Belén Albeza
8599c52fc0 Merge pull request #5435 from penpot/superalex-render-wasm-show-content-support
🎉 Suport for show-content in render wasm
2024-12-10 13:11:46 +01:00
Andrey Antukh
c90c016ae5 Merge remote-tracking branch 'origin/staging' into develop 2024-12-10 12:41:19 +01:00
Andrey Antukh
6f67ecd1e4 Merge pull request #5404 from penpot/eva-fix-border-radius
♻️ Remove Rx and RY from shapes
2024-12-10 12:36:58 +01:00
Andrey Antukh
6ecae5d425 💄 Fix linter issues after staging merge 2024-12-10 10:48:04 +01:00
Eva Marco
73e48b3d81 ♻️ Remove unnecesary RX and RY from shapes 2024-12-10 10:47:55 +01:00
Andrey Antukh
bdb777516e Merge remote-tracking branch 'origin/staging' into develop 2024-12-10 10:46:38 +01:00
Alejandro Alonso
e1d9efea7f 🎉 Suport for show-content in render wasm 2024-12-10 10:28:11 +01:00
Alejandro Alonso
09aa4529f8 🎉 Support for radial gradients with wasm render 2024-12-10 07:05:59 +01:00
Alejandro
0eedc036be Merge pull request #5388 from penpot/azazeln28-feat-start-drawing-paths
🎉 Start drawing paths
2024-12-09 16:27:28 +01:00
Belén Albeza
4c83899d69 Only take fills for non-groups 2024-12-09 16:17:55 +01:00
Belén Albeza
99bb3ee962 🎉 Render path fills 2024-12-09 16:06:15 +01:00
Belén Albeza
0bfcc1f854 🎉 Deserialize shape data in wasm 2024-12-09 15:48:45 +01:00
AzazelN28
22b01c63b5 🎉 Serialize data in clojure 2024-12-09 15:48:44 +01:00
Andrey Antukh
0b323e81bc Merge pull request #5434 from penpot/niwinz-merge-staging
 Mege staging to develop
2024-12-09 14:48:18 +01:00
Andrey Antukh
7c6ad334e7 🐛 Fix incorrect rendering of team members page
when projects are not loaded
2024-12-09 13:25:17 +01:00
Andrey Antukh
6a624ae94a 🐛 Fix incorrect navegation handling on change team 2024-12-09 13:15:09 +01:00
Andrey Antukh
c6cdeea636 Merge remote-tracking branch 'origin/staging' into develop 2024-12-09 12:26:23 +01:00
AzazelN28
f564b4e66d 🎉 Add debug options to wasm 2024-12-05 16:36:42 +01:00
Belén Albeza
b332f128b0 Merge pull request #5409 from penpot/superalex-hidden-layer-support-for-wasm-render
🎉 Hidden layer support for wasm render
2024-12-05 15:42:02 +01:00
Alejandro Alonso
07215357d6 🎉 Hidden layer support for wasm render 2024-12-05 15:10:15 +01:00
Alejandro
7c7ede9d0c Merge pull request #5403 from penpot/ladybenko-wasm-save-buffer-pointer
Wasm save buffer pointer
2024-12-05 08:58:35 +01:00
Belén Albeza
62fcf74472 Merge pull request #5402 from penpot/xaviju-9414-ds-swatch
Create DS swatch utility component
2024-12-04 16:48:42 +01:00
Xaviju
89009c4da1 Create Ds swatch utility component 2024-12-04 16:27:50 +01:00
Belén Albeza
0828d2e092 Merge pull request #5411 from penpot/niwinz-routing-refactor
♻️ Refactor application routing
2024-12-04 15:31:07 +01:00
Pablo Alba
a44db31008 Merge pull request #5417 from penpot/staging
📚 Update changelog
2024-12-04 13:48:52 +01:00
andrés gonzález
6b375d3413 Merge pull request #5379 from penpot/madalenapmelo-kp-patch-1
📚 Doc for viewer role
2024-12-04 13:00:35 +01:00
Madalena Melo
c5ec3ea7b1 Change the order to add clarity to admin and owner roles
Switched the order of the roles to make it more logical and add more clarity about admins and owners ability to edit
2024-12-04 12:09:34 +01:00
Belén Albeza
6623963a7f Use a static Vec<u8> to handle shared memory 2024-12-04 09:47:31 +01:00
Andrey Antukh
80b763dd98 ♻️ Add backward compatibility for old urls 2024-12-03 21:31:54 +01:00
Andrey Antukh
3e090b126e ♻️ Refactor application routing
Mainly removes an inconsistent use of path params and normalize
all routes to use query params for make it extensible without
breaking urls.
2024-12-03 18:23:41 +01:00
Madalena Melo
58bc772880 Add detail to role descriptions
Added more context to each role's description; I tried to keep it brief while including more information about what each role can do both within the team as well as in terms of team management
2024-12-03 15:50:35 +01:00
Belén Albeza
df6727f186 ♻️ Refactor rendering fills 2024-12-03 14:43:07 +01:00
Belén Albeza
58c4e53ee4 ♻️ Refactor image fills 2024-12-03 14:34:07 +01:00
Belén Albeza
7105e49ac2 ♻️ Refactor adding gradient stops 2024-12-03 13:49:29 +01:00
Belén Albeza
5e9f533624 Merge pull request #5374 from penpot/superalex-render-wasm-fill-images
🎉 Render wasm fill images
2024-12-03 13:17:57 +01:00
Alejandro Alonso
0a3c6f38ef 🎉 Render wasm fill images 2024-12-03 13:08:19 +01:00
Andrey Antukh
b2f02de5c1 🐛 Fix incorrect uuid on e2e dashboard mock files 2024-12-03 12:15:53 +01:00
Andrey Antukh
f31e2b72e6 Adjust data profile alias 2024-12-03 12:15:53 +01:00
Andrey Antukh
c6b96a81f1 ♻️ Rename data.events to data.event 2024-12-03 12:15:52 +01:00
Andrey Antukh
838fb06039 ♻️ Rename data.users to data.profile 2024-12-03 11:55:33 +01:00
Andrey Antukh
1de35b2e3a Disable wasm loading if feature is disabled 2024-12-03 11:55:33 +01:00
Andrey Antukh
b17d7c0289 ♻️ Refactor dashboard bootstrap 2024-12-03 11:55:31 +01:00
María Valderrama
5850a8fac4 Merge pull request #5407 from penpot/revert-5389-ladybenko-doc-create-plugin
Revert "📚 Minor fix to plugin docs"
2024-12-03 11:55:22 +01:00
Andrey Antukh
b31afcfb47 🐛 Fix incorrect use of forward-ref on input* control component
And in the derived input-tokens* component
2024-12-03 11:48:22 +01:00
Belén Albeza
ea48c43a5f Revert "📚 Minor fix to plugin docs" 2024-12-03 11:47:56 +01:00
Andrey Antukh
052b39d833 Merge remote-tracking branch 'origin/staging' into develop 2024-12-03 11:47:40 +01:00
Eva Marco
0c3a362e85 Merge pull request #5406 from penpot/ladybenko-add-icon-ids-storybook
 Explicitly display icon IDs in storybook
2024-12-03 10:17:35 +01:00
Eva Marco
b86d352caf Merge pull request #5389 from penpot/ladybenko-doc-create-plugin
📚 Minor fix to plugin docs
2024-12-03 10:12:22 +01:00
Belén Albeza
39c203b997 Explicitly display icon IDs in storybook 2024-12-03 10:00:01 +01:00
Belén Albeza
b4ccf545c7 Merge pull request #5397 from penpot/madalenapmelo-kp-patch-2
📚 Update shortcuts to include the "rename selected layer" shortcut
2024-12-02 14:56:59 +01:00
Belén Albeza
c688ae2e33 Merge pull request #5400 from penpot/superalex-memory-refactor
❇️ Refactor memory management for color linear gradient stops
2024-12-02 13:08:36 +01:00
Denys Kisil
8bd898f0eb 🌐 Add translations for: Ukrainian (ukr_UA).
Currently translated at 89.1% (1391 of 1561 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ukr_UA/
2024-12-02 13:00:22 +01:00
Nicola Bortoletto
92fd918d0e 🌐 Add translations for: Italian.
Currently translated at 99.5% (1554 of 1561 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2024-12-02 13:00:21 +01:00
Alejandro Alonso
a4cfaa542c 🎉 Refactor memory managemnt for color linear gradient stops 2024-12-02 12:54:56 +01:00
Alejandro
61bf4e145e Merge pull request #5392 from penpot/ladybenko-9266-linear-gradients
🎉 Render linear gradient fills
2024-12-02 12:33:56 +01:00
Andrey Antukh
b9df1d5d3f Merge pull request #5385 from penpot/mavalroot-rename-board
🎉 Rename board on the workspace
2024-12-02 08:50:06 +01:00
Andrey Antukh
0214397fb1 Merge branch 'staging' into develop 2024-11-29 15:51:47 +01:00
Madalena Melo
9794de9a84 Fix incorrect shortcut for Mac 2024-11-29 15:25:29 +01:00
Madalena Melo
671f40d44d Update shortcuts to include the "rename selected layer" shortcut 2024-11-29 14:22:35 +01:00
Belén Albeza
00ab9ad3f0 ♻️ Refactor blend mode and fills into their own submodules 2024-11-29 11:46:45 +01:00
Belén Albeza
2d4281bdf2 Use u32 as color args for wasm 2024-11-29 11:34:18 +01:00
María Valderrama
0228f79687 🐛 Fix missing rename shortcut translation 2024-11-29 11:30:31 +01:00
María Valderrama
ac0d79d95a 🎉 Rename board on the workspace 2024-11-29 11:30:31 +01:00
Andrey Antukh
5bfd448483 Merge remote-tracking branch 'origin/staging' into develop 2024-11-29 10:24:49 +01:00
Andrey Antukh
1b20e496d4 Merge pull request #5393 from ryanbreen/ryanbreen-ulimit-fix
🐛 Fix ulimits format in devenv/docker-compose.yaml
2024-11-29 10:22:29 +01:00
Andrey Antukh
ad421c3bcc Merge pull request #5394 from Friendly-Pixel/color_bullet_title
 Add path to color bullet title
2024-11-29 10:22:00 +01:00
Simon Epskamp
206fd68a92 Add path to color bullet title
This way the title is more clear as the group name is included, and this more closely matches the display in the "assets" sidebar.

Signed-off-by: Simon Epskamp <simon@friendlypixel.nl>
2024-11-28 20:27:10 +01:00
Ryan Breen
0898c27539 🐛 Fix ulimits format in docker-compose.yaml
ulimit nofile format is expected to be int, not string

Signed-off-by: Ryan Breen <rbreen@getfastr.com>
2024-11-28 12:45:45 -05:00
Belén Albeza
c8e322cd58 🎉 Render liner gradient fills 2024-11-28 16:51:28 +01:00
Andrey Antukh
8fa334265c Merge pull request #5391 from penpot/ladybenko-fix-uuid-bug
🐛 Fix Uuid crash
2024-11-28 13:30:13 +01:00
Belén Albeza
13d61d1105 🐛 Fix Uuid crash 2024-11-28 13:16:04 +01:00
Aitor Moreno
9a9815ebfa Merge pull request #5371 from penpot/ladybenko-9337-pixel-ratio
Device pixel ratio
2024-11-28 11:46:41 +01:00
Belén Albeza
4b422ef459 📚 Minor fix to plugin docs 2024-11-28 10:55:21 +01:00
Linerly
613f0fa18a 🌐 Add translations for: Indonesian.
Currently translated at 100.0% (1561 of 1561 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2024-11-27 14:02:37 +01:00
Belén Albeza
db9c93f3bf Render with dpr 2024-11-27 12:38:17 +01:00
Andrey Antukh
c2649ffd1c Merge remote-tracking branch 'origin/staging' into develop 2024-11-27 12:11:47 +01:00
Andrey Antukh
2ad887db89 Merge remote-tracking branch 'origin/staging' into develop 2024-11-27 10:50:03 +01:00
Alejandro
8466c60638 Merge pull request #5380 from penpot/niwinz-uuid-fixes
🐛 Fix incorrect encoding of u32 parts of uuid
2024-11-27 09:31:29 +01:00
Andrey Antukh
774137a763 Merge pull request #5369 from penpot/ladybenko-9202-ci-rust-jobs
🔧 Set up Rust jobs in CI
2024-11-27 08:53:53 +01:00
Andrey Antukh
965d457664 🐛 Fix incorrect encoding of u32 parts of uuid 2024-11-27 08:36:34 +01:00
Andrey Antukh
25a2d3b1fb Merge branch 'staging' into develop 2024-11-27 08:33:16 +01:00
Belén Albeza
5ce6cbff6f ♻️ Refactor navigate() method 2024-11-26 16:13:14 +01:00
Madalena Melo
3479a78e96 Viewer Role - Update index.njk
Add viewer role to the team roles; also made some tweaks to the descriptions of the other roles
2024-11-26 13:06:08 +01:00
Aitor Moreno
5b52e2a50b Merge pull request #5336 from penpot/niwinz-render-wasm-improvements-2
 Minor improvements to wasm shape and intial draft for path encoding
2024-11-26 12:30:56 +01:00
Andrey Antukh
6d419a45ae Add initial prototype for path content encoding 2024-11-26 12:00:29 +01:00
Andrey Antukh
30d7ba7136 Add id and type to wasm shape-proxy static attrs 2024-11-26 11:59:27 +01:00
Late Night Defender
08b20bdfd9 🌐 Add translations for: Thai.
Currently translated at 9.8% (154 of 1561 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/th/
2024-11-25 20:01:04 +00:00
Linerly
fc5511eef4 🌐 Add translations for: Indonesian.
Currently translated at 93.0% (1452 of 1561 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2024-11-25 20:01:03 +00:00
Stas Haas
e9389a7d6e 🌐 Add translations for: German.
Currently translated at 93.0% (1452 of 1561 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2024-11-25 20:01:02 +00:00
Belén Albeza
52a705ac02 Add config flag for DPR 2024-11-25 16:13:29 +01:00
Belén Albeza
3e99de19f5 ♻️ Refactor debug options into its own struct, along with dpr 2024-11-25 16:01:19 +01:00
Andrey Antukh
82104dd823 Merge remote-tracking branch 'origin/staging' into develop 2024-11-25 14:56:12 +01:00
Belén Albeza
ca70edf07b 🔧 Set up Rust jobs in CI 2024-11-25 13:14:46 +01:00
Belén Albeza
230e011003 Merge pull request #5353 from penpot/superalex-fix-change-page-with-wasm-render
🐛 Fix change page with wasm render
2024-11-25 12:45:21 +01:00
Alejandro Alonso
198339f232 🐛 Fix change page with wasm render 2024-11-25 12:36:12 +01:00
Andrey Antukh
5ee0399615 Merge remote-tracking branch 'origin/staging' into develop 2024-11-25 11:50:19 +01:00
Belén Albeza
5018ff06ee Merge pull request #5363 from penpot/superalex-wasm-shape-opacity
🎉 Shape opacity for wasm render
2024-11-25 11:30:50 +01:00
Alejandro Alonso
61e19ae3a8 Merge remote-tracking branch 'origin/staging' into develop 2024-11-25 11:18:47 +01:00
Alejandro Alonso
d09e5ef9b3 🎉 Shape opacity for wasm render 2024-11-25 09:26:49 +01:00
Andrey Antukh
6f5c7c01bb Merge remote-tracking branch 'origin/staging' into develop 2024-11-25 09:20:30 +01:00
Aitor Moreno
e675ff6db5 Merge pull request #5352 from penpot/superalex-improve-full-rendering
🎉 Improve performance for zoom and pan with wasm render
2024-11-22 15:38:31 +01:00
Alejandro Alonso
05716c7164 Merge remote-tracking branch 'origin/staging' into develop 2024-11-22 12:46:10 +01:00
Alejandro Alonso
0b5e915af9 🎉 Improve performace for zoom and pan with wasm render 2024-11-22 09:46:46 +01:00
Belén Albeza
361c56fd9c Merge pull request #5343 from penpot/azazeln28-render-only-visible-shapes
🎉  Render only visible shapes
2024-11-21 17:40:24 +01:00
Belén Albeza
6fd6074934 💄 Format rust code 2024-11-21 17:23:49 +01:00
Andrey Antukh
86b681fb55 Merge pull request #5350 from penpot/token-studio-develop-1
 Merge tokens-studio/develop into develop
2024-11-21 16:31:08 +01:00
Andrey Antukh
395962ae4d Merge tokens-studio/develop into develop 2024-11-21 16:08:42 +01:00
AzazelN28
f7ff3129ed 🎉 Render only visible shapes 2024-11-21 16:05:14 +01:00
Aitor Moreno
f9912e0299 Merge pull request #5317 from penpot/superalex-fix-real-time-blend-mode-rendering
🐛 Fix real time blend mode rendering
2024-11-21 16:03:42 +01:00
Alejandro Alonso
b4e9f9e28c 🐛 Fix real time blend mode rendering 2024-11-21 15:58:37 +01:00
Aitor Moreno
aa07a8046b Merge pull request #5329 from penpot/ladybenko-9290-fix-resize-viewport
Fix viewport glitch
2024-11-21 15:13:36 +01:00
Belén Albeza
dfe8f97f8d 🐛 Fix surface not being resized when viewport dimensions changed 2024-11-21 14:16:07 +01:00
Aitor Moreno
2f15844c32 Merge pull request #5347 from penpot/superalex-tada-improve-zoom-pan-render-wasm
🎉 Improve performace for zoom and pan with wasm render
2024-11-21 12:50:51 +01:00
Alejandro Alonso
e634d6d37a 🎉 Improve performace for zoom and pan with wasm render 2024-11-21 12:50:06 +01:00
Aitor Moreno
bc7702e955 Merge pull request #5330 from penpot/superalex-tada-improve-zoom-pan-render-wasm
🎉 Improve performace for zoom and pan with wasm render
2024-11-21 12:13:13 +01:00
Alejandro Alonso
ec8799d806 🎉 Improve performace for zoom and pan with wasm render 2024-11-21 12:05:38 +01:00
Denys Kisil
6c1a299b73 🌐 Add translations for: Ukrainian (ukr_UA).
Currently translated at 88.2% (1378 of 1561 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ukr_UA/
2024-11-21 12:00:29 +01:00
Alejandro
7b57509d2d Merge pull request #5339 from penpot/azazeln28-improve-render-queueing
🎉 Improve frame rendering
2024-11-21 06:57:56 +01:00
AzazelN28
2db1740ce8 🎉 Improve frame rendering 2024-11-20 14:09:18 +01:00
Edgars Andersons
67f9b5d1f3 🌐 Add translations for: Latvian.
Currently translated at 99.2% (1549 of 1561 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2024-11-20 10:00:20 +01:00
Belén Albeza
59fdf64c66 Merge pull request #5333 from penpot/niwinz-render-wasm-improvements
 Improvements to wasm api call usability
2024-11-20 09:34:48 +01:00
Belén Albeza
f8e0283186 Merge pull request #5332 from penpot/palba-add-integration-test-viewer-role
 Add integration tests to viewer role
2024-11-20 09:24:17 +01:00
Alejandro Alonso
7611c487aa Merge remote-tracking branch 'origin/staging' into develop 2024-11-20 06:27:54 +01:00
Andrey Antukh
99905d2286 ♻️ Move wasm shape proxy impl to frontend 2024-11-19 19:59:49 +01:00
Andrey Antukh
884414d5cf Improve wasm api call method usability 2024-11-19 19:21:48 +01:00
Andrey Antukh
db2eb2c420 Use get-prop for access transform and rect props 2024-11-19 19:21:48 +01:00
Andrey Antukh
5420e0e06d Merge remote-tracking branch 'origin/staging' into develop 2024-11-19 19:20:39 +01:00
Andrey Antukh
93583e5257 Merge pull request #5327 from penpot/qol-gradients
 New gradients UI
2024-11-19 16:50:15 +01:00
alonso.torres
838c1324b9 🎉 Add new gradients UI 2024-11-19 16:41:01 +01:00
Pablo Alba
3a7d187110 Add integration tests to viewer role 2024-11-19 16:38:21 +01:00
Andrey Antukh
bc250c962d 🐛 Fix tests caused by merge from staging 2024-11-18 18:43:15 +01:00
Andrey Antukh
68a299a5f5 Merge branch 'Bamboooz-develop' into develop 2024-11-18 18:08:09 +01:00
Bamboooz
569b6e34cb 🐛 Fix polish translations 2024-11-18 18:07:50 +01:00
Andrey Antukh
3addc4ae42 🐛 Fix tests 2024-11-18 18:06:42 +01:00
Andrey Antukh
7c0142432e Merge remote-tracking branch 'origin/staging' into develop 2024-11-18 17:56:12 +01:00
Alejandro Alonso
d71e1e66c4 Merge remote-tracking branch 'origin/staging' into develop 2024-11-18 15:52:34 +01:00
Alejandro
4e28f1b1f7 Merge pull request #5325 from penpot/niwinz-uuid-tweaks
 Improve Uint32 array generation from uuid
2024-11-18 15:47:48 +01:00
Belén Albeza
05e77957ca Merge pull request #5324 from penpot/superalex-fix-panning-events
🐛 Fix streaming of panning events
2024-11-18 15:39:21 +01:00
Alejandro Alonso
5c6ad8e236 Merge remote-tracking branch 'origin/staging' into develop 2024-11-18 13:00:02 +01:00
Andrey Antukh
f509b0c1a7 Improve Uint32 array generation from uuid 2024-11-18 12:57:49 +01:00
Alejandro
61ad1d6a70 Merge pull request #5318 from penpot/ladybenko-9311-fix-blend
Fix more blend glitches
2024-11-18 10:20:28 +01:00
Alejandro Alonso
b03df6422f 🐛 Fix streaming of panning events 2024-11-18 10:06:27 +01:00
Nicola Bortoletto
18fd6a47ef 🌐 Add translations for: Italian.
Currently translated at 99.4% (1553 of 1561 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2024-11-17 14:01:01 +00:00
Yaron Shahrabani
aecb14775c 🌐 Add translations for: Hebrew.
Currently translated at 99.5% (1554 of 1561 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2024-11-17 14:01:00 +00:00
Stephan Paternotte
1a808e05c3 🌐 Add translations for: Dutch.
Currently translated at 99.5% (1554 of 1561 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2024-11-16 13:00:54 +00:00
Edgars Andersons
d253e1195e 🌐 Add translations for: Latvian.
Currently translated at 97.7% (1526 of 1561 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2024-11-16 13:00:53 +00:00
Nicola Bortoletto
0590c0bf2c 🌐 Add translations for: Polish.
Currently translated at 73.5% (1148 of 1561 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pl/
2024-11-16 13:00:52 +00:00
Nicola Bortoletto
f69b2f9edf 🌐 Add translations for: Italian.
Currently translated at 99.4% (1553 of 1561 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2024-11-16 13:00:51 +00:00
Belén Albeza
6f11eebbed 🐛 Tweak sampling options for rendering shapes 2024-11-15 15:13:57 +01:00
Belén Albeza
42211c4ed6 ♻️ Move shape render methods to RenderState 2024-11-15 14:56:21 +01:00
Belén Albeza
f56a665206 🐛 Fix drawing multiple shapes with different blend modes 2024-11-15 14:40:07 +01:00
Alejandro
defe6ff7f8 Merge pull request #5316 from penpot/ladybenko-9311-fix-blend-glitches
Fix blend mode glitches
2024-11-15 14:03:29 +01:00
Yaron Shahrabani
54e8ede474 🌐 Add translations for: Hebrew.
Currently translated at 92.8% (1450 of 1561 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2024-11-15 12:00:22 +00:00
Belén Albeza
58d3a2984f 🐛 Fix not clearing drawing surface before drawing shapes 2024-11-15 11:33:26 +01:00
Mathieu Darse
c21a48d13b 🐛 Remove duplicated functions from merge error in manage.sh script 2024-11-15 10:35:37 +01:00
Alejandro
d1d34a3aa7 Merge pull request #5300 from penpot/ladybenko-9275-blend-modes
Add blend modes
2024-11-15 10:27:57 +01:00
Andrey Antukh
6831df488d Merge remote-tracking branch 'origin/staging' into develop 2024-11-15 10:17:45 +01:00
Alejandro Alonso
e9d3cb16c0 Merge remote-tracking branch 'origin/staging' into develop 2024-11-15 09:45:03 +01:00
Andrey Antukh
588dd5452a 📎 Start new development cycle for 2.5 2024-11-15 09:36:20 +01:00
Belén Albeza
263d7eb313 Draw fills offscreen to support blend mode when multiple fills 2024-11-15 08:51:37 +01:00
Belén Albeza
3eb24e7f5f ♻️ Refactor State (wasm) 2024-11-14 12:08:50 +01:00
Belén Albeza
3e06c17a38 ♻️ Refactor RenderState and GpuState 2024-11-14 11:47:10 +01:00
Belén Albeza
966e942a7f 🎉 Implement drawing with blend mode (single fill) 2024-11-13 16:39:26 +01:00
Belén Albeza
7458165e51 🐛 Fix fill apply order 2024-11-13 15:07:16 +01:00
Belén Albeza
e45e8158b0 ♻️ Refactor current_shape in rust_wasm 2024-11-13 15:00:20 +01:00
1318 changed files with 405478 additions and 113095 deletions

View File

@@ -1,5 +1,53 @@
version: 2.1
jobs:
lint:
docker:
- image: penpotapp/devenv:latest
working_directory: ~/repo
resource_class: medium+
steps:
- checkout
- run:
name: "fmt check"
working_directory: "."
command: |
yarn install
yarn run fmt:clj:check
- run:
name: "lint clj common"
working_directory: "."
command: |
yarn run lint:clj:common
- run:
name: "lint clj frontend"
working_directory: "."
command: |
yarn run lint:clj:frontend
- run:
name: "lint clj backend"
working_directory: "."
command: |
yarn run lint:clj:backend
- run:
name: "lint clj exporter"
working_directory: "."
command: |
yarn run lint:clj:exporter
- run:
name: "lint clj library"
working_directory: "."
command: |
yarn run lint:clj:library
test-common:
docker:
- image: penpotapp/devenv:latest
@@ -17,15 +65,7 @@ jobs:
# Download and cache dependencies
- restore_cache:
keys:
- v1-dependencies-{{ checksum "common/deps.edn"}}
- run:
name: "fmt check & linter"
working_directory: "./common"
command: |
yarn install
yarn run fmt:clj:check
yarn run lint:clj
- v1-dependencies-{{ checksum "common/deps.edn"}}-{{ checksum "common/yarn.lock" }}
- run:
name: "JVM tests"
@@ -37,13 +77,16 @@ jobs:
name: "NODE tests"
working_directory: "./common"
command: |
yarn install
yarn run test
- save_cache:
paths:
- ~/.m2
key: v1-dependencies-{{ checksum "common/deps.edn"}}
- ~/.yarn
- ~/.gitlibs
- ~/.cache/ms-playwright
key: v1-dependencies-{{ checksum "common/deps.edn"}}-{{ checksum "common/yarn.lock" }}
test-frontend:
docker:
@@ -62,37 +105,107 @@ jobs:
# Download and cache dependencies
- restore_cache:
keys:
- v1-dependencies-{{ checksum "frontend/deps.edn"}}
- v1-dependencies-{{ checksum "frontend/deps.edn"}}-{{ checksum "frontend/yarn.lock" }}
- run:
name: "prepopulate linter cache"
working_directory: "./common"
name: "install dependencies"
working_directory: "./frontend"
# We install playwright here because the dependent tasks
# uses the same cache as this task so we prepopulate it
command: |
yarn install
yarn run lint:clj
yarn run playwright install chromium
- run:
name: "fmt check & linter"
name: "lint scss on frontend"
working_directory: "./frontend"
command: |
yarn install
yarn run fmt:clj:check
yarn run fmt:js:check
yarn run lint:scss
yarn run lint:clj
- run:
name: "unit tests"
working_directory: "./frontend"
command: |
yarn install
yarn run test
- save_cache:
paths:
- ~/.m2
key: v1-dependencies-{{ checksum "frontend/deps.edn"}}
- ~/.yarn
- ~/.gitlibs
- ~/.cache/ms-playwright
key: v1-dependencies-{{ checksum "frontend/deps.edn"}}-{{ checksum "frontend/yarn.lock" }}
test-library:
docker:
- image: penpotapp/devenv:latest
working_directory: ~/repo
resource_class: medium+
environment:
JAVA_OPTS: -Xmx6g
NODE_OPTIONS: --max-old-space-size=4096
steps:
- checkout
# Download and cache dependencies
- restore_cache:
keys:
- v1-dependencies-{{ checksum "frontend/deps.edn"}}-{{ checksum "frontend/yarn.lock" }}
- run:
name: Install dependencies and build
working_directory: "./library"
command: |
yarn install
- run:
name: Build and Test
working_directory: "./library"
command: |
./scripts/build
yarn run test
test-components:
docker:
- image: penpotapp/devenv:latest
working_directory: ~/repo
resource_class: medium+
environment:
JAVA_OPTS: -Xmx6g -Xms2g
NODE_OPTIONS: --max-old-space-size=4096
steps:
- checkout
# Download and cache dependencies
- restore_cache:
keys:
- v1-dependencies-{{ checksum "frontend/deps.edn"}}-{{ checksum "frontend/yarn.lock" }}
- run:
name: Install dependencies
working_directory: "./frontend"
command: |
yarn install
yarn run playwright install chromium
- run:
name: Build Storybook
working_directory: "./frontend"
command: yarn run build:storybook
- run:
name: Serve Storybook and run tests
working_directory: "./frontend"
command: |
npx concurrently -k -s first -n "SB,TEST" -c "magenta,blue" \
"npx http-server storybook-static --port 6006 --silent" \
"npx wait-on tcp:6006 && yarn test:storybook"
test-integration:
docker:
@@ -111,7 +224,7 @@ jobs:
# Download and cache dependencies
- restore_cache:
keys:
- v1-dependencies-{{ checksum "frontend/deps.edn"}}
- v1-dependencies-{{ checksum "frontend/deps.edn"}}-{{ checksum "frontend/yarn.lock" }}
- run:
name: "integration tests"
@@ -121,7 +234,7 @@ jobs:
yarn run build:app:assets
yarn run build:app
yarn run build:app:libs
yarn run playwright install --with-deps chromium
yarn run playwright install chromium
yarn run test:e2e -x --workers=4
test-backend:
@@ -148,21 +261,6 @@ jobs:
keys:
- v1-dependencies-{{ checksum "backend/deps.edn" }}
- run:
name: "prepopulate linter cache"
working_directory: "./common"
command: |
yarn install
yarn run lint:clj
- run:
name: "fmt check & linter"
working_directory: "./backend"
command: |
yarn install
yarn run fmt:clj:check
yarn run lint:clj
- run:
name: "tests"
working_directory: "./backend"
@@ -178,43 +276,67 @@ jobs:
- save_cache:
paths:
- ~/.m2
- ~/.gitlibs
key: v1-dependencies-{{ checksum "backend/deps.edn" }}
test-exporter:
test-render-wasm:
docker:
- image: penpotapp/devenv:latest
working_directory: ~/repo
resource_class: medium+
environment:
JAVA_OPTS: -Xmx4g -Xms100m -XX:+UseSerialGC
NODE_OPTIONS: --max-old-space-size=4096
steps:
- checkout
- run:
name: "prepopulate linter cache"
working_directory: "./common"
name: "fmt check"
working_directory: "./render-wasm"
command: |
yarn install
yarn run lint:clj
cargo fmt --check
- run:
name: "fmt check & linter"
working_directory: "./exporter"
name: "lint"
working_directory: "./render-wasm"
command: |
yarn install
yarn run fmt:clj:check
yarn run lint:clj
./lint
- run:
name: "cargo tests"
working_directory: "./render-wasm"
command: |
./test
workflows:
penpot:
jobs:
- test-frontend
- test-integration
- test-backend
- test-common
- test-exporter
- lint
- test-frontend:
requires:
- lint: success
- test-library:
requires:
- test-frontend: success
- lint: success
- test-components:
requires:
- test-frontend: success
- lint: success
- test-integration:
requires:
- test-frontend: success
- lint: success
- test-backend:
requires:
- lint: success
- test-common:
requires:
- lint: success
- test-render-wasm

View File

@@ -58,6 +58,12 @@
:redundant-do
{:level :off}
:redundant-ignore
{:level :off}
:redundant-nested-call
{:level :off}
:earmuffed-var-not-dynamic
{:level :off}

View File

@@ -11,3 +11,9 @@ end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
[*.{rs}]
indent_size = 4
indent_style = space
end_of_line = lf

View File

@@ -1,29 +1,19 @@
<!--
### Related Ticket
Some key notes before you open a PR:
<!-- Reference the related GitHub/Taiga ticket. -->
1. Select which branch should this PR be merged in? By default, you should always merge to the develop branch.
2. PR name follows [convention](http://karma-runner.github.io/4.0/dev/git-commit-msg.html)
3. All tests pass locally, UI and Unit tests
4. All business logic and validations must be on the server-side
5. Update necessary Documentation
6. Put `closes #XXXX` in your comment to auto-close the issue that your PR fixes
### Summary
### Steps to reproduce
Also, if you're new here
### Checklist
- Contribution Guide => https://github.com/uxbox/uxbox/blob/develop/CONTRIBUTING.md
- [ ] Choose the correct target branch; use `develop` by default.
- [ ] Provide a brief summary of the changes introduced.
- [ ] Add a detailed explanation of how to reproduce the issue and/or verify the fix, if applicable.
- [ ] Include screenshots or videos, if applicable.
- [ ] Add or modify existing integration tests in case of bugs or new features, if applicable.
- [ ] Check CI passes successfully.
- [ ] Update the `CHANGES.md` file, referencing the related GitHub issue, if applicable.
-->
> Please provide enough information so that others can review your pull request:
<!-- You can skip this if you're fixing a typo or updating existing documentation -->
> Explain the **details** for making this change. What existing problem does the pull request solve?
<!-- Example: When "Adding a function to do X", explain why it is necessary to have a way to do X. -->
> Screenshots/GIFs
<!-- Add images/recordings to better visualize the change: expected/current behviour -->
<!-- For more details, check the contribution guidelines: https://github.com/penpot/penpot/blob/develop/CONTRIBUTING.md -->

129
.github/workflows/build-bundles.yml vendored Normal file
View File

@@ -0,0 +1,129 @@
name: Build and Upload Penpot Bundles non-prod
on:
# Create bundler for every tag
push:
tags:
- '**' # Pattern matched against refs/tags
# Create bundler every hour between 5:00 and 20:00 on working days
schedule:
- cron: '0 5-20 * * 1-5'
# Create bundler from manual action
workflow_dispatch:
inputs:
zip_mode:
# zip_mode defines how the build artifacts are packaged:
# - 'individual': creates one ZIP file per component (frontend, backend, exporter)
# - 'all': creates a single ZIP containing all components
# - null: for the rest of cases (non-manual events)
description: 'Bundle packaging mode'
required: false
default: 'individual'
type: choice
options:
- individual
- all
jobs:
build-bundles:
name: Build and Upload Penpot Bundles
runs-on: ubuntu-24.04
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_DEFAULT_REGION: ${{ secrets.AWS_REGION }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Extract somer useful variables
id: vars
run: |
echo "commit_hash=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
echo "gh_branch=${{ github.base_ref || github.ref_name }}" >> $GITHUB_OUTPUT
# Set up Docker Buildx for multi-arch build
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Run manage.sh build-bundle from host
run: ./manage.sh build-bundle
- name: Prepare directories for zipping
run: |
mkdir zips
mv bundles penpot
- name: Create zip bundles for zip_mode == 'all'
if: ${{ github.event.inputs.zip_mode == 'all' }}
run: |
echo "📦 Packaging Penpot 'all' bundles..."
zip -r zips/penpot-all-bundles.zip penpot
- name: Create zip bundles for zip_mode != 'all'
if: ${{ github.event.inputs.zip_mode != 'all' }}
run: |
echo "📦 Packaging Penpot 'individual' bundles..."
zip -r zips/penpot-frontend.zip penpot/frontend
zip -r zips/penpot-backend.zip penpot/backend
zip -r zips/penpot-exporter.zip penpot/exporter
- name: Upload unified 'all' bundle
if: ${{ github.event.inputs.zip_mode == 'all' }}
uses: actions/upload-artifact@v4
with:
name: penpot-all-bundles
path: zips/penpot-all-bundles.zip
- name: Upload individual bundles
if: ${{ github.event.inputs.zip_mode != 'all' }}
uses: actions/upload-artifact@v4
with:
name: penpot-individual-bundles
path: |
zips/penpot-frontend.zip
zips/penpot-backend.zip
zips/penpot-exporter.zip
- name: Upload unified 'all' bundle to S3
if: ${{ github.event.inputs.zip_mode == 'all' }}
run: |
aws s3 cp zips/penpot-all-bundles.zip s3://${{ secrets.S3_BUCKET }}/penpot-all-bundles-${{ steps.vars.outputs.gh_branch}}.zip
aws s3 cp zips/penpot-all-bundles.zip s3://${{ secrets.S3_BUCKET }}/penpot-all-bundles-${{ steps.vars.outputs.commit_hash }}.zip
- name: Upload 'individual' bundles to S3
if: ${{ github.event.inputs.zip_mode != 'all' }}
run: |
for name in penpot-frontend penpot-backend penpot-exporter; do
aws s3 cp zips/${name}.zip s3://${{ secrets.S3_BUCKET }}/${name}-${{ steps.vars.outputs.gh_branch }}-latest.zip
aws s3 cp zips/${name}.zip s3://${{ secrets.S3_BUCKET }}/${name}-${{ steps.vars.outputs.commit_hash }}.zip
done
- name: Notify Mattermost about automatic bundles
if: github.event_name == 'pull_request'
uses: mattermost/action-mattermost-notify@master
with:
MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK }}
TEXT: |
📦 *Penpot bundle automatically generated*
📄 PR: ${{ github.event.pull_request.title }}
🔁 From: \`${{ github.head_ref }}\` to \`{{ github.base_ref }}\`
🔗 Run: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}
- name: Notify Mattermost about manual bundles
if: github.event_name == 'workflow_dispatch'
uses: mattermost/action-mattermost-notify@master
with:
MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK }}
TEXT: |
📦 *Penpot bundle manually generated*
📄 Triggered from branch: `${{ github.ref_name}}`
🔗 Run: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}
- name: Print artifact summary URL
run: |
echo "📦 Artifacts available at:"
echo "🔗 https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"

50
.github/workflows/commit-checker.yml vendored Normal file
View File

@@ -0,0 +1,50 @@
name: 'Commit Message Check'
on:
pull_request:
types:
- opened
- edited
- reopened
- synchronize
pull_request_target:
types:
- opened
- edited
- reopened
- synchronize
push:
branches:
- main
- develop
- staging
jobs:
check-commit-message:
name: Check Commit Message
runs-on: ubuntu-latest
steps:
- name: Check Commit Type
uses: gsactions/commit-message-checker@v2
with:
pattern: '^(Merge|:(lipstick|globe_with_meridians|wrench|books|arrow_up|arrow_down|zap|ambulance|construction|boom|fire|whale|bug|sparkles|paperclip|tada|recycle):)\s[A-Z].*[^.]$'
flags: 'gm'
error: 'Commit should match CONTRIBUTING.md guideline'
checkAllCommitMessages: 'true' # optional: this checks all commits associated with a pull request
accessToken: ${{ secrets.GITHUB_TOKEN }} # github access token is only required if checkAllCommitMessages is true
# - name: Check Line Length
# uses: gsactions/commit-message-checker@v2
# with:
# pattern: '^[^#].{74}'
# error: 'The maximum line length of 74 characters is exceeded.'
# excludeDescription: 'true' # optional: this excludes the description body of a pull request
# excludeTitle: 'true' # optional: this excludes the title of a pull request
# checkAllCommitMessages: 'true' # optional: this checks all commits associated with a pull request
# accessToken: ${{ secrets.GITHUB_TOKEN }} # github access token is only required if checkAllCommitMessages is ue
# - name: Check for Resolves / Fixes
# uses: gsactions/commit-message-checker@v2
# with:
# pattern: '^.+(Resolves|Fixes): \#[0-9]+$'
# error: 'You need at least one "Resolves|Fixes: #<issue number>" line.'

9
.gitignore vendored
View File

@@ -30,6 +30,7 @@
/*.zip
/.clj-kondo/.cache
/_dump
/notes
/backend/*.md
/backend/*.sql
/backend/*.txt
@@ -40,6 +41,7 @@
/backend/resources/public/assets
/backend/resources/public/media
/backend/target/
/backend/experiments
/bundle*
/cd.md
/clj-profiler/
@@ -50,9 +52,6 @@
/exporter/target
/frontend/.storybook/preview-body.html
/frontend/.storybook/preview-head.html
/frontend/cypress/fixtures/validuser.json
/frontend/cypress/videos/*/
/frontend/cypress/videos/*/
/frontend/dist/
/frontend/npm-debug.log
/frontend/out/
@@ -68,6 +67,10 @@
/vendor/**/target
/vendor/svgclean/bundle*.js
/web
/library/target/
/library/*.zip
/external
clj-profiler/
node_modules
/test-results/

2
.nvmrc
View File

@@ -1 +1 @@
v20.11.1
v22.13.1

View File

@@ -1,5 +1,349 @@
# CHANGELOG
## 2.8.1
### :bug: Bugs fixed
- Fix unexpected exception on processing old texts [Github #6889](https://github.com/penpot/penpot/pull/6889)
- Fix error on inspect tab when selecting multiple shapes [Taiga #11655](https://tree.taiga.io/project/penpot/issue/11655)
- Fix missing package for the penport_exporter Docker image [GitHub #7205](https://github.com/penpot/penpot/issues/7025)
## 2.8.0
### :rocket: Epics and highlights
### :boom: Breaking changes & Deprecations
**Penpot Library**
The initial prototype is completly reworked for provide a more consistent API
and to have proper validation and params decoding. All the details can be found
on [its own changelog](library/CHANGES.md)
**Penpot migrate from Redis to Valkey**
As [Valkey](https://valkey.io/) is an opne-souce fork of [Redis](https://redis.io/)
version 7.2.4, this version of Penpot will be compatible with Redis but may diverge
in future versions. Therefore, **migration from Redis to ValKey is recommended for all
on-premises instances** that want to keep up to date.
### :heart: Community contributions (Thank you!)
- Add Serbian language [GitHub #5002](https://github.com/penpot/penpot/issues/5002) by [crnobog69](https://github.com/crnobog69)
### :sparkles: New features & Enhancements
- Optimize profile setup flow for better user experience [Taiga #10028](https://tree.taiga.io/project/penpot/us/10028)
- Rewrite path shape data PathData encoding [Taiga #8542](https://tree.taiga.io/project/penpot/us/8542?milestone=441308)
- Update base image for Docker Backend and Exporter to Ubuntu 24.04
- Update base image for Docker Frontend to Nginx 1.28.0
- Allow multi file token import [Github #27](https://github.com/tokens-studio/penpot/issues/27)
- Create `input*` wrapper component, and `label*`, `input-field*` and `hint-message*` components [Taiga #10713](https://tree.taiga.io/project/penpot/us/10713)
- Deselect layers (and path nodes) with Ctrl+Shift+Drag [Github #2509](https://github.com/penpot/penpot/issues/2509)
- Copy to SVG from contextual menu [Github #838](https://github.com/penpot/penpot/issues/838)
- Add styles for Inkeep Chat at workspace [Taiga #10708](https://tree.taiga.io/project/penpot/us/10708)
- Add configuration for air gapped installations with Docker
- Support system color scheme [Github #5030](https://github.com/penpot/penpot/issues/5030)
- Persist ruler visibility across files and reloads [GitHub #4586](https://github.com/penpot/penpot/issues/4586)
- Update google fonts (at 2025/05/19) [Taiga 10792](https://tree.taiga.io/project/penpot/us/10792)
- Add tooltip component to DS [Taiga 9220](https://tree.taiga.io/project/penpot/us/9220)
- Allow multi file token export [Taiga #10144](https://tree.taiga.io/project/penpot/us/10144)
- Fix problem when double click on hidden shapes [Taiga #11314](https://tree.taiga.io/project/penpot/issue/11314)
### :bug: Bugs fixed
- Fix getCurrentUser for plugins api [Taiga #11057](https://tree.taiga.io/project/penpot/issue/11057)
- Fix spacing / sizes of different elements in the measurements section of the design tab [Taiga #11076](https://tree.taiga.io/project/penpot/issue/11076)
- Fix selection of short paths [Github #4472](https://github.com/penpot/penpot/issues/4472)
- Fix element positioning on the right side to adjust to grid [#11073](https://tree.taiga.io/project/penpot/issue/11073)
- Fix palette is over sidebar [#11160](https://tree.taiga.io/project/penpot/issue/11160)
- Fix font size input not displaying "mixed" when multiple texts are selected [Taiga #11177](https://tree.taiga.io/project/penpot/issue/11177)
- Misalignments at Create account [Taiga #11315](https://tree.taiga.io/project/penpot/issue/11315)
- Fix issue with importing files where flex/grid is used [Taiga #11334](https://tree.taiga.io/project/penpot/issue/11334)
- Fix wrong color in the export progress bar [Taiga #11299](https://tree.taiga.io/project/penpot/issue/11299)
- Fix right sidebar width overflow on long layer names [Taiga #11212](https://tree.taiga.io/project/penpot/issue/11212)
- Fix comment icon fill [Taiga #11388](https://tree.taiga.io/project/penpot/issue/11388)
- Fix gap on radio-buttons component [Taiga #11360](https://tree.taiga.io/project/penpot/issue/11360)
- Fix button width [Taiga #11394](https://tree.taiga.io/project/penpot/issue/11394)
- Fix mixed letter spacing and line height [Taiga #11178](https://tree.taiga.io/project/penpot/issue/11178)
- Fix snap nodes shortcut [Taiga #11054](https://tree.taiga.io/project/penpot/issue/11054)
- Fix changing a text property in a text layer does not unapply the previously applied token in the same property [Taiga #11337](https://tree.taiga.io/project/penpot/issue/11337)
- Fix shortcut error pressing G+W from the View Mode [Taiga #11061](https://tree.taiga.io/project/penpot/issue/11061)
- Fix entering long project name [Taiga #11417](https://tree.taiga.io/project/penpot/issue/11417)
- Fix slow color picker [Taiga #11019](https://tree.taiga.io/project/penpot/issue/11019)
- Fix tooltip position after click [Taiga #11405](https://tree.taiga.io/project/penpot/issue/11405)
- Fix incorrect media translation on paste text with fill images [Github #6845](https://github.com/penpot/penpot/pull/6845)
## 2.7.2
### :bug: Bugs fixed
- Update plugins runtime [Github #6604](https://github.com/penpot/penpot/pull/6604)
- Backport from develop a minor fix that enables import of files
generated by penpot library [Github #6614](https://github.com/penpot/penpot/pull/6614)
- Fix copy in error message [GitHub #6615](https://github.com/penpot/penpot/pull/6615)
- Fix url on invitation link [Taiga #11284](https://tree.taiga.io/project/penpot/issue/11284)
## 2.7.1
### :bug: Bugs fixed
- Fix incorrect handling of strokes with images on importing files
- Fix tokens disappearing after manual additions [Taiga #11063](https://tree.taiga.io/project/penpot/issue/11063)
## 2.7.0
### :rocket: Epics and highlights
### :boom: Breaking changes & Deprecations
### :heart: Community contributions (Thank you!)
- Design improvements to the Invitations page with an empty state [GitHub #2608](https://github.com/penpot/penpot/issues/2608) by [@iprithvitharun](https://github.com/iprithvitharun)
### :sparkles: New features
- Update board presets with a newer devices [Taiga #10610](https://tree.taiga.io/project/penpot/us/10610)
- Propagate "sharing a prototype" to editors and viewers [Taiga #8853](https://tree.taiga.io/project/penpot/us/8853)
- Design improvements to the Invitations page with an empty state [Taiga #4554](https://tree.taiga.io/project/penpot/us/4554)
- Duplicate token sets [Taiga #10694](https://tree.taiga.io/project/penpot/issue/10694)
- Add set selection in create Token themes flow [Taiga #10746](https://tree.taiga.io/project/penpot/issue/10746)
- Display indicator on not active sets [Taiga #10668](https://tree.taiga.io/project/penpot/issue/10668)
### :bug: Bugs fixed
- Fix "at" icon to match all icons on app [Taiga #11136](https://tree.taiga.io/project/penpot/issue/11136)
- Fix problem in viewer with the back button [Taiga #10907](https://tree.taiga.io/project/penpot/issue/10907)
- Fix resize bar background on tokens panel [Taiga #10811](https://tree.taiga.io/project/penpot/issue/10811)
- Fix shortcut for history version panel [Taiga #11006](https://tree.taiga.io/project/penpot/issue/11006)
- Fix positioning of comment drafts when near the right / bottom edges of viewport [Taiga #10534](https://tree.taiga.io/project/penpot/issue/10534)
- Fix path having a wrong selrect [Taiga #10257](https://tree.taiga.io/project/penpot/issue/10257)
- Fix SVG `stroke-linecap` property when importing SVGs [Taiga #9489](https://tree.taiga.io/project/penpot/issue/9489)
- Fix position problems cutting-pasting a component [Taiga #10677](https://tree.taiga.io/project/penpot/issue/10677)
- Fix design tab has a horizontal scroll [Taiga #10660](https://tree.taiga.io/project/penpot/issue/10660)
- Fix long file names being clipped when longer than allowed length [Taiga #10662](https://tree.taiga.io/project/penpot/issue/10662)
- Fix problem with error detail in toast [Taiga #10519](https://tree.taiga.io/project/penpot/issue/10519)
- Fix view mode error when an external user tries to export something from a prototype using a shared link [Taiga #10251](https://tree.taiga.io/project/penpot/issue/10251)
- Fix merge path nodes with only one node selected [Taiga #9626](https://tree.taiga.io/project/penpot/issue/9626)
- Fix problem with import errors [Taiga #10040](https://tree.taiga.io/project/penpot/issue/10040)
- Fix color gradient on texts [Taiga Issue #7488](https://tree.taiga.io/project/penpot/issue/7488)
- Add support for self mentions [Taiga #10809](https://tree.taiga.io/project/penpot/issue/10809)
- Fix team info settings alignment [Taiga #10869](https://tree.taiga.io/project/penpot/issue/10869)
- Fix left sidebar horizontal scroll on nested layers [Taiga #10791](https://tree.taiga.io/project/penpot/issue/10791)
- Improve error message details importing tokens [Taiga Issue #10772](https://tree.taiga.io/project/penpot/issue/10772)
- Fix no selected set after Drag & Drop [Github #71](https://github.com/tokens-studio/penpot/issues/71)
- Styledictionary v5 Update [Github #6283](https://github.com/penpot/penpot/pull/6283)
- Fix Rename a set throws an internal error [Github #78](https://github.com/tokens-studio/penpot/issues/78)
- Fix Out of Sync Token Value & Color Picker [Github #102](https://github.com/tokens-studio/penpot/issues/102)
- Fix Color should preserve color space [Github #69](https://github.com/tokens-studio/penpot/issues/69)
- Fix cannot rename Design Token Sets when group of same name exists [Taiga Issue #10773](https://tree.taiga.io/project/penpot/issue/10773)
- Fix problem when duplicating grid layout [Github #6391](https://github.com/penpot/penpot/issues/6391)
- Fix issue that makes workspace shortcuts stop working [Taiga #11062](https://tree.taiga.io/project/penpot/issue/11062)
- Fix problem while syncing library colors and typographies [Taiga #11068](https://tree.taiga.io/project/penpot/issue/11068)
- Fix problem with path edition of shapes [Taiga #9496](https://tree.taiga.io/project/penpot/issue/9496)
- Fix exception on paste invalid html [Taiga #11047](https://tree.taiga.io/project/penpot/issue/11047)
- Fix share button being displayed with no permissions [Taiga #11086](https://tree.taiga.io/project/penpot/issue/11086)
- Fix inline styles in code tab [Taiga Issue #7583](https://tree.taiga.io/project/penpot/issue/7583)
- Fix exception on returning openapi.json
- Fix json encoding of TokensLib [Taiga #10994](https://tree.taiga.io/project/penpot/issue/10994)
## 2.6.2
### :bug: Bugs fixed
- Increase the height of the right sidebar dropdowns [Taiga #10615](https://tree.taiga.io/project/penpot/issue/10615)
- Fix scroll on token themes modal [Taiga #10745](https://tree.taiga.io/project/penpot/issue/10745)
- Fix collapsing grouped sets in "edit Theme" closes the dialog [Taiga #10771](https://tree.taiga.io/project/penpot/issue/10771)
- Fix unexpected exception on path editor on merge segments when undo stack is empty
- Fix pricing CTA to be under a config flag [Taiga #10808](https://tree.taiga.io/project/penpot/issue/10808)
- Fix allow moving a main component into another [Taiga #10818](https://tree.taiga.io/project/penpot/issue/10818)
- Fix several issues with internal srepl helpers
- Fix unexpected exception on template import from libraries
- Fix incorrect uuid parsing from different parts of code
- Fix update layout on component restore [Taiga #10637](https://tree.taiga.io/project/penpot/issue/10637)
- Fix horizontal scroll in viewer [Github #6290](https://github.com/penpot/penpot/issues/6290)
- Fix detach component in a particular case [Taiga #10837](https://tree.taiga.io/project/penpot/issue/10837)
## 2.6.1
### :bug: Bugs fixed
- Fix webhooks not shown in list [Taiga #10763](https://tree.taiga.io/project/penpot/issue/10763)
- Fix colorpicker scroll when dropdown displayed [Taiga #10696](https://tree.taiga.io/project/penpot/issue/10696)
- Clean internal workspace state on exit or url changed [Taiga #10619](https://tree.taiga.io/project/penpot/issue/10619)
## 2.6.0
### :rocket: Epics and highlights
- Design Tokens
### :boom: Breaking changes & Deprecations
### :heart: Community contributions (Thank you!)
### :sparkles: New features
- [COMMENTS] "Mark All as Read" Functionality in Dashboard [Taiga #9235](https://tree.taiga.io/project/penpot/us/9235)
- [COMMENTS] Bubble Groups [Taiga #9236](https://tree.taiga.io/project/penpot/us/9236)
- Change templates carrousel [Taiga #9803](https://tree.taiga.io/project/penpot/us/9803)
- [DESIGN TOKENS] Tokens CRUD. Types added: Color, Opacity, Border radius, Dimension, Sizing, Spacing, Rotation and Stroke.
- [DESIGN TOKENS] Create references (alias) that point to other tokens.
- [DESIGN TOKENS] Math operations in token values.
- [DESIGN TOKENS] Sets CRUD, grouping and reordering.
- [DESIGN TOKENS] Multidimensional Themes and Sets management.
- [DESIGN TOKENS] Apply/Remove tokens to/from elements from the Tokens tab.
- [DESIGN TOKENS] Integration with components.
- [DESIGN TOKENS] Import and export tokens from a JSON file.
- [DESIGN TOKENS] Apply Themes and Sets at document level.
- Add more descriptive tooltip to boards for first time users [Taiga #9426](https://tree.taiga.io/project/penpot/us/9426)
- First State of a Project Changes Consolidation [Taia #10605](https://tree.taiga.io/project/penpot/us/10605)
### :bug: Bugs fixed
- Fix opacity in frame containers [Github #5858](https://github.com/penpot/penpot/pull/5858)
- Avoid resizing on click [Taiga #10213](https://tree.taiga.io/project/penpot/issue/10213)
- Hide horizontal scroll from dashboard sidebar [Taiga #10422](https://tree.taiga.io/project/penpot/issue/10422)
- Fix cut and paste a copy a cmponent inside its parent [Taiga #10365](https://tree.taiga.io/project/penpot/us/10365)
- Fix duplicate page with component over frame [Taiga #8151](https://tree.taiga.io/project/penpot/issue/8151) and [Taiga #9698](https://tree.taiga.io/project/penpot/issue/9698)
- The plugin list in the navigation menu lacks scrolling, some plugins are not visible when a large number are installed [Taiga #9360](https://tree.taiga.io/project/penpot/us/9360)
- Fix hidden toolbar click event still available [Taiga #10437](https://tree.taiga.io/project/penpot/us/10437)
- Fix hovering over templates [Taiga #10545](https://tree.taiga.io/project/penpot/issue/10545)
- Fix problem with default shadows value in plugins [Plugins #191](https://github.com/penpot/penpot-plugins/issues/191)
- Fix problem with constraints when creating group [Taiga #10455](https://tree.taiga.io/project/penpot/issue/10455)
- Fix opening pen with shortcut multiple times breaks toolbar [Taiga #10566](https://tree.taiga.io/project/penpot/issue/10566)
- Fix actions when workspace is visited first time [Taiga #10548](https://tree.taiga.io/project/penpot/issue/10548)
- Chat icon overlaps "Show" button in carrousel section [Taiga #10542](https://tree.taiga.io/project/penpot/issue/10542)
- Fix assets name on inspect tab [Taiga #10630](https://tree.taiga.io/project/penpot/issue/10630)
- Fix chat icon overlaps "Show" button in carrousel section [Taiga #10542](https://tree.taiga.io/project/penpot/issue/10542)
- Fix incorrect handling of background task result (now task rows are properly marked as completed)
- Fix available size of resize handler [Taiga #10639](https://tree.taiga.io/project/penpot/issue/10639)
- Internal error when install a plugin by penpothub - Try plugin [Taiga #10542](https://tree.taiga.io/project/penpot/issue/10542)
- Add character limitation to asset inputs [Taiga #10669](https://tree.taiga.io/project/penpot/issue/10669)
- Fix Storybook link 'list of all available icons' wrong path [Taiga #10705](https://tree.taiga.io/project/penpot/issue/10705)
## 2.5.4
### :heart: Community contributions (Thank you!)
- Add support for WEBP format on shape export [Github #6053](https://github.com/penpot/penpot/pull/6053) and [Github #6074](https://github.com/penpot/penpot/pull/6074)
### :bug: Bugs fixed
- Fix feature loading on workspace when opening a file in a background
tab [Taiga #10377](https://tree.taiga.io/project/penpot/issue/10377)
- Fix minor inconsistencies on RPC `get-file-libraries` and `get-file`
methods (add missing team-id prop)
- Fix problem with viewer role and inspect mode [Taiga #9751](https://tree.taiga.io/project/penpot/issue/9751)
- Fix error when clicking on a comment at the viewer's sidebar [Taiga #10465](https://tree.taiga.io/project/penpot/issue/10465)
## 2.5.3
### :bug: Bugs fixed
- Component sync issues with multiple tabs [Taiga #10471](https://tree.taiga.io/project/penpot/issue/10471)
## 2.5.2
### :sparkles: New features
- When the workspace is empty, set default the board creation tool [Taiga #9425](https://tree.taiga.io/project/penpot/us/9425)
### :bug: Bugs fixed
- Fix scroll on storybook docs [taiga #9962](https://tree.taiga.io/project/penpot/issue/9962)
- Navigate tracking event firing multiple times [Taiga #10415](https://tree.taiga.io/project/penpot/issue/10415)
- Fix problem with selection colors [Taiga #10376](https://tree.taiga.io/project/penpot/issue/10376)
- Fix scroll on storybook icons list [taiga #9962](https://tree.taiga.io/project/penpot/issue/9962)
## 2.5.1
### :sparkles: New features
- Improve Nginx entryponit to get the resolvers dinamically by default
## 2.5.0
### :boom: Breaking changes & Deprecations
Although this is not a breaking change, we believe its important to highlight it in this
section:
This release includes a fix for an internal bug in Penpot that caused incorrect handling
of media assets (e.g., fill images). The issue has been resolved since version 2.4.3, so
no new incorrect references will be generated. However, existing files may still contain
incorrect references.
To address this, weve provided a script to correct these references in existing files.
While having incorrect references generally doesnt result in visible issues, there are
rare cases where it can cause problems. For example, if a component library (containing
images) is deleted, and that library is being used in other files, running the FileGC task
(responsible for freeing up space and performing logical deletions) could leave those
files with broken references to the images.
To execute script:
```bash
docker exec -ti <container-name-or-id> ./run.sh app.migrations.media-refs '{:max-jobs 1}'
```
If you have a big database and many cores available, you can reduce the time of processing
all files by increasing paralelizacion changing the `max-jobs` value from 1 to N (where N
is a number of cores)
### :sparkles: New features
- [GRADIENTS] New gradients UI with multi-stop support. [Taiga #3418](https://tree.taiga.io/project/penpot/epic/3418)
- [GRADIENTS] Radial Gradient [Taiga #8768](https://tree.taiga.io/project/penpot/us/8768)
- Shareable link pointing to an specific board. [Taiga #3219](https://tree.taiga.io/project/penpot/us/3219)
- Copy styles in CSS [Taiga #9401](https://tree.taiga.io/project/penpot/us/9401)
- Copy/paste shape styles (fills, strokes, shadows, etc..) [Taiga #8937](https://tree.taiga.io/project/penpot/us/8937)
- Copy text content to clipboard [Taiga #9970](https://tree.taiga.io/project/penpot/us/9970?milestone=424203)
- Resize board to fit content option [Taiga #4707](https://tree.taiga.io/project/penpot/us/4707)
- Rename selected layer via Board name [Taiga #9430](https://tree.taiga.io/project/penpot/us/9430)
- [COMMENTS] Mention Functionality with and Sidebar Filters [Taiga #9237](https://tree.taiga.io/project/penpot/us/9237)
- [COMMENTS] Visual Changes in Comments [Taiga #9234](https://tree.taiga.io/project/penpot/us/9234)
- [COMMENTS] Notifications in Backend, Profile Section, and Mention Email Notification [Taiga #9233](https://tree.taiga.io/project/penpot/us/9233)
### :bug: Bugs fixed
- Fix menu shadow color [Taiga #10102](https://tree.taiga.io/project/penpot/issue/10102)
- Fix missing state refresh on notifications update [Taiga #10253](https://tree.taiga.io/project/penpot/issue/10253)
- Fix icon visualization on select component [Taiga #8889](https://tree.taiga.io/project/penpot/issue/8889)
- Fix typo on integration tests docs [Taiga #10112](https://tree.taiga.io/project/penpot/issue/10112)
- Fix menu shadow color [Taiga #10102](https://tree.taiga.io/project/penpot/issue/10102)
- Fix problem with alt key measures being stuck [Taiga #9348](https://tree.taiga.io/project/penpot/issue/9348)
- Fix error when reseting stroke cap
- Fix problem with strokes not refreshing in Safari [Taiga #9040](https://tree.taiga.io/project/penpot/issue/9040)
- Fix problem with multiple color changes [Taiga #9631](https://tree.taiga.io/project/penpot/issue/9631)
- Fix create new layers in a component copy [Taiga #10037](https://tree.taiga.io/project/penpot/issue/10037)
- Fix problem in plugins with zoomIntoView [Plugins #189](https://github.com/penpot/penpot-plugins/issues/189)
- Fix problem in plugins with renaming components [Taiga #10060](https://tree.taiga.io/project/penpot/issue/10060)
- Added upload svg with images method [#5489](https://github.com/penpot/penpot/issues/5489)
- Fix problem with root frame parent reference [Taiga #9437](https://tree.taiga.io/project/penpot/issue/9437)
- Fix change flex direction using plugins API [Taiga #9407](https://tree.taiga.io/project/penpot/issue/9407)
- Fix problem opening url when page-id didn't exist [Taiga #10157](https://tree.taiga.io/project/penpot/issue/10157)
- Fix problem with onboarding to a team [Taiga #10143](https://tree.taiga.io/project/penpot/issue/10143)
- Fix problem with grid layout crashing [Taiga #10127](https://tree.taiga.io/project/penpot/issue/10127)
- Fix rename locked boards [Taiga #10174](https://tree.taiga.io/project/penpot/issue/10174)
- Fix update-libraries dialog disappear when clicking outside [Taiga #10238](https://tree.taiga.io/project/penpot/issue/10238)
- Fix incorrect handling of team access requests with deleted/recreated users
- Fix incorect handling of profile settings related to invitation notifications [Taiga #10252](https://tree.taiga.io/project/penpot/issue/10252)
## 2.4.3
### :bug: Bugs fixed
- Fix errors from editable select on measures menu [Taiga #9888](https://tree.taiga.io/project/penpot/issue/9888)
- Fix exception on importing some templates from templates slider
- Consolidate adding share button to workspace
- Fix problem when pasting text [Taiga #9929](https://tree.taiga.io/project/penpot/issue/9929)
- Fix incorrect media reference handling on component instantiation
## 2.4.2
### :bug: Bugs fixed
@@ -10,6 +354,7 @@
- Fix missing methods reference on API Docs
- Fix memory usage issue on file-gc asynchronous task (related to snapshots feature)
## 2.4.1
### :bug: Bugs fixed
@@ -17,6 +362,7 @@
- Fix error when importing files with touched components [Taiga #9625](https://tree.taiga.io/project/penpot/issue/9625)
- Fix problem when changing color libraries [Plugins #184](https://github.com/penpot/penpot-plugins/issues/184)
## 2.4.0
### :rocket: Epics and highlights
@@ -28,12 +374,12 @@
(penpot). Because of that, the default NGINX listen port is now 8080 instead of 80, so
you will have to modify your infrastructure to apply this change.
- Redis 7.2 is explicitly pinned in our example docker-compose.yml file. This is done because,
starting with the next versions, Redis is no longer distributed under an open-source license.
On-premise users are obviously free to upgrade to the version they are using or a more modern one.
Keep in mind that if you were using a version other than 7.2, you may have to recreate the volume
associated with the Redis container because the 7.2 storage format may not be compatible with what
you already have stored on the volume, and Redis may not start. In the near future, we will evaluate
- Redis 7.2 is explicitly pinned in our example docker-compose.yml file. This is done because,
starting with the next versions, Redis is no longer distributed under an open-source license.
On-premise users are obviously free to upgrade to the version they are using or a more modern one.
Keep in mind that if you were using a version other than 7.2, you may have to recreate the volume
associated with the Redis container because the 7.2 storage format may not be compatible with what
you already have stored on the volume, and Redis may not start. In the near future, we will evaluate
whether to move to an open-source version of Redis (such as https://valkey.io/).
### :heart: Community contributions (Thank you!)

3
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,3 @@
# Penpot's Code of Conduct
Check it at: https://help.penpot.app/contributing-guide/coc/

View File

@@ -1,62 +1,59 @@
# Contributing Guide #
Thank you for your interest in contributing to Penpot. This is a
generic guide that details how to contribute to Penpot in a way that
is efficient for everyone. If you want a specific documentation for
different parts of the platform, please refer to `docs/` directory.
generic guide that details how to contribute to the project in a way that
is efficient for everyone. If you are looking for specific documentation on
different parts of the platform, please refer to the `docs/` directory,
or the rendered version at the [Help Center](https://help.penpot.app/).
## Reporting Bugs ##
We are using [GitHub Issues](https://github.com/penpot/penpot/issues)
for our public bugs. We keep a close eye on this and try to make it
for our public bugs. We keep a close eye on them and try to make it
clear when we have an internal fix in progress. Before filing a new
task, try to make sure your problem doesn't already exist.
If you found a bug, please report it, as far as possible with:
If you found a bug, please report it, as far as possible, with:
- a detailed explanation of steps to reproduce the error
- a browser and the browser version used
- a dev tools console exception stack trace (if it is available)
- the browser and browser version used
- a dev tools console exception stack trace (if available)
If you found a bug that you consider better discuss in private (for
example: security bugs), consider first send an email to
If you found a bug which you think is better to discuss in private (for
example, security bugs), consider first sending an email to
`support@penpot.app`.
**We don't have formal bug bounty program for security reports; this
is an open source application and your contribution will be recognized
**We don't have a formal bug bounty program for security reports; this
is an open source application, and your contribution will be recognized
in the changelog.**
## Pull requests ##
## Pull Requests ##
If you want propose a change or bug fix with the Pull-Request system
firstly you should carefully read the **DCO** section and format your
commits accordingly.
If you want to propose a change or bug fix via a pull request (PR),
you should first carefully read the section **Developer's Certificate of
Origin**. You must also format your code and commits according to the
instructions below.
If you intend to fix a bug it's fine to submit a pull request right
away but we still recommend to file an issue detailing what you're
If you intend to fix a bug, it's fine to submit a pull request right
away, but we still recommend filing an issue detailing what you're
fixing. This is helpful in case we don't accept that specific fix but
want to keep track of the issue.
If you want to implement or start working in a new feature, please
open a **question** / **discussion** issue for it. No pull-request
will be accepted without previous chat about the changes,
independently if it is a new feature, already planned feature or small
quick win.
If you want to implement or start working on a new feature, please
open a **question*- / **discussion*- issue for it. No PR
will be accepted without a prior discussion about the changes,
whether it is a new feature, an already planned one, or a quick win.
If is going to be your first pull request, You can learn how from this
free video series:
https://egghead.io/courses/how-to-contribute-to-an-open-source-project-on-github
We will use the `easy fix` mark for tag for indicate issues that are
easy for beginners.
If it is your first PR, you can learn how to proceed from
[this free video
series](https://egghead.io/courses/how-to-contribute-to-an-open-source-project-on-github)
We use the `easy fix` tag to indicate issues that are appropriate for beginners.
## Commit Guidelines ##
We have very precise rules over how our git commit messages can be formatted.
We have very precise rules on how our git commit messages must be formatted.
The commit message format is:
@@ -71,33 +68,37 @@ The commit message format is:
Where type is:
- :bug: `:bug:` a commit that fixes a bug
- :sparkles: `:sparkles:` a commit that an improvement
- :tada: `:tada:` a commit with new feature
- :sparkles: `:sparkles:` a commit that adds an improvement
- :tada: `:tada:` a commit with a new feature
- :recycle: `:recycle:` a commit that introduces a refactor
- :lipstick: `:lipstick:` a commit with cosmetic changes
- :ambulance: `:ambulance:` a commit that fixes critical bug
- :ambulance: `:ambulance:` a commit that fixes a critical bug
- :books: `:books:` a commit that improves or adds documentation
- :construction: `:construction:`: a wip commit
- :construction: `:construction:` a WIP commit
- :boom: `:boom:` a commit with breaking changes
- :wrench: `:wrench:` a commit for config updates
- :zap: `:zap:` a commit with performance improvements
- :whale: `:whale:` a commit for docker related stuff
- :rewind: `:rewind:` a commit that reverts changes
- :paperclip: `:paperclip:` a commit with other not relevant changes
- :arrow_up: `:arrow_up:` a commit with dependencies updates
- :whale: `:whale:` a commit for Docker-related stuff
- :paperclip: `:paperclip:` a commit with other non-relevant changes
- :arrow_up: `:arrow_up:` a commit with dependency updates
- :arrow_down: `:arrow_down:` a commit with dependency downgrades
- :fire: `:fire:` a commit that removes files or code
- :globe_with_meridians: `:globe_with_meridians:` a commit that adds or updates
translations
More info:
- https://gist.github.com/parmentf/035de27d6ed1dce0b36a
- https://gist.github.com/rxaviers/7360908
Each commit should have:
- A concise subject using imperative mood.
- The subject should have capitalized the first letter, without period
at the end and no larger than 65 characters.
- A concise subject using the imperative mood.
- The subject should capitalize the first letter, omit the period
at the end, and be no longer than 65 characters.
- A blank line between the subject line and the body.
- An entry on the CHANGES.md file if applicable, referencing the
github or taiga issue/user-story using the these same rules.
- An entry in the CHANGES.md file if applicable, referencing the
GitHub or Taiga issue/user story using these same rules.
Examples of good commit messages:
@@ -110,8 +111,30 @@ Examples of good commit messages:
- `:ambulance: Fix critical bug on user registration process`
- `:tada: Add new approach for user registration`
## Formatting and Linting ##
## Code of conduct ##
You will want to make sure your code is formatted and linted before submitting
a PR. We use [cljfmt](https://github.com/weavejester/cljfmt) and
[clj-kondo](https://github.com/clj-kondo/clj-kondo) for this. After installing
them on your system, you can run them with:
```bash
# Check formatting
yarn fmt:clj:check
# Check and fix formatting
yarn fmt:clj
# Run the linter
yarn lint:clj
```
There are more choices in `package.json`.
Ideally, you should run these commands as git pre-commit hooks. A convenient way
of defining them is to use [Husky](https://typicode.github.io/husky/#/).
## Code of Conduct ##
As contributors and maintainers of this project, we pledge to respect
all people who contribute through reporting issues, posting feature
@@ -131,11 +154,11 @@ unprofessional conduct.
Project maintainers have the right and responsibility to remove, edit,
or reject comments, commits, code, wiki edits, issues, and other
contributions that are not aligned to this Code of Conduct. Project
contributions that are not aligned with this Code of Conduct. Project
maintainers who do not follow the Code of Conduct may be removed from
the project team.
This code of conduct applies both within project spaces and in public
This Code of Conduct applies both within project spaces and in public
spaces when an individual is representing the project or its
community.
@@ -144,12 +167,11 @@ may be reported by opening an issue or contacting one or more of the
project maintainers.
This Code of Conduct is adapted from the Contributor Covenant, version
1.1.0, available from http://contributor-covenant.org/version/1/1/0/
1.1.0, available from [http://contributor-covenant.org/version/1/1/0/](http://contributor-covenant.org/version/1/1/0/)
## Developer's Certificate of Origin (DCO)
## Developer's Certificate of Origin (DCO) ##
By submitting code you are agree and can certify the below:
By submitting code you agree to and can certify the following:
Developer's Certificate of Origin 1.1
@@ -177,13 +199,15 @@ By submitting code you are agree and can certify the below:
maintained indefinitely and may be redistributed consistent with
this project or the open source license(s) involved.
Then, all your code patches (**documentation are excluded**) should
Then, all your code patches (**documentation is excluded**) should
contain a sign-off at the end of the patch/commit description body. It
can be automatically added on adding `-s` parameter to `git commit`.
can be automatically added by adding the `-s` parameter to `git commit`.
This is an example of the aspect of the line:
This is an example of what the line should look like:
Signed-off-by: Andrey Antukh <niwi@niwi.nz>
```
Signed-off-by: Andrey Antukh <niwi@niwi.nz>
```
Please, use your real name (sorry, no pseudonyms or anonymous
contributions are allowed).

View File

@@ -16,36 +16,38 @@
</p>
<p align="center">
<a href="https://penpot.app/"><b>Website</b></a> •
<a href="https://help.penpot.app/technical-guide/getting-started/"><b>Getting Started</b></a> •
<a href="https://help.penpot.app/user-guide/"><b>User Guide</b></a> •
<a href="https://help.penpot.app/user-guide/introduction/info/"><b>Tutorials & Info</b></a> •
<a href="https://penpot.app/"><b>Website</b></a> •
<a href="https://help.penpot.app/user-guide/"><b>User Guide</b></a> •
<a href="https://penpot.app/learning-center"><b>Learning Center</b></a> •
<a href="https://community.penpot.app/"><b>Community</b></a>
</p>
<p align="center">
<a href="https://www.youtube.com/@Penpot"><b>Youtube</b></a> •
<a href="https://peertube.kaleidos.net/a/penpot_app/video-channels"><b>Peertube</b></a> •
<a href="https://www.linkedin.com/company/penpot/"><b>Linkedin</b></a> •
<a href="https://instagram.com/penpot.app"><b>Instagram</b></a> •
<a href="https://fosstodon.org/@penpot/"><b>Mastodon</b></a> •
<a href="https://www.youtube.com/@Penpot"><b>Youtube</b></a> •
<a href="https://peertube.kaleidos.net/a/penpot_app/video-channels"><b>Peertube</b></a> •
<a href="https://www.linkedin.com/company/penpot/"><b>Linkedin</b></a> •
<a href="https://instagram.com/penpot.app"><b>Instagram</b></a> •
<a href="https://fosstodon.org/@penpot/"><b>Mastodon</b></a> •
<a href="https://bsky.app/profile/penpot.app"><b>Bluesky</b></a> •
<a href="https://twitter.com/penpotapp"><b>X</b></a>
</p>
<br />
[Penpot video](https://github.com/penpot/penpot/assets/5446186/b8ad0764-585e-4ddc-b098-9b4090d337cc)
[Penpot video](https://github.com/user-attachments/assets/7c67fd7c-04d3-4c9b-88ec-b6f5e23f8332
)
<br />
Penpot is the first **open-source** design tool for design and code collaboration. Designers can create stunning designs, interactive prototypes, design systems at scale, while developers enjoy ready-to-use code and make their workflow easy and fast. And all of this with no handoff drama.
Penpot is available on browser and [self host](https://penpot.app/self-host). Its web-based and works with open standards (SVG, CSS and HTML). And last but not least, its free!
Available on browser or self-hosted, Penpot works with open standards like SVG, CSS, HTML and JSON, and its free!
Penpots latest [huge release 2.0](https://penpot.app/dev-diaries), takes the platform to a whole new level. This update introduces the ground-breaking [CSS Grid Layout feature](https://penpot.app/penpot-2.0), a complete UI redesign, a new Components system, and much more. Plus, it's faster and more accessible.
The latest updates take Penpot even further. Its the first design tool to integrate native [design tokens](https://penpot.dev/collaboration/design-tokens)—a single source of truth to improve efficiency and collaboration between product design and development.
With the [huge 2.0 release](https://penpot.app/dev-diaries), Penpot took the platform to a whole new level. This update introduces the ground-breaking [CSS Grid Layout feature](https://penpot.app/penpot-2.0), a complete UI redesign, a new Components system, and much more.
For organizations that need extra service for its teams, [get in touch](https://cal.com/team/penpot/talk-to-us)
🎇 **Penpot Fest** is our design, code & Open Source event. Check out the highlights from [Penpot Fest 2023 edition](https://www.youtube.com/watch?v=sOpLZaK5mDc)!
🎇 Design, code, and Open Source meet at [Penpot Fest](https://penpot.app/penpotfest)! Be part of the 2025 edition in Madrid, Spain, on October 9-10.
## Table of contents ##
@@ -61,7 +63,7 @@ Penpots latest [huge release 2.0](https://penpot.app/dev-diaries), takes the
Penpot expresses designs as code. Designers can do their best work and see it will be beautifully implemented by developers in a two-way collaboration.
### Plugin system ###
[Penpot plugins](https://penpot.app/penpothub/plugins) let you expand the platform's capabilities, give you the flexibility to integrate it with other apps, and design custom solutions.
[Penpot plugins](https://penpot.app/penpothub/plugins) let you expand the platform's capabilities, give you the flexibility to integrate it with other apps, and design custom solutions.
### Designed for developers ###
Penpot was built to serve both designers and developers and create a fluid design-code process. You have the choice to enjoy real-time collaboration or play "solo".
@@ -78,6 +80,10 @@ Penpot offers integration into the development toolchain, thanks to its support
### Whats great for design ###
With Penpot you can design libraries to share and reuse; turn design elements into components and tokens to allow reusability and scalability; and build realistic user flows and interactions.
### Design Tokens ###
With Penpots standardized [design tokens](https://penpot.dev/collaboration/design-tokens) format, you can easily reuse and sync tokens across different platforms, workflows, and disciplines.
<br />
<p align="center">
@@ -88,10 +94,9 @@ With Penpot you can design libraries to share and reuse; turn design elements in
## Getting started ##
### Install with Elestio ###
Penpot is the only design & prototype platform that is deployment agnostic. You can use it or deploy it anywhere.
Penpot is the only design & prototype platform that is deployment agnostic. You can use it in our [SAAS](https://design.penpot.app) or deploy it anywhere.
Learn how to install it with Elestio and Docker, or other options on [our website](https://penpot.app/self-host).
Learn how to install it with Docker, Kubernetes, Elestio or other options on [our website](https://penpot.app/self-host).
<br />
<p align="center">
@@ -123,15 +128,21 @@ You will find the following categories:
</p>
<br />
### Code of Conduct ###
Anyone who contributes to Penpot, whether through code, in the community, or at an event, must adhere to the
[code of conduct](https://help.penpot.app/contributing-guide/coc/) and foster a positive and safe environment.
## Contributing ##
Any contribution will make a difference to improve Penpot. How can you get involved?
Any contribution will make a difference to improve Penpot. How can you get involved?
Choose your way:
Choose your way:
- Create and [share Libraries & Templates](https://penpot.app/libraries-templates.html) that will be helpful for the community
- Invite your [team to join](https://design.penpot.app/#/auth/register)
- Star this repo and follow us on Social Media: [Mastodon](https://fosstodon.org/@penpot/), [Youtube](https://www.youtube.com/c/Penpot), [Instagram](https://instagram.com/penpot.app), [Linkedin](https://www.linkedin.com/company/penpotdesign), [Peertube](https://peertube.kaleidos.net/a/penpot_app) and [X](https://twitter.com/penpotapp).
- Give this repo a star and follow us on Social Media: [Mastodon](https://fosstodon.org/@penpot/), [Youtube](https://www.youtube.com/c/Penpot), [Instagram](https://instagram.com/penpot.app), [Linkedin](https://www.linkedin.com/company/penpotdesign), [Peertube](https://peertube.kaleidos.net/a/penpot_app), [X](https://twitter.com/penpotapp) and [BlueSky](https://bsky.app/profile/penpot.app)
- Participate in the [Community](https://community.penpot.app/) space by asking and answering questions; reacting to others articles; opening your own conversations and following along on decisions affecting the project.
- Report bugs with our easy [guide for bugs hunting](https://help.penpot.app/contributing-guide/reporting-bugs/) or [GitHub issues](https://github.com/penpot/penpot/issues)
- Become a [translator](https://help.penpot.app/contributing-guide/translations)

View File

@@ -3,10 +3,10 @@
:deps
{penpot/common {:local/root "../common"}
org.clojure/clojure {:mvn/version "1.12.0"}
org.clojure/clojure {:mvn/version "1.12.1"}
org.clojure/tools.namespace {:mvn/version "1.5.0"}
com.github.luben/zstd-jni {:mvn/version "1.5.6-6"}
com.github.luben/zstd-jni {:mvn/version "1.5.7-3"}
io.prometheus/simpleclient {:mvn/version "0.16.0"}
io.prometheus/simpleclient_hotspot {:mvn/version "0.16.0"}
@@ -17,8 +17,15 @@
io.prometheus/simpleclient_httpserver {:mvn/version "0.16.0"}
io.lettuce/lettuce-core {:mvn/version "6.4.0.RELEASE"}
io.lettuce/lettuce-core {:mvn/version "6.7.0.RELEASE"}
;; Minimal dependencies required by lettuce, we need to include them
;; explicitly because clojure dependency management does not support
;; yet the BOM format.
io.micrometer/micrometer-core {:mvn/version "1.14.2"}
io.micrometer/micrometer-observation {:mvn/version "1.14.2"}
java-http-clj/java-http-clj {:mvn/version "0.4.3"}
com.google.guava/guava {:mvn/version "33.4.8-jre"}
funcool/yetti
{:git/tag "v11.4"
@@ -26,24 +33,24 @@
:git/url "https://github.com/funcool/yetti.git"
:exclusions [org.slf4j/slf4j-api]}
com.github.seancorfield/next.jdbc {:mvn/version "1.3.955"}
metosin/reitit-core {:mvn/version "0.7.2"}
nrepl/nrepl {:mvn/version "1.3.0"}
cider/cider-nrepl {:mvn/version "0.50.2"}
com.github.seancorfield/next.jdbc
{:mvn/version "1.3.1002"}
metosin/reitit-core {:mvn/version "0.9.1"}
nrepl/nrepl {:mvn/version "1.3.1"}
org.postgresql/postgresql {:mvn/version "42.7.4"}
org.xerial/sqlite-jdbc {:mvn/version "3.46.1.3"}
org.postgresql/postgresql {:mvn/version "42.7.6"}
org.xerial/sqlite-jdbc {:mvn/version "3.49.1.0"}
com.zaxxer/HikariCP {:mvn/version "6.0.0"}
com.zaxxer/HikariCP {:mvn/version "6.3.0"}
io.whitfin/siphash {:mvn/version "2.0.0"}
buddy/buddy-hashers {:mvn/version "2.0.167"}
buddy/buddy-sign {:mvn/version "3.6.1-359"}
com.github.ben-manes.caffeine/caffeine {:mvn/version "3.1.8"}
com.github.ben-manes.caffeine/caffeine {:mvn/version "3.2.0"}
org.jsoup/jsoup {:mvn/version "1.18.1"}
org.jsoup/jsoup {:mvn/version "1.20.1"}
org.im4java/im4java
{:git/tag "1.4.0-penpot-2"
:git/sha "e2b3e16"
@@ -54,12 +61,11 @@
org.clojars.pntblnk/clj-ldap {:mvn/version "0.0.17"}
dawran6/emoji {:mvn/version "0.1.5"}
markdown-clj/markdown-clj {:mvn/version "1.12.1"}
markdown-clj/markdown-clj {:mvn/version "1.12.3"}
;; Pretty Print specs
pretty-spec/pretty-spec {:mvn/version "0.1.4"}
software.amazon.awssdk/s3 {:mvn/version "2.28.26"}
}
software.amazon.awssdk/s3 {:mvn/version "2.31.55"}}
:paths ["src" "resources" "target/classes"]
:aliases
@@ -74,7 +80,7 @@
:build
{:extra-deps
{io.github.clojure/tools.build {:git/tag "v0.10.5" :git/sha "2a21b7a"}}
{io.github.clojure/tools.build {:git/tag "v0.10.9" :git/sha "e405aac"}}
:ns-default build}
:test
@@ -88,8 +94,8 @@
:jmx-remote
{:jvm-opts ["-Dcom.sun.management.jmxremote"
"-Dcom.sun.management.jmxremote.port=9091"
"-Dcom.sun.management.jmxremote.rmi.port=9091"
"-Dcom.sun.management.jmxremote.port=9090"
"-Dcom.sun.management.jmxremote.rmi.port=9090"
"-Dcom.sun.management.jmxremote.local.only=false"
"-Dcom.sun.management.jmxremote.authenticate=false"
"-Dcom.sun.management.jmxremote.ssl=false"

View File

@@ -4,7 +4,7 @@
"license": "MPL-2.0",
"author": "Kaleidos INC",
"private": true,
"packageManager": "yarn@4.3.1",
"packageManager": "yarn@4.9.2+sha512.1fc009bc09d13cfd0e19efa44cbfc2b9cf6ca61482725eb35bbc5e257e093ebf4130db6dfe15d604ff4b79efd8e1e8e99b25fa7d0a6197c9f9826358d4d65c3c",
"repository": {
"type": "git",
"url": "https://github.com/penpot/penpot"

View File

@@ -0,0 +1,244 @@
<!doctype html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:o="urn:schemas-microsoft-com:office:office">
<head>
<title>
</title>
<!--[if !mso]><!-- -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!--<![endif]-->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type="text/css">
#outlook a {
padding: 0;
}
body {
margin: 0;
padding: 0;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
}
table,
td {
border-collapse: collapse;
mso-table-lspace: 0pt;
mso-table-rspace: 0pt;
}
img {
border: 0;
height: auto;
line-height: 100%;
outline: none;
text-decoration: none;
-ms-interpolation-mode: bicubic;
}
p {
display: block;
margin: 13px 0;
}
</style>
<!--[if mso]>
<xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
<o:PixelsPerInch>96</o:PixelsPerInch>
</o:OfficeDocumentSettings>
</xml>
<![endif]-->
<!--[if lte mso 11]>
<style type="text/css">
.mj-outlook-group-fix { width:100% !important; }
</style>
<![endif]-->
<!--[if !mso]><!-->
<link href="https://fonts.googleapis.com/css?family=Source%20Sans%20Pro" rel="stylesheet" type="text/css">
<style type="text/css">
@import url(https://fonts.googleapis.com/css?family=Source%20Sans%20Pro);
</style>
<!--<![endif]-->
<style type="text/css">
@media only screen and (min-width:480px) {
.mj-column-per-100 {
width: 100% !important;
max-width: 100%;
}
.mj-column-px-425 {
width: 425px !important;
max-width: 425px;
}
}
</style>
<style type="text/css">
@media only screen and (max-width:480px) {
table.mj-full-width-mobile {
width: 100% !important;
}
td.mj-full-width-mobile {
width: auto !important;
}
}
</style>
</head>
<body style="background-color:#E5E5E5;">
<div style="background-color:#E5E5E5;">
<!--[if mso | IE]>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
<tr>
<td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;">
<![endif]-->
<div style="margin:0px auto;max-width:600px;">
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
<tbody>
<tr>
<td style="direction:ltr;font-size:0px;padding:0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
<![endif]-->
<div class="mj-column-per-100 mj-outlook-group-fix"
style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;"
width="100%">
<tr>
<td align="left" style="font-size:0px;padding:16px;word-break:break-word;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:collapse;border-spacing:0px;">
<tbody>
<tr>
<td style="width:97px;">
<img height="32" src="{{ public-uri }}/images/email/uxbox-title.png"
style="border:0;display:block;outline:none;text-decoration:none;height:32px;width:100%;font-size:13px;"
width="97" />
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</table>
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</tbody>
</table>
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
<tr>
<td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;">
<![endif]-->
<div style="background:#FFFFFF;background-color:#FFFFFF;margin:0px auto;max-width:600px;">
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
style="background:#FFFFFF;background-color:#FFFFFF;width:100%;">
<tbody>
<tr>
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
<![endif]-->
<div class="mj-column-per-100 mj-outlook-group-fix"
style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;"
width="100%">
<tr>
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div
style="font-family:Source Sans Pro, sans-serif;font-size:24px;font-weight:600;line-height:150%;text-align:left;color:#000000;">
Hello {{name|abbreviate:25}}!</div>
</td>
</tr>
<tr>
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div
style="font-family:Source Sans Pro, sans-serif;font-size:16px;line-height:150%;text-align:left;color:#000000;">
<span style="font-weight:bold;">{{ source-user }}</span> has mentioned you on a comment at "{{ comment-reference }}".</div>
</td>
</tr>
<tr>
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div style="font-family:Source Sans Pro, sans-serif;font-size:16px;font-style:italic;line-height:150%;text-align:left;color:#212426;
border-top: 1px solid #bfbfbf; border-bottom: 1px solid #bfbfbf; padding: 32px 0px;">
{{ comment-content }}
</div>
</td>
</tr>
<tr>
<td align="center" vertical-align="middle"
style="font-size:0px;padding:10px 25px;word-break:break-word;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:separate;line-height:100%;">
<tr>
<td align="center" bgcolor="#6911d4" role="presentation"
style="border:none;border-radius:8px;cursor:auto;mso-padding-alt:10px 25px;background:#6911d4;"
valign="middle">
<a href="{{ comment-url }}"
style="display:inline-block;background:#6911d4;color:#FFFFFF;font-family:Source Sans Pro, sans-serif;font-size:16px;font-weight:normal;line-height:120%;margin:0;text-decoration:none;text-transform:none;padding:10px 25px;mso-padding-alt:0px;border-radius:8px;"
target="_blank"> GO TO THE COMMENT </a>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div
style="font-family:Source Sans Pro, sans-serif;font-size:16px;line-height:150%;text-align:left;color:#000000;">
The Penpot team.</div>
</td>
</tr>
</table>
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</tbody>
</table>
</div>
{% include "app/email/includes/footer.html" %}
</div>
</body>
</html>

View File

@@ -0,0 +1 @@
Mentioned in comment

View File

@@ -0,0 +1,13 @@
Hello {{name|abbreviate:25}}!
{{ source-user }} has mentioned you on a comment at "{{ comment-reference }}".
--
{{ comment-content }}
--
{{ comment-url }}
The Penpot team.

View File

@@ -0,0 +1,244 @@
<!doctype html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:o="urn:schemas-microsoft-com:office:office">
<head>
<title>
</title>
<!--[if !mso]><!-- -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!--<![endif]-->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type="text/css">
#outlook a {
padding: 0;
}
body {
margin: 0;
padding: 0;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
}
table,
td {
border-collapse: collapse;
mso-table-lspace: 0pt;
mso-table-rspace: 0pt;
}
img {
border: 0;
height: auto;
line-height: 100%;
outline: none;
text-decoration: none;
-ms-interpolation-mode: bicubic;
}
p {
display: block;
margin: 13px 0;
}
</style>
<!--[if mso]>
<xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
<o:PixelsPerInch>96</o:PixelsPerInch>
</o:OfficeDocumentSettings>
</xml>
<![endif]-->
<!--[if lte mso 11]>
<style type="text/css">
.mj-outlook-group-fix { width:100% !important; }
</style>
<![endif]-->
<!--[if !mso]><!-->
<link href="https://fonts.googleapis.com/css?family=Source%20Sans%20Pro" rel="stylesheet" type="text/css">
<style type="text/css">
@import url(https://fonts.googleapis.com/css?family=Source%20Sans%20Pro);
</style>
<!--<![endif]-->
<style type="text/css">
@media only screen and (min-width:480px) {
.mj-column-per-100 {
width: 100% !important;
max-width: 100%;
}
.mj-column-px-425 {
width: 425px !important;
max-width: 425px;
}
}
</style>
<style type="text/css">
@media only screen and (max-width:480px) {
table.mj-full-width-mobile {
width: 100% !important;
}
td.mj-full-width-mobile {
width: auto !important;
}
}
</style>
</head>
<body style="background-color:#E5E5E5;">
<div style="background-color:#E5E5E5;">
<!--[if mso | IE]>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
<tr>
<td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;">
<![endif]-->
<div style="margin:0px auto;max-width:600px;">
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
<tbody>
<tr>
<td style="direction:ltr;font-size:0px;padding:0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
<![endif]-->
<div class="mj-column-per-100 mj-outlook-group-fix"
style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;"
width="100%">
<tr>
<td align="left" style="font-size:0px;padding:16px;word-break:break-word;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:collapse;border-spacing:0px;">
<tbody>
<tr>
<td style="width:97px;">
<img height="32" src="{{ public-uri }}/images/email/uxbox-title.png"
style="border:0;display:block;outline:none;text-decoration:none;height:32px;width:100%;font-size:13px;"
width="97" />
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</table>
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</tbody>
</table>
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
<tr>
<td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;">
<![endif]-->
<div style="background:#FFFFFF;background-color:#FFFFFF;margin:0px auto;max-width:600px;">
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
style="background:#FFFFFF;background-color:#FFFFFF;width:100%;">
<tbody>
<tr>
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
<![endif]-->
<div class="mj-column-per-100 mj-outlook-group-fix"
style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;"
width="100%">
<tr>
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div
style="font-family:Source Sans Pro, sans-serif;font-size:24px;font-weight:600;line-height:150%;text-align:left;color:#000000;">
Hello {{name|abbreviate:25}}!</div>
</td>
</tr>
<tr>
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div
style="font-family:Source Sans Pro, sans-serif;font-size:16px;line-height:150%;text-align:left;color:#000000;">
<span style="font-weight:bold;">{{ source-user }}</span> has commented at "{{ comment-reference }}".</div>
</td>
</tr>
<tr>
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div style="font-family:Source Sans Pro, sans-serif;font-size:16px;font-style:italic;line-height:150%;text-align:left;color:#212426;
border-top: 1px solid #bfbfbf; border-bottom: 1px solid #bfbfbf; padding: 32px 0px;">
{{ comment-content }}
</div>
</td>
</tr>
<tr>
<td align="center" vertical-align="middle"
style="font-size:0px;padding:10px 25px;word-break:break-word;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:separate;line-height:100%;">
<tr>
<td align="center" bgcolor="#6911d4#31EFB8" role="presentation"
style="border:none;border-radius:8px;cursor:auto;mso-padding-alt:10px 25px;background:#6911d4;"
valign="middle">
<a href="{{ comment-url }}"
style="display:inline-block;background:#6911d4;color:#FFFFFF;font-family:Source Sans Pro, sans-serif;font-size:16px;font-weight:normal;line-height:120%;margin:0;text-decoration:none;text-transform:none;padding:10px 25px;mso-padding-alt:0px;border-radius:8px;"
target="_blank"> GO TO THE COMMENT </a>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div
style="font-family:Source Sans Pro, sans-serif;font-size:16px;line-height:150%;text-align:left;color:#000000;">
The Penpot team.</div>
</td>
</tr>
</table>
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</tbody>
</table>
</div>
{% include "app/email/includes/footer.html" %}
</div>
</body>
</html>

View File

@@ -0,0 +1 @@
New comment

View File

@@ -0,0 +1,13 @@
Hello {{name|abbreviate:25}}!
{{ source-user }} has commented at "{{ comment-reference }}".
--
{{ comment-content }}
--
{{ comment-url }}
The Penpot team.

View File

@@ -0,0 +1,244 @@
<!doctype html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:o="urn:schemas-microsoft-com:office:office">
<head>
<title>
</title>
<!--[if !mso]><!-- -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!--<![endif]-->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type="text/css">
#outlook a {
padding: 0;
}
body {
margin: 0;
padding: 0;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
}
table,
td {
border-collapse: collapse;
mso-table-lspace: 0pt;
mso-table-rspace: 0pt;
}
img {
border: 0;
height: auto;
line-height: 100%;
outline: none;
text-decoration: none;
-ms-interpolation-mode: bicubic;
}
p {
display: block;
margin: 13px 0;
}
</style>
<!--[if mso]>
<xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
<o:PixelsPerInch>96</o:PixelsPerInch>
</o:OfficeDocumentSettings>
</xml>
<![endif]-->
<!--[if lte mso 11]>
<style type="text/css">
.mj-outlook-group-fix { width:100% !important; }
</style>
<![endif]-->
<!--[if !mso]><!-->
<link href="https://fonts.googleapis.com/css?family=Source%20Sans%20Pro" rel="stylesheet" type="text/css">
<style type="text/css">
@import url(https://fonts.googleapis.com/css?family=Source%20Sans%20Pro);
</style>
<!--<![endif]-->
<style type="text/css">
@media only screen and (min-width:480px) {
.mj-column-per-100 {
width: 100% !important;
max-width: 100%;
}
.mj-column-px-425 {
width: 425px !important;
max-width: 425px;
}
}
</style>
<style type="text/css">
@media only screen and (max-width:480px) {
table.mj-full-width-mobile {
width: 100% !important;
}
td.mj-full-width-mobile {
width: auto !important;
}
}
</style>
</head>
<body style="background-color:#E5E5E5;">
<div style="background-color:#E5E5E5;">
<!--[if mso | IE]>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
<tr>
<td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;">
<![endif]-->
<div style="margin:0px auto;max-width:600px;">
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
<tbody>
<tr>
<td style="direction:ltr;font-size:0px;padding:0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
<![endif]-->
<div class="mj-column-per-100 mj-outlook-group-fix"
style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;"
width="100%">
<tr>
<td align="left" style="font-size:0px;padding:16px;word-break:break-word;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:collapse;border-spacing:0px;">
<tbody>
<tr>
<td style="width:97px;">
<img height="32" src="{{ public-uri }}/images/email/uxbox-title.png"
style="border:0;display:block;outline:none;text-decoration:none;height:32px;width:100%;font-size:13px;"
width="97" />
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</table>
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</tbody>
</table>
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
<tr>
<td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;">
<![endif]-->
<div style="background:#FFFFFF;background-color:#FFFFFF;margin:0px auto;max-width:600px;">
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
style="background:#FFFFFF;background-color:#FFFFFF;width:100%;">
<tbody>
<tr>
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
<![endif]-->
<div class="mj-column-per-100 mj-outlook-group-fix"
style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;"
width="100%">
<tr>
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div
style="font-family:Source Sans Pro, sans-serif;font-size:24px;font-weight:600;line-height:150%;text-align:left;color:#000000;">
Hello {{name|abbreviate:25}}!</div>
</td>
</tr>
<tr>
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div
style="font-family:Source Sans Pro, sans-serif;font-size:16px;line-height:150%;text-align:left;color:#000000;">
<span style="font-weight:bold;">{{ source-user }}</span> has created a comment in a thread you've been mentioned at "{{ comment-reference }}".</div>
</td>
</tr>
<tr>
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div style="font-family:Source Sans Pro, sans-serif;font-size:16px;font-style:italic;line-height:150%;text-align:left;color:#212426;
border-top: 1px solid #bfbfbf; border-bottom: 1px solid #bfbfbf; padding: 32px 0px;">
{{ comment-content }}
</div>
</td>
</tr>
<tr>
<td align="center" vertical-align="middle"
style="font-size:0px;padding:10px 25px;word-break:break-word;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:separate;line-height:100%;">
<tr>
<td align="center" bgcolor="#6911d4#31EFB8" role="presentation"
style="border:none;border-radius:8px;cursor:auto;mso-padding-alt:10px 25px;background:#6911d4;"
valign="middle">
<a href="{{ comment-url }}"
style="display:inline-block;background:#6911d4;color:#FFFFFF;font-family:Source Sans Pro, sans-serif;font-size:16px;font-weight:normal;line-height:120%;margin:0;text-decoration:none;text-transform:none;padding:10px 25px;mso-padding-alt:0px;border-radius:8px;"
target="_blank"> GO TO THE COMMENT </a>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div
style="font-family:Source Sans Pro, sans-serif;font-size:16px;line-height:150%;text-align:left;color:#000000;">
The Penpot team.</div>
</td>
</tr>
</table>
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</tbody>
</table>
</div>
{% include "app/email/includes/footer.html" %}
</div>
</body>
</html>

View File

@@ -0,0 +1 @@
New response in comment

View File

@@ -0,0 +1,13 @@
Hello {{name|abbreviate:25}}!
{{ source-user }} has created a comment in a thread you've been mentioned at "{{ comment-reference }}".
--
{{ comment-content }}
--
{{ comment-url }}
The Penpot team.

View File

@@ -195,12 +195,12 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:separate;line-height:100%;">
<tr>
<td align="center" bgcolor="#31EFB8" role="presentation"
style="border:none;border-radius:3px;cursor:auto;mso-padding-alt:10px 25px;background:#31EFB8;"
<td align="center" bgcolor="#6911d4" role="presentation"
style="border:none;border-radius:8px;cursor:auto;mso-padding-alt:10px 25px;background:#6911d4;"
valign="middle">
<a href="{{ public-uri }}/#/auth/verify-token?token={{token}}"
style="display:inline-block;background:#31EFB8;color:#1F1F1F;font-family:Source Sans Pro, sans-serif;font-size:16px;font-weight:normal;line-height:120%;margin:0;text-decoration:none;text-transform:none;padding:10px 25px;mso-padding-alt:0px;border-radius:3px;"
target="_blank"> Accept invite </a>
style="display:inline-block;background:#6911d4;color:#FFFFFF;font-family:Source Sans Pro, sans-serif;font-size:16px;font-weight:normal;line-height:120%;margin:0;text-decoration:none;text-transform:none;padding:10px 25px;mso-padding-alt:0px;border-radius:8px;"
target="_blank"> ACCEPT INVITE </a>
</td>
</tr>
</table>

View File

@@ -196,12 +196,12 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:separate;line-height:100%;">
<tr>
<td align="center" bgcolor="#31EFB8" role="presentation"
style="border:none;border-radius:3px;cursor:auto;mso-padding-alt:10px 25px;background:#31EFB8;"
<td align="center" bgcolor="#6911d4" role="presentation"
style="border:none;border-radius:8px;cursor:auto;mso-padding-alt:10px 25px;background:#6911d4;"
valign="middle">
<a href="{{ public-uri }}/#/dashboard/team/{{team-id}}/projects"
style="display:inline-block;background:#31EFB8;color:#1F1F1F;font-family:Source Sans Pro, sans-serif;font-size:16px;font-weight:normal;line-height:120%;margin:0;text-decoration:none;text-transform:none;padding:10px 25px;mso-padding-alt:0px;border-radius:3px;"
target="_blank"> Go to the Team </a>
style="display:inline-block;background:#6911d4;color:#FFFFFF;font-family:Source Sans Pro, sans-serif;font-size:16px;font-weight:normal;line-height:120%;margin:0;text-decoration:none;text-transform:none;padding:10px 25px;mso-padding-alt:0px;border-radius:8px;"
target="_blank"> GO TO THE TEAM </a>
</td>
</tr>
</table>

View File

@@ -196,12 +196,12 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:separate;line-height:100%;">
<tr>
<td align="center" bgcolor="#31EFB8" role="presentation"
style="border:none;border-radius:3px;cursor:auto;mso-padding-alt:10px 25px;background:#31EFB8;"
<td align="center" bgcolor="#6911d4" role="presentation"
style="border:none;border-radius:8px;cursor:auto;mso-padding-alt:10px 25px;background:#6911d4;"
valign="middle">
<a href="{{ public-uri }}/#/auth/recovery?token={{token}}"
style="display:inline-block;background:#31EFB8;color:#1F1F1F;font-family:Source Sans Pro, sans-serif;font-size:16px;font-weight:normal;line-height:120%;margin:0;text-decoration:none;text-transform:none;padding:10px 25px;mso-padding-alt:0px;border-radius:3px;"
target="_blank"> Reset password </a>
style="display:inline-block;background:#6911d4;color:#FFFFFF;font-family:Source Sans Pro, sans-serif;font-size:16px;font-weight:normal;line-height:120%;margin:0;text-decoration:none;text-transform:none;padding:10px 25px;mso-padding-alt:0px;border-radius:8px;"
target="_blank"> RESET PASSWORD </a>
</td>
</tr>
</table>

View File

@@ -196,12 +196,12 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:separate;line-height:100%;">
<tr>
<td align="center" bgcolor="#31EFB8" role="presentation"
style="border:none;border-radius:3px;cursor:auto;mso-padding-alt:10px 25px;background:#31EFB8;"
<td align="center" bgcolor="#6911d4" role="presentation"
style="border:none;border-radius:8px;cursor:auto;mso-padding-alt:10px 25px;background:#6911d4;"
valign="middle">
<a href="{{ public-uri }}/#/auth/verify-token?token={{token}}"
style="display:inline-block;background:#31EFB8;color:#1F1F1F;font-family:Source Sans Pro, sans-serif;font-size:16px;font-weight:normal;line-height:120%;margin:0;text-decoration:none;text-transform:none;padding:10px 25px;mso-padding-alt:0px;border-radius:3px;"
target="_blank"> Verify email </a>
style="display:inline-block;background:#6911d4;color:#FFFFFF;font-family:Source Sans Pro, sans-serif;font-size:16px;font-weight:normal;line-height:120%;margin:0;text-decoration:none;text-transform:none;padding:10px 25px;mso-padding-alt:0px;border-radius:8px;"
target="_blank"> VERIFY EMAIL </a>
</td>
</tr>
</table>

View File

@@ -204,12 +204,12 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:separate;line-height:100%">
<tr>
<td align="center" bgcolor="#31EFB8" role="presentation"
style="border:none;border-radius:3px;cursor:auto;mso-padding-alt:10px 25px;background:#31EFB8;"
<td align="center" bgcolor="#6911d4" role="presentation"
style="border:none;border-radius:8px;cursor:auto;mso-padding-alt:10px 25px;background:#6911d4;"
valign="middle">
<a href="{{ public-uri }}/#/view/{{file-id}}?page-id={{page-id}}&section=interactions&index=0&share=true"
style="display:inline-block;background:#31EFB8;color:#1F1F1F;font-family:Source Sans Pro, sans-serif;font-size:16px;font-weight:normal;line-height:120%;margin:0;text-decoration:none;text-transform:none;padding:10px 25px;mso-padding-alt:0px;border-radius:3px;"
target="_blank"> Send a View-Only link </a>
<a href="{{ public-uri }}/#/view?file-id={{file-id}}&page-id={{page-id}}&section=interactions&index=0&share=true"
style="display:inline-block;background:#6911d4;color:#FFFFFF;font-family:Source Sans Pro, sans-serif;font-size:16px;font-weight:normal;line-height:120%;margin:0;text-decoration:none;text-transform:none;padding:10px 25px;mso-padding-alt:0px;border-radius:8px;"
target="_blank"> SEND A VIEW-ONLY LINK </a>
</td>
</tr>
</table>
@@ -251,4 +251,4 @@
</div>
</body>
</html>
</html>

View File

@@ -6,7 +6,7 @@ Since this file is in your Penpot team, you can provide access by sending a view
To proceed, please click the link below to generate and send the view-only link:
{{ public-uri }}/#/view/{{file-id}}?page-id={{page-id}}&section=interactions&index=0&share=true
{{ public-uri }}/#/view?file-id={{file-id}}&page-id={{page-id}}&section=interactions&index=0&share=true

View File

@@ -227,12 +227,12 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:separate;line-height:100%">
<tr>
<td align="center" bgcolor="#31EFB8" role="presentation"
style="border:none;border-radius:3px;cursor:auto;mso-padding-alt:10px 25px;background:#31EFB8;"
<td align="center" bgcolor="#6911d4" role="presentation"
style="border:none;border-radius:8px;cursor:auto;mso-padding-alt:10px 25px;background:#6911d4;"
valign="middle">
<a href="{{ public-uri }}/#/view/{{file-id}}?page-id={{page-id}}&section=interactions&index=0&share=true"
style="display:inline-block;background:#31EFB8;color:#1F1F1F;font-family:Source Sans Pro, sans-serif;font-size:16px;font-weight:normal;line-height:120%;margin:0;text-decoration:none;text-transform:none;padding:10px 25px;mso-padding-alt:0px;border-radius:3px;"
target="_blank"> Send a View-Only link </a>
<a href="{{ public-uri }}/#/view?file-id={{file-id}}&page-id={{page-id}}&section=interactions&index=0&share=true"
style="display:inline-block;background:#6911d4;color:#FFFFFF;font-family:Source Sans Pro, sans-serif;font-size:16px;font-weight:normal;line-height:120%;margin:0;text-decoration:none;text-transform:none;padding:10px 25px;mso-padding-alt:0px;border-radius:8px;"
target="_blank"> SEND A VIEW-ONLY LINK </a>
</td>
</tr>
</table>
@@ -274,4 +274,4 @@
</div>
</body>
</html>
</html>

View File

@@ -19,7 +19,7 @@ Alternatively, you can create and share a view-only link to the file. This will
Click the link below to generate and send the link:
{{ public-uri }}/#/view/{{file-id}}?page-id={{page-id}}&section=interactions&index=0&share=true
{{ public-uri }}/#/view?file-id={{file-id}}&page-id={{page-id}}&section=interactions&index=0&share=true

View File

@@ -211,12 +211,12 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:separate;line-height:100%">
<tr>
<td align="center" bgcolor="#31EFB8" role="presentation"
style="border:none;border-radius:3px;cursor:auto;mso-padding-alt:10px 25px;background:#31EFB8;"
<td align="center" bgcolor="#6911d4" role="presentation"
style="border:none;border-radius:8px;cursor:auto;mso-padding-alt:10px 25px;background:#6911d4;"
valign="middle">
<a href="{{ public-uri }}/#/dashboard/team/{{team-id}}/members?invite-email={{requested-by-email|urlescape }}"
style="display:inline-block;background:#31EFB8;color:#1F1F1F;font-family:Source Sans Pro, sans-serif;font-size:16px;font-weight:normal;line-height:120%;margin:0;text-decoration:none;text-transform:none;padding:10px 25px;mso-padding-alt:0px;border-radius:3px;"
target="_blank"> Give access to “{{team-name|abbreviate:25}}” Team </a>
<a href="{{ public-uri }}/#/dashboard/members?team-id={{team-id}}&invite-email={{requested-by-email|urlescape }}"
style="display:inline-block;background:#6911d4;color:#FFFFFF;font-family:Source Sans Pro, sans-serif;font-size:16px;font-weight:normal;line-height:120%;margin:0;text-decoration:none;text-transform:none;padding:10px 25px;mso-padding-alt:0px;border-radius:8px;"
target="_blank"> GIVE ACCESS TO “{{team-name|abbreviate:25}}” TEAM </a>
</td>
</tr>
</table>
@@ -244,12 +244,12 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:separate;line-height:100%">
<tr>
<td align="center" bgcolor="#31EFB8" role="presentation"
style="border:none;border-radius:3px;cursor:auto;mso-padding-alt:10px 25px;background:#31EFB8;"
<td align="center" bgcolor="#6911d4" role="presentation"
style="border:none;border-radius:8px;cursor:auto;mso-padding-alt:10px 25px;background:#6911d4;"
valign="middle">
<a href="{{ public-uri }}/#/view/{{file-id}}?page-id={{page-id}}&section=interactions&index=0&share=true"
style="display:inline-block;background:#31EFB8;color:#1F1F1F;font-family:Source Sans Pro, sans-serif;font-size:16px;font-weight:normal;line-height:120%;margin:0;text-decoration:none;text-transform:none;padding:10px 25px;mso-padding-alt:0px;border-radius:3px;"
target="_blank"> Send a View-Only link </a>
<a href="{{ public-uri }}/#/view?file-id={{file-id}}&page-id={{page-id}}&section=interactions&index=0&share=true"
style="display:inline-block;background:#6911d4;color:#FFFFFF;font-family:Source Sans Pro, sans-serif;font-size:16px;font-weight:normal;line-height:120%;margin:0;text-decoration:none;text-transform:none;padding:10px 25px;mso-padding-alt:0px;border-radius:8px;"
target="_blank"> SEND A VIEW-ONLY LINK </a>
</td>
</tr>
</table>
@@ -292,4 +292,4 @@
</div>
</body>
</html>
</html>

View File

@@ -13,7 +13,7 @@ This will automatically include {{requested-by|abbreviate:25}} in the team, so t
Click the link below to provide team access:
{{ public-uri }}/#/dashboard/team/{{team-id}}/members?invite-email={{requested-by-email|urlescape}}
{{ public-uri }}/#/dashboard/members?team-id={{team-id}}&invite-email={{requested-by-email|urlescape}}
@@ -23,8 +23,7 @@ Alternatively, you can create and share a view-only link to the file. This will
Click the link below to generate and send the link:
{{ public-uri }}/#/view/{{file-id}}?page-id={{page-id}}&section=interactions&index=0&share=true
{{ public-uri }}/#/view?file-id={{file-id}}&page-id={{page-id}}&section=interactions&index=0&share=true
If you do not wish to grant access at this time, you can simply disregard this email.

View File

@@ -202,12 +202,12 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-collapse:separate;line-height:100%;">
<tr>
<td align="center" bgcolor="#31EFB8" role="presentation"
style="border:none;border-radius:3px;cursor:auto;mso-padding-alt:10px 25px;background:#31EFB8;"
<td align="center" bgcolor="#6911d4" role="presentation"
style="border:none;border-radius:8px;cursor:auto;mso-padding-alt:10px 25px;background:#6911d4;"
valign="middle">
<a href="{{ public-uri }}/#/dashboard/team/{{team-id}}/members?invite-email={{requested-by-email|urlescape}}"
style="display:inline-block;background:#31EFB8;color:#1F1F1F;font-family:Source Sans Pro, sans-serif;font-size:16px;font-weight:normal;line-height:120%;margin:0;text-decoration:none;text-transform:none;padding:10px 25px;mso-padding-alt:0px;border-radius:3px;"
target="_blank"> Give access to “{{team-name|abbreviate:25}}” </a>
<a href="{{ public-uri }}/#/dashboard/members?team-id={{team-id}}&invite-email={{requested-by-email|urlescape}}"
style="display:inline-block;background:#6911d4;color:#FFFFFF;font-family:Source Sans Pro, sans-serif;font-size:16px;font-weight:normal;line-height:120%;margin:0;text-decoration:none;text-transform:none;padding:10px 25px;mso-padding-alt:0px;border-radius:8px;"
target="_blank"> GIVE ACCESS TO “{{team-name|abbreviate:25}}” TEAM </a>
</td>
</tr>
</table>
@@ -249,4 +249,4 @@
</div>
</body>
</html>
</html>

View File

@@ -4,7 +4,7 @@ Hello!
To provide access, please click the link below:
{{ public-uri }}/#/dashboard/team/{{team-id}}/members?invite-email={{requested-by-email|urlescape}}
{{ public-uri }}/#/dashboard/members?team-id={{team-id}}&invite-email={{requested-by-email|urlescape}}
If you do not wish to grant access at this time, you can simply disregard this email.

View File

@@ -1,4 +1,7 @@
[{:id "wireframing-kit"
[{:id "tokens-starter-kit"
:name "Design tokens starter kit"
:file-uri "https://github.com/penpot/penpot-files/raw/refs/heads/main/Tokens%20starter%20kit.penpot"},
{:id "wireframing-kit"
:name "Wireframe library"
:file-uri "https://github.com/penpot/penpot-files/raw/refs/heads/main/Wireframing%20kit%20v1.1.penpot"}
{:id "prototype-examples"

View File

@@ -114,37 +114,13 @@ Debug Main Page
</fieldset>
<fieldset>
<legend>Import binfile:</legend>
<desc>Import penpot file in binary
format. If <strong>overwrite</strong> is checked, all files will
be overwritten using the same ids found in the file instead of
generating a new ones.</desc>
<desc>Import penpot file in binary format.</desc>
<form method="post" enctype="multipart/form-data" action="/dbg/file/import">
<div class="row">
<input type="file" name="file" value="" />
</div>
<div class="row">
<label>Overwrite?</label>
<input type="checkbox" name="overwrite" />
<br />
<small>
Instead of creating a new file with all relations remapped,
reuses all ids and updates/overwrites the objects that are
already exists on the database.
<strong>Warning, this operation should be used with caution.</strong>
</small>
</div>
<div class="row">
<label>Migrate?</label>
<input type="checkbox" name="migrate" />
<br />
<small>
Applies the file migrations on the importation process.
</small>
</div>
<div class="row">
<input type="submit" name="upload" value="Upload" />
</div>
@@ -175,6 +151,78 @@ Debug Main Page
</div>
<div class="row">
<input type="submit" value="Submit" />
</div>
</form>
</fieldset>
</section>
<section class="widget">
<h2>Feature Flags</h2>
<fieldset>
<legend>Enable</legend>
<desc>Add a feature flag to a team</desc>
<form method="post" action="/dbg/actions/add-team-feature">
<div class="row">
<input type="text" style="width:300px" name="team-id" placeholder="team-id" />
</div>
<div class="row">
<input type="text" style="width:100px" name="feature" placeholder="feature" value="" />
</div>
<div class="row">
<label for="check-feature">Skip feature check</label>
<input id="check-feature" type="checkbox" name="skip-check" />
<br />
<small>
Do not check if the feature is supported
</small>
</div>
<div class="row">
<label for="force-version">Are you sure?</label>
<input id="force-version" type="checkbox" name="force" />
<br />
<small>
This is a just a security double check for prevent non intentional submits.
</small>
</div>
<div class="row">
<input type="submit" value="Submit" />
</div>
</form>
</fieldset>
<fieldset>
<legend>Disable</legend>
<desc>Remove a feature flag from a team</desc>
<form method="post" action="/dbg/actions/remove-team-feature">
<div class="row">
<input type="text" style="width:300px" name="team-id" placeholder="team-id" />
</div>
<div class="row">
<input type="text" style="width:100px" name="feature" placeholder="feature" value="" />
</div>
<div class="row">
<label for="check-feature">Skip feature check</label>
<input id="check-feature" type="checkbox" name="skip-check" />
<br />
<small>
Do not check if the feature is supported
</small>
</div>
<div class="row">
<label for="force-version">Are you sure?</label>
<input id="force-version" type="checkbox" name="force" />
<br />
<small>
This is a just a security double check for prevent non intentional submits.
</small>
</div>
<div class="row">
<input type="submit" value="Submit" />
</div>

View File

@@ -35,40 +35,35 @@ def get_prepl_conninfo():
return host, port
def send_eval(expr):
def send(data):
host, port = get_prepl_conninfo()
with socket.create_connection((host, port)) as s:
f = s.makefile(mode="rw")
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((host, port))
s.send(expr.encode("utf-8"))
s.send(b":repl/quit\n\n")
json.dump(data, f)
f.write("\n")
f.flush()
with s.makefile() as f:
while True:
line = f.readline()
result = json.loads(line)
tag = result.get("tag", None)
if tag == "ret":
return result.get("val", None), result.get("exception", None)
elif tag == "out":
print(result.get("val"), end="")
else:
raise RuntimeError("unexpected response from PREPL")
while True:
line = f.readline()
result = json.loads(line)
tag = result.get("tag", None)
def encode(val):
return json.dumps(json.dumps(val))
if tag == "ret":
return result.get("val", None), result.get("err", None)
elif tag == "out":
print(result.get("val"), end="")
else:
raise RuntimeError("unexpected response from PREPL")
def print_error(res):
for error in res["via"]:
print("ERR:", error["message"])
break
def print_error(error):
print("ERR:", error["hint"])
def run_cmd(params):
try:
expr = "(app.srepl.cli/exec {})".format(encode(params))
res, failed = send_eval(expr)
if failed:
print_error(res)
res, err = send(params)
if err:
print_error(err)
sys.exit(-1)
return res
@@ -96,7 +91,7 @@ def update_profile(email, fullname, password, is_active):
"email": email,
"fullname": fullname,
"password": password,
"is_active": is_active
"isActive": is_active
}
}
@@ -138,7 +133,7 @@ def derive_password(password):
params = {
"cmd": "derive-password",
"params": {
"password": password,
"password": password
}
}

View File

@@ -30,7 +30,9 @@ export PENPOT_FLAGS="\
enable-access-tokens \
enable-tiered-file-data-storage \
enable-file-validation \
enable-file-schema-validation";
enable-file-schema-validation \
enable-subscriptions \
enable-subscriptions-old";
# Default deletion delay for devenv
export PENPOT_DELETION_DELAY="24h"
@@ -70,20 +72,21 @@ export PENPOT_OBJECTS_STORAGE_S3_ENDPOINT=http://minio:9000
export PENPOT_OBJECTS_STORAGE_S3_BUCKET=penpot
export PENPOT_OBJECTS_STORAGE_FS_DIRECTORY="assets"
export OPTIONS="
-A:jmx-remote -A:dev \
-J-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager \
-J-Djdk.attach.allowAttachSelf \
-J-Dpolyglot.engine.WarnInterpreterOnly=false \
-J-Dlog4j2.configurationFile=log4j2-devenv-repl.xml \
-J-XX:+EnableDynamicAgentLoading \
-J-XX:-OmitStackTraceInFastThrow \
-J-XX:+UnlockDiagnosticVMOptions \
-J-XX:+DebugNonSafepoints \
-J-Djdk.tracePinnedThreads=full"
export JAVA_OPTS="\
-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager \
-Djdk.attach.allowAttachSelf \
-Dlog4j2.configurationFile=log4j2-devenv-repl.xml \
-Djdk.tracePinnedThreads=full \
-Dim4java.useV7=true \
-XX:+EnableDynamicAgentLoading \
-XX:-OmitStackTraceInFastThrow \
-XX:+UnlockDiagnosticVMOptions \
-XX:+DebugNonSafepoints \
--sun-misc-unsafe-memory-access=allow \
--enable-preview \
--enable-native-access=ALL-UNNAMED";
# Enable preview
export OPTIONS="$OPTIONS -J--enable-preview"
export OPTIONS="-A:jmx-remote -A:dev"
# Setup HEAP
# export OPTIONS="$OPTIONS -J-Xms50m -J-Xmx1024m"
@@ -104,9 +107,6 @@ export OPTIONS="$OPTIONS -J--enable-preview"
# Setup GC
# export OPTIONS="$OPTIONS -J-XX:+UseZGC"
# Enable ImageMagick v7.x support
# export OPTIONS="-J-Dim4java.useV7=true $OPTIONS";
export OPTIONS_EVAL="nil"
# export OPTIONS_EVAL="(set! *warn-on-reflection* true)"

44
backend/scripts/run Executable file
View File

@@ -0,0 +1,44 @@
#!/usr/bin/env bash
export PENPOT_SECRET_KEY=super-secret-devenv-key
export PENPOT_HOST=devenv
export PENPOT_FLAGS="\
$PENPOT_FLAGS \
enable-backend-asserts \
enable-feature-fdata-pointer-map \
enable-feature-fdata-objects-map \
enable-file-snapshot \
enable-tiered-file-data-storage";
export JAVA_OPTS="
-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager \
-Djdk.attach.allowAttachSelf \
-Dlog4j2.configurationFile=log4j2-devenv.xml \
-XX:+EnableDynamicAgentLoading \
-XX:-OmitStackTraceInFastThrow \
-XX:+UnlockDiagnosticVMOptions \
-XX:+DebugNonSafepoints";
export CLOJURE_OPTIONS="-A:dev"
# Default deletion delay for devenv
export PENPOT_DELETION_DELAY="24h"
# Setup default upload media file size to 100MiB
export PENPOT_MEDIA_MAX_FILE_SIZE=104857600
# Setup default multipart upload size to 300MiB
export PENPOT_HTTP_SERVER_MAX_MULTIPART_BODY_SIZE=314572800
export AWS_ACCESS_KEY_ID=penpot-devenv
export AWS_SECRET_ACCESS_KEY=penpot-devenv
export PENPOT_OBJECTS_STORAGE_BACKEND=s3
export PENPOT_OBJECTS_STORAGE_S3_ENDPOINT=http://minio:9000
export PENPOT_OBJECTS_STORAGE_S3_BUCKET=penpot
entrypoint=${1:-app.main};
shift 1;
set -ex
clojure $CLOJURE_OPTIONS -A:dev -M -m $entrypoint "$@";

View File

@@ -18,9 +18,9 @@ if [ -f ./environ ]; then
source ./environ
fi
export JVM_OPTS="-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager -Dlog4j2.configurationFile=log4j2.xml -XX:-OmitStackTraceInFastThrow -Dpolyglot.engine.WarnInterpreterOnly=false --enable-preview $JVM_OPTS"
export JAVA_OPTS="-Dim4java.useV7=true -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager -Dlog4j2.configurationFile=log4j2.xml -XX:-OmitStackTraceInFastThrow --sun-misc-unsafe-memory-access=allow --enable-native-access=ALL-UNNAMED --enable-preview $JVM_OPTS $JAVA_OPTS"
ENTRYPOINT=${1:-app.main};
set -ex
exec $JAVA_CMD $JVM_OPTS -jar penpot.jar -m $ENTRYPOINT
exec $JAVA_CMD $JAVA_OPTS -jar penpot.jar -m $ENTRYPOINT

View File

@@ -23,18 +23,9 @@ export PENPOT_FLAGS="\
enable-access-tokens \
enable-tiered-file-data-storage \
enable-file-validation \
enable-file-schema-validation";
export OPTIONS="
-A:jmx-remote -A:dev \
-J-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager \
-J-Djdk.attach.allowAttachSelf \
-J-Dpolyglot.engine.WarnInterpreterOnly=false \
-J-Dlog4j2.configurationFile=log4j2-devenv.xml \
-J-XX:+EnableDynamicAgentLoading \
-J-XX:-OmitStackTraceInFastThrow \
-J-XX:+UnlockDiagnosticVMOptions \
-J-XX:+DebugNonSafepoints"
enable-file-schema-validation \
enable-subscriptions \
enable-subscriptions-old ";
# Default deletion delay for devenv
export PENPOT_DELETION_DELAY="24h"
@@ -45,9 +36,6 @@ export PENPOT_MEDIA_MAX_FILE_SIZE=104857600
# Setup default multipart upload size to 300MiB
export PENPOT_HTTP_SERVER_MAX_MULTIPART_BODY_SIZE=314572800
# Enable ImageMagick v7.x support
# export OPTIONS="-J-Dim4java.useV7=true $OPTIONS";
# Initialize MINIO config
mc alias set penpot-s3/ http://minio:9000 minioadmin minioadmin -q
mc admin user add penpot-s3 penpot-devenv penpot-devenv -q
@@ -65,6 +53,18 @@ export PENPOT_OBJECTS_STORAGE_S3_BUCKET=penpot
entrypoint=${1:-app.main};
set -ex
export JAVA_OPTS="\
-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager \
-Djdk.attach.allowAttachSelf \
-Dlog4j2.configurationFile=log4j2-devenv.xml \
-Djdk.tracePinnedThreads=full \
-Dim4java.useV7=true \
-XX:-OmitStackTraceInFastThrow \
--sun-misc-unsafe-memory-access=allow \
--enable-preview \
--enable-native-access=ALL-UNNAMED";
clojure $OPTIONS -A:dev -M -m $entrypoint;
export OPTIONS="-A:jmx-remote -A:dev"
set -ex
clojure $OPTIONS -M -m $entrypoint;

View File

@@ -0,0 +1,131 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC
(ns app.binfile.cleaner
"A collection of helpers for perform cleaning of artifacts; mainly
for recently imported shapes."
(:require
[app.common.data :as d]
[app.common.types.shape :as cts]
[app.common.uuid :as uuid]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PRE DECODE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn- pre-clean-bool-content
[shape]
(if-let [content (get shape :bool-content)]
(-> shape
(assoc :content content)
(dissoc :bool-content))
shape))
(defn- pre-clean-shadow-color
[shape]
(d/update-when shape :shadow
(fn [shadows]
(mapv (fn [shadow]
(update shadow :color
(fn [color]
(let [ref-id (get color :id)
ref-file (get color :file-id)]
(-> (d/without-qualified color)
(select-keys [:opacity :color :gradient :image :ref-id :ref-file])
(cond-> ref-id
(assoc :ref-id ref-id))
(cond-> ref-file
(assoc :ref-file ref-file)))))))
shadows))))
(defn clean-shape-pre-decode
"Applies a pre-decode phase migration to the shape"
[shape]
(cond-> shape
(= "bool" (:type shape))
(pre-clean-bool-content)
(contains? shape :shadow)
(pre-clean-shadow-color)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; POST DECODE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn- fix-shape-shadow-color
"Some shapes can come with invalid `id` property on shadow colors
caused by incorrect uuid parsing bug that should be already fixed;
this function removes the invalid id from the data structure."
[shape]
(let [fix-color
(fn [{:keys [id] :as color}]
(if (uuid? id)
color
(if (and (string? id)
(re-matches uuid/regex id))
(assoc color :id (uuid/uuid id))
(dissoc color :id))))
fix-shadow
(fn [shadow]
(d/update-when shadow :color fix-color))
xform
(map fix-shadow)]
(d/update-when shape :shadow
(fn [shadows]
(into [] xform shadows)))))
(defn- fix-root-shape
"Ensure all root objects are well formed shapes"
[shape]
(if (= (:id shape) uuid/zero)
(-> shape
(assoc :parent-id uuid/zero)
(assoc :frame-id uuid/zero)
;; We explicitly dissoc them and let the shape-setup
;; to regenerate it with valid values.
(dissoc :selrect)
(dissoc :points)
(cts/setup-shape))
shape))
(defn- fix-legacy-flex-dir
"This operation is only relevant to old data and it is fixed just
for convenience."
[shape]
(d/update-when shape :layout-flex-dir
(fn [dir]
(case dir
:reverse-row :row-reverse
:reverse-column :column-reverse
dir))))
(defn clean-shape-post-decode
"A shape procesor that expected to be executed after schema decoding
process but before validation."
[shape]
(-> shape
(fix-shape-shadow-color)
(fix-root-shape)
(fix-legacy-flex-dir)))
(defn- fix-container
[container]
(-> container
;; Remove possible `nil` keys on objects
(d/update-when :objects dissoc nil)
(d/update-when :objects d/update-vals clean-shape-post-decode)))
(defn clean-file
[file & {:as _opts}]
(update file :data
(fn [data]
(-> data
(d/update-when :pages-index d/update-vals fix-container)
(d/update-when :components d/update-vals fix-container)
(d/without-nils)))))

View File

@@ -9,9 +9,9 @@
binfile format implementations and management rpc methods."
(:require
[app.common.data :as d]
[app.common.data.macros :as dm]
[app.common.exceptions :as ex]
[app.common.features :as cfeat]
[app.common.files.helpers :as cfh]
[app.common.files.migrations :as fmg]
[app.common.files.validate :as fval]
[app.common.logging :as l]
@@ -20,17 +20,19 @@
[app.config :as cf]
[app.db :as db]
[app.db.sql :as sql]
[app.features.components-v2 :as feat.compv2]
[app.features.fdata :as feat.fdata]
[app.features.file-migrations :as feat.fmigr]
[app.loggers.audit :as-alias audit]
[app.loggers.webhooks :as-alias webhooks]
[app.storage :as sto]
[app.util.blob :as blob]
[app.util.pointer-map :as pmap]
[app.util.time :as dt]
[app.worker :as-alias wrk]
[clojure.set :as set]
[clojure.walk :as walk]
[cuerdas.core :as str]))
[cuerdas.core :as str]
[datoteka.fs :as fs]
[datoteka.io :as io]))
(set! *warn-on-reflection* true)
@@ -51,6 +53,31 @@
(* 1024 1024 100))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(declare get-resolved-file-libraries)
(def file-attrs
#{:id
:name
:migrations
:features
:project-id
:is-shared
:version
:data})
(defn parse-file-format
[template]
(assert (fs/path? template) "expected InputStream for `template`")
(with-open [^java.lang.AutoCloseable input (io/input-stream template)]
(let [buffer (byte-array 4)]
(io/read-to-buffer input buffer)
(if (and (= (aget buffer 0) 80)
(= (aget buffer 1) 75)
(= (aget buffer 2) 3)
(= (aget buffer 3) 4))
:binfile-v3
:binfile-v1))))
(def xf-map-id
(map :id))
@@ -117,22 +144,43 @@
(reduce #(index-object %1 %2 attr) index coll)))
(defn decode-row
"A generic decode row helper"
[{:keys [data features] :as row}]
(cond-> row
features (assoc :features (db/decode-pgarray features #{}))
data (assoc :data (blob/decode data))))
[{:keys [data changes features] :as row}]
(when row
(cond-> row
features (assoc :features (db/decode-pgarray features #{}))
changes (assoc :changes (blob/decode changes))
data (assoc :data (blob/decode data)))))
(defn decode-file
"A general purpose file decoding function that resolves all external
pointers, run migrations and return plain vanilla file map"
[cfg {:keys [id] :as file}]
(binding [pmap/*load-fn* (partial feat.fdata/load-pointer cfg id)]
(let [file (->> file
(feat.fmigr/resolve-applied-migrations cfg)
(feat.fdata/resolve-file-data cfg))
libs (delay (get-resolved-file-libraries cfg file))]
(-> file
(update :features db/decode-pgarray #{})
(update :data blob/decode)
(update :data feat.fdata/process-pointers deref)
(update :data feat.fdata/process-objects (partial into {}))
(update :data assoc :id id)
(fmg/migrate-file libs)))))
(defn get-file
[cfg file-id]
"Get file, resolve all features and apply migrations.
Usefull when you have plan to apply massive or not cirurgical
operations on file, because it removes the ovehead of lazy fetching
and decoding."
[cfg file-id & {:as opts}]
(db/run! cfg (fn [{:keys [::db/conn] :as cfg}]
(binding [pmap/*load-fn* (partial feat.fdata/load-pointer cfg file-id)]
(when-let [file (db/get* conn :file {:id file-id}
{::db/remove-deleted false})]
(-> file
(decode-row)
(update :data feat.fdata/process-pointers deref)
(update :data feat.fdata/process-objects (partial into {}))))))))
(some->> (db/get* conn :file {:id file-id}
(assoc opts ::db/remove-deleted false))
(decode-file cfg)))))
(defn clean-file-features
[file]
@@ -173,10 +221,8 @@
"Given a set of file-id's, return all matching relations with the libraries"
[cfg ids]
(dm/assert!
"expected a set of uuids"
(and (set? ids)
(every? uuid? ids)))
(assert (set? ids) "expected a set of uuids")
(assert (every? uuid? ids) "expected a set of uuids")
(db/run! cfg (fn [{:keys [::db/conn]}]
(let [ids (db/create-array conn "uuid" ids)
@@ -225,49 +271,70 @@
:data nil}
{::sql/columns [:media-id :file-id :revn]}))
(def ^:private sql:get-missing-media-references
"SELECT fmo.*
FROM file_media_object AS fmo
WHERE fmo.id = ANY(?::uuid[])
AND file_id != ?")
(def ^:private
xform:collect-media-id
(comp
(map :objects)
(mapcat vals)
(mapcat (fn [obj]
;; NOTE: because of some bug, we ended with
;; many shape types having the ability to
;; have fill-image attribute (which initially
;; designed for :path shapes).
(sequence
(keep :id)
(concat [(:fill-image obj)
(:metadata obj)]
(map :fill-image (:fills obj))
(map :stroke-image (:strokes obj))
(->> (:content obj)
(tree-seq map? :children)
(mapcat :fills)
(map :fill-image))))))))
(defn update-media-references!
"Given a file and a coll of media-refs, check if all provided
references are correct or fix them in-place"
[{:keys [::db/conn] :as cfg} {file-id :id :as file} media-refs]
(let [missing-index
(reduce (fn [result {:keys [id] :as fmo}]
(assoc result id
(-> fmo
(assoc :id (uuid/next))
(assoc :file-id file-id)
(dissoc :created-at)
(dissoc :deleted-at))))
{}
(db/exec! conn [sql:get-missing-media-references
(->> (into #{} xf-map-id media-refs)
(db/create-array conn "uuid"))
file-id]))
(defn collect-used-media
"Given a fdata (file data), returns all media references."
[data]
(-> #{}
(into xform:collect-media-id (vals (:pages-index data)))
(into xform:collect-media-id (vals (:components data)))
(into (keys (:media data)))))
lookup-index
(fn [id]
(if-let [mobj (get missing-index id)]
(do
(l/trc :hint "lookup index"
:file-id (str file-id)
:snap-id (str (:snapshot-id file))
:id (str id)
:result (str (get mobj :id)))
(get mobj :id))
id))
update-shapes
(fn [data {:keys [page-id shape-id]}]
(d/update-in-when data [:pages-index page-id :objects shape-id] cfh/relink-refs lookup-index))
file
(update file :data #(reduce update-shapes % media-refs))]
(doseq [[old-id item] missing-index]
(l/dbg :hint "create missing references"
:file-id (str file-id)
:snap-id (str (:snapshot-id file))
:old-id (str old-id)
:id (str (:id item)))
(db/insert! conn :file-media-object item
{::db/return-keys false}))
file))
(def sql:get-file-media
"SELECT * FROM file_media_object WHERE id = ANY(?)")
(defn get-file-media
[cfg {:keys [data id] :as file}]
[cfg {:keys [data] :as file}]
(db/run! cfg (fn [{:keys [::db/conn]}]
(let [ids (collect-used-media data)
ids (db/create-array conn "uuid" ids)
sql (str "SELECT * FROM file_media_object WHERE id = ANY(?)")]
;; We assoc the file-id again to the file-media-object row
;; because there are cases that used objects refer to other
;; files and we need to ensure in the exportation process that
;; all ids matches
(->> (db/exec! conn [sql ids])
(mapv #(assoc % :file-id id)))))))
(let [used (cfh/collect-used-media data)
used (db/create-array conn "uuid" used)]
(db/exec! conn [sql:get-file-media used])))))
(def ^:private sql:get-team-files-ids
"SELECT f.id FROM file AS f
@@ -311,48 +378,7 @@
replace the old :component-file reference with the new
ones, using the provided file-index."
[data]
(letfn [(process-map-form [form]
(cond-> form
;; Relink image shapes
(and (map? (:metadata form))
(= :image (:type form)))
(update-in [:metadata :id] lookup-index)
;; Relink paths with fill image
(map? (:fill-image form))
(update-in [:fill-image :id] lookup-index)
;; This covers old shapes and the new :fills.
(uuid? (:fill-color-ref-file form))
(update :fill-color-ref-file lookup-index)
;; This covers the old shapes and the new :strokes
(uuid? (:stroke-color-ref-file form))
(update :stroke-color-ref-file lookup-index)
;; This covers all text shapes that have typography referenced
(uuid? (:typography-ref-file form))
(update :typography-ref-file lookup-index)
;; This covers the component instance links
(uuid? (:component-file form))
(update :component-file lookup-index)
;; This covers the shadows and grids (they have directly
;; the :file-id prop)
(uuid? (:file-id form))
(update :file-id lookup-index)))
(process-form [form]
(if (map? form)
(try
(process-map-form form)
(catch Throwable cause
(l/warn :hint "failed form" :form (pr-str form) ::l/sync? true)
(throw cause)))
form))]
(walk/postwalk process-form data)))
(cfh/relink-refs data lookup-index))
(defn- relink-media
"A function responsible of process the :media attr of file data and
@@ -383,8 +409,9 @@
[cfg data file-id]
(let [library-ids (get-libraries cfg [file-id])]
(reduce (fn [data library-id]
(let [library (get-file cfg library-id)]
(ctf/absorb-assets data (:data library))))
(if-let [library (get-file cfg library-id)]
(ctf/absorb-assets data (:data library))
data))
data
library-ids)))
@@ -394,130 +421,161 @@
(db/exec-one! conn ["SET LOCAL idle_in_transaction_session_timeout = 0"])
(db/exec-one! conn ["SET CONSTRAINTS ALL DEFERRED"])))
(defn- fix-version
[file]
(let [file (fmg/fix-version file)]
;; FIXME: We're temporarily activating all migrations because a
;; problem in the environments messed up with the version numbers
;; When this problem is fixed delete the following line
(if (> (:version file) 22)
(assoc file :version 22)
file)))
(defn process-file
[{:keys [id] :as file}]
(-> file
(fix-version)
(update :data (fn [fdata]
(-> fdata
(assoc :id id)
(dissoc :recent-colors))))
(fmg/migrate-file)
(update :data (fn [fdata]
(-> fdata
(update :pages-index relink-shapes)
(update :components relink-shapes)
(update :media relink-media)
(update :colors relink-colors)
(d/without-nils))))))
[cfg {:keys [id] :as file}]
(let [libs (delay (get-resolved-file-libraries cfg file))]
(-> file
(update :data (fn [fdata]
(-> fdata
(assoc :id id)
(dissoc :recent-colors))))
(update :data (fn [fdata]
(-> fdata
(update :pages-index relink-shapes)
(update :components relink-shapes)
(update :media relink-media)
(update :colors relink-colors)
(d/without-nils))))
(fmg/migrate-file libs)
(defn- upsert-file!
[conn file]
(let [sql (str "INSERT INTO file (id, project_id, name, revn, version, is_shared, data, created_at, modified_at) "
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) "
"ON CONFLICT (id) DO UPDATE SET data=?, version=?")]
(db/exec-one! conn [sql
(:id file)
(:project-id file)
(:name file)
(:revn file)
(:version file)
(:is-shared file)
(:data file)
(:created-at file)
(:modified-at file)
(:data file)
(:version file)])))
;; NOTE: this is necessary because when we just creating a new
;; file from imported artifact or cloned file there are no
;; migrations registered on the database, so we need to persist
;; all of them, not only the applied
(vary-meta dissoc ::fmg/migrated))))
(defn persist-file!
"Applies all the final validations and perist the file."
[{:keys [::db/conn ::timestamp] :as cfg} {:keys [id] :as file}]
(defn encode-file
[{:keys [::db/conn] :as cfg} {:keys [id features] :as file}]
(let [file (if (contains? features "fdata/objects-map")
(feat.fdata/enable-objects-map file)
file)
(dm/assert!
"expected valid timestamp"
(dt/instant? timestamp))
file (if (contains? features "fdata/pointer-map")
(binding [pmap/*tracked* (pmap/create-tracked)]
(let [file (feat.fdata/enable-pointer-map file)]
(feat.fdata/persist-pointers! cfg id)
file))
file)]
(let [file (-> file
(assoc :created-at timestamp)
(assoc :modified-at timestamp)
(assoc :ignore-sync-until (dt/plus timestamp (dt/duration {:seconds 5})))
(update :features
(fn [features]
(let [features (cfeat/check-supported-features! features)]
(-> (::features cfg #{})
(set/union features)
;; We never want to store
;; frontend-only features on file
(set/difference cfeat/frontend-only-features))))))
(-> file
(update :features db/encode-pgarray conn "text")
(update :data blob/encode))))
(defn get-params-from-file
[file]
(let [params {:has-media-trimmed (:has-media-trimmed file)
:ignore-sync-until (:ignore-sync-until file)
:project-id (:project-id file)
:features (:features file)
:name (:name file)
:is-shared (:is-shared file)
:version (:version file)
:data (:data file)
:id (:id file)
:deleted-at (:deleted-at file)
:created-at (:created-at file)
:modified-at (:modified-at file)
:revn (:revn file)
:vern (:vern file)}]
(-> (d/without-nils params)
(assoc :data-backend nil)
(assoc :data-ref-id nil))))
(defn insert-file!
"Insert a new file into the database table"
[{:keys [::db/conn] :as cfg} file & {:as opts}]
(feat.fmigr/upsert-migrations! conn file)
(let [params (-> (encode-file cfg file)
(get-params-from-file))]
(db/insert! conn :file params opts)))
(defn update-file!
"Update an existing file on the database."
[{:keys [::db/conn ::sto/storage] :as cfg} {:keys [id] :as file} & {:as opts}]
(let [file (encode-file cfg file)
params (-> (get-params-from-file file)
(dissoc :id))]
;; If file was already offloaded, we touch the underlying storage
;; object for properly trigger storage-gc-touched task
(when (feat.fdata/offloaded? file)
(some->> (:data-ref-id file) (sto/touch-object! storage)))
(feat.fmigr/upsert-migrations! conn file)
(db/update! conn :file params {:id id} opts)))
(defn save-file!
"Applies all the final validations and perist the file, binfile
specific, should not be used outside of binfile domain"
[{:keys [::timestamp] :as cfg} file & {:as opts}]
(assert (dt/instant? timestamp) "expected valid timestamp")
(let [file (-> file
(assoc :created-at timestamp)
(assoc :modified-at timestamp)
(assoc :ignore-sync-until (dt/plus timestamp (dt/duration {:seconds 5})))
(update :features
(fn [features]
(-> (::features cfg #{})
(set/union features)
;; We never want to store
;; frontend-only features on file
(set/difference cfeat/frontend-only-features)))))]
(when (contains? cf/flags :file-schema-validation)
(fval/validate-file-schema! file))
(when (contains? cf/flags :soft-file-schema-validation)
(let [result (ex/try! (fval/validate-file-schema! file))]
(when (ex/exception? result)
(l/error :hint "file schema validation error" :cause result))))
(insert-file! cfg file opts)))
_ (when (contains? cf/flags :file-schema-validation)
(fval/validate-file-schema! file))
(def ^:private sql:get-file-libraries
"WITH RECURSIVE libs AS (
SELECT fl.*, flr.synced_at
FROM file AS fl
JOIN file_library_rel AS flr ON (flr.library_file_id = fl.id)
WHERE flr.file_id = ?::uuid
UNION
SELECT fl.*, flr.synced_at
FROM file AS fl
JOIN file_library_rel AS flr ON (flr.library_file_id = fl.id)
JOIN libs AS l ON (flr.file_id = l.id)
)
SELECT l.id,
l.features,
l.project_id,
p.team_id,
l.created_at,
l.modified_at,
l.deleted_at,
l.name,
l.revn,
l.vern,
l.synced_at,
l.is_shared
FROM libs AS l
INNER JOIN project AS p ON (p.id = l.project_id)
WHERE l.deleted_at IS NULL OR l.deleted_at > now();")
_ (when (contains? cf/flags :soft-file-schema-validation)
(let [result (ex/try! (fval/validate-file-schema! file))]
(when (ex/exception? result)
(l/error :hint "file schema validation error" :cause result))))
(defn get-file-libraries
[conn file-id]
(into []
(comp
;; FIXME: :is-indirect set to false to all rows looks
;; completly useless
(map #(assoc % :is-indirect false))
(map decode-row))
(db/exec! conn [sql:get-file-libraries file-id])))
file (if (contains? (:features file) "fdata/objects-map")
(feat.fdata/enable-objects-map file)
file)
file (if (contains? (:features file) "fdata/pointer-map")
(binding [pmap/*tracked* (pmap/create-tracked)]
(let [file (feat.fdata/enable-pointer-map file)]
(feat.fdata/persist-pointers! cfg id)
file))
file)
params (-> file
(update :features db/encode-pgarray conn "text")
(update :data blob/encode))]
(if (::overwrite cfg)
(upsert-file! conn params)
(db/insert! conn :file params ::db/return-keys false))
file))
(defn register-pending-migrations
"All features that are enabled and requires explicit migration are
added to the state for a posterior migration step."
[cfg {:keys [id features] :as file}]
(doseq [feature (-> (::features cfg)
(set/difference cfeat/no-migration-features)
(set/difference cfeat/backend-only-features)
(set/difference features))]
(vswap! *state* update :pending-to-migrate (fnil conj []) [feature id]))
file)
(defn apply-pending-migrations!
"Apply alredy registered pending migrations to files"
[cfg]
(doseq [[feature file-id] (-> *state* deref :pending-to-migrate)]
(case feature
"components/v2"
(feat.compv2/migrate-file! cfg file-id
:validate? (::validate cfg true)
:skip-on-graphic-error? true)
"fdata/shape-data-type"
nil
(ex/raise :type :internal
:code :no-migration-defined
:hint (str/ffmt "no migation for feature '%' on file importation" feature)
:feature feature))))
(defn get-resolved-file-libraries
"A helper for preload file libraries"
[{:keys [::db/conn] :as cfg} file]
(->> (get-file-libraries conn (:id file))
(into [file] (map #(get-file cfg (:id %))))
(d/index-by :id)))

View File

@@ -0,0 +1,47 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC
(ns app.binfile.migrations
"A binfile related migrations handling"
(:require
[app.binfile.common :as bfc]
[app.common.exceptions :as ex]
[app.common.features :as cfeat]
[clojure.set :as set]
[cuerdas.core :as str]))
(defn register-pending-migrations!
"All features that are enabled and requires explicit migration are
added to the state for a posterior migration step."
[cfg {:keys [id features] :as file}]
(doseq [feature (-> (::features cfg)
(set/difference cfeat/no-migration-features)
(set/difference cfeat/backend-only-features)
(set/difference features))]
(vswap! bfc/*state* update :pending-to-migrate (fnil conj []) [feature id]))
file)
(defn apply-pending-migrations!
"Apply alredy registered pending migrations to files"
[_cfg]
(doseq [[feature _file-id] (-> bfc/*state* deref :pending-to-migrate)]
(case feature
"components/v2"
nil
"fdata/shape-data-type"
nil
;; There is no migration needed, but we don't want to allow
;; copy paste nor import of variant files into no-variant teams
"variants/v1"
nil
(ex/raise :type :internal
:code :no-migration-defined
:hint (str/ffmt "no migation for feature '%' on file importation" feature)
:feature feature))))

View File

@@ -9,6 +9,7 @@
(:refer-clojure :exclude [assert])
(:require
[app.binfile.common :as bfc]
[app.binfile.migrations :as bfm]
[app.common.data :as d]
[app.common.data.macros :as dm]
[app.common.exceptions :as ex]
@@ -298,7 +299,7 @@
(defmulti write-section ::section)
(defn write-export!
[{:keys [::include-libraries ::embed-assets] :as cfg}]
[{:keys [::bfc/include-libraries ::bfc/embed-assets] :as cfg}]
(when (and include-libraries embed-assets)
(throw (IllegalArgumentException.
"the `include-libraries` and `embed-assets` are mutally excluding options")))
@@ -323,7 +324,7 @@
[:v1/metadata :v1/files :v1/rels :v1/sobjects]))))
(defmethod write-section :v1/metadata
[{:keys [::output ::ids ::include-libraries] :as cfg}]
[{:keys [::output ::bfc/ids ::bfc/include-libraries] :as cfg}]
(if-let [fids (get-files cfg ids)]
(let [lids (when include-libraries
(bfc/get-libraries cfg ids))
@@ -335,7 +336,7 @@
:hint "unable to retrieve files for export")))
(defmethod write-section :v1/files
[{:keys [::output ::embed-assets ::include-libraries] :as cfg}]
[{:keys [::output ::bfc/embed-assets ::bfc/include-libraries] :as cfg}]
;; Initialize SIDS with empty vector
(vswap! bfc/*state* assoc :sids [])
@@ -382,7 +383,7 @@
(vswap! bfc/*state* update :sids into bfc/xf-map-media-id thumbnails))))
(defmethod write-section :v1/rels
[{:keys [::output ::include-libraries] :as cfg}]
[{:keys [::output ::bfc/include-libraries] :as cfg}]
(let [ids (-> bfc/*state* deref :files set)
rels (when include-libraries
(bfc/get-files-rels cfg ids))]
@@ -421,25 +422,19 @@
(defmulti read-import ::version)
(defmulti read-section ::section)
(s/def ::profile-id ::us/uuid)
(s/def ::project-id ::us/uuid)
(s/def ::input io/input-stream?)
(s/def ::overwrite? (s/nilable ::us/boolean))
(s/def ::bfc/profile-id ::us/uuid)
(s/def ::bfc/project-id ::us/uuid)
(s/def ::bfc/input io/input-stream?)
(s/def ::ignore-index-errors? (s/nilable ::us/boolean))
;; FIXME: replace with schema
(s/def ::read-import-options
(s/keys :req [::db/pool ::sto/storage ::project-id ::profile-id ::input]
:opt [::overwrite? ::ignore-index-errors?]))
(s/keys :req [::db/pool ::sto/storage ::bfc/project-id ::bfc/profile-id ::bfc/input]
:opt [::ignore-index-errors?]))
(defn read-import!
"Do the importation of the specified resource in penpot custom binary
format. There are some options for customize the importation
behavior:
`::bfc/overwrite`: if true, instead of creating new files and remapping id references,
it reuses all ids and updates existing objects; defaults to `false`."
[{:keys [::input ::bfc/timestamp] :or {timestamp (dt/now)} :as options}]
format."
[{:keys [::bfc/input ::bfc/timestamp] :or {timestamp (dt/now)} :as options}]
(dm/assert!
"expected input stream"
@@ -453,7 +448,7 @@
(read-import (assoc options ::version version ::bfc/timestamp timestamp))))
(defn- read-import-v1
[{:keys [::db/conn ::project-id ::profile-id ::input] :as cfg}]
[{:keys [::db/conn ::bfc/project-id ::bfc/profile-id ::bfc/input] :as cfg}]
(bfc/disable-database-timeouts! cfg)
@@ -473,13 +468,13 @@
(let [options (-> cfg
(assoc ::bfc/features features)
(assoc ::section section)
(assoc ::input input))]
(assoc ::bfc/input input))]
(binding [bfc/*options* options]
(events/tap :progress {:op :import :section section})
(read-section options))))
[:v1/metadata :v1/files :v1/rels :v1/sobjects])
(bfc/apply-pending-migrations! cfg)
(bfm/apply-pending-migrations! cfg)
;; Knowing that the ids of the created files are in index,
;; just lookup them and return it as a set
@@ -491,7 +486,7 @@
(db/tx-run! options read-import-v1))
(defmethod read-section :v1/metadata
[{:keys [::input]}]
[{:keys [::bfc/input]}]
(let [{:keys [version files]} (read-obj! input)]
(l/dbg :hint "metadata readed"
:version (:full version)
@@ -509,8 +504,7 @@
thumbnails))
(defmethod read-section :v1/files
[{:keys [::db/conn ::input ::project-id ::bfc/overwrite ::name] :as system}]
[{:keys [::bfc/input ::bfc/project-id ::bfc/name] :as system}]
(doseq [[idx expected-file-id] (d/enumerate (-> bfc/*state* deref :files))]
(let [file (read-obj! input)
media (read-obj! input)
@@ -557,8 +551,8 @@
(cond-> (and (= idx 0) (some? name))
(assoc :name name))
(assoc :project-id project-id)
(dissoc :thumbnails)
(bfc/process-file))]
(dissoc :thumbnails))
file (bfc/process-file system file)]
;; All features that are enabled and requires explicit migration are
;; added to the state for a posterior migration step.
@@ -568,15 +562,12 @@
(vswap! bfc/*state* update :pending-to-migrate (fnil conj []) [feature file-id']))
(l/dbg :hint "create file" :id (str file-id') ::l/sync? true)
(bfc/persist-file! system file)
(when overwrite
(db/delete! conn :file-thumbnail {:file-id file-id'}))
(bfc/save-file! system file ::db/return-keys false)
file-id'))))
(defmethod read-section :v1/rels
[{:keys [::db/conn ::input ::bfc/timestamp]}]
[{:keys [::db/conn ::bfc/input ::bfc/timestamp]}]
(let [rels (read-obj! input)
ids (into #{} (-> bfc/*state* deref :files))]
;; Insert all file relations
@@ -600,7 +591,7 @@
::l/sync? true))))))
(defmethod read-section :v1/sobjects
[{:keys [::db/conn ::input ::bfc/overwrite ::bfc/timestamp] :as cfg}]
[{:keys [::db/conn ::bfc/input ::bfc/timestamp] :as cfg}]
(let [storage (sto/resolve cfg)
ids (read-obj! input)
thumb? (into #{} (map :media-id) (:thumbnails @bfc/*state*))]
@@ -653,8 +644,7 @@
(-> item
(assoc :file-id file-id)
(d/update-when :media-id bfc/lookup-index)
(d/update-when :thumbnail-id bfc/lookup-index))
{::db/on-conflict-do-nothing? overwrite}))))
(d/update-when :thumbnail-id bfc/lookup-index))))))
(doseq [item (:thumbnails @bfc/*state*)]
(let [item (update item :media-id bfc/lookup-index)]
@@ -663,8 +653,7 @@
:media-id (str (:media-id item))
:object-id (:object-id item)
::l/sync? true)
(db/insert! conn :file-tagged-object-thumbnail item
{::db/on-conflict-do-nothing? overwrite})))))
(db/insert! conn :file-tagged-object-thumbnail item)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; HIGH LEVEL API
@@ -674,17 +663,17 @@
"Do the exportation of a specified file in custom penpot binary
format. There are some options available for customize the output:
`::include-libraries`: additionally to the specified file, all the
`::bfc/include-libraries`: additionally to the specified file, all the
linked libraries also will be included (including transitive
dependencies).
`::embed-assets`: instead of including the libraries, embed in the
`::bfc/embed-assets`: instead of including the libraries, embed in the
same file library all assets used from external libraries."
[{:keys [::ids] :as cfg} output]
[{:keys [::bfc/ids] :as cfg} output]
(dm/assert!
"expected a set of uuid's for `::ids` parameter"
"expected a set of uuid's for `::bfc/ids` parameter"
(and (set? ids)
(every? uuid? ids)))
@@ -719,12 +708,12 @@
:cause @cs)))))
(defn import-files!
[{:keys [::input] :as cfg}]
[{:keys [::bfc/input] :as cfg}]
(dm/assert!
"expected valid profile-id and project-id on `cfg`"
(and (uuid? (::profile-id cfg))
(uuid? (::project-id cfg))))
(and (uuid? (::bfc/profile-id cfg))
(uuid? (::bfc/project-id cfg))))
(dm/assert!
"expected instance of jio/IOFactory for `input`"
@@ -738,7 +727,7 @@
(try
(binding [*position* (atom 0)]
(pu/with-open [input (io/input-stream input)]
(read-import! (assoc cfg ::input input))))
(read-import! (assoc cfg ::bfc/input input))))
(catch ZstdIOException cause
(ex/raise :type :validation

View File

@@ -281,8 +281,8 @@
(let [file (-> (read-obj cfg :file file-id)
(update :id bfc/lookup-index)
(update :project-id bfc/lookup-index)
(bfc/process-file))]
(update :project-id bfc/lookup-index))
file (bfc/process-file cfg file)]
(events/tap :progress
{:op :import
@@ -297,7 +297,7 @@
(set/difference (:features file)))]
(vswap! bfc/*state* update :pending-to-migrate (fnil conj []) [feature (:id file)]))
(bfc/persist-file! cfg file))
(bfc/save-file! cfg file ::db/return-keys false))
(doseq [thumbnail (read-seq cfg :file-object-thumbnail file-id)]
(let [thumbnail (-> thumbnail

View File

@@ -8,13 +8,16 @@
"A ZIP based binary file exportation"
(:refer-clojure :exclude [read])
(:require
[app.binfile.cleaner :as bfl]
[app.binfile.common :as bfc]
[app.binfile.migrations :as bfm]
[app.common.data :as d]
[app.common.data.macros :as dm]
[app.common.exceptions :as ex]
[app.common.features :as cfeat]
[app.common.files.migrations :as-alias fmg]
[app.common.json :as json]
[app.common.logging :as l]
[app.common.media :as cmedia]
[app.common.schema :as sm]
[app.common.thumbnails :as cth]
[app.common.types.color :as ctcl]
@@ -23,10 +26,12 @@
[app.common.types.page :as ctp]
[app.common.types.plugins :as ctpg]
[app.common.types.shape :as cts]
[app.common.types.tokens-lib :as cto]
[app.common.types.typography :as cty]
[app.common.uuid :as uuid]
[app.config :as cf]
[app.db :as db]
[app.db.sql :as-alias sql]
[app.storage :as sto]
[app.storage.impl :as sto.impl]
[app.util.events :as events]
@@ -48,7 +53,7 @@
[:map {:title "Manifest"}
[:version ::sm/int]
[:type :string]
[:referer {:optional true} :string]
[:generated-by {:optional true} :string]
[:files
@@ -56,7 +61,6 @@
[:map
[:id ::sm/uuid]
[:name :string]
[:project-id ::sm/uuid]
[:features ::cfeat/features]]]]
[:relations {:optional true}
@@ -69,7 +73,7 @@
[:size ::sm/int]
[:content-type :string]
[:bucket [::sm/one-of {:format :string} sto/valid-buckets]]
[:hash :string]])
[:hash {:optional true} :string]])
(def ^:private schema:file-thumbnail
[:map {:title "FileThumbnail"}
@@ -79,13 +83,24 @@
[:tag :string]
[:media-id ::sm/uuid]])
(def ^:private schema:file
[:merge
ctf/schema:file
[:map [:options {:optional true} ctf/schema:options]]])
;; --- HELPERS
(defn- default-now
[o]
(or o (dt/now)))
;; --- ENCODERS
(def encode-file
(sm/encoder ::ctf/file sm/json-transformer))
(sm/encoder schema:file sm/json-transformer))
(def encode-page
(sm/encoder ::ctp/page sm/json-transformer))
(sm/encoder ctp/schema:page sm/json-transformer))
(def encode-shape
(sm/encoder ::cts/shape sm/json-transformer))
@@ -97,11 +112,14 @@
(sm/encoder ::ctc/component sm/json-transformer))
(def encode-color
(sm/encoder ::ctcl/color sm/json-transformer))
(sm/encoder ctcl/schema:library-color sm/json-transformer))
(def encode-typography
(sm/encoder ::cty/typography sm/json-transformer))
(def encode-tokens-lib
(sm/encoder ::cto/tokens-lib sm/json-transformer))
(def encode-plugin-data
(sm/encoder ::ctpg/plugin-data sm/json-transformer))
@@ -117,16 +135,16 @@
(sm/decoder schema:manifest sm/json-transformer))
(def decode-media
(sm/decoder ::ctf/media sm/json-transformer))
(sm/decoder ctf/schema:media sm/json-transformer))
(def decode-component
(sm/decoder ::ctc/component sm/json-transformer))
(def decode-color
(sm/decoder ::ctcl/color sm/json-transformer))
(sm/decoder ctcl/schema:library-color sm/json-transformer))
(def decode-file
(sm/decoder ::ctf/file sm/json-transformer))
(sm/decoder schema:file sm/json-transformer))
(def decode-page
(sm/decoder ::ctp/page sm/json-transformer))
@@ -137,6 +155,9 @@
(def decode-typography
(sm/decoder ::cty/typography sm/json-transformer))
(def decode-tokens-lib
(sm/decoder cto/schema:tokens-lib sm/json-transformer))
(def decode-plugin-data
(sm/decoder ::ctpg/plugin-data sm/json-transformer))
@@ -164,7 +185,7 @@
(sm/check-fn ::ctf/media))
(def validate-color
(sm/check-fn ::ctcl/color))
(sm/check-fn ctcl/schema:library-color))
(def validate-component
(sm/check-fn ::ctc/component))
@@ -172,6 +193,9 @@
(def validate-typography
(sm/check-fn ::cty/typography))
(def validate-tokens-lib
(sm/check-fn ::cto/tokens-lib))
(def validate-plugin-data
(sm/check-fn ::ctpg/plugin-data))
@@ -192,37 +216,24 @@
(.closeEntry output))
(defn- get-file
[{:keys [::embed-assets ::include-libraries] :as cfg} file-id]
[{:keys [::bfc/embed-assets ::bfc/include-libraries] :as cfg} file-id]
(when (and include-libraries embed-assets)
(throw (IllegalArgumentException.
"the `include-libraries` and `embed-assets` are mutally excluding options")))
(let [detach? (and (not embed-assets) (not include-libraries))]
(cond-> (bfc/get-file cfg file-id)
detach?
(-> (ctf/detach-external-references file-id)
(dissoc :libraries))
(db/tx-run! cfg (fn [cfg]
(cond-> (bfc/get-file cfg file-id {::sql/for-update true})
detach?
(-> (ctf/detach-external-references file-id)
(dissoc :libraries))
embed-assets
(update :data #(bfc/embed-assets cfg % file-id))
embed-assets
(update :data #(bfc/embed-assets cfg % file-id))
:always
(bfc/clean-file-features))))
(defn- resolve-extension
[mtype]
(case mtype
"image/png" ".png"
"image/jpeg" ".jpg"
"image/gif" ".gif"
"image/svg+xml" ".svg"
"image/webp" ".webp"
"font/woff" ".woff"
"font/woff2" ".woff2"
"font/ttf" ".ttf"
"font/otf" ".otf"
"application/octet-stream" ".bin"))
:always
(bfc/clean-file-features))))))
(defn- export-storage-objects
[{:keys [::output] :as cfg}]
@@ -230,7 +241,7 @@
(doseq [id (-> bfc/*state* deref :storage-objects not-empty)]
(let [sobject (sto/get-object storage id)
smeta (meta sobject)
ext (resolve-extension (:content-type smeta))
ext (cmedia/mtype->extension (:content-type smeta))
path (str "objects/" id ".json")
params (-> (meta sobject)
(assoc :id (:id sobject))
@@ -247,6 +258,7 @@
(defn- export-file
[{:keys [::file-id ::output] :as cfg}]
(let [file (get-file cfg file-id)
media (->> (bfc/get-file-media cfg file)
(map (fn [media]
(dissoc media :file-id))))
@@ -255,6 +267,7 @@
typographies (:typographies data)
components (:components data)
colors (:colors data)
tokens-lib (:tokens-lib data)
pages (:pages data)
pages-index (:pages-index data)
@@ -263,13 +276,16 @@
(vswap! bfc/*state* update :files assoc file-id
{:id file-id
:project-id (:project-id file)
:name (:name file)
:features (:features file)})
(let [file (cond-> (dissoc file :data)
(let [file (cond-> (select-keys file bfc/file-attrs)
(:options data)
(assoc :options (:options data))
:always
(dissoc :data)
:always
(encode-file))
path (str "files/" file-id ".json")]
@@ -325,12 +341,17 @@
(write-entry! output path color)))
(doseq [[id object] typographies]
(let [path (str "files/" file-id "/typographies/" id ".json")
color (encode-typography object)]
(write-entry! output path color)))))
(let [path (str "files/" file-id "/typographies/" id ".json")
typography (encode-typography object)]
(write-entry! output path typography)))
(when tokens-lib
(let [path (str "files/" file-id "/tokens.json")
encoded-tokens (encode-tokens-lib tokens-lib)]
(write-entry! output path encoded-tokens)))))
(defn- export-files
[{:keys [::ids ::include-libraries ::output] :as cfg}]
[{:keys [::bfc/ids ::bfc/include-libraries ::output] :as cfg}]
(let [ids (into ids (when include-libraries (bfc/get-libraries cfg ids)))
rels (if include-libraries
(->> (bfc/get-files-rels cfg ids)
@@ -351,6 +372,7 @@
params {:type "penpot/export-files"
:version 1
:generated-by (str "penpot/" (:full cf/version))
:refer "penpot"
:files (vec (vals files))
:relations rels}]
(write-entry! output "manifest.json" params))))
@@ -463,6 +485,14 @@
{:entry entry
:id (parse-uuid id)}))))
(defn- match-tokens-lib-entry-fn
[file-id]
(let [pattern (str "^files/" file-id "/tokens.json$")
pattern (re-pattern pattern)]
(fn [entry]
(when-let [[_] (re-matches pattern (zip-entry-name entry))]
{:entry entry}))))
(defn- match-thumbnail-entry-fn
[file-id]
(let [pattern (str "^files/" file-id "/thumbnails/([^/]+)/([^/]+)/([^/]+).json$")
@@ -496,7 +526,7 @@
(defn- match-storage-entry-fn
[]
(let [pattern (str "^objects/([^/]+).json$")
(let [pattern "^objects/([^/]+).json$"
pattern (re-pattern pattern)]
(fn [entry]
(when-let [[_ id] (re-matches pattern (zip-entry-name entry))]
@@ -508,8 +538,13 @@
(with-open [reader (zip-entry-reader input entry)]
(json/read reader :key-fn json/read-kebab-key)))
(defn- read-plain-entry
[^ZipFile input entry]
(with-open [reader (zip-entry-reader input entry)]
(json/read reader)))
(defn- read-file
[{:keys [::input ::file-id]}]
[{:keys [::bfc/input ::file-id]}]
(let [path (str "files/" file-id ".json")
entry (get-zip-entry input path)]
(-> (read-entry input entry)
@@ -517,7 +552,7 @@
(validate-file))))
(defn- read-file-plugin-data
[{:keys [::input ::file-id]}]
[{:keys [::bfc/input ::file-id]}]
(let [path (str "files/" file-id "/plugin-data.json")
entry (get-zip-entry* input path)]
(some->> entry
@@ -526,13 +561,19 @@
(validate-plugin-data))))
(defn- read-file-media
[{:keys [::input ::file-id ::entries]}]
[{:keys [::bfc/input ::file-id ::entries]}]
(->> (keep (match-media-entry-fn file-id) entries)
(reduce (fn [result {:keys [id entry]}]
(let [object (->> (read-entry input entry)
(decode-media)
(validate-media))
object (assoc object :file-id file-id)]
object (-> object
(assoc :file-id file-id)
(update :created-at default-now)
;; FIXME: this is set default to true for
;; setting a value, this prop is no longer
;; relevant;
(assoc :is-local true))]
(if (= id (:id object))
(conj result object)
result)))
@@ -540,7 +581,7 @@
(not-empty)))
(defn- read-file-colors
[{:keys [::input ::file-id ::entries]}]
[{:keys [::bfc/input ::file-id ::entries]}]
(->> (keep (match-color-entry-fn file-id) entries)
(reduce (fn [result {:keys [id entry]}]
(let [object (->> (read-entry input entry)
@@ -553,20 +594,38 @@
(not-empty)))
(defn- read-file-components
[{:keys [::input ::file-id ::entries]}]
(->> (keep (match-component-entry-fn file-id) entries)
(reduce (fn [result {:keys [id entry]}]
(let [object (->> (read-entry input entry)
(decode-component)
(validate-component))]
(if (= id (:id object))
(assoc result id object)
result)))
{})
(not-empty)))
[{:keys [::bfc/input ::file-id ::entries]}]
(let [clean-component-post-decode
(fn [component]
(d/update-when component :objects
(fn [objects]
(reduce-kv (fn [objects id shape]
(assoc objects id (bfl/clean-shape-post-decode shape)))
objects
objects))))
clean-component-pre-decode
(fn [component]
(d/update-when component :objects
(fn [objects]
(reduce-kv (fn [objects id shape]
(assoc objects id (bfl/clean-shape-pre-decode shape)))
objects
objects))))]
(->> (keep (match-component-entry-fn file-id) entries)
(reduce (fn [result {:keys [id entry]}]
(let [object (->> (read-entry input entry)
(clean-component-pre-decode)
(decode-component)
(clean-component-post-decode))]
(if (= id (:id object))
(assoc result id object)
result)))
{})
(not-empty))))
(defn- read-file-typographies
[{:keys [::input ::file-id ::entries]}]
[{:keys [::bfc/input ::file-id ::entries]}]
(->> (keep (match-typography-entry-fn file-id) entries)
(reduce (fn [result {:keys [id entry]}]
(let [object (->> (read-entry input entry)
@@ -578,13 +637,21 @@
{})
(not-empty)))
(defn- read-file-tokens-lib
[{:keys [::bfc/input ::file-id ::entries]}]
(when-let [entry (d/seek (match-tokens-lib-entry-fn file-id) entries)]
(->> (read-plain-entry input entry)
(decode-tokens-lib)
(validate-tokens-lib))))
(defn- read-file-shapes
[{:keys [::input ::file-id ::page-id ::entries] :as cfg}]
[{:keys [::bfc/input ::file-id ::page-id ::entries] :as cfg}]
(->> (keep (match-shape-entry-fn file-id page-id) entries)
(reduce (fn [result {:keys [id entry]}]
(let [object (->> (read-entry input entry)
(bfl/clean-shape-pre-decode)
(decode-shape)
(validate-shape))]
(bfl/clean-shape-post-decode))]
(if (= id (:id object))
(assoc result id object)
result)))
@@ -592,7 +659,7 @@
(not-empty)))
(defn- read-file-pages
[{:keys [::input ::file-id ::entries] :as cfg}]
[{:keys [::bfc/input ::file-id ::entries] :as cfg}]
(->> (keep (match-page-entry-fn file-id) entries)
(keep (fn [{:keys [id entry]}]
(let [page (->> (read-entry input entry)
@@ -608,7 +675,7 @@
(d/ordered-map))))
(defn- read-file-thumbnails
[{:keys [::input ::file-id ::entries] :as cfg}]
[{:keys [::bfc/input ::file-id ::entries] :as cfg}]
(->> (keep (match-thumbnail-entry-fn file-id) entries)
(reduce (fn [result {:keys [page-id frame-id tag entry]}]
(let [object (->> (read-entry input entry)
@@ -623,22 +690,23 @@
(not-empty)))
(defn- read-file-data
[{:keys [] :as cfg}]
[cfg]
(let [colors (read-file-colors cfg)
typographies (read-file-typographies cfg)
tokens-lib (read-file-tokens-lib cfg)
components (read-file-components cfg)
plugin-data (read-file-plugin-data cfg)
pages (read-file-pages cfg)]
{:pages (-> pages keys vec)
:pages-index (into {} pages)
:colors colors
:typographies typographies
:tokens-lib tokens-lib
:components components
:plugin-data plugin-data}))
(defn- import-file
[{:keys [::db/conn ::project-id ::file-id ::file-name] :as cfg}]
[{:keys [::bfc/project-id ::file-id ::file-name] :as cfg}]
(let [file-id' (bfc/lookup-index file-id)
file (read-file cfg)
media (read-file-media cfg)
@@ -678,20 +746,18 @@
(cond-> (:options file)
(assoc :options (:options file))))
file (-> file
file (-> (select-keys file bfc/file-attrs)
(assoc :id file-id')
(assoc :data data)
(assoc :name file-name)
(assoc :project-id project-id)
(dissoc :options)
(bfc/process-file))]
(dissoc :options))
(->> file
(bfc/register-pending-migrations cfg)
(bfc/persist-file! cfg))
file (bfc/process-file cfg file)
file (ctf/check-file file)]
(when (::bfc/overwrite cfg)
(db/delete! conn :file-thumbnail {:file-id file-id'}))
(bfm/register-pending-migrations! cfg file)
(bfc/save-file! cfg file ::db/return-keys false)
file-id')))
@@ -714,7 +780,7 @@
:library-file-id libr-id})))))
(defn- import-storage-objects
[{:keys [::input ::entries ::bfc/timestamp] :as cfg}]
[{:keys [::bfc/input ::entries ::bfc/timestamp] :as cfg}]
(events/tap :progress {:section :storage-objects})
(let [storage (sto/resolve cfg)
@@ -732,7 +798,7 @@
:expected-id (str id)
:found-id (str (:id object))))
(let [ext (resolve-extension (:content-type object))
(let [ext (cmedia/mtype->extension (:content-type object))
path (str "objects/" id ext)
content (->> path
(get-zip-entry input)
@@ -746,13 +812,14 @@
:expected-size (:size object)
:found-size (sto/get-size content)))
(when (not= (:hash object) (sto/get-hash content))
(ex/raise :type :validation
:code :inconsistent-penpot-file
:hint "found corrupted storage object: hash does not match"
:path path
:expected-hash (:hash object)
:found-hash (sto/get-hash content)))
(when-let [hash (get object :hash)]
(when (not= hash (sto/get-hash content))
(ex/raise :type :validation
:code :inconsistent-penpot-file
:hint "found corrupted storage object: hash does not match"
:path path
:expected-hash (:hash object)
:found-hash (sto/get-hash content))))
(let [params (-> object
(dissoc :id :size)
@@ -781,12 +848,12 @@
(d/update-when :thumbnail-id bfc/lookup-index))]
(l/dbg :hint "inserting file media object"
:old-id (str (:id item))
:id (str (:id params))
:file-id (str (:file-id params))
::l/sync? true)
(db/insert! conn :file-media-object params
{::db/on-conflict-do-nothing? (::bfc/overwrite cfg)}))))
(db/insert! conn :file-media-object params))))
(defn- import-file-thumbnails
[{:keys [::db/conn] :as cfg}]
@@ -806,19 +873,13 @@
:media-id (str media-id)
::l/sync? true)
(db/insert! conn :file-tagged-object-thumbnail params
{::db/on-conflict-do-nothing? (::bfc/overwrite cfg)}))))
(db/insert! conn :file-tagged-object-thumbnail params))))
(defn- import-files
[{:keys [::bfc/timestamp ::input ::name] :or {timestamp (dt/now)} :as cfg}]
[{:keys [::bfc/timestamp ::bfc/input ::bfc/name] :or {timestamp (dt/now)} :as cfg}]
(dm/assert!
"expected zip file"
(instance? ZipFile input))
(dm/assert!
"expected valid instant"
(dt/instant? timestamp))
(assert (instance? ZipFile input) "expected zip file")
(assert (dt/instant? timestamp) "expected valid instant")
(let [manifest (-> (read-manifest input)
(validate-manifest))
@@ -830,15 +891,19 @@
:hint "unexpected type on manifest"
:manifest manifest))
;; Check if all files referenced on manifest are present
(doseq [{file-id :id} (:files manifest)]
(doseq [{file-id :id features :features} (:files manifest)]
(let [path (str "files/" file-id ".json")]
(when-not (get-zip-entry input path)
(ex/raise :type :validation
:code :invalid-binfile-v3
:hint "some files referenced on manifest not found"
:path path
:file-id file-id))))
:file-id file-id))
(cfeat/check-supported-features! features)))
(events/tap :progress {:section :manifest})
@@ -868,7 +933,7 @@
(import-file-media cfg)
(import-file-thumbnails cfg)
(bfc/apply-pending-migrations! cfg)
(bfm/apply-pending-migrations! cfg)
ids)))))))
@@ -878,23 +943,22 @@
"Do the exportation of a specified file in custom penpot binary
format. There are some options available for customize the output:
`::include-libraries`: additionally to the specified file, all the
`::bfc/include-libraries`: additionally to the specified file, all the
linked libraries also will be included (including transitive
dependencies).
`::embed-assets`: instead of including the libraries, embed in the
`::bfc/embed-assets`: instead of including the libraries, embed in the
same file library all assets used from external libraries."
[{:keys [::ids] :as cfg} output]
[{:keys [::bfc/ids] :as cfg} output]
(dm/assert!
"expected a set of uuid's for `::ids` parameter"
(and (set? ids)
(every? uuid? ids)))
(assert
(and (set? ids) (every? uuid? ids))
"expected a set of uuid's for `::bfc/ids` parameter")
(dm/assert!
"expected instance of jio/IOFactory for `input`"
(satisfies? jio/IOFactory output))
(assert
(satisfies? jio/IOFactory output)
"expected instance of jio/IOFactory for `input`")
(let [id (uuid/next)
tp (dt/tpoint)
@@ -930,18 +994,17 @@
:aborted @ab
:cause @cs)))))
(defn import-files!
[{:keys [::input] :as cfg}]
[{:keys [::bfc/input] :as cfg}]
(dm/assert!
"expected valid profile-id and project-id on `cfg`"
(and (uuid? (::profile-id cfg))
(uuid? (::project-id cfg))))
(assert
(and (uuid? (::bfc/profile-id cfg))
(uuid? (::bfc/project-id cfg)))
"expected valid profile-id and project-id on `cfg`")
(dm/assert!
"expected instance of jio/IOFactory for `input`"
(io/coercible? input))
(assert
(io/coercible? input)
"expected instance of jio/IOFactory for `input`")
(let [id (uuid/next)
tp (dt/tpoint)
@@ -950,7 +1013,7 @@
(l/info :hint "import: started" :id (str id))
(try
(with-open [input (ZipFile. (fs/file input))]
(import-files (assoc cfg ::input input)))
(import-files (assoc cfg ::bfc/input input)))
(catch Throwable cause
(vreset! cs cause)
@@ -961,3 +1024,9 @@
:id (str id)
:elapsed (dt/format-duration (tp))
:error? (some? @cs))))))
(defn get-manifest
[path]
(with-open [input (ZipFile. (fs/file path))]
(-> (read-manifest input)
(validate-manifest))))

View File

@@ -12,6 +12,7 @@
[app.common.exceptions :as ex]
[app.common.flags :as flags]
[app.common.schema :as sm]
[app.common.uri :as u]
[app.common.version :as v]
[app.util.overrides]
[app.util.time :as dt]
@@ -228,19 +229,16 @@
[:objects-storage-s3-endpoint {:optional true} ::sm/uri]
[:objects-storage-s3-io-threads {:optional true} ::sm/int]]))
(def default-flags
[:enable-backend-api-doc
:enable-backend-openapi-doc
:enable-backend-worker
:enable-secure-session-cookies
:enable-email-verification
:enable-v2-migration])
(defn- parse-flags
[config]
(flags/parse flags/default
default-flags
(:flags config)))
(let [public-uri (c/get config :public-uri)
public-uri (some-> public-uri (u/uri))
extra-flags (if (and public-uri
(= (:scheme public-uri) "http")
(not= (:host public-uri) "localhost"))
#{:disable-secure-session-cookies}
#{})]
(flags/parse flags/default extra-flags (:flags config))))
(defn read-env
[prefix]

View File

@@ -22,7 +22,8 @@
[clojure.set :as set]
[integrant.core :as ig]
[next.jdbc :as jdbc]
[next.jdbc.date-time :as jdbc-dt])
[next.jdbc.date-time :as jdbc-dt]
[next.jdbc.transaction])
(:import
com.zaxxer.hikari.HikariConfig
com.zaxxer.hikari.HikariDataSource
@@ -41,6 +42,8 @@
org.postgresql.util.PGInterval
org.postgresql.util.PGobject))
(def ^:dynamic *conn* nil)
(declare open)
(declare create-pool)
@@ -223,16 +226,6 @@
(let [^OutputStream os (.getOutputStream ^LargeObject lobj)]
(io/make-output-stream os opts))))
(defmacro with-atomic
[& args]
(if (symbol? (first args))
(let [cfgs (first args)
body (rest args)]
`(jdbc/with-transaction [conn# (::pool ~cfgs)]
(let [~cfgs (assoc ~cfgs ::conn conn#)]
~@body)))
`(jdbc/with-transaction ~@args)))
(defn open
[system-or-pool]
(if (pool? system-or-pool)
@@ -413,7 +406,7 @@
(def ^:private default-plan-opts
(-> default-opts
(assoc :fetch-size 1)
(assoc :fetch-size 1000)
(assoc :concurrency :read-only)
(assoc :cursors :close)
(assoc :result-type :forward-only)))
@@ -535,43 +528,31 @@
(l/trc :hint "explicit rollback requested (savepoint)")
(.rollback conn sp))))
(defn transact!
"A lower-level function for executing function in a transaction"
([transactable f] (transact! transactable f {}))
([transactable f opts]
(binding [next.jdbc.transaction/*nested-tx* :ignore]
(jdbc/transact transactable f opts))))
(defn tx-run!
"Run a function in a transaction."
[system f & params]
(cond
(connection? system)
(if (connection? system)
(tx-run! {::conn system} f)
(pool? system)
(tx-run! {::pool system} f)
(::conn system)
(let [conn (::conn system)
sp (savepoint conn)]
(try
(let [system' (-> system
(assoc ::savepoint sp)
(dissoc ::rollback))
result (apply f system' params)]
(if (::rollback system)
(rollback! conn sp)
(release! conn sp))
result)
(catch Throwable cause
(.rollback ^Connection conn ^Savepoint sp)
(throw cause))))
(::pool system)
(with-atomic [conn (::pool system)]
(let [system' (-> system
(assoc ::conn conn)
(dissoc ::rollback))
result (apply f system' params)]
(when (::rollback system)
(rollback! conn))
result))
:else
(throw (IllegalArgumentException. "invalid system/cfg provided"))))
(if (pool? system)
(tx-run! {::pool system} f)
(if-let [conn (or (::conn system)
(::pool system))]
(transact! conn
(fn [conn]
(let [system' (-> system
(dissoc ::rollback)
(assoc ::conn conn))]
(apply f system' params)))
{:rollback-only (::rollback system)
:read-only (::read-only system)})
(throw (IllegalArgumentException. "invalid system/cfg provided"))))))
(defn run!
[system f & params]

View File

@@ -39,7 +39,10 @@
(defn insert-many
[table cols rows opts]
(let [opts (merge default-opts opts)]
(let [opts (merge default-opts opts)
opts (cond-> opts
(::on-conflict-do-nothing opts)
(assoc :suffix "ON CONFLICT DO NOTHING"))]
(sql/for-insert-multi table cols rows opts)))
(defn select

View File

@@ -449,6 +449,45 @@
:id ::request-team-access
:schema schema:request-team-access))
(def ^:private schema:comment-mention
[:map
[:name ::sm/text]
[:source-user ::sm/text]
[:comment-reference ::sm/text]
[:comment-content ::sm/text]
[:comment-url ::sm/text]])
(def comment-mention
(template-factory
:id ::comment-mention
:schema schema:comment-mention))
(def ^:private schema:comment-thread
[:map
[:name ::sm/text]
[:source-user ::sm/text]
[:comment-reference ::sm/text]
[:comment-content ::sm/text]
[:comment-url ::sm/text]])
(def comment-thread
(template-factory
:id ::comment-thread
:schema schema:comment-thread))
(def ^:private schema:comment-notification
[:map
[:name ::sm/text]
[:source-user ::sm/text]
[:comment-reference ::sm/text]
[:comment-content ::sm/text]
[:comment-url ::sm/text]])
(def comment-notification
(template-factory
:id ::comment-notification
:schema schema:comment-notification))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; BOUNCE/COMPLAINS HELPERS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

View File

File diff suppressed because it is too large Load Diff

View File

@@ -9,7 +9,10 @@
(:require
[app.common.data :as d]
[app.common.exceptions :as ex]
[app.common.files.helpers :as cfh]
[app.common.files.migrations :as fmg]
[app.common.logging :as l]
[app.common.types.path :as path]
[app.db :as db]
[app.db.sql :as-alias sql]
[app.storage :as sto]
@@ -30,7 +33,7 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn enable-objects-map
[file]
[file & _opts]
(let [update-page
(fn [page]
(if (and (pmap/pointer-map? page)
@@ -136,10 +139,56 @@
(defn enable-pointer-map
"Enable the fdata/pointer-map feature on the file."
[file]
[file & _opts]
(-> file
(update :data (fn [fdata]
(-> fdata
(update :pages-index d/update-vals pmap/wrap)
(d/update-when :components pmap/wrap))))
(update :features conj "fdata/pointer-map")))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PATH-DATA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn enable-path-data
"Enable the fdata/path-data feature on the file."
[file & _opts]
(letfn [(update-object [object]
(if (or (cfh/path-shape? object)
(cfh/bool-shape? object))
(update object :content path/content)
object))
(update-container [container]
(d/update-when container :objects d/update-vals update-object))]
(-> file
(update :data (fn [data]
(-> data
(update :pages-index d/update-vals update-container)
(d/update-when :components d/update-vals update-container))))
(update :features conj "fdata/path-data"))))
(defn disable-path-data
[file & _opts]
(letfn [(update-object [object]
(if (or (cfh/path-shape? object)
(cfh/bool-shape? object))
(update object :content vec)
object))
(update-container [container]
(d/update-when container :objects d/update-vals update-object))]
(when-let [conn db/*conn*]
(db/delete! conn :file-migration {:file-id (:id file)
:name "0003-convert-path-content"}))
(-> file
(update :data (fn [data]
(-> data
(update :pages-index d/update-vals update-container)
(d/update-when :components d/update-vals update-container))))
(update :features disj "fdata/path-data")
(update :migrations disj "0003-convert-path-content")
(vary-meta update ::fmg/migrated disj "0003-convert-path-content"))))

View File

@@ -0,0 +1,39 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC
(ns app.features.file-migrations
"Backend specific code for file migrations. Implemented as permanent feature of files."
(:require
[app.common.data :as d]
[app.common.files.migrations :as fmg :refer [xf:map-name]]
[app.db :as db]
[app.db.sql :as-alias sql]))
(def ^:private sql:get-file-migrations
"SELECT name FROM file_migration WHERE file_id = ? ORDER BY created_at ASC")
(defn resolve-applied-migrations
[cfg {:keys [id] :as file}]
(let [conn (db/get-connection cfg)]
(assoc file :migrations
(->> (db/plan conn [sql:get-file-migrations id])
(transduce xf:map-name conj (d/ordered-set))
(not-empty)))))
(defn upsert-migrations!
"Persist or update file migrations. Return the updated/inserted number
of rows"
[conn {:keys [id] :as file}]
(let [migrations (or (-> file meta ::fmg/migrated)
(-> file :migrations not-empty)
fmg/available-migrations)
columns [:file-id :name]
rows (mapv (fn [name] [id name]) migrations)]
(-> (db/insert-many! conn :file-migration columns rows
{::db/return-keys false
::sql/on-conflict-do-nothing true})
(db/get-update-count))))

View File

@@ -0,0 +1,31 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC
(ns app.features.logical-deletion
"A code related to handle logical deletion mechanism"
(:require
[app.config :as cf]
[app.util.time :as dt]))
(defn get-deletion-delay
"Calculate the next deleted-at for a resource (file, team, etc) in function
of team settings"
[team]
(if-let [subscription (get team :subscription)]
(cond
(and (= (:type subscription) "unlimited")
(= (:status subscription) "active"))
(dt/duration {:days 30})
(and (= (:type subscription) "enterprise")
(= (:status subscription) "active"))
(dt/duration {:days 90})
:else
(cf/get-deletion-delay))
(cf/get-deletion-delay)))

View File

@@ -42,8 +42,8 @@
(def default-params
{::port 6060
::host "0.0.0.0"
::max-body-size (* 1024 1024 30) ; default 30 MiB
::max-multipart-body-size (* 1024 1024 120)}) ; default 120 MiB
::max-body-size 31457280 ; default 30 MiB
::max-multipart-body-size 367001600}) ; default 350 MiB
(defmethod ig/expand-key ::server
[k v]
@@ -155,10 +155,10 @@
[["" {:middleware [[mw/server-timing]
[mw/params]
[mw/format-response]
[mw/parse-request]
[mw/errors errors/handle]
[session/soft-auth cfg]
[actoken/soft-auth cfg]
[mw/parse-request]
[mw/errors errors/handle]
[mw/restrict-methods]]}
(::mtx/routes cfg)

View File

@@ -7,9 +7,12 @@
(ns app.http.debug
(:refer-clojure :exclude [error-handler])
(:require
[app.binfile.common :as bfc]
[app.binfile.v1 :as bf.v1]
[app.binfile.v3 :as bf.v3]
[app.common.data :as d]
[app.common.exceptions :as ex]
[app.common.features :as cfeat]
[app.common.logging :as l]
[app.common.pprint :as pp]
[app.common.uuid :as uuid]
@@ -19,8 +22,9 @@
[app.rpc.commands.auth :as auth]
[app.rpc.commands.files-create :refer [create-file]]
[app.rpc.commands.profile :as profile]
[app.rpc.commands.teams :as teams]
[app.setup :as-alias setup]
[app.srepl.helpers :as srepl]
[app.srepl.main :as srepl]
[app.storage :as-alias sto]
[app.storage.tmp :as tmp]
[app.util.blob :as blob]
@@ -280,23 +284,23 @@
(ex/raise :type :validation
:code :missing-arguments))
(let [path (tmp/tempfile :prefix "penpot.export.")]
(let [path (tmp/tempfile :prefix "penpot.export." :min-age "30m")]
(with-open [output (io/output-stream path)]
(-> cfg
(assoc ::bf.v1/ids file-ids)
(assoc ::bf.v1/embed-assets embed?)
(assoc ::bf.v1/include-libraries libs?)
(bf.v1/export-files! output)))
(assoc ::bfc/ids file-ids)
(assoc ::bfc/embed-assets embed?)
(assoc ::bfc/include-libraries libs?)
(bf.v3/export-files! output)))
(if clone?
(let [profile (profile/get-profile pool profile-id)
project-id (:default-project-id profile)
cfg (assoc cfg
::bf.v1/overwrite false
::bf.v1/profile-id profile-id
::bf.v1/project-id project-id
::bf.v1/input path)]
(bf.v1/import-files! cfg)
::bfc/overwrite false
::bfc/profile-id profile-id
::bfc/project-id project-id
::bfc/input path)]
(bf.v3/import-files! cfg)
{::yres/status 200
::yres/headers {"content-type" "text/plain"}
::yres/body "OK CLONED"})
@@ -316,22 +320,27 @@
(let [profile (profile/get-profile pool profile-id)
project-id (:default-project-id profile)
overwrite? (contains? params :overwrite)
migrate? (contains? params :migrate)]
team (teams/get-team pool
:profile-id profile-id
:project-id project-id)]
(when-not project-id
(ex/raise :type :validation
:code :missing-project
:hint "project not found"))
(let [path (-> params :file :path)
cfg (assoc cfg
::bf.v1/overwrite overwrite?
::bf.v1/migrate migrate?
::bf.v1/profile-id profile-id
::bf.v1/project-id project-id
::bf.v1/input path)]
(bf.v1/import-files! cfg)
(let [path (-> params :file :path)
format (bfc/parse-file-format path)
cfg (assoc cfg
::bfc/profile-id profile-id
::bfc/project-id project-id
::bfc/input path
::bfc/features (cfeat/get-team-enabled-features cf/flags team))]
(if (= format :binfile-v3)
(bf.v3/import-files! cfg)
(bf.v1/import-files! cfg))
{::yres/status 200
::yres/headers {"content-type" "text/plain"}
::yres/body "OK"})))
@@ -421,6 +430,50 @@
::yres/body "OK"}))
(defn- add-team-feature
[{:keys [params] :as request}]
(let [team-id (some-> params :team-id d/parse-uuid)
feature (some-> params :feature str)
skip-check (contains? params :skip-check)]
(when-not (contains? params :force)
(ex/raise :type :validation
:code :missing-force
:hint "missing force checkbox"))
(when (nil? team-id)
(ex/raise :type :validation
:code :invalid-team-id
:hint "provided invalid team id"))
(srepl/enable-team-feature! team-id feature :skip-check skip-check)
{::yres/status 200
::yres/headers {"content-type" "text/plain"}
::yres/body "OK"}))
(defn- remove-team-feature
[{:keys [params] :as request}]
(let [team-id (some-> params :team-id d/parse-uuid)
feature (some-> params :feature str)
skip-check (contains? params :skip-check)]
(when-not (contains? params :force)
(ex/raise :type :validation
:code :missing-force
:hint "missing force checkbox"))
(when (nil? team-id)
(ex/raise :type :validation
:code :invalid-team-id
:hint "provided invalid team id"))
(srepl/disable-team-feature! team-id feature :skip-check skip-check)
{::yres/status 200
::yres/headers {"content-type" "text/plain"}
::yres/body "OK"}))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; OTHER SMALL VIEWS/HANDLERS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -491,6 +544,10 @@
{:handler (partial resend-email-notification cfg)}]
["/actions/reset-file-version"
{:handler (partial reset-file-version cfg)}]
["/actions/add-team-feature"
{:handler (partial add-team-feature)}]
["/actions/remove-team-feature"
{:handler (partial remove-team-feature)}]
["/file/export" {:handler (partial export-handler cfg)}]
["/file/import" {:handler (partial import-handler cfg)}]
["/file/data" {:handler (partial file-data-handler cfg)}]

View File

@@ -25,7 +25,6 @@
(let [claims (-> {}
(into (::session/token-claims request))
(into (::actoken/token-claims request)))]
{:request/path (:path request)
:request/method (:method request)
:request/params (:params request)
@@ -55,13 +54,17 @@
::yres/body (ex-data err)})
(defmethod handle-error :restriction
[err _ _]
[err request _]
(let [{:keys [code] :as data} (ex-data err)]
(if (= code :method-not-allowed)
{::yres/status 405
::yres/body data}
{::yres/status 400
::yres/body data})))
(binding [l/*context* (request->context request)]
(l/err :hint "restriction error"
:cause err)
{::yres/status 400
::yres/body data}))))
(defmethod handle-error :rate-limit
[err _ _]
@@ -99,7 +102,7 @@
(= code :invalid-image)
(binding [l/*context* (request->context request)]
(let [cause (or parent-cause err)]
(l/warn :hint "unexpected error on processing image" :cause cause)
(l/warn :hint "image process error" :cause cause)
{::yres/status 400 ::yres/body data}))
:else
@@ -174,7 +177,7 @@
(let [state (.getSQLState ^java.sql.SQLException error)
cause (or parent-cause error)]
(binding [l/*context* (request->context request)]
(l/error :hint "PSQL error"
(l/error :hint "postgresql error"
:cause cause)
(cond
(= state "57014")

View File

@@ -337,16 +337,17 @@
or (updated_at is null and
created_at < now() - ?::interval)")
(defmethod ig/init-key ::tasks/gc
[_ {:keys [::db/pool ::tasks/max-age] :as cfg}]
(l/debug :hint "initializing session gc task" :max-age max-age)
(fn [_]
(db/with-atomic [conn pool]
(let [interval (db/interval max-age)
result (db/exec-one! conn [sql:delete-expired interval interval])
result (:next.jdbc/update-count result)]
(l/debug :task "gc"
:hint "clean http sessions"
:deleted result)
result))))
(defn- collect-expired-tasks
[{:keys [::db/conn ::tasks/max-age]}]
(let [interval (db/interval max-age)
result (db/exec-one! conn [sql:delete-expired interval interval])
result (:next.jdbc/update-count result)]
(l/debug :task "gc"
:hint "clean http sessions"
:deleted result)
result))
(defmethod ig/init-key ::tasks/gc
[_ {:keys [::tasks/max-age] :as cfg}]
(l/debug :hint "initializing session gc task" :max-age max-age)
(fn [_] (db/tx-run! cfg collect-expired-tasks)))

View File

@@ -9,7 +9,6 @@
(:refer-clojure :exclude [tap])
(:require
[app.common.data :as d]
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.transit :as t]
[app.http.errors :as errors]
@@ -54,17 +53,20 @@
::yres/status 200
::yres/body (yres/stream-body
(fn [_ output]
(binding [events/*channel* (sp/chan :buf buf :xf (keep encode))]
(let [listener (events/start-listener
(partial write! output)
(partial pu/close! output))]
(try
(let [channel (sp/chan :buf buf :xf (keep encode))
listener (events/start-listener
channel
(partial write! output)
(partial pu/close! output))]
(try
(binding [events/*channel* channel]
(let [result (handler)]
(events/tap :end result))
(catch Throwable cause
(events/tap :error (errors/handle' cause request))
(when-not (ex/instance? java.io.EOFException cause)
(l/err :hint "unexpected error on processing sse response" :cause cause)))
(finally
(sp/close! events/*channel*)
(px/await! listener)))))))}))
(events/tap :end result)))
(catch Throwable cause
(let [result (errors/handle' cause request)]
(events/tap channel :error result)))
(finally
(sp/close! channel)
(px/await! listener))))))}))

View File

@@ -273,7 +273,7 @@
(defn- http-handler
[cfg {:keys [params ::session/profile-id] :as request}]
(let [session-id (some-> params :session-id sm/parse-uuid)]
(let [session-id (some-> params :session-id uuid/parse*)]
(when-not (uuid? session-id)
(ex/raise :type :validation
:code :missing-session-id

View File

@@ -108,6 +108,7 @@
[::ip-addr {:optional true} ::sm/text]
[::props {:optional true} [:map-of :keyword :any]]
[::context {:optional true} [:map-of :keyword :any]]
[::tracked-at {:optional true} ::sm/inst]
[::webhooks/event? {:optional true} ::sm/boolean]
[::webhooks/batch-timeout {:optional true} ::dt/duration]
[::webhooks/batch-key {:optional true}
@@ -118,12 +119,12 @@
(defn prepare-event
[cfg mdata params result]
(let [resultm (meta result)
request (-> params meta ::http/request)
profile-id (or (::profile-id resultm)
(:profile-id result)
(::rpc/profile-id params)
uuid/zero)
(let [resultm (meta result)
request (-> params meta ::http/request)
profile-id (or (::profile-id resultm)
(:profile-id result)
(::rpc/profile-id params)
uuid/zero)
session-id (get params ::rpc/external-session-id)
event-origin (get params ::rpc/external-event-origin)
@@ -135,14 +136,14 @@
(clean-props))
token-id (::actoken/id request)
context (-> (::context resultm)
(assoc :external-session-id session-id)
(assoc :external-event-origin event-origin)
(assoc :access-token-id (some-> token-id str))
(d/without-nils))
token-id (::actoken/id request)
context (-> (::context resultm)
(assoc :external-session-id session-id)
(assoc :external-event-origin event-origin)
(assoc :access-token-id (some-> token-id str))
(d/without-nils))
ip-addr (inet/parse-request request)]
ip-addr (inet/parse-request request)]
{::type (or (::type resultm)
(::rpc/type cfg))

View File

@@ -41,7 +41,7 @@
(if (or (instance? java.util.concurrent.CompletionException cause)
(instance? java.util.concurrent.ExecutionException cause))
(-> record
(assoc ::trace (ex/format-throwable cause :data? false :explain? false :header? false :summary? false))
(assoc ::trace (ex/format-throwable cause :data? true :explain? false :header? false :summary? false))
(assoc ::l/cause (ex-cause cause))
(record->report))
@@ -53,30 +53,34 @@
(assoc :logger/name logger)
(assoc :logger/level level)
(dissoc :request/params :value :params :data))]
(merge
{:context (-> (into (sorted-map) ctx)
(pp/pprint-str :length 50))
:props (pp/pprint-str props :length 50)
:hint (or (ex-message cause) @message)
:hint (or (when-let [message (ex-message cause)]
(if-let [props-hint (:hint props)]
(str props-hint ": " message)
message))
@message)
:trace (or (::trace record)
(ex/format-throwable cause :data? false :explain? false :header? false :summary? false))}
(some-> cause (ex/format-throwable :data? true :explain? false :header? false :summary? false)))}
(when-let [params (or (:request/params context) (:params context))]
{:params (pp/pprint-str params :length 30 :level 13)})
{:params (pp/pprint-str params :length 20 :level 20)})
(when-let [value (:value context)]
{:value (pp/pprint-str value :length 30 :level 12)})
{:value (pp/pprint-str value :length 30 :level 13)})
(when-let [data (some-> data (dissoc ::s/problems ::s/value ::s/spec ::sm/explain :hint))]
{:data (pp/pprint-str data :length 30 :level 12)})
{:data (pp/pprint-str data :length 30 :level 13)})
(when-let [explain (ex/explain data :length 30 :level 12)]
(when-let [explain (ex/explain data :length 30 :level 13)]
{:explain explain})))))
(defn error-record?
[{:keys [::l/level ::l/cause]}]
(and (= :error level)
(ex/exception? cause)))
[{:keys [::l/level]}]
(= :error level))
(defn- handle-event
[{:keys [::db/pool]} {:keys [::l/id] :as record}]

View File

@@ -15,6 +15,7 @@
[app.config :as cf]
[app.db :as db]
[app.http.client :as http]
[app.loggers.audit :as audit]
[app.util.time :as dt]
[app.worker :as wrk]
[clojure.data.json :as json]
@@ -67,18 +68,27 @@
(defmethod ig/init-key ::process-event-handler
[_ cfg]
(fn [{:keys [props] :as task}]
(l/dbg :hint "process webhook event" :name (:name props))
(when-let [items (lookup-webhooks cfg props)]
(l/trc :hint "webhooks found for event" :total (count items))
(db/tx-run! cfg (fn [cfg]
(doseq [item items]
(wrk/submit! (-> cfg
(assoc ::wrk/task :run-webhook)
(assoc ::wrk/queue :webhooks)
(assoc ::wrk/max-retries 3)
(assoc ::wrk/params {:event props
:config item})))))))))
(let [items (lookup-webhooks cfg props)
event {::audit/profile-id (:profile-id props)
::audit/name "webhook"
::audit/type "trigger"
::audit/props {:name (get props :name)
:event-id (get props :id)
:total-affected (count items)}}]
(audit/insert! cfg event)
(when items
(l/trc :hint "webhooks found for event" :total (count items))
(db/tx-run! cfg (fn [cfg]
(doseq [item items]
(wrk/submit! (-> cfg
(assoc ::wrk/task :run-webhook)
(assoc ::wrk/queue :webhooks)
(assoc ::wrk/max-retries 3)
(assoc ::wrk/params {:event props
:config item}))))))))))
;; --- RUN
(declare interpret-exception)

View File

@@ -25,7 +25,6 @@
[app.loggers.webhooks :as-alias webhooks]
[app.metrics :as-alias mtx]
[app.metrics.definition :as-alias mdef]
[app.migrations.v2 :as migrations.v2]
[app.msgbus :as-alias mbus]
[app.redis :as-alias rds]
[app.rpc :as-alias rpc]
@@ -41,7 +40,6 @@
[app.svgo :as-alias svgo]
[app.util.time :as dt]
[app.worker :as-alias wrk]
[cider.nrepl :refer [cider-nrepl-handler]]
[clojure.test :as test]
[clojure.tools.namespace.repl :as repl]
[cuerdas.core :as str]
@@ -606,14 +604,9 @@
(let [p (promise)]
(when (contains? cf/flags :nrepl-server)
(l/inf :hint "start nrepl server" :port 6064)
(nrepl/start-server :bind "0.0.0.0" :port 6064 :handler cider-nrepl-handler))
(nrepl/start-server :bind "0.0.0.0" :port 6064))
(start)
(when (contains? cf/flags :v2-migration)
(px/sleep 5000)
(migrations.v2/migrate app.main/system))
(deref p))
(catch Throwable cause
(ex/print-throwable cause)

View File

@@ -8,12 +8,11 @@
"Media & Font postprocessing."
(:require
[app.common.data :as d]
[app.common.data.macros :as dm]
[app.common.exceptions :as ex]
[app.common.media :as cm]
[app.common.schema :as sm]
[app.common.schema.openapi :as-alias oapi]
[app.common.spec :as us]
[app.common.svg :as csvg]
[app.config :as cf]
[app.db :as-alias db]
[app.storage :as-alias sto]
@@ -22,42 +21,41 @@
[buddy.core.bytes :as bb]
[buddy.core.codecs :as bc]
[clojure.java.shell :as sh]
[clojure.spec.alpha :as s]
[clojure.xml :as xml]
[cuerdas.core :as str]
[datoteka.fs :as fs]
[datoteka.io :as io])
(:import
clojure.lang.XMLHandler
java.io.InputStream
javax.xml.XMLConstants
javax.xml.parsers.SAXParserFactory
org.apache.commons.io.IOUtils
org.im4java.core.ConvertCmd
org.im4java.core.IMOperation
org.im4java.core.Info))
(s/def ::path fs/path?)
(s/def ::filename string?)
(s/def ::size integer?)
(s/def ::headers (s/map-of string? string?))
(s/def ::mtype string?)
(def schema:upload
(sm/register!
^{::sm/type ::upload}
[:map {:title "Upload"}
[:filename :string]
[:size ::sm/int]
[:path ::fs/path]
[:mtype {:optional true} :string]
[:headers {:optional true}
[:map-of :string :string]]]))
(s/def ::upload
(s/keys :req-un [::filename ::size ::path]
:opt-un [::mtype ::headers]))
(def ^:private schema:input
[:map {:title "Input"}
[:path ::fs/path]
[:mtype {:optional true} ::sm/text]])
;; A subset of fields from the ::upload spec
(s/def ::input
(s/keys :req-un [::path]
:opt-un [::mtype]))
(sm/register!
^{::sm/type ::upload}
[:map {:title "Upload"}
[:filename :string]
[:size ::sm/int]
[:path ::fs/path]
[:mtype {:optional true} :string]
[:headers {:optional true}
[:map-of :string :string]]])
(def ^:private check-input
(sm/check-fn schema:input))
(defn validate-media-type!
([upload] (validate-media-type! upload cm/valid-image-types))
([upload] (validate-media-type! upload cm/image-types))
([upload allowed]
(when-not (contains? allowed (:mtype upload))
(ex/raise :type :validation
@@ -97,17 +95,44 @@
(catch Throwable e
(process-error e))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; SVG PARSING
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn- secure-parser-factory
[^InputStream input ^XMLHandler handler]
(.. (doto (SAXParserFactory/newInstance)
(.setFeature XMLConstants/FEATURE_SECURE_PROCESSING true)
(.setFeature "http://apache.org/xml/features/disallow-doctype-decl" true))
(newSAXParser)
(parse input handler)))
(defn- strip-doctype
[data]
(cond-> data
(str/includes? data "<!DOCTYPE")
(str/replace #"<\!DOCTYPE[^>]*>" "")))
(defn- parse-svg
[text]
(let [text (strip-doctype text)]
(dm/with-open [istream (IOUtils/toInputStream text "UTF-8")]
(xml/parse istream secure-parser-factory))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; IMAGE THUMBNAILS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(s/def ::width integer?)
(s/def ::height integer?)
(s/def ::format #{:jpeg :webp :png})
(s/def ::quality #(< 0 % 101))
(def ^:private schema:thumbnail-params
[:map {:title "ThumbnailParams"}
[:input schema:input]
[:format [:enum :jpeg :webp :png]]
[:quality [:int {:min 1 :max 100}]]
[:width :int]
[:height :int]])
(s/def ::thumbnail-params
(s/keys :req-un [::input ::format ::width ::height]))
(def ^:private check-thumbnail-params
(sm/check-fn schema:thumbnail-params))
;; Related info on how thumbnails generation
;; http://www.imagemagick.org/Usage/thumbnails/
@@ -129,30 +154,38 @@
:data tmp)))
(defmethod process :generic-thumbnail
[{:keys [quality width height] :as params}]
(us/assert ::thumbnail-params params)
(let [op (doto (IMOperation.)
(.addImage)
(.autoOrient)
(.strip)
(.thumbnail ^Integer (int width) ^Integer (int height) ">")
(.quality (double quality))
(.addImage))]
(generic-process (assoc params :operation op))))
[params]
(let [{:keys [quality width height] :as params}
(check-thumbnail-params params)
operation
(doto (IMOperation.)
(.addImage)
(.autoOrient)
(.strip)
(.thumbnail ^Integer (int width) ^Integer (int height) ">")
(.quality (double quality))
(.addImage))]
(generic-process (assoc params :operation operation))))
(defmethod process :profile-thumbnail
[{:keys [quality width height] :as params}]
(us/assert ::thumbnail-params params)
(let [op (doto (IMOperation.)
(.addImage)
(.autoOrient)
(.strip)
(.thumbnail ^Integer (int width) ^Integer (int height) "^")
(.gravity "center")
(.extent (int width) (int height))
(.quality (double quality))
(.addImage))]
(generic-process (assoc params :operation op))))
[params]
(let [{:keys [quality width height] :as params}
(check-thumbnail-params params)
operation
(doto (IMOperation.)
(.addImage)
(.autoOrient)
(.strip)
(.thumbnail ^Integer (int width) ^Integer (int height) "^")
(.gravity "center")
(.extent (int width) (int height))
(.quality (double quality))
(.addImage))]
(generic-process (assoc params :operation operation))))
(defn get-basic-info-from-svg
[{:keys [tag attrs] :as data}]
@@ -184,10 +217,9 @@
(defmethod process :info
[{:keys [input] :as params}]
(us/assert ::input input)
(let [{:keys [path mtype]} input]
(let [{:keys [path mtype] :as input} (check-input input)]
(if (= mtype "image/svg+xml")
(let [info (some-> path slurp csvg/parse get-basic-info-from-svg)]
(let [info (some-> path slurp parse-svg get-basic-info-from-svg)]
(when-not info
(ex/raise :type :validation
:code :invalid-svg-file

View File

@@ -426,7 +426,19 @@
:fn (mg/resource "app/migrations/sql/0134-mod-file-change-table.sql")}
{:name "0135-mod-team-invitation-table.sql"
:fn (mg/resource "app/migrations/sql/0135-mod-team-invitation-table.sql")}])
:fn (mg/resource "app/migrations/sql/0135-mod-team-invitation-table.sql")}
{:name "0136-mod-comments-mentions.sql"
:fn (mg/resource "app/migrations/sql/0136-mod-comments-mentions.sql")}
{:name "0137-add-file-migration-table.sql"
:fn (mg/resource "app/migrations/sql/0137-add-file-migration-table.sql")}
{:name "0138-mod-file-data-fragment-table.sql"
:fn (mg/resource "app/migrations/sql/0138-mod-file-data-fragment-table.sql")}
{:name "0139-mod-file-change-table.sql"
:fn (mg/resource "app/migrations/sql/0139-mod-file-change-table.sql")}])
(defn apply-migrations!
[pool name migrations]

View File

@@ -0,0 +1,49 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC
(ns app.migrations.media-refs
"A media refs migration fixer script"
(:require
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.pprint]
[app.srepl.fixes.media-refs :refer [process-file]]
[app.srepl.main :as srepl]
[clojure.edn :as edn]))
(def ^:private required-services
[:app.storage.s3/backend
:app.storage.fs/backend
:app.storage/storage
:app.metrics/metrics
:app.db/pool
:app.worker/executor])
(defn -main
[& [options]]
(try
(let [config-var (requiring-resolve 'app.main/system-config)
start-var (requiring-resolve 'app.main/start-custom)
stop-var (requiring-resolve 'app.main/stop)
config (select-keys @config-var required-services)]
(start-var config)
(let [options (if (string? options)
(ex/ignoring (edn/read-string options))
{})]
(l/inf :hint "executing media-refs migration" :options options)
(srepl/process-files! process-file options))
(stop-var)
(System/exit 0))
(catch Throwable cause
(ex/print-throwable cause)
(flush)
(System/exit -1))))

View File

@@ -0,0 +1,3 @@
ALTER TABLE comment ADD COLUMN mentions uuid[] NULL DEFAULT '{}';
ALTER TABLE comment_thread ADD COLUMN mentions uuid[] NULL DEFAULT '{}';

View File

@@ -0,0 +1,7 @@
CREATE TABLE file_migration (
file_id uuid NOT NULL REFERENCES file(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
name text NOT NULL,
created_at timestamptz NOT NULL DEFAULT clock_timestamp(),
PRIMARY KEY(file_id, name)
);

View File

@@ -0,0 +1,2 @@
ALTER TABLE file_data_fragment
ALTER CONSTRAINT file_data_fragment_file_id_fkey DEFERRABLE INITIALLY DEFERRED;

View File

@@ -0,0 +1,5 @@
ALTER TABLE file_change
DROP CONSTRAINT file_change_file_id_fkey,
DROP CONSTRAINT file_change_profile_id_fkey,
ADD FOREIGN KEY (file_id) REFERENCES file(id) DEFERRABLE,
ADD FOREIGN KEY (profile_id) REFERENCES profile(id) ON DELETE SET NULL DEFERRABLE;

View File

@@ -1,103 +0,0 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC
(ns app.migrations.v2
(:require
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.db :as db]
[app.features.components-v2 :as feat]
[app.setup :as setup]
[app.util.time :as dt]))
(def ^:private sql:get-teams
"SELECT id, features,
row_number() OVER (ORDER BY created_at DESC) AS rown
FROM team
WHERE deleted_at IS NULL
AND (not (features @> '{components/v2}') OR features IS NULL)
ORDER BY created_at DESC")
(defn- get-teams
[conn]
(->> (db/cursor conn [sql:get-teams] {:chunk-size 1})
(map feat/decode-row)))
(defn- migrate-teams
[{:keys [::db/conn] :as system}]
;; Allow long running transaction for this connection
(db/exec-one! conn ["SET LOCAL idle_in_transaction_session_timeout = 0"])
;; Do not allow other migration running in the same time
(db/xact-lock! conn 0)
;; Run teams migration
(run! (fn [{:keys [id rown]}]
(try
(-> (assoc system ::db/rollback false)
(feat/migrate-team! id
:rown rown
:label "v2-migration"
:validate? false
:skip-on-graphics-error? true))
(catch Throwable _
(swap! feat/*stats* update :errors (fnil inc 0))
(l/wrn :hint "error on migrating team (skiping)"))))
(get-teams conn))
(setup/set-prop! system :v2-migrated true))
(defn migrate
[system]
(let [tpoint (dt/tpoint)
stats (atom {})
migrated? (setup/get-prop system :v2-migrated false)]
(when-not migrated?
(l/inf :hint "v2 migration started")
(try
(binding [feat/*stats* stats]
(db/tx-run! system migrate-teams))
(let [stats (deref stats)
elapsed (dt/format-duration (tpoint))]
(l/inf :hint "v2 migration finished"
:files (:processed-files stats)
:teams (:processed-teams stats)
:errors (:errors stats)
:elapsed elapsed))
(catch Throwable cause
(l/err :hint "error on aplying v2 migration" :cause cause))))))
(def ^:private required-services
[[:app.main/assets :app.storage.s3/backend]
[:app.main/assets :app.storage.fs/backend]
:app.storage/storage
:app.db/pool
:app.setup/props
:app.svgo/optimizer
:app.metrics/metrics
:app.migrations/migrations
:app.http.client/client])
(defn -main
[& _args]
(try
(let [config-var (requiring-resolve 'app.main/system-config)
start-var (requiring-resolve 'app.main/start-custom)
stop-var (requiring-resolve 'app.main/stop)
system-var (requiring-resolve 'app.main/system)
config (select-keys @config-var required-services)]
(start-var config)
(migrate @system-var)
(stop-var)
(System/exit 0))
(catch Throwable cause
(ex/print-throwable cause)
(flush)
(System/exit -1))))

View File

@@ -43,13 +43,8 @@
(decode-row token)))
(defn repl:create-access-token
[{:keys [::db/pool] :as system} profile-id name expiration]
(db/with-atomic [conn pool]
(let [props (:app.setup/props system)]
(create-access-token {::db/conn conn ::setup/props props}
profile-id
name
expiration))))
[cfg profile-id name expiration]
(db/tx-run! cfg create-access-token profile-id name expiration))
(def ^:private schema:create-access-token
[:map {:title "create-access-token"}

View File

@@ -92,9 +92,9 @@
[:string {:max 250}]
[::sm/one-of {:format "string"} valid-event-types]]]
[:props
[:map-of :keyword :any]]
[:map-of :keyword ::sm/any]]
[:context {:optional true}
[:map-of :keyword :any]]])
[:map-of :keyword ::sm/any]]])
(def schema:push-audit-events
[:map {:title "push-audit-events"}

View File

@@ -55,7 +55,7 @@
(contains? cf/flags :login-with-password))
(ex/raise :type :restriction
:code :login-disabled
:hint "login is disabled in this instance"))
:hint "login is disabled"))
(letfn [(check-password [cfg profile password]
(if (= (:password profile) "!")
@@ -79,7 +79,8 @@
:code :wrong-credentials))
(when (:is-blocked profile)
(ex/raise :type :restriction
:code :profile-blocked))
:code :profile-blocked
:hint "profile is marked as blocked"))
(when-not (check-password cfg profile password)
(ex/raise :type :validation
:code :wrong-credentials))
@@ -149,7 +150,7 @@
;; ---- COMMAND: Recover Profile
(defn recover-profile
[{:keys [::db/pool] :as cfg} {:keys [token password]}]
[{:keys [::db/conn] :as cfg} {:keys [token password]}]
(letfn [(validate-token [token]
(let [tdata (tokens/verify (::setup/props cfg) {:token token :iss :password-recovery})]
(:profile-id tdata)))
@@ -159,10 +160,10 @@
(db/update! conn :profile {:password pwd :is-active true} {:id profile-id})
nil))]
(db/with-atomic [conn pool]
(->> (validate-token token)
(update-password conn))
nil)))
(->> (validate-token token)
(update-password conn))
nil))
(def schema:recover-profile
[:map {:title "recover-profile"}
@@ -173,7 +174,8 @@
{::rpc/auth false
::doc/added "1.15"
::sm/params schema:recover-profile
::climit/id :auth/global}
::climit/id :auth/global
::db/transaction true}
[cfg params]
(recover-profile cfg params))
@@ -182,11 +184,11 @@
(defn- validate-register-attempt!
[cfg params]
(when (or
(not (contains? cf/flags :registration))
(not (contains? cf/flags :login-with-password)))
(when (or (not (contains? cf/flags :registration))
(not (contains? cf/flags :login-with-password)))
(ex/raise :type :restriction
:code :registration-disabled))
:code :registration-disabled
:hint "registration disabled"))
(when (contains? params :invitation-token)
(let [invitation (tokens/verify (::setup/props cfg)
@@ -200,12 +202,14 @@
(when (and (email.blacklist/enabled? cfg)
(email.blacklist/contains? cfg (:email params)))
(ex/raise :type :restriction
:code :email-domain-is-not-allowed))
:code :email-domain-is-not-allowed
:hint "email domain in blacklist"))
(when (and (email.whitelist/enabled? cfg)
(not (email.whitelist/contains? cfg (:email params))))
(ex/raise :type :restriction
:code :email-domain-is-not-allowed))
:code :email-domain-is-not-allowed
:hint "email domain not in whitelist"))
;; Perform a basic validation of email & password
(when (= (str/lower (:email params))
@@ -218,28 +222,30 @@
(ex/raise :type :restriction
:code :email-has-permanent-bounces
:email (:email params)
:hint "looks like the email has bounce reports"))
:hint "email has bounce reports"))
(when (eml/has-complaint-reports? cfg (:email params))
(ex/raise :type :restriction
:code :email-has-complaints
:email (:email params)
:hint "looks like the email has complaint reports")))
:hint "email has complaint reports")))
(defn prepare-register
[{:keys [::db/pool] :as cfg} {:keys [email] :as params}]
[{:keys [::db/pool] :as cfg} {:keys [fullname email accept-newsletter-updates] :as params}]
(validate-register-attempt! cfg params)
(let [email (profile/clean-email email)
profile (profile/get-profile-by-email pool email)
params {:email email
:fullname fullname
:password (:password params)
:invitation-token (:invitation-token params)
:backend "penpot"
:iss :prepared-register
:profile-id (:id profile)
:exp (dt/in-future {:days 7})}
:exp (dt/in-future {:days 7})
:props {:newsletter-updates (or accept-newsletter-updates false)}}
params (d/without-nils params)
token (tokens/generate (::setup/props cfg) params)]
@@ -249,8 +255,10 @@
(def schema:prepare-register-profile
[:map {:title "prepare-register-profile"}
[:fullname ::sm/text]
[:email ::sm/email]
[:password schema:password]
[:create-welcome-file {:optional true} :boolean]
[:invitation-token {:optional true} schema:token]])
(sv/defmethod ::prepare-register-profile
@@ -354,13 +362,9 @@
:extra-data ptoken})))
(defn register-profile
[{:keys [::db/conn ::wrk/executor] :as cfg} {:keys [token fullname theme] :as params}]
(let [theme (when (= theme "light") theme)
claims (tokens/verify (::setup/props cfg) {:token token :iss :prepared-register})
params (-> claims
(into params)
(assoc :fullname fullname)
(assoc :theme theme))
[{:keys [::db/conn ::wrk/executor] :as cfg} {:keys [token] :as params}]
(let [claims (tokens/verify (::setup/props cfg) {:token token :iss :prepared-register})
params (into claims params)
profile (if-let [profile-id (:profile-id claims)]
(profile/get-profile conn profile-id)
@@ -474,10 +478,7 @@
(def schema:register-profile
[:map {:title "register-profile"}
[:token schema:token]
[:fullname [::sm/word-string {:max 100}]]
[:theme {:optional true} [:string {:max 10}]]
[:create-welcome-file {:optional true} :boolean]])
[:token schema:token]])
(sv/defmethod ::register-profile
{::rpc/auth false

View File

@@ -7,10 +7,13 @@
(ns app.rpc.commands.binfile
(:refer-clojure :exclude [assert])
(:require
[app.binfile.common :as bfc]
[app.binfile.v1 :as bf.v1]
[app.binfile.v3 :as bf.v3]
[app.common.features :as cfeat]
[app.common.logging :as l]
[app.common.schema :as sm]
[app.config :as cf]
[app.db :as db]
[app.http.sse :as sse]
[app.loggers.audit :as-alias audit]
@@ -19,6 +22,7 @@
[app.rpc :as-alias rpc]
[app.rpc.commands.files :as files]
[app.rpc.commands.projects :as projects]
[app.rpc.commands.teams :as teams]
[app.rpc.doc :as-alias doc]
[app.tasks.file-gc]
[app.util.services :as sv]
@@ -34,7 +38,6 @@
(def ^:private
schema:export-binfile
[:map {:title "export-binfile"}
[:name [:string {:max 250}]]
[:file-id ::sm/uuid]
[:version {:optional true} ::sm/int]
[:include-libraries ::sm/boolean]
@@ -46,9 +49,9 @@
(fn [_ output-stream]
(try
(-> cfg
(assoc ::bf.v1/ids #{file-id})
(assoc ::bf.v1/embed-assets embed-assets)
(assoc ::bf.v1/include-libraries include-libraries)
(assoc ::bfc/ids #{file-id})
(assoc ::bfc/embed-assets embed-assets)
(assoc ::bfc/include-libraries include-libraries)
(bf.v1/export-files! output-stream))
(catch Throwable cause
(l/err :hint "exception on exporting file"
@@ -61,9 +64,9 @@
(fn [_ output-stream]
(try
(-> cfg
(assoc ::bf.v3/ids #{file-id})
(assoc ::bf.v3/embed-assets embed-assets)
(assoc ::bf.v3/include-libraries include-libraries)
(assoc ::bfc/ids #{file-id})
(assoc ::bfc/embed-assets embed-assets)
(assoc ::bfc/include-libraries include-libraries)
(bf.v3/export-files! output-stream))
(catch Throwable cause
(l/err :hint "exception on exporting file"
@@ -74,7 +77,7 @@
"Export a penpot file in a binary format."
{::doc/added "1.15"
::webhooks/event? true
::sm/result schema:export-binfile}
::sm/params schema:export-binfile}
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id version file-id] :as params}]
(files/check-read-permissions! pool profile-id file-id)
(fn [_]
@@ -90,41 +93,31 @@
;; --- Command: import-binfile
(defn- import-binfile-v1
[{:keys [::wrk/executor] :as cfg} {:keys [project-id profile-id name file]}]
(let [cfg (-> cfg
(assoc ::bf.v1/project-id project-id)
(assoc ::bf.v1/profile-id profile-id)
(assoc ::bf.v1/name name)
(assoc ::bf.v1/input (:path file)))]
;; NOTE: the importation process performs some operations that are
;; not very friendly with virtual threads, and for avoid
;; unexpected blocking of other concurrent operations we dispatch
;; that operation to a dedicated executor.
(px/invoke! executor (partial bf.v1/import-files! cfg))))
(defn- import-binfile-v3
[{:keys [::wrk/executor] :as cfg} {:keys [project-id profile-id name file]}]
(let [cfg (-> cfg
(assoc ::bf.v3/project-id project-id)
(assoc ::bf.v3/profile-id profile-id)
(assoc ::bf.v3/name name)
(assoc ::bf.v3/input (:path file)))]
;; NOTE: the importation process performs some operations that are
;; not very friendly with virtual threads, and for avoid
;; unexpected blocking of other concurrent operations we dispatch
;; that operation to a dedicated executor.
(px/invoke! executor (partial bf.v3/import-files! cfg))))
(defn- import-binfile
[{:keys [::db/pool] :as cfg} {:keys [project-id version] :as params}]
(let [result (case (int version)
1 (import-binfile-v1 cfg params)
3 (import-binfile-v3 cfg params))]
[{:keys [::db/pool ::wrk/executor] :as cfg} {:keys [profile-id project-id version name file]}]
(let [team (teams/get-team pool
:profile-id profile-id
:project-id project-id)
cfg (-> cfg
(assoc ::bfc/features (cfeat/get-team-enabled-features cf/flags team))
(assoc ::bfc/project-id project-id)
(assoc ::bfc/profile-id profile-id)
(assoc ::bfc/name name)
(assoc ::bfc/input (:path file)))
;; NOTE: the importation process performs some operations that are
;; not very friendly with virtual threads, and for avoid
;; unexpected blocking of other concurrent operations we dispatch
;; that operation to a dedicated executor.
result (case (int version)
1 (px/invoke! executor (partial bf.v1/import-files! cfg))
3 (px/invoke! executor (partial bf.v3/import-files! cfg)))]
(db/update! pool :project
{:modified-at (dt/now)}
{:id project-id})
{:id project-id}
{::db/return-keys false})
result))
(def ^:private schema:import-binfile
@@ -141,11 +134,18 @@
::webhooks/event? true
::sse/stream? true
::sm/params schema:import-binfile}
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id project-id version] :as params}]
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id project-id version file] :as params}]
(projects/check-edition-permissions! pool profile-id project-id)
(let [params (-> params
(assoc :profile-id profile-id)
(assoc :version (or version 1)))]
(let [version (or version 1)
params (-> params
(assoc :profile-id profile-id)
(assoc :version version))
manifest (case (int version)
1 nil
3 (bf.v3/get-manifest (:path file)))]
(with-meta
(sse/response (partial import-binfile cfg params))
{::audit/props {:file nil}})))
{::audit/props {:file nil
:generated-by (:generated-by manifest)
:referer (:referer manifest)}})))

View File

@@ -6,28 +6,153 @@
(ns app.rpc.commands.comments
(:require
[app.common.data :as d]
[app.common.data.macros :as dm]
[app.common.exceptions :as ex]
[app.common.geom.point :as gpt]
[app.common.schema :as sm]
[app.common.uri :as uri]
[app.common.uuid :as uuid]
[app.config :as cf]
[app.db :as db]
[app.db.sql :as sql]
[app.email :as eml]
[app.features.fdata :as feat.fdata]
[app.loggers.audit :as-alias audit]
[app.loggers.webhooks :as-alias webhooks]
[app.rpc :as-alias rpc]
[app.rpc.commands.files :as files]
[app.rpc.commands.profile :as profile]
[app.rpc.commands.teams :as teams]
[app.rpc.doc :as-alias doc]
[app.rpc.quotes :as quotes]
[app.rpc.retry :as rtry]
[app.util.pointer-map :as pmap]
[app.util.services :as sv]
[app.util.time :as dt]))
[app.util.time :as dt]
[clojure.set :as set]
[cuerdas.core :as str]))
;; --- GENERAL PURPOSE INTERNAL HELPERS
(def r-mentions-split #"@\[[^\]]*\]\([^\)]*\)")
(def r-mentions #"@\[([^\]]*)\]\(([^\)]*)\)")
(def comment-max-length 750)
(defn- format-comment
[{:keys [content]}]
(->> (d/interleave-all
(str/split content r-mentions-split)
(->> (re-seq r-mentions content)
(map (fn [[_ user _]] user))))
(str/join "")))
(defn- format-comment-url
[thread file]
(str/ffmt "%/#/workspace?%"
(cf/get :public-uri)
(uri/map->query-string
{:file-id (:id file)
:page-id (:page-id file)
:team-id (:team-id file)
:comment-id (:id thread)})))
(defn- format-comment-ref
[thread file]
(str/ffmt "#%, %, %"
(:seqn thread)
(:name file)
(:page-name file)))
(defn- get-team-users
[conn team-id]
(->> (teams/get-users+props conn team-id)
(map profile/decode-row)
(d/index-by :id)))
(defn- notification-email?
[profile-id owner-id props]
(if (= profile-id owner-id)
(not= :none (-> props :notifications :email-comments))
(= :all (-> props :notifications :email-comments))))
(defn- mention-email?
[props]
(not= :none (-> props :notifications :email-comments)))
(defn send-comment-emails!
[conn profile comment thread file]
(let [team-users (get-team-users conn (:team-id file))
comment-reference (format-comment-ref thread file)
comment-content (format-comment comment)
comment-url (format-comment-url thread file)
profile-id (get profile :id)
;; Users mentioned in this comment
comment-mentions
(-> (:mentions comment)
(disj profile-id))
;; Users mentioned in this thread
thread-mentions
(-> (:mentions thread)
;; Remove the mentions in the comment because we're already sending a
;; notification
(set/difference comment-mentions)
(disj profile-id))
;; All users
notificate-users-ids
(-> (set (keys team-users))
(set/difference comment-mentions)
(set/difference thread-mentions)
(disj profile-id))]
(doseq [mention comment-mentions]
(let [{:keys [fullname email props]} (get team-users mention)]
(when (mention-email? props)
(eml/send!
{::eml/conn conn
::eml/factory eml/comment-mention
:public-uri (cf/get :public-uri)
:to email
:name fullname
:source-user (:fullname profile)
:comment-reference comment-reference
:comment-content comment-content
:comment-url comment-url}))))
;; Send to the thread users
(doseq [mention thread-mentions]
(let [{:keys [fullname email props]} (get team-users mention)]
(when (mention-email? props)
(eml/send!
{::eml/conn conn
::eml/factory eml/comment-thread
:public-uri (cf/get :public-uri)
:to email
:name fullname
:source-user (:fullname profile)
:comment-reference comment-reference
:comment-content comment-content
:comment-url comment-url}))))
;; Send to users with the "all" flag activated
(doseq [user-id notificate-users-ids]
(let [{:keys [id fullname email props]} (get team-users user-id)]
(when (notification-email? id (:owner-id thread) props)
(eml/send!
{::eml/conn conn
::eml/factory eml/comment-notification
:public-uri (cf/get :public-uri)
:to email
:name fullname
:source-user (:fullname profile)
:comment-reference comment-reference
:comment-content comment-content
:comment-url comment-url}))))))
(defn- decode-row
[{:keys [participants position mentions] :as row}]
(cond-> row
@@ -38,14 +163,15 @@
(def xf-decode-row
(map decode-row))
(def ^:privateqpage-name
(def ^:private
sql:get-file
"select f.id, f.modified_at, f.revn, f.features,
f.project_id, p.team_id, f.data
from file as f
join project as p on (p.id = f.project_id)
where f.id = ?
and f.deleted_at is null")
"SELECT f.id, f.modified_at, f.revn, f.features, f.name,
f.project_id, p.team_id, f.data,
f.data_ref_id, f.data_backend
FROM file as f
INNER JOIN project as p on (p.id = f.project_id)
WHERE f.id = ?
AND (f.deleted_at IS NULL OR f.deleted_at > now())")
(defn- get-file
"A specialized version of get-file for comments module."
@@ -57,12 +183,16 @@
:hint "file not found"))
(binding [pmap/*load-fn* (partial feat.fdata/load-pointer cfg file-id)]
(let [{:keys [data] :as file} (files/decode-row file)]
(let [file (->> file
(files/decode-row)
(feat.fdata/resolve-file-data cfg))
data (get file :data)]
(-> file
(assoc :page-name (dm/get-in data [:pages-index page-id :name]))
(assoc :page-id page-id)
(dissoc :data))))))
;; FIXME: rename
(defn- get-comment-thread
[conn thread-id & {:as opts}]
(-> (db/get-by-id conn :comment-thread thread-id opts)
@@ -92,7 +222,7 @@
(defn upsert-comment-thread-status!
([conn profile-id thread-id]
(upsert-comment-thread-status! conn profile-id thread-id (dt/now)))
(upsert-comment-thread-status! conn profile-id thread-id (dt/in-future "1s")))
([conn profile-id thread-id mod-at]
(db/exec-one! conn [sql:upsert-comment-thread-status thread-id profile-id mod-at mod-at])))
@@ -117,36 +247,42 @@
{::doc/added "1.15"
::sm/params schema:get-comment-threads}
[cfg {:keys [::rpc/profile-id file-id share-id] :as params}]
(db/run! cfg (fn [{:keys [::db/conn]}]
(files/check-comment-permissions! conn profile-id file-id share-id)
(get-comment-threads conn profile-id file-id))))
(def ^:private sql:comment-threads
"select distinct on (ct.id)
"SELECT DISTINCT ON (ct.id)
ct.*,
f.name as file_name,
f.project_id as project_id,
first_value(c.content) over w as content,
(select count(1)
from comment as c
where c.thread_id = ct.id) as count_comments,
(select count(1)
from comment as c
where c.thread_id = ct.id
and c.created_at >= coalesce(cts.modified_at, ct.created_at)) as count_unread_comments
from comment_thread as ct
inner join comment as c on (c.thread_id = ct.id)
inner join file as f on (f.id = ct.file_id)
left join comment_thread_status as cts
on (cts.thread_id = ct.id and
cts.profile_id = ?)
where ct.file_id = ?
window w as (partition by c.thread_id order by c.created_at asc)")
pf.fullname AS owner_fullname,
pf.email AS owner_email,
pf.photo_id AS owner_photo_id,
p.team_id AS team_id,
f.name AS file_name,
f.project_id AS project_id,
first_value(c.content) OVER w AS content,
(SELECT count(1)
FROM comment AS c
WHERE c.thread_id = ct.id) AS count_comments,
(SELECT count(1)
FROM comment AS c
WHERE c.thread_id = ct.id
AND c.created_at >= coalesce(cts.modified_at, ct.created_at)) AS count_unread_comments
FROM comment_thread AS ct
INNER JOIN comment AS c ON (c.thread_id = ct.id)
INNER JOIN file AS f ON (f.id = ct.file_id)
INNER JOIN project AS p ON (p.id = f.project_id)
LEFT JOIN comment_thread_status AS cts ON (cts.thread_id = ct.id AND cts.profile_id = ?)
LEFT JOIN profile AS pf ON (ct.owner_id = pf.id)
WINDOW w AS (PARTITION BY c.thread_id ORDER BY c.created_at ASC)")
(def ^:private sql:comment-threads-by-file-id
(str "WITH threads AS (" sql:comment-threads ")"
"SELECT * FROM threads WHERE file_id = ?"))
(defn- get-comment-threads
[conn profile-id file-id]
(->> (db/exec! conn [sql:comment-threads profile-id file-id])
(->> (db/exec! conn [sql:comment-threads-by-file-id profile-id file-id])
(into [] xf-decode-row)))
;; --- COMMAND: Get Unread Comment Threads
@@ -162,41 +298,41 @@
{::doc/added "1.15"
::sm/params schema:get-unread-comment-threads}
[cfg {:keys [::rpc/profile-id team-id] :as params}]
(db/run! cfg (fn [{:keys [::db/conn]}]
(teams/check-read-permissions! conn profile-id team-id)
(get-unread-comment-threads conn profile-id team-id))))
(db/run!
cfg
(fn [{:keys [::db/conn]}]
(teams/check-read-permissions! conn profile-id team-id)
(get-unread-comment-threads conn profile-id team-id))))
(def sql:comment-threads-by-team
"select distinct on (ct.id)
ct.*,
f.name as file_name,
f.project_id as project_id,
first_value(c.content) over w as content,
(select count(1)
from comment as c
where c.thread_id = ct.id) as count_comments,
(select count(1)
from comment as c
where c.thread_id = ct.id
and c.created_at >= coalesce(cts.modified_at, ct.created_at)) as count_unread_comments
from comment_thread as ct
inner join comment as c on (c.thread_id = ct.id)
inner join file as f on (f.id = ct.file_id)
inner join project as p on (p.id = f.project_id)
left join comment_thread_status as cts
on (cts.thread_id = ct.id and
cts.profile_id = ?)
where p.team_id = ?
window w as (partition by c.thread_id order by c.created_at asc)")
(def sql:unread-all-comment-threads-by-team
(str "WITH threads AS (" sql:comment-threads ")"
"SELECT * FROM threads WHERE count_unread_comments > 0 AND team_id = ?"))
(def sql:unread-comment-threads-by-team
(str "with threads as (" sql:comment-threads-by-team ")"
"select * from threads where count_unread_comments > 0"))
;; The partial configuration will retrieve only comments created by the user and
;; threads that have a mention to the user.
(def sql:unread-partial-comment-threads-by-team
(str "WITH threads AS (" sql:comment-threads ")"
"SELECT * FROM threads
WHERE count_unread_comments > 0
AND team_id = ?
AND (owner_id = ? OR ? = ANY(mentions))"))
(defn- get-unread-comment-threads
[conn profile-id team-id]
(->> (db/exec! conn [sql:unread-comment-threads-by-team profile-id team-id])
(into [] xf-decode-row)))
(let [profile (-> (db/get conn :profile {:id profile-id})
(profile/decode-row))
notify (or (-> profile :props :notifications :dashboard-comments) :all)]
(case notify
:all
(->> (db/exec! conn [sql:unread-all-comment-threads-by-team profile-id team-id])
(into [] xf-decode-row))
:partial
(->> (db/exec! conn [sql:unread-partial-comment-threads-by-team profile-id team-id profile-id profile-id])
(into [] xf-decode-row))
[])))
;; --- COMMAND: Get Single Comment Thread
@@ -213,9 +349,9 @@
[cfg {:keys [::rpc/profile-id file-id id share-id] :as params}]
(db/run! cfg (fn [{:keys [::db/conn]}]
(files/check-comment-permissions! conn profile-id file-id share-id)
(let [sql (str "with threads as (" sql:comment-threads ")"
"select * from threads where id = ?")]
(-> (db/exec-one! conn [sql profile-id file-id id])
(let [sql (str "WITH threads AS (" sql:comment-threads ")"
"SELECT * FROM threads WHERE id = ? AND file_id = ?")]
(-> (db/exec-one! conn [sql profile-id id file-id])
(decode-row))))))
;; --- COMMAND: Retrieve Comments
@@ -233,15 +369,25 @@
::sm/params schema:get-comments}
[cfg {:keys [::rpc/profile-id thread-id share-id]}]
(db/run! cfg (fn [{:keys [::db/conn]}]
(let [{:keys [file-id] :as thread} (get-comment-thread conn thread-id)]
(let [{:keys [file-id]} (get-comment-thread conn thread-id)]
(files/check-comment-permissions! conn profile-id file-id share-id)
(get-comments conn thread-id)))))
(def sql:get-comments
"SELECT c.*,
ct.file_id AS file_id,
pf.fullname AS owner_fullname,
pf.email AS owner_email,
pf.photo_id AS owner_photo_id
FROM comment AS c
INNER JOIN comment_thread AS ct ON (ct.id = c.thread_id)
LEFT JOIN profile AS pf ON (c.owner_id = pf.id)
WHERE c.thread_id = ?
ORDER BY c.created_at ASC")
(defn- get-comments
[conn thread-id]
(->> (db/query conn :comment
{:thread-id thread-id}
{:order-by [[:created-at :asc]]})
(->> (db/exec! conn [sql:get-comments thread-id])
(into [] xf-decode-row)))
;; --- COMMAND: Get file comments users
@@ -298,10 +444,25 @@
[:map {:title "create-comment-thread"}
[:file-id ::sm/uuid]
[:position ::gpt/point]
[:content [:string {:max 750}]]
[:content [:string {:max comment-max-length}]]
[:page-id ::sm/uuid]
[:frame-id ::sm/uuid]
[:share-id {:optional true} [:maybe ::sm/uuid]]])
[:share-id {:optional true} [:maybe ::sm/uuid]]
[:mentions {:optional true} [::sm/set ::sm/uuid]]])
(defn- update-thread-seqn
[conn file-id seqn]
(db/update! conn :file
{:comment-thread-seqn seqn}
{:id file-id}
{::db/return-keys false}))
(defn add-owner
[thread-or-comment profile]
(-> thread-or-comment
(assoc :owner-fullname (:fullname profile))
(assoc :owner-email (:email profile))
(assoc :owner-photo-id (:photo-id profile))))
(sv/defmethod ::create-comment-thread
{::doc/added "1.15"
@@ -309,11 +470,10 @@
::rtry/enabled true
::rtry/when rtry/conflict-exception?
::sm/params schema:create-comment-thread}
[cfg {:keys [::rpc/profile-id ::rpc/request-at file-id page-id share-id position content frame-id]}]
[cfg {:keys [::rpc/profile-id file-id page-id share-id] :as params}]
(files/check-comment-permissions! cfg profile-id file-id share-id)
(let [{:keys [team-id project-id page-name]} (get-file cfg file-id page-id)]
(let [{:keys [team-id project-id] :as file} (get-file cfg file-id page-id)]
(-> cfg
(assoc ::quotes/profile-id profile-id)
(assoc ::quotes/team-id team-id)
@@ -322,21 +482,14 @@
(quotes/check! {::quotes/id ::quotes/comment-threads-per-file}
{::quotes/id ::quotes/comments-per-file}))
(let [params {:created-at request-at
:profile-id profile-id
:file-id file-id
:page-id page-id
:page-name page-name
:position position
:content content
:frame-id frame-id}
(let [params (assoc params ::file file)
thread (db/tx-run! cfg create-comment-thread params)]
(vary-meta thread assoc ::audit/props thread))))
(defn- create-comment-thread
[{:keys [::db/conn] :as cfg}
{:keys [profile-id file-id page-id page-name created-at position content frame-id]}]
{:keys [::rpc/profile-id ::rpc/request-at ::file position content mentions frame-id] :as params}]
(let [;; NOTE: we take the next seq number from a separate query
;; because we need to lock the file for avoid race conditions
@@ -347,39 +500,47 @@
;; different storage (example: redis) for alivate the update
;; pression on the file table
seqn (get-next-seqn conn file-id)
profile (profile/get-profile conn profile-id)
seqn (get-next-seqn conn (:id file))
file-id (get file :id)
thread-id (uuid/next)
thread (db/insert! conn :comment-thread
{:id thread-id
:file-id file-id
:owner-id profile-id
:participants (db/tjson #{profile-id})
:page-name page-name
:page-id page-id
:created-at created-at
:modified-at created-at
:seqn seqn
:position (db/pgpoint position)
:frame-id frame-id})
comment (db/insert! conn :comment
{:id (uuid/next)
:thread-id thread-id
:owner-id profile-id
:created-at created-at
:modified-at created-at
:content content})]
thread (-> (db/insert! conn :comment-thread
{:id thread-id
:file-id file-id
:page-name (:page-name file)
:page-id (:page-id file)
:owner-id profile-id
:participants (db/tjson #{profile-id})
:created-at request-at
:modified-at request-at
:seqn seqn
:frame-id frame-id
:position (db/pgpoint position)
:mentions (db/encode-pgarray mentions conn "uuid")})
(decode-row))
comment (-> (db/insert! conn :comment
{:id (uuid/next)
:thread-id thread-id
:owner-id profile-id
:created-at request-at
:modified-at request-at
:mentions (db/encode-pgarray mentions conn "uuid")
:content content})
(decode-row))]
;; Make the current thread as read.
(upsert-comment-thread-status! conn profile-id thread-id created-at)
(upsert-comment-thread-status! conn profile-id thread-id request-at)
;; Optimistic update of current seq number on file.
(db/update! conn :file
{:comment-thread-seqn seqn}
{:id file-id}
{::db/return-keys false})
(update-thread-seqn conn file-id seqn)
;; Send mentions emails
(send-comment-emails! conn profile comment thread file)
(-> thread
(select-keys [:id :file-id :page-id])
(add-owner profile)
(assoc :comment-id (:id comment)))))
;; --- COMMAND: Update Comment Thread Status
@@ -392,12 +553,12 @@
(sv/defmethod ::update-comment-thread-status
{::doc/added "1.15"
::sm/params schema:update-comment-thread-status}
[cfg {:keys [::rpc/profile-id id share-id]}]
(db/tx-run! cfg (fn [{:keys [::db/conn]}]
(let [{:keys [file-id] :as thread} (get-comment-thread conn id ::sql/for-update true)]
(files/check-comment-permissions! conn profile-id file-id share-id)
(upsert-comment-thread-status! conn profile-id id)))))
::sm/params schema:update-comment-thread-status
::db/transaction true}
[{:keys [::db/conn]} {:keys [::rpc/profile-id id share-id]}]
(let [{:keys [file-id]} (get-comment-thread conn id ::sql/for-update true)]
(files/check-comment-permissions! conn profile-id file-id share-id)
(upsert-comment-thread-status! conn profile-id id)))
;; --- COMMAND: Update Comment Thread
@@ -410,77 +571,85 @@
(sv/defmethod ::update-comment-thread
{::doc/added "1.15"
::sm/params schema:update-comment-thread}
[cfg {:keys [::rpc/profile-id id is-resolved share-id]}]
(db/tx-run! cfg (fn [{:keys [::db/conn]}]
(let [{:keys [file-id] :as thread} (get-comment-thread conn id ::sql/for-update true)]
(files/check-comment-permissions! conn profile-id file-id share-id)
(db/update! conn :comment-thread
{:is-resolved is-resolved}
{:id id})
nil))))
::sm/params schema:update-comment-thread
::db/transaction true}
[{:keys [::db/conn]} {:keys [::rpc/profile-id id is-resolved share-id]}]
(let [{:keys [file-id]} (get-comment-thread conn id ::sql/for-update true)]
(files/check-comment-permissions! conn profile-id file-id share-id)
(db/update! conn :comment-thread
{:is-resolved is-resolved}
{:id id})
nil))
;; --- COMMAND: Add Comment
(declare ^:private get-comment-thread)
(def ^:private
schema:create-comment
[:map {:title "create-comment"}
[:thread-id ::sm/uuid]
[:content [:string {:max 250}]]
[:share-id {:optional true} [:maybe ::sm/uuid]]])
[:content [:string {:max comment-max-length}]]
[:share-id {:optional true} [:maybe ::sm/uuid]]
[:mentions {:optional true} [::sm/set ::sm/uuid]]])
(sv/defmethod ::create-comment
{::doc/added "1.15"
::webhooks/event? true
::sm/params schema:create-comment}
[cfg {:keys [::rpc/profile-id ::rpc/request-at thread-id share-id content]}]
(db/tx-run! cfg
(fn [{:keys [::db/conn] :as cfg}]
(let [{:keys [file-id page-id] :as thread} (get-comment-thread conn thread-id ::sql/for-update true)
{:keys [team-id project-id page-name] :as file} (get-file cfg file-id page-id)]
::sm/params schema:create-comment
::db/transaction true}
[{:keys [::db/conn] :as cfg} {:keys [::rpc/profile-id ::rpc/request-at thread-id share-id content mentions]}]
(let [{:keys [file-id page-id] :as thread}
(get-comment-thread conn thread-id ::sql/for-update true)
(files/check-comment-permissions! conn profile-id file-id share-id)
(quotes/check! cfg {::quotes/id ::quotes/comments-per-file
::quotes/profile-id profile-id
::quotes/team-id team-id
::quotes/project-id project-id
::quotes/file-id file-id})
{:keys [team-id project-id] :as file}
(get-file cfg file-id page-id)]
;; Update the page-name cached attribute on comment thread table.
(when (not= page-name (:page-name thread))
(db/update! conn :comment-thread
{:page-name page-name}
{:id thread-id}))
(files/check-comment-permissions! conn profile-id file-id share-id)
(let [comment (db/insert! conn :comment
{:id (uuid/next)
:created-at request-at
:modified-at request-at
:thread-id thread-id
:owner-id profile-id
:content content})
comment (decode-row comment)
props {:file-id file-id
:share-id nil}]
(quotes/check! cfg {::quotes/id ::quotes/comments-per-file
::quotes/profile-id profile-id
::quotes/team-id team-id
::quotes/project-id project-id
::quotes/file-id file-id})
;; Update thread modified-at attribute and assoc the current
;; profile to the participant set.
(db/update! conn :comment-thread
{:modified-at request-at
:participants (-> (:participants thread #{})
(conj profile-id)
(db/tjson))}
{:id thread-id})
(let [profile (profile/get-profile conn profile-id)
mentions (into #{} mentions)
params {:id (uuid/next)
:created-at request-at
:modified-at request-at
:thread-id thread-id
:owner-id profile-id
:content content
:mentions (db/encode-pgarray mentions conn "uuid")}
;; Update the current profile status in relation to the
;; current thread.
(upsert-comment-thread-status! conn profile-id thread-id request-at)
comment (-> (db/insert! conn :comment params)
(decode-row)
(assoc :file-id file-id)
(add-owner profile))]
(vary-meta comment assoc ::audit/props props))))))
;; Update thread modified-at attribute and assoc the current
;; profile to the participant set.
(let [mentions (into (:mentions thread) mentions)
participants (-> (:participants thread #{})
(conj profile-id))
params {:modified-at request-at
:participants (db/tjson participants)
:mentions (db/encode-pgarray mentions conn "uuid")}
;; Update the page-name cached attribute on comment thread table.
params (cond-> params
(not= (:page-name file) (:page-name thread))
(assoc :page-name (:page-name file)))]
(db/update! conn :comment-thread params
{:id thread-id}
{::db/return-keys false}))
;; Update the current profile status in relation to the current thread
(upsert-comment-thread-status! conn profile-id thread-id)
(send-comment-emails! conn profile comment thread file)
(vary-meta comment assoc ::audit/props comment))))
;; --- COMMAND: Update Comment
@@ -488,36 +657,47 @@
schema:update-comment
[:map {:title "update-comment"}
[:id ::sm/uuid]
[:content [:string {:max 250}]]
[:share-id {:optional true} [:maybe ::sm/uuid]]])
[:content [:string {:max comment-max-length}]]
[:share-id {:optional true} [:maybe ::sm/uuid]]
[:mentions {:optional true} [::sm/set ::sm/uuid]]])
;; TODO: Check if there are new mentions, if there are send the new emails.
(sv/defmethod ::update-comment
{::doc/added "1.15"
::sm/params schema:update-comment}
[cfg {:keys [::rpc/profile-id ::rpc/request-at id share-id content]}]
(db/tx-run! cfg
(fn [{:keys [::db/conn] :as cfg}]
(let [{:keys [thread-id owner-id] :as comment} (get-comment conn id ::sql/for-update true)
{:keys [file-id page-id] :as thread} (get-comment-thread conn thread-id ::sql/for-update true)]
::sm/params schema:update-comment
::db/transaction true}
[{:keys [::db/conn] :as cfg} {:keys [::rpc/profile-id ::rpc/request-at id share-id content mentions]}]
(let [{:keys [thread-id owner-id] :as comment}
(get-comment conn id ::sql/for-update true)
(files/check-comment-permissions! conn profile-id file-id share-id)
{:keys [file-id page-id] :as thread}
(get-comment-thread conn thread-id ::sql/for-update true)]
;; Don't allow edit comments to not owners
(when-not (= owner-id profile-id)
(ex/raise :type :validation
:code :not-allowed))
(files/check-comment-permissions! conn profile-id file-id share-id)
(let [{:keys [page-name]} (get-file cfg file-id page-id)]
(db/update! conn :comment
{:content content
:modified-at request-at}
{:id id})
;; Don't allow edit comments to not owners
(when-not (= owner-id profile-id)
(ex/raise :type :validation
:code :not-allowed))
(db/update! conn :comment-thread
{:modified-at request-at
:page-name page-name}
{:id thread-id})
nil)))))
(let [{:keys [page-name]} (get-file cfg file-id page-id)]
(db/update! conn :comment
{:content content
:modified-at request-at
:mentions (db/encode-pgarray mentions conn "uuid")}
{:id id})
(db/update! conn :comment-thread
{:modified-at request-at
:page-name page-name
:mentions
(-> (:mentions thread)
(into mentions)
(db/encode-pgarray conn "uuid"))}
{:id thread-id}
{::db/return-keys false})
nil)))
;; --- COMMAND: Delete Comment Thread
@@ -529,17 +709,18 @@
(sv/defmethod ::delete-comment-thread
{::doc/added "1.15"
::sm/params schema:delete-comment-thread}
[cfg {:keys [::rpc/profile-id id share-id]}]
(db/tx-run! cfg (fn [{:keys [::db/conn]}]
(let [{:keys [owner-id file-id] :as thread} (get-comment-thread conn id ::sql/for-update true)]
(files/check-comment-permissions! conn profile-id file-id share-id)
(when-not (= owner-id profile-id)
(ex/raise :type :validation
:code :not-allowed))
::sm/params schema:delete-comment-thread
::db/transaction true}
[{:keys [::db/conn]} {:keys [::rpc/profile-id id share-id]}]
(let [{:keys [owner-id file-id] :as thread} (get-comment-thread conn id ::sql/for-update true)]
(files/check-comment-permissions! conn profile-id file-id share-id)
(when-not (= owner-id profile-id)
(ex/raise :type :validation
:code :not-allowed))
(db/delete! conn :comment-thread {:id id})
nil))))
(db/delete! conn :comment-thread {:id id}
{::db/return-keys false})
nil))
;; --- COMMAND: Delete comment
@@ -551,17 +732,23 @@
(sv/defmethod ::delete-comment
{::doc/added "1.15"
::sm/params schema:delete-comment}
[cfg {:keys [::rpc/profile-id id share-id]}]
(db/tx-run! cfg (fn [{:keys [::db/conn]}]
(let [{:keys [owner-id thread-id] :as comment} (get-comment conn id ::sql/for-update true)
{:keys [file-id] :as thread} (get-comment-thread conn thread-id)]
(files/check-comment-permissions! conn profile-id file-id share-id)
(when-not (= owner-id profile-id)
(ex/raise :type :validation
:code :not-allowed))
(db/delete! conn :comment {:id id})
nil))))
::sm/params schema:delete-comment
::db/transaction true}
[{:keys [::db/conn]} {:keys [::rpc/profile-id id share-id]}]
(let [{:keys [owner-id thread-id] :as comment}
(get-comment conn id ::sql/for-update true)
{:keys [file-id]}
(get-comment-thread conn thread-id)]
(files/check-comment-permissions! conn profile-id file-id share-id)
(when-not (= owner-id profile-id)
(ex/raise :type :validation
:code :not-allowed))
(db/delete! conn :comment {:id id}
{::db/return-keys false})
nil))
;; --- COMMAND: Update comment thread position
@@ -575,17 +762,18 @@
(sv/defmethod ::update-comment-thread-position
{::doc/added "1.15"
::sm/params schema:update-comment-thread-position}
[cfg {:keys [::rpc/profile-id ::rpc/request-at id position frame-id share-id]}]
(db/tx-run! cfg (fn [{:keys [::db/conn]}]
(let [{:keys [file-id] :as thread} (get-comment-thread conn id ::sql/for-update true)]
(files/check-comment-permissions! conn profile-id file-id share-id)
(db/update! conn :comment-thread
{:modified-at request-at
:position (db/pgpoint position)
:frame-id frame-id}
{:id (:id thread)})
nil))))
::sm/params schema:update-comment-thread-position
::db/transaction true}
[{:keys [::db/conn]} {:keys [::rpc/profile-id ::rpc/request-at id position frame-id share-id]}]
(let [{:keys [file-id]} (get-comment-thread conn id ::sql/for-update true)]
(files/check-comment-permissions! conn profile-id file-id share-id)
(db/update! conn :comment-thread
{:modified-at request-at
:position (db/pgpoint position)
:frame-id frame-id}
{:id id}
{::db/return-keys false})
nil))
;; --- COMMAND: Update comment frame
@@ -598,13 +786,29 @@
(sv/defmethod ::update-comment-thread-frame
{::doc/added "1.15"
::sm/params schema:update-comment-thread-frame}
[cfg {:keys [::rpc/profile-id ::rpc/request-at id frame-id share-id]}]
(db/tx-run! cfg (fn [{:keys [::db/conn]}]
(let [{:keys [file-id] :as thread} (get-comment-thread conn id ::sql/for-update true)]
(files/check-comment-permissions! conn profile-id file-id share-id)
(db/update! conn :comment-thread
{:modified-at request-at
:frame-id frame-id}
{:id id})
nil))))
::sm/params schema:update-comment-thread-frame
::db/transaction true}
[{:keys [::db/conn]} {:keys [::rpc/profile-id ::rpc/request-at id frame-id share-id]}]
(let [{:keys [file-id]} (get-comment-thread conn id ::sql/for-update true)]
(files/check-comment-permissions! conn profile-id file-id share-id)
(db/update! conn :comment-thread
{:modified-at request-at
:frame-id frame-id}
{:id id}
{::db/return-keys false})
nil))
(def ^:private
schema:mark-all-threads-as-read
[:map {:title "mark-all-threads-as-read"}
[:threads [:vector ::sm/uuid]]])
(sv/defmethod ::mark-all-threads-as-read
{::doc/added "1.15"
::sm/params schema:mark-all-threads-as-read}
[cfg {:keys [::rpc/profile-id threads] :as params}]
(db/tx-run!
cfg
(fn [{:keys [::db/conn]}]
(doseq [thread-id threads]
(upsert-comment-thread-status! conn profile-id thread-id)))))

View File

@@ -27,7 +27,7 @@
{::rpc/auth false
::doc/added "1.15"
::doc/changes ["1.15" "This method is migrated from mutations to commands."]}
[{:keys [::db/pool] :as cfg} _]
[cfg _]
(when-not (contains? cf/flags :demo-users)
(ex/raise :type :validation
@@ -49,9 +49,11 @@
:password (profile/derive-password cfg password)
:props {}}]
(db/with-atomic [conn pool]
(let [profile (->> (auth/create-profile! conn params)
(auth/create-profile-rels! conn))]
(with-meta {:email email
:password password}
{::audit/profile-id (:id profile)})))))
(let [profile (db/tx-run! cfg (fn [{:keys [::db/conn]}]
(->> (auth/create-profile! conn params)
(auth/create-profile-rels! conn))))]
(with-meta {:email email
:password password}
{::audit/profile-id (:id profile)}))))

View File

@@ -6,6 +6,7 @@
(ns app.rpc.commands.files
(:require
[app.binfile.common :as bfc]
[app.common.data :as d]
[app.common.data.macros :as dm]
[app.common.exceptions :as ex]
@@ -22,6 +23,8 @@
[app.db :as db]
[app.db.sql :as-alias sql]
[app.features.fdata :as feat.fdata]
[app.features.file-migrations :as feat.fmigr]
[app.features.logical-deletion :as ldel]
[app.loggers.audit :as-alias audit]
[app.loggers.webhooks :as-alias webhooks]
[app.rpc :as-alias rpc]
@@ -188,7 +191,7 @@
[:is-shared ::sm/boolean]
[:project-id ::sm/uuid]
[:created-at ::dt/instant]
[:data {:optional true} :any]])
[:data {:optional true} ::sm/any]])
(def schema:permissions-mixin
[:map {:title "PermissionsMixin"}
@@ -207,10 +210,11 @@
[:project-id {:optional true} ::sm/uuid]])
(defn- migrate-file
[{:keys [::db/conn] :as cfg} {:keys [id] :as file}]
[{:keys [::db/conn] :as cfg} {:keys [id] :as file} {:keys [read-only?]}]
(binding [pmap/*load-fn* (partial feat.fdata/load-pointer cfg id)
pmap/*tracked* (pmap/create-tracked)]
(let [;; For avoid unnecesary overhead of creating multiple pointers and
(let [libs (delay (bfc/get-resolved-file-libraries cfg file))
;; For avoid unnecesary overhead of creating multiple pointers and
;; handly internally with objects map in their worst case (when
;; probably all shapes and all pointers will be readed in any
;; case), we just realize/resolve them before applying the
@@ -218,42 +222,45 @@
file (-> file
(update :data feat.fdata/process-pointers deref)
(update :data feat.fdata/process-objects (partial into {}))
(fmg/migrate-file))
(fmg/migrate-file libs))]
;; When file is migrated, we break the rule of no perform
;; mutations on get operations and update the file with all
;; migrations applied
;;
;; WARN: he following code will not work on read-only mode,
;; it is a known issue; we keep is not implemented until we
;; really need this.
file (if (contains? (:features file) "fdata/objects-map")
(feat.fdata/enable-objects-map file)
file)
file (if (contains? (:features file) "fdata/pointer-map")
(feat.fdata/enable-pointer-map file)
file)]
(if (or read-only? (db/read-only? conn))
file
(let [;; When file is migrated, we break the rule of no perform
;; mutations on get operations and update the file with all
;; migrations applied
file (if (contains? (:features file) "fdata/objects-map")
(feat.fdata/enable-objects-map file)
file)
file (if (contains? (:features file) "fdata/pointer-map")
(feat.fdata/enable-pointer-map file)
file)]
(db/update! conn :file
{:data (blob/encode (:data file))
:version (:version file)
:features (db/create-array conn "text" (:features file))}
{:id id})
(db/update! conn :file
{:data (blob/encode (:data file))
:version (:version file)
:features (db/create-array conn "text" (:features file))}
{:id id}
{::db/return-keys false})
(when (contains? (:features file) "fdata/pointer-map")
(feat.fdata/persist-pointers! cfg id))
(when (contains? (:features file) "fdata/pointer-map")
(feat.fdata/persist-pointers! cfg id))
file)))
(feat.fmigr/upsert-migrations! conn file)
(feat.fmigr/resolve-applied-migrations cfg file))))))
(defn get-file
[{:keys [::db/conn ::wrk/executor] :as cfg} id
& {:keys [project-id
migrate?
include-deleted?
lock-for-update?]
lock-for-update?
preload-pointers?]
:or {include-deleted? false
lock-for-update? false
migrate? true}}]
migrate? true
preload-pointers? false}
:as options}]
(assert (db/connection? conn) "expected cfg with valid connection")
@@ -264,16 +271,23 @@
{::db/check-deleted (not include-deleted?)
::db/remove-deleted (not include-deleted?)
::sql/for-update lock-for-update?})
(feat.fmigr/resolve-applied-migrations cfg)
(feat.fdata/resolve-file-data cfg))
;; NOTE: we perform the file decoding in a separate thread
;; because it has heavy and synchronous operations for
;; decoding file body that are not very friendly with virtual
;; threads.
file (px/invoke! executor #(decode-row file))]
file (px/invoke! executor #(decode-row file))
file (if (and migrate? (fmg/need-migration? file))
(migrate-file cfg file options)
file)]
(if preload-pointers?
(binding [pmap/*load-fn* (partial feat.fdata/load-pointer cfg id)]
(update file :data feat.fdata/process-pointers deref))
(if (and migrate? (fmg/need-migration? file))
(migrate-file cfg file)
file)))
(defn get-minimal-file
@@ -289,7 +303,7 @@
(defn get-file-etag
[{:keys [::rpc/profile-id]} {:keys [modified-at revn vern permissions]}]
(str profile-id "/" revn "/" vern "/"
(str profile-id "/" revn "/" vern "/" (hash fmg/available-migrations) "/"
(dt/format-instant modified-at :iso)
"/"
(uri/map->query-string permissions)))
@@ -320,11 +334,12 @@
file (-> (get-file cfg id :project-id project-id)
(assoc :permissions perms)
(assoc :team-id (:id team))
(check-version!))]
(-> (cfeat/get-team-enabled-features cf/flags team)
(cfeat/check-client-features! (:features params))
(cfeat/check-file-features! (:features file) (:features params)))
(cfeat/check-file-features! (:features file)))
;; This operation is needed for backward comapatibility with frontends that
;; does not support pointer-map resolution mechanism; this just resolves the
@@ -381,8 +396,10 @@
f.revn,
f.vern,
f.is_shared,
ft.media_id AS thumbnail_id
ft.media_id AS thumbnail_id,
p.team_id
from file as f
inner join project as p on (p.id = f.project_id)
left join file_thumbnail as ft on (ft.file_id = f.id
and ft.revn = f.revn
and ft.deleted_at is null)
@@ -468,7 +485,7 @@
(update page :objects update-vals #(dissoc % :thumbnail)))
(defn get-page
[{:keys [::db/conn] :as cfg} {:keys [profile-id file-id page-id object-id] :as params}]
[{:keys [::db/conn] :as cfg} {:keys [profile-id file-id page-id object-id share-id] :as params}]
(when (and (uuid? object-id)
(not (uuid? page-id)))
@@ -476,22 +493,30 @@
:code :params-validation
:hint "page-id is required when object-id is provided"))
(let [team (teams/get-team conn
:profile-id profile-id
:file-id file-id)
(let [perms (get-permissions conn profile-id file-id share-id)
file (get-file cfg file-id)
file (get-file cfg file-id :read-only? true)
_ (-> (cfeat/get-team-enabled-features cf/flags team)
(cfeat/check-client-features! (:features params))
(cfeat/check-file-features! (:features file) (:features params)))
proj (db/get conn :project {:id (:project-id file)})
page (binding [pmap/*load-fn* (partial feat.fdata/load-pointer cfg file-id)]
(let [page-id (or page-id (-> file :data :pages first))
page (dm/get-in file [:data :pages-index page-id])]
(if (pmap/pointer-map? page)
(deref page)
page)))]
team (-> (db/get conn :team {:id (:team-id proj)})
(teams/decode-row))
_ (-> (cfeat/get-team-enabled-features cf/flags team)
(cfeat/check-client-features! (:features params))
(cfeat/check-file-features! (:features file)))
page (binding [pmap/*load-fn* (partial feat.fdata/load-pointer cfg file-id)]
(let [page-id (or page-id (-> file :data :pages first))
page (dm/get-in file [:data :pages-index page-id])]
(if (pmap/pointer-map? page)
(deref page)
page)))]
(when-not perms
(ex/raise :type :not-found
:code :object-not-found
:hint "object not found"))
(cond-> (prune-thumbnails page)
(some? object-id)
@@ -534,9 +559,13 @@
f.project_id,
f.created_at,
f.modified_at,
f.data_backend,
f.data_ref_id,
f.name,
f.version,
f.is_shared,
ft.media_id
ft.media_id,
p.team_id
from file as f
inner join project as p on (p.id = f.project_id)
left join file_thumbnail as ft on (ft.file_id = f.id and ft.revn = f.revn and ft.deleted_at is null)
@@ -546,7 +575,6 @@
and p.team_id = ?
order by f.modified_at desc")
(defn- get-library-summary
[cfg {:keys [id data] :as file}]
(letfn [(assets-sample [assets limit]
@@ -570,12 +598,16 @@
(teams/check-read-permissions! conn profile-id team-id)
(->> (db/exec! conn [sql:team-shared-files team-id])
(into #{} (comp
(map decode-row)
;; NOTE: this decode operation is a workaround for a
;; fast fix, this should be approached with a more
;; efficient implementation, for now it loads all
;; the files in memory.
(map (partial bfc/decode-file cfg))
(map (fn [row]
(if-let [media-id (:media-id row)]
(-> row
(dissoc :media-id)
(assoc :thumbnail-uri (resolve-public-uri media-id)))
(assoc :thumbnail-id media-id))
(dissoc row :media-id))))
(map #(assoc % :library-summary (get-library-summary cfg %)))
(map #(dissoc % :data))))))
@@ -593,41 +625,6 @@
;; --- COMMAND QUERY: get-file-libraries
(def ^:private sql:get-file-libraries
"WITH RECURSIVE libs AS (
SELECT fl.*, flr.synced_at
FROM file AS fl
JOIN file_library_rel AS flr ON (flr.library_file_id = fl.id)
WHERE flr.file_id = ?::uuid
UNION
SELECT fl.*, flr.synced_at
FROM file AS fl
JOIN file_library_rel AS flr ON (flr.library_file_id = fl.id)
JOIN libs AS l ON (flr.file_id = l.id)
)
SELECT l.id,
l.features,
l.project_id,
l.created_at,
l.modified_at,
l.deleted_at,
l.name,
l.revn,
l.vern,
l.synced_at
FROM libs AS l
WHERE l.deleted_at IS NULL OR l.deleted_at > now();")
(defn get-file-libraries
[conn file-id]
(into []
(comp
;; FIXME: :is-indirect set to false to all rows looks
;; completly useless
(map #(assoc % :is-indirect false))
(map decode-row))
(db/exec! conn [sql:get-file-libraries file-id])))
(def ^:private schema:get-file-libraries
[:map {:title "get-file-libraries"}
[:file-id ::sm/uuid]])
@@ -639,7 +636,7 @@
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id file-id]}]
(dm/with-open [conn (db/open pool)]
(check-read-permissions! conn profile-id file-id)
(get-file-libraries conn file-id)))
(bfc/get-file-libraries conn file-id)))
;; --- COMMAND QUERY: Files that use this File library
@@ -682,7 +679,8 @@
f.name,
f.is_shared,
ft.media_id AS thumbnail_id,
row_number() over w as row_num
row_number() over w as row_num,
p.team_id
from file as f
inner join project as p on (p.id = f.project_id)
left join file_thumbnail as ft on (ft.file_id = f.id
@@ -723,11 +721,13 @@
:project-id project-id
:file-id id)
file (get-file cfg id :project-id project-id)]
file (get-file cfg id
:project-id project-id
:read-only? true)]
(-> (cfeat/get-team-enabled-features cf/flags team)
(cfeat/check-client-features! (:features params))
(cfeat/check-file-features! (:features file) (:features params)))
(cfeat/check-file-features! (:features file)))
(binding [pmap/*load-fn* (partial feat.fdata/load-pointer cfg id)]
{:name (:name file)
@@ -796,17 +796,17 @@
[:id ::sm/uuid]
[:name [:string {:max 250}]]
[:created-at ::dt/instant]
[:modified-at ::dt/instant]]}
[:modified-at ::dt/instant]]
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id id] :as params}]
(db/with-atomic [conn pool]
(check-edition-permissions! conn profile-id id)
(let [file (rename-file conn params)]
(rph/with-meta
(select-keys file [:id :name :created-at :modified-at])
{::audit/props {:project-id (:project-id file)
:created-at (:created-at file)
:modified-at (:modified-at file)}}))))
::db/transaction true}
[{:keys [::db/conn] :as cfg} {:keys [::rpc/profile-id id] :as params}]
(check-edition-permissions! conn profile-id id)
(let [file (rename-file conn params)]
(rph/with-meta
(select-keys file [:id :name :created-at :modified-at])
{::audit/props {:project-id (:project-id file)
:created-at (:created-at file)
:modified-at (:modified-at file)}})))
;; --- MUTATION COMMAND: set-file-shared
@@ -942,12 +942,13 @@
;; --- MUTATION COMMAND: delete-file
(defn- mark-file-deleted
[conn file-id]
(let [file (db/update! conn :file
{:deleted-at (dt/now)}
{:id file-id}
{::db/return-keys [:id :name :is-shared :deleted-at
:project-id :created-at :modified-at]})]
[conn team file-id]
(let [delay (ldel/get-deletion-delay team)
file (db/update! conn :file
{:deleted-at (dt/in-future delay)}
{:id file-id}
{::db/return-keys [:id :name :is-shared :deleted-at
:project-id :created-at :modified-at]})]
(wrk/submit! {::db/conn conn
::wrk/task :delete-object
::wrk/params {:object :file
@@ -963,7 +964,11 @@
(defn- delete-file
[{:keys [::db/conn] :as cfg} {:keys [profile-id id] :as params}]
(check-edition-permissions! conn profile-id id)
(let [file (mark-file-deleted conn id)]
(let [team (teams/get-team conn
:profile-id profile-id
:file-id id)
file (mark-file-deleted conn team id)]
(rph/with-meta (rph/wrap)
{::audit/props {:project-id (:project-id file)
:name (:name file)
@@ -998,15 +1003,17 @@
{::doc/added "1.17"
::webhooks/event? true
::sm/params schema:link-file-to-library}
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id file-id library-id] :as params}]
[cfg {:keys [::rpc/profile-id file-id library-id] :as params}]
(when (= file-id library-id)
(ex/raise :type :validation
:code :invalid-library
:hint "A file cannot be linked to itself"))
(db/with-atomic [conn pool]
(check-edition-permissions! conn profile-id file-id)
(check-edition-permissions! conn profile-id library-id)
(link-file-to-library conn params)))
(db/tx-run! cfg
(fn [{:keys [::db/conn]}]
(check-edition-permissions! conn profile-id file-id)
(check-edition-permissions! conn profile-id library-id)
(link-file-to-library conn params))))
;; --- MUTATION COMMAND: unlink-file-from-library
@@ -1024,12 +1031,12 @@
(sv/defmethod ::unlink-file-from-library
{::doc/added "1.17"
::webhooks/event? true
::sm/params schema:unlink-file-to-library}
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id file-id] :as params}]
(db/with-atomic [conn pool]
(check-edition-permissions! conn profile-id file-id)
(unlink-file-from-library conn params)
nil))
::sm/params schema:unlink-file-to-library
::db/transaction true}
[{:keys [::db/conn] :as cfg} {:keys [::rpc/profile-id file-id] :as params}]
(check-edition-permissions! conn profile-id file-id)
(unlink-file-from-library conn params)
nil)
;; --- MUTATION COMMAND: update-sync
@@ -1049,12 +1056,11 @@
(sv/defmethod ::update-file-library-sync-status
"Update the synchronization status of a file->library link"
{::doc/added "1.17"
::sm/params schema:update-file-library-sync-status}
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id file-id] :as params}]
(db/with-atomic [conn pool]
(check-edition-permissions! conn profile-id file-id)
(update-sync conn params)))
::sm/params schema:update-file-library-sync-status
::db/transaction true}
[{:keys [::db/conn]} {:keys [::rpc/profile-id file-id] :as params}]
(check-edition-permissions! conn profile-id file-id)
(update-sync conn params))
;; --- MUTATION COMMAND: ignore-sync
@@ -1075,9 +1081,9 @@
(sv/defmethod ::ignore-file-library-sync-status
"Ignore updates in linked files"
{::doc/added "1.17"
::sm/params schema:ignore-file-library-sync-status}
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id file-id] :as params}]
(db/with-atomic [conn pool]
(check-edition-permissions! conn profile-id file-id)
(-> (ignore-sync conn params)
(update :features db/decode-pgarray #{}))))
::sm/params schema:ignore-file-library-sync-status
::db/transaction true}
[{:keys [::db/conn]} {:keys [::rpc/profile-id file-id] :as params}]
(check-edition-permissions! conn profile-id file-id)
(-> (ignore-sync conn params)
(update :features db/decode-pgarray #{})))

View File

@@ -6,13 +6,13 @@
(ns app.rpc.commands.files-create
(:require
[app.binfile.common :as bfc]
[app.common.data.macros :as dm]
[app.common.features :as cfeat]
[app.common.schema :as sm]
[app.common.types.file :as ctf]
[app.config :as cf]
[app.db :as db]
[app.features.fdata :as feat.fdata]
[app.loggers.audit :as-alias audit]
[app.loggers.webhooks :as-alias webhooks]
[app.rpc :as-alias rpc]
@@ -21,7 +21,6 @@
[app.rpc.doc :as-alias doc]
[app.rpc.permissions :as perms]
[app.rpc.quotes :as quotes]
[app.util.blob :as blob]
[app.util.pointer-map :as pmap]
[app.util.services :as sv]
[app.util.time :as dt]
@@ -48,34 +47,19 @@
(binding [pmap/*tracked* (pmap/create-tracked)
cfeat/*current* features]
(let [file (ctf/make-file {:id id
:project-id project-id
:name name
:revn revn
:is-shared is-shared
:features features
:ignore-sync-until ignore-sync-until
:modified-at modified-at
:deleted-at deleted-at
:create-page create-page
:page-id page-id})
file (if (contains? features "fdata/objects-map")
(feat.fdata/enable-objects-map file)
file)
file (if (contains? features "fdata/pointer-map")
(feat.fdata/enable-pointer-map file)
file)]
(db/insert! conn :file
(-> file
(update :data blob/encode)
(update :features db/encode-pgarray conn "text"))
{::db/return-keys false})
(when (contains? features "fdata/pointer-map")
(feat.fdata/persist-pointers! cfg (:id file)))
(let [file (ctf/make-file {:id id
:project-id project-id
:name name
:revn revn
:is-shared is-shared
:features features
:ignore-sync-until ignore-sync-until
:modified-at modified-at
:deleted-at deleted-at}
{:create-page create-page
:page-id page-id})
file (-> (bfc/insert-file! cfg file)
(bfc/decode-row))]
(->> (assoc params :file-id (:id file) :role :owner)
(create-file-role! conn))
@@ -107,9 +91,6 @@
:project-id project-id)
team-id (:id team)
;; When we create files, we only need to respect the team
;; features, because some features can be enabled
;; globally, but the team is still not migrated properly.
features (-> (cfeat/get-team-enabled-features cf/flags team)
(cfeat/check-client-features! (:features params)))
@@ -123,25 +104,28 @@
params (-> params
(assoc :profile-id profile-id)
(assoc :features (set/difference features cfeat/frontend-only-features)))]
(assoc :features features))]
(quotes/check! cfg {::quotes/id ::quotes/files-per-project
::quotes/team-id team-id
::quotes/profile-id profile-id
::quotes/project-id project-id})
;; FIXME: IMPORTANT: this code can have race
;; conditions, because we have no locks for updating
;; team so, creating two files concurrently can lead
;; to lost team features updating
;; FIXME: IMPORTANT: this code can have race conditions, because
;; we have no locks for updating team so, creating two files
;; concurrently can lead to lost team features updating
;; When newly computed features does not match exactly with
;; the features defined on team row, we update it.
(when (not= features (:features team))
(let [features (db/create-array conn "text" features)]
(when-let [features (-> features
(set/difference (:features team))
(set/difference cfeat/no-team-inheritable-features)
(not-empty))]
(let [features (->> features
(set/union (:features team))
(db/create-array conn "text"))]
(db/update! conn :team
{:features features}
{:id team-id})))
{:id (:id team)}
{::db/return-keys false})))
(-> (create-file cfg params)
(vary-meta assoc ::audit/props {:team-id team-id}))))

View File

@@ -33,11 +33,11 @@
pages of a file with specific permissions (who-comment and who-inspect)."
{::doc/added "1.18"
::doc/module :files
::sm/params schema:create-share-link}
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id file-id] :as params}]
(db/with-atomic [conn pool]
(files/check-edition-permissions! conn profile-id file-id)
(create-share-link conn (assoc params :profile-id profile-id))))
::sm/params schema:create-share-link
::db/transaction true}
[{:keys [::db/conn]} {:keys [::rpc/profile-id file-id] :as params}]
(files/check-edition-permissions! conn profile-id file-id)
(create-share-link conn (assoc params :profile-id profile-id)))
(defn create-share-link
[conn {:keys [profile-id file-id pages who-comment who-inspect]}]
@@ -61,10 +61,10 @@
(sv/defmethod ::delete-share-link
{::doc/added "1.18"
::doc/module ::files
::sm/params schema:delete-share-link}
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id id] :as params}]
(db/with-atomic [conn pool]
(let [slink (db/get-by-id conn :share-link id)]
(files/check-edition-permissions! conn profile-id (:file-id slink))
(db/delete! conn :share-link {:id id})
nil)))
::sm/params schema:delete-share-link
::db/transaction true}
[{:keys [::db/conn]} {:keys [::rpc/profile-id id] :as params}]
(let [slink (db/get-by-id conn :share-link id)]
(files/check-edition-permissions! conn profile-id (:file-id slink))
(db/delete! conn :share-link {:id id})
nil))

View File

@@ -6,6 +6,7 @@
(ns app.rpc.commands.files-snapshot
(:require
[app.binfile.common :as bfc]
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.schema :as sm]
@@ -22,7 +23,6 @@
[app.rpc.quotes :as quotes]
[app.storage :as sto]
[app.util.blob :as blob]
[app.util.pointer-map :as pmap]
[app.util.services :as sv]
[app.util.time :as dt]
[cuerdas.core :as str]))
@@ -58,26 +58,6 @@
(files/check-read-permissions! conn profile-id file-id)
(get-file-snapshots conn file-id))))
(def ^:private sql:get-file
"SELECT f.*,
p.id AS project_id,
p.team_id AS team_id
FROM file AS f
INNER JOIN project AS p ON (p.id = f.project_id)
WHERE f.id = ?")
(defn- get-file
[cfg file-id]
(let [file (->> (db/exec-one! cfg [sql:get-file file-id])
(feat.fdata/resolve-file-data cfg))]
(binding [pmap/*load-fn* (partial feat.fdata/load-pointer cfg file-id)]
(-> file
(update :data blob/decode)
(update :data feat.fdata/process-pointers deref)
(update :data feat.fdata/process-objects (partial into {}))
(update :data assoc ::id file-id)
(update :data blob/encode)))))
(defn- generate-snapshot-label
[]
(let [ts (-> (dt/now)
@@ -87,49 +67,53 @@
(str "snapshot-" ts)))
(defn create-file-snapshot!
[cfg profile-id file-id label]
(let [file (get-file cfg file-id)
[cfg file & {:keys [label created-by deleted-at profile-id]
:or {deleted-at :default
created-by :system}}]
(assert (#{:system :user :admin} created-by)
"expected valid keyword for created-by")
(let [conn
(db/get-connection cfg)
;; NOTE: final user never can provide label as `:system`
;; keyword because the validator implies label always as
;; string; keyword is used for signal a special case
created-by
(if (= label :system)
"system"
"user")
(name created-by)
deleted-at
(if (= label :system)
(cond
(= deleted-at :default)
(dt/plus (dt/now) (cf/get-deletion-delay))
(dt/instant? deleted-at)
deleted-at
:else
nil)
label
(if (= label :system)
(str "internal/snapshot/" (:revn file))
(or label (generate-snapshot-label)))
(or label (generate-snapshot-label))
snapshot-id
(uuid/next)]
(uuid/next)
(-> cfg
(assoc ::quotes/profile-id profile-id)
(assoc ::quotes/project-id (:project-id file))
(assoc ::quotes/team-id (:team-id file))
(assoc ::quotes/file-id (:id file))
(quotes/check! {::quotes/id ::quotes/snapshots-per-file}
{::quotes/id ::quotes/snapshots-per-team}))
data
(blob/encode (:data file))
features
(db/encode-pgarray (:features file) conn "text")]
(l/debug :hint "creating file snapshot"
:file-id (str file-id)
:file-id (str (:id file))
:id (str snapshot-id)
:label label)
(db/insert! cfg :file-change
{:id snapshot-id
:revn (:revn file)
:data (:data file)
:data data
:version (:version file)
:features (:features file)
:features features
:profile-id profile-id
:file-id (:id file)
:label label
@@ -146,12 +130,25 @@
(sv/defmethod ::create-file-snapshot
{::doc/added "1.20"
::sm/params schema:create-file-snapshot}
[cfg {:keys [::rpc/profile-id file-id label]}]
(db/tx-run! cfg
(fn [{:keys [::db/conn] :as cfg}]
(files/check-edition-permissions! conn profile-id file-id)
(create-file-snapshot! cfg profile-id file-id label))))
::sm/params schema:create-file-snapshot
::db/transaction true}
[{:keys [::db/conn] :as cfg} {:keys [::rpc/profile-id file-id label]}]
(files/check-edition-permissions! conn profile-id file-id)
(let [file (bfc/get-file cfg file-id)
project (db/get-by-id cfg :project (:project-id file))]
(-> cfg
(assoc ::quotes/profile-id profile-id)
(assoc ::quotes/project-id (:project-id file))
(assoc ::quotes/team-id (:team-id project))
(assoc ::quotes/file-id (:id file))
(quotes/check! {::quotes/id ::quotes/snapshots-per-file}
{::quotes/id ::quotes/snapshots-per-team}))
(create-file-snapshot! cfg file
{:label label
:profile-id profile-id
:created-by :user})))
(defn restore-file-snapshot!
[{:keys [::db/conn ::mbus/msgbus] :as cfg} file-id snapshot-id]
@@ -237,8 +234,11 @@
(db/tx-run! cfg
(fn [{:keys [::db/conn] :as cfg}]
(files/check-edition-permissions! conn profile-id file-id)
(create-file-snapshot! cfg profile-id file-id :system)
(restore-file-snapshot! cfg file-id id))))
(let [file (bfc/get-file cfg file-id)]
(create-file-snapshot! cfg file
{:profile-id profile-id
:created-by :system})
(restore-file-snapshot! cfg file-id id)))))
(def ^:private schema:update-file-snapshot
[:map {:title "update-file-snapshot"}

View File

@@ -14,7 +14,6 @@
[app.config :as cf]
[app.db :as db]
[app.db.sql :as sql]
[app.features.components-v2 :as feat.compv2]
[app.features.fdata :as fdata]
[app.loggers.audit :as audit]
[app.rpc :as-alias rpc]
@@ -110,7 +109,7 @@
;; --- MUTATION COMMAND: persist-temp-file
(defn persist-temp-file
[{:keys [::db/conn] :as cfg} {:keys [id ::rpc/profile-id] :as params}]
[{:keys [::db/conn] :as cfg} {:keys [id] :as params}]
(let [file (files/get-file cfg id
:migrate? false
:lock-for-update? true)]
@@ -119,7 +118,6 @@
(ex/raise :type :validation
:code :cant-persist-already-persisted-file))
(let [changes (->> (db/cursor conn
(sql/select :file-change {:file-id id}
{:order-by [[:revn :asc]]})
@@ -147,19 +145,6 @@
:revn 1
:data (blob/encode (:data file))}
{:id id})
(let [team (teams/get-team conn :profile-id profile-id :project-id (:project-id file))
file-features (:features file)
team-features (cfeat/get-team-enabled-features cf/flags team)]
(when (and (contains? team-features "components/v2")
(not (contains? file-features "components/v2")))
;; Migrate components v2
(feat.compv2/migrate-file! cfg
(:id file)
:max-procs 2
:validate? true
:throw-on-validate? true)))
nil)))
(def ^:private schema:persist-temp-file

View File

@@ -10,7 +10,6 @@
[app.common.data.macros :as dm]
[app.common.features :as cfeat]
[app.common.files.helpers :as cfh]
[app.common.files.migrations :as fmg]
[app.common.geom.shapes :as gsh]
[app.common.schema :as sm]
[app.common.thumbnails :as thc]
@@ -18,7 +17,6 @@
[app.config :as cf]
[app.db :as db]
[app.db.sql :as-alias sql]
[app.features.fdata :as feat.fdata]
[app.loggers.audit :as-alias audit]
[app.loggers.webhooks :as-alias webhooks]
[app.media :as media]
@@ -180,8 +178,7 @@
(def ^:private
schema:get-file-data-for-thumbnail
[:map {:title "get-file-data-for-thumbnail"}
[:file-id ::sm/uuid]
[:features {:optional true} ::cfeat/features]])
[:file-id ::sm/uuid]])
(def ^:private
schema:partial-file
@@ -201,18 +198,16 @@
(db/run! cfg (fn [{:keys [::db/conn] :as cfg}]
(files/check-read-permissions! conn profile-id file-id)
(let [team (teams/get-team conn
:profile-id profile-id
:file-id file-id)
(let [team (teams/get-team conn
:profile-id profile-id
:file-id file-id)
file (binding [pmap/*load-fn* (partial feat.fdata/load-pointer cfg file-id)]
(-> (files/get-file cfg file-id :migrate? false)
(update :data feat.fdata/process-pointers deref)
(fmg/migrate-file)))]
file (files/get-file cfg file-id
:preload-pointers? true
:read-only? true)]
(-> (cfeat/get-team-enabled-features cf/flags team)
(cfeat/check-client-features! (:features params))
(cfeat/check-file-features! (:features file) (:features params)))
(cfeat/check-file-features! (:features file)))
{:file-id file-id
:revn (:revn file)

View File

@@ -6,6 +6,7 @@
(ns app.rpc.commands.files-update
(:require
[app.binfile.common :as bfc]
[app.common.data :as d]
[app.common.exceptions :as ex]
[app.common.features :as cfeat]
@@ -18,6 +19,8 @@
[app.config :as cf]
[app.db :as db]
[app.features.fdata :as feat.fdata]
[app.features.file-migrations :as feat.fmigr]
[app.features.logical-deletion :as ldel]
[app.http.errors :as errors]
[app.loggers.audit :as audit]
[app.loggers.webhooks :as webhooks]
@@ -118,6 +121,7 @@
(sv/defmethod ::update-file
{::climit/id [[:update-file/by-profile ::rpc/profile-id]
[:update-file/global]]
::webhooks/event? true
::webhooks/batch-timeout (dt/duration "2m")
::webhooks/batch-key (webhooks/key-fn ::rpc/profile-id :id)
@@ -139,7 +143,7 @@
features (-> (cfeat/get-team-enabled-features cf/flags team)
(cfeat/check-client-features! (:features params))
(cfeat/check-file-features! (:features file) (:features params)))
(cfeat/check-file-features! (:features file)))
changes (if changes-with-metadata
(->> changes-with-metadata (mapcat :changes) vec)
@@ -174,12 +178,19 @@
:stored-revn (:revn file)}))
;; When newly computed features does not match exactly with
;; the features defined on team row, we update it.
(when (not= features (:features team))
(let [features (db/create-array conn "text" features)]
;; the features defined on team row, we update it
(when-let [features (-> features
(set/difference (:features team))
(set/difference cfeat/no-team-inheritable-features)
(not-empty))]
(let [features (->> features
(set/union (:features team))
(db/create-array conn "text"))]
(db/update! conn :team
{:features features}
{:id (:id team)})))
{:id (:id team)}
{::db/return-keys false})))
(mtx/run! metrics {:id :update-file-changes :inc (count changes)})
@@ -199,39 +210,30 @@
Only intended for internal use on this module."
[{:keys [::db/conn ::wrk/executor ::timestamp] :as cfg}
{:keys [profile-id file features changes session-id skip-validate] :as params}]
{:keys [profile-id file team features changes session-id skip-validate] :as params}]
(let [;; Retrieve the file data
file (feat.fdata/resolve-file-data cfg file)
file (feat.fmigr/resolve-applied-migrations cfg file)
file (feat.fdata/resolve-file-data cfg file)
file (assoc file :features
(-> features
(set/difference cfeat/frontend-only-features)
(set/union (:features file))))]
file (assoc file :features
(-> features
(set/difference cfeat/frontend-only-features)
(set/union (:features file))))
;; We create a new lexycal scope for clearly delimit the result of
;; executing this update file operation and all its side effects
(let [file (px/invoke! executor
(fn []
;; Process the file data on separated thread for avoid to do
;; the CPU intensive operation on vthread.
(binding [cfeat/*current* features
cfeat/*previous* (:features file)]
(update-file-data! cfg file
process-changes-and-validate
changes skip-validate))))]
;; Process the file data on separated thread for avoid to do
;; the CPU intensive operation on vthread.
file (px/invoke! executor
(fn []
(binding [cfeat/*current* features
cfeat/*previous* (:features file)]
(update-file-data! cfg file
process-changes-and-validate
changes skip-validate))))]
(when (feat.fdata/offloaded? file)
(let [storage (sto/resolve cfg ::db/reuse-conn true)]
(some->> (:data-ref-id file) (sto/touch-object! storage))))
(persist-file! cfg file)
(let [params (assoc params :file file)
response {:revn (:revn file)
:lagged (get-lagged-changes conn params)}
features (db/create-array conn "text" (:features file))
deleted-at (if (::snapshot-data file)
(dt/plus timestamp (cf/get-deletion-delay))
(dt/plus timestamp (dt/duration {:hours 1})))]
(feat.fmigr/upsert-migrations! conn file)
(persist-file! cfg file)
;; Insert change (xlog) with deleted_at in a future data for
;; make them automatically eleggible for GC once they expires
@@ -241,19 +243,27 @@
:profile-id profile-id
:created-at timestamp
:updated-at timestamp
:deleted-at deleted-at
:deleted-at (if (::snapshot-data file)
(dt/plus timestamp (ldel/get-deletion-delay team))
(dt/plus timestamp (dt/duration {:hours 1})))
:file-id (:id file)
:revn (:revn file)
:version (:version file)
:features features
:features (:features file)
:label (::snapshot-label file)
:data (::snapshot-data file)
:changes (blob/encode changes)}
{::db/return-keys false})
;; Send asynchronous notifications
(send-notifications! cfg params)
(send-notifications! cfg params file))
(when (feat.fdata/offloaded? file)
(let [storage (sto/resolve cfg ::db/reuse-conn true)]
(some->> (:data-ref-id file) (sto/touch-object! storage))))
(let [response {:revn (:revn file)
:lagged (get-lagged-changes conn params)}]
(vary-meta response assoc ::audit/replace-props
{:id (:id file)
:name (:name file)
@@ -263,9 +273,10 @@
(defn update-file!
"A public api that allows apply a transformation to a file with all context setup."
[cfg file-id update-fn & args]
[{:keys [::db/conn] :as cfg} file-id update-fn & args]
(let [file (get-file cfg file-id)
file (apply update-file-data! cfg file update-fn args)]
(feat.fmigr/upsert-migrations! conn file)
(persist-file! cfg file)))
(def ^:private sql:get-file
@@ -293,8 +304,7 @@
It also updates the project modified-at attr."
[{:keys [::db/conn ::timestamp]} file]
(let [features (db/create-array conn "text" (:features file))
;; The timestamp can be nil because this function is also
(let [;; The timestamp can be nil because this function is also
;; intended to be used outside of this module
modified-at (or timestamp (dt/now))]
@@ -307,7 +317,7 @@
{:revn (:revn file)
:data (:data file)
:version (:version file)
:features features
:features (:features file)
:data-backend nil
:data-ref-id nil
:modified-at modified-at
@@ -331,6 +341,7 @@
(-> data
(blob/decode)
(assoc :id (:id file)))))
libs (delay (bfc/get-resolved-file-libraries cfg file))
;; For avoid unnecesary overhead of creating multiple pointers
;; and handly internally with objects map in their worst
@@ -341,7 +352,7 @@
(-> file
(update :data feat.fdata/process-pointers deref)
(update :data feat.fdata/process-objects (partial into {}))
(fmg/migrate-file))
(fmg/migrate-file libs))
file)
file (apply update-fn cfg file args)
@@ -366,39 +377,10 @@
(-> file
(assoc ::snapshot-data snapshot)
(assoc ::snapshot-label label)))
file)
file)]
file (cond-> file
(contains? cfeat/*current* "fdata/objects-map")
(feat.fdata/enable-objects-map)
(bfc/encode-file cfg file))))
(contains? cfeat/*current* "fdata/pointer-map")
(feat.fdata/enable-pointer-map)
:always
(update :data blob/encode))]
(feat.fdata/persist-pointers! cfg id)
file)))
(defn- get-file-libraries
"A helper for preload file libraries, mainly used for perform file
semantical and structural validation"
[{:keys [::db/conn] :as cfg} file]
(->> (files/get-file-libraries conn (:id file))
(into [file] (map (fn [{:keys [id]}]
(binding [pmap/*load-fn* (partial feat.fdata/load-pointer cfg id)
pmap/*tracked* nil]
;; We do not resolve the objects maps here
;; because there is a lower probability that all
;; shapes needed to be loded into memory, so we
;; leeave it on lazy status
(-> (files/get-file cfg id :migrate? false)
(update :data feat.fdata/process-pointers deref) ; ensure all pointers resolved
(update :data feat.fdata/process-objects (partial into {}))
(fmg/migrate-file))))))
(d/index-by :id)))
(defn- soft-validate-file-schema!
[file]
@@ -415,19 +397,37 @@
(l/error :hint "file validation error"
:cause cause))))
(defn- process-changes-and-validate
[cfg file changes skip-validate]
(let [;; WARNING: this ruins performance; maybe we need to find
;; some other way to do general validation
libs (when (and (or (contains? cf/flags :file-validation)
(contains? cf/flags :soft-file-validation))
(not skip-validate))
(get-file-libraries cfg file))
libs
(when (and (or (contains? cf/flags :file-validation)
(contains? cf/flags :soft-file-validation))
(not skip-validate))
(bfc/get-resolved-file-libraries cfg file))
file (-> (files/check-version! file)
(update :revn inc)
(update :data cpc/process-changes changes)
(update :data d/without-nils))]
;; The main purpose of this atom is provide a contextual state
;; for the changes subsystem where optionally some hints can
;; be provided for the changes processing. Right now we are
;; using it for notify about the existence of media refs when
;; a new shape is added.
state
(atom {})
file
(binding [cpc/*state* state]
(-> (files/check-version! file)
(update :revn inc)
(update :data cpc/process-changes changes)
(update :data d/without-nils)))
file
(if-let [media-refs (-> @state :media-refs not-empty)]
(bfc/update-media-references! cfg file media-refs)
file)]
(binding [pmap/*tracked* nil]
(when (contains? cf/flags :soft-file-validation)
@@ -474,7 +474,7 @@
(vec)))
(defn- send-notifications!
[cfg {:keys [file team changes session-id] :as params}]
[cfg {:keys [team changes session-id] :as params} file]
(let [lchanges (filter library-change? changes)
msgbus (::mbus/msgbus cfg)]

View File

@@ -12,6 +12,7 @@
[app.common.uuid :as uuid]
[app.db :as db]
[app.db.sql :as-alias sql]
[app.features.logical-deletion :as ldel]
[app.loggers.audit :as-alias audit]
[app.loggers.webhooks :as-alias webhooks]
[app.media :as media]
@@ -80,9 +81,9 @@
(def ^:private schema:create-font-variant
[:map {:title "create-font-variant"}
[:team-id ::sm/uuid]
[:data [:map-of :string :any]]
[:data [:map-of ::sm/text ::sm/any]]
[:font-id ::sm/uuid]
[:font-family :string]
[:font-family ::sm/text]
[:font-weight [::sm/one-of {:format "number"} valid-weight]]
[:font-style [::sm/one-of {:format "string"} valid-style]]])
@@ -202,32 +203,40 @@
(sv/defmethod ::delete-font
{::doc/added "1.18"
::webhooks/event? true
::sm/params schema:delete-font}
[cfg {:keys [::rpc/profile-id id team-id]}]
(db/tx-run! cfg
(fn [{:keys [::db/conn] :as cfg}]
(teams/check-edition-permissions! conn profile-id team-id)
(let [fonts (db/query conn :team-font-variant
{:team-id team-id
:font-id id
:deleted-at nil}
{::sql/for-update true})
tnow (dt/now)]
::sm/params schema:delete-font
::db/transaction true}
[{:keys [::db/conn] :as cfg} {:keys [::rpc/profile-id id team-id]}]
(let [team (teams/get-team conn
:profile-id profile-id
:team-id team-id)
(when-not (seq fonts)
(ex/raise :type :not-found
:code :object-not-found))
fonts (db/query conn :team-font-variant
{:team-id team-id
:font-id id
:deleted-at nil}
{::sql/for-update true})
(doseq [font fonts]
(db/update! conn :team-font-variant
{:deleted-at tnow}
{:id (:id font)}))
delay (ldel/get-deletion-delay team)
tnow (dt/in-future delay)]
(rph/with-meta (rph/wrap)
{::audit/props {:id id
:team-id team-id
:name (:font-family (peek fonts))
:profile-id profile-id}})))))
(teams/check-edition-permissions! (:permissions team))
(when-not (seq fonts)
(ex/raise :type :not-found
:code :object-not-found))
(doseq [font fonts]
(db/update! conn :team-font-variant
{:deleted-at tnow}
{:id (:id font)}
{::db/return-keys false}))
(rph/with-meta (rph/wrap)
{::audit/props {:id id
:team-id team-id
:name (:font-family (peek fonts))
:profile-id profile-id}})))
;; --- DELETE FONT VARIANT
@@ -239,19 +248,23 @@
(sv/defmethod ::delete-font-variant
{::doc/added "1.18"
::webhooks/event? true
::sm/params schema:delete-font-variant}
[cfg {:keys [::rpc/profile-id id team-id]}]
(db/tx-run! cfg
(fn [{:keys [::db/conn] :as cfg}]
(teams/check-edition-permissions! conn profile-id team-id)
(let [variant (db/get conn :team-font-variant
{:id id :team-id team-id}
{::sql/for-update true})]
::sm/params schema:delete-font-variant
::db/transaction true}
[{:keys [::db/conn] :as cfg} {:keys [::rpc/profile-id id team-id]}]
(let [team (teams/get-team conn
:profile-id profile-id
:team-id team-id)
variant (db/get conn :team-font-variant
{:id id :team-id team-id}
{::sql/for-update true})
delay (ldel/get-deletion-delay team)]
(db/update! conn :team-font-variant
{:deleted-at (dt/now)}
{:id (:id variant)})
(teams/check-edition-permissions! (:permissions team))
(db/update! conn :team-font-variant
{:deleted-at (dt/in-future delay)}
{:id (:id variant)}
{::db/return-keys false})
(rph/with-meta (rph/wrap)
{::audit/props {:font-family (:font-family variant)
:font-id (:font-id variant)}})))))
(rph/with-meta (rph/wrap)
{::audit/props {:font-family (:font-family variant)
:font-id (:font-id variant)}})))

View File

@@ -9,6 +9,7 @@
(:require
[app.binfile.common :as bfc]
[app.binfile.v1 :as bf.v1]
[app.binfile.v3 :as bf.v3]
[app.common.exceptions :as ex]
[app.common.features :as cfeat]
[app.common.schema :as sm]
@@ -25,6 +26,7 @@
[app.rpc.doc :as-alias doc]
[app.setup :as-alias setup]
[app.setup.templates :as tmpl]
[app.storage.tmp :as tmp]
[app.util.services :as sv]
[app.util.time :as dt]
[app.worker :as-alias wrk]
@@ -54,8 +56,8 @@
(vswap! bfc/*state* update :index bfc/update-index fmeds :id)
;; Process and persist file
(let [file (->> (bfc/process-file file)
(bfc/persist-file! cfg))]
(let [file (bfc/process-file cfg file)]
(bfc/insert-file! cfg file ::db/return-keys false)
;; The file profile creation is optional, so when no profile is
;; present (when this function is called from profile less
@@ -394,32 +396,49 @@
;; --- COMMAND: Clone Template
(defn clone-template
[cfg {:keys [project-id profile-id] :as params} template]
(db/tx-run! cfg (fn [{:keys [::db/conn ::wrk/executor] :as cfg}]
;; NOTE: the importation process performs some operations
;; that are not very friendly with virtual threads, and for
;; avoid unexpected blocking of other concurrent operations
;; we dispatch that operation to a dedicated executor.
(let [cfg (-> cfg
(assoc ::bf.v1/project-id project-id)
(assoc ::bf.v1/profile-id profile-id)
(assoc ::bf.v1/input template))
result (px/invoke! executor (partial bf.v1/import-files! cfg))]
[{:keys [::db/pool ::wrk/executor] :as cfg} {:keys [project-id profile-id] :as params} template]
(db/update! conn :project
{:modified-at (dt/now)}
{:id project-id})
;; NOTE: the importation process performs some operations
;; that are not very friendly with virtual threads, and for
;; avoid unexpected blocking of other concurrent operations
;; we dispatch that operation to a dedicated executor.
(let [template (tmp/tempfile-from template
:prefix "penpot.template."
:suffix ""
:min-age "30m")
(let [props (audit/clean-props params)]
(doseq [file-id result]
(let [props (assoc props :id file-id)
event (-> (audit/event-from-rpc-params params)
(assoc ::audit/profile-id profile-id)
(assoc ::audit/name "create-file")
(assoc ::audit/props props))]
(audit/submit! cfg event))))
format (bfc/parse-file-format template)
team (teams/get-team pool
:profile-id profile-id
:project-id project-id)
result))))
cfg (-> cfg
(assoc ::bfc/project-id project-id)
(assoc ::bfc/profile-id profile-id)
(assoc ::bfc/input template)
(assoc ::bfc/features (cfeat/get-team-enabled-features cf/flags team)))
result (if (= format :binfile-v3)
(px/invoke! executor (partial bf.v3/import-files! cfg))
(px/invoke! executor (partial bf.v1/import-files! cfg)))]
(db/tx-run! cfg
(fn [{:keys [::db/conn] :as cfg}]
(db/update! conn :project
{:modified-at (dt/now)}
{:id project-id}
{::db/return-keys false})
(let [props (audit/clean-props params)]
(doseq [file-id result]
(let [props (assoc props :id file-id)
event (-> (audit/event-from-rpc-params params)
(assoc ::audit/profile-id profile-id)
(assoc ::audit/name "create-file")
(assoc ::audit/props props))]
(audit/submit! cfg event))))))
result))
(def ^:private
schema:clone-template

View File

@@ -273,15 +273,14 @@
(sv/defmethod ::clone-file-media-object
{::doc/added "1.17"
::sm/params schema:clone-file-media-object}
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id file-id] :as params}]
(db/with-atomic [conn pool]
(files/check-edition-permissions! conn profile-id file-id)
(-> (assoc cfg :conn conn)
(clone-file-media-object params))))
::sm/params schema:clone-file-media-object
::db/transaction true}
[{:keys [::db/conn] :as cfg} {:keys [::rpc/profile-id file-id] :as params}]
(files/check-edition-permissions! conn profile-id file-id)
(clone-file-media-object cfg params))
(defn clone-file-media-object
[{:keys [conn]} {:keys [id file-id is-local]}]
[{:keys [::db/conn]} {:keys [id file-id is-local]}]
(let [mobj (db/get-by-id conn :file-media-object id)]
(db/insert! conn :file-media-object
{:id (uuid/next)

View File

@@ -41,6 +41,12 @@
(declare strip-private-attrs)
(declare verify-password)
(def schema:props-notifications
[:map {:title "props-notifications"}
[:dashboard-comments [::sm/one-of #{:all :partial :none}]]
[:email-comments [::sm/one-of #{:all :partial :none}]]
[:email-invites [::sm/one-of #{:all :none}]]])
(def schema:props
[:map {:title "ProfileProps"}
[:plugins {:optional true} schema:plugin-registry]
@@ -51,7 +57,9 @@
[:v2-info-shown {:optional true} ::sm/boolean]
[:welcome-file-id {:optional true} [:maybe ::sm/boolean]]
[:release-notes-viewed {:optional true}
[::sm/text {:max 100}]]])
[::sm/text {:max 100}]]
[:notifications {:optional true} schema:props-notifications]
[:workspace-visited {:optional true} ::sm/boolean]])
(def schema:profile
[:map {:title "Profile"}
@@ -117,32 +125,32 @@
(sv/defmethod ::update-profile
{::doc/added "1.0"
::sm/params schema:update-profile
::sm/result schema:profile}
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id fullname lang theme] :as params}]
(db/with-atomic [conn pool]
;; NOTE: we need to retrieve the profile independently if we use
;; it or not for explicit locking and avoid concurrent updates of
;; the same row/object.
(let [profile (-> (db/get-by-id conn :profile profile-id ::sql/for-update true)
(decode-row))
::sm/result schema:profile
::db/transaction true}
[{:keys [::db/conn]} {:keys [::rpc/profile-id fullname lang theme] :as params}]
;; NOTE: we need to retrieve the profile independently if we use
;; it or not for explicit locking and avoid concurrent updates of
;; the same row/object.
(let [profile (-> (db/get-by-id conn :profile profile-id ::sql/for-update true)
(decode-row))
;; Update the profile map with direct params
profile (-> profile
(assoc :fullname fullname)
(assoc :lang lang)
(assoc :theme theme))]
;; Update the profile map with direct params
profile (-> profile
(assoc :fullname fullname)
(assoc :lang lang)
(assoc :theme theme))]
(db/update! conn :profile
{:fullname fullname
:lang lang
:theme theme
:props (db/tjson (:props profile))}
{:id profile-id})
(db/update! conn :profile
{:fullname fullname
:lang lang
:theme theme
:props (db/tjson (:props profile))}
{:id profile-id})
(-> profile
(strip-private-attrs)
(d/without-nils)
(rph/with-meta {::audit/props (audit/profile->props profile)})))))
(-> profile
(strip-private-attrs)
(d/without-nils)
(rph/with-meta {::audit/props (audit/profile->props profile)}))))
;; --- MUTATION: Update Password
@@ -161,21 +169,20 @@
(sv/defmethod ::update-profile-password
{::doc/added "1.0"
::sm/params schema:update-profile-password
::climit/id :auth/global}
::climit/id :auth/global
::db/transaction true}
[cfg {:keys [::rpc/profile-id password] :as params}]
(let [profile (validate-password! cfg (assoc params :profile-id profile-id))
session-id (::session/id params)]
(db/tx-run! cfg (fn [cfg]
(let [profile (validate-password! cfg (assoc params :profile-id profile-id))
session-id (::session/id params)]
(when (= (:email profile) (str/lower (:password params)))
(ex/raise :type :validation
:code :email-as-password
:hint "you can't use your email as password"))
(when (= (:email profile) (str/lower (:password params)))
(ex/raise :type :validation
:code :email-as-password
:hint "you can't use your email as password"))
(update-profile-password! cfg (assoc profile :password password))
(invalidate-profile-session! cfg profile-id session-id)
nil))))
(update-profile-password! cfg (assoc profile :password password))
(invalidate-profile-session! cfg profile-id session-id)
nil))
(defn- invalidate-profile-session!
"Removes all sessions except the current one."
@@ -200,6 +207,44 @@
{:id id})
nil))
;; --- MUTATION: Update notifications
(def ^:private
schema:update-profile-notifications
[:map {:title "update-profile-notifications"}
[:dashboard-comments [::sm/one-of #{:all :partial :none}]]
[:email-comments [::sm/one-of #{:all :partial :none}]]
[:email-invites [::sm/one-of #{:all :none}]]])
(declare update-notifications!)
(sv/defmethod ::update-profile-notifications
{::doc/added "2.4.0"
::sm/params schema:update-profile-notifications
::climit/id :auth/global}
[cfg {:keys [::rpc/profile-id] :as params}]
(db/tx-run! cfg update-notifications! (assoc params :profile-id profile-id)))
(defn- update-notifications!
[{:keys [::db/conn] :as cfg} {:keys [profile-id dashboard-comments email-comments email-invites]}]
(let [profile (get-profile conn profile-id)
notifications
{:dashboard-comments dashboard-comments
:email-comments email-comments
:email-invites email-invites}]
(db/update!
conn :profile
{:props
(-> (:props profile)
(assoc :notifications notifications)
(db/tjson))}
{:id (:id profile)})
nil))
;; --- MUTATION: Update Photo
(declare upload-photo)
@@ -395,37 +440,36 @@
(declare ^:private get-owned-teams)
(sv/defmethod ::delete-profile
{::doc/added "1.0"}
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id] :as params}]
(db/with-atomic [conn pool]
(let [teams (get-owned-teams conn profile-id)
deleted-at (dt/now)]
{::doc/added "1.0"
::db/transaction true}
[{:keys [::db/conn] :as cfg} {:keys [::rpc/profile-id] :as params}]
(let [teams (get-owned-teams conn profile-id)
deleted-at (dt/now)]
;; If we found owned teams with participants, we don't allow
;; delete profile until the user properly transfer ownership or
;; explicitly removes all participants from the team
(when (some pos? (map :participants teams))
(ex/raise :type :validation
:code :owner-teams-with-people
:hint "The user need to transfer ownership of owned teams."
:context {:teams (mapv :id teams)}))
;; If we found owned teams with participants, we don't allow
;; delete profile until the user properly transfer ownership or
;; explicitly removes all participants from the team
(when (some pos? (map :participants teams))
(ex/raise :type :validation
:code :owner-teams-with-people
:hint "The user need to transfer ownership of owned teams."
:context {:teams (mapv :id teams)}))
;; Mark profile deleted immediatelly
(db/update! conn :profile
{:deleted-at deleted-at}
{:id profile-id})
;; Mark profile deleted immediatelly
(db/update! conn :profile
{:deleted-at deleted-at}
{:id profile-id})
;; Schedule cascade deletion to a worker
(wrk/submit! {::db/conn conn
::wrk/task :delete-object
::wrk/params {:object :profile
:deleted-at deleted-at
:id profile-id}})
;; Schedule cascade deletion to a worker
(wrk/submit! {::db/conn conn
::wrk/task :delete-object
::wrk/params {:object :profile
:deleted-at deleted-at
:id profile-id}})
(-> (rph/wrap nil)
(rph/with-transform (session/delete-fn cfg))))))
(-> (rph/wrap nil)
(rph/with-transform (session/delete-fn cfg)))))
;; --- HELPERS
@@ -436,8 +480,7 @@
JOIN team AS t ON (t.id = tpr.team_id)
WHERE tpr.is_owner IS TRUE
AND tpr.profile_id = ?
AND (t.deleted_at IS NULL OR
t.deleted_at > now())
AND t.deleted_at IS NULL
)
SELECT tpr.team_id AS id,
count(tpr.profile_id) - 1 AS participants

View File

@@ -11,6 +11,7 @@
[app.common.schema :as sm]
[app.db :as db]
[app.db.sql :as-alias sql]
[app.features.logical-deletion :as ldel]
[app.loggers.audit :as-alias audit]
[app.loggers.webhooks :as webhooks]
[app.rpc :as-alias rpc]
@@ -219,12 +220,12 @@
::sm/params schema:update-project-pin
::webhooks/batch-timeout (dt/duration "5s")
::webhooks/batch-key (webhooks/key-fn ::rpc/profile-id :id)
::webhooks/event? true}
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id id team-id is-pinned] :as params}]
(db/with-atomic [conn pool]
(check-read-permissions! conn profile-id id)
(db/exec-one! conn [sql:update-project-pin team-id id profile-id is-pinned is-pinned])
nil))
::webhooks/event? true
::db/transaction true}
[{:keys [::db/conn]} {:keys [::rpc/profile-id id team-id is-pinned] :as params}]
(check-read-permissions! conn profile-id id)
(db/exec-one! conn [sql:update-project-pin team-id id profile-id is-pinned is-pinned])
nil)
;; --- MUTATION: Rename Project
@@ -238,24 +239,25 @@
(sv/defmethod ::rename-project
{::doc/added "1.18"
::sm/params schema:rename-project
::webhooks/event? true}
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id id name] :as params}]
(db/with-atomic [conn pool]
(check-edition-permissions! conn profile-id id)
(let [project (db/get-by-id conn :project id ::sql/for-update true)]
(db/update! conn :project
{:name name}
{:id id})
(rph/with-meta (rph/wrap)
{::audit/props {:team-id (:team-id project)
:prev-name (:name project)}}))))
::webhooks/event? true
::db/transaction true}
[{:keys [::db/conn]} {:keys [::rpc/profile-id id name] :as params}]
(check-edition-permissions! conn profile-id id)
(let [project (db/get-by-id conn :project id ::sql/for-update true)]
(db/update! conn :project
{:name name}
{:id id})
(rph/with-meta (rph/wrap)
{::audit/props {:team-id (:team-id project)
:prev-name (:name project)}})))
;; --- MUTATION: Delete Project
(defn- delete-project
[conn project-id]
(let [project (db/update! conn :project
{:deleted-at (dt/now)}
[conn team project-id]
(let [delay (ldel/get-deletion-delay team)
project (db/update! conn :project
{:deleted-at (dt/in-future delay)}
{:id project-id}
{::db/return-keys true})]
@@ -272,7 +274,6 @@
project))
(def ^:private schema:delete-project
[:map {:title "delete-project"}
[:id ::sm/uuid]])
@@ -280,13 +281,16 @@
(sv/defmethod ::delete-project
{::doc/added "1.18"
::sm/params schema:delete-project
::webhooks/event? true}
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id id] :as params}]
(db/with-atomic [conn pool]
(check-edition-permissions! conn profile-id id)
(let [project (delete-project conn id)]
(rph/with-meta (rph/wrap)
{::audit/props {:team-id (:team-id project)
:name (:name project)
:created-at (:created-at project)
:modified-at (:modified-at project)}}))))
::webhooks/event? true
::db/transaction true}
[{:keys [::db/conn]} {:keys [::rpc/profile-id id] :as params}]
(check-edition-permissions! conn profile-id id)
(let [team (teams/get-team conn
:profile-id profile-id
:project-id id)
project (delete-project conn team id)]
(rph/with-meta (rph/wrap)
{::audit/props {:team-id (:team-id project)
:name (:name project)
:created-at (:created-at project)
:modified-at (:modified-at project)}})))

View File

@@ -9,7 +9,6 @@
[app.common.schema :as sm]
[app.db :as db]
[app.rpc :as-alias rpc]
[app.rpc.commands.files :refer [resolve-public-uri]]
[app.rpc.doc :as-alias doc]
[app.util.services :as sv]))
@@ -61,7 +60,7 @@
(if-let [media-id (:media-id row)]
(-> row
(dissoc :media-id)
(assoc :thumbnail-uri (resolve-public-uri media-id)))
(assoc :thumbnail-id media-id))
(dissoc row :media-id))))))
(def ^:private schema:search-files

View File

@@ -17,6 +17,7 @@
[app.db :as db]
[app.db.sql :as sql]
[app.email :as eml]
[app.features.logical-deletion :as ldel]
[app.loggers.audit :as audit]
[app.main :as-alias main]
[app.media :as media]
@@ -76,9 +77,10 @@
(perms/make-check-fn has-read-permissions?))
(defn decode-row
[{:keys [features] :as row}]
[{:keys [features subscription] :as row}]
(cond-> row
(some? features) (assoc :features (db/decode-pgarray features #{}))))
(some? features) (assoc :features (db/decode-pgarray features #{}))
(some? subscription) (assoc :subscription (db/decode-transit-pgobject subscription))))
;; FIXME: move
@@ -113,29 +115,42 @@
;; --- Query: Teams
(declare get-teams)
(def ^:private schema:get-teams
[:map {:title "get-teams"}])
(sv/defmethod ::get-teams
{::doc/added "1.17"
::sm/params schema:get-teams}
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id] :as params}]
(dm/with-open [conn (db/open pool)]
(get-teams conn profile-id)))
(def sql:get-teams-with-permissions
"select t.*,
"SELECT t.*,
tp.is_owner,
tp.is_admin,
tp.can_edit,
(t.id = ?) as is_default
from team_profile_rel as tp
join team as t on (t.id = tp.team_id)
where t.deleted_at is null
and tp.profile_id = ?
order by tp.created_at asc")
(t.id = ?) AS is_default
FROM team_profile_rel AS tp
JOIN team AS t ON (t.id = tp.team_id)
WHERE t.deleted_at IS null
AND tp.profile_id = ?
ORDER BY tp.created_at ASC")
(def sql:get-teams-with-permissions-and-subscription
"SELECT t.*,
tp.is_owner,
tp.is_admin,
tp.can_edit,
(t.id = ?) AS is_default,
jsonb_build_object(
'~:type', COALESCE(p.props->'~:subscription'->>'~:type', 'professional'),
'~:status', CASE COALESCE(p.props->'~:subscription'->>'~:type', 'professional')
WHEN 'professional' THEN 'active'
ELSE COALESCE(p.props->'~:subscription'->>'~:status', 'incomplete')
END,
'~:seats', p.props->'~:quantity'
) AS subscription
FROM team_profile_rel AS tp
JOIN team AS t ON (t.id = tp.team_id)
JOIN team_profile_rel AS tpr
ON (tpr.team_id = t.id AND tpr.is_owner IS true)
JOIN profile AS p
ON (tpr.profile_id = p.id)
WHERE t.deleted_at IS null
AND tp.profile_id = ?
ORDER BY tp.created_at ASC")
(defn process-permissions
[team]
@@ -150,13 +165,52 @@
(dissoc :is-owner :is-admin :can-edit)
(assoc :permissions permissions))))
(def ^:private
xform:process-teams
(comp
(map decode-row)
(map process-permissions)))
(defn get-teams
[conn profile-id]
(let [profile (profile/get-profile conn profile-id)]
(->> (db/exec! conn [sql:get-teams-with-permissions (:default-team-id profile) profile-id])
(map decode-row)
(map process-permissions)
(vec))))
(let [profile (profile/get-profile conn profile-id)
sql (if (contains? cf/flags :subscriptions)
sql:get-teams-with-permissions-and-subscription
sql:get-teams-with-permissions)]
(->> (db/exec! conn [sql (:default-team-id profile) profile-id])
(into [] xform:process-teams))))
(def ^:private schema:get-teams
[:map {:title "get-teams"}])
(sv/defmethod ::get-teams
{::doc/added "1.17"
::sm/params schema:get-teams}
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id] :as params}]
(dm/with-open [conn (db/open pool)]
(get-teams conn profile-id)))
(def ^:private sql:get-owned-teams
"SELECT t.id, t.name,
(SELECT count(*) FROM team_profile_rel WHERE team_id=t.id) AS total_members
FROM team AS t
JOIN team_profile_rel AS tpr ON (tpr.team_id = t.id)
WHERE t.is_default IS false
AND tpr.is_owner IS true
AND tpr.profile_id = ?
AND t.deleted_at IS NULL")
(defn- get-owned-teams
[cfg profile-id]
(->> (db/exec! cfg [sql:get-owned-teams profile-id])
(into [] (map decode-row))))
(sv/defmethod ::get-owned-teams
{::doc/added "2.8.0"
::sm/params schema:get-teams}
[cfg {:keys [::rpc/profile-id]}]
(get-owned-teams cfg profile-id))
;; --- Query: Team (by ID)
@@ -181,39 +235,43 @@
(defn get-team
[conn & {:keys [profile-id team-id project-id file-id] :as params}]
(dm/assert!
"connection or pool is mandatory"
(or (db/connection? conn)
(db/pool? conn)))
(assert (uuid? profile-id) "profile-id is mandatory")
(assert (or (db/connection? conn)
(db/pool? conn))
"connection or pool is mandatory")
(dm/assert!
"profile-id is mandatory"
(uuid? profile-id))
(let [{:keys [default-team-id] :as profile}
(profile/get-profile conn profile-id)
(let [{:keys [default-team-id] :as profile} (profile/get-profile conn profile-id)
result (cond
(some? team-id)
(let [sql (str "WITH teams AS (" sql:get-teams-with-permissions
") SELECT * FROM teams WHERE id=?")]
(db/exec-one! conn [sql default-team-id profile-id team-id]))
sql
(if (contains? cf/flags :subscriptions)
sql:get-teams-with-permissions-and-subscription
sql:get-teams-with-permissions)
(some? project-id)
(let [sql (str "WITH teams AS (" sql:get-teams-with-permissions ") "
"SELECT t.* FROM teams AS t "
" JOIN project AS p ON (p.team_id = t.id) "
" WHERE p.id=?")]
(db/exec-one! conn [sql default-team-id profile-id project-id]))
result
(cond
(some? team-id)
(let [sql (str "WITH teams AS (" sql ") "
"SELECT * FROM teams WHERE id=?")]
(db/exec-one! conn [sql default-team-id profile-id team-id]))
(some? file-id)
(let [sql (str "WITH teams AS (" sql:get-teams-with-permissions ") "
"SELECT t.* FROM teams AS t "
" JOIN project AS p ON (p.team_id = t.id) "
" JOIN file AS f ON (f.project_id = p.id) "
" WHERE f.id=?")]
(db/exec-one! conn [sql default-team-id profile-id file-id]))
(some? project-id)
(let [sql (str "WITH teams AS (" sql ") "
"SELECT t.* FROM teams AS t "
" JOIN project AS p ON (p.team_id = t.id) "
" WHERE p.id=?")]
(db/exec-one! conn [sql default-team-id profile-id project-id]))
:else
(throw (IllegalArgumentException. "invalid arguments")))]
(some? file-id)
(let [sql (str "WITH teams AS (" sql ") "
"SELECT t.* FROM teams AS t "
" JOIN project AS p ON (p.team_id = t.id) "
" JOIN file AS f ON (f.project_id = p.id) "
" WHERE f.id=?")]
(db/exec-one! conn [sql default-team-id profile-id file-id]))
:else
(throw (IllegalArgumentException. "invalid arguments")))]
(when-not result
(ex/raise :type :not-found
@@ -286,18 +344,18 @@
;; implemented in UI)
(def sql:team-users
"select pf.id, pf.fullname, pf.photo_id
"select pf.id, pf.fullname, pf.photo_id, pf.email
from profile as pf
inner join team_profile_rel as tpr on (tpr.profile_id = pf.id)
where tpr.team_id = ?
union
select pf.id, pf.fullname, pf.photo_id
select pf.id, pf.fullname, pf.photo_id, pf.email
from profile as pf
inner join project_profile_rel as ppr on (ppr.profile_id = pf.id)
inner join project as p on (ppr.project_id = p.id)
where p.team_id = ?
union
select pf.id, pf.fullname, pf.photo_id
select pf.id, pf.fullname, pf.photo_id, pf.email
from profile as pf
inner join file_profile_rel as fpr on (fpr.profile_id = pf.id)
inner join file as f on (fpr.file_id = f.id)
@@ -308,6 +366,30 @@
[conn team-id]
(db/exec! conn [sql:team-users team-id team-id team-id]))
;; Get the users but add the props property
(def sql:team-users+props
"select pf.id, pf.fullname, pf.photo_id, pf.email, pf.props
from profile as pf
inner join team_profile_rel as tpr on (tpr.profile_id = pf.id)
where tpr.team_id = ?
union
select pf.id, pf.fullname, pf.photo_id, pf.email, pf.props
from profile as pf
inner join project_profile_rel as ppr on (ppr.profile_id = pf.id)
inner join project as p on (ppr.project_id = p.id)
where p.team_id = ?
union
select pf.id, pf.fullname, pf.photo_id, pf.email, pf.props
from profile as pf
inner join file_profile_rel as fpr on (fpr.profile_id = pf.id)
inner join file as f on (fpr.file_id = f.id)
inner join project as p on (f.project_id = p.id)
where p.team_id = ?")
(defn get-users+props
[conn team-id]
(db/exec! conn [sql:team-users+props team-id team-id team-id]))
(def sql:get-team-by-file
"SELECT t.*
FROM team AS t
@@ -503,14 +585,14 @@
(sv/defmethod ::update-team
{::doc/added "1.17"
::sm/params schema:update-team}
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id id name] :as params}]
(db/with-atomic [conn pool]
(check-edition-permissions! conn profile-id id)
(db/update! conn :team
{:name name}
{:id id})
nil))
::sm/params schema:update-team
::db/transaction true}
[{:keys [::db/conn] :as cfg} {:keys [::rpc/profile-id id name]}]
(check-edition-permissions! conn profile-id id)
(db/update! conn :team
{:name name}
{:id id})
nil)
;; --- Mutation: Leave Team
@@ -568,22 +650,22 @@
(sv/defmethod ::leave-team
{::doc/added "1.17"
::sm/params schema:leave-team}
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id] :as params}]
(db/with-atomic [conn pool]
(leave-team conn (assoc params :profile-id profile-id))))
::sm/params schema:leave-team
::db/transaction true}
[{:keys [::db/conn] :as cfg} {:keys [::rpc/profile-id] :as params}]
(leave-team conn (assoc params :profile-id profile-id)))
;; --- Mutation: Delete Team
(defn- delete-team
"Mark a team for deletion"
[conn team-id]
[conn {:keys [id] :as team}]
(let [deleted-at (dt/now)
team (db/update! conn :team
{:deleted-at deleted-at}
{:id team-id}
{::db/return-keys true})]
(let [delay (ldel/get-deletion-delay team)
team (db/update! conn :team
{:deleted-at (dt/in-future delay)}
{:id id}
{::db/return-keys true})]
(when (:is-default team)
(ex/raise :type :validation
@@ -593,8 +675,8 @@
(wrk/submit! {::db/conn conn
::wrk/task :delete-object
::wrk/params {:object :team
:deleted-at deleted-at
:id team-id}})
:deleted-at (:deleted-at team)
:id id}})
team))
(def ^:private schema:delete-team
@@ -603,16 +685,18 @@
(sv/defmethod ::delete-team
{::doc/added "1.17"
::sm/params schema:delete-team}
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id id] :as params}]
(db/with-atomic [conn pool]
(let [perms (get-permissions conn profile-id id)]
(when-not (:is-owner perms)
(ex/raise :type :validation
:code :only-owner-can-delete-team))
::sm/params schema:delete-team
::db/transaction true}
[{:keys [::db/conn] :as cfg} {:keys [::rpc/profile-id id] :as params}]
(let [team (get-team conn :profile-id profile-id :team-id id)
perms (get team :permissions)]
(delete-team conn id)
nil)))
(when-not (:is-owner perms)
(ex/raise :type :validation
:code :only-owner-can-delete-team))
(delete-team conn team)
nil))
;; --- Mutation: Team Update Role
@@ -690,31 +774,30 @@
(sv/defmethod ::delete-team-member
{::doc/added "1.17"
::sm/params schema:delete-team-member}
[{:keys [::db/pool ::mbus/msgbus] :as cfg} {:keys [::rpc/profile-id team-id member-id] :as params}]
(db/with-atomic [conn pool]
(let [team (get-team pool :profile-id profile-id :team-id team-id)
perms (get-permissions conn profile-id team-id)]
(when-not (or (:is-owner perms)
(:is-admin perms))
(ex/raise :type :validation
:code :insufficient-permissions))
::sm/params schema:delete-team-member
::db/transaction true}
[{:keys [::db/conn ::mbus/msgbus] :as cfg} {:keys [::rpc/profile-id team-id member-id] :as params}]
(let [team (get-team conn :profile-id profile-id :team-id team-id)
perms (get-permissions conn profile-id team-id)]
(when-not (or (:is-owner perms)
(:is-admin perms))
(ex/raise :type :validation
:code :insufficient-permissions))
(when (= member-id profile-id)
(ex/raise :type :validation
:code :cant-remove-yourself))
(when (= member-id profile-id)
(ex/raise :type :validation
:code :cant-remove-yourself))
(db/delete! conn :team-profile-rel {:profile-id member-id
:team-id team-id})
(db/delete! conn :team-profile-rel {:profile-id member-id
:team-id team-id})
(mbus/pub! msgbus
:topic member-id
:message {:type :team-membership-change
:change :removed
:team-id team-id
:team-name (:name team)})
(mbus/pub! msgbus
:topic member-id
:message {:type :team-membership-change
:change :removed
:team-id team-id
:team-name (:name team)})
nil)))
nil))
;; --- Mutation: Update Team Photo
@@ -740,16 +823,16 @@
(let [team (get-team pool :profile-id profile-id :team-id team-id)
photo (profile/upload-photo cfg params)]
(db/with-atomic [conn pool]
(check-admin-permissions! conn profile-id team-id)
;; Mark object as touched for make it ellegible for tentative
;; garbage collection.
(when-let [id (:photo-id team)]
(sto/touch-object! storage id))
(check-admin-permissions! pool profile-id team-id)
;; Save new photo
(db/update! pool :team
{:photo-id (:id photo)}
{:id team-id})
;; Mark object as touched for make it ellegible for tentative
;; garbage collection.
(when-let [id (:photo-id team)]
(sto/touch-object! storage id))
(assoc team :photo-id (:id photo)))))
;; Save new photo
(db/update! pool :team
{:photo-id (:id photo)}
{:id team-id})
(assoc team :photo-id (:id photo))))

View File

@@ -6,6 +6,7 @@
(ns app.rpc.commands.teams-invitations
(:require
[app.common.data :as d]
[app.common.data.macros :as dm]
[app.common.exceptions :as ex]
[app.common.features :as cfeat]
@@ -15,7 +16,6 @@
[app.common.uuid :as uuid]
[app.config :as cf]
[app.db :as db]
[app.db.sql :as sql]
[app.email :as eml]
[app.loggers.audit :as audit]
[app.main :as-alias main]
@@ -34,7 +34,6 @@
;; --- Mutation: Create Team Invitation
(def sql:upsert-team-invitation
"insert into team_invitation(id, team_id, email_to, created_by, role, valid_until)
values (?, ?, ?, ?, ?, ?)
@@ -79,27 +78,23 @@
[:role ::types.team/role]
[:email ::sm/email]])
(def ^:private check-create-invitation-params!
(def ^:private check-create-invitation-params
(sm/check-fn schema:create-invitation))
(defn- allow-invitation-emails?
[member]
(let [notifications (dm/get-in member [:props :notifications])]
(not= :none (:email-invites notifications))))
(defn- create-invitation
[{:keys [::db/conn] :as cfg} {:keys [team profile role email] :as params}]
(dm/assert!
"expected valid connection on cfg parameter"
(db/connection? conn))
(dm/assert!
"expected valid params for `create-invitation` fn"
(check-create-invitation-params! params))
(assert (db/connection? conn) "expected valid connection on cfg parameter")
(assert (check-create-invitation-params params))
(let [email (profile/clean-email email)
member (profile/get-profile-by-email conn email)]
(teams/check-profile-muted conn member)
(teams/check-email-bounce conn email true)
(teams/check-email-spam conn email true)
;; When we have email verification disabled and invitation user is
;; already present in the database, we proceed to add it to the
;; team as-is, without email roundtrip.
@@ -125,62 +120,65 @@
nil)
(let [id (uuid/next)
expire (dt/in-future "168h") ;; 7 days
invitation (db/exec-one! conn [sql:upsert-team-invitation id
(:id team) (str/lower email)
(:id profile)
(name role) expire
(name role) expire])
updated? (not= id (:id invitation))
profile-id (:id profile)
tprops {:profile-id profile-id
:invitation-id (:id invitation)
:valid-until expire
:team-id (:id team)
:member-email (:email-to invitation)
:member-id (:id member)
:role role}
itoken (create-invitation-token cfg tprops)
ptoken (create-profile-identity-token cfg profile-id)]
(do
(some->> member (teams/check-profile-muted conn))
(teams/check-email-bounce conn email true)
(teams/check-email-spam conn email true)
(when (contains? cf/flags :log-invitation-tokens)
(l/info :hint "invitation token" :token itoken))
(let [id (uuid/next)
expire (dt/in-future "168h") ;; 7 days
invitation (db/exec-one! conn [sql:upsert-team-invitation id
(:id team) (str/lower email)
(:id profile)
(name role) expire
(name role) expire])
updated? (not= id (:id invitation))
profile-id (:id profile)
tprops {:profile-id profile-id
:invitation-id (:id invitation)
:valid-until expire
:team-id (:id team)
:member-email (:email-to invitation)
:member-id (:id member)
:role role}
itoken (create-invitation-token cfg tprops)
ptoken (create-profile-identity-token cfg profile-id)]
(let [props (-> (dissoc tprops :profile-id)
(audit/clean-props))
evname (if updated?
"update-team-invitation"
"create-team-invitation")
event (-> (audit/event-from-rpc-params params)
(assoc ::audit/name evname)
(assoc ::audit/props props))]
(audit/submit! cfg event))
(when (contains? cf/flags :log-invitation-tokens)
(l/info :hint "invitation token" :token itoken))
(eml/send! {::eml/conn conn
::eml/factory eml/invite-to-team
:public-uri (cf/get :public-uri)
:to email
:invited-by (:fullname profile)
:team (:name team)
:token itoken
:extra-data ptoken})
(let [props (-> (dissoc tprops :profile-id)
(audit/clean-props))
evname (if updated?
"update-team-invitation"
"create-team-invitation")
event (-> (audit/event-from-rpc-params params)
(assoc ::audit/name evname)
(assoc ::audit/props props))]
(audit/submit! cfg event))
itoken))))
(when (allow-invitation-emails? member)
(eml/send! {::eml/conn conn
::eml/factory eml/invite-to-team
:public-uri (cf/get :public-uri)
:to email
:invited-by (:fullname profile)
:team (:name team)
:token itoken
:extra-data ptoken}))
(defn- add-user-to-team
[conn profile team role email]
itoken)))))
(defn- add-member-to-team
[conn profile team role member]
(let [team-id (:id team)
member (db/get* conn :profile
{:email (str/lower email)}
{::sql/columns [:id :email]})
params (merge
{:team-id team-id
:profile-id (:id member)}
(get types.team/permissions-for-role role))]
;; Do not allow blocked users to join teams.
;; Do not allow blocked users to join teams.
(when (:is-blocked member)
(ex/raise :type :restriction
:code :profile-blocked))
@@ -205,29 +203,33 @@
(eml/send! {::eml/conn conn
::eml/factory eml/join-team
:public-uri (cf/get :public-uri)
:to email
:to (:email member)
:invited-by (:fullname profile)
:team (:name team)
:team-id (:id team)})))
(def sql:valid-requests-email
"SELECT p.email
(def ^:private sql:valid-access-request-profiles
"SELECT p.id, p.email, p.is_blocked
FROM team_access_request AS tr
JOIN profile AS p ON (tr.requester_id = p.id)
WHERE tr.team_id = ?
AND tr.auto_join_until > now()")
AND tr.auto_join_until > now()
AND (p.deleted_at IS NULL OR
p.deleted_at > now())")
(defn- get-valid-requests-email
(defn- get-valid-access-request-profiles
[conn team-id]
(db/exec! conn [sql:valid-requests-email team-id]))
(db/exec! conn [sql:valid-access-request-profiles team-id]))
(def ^:private xf:map-email
(map :email))
(def ^:private xf:map-email (map :email))
(defn- create-team-invitations
[{:keys [::db/conn] :as cfg} {:keys [profile team role emails] :as params}]
(let [join-requests (into #{} xf:map-email
(get-valid-requests-email conn (:id team)))
(let [emails (set emails)
join-requests (->> (get-valid-access-request-profiles conn (:id team))
(d/index-by :email))
team-members (into #{} xf:map-email
(teams/get-team-members conn (:id team)))
@@ -245,8 +247,10 @@
;; For requested invitations, do not send invitation emails, add
;; the user directly to the team
(->> (filter join-requests emails)
(run! (partial add-user-to-team conn profile team role)))
(->> join-requests
(filter #(contains? emails (key %)))
(map val)
(run! (partial add-member-to-team conn profile team role)))
invitations))
@@ -404,20 +408,20 @@
(sv/defmethod ::update-team-invitation-role
{::doc/added "1.17"
::doc/module :teams
::sm/params schema:update-team-invitation-role}
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id team-id email role] :as params}]
(db/with-atomic [conn pool]
(let [perms (teams/get-permissions conn profile-id team-id)]
::sm/params schema:update-team-invitation-role
::db/transaction true}
[{:keys [::db/conn]} {:keys [::rpc/profile-id team-id email role] :as params}]
(let [perms (teams/get-permissions conn profile-id team-id)]
(when-not (:is-admin perms)
(ex/raise :type :validation
:code :insufficient-permissions))
(when-not (:is-admin perms)
(ex/raise :type :validation
:code :insufficient-permissions))
(db/update! conn :team-invitation
{:role (name role) :updated-at (dt/now)}
{:team-id team-id :email-to (profile/clean-email email)})
(db/update! conn :team-invitation
{:role (name role) :updated-at (dt/now)}
{:team-id team-id :email-to (profile/clean-email email)})
nil)))
nil))
;; --- Mutation: Delete invitation
@@ -428,20 +432,20 @@
(sv/defmethod ::delete-team-invitation
{::doc/added "1.17"
::sm/params schema:delete-team-invition}
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id team-id email] :as params}]
(db/with-atomic [conn pool]
(let [perms (teams/get-permissions conn profile-id team-id)]
::sm/params schema:delete-team-invition
::db/transaction true}
[{:keys [::db/conn]} {:keys [::rpc/profile-id team-id email] :as params}]
(let [perms (teams/get-permissions conn profile-id team-id)]
(when-not (:is-admin perms)
(ex/raise :type :validation
:code :insufficient-permissions))
(when-not (:is-admin perms)
(ex/raise :type :validation
:code :insufficient-permissions))
(let [invitation (db/delete! conn :team-invitation
{:team-id team-id
:email-to (profile/clean-email email)}
{::db/return-keys true})]
(rph/wrap nil {::audit/props {:invitation-id (:id invitation)}})))))
(let [invitation (db/delete! conn :team-invitation
{:team-id team-id
:email-to (profile/clean-email email)}
{::db/return-keys true})]
(rph/wrap nil {::audit/props {:invitation-id (:id invitation)}}))))
;; --- Mutation: Request Team Invitation
@@ -572,5 +576,3 @@
(with-meta {:request request}
{::audit/props {:request 1}}))))

View File

@@ -6,18 +6,19 @@
(ns app.rpc.commands.viewer
(:require
[app.binfile.common :as bfc]
[app.common.exceptions :as ex]
[app.common.features :as cfeat]
[app.common.schema :as sm]
[app.config :as cf]
[app.db :as db]
[app.rpc :as-alias rpc]
[app.rpc.commands.comments :as comments]
[app.rpc.commands.files :as files]
[app.rpc.commands.teams :as teams]
[app.rpc.cond :as-alias cond]
[app.rpc.doc :as-alias doc]
[app.util.services :as sv]))
[app.util.services :as sv]
[cuerdas.core :as str]))
;; --- QUERY: View Only Bundle
@@ -27,6 +28,27 @@
(update :pages (fn [pages] (filterv #(contains? allowed %) pages)))
(update :pages-index select-keys allowed)))
(defn obfuscate-email
[email]
(let [[name domain]
(str/split email "@" 2)
[_ rest]
(str/split domain "." 2)
name
(if (> (count name) 3)
(str (subs name 0 1) (apply str (take (dec (count name)) (repeat "*"))))
"****")]
(str name "@****." rest)))
(defn anonymize-member
[member]
(-> (select-keys member [:id :email :name :fullname :photo-id])
(update :email obfuscate-email)
(assoc :can-read true)))
(defn- get-view-only-bundle
[{:keys [::db/conn] :as cfg} {:keys [profile-id file-id ::perms] :as params}]
(let [file (files/get-file cfg file-id)
@@ -38,10 +60,13 @@
team (-> (db/get conn :team {:id (:team-id project)})
(teams/decode-row))
members (into #{} (->> (teams/get-team-members conn (:team-id project))
(map :id)))
members (cond->> (teams/get-team-members conn (:team-id project))
(= :share-link (:type perms))
(mapv anonymize-member))
perms (assoc perms :in-team (contains? members profile-id))
member-ids (into #{} (map :id) members)
perms (assoc perms :in-team (contains? member-ids profile-id))
_ (-> (cfeat/get-team-enabled-features cf/flags team)
(cfeat/check-client-features! (:features params))
@@ -54,8 +79,10 @@
:always
(update :data select-keys [:id :options :pages :pages-index :components]))
libs (files/get-file-libraries conn file-id)
users (comments/get-file-comments-users conn file-id profile-id)
libs (->> (bfc/get-file-libraries conn file-id)
(mapv (fn [{:keys [id] :as lib}]
(merge lib (files/get-file cfg id)))))
links (->> (db/query conn :share-link {:file-id file-id})
(mapv (fn [row]
(-> row
@@ -71,13 +98,14 @@
{:team-id (:id team)
:deleted-at nil})]
{:users users
{:users members
:profiles members
:fonts fonts
:project project
:share-links links
:libraries libs
:file file
:team team
:team (assoc team :permissions perms)
:permissions perms}))
(def schema:get-view-only-bundle

View File

@@ -144,20 +144,20 @@
(sv/defmethod ::delete-webhook
{::doc/added "1.17"
::sm/params schema:delete-webhook}
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id id]}]
(db/with-atomic [conn pool]
(let [whook (-> (db/get conn :webhook {:id id}) decode-row)]
(check-webhook-edition-permissions! conn profile-id (:team-id whook) (:profile-id whook))
(db/delete! conn :webhook {:id id})
nil)))
::sm/params schema:delete-webhook
::db/transaction true}
[{:keys [::db/conn]} {:keys [::rpc/profile-id id]}]
(let [whook (-> (db/get conn :webhook {:id id}) decode-row)]
(check-webhook-edition-permissions! conn profile-id (:team-id whook) (:profile-id whook))
(db/delete! conn :webhook {:id id})
nil))
;; --- Query: Webhooks
(def sql:get-webhooks
"SELECT id, uri, mtype, is_active, error_code, error_count, profile_id
FROM webhook
WHERE team_id = ?
"SELECT id, uri, mtype, is_active, error_code, error_count, profile_id
FROM webhook
WHERE team_id = ?
ORDER BY uri")
(def ^:private schema:get-webhooks

View File

@@ -9,6 +9,7 @@
(:require
[app.common.data :as d]
[app.common.exceptions :as ex]
[app.common.json :as json]
[app.common.pprint :as pp]
[app.common.schema :as sm]
[app.common.schema.desc-js-like :as smdj]
@@ -19,7 +20,6 @@
[app.http.sse :as-alias sse]
[app.loggers.webhooks :as-alias webhooks]
[app.rpc :as-alias rpc]
[app.util.json :as json]
[app.util.services :as sv]
[app.util.template :as tmpl]
[clojure.java.io :as io]
@@ -86,7 +86,7 @@
(fn [request]
(let [params (:query-params request)
pstyle (:type params "js")
context (assoc context :param-style pstyle)]
context (assoc @context :param-style pstyle)]
{::yres/status 200
::yres/body (-> (io/resource "app/templates/api-doc.tmpl")
@@ -178,8 +178,7 @@
(fn [_]
{::yres/status 200
::yres/headers {"content-type" "application/json; charset=utf-8"}
::yres/body (json/encode context)})
::yres/body (json/encode @context)})
(fn [_]
{::yres/status 404})))
@@ -209,7 +208,7 @@
(defmethod ig/init-key ::routes
[_ {:keys [::rpc/methods] :as cfg}]
[(let [context (prepare-doc-context methods)]
[(let [context (delay (prepare-doc-context methods))]
[["/_doc"
{:handler (doc-handler context)
:allowed-methods #{:get}}]
@@ -217,7 +216,7 @@
{:handler (doc-handler context)
:allowed-methods #{:get}}]])
(let [context (prepare-openapi-context methods)]
(let [context (delay (prepare-openapi-context methods))]
[["/openapi"
{:handler (openapi-handler)
:allowed-methods #{:get}}]

View File

@@ -78,19 +78,19 @@
(defmethod ig/init-key ::props
[_ {:keys [::db/pool ::key] :as cfg}]
(db/with-atomic [conn pool]
(db/xact-lock! conn 0)
(when-not key
(l/warn :hint (str "using autogenerated secret-key, it will change on each restart and will invalidate "
"all sessions on each restart, it is hightly recommended setting up the "
"PENPOT_SECRET_KEY environment variable")))
(let [secret (or key (generate-random-key))]
(-> (get-all-props conn)
(assoc :secret-key secret)
(assoc :tokens-key (keys/derive secret :salt "tokens"))
(update :instance-id handle-instance-id conn (db/read-only? pool))))))
(db/tx-run! cfg (fn [{:keys [::db/conn]}]
(db/xact-lock! conn 0)
(when-not key
(l/warn :hint (str "using autogenerated secret-key, it will change on each restart and will invalidate "
"all sessions on each restart, it is highly recommended setting up the "
"PENPOT_SECRET_KEY environment variable")))
(let [secret (or key (generate-random-key))]
(-> (get-all-props conn)
(assoc :secret-key secret)
(assoc :tokens-key (keys/derive secret :salt "tokens"))
(update :instance-id handle-instance-id conn (db/read-only? pool)))))))
;; FIXME
(sm/register! ::props :any)

View File

@@ -54,6 +54,7 @@
(::setup/templates cfg))]
(let [dest (fs/join fs/*cwd* "builtin-templates")
path (or (:path template) (fs/join dest template-id))]
(if (fs/exists? path)
(io/input-stream path)
(let [resp (http/req! cfg

Some files were not shown because too many files have changed in this diff Show More