From 20c6a28b52a74211662b5dce67919d9e1a0a2133 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 24 Apr 2026 08:54:01 +0200 Subject: [PATCH 1/5] :paperclip: Add commit agent for opencode --- .opencode/agents/commiter.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 .opencode/agents/commiter.md diff --git a/.opencode/agents/commiter.md b/.opencode/agents/commiter.md new file mode 100644 index 0000000000..3020e5aac1 --- /dev/null +++ b/.opencode/agents/commiter.md @@ -0,0 +1,27 @@ +--- +name: commiter +description: Git commit assistant following CONTRIBUTING.md commit rules +mode: primary +--- + +Role: You are responsible for creating git commits for Penpot and must follow +the repository commit-format rules exactly. + +Requirements: + +* Read `CONTRIBUTING.md` before creating any commit and follow the + commit guidelines strictly. +* Use commit messages in the form `:emoji: `. +* Keep the subject capitalized, concise, 70 characters or fewer, and + without a trailing period. +* Keep the description (commit body) with maximum line length of 80 + characters. Use manual line breaks to wrap text before it exceeds + this limit. +* Separate the subject from the body with a blank line. +* Write a clear and concise body when needed. +* Use `git commit -s` so the commit includes the required + `Signed-off-by` line. +* Do not guess or hallucinate git author information (Name or + Email). Never include the `--author` flag in git commands unless + specifically instructed by the user for a unique case; assume the + local environment is already configured. From 5a7ba7ee7ec19a807db8975153ccf9b92c407ea8 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Fri, 24 Apr 2026 09:47:44 +0200 Subject: [PATCH 2/5] :bug: Fix multiple selection on shapes with token applied to stroke-color (#9110) * :sparkles: Remove the need to navigate to page for deletion operation * :bug: Fix multiple selection with applied-tokens on stroke-color * :bug: Fix button position on page header --------- Co-authored-by: Andrey Antukh --- CHANGES.md | 1 + .../app/main/ui/workspace/left_header.scss | 3 ++- .../options/menus/color_selection.cljs | 21 ++++++++----------- .../sidebar/options/menus/stroke.cljs | 4 +++- .../sidebar/options/rows/color_row.cljs | 8 ++++++- .../sidebar/options/rows/stroke_row.cljs | 2 ++ .../main/ui/workspace/sidebar/sitemap.cljs | 12 ++++++----- 7 files changed, 31 insertions(+), 20 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index f9fb9fe1a7..df2e133b71 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -37,6 +37,7 @@ - Fix wrong `mapcat` call in `collect-main-shapes` - Fix stale accumulator in `get-children-in-instance` recursion - Fix typo `:podition` in swap-shapes grid cell +- Fix multiple selection on shapes with token applied to stroke color ## 2.14.2 diff --git a/frontend/src/app/main/ui/workspace/left_header.scss b/frontend/src/app/main/ui/workspace/left_header.scss index a096c8144a..5ecac0793c 100644 --- a/frontend/src/app/main/ui/workspace/left_header.scss +++ b/frontend/src/app/main/ui/workspace/left_header.scss @@ -29,9 +29,10 @@ .project-tree { position: relative; flex-grow: 1; + flex-shrink: 1; + min-width: 0; height: deprecated.$s-32; min-height: deprecated.$s-32; - max-width: calc(100% - deprecated.$s-64); } .project-name, diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs index eac46af116..a74d9f6203 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs @@ -49,16 +49,16 @@ • :prop → the property type (:fill, :stroke, :shadow, etc.) • :shape-id → the UUID of the shape using this color • :index → index of the color in the shape's fill/stroke list - + Example of groups: { {:color \"#9f2929\", :opacity 0.3, :token-name \"asd2\" :has-token-applied true} [{:prop :fill, :shape-id #uuid \"d0231035-25c9-80d5-8006-eae4c3dff32e\", :index 0}] - + {:color \"#1b54b6\", :opacity 1} [{:prop :fill, :shape-id #uuid \"aab34f9a-98c1-801a-8006-eae5e8236f1b\", :index 0}] } - + This structure allows fast lookups of all shapes using the same visual color, regardless of whether it comes from local fills, strokes or shadow-colors." @@ -69,12 +69,10 @@ ;; Unique color attribute maps all-colors (distinct (mapv :attrs data)) - ;; Split into: library colors, token colors, and plain colors - library-colors (filterv :ref-id all-colors) + ;; ;; Split into: library colors, token colors, and plain colors token-colors (filterv :token-name all-colors) - colors (filterv #(and (nil? (:ref-id %)) - (not (:token-name %))) - all-colors)] + library-colors (filterv (fn [c] (and (some? (:ref-id c)) (nil? (:token-name c)))) all-colors) + colors (filterv (fn [c] (and (nil? (:ref-id c)) (nil? (:token-name c)))) all-colors)] {:groups groups :all-colors all-colors :colors colors @@ -107,12 +105,11 @@ open? (deref open*) has-colors? (or (some? (seq colors)) (some? (seq library-colors))) - toggle-content (mf/use-fn #(swap! open* not)) - expand-lib-color (mf/use-state false) - expand-color (mf/use-state false) - expand-token-color (mf/use-state false) + expand-lib-color (mf/use-state false) + expand-color (mf/use-state false) + expand-token-color (mf/use-state false) ;; TODO: Review if this is still necessary. prev-colors-ref (mf/use-ref nil) diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs index c35bac471e..b3d08a9eed 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs @@ -194,7 +194,9 @@ [:div {:class (stl/css-case :stroke-content true :stroke-content-empty (not has-strokes?))} (cond - (= :multiple strokes) + (or (= :multiple (:stroke-color applied-tokens)) + (= :multiple (:stroke-width applied-tokens)) + (= :multiple strokes)) [:div {:class (stl/css :stroke-multiple)} [:div {:class (stl/css :stroke-multiple-label)} (tr "settings.multiple")] diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs index 71e6ec2eb9..4cac27324e 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs @@ -71,12 +71,13 @@ [{:keys [active-tokens applied-token-name color on-swatch-click-token detach-token open-modal-from-token]}] (let [;; `active-tokens` may be provided as a `delay` (lazy computation). ;; In that case we must deref it (`@active-tokens`) to force evaluation - ;; and obtain the actual value. If it’s already realized (not a delay), + ;; and obtain the actual value. If it's already realized (not a delay), ;; we just use it directly. active-tokens (if (delay? active-tokens) @active-tokens active-tokens) + active-color-tokens (:color active-tokens) token (some #(when (= (:name %) applied-token-name) %) active-color-tokens) @@ -345,9 +346,14 @@ :dnd-over-top (= (:over dprops) :top) :dnd-over-bot (= (:over dprops) :bot))] + (when (= applied-token :multiple) + ;; (js/console.trace "color-row*") + (prn "color-row*" index color applied-token)) + (mf/with-effect [color prev-color disable-picker] (when (and (not disable-picker) (not= prev-color color)) (modal/update-props! :colorpicker {:data (parse-color color)}))) + [:div {:class [class row-class]} ;; Drag handler (when (some? on-reorder) diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/rows/stroke_row.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/rows/stroke_row.cljs index 7cb0956d11..64f34b7927 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/rows/stroke_row.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/rows/stroke_row.cljs @@ -192,6 +192,8 @@ (when (some? on-reorder) [:> reorder-handler* {:ref dref}]) + (prn "stroke-row*" applied-tokens) + ;; Stroke Color ;; FIXME: memorize stroke color [:> color-row* {:color (ctc/stroke->color stroke) diff --git a/frontend/src/app/main/ui/workspace/sidebar/sitemap.cljs b/frontend/src/app/main/ui/workspace/sidebar/sitemap.cljs index a58e1512ba..4934066f7a 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/sitemap.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/sitemap.cljs @@ -89,11 +89,13 @@ on-delete (mf/use-fn (mf/deps id) - #(st/emit! (modal/show - {:type :confirm - :title (tr "modals.delete-page.title") - :message (tr "modals.delete-page.body") - :on-accept delete-fn}))) + (fn [event] + (dom/stop-propagation event) + (st/emit! (modal/show + {:type :confirm + :title (tr "modals.delete-page.title") + :message (tr "modals.delete-page.body") + :on-accept delete-fn})))) on-double-click (mf/use-fn From 4a7140d82d71ed2daa8bccf5328aff613415477e Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Fri, 24 Apr 2026 11:38:34 +0200 Subject: [PATCH 3/5] :bug: Fix theme modal height (#9105) * :bug: Fix CI * :bug: Fix theme modal height --- CHANGES.md | 1 + .../src/app/main/ui/workspace/main_menu.cljs | 6 +- .../workspace/tokens/themes/create_modal.scss | 95 +++++++++++-------- 3 files changed, 62 insertions(+), 40 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 826de71889..18411bd07a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -23,6 +23,7 @@ - Fix dashboard navigation tabs overlap with projects content when scrolling [Taiga #13962](https://tree.taiga.io/project/penpot/issue/13962) - Fix text editor v1 focus [Taiga #13961](https://tree.taiga.io/project/penpot/issue/13961) - Fix color dropdown option update [Taiga #14035](https://tree.taiga.io/project/penpot/issue/14035) +- Fix themes modal height [Taiga #14046](https://tree.taiga.io/project/penpot/issue/14046) ## 2.15.0 (Unreleased) diff --git a/frontend/src/app/main/ui/workspace/main_menu.cljs b/frontend/src/app/main/ui/workspace/main_menu.cljs index 674a01549d..2f59df3907 100644 --- a/frontend/src/app/main/ui/workspace/main_menu.cljs +++ b/frontend/src/app/main/ui/workspace/main_menu.cljs @@ -745,12 +745,12 @@ (mf/defc mcp-menu* {::mf/private true} [{:keys [on-close]}] - (let [plugins? (features/active-feature? @st/state "plugins/runtime") - + (let [plugins? (features/active-feature? @st/state "plugins/runtime") + profile (mf/deref refs/profile) mcp (mf/deref refs/mcp) tokens (mf/deref refs/access-tokens) - + expired? (some->> tokens (some #(when (= (:type %) "mcp") %)) :expires-at diff --git a/frontend/src/app/main/ui/workspace/tokens/themes/create_modal.scss b/frontend/src/app/main/ui/workspace/tokens/themes/create_modal.scss index c1cc8b59a4..6be2add41c 100644 --- a/frontend/src/app/main/ui/workspace/tokens/themes/create_modal.scss +++ b/frontend/src/app/main/ui/workspace/tokens/themes/create_modal.scss @@ -4,20 +4,36 @@ // // Copyright (c) KALEIDOS INC +@use "ds/_utils.scss" as *; @use "ds/_sizes.scss" as *; - -@use "refactor/common-refactor.scss" as deprecated; +@use "ds/_borders.scss" as *; +@use "ds/mixins.scss" as *; +@use "ds/z-index.scss" as *; .modal-overlay { - @extend .modal-overlay-base; + display: flex; + justify-content: center; + align-items: center; + position: fixed; + inset-inline-start: 0; + inset-block-start: 0; + block-size: 100%; + inline-size: 100%; + z-index: var(--z-index-set); + background-color: var(--color-overlay-default); } .modal-dialog { - @extend .modal-container-base; - - width: 100%; - max-width: deprecated.$s-512; - max-height: unset; + position: relative; + inline-size: 100%; + min-inline-size: $sz-364; + min-block-size: $sz-192; + max-inline-size: $sz-512; + max-block-size: calc(100dvh - #{px2rem(192)}); + padding: var(--sp-xxxl); + border-radius: $br-8; + border: $b-2 solid var(--color-background-quaternary); + background-color: var(--color-background-primary); user-select: none; } @@ -26,14 +42,15 @@ flex-direction: column; justify-content: center; align-items: center; - gap: deprecated.$s-12; - padding: deprecated.$s-72 0; + gap: var(--sp-m); + padding-block: px2rem(72); + padding-inline: 0; } .themes-modal-wrapper { display: flex; flex-direction: column; - gap: deprecated.$s-16; + gap: var(--sp-l); } .edit-theme-form { @@ -53,10 +70,10 @@ border: none; appearance: none; color: var(--color-foreground-secondary); - width: fit-content; + inline-size: fit-content; display: grid; grid-template-columns: auto auto; - gap: deprecated.$s-4; + gap: var(--sp-xs); align-items: center; padding: 0; &:hover { @@ -66,9 +83,9 @@ .button-footer { display: flex; - margin-left: auto; + margin-inline-start: auto; justify-content: flex-end; - gap: deprecated.$s-6; + gap: px2rem(6); } .edit-theme-footer { @@ -97,18 +114,19 @@ .create-theme-wrapper { display: flex; flex-direction: column; - gap: deprecated.$s-24; + gap: var(--sp-xxl); } .close-btn { position: absolute; - top: deprecated.$s-8; - right: deprecated.$s-6; + inset-block-start: var(--sp-s); + inset-inline-end: px2rem(6); } .theme-group-label { color: var(--color-foreground-secondary); - margin: 0 0 deprecated.$s-12 0; + margin-block: 0 var(--sp-m); + margin-inline: 0; padding: 0; } @@ -116,7 +134,7 @@ display: flex; align-items: center; justify-content: flex-start; - gap: deprecated.$s-4; + gap: var(--sp-xs); } .group-title-icon { @@ -124,34 +142,37 @@ } .group-title-name { + @include textEllipsis; + flex-grow: 1; - @include deprecated.textEllipsis; } .theme-group-rows-wrapper { display: flex; flex-direction: column; - gap: deprecated.$s-6; + gap: px2rem(6); margin: 0; } .theme-group-wrapper { display: flex; flex-direction: column; - margin-block-start: deprecated.$s-6; + margin-block-start: px2rem(6); overflow-y: auto; - gap: deprecated.$s-32; + gap: var(--sp-xxxl); + max-block-size: calc(100dvh - #{px2rem(448)}); } .theme-row { align-items: center; display: flex; justify-content: space-between; - gap: deprecated.$s-16; + gap: var(--sp-l); } .theme-name-row { - @include deprecated.textEllipsis; + @include textEllipsis; + flex-grow: 1; } @@ -162,13 +183,13 @@ .theme-actions-row { align-items: center; display: flex; - gap: deprecated.$s-6; + gap: px2rem(6); flex-shrink: 0; } .sets-count-button { - padding: deprecated.$s-6; - padding-left: deprecated.$s-12; + padding: px2rem(6); + padding-inline-start: var(--sp-m); } .label-wrapper { @@ -181,32 +202,32 @@ .edit-theme-wrapper { display: flex; flex-direction: column; - gap: deprecated.$s-24; + gap: var(--sp-xxl); inline-size: 100%; } .sets-list-wrapper { - border: deprecated.$s-1 solid color-mix(in hsl, var(--color-foreground-secondary) 30%, transparent); - border-radius: deprecated.$s-8; + border: $b-1 solid color-mix(in hsl, var(--color-foreground-secondary) 30%, transparent); + border-radius: $br-8; overflow-y: auto; - max-height: deprecated.$s-452; + max-block-size: px2rem(452); } .sets-count-empty-button { text-transform: lowercase; - padding: deprecated.$s-6; - padding-left: deprecated.$s-12; + padding: px2rem(6); + padding-inline-start: var(--sp-m); } .group-input-wrapper { position: relative; display: flex; flex-direction: column; - gap: deprecated.$s-4; + gap: var(--sp-xs); } .edit-theme-inputs-wrapper { display: grid; grid-template-columns: 0.6fr 1fr; - gap: deprecated.$s-12; + gap: var(--sp-m); } From cfb076dd61eef4d8a98d10c6f36fec3605afaa9d Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 24 Apr 2026 11:45:36 +0200 Subject: [PATCH 4/5] :books: Update AGENTS.md with common github operations --- AGENTS.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index bcb947da47..842cd15022 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -32,6 +32,36 @@ precision while maintaining a strong focus on maintainability and performance. 5. When searching code, prefer `ripgrep` (`rg`) over `grep` — it respects `.gitignore` by default. +## GitHub Operations + +To obtain the list of repository members/collaborators: + +```bash +gh api repos/:owner/:repo/collaborators --paginate --jq '.[].login' +``` + +To obtain the list of open PRs authored by members: + +```bash +MEMBERS=$(gh api repos/:owner/:repo/collaborators --paginate --jq '.[].login' | tr '\n' '|' | sed 's/|$//') +gh pr list --state open --limit 200 --json author,title,number | jq -r --arg members "$MEMBERS" ' + ($members | split("|")) as $m | + .[] | select(.author.login as $a | $m | index($a)) | + "\(.number)\t\(.author.login)\t\(.title)" +' +``` + +To obtain the list of open PRs from external contributors (non-members): + +```bash +MEMBERS=$(gh api repos/:owner/:repo/collaborators --paginate --jq '.[].login' | tr '\n' '|' | sed 's/|$//') +gh pr list --state open --limit 200 --json author,title,number | jq -r --arg members "$MEMBERS" ' + ($members | split("|")) as $m | + .[] | select(.author.login as $a | $m | index($a) | not) | + "\(.number)\t\(.author.login)\t\(.title)" +' +``` + ## Architecture Overview Penpot is an open-source design tool composed of several modules: From d380efdb0cdf4cb39a514c842240d13d070821ce Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 24 Apr 2026 14:07:51 +0200 Subject: [PATCH 5/5] :arrow_up: Update devenv dependencies (#9142) * :arrow_up: Update devenv dependencies * :sparkles: Fix formatting issues * :paperclip: Fix linter issues --- backend/src/app/binfile/v1.clj | 2 +- backend/src/app/db.clj | 2 +- backend/src/app/email.clj | 6 +++--- backend/src/app/media.clj | 2 +- backend/src/app/metrics.clj | 4 ++-- backend/src/app/redis.clj | 20 ++++++++++---------- backend/src/app/storage/s3.clj | 14 +++++++------- common/src/app/common/fressian.clj | 6 +++--- common/src/app/common/generic_pool.clj | 6 +++--- docker/devenv/Dockerfile | 20 ++++++++++---------- frontend/src/app/render.cljs | 3 --- 11 files changed, 41 insertions(+), 44 deletions(-) diff --git a/backend/src/app/binfile/v1.clj b/backend/src/app/binfile/v1.clj index 04b390bb99..75f6f36994 100644 --- a/backend/src/app/binfile/v1.clj +++ b/backend/src/app/binfile/v1.clj @@ -40,8 +40,8 @@ [promesa.util :as pu] [yetti.adapter :as yt]) (:import - com.github.luben.zstd.ZstdIOException com.github.luben.zstd.ZstdInputStream + com.github.luben.zstd.ZstdIOException com.github.luben.zstd.ZstdOutputStream java.io.DataInputStream java.io.DataOutputStream diff --git a/backend/src/app/db.clj b/backend/src/app/db.clj index b00f84e3e2..c23ea07524 100644 --- a/backend/src/app/db.clj +++ b/backend/src/app/db.clj @@ -36,11 +36,11 @@ java.sql.Connection java.sql.PreparedStatement java.sql.Savepoint - org.postgresql.PGConnection org.postgresql.geometric.PGpoint org.postgresql.jdbc.PgArray org.postgresql.largeobject.LargeObject org.postgresql.largeobject.LargeObjectManager + org.postgresql.PGConnection org.postgresql.util.PGInterval org.postgresql.util.PGobject)) diff --git a/backend/src/app/email.clj b/backend/src/app/email.clj index 44d5cd7e67..b42206dc93 100644 --- a/backend/src/app/email.clj +++ b/backend/src/app/email.clj @@ -22,13 +22,13 @@ [cuerdas.core :as str] [integrant.core :as ig]) (:import - jakarta.mail.Message$RecipientType - jakarta.mail.Session - jakarta.mail.Transport jakarta.mail.internet.InternetAddress jakarta.mail.internet.MimeBodyPart jakarta.mail.internet.MimeMessage jakarta.mail.internet.MimeMultipart + jakarta.mail.Message$RecipientType + jakarta.mail.Session + jakarta.mail.Transport java.util.Properties)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/backend/src/app/media.clj b/backend/src/app/media.clj index d54f19ab10..863d2e9df2 100644 --- a/backend/src/app/media.clj +++ b/backend/src/app/media.clj @@ -31,8 +31,8 @@ (:import clojure.lang.XMLHandler java.io.InputStream - javax.xml.XMLConstants javax.xml.parsers.SAXParserFactory + javax.xml.XMLConstants org.apache.commons.io.IOUtils org.im4java.core.ConvertCmd org.im4java.core.IMOperation)) diff --git a/backend/src/app/metrics.clj b/backend/src/app/metrics.clj index 1c7456b7ab..a1f816a304 100644 --- a/backend/src/app/metrics.clj +++ b/backend/src/app/metrics.clj @@ -15,16 +15,16 @@ io.prometheus.client.CollectorRegistry io.prometheus.client.Counter io.prometheus.client.Counter$Child + io.prometheus.client.exporter.common.TextFormat io.prometheus.client.Gauge io.prometheus.client.Gauge$Child io.prometheus.client.Histogram io.prometheus.client.Histogram$Child + io.prometheus.client.hotspot.DefaultExports io.prometheus.client.SimpleCollector io.prometheus.client.Summary io.prometheus.client.Summary$Builder io.prometheus.client.Summary$Child - io.prometheus.client.exporter.common.TextFormat - io.prometheus.client.hotspot.DefaultExports java.io.StringWriter)) (set! *warn-on-reflection* true) diff --git a/backend/src/app/redis.clj b/backend/src/app/redis.clj index 96e6b07be5..dc1bff9669 100644 --- a/backend/src/app/redis.clj +++ b/backend/src/app/redis.clj @@ -24,28 +24,28 @@ [integrant.core :as ig]) (:import clojure.lang.MapEntry - io.lettuce.core.KeyValue - io.lettuce.core.RedisClient - io.lettuce.core.RedisCommandInterruptedException - io.lettuce.core.RedisCommandTimeoutException - io.lettuce.core.RedisException - io.lettuce.core.RedisURI - io.lettuce.core.ScriptOutputType - io.lettuce.core.SetArgs io.lettuce.core.api.StatefulRedisConnection io.lettuce.core.api.sync.RedisCommands io.lettuce.core.api.sync.RedisScriptingCommands io.lettuce.core.codec.RedisCodec io.lettuce.core.codec.StringCodec + io.lettuce.core.KeyValue + io.lettuce.core.pubsub.api.sync.RedisPubSubCommands io.lettuce.core.pubsub.RedisPubSubListener io.lettuce.core.pubsub.StatefulRedisPubSubConnection - io.lettuce.core.pubsub.api.sync.RedisPubSubCommands + io.lettuce.core.RedisClient + io.lettuce.core.RedisCommandInterruptedException + io.lettuce.core.RedisCommandTimeoutException + io.lettuce.core.RedisException + io.lettuce.core.RedisURI io.lettuce.core.resource.ClientResources io.lettuce.core.resource.DefaultClientResources + io.lettuce.core.ScriptOutputType + io.lettuce.core.SetArgs io.netty.channel.nio.NioEventLoopGroup + io.netty.util.concurrent.EventExecutorGroup io.netty.util.HashedWheelTimer io.netty.util.Timer - io.netty.util.concurrent.EventExecutorGroup java.lang.AutoCloseable java.time.Duration)) diff --git a/backend/src/app/storage/s3.clj b/backend/src/app/storage/s3.clj index ef56e8a9b4..9322de70e6 100644 --- a/backend/src/app/storage/s3.clj +++ b/backend/src/app/storage/s3.clj @@ -30,21 +30,18 @@ java.nio.file.Path java.time.Duration java.util.Collection - java.util.Optional java.util.concurrent.atomic.AtomicLong + java.util.Optional org.reactivestreams.Subscriber software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider - software.amazon.awssdk.core.ResponseBytes software.amazon.awssdk.core.async.AsyncRequestBody software.amazon.awssdk.core.async.AsyncResponseTransformer software.amazon.awssdk.core.async.BlockingInputStreamAsyncRequestBody software.amazon.awssdk.core.client.config.ClientAsyncConfiguration + software.amazon.awssdk.core.ResponseBytes software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient software.amazon.awssdk.http.nio.netty.SdkEventLoopGroup software.amazon.awssdk.regions.Region - software.amazon.awssdk.services.s3.S3AsyncClient - software.amazon.awssdk.services.s3.S3AsyncClientBuilder - software.amazon.awssdk.services.s3.S3Configuration software.amazon.awssdk.services.s3.model.Delete software.amazon.awssdk.services.s3.model.DeleteObjectRequest software.amazon.awssdk.services.s3.model.DeleteObjectsRequest @@ -54,9 +51,12 @@ software.amazon.awssdk.services.s3.model.ObjectIdentifier software.amazon.awssdk.services.s3.model.PutObjectRequest software.amazon.awssdk.services.s3.model.S3Error - software.amazon.awssdk.services.s3.presigner.S3Presigner software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest - software.amazon.awssdk.services.s3.presigner.model.PresignedGetObjectRequest)) + software.amazon.awssdk.services.s3.presigner.model.PresignedGetObjectRequest + software.amazon.awssdk.services.s3.presigner.S3Presigner + software.amazon.awssdk.services.s3.S3AsyncClient + software.amazon.awssdk.services.s3.S3AsyncClientBuilder + software.amazon.awssdk.services.s3.S3Configuration)) (def ^:private max-retries "A maximum number of retries on internal operations" diff --git a/common/src/app/common/fressian.clj b/common/src/app/common/fressian.clj index 7e35f3116e..dacb12e395 100644 --- a/common/src/app/common/fressian.clj +++ b/common/src/app/common/fressian.clj @@ -17,11 +17,11 @@ java.util.List linked.map.LinkedMap linked.set.LinkedSet + org.fressian.handlers.ReadHandler + org.fressian.handlers.WriteHandler org.fressian.Reader org.fressian.StreamingWriter - org.fressian.Writer - org.fressian.handlers.ReadHandler - org.fressian.handlers.WriteHandler)) + org.fressian.Writer)) (set! *warn-on-reflection* true) diff --git a/common/src/app/common/generic_pool.clj b/common/src/app/common/generic_pool.clj index bccf0b06ec..950506dc17 100644 --- a/common/src/app/common/generic_pool.clj +++ b/common/src/app/common/generic_pool.clj @@ -8,11 +8,11 @@ (:refer-clojure :exclude [get]) (:import java.lang.AutoCloseable + org.apache.commons.pool2.impl.DefaultPooledObject + org.apache.commons.pool2.impl.SoftReferenceObjectPool org.apache.commons.pool2.ObjectPool org.apache.commons.pool2.PooledObject - org.apache.commons.pool2.PooledObjectFactory - org.apache.commons.pool2.impl.DefaultPooledObject - org.apache.commons.pool2.impl.SoftReferenceObjectPool)) + org.apache.commons.pool2.PooledObjectFactory)) (defn pool? [o] diff --git a/docker/devenv/Dockerfile b/docker/devenv/Dockerfile index 07fbab0bb4..c9c78b9266 100644 --- a/docker/devenv/Dockerfile +++ b/docker/devenv/Dockerfile @@ -32,7 +32,7 @@ RUN set -ex; \ FROM base AS setup-node -ENV NODE_VERSION=v22.22.0 \ +ENV NODE_VERSION=v24.15.0 \ PATH=/opt/node/bin:$PATH RUN set -eux; \ @@ -67,7 +67,7 @@ RUN set -eux; \ FROM base AS setup-caddy -ENV CADDY_VERSION=2.10.2 +ENV CADDY_VERSION=2.11.2 RUN set -eux; \ ARCH="$(dpkg --print-architecture)"; \ @@ -99,18 +99,18 @@ RUN set -eux; \ FROM base AS setup-jvm # https://clojure.org/releases/tools -ENV CLOJURE_VERSION=1.12.4.1602 +ENV CLOJURE_VERSION=1.12.4.1618 RUN set -eux; \ ARCH="$(dpkg --print-architecture)"; \ case "${ARCH}" in \ aarch64|arm64) \ - ESUM='9903c6b19183a33725ca1dfdae5b72400c9d00995c76fafc4a0d31c5152f33f7'; \ - BINARY_URL='https://cdn.azul.com/zulu/bin/zulu25.32.21-ca-jdk25.0.2-linux_aarch64.tar.gz'; \ + ESUM='cc1b459dc442d7422b46a3b5fe52acaea54879fa7913e29a05650cef54687f5f'; \ + BINARY_URL='https://cdn.azul.com/zulu/bin/zulu26.30.11-ca-jdk26.0.1-linux_aarch64.tar.gz'; \ ;; \ amd64|x86_64) \ - ESUM='946ad9766d98fc6ab495a1a120072197db54997f6925fb96680f1ecd5591db4e'; \ - BINARY_URL='https://cdn.azul.com/zulu/bin/zulu25.32.21-ca-jdk25.0.2-linux_x64.tar.gz'; \ + ESUM='7d6663ea8d4298df65de065e32f9f449745ff607d30ba5d13777cb92e9d4613d'; \ + BINARY_URL='https://cdn.azul.com/zulu/bin/zulu26.30.11-ca-jdk26.0.1-linux_x64.tar.gz'; \ ;; \ *) \ echo "Unsupported arch: ${ARCH}"; \ @@ -181,10 +181,10 @@ RUN set -eux; \ FROM base AS setup-utils -ENV CLJKONDO_VERSION=2026.01.19 \ +ENV CLJKONDO_VERSION=2026.04.15 \ BABASHKA_VERSION=1.12.208 \ - CLJFMT_VERSION=0.15.6 \ - PIXI_VERSION=0.63.2 + CLJFMT_VERSION=0.16.4 \ + PIXI_VERSION=0.67.2 RUN set -ex; \ ARCH="$(dpkg --print-architecture)"; \ diff --git a/frontend/src/app/render.cljs b/frontend/src/app/render.cljs index 642cd0a11c..60f6ebb255 100644 --- a/frontend/src/app/render.cljs +++ b/frontend/src/app/render.cljs @@ -278,9 +278,6 @@ (let [el (dom/get-element "app")] (mf/create-root el))) -(declare ^:private render-single-object) -(declare ^:private render-components) -(declare ^:private render-objects) (defn- parse-params [loc]