From 2172ccfd7888db48c7eb47a2bd92f71ba2452256 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20=C3=81lvarez?= Date: Wed, 1 Oct 2025 17:32:31 +0200 Subject: [PATCH 01/24] Move load-balancer to fizzy-staging-lb-01 --- config/deploy.staging.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/config/deploy.staging.yml b/config/deploy.staging.yml index c0b6502e4..e1ab533ec 100644 --- a/config/deploy.staging.yml +++ b/config/deploy.staging.yml @@ -39,8 +39,7 @@ accessories: load-balancer: image: basecamp/kamal-proxy:lb - roles: - - web + host: fizzy-staging-lb-01 options: publish: - 80:80 From b7b5bcc7b9b6ff7019137704a25be52a574691e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20=C3=81lvarez?= Date: Wed, 1 Oct 2025 19:00:31 +0200 Subject: [PATCH 02/24] Move load-balancer to fizzy-beta-lb-01 --- config/deploy.beta.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/config/deploy.beta.yml b/config/deploy.beta.yml index 9720dd8db..3b56efcfa 100644 --- a/config/deploy.beta.yml +++ b/config/deploy.beta.yml @@ -39,8 +39,7 @@ accessories: load-balancer: image: basecamp/kamal-proxy:lb - roles: - - web + host: fizzy-beta-lb-01 options: publish: - 80:80 From 8062490b93605bd68bc37c473adf2e060589ce48 Mon Sep 17 00:00:00 2001 From: Andy Smith Date: Wed, 1 Oct 2025 13:15:27 -0500 Subject: [PATCH 03/24] Give captions more contrast on gray BG --- app/assets/stylesheets/rich-text-content.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/rich-text-content.css b/app/assets/stylesheets/rich-text-content.css index f73affd41..18641da1a 100644 --- a/app/assets/stylesheets/rich-text-content.css +++ b/app/assets/stylesheets/rich-text-content.css @@ -178,7 +178,7 @@ } .attachment__caption { - color: var(--color-ink-dark); + color: color-mix(in oklch, var(--color-ink) 66%, transparent); font-size: var(--text-small); .input { From 8627f8829f005fcc4a6400daa9009c4a87bea32c Mon Sep 17 00:00:00 2001 From: Jason Zimdars Date: Wed, 1 Oct 2025 13:24:29 -0500 Subject: [PATCH 04/24] Prefer single key hotkeys We'll still support cmd/ctrl + J for legacy muscle memory but new customer should just use `J` --- app/views/filters/menu/_button.html.erb | 2 +- app/views/filters/menu/_shortcut_notice.html.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/filters/menu/_button.html.erb b/app/views/filters/menu/_button.html.erb index b9f2e1835..3324272d3 100644 --- a/app/views/filters/menu/_button.html.erb +++ b/app/views/filters/menu/_button.html.erb @@ -1,6 +1,6 @@ <%= tag.button class:"fizzy-menu-trigger input input--select center flex-inline align-center txt-normal", data: { - action: "click->dialog#open:stop keydown.meta+j@document->hotkey#click keydown.ctrl+j@document->hotkey#click", + action: "click->dialog#open:stop keydown.j@document->hotkey#click keydown.meta+j@document->hotkey#click keydown.ctrl+j@document->hotkey#click", controller: "hotkey" } do %> diff --git a/app/views/filters/menu/_shortcut_notice.html.erb b/app/views/filters/menu/_shortcut_notice.html.erb index f4c28b43f..b594b19a0 100644 --- a/app/views/filters/menu/_shortcut_notice.html.erb +++ b/app/views/filters/menu/_shortcut_notice.html.erb @@ -1,5 +1,5 @@ <% if platform.desktop? %>
- Press <%= hotkey_label(["ctrl", "J"]) -%> anytime to open this, esc to close, to move, enter to navigate, SHIFT+ENTER to select. + Press J anytime to open this, esc to close, to move, enter to navigate, SHIFT+ENTER to select.
<% end %> From ca81e2aa36a74bda0336cd1fa881a09e07f6001b Mon Sep 17 00:00:00 2001 From: Jason Zimdars Date: Wed, 1 Oct 2025 13:31:17 -0500 Subject: [PATCH 05/24] Prevent card bubbles getting clipped in grid layout --- app/assets/stylesheets/card-columns.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/card-columns.css b/app/assets/stylesheets/card-columns.css index b6753394e..f4ff6ac05 100644 --- a/app/assets/stylesheets/card-columns.css +++ b/app/assets/stylesheets/card-columns.css @@ -73,7 +73,7 @@ z-index: 3; } - &:not(.cards--considering, .is-collapsed) { + &:not(.cards--considering, .is-collapsed, .cards--grid) { overflow: clip; } From 3ae82da19ef63cbd5645da1c602766c6d720aa17 Mon Sep 17 00:00:00 2001 From: Jason Zimdars Date: Wed, 1 Oct 2025 13:32:15 -0500 Subject: [PATCH 06/24] No longer needed --- app/views/collections/edit.html.erb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/views/collections/edit.html.erb b/app/views/collections/edit.html.erb index b6b0efe6c..39518d583 100644 --- a/app/views/collections/edit.html.erb +++ b/app/views/collections/edit.html.erb @@ -38,7 +38,6 @@
- <%# render "collections/edit/workflows", collection: @collection %> <%= render "collections/edit/auto_close", collection: @collection %> <%= render "collections/edit/publication", collection: @collection %> <%= render "collections/edit/delete", collection: @collection %> From 935c503ac5acb1e1c4ce7d5e172436a9e57d8544 Mon Sep 17 00:00:00 2001 From: Jason Zimdars Date: Wed, 1 Oct 2025 13:33:38 -0500 Subject: [PATCH 07/24] Replace old link with proper collection path --- app/views/collections/edit.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/collections/edit.html.erb b/app/views/collections/edit.html.erb index 39518d583..f565cc972 100644 --- a/app/views/collections/edit.html.erb +++ b/app/views/collections/edit.html.erb @@ -3,7 +3,7 @@ <% content_for :header do %> <%= render "filters/menu", user_filtering: @user_filtering %>
- <%= link_to cards_path(collection_ids: [ @collection ]), class: "btn borderless txt-medium", data: { controller: "hotkey", action: "keydown.esc@document->hotkey#click" } do %> + <%= link_to @collection, class: "btn borderless txt-medium", data: { controller: "hotkey", action: "keydown.esc@document->hotkey#click" } do %> <%= @collection.name %> From 60a7e21eb2e0c66833f24ef11b9d85665d3b4704 Mon Sep 17 00:00:00 2001 From: Andy Smith Date: Wed, 1 Oct 2025 13:37:05 -0500 Subject: [PATCH 08/24] Position lexxy language picker --- app/assets/stylesheets/lexxy.css | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/lexxy.css b/app/assets/stylesheets/lexxy.css index f2dd41d2e..affd21fef 100644 --- a/app/assets/stylesheets/lexxy.css +++ b/app/assets/stylesheets/lexxy.css @@ -178,11 +178,12 @@ border: 1px solid var(--color-ink-lighter); border-radius: 0.3em; color: var(--color-ink); - font-family: var(--font-mono); + font-family: var(--font-base); font-size: var(--text-x-small); font-weight: 500; + inset-inline-end: 0; line-height: inherit; - margin: 0.3em 0.3em 0 -0.3em; + margin: 0.3em 0.3em 0 0; padding: 0.5em 1.8em 0.5em 1.2em; text-align: start; From e37cbe6d7fe00f52955affc1cc64ae2f2394f163 Mon Sep 17 00:00:00 2001 From: Andy Smith Date: Wed, 1 Oct 2025 14:28:38 -0500 Subject: [PATCH 09/24] Dynamic height for pins based on viewport height --- app/assets/stylesheets/trays.css | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/trays.css b/app/assets/stylesheets/trays.css index 179ac73d4..b024a0412 100644 --- a/app/assets/stylesheets/trays.css +++ b/app/assets/stylesheets/trays.css @@ -345,7 +345,30 @@ } } - &:nth-child(1n + 11) { display: none; } + /* Show 6 max items on smallest devices */ + @media (max-height: 578px) { + &:nth-child(1n + 7) { display: none; } + } + + /* 7 max */ + @media (min-height: 578px) and (max-height: 656px) { + &:nth-child(1n + 8) { display: none; } + } + + /* 8 max */ + @media (min-height: 656px) and (max-height: 734px) { + &:nth-child(1n + 9) { display: none; } + } + + /* 9 max */ + @media (min-height: 734px) and (max-height: 812px) { + &:nth-child(1n + 10) { display: none; } + } + + /* 10 max on larger screens */ + @media (min-height: 812px) { + &:nth-child(1n + 11) { display: none; } + } &:not([aria-selected]) .card__link:focus-visible, .tray__dialog:not([open]) & .card__link:focus-visible { From 80e072f8452ce9705788014012e9bb5ac45fc468 Mon Sep 17 00:00:00 2001 From: Andy Smith Date: Wed, 1 Oct 2025 16:56:55 -0500 Subject: [PATCH 10/24] Use controller to disable empty comment submit --- app/assets/stylesheets/lexxy.css | 6 ------ app/javascript/controllers/form_controller.js | 12 +++++++++++- app/views/cards/comments/_new.html.erb | 4 ++-- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/app/assets/stylesheets/lexxy.css b/app/assets/stylesheets/lexxy.css index affd21fef..63f5f1f14 100644 --- a/app/assets/stylesheets/lexxy.css +++ b/app/assets/stylesheets/lexxy.css @@ -31,12 +31,6 @@ position: absolute; white-space: pre-line; } - - /* Disable the submit button when Lexical is empty */ - + .comment__submit { - opacity: 0.5; - pointer-events: none; - } } } diff --git a/app/javascript/controllers/form_controller.js b/app/javascript/controllers/form_controller.js index 4e59f6055..35aa64139 100644 --- a/app/javascript/controllers/form_controller.js +++ b/app/javascript/controllers/form_controller.js @@ -2,7 +2,7 @@ import { Controller } from "@hotwired/stimulus" import { debounce } from "helpers/timing_helpers"; export default class extends Controller { - static targets = [ "cancel" ] + static targets = [ "cancel", "submit" ] static values = { debounceTimeout: { type: Number, default: 300 } @@ -37,6 +37,16 @@ export default class extends Controller { event.preventDefault() } + disableEmptySubmit(event) { + var value = event.target.value.replace(/<\/?[^>]+(>|$)/g, "") + + if (value) { + this.submitTarget.removeAttribute("disabled") + } else { + this.submitTarget.setAttribute("disabled", true) + } + } + select(event) { event.target.select() } diff --git a/app/views/cards/comments/_new.html.erb b/app/views/cards/comments/_new.html.erb index 7931cd244..4a0452e0d 100644 --- a/app/views/cards/comments/_new.html.erb +++ b/app/views/cards/comments/_new.html.erb @@ -10,10 +10,10 @@ local_save_key_value: "comment-#{card.id}", action: "turbo:submit-end->local-save#submit keydown.ctrl+enter->form#submit:prevent keydown.meta+enter->form#submit:prevent keydown.esc->form#cancel:stop" } do |form| %> <%= form.rich_textarea :body, required: true, placeholder: new_comment_placeholder(card), - data: { local_save_target: "input", action: "lexxy:change->local-save#save turbo:morph-element->local-save#restoreContent" } do %> + data: { local_save_target: "input", action: "lexxy:change->form#disableEmptySubmit lexxy:change->local-save#save turbo:morph-element->local-save#restoreContent" } do %> <%= general_prompts(@card.collection) %> <% end %> - <%= form.button class: "comment__submit btn btn--reversed flex-item-justify-start" do %> + <%= form.button class: "comment__submit btn btn--reversed flex-item-justify-start", data: { form_target: "submit" }, disabled: true do %> Post this comment <% end %> From 0774101b0dd0982b0e5a8ee53a12b3b3fe14c2d6 Mon Sep 17 00:00:00 2001 From: Jorge Manrubia Date: Thu, 2 Oct 2025 09:34:41 +0200 Subject: [PATCH 11/24] Use the new required attribute that now Lexxy supports --- Gemfile.lock | 2 +- app/javascript/controllers/form_controller.js | 10 +++++----- app/views/cards/comments/_new.html.erb | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 91da8a5b6..16dca130d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -359,7 +359,7 @@ GEM logger (~> 1.6) letter_opener (1.10.0) launchy (>= 2.2, < 4) - lexxy (0.1.9.beta) + lexxy (0.1.10.beta) rails (>= 8.0.2) lint_roller (1.1.0) logger (1.7.0) diff --git a/app/javascript/controllers/form_controller.js b/app/javascript/controllers/form_controller.js index 35aa64139..2b30c99b9 100644 --- a/app/javascript/controllers/form_controller.js +++ b/app/javascript/controllers/form_controller.js @@ -1,5 +1,5 @@ import { Controller } from "@hotwired/stimulus" -import { debounce } from "helpers/timing_helpers"; +import { debounce, nextFrame } from "helpers/timing_helpers"; export default class extends Controller { static targets = [ "cancel", "submit" ] @@ -37,13 +37,13 @@ export default class extends Controller { event.preventDefault() } - disableEmptySubmit(event) { - var value = event.target.value.replace(/<\/?[^>]+(>|$)/g, "") + async disableSubmitWhenInvalid(event) { + await nextFrame() - if (value) { + if (this.element.checkValidity()) { this.submitTarget.removeAttribute("disabled") } else { - this.submitTarget.setAttribute("disabled", true) + this.submitTarget.toggleAttribute("disabled", true) } } diff --git a/app/views/cards/comments/_new.html.erb b/app/views/cards/comments/_new.html.erb index 4a0452e0d..015c93a83 100644 --- a/app/views/cards/comments/_new.html.erb +++ b/app/views/cards/comments/_new.html.erb @@ -10,7 +10,7 @@ local_save_key_value: "comment-#{card.id}", action: "turbo:submit-end->local-save#submit keydown.ctrl+enter->form#submit:prevent keydown.meta+enter->form#submit:prevent keydown.esc->form#cancel:stop" } do |form| %> <%= form.rich_textarea :body, required: true, placeholder: new_comment_placeholder(card), - data: { local_save_target: "input", action: "lexxy:change->form#disableEmptySubmit lexxy:change->local-save#save turbo:morph-element->local-save#restoreContent" } do %> + data: { local_save_target: "input", action: "lexxy:change->form#disableSubmitWhenInvalid lexxy:change->local-save#save turbo:morph-element->local-save#restoreContent" } do %> <%= general_prompts(@card.collection) %> <% end %> <%= form.button class: "comment__submit btn btn--reversed flex-item-justify-start", data: { form_target: "submit" }, disabled: true do %> From a198cb1e279bfa13ad5e4285078b3f061d67ac18 Mon Sep 17 00:00:00 2001 From: Jorge Manrubia Date: Thu, 2 Oct 2025 14:04:05 +0200 Subject: [PATCH 12/24] Make permanent to avoid losing menu on page refreshes --- app/views/filters/_menu.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/filters/_menu.html.erb b/app/views/filters/_menu.html.erb index 7b84cdd60..a117bdfa7 100644 --- a/app/views/filters/_menu.html.erb +++ b/app/views/filters/_menu.html.erb @@ -1,4 +1,4 @@ -