Compare commits

...

1028 Commits

Author SHA1 Message Date
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
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
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
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
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
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
Andrey Antukh
e3b3fa3342 📎 Update changelog 2025-03-13 09:32:19 +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
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
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
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
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
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
Eva Marco
09ff7372da 🐛 Fix scroll on storybook doc filesç 2025-03-06 12:29:48 +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
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
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 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
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
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
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
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
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
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
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
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
Luis de Dios
91efcd17a2 🐛 Fix design panel does not reappear if comment draft is open 2025-02-25 10:30:11 +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
Yamila Moreno
aac61ff229 📚 Document how to troubleshoot Penpot (#5937) 2025-02-24 12:07:47 +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
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
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
Eva Marco
dda9f62504 🐛 Fix menu shadow color 2025-02-20 17:23:28 +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
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
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
luisδμ
0784d6b62a 🐛 Fix reposition comment bubbles under viewer role (#5905) 2025-02-19 16:47:53 +01:00
Alejandro
7a7fa44f6b 🐛 Fix click prototype flow (#5896) 2025-02-19 16:00:17 +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
alonso.torres
e7b9ae6415 🐛 Remove fit content shortcut 2025-02-19 13:02:53 +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
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
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
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
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
Alonso Torres
0900b7a572 🐛 Fix problem with grid layout duplicate positioning (#5877) 2025-02-18 10:17:42 +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
Eva Marco
5e3b47e455 🎉 Add integration test for bug (#5875) 2025-02-17 16:29:28 +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
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
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
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
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
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
Eva Marco
6bb7fa26f4 🐛 Fix rename blocked boards (#5845) 2025-02-14 11:47:16 +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
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
Alejandro
f8820695cc 🐛 Fix incorrect numbering files when new team (#5835) 2025-02-13 11:55:59 +01:00
andrés gonzález
2d1d1fee1c 📚 Info about gradients (#5843) 2025-02-13 10:42:56 +01:00
Luis de Dios
4c6f086f82 ♻️ Use constant for zero width space 2025-02-13 09:17:09 +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
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
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
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
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
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
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
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
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
Andrey Antukh
f173e15bb3 Merge branch 'main' into staging 2025-02-10 12:00:57 +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
andrés gonzález
debad85d6d 📚 Add info about fit board to content (#5800) 2025-02-07 16:41:04 +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
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
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
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
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
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
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
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
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
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
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
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
Andrey Antukh
7ca98ddf21 📎 Add missing entry on changelog 2025-01-22 16:07:07 +01:00
Alejandro Alonso
5be92009bc 🐛 Fix extra rotations for frames contained elements with wasm render 2025-01-22 16:06:34 +01:00
Pablo Alba
15157c54b1 🐛 Fix shape-ref cycles 2025-01-22 16:05:50 +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
Pablo Alba
232b29cd89 Merge pull request #5627 from penpot/niwinz-file-gc-improvements
 Minor improvements to file-gc code merged in other commit
2025-01-21 09:58:29 +01:00
Andrey Antukh
642efcb47b Merge remote-tracking branch 'origin/staging' into develop 2025-01-20 23:29:54 +01:00
Andrey Antukh
da0704081f 📎 Normalize default opts for db/plan function 2025-01-20 23:23:31 +01:00
Andrey Antukh
066b1235a6 🐛 Pass correct default options on db/plan fn 2025-01-20 23:23:31 +01:00
Pablo Alba
141694dc8d Merge pull request #5598 from penpot/niwinz-file-gc-improvements
 Add efficiency improvements to file-gc task
2025-01-20 21:14:32 +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
Andrey Antukh
151aedcf91 ♻️ Make the components cleaning mechanism on file-gc task more efficient 2025-01-20 16:35:14 +01:00
Andrey Antukh
5513daf17d ♻️ Make the media cleaning mechanism on file-gc task more efficient
Replaces the use of db/cursor with db/plan, that teorethically allows
processing large results without consuming all result set in memory
2025-01-20 16:34:05 +01:00
Andrey Antukh
fde0f3c182 🐛 Pass correct default options on db/plan fn 2025-01-20 16:34:05 +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
7b408e4db1 Merge pull request #5622 from penpot/niwinz-api-doc-fix
🐛 Fix api docs page issue
2025-01-20 15:21:45 +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
Pablo Alba
b8fd829f9d Merge pull request #5621 from penpot/marina/testab-hover-state-add-file
 A/B test switching '+' to 'Add file' in an empty project
2025-01-20 12:49:19 +01:00
Belén Albeza
2f80d337ad 🐛 Fix WebGL warning when switching pages 2025-01-20 12:41:39 +01:00
Andrey Antukh
089a66881c Make frontend app setup logging message more easy to be read
Mainly printing flag per line, making it more easily for human eye look
if some feature is active or not
2025-01-20 12:40:28 +01:00
Andrey Antukh
402eacdb22 Merge remote-tracking branch 'origin/staging' into develop 2025-01-20 12:38:23 +01:00
Andrey Antukh
667b5fb6ee 🐛 Fix missing methods reference from api docs page 2025-01-20 12:30:20 +01:00
Andrey Antukh
f0f89151c5 Merge pull request #5620 from penpot/palba-consolidate-board-icon-change
Consolidate board icon change
2025-01-20 12:22:07 +01:00
Andrey Antukh
1221d60357 Merge pull request #5617 from penpot/alotor-hotfix-plugins
🐛 Fix problem in plugins with `replaceColor` method
2025-01-20 12:21:16 +01:00
alonso.torres
f553fa10d8 🐛 Fix problem in plugins with replaceColor method 2025-01-20 12:02:54 +01:00
Marina López
96947b0219 A/B test switching '+' to 'Add file' in an empty project 2025-01-20 11:56:15 +01:00
Pablo Alba
e2900d9012 🎉 Change of boards icon 2025-01-20 11:07:13 +01:00
Andrey Antukh
12ec3b4942 Merge remote-tracking branch 'origin/staging' into develop 2025-01-20 11:06:26 +01:00
Pablo Alba
1f0e470419 Revert "🎉 Add A/B test of use of boards if we just change the icon for “standard” one"
This reverts commit 0c586551c4.
2025-01-20 11:06:25 +01:00
Pablo Alba
21f4abf1b8 🐛 Fix history panel doesn't close on esc 2025-01-20 11:02:32 +01:00
Andrey Antukh
079a945c2f Merge branch 'main' into staging 2025-01-20 11:02:08 +01:00
Madalena Melo
542d709541 📚 Add viewer role documentation
Add viewer role to the team roles; also made some tweaks to the descriptions of the other roles
2025-01-20 11:01:38 +01:00
Madalena Melo
4f1d5a19e4 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
2025-01-20 10:26:52 +01:00
Madalena Melo
91b0c47244 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
2025-01-20 10:26:46 +01:00
Madalena Melo
a7a49e4b39 Viewer Role - Update index.njk
Add viewer role to the team roles; also made some tweaks to the descriptions of the other roles
2025-01-20 10:26:39 +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
ba81b2b14d Merge pull request #5613 from penpot/superalex-fix-staging-reply-to-comment
🐛 Fix reply to comment
2025-01-17 15:23:28 +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
Alejandro Alonso
423c237d42 🐛 Fix reply to comment 2025-01-17 11:57:44 +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
5a55884b9f Merge pull request #5602 from penpot/hiru-fix-detach-2
🐛 Fix detach when top copy is dangling and nested copy is not
2025-01-16 12:21:33 +01:00
Andrey Antukh
9594e72bef Merge remote-tracking branch 'origin/staging' into develop 2025-01-16 12:20:45 +01:00
Andrey Antukh
38fd343c53 Merge remote-tracking branch 'origin/main' into staging 2025-01-16 12:20:27 +01:00
adi-lb-phoenix
94976aa2b1 📚 Fix incorrect flag on configuration.md 2025-01-16 12:19:03 +01:00
Andrés Moya
5247d217ab 🐛 Fix detach when top copy is dangling and nested copy is not 2025-01-16 10:45:54 +01:00
Andrey Antukh
cb650ebf1c Merge remote-tracking branch 'origin/staging' into develop 2025-01-16 10:45:22 +01:00
Andrey Antukh
40693e6857 🐛 Make the PENPOT_SECRET_KEY optional
Fix a regression introduced with 2.4
2025-01-16 09:59:19 +01:00
Andrey Antukh
5c428b5aa5 🐛 Fix repeated password update on login
because the default options were not being passed in the verification
2025-01-16 09:59:19 +01:00
Andrey Antukh
e92ddee33a 🐳 Move devenv secret key env asignation to scripts
from the docker compose
2025-01-16 09:59:19 +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
Eva Marco
c121f459ba Merge pull request #5571 from penpot/andy-docs-radius
📚 Change term for border radius
2025-01-15 10:18:05 +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
Andrey Antukh
698a258290 Merge remote-tracking branch 'origin/main' into staging 2025-01-14 17:47:32 +01:00
Yamila Moreno
aa023d847d 🐳 Set correct internal url frontend url for exporter 2025-01-14 17:37:14 +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
Andrey Antukh
53f57dad0b Merge pull request #5575 from penpot/azazeln28-fix-text-editor-issue-9285
🐛 Fix text editor copy/paste issue
2025-01-14 16:50:34 +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
AzazelN28
d7d7535ab4 🐛 Fix text editor copy/paste issue 2025-01-14 11:20: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
Pablo Alba
accc662e1c 🐛 Fix login is not shown on 404 2025-01-14 09:51: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
andy
1efc1516e2 📚 Change term for border radius 2025-01-13 15:53:06 +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
Alejandro
b5d731ca72 Merge pull request #5559 from penpot/palba-fix-flags-not-setting-login
🐛 Fix feature flags not setting on login
2025-01-13 10:57:37 +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
Pablo Alba
e380289e34 🐛 Fix feature flags not setting on login 2025-01-10 21:25:55 +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
b22323a484 Merge pull request #5547 from penpot/alotor-bugs-1
🐛 Fix problem when changing color libraries
2025-01-10 15:16:01 +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
alonso.torres
58dd23f9c7 🐛 Fix problem when changing color libraries 2025-01-10 12:33:16 +01:00
Andrey Antukh
54e7551d56 🐛 Backport comments decoding from develop
Mainly for backward compatibility with database
layout on comments tables from develop / v2.5
2025-01-10 12:20:53 +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
Andrey Antukh
404297f837 Merge pull request #5537 from penpot/azazeln28-fix-text-editor-issue-9716
🐛 Fix text editor issue 9716
2025-01-10 10:24:23 +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
Andrey Antukh
33f853ff2e Merge pull request #5511 from penpot/alotor-fix-touched-import
🐛 Fix error when importing files with touched components
2025-01-09 17:13:22 +01:00
alonso.torres
d16513be9d 🐛 Fix error when importing files with touched components 2025-01-09 16:58:40 +01:00
AzazelN28
ad077696b0 🐛 Fix Unknown node type when replacing whole root node 2025-01-09 16:28:32 +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
Andrey Antukh
1cbeafe85c Merge pull request #5525 from penpot/palba-testabc-add-library
A/B/C test for rename and change look and feel of "libraries" button
2025-01-09 08:34:05 +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
Pablo Alba
76c8523f44 Add test ABC renaming "Libraries" to "Add library" 2025-01-08 13:20:52 +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
Pablo Alba
f277d8b125 Revert " Add test AB renaming "Libraries" to "Add library""
This reverts commit 664cacbe9d.
2025-01-08 11:05:50 +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
Andrey Antukh
60af8d0bcb Merge pull request #5520 from penpot/azazeln28-fix-text-editor-issue-9285
Fix Copy/Paste text into the text block
2025-01-07 14:26:11 +01:00
Juanfran
d652ed8e68 Merge pull request #5519 from penpot/alotor-fix-plugins-current-user
🐛 Fix problem with currentUser in plugins
2025-01-07 14:05:07 +01:00
AzazelN28
09d73a2f51 🐛 Fix pasting text changes opacity to 0 2025-01-07 13:48:32 +01:00
alonso.torres
7d4535ebd4 🐛 Fix problem with currentUser in plugins 2025-01-07 13:03:56 +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
a5a53219bf Merge remote-tracking branch 'origin/main' into staging 2025-01-07 12:00:09 +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
Marina López
8716f81765 Merge pull request #5456 from daledesilva/patch-1
📚 Add submission form link to deployment page
2025-01-07 10:58:05 +01:00
Andrey Antukh
7aa46a1f62 🔥 Remove 2.4.1 from changelog 2025-01-07 10:51:46 +01:00
Andrey Antukh
6553861a6c Update rumext version
Mainly for usability and performance improvements
2025-01-07 10:43:23 +01:00
Andrey Antukh
d62eb3d3f4 Merge pull request #5504 from penpot/palba-add-feature-flags-to-events
 Add feature flags info to posthog events
2025-01-07 09:34:22 +01:00
Pablo Alba
e4c427609d Add feature flags info to posthog events 2025-01-07 09:19:04 +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
Aitor Moreno
883a26845a Merge pull request #5510 from penpot/alotor-fix-thumbnail-generation
🐛 Fix problem with thumbnail generation when changing between ver…
2025-01-02 12:46:59 +01:00
Pablo Alba
54c63fef06 🐛 Fix create team modal when user is creating account via invitation 2025-01-02 12:06:54 +01:00
alonso.torres
bcdf5d86ae 🐛 Fix problem with thumbnail generation when changing between versions 2025-01-02 12:01:30 +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
Pablo Alba
3eab9da74e Merge pull request #5492 from penpot/alotor-christmas-bugfixes
🐛 Fix problem with component swap style
2024-12-26 16:39:23 +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
alonso.torres
2813fda136 🐛 Fix problem with component swap style 2024-12-23 12:37:24 +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
a0022a804b Merge branch 'backrunner-patch/backrunner_nginx-conf' into staging 2024-12-23 10:28:34 +01:00
BackRunner
068acb4303 🐛 Fix assets proxy ssl handshake error 2024-12-23 10:28:10 +01:00
Andrey Antukh
d6f98a6c79 📎 Add externs for worker build 2024-12-23 10:03:10 +01:00
Andrey Antukh
7b6c2da6da 📎 Add externs for main build
With all combinations of small symbols for indicate
to compiler to not use them for internal renaming
2024-12-23 10:03:10 +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
affed049ee Merge remote-tracking branch 'origin/main' into staging 2024-12-19 10:27:12 +01:00
alonso.torres
377f636b8e 🐛 Fix problem with reorder on grid layout layers 2024-12-18 13:32:30 +01:00
Andrey Antukh
69008fbb90 Merge remote-tracking branch 'origin/staging' into develop 2024-12-18 12:47:05 +01:00
Alejandro Alonso
2d512ef273 🐛 Fix path edition for plugins 2024-12-18 10:12:01 +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
b8ebbe8c3c Merge pull request #5468 from penpot/palba-abtest-add-library-button2
 Add test AB renaming "Libraries" to "Add library"
2024-12-13 12:20:56 +01:00
Pablo Alba
09c184200d Merge pull request #5471 from penpot/niwinz-bugfix-5
🐛 Fix unhandled exception on accepting invitation
2024-12-13 12:15:35 +01:00
Andrey Antukh
bbe0b22a8b 🐛 Fix unhandled exception on accepting invitation
In an interaction with the audit log; happens when an old invitation
(with created-by as nil) is accepted.
2024-12-13 11:48:37 +01:00
Andrey Antukh
8603085a69 Merge pull request #5470 from penpot/palba-add-config-not-show-release
🎉 Add config flag to hide release info
2024-12-13 11:28:27 +01:00
Andrey Antukh
29ec44482d Merge pull request #5463 from penpot/andy-docs-adjustments
📚 Remove broken video about History versions
2024-12-13 11:17:27 +01:00
Andrey Antukh
fd4d4ec6e3 Merge pull request #5465 from penpot/palba-fix-viewer-role-thumbnails
🐛 Fix viewer role is unable to generate thumbnails on dashboard
2024-12-13 11:16:32 +01:00
Pablo Alba
0945dd2920 🎉 Add config flag to hide release info 2024-12-13 11:14:59 +01:00
Pablo Alba
664cacbe9d Add test AB renaming "Libraries" to "Add library" 2024-12-13 10:51:41 +01:00
Pablo Alba
08516ac7ca Revert " Add test AB renaming "Libraries" to "Add library""
This reverts commit ec7f8a6aa7.
2024-12-13 10:51:25 +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
24e51eef5b 🐛 Fix viewer role is unable to generate thumbnails on dashboard 2024-12-12 15:15:27 +01:00
Andrey Antukh
ee62016c34 Merge pull request #5462 from penpot/palba-dont-show-release-info
🐛 Fix a new user shouldn't see the "What's new" popup
2024-12-12 12:27:14 +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
andy
7c10f20b95 📚 Remove deprecated video at History version 2024-12-12 11:57:08 +01:00
Pablo Alba
4958da63e5 🐛 Fix a new user shouldn't see the "What's new" popup 2024-12-12 11:45:58 +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
andy
f39a994fed 📚 Import/export images replacements and other adjustments 2024-12-12 08:38:00 +01:00
andy
5ef59d5e2e 📚 New penpot file format 2024-12-12 08:37:53 +01:00
andy
98221c6b51 📚 Images and text adjustments 2024-12-12 08:37:40 +01:00
Madalena Melo
74713cde63 File history versions
https://tree.taiga.io/project/penpot/task/9377
2024-12-12 08:37:32 +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
a5084c35b5 Merge pull request #5461 from penpot/andy-docs-blending
📚 Info about layers blend and opacity
2024-12-12 08:29:41 +01:00
andrés gonzález
cdce1df919 Merge pull request #5460 from penpot/andy-shortcuts-update
📚 History shortcut removed
2024-12-12 08:27:48 +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
andy
c75b886548 📚 Info about layers blend and opacity 2024-12-12 07:03:54 +01:00
andy
abd41e825e 📚 History shortcut removed 2024-12-12 06:22:51 +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
Andrey Antukh
97b9a7d31c 🐛 Remove hardcoded limit of 20 on the snapshot list rpc method 2024-12-11 14:13:04 +01:00
Dale de Silva
dbeebf181f 📚 Add submission form link to deployment page
The plugin submission page is hard to find while looking at the plugin help docs (As it's not linked from there). It should eventually be a page of its own but there isn't enough content yet (or an illustration) to support it.
2024-12-11 23:51:11 +11: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
Andrey Antukh
0eec09acbf Merge pull request #5441 from penpot/juan-slides-2.4
Juan slides 2.4
2024-12-11 12:49:31 +01:00
Belén Albeza
c2ffee1683 📚 Add README to rust project 2024-12-11 12:49:09 +01:00
Elhombretecla
81e250e27d 🎉 Add slides for 2.4 release 2024-12-11 12:36:29 +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
9f1f8cc80c Merge pull request #5438 from penpot/andy-docs-selfhostsettings
📚 Recommended settings for selfhost
2024-12-11 07:57:23 +01:00
andy
2440c81b42 📚 Recommended settings for selfhost 2024-12-11 07:42:01 +01:00
Alejandro
ada078abab Merge pull request #5439 from penpot/niwinz-delete-xlog-gc-task
🔥 Remove file-xlog-gc task
2024-12-11 07:29:39 +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
31319a0d04 Merge pull request #5442 from penpot/alotor-view-only-menu
🐛 Remove file history versions menu options on view mode
2024-12-10 15:20:57 +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
alonso.torres
b9cb415507 🐛 Remove file history versions menu options on view mode 2024-12-10 14:41:00 +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
Andrey Antukh
36121d862d Merge pull request #5440 from penpot/palba-ab-share-in-workspace
 Fix test A/B add share button to the workspace
2024-12-10 13:48:49 +01:00
Pablo Alba
d8964a69bc Fix test A/B add share button to the workspace 2024-12-10 13:33:04 +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
39da7d7ab6 Merge pull request #5429 from penpot/palba-bugfixing-01
🐛 Palba bugfixing 01
2024-12-10 12:33:38 +01:00
Andrey Antukh
1bb25bb89d 🔥 Remove file-xlog-gc task
It is no longer necessary because snapshots are managed by the objects-gc task
2024-12-10 12:19:12 +01:00
Pablo Alba
b0a3f2b72a 🐛 Fix history panel remains open after restoring a version 2024-12-10 11:00:54 +01:00
Pablo Alba
f2f3d9f7eb 💄 Fix css format (spacing) 2024-12-10 10:53:12 +01:00
Pablo Alba
cf72b35e73 🐛 Fix separator lines have no color at some menus 2024-12-10 10:53:12 +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
Andrey Antukh
fe8d9cf159 Merge pull request #5418 from penpot/palba-abtest-add-sugested-libraries
 Add test AB for adding a few "Suggested" libraries
2024-12-10 09:50:41 +01:00
Andrey Antukh
4cfe33bc5c Merge pull request #5436 from penpot/azazeln28-fix-text-editor-v2-copy-paste-issues
🐛 Fix copy/paste issues
2024-12-10 09:29:31 +01:00
Andrey Antukh
e5d8bc91fb 💄 Fix describe-library-blocks component syntax decl style 2024-12-10 09:26:07 +01:00
Andrey Antukh
ce1ba3f28f 💄 Fix sample-library-entry component syntax style 2024-12-10 09:21:45 +01:00
Pablo Alba
257d72ee9d Add test AB for adding a few "Suggested" libraries 2024-12-10 09:16:55 +01:00
Alejandro
0766b341bd Merge pull request #5432 from penpot/niwinz-bugfix-2
🐛 Bug fixes
2024-12-10 08:05:00 +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
AzazelN28
4ef631fd6a 🐛 Fix copy/paste issues 2024-12-09 16:10:39 +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
Andrey Antukh
a923d39603 🐛 Fix incorrect teams query on profile deletion
The current approach prevents profile deletion when
there are some extra (soft)deleted teams where the profile
is owner
2024-12-09 10:15:13 +01:00
Andrey Antukh
2f79d71262 🐛 Fix incorrect event handling on file-menu
Don't wait team to be present for open the menu,
because with slow connection speed it can cause
unexpected ux glitche showing menu when the component
inner request is resoved
2024-12-09 10:15:13 +01:00
Andrey Antukh
4881bf3619 Merge pull request #5412 from penpot/palba-abtest-add-library-button
 Add test AB renaming "Libraries" to "Add library"
2024-12-09 09:53:35 +01:00
AzazelN28
f564b4e66d 🎉 Add debug options to wasm 2024-12-05 16:36:42 +01:00
Eva Marco
69df69c4bb Merge pull request #5424 from penpot/superalex-bugfixing-30
🐛 Bug fixing
2024-12-05 16:12:16 +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
2c36a4076f Merge pull request #5427 from penpot/eva-fix-firefox-scrollbar
🐛 Fix horizontal scroll on firefox
2024-12-05 13:30:52 +01:00
Andrey Antukh
3ac6f59b7b Merge pull request #5428 from penpot/qol-versions-limit-warning
 Add autosaved versions warning
2024-12-05 13:26:59 +01:00
alonso.torres
c68a0d3967 Add autosaved versions warning 2024-12-05 13:18:03 +01:00
Andrey Antukh
aeb1ac41da 🐛 Prevent upload media objects to deleted files 2024-12-05 12:39:43 +01:00
Eva Marco
b58830260c 🐛 Fix horizontal scroll on firefox 2024-12-05 12:21:22 +01:00
Alejandro Alonso
4114d9b56f 🐛 Fix shortcut for history not working 2024-12-05 10:52:59 +01:00
Alejandro
553b9eb4bb Merge pull request #5425 from penpot/ladybenko-9477-backport
[backport] 🐛 Fix missing rename shortcut translation
2024-12-05 10:43:37 +01:00
María Valderrama
12e97c73f3 🐛 Fix missing rename shortcut translation 2024-12-05 09:59:00 +01:00
Alejandro
bd1286aace Merge pull request #5422 from penpot/eva-fix-demote-owner
🐛  Fix admin can demote owner
2024-12-05 09:37:22 +01:00
Alejandro Alonso
630f42f7ac 🐛 Fix internal error when creating a guide 2024-12-05 09:30:10 +01:00
Eva Marco
bf40cd98e8 🐛 Fix admin can demote owner 2024-12-05 09:27:32 +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
ec7f8a6aa7 Add test AB renaming "Libraries" to "Add library" 2024-12-04 13:55:55 +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
andrés gonzález
4d3192546c 📚 Update changelog with some links format 2024-12-04 09:49:33 +01:00
Belén Albeza
6623963a7f Use a static Vec<u8> to handle shared memory 2024-12-04 09:47:31 +01:00
andrés gonzález
2184926bbb 📚 Update changelog with "New .penpot file format" 2024-12-04 09:42:20 +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
Aitor Moreno
fffc3b1b58 Merge pull request #5396 from penpot/niwinz-bugfix-1
🐛 Fix regression on drawing text with auto-size
2024-11-29 15:55:34 +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
Andrey Antukh
e0cc999345 🐛 Fix regression on drawing text with auto-size
Using editor v1
Caused by 2ed743b6be
2024-11-29 13:23:39 +01:00
Andrey Antukh
8e836f79fb Merge pull request #5390 from penpot/palba-fix-bad-redirect-remove-from-team
🐛 Fix bad redirect after being removed from a team
2024-11-29 13:01:27 +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
Pablo Alba
093a58b9ec 🐛 Fix bad redirect after being removed from a team 2024-11-29 10:55:17 +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
Andrey Antukh
5e2b847202 Merge pull request #5383 from penpot/azazeln28-fix-text-editor-more-issues
🐛 Fix text editor issues
2024-11-29 10:17:43 +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
Andrey Antukh
ef207cfe70 Merge pull request #5386 from penpot/palba-create-events
Create several events
2024-11-28 12:10:45 +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
Pablo Alba
f72c37a198 Add events for use library assets 2024-11-28 11:25:12 +01:00
Pablo Alba
dbf3d0d7c1 Add event "navigate-to-library-file" 2024-11-28 11:23:28 +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
Pablo Alba
903c8c021d Add event "change-inspect-tab" 2024-11-27 13:51:21 +01:00
Pablo Alba
9b8ef0a2e5 Add event "duplicate-page" 2024-11-27 13:51:21 +01:00
Pablo Alba
22e64c1c81 Add event "resolve-comment-thread" 2024-11-27 13:51:21 +01:00
Pablo Alba
14c917d003 Add event "create-prototype" 2024-11-27 13:51:21 +01:00
Belén Albeza
db9c93f3bf Render with dpr 2024-11-27 12:38:17 +01:00
AzazelN28
4377a0dcc4 🐛 Fix an error that kept empty inlines 2024-11-27 12:29:38 +01:00
Andrey Antukh
c2649ffd1c Merge remote-tracking branch 'origin/staging' into develop 2024-11-27 12:11:47 +01:00
AzazelN28
db6ca6f905 🐛 Fix wrong line-height value 2024-11-27 12:05:42 +01:00
Aitor Moreno
ede8ee6a78 Merge pull request #5384 from penpot/alotor-fix-editor
🐛 Fix problem with editor line-height
2024-11-27 12:01:58 +01:00
alonso.torres
37b50497f3 🐛 Fix problem with editor line-height 2024-11-27 11:51:13 +01:00
Aitor Moreno
e3d2b99acc Merge pull request #5381 from penpot/niwinz-bugfix-1
🐛 Fix incorrect thumbnail rendering on dashboard
2024-11-27 11:48:25 +01:00
AzazelN28
7101b94557 🐛 Fix selectAll when editor is empty 2024-11-27 11:42:18 +01:00
Aitor Moreno
5ffab1953d Merge pull request #5382 from penpot/niwinz-bugfix-2
🐛 Fix regression with component thumbnails
2024-11-27 11:34:50 +01:00
Andrey Antukh
75e7cfb69e 🐛 Fix regression with component thumbnails 2024-11-27 11:15:58 +01:00
Andrey Antukh
2ad887db89 Merge remote-tracking branch 'origin/staging' into develop 2024-11-27 10:50:03 +01:00
Andrey Antukh
65b7e5c3a5 🐛 Fix incorrect thumbnail rendering on dashboard 2024-11-27 10:42:56 +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
30a06249ff Merge pull request #5377 from penpot/azazeln28-fix-text-editor-issues
🐛 Fix text editor issues
2024-11-27 09:08:39 +01:00
AzazelN28
59ca09c24e 🐛 Fix text editor issues 2024-11-27 08:56:52 +01:00
Andrey Antukh
1aeafdfca7 Merge pull request #5378 from penpot/yms-fix-k8s-documentation
📚 Add links to Kubernetes documentation
2024-11-27 08:54:37 +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
Andrey Antukh
a714085523 Merge branch 'niwinz-plugins-reify' into staging 2024-11-27 08:32:54 +01:00
alonso.torres
eccc4226c7 Migrate proxies to new format 2024-11-27 08:32:07 +01:00
Belén Albeza
5ce6cbff6f ♻️ Refactor navigate() method 2024-11-26 16:13:14 +01:00
Yamila Moreno
4d6d85b3de 📚 Add links to Kubernetes documentation 2024-11-26 15:25:51 +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
c607b61af6 Merge pull request #5349 from penpot/palba-add-event-for-pdf
 Add export format info to export-shapes event
2024-11-26 12:53:52 +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
Andrey Antukh
e16ec9c719 Add facility for create anonymous objects
Speciailly designed to be work in plugins where code
is submited to hard deep freeze on the sandboxing
process.
2024-11-25 16:35:44 +01: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
Pablo Alba
59e5656bd7 Merge pull request #5370 from penpot/niwinz-bugfix-4
🐛 Fix incorrect access to flows on add-new-interaction event
2024-11-25 15:41:13 +01:00
Andrey Antukh
82104dd823 Merge remote-tracking branch 'origin/staging' into develop 2024-11-25 14:56:12 +01:00
Andrey Antukh
723eef9565 🐛 Fix incorrect access to flows on add-new-interaction event 2024-11-25 13:32:45 +01:00
Belén Albeza
8448036d67 Merge pull request #5368 from penpot/niwinz-bugfix-3
🐛 Fix import format detection and error handling
2024-11-25 13:30:46 +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
Andrey Antukh
e1c9691567 Improve scss compilation error handling
Don't stop watch scss process on compilation error
2024-11-25 12:44:10 +01:00
Alejandro Alonso
198339f232 🐛 Fix change page with wasm render 2024-11-25 12:36:12 +01:00
Andrey Antukh
577b731b22 🐛 Fix import format detection and error handling 2024-11-25 12:29:59 +01:00
Andrey Antukh
5ee0399615 Merge remote-tracking branch 'origin/staging' into develop 2024-11-25 11:50:19 +01:00
Andrey Antukh
ef3588d05f Merge pull request #5355 from penpot/azazeln28-fix-component-list-jumps
🐛 Fix component list jumps
2024-11-25 11:44:05 +01:00
Andrey Antukh
d4893523bc Merge pull request #5367 from penpot/niwinz-bugfix-2
🐛 Fix release 2.3 onboarding text typos
2024-11-25 11:43:47 +01:00
AzazelN28
f10792619d 🐛 Fix component list jumps 2024-11-25 11:35:33 +01:00
Alejandro
7a0702650a Merge pull request #5366 from penpot/niwinz-bugfix-1
🐛 Bugfixes
2024-11-25 11:32:28 +01:00
Elhombretecla
ee1230c488 🐛 Fix release 2.3 onboarding text typos 2024-11-25 11:30:51 +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
Andrey Antukh
ede1176606 Merge pull request #5340 from penpot/palba-testab-board-icon
🎉 Add A/B test of use of boards if we just change the icon for “standard” one
2024-11-25 11:24:23 +01:00
Andrey Antukh
9506606e15 Merge pull request #5359 from penpot/alotor-fixes-2
🐛 Fix problem with scroll in history versions
2024-11-25 11:23:47 +01:00
Andrey Antukh
7e5f93ca3d Merge pull request #5358 from penpot/azazeln28-fix-assets-filters
🐛 Fix assets filters
2024-11-25 11:23:14 +01:00
Alejandro Alonso
61e19ae3a8 Merge remote-tracking branch 'origin/staging' into develop 2024-11-25 11:18:47 +01:00
Andrey Antukh
6655563aba Merge pull request #5357 from penpot/superalex-fix-generate-translation-files-with-markdown-and-links
🐛 Fix generate translation files with markdown and links
2024-11-25 11:18:13 +01:00
Andrey Antukh
8ee9b45243 Merge pull request #5346 from penpot/alotor-fixes-1
Alotor fixes 1
2024-11-25 11:16:25 +01:00
Alejandro
caa6897f81 Merge pull request #5342 from penpot/niwinz-thumbnails-fix
 Make the file and shape thumbnails not dependent on PUBLIC_URI
2024-11-25 11:13:04 +01:00
Andrey Antukh
660bc1a4dd 🐛 Fix incorrect team rename operation 2024-11-25 10:01:36 +01:00
Andrey Antukh
3ddd45e99b 🐛 Fix incorrect internal form initialization 2024-11-25 10:01:36 +01:00
Andrey Antukh
9b71e04e1c 🐛 Fix exception on user-feedback rpc method
And normalizes configuration parameters
2024-11-25 10:01:36 +01:00
alonso.torres
39620fe9c4 🐛 Hover on history version entry to show options 2024-11-25 09:51:41 +01:00
alonso.torres
db7c1fc7dd 🐛 Fix problem with some texts desynchronization 2024-11-25 09:51:41 +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
Alejandro Alonso
c89abf56ac 🐛 Fix translate files generations with markdown and links 2024-11-25 07:20:32 +01:00
alonso.torres
d22f6e37c9 Add pin version to main menu 2024-11-22 15:47:19 +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
AzazelN28
19b9b3cbd9 🐛 Fix missing main menu entry version history 2024-11-22 15:35:13 +01:00
alonso.torres
c1d3e4cd6e 🐛 Fix problem with scroll in history versions 2024-11-22 15:34:32 +01:00
AzazelN28
2164593757 🐛 Fix assets filters 2024-11-22 14:47:43 +01:00
Andrey Antukh
9485ce03b5 Merge pull request #5338 from penpot/azazeln28-fix-missing-text-editor-changes
📎 Fix some text editor missing changes
2024-11-22 12:54:42 +01:00
Alejandro Alonso
05716c7164 Merge remote-tracking branch 'origin/staging' into develop 2024-11-22 12:46:10 +01:00
Aitor Moreno
ba832389d1 Merge pull request #5354 from penpot/superalex-fix-text-layer-default-name-with-v2-editor
🐛 Fix text layer default name with v2 text editor
2024-11-22 12:20:59 +01:00
Alejandro Alonso
a8ee9be7b9 🐛 Fix text layer default name with v2 text editor 2024-11-22 11:14:39 +01:00
AzazelN28
c8c83c1e1d 📎 Fix some missing changes 2024-11-22 11:06:16 +01:00
Alejandro Alonso
0b5e915af9 🎉 Improve performace for zoom and pan with wasm render 2024-11-22 09:46:46 +01:00
Andrey Antukh
afcfbdedda Merge pull request #5341 from penpot/palba-fix-leave-team
🐛 Fix bad redirect after leaving team
2024-11-22 08:31:21 +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
Pablo Alba
53f55444cd Add export format info to export-shapes event 2024-11-21 16:33:06 +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
Pablo Alba
fa8665df88 Merge pull request #5337 from penpot/juanfran-fix-typo-keepaspectratio
🐛 Fix typo in keepAspectRatio #9336
2024-11-21 09:13:21 +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
Andrey Antukh
5cc678ddc3 Remove not necessary check on upgrade-version notification 2024-11-20 16:43:14 +01:00
Andrey Antukh
64c8741233 🐛 Make thumbnails independent of current public uri
Mainly always resolve the public uri at frontend, making the
PENPOT_PUBLIC_URI less necessary to be changed. This improves
the experience of on-premise configuration.

Also removes unnecesary calls for thumbnail generation
on components.
2024-11-20 16:43:14 +01:00
Pablo Alba
0cae9d6ad5 🐛 Fix bad redirect after leaving team 2024-11-20 15:37:08 +01:00
Pablo Alba
0c586551c4 🎉 Add A/B test of use of boards if we just change the icon for “standard” one 2024-11-20 15:12:54 +01:00
AzazelN28
2db1740ce8 🎉 Improve frame rendering 2024-11-20 14:09:18 +01:00
Juanfran
2f4cb19745 🐛 Fix typo in keepAspectRatio #9336 2024-11-20 12:43:51 +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
Alejandro
b80ccbec0f Merge pull request #5334 from penpot/niwinz-bug-features
🐛 Preserve frontend-only flags already present on team
2024-11-20 06:27:24 +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
246415be2b Merge pull request #5306 from penpot/azazeln28-update-text-editor
⬆️ Update text editor
2024-11-19 19:20:04 +01:00
Andrey Antukh
7faa9e970e 🐛 Fix esm module incompatibilities on text-editor with node 2024-11-19 17:20:16 +01:00
Andrey Antukh
04a0d867b0 Import text-editor code into the repository 2024-11-19 17:05:30 +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
Andrey Antukh
a18214a1a5 🐛 Preserve frontend-only flags already present on team 2024-11-19 16:39:21 +01:00
Pablo Alba
3a7d187110 Add integration tests to viewer role 2024-11-19 16:38:21 +01:00
AzazelN28
68397edd4d 🐛 Fix text editor selection 2024-11-19 14:47:38 +01:00
AzazelN28
1e2d9a15a3 🐛 Fix text editor shortcuts 2024-11-19 14:47:38 +01:00
AzazelN28
0f101fad9f ⬆️ Update text editor 2024-11-19 14:47:38 +01:00
Andrey Antukh
a91737b4d7 Merge pull request #5331 from penpot/alotor-exit-comments
🐛 Fix escape key to exit comments mode
2024-11-19 10:59:13 +01:00
alonso.torres
284d5ecb77 🐛 Fix escape key to exit comments mode 2024-11-19 10:44:54 +01:00
Alejandro
5d95d755ad Merge pull request #5315 from penpot/niwinz-team-access-request-quotes
🎉 Add quote definitions for team access requests
2024-11-19 06:52:04 +01:00
Andrey Antukh
4466abd150 Merge pull request #5320 from penpot/alotor-fix-problem-layouts
🐛 Fix problem with layout reflow
2024-11-18 18:44:42 +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
Andrey Antukh
27690c3da6 Add test runner for cljs on common module
In the same way as frontend tests are run and fix some
tokens related tests
2024-11-18 17:51:23 +01:00
alonso.torres
f436d72f51 Changed some events for versions 2024-11-18 16:38:38 +01:00
Alejandro Alonso
d71e1e66c4 Merge remote-tracking branch 'origin/staging' into develop 2024-11-18 15:52:34 +01:00
Alejandro
20ea188070 Merge pull request #5321 from penpot/niwinz-improvements-features
 Feature flags improvements
2024-11-18 15:52:20 +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
Alejandro
c4f076910b Merge pull request #5326 from penpot/alotor-fix-problem-texts
🐛 Fix problem with texts crashing
2024-11-18 12:59:40 +01:00
Andrey Antukh
f509b0c1a7 Improve Uint32 array generation from uuid 2024-11-18 12:57:49 +01:00
alonso.torres
72f2395142 🐛 Fix problem with texts crashing 2024-11-18 12:41:21 +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
Andrey Antukh
47d28758d7 Clean frontend and backend features on exportation 2024-11-15 15:57:25 +01:00
Andrey Antukh
b7573c0b72 Change frontend-only features automatic team assignation rules
The frontend-only features are now ignored from files and from teams
and they do not autoassigns automatically to team and file on file
creation or update operations.
2024-11-15 15:57:25 +01:00
Belén Albeza
6f11eebbed 🐛 Tweak sampling options for rendering shapes 2024-11-15 15:13:57 +01:00
alonso.torres
2ed743b6be 🐛 Fix problem with layout reflow 2024-11-15 15:12:52 +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
Andrey Antukh
036e335fc4 🎉 Add quote definitions for team access requests 2024-11-15 11:14:30 +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
Andrey Antukh
0e99b37c21 Merge remote-tracking branch 'origin/main' into staging 2024-11-15 10:17:18 +01:00
Praveen Juge
3cdbd7f381 📚 Fix spelling: change assents to assets 2024-11-15 09:50:44 +01:00
Andrey Antukh
76caff2b61 Merge pull request #5313 from penpot/alotor-bugfixes-enable-plugins-default
🐛 Activate plugin feature by default
2024-11-15 09:46:59 +01:00
Alejandro Alonso
e9d3cb16c0 Merge remote-tracking branch 'origin/staging' into develop 2024-11-15 09:45:03 +01:00
Andrey Antukh
bb370b3e50 Merge pull request #5314 from penpot/superalex-fix-wasm-build
🐛 Fix compilation for wasm communication in release mode
2024-11-15 09:44:24 +01:00
Andrey Antukh
45d56f40e1 Merge remote-tracking branch 'origin/develop' into staging 2024-11-15 09:35:21 +01:00
Alejandro Alonso
4a1ab75d8f 🐛 Fix compilation for wasm communication in release mode 2024-11-15 09:30:59 +01:00
alonso.torres
a58ad2298a 🐛 Activate plugin feature by default 2024-11-15 09:04:59 +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
949 changed files with 305729 additions and 44110 deletions

View File

@@ -33,12 +33,17 @@ jobs:
command: |
clojure -M:dev:test
- run:
name: "NODE tests"
working_directory: "./common"
command: |
yarn run test
- save_cache:
paths:
- ~/.m2
key: v1-dependencies-{{ checksum "common/deps.edn"}}
test-frontend:
docker:
- image: penpotapp/devenv:latest
@@ -87,6 +92,44 @@ jobs:
- ~/.m2
key: v1-dependencies-{{ checksum "frontend/deps.edn"}}
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"}}
- run:
name: Install dependencies
working_directory: "./frontend"
command: |
yarn
npx playwright install --with-deps
- 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:
@@ -174,7 +217,6 @@ jobs:
- ~/.m2
key: v1-dependencies-{{ checksum "backend/deps.edn" }}
test-exporter:
docker:
- image: penpotapp/devenv:latest
@@ -204,11 +246,36 @@ jobs:
yarn run fmt:clj:check
yarn run lint:clj
test-render-wasm:
docker:
- image: penpotapp/devenv:latest
working_directory: ~/repo
resource_class: medium+
environment:
steps:
- checkout
- run:
name: "fmt check"
working_directory: "./render-wasm"
command: |
cargo fmt --check
- run:
name: "cargo tests"
working_directory: "./render-wasm"
command: |
./test
workflows:
penpot:
jobs:
- test-frontend
- test-components
- test-integration
- test-backend
- test-common
- test-exporter
- 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

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: '^:(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.'

2
.nvmrc
View File

@@ -1 +1 @@
v20.11.1
v22.13.1

View File

@@ -1,17 +1,141 @@
# CHANGELOG
## 2.5.0
### :rocket: Epics and highlights
### :boom: Breaking changes & Deprecations
### :heart: Community contributions (Thank you!)
## 2.5.4
### :sparkles: New features
- 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 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
- Fix detach when top copy is dangling and nested copy is not [Taiga #9699](https://tree.taiga.io/project/penpot/issue/9699)
- Fix problem in plugins with `replaceColor` method [#174](https://github.com/penpot/penpot-plugins/issues/174)
- Fix issue with recursive commponents [Taiga #9903](https://tree.taiga.io/project/penpot/issue/9903)
- 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
- 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
@@ -24,30 +148,36 @@
(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!)
### :sparkles: New features
- Viewer role for team members [Taiga #1056 & #6590](https://tree.taiga.io/project/penpot/us/1056 & https://tree.taiga.io/project/penpot/us/6590)
- File history versions management [Taiga](https://tree.taiga.io/project/penpot/us/187?milestone=411120)
- Viewer role for team members [Taiga #1056](https://tree.taiga.io/project/penpot/us/1056) & [Taiga #6590](https://tree.taiga.io/project/penpot/us/6590)
- File history versions management [Taiga #187](https://tree.taiga.io/project/penpot/us/187?milestone=411120)
- Rename selected layer via keyboard shortcut and context menu option [Taiga #8882](https://tree.taiga.io/project/penpot/us/8882)
- New .penpot file format [Taiga #8657](https://tree.taiga.io/project/penpot/us/8657)
### :bug: Bugs fixed
- Fix problem with some texts desynchronization [Taiga #9379](https://tree.taiga.io/project/penpot/issue/9379)
- Fix problem with reoder grid layers [#5446](https://github.com/penpot/penpot/issues/5446)
- Fix problem with swap component style [#9542](https://tree.taiga.io/project/penpot/issue/9542)
## 2.3.3
### :bug: Bugs fixed
- Fix problem creating manual overlay interactions [Taiga #9146](https://tree.taiga.io/project/penpot/issue/9146)
- Fix plugins list default URL
- Activate plugins feature by default
## 2.3.2

View File

@@ -82,9 +82,10 @@ Where type is:
- :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
- :arrow_down: `:arrow_down:` a commit with dependencies downgrades
- :fire: `:fire:` a commit that removes files or code
More info:
- https://gist.github.com/parmentf/035de27d6ed1dce0b36a

View File

@@ -6,7 +6,7 @@
org.clojure/clojure {:mvn/version "1.12.0"}
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.6-9"}
io.prometheus/simpleclient {:mvn/version "0.16.0"}
io.prometheus/simpleclient_hotspot {:mvn/version "0.16.0"}
@@ -17,7 +17,7 @@
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.5.2.RELEASE"}
java-http-clj/java-http-clj {:mvn/version "0.4.3"}
funcool/yetti
@@ -26,24 +26,25 @@
:git/url "https://github.com/funcool/yetti.git"
:exclusions [org.slf4j/slf4j-api]}
com.github.seancorfield/next.jdbc {:mvn/version "1.3.955"}
com.github.seancorfield/next.jdbc
{:mvn/version "1.3.994"}
metosin/reitit-core {:mvn/version "0.7.2"}
nrepl/nrepl {:mvn/version "1.3.0"}
cider/cider-nrepl {:mvn/version "0.50.2"}
nrepl/nrepl {:mvn/version "1.3.1"}
cider/cider-nrepl {:mvn/version "0.52.0"}
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.5"}
org.xerial/sqlite-jdbc {:mvn/version "3.48.0.0"}
com.zaxxer/HikariCP {:mvn/version "6.0.0"}
com.zaxxer/HikariCP {:mvn/version "6.2.1"}
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.18.3"}
org.im4java/im4java
{:git/tag "1.4.0-penpot-2"
:git/sha "e2b3e16"
@@ -54,12 +55,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.2"}
;; 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.28.26"}}
:paths ["src" "resources" "target/classes"]
:aliases
@@ -74,7 +74,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.6" :git/sha "52cf7d6"}}
:ns-default build}
:test
@@ -88,8 +88,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.6.0+sha512.5383cc12567a95f1d668fbe762dfe0075c595b4bfff433be478dbbe24e05251a8e8c3eb992a986667c1d53b6c3a9c85b8398c35a960587fbd9fa3a0915406728",
"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

@@ -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>

View File

@@ -1,5 +1,6 @@
#!/usr/bin/env bash
export PENPOT_SECRET_KEY=super-secret-devenv-key
export PENPOT_HOST=devenv
export PENPOT_FLAGS="\
$PENPOT_FLAGS \
@@ -69,20 +70,17 @@ 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="--enable-preview \
-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager \
-Djdk.attach.allowAttachSelf \
-Dlog4j2.configurationFile=log4j2-devenv-repl.xml \
-Djdk.tracePinnedThreads=full \
-XX:+EnableDynamicAgentLoading \
-XX:-OmitStackTraceInFastThrow \
-XX:+UnlockDiagnosticVMOptions \
-XX:+DebugNonSafepoints";
# Enable preview
export OPTIONS="$OPTIONS -J--enable-preview"
export OPTIONS="-A:jmx-remote -A:dev"
# Setup HEAP
# export OPTIONS="$OPTIONS -J-Xms50m -J-Xmx1024m"

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,7 +18,7 @@ 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 JVM_OPTS="-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager -Dlog4j2.configurationFile=log4j2.xml -XX:-OmitStackTraceInFastThrow --enable-preview $JVM_OPTS"
ENTRYPOINT=${1:-app.main};

View File

@@ -1,5 +1,6 @@
#!/usr/bin/env bash
export PENPOT_SECRET_KEY=super-secret-devenv-key
export PENPOT_HOST=devenv
export PENPOT_FLAGS="\
$PENPOT_FLAGS \

View File

@@ -8,7 +8,7 @@
(:require
[buddy.hashers :as hashers]))
(def default-params
(def ^:private default-options
{:alg :argon2id
:memory 32768 ;; 32 MiB
:iterations 3
@@ -16,12 +16,12 @@
(defn derive-password
[password]
(hashers/derive password default-params))
(hashers/derive password default-options))
(defn verify-password
[attempt password]
(try
(hashers/verify attempt password)
(hashers/verify attempt password default-options)
(catch Throwable _
{:update false
:valid false})))

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)
@@ -52,6 +54,30 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(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))
@@ -123,16 +149,44 @@
features (assoc :features (db/decode-pgarray features #{}))
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))]
(-> 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)))))
(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]
(update file :features (fn [features]
(if (set? features)
(-> features
(cfeat/migrate-legacy-features)
(set/difference cfeat/frontend-only-features)
(set/difference cfeat/backend-only-features))
#{}))))
(defn get-project
[cfg project-id]
@@ -163,10 +217,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)
@@ -215,49 +267,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
@@ -301,48 +374,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
@@ -373,8 +405,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)))
@@ -384,20 +417,9 @@
(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)
@@ -411,100 +433,92 @@
(update :colors relink-colors)
(d/without-nils))))))
(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)])))
(defn encode-file
[{:keys [::db/conn] :as cfg} {:keys [id] :as file}]
(let [file (if (contains? (:features file) "fdata/objects-map")
(feat.fdata/enable-objects-map file)
file)
(defn persist-file!
"Applies all the final validations and perist the file."
[{:keys [::db/conn ::timestamp] :as cfg} {:keys [id] :as 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)]
(dm/assert!
"expected valid timestamp"
(dt/instant? timestamp))
(-> file
(update :features db/encode-pgarray conn "text")
(update :data blob/encode))))
(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/difference cfeat/frontend-only-features)
(set/union features))))))
(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)}]
_ (when (contains? cf/flags :file-schema-validation)
(fval/validate-file-schema! file))
(-> (d/without-nils params)
(assoc :data-backend nil)
(assoc :data-ref-id nil))))
_ (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 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)))
file (if (contains? (:features file) "fdata/objects-map")
(feat.fdata/enable-objects-map file)
file)
(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))]
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)
;; 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)))
params (-> file
(update :features db/encode-pgarray conn "text")
(update :data blob/encode))]
(feat.fmigr/upsert-migrations! conn file)
(db/update! conn :file params {:id id} opts)))
(if (::overwrite cfg)
(upsert-file! conn params)
(db/insert! conn :file params ::db/return-keys false))
(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}]
file))
(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)))))]
(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]))
(when (contains? cf/flags :file-schema-validation)
(fval/validate-file-schema! file))
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))))
(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))))
(insert-file! cfg file opts)))

View File

@@ -0,0 +1,45 @@
;; 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]
[app.features.components-v2 :as feat.compv2]
[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"
(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))))

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)
@@ -508,18 +503,8 @@
(update :object-id #(str/replace-first % #"^(.*?)/" (str file-id "/")))))
thumbnails))
(defn- clean-features
[file]
(update file :features (fn [features]
(if (set? features)
(-> features
(cfeat/migrate-legacy-features)
(set/difference cfeat/backend-only-features))
#{}))))
(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)
@@ -527,7 +512,7 @@
file-id (:id file)
file-id' (bfc/lookup-index file-id)
file (clean-features file)
file (bfc/clean-file-features file)
thumbnails (:thumbnails file)]
(when (not= file-id expected-file-id)
@@ -577,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
@@ -609,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*))]
@@ -662,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)]
@@ -672,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
@@ -683,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)))
@@ -728,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`"
@@ -747,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

@@ -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

@@ -9,9 +9,11 @@
(:refer-clojure :exclude [read])
(: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]
[app.common.features :as cfeat]
[app.common.json :as json]
[app.common.logging :as l]
[app.common.schema :as sm]
@@ -22,10 +24,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]
@@ -55,7 +59,7 @@
[:map
[:id ::sm/uuid]
[:name :string]
[:project-id ::sm/uuid]]]]
[:features ::cfeat/features]]]]
[:relations {:optional true}
[:vector
@@ -77,10 +81,15 @@
[:tag :string]
[:media-id ::sm/uuid]])
(def ^:private schema:file
[:merge
ctf/schema:file
[:map [:options {:optional true} ctf/schema:options]]])
;; --- 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))
@@ -100,6 +109,9 @@
(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))
@@ -124,7 +136,7 @@
(sm/decoder ::ctcl/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))
@@ -135,6 +147,9 @@
(def decode-typography
(sm/decoder ::cty/typography sm/json-transformer))
(def decode-tokens-lib
(sm/decoder ::cto/tokens-lib sm/json-transformer))
(def decode-plugin-data
(sm/decoder ::ctpg/plugin-data sm/json-transformer))
@@ -170,6 +185,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))
@@ -190,20 +208,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]
@@ -242,6 +264,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))))
@@ -250,6 +273,7 @@
typographies (:typographies data)
components (:components data)
colors (:colors data)
tokens-lib (:tokens-lib data)
pages (:pages data)
pages-index (:pages-index data)
@@ -258,12 +282,16 @@
(vswap! bfc/*state* update :files assoc file-id
{:id file-id
:project-id (:project-id file)
:name (:name 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")]
@@ -319,12 +347,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)
@@ -457,6 +490,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$")
@@ -490,7 +531,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))]
@@ -502,8 +543,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)
@@ -511,7 +557,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
@@ -520,7 +566,7 @@
(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)
@@ -534,7 +580,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)
@@ -547,7 +593,7 @@
(not-empty)))
(defn- read-file-components
[{:keys [::input ::file-id ::entries]}]
[{:keys [::bfc/input ::file-id ::entries]}]
(->> (keep (match-component-entry-fn file-id) entries)
(reduce (fn [result {:keys [id entry]}]
(let [object (->> (read-entry input entry)
@@ -560,7 +606,7 @@
(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)
@@ -572,8 +618,15 @@
{})
(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)
@@ -586,7 +639,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)
@@ -602,7 +655,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)
@@ -617,9 +670,10 @@
(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)]
@@ -628,11 +682,12 @@
: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)
@@ -672,7 +727,7 @@
(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)
@@ -680,12 +735,9 @@
(dissoc :options)
(bfc/process-file))]
(->> file
(bfc/register-pending-migrations cfg)
(bfc/persist-file! cfg))
(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')))
@@ -708,7 +760,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)
@@ -775,12 +827,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}]
@@ -800,11 +852,10 @@
: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"
@@ -825,14 +876,17 @@
: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})
@@ -862,7 +916,7 @@
(import-file-media cfg)
(import-file-thumbnails cfg)
(bfc/apply-pending-migrations! cfg)
(bfm/apply-pending-migrations! cfg)
ids)))))))
@@ -872,17 +926,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)))
@@ -924,14 +978,13 @@
: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))))
(and (uuid? (::bfc/profile-id cfg))
(uuid? (::bfc/project-id cfg))))
(dm/assert!
"expected instance of jio/IOFactory for `input`"
@@ -944,7 +997,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)

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]
@@ -42,7 +43,6 @@
:rpc-rlimit-config "resources/rlimit.edn"
:rpc-climit-config "resources/climit.edn"
:auto-file-snapshot-total 10
:auto-file-snapshot-every 5
:auto-file-snapshot-timeout "3h"
@@ -101,7 +101,6 @@
[:telemetry-uri {:optional true} :string]
[:telemetry-with-taiga {:optional true} ::sm/boolean] ;; DELETE
[:auto-file-snapshot-total {:optional true} ::sm/int]
[:auto-file-snapshot-every {:optional true} ::sm/int]
[:auto-file-snapshot-timeout {:optional true} ::dt/duration]
@@ -144,6 +143,8 @@
[:quotes-comments-per-file {:optional true} ::sm/int]
[:quotes-snapshots-per-file {:optional true} ::sm/int]
[:quotes-snapshots-per-team {:optional true} ::sm/int]
[:quotes-team-access-requests-per-team {:optional true} ::sm/int]
[:quotes-team-access-requests-per-requester {:optional true} ::sm/int]
[:auth-data-cookie-domain {:optional true} :string]
[:auth-token-cookie-name {:optional true} :string]
@@ -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

@@ -270,19 +270,17 @@
:else (throw (IllegalArgumentException. "unable to resolve connectable"))))
(def ^:private params-mapping
{::return-keys? :return-keys
::return-keys :return-keys})
{::return-keys :return-keys})
(defn rename-opts
[opts]
(set/rename-keys opts params-mapping))
(def ^:private default-insert-opts
{:builder-fn sql/as-kebab-maps
:return-keys true})
(assoc sql/default-opts :return-keys true))
(def ^:private default-opts
{:builder-fn sql/as-kebab-maps})
sql/default-opts)
(defn exec!
([ds sv] (exec! ds sv nil))
@@ -333,7 +331,7 @@
(defn update!
"A helper that build an UPDATE SQL statement and executes it.
Given a connectable object, a table name, a hash map of columns and
Given a connectable object, a table name, a hash map of columns and
values to set, and either a hash map of columns and values to search
on or a vector of a SQL where clause and parameters, perform an
update on the table.
@@ -413,10 +411,20 @@
:hint "database object not found"))
row))
(def ^:private default-plan-opts
(-> default-opts
(assoc :fetch-size 1000)
(assoc :concurrency :read-only)
(assoc :cursors :close)
(assoc :result-type :forward-only)))
(defn plan
[ds sql]
(-> (get-connectable ds)
(jdbc/plan sql sql/default-opts)))
([ds sql]
(-> (get-connectable ds)
(jdbc/plan sql default-plan-opts)))
([ds sql opts]
(-> (get-connectable ds)
(jdbc/plan sql (merge default-plan-opts opts)))))
(defn cursor
"Return a lazy seq of rows using server side cursors"

View File

@@ -15,14 +15,15 @@
(defn kebab-case [s] (str/replace s #"_" "-"))
(defn snake-case [s] (str/replace s #"-" "_"))
(def default-opts
{:table-fn snake-case
:column-fn snake-case})
(defn as-kebab-maps
[rs opts]
(jdbc-opt/as-unqualified-modified-maps rs (assoc opts :label-fn kebab-case)))
(def default-opts
{:table-fn snake-case
:column-fn snake-case
:builder-fn as-kebab-maps})
(defn insert
([table key-map]
(insert table key-map nil))
@@ -38,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

@@ -226,8 +226,8 @@
[:priority {:optional true} [:enum :high :low]]
[:extra-data {:optional true} ::sm/text]])
(def ^:private valid-context?
(sm/validator schema:context))
(def ^:private check-context
(sm/check-fn schema:context))
(defn template-factory
[& {:keys [id schema]}]
@@ -236,10 +236,8 @@
(sm/check-fn schema)
(constantly nil))]
(fn [context]
(assert (valid-context? context) "expected a valid context")
(check-fn context)
(let [email (build-email-template id context)]
(let [context (-> context check-context check-fn)
email (build-email-template id context)]
(when-not email
(ex/raise :type :internal
:code :email-template-does-not-exists
@@ -271,7 +269,7 @@
"Schedule an already defined email to be sent using asynchronously
using worker task."
[{:keys [::conn ::factory] :as context}]
(assert (db/connection? conn) "expected a valid database connection")
(assert (db/connectable? conn) "expected a valid database connection or pool")
(let [email (if factory
(factory context)
@@ -348,7 +346,7 @@
[:subject ::sm/text]
[:content ::sm/text]])
(def feedback
(def user-feedback
"A profile feedback email."
(template-factory
:id ::feedback
@@ -451,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

@@ -884,8 +884,10 @@
:shapes (or (:shapes shape) [])
:hide-in-viewer (if frame? (boolean (:hide-in-viewer shape)) true)
:show-content (if frame? (boolean (:show-content shape)) true)
:rx (or (:rx shape) 0)
:ry (or (:ry shape) 0)))
:r1 (or (:r1 shape) 0)
:r2 (or (:r2 shape) 0)
:r3 (or (:r3 shape) 0)
:r4 (or (:r4 shape) 0)))
shape))]
(-> file-data
(update :pages-index update-vals fix-container)
@@ -1628,9 +1630,19 @@
fdata (migrate-graphics fdata)]
(update fdata :options assoc :components-v2 true)))))
;; FIXME: revisit this fn
(defn- fix-version*
[{:keys [version] :as file}]
(if (int? version)
file
(let [version (or (-> file :data :version) 0)]
(-> file
(assoc :version version)
(update :data dissoc :version)))))
(defn- fix-version
[file]
(let [file (fmg/fix-version file)]
(let [file (fix-version* file)]
(if (> (:version file) 22)
(assoc file :version 22)
file)))

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

@@ -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]

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,6 +22,7 @@
[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.storage :as-alias sto]
@@ -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"})))

View File

@@ -55,13 +55,16 @@
::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" :data data)
{::yres/status 400
::yres/body data}))))
(defmethod handle-error :rate-limit
[err _ _]

View File

@@ -64,7 +64,8 @@
(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)))
(binding [l/*context* (errors/request->context request)]
(l/err :hint "unexpected error on processing sse response" :cause cause))))
(finally
(sp/close! events/*channel*)
(px/await! listener)))))))}))

View File

@@ -59,7 +59,7 @@
:props (pp/pprint-str props :length 50)
:hint (or (ex-message cause) @message)
:trace (or (::trace record)
(ex/format-throwable cause :data? false :explain? false :header? false :summary? false))}
(some-> cause (ex/format-throwable :data? false :explain? false :header? false :summary? false)))}
(when-let [params (or (:request/params context) (:params context))]
{:params (pp/pprint-str params :length 30 :level 13)})
@@ -74,9 +74,8 @@
{: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

@@ -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]
@@ -349,7 +348,6 @@
:file-gc (ig/ref :app.tasks.file-gc/handler)
:file-gc-scheduler (ig/ref :app.tasks.file-gc-scheduler/handler)
:offload-file-data (ig/ref :app.tasks.offload-file-data/handler)
:file-xlog-gc (ig/ref :app.tasks.file-xlog-gc/handler)
:tasks-gc (ig/ref :app.tasks.tasks-gc/handler)
:telemetry (ig/ref :app.tasks.telemetry/handler)
:storage-gc-deleted (ig/ref ::sto.gc-deleted/handler)
@@ -405,10 +403,6 @@
{::db/pool (ig/ref ::db/pool)
::sto/storage (ig/ref ::sto/storage)}
:app.tasks.file-xlog-gc/handler
{::db/pool (ig/ref ::db/pool)
::sto/storage (ig/ref ::sto/storage)}
:app.tasks.telemetry/handler
{::db/pool (ig/ref ::db/pool)
::http.client/client (ig/ref ::http.client/client)
@@ -614,11 +608,6 @@
(nrepl/start-server :bind "0.0.0.0" :port 6064 :handler cider-nrepl-handler))
(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

@@ -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

@@ -273,7 +273,8 @@
(merge {:viewed-tutorial? false
:viewed-walkthrough? false
:nudge {:big 10 :small 1}
:v2-info-shown true})
:v2-info-shown true
:release-notes-viewed (:main cf/version)})
(db/tjson))
password (or (:password params) "!")

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]
@@ -46,9 +50,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 +65,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"
@@ -90,41 +94,30 @@
;; --- 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})
result))
(def ^:private schema:import-binfile

View File

@@ -6,45 +6,172 @@
(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] :as row}]
[{:keys [participants position mentions] :as row}]
(cond-> row
(db/pgpoint? position) (assoc :position (db/decode-pgpoint position))
(db/pgobject? participants) (assoc :participants (db/decode-transit-pgobject participants))))
(db/pgobject? participants) (assoc :participants (db/decode-transit-pgobject participants))
(db/pgarray? mentions) (assoc :mentions (db/decode-pgarray mentions #{}))))
(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."
@@ -56,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)
@@ -91,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])))
@@ -116,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
@@ -161,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
@@ -212,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
@@ -232,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
@@ -297,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"
@@ -308,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)
@@ -321,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
@@ -346,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
@@ -391,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
@@ -409,76 +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})
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
@@ -486,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
@@ -527,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
@@ -549,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
@@ -573,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
@@ -596,13 +786,14 @@
(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))

View File

@@ -17,7 +17,7 @@
[app.rpc.doc :as-alias doc]
[app.util.services :as sv]))
(declare ^:private send-feedback!)
(declare ^:private send-user-feedback!)
(def ^:private schema:send-user-feedback
[:map {:title "send-user-feedback"}
@@ -34,14 +34,16 @@
:hint "feedback not enabled"))
(let [profile (profile/get-profile pool profile-id)]
(send-feedback! pool profile params)
(send-user-feedback! pool profile params)
nil))
(defn- send-feedback!
(defn- send-user-feedback!
[pool profile params]
(let [dest (cf/get :feedback-destination)]
(let [dest (or (cf/get :user-feedback-destination)
;; LEGACY
(cf/get :feedback-destination))]
(eml/send! {::eml/conn pool
::eml/factory eml/feedback
::eml/factory eml/user-feedback
:from dest
:to dest
:profile profile

View File

@@ -22,6 +22,7 @@
[app.db :as db]
[app.db.sql :as-alias sql]
[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.rpc :as-alias rpc]
@@ -243,7 +244,8 @@
(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
@@ -264,6 +266,7 @@
{::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
@@ -320,6 +323,7 @@
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)
@@ -381,8 +385,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)
@@ -536,7 +542,8 @@
f.modified_at,
f.name,
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 +553,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]
@@ -575,7 +581,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))))
(map #(assoc % :library-summary (get-library-summary cfg %)))
(map #(dissoc % :data))))))
@@ -608,14 +614,17 @@
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.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();")
(defn get-file-libraries
@@ -682,7 +691,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
@@ -698,11 +708,7 @@
(defn get-team-recent-files
[conn team-id]
(->> (db/exec! conn [sql:team-recent-files team-id])
(mapv (fn [row]
(if-let [media-id (:thumbnail-id row)]
(assoc row :thumbnail-uri (resolve-public-uri media-id))
(dissoc row :media-id))))))
(db/exec! conn [sql:team-recent-files team-id]))
(def ^:private schema:get-team-recent-files
[:map {:title "get-team-recent-files"}

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))
@@ -118,11 +102,12 @@
;; feature on frontend and make it permanent on file
features (-> (:features params #{})
(set/intersection cfeat/no-migration-features)
(set/difference cfeat/frontend-only-features)
(set/union features))
params (-> params
(assoc :profile-id profile-id)
(assoc :features features))]
(assoc :features (set/difference features cfeat/frontend-only-features)))]
(quotes/check! cfg {::quotes/id ::quotes/files-per-project
::quotes/team-id team-id

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,19 +23,24 @@
[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]))
(def sql:get-file-snapshots
"SELECT id, label, revn, created_at, created_by, profile_id
FROM file_change
WHERE file_id = ?
AND data IS NOT NULL
AND (deleted_at IS NULL OR deleted_at > now())
ORDER BY created_at DESC
LIMIT 20")
"WITH changes AS (
SELECT id, label, revn, created_at, created_by, profile_id
FROM file_change
WHERE file_id = ?
AND data IS NOT NULL
AND (deleted_at IS NULL OR deleted_at > now())
), versions AS (
(SELECT * FROM changes WHERE created_by = 'system' LIMIT 1000)
UNION ALL
(SELECT * FROM changes WHERE created_by != 'system' LIMIT 1000)
)
SELECT * FROM versions
ORDER BY created_at DESC;")
(defn get-file-snapshots
[conn file-id]
@@ -52,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)
@@ -81,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
@@ -140,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]
@@ -231,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

@@ -50,8 +50,7 @@
" where file_id=? and tag=? and deleted_at is null")
res (db/exec! conn [sql file-id tag])]
(->> res
(d/index-by :object-id (fn [row]
(files/resolve-public-uri (:media-id row))))
(d/index-by :object-id :media-id)
(d/without-nils))))
(defn- get-object-thumbnails
@@ -62,8 +61,7 @@
" where file_id=? and deleted_at is null")
res (db/exec! conn [sql file-id])]
(->> res
(d/index-by :object-id (fn [row]
(files/resolve-public-uri (:media-id row))))
(d/index-by :object-id :media-id)
(d/without-nils))))
([conn file-id object-ids]
@@ -75,8 +73,7 @@
res (db/exec! conn [sql file-id ids])]
(->> res
(d/index-by :object-id (fn [row]
(files/resolve-public-uri (:media-id row))))
(d/index-by :object-id :media-id)
(d/without-nils)))))
(sv/defmethod ::get-file-object-thumbnails
@@ -127,8 +124,11 @@
(if-let [frame (-> frames first)]
(let [frame-id (:id frame)
object-id (thc/fmt-object-id (:id file) page-id frame-id "frame")
frame (if-let [thumb (get thumbnails object-id)]
(assoc frame :thumbnail thumb :shapes [])
frame (if-let [media-id (get thumbnails object-id)]
(-> frame
(assoc :thumbnail-id media-id)
(assoc :shapes []))
(dissoc frame :thumbnail))
children-ids
@@ -402,7 +402,10 @@
[cfg {:keys [::rpc/profile-id file-id] :as params}]
(db/tx-run! cfg (fn [{:keys [::db/conn] :as cfg}]
(files/check-edition-permissions! conn profile-id file-id)
;; TODO For now we check read permissions instead of write,
;; to allow viewer users to update thumbnails. We might
;; review this approach on the future.
(files/check-read-permissions! conn profile-id file-id)
(when-not (db/read-only? conn)
(let [media (create-file-thumbnail! cfg params)]
{:uri (files/resolve-public-uri (:id media))

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,7 @@
[app.config :as cf]
[app.db :as db]
[app.features.fdata :as feat.fdata]
[app.features.file-migrations :as feat.fmigr]
[app.http.errors :as errors]
[app.loggers.audit :as audit]
[app.loggers.webhooks :as webhooks]
@@ -118,6 +120,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)
@@ -147,7 +150,7 @@
params (-> params
(assoc :profile-id profile-id)
(assoc :features features)
(assoc :features (set/difference features cfeat/frontend-only-features))
(assoc :team team)
(assoc :file file)
(assoc :changes changes))
@@ -202,45 +205,27 @@
{:keys [profile-id file 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))))
(-> cfg
(assoc ::wrk/task :file-xlog-gc)
(assoc ::wrk/label (str "xlog:" (:id file)))
(assoc ::wrk/params {:file-id (:id file)})
(assoc ::wrk/delay (dt/duration "5m"))
(assoc ::wrk/dedupe true)
(assoc ::wrk/priority 1)
(wrk/submit!))
(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
@@ -250,19 +235,27 @@
:profile-id profile-id
:created-at timestamp
:updated-at timestamp
:deleted-at deleted-at
:deleted-at (if (::snapshot-data file)
(dt/plus timestamp (cf/get-deletion-delay))
(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)
@@ -272,9 +265,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
@@ -302,8 +296,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))]
@@ -316,7 +309,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
@@ -375,38 +368,16 @@
(-> 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)
(contains? cfeat/*current* "fdata/pointer-map")
(feat.fdata/enable-pointer-map)
:always
(update :data blob/encode))]
(feat.fdata/persist-pointers! cfg id)
file)))
(bfc/encode-file cfg 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))))))
(into [file] (map #(bfc/get-file cfg (:id %))))
(d/index-by :id)))
(defn- soft-validate-file-schema!
@@ -424,19 +395,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))
(get-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)
@@ -483,7 +472,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

@@ -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 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
@@ -67,7 +69,7 @@
:is-owner true
:is-admin true
:can-edit true}
{::db/return-keys? false}))
{::db/return-keys false}))
(doseq [params (sequence (comp
(map #(bfc/remap-id % :file-id))
@@ -400,11 +402,24 @@
;; 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))]
(let [template (tmp/tempfile-from template
:prefix "penpot.template."
:suffix ""
:min-age "30m")
format (bfc/parse-file-format template)
team (teams/get-team conn
:profile-id profile-id
:project-id project-id)
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/update! conn :project
{:modified-at (dt/now)}

View File

@@ -60,15 +60,25 @@
(media/validate-media-type! content)
(media/validate-media-size! content)
(db/run! cfg (fn [cfg]
(let [object (create-file-media-object cfg params)
props {:name (:name params)
:file-id file-id
:is-local (:is-local params)
:size (:size content)
:mtype (:mtype content)}]
(with-meta object
{::audit/replace-props props})))))
(db/run! cfg (fn [{:keys [::db/conn] :as cfg}]
;; We get the minimal file for proper checking if
;; file is not already deleted
(let [_ (files/get-minimal-file conn file-id)
mobj (create-file-media-object cfg params)]
(db/update! conn :file
{:modified-at (dt/now)
:has-media-trimmed false}
{:id file-id}
{::db/return-keys false})
(with-meta mobj
{::audit/replace-props
{:name (:name params)
:file-id file-id
:is-local (:is-local params)
:size (:size content)
:mtype (:mtype content)}})))))
(defn- big-enough-for-thumbnail?
"Checks if the provided image info is big enough for
@@ -142,20 +152,14 @@
:always
(assoc ::image (process-main-image info)))))
(defn create-file-media-object
[{:keys [::sto/storage ::db/conn ::wrk/executor]}
(defn- create-file-media-object
[{:keys [::sto/storage ::db/conn ::wrk/executor] :as cfg}
{:keys [id file-id is-local name content]}]
(let [result (px/invoke! executor (partial process-image content))
image (sto/put-object! storage (::image result))
thumb (when-let [params (::thumb result)]
(sto/put-object! storage params))]
(db/update! conn :file
{:modified-at (dt/now)
:has-media-trimmed false}
{:id file-id})
(db/exec-one! conn [sql:create-file-media-object
(or id (uuid/next))
file-id is-local name
@@ -182,7 +186,18 @@
::sm/params schema:create-file-media-object-from-url}
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id file-id] :as params}]
(files/check-edition-permissions! pool profile-id file-id)
(create-file-media-object-from-url cfg (assoc params :profile-id profile-id)))
;; We get the minimal file for proper checking if file is not
;; already deleted
(let [_ (files/get-minimal-file cfg file-id)
mobj (create-file-media-object-from-url cfg (assoc params :profile-id profile-id))]
(db/update! pool :file
{:modified-at (dt/now)
:has-media-trimmed false}
{:id file-id}
{::db/return-keys false})
mobj))
(defn download-image
[{:keys [::http/client]} uri]

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"}
@@ -200,6 +208,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)
@@ -422,7 +468,9 @@
:deleted-at deleted-at
:id profile-id}})
(rph/with-transform {} (session/delete-fn cfg)))))
(-> (rph/wrap nil)
(rph/with-transform (session/delete-fn cfg))))))
;; --- HELPERS
@@ -431,8 +479,11 @@
"WITH owner_teams AS (
SELECT tpr.team_id AS id
FROM team_profile_rel AS tpr
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())
)
SELECT tpr.team_id AS id,
count(tpr.profile_id) - 1 AS participants

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

@@ -30,7 +30,8 @@
[app.storage :as sto]
[app.util.services :as sv]
[app.util.time :as dt]
[app.worker :as wrk]))
[app.worker :as wrk]
[clojure.set :as set]))
;; --- Helpers & Specs
@@ -285,18 +286,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)
@@ -307,6 +308,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
@@ -416,6 +441,7 @@
::quotes/profile-id profile-id})
(let [features (-> (cfeat/get-enabled-features cf/flags)
(set/difference cfeat/frontend-only-features)
(cfeat/check-client-features! (:features params)))
params (-> params
(assoc :profile-id profile-id)

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))
@@ -532,17 +536,20 @@
team-owner (get-team-owner conn team-id)
file (when (some? file-id)
(get-file-for-team-access-request cfg file-id))
(get-file-for-team-access-request cfg file-id))]
request (upsert-team-access-request conn team-id profile-id)]
;; FIXME missing quotes
(-> cfg
(assoc ::quotes/profile-id profile-id)
(assoc ::quotes/team-id team-id)
(quotes/check! {::quotes/id ::quotes/team-access-requests-per-team}
{::quotes/id ::quotes/team-access-requests-per-requester}))
(teams/check-profile-muted conn requester)
(teams/check-email-bounce conn (:email team-owner) false)
(teams/check-email-spam conn (:email team-owner) true)
(let [factory (cond
(let [request (upsert-team-access-request conn team-id profile-id)
factory (cond
(and (some? file) (:is-default team) is-viewer)
eml/request-file-access-yourpenpot-view
@@ -565,9 +572,7 @@
:team-id team-id
:file-name (:name file)
:file-id file-id
:page-id (:page-id file)}))
(with-meta {:request request}
{::audit/props {:request 1}})))
:page-id (:page-id file)})
(with-meta {:request request}
{::audit/props {:request 1}}))))

View File

@@ -166,23 +166,26 @@
;; invited team.
(let [props {:team-id (:team-id claims)
:role (:role claims)
:invitation-id (:id invitation)}
:invitation-id (:id invitation)}]
accept-invitation-event
(-> (audit/event-from-rpc-params params)
(assoc ::audit/name "accept-team-invitation")
(assoc ::audit/props props))
(audit/submit!
cfg
(-> (audit/event-from-rpc-params params)
(assoc ::audit/name "accept-team-invitation")
(assoc ::audit/props props)))
accept-invitation-from-event
(-> (audit/event-from-rpc-params params)
(assoc ::audit/profile-id (:created-by invitation))
(assoc ::audit/name "accept-team-invitation-from")
(assoc ::audit/props (assoc props
:profile-id (:id profile)
:email (:email profile))))]
(audit/submit! cfg accept-invitation-event)
(audit/submit! cfg accept-invitation-from-event)
;; NOTE: Backward compatibility; old invitations can
;; have the `created-by` to be nil; so in this case we
;; don't submit this event to the audit-log
(when-let [created-by (:created-by invitation)]
(audit/submit!
cfg
(-> (audit/event-from-rpc-params params)
(assoc ::audit/profile-id created-by)
(assoc ::audit/name "accept-team-invitation-from")
(assoc ::audit/props (assoc props
:profile-id (:id profile)
:email (:email profile))))))
(accept-invitation cfg claims invitation profile)
(assoc claims :state :created))

View File

@@ -12,12 +12,12 @@
[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 +27,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 +59,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))
@@ -55,7 +79,6 @@
(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)
links (->> (db/query conn :share-link {:file-id file-id})
(mapv (fn [row]
(-> row
@@ -71,13 +94,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

@@ -87,6 +87,7 @@
(let [params (:query-params request)
pstyle (:type params "js")
context (assoc context :param-style pstyle)]
{::yres/status 200
::yres/body (-> (io/resource "app/templates/api-doc.tmpl")
(tmpl/render context))}))
@@ -207,7 +208,7 @@
(assert (sm/valid? ::rpc/methods (::rpc/methods params)) "expected valid methods"))
(defmethod ig/init-key ::routes
[_ {:keys [methods] :as cfg}]
[_ {:keys [::rpc/methods] :as cfg}]
[(let [context (prepare-doc-context methods)]
[["/_doc"
{:handler (doc-handler context)

View File

@@ -442,7 +442,7 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; QUOTE: SNAPSHOTS-PER-FILE
;; QUOTE: SNAPSHOTS-PER-TEAM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def ^:private schema:snapshots-per-team
@@ -472,6 +472,57 @@
(assoc ::count-sql [sql:get-snapshots-per-team team-id])
(generic-check!)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; QUOTE: TEAM-ACCESS-REQUESTS-PER-TEAM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def ^:private schema:team-access-requests-per-team
[:map
[::profile-id ::sm/uuid]
[::team-id ::sm/uuid]])
(def ^:private valid-team-access-requests-per-team-quote?
(sm/lazy-validator schema:team-access-requests-per-team))
(def ^:private sql:get-team-access-requests-per-team
"SELECT count(*) AS total
FROM team_access_request AS tar
WHERE tar.team_id = ?")
(defmethod check-quote ::team-access-requests-per-team
[{:keys [::profile-id ::team-id ::target] :as quote}]
(assert (valid-team-access-requests-per-team-quote? quote) "invalid quote parameters")
(-> quote
(assoc ::default (cf/get :quotes-team-access-requests-per-team Integer/MAX_VALUE))
(assoc ::quote-sql [sql:get-quotes-2 target team-id profile-id profile-id])
(assoc ::count-sql [sql:get-team-access-requests-per-team team-id])
(generic-check!)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; QUOTE: TEAM-ACCESS-REQUESTS-PER-REQUESTER
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def ^:private schema:team-access-requests-per-requester
[:map
[::profile-id ::sm/uuid]])
(def ^:private valid-team-access-requests-per-requester-quote?
(sm/lazy-validator schema:team-access-requests-per-requester))
(def ^:private sql:get-team-access-requests-per-requester
"SELECT count(*) AS total
FROM team_access_request AS tar
WHERE tar.requester_id = ?")
(defmethod check-quote ::team-access-requests-per-requester
[{:keys [::profile-id ::target] :as quote}]
(assert (valid-team-access-requests-per-requester-quote? quote) "invalid quote parameters")
(-> quote
(assoc ::default (cf/get :quotes-team-access-requests-per-requester Integer/MAX_VALUE))
(assoc ::quote-sql [sql:get-quotes-1 target profile-id])
(assoc ::count-sql [sql:get-team-access-requests-per-requester profile-id])
(generic-check!)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; QUOTE: DEFAULT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

View File

@@ -74,8 +74,7 @@
(defmethod ig/assert-key ::props
[_ params]
(assert (db/pool? (::db/pool params)) "expected valid database pool")
(assert (string? (::key params)) "expected valid key string"))
(assert (db/pool? (::db/pool params)) "expected valid database pool"))
(defmethod ig/init-key ::props
[_ {:keys [::db/pool ::key] :as cfg}]
@@ -83,7 +82,7 @@
(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 "
"all sessions on each restart, it is highly recommended setting up the "
"PENPOT_SECRET_KEY environment variable")))
(let [secret (or key (generate-random-key))]

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

View File

@@ -53,9 +53,9 @@
fixes all not propertly referenced file-media-object for a file"
[{:keys [id data] :as file} & _]
(let [conn (db/get-connection h/*system*)
used (bfc/collect-used-media data)
used (cfh/collect-used-media data)
ids (db/create-array conn "uuid" used)
sql (str "SELECT * FROM file_media_object WHERE id = ANY(?)")
sql "SELECT * FROM file_media_object WHERE id = ANY(?)"
rows (db/exec! conn [sql ids])
index (reduce (fn [index media]
(if (not= (:file-id media) id)
@@ -272,6 +272,7 @@
(reduce +)))
num-missing-slots (count-slots-data (:data file))]
(when (pos? num-missing-slots)
(l/trc :info (str "Shapes with children with the same swap slot: " num-missing-slots) :file-id (str (:id file))))
file))

View File

@@ -0,0 +1,43 @@
;; 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.srepl.fixes.media-refs
(:require
[app.binfile.common :as bfc]
[app.common.files.helpers :as cfh]
[app.srepl.helpers :as h]))
(defn- collect-media-refs
"Given a file data map, returns all media references used on pages of
the file data; components and other parts of the file data are not analized"
[data]
(let [xform-collect
(comp
(map val)
(mapcat (fn [object]
(->> (cfh/collect-shape-media-refs object)
(map (fn [id]
{:shape-id (:id object)
:id id}))))))
process-page
(fn [result page-id container]
(let [xform (comp xform-collect (map #(assoc % :page-id page-id)))]
(into result xform (:objects container))))]
(reduce-kv process-page [] (:pages-index data))))
(defn update-all-media-references
"Check if all file media object references are in plance and create
new ones if some of them are missing; this prevents strange bugs on
having the same media object associated with two different files;"
[cfg file]
(let [media-refs (collect-media-refs (:data file))]
(bfc/update-media-references! cfg file media-refs)))
(defn process-file
[file _opts]
(let [system (h/get-current-system)]
(update-all-media-references system file)))

View File

@@ -8,17 +8,15 @@
"A main namespace for server repl."
(:refer-clojure :exclude [parse-uuid])
(:require
[app.binfile.common :as bfc]
[app.common.data :as d]
[app.common.files.migrations :as fmg]
[app.common.files.validate :as cfv]
[app.db :as db]
[app.features.components-v2 :as feat.comp-v2]
[app.features.fdata :as feat.fdata]
[app.main :as main]
[app.rpc.commands.files :as files]
[app.rpc.commands.files-snapshot :as fsnap]
[app.util.blob :as blob]
[app.util.pointer-map :as pmap]))
[app.util.time :as dt]))
(def ^:dynamic *system* nil)
@@ -27,6 +25,10 @@
(locking println
(apply println params)))
(defn get-current-system
[]
*system*)
(defn parse-uuid
[v]
(if (string? v)
@@ -35,49 +37,18 @@
(defn get-file
"Get the migrated data of one file."
([id] (get-file (or *system* main/system) id nil))
([system id & {:keys [raw?] :as opts}]
([id]
(get-file (or *system* main/system) id))
([system id]
(db/run! system bfc/get-file id)))
(defn get-raw-file
"Get the migrated data of one file."
([id] (get-raw-file (or *system* main/system) id))
([system id]
(db/run! system
(fn [system]
(let [file (files/get-file system id :migrate? false)]
(if raw?
file
(binding [pmap/*load-fn* (partial feat.fdata/load-pointer system id)]
(-> file
(update :data feat.fdata/process-pointers deref)
(update :data feat.fdata/process-objects (partial into {}))
(fmg/migrate-file)))))))))
(defn update-file!
[system {:keys [id] :as file}]
(let [conn (db/get-connection system)
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! system id)
file))
file)
file (-> file
(update :features db/encode-pgarray conn "text")
(update :data blob/encode))]
(db/update! conn :file
{:revn (:revn file)
:data (:data file)
:version (:version file)
:features (:features file)
:deleted-at (:deleted-at file)
:created-at (:created-at file)
:modified-at (:modified-at file)
:data-backend nil
:data-ref-id nil
:has-media-trimmed false}
{:id (:id file)})))
(files/get-file system id :migrate? false)))))
(defn update-team!
[system {:keys [id] :as team}]
@@ -90,14 +61,6 @@
{:id id})
team))
(defn get-raw-file
"Get the migrated data of one file."
([id] (get-raw-file (or *system* main/system) id))
([system id]
(db/run! system
(fn [system]
(files/get-file system id :migrate? false)))))
(defn reset-file-data!
"Hardcode replace of the data of one file."
[system id data]
@@ -134,8 +97,11 @@
(let [conn (db/get-connection system)]
(->> (feat.comp-v2/get-and-lock-team-files conn team-id)
(reduce (fn [result file-id]
(fsnap/create-file-snapshot! system nil file-id label)
(inc result))
(let [file (fsnap/get-file-snapshots system file-id)]
(fsnap/create-file-snapshot! system file
{:label label
:created-by :admin})
(inc result)))
0))))
(defn restore-team-snapshot!
@@ -162,25 +128,30 @@
(defn process-file!
[system file-id update-fn & {:keys [label validate? with-libraries?] :or {validate? true} :as opts}]
(when (string? label)
(fsnap/create-file-snapshot! system nil file-id label))
(let [conn (db/get-connection system)
file (get-file system file-id opts)
file (bfc/get-file system file-id ::db/for-update true)
libs (when with-libraries?
(->> (files/get-file-libraries conn file-id)
(into [file] (map (fn [{:keys [id]}]
(get-file system id))))
(bfc/get-file system id))))
(d/index-by :id)))
file' (if with-libraries?
(update-fn file libs opts)
(update-fn file opts))]
file' (when file
(if with-libraries?
(update-fn file libs opts)
(update-fn file opts)))]
(when (and (some? file')
(not (identical? file file')))
(when validate? (cfv/validate-file-schema! file'))
(when validate?
(cfv/validate-file-schema! file'))
(when (string? label)
(fsnap/create-file-snapshot! system file
{:label label
:deleted-at (dt/in-future {:days 30})
:created-by :admin}))
(let [file' (update file' :revn inc)]
(update-file! system file')
(bfc/update-file! system file')
true))))

View File

@@ -431,25 +431,40 @@
process-file
(fn [file-id idx tpoint]
(try
(l/trc :hint "process:file:start" :file-id (str file-id) :index idx)
(let [system (assoc main/system ::db/rollback rollback?)]
(db/tx-run! system (fn [system]
(binding [h/*system* system]
(h/process-file! system file-id update-fn opts)))))
(catch Throwable cause
(l/wrn :hint "unexpected error on processing file (skiping)"
(let [thread-id (px/get-thread-id)]
(try
(l/trc :hint "process:file:start"
:tid thread-id
:file-id (str file-id)
:index idx
:cause cause))
(finally
(ps/release! sjobs)
(let [elapsed (dt/format-duration (tpoint))]
(l/trc :hint "process:file:end"
:index idx)
(let [system (assoc main/system ::db/rollback rollback?)]
(db/tx-run! system (fn [system]
(binding [h/*system* system]
(h/process-file! system file-id update-fn opts)))))
(catch Throwable cause
(l/wrn :hint "unexpected error on processing file (skiping)"
:tid thread-id
:file-id (str file-id)
:index idx
:elapsed elapsed)))))
:cause cause))
(finally
(when-let [pause (:pause opts)]
(Thread/sleep (int pause)))
(ps/release! sjobs)
(let [elapsed (dt/format-duration (tpoint))]
(l/trc :hint "process:file:end"
:tid thread-id
:file-id (str file-id)
:index idx
:elapsed elapsed))))))
process-file*
(fn [idx file-id]
(ps/acquire! sjobs)
(px/run! executor (partial process-file file-id idx (dt/tpoint)))
(inc idx))
process-files
(fn [{:keys [::db/conn] :as system}]
@@ -457,14 +472,12 @@
(db/exec! conn ["SET idle_in_transaction_session_timeout = 0"])
(try
(reduce (fn [idx file-id]
(ps/acquire! sjobs)
(px/run! executor (partial process-file file-id idx (dt/tpoint)))
(inc idx))
0
(->> (db/cursor conn [query] {:chunk-size 1})
(take max-items)
(map :id)))
(->> (db/plan conn [query])
(transduce (comp
(take max-items)
(map :id))
(completing process-file*)
0))
(finally
;; Close and await tasks
(pu/close! executor))))]

View File

@@ -16,10 +16,13 @@
[app.util.time :as dt]
[app.worker :as wrk]
[datoteka.fs :as fs]
[datoteka.io :as io]
[integrant.core :as ig]
[promesa.exec :as px]
[promesa.exec.csp :as sp])
(:import
java.io.InputStream
java.io.OutputStream
java.nio.file.Files))
(def default-tmp-dir "/tmp/penpot")
@@ -86,3 +89,12 @@
(fs/delete-on-exit! path)
(sp/offer! queue [path (some-> min-age dt/duration)])
path))
(defn tempfile-from
"Create a new tempfile from from consuming the stream"
[input & {:as options}]
(let [path (tempfile options)]
(with-open [^InputStream input (io/input-stream input)]
(with-open [^OutputStream output (io/output-stream path)]
(io/copy input output)))
path))

View File

@@ -40,6 +40,11 @@
:file-id id
:cause cause))))
;; Mark file change to be deleted
(db/update! conn :file-change
{:deleted-at deleted-at}
{:file-id id})
;; Mark file media objects to be deleted
(db/update! conn :file-media-object
{:deleted-at deleted-at}

View File

@@ -11,7 +11,7 @@
inactivity (the default threshold is 72h)."
(:require
[app.binfile.common :as bfc]
[app.common.files.migrations :as fmg]
[app.common.files.helpers :as cfh]
[app.common.files.validate :as cfv]
[app.common.logging :as l]
[app.common.thumbnails :as thc]
@@ -22,29 +22,25 @@
[app.db :as db]
[app.features.fdata :as feat.fdata]
[app.storage :as sto]
[app.util.blob :as blob]
[app.util.pointer-map :as pmap]
[app.util.time :as dt]
[app.worker :as wrk]
[clojure.set :as set]
[integrant.core :as ig]))
(declare ^:private get-file)
(declare ^:private decode-file)
(declare ^:private persist-file!)
(declare get-file)
(def ^:private sql:get-snapshots
"SELECT f.file_id AS id,
f.data,
f.revn,
f.version,
f.features,
f.data_backend,
f.data_ref_id
FROM file_change AS f
WHERE f.file_id = ?
AND f.data IS NOT NULL
ORDER BY f.created_at ASC")
(def sql:get-snapshots
"SELECT fc.file_id AS id,
fc.id AS snapshot_id,
fc.data,
fc.revn,
fc.version,
fc.features,
fc.data_backend,
fc.data_ref_id
FROM file_change AS fc
WHERE fc.file_id = ?
AND fc.data IS NOT NULL
ORDER BY fc.created_at ASC")
(def ^:private sql:mark-file-media-object-deleted
"UPDATE file_media_object
@@ -52,17 +48,22 @@
WHERE file_id = ? AND id != ALL(?::uuid[])
RETURNING id")
(def ^:private xf:collect-used-media
(comp (map :data) (mapcat bfc/collect-used-media)))
(def xf:collect-used-media
(comp
(map :data)
(mapcat cfh/collect-used-media)))
(defn- clean-file-media!
"Performs the garbage collection of file media objects."
[{:keys [::db/conn] :as cfg} {:keys [id] :as file}]
(let [used (into #{}
xf:collect-used-media
(cons file
(->> (db/cursor conn [sql:get-snapshots id])
(map (partial decode-file cfg)))))
(let [xform (comp
(map (partial bfc/decode-file cfg))
xf:collect-used-media)
used (->> (db/plan conn [sql:get-snapshots id] {:fetch-size 1})
(transduce xform conj #{}))
used (into used xf:collect-used-media [file])
ids (db/create-array conn "uuid" used)
unused (->> (db/exec! conn [sql:mark-file-media-object-deleted id ids])
(into #{} (map :id)))]
@@ -145,51 +146,45 @@
AND f.deleted_at IS null
ORDER BY f.modified_at ASC")
(defn- get-used-components
"Given a file and a set of components marked for deletion, return a
filtered set of component ids that are still un use"
[components library-id {:keys [data]}]
(filter #(ctf/used-in? data library-id % :component) components))
(defn- clean-deleted-components!
"Performs the garbage collection of unreferenced deleted components."
[{:keys [::db/conn] :as cfg} {:keys [data] :as file}]
(let [file-id (:id file)
get-used-components
(fn [data components]
;; Find which of the components are used in the file.
(into #{}
(filter #(ctf/used-in? data file-id % :component))
components))
deleted-components
(ctkl/deleted-components-seq data)
get-unused-components
(fn [components files]
;; Find and return a set of unused components (on all files).
(reduce (fn [components {:keys [data]}]
(if (seq components)
(->> (get-used-components data components)
(set/difference components))
(reduced components)))
xform
(mapcat (partial get-used-components deleted-components file-id))
components
files))
used-remote
(->> (db/plan conn [sql:get-files-for-library file-id] {:fetch-size 1})
(transduce (comp (map (partial bfc/decode-file cfg)) xform) conj #{}))
process-fdata
(fn [data unused]
(reduce (fn [data id]
(l/trc :hint "delete component"
:component-id (str id)
:file-id (str file-id))
(ctkl/delete-component data id))
data
unused))
used-local
(into #{} xform [file])
deleted (into #{} (ctkl/deleted-components-seq data))
unused (->> (db/cursor conn [sql:get-files-for-library file-id] {:chunk-size 1})
(map (partial decode-file cfg))
(cons file)
(get-unused-components deleted)
(mapv :id)
(set))
file (update file :data process-fdata unused)]
unused
(transduce bfc/xf-map-id disj
(into #{} bfc/xf-map-id deleted-components)
(concat used-remote used-local))
file
(update file :data
(fn [data]
(reduce (fn [data id]
(l/trc :hint "delete component"
:component-id (str id)
:file-id (str file-id))
(ctkl/delete-component data id))
data
unused)))]
(l/dbg :hint "clean" :rel "components" :file-id (str file-id) :total (count unused))
file))
@@ -204,31 +199,32 @@
(def ^:private xf:collect-pointers
(comp (map :data)
(map blob/decode)
(mapcat feat.fdata/get-used-pointer-ids)))
(defn- clean-data-fragments!
(defn- clean-fragments!
[{:keys [::db/conn]} {:keys [id] :as file}]
(let [used (into #{} xf:collect-pointers [file])
unused (let [ids (db/create-array conn "uuid" used)]
(->> (db/exec! conn [sql:mark-deleted-data-fragments id ids])
(into #{} (map :id))))]
unused (->> (db/exec! conn [sql:mark-deleted-data-fragments id
(db/create-array conn "uuid" used)])
(into #{} bfc/xf-map-id))]
(l/dbg :hint "clean" :rel "file-data-fragment" :file-id (str id) :total (count unused))
(doseq [id unused]
(l/trc :hint "mark deleted"
:rel "file-data-fragment"
:id (str id)
:file-id (str id)))))
:file-id (str id)))
file))
(defn- clean-media!
[cfg file]
(let [file (->> file
(clean-deleted-components! cfg)
(clean-file-media! cfg)
(clean-file-thumbnails! cfg)
(clean-file-object-thumbnails! cfg)
(clean-deleted-components! cfg))]
(clean-file-object-thumbnails! cfg))]
(cfv/validate-file-schema! file)
file))
@@ -249,65 +245,27 @@
FOR UPDATE
SKIP LOCKED")
(defn- get-file
[{:keys [::db/conn ::min-age ::file-id]}]
(->> (db/exec! conn [sql:get-file min-age file-id])
(first)))
(defn- decode-file
[cfg {:keys [id] :as file}]
(binding [pmap/*load-fn* (partial feat.fdata/load-pointer cfg id)]
(-> (feat.fdata/resolve-file-data cfg 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))))
(defn- persist-file!
[{:keys [::db/conn ::sto/storage] :as cfg} {:keys [id] :as file}]
(let [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)
file (-> file
(update :features db/encode-pgarray conn "text")
(update :data blob/encode))]
;; 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)))
(db/update! conn :file
{:has-media-trimmed true
:features (:features file)
:version (:version file)
:data (:data file)
:data-backend nil
:data-ref-id nil}
{:id id}
{::db/return-keys true})))
(defn get-file
[{:keys [::db/conn ::min-age]} file-id]
(let [min-age (if min-age
(db/interval min-age)
(db/interval 0))]
(->> (db/exec! conn [sql:get-file min-age file-id])
(first))))
(defn- process-file!
[cfg]
(if-let [file (get-file cfg)]
(let [file (decode-file cfg file)
file (clean-media! cfg file)
file (persist-file! cfg file)]
(clean-data-fragments! cfg file)
[cfg file-id]
(if-let [file (get-file cfg file-id)]
(let [file (->> file
(bfc/decode-file cfg)
(clean-media! cfg)
(clean-fragments! cfg))
file (assoc file :has-media-trimmed true)]
(bfc/update-file! cfg file)
true)
(do
(l/dbg :hint "skip" :file-id (str (::file-id cfg)))
(l/dbg :hint "skip" :file-id (str file-id))
false)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -324,15 +282,15 @@
(fn [{:keys [props] :as task}]
(let [min-age (dt/duration (or (:min-age props)
(cf/get-deletion-delay)))
file-id (get props :file-id)
cfg (-> cfg
(assoc ::db/rollback (:rollback? props))
(assoc ::file-id (:file-id props))
(assoc ::min-age (db/interval min-age)))]
(assoc ::min-age min-age))]
(try
(db/tx-run! cfg (fn [{:keys [::db/conn] :as cfg}]
(let [cfg (update cfg ::sto/storage sto/configure conn)
processed? (process-file! cfg)]
processed? (process-file! cfg file-id)]
(when (and processed? (contains? cf/flags :tiered-file-data-storage))
(wrk/submit! (-> cfg
(assoc ::wrk/task :offload-file-data)

View File

@@ -1,64 +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.tasks.file-xlog-gc
(:require
[app.common.logging :as l]
[app.config :as cf]
[app.db :as db]
[integrant.core :as ig]))
;; Get the latest available snapshots without exceeding the total
;; snapshot limit
(def ^:private sql:get-latest-snapshots
"SELECT fch.id, fch.created_at
FROM file_change AS fch
WHERE fch.file_id = ?
AND fch.created_by = 'system'
AND fch.data IS NOT NULL
AND fch.deleted_at > now()
ORDER BY fch.created_at DESC
LIMIT ?")
;; Mark all snapshots that are outside the allowed total threshold
;; available for the GC
(def ^:private sql:delete-snapshots
"UPDATE file_change
SET deleted_at = now()
WHERE file_id = ?
AND deleted_at > now()
AND data IS NOT NULL
AND created_by = 'system'
AND created_at < ?")
(defn- get-alive-snapshots
[conn file-id]
(let [total (cf/get :auto-file-snapshot-total 10)
snapshots (db/exec! conn [sql:get-latest-snapshots file-id total])]
(not-empty snapshots)))
(defn- delete-old-snapshots!
[{:keys [::db/conn] :as cfg} file-id]
(when-let [snapshots (get-alive-snapshots conn file-id)]
(let [last-date (-> snapshots peek :created-at)
result (db/exec-one! conn [sql:delete-snapshots file-id last-date])]
(l/inf :hint "delete old file snapshots"
:file-id (str file-id)
:current (count snapshots)
:deleted (db/get-update-count result)))))
(defmethod ig/assert-key ::handler
[_ params]
(assert (db/pool? (::db/pool params)) "expected a valid database pool"))
(defmethod ig/init-key ::handler
[_ cfg]
(fn [{:keys [props] :as task}]
(let [file-id (:file-id props)]
(assert (uuid? file-id) "expected file-id on props")
(-> cfg
(assoc ::db/rollback (:rollback props false))
(db/tx-run! delete-old-snapshots! file-id)))))

View File

@@ -26,7 +26,7 @@
(defn- delete-profiles!
[{:keys [::db/conn ::min-age ::chunk-size ::sto/storage] :as cfg}]
(->> (db/cursor conn [sql:get-profiles min-age chunk-size] {:chunk-size 5})
(->> (db/plan conn [sql:get-profiles min-age chunk-size] {:fetch-size 5})
(reduce (fn [total {:keys [id photo-id]}]
(l/trc :hint "permanently delete" :rel "profile" :id (str id))
@@ -49,7 +49,7 @@
(defn- delete-teams!
[{:keys [::db/conn ::min-age ::chunk-size ::sto/storage] :as cfg}]
(->> (db/cursor conn [sql:get-teams min-age chunk-size] {:chunk-size 5})
(->> (db/plan conn [sql:get-teams min-age chunk-size] {:fetch-size 5})
(reduce (fn [total {:keys [id photo-id deleted-at]}]
(l/trc :hint "permanently delete"
:rel "team"
@@ -77,7 +77,7 @@
(defn- delete-fonts!
[{:keys [::db/conn ::min-age ::chunk-size ::sto/storage] :as cfg}]
(->> (db/cursor conn [sql:get-fonts min-age chunk-size] {:chunk-size 5})
(->> (db/plan conn [sql:get-fonts min-age chunk-size] {:fetch-size 5})
(reduce (fn [total {:keys [id team-id deleted-at] :as font}]
(l/trc :hint "permanently delete"
:rel "team-font-variant"
@@ -109,7 +109,7 @@
(defn- delete-projects!
[{:keys [::db/conn ::min-age ::chunk-size] :as cfg}]
(->> (db/cursor conn [sql:get-projects min-age chunk-size] {:chunk-size 5})
(->> (db/plan conn [sql:get-projects min-age chunk-size] {:fetch-size 5})
(reduce (fn [total {:keys [id team-id deleted-at]}]
(l/trc :hint "permanently delete"
:rel "project"
@@ -135,7 +135,7 @@
(defn- delete-files!
[{:keys [::db/conn ::sto/storage ::min-age ::chunk-size] :as cfg}]
(->> (db/cursor conn [sql:get-files min-age chunk-size] {:chunk-size 5})
(->> (db/plan conn [sql:get-files min-age chunk-size] {:fetch-size 5})
(reduce (fn [total {:keys [id deleted-at project-id] :as file}]
(l/trc :hint "permanently delete"
:rel "file"
@@ -164,7 +164,7 @@
(defn delete-file-thumbnails!
[{:keys [::db/conn ::min-age ::chunk-size ::sto/storage] :as cfg}]
(->> (db/cursor conn [sql:get-file-thumbnails min-age chunk-size] {:chunk-size 5})
(->> (db/plan conn [sql:get-file-thumbnails min-age chunk-size] {:fetch-size 5})
(reduce (fn [total {:keys [file-id revn media-id deleted-at]}]
(l/trc :hint "permanently delete"
:rel "file-thumbnail"
@@ -193,7 +193,7 @@
(defn delete-file-object-thumbnails!
[{:keys [::db/conn ::min-age ::chunk-size ::sto/storage] :as cfg}]
(->> (db/cursor conn [sql:get-file-object-thumbnails min-age chunk-size] {:chunk-size 5})
(->> (db/plan conn [sql:get-file-object-thumbnails min-age chunk-size] {:fetch-size 5})
(reduce (fn [total {:keys [file-id object-id media-id deleted-at]}]
(l/trc :hint "permanently delete"
:rel "file-tagged-object-thumbnail"
@@ -222,7 +222,7 @@
(defn- delete-file-data-fragments!
[{:keys [::db/conn ::sto/storage ::min-age ::chunk-size] :as cfg}]
(->> (db/cursor conn [sql:get-file-data-fragments min-age chunk-size] {:chunk-size 5})
(->> (db/plan conn [sql:get-file-data-fragments min-age chunk-size] {:fetch-size 5})
(reduce (fn [total {:keys [file-id id deleted-at data-ref-id]}]
(l/trc :hint "permanently delete"
:rel "file-data-fragment"
@@ -248,7 +248,7 @@
(defn- delete-file-media-objects!
[{:keys [::db/conn ::min-age ::chunk-size ::sto/storage] :as cfg}]
(->> (db/cursor conn [sql:get-file-media-objects min-age chunk-size] {:chunk-size 5})
(->> (db/plan conn [sql:get-file-media-objects min-age chunk-size] {:fetch-size 5})
(reduce (fn [total {:keys [id file-id deleted-at] :as fmo}]
(l/trc :hint "permanently delete"
:rel "file-media-object"
@@ -275,9 +275,9 @@
FOR UPDATE
SKIP LOCKED")
(defn- delete-file-change!
(defn- delete-file-changes!
[{:keys [::db/conn ::min-age ::chunk-size ::sto/storage] :as cfg}]
(->> (db/cursor conn [sql:get-file-change min-age chunk-size] {:chunk-size 5})
(->> (db/plan conn [sql:get-file-change min-age chunk-size] {:fetch-size 5})
(reduce (fn [total {:keys [id file-id deleted-at] :as xlog}]
(l/trc :hint "permanently delete"
:rel "file-change"
@@ -299,11 +299,11 @@
#'delete-file-data-fragments!
#'delete-file-object-thumbnails!
#'delete-file-thumbnails!
#'delete-file-changes!
#'delete-files!
#'delete-projects!
#'delete-fonts!
#'delete-teams!
#'delete-file-change!])
#'delete-teams!])
(defn- execute-proc!
"A generic function that executes the specified proc iterativelly
@@ -326,7 +326,7 @@
[k v]
{k (assoc v
::min-age (cf/get-deletion-delay)
::chunk-size 50)})
::chunk-size 100)})
(defmethod ig/init-key ::handler
[_ cfg]

View File

@@ -7,6 +7,7 @@
(ns backend-tests.binfile-test
"Internal binfile test, no RPC involved"
(:require
[app.binfile.common :as bfc]
[app.binfile.v3 :as v3]
[app.common.features :as cfeat]
[app.common.pprint :as pp]
@@ -93,15 +94,15 @@
(v3/export-files!
(-> th/*system*
(assoc ::v3/ids #{(:id file)})
(assoc ::v3/embed-assets false)
(assoc ::v3/include-libraries false))
(assoc ::bfc/ids #{(:id file)})
(assoc ::bfc/embed-assets false)
(assoc ::bfc/include-libraries false))
(io/output-stream output))
(let [result (-> th/*system*
(assoc ::v3/project-id (:default-project-id profile))
(assoc ::v3/profile-id (:id profile))
(assoc ::v3/input output)
(assoc ::bfc/project-id (:default-project-id profile))
(assoc ::bfc/profile-id (:id profile))
(assoc ::bfc/input output)
(v3/import-files!))]
(t/is (= (count result) 1))
(t/is (every? uuid? result)))))

View File

@@ -62,7 +62,7 @@
(def default
{:database-uri "postgresql://postgres/penpot_test"
:redis-uri "redis://redis/1"
:file-snapshot-every 1})
:auto-file-snapshot-every 1})
(def config
(cf/read-config :prefix "penpot-test"
@@ -210,14 +210,14 @@
([system i {:keys [profile-id project-id] :as params}]
(dm/assert! "expected uuid" (uuid? profile-id))
(dm/assert! "expected uuid" (uuid? project-id))
(db/run! system
(fn [system]
(let [features (cfeat/get-enabled-features cf/flags)]
(files.create/create-file system
(merge {:id (mk-uuid "file" i)
:name (str "file" i)
:features features}
params)))))))
(db/tx-run! system
(fn [system]
(let [features (cfeat/get-enabled-features cf/flags)]
(files.create/create-file system
(merge {:id (mk-uuid "file" i)
:name (str "file" i)
:features features}
params)))))))
(defn mark-file-deleted*
([params]

View File

@@ -177,7 +177,7 @@
;; (th/print-result! out)
(t/is (th/success? out))
(let [[thread :as result] (:result out)]
(t/is (= 1 (count result)))))
(t/is (= 0 (count result)))))
(let [data {::th/type :update-comment-thread-status
::rpc/profile-id (:id profile-1)

View File

@@ -97,6 +97,7 @@
(th/db-query :file-change
{:file-id (:id file)}
{:order-by [:created-at]})]
(t/is (= 2 (count rows)))
(t/is (= "user" (:created-by row1)))
(t/is (= "system" (:created-by row2)))))

View File

@@ -16,6 +16,7 @@
[app.db.sql :as sql]
[app.http :as http]
[app.rpc :as-alias rpc]
[app.rpc.commands.files :as files]
[app.storage :as sto]
[app.util.time :as dt]
[backend-tests.helpers :as th]
@@ -383,8 +384,19 @@
;; as deleted.
(t/is (true? (th/run-task! :file-gc {:min-age 0 :file-id (:id file)})))
;; This only clears fragments, the file media objects still referenced because
;; snapshots are preserved
(let [res (th/run-task! :objects-gc {:min-age 0})]
(t/is (= 3 (:processed res))))
(t/is (= 2 (:processed res))))
;; Mark all snapshots to be a non-snapshot file change
(th/db-exec! ["update file_change set data = null where file_id = ?" (:id file)])
(th/db-exec! ["update file set has_media_trimmed = false where id = ?" (:id file)])
;; Rerun the file-gc and objects-gc
(t/is (true? (th/run-task! :file-gc {:min-age 0 :file-id (:id file)})))
(let [res (th/run-task! :objects-gc {:min-age 0})]
(t/is (= 2 (:processed res))))
;; Now that file-gc have deleted the file-media-object usage,
;; lets execute the touched-gc task, we should see that two of
@@ -417,20 +429,6 @@
;; (th/print-result! out)
(t/is (nil? (:error out)))
(:result out)))
(update-file! [& {:keys [profile-id file-id changes revn] :or {revn 0}}]
(let [params {::th/type :update-file
::rpc/profile-id profile-id
:id file-id
:session-id (uuid/random)
:revn revn
:vern 0
:components-v2 true
:changes changes}
out (th/command! params)]
;; (th/print-result! out)
(t/is (nil? (:error out)))
(:result out)))]
(let [storage (:app.storage/storage th/*system*)
@@ -550,8 +548,20 @@
;; as deleted.
(t/is (true? (th/run-task! :file-gc {:min-age 0 :file-id (:id file)})))
;; This only removes unused fragments, file media are still
;; referenced on snapshots.
(let [res (th/run-task! :objects-gc {:min-age 0})]
(t/is (= 7 (:processed res))))
(t/is (= 2 (:processed res))))
;; Mark all snapshots to be a non-snapshot file change
(th/db-exec! ["update file set has_media_trimmed = false where id = ?" (:id file)])
(th/db-exec! ["update file_change set data = null where file_id = ?" (:id file)])
;; Rerun file-gc and objects-gc task for the same file once all snapshots are
;; "expired/deleted"
(t/is (true? (th/run-task! :file-gc {:min-age 0 :file-id (:id file)})))
(let [res (th/run-task! :objects-gc {:min-age 0})]
(t/is (= 6 (:processed res))))
(let [rows (th/db-query :file-data-fragment {:file-id (:id file)
:deleted-at nil})]
@@ -591,20 +601,7 @@
;; (th/print-result! out)
(t/is (nil? (:error out)))
(:result out)))
#_(update-file! [& {:keys [profile-id file-id changes revn] :or {revn 0}}]
(let [params {::th/type :update-file
::rpc/profile-id profile-id
:id file-id
:session-id (uuid/random)
:revn revn
:features cfeat/supported-features
:changes changes}
out (th/command! params)]
;; (th/print-result! out)
(t/is (nil? (:error out)))
(:result out)))]
(:result out)))]
(let [storage (:app.storage/storage th/*system*)
profile (th/create-profile* 1)
@@ -1090,8 +1087,7 @@
(t/is (contains? result :file-id))
(t/is (= (:id file) (:file-id result)))
(t/is (str/starts-with? (get-in result [:page :objects frame1-id :thumbnail])
"http://localhost:3449/assets/by-id/"))
(t/is (uuid? (get-in result [:page :objects frame1-id :thumbnail-id])))
(t/is (= [] (get-in result [:page :objects frame1-id :shapes]))))
;; Delete thumbnail data
@@ -1337,3 +1333,498 @@
(t/is (every? #(bytes? (:data %)) rows))
(t/is (every? #(nil? (:data-ref-id %)) rows))
(t/is (every? #(nil? (:data-backend %)) rows)))))
(t/deftest file-gc-with-components-1
(let [storage (:app.storage/storage th/*system*)
profile (th/create-profile* 1)
file (th/create-file* 1 {:profile-id (:id profile)
:project-id (:default-project-id profile)
:is-shared false})
s-id-1 (uuid/random)
s-id-2 (uuid/random)
c-id (uuid/random)
page-id (first (get-in file [:data :pages]))]
(let [rows (th/db-query :file-data-fragment {:file-id (:id file)
:deleted-at nil})]
(t/is (= (count rows) 1)))
;; Update file inserting new component
(update-file!
:file-id (:id file)
:profile-id (:id profile)
:revn 0
:vern 0
:changes
[{:type :add-obj
:page-id page-id
:id s-id-1
:parent-id uuid/zero
:frame-id uuid/zero
:components-v2 true
:obj (cts/setup-shape
{:id s-id-1
:name "Board"
:frame-id uuid/zero
:parent-id uuid/zero
:type :frame
:main-instance true
:component-root true
:component-file (:id file)
:component-id c-id})}
{:type :add-obj
:page-id page-id
:id s-id-2
:parent-id uuid/zero
:frame-id uuid/zero
:components-v2 true
:obj (cts/setup-shape
{:id s-id-2
:name "Board"
:frame-id uuid/zero
:parent-id uuid/zero
:type :frame
:main-instance false
:component-root true
:component-file (:id file)
:component-id c-id})}
{:type :add-component
:path ""
:name "Board"
:main-instance-id s-id-1
:main-instance-page page-id
:id c-id
:anotation nil}])
;; Run the file-gc task immediately without forced min-age
(t/is (false? (th/run-task! :file-gc {:file-id (:id file)})))
;; Run the task again
(t/is (true? (th/run-task! :file-gc {:min-age 0 :file-id (:id file)})))
;; Retrieve file and check trimmed attribute
(let [row (th/db-get :file {:id (:id file)})]
(t/is (true? (:has-media-trimmed row))))
;; Check that component exists
(let [data {::th/type :get-file
::rpc/profile-id (:id profile)
:id (:id file)}
out (th/command! data)]
(t/is (th/success? out))
(let [result (:result out)
component (get-in result [:data :components c-id])]
(t/is (some? component))
(t/is (nil? (:objects component)))))
;; Now proceed to delete a component
(update-file!
:file-id (:id file)
:profile-id (:id profile)
:revn 0
:vern 0
:changes
[{:type :del-component
:id c-id}
{:type :del-obj
:page-id page-id
:id s-id-1
:ignore-touched true}])
;; ;; Check that component is marked as deleted
(let [data {::th/type :get-file
::rpc/profile-id (:id profile)
:id (:id file)}
out (th/command! data)]
(t/is (th/success? out))
(let [result (:result out)
component (get-in result [:data :components c-id])]
(t/is (true? (:deleted component)))
(t/is (some? (not-empty (:objects component))))))
;; Re-run the file-gc task
(t/is (true? (th/run-task! :file-gc {:min-age 0 :file-id (:id file)})))
(let [row (th/db-get :file {:id (:id file)})]
(t/is (true? (:has-media-trimmed row))))
;; Check that component is still there after file-gc task
(let [data {::th/type :get-file
::rpc/profile-id (:id profile)
:id (:id file)}
out (th/command! data)]
(t/is (th/success? out))
(let [result (:result out)
component (get-in result [:data :components c-id])]
(t/is (true? (:deleted component)))
(t/is (some? (not-empty (:objects component))))))
;; Now delete the last instance using deleted component
(update-file!
:file-id (:id file)
:profile-id (:id profile)
:revn 0
:vern 0
:changes
[{:type :del-obj
:page-id page-id
:id s-id-2
:ignore-touched true}])
;; Now, we have deleted the usage of component if we pass file-gc,
;; that component should be deleted
(t/is (true? (th/run-task! :file-gc {:min-age 0 :file-id (:id file)})))
;; Check that component is properly removed
(let [data {::th/type :get-file
::rpc/profile-id (:id profile)
:id (:id file)}
out (th/command! data)]
(t/is (th/success? out))
(let [result (:result out)
components (get-in result [:data :components])]
(t/is (not (contains? components c-id)))))))
(t/deftest file-gc-with-components-2
(let [storage (:app.storage/storage th/*system*)
profile (th/create-profile* 1)
file-1 (th/create-file* 1 {:profile-id (:id profile)
:project-id (:default-project-id profile)
:is-shared true})
file-2 (th/create-file* 2 {:profile-id (:id profile)
:project-id (:default-project-id profile)
:is-shared false})
rel (th/link-file-to-library*
{:file-id (:id file-2)
:library-id (:id file-1)})
s-id-1 (uuid/random)
s-id-2 (uuid/random)
c-id (uuid/random)
f1-page-id (first (get-in file-1 [:data :pages]))
f2-page-id (first (get-in file-2 [:data :pages]))]
;; Update file library inserting new component
(update-file!
:file-id (:id file-1)
:profile-id (:id profile)
:revn 0
:vern 0
:changes
[{:type :add-obj
:page-id f1-page-id
:id s-id-1
:parent-id uuid/zero
:frame-id uuid/zero
:components-v2 true
:obj (cts/setup-shape
{:id s-id-1
:name "Board"
:frame-id uuid/zero
:parent-id uuid/zero
:type :frame
:main-instance true
:component-root true
:component-file (:id file-1)
:component-id c-id})}
{:type :add-component
:path ""
:name "Board"
:main-instance-id s-id-1
:main-instance-page f1-page-id
:id c-id
:anotation nil}])
;; Instanciate a component in a different file
(update-file!
:file-id (:id file-2)
:profile-id (:id profile)
:revn 0
:vern 0
:changes
[{:type :add-obj
:page-id f2-page-id
:id s-id-2
:parent-id uuid/zero
:frame-id uuid/zero
:components-v2 true
:obj (cts/setup-shape
{:id s-id-2
:name "Board"
:frame-id uuid/zero
:parent-id uuid/zero
:type :frame
:main-instance false
:component-root true
:component-file (:id file-1)
:component-id c-id})}])
;; Run the file-gc on file and library
(t/is (true? (th/run-task! :file-gc {:min-age 0 :file-id (:id file-1)})))
(t/is (true? (th/run-task! :file-gc {:min-age 0 :file-id (:id file-2)})))
;; Check that component exists
(let [data {::th/type :get-file
::rpc/profile-id (:id profile)
:id (:id file-1)}
out (th/command! data)]
(t/is (th/success? out))
(let [result (:result out)
component (get-in result [:data :components c-id])]
(t/is (some? component))
(t/is (nil? (:objects component)))))
;; Now proceed to delete a component
(update-file!
:file-id (:id file-1)
:profile-id (:id profile)
:revn 0
:vern 0
:changes
[{:type :del-component
:id c-id}
{:type :del-obj
:page-id f1-page-id
:id s-id-1
:ignore-touched true}])
;; Check that component is marked as deleted
(let [data {::th/type :get-file
::rpc/profile-id (:id profile)
:id (:id file-1)}
out (th/command! data)]
(t/is (th/success? out))
(let [result (:result out)
component (get-in result [:data :components c-id])]
(t/is (true? (:deleted component)))
(t/is (some? (not-empty (:objects component))))))
;; Re-run the file-gc task
(t/is (true? (th/run-task! :file-gc {:min-age 0 :file-id (:id file-1)})))
(t/is (false? (th/run-task! :file-gc {:min-age 0 :file-id (:id file-2)})))
;; Check that component is still there after file-gc task
(let [data {::th/type :get-file
::rpc/profile-id (:id profile)
:id (:id file-1)}
out (th/command! data)]
(t/is (th/success? out))
(let [result (:result out)
component (get-in result [:data :components c-id])]
(t/is (true? (:deleted component)))
(t/is (some? (not-empty (:objects component))))))
;; Now delete the last instance using deleted component
(update-file!
:file-id (:id file-2)
:profile-id (:id profile)
:revn 0
:vern 0
:changes
[{:type :del-obj
:page-id f2-page-id
:id s-id-2
:ignore-touched true}])
;; Mark
(th/db-exec! ["update file set has_media_trimmed = false where id = ?" (:id file-1)])
;; Now, we have deleted the usage of component if we pass file-gc,
;; that component should be deleted
(t/is (true? (th/run-task! :file-gc {:min-age 0 :file-id (:id file-1)})))
;; Check that component is properly removed
(let [data {::th/type :get-file
::rpc/profile-id (:id profile)
:id (:id file-1)}
out (th/command! data)]
(t/is (th/success? out))
(let [result (:result out)
components (get-in result [:data :components])]
(t/is (not (contains? components c-id)))))))
(defn add-file-media-object
[& {:keys [profile-id file-id]}]
(let [mfile {:filename "sample.jpg"
:path (th/tempfile "backend_tests/test_files/sample.jpg")
:mtype "image/jpeg"
:size 312043}
params {::th/type :upload-file-media-object
::rpc/profile-id profile-id
:file-id file-id
:is-local true
:name "testfile"
:content mfile}
out (th/command! params)]
;; (th/print-result! out)
(t/is (nil? (:error out)))
(:result out)))
(t/deftest file-gc-with-media-assets-and-absorb-library
(let [storage (:app.storage/storage th/*system*)
profile (th/create-profile* 1)
file-1 (th/create-file* 1 {:profile-id (:id profile)
:project-id (:default-project-id profile)
:is-shared true})
file-2 (th/create-file* 2 {:profile-id (:id profile)
:project-id (:default-project-id profile)
:is-shared false})
fmedia (add-file-media-object :profile-id (:id profile) :file-id (:id file-1))
rel (th/link-file-to-library*
{:file-id (:id file-2)
:library-id (:id file-1)})
s-id-1 (uuid/random)
s-id-2 (uuid/random)
c-id (uuid/random)
f1-page-id (first (get-in file-1 [:data :pages]))
f2-page-id (first (get-in file-2 [:data :pages]))
fills
[{:fill-image
{:id (:id fmedia)
:name "test"
:width 200
:height 200}}]]
;; Update file library inserting new component
(update-file!
:file-id (:id file-1)
:profile-id (:id profile)
:revn 0
:vern 0
:changes
[{:type :add-obj
:page-id f1-page-id
:id s-id-1
:parent-id uuid/zero
:frame-id uuid/zero
:components-v2 true
:obj (cts/setup-shape
{:id s-id-1
:name "Board"
:frame-id uuid/zero
:parent-id uuid/zero
:type :frame
:fills fills
:main-instance true
:component-root true
:component-file (:id file-1)
:component-id c-id})}
{:type :add-component
:path ""
:name "Board"
:main-instance-id s-id-1
:main-instance-page f1-page-id
:id c-id
:anotation nil}])
;; Instanciate a component in a different file
(update-file!
:file-id (:id file-2)
:profile-id (:id profile)
:revn 0
:vern 0
:changes
[{:type :add-obj
:page-id f2-page-id
:id s-id-2
:parent-id uuid/zero
:frame-id uuid/zero
:components-v2 true
:obj (cts/setup-shape
{:id s-id-2
:name "Board"
:frame-id uuid/zero
:parent-id uuid/zero
:type :frame
:fills fills
:main-instance false
:component-root true
:component-file (:id file-1)
:component-id c-id})}])
;; Check that file media object references are present for both objects
;; the original one and the instance.
(let [rows (th/db-exec! ["SELECT * FROM file_media_object ORDER BY created_at ASC"])]
(t/is (= 2 (count rows)))
(t/is (= (:id file-1) (:file-id (get rows 0))))
(t/is (= (:id file-2) (:file-id (get rows 1))))
(t/is (every? (comp nil? :deleted-at) rows)))
;; Check if the underlying media reference on shape is different
;; from the instantiation
(let [data {::th/type :get-file
::rpc/profile-id (:id profile)
:id (:id file-2)}
out (th/command! data)]
(t/is (th/success? out))
(let [result (:result out)
fill (get-in result [:data :pages-index f2-page-id :objects s-id-2 :fills 0 :fill-image])]
(t/is (some? fill))
(t/is (not= (:id fill) (:id fmedia)))))
;; Run the file-gc on file and library
(t/is (true? (th/run-task! :file-gc {:min-age 0 :file-id (:id file-1)})))
(t/is (true? (th/run-task! :file-gc {:min-age 0 :file-id (:id file-2)})))
;; Now proceed to delete file and absorb it
(let [data {::th/type :delete-file
::rpc/profile-id (:id profile)
:id (:id file-1)}
out (th/command! data)]
(t/is (th/success? out)))
(th/run-task! :delete-object
{:object :file
:deleted-at (dt/now)
:id (:id file-1)})
;; Check that file media object references are marked all for deletion
(let [rows (th/db-exec! ["SELECT * FROM file_media_object ORDER BY created_at ASC"])]
;; (pp/pprint rows)
(t/is (= 2 (count rows)))
(t/is (= (:id file-1) (:file-id (get rows 0))))
(t/is (some? (:deleted-at (get rows 0))))
(t/is (= (:id file-2) (:file-id (get rows 1))))
(t/is (nil? (:deleted-at (get rows 1)))))
(th/run-task! :objects-gc
{:min-age 0})
(let [rows (th/db-exec! ["SELECT * FROM file_media_object ORDER BY created_at ASC"])]
(t/is (= 1 (count rows)))
(t/is (= (:id file-2) (:file-id (get rows 0))))
(t/is (nil? (:deleted-at (get rows 0)))))))

View File

@@ -6,6 +6,7 @@
(ns backend-tests.rpc-management-test
(:require
[app.binfile.common :as bfc]
[app.common.features :as cfeat]
[app.common.pprint :as pp]
[app.common.types.shape :as cts]
@@ -82,7 +83,6 @@
;; Check that result is correct
(t/is (nil? (:error out)))
(let [result (:result out)]
;; Check that the returned result is a file but has different id
;; and different name.
(t/is (= "file 1 (copy)" (:name result)))

View File

@@ -10,6 +10,7 @@
[app.db :as db]
[app.rpc :as-alias rpc]
[app.storage :as sto]
[app.util.time :as dt]
[backend-tests.helpers :as th]
[clojure.test :as t]
[datoteka.fs :as fs]))
@@ -245,3 +246,35 @@
(t/is (= "image/jpeg" (:mtype result)))
(t/is (uuid? (:media-id result)))
(t/is (uuid? (:thumbnail-id result))))))
(t/deftest media-object-upload-command-when-file-is-deleted
(let [prof (th/create-profile* 1)
proj (th/create-project* 1 {:profile-id (:id prof)
:team-id (:default-team-id prof)})
file (th/create-file* 1 {:profile-id (:id prof)
:project-id (:default-project-id prof)
:is-shared false})
_ (th/db-update! :file
{:deleted-at (dt/now)}
{:id (:id file)})
mfile {:filename "sample.jpg"
:path (th/tempfile "backend_tests/test_files/sample.jpg")
:mtype "image/jpeg"
:size 312043}
params {::th/type :upload-file-media-object
::rpc/profile-id (:id prof)
:file-id (:id file)
:is-local true
:name "testfile"
:content mfile}
out (th/command! params)]
(let [error (:error out)
error-data (ex-data error)]
(t/is (th/ex-info? error))
(t/is (= (:type error-data) :not-found)))))

View File

@@ -203,7 +203,24 @@
edata (ex-data error)]
(t/is (th/ex-info? error))
(t/is (= (:type edata) :validation))
(t/is (= (:code edata) :owner-teams-with-people))))))
(t/is (= (:code edata) :owner-teams-with-people)))
(let [params {::th/type :delete-team
::rpc/profile-id (:id prof1)
:id (:id team1)}
out (th/command! params)]
;; (th/print-result! out)
(let [team (th/db-get :team {:id (:id team1)} {::db/remove-deleted false})]
(t/is (dt/instant? (:deleted-at team)))))
;; Request profile to be deleted
(let [params {::th/type :delete-profile
::rpc/profile-id (:id prof1)}
out (th/command! params)]
;; (th/print-result! out)
(t/is (nil? (:result out)))
(t/is (nil? (:error out)))))))
(t/deftest profile-deletion-3
(let [prof1 (th/create-profile* 1)
@@ -291,7 +308,7 @@
out (th/command! params)]
;; (th/print-result! out)
(t/is (= {} (:result out)))
(t/is (nil? (:result out)))
(t/is (nil? (:error out))))
;; query files after profile soft deletion
@@ -336,7 +353,7 @@
::rpc/profile-id (:id prof1)}
out (th/command! params)]
;; (th/print-result! out)
(t/is (= {} (:result out)))
(t/is (nil? (:result out)))
(t/is (nil? (:error out))))
(th/run-pending-tasks!)

View File

@@ -37,18 +37,17 @@
:role :editor}]
;; invite external user without complaints
(let [data (assoc data :emails ["foo@bar.com"])
out (th/command! data)
(let [data (assoc data :emails ["foo@bar.com"])
out (th/command! data)
;; retrieve the value from the database and check its content
invitation (db/exec-one!
th/*pool*
["select count(*) as num from team_invitation where team_id = ? and email_to = ?"
(:team-id data) "foo@bar.com"])]
invitations (th/db-query :team-invitation
{:team-id (:team-id data)
:email-to "foo@bar.com"})]
;; (th/print-result! out)
(t/is (th/success? out))
(t/is (= 1 (:call-count (deref mock))))
(t/is (= 1 (:num invitation))))
(t/is (= 1 (count invitations))))
;; invite internal user without complaints
(th/reset-mock! mock)
@@ -102,6 +101,105 @@
(t/is (= :validation (:type edata)))
(t/is (= :member-is-muted (:code edata))))))))
(t/deftest create-team-invitations-with-request-access
(with-mocks [mock {:target 'app.email/send! :return nil}]
(let [profile1 (th/create-profile* 1 {:is-active true})
requester (th/create-profile* 2 {:is-active true :email "requester@example.com"})
team (th/create-team* 1 {:profile-id (:id profile1)})
proj (th/create-project* 1 {:profile-id (:id profile1)
:team-id (:id team)})
file (th/create-file* 1 {:profile-id (:id profile1)
:project-id (:id proj)})]
(let [data {::th/type :create-team-access-request
::rpc/profile-id (:id requester)
:file-id (:id file)}
out (th/command! data)]
(t/is (th/success? out))
(t/is (= 1 (:call-count @mock))))
(th/reset-mock! mock)
(let [data {::th/type :create-team-invitations
::rpc/profile-id (:id profile1)
:team-id (:id team)
:role :editor
:emails ["requester@example.com"]}
out (th/command! data)]
(t/is (th/success? out))
(t/is (= 1 (:call-count @mock)))
;; Check that request is properly removed
(let [requests (th/db-query :team-access-request
{:requester-id (:id requester)})]
(t/is (= 0 (count requests))))
(let [rows (th/db-query :team-profile-rel {:team-id (:id team)})]
(t/is (= 2 (count rows))))))))
(t/deftest create-team-invitations-with-request-access-2
(with-mocks [mock {:target 'app.email/send! :return nil}]
(let [profile1 (th/create-profile* 1 {:is-active true})
requester (th/create-profile* 2 {:is-active true
:email "requester@example.com"})
team (th/create-team* 1 {:profile-id (:id profile1)})
proj (th/create-project* 1 {:profile-id (:id profile1)
:team-id (:id team)})
file (th/create-file* 1 {:profile-id (:id profile1)
:project-id (:id proj)})]
;; Create the first access request
(let [data {::th/type :create-team-access-request
::rpc/profile-id (:id requester)
:file-id (:id file)}
out (th/command! data)]
(t/is (th/success? out))
(t/is (= 1 (:call-count @mock))))
(th/reset-mock! mock)
;; Proceed to delete the requester user
(th/db-update! :profile
{:deleted-at (dt/in-past "1h")}
{:id (:id requester)})
;; Create a new profile with the same email
(let [requester' (th/create-profile* 3 {:is-active true :email "requester@example.com"})]
;; Create a request access with new requester
(let [data {::th/type :create-team-access-request
::rpc/profile-id (:id requester')
:file-id (:id file)}
out (th/command! data)]
(t/is (th/success? out))
(t/is (= 1 (:call-count @mock))))
(th/reset-mock! mock)
;; Create an invitation for the requester email
(let [data {::th/type :create-team-invitations
::rpc/profile-id (:id profile1)
:team-id (:id team)
:role :editor
:emails ["requester@example.com"]}
out (th/command! data)]
(t/is (th/success? out))
(t/is (= 1 (:call-count @mock))))
;; Check that request is properly removed
(let [requests (th/db-query :team-access-request
{:requester-id (:id requester')})]
(t/is (= 0 (count requests))))
(let [[r1 r2 :as rows] (th/db-query :team-profile-rel
{:team-id (:id team)}
{:order-by [:created-at]})]
(t/is (= 2 (count rows)))
(t/is (= (:profile-id r1) (:id profile1)))
(t/is (= (:profile-id r2) (:id requester'))))))))
(t/deftest invitation-tokens
(with-mocks [mock {:target 'app.email/send! :return nil}]
@@ -486,14 +584,12 @@
;; request success
(let [out (th/command! data)
;; retrieve the value from the database and check its content
request (db/exec-one!
th/*pool*
["select count(*) as num from team_access_request where team_id = ? and requester_id = ?"
(:id team) (:id requester)])]
requests (th/db-query :team-access-request
{:team-id (:id team)
:requester-id (:id requester)})]
(t/is (th/success? out))
(t/is (= 1 (:call-count @mock)))
(t/is (= 1 (:num request))))
(t/is (= 1 (count requests))))
;; request again fails
(th/reset-mock! mock)
@@ -509,10 +605,10 @@
;; request again when is expired success
(th/reset-mock! mock)
(db/exec-one!
th/*pool*
["update team_access_request set valid_until = ? where team_id = ? and requester_id = ?"
(dt/in-past "1h") (:id team) (:id requester)])
(th/db-update! :team-access-request
{:valid-until (dt/in-past "1h")}
{:team-id (:id team)
:requester-id (:id requester)})
(t/is (th/success? (th/command! data)))
(t/is (= 1 (:call-count @mock))))))

View File

@@ -1,25 +1,25 @@
{:deps
{org.clojure/clojure {:mvn/version "1.12.0"}
org.clojure/data.json {:mvn/version "2.5.0"}
org.clojure/data.json {:mvn/version "2.5.1"}
org.clojure/tools.cli {:mvn/version "1.1.230"}
org.clojure/clojurescript {:mvn/version "1.11.132"}
org.clojure/test.check {:mvn/version "1.1.1"}
org.clojure/data.fressian {:mvn/version "1.1.0"}
;; Logging
org.apache.logging.log4j/log4j-api {:mvn/version "2.24.1"}
org.apache.logging.log4j/log4j-core {:mvn/version "2.24.1"}
org.apache.logging.log4j/log4j-web {:mvn/version "2.24.1"}
org.apache.logging.log4j/log4j-jul {:mvn/version "2.24.1"}
org.apache.logging.log4j/log4j-slf4j2-impl {:mvn/version "2.24.1"}
org.apache.logging.log4j/log4j-api {:mvn/version "2.24.3"}
org.apache.logging.log4j/log4j-core {:mvn/version "2.24.3"}
org.apache.logging.log4j/log4j-web {:mvn/version "2.24.3"}
org.apache.logging.log4j/log4j-jul {:mvn/version "2.24.3"}
org.apache.logging.log4j/log4j-slf4j2-impl {:mvn/version "2.24.3"}
org.slf4j/slf4j-api {:mvn/version "2.0.16"}
pl.tkowalcz.tjahzi/log4j2-appender {:mvn/version "0.9.32"}
selmer/selmer {:mvn/version "1.12.61"}
criterium/criterium {:mvn/version "0.4.6"}
metosin/jsonista {:mvn/version "0.3.11"}
metosin/malli {:mvn/version "0.16.4"}
metosin/jsonista {:mvn/version "0.3.13"}
metosin/malli {:mvn/version "0.17.0"}
expound/expound {:mvn/version "0.9.0"}
com.cognitect/transit-clj {:mvn/version "1.0.333"}
@@ -47,11 +47,10 @@
org.la4j/la4j {:mvn/version "0.6.0"}
;; exception printing
fipp/fipp {:mvn/version "0.6.26"}
fipp/fipp {:mvn/version "0.6.27"}
me.flowthing/pp {:mvn/version "2024-11-13.77"}
io.github.eerohele/pp
{:git/tag "2024-09-09.69"
:git/sha "de4b20f"}
io.aviso/pretty {:mvn/version "1.4.4"}
environ/environ {:mvn/version "1.2.0"}}
@@ -60,7 +59,7 @@
{:dev
{:extra-deps
{org.clojure/tools.namespace {:mvn/version "RELEASE"}
thheller/shadow-cljs {:mvn/version "2.28.18"}
thheller/shadow-cljs {:mvn/version "2.28.20"}
com.clojure-goes-fast/clj-async-profiler {:mvn/version "RELEASE"}
com.bhauman/rebel-readline {:mvn/version "RELEASE"}
criterium/criterium {:mvn/version "RELEASE"}
@@ -69,7 +68,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.6" :git/sha "52cf7d6"}}
:ns-default build}
:test

Some files were not shown because too many files have changed in this diff Show More