Compare commits

...
Author SHA1 Message Date
Belén Albeza 32fe91398a further adjustments to record video 2024-10-23 13:07:29 +02:00
Belén Albeza b36c8cd52a modify stress test (rs) to record video 2024-10-22 17:25:55 +02:00
Belén Albeza f5acfd0787 stashed 2024-10-22 17:25:55 +02:00
AzazelN28 4939bc06ac wip: 20_000 test 2024-10-11 12:27:14 +02:00
Belén Albeza cd63fb78d2 render 20k rects (rust) 2024-10-11 12:15:25 +02:00
Belén Albeza 3298785436 rust benchmark wip 2024-10-11 11:44:22 +02:00
Alejandro Alonso eeb0d21013 Playing with pdf render 2024-10-11 09:07:41 +02:00
Alejandro Alonso a11c2af542 Playing with image export and svg generation 2024-10-10 14:23:32 +02:00
Alejandro Alonso 6d5b0204e9 Playing with image export and svg generation 2024-10-10 14:12:38 +02:00
Alejandro Alonso dfe5d861f2 Playing with image export and svg generation 2024-10-10 14:06:16 +02:00
Alejandro Alonso 445691430b Refactoring texts 2024-10-10 09:36:56 +02:00
Alejandro Alonso 88722bcf4f Refactoring texts 2024-10-10 09:35:50 +02:00
Alejandro Alonso 43903014c6 Path test 2024-10-10 09:09:53 +02:00
AzazelN28 cf8b62f1a8 wip: renderer redone completely 2024-10-09 15:18:36 +02:00
Alejandro Alonso 39b627cb1a Rendering some texts 2024-10-09 13:28:19 +02:00
AzazelN28 81680cffe9 wip: draw rect 2024-10-08 15:49:11 +02:00
Alejandro Alonso dc014bd4eb Draw colors from memory too 2024-10-08 13:22:11 +02:00
Alejandro Alonso 0027e77861 Draw shapes from memory 2024-10-08 11:32:25 +02:00
Belén Albeza fa9004d12c Pass struct to wasm (rust) 2024-10-04 12:50:16 +02:00
AzazelN28 c7f801dd44 wip: add build script for rust module 2024-10-03 16:05:08 +02:00
Alejandro Alonso 0f0b23e38b WIP: improve flush 2024-10-03 11:45:29 +02:00
Alejandro Alonso 1f8fe2dc4c WIP: basic color support 2024-10-03 08:00:32 +02:00
Belén Albeza e84622061d Fix wrong order for args for draw_react (rust) 2024-10-02 17:04:29 +02:00
Belén Albeza 305de33200 fix zoom drawing glitch (rust) 2024-10-02 16:10:56 +02:00
Belén Albeza 80bbfe7a6f draw shapes with zoom (rust) 2024-10-02 15:40:38 +02:00
Belén Albeza 26ab39a45d re-render canvas when panning (rust) 2024-10-02 15:25:01 +02:00
Belén Albeza 739b8d7c02 fix vbox being nil when calling translate 2024-10-02 14:50:38 +02:00
Belén Albeza e0a9f63015 add gitignore for rust project 2024-10-02 14:49:35 +02:00
Alejandro Alonso 928709a0f2 WIP: exposing translate 2024-10-02 14:16:51 +02:00
Alejandro Alonso 579b157ab7 WIP: exposing translate 2024-10-02 14:11:19 +02:00
Alejandro Alonso 0bf442e626 WIP Fix typo render-v2 2024-10-02 12:38:07 +02:00
Alejandro Alonso 2184af6602 WIP refactor rerender render-v2 2024-10-02 12:35:05 +02:00
AzazelN28 78fb938d16 wip: fix wrong namespace 2024-10-02 12:06:19 +02:00
Alejandro Alonso dd9185e058 WIP refactor rerender render-v2 2024-10-02 12:01:49 +02:00
Alejandro Alonso 5f8d56b366 WIP: proper initialization 2024-10-02 11:17:36 +02:00
AzazelN28 bc0fde68c7 wip: add common namespace and fix cpp errors 2024-10-02 10:53:34 +02:00
AzazelN28 024a2ae848 wip: fix build script 2024-10-02 10:06:33 +02:00
AzazelN28 4d56bf66f4 wip: fix README and build script 2024-10-02 09:46:11 +02:00
Belén Albeza c83ef201a1 wip: target emscripten for rust poc 2024-10-02 07:43:07 +02:00
AzazelN28 6d26abb9e3 wip: fix wrong call to renderer instead of renderer-cpp 2024-10-01 15:59:35 +02:00
AzazelN28 1b1f08388f wip: fix renderer-cpp config flag 2024-10-01 15:44:00 +02:00
AzazelN28 472c769c9a wip: c++ initial version 2024-10-01 15:35:41 +02:00
Alejandro Alonso 864088eecd Merge remote-tracking branch 'origin/staging' into develop 2024-09-30 09:38:11 +02:00
Pablo Alba 0b39318b33 🐛 Fix request dialog is shown in all errors 2024-09-30 09:36:41 +02:00
Alejandro d5a9961ec8 Merge pull request #5124 from penpot/eva-move-tab-switcher
♻️  Move tab-switcher to its own folder inside DS
2024-09-30 09:29:15 +02:00
Alejandro 7dac7de365 Merge pull request #5123 from penpot/palba-change-emails-footer
 Update emails footer
2024-09-30 07:11:27 +02:00
Alejandro dd0721e91e Merge pull request #5126 from penpot/palba-fix-show-request-on-all-errors
🐛 Fix request dialog is shown in all errors
2024-09-30 06:19:58 +02:00
Pablo Alba 21fde2e991 🐛 Fix request dialog is shown in all errors 2024-09-27 10:38:24 +02:00
Eva Marco ca1893164d Add the undefied option to props schema enums 2024-09-26 17:39:52 +02:00
Eva Marco b619ac3e08 ♻️ Move tab-switcher to its own folder inside DS 2024-09-26 17:39:45 +02:00
Belén Albeza d7eb86c86d Merge pull request #5095 from penpot/eva-update-ds-components
♻️ Update colors and icons
2024-09-26 12:00:45 +02:00
Pablo Alba 6c4f216da8 Update emails footer 2024-09-26 09:45:42 +02:00
Alejandro Alonso f786a00e89 Merge remote-tracking branch 'origin/staging' into develop 2024-09-25 11:35:41 +02:00
Alejandro 47cecb2ac4 Merge pull request #5119 from penpot/eva-add-props
  Add shema prop
2024-09-25 11:31:57 +02:00
Eva Marco 5d6ceec803 Add shema prop 2024-09-25 11:07:40 +02:00
Alejandro Alonso bec11220e3 🐛 Fix storage typo 2024-09-25 10:41:55 +02:00
Alejandro Alonso 9b802e1c7d Merge remote-tracking branch 'origin/staging' into develop 2024-09-24 14:27:20 +02:00
Alejandro 16cf16c422 Merge pull request #5114 from penpot/superalex-fix-fetch-profile-exception
🐛 Fix fetch profile exception
2024-09-24 14:24:56 +02:00
Alejandro Alonso 4e1eee197e 🐛 Fix fetch profile exception 2024-09-24 14:13:46 +02:00
Alejandro 91c8af9e38 Merge pull request #5108 from penpot/palba-fix-login-redirect
🐛 Fix bad redirect on new oops page with penpot login
2024-09-24 11:27:04 +02:00
Pablo Alba 58593a9428 🐛 Fix bad redirect on new oops page with penpot login 2024-09-24 10:32:57 +02:00
Alejandro Alonso 21aa8b0703 Merge remote-tracking branch 'origin/staging' into develop 2024-09-24 09:42:56 +02:00
Eva Marco 17cf57f7ca Merge pull request #5113 from penpot/superalex-fix-show-in-assets-panel
🐛 Fix show in assets panel
2024-09-24 09:38:32 +02:00
Alejandro Alonso f7cfe36f37 🐛 Fix show in assets panel 2024-09-24 08:49:52 +02:00
Alejandro c26f909565 Merge pull request #5110 from penpot/eva-fix-code-block-height
🐛 Fix code block height
2024-09-24 06:54:44 +02:00
Eva Marco 6db7fe5f7b 🐛 Fix code block height 2024-09-23 17:03:25 +02:00
Pablo Alba a207114d95 Merge pull request #5109 from penpot/hiru-fix-swap-inside-group
🐛 Fix error when swapping a copy that is the only child of a group
2024-09-23 15:12:55 +02:00
Eva Marco b8299a5ea5 🐛 Fix create team without invitations on onboarding 2024-09-23 15:09:43 +02:00
Andrés Moya 1fa461e996 🐛 Fix error when swapping a copy that is the only child of a group 2024-09-23 15:01:01 +02:00
Alejandro 2e3745099b Merge pull request #5107 from penpot/alotor-remove-export-option
🐛 Removed "merge assets" option from export
2024-09-23 13:22:56 +02:00
Pablo Alba 03ebeb0657 🐛 Fix session storage entry name 2024-09-23 12:15:49 +02:00
alonso.torres 6892cffe54 🐛 Removed "merge assets" option from export 2024-09-23 12:13:33 +02:00
Alejandro 19a613e90c Merge pull request #5105 from penpot/superalex-merge-conflicts-2
Merge conflicts
2024-09-23 10:57:33 +02:00
Alejandro Alonso 7fe95f218b 🐛 Fix logged in redirect 2024-09-23 10:36:59 +02:00
Alejandro Alonso a1fc785771 Merge remote-tracking branch 'origin/staging' into superalex-merge-conflicts-2 2024-09-23 10:08:06 +02:00
Alejandro Alonso e0034dc205 🐛 Fix onboarding edn urls 2024-09-23 06:30:19 +02:00
Alejandro bd9eab08b7 Merge pull request #5101 from penpot/palba-migrate-templates-v2
 Update templates links to binary v2
2024-09-23 06:12:15 +02:00
Pablo Alba b5121657ee Update templates links to binary v2 2024-09-18 16:23:12 +02:00
Andrey Antukh 4f04dbc294 🐛 Fix frame flows issues related to the refactor 2024-09-18 12:15:12 +02:00
alonso.torres 2b2a84da64 🐛 Fix problem with frame guides 2024-09-18 12:15:12 +02:00
Andrey Antukh 21dd9a260c 📎 Rename common files changes test namespace 2024-09-18 12:15:12 +02:00
Andrey Antukh 7b9b5bafc1 🔥 Remove duplicated test 2024-09-18 12:15:12 +02:00
Andrey Antukh 41ebba6ce0 Add generative tests for flows and saved-grids 2024-09-18 12:15:12 +02:00
Andrey Antukh 61446592b3 Move generative test related code to a separated ns 2024-09-18 12:15:12 +02:00
Andrey Antukh b82c6326cf Add better error reporting on changes validation 2024-09-18 12:15:12 +02:00
Andrey Antukh a2f466810b ♻️ Add minor refactor on set-plugin-data change 2024-09-18 12:15:12 +02:00
Andrey Antukh 1bd1782d66 ♻️ Add better reporting for generative tests 2024-09-18 12:15:12 +02:00
Andrey Antukh ea6a1c05fa 🐛 Fix incorrect assignation of plugin data on page data structure 2024-09-18 12:15:12 +02:00
Andrey Antukh 4f84e77b10 Add generative tests for set-guide change 2024-09-18 12:15:12 +02:00
Andrey Antukh fa75a3539f 📎 Rename shape decode encode test file 2024-09-18 12:15:12 +02:00
Andrey Antukh fa12d9785a Add tests for basic obj crud change operations
Restored and adapted from already existing commented code
2024-09-18 12:15:12 +02:00
Andrey Antukh c578e31ae2 📎 Update some docstrings on common/schema ns 2024-09-18 12:15:12 +02:00
Andrey Antukh 749c369080 Add less verbose shape validation 2024-09-18 12:15:12 +02:00
Andrey Antukh 4ad4057878 ♻️ Refactor page options data structure 2024-09-18 12:15:12 +02:00
Andrey Antukh 2dea0b52ed Merge pull request #5077 from penpot/ladybenko-8638-docker-rust
Set up devenv for Rust
2024-09-17 17:30:38 +02:00
Aitor Moreno ca257d1caf Merge pull request #5097 from penpot/eva-fix-arrow-keys-tabs
🐛  Fix arrow key movement on tabs
2024-09-17 17:23:32 +02:00
Aitor Moreno e164692391 Merge pull request #5098 from penpot/eva-fix-desing-panel
🐛  Fix path side panel options
2024-09-17 17:22:21 +02:00
Eva Marco b58edea544 🐛 Fix path side panel options 2024-09-17 17:00:40 +02:00
Eva Marco 9a587c91a8 🐛 Fix arrow key movement on tabs 2024-09-17 16:36:44 +02:00
Belén Albeza 7590a7ce4d Merge pull request #5072 from penpot/eva-add-schema-to-ds-components
 Add schema validation to all DS components
2024-09-17 16:22:22 +02:00
Aitor Moreno aae1571a5c Merge pull request #5096 from penpot/alotor-bugfixes
Bugfixes
2024-09-17 16:14:59 +02:00
alonso.torres ebaf30727c 🐛 Fix copy/paste images in Safari 2024-09-17 15:38:18 +02:00
Belén Albeza 884ceb052b Use dynamic import for wasm module 2024-09-17 14:52:27 +02:00
Belén Albeza cc7ed497e8 🎉 Enable conditional use of wasm module 2024-09-17 14:51:55 +02:00
Belén Albeza cd6a739abb 🔧 Add dummy rust project + build scripts with wasm-pack 2024-09-17 14:51:55 +02:00
Belén Albeza f0cecfd517 🔧 Install Rust+Cargo in devenv 2024-09-17 14:51:55 +02:00
alonso.torres f5f255e2d5 🐛 Fix problem with comments max length 2024-09-17 14:18:51 +02:00
Eva Marco 5ffa56be3d ♻️ Update select background color on input 2024-09-17 14:11:50 +02:00
Alejandro e65c0d9f48 Merge pull request #5088 from penpot/niwinz-bugfix-2
🐛 Fix issues related to invalid colors inserted on shape shadow
2024-09-17 13:58:43 +02:00
Eva Marco 076cb0e35b Add schema validation to all DS components 2024-09-17 13:43:35 +02:00
Andrey Antukh 2a90ca6546 Merge pull request #5094 from penpot/alotor-fix-plugins
🐛 Fix small problems in plugins
2024-09-17 12:37:43 +02:00
Eva Marco a26deafa75 ♻️ Update the colors and icon of some toast notification 2024-09-17 12:08:17 +02:00
alonso.torres cf705e352b 🐛 Fix small problems in plugins 2024-09-17 10:19:37 +02:00
Andrey Antukh 86c5ca4213 🐛 Fix incorrect redirect handling on request-access go-home button 2024-09-16 18:53:56 +02:00
Andrey Antukh 179d534237 🐛 Fix several issues related to invalid colors inserted on shadows 2024-09-16 18:32:40 +02:00
Andrey Antukh 162507264c 🐛 Reexecute file migration 26 again for shapes that has transform prop as nil 2024-09-16 18:32:40 +02:00
Andrey Antukh 7e0a8b6227 Merge pull request #5092 from penpot/palbs-fix-request-acces-dont-go-your-team
🐛 Fix request access to the Team don't go to Your Penpot team
2024-09-16 18:32:19 +02:00
Andrey Antukh b50fcee079 Merge pull request #5090 from penpot/alotor-new-apis
Plugins - API's modifications
2024-09-16 18:29:51 +02:00
alonso.torres 9bca42c14a Fixed plugin registration props 2024-09-16 15:46:02 +02:00
Pablo Alba 475d14edf4 🐛 Fix request access to the Team don't go to Your Penpot team 2024-09-16 14:42:52 +02:00
alonso.torres 214733c880 ⬆️ Update plugins runtime 2024-09-16 09:48:56 +02:00
alonso.torres 979828ffe3 🐛 Fix issue when exporting libraries when merging libraries 2024-09-16 09:08:51 +02:00
alonso.torres 65bb795199 🐛 Fix visual problem with stroke cap menu 2024-09-16 09:07:57 +02:00
Alejandro a0546b2e63 Merge pull request #5086 from penpot/niwinz-bugfix-1
🐛 Ignore object thumbnail requests if file is already marked as deleted
2024-09-13 12:30:27 +02:00
alonso.torres d6f6d78b1e New viewport functions 2024-09-13 12:29:07 +02:00
alonso.torres 8c1fba5160 Add api methods to align, distribute and flatten shapes 2024-09-13 12:29:07 +02:00
alonso.torres fb39dd5440 Methods for comments 2024-09-13 12:29:07 +02:00
alonso.torres dd0c5b7806 Add support to guides for plugins 2024-09-13 11:30:59 +02:00
Andrey Antukh 9e94cf7b99 ♻️ Simplify internal implementation of sm/schema namespace 2024-09-13 11:30:55 +02:00
Andrey Antukh b882b9e283 🔥 Remove usage of public usage of sm/define funcion 2024-09-13 11:30:55 +02:00
Andrey Antukh cdcff62232 Store some profile props on browser global storage 2024-09-13 11:30:55 +02:00
Andrey Antukh c8caca77a3 Add storage namespacing
Allows separate global properties from user specific properties
2024-09-13 11:30:55 +02:00
Andrey Antukh f291125377 🐛 Add migration for invalid value on layout-wrap-type on shape prop 2024-09-12 21:33:01 +02:00
Andrey Antukh 0ce981a68c 🐛 Add missing ref-id unsassign on srepl helpers for process file 2024-09-12 21:32:34 +02:00
Andrey Antukh a8814dcaba 🐛 Add missing fields on file-gc libraries fetching sql 2024-09-12 21:07:19 +02:00
Pablo Alba 229eeae6db 🐛 Fix bad redirect on new oops page with social login 2024-09-12 16:35:49 +02:00
Andrey Antukh d03788af93 🐛 Ignore object thumbnail requests if file is already marked as deleted 2024-09-12 15:23:31 +02:00
Alejandro Alonso 017aad6454 🐛 Fix export failed error when exporting multiple shapes 2024-09-12 12:55:32 +02:00
Alejandro Alonso 042b3a71d8 Merge remote-tracking branch 'origin/staging' into develop 2024-09-11 12:46:04 +02:00
Alejandro Alonso 767ec37b83 Merge remote-tracking branch 'origin/main' into staging 2024-09-11 12:45:39 +02:00
Alejandro Alonso 89f64e0c49 🐛 Fix challenge redirect with parameters 2024-09-11 12:30:12 +02:00
Alejandro Alonso eadae5e2cd Merge remote-tracking branch 'origin/staging' into develop 2024-09-11 12:05:45 +02:00
Alejandro Alonso d108ad904e Merge remote-tracking branch 'origin/main' into staging 2024-09-11 12:05:21 +02:00
Alejandro Alonso 6564736d3e 🐛 Fix challenge redirect with parameters 2024-09-11 12:03:32 +02:00
Alejandro Alonso 7f9c4df284 Merge remote-tracking branch 'origin/staging' into develop 2024-09-11 11:34:35 +02:00
Alejandro Alonso d01cd70c6b Merge remote-tracking branch 'origin/main' into staging 2024-09-11 11:34:04 +02:00
Alejandro ea7768117c Merge pull request #5082 from penpot/superalex-fix-challenge-redirect-with-parameters
🐛 Fix challenge redirect with parameters
2024-09-11 11:33:45 +02:00
Alejandro Alonso 5bfb39cdf6 🐛 Fix challenge redirect with parameters 2024-09-11 11:23:19 +02:00
Pablo Alba 29f1c2bdad Merge pull request #5080 from penpot/niwinz-oidc-fix-limits-issues
🐛 Fix oidc auth internal limits issue
2024-09-10 16:41:44 +02:00
Andrey Antukh e79f9ba40f 🐛 Increase token limit 2024-09-10 12:39:54 +02:00
Andrey Antukh 452aabdec6 🐛 Don't send user props on auth token after oidc login 2024-09-10 12:39:54 +02:00
Alejandro Alonso 9e3f8e7827 Merge remote-tracking branch 'origin/staging' into develop 2024-09-09 11:09:53 +02:00
Eva Marco 3a4e9ccc5a 👷 Fix CI error 2024-09-09 10:32:50 +02:00
Aitor Moreno 860e32d965 Merge pull request #5070 from penpot/superalex-fix-onboarding
🐛 Fix onboarding questions
2024-09-09 10:19:03 +02:00
Andrey Antukh 495f9dfa84 Merge pull request #5064 from penpot/superalex-release-notes-2.2
 Release notes for 2.2
2024-09-09 09:54:50 +02:00
Alejandro 133ca33cb5 Merge pull request #5076 from penpot/niwinz-exporter-config-parse
🐛 Fix issues on parsing configuration on exporter
2024-09-09 09:54:12 +02:00
Andrey Antukh 1c69a9fd8a 🐛 Fix config parsing on exporter 2024-09-09 09:47:55 +02:00
Andrey Antukh 15faa57e01 🐛 Fix decoding on sm/set schema 2024-09-09 09:46:50 +02:00
Alejandro f5510234cf Merge pull request #5066 from penpot/eva-fix-frame-row-menu
🐛 Fix guides submenu visualization
2024-09-09 06:49:05 +02:00
Belén Albeza eb720b053a Merge pull request #5057 from penpot/eva-fix-css-compilation
🔧 Rearrange css files for compilation
2024-09-06 14:45:52 +02:00
Alejandro Alonso efc61241a0 Merge remote-tracking branch 'origin/staging' into develop 2024-09-06 13:50:37 +02:00
Alejandro Alonso 5b0331611d Merge remote-tracking branch 'origin/main' into staging 2024-09-06 13:50:09 +02:00
Alejandro f8f1c58f61 Merge pull request #5069 from penpot/niwinz-storybook-build-fix
🐛 Fix storybook build related to commonjs to esm module conversion issue
2024-09-06 13:43:04 +02:00
Andrey Antukh 3f34aa92fa Add support for optional human challenge 2024-09-06 13:39:53 +02:00
Alejandro Alonso c99102e49b 🐛 Fix onboarding questions 2024-09-06 13:18:39 +02:00
Andrey Antukh d583661e58 🐛 Fix storybook build related to commonjs to esm module conversion issue 2024-09-06 12:31:48 +02:00
Andrey Antukh cfad1d178f Merge pull request #5068 from penpot/alotor-plugins-install-profile
 Change installation data to profile
2024-09-06 12:05:52 +02:00
Andrey Antukh ffa326e08f Merge pull request #5067 from penpot/alotor-fix-validation
🐛 Fix problem when dismissing shared library update
2024-09-06 11:31:22 +02:00
alonso.torres c24b2dadec Change installation data to profile 2024-09-06 11:10:32 +02:00
alonso.torres 03040ed40b 🐛 Fix problem when dismissing shared library update 2024-09-06 11:02:02 +02:00
Alejandro Alonso 5e89cd1cb3 Release notes for 2.2 2024-09-06 10:49:20 +02:00
Eva Marco bf202473e9 🐛 Fix guides submenu visualization 2024-09-06 09:47:09 +02:00
Andrey Antukh 9a3b5337d7 Merge pull request #5062 from penpot/alotor-plugins-fix-interactions
🐛 Fix plugins add interaction
2024-09-05 16:22:46 +02:00
alonso.torres 396cbb27b2 🐛 Fix plugins add interaction 2024-09-05 16:00:04 +02:00
Alejandro b4e6f8bc73 Merge pull request #5061 from penpot/niwinz-challenge
 Add support for optional human challenge
2024-09-05 15:49:50 +02:00
Andrey Antukh d88f28f5c2 Add support for optional human challenge 2024-09-05 15:35:39 +02:00
Andrey Antukh 886c0c596f Merge pull request #5060 from penpot/alotor-bugfixes
Bugfixes
2024-09-05 15:32:44 +02:00
alonso.torres b15b394c65 🐛 Fix problem when creating a component instance from grid layout 2024-09-05 15:11:04 +02:00
Eva Marco e36cf1d963 🐛 Fix onboarding slide after rearrange 2024-09-05 14:46:49 +02:00
alonso.torres caf78a6b4d 🐛 Fix layer panel overflowing 2024-09-05 11:50:16 +02:00
alonso.torres 6a161267ba 🐛 Fix problem with overlay positions in viewer 2024-09-05 10:48:00 +02:00
Eva Marco a0bb5e5ef3 ♻️ Remove unnecesary code 2024-09-05 09:41:11 +02:00
Eva Marco 34cc211912 🔧 Rearrange css files for compilation 2024-09-05 09:39:43 +02:00
Eva Marco e95713c1df 🐛 Fix visual integration test 2024-09-05 09:39:43 +02:00
Alejandro Alonso e189dc965d Merge remote-tracking branch 'origin/staging' into develop 2024-09-05 09:37:16 +02:00
alonso.torres a180c33a32 🐛 Fix problem with SVG import 2024-09-05 09:26:22 +02:00
Alejandro ea8febdb7d Merge pull request #5056 from penpot/niwinz-refactor-recent-colors
♻️ Refactor recent colors and local storage abstraction
2024-09-05 09:07:26 +02:00
Alejandro f765cc8dbc Merge pull request #5011 from penpot/palba-testab-start-workspace
A/B test start directly at the workspace
2024-09-05 07:05:57 +02:00
Pablo Alba 81b7972347 🎉 Test A/B for start in workspace 2024-09-04 17:19:39 +02:00
Andrey Antukh 1281670c61 Clear storage on user logout 2024-09-04 16:20:00 +02:00
Andrey Antukh b8c6103858 Add performance enhancements for util/storage abstraction layer 2024-09-04 16:20:00 +02:00
Andrey Antukh b2c0bed84c Add efficiency improvements to use-resize-hook 2024-09-04 16:20:00 +02:00
Andrey Antukh 9619fcbc1f Make efficiency improvements to use-shared-state hook 2024-09-04 16:20:00 +02:00
Andrey Antukh e9c55e9eb4 Make recent colors to be stored locally instead of on file 2024-09-04 16:20:00 +02:00
Belén Albeza 53f580ad40 Merge pull request #5017 from penpot/eva-add-select-to-ds
 Add select component to the DS
2024-09-04 15:51:10 +02:00
Andrey Antukh cf0045681e Merge pull request #5054 from penpot/alotor-plugins-fixes
Update API types
2024-09-04 14:16:01 +02:00
Andrey Antukh 488d034a58 Merge pull request #5055 from penpot/eva-fix-webhook-checkbox
🐛  Fix webhook checkbox position
2024-09-04 14:15:37 +02:00
alonso.torres 762a883b39 🐛 Fix problem with font weight and style 2024-09-04 13:52:48 +02:00
alonso.torres a63ded1ba1 Change type names in plugins 2024-09-04 13:29:56 +02:00
Eva Marco 8d66275187 🐛 Fix webhook checkbox position 2024-09-04 12:51:30 +02:00
alonso.torres f812b28892 ⬆️ Update plugin dependencies 2024-09-04 12:38:50 +02:00
Alejandro 59063e861c Merge pull request #5053 from penpot/niwinz-update-file-refactor
♻️ Refactor file-update for make it more reusable
2024-09-04 12:30:36 +02:00
Andrey Antukh 873c9b1903 Merge pull request #5050 from penpot/hiru-ordered-maps
🔧 Add serializable ordered collections
2024-09-04 12:26:21 +02:00
Andrey Antukh 9da891e9b0 📎 Enable auto-file-snapshot feature scripts/repl 2024-09-04 12:18:31 +02:00
Andrey Antukh a6de12323e ♻️ Refactor file-update for make it more reusable 2024-09-04 12:18:31 +02:00
Alejandro Alonso edeb16bc26 Merge remote-tracking branch 'origin/staging' into develop 2024-09-04 12:02:31 +02:00
Alejandro Alonso 52d099c80e Merge remote-tracking branch 'origin/main' into staging 2024-09-04 12:02:04 +02:00
Alejandro b2010e5fd8 Merge pull request #5052 from penpot/niwinz-bugfix-srepl-helpers
🐛 Fix issues with srepl helper for profile deletion in bulk
2024-09-04 12:01:55 +02:00
Alejandro 5808bd3743 Merge pull request #5045 from penpot/niwinz-fix-file-gc
🐛 Fix issues on file-gc task
2024-09-04 11:11:13 +02:00
Andrey Antukh d5f5c440dd 🐛 Fix issues with srepl helper for profile deletion in bulk 2024-09-04 11:09:05 +02:00
Alejandro Alonso 90d947391a Merge remote-tracking branch 'origin/staging' into develop 2024-09-04 08:59:05 +02:00
Alejandro Alonso 729f679c0f Merge remote-tracking branch 'origin/main' into staging 2024-09-04 08:58:51 +02:00
Alejandro 9f52709a42 Merge pull request #5047 from penpot/niwinz-hotfix-webhooks
🐛 Fix incorrect params handling on webhook processing task
2024-09-04 08:57:53 +02:00
Andrés Moya 47cc80a93f 🔧 Add serializable ordered collections 2024-09-03 23:35:53 +02:00
Andrey Antukh 85444f5a47 🐛 Fix incorrect params handling on webhook processing task 2024-09-03 17:19:35 +02:00
Andrey Antukh 50df2279a7 🐛 Make the media cleaning on file-gc task aware of snapshots
It now takes in account the snapshots, and prevents
deletion of media files used in snapshots.
2024-09-03 14:50:17 +02:00
Andrey Antukh 71ba0242c7 🐛 Add missing type decoding on changes schema 2024-09-03 14:42:00 +02:00
Andrey Antukh 1f8cfde1cf Merge pull request #5046 from penpot/alotor-plugins-fixes
Plugins small fixes
2024-09-03 14:36:59 +02:00
Alejandro Alonso 5f2ec595cb 📎 Update changelog 2024-09-03 13:15:48 +02:00
alonso.torres 37a6446e32 🐛 Fix problem with font style 2024-09-03 13:10:28 +02:00
alonso.torres be84b1cb01 🐛 Change place for circular dependency workaround 2024-09-03 13:10:28 +02:00
Alejandro Alonso 9fb91b3052 Merge remote-tracking branch 'origin/staging' into develop 2024-09-03 13:06:40 +02:00
Alejandro Alonso 689aab32c9 📎 Update changelog 2024-09-03 13:04:04 +02:00
Alejandro Alonso c642f4afa2 📎 Update version.txt file 2024-09-03 12:52:36 +02:00
Alejandro a62a083294 Merge pull request #5038 from penpot/palba-add-export-event
🎉 Add export event for telemetry
2024-09-03 12:51:06 +02:00
Pablo Alba 2a13c2ec00 🎉 Add export event for telemetry 2024-09-03 12:03:36 +02:00
Eva Marco f3525b9ff2 Merge pull request #5044 from penpot/ladybenko-update-changes-ds
📚 Update changelog with the latest DS features
2024-09-03 10:53:00 +02:00
Belén Albeza d2509f4b97 📚 Update changelog with the latest DS features 2024-09-03 10:38:40 +02:00
Andrey Antukh 6d8c424710 📎 Fix linter issues on ui.auth ns 2024-09-03 10:38:10 +02:00
Andrey Antukh 93e8657f73 Merge remote-tracking branch 'origin/staging' into develop 2024-09-03 08:02:57 +02:00
Alejandro Alonso 91f6c001c0 📚 Update changelog 2024-09-03 06:47:53 +02:00
Andrey Antukh 0dd8300a80 Merge pull request #5037 from penpot/ladybenko-8615-ds-translations
Enable translations for the DS / Storybook
2024-09-02 19:45:09 +02:00
Eva Marco 298db46722 Add documentation to select on storybook 2024-09-02 16:56:53 +02:00
Alejandro c2b97b13a1 Merge pull request #5042 from penpot/niwinz-update-changelog
📚 Update changelog
2024-09-02 15:22:27 +02:00
Belén Albeza 8feb5dabb0 Use translations in a DS component story 2024-09-02 14:51:41 +02:00
Belén Albeza 8aaa04b1f8 Add English translations to storybook template 2024-09-02 14:51:41 +02:00
Andrey Antukh a28117b301 📚 Add missing backend enhancements on the changelog 2024-09-02 13:21:02 +02:00
Andrey Antukh 0117a4767d 📎 Rename file-snapshot to auto-file-snapshot 2024-09-02 11:52:19 +02:00
Eva Marco 0c6b0598fa Add new select ds component to storybook 2024-08-29 14:14:12 +02:00
Eva Marco f2a2d772b0 Add new select component to the ds 2024-08-29 14:14:08 +02:00
Andrey Antukh bf60bf1848 Merge pull request #5033 from penpot/superalex-revert-test-default-theme
Revert "🎉 Test A/B for starting with light theme"
2024-08-29 11:42:04 +02:00
Andrey Antukh c581395df2 Merge pull request #5034 from penpot/superalex-track-copy-shared-link-event
 Track copy shared link event
2024-08-29 10:26:34 +02:00
Alejandro Alonso 8a44fb689a 🐛 Fix create share link name 2024-08-29 10:25:08 +02:00
Alejandro Alonso 9fd36526ef Track copy shared link event 2024-08-29 10:25:08 +02:00
Alejandro Alonso 78f4d9cc5d 🎉 Revert test A/B for starting with light theme
This reverts commit b0af94415f.
2024-08-28 13:00:43 +02:00
Alejandro bd2a3e197a Merge pull request #5032 from penpot/niwinz-backports-1
🐛 Backport several bugfixes from develop
2024-08-28 12:49:16 +02:00
Alejandro d703205921 Merge pull request #5028 from penpot/niwinz-path-changes
🐛 Add missing safechecks and schema validations
2024-08-28 12:41:18 +02:00
Alejandro 1e73bec2b9 Merge pull request #5031 from penpot/niwinz-fire-version-txt
🔥 Remove the usage of version.txt
2024-08-28 12:30:57 +02:00
Andrey Antukh 1abbeb0273 Merge pull request #5015 from penpot/yamila-moreno-patch-1
Update manage.sh
2024-08-28 11:15:07 +02:00
Andrey Antukh d25424d325 🔥 Remove the usage of version.txt 2024-08-28 11:14:28 +02:00
Andrey Antukh cc98ac5853 🐛 Fix json encoding on zip encoding decoding 2024-08-28 10:43:47 +02:00
Andrey Antukh 05750c3b38 🐛 Add schema validation for color changes 2024-08-28 10:43:47 +02:00
Andrey Antukh 3ddecef5a7 Ensure plain map on path params in several functions 2024-08-28 10:31:22 +02:00
Andrey Antukh 7fd96a0533 🎉 Backport app.common.json namespace from develop 2024-08-28 10:30:11 +02:00
Andrey Antukh 19d6f4381a Merge pull request #5023 from penpot/eva-add-tooltips-to-typography
🐛 Add missing tooltips to typography options
2024-08-27 17:54:41 +02:00
Andrey Antukh 25e9129a8e 🔥 Remove unused and deprecated helpers from app.util.object ns 2024-08-27 16:44:14 +02:00
Andrey Antukh 569674452a Add label and id support for debug snapshot helpers 2024-08-27 15:43:31 +02:00
Andrey Antukh 2643dae0a7 🐛 Fix json encoding on zip encoding decoding 2024-08-27 15:43:31 +02:00
Andrey Antukh 1f53e48032 🐛 Add schema validation for color changes 2024-08-27 10:48:38 +02:00
Andrey Antukh ef3a47b492 Add efficiency changes to get-segments helper 2024-08-27 10:48:38 +02:00
Andrey Antukh f302c724c4 Add efficiency changes on make-curve-point helper 2024-08-27 10:48:37 +02:00
Andrey Antukh 4ce654511b Ensure plain map on path params in several functions 2024-08-27 10:48:37 +02:00
Andrey Antukh 2f68310a7c 📎 Add some fixmes for future path changes 2024-08-27 10:48:37 +02:00
Alejandro 67cd855e97 Merge pull request #5027 from penpot/niwinz-backend-improvements
 Add efficiency improvements to xlog task
2024-08-27 09:59:59 +02:00
Andrey Antukh ceaafdbb1c Add offload mechanism for file snapshots 2024-08-26 13:52:42 +02:00
Andrey Antukh 8dea5d5158 ♻️ Make file-xlog-gc task more scalable 2024-08-26 11:15:59 +02:00
Alejandro 7ea5c79393 Merge pull request #5019 from penpot/niwinz-static-error-duplication
 Add improvements on how UI (React) errors are handled
2024-08-26 09:26:28 +02:00
Andrey Antukh 215148ca81 Add better fillfactor setting for storage_object and task tables 2024-08-23 15:09:58 +02:00
Eva Marco 897960194e 🐛 Add missing tooltips to typography options 2024-08-23 13:42:33 +02:00
Alejandro 5d97f4b924 Merge pull request #5020 from penpot/eva-fix-color-picker
🐛  Fix color picker
2024-08-23 12:37:25 +02:00
Alejandro e7b663749a Merge pull request #5021 from penpot/eva-fix-design-tab-layout
🐛 Fix design tab layout after new tab component added
2024-08-23 12:25:38 +02:00
Eva Marco aa5999b2e0 🐛 Fix design tab layout after new tab component added 2024-08-23 11:59:23 +02:00
Alejandro 736d75a93c Merge pull request #5009 from penpot/niwinz-json-decoder-2
🎉 Add `:assign` operation as alternative to `:set`
2024-08-23 11:53:07 +02:00
Eva Marco c81a17ada5 🐛 Fix color picker 2024-08-23 11:52:05 +02:00
Andrey Antukh 401a28f317 ⬆️ Update rumext to v2.14
Adds some improvements on compiler
2024-08-23 11:21:54 +02:00
Andrey Antukh f16caa2b98 💄 Add cosmetic changes on sidebar/options ns 2024-08-23 11:21:54 +02:00
Andrey Antukh 868af29d14 💄 Add some cosmetic changes to sidebar ns 2024-08-23 11:21:54 +02:00
Andrey Antukh a091c9c910 ♻️ Refactor how UI error reporting is handled 2024-08-23 11:21:54 +02:00
Anonymous 1d1d4d9371 🌐 Add translations for: Serbian.
Currently translated at 96.0% (1395 of 1453 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/sr/
2024-08-23 11:16:13 +02:00
Anonymous d578659b21 🌐 Add translations for: Dutch.
Currently translated at 96.2% (1399 of 1453 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2024-08-23 11:16:13 +02:00
Anonymous 2be9cebb0e 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 96.2% (1399 of 1453 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2024-08-23 11:16:13 +02:00
Anonymous 982b900066 🌐 Add translations for: Hebrew.
Currently translated at 96.2% (1399 of 1453 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2024-08-23 11:16:12 +02:00
Anonymous 4c1bc7c3c1 🌐 Add translations for: German.
Currently translated at 96.2% (1399 of 1453 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2024-08-23 11:16:12 +02:00
Anonymous fb09959459 🌐 Add translations for: Turkish.
Currently translated at 96.2% (1399 of 1453 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2024-08-23 11:16:12 +02:00
Anonymous 5601ed7071 🌐 Add translations for: Russian.
Currently translated at 96.1% (1397 of 1453 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2024-08-23 11:16:12 +02:00
Anonymous 5ab282c344 🌐 Add translations for: French.
Currently translated at 96.2% (1398 of 1453 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2024-08-23 11:16:12 +02:00
Anonymous 5eb4b28834 🌐 Add translations for: Spanish.
Currently translated at 99.1% (1440 of 1453 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es/
2024-08-23 11:16:11 +02:00
Andrey Antukh 4cdea36b7c 📎 Rehash & sort all translations 2024-08-23 11:09:45 +02:00
Andrey Antukh f2c1d4d83d Merge branch 'translations' into develop 2024-08-23 11:04:10 +02:00
Andrey Antukh 9dd0cd57ce Merge remote-tracking branch 'weblate/develop' into translations 2024-08-23 11:03:39 +02:00
Andrey Antukh 3026bd8aaf Merge remote-tracking branch 'origin/staging' into develop 2024-08-23 10:59:14 +02:00
Andrey Antukh 2ec27de353 🎉 Add :assing operation as altenative to :set 2024-08-23 10:55:10 +02:00
Andrey Antukh f73e5446ab Merge pull request #5016 from penpot/superalex-bug-render-texts-without-position-data
🐛 Fix render of some texts without position data
2024-08-22 15:43:50 +02:00
Alejandro Alonso df255b5a6f 🐛 Fix render of some texts without position data 2024-08-22 15:24:13 +02:00
Andrey Antukh 9a3c953f0f Merge pull request #5014 from penpot/juanfran-update-plugins-runtime
⬆️ Update plugins runtime
2024-08-22 12:47:02 +02:00
Yamila Moreno 02c031a0ef 📎 Delete unnecessary option in manage.sh script
Delete `-x` option as it gives an annoying output when we're not debugging.
2024-08-22 12:45:18 +02:00
Juanfran a5114369ba ⬆️ Update plugins runtime 2024-08-22 12:13:20 +02:00
Andrey Antukh 4765685440 Merge pull request #5010 from penpot/eva-replace-tabs-component
♻️ Replace tabs component
2024-08-22 10:31:22 +02:00
Eva Marco 3f3c3a3df4 🐛 Fix labelled by on tab-panel component 2024-08-21 13:39:16 +02:00
Alejandro baa52d432f Merge pull request #5003 from penpot/niwinz-json-decoder
🎉 Add json encode/decode mechanism for schemas
2024-08-21 12:48:41 +02:00
Andrey Antukh 89562d0231 Add schema validation for tabs 2024-08-21 11:55:12 +02:00
Eva Marco 3df9c88bb7 ♻️ Replace layer tabs component with the new tab switcher component 2024-08-21 11:54:39 +02:00
Andrey Antukh cacee40d11 🎉 Add proper schema encoding/decoding mechanism
this allows almost all api operations to success usin application/json
encoding with the exception of the update-file, which we need to
approach a bit differently;

the reason update-file is different, is because the operations vector
is right now defined without the context of shape type, so we are just
unable to properly parse the value to correct type using the schema
decoding mechanism
2024-08-21 11:27:36 +02:00
Eva Marco 1782837a38 ♻️ Replace colorpicker modal tab component 2024-08-20 14:01:29 +02:00
Alejandro de05521b57 Merge pull request #5001 from penpot/superalex-fix-deleted-fonts
🐛 Fix deleted fonts on file load
2024-08-20 13:13:48 +02:00
Alejandro Alonso c86afca1d0 🐛 Fix deleted fonts on file load 2024-08-20 13:00:18 +02:00
Andrey Antukh 5617ca24b8 Merge pull request #5008 from penpot/superalex-improve-disabled-registry-flows
 Improve disabled registry flows
2024-08-20 10:11:20 +02:00
Eva Marco c0cd980f5f ♻️ Replace libraries modal tab component 2024-08-20 09:55:18 +02:00
Alejandro Alonso cd51f2f652 Improve disabled registry flows 2024-08-20 08:20:46 +02:00
Eva Marco 2f99d17885 ♻️ Replace tab switcher on design tab 2024-08-19 16:26:17 +02:00
Eva Marco 63ffa704f5 ♻️ Replace tab switcher on viewer 2024-08-19 16:26:10 +02:00
Eva Marco 129b7afda9 ♻️ Remove components preview 2024-08-19 16:25:46 +02:00
Pablo Alba 00bb988ecc Merge pull request #5007 from penpot/superalex-a-b-remove-testing-signup-01
 Add a/b remove testing for signup image
2024-08-19 10:49:32 +02:00
Alejandro Alonso 5efc56eb5a Revert " Add a/b testing for signup image"
This reverts commit 5ac6f04857.
2024-08-19 10:22:01 +02:00
Alejandro 0ccae600bc Merge pull request #5000 from penpot/palba-default-light
🎉 Test A/B for starting with light theme
2024-08-19 08:57:10 +02:00
Pablo Alba b0af94415f 🎉 Test A/B for starting with light theme 2024-08-19 08:20:31 +02:00
Црнобог 1c09670e3c 🌐 Add translations for: Serbian.
Currently translated at 98.6% (1389 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/sr/
2024-08-17 13:09:32 +02:00
Andrey Antukh 0db1eed87f Improve word-string schema generator
make it to generate a more readable strings
2024-08-16 14:43:06 +02:00
Andrey Antukh db52d98595 📎 Update user ns on common and backend 2024-08-16 14:43:06 +02:00
Andrey Antukh e46b5b3f57 🎉 Add json module to common 2024-08-16 14:43:06 +02:00
Alejandro d1d3b4353a Merge pull request #4987 from penpot/eva-add-selection-colors-to-ds
  Add selection colors to ds
2024-08-16 07:59:18 +02:00
Црнобог 3c0944ebfc 🌐 Add translations for: Serbian.
Currently translated at 98.5% (1388 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/sr/
2024-08-15 17:09:28 +02:00
Црнобог a2725ed8fe 🌐 Add translations for: Russian.
Currently translated at 99.6% (1403 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2024-08-15 17:09:18 +02:00
Alejandro 84bfef9938 Merge pull request #4920 from penpot/palba-request-access
Oops page and Request access
2024-08-14 15:53:45 +02:00
Pablo Alba 6169f5c2e8 🎉 New oops page with login and request access 2024-08-14 15:32:04 +02:00
Andrey Antukh fc14871d01 Merge pull request #4993 from penpot/eva-fix-fill-menu
🐛 Fix collapsing fill menu
2024-08-14 13:09:03 +02:00
Andrey Antukh bcfa1d4394 Merge pull request #4996 from penpot/eltociear-patch-2
🐛 Update time.cljc
2024-08-14 13:08:40 +02:00
Ikko Eltociear Ashimine 2361b2b63a 🐛 Update time.cljc
prefered -> preferred
2024-08-14 12:58:44 +02:00
Andrey Antukh 380ead2ad6 Merge pull request #4994 from penpot/superalex-make-explicit-test-openldap-devenv-docker-ulimits
 Make explicit test-openldap devenv docker ulimits
2024-08-14 12:57:09 +02:00
Alejandro Alonso 3df45d697d Make explicit test-openldap devenv docker ulimits 2024-08-14 11:07:00 +02:00
Alejandro efb70f0b97 Merge pull request #4985 from penpot/niwinz-hotfix-2
🐛 Disable ipv6 from docker nginx resolver.
2024-08-14 10:50:26 +02:00
Alejandro d9a941cb32 Merge pull request #4992 from penpot/juanfran-invalid-content-path-arguments
🐛 Fix typo in command parsing (paras to params)
2024-08-14 09:40:37 +02:00
Eva Marco f43ca1869b 🐛 Fix collapsing fill menu 2024-08-14 09:24:26 +02:00
Juanfran a34b06cfb4 🐛 Fix typo in command parsing (paras to params)
Signed-off-by: Juanfran <juanfran.ag@gmail.com>
2024-08-14 09:23:23 +02:00
Madalena Melo f5b910d391 🌐 Added translation for: Serbian. 2024-08-14 09:06:16 +02:00
Alejandro 924c1d60f9 Merge pull request #4990 from penpot/niwinz-hotfix-5
🐛 Update storage specs
2024-08-13 12:47:24 +02:00
Andrey Antukh 6b80f19e5f 🐛 Update storage specs 2024-08-13 12:21:16 +02:00
Eva Marco b57e68f4b6 Add selection colors to ds 2024-08-13 12:06:46 +02:00
Alejandro 000d2c3935 Merge pull request #4989 from penpot/niwinz-hotfix-3
🐛 Backport  storage changes from develop
2024-08-13 11:26:49 +02:00
Alejandro d2311f066a Merge pull request #4988 from penpot/niwinz-fix-notifications
🐛 Fix incorrect params for notifications
2024-08-13 11:17:58 +02:00
Andrey Antukh 91435bf372 🐛 Backport storage backend naming changes from develop
for properly handle backward comaptibility when two
versions are running over a single database
2024-08-13 11:14:38 +02:00
Andrey Antukh aa39de4ea8 🐛 Fix incorrect params for notifications 2024-08-13 11:04:26 +02:00
Eva Marco 215f6fc0ab Merge pull request #4973 from penpot/ladybenko-8255-focus-mode
🐛 Fix layer sidebar in focus mode for long names
2024-08-13 10:34:41 +02:00
Alejandro ea5c22c244 Merge pull request #4983 from penpot/niwinz-backports-1
🐛 Backport bugfixes from develop
2024-08-13 08:25:10 +02:00
Belén Albeza fc333ae098 Merge pull request #4941 from penpot/eva-tabs-component-ds
  Add tabs component to DS
2024-08-12 17:46:59 +02:00
Belén Albeza d3e891eec3 Enable focusing on tab-switcher* panel 2024-08-12 17:35:28 +02:00
Eva Marco 66d30e35c7 Add tab switcher component documentation 2024-08-12 17:35:28 +02:00
Eva Marco b8693c3f85 Add tab component to the DS 2024-08-12 17:35:26 +02:00
Eva Marco 4b2742efca Merge pull request #4972 from penpot/ladybenko-7887-toast
Implement `toast*` component
2024-08-12 16:28:57 +02:00
Andrey Antukh e07c1bba7a 🐛 Disable ipv6 from docker nginx resolver 2024-08-12 16:22:19 +02:00
Andrey Antukh ec56a4149b 🐛 Fix unhandled exception on try to reuse registration token 2024-08-12 12:59:18 +02:00
Andrey Antukh 314742a563 Add :params prop to :not-found exception 2024-08-12 12:59:18 +02:00
Andrey Antukh 38c9e3e7cc 🐛 Fix error handling issue on login with oidc
happens when no oidc backend is configured on backend
2024-08-12 12:59:18 +02:00
Andrey Antukh c1435fba95 Merge pull request #4980 from rasom/fix-link-contributing-guide
📚 Fix dead link in contributing guide
2024-08-12 12:25:23 +02:00
Alejandro b13148265e Merge pull request #4982 from penpot/niwinz-bugfix-3
🐛 Bugfixes
2024-08-12 12:12:15 +02:00
Andrey Antukh c0174ab501 🐛 Fix unhandled exception on try to reuse registration token 2024-08-12 11:55:19 +02:00
Andrey Antukh 77c45ed109 Add better error reporting on offload-file-data task 2024-08-12 11:55:19 +02:00
Andrey Antukh 7df68bb8bd Add :params prop to :not-found exception 2024-08-12 11:55:19 +02:00
Andrey Antukh ab461ba560 🐛 Launch offload only if file-gc has processed the file 2024-08-12 11:55:19 +02:00
Alejandro 280252d40e Merge pull request #4958 from penpot/niwinz-fdata-storage-offload
🎉 Add file-data offload mechanism
2024-08-12 10:59:29 +02:00
Alhassan Atama 09b6989491 🌐 Add translations for: Igbo.
Currently translated at 37.1% (523 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ig/
2024-08-11 20:09:13 +00:00
Alhassan Atama f96bbb38b0 🌐 Add translations for: Hausa.
Currently translated at 89.9% (1267 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ha/
2024-08-11 20:09:13 +00:00
Roman Volosovskyi f0e3dc2f0e 📚 Fix dead link in contributing guide 2024-08-11 22:03:41 +02:00
Andrey Antukh d2937a76d9 🐛 Fix error handling issue on login with oidc
happens when no oidc backend is configured on backend
2024-08-09 14:28:18 +02:00
Andrey Antukh 3219c150d4 Add better internal fillfactor setting for file table
Increasing the change for HOT updates on db for this heavy-update
table
2024-08-09 14:28:18 +02:00
Andrey Antukh ba167f256b Add performance enhancements on telemetry related queries 2024-08-09 14:28:18 +02:00
Andrey Antukh 0e92bcc0de 🎉 Add file-data offload mechanism 2024-08-09 14:28:18 +02:00
Andrey Antukh f6bfe3931c Add performance enhacements to storage/gc-touched task 2024-08-09 14:13:33 +02:00
Andrey Antukh 253b9e5bd8 Split file-gc task in two separated tasks
Add a new file-gc-scheduler task for analizing all files for
elegibility and leave file-gc task with the responsability to
performn the GC operation.
2024-08-09 14:13:33 +02:00
Belén Albeza 604f80de20 📚 Add documentation for toast* 2024-08-09 13:07:55 +02:00
Belén Albeza 0aa8f7bfc6 🐛 Fix layer sidebar in focus mode for long names 2024-08-09 12:54:42 +02:00
Dário 4cc2c736e9 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 100.0% (1408 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2024-08-09 04:09:16 +02:00
Belén Albeza 9455b56c07 Implement toast* component 2024-08-08 15:46:57 +02:00
Andrey Antukh d6f528acd2 Merge pull request #4955 from penpot/eva-bugfixing-1
🐛 Fix several bugs
2024-08-08 11:38:18 +02:00
Alejandro Alonso 9344fb958a Merge remote-tracking branch 'origin/staging' into develop 2024-08-08 07:43:10 +02:00
Andrey Antukh 2533d0ebc0 Add naming consistency changes for file_data_fragment table 2024-08-08 07:42:17 +02:00
Alejandro 6ee9025f13 Merge pull request #4971 from penpot/niwinz-fdata-storage-offload-2
 Add naming consistency changes for file_data_fragment table
2024-08-08 07:41:54 +02:00
Alejandro 3a2e868d80 Merge pull request #4915 from penpot/niwinz-mini-refactor-notifications
♻️ Mini refactor of notification components locations
2024-08-08 07:18:13 +02:00
Andrey Antukh 86a732600b Add naming consistency changes for file_data_fragment table 2024-08-07 16:34:39 +02:00
Andrey Antukh 22f3dba842 💄 Update run-store helper 2024-08-07 16:07:59 +02:00
Andrey Antukh bde1cd3f5f 🐛 Fix unexpected exception on frontend test
caused by unexpected return nil on a merge-map
2024-08-07 16:07:59 +02:00
Andrey Antukh f187012469 ♻️ Refactor naming and location of flash notifications 2024-08-07 15:04:52 +02:00
Andrey Antukh a1c78683f5 📎 Update version.txt file 2024-08-07 10:57:51 +02:00
Belén Albeza 3917215952 Merge pull request #4969 from penpot/superalex-fix-storybook-css-path
🐛 Fix storybook css path
2024-08-07 09:31:00 +02:00
Alejandro Alonso 5f0c036ad5 🐛 Fix storybook css path 2024-08-07 06:46:06 +02:00
Andrey Antukh f0342f25ea Merge pull request #4967 from penpot/superalex-fix-missing-env-variable-for-building
🐛 Fix missing storybook env variable for building
2024-08-06 17:32:22 +02:00
Alejandro Alonso f5a8c806d9 🐛 Fix missing storybook env variable for building 2024-08-06 16:34:09 +02:00
Alejandro f8cbe1dfbf Merge pull request #4965 from penpot/niwinz-storybook-fixes
⬆️ Update beicon version to v2.2
2024-08-06 12:52:58 +02:00
Andrey Antukh c6c9e7d179 ⬆️ Update beicon version to v2.2
Fixes the esm build compatibility issues
2024-08-06 12:29:18 +02:00
Alejandro 4fe77ca386 Merge pull request #4963 from penpot/niwinz-oidc-fixes-2
🐛 Fix OIDC issues and regressions
2024-08-06 12:02:02 +02:00
Andrey Antukh ea7ad2aaa0 Add flag oidc-registration for switch on/off registration with oidc 2024-08-06 11:51:26 +02:00
Andrey Antukh 36ac81bb43 Merge pull request #4964 from penpot/superalex-fix-storybook-build
🐛 Fix storybook build
2024-08-06 10:47:54 +02:00
Alejandro Alonso 1515498a23 🐛 Fix storybook build 2024-08-06 10:46:37 +02:00
Andrey Antukh d0059cbe29 Merge pull request #4952 from penpot/ladybenko-8439-storybook-build
Storybook build
2024-08-06 10:25:18 +02:00
Julian Schacher 0162451205 Revert "🐛 Set proper default tenant on exporter"
This reverts commit 86b2ce4dab.
2024-08-06 10:15:21 +02:00
sangpil hwang 34cf6e9e58 🌐 Add translations for: Korean.
Currently translated at 15.8% (223 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ko/
2024-08-05 21:09:25 +02:00
Nima K 05e283baec 🌐 Add translations for: Persian.
Currently translated at 50.0% (705 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2024-08-05 21:09:24 +02:00
Belén Albeza 457da6f23e Append timestamp to CSS import in storybook 2024-08-05 17:39:57 +02:00
Andrey Antukh 0f16f65d30 🔧 Update script names and conditionally build storybook 2024-08-05 17:39:37 +02:00
Andrey Antukh 82ad240053 Merge pull request #4960 from penpot/superalex-fix-custom-smtp-port-with-ssl-enabled
🐛 Fix custom smtp port with ssl enabled
2024-08-05 13:01:17 +02:00
Alejandro Alonso aa21430a5c 🐛 Fix custom smtp port with ssl enabled 2024-08-05 12:45:05 +02:00
Andrey Antukh aa4368f97f Merge pull request #4959 from penpot/superalex-fix-user-language-validator
🐛 Fix user language validator
2024-08-05 12:35:32 +02:00
Alejandro Alonso 8eddcd64f1 🐛 Fix user language validator 2024-08-05 11:05:56 +02:00
Eva Marco 1c2b6f5ab5 Merge pull request #4938 from penpot/ladybenko-7879-ds-input
🎉 Implement input* component
2024-08-05 08:58:53 +02:00
Eva Marco f011d94339 🐛 Fix error on padding input props 2024-08-02 14:14:51 +02:00
Eva Marco d527bbd8b5 🐛 Fix fill collapsed options 2024-08-02 11:12:28 +02:00
Belén Albeza 2015c484d0 📚 Add Input component documentation 2024-08-02 11:08:20 +02:00
Belén Albeza 480d5ba7c3 🎉 Implement input* component 2024-08-02 11:08:20 +02:00
Eva Marco 6b3bfc85b3 🐛 Fix scroll on color picker modal 2024-08-02 09:30:42 +02:00
Belén Albeza 2b2bc73564 🔧 Update build script to include storybook 2024-08-01 16:11:01 +02:00
Belén Albeza 7cdfd5a6d3 Watch css assets specifically for storybook 2024-08-01 15:31:23 +02:00
Belén Albeza 8bcc2a4932 Compile storybook target in release and a separate DS stylesheet 2024-08-01 15:29:02 +02:00
Belén Albeza deef8abca5 🔧 Enable storybook to be served from a subdir 2024-08-01 15:29:02 +02:00
Pablo Alba fcf9444b1d Merge pull request #4948 from penpot/superalex-a-b-testing-signup-01
 Add a/b testing for signup image
2024-08-01 10:28:43 +02:00
Belén Albeza f683d65990 Merge pull request #4949 from penpot/niwinz-update-beicon
⬆️ Update dependencies
2024-07-31 16:54:04 +02:00
Andrey Antukh 93ec352f4a ⬆️ Update shadown-cljs and beicon dependency
Fixes compatibility issues between shadow-cljs :esm build and beicon
library.
2024-07-31 16:30:22 +02:00
Andrey Antukh e0b009c538 ⬆️ Update yarn version to 4.3.1 2024-07-31 16:30:22 +02:00
Alejandro Alonso 5ac6f04857 Add a/b testing for signup image 2024-07-31 13:04:12 +02:00
Andrey Antukh 5c61d874be Merge remote-tracking branch 'origin/develop' into develop 2024-07-31 12:47:05 +02:00
Andrey Antukh 5cf64c1440 Merge remote-tracking branch 'origin/staging' into develop 2024-07-31 12:46:47 +02:00
Alejandro b4d91b5a48 Merge pull request #4937 from penpot/niwinz-fix-email-complains-handling
 Add improvements to internal sns handler
2024-07-31 12:18:01 +02:00
Andrey Antukh 52425a993a 🐛 Check complaints reports in the same way as bounces are checked 2024-07-31 12:02:42 +02:00
Alejandro ed91c7ca32 Merge pull request #4689 from penpot/niwinz-devenv-upgrade
⬆️ Upgrade devenv linux distribution version
2024-07-31 10:46:27 +02:00
Alejandro e72e812166 Merge pull request #4943 from penpot/niwinz-temporal-log
 Add temporal log entry for profile insert conflict
2024-07-31 10:45:48 +02:00
Andrey Antukh fdbec9917c Merge pull request #4946 from june128/fix-stuck-progress-bar
Revert "🐛 Set proper default tenant on exporter"
2024-07-31 10:15:28 +02:00
Pablo Alba 65a00aa13f Merge pull request #4931 from penpot/hiru-fix-touched-detach
🐛 Fix touched groups when detaching with nested copies
2024-07-31 09:46:16 +02:00
Julian Schacher 5ae28da709 Revert "🐛 Set proper default tenant on exporter"
This reverts commit 86b2ce4dab.
2024-07-31 00:32:48 +02:00
Andrey Antukh acc0623219 Add temporal log entry for profile insert conflict 2024-07-30 16:46:38 +02:00
Andrés Moya 990a948bcc 🐛 Fix touched groups when detaching with nested copies 2024-07-30 14:28:37 +02:00
Belén Albeza dba94237dc Merge pull request #4912 from penpot/eva-remove-old-tokens
♻️ Remove unused tokens
2024-07-30 12:03:07 +02:00
Alejandro 802846a838 Merge pull request #4929 from penpot/niwinz-snapshoting-improvements
 Improve file snapshoting mechanism
2024-07-30 08:15:09 +02:00
Andrey Antukh e0f2c4e0aa Add the ability to pass body to a log entry 2024-07-29 16:16:39 +02:00
Andrey Antukh c2aa4f4893 Merge pull request #4936 from n-stha/n-stha-fix-spelling
📎 Correct a spelling in onboarding.edn
2024-07-29 15:23:18 +02:00
n-stha 25c875dc55 📎 Correct a spelling in onboarding.edn 2024-07-29 18:52:40 +05:45
Eva Marco 2c5289d338 ♻️ Remove duplicated color tokens 2024-07-29 11:05:14 +02:00
Alejandro 00c5d58203 Merge pull request #4903 from penpot/palba-bugfixing-010
🐛 Fix Components are not dragged from the group to the assets tab
2024-07-29 10:34:28 +02:00
Andrey Antukh 5cf54c6384 Improve file snapshoting mechanism 2024-07-29 10:19:34 +02:00
Eva Marco 7c75af83b3 Merge pull request #4904 from penpot/eva-substitude-loader-component
♻️  Replacing the old Pencil loader with the new Loader component
2024-07-29 10:08:08 +02:00
Belén Albeza 39b2c1722a ♻️ Refactor loader* component props & usage 2024-07-29 09:20:06 +02:00
Andrey Antukh 40910703ee Merge pull request #4930 from penpot/ladybenko-8413-asset-ids
Assert icon and svg IDs in DS components
2024-07-29 08:45:53 +02:00
Belén Albeza cfc01e03f6 Assert existing icon ID for button* and icon-button* 2024-07-26 14:33:11 +02:00
Belén Albeza 10ef9d696c Assert valid svg id in raw-svg* 2024-07-26 14:24:47 +02:00
Belén Albeza 138ece085e Assert existing icon ID for icon* 2024-07-26 14:24:47 +02:00
alonso.torres 19b2f330dd Merge remote-tracking branch 'origin/plugins-beta-test' into develop 2024-07-26 13:47:12 +02:00
Andrey Antukh e48aa909da Merge pull request #4919 from penpot/ladybenko-7869-ds-buttons
Implement design system buttons
2024-07-26 13:18:21 +02:00
Andrey Antukh b122db447a Merge pull request #4928 from penpot/alotor-plugins-10
Alotor plugins 10
2024-07-26 13:17:16 +02:00
alonso.torres 642c4fc9d1 ⬆️ Update plugins runtime 2024-07-26 12:42:31 +02:00
alonso.torres 4d57f33371 Change local storage access 2024-07-26 12:42:31 +02:00
alonso.torres 60c63e4558 Add undo block api to plugins 2024-07-26 12:42:31 +02:00
alonso.torres aa90232bf9 Add export method into API 2024-07-26 12:42:31 +02:00
Belén Albeza cf7439b1b4 📚 Add buttons documentation for the design system 2024-07-26 11:49:51 +02:00
Belén Albeza 60cba6c9f3 Implement button* and icon-button* for the design system 2024-07-26 11:49:51 +02:00
Andrey Antukh 3eaa997145 Merge remote-tracking branch 'origin/staging' into develop 2024-07-26 08:36:30 +02:00
Alejandro 4b6d3546e0 Merge pull request #4926 from penpot/niwinz-fix-error-report
🐛 Fix regression on error reporting
2024-07-26 08:27:37 +02:00
Alejandro 0bd3d80816 Merge pull request #4925 from penpot/niwinz-resolve-thumbnail-on-frontend
 Resolve file thumbnail on frontend instead of backend
2024-07-26 08:24:29 +02:00
AlexTECPlayz 28cca332e7 🌐 Add translations for: Romanian.
Currently translated at 90.4% (1274 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2024-07-25 19:09:17 +02:00
Andrey Antukh a261a57868 Prevent double error asignation on persistence error 2024-07-25 17:17:49 +02:00
Andrey Antukh af389fe63a 🐛 Fix error reporting regression 2024-07-25 17:17:49 +02:00
Andrey Antukh defcef3e59 Resolve file thumbnail on frontend instead of backend 2024-07-25 15:17:41 +02:00
Andrey Antukh 025034cb71 Merge remote-tracking branch 'origin/staging' into develop 2024-07-25 11:23:42 +02:00
Andrey Antukh 7fd75336a5 Merge pull request #4918 from penpot/alotor-plugins-9
Alotor plugins 9
2024-07-25 11:04:22 +02:00
Andrey Antukh 5ed49995f0 📎 Update changelog 2024-07-25 10:48:46 +02:00
Andrey Antukh 482901f315 Merge pull request #4922 from penpot/niwinz-staging-inet
 Ip Addr parsing and audit log context forwarding fixes
2024-07-24 23:16:27 +02:00
Andrey Antukh cb26f341d5 Merge pull request #4921 from penpot/eva-fix-search-label
🐛  Fix search label in translations
2024-07-24 21:27:58 +02:00
Andrey Antukh 69b432eb0e 📎 Fix audit event type naming on oidc 2024-07-24 21:25:55 +02:00
Andrey Antukh 7df9ac5e4f 🐛 Fix audit context forwarding on explicit events 2024-07-24 21:25:55 +02:00
Andrey Antukh 343f3feed3 Improve ip-addr parsing 2024-07-24 21:07:11 +02:00
Andrey Antukh 08c8c47006 Merge pull request #4917 from penpot/superalex-fix-flag-email-verification
🐛 Fix flag email verification
2024-07-24 21:00:29 +02:00
Alejandro Alonso a6d738f0db 🐛 Fix flag email verification 2024-07-24 20:46:49 +02:00
Eva Marco 1f80827d94 🐛 Fix search label in translations 2024-07-24 17:16:13 +02:00
Eva Marco af5a189d04 ♻️ Replacing the old Pencil loader with the new Loader component 2024-07-24 17:06:13 +02:00
AlexTECPlayz 7ec80a375a 🌐 Add translations for: Romanian.
Currently translated at 90.1% (1269 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2024-07-24 16:09:21 +02:00
alonso.torres 285119b2e5 ⬆️ Update plugins runtime 2024-07-24 13:43:50 +02:00
Alejandro 51611fbc09 Merge pull request #4871 from penpot/palba-fix-collapse-groups
🐛 Fix can't collapse colors and typograhies groups when searching assets
2024-07-24 10:20:42 +02:00
Alejandro c80b35e3ad Merge pull request #4916 from penpot/palba-consolidate-templates-order
 Consolidate templates new order and naming
2024-07-24 09:32:44 +02:00
Pablo Alba 166b8c806c 🐛 Fix can't collapse colors and typograhies groups when searching assets 2024-07-24 09:25:26 +02:00
Pablo Alba 0539337121 🐛 Fix user cannot close comment creation tool 2024-07-24 09:22:53 +02:00
Pablo Alba 50fe715fba 🐛 Fix Components are not dragged from the group to the assets tab 2024-07-24 09:20:54 +02:00
Pablo Alba 81bd30a11b Consolidate templates new order and naming 2024-07-24 09:18:16 +02:00
Eva Marco e5daa00d73 Add elevation tokens to ds 2024-07-24 09:00:03 +02:00
Belén Albeza fd58813ec9 Merge pull request #4908 from penpot/eva-add-zindex-to-ds
 Add z-index tokens to the ds
2024-07-24 08:56:35 +02:00
Andrey Antukh 111add1ed6 🐛 Fix issue on merging stanging to develop 2024-07-24 08:40:31 +02:00
Andrey Antukh a457f8baf5 Merge pull request #4913 from penpot/superalex-fix-files-with-invalid-library-colors
🐛 Fix file with invalid library colors
2024-07-24 08:37:51 +02:00
Eva Marco 12d65c7743 Add z-index tokens to the ds 2024-07-24 08:30:46 +02:00
Andrey Antukh a100d1d11a Merge remote-tracking branch 'origin/staging' into develop 2024-07-24 08:20:36 +02:00
Andrey Antukh 28c4053ad3 Merge pull request #4914 from penpot/bameda-patch-1
📎 Add Contributing to the TOC
2024-07-23 21:16:59 +02:00
David Barragán Merino e84d9358d1 📎 Add Contributing to the TOC 2024-07-23 21:15:39 +02:00
Alejandro 3832377e04 Merge pull request #4902 from penpot/niwinz-notifications-improvements
 Improvements to notifications
2024-07-23 16:57:51 +02:00
Andrey Antukh 975efd80cb Add maintenance predefined notification 2024-07-23 16:56:36 +02:00
alonso.torres 2d25df33ce Add write methods to prototype API 2024-07-23 16:55:32 +02:00
Alejandro Alonso ecb0dc073d 🐛 Fix file with invalid library colors 2024-07-23 16:47:23 +02:00
Andrey Antukh c51778f391 Merge pull request #4910 from penpot/ladybenko-8394-fix-sourcesans
🐛 Fix font declarations for Source Sans
2024-07-23 16:04:36 +02:00
Alejandro 3553b02c55 Merge pull request #4911 from penpot/main-tmp
 Add timestamp to release build hash
2024-07-23 14:49:10 +02:00
Belén Albeza 20333d8179 🐛 Fix font declarations for Source Sans 2024-07-23 14:24:04 +02:00
Andrey Antukh 434209af7d Add timestamp to release build hash 2024-07-23 14:07:46 +02:00
Alejandro 16ae057b4f Merge pull request #4880 from penpot/niwinz-oidc-fixes
 Several improvements to OIDC and other related code
2024-07-23 11:25:46 +02:00
Alejandro 2431cb40bf Merge pull request #4905 from penpot/niwinz-srepl-improvements
 Add proper deletion/restore helpers to srepl/main
2024-07-23 07:35:55 +02:00
Andrey Antukh 34293326b8 Add proper deletion/restore helpers to srepl/main 2024-07-22 15:17:11 +02:00
Andrey Antukh 57c60716f0 Add minor improvements to notifications-hub component 2024-07-22 13:14:58 +02:00
Andrey Antukh 7e50ab52b9 📎 Add minor improvement on notification message validation 2024-07-22 13:14:58 +02:00
Andrey Antukh 9e0fb44b3f 🐛 Remove unnecesary delay on hide notification banner 2024-07-22 13:14:58 +02:00
Andrey Antukh 142ae32256 Add better call signature for srepl/notify! fn helper 2024-07-22 13:14:58 +02:00
alonso.torres 6454e878dd Page functions for plugins api 2024-07-22 13:10:10 +02:00
alonso.torres d13b9ef3ea 🐛 Fix wrap not working in plugins 2024-07-22 11:27:29 +02:00
alonso.torres 26fa2a71ea 🐛 Fix problem with reset alignment on change text 2024-07-22 11:27:12 +02:00
Andrey Antukh 46ed61f070 Merge pull request #4878 from penpot/alotor-plugins-8
Alotor plugins 8
2024-07-22 11:17:03 +02:00
Eva Marco 09cd45fd8b Merge pull request #4876 from penpot/ladybenko-7914-spacing-tokens
 Add spacing tokens to the design system
2024-07-22 08:11:54 +02:00
Eva Marco d162e3e11b Merge pull request #4879 from penpot/ladybenko-8349-storybook-theme
 Enable themes in Storybook
2024-07-22 07:47:46 +02:00
Andrey Antukh 085b933796 Update default buffers and resolver on devenv nginx config 2024-07-12 14:26:21 +02:00
Belén Albeza a5dd2683cd 💄 Remove deprecated StoryWrapper helper component 2024-07-12 14:05:44 +02:00
Belén Albeza ebda46f748 Support theme switching within Storybook 2024-07-12 14:05:44 +02:00
Belén Albeza 0d8c98dcfe ⬆️ Upgrade storybook (patch version) 2024-07-12 14:05:44 +02:00
Belén Albeza 174ca6bed5 Merge pull request #4870 from penpot/eva-add-loader-component-to-ds
  Add loader component to ds
2024-07-12 14:04:10 +02:00
Andrey Antukh 8dfc97d875 Add jwks loading on gitlab oidc provider 2024-07-12 14:03:48 +02:00
Eva Marco 271be57c99 Add loader component to the ds 2024-07-12 13:51:33 +02:00
Andrey Antukh 3b48be808c 💄 Add minor naming change on calling logging on oidc ns 2024-07-12 13:39:32 +02:00
Andrey Antukh a54160965d 🐛 Fix ip-addr parsing issue when it comes with port 2024-07-12 13:38:46 +02:00
Andrey Antukh f4b59cc5a0 Normalize external-session-id parsing from request 2024-07-12 13:38:46 +02:00
Andrey Antukh d52f2b18a5 Add context to OIDC errors 2024-07-12 13:38:46 +02:00
alonso.torres 423d2fbb92 ⬆️ Update plugins runtime 2024-07-12 13:36:00 +02:00
alonso.torres 21b15167dd Add detach method to plugins 2024-07-12 13:36:00 +02:00
alonso.torres 59005e3bb8 Changes to plugin events 2024-07-12 13:36:00 +02:00
alonso.torres 60f637e947 Add parent property to shapes 2024-07-12 13:36:00 +02:00
alonso.torres 8ded4811bb Internal refactor of plugin installs 2024-07-12 13:36:00 +02:00
Eva Marco 3900b37f5c Merge pull request #4874 from penpot/ladybenko-8008-upgrade-storybook8
Upgrade to Storybook 8
2024-07-12 10:07:14 +02:00
TheScientistPT cfb5a98cac 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 99.5% (1402 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2024-07-11 22:09:23 +02:00
Nima K 03ddb32556 🌐 Add translations for: Persian.
Currently translated at 48.7% (686 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2024-07-11 22:09:22 +02:00
Belén Albeza 1398bcbc8c Add spacing tokens to the design system 2024-07-11 18:08:33 +02:00
Belén Albeza 93d9438f6c 📚 Adapts Heading docs/stories to be as the Text component 2024-07-11 17:06:15 +02:00
Belén Albeza 0fce6c5ebb 🐛 Fix broken typography docs after upgrading to v8 2024-07-11 17:01:04 +02:00
Belén Albeza a03eeb63e7 ⬆️ Upgrade to storybook v8 2024-07-11 15:41:24 +02:00
Alejandro Alonso 4dd7880744 Add create-devenv command to manage.sh 2024-07-11 13:24:20 +02:00
Eva Marco 5ab7123566 Merge pull request #4865 from penpot/ladybenko-8347-storybook-controls
Use Storybook controls for stories
2024-07-11 13:06:56 +02:00
Belén Albeza ba4732c526 🐛 Fix text component misbehaving when prop is empty string 2024-07-11 12:56:25 +02:00
Alejandro 73fb95976c Merge pull request #4863 from penpot/niwinz-refactor-backend-config
♻️ Refactor configuration validation
2024-07-11 12:27:59 +02:00
Belén Albeza b473b7905d 🐛 Fix Text docs re: accessibility 2024-07-11 12:24:19 +02:00
Belén Albeza ba36023ae6 Revamp RawSvg stories and update prop name 2024-07-11 10:06:46 +02:00
Alejandro Alonso 48e7cd28b3 Merge remote-tracking branch 'origin/staging' into develop 2024-07-11 09:24:17 +02:00
Alejandro 54711b0d25 Merge pull request #4864 from penpot/niwinz-kondo-fix
🐛 Fix exception on clj-kondo extension hook fn
2024-07-11 09:22:25 +02:00
Eva Marco e916c97491 Merge pull request #4867 from penpot/ladybenko-8348-fix-pencil-loader
🐛 Fix pencil loader in dashboard
2024-07-11 08:56:04 +02:00
Belén Albeza cdabf0d6b9 🐛 Fix pencil loader in dashboard 2024-07-11 08:46:16 +02:00
Belén Albeza 7e61acc4da 💄 Update icon prop name 2024-07-10 16:15:07 +02:00
Belén Albeza d7ca4d49dc Revamp icon stories 2024-07-10 15:53:27 +02:00
Belén Albeza df858c2c7d 📎 Move icon and raw-svg components to a common subdir 2024-07-10 15:42:19 +02:00
Belén Albeza 9d3a282c0a 📎 Move typography-related components to their own folder 2024-07-10 15:33:38 +02:00
Andrey Antukh 9174bb140b ♻️ Refactor configuration validation
Replace spec with schema
2024-07-10 15:16:28 +02:00
Belén Albeza 54da6832f3 Revamp Text stories to display controls + rename tag prop to as 2024-07-10 13:34:09 +02:00
Belén Albeza 508f4fcd3c Revamp Heading stories to display controls 2024-07-10 13:31:56 +02:00
Andrey Antukh eaaff76aad 🐛 Fix exception on clj-kondo extension hook fn
The exception is hidden on normal cli invocatin of clj-kondo
and hapens when component with empty params is defined.
2024-07-10 13:27:12 +02:00
Belén Albeza 0d0b5ead86 📎 Remove unused storybook addons + other libs 2024-07-10 12:44:15 +02:00
Belén Albeza 7f6bfacff1 Merge pull request #4857 from penpot/eva-add-text-component-to-storybook
 Add text component to storybook
2024-07-10 12:31:42 +02:00
Eva Marco 7bd5d31094 Add text component to storybook 2024-07-10 12:18:37 +02:00
Eva Marco 645bc32121 Add new heading component to the DS 2024-07-10 12:03:55 +02:00
Belén Albeza 6e55260160 Merge pull request #4851 from penpot/eva-add-heading-component-to-storybook
 Add heading component to storybook
2024-07-10 12:01:57 +02:00
Eva Marco 2abbb0d359 Add new heading component to the DS 2024-07-10 11:46:06 +02:00
Nima K b13238eb30 🌐 Add translations for: Persian.
Currently translated at 47.9% (675 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2024-07-09 18:09:34 +02:00
Alejandro Alonso f09cfedebc Merge remote-tracking branch 'origin/staging' into develop 2024-07-09 14:12:57 +02:00
Alejandro ff43d43020 Merge pull request #4861 from penpot/niwinz-auth-oidc-reject-bugfix
🐛 Fix unexpected error when user explictly reject oidc auth
2024-07-09 14:11:59 +02:00
Andrey Antukh 0ae8cb4979 🐛 Do not report explicit user reject as error on oidc auth process 2024-07-09 13:57:48 +02:00
Andrey Antukh fc1495fdd1 🐛 Fix unexpected error when user explictly reject oidc auth 2024-07-09 13:51:07 +02:00
Alejandro 74622919f6 Merge pull request #4860 from penpot/palba-testab-template-order
🎉 Test A/B for templates order and names
2024-07-09 12:48:37 +02:00
Pablo Alba 4b4b160ea8 🎉 Test A/B for templates order and names 2024-07-09 12:35:48 +02:00
Andrey Antukh 0a86d9d515 Merge remote-tracking branch 'origin/staging' into develop 2024-07-09 12:16:45 +02:00
Alejandro 2baab838e4 Merge pull request #4859 from penpot/hiru-fix-export-include-libs
Fix embed assets in unpublish and export
2024-07-09 12:13:29 +02:00
Andrés Moya 29d0499725 🐛 Fix embed assets in unpublish and export 2024-07-09 11:51:52 +02:00
Andrey Antukh d99f4f62ea Merge pull request #4858 from penpot/superalex-update-release-name
 Update release 2.1.0 name
2024-07-09 10:22:33 +02:00
Alejandro Alonso 90f545ae6d Update release 2.1.0 name 2024-07-09 10:18:54 +02:00
Andrey Antukh b295b79565 Merge pull request #4838 from penpot/superalex-fix-size-presets-dont-work-well
🐛 Size presets landscape doesn't work well
2024-07-09 08:26:07 +02:00
Eva Marco 808ed6a98b Merge pull request #4853 from penpot/ladybenko-8291-update-assets
Update icons and svg assets (design system)
2024-07-09 08:12:36 +02:00
Eva Marco 2bb59671dd Merge pull request #4856 from penpot/ladybenko-8337-enable-ds-css-override
Enable design system CSS override + fix debug css compiling
2024-07-09 08:11:07 +02:00
Belén Albeza fb6ebcd074 🐛 Fix debug css being included in prod builds 2024-07-08 15:57:35 +02:00
Belén Albeza 44a2a63fb8 Ensure DS scss modules are compiled before the app css modules 2024-07-08 15:57:35 +02:00
Belén Albeza eae19e8252 📎 Remove leftover code 2024-07-08 15:57:35 +02:00
Andrey Antukh 1b05e7aa36 Merge pull request #4852 from penpot/alotor-plugins-7
 Small improvements over plugin manager
2024-07-08 09:04:44 +02:00
Belén Albeza be9a2767ea 📎 Remove unused rocket icon 2024-07-05 15:28:25 +02:00
Belén Albeza 6a18791c30 Add character icons 2024-07-05 15:26:45 +02:00
alonso.torres 2cc3f65323 Small improvements over plugin manager 2024-07-05 15:16:09 +02:00
Belén Albeza 63d1b558d1 Add percentage icon and update puzzle icon 2024-07-05 15:09:01 +02:00
Belén Albeza cfbfda925b 📚 Fix typo in RawSvg storybook docs 2024-07-05 14:57:22 +02:00
Belén Albeza fd1ab29920 Update v2-related svg assets 2024-07-05 14:34:59 +02:00
alonso.torres 35f4a07d27 Merge remote-tracking branch 'origin/plugins-beta-test' into develop 2024-07-05 11:12:58 +02:00
Eva Marco 9ce3f6da45 Merge pull request #4845 from penpot/ladybenko-8265-raw-svg-component
RawSVG component (design system) + generate SVG sprite for assets
2024-07-05 09:44:35 +02:00
Belén Albeza b8b199c5ec Merge pull request #4844 from penpot/eva-fix-visual-test
🐛  Fix workspace visual test for assets modal
2024-07-05 09:23:22 +02:00
Belén Albeza e492284abe Merge pull request #4843 from penpot/eva-remove-unused-locale-fn
♻️  Remove unused locale fn
2024-07-05 09:22:24 +02:00
Eva Marco 3d5e064358 ♻️ Remove unused locale function 2024-07-05 09:04:34 +02:00
Andrey Antukh 6f8ce1fc5a Merge pull request #4849 from penpot/alotor-plugins-6
 Add events for plugins
2024-07-04 17:17:38 +02:00
Andrey Antukh 5ae30ea9bc Merge pull request #4850 from penpot/alotor-bug-api-svg
🐛 Fix problem when creating SVG images
2024-07-04 17:15:35 +02:00
Belén Albeza 8959d39356 Merge pull request #4837 from penpot/eva-ds-foundations-typography
 Add typography ds tokens
2024-07-04 16:11:25 +02:00
alonso.torres aded9f1a36 🐛 Fix problem when creating SVG images 2024-07-04 16:01:02 +02:00
Belén Albeza 3a34eb1357 🐛 Fix flakiness of visual workspace test (assets tab) 2024-07-04 15:45:50 +02:00
alonso.torres c2564eaf65 Change spec location 2024-07-04 15:16:58 +02:00
alonso.torres 53d3b2abbc Add events for plugins 2024-07-04 15:16:34 +02:00
Belén Albeza 5d90c463a3 📚 Add docs for RawSvg component 2024-07-04 14:48:57 +02:00
Belén Albeza 5309da2eee 📎 Add storybook helper components and improve current stories 2024-07-04 14:11:03 +02:00
Andrey Antukh d1dd13fde9 Merge pull request #4842 from penpot/alotor-plugins-5
Alotor plugins 5
2024-07-04 13:59:48 +02:00
alonso.torres 0a83306015 ⬆️ Update plugins runtime 2024-07-04 13:57:04 +02:00
Belén Albeza 203a39f07c ♻️ Rename IconGrid to StoryGrid (storybook helper component) 2024-07-04 13:05:23 +02:00
Alejandro 85579b253f Merge pull request #4681 from penpot/niwinz-enhancements-2
🔥 Replace spec usage on RPC methods with schema
2024-07-04 12:56:41 +02:00
Eva Marco 1ca751bc42 🐛 Fix workspace visual test for assets modal 2024-07-04 12:41:48 +02:00
Andrey Antukh f344eee778 🐛 Fix backend test initialization code 2024-07-04 12:30:28 +02:00
Andrey Antukh 28c2197ba7 ♻️ Add string length validation to backend RPC methods fields 2024-07-04 12:30:28 +02:00
Andrey Antukh 0721760900 Add better schema for shape export property 2024-07-04 12:30:28 +02:00
Andrey Antukh 45c77f97ce 📎 Fix code style issue not catched by the linter
Comment indentantion
2024-07-04 12:30:28 +02:00
Andrey Antukh 05fb46a573 Accept uri instances on http client 2024-07-04 12:30:28 +02:00
Andrey Antukh ad6a864478 🔥 Replace spec with schema on search RPC methods 2024-07-04 12:30:28 +02:00
Andrey Antukh 37fcc74ef8 🔥 Replace spec with schema on media RPC methods 2024-07-04 12:30:28 +02:00
Andrey Antukh c4cf745d77 🔥 Replace spec with schema on ldap RPC methods 2024-07-04 12:30:28 +02:00
Andrey Antukh 85108672bf 🔥 Replace spec with schema on file-thumbnails RPC methods 2024-07-04 12:30:28 +02:00
Andrey Antukh 969c9105fd 🔥 Replace spec with schema on feedback RPC methods 2024-07-04 12:30:28 +02:00
Andrey Antukh 073621f29a 🔥 Replace spec with schema on demo RPC methods 2024-07-04 12:30:28 +02:00
Andrey Antukh bbc0089166 🔥 Replace spec with schema on verify-token RPC methods 2024-07-04 12:30:28 +02:00
Andrey Antukh 268f1d40aa 🔥 Replace spec with schema on file-share RPC methods 2024-07-04 12:30:28 +02:00
Andrey Antukh e9a28b034f 🔥 Replace spec with schema on file RPC methods 2024-07-04 12:30:28 +02:00
Andrey Antukh bfca324623 🔥 Replace spec with schema on project rpc methods 2024-07-04 12:30:28 +02:00
Andrey Antukh 279c6337e4 🔥 Replace spec with schema on access-token rpc methods 2024-07-04 12:30:28 +02:00
Andrey Antukh 368917f7f5 🔥 Replace spec with schema on webhooks rpc methods 2024-07-04 12:30:28 +02:00
Andrey Antukh f973faa409 📎 Add missing SPEC tag on doc entry template 2024-07-04 12:30:28 +02:00
Andrey Antukh a0339132dd 📎 Update cljfmt config 2024-07-04 12:30:28 +02:00
Andrey Antukh 40f947fc9f 🐛 Fix issue with schema uri decoder 2024-07-04 12:30:28 +02:00
Andrey Antukh d2bedec59c Unify naming of schema registering functions 2024-07-04 12:30:28 +02:00
alonso.torres 1b93ccdec9 Remove duplicate permissions in confirm dialog 2024-07-04 12:07:54 +02:00
Alejandro Alonso 2921b62b37 Merge remote-tracking branch 'origin/staging' into develop 2024-07-04 11:56:21 +02:00
Belén Albeza ffee6c63eb Merge pull request #4841 from penpot/superalex-release-notes-2-1
 Release notes for 2.1
2024-07-04 11:55:25 +02:00
alonso.torres 83f3ae1fbd Change plugins url 2024-07-04 11:52:31 +02:00
Eva Marco 66d97cb2e0 Add typography ds tokens 2024-07-04 11:18:05 +02:00
Alejandro Alonso 0ec1bb7a22 Release notes for 2.1 2024-07-04 11:16:20 +02:00
Belén Albeza 4ecaaba1e5 Add RawSvg component to the design system 2024-07-04 10:11:12 +02:00
Belén Albeza c52da573c5 📎 Fix react warning on icon* component 2024-07-04 09:47:37 +02:00
Belén Albeza 4ac18e2ef0 🐛 Fix cursors svg duplicating icons sprites 2024-07-04 09:20:18 +02:00
Belén Albeza f05e1354ff 🔧 Add assets svg sprite generation 2024-07-04 09:20:18 +02:00
Andrey Antukh bafe2ab985 Merge pull request #4832 from penpot/ladybenko-7866-icon-component
Implement icon component (design system)
2024-07-03 19:33:16 +02:00
Andrey Antukh 0d13a12d64 Merge pull request #4840 from penpot/alotor-plugins-4
Alotor plugins 4
2024-07-03 16:49:47 +02:00
alonso.torres deb0fab156 🐛 Fix small visual problems 2024-07-03 15:35:43 +02:00
Belén Albeza c181887266 📎 Remove unused example simple_button component 2024-07-03 15:26:11 +02:00
Belén Albeza a624a10c85 🐛 Fix scrolling not working on storybook mdx files 2024-07-03 15:26:11 +02:00
Belén Albeza 6295fbf7e2 Implement icon* component 2024-07-03 15:26:11 +02:00
Belén Albeza c6a7ad0520 🐛 Fix template generation for storybook 2024-07-03 15:25:30 +02:00
Belén Albeza de89dfe27f 📎 Remove unused legacy icons preview 2024-07-03 15:25:30 +02:00
alonso.torres a8463f349a New plugin attributes 2024-07-03 15:23:05 +02:00
Belén Albeza 3b6ed823b9 Merge pull request #4839 from penpot/niwinz-rumext-linter
 Add better linter for rumext defc macro
2024-07-03 15:22:55 +02:00
alonso.torres 80e17f8cfc Add new signature for the run-store test helper 2024-07-03 15:22:42 +02:00
Andrey Antukh 8fae4550c3 Add better linter for rumext defc macro 2024-07-03 14:36:29 +02:00
Alejandro Alonso 2944860696 🐛 Size presets landscape doesn't work well 2024-07-03 13:35:14 +02:00
Alejandro Alonso 9125b46ca5 Merge remote-tracking branch 'origin/staging' into develop 2024-07-03 08:46:26 +02:00
Alejandro 7ed25d2dba Merge pull request #4765 from penpot/niwinz-refactor-forms
♻️ Refactor forms (spec -> schema)
2024-07-03 08:45:42 +02:00
Andrey Antukh 0fa8aca6e2 Add minor improvements to common.schema ns 2024-07-03 08:25:51 +02:00
Andrey Antukh 7be79c10fd ♻️ Refactor forms
Mainly replace spec with schema with better
and more reusable validations
2024-07-03 08:25:51 +02:00
Andrey Antukh f095e1b29f Replace custom all-spaces? fn with generic str/blank? 2024-07-02 17:47:58 +02:00
Andrey Antukh 96822082bd Revert " Rehash and sync translations"
This reverts commit 5b6fc19e00.
2024-07-02 17:47:29 +02:00
Aitor Moreno c637912337 Merge pull request #4822 from penpot/niwinz-translation-management-script
🎉 Add new translations management script
2024-07-02 16:20:25 +02:00
AzazelN28 5b6fc19e00 Rehash and sync translations 2024-07-02 16:04:57 +02:00
Andrey Antukh f6435461a1 Merge pull request #4835 from penpot/alotor-plugins-3
🐛 Fix some problems in plugins
2024-07-02 15:44:50 +02:00
AzazelN28 83e51abd35 🐛 Fix package.json translation scripts 2024-07-02 15:41:00 +02:00
Andrey Antukh 8d6791105a Merge pull request #4833 from penpot/superalex-add-extra-info-to-create-team-response
 Add extra info to create team response
2024-07-02 15:37:42 +02:00
Andrey Antukh dab88404c0 Merge pull request #4834 from penpot/ladybenko-fix-layer-width
🐛 Fix layer width on the left sidebar
2024-07-02 15:37:22 +02:00
alonso.torres c66ff74f21 🐛 Fix some problems in plugins 2024-07-02 15:30:35 +02:00
Belén Albeza 769655f565 🐛 Fix layer width on the left sidebar 2024-07-02 15:18:27 +02:00
Andrey Antukh 139dd7d80f 🎉 Add new translations management script 2024-07-02 15:11:56 +02:00
Andrey Antukh 62cea62356 Merge pull request #4816 from penpot/alotor-plugins-2
Improvements over plugins subsystem
2024-07-02 13:43:15 +02:00
Alejandro Alonso f051137098 Add extra info to create team response 2024-07-02 13:36:12 +02:00
alonso.torres 58fa10a0d5 ⬆️ Update plugins runtime 2024-07-02 11:08:56 +02:00
alonso.torres 395a91c00c Plugins permissions review 2024-07-02 11:01:43 +02:00
alonso.torres 741bf3b666 New plugins permissions dialog 2024-07-02 11:01:43 +02:00
alonso.torres fbce59e81f Improved text handling in plugins 2024-07-02 10:41:06 +02:00
alonso.torres ac58a5b8fa Improved transformation from and to JS for plugins 2024-07-02 10:41:06 +02:00
alonso.torres 42230f2630 Change shapes color 2024-07-02 10:41:06 +02:00
Andrey Antukh 675a31796c Merge pull request #4823 from penpot/superalex-improve-audit-log-external-origin-events
 improve audit log external origin events
2024-07-02 08:29:33 +02:00
Alejandro Alonso 8dcd538bd2 Improve external origin events for audit_log 2024-07-02 08:14:22 +02:00
Belén Albeza 9a188fd792 Merge pull request #4830 from penpot/eva-ds-color-foundations
 Add DS foundation colors
2024-07-01 16:04:24 +02:00
Eva Marco 6c68a34d63 Add DS foundation colors 2024-07-01 15:10:46 +02:00
Eva Marco 746b448f30 Merge pull request #4825 from penpot/ladybenko-8224-setup-ds
Setup design system
2024-07-01 12:49:22 +02:00
Belén Albeza b5aba58aac Make storybook wrapper to render both dark and light themes 2024-07-01 11:14:42 +02:00
Belén Albeza 2bb7726180 📎 Remove unneeded icons export in the storybook target 2024-07-01 11:14:42 +02:00
Belén Albeza 24b607cad3 💄 Move the stub design system component to its own ds folder 2024-07-01 11:14:42 +02:00
Eva Marco 087d0e90e6 Merge pull request #4821 from penpot/ladybenko-8182-prettier
Add prettier for JS files
2024-07-01 10:48:01 +02:00
Belén Albeza e448951d6f Add CI rule for checking JS format 2024-07-01 10:29:57 +02:00
Belén Albeza ecbedf847f 💄 Reformat affected JS files 2024-07-01 10:29:57 +02:00
Belén Albeza 3efd5cb9e8 Add prettier JS commands to package.json 2024-07-01 10:29:57 +02:00
Belén Albeza e1dc964c4c Upgrade prettier and use specific settings for scss files only 2024-07-01 10:23:19 +02:00
The_BadUser 295c932646 🌐 Add translations for: Russian.
Currently translated at 99.6% (1403 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2024-06-30 21:10:08 +02:00
The_BadUser 5b9f4128f3 🌐 Add translations for: Russian.
Currently translated at 89.3% (1258 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2024-06-29 01:26:20 +02:00
The_BadUser 100f1229ce 🌐 Add translations for: Russian.
Currently translated at 75.9% (1070 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2024-06-29 00:09:23 +02:00
Aryiu adf24cd274 🌐 Add translations for: Catalan.
Currently translated at 77.1% (1086 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ca/
2024-06-29 00:09:22 +02:00
Andrey Antukh de1d154e9c Merge pull request #4824 from penpot/alotor-fix-plugins
🐛 Fix problem with recursive properties
2024-06-28 16:21:58 +02:00
alonso.torres 4345584384 🐛 Fix problem with recursive properties 2024-06-28 14:57:14 +02:00
Alejandro Alonso ba1adf91ca Merge remote-tracking branch 'origin/staging' into develop 2024-06-28 11:09:37 +02:00
Andrey Antukh 384ad2e6fa Merge pull request #4813 from penpot/superalex-tracking-teams-and-invitations-in-posthog
 Add extra events info to track teams and invitations
2024-06-28 11:08:30 +02:00
Andrey Antukh 024b08de06 Merge remote-tracking branch 'origin/staging' into develop 2024-06-28 10:37:22 +02:00
Andrey Antukh c090a11e5b Normalize audit event origin tracking on frontend and backend 2024-06-28 10:30:26 +02:00
Alejandro Alonso f6b367cdca Add extra events info to track teams and invitations 2024-06-28 10:30:26 +02:00
Alejandro 4e5eabbf05 Merge pull request #4781 from penpot/ladybenko-8110-clean-global-css
 Clean global css styles
2024-06-28 08:48:21 +02:00
Andrey Antukh 5b9d2663c0 Merge remote-tracking branch 'origin/main' into staging 2024-06-28 08:18:30 +02:00
Alejandro 5e5c105d92 Merge pull request #4817 from penpot/niwinz-hotfix-1
🐛 More fixes on account deletion process
2024-06-28 07:43:07 +02:00
Alejandro 9c2c2fec6a Merge pull request #4815 from penpot/niwinz-bugfix-2
🐛 Backport from main account deletion bugfixes
2024-06-28 07:35:53 +02:00
Andrey Antukh 56160cf64d 🐛 Fix error handling on verify-token page 2024-06-27 16:11:43 +02:00
Andrey Antukh c45a105186 🐛 Set correct order of execution for logged-out event 2024-06-27 16:11:37 +02:00
Andrey Antukh f364666d48 🐛 Fix error handling on verify-token page 2024-06-27 16:10:26 +02:00
Andrey Antukh 7facd69039 🐛 Set correct order of execution for logged-out event 2024-06-27 16:10:04 +02:00
Belén Albeza c9258b5526 Remove workspace partial scss stylesheet 2024-06-27 15:35:57 +02:00
Belén Albeza ce9fb80558 📎 Remove unused css for loader 2024-06-27 15:35:57 +02:00
Belén Albeza cd8e2540de Use CSS modules for styling the debug icons preview page 2024-06-27 15:35:57 +02:00
Belén Albeza 9a2ee806e4 Clean up base scss 2024-06-27 15:35:57 +02:00
Belén Albeza b192887d19 Remove framework scss stylesheet 2024-06-27 15:35:57 +02:00
Belén Albeza b6e918b024 Remove unused legacy sass files 2024-06-27 15:35:57 +02:00
Belén Albeza ed174d16d1 Remove unused animation mixin 2024-06-27 15:35:57 +02:00
Belén Albeza 6b8108afda Make reset css to be included first thing in our styles 2024-06-27 15:35:57 +02:00
Belén Albeza 49fd000217 Clean up fonts scss files 2024-06-27 15:35:57 +02:00
Belén Albeza 0c3f47b0c3 Clean up unused selectors / mixins / sass vars 2024-06-27 15:35:57 +02:00
Belén Albeza 2d53b96a15 Initial clean up of framework scss 2024-06-27 15:35:57 +02:00
Belén Albeza 540875c41e Remove unused css var colors 2024-06-27 15:35:57 +02:00
Belén Albeza 595f153d85 Remove importing animate.css 2024-06-27 15:35:57 +02:00
Belén Albeza 0cbc3487b0 🔧 Tweak the pixel diff ratio of playwright 2024-06-27 15:35:57 +02:00
Alejandro b0fea30770 Merge pull request #4814 from penpot/niwinz-hotfix-1
🐛 Add missing logged-out event after account deletion
2024-06-27 14:04:16 +02:00
Andrey Antukh 17015c5353 🐛 Add missing logged-out event after account deletion 2024-06-27 14:00:52 +02:00
Andrey Antukh ba721def26 Add srepl helpers for profile deletion handling 2024-06-27 14:00:52 +02:00
Andrey Antukh f9af7f0f09 🐛 Make profile deletion follow the delete-object flow
This removes the need of the specific task for cleaning
orphan teams.
2024-06-27 14:00:52 +02:00
Andrey Antukh 56476acc19 🐛 Fix error handling on account deletion process 2024-06-27 13:56:39 +02:00
Andrey Antukh 67489c0bb9 🐛 Fix profile deletion issue with 1 participant 2024-06-27 13:56:39 +02:00
Andrey Antukh 272edec3c6 🐛 Add missing logged-out event after account deletion 2024-06-27 13:53:30 +02:00
Alejandro 78addf00b4 Merge pull request #4812 from penpot/niwinz-hotfix-1
🐛 Fix account deletion process issues
2024-06-27 13:02:55 +02:00
Andrey Antukh 2cddbc8a3d 🐛 Fix error handling on account deletion process 2024-06-27 12:16:51 +02:00
Andrey Antukh 7e44ae62a2 🐛 Fix profile deletion issue with 1 participant 2024-06-27 12:16:51 +02:00
Alejandro Alonso 978ac68474 Merge remote-tracking branch 'origin/staging' into develop 2024-06-27 09:54:48 +02:00
Alejandro Alonso 40b43c6c5b 🐛 Fix lost image colors in library when export/import using zip format 2024-06-27 09:54:02 +02:00
Alejandro Alonso 034170afac 🐛 Export/import of images doesn't work for .zip format 2024-06-27 09:54:02 +02:00
Alejandro Alonso 045e83e871 Merge remote-tracking branch 'origin/staging' into develop 2024-06-27 08:44:23 +02:00
Alejandro 46a9535f35 Merge pull request #4810 from penpot/niwinz-bugfix-11
🐛 Add migration for fix path shapes with invalid curve segment params
2024-06-27 08:02:00 +02:00
Andrey Antukh 0239139b4b Merge pull request #4802 from penpot/jordisala1991-feature/no-direct-download
 Return blob when exporting using the lib-penpot
2024-06-27 07:59:38 +02:00
Alejandro 8c411e7727 Merge pull request #4808 from penpot/ladybenko-fix-playwright-test-mac-shortcut
🐛 Fix playwright test mac shortcut
2024-06-27 07:48:36 +02:00
Alejandro ff4d66ec75 Merge pull request #4806 from penpot/niwinz-bugfix-10
🐛 Properly report erorrs on importation
2024-06-27 07:37:58 +02:00
Alejandro e3f4258252 Merge pull request #4796 from penpot/palba-bugfixing-007
🐛 Bugfixing
2024-06-27 07:35:42 +02:00
Pablo Alba 950d6195f6 🐛 Fix import file message does not detect 0 as error 2024-06-27 07:35:30 +02:00
Pablo Alba a56e7e383f 🐛 Fix 'Detach instance' shortcut is not working 2024-06-27 07:35:29 +02:00
Pablo Alba f786aff3fc 🐛 Fix can't collapse groups when searching in the assets tab 2024-06-27 07:35:28 +02:00
Andrey Antukh f393ce9273 🐛 Add migration for fix path shapes with invalid curve segment params 2024-06-26 19:46:29 +02:00
Belén Albeza 16d0b925fa 🐛 Fix workspace 'make group' test on Mac 2024-06-26 17:02:24 +02:00
Belén Albeza f306ddb51f 🐛 Fix onboarding playwright test on CI mode 2024-06-26 17:01:58 +02:00
Andrey Antukh 16a0e1f578 Merge pull request #4805 from penpot/superalex-fix-selected-colors-do-not-appear-in-color-palette
🐛 Selected colors do not appear in the color palette
2024-06-26 15:04:40 +02:00
Andrey Antukh 1c1929ed32 📎 Add helpers for process deletion cascade of old objects 2024-06-26 15:00:47 +02:00
Andrey Antukh 37d0cec265 🐛 Properly report importation errors 2024-06-26 14:59:38 +02:00
Alejandro Alonso 9ca1535a65 🐛 Selected colors do not appear in the color palette 2024-06-26 12:57:53 +02:00
Andrey Antukh 8a63089773 Merge pull request #4801 from penpot/superalex-fix-color-library-loses-association
🐛 Color library loses association with shapes when exporting/impo…
2024-06-26 11:28:45 +02:00
Andrey Antukh 4faf9bbff1 📎 Add minor change on how promise is created from observable 2024-06-26 11:27:30 +02:00
Jordi Sala Morales 44b6d1a516 Return blob when exporting using the lib-penpot 2024-06-26 11:19:09 +02:00
Alejandro Alonso 58466e6488 🐛 Color library loses association with shapes when exporting/importing the document 2024-06-26 10:40:30 +02:00
Alejandro Alonso 4ed6e1e8ec Merge remote-tracking branch 'origin/staging' into develop 2024-06-26 07:42:50 +02:00
Alejandro 3bb2573dec Merge pull request #4795 from penpot/niwinz-bugfix-8
🐛 Bugfixes
2024-06-26 07:41:22 +02:00
Alejandro 4437fc43e4 Merge pull request #4799 from penpot/ladybenko-fix-visual-regression-tests
Fix broken visual regression test + refactor Dashboard POM
2024-06-26 07:01:49 +02:00
Andrey Antukh 253e5a11fc Merge remote-tracking branch 'origin/staging' into develop 2024-06-25 16:33:52 +02:00
Andrey Antukh 3a30e6b29e Merge pull request #4798 from penpot/superalex-fix-alt-duplicate-shapes
🐛 Fix duplicate shapes with alt key
2024-06-25 16:32:24 +02:00
Alejandro Alonso 6e734f2eac Merge remote-tracking branch 'origin/staging' into develop 2024-06-25 15:54:32 +02:00
Alejandro Alonso 686f59b0de 🐛 Fix duplicate shapes with alt key 2024-06-25 15:53:17 +02:00
Andrey Antukh fc30e81072 🐛 Make component changes watcher look on local commits only 2024-06-25 15:47:24 +02:00
Belén Albeza 30edca024a Remove unneeded draftsFile and newFile locators in dashboard POM 2024-06-25 15:26:49 +02:00
Andrés Moya 798970a923 🐛 Rework svg import of deleted components 2024-06-25 15:23:52 +02:00
Andrés Moya 6aeb87a122 🐛 Rework svg export of deleted components 2024-06-25 15:23:52 +02:00
Belén Albeza c14f783d94 Remove redundant locators for Dashboard POM 2024-06-25 15:16:13 +02:00
Belén Albeza 8f3452c0af Avoid using unneeded test ids in dashboard POM 2024-06-25 14:57:37 +02:00
Andrey Antukh ec4260830c ♻️ Add API consistency fixes for task calling
Also adds a helper for calling tasks synchronously
2024-06-25 13:24:17 +02:00
Andrey Antukh aa1cf3e03a Add some redundancy to delete_object task 2024-06-25 13:06:44 +02:00
Belén Albeza 97a1b59861 💄 Reformat DashboardPage.js according to prettier rules 2024-06-25 11:56:31 +02:00
Alejandro Alonso 41aad7558b Merge remote-tracking branch 'origin/staging' into develop 2024-06-25 10:49:32 +02:00
Alejandro 3b5b81b08f Merge pull request #4758 from penpot/superalex-refactor-data-test-attribute
 Refactor data-test attribute
2024-06-25 10:49:03 +02:00
Alejandro Alonso d48616d510 Merge remote-tracking branch 'origin/staging' into develop 2024-06-25 10:18:42 +02:00
Andrey Antukh 8296e72887 Merge pull request #4793 from penpot/alotor-plugins-2
 Add some missing text properties in plugins
2024-06-25 07:47:34 +02:00
Oğuz Ersen 2648e71f5b 🌐 Add translations for: Turkish.
Currently translated at 100.0% (1408 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2024-06-24 21:09:19 +02:00
alonso.torres 5771f2f8aa Plugins retrieve selection colors 2024-06-24 15:26:47 +02:00
alonso.torres f86156b619 Plugins support for code generation 2024-06-24 15:26:21 +02:00
alonso.torres 8ff0015458 Add to plugins connect and fetch libraries 2024-06-24 12:34:35 +02:00
alonso.torres 84ecb99400 Add some missing text properties in plugins 2024-06-24 09:57:57 +02:00
Stas Haas 5160ae364d 🌐 Add translations for: German.
Currently translated at 100.0% (1408 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2024-06-22 10:09:13 +02:00
Andrey Antukh b9e40b4d82 Merge pull request #4788 from penpot/alotor-plugins-2
Fix problem with plugins initialization
2024-06-21 14:58:42 +02:00
Aitor Moreno f3333336f0 Merge pull request #4787 from penpot/niwinz-bugfix-8
🐛 Fix thumbnails related issues
2024-06-21 13:23:00 +02:00
Andrey Antukh b25a9f8626 🐛 Return back to use blob uris for transient thumbnails 2024-06-21 13:12:44 +02:00
Andrey Antukh 7b8d127583 🐛 Fix incorrect frame change detection on thumbnails generation 2024-06-21 13:12:44 +02:00
alonso.torres 4b67c0593d Upload media with data in plugins 2024-06-21 12:46:31 +02:00
alonso.torres fb1429956a Changed order of plugins initialization 2024-06-21 12:44:35 +02:00
Andrey Antukh c70d20f95d Merge pull request #4783 from penpot/alotor-plugins-texts
Update plugins
2024-06-21 10:03:52 +02:00
Alejandro 0b6c84f551 Merge pull request #4786 from penpot/niwinz-bugfix-8
 Changes on metrics
2024-06-21 09:42:30 +02:00
Andrey Antukh 31818ec365 Replace other summary metrics with histogram 2024-06-21 09:32:46 +02:00
alonso.torres 47d211cd87 ⬆️ Update plugin runtime 2024-06-21 09:29:09 +02:00
alonso.torres 7fd223893b Expose component properties in components 2024-06-21 09:29:09 +02:00
alonso.torres 1794859468 Review input validation for plugins 2024-06-21 09:29:09 +02:00
alonso.torres c5c8be4b4a Improve input validation in plugins 2024-06-21 09:29:09 +02:00
alonso.torres e13d543dcd Add geometry utils 2024-06-21 09:29:09 +02:00
alonso.torres 69fad7a920 Add some utilities for fonts in plugins 2024-06-21 09:29:09 +02:00
alonso.torres 2da5dcb619 Add text ranges support in plugins 2024-06-21 09:29:09 +02:00
Andrey Antukh f249945dff Include climit into the RPC handler metrics 2024-06-21 09:28:28 +02:00
Andrey Antukh 56556a3f3b Make the penpot_rpc_climit_timing metric as histogram 2024-06-21 09:27:11 +02:00
Alejandro Alonso a59f31ebe5 Refactor data-test attribute 2024-06-21 09:14:09 +02:00
Stas Haas 3260130042 🌐 Add translations for: German.
Currently translated at 99.8% (1406 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2024-06-21 07:09:15 +00:00
Unreal Vision c77316f91e 🌐 Add translations for: French.
Currently translated at 100.0% (1408 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2024-06-21 07:09:14 +00:00
Alejandro 4d0bfb1003 Merge pull request #4785 from penpot/niwinz-bugfix-4
🐛 Remove climit setup for delete-file-object-thumbnail RPC method
2024-06-20 18:47:27 +02:00
Andrey Antukh afb23bcebe Merge pull request #4784 from penpot/azazeln28-refactor-component-thumbnails-as-configurable
♻️ Refactor component thumbnails as configurable
2024-06-20 17:58:45 +02:00
AzazelN28 7b1bda3a49 ♻️ Refactor component thumbnails as configurable 2024-06-20 17:40:41 +02:00
Andrey Antukh 8e9e967f82 🐛 Remove climit setup for delete-file-object-thumbnail RPC method 2024-06-20 16:49:19 +02:00
Andrey Antukh d1d384acaf Merge pull request #4782 from penpot/eva-fix-translation-error
🐛 Fix minor onboarding errors
2024-06-20 16:10:34 +02:00
Pablo Alba 018464aedf ♻️ Unify move shape on workspace and relocate on layers panel 2024-06-20 16:00:39 +02:00
Eva Marco 1845e759d3 🐛 Fix a small error on translations and on step number for event 2024-06-20 15:06:19 +02:00
Andrey Antukh 955dadc301 Merge pull request #4780 from penpot/superalex-removing-underline-and-strikethrough-affects-the-previous-text-object
🐛 Removing Underline and Strikethrough Affects the Previous Text …
2024-06-20 12:08:30 +02:00
Alejandro 446edee7c6 Merge pull request #4779 from penpot/ladybenko-7937-login-visual-test
Add temporary visual regression tests for the login page
2024-06-20 11:58:45 +02:00
Alejandro Alonso c35a818d4c 🐛 Removing Underline and Strikethrough Affects the Previous Text Object 2024-06-20 11:49:10 +02:00
Andrey Antukh e5cc262644 Merge pull request #4778 from penpot/superalex-fix-crash-when-new-colorpicker-while-image-upload
🐛 Penpot crashes when a new colorpicker is created while uploadin…
2024-06-20 10:36:44 +02:00
Belén Albeza 84350ea71c 📎 Remove dashboard visual tests that depend on specific config flags that are not on by default 2024-06-20 09:49:41 +02:00
Belén Albeza d4eea973b6 📎 Add temporary visual regression test for login form 2024-06-20 09:49:41 +02:00
Belén Albeza 6d82f41e43 ♻️ Refactor login POM logged out user intercept 2024-06-20 09:49:37 +02:00
Alejandro Alonso 4884a11102 🐛 Penpot crashes when a new colorpicker is created while uploading an image to another instance 2024-06-20 09:22:39 +02:00
Andrey Antukh 2982dde7df Merge pull request #4776 from penpot/SudoVanilla-patch-1
🔥 Remove version specification from docker-compose.yaml file
2024-06-20 08:28:04 +02:00
SudoVanilla acb7ca5440 🔥 Remove version specification from docker-compose.yaml file
It is deprecated
2024-06-20 08:16:02 +02:00
Alejandro 3e6b34c563 Merge pull request #4772 from penpot/niwinz-audit-enhancements-2
 Minor enhancements to audit events related to clone-template
2024-06-20 07:05:37 +02:00
Yaron Shahrabani 8a7fdaa6ca 🌐 Add translations for: Hebrew.
Currently translated at 100.0% (1408 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2024-06-19 22:09:19 +02:00
Stas Haas 27c574f0a7 🌐 Add translations for: German.
Currently translated at 99.5% (1401 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2024-06-19 22:09:18 +02:00
Unreal Vision 6d82d54560 🌐 Add translations for: French.
Currently translated at 96.6% (1361 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2024-06-19 22:09:17 +02:00
Andrey Antukh 6a253871b0 Improve internal handling of external-session-id 2024-06-19 16:15:48 +02:00
Andrey Antukh 8da153f604 Emit create-file action events on clone-template 2024-06-19 14:58:04 +02:00
Andrey Antukh d1e9ea372a Assign external session ID to params on RPC main handler 2024-06-19 14:57:17 +02:00
Alejandro Alonso b668fed1c8 🐛 Export shapes that are rotated act a bit strange when reimported 2024-06-19 13:04:15 +02:00
Andrey Antukh d527184dfc ♻️ Try to fix recursive update-file ops on text edition
on concurrent multi-user sessions
2024-06-19 11:48:08 +02:00
Andrey Antukh a2cc7764fb Improve how indexes are updated on concurrent sessions 2024-06-19 11:48:08 +02:00
Alejandro d977b4e27c Merge pull request #4768 from penpot/eva-visual-testing-viewer
  Add visual testing to viewer
2024-06-19 10:43:46 +02:00
Eva Marco f3193a1984 Add visual testing to viewer 2024-06-19 10:01:31 +02:00
Alejandro 5e7180b054 Merge pull request #4767 from penpot/ladybenko-ds-visual-tests-workspace-stg
📎 Add (temporary) visual regression tests for the Workspace
2024-06-19 09:55:18 +02:00
Belén Albeza 7f4f54e3fd 📎 Add (temporary) visual regression tests for the Workspace 2024-06-19 09:44:03 +02:00
Alejandro Alonso cba62c0172 Merge remote-tracking branch 'origin/staging' into develop 2024-06-19 08:12:19 +02:00
Alejandro 8a0aa9cd7f Merge pull request #4760 from penpot/niwinz-fix-json-truncation
🐛 Fix json encoding output truncation
2024-06-19 08:10:48 +02:00
Alejandro Alonso bc8435dc5b Merge remote-tracking branch 'origin/main' into staging 2024-06-19 08:01:08 +02:00
Andrey Antukh 3363793d64 🐛 Fix json encoding truncation issue 2024-06-19 07:59:28 +02:00
Alejandro bb63375933 Merge pull request #4764 from penpot/niwinz-audit-enhancements
 Forward external session id to backend
2024-06-19 07:56:11 +02:00
Andrey Antukh 06bab212b5 🐛 Set correct order for http middlewares 2024-06-19 07:48:12 +02:00
Andrey Antukh 504f833a53 🐛 Fix global error handler incorrect body encoding 2024-06-19 07:48:12 +02:00
Andrey Antukh 00b4013385 Forward external session id to backend 2024-06-19 07:45:27 +02:00
Andrés Moya d039df6b73 Add tests for detach with swapped copies 2024-06-18 23:39:19 +02:00
Alejandro Alonso 47b455ba87 Merge remote-tracking branch 'origin/staging' into develop 2024-06-18 16:57:51 +02:00
Stephan Paternotte 3f29071139 🌐 Add translations for: Dutch.
Currently translated at 100.0% (1408 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2024-06-18 15:09:24 +02:00
Yaron Shahrabani ccdfac7b8e 🌐 Add translations for: Hebrew.
Currently translated at 96.2% (1355 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2024-06-18 15:09:23 +02:00
Stas Haas be959ca90c 🌐 Add translations for: German.
Currently translated at 98.7% (1391 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2024-06-18 15:09:22 +02:00
Alejandro Alonso 3e657874d7 🐛 Create resources/public/css/ on run-devenv 2024-06-18 14:22:48 +02:00
Alejandro 52a49a7359 Merge pull request #4733 from penpot/eva-visual-testing
 Add visual testing to dashboard
2024-06-18 13:16:07 +02:00
Eva Marco 4e770fd326 Add visual testing to dashboard 2024-06-18 10:31:39 +02:00
Aitor Moreno 6023ab1c07 Merge pull request #4746 from penpot/superalex-remove-a-b-testing-for-onboarding-questions
 Remove a/b testing code for onboarding questions
2024-06-18 09:59:18 +02:00
Alejandro 47fcac1c00 Merge pull request #4757 from penpot/niwinz-enhancements-3
 Fix a performance regression with file validation with some features
2024-06-18 09:32:36 +02:00
Andrey Antukh 293b460cab Fix a performance regression with file validation with some features
The feature fdata/pointer-map tracking mechanism interacts pretty bad
with possible local mutations on the validation subsystem. The fix
consist on disabling the tracking mechanism on the validation.
2024-06-17 15:56:06 +02:00
Pablo Alba 4e6c1857dd 🐛 Add validator and repair for duplicated slots on deleted components 2024-06-17 15:15:40 +02:00
Pablo Alba 4546e98dc6 Revert "Revert "🐛 Add validator and repair for duplicated slots""
This reverts commit e0906be6e7.
2024-06-17 15:15:40 +02:00
Brendan Bell 2929783d35 📎 Update docker-compose.yaml 2024-06-17 13:30:51 +02:00
Andrey Antukh 838843be45 Merge branch 'translations' into develop 2024-06-17 10:09:05 +02:00
Anonymous 1225d72917 🌐 Add translations for: Yoruba.
Currently translated at 85.2% (1200 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/yo/
2024-06-17 10:07:39 +02:00
Anonymous 9c4a310d84 🌐 Add translations for: Igbo.
Currently translated at 37.1% (523 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ig/
2024-06-17 10:07:39 +02:00
Anonymous d3e9fd9a36 🌐 Add translations for: Malay.
Currently translated at 48.1% (678 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ms/
2024-06-17 10:07:39 +02:00
Anonymous d2c63e0857 🌐 Add translations for: Spanish (Latin America).
Currently translated at 9.5% (134 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es_419/
2024-06-17 10:07:39 +02:00
Anonymous 52c00367d7 🌐 Add translations for: Hausa.
Currently translated at 89.9% (1267 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ha/
2024-06-17 10:07:39 +02:00
Anonymous 6ee844b48f 🌐 Add translations for: Afrikaans.
Currently translated at 6.8% (97 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/af/
2024-06-17 10:07:39 +02:00
Anonymous 542ad58c32 🌐 Add translations for: Dutch.
Currently translated at 96.7% (1362 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2024-06-17 10:07:38 +02:00
Anonymous 4781cf1037 🌐 Add translations for: Latvian.
Currently translated at 96.3% (1357 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2024-06-17 10:07:38 +02:00
Anonymous 5aa3b432bf 🌐 Add translations for: Korean.
Currently translated at 15.5% (219 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ko/
2024-06-17 10:07:38 +02:00
Anonymous 47401aae99 🌐 Add translations for: Bengali.
Currently translated at 1.0% (15 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/bn/
2024-06-17 10:07:37 +02:00
Anonymous 27473003b7 🌐 Add translations for: Faroese.
Currently translated at 11.2% (159 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2024-06-17 10:07:37 +02:00
Anonymous fa8bc7d40d 🌐 Add translations for: Ukrainian (ukr_UA).
Currently translated at 14.9% (210 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ukr_UA/
2024-06-17 10:07:37 +02:00
Anonymous f352cdf9a3 🌐 Add translations for: Croatian.
Currently translated at 72.2% (1017 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/hr/
2024-06-17 10:07:37 +02:00
Anonymous 3d68d454fe 🌐 Add translations for: Tamil.
Currently translated at 3.2% (46 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ta/
2024-06-17 10:07:37 +02:00
Anonymous 9a9eca7813 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 94.6% (1332 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2024-06-17 10:07:36 +02:00
Anonymous f3d82c915b 🌐 Add translations for: Finnish.
Currently translated at 3.9% (55 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fi/
2024-06-17 10:07:36 +02:00
Anonymous 5185d1eaa5 🌐 Add translations for: Czech.
Currently translated at 92.8% (1307 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/cs/
2024-06-17 10:07:36 +02:00
Anonymous 6abf792e0f 🌐 Add translations for: Basque.
Currently translated at 83.4% (1175 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/eu/
2024-06-17 10:07:36 +02:00
Anonymous 4d56f86719 🌐 Add translations for: Japanese.
Currently translated at 16.6% (235 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ja/
2024-06-17 10:07:35 +02:00
Anonymous f033814f96 🌐 Add translations for: Galician.
Currently translated at 26.7% (376 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/gl/
2024-06-17 10:07:35 +02:00
Anonymous 2e3dbfeb27 🌐 Add translations for: Lithuanian.
Currently translated at 8.4% (119 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lt/
2024-06-17 10:07:35 +02:00
Anonymous a50e431c7a 🌐 Add translations for: Polish.
Currently translated at 81.3% (1146 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pl/
2024-06-17 10:07:35 +02:00
Anonymous 59e18e8d4c 🌐 Add translations for: Italian.
Currently translated at 32.2% (454 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2024-06-17 10:07:34 +02:00
Anonymous 731299fe60 🌐 Add translations for: Persian.
Currently translated at 47.8% (674 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2024-06-17 10:07:34 +02:00
Anonymous 5cb2c1bbe4 🌐 Add translations for: Malayalam.
Currently translated at 3.7% (53 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ml/
2024-06-17 10:07:34 +02:00
Anonymous 5362d9f5e9 🌐 Add translations for: Chinese (Traditional).
Currently translated at 45.8% (646 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/
2024-06-17 10:07:34 +02:00
Anonymous 981cd92b26 🌐 Add translations for: Hebrew.
Currently translated at 96.0% (1353 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2024-06-17 10:07:34 +02:00
Anonymous 77b70cac60 🌐 Add translations for: Indonesian.
Currently translated at 96.0% (1352 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2024-06-17 10:07:33 +02:00
Anonymous ac8775565b 🌐 Add translations for: Arabic.
Currently translated at 80.0% (1127 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ar/
2024-06-17 10:07:33 +02:00
Anonymous 5651b72c0f 🌐 Add translations for: Romanian.
Currently translated at 90.0% (1268 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2024-06-17 10:07:33 +02:00
Anonymous 3e54ab1c3c 🌐 Add translations for: Danish.
Currently translated at 7.4% (105 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/da/
2024-06-17 10:07:33 +02:00
Anonymous 81482c8350 🌐 Add translations for: German.
Currently translated at 97.0% (1367 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2024-06-17 10:07:32 +02:00
Anonymous 9f25c6eb09 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 81.3% (1145 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2024-06-17 10:07:32 +02:00
Anonymous 4d778e71fe 🌐 Add translations for: Chinese (Simplified).
Currently translated at 95.8% (1349 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2024-06-17 10:07:32 +02:00
Anonymous 36d0e6eb36 🌐 Add translations for: Turkish.
Currently translated at 97.1% (1368 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2024-06-17 10:07:32 +02:00
Anonymous 492a975a3a 🌐 Add translations for: Russian.
Currently translated at 56.1% (790 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2024-06-17 10:07:31 +02:00
Anonymous ac14a6315b 🌐 Add translations for: Greek.
Currently translated at 36.9% (520 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/el/
2024-06-17 10:07:31 +02:00
Anonymous 37abe7d7f1 🌐 Add translations for: French.
Currently translated at 96.3% (1356 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2024-06-17 10:07:31 +02:00
Anonymous 0cebd89c01 🌐 Add translations for: Catalan.
Currently translated at 75.0% (1057 of 1408 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ca/
2024-06-17 10:07:30 +02:00
Hosted Weblate 2f49b419bd Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/
2024-06-17 10:02:54 +02:00
Stephan Paternotte c144a20012 🌐 Add translations for: Dutch.
Currently translated at 100.0% (1390 of 1390 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2024-06-17 10:02:52 +02:00
Stas Haas 1cf79fb56e 🌐 Add translations for: German.
Currently translated at 99.9% (1389 of 1390 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2024-06-17 10:02:52 +02:00
Oğuz Ersen 68724e6236 🌐 Add translations for: Turkish.
Currently translated at 100.0% (1390 of 1390 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2024-06-17 10:02:52 +02:00
Andrey Antukh f529b339c6 Merge remote-tracking branch 'origin/staging' into develop 2024-06-17 10:02:34 +02:00
Andrés Moya e0906be6e7 Revert "🐛 Add validator and repair for duplicated slots"
This reverts commit db2ba42b14.
2024-06-17 09:56:27 +02:00
Pablo Alba db2ba42b14 🐛 Add validator and repair for duplicated slots 2024-06-17 09:23:50 +02:00
Alejandro 1d28be07d0 Merge pull request #4747 from penpot/niwinz-bugfix-2
🔥 Fix many inconsistencies on the onboarding translation strings
2024-06-17 06:58:23 +02:00
Pablo Alba cc1b51cb2c Add fix to locate files with duplicated slots 2024-06-14 13:57:30 +02:00
Aitor Moreno 22ede6b08e Merge pull request #4731 from penpot/niwinz-bugfix-6
🐛 Fix many race conditions on thumbnail generation process
2024-06-14 13:15:10 +02:00
Andrey Antukh a3ac22f781 🔥 Fix many inconsistencies on the onboarding translation strings
Mainly related to the quiestions modal
2024-06-14 11:55:57 +02:00
Pablo Alba 2d9c5d1ac4 Merge pull request #4742 from penpot/hiru-fix-detach-swapped-nested
Fix detach swapped nested
2024-06-14 11:04:41 +02:00
Andrés Moya 1ac6b556b0 🐛 Fix detach when a nested copy has been swapped 2024-06-14 10:45:42 +02:00
Andrés Moya b5477c4e30 🔧 Improve debug utility 2024-06-14 10:45:20 +02:00
Alejandro Alonso b991391667 Merge remote-tracking branch 'origin/staging' into develop 2024-06-14 08:10:51 +02:00
Alejandro 7a05580df3 Merge pull request #4745 from penpot/niwinz-bugfix-9
🐛 Clear persistence status on server error
2024-06-14 08:10:11 +02:00
Alejandro Alonso 2c506fc721 🐛 Fix SVG attrs are not handled correctly when exporting/importing .zip 2024-06-14 07:58:18 +02:00
Alejandro Alonso 043769c255 Remove a/b testing code for onboarding questions 2024-06-14 07:45:59 +02:00
Andrey Antukh 88540eeedd Merge remote-tracking branch 'origin/staging' into develop 2024-06-14 07:45:53 +02:00
Alejandro 68741bb56f Merge pull request #4744 from penpot/niwinz-bugfix-8
 Fix translation strings inconsistencies on the onboarding questions modals
2024-06-14 07:00:56 +02:00
Alejandro Alonso 0d23f4ab5d 🐛 Workspace-palette items stay hidden when opening with keyboard-shortcut 2024-06-14 00:06:08 +02:00
Belén Albeza 599bc8dbe7 📎 Remove unused playwright config file in root 2024-06-14 00:05:13 +02:00
Andrey Antukh f463a1989f 🐛 Clear persistence status on server error
This avoids the problem of permanently keeping on the persistence
queue a problematic change.
2024-06-14 00:01:59 +02:00
Andrey Antukh a9f5b1559f Make translations consistent on the onboarding questions modal 2024-06-13 23:51:23 +02:00
Andrey Antukh b4c9528603 Add missing frontend translations to devenv watcher 2024-06-13 18:01:46 +02:00
Eva Marco a84c2e1138 Merge pull request #4741 from penpot/superalex-fix-persistence-status-widget-color
🐛 Fix persistence status widget lost saving status color
2024-06-13 16:11:53 +02:00
Alejandro Alonso 1ad2171933 🐛 Fix persistence status widget lost saving status color 2024-06-13 14:47:42 +02:00
Eva Marco 195305e4c8 Merge pull request #4737 from penpot/niwinz-bugfix-7
🐛 Fix onboarding step1 values
2024-06-13 13:05:05 +02:00
Andrey Antukh 535246f1c6 🐛 Fix onboarding step1 values 2024-06-13 12:45:36 +02:00
Alejandro Alonso 7e87362a39 Merge remote-tracking branch 'origin/staging' into develop 2024-06-13 11:04:58 +02:00
Alejandro 1a7cdfbf56 Merge pull request #4734 from penpot/superalex-cherry-picking
 Cherry-pick
2024-06-13 10:58:38 +02:00
alonso.torres d48e486668 🐛 Fix problem moving layout to frame 2024-06-13 10:47:22 +02:00
Alejandro Alonso c15c3b14ee Add e2e tests for fix color palette default library 2024-06-13 10:47:22 +02:00
Alejandro 5c1e7adf7e Merge pull request #4724 from penpot/palba-fix-open-overlay-self
🐛 Fix open overlay relative to a frame
2024-06-13 06:34:14 +02:00
Pablo Alba 67e1081f11 🐛 Fix open overlay relative to a frame 2024-06-13 06:33:48 +02:00
Alejandro dd69f8f29b Merge pull request #4727 from penpot/eva-fix-scroll-select
🐛 Fix move scrollbar create a selection rectangle
2024-06-13 06:28:40 +02:00
Eva Marco 232cfea709 🐛 Fix move scrollbar create a selection rectangle 2024-06-13 06:28:26 +02:00
Alejandro 09a671cffa Merge pull request #4730 from penpot/azazeln28-fix-toolbar-keeps-hiding-clicking-outside
🐛 Fix toolbar keeps hiding clicking outside
2024-06-12 17:07:56 +02:00
AzazelN28 b4004af255 🐛 Fix toolbar keeps hiding when clicking outside 2024-06-12 17:07:35 +02:00
Aitor Moreno a150e1c2e5 Merge pull request #4728 from penpot/superalex-toolbar-keeps-toggling-on-and-off
🐛 Toolbar keeps toggling on and off on spacebar press
2024-06-12 17:05:30 +02:00
Alejandro Alonso 740a872231 🐛 Toolbar keeps toggling on and off on spacebar press 2024-06-12 16:41:06 +02:00
Andrey Antukh ec7aa64c62 Disable http cache from get-file-object-thumbnails RPC method 2024-06-12 16:13:34 +02:00
Andrey Antukh c1463ebd12 🐛 Fix many race conditions on thumbnail generation process 2024-06-12 16:04:08 +02:00
Alejandro Alonso bbd9207191 Improve email verify threshold 2024-06-12 13:56:19 +02:00
Alejandro 82a5754923 Merge pull request #4729 from penpot/hiru-fix-detach-slots
🐛 Fix swap slots when detaching a copy with subcopies
2024-06-12 13:54:31 +02:00
Andrés Moya 03aa0817f7 🐛 Fix swap slots when detaching a copy with subcopies 2024-06-12 13:17:17 +02:00
Alejandro Alonso 058a72b817 🐛 Fix internal error when I set up a stroke for some objects without and with stroke 2024-06-12 13:00:39 +02:00
Alejandro Alonso 9f7a002a78 🐛 Fix misaligned input on comments 2024-06-12 10:20:18 +02:00
Alejandro Alonso a861691ffd 🐛 Fix change color on imported svg also changes the stroke alignment 2024-06-12 10:08:30 +02:00
Alejandro Alonso a5ba9d113f Improve create group tests 2024-06-12 10:07:34 +02:00
Alejandro 132908c224 Merge pull request #4723 from penpot/ladybenko-7466-layers-sidebar
Fix layers tree not expanding to the bottom edge
2024-06-12 09:36:47 +02:00
Belén Albeza f417445f31 Refactor WorkspacePage so it has more semantic locators 2024-06-12 09:23:30 +02:00
Belén Albeza 7719cd8d0b ♻️ Move libraries test to sidebar spec file 2024-06-12 09:23:30 +02:00
Belén Albeza 04f341ce1d 🐛 Fix layers tree not expanding towards the bottom edge 2024-06-12 09:23:30 +02:00
Alejandro 00f7ea2b56 Merge pull request #4720 from penpot/niwinz-bugfix-5
 Improve how email is passed on post-signup page
2024-06-12 09:00:29 +02:00
Alejandro f2cc363caa Merge pull request #4698 from penpot/eva-new-onboarding-integration-tests
 Add integration tests to new onboarding process
2024-06-12 08:57:17 +02:00
Eva Marco a90baa91c7 Add integration test to the onboarding process 2024-06-11 16:35:05 +02:00
Belén Albeza c6da42ee35 Merge pull request #4721 from penpot/alotor-bugfix
🐛 Fix problem moving layout to frame
2024-06-11 15:06:08 +02:00
alonso.torres f88bb4e204 🐛 Fix problem moving layout to frame 2024-06-11 14:55:00 +02:00
Andrey Antukh 4057084981 Improve how email is passed on post-signup page 2024-06-11 14:12:07 +02:00
Alejandro 8f42be1096 Merge pull request #4710 from penpot/eva-fix-guides
🐛 Fix move guides with board
2024-06-11 14:06:34 +02:00
Alejandro 27d8d8649e Merge pull request #4718 from penpot/niwinz-bugfix-4
 Add minor improvements on how we handle logout
2024-06-11 14:02:19 +02:00
Alejandro 136b115006 Merge pull request #4717 from penpot/niwinz-bugfix-3
🐛 Fix issue with annotation menu rerendering
2024-06-11 13:55:28 +02:00
Eva Marco 0e0ceaa9bf 🐛 Fix move guides with board 2024-06-11 12:54:43 +02:00
Andrey Antukh c0919aff51 Merge remote-tracking branch 'origin/staging' into develop 2024-06-11 11:27:16 +02:00
Andrey Antukh eba6f51953 📎 Update THANKYOU.md file 2024-06-11 11:03:54 +02:00
Andrey Antukh c14f6aecf3 📎 Update THANKYOU.md file 2024-06-11 11:03:54 +02:00
Andrey Antukh 6896a4e9f0 Add minor improvements on how logout is handled
The profile-id is now required on the body of logout request
2024-06-11 11:03:54 +02:00
Pablo Alba 8825e9f80b 🐛 Fix show in view mode and interactions workflow 2024-06-11 11:01:24 +02:00
Alejandro Alonso 694e71c3fc Improve CHANGES.md format 2024-06-11 10:54:11 +02:00
Alejandro Alonso 46764a1e6e 🐛 Fix export boards loses opacity 2024-06-11 10:54:11 +02:00
Alejandro Alonso 3d7f399a50 🐛 Fix missing scroll in comments 2024-06-11 10:38:41 +02:00
Alejandro Alonso c5bf2a775e 🐛 Fix group automatically selected after creation 2024-06-11 10:38:03 +02:00
Andrey Antukh 2d527b2caf 🐛 Fix issue with annotation menu rerendering 2024-06-11 10:29:26 +02:00
Alejandro 38fa5be862 Merge pull request #4653 from penpot/eva-new-onboarding-modals
 Update onboarding modals
2024-06-11 10:19:26 +02:00
Andrey Antukh 93ac80f217 Improve onboarding initialization 2024-06-11 09:47:03 +02:00
Alejandro Alonso 3bb5db6490 Merge remote-tracking branch 'origin/staging' into develop 2024-06-11 07:34:48 +02:00
Alejandro 88e2e11634 Merge pull request #4713 from penpot/hiru-bugs-export-zip
Fix bugs in the export to zip file
2024-06-11 07:33:01 +02:00
Alejandro 4db189f90d Merge pull request #4714 from penpot/niwinz-persistence-bugfix-1
🐛 Fix race condition between shape modifiation and persistence
2024-06-11 07:26:02 +02:00
Andrey Antukh d35569dc55 Simplify transducer definition for proces redo changes 2024-06-10 18:59:39 +02:00
Andrey Antukh e4e56828f6 💄 Fix internal naming for make code more self-explanatory 2024-06-10 18:56:59 +02:00
Andrey Antukh 3c1086dfcc 🐛 Fix race condition between shape modifiation and persistence 2024-06-10 18:51:48 +02:00
Andrey Antukh b635427f91 🐛 Fix incorrect order of update-index operations 2024-06-10 17:50:46 +02:00
Andrés Moya 9a4c45c8a3 🐛 Fix export touched attributes 2024-06-10 17:09:46 +02:00
alonso.torres 33166032f1 ⬆️ Update plugins runtime 2024-06-10 15:12:51 +02:00
alonso.torres 5233654da2 Add support for plugin data into penpot objects 2024-06-10 15:12:51 +02:00
alonso.torres 4d4a3a512d 💄 Style changes to the plugins modal 2024-06-10 15:12:51 +02:00
alonso.torres 411fe5448b 🐛 Fix rename layers for plugins 2024-06-10 15:12:51 +02:00
Andrey Antukh 273a5f7a0a Improve state management on onboarding team modal 2024-06-10 14:36:25 +02:00
Andrey Antukh 0dda893d73 Improve state management on onboarding newsletter modal 2024-06-10 14:36:25 +02:00
Andrey Antukh 2629fa0662 Improve state management on onboarding questions modal 2024-06-10 14:36:24 +02:00
Eva Marco fda6deaa4f Update onboarding modals 2024-06-10 14:36:24 +02:00
Andrey Antukh 55ce9bef49 🐛 Fix incorrect error merging mechanism on form validation 2024-06-10 14:36:24 +02:00
Andrey Antukh e7a8c25883 🐛 Fix touched handling on multi-input form component 2024-06-10 14:36:24 +02:00
Andrey Antukh 88b65cd864 🐛 Fix incorrect compilation of css-case macro in a small corne case 2024-06-10 14:36:24 +02:00
Andrés Moya 257dab4775 🐛 Fix export hidden shapes 2024-06-10 11:09:14 +02:00
Alejandro Alonso edfc47d3de Add e2e tests for fix color palette default library 2024-06-10 09:29:58 +02:00
Alejandro d8184fb756 Merge pull request #4703 from penpot/palba-bugfixing-009
Palba bugfixing 009
2024-06-10 06:45:47 +02:00
Pablo Alba 96993a6ebd 🐛 Fix "Share prototypes" modal remains open 2024-06-10 06:45:29 +02:00
Pablo Alba 1f7b5a0f7f 🐛 Fix black line is displaying after show main 2024-06-10 06:45:27 +02:00
Alejandro a553de3c98 Merge pull request #4699 from penpot/ladybenko-7805-viewer-zoom
Fix zoom setting not updating the URL in viewer
2024-06-10 06:40:02 +02:00
Pablo Alba d9618c6213 Merge pull request #4700 from penpot/alotor-bugfix
Alotor bugfix
2024-06-07 16:33:41 +02:00
alonso.torres 3ad91d1c9d 🐛 Fix problem with flex layout fit to content not positioning correctly children 2024-06-07 15:25:57 +02:00
alonso.torres 2c21a049e1 🐛 Fix problem with moving+selection not working properly 2024-06-07 14:04:03 +02:00
Belén Albeza 724bc24063 Add test for #7805 2024-06-07 13:44:54 +02:00
Belén Albeza 96b7fb7f12 🐛 Fix viewer querystring not being updated with zoom type 2024-06-07 13:15:20 +02:00
Pablo Alba f052c81ee1 🐛 Fix issue with annotation menu rerendering (2) 2024-06-07 13:08:43 +02:00
Pablo Alba b170a619cd Merge pull request #4695 from penpot/niwinz-bugfix-annotations
🐛 Fix issue with annotation menu rerendering
2024-06-07 13:06:40 +02:00
Alejandro d29215a282 Merge pull request #4675 from penpot/niwinz-enhancements-1
 Add backward compatibility fixes for email whitelisting
2024-06-07 13:04:34 +02:00
Andrey Antukh 4d2f82e03a 🐛 Fix issue with annotation menu rerendering 2024-06-07 12:55:33 +02:00
alonso.torres da738ba1e9 Merge remote-tracking branch 'origin/staging' into develop 2024-06-07 12:21:57 +02:00
Andrey Antukh ae90d59b43 Remove spec usage o teams rpc ns 2024-06-07 10:30:14 +02:00
Andrey Antukh 046ef7eb6e 🔥 Replace clojure.spec with simple assert on tokens ns 2024-06-07 10:30:14 +02:00
Andrey Antukh 25265cec70 Remove claims from token validation error report 2024-06-07 10:30:14 +02:00
Andrey Antukh 40f39681ad Add backward compatibility fixes for email whitelisting 2024-06-07 10:30:14 +02:00
Alejandro 70c9314f7f Merge pull request #4685 from penpot/palba-fix-validation-error-coping-main-frame
🐛 Fix verification error on coping main component with frame over a copy
2024-06-07 09:59:39 +02:00
Alejandro 7bf4305269 Merge pull request #4682 from penpot/ladybenko-7686-mixed-constraints
Fix constraints dropdown not showing "Mixed"
2024-06-07 07:44:04 +02:00
Alejandro 49879caf2c Merge pull request #4691 from penpot/alotor-fix-components
Alotor fix components
2024-06-07 07:40:26 +02:00
alonso.torres 33bf8892c0 🐛 Fix problem when creating multiple components 2024-06-06 17:17:01 +02:00
Belén Albeza 4efab3e8c8 Add an integration test for #7686 (constraints dropdown) 2024-06-06 15:30:21 +02:00
Belén Albeza c8ff8fcbf7 🐛 Fix multiple constraints dropdown not showing 'mixed' 2024-06-06 15:29:28 +02:00
Belén Albeza 2f84978274 Merge pull request #4687 from penpot/superalex-e2e-tests-color-palette
 Add e2e tests for fix color palette default library
2024-06-06 15:27:48 +02:00
Belén Albeza da40d662be Merge pull request #4684 from penpot/superalex-speed-up-e2e-testing
 Speed up e2e testing
2024-06-06 15:13:07 +02:00
Andrey Antukh 1d88c7e92d ⬆️ Upgrade devenv linux distribution version
We pass from ubuntu 22.04 LTS to Debian 12 (bookworm)
Update postgresql from 15 to 16
Update JVM21 to the latest minor version
2024-06-06 15:06:16 +02:00
Alejandro 1a312b08b7 Merge pull request #4676 from penpot/ladybenko-7988-fix-viewer-logo
🐛 Fix link in penpot logo spanning way below it (in viewer)
2024-06-06 13:06:47 +02:00
Alejandro Alonso 08c3901134 Speed up e2e testing 2024-06-06 13:04:27 +02:00
Alejandro Alonso 5af9bb1cdb Add e2e tests for fix color palette default library 2024-06-06 12:54:31 +02:00
Andrey Antukh c8130e9453 Send profile zoom and vport/vbox on presence notifications 2024-06-06 12:02:43 +02:00
Andrés Moya ccd687cbf3 Merge branch 'staging' into develop 2024-06-06 11:21:42 +02:00
Andrés Moya bc3aac1597 📖 Update change log 2024-06-06 10:29:11 +02:00
Andrés Moya 41024728ae 🐛 Fix importing a component from a zip file in v2 2024-06-06 10:29:11 +02:00
Pablo Alba 91fd8c4f81 🐛 Fix verror on coping main component with frame over a copy 2024-06-06 10:24:39 +02:00
Belén Albeza 67ababf1ed 🐛 Fix link in penpot logo spanning way below it (in viewer) 2024-06-06 09:30:52 +02:00
Belén Albeza 2aa1b97769 Merge pull request #4678 from penpot/superalex-bugfixing
🐛 Bugfixing
2024-06-05 14:11:36 +02:00
Alejandro Alonso ca73a79cfe 📎 Prepare new development cycle 2024-06-05 12:46:11 +02:00
Anonymous 4e0c6f847f 🌐 Add translations for: Yoruba.
Currently translated at 87.7% (1220 of 1390 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/yo/
2024-06-05 12:42:53 +02:00
Anonymous ee2f4c11c0 🌐 Add translations for: Igbo.
Currently translated at 38.9% (542 of 1390 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ig/
2024-06-05 12:42:53 +02:00
Anonymous 5814559880 🌐 Add translations for: Hausa.
Currently translated at 92.5% (1287 of 1390 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ha/
2024-06-05 12:42:53 +02:00
Anonymous 2569282d91 🌐 Add translations for: Korean.
Currently translated at 16.0% (223 of 1390 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ko/
2024-06-05 12:42:53 +02:00
Anonymous 8f5a35f5f9 🌐 Add translations for: German.
Currently translated at 99.1% (1378 of 1390 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2024-06-05 12:42:53 +02:00
Anonymous 7971bcf7d9 🌐 Add translations for: Chinese (Simplified).
Currently translated at 98.5% (1370 of 1390 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2024-06-05 12:42:52 +02:00
Andrey Antukh 64a5c68cc9 Merge branch 'translations' into develop 2024-06-05 12:41:12 +02:00
Andrey Antukh 028812dc10 Merge remote-tracking branch 'weblate/develop' into translations 2024-06-05 12:40:07 +02:00
Alejandro Alonso 5eee1cdbf3 Merge remote-tracking branch 'origin/staging' 2024-06-05 12:26:23 +02:00
Alejandro Alonso fc7294c10d Make CHANGES format uniform 2024-06-05 09:37:53 +02:00
Alejandro Alonso 697b6776ba 🐛 Fix color palette default library 2024-06-05 06:38:22 +02:00
alonso.torres 3a40c7f59c ⬆️ Update plugin runtime 2024-06-04 16:44:24 +02:00
alonso.torres 3e2ccbc85f Add infor for users 2024-06-04 16:44:24 +02:00
alonso.torres 98c550b20e Update content of path shapes in plugins 2024-06-04 16:44:24 +02:00
alonso.torres bf66e12075 Allow masks, booleans, and some path read only 2024-06-04 16:44:24 +02:00
alonso.torres 55c27f140a Create paths, booleans and ellipses through plugins api 2024-06-04 16:44:24 +02:00
alonso.torres e4e537b960 Add support for components in plugins 2024-06-04 16:44:24 +02:00
alonso.torres 3209511557 Add support for colors and typographies 2024-06-04 16:44:24 +02:00
Alejandro d4a0541926 Merge pull request #4670 from penpot/niwinz-email-shortening
 Abbreviate profile name on emails
2024-06-04 13:01:35 +02:00
Pablo Alba 5872bf024c Add test for remove swap slot on detach parent 2024-06-04 12:24:31 +02:00
Pablo Alba 5b88589157 Merge remote-tracking branch 'origin/staging' into develop 2024-06-04 11:57:59 +02:00
Andrey Antukh b6b6822c31 Abbreviate profile name on emails 2024-06-04 11:32:28 +02:00
Alejandro 622d1faffc Merge pull request #4664 from penpot/niwinz-email-blacklist
 Add email blacklist mechanism
2024-06-04 11:18:28 +02:00
Pablo Alba 54c506100d 🐛 Fix swap slot is not removed on parent detach (2) 2024-06-04 11:17:06 +02:00
Andrey Antukh 5aa62ef1dd Add email blacklist mechanism 2024-06-04 10:45:55 +02:00
Alejandro 83090826f7 Merge pull request #4463 from penpot/niwinz-workspace-persistence-3
♻️ Refactor frontend persistence layer
2024-06-04 10:38:37 +02:00
Pablo Alba 7c64ed84f1 🐛 Fix swap slot is not removed on parent detach 2024-06-04 10:20:26 +02:00
Andrey Antukh 6436ef334b ♻️ Refactor persistence layer 2024-06-04 10:15:32 +02:00
Alejandro 5fef0b64f4 Merge pull request #4665 from penpot/niwinz-sanitize-audit
 Add stricter validation for audit events
2024-06-04 10:12:27 +02:00
Andrey Antukh 3294058e16 Add stricter validation for audit events 2024-06-04 09:54:41 +02:00
Alejandro d679001955 Merge pull request #4663 from penpot/eva-bugfixing-2.1
🐛 Bugfixing
2024-06-04 09:54:29 +02:00
Eva Marco b74c5fc9b3 🐛 Fix demo account visible on login 2024-06-04 09:39:18 +02:00
Eva Marco f9692fde35 Allow library colors as recent colors 2024-06-04 09:39:15 +02:00
Eva Marco 53526b9957 🐛 Fix expand libraries when search results are present 2024-06-04 09:38:36 +02:00
Alejandro 38353f3728 Merge pull request #4660 from penpot/niwinz-update-deps
⬆️ Update dependencies
2024-06-04 09:37:00 +02:00
Eva Marco ee2ee326f3 Merge pull request #4662 from penpot/superalex-locking-degrees-on-path-edition
 Add locking degrees increment (hold shift) on path edition
2024-06-04 09:34:54 +02:00
Alejandro fabe2d3d1d Merge pull request #4666 from penpot/ladybenko-7559-fix-palette
Fixes for the color palette
2024-06-04 09:27:59 +02:00
Belén Albeza f8ca4c4343 🐛 Fix color name in circle bullets spanning over more than 2 lines 2024-06-04 09:08:59 +02:00
Belén Albeza 258aaf81d5 🐛 Fix color palette inner scroll width 2024-06-04 09:05:34 +02:00
Belén Albeza 8f0fd0a6e2 🐛 Fix wrong css selector applied globally and affecting the palette 2024-06-04 09:05:34 +02:00
Belén Albeza de7880b4a2 🐛 Fix color names in palette being clipped and not breaking at dot characters 2024-06-04 09:05:34 +02:00
Pablo Alba 06221c37a3 Update THANKYOU.md 2024-06-04 09:05:34 +02:00
Alejandro Alonso e200ed616c 🎉 Add a/b test for onboarding questions 2024-06-04 09:05:34 +02:00
Andrés Moya 5e8c164a44 🐛 Add migration to remove all misplaced slots 2024-06-03 17:17:14 +02:00
Andrés Moya 3472359168 🐛 Add validate and repair for :misplaced-slot 2024-06-03 17:17:02 +02:00
Pablo Alba 928fec0903 Merge pull request #4661 from penpot/hiru-improve-slot-validation
🐛 Add validate and repair for :misplaced-slot
2024-06-03 16:08:54 +02:00
Pablo Alba 53513a523e Update THANKYOU.md 2024-06-03 13:04:49 +02:00
Alejandro Alonso b5c419512f Add locking degrees increment (hold shift) on path edition 2024-06-03 13:01:45 +02:00
Andrés Moya 21052c661c 🐛 Add migration to remove all misplaced slots 2024-06-03 11:37:13 +02:00
Andrés Moya b700a926c2 🐛 Add validate and repair for :misplaced-slot 2024-06-03 10:55:29 +02:00
Andrey Antukh 3bdcaa12e7 ⬆️ Update AWS S3 SDK dependency on backend 2024-05-31 13:31:56 +02:00
Andrey Antukh 87e3dc1c7c ⬆️ Update dependencies across all modules 2024-05-31 13:28:32 +02:00
Andrey Antukh 76ca1d9be8 ⬆️ Update frontend npm dependencies 2024-05-31 12:59:11 +02:00
Andrey Antukh e2dd6a3791 ⬆️ Update playwright 2024-05-31 12:34:07 +02:00
Andrey Antukh 1d7c7f4a72 ⬆️ Update react to 18.3.1 2024-05-31 11:57:38 +02:00
Andrey Antukh 3c3ef57da2 Merge remote-tracking branch 'origin/staging' into develop 2024-05-31 10:08:21 +02:00
Aitor Moreno 1b17742fc3 Merge pull request #4654 from penpot/superalex-a-b-test-onboarding-questions
🎉 Add a/b test for onboarding questions
2024-05-31 09:50:00 +02:00
Alejandro Alonso 98038b10a0 🎉 Add a/b test for onboarding questions 2024-05-30 14:54:40 +02:00
Alejandro Alonso 91ca55742a Merge remote-tracking branch 'origin/staging' 2024-05-30 12:00:03 +02:00
alonso.torres 98f3ef2755 ⬆️ Update plugins runtime 2024-05-30 10:11:15 +02:00
alonso.torres ae774b10be Removed mandatory manifest property 2024-05-30 10:11:15 +02:00
Andrey Antukh 4bd585739a Merge branch 'mbiesiad-develop' into develop 2024-05-30 00:10:54 +02:00
Michal 9646f13a22 📚 Fix markdown bugs on changelog
Fix Markdown :bug
2024-05-30 00:10:37 +02:00
Andrés Moya 83327ef278 🔧 Change backend test runner to kaocha 2024-05-29 19:05:04 +02:00
Andrés Moya 0a3a6e19f1 Add test for swap slots bug 2024-05-29 15:12:19 +02:00
Andrés Moya 81ea392da6 Merge branch 'staging' into develop 2024-05-29 15:10:44 +02:00
Andrés Moya e83c90203e 🐛 Migration to remove bad swap-slots 2024-05-29 15:09:04 +02:00
Pablo Alba b4a7a15045 Revert "🐛 swap slot is not copied on copy-paste of a main"
This reverts commit 2a752e3625.
2024-05-29 15:09:04 +02:00
Alejandro Alonso b847754e3b Support external feature flags 2024-05-29 13:18:47 +02:00
alonso.torres 007ab3d909 Add library edition mode for plugins 2024-05-29 12:54:49 +02:00
Belén Albeza b95cb3d4c5 Merge pull request #4638 from penpot/ladybenko-7936-setup-temp-visual-testing
 Setup temporary visual regression testing for the design system
2024-05-29 09:28:53 +02:00
Belén Albeza 804f4bb176 🐛 Fix color picker position 2024-05-28 20:54:50 +02:00
alonso.torres d073f51790 🐛 Fix problem with plugin edition text 2024-05-28 20:54:11 +02:00
Alejandro 9c5f7373de Merge pull request #4641 from penpot/hiru-validate-swap-slots
🔧 Add temporary validation to catch a bug
2024-05-28 16:33:10 +02:00
Andrés Moya 3e8c665b7f 🔧 Add optional validation to check missing swap slots 2024-05-28 16:19:30 +02:00
Belén Albeza d4dc87a740 Setup temporary visual regression testing for the design system 2024-05-28 14:54:26 +02:00
alonso.torres a2df74be38 Improved styles for plugins dialog 2024-05-28 13:44:39 +02:00
alonso.torres 032e551dc1 🐛 Fix problem with shadows 2024-05-28 13:44:39 +02:00
Alejandro Alonso dad91421b1 📚 Update changelog 2024-05-28 11:27:18 +02:00
Alejandro Alonso 4ee9272177 Merge remote-tracking branch 'origin/staging' into develop 2024-05-28 10:43:00 +02:00
Alejandro Alonso cf6bea1974 Merge remote-tracking branch 'origin/staging' 2024-05-28 10:42:30 +02:00
Alejandro Alonso b8bff31aca 📎 Increase version 2024-05-28 10:42:01 +02:00
Alejandro Alonso 6d8fe193fb Merge remote-tracking branch 'origin/staging' into develop 2024-05-28 08:14:20 +02:00
Alejandro Alonso 54c4e9af6c Merge remote-tracking branch 'origin/staging' 2024-05-28 08:10:21 +02:00
Alejandro Alonso 07d859f9bd 🐛 Fix penpot.app links 2024-05-28 08:08:53 +02:00
Alejandro c918e06859 Merge pull request #4636 from penpot/niwinz-bugfix-2
 Minor changes
2024-05-28 08:07:46 +02:00
alonso.torres 313e501a2a Expose text properties for shapes 2024-05-28 08:04:06 +02:00
alonso.torres 9498006fb8 🐛 Fix problem with border radius 2024-05-28 08:04:06 +02:00
alonso.torres 0576884a8b 🐛 Fix problem when setting shadows/blurs 2024-05-28 08:04:06 +02:00
alonso.torres f0427e454e Add default icon for plugins 2024-05-28 08:04:06 +02:00
Alejandro 0b8604f9ea Merge pull request #4633 from penpot/niwinz-objects-gc-locking
 Improve object deletion flow
2024-05-27 16:20:50 +02:00
Andrey Antukh 121bff4eac Send only necessary data on profile update 2024-05-27 16:06:27 +02:00
Andrey Antukh 408ca338e7 📎 Make public default profile audit props 2024-05-27 16:06:27 +02:00
Alejandro d008d82a11 Merge pull request #4634 from penpot/niwinz-xdomain-cookie
 Improve auth-data xdomain cookie
2024-05-27 11:34:58 +02:00
Andrey Antukh 574c8d1789 Move library-absorb operation to async task
And make it not mandatory in case of failure
2024-05-27 11:19:15 +02:00
Andrey Antukh 39119ac040 Reuse team deletion logic on orphan teams gc task 2024-05-27 11:17:00 +02:00
Andrey Antukh 761bbb7334 Add srepl helpers for delete/restore teams, projects, and files 2024-05-27 11:17:00 +02:00
Andrey Antukh abff7d324d Improve auth-data xdomain cookie 2024-05-27 10:58:05 +02:00
Chan Young Park 6c34706160 🌐 Add translations for: Korean.
Currently translated at 16.2% (224 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ko/
2024-05-25 20:09:22 +02:00
Alejandro c3c6879a2f Merge pull request #4616 from penpot/hiru-prepare-builder-for-figma-exporter
Prepare builder for figma exporter
2024-05-24 14:57:15 +02:00
Alejandro Alonso b073c23ced Merge remote-tracking branch 'origin/staging' into develop 2024-05-24 13:16:53 +02:00
Alejandro Alonso 39613944bb Merge remote-tracking branch 'origin/staging' 2024-05-24 13:15:59 +02:00
Eva Marco 9194e257b6 🐛 Fix project name ellipsis 2024-05-24 13:15:09 +02:00
Andrés Moya 7bcb2b928d 🔧 Remove trace 2024-05-24 13:09:27 +02:00
Andrés Moya 3bf76e8d0f 🐛 Better handling of components v2 in file builder 2024-05-24 13:09:27 +02:00
Pablo Alba 260c0e0678 Add copying and duplicating component frontend tests 2024-05-24 12:58:18 +02:00
alonso.torres 519b2d7f04 🐛 Fix problem when initializing plugin 2024-05-24 12:22:09 +02:00
Belén Albeza 4b05ee35b8 Merge pull request #4607 from penpot/ladybenko-7845-migrate-storybook-compile
 Remove storybook dependency on Gulp
2024-05-24 09:36:38 +02:00
Alejandro 5ab4ed9a05 Merge pull request #4621 from penpot/niwinz-objects-gc-locking
 Reduce locking on objects-gc task
2024-05-24 09:04:11 +02:00
Chan Young Park a217d2085a 🌐 Add translations for: Korean.
Currently translated at 15.7% (217 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ko/
2024-05-23 22:09:23 +02:00
Andrey Antukh 72facff282 🔥 Remove unnecessary code from test helpers 2024-05-23 16:45:48 +02:00
Andrey Antukh f3346786ea 🔥 Remove unused object-update task 2024-05-23 16:36:43 +02:00
Andrey Antukh d241f45253 🔥 Remove unnecessary async touch operation 2024-05-23 16:36:35 +02:00
Andrey Antukh 584a0fdba1 Reduce locking on objects-gc task
The main issue was the long running gc operation that
affects storage objects with deduplication. The long running
transacion ends locking some storage object rows which collaterally
made operations like import-binfile become blocked indefinitelly
because of the same rows (because of deduplication).

The solution used in this commit is split operations on small
chunks so we no longer use long running transactions that holds
too many locks. With this approach we will make a window to work
concurrently all operarate the distinct operations that requires
locks on the same rows.
2024-05-23 16:35:54 +02:00
Alejandro b54b99becf Merge pull request #4623 from penpot/niwinz-bugfix-2
🐛 Fix incorrect password encoding on create-profile manage command
2024-05-23 16:21:15 +02:00
Andrey Antukh b357cf505d 🐛 Fix incorrect password encoding on create-profile manage command 2024-05-23 16:13:30 +02:00
Alejandro 12c34c6d42 Merge pull request #4620 from penpot/niwinz-bugfix-1
🐛 Bugfixes
2024-05-23 15:48:51 +02:00
Andrey Antukh 632165d6dc Merge branch 'AbdelatifAitBara-fix-docker-compose' into staging 2024-05-23 15:40:11 +02:00
AbdelatifAitBara 4d463537dd 🐛 Fix docker-compose version
Fixes #4545
2024-05-23 15:39:34 +02:00
Belén Albeza dd3c92c1f5 Remove storybook dependency on Gulp 2024-05-23 15:12:29 +02:00
Andrey Antukh 86b2ce4dab 🐛 Set proper default tenant on exporter 2024-05-23 14:42:52 +02:00
Andrey Antukh 29ef9f752a 🐛 Fix incorrect password encoding on create-profile manage command 2024-05-23 14:42:28 +02:00
alonso.torres 4c7a30a029 ⬆️ Update plugins runtime 2024-05-23 14:24:12 +02:00
alonso.torres 3e6d3a2306 Add finish event for plugins 2024-05-23 14:24:12 +02:00
alonso.torres 5af77af6da 🐛 Fix problem running plugins from menu 2024-05-23 14:24:12 +02:00
Alejandro fbd81e091d Merge pull request #4612 from penpot/niwinz-fix-devenv
 Improve yarn setup on devenv
2024-05-23 14:00:12 +02:00
Andrey Antukh d9e4ee67c3 📎 Enable frontend integration tests 2024-05-23 13:25:03 +02:00
Andrey Antukh 7e5068f38e ⬆️ Update draft-js dependency commit reference
Fixes yarn.lock file
2024-05-23 13:19:22 +02:00
Belén Albeza f74330dffe Add more timeout for playwright expects on CI 2024-05-23 13:18:51 +02:00
Alejandro Alonso 1d3d3f9b74 Add playwright dependencies to devenv docker 2024-05-23 13:18:49 +02:00
Alejandro b28432f7fd Merge pull request #4618 from penpot/niwinz-ci-enhancements
 Improve yarn setup on devenv
2024-05-23 13:00:50 +02:00
Andrey Antukh 7158c4fd43 Improve yarn setup on devenv
And update yarn version to 4.2.2
2024-05-23 12:21:07 +02:00
Alejandro 20a7d668f5 Merge pull request #4617 from penpot/niwinz-fix-ci
🐳 Fix CI
2024-05-23 11:50:07 +02:00
Andrey Antukh 2c30dde198 📎 Disable frontend integration tests 2024-05-23 11:38:16 +02:00
Andrey Antukh 7f8c600837 📎 Fix cljs linter issue 2024-05-23 11:37:46 +02:00
Andrey Antukh 96844f5bea 📎 Fix cljs fmt linter issue 2024-05-23 11:37:38 +02:00
Andrey Antukh 4cb0e97db4 Revert "⬆️ Update JVM and NODE deps on devenv Dockerfile"
This reverts commit 0a1b255da7.
2024-05-22 18:08:49 +02:00
alonso.torres 4f4ce174ae Changes to the manifest loading 2024-05-22 17:30:19 +02:00
alonso.torres 85ae3ff6f8 🐛 Fix problem with hot reload 2024-05-22 17:30:19 +02:00
alonso.torres 9fcb4216b6 Improved performance to update layout 2024-05-22 17:30:19 +02:00
Alejandro Alonso 47d7d24910 Add copying and duplicating component tests 2024-05-22 14:26:03 +02:00
Alejandro Alonso ae6cb551cb Merge remote-tracking branch 'origin/staging' 2024-05-22 13:03:20 +02:00
Alejandro Alonso eb168a6f9f Merge remote-tracking branch 'origin/staging' into develop 2024-05-22 13:02:44 +02:00
alonso.torres 4ad0cc2680 ⬆️ Update plugins runtime 2024-05-22 12:25:28 +02:00
Aitor Moreno 8a74f24977 Merge pull request #4600 from penpot/eva-bugfixing
Eva bugfixing
2024-05-22 11:38:03 +02:00
Aitor Moreno 0f181df767 Merge pull request #4604 from penpot/eva-fix-scrollbar-chrome
🐛  Fix scrollbar with on chrome after 121 release
2024-05-22 11:19:21 +02:00
alonso.torres dcb6315ff6 🐛 Fix problem with minification 2024-05-21 19:53:09 +02:00
alonso.torres 3ca5b13e27 New apis for plugins 2024-05-21 15:24:28 +02:00
alonso.torres d6de1fdbdf ♻️ Refactor plugins proxies internal data 2024-05-21 15:24:28 +02:00
Eva Marco 8d104de41c 🐛 Fix scrollbar with on chrome after 121 release 2024-05-21 13:43:54 +02:00
Alejandro b59dae57ca Merge pull request #4601 from penpot/niwinz-fire-package-lock
🔥 Remove package-lock.json file from repo root
2024-05-21 13:15:59 +02:00
Andrey Antukh 0a1b255da7 ⬆️ Update JVM and NODE deps on devenv Dockerfile 2024-05-20 12:10:13 +02:00
Andrey Antukh 8d7b2008f5 🔥 Remove package-lock.json file from repo root 2024-05-20 12:07:20 +02:00
Eva Marco c56c3f9588 🐛 Fix project name ellipsis 2024-05-20 11:28:52 +02:00
Eva Marco bd9ef6d221 🐛 Change login notification to error 2024-05-20 09:40:25 +02:00
Eva Marco 76fc2b04f4 🐛 Add fallback color to code generation 2024-05-20 09:38:16 +02:00
Eva Marco b48d568905 Merge pull request #4596 from penpot/ladybenko-fix-debug-css-template
Fix including Debug CSS in the index template
2024-05-20 09:34:23 +02:00
Amine Gdoura 50d1d19d25 🌐 Add translations for: Arabic.
Currently translated at 82.0% (1131 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ar/
2024-05-19 13:01:53 +02:00
Belén Albeza e74ab949ba 🐛 Include debug css in local dev only 2024-05-17 16:48:03 +02:00
Belén Albeza d30eca016e 💄 Reformat JS file 2024-05-17 16:47:15 +02:00
Eva Marco 4a3a5f701f 🐛 Fix demo account text color 2024-05-17 12:15:18 +02:00
Eva Marco 7461126d1a Merge pull request #4592 from penpot/ladybenko-set-e2e-workers-1
 Set default workers for front-end integration tests to 1
2024-05-17 11:05:10 +02:00
Belén Albeza 06ac5ae520 Set default workers for front-end integration tests to 1 2024-05-17 09:29:31 +02:00
Aitor Moreno a3d4d62269 Merge pull request #4585 from penpot/alotor-plugins-api
Updates to Plugin API and menu
2024-05-16 15:26:28 +02:00
Alejandro Alonso 614af9edc4 Add swap as override component tests 2024-05-16 13:27:06 +02:00
Pablo Alba d221241451 Components refactor: Add tests for remove swap slot on copy-paste 2024-05-16 13:25:25 +02:00
Andrés Moya 9c8a5484e1 🔥 Remove traces 2024-05-16 13:24:17 +02:00
Pablo Alba 385e8d837a Components refactor: Add tests for remove or keep swap slot 2024-05-16 13:23:02 +02:00
Alejandro Alonso f27cdee5ca 🐛 Remove TODO on multiple nesting levels component tests 2024-05-16 13:22:42 +02:00
Alejandro Alonso 4b8322dc82 Refactor common tests 2024-05-16 13:22:42 +02:00
alonso.torres 0ddcfa05cf Update plugins runtime 2024-05-16 12:26:19 +02:00
alonso.torres 4c71a4367f Add plugins management dialog 2024-05-16 12:26:19 +02:00
alonso.torres 236ff06763 Expand api for plugins 2024-05-16 11:05:01 +02:00
Eva Marco 6e409cbd47 Merge pull request #4583 from penpot/ladybenko-7730-ws-flaky
Fix flakiness of workspace tests
2024-05-14 16:46:18 +02:00
Belén Albeza d43458ee89 🐛 Fix mocking websockets when running multiple tests 2024-05-14 16:36:54 +02:00
Alejandro Alonso 39c8b2ea3c Add multiple nesting levels component tests 2024-05-14 13:48:34 +02:00
Alejandro Alonso fcf14b5cab Add duplicate page component tests 2024-05-14 13:48:34 +02:00
Alejandro Alonso 3e4aaa7935 Add new composition functions for common tests 2024-05-14 13:48:34 +02:00
Belén Albeza 575873eba7 🐛 Fix workspace rect drawing test 2024-05-13 17:41:00 +02:00
Andrés Moya 677b28218e 🔧 Update dependencies for fmt:clj 2024-05-13 13:31:38 +02:00
Pablo Alba cddc50036f Merge pull request #4580 from penpot/hiru-refactor-frontend-tests
Refactor frontend test helpers
2024-05-13 13:24:55 +02:00
Andrés Moya da939cc0a6 ♻️ Refactor front end test to make use of common file helpers 2024-05-13 13:10:01 +02:00
Andrés Moya c16ef39abf ♻️ Make test helpers globally usable 2024-05-13 13:10:01 +02:00
AzazelN28 d8c60aa770 Skip failing test 2024-05-13 12:19:12 +02:00
Andy Li ee0492120a 🌐 Add translations for: Chinese (Traditional).
Currently translated at 47.2% (651 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/
2024-05-12 11:01:11 +02:00
Aitor Moreno 0419b2c405 Merge pull request #4565 from penpot/eva-dashboard-pom-basic
  Add basic dashboard POM and test
2024-05-10 14:35:43 +02:00
Eva Marco d341cef406 Add basic dashboard pom and test 2024-05-10 12:53:26 +02:00
Alejandro ea20f693cb Merge pull request #4562 from penpot/hiru-move-frontend-tests
Move more frontend tests
2024-05-10 11:04:31 +02:00
Alejandro a94f1d6fe4 Merge pull request #4547 from penpot/alotor-fix-problem-svg-styles
🐛 Fix style scoping problem with imported SVG
2024-05-10 10:54:05 +02:00
Alejandro db99e994c6 Merge pull request #4570 from Cenadros/hotfix/fix-media-import
🐛 Fix medias not being imported using lib-penpot
2024-05-10 10:33:21 +02:00
Andrés Moya cb73ddc353 💄 Small refactor 2024-05-10 10:28:23 +02:00
Alejandro c616e3c932 Merge pull request #4540 from penpot/azazeln28-fix-color-palette-sorting-by-hue-and-value
🐛  Color palette sorting
2024-05-10 10:26:42 +02:00
Alejandro Alonso a3e750ed0a Tests for chained components changes propagation 2024-05-10 10:25:08 +02:00
Andrés Moya cf4ef426d7 Add tests for component sync 2024-05-10 10:17:09 +02:00
Belén Albeza 702e451530 Merge pull request #4572 from penpot/superalex-integration-tests
 Frontend integration tests
2024-05-10 09:30:48 +02:00
Alejandro Alonso 6b76213128 Frontend integration tests 2024-05-10 06:50:33 +02:00
Eva Marco 99371234dc Merge pull request #4563 from penpot/ladybenko-workspace-draw-test
Refactor POMS + extra workspace tests
2024-05-09 16:19:46 +02:00
Andrés Moya b6e633865e Add tests for component creation and modification 2024-05-09 14:49:10 +02:00
Belén Albeza 00430d63eb Add test for drawing a shape in the workspace 2024-05-09 13:45:06 +02:00
Belén Albeza e28d56e670 Add WorkspacePage POM for playwright testing 2024-05-09 13:45:02 +02:00
Andrés Moya 8b4e52a2be 💄 Improve copy child selection and test robustness 2024-05-09 13:33:52 +02:00
Andrés Moya caefaf6016 Add tests for reset components 2024-05-09 13:33:52 +02:00
Alejandro dd62653d4b Merge pull request #4571 from penpot/palba-fix-tests
🐛 Fix tests for remove swap slots
2024-05-09 13:20:24 +02:00
Pablo Alba 8deb799c3d 🐛 Fix tests for remove swap slots 2024-05-09 13:11:50 +02:00
Pablo Alba 6f93db034f 🎉 Components refactor: Add tests for remove swap slot on duplicate 2024-05-09 11:20:19 +02:00
Pablo Alba bfe9caba15 ♻️ Components refactor: move generators for duplicate 2024-05-09 11:20:19 +02:00
Alex Sánchez 40bc1fac73 🐛 Fix medias not being imported using lib-penpot 2024-05-09 10:36:49 +02:00
Belén Albeza 9fd9e0178e ♻️ Refactor LoginPage POM 2024-05-08 12:17:53 +02:00
Pablo Alba d92faaa6c6 Merge pull request #4558 from penpot/hiru-enhance-tests-debug
🔧 Enhance debug trace helpers for common tests
2024-05-07 22:12:05 +02:00
Andrés Moya ea6a9c87ec 🔧 Enhance debug trace helpers for common tests 2024-05-07 18:45:10 +02:00
Belén Albeza 127c47a35a Merge pull request #4557 from penpot/azazeln28-test-add-websocket-mock
 Add basic test with websocket mock
2024-05-07 16:25:51 +02:00
AzazelN28 0091ac0f5f ♻️ Refactor tests and pages 2024-05-07 16:18:42 +02:00
Andrés Moya b4ea749388 🐛 Fix linter error 2024-05-07 16:00:32 +02:00
Andrés Moya 86e524638c 🔥 Do a small cleanup 2024-05-07 15:51:56 +02:00
Pablo Alba e7b065ac6c Merge pull request #4552 from penpot/hiru-move-touched-test
 Move more touched tests to common
2024-05-07 13:00:25 +02:00
Andrés Moya c937d49ce9 💄 Split helpers in separated files 2024-05-07 12:51:07 +02:00
Andrés Moya 97e34d6e28 💄 Unify comments 2024-05-07 12:51:07 +02:00
Andrés Moya b68bc9a08c Move more touched tests to common 2024-05-07 12:51:07 +02:00
Alejandro Alonso 1de138466f Merge remote-tracking branch 'origin/staging' into develop 2024-05-07 12:47:40 +02:00
Alejandro Alonso bbb64b8be9 Merge remote-tracking branch 'origin/staging' 2024-05-07 12:47:17 +02:00
AzazelN28 572c6f02e2 ♻️ Refactor MockWebSocket 2024-05-07 11:59:33 +02:00
Belén Albeza 3bae6e4661 Adapt mock and add workspace test with websocket mock 2024-05-07 11:59:33 +02:00
AzazelN28 30321e54f0 📎 Add WebSocket mock 2024-05-07 11:59:33 +02:00
Aitor Moreno 38e35fb5ae Merge pull request #4555 from penpot/eva-testing-login-pom
 Add login page as Page Object Model
2024-05-07 10:58:08 +02:00
Eva Marco 832c1db63b Add login page as Page Object Model 2024-05-07 10:28:17 +02:00
Pablo Alba da437a0902 Merge pull request #4554 from penpot/hiru-create-logic-module
♻️ Move generate-xx methods to logic module
2024-05-06 18:48:44 +02:00
Andrés Moya 0b4fbc184d ♻️ Move generate-xx methods to logic module 2024-05-06 16:48:18 +02:00
Pablo Alba 7280dfd3f7 Tests for remove swap slot on move shapes to frame 2024-05-06 16:18:43 +02:00
Aitor Moreno 2c3ae851ea Merge pull request #4541 from penpot/superalex-delete-bottle-tutorial-and-walkthrough-from-onboarding-dashboard
 Delete Bottle tutorial and walkthrough from onboarding das…
2024-05-06 15:14:51 +02:00
Belén Albeza e666127b57 Merge pull request #4500 from penpot/eva-login-tests-additions
 Add more login integration tests
2024-05-06 15:03:43 +02:00
Aitor Moreno 5436633104 Merge pull request #4536 from penpot/alotor-plugins-api
New plugins APIs
2024-05-06 12:17:49 +02:00
alonso.torres ca7f17efd1 Add items to grid cells 2024-05-06 12:02:29 +02:00
alonso.torres 7117ea1f7e 🐛 Fix style scoping problem with imported SVG 2024-05-06 09:16:57 +02:00
Andy Li f575650379 🌐 Add translations for: Chinese (Traditional).
Currently translated at 46.7% (644 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/
2024-05-05 07:07:10 +02:00
Stas Haas 5f560426fa 🌐 Add translations for: Russian.
Currently translated at 57.5% (794 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2024-05-03 15:07:10 +02:00
Louis Chance 402b6d4f34 🌐 Add translations for: French.
Currently translated at 100.0% (1379 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2024-05-03 15:07:08 +02:00
alonso.torres fde0bcfd3e Add grid layout options to context 2024-05-03 13:44:31 +02:00
alonso.torres 9243ba937d Add to plugins clone and remove 2024-05-03 11:36:59 +02:00
alonso.torres e30c21a71f Add relative positioning 2024-05-03 11:36:59 +02:00
alonso.torres 67d48435e7 Plugins create svg shapes 2024-05-03 11:36:59 +02:00
alonso.torres 21d38a058b Add to plugin api: upload media, group and ungroup 2024-05-03 11:36:59 +02:00
alonso.torres 75d8965365 Add method to append children 2024-05-03 11:36:59 +02:00
alonso.torres 4a74862bf5 Add viewport information to the plugin 2024-05-03 11:36:59 +02:00
TheScientistPT 43dd4ce457 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 98.5% (1359 of 1379 strings)

Co-authored-by: TheScientistPT <joao.ed.reis.gomes@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
Translation: Penpot/frontend
2024-05-01 10:07:43 +02:00
Yaron Shahrabani cd03794a09 🌐 Add translations for: Hebrew.
Currently translated at 100.0% (1379 of 1379 strings)

Co-authored-by: Yaron Shahrabani <sh.yaron@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
Translation: Penpot/frontend
2024-05-01 10:07:42 +02:00
Stas Haas a749519d8e 🌐 Add translations for: German.
Currently translated at 100.0% (1379 of 1379 strings)

Co-authored-by: Stas Haas <stas@girafic.de>
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
Translation: Penpot/frontend
2024-05-01 10:07:41 +02:00
Linerly 71687593fd 🌐 Add translations for: Indonesian.
Currently translated at 100.0% (1379 of 1379 strings)

Co-authored-by: Linerly <linerly@proton.me>
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
Translation: Penpot/frontend
2024-05-01 10:07:39 +02:00
Geek Squirrel a7eb70a8e0 🌐 Add translations for: Chinese (Simplified).
Currently translated at 99.4% (1371 of 1379 strings)

🌐 Add translations for: Chinese (Simplified).

Currently translated at 95.5% (1317 of 1379 strings)

Co-authored-by: Geek Squirrel <geeksquirrel@qq.com>
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
Translation: Penpot/frontend
2024-05-01 10:07:38 +02:00
Pablo Alba 5e396010b3 Merge pull request #4535 from penpot/hiru-move-front-tests
Move frontend tests to common
2024-04-30 19:31:50 +02:00
Pablo Alba de6d8ccbf9 Small fix on components touched test 2024-04-30 19:23:58 +02:00
Alejandro Alonso 0fc7d8529e Delete Bottle tutorial and walkthrough from onboarding dashboard 2024-04-30 16:49:23 +02:00
Alejandro Alonso bca8180aeb 🐛 Fix duplicate component 2024-04-30 16:46:36 +02:00
Andrés Moya 77d4901db1 Add more tests for touched 2024-04-30 14:18:55 +02:00
Andrés Moya a40afd5b63 Add test for touched shapes 2024-04-30 13:47:40 +02:00
Andrés Moya 5611fcfc2c 🔧 Add generator function for update-shapes 2024-04-30 13:47:40 +02:00
Pablo Alba f354942487 ♻️ Components refactor: generator for relocate shapes (and tests) 2024-04-30 13:37:32 +02:00
Pablo Alba 78d0611632 Merge pull request #4538 from penpot/superalex-swap-and-reset-generate-tests
 Swap and reset generate changes tests
2024-04-30 13:17:15 +02:00
Alejandro Alonso f84cd933a8 Swap and reset generate changes tests 2024-04-30 12:49:43 +02:00
Yamila Moreno d956f7c72c Update README.md
update penpot fest information
2024-04-30 12:21:28 +02:00
AzazelN28 a8fae53564 🐛 color palette sorting 2024-04-30 10:03:53 +02:00
Aitor Moreno b2e40155b0 Merge pull request #4519 from penpot/ladybenko-use-custom-server
 Swap http-server for a custom server with express (front-end integration tests)
2024-04-29 18:12:00 +02:00
Alejandro 013dbf1f76 Merge pull request #4499 from penpot/hiru-test-helpers
 Add helpers to build files for testing
2024-04-26 13:29:52 +02:00
Alejandro Alonso cf62b083fe Merge remote-tracking branch 'origin/staging' into develop 2024-04-26 12:50:43 +02:00
Alejandro 23bd57e9bb Merge pull request #4531 from penpot/alotor-fix-font-bug
🐛 Fix problem with exporter texts
2024-04-26 12:49:45 +02:00
Andrés Moya 40e43fd501 ♻️ Reorganize tests by level 2024-04-26 12:44:49 +02:00
Andrés Moya ff4e27a1d5 Add composition helpers 2024-04-26 12:44:49 +02:00
Alejandro 11f2d7e711 Merge pull request #4530 from penpot/palba-fix-wrong-permissions
🐛 Fix inspect permission on shared prototype for owners
2024-04-26 12:43:34 +02:00
alonso.torres 3a71068a48 🐛 Add warning when font cannot be found 2024-04-26 12:16:05 +02:00
alonso.torres bebdc78ce6 🐛 Fix problem with exporter texts 2024-04-26 12:15:37 +02:00
Pablo Alba 22939aa689 🐛 Fix inspect permission on shared prototype for owners 2024-04-26 11:55:56 +02:00
Andrés Moya dde89e60dd Add new helper functions for common tests 2024-04-26 11:45:37 +02:00
Andrés Moya 1026f5b972 🔧 Change common tests runner to kaocha 2024-04-26 11:42:41 +02:00
Pablo Alba 6901acb37e 🐛 Fix ungrouping detach components 2024-04-26 11:41:43 +02:00
Pablo Alba e0fe7181f1 Merge pull request #4522 from penpot/superalex-fix-update-temp-file-audit-log-stored-dat
🐛 Fix update-temp-file audit_log stored data
2024-04-26 11:02:10 +02:00
Alejandro d1a8427563 Merge pull request #4528 from penpot/translations-2024-04-26-12
:sparkes: Update translations
2024-04-26 09:07:27 +02:00
Hosted Weblate ee6245d2d1 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/
2024-04-26 09:06:15 +02:00
Alejandro e7247817fb Merge pull request #4527 from penpot/translations-2024-04-26-11
Translations 2024 04 26 11
2024-04-26 08:58:29 +02:00
Alejandro Alonso 43fedb5fd4 Merge remote-tracking branch 'weblate/develop' into translations-2024-04-26-11 2024-04-26 08:57:20 +02:00
Alejandro 708c44d3f1 Merge pull request #4526 from penpot/translations-2024-04-26-9
 Update translations
2024-04-26 08:53:40 +02:00
Alejandro Alonso 1361917569 🌐 Add translations for: Spanish.
Currently translated at 99.8% (1377 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es/
2024-04-26 08:51:54 +02:00
Stephan Paternotte 5394fce632 🌐 Add translations for: Dutch.
Currently translated at 100.0% (1379 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2024-04-26 08:51:54 +02:00
Edgars Andersons 4b05551ecc 🌐 Add translations for: Latvian.
Currently translated at 100.0% (1379 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2024-04-26 08:51:54 +02:00
Yaron Shahrabani 3cb6c501d3 🌐 Add translations for: Hebrew.
Currently translated at 98.9% (1364 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2024-04-26 08:51:54 +02:00
Stas Haas c754e606ac 🌐 Add translations for: German.
Currently translated at 99.7% (1376 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2024-04-26 08:51:54 +02:00
Oğuz Ersen 258ead34f0 🌐 Add translations for: Turkish.
Currently translated at 100.0% (1379 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2024-04-26 08:51:54 +02:00
Anonymous 871a08aa75 🌐 Add translations for: Yoruba.
Currently translated at 88.5% (1221 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/yo/
2024-04-26 08:51:53 +02:00
Anonymous 476099c06a 🌐 Add translations for: Chinese (Traditional).
Currently translated at 44.5% (615 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/
2024-04-26 08:51:53 +02:00
Yaron Shahrabani b74ae49f38 🌐 Add translations for: Hebrew.
Currently translated at 97.7% (1348 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2024-04-26 08:51:53 +02:00
Anonymous 51eabd2a23 🌐 Add translations for: Chinese (Simplified).
Currently translated at 95.4% (1316 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2024-04-26 08:51:53 +02:00
Oğuz Ersen 522909c66d 🌐 Add translations for: Turkish.
Currently translated at 97.8% (1350 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2024-04-26 08:51:53 +02:00
Anonymous d2204ad48c 🌐 Add translations for: Turkish.
Currently translated at 97.8% (1350 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2024-04-26 08:51:53 +02:00
Anonymous 158753073c 🌐 Add translations for: Igbo.
Currently translated at 40.0% (546 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ig/
2024-04-26 08:51:53 +02:00
Anonymous 46705d9ebc 🌐 Add translations for: Malay.
Currently translated at 52.0% (709 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ms/
2024-04-26 08:51:53 +02:00
Anonymous 10c64330eb 🌐 Add translations for: Hausa.
Currently translated at 96.1% (1309 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ha/
2024-04-26 08:51:53 +02:00
Anonymous 16a5218592 🌐 Add translations for: Dutch.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2024-04-26 08:51:53 +02:00
Anonymous 6cf0605745 🌐 Add translations for: Latvian.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2024-04-26 08:51:53 +02:00
Anonymous 155346fa09 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2024-04-26 08:51:53 +02:00
Anonymous 3cf385e209 🌐 Add translations for: Czech.
Currently translated at 98.6% (1344 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/cs/
2024-04-26 08:51:53 +02:00
Anonymous 16873891cb 🌐 Add translations for: Basque.
Currently translated at 87.5% (1192 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/eu/
2024-04-26 08:51:53 +02:00
Anonymous 861348f97b 🌐 Add translations for: Polish.
Currently translated at 85.3% (1162 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pl/
2024-04-26 08:51:53 +02:00
Anonymous f60c405167 🌐 Add translations for: Persian.
Currently translated at 50.0% (681 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2024-04-26 08:51:53 +02:00
Anonymous 6a2bdeb3cb 🌐 Add translations for: Hebrew.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2024-04-26 08:51:53 +02:00
Anonymous 5434ed146e 🌐 Add translations for: Indonesian.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2024-04-26 08:51:53 +02:00
Anonymous 0ab9300107 🌐 Add translations for: Arabic.
Currently translated at 83.1% (1132 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ar/
2024-04-26 08:51:53 +02:00
Anonymous c40e3815df 🌐 Add translations for: Romanian.
Currently translated at 96.1% (1310 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2024-04-26 08:51:53 +02:00
Anonymous a3cec26994 🌐 Add translations for: German.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2024-04-26 08:51:53 +02:00
Anonymous 5523914605 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 85.2% (1161 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2024-04-26 08:51:53 +02:00
Anonymous 7a849dd5c4 🌐 Add translations for: French.
Currently translated at 96.4% (1313 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2024-04-26 08:51:53 +02:00
Anonymous 6d3596ba14 🌐 Add translations for: Spanish.
Currently translated at 99.3% (1353 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es/
2024-04-26 08:51:53 +02:00
Hosted Weblate 1f4266ffe4 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/
2024-04-26 08:51:53 +02:00
TheScientistPT 0fd31c253a 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2024-04-26 08:51:52 +02:00
Edgars Andersons aae02bfedb 🌐 Add translations for: Latvian.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2024-04-26 08:51:52 +02:00
Linerly f9514f62a7 🌐 Add translations for: Indonesian.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2024-04-26 08:51:52 +02:00
Stas Haas 04359701a3 🌐 Add translations for: German.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2024-04-26 08:51:52 +02:00
Edgars Andersons 704103618b 🌐 Add translations for: Latvian.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2024-04-26 08:51:52 +02:00
Louis Chance f3a0f818aa 🌐 Add translations for: French.
Currently translated at 96.4% (1313 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2024-04-26 08:51:52 +02:00
Yaron Shahrabani 17b01b97cf 🌐 Add translations for: Hebrew.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2024-04-26 08:51:52 +02:00
Stas Haas bb0427d613 🌐 Add translations for: German.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2024-04-26 08:51:52 +02:00
Alejandro Alonso a0aec8023a 🌐 Add translations for: Yoruba.
Currently translated at 90.6% (1234 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/yo/
2024-04-26 08:51:52 +02:00
Alejandro Alonso 2204799429 🌐 Add translations for: Igbo.
Currently translated at 40.0% (546 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ig/
2024-04-26 08:51:52 +02:00
Alejandro Alonso f970397b36 🌐 Added translation for: Yoruba. 2024-04-26 08:51:52 +02:00
Alejandro Alonso e15667bc39 🌐 Added translation for: Igbo. 2024-04-26 08:51:52 +02:00
Alejandro Alonso 9e9771fa1e 🌐 Deleted translation: Yoruba. 2024-04-26 08:51:52 +02:00
Alejandro Alonso b3d46a59e3 🌐 Add translations for: Yoruba.
Currently translated at 1.5% (21 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/yo/
2024-04-26 08:51:52 +02:00
Alejandro Alonso d2a85dcd37 🌐 Added translation for: Yoruba. 2024-04-26 08:51:52 +02:00
Stephan Paternotte 316242ac67 🌐 Add translations for: Dutch.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2024-04-26 08:51:52 +02:00
TheScientistPT 8adcb82c45 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2024-04-26 08:51:52 +02:00
Stas Haas 062c086eca 🌐 Add translations for: German.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2024-04-26 08:51:52 +02:00
Revenant dc53c60db6 🌐 Add translations for: Malay.
Currently translated at 52.0% (709 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ms/
2024-04-26 08:51:52 +02:00
Oğuz Ersen 2166435a52 🌐 Add translations for: Turkish.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2024-04-26 08:51:52 +02:00
Alejandro 4df2d7a49b Merge pull request #4525 from penpot/translations-2024-04-26-7
 Update translations
2024-04-26 08:47:11 +02:00
Oğuz Ersen 15debe65fd Update translations 2024-04-26 08:46:41 +02:00
Alejandro Alonso 007bd86f09 🌐 Add translations for: Spanish.
Currently translated at 99.8% (1377 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es/
2024-04-26 06:53:02 +02:00
Alejandro Alonso a65282c01b 🐛 Fix update-temp-file audit_log stored data 2024-04-26 06:30:00 +02:00
Alejandro 625bfa7166 Merge pull request #4520 from penpot/alotor-fix-exporter-problem
🐛 Fix problem with exporter texts
2024-04-25 16:30:32 +02:00
alonso.torres a8363f0c02 🐛 Fix problem with exporter texts 2024-04-25 15:35:53 +02:00
Stephan Paternotte 8abc2261a6 🌐 Add translations for: Dutch.
Currently translated at 100.0% (1379 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2024-04-25 15:07:21 +02:00
Edgars Andersons e4178a66d6 🌐 Add translations for: Latvian.
Currently translated at 100.0% (1379 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2024-04-25 15:07:20 +02:00
Yaron Shahrabani ca7bd20c33 🌐 Add translations for: Hebrew.
Currently translated at 98.9% (1364 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2024-04-25 15:07:19 +02:00
Stas Haas 77f61191d1 🌐 Add translations for: German.
Currently translated at 99.7% (1376 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2024-04-25 15:07:19 +02:00
Oğuz Ersen 4896d39261 🌐 Add translations for: Turkish.
Currently translated at 100.0% (1379 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2024-04-25 15:07:18 +02:00
Pablo Alba a7bfa7c7c8 ♻️ Components refactor: generator for sync-file 2024-04-25 14:22:37 +02:00
Alejandro Alonso c73eb77125 ♻️ Components refactor: generator for reset component 2024-04-25 14:22:37 +02:00
Alejandro Alonso f3220fa985 ♻️ Components refactor: generator for sync head 2024-04-25 14:22:37 +02:00
Pablo Alba 37e68249aa ♻️ Components refactor: remove it usage on libraries_helpers 2024-04-25 14:22:37 +02:00
Alejandro Alonso 05f4459fb7 ♻️ Components refactor: generator for generate component for swap 2024-04-25 14:22:37 +02:00
Alejandro Alonso c001710676 ♻️ Components refactor: generator for delete shapes 2024-04-25 14:22:37 +02:00
Pablo Alba 0ed582ebc5 ♻️ Components refactor: generator for detach-component 2024-04-25 14:22:37 +02:00
Pablo Alba 7d44eef4ab ♻️ Components refactor: generator for restore-component 2024-04-25 14:22:37 +02:00
Pablo Alba f91d60eeb6 ♻️ Components refactor: generator for rename-component 2024-04-25 14:22:37 +02:00
Pablo Alba 02c455dcba ♻️ Components refactor: generator for duplicate component 2024-04-25 14:22:37 +02:00
Belén Albeza 306a8edbec Swap http-server for a custom server with express (front-end integration tests) 2024-04-25 13:40:14 +02:00
AzazelN28 47804429c0 Merge branch 'staging' into develop 2024-04-25 11:32:28 +02:00
Alejandro Alonso 5b35176584 Merge remote-tracking branch 'origin/staging' 2024-04-25 10:29:04 +02:00
Eva Marco 106fe05657 Add more login integration tests 2024-04-25 09:56:10 +02:00
Anonymous e2f6b02075 🌐 Add translations for: Yoruba.
Currently translated at 88.5% (1221 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/yo/
2024-04-24 15:04:10 +02:00
Anonymous 9a54785291 🌐 Add translations for: Chinese (Traditional).
Currently translated at 44.5% (615 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/
2024-04-24 15:04:10 +02:00
Yaron Shahrabani 9ba7bb7e17 🌐 Add translations for: Hebrew.
Currently translated at 97.7% (1348 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2024-04-24 15:04:09 +02:00
Anonymous 7d0bae6619 🌐 Add translations for: Chinese (Simplified).
Currently translated at 95.4% (1316 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2024-04-24 15:04:09 +02:00
Oğuz Ersen ec9e32241d 🌐 Add translations for: Turkish.
Currently translated at 97.8% (1350 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2024-04-24 15:04:09 +02:00
Anonymous a55bf34155 🌐 Add translations for: Turkish.
Currently translated at 97.8% (1350 of 1379 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2024-04-24 15:04:09 +02:00
Alejandro e808818f02 Merge pull request #4507 from penpot/translations-8
 Update translations
2024-04-24 15:00:19 +02:00
Oğuz Ersen d3f8abb9aa Update translations 2024-04-24 14:57:12 +02:00
Anonymous aa56c293ca 🌐 Add translations for: Igbo.
Currently translated at 40.0% (546 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ig/
2024-04-24 14:55:21 +02:00
Anonymous 8cfc669d9d 🌐 Add translations for: Malay.
Currently translated at 52.0% (709 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ms/
2024-04-24 14:55:20 +02:00
Anonymous 3068721fc3 🌐 Add translations for: Hausa.
Currently translated at 96.1% (1309 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ha/
2024-04-24 14:55:19 +02:00
Anonymous cd06bb13ba 🌐 Add translations for: Dutch.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2024-04-24 14:55:18 +02:00
Anonymous 11cca08ec1 🌐 Add translations for: Latvian.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2024-04-24 14:55:17 +02:00
Anonymous 8f9ba827d8 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2024-04-24 14:55:16 +02:00
Anonymous ddd0e10c84 🌐 Add translations for: Czech.
Currently translated at 98.6% (1344 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/cs/
2024-04-24 14:55:15 +02:00
Anonymous e97162bdae 🌐 Add translations for: Basque.
Currently translated at 87.5% (1192 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/eu/
2024-04-24 14:55:15 +02:00
Anonymous b87b1120ca 🌐 Add translations for: Polish.
Currently translated at 85.3% (1162 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pl/
2024-04-24 14:55:14 +02:00
Anonymous 4b5d75bef0 🌐 Add translations for: Persian.
Currently translated at 50.0% (681 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2024-04-24 14:55:13 +02:00
Anonymous 330dddbc31 🌐 Add translations for: Hebrew.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2024-04-24 14:55:13 +02:00
Anonymous 609ffae580 🌐 Add translations for: Indonesian.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2024-04-24 14:55:12 +02:00
Anonymous eef05c2352 🌐 Add translations for: Arabic.
Currently translated at 83.1% (1132 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ar/
2024-04-24 14:55:11 +02:00
Anonymous 19639fed2d 🌐 Add translations for: Romanian.
Currently translated at 96.1% (1310 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2024-04-24 14:55:10 +02:00
Anonymous a7785f3a47 🌐 Add translations for: German.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2024-04-24 14:55:09 +02:00
Anonymous b1e645abe6 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 85.2% (1161 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2024-04-24 14:55:09 +02:00
Anonymous bb5f5eaba2 🌐 Add translations for: French.
Currently translated at 96.4% (1313 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2024-04-24 14:55:08 +02:00
Anonymous 990714c1da 🌐 Add translations for: Spanish.
Currently translated at 99.3% (1353 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es/
2024-04-24 14:55:07 +02:00
Hosted Weblate 68d59051fc Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/
2024-04-24 14:52:04 +02:00
TheScientistPT 30b0a2eddb 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2024-04-24 14:52:02 +02:00
Edgars Andersons 084378556b 🌐 Add translations for: Latvian.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2024-04-24 14:52:02 +02:00
Linerly 84b0905096 🌐 Add translations for: Indonesian.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2024-04-24 14:52:02 +02:00
Stas Haas 6e03267697 🌐 Add translations for: German.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2024-04-24 14:52:02 +02:00
Edgars Andersons 11bfc45c0b 🌐 Add translations for: Latvian.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2024-04-24 14:52:02 +02:00
Louis Chance 8b17da4235 🌐 Add translations for: French.
Currently translated at 96.4% (1313 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2024-04-24 14:52:02 +02:00
Yaron Shahrabani f410783283 🌐 Add translations for: Hebrew.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2024-04-24 14:52:02 +02:00
Stas Haas b4e46347d4 🌐 Add translations for: German.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2024-04-24 14:52:02 +02:00
Alejandro Alonso a678eb7295 🌐 Add translations for: Yoruba.
Currently translated at 90.6% (1234 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/yo/
2024-04-24 14:52:02 +02:00
Alejandro Alonso f5d7dc7c5c 🌐 Add translations for: Igbo.
Currently translated at 40.0% (546 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ig/
2024-04-24 14:52:02 +02:00
Alejandro Alonso 5d899df456 🌐 Added translation for: Yoruba. 2024-04-24 14:52:02 +02:00
Alejandro Alonso 4e6dd09753 🌐 Added translation for: Igbo. 2024-04-24 14:52:02 +02:00
Alejandro Alonso 0eb35f352a 🌐 Deleted translation: Yoruba. 2024-04-24 14:52:02 +02:00
Alejandro Alonso 80b635af67 🌐 Add translations for: Yoruba.
Currently translated at 1.5% (21 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/yo/
2024-04-24 14:52:02 +02:00
Alejandro Alonso d5827562a3 🌐 Added translation for: Yoruba. 2024-04-24 14:52:02 +02:00
Stephan Paternotte 99417bd124 🌐 Add translations for: Dutch.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2024-04-24 14:52:02 +02:00
TheScientistPT f3b68725d3 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2024-04-24 14:52:02 +02:00
Stas Haas 9369cf2d94 🌐 Add translations for: German.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2024-04-24 14:52:02 +02:00
Revenant b4853fca7a 🌐 Add translations for: Malay.
Currently translated at 52.0% (709 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ms/
2024-04-24 14:52:01 +02:00
Oğuz Ersen 727836af76 🌐 Add translations for: Turkish.
Currently translated at 100.0% (1362 of 1362 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2024-04-24 14:52:01 +02:00
Alejandro Alonso 0cc92eccfa Revert " Update translations"
This reverts commit 268a26b6a4.
2024-04-24 14:50:17 +02:00
Alejandro 2c6201f42a Merge pull request #4505 from penpot/superlex-update-translations-4
  Update translations
2024-04-24 14:13:26 +02:00
Aitor Moreno 857429290d Merge pull request #4501 from penpot/superalex-add-exception-audit-log-event
 Add exception page audit log event
2024-04-24 14:07:53 +02:00
Oğuz Ersen 268a26b6a4 Update translations 2024-04-24 14:06:29 +02:00
Alejandro Alonso 0be97e1c44 🐛 Fix validate translations script 2024-04-24 14:06:22 +02:00
Alejandro Alonso 3c842d2b81 Add exception page audit log event 2024-04-24 13:17:57 +02:00
alonso.torres 6fbdc4ff07 🐛 Fix problem activating feature 2024-04-24 10:25:47 +02:00
Alejandro 38fd385d5d Merge pull request #4467 from penpot/azazeln28-fix-color-palette-sorting
🐛 Fix color palette sorting
2024-04-24 08:22:33 +02:00
Aitor Moreno 3eabab7fc7 Merge pull request #4489 from penpot/alotor-plugins-create-api
 Add write apis to the plugins
2024-04-23 13:38:28 +02:00
Alejandro 9bf5b1a8cd Merge pull request #4491 from jordisala1991/hotfix/features-file-builder
🐛 Fix default features for files exported with penpot lib
2024-04-23 12:39:17 +02:00
Eva Marco 7c80c605d1 🐛 Fix background color on scrollbar for firefox 2024-04-23 11:25:18 +02:00
Jordi Sala Morales 0cb2e6d07d 🐛 Fix default features for files exported with penpot lib
Avoid having false as features, since it should be an array.
2024-04-23 07:40:16 +00:00
alonso.torres 00de89197e Add write apis to the plugins 2024-04-22 17:08:18 +02:00
Alejandro d907812513 Merge pull request #4481 from jordisala1991/hotfix/page-options
🐛 Apply parse-data for addPage options
2024-04-22 14:53:53 +02:00
Alejandro d8bf48e49e Merge pull request #4486 from penpot/azazeln28-add-provider-to-validate-uri
📎 Add provider to validate uri
2024-04-22 13:43:26 +02:00
Jordi Sala Morales b667f1bb2c 🐛 Fix adding pages with customized options 2024-04-22 11:23:47 +00:00
Alejandro 8e9fa66e2f Merge pull request #4482 from penpot/palba-fix-remove-swap-slot
Fixes on swap slots
2024-04-22 13:20:28 +02:00
AzazelN28 17fb5283cc 📎 Add provider to validate uri 2024-04-22 13:13:42 +02:00
Alejandro 03c9f6b1e1 Merge pull request #4487 from penpot/superalex-fix-libraries-templates-links
🐛 Fix librares and templates links
2024-04-22 13:13:06 +02:00
Alejandro Alonso 908229b7a8 🐛 Fix librares and templates links 2024-04-22 13:04:48 +02:00
Alejandro c85f76300a Merge pull request #4477 from penpot/comp-refactor-lib-helpers
♻️ Move and merge libraries_helpers
2024-04-22 12:58:11 +02:00
Pablo Alba 2a752e3625 🐛 swap slot is not copied on copy-paste of a main 2024-04-22 11:32:31 +02:00
Pablo Alba c6fabc349e 🐛 Fix swap-slot is removed on copy-paste of a chained copy 2024-04-22 11:21:34 +02:00
Eva Marco 2fd55e3289 Merge pull request #4471 from penpot/ladybenko-7534-intercepting-login-seq
Integration test example: User login
2024-04-22 09:07:37 +02:00
Alejandro Alonso 3ea3923751 Merge remote-tracking branch 'origin/staging' 2024-04-22 09:07:06 +02:00
Belén Albeza c33d4ff3e2 Add user login front-end integration test 2024-04-19 17:55:19 +02:00
Pablo Alba a8738b44a1 ♻️ Merge libraries_common_helpers into libraries_helpers 2024-04-19 16:00:38 +02:00
Pablo Alba 2e18ce9323 ♻️ Move libraries_helpers to common 2024-04-19 15:37:29 +02:00
Pablo Alba e1cd6d04d9 ♻️ Move common libraries_helpers to libraries_common_helpers 2024-04-19 14:02:27 +02:00
alonso.torres 362d4ea47f Command to activate feature plugin 2024-04-19 12:09:20 +02:00
AzazelN28 293ab3c80e 🐛 Fix color palette sorting 2024-04-19 10:31:54 +02:00
Andrey Antukh 716211524b Merge remote-tracking branch 'origin/staging' into develop 2024-04-19 09:37:37 +02:00
Alejandro 89fa8ce66e Merge pull request #4466 from penpot/azazeln28-fix-seo-issues
📎 Fix SEO issues
2024-04-19 09:27:27 +02:00
alonso.torres d530815860 Upload plugins-runtime binary 2024-04-19 01:29:13 +02:00
alonso.torres 0ffd82299f Refactor to the context api 2024-04-19 01:29:13 +02:00
alonso.torres 7b508f2803 Create feature for plugins 2024-04-19 01:29:13 +02:00
alonso.torres d7324b2e98 Support development and production plugin runtime 2024-04-19 01:29:13 +02:00
alonso.torres 97c3abfd60 Add nginx configuration for mjs files 2024-04-19 01:29:13 +02:00
alonso.torres 432e894344 Experiment for data definition 2024-04-19 01:29:13 +02:00
alonso.torres 127b481c38 Refactor of the plugins context 2024-04-19 01:29:13 +02:00
Juanfran 5a34c25926 🐛 Fix events inside webcomponent 2024-04-19 01:29:13 +02:00
Andrey Antukh 3f473ca765 Plugins proof of concept 2024-04-19 01:29:13 +02:00
AzazelN28 3bf5648b5b 📎 Fix SEO issues 2024-04-18 11:39:48 +02:00
Andrey Antukh fd92437f7d Show error notificaton on oidc error redirect 2024-04-18 09:52:24 +02:00
Andrey Antukh 81b52d7170 Disable oidc registration when registration flag is disabled 2024-04-18 09:52:24 +02:00
Andrey Antukh a969550aa4 Trust oidc providers which provides email_verified claim 2024-04-18 09:52:24 +02:00
Andrey Antukh 7e20cf10c5 ⬆️ Update dependencies 2024-04-18 09:52:24 +02:00
Andrey Antukh 90022041e6 Improve error handling on ldap frontend code 2024-04-18 09:52:24 +02:00
Andrey Antukh ce790d83fd Improve internal registration flow 2024-04-18 09:52:24 +02:00
Andrey Antukh 606aeeb38f Allow attach context to audit entry from metadata 2024-04-18 09:52:24 +02:00
Andrey Antukh ef632bcae7 Trigger email verification on OIDC register process
This will happen only if:
- the oidc provider properly reports that user has a non-verified email
- the oidc does not provides any way to know the email verification
  status
2024-04-18 09:52:24 +02:00
alonso.torres 57346ab685 📚 Update changelog to reflect breaking change 2024-04-17 19:57:02 +02:00
Andrey Antukh b9ed0e1146 Merge remote-tracking branch 'origin/staging' into develop 2024-04-17 19:32:39 +02:00
Alejandro 8bd9c0d031 Merge pull request #4444 from penpot/palba-bugfixing-008
🐛 Bugfixing
2024-04-17 06:46:57 +02:00
Alejandro 88f46f2ab2 Merge pull request #4458 from penpot/niwinz-staging-bugfix-2
 Minor enhancements
2024-04-17 06:40:42 +02:00
Andrey Antukh edd91f00af Add minor improvement to worker module logging 2024-04-16 23:27:00 +02:00
Andrey Antukh 6477a48a50 Merge remote-tracking branch 'origin/staging' into develop 2024-04-16 19:35:24 +02:00
Andrey Antukh 16fa0b0330 Improve email clean mechanism 2024-04-16 17:24:50 +02:00
Alejandro c975e0bcee Merge pull request #4455 from penpot/niwinz-staging-bugfix-2
 Make some storage operations asynchronous
2024-04-16 17:01:52 +02:00
Andrey Antukh 25001e5b80 📎 Add minor logging improvements on worker module 2024-04-16 16:42:44 +02:00
Andrey Antukh c3a0db2431 Add the ability to schedule storage object touching as a task 2024-04-16 16:42:44 +02:00
Andrey Antukh e27c0b2086 Add a task for asynchronous object update operation 2024-04-16 16:42:44 +02:00
Pablo Alba ec8c847440 🐛 Fix wrong permissions on shared prototype for owners 2024-04-16 13:12:21 +02:00
Ikko Eltociear Ashimine 64ff6d05c0 🐛 Fix alt typo
Communnity -> Community
2024-04-16 13:01:11 +02:00
Alejandro Alonso ea42669ff6 Merge remote-tracking branch 'origin/staging' into develop 2024-04-16 12:42:20 +02:00
Alejandro Alonso 380c77a704 Merge remote-tracking branch 'origin/staging' 2024-04-16 12:41:24 +02:00
Andrey Antukh caaf695352 📚 Update changelog 2024-04-16 12:39:13 +02:00
Alejandro 56f4348586 Merge pull request #4452 from penpot/niwinz-staging-bugfix-1
 Reduce lock contention on uploading file object thumbnail
2024-04-16 11:52:24 +02:00
Andrey Antukh 56ba32b66d Reduce lock contention on uploading file object thumbnail 2024-04-16 11:37:35 +02:00
Alejandro 4dacba6836 Merge pull request #4450 from penpot/niwinz-staging-bugfix-1
 Make cron task schedule sync more lock resilent
2024-04-16 09:28:03 +02:00
Jordi Sala Morales ddfe5fbcb8 Avoid non existent function warning 2024-04-16 08:47:35 +02:00
Andrey Antukh 7948f565e3 Make cron task schedule sync more lock resilent 2024-04-16 08:39:04 +02:00
Alejandro Alonso b14b8f794a Merge remote-tracking branch 'origin/staging' into develop 2024-04-15 20:58:22 +02:00
Alejandro Alonso 2bca2b005e Merge remote-tracking branch 'origin/staging' 2024-04-15 20:57:17 +02:00
Alejandro 4cb57c9748 Merge pull request #4446 from penpot/superalex-update-changes-2
📚 Update CHANGES for 2.0.1
2024-04-15 20:57:02 +02:00
Alejandro Alonso bb76700c18 📚 Update CHANGES for 2.0.1 2024-04-15 20:55:51 +02:00
Andrey Antukh 33bdf5e83f Merge remote-tracking branch 'origin/staging' 2024-04-15 20:27:29 +02:00
Alejandro Alonso f0eff95e18 🐛 Fix v2 components migration script 2024-04-15 20:26:51 +02:00
Alejandro Alonso 87927a3476 Merge remote-tracking branch 'origin/staging' into develop 2024-04-15 16:47:06 +02:00
Alejandro Alonso 2a6b9f06b3 Merge remote-tracking branch 'origin/staging' 2024-04-15 16:46:54 +02:00
Alejandro f531a5c323 Merge pull request #4442 from penpot/niwinz-staging-bugfixes-14
🐛 Bugfixes
2024-04-15 16:24:11 +02:00
Pablo Alba acc1fac8de 🐛 Fix color picker names are not displayed correctly on their tooltips 2024-04-15 16:07:05 +02:00
Andrey Antukh 36e66c4dd9 Merge remote-tracking branch 'origin/staging' 2024-04-15 14:27:46 +02:00
Andrey Antukh 8c2038e43b 🐛 Fix incorrect name on audit event 2024-04-15 14:27:24 +02:00
Andrey Antukh 0135b477ca Add improved traceability of climit module 2024-04-15 14:27:24 +02:00
Alejandro 8bf1b9c28e Merge pull request #4427 from penpot/palba-bugfixing-007
🐛 Bugfixing
2024-04-15 12:48:28 +02:00
Alejandro 002772ff0e Merge pull request #4429 from penpot/alotor-bugfix-44
Alotor bugfix 44
2024-04-15 12:38:56 +02:00
alonso.torres 4838571ec2 🐛 Fix problem with position-data overriding in copies 2024-04-15 10:13:01 +02:00
alonso.torres 8e71d219ca 🐛 Fix editor when several colors are in a single word 2024-04-15 10:13:01 +02:00
alonso.torres cbac4587cf 🐛 Fix crash when removing multiple text fills 2024-04-15 10:13:01 +02:00
alonso.torres e636bdd0b0 🐛 Fix problem copy/paste svg text 2024-04-15 10:13:01 +02:00
Pablo Alba a7a3344030 🐛 Inverted highlight constraint for vertical and horizontal constraints 2024-04-12 12:53:03 +02:00
Pablo Alba 137e576e63 🐛 Fix scrollbar appears on top of UI buttons 2024-04-12 12:39:48 +02:00
Andrey Antukh 83f8218bf3 🐛 Fix incorrect queryparams handling on default nginx entrypoint 2024-04-12 10:50:13 +02:00
Andrey Antukh c9fbb21924 Don't stop start-tmux if playwright is not found on frontend 2024-04-12 10:08:15 +02:00
Andrey Antukh bc279977d5 📎 Comment playwright installation on frontend directory 2024-04-12 09:58:40 +02:00
Andrey Antukh ca640964d1 ⬆️ Update exporter dependencies 2024-04-12 09:58:07 +02:00
Belén Albeza 4d29bff9b5 Add playwright to the frontend 2024-04-11 14:05:16 +02:00
Alejandro Alonso ff04877d24 Merge remote-tracking branch 'origin/staging' into develop 2024-04-11 13:33:37 +02:00
Alejandro Alonso 41cdd2453a Merge remote-tracking branch 'origin/staging' 2024-04-11 13:32:59 +02:00
Andrey Antukh fa00fed694 🐛 Fix issue with v2 manual migration script 2024-04-11 13:29:33 +02:00
Alejandro Alonso 34d75957f0 Merge remote-tracking branch 'origin/staging' into develop 2024-04-11 12:36:45 +02:00
Alejandro Alonso f97b705468 Merge remote-tracking branch 'origin/staging' 2024-04-11 12:35:32 +02:00
Alejandro ac835bb655 Merge pull request #4389 from penpot/test
 Several improvements
2024-04-11 12:35:04 +02:00
Aitor Moreno ee308282f1 Merge pull request #4411 from penpot/eva-fix-tabs-length
🐛 Fix text length on tabs
2024-04-11 11:34:18 +02:00
Eva Marco f1685f6e75 🐛 Fix text length on tabs 2024-04-11 11:27:56 +02:00
Alejandro Alonso 87d0c2ac30 🐛 Fix internal error on inspect svg 2024-04-11 11:25:44 +02:00
Alejandro 66845033ab Merge pull request #4419 from penpot/alotor-bugfix-43
🐛 Fix problem with text fills
2024-04-11 11:24:28 +02:00
AzazelN28 a569a350b4 🐛 Fix toolbar disappearing 2024-04-11 11:21:33 +02:00
alonso.torres b684ee2f83 🐛 Fix problem when moving copys in the layers panel 2024-04-11 11:17:48 +02:00
alonso.torres 2e23f19081 🐛 Fix problem with text fills 2024-04-11 10:42:36 +02:00
Alejandro Alonso 5fccc59ad5 Merge remote-tracking branch 'origin/staging' into develop 2024-04-11 10:21:04 +02:00
Alejandro Alonso 5c5188920d Merge remote-tracking branch 'origin/staging' 2024-04-11 10:20:51 +02:00
Pablo Alba 9cbbe1565d 🐛 Fix crash on copy paste a orphan copy inside a copy 2024-04-11 09:51:39 +02:00
Alejandro Alonso 1b17664ade 🐛 Fix gradient stroke breaks arrow-ended paths 2024-04-11 09:35:13 +02:00
Alejandro Alonso 2f89512a75 🐛 Fix project line shows an extra space after the number of files 2024-04-11 09:34:52 +02:00
Alejandro 702ec65d77 Merge pull request #4399 from penpot/palba-bugfixing-006
🐛 Fix no visual cue if user want to create anotation with only spaces
2024-04-11 07:11:22 +02:00
Pablo Alba d22ae22aad 🐛 Fix no visual cue if user want to create anotation with only spaces 2024-04-10 21:27:21 +02:00
Alejandro Alonso c1c0ec6f2f Merge remote-tracking branch 'origin/staging' into develop 2024-04-10 16:32:19 +02:00
Alejandro Alonso 86ba875317 Merge remote-tracking branch 'origin/staging' 2024-04-10 16:32:03 +02:00
Alejandro Alonso 928fbd8e38 🐛 Fix old texts with empty fills 2024-04-10 16:08:19 +02:00
Alejandro f6f262f387 Merge pull request #4402 from penpot/hiru-fix-rotation-override
Fix rotation override
2024-04-10 16:03:58 +02:00
Alejandro 7d4b2b1bb7 Merge pull request #4405 from penpot/niwinz-staging-bugfix-7
🐛 Fix incorrect team features handling on onboarding team creation
2024-04-10 16:02:35 +02:00
Alejandro dd4b5f3eb6 Merge pull request #4407 from penpot/alotor-bugfix-41
🐛 Fix problem with colorpicker
2024-04-10 16:01:46 +02:00
alonso.torres 6fa2137335 🐛 Fix problem with colorpicker 2024-04-10 15:50:25 +02:00
Andrey Antukh 347276fb4e 🐛 Fix incorrect team features handling on onboarding team creation 2024-04-10 15:33:18 +02:00
Andrey Antukh 7d36cf1b5e Add missing jvm parameter on backend run.sh template 2024-04-10 15:31:49 +02:00
Andrey Antukh 0bc5a80c51 Add missing .yarnrc.yml on exporter bundle 2024-04-10 15:31:49 +02:00
Andrey Antukh c55ceb4bca Add automatic v2 migration process on startup 2024-04-10 15:31:49 +02:00
Andrey Antukh b3456d0f7f 🐛 Fix incorrect feature handling 2024-04-10 15:31:49 +02:00
Andrey Antukh 352c13881a 🐛 Fix exporter dockerfile issue related to yarn update 2024-04-10 15:31:49 +02:00
Andrey Antukh 79fbbe0bee 📎 Don't report invalid image validation errors 2024-04-10 15:31:49 +02:00
Andrey Antukh fd0a760b77 📎 Fix log levels on common file migrations 2024-04-10 15:31:49 +02:00
Andrey Antukh 9c25723ee3 📎 Add note about fragments on object-gc ns 2024-04-10 15:31:49 +02:00
Andrey Antukh 6b552fd8a9 🐛 Don't run file-gc on deleted files 2024-04-10 15:31:49 +02:00
Andrey Antukh f18be26054 📎 Change log levels on webhooks loggers ns 2024-04-10 15:31:49 +02:00
Andrey Antukh 34534c924f Set smaller default deletion delay for devenv
And make the deletion delay configurable
2024-04-10 15:31:49 +02:00
Andrey Antukh 7b7820952c Update docker related files 2024-04-10 15:31:49 +02:00
Andrey Antukh 5924f3bc41 Simplify v2 migration helpers on srepl ns 2024-04-10 15:31:49 +02:00
Andrey Antukh c6d92a2517 🐛 Fix incorrect feature handling on importing binfile on v1 2024-04-10 15:31:49 +02:00
Andrey Antukh 036392af6e Add the logger info to mattermost reporter 2024-04-10 15:31:49 +02:00
Andrey Antukh 01a64dda2e 🐛 Fix json encoding issue on webhook event with custom object
This commit is a workaround. We will need to properly replace
jsonista with data.json because the data.json has more convenient
way for extending for custom data types.
2024-04-10 15:31:49 +02:00
alonso.torres 389c394f39 🐛 Fix import zip text with gradients 2024-04-10 14:47:54 +02:00
alonso.torres 0935390761 🐛 Fix problem with paste order 2024-04-10 14:47:54 +02:00
Andrés Moya 584e18d858 🐛 Fix ignore touched when rotating a copy 2024-04-10 13:25:46 +02:00
Aitor Moreno 420178e620 Merge pull request #4387 from penpot/superalex-fix-cmd-option-enter-when-popups-blocked
🐛 Fix cmd+option+enter when popups blocked
2024-04-10 12:19:59 +02:00
Alejandro 7d270ed933 Merge pull request #4393 from penpot/palba-fix-swap-naming
🐛 fix naming convention of swap
2024-04-10 11:28:02 +02:00
Pablo Alba 9d7e8cf4e6 🐛 fix naming convention of swap 2024-04-10 10:29:29 +02:00
Alejandro Alonso f47991fa9c Merge remote-tracking branch 'origin/staging' into develop 2024-04-10 09:31:44 +02:00
Alejandro Alonso 9adfaae6bc Merge remote-tracking branch 'origin/staging' 2024-04-10 09:31:21 +02:00
Alejandro bbe0baac5f Merge pull request #4390 from penpot/alotor-bugfix-39
🐛 Remove transforming flag and use a global flag
2024-04-10 07:01:58 +02:00
alonso.torres 0fa2dbcaf2 🐛 Remove transforming flag and use a global flag 2024-04-10 06:56:04 +02:00
Pablo Alba c8b2db8145 🐛 Fix crash on moving a copy in a copy (for a migrated file) (2) 2024-04-09 19:11:15 +02:00
alonso.torres a3f44074a0 🐛 Removed shortcut ctrl+alt+enter in production 2024-04-09 18:05:00 +02:00
Kelp 656e910896 📎 Remove unnecessary html tags 2024-04-09 17:55:51 +02:00
Kelp 39c35d51d3 📎 Add missing <p> 2024-04-09 17:55:51 +02:00
Kelp 5b4fcd2c80 📎 Fix small content error 2024-04-09 17:55:51 +02:00
Kelp 91ade7fe58 🐛 Fix social media links 2024-04-09 17:55:51 +02:00
Kelp 19878484a6 🐛 Fix wrong website link 2024-04-09 17:55:51 +02:00
Kelp c27f884755 Add light and dark version of the header 2024-04-09 17:55:51 +02:00
Alejandro Alonso fcd29211a4 🐛 Fix cmd+optin+enter when popups blocked 2024-04-09 17:12:24 +02:00
Alejandro Alonso b130cc40f0 Merge remote-tracking branch 'origin/staging' 2024-04-09 13:13:23 +02:00
Alejandro c94478c9bb Merge pull request #4383 from penpot/alotor-bugfix-38
Alotor bugfix 38
2024-04-09 13:13:01 +02:00
Alejandro Alonso 19fc5fa820 Merge remote-tracking branch 'origin/staging' into develop 2024-04-09 12:56:31 +02:00
Alejandro Alonso 227b2fe085 erge remote-tracking branch 'origin/staging' 2024-04-09 12:56:04 +02:00
Pablo Alba a4c7cc51bb 🐛 Fix crash on moving a copy in a copy (for a migrated file) 2024-04-09 12:49:30 +02:00
alonso.torres f6c6207522 🐛 Fix problem renaming boards from viewport 2024-04-09 12:07:17 +02:00
alonso.torres 8f0e11d020 🐛 Fix component name ellipsis 2024-04-09 12:05:02 +02:00
alonso.torres 27010ae0fb 🐛 Fix problem when moving horizontal/vertical lines 2024-04-09 12:03:59 +02:00
alonso.torres b7c4cb1f58 🐛 Fix project name being cut 2024-04-09 12:03:06 +02:00
alonso.torres a9052e2690 🐛 Fix problem changing fill images 2024-04-09 12:01:56 +02:00
Andrey Antukh 171320d1c0 Merge remote-tracking branch 'origin/staging' into develop 2024-04-09 10:05:51 +02:00
Andrey Antukh e8b29c3cfc 🐛 Fix incorrect grid calcultation condition on compv2 migration script 2024-04-08 17:29:58 +02:00
Andrey Antukh 7ebf8dd702 Skip invalid graphics on migration post binfile import 2024-04-08 17:29:58 +02:00
Alejandro Alonso 3fa1d3b5fd Merge remote-tracking branch 'origin/staging' into develop 2024-04-08 16:53:28 +02:00
Alejandro Alonso c5109a1cd5 Merge remote-tracking branch 'origin/staging' 2024-04-08 16:53:15 +02:00
Alejandro 36129bd227 Merge pull request #4376 from penpot/alotor-fix-sort-indexed-problem
🐛 Fix problem with sort indexed shapes
2024-04-08 16:52:12 +02:00
alonso.torres aed6a045b3 🐛 Fix problem with sort indexed shapes 2024-04-08 16:32:34 +02:00
Alejandro 2fda60f995 Merge pull request #4374 from penpot/hiru-fix-paste-main
Fix paste main component in a different file
2024-04-08 16:24:47 +02:00
Alejandro Alonso 8093555acc Merge remote-tracking branch 'origin/staging' 2024-04-08 14:56:34 +02:00
Andrey Antukh fb24918fd9 Merge remote-tracking branch 'origin/staging' into develop 2024-04-08 14:07:43 +02:00
Alejandro 8be45f100b Merge pull request #4372 from penpot/niwinz-staging-bugfix-6
🐛 Minor bugfixes
2024-04-08 14:07:31 +02:00
Andrés Moya 10fbae2f0a 🐛 Fix error when pasting a main component in other file 2024-04-08 14:02:30 +02:00
Andrey Antukh 5f8d66e7eb Remove unnecesarry transaction wrapping on import-binfile 2024-04-08 13:23:59 +02:00
Andrey Antukh 37507c3697 📎 Update logging on worker module 2024-04-08 11:53:33 +02:00
Kelp 984dacba2b Update README.md small fix 2024-04-08 11:50:55 +02:00
Kelp 93debeb272 Update README.md 2.0 2024-04-08 11:49:56 +02:00
Andrey Antukh 0965c71a08 📎 Update logging on webhook task handler 2024-04-08 11:42:01 +02:00
Andrey Antukh d435b17452 🐛 Fix io exception incorrect reporting 2024-04-08 11:18:26 +02:00
Andrey Antukh 06206f39b0 📎 Update devenv nginx configuration 2024-04-08 11:07:32 +02:00
Andrey Antukh fd5b1c0341 Enable by default components v2 feature 2024-04-08 11:05:16 +02:00
Alejandro Alonso 4029735364 Merge remote-tracking branch 'origin/staging' 2024-04-08 11:00:40 +02:00
Alejandro b836e8c5ab Merge pull request #4371 from penpot/niwinz-staging-bugfix-6
🐛 Fix timeout error on large binfile import
2024-04-08 10:56:59 +02:00
Alejandro Alonso 2cd0bc565d 🐛 Fix change shadow color from selected colors 2024-04-08 10:26:11 +02:00
AzazelN28 ccce550cda 🐛 Fix comments and history toggle 2024-04-08 10:07:16 +02:00
Andrey Antukh 6904cacd0c 🐛 Fix timeout error on large binfile import 2024-04-08 09:57:36 +02:00
Alejandro a4a70f81b9 Merge pull request #4352 from penpot/niwinz-staging-migration
📎 MIgration related optimizations
2024-04-07 14:18:26 +02:00
Andrey Antukh e01f8d6fdf 📎 Update migration scripts 2024-04-07 14:07:40 +02:00
Andrey Antukh da5f452db5 🐛 Fix issue on migration script related to version 2024-04-07 14:07:40 +02:00
Andrey Antukh 542b27a779 📎 Add minor changes to compv2 related scripts 2024-04-07 14:07:40 +02:00
Andrey Antukh fed9346ec6 Improve partitioning mechanism on compv2 migration 2024-04-07 14:07:40 +02:00
Andrey Antukh 29332b67f9 Add optimizations to order-by-indexed-shapes fn 2024-04-07 14:07:40 +02:00
Alejandro Alonso c97f2d620d Merge remote-tracking branch 'origin/staging' 2024-04-07 05:34:07 +02:00
Alejandro 26ca36d8c6 Merge pull request #4365 from penpot/alotor-fix-visual-firefox-bug
Fix visual firefox bug
2024-04-05 16:03:02 +02:00
Alejandro Alonso 9dac69894e 🐛 Add lost template image 2024-04-05 15:56:47 +02:00
alonso.torres 5a79a2d4d6 🐛 Fix visual bug in firefox 2024-04-05 14:58:12 +02:00
Alejandro 10fbbd6c86 Merge pull request #4364 from penpot/superalex-updating-libraries-and-templates-2
🎉 Update libraries and templates section
2024-04-05 14:21:39 +02:00
Alejandro Alonso a7b7355a7d 🎉 Update libraries and templates section 2024-04-05 14:19:15 +02:00
alonso.torres 43faa06ac0 🐛 Fix problem with uploading temp files 2024-04-05 12:34:56 +02:00
Alejandro 24c9bcf944 Merge pull request #4362 from penpot/superalex-updating-libraries-and-templates
🎉 Update libraries and templates section
2024-04-05 11:45:28 +02:00
Alejandro Alonso 520acfc823 🎉 Update libraries and templates section 2024-04-05 11:36:23 +02:00
Andrés Moya c2737f2378 🐛 Avoid datatype problem calculating proportions 2024-04-05 10:15:17 +02:00
Alejandro b2020c8a66 Merge pull request #4360 from penpot/eva-fix-onboarding-grid
🐛  Fix position of image grid on onboarding
2024-04-05 09:54:21 +02:00
Eva Marco ce7f1440fa 🐛 Fix position of image grid on onboarding 2024-04-05 09:25:50 +02:00
Andrés Moya 3127a020a0 🐛 Remove fill from group heads when migrating to v2 2024-04-04 17:45:45 +02:00
alonso.torres 02ea0374a3 🐛 Fix problem moving shapes into grid 2024-04-04 17:45:31 +02:00
alonso.torres c295680c89 🐛 Fix problem with grid ordering 2024-04-04 16:48:56 +02:00
alonso.torres e420be5e51 🐛 Fix problem ordering layers in html markup 2024-04-04 16:48:56 +02:00
alonso.torres b1e226cdc6 🐛 Fix problem with import zip files 2024-04-04 16:09:11 +02:00
Andrey Antukh e813fcb9b7 Merge remote-tracking branch 'origin/staging' into develop 2024-04-04 14:19:45 +02:00
Pablo Alba 8c72770fec 🐛 Fix can't move a layer on a copy 2024-04-04 14:03:48 +02:00
Pablo Alba e33b08f47f 🐛 Fix crash on moving a copy outside a copy 2024-04-04 14:03:48 +02:00
Pablo Alba 065d481cb5 🐛 Remove the swap slot on some operations with copies 2024-04-04 13:50:57 +02:00
AzazelN28 ad3e44258a 📎 Add cookie consent comment 2024-04-04 13:38:56 +02:00
Andrey Antukh ad0aae375b Merge remote-tracking branch 'origin/staging' into develop 2024-04-04 12:45:38 +02:00
Eva Marco 7e398515d3 Merge pull request #4350 from penpot/alotor-bugfix-36
Bugfixes
2024-04-04 12:30:40 +02:00
Belén Albeza ee4e1fbbf4 🐛 Fix comments not being visible on view mode 2024-04-04 10:44:25 +02:00
Belén Albeza 8541ddc598 🐛 Fix comments padding 2024-04-04 10:44:25 +02:00
alonso.torres bd2630fa1a 🐛 Add shortcut description for grid layout toggle 2024-04-04 10:07:18 +02:00
alonso.torres d96902f61d 🐛 Fix filter layers 2024-04-04 09:59:24 +02:00
alonso.torres 677da04c43 🐛 Fix component name ellipsis 2024-04-04 09:59:24 +02:00
alonso.torres 4ba7bf664b 🐛 Fix code generation format 2024-04-04 09:59:24 +02:00
alonso.torres 9c36d77573 🐛 Fix problem with cursor when shapes flipped 2024-04-04 09:59:24 +02:00
alonso.torres 5fd72cf9d9 🐛 Fix problem with flip properties 2024-04-04 09:59:24 +02:00
alonso.torres b258b05fb2 🐛 Fix problem with rtl 2024-04-04 09:59:24 +02:00
alonso.torres a4776cf27f 🐛 Fix problem with comment refreshing 2024-04-04 09:59:24 +02:00
Eva Marco 61df70b314 🐛 Fix go back close view only 2024-04-04 09:58:59 +02:00
Andrés Moya dbe32fa980 💄 Fix small typo. 2024-04-04 09:55:50 +02:00
Eva Marco c4df29f2a6 🐛 Fix hover state on export button 2024-04-03 17:53:08 +02:00
AzazelN28 6b84eef14b 🐛 Fix toolbar hidden after path creation 2024-04-03 17:50:04 +02:00
AzazelN28 357cdb807b ♻️ Refactor carousel using scroll-snap 2024-04-03 17:49:17 +02:00
AzazelN28 7c1e8a753f Add lazy loading to dashboard templates 2024-04-03 17:49:17 +02:00
Eva Marco 04fe8f8960 🐛 Fix close viewer thumbnail clicking outside 2024-04-03 17:44:38 +02:00
Pablo Alba d57d1ef346 Merge pull request #4311 from penpot/hiru-fix-graphic-sizes
Fix sizes of graphics migrated from v1
2024-04-03 17:34:13 +02:00
Andrés Moya bd8fcfde28 🐛 Fix sizes of migrated graphics 2024-04-03 17:26:53 +02:00
Andrey Antukh 3a67e51f2f Move worker runner to a separated namespace 2024-04-03 17:03:06 +02:00
Andrey Antukh 4ccea6b2cf Move worker dispatcher code to a separated ns 2024-04-03 17:03:06 +02:00
Andrey Antukh d2998e1767 Move executor service initialization to a separared ns 2024-04-03 17:03:06 +02:00
Andrey Antukh 9c724c8e95 Set better log level on some rpc middlewares 2024-04-03 17:03:06 +02:00
Andrey Antukh e2ddb3e31e Move worker cron related code to a separated namespace 2024-04-03 17:03:06 +02:00
Andrey Antukh 9c9d09a816 Add better logging of elapsed time for cron tasks 2024-04-03 17:03:06 +02:00
Pablo Alba cfb5e9aa66 On migration to v2, add the component path to the copy name 2024-04-03 16:04:23 +02:00
AzazelN28 411af023d5 🐛 Fix comment reply menu 2024-04-02 15:29:07 +02:00
AzazelN28 193df9ce1e 🐛 Fix horizontal resize comment textarea 2024-04-02 15:29:07 +02:00
Eva Marco 08c5cdb2dd 🐛 Fix guides color in both themes 2024-04-02 15:24:53 +02:00
Andrey Antukh d20a92ce50 Merge remote-tracking branch 'origin/staging' into develop 2024-04-02 11:35:30 +02:00
Pablo Alba 5cd46d8bc0 Merge pull request #4338 from penpot/eva-fix-auth-link-css
🐛  Fix auth links font-size
2024-04-01 15:11:00 +02:00
Pablo Alba dd4cc56384 Merge pull request #4333 from penpot/eva-bugfixing-14
🐛 Fix view only reset on go-back icon
2024-04-01 15:09:01 +02:00
Eva Marco f24323148b 🐛 Fix auth links font-size 2024-04-01 09:24:29 +02:00
Eva Marco 2396b54e15 🐛 Fix view only reset 2024-03-27 13:24:44 +01:00
Alejandro 3873f477d6 Merge pull request #4330 from penpot/eva-bugfixing-13
🐛 Fix frontend errors
2024-03-27 12:35:52 +01:00
Eva Marco 8285d7538b Merge pull request #4331 from penpot/ladybenko-6582-fix-renaming-firefox
🐛 Fix layer and component names inputs not having their text selectable on Firefox
2024-03-27 12:18:05 +01:00
Belén Albeza 78aafa4635 🐛 Fix layer and component names inputs not having their text selectable on Firefox 2024-03-27 12:02:15 +01:00
Eva Marco 315be268a4 🐛 Fix component element count while dragging 2024-03-27 11:31:23 +01:00
Andrey Antukh 4351c221ac Merge remote-tracking branch 'origin/staging' into develop 2024-03-27 11:10:45 +01:00
Andrey Antukh 7fa026da15 🐛 Fix issue on frontend build script 2024-03-27 11:08:59 +01:00
Alejandro 0c72a6f7fa Merge pull request #4329 from penpot/alotor-bugfix-35
Bugfixes
2024-03-27 10:02:26 +01:00
alonso.torres 4ef7af104d 🐛 Fix problem with show guides config 2024-03-27 08:41:43 +01:00
alonso.torres ef0abc1498 🐛 Fix problem with rulers in Firefox 2024-03-26 17:02:03 +01:00
Eva Marco af5d05b460 🐛 Fix stroke cap dropdown 2024-03-26 16:55:50 +01:00
alonso.torres bd88b872c7 🐛 Fix problem with flip horizontal/vertical 2024-03-26 16:06:44 +01:00
alonso.torres 4dac2221e7 🐛 Fix problem with proportional scaling 2024-03-26 16:06:44 +01:00
alonso.torres 5315dc18af 🐛 Fix problems with bool shapes 2024-03-26 16:06:44 +01:00
Belén Albeza 6a0768b490 🐛 Fix helper to compile polyfills 2024-03-26 15:09:58 +01:00
Eva Marco 4212b46835 🐛 Add tooltip to select elements by color 2024-03-26 13:55:24 +01:00
Alejandro Alonso 8bf8a28439 🐛 Fix copy paste images on different environments 2024-03-26 13:54:54 +01:00
Alejandro Alonso 1f5658ad1b Merge remote-tracking branch 'origin/staging' into develop 2024-03-26 09:44:10 +01:00
Alejandro 54af1ce7ae Merge pull request #4325 from penpot/alotor-bugfix-34
Bugfixes
2024-03-26 09:43:27 +01:00
alonso.torres 5d200a70d6 🐛 Fix problem with grid edition 2024-03-26 08:23:31 +01:00
alonso.torres ecc61130ec 🐛 Fix problem when exporting html texts 2024-03-26 08:23:31 +01:00
alonso.torres 588410bbb1 🐛 Fix problem when importing SVG 2024-03-26 08:23:31 +01:00
alonso.torres d83787d714 🐛 Fix problem with gradients and borders 2024-03-26 08:23:31 +01:00
alonso.torres 5a30c5e584 🐛 Fix problem with gradient fill text 2024-03-26 08:23:31 +01:00
Alejandro 0df97d4d7d Merge pull request #4324 from penpot/alotor-bugfix-34
Bugfixes
2024-03-26 07:40:07 +01:00
Alejandro 81a271961f Merge pull request #4323 from penpot/niwinz-staging-bugfix-2
 Several improvements
2024-03-26 07:32:05 +01:00
Alejandro e4c8d09e9c Merge pull request #4322 from penpot/eva-fix-layer-color
🐛 Fix component layer color
2024-03-26 07:26:31 +01:00
Eva Marco 1d2110b68c 🐛 Fix component layer color 2024-03-26 07:13:11 +01:00
Andrey Antukh b85c3bec18 Add better timestamp control on audit handler 2024-03-25 17:58:40 +01:00
Andrey Antukh 763fc3532e Simplify local audit table
Remove unnecessary partitioning
2024-03-25 17:58:39 +01:00
alonso.torres e10c96fa8b 🐛 Fix problem with grid edition 2024-03-25 16:10:25 +01:00
alonso.torres 4b846b17f0 🐛 Fix problem when exporting html texts 2024-03-25 15:35:04 +01:00
Andrey Antukh eaf546ba5e Add improvements to telemetry task 2024-03-25 15:07:55 +01:00
Alejandro Alonso 22fd0ae306 🐛 Update modification date on publish/unpublish file as library 2024-03-25 14:17:07 +01:00
Alejandro ffe505e525 Merge pull request #4319 from penpot/superalex-improve-file-validation
🐛 Relax file validation for anidated components from other files
2024-03-25 13:22:56 +01:00
Alejandro Alonso f66f168a99 🐛 Relax file validation for anidated components from other files 2024-03-25 13:15:22 +01:00
alonso.torres 6f2f2291c2 🐛 Fix problem when importing SVG 2024-03-25 13:12:47 +01:00
Andrey Antukh fd24831c71 Move audit tasks to separated namespace files 2024-03-25 10:46:15 +01:00
alonso.torres 33c12117cc 🐛 Fix problem with gradients and borders 2024-03-25 09:49:38 +01:00
Alejandro 8585e73c0f Merge pull request #4320 from penpot/eva-login-tagline
♻️ Add tagline and some refactor to login page
2024-03-25 09:25:28 +01:00
Alejandro f8bd0ba28a Merge pull request #4216 from penpot/niwinz-staging-gulp-replace
🎉 Replace gulp with node scripts
2024-03-25 09:20:19 +01:00
alonso.torres 94f9551b92 🐛 Fix problem with gradient fill text 2024-03-25 09:20:12 +01:00
Eva Marco a75c32fa67 ♻️ Refactor css 2024-03-25 09:19:33 +01:00
Andrey Antukh 259eae70c6 Merge remote-tracking branch 'origin/staging' into develop 2024-03-25 08:48:18 +01:00
Andrey Antukh ec9d67ae1e 🎉 Add node scripts based compile & watch alternative to gulp 2024-03-25 08:47:55 +01:00
Andrey Antukh 83ac6024a2 🔥 Remove old and unused scripts from frontend directory 2024-03-25 08:47:55 +01:00
Eva Marco 30e1c3b4ff ♻️ Add tagline and some refactor to login page 2024-03-22 16:45:51 +01:00
Alejandro 43d7d91415 Merge pull request #4318 from penpot/niwinz-staging-bugfix-2
🐛 Several bugfixes
2024-03-22 16:45:03 +01:00
Alejandro a9325754b5 Merge pull request #4316 from penpot/alotor-bugfix-33
Bugfixing
2024-03-22 16:44:09 +01:00
Alejandro b5cfff77b3 Merge pull request #4317 from penpot/eva-bugfix-libraries
🐛 Add gap between library elements modal
2024-03-22 16:37:18 +01:00
Alejandro f0602a7a04 Merge pull request #4315 from penpot/eva-add-tooltips
 Add missing tooltips
2024-03-22 16:35:30 +01:00
Andrey Antukh 835c29fbea 🐛 Add missing audit event on copy-all-code 2024-03-22 13:05:22 +01:00
Andrey Antukh a6562619a3 🐛 Fix incorrect fragment cleaning on file-gc task 2024-03-22 12:59:36 +01:00
Andrey Antukh a6c9ced5b3 🐛 Fix minor issue on internal srepl helpers 2024-03-22 12:59:16 +01:00
Andrey Antukh 7e803eeca8 Add minor improvements for fdata logging 2024-03-22 12:58:50 +01:00
Eva Marco 4ef62cc2dc 🐛 Add gap between library elements modal 2024-03-22 12:22:17 +01:00
alonso.torres 9c2cbb2a48 🐛 Fix problem with scaling constraints 2024-03-22 12:09:49 +01:00
alonso.torres 2735229ffe 🐛 Fix problem with new line in comments 2024-03-22 12:09:49 +01:00
alonso.torres bf5d95e069 🐛 Fix problem with fit-content on coponent copies 2024-03-22 12:09:49 +01:00
Eva Marco b3f4f389ff Add tooltips to some buttons 2024-03-22 11:33:05 +01:00
AzazelN28 3d6eb9d4bb 🐛 Fix check thumbnails size 2024-03-22 10:13:17 +01:00
Eva Marco 87146bea85 🐛 Fix collapse group shadow independently 2024-03-22 08:58:00 +01:00
Eva Marco d8a6abfb88 🐛 Fix image layer filter 2024-03-22 08:58:00 +01:00
Alejandro 1d726249d0 Merge pull request #4313 from penpot/palba-fix-crash-moving-frame-copy
🐛 Fix Crash on moving a frame with copy outside a component
2024-03-22 08:49:16 +01:00
Pablo Alba 0d751b0e20 🐛 Fix Crash on moving a frame with copy outside a component 2024-03-22 08:43:09 +01:00
Andrey Antukh c0fa766b64 📎 Update version.txt file 2024-03-22 08:40:31 +01:00
Andrey Antukh a79e4d7af3 Merge remote-tracking branch 'origin/staging' into develop 2024-03-22 08:40:09 +01:00
AzazelN28 bd9874cf28 🐛 Fix exit edit path mode 2024-03-22 08:38:44 +01:00
Alejandro 1beb39ff60 Merge pull request #4297 from penpot/hiru-fix-advance-shape-ref
Fix references when duplicating nested copies
2024-03-22 08:22:20 +01:00
Andrés Moya 9a7a99e67a 🐛 Advance nested copies when duplicated 2024-03-22 07:51:11 +01:00
Alejandro Alonso b9743891bb 🐛 Fix is-main-of? calculation for v2 components 2024-03-21 15:49:08 +01:00
Alejandro Alonso 8f156a7fd0 🐛 Limit reset overrides on swapped components to affected subtree 2024-03-21 15:49:08 +01:00
AzazelN28 ef2dfe5888 🐛 Fix library horizontal scroll 2024-03-21 14:07:45 +01:00
Alejandro 095e48e479 Merge pull request #4308 from penpot/palba-add-more-debug
📎 Add two more debug options :display-touched and :show-ids
2024-03-21 13:18:26 +01:00
Pablo Alba 0cd44f5540 📎 Add two more debug options :display-touched and :show-ids 2024-03-21 13:08:56 +01:00
Alejandro 1d25115218 Merge pull request #4305 from penpot/niwinz-staging-bugfix-1
🐛 Minor bugfixes
2024-03-21 12:25:47 +01:00
Andrey Antukh f697f32707 🐛 Add demo warning to login 2024-03-21 11:34:55 +01:00
Eva Marco d14565437c 🐛 Fix color asset tooltip 2024-03-21 10:59:44 +01:00
Eva Marco 1c65df69f3 🐛 Fix pinned project on creation 2024-03-21 10:59:44 +01:00
Eva Marco b4c78e11f4 🐛 Fix inspecting mode text 2024-03-21 10:59:44 +01:00
Andrey Antukh 9a0bb36a20 Set proper internal version number 2024-03-21 10:43:25 +01:00
Andrey Antukh 64dc58c259 🐛 Set correctly the default features 2024-03-21 10:35:18 +01:00
Andrey Antukh f8bfe249aa 🔥 Remove login illustration flag
It is now a permament configuration
2024-03-21 10:34:10 +01:00
Alejandro Alonso 4606785e5f 🐛 Fix move anidated structures withc component copies to other component copies 2024-03-21 10:14:43 +01:00
Alejandro 892acecd9b Merge pull request #4302 from penpot/niwinz-staging-bugfix-1
🐛 Fix release build issue
2024-03-20 16:32:32 +01:00
Andrey Antukh 526f6ef841 🐛 Fix release build issue
Caused by an unsolved corner case of the interaction of code-move
between modules and types defined with reify. Mainly moves some
definition of protocol to one module and the definition of the type
to other, and as the definition of the type is conditional to the
function execution, the whole build fails to initialize because the
second protocol extension implementation can't find the type initialized
on application startup.
2024-03-20 16:12:00 +01:00
Alejandro 8148151ee5 Merge pull request #4291 from penpot/migration
🐛 Several bugfixes
2024-03-20 14:36:15 +01:00
Alejandro dc39a14c7c Merge pull request #4295 from penpot/azazeln28-fix-dashboard-thumbnails-with-strokes
🐛 Fix dashboard thumbnails with strokes
2024-03-20 09:33:54 +01:00
Andrey Antukh 5c6e8366c1 🐛 Fix unexpected exception on fix-percent functions 2024-03-20 09:33:53 +01:00
AzazelN28 4378f132b4 🐛 Fix dashboard thumbnails with strokes 2024-03-20 06:44:23 +01:00
Alejandro abd66050bd Merge pull request #4296 from penpot/eva-bugfing-10
🐛 Fix frontend errors
2024-03-20 06:30:25 +01:00
Eva Marco 02ff228f29 🐛 Fix flow dropdown paddings 2024-03-19 16:35:44 +01:00
Eva Marco ea73e1d365 🐛 Fix interaction icons 2024-03-19 16:19:05 +01:00
alonso.torres b31683fe72 🐛 Fix problem with mouse out events 2024-03-19 15:57:16 +01:00
Eva Marco 190e022c29 🐛 Fix Vertical scroll inside the action menu works badly with nested menu 2024-03-19 15:39:02 +01:00
Eva Marco 151421c8db 🐛 Fix toggle comments and history states 2024-03-19 15:39:02 +01:00
Eva Marco aae4c13231 🐛 Fix add page paddings and margins 2024-03-19 15:39:02 +01:00
Alejandro 0fbd7e95df Merge pull request #4289 from penpot/eva-remove-css
♻️ Remove unused CSS files
2024-03-19 13:50:28 +01:00
Alejandro ebb02f28be Merge pull request #4292 from penpot/azazeln28-fix-imposters-with-strokes
🐛 Fix imposters rendering with strokes
2024-03-19 12:08:23 +01:00
Alejandro 311a609977 Merge pull request #4290 from penpot/alotor-bugfix-32
Bugfix
2024-03-19 11:53:29 +01:00
AzazelN28 121876110a 🐛 Fix imposters rendering with strokes 2024-03-19 11:42:18 +01:00
alonso.torres dec3478024 🐛 Fix problem with sticky selection on hovering sidebars 2024-03-19 11:42:18 +01:00
Andrey Antukh edb0408300 🐛 Fix issue on climit when it is not enabled 2024-03-19 11:40:30 +01:00
Eva Marco ab3e2fd9c2 ♻️ Remove unused CSS files 2024-03-19 11:34:13 +01:00
alonso.torres e3f508d8d4 🐛 Fix problem with rendering SVG fills 2024-03-19 11:27:06 +01:00
Andrey Antukh 67cdaa397c Add minor improvements to devenv initial flags 2024-03-19 11:21:16 +01:00
Eva Marco fe3c68ec39 Merge pull request #4288 from penpot/superalex-fix-error-update-email
🐛 Fix error when update email
2024-03-19 09:56:52 +01:00
Andrey Antukh 126bab3ce4 🐛 Fix invalid page name on compv2 migration 2024-03-19 09:15:04 +01:00
Alejandro Alonso ab0b3c71a8 🐛 Improve fixing root shapes for v1 components on migration to v2 2024-03-19 09:05:35 +01:00
Andrey Antukh cfe6fae77d 🐛 Fix incorrect version handling on file migration 2024-03-19 09:03:08 +01:00
Alejandro Alonso 94a0c12049 🐛 Fix error when update email 2024-03-19 08:22:47 +01:00
Alejandro 409eea6c5c Merge pull request #4286 from penpot/alotor-bugfix-31
Bugfix
2024-03-19 06:36:55 +01:00
Eva Marco 6b03145524 🐛 Fix height of v2 modal 2024-03-18 17:23:40 +01:00
Eva Marco 0204cc5d40 🐛 Fix components background color 2024-03-18 17:23:40 +01:00
Eva Marco 65fa434388 🐛 Fix dahsboard project scroll 2024-03-18 17:23:40 +01:00
Alejandro Alonso 38b72abf32 🐛 Fix allow modify component copy structure under some circumstances 2024-03-18 16:45:05 +01:00
alonso.torres 19b5baf7ee 🐛 Fix scroll for import modal 2024-03-18 16:29:26 +01:00
alonso.torres 5e89b1c1d0 🐛 Fix problem when dragging template to the dashboard 2024-03-18 16:29:26 +01:00
alonso.torres 0590336c71 🐛 Fix problem with order of operations 2024-03-18 16:29:26 +01:00
Alejandro Alonso 8363b86cfa 🐛 Fix shadows lost on import export 2024-03-18 15:57:55 +01:00
Pablo Alba a5b156e0d6 🐛 Fix change structure of comp doesn't update copies on another file 2024-03-18 15:31:30 +01:00
Alejandro Alonso d6b60ce43a 🐛 Fix rmap shape refs on components v2 migration 2024-03-18 14:19:40 +01:00
Alejandro 589fb144db Merge pull request #4272 from peterstnsz/patch-1
Update README.md
2024-03-18 10:18:41 +01:00
alonso.torres fd4470afde Merge remote-tracking branch 'origin/staging' into develop 2024-03-18 09:59:06 +01:00
Alejandro 89b43d7127 Merge pull request #4269 from penpot/telemetry
 Improve internal naming of setup/props
2024-03-18 09:53:15 +01:00
Alejandro db59de8494 Merge pull request #4282 from penpot/eva-bugfixing-6
🐛 Fix some UI errors
2024-03-18 09:44:45 +01:00
Alejandro ef91c00b10 Merge pull request #4270 from penpot/eva-bugfixing-5
🐛  Fix some UI errors
2024-03-18 09:22:52 +01:00
Eva Marco 440495a1d0 🐛 Fix submenu positioning in context menu 2024-03-18 09:22:45 +01:00
Eva Marco b999057be1 🐛 Fix path top bat z-index 2024-03-18 09:22:43 +01:00
Alejandro Alonso ca5e2c345b 🎉 Improve naming of components for Main components page on v1 to v2 migration 2024-03-18 09:13:15 +01:00
Alejandro Alonso 3f316ca9c9 🐛 Fix swap on anidated frames 2024-03-18 09:05:49 +01:00
Eva Marco cdab615cbb 🐛 Fix copies of snap to grid and show hide grid 2024-03-18 08:53:48 +01:00
Alejandro 355af61cda Merge pull request #4281 from penpot/alotor-bugfix-30
Bugfixing
2024-03-18 07:03:14 +01:00
Alejandro 9dc7671a95 Merge pull request #4279 from penpot/eva-add-release-copies
 Add new copies to the release modal
2024-03-18 06:53:25 +01:00
Alejandro 319cbe02cc Merge pull request #4277 from penpot/ladybenko-7199-fix-toolbar-position
Fix toolbar + subactions toolbar positioning
2024-03-18 06:33:59 +01:00
alonso.torres 8e7471509c 🐛 Fix problem on modal transfer owner 2024-03-15 16:02:00 +01:00
alonso.torres dc7d279e9d 🐛 Fix problem with interactions over frames 2024-03-15 16:02:00 +01:00
alonso.torres dd69762b31 🐛 Fix problem with dismiss fonts 2024-03-15 15:34:16 +01:00
alonso.torres db7ed75a91 🐛 Add mime-type otf to color picker 2024-03-15 15:34:16 +01:00
alonso.torres 8850fd8894 🐛 Fix problem dragging in draft/projects screen 2024-03-15 15:34:16 +01:00
alonso.torres b097f73b13 🐛 Fix problem with snap to frame guides 2024-03-15 15:34:16 +01:00
alonso.torres 895f649ef1 🐛 Stop drag events when the user focus out the application 2024-03-15 15:34:16 +01:00
Alejandro Alonso 054ffbe396 🐛 Fix duplicate board 2024-03-15 14:15:49 +01:00
Eva Marco 80370e39b5 Add new copies to the release modal 2024-03-15 14:03:24 +01:00
Belén Albeza 51c2269c84 🐛 Fix subactions toolbar positioning 2024-03-15 12:22:11 +01:00
Belén Albeza 1e9c6f3ebe 🐛 Fix main toolbar positioning when rulers are hidden 2024-03-15 11:22:24 +01:00
Alejandro Alonso a3ca905f37 🐛 Fix uneven layer opacities 2024-03-15 09:27:30 +01:00
Eva Marco d8a9e1a2cb Merge pull request #4273 from penpot/ladybenko-7173-fix-dashboard-layouts
🐛 Fix projects & teams dashboard pages
2024-03-15 09:15:45 +01:00
Eva Marco a237a82e6f Merge pull request #4271 from penpot/alotor-bugfix-29
Bugfixing
2024-03-14 17:32:13 +01:00
alonso.torres affa37f0c5 🐛 Fix problem with scroll style in windows 2024-03-14 16:54:15 +01:00
alonso.torres 55b6df0ae4 🐛 Make opacity override same color recent-color 2024-03-14 16:16:33 +01:00
Belén Albeza b5fe07d5ee 🐛 Fix projects & teams dashboard pages 2024-03-14 16:02:37 +01:00
Andrey Antukh 1a12e63027 ♻️ Simplify audit events code 2024-03-14 15:59:47 +01:00
alonso.torres 5c33bc6892 🐛 Make the layout boards export as responsive markup 2024-03-14 15:52:26 +01:00
Peter e1e05e6de8 Update README.md
Link in the footer https://kaleidos.net/products returns 404
2024-03-14 14:52:20 +00:00
alonso.torres 6bf3363429 🐛 Fix scroll when file menu open 2024-03-14 14:19:55 +01:00
alonso.torres 3bc6d2b0a7 🐛 Fix migrating old components should not clip the content 2024-03-14 13:35:56 +01:00
alonso.torres d5b2a91bce 🐛 Fix problem with fast change between numeric inputs 2024-03-14 12:42:07 +01:00
Eva Marco 4e9710ddfa 🐛 Fix dashboard comment title 2024-03-14 12:15:01 +01:00
Andrey Antukh 91118bec70 Improve internal naming of setup/props
This reverts commit a6f70c77cb.
2024-03-14 10:48:23 +01:00
alonso.torres 75d0648065 🐛 Fix problem with throttle function 2024-03-14 09:53:07 +01:00
Alejandro 7436918edb Merge pull request #4260 from penpot/eva-bugfixing-4
🐛  Some UI fixes
2024-03-14 08:36:16 +01:00
Alejandro 1d55b30132 Merge pull request #4262 from penpot/alotor-bugfix-28
Bugfixes
2024-03-14 08:27:32 +01:00
Alejandro ecab472ced Merge pull request #4263 from penpot/hiru-add-swap-slots
♻️ Add a tool to generate swap-slots
2024-03-14 08:23:36 +01:00
Eva Marco fbe09e6b5a 🐛 Fix workspace context menu in small screens 2024-03-13 17:36:40 +01:00
Andrés Moya 2247f0ecac ♻️ Add a tool to generate swap-slots 2024-03-13 17:01:43 +01:00
Eva Marco 04a69c2a2c 🐛 Fix update modal spacing 2024-03-13 16:41:53 +01:00
alonso.torres b00b77895f 🐛 Fix comment number in sidebar 2024-03-13 16:21:41 +01:00
alonso.torres c47fe2954a 🐛 Fix problem with typography sample 2024-03-13 16:21:41 +01:00
alonso.torres 2a998a2dcc 🐛 Fix problem when expanding components tab 2024-03-13 16:21:41 +01:00
alonso.torres a6f70c77cb Revert " Improve internal naming of setup/props"
This reverts commit f525c6df5e.
2024-03-13 16:21:12 +01:00
Belén Albeza 5f0b86e0df 🐛 Fix file renaming input size 2024-03-13 15:47:30 +01:00
Eva Marco 18fc08d418 🐛 Fix typographies in update modal 2024-03-13 13:17:39 +01:00
Eva Marco b41b3de46d ♻️ Refactor libraries css 2024-03-13 13:07:39 +01:00
Andrey Antukh eabec6be20 🔥 Remove not needed events 2024-03-13 11:40:16 +01:00
Andrey Antukh f525c6df5e Improve internal naming of setup/props 2024-03-13 11:39:53 +01:00
Eva Marco e2412b3d43 🐛 Fix draft grid columns 2024-03-13 11:05:48 +01:00
Eva Marco 16c8c3483f 🐛 Change view only message 2024-03-13 10:18:19 +01:00
Alejandro ecb8ed8b8b Merge pull request #4254 from penpot/palba-fix-crash-copy
🐛 Fix crash copy paste a Copy from a library
2024-03-13 10:01:58 +01:00
Eva Marco 4c0e17ea7b Merge pull request #4259 from penpot/alotor-fix-update-profile
🐛 Fix problem with language update
2024-03-13 10:00:55 +01:00
Eva Marco 98b41a5bff 🐛 Fix assets group name when is too long 2024-03-13 09:57:12 +01:00
Pablo Alba 2d5e1f7792 Merge pull request #4250 from penpot/superalex-fix-restore-component
🐛 Fix restore component
2024-03-13 09:48:24 +01:00
alonso.torres d4fb85bb02 🐛 Fix problem with language update 2024-03-13 09:47:20 +01:00
Alejandro 946677f5b3 Merge pull request #4257 from penpot/alotor-bugfixes-27
Bugfixes
2024-03-13 07:11:38 +01:00
Alejandro a704e919d8 Merge pull request #4258 from penpot/palba-fix-swap-mixed-paths
🐛 Fixes the folders in the Swap pannel appear weird on mixed
2024-03-13 06:59:05 +01:00
Pablo Alba f8c416c5ae 🐛 Fixes the folders in the Swap pannel appear weird on mixed 2024-03-12 21:34:45 +01:00
Pablo Alba 76b75192e7 🐛 Fix crash copy paste a Copy 2024-03-12 20:57:33 +01:00
Aitor 8ee79e5d7c 🐛 Fix viewer background visible on transition between frames 2024-03-12 18:13:25 +01:00
Belén Albeza 3b0148046b 🐛 Fix horizontal scroll bar in comments 2024-03-12 18:11:15 +01:00
alonso.torres 8128171d8e 🐛 Fix problem with complementary colors slider in picker 2024-03-12 18:06:36 +01:00
alonso.torres 786513863b 🐛 Fix problem with duplicate in main component 2024-03-12 18:05:36 +01:00
Eva Marco 3bbf97fde9 🐛 Fix invitation badge colors 2024-03-12 18:00:42 +01:00
Eva Marco a3bfeace73 🐛 Fix search icon on dhasboard 2024-03-12 18:00:42 +01:00
Eva Marco 37859a20a6 🐛 Recover lost wrap icon 2024-03-12 18:00:42 +01:00
Eva Marco c865a1bdfd ♻️ Refactor project header css 2024-03-12 18:00:42 +01:00
Eva Marco d478a7d8d9 🐛 Fix project name too long 2024-03-12 18:00:42 +01:00
Alejandro Alonso 56bc70dffe 🐛 Fix restore component 2024-03-12 12:43:42 +01:00
Alejandro 9328974511 Merge pull request #4237 from penpot/palba-fix-swap-loop
🐛 Fix possible loop in the list of swappable components
2024-03-12 11:45:28 +01:00
Eva Marco be22d506a8 Merge pull request #4245 from penpot/ladybenko-6799-comments-moving
🐛 Fix comments thread displacing bubbles
2024-03-12 11:43:45 +01:00
Pablo Alba e6964cf02c Merge pull request #4248 from penpot/superalex-improve-reset-overrides-behaviour
🐛 Fix reset override behaviour
2024-03-12 11:17:58 +01:00
Alejandro 5d5fc2c151 Merge pull request #4243 from penpot/eva-bugfixing-ui-2
🐛 Fix some UI errors
2024-03-12 11:17:21 +01:00
Alejandro Alonso 343efc68c5 🐛 Propagate parent changes con reset overrides 2024-03-12 11:06:58 +01:00
Belén Albeza 3fdf0c727e 🐛 Fix comments thread overflowing the viewport and displacing comment bubbles 2024-03-12 10:27:23 +01:00
Alejandro 1a6a6e9367 Merge pull request #4249 from penpot/alotor-bugfixing-26
Bugfixes
2024-03-12 09:54:21 +01:00
Alejandro Alonso d08dfaa022 🐛 Fix reset override behaviour 2024-03-12 09:12:25 +01:00
alonso.torres 9852558a57 🐛 Fix problem when importing templates 2024-03-11 18:43:56 +01:00
alonso.torres de1dae7f93 🐛 Fix problem with input fast change 2024-03-11 18:43:56 +01:00
alonso.torres bed13c24df 🐛 Fix problem with comments new line 2024-03-11 16:14:24 +01:00
alonso.torres 112e71a259 🐛 Fix propagation of auto/fix sizing on components 2024-03-11 16:14:24 +01:00
alonso.torres 338b6cdbd6 🐛 Add tooltip to button in layout 2024-03-11 16:14:24 +01:00
Eva Marco 358176c927 🐛 Fix project name in sidebar 2024-03-11 16:03:40 +01:00
Pablo Alba 25cf30e7d3 🐛 Fix possible loop in the list of swappable components 2024-03-11 14:28:26 +01:00
Eva Marco 4ffaf6f996 🐛 Fix gradient background image 2024-03-11 11:46:33 +01:00
Andrey Antukh b30d525400 🐛 Fix opts passing on process-file! srepl helper 2024-03-11 11:18:46 +01:00
Eva Marco d860eac59f 🐛 Fix disabled buttons height in login and auth pages 2024-03-11 11:16:15 +01:00
Eva Marco f714f08716 🐛 Fix comment bubble border 2024-03-11 11:05:21 +01:00
Eva Marco 71b4079483 🐛 Fix the hero project height in dashboard 2024-03-11 10:54:00 +01:00
Eva Marco 9940dabfff 🐛 Fix z-index of workspace context menu 2024-03-11 10:16:56 +01:00
Pablo Alba fb58d7a4cc Merge pull request #4239 from penpot/alotor-bugfixes-25
Bugfixes
2024-03-08 16:34:52 +01:00
alonso.torres 5390eabcd6 🐛 Add more shortcuts for next/previous frame in viewer 2024-03-08 16:08:52 +01:00
alonso.torres 8963cb2739 🐛 Fix recent fonts name changes 2024-03-08 16:08:52 +01:00
alonso.torres 69f9982d26 🐛 Fix problem with comment thread ignoring filters 2024-03-08 16:08:52 +01:00
alonso.torres 7f93c41005 🐛 Fix colorpicker open palete library 2024-03-08 16:08:52 +01:00
alonso.torres f32aaee41f 🐛 Fix problem when changing typography assets 2024-03-08 16:08:52 +01:00
Eva Marco 4f01a63771 ♻️ Update name of shape icon refactor 2024-03-08 16:07:38 +01:00
Eva Marco ca7438aab5 ♻️ Rename all icon functions 2024-03-08 16:07:38 +01:00
Eva Marco 5739c0797c ♻️ Rename all refactored icons 2024-03-08 16:07:38 +01:00
Eva Marco 4ef2482b02 ♻️ Remove unused icons 2024-03-08 16:07:38 +01:00
Aitor d0889931b5 🐛 Fix color picker blurry bitmap 2024-03-08 15:45:29 +01:00
Aitor 1c29c73b8e 🐛 Fix rasterizer using wrong sizes 2024-03-08 15:32:48 +01:00
Eva Marco d488d69abc ♻️ Remove old color bullet component 2024-03-08 15:31:29 +01:00
Alejandro 3e9b2ec5c8 Merge pull request #4214 from penpot/hiru-review-override-status-of-swapped-copies
🎉 Improve sync algorithm when swapped copies
2024-03-08 12:10:13 +01:00
Alejandro Alonso 8529927173 ♻️ Avoid unnecessary logs 2024-03-08 12:03:09 +01:00
Andrés Moya 2c12790782 🐛 Fix child compare in reset mode 2024-03-08 11:31:46 +01:00
Andrés Moya 2c740df767 🐛 Do recursive swap-slot finding 2024-03-08 11:31:46 +01:00
Alejandro Alonso bad0fb912b :tada Add undo-group for layout updates 2024-03-08 11:31:32 +01:00
Pablo Alba c214d8b044 🎉 Simplify and fix compare children 2024-03-08 11:30:41 +01:00
Alejandro Alonso 895fb3b480 🎉 Remove shapes-group 2024-03-08 11:30:41 +01:00
Alejandro e25c1e987c Merge pull request #4230 from penpot/azazeln28-component-layers-incorrectly-relocated
🐛 Component layers are incorrectly relocated on drag'n'drop
2024-03-08 09:48:49 +01:00
Aitor 55293e60d6 🐛 Component layers are incorrectly relocated on drag'n'drop 2024-03-08 09:28:05 +01:00
Alejandro ea51a8d9b6 Merge pull request #4235 from penpot/alotor-bugfixes-24
Bugfixing
2024-03-08 09:23:06 +01:00
Alejandro Alonso bdf0a64e3a 🐛 Fix release notes 2.0 2024-03-08 08:52:28 +01:00
alonso.torres 9a976a8f6e 🐛 Fix problem with fix scrolling on nested elements 2024-03-07 17:54:49 +01:00
alonso.torres 916d179009 🐛 Fix error on websockets page 2024-03-07 17:54:49 +01:00
alonso.torres bb5eb4a097 🐛 Fix black screen on non-log access to projects 2024-03-07 17:54:49 +01:00
alonso.torres e2428fc0c6 🐛 Fix problem with space key stuck 2024-03-07 17:54:49 +01:00
alonso.torres ee4c56aa9b 🐛 Fix allow entering invalid emails into the invitation form 2024-03-07 17:54:49 +01:00
alonso.torres 8a6882e155 🐛 Fix inspect copy stroke 2024-03-07 17:54:49 +01:00
alonso.torres 28d6cf6f51 🐛 Fix import stroke attached library color 2024-03-07 17:54:49 +01:00
alonso.torres 747cead313 🐛 Fix forbid empty flow names 2024-03-07 17:54:49 +01:00
alonso.torres b9b85b5ada 🐛 Fix undo for set typography 2024-03-07 17:54:49 +01:00
alonso.torres 0db24dc7ec 🐛 Fix problem with shadow negative spread 2024-03-07 17:54:49 +01:00
alonso.torres 2031e513ed 🐛 Fix problem moving grid elements 2024-03-07 17:54:49 +01:00
Eva Marco 8b6be5b62e ♻️ Refactor access tokens file 2024-03-07 16:49:10 +01:00
Eva Marco bc04eaa910 ♻️ Update access tokens icons 2024-03-07 16:49:10 +01:00
Eva Marco 47df285500 ♻️ Unnest scss rules in dashboard settings 2024-03-07 16:49:10 +01:00
Eva Marco cfffb1e551 ♻️ Update go back icon on dashboard 2024-03-07 16:49:10 +01:00
Eva Marco cf41982ee2 ♻️ Unnest scss of dashboard comments file 2024-03-07 16:49:10 +01:00
Eva Marco 9f7d1be0a9 ♻️ Update dashboard comment icon 2024-03-07 16:49:10 +01:00
Aitor Moreno 9012987f7e Merge pull request #4223 from penpot/niwinz-staging-bugfix-4
🐛 Several bugfixes and optimizations
2024-03-07 15:40:32 +01:00
Andrés Moya 4dfbfcf2ac ♻️ Avoid duplicating helpers 2024-03-07 14:41:08 +01:00
Andrés Moya 07939d11dc 🎉 Improve sync algorithm when swapped copies 2024-03-07 14:41:08 +01:00
Pablo Alba 0d1af260a4 🐛 Remove incorrect find-component function 2024-03-07 14:39:57 +01:00
Pablo Alba 5157928cdb 🐛 Fix copy and paste a main on another main doesn't work 2024-03-07 14:37:32 +01:00
Eva Marco 899093dd55 ♻️ Update team icons 2024-03-07 11:26:49 +01:00
Pablo Alba 875ea58a01 Merge pull request #4229 from penpot/superalex-fix-concat-changes
🐛 Fix concat changes
2024-03-07 10:58:26 +01:00
Alejandro Alonso b3f97fe456 🐛 Fix concat changes 2024-03-07 10:54:03 +01:00
Pablo Alba 24fb48ea0f Merge pull request #4226 from penpot/alotor-update-changelog
Update changelog
2024-03-06 16:42:03 +01:00
alonso.torres 4f69ff7124 📚 Update changelog 2024-03-06 16:39:18 +01:00
Eva Marco 92425fcbaf ♻️ Update dashboard hero and template icons 2024-03-06 14:11:43 +01:00
Andrey Antukh 1134f16ffa 💄 Add cosmetic refactor to dashboard fonts react components 2024-03-06 13:48:32 +01:00
Andrey Antukh d5dbe0b594 Merge remote-tracking branch 'origin/staging' into develop 2024-03-06 12:06:52 +01:00
Aitor Moreno ef99ad349b Merge pull request #4221 from penpot/alotor-bugfixes-23
Alotor bugfixes 23
2024-03-06 10:50:54 +01:00
Andrey Antukh 131fc95ab0 🐛 Fix release notes not showing on release build 2024-03-06 10:01:57 +01:00
Andrey Antukh 7eecd50c50 📚 Add http methods documentation to the API doc page 2024-03-06 09:24:37 +01:00
Andrey Antukh 88f49cfbc9 🐛 Fix email field intrusive autocomplete on firefox
Firefox has a strange behavior because it ignores the autocomplete
attribute and just does not allow submit a form when an email type
field has invalid email (valid but surrounded with whitespace).

This fix is a workaround, setting up the input field as simple text
instead of semantic type 'email'.
2024-03-06 09:17:39 +01:00
Andrey Antukh 5b722a8608 🐛 Fix error handling on register page 2024-03-06 09:17:04 +01:00
Andrey Antukh 8cb550120a 🐛 Fix error handling on recovery request page 2024-03-06 09:16:45 +01:00
Andrey Antukh 1bc4001e70 Add the ability to set :string for cookie same-site
By configuration. The default is :lax (unchanged)
2024-03-05 19:47:29 +01:00
Andrey Antukh 07b8a2a6e6 Restrict http methods on RPC handlers 2024-03-05 19:47:29 +01:00
Andrey Antukh c3f37fb8a3 ♻️ Refactor import dialog on dashboard 2024-03-05 19:47:29 +01:00
Andrey Antukh afd373ffee Simplify implementation of d/name 2024-03-05 19:47:29 +01:00
Andrey Antukh cac785f3e1 💄 Add cosmetic improvements to dashboard import modal code 2024-03-05 19:47:29 +01:00
Andrey Antukh d2059475f0 Add minor performance enhancement for inside-layout? helper 2024-03-05 19:47:29 +01:00
Andrey Antukh 6fe85465a1 Add minor performance enhacement on shape layout functions 2024-03-05 19:47:29 +01:00
Andrey Antukh 3412658286 Move some functions from file helpers to types.shape.layout 2024-03-05 19:47:29 +01:00
Andrey Antukh 85d06b10c2 🐛 Fix incorrect event handling on component annotation creation 2024-03-05 19:47:29 +01:00
Andrey Antukh ee91ab5dad Add nano optimizations to fo_text react component 2024-03-05 19:47:29 +01:00
Andrey Antukh 43cd4656b4 Remove props wrapping on workspace comment react components 2024-03-05 19:47:29 +01:00
Andrey Antukh 4106e8da56 Add performance enhancements to viewport comments layer 2024-03-05 19:47:20 +01:00
Andrey Antukh 0606ef1c84 Merge remote-tracking branch 'origin/staging' into develop 2024-03-05 18:53:36 +01:00
Andrey Antukh 638cf6daff 💄 Add cosmetic enhancements to viewport comments layer
That also improves performance
2024-03-05 18:51:40 +01:00
alonso.torres ce68bde9a8 🐛 Fix problem with detatch color in shadow 2024-03-05 18:13:22 +01:00
alonso.torres 93542282f1 🐛 Fix problem with grid gap 2024-03-05 18:13:22 +01:00
alonso.torres 335b51387d 🐛 Fix interactions with nested frames 2024-03-05 18:13:22 +01:00
alonso.torres 7dec194b1f 🐛 Make no-clip default for new frames from shapes 2024-03-05 18:13:22 +01:00
alonso.torres ff22208ec2 🐛 Fix problem with grid multiple selection 2024-03-05 18:13:22 +01:00
alonso.torres 38148cf87f 🐛 Fix problem with error reporting screen 2024-03-05 18:13:22 +01:00
Eva Marco 1c38883ddd ♻️ Update sidebar old icons 2024-03-05 16:36:30 +01:00
Eva Marco c2b8e5c946 ♻️ Refactor dashboard sidebar css 2024-03-05 16:36:30 +01:00
Aitor 9ad0662409 🐛 Fix imposter being regenerated indefinitely 2024-03-05 16:20:03 +01:00
Eva Marco 2465690c7d Merge pull request #4220 from penpot/azazeln28-sort-interaction-destinations
 Sort interaction destinations by label
2024-03-05 16:04:39 +01:00
Aitor 3c9ae9b210 Sort interaction destinations by label 2024-03-05 13:13:25 +01:00
alonso.torres 8d20220330 🐛 Fix inspect code text fonts 2024-03-04 20:31:28 +01:00
alonso.torres bf6e467abf 🐛 Add tooltip to the locate button 2024-03-04 20:31:28 +01:00
alonso.torres fb2c4c9c3a 🐛 Fix problem with grid layout paddings 2024-03-04 20:31:28 +01:00
alonso.torres f36410da87 🐛 Fix problem when changing track data in editor 2024-03-04 20:31:28 +01:00
Belén Albeza bcd859ca4c Merge pull request #4209 from penpot/eva-bugfixing-ui
Bugfixing
2024-03-04 11:28:35 +01:00
Belén Albeza 7833a06a86 🐛 Fix color rename input height 2024-03-04 10:49:19 +01:00
Eva Marco 6e4075a2e7 🐛 Fix create team name modal width 2024-03-04 10:44:09 +01:00
Eva Marco add0bed3ca 🐛 Fix ellipsis in library color names 2024-03-04 10:44:09 +01:00
Andrey Antukh 481058b8d4 Merge remote-tracking branch 'origin/staging' into develop 2024-03-04 10:29:11 +01:00
Alejandro acbc2a80dd Merge pull request #4215 from penpot/palba-bugfixing-005
🐛 Bugfixing
2024-03-04 09:31:51 +01:00
Aitor 611b90f5fb 🐛 Fix rasterizer not setting intrinsic size 2024-03-04 08:58:49 +01:00
Pablo Alba ca0fd0fa13 🐛 Fix it is possible to upload font with empty font family 2024-03-01 16:35:59 +01:00
Eva Marco 9645ffba40 🐛 Fix upload image alert message 2024-03-01 16:32:31 +01:00
Pablo Alba 041224e44b 🐛 Fix incorrect message trying to login with bad credentials 2024-03-01 13:53:57 +01:00
Pablo Alba 44b66352ab 🐛 Fix invalid error is displayed when changing the password 2024-03-01 13:45:06 +01:00
Pablo Alba b2ad78d947 🐛 Fix in dashboard it is possible to update project with empty name on left sidebar 2024-03-01 12:27:48 +01:00
Andrey Antukh 42b68a786e Add more performance enhancements to code react component
On the viewer inspect module
2024-03-01 12:18:45 +01:00
Andrey Antukh 942989824a Improve audit events on inspect copy operations 2024-03-01 12:18:45 +01:00
Andrey Antukh 00ee6833c8 Separate inspect-title-bar from title-bar
This now makes the component a bit less overloaded and
the implementation simplified without bracking too much
the modularization
2024-03-01 12:18:45 +01:00
Andrey Antukh 20b651560d Add performance enhancements to copy-button react component 2024-03-01 12:18:45 +01:00
Andrey Antukh a3faca910f 📎 Add some FIXME comments for future refactors 2024-03-01 12:18:45 +01:00
Andrey Antukh 97e7806bdb 🐛 Update rumext (fix issues on native destructuring) 2024-03-01 12:18:45 +01:00
Andrey Antukh 1cc65c69b7 Add audit events for inspect tab usage
On workspace and viewer
2024-03-01 12:18:45 +01:00
Andrey Antukh f888a6db4c Add audit events for aspect ration change 2024-03-01 12:18:45 +01:00
Andrey Antukh a40d207dfd Add audit events for component swap action 2024-03-01 12:18:45 +01:00
Andrey Antukh 0b20d85677 🐛 Add missing option for delete grid layout on context-menu 2024-03-01 12:18:45 +01:00
Andrey Antukh 7d2af587cd Improve audit events for layout context menu 2024-03-01 12:18:45 +01:00
Andrey Antukh 4ec1844e6e Add minor optimizations to component-swap react component 2024-03-01 12:18:45 +01:00
Andrey Antukh 4aef2a475a Add audit events for component annotations 2024-03-01 12:18:45 +01:00
Andrey Antukh a21a64aa10 Add performance refactor to component-annotaton react component 2024-03-01 12:18:45 +01:00
Andrey Antukh 60962b58fe Add ::mf/props :obj to components menu sidebar 2024-03-01 12:18:45 +01:00
Andrey Antukh ef2160dbb6 Add audit events for theme activation 2024-03-01 12:18:45 +01:00
Andrey Antukh 8eaf93f08a Add audit events for shape layout creation 2024-03-01 12:18:45 +01:00
Andrey Antukh 467e4c76a6 🐛 Fix some internal issues on audit events 2024-03-01 12:18:45 +01:00
Eva Marco 54511a5ef0 Merge pull request #4211 from penpot/alotor-debug-icons
 Add debug old icons
2024-03-01 11:45:49 +01:00
alonso.torres bf898bfdc9 Add debug old icons 2024-03-01 11:08:49 +01:00
Eva Marco 1f0683498f 💄 Update release modals to new design 2024-03-01 11:04:24 +01:00
Pablo Alba 238519cb69 🐛 Fix In history panel, If I click on the arrow to see more, it undoes until that change 2024-03-01 10:07:50 +01:00
Pablo Alba 0da51d878f 🐛 Change "Toggle Scale Text" in shortcuts for "Scale" 2024-03-01 10:07:50 +01:00
Pablo Alba dd5ec39619 🐛 Fix set as thumbnail generate 2 steps for undo 2024-03-01 10:07:50 +01:00
Pablo Alba 445519fc70 🐛 Fix flows list elements are not accessible when too many 2024-03-01 10:07:50 +01:00
Pablo Alba bbe4ef5fc1 🐛 Change "Twitter" for "X" 2024-03-01 10:07:50 +01:00
Eva Marco f851d552bf Merge pull request #4210 from penpot/ladybenko-7003-team-dropdown
🐛 Fix team switch dropdown width
2024-03-01 08:44:30 +01:00
Belén Albeza 99cbd84148 🐛 Fix team switch dropdown width 2024-02-29 18:07:12 +01:00
Andrey Antukh a109673654 Merge remote-tracking branch 'origin/staging' into develop 2024-02-29 12:53:08 +01:00
Pablo Alba e5cd2983d0 Merge pull request #4201 from penpot/niwinz-staging-gulp-improvements
📎 Clean already generated styles on fresh gulp watch start
2024-02-29 12:15:59 +01:00
Andrey Antukh e2d7105624 Add nano optimization to get-path-id function
Mainly change get-in for dm/get-in macro
2024-02-29 10:20:47 +01:00
Andrey Antukh 26ab7f83fe 💄 Add mainly cosmetic changes to path-editing? function 2024-02-29 10:20:47 +01:00
Aitor f0955c0e99 ♻️ Refactor toolbar refs and path editing helper 2024-02-29 10:20:47 +01:00
Aitor f5dd199bc6 💄 Change stoper to stopper 2024-02-29 10:20:47 +01:00
Aitor c123cf6e98 🐛 Fix path drawing inconsistencies 2024-02-29 10:20:47 +01:00
Pablo Alba 74d2273d24 🐛 Fix problems on sync with components chain with deleted components 2024-02-29 10:18:00 +01:00
Eva Marco 697a542754 💄 Add final design to alert messages 2024-02-29 09:58:35 +01:00
Belén Albeza 233e7e7e87 🐛 Use new icon for menu action in project grid 2024-02-29 09:38:41 +01:00
Belén Albeza 9594c70ec5 💄 Remove nesting in css for project grid menu icon 2024-02-29 09:38:41 +01:00
Belén Albeza 7d2aef441c 🐛 Use new icons for dashboard/projects 2024-02-29 09:38:41 +01:00
Belén Albeza 372e6b8a88 💄 Unnest css selectors for the 'show all files' in the dashboard 2024-02-29 09:38:41 +01:00
Belén Albeza 74e879a2be 🐛 Fix css for mail toolbar button 2024-02-29 09:38:41 +01:00
Belén Albeza a3e4f3f376 💄 Remove nesting of mail toolbar buttons css 2024-02-29 09:38:41 +01:00
Belén Albeza 75716c37e1 🐛 Fix style of radio buttons in light theme 2024-02-29 09:38:41 +01:00
Belén Albeza e6d4a56901 💄 remove nesting in radio-button scss 2024-02-29 09:38:41 +01:00
alonso.torres 85ac766bf9 🐛 Fix rulers markers growing with zoom 2024-02-29 09:36:47 +01:00
alonso.torres 58f9b2a4e8 🐛 Fix problem with stroke in multi-paragraph texts 2024-02-29 09:36:47 +01:00
alonso.torres 54db163cd8 🐛 Fix visual bug for scrolls on inspect mode 2024-02-29 09:36:47 +01:00
alonso.torres 05d0d2550a 🐛 Fix problem with button in inspect 2024-02-29 09:36:47 +01:00
alonso.torres 1c5d51bf97 🐛 Fix undo path exit path editor after empty stack 2024-02-29 09:36:47 +01:00
alonso.torres e636dc30c2 🐛 Fix error with keys on menu 2024-02-29 09:36:47 +01:00
alonso.torres ab2265d505 🐛 Fix problem when components are inside a boolean 2024-02-29 09:36:47 +01:00
alonso.torres f1282f8367 🐛 Fix shortcut for increase text font 2024-02-29 09:36:47 +01:00
alonso.torres f57c5b4da2 🐛 Fix align options on rotated frames 2024-02-29 09:36:47 +01:00
alonso.torres 905e1eea7b 🐛 Fix problem editing font names 2024-02-29 09:36:47 +01:00
alonso.torres 1d9b91821b 🐛 Fix icons in flex layout 2024-02-29 09:36:47 +01:00
Aitor Moreno 27ef14fd2a Merge pull request #4202 from penpot/ladybenko-6754-feedback-form-margin
🐛 Fix wrong margins for the give feedback page
2024-02-28 17:17:30 +01:00
Belén Albeza abdd58f3cf 🐛 Fix wrong margins for the give feedback page 2024-02-28 13:00:22 +01:00
Pablo Alba b17371d440 🐛 Fix problems on sync with components chain with reset override 2024-02-28 11:35:19 +01:00
Belén Albeza 67b343660a 🐛 Use new icons in stroke cap dropdown 2024-02-28 11:28:39 +01:00
Andrey Antukh 85ef9763bd 📎 Clean already generated styles on fresh gulp watch start 2024-02-28 11:27:31 +01:00
Andrey Antukh 617edbebec Merge remote-tracking branch 'origin/staging' into develop 2024-02-28 11:25:36 +01:00
Andrey Antukh 9c47d34f98 💄 Adapt frame-wrapper to use new rumext helpers 2024-02-28 11:23:33 +01:00
Andrey Antukh e3f9bafb33 Merge remote-tracking branch 'origin/staging' into develop 2024-02-27 12:53:20 +01:00
Andrey Antukh b6134e1afe 🐛 Rename spread-obj to spread 2024-02-27 12:51:31 +01:00
Andrey Antukh 2a6589ab01 Merge remote-tracking branch 'origin/staging' into develop 2024-02-27 12:45:59 +01:00
Andrés Moya c5f24331a3 🐛 Improve selection of near copies to sync 2024-02-27 12:45:32 +01:00
Aitor Moreno 7dd0745429 Merge pull request #4175 from penpot/niwinz-staging-perfix-3
 Add incremental improvements to `layout-container` related components
2024-02-27 11:23:39 +01:00
alonso.torres 98e56bab80 🐛 Add timeout to request on idle timers 2024-02-27 10:43:14 +01:00
alonso.torres 072c724462 🐛 Fix problem with layers loading 2024-02-27 10:43:14 +01:00
Alejandro 49c750bdaf Merge pull request #4193 from penpot/niwinz-staging-update-deps
⬆️ Update frontend dependencies
2024-02-27 09:26:09 +01:00
Alejandro addf83ab22 Merge pull request #4190 from penpot/palba-bugfixes-002
🐛 Fix impossible to move an element when it's in a main component
2024-02-27 08:53:06 +01:00
Pablo Alba 78e26794e8 🐛 Fix when you move a library to another team, the warning message does not appear 2024-02-27 07:49:51 +01:00
Andrey Antukh 628454d13c Add missing translations for date functions 2024-02-27 01:04:07 +01:00
Andrey Antukh d3e9d9be76 ⬆️ Update frontend deps (dateFns, rxjs, etc) 2024-02-27 01:04:07 +01:00
Andrey Antukh 2415bae1b3 ⬆️ Update frontend build dependencies (saas, autoprefixer, ...) 2024-02-27 01:04:07 +01:00
Andrey Antukh d50afcce15 ⬆️ Update frontend storybook related dependencies 2024-02-27 01:04:07 +01:00
Andrey Antukh c80da1bbac ⬆️ Update rumext and shadow-cljs 2024-02-27 01:04:07 +01:00
Eva Marco 039baa6bd1 🐛 Fix paddings of right side panel on viewer 2024-02-26 17:45:28 +01:00
Eva Marco 162e7a56d6 🐛 Fix rotate icons in comments 2024-02-26 17:45:28 +01:00
Eva Marco df43912fe5 🐛 Fix different button size on webhooks 2024-02-26 17:45:28 +01:00
Eva Marco c7001fed3c 💄 Update context variable name on notification components 2024-02-26 16:51:31 +01:00
Eva Marco 27e9a2a7f2 Add a way to add markdown to context notifications 2024-02-26 16:51:31 +01:00
Eva Marco 336cc98029 💄 Update some namespace abbreviations 2024-02-26 16:51:31 +01:00
Eva Marco 1af2ec0b79 ♻️ Update notification component 2024-02-26 16:51:31 +01:00
Eva Marco de0cd5aa04 ♻️ Update colors for alerts 2024-02-26 16:51:31 +01:00
Belén Albeza f91a8b371a 🐛 Fix layer filter dropdown position + add auto-closing on Esc and outside click 2024-02-26 16:50:21 +01:00
Alejandro Alonso 10d6f93ed7 🐛 Fix detach components with shortcut 2024-02-26 14:45:01 +01:00
Pablo Alba 0a09ff8e36 🐛 Fix impossible to move an element when it's in a main component 2024-02-26 12:55:49 +01:00
Aitor Moreno 8ea4e5ca10 Merge pull request #4186 from penpot/alotor-bugfix-19
🐛 Bugfixes
2024-02-23 13:16:50 +01:00
Alejandro Alonso fea14e9ea6 🐛 Fix switch inspect from html to svg 2024-02-23 10:52:45 +01:00
Andrey Antukh a6edc184f0 🐛 Fix issues with viewer comments menu 2024-02-23 10:50:55 +01:00
Andrey Antukh 9db714b25d 💄 Add minor cosmetic improvements to viewer comments code
Mainly on comments and header namespace
2024-02-23 10:50:55 +01:00
Aitor 6660ca8e6f ⬆️ Update draft.js 2024-02-23 10:32:55 +01:00
alonso.torres 8de6b0c553 🐛 Add row/column gap to inspect tab 2024-02-23 09:07:34 +01:00
alonso.torres d45d6af0ec 🐛 Fix problem with measure distances in workspace 2024-02-23 09:07:34 +01:00
alonso.torres fdf6f0dfef 🐛 Fix problem with snap to guides and zoom 2024-02-23 09:07:34 +01:00
alonso.torres d51338e754 🐛 Remove after delay event for not-frame shapes 2024-02-23 09:07:34 +01:00
Alejandro 5e6ce26742 Merge pull request #4174 from penpot/palba-bugfixes-001
Bugfixes
2024-02-23 08:51:38 +01:00
Pablo Alba 4390df4b48 🐛 Fix user can detach a copy inside a copy 2024-02-23 08:40:31 +01:00
Pablo Alba 418ec34880 🐛 Fix detaching a copy that has another copy inside produce a validation error 2024-02-23 08:40:31 +01:00
Pablo Alba bdc303e778 🐛 Fix mixed selection of few components name are truncated 2024-02-23 08:40:31 +01:00
Andrey Antukh 65df775937 💄 Fix naming inconsistencies on layout menu components 2024-02-22 16:45:43 +01:00
Andrey Antukh 87f0e46036 Add performance enhacenements to layout-container menu (part 5)
Refactor and improve performance of align-grid-row related components
2024-02-22 16:35:12 +01:00
Andrey Antukh 0735fa93f6 Add performance enhacenements to layout-container menu (part 4)
Mainly improve performance and minor code refactor on column and row
justify buttons.
2024-02-22 16:35:10 +01:00
Andrey Antukh 9e2e9f5b64 Merge remote-tracking branch 'origin/staging' into develop 2024-02-22 16:24:26 +01:00
Andrey Antukh 2d5500d96f And minor enhancements to the radio-buttons react component
And fix blur handling when on-change is not provided
2024-02-22 16:06:55 +01:00
Andrey Antukh 2170a92dd2 Add performance enhacenements to layout-container menu (part 3)
Refactor and improve performance of gap related components
2024-02-22 15:55:24 +01:00
Andrey Antukh c1d4fc71a8 💄 Rename is-col? to is-column on layout-container ns 2024-02-22 15:55:03 +01:00
Andrey Antukh 897968939d Add performance enhacenements to layout-container menu (part 2)
Refactor and improve performance of padding related react components
2024-02-22 15:53:43 +01:00
Andrey Antukh 35f3c6e90f 💄 Add cosmetic changes to grid layout editor react components 2024-02-22 15:53:15 +01:00
Andrey Antukh 32ae1bcdc8 🐛 Add missing key prop on grid editor element 2024-02-22 15:53:15 +01:00
Andrey Antukh 593966a30a Add incremental performance enhacements to layout-containers (part 1) 2024-02-22 15:53:14 +01:00
Xaviju 7879d883cf 🐛 Fix ellipsis on color row 2024-02-22 15:49:11 +01:00
Alejandro 8cc4ff0b4c Merge pull request #4183 from penpot/niwinz-staging-migration
🐛 Migration fixes (not components related)
2024-02-22 15:01:58 +01:00
Andrey Antukh 0999ecb2a9 🐛 Fix idempotency problem on fdata migration 25 2024-02-22 14:55:35 +01:00
Andrey Antukh dec622600d 🐛 Fix incorrect selrect calcultation from shape path 2024-02-22 14:55:35 +01:00
Andrey Antukh b05421755f 🐛 Fix srepl report query 2024-02-22 14:55:35 +01:00
Belén Albeza dbcfb2746f 🐛 Fix update library button in libraries modal 2024-02-22 12:27:29 +01:00
alonso.torres 337f52e1bf 🐛 Fix problem with changing cell type in grid 2024-02-22 12:26:03 +01:00
alonso.torres f4d513b622 🐛 Fix problem with import zip file 2024-02-22 12:26:03 +01:00
alonso.torres d95d79a7c2 🐛 Moved shortcut for clearing history 2024-02-22 12:26:03 +01:00
alonso.torres ff88f30c74 🐛 Allow select library colors on gradients 2024-02-22 12:26:03 +01:00
alonso.torres 764d15412f 🐛 Show margin/padding properties outside grid editor 2024-02-22 12:26:03 +01:00
alonso.torres 2942f28880 🐛 Fix problem with layout child properties 2024-02-22 12:26:03 +01:00
alonso.torres 4fb1247045 🐛 Fix proportions for new layouts 2024-02-22 12:26:03 +01:00
alonso.torres 74cc8079bb 🐛 Fix a problem with input rotation for shapes 2024-02-22 12:26:03 +01:00
alonso.torres 9e6db257cc 🐛 Fix problem with strokes and rects 2024-02-22 12:26:03 +01:00
Eva Marco 21927fd54c Merge pull request #4172 from penpot/ladybenko-6982-ui-fixes-design-tab
🐛 UI fixes for the design tab
2024-02-22 08:42:08 +01:00
Alejandro 5883a50520 Merge pull request #4171 from penpot/niwinz-staging-perfix-2
🐛 Bugfixes and  Performance enhancements
2024-02-22 07:09:55 +01:00
Eva Marco 7624797acf ♻️ Update onboarding modals 2024-02-22 00:28:14 +01:00
Alejandro Alonso 5590210088 🐛 Add fix files function to removed :shapes-group from :touched 2024-02-21 16:21:46 +01:00
Andrey Antukh 82dca0439a Merge remote-tracking branch 'origin/staging' into develop 2024-02-21 14:56:28 +01:00
Belén Albeza c49d6d4ecf 🐛 Update icon of locked aspect ratio 2024-02-21 09:31:53 +01:00
Belén Albeza 918ecc7b37 🐛 Fix margin of uncollapsed layout item sections in design tab 2024-02-21 09:31:53 +01:00
Alejandro e7e70b4edd Merge pull request #4173 from penpot/hiru-bugfixes-8
🐛 Detect correctly swapped subinstances with nested components
2024-02-20 18:05:26 +01:00
Andrés Moya c64464b1b5 🐛 Detect correctly swapped subinstances with nested components 2024-02-20 17:43:27 +01:00
Andrey Antukh 72f7e5bb76 🐛 Add soft size limit for file names 2024-02-20 16:54:40 +01:00
Belén Albeza b33d114402 🐛 Fix chevron icon behavior on title bars 2024-02-20 16:25:46 +01:00
Belén Albeza c484c0d667 🐛 Fix UI of clip content + show in viewer icons 2024-02-20 16:25:46 +01:00
Andrey Antukh 66f8ffb408 Merge remote-tracking branch 'origin/staging' into develop 2024-02-20 16:07:51 +01:00
Andrey Antukh 3994bf583c Disable props wrapping on layout-container react components 2024-02-20 15:42:02 +01:00
Andrey Antukh acae8708f5 🐛 Fix ui problem when user selects a recent-color for adding to the assets 2024-02-20 15:28:16 +01:00
Andrey Antukh d28c7cf061 💄 Add cosmetic changes to colorpicker modal react components 2024-02-20 15:27:44 +01:00
Andrey Antukh cc9546dd1b 📎 Add documentation assert on add-flow event impl 2024-02-20 15:25:13 +01:00
Eva Marco 47bf121d25 Merge pull request #4158 from penpot/niwinz-staging-perfix-1
 Add performance enhancements for margin-section react component
2024-02-20 13:58:35 +01:00
Andrey Antukh 72937ba091 🐛 Fix styles issues on presence module
The issue happens only when the number of connected sessions
becomes greater that the total number of colors.

The solution is: instead of picking black background we use
the default one.

This PR also improves performance of the presence related
react components.
2024-02-20 13:17:41 +01:00
Belén Albeza 4097dec5a4 🐛 Fix radio buttons UI for boolean operations 2024-02-20 13:00:54 +01:00
Belén Albeza f1e12015d6 🐛 Fix icon size in buttons 2024-02-20 12:41:49 +01:00
Andrey Antukh 2f242533d2 Add minor performance improvements on workspace presence components 2024-02-20 12:32:37 +01:00
Alejandro 6fdefe69ec Merge pull request #4170 from penpot/niwinz-staging-bugfix-2
🐛 Fix unexpected exception on copy/paste
2024-02-20 10:41:47 +01:00
Andrey Antukh cf950c426f 🐛 Fix unexpected exception on copy/paste
The exception is caused by a regression introduced in the
refactor of migrations.
2024-02-20 10:18:53 +01:00
Andrey Antukh 541052fee7 ⬆️ Update rumext (new syntax features) 2024-02-20 09:46:53 +01:00
Alejandro 00cea9b215 Merge pull request #4165 from penpot/niwinz-staging-devenv-limits
⬆️ Update devenv
2024-02-20 08:30:24 +01:00
Andrey Antukh 00961808b4 Optimize the layout-item-menu react component 2024-02-19 19:13:39 +01:00
Andrey Antukh 1e7a2b575f 💄 Add mostly cosmetic changes to layout-item ns code 2024-02-19 19:13:39 +01:00
Andrey Antukh a1a9519cf5 Optimize the layout-item-menu react component 2024-02-19 19:13:39 +01:00
Andrey Antukh 46fca11b38 Optimize the align-self-row react component 2024-02-19 19:13:39 +01:00
Andrey Antukh 71681532cd Optimize the element-behaviour react component 2024-02-19 19:13:39 +01:00
Andrey Antukh ed336724a0 Optimize the element-behaviour-vertical react component 2024-02-19 19:13:39 +01:00
Andrey Antukh c7582e7887 Optimize the element-behaviour-horizontal react component 2024-02-19 19:13:39 +01:00
Andrey Antukh 710a357a6e Optimize the margin-section react component 2024-02-19 19:13:39 +01:00
Aitor Moreno 1b10af5cfc Merge pull request #4167 from penpot/ladybenko-6858-opacity-size
🐛 Fix opacity field size
2024-02-19 18:08:08 +01:00
Aitor Moreno 619d46c476 Merge pull request #4168 from penpot/ladybenko-6993-fix-multiline-layer-title
🐛 Add ellipsis to layer title text when inspecting shape
2024-02-19 18:05:39 +01:00
Aitor Moreno fa50775df2 Merge pull request #4169 from penpot/ladybenko-6756-fix-color-picker-pattern
🐛 Fix color picker gradient for light theme
2024-02-19 18:03:58 +01:00
Aitor Moreno 69ab02fc45 Merge pull request #4159 from penpot/alotor-bugfix-viewer
Alotor bugfix viewer
2024-02-19 17:46:50 +01:00
Belén Albeza 8c657e4172 🐛 Fix color picker gradient for light theme 2024-02-19 17:43:17 +01:00
Belén Albeza 610f5dc5f7 🐛 Add ellipsis to layer title text when inspecting shape 2024-02-19 16:39:07 +01:00
Belén Albeza 32e8098a6d 🐛 Fix opacity field size 2024-02-19 16:21:04 +01:00
Andrey Antukh fd641e87c9 Merge remote-tracking branch 'origin/staging' into develop 2024-02-19 16:02:59 +01:00
Alejandro 35d8fd9d97 Merge pull request #4166 from penpot/hiru-bugfixes-7
🐛 Fix swap in main component with duplicated pages
2024-02-19 15:28:18 +01:00
Andrés Moya 9a9e2af09c 🐛 Fix swap in main component with duplicated pages 2024-02-19 15:21:12 +01:00
Andrey Antukh dc2b4ddebc ⬆️ Update devenv dockerfile
Mainly version bump for node, kondo and jvm
2024-02-19 14:38:50 +01:00
Andrey Antukh 5573f467b7 📎 Increase devenv limits for multipart requests 2024-02-19 14:28:39 +01:00
Alejandro 5235c5f1dc Merge pull request #4156 from penpot/niwinz-staging-perfix
 Add micro optimizations to radio button react components
2024-02-19 11:58:46 +01:00
Alejandro 60173212e7 Merge pull request #4161 from penpot/hiru-bugfixes-6
Some bugfixes
2024-02-19 11:46:56 +01:00
Alejandro a6be5bb399 Merge pull request #4150 from penpot/niwinz-staging-migrations
♻️ Add minor refactor to file migrations
2024-02-19 10:42:41 +01:00
alonso.torres 330c0ac9f9 🐛 Fix problem with text proportion lock 2024-02-19 09:39:12 +01:00
alonso.torres 4c81ac4386 🐛 Fix problem with strokes exporting images 2024-02-19 09:39:12 +01:00
alonso.torres 74e57c00af 🐛 Fix create interactions with nested frames 2024-02-19 09:39:12 +01:00
alonso.torres 619b557c80 🐛 Fix anonymous access to shared prototypes 2024-02-19 09:39:12 +01:00
Andrey Antukh 90cb2c4518 🐛 Fix incorrect redirect on login with different user after logout 2024-02-19 09:20:47 +01:00
Andrey Antukh 41794c5f5e Simplify fdata feature helpers 2024-02-19 09:20:47 +01:00
Andrey Antukh 757291644b 🐛 Fix incorrect warning on climit initialization when disabled 2024-02-19 09:20:47 +01:00
Andrey Antukh a89f16e594 Add better logging config for devenv 2024-02-19 09:20:47 +01:00
Andrey Antukh b718a282e0 ♻️ Add minor refactor to file migrations
Relevant changes:

- Add the ability to create migration in both directions, defaulting
  to identity if not provided
- Move the version attribute to file table column for to make it more
  accessible (previously it was on data blob)
- Reduce db update operations on file-update rpc method
2024-02-19 09:20:47 +01:00
Alejandro 7ac4b89a0e Merge pull request #4145 from penpot/niwinz-staging-tmp
 Minor improvements on TMP storage API
2024-02-19 07:16:36 +01:00
Aitor ff3c948056 📎 Add script to find missing mf/use-fn 2024-02-16 15:51:08 +01:00
Andrey Antukh bec59ab3c2 Merge remote-tracking branch 'origin/staging' into develop 2024-02-16 14:30:20 +01:00
Andrés Moya f8b574be81 💄 Improve debug traces of libraries helpers 2024-02-16 14:06:05 +01:00
Andrés Moya d3dd9ffd9b 🐛 Pack swap component in a single transaction and undo group 2024-02-16 14:06:05 +01:00
Eva Marco 150fa394ff Merge pull request #4151 from penpot/ladybenko-6900-fix-palette-toolbar
🐛 Fix collapsed toolbar/palette position
2024-02-15 16:24:12 +01:00
Eva Marco 14651b1ae5 Merge pull request #4155 from penpot/niwinz-staging-onboarding-fix
🐛 Fix onboarding dialog is not loaded from profile settings
2024-02-15 16:20:11 +01:00
Andrey Antukh f857836bfa Add micro optimizations to radio button react components 2024-02-15 16:16:46 +01:00
Belén Albeza 415ce339a7 🐛 Fix cropped text for typographies in the small palette 2024-02-15 16:14:08 +01:00
Belén Albeza 261dc553bb 🐛 Fix collapsed toolbar position 2024-02-15 16:14:08 +01:00
Belén Albeza 4c9174969f 🐛 Fix collapsable palette position 2024-02-15 16:14:08 +01:00
Andrey Antukh 443ca0a02c Merge pull request #4137 from penpot/alotor-bugfix-17
Alotor bugfix 17
2024-02-15 16:10:31 +01:00
Eva Marco 862053738a Merge pull request #4149 from penpot/xaviju-fix-margin-detach-button
🐛 Fix detach button position and color info overflow
2024-02-15 15:59:42 +01:00
alonso.torres 4ece2ba148 🐛 Fix problem with calculated margins in flex layout 2024-02-15 15:46:40 +01:00
alonso.torres 2bb2d4ca59 🐛 Fix problem with align-self default 2024-02-15 15:46:40 +01:00
Andrey Antukh 15cd9432b7 🐛 Fix onboarding dialog is not loaded from profile settings 2024-02-15 15:39:33 +01:00
Xaviju 4acc98749c 🐛 Fix ellipsis on color row 2024-02-15 15:21:06 +01:00
Xaviju 9e527e4007 🐛 Fix detach button position 2024-02-15 12:57:03 +01:00
Alejandro Alonso 5cbb3f76c7 🐛 Fix cut/paste component inside a board 2024-02-15 10:57:08 +01:00
Alejandro c4e707d5a2 Merge pull request #4146 from penpot/alotor-us-6933-keep-aspect-ratio
Add keep aspect ratio flag
2024-02-15 09:37:30 +01:00
alonso.torres 86b4a95875 Fix problem when importing zip files 2024-02-15 09:27:51 +01:00
alonso.torres ea2173bd30 Add keep aspect ratio flag to image fills 2024-02-15 09:27:51 +01:00
Andrey Antukh 63e74545ab 📎 Add get-raw-file srepl helper 2024-02-14 17:38:53 +01:00
Andrey Antukh 29d48f0a98 Add minor code cleaning on file-update ns 2024-02-14 17:38:53 +01:00
Andrey Antukh 8981e57deb Ensure connection on persisting pointers 2024-02-14 17:36:13 +01:00
Andrey Antukh ba55d657a4 Prevent adding object map to not loaded pointer-map containers 2024-02-14 17:34:50 +01:00
Andrey Antukh 3212ed9bd1 🐛 Fix incorrect value passed on unhandled error 2024-02-14 17:33:34 +01:00
Belén Albeza add9c98ba0 🐛 Fix email tags not being shown in invite members modal 2024-02-14 13:15:42 +01:00
Andrey Antukh b426db133d Merge remote-tracking branch 'origin/staging' into develop 2024-02-14 13:01:58 +01:00
Belén Albeza ee8cdfc7d3 🐛 Fix boolean flatten icon size 2024-02-14 11:55:25 +01:00
Aitor Moreno 26699de71b Merge pull request #4113 from penpot/eva-review-inspect-tab
Update inspect tab
2024-02-14 11:02:20 +01:00
Aitor Moreno 71bc4e5186 Merge pull request #4144 from penpot/superalex-change-stroke-color-from-library-doesnt-work
🐛 Fix change stroke color from library doesn't work
2024-02-14 11:01:28 +01:00
Alejandro Alonso 377d9682da 🐛 Fix default constraints for migrated graphics 2024-02-14 11:00:54 +01:00
Andrey Antukh a31be7e2ff Use a prefixed dir for storing temp files
And mark them for deletion on JVM exit.
2024-02-14 09:53:54 +01:00
Eva 8ead63cad0 ♻️ Review inspect tab spacing 2024-02-14 09:53:46 +01:00
Andrey Antukh 9649878fd8 Ensure id prop on :data on components-v2 migration 2024-02-14 09:33:02 +01:00
Alejandro Alonso fa19ce2b5b 🐛 Fix change stroke color from library doesn't work 2024-02-14 07:58:21 +01:00
Alejandro 6fd30d50f4 Merge pull request #4143 from penpot/niwinz-staging-file-gc
♻️ Refactor the file-gc task
2024-02-14 06:48:07 +01:00
Andrés Moya d654a4faed 🐛 Avoid setting touched in parent when swapping components 2024-02-13 19:38:00 +01:00
Belén Albeza f152e30737 🐛 Fix shortcuts menu being clipped 2024-02-13 19:36:58 +01:00
Andrey Antukh 8ea82021f0 Add better error report on importing truncated binfile 2024-02-13 19:36:15 +01:00
Andrey Antukh afd68fa09d 🐛 Properly handle fdata features on file-gc task
It also adds a schema validation process after cleaning. If file
does not validates it will be skiped.
2024-02-13 19:36:10 +01:00
Andrey Antukh bc3d268f57 Add minor improvements to srepl helpers 2024-02-13 19:09:54 +01:00
Belén Albeza 1415ed30b6 🐛 Fix icon not being shown when asset category had a zero count 2024-02-13 18:42:06 +01:00
Belén Albeza c824711893 🐛 Replace overlay icons with new ones 2024-02-13 18:41:19 +01:00
Belén Albeza 2633e56a76 🐛 Fix icon size in selects 2024-02-13 18:41:19 +01:00
Belén Albeza 4e152f470b 🐛 Fix overaly checkboxes in prototype tab 2024-02-13 18:41:19 +01:00
Belén Albeza c89a1b3b27 🐛 Fix extend button style in prototype tab 2024-02-13 18:41:19 +01:00
Andrey Antukh 1cb6f43339 📎 Add srepl fix function for disable fdata features 2024-02-13 17:54:11 +01:00
Andrey Antukh e8a1c58c5d 🐛 Fix incorrect change detection on srepl helper process-file 2024-02-13 17:54:11 +01:00
Andrey Antukh 39cb4a081b 🐛 Clean legacy features on binfile (v1) importation 2024-02-13 17:54:11 +01:00
Belén Albeza c336cbe8ab 🐛 Fix text transform buttons order 2024-02-13 12:57:18 +01:00
Belén Albeza 565bf5fbb8 🐛 Fix padding of font size selector 2024-02-13 12:57:18 +01:00
Belén Albeza d3bf35869a 🐛 Fix font size for modal links 2024-02-13 12:53:46 +01:00
Belén Albeza d63e5f520e 🐛 Fix opacity display when selecting multiple shapes 2024-02-13 11:44:05 +01:00
Alejandro 9fbdc10971 Merge pull request #4131 from penpot/hiru-bugfixes-4
🐛 Fix update main when there are swapped copies
2024-02-13 10:02:34 +01:00
Andrés Moya 39b5f10529 🐛 Fix update main when there are swapped copies 2024-02-12 17:40:44 +01:00
alonso.torres af7142e97b New overlay for v2 information 2024-02-12 16:29:47 +01:00
Andrey Antukh e232beeb59 Merge remote-tracking branch 'origin/staging' into develop 2024-02-12 16:13:55 +01:00
Alejandro dd3040c56f Merge pull request #4129 from penpot/niwinz-stagoing-debug-on-error
 Add the ability to download a report on internal error
2024-02-12 16:02:05 +01:00
Alejandro Alonso 90d6d38b47 🐛 Fix duplicate component 2024-02-12 15:49:40 +01:00
Andrey Antukh f62d2085e8 Add the ability to download a report on internal error page 2024-02-12 15:37:29 +01:00
Andrey Antukh e55d1a3b7f Add minor optimization for d/without-qualified helper 2024-02-12 15:28:07 +01:00
Andrey Antukh 528f0b4f60 💄 Add cosmetic improvements on static page components 2024-02-12 14:55:42 +01:00
Andrey Antukh 722cb6351d 💄 Add minor cosmetic changes to file-update ns 2024-02-12 14:55:42 +01:00
Andrey Antukh 4cd9237f47 🐛 Fix unexpected exception on task-gc
Because table was renamed but the sql on the task function
still uses the old name.
2024-02-12 14:55:42 +01:00
Aitor b9b66aee85 🐛 Fix dropdown being cut off 2024-02-12 12:19:17 +01:00
Aitor 08c8b938ae 🐛 Fix color picker picking color from library 2024-02-12 12:19:17 +01:00
Aitor 1907884a6d 🐛 Fix create token button size 2024-02-12 12:19:17 +01:00
Aitor 44c4ba08b8 🐛 Show color name when it is from the library 2024-02-12 12:19:17 +01:00
Andrey Antukh f4ac607958 ♻️ Refactor srepl helpers 2024-02-12 10:21:47 +01:00
Alejandro Alonso dc67056a8c 🐛 Fix components without root shape for v2 migration 2024-02-12 10:21:47 +01:00
Andrey Antukh dae277adb2 Merge remote-tracking branch 'origin/staging' into develop 2024-02-12 10:07:32 +01:00
alonso.torres 9f6b82dfc0 🐛 Fix problem with changes files 2024-02-11 17:55:34 +01:00
alonso.torres c17d2c1aba 🐛 Fix problems when moving shapes in layouts 2024-02-11 17:55:34 +01:00
alonso.torres b6be1c2e1a 🐛 Fix line break on flex/grid options 2024-02-11 17:55:34 +01:00
alonso.torres ed9ee210e4 🐛 Change icon to align self stretch 2024-02-11 17:55:34 +01:00
alonso.torres 0f50afc4c3 🐛 Fix typo when grid board selected 2024-02-11 17:55:34 +01:00
alonso.torres 4e1353caf1 🐛 Fix problems with grid layout and flex children absolute 2024-02-11 17:55:34 +01:00
alonso.torres c8d19c846a 🐛 Fix problems with flex child properties in components 2024-02-11 17:55:34 +01:00
Andrey Antukh cdf8c5836a Merge remote-tracking branch 'origin/staging' into develop 2024-02-09 15:01:42 +01:00
Andrey Antukh d6114d0a2b Merge branch 'translations' into staging 2024-02-09 15:01:17 +01:00
Andrey Antukh 3a6a20e1da Merge remote-tracking branch 'weblate/develop' into translations 2024-02-09 14:59:22 +01:00
Revenant aa360dd0aa 🌐 Add translations for: Malay.
Currently translated at 7.5% (102 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ms/
2024-02-09 14:58:31 +01:00
Andrey Antukh 1743da7ebf Merge remote-tracking branch 'origin/staging' into develop 2024-02-09 14:57:48 +01:00
Andrés Moya 80feaaeed3 🐛 Improve the smartness of the ref-shape-not-found repair script 2024-02-09 12:07:24 +01:00
Andrés Moya 206f9acfd9 Make shape ref smarter to find some subtle validation error 2024-02-09 12:07:24 +01:00
Andrey Antukh f9af2a16b9 Add the ability to create a file snapshot on repair 2024-02-09 12:01:09 +01:00
Andrey Antukh c07dbc9843 📎 Move repair and validate srepl helpers to srepl.main 2024-02-09 12:01:09 +01:00
Andrey Antukh 43b8ccb52e Improve error handling on websocket code 2024-02-09 12:01:09 +01:00
Andrey Antukh ec2eb3d406 🐛 Fix broken text shapes without position-data on comp-v2 migration 2024-02-09 12:01:09 +01:00
Andrey Antukh 6d35cb2eb4 Improve snapshot related internal API
This commit also adds the ability to take snapshot of all files
of the team in a single run/transaction.
2024-02-09 12:01:09 +01:00
Andrey Antukh aaf457a792 Add support for ::sql/order-by on db/sql layer 2024-02-09 12:01:09 +01:00
Alejandro Alonso 8d65998cc3 🐛 Fix remove nested roots on components v2 migration 2024-02-09 12:01:09 +01:00
Andrey Antukh a5fc42cafa Normalize ids parsing on srepl helpers 2024-02-09 12:01:09 +01:00
Alejandro Alonso 66eca9ba4a 🐛 Fix conflict on components path for v2 migration 2024-02-09 12:01:09 +01:00
Alejandro Alonso 6fa22c3a04 🐛 Fix components with non existing component-ids for v2 migration 2024-02-09 12:01:09 +01:00
Alejandro Alonso 0c682ea75d 🐛 Fix components with compont-root on library for v2 migration 2024-02-09 12:01:09 +01:00
Alejandro Alonso bdb16109d5 🐛 Fix empty components on v2 migration 2024-02-09 12:01:09 +01:00
Madalena Melo ced357dcca 🌐 Added translation for: Malay. 2024-02-09 11:25:49 +01:00
Andrey Antukh cff44e34c3 Merge remote-tracking branch 'origin/staging' into develop 2024-02-09 09:53:13 +01:00
Aitor 07693a46f2 🐛 Fix thumbnails not being cleared immediately 2024-02-08 17:25:14 +01:00
Belén Albeza 6b60b10cfb 🐛 Fix multi radius input being reset to zero on blur 2024-02-08 17:13:45 +01:00
Belén Albeza acef775131 🐛 Fix mixed values displays for measurements in the design tab 2024-02-08 17:13:45 +01:00
Eva d91b3d4fb6 ♻️ Update spacing on assets tab 2024-02-08 09:37:51 +01:00
Andrey Antukh 740db82b6c Merge remote-tracking branch 'origin/staging' into develop 2024-02-08 09:10:06 +01:00
Alejandro de7c61e5ca Merge pull request #4107 from penpot/staging-migration
 Improvements to migration process
2024-02-08 08:32:33 +01:00
Alejandro a31fbabc10 Merge pull request #4103 from penpot/niwinz-staging-bugfix-12
💄 Minor cosmetic changes
2024-02-08 08:22:50 +01:00
Alejandro 5b2227cf4f Merge pull request #4111 from penpot/alotor-bugfix-16
Alotor bugfix 16
2024-02-07 13:14:05 +01:00
alonso.torres 84537b607e 🐛 Fix problem with numeric inputs 2024-02-07 12:59:41 +01:00
alonso.torres 3d66ae21de 🐛 Fix problem with line caps 2024-02-07 11:09:54 +01:00
alonso.torres 8032a22f14 🐛 Fix problem when moving absolute positioned shapes 2024-02-07 09:49:01 +01:00
alonso.torres 5ed1ff6d41 🐛 Fix error when changing shadow color 2024-02-07 09:49:01 +01:00
Andrey Antukh d2626ead0b Add better email cleaning mechanism
This commit separates the email cleaning mechanism to a separated
function, and enables a proper cleaning of `mailto:` prefix, usually
found on invitations because users just copy and paste from external
source.
2024-02-07 09:14:07 +01:00
Andrey Antukh 4d7a572daa Merge remote-tracking branch 'origin/staging' into develop 2024-02-06 20:10:55 +01:00
Andrey Antukh 040b336ef9 Add helper for restoring team after migration to comp-v2 2024-02-06 19:20:25 +01:00
Andrey Antukh 2331647ec6 🐛 Add missing team-profile rels cloning on duplicate-team srepl helper 2024-02-06 19:18:22 +01:00
Andrey Antukh 7a50cb3ff9 🐛 Fix broken restore snapshot function 2024-02-06 19:17:59 +01:00
Andrey Antukh a71e7f7906 Remove partitioning from task table
Which causes strange random delays when some row is moved from one
partition to other. Also, there are evidences that partitioning is
not aporting real value here.
2024-02-06 17:23:18 +01:00
Andrey Antukh 267045e113 Improve migration scripts 2024-02-06 17:22:20 +01:00
Belén Albeza a41ce5b8b7 🐛 Fix search bar being wider when recent-fonts is nil 2024-02-06 16:30:13 +01:00
Belén Albeza d737b9501b 🐛 Fix color of email input when inviting members to team 2024-02-06 16:29:41 +01:00
Belén Albeza 79130b4da9 Improve a11y of paragraphs in modal + layout fixes 2024-02-06 16:29:10 +01:00
Andrés Moya 836781be42 🐛 Fix detection of root in a particular case (affects many places) 2024-02-06 14:08:27 +01:00
Andrés Moya 42a0152c3a 🐛 Fix frame-id when adding shapes to a main 2024-02-06 14:08:27 +01:00
Aitor efddd6c35f 🐛 Fix thumbnail in shared library not updated 2024-02-06 10:09:41 +01:00
alonso.torres 564843b297 Add border to rulers 2024-02-06 10:07:22 +01:00
Eva 1df4118523 ♻️ Add border to UI elements 2024-02-06 10:07:22 +01:00
Andrey Antukh cb6db21e63 Merge remote-tracking branch 'origin/staging' into develop 2024-02-06 09:38:25 +01:00
alonso.torres 4c683bb10c 🐛 Fix problem with numeric inputs 2024-02-05 20:14:52 +01:00
alonso.torres 512e9b2070 🐛 Fix problem with shortcut colors and colorpicker 2024-02-05 20:14:52 +01:00
alonso.torres b8b40fc7ef 🐛 Fix problem with flex propagation 2024-02-05 20:14:52 +01:00
alonso.torres a64854bf72 🐛 Fix icon for grid manual position 2024-02-05 20:14:52 +01:00
alonso.torres 6f48f8eceb 🐛 Fix problem with guides when duplicating components 2024-02-05 20:14:52 +01:00
alonso.torres 769aa16cc4 🐛 Fix visual problem with gradient stops 2024-02-05 20:14:52 +01:00
alonso.torres e97245c762 🐛 Fix shadows color using libraries 2024-02-05 20:14:52 +01:00
alonso.torres 79963d1eab 🐛 Fix problem with cursor disapeering on top toolbar 2024-02-05 20:14:52 +01:00
alonso.torres c90af362b3 🐛 Fix frame titles clip to the frame width 2024-02-05 20:14:52 +01:00
alonso.torres 7ca30a313d 🐛 Make default border inside 2024-02-05 20:14:52 +01:00
Andrey Antukh 0e380a97cc 💄 Add minor cosmetic improvement to worker ns 2024-02-05 20:11:20 +01:00
Andrey Antukh 275c8b5860 💄 Fix logging level on rpc climit ns 2024-02-05 20:10:57 +01:00
Andrey Antukh 8231890ee4 🔥 Remove unnecesary line on audit ns 2024-02-05 20:10:44 +01:00
Yessenia Villarte Vaca 9126adacde 🌐 Add translations for: Spanish (Latin America).
Currently translated at 10.3% (139 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es_419/
2024-02-02 14:01:50 +01:00
Eva ced1f60940 ♻️ Fix swap component 2024-02-02 12:03:35 +01:00
Alejandro 532a656daf Merge pull request #4097 from penpot/niwinz-staging-bugfix-11
🐛 Fix incorrect metrics reporting on climit
2024-02-02 11:23:48 +01:00
Andrey Antukh 7db883e8b7 🐛 Fix incorrect metrics reporting on climit 2024-02-02 11:12:23 +01:00
Andrey Antukh 79105e8034 Merge pull request #4067 from penpot/staging-migration
 & 🐛 More fixes and performance enhacements for the migration process
2024-02-02 10:56:49 +01:00
Alejandro Alonso c6fb211874 🐛 Fix copies of detached elements migration 2024-02-02 10:54:34 +01:00
Andrés Moya 750ea4fe3f 🐛 Add a fix for component heads that are not groups or frames 2024-02-02 10:54:34 +01:00
Andrey Antukh 04fd4e12d7 🐛 Fix invalid transforms on comp-v2 migration 2024-02-02 10:54:34 +01:00
Andrey Antukh 9eb902c682 🐛 Fix broken grids defaults on comp-v2 migration 2024-02-02 10:54:34 +01:00
Andrey Antukh dba10ffd9b 🐛 Fix broken circle shapes geometry on comp-v2 migration 2024-02-02 10:54:34 +01:00
Andrey Antukh 3a401f69fd Simplify srepl helper for shape deletion 2024-02-02 10:54:34 +01:00
Andrey Antukh e8c35c2de6 🐛 Fix invalid shape type :icon on comp-v2 migration 2024-02-02 10:54:33 +01:00
Andrey Antukh a8cf072bda Add proper error report on binfile/v1 exportation 2024-02-02 10:54:33 +01:00
Andrey Antukh 3d462e3821 Split geometry fixes form fix-misc fn on comp-v2 migration 2024-02-02 10:54:33 +01:00
Andrey Antukh 8528de642f 🐛 Remove :thumbnail prop from all shapes on comp-v2 migration 2024-02-02 10:54:33 +01:00
Andrés Moya fb7d3676d2 🐛 Fix components without id 2024-02-02 10:54:33 +01:00
Andrey Antukh 09ba1c262b 🐛 Add minor adjustment to migration 33 to accept and fix invalid root frames 2024-02-02 10:54:33 +01:00
Andrey Antukh d4c91ae44b 💄 Print file name on process-file! helper progress report 2024-02-02 10:54:33 +01:00
Andrey Antukh e216b10716 🐛 Fix raw data export import on debug interface 2024-02-02 10:54:33 +01:00
Andrey Antukh 5e4e706033 Use proper executor for cache on comp-v2 migration 2024-02-02 10:54:33 +01:00
Andrey Antukh 7968bffc38 💄 Minor cosmetic change on pages-seq helper 2024-02-02 10:54:33 +01:00
Andrey Antukh 733825edfa Optimize d/mapm helper using reduce-kv 2024-02-02 10:54:33 +01:00
Andrey Antukh 893a8992c3 Add progress reporting on process-files! srepl helper 2024-02-02 10:54:33 +01:00
Andrey Antukh f97931647c Add helper for mark for deletion invalid files 2024-02-02 10:54:33 +01:00
Andrey Antukh 13ca5d1f1a Add minor improvements to process-files! srepl helper 2024-02-02 10:54:33 +01:00
Andrey Antukh db5946d1ab 🐛 Fix broken points on image shapes in comp-v2 migration 2024-02-02 10:54:33 +01:00
Andrey Antukh 43c13ed432 🐛 Add additional fix to fix-percents function on svg parse 2024-02-02 10:54:33 +01:00
Andrey Antukh b6d53c9ded 📎 Update devenv logging config 2024-02-02 10:54:33 +01:00
Andrey Antukh db622cece8 Use better default for svgo on frontend code 2024-02-02 10:54:33 +01:00
Andrey Antukh a8ab883c07 🐛 Use correct default for r on parsing svg circle 2024-02-02 10:54:33 +01:00
Andrey Antukh fc0a4fa5b7 🐛 Ignore style attr on fix-percents function 2024-02-02 10:54:33 +01:00
Alejandro Alonso 8cc3669aac Improve validator syntax 2024-02-02 10:54:33 +01:00
Alejandro Alonso 2924791cb0 🐛 Fix non-root copy only allowed inside a copy migration error 2024-02-02 10:54:33 +01:00
Andrey Antukh 7c0a63c7da Add minor improvements to comp-v2 migration srepl helper 2024-02-02 10:54:33 +01:00
Andrey Antukh 26f4082b5f 📎 Add debug helpers for jvm/tap 2024-02-02 10:54:33 +01:00
Andrey Antukh 036bf84ecd 🐛 Set proper order on comp-v2 migration fixes 2024-02-02 10:54:33 +01:00
Andrey Antukh c4ee88dc66 🐛 Add fix for percent number on style attrs on parsing svg 2024-02-02 10:54:33 +01:00
Andrey Antukh 03eca0d9a2 🐛 Repair shape points if it is possible on comp-v2 migration 2024-02-02 10:54:33 +01:00
Andrey Antukh 3ea737deb1 🐛 Remove paths that can't be repaired on comp-v2 migration 2024-02-02 10:54:33 +01:00
Andrey Antukh 0ea623487c Add better validation for point, matrix and rect types 2024-02-02 10:53:29 +01:00
Alejandro Alonso 5baa9e8fb6 🐛 Fix shape should not be component root migration error 2024-02-02 10:53:29 +01:00
Andrey Antukh e43380ad61 🐛 Properly remove invalid text shapes on comp-v2 migration 2024-02-02 10:53:29 +01:00
Andrey Antukh 9ca7c4280c 💄 Fix minor cosmetic issues on components-v2 feature ns 2024-02-02 10:53:29 +01:00
Andrey Antukh 295d9568c8 🐛 Fix incompatibilities of old file migrations with new code 2024-02-02 10:53:29 +01:00
Andrey Antukh 04be6b13be 🐛 Fix invalid colors on file library on comp-v2 migration 2024-02-02 10:53:29 +01:00
Andrés Moya e4e566240f 🐛 Add fix for removing v2 remains in v1 files 2024-02-02 10:53:29 +01:00
Andrés Moya daf77ecc5f 🐛 Enhande handling of detached shapes during migration fixes 2024-02-02 10:53:29 +01:00
Alejandro Alonso 0fd6cacd17 🐛 Fix parent not found, adding migration 2024-02-02 10:53:29 +01:00
Andrey Antukh 6d73685f3a Optimize file validation process 2024-02-02 10:53:29 +01:00
Andrey Antukh f104cc5477 Improve performance on creating component from graphic
About 25% speed improvement on average on single file migration process
2024-02-02 10:53:29 +01:00
Andrey Antukh 06033ea955 Merge remote-tracking branch 'origin/staging' into develop 2024-02-02 10:15:40 +01:00
Alejandro c70acb1570 Merge pull request #4090 from penpot/alotor-drag-component-instance
 Change drag component to instantiate on enter the viewport
2024-02-02 09:42:48 +01:00
Andrey Antukh 60fbcc3e4b Merge pull request #4094 from penpot/ladybenko-6828-fix-text-selection
🐛 Fix text options & font selector in design tab
2024-02-02 08:34:31 +01:00
Alejandro a980c102be Merge pull request #4068 from penpot/niwinz-staging-bugfix-8
🐛 Fix incorrect behavior of climit subsystem and adapt related code
2024-02-02 07:18:56 +01:00
Andrey Antukh a005bf63a2 Merge pull request #4095 from penpot/alotor-bufixes-14
Bug fixing
2024-02-01 19:16:01 +01:00
Andrey Antukh a5c6d78ee5 ♻️ Fix some fundamental bugs on climit module
The climit previously of this commit is heavily used inside a
transactions, so in heavy contention operation such that file thumbnail
creation can cause a db pool exhaust.

This commit fixes this issue setting up a better resource limiting
mechanism that works outside the transactions so, contention will
no longer hold an open connection/transaction.

It also adds general improvement to the traceability to the climit
mechanism: it now properly logs the profile-id that is currently
cause some contention on specific resources.

It also add a general/root climit that is applied to all requests
so if someone start making abussive requests, we can clearly detect
it.
2024-02-01 17:37:49 +01:00
Andrey Antukh 658c26014b 💄 Define a RPC schema as standalone var for create-file-thumbnail 2024-02-01 17:24:42 +01:00
Andrey Antukh dabb9d0a82 Improve internal API of retry mechanism 2024-02-01 17:24:42 +01:00
Andrey Antukh 16a051d7e0 Improve efficiency of thumbnails creation RPC methods
Moving the retry mechanism out of the transaction
2024-02-01 17:24:42 +01:00
Andrey Antukh 82b10ecb87 Refactor comments RPC methods to use schema instead of spec 2024-02-01 17:24:42 +01:00
Andrey Antukh 5accbd511f Improve quote data structure validation 2024-02-01 17:24:42 +01:00
Andrey Antukh e7a27759e6 🐛 Fix react warning on isPinned unrecognized prop 2024-02-01 17:24:42 +01:00
Andrey Antukh 3001476dbc Do not wrap in sm/define on rpc methods
Because is redundant operation
2024-02-01 17:24:42 +01:00
Andrey Antukh a9e7ed57d9 Use proper exceptions on internal db functions 2024-02-01 17:24:41 +01:00
alonso.torres 3a260825b9 🐛 Fix problem with multiplayer cursors 2024-02-01 17:05:12 +01:00
alonso.torres 7fa47d68a8 🐛 Fix problems with text gradients 2024-02-01 17:05:12 +01:00
Belén Albeza a5239c1cb6 🐛 Fix bad background for new team button in light theme 2024-02-01 16:21:00 +01:00
Belén Albeza 2298252379 🐛 Fix font-selector current font tick being misaligned in full size dropdown 2024-02-01 16:21:00 +01:00
Belén Albeza 669d928bbf 🐛 Fix font-selector not autofocusing and remove its inner drop shadow 2024-02-01 15:09:04 +01:00
Belén Albeza 0b3cff1a9f 🐛 Fix spacing in Design tab / Text options 2024-02-01 14:29:08 +01:00
alonso.torres f1768c5a07 🐛 Fix problems with inspect and texts 2024-02-01 11:32:35 +01:00
alonso.torres b0d723282b 🐛 Fix problem when export not getting new change 2024-02-01 10:32:44 +01:00
alonso.torres 497b581576 Change drag component to instantiate on enter the viewport 2024-02-01 10:23:34 +01:00
alonso.torres 334d1fd9b3 🐛 Change order of contraints options panel 2024-02-01 10:23:06 +01:00
alonso.torres 188f5c6167 🐛 Fix problem with snap points 2024-02-01 10:23:06 +01:00
alonso.torres e474accb61 🐛 Fix problem with components thumbnails single column 2024-02-01 10:23:06 +01:00
Alejandro f75da999dc Merge pull request #4089 from penpot/niwinz-staging-bugfix-10
🐛 Fix issues with attrs->props function
2024-01-31 17:51:41 +01:00
Andrey Antukh 457feedec4 🐛 Fix many issues svg/attrs->props function 2024-01-31 17:41:29 +01:00
Andrey Antukh 1de9171d50 Add mask-type style parsing (react now supports it) 2024-01-31 17:32:37 +01:00
Andrey Antukh 4a4aabd230 Merge pull request #4088 from penpot/alotor-bugfixes-13
Alotor bugfixes 13
2024-01-31 17:26:20 +01:00
alonso.torres ace890c809 🐛 Fix problem when changing main component with grid elements 2024-01-31 16:59:35 +01:00
alonso.torres cea096f06c Add debug renderer for grid-layout cells 2024-01-31 16:59:35 +01:00
alonso.torres a853314e3f 🐛 Fix problem with text editor alignment 2024-01-31 16:59:35 +01:00
alonso.torres 1f2f70fcd4 New menu entry for change theme 2024-01-31 16:59:35 +01:00
alonso.torres 14584ef920 🐛 Fix problem with debug panel and light theme 2024-01-31 16:59:35 +01:00
alonso.torres f6b182a3b5 🐛 Fix problem calculating selrect for certain paths 2024-01-31 16:59:35 +01:00
alonso.torres 02ab545cda 🐛 Fix problem with flex layout controls for padding, gap and margin 2024-01-31 16:59:35 +01:00
alonso.torres 2b715851e1 🐛 Fix proportional scaling with grid layout 2024-01-31 16:59:35 +01:00
alonso.torres 994d08b479 🐛 Fix problem refreshing layouts 2024-01-31 16:59:35 +01:00
alonso.torres 051859969c 🐛 Fix problem when creating frames contining paths 2024-01-31 16:59:35 +01:00
Belén Albeza f7ad3e37a4 🐛 Fix selected text not being visible 2024-01-31 16:59:12 +01:00
Alejandro Alonso 41d6261ef3 🐛 Fix duplicate component 2024-01-31 16:40:17 +01:00
Alejandro 712130495e Merge pull request #4085 from penpot/niwinz-staging-bugfix-9
🐛 Fix team photo handling on binfile/v2 export-import operation
2024-01-31 13:03:05 +01:00
Andrey Antukh 2661d6c122 🐛 Fix team photo handling on binfile/v2 export-import operation 2024-01-31 12:27:31 +01:00
Belén Albeza d70fc33689 Show loading message in Libraries modal 2024-01-31 11:19:49 +01:00
Andrey Antukh f15caf54dd Merge remote-tracking branch 'origin/staging' into develop 2024-01-31 11:05:20 +01:00
Pablo Alba 8bd10c3c04 🐛 Fix weird positioning of component mixing undos and cut/paste 2024-01-31 09:32:30 +01:00
Alejandro 4c815998f8 Merge pull request #4082 from penpot/niwinz-staging-binfile-join
📎 Add helper for check not referenced media
2024-01-31 07:27:05 +01:00
Alejandro Alonso 36dce3ddbc 🐛 Fix dotted strokes 2024-01-30 20:32:23 +01:00
Andrey Antukh 94ee83a120 Merge remote-tracking branch 'origin/staging' into develop 2024-01-30 19:32:44 +01:00
Andrey Antukh 4e9b92b857 📎 Add helper for check not referenced media 2024-01-30 19:30:05 +01:00
Alejandro e1befadc18 Merge pull request #4079 from penpot/hiru-enhance-debug-tool
🔧 Improve debug tool
2024-01-30 18:09:41 +01:00
Andrés Moya 891dab7f06 🔧 Improve debug tool 2024-01-30 18:03:20 +01:00
Alejandro a6e8d408b5 Merge pull request #4081 from penpot/eva-change-shortcut
♻️ Change shortcut for change theme
2024-01-30 17:00:46 +01:00
Alejandro 24faba67d8 Merge pull request #4080 from penpot/superalex-improve-debug-shape-info
❇️ Allow select text on debug shape info panel
2024-01-30 16:51:09 +01:00
Eva 8f004c0c75 ♻️ Change shortcut for change theme 2024-01-30 16:47:34 +01:00
Alejandro 86f09fa028 Merge pull request #4077 from penpot/niwinz-staging-binfile-join
♻️ Unify binfile exportation code
2024-01-30 16:43:17 +01:00
Alejandro Alonso 208b06d9cb ❇️ Allow select text on debug shape info panel 2024-01-30 16:36:21 +01:00
Andrey Antukh cdf312fdd9 Add better progress reporting
For components migration and for binfile import process
2024-01-30 16:27:16 +01:00
Andrey Antukh 7f60946204 ♻️ Refactor exportation and duplicate mechanism
Previously the file processing was implemented 3 times using similar
approaches bug each own with its own bugs. This PR unifies the
loging to a single implementation used by the 3 operations.
2024-01-30 16:27:16 +01:00
Eva 153bb752a4 ♻️ Add new exceptions for light theme 2024-01-30 16:08:08 +01:00
Eva a882d0bf6d ♻️ Update basic color palette 2024-01-30 16:08:08 +01:00
Andrey Antukh cb6e3a2e3c Merge remote-tracking branch 'origin/staging' into develop 2024-01-30 15:34:50 +01:00
Andrés Moya a85a7c74c3 Rename "Library backup" to "Main components" 2024-01-30 13:36:25 +01:00
alonso.torres 7aeb5498a1 🐛 Fix problem with grid component synchronization 2024-01-30 11:10:36 +01:00
Pablo Alba be31371892 🐛 Fix bad page-id on undo delete component 2024-01-30 09:34:33 +01:00
Pablo Alba 3620e6b4d7 🐛 Change the naming convention of some swap things 2024-01-30 09:34:33 +01:00
alonso.torres 440983d2b9 Add new debug panel 2024-01-29 15:26:23 +01:00
Belén Albeza 0a69bc03b0 🐛 Fix pin button color in dashboard/projects 2024-01-29 15:07:24 +01:00
Alejandro 0c302e30c9 Merge pull request #4069 from penpot/niwinz-main-bugfix-1
🐛 Fix incorrect props handling on profile registration
2024-01-29 13:18:43 +01:00
Andrey Antukh 2fa06baa36 🐛 Fix incorrect props handling on profile registration 2024-01-29 10:29:18 +01:00
Oğuz Ersen 4ead40b640 🌐 Add translations for: Turkish.
Currently translated at 100.0% (1344 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2024-01-28 12:01:44 +01:00
Aitor Moreno 094d11f972 Merge pull request #4059 from penpot/superalex-fix-canvas-messages
🐛 Fix inspect and edit grid canvas messages
2024-01-26 14:41:11 +01:00
Alejandro Alonso 4537576a6d 🐛 Fix inspect and edit grid canvas messages 2024-01-26 14:17:26 +01:00
Alejandro 4909e8bc74 Merge pull request #4056 from penpot/alotor-bugfixes-11
Bugfixing (general and Safari)
2024-01-26 11:50:33 +01:00
Madalena Melo f0fc3a5d84 🌐 Deleted translation: Abkhazian. 2024-01-26 10:53:00 +01:00
Madalena Melo 7183b52f4c 🌐 Added translation for: Abkhazian. 2024-01-26 10:52:01 +01:00
alonso.torres 9965fbc92b 🐛 Fix text editor for Safari 17 2024-01-26 09:26:32 +01:00
alonso.torres 919f6d246b 🐛 Fix problem with offset colorpicker in Safari 2024-01-26 09:26:32 +01:00
alonso.torres c8593b1c18 🐛 Fix get name from file when importing 2024-01-26 09:26:32 +01:00
alonso.torres 50774bebb3 🐛 Fix problem with gradient and rotations in booleans 2024-01-26 09:26:32 +01:00
alonso.torres 46b767ab0b 🐛 Fix fast moving drawing and snap interaction 2024-01-26 09:26:32 +01:00
alonso.torres 7ddfdb1e15 🐛 Fix grid layout controls being clipped by scroll 2024-01-26 09:26:32 +01:00
alonso.torres a0426d14cc 💄 Remove red debug background 2024-01-26 09:26:32 +01:00
alonso.torres 582ae6a850 🐛 Fix problem with menu and proportional scaling 2024-01-26 09:26:32 +01:00
alonso.torres 47a4c6b0c1 🐛 Fix problem uploading svg files into assets 2024-01-26 09:26:32 +01:00
Andrey Antukh 8abab982e7 Merge remote-tracking branch 'origin/staging' into develop 2024-01-25 23:26:55 +01:00
Andrey Antukh 6bc6f7ae7f Merge pull request #4030 from penpot/azazeln28-bugfixes-4
Azazeln28 bugfixes 4
2024-01-25 23:25:31 +01:00
Andrey Antukh a10090974e Merge pull request #4053 from penpot/ladybenko-6674-icons
 Use new icons for feedback, pin and download + refactor the pin button
2024-01-25 23:24:14 +01:00
Andrey Antukh a0a7b0dc7d Merge pull request #4055 from penpot/staging-migration
🐛 Migration bugfixes
2024-01-25 20:59:28 +01:00
Andrey Antukh 623b4a9858 🐛 Remove empty text shapes on comp-v2 migration 2024-01-25 18:05:57 +01:00
Andrey Antukh b1d33d4c15 🐛 Add missing shape name on comp-v2 migration 2024-01-25 17:58:55 +01:00
Andrey Antukh 1a3c07abdb 🐛 Remove completely broken shapes on comp-v2 migration 2024-01-25 17:31:27 +01:00
Andrey Antukh adffd1f000 🐛 Fix text shapes content internal data type incosistency 2024-01-25 17:21:05 +01:00
Andrey Antukh 9f80ddd125 🐛 Fix path shapes that does not have :content attr 2024-01-25 17:01:08 +01:00
Andrey Antukh 0e724ac821 🐛 Add better fix for parsing svg-dimensions
That covers more corner cases
2024-01-25 16:43:49 +01:00
Andrey Antukh a2a61e99a7 🐛 Fix invalid values on colors and typografies on fdata 2024-01-25 16:33:53 +01:00
Belén Albeza 8798ff937d Use new icons for feedback, pin and download + refactor the pin button 2024-01-25 16:25:42 +01:00
Alejandro d5aa4f3ee4 Merge pull request #4050 from penpot/niwinz-staging-bugfix-8
🐛 Fix incorrect props handling on profile registration
2024-01-25 16:14:19 +01:00
Andrey Antukh faa4467b02 Merge pull request #4024 from penpot/staging-migration
🐛 Bugfixes and enhancements to the components migration process
2024-01-25 16:11:41 +01:00
Andrey Antukh 0c8aba6be0 🐛 Fix incorrect parsing of svg transform attr 2024-01-25 16:03:31 +01:00
Andrey Antukh 7ae308c8c9 🐛 Remove page background color it it has an invalid rgb color string 2024-01-25 16:03:31 +01:00
Alejandro Alonso f864424d14 🐛 Fix parent not found 2024-01-25 16:03:31 +01:00
Andrey Antukh 317f83e3ec 🐛 Fix edge case on parsing svg viewbox 2024-01-25 16:03:31 +01:00
Andrey Antukh 75576c341d 🐛 Fix broken bool shapes on comp-v2 migration 2024-01-25 16:03:31 +01:00
Andrey Antukh 70b57f92b4 🐛 Fix broken path content on comp-v2 migration 2024-01-25 16:03:31 +01:00
Andrey Antukh df4be5106b 🐛 Fix text shapes wrongly converted to path in comp-v2 migration 2024-01-25 16:03:31 +01:00
Andrey Antukh 66c07e1336 Reapply again all file migrations on comp-v2 migration 2024-01-25 16:03:31 +01:00
Andrey Antukh e6766bac8f Set correct order of filtering teams on migration function 2024-01-25 16:03:31 +01:00
Andrey Antukh 0d5c1811cf 🐛 Fix edge cases on retrieving href-id on svg to shapes conversion 2024-01-25 16:03:31 +01:00
Andrey Antukh 1b3e68f430 Improve partitioning and graphics error skiping mechanism
On the migration functions
2024-01-25 16:03:31 +01:00
Andrey Antukh 326be0df4f 🐛 Fix incorrect type supposition on attr inheritance on parsing svg 2024-01-25 16:03:31 +01:00
Andrey Antukh 3986543293 📎 Add missing IEquiv implementation for luxon DateTime type 2024-01-25 16:03:31 +01:00
Andrey Antukh 3f97b3a112 🐛 Fix minor issues on migration code 2024-01-25 16:03:30 +01:00
Andrey Antukh 8d0afd8c96 🐛 Add migration for fix invalid shadows 2024-01-25 16:03:30 +01:00
Andrés Moya 17a208d67b 🐛 Add validation fix for false non root copies 2024-01-25 16:03:30 +01:00
Andrés Moya cceb35b053 🐛 Ensure detach in migration fixes always works 2024-01-25 16:03:30 +01:00
Andrés Moya 3b0d654b6d 💄 Review naming and comments 2024-01-25 16:03:30 +01:00
Andrey Antukh 3b929041f2 🐛 Fix incorrect percent number parsing on reading svg 2024-01-25 16:03:30 +01:00
Andrey Antukh 2950259f97 🐛 Fix invalid text shapes with invalid nodes 2024-01-25 16:03:30 +01:00
Andrey Antukh e4f4ab9221 🐛 Fix invalid page flows on comp-v2 migration 2024-01-25 16:03:30 +01:00
Andrey Antukh aaeb8c8868 🐛 Fix components with bool shape as root on comp-v2 migration 2024-01-25 16:03:30 +01:00
Andrey Antukh 4ab4ad96f0 🐛 Resolve objects-map on srepl/get-file helpers 2024-01-25 16:03:30 +01:00
Andrey Antukh 0d33779c95 Add support for reporting and partitions on comp-v2 migration code 2024-01-25 16:03:30 +01:00
Andrés Moya db21525485 🐛 Add validation check for duplicated children 2024-01-25 16:03:30 +01:00
Andrés Moya 00e894d801 🐛 Add validation fix for duplicated children 2024-01-25 16:03:30 +01:00
Andrés Moya d69db0b337 🐛 Add one more validation fix in migration 2024-01-25 16:03:30 +01:00
Andrés Moya 02cb75209c 💄 Unify source code style of repair functions 2024-01-25 16:03:30 +01:00
Andrés Moya c679b04ad5 🐛 Avoid adding empty attributes on update if they doesn't exist 2024-01-25 16:03:30 +01:00
Andrés Moya 1d21bd34f6 🐛 Check orphan copies before affecting later checks 2024-01-25 16:03:30 +01:00
Andrés Moya 1f5991112d 🐛 Add two more fixes to v2 migration 2024-01-25 16:03:30 +01:00
Andrey Antukh 3bbd2023a4 🐛 Fix incorrect validation of shape geom attrs
Requied validation in a subset of supported shapes
2024-01-25 16:03:30 +01:00
Andrey Antukh 35da01bac9 🐛 Fix pages with shapes with to too big gemetry vals on comp-v2 migration 2024-01-25 16:03:30 +01:00
Andrey Antukh 5b84054eaa 🐛 Fix shape validation schema 2024-01-25 16:03:30 +01:00
Andrey Antukh 166d2b7b68 🐛 Fix broken fills and strokes on comp-v2 migration 2024-01-25 16:03:29 +01:00
Andrey Antukh 6ad6e6f856 🐛 Fix objects-map and pointer-map issues on file crud 2024-01-25 16:03:29 +01:00
Andrey Antukh 3e89a22600 🐛 Remove broken and unfixable image shapes on comp-v2 migration 2024-01-25 16:03:29 +01:00
Andrey Antukh ba3c42e62c 🐛 Fix broken layout and layout-gap props on migrating to comp-v2 2024-01-25 16:03:29 +01:00
Andrey Antukh 3d84270f50 🐛 Fix invalid ##Inf value on layout-gap on migrating to comp-v2 2024-01-25 16:03:29 +01:00
Andrey Antukh c7fa7aa7bc 🐛 Add migrations for fix shape geometry missing props 2024-01-25 16:03:29 +01:00
Andrey Antukh ec1bcada86 🐛 Fix recent colors on components migration 2024-01-25 16:03:29 +01:00
Andrey Antukh 0a5e15b916 ♻️ Simplify components-v2 migration functions impl 2024-01-25 16:03:29 +01:00
Andrey Antukh 02d8208553 📎 Add temporal repl and log4j config 2024-01-25 16:03:29 +01:00
Andrey Antukh f73ce6572c Improve rollback handlong on db ns 2024-01-25 16:03:29 +01:00
Andrey Antukh 997441eff3 📎 Fix typo on validation log message 2024-01-25 16:03:29 +01:00
Andrey Antukh c58302ffc4 🔥 Remove unnecessary do on file validation ns 2024-01-25 16:03:27 +01:00
Andrey Antukh f9d63dba00 🐛 Fix incorrect assumption about parseFloat on fixing percent
on parsing and normalizing svg elements
2024-01-25 15:59:45 +01:00
Andrey Antukh 9b59b92464 🐛 Improve not-found error report on s3 storage backend 2024-01-25 15:59:45 +01:00
Andrey Antukh b582998228 🐛 Add migration for fix bool shapes which does not have :bool-content attr 2024-01-25 15:59:45 +01:00
Andrey Antukh 33ad2d94fb 🐛 Add proper default to cx and cy when parsing svg circle elements 2024-01-25 15:59:45 +01:00
Andrey Antukh 161a55e166 Optimize general case of without-nils
Performance gains up to x6
2024-01-25 15:59:45 +01:00
Andrey Antukh 944d167bbb Simplify SVGO module API 2024-01-25 15:59:45 +01:00
Andrey Antukh 4fc391763e Prevent unexpected exception raising on closing s3 file 2024-01-25 15:59:45 +01:00
Andrey Antukh 92643b29c1 Improve internal cache api 2024-01-25 15:59:45 +01:00
Aitor 74e10c3629 🐛 Fix viewer header hover 2024-01-25 13:32:22 +01:00
Yessenia Villarte Vaca 5276afe349 🌐 Add translations for: Spanish (Latin America).
Currently translated at 7.4% (100 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es_419/
2024-01-25 13:01:45 +01:00
Yessenia Villarte Vaca 2b8d80a9b2 🌐 Add translations for: Spanish.
Currently translated at 99.4% (1336 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es/
2024-01-25 13:01:45 +01:00
Alejandro db5c16fb1d Merge pull request #4048 from penpot/niwinz-staging-bugfix-7
🐛 Fix unexpected exception on consecutive delete files with shift key pressed
2024-01-25 13:00:15 +01:00
Eva a24d5676a6 Add change theme shortcut on help section 2024-01-25 12:37:31 +01:00
Eva a3a7c597b5 🐛 Fix importzip file modal 2024-01-25 10:33:42 +01:00
Eva e92932b4f9 🐛 Fix empty state on viewer 2024-01-25 10:33:42 +01:00
Alejandro Alonso 901806e508 🐛 Remove unnecessary println 2024-01-25 06:34:04 +01:00
Alejandro Alonso a78eb226e2 Add nesting constraints for components 2024-01-24 17:20:17 +01:00
Andrey Antukh 69ffd57447 🐛 Fix incorrect props handling on profile registration 2024-01-24 17:12:41 +01:00
Aitor 748bc45eb7 🐛 Fix viewer left/right arrows when fullscreen 2024-01-24 15:11:06 +01:00
Andrey Antukh 98cae9fe10 🐛 Fix unexpected exception on consecutive delete files with shift key pressed
If you select N files (using shift key), then delete them and continuing
pressing the shift select an other file and proceed to delete it an
exception is raised. This is happens because the previous selection is
not cleared. This commit fixes that.
2024-01-24 11:56:57 +01:00
Alejandro 3c07416c48 Merge pull request #4047 from penpot/niwinz-staging-bugfix-7
🐛 Fix incorrect props transformation on custom strokes component
2024-01-24 11:53:08 +01:00
Andrey Antukh 840753aae3 🐛 Fix react warning about missing key on grid component 2024-01-24 11:28:41 +01:00
Andrey Antukh 22502ff7c8 🐛 Fix incorrect props transformation on custom strokes component 2024-01-24 11:18:08 +01:00
Eva Marco 508af62dc0 Merge pull request #4040 from penpot/ladybenko-6685-font-selector
🎉 Implement full-size font selector
2024-01-24 11:11:35 +01:00
alonso.torres 942f6167b0 🐛 Fix box selection for components and nested frames 2024-01-24 10:51:22 +01:00
alonso.torres 9e24ba7b39 Improved performance for hover shapes 2024-01-24 10:51:22 +01:00
alonso.torres 4f09688af7 🐛 Fix several SVG upload issues 2024-01-24 10:51:22 +01:00
alonso.torres b6b2a3ec53 🐛 Fix problems with fixed overlays 2024-01-24 10:51:22 +01:00
Belén Albeza 20ce492909 🐛 Fix assets bar not being tall enough (and thus typography dropdown clipped) in some occassions 2024-01-24 10:43:01 +01:00
Belén Albeza 50053b0fc4 🎉 Implement full-size font selector 2024-01-24 10:43:01 +01:00
Eva Marco f9fe4cd0a5 Merge pull request #4044 from penpot/superalex-fix-export-in-viewer
🐛 Fix export in viewer
2024-01-24 10:29:08 +01:00
Madalena Melo 3ca36a37af 🌐 Added translation for: Spanish (Latin America). 2024-01-24 10:04:24 +01:00
Alejandro a9415a95d2 Merge pull request #4036 from penpot/niwinz-staging-bugfix-6
🐛 Fix react warning on color-selection components
2024-01-24 09:11:59 +01:00
Andrey Antukh 6a412c75ce Merge remote-tracking branch 'origin/staging' into develop 2024-01-24 09:00:42 +01:00
Alejandro Alonso de09b10ac2 🐛 Fix export file from workspace 2024-01-24 08:58:52 +01:00
Alejandro Alonso 2091fbca7c 🐛 Fix export in viewer 2024-01-24 08:40:34 +01:00
Eva Marco c7ac3b0163 Merge pull request #4038 from penpot/ladybenko-6515-fix-privacy-checkbox
🐛 Fix accept privacy terms checkbox
2024-01-23 17:31:25 +01:00
Amerey.eu 87d17897ed 🌐 Add translations for: Czech.
Currently translated at 100.0% (1344 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/cs/
2024-01-23 16:02:13 +01:00
Stas Haas 0cd20db860 🌐 Add translations for: German.
Currently translated at 100.0% (1344 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2024-01-23 16:01:49 +01:00
Stas Haas b871337920 🌐 Add translations for: Russian.
Currently translated at 56.6% (762 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2024-01-23 16:01:49 +01:00
Aitor Moreno 78443353df Merge pull request #4034 from penpot/eva-bugfixing-ui-9
🐛 Fix some frontend errors
2024-01-23 12:50:39 +01:00
Eva b440ea5eee 🐛 Fix alert text color 2024-01-23 12:15:55 +01:00
Eva 43737ab528 🐛 Fix component icon on zoom 2024-01-23 12:15:37 +01:00
Aitor 1991b44c00 🐛 Fix toolbar not centered in workspace 2024-01-22 18:34:16 +01:00
Aitor e6fcb418b1 🐛 Fix toolbar hidden after unfinished path 2024-01-22 18:26:10 +01:00
Belén Albeza 3f23953f83 🐛 Fix accept privacy terms checkbox 2024-01-22 16:46:31 +01:00
Eva 8bc975e717 🐛 Fix border on team selector 2024-01-22 16:10:39 +01:00
Eva a41841ebf4 🐛 Fix close dropdown when option choosed 2024-01-22 13:20:16 +01:00
Andrey Antukh f127b5c6ea 🐛 Fix react warning on color-selection components 2024-01-22 11:30:23 +01:00
Aitor Moreno 258969f342 Merge pull request #4033 from penpot/alotor-bugfixes-10
Bugfixes
2024-01-22 11:26:16 +01:00
alonso.torres 97a6095762 🐛 Fix problem with thumbnails size 2024-01-22 11:14:13 +01:00
Eva b66032f2cc 🐛 Fix create assets group modal 2024-01-22 11:06:32 +01:00
alonso.torres ff72a9ce70 🐛 Fix problem with nil children 2024-01-22 10:55:57 +01:00
Eva cedcc15c9d 🐛 Fix padding on design bar 2024-01-22 10:43:03 +01:00
Eva dfbc449045 🐛 Fix scrollbar on comments section 2024-01-22 10:34:39 +01:00
alonso.torres 02044a8153 🐛 Fix problem in viewer with hidden elements 2024-01-19 15:54:45 +01:00
Eva 844634e8c8 🐛 Fix border color on inputs when hovering 2024-01-19 14:53:38 +01:00
Eva 1c98230487 ♻️ Change flow tag colors on hover 2024-01-19 14:53:38 +01:00
Eva 03f1ba733d 🐛 Fix export component label error 2024-01-19 14:53:38 +01:00
Eva 1e1b13196c 🐛 Fix colors on measurements elements 2024-01-19 14:53:38 +01:00
Eva 3dc45104db 🐛 Fix component icons 2024-01-19 14:53:38 +01:00
Eva 8e456d393f 🐛 Fix icons background on font page 2024-01-19 14:53:38 +01:00
Andrey Antukh 098e33bd98 Merge remote-tracking branch 'origin/staging' into develop 2024-01-19 14:44:14 +01:00
Eva Marco 6e229a4091 Merge pull request #4032 from penpot/ladybenko-6660-fix-assets-layout
🐛 Fix layout of assets bar when importing external libraries
2024-01-19 14:42:01 +01:00
Belén Albeza 4a77fdc887 🐛 Fix layout of assets bar when importing external libraries 2024-01-19 14:11:58 +01:00
Aitor Moreno 1ef8da0414 Merge pull request #4029 from penpot/alotor-bugfixes-9
Alotor bugfixes 9
2024-01-19 14:04:15 +01:00
alonso.torres e36dce372a 🐛 Make create component children scale 2024-01-19 09:53:07 +01:00
alonso.torres 26af5c7847 🐛 Fix keep cells when create component inside grid layout 2024-01-19 09:53:07 +01:00
alonso.torres 4c7e565f6a 🐛 Fix keep layout-item properties after swap 2024-01-19 09:53:07 +01:00
alonso.torres 800d35a42c Update text name on edit 2024-01-19 09:53:07 +01:00
alonso.torres abb3a33021 💄 Change rules styles 2024-01-19 09:53:07 +01:00
alonso.torres e193261d7f Reduce handlers for the flex layout gaps and paddings 2024-01-19 09:53:07 +01:00
alonso.torres 843a3f7f6e 🐛 Fix problem with fix when scrolling 2024-01-19 09:53:07 +01:00
alonso.torres ce675097b1 🐛 Fix problem with group selrect 2024-01-19 09:53:07 +01:00
alonso.torres ece11c5958 Adds debug for shapes drawing 2024-01-19 09:53:07 +01:00
Eva Marco 2a7f115266 Merge pull request #4026 from penpot/ladybenko-6571-fix-assets-dropdowns
🐛 Fix assets dropdown (search bar)
2024-01-18 18:35:15 +01:00
Eva Marco f11a56fb67 Merge pull request #4027 from penpot/ladybenko-6597-update-svg-icon
🐛 Fix icon for raw svg in layers tab
2024-01-18 18:34:57 +01:00
Belén Albeza fc7f26cbb5 🐛 fix typo in user-select css rule 2024-01-18 15:37:14 +01:00
Belén Albeza fd397c30ac 🐛 Fix icon for raw svg in layers tab 2024-01-18 12:19:09 +01:00
Eva Marco 04d8a64f63 Merge pull request #4017 from penpot/azazeln28-bugfixes-3
🐛 Bugfixes
2024-01-18 11:15:01 +01:00
Belén Albeza 0570c7fdef 🐛 Fix positioning of dropdown for assets/types 2024-01-18 11:09:12 +01:00
Aitor 1de0014de3 🐛 Fix code block collapsed truncates dropdown 2024-01-18 11:00:46 +01:00
Belén Albeza 4b79424903 🐛 Fix dropdown colors in the right sidebar for typography / recent 2024-01-18 10:55:06 +01:00
EvaandBelén Albeza 5cfc135791 🐛 Fix typography dropdown menus being clipped out in the left sidebar
Co-authored-by: Belén Albeza <belen@hey.com>
2024-01-18 10:55:06 +01:00
Aitor 658d09ccf8 🐛 Main menu popups are not closed automatically 2024-01-17 13:18:32 +01:00
Aitor da5847cc4d 🐛 Update module disappears without applying the changes 2024-01-17 13:12:16 +01:00
Aitor 15deeacb5e 🐛 Color name overflows when it is too large 2024-01-17 12:39:54 +01:00
Aitor f7f077adb3 Change cap stroke icons 2024-01-17 12:29:16 +01:00
Aitor d09cab49aa 🐛 Asset color long names should show ellipsis 2024-01-17 12:13:54 +01:00
Aitor 6009f6846a 🐛 Comments over toolbar 2024-01-17 12:13:54 +01:00
Aitor b2bbe12a11 Add tooltipo on colors 2024-01-17 12:13:54 +01:00
Aitor 70ff72a03a 🐛 Fix code block in view mode shows scroll 2024-01-17 12:13:54 +01:00
Aitor cf569baabd 🐛 Fix colorpicker outside viewport 2024-01-17 12:13:54 +01:00
alonso.torres a84b23168d 🐛 Fix problem with path editor undoing changes 2024-01-17 12:03:51 +01:00
alonso.torres 72e29e58d2 🐛 Fix problem with non-clip shapes and zoom 2024-01-17 12:03:51 +01:00
alonso.torres 792145353e 🐛 Fix calculate layout with hidden shapes 2024-01-17 12:03:51 +01:00
alonso.torres c249bd6f22 🐛 Fix problem with deleting component insances 2024-01-17 12:03:51 +01:00
alonso.torres 744c60cdef 🐛 Fix problem when moving svgs 2024-01-17 12:03:51 +01:00
alonso.torres 6c4d757ecb 🐛 Fix problem with not applying colors to boards 2024-01-17 12:03:51 +01:00
alonso.torres 339cdbec2d 🐛 Fix line cap select 2024-01-17 12:03:51 +01:00
Aitor eeabeadc39 🐛 Wrong component background color 2024-01-17 10:19:30 +01:00
Aitor d30707a02c 🐛 Bad request error after reloading invitations page 2024-01-17 10:19:30 +01:00
Aitor 8f867c03de 🐛 Card menu is hard to launch after search 2024-01-17 10:19:30 +01:00
Andrey Antukh a5d056f254 Merge remote-tracking branch 'origin/staging' into develop 2024-01-17 09:51:47 +01:00
Pablo Alba 45072c19a2 🐛 Fix on cut and paste a component, a bad frame-id is set 2024-01-17 09:27:16 +01:00
Eva 0370e8083a 🐛 Fix description title on feedback 2024-01-16 17:59:03 +01:00
Eva 827609db79 🐛 Fix go to library button 2024-01-16 17:59:03 +01:00
Eva 01ad26c084 🐛 Fix component title text 2024-01-16 17:59:03 +01:00
Eva 0a8bbe0b77 🐛 Fix disabled color on path toolbar and alignment buttons 2024-01-16 17:59:03 +01:00
Eva a51925565a 🐛 Fix uppercase text on text palette 2024-01-16 17:59:03 +01:00
Andrés Moya ea71bfe6d6 🐛 Fix some possible validation error on migration 2024-01-16 17:20:04 +01:00
Andrés Moya 2664a846e9 🐛 Advance shape-refs of subinstances when detaching a copy 2024-01-16 17:20:04 +01:00
Andrés Moya a3241d1442 🔧 Improve debug dump-tree 2024-01-16 17:20:04 +01:00
Andrey Antukh d4d3f9ca81 🎉 Add the ability to export import entire team
For now only available as srepl helper
2024-01-16 17:17:30 +01:00
Andrey Antukh 46070c2987 💄 Use new spread-props helper on submit-button* component 2024-01-16 09:35:49 +01:00
Andrey Antukh 04540c4b0f ⬆️ Update rumext (fix issues) 2024-01-16 09:35:49 +01:00
Andrey Antukh aa33bb1ebf Merge remote-tracking branch 'origin/staging' into develop 2024-01-16 00:12:55 +01:00
Aitor Moreno 03931da17a Merge pull request #3989 from penpot/niwinz-staging-bugfix-1
🐛 Bugfixes
2024-01-15 16:03:23 +01:00
Andrés Moya 8b18115b54 🐛 Fix validation error when instantiating a component inside a main 2024-01-15 15:47:52 +01:00
Aitor Moreno 0688f6a4a3 Merge pull request #4011 from penpot/alotor-bugfixes-7
Alotor bugfixes 7
2024-01-15 15:39:35 +01:00
alonso.torres 2fee0254b7 🐛 Fix problem with onboarding form 2024-01-15 15:11:36 +01:00
alonso.torres e8b4389a1a 🐛 Fix problem with bool to path on svg shapes 2024-01-15 14:25:43 +01:00
alonso.torres aa7e70141c 🐛 Fix problem with snap to distances 2024-01-15 14:25:43 +01:00
alonso.torres 03f0724dfd 🐛 Fix problem with align self 2024-01-15 14:25:43 +01:00
alonso.torres 5b26e686f3 🐛 Fix gradient handlers for flipped shapes 2024-01-15 14:25:43 +01:00
alonso.torres c4ce83bb07 🐛 Fix keep index for swap components 2024-01-15 14:25:43 +01:00
alonso.torres c0a2550485 🐛 Fix enter key on team modal 2024-01-15 14:25:43 +01:00
alonso.torres 9898ad1991 🐛 Fix layout button remove showing always 2024-01-15 14:25:43 +01:00
alonso.torres f47b5a18c7 🐛 Fix problem in viewer with big screens 2024-01-15 14:25:43 +01:00
Andrés Moya 68a1882a65 🐛 Fix validation error when moving a nested inside a main 2024-01-15 14:05:27 +01:00
Eva 4178be3acf 🐛 Fix login page errors 2024-01-15 11:15:18 +01:00
Eva 706f91db39 🐛 Fix export components typos 2024-01-15 11:15:18 +01:00
Eva 3a859f2347 🐛 Fix typo on UI 2024-01-15 11:15:18 +01:00
Eva 89974f4c95 🐛 Fix scroll on history tab 2024-01-15 11:15:18 +01:00
Eva 1761a16d31 🐛 Fix export dropdown on inspect 2024-01-15 10:35:30 +01:00
Eva 6ecf0f4ca4 🐛 Fix copy button cropped 2024-01-15 10:35:30 +01:00
Eva af6e808337 🐛 Fix shared modal when link is created and add text color 2024-01-15 10:35:30 +01:00
Eva aeff50ba9f 🐛 Fix hero image space when the screen is small 2024-01-15 10:35:30 +01:00
Eva 41bccc7213 🐛 Fix icon of focus mode 2024-01-15 10:35:30 +01:00
Eva 0b2ad569a1 🐛 Fix library icons on dashboard 2024-01-15 10:35:30 +01:00
Eva 4f05389a51 🐛 Fix some text without setted color 2024-01-15 10:35:30 +01:00
Andrey Antukh 8a81bc11e0 Merge remote-tracking branch 'origin/staging' into develop 2024-01-15 10:10:35 +01:00
alonso.torres 19e40175be 🐛 Disable import to v1 from v2 2024-01-15 10:10:13 +01:00
alonso.torres 28981e5d46 🐛 Fix import of zip files from v2 to v2 2024-01-15 10:10:13 +01:00
alonso.torres 9ea440b6f7 🐛 Fix import from components v1 to v2 2024-01-15 10:10:13 +01:00
Geek Squirrel e044ff3d55 🌐 Add translations for: Chinese (Simplified).
Currently translated at 99.1% (1332 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2024-01-13 00:06:21 +01:00
Eva 7f4bc246c6 🐛 Fix checkbox of the file export modal 2024-01-11 17:15:43 +01:00
Eva cdc8c270dc 🐛 Fix share modal when the file has 1 file only 2024-01-11 17:15:43 +01:00
Eva 6de70ff5b7 🐛 Fix checkbox colors 2024-01-11 17:15:43 +01:00
Eva b7bfb73134 🐛 Fix spacing in prototype tab 2024-01-11 17:15:43 +01:00
Eva Marco e8da60b2e7 Merge pull request #4004 from penpot/ladybenko-6566-fix-assets-list
🐛 Fix asset list UI
2024-01-11 16:34:54 +01:00
Pablo Alba d204ae86f2 🐛 Fix swap styles for groups names too long 2024-01-11 16:32:24 +01:00
Belén Albeza 30a53252f8 🐛 Fix asset list UI 2024-01-11 16:20:53 +01:00
Andrey Antukh f0ea613d47 Merge remote-tracking branch 'origin/staging' into develop 2024-01-11 16:18:17 +01:00
Eva Marco 0d1aed96c8 Merge pull request #4006 from penpot/niwinz-staging-bugfix-5
🐛 Fix issues with forms
2024-01-11 16:07:35 +01:00
alonso.torres 6ef85ef0e8 🐛 Fix problems with data-value keyword 2024-01-11 15:56:31 +01:00
Andrey Antukh 9ed6d5f360 🐛 Use correct jsx handler on team choice form 2024-01-11 15:34:23 +01:00
Andrey Antukh 4d54768875 Add special cases for runtime map to props conversion 2024-01-11 15:23:58 +01:00
Andrey Antukh 9149772ce9 🐛 Add missing mf/deps on form component 2024-01-11 15:23:42 +01:00
Andrey Antukh 6e39c26704 Improve implementation of submit-button* component 2024-01-11 15:23:13 +01:00
Andrey Antukh 6c2f9b7bd3 🐛 Do not forward invalid prop to dom node on form input component 2024-01-11 15:22:42 +01:00
Eva Marco 189d0c107c Merge pull request #4002 from penpot/niwinz-staging-gulp-cache
🐛 Fix gulp cache issue on recompiling transitive scss dependencies
2024-01-11 13:55:02 +01:00
Andrey Antukh ba864eaa4d 🐛 Fix gulp cache issue on recompiling transitive scss dependencies 2024-01-11 13:02:07 +01:00
Stas Haas 764774ee49 🌐 Add translations for: German.
Currently translated at 99.7% (1340 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2024-01-11 11:06:16 +00:00
Eva Marco 65f7c9cbbf Merge pull request #3997 from penpot/ladybenko-6490-fix-component-hover-ui
🐛 Fix assets UI
2024-01-11 10:24:36 +01:00
Andrey Antukh 725501faf9 Merge remote-tracking branch 'origin/staging' into develop 2024-01-11 10:17:52 +01:00
Belén Albeza aed5388bfd 🐛 Fix radio button component 2024-01-11 09:53:22 +01:00
Belén Albeza 34f1f3d103 🐛 Fix hover on assets thumbnails + broken editable label 2024-01-11 09:53:22 +01:00
alonso.torres 21bd59defd 🐛 Fix problems uploading graphics in components v1 2024-01-10 14:43:36 +01:00
alonso.torres 67b3040327 🐛 Fix problem with text content and multiple selection 2024-01-10 14:43:36 +01:00
Eva Marco 08d7f5d8a3 Merge pull request #3996 from penpot/niwinz-staging-bugfix-4
🐛 Bugfixes related to rumext update
2024-01-10 14:42:43 +01:00
Andrey Antukh b63a8d34b5 🐛 Fix debug reset file version method 2024-01-10 14:36:30 +01:00
Andrey Antukh 3d66a4b7be 💄 Split large lines on onboarding questions compomponent 2024-01-10 14:29:39 +01:00
Andrey Antukh e856387292 📎 Add better key formatting on radio-buttons react component 2024-01-10 14:28:23 +01:00
Andrey Antukh 5ec1272d68 🐛 Update rumext that fixes issue with :htmlFor prop 2024-01-10 14:28:23 +01:00
Andrey Antukh d8aba5f645 ⬆️ Update versions on devenv Dockerfile 2024-01-10 14:00:31 +01:00
Andrey Antukh fede8c9975 Setup better media max file-size on devenv 2024-01-10 14:00:31 +01:00
Andrey Antukh 77564531eb 🐛 Fix incorrect features setup on persist-temp-file rpc method 2024-01-10 13:50:30 +01:00
Andrey Antukh 470cf08134 Merge remote-tracking branch 'origin/staging' into develop 2024-01-10 11:43:01 +01:00
Aitor Moreno 194d3251a4 Merge pull request #3980 from penpot/niwinz-staging-upgrade-deps
 Add performance enhancements
2024-01-10 11:22:22 +01:00
Eva Marco 4a991ef3f9 Merge pull request #3988 from penpot/ladybenko-fix-your-account-ui
🐛 Fix "Your Account/Give Feedback" UI
2024-01-10 10:20:22 +01:00
Andrey Antukh a179f73deb Add minor performance improvements to asset-section react component 2024-01-09 23:11:42 +01:00
Andrey Antukh eeaee5ad42 Add minor optimizations to tab-container react component 2024-01-09 23:11:42 +01:00
Andrey Antukh e0a1cd6e77 📎 Move import parser from util to worker directory 2024-01-09 23:11:42 +01:00
Andrey Antukh b6c257bfc5 🐛 Fix incorrect svg-attrs handlng on .zip import process 2024-01-09 23:11:42 +01:00
Andrey Antukh 77472aabea Add path parser js impl more resilent to parse errors 2024-01-09 23:11:42 +01:00
Andrey Antukh 36b5ca7313 Add performance improvements to start-resize 2024-01-09 23:11:42 +01:00
Andrey Antukh 1465ed3607 Improve performance on selection react component
Mainly do more static calls and reduce unnecesary allocation
2024-01-09 23:11:42 +01:00
Andrey Antukh 0ea07469d2 💄 Add minor cosmetic fixes to link react component 2024-01-09 23:11:42 +01:00
Andrey Antukh 870e4f96b2 ⬆️ Update dependencies 2024-01-09 23:11:42 +01:00
Andrey Antukh 5502f317ad 🐛 Fix unexpected exception on incorrect thumbnail gen of root shape 2024-01-09 23:11:09 +01:00
alonso.torres 9e40b4551d 🐛 Fix problem with swap component 2024-01-09 22:31:33 +01:00
Andrey Antukh 04f3d99def 🐛 Fix type inconsistency on gradient type
Normalize to keyword and add migration for ensure that
all shapes uses the correct type
2024-01-09 18:50:50 +01:00
Andrés Moya b7b7b9d580 🐛 Touch modified file when ignore sync, to avoid ETAG caching 2024-01-09 18:28:32 +01:00
Andrés Moya 4d6c0f3da9 🐛 Fix debug validate single shape 2024-01-09 18:28:32 +01:00
Andrés Moya 9d8628b4cc 🐛 Fix groups without :shapes when converting to frames in migration 2024-01-09 18:28:32 +01:00
Eva df99ca55f8 🐛 Fix spacing in prototype tab empty state 2024-01-09 18:25:58 +01:00
Eva a8a784bea4 🐛 Fix icons preview page 2024-01-09 18:25:58 +01:00
Eva 5cb8ce3319 🐛 Fix loader position while verifying token 2024-01-09 18:25:58 +01:00
Eva 443d157dbe 🐛 Fix notification modal styles 2024-01-09 18:25:58 +01:00
alonso.torres 9c35652043 🐛 Fix problem with font loading 2024-01-09 17:54:44 +01:00
alonso.torres a4796e8db8 🐛 Fix swap component breaks grid layout 2024-01-09 17:54:44 +01:00
alonso.torres 5c3ea37bbe 🐛 Fix problem with create board on cells 2024-01-09 17:54:44 +01:00
Andrey Antukh 8919a7067e 🐛 Fix incorrect thumbnail queries on file related rpc methods 2024-01-09 15:00:23 +01:00
Belén Albeza fa99d9aaed 🐛 Fix buttons appearance in the feedback form 2024-01-09 14:24:02 +01:00
Belén Albeza 5c2bdfcefe 🐛 Fix icon color for Give Feedback in Your Account sidebar 2024-01-09 13:42:16 +01:00
Aitor Moreno c7ed642f6a Merge pull request #3946 from penpot/VasilevsVV-penpot/vt/issue-3232-hide-bb-when-editing
 Add set of events for hiding and revealing bounding box for selected shape while transforming
2024-01-09 12:36:08 +01:00
Tsiura Vasyl 97d6214ff4 Add set of events for hiding and revealing bounding box for selected shape
Signed-off-by: Tsiura Vasyl <morfey.rulit@gmail.com>
2024-01-09 12:26:05 +01:00
Eva Marco 419776bf5e Merge pull request #3985 from penpot/niwinz-staging-lipstick-title-bar
💄 Make title-bar component usable externally
2024-01-09 10:08:06 +01:00
Andrey Antukh e48bfb5d94 Merge remote-tracking branch 'origin/staging' into develop 2024-01-09 09:56:55 +01:00
alonso.torres d4f177ffdd 💄 Format code 2024-01-09 09:55:51 +01:00
Aitor 25bd70c86f 🐛 Fix viewer fullscreen not working properly 2024-01-09 09:55:51 +01:00
Aitor b47cea7ead 🐛 Fix generating unnecessary thumbnails 2024-01-09 09:55:51 +01:00
Aitor a76e5940af 🐛 Fix imposters loading rect 2024-01-09 09:55:51 +01:00
Eva Marco a6662f2774 Merge pull request #3978 from penpot/hiru-fix-annotation-focus
Fix annotation textarea steals focus and prevents deleting a component with keyboard
2024-01-09 09:45:56 +01:00
Andrey Antukh 1822103936 💄 Make the title-bar component usable externally
By removing the usage of `?` character on prop names
2024-01-09 09:44:42 +01:00
Eva e866e99804 🐛 Fix component annotation in new UI 2024-01-09 08:55:51 +01:00
Eva 947cc0ce92 🐛 Fix view only alignment 2024-01-09 08:55:51 +01:00
Eva 4bb93d9c7e 🐛 Fix font button height and fonts dropdown 2024-01-09 08:55:51 +01:00
Andrey Antukh 326f18cb66 Merge remote-tracking branch 'origin/staging' into develop 2024-01-09 08:53:46 +01:00
Eva Marco 5a012d4e33 Merge pull request #3983 from penpot/alotor-bugfixes-4
Alotor bugfixes 4
2024-01-08 18:50:12 +01:00
alonso.torres 2705876c56 🐛 Fix problems with drag/drop in layers 2024-01-08 18:10:18 +01:00
Eva Marco 2290503d4a Merge pull request #3982 from penpot/ladybenko-layer-icon-svg
🐛 Fix wrong icon for SVG
2024-01-08 17:11:01 +01:00
Belén Albeza 0c13764c63 🐛 Fix wrong icon for SVG 2024-01-08 16:43:06 +01:00
alonso.torres 9007371ab5 🐛 Fix visual problems on inspect panel 2024-01-08 15:51:28 +01:00
Andrey Antukh 5983b9cd54 Merge remote-tracking branch 'origin/staging' into develop 2024-01-08 15:27:27 +01:00
alonso.torres 5ea414aed6 🐛 Fix problem with alt-duplicate on root frames 2024-01-08 15:20:26 +01:00
alonso.torres c43458af1d 🐛 Fix problems with z-index 2024-01-08 15:20:26 +01:00
Andrés Moya 790ce27316 🐛 Enable preprocess always when migrating files 2024-01-08 13:23:30 +01:00
Belén Albeza 3c114bd9ef Merge pull request #3977 from penpot/palba-fix-swap-on-deleted-main
🐛 Fix opening the swap panel on a copy of a deleted component fails
2024-01-08 11:16:23 +01:00
Andrés Moya 8085e93a07 🐛 Solve annotation stealing focus when not editing 2024-01-08 11:10:17 +01:00
Pablo Alba af2e4ca00f 🐛 Fix opening the swap panel on a copy of a deleted component fails 2024-01-08 11:05:37 +01:00
Andrey Antukh 0ab56b38b9 📎 Add fmt checker to the CI 2024-01-08 09:32:50 +01:00
Andrey Antukh 833871df65 💄 Format frontend code 2024-01-08 09:32:50 +01:00
Andrey Antukh b6ecc8b1be 💄 Format common code 2024-01-08 09:32:50 +01:00
Andrey Antukh 0b29aaecc4 💄 Format backend code 2024-01-08 09:32:50 +01:00
Edgars Andersons 7d2c8aa1c3 🌐 Add translations for: Latvian.
Currently translated at 100.0% (1344 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2024-01-06 22:06:20 +00:00
Andrey Antukh cfe7ba34f7 🐛 Fix validation of validation error on file validate ns 2024-01-05 18:29:16 +01:00
Andrey Antukh c53e476ba2 Make the dm/get-prop work also with non static fields 2024-01-05 17:59:39 +01:00
Andrey Antukh 260879791b 💄 Add minor cosmetic changes to custom-stroke react component 2024-01-05 17:59:39 +01:00
Andrey Antukh 8b57dcf015 Optimize dasharray generation 2024-01-05 17:59:39 +01:00
Andrey Antukh 2698944ec7 Add proper file iteration on srepl helpers 2024-01-05 17:59:39 +01:00
Alejandro Alonso a6e802ba2a Refactor style props 2024-01-05 17:59:39 +01:00
Andrey Antukh 864881721f 🐛 Fix validation of validation error on file validate ns 2024-01-05 17:59:17 +01:00
alonso.torres a2fff7e74a 🐛 Fix problem when creating flex layout 2024-01-05 16:38:34 +01:00
alonso.torres cf3c3cf989 🐛 Fix problem with auto in grid and min sizes 2024-01-05 16:38:34 +01:00
alonso.torres d0244e0bef 🐛 Fix problem with masks 2024-01-05 16:38:34 +01:00
alonso.torres 1f712c82bf 🐛 Fix problem with icons in select 2024-01-05 16:38:34 +01:00
alonso.torres 3702c054a8 🐛 Fix problem with z-index 2024-01-05 15:32:26 +01:00
alonso.torres 77b886aa1a 🐛 Restored z-index input 2024-01-05 15:32:14 +01:00
alonso.torres 62ffe67838 🐛 Fix problem with disabled buttons visibility 2024-01-05 15:31:55 +01:00
Eva c14fe661df ♻️ remove new css from other elements 2024-01-05 14:23:14 +01:00
Eva 480251c41c ♻️ Remove new-css-system from viewer 2024-01-05 14:23:14 +01:00
Eva Marco 1433ec5dad Merge pull request #3971 from penpot/ladybenko-swap-panel
:Bug: UI fixes for the swap panel
2024-01-05 13:45:53 +01:00
Belén Albeza e7d4fc3c4f 🐛 Fix swap panel thumbnail gallery appearance 2024-01-05 13:38:57 +01:00
Alejandro Alonso 492ce43b4a 🎉 Add ha language to the i18n subsystem 2024-01-05 11:46:19 +01:00
Andrey Antukh 9aff12f3c6 Merge remote-tracking branch 'origin/staging' into develop 2024-01-05 09:46:53 +01:00
Belén Albeza 1576e33564 🐛 Fix color of titles in the swap panel 2024-01-04 17:09:03 +01:00
Alejandro 08cd2ddf1f Merge pull request #3968 from penpot/niwinz-staging-storage-improvements-2
🐛 Fix incorrect pointer deref on validating file on update operation
2024-01-04 16:48:23 +01:00
Andrey Antukh 4899b3af6e 🐛 Fix incorrect pointer deref on validating file on update operation 2024-01-04 16:31:57 +01:00
Alejandro 65b3c62a87 Merge pull request #3959 from penpot/niwinz-staging-storage-improvements-2
 Improvements to components migration
2024-01-04 15:55:31 +01:00
Eva Marco 6982b03ad6 Merge pull request #3967 from penpot/alotor-grid-fix-auto
Fixes some issues with auto cells
2024-01-04 15:42:22 +01:00
alonso.torres 9e52cdb75e 🐛 Change behavior of auto cells 2024-01-04 15:17:12 +01:00
alonso.torres e3ed198ba1 💄 Redesign debug panel 2024-01-04 15:17:12 +01:00
Andrés Moya f49cf0b6ae 💄 Style changes on clone-object function (now clone-shape) 2024-01-04 14:40:22 +01:00
Andrés Moya 2fc6290c8f 🐛 Fix invalid frame-id when adding shape to copy 2024-01-04 14:40:22 +01:00
Andrey Antukh 41287d8fc5 Improve migration script performance and api usability 2024-01-04 14:40:22 +01:00
Andrey Antukh 471fd78174 Spawn vthread on s3 internal io completion
Instead of using platform threads
2024-01-04 12:41:16 +01:00
Andrey Antukh 746d898245 Improve the db api efficiency
Mainly setup proper defaults and reduce unnecesary allocations
on every db api call.
2024-01-04 12:41:16 +01:00
Alejandro Alonso 93bf8c1478 🐛 Fix colors with image fill name 2024-01-04 12:01:46 +01:00
Alejandro Alonso 9cfc00ce97 🐛 Fix remap colors on binary import 2024-01-04 11:59:00 +01:00
Belén Albeza 73b8f3fb17 Load debug CSS in local dev only 2024-01-04 10:47:20 +01:00
Alejandro c77af2000c Merge pull request #3957 from penpot/eva-remove-new-css-phase-3
♻️ Remove new-css-system phase 3
2024-01-04 10:37:35 +01:00
Eva af99bf05e2 ♻️ Remove new-css-system from dashboard 2024-01-04 10:27:54 +01:00
Eva 3f151f16ce ♻️ Remove new-css-system from modals 2024-01-04 10:27:54 +01:00
Eva 7a3525febc ♻️ Remove new-css-system from right sidebar elements 2024-01-04 10:27:54 +01:00
Belén Albeza b3684990f1 🐛 Fix sizes of dropdowns in the export section 2024-01-04 10:19:17 +01:00
Belén Albeza 824e7d76ae 🐛 Fix blur icon changing size on hover 2024-01-04 10:19:17 +01:00
Aitor 5ad31a878b 🐛 Fix rasterizer not loading embedded styles 2024-01-04 10:09:37 +01:00
Alejandro Alonso 79c2a6c5d5 🐛 Fix round for both ends of path 2024-01-04 10:07:42 +01:00
Alejandro 7fc77f279b Merge pull request #3963 from penpot/alotor-fix-empty-thumbnails
🐛 Fix problem with thumbnails for empty pages
2024-01-04 09:55:03 +01:00
alonso.torres 3aadf00a6f 🐛 Fix problem with thumbnails for empty pages 2024-01-04 09:52:09 +01:00
Aitor 9474700d09 🐛 Fix color picker not rendering Latin1 svgs 2024-01-03 17:50:46 +01:00
Aitor Moreno 95868416ef Merge pull request #3961 from penpot/alotor-bugfix
Bugfixes
2024-01-03 17:20:27 +01:00
alonso.torres 009556b8f7 Improve grid cell selection 2024-01-03 16:50:44 +01:00
alonso.torres 6068ddc0ff Add delete with content option 2024-01-03 16:50:44 +01:00
alonso.torres 3ae1a97bc9 🐛 Fix problem when duplicating/moving tracks 2024-01-03 14:40:58 +01:00
Alejandro 5159438e5d Merge pull request #3950 from penpot/niwinz-staging-storage-improvements
 Add safety checks on object deletion
2024-01-03 11:46:09 +01:00
Andrey Antukh addb392ecc Add safety mechanism for direct object deletion
The main objective is prevent deletion of objects that can leave
unreachable orphan objects which we are unable to correctly track.

Additionally, this commit includes:

1. Properly implement safe cascade deletion of all participating
   tables on soft deletion in the objects-gc task;

2. Make the file thumbnail related tables also participate in the
   touch/refcount mechanism applyign to the same safety checks;

3. Add helper for db query lazy iteration using PostgreSQL support
   for server side cursors;

4. Fix efficiency issues on gc related task using server side
   cursors instead of custom chunked iteration for processing data.

   The problem resided when a large chunk of rows that has identical
   value on the deleted_at column and the chunk size is small (the
   default); when the custom chunked iteration only reads a first N
   items and skip the rest of the set to the next run.

   This has caused many objects to remain pending to be eliminated,
   taking up space for longer than expected. The server side cursor
   based iteration does not has this problem and iterates correctly
   over all objects.

5. Fix refcount issues on font variant deletion RPC methods
2024-01-03 10:56:57 +01:00
Andrey Antukh e6fb96c4c2 📎 Update .gitignore file 2024-01-03 09:40:53 +01:00
Eva 7da949610d ♻️ Remove new-css-system from interaction tab 2024-01-03 09:36:45 +01:00
Eva 452289b726 ♻️ Remove new-css-system from colorpicker 2024-01-03 09:36:45 +01:00
Eva 67c692fdbd ♻️ Remove new-css-system from design tab 2024-01-03 09:36:45 +01:00
Eva 0a123a3917 ♻️ Remove refer css from files 2024-01-03 09:36:45 +01:00
Eva dc4bf82684 ♻️ Remove new-css-system on assets tab 2024-01-03 09:36:45 +01:00
alonso.torres c9200f235e ♻️ Changes to update-shape parameters 2024-01-02 18:09:55 +01:00
alonso.torres 48e283812e 🐛 Fix some styles 2024-01-02 18:09:55 +01:00
alonso.torres 40d4a917e1 Context menu for cells 2024-01-02 18:09:55 +01:00
alonso.torres 9ed3ad2f3c Right click options on grid editor 2024-01-02 18:09:55 +01:00
alonso.torres da358d635b Reorder tracks from grid editor 2024-01-02 18:09:55 +01:00
alonso.torres 7508627dc5 Change defaults for new grid tracks 2024-01-02 18:09:55 +01:00
Andrey Antukh 56ab2aa4ca Merge branch 'staging' into develop 2024-01-02 17:18:07 +01:00
Andrey Antukh 07ce435a91 Merge remote-tracking branch 'weblate/develop' into translations 2024-01-02 17:17:22 +01:00
Alejandro Alonso 802ccf1d2c 🌐 Add translations for: Hausa.
Currently translated at 97.3% (1309 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ha/
2024-01-02 17:16:49 +01:00
Alejandro Alonso 0872058631 🌐 Add translations for: Arabic.
Currently translated at 84.3% (1133 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ar/
2024-01-02 17:16:31 +01:00
Andrey Antukh 8421a0fdc6 📎 Increase version on version.txt file 2024-01-02 17:15:24 +01:00
Alejandro de48ec4cbf Merge pull request #3953 from penpot/niwinz-staging-duplicate-team
 Add internal helper for team duplication
2024-01-02 12:20:39 +01:00
Andrey Antukh 0ebf9564b2 Add internal helper for team duplication 2024-01-02 12:01:07 +01:00
Alejandro Alonso 8e3a73d0bd 🐛 Respect group name when adding layout 2024-01-02 11:57:23 +01:00
Alejandro Alonso 2adb55c67d 🌐 Added translation for: Hausa. 2024-01-02 10:25:00 +01:00
Stephan Paternotte ae67137e0e 🌐 Add translations for: Dutch.
Currently translated at 100.0% (1344 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2023-12-29 22:08:58 +01:00
TheScientistPT 4dbe5c504f 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 100.0% (1344 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2023-12-29 22:08:57 +01:00
Andrey Antukh f5b4ea975e 🐛 Add missing configuration to shadow-cljs.edn file for release build 2023-12-29 17:22:30 +01:00
Andrey Antukh 04dbe5f741 🐛 Fix exception on manifest reading on release build 2023-12-29 17:22:04 +01:00
Andrey Antukh 22b326e2b9 🐛 Fix issue with release build introduced on beicon2 upgrade 2023-12-29 16:13:21 +01:00
Eva 74aaa710bf 🐛 Fix some text and background colors 2023-12-29 15:32:05 +01:00
Eva 7d2da6ef80 ♻️ Remove new-css-system from workspace toolbar 2023-12-29 15:32:05 +01:00
Eva 93a7a8e856 ♻️ Remove new-css-system from workspace palettes 2023-12-29 15:32:05 +01:00
Eva 412343f3de ♻️ Remove new-css-system from workspace header 2023-12-29 15:32:05 +01:00
Eva c707539f6f ♻️ Remove new-css-system from layers 2023-12-29 15:32:05 +01:00
Eva 831f79d651 ♻️ Remove new-css-system from sitemap 2023-12-29 15:32:05 +01:00
alonso.torres c439de49a5 ♻️ Changed gulpfile to modules 2023-12-28 12:14:06 +01:00
Andrey Antukh 3da98cbd1e 🔥 Remove unnecesary import 2023-12-28 12:14:06 +01:00
Andrey Antukh 9cba125abe Modularize js-beautify library related code 2023-12-28 12:14:06 +01:00
Andrey Antukh 1318a5c3c8 Move toggle-theme to data.users ns. 2023-12-28 12:14:06 +01:00
Andrey Antukh caadc43d35 🎉 Add lazy-loading for penpot top-level page components 2023-12-28 12:14:06 +01:00
Andrey Antukh 37a7bb202b Add lazy loading for highlightjs on code-block component
Mainly because highlight.js is a heavy library but only used
on a very concrete situations, so it does not make sense to load
it all the time.
2023-12-28 12:14:06 +01:00
Andrey Antukh 538b8313ed Add more config to condo 2023-12-28 12:14:06 +01:00
Andrey Antukh 4d54d5c455 Extend GCL Deferred to work with promesa abstractions 2023-12-28 12:14:06 +01:00
Andrey Antukh 0b53dc627f Add minor improvements on frontend and exporter builds 2023-12-28 12:14:06 +01:00
Andrey Antukh bc91c46a9a Improve performance and space efficiency of cursors namespace 2023-12-28 12:14:06 +01:00
Andrey Antukh 127b02922f Add initial vitest test file template 2023-12-28 12:14:06 +01:00
Andrey Antukh 9c969f8b26 Improve code organization for better integration with storybook 2023-12-28 12:14:06 +01:00
Alejandro 5621c2c394 Merge pull request #3942 from penpot/niwinz-staging-svg-parse-fill-fix
🐛 Fix several issues on svg path parsing
2023-12-28 10:41:52 +01:00
Alejandro a506be2897 Merge pull request #3940 from penpot/eva-bugfixing-ui-1
💄 Fix some frontend bugs
2023-12-28 10:37:07 +01:00
Andrey Antukh 74447442b8 Add several improvements to svg path parser tests
And properly reorganize legacy implementations
2023-12-28 10:30:56 +01:00
Andrey Antukh 62b1dc2a4b 🐛 Fix incorrect arc to curve conversion in some cases 2023-12-28 10:30:56 +01:00
Andrey Antukh 88779dd50b 📎 Fix naming of fills react component 2023-12-28 10:30:56 +01:00
Andrey Antukh ae4f14ece2 Reduce allocation on custom-shape-strokes react component 2023-12-28 10:30:56 +01:00
Andrey Antukh ad185c4215 🐛 Assign correct fill to match standard svg behavior when no fils found
On parsing svg
2023-12-28 10:30:56 +01:00
Eva 1a1e9b4ecd 💄 Fix some frontend bugs 2023-12-28 09:49:47 +01:00
Andrey Antukh 63b264b494 🐛 Fix incorrect last command tracing on svg path parser 2023-12-27 15:38:14 +01:00
Andrey Antukh fca33f8451 📎 Fix incorrect version 2023-12-27 12:15:02 +01:00
Hosted Weblate d7fded19aa Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/
2023-12-27 12:00:17 +01:00
Hosted Weblate 7f47131499 Merge branch 'origin/develop' into Weblate. 2023-12-27 12:00:13 +01:00
Andrey Antukh 85829e53af Merge branch 'staging' into develop 2023-12-27 11:59:31 +01:00
Andrey Antukh 16b37230cc Merge branch 'translations' into staging 2023-12-27 11:59:15 +01:00
Stephan Paternotte c2f48e4075 🌐 Add translations for: Dutch.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2023-12-27 11:58:25 +01:00
Stephan Paternotte 6e5d5cfc50 🌐 Add translations for: Dutch.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2023-12-27 11:58:25 +01:00
Stephan Paternotte 32439a52db 🌐 Add translations for: Dutch.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2023-12-27 11:58:24 +01:00
Stas Haas ce8c17e589 🌐 Add translations for: German.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-12-27 11:58:24 +01:00
Stas Haas 407e7186a4 🌐 Add translations for: German.
Currently translated at 99.6% (1316 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-12-27 11:58:24 +01:00
Swapnil C a589d79043 🌐 Add translations for: French.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-12-27 11:58:24 +01:00
Aimee 5ce362df8e 🌐 Add translations for: French.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-12-27 11:58:24 +01:00
Locness 2120b40abe 🌐 Add translations for: French.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-12-27 11:58:24 +01:00
Louis Chance 705a1c8b10 🌐 Add translations for: French.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-12-27 11:58:24 +01:00
Oğuz Ersen a9cafdfc9d 🌐 Add translations for: Turkish.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2023-12-27 11:58:24 +01:00
Luigi 0cb80febf0 🌐 Add translations for: French.
Currently translated at 88.2% (1165 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-12-27 11:58:24 +01:00
Luigi 804fe018ef 🌐 Add translations for: French.
Currently translated at 87.8% (1159 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-12-27 11:58:24 +01:00
Yaron Shahrabani 026c32fe00 🌐 Add translations for: Hebrew.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2023-12-27 11:58:24 +01:00
Hugo Vermaak 96d9786f83 🌐 Add translations for: Afrikaans.
Currently translated at 7.6% (101 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/af/
2023-12-27 11:58:24 +01:00
Madalena Melo 9a5c220c87 🌐 Added translation for: Afrikaans. 2023-12-27 11:58:24 +01:00
TheScientistPT 4a2fb6facd 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2023-12-27 11:58:24 +01:00
AlexTECPlayz eb575e9daf 🌐 Add translations for: Romanian.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2023-12-27 11:58:24 +01:00
AlexTECPlayz a7fc53f325 🌐 Add translations for: Romanian.
Currently translated at 99.3% (1311 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2023-12-27 11:58:24 +01:00
TheScientistPT 24bb49d0bf 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2023-12-27 11:58:24 +01:00
Yaron Shahrabani 67d3a7f9c5 🌐 Add translations for: Hebrew.
Currently translated at 98.3% (1298 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2023-12-27 11:58:24 +01:00
Linerly 1efc40b6c4 🌐 Add translations for: Indonesian.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2023-12-27 11:58:24 +01:00
Stas Haas 304f6ea96e 🌐 Add translations for: German.
Currently translated at 99.3% (1312 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-12-27 11:58:24 +01:00
Merih Güz 2509ab3a5d 🌐 Add translations for: Turkish.
Currently translated at 98.4% (1299 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2023-12-27 11:58:24 +01:00
Stephan Paternotte 163ce9f3b7 🌐 Add translations for: Dutch.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2023-12-27 11:56:54 +01:00
Andrey Antukh 0643ba03a1 Merge branch 'staging' into develop 2023-12-27 11:55:38 +01:00
Andrey Antukh 49d719fb45 🐛 Fix incorrect stream handling on shape move
Bug introduced in the beicon2 upgrade part2 commit
2023-12-27 11:53:05 +01:00
Aitor 4fc892a856 🐛 Fix Update main component thumbnail 2023-12-26 14:51:42 +01:00
Andrey Antukh 88c7ac379b 🐛 Fix unexpected rx scheduler saturation on mouse movement burst
Fixed with custom trailing-edge throttling mechanism
2023-12-26 14:14:20 +01:00
Andrey Antukh ccf063b8ef ⬆️ Upgrade to beicon2 (part2) 2023-12-26 14:14:20 +01:00
Andrey Antukh 96f5a33f5f ⬆️ Upgrade to beicon2 (part1) 2023-12-26 14:14:20 +01:00
Andrey Antukh ecee15af5b Improve logging on websocket related code (backend) 2023-12-26 14:14:20 +01:00
Stephan Paternotte 607c3c4517 🌐 Add translations for: Dutch.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2023-12-26 14:11:56 +01:00
Alejandro 7648836725 Merge pull request #3931 from penpot/alotor-fix-layout
🐛 Fix problem with absolutes inside grid
2023-12-26 11:41:44 +01:00
Stephan Paternotte 6b12645bfb 🌐 Add translations for: Dutch.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2023-12-22 16:12:30 +00:00
Andrés Moya 92934c6cdd 🔧 Add data-test to ease selection in e2e tests 2023-12-18 18:17:27 +01:00
alonso.torres 52c849ce4b 🐛 Fix problem with absolutes inside grid 2023-12-15 22:18:23 +01:00
Eva f8dd86da34 💄 Add new UI to viewer area 2023-12-15 22:15:22 +01:00
Andrey Antukh 15f81e557c 🐛 Fix unexpected exception on importing some binary files 2023-12-15 17:54:26 +01:00
Andrey Antukh 60fc1a48a5 🔥 Remove obsolete entry on devenv log config 2023-12-15 17:54:26 +01:00
Eva Marco 51b3556b45 Merge pull request #3920 from penpot/ladybenko-fix-ui-modal-shared-library
🐛 fix modal text color + remove lines in shared library modal
2023-12-15 17:09:02 +01:00
Eva Marco 89c14b25ab Merge pull request #3915 from penpot/alotor-fixes-ui
Fixes new UI
2023-12-15 16:28:51 +01:00
Alejandro 051c0dce78 Merge pull request #3926 from penpot/niwinz-staging-bugfixes-2
🐛 More features related bugfixes
2023-12-15 16:16:39 +01:00
Andrey Antukh a9dd55b8d2 🐛 Fix incorrect feature detection on frontend code 2023-12-15 16:09:57 +01:00
Andrey Antukh ca50486639 Simplify feature handling on duplicate-file 2023-12-15 15:18:04 +01:00
Andrey Antukh 0ad2e8a0f2 Make retrieving fdata for thumbnail to no modify the file
This prevents that file to be considered opened just for creating
the thumbnail for it.
2023-12-15 15:18:04 +01:00
Andrey Antukh ac20451ae7 Simplify feature handling on get-file 2023-12-15 15:18:04 +01:00
Andrey Antukh 47baa21d53 🐛 Fix some edge cases on feature handling on binfile import process 2023-12-15 15:18:04 +01:00
Andrey Antukh eee28a5793 Simplify feature handling on components-v2 migration functions 2023-12-15 15:18:04 +01:00
Andrey Antukh da15924de0 🔥 Remove empty lines on ui.dashboard ns file 2023-12-15 15:18:04 +01:00
Andrey Antukh eabed4325a Integrate feature handling on file data migration
Make it less error prone
2023-12-15 15:18:04 +01:00
Andrey Antukh f01cad9ce7 🐛 Fix incorrect error reporting on clone template error 2023-12-15 15:18:04 +01:00
Andrey Antukh 78260fbc42 🐛 Fix no migration are applied on accessing to a file 2023-12-15 15:18:04 +01:00
Belén Albeza 7b36a7df8b 🐛 fix line-height and color of the message text in all modals 2023-12-15 13:15:11 +01:00
Andrey Antukh 74d985db13 Merge remote-tracking branch 'origin/staging' into develop 2023-12-14 15:04:45 +01:00
Alejandro 6b042be65c Merge pull request #3924 from penpot/niwinz-staging-bugfixes-1
🐛 Features bugfixes
2023-12-14 12:17:35 +01:00
Alejandro 86a4833c4a Merge pull request #3923 from penpot/hiru-components-bugfix-1
Some components bugfix
2023-12-14 12:15:36 +01:00
Andrey Antukh e4d86cbb39 🐛 Fix incorrect feature handling on checking file features 2023-12-14 12:09:31 +01:00
Andrey Antukh 611594a392 Add general features handling improvements 2023-12-14 10:35:24 +01:00
Andrey Antukh bdb1742d59 🐛 Fix incorrect feature checking on move project 2023-12-14 10:35:24 +01:00
Andrey Antukh ba01f314dd 🐛 Fix incorrect feature context setup on file update 2023-12-14 10:35:24 +01:00
Andrey Antukh 517c913af9 Improve feature handling on file importation process 2023-12-14 10:35:24 +01:00
Andrey Antukh 08b9178a65 🐛 Fix incorrect behavior on set-file-shared rpc method 2023-12-14 10:35:24 +01:00
Andrey Antukh b19a6321de 🐛 Fix feature validation on moving projects 2023-12-14 10:35:24 +01:00
Andrey Antukh 2dbe7bca07 Add general improvements to file validation and repair api 2023-12-14 10:35:24 +01:00
Andrés Moya fd5fd87360 🐛 Fix propagation of changes with nested components 2023-12-14 08:54:00 +01:00
Alejandro Alonso a4919e3b53 Merge remote-tracking branch 'origin/staging' into develop 2023-12-14 06:43:39 +01:00
Alejandro 419cc2e848 Merge pull request #3919 from penpot/palba-bugfixing-10
Bugfixing
2023-12-14 06:34:48 +01:00
Andrey Antukh db713c2d61 Merge remote-tracking branch 'origin/staging' into develop 2023-12-13 21:28:19 +01:00
Pablo Alba b5296613de 🐛 Validate and repair also orphan shapes 2023-12-13 17:59:55 +01:00
Belén Albeza 05614a345d 🐛 fix modal text color + remove lines in shared library modal 2023-12-13 16:32:26 +01:00
alonso.torres 4832b718da 🐛 Fix problem with menu colors 2023-12-13 16:12:41 +01:00
alonso.torres 625f99c933 🐛 Fix tutorial button style 2023-12-13 16:12:41 +01:00
alonso.torres 6ed1d223bf 🐛 Add scroll to login 2023-12-13 16:12:41 +01:00
alonso.torres 39856c8f6a 🐛 Improve inspect tab 2023-12-13 16:12:41 +01:00
alonso.torres e2446fcc62 🐛 Fix problems in inspect tab 2023-12-13 16:12:41 +01:00
alonso.torres 9834195f0e 🐛 Fix scroll so it's not hidden against palette 2023-12-13 16:12:41 +01:00
alonso.torres ffa37d26fc 🐛 Add padding to inspect help 2023-12-13 16:12:41 +01:00
alonso.torres db3d7af0b8 🐛 Hide guides parameters when hiding guides 2023-12-13 16:12:41 +01:00
alonso.torres 85c301c26b 🐛 Change order to create layout panel 2023-12-13 16:12:41 +01:00
alonso.torres 18d954faba 🐛 Fix overflow library name 2023-12-13 16:12:41 +01:00
alonso.torres 7d98833e4e 🐛 Reorder buttons for layout menu 2023-12-13 16:12:41 +01:00
alonso.torres aa3fe1cd2b 🐛 Fix problems with assets 2023-12-13 16:12:41 +01:00
alonso.torres e884cba002 🐛 Fix visual problems 2023-12-13 16:12:41 +01:00
alonso.torres 030ff398ed Improved dashboard thumbnails 2023-12-13 16:12:41 +01:00
alonso.torres 5522430afe 🐛 Fix hover style in dashboard 2023-12-13 16:12:41 +01:00
alonso.torres 6969f8be03 🐛 Fix presence widget 2023-12-13 16:12:41 +01:00
alonso.torres 9ac8e72b23 🐛 Fix strange visual in assets 2023-12-13 16:12:41 +01:00
Andrés Moya 02986f81bd 🐛 Avoid linking to remote main, when adding a shape to a copy
For example, when doing a reset overrides after a component switch
2023-12-13 15:37:15 +01:00
Pablo Alba 22f4ee82bb 🐛 Show component name in copies component panel for deleted ones 2023-12-13 13:03:14 +01:00
Alejandro Alonso 600b5ecdb7 📎 Prepare new development cycle 2023-12-13 12:49:55 +01:00
Stas Haas 527d7afb00 🌐 Add translations for: German.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-11-28 10:04:03 +01:00
Stas Haas d9fa8bbb06 🌐 Add translations for: German.
Currently translated at 99.6% (1316 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-11-23 11:04:30 +00:00
Swapnil C 780edaac3b 🌐 Add translations for: French.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-11-16 19:03:41 +01:00
Aimee 0b6633dc44 🌐 Add translations for: French.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-11-11 14:34:11 +01:00
Locness ed2461c3ec 🌐 Add translations for: French.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-11-11 14:34:11 +01:00
Louis Chance ae535b8ea1 🌐 Add translations for: French.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-11-11 14:34:11 +01:00
Oğuz Ersen 7c2fa2392f 🌐 Add translations for: Turkish.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2023-11-06 19:34:48 +01:00
Luigi 736a26a46a 🌐 Add translations for: French.
Currently translated at 88.2% (1165 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-11-06 19:34:47 +01:00
Luigi 23853345cc 🌐 Add translations for: French.
Currently translated at 87.8% (1159 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-11-05 18:33:20 +01:00
Yaron Shahrabani 69cffe43f3 🌐 Add translations for: Hebrew.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2023-10-16 06:09:42 +02:00
Hugo Vermaak 93df5354e5 🌐 Add translations for: Afrikaans.
Currently translated at 7.6% (101 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/af/
2023-10-13 20:01:12 +02:00
Madalena Melo 161e8b01a5 🌐 Added translation for: Afrikaans. 2023-10-12 11:45:43 +02:00
TheScientistPT 958b442b2e 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2023-10-11 14:01:31 +02:00
AlexTECPlayz d3404bd359 🌐 Add translations for: Romanian.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2023-10-10 10:01:12 +00:00
AlexTECPlayz b49ba9572e 🌐 Add translations for: Romanian.
Currently translated at 99.3% (1311 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2023-10-09 09:00:29 +00:00
TheScientistPT 6a397eb262 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2023-10-07 12:12:03 +00:00
Yaron Shahrabani c09ca021e9 🌐 Add translations for: Hebrew.
Currently translated at 98.3% (1298 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2023-10-07 12:12:02 +00:00
Linerly 85fbc0352c 🌐 Add translations for: Indonesian.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2023-10-07 12:12:02 +00:00
Stas Haas 271384718d 🌐 Add translations for: German.
Currently translated at 99.3% (1312 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-10-07 12:12:01 +00:00
Merih Güz ff8b6fbd8c 🌐 Add translations for: Turkish.
Currently translated at 98.4% (1299 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2023-10-07 12:12:00 +00:00
1899 changed files with 198756 additions and 117295 deletions

No files matched your search

+51 -18
View File
@@ -22,29 +22,53 @@ jobs:
# Download and cache dependencies
- restore_cache:
keys:
- v1-dependencies-{{ checksum "backend/deps.edn" }}-{{ checksum "frontend/deps.edn"}}-{{ checksum "common/deps.edn"}}
# fallback to using the latest cache if no exact match is found
- v1-dependencies-
keys:
- v1-dependencies-{{ checksum "backend/deps.edn" }}-{{ checksum "frontend/deps.edn"}}-{{ checksum "common/deps.edn"}}
# fallback to using the latest cache if no exact match is found
- v1-dependencies-
- run: cd .clj-kondo && cat config.edn
- run: cat .cljfmt.edn
- run: clj-kondo --version
# - run:
# name: "fmt check [clj]"
# command: |
# yarn run fmt:clj:check
- run:
name: "backend fmt check"
working_directory: "./backend"
command: |
yarn install
yarn run fmt:clj:check
- run:
name: common lint
name: "exporter fmt check"
working_directory: "./exporter"
command: |
yarn install
yarn run fmt:clj:check
- run:
name: "common fmt check"
working_directory: "./common"
command: |
yarn install
yarn run fmt:clj:check
- run:
name: "frontend fmt check"
working_directory: "./frontend"
command: |
yarn install
yarn run fmt:clj:check
yarn run fmt:js:check
- run:
name: "common linter check"
working_directory: "./common"
command: |
yarn install
yarn run lint:clj
- run:
name: frontend lint
name: "frontend linter check"
working_directory: "./frontend"
command: |
yarn install
@@ -52,14 +76,14 @@ jobs:
yarn run lint:clj
- run:
name: backend lint
name: "backend linter check"
working_directory: "./backend"
command: |
yarn install
yarn run lint:clj
- run:
name: exporter lint
name: "exporter linter check"
working_directory: "./exporter"
command: |
yarn install
@@ -70,7 +94,7 @@ jobs:
working_directory: "./common"
command: |
yarn test
clojure -X:dev:test :patterns '["common-tests.*-test"]'
clojure -M:dev:test
- run:
name: "frontend tests"
@@ -79,11 +103,21 @@ jobs:
yarn install
yarn test
- run:
name: "frontend integration tests"
working_directory: "./frontend"
command: |
yarn install
yarn run build:app:assets
clojure -M:dev:shadow-cljs release main
yarn playwright install --with-deps chromium
yarn e2e:test
- run:
name: "backend tests"
working_directory: "./backend"
command: |
clojure -X:dev:test :patterns '["backend-tests.*-test"]'
clojure -M:dev:test
environment:
PENPOT_TEST_DATABASE_URI: "postgresql://localhost/penpot_test"
@@ -92,7 +126,6 @@ jobs:
PENPOT_TEST_REDIS_URI: "redis://localhost/1"
- save_cache:
paths:
- ~/.m2
key: v1-dependencies-{{ checksum "backend/deps.edn" }}-{{ checksum "frontend/deps.edn"}}-{{ checksum "common/deps.edn"}}
paths:
- ~/.m2
key: v1-dependencies-{{ checksum "backend/deps.edn" }}-{{ checksum "frontend/deps.edn"}}-{{ checksum "common/deps.edn"}}
+5 -3
View File
@@ -3,9 +3,8 @@
promesa.core/->> clojure.core/->>
promesa.core/-> clojure.core/->
promesa.exec.csp/go-loop clojure.core/loop
rumext.v2/defc clojure.core/defn
rumext.v2/fnc clojure.core/fn
promesa.util/with-open clojure.core/with-open
app.common.schema.generators/let clojure.core/let
app.common.data/export clojure.core/def
app.common.data.macros/get-in clojure.core/get-in
app.common.data.macros/with-open clojure.core/with-open
@@ -15,11 +14,14 @@
:hooks
{:analyze-call
{app.common.data.macros/export hooks.export/export
potok.core/reify hooks.export/potok-reify
app.util.services/defmethod hooks.export/service-defmethod
app.common.record/defrecord hooks.export/penpot-defrecord
app.db/with-atomic hooks.export/penpot-with-atomic
potok.v2.core/reify hooks.export/potok-reify
rumext.v2/fnc hooks.export/rumext-fnc
rumext.v2/defc hooks.export/rumext-defc
rumext.v2/lazy-component hooks.export/rumext-lazycomponent
shadow.lazy/loadable hooks.export/rumext-lazycomponent
}}
:output
+93 -4
View File
@@ -12,6 +12,7 @@
(def registry (atom {}))
(defn potok-reify
[{:keys [:node :filename] :as params}]
(let [[rnode rtype & other] (:children node)
@@ -37,6 +38,9 @@
(api/token-node rsym)
(api/vector-node [])]
other))]
;; (prn (api/sexpr result))
{:node result})))
(defn penpot-with-atomic
@@ -59,15 +63,100 @@
body))})))
(defn rumext-fnc
[{:keys [node]}]
(let [[cname mdata params & body] (rest (:children node))
[params body] (if (api/vector-node? mdata)
[mdata (cons params body)]
[params body])
result (api/list-node
(into [(api/token-node 'fn) params]
(cons mdata body)))]
{:node result}))
(defn- parse-defc
[{:keys [children] :as node}]
(let [args (rest children)
[cname args]
(if (api/token-node? (first args))
[(first args) (rest args)]
(throw (ex-info "unexpected1" {})))
[docs args]
(if (api/string-node? (first args))
[(first args) (rest args)]
["" args])
[mdata args]
(if (api/map-node? (first args))
[(first args) (rest args)]
[(api/map-node []) args])
[params body]
(if (api/vector-node? (first args))
[(first args) (rest args)]
(throw (ex-info "unexpected2" {})))]
[cname docs mdata params body]))
(defn rumext-defc
[{:keys [node]}]
(let [[cname docs mdata params body] (parse-defc node)
param1 (first (:children params))
paramN (rest (:children params))
param1 (if (api/map-node? param1)
(let [param1 (into {} (comp
(partition-all 2)
(map (fn [[k v]]
[(if (api/keyword-node? k)
(:k k)
k)
(if (api/vector-node? v)
(vec (:children v))
v)])))
(:children param1))
binding (:rest param1)
param1 (if binding
(if (contains? param1 :as)
(update param1 :keys (fnil conj []) binding)
(assoc param1 :as binding))
param1)]
(->> (dissoc param1 :rest)
(mapcat (fn [[k v]]
[(if (keyword? k)
(api/keyword-node k)
k)
(if (vector? v)
(api/vector-node v)
v)]))
(api/map-node)))
param1)
result (api/list-node
(into [(api/token-node 'defn)
cname
(api/vector-node (filter some? (cons param1 paramN)))]
(cons mdata body)))]
;; (prn (api/sexpr result))
{:node result}))
(defn rumext-lazycomponent
[{:keys [node]}]
(let [[cname mdata params & body] (rest (:children node))
[params body] (if (api/vector-node? mdata)
[mdata (cons params body)]
[params body])]
(let [result (api/list-node
(into [(api/token-node 'fn)
params]
(cons mdata body)))]
(let [result (api/list-node [(api/token-node 'constantly) nil])]
;; (prn (api/sexpr result))
{:node result})))
+2
View File
@@ -3,6 +3,8 @@
:remove-surrounding-whitespace? true
:remove-consecutive-blank-lines? false
:extra-indents {rumext.v2/fnc [[:inner 0]]
cljs.test/async [[:inner 0]]
app.common.schema/register! [[:inner 0] [:inner 1]]
promesa.exec/thread [[:inner 0]]
specify! [[:inner 0] [:inner 1]]}
}
+8 -1
View File
@@ -23,6 +23,7 @@
/*.jpg
/*.md
/*.png
/*.svg
/*.sql
/*.txt
/*.yml
@@ -47,6 +48,8 @@
/deploy
/docker/images/bundle*
/exporter/target
/frontend/.storybook/preview-body.html
/frontend/.storybook/preview-head.html
/frontend/cypress/fixtures/validuser.json
/frontend/cypress/videos/*/
/frontend/cypress/videos/*/
@@ -56,6 +59,7 @@
/frontend/package-lock.json
/frontend/resources/fonts/experiments
/frontend/resources/public/*
/frontend/storybook-static/
/frontend/target/
/other/
/scripts/
@@ -66,4 +70,7 @@
/web
clj-profiler/
node_modules
frontend/.storybook/preview-body.html
/test-results/
/playwright-report/
/blob-report/
/playwright/.cache/
+2
View File
@@ -6,4 +6,6 @@ enableImmutableInstalls: false
enableTelemetry: false
httpTimeout: 600000
nodeLinker: node-modules
+351 -8
View File
@@ -1,22 +1,365 @@
# CHANGELOG
## 1.20.0
## 2.3.0
### :rocket: Epics and highlights
### :boom: Breaking changes & Deprecations
### :sparkles: New features
### :heart: Community contributions (Thank you!)
- Select through stroke only rectangle [Taiga #5484](https://tree.taiga.io/project/penpot/issue/5484)
- Override browser Ctrl+ and Ctrl- zoom with Penpot Zoom [Taiga #3200](https://tree.taiga.io/project/penpot/us/3200)
### :sparkles: New features
### :bug: Bugs fixed
- Fix pixelated thumbnails [Github
#3681](https://github.com/penpot/penpot/issues/3681) [Github #3661](https://github.com/penpot/penpot/issues/3661)
## 2.2.0
### :arrow_up: Deps updates
### :rocket: Epics and highlights
### :heart: Community contributions by (Thank you!)
### :boom: Breaking changes & Deprecations
- Removed "merge assets" option when exporting ".svg + .json" files. After the components changes the option wasn't
working properly and we're planning to change the format soon. We think it's better to deprecate the option for the
time being.
### :heart: Community contributions (Thank you!)
- Set proper default tenant on exporter (by @june128) [#4946](https://github.com/penpot/penpot/pull/4946)
- Correct a spelling in onboarding.edn (by @n-stha) [#4936](https://github.com/penpot/penpot/pull/4936)
### :sparkles: New features
- **Tiered File Data Storage** [Taiga #8376](https://tree.taiga.io/project/penpot/us/8376)
This feature allows offloading file data that is not actively used
from the database to object storage (e.g., filesystem, S3), thereby
freeing up space in the database. It can be enabled with the
`enable-enable-tiered-file-data-storage` flag.
*(On-Premise feature, EXPERIMENTAL).*
- **JSON Interoperability for HTTP API** [Taiga #8372](https://tree.taiga.io/project/penpot/us/8372)
Enables full JSON interoperability for our HTTP API. Previously,
JSON was only barely supported for output when the
`application/json` media type was specified in the `Accept` header,
or when `_fmt=json` was passed as a query parameter. With this
update, we now offer proper bi-directional support for using our API
with plain JSON, instead of Transit.
- **Automatic File Snapshotting**
Adds the ability to automatically take and maintain a limited set of
snapshots of active files without explicit user intervention. This
feature allows on-premise administrators to recover the state of a
file from a past point in time in a limited manner.
It can be enabled with the `enable-auto-file-snapshot` flag and
configured with the following settings:
```bash
# Take snapshots every 10 update operations
PENPOT_AUTO_FILE_SNAPSHOT_EVERY=10
# Take a snapshot if it has been more than 3 hours since the file was last modified
PENPOT_AUTO_FILE_SNAPSHOT_TIMEOUT=3h
# The total number of snapshots to keep
PENPOT_AUTO_FILE_SNAPSHOT_TOTAL=10
```
Snapshots are only taken during update operations; there is NO
active background process for this.
- Add separated flag `enable-oidc-registration` for enable the
registration only for OIDC authentication backend [Github
#4882](https://github.com/penpot/penpot/issues/4882)
- Update templates in libraries & templates in dashboard modal [Taiga #8145](https://tree.taiga.io/project/penpot/us/8145)
- **Design System**
We implemented and subbed in new components from our Design System: `loader*` ([Taiga #8355](https://tree.taiga.io/project/penpot/task/8355)) and `tab-switcher*` ([Taiga #8518](https://tree.taiga.io/project/penpot/task/8518)).
- **Storybook** [Taiga #6329](https://tree.taiga.io/project/penpot/us/6329)
The Design System components are now published in a Storybook, available at `/storybook`.
### :bug: Bugs fixed
- Fix webhook checkbox position [Taiga #8634](https://tree.taiga.io/project/penpot/issue/8634)
- Fix wrong props on padding input [Taiga #8254](https://tree.taiga.io/project/penpot/issue/8254)
- Fix fill collapsed options [Taiga #8351](https://tree.taiga.io/project/penpot/issue/8351)
- Fix scroll on color picker modal [Taiga #8353](https://tree.taiga.io/project/penpot/issue/8353)
- Fix components are not dragged from the group to the assets tab [Taiga #8273](https://tree.taiga.io/project/penpot/issue/8273)
- Fix problem with SVG import [Github #4888](https://github.com/penpot/penpot/issues/4888)
- Fix problem with overlay positions in viewer [Taiga #8464](https://tree.taiga.io/project/penpot/issue/8464)
- Fix layer panel overflowing [Taiga #8665](https://tree.taiga.io/project/penpot/issue/8665)
- Fix problem when creating a component instance from grid layout [Github #4881](https://github.com/penpot/penpot/issues/4881)
- Fix problem when dismissing shared library update [Taiga #8669](https://tree.taiga.io/project/penpot/issue/8669)
- Fix visual problem with stroke cap menu [Taiga #8730](https://tree.taiga.io/project/penpot/issue/8730)
- Fix issue when exporting libraries when merging libraries [Taiga #8758](https://tree.taiga.io/project/penpot/issue/8758)
- Fix problem with comments max length [Taiga #8778](https://tree.taiga.io/project/penpot/issue/8778)
- Fix copy/paste images in Safari [Taiga #8771](https://tree.taiga.io/project/penpot/issue/8771)
- Fix swap when the copy is the only child of a group [#5075](https://github.com/penpot/penpot/issues/5075)
## 2.1.5
### :bug: Bugs fixed
- Fix broken webhooks [Taiga #8370](https://tree.taiga.io/project/penpot/issue/8370)
## 2.1.4
### :bug: Bugs fixed
- Fix json encoding on zip encoding decoding.
- Add schema validation for color changes.
- Fix render of some texts without position data.
## 2.1.3
- Don't allow registration when registration is disabled and invitation token is used [Github #4975](https://github.com/penpot/penpot/issues/4975)
## 2.1.2
### :bug: Bugs fixed
- User switch language to "zh_hant" will get 400 [Github #4884](https://github.com/penpot/penpot/issues/4884)
- Smtp config ignoring port if ssl is set [Github #4872](https://github.com/penpot/penpot/issues/4872)
- Ability to let users to authenticate with a private oidc provider only [Github #4963](https://github.com/penpot/penpot/issues/4963)
## 2.1.1
### :sparkles: New features
- Consolidate templates new order and naming [Taiga #8392](https://tree.taiga.io/project/penpot/task/8392)
### :bug: Bugs fixed
- Fix the “search” label in translations [Taiga #8402](https://tree.taiga.io/project/penpot/issue/8402)
- Fix pencil loader [Taiga #8348](https://tree.taiga.io/project/penpot/issue/8348)
- Fix several issues on the OIDC.
- Fix regression on the `email-verification` flag [Taiga #8398](https://tree.taiga.io/project/penpot/issue/8398)
## 2.1.0 - Things can only get better!
### :rocket: Epics and highlights
### :boom: Breaking changes & Deprecations
### :heart: Community contributions (Thank you!)
### :sparkles: New features
- Improve auth process [Taiga #7094](https://tree.taiga.io/project/penpot/us/7094)
- Add locking degrees increment (hold shift) on path edition [Taiga #7761](https://tree.taiga.io/project/penpot/issue/7761)
- Persistence & Concurrent Edition Enhancements [Taiga #5657](https://tree.taiga.io/project/penpot/us/5657)
- Allow library colors as recent colors [Taiga #7640](https://tree.taiga.io/project/penpot/issue/7640)
- Missing scroll in viewmode comments [Taiga #7427](https://tree.taiga.io/project/penpot/issue/7427)
- Comments in View mode should mimic the positioning behavior of the Workspace [Taiga #7346](https://tree.taiga.io/project/penpot/issue/7346)
- Misaligned input on comments [Taiga #7461](https://tree.taiga.io/project/penpot/issue/7461)
### :bug: Bugs fixed
- Fix selection rectangle appears on scroll [Taiga #7525](https://tree.taiga.io/project/penpot/issue/7525)
- Fix layer tree not expanding to the bottom edge [Taiga #7466](https://tree.taiga.io/project/penpot/issue/7466)
- Fix guides move when board is moved by inputs [Taiga #8010](https://tree.taiga.io/project/penpot/issue/8010)
- Fix clickable area of Penptot logo in the viewer [Taiga #7988](https://tree.taiga.io/project/penpot/issue/7988)
- Fix constraints dropdown when selecting multiple shapes [Taiga #7686](https://tree.taiga.io/project/penpot/issue/7686)
- Layout and scrollign fixes for the bottom palette [Taiga #7559](https://tree.taiga.io/project/penpot/issue/7559)
- Fix expand libraries when search results are present [Taiga #7876](https://tree.taiga.io/project/penpot/issue/7876)
- Fix color palette default library [Taiga #8029](https://tree.taiga.io/project/penpot/issue/8029)
- Component Library is lost after exporting/importing in .zip format [Github #4672](https://github.com/penpot/penpot/issues/4672)
- Fix problem with moving+selection not working properly [Taiga #7943](https://tree.taiga.io/project/penpot/issue/7943)
- Fix problem with flex layout fit to content not positioning correctly children [Taiga #7537](https://tree.taiga.io/project/penpot/issue/7537)
- Fix black line is displaying after show main [Taiga #7653](https://tree.taiga.io/project/penpot/issue/7653)
- Fix "Share prototypes" modal remains open [Taiga #7442](https://tree.taiga.io/project/penpot/issue/7442)
- Fix "Components visibility and opacity" [#4694](https://github.com/penpot/penpot/issues/4694)
- Fix "Attribute overrides in copies are not exported in zip file" [Taiga #8072](https://tree.taiga.io/project/penpot/issue/8072)
- Fix group not automatically selected in the Layers panel after creation [Taiga #8078](https://tree.taiga.io/project/penpot/issue/8078)
- Fix export boards loses opacity [Taiga #7592](https://tree.taiga.io/project/penpot/issue/7592)
- Fix change color on imported svg also changes the stroke alignment[Taiga #7673](https://github.com/penpot/penpot/pull/7673)
- Fix show in view mode and interactions workflow [Taiga #4711](https://github.com/penpot/penpot/pull/4711)
- Fix internal error when I set up a stroke for some objects without and with stroke [Taiga #7558](https://tree.taiga.io/project/penpot/issue/7558)
- Toolbar keeps toggling on and off on spacebar press [Taiga #7654](https://github.com/penpot/penpot/pull/7654)
- Fix toolbar keeps hiding when click outside workspace [Taiga #7776](https://tree.taiga.io/project/penpot/issue/7776)
- Fix open overlay relative to a frame [Taiga #7563](https://tree.taiga.io/project/penpot/issue/7563)
- Workspace-palette items stay hidden when opening with keyboard-shortcut [Taiga #7489](https://tree.taiga.io/project/penpot/issue/7489)
- Fix SVG attrs are not handled correctly when exporting/importing in .zip [Taiga #7920](https://tree.taiga.io/project/penpot/issue/7920)
- Fix validation error when detaching with two nested copies and a swap [Taiga #8095](https://tree.taiga.io/project/penpot/issue/8095)
- Export shapes that are rotated act a bit strange when reimported [Taiga #7585](https://tree.taiga.io/project/penpot/issue/7585)
- Penpot crashes when a new colorpicker is created while uploading an image to another instance [Taiga #8119](https://tree.taiga.io/project/penpot/issue/8119)
- Removing Underline and Strikethrough Affects the Previous Text Object [Taiga #8103](https://tree.taiga.io/project/penpot/issue/8103)
- Color library loses association with shapes when exporting/importing the document [Taiga #8132](https://tree.taiga.io/project/penpot/issue/8132)
- Fix can't collapse groups when searching in the assets tab [Taiga #8125](https://tree.taiga.io/project/penpot/issue/8125)
- Fix 'Detach instance' shortcut is not working [Taiga #8102](https://tree.taiga.io/project/penpot/issue/8102)
- Fix import file message does not detect 0 as error [Taiga #6824](https://tree.taiga.io/project/penpot/issue/6824)
- Image Color Library is not persisted when exporting/importing in .zip [Taiga #8131](https://tree.taiga.io/project/penpot/issue/8131)
- Fix export files including libraries [Taiga #8266](https://tree.taiga.io/project/penpot/issue/8266)
## 2.0.3
### :bug: Bugs fixed
- Fix chrome scrollbar styling [Taiga #7852](https://tree.taiga.io/project/penpot/issue/7852)
- Fix incorrect password encoding on create-profile manage scritp [Github #3651](https://github.com/penpot/penpot/issues/3651)
## 2.0.2
### :sparkles: Enhancements
- Fix locking contention on cron subsystem (causes backend start blocking)
- Fix locking contention on file object thumbails backend RPC calls
### :bug: Bugs fixed
- Fix color palette sorting [Taiga #7458](https://tree.taiga.io/project/penpot/issue/7458)
- Fix style scoping problem with imported SVG [Taiga #7671](https://tree.taiga.io/project/penpot/issue/7671)
## 2.0.1
### :bug: Bugs fixed
- Fix different issues related to components v2 migrations including [Github #4443](https://github.com/penpot/penpot/issues/4443)
## 2.0.0 - I Just Can't Get Enough
### :rocket: Epics and highlights
- Grid CSS layout [Taiga #4915](https://tree.taiga.io/project/penpot/epic/4915)
- UI redesign [Taiga #4958](https://tree.taiga.io/project/penpot/epic/4958)
- New components System [Taiga #2662](https://tree.taiga.io/project/penpot/epic/2662)
- Swap components [Taiga #1331](https://tree.taiga.io/project/penpot/us/1331)
- Images as fill [Taiga #2983](https://tree.taiga.io/project/penpot/us/2983)
- HTML code generation [Taiga #5277](https://tree.taiga.io/project/penpot/us/5277)
- Light and dark themes [Taiga #2287](https://tree.taiga.io/project/penpot/us/2287)
### :boom: Breaking changes & Deprecations
- New strokes default to inside border [Taiga #6847](https://tree.taiga.io/project/penpot/issue/6847)
- Change default z ordering on layers in flex layout. The previous behavior was inconsistent with how HTML works and we changed it to be more consistent. Previous layers that overlapped could be hidden, the fastest way to fix this is changing the z-index property but a better way is to change the order of your layers.
### :heart: Community contributions (Thank you!)
- New Hausa, Yoruba and Igbo translations and update translation files (by All For Tech Empowerment Foundation) [Taiga #6950](https://tree.taiga.io/project/penpot/us/6950), [Taiga #6534](https://tree.taiga.io/project/penpot/us/6534)
- Hide bounding-box when editing shape (by @VasilevsVV) [#3930](https://github.com/penpot/penpot/pull/3930)
- CTRL + "+" to zoom into canvas instead of browser (by @audriu) [#3848](https://github.com/penpot/penpot/pull/3848)
- Add dev deps.edn in the project root (by @PEZ) [#3794](https://github.com/penpot/penpot/pull/3794)
- Allow passing overrides to frontend nginx config (by @m90) [#3602](https://github.com/penpot/penpot/pull/3602)
- Update index.njk to remove typo (by @fdvmoreira) [#155](https://github.com/penpot/penpot-docs/pull/155)
- Typo (by StephanEggermont) [#157](https://github.com/penpot/penpot-docs/pull/157)
### :sparkles: New features
- Send comments with Ctrl+Enter / Cmd + Enter [Taiga #6085](https://tree.taiga.io/project/penpot/issue/6085)
- Select through stroke only rectangle [Taiga #5484](https://tree.taiga.io/project/penpot/issue/5484)
- Stroke default position [Taiga #6847](https://tree.taiga.io/project/penpot/issue/6847)
- Override browser Ctrl+ and Ctrl- zoom with Penpot Zoom [Taiga #3200](https://tree.taiga.io/project/penpot/us/3200)
- Improve the way handlers work on flex layouts [Taiga #6598](https://tree.taiga.io/project/penpot/us/6598)
- Add menu entry for toggle between light/dark theme [Taiga #6829](https://tree.taiga.io/project/penpot/issue/6829)
- Switch themes shortcut [Taiga #6644](https://tree.taiga.io/project/penpot/us/6644)
- Constraints section at design tab new position [Taiga #6830](https://tree.taiga.io/project/penpot/issue/6830)
- [PICKER] File library colors order [Taiga #5399](https://tree.taiga.io/project/penpot/us/5399)
- Onboarding invitations improvements [Taiga #5974](https://tree.taiga.io/project/penpot/us/5974)
- [PERFORMANCE] Workspace thumbnails refactor [Taiga #5828](https://tree.taiga.io/project/penpot/us/5828)
- [PERFORMANCE] Add performance optimizations to shape rendering [Taiga #5835](https://tree.taiga.io/project/penpot/us/5835)
- [PERFORMANCE] Optimize SVG output [Taiga #4134](https://tree.taiga.io/project/penpot/us/4134)
- [PERFORMANCE] Optimize svg on importation [Taiga #5879](https://tree.taiga.io/project/penpot/us/5879)
- [PERFORMANCE] Optimization tasks related to design tab file [Taiga #5760](https://tree.taiga.io/project/penpot/us/5760)
- [INSTALL] Ability to setup features by team [Taiga #6108](https://tree.taiga.io/project/penpot/us/6108)
- [IMAGES] Keep aspect ratio option [Taiga #6933](https://tree.taiga.io/project/penpot/us/6933)
- [INSPECT] UI review [Taiga #5687](https://tree.taiga.io/project/penpot/us/5687)
- [GRID LAYOUT] Phase 1 [Taiga #4303](https://tree.taiga.io/project/penpot/us/4303)
- [GRID LAYOUT] Inspect code for Grid [Taiga #5277](https://tree.taiga.io/project/penpot/us/5277)
- [GRID LAYOUT] Phase 1 polishing [Taiga #5612](https://tree.taiga.io/project/penpot/us/5612)
- [GRID LAYOUT] Improvements & Feedback [Taiga #6047](https://tree.taiga.io/project/penpot/us/6047)
- [COMPONENTS] Naming of the main component [Taiga #5291](https://tree.taiga.io/project/penpot/us/5291)
- [COMPONENTS] Rework inside of components - Library page [Taiga #2918](https://tree.taiga.io/project/penpot/us/2918)
- [COMPONENTS] Update component when updating main instance [Taiga #3794](https://tree.taiga.io/project/penpot/us/3794)
- [COMPONENTS] Main component new behavior [Taiga #3796](https://tree.taiga.io/project/penpot/us/3796)
- [COMPONENTS] Main component look & feel [Taiga #5290](https://tree.taiga.io/project/penpot/us/5290)
- [COMPONENTS] Library view [Taiga #2880](https://tree.taiga.io/project/penpot/us/2880)
- [COMPONENTS] Positioning inside a component should relative, as in boards [Taiga #2826](https://tree.taiga.io/project/penpot/us/2826)
- [COMPONENTS] Update message should show only if affecting at components that are being used at a file [Taiga #1397](https://tree.taiga.io/project/penpot/us/1397)
- [COMPONENTS] Annotations [Taiga #4957](https://tree.taiga.io/project/penpot/us/4957)
- [COMPONENTS] Synchronization order for nested components [Taiga #5439](https://tree.taiga.io/project/penpot/us/5439)
- [COMPONENTS] Libraries modal zero case [Taiga #5294](https://tree.taiga.io/project/penpot/us/5294)
- [COMPONENTS] Contextual menu casuistics [Taiga #5292](https://tree.taiga.io/project/penpot/us/5292)
- [COMPONENTS] Libraries publishing flow review [Taiga #5293](https://tree.taiga.io/project/penpot/us/5293)
- [COMPONENTS] Add loading text to Libraries modal [Taiga #6702](https://tree.taiga.io/project/penpot/us/6702)
- [COMPONENTS] Components rename and organization in bulk [Taiga #2877](https://tree.taiga.io/project/penpot/us/2877)
- [COMPONENTS] Info overlay about components V2 [Taiga #6276](https://tree.taiga.io/project/penpot/us/6276)
- [REDESIGN] New styles basics [Taiga #4967](https://tree.taiga.io/project/penpot/us/4967)
- [REDESIGN] Layers tab redesign [Taiga #4966](https://tree.taiga.io/project/penpot/us/4966)
- [REDESIGN] Design tab phase 1 [Taiga #4982](https://tree.taiga.io/project/penpot/us/4966)
- [REDESIGN] Assets tab redesign [Taiga #4984](https://tree.taiga.io/project/penpot/us/4984)
- [REDESIGN] Palette panels (colors, typographies...) [Taiga #4983](https://tree.taiga.io/project/penpot/us/4983)
- [REDESIGN] Workspace structure [Taiga #4988](https://tree.taiga.io/project/penpot/us/4988)
- [REDESIGN] Shortcut tab [Taiga #4989](https://tree.taiga.io/project/penpot/us/4989)
- [REDESIGN] Toolbar [Taiga #5500](https://tree.taiga.io/project/penpot/us/5500)
- [REDESIGN] History tab [Taiga #5481](https://tree.taiga.io/project/penpot/us/5481)
- [REDESIGN] Path options/toolbar [Taiga #5815](https://tree.taiga.io/project/penpot/us/5815)
- [REDESIGN] Design tab phase 2 [Taiga #5814](https://tree.taiga.io/project/penpot/us/5814)
- [REDESIGN] Design tab phase 3 and dashboard details [Taiga #5920](https://tree.taiga.io/project/penpot/us/5920)
- [REDESIGN] Dashboard [Taiga #5164](https://tree.taiga.io/project/penpot/us/5164)
- [REDESIGN] New Dashboard UI [Taiga #5869](https://tree.taiga.io/project/penpot/us/5869)
- [REDESIGN] Prototype tab [Taiga #4985](https://tree.taiga.io/project/penpot/us/4985)
- [REDESIGN] Code tab [Taiga #4986](https://tree.taiga.io/project/penpot/us/4986)
- [REDESIGN] Modals and alert messages [Taiga #5915](https://tree.taiga.io/project/penpot/us/5915)
- [REDESIGN] Comments page [Taiga #5917](https://tree.taiga.io/project/penpot/us/5917)
- [REDESIGN] View Mode [Taiga #5163](https://tree.taiga.io/project/penpot/us/5163)
- [REDESIGN] Miscellaneous tasks [Taiga #6050](https://tree.taiga.io/project/penpot/us/6050)
- [REDESIGN] Swap components [Taiga #6739](https://tree.taiga.io/project/penpot/us/6739)
- [REDESIGN] Font selector [Taiga #6677](https://tree.taiga.io/project/penpot/us/6677)
- [REDESIGN] Colour system of alerts and notifications [Taiga #6746](https://tree.taiga.io/project/penpot/us/6746)
- [REDESIGN] Review text in paragraphs for accessibility [Taiga #6703](https://tree.taiga.io/project/penpot/us/6703)
- [REDESIGN] Interaction icons [Taiga #6880](https://tree.taiga.io/project/penpot/us/6880)
- [REDESIGN] Panels visual separations [Taiga #6692](https://tree.taiga.io/project/penpot/us/6692)
- [REDESIGN] Onboarding slides [Taiga #6678](https://tree.taiga.io/project/penpot/us/6678)
### :bug: Bugs fixed
- Fix pixelated thumbnails [Github #3681](https://github.com/penpot/penpot/issues/3681), [Github #3661](https://github.com/penpot/penpot/issues/3661)
- Fix problem with not applying colors to boards [Github #3941](https://github.com/penpot/penpot/issues/3941)
- Fix problem with path editor undoing changes [Github #3998](https://github.com/penpot/penpot/issues/3998)
- [View mode] Open overlay places frame in the wrong position when paired with a fixed element [Taiga #6385](https://tree.taiga.io/project/penpot/issue/6385)
- Flex Layout: Fit-content not recalculated after deleting an element [Taiga #5968](https://tree.taiga.io/project/penpot/issue/5968)
- Selecting from Color Palette does not work for board when there is no existing fill [Taiga #6464](https://tree.taiga.io/project/penpot/issue/6464)
- Color thumbnails are consistently rounded in the inspect code mode [Taiga #5886](https://tree.taiga.io/project/penpot/issue/5886)
- Adding vector path points before first point of existing open path not working [Taiga #6593](https://tree.taiga.io/project/penpot/issue/6593)
- Some image formats include the extension when importing [Taiga #5485](https://tree.taiga.io/project/penpot/issue/5485)
- Gradient color tool doesn't work properly with flipped items [Taiga #6485](https://tree.taiga.io/project/penpot/issue/6485)
- [TEXT] Align options are not shown when several text are selected [Taiga #5948](https://tree.taiga.io/project/penpot/issue/5948)
- [VIEW MODE] Comments not working properly on multiple pages [Taiga #6281](https://tree.taiga.io/project/penpot/issue/6281)
- [PERFORMANCE] Alignments are slow [Taiga #5865](https://tree.taiga.io/project/penpot/issue/5865)
- [EXPORT] Exporting an element with a non-visible drop shadow displays the shadow either way [Taiga #6768](https://tree.taiga.io/project/penpot/issue/6768)
- [SAFARI] Color picker cursor is not pointing correctly [Taiga #6733](https://tree.taiga.io/project/penpot/issue/6733)
- [Import Files] When user has imported .penpot file with new file name of previously downloaded library file the default library file name is set for it [Taiga #5596](https://tree.taiga.io/project/penpot/issue/5596)
- Issue when resizing a duotone FA icon [Taiga #5935](https://tree.taiga.io/project/penpot/issue/5935)
- "Hide grid" keyboard shortcut broken [Taiga #5102](https://tree.taiga.io/project/penpot/issue/5102)
- Picking a gradient color in recent colors for a new color in the assets tab crashes Penpot [Taiga #5601](https://tree.taiga.io/project/penpot/issue/5601)
- Thumbnails not loading [Taiga #6012](https://tree.taiga.io/project/penpot/issue/6012)
- Don't show signup link/form when registration is disabled. [Taiga #1196](https://tree.taiga.io/project/penpot/issue/1196)
- Registration Page UI UX issue with small resolutions [Taiga #1693](https://tree.taiga.io/project/penpot/issue/1693)
- [LOGIN] "E-Mail-Adress" input field is set to type 'text' instead of 'eMail [Taiga #1921](https://tree.taiga.io/project/penpot/issue/1921)
- Handling correctly slashes "/" in emails [Taiga #4906](https://tree.taiga.io/project/penpot/issue/4906)
- Tab character in texts crashes the app [Taiga #4418](https://tree.taiga.io/project/penpot/issue/4418)
- Text does not match export [Taiga #4129](https://tree.taiga.io/project/penpot/issue/4129)
- Scrollbars cover the layers carets [Taiga #4431](https://tree.taiga.io/project/penpot/issue/4431)
- Horizontal ruler disappear when overlapping a board [Taiga #4138](https://tree.taiga.io/project/penpot/issue/4138)
- Resize shape + Alt key is not working [Taiga #3447](https://tree.taiga.io/project/penpot/issue/3447)
- Libraries images broken on premise [Taiga #4573](https://tree.taiga.io/project/penpot/issue/4573)
- [VIEWER] Cannot scroll down in code </> mode [Taiga #4655](https://tree.taiga.io/project/penpot/issue/4655)
- Strange cursor behavior after clicking viewport with text tool [Taiga #4363](https://tree.taiga.io/project/penpot/issue/4363)
- Selected color affects all of them [Taiga #5285](https://tree.taiga.io/project/penpot/issue/5285)
- Fix problem with shadow negative spread [Github #3421](https://github.com/penpot/penpot/issues/3421)
- Fix problem with linked colors to strokes [Github #3522](https://github.com/penpot/penpot/issues/3522)
- Fix problem with hand tool stuck [Github #3318](https://github.com/penpot/penpot/issues/3318)
- Fix problem with fix scrolling on nested elements [Github #3508](https://github.com/penpot/penpot/issues/3508)
- Fix problem when changing typography assets [Github #3683](https://github.com/penpot/penpot/issues/3683)
- Internal error when you copy and paste some main components between files [Taiga #7397](https://tree.taiga.io/project/penpot/issue/7397)
- Fix toolbar disappearing [Taiga #7411](https://tree.taiga.io/project/penpot/issue/7411)
- Fix long text on tab breaks UI [Taiga #7421](https://tree.taiga.io/project/penpot/issue/7421)
## 1.19.5
+1 -1
View File
@@ -48,7 +48,7 @@ quick win.
If is going to be your first pull request, You can learn how from this
free video series:
https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github
https://egghead.io/courses/how-to-contribute-to-an-open-source-project-on-github
We will use the `easy fix` mark for tag for indicate issues that are
easy for beginners.
+75 -49
View File
@@ -2,10 +2,11 @@
[uri_license]: https://www.mozilla.org/en-US/MPL/2.0
[uri_license_image]: https://img.shields.io/badge/MPL-2.0-blue.svg
<h1 align="center">
<br>
<img src="https://penpot.app/images/readme/git-readme-header.png" alt="PENPOT">
</h1>
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://penpot.app/images/readme/github-dark-mode.png">
<source media="(prefers-color-scheme: light)" srcset="https://penpot.app/images/readme/github-light-mode.png">
<img alt="penpot header image" src="https://penpot.app/images/readme/github-light-mode.png">
</picture>
<p align="center"><a href="https://www.mozilla.org/en-US/MPL/2.0" rel="nofollow"><img src="https://camo.githubusercontent.com/3fcf3d6b678ea15fde3cf7d6af0e242160366282d62a7c182d83a50bfee3f45e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4d504c2d322e302d626c75652e737667" alt="License: MPL-2.0" data-canonical-src="https://img.shields.io/badge/MPL-2.0-blue.svg" style="max-width:100%;"></a>
<a href="https://gitter.im/penpot/community" rel="nofollow"><img src="https://camo.githubusercontent.com/5b0aecb33434f82a7b158eab7247544235ada0cf7eeb9ce8e52562dd67f614b7/68747470733a2f2f6261646765732e6769747465722e696d2f736572656e6f2d78797a2f636f6d6d756e6974792e737667" alt="Gitter" data-canonical-src="https://badges.gitter.im/sereno-xyz/community.svg" style="max-width:100%;"></a>
@@ -13,75 +14,89 @@
<a href="https://gitpod.io/#https://github.com/penpot/penpot" rel="nofollow"><img src="https://camo.githubusercontent.com/daadb4894128d1e19b72d80236f5959f1f2b47f9fe081373f3246131f0189f6c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f476974706f642d72656164792d2d746f2d2d636f64652d626c75653f6c6f676f3d676974706f64" alt="Gitpod ready-to-code" data-canonical-src="https://img.shields.io/badge/Gitpod-ready--to--code-blue?logo=gitpod" style="max-width:100%;"></a></p>
<p align="center">
<a href="https://penpot.app/"><b>Website</b></a>
<a href="https://help.penpot.app/technical-guide/getting-started/"><b>Getting Started</b></a>
<a href="https://help.penpot.app/user-guide/"><b>User Guide</b></a>
<a href="https://help.penpot.app/user-guide/introduction/info/"><b>Tutorials & Info</b></a>
<a href="https://community.penpot.app/"><b>Community</b></a>
<a href="https://twitter.com/penpotapp"><b>Twitter</b></a> •
<a href="https://instagram.com/penpot.app"><b>Instagram</b></a> •
<a href="https://fosstodon.org/@penpot/"><b>Mastodon</b></a>
<a href="https://www.youtube.com/channel/UCAqS8G72uv9P5HG1IfgnQ9g"><b>Youtube</b></a>
<a href="https://penpot.app/"><b>Website</b></a>
<a href="https://help.penpot.app/technical-guide/getting-started/"><b>Getting Started</b></a>
<a href="https://help.penpot.app/user-guide/"><b>User Guide</b></a>
<a href="https://help.penpot.app/user-guide/introduction/info/"><b>Tutorials & Info</b></a>
<a href="https://community.penpot.app/"><b>Community</b></a>
</p>
<p align="center">
<a href="https://www.youtube.com/@Penpot"><b>Youtube</b></a>
<a href="https://peertube.kaleidos.net/a/penpot_app/video-channels"><b>Peertube</b></a>
<a href="https://www.linkedin.com/company/penpot/"><b>Linkedin</b></a> •
<a href="https://instagram.com/penpot.app"><b>Instagram</b></a> •
<a href="https://fosstodon.org/@penpot/"><b>Mastodon</b></a> •
<a href="https://twitter.com/penpotapp"><b>X</b></a>
</p>
![feature-readme](https://user-images.githubusercontent.com/1045247/189871786-0b44f7cf-3a0a-4445-a87b-9919ec398bf7.gif)
<br />
🎇 **Penpot Fest exceeded all expectations - it was a complete success!** 🎇 Penpot Fest is our first Design event that brought designers and developers from the Open Source communities and beyond. Watch the replay of the talks on our [Youtube channel](https://www.youtube.com/playlist?list=PLgcCPfOv5v56-fghJo2dHNBqL9zlDTslh) or [Peertube channel](https://peertube.kaleidos.net/w/p/1tWgyJTt8sKbWwCEcBimZW)
[Penpot video](https://github.com/penpot/penpot/assets/5446186/b8ad0764-585e-4ddc-b098-9b4090d337cc)
Penpot is the first **Open Source** design and prototyping platform meant for cross-domain teams. Non dependent on operating systems, Penpot is web based and works with open standards (SVG). Penpot invites designers all over the world to fall in love with open source while getting developers excited about the design process in return.
<br />
Penpot is the first **open-source** design tool for design and code collaboration. Designers can create stunning designs, interactive prototypes, design systems at scale, while developers enjoy ready-to-use code and make their workflow easy and fast. And all of this with no handoff drama.
Penpot is available on browser and [self host](https://penpot.app/self-host). Its web-based and works with open standards (SVG, CSS and HTML). And last but not least, its free!
Penpots latest [huge release 2.0](https://penpot.app/dev-diaries), takes the platform to a whole new level. This update introduces the ground-breaking [CSS Grid Layout feature](https://penpot.app/penpot-2.0), a complete UI redesign, a new Components system, and much more. Plus, it's faster and more accessible.
🎇 **Penpot Fest** is our design, code & Open Source event. Check out the highlights from [Penpot Fest 2023 edition](https://www.youtube.com/watch?v=sOpLZaK5mDc)!
## Table of contents ##
- [Why Penpot](#why-penpot)
- [Getting Started](#getting-started)
- [Community](#community)
- [Contributing](#contributing)
- [Resources](#resources)
- [License](#license)
## Why Penpot ##
Penpot makes design and prototyping accessible to every team in the world.
Penpot expresses designs as code. Designers can do their best work and see it will be beautifully implemented by developers in a two-way collaboration.
### For cross-domain teams ###
We have a clear focus on design and code teams and our capabilities reflect exactly that. The less hand-off mindset, the more fun for everyone.
### Designed for developers ###
Penpot was built to serve both designers and developers and create a fluid design-code process. You have the choice to enjoy real-time collaboration or play "solo".
### Multiplatform ###
Being web based, Penpot is not dependent on operating systems or local installations, you will only need to run a modern browser.
### Inspect mode ###
Work with ready-to-use code and make your workflow easy and fast. The inspect tab gives instant access to SVG, CSS and HTML code.
### Open Standards ###
Using SVG as no other design and prototyping tool does, Penpot files sport compatibility with most of the vectorial tools, are tech friendly and extremely easy to use on the web. We make sure you will always own your work.
### Self host your own instance ###
Provide your team or organization with a completely owned collaborative design tool. Use Penpot's cloud service or deploy your own Penpot server.
### Integrations ###
Penpot offers integration into the development toolchain, thanks to its support for webhooks and an API accessible through access tokens.
### Whats great for design ###
With Penpot you can design libraries to share and reuse; turn design elements into components and tokens to allow reusability and scalability; and build realistic user flows and interactions.
<br />
<p align="center">
<img src="https://penpot.app/images/readme/git-open.png" alt="Open Source" style="width: 65%;">
<img src="https://img.plasmic.app/img-optimizer/v1/img?src=https%3A%2F%2Fimg.plasmic.app%2Fimg-optimizer%2Fv1%2Fimg%2F9dd677c36afb477e9666ccd1d3f009ad.png" alt="Open Source" style="width: 65%;">
</p>
<br />
## Getting started ##
### Install with Elestio ###
[Elestio](https://elest.io/) offers a fully managed service for on-premise instances of a selection of open-source software! This means you can deploy a dedicated instance of Penpot in just 3 minutes with no technical knowledge needed.
Penpot is the only design & prototype platform that is deployment agnostic. You can use it or deploy it anywhere.
You dont need to worry about DNS configuration, SMTP, backups, SSL certificates, OS & Penpot upgrades, and much more.
[Get started with Elestio.](https://help.penpot.app/technical-guide/getting-started/#install-with-elestio)
### Install with Docker ###
You can also get started with Penpot locally or self-host it with **docker** and **docker-compose**.
Heres a step-by-step guide on [getting started with Docker.](https://help.penpot.app/technical-guide/getting-started/#install-with-docker)
### Penpot cloud app ###
If you prefer not to install Penpot in a local environment, [login or register on our Penpot cloud app](https://design.penpot.app). Create a team to work together on projects and share design assets or jump right away into Penpot and **start designing** on your own.
Learn how to install it with Elestio and Docker, or other options on [our website](https://penpot.app/self-host).
<br />
<p align="center">
<img src="https://penpot.app/images/readme/git-self-host.png" alt="Getting started" style="width: 65%;">
<img src="https://site-assets.plasmic.app/2168cf524dd543caeff32384eb9ea0a1.svg" alt="Open Source" style="width: 65%;">
</p>
<br />
## Community ##
We love the open source software community. Contributing is our passion and if its yours too, [participate](https://community.penpot.app/) and [improve](https://community.penpot.app/c/help-us-improve-penpot/7) Penpot. All your ideas and code are welcome!
We love the Open Source software community. Contributing is our passion and if its yours too, participate and [improve](https://community.penpot.app/c/help-us-improve-penpot/7) Penpot. All your designs, code and ideas are welcome!
If you need help or have any questions; if youd like to share your experience using Penpot or get inspired; if youd rather meet our community of developers and designers, [join our Community](https://community.penpot.app/)!
@@ -93,30 +108,41 @@ You will find the following categories:
- [Events and Announcements](https://community.penpot.app/c/announcements/5)
- [Inside Penpot](https://community.penpot.app/c/inside-penpot/21)
- [Penpot in your language](https://community.penpot.app/c/penpot-in-your-language/12)
- [Design and Code Essentials](https://community.penpot.app/c/design-and-code-essentials/22)
<br />
<p align="center">
<img src="https://penpot.app/images/readme/git-collaborate.png" alt="Communnity" style="width: 65%;">
<img src="https://github.com/penpot/penpot/assets/5446186/6ac62220-a16c-46c9-ab21-d24ae357ed03" alt="Community" style="width: 65%;">
</p>
<br />
## Contributing ##
Every sort of contribution will be very helpful to enhance Penpot. How youll participate? All your ideas, designs and code are welcome:
Any contribution will make a difference to improve Penpot. How can you get involved?
Choose your way:
- Create and [share Libraries & Templates](https://penpot.app/libraries-templates.html) that will be helpful for the community
- Invite your [team to join](https://design.penpot.app/#/auth/register)
- Star this repo and follow us on Social Media: [Twitter](https://twitter.com/penpotapp), [Instagram](https://instagram.com/penpot.app), [Youtube](https://www.youtube.com/c/Penpot) or [Mastodon](https://fosstodon.org/@penpot/).
- Participate in the [Community](https://community.penpot.app/) asking and answering questions, reacting to others articles or opening your own conversations.
- Star this repo and follow us on Social Media: [Mastodon](https://fosstodon.org/@penpot/), [Youtube](https://www.youtube.com/c/Penpot), [Instagram](https://instagram.com/penpot.app), [Linkedin](https://www.linkedin.com/company/penpotdesign), [Peertube](https://peertube.kaleidos.net/a/penpot_app) and [X](https://twitter.com/penpotapp).
- Participate in the [Community](https://community.penpot.app/) space by asking and answering questions; reacting to others articles; opening your own conversations and following along on decisions affecting the project.
- Report bugs with our easy [guide for bugs hunting](https://help.penpot.app/contributing-guide/reporting-bugs/) or [GitHub issues](https://github.com/penpot/penpot/issues)
- Create and [share Libraries & templates](https://penpot.app/libraries-templates.html) that will be helpful for the community
- Become a [translator](https://help.penpot.app/contributing-guide/translations)
- Give feedback: [Mail us](mailto:support@penpot.app)
- Give feedback: [Email us](mailto:support@penpot.app)
- **Contribute to Penpot's code:** [Watch this video](https://www.youtube.com/watch?v=TpN0osiY-8k) by Alejandro Alonso, CIO and developer at Penpot, where he gives us a hands-on demo of how to use Penpots repository and make changes in both front and back end
To find (almost) everything you need to know on how to contribute to Penpot, refer to the [contributing-guide](https://help.penpot.app/contributing-guide/).
To find (almost) everything you need to know on how to contribute to Penpot, refer to the [contributing guide](https://help.penpot.app/contributing-guide/).
<br />
<p align="center">
<img src="https://penpot.app/images/readme/git-community.png" alt="Contributing" style="width: 65%;">
<img src="https://github.com/penpot/penpot/assets/5446186/fea18923-dc06-49be-86ad-c3496a7956e6" alt="Libraries and templates" style="width: 65%;">
</p>
<br />
## Resources ##
You can ask and answer questions, have open-ended conversations, and follow along on decisions affecting the project.
@@ -141,4 +167,4 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
Copyright (c) KALEIDOS INC
```
Penpot is a Kaleidos [open source project](https://kaleidos.net/products)
Penpot is a Kaleidos [open source project](https://kaleidos.net/)
+8
View File
@@ -2,12 +2,19 @@
We want to thank to the amazing people that help us! Thank you! You're the best!
Feel free you make a PR updating this file if you miss you in the
list.
## Security
* Husnain Iqbal (CEO OF ALPHA INFERNO PVT LTD)
* [Shiraz Ali Khan](https://www.linkedin.com/in/shiraz-ali-khan-1ba508180/)
* Vaibhav Shukla
* Hassan Ahmed (Alias Xen Lee)
* Michal Biesiada (@mbiesiad)
## Internationalization
* [00ff88](https://hosted.weblate.org/user/00ff88)
* [AhmadHB](https://hosted.weblate.org/user/AhmadHB)
* [Aimee](https://hosted.weblate.org/user/Aimee)
@@ -89,6 +96,7 @@ We want to thank to the amazing people that help us! Thank you! You're the best!
* [zcraber](https://hosted.weblate.org/user/zcraber)
## Libraries & templates
* systxema
* plumilla
* victor crespo
+19 -21
View File
@@ -3,10 +3,10 @@
:deps
{penpot/common {:local/root "../common"}
org.clojure/clojure {:mvn/version "1.12.0-alpha5"}
org.clojure/tools.namespace {:mvn/version "1.4.4"}
org.clojure/clojure {:mvn/version "1.12.0-alpha12"}
org.clojure/tools.namespace {:mvn/version "1.5.0"}
com.github.luben/zstd-jni {:mvn/version "1.5.5-10"}
com.github.luben/zstd-jni {:mvn/version "1.5.6-3"}
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.2.6.RELEASE"}
io.lettuce/lettuce-core {:mvn/version "6.3.2.RELEASE"}
java-http-clj/java-http-clj {:mvn/version "0.4.3"}
funcool/yetti
@@ -26,12 +26,13 @@
:git/url "https://github.com/funcool/yetti.git"
:exclusions [org.slf4j/slf4j-api]}
com.github.seancorfield/next.jdbc {:mvn/version "1.3.894"}
metosin/reitit-core {:mvn/version "0.6.0"}
nrepl/nrepl {:mvn/version "1.1.0"}
cider/cider-nrepl {:mvn/version "0.43.1"}
com.github.seancorfield/next.jdbc {:mvn/version "1.3.939"}
metosin/reitit-core {:mvn/version "0.7.0"}
nrepl/nrepl {:mvn/version "1.1.2"}
cider/cider-nrepl {:mvn/version "0.48.0"}
org.postgresql/postgresql {:mvn/version "42.6.0"}
org.postgresql/postgresql {:mvn/version "42.7.3"}
org.xerial/sqlite-jdbc {:mvn/version "3.46.0.0"}
com.zaxxer/HikariCP {:mvn/version "5.1.0"}
@@ -42,7 +43,7 @@
com.github.ben-manes.caffeine/caffeine {:mvn/version "3.1.8"}
org.jsoup/jsoup {:mvn/version "1.16.2"}
org.jsoup/jsoup {:mvn/version "1.17.2"}
org.im4java/im4java
{:git/tag "1.4.0-penpot-2"
:git/sha "e2b3e16"
@@ -53,11 +54,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.11.7"}
markdown-clj/markdown-clj {:mvn/version "1.12.1"}
;; Pretty Print specs
pretty-spec/pretty-spec {:mvn/version "0.1.4"}
software.amazon.awssdk/s3 {:mvn/version "2.20.138"}
software.amazon.awssdk/s3 {:mvn/version "2.25.63"}
}
:paths ["src" "resources" "target/classes"]
@@ -73,16 +74,13 @@
:build
{:extra-deps
{io.github.clojure/tools.build {:git/tag "v0.9.5" :git/sha "24f2894"}}
{io.github.clojure/tools.build {:git/tag "v0.10.3" :git/sha "15ead66"}}
:ns-default build}
:test
{:extra-paths ["test"]
:extra-deps
{io.github.cognitect-labs/test-runner
{:git/tag "v0.5.1" :git/sha "dfb30dd"}}
:main-opts ["-m" "cognitect.test-runner"]
:exec-fn cognitect.test-runner.api/test}
{:main-opts ["-m" "kaocha.runner"]
:jvm-opts ["-Dlog4j2.configurationFile=log4j2-devenv-repl.xml"]
:extra-deps {lambdaisland/kaocha {:mvn/version "1.91.1392"}}}
:outdated
{:extra-deps {com.github.liquidz/antq {:mvn/version "RELEASE"}}
@@ -90,8 +88,8 @@
:jmx-remote
{:jvm-opts ["-Dcom.sun.management.jmxremote"
"-Dcom.sun.management.jmxremote.port=9090"
"-Dcom.sun.management.jmxremote.rmi.port=9090"
"-Dcom.sun.management.jmxremote.port=9091"
"-Dcom.sun.management.jmxremote.rmi.port=9091"
"-Dcom.sun.management.jmxremote.local.only=false"
"-Dcom.sun.management.jmxremote.authenticate=false"
"-Dcom.sun.management.jmxremote.ssl=false"
+16 -7
View File
@@ -7,7 +7,9 @@
(ns user
(:require
[app.common.data :as d]
[app.common.debug :as debug]
[app.common.exceptions :as ex]
[app.common.files.helpers :as cfh]
[app.common.fressian :as fres]
[app.common.geom.matrix :as gmt]
[app.common.logging :as l]
@@ -18,6 +20,7 @@
[app.common.schema.desc-native :as smdn]
[app.common.schema.generators :as sg]
[app.common.spec :as us]
[app.common.json :as json]
[app.common.transit :as t]
[app.common.types.file :as ctf]
[app.common.uuid :as uuid]
@@ -27,7 +30,6 @@
[app.srepl.helpers :as srepl.helpers]
[app.srepl.main :as srepl]
[app.util.blob :as blob]
[app.util.json :as json]
[app.util.time :as dt]
[clj-async-profiler.core :as prof]
[clojure.contrib.humanize :as hum]
@@ -42,7 +44,7 @@
[clojure.walk :refer [macroexpand-all]]
[criterium.core :as crit]
[cuerdas.core :as str]
[datoteka.core]
[datoteka.fs :as fs]
[integrant.core :as ig]
[malli.core :as m]
[malli.dev.pretty :as mdp]
@@ -54,8 +56,12 @@
[promesa.exec :as px]))
(repl/disable-reload! (find-ns 'integrant.core))
(repl/disable-reload! (find-ns 'app.common.debug))
(set! *warn-on-reflection* true)
(add-tap #'debug/tap-handler)
;; --- Benchmarking Tools
(defmacro run-quick-bench
@@ -131,8 +137,11 @@
;; :v6 v6
;; }])))
(defonce debug-tap
(do
(add-tap #(locking debug-tap
(prn "tap debug:" %)))
1))
(defn calculate-frames
[{:keys [data]}]
(->> (vals (:pages-index data))
(mapcat (comp vals :objects))
(filter cfh/is-direct-child-of-root?)
(filter cfh/frame-shape?)
(count)))
+5 -5
View File
@@ -4,19 +4,19 @@
"license": "MPL-2.0",
"author": "Kaleidos INC",
"private": true,
"packageManager": "yarn@4.0.2",
"packageManager": "yarn@4.3.1",
"repository": {
"type": "git",
"url": "https://github.com/penpot/penpot"
},
"dependencies": {
"luxon": "^3.4.2",
"sax": "^1.2.4"
"luxon": "^3.4.4",
"sax": "^1.4.1"
},
"devDependencies": {
"nodemon": "^3.0.1",
"nodemon": "^3.1.2",
"source-map-support": "^0.5.21",
"ws": "^8.13.0"
"ws": "^8.17.0"
},
"scripts": {
"fmt:clj:check": "cljfmt check --parallel=false src/ test/",
+47 -267
View File
@@ -1,5 +1,6 @@
<!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">
<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>
@@ -110,15 +111,20 @@
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%">
<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;">
<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" />
<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>
@@ -151,7 +157,8 @@
<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%;">
<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;">
@@ -164,29 +171,43 @@
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%">
<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}}!</div>
<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;">We received a request to change your current email to {{ pending-email }}.</div>
<div
style="font-family:Source Sans Pro, sans-serif;font-size:16px;line-height:150%;text-align:left;color:#000000;">
We received a request to change your current email to {{ pending-email }}.</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;">Click to the link below to confirm the change:</div>
<div
style="font-family:Source Sans Pro, sans-serif;font-size:16px;line-height:150%;text-align:left;color:#000000;">
Click to the link below to confirm the change:</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%;">
<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="#31EFB8" role="presentation" style="border:none;border-radius:3px;cursor:auto;mso-padding-alt:10px 25px;background:#31EFB8;" 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"> Confirm email change </a>
<td align="center" bgcolor="#31EFB8" role="presentation"
style="border:none;border-radius:3px;cursor:auto;mso-padding-alt:10px 25px;background:#31EFB8;"
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"> Confirm email change </a>
</td>
</tr>
</table>
@@ -194,17 +215,24 @@
</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;">If you received this email by mistake, please consider changing your password for security reasons.</div>
<div
style="font-family:Source Sans Pro, sans-serif;font-size:16px;line-height:150%;text-align:left;color:#000000;">
If you received this email by mistake, please consider changing your password for security
reasons.</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;">Enjoy!</div>
<div
style="font-family:Source Sans Pro, sans-serif;font-size:16px;line-height:150%;text-align:left;color:#000000;">
Enjoy!</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;">The Penpot team.</div>
<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>
@@ -221,257 +249,9 @@
</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="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:24px 0 0 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
{% include "app/email/includes/footer.html" %}
<tr>
<td
class="" style="vertical-align:top;width:425px;"
>
<![endif]-->
<div class="mj-column-px-425 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="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div style="font-family:Source Sans Pro, sans-serif;font-size:14px;line-height:150%;text-align:center;color:#64666A;">Penpot is the first Open Source design and prototyping platform meant for cross-domain teams.</div>
</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="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="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<!--[if mso | IE]>
<table
align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
>
<tr>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
<tr>
<td style="padding:0 8px;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://penpot.app/" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-uxbox.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
<tr>
<td style="padding:0 8px;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://twitter.com/penpotapp" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-twitter.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
<tr>
<td style="padding:0 8px;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://github.com/penpot/" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-github.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
<tr>
<td style="padding:0 8px;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://www.instagram.com/penpot.app/" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-instagram.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
<tr>
<td style="padding:0 8px;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://tree.taiga.io/project/penpot" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-taiga.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</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="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 0 24px 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="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div style="font-family:Source Sans Pro, sans-serif;font-size:14px;line-height:150%;text-align:center;color:#64666A;">Penpot | Made with &lt;3 and Open Source</div>
</td>
</tr>
</table>
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</tbody>
</table>
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</div>
</body>
@@ -1,4 +1,4 @@
Hello {{name}}!
Hello {{name|abbreviate:25}}!
We received a request to change your current email to {{ pending-email }}.
+2 -2
View File
@@ -11,7 +11,7 @@
{% if profile %}
<span>
<span>Name: </span>
<span><code>{{profile.fullname}}</code></span>
<span><code>{{profile.fullname|abbreviate:25}}</code></span>
</span>
<br />
@@ -34,7 +34,7 @@
</p>
<p>
<strong>Subject:</strong><br />
<span>{{subject}}</span>
<span>{{subject|abbreviate:300}}</span>
</p>
<p>
@@ -0,0 +1,323 @@
<!--[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="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:24px 0 0 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:425px;"
>
<![endif]-->
<div class="mj-column-px-425 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="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div
style="font-family:Source Sans Pro, sans-serif;font-size:14px;line-height:150%;text-align:center;color:#64666A;">
Penpot is the first Open Source design and prototyping platform meant for
cross-domain teams.
</div>
</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="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="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<!--[if mso | IE]>
<table
align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
>
<tr>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
style="float:none;display:inline-table;">
<tr>
<td style="padding:0 8px;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-radius:3px;width:24px;">
<tr>
<td
style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://penpot.app/" target="_blank">
<img height="24"
src="{{ public-uri }}/images/email/logo-uxbox.png"
style="border-radius:3px;display:block;"
width="24" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
style="float:none;display:inline-table;">
<tr>
<td style="padding:0 8px;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-radius:3px;width:24px;">
<tr>
<td
style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://x.com/penpotapp" target="_blank">
<img height="24"
src="{{ public-uri }}/images/email/logo-x.png"
style="border-radius:3px;display:block;"
width="24" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
style="float:none;display:inline-table;">
<tr>
<td style="padding:0 8px;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-radius:3px;width:24px;">
<tr>
<td
style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://github.com/penpot/" target="_blank">
<img height="24"
src="{{ public-uri }}/images/email/logo-github.png"
style="border-radius:3px;display:block;"
width="24" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
style="float:none;display:inline-table;">
<tr>
<td style="padding:0 8px;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-radius:3px;width:24px;">
<tr>
<td
style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://www.linkedin.com/company/penpotdesign/"
target="_blank">
<img height="24"
src="{{ public-uri }}/images/email/logo-linkedin.png"
style="border-radius:3px;display:block;"
width="24" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
style="float:none;display:inline-table;">
<tr>
<td style="padding:0 8px;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-radius:3px;width:24px;">
<tr>
<td
style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://fosstodon.org/@penpot/" target="_blank">
<img height="24"
src="{{ public-uri }}/images/email/logo-mastodon.png"
style="border-radius:3px;display:block;"
width="24" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
style="float:none;display:inline-table;">
<tr>
<td style="padding:0 8px;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation"
style="border-radius:3px;width:24px;">
<tr>
<td
style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://tree.taiga.io/project/penpot"
target="_blank">
<img height="24"
src="{{ public-uri }}/images/email/logo-taiga.png"
style="border-radius:3px;display:block;"
width="24" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</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="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 0 24px 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="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div
style="font-family:Source Sans Pro, sans-serif;font-size:14px;line-height:150%;text-align:center;color:#64666A;">
Penpot | Made with &lt;3 and Open Source</div>
</td>
</tr>
</table>
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</tbody>
</table>
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
@@ -1,5 +1,6 @@
<!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">
<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>
@@ -110,15 +111,20 @@
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%">
<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;">
<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" />
<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>
@@ -151,7 +157,8 @@
<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%;">
<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;">
@@ -164,24 +171,36 @@
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%">
<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!</div>
<div
style="font-family:Source Sans Pro, sans-serif;font-size:24px;font-weight:600;line-height:150%;text-align:left;color:#000000;">
Hello!</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;">{{invited-by}} has invited you to join the team “{{ team }}”.</div>
<div
style="font-family:Source Sans Pro, sans-serif;font-size:16px;line-height:150%;text-align:left;color:#000000;">
{{invited-by|abbreviate:25}} has invited you to join the team “{{ team|abbreviate:25 }}”.</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%;">
<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="#31EFB8" role="presentation" style="border:none;border-radius:3px;cursor:auto;mso-padding-alt:10px 25px;background:#31EFB8;" 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>
<td align="center" bgcolor="#31EFB8" role="presentation"
style="border:none;border-radius:3px;cursor:auto;mso-padding-alt:10px 25px;background:#31EFB8;"
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>
</td>
</tr>
</table>
@@ -189,12 +208,16 @@
</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;">Enjoy!</div>
<div
style="font-family:Source Sans Pro, sans-serif;font-size:16px;line-height:150%;text-align:left;color:#000000;">
Enjoy!</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;">The Penpot team.</div>
<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>
@@ -211,257 +234,9 @@
</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="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:24px 0 0 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
{% include "app/email/includes/footer.html" %}
<tr>
<td
class="" style="vertical-align:top;width:425px;"
>
<![endif]-->
<div class="mj-column-px-425 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="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div style="font-family:Source Sans Pro, sans-serif;font-size:14px;line-height:150%;text-align:center;color:#64666A;">Penpot is the first Open Source design and prototyping platform meant for cross-domain teams.</div>
</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="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="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<!--[if mso | IE]>
<table
align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
>
<tr>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
<tr>
<td style="padding:0 8px;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://penpot.app/" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-uxbox.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
<tr>
<td style="padding:0 8px;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://twitter.com/penpotapp" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-twitter.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
<tr>
<td style="padding:0 8px;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://github.com/penpot/" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-github.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
<tr>
<td style="padding:0 8px;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://www.instagram.com/penpot.app/" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-instagram.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
<tr>
<td style="padding:0 8px;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://tree.taiga.io/project/penpot" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-taiga.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</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="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 0 24px 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="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div style="font-family:Source Sans Pro, sans-serif;font-size:14px;line-height:150%;text-align:center;color:#64666A;">Penpot | Made with &lt;3 and Open Source</div>
</td>
</tr>
</table>
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</tbody>
</table>
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</div>
</body>
@@ -1,6 +1,6 @@
Hello!
{{invited-by}} has invited you to join the team “{{ team }}”.
{{invited-by|abbreviate:25}} has invited you to join the team “{{ team|abbreviate:25 }}”.
Accept invitation using this link:
@@ -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!</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;">
As you requested, {{invited-by|abbreviate:25}} has added you to the team “{{
team|abbreviate:25}}”.</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="#31EFB8" role="presentation"
style="border:none;border-radius:3px;cursor:auto;mso-padding-alt:10px 25px;background:#31EFB8;"
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>
</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;">
Enjoy!</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;">
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>
@@ -0,0 +1 @@
You have joined {{team}}
@@ -0,0 +1,10 @@
Hello!
As you requested, {{invited-by|abbreviate:25}} has added you to the team “{{ team|abbreviate:25}}”.
Go to the team with this link:
{{ public-uri }}/#/dashboard/team/{{team-id}}
Enjoy!
The Penpot team.
@@ -1,5 +1,6 @@
<!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">
<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>
@@ -110,15 +111,20 @@
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%">
<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;">
<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" />
<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>
@@ -151,7 +157,8 @@
<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%;">
<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;">
@@ -164,24 +171,37 @@
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%">
<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}}!</div>
<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;">We have received a request to reset your password. Click the link below to choose a new one:</div>
<div
style="font-family:Source Sans Pro, sans-serif;font-size:16px;line-height:150%;text-align:left;color:#000000;">
We have received a request to reset your password. Click the link below to choose a new one:
</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%;">
<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="#31EFB8" role="presentation" style="border:none;border-radius:3px;cursor:auto;mso-padding-alt:10px 25px;background:#31EFB8;" 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>
<td align="center" bgcolor="#31EFB8" role="presentation"
style="border:none;border-radius:3px;cursor:auto;mso-padding-alt:10px 25px;background:#31EFB8;"
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>
</td>
</tr>
</table>
@@ -189,17 +209,24 @@
</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;">If you received this email by mistake, you can safely ignore it. Your password won't be changed.</div>
<div
style="font-family:Source Sans Pro, sans-serif;font-size:16px;line-height:150%;text-align:left;color:#000000;">
If you received this email by mistake, you can safely ignore it. Your password won't be changed.
</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;">Enjoy!</div>
<div
style="font-family:Source Sans Pro, sans-serif;font-size:16px;line-height:150%;text-align:left;color:#000000;">
Enjoy!</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;">The Penpot team.</div>
<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>
@@ -216,257 +243,9 @@
</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="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:24px 0 0 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
{% include "app/email/includes/footer.html" %}
<tr>
<td
class="" style="vertical-align:top;width:425px;"
>
<![endif]-->
<div class="mj-column-px-425 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="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div style="font-family:Source Sans Pro, sans-serif;font-size:14px;line-height:150%;text-align:center;color:#64666A;">Penpot is the first Open Source design and prototyping platform meant for cross-domain teams.</div>
</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="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="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<!--[if mso | IE]>
<table
align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
>
<tr>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
<tr>
<td style="padding:0 8px;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://penpot.app/" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-uxbox.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
<tr>
<td style="padding:0 8px;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://twitter.com/penpotapp" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-twitter.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
<tr>
<td style="padding:0 8px;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://github.com/penpot/" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-github.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
<tr>
<td style="padding:0 8px;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://www.instagram.com/penpot.app/" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-instagram.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
<tr>
<td style="padding:0 8px;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://tree.taiga.io/project/penpot" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-taiga.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</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="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 0 24px 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="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div style="font-family:Source Sans Pro, sans-serif;font-size:14px;line-height:150%;text-align:center;color:#64666A;">Penpot | Made with &lt;3 and Open Source</div>
</td>
</tr>
</table>
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</tbody>
</table>
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</div>
</body>
@@ -1,4 +1,4 @@
Hello {{name}}!
Hello {{name|abbreviate:25}}!
We received a request to reset your password. Click the link below to choose a
new one:
+42 -266
View File
@@ -1,5 +1,6 @@
<!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">
<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>
@@ -110,15 +111,20 @@
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%">
<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;">
<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" />
<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>
@@ -151,7 +157,8 @@
<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%;">
<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;">
@@ -164,24 +171,37 @@
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%">
<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}}!</div>
<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;">Thanks for signing up for your Penpot account! Please verify your email using the link below and get started building mockups and prototypes today!</div>
<div
style="font-family:Source Sans Pro, sans-serif;font-size:16px;line-height:150%;text-align:left;color:#000000;">
Thanks for signing up for your Penpot account! Please verify your email using the link below and
get started building mockups and prototypes today!</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%;">
<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="#31EFB8" role="presentation" style="border:none;border-radius:3px;cursor:auto;mso-padding-alt:10px 25px;background:#31EFB8;" 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>
<td align="center" bgcolor="#31EFB8" role="presentation"
style="border:none;border-radius:3px;cursor:auto;mso-padding-alt:10px 25px;background:#31EFB8;"
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>
</td>
</tr>
</table>
@@ -189,12 +209,16 @@
</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;">Enjoy!</div>
<div
style="font-family:Source Sans Pro, sans-serif;font-size:16px;line-height:150%;text-align:left;color:#000000;">
Enjoy!</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;">The Penpot team.</div>
<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>
@@ -211,258 +235,10 @@
</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="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:24px 0 0 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
{% include "app/email/includes/footer.html" %}
<tr>
<td
class="" style="vertical-align:top;width:425px;"
>
<![endif]-->
<div class="mj-column-px-425 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="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div style="font-family:Source Sans Pro, sans-serif;font-size:14px;line-height:150%;text-align:center;color:#64666A;">Penpot is the first Open Source design and prototyping platform meant for cross-domain teams.</div>
</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="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="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<!--[if mso | IE]>
<table
align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
>
<tr>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
<tr>
<td style="padding:0 8px;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://penpot.app/" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-uxbox.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
<tr>
<td style="padding:0 8px;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://twitter.com/penpotapp" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-twitter.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
<tr>
<td style="padding:0 8px;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://github.com/penpot/" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-github.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
<tr>
<td style="padding:0 8px;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://www.instagram.com/penpot.app/" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-instagram.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
<tr>
<td style="padding:0 8px;">
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://tree.taiga.io/project/penpot" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-taiga.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</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="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 0 24px 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="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div style="font-family:Source Sans Pro, sans-serif;font-size:14px;line-height:150%;text-align:center;color:#64666A;">Penpot | Made with &lt;3 and Open Source</div>
</td>
</tr>
</table>
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</tbody>
</table>
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</div>
</body>
</html>
</html>
+1 -1
View File
@@ -1,4 +1,4 @@
Hello {{name}}!
Hello {{name|abbreviate:25}}!
Thanks for signing up for your Penpot account! Please verify your email using the
link below and get started building mockups and prototypes today!
@@ -0,0 +1,254 @@
<!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!</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;">
<p>
{{requested-by|abbreviate:25}} ({{requested-by-email}}) wants to have view-only access to the
file named “{{file-name|abbreviate:25}}”.
</p>
<p>
Since this file is in your Penpot team, you can provide access by sending a view-only link.
This will allow {{requested-by|abbreviate:25}} to view the content without making any changes.
</p>
<p>To proceed, please click the button below to generate and send the view-only link:</p>
</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="#31EFB8" role="presentation"
style="border:none;border-radius:3px;cursor:auto;mso-padding-alt:10px 25px;background:#31EFB8;"
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>
</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;">
<p>If you do not wish to grant access at this time, you can simply disregard this email.</p>
<p>Thank you</p>
</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;">
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>
@@ -0,0 +1 @@
Request View-Only Access to “{{file-name|abbreviate:25}}”
@@ -0,0 +1,17 @@
Hello!
{{requested-by|abbreviate:25}} ({{requested-by-email}}) wants to have view-only access to the file named “{{file-name|abbreviate:25}}”.
Since this file is in your Penpot team, you can provide access by sending a view-only link. This will allow {{requested-by|abbreviate:25}} to view the content without making any changes.
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
If you do not wish to grant access at this time, you can simply disregard this email.
Thank you
The Penpot team.
@@ -0,0 +1,277 @@
<!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!</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;">
<p>
{{requested-by|abbreviate:25}} ({{requested-by-email}}) has requested access to the file named
“{{file-name|abbreviate:25}}”.
</p>
<p>
Please note that the file is currently in Your Penpot 's team, so direct access cannot be
granted. However, you have two options to provide the requested access:
</p>
<ul>
<li>
<p>Move the File to Another Team:</p>
<p>You can move the file to another team and then give access to that team, inviting
{{requested-by|abbreviate:25}}.</p>
</li>
</ul>
</p>
</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;">
<ul>
<li>
<p>Send a View-Only Link:</p>
<p>Alternatively, you can create and share a view-only link to the file. This will allow
{{requested-by|abbreviate:25}} to view the content without making any changes.</p>
<p>Click the button below to generate and send the link:</p>
</li>
</ul>
</p>
</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="#31EFB8" role="presentation"
style="border:none;border-radius:3px;cursor:auto;mso-padding-alt:10px 25px;background:#31EFB8;"
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>
</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;">
<p>If you do not wish to grant access at this time, you can simply disregard this email.</p>
<p>Thank you</p>
</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;">
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>
@@ -0,0 +1 @@
Request Access to “{{file-name|abbreviate:25}}”
@@ -0,0 +1,30 @@
Hello!
Hello!
{{requested-by|abbreviate:25}} ({{requested-by-email}}) has requested access to the file named “{{file-name|abbreviate:25}}”.
Please note that the file is currently in Your Penpot 's team, so direct access cannot be granted. However, you have two options to provide the requested access:
- Move the File to Another Team:
You can move the file to another team and then give access to that team, inviting {{requested-by|abbreviate:25}}.
- Send a View-Only Link:
Alternatively, you can create and share a view-only link to the file. This will allow {{requested-by|abbreviate:25}} to view the content without making any changes.
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
If you do not wish to grant access at this time, you can simply disregard this email.
Thank you
The Penpot team.
@@ -0,0 +1,295 @@
<!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!</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;">
<p>
{{requested-by|abbreviate:25}} ({{requested-by-email}}) has requested access to the file named
“{{file-name|abbreviate:25}}”.
</p>
<p>
To provide this access, you have the following options:
</p>
<ul>
<li>
<p>Give Access to the “{{team-name|abbreviate:25}}” Team:</p>
<p>This will automatically include {{requested-by|abbreviate:25}} in the team, so the user
can see all the projects and files in it.</p>
<p>Click the button below to provide team access:</p>
</li>
</ul>
</p>
</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="#31EFB8" role="presentation"
style="border:none;border-radius:3px;cursor:auto;mso-padding-alt:10px 25px;background:#31EFB8;"
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>
</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;">
<ul>
<li>
<p>Send a View-Only Link:</p>
<p>Alternatively, you can create and share a view-only link to the file. This will allow
{{requested-by|abbreviate:25}} to view the content without making any changes.</p>
<p>Click the button below to generate and send the link:</p>
</li>
</ul>
</p>
</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="#31EFB8" role="presentation"
style="border:none;border-radius:3px;cursor:auto;mso-padding-alt:10px 25px;background:#31EFB8;"
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>
</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;">
<p>If you do not wish to grant access at this time, you can simply disregard this email.</p>
<p>Thank you</p>
</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;">
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>
@@ -0,0 +1 @@
Request Access to “{{file-name|abbreviate:25}}”
@@ -0,0 +1,34 @@
Hello!
Hello!
{{requested-by|abbreviate:25}} ({{requested-by-email}}) has requested access to the file named “{{file-name|abbreviate:25}}”.
To provide this access, you have the following options:
- Give Access to the “{{team-name|abbreviate:25}}” Team:
This will automatically include {{requested-by|abbreviate:25}} in the team, so the user can see all the projects and files in it.
Click the link below to provide team access:
{{ public-uri }}/#/dashboard/team/{{team-id}}/members?invite-email={{requested-by-email|urlescape}}
- Send a View-Only Link:
Alternatively, you can create and share a view-only link to the file. This will allow {{requested-by|abbreviate:25}} to view the content without making any changes.
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
If you do not wish to grant access at this time, you can simply disregard this email.
Thank you
The Penpot team.
@@ -0,0 +1,252 @@
<!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!</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;">
<p>
{{requested-by|abbreviate:25}} ({{requested-by-email}}) wants to have access to the
“{{team-name|abbreviate:25}}” Team.
</p>
<p>
To provide access, please click the button below:
</p>
</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="#31EFB8" role="presentation"
style="border:none;border-radius:3px;cursor:auto;mso-padding-alt:10px 25px;background:#31EFB8;"
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>
</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;">
<p>If you do not wish to grant access at this time, you can simply disregard this email.</p>
<p>Thank you</p>
</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;">
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>
@@ -0,0 +1 @@
Request Access to “{{team-name|abbreviate:25}}”
@@ -0,0 +1,14 @@
Hello!
{{requested-by|abbreviate:25}} ({{requested-by-email}}) wants to have access to the “{{team-name|abbreviate:25}}” Team.
To provide access, please click the link below:
{{ public-uri }}/#/dashboard/team/{{team-id}}/members?invite-email={{requested-by-email|urlescape}}
If you do not wish to grant access at this time, you can simply disregard this email.
Thank you
The Penpot team.
+37 -25
View File
@@ -1,30 +1,42 @@
[{:id "material-design-3"
:name "Material Design 3"
:file-uri "https://github.com/penpot/penpot-files/raw/main/Material%20Design%203.penpot"}
[{:id "wireframing-kit"
:name "Wireframe library"
:file-uri "https://github.com/penpot/penpot-files/raw/main/wireframing-kit.penpot"}
{:id "prototype-examples"
:name "Prototype template"
:file-uri "https://github.com/penpot/penpot-files/raw/main/prototype-examples.penpot"}
{:id "plants-app"
:name "UI mockup example"
:file-uri "https://github.com/penpot/penpot-files/raw/main/Plants-app.penpot"}
{:id "penpot-design-system"
:name "Design system example"
:file-uri "https://github.com/penpot/penpot-files/raw/main/Penpot-Design-system.penpot"}
{:id "tutorial-for-beginners"
:name "Tutorial for beginners"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/tutorial-for-beginners.penpot"}
{:id "penpot-design-system"
:name "Penpot Design System"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Penpot-Design-system.penpot"}
:file-uri "https://github.com/penpot/penpot-files/raw/main/tutorial-for-beginners.penpot"}
{:id "lucide-icons"
:name "Lucide Icons"
:file-uri "https://github.com/penpot/penpot-files/raw/main/Lucide-icons.penpot"}
{:id "font-awesome"
:name "Font Awesome"
:file-uri "https://github.com/penpot/penpot-files/raw/main/FontAwesome.penpot"}
{:id "black-white-mobile-templates"
:name "Black & White Mobile Templates"
:file-uri "https://github.com/penpot/penpot-files/raw/main/Black-&-White-Mobile-Templates.penpot"}
{:id "avataaars"
:name "Avataaars"
:file-uri "https://github.com/penpot/penpot-files/raw/main/Avataaars-by-Pablo-Stanley.penpot"}
{:id "ux-notes"
:name "UX Notes"
:file-uri "https://github.com/penpot/penpot-files/raw/main/UX-Notes.penpot"}
{:id "whiteboarding-kit"
:name "Whiteboarding Kit"
:file-uri "https://github.com/penpot/penpot-files/raw/main/Whiteboarding-mapping-kit.penpot"}
{:id "open-color-scheme"
:name "Open Color Scheme"
:file-uri "https://github.com/penpot/penpot-files/raw/main/Open%20Color%20Scheme%20(v1.9.1).penpot"}
{:id "flex-layout-playground"
:name "Flex Layout Playground"
:file-uri "https://github.com/penpot/penpot-files/raw/main/Flex%20Layout%20Playground.penpot"}
{:id "wireframing-kit"
:name "Wireframing Kit"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/wireframing-kit.penpot"}
{:id "ant-design"
:name "Ant Design UI Kit (lite)"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Ant-Design-UI-Kit-Lite.penpot"}
{:id "cocomaterial"
:name "Cocomaterial"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Cocomaterial.penpot"}
{:id "circum-icons"
:name "Circum Icons pack"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/CircumIcons.penpot"}
{:id "coreui"
:name "CoreUI"
:file-uri "https://github.com/penpot/penpot-files/raw/main/CoreUI%20DesignSystem%20(DEMO).penpot"}
{:id "whiteboarding-kit"
:name "Whiteboarding Kit"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Whiteboarding-mapping-kit.penpot"}]
{:id "welcome"
:name "Welcome"
:file-uri "https://github.com/penpot/penpot-files/raw/main/welcome.penpot"}]
@@ -20,12 +20,19 @@
<span>WEBHOOK</span>
</span>
{% endif %}
{% if item.params-schema-js %}
<span class="tag">
<span>SCHEMA</span>
</span>
{% endif %}
{% if item.spec %}
<span class="tag">
<span>SPEC</span>
</span>
{% endif %}
{% if item.sse %}
<span class="tag">
<span>SSE</span>
@@ -37,6 +37,13 @@
<h2>GENERAL NOTES</h2>
<h3>HTTP Transport & Methods</h3>
<p>The HTTP is the transport method for accesing this API; all
functions can be called using POST HTTP method; the functions
that starts with <b>get-</b> in the name, can use GET HTTP
method which in many cases benefits from the HTTP cache.</p>
<h3>Authentication</h3>
<p>The penpot backend right now offers two way for authenticate the request:
<b>cookies</b> (the same mechanism that we use ourselves on accessing the API from the
+1 -12
View File
@@ -145,17 +145,6 @@ Debug Main Page
</small>
</div>
<div class="row">
<label>Ignore index errors?</label>
<input type="checkbox" name="ignore-index-errors" checked/>
<br />
<small>
Do not break on index lookup errors (remap operation).
Useful when importing a broken file that has broken
relations or missing pieces.
</small>
</div>
<div class="row">
<input type="submit" name="upload" value="Upload" />
</div>
@@ -168,7 +157,7 @@ Debug Main Page
<legend>Reset file version</legend>
<desc>Allows reset file data version to a specific number/</desc>
<form method="post" action="/dbg/actions/reset-file-data-version">
<form method="post" action="/dbg/actions/reset-file-version">
<div class="row">
<input type="text" style="width:300px" name="file-id" placeholder="file-id" />
</div>
+15 -4
View File
@@ -3,15 +3,26 @@
;; Optional: queue, ommited means Integer/MAX_VALUE
;; Optional: timeout, ommited means no timeout
;; Note: queue and timeout are excluding
{:update-file/by-profile
{:update-file/global {:permits 20}
:update-file/by-profile
{:permits 1 :queue 5}
:update-file/global {:permits 20}
:process-font/global {:permits 4}
:process-font/by-profile {:permits 1}
:derive-password/global {:permits 8}
:process-font/global {:permits 4}
:process-image/global {:permits 8}
:process-image/by-profile {:permits 1}
:auth/global {:permits 8}
:root/global
{:permits 40}
:root/by-profile
{:permits 10}
:file-thumbnail-ops/global
{:permits 20}
:file-thumbnail-ops/by-profile
{:permits 2}
+52
View File
@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info" monitorInterval="30">
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss.SSS}] %level{length=1} %logger{36} - %msg%n"
alwaysWriteExceptions="true" />
</Console>
<RollingFile name="main" fileName="logs/main-latest.log" filePattern="logs/main-%i.log">
<PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss.SSS}] %level{length=1} %logger{36} - %msg%n"
alwaysWriteExceptions="true" />
<Policies>
<SizeBasedTriggeringPolicy size="50M"/>
</Policies>
<DefaultRolloverStrategy max="20"/>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="io.lettuce" level="error" />
<Logger name="com.zaxxer.hikari" level="error"/>
<Logger name="org.postgresql" level="error" />
<Logger name="app.binfile" level="debug" />
<Logger name="app.storage.tmp" level="info" />
<Logger name="app.worker" level="trace" />
<Logger name="app.msgbus" level="info" />
<Logger name="app.http.websocket" level="info" />
<Logger name="app.http.sse" level="info" />
<Logger name="app.util.websocket" level="info" />
<Logger name="app.redis" level="info" />
<Logger name="app.rpc.rlimit" level="info" />
<Logger name="app.rpc.climit" level="debug" />
<Logger name="app.common.files.migrations" level="debug" />
<Logger name="app.loggers" level="debug" additivity="false">
<AppenderRef ref="main" level="debug" />
</Logger>
<Logger name="app" level="all" additivity="false">
<AppenderRef ref="main" level="trace" />
</Logger>
<Logger name="user" level="trace" additivity="false">
<AppenderRef ref="main" level="trace" />
</Logger>
<Root level="info">
<AppenderRef ref="main" />
</Root>
</Loggers>
</Configuration>
+10 -6
View File
@@ -6,13 +6,13 @@
alwaysWriteExceptions="true" />
</Console>
<RollingFile name="main" fileName="logs/main.log" filePattern="logs/main-%i.log">
<RollingFile name="main" fileName="logs/main-latest.log" filePattern="logs/main-%i.log">
<PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss.SSS}] %level{length=1} %logger{36} - %msg%n"
alwaysWriteExceptions="true" />
<Policies>
<SizeBasedTriggeringPolicy size="50M"/>
</Policies>
<DefaultRolloverStrategy max="9"/>
<DefaultRolloverStrategy max="20"/>
</RollingFile>
</Appenders>
@@ -21,32 +21,36 @@
<Logger name="com.zaxxer.hikari" level="error"/>
<Logger name="org.postgresql" level="error" />
<Logger name="app.rpc.commands.binfile" level="debug" />
<Logger name="app.binfile" level="debug" />
<Logger name="app.storage.tmp" level="info" />
<Logger name="app.worker" level="trace" />
<Logger name="app.msgbus" level="info" />
<Logger name="app.http.websocket" level="info" />
<Logger name="app.http.sse" level="info" />
<Logger name="app.util.websocket" level="info" />
<Logger name="app.redis" level="info" />
<Logger name="app.rpc.rlimit" level="info" />
<Logger name="app.rpc.climit" level="info" />
<Logger name="app.rpc.mutations.files" level="info" />
<Logger name="app.common.files.migrations" level="info" />
<Logger name="app.rpc.climit" level="debug" />
<Logger name="app.common.files.migrations" level="debug" />
<Logger name="app.loggers" level="debug" additivity="false">
<AppenderRef ref="console" level="info" />
<AppenderRef ref="main" level="debug" />
</Logger>
<Logger name="app" level="all" additivity="false">
<AppenderRef ref="main" level="trace" />
<AppenderRef ref="console" level="debug" />
</Logger>
<Logger name="user" level="trace" additivity="false">
<AppenderRef ref="main" level="trace" />
<AppenderRef ref="console" level="info" />
</Logger>
<Root level="info">
<AppenderRef ref="main" />
<AppenderRef ref="console" level="info" />
</Root>
</Loggers>
</Configuration>
+65
View File
@@ -0,0 +1,65 @@
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info" monitorInterval="30">
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss.SSS}] %level{length=1} %logger{36} - %msg%n"
alwaysWriteExceptions="true" />
</Console>
<RollingFile name="main" fileName="logs/main-latest.log" filePattern="logs/main-%i.log">
<PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss.SSS}] %level{length=1} %logger{36} - %msg%n"
alwaysWriteExceptions="true" />
<Policies>
<SizeBasedTriggeringPolicy size="50M"/>
</Policies>
<DefaultRolloverStrategy max="9"/>
</RollingFile>
<RollingFile name="reports" fileName="logs/reports-latest.log" filePattern="logs/reports-%i.log">
<PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss.SSS}] %level{length=1} %logger{36} - %msg%n"
alwaysWriteExceptions="true" />
<Policies>
<SizeBasedTriggeringPolicy size="100M"/>
</Policies>
<DefaultRolloverStrategy max="9"/>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="io.lettuce" level="error" />
<Logger name="com.zaxxer.hikari" level="error"/>
<Logger name="org.postgresql" level="error" />
<Logger name="app.rpc.commands.binfile" level="debug" />
<Logger name="app.storage.tmp" level="info" />
<Logger name="app.worker" level="trace" />
<Logger name="app.msgbus" level="info" />
<Logger name="app.http.websocket" level="info" />
<Logger name="app.http.sse" level="info" />
<Logger name="app.util.websocket" level="info" />
<Logger name="app.redis" level="info" />
<Logger name="app.rpc.rlimit" level="info" />
<Logger name="app.rpc.climit" level="debug" />
<Logger name="app.common.files.migrations" level="info" />
<Logger name="app.loggers" level="debug" additivity="false">
<AppenderRef ref="main" level="debug" />
</Logger>
<Logger name="app.features" level="all" additivity="true">
<AppenderRef ref="reports" level="warn" />
</Logger>
<Logger name="app" level="all" additivity="false">
<AppenderRef ref="main" level="trace" />
</Logger>
<Logger name="user" level="trace" additivity="false">
<AppenderRef ref="main" level="trace" />
</Logger>
<Root level="info">
<AppenderRef ref="main" />
</Root>
</Loggers>
</Configuration>
+1 -8
View File
@@ -11,16 +11,9 @@
<Logger name="io.lettuce" level="error" />
<Logger name="com.zaxxer.hikari" level="error" />
<Logger name="org.postgresql" level="error" />
<Logger name="app.util" level="info" />
<Logger name="app.loggers" level="debug" />
<Logger name="app" level="info" additivity="false">
<AppenderRef ref="console" />
<AppenderRef ref="console" level="info" />
</Logger>
<Root level="info">
<AppenderRef ref="console" />
</Root>
-4
View File
@@ -160,7 +160,6 @@ available_commands = (
"delete-profile",
"search-profile",
"derive-password",
"migrate-components-v2",
)
parser = argparse.ArgumentParser(
@@ -233,7 +232,4 @@ elif args.action == "search-profile":
search_profile(email)
elif args.action == "migrate-components-v2":
migrate_components_v2()
+18 -9
View File
@@ -4,7 +4,7 @@ export PENPOT_HOST=devenv
export PENPOT_TENANT=dev
export PENPOT_FLAGS="\
$PENPOT_FLAGS \
enable-registration
enable-login-with-ldap \
enable-login-with-password
enable-login-with-oidc \
enable-login-with-google \
@@ -24,13 +24,21 @@ export PENPOT_FLAGS="\
enable-rpc-climit \
enable-rpc-rlimit \
enable-soft-rpc-rlimit \
enable-auto-file-snapshot \
enable-webhooks \
enable-access-tokens \
disable-feature-components-v2 \
enable-tiered-file-data-storage \
enable-file-validation \
enable-file-schema-validation \
disable-soft-file-schema-validation \
disable-soft-file-validation";
enable-file-schema-validation";
# 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 PENPOT_DATABASE_URI="postgresql://172.17.0.1:5432/penpot"
# export PENPOT_DATABASE_USERNAME="penpot"
@@ -55,16 +63,17 @@ mc mb penpot-s3/penpot -p -q
export AWS_ACCESS_KEY_ID=penpot-devenv
export AWS_SECRET_ACCESS_KEY=penpot-devenv
export PENPOT_ASSETS_STORAGE_BACKEND=assets-s3
export PENPOT_STORAGE_ASSETS_S3_ENDPOINT=http://minio:9000
export PENPOT_STORAGE_ASSETS_S3_BUCKET=penpot
export PENPOT_OBJECTS_STORAGE_BACKEND=s3
export PENPOT_OBJECTS_STORAGE_S3_ENDPOINT=http://minio:9000
export PENPOT_OBJECTS_STORAGE_S3_BUCKET=penpot
export OPTIONS="
-A:jmx-remote -A:dev \
-J-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager \
-J-Djdk.attach.allowAttachSelf \
-J-Dpolyglot.engine.WarnInterpreterOnly=false \
-J-Dlog4j2.configurationFile=log4j2-devenv.xml \
-J-Dlog4j2.configurationFile=log4j2-devenv-repl.xml \
-J-XX:+EnableDynamicAgentLoading \
-J-XX:-OmitStackTraceInFastThrow \
-J-XX:+UnlockDiagnosticVMOptions \
+48
View File
@@ -0,0 +1,48 @@
#!/usr/bin/env bash
source /home/penpot/environ
export PENPOT_FLAGS="$PENPOT_FLAGS disable-backend-worker"
export OPTIONS="
-A:jmx-remote -A:dev \
-J-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager \
-J-Djdk.attach.allowAttachSelf \
-J-Dlog4j2.configurationFile=log4j2-experiments.xml \
-J-XX:-OmitStackTraceInFastThrow \
-J-XX:+UnlockDiagnosticVMOptions \
-J-XX:+DebugNonSafepoints \
-J-Djdk.tracePinnedThreads=full \
-J-XX:+UseTransparentHugePages \
-J-XX:ReservedCodeCacheSize=1g \
-J-Dpolyglot.engine.WarnInterpreterOnly=false \
-J--enable-preview";
# Setup HEAP
export OPTIONS="$OPTIONS -J-Xms320g -J-Xmx320g -J-XX:+AlwaysPreTouch"
export PENPOT_HTTP_SERVER_IO_THREADS=2
export PENPOT_HTTP_SERVER_WORKER_THREADS=2
# Increase virtual thread pool size
# export OPTIONS="$OPTIONS -J-Djdk.virtualThreadScheduler.parallelism=16"
# Disable C2 Compiler
# export OPTIONS="$OPTIONS -J-XX:TieredStopAtLevel=1"
# Disable all compilers
# export OPTIONS="$OPTIONS -J-Xint"
# Setup GC
export OPTIONS="$OPTIONS -J-XX:+UseG1GC -J-Xlog:gc:logs/gc.log"
# Setup GC
#export OPTIONS="$OPTIONS -J-XX:+UseZGC -J-XX:+ZGenerational -J-Xlog:gc:logs/gc.log"
# Enable ImageMagick v7.x support
# export OPTIONS="-J-Dim4java.useV7=true $OPTIONS";
export OPTIONS_EVAL="nil"
# export OPTIONS_EVAL="(set! *warn-on-reflection* true)"
set -ex
exec clojure $OPTIONS -M -e "$OPTIONS_EVAL" -m rebel-readline.main
+5 -3
View File
@@ -18,7 +18,9 @@ if [ -f ./environ ]; then
source ./environ
fi
export JVM_OPTS="-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager -Dlog4j2.configurationFile=log4j2.xml -XX:-OmitStackTraceInFastThrow --enable-preview $JVM_OPTS"
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"
set -x
exec $JAVA_CMD $JVM_OPTS "$@" -jar penpot.jar -m app.main
ENTRYPOINT=${1:-app.main};
set -ex
exec $JAVA_CMD $JVM_OPTS -jar penpot.jar -m $ENTRYPOINT
+17 -44
View File
@@ -15,48 +15,37 @@ export PENPOT_FLAGS="\
enable-feature-fdata-pointer-map \
enable-feature-fdata-objects-map \
disable-secure-session-cookies \
enable-rpc-climit \
enable-smtp \
enable-file-snapshot \
enable-access-tokens \
disable-feature-components-v2 \
enable-tiered-file-data-storage \
enable-file-validation \
enable-file-schema-validation \
disable-soft-file-schema-validation \
disable-soft-file-validation";
enable-file-schema-validation";
export OPTIONS="
-A:jmx-remote -A:dev \
-J-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager \
-J-Djdk.attach.allowAttachSelf \
-J-Dpolyglot.engine.WarnInterpreterOnly=false \
-J-Dlog4j2.configurationFile=log4j2.xml \
-J-Dlog4j2.configurationFile=log4j2-devenv.xml \
-J-XX:+EnableDynamicAgentLoading \
-J-XX:-OmitStackTraceInFastThrow \
-J-XX:+UnlockDiagnosticVMOptions \
-J-XX:+DebugNonSafepoints"
# Setup HEAP
# export OPTIONS="$OPTIONS -J-Xms50m -J-Xmx1024m"
# export OPTIONS="$OPTIONS -J-Xms1100m -J-Xmx1100m -J-XX:+AlwaysPreTouch"
# Default deletion delay for devenv
export PENPOT_DELETION_DELAY="24h"
# Increase virtual thread pool size
# export OPTIONS="$OPTIONS -J-Djdk.virtualThreadScheduler.parallelism=16"
# Setup default upload media file size to 100MiB
export PENPOT_MEDIA_MAX_FILE_SIZE=104857600
# Disable C2 Compiler
# export OPTIONS="$OPTIONS -J-XX:TieredStopAtLevel=1"
# Disable all compilers
# export OPTIONS="$OPTIONS -J-Xint"
# Setup GC
# export OPTIONS="$OPTIONS -J-XX:+UseG1GC"
# Setup GC
# export OPTIONS="$OPTIONS -J-XX:+UseZGC"
# Setup default multipart upload size to 300MiB
export PENPOT_HTTP_SERVER_MAX_MULTIPART_BODY_SIZE=314572800
# Enable ImageMagick v7.x support
# export OPTIONS="-J-Dim4java.useV7=true $OPTIONS";
# Initialize MINIO config
mc alias set penpot-s3/ http://minio:9000 minioadmin minioadmin -q
mc admin user add penpot-s3 penpot-devenv penpot-devenv -q
@@ -68,28 +57,12 @@ mc mb penpot-s3/penpot -p -q
export AWS_ACCESS_KEY_ID=penpot-devenv
export AWS_SECRET_ACCESS_KEY=penpot-devenv
export PENPOT_ASSETS_STORAGE_BACKEND=assets-s3
export PENPOT_STORAGE_ASSETS_S3_ENDPOINT=http://minio:9000
export PENPOT_STORAGE_ASSETS_S3_BUCKET=penpot
export PENPOT_OBJECTS_STORAGE_BACKEND=s3
export PENPOT_OBJECTS_STORAGE_S3_ENDPOINT=http://minio:9000
export PENPOT_OBJECTS_STORAGE_S3_BUCKET=penpot
if [ "$1" = "--watch" ]; then
trap "exit" INT TERM ERR
trap "kill 0" EXIT
entrypoint=${1:-app.main};
echo "Start Watch..."
set -ex
clojure $OPTIONS -A:dev -M -m app.main &
npx nodemon \
--watch src \
--watch ../common \
--ext "clj" \
--signal SIGKILL \
--exec 'echo "(app.main/stop)\n\r(repl/refresh)\n\r(app.main/start)\n" | nc -N localhost 6062'
wait;
else
set -x
clojure $OPTIONS -A:dev -M -m app.main;
fi
clojure $OPTIONS -A:dev -M -m $entrypoint;
+1 -17
View File
@@ -6,9 +6,7 @@
(ns app.auth
(:require
[app.config :as cf]
[buddy.hashers :as hashers]
[cuerdas.core :as str]))
[buddy.hashers :as hashers]))
(def default-params
{:alg :argon2id
@@ -27,17 +25,3 @@
(catch Throwable _
{:update false
:valid false})))
(defn email-domain-in-whitelist?
"Returns true if email's domain is in the given whitelist or if
given whitelist is an empty string."
([email]
(let [domains (cf/get :registration-domain-whitelist)]
(email-domain-in-whitelist? domains email)))
([domains email]
(if (or (nil? domains) (empty? domains))
true
(let [[_ candidate] (-> (str/lower email)
(str/split #"@" 2))]
(contains? domains candidate)))))
+12 -12
View File
@@ -9,7 +9,6 @@
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.spec :as us]
[app.config :as cf]
[clj-ldap.client :as ldap]
[clojure.spec.alpha :as s]
[clojure.string]
@@ -104,17 +103,17 @@
nil))))
(s/def ::enabled? ::us/boolean)
(s/def ::host ::cf/ldap-host)
(s/def ::port ::cf/ldap-port)
(s/def ::ssl ::cf/ldap-ssl)
(s/def ::tls ::cf/ldap-starttls)
(s/def ::query ::cf/ldap-user-query)
(s/def ::base-dn ::cf/ldap-base-dn)
(s/def ::bind-dn ::cf/ldap-bind-dn)
(s/def ::bind-password ::cf/ldap-bind-password)
(s/def ::attrs-email ::cf/ldap-attrs-email)
(s/def ::attrs-fullname ::cf/ldap-attrs-fullname)
(s/def ::attrs-username ::cf/ldap-attrs-username)
(s/def ::host ::us/string)
(s/def ::port ::us/integer)
(s/def ::ssl ::us/boolean)
(s/def ::tls ::us/boolean)
(s/def ::query ::us/string)
(s/def ::base-dn ::us/string)
(s/def ::bind-dn ::us/string)
(s/def ::bind-password ::us/string)
(s/def ::attrs-email ::us/string)
(s/def ::attrs-fullname ::us/string)
(s/def ::attrs-username ::us/string)
(s/def ::provider-params
(s/keys :opt-un [::host ::port
@@ -126,6 +125,7 @@
::attrs-email
::attrs-username
::attrs-fullname]))
(s/def ::provider
(s/nilable ::provider-params))
+226 -155
View File
@@ -7,7 +7,6 @@
(ns app.auth.oidc
"OIDC client implementation."
(:require
[app.auth :as auth]
[app.auth.oidc.providers :as-alias providers]
[app.common.data :as d]
[app.common.data.macros :as dm]
@@ -17,12 +16,17 @@
[app.common.uri :as u]
[app.config :as cf]
[app.db :as db]
[app.email.blacklist :as email.blacklist]
[app.email.whitelist :as email.whitelist]
[app.http.client :as http]
[app.http.errors :as errors]
[app.http.session :as session]
[app.loggers.audit :as audit]
[app.main :as-alias main]
[app.rpc :as rpc]
[app.rpc.commands.profile :as profile]
[app.setup :as-alias setup]
[app.tokens :as tokens]
[app.util.inet :as inet]
[app.util.json :as json]
[app.util.time :as dt]
[buddy.sign.jwk :as jwk]
@@ -31,13 +35,14 @@
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[integrant.core :as ig]
[ring.request :as rreq]
[ring.response :as-alias rres]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; HELPERS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn- obfuscate-string
(defn obfuscate-string
[s]
(if (< (count s) 10)
(apply str (take (count s) (repeat "*")))
@@ -128,8 +133,8 @@
(-> body json/decode :keys process-oidc-jwks)
(do
(l/warn :hint "unable to retrieve JWKs (unexpected response status code)"
:http-status status
:http-body body)
:response-status status
:response-body body)
nil)))
(catch Throwable cause
(l/warn :hint "unable to retrieve JWKs (unexpected exception)"
@@ -143,18 +148,18 @@
(when (contains? cf/flags :login-with-oidc)
(if-let [opts (prepare-oidc-opts cfg)]
(let [jwks (fetch-oidc-jwks cfg opts)]
(l/info :hint "provider initialized"
:provider "oidc"
:method (if (:discover? opts) "discover" "manual")
:client-id (:client-id opts)
:client-secret (obfuscate-string (:client-secret opts))
:scopes (str/join "," (:scopes opts))
:auth-uri (:auth-uri opts)
:user-uri (:user-uri opts)
:token-uri (:token-uri opts)
:roles-attr (:roles-attr opts)
:roles (:roles opts)
:keys (str/join "," (map str (keys jwks))))
(l/inf :hint "provider initialized"
:provider "oidc"
:method (if (:discover? opts) "discover" "manual")
:client-id (:client-id opts)
:client-secret (obfuscate-string (:client-secret opts))
:scopes (str/join "," (:scopes opts))
:auth-uri (:auth-uri opts)
:user-uri (:user-uri opts)
:token-uri (:token-uri opts)
:roles-attr (:roles-attr opts)
:roles (:roles opts)
:keys (str/join "," (map str (keys jwks))))
(assoc opts :jwks jwks))
(do
(l/warn :hint "unable to initialize auth provider, missing configuration" :provider "oidc")
@@ -178,10 +183,10 @@
(if (and (string? (:client-id opts))
(string? (:client-secret opts)))
(do
(l/info :hint "provider initialized"
:provider "google"
:client-id (:client-id opts)
:client-secret (obfuscate-string (:client-secret opts)))
(l/inf :hint "provider initialized"
:provider "google"
:client-id (:client-id opts)
:client-secret (obfuscate-string (:client-secret opts)))
opts)
(do
@@ -206,8 +211,9 @@
(ex/raise :type :internal
:code :unable-to-retrieve-github-emails
:hint "unable to retrieve github emails"
:http-status status
:http-body body))
:request-uri (:uri params)
:response-status status
:response-body body))
(->> body json/decode (filter :primary) first :email))))
@@ -232,10 +238,10 @@
(if (and (string? (:client-id opts))
(string? (:client-secret opts)))
(do
(l/info :hint "provider initialized"
:provider "github"
:client-id (:client-id opts)
:client-secret (obfuscate-string (:client-secret opts)))
(l/inf :hint "provider initialized"
:provider "github"
:client-id (:client-id opts)
:client-secret (obfuscate-string (:client-secret opts)))
opts)
(do
@@ -247,7 +253,7 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defmethod ig/init-key ::providers/gitlab
[_ _]
[_ cfg]
(let [base (cf/get :gitlab-base-uri "https://gitlab.com")
opts {:base-uri base
:client-id (cf/get :gitlab-client-id)
@@ -256,17 +262,18 @@
:auth-uri (str base "/oauth/authorize")
:token-uri (str base "/oauth/token")
:user-uri (str base "/oauth/userinfo")
:jwks-uri (str base "/oauth/discovery/keys")
:name "gitlab"}]
(when (contains? cf/flags :login-with-gitlab)
(if (and (string? (:client-id opts))
(string? (:client-secret opts)))
(do
(l/info :hint "provider initialized"
:provider "gitlab"
:base-uri base
:client-id (:client-id opts)
:client-secret (obfuscate-string (:client-secret opts)))
opts)
(let [jwks (fetch-oidc-jwks cfg opts)]
(l/inf :hint "provider initialized"
:provider "gitlab"
:base-uri base
:client-id (:client-id opts)
:client-secret (obfuscate-string (:client-secret opts)))
(assoc opts :jwks jwks))
(do
(l/warn :hint "unable to initialize auth provider, missing configuration" :provider "gitlab")
@@ -282,12 +289,12 @@
(into [(keyword (:name provider) fitem)] (map keyword) items)))
(defn- build-redirect-uri
[{:keys [provider] :as cfg}]
[{:keys [::provider] :as cfg}]
(let [public (u/uri (cf/get :public-uri))]
(str (assoc public :path (str "/api/auth/oauth/" (:name provider) "/callback")))))
(defn- build-auth-uri
[{:keys [provider] :as cfg} state]
[{:keys [::provider] :as cfg} state]
(let [params {:client_id (:client-id provider)
:redirect_uri (build-redirect-uri cfg)
:response_type "code"
@@ -298,15 +305,19 @@
(assoc :query query)
(str))))
(defn- qualify-prop-key
[provider k]
(keyword (:name provider) (name k)))
(defn- qualify-props
[provider props]
(reduce-kv (fn [result k v]
(assoc result (keyword (:name provider) (name k)) v))
(assoc result (qualify-prop-key provider k) v))
{}
props))
(defn fetch-access-token
[{:keys [provider] :as cfg} code]
(defn- fetch-access-token
[{:keys [::provider] :as cfg} code]
(let [params {:client_id (:client-id provider)
:client_secret (:client-secret provider)
:code code
@@ -318,26 +329,31 @@
:uri (:token-uri provider)
:body (u/map->query-string params)}]
(l/trace :hint "request access token"
:provider (:name provider)
:client-id (:client-id provider)
:client-secret (obfuscate-string (:client-secret provider))
:grant-type (:grant_type params)
:redirect-uri (:redirect_uri params))
(l/trc :hint "fetch access token"
:provider (:name provider)
:client-id (:client-id provider)
:client-secret (obfuscate-string (:client-secret provider))
:grant-type (:grant_type params)
:redirect-uri (:redirect_uri params))
(let [{:keys [status body]} (http/req! cfg req {:sync? true})]
(l/trace :hint "access token response" :status status :body body)
(l/trc :hint "access token fetched" :status status :body body)
(if (= status 200)
(let [data (json/decode body)]
{:token/access (get data :access_token)
:token/id (get data :id_token)
:token/type (get data :token_type)})
(let [data (json/decode body)
data {:token/access (get data :access_token)
:token/id (get data :id_token)
:token/type (get data :token_type)}]
(l/trc :hint "access token fetched"
:token-id (:token/id data)
:token-type (:token/type data)
:token (:token/access data))
data)
(ex/raise :type :internal
:code :unable-to-retrieve-token
:hint "unable to retrieve token"
:http-status status
:http-body body)))))
:code :unable-to-fetch-access-token
:hint "unable to fetch access token"
:request-uri (:uri req)
:response-status status
:response-body body)))))
(defn- process-user-info
[provider tdata info]
@@ -363,10 +379,10 @@
:props props})))
(defn- fetch-user-info
[{:keys [provider] :as cfg} tdata]
(l/trace :hint "fetch user info"
:uri (:user-uri provider)
:token (obfuscate-string (:token/access tdata)))
[{:keys [::provider] :as cfg} tdata]
(l/trc :hint "fetch user info"
:uri (:user-uri provider)
:token (obfuscate-string (:token/access tdata)))
(let [params {:uri (:user-uri provider)
:headers {"Authorization" (str (:token/type tdata) " " (:token/access tdata))}
@@ -374,9 +390,9 @@
:method :get}
response (http/req! cfg params {:sync? true})]
(l/trace :hint "user info response"
:status (:status response)
:body (:body response))
(l/trc :hint "user info response"
:status (:status response)
:body (:body response))
(when-not (s/int-in-range? 200 300 (:status response))
(ex/raise :type :internal
@@ -388,7 +404,7 @@
(-> response :body json/decode)))
(defn- get-user-info
[{:keys [provider]} tdata]
[{:keys [::provider]} tdata]
(try
(when (:token/id tdata)
(let [{:keys [kid alg] :as theader} (jwt/decode-header (:token/id tdata))]
@@ -412,14 +428,8 @@
::fullname
::props]))
(defn get-info
[{:keys [provider ::main/props] :as cfg} {:keys [params] :as request}]
(when-let [error (get params :error)]
(ex/raise :type :internal
:code :error-on-retrieving-code
:error-id error
:error-desc (get params :error_description)))
(defn- get-info
[{:keys [::provider ::setup/props] :as cfg} {:keys [params] :as request}]
(let [state (get params :state)
code (get params :code)
state (tokens/verify props {:token state :iss :oauth})
@@ -432,7 +442,7 @@
info (process-user-info provider tdata info)]
(l/trace :hint "user info" :info info)
(l/trc :hint "user info" :info info)
(when-not (s/valid? ::info info)
(l/warn :hint "received incomplete profile info object (please set correct scopes)" :info info)
@@ -465,109 +475,172 @@
(some? (:invitation-token state))
(assoc :invitation-token (:invitation-token state))
(some? (:external-session-id state))
(assoc :external-session-id (:external-session-id state))
;; If state token comes with props, merge them. The state token
;; props can contain pm_ and utm_ prefixed query params.
(map? (:props state))
(update :props merge (:props state)))))
(defn- get-profile
[{:keys [::db/pool] :as cfg} info]
(dm/with-open [conn (db/open pool)]
(some->> (:email info)
(profile/get-profile-by-email conn))))
[cfg info]
(db/run! cfg (fn [{:keys [::db/conn]}]
(some->> (:email info)
(profile/clean-email)
(profile/get-profile-by-email conn)))))
(defn- redirect-response
[uri]
{::rres/status 302
::rres/headers {"location" (str uri)}})
(defn- generate-error-redirect
[_ cause]
(let [data (if (ex/error? cause) (ex-data cause) nil)
code (or (:code data) :unexpected)
type (or (:type data) :internal)
hint (or (:hint data)
(if (ex/exception? cause)
(ex-message cause)
(str cause)))
(defn- redirect-with-error
([error] (redirect-with-error error nil))
([error hint]
(let [params {:error error :hint hint}
params (d/without-nils params)
uri (-> (u/uri (cf/get :public-uri))
(assoc :path "/#/auth/login")
(assoc :query (u/map->query-string params)))]
(redirect-response uri))))
params {:error "unable-to-auth"
:hint hint
:type type
:code code}
(defn- redirect-to-register
[cfg info request]
(let [info (assoc info
:iss :prepared-register
:exp (dt/in-future {:hours 48}))
params {:token (tokens/generate (::setup/props cfg) info)
:provider (:provider (:path-params request))
:fullname (:fullname info)}
params (d/without-nils params)]
(redirect-response
(-> (u/uri (cf/get :public-uri))
(assoc :path "/#/auth/register/validate")
(assoc :query (u/map->query-string params))))))
(defn- redirect-to-verify-token
[token]
(let [params {:token token}
uri (-> (u/uri (cf/get :public-uri))
(assoc :path "/#/auth/login")
(assoc :path "/#/auth/verify-token")
(assoc :query (u/map->query-string params)))]
(redirect-response uri)))
(defn- generate-redirect
(defn- provider-has-email-verified?
[{:keys [::provider] :as cfg} {:keys [props] :as info}]
(let [prop (qualify-prop-key provider :email_verified)]
(true? (get props prop))))
(defn- profile-has-provider-props?
[{:keys [::provider] :as cfg} profile]
(let [prop (qualify-prop-key provider :email)]
(contains? (:props profile) prop)))
(defn- provider-matches-profile?
[{:keys [::provider] :as cfg} profile info]
(or (= (:auth-backend profile) (:name provider))
(profile-has-provider-props? cfg profile)
(provider-has-email-verified? cfg info)))
(defn- process-callback
[cfg request info profile]
(if profile
(let [sxf (session/create-fn cfg (:id profile))
token (or (:invitation-token info)
(tokens/generate (::main/props cfg)
{:iss :auth
:exp (dt/in-future "15m")
:profile-id (:id profile)}))
params {:token token}
uri (-> (u/uri (cf/get :public-uri))
(assoc :path "/#/auth/verify-token")
(assoc :query (u/map->query-string params)))]
(cond
(some? profile)
(cond
(:is-blocked profile)
(redirect-with-error "profile-blocked")
(when (:is-blocked profile)
(ex/raise :type :restriction
:code :profile-blocked))
(not (provider-matches-profile? cfg profile info))
(redirect-with-error "auth-provider-not-allowed")
(audit/submit! cfg {::audit/type "command"
::audit/name "login-with-oidc"
::audit/profile-id (:id profile)
::audit/ip-addr (audit/parse-client-ip request)
::audit/props (audit/profile->props profile)})
(not (:is-active profile))
(let [info (assoc info :profile-id (:id profile))]
(redirect-to-register cfg info request))
(->> (redirect-response uri)
(sxf request)))
:else
(let [sxf (session/create-fn cfg (:id profile))
token (or (:invitation-token info)
(tokens/generate (::setup/props cfg)
{:iss :auth
:exp (dt/in-future "15m")
:profile-id (:id profile)}))
props (audit/profile->props profile)
context (d/without-nils {:external-session-id (:external-session-id info)})]
(audit/submit! cfg {::audit/type "action"
::audit/name "login-with-oidc"
::audit/profile-id (:id profile)
::audit/ip-addr (inet/parse-request request)
::audit/props props
::audit/context context})
(if (auth/email-domain-in-whitelist? (:email info))
(let [info (assoc info
:iss :prepared-register
:is-active true
:exp (dt/in-future {:hours 48}))
token (tokens/generate (::main/props cfg) info)
params (d/without-nils
{:token token
:fullname (:fullname info)})
uri (-> (u/uri (cf/get :public-uri))
(assoc :path "/#/auth/register/validate")
(assoc :query (u/map->query-string params)))]
(->> (redirect-to-verify-token token)
(sxf request))))
(redirect-response uri))
(generate-error-redirect cfg "email-domain-not-allowed"))))
(and (email.blacklist/enabled? cfg)
(email.blacklist/contains? cfg (:email info)))
(redirect-with-error "email-domain-not-allowed")
(and (email.whitelist/enabled? cfg)
(not (email.whitelist/contains? cfg (:email info))))
(redirect-with-error "email-domain-not-allowed")
:else
(let [info (assoc info :is-active (provider-has-email-verified? cfg info))]
(if (or (contains? cf/flags :registration)
(contains? cf/flags :oidc-registration))
(redirect-to-register cfg info request)
(redirect-with-error "registration-disabled")))))
(defn- get-external-session-id
[request]
(let [session-id (rreq/get-header request "x-external-session-id")]
(when (string? session-id)
(if (or (> (count session-id) 256)
(= session-id "null")
(str/blank? session-id))
nil
session-id))))
(defn- auth-handler
[cfg {:keys [params] :as request}]
(let [props (audit/extract-utm-params params)
state (tokens/generate (::main/props cfg)
{:iss :oauth
:invitation-token (:invitation-token params)
:props props
:exp (dt/in-future "4h")})
uri (build-auth-uri cfg state)]
(let [props (audit/extract-utm-params params)
esid (rpc/get-external-session-id request)
params {:iss :oauth
:invitation-token (:invitation-token params)
:external-session-id esid
:props props
:exp (dt/in-future "4h")}
state (tokens/generate (::setup/props cfg)
(d/without-nils params))
uri (build-auth-uri cfg state)]
{::rres/status 200
::rres/body {:redirect-uri uri}}))
(defn- callback-handler
[cfg request]
[{:keys [::provider] :as cfg} request]
(try
(let [info (get-info cfg request)
profile (get-profile cfg info)]
(generate-redirect cfg request info profile))
(if-let [error (dm/get-in request [:params :error])]
(redirect-with-error "unable-to-auth" error)
(let [info (get-info cfg request)
profile (get-profile cfg info)]
(process-callback cfg request info profile)))
(catch Throwable cause
(l/warn :hint "error on oauth process" :cause cause)
(generate-error-redirect cfg cause))))
(binding [l/*context* (-> (errors/request->context request)
(assoc :auth/provider (:name provider)))]
(let [edata (ex-data cause)]
(cond
(= :validation (:type edata))
(l/wrn :hint "invalid token received" :cause cause)
:else
(l/err :hint "error on oauth process" :cause cause))))
(redirect-with-error "unable-to-auth" (ex-message cause)))))
(def provider-lookup
{:compile
@@ -576,26 +649,24 @@
(fn [request]
(let [provider (some-> request :path-params :provider keyword)]
(if-let [provider (get providers provider)]
(handler (assoc cfg :provider provider) request)
(handler (assoc cfg ::provider provider) request)
(ex/raise :type :restriction
:code :provider-not-configured
:provider provider
:hint "provider not configured"))))))})
(s/def ::client-id ::us/string)
(s/def ::client-secret ::us/string)
(s/def ::base-uri ::us/string)
(s/def ::token-uri ::us/string)
(s/def ::auth-uri ::us/string)
(s/def ::user-uri ::us/string)
(s/def ::scopes ::us/set-of-strings)
(s/def ::roles ::us/set-of-strings)
(s/def ::roles-attr ::us/string)
(s/def ::email-attr ::us/string)
(s/def ::name-attr ::us/string)
(s/def ::client-id ::cf/oidc-client-id)
(s/def ::client-secret ::cf/oidc-client-secret)
(s/def ::base-uri ::cf/oidc-base-uri)
(s/def ::token-uri ::cf/oidc-token-uri)
(s/def ::auth-uri ::cf/oidc-auth-uri)
(s/def ::user-uri ::cf/oidc-user-uri)
(s/def ::scopes ::cf/oidc-scopes)
(s/def ::roles ::cf/oidc-roles)
(s/def ::roles-attr ::cf/oidc-roles-attr)
(s/def ::email-attr ::cf/oidc-email-attr)
(s/def ::name-attr ::cf/oidc-name-attr)
;; FIXME: migrate to qualified-keywords
(s/def ::provider
(s/keys :req-un [::client-id
::client-secret]
@@ -617,7 +688,7 @@
[_]
(s/keys :req [::session/manager
::http/client
::main/props
::setup/props
::db/pool
::providers]))
+451
View File
@@ -0,0 +1,451 @@
;; 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.common
"A binfile related file processing common code, used for different
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.migrations :as fmg]
[app.common.files.validate :as fval]
[app.common.logging :as l]
[app.common.types.file :as ctf]
[app.common.uuid :as uuid]
[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.loggers.audit :as-alias audit]
[app.loggers.webhooks :as-alias webhooks]
[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]))
(set! *warn-on-reflection* true)
(def ^:dynamic *state* nil)
(def ^:dynamic *options* nil)
(def xf-map-id
(map :id))
(def xf-map-media-id
(comp
(mapcat (juxt :media-id
:thumbnail-id
:woff1-file-id
:woff2-file-id
:ttf-file-id
:otf-file-id))
(filter uuid?)))
(def into-vec
(fnil into []))
(def conj-vec
(fnil conj []))
(defn collect-storage-objects
[state items]
(update state :storage-objects into xf-map-media-id items))
(defn collect-summary
[state key items]
(update state key into xf-map-media-id items))
(defn lookup-index
[id]
(when id
(let [val (get-in @*state* [:index id])]
(l/trc :fn "lookup-index" :id (str id) :result (some-> val str) ::l/sync? true)
(or val id))))
(defn remap-id
[item key]
(cond-> item
(contains? item key)
(update key lookup-index)))
(defn- index-object
[index obj & attrs]
(reduce (fn [index attr-fn]
(let [old-id (attr-fn obj)
new-id (if (::overwrite *options*) old-id (uuid/next))]
(assoc index old-id new-id)))
index
attrs))
(defn update-index
([index coll]
(update-index index coll identity))
([index coll attr]
(reduce #(index-object %1 %2 attr) index coll)))
(defn decode-row
"A generic decode row helper"
[{:keys [data features] :as row}]
(cond-> row
features (assoc :features (db/decode-pgarray features #{}))
data (assoc :data (blob/decode data))))
(defn get-file
[cfg file-id]
(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 {}))))))))
(defn get-project
[cfg project-id]
(db/get cfg :project {:id project-id}))
(defn get-team
[cfg team-id]
(-> (db/get cfg :team {:id team-id})
(decode-row)))
(defn get-fonts
[cfg team-id]
(db/query cfg :team-font-variant
{:team-id team-id
:deleted-at nil}))
(defn get-files-rels
"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)))
(db/run! cfg (fn [{:keys [::db/conn]}]
(let [ids (db/create-array conn "uuid" ids)
sql (str "SELECT flr.* FROM file_library_rel AS flr "
" JOIN file AS l ON (flr.library_file_id = l.id) "
" WHERE flr.file_id = ANY(?) AND l.deleted_at IS NULL")]
(db/exec! conn [sql ids])))))
(def ^:private sql:get-libraries
"WITH RECURSIVE libs AS (
SELECT fl.id
FROM file AS fl
JOIN file_library_rel AS flr ON (flr.library_file_id = fl.id)
WHERE flr.file_id = ANY(?)
UNION
SELECT fl.id
FROM file AS fl
JOIN file_library_rel AS flr ON (flr.library_file_id = fl.id)
JOIN libs AS l ON (flr.file_id = l.id)
)
SELECT DISTINCT l.id
FROM libs AS l")
(defn get-libraries
"Get all libraries ids related to provided file ids"
[cfg ids]
(db/run! cfg (fn [{:keys [::db/conn]}]
(let [ids' (db/create-array conn "uuid" ids)]
(->> (db/exec! conn [sql:get-libraries ids'])
(into #{} xf-map-id))))))
(defn get-file-object-thumbnails
"Return all file object thumbnails for a given file."
[cfg file-id]
(db/query cfg :file-tagged-object-thumbnail
{:file-id file-id
:deleted-at nil}))
(defn get-file-thumbnail
"Return the thumbnail for the specified file-id"
[cfg {:keys [id revn]}]
(db/get* cfg :file-thumbnail
{:file-id id
:revn revn
:data nil}
{::sql/columns [:media-id :file-id :revn]}))
(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 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)))))
(defn get-file-media
[cfg {:keys [data id] :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)))))))
(def ^:private sql:get-team-files
"SELECT f.id FROM file AS f
JOIN project AS p ON (p.id = f.project_id)
WHERE p.team_id = ?")
(defn get-team-files
"Get a set of file ids for the specified team-id"
[{:keys [::db/conn]} team-id]
(->> (db/exec! conn [sql:get-team-files team-id])
(into #{} xf-map-id)))
(def ^:private sql:get-team-projects
"SELECT p.id FROM project AS p
WHERE p.team_id = ?
AND p.deleted_at IS NULL")
(defn get-team-projects
"Get a set of project ids for the team"
[{:keys [::db/conn]} team-id]
(->> (db/exec! conn [sql:get-team-projects team-id])
(into #{} xf-map-id)))
(def ^:private sql:get-project-files
"SELECT f.id FROM file AS f
WHERE f.project_id = ?
AND f.deleted_at IS NULL")
(defn get-project-files
"Get a set of file ids for the project"
[{:keys [::db/conn]} project-id]
(->> (db/exec! conn [sql:get-project-files project-id])
(into #{} xf-map-id)))
(defn- relink-shapes
"A function responsible to analyze all file data and
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)))
(defn- relink-media
"A function responsible of process the :media attr of file data and
remap the old ids with the new ones."
[media]
(reduce-kv (fn [res k v]
(let [id (lookup-index k)]
(if (uuid? id)
(-> res
(assoc id (assoc v :id id))
(dissoc k))
res)))
media
media))
(defn- relink-colors
"A function responsible of process the :colors attr of file data and
remap the old ids with the new ones."
[colors]
(reduce-kv (fn [res k v]
(if (:image v)
(update-in res [k :image :id] lookup-index)
res))
colors
colors))
(defn embed-assets
[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))))
data
library-ids)))
(defn- fix-version
[file]
(let [file (fmg/fix-version file)]
;; FIXME: We're temporarily activating all migrations because a
;; problem in the environments messed up with the version numbers
;; When this problem is fixed delete the following line
(if (> (:version file) 22)
(assoc file :version 22)
file)))
(defn process-file
[{:keys [id] :as file}]
(-> file
(fix-version)
(update :data (fn [fdata]
(-> fdata
(assoc :id id)
(dissoc :recent-colors))))
(fmg/migrate-file)
(update :data (fn [fdata]
(-> fdata
(update :pages-index relink-shapes)
(update :components relink-shapes)
(update :media relink-media)
(update :colors relink-colors)
(d/without-nils))))))
(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 persist-file!
"Applies all the final validations and perist the file."
[{:keys [::db/conn ::timestamp] :as cfg} {:keys [id] :as file}]
(dm/assert!
"expected valid timestamp"
(dt/instant? 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]
(let [features (cfeat/check-supported-features! features)]
(-> (::features cfg #{})
(set/difference cfeat/frontend-only-features)
(set/union features))))))
_ (when (contains? cf/flags :file-schema-validation)
(fval/validate-file-schema! file))
_ (when (contains? cf/flags :soft-file-schema-validation)
(let [result (ex/try! (fval/validate-file-schema! file))]
(when (ex/exception? result)
(l/error :hint "file schema validation error" :cause result))))
file (if (contains? (:features file) "fdata/objects-map")
(feat.fdata/enable-objects-map file)
file)
file (if (contains? (:features file) "fdata/pointer-map")
(binding [pmap/*tracked* (pmap/create-tracked)]
(let [file (feat.fdata/enable-pointer-map file)]
(feat.fdata/persist-pointers! cfg id)
file))
file)
params (-> file
(update :features db/encode-pgarray conn "text")
(update :data blob/encode))]
(if (::overwrite cfg)
(upsert-file! conn params)
(db/insert! conn :file params ::db/return-keys false))
file))
(defn 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))))
+777
View File
@@ -0,0 +1,777 @@
;; 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.v1
"A custom, perfromance and efficiency focused binfile format impl"
(:refer-clojure :exclude [assert])
(:require
[app.binfile.common :as bfc]
[app.common.data :as d]
[app.common.data.macros :as dm]
[app.common.exceptions :as ex]
[app.common.features :as cfeat]
[app.common.fressian :as fres]
[app.common.logging :as l]
[app.common.spec :as us]
[app.common.types.file :as ctf]
[app.common.uuid :as uuid]
[app.config :as cf]
[app.db :as db]
[app.loggers.audit :as-alias audit]
[app.loggers.webhooks :as-alias webhooks]
[app.rpc :as-alias rpc]
[app.rpc.commands.teams :as teams]
[app.rpc.doc :as-alias doc]
[app.storage :as sto]
[app.storage.tmp :as tmp]
[app.tasks.file-gc]
[app.util.events :as events]
[app.util.time :as dt]
[app.worker :as-alias wrk]
[clojure.java.io :as jio]
[clojure.set :as set]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[datoteka.io :as io]
[promesa.util :as pu]
[yetti.adapter :as yt])
(:import
com.github.luben.zstd.ZstdIOException
com.github.luben.zstd.ZstdInputStream
com.github.luben.zstd.ZstdOutputStream
java.io.DataInputStream
java.io.DataOutputStream
java.io.InputStream
java.io.OutputStream))
(set! *warn-on-reflection* true)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; DEFAULTS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Threshold in MiB when we pass from using
;; in-memory byte-array's to use temporal files.
(def temp-file-threshold
(* 1024 1024 2))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; LOW LEVEL STREAM IO API
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def ^:const buffer-size (:xnio/buffer-size yt/defaults))
(def ^:const penpot-magic-number 800099563638710213)
;; A maximum (storage) object size allowed: 100MiB
(def ^:const max-object-size
(* 1024 1024 100))
(def ^:dynamic *position* nil)
(defn get-mark
[id]
(case id
:header 1
:stream 2
:uuid 3
:label 4
:obj 5
(ex/raise :type :validation
:code :invalid-mark-id
:hint (format "invalid mark id %s" id))))
(defmacro assert
[expr hint]
`(when-not ~expr
(ex/raise :type :validation
:code :unexpected-condition
:hint ~hint)))
(defmacro assert-mark
[v type]
`(let [expected# (get-mark ~type)
val# (long ~v)]
(when (not= val# expected#)
(ex/raise :type :validation
:code :unexpected-mark
:hint (format "received mark %s, expected %s" val# expected#)))))
(defmacro assert-label
[expr label]
`(let [v# ~expr]
(when (not= v# ~label)
(ex/raise :type :assertion
:code :unexpected-label
:hint (format "received label %s, expected %s" v# ~label)))))
;; --- PRIMITIVE IO
(defn write-byte!
[^DataOutputStream output data]
(l/trace :fn "write-byte!" :data data :position @*position* ::l/sync? true)
(.writeByte output (byte data))
(swap! *position* inc))
(defn read-byte!
[^DataInputStream input]
(let [v (.readByte input)]
(l/trace :fn "read-byte!" :val v :position @*position* ::l/sync? true)
(swap! *position* inc)
v))
(defn write-long!
[^DataOutputStream output data]
(l/trace :fn "write-long!" :data data :position @*position* ::l/sync? true)
(.writeLong output (long data))
(swap! *position* + 8))
(defn read-long!
[^DataInputStream input]
(let [v (.readLong input)]
(l/trace :fn "read-long!" :val v :position @*position* ::l/sync? true)
(swap! *position* + 8)
v))
(defn write-bytes!
[^DataOutputStream output ^bytes data]
(let [size (alength data)]
(l/trace :fn "write-bytes!" :size size :position @*position* ::l/sync? true)
(.write output data 0 size)
(swap! *position* + size)))
(defn read-bytes!
[^InputStream input ^bytes buff]
(let [size (alength buff)
readed (.readNBytes input buff 0 size)]
(l/trace :fn "read-bytes!" :expected (alength buff) :readed readed :position @*position* ::l/sync? true)
(swap! *position* + readed)
readed))
;; --- COMPOSITE IO
(defn write-uuid!
[^DataOutputStream output id]
(l/trace :fn "write-uuid!" :position @*position* :WRITTEN? (.size output) ::l/sync? true)
(doto output
(write-byte! (get-mark :uuid))
(write-long! (uuid/get-word-high id))
(write-long! (uuid/get-word-low id))))
(defn read-uuid!
[^DataInputStream input]
(l/trace :fn "read-uuid!" :position @*position* ::l/sync? true)
(let [m (read-byte! input)]
(assert-mark m :uuid)
(let [a (read-long! input)
b (read-long! input)]
(uuid/custom a b))))
(defn write-obj!
[^DataOutputStream output data]
(l/trace :fn "write-obj!" :position @*position* ::l/sync? true)
(let [^bytes data (fres/encode data)]
(doto output
(write-byte! (get-mark :obj))
(write-long! (alength data))
(write-bytes! data))))
(defn read-obj!
[^DataInputStream input]
(l/trace :fn "read-obj!" :position @*position* ::l/sync? true)
(let [m (read-byte! input)]
(assert-mark m :obj)
(let [size (read-long! input)]
(assert (pos? size) "incorrect header size found on reading header")
(let [buff (byte-array size)]
(read-bytes! input buff)
(fres/decode buff)))))
(defn write-label!
[^DataOutputStream output label]
(l/trace :fn "write-label!" :label label :position @*position* ::l/sync? true)
(doto output
(write-byte! (get-mark :label))
(write-obj! label)))
(defn read-label!
[^DataInputStream input]
(l/trace :fn "read-label!" :position @*position* ::l/sync? true)
(let [m (read-byte! input)]
(assert-mark m :label)
(read-obj! input)))
(defn write-header!
[^OutputStream output version]
(l/trace :fn "write-header!"
:version version
:position @*position*
::l/sync? true)
(let [vers (-> version name (subs 1) parse-long)
output (io/data-output-stream output)]
(doto output
(write-byte! (get-mark :header))
(write-long! penpot-magic-number)
(write-long! vers))))
(defn read-header!
[^InputStream input]
(l/trace :fn "read-header!" :position @*position* ::l/sync? true)
(let [input (io/data-input-stream input)
mark (read-byte! input)
mnum (read-long! input)
vers (read-long! input)]
(when (or (not= mark (get-mark :header))
(not= mnum penpot-magic-number))
(ex/raise :type :validation
:code :invalid-penpot-file
:hint "invalid penpot file"))
(keyword (str "v" vers))))
(defn copy-stream!
[^OutputStream output ^InputStream input ^long size]
(let [written (io/copy! input output :size size)]
(l/trace :fn "copy-stream!" :position @*position* :size size :written written ::l/sync? true)
(swap! *position* + written)
written))
(defn write-stream!
[^DataOutputStream output stream size]
(l/trace :fn "write-stream!" :position @*position* ::l/sync? true :size size)
(doto output
(write-byte! (get-mark :stream))
(write-long! size))
(copy-stream! output stream size))
(defn read-stream!
[^DataInputStream input]
(l/trace :fn "read-stream!" :position @*position* ::l/sync? true)
(let [m (read-byte! input)
s (read-long! input)
p (tmp/tempfile :prefix "penpot.binfile.")]
(assert-mark m :stream)
(when (> s max-object-size)
(ex/raise :type :validation
:code :max-file-size-reached
:hint (str/ffmt "unable to import storage object with size % bytes" s)))
(if (> s temp-file-threshold)
(with-open [^OutputStream output (io/output-stream p)]
(let [readed (io/copy! input output :offset 0 :size s)]
(l/trace :fn "read-stream*!" :expected s :readed readed :position @*position* ::l/sync? true)
(swap! *position* + readed)
[s p]))
[s (io/read-as-bytes input :size s)])))
(defmacro assert-read-label!
[input expected-label]
`(let [readed# (read-label! ~input)
expected# ~expected-label]
(when (not= readed# expected#)
(ex/raise :type :validation
:code :unexpected-label
:hint (format "unexpected label found: %s, expected: %s" readed# expected#)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; API
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; --- HELPERS
(defn zstd-input-stream
^InputStream
[input]
(ZstdInputStream. ^InputStream input))
(defn zstd-output-stream
^OutputStream
[output & {:keys [level] :or {level 0}}]
(ZstdOutputStream. ^OutputStream output (int level)))
(defn- get-files
[cfg ids]
(db/run! cfg (fn [{:keys [::db/conn]}]
(let [sql (str "SELECT id FROM file "
" WHERE id = ANY(?) ")
ids (db/create-array conn "uuid" ids)]
(->> (db/exec! conn [sql ids])
(into [] (map :id))
(not-empty))))))
;; --- EXPORT WRITER
(defmulti write-export ::version)
(defmulti write-section ::section)
(defn write-export!
[{:keys [::include-libraries ::embed-assets] :as cfg}]
(when (and include-libraries embed-assets)
(throw (IllegalArgumentException.
"the `include-libraries` and `embed-assets` are mutally excluding options")))
(write-export cfg))
(defmethod write-export :default
[{:keys [::output] :as options}]
(write-header! output :v1)
(pu/with-open [output (zstd-output-stream output :level 12)
output (io/data-output-stream output)]
(binding [bfc/*state* (volatile! {})]
(run! (fn [section]
(l/dbg :hint "write section" :section section ::l/sync? true)
(write-label! output section)
(let [options (-> options
(assoc ::output output)
(assoc ::section section))]
(binding [bfc/*options* options]
(write-section options))))
[:v1/metadata :v1/files :v1/rels :v1/sobjects]))))
(defmethod write-section :v1/metadata
[{:keys [::output ::ids ::include-libraries] :as cfg}]
(if-let [fids (get-files cfg ids)]
(let [lids (when include-libraries
(bfc/get-libraries cfg ids))
ids (into fids lids)]
(write-obj! output {:version cf/version :files ids})
(vswap! bfc/*state* assoc :files ids))
(ex/raise :type :not-found
:code :files-not-found
:hint "unable to retrieve files for export")))
(defmethod write-section :v1/files
[{:keys [::output ::embed-assets ::include-libraries] :as cfg}]
;; Initialize SIDS with empty vector
(vswap! bfc/*state* assoc :sids [])
(doseq [file-id (-> bfc/*state* deref :files)]
(let [detach? (and (not embed-assets) (not include-libraries))
thumbnails (->> (bfc/get-file-object-thumbnails cfg file-id)
(mapv #(dissoc % :file-id)))
file (cond-> (bfc/get-file cfg file-id)
detach?
(-> (ctf/detach-external-references file-id)
(dissoc :libraries))
embed-assets
(update :data #(bfc/embed-assets cfg % file-id))
:always
(assoc :thumbnails thumbnails))
media (bfc/get-file-media cfg file)]
(l/dbg :hint "write penpot file"
:id (str file-id)
:name (:name file)
:thumbnails (count thumbnails)
:features (:features file)
:media (count media)
::l/sync? true)
(doseq [item media]
(l/dbg :hint "write penpot file media object" :id (:id item) ::l/sync? true))
(doseq [item thumbnails]
(l/dbg :hint "write penpot file object thumbnail" :media-id (str (:media-id item)) ::l/sync? true))
(doto output
(write-obj! file)
(write-obj! media))
(vswap! bfc/*state* update :sids into bfc/xf-map-media-id media)
(vswap! bfc/*state* update :sids into bfc/xf-map-media-id thumbnails))))
(defmethod write-section :v1/rels
[{:keys [::output ::include-libraries] :as cfg}]
(let [ids (-> bfc/*state* deref :files set)
rels (when include-libraries
(bfc/get-files-rels cfg ids))]
(l/dbg :hint "found rels" :total (count rels) ::l/sync? true)
(write-obj! output rels)))
(defmethod write-section :v1/sobjects
[{:keys [::output] :as cfg}]
(let [sids (-> bfc/*state* deref :sids)
storage (sto/resolve cfg)]
(l/dbg :hint "found sobjects"
:items (count sids)
::l/sync? true)
;; Write all collected storage objects
(write-obj! output sids)
(doseq [id sids]
(let [{:keys [size] :as obj} (sto/get-object storage id)]
(l/dbg :hint "write sobject" :id (str id) ::l/sync? true)
(doto output
(write-uuid! id)
(write-obj! (meta obj)))
(pu/with-open [stream (sto/get-object-data storage obj)]
(let [written (write-stream! output stream size)]
(when (not= written size)
(ex/raise :type :validation
:code :mismatch-readed-size
:hint (str/ffmt "found unexpected object size; size=% written=%" size written)))))))))
;; --- EXPORT READER
(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 ::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?]))
(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}]
(dm/assert!
"expected input stream"
(io/input-stream? input))
(dm/assert!
"expected valid instant"
(dt/instant? timestamp))
(let [version (read-header! input)]
(read-import (assoc options ::version version ::bfc/timestamp timestamp))))
(defn- read-import-v1
[{:keys [::db/conn ::project-id ::profile-id ::input] :as cfg}]
(db/exec-one! conn ["SET LOCAL idle_in_transaction_session_timeout = 0"])
(db/exec-one! conn ["SET CONSTRAINTS ALL DEFERRED"])
(pu/with-open [input (zstd-input-stream input)
input (io/data-input-stream input)]
(binding [bfc/*state* (volatile! {:media [] :index {}})]
(let [team (teams/get-team conn
:profile-id profile-id
:project-id project-id)
features (cfeat/get-team-enabled-features cf/flags team)]
;; Process all sections
(run! (fn [section]
(l/dbg :hint "reading section" :section section ::l/sync? true)
(assert-read-label! input section)
(let [options (-> cfg
(assoc ::bfc/features features)
(assoc ::section section)
(assoc ::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)
;; Knowing that the ids of the created files are in index,
;; just lookup them and return it as a set
(let [files (-> bfc/*state* deref :files)]
(into #{} (keep #(get-in @bfc/*state* [:index %])) files))))))
(defmethod read-import :v1
[options]
(db/tx-run! options read-import-v1))
(defmethod read-section :v1/metadata
[{:keys [::input]}]
(let [{:keys [version files]} (read-obj! input)]
(l/dbg :hint "metadata readed"
:version (:full version)
:files (mapv str files)
::l/sync? true)
(vswap! bfc/*state* update :index bfc/update-index files)
(vswap! bfc/*state* assoc :version version :files files)))
(defn- remap-thumbnails
[thumbnails file-id]
(mapv (fn [thumbnail]
(-> thumbnail
(assoc :file-id file-id)
(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}]
(doseq [[idx expected-file-id] (d/enumerate (-> bfc/*state* deref :files))]
(let [file (read-obj! input)
media (read-obj! input)
file-id (:id file)
file-id' (bfc/lookup-index file-id)
file (clean-features file)
thumbnails (:thumbnails file)]
(when (not= file-id expected-file-id)
(ex/raise :type :validation
:code :inconsistent-penpot-file
:found-id file-id
:expected-id expected-file-id
:hint "the penpot file seems corrupt, found unexpected uuid (file-id)"))
(l/dbg :hint "processing file"
:id (str file-id)
:features (:features file)
:version (-> file :data :version)
:media (count media)
:thumbnails (count thumbnails)
::l/sync? true)
(when (seq thumbnails)
(let [thumbnails (remap-thumbnails thumbnails file-id')]
(l/dbg :hint "updated index with thumbnails" :total (count thumbnails) ::l/sync? true)
(vswap! bfc/*state* update :thumbnails bfc/into-vec thumbnails)))
(when (seq media)
;; Update index with media
(l/dbg :hint "update index with media" :total (count media) ::l/sync? true)
(vswap! bfc/*state* update :index bfc/update-index (map :id media))
;; Store file media for later insertion
(l/dbg :hint "update media references" ::l/sync? true)
(vswap! bfc/*state* update :media into (map #(update % :id bfc/lookup-index)) media))
(let [file (-> file
(assoc :id file-id')
(cond-> (and (= idx 0) (some? name))
(assoc :name name))
(assoc :project-id project-id)
(dissoc :thumbnails)
(bfc/process-file))]
;; All features that are enabled and requires explicit migration are
;; added to the state for a posterior migration step.
(doseq [feature (-> (::bfc/features system)
(set/difference cfeat/no-migration-features)
(set/difference (:features file)))]
(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'}))
file-id'))))
(defmethod read-section :v1/rels
[{:keys [::db/conn ::input ::bfc/timestamp]}]
(let [rels (read-obj! input)
ids (into #{} (-> bfc/*state* deref :files))]
;; Insert all file relations
(doseq [{:keys [library-file-id] :as rel} rels]
(let [rel (-> rel
(assoc :synced-at timestamp)
(update :file-id bfc/lookup-index)
(update :library-file-id bfc/lookup-index))]
(if (contains? ids library-file-id)
(do
(l/dbg :hint "create file library link"
:file-id (:file-id rel)
:lib-id (:library-file-id rel)
::l/sync? true)
(db/insert! conn :file-library-rel rel))
(l/warn :hint "ignoring file library link"
:file-id (:file-id rel)
:lib-id (:library-file-id rel)
::l/sync? true))))))
(defmethod read-section :v1/sobjects
[{:keys [::db/conn ::input ::bfc/overwrite ::bfc/timestamp] :as cfg}]
(let [storage (sto/resolve cfg)
ids (read-obj! input)
thumb? (into #{} (map :media-id) (:thumbnails @bfc/*state*))]
(doseq [expected-storage-id ids]
(let [id (read-uuid! input)
mdata (read-obj! input)]
(when (not= id expected-storage-id)
(ex/raise :type :validation
:code :inconsistent-penpot-file
:hint "the penpot file seems corrupt, found unexpected uuid (storage-object-id)"))
(l/dbg :hint "readed storage object" :id (str id) ::l/sync? true)
(let [[size resource] (read-stream! input)
hash (sto/calculate-hash resource)
content (-> (sto/content resource size)
(sto/wrap-with-hash hash))
params (-> mdata
(assoc ::sto/content content)
(assoc ::sto/deduplicate? true)
(assoc ::sto/touched-at timestamp))
params (if (thumb? id)
(assoc params :bucket "file-object-thumbnail")
(assoc params :bucket "file-media-object"))
sobject (sto/put-object! storage params)]
(l/dbg :hint "persisted storage object"
:old-id (str id)
:new-id (str (:id sobject))
:is-thumbnail (boolean (thumb? id))
::l/sync? true)
(vswap! bfc/*state* update :index assoc id (:id sobject)))))
(doseq [item (:media @bfc/*state*)]
(l/dbg :hint "inserting file media object"
:id (str (:id item))
:file-id (str (:file-id item))
::l/sync? true)
(let [file-id (bfc/lookup-index (:file-id item))]
(if (= file-id (:file-id item))
(l/warn :hint "ignoring file media object" :file-id (str file-id) ::l/sync? true)
(db/insert! conn :file-media-object
(-> 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}))))
(doseq [item (:thumbnails @bfc/*state*)]
(let [item (update item :media-id bfc/lookup-index)]
(l/dbg :hint "inserting file object thumbnail"
:file-id (str (:file-id item))
: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})))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; HIGH LEVEL API
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn export-files!
"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
linked libraries also will be included (including transitive
dependencies).
`::embed-assets`: instead of including the libraries, embed in the
same file library all assets used from external libraries."
[{:keys [::ids] :as cfg} output]
(dm/assert!
"expected a set of uuid's for `::ids` parameter"
(and (set? ids)
(every? uuid? ids)))
(dm/assert!
"expected instance of jio/IOFactory for `input`"
(satisfies? jio/IOFactory output))
(let [id (uuid/next)
tp (dt/tpoint)
ab (volatile! false)
cs (volatile! nil)]
(try
(l/info :hint "start exportation" :export-id (str id))
(pu/with-open [output (io/output-stream output)]
(binding [*position* (atom 0)]
(write-export! (assoc cfg ::output output))))
(catch java.io.IOException _cause
;; Do nothing, EOF means client closes connection abruptly
(vreset! ab true)
nil)
(catch Throwable cause
(vreset! cs cause)
(vreset! ab true)
(throw cause))
(finally
(l/info :hint "exportation finished" :export-id (str id)
:elapsed (str (inst-ms (tp)) "ms")
:aborted @ab
:cause @cs)))))
(defn import-files!
[cfg input]
(dm/assert!
"expected valid profile-id and project-id on `cfg`"
(and (uuid? (::profile-id cfg))
(uuid? (::project-id cfg))))
(dm/assert!
"expected instance of jio/IOFactory for `input`"
(satisfies? jio/IOFactory input))
(let [id (uuid/next)
tp (dt/tpoint)
cs (volatile! nil)]
(l/info :hint "import: started" :id (str id))
(try
(binding [*position* (atom 0)]
(pu/with-open [input (io/input-stream input)]
(read-import! (assoc cfg ::input input))))
(catch ZstdIOException cause
(ex/raise :type :validation
:code :invalid-penpot-file
:hint "invalid penpot file received: probably truncated"
:cause cause))
(catch Throwable cause
(vreset! cs cause)
(throw cause))
(finally
(l/info :hint "import: terminated"
:id (str id)
:elapsed (dt/format-duration (tp))
:error? (some? @cs))))))
+438
View File
@@ -0,0 +1,438 @@
;; 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.v2
"A sqlite3 based binary file exportation with support for exportation
of entire team (or multiple teams) at once."
(:refer-clojure :exclude [read])
(:require
[app.binfile.common :as bfc]
[app.common.data :as d]
[app.common.features :as cfeat]
[app.common.logging :as l]
[app.common.transit :as t]
[app.common.uuid :as uuid]
[app.config :as cf]
[app.db :as db]
[app.db.sql :as sql]
[app.loggers.audit :as-alias audit]
[app.loggers.webhooks :as-alias webhooks]
[app.storage :as sto]
[app.storage.tmp :as tmp]
[app.util.events :as events]
[app.util.time :as dt]
[app.worker :as-alias wrk]
[clojure.set :as set]
[cuerdas.core :as str]
[datoteka.io :as io]
[promesa.util :as pu])
(:import
java.sql.DriverManager))
(set! *warn-on-reflection* true)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; LOW LEVEL API
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn- create-database
([cfg]
(let [path (tmp/tempfile :prefix "penpot.binfile." :suffix ".sqlite")]
(create-database cfg path)))
([cfg path]
(let [db (DriverManager/getConnection (str "jdbc:sqlite:" path))]
(assoc cfg ::db db ::path path))))
(def ^:private
sql:create-kvdata-table
"CREATE TABLE kvdata (
tag text NOT NULL,
key text NOT NULL,
val text NOT NULL,
dat blob NULL
)")
(def ^:private
sql:create-kvdata-index
"CREATE INDEX kvdata__tag_key__idx
ON kvdata (tag, key)")
(defn- setup-schema!
[{:keys [::db]}]
(db/exec-one! db [sql:create-kvdata-table])
(db/exec-one! db [sql:create-kvdata-index]))
(defn- write!
[{:keys [::db]} tag k v & [data]]
(db/insert! db :kvdata
{:tag (d/name tag)
:key (str k)
:val (t/encode-str v {:type :json-verbose})
:dat data}
{::db/return-keys false}))
(defn- read-blob
[{:keys [::db]} tag k]
(let [obj (db/get db :kvdata
{:tag (d/name tag)
:key (str k)}
{::sql/columns [:dat]})]
(:dat obj)))
(defn- read-seq
([{:keys [::db]} tag]
(->> (db/query db :kvdata
{:tag (d/name tag)}
{::sql/columns [::val]})
(map :val)
(map t/decode-str)))
([{:keys [::db]} tag k]
(->> (db/query db :kvdata
{:tag (d/name tag)
:key (str k)}
{::sql/columns [::val]})
(map :val)
(map t/decode-str))))
(defn- read-obj
[{:keys [::db]} tag k]
(let [obj (db/get db :kvdata
{:tag (d/name tag)
:key (str k)}
{::sql/columns [:val]})]
(-> obj :val t/decode-str)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; IMPORT/EXPORT IMPL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(declare ^:private write-project!)
(declare ^:private write-file!)
(defn- write-team!
[cfg team-id]
(let [team (bfc/get-team cfg team-id)
fonts (bfc/get-fonts cfg team-id)]
(events/tap :progress
{:op :export
:section :write-team
:id team-id
:name (:name team)})
(l/trc :hint "write" :obj "team"
:id (str team-id)
:fonts (count fonts))
(when-let [photo-id (:photo-id team)]
(vswap! bfc/*state* update :storage-objects conj photo-id))
(vswap! bfc/*state* update :teams conj team-id)
(vswap! bfc/*state* bfc/collect-storage-objects fonts)
(write! cfg :team team-id team)
(doseq [{:keys [id] :as font} fonts]
(vswap! bfc/*state* update :team-font-variants conj id)
(write! cfg :team-font-variant id font))))
(defn- write-project!
[cfg project-id]
(let [project (bfc/get-project cfg project-id)]
(events/tap :progress
{:op :export
:section :write-project
:id project-id
:name (:name project)})
(l/trc :hint "write" :obj "project" :id (str project-id))
(write! cfg :project (str project-id) project)
(vswap! bfc/*state* update :projects conj project-id)))
(defn- write-file!
[cfg file-id]
(let [file (bfc/get-file cfg file-id)
thumbs (bfc/get-file-object-thumbnails cfg file-id)
media (bfc/get-file-media cfg file)
rels (bfc/get-files-rels cfg #{file-id})]
(events/tap :progress
{:op :export
:section :write-file
:id file-id
:name (:name file)})
(vswap! bfc/*state* (fn [state]
(-> state
(update :files conj file-id)
(update :file-media-objects into bfc/xf-map-id media)
(bfc/collect-storage-objects thumbs)
(bfc/collect-storage-objects media))))
(write! cfg :file file-id file)
(write! cfg :file-rels file-id rels)
(run! (partial write! cfg :file-media-object file-id) media)
(run! (partial write! cfg :file-object-thumbnail file-id) thumbs)
(when-let [thumb (bfc/get-file-thumbnail cfg file)]
(vswap! bfc/*state* bfc/collect-storage-objects [thumb])
(write! cfg :file-thumbnail file-id thumb))
(l/trc :hint "write" :obj "file"
:thumbnails (count thumbs)
:rels (count rels)
:media (count media))))
(defn- write-storage-object!
[{:keys [::sto/storage] :as cfg} id]
(let [sobj (sto/get-object storage id)
data (with-open [input (sto/get-object-data storage sobj)]
(io/read-as-bytes input))]
(l/trc :hint "write" :obj "storage-object" :id (str id) :size (:size sobj))
(write! cfg :storage-object id (meta sobj) data)))
(defn- read-storage-object!
[{:keys [::sto/storage ::bfc/timestamp] :as cfg} id]
(let [mdata (read-obj cfg :storage-object id)
data (read-blob cfg :storage-object id)
hash (sto/calculate-hash data)
content (-> (sto/content data)
(sto/wrap-with-hash hash))
params (-> mdata
(assoc ::sto/content content)
(assoc ::sto/deduplicate? true)
(assoc ::sto/touched-at timestamp))
sobject (sto/put-object! storage params)]
(vswap! bfc/*state* update :index assoc id (:id sobject))
(l/trc :hint "read" :obj "storage-object"
:id (str id)
:new-id (str (:id sobject))
:size (:size sobject))))
(defn read-team!
[{:keys [::db/conn ::bfc/timestamp] :as cfg} team-id]
(l/trc :hint "read" :obj "team" :id (str team-id))
(let [team (read-obj cfg :team team-id)
team (-> team
(update :id bfc/lookup-index)
(update :photo-id bfc/lookup-index)
(assoc :created-at timestamp)
(assoc :modified-at timestamp))]
(events/tap :progress
{:op :import
:section :read-team
:id team-id
:name (:name team)})
(db/insert! conn :team
(update team :features db/encode-pgarray conn "text")
::db/return-keys false)
(doseq [font (->> (read-seq cfg :team-font-variant)
(filter #(= team-id (:team-id %))))]
(let [font (-> font
(update :id bfc/lookup-index)
(update :team-id bfc/lookup-index)
(update :woff1-file-id bfc/lookup-index)
(update :woff2-file-id bfc/lookup-index)
(update :ttf-file-id bfc/lookup-index)
(update :otf-file-id bfc/lookup-index)
(assoc :created-at timestamp)
(assoc :modified-at timestamp))]
(db/insert! conn :team-font-variant font
::db/return-keys false)))
team))
(defn read-project!
[{:keys [::db/conn ::bfc/timestamp] :as cfg} project-id]
(l/trc :hint "read" :obj "project" :id (str project-id))
(let [project (read-obj cfg :project project-id)
project (-> project
(update :id bfc/lookup-index)
(update :team-id bfc/lookup-index)
(assoc :created-at timestamp)
(assoc :modified-at timestamp))]
(events/tap :progress
{:op :import
:section :read-project
:id project-id
:name (:name project)})
(db/insert! conn :project project
::db/return-keys false)))
(defn read-file!
[{:keys [::db/conn ::bfc/timestamp] :as cfg} file-id]
(l/trc :hint "read" :obj "file" :id (str file-id))
(let [file (-> (read-obj cfg :file file-id)
(update :id bfc/lookup-index)
(update :project-id bfc/lookup-index)
(bfc/process-file))]
(events/tap :progress
{:op :import
:section :read-file
:id file-id
:name (:name file)})
;; All features that are enabled and requires explicit migration are
;; added to the state for a posterior migration step.
(doseq [feature (-> (::bfc/features cfg)
(set/difference cfeat/no-migration-features)
(set/difference (:features file)))]
(vswap! bfc/*state* update :pending-to-migrate (fnil conj []) [feature (:id file)]))
(bfc/persist-file! cfg file))
(doseq [thumbnail (read-seq cfg :file-object-thumbnail file-id)]
(let [thumbnail (-> thumbnail
(update :file-id bfc/lookup-index)
(update :media-id bfc/lookup-index))
file-id (:file-id thumbnail)
thumbnail (update thumbnail :object-id
#(str/replace-first % #"^(.*?)/" (str file-id "/")))]
(db/insert! conn :file-tagged-object-thumbnail thumbnail
{::db/return-keys false})))
(doseq [rel (read-obj cfg :file-rels file-id)]
(let [rel (-> rel
(update :file-id bfc/lookup-index)
(update :library-file-id bfc/lookup-index)
(assoc :synced-at timestamp))]
(db/insert! conn :file-library-rel rel
::db/return-keys false)))
(doseq [media (read-seq cfg :file-media-object file-id)]
(let [media (-> media
(update :id bfc/lookup-index)
(update :file-id bfc/lookup-index)
(update :media-id bfc/lookup-index)
(update :thumbnail-id bfc/lookup-index))]
(db/insert! conn :file-media-object media
::db/return-keys false
::sql/on-conflict-do-nothing true))))
(def ^:private empty-summary
{:teams #{}
:files #{}
:projects #{}
:file-media-objects #{}
:team-font-variants #{}
:storage-objects #{}})
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PUBLIC API
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn export-team!
[cfg team-id]
(let [id (uuid/next)
tp (dt/tpoint)
cfg (create-database cfg)]
(l/inf :hint "start"
:operation "export"
:id (str id)
:path (str (::path cfg)))
(try
(db/tx-run! cfg (fn [cfg]
(setup-schema! cfg)
(binding [bfc/*state* (volatile! empty-summary)]
(write-team! cfg team-id)
(run! (partial write-project! cfg)
(bfc/get-team-projects cfg team-id))
(run! (partial write-file! cfg)
(bfc/get-team-files cfg team-id))
(run! (partial write-storage-object! cfg)
(-> bfc/*state* deref :storage-objects))
(write! cfg :manifest "team-id" team-id)
(write! cfg :manifest "objects" (deref bfc/*state*))
(::path cfg))))
(finally
(pu/close! (::db cfg))
(let [elapsed (tp)]
(l/inf :hint "end"
:operation "export"
:id (str id)
:elapsed (dt/format-duration elapsed)))))))
(defn import-team!
[cfg path]
(let [id (uuid/next)
tp (dt/tpoint)
cfg (-> (create-database cfg path)
(assoc ::bfc/timestamp (dt/now)))]
(l/inf :hint "start"
:operation "import"
:id (str id)
:path (str (::path cfg)))
(try
(db/tx-run! cfg (fn [{:keys [::db/conn] :as cfg}]
(db/exec-one! conn ["SET idle_in_transaction_session_timeout = 0"])
(db/exec-one! conn ["SET CONSTRAINTS ALL DEFERRED"])
(binding [bfc/*state* (volatile! {:index {}})]
(let [objects (read-obj cfg :manifest "objects")]
;; We first process all storage objects, they have
;; deduplication so we can't rely on simple reindex. This
;; operation populates the index for all storage objects.
(run! (partial read-storage-object! cfg) (:storage-objects objects))
;; Populate index with all the incoming objects
(vswap! bfc/*state* update :index
(fn [index]
(-> index
(bfc/update-index (:teams objects))
(bfc/update-index (:projects objects))
(bfc/update-index (:files objects))
(bfc/update-index (:file-media-objects objects))
(bfc/update-index (:team-font-variants objects)))))
(let [team-id (read-obj cfg :manifest "team-id")
team (read-team! cfg team-id)
features (cfeat/get-team-enabled-features cf/flags team)
cfg (assoc cfg ::bfc/features features)]
(run! (partial read-project! cfg) (:projects objects))
(run! (partial read-file! cfg) (:files objects))
;; (run-pending-migrations! cfg)
team)))))
(finally
(pu/close! (::db cfg))
(let [elapsed (tp)]
(l/inf :hint "end"
:operation "import"
:id (str id)
:elapsed (dt/format-duration elapsed)))))))
+184 -264
View File
@@ -11,30 +11,17 @@
[app.common.data :as d]
[app.common.exceptions :as ex]
[app.common.flags :as flags]
[app.common.spec :as us]
[app.common.schema :as sm]
[app.common.version :as v]
[app.util.overrides]
[app.util.time :as dt]
[clojure.core :as c]
[clojure.java.io :as io]
[clojure.pprint :as pprint]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[datoteka.fs :as fs]
[environ.core :refer [env]]
[integrant.core :as ig]))
(prefer-method print-method
clojure.lang.IRecord
clojure.lang.IDeref)
(prefer-method print-method
clojure.lang.IPersistentMap
clojure.lang.IDeref)
(prefer-method pprint/simple-dispatch
clojure.lang.IPersistentMap
clojure.lang.IDeref)
(defmethod ig/init-key :default
[_ data]
(d/without-nils data))
@@ -45,18 +32,19 @@
(d/without-nils data)
data))
(def defaults
(def default
{:database-uri "postgresql://postgres/penpot"
:database-username "penpot"
:database-password "penpot"
:default-blob-version 5
:default-blob-version 4
:rpc-rlimit-config (fs/path "resources/rlimit.edn")
:rpc-climit-config (fs/path "resources/climit.edn")
:rpc-rlimit-config "resources/rlimit.edn"
:rpc-climit-config "resources/climit.edn"
:file-change-snapshot-every 5
:file-change-snapshot-timeout "3h"
:auto-file-snapshot-total 10
:auto-file-snapshot-every 5
:auto-file-snapshot-timeout "3h"
:public-uri "http://localhost:3449"
:host "localhost"
@@ -64,8 +52,8 @@
:redis-uri "redis://redis/0"
:assets-storage-backend :assets-fs
:storage-assets-fs-directory "assets"
:objects-storage-backend "fs"
:objects-storage-fs-directory "assets"
:assets-path "/internal/assets/"
:smtp-default-reply-to "Penpot <no-reply@example.com>"
@@ -79,261 +67,172 @@
:telemetry-uri "https://telemetry.penpot.app/"
:media-max-file-size (* 1024 1024 30) ; 30MiB
:ldap-user-query "(|(uid=:username)(mail=:username))"
:ldap-attrs-username "uid"
:ldap-attrs-email "mail"
:ldap-attrs-fullname "cn"
;; a server prop key where initial project is stored.
:initial-project-skey "initial-project"})
:initial-project-skey "initial-project"
(s/def ::default-rpc-rlimit ::us/vector-of-strings)
(s/def ::rpc-rlimit-config ::fs/path)
(s/def ::rpc-climit-config ::fs/path)
;; time to avoid email sending after profile modification
:email-verify-threshold "15m"})
(s/def ::media-max-file-size ::us/integer)
(def schema:config
(do #_sm/optional-keys
[:map {:title "config"}
[:flags {:optional true} [::sm/set :string]]
[:admins {:optional true} [::sm/set ::sm/email]]
[:secret-key {:optional true} :string]
(s/def ::flags ::us/vector-of-keywords)
(s/def ::telemetry-enabled ::us/boolean)
[:tenant {:optional false} :string]
[:public-uri {:optional false} :string]
[:host {:optional false} :string]
(s/def ::audit-log-archive-uri ::us/string)
(s/def ::audit-log-http-handler-concurrency ::us/integer)
[:http-server-port {:optional true} ::sm/int]
[:http-server-host {:optional true} :string]
[:http-server-max-body-size {:optional true} ::sm/int]
[:http-server-max-multipart-body-size {:optional true} ::sm/int]
[:http-server-io-threads {:optional true} ::sm/int]
[:http-server-worker-threads {:optional true} ::sm/int]
(s/def ::admins ::us/set-of-valid-emails)
(s/def ::file-change-snapshot-every ::us/integer)
(s/def ::file-change-snapshot-timeout ::dt/duration)
[:telemetry-uri {:optional true} :string]
[:telemetry-with-taiga {:optional true} ::sm/boolean] ;; DELETE
(s/def ::default-executor-parallelism ::us/integer)
(s/def ::scheduled-executor-parallelism ::us/integer)
[:auto-file-snapshot-total {:optional true} ::sm/int]
[:auto-file-snapshot-every {:optional true} ::sm/int]
[:auto-file-snapshot-timeout {:optional true} ::dt/duration]
(s/def ::worker-default-parallelism ::us/integer)
(s/def ::worker-webhook-parallelism ::us/integer)
[:media-max-file-size {:optional true} ::sm/int]
[:deletion-delay {:optional true} ::dt/duration] ;; REVIEW
[:telemetry-enabled {:optional true} ::sm/boolean]
[:default-blob-version {:optional true} ::sm/int]
[:allow-demo-users {:optional true} ::sm/boolean]
[:error-report-webhook {:optional true} :string]
[:user-feedback-destination {:optional true} :string]
(s/def ::authenticated-cookie-domain ::us/string)
(s/def ::authenticated-cookie-name ::us/string)
(s/def ::auth-token-cookie-name ::us/string)
(s/def ::auth-token-cookie-max-age ::dt/duration)
[:default-rpc-rlimit {:optional true} [::sm/vec :string]]
[:rpc-rlimit-config {:optional true} ::fs/path]
[:rpc-climit-config {:optional true} ::fs/path]
(s/def ::secret-key ::us/string)
(s/def ::allow-demo-users ::us/boolean)
(s/def ::assets-path ::us/string)
(s/def ::database-password (s/nilable ::us/string))
(s/def ::database-uri ::us/string)
(s/def ::database-username (s/nilable ::us/string))
(s/def ::database-readonly ::us/boolean)
(s/def ::database-min-pool-size ::us/integer)
(s/def ::database-max-pool-size ::us/integer)
[:audit-log-archive-uri {:optional true} :string]
[:audit-log-http-handler-concurrency {:optional true} ::sm/int]
(s/def ::quotes-teams-per-profile ::us/integer)
(s/def ::quotes-access-tokens-per-profile ::us/integer)
(s/def ::quotes-projects-per-team ::us/integer)
(s/def ::quotes-invitations-per-team ::us/integer)
(s/def ::quotes-profiles-per-team ::us/integer)
(s/def ::quotes-files-per-project ::us/integer)
(s/def ::quotes-files-per-team ::us/integer)
(s/def ::quotes-font-variants-per-team ::us/integer)
(s/def ::quotes-comment-threads-per-file ::us/integer)
(s/def ::quotes-comments-per-file ::us/integer)
[:default-executor-parallelism {:optional true} ::sm/int] ;; REVIEW
[:scheduled-executor-parallelism {:optional true} ::sm/int] ;; REVIEW
[:worker-default-parallelism {:optional true} ::sm/int]
[:worker-webhook-parallelism {:optional true} ::sm/int]
(s/def ::default-blob-version ::us/integer)
(s/def ::error-report-webhook ::us/string)
(s/def ::user-feedback-destination ::us/string)
(s/def ::github-client-id ::us/string)
(s/def ::github-client-secret ::us/string)
(s/def ::gitlab-base-uri ::us/string)
(s/def ::gitlab-client-id ::us/string)
(s/def ::gitlab-client-secret ::us/string)
(s/def ::google-client-id ::us/string)
(s/def ::google-client-secret ::us/string)
(s/def ::oidc-client-id ::us/string)
(s/def ::oidc-user-info-source ::us/keyword)
(s/def ::oidc-client-secret ::us/string)
(s/def ::oidc-base-uri ::us/string)
(s/def ::oidc-token-uri ::us/string)
(s/def ::oidc-auth-uri ::us/string)
(s/def ::oidc-user-uri ::us/string)
(s/def ::oidc-jwks-uri ::us/string)
(s/def ::oidc-scopes ::us/set-of-strings)
(s/def ::oidc-roles ::us/set-of-strings)
(s/def ::oidc-roles-attr ::us/string)
(s/def ::oidc-email-attr ::us/string)
(s/def ::oidc-name-attr ::us/string)
(s/def ::host ::us/string)
(s/def ::http-server-port ::us/integer)
(s/def ::http-server-host ::us/string)
(s/def ::http-server-max-body-size ::us/integer)
(s/def ::http-server-max-multipart-body-size ::us/integer)
(s/def ::http-server-io-threads ::us/integer)
(s/def ::http-server-worker-threads ::us/integer)
(s/def ::ldap-attrs-email ::us/string)
(s/def ::ldap-attrs-fullname ::us/string)
(s/def ::ldap-attrs-username ::us/string)
(s/def ::ldap-base-dn ::us/string)
(s/def ::ldap-bind-dn ::us/string)
(s/def ::ldap-bind-password ::us/string)
(s/def ::ldap-host ::us/string)
(s/def ::ldap-port ::us/integer)
(s/def ::ldap-ssl ::us/boolean)
(s/def ::ldap-starttls ::us/boolean)
(s/def ::ldap-user-query ::us/string)
(s/def ::media-directory ::us/string)
(s/def ::media-uri ::us/string)
(s/def ::profile-bounce-max-age ::dt/duration)
(s/def ::profile-bounce-threshold ::us/integer)
(s/def ::profile-complaint-max-age ::dt/duration)
(s/def ::profile-complaint-threshold ::us/integer)
(s/def ::public-uri ::us/string)
(s/def ::redis-uri ::us/string)
(s/def ::registration-domain-whitelist ::us/set-of-strings)
[:database-password {:optional true} [:maybe :string]]
[:database-uri {:optional true} :string]
[:database-username {:optional true} [:maybe :string]]
[:database-readonly {:optional true} ::sm/boolean]
[:database-min-pool-size {:optional true} ::sm/int]
[:database-max-pool-size {:optional true} ::sm/int]
(s/def ::smtp-default-from ::us/string)
(s/def ::smtp-default-reply-to ::us/string)
(s/def ::smtp-host ::us/string)
(s/def ::smtp-password (s/nilable ::us/string))
(s/def ::smtp-port ::us/integer)
(s/def ::smtp-ssl ::us/boolean)
(s/def ::smtp-tls ::us/boolean)
(s/def ::smtp-username (s/nilable ::us/string))
(s/def ::urepl-host ::us/string)
(s/def ::urepl-port ::us/integer)
(s/def ::prepl-host ::us/string)
(s/def ::prepl-port ::us/integer)
(s/def ::assets-storage-backend ::us/keyword)
(s/def ::storage-assets-fs-directory ::us/string)
(s/def ::storage-assets-s3-bucket ::us/string)
(s/def ::storage-assets-s3-region ::us/keyword)
(s/def ::storage-assets-s3-endpoint ::us/string)
(s/def ::storage-assets-s3-io-threads ::us/integer)
(s/def ::telemetry-uri ::us/string)
(s/def ::telemetry-with-taiga ::us/boolean)
(s/def ::tenant ::us/string)
[:quotes-teams-per-profile {:optional true} ::sm/int]
[:quotes-access-tokens-per-profile {:optional true} ::sm/int]
[:quotes-projects-per-team {:optional true} ::sm/int]
[:quotes-invitations-per-team {:optional true} ::sm/int]
[:quotes-profiles-per-team {:optional true} ::sm/int]
[:quotes-files-per-project {:optional true} ::sm/int]
[:quotes-files-per-team {:optional true} ::sm/int]
[:quotes-font-variants-per-team {:optional true} ::sm/int]
[:quotes-comment-threads-per-file {:optional true} ::sm/int]
[:quotes-comments-per-file {:optional true} ::sm/int]
(s/def ::config
(s/keys :opt-un [::secret-key
::flags
::admins
::allow-demo-users
::audit-log-archive-uri
::audit-log-http-handler-concurrency
::auth-token-cookie-name
::auth-token-cookie-max-age
::authenticated-cookie-name
::authenticated-cookie-domain
::database-password
::database-uri
::database-username
::database-readonly
::database-min-pool-size
::database-max-pool-size
::default-blob-version
::default-rpc-rlimit
::error-report-webhook
::default-executor-parallelism
::scheduled-executor-parallelism
::worker-default-parallelism
::worker-webhook-parallelism
::file-change-snapshot-every
::file-change-snapshot-timeout
::user-feedback-destination
::github-client-id
::github-client-secret
::gitlab-base-uri
::gitlab-client-id
::gitlab-client-secret
::google-client-id
::google-client-secret
::oidc-client-id
::oidc-client-secret
::oidc-user-info-source
::oidc-base-uri
::oidc-token-uri
::oidc-auth-uri
::oidc-user-uri
::oidc-jwks-uri
::oidc-scopes
::oidc-roles-attr
::oidc-email-attr
::oidc-name-attr
::oidc-roles
::host
::http-server-host
::http-server-port
::http-server-max-body-size
::http-server-max-multipart-body-size
::http-server-io-threads
::http-server-worker-threads
::ldap-attrs-email
::ldap-attrs-fullname
::ldap-attrs-username
::ldap-base-dn
::ldap-bind-dn
::ldap-bind-password
::ldap-host
::ldap-port
::ldap-ssl
::ldap-starttls
::ldap-user-query
::local-assets-uri
::media-max-file-size
::profile-bounce-max-age
::profile-bounce-threshold
::profile-complaint-max-age
::profile-complaint-threshold
::public-uri
[:auth-data-cookie-domain {:optional true} :string]
[:auth-token-cookie-name {:optional true} :string]
[:auth-token-cookie-max-age {:optional true} ::dt/duration]
::quotes-teams-per-profile
::quotes-access-tokens-per-profile
::quotes-projects-per-team
::quotes-invitations-per-team
::quotes-profiles-per-team
::quotes-files-per-project
::quotes-files-per-team
::quotes-font-variants-per-team
::quotes-comment-threads-per-file
::quotes-comments-per-file
[:registration-domain-whitelist {:optional true} [::sm/set :string]]
[:email-verify-threshold {:optional true} ::dt/duration]
::redis-uri
::registration-domain-whitelist
::rpc-rlimit-config
::rpc-climit-config
[:github-client-id {:optional true} :string]
[:github-client-secret {:optional true} :string]
[:gitlab-base-uri {:optional true} :string]
[:gitlab-client-id {:optional true} :string]
[:gitlab-client-secret {:optional true} :string]
[:google-client-id {:optional true} :string]
[:google-client-secret {:optional true} :string]
[:oidc-client-id {:optional true} :string]
[:oidc-user-info-source {:optional true} :keyword]
[:oidc-client-secret {:optional true} :string]
[:oidc-base-uri {:optional true} :string]
[:oidc-token-uri {:optional true} :string]
[:oidc-auth-uri {:optional true} :string]
[:oidc-user-uri {:optional true} :string]
[:oidc-jwks-uri {:optional true} :string]
[:oidc-scopes {:optional true} [::sm/set :string]]
[:oidc-roles {:optional true} [::sm/set :string]]
[:oidc-roles-attr {:optional true} :string]
[:oidc-email-attr {:optional true} :string]
[:oidc-name-attr {:optional true} :string]
::semaphore-process-font
::semaphore-process-image
::semaphore-update-file
::semaphore-auth
[:ldap-attrs-email {:optional true} :string]
[:ldap-attrs-fullname {:optional true} :string]
[:ldap-attrs-username {:optional true} :string]
[:ldap-base-dn {:optional true} :string]
[:ldap-bind-dn {:optional true} :string]
[:ldap-bind-password {:optional true} :string]
[:ldap-host {:optional true} :string]
[:ldap-port {:optional true} ::sm/int]
[:ldap-ssl {:optional true} ::sm/boolean]
[:ldap-starttls {:optional true} ::sm/boolean]
[:ldap-user-query {:optional true} :string]
::smtp-default-from
::smtp-default-reply-to
::smtp-host
::smtp-password
::smtp-port
::smtp-ssl
::smtp-tls
::smtp-username
[:profile-bounce-max-age {:optional true} ::dt/duration]
[:profile-bounce-threshold {:optional true} ::sm/int]
[:profile-complaint-max-age {:optional true} ::dt/duration]
[:profile-complaint-threshold {:optional true} ::sm/int]
::urepl-host
::urepl-port
::prepl-host
::prepl-port
[:redis-uri {:optional true} :string]
::assets-storage-backend
::storage-assets-fs-directory
::storage-assets-s3-bucket
::storage-assets-s3-region
::storage-assets-s3-endpoint
::storage-assets-s3-io-threads
::telemetry-enabled
::telemetry-uri
::telemetry-referer
::telemetry-with-taiga
::tenant]))
[:email-domain-blacklist {:optional true} ::fs/path]
[:email-domain-whitelist {:optional true} ::fs/path]
[:smtp-default-from {:optional true} :string]
[:smtp-default-reply-to {:optional true} :string]
[:smtp-host {:optional true} :string]
[:smtp-password {:optional true} [:maybe :string]]
[:smtp-port {:optional true} ::sm/int]
[:smtp-ssl {:optional true} ::sm/boolean]
[:smtp-tls {:optional true} ::sm/boolean]
[:smtp-username {:optional true} [:maybe :string]]
[:urepl-host {:optional true} :string]
[:urepl-port {:optional true} ::sm/int]
[:prepl-host {:optional true} :string]
[:prepl-port {:optional true} ::sm/int]
[:media-directory {:optional true} :string] ;; REVIEW
[:media-uri {:optional true} :string]
[:assets-path {:optional true} :string]
;; Legacy, will be removed in 2.5
[:assets-storage-backend {:optional true} :keyword]
[:storage-assets-fs-directory {:optional true} :string]
[:storage-assets-s3-bucket {:optional true} :string]
[:storage-assets-s3-region {:optional true} :keyword]
[:storage-assets-s3-endpoint {:optional true} :string]
[:storage-assets-s3-io-threads {:optional true} ::sm/int]
[:objects-storage-backend {:optional true} :keyword]
[:objects-storage-fs-directory {:optional true} :string]
[:objects-storage-s3-bucket {:optional true} :string]
[:objects-storage-s3-region {:optional true} :keyword]
[:objects-storage-s3-endpoint {:optional true} :string]
[: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-email-verification
:enable-v2-migration])
(defn- parse-flags
[config]
@@ -353,20 +252,22 @@
{}
env)))
(defn- read-config
[]
(try
(->> (read-env "penpot")
(merge defaults)
(us/conform ::config))
(catch Throwable e
(when (ex/error? e)
(println ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;")
(println "Error on validating configuration:")
(println (some-> e ex-data ex/explain))
(println (ex/explain (ex-data e)))
(println ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"))
(throw e))))
(def decode-config
(sm/decoder schema:config sm/string-transformer))
(def validate-config
(sm/validator schema:config))
(def explain-config
(sm/explainer schema:config))
(defn read-config
"Reads the configuration from enviroment variables and decodes all
known values."
[& {:keys [prefix default] :or {prefix "penpot"}}]
(->> (read-env prefix)
(merge default)
(decode-config)))
(def version
(v/parse (or (some-> (io/resource "version.txt")
@@ -374,11 +275,30 @@
(str/trim))
"%version%")))
(defonce ^:dynamic config (read-config))
(defonce ^:dynamic config (read-config :default default))
(defonce ^:dynamic flags (parse-flags config))
(def deletion-delay
(dt/duration {:days 7}))
(defn validate!
"Validate the currently loaded configuration data."
[& {:keys [exit-on-error?] :or {exit-on-error? true}}]
(if (validate-config config)
true
(let [explain (explain-config config)]
(println "Error on validating configuration:")
(sm/pretty-explain explain
:variant ::sm/schemaless-explain
:message "Configuration Validation Error")
(flush)
(if exit-on-error?
(System/exit -1)
(ex/raise :type :validation
:code :config-validaton
::sm/explain explain)))))
(defn get-deletion-delay
[]
(or (c/get config :deletion-delay)
(dt/duration {:days 7})))
(defn get
"A configuration getter. Helps code be more testable."
+156 -58
View File
@@ -19,6 +19,7 @@
[app.util.json :as json]
[app.util.time :as dt]
[clojure.java.io :as io]
[clojure.set :as set]
[clojure.spec.alpha :as s]
[integrant.core :as ig]
[next.jdbc :as jdbc]
@@ -152,7 +153,7 @@
(s/def ::conn some?)
(s/def ::nilable-pool (s/nilable ::pool))
(s/def ::pool pool?)
(s/def ::pool-or-conn some?)
(s/def ::connectable some?)
(defn closed?
[pool]
@@ -236,8 +237,11 @@
(jdbc/get-connection system-or-pool)
(if (map? system-or-pool)
(open (::pool system-or-pool))
(ex/raise :type :internal
:code :unable-resolve-pool))))
(throw (IllegalArgumentException. "unable to resolve connection pool")))))
(defn get-update-count
[result]
(:next.jdbc/update-count result))
(defn get-connection
[cfg-or-conn]
@@ -245,9 +249,7 @@
cfg-or-conn
(if (map? cfg-or-conn)
(get-connection (::conn cfg-or-conn))
(ex/raise :type :internal
:code :unable-resolve-connection
:hint "expected conn or system map"))))
(throw (IllegalArgumentException. "unable to resolve connection")))))
(defn connection-map?
"Check if the provided value is a map like data structure that
@@ -255,58 +257,130 @@
[o]
(and (map? o) (connection? (::conn o))))
(defn- get-connectable
(defn get-connectable
"Resolve to a connection or connection pool instance; if it is not
possible, raises an exception"
[o]
(cond
(connection? o) o
(pool? o) o
(map? o) (get-connectable (or (::conn o) (::pool o)))
:else (ex/raise :type :internal
:code :unable-resolve-connectable
:hint "expected conn, pool or system")))
:else (throw (IllegalArgumentException. "unable to resolve connectable"))))
(def ^:private params-mapping
{::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})
(def ^:private default-opts
{:builder-fn sql/as-kebab-maps})
(defn exec!
([ds sv]
(-> (get-connectable ds)
(jdbc/execute! sv default-opts)))
([ds sv] (exec! ds sv nil))
([ds sv opts]
(-> (get-connectable ds)
(jdbc/execute! sv (into default-opts (sql/adapt-opts opts))))))
(let [conn (get-connectable ds)
opts (if (empty? opts)
default-opts
(into default-opts (rename-opts opts)))]
(jdbc/execute! conn sv opts))))
(defn exec-one!
([ds sv]
(-> (get-connectable ds)
(jdbc/execute-one! sv default-opts)))
([ds sv] (exec-one! ds sv nil))
([ds sv opts]
(-> (get-connectable ds)
(jdbc/execute-one! sv (into default-opts (sql/adapt-opts opts))))))
(let [conn (get-connectable ds)
opts (if (empty? opts)
default-opts
(into default-opts (rename-opts opts)))]
(jdbc/execute-one! conn sv opts))))
(defn insert!
[ds table params & {:as opts :keys [::return-keys?] :or {return-keys? true}}]
(-> (get-connectable ds)
(exec-one! (sql/insert table params opts)
(assoc opts ::return-keys? return-keys?))))
"A helper that builds an insert sql statement and executes it. By
default returns the inserted row with all the field; you can delimit
the returned columns with the `::columns` option."
[ds table params & {:as opts}]
(let [conn (get-connectable ds)
sql (sql/insert table params opts)
opts (if (empty? opts)
default-insert-opts
(into default-insert-opts (rename-opts opts)))]
(jdbc/execute-one! conn sql opts)))
(defn insert-multi!
[ds table cols rows & {:as opts :keys [::return-keys?] :or {return-keys? true}}]
(-> (get-connectable ds)
(exec! (sql/insert-multi table cols rows opts)
(assoc opts ::return-keys? return-keys?))))
(defn insert-many!
"An optimized version of `insert!` that perform insertion of multiple
values at once.
This expands to a single SQL statement with placeholders for every
value being inserted. For large data sets, this may exceed the limit
of sql string size and/or number of parameters."
[ds table cols rows & {:as opts}]
(let [conn (get-connectable ds)
sql (sql/insert-many table cols rows opts)
opts (if (empty? opts)
default-insert-opts
(into default-insert-opts (rename-opts opts)))
opts (update opts :return-keys boolean)]
(jdbc/execute! conn sql opts)))
(defn update!
[ds table params where & {:as opts :keys [::return-keys?] :or {return-keys? true}}]
(-> (get-connectable ds)
(exec-one! (sql/update table params where opts)
(assoc opts ::return-keys? return-keys?))))
"A helper that build an UPDATE SQL statement and executes it.
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.
By default returns an object with the number of affected rows; a
complete row can be returned if you pass `::return-keys` with `true`
or with a vector of columns.
Also it can be combined with the `::many` option if you perform an
update to multiple rows and you want all the affected rows to be
returned."
[ds table params where & {:as opts}]
(let [conn (get-connectable ds)
sql (sql/update table params where opts)
opts (if (empty? opts)
default-opts
(into default-opts (rename-opts opts)))
opts (update opts :return-keys boolean)]
(if (::many opts)
(jdbc/execute! conn sql opts)
(jdbc/execute-one! conn sql opts))))
(defn delete!
[ds table params & {:as opts :keys [::return-keys?] :or {return-keys? true}}]
(-> (get-connectable ds)
(exec-one! (sql/delete table params opts)
(assoc opts ::return-keys? return-keys?))))
"A helper that builds an DELETE SQL statement and executes it.
Given a connectable object, a table name, and either a hash map of columns
and values to search on or a vector of a SQL where clause and parameters,
perform a delete on the table.
By default returns an object with the number of affected rows; a
complete row can be returned if you pass `::return-keys` with `true`
or with a vector of columns.
Also it can be combined with the `::many` option if you perform an
update to multiple rows and you want all the affected rows to be
returned."
[ds table params & {:as opts}]
(let [conn (get-connectable ds)
sql (sql/delete table params opts)
opts (if (empty? opts)
default-opts
(into default-opts (rename-opts opts)))]
(if (::many opts)
(jdbc/execute! conn sql opts)
(jdbc/execute-one! conn sql opts))))
(defn query
[ds table params & {:as opts}]
(exec! ds (sql/select table params opts) opts))
(defn is-row-deleted?
[{:keys [deleted-at]}]
@@ -320,7 +394,7 @@
[ds table params & {:as opts}]
(let [rows (exec! ds (sql/select table params opts))
rows (cond->> rows
(::remove-deleted? opts true)
(::remove-deleted opts true)
(remove is-row-deleted?))]
(first rows)))
@@ -329,10 +403,11 @@
filters. Raises :not-found exception if no object is found."
[ds table params & {:as opts}]
(let [row (get* ds table params opts)]
(when (and (not row) (::check-deleted? opts true))
(when (and (not row) (::check-deleted opts true))
(ex/raise :type :not-found
:code :object-not-found
:table table
:params params
:hint "database object not found"))
row))
@@ -341,14 +416,29 @@
(-> (get-connectable ds)
(jdbc/plan sql sql/default-opts)))
(defn cursor
"Return a lazy seq of rows using server side cursors"
[conn query & {:keys [chunk-size] :or {chunk-size 25}}]
(let [cname (str (gensym "cursor_"))
fquery [(str "FETCH " chunk-size " FROM " cname)]]
;; declare cursor
(exec-one! conn
(if (vector? query)
(into [(str "DECLARE " cname " CURSOR FOR " (nth query 0))]
(rest query))
[(str "DECLARE " cname " CURSOR FOR " query)]))
;; return a lazy seq
((fn fetch-more []
(lazy-seq
(when-let [chunk (seq (exec! conn fquery))]
(concat chunk (fetch-more))))))))
(defn get-by-id
[ds table id & {:as opts}]
(get ds table {:id id} opts))
(defn query
[ds table params & {:as opts}]
(exec! ds (sql/select table params opts)))
(defn pgobject?
([v]
(instance? PGobject v))
@@ -401,6 +491,10 @@
(.createArrayOf conn ^String type (into-array Object objects))
(.createArrayOf conn ^String type objects))))
(defn encode-pgarray
[data conn type]
(create-array conn type data))
(defn decode-pgpoint
[^PGpoint v]
(gpt/point (.-x v) (.-y v)))
@@ -421,12 +515,14 @@
(defn rollback!
([conn]
(let [^Connection conn (get-connection conn)]
(l/trc :hint "explicit rollback requested")
(.rollback conn)))
(if (and (map? conn) (::savepoint conn))
(rollback! conn (::savepoint conn))
(let [^Connection conn (get-connection conn)]
(l/trc :hint "explicit rollback requested")
(.rollback conn))))
([conn ^Savepoint sp]
(let [^Connection conn (get-connection conn)]
(l/trc :hint "explicit rollback requested")
(l/trc :hint "explicit rollback requested (savepoint)")
(.rollback conn sp))))
(defn tx-run!
@@ -442,23 +538,30 @@
(let [conn (::conn system)
sp (savepoint conn)]
(try
(let [result (apply f system params)]
(release! conn sp)
(let [system' (-> system
(assoc ::savepoint sp)
(dissoc ::rollback))
result (apply f system' params)]
(if (::rollback system)
(rollback! conn sp)
(release! conn sp))
result)
(catch Throwable cause
(rollback! conn sp)
(.rollback ^Connection conn ^Savepoint sp)
(throw cause))))
(::pool system)
(with-atomic [conn (::pool system)]
(let [system (assoc system ::conn conn)
result (apply f system params)]
(let [system' (-> system
(assoc ::conn conn)
(dissoc ::rollback))
result (apply f system' params)]
(when (::rollback system)
(rollback! conn))
result))
:else
(throw (IllegalArgumentException. "invalid arguments"))))
(throw (IllegalArgumentException. "invalid system/cfg provided"))))
(defn run!
[system f & params]
@@ -548,11 +651,6 @@
(.setType "jsonb")
(.setValue (json/encode-str data)))))
(defn get-update-count
[result]
(:next.jdbc/update-count result))
;; --- Locks
(def ^:private siphash-state
+16 -21
View File
@@ -8,7 +8,6 @@
(:refer-clojure :exclude [update])
(:require
[app.db :as-alias db]
[clojure.set :as set]
[clojure.string :as str]
[next.jdbc.optional :as jdbc-opt]
[next.jdbc.sql.builder :as sql]))
@@ -20,14 +19,6 @@
{:table-fn snake-case
:column-fn snake-case})
(def params-mapping
{::db/return-keys? :return-keys
::db/columns :columns})
(defn adapt-opts
[opts]
(set/rename-keys opts params-mapping))
(defn as-kebab-maps
[rs opts]
(jdbc-opt/as-unqualified-modified-maps rs (assoc opts :label-fn kebab-case)))
@@ -39,10 +30,13 @@
(let [opts (merge default-opts opts)
opts (cond-> opts
(::db/on-conflict-do-nothing? opts)
(assoc :suffix "ON CONFLICT DO NOTHING")
(::on-conflict-do-nothing opts)
(assoc :suffix "ON CONFLICT DO NOTHING"))]
(sql/for-insert table key-map opts))))
(defn insert-multi
(defn insert-many
[table cols rows opts]
(let [opts (merge default-opts opts)]
(sql/for-insert-multi table cols rows opts)))
@@ -53,11 +47,10 @@
([table where-params opts]
(let [opts (merge default-opts opts)
opts (cond-> opts
(::db/columns opts) (assoc :columns (::db/columns opts))
(::db/for-update? opts) (assoc :suffix "FOR UPDATE")
(::db/for-share? opts) (assoc :suffix "FOR KEY SHARE")
(:for-update opts) (assoc :suffix "FOR UPDATE")
(:for-key-share opts) (assoc :suffix "FOR KEY SHARE"))]
(::order-by opts) (assoc :order-by (::order-by opts))
(::columns opts) (assoc :columns (::columns opts))
(::for-update opts) (assoc :suffix "FOR UPDATE")
(::for-share opts) (assoc :suffix "FOR SHARE"))]
(sql/for-query table where-params opts))))
(defn update
@@ -65,11 +58,9 @@
(update table key-map where-params nil))
([table key-map where-params opts]
(let [opts (into default-opts opts)
opts (if-let [columns (::db/columns opts)]
(let [columns (if (seq columns)
(sql/as-cols columns opts)
"*")]
(assoc opts :suffix (str "RETURNING " columns)))
keys (::db/return-keys opts)
opts (if (vector? keys)
(assoc opts :suffix (str "RETURNING " (sql/as-cols keys opts)))
opts)]
(sql/for-update table key-map where-params opts))))
@@ -77,5 +68,9 @@
([table where-params]
(delete table where-params nil))
([table where-params opts]
(let [opts (merge default-opts opts)]
(let [opts (merge default-opts opts)
keys (::db/return-keys opts)
opts (if (vector? keys)
(assoc opts :suffix (str "RETURNING " (sql/as-cols keys opts)))
opts)]
(sql/for-delete table where-params opts))))
+111 -29
View File
@@ -7,14 +7,18 @@
(ns app.email
"Main api for send emails."
(:require
[app.common.data.macros :as dm]
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.pprint :as pp]
[app.common.schema :as sm]
[app.common.spec :as us]
[app.config :as cf]
[app.db :as db]
[app.db.sql :as sql]
[app.email.invite-to-team :as-alias email.invite-to-team]
[app.email.join-team :as-alias email.join-team]
[app.email.request-team-access :as-alias email.request-team-access]
[app.metrics :as mtx]
[app.util.template :as tmpl]
[app.worker :as wrk]
@@ -149,9 +153,27 @@
"mail.smtp.timeout" timeout
"mail.smtp.connectiontimeout" timeout}))
(def ^:private schema:smtp-config
[:map
[::username {:optional true} :string]
[::password {:optional true} :string]
[::tls {:optional true} ::sm/boolean]
[::ssl {:optional true} ::sm/boolean]
[::host {:optional true} :string]
[::port {:optional true} ::sm/int]
[::default-from {:optional true} :string]
[::default-reply-to {:optional true} :string]])
(def valid-smtp-config?
(sm/check-fn schema:smtp-config))
(defn- create-smtp-session
^Session
[cfg]
(dm/assert!
"expected valid smtp config"
(valid-smtp-config? cfg))
(let [props (opts->props cfg)]
(Session/getInstance props)))
@@ -262,44 +284,21 @@
(let [email (if factory
(factory context)
(dissoc context ::conn))]
(wrk/submit! (merge
{::wrk/task :sendmail
::wrk/delay 0
::wrk/max-retries 4
::wrk/priority 200
::wrk/conn conn}
email))))
(wrk/submit! {::wrk/task :sendmail
::wrk/delay 0
::wrk/max-retries 4
::wrk/priority 200
::db/conn conn
::wrk/params email})))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; SENDMAIL FN / TASK HANDLER
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(s/def ::username ::cf/smtp-username)
(s/def ::password ::cf/smtp-password)
(s/def ::tls ::cf/smtp-tls)
(s/def ::ssl ::cf/smtp-ssl)
(s/def ::host ::cf/smtp-host)
(s/def ::port ::cf/smtp-port)
(s/def ::default-reply-to ::cf/smtp-default-reply-to)
(s/def ::default-from ::cf/smtp-default-from)
(s/def ::smtp-config
(s/keys :opt [::username
::password
::tls
::ssl
::host
::port
::default-from
::default-reply-to]))
(declare send-to-logger!)
(s/def ::sendmail fn?)
(defmethod ig/pre-init-spec ::sendmail [_]
(s/spec ::smtp-config))
(defmethod ig/init-key ::sendmail
[_ cfg]
(fn [params]
@@ -307,6 +306,8 @@
(let [session (create-smtp-session cfg)]
(with-open [transport (.getTransport session (if (::ssl cfg) "smtps" "smtp"))]
(.connect ^Transport transport
^String (::host cfg)
^String (::port cfg)
^String (::username cfg)
^String (::password cfg))
@@ -400,6 +401,79 @@
"Teams member invitation email."
(template-factory ::invite-to-team))
(s/def ::email.join-team/invited-by ::us/string)
(s/def ::email.join-team/team ::us/string)
(s/def ::email.join-team/team-id ::us/uuid)
(s/def ::join-team
(s/keys :req-un [::email.join-team/invited-by
::email.join-team/team-id
::email.join-team/team]))
(def join-team
"Teams member joined after request email."
(template-factory ::join-team))
(s/def ::email.request-team-access/requested-by ::us/string)
(s/def ::email.request-team-access/requested-by-email ::us/string)
(s/def ::email.request-team-access/team-name ::us/string)
(s/def ::email.request-team-access/team-id ::us/uuid)
(s/def ::email.request-team-access/file-name ::us/string)
(s/def ::email.request-team-access/file-id ::us/uuid)
(s/def ::email.request-team-access/page-id ::us/uuid)
(s/def ::request-file-access
(s/keys :req-un [::email.request-team-access/requested-by
::email.request-team-access/requested-by-email
::email.request-team-access/team-name
::email.request-team-access/team-id
::email.request-team-access/file-name
::email.request-team-access/file-id
::email.request-team-access/page-id]))
(def request-file-access
"File access request email."
(template-factory ::request-file-access))
(s/def ::request-file-access-yourpenpot
(s/keys :req-un [::email.request-team-access/requested-by
::email.request-team-access/requested-by-email
::email.request-team-access/team-name
::email.request-team-access/team-id
::email.request-team-access/file-name
::email.request-team-access/file-id
::email.request-team-access/page-id]))
(def request-file-access-yourpenpot
"File access on Your Penpot request email."
(template-factory ::request-file-access-yourpenpot))
(s/def ::request-file-access-yourpenpot-view
(s/keys :req-un [::email.request-team-access/requested-by
::email.request-team-access/requested-by-email
::email.request-team-access/team-name
::email.request-team-access/team-id
::email.request-team-access/file-name
::email.request-team-access/file-id
::email.request-team-access/page-id]))
(def request-file-access-yourpenpot-view
"File access on Your Penpot view mode request email."
(template-factory ::request-file-access-yourpenpot-view))
(s/def ::request-team-access
(s/keys :req-un [::email.request-team-access/requested-by
::email.request-team-access/requested-by-email
::email.request-team-access/team-name
::email.request-team-access/team-id]))
(def request-team-access
"Team access request email."
(template-factory ::request-team-access))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; BOUNCE/COMPLAINS HELPERS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -449,3 +523,11 @@
{:email email :type "bounce"}
{:limit 10}))]
(>= (count reports) threshold))))
(defn has-reports?
([conn email] (has-reports? conn email nil))
([conn email {:keys [threshold] :or {threshold 1}}]
(let [reports (db/exec! conn (sql/select :global-complaint-report
{:email email}
{:limit 10}))]
(>= (count reports) threshold))))
+47
View File
@@ -0,0 +1,47 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC
(ns app.email.blacklist
"Email blacklist provider"
(:refer-clojure :exclude [contains?])
(:require
[app.common.logging :as l]
[app.config :as cf]
[app.email :as-alias email]
[clojure.core :as c]
[clojure.java.io :as io]
[cuerdas.core :as str]
[integrant.core :as ig]))
(defmethod ig/init-key ::email/blacklist
[_ _]
(when (c/contains? cf/flags :email-blacklist)
(try
(let [path (cf/get :email-domain-blacklist)
result (with-open [reader (io/reader path)]
(reduce (fn [result line]
(if (str/starts-with? line "#")
result
(conj result (-> line str/trim str/lower))))
#{}
(line-seq reader)))]
(l/inf :hint "initializing email blacklist" :domains (count result))
(not-empty result))
(catch Throwable cause
(l/wrn :hint "unexpected exception on initializing email blacklist"
:cause cause)))))
(defn contains?
"Check if email is in the blacklist."
[{:keys [::email/blacklist]} email]
(let [[_ domain] (str/split email "@" 2)]
(c/contains? blacklist (str/lower domain))))
(defn enabled?
"Check if the blacklist is enabled"
[{:keys [::email/blacklist]}]
(some? blacklist))
+59
View File
@@ -0,0 +1,59 @@
;; 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.email.whitelist
"Email whitelist provider"
(:refer-clojure :exclude [contains?])
(:require
[app.common.logging :as l]
[app.config :as cf]
[app.email :as-alias email]
[clojure.core :as c]
[clojure.java.io :as io]
[cuerdas.core :as str]
[datoteka.fs :as fs]
[integrant.core :as ig]))
(defn- read-whitelist
[path]
(when (and path (fs/exists? path))
(try
(with-open [reader (io/reader path)]
(reduce (fn [result line]
(if (str/starts-with? line "#")
result
(conj result (-> line str/trim str/lower))))
#{}
(line-seq reader)))
(catch Throwable cause
(l/wrn :hint "unexpected exception on reading email whitelist"
:cause cause)))))
(defmethod ig/init-key ::email/whitelist
[_ _]
(let [whitelist (or (cf/get :registration-domain-whitelist) #{})
whitelist (if (c/contains? cf/flags :email-whitelist)
(into whitelist (read-whitelist (cf/get :email-domain-whitelist)))
whitelist)
whitelist (not-empty whitelist)]
(when whitelist
(l/inf :hint "initializing email whitelist" :domains (count whitelist)))
whitelist))
(defn contains?
"Check if email is in the whitelist."
[{:keys [::email/whitelist]} email]
(let [[_ domain] (str/split email "@" 2)]
(c/contains? whitelist (str/lower domain))))
(defn enabled?
"Check if the whitelist is enabled"
[{:keys [::email/whitelist]}]
(some? whitelist))
File diff suppressed because it is too large. Load diff
+82 -33
View File
@@ -11,70 +11,120 @@
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.db :as db]
[app.db.sql :as-alias sql]
[app.storage :as sto]
[app.util.blob :as blob]
[app.util.objects-map :as omap]
[app.util.pointer-map :as pmap]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; OFFLOAD
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn offloaded?
[file]
(= "objects-storage" (:data-backend file)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; OBJECTS-MAP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn enable-objects-map
[file]
(let [update-fn #(d/update-when % :objects omap/wrap)]
(let [update-page
(fn [page]
(if (and (pmap/pointer-map? page)
(not (pmap/loaded? page)))
page
(update page :objects omap/wrap)))
update-data
(fn [fdata]
(update fdata :pages-index d/update-vals update-page))]
(-> file
(update :data (fn [fdata]
(-> fdata
(update :pages-index update-vals update-fn)
(update :components update-vals update-fn))))
(update :data update-data)
(update :features conj "fdata/objects-map"))))
(defn process-objects
"Apply a function to all objects-map on the file. Usualy used for convert
the objects-map instances to plain maps"
[fdata update-fn]
(if (contains? fdata :pages-index)
(update fdata :pages-index d/update-vals
(fn [page]
(update page :objects
(fn [objects]
(if (omap/objects-map? objects)
(update-fn objects)
objects)))))
fdata))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; POINTER-MAP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn get-file-data
"Get file data given a file instance."
[system file]
(if (offloaded? file)
(let [storage (sto/resolve system ::db/reuse-conn true)]
(->> (sto/get-object storage (:data-ref-id file))
(sto/get-object-bytes storage)))
(:data file)))
(defn resolve-file-data
[system file]
(let [data (get-file-data system file)]
(assoc file :data data)))
(defn load-pointer
"A database loader pointer helper"
[system file-id id]
(let [{:keys [content]} (db/get system :file-data-fragment
{:id id :file-id file-id}
{::db/columns [:content]
::db/check-deleted? false})]
(when-not content
(let [fragment (db/get* system :file-data-fragment
{:id id :file-id file-id}
{::sql/columns [:data :data-backend :data-ref-id :id]})]
(l/trc :hint "load pointer"
:file-id (str file-id)
:id (str id)
:found (some? fragment))
(when-not fragment
(ex/raise :type :internal
:code :fragment-not-found
:hint "fragment not found"
:file-id file-id
:fragment-id id))
(blob/decode content)))
(let [data (get-file-data system fragment)]
;; FIXME: conditional thread scheduling for decoding big objects
(blob/decode data))))
(defn persist-pointers!
"Given a database connection and the final file-id, persist all
pointers to the underlying storage (the database)."
"Persist all currently tracked pointer objects"
[system file-id]
(doseq [[id item] @pmap/*tracked*]
(when (pmap/modified? item)
(l/trc :hint "persist pointer" :file-id (str file-id) :id (str id))
(let [content (-> item deref blob/encode)]
(db/insert! system :file-data-fragment
{:id id
:file-id file-id
:content content})))))
(let [conn (db/get-connection system)]
(doseq [[id item] @pmap/*tracked*]
(when (pmap/modified? item)
(l/trc :hint "persist pointer" :file-id (str file-id) :id (str id))
(let [content (-> item deref blob/encode)]
(db/insert! conn :file-data-fragment
{:id id
:file-id file-id
:data content}))))))
(defn process-pointers
"Apply a function to all pointers on the file. Usuly used for
dereference the pointer to a plain value before some processing."
[fdata update-fn]
(cond-> fdata
(contains? fdata :pages-index)
(update :pages-index process-pointers update-fn)
:always
(update-vals (fn [val]
(if (pmap/pointer-map? val)
(update-fn val)
val)))))
(let [update-fn' (fn [val]
(if (pmap/pointer-map? val)
(update-fn val)
val))]
(-> fdata
(d/update-vals update-fn')
(update :pages-index d/update-vals update-fn'))))
(defn get-used-pointer-ids
"Given a file, return all pointer ids used in the data."
@@ -90,7 +140,6 @@
(-> file
(update :data (fn [fdata]
(-> fdata
(update :pages-index update-vals pmap/wrap)
(update :components pmap/wrap))))
(update :pages-index d/update-vals pmap/wrap)
(d/update-when :components pmap/wrap))))
(update :features conj "fdata/pointer-map")))
+6 -5
View File
@@ -23,6 +23,7 @@
[app.metrics :as mtx]
[app.rpc :as-alias rpc]
[app.rpc.doc :as-alias rpc.doc]
[app.setup :as-alias setup]
[clojure.spec.alpha :as s]
[integrant.core :as ig]
[promesa.exec :as px]
@@ -52,8 +53,8 @@
[_ cfg]
(merge {::port 6060
::host "0.0.0.0"
::max-body-size (* 1024 1024 30) ; 30 MiB
::max-multipart-body-size (* 1024 1024 120)} ; 120 MiB
::max-body-size (* 1024 1024 30) ; default 30 MiB
::max-multipart-body-size (* 1024 1024 120)} ; default 120 MiB
(d/without-nils cfg)))
(defmethod ig/pre-init-spec ::server [_]
@@ -113,7 +114,7 @@
(partial not-found-handler request)))
(on-error [cause request]
(let [{:keys [body] :as response} (errors/handle cause request)]
(let [{:keys [::rres/body] :as response} (errors/handle cause request)]
(cond-> response
(map? body)
(-> (update ::rres/headers assoc "content-type" "application/transit+json")
@@ -136,7 +137,7 @@
::rpc/routes
::rpc.doc/routes
::oidc/routes
::main/props
::setup/props
::assets/routes
::debug/routes
::db/pool
@@ -150,9 +151,9 @@
[mw/params]
[mw/format-response]
[mw/parse-request]
[mw/errors errors/handle]
[session/soft-auth cfg]
[actoken/soft-auth cfg]
[mw/errors errors/handle]
[mw/restrict-methods]]}
(::mtx/routes cfg)
+2 -1
View File
@@ -10,6 +10,7 @@
[app.config :as cf]
[app.db :as db]
[app.main :as-alias main]
[app.setup :as-alias setup]
[app.tokens :as tokens]
[ring.request :as rreq]))
@@ -42,7 +43,7 @@
(defn- wrap-soft-auth
"Soft Authentication, will be executed synchronously on the undertow
worker thread."
[handler {:keys [::main/props]}]
[handler {:keys [::setup/props]}]
(letfn [(handle-request [request]
(try
(let [token (get-token request)
+4 -5
View File
@@ -57,11 +57,10 @@
(defn- serve-object
"Helper function that returns the appropriate response depending on
the storage object backend type."
[{:keys [::sto/storage] :as cfg} {:keys [backend] :as obj}]
(let [backend (sto/resolve-backend storage backend)]
(case (::sto/type backend)
:s3 (serve-object-from-s3 cfg obj)
:fs (serve-object-from-fs cfg obj))))
[cfg {:keys [backend] :as obj}]
(case backend
(:s3 :assets-s3) (serve-object-from-s3 cfg obj)
(:fs :assets-fs) (serve-object-from-fs cfg obj)))
(defn objects-handler
"Handler that servers storage objects by id."
+83 -54
View File
@@ -9,16 +9,18 @@
(:require
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.pprint :as pp]
[app.db :as db]
[app.db.sql :as sql]
[app.http.client :as http]
[app.main :as-alias main]
[app.setup :as-alias setup]
[app.tokens :as tokens]
[app.worker :as-alias wrk]
[clojure.data.json :as j]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[integrant.core :as ig]
[jsonista.core :as j]
[promesa.exec :as px]
[ring.request :as rreq]
[ring.response :as-alias rres]))
@@ -30,7 +32,7 @@
(defmethod ig/pre-init-spec ::routes [_]
(s/keys :req [::http/client
::main/props
::setup/props
::db/pool]))
(defmethod ig/init-key ::routes
@@ -106,7 +108,7 @@
[cfg headers]
(let [tdata (get headers "x-penpot-data")]
(when-not (str/empty? tdata)
(let [result (tokens/verify (::main/props cfg) {:token tdata :iss :profile-identity})]
(let [result (tokens/verify (::setup/props cfg) {:token tdata :iss :profile-identity})]
(:profile-id result)))))
(defn- parse-notification
@@ -135,83 +137,110 @@
(defn- parse-json
[v]
(ex/ignoring
(j/read-value v)))
(try
(j/read-str v)
(catch Throwable cause
(l/wrn :hint "unable to decode request body"
:cause cause))))
(defn- register-bounce-for-profile
[{:keys [::db/pool]} {:keys [type kind profile-id] :as report}]
(when (= kind "permanent")
(db/with-atomic [conn pool]
(db/insert! conn :profile-complaint-report
(try
(db/insert! pool :profile-complaint-report
{:profile-id profile-id
:type (name type)
:content (db/tjson report)})
;; TODO: maybe also try to find profiles by mail and if exists
;; register profile reports for them?
(doseq [recipient (:recipients report)]
(db/insert! conn :global-complaint-report
{:email (:email recipient)
:type (name type)
:content (db/tjson report)}))
(catch Throwable cause
(l/warn :hint "unable to persist profile complaint"
:cause cause)))
(let [profile (db/exec-one! conn (sql/select :profile {:id profile-id}))]
(when (some #(= (:email profile) (:email %)) (:recipients report))
;; If the report matches the profile email, this means that
;; the report is for itself, can be caused when a user
;; registers with an invalid email or the user email is
;; permanently rejecting receiving the email. In this case we
;; have no option to mark the user as muted (and in this case
;; the profile will be also inactive.
(db/update! conn :profile
{:is-muted true}
{:id profile-id}))))))
(defn- register-complaint-for-profile
[{:keys [::db/pool]} {:keys [type profile-id] :as report}]
(db/with-atomic [conn pool]
(db/insert! conn :profile-complaint-report
{:profile-id profile-id
:type (name type)
:content (db/tjson report)})
;; TODO: maybe also try to find profiles by email and if exists
;; register profile reports for them?
(doseq [email (:recipients report)]
(db/insert! conn :global-complaint-report
{:email email
(doseq [recipient (:recipients report)]
(db/insert! pool :global-complaint-report
{:email (:email recipient)
:type (name type)
:content (db/tjson report)}))
(let [profile (db/exec-one! conn (sql/select :profile {:id profile-id}))]
(when (some #(= % (:email profile)) (:recipients report))
(let [profile (db/exec-one! pool (sql/select :profile {:id profile-id}))]
(when (some #(= (:email profile) (:email %)) (:recipients report))
;; If the report matches the profile email, this means that
;; the report is for itself, rare case but can happen; In this
;; case just mark profile as muted (very rare case).
(db/update! conn :profile
;; the report is for itself, can be caused when a user
;; registers with an invalid email or the user email is
;; permanently rejecting receiving the email. In this case we
;; have no option to mark the user as muted (and in this case
;; the profile will be also inactive.
(l/inf :hint "mark profile: muted"
:profile-id (str (:id profile))
:email (:email profile)
:reason "bounce report"
:report-id (:feedback-id report))
(db/update! pool :profile
{:is-muted true}
{:id profile-id})))))
{:id profile-id}
{::db/return-keys false})))))
(defn- register-complaint-for-profile
[{:keys [::db/pool]} {:keys [type profile-id] :as report}]
(try
(db/insert! pool :profile-complaint-report
{:profile-id profile-id
:type (name type)
:content (db/tjson report)})
(catch Throwable cause
(l/warn :hint "unable to persist profile complaint"
:cause cause)))
;; TODO: maybe also try to find profiles by email and if exists
;; register profile reports for them?
(doseq [email (:recipients report)]
(db/insert! pool :global-complaint-report
{:email email
:type (name type)
:content (db/tjson report)}))
(let [profile (db/exec-one! pool (sql/select :profile {:id profile-id}))]
(when (some #(= % (:email profile)) (:recipients report))
;; If the report matches the profile email, this means that
;; the report is for itself, rare case but can happen; In this
;; case just mark profile as muted (very rare case).
(l/inf :hint "mark profile: muted"
:profile-id (str (:id profile))
:email (:email profile)
:reason "complaint report"
:report-id (:feedback-id report))
(db/update! pool :profile
{:is-muted true}
{:id profile-id}
{::db/return-keys false}))))
(defn- process-report
[cfg {:keys [type profile-id] :as report}]
(l/trace :action "processing report" :report (pr-str report))
(cond
;; In this case we receive a bounce/complaint notification without
;; confirmed identity, we just emit a warning but do nothing about
;; it because this is not a normal case. All notifications should
;; come with profile identity.
(nil? profile-id)
(l/warn :msg "a notification without identity received from AWS"
:report (pr-str report))
(l/wrn :hint "not-identified report"
::l/body (pp/pprint-str report {:length 40 :level 6}))
(= "bounce" type)
(register-bounce-for-profile cfg report)
(do
(l/trc :hint "bounce report"
::l/body (pp/pprint-str report {:length 40 :level 6}))
(register-bounce-for-profile cfg report))
(= "complaint" type)
(register-complaint-for-profile cfg report)
(do
(l/trc :hint "complaint report"
::l/body (pp/pprint-str report {:length 40 :level 6}))
(register-complaint-for-profile cfg report))
:else
(l/warn :msg "unrecognized report received from AWS"
:report (pr-str report))))
(l/wrn :hint "unrecognized report"
::l/body (pp/pprint-str report {:length 20 :level 4}))))
+6 -5
View File
@@ -54,9 +54,10 @@
"A convencience toplevel function for gradual migration to a new API
convention."
([cfg-or-client request]
(let [client (resolve-client cfg-or-client)]
(send! client request {})))
(let [client (resolve-client cfg-or-client)
request (update request :uri str)]
(send! client request {:sync? true})))
([cfg-or-client request options]
(let [client (resolve-client cfg-or-client)]
(send! client request options))))
(let [client (resolve-client cfg-or-client)
request (update request :uri str)]
(send! client request (merge {:sync? true} options)))))
+91 -95
View File
@@ -7,6 +7,7 @@
(ns app.http.debug
(:refer-clojure :exclude [error-handler])
(:require
[app.binfile.v1 :as bf.v1]
[app.common.data :as d]
[app.common.exceptions :as ex]
[app.common.logging :as l]
@@ -15,13 +16,13 @@
[app.config :as cf]
[app.db :as db]
[app.http.session :as session]
[app.main :as-alias main]
[app.rpc.commands.auth :as auth]
[app.rpc.commands.binfile :as binf]
[app.rpc.commands.files-create :refer [create-file]]
[app.rpc.commands.profile :as profile]
[app.setup :as-alias setup]
[app.srepl.helpers :as srepl]
[app.storage :as-alias sto]
[app.storage.tmp :as tmp]
[app.util.blob :as blob]
[app.util.template :as tmpl]
[app.util.time :as dt]
@@ -99,11 +100,11 @@
(let [profile (profile/get-profile pool profile-id)
project-id (:default-project-id profile)]
(db/run! pool (fn [{:keys [::db/conn]}]
(create-file conn {:id file-id
:name (str "Cloned file: " filename)
:project-id project-id
:profile-id profile-id})
(db/run! pool (fn [{:keys [::db/conn] :as cfg}]
(create-file cfg {:id file-id
:name (str "Cloned file: " filename)
:project-id project-id
:profile-id profile-id})
(db/update! conn :file
{:data data}
{:id file-id})
@@ -140,11 +141,11 @@
{::rres/status 200
::rres/body "OK UPDATED"})
(db/run! pool (fn [{:keys [::db/conn]}]
(create-file conn {:id file-id
:name fname
:project-id project-id
:profile-id profile-id})
(db/run! pool (fn [{:keys [::db/conn] :as cfg}]
(create-file cfg {:id file-id
:name fname
:project-id project-id
:profile-id profile-id})
(db/update! conn :file
{:data data}
{:id file-id})
@@ -268,9 +269,10 @@
(defn export-handler
[{:keys [::db/pool] :as cfg} {:keys [params ::session/profile-id] :as request}]
(let [file-ids (->> (:file-ids params)
(remove empty?)
(mapv parse-uuid))
(let [file-ids (into #{}
(comp (remove empty?)
(map parse-uuid))
(:file-ids params))
libs? (contains? params :includelibs)
clone? (contains? params :clone)
embed? (contains? params :embedassets)]
@@ -279,22 +281,22 @@
(ex/raise :type :validation
:code :missing-arguments))
(let [path (-> cfg
(assoc ::binf/file-ids file-ids)
(assoc ::binf/embed-assets? embed?)
(assoc ::binf/include-libraries? libs?)
(binf/export-to-tmpfile!))]
(let [path (tmp/tempfile :prefix "penpot.export.")]
(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)))
(if clone?
(let [profile (profile/get-profile pool profile-id)
project-id (:default-project-id profile)]
(binf/import!
(assoc cfg
::binf/input path
::binf/overwrite? false
::binf/ignore-index-errors? true
::binf/profile-id profile-id
::binf/project-id project-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/import-files! cfg path)
{::rres/status 200
::rres/headers {"content-type" "text/plain"}
::rres/body "OK CLONED"})
@@ -305,7 +307,6 @@
"content-disposition" (str "attachmen; filename=" (first file-ids) ".penpot")}}))))
(defn import-handler
[{:keys [::db/pool] :as cfg} {:keys [params ::session/profile-id] :as request}]
(when-not (contains? params :file)
@@ -316,83 +317,83 @@
(let [profile (profile/get-profile pool profile-id)
project-id (:default-project-id profile)
overwrite? (contains? params :overwrite)
migrate? (contains? params :migrate)
ignore-index-errors? (contains? params :ignore-index-errors)]
migrate? (contains? params :migrate)]
(when-not project-id
(ex/raise :type :validation
:code :missing-project
:hint "project not found"))
(binf/import!
(assoc cfg
::binf/input (-> params :file :path)
::binf/overwrite? overwrite?
::binf/migrate? migrate?
::binf/ignore-index-errors? ignore-index-errors?
::binf/profile-id profile-id
::binf/project-id project-id))
{::rres/status 200
::rres/headers {"content-type" "text/plain"}
::rres/body "OK"}))
(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/import-files! cfg path)
{::rres/status 200
::rres/headers {"content-type" "text/plain"}
::rres/body "OK"})))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ACTIONS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn- resend-email-notification
[{:keys [::db/pool ::main/props] :as cfg} {:keys [params] :as request}]
[cfg {:keys [params] :as request}]
(db/tx-run! cfg (fn [{:keys [::db/conn] :as cfg}]
(when-not (contains? params :force)
(ex/raise :type :validation
:code :missing-force
:hint "missing force checkbox"))
(when-not (contains? params :force)
(ex/raise :type :validation
:code :missing-force
:hint "missing force checkbox"))
(let [profile (some->> params
:email
(profile/clean-email)
(profile/get-profile-by-email conn))]
(let [profile (some->> params :email (profile/get-profile-by-email pool))]
(when-not profile
(ex/raise :type :validation
:code :missing-profile
:hint "unable to find profile by email"))
(when-not profile
(ex/raise :type :validation
:code :missing-profile
:hint "unable to find profile by email"))
(cond
(contains? params :block)
(do
(db/update! conn :profile {:is-blocked true} {:id (:id profile)})
(db/delete! conn :http-session {:profile-id (:id profile)})
(cond
(contains? params :block)
(do
(db/update! pool :profile {:is-blocked true} {:id (:id profile)})
(db/delete! pool :http-session {:profile-id (:id profile)})
{::rres/status 200
::rres/headers {"content-type" "text/plain"}
::rres/body (str/ffmt "PROFILE '%' BLOCKED" (:email profile))})
{::rres/status 200
::rres/headers {"content-type" "text/plain"}
::rres/body (str/ffmt "PROFILE '%' BLOCKED" (:email profile))})
(contains? params :unblock)
(do
(db/update! conn :profile {:is-blocked false} {:id (:id profile)})
{::rres/status 200
::rres/headers {"content-type" "text/plain"}
::rres/body (str/ffmt "PROFILE '%' UNBLOCKED" (:email profile))})
(contains? params :unblock)
(do
(db/update! pool :profile {:is-blocked false} {:id (:id profile)})
{::rres/status 200
::rres/headers {"content-type" "text/plain"}
::rres/body (str/ffmt "PROFILE '%' UNBLOCKED" (:email profile))})
(contains? params :resend)
(if (:is-blocked profile)
{::rres/status 200
::rres/headers {"content-type" "text/plain"}
::rres/body "PROFILE ALREADY BLOCKED"}
(do
(#'auth/send-email-verification! cfg profile)
{::rres/status 200
::rres/headers {"content-type" "text/plain"}
::rres/body (str/ffmt "RESENDED FOR '%'" (:email profile))}))
(contains? params :resend)
(if (:is-blocked profile)
{::rres/status 200
::rres/headers {"content-type" "text/plain"}
::rres/body "PROFILE ALREADY BLOCKED"}
(do
(auth/send-email-verification! pool props profile)
{::rres/status 200
::rres/headers {"content-type" "text/plain"}
::rres/body (str/ffmt "RESENDED FOR '%'" (:email profile))}))
:else
(do
(db/update! pool :profile {:is-active true} {:id (:id profile)})
{::rres/status 200
::rres/headers {"content-type" "text/plain"}
::rres/body (str/ffmt "PROFILE '%' ACTIVATED" (:email profile))}))))
:else
(do
(db/update! conn :profile {:is-active true} {:id (:id profile)})
{::rres/status 200
::rres/headers {"content-type" "text/plain"}
::rres/body (str/ffmt "PROFILE '%' ACTIVATED" (:email profile))}))))))
(defn- reset-file-data-version
(defn- reset-file-version
[cfg {:keys [params] :as request}]
(let [file-id (some-> params :file-id d/parse-uuid)
version (some-> params :version d/parse-integer)]
@@ -412,13 +413,8 @@
:code :invalid-version
:hint "provided invalid version"))
(srepl/update-file! cfg
:id file-id
:update-fn (fn [file]
(update file :data assoc :version version))
:migrate? false
:inc-revn? false
:save? true)
(db/tx-run! cfg srepl/process-file! file-id #(assoc % :version version))
{::rres/status 200
::rres/headers {"content-type" "text/plain"}
::rres/body "OK"}))
@@ -490,8 +486,8 @@
["/error" {:handler (partial error-list-handler cfg)}]
["/actions/resend-email-verification"
{:handler (partial resend-email-notification cfg)}]
["/actions/reset-file-data-version"
{:handler (partial reset-file-data-version cfg)}]
["/actions/reset-file-version"
{:handler (partial reset-file-version cfg)}]
["/file/export" {:handler (partial export-handler cfg)}]
["/file/import" {:handler (partial import-handler cfg)}]
["/file/data" {:handler (partial file-data-handler cfg)}]
+20 -11
View File
@@ -14,32 +14,28 @@
[app.http :as-alias http]
[app.http.access-token :as-alias actoken]
[app.http.session :as-alias session]
[app.util.inet :as inet]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[ring.request :as rreq]
[ring.response :as rres]))
(defn- parse-client-ip
[request]
(or (some-> (rreq/get-header request "x-forwarded-for") (str/split ",") first)
(rreq/get-header request "x-real-ip")
(rreq/remote-addr request)))
(defn request->context
"Extracts error report relevant context data from request."
[request]
(let [claims (-> {}
(into (::session/token-claims request))
(into (::actoken/token-claims request)))]
{:request/path (:path request)
:request/method (:method request)
:request/params (:params request)
:request/user-agent (rreq/get-header request "user-agent")
:request/ip-addr (parse-client-ip request)
:request/ip-addr (inet/parse-request request)
:request/profile-id (:uid claims)
:version/frontend (or (rreq/get-header request "x-frontend-version") "unknown")
:version/backend (:full cf/version)}))
(defmulti handle-error
(fn [cause _ _]
(-> cause ex-data :type)))
@@ -60,8 +56,12 @@
(defmethod handle-error :restriction
[err _ _]
{::rres/status 400
::rres/body (ex-data err)})
(let [{:keys [code] :as data} (ex-data err)]
(if (= code :method-not-allowed)
{::rres/status 405
::rres/body data}
{::rres/status 400
::rres/body data})))
(defmethod handle-error :rate-limit
[err _ _]
@@ -81,6 +81,7 @@
(cond
(or (= code :spec-validation)
(= code :params-validation)
(= code :schema-validation)
(= code :data-validation))
(let [explain (ex/explain data)]
{::rres/status 400
@@ -94,7 +95,7 @@
(= code :invalid-image)
(binding [l/*context* (request->context request)]
(let [cause (or parent-cause err)]
(l/error :hint "unexpected error on processing image" :cause cause)
(l/warn :hint "unexpected error on processing image" :cause cause)
{::rres/status 400 ::rres/body data}))
:else
@@ -213,6 +214,14 @@
:hint (ex-message error)
:data edata}}))))
(defmethod handle-exception java.io.IOException
[cause _ _]
(l/wrn :hint "io exception" :cause cause)
{::rres/status 500
::rres/body {:type :server-error
:code :io-exception
:hint (ex-message cause)}})
(defmethod handle-exception java.util.concurrent.CompletionException
[cause request _]
(let [cause' (ex-cause cause)]
+32 -25
View File
@@ -7,19 +7,19 @@
(ns app.http.middleware
(:require
[app.common.exceptions :as ex]
[app.common.json :as json]
[app.common.logging :as l]
[app.common.schema :as-alias sm]
[app.common.transit :as t]
[app.config :as cf]
[app.util.json :as json]
[app.http.errors :as errors]
[app.util.pointer-map :as pmap]
[cuerdas.core :as str]
[ring.request :as rreq]
[ring.response :as rres]
[yetti.adapter :as yt]
[yetti.middleware :as ymw])
(:import
com.fasterxml.jackson.core.JsonParseException
com.fasterxml.jackson.core.io.JsonEOFException
com.fasterxml.jackson.databind.exc.MismatchedInputException
io.undertow.server.RequestTooBigException
java.io.InputStream
java.io.OutputStream))
@@ -34,11 +34,12 @@
{:name ::params
:compile (constantly ymw/wrap-params)})
(def ^:private json-mapper
(json/mapper
{:encode-key-fn str/camel
:decode-key-fn (comp keyword str/kebab)
:pretty true}))
(defn- get-reader
^java.io.BufferedReader
[request]
(let [^InputStream body (rreq/body request)]
(java.io.BufferedReader.
(java.io.InputStreamReader. body))))
(defn wrap-parse-request
[handler]
@@ -53,8 +54,8 @@
(update :params merge params))))
(str/starts-with? header "application/json")
(with-open [^InputStream is (rreq/body request)]
(let [params (json/decode is json-mapper)]
(with-open [reader (get-reader request)]
(let [params (json/read reader :key-fn json/read-kebab-key)]
(-> request
(assoc :body-params params)
(update :params merge params))))
@@ -62,35 +63,33 @@
:else
request)))
(handle-error [cause]
(handle-error [cause request]
(cond
(instance? RuntimeException cause)
(if-let [cause (ex-cause cause)]
(handle-error cause)
(throw cause))
(handle-error cause request)
(errors/handle cause request))
(instance? RequestTooBigException cause)
(ex/raise :type :validation
:code :request-body-too-large
:hint (ex-message cause))
(or (instance? JsonEOFException cause)
(instance? JsonParseException cause)
(instance? MismatchedInputException cause))
(instance? java.io.EOFException cause)
(ex/raise :type :validation
:code :malformed-json
:hint (ex-message cause)
:cause cause)
:else
(throw cause)))]
(errors/handle cause request)))]
(fn [request]
(if (= (rreq/method request) :post)
(let [request (ex/try! (process-request request))]
(if (ex/exception? request)
(handle-error request)
(handler request)))
(try
(-> request process-request handler)
(catch Throwable cause
(handle-error cause request)))
(handler request)))))
(def parse-request
@@ -106,6 +105,12 @@
(def ^:const buffer-size (:xnio/buffer-size yt/defaults))
(defn- write-json-value
[_ val]
(if (pmap/pointer-map? val)
[(pmap/get-id val) (meta val)]
val))
(defn wrap-format-response
[handler]
(letfn [(transit-streamable-body [data opts]
@@ -127,9 +132,11 @@
(reify rres/StreamableResponseBody
(-write-body-to-stream [_ _ output-stream]
(try
(with-open [^OutputStream bos (buffered-output-stream output-stream buffer-size)]
(json/write! bos data json-mapper))
(let [encode (or (-> data meta :encode/json) identity)
data (encode data)]
(with-open [^OutputStream bos (buffered-output-stream output-stream buffer-size)]
(with-open [^java.io.OutputStreamWriter writer (java.io.OutputStreamWriter. bos)]
(json/write writer data :key-fn json/write-camel-key :value-fn write-json-value))))
(catch java.io.IOException _)
(catch Throwable cause
(binding [l/*context* {:value data}]
+24 -18
View File
@@ -10,11 +10,13 @@
[app.common.data :as d]
[app.common.logging :as l]
[app.common.spec :as us]
[app.common.uri :as u]
[app.config :as cf]
[app.db :as db]
[app.db.sql :as sql]
[app.http.session.tasks :as-alias tasks]
[app.main :as-alias main]
[app.setup :as-alias setup]
[app.tokens :as tokens]
[app.util.time :as dt]
[clojure.spec.alpha :as s]
@@ -32,7 +34,7 @@
;; A cookie that we can use to check from other sites of the same
;; domain if a user is authenticated.
(def default-authenticated-cookie-name "authenticated")
(def default-auth-data-cookie-name "auth-data")
;; Default value for cookie max-age
(def default-cookie-max-age (dt/duration {:days 7}))
@@ -132,13 +134,13 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(declare ^:private assign-auth-token-cookie)
(declare ^:private assign-authenticated-cookie)
(declare ^:private assign-auth-data-cookie)
(declare ^:private clear-auth-token-cookie)
(declare ^:private clear-authenticated-cookie)
(declare ^:private clear-auth-data-cookie)
(declare ^:private gen-token)
(defn create-fn
[{:keys [::manager ::main/props]} profile-id]
[{:keys [::manager ::setup/props]} profile-id]
(us/assert! ::manager manager)
(us/assert! ::us/uuid profile-id)
@@ -152,7 +154,7 @@
(l/trace :hint "create" :profile-id (str profile-id))
(-> response
(assign-auth-token-cookie session)
(assign-authenticated-cookie session)))))
(assign-auth-data-cookie session)))))
(defn delete-fn
[{:keys [::manager]}]
@@ -166,7 +168,7 @@
(assoc :status 204)
(assoc :body nil)
(clear-auth-token-cookie)
(clear-authenticated-cookie)))))
(clear-auth-data-cookie)))))
(defn- gen-token
[props {:keys [profile-id created-at]}]
@@ -196,7 +198,7 @@
(neg? (compare default-renewal-max-age elapsed)))))
(defn- wrap-soft-auth
[handler {:keys [::manager ::main/props]}]
[handler {:keys [::manager ::setup/props]}]
(us/assert! ::manager manager)
(letfn [(handle-request [request]
(try
@@ -228,7 +230,7 @@
(let [session (update! manager session)]
(-> response
(assign-auth-token-cookie session)
(assign-authenticated-cookie session)))
(assign-auth-data-cookie session)))
response))))
(def soft-auth
@@ -248,6 +250,7 @@
renewal (dt/plus created-at default-renewal-max-age)
expires (dt/plus created-at max-age)
secure? (contains? cf/flags :secure-session-cookies)
strict? (contains? cf/flags :strict-session-cookies)
cors? (contains? cf/flags :cors)
name (cf/get :auth-token-cookie-name default-auth-token-cookie-name)
comment (str "Renewal at: " (dt/format-instant renewal :rfc1123))
@@ -256,15 +259,15 @@
:expires expires
:value token
:comment comment
:same-site (if cors? :none :lax)
:same-site (if cors? :none (if strict? :strict :lax))
:secure secure?}]
(update response :cookies assoc name cookie)))
(defn- assign-authenticated-cookie
[response {updated-at :updated-at}]
(defn- assign-auth-data-cookie
[response {profile-id :profile-id updated-at :updated-at}]
(let [max-age (cf/get :auth-token-cookie-max-age default-cookie-max-age)
domain (cf/get :authenticated-cookie-domain)
cname (cf/get :authenticated-cookie-name "authenticated")
domain (cf/get :auth-data-cookie-domain)
cname default-auth-data-cookie-name
created-at (or updated-at (dt/now))
renewal (dt/plus created-at default-renewal-max-age)
@@ -272,14 +275,17 @@
comment (str "Renewal at: " (dt/format-instant renewal :rfc1123))
secure? (contains? cf/flags :secure-session-cookies)
strict? (contains? cf/flags :strict-session-cookies)
cors? (contains? cf/flags :cors)
cookie {:domain domain
:expires expires
:path "/"
:comment comment
:value true
:same-site :strict
:value (u/map->query-string {:profile-id profile-id})
:same-site (if cors? :none (if strict? :strict :lax))
:secure secure?}]
(cond-> response
(string? domain)
(update :cookies assoc cname cookie))))
@@ -289,10 +295,10 @@
(let [cname (cf/get :auth-token-cookie-name default-auth-token-cookie-name)]
(update response :cookies assoc cname {:path "/" :value "" :max-age 0})))
(defn- clear-authenticated-cookie
(defn- clear-auth-data-cookie
[response]
(let [cname (cf/get :authenticated-cookie-name default-authenticated-cookie-name)
domain (cf/get :authenticated-cookie-domain)]
(let [cname default-auth-data-cookie-name
domain (cf/get :auth-data-cookie-domain)]
(cond-> response
(string? domain)
(update :cookies assoc cname {:domain domain :path "/" :value "" :max-age 0}))))
+13 -30
View File
@@ -9,11 +9,10 @@
(:refer-clojure :exclude [tap])
(:require
[app.common.data :as d]
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.transit :as t]
[app.http.errors :as errors]
[promesa.core :as p]
[app.util.events :as events]
[promesa.exec :as px]
[promesa.exec.csp :as sp]
[promesa.util :as pu]
@@ -21,26 +20,12 @@
(:import
java.io.OutputStream))
(def ^:dynamic *channel* nil)
(defn- write!
[^OutputStream output ^bytes data]
[^OutputStream output ^bytes data]
(l/trc :hint "writting data" :data data :length (alength data))
(.write output data)
(.flush output))
(defn- create-writer-loop
[^OutputStream output]
(try
(loop []
(when-let [event (sp/take! *channel*)]
(let [result (ex/try! (write! output event))]
(if (ex/exception? result)
(l/wrn :hint "unexpected exception on sse writer" :cause result)
(recur)))))
(finally
(pu/close! output))))
(defn- encode
[[name data]]
(try
@@ -61,13 +46,6 @@
"Cache-Control" "no-cache, no-store, max-age=0, must-revalidate"
"Pragma" "no-cache"})
(defn tap
([data] (tap "event" data))
([name data]
(when-let [channel *channel*]
(sp/put! channel [name data])
nil)))
(defn response
[handler & {:keys [buf] :or {buf 32} :as opts}]
(fn [request]
@@ -75,12 +53,17 @@
::rres/status 200
::rres/body (reify rres/StreamableResponseBody
(-write-body-to-stream [_ _ output]
(binding [*channel* (sp/chan :buf buf :xf (keep encode))]
(let [writer (px/run! :virtual (partial create-writer-loop output))]
(binding [events/*channel* (sp/chan :buf buf :xf (keep encode))]
(let [listener (events/start-listener
(partial write! output)
(partial pu/close! output))]
(try
(tap "end" (handler))
(let [result (handler)]
(events/tap :end result))
(catch Throwable cause
(tap "error" (errors/handle' cause request)))
(l/err :hint "unexpected error on processing sse response"
:cause cause)
(events/tap :error (errors/handle' cause request)))
(finally
(sp/close! *channel*)
(p/await! writer)))))))}))
(sp/close! events/*channel*)
(px/await! listener)))))))}))
+11 -4
View File
@@ -279,13 +279,20 @@
message)
(def ^:private schema:params
(sm/define
[:map {:title "params"}
[:session-id ::sm/uuid]]))
[:map {:title "params"}
[:session-id ::sm/uuid]])
(def ^:private decode-params
(sm/decoder schema:params sm/json-transformer))
(def ^:private validate-params!
(sm/validate-fn schema:params))
(defn- http-handler
[cfg {:keys [params ::session/profile-id] :as request}]
(let [{:keys [session-id]} (sm/conform! schema:params params)]
(let [{:keys [session-id]} (-> params
decode-params
validate-params!)]
(cond
(not profile-id)
(ex/raise :type :authentication
+112 -199
View File
@@ -9,42 +9,30 @@
(:require
[app.common.data :as d]
[app.common.data.macros :as dm]
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.spec :as us]
[app.common.transit :as t]
[app.common.uuid :as uuid]
[app.config :as cf]
[app.db :as db]
[app.http :as-alias http]
[app.http.access-token :as-alias actoken]
[app.http.client :as http.client]
[app.loggers.audit.tasks :as-alias tasks]
[app.loggers.webhooks :as-alias webhooks]
[app.main :as-alias main]
[app.rpc :as-alias rpc]
[app.rpc.retry :as rtry]
[app.tokens :as tokens]
[app.setup :as-alias setup]
[app.util.inet :as inet]
[app.util.services :as-alias sv]
[app.util.time :as dt]
[app.worker :as wrk]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[integrant.core :as ig]
[lambdaisland.uri :as u]
[promesa.exec :as px]
[ring.request :as rreq]))
[integrant.core :as ig]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; HELPERS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn parse-client-ip
[request]
(or (some-> (rreq/get-header request "x-forwarded-for") (str/split ",") first)
(rreq/get-header request "x-real-ip")
(some-> (rreq/remote-addr request) str)))
(defn extract-utm-params
"Extracts additional data from params and namespace them under
`penpot` ns."
@@ -59,8 +47,7 @@
(assoc (->> sk str/kebab (keyword "penpot")) v))))]
(reduce-kv process-param {} params)))
(def ^:private
profile-props
(def profile-props
[:id
:is-active
:is-muted
@@ -93,8 +80,19 @@
(remove #(contains? reserved-props (key %))))
props))
;; --- SPECS
(defn event-from-rpc-params
"Create a base event skeleton with pre-filled some important
data that can be extracted from RPC params object"
[params]
(let [context {:external-session-id (::rpc/external-session-id params)
:external-event-origin (::rpc/external-event-origin params)
:triggered-by (::rpc/handler-name params)}]
{::type "action"
::profile-id (::rpc/profile-id params)
::ip-addr (::rpc/ip-addr params)
::context (d/without-nils context)}))
;; --- SPECS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; COLLECTOR
@@ -133,7 +131,7 @@
[_ {:keys [::db/pool] :as cfg}]
(cond
(db/read-only? pool)
(l/warn :hint "audit: disabled (db is read-only)")
(l/warn :hint "audit disabled (db is read-only)")
:else
cfg))
@@ -147,24 +145,31 @@
(::rpc/profile-id params)
uuid/zero)
props (-> (or (::replace-props resultm)
(-> params
(merge (::props resultm))
(dissoc :profile-id)
(dissoc :type)))
session-id (get params ::rpc/external-session-id)
event-origin (get params ::rpc/external-event-origin)
props (-> (or (::replace-props resultm)
(-> params
(merge (::props resultm))
(dissoc :profile-id)
(dissoc :type)))
(clean-props))
(clean-props))
token-id (::actoken/id request)
context (d/without-nils
{:access-token-id (some-> token-id str)})]
context (-> (::context resultm)
(assoc :external-session-id session-id)
(assoc :external-event-origin event-origin)
(assoc :access-token-id (some-> token-id str))
(d/without-nils))
ip-addr (inet/parse-request request)]
{::type (or (::type resultm)
(::rpc/type cfg))
::name (or (::name resultm)
(::sv/name mdata))
::profile-id profile-id
::ip-addr (some-> request parse-client-ip)
::ip-addr ip-addr
::props props
::context context
@@ -186,34 +191,58 @@
(::webhooks/event? resultm)
false)}))
(defn- handle-event!
[conn-or-pool event]
(us/verify! ::event event)
(defn- event->params
[event]
(let [params {:id (uuid/next)
:name (::name event)
:type (::type event)
:profile-id (::profile-id event)
:ip-addr (::ip-addr event)
:context (::context event)
:props (::props event)}]
:context (::context event {})
:props (::props event {})
:source "backend"}
tnow (::tracked-at event)]
(cond-> params
(some? tnow)
(assoc :tracked-at tnow))))
(defn- append-audit-entry!
[cfg params]
(let [params (-> params
(update :props db/tjson)
(update :context db/tjson)
(update :ip-addr db/inet))]
(db/insert! cfg :audit-log params)))
(defn- handle-event!
[cfg event]
(let [params (event->params event)
tnow (dt/now)]
(when (contains? cf/flags :audit-log)
;; NOTE: this operation may cause primary key conflicts on inserts
;; because of the timestamp precission (two concurrent requests), in
;; this case we just retry the operation.
(rtry/with-retry {::rtry/when rtry/conflict-exception?
::rtry/max-retries 6
::rtry/label "persist-audit-log"
::db/conn (dm/check db/connection? conn-or-pool)}
(let [now (dt/now)]
(db/insert! conn-or-pool :audit-log
(-> params
(update :props db/tjson)
(update :context db/tjson)
(update :ip-addr db/inet)
(assoc :created-at now)
(assoc :tracked-at now)
(assoc :source "backend"))))))
(let [params (-> params
(assoc :created-at tnow)
(update :tracked-at #(or % tnow)))]
(append-audit-entry! cfg params)))
(when (and (or (contains? cf/flags :telemetry)
(cf/get :telemetry-enabled))
(not (contains? cf/flags :audit-log)))
;; NOTE: this operation may cause primary key conflicts on inserts
;; because of the timestamp precission (two concurrent requests), in
;; this case we just retry the operation.
;;
;; NOTE: this is only executed when general audit log is disabled
(let [params (-> params
(assoc :created-at tnow)
(update :tracked-at #(or % tnow))
(assoc :props {})
(assoc :context {}))]
(append-audit-entry! cfg params)))
(when (and (contains? cf/flags :webhooks)
(::webhooks/event? event))
@@ -226,161 +255,45 @@
:else label)
dedupe? (boolean (and batch-key batch-timeout))]
(wrk/submit! ::wrk/conn conn-or-pool
::wrk/task :process-webhook-event
::wrk/queue :webhooks
::wrk/max-retries 0
::wrk/delay (or batch-timeout 0)
::wrk/dedupe dedupe?
::wrk/label label
::webhooks/event
(-> params
(dissoc :ip-addr)
(dissoc :type)))))
(wrk/submit! (-> cfg
(assoc ::wrk/task :process-webhook-event)
(assoc ::wrk/queue :webhooks)
(assoc ::wrk/max-retries 0)
(assoc ::wrk/delay (or batch-timeout 0))
(assoc ::wrk/dedupe dedupe?)
(assoc ::wrk/label label)
(assoc ::wrk/params (-> params
(dissoc :source)
(dissoc :context)
(dissoc :ip-addr)
(dissoc :type)))))))
params))
(defn submit!
"Submit audit event to the collector."
[cfg params]
(let [conn (or (::db/conn cfg) (::db/pool cfg))]
(us/assert! ::db/pool-or-conn conn)
(try
(handle-event! conn (d/without-nils params))
(catch Throwable cause
(l/error :hint "audit: unexpected error processing event" :cause cause)))))
[cfg event]
(try
(let [event (d/without-nils event)
cfg (-> cfg
(assoc ::rtry/when rtry/conflict-exception?)
(assoc ::rtry/max-retries 6)
(assoc ::rtry/label "persist-audit-log"))]
(us/verify! ::event event)
(rtry/invoke! cfg db/tx-run! handle-event! event))
(catch Throwable cause
(l/error :hint "unexpected error processing event" :cause cause))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; TASK: ARCHIVE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; This is a task responsible to send the accumulated events to
;; external service for archival.
(declare archive-events)
(s/def ::tasks/uri ::us/string)
(defmethod ig/pre-init-spec ::tasks/archive-task [_]
(s/keys :req [::db/pool ::main/props ::http.client/client]))
(defmethod ig/init-key ::tasks/archive
[_ cfg]
(fn [params]
;; NOTE: this let allows overwrite default configured values from
;; the repl, when manually invoking the task.
(let [enabled (or (contains? cf/flags :audit-log-archive)
(:enabled params false))
uri (cf/get :audit-log-archive-uri)
uri (or uri (:uri params))
cfg (assoc cfg ::uri uri)]
(when (and enabled (not uri))
(ex/raise :type :internal
:code :task-not-configured
:hint "archive task not configured, missing uri"))
(when enabled
(loop [total 0]
(let [n (archive-events cfg)]
(if n
(do
(px/sleep 100)
(recur (+ total ^long n)))
(when (pos? total)
(l/debug :hint "events archived" :total total)))))))))
(def ^:private sql:retrieve-batch-of-audit-log
"select *
from audit_log
where archived_at is null
order by created_at asc
limit 128
for update skip locked;")
(defn archive-events
[{:keys [::db/pool ::uri] :as cfg}]
(letfn [(decode-row [{:keys [props ip-addr context] :as row}]
(cond-> row
(db/pgobject? props)
(assoc :props (db/decode-transit-pgobject props))
(db/pgobject? context)
(assoc :context (db/decode-transit-pgobject context))
(db/pgobject? ip-addr "inet")
(assoc :ip-addr (db/decode-inet ip-addr))))
(row->event [row]
(select-keys row [:type
:name
:source
:created-at
:tracked-at
:profile-id
:ip-addr
:props
:context]))
(send [events]
(let [token (tokens/generate (::main/props cfg)
{:iss "authentication"
:iat (dt/now)
:uid uuid/zero})
body (t/encode {:events events})
headers {"content-type" "application/transit+json"
"origin" (cf/get :public-uri)
"cookie" (u/map->query-string {:auth-token token})}
params {:uri uri
:timeout 6000
:method :post
:headers headers
:body body}
resp (http.client/req! cfg params {:sync? true})]
(if (= (:status resp) 204)
true
(do
(l/error :hint "unable to archive events"
:resp-status (:status resp)
:resp-body (:body resp))
false))))
(mark-as-archived [conn rows]
(db/exec-one! conn ["update audit_log set archived_at=now() where id = ANY(?)"
(->> (map :id rows)
(into-array java.util.UUID)
(db/create-array conn "uuid"))]))]
(db/with-atomic [conn pool]
(let [rows (db/exec! conn [sql:retrieve-batch-of-audit-log])
xform (comp (map decode-row)
(map row->event))
events (into [] xform rows)]
(when-not (empty? events)
(l/trace :hint "archive events chunk" :uri uri :events (count events))
(when (send events)
(mark-as-archived conn rows)
(count events)))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; GC Task
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def ^:private sql:clean-archived
"delete from audit_log
where archived_at is not null")
(defn- clean-archived
[{:keys [::db/pool]}]
(let [result (db/exec-one! pool [sql:clean-archived])
result (:next.jdbc/update-count result)]
(l/debug :hint "delete archived audit log entries" :deleted result)
result))
(defmethod ig/pre-init-spec ::tasks/gc [_]
(s/keys :req [::db/pool]))
(defmethod ig/init-key ::tasks/gc
[_ cfg]
(fn [_]
(clean-archived cfg)))
(defn insert!
"Submit audit event to the collector, intended to be used only from
command line helpers because this skips all webhooks and telemetry
logic."
[cfg event]
(when (contains? cf/flags :audit-log)
(let [event (d/without-nils event)]
(us/verify! ::event event)
(db/run! cfg (fn [cfg]
(let [tnow (dt/now)
params (-> (event->params event)
(assoc :created-at tnow)
(update :tracked-at #(or % tnow)))]
(append-audit-entry! cfg params)))))))
@@ -0,0 +1,140 @@
;; 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.loggers.audit.archive-task
(:require
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.transit :as t]
[app.common.uuid :as uuid]
[app.config :as cf]
[app.db :as db]
[app.http.client :as http]
[app.setup :as-alias setup]
[app.tokens :as tokens]
[app.util.time :as dt]
[clojure.spec.alpha :as s]
[integrant.core :as ig]
[lambdaisland.uri :as u]
[promesa.exec :as px]))
;; This is a task responsible to send the accumulated events to
;; external service for archival.
(defn- decode-row
[{:keys [props ip-addr context] :as row}]
(cond-> row
(db/pgobject? props)
(assoc :props (db/decode-transit-pgobject props))
(db/pgobject? context)
(assoc :context (db/decode-transit-pgobject context))
(db/pgobject? ip-addr "inet")
(assoc :ip-addr (db/decode-inet ip-addr))))
(def ^:private event-keys
[:type
:name
:source
:created-at
:tracked-at
:profile-id
:ip-addr
:props
:context])
(defn- row->event
[row]
(select-keys row event-keys))
(defn- send!
[{:keys [::uri] :as cfg} events]
(let [token (tokens/generate (::setup/props cfg)
{:iss "authentication"
:iat (dt/now)
:uid uuid/zero})
body (t/encode {:events events})
headers {"content-type" "application/transit+json"
"origin" (cf/get :public-uri)
"cookie" (u/map->query-string {:auth-token token})}
params {:uri uri
:timeout 12000
:method :post
:headers headers
:body body}
resp (http/req! cfg params)]
(if (= (:status resp) 204)
true
(do
(l/error :hint "unable to archive events"
:resp-status (:status resp)
:resp-body (:body resp))
false))))
(defn- mark-archived!
[{:keys [::db/conn]} rows]
(let [ids (db/create-array conn "uuid" (map :id rows))]
(db/exec-one! conn ["update audit_log set archived_at=now() where id = ANY(?)" ids])))
(def ^:private xf:create-event
(comp (map decode-row)
(map row->event)))
(def ^:private sql:get-audit-log-chunk
"SELECT *
FROM audit_log
WHERE archived_at is null
ORDER BY created_at ASC
LIMIT 128
FOR UPDATE
SKIP LOCKED")
(defn- get-event-rows
[{:keys [::db/conn] :as cfg}]
(->> (db/exec! conn [sql:get-audit-log-chunk])
(not-empty)))
(defn- archive-events!
[{:keys [::uri] :as cfg}]
(db/tx-run! cfg (fn [cfg]
(when-let [rows (get-event-rows cfg)]
(let [events (into [] xf:create-event rows)]
(l/trc :hint "archive events chunk" :uri uri :events (count events))
(when (send! cfg events)
(mark-archived! cfg rows)
(count events)))))))
(defmethod ig/pre-init-spec ::handler [_]
(s/keys :req [::db/pool ::setup/props ::http/client]))
(defmethod ig/init-key ::handler
[_ cfg]
(fn [params]
;; NOTE: this let allows overwrite default configured values from
;; the repl, when manually invoking the task.
(let [enabled (or (contains? cf/flags :audit-log-archive)
(:enabled params false))
uri (cf/get :audit-log-archive-uri)
uri (or uri (:uri params))
cfg (assoc cfg ::uri uri)]
(when (and enabled (not uri))
(ex/raise :type :internal
:code :task-not-configured
:hint "archive task not configured, missing uri"))
(when enabled
(loop [total 0]
(if-let [n (archive-events! cfg)]
(do
(px/sleep 100)
(recur (+ total ^long n)))
(when (pos? total)
(l/dbg :hint "events archived" :total total))))))))
+31
View File
@@ -0,0 +1,31 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC
(ns app.loggers.audit.gc-task
(:require
[app.common.logging :as l]
[app.db :as db]
[clojure.spec.alpha :as s]
[integrant.core :as ig]))
(def ^:private sql:clean-archived
"DELETE FROM audit_log
WHERE archived_at IS NOT NULL")
(defn- clean-archived!
[{:keys [::db/pool]}]
(let [result (db/exec-one! pool [sql:clean-archived])
result (db/get-update-count result)]
(l/debug :hint "delete archived audit log entries" :deleted result)
result))
(defmethod ig/pre-init-spec ::handler [_]
(s/keys :req [::db/pool]))
(defmethod ig/init-key ::handler
[_ cfg]
(fn [_]
(clean-archived! cfg)))
+7 -3
View File
@@ -23,17 +23,20 @@
(defn- send-mattermost-notification!
[cfg {:keys [id public-uri] :as report}]
(let [text (str "Exception: " public-uri "/dbg/error/" id " "
(when-let [pid (:profile-id report)]
(str "(pid: #uuid-" pid ")"))
"\n"
"```\n"
"- host: `" (:host report) "`\n"
"- tenant: `" (:tenant report) "`\n"
"- host: #" (:host report) "\n"
"- tenant: #" (:tenant report) "\n"
"- logger: #" (:logger report) "\n"
"- request-path: `" (:request-path report) "`\n"
"- frontend-version: `" (:frontend-version report) "`\n"
"- backend-version: `" (:backend-version report) "`\n"
"\n"
"```\n"
"Trace:\n"
(:trace report)
"```")
@@ -60,6 +63,7 @@
:frontend-version (:version/frontend context)
:profile-id (:request/profile-id context)
:request-path (:request/path context)
:logger (::l/logger record)
:trace (ex/format-throwable cause :detail? false :header? false)})
(defn handle-event
+30 -35
View File
@@ -15,9 +15,9 @@
[app.config :as cf]
[app.db :as db]
[app.http.client :as http]
[app.util.json :as json]
[app.util.time :as dt]
[app.worker :as wrk]
[clojure.data.json :as json]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[integrant.core :as ig]))
@@ -64,35 +64,28 @@
(s/keys :req [::db/pool]))
(defmethod ig/init-key ::process-event-handler
[_ {:keys [::db/pool] :as cfg}]
[_ cfg]
(fn [{:keys [props] :as task}]
(let [event (::event props)]
(l/debug :hint "process webhook event"
:name (:name event))
(when-let [items (lookup-webhooks cfg event)]
(l/trace :hint "webhooks found for event" :total (count items))
(db/with-atomic [conn pool]
(doseq [item items]
(wrk/submit! ::wrk/conn conn
::wrk/task :run-webhook
::wrk/queue :webhooks
::wrk/max-retries 3
::event event
::config item)))))))
(l/dbg :hint "process webhook event" :name (:name props))
(when-let [items (lookup-webhooks cfg props)]
(l/trc :hint "webhooks found for event" :total (count items))
(db/tx-run! cfg (fn [cfg]
(doseq [item items]
(wrk/submit! (-> cfg
(assoc ::wrk/task :run-webhook)
(assoc ::wrk/queue :webhooks)
(assoc ::wrk/max-retries 3)
(assoc ::wrk/params {:event props
:config item})))))))))
;; --- RUN
(declare interpret-exception)
(declare interpret-response)
(def ^:private json-mapper
(json/mapper
{:encode-key-fn str/camel
:decode-key-fn (comp keyword str/kebab)
:pretty true}))
(def json-write-opts
{:key-fn str/camel
:indent true})
(defmethod ig/pre-init-spec ::run-webhook-handler [_]
(s/keys :req [::http/client ::db/pool]))
@@ -111,9 +104,11 @@
" where id=?")
err
(:id whook)]
res (db/exec-one! pool sql {::db/return-keys? true})]
res (db/exec-one! pool sql {::db/return-keys true})]
(when (>= (:error-count res) max-errors)
(db/update! pool :webhook {:is-active false} {:id (:id whook)})))
(db/update! pool :webhook
{:is-active false}
{:id (:id whook)})))
(db/update! pool :webhook
{:updated-at (dt/now)
@@ -130,19 +125,19 @@
:rsp-data (db/tjson rsp)}))]
(fn [{:keys [props] :as task}]
(let [event (::event props)
whook (::config props)
(let [event (:event props)
whook (:config props)
body (case (:mtype whook)
"application/json" (json/encode-str event json-mapper)
"application/json" (json/write-str event json-write-opts)
"application/transit+json" (t/encode-str event)
"application/x-www-form-urlencoded" (uri/map->query-string event))]
(l/debug :hint "run webhook"
:event-name (:name event)
:webhook-id (:id whook)
:webhook-uri (:uri whook)
:webhook-mtype (:mtype whook))
(l/dbg :hint "run webhook"
:event-name (:name event)
:webhook-id (:id whook)
:webhook-uri (:uri whook)
:webhook-mtype (:mtype whook))
(let [req {:uri (:uri whook)
:headers {"content-type" (:mtype whook)
@@ -160,8 +155,8 @@
(report-delivery! whook req nil err)
(update-webhook! whook err)
(when (= err "unknown")
(l/error :hint "unknown error on webhook request"
:cause cause))))))))))
(l/err :hint "unknown error on webhook request"
:cause cause))))))))))
(defn interpret-response
[{:keys [status] :as response}]
+95 -42
View File
@@ -10,7 +10,6 @@
[app.auth.oidc :as-alias oidc]
[app.auth.oidc.providers :as-alias oidc.providers]
[app.common.logging :as l]
[app.common.svg :as csvg]
[app.config :as cf]
[app.db :as-alias db]
[app.email :as-alias email]
@@ -22,10 +21,10 @@
[app.http.session :as-alias session]
[app.http.session.tasks :as-alias session.tasks]
[app.http.websocket :as http.ws]
[app.loggers.audit.tasks :as-alias audit.tasks]
[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]
@@ -34,7 +33,10 @@
[app.srepl :as-alias srepl]
[app.storage :as-alias sto]
[app.storage.fs :as-alias sto.fs]
[app.storage.gc-deleted :as-alias sto.gc-deleted]
[app.storage.gc-touched :as-alias sto.gc-touched]
[app.storage.s3 :as-alias sto.s3]
[app.svgo :as-alias svgo]
[app.util.time :as dt]
[app.worker :as-alias wrk]
[cider.nrepl :refer [cider-nrepl-handler]]
@@ -100,13 +102,13 @@
{::mdef/name "penpot_tasks_timing"
::mdef/help "Background tasks timing (milliseconds)."
::mdef/labels ["name"]
::mdef/type :summary}
::mdef/type :histogram}
:redis-eval-timing
{::mdef/name "penpot_redis_eval_timing"
::mdef/help "Redis EVAL commands execution timings (ms)"
::mdef/labels ["name"]
::mdef/type :summary}
::mdef/type :histogram}
:rpc-climit-queue
{::mdef/name "penpot_rpc_climit_queue"
@@ -124,7 +126,7 @@
{::mdef/name "penpot_rpc_climit_timing"
::mdef/help "Summary of the time between queuing and executing on the CLIMIT"
::mdef/labels ["name"]
::mdef/type :summary}
::mdef/type :histogram}
:audit-http-handler-queue-size
{::mdef/name "penpot_audit_http_handler_queue_size"
@@ -142,7 +144,7 @@
{::mdef/name "penpot_audit_http_handler_timing"
::mdef/help "Summary of the time between queuing and executing on the audit log http handler"
::mdef/labels []
::mdef/type :summary}
::mdef/type :histogram}
:executors-active-threads
{::mdef/name "penpot_executors_active_threads"
@@ -202,11 +204,11 @@
:app.storage.tmp/cleaner
{::wrk/executor (ig/ref ::wrk/executor)}
::sto/gc-deleted-task
::sto.gc-deleted/handler
{::db/pool (ig/ref ::db/pool)
::sto/storage (ig/ref ::sto/storage)}
::sto/gc-touched-task
::sto.gc-touched/handler
{::db/pool (ig/ref ::db/pool)}
::http.client/client
@@ -219,7 +221,7 @@
{::db/pool (ig/ref ::db/pool)}
::http.awsns/routes
{::props (ig/ref ::setup/props)
{::setup/props (ig/ref ::setup/props)
::db/pool (ig/ref ::db/pool)
::http.client/client (ig/ref ::http.client/client)}
@@ -252,7 +254,7 @@
{::http.client/client (ig/ref ::http.client/client)}
::oidc.providers/gitlab
{}
{::http.client/client (ig/ref ::http.client/client)}
::oidc.providers/generic
{::http.client/client (ig/ref ::http.client/client)}
@@ -260,19 +262,21 @@
::oidc/routes
{::http.client/client (ig/ref ::http.client/client)
::db/pool (ig/ref ::db/pool)
::props (ig/ref ::setup/props)
::setup/props (ig/ref ::setup/props)
::oidc/providers {:google (ig/ref ::oidc.providers/google)
:github (ig/ref ::oidc.providers/github)
:gitlab (ig/ref ::oidc.providers/gitlab)
:oidc (ig/ref ::oidc.providers/generic)}
::session/manager (ig/ref ::session/manager)}
::session/manager (ig/ref ::session/manager)
::email/blacklist (ig/ref ::email/blacklist)
::email/whitelist (ig/ref ::email/whitelist)}
:app.http/router
{::session/manager (ig/ref ::session/manager)
::db/pool (ig/ref ::db/pool)
::rpc/routes (ig/ref ::rpc/routes)
::rpc.doc/routes (ig/ref ::rpc.doc/routes)
::props (ig/ref ::setup/props)
::setup/props (ig/ref ::setup/props)
::mtx/routes (ig/ref ::mtx/routes)
::oidc/routes (ig/ref ::oidc/routes)
::http.debug/routes (ig/ref ::http.debug/routes)
@@ -284,7 +288,7 @@
{::db/pool (ig/ref ::db/pool)
::session/manager (ig/ref ::session/manager)
::sto/storage (ig/ref ::sto/storage)
::props (ig/ref ::setup/props)}
::setup/props (ig/ref ::setup/props)}
::http.ws/routes
{::db/pool (ig/ref ::db/pool)
@@ -299,7 +303,8 @@
::sto/storage (ig/ref ::sto/storage)}
:app.rpc/climit
{::mtx/metrics (ig/ref ::mtx/metrics)}
{::mtx/metrics (ig/ref ::mtx/metrics)
::wrk/executor (ig/ref ::wrk/executor)}
:app.rpc/rlimit
{::wrk/executor (ig/ref ::wrk/executor)}
@@ -314,14 +319,15 @@
::mtx/metrics (ig/ref ::mtx/metrics)
::mbus/msgbus (ig/ref ::mbus/msgbus)
::rds/redis (ig/ref ::rds/redis)
::csvg/optimizer (ig/ref ::csvg/optimizer)
::svgo/optimizer (ig/ref ::svgo/optimizer)
::rpc/climit (ig/ref ::rpc/climit)
::rpc/rlimit (ig/ref ::rpc/rlimit)
::setup/templates (ig/ref ::setup/templates)
::props (ig/ref ::setup/props)
::setup/props (ig/ref ::setup/props)
:pool (ig/ref ::db/pool)}
::email/blacklist (ig/ref ::email/blacklist)
::email/whitelist (ig/ref ::email/whitelist)}
:app.rpc.doc/routes
{:methods (ig/ref :app.rpc/methods)}
@@ -330,7 +336,7 @@
{::rpc/methods (ig/ref :app.rpc/methods)
::db/pool (ig/ref ::db/pool)
::session/manager (ig/ref ::session/manager)
::props (ig/ref ::setup/props)}
::setup/props (ig/ref ::setup/props)}
::wrk/registry
{::mtx/metrics (ig/ref ::mtx/metrics)
@@ -338,20 +344,30 @@
{:sendmail (ig/ref ::email/handler)
:objects-gc (ig/ref :app.tasks.objects-gc/handler)
: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)
:storage-gc-deleted (ig/ref ::sto/gc-deleted-task)
:storage-gc-touched (ig/ref ::sto/gc-touched-task)
: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)
:storage-gc-touched (ig/ref ::sto.gc-touched/handler)
:session-gc (ig/ref ::session.tasks/gc)
:audit-log-archive (ig/ref ::audit.tasks/archive)
:audit-log-gc (ig/ref ::audit.tasks/gc)
:audit-log-archive (ig/ref :app.loggers.audit.archive-task/handler)
:audit-log-gc (ig/ref :app.loggers.audit.gc-task/handler)
:delete-object
(ig/ref :app.tasks.delete-object/handler)
:process-webhook-event
(ig/ref ::webhooks/process-event-handler)
:run-webhook
(ig/ref ::webhooks/run-webhook-handler)}}
::email/blacklist
{}
::email/whitelist
{}
::email/sendmail
{::email/host (cf/get :smtp-host)
::email/port (cf/get :smtp-port)
@@ -373,17 +389,28 @@
{::db/pool (ig/ref ::db/pool)
::sto/storage (ig/ref ::sto/storage)}
:app.tasks.delete-object/handler
{::db/pool (ig/ref ::db/pool)}
:app.tasks.file-gc/handler
{::db/pool (ig/ref ::db/pool)
::sto/storage (ig/ref ::sto/storage)}
:app.tasks.file-xlog-gc/handler
:app.tasks.file-gc-scheduler/handler
{::db/pool (ig/ref ::db/pool)}
:app.tasks.offload-file-data/handler
{::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)
::props (ig/ref ::setup/props)}
::setup/props (ig/ref ::setup/props)}
[::srepl/urepl ::srepl/server]
{::srepl/port (cf/get :urepl-port 6062)
@@ -397,21 +424,21 @@
::setup/props
{::db/pool (ig/ref ::db/pool)
::key (cf/get :secret-key)
::setup/key (cf/get :secret-key)
;; NOTE: this dependency is only necessary for proper initialization ordering, props
;; module requires the migrations to run before initialize.
::migrations (ig/ref :app.migrations/migrations)}
::csvg/optimizer
::svgo/optimizer
{}
::audit.tasks/archive
{::props (ig/ref ::setup/props)
:app.loggers.audit.archive-task/handler
{::setup/props (ig/ref ::setup/props)
::db/pool (ig/ref ::db/pool)
::http.client/client (ig/ref ::http.client/client)}
::audit.tasks/gc
:app.loggers.audit.gc-task/handler
{::db/pool (ig/ref ::db/pool)}
::webhooks/process-event-handler
@@ -431,17 +458,28 @@
::sto/storage
{::db/pool (ig/ref ::db/pool)
::sto/backends
{:assets-s3 (ig/ref [::assets :app.storage.s3/backend])
:assets-fs (ig/ref [::assets :app.storage.fs/backend])}}
{:s3 (ig/ref :app.storage.s3/backend)
:fs (ig/ref :app.storage.fs/backend)
[::assets :app.storage.s3/backend]
{::sto.s3/region (cf/get :storage-assets-s3-region)
::sto.s3/endpoint (cf/get :storage-assets-s3-endpoint)
::sto.s3/bucket (cf/get :storage-assets-s3-bucket)
::sto.s3/io-threads (cf/get :storage-assets-s3-io-threads)}
;; LEGACY (should not be removed, can only be removed after an
;; explicit migration because the database objects/rows will
;; still reference the old names).
:assets-s3 (ig/ref :app.storage.s3/backend)
:assets-fs (ig/ref :app.storage.fs/backend)}}
[::assets :app.storage.fs/backend]
{::sto.fs/directory (cf/get :storage-assets-fs-directory)}})
:app.storage.s3/backend
{::sto.s3/region (or (cf/get :storage-assets-s3-region)
(cf/get :objects-storage-s3-region))
::sto.s3/endpoint (or (cf/get :storage-assets-s3-endpoint)
(cf/get :objects-storage-s3-endpoint))
::sto.s3/bucket (or (cf/get :storage-assets-s3-bucket)
(cf/get :objects-storage-s3-bucket))
::sto.s3/io-threads (or (cf/get :storage-assets-s3-io-threads)
(cf/get :objects-storage-s3-io-threads))}
:app.storage.fs/backend
{::sto.fs/directory (or (cf/get :storage-assets-fs-directory)
(cf/get :objects-storage-fs-directory))}})
(def worker-config
@@ -468,7 +506,7 @@
:task :tasks-gc}
{:cron #app/cron "0 0 2 * * ?" ;; daily
:task :file-gc}
:task :file-gc-scheduler}
{:cron #app/cron "0 30 */3,23 * * ?"
:task :telemetry}
@@ -486,7 +524,7 @@
::mtx/metrics (ig/ref ::mtx/metrics)
::db/pool (ig/ref ::db/pool)}
[::default ::wrk/worker]
[::default ::wrk/runner]
{::wrk/parallelism (cf/get ::worker-default-parallelism 1)
::wrk/queue :default
::rds/redis (ig/ref ::rds/redis)
@@ -494,7 +532,7 @@
::mtx/metrics (ig/ref ::mtx/metrics)
::db/pool (ig/ref ::db/pool)}
[::webhook ::wrk/worker]
[::webhook ::wrk/runner]
{::wrk/parallelism (cf/get ::worker-webhook-parallelism 1)
::wrk/queue :webhooks
::rds/redis (ig/ref ::rds/redis)
@@ -507,6 +545,7 @@
(defn start
[]
(cf/validate!)
(ig/load-namespaces (merge system-config worker-config))
(alter-var-root #'system (fn [sys]
(when sys (ig/halt! sys))
@@ -520,6 +559,15 @@
:worker? (contains? cf/flags :backend-worker)
:version (:full cf/version)))
(defn start-custom
[config]
(ig/load-namespaces config)
(alter-var-root #'system (fn [sys]
(when sys (ig/halt! sys))
(-> config
(ig/prep)
(ig/init)))))
(defn stop
[]
(alter-var-root #'system (fn [sys]
@@ -566,6 +614,11 @@
(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
(binding [*out* *err*]
+10 -39
View File
@@ -11,7 +11,6 @@
[app.common.exceptions :as ex]
[app.common.media :as cm]
[app.common.schema :as sm]
[app.common.schema.generators :as sg]
[app.common.schema.openapi :as-alias oapi]
[app.common.spec :as us]
[app.common.svg :as csvg]
@@ -32,9 +31,6 @@
org.im4java.core.IMOperation
org.im4java.core.Info))
(def default-max-file-size
(* 1024 1024 30)) ; 30 MiB
(s/def ::path fs/path?)
(s/def ::filename string?)
(s/def ::size integer?)
@@ -50,22 +46,10 @@
(s/keys :req-un [::path]
:opt-un [::mtype]))
(sm/def! ::fs/path
{:type ::fs/path
:pred fs/path?
:type-properties
{:title "path"
:description "filesystem path"
:error/message "expected a valid fs path instance"
:gen/gen (sg/generator :string)
::oapi/type "string"
::oapi/format "unix-path"
::oapi/decode fs/path}})
(sm/def! ::upload
(sm/register! ::upload
[:map {:title "Upload"}
[:filename :string]
[:size :int]
[:size ::sm/int]
[:path ::fs/path]
[:mtype {:optional true} :string]
[:headers {:optional true}
@@ -83,13 +67,14 @@
(defn validate-media-size!
[upload]
(when (> (:size upload) (cf/get :media-max-file-size default-max-file-size))
(ex/raise :type :restriction
:code :media-max-file-size-reached
:hint (str/ffmt "the uploaded file size % is greater than the maximum %"
(:size upload)
default-max-file-size)))
upload)
(let [max-size (cf/get :media-max-file-size)]
(when (> (:size upload) max-size)
(ex/raise :type :restriction
:code :media-max-file-size-reached
:hint (str/ffmt "the uploaded file size % is greater than the maximum %"
(:size upload)
max-size)))
upload))
(defmulti process :cmd)
(defmulti process-error class)
@@ -328,17 +313,3 @@
(= stype :ttf)
(-> (assoc "font/otf" (ttf->otf sfnt))
(assoc "font/ttf" sfnt)))))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Utility functions
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn configure-assets-storage
"Given storage map, returns a storage configured with the appropriate
backend for assets and optional connection attached."
([storage]
(assoc storage ::sto/backend (cf/get :assets-storage-backend :assets-fs)))
([storage pool-or-conn]
(-> (configure-assets-storage storage)
(assoc ::db/pool-or-conn pool-or-conn))))
+76 -1
View File
@@ -337,7 +337,82 @@
:fn (mg/resource "app/migrations/sql/0106-mod-team-table.sql")}
{:name "0107-mod-file-tagged-object-thumbnail-table"
:fn (mg/resource "app/migrations/sql/0107-mod-file-tagged-object-thumbnail-table.sql")}])
:fn (mg/resource "app/migrations/sql/0107-mod-file-tagged-object-thumbnail-table.sql")}
{:name "0107-add-deletion-protection-trigger-function"
:fn (mg/resource "app/migrations/sql/0107-add-deletion-protection-trigger-function.sql")}
{:name "0108-mod-file-thumbnail-table"
:fn (mg/resource "app/migrations/sql/0108-mod-file-thumbnail-table.sql")}
{:name "0109-mod-file-tagged-object-thumbnail-table"
:fn (mg/resource "app/migrations/sql/0109-mod-file-tagged-object-thumbnail-table.sql")}
{:name "0110-mod-file-media-object-table"
:fn (mg/resource "app/migrations/sql/0110-mod-file-media-object-table.sql")}
{:name "0111-mod-file-data-fragment-table"
:fn (mg/resource "app/migrations/sql/0111-mod-file-data-fragment-table.sql")}
{:name "0112-mod-profile-table"
:fn (mg/resource "app/migrations/sql/0112-mod-profile-table.sql")}
{:name "0113-mod-team-font-variant-table"
:fn (mg/resource "app/migrations/sql/0113-mod-team-font-variant-table.sql")}
{:name "0114-mod-team-table"
:fn (mg/resource "app/migrations/sql/0114-mod-team-table.sql")}
{:name "0115-mod-project-table"
:fn (mg/resource "app/migrations/sql/0115-mod-project-table.sql")}
{:name "0116-mod-file-table"
:fn (mg/resource "app/migrations/sql/0116-mod-file-table.sql")}
{:name "0117-mod-file-object-thumbnail-table"
:fn (mg/resource "app/migrations/sql/0117-mod-file-object-thumbnail-table.sql")}
{:name "0118-mod-task-table"
:fn (mg/resource "app/migrations/sql/0118-mod-task-table.sql")}
{:name "0119-mod-file-table"
:fn (mg/resource "app/migrations/sql/0119-mod-file-table.sql")}
{:name "0120-mod-audit-log-table"
:fn (mg/resource "app/migrations/sql/0120-mod-audit-log-table.sql")}
{:name "0121-mod-file-data-fragment-table"
:fn (mg/resource "app/migrations/sql/0121-mod-file-data-fragment-table.sql")}
{:name "0122-mod-file-table"
:fn (mg/resource "app/migrations/sql/0122-mod-file-table.sql")}
{:name "0122-mod-file-data-fragment-table"
:fn (mg/resource "app/migrations/sql/0122-mod-file-data-fragment-table.sql")}
{:name "0123-mod-file-change-table"
:fn (mg/resource "app/migrations/sql/0123-mod-file-change-table.sql")}
{:name "0124-mod-profile-table"
:fn (mg/resource "app/migrations/sql/0124-mod-profile-table.sql")}
{:name "0125-mod-file-table"
:fn (mg/resource "app/migrations/sql/0125-mod-file-table.sql")}
{:name "0126-add-team-access-request-table"
:fn (mg/resource "app/migrations/sql/0126-add-team-access-request-table.sql")}
{:name "0127-mod-storage-object-table"
:fn (mg/resource "app/migrations/sql/0127-mod-storage-object-table.sql")}
{:name "0128-mod-task-table"
:fn (mg/resource "app/migrations/sql/0128-mod-task-table.sql")}
{:name "0129-mod-file-change-table"
:fn (mg/resource "app/migrations/sql/0129-mod-file-change-table.sql")}
{:name "0130-mod-file-change-table"
:fn (mg/resource "app/migrations/sql/0130-mod-file-change-table.sql")}])
(defn apply-migrations!
[pool name migrations]
@@ -0,0 +1,8 @@
CREATE OR REPLACE FUNCTION raise_deletion_protection()
RETURNS TRIGGER AS $$
BEGIN
RAISE EXCEPTION 'unable to proceed to delete row on "%"', TG_TABLE_NAME
USING HINT = 'disable deletion protection with "SET rules.deletion_protection TO off"';
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
@@ -0,0 +1,25 @@
--- Add missing index for deleted_at column, we include all related
--- columns because we expect the index to be small and expect use
--- index-only scans.
CREATE INDEX IF NOT EXISTS file_thumbnail__deleted_at__idx
ON file_thumbnail (deleted_at, file_id, revn, media_id)
WHERE deleted_at IS NOT NULL;
--- Add missing for media_id column, used mainly for refs checking
CREATE INDEX IF NOT EXISTS file_thumbnail__media_id__idx ON file_thumbnail (media_id);
--- Remove CASCADE from media_id and file_id foreign constraint
ALTER TABLE file_thumbnail
DROP CONSTRAINT file_thumbnail_file_id_fkey,
ADD FOREIGN KEY (file_id) REFERENCES file(id) DEFERRABLE;
ALTER TABLE file_thumbnail
DROP CONSTRAINT file_thumbnail_media_id_fkey,
ADD FOREIGN KEY (media_id) REFERENCES storage_object(id) DEFERRABLE;
--- Add deletion protection
CREATE OR REPLACE TRIGGER deletion_protection__tgr
BEFORE DELETE ON file_thumbnail FOR EACH STATEMENT
WHEN ((current_setting('rules.deletion_protection', true) IN ('on', '')) OR
(current_setting('rules.deletion_protection', true) IS NULL))
EXECUTE PROCEDURE raise_deletion_protection();
@@ -0,0 +1,26 @@
ALTER TABLE file_tagged_object_thumbnail
ADD COLUMN updated_at timestamptz NULL,
ADD COLUMN deleted_at timestamptz NULL;
--- Add index for deleted_at column, we include all related columns
--- because we expect the index to be small and expect use index-only
--- scans.
CREATE INDEX IF NOT EXISTS file_tagged_object_thumbnail__deleted_at__idx
ON file_tagged_object_thumbnail (deleted_at, file_id, object_id, media_id)
WHERE deleted_at IS NOT NULL;
--- Remove CASCADE from media_id and file_id foreign constraint
ALTER TABLE file_tagged_object_thumbnail
DROP CONSTRAINT file_tagged_object_thumbnail_media_id_fkey,
ADD FOREIGN KEY (media_id) REFERENCES storage_object(id) DEFERRABLE;
ALTER TABLE file_tagged_object_thumbnail
DROP CONSTRAINT file_tagged_object_thumbnail_file_id_fkey,
ADD FOREIGN KEY (file_id) REFERENCES file(id) DEFERRABLE;
--- Add deletion protection
CREATE OR REPLACE TRIGGER deletion_protection__tgr
BEFORE DELETE ON file_tagged_object_thumbnail FOR EACH STATEMENT
WHEN ((current_setting('rules.deletion_protection', true) IN ('on', '')) OR
(current_setting('rules.deletion_protection', true) IS NULL))
EXECUTE PROCEDURE raise_deletion_protection();
@@ -0,0 +1,27 @@
--- Fix legacy naming
ALTER INDEX media_object_pkey RENAME TO file_media_object_pkey;
ALTER INDEX media_object__file_id__idx RENAME TO file_media_object__file_id__idx;
--- Create index for the deleted_at column
CREATE INDEX IF NOT EXISTS file_media_object__deleted_at__idx
ON file_media_object (deleted_at, id, media_id)
WHERE deleted_at IS NOT NULL;
--- Drop now unnecesary trigger because this will be handled by the
--- application code
DROP TRIGGER file_media_object__on_delete__tgr ON file_media_object;
DROP FUNCTION on_delete_file_media_object ( ) CASCADE;
DROP TRIGGER file_media_object__on_insert__tgr ON file_media_object;
DROP FUNCTION on_media_object_insert () CASCADE;
--- Remove CASCADE from file FOREIGN KEY
ALTER TABLE file_media_object
DROP CONSTRAINT file_media_object_file_id_fkey,
ADD FOREIGN KEY (file_id) REFERENCES file(id) DEFERRABLE;
--- Add deletion protection
CREATE OR REPLACE TRIGGER deletion_protection__tgr
BEFORE DELETE ON file_media_object FOR EACH STATEMENT
WHEN ((current_setting('rules.deletion_protection', true) IN ('on', '')) OR
(current_setting('rules.deletion_protection', true) IS NULL))
EXECUTE PROCEDURE raise_deletion_protection();
@@ -0,0 +1,9 @@
ALTER TABLE file_data_fragment
ADD COLUMN deleted_at timestamptz NULL;
--- Add index for deleted_at column, we include all related columns
--- because we expect the index to be small and expect use index-only
--- scans.
CREATE INDEX IF NOT EXISTS file_data_fragment__deleted_at__idx
ON file_data_fragment (deleted_at, file_id, id)
WHERE deleted_at IS NOT NULL;
@@ -0,0 +1,15 @@
ALTER TABLE profile
DROP CONSTRAINT profile_photo_id_fkey,
ADD FOREIGN KEY (photo_id) REFERENCES storage_object(id) DEFERRABLE,
DROP CONSTRAINT profile_default_project_id_fkey,
ADD FOREIGN KEY (default_project_id) REFERENCES project(id) DEFERRABLE,
DROP CONSTRAINT profile_default_team_id_fkey,
ADD FOREIGN KEY (default_team_id) REFERENCES team(id) DEFERRABLE;
--- Add deletion protection
CREATE OR REPLACE TRIGGER deletion_protection__tgr
BEFORE DELETE ON profile FOR EACH STATEMENT
WHEN ((current_setting('rules.deletion_protection', true) IN ('on', '')) OR
(current_setting('rules.deletion_protection', true) IS NULL))
EXECUTE PROCEDURE raise_deletion_protection();
@@ -0,0 +1,20 @@
--- Remove ON DELETE SET NULL from foreign constraint on
--- storage_object table
ALTER TABLE team_font_variant
DROP CONSTRAINT team_font_variant_otf_file_id_fkey,
ADD FOREIGN KEY (otf_file_id) REFERENCES storage_object(id) DEFERRABLE,
DROP CONSTRAINT team_font_variant_ttf_file_id_fkey,
ADD FOREIGN KEY (ttf_file_id) REFERENCES storage_object(id) DEFERRABLE,
DROP CONSTRAINT team_font_variant_woff1_file_id_fkey,
ADD FOREIGN KEY (woff1_file_id) REFERENCES storage_object(id) DEFERRABLE,
DROP CONSTRAINT team_font_variant_woff2_file_id_fkey,
ADD FOREIGN KEY (woff2_file_id) REFERENCES storage_object(id) DEFERRABLE,
DROP CONSTRAINT team_font_variant_team_id_fkey,
ADD FOREIGN KEY (team_id) REFERENCES team(id) DEFERRABLE;
--- Add deletion protection
CREATE OR REPLACE TRIGGER deletion_protection__tgr
BEFORE DELETE ON team_font_variant FOR EACH STATEMENT
WHEN ((current_setting('rules.deletion_protection', true) IN ('on', '')) OR
(current_setting('rules.deletion_protection', true) IS NULL))
EXECUTE PROCEDURE raise_deletion_protection();
@@ -0,0 +1,10 @@
--- Add deletion protection
CREATE OR REPLACE TRIGGER deletion_protection__tgr
BEFORE DELETE ON team FOR EACH STATEMENT
WHEN ((current_setting('rules.deletion_protection', true) IN ('on', '')) OR
(current_setting('rules.deletion_protection', true) IS NULL))
EXECUTE PROCEDURE raise_deletion_protection();
ALTER TABLE team
DROP CONSTRAINT team_photo_id_fkey,
ADD FOREIGN KEY (photo_id) REFERENCES storage_object(id) DEFERRABLE;
@@ -0,0 +1,3 @@
ALTER TABLE project
DROP CONSTRAINT project_team_id_fkey,
ADD FOREIGN KEY (team_id) REFERENCES team(id) DEFERRABLE;
@@ -0,0 +1,3 @@
ALTER TABLE file
DROP CONSTRAINT file_project_id_fkey,
ADD FOREIGN KEY (project_id) REFERENCES project(id) DEFERRABLE;
@@ -0,0 +1,12 @@
ALTER TABLE file_object_thumbnail
DROP CONSTRAINT file_object_thumbnail_file_id_fkey,
ADD FOREIGN KEY (file_id) REFERENCES file(id) DEFERRABLE,
DROP CONSTRAINT file_object_thumbnail_media_id_fkey,
ADD FOREIGN KEY (media_id) REFERENCES storage_object(id) DEFERRABLE;
--- Mark all related storage_object row as touched
-- UPDATE storage_object SET touched_at = now()
-- WHERE id IN (SELECT DISTINCT media_id
-- FROM file_object_thumbnail
-- WHERE media_id IS NOT NULL)
-- AND touched_at IS NULL;
@@ -0,0 +1,12 @@
-- Removes the partitioning.
CREATE TABLE new_task (LIKE task INCLUDING ALL);
INSERT INTO new_task SELECT * FROM task;
ALTER TABLE task RENAME TO old_task;
ALTER TABLE new_task RENAME TO task;
DROP TABLE old_task;
ALTER INDEX new_task_label_name_queue_idx RENAME TO task__label_name_queue__idx;
ALTER INDEX new_task_scheduled_at_queue_idx RENAME TO task__scheduled_at_queue__idx;
ALTER TABLE task DROP CONSTRAINT new_task_pkey;
ALTER TABLE task ADD PRIMARY KEY (id);
ALTER TABLE task ALTER COLUMN created_at SET DEFAULT now();
ALTER TABLE task ALTER COLUMN modified_at SET DEFAULT now();
@@ -0,0 +1,2 @@
ALTER TABLE file
ADD COLUMN version integer NULL;
@@ -0,0 +1,11 @@
CREATE TABLE new_audit_log (LIKE audit_log INCLUDING ALL);
INSERT INTO new_audit_log SELECT * FROM audit_log;
ALTER TABLE audit_log RENAME TO old_audit_log;
ALTER TABLE new_audit_log RENAME TO audit_log;
DROP TABLE old_audit_log;
DROP INDEX new_audit_log_id_archived_at_idx;
ALTER TABLE audit_log DROP CONSTRAINT new_audit_log_pkey;
ALTER TABLE audit_log ADD PRIMARY KEY (id);
ALTER TABLE audit_log ALTER COLUMN created_at SET DEFAULT now();
ALTER TABLE audit_log ALTER COLUMN tracked_at SET DEFAULT now();
@@ -0,0 +1,8 @@
ALTER TABLE file_data_fragment
ADD COLUMN data bytea NULL;
UPDATE file_data_fragment
SET data = content;
ALTER TABLE file_data_fragment
DROP COLUMN content;
Loaded 100 of 1899 files, more files were not shown because too many files have changed in this diff. Show more