From 1eb3fc7719f8eab24057b2c1aacb6a5ed8ab1725 Mon Sep 17 00:00:00 2001 From: Dan Webb Date: Mon, 9 Feb 2026 21:47:55 +0000 Subject: [PATCH 1/5] fix: redesign mobile hamburger menu as slide-out drawer - Replace centered dialog with left-side slide-out drawer (80vw, max 300px) - Add semi-transparent backdrop with click-to-dismiss - Add Escape key dismissal via Stimulus controller - Add proper aria-modal and aria-label for accessibility - Add CSS transform-based slide animation (300ms ease-in-out) - Touch targets meet WCAG 2.2 SC 2.5.8 minimum (24px) - Add 7 new system specs covering drawer behavior - Closes med-tracker-9fr9 --- app/components/ruby_ui/sheet/sheet_content.rb | 35 +++++--- .../ruby_ui/sheet_content_controller.js | 26 +++++- .../controllers/ruby_ui/sheet_controller.js | 37 ++++---- .../mobile-nav-after-escape.png | Bin 0 -> 19888 bytes .../post-implementation/mobile-nav-closed.png | Bin 0 -> 23979 bytes .../mobile-nav-drawer-open.png | Bin 0 -> 19790 bytes spec/system/mobile_navigation_spec.rb | 81 ++++++++++++++++++ 7 files changed, 151 insertions(+), 28 deletions(-) create mode 100644 doc/screenshots/post-implementation/mobile-nav-after-escape.png create mode 100644 doc/screenshots/post-implementation/mobile-nav-closed.png create mode 100644 doc/screenshots/post-implementation/mobile-nav-drawer-open.png diff --git a/app/components/ruby_ui/sheet/sheet_content.rb b/app/components/ruby_ui/sheet/sheet_content.rb index 3e18e970..4a82f0ee 100644 --- a/app/components/ruby_ui/sheet/sheet_content.rb +++ b/app/components/ruby_ui/sheet/sheet_content.rb @@ -62,10 +62,11 @@ def close_button def background div( - data_state: 'open', - class: 'fixed inset-0 z-50 bg-black/80 backdrop-blur-sm data-[state=open]:animate-in', + data_testid: 'drawer-backdrop', + data_action: 'click->ruby-ui--sheet-content#close', + class: 'fixed inset-0 z-50 bg-black/80 backdrop-blur-sm transition-opacity duration-300 ' \ + 'data-[state=open]:opacity-100 data-[state=closed]:opacity-0', style: 'pointer-events:auto', - data_aria_hidden: 'true', aria_hidden: 'true' ) end @@ -73,20 +74,30 @@ def background def container(&) div( role: 'dialog', - data_state: 'open', - class: 'flex flex-col fixed left-[50%] top-[50%] z-50 w-full max-w-lg max-h-screen overflow-y-auto translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 sm:rounded-lg md:w-full', + aria_modal: 'true', + aria_label: 'Navigation menu', + tabindex: '-1', + class: [ + 'flex flex-col fixed z-50 h-full w-[80vw] max-w-[300px] overflow-y-auto bg-background p-6 shadow-lg transition-transform duration-300 ease-in-out', + 'data-[state=open]:translate-x-0', + side_transform_class + ], style: 'pointer-events:auto', & ) end - def backdrop - div( - data_state: 'open', - data_action: 'click->ruby-ui--sheet-content#close', - class: - 'fixed pointer-events-auto inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0' - ) + def side_transform_class + case @side + when :left + 'top-0 left-0 border-r data-[state=closed]:-translate-x-full' + when :right + 'top-0 right-0 border-l data-[state=closed]:translate-x-full' + when :top + 'top-0 left-0 w-full h-auto border-b data-[state=closed]:-translate-y-full' + when :bottom + 'bottom-0 left-0 w-full h-auto border-t data-[state=closed]:translate-y-full' + end end end end diff --git a/app/javascript/controllers/ruby_ui/sheet_content_controller.js b/app/javascript/controllers/ruby_ui/sheet_content_controller.js index 8df0712b..cc860b3d 100644 --- a/app/javascript/controllers/ruby_ui/sheet_content_controller.js +++ b/app/javascript/controllers/ruby_ui/sheet_content_controller.js @@ -1,7 +1,31 @@ import { Controller } from "@hotwired/stimulus" export default class extends Controller { + connect() { + this.handleKeydown = this.handleKeydown.bind(this) + document.addEventListener('keydown', this.handleKeydown) + } + + disconnect() { + document.removeEventListener('keydown', this.handleKeydown) + } + + handleKeydown(event) { + if (event.key === 'Escape') { + this.close() + } + } + close() { - this.element.remove() + const backdrop = this.element.querySelector('[data-testid="drawer-backdrop"]') + const panel = this.element.querySelector('[role="dialog"]') + + if (backdrop) backdrop.setAttribute('data-state', 'closed') + if (panel) panel.setAttribute('data-state', 'closed') + + const duration = 300 + setTimeout(() => { + this.element.remove() + }, duration) } } diff --git a/app/javascript/controllers/ruby_ui/sheet_controller.js b/app/javascript/controllers/ruby_ui/sheet_controller.js index d4f83808..dc420195 100644 --- a/app/javascript/controllers/ruby_ui/sheet_controller.js +++ b/app/javascript/controllers/ruby_ui/sheet_controller.js @@ -4,24 +4,31 @@ export default class extends Controller { static targets = ["content"] open() { - // Insert the sheet content into the body - document.body.insertAdjacentHTML("beforeend", this.contentTarget.innerHTML) + const wrapper = document.createElement("div") + wrapper.setAttribute("data-controller", "ruby-ui--sheet-content") + wrapper.style.cssText = "position:fixed;inset:0;z-index:50;pointer-events:none;" + wrapper.innerHTML = this.contentTarget.innerHTML + document.body.appendChild(wrapper) - // Get the newly inserted sheet content - const sheetContent = document.body.lastElementChild - const sheetPanel = sheetContent.querySelector('[data-state]') + const backdrop = wrapper.querySelector('[data-testid="drawer-backdrop"]') + const panel = wrapper.querySelector('[role="dialog"]') - if (sheetPanel) { - // Start with closed state - sheetPanel.setAttribute('data-state', 'closed') - - // Force a reflow to ensure the closed state is applied - sheetPanel.offsetHeight + if (backdrop) { + backdrop.setAttribute('data-state', 'closed') + backdrop.offsetHeight + } - // Trigger the animation by changing to open state - requestAnimationFrame(() => { - sheetPanel.setAttribute('data-state', 'open') - }) + if (panel) { + panel.setAttribute('data-state', 'closed') + panel.offsetHeight } + + requestAnimationFrame(() => { + if (backdrop) backdrop.setAttribute('data-state', 'open') + if (panel) { + panel.setAttribute('data-state', 'open') + panel.focus() + } + }) } } diff --git a/doc/screenshots/post-implementation/mobile-nav-after-escape.png b/doc/screenshots/post-implementation/mobile-nav-after-escape.png new file mode 100644 index 0000000000000000000000000000000000000000..6b9a12e985a0c1e9598bad504d1a90167be15ee1 GIT binary patch literal 19888 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 literal 0 HcmV?d00001 diff --git a/doc/screenshots/post-implementation/mobile-nav-closed.png b/doc/screenshots/post-implementation/mobile-nav-closed.png new file mode 100644 index 0000000000000000000000000000000000000000..6a77f7d4cd7ae0d5467ffecc9caee54794cd1cfb GIT binary patch literal 23979 zcmce;1yCJPv@ICio#5_n!QC}z2o~Jk-R0sA!95TN?ry=|-QC?Crt{vsnyRUqnm1pD zqJX-$`<~O?`|Q2e+UpRmq#%U^j|czh(pZLpTOKceFD#b1qWUU7}Xj3^a=Ho zjJSxZd**2tj63G{hkiRxMcDR-bw24NCh+N2*>7m#5)$eDVc@^Ov6SMFiD9LabPFEV zy)HQ5;Ev8dOfPbt_E+S)Z3oxZC@wCR%yRhL&g)v8)_D$A(=-nrAKgV@Nr&yRK&Zda zOAtxL8C7vb!?gaefl%v}OkhbZ^M+AHXGN1pL4Shj#9);XzK5Xx!up>&P^NiU^^ell za1uQhqe`9mR3fz^yr{HfV8_4Fkza+VM8i}LN7^#qU}DQP+F9+gGjn`re`sV8Q^|Y1 zQsl~os(q(R!2lJA5J)T^Gz#sT4r^lNNXV&YjIY($#AfmxuY{9HWb*lW^q)$MsM`p8 z3`g2fJ|8^{sgu=f)>tDo_#O>&h)6F}2>gla@9tDf*OY;+#yhf%vbcCB=dxXA(jduE z!@#+2Jcq;BVHXZZ+^cm$G2)DMSJG~#muwGvz|aoE7C3s z*lJ$d2b0sY@syY|E$gL*mrBagP^9CF!^e-~=F7_OOiWBVeD&F#_G$Ci&(SO8ytls3 z>@44?^q83|JCiGP8yw#v`esh%E0_>XSMS!q930@L{p;wzK8%?njcy>7z3v`4Y20)` zNag3}D`OB7Kg>*g>3n%t|9P`J^cfYk$z|o7u=Rmi=hCZZ!7A^%`*&$M-#r{WysNA0 z{r&xFhZC`&#)Nth3{LrLcOU(lmk%BR!SzY6-Ea~uE-vm|`N04TGT{L0{zQsbPvO}k zzwh;Jq@qw9U#tKe0!nDp-##&X7}h9mL8@f&KL{6xSXR8o9X8zH#|8tBEoG0&bsbX~wjVg_LiQIr1&8dLB z_>ak+9-s9nnbf_UAruplusIp^hY?ipE>4Me<- z+uePo6M;doM10Z1i;EiGIoxSgLLD7~P}c`j%bg3gkyG%U1cGW z&=eJ8!Jn>4s^DY8P@&z#I>SO+GpbM@nYA=Sj4~R}10jNq;a$IOuN(3 zXb-1aqJ*_^PIT_{o@q`Y+#MIz$5q1#Ys?O_b-NU~{aF|f2YqK}$H#pF?@{efnt3DEWwwICg`SSDz&)O@mH|UAfH}#(9`gAU_ znjs;(Z0)c-)b#IW-NB2jv=bwL>EY^8=@I2jM$(%#cbo!1o`m`*R}KHe|xUNS>}_gVVO zHgZNoJQ1Zw@Ms8sH5ZnzBO@Wrq_dtAJWVV0;d#a=YH`b@99v5}FQTi*Pdid_A8JF*0%{K=vU9?CQ5sPx2 zhql9Ec~E=T`MkIpQoqLb}whi_MrSAX|zignd2 zlr0n0N-c-oD#be_mMVdr2RNYU4d~A_5PGexX>VMtxy;uQ%c}?1Asp*yYu}#=KsG|5 z%?$U=;B%EZy^IUMQt~%xResm0^>*C~e1al%6$|mbfe5jP^BYRxN)gm7y#n%5FZcd| zi5|RKSoN`SNMf~+B1B-7P`9X|(T?qETNa->a?E!OKF~$VzvBO&KmQj&fd4kAaOiNm z$R+`ynoR!3Bt95r00`pqzZ;?ax2N|%dZ3)FDis;o_IkTl;TAc$Iv%c|}lPUXvI zaLQX&goa9G^LwOoSk0IJXpHzw4}UUUYc?U^bw7BWqUX!wd3%_`#AY)5^J-^c#BnU0 z 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�Q2{36nzOk7$LLJeg_QN*=h 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%0Dokmjd zOeb6s=&u5yMaD4G5hCTq)${u|fh|mG{%&q#z15$zirqyi-QL>U{WV-Kts4t_8F*~+ z(YwVaVwsnZJ2ZcDNfK(S_1D85zuSfUjcR7ibTCeVg~yd5IeFaDTR=6YddgpWOziA| z0zq|>My{d~&1=S8^%ak@0q;%TfTmDkgv>vm$!X>r_0Z|HO0l?e4jGymOzZOW_|3Wo zJUolO@s&!lEt`2fS3!+f^;CvG^RqQq$b sr+RYSIXpZZt}h^77L@BGXXhnCybv6vUX@!f20p>lQrEpvs%jPX4+VMz_W%F@ literal 0 HcmV?d00001 diff --git a/doc/screenshots/post-implementation/mobile-nav-drawer-open.png b/doc/screenshots/post-implementation/mobile-nav-drawer-open.png new file mode 100644 index 0000000000000000000000000000000000000000..848414f6a5aa1c5cd71b933b970a5aa142607ee3 GIT binary patch literal 19790 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 24, "Touch target '#{target.text}' height #{height}px < 24px minimum" + end + end + end end From 338149bdeb9bb2c66ff81cda804658e2c9287605 Mon Sep 17 00:00:00 2001 From: Dan Webb Date: Mon, 9 Feb 2026 22:07:42 +0000 Subject: [PATCH 2/5] fix: use hamburgers Spring animated icon and improve drawer UX - Add hamburgers CSS (Spring variant, compiled to plain CSS) - Replace ghost icon button with animated hamburger--spring toggle - Hamburger animates to X when drawer opens, reverses on close - Sheet controller toggles is-active class and aria-expanded - Sheet content controller calls back via Stimulus outlet to reset hamburger - Backdrop click and Escape key both dismiss drawer and reset icon - Prevents double-open with wrapper guard --- app/assets/stylesheets/hamburgers.css | 124 ++++++++++++++++++ app/components/layouts/mobile_menu.rb | 12 +- .../ruby_ui/sheet_content_controller.js | 6 + .../controllers/ruby_ui/sheet_controller.js | 20 +++ app/views/layouts/application.html.erb | 1 + 5 files changed, 160 insertions(+), 3 deletions(-) create mode 100644 app/assets/stylesheets/hamburgers.css diff --git a/app/assets/stylesheets/hamburgers.css b/app/assets/stylesheets/hamburgers.css new file mode 100644 index 00000000..91eab57c --- /dev/null +++ b/app/assets/stylesheets/hamburgers.css @@ -0,0 +1,124 @@ +/*! + * Hamburgers - Spring variant only + * @description Tasty CSS-animated hamburgers + * @author Jonathan Suh @jonsuh + * @site https://jonsuh.com/hamburgers + * @link https://github.com/jonsuh/hamburgers + * @license MIT + * + * Compiled to plain CSS with default variables for use without Sass. + * Layer width: 24px, height: 2px, spacing: 5px (scaled for nav bar) + */ + +.hamburger { + padding: 10px; + display: inline-flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition-property: opacity, filter; + transition-duration: 0.15s; + transition-timing-function: linear; + font: inherit; + color: inherit; + text-transform: none; + background-color: transparent; + border: 0; + margin: 0; + overflow: visible; + min-height: 44px; + min-width: 44px; +} + +.hamburger:hover { + opacity: 0.7; +} + +.hamburger.is-active:hover { + opacity: 0.7; +} + +.hamburger.is-active .hamburger-inner, +.hamburger.is-active .hamburger-inner::before, +.hamburger.is-active .hamburger-inner::after { + background-color: #000; +} + +.hamburger-box { + width: 24px; + height: 14px; /* 2*3 + 5*2 - but with top offset: layer-height*2 + spacing*2 */ + display: inline-block; + position: relative; +} + +.hamburger-inner { + display: block; + top: 50%; + margin-top: -1px; /* layer-height / -2 */ +} + +.hamburger-inner, +.hamburger-inner::before, +.hamburger-inner::after { + width: 24px; + height: 2px; + background-color: #000; + border-radius: 2px; + position: absolute; + transition-property: transform; + transition-duration: 0.15s; + transition-timing-function: ease; +} + +.hamburger-inner::before, +.hamburger-inner::after { + content: ""; + display: block; +} + +.hamburger-inner::before { + top: -7px; /* -(spacing + layer-height) = -(5+2) */ +} + +.hamburger-inner::after { + bottom: -7px; /* -(spacing + layer-height) = -(5+2) */ +} + +/* + * Spring + */ +.hamburger--spring .hamburger-inner { + top: 1px; /* layer-height / 2 */ + transition: background-color 0s 0.13s linear; +} + +.hamburger--spring .hamburger-inner::before { + top: 7px; /* layer-height + spacing = 2 + 5 */ + transition: top 0.1s 0.2s cubic-bezier(0.33333, 0.66667, 0.66667, 1), + transform 0.13s cubic-bezier(0.55, 0.055, 0.675, 0.19); +} + +.hamburger--spring .hamburger-inner::after { + top: 14px; /* (layer-height * 2) + (spacing * 2) = 4 + 10 */ + transition: top 0.2s 0.2s cubic-bezier(0.33333, 0.66667, 0.66667, 1), + transform 0.13s cubic-bezier(0.55, 0.055, 0.675, 0.19); +} + +.hamburger--spring.is-active .hamburger-inner { + transition-delay: 0.22s; + background-color: transparent !important; +} + +.hamburger--spring.is-active .hamburger-inner::before { + top: 0; + transition: top 0.1s 0.15s cubic-bezier(0.33333, 0, 0.66667, 0.33333), + transform 0.13s 0.22s cubic-bezier(0.215, 0.61, 0.355, 1); + transform: translate3d(0, 7px, 0) rotate(45deg); /* spacing + layer-height = 5 + 2 */ +} + +.hamburger--spring.is-active .hamburger-inner::after { + top: 0; + transition: top 0.2s cubic-bezier(0.33333, 0, 0.66667, 0.33333), + transform 0.13s 0.22s cubic-bezier(0.215, 0.61, 0.355, 1); + transform: translate3d(0, 7px, 0) rotate(-45deg); /* spacing + layer-height = 5 + 2 */ +} diff --git a/app/components/layouts/mobile_menu.rb b/app/components/layouts/mobile_menu.rb index 5c205dce..aaac7e69 100644 --- a/app/components/layouts/mobile_menu.rb +++ b/app/components/layouts/mobile_menu.rb @@ -17,12 +17,18 @@ def view_template div(class: 'md:hidden') do render RubyUI::Sheet.new do render RubyUI::SheetTrigger.new do - render RubyUI::Button.new(variant: :ghost, size: :icon, aria: { label: 'Open menu' }) do - render Icons::Menu.new(class: 'h-6 w-6') + button( + type: 'button', + class: 'hamburger hamburger--spring', + aria: { label: 'Open menu', expanded: 'false' } + ) do + span(class: 'hamburger-box') do + span(class: 'hamburger-inner') + end end end - render RubyUI::SheetContent.new(side: :left, class: 'w-[300px] sm:w-[400px]') do + render RubyUI::SheetContent.new(side: :left) do render RubyUI::SheetHeader.new do render(RubyUI::SheetTitle.new { 'MedTracker' }) end diff --git a/app/javascript/controllers/ruby_ui/sheet_content_controller.js b/app/javascript/controllers/ruby_ui/sheet_content_controller.js index cc860b3d..21ffa080 100644 --- a/app/javascript/controllers/ruby_ui/sheet_content_controller.js +++ b/app/javascript/controllers/ruby_ui/sheet_content_controller.js @@ -1,6 +1,8 @@ import { Controller } from "@hotwired/stimulus" export default class extends Controller { + static outlets = ["ruby-ui--sheet"] + connect() { this.handleKeydown = this.handleKeydown.bind(this) document.addEventListener('keydown', this.handleKeydown) @@ -23,6 +25,10 @@ export default class extends Controller { if (backdrop) backdrop.setAttribute('data-state', 'closed') if (panel) panel.setAttribute('data-state', 'closed') + if (this.hasRubyUiSheetOutlet) { + this.rubyUiSheetOutlet.close() + } + const duration = 300 setTimeout(() => { this.element.remove() diff --git a/app/javascript/controllers/ruby_ui/sheet_controller.js b/app/javascript/controllers/ruby_ui/sheet_controller.js index dc420195..a5002f64 100644 --- a/app/javascript/controllers/ruby_ui/sheet_controller.js +++ b/app/javascript/controllers/ruby_ui/sheet_controller.js @@ -4,11 +4,21 @@ export default class extends Controller { static targets = ["content"] open() { + if (this.wrapper) return + + const trigger = this.element.querySelector('.hamburger') + if (trigger) { + trigger.classList.add('is-active') + trigger.setAttribute('aria-expanded', 'true') + } + const wrapper = document.createElement("div") wrapper.setAttribute("data-controller", "ruby-ui--sheet-content") + wrapper.setAttribute("data-ruby-ui--sheet-content-sheet-outlet", `[data-controller="ruby-ui--sheet"]`) wrapper.style.cssText = "position:fixed;inset:0;z-index:50;pointer-events:none;" wrapper.innerHTML = this.contentTarget.innerHTML document.body.appendChild(wrapper) + this.wrapper = wrapper const backdrop = wrapper.querySelector('[data-testid="drawer-backdrop"]') const panel = wrapper.querySelector('[role="dialog"]') @@ -31,4 +41,14 @@ export default class extends Controller { } }) } + + close() { + this.wrapper = null + + const trigger = this.element.querySelector('.hamburger') + if (trigger) { + trigger.classList.remove('is-active') + trigger.setAttribute('aria-expanded', 'false') + } + } } diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 78acf4c9..b5a98687 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -17,6 +17,7 @@ <%= favicon_link_tag "/favicon.svg", rel: "apple-touch-icon", type: "image/svg+xml" %> <%= stylesheet_link_tag "tailwind", "data-turbo-track": "reload" %> <%= stylesheet_link_tag "application", "data-turbo-track": "reload" %> + <%= stylesheet_link_tag "hamburgers", "data-turbo-track": "reload" %> <%= javascript_importmap_tags %> From c304c22754e3133ca1ecd5c35df7e067d0e6c94c Mon Sep 17 00:00:00 2001 From: Dan Webb Date: Mon, 9 Feb 2026 22:27:43 +0000 Subject: [PATCH 3/5] fix: open-close-open bug and hamburger reset on drawer dismiss - Use isConnected guard to allow re-opening after wrapper is removed from DOM - Reset hamburger via direct DOM query instead of broken Stimulus outlet - Call sheetController.close() via getControllerForElementAndIdentifier - Add regression test for open-close-open flow - Add screenshots showing all 4 drawer states --- .../ruby_ui/sheet_content_controller.js | 14 ++++++++++---- .../controllers/ruby_ui/sheet_controller.js | 4 ++-- .../01-mobile-nav-closed.png | Bin 0 -> 24579 bytes .../02-mobile-drawer-open.png | Bin 0 -> 16702 bytes .../03-mobile-drawer-dismissed.png | Bin 0 -> 24584 bytes .../04-mobile-drawer-reopened.png | Bin 0 -> 16702 bytes spec/system/mobile_navigation_spec.rb | 14 ++++++++++++++ 7 files changed, 26 insertions(+), 6 deletions(-) create mode 100644 doc/screenshots/post-implementation/01-mobile-nav-closed.png create mode 100644 doc/screenshots/post-implementation/02-mobile-drawer-open.png create mode 100644 doc/screenshots/post-implementation/03-mobile-drawer-dismissed.png create mode 100644 doc/screenshots/post-implementation/04-mobile-drawer-reopened.png diff --git a/app/javascript/controllers/ruby_ui/sheet_content_controller.js b/app/javascript/controllers/ruby_ui/sheet_content_controller.js index 21ffa080..bea3fe15 100644 --- a/app/javascript/controllers/ruby_ui/sheet_content_controller.js +++ b/app/javascript/controllers/ruby_ui/sheet_content_controller.js @@ -1,8 +1,6 @@ import { Controller } from "@hotwired/stimulus" export default class extends Controller { - static outlets = ["ruby-ui--sheet"] - connect() { this.handleKeydown = this.handleKeydown.bind(this) document.addEventListener('keydown', this.handleKeydown) @@ -25,10 +23,18 @@ export default class extends Controller { if (backdrop) backdrop.setAttribute('data-state', 'closed') if (panel) panel.setAttribute('data-state', 'closed') - if (this.hasRubyUiSheetOutlet) { - this.rubyUiSheetOutlet.close() + const trigger = document.querySelector('.hamburger.is-active') + if (trigger) { + trigger.classList.remove('is-active') + trigger.setAttribute('aria-expanded', 'false') } + const sheetController = this.application.getControllerForElementAndIdentifier( + document.querySelector('[data-controller="ruby-ui--sheet"]'), + 'ruby-ui--sheet' + ) + if (sheetController) sheetController.close() + const duration = 300 setTimeout(() => { this.element.remove() diff --git a/app/javascript/controllers/ruby_ui/sheet_controller.js b/app/javascript/controllers/ruby_ui/sheet_controller.js index a5002f64..de900a3b 100644 --- a/app/javascript/controllers/ruby_ui/sheet_controller.js +++ b/app/javascript/controllers/ruby_ui/sheet_controller.js @@ -4,7 +4,7 @@ export default class extends Controller { static targets = ["content"] open() { - if (this.wrapper) return + if (this.wrapper && this.wrapper.isConnected) return const trigger = this.element.querySelector('.hamburger') if (trigger) { @@ -14,7 +14,7 @@ export default class extends Controller { const wrapper = document.createElement("div") wrapper.setAttribute("data-controller", "ruby-ui--sheet-content") - wrapper.setAttribute("data-ruby-ui--sheet-content-sheet-outlet", `[data-controller="ruby-ui--sheet"]`) + wrapper.setAttribute("data-ruby-ui--sheet-content-sheet-id", this.element.id || "") wrapper.style.cssText = "position:fixed;inset:0;z-index:50;pointer-events:none;" wrapper.innerHTML = this.contentTarget.innerHTML document.body.appendChild(wrapper) diff --git a/doc/screenshots/post-implementation/01-mobile-nav-closed.png b/doc/screenshots/post-implementation/01-mobile-nav-closed.png new file mode 100644 index 0000000000000000000000000000000000000000..a15aae0c5d3ad7536eaa4d561c13a1b4b36832c6 GIT binary patch literal 24579 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 literal 0 HcmV?d00001 diff --git a/doc/screenshots/post-implementation/03-mobile-drawer-dismissed.png b/doc/screenshots/post-implementation/03-mobile-drawer-dismissed.png new file mode 100644 index 0000000000000000000000000000000000000000..10a5ec5a4dbb6cd10683bde8ca0340bed4eb219e GIT binary patch literal 24584 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 literal 0 HcmV?d00001 diff --git a/spec/system/mobile_navigation_spec.rb b/spec/system/mobile_navigation_spec.rb index 1314dda3..aa842f98 100644 --- a/spec/system/mobile_navigation_spec.rb +++ b/spec/system/mobile_navigation_spec.rb @@ -115,6 +115,20 @@ expect(drawer[:'aria-label']).to be_present end + scenario 'Drawer can be reopened after dismissal' do + page.current_window.resize_to(375, 667) + visit root_path + + find('button[aria-label="Open menu"]').click + expect(page).to have_css('[role="dialog"]') + + find('body').send_keys(:escape) + expect(page).to have_no_css('[role="dialog"]') + + find('button[aria-label="Open menu"]').click + expect(page).to have_css('[role="dialog"]') + end + scenario 'Touch targets in drawer meet WCAG minimum size' do page.current_window.resize_to(375, 667) visit root_path From c5cf5481cdc3e09f609dc94de07a74c2fb723a90 Mon Sep 17 00:00:00 2001 From: Dan Webb Date: Mon, 9 Feb 2026 22:42:11 +0000 Subject: [PATCH 4/5] feat: add close (X) button to mobile drawer header - Renders X icon button in drawer header next to MedTracker title - 44x44px touch target meets WCAG 2.2 SC 2.5.8 recommended size - aria-label="Close menu" for screen readers - Focus ring for keyboard navigation - Triggers sheet-content#close Stimulus action --- app/components/layouts/mobile_menu.rb | 38 ++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/app/components/layouts/mobile_menu.rb b/app/components/layouts/mobile_menu.rb index aaac7e69..26909925 100644 --- a/app/components/layouts/mobile_menu.rb +++ b/app/components/layouts/mobile_menu.rb @@ -29,8 +29,9 @@ def view_template end render RubyUI::SheetContent.new(side: :left) do - render RubyUI::SheetHeader.new do + render RubyUI::SheetHeader.new(class: 'flex flex-row items-center justify-between') do render(RubyUI::SheetTitle.new { 'MedTracker' }) + close_drawer_button end div(class: 'grid gap-4 py-4') do @@ -47,6 +48,41 @@ def view_template private + def close_drawer_button + button( + type: 'button', + class: 'rounded-sm p-2 opacity-70 ring-offset-background transition-opacity ' \ + 'hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 ' \ + 'min-h-[44px] min-w-[44px] flex items-center justify-center', + data_action: 'click->ruby-ui--sheet-content#close', + aria: { label: 'Close menu' } + ) do + svg( + width: '15', + height: '15', + viewbox: '0 0 15 15', + fill: 'none', + xmlns: 'http://www.w3.org/2000/svg', + class: 'h-4 w-4', + aria_hidden: 'true' + ) do |s| + s.path( + d: 'M11.7816 4.03157C12.0062 3.80702 12.0062 3.44295 11.7816 3.2184C11.5571 2.99385 ' \ + '11.193 2.99385 10.9685 3.2184L7.50005 6.68682L4.03164 3.2184C3.80708 2.99385 ' \ + '3.44301 2.99385 3.21846 3.2184C2.99391 3.44295 2.99391 3.80702 3.21846 4.03157L6.68688 ' \ + '7.49999L3.21846 10.9684C2.99391 11.193 2.99391 11.557 3.21846 11.7816C3.44301 12.0061 ' \ + '3.80708 12.0061 4.03164 11.7816L7.50005 8.31316L10.9685 11.7816C11.193 12.0061 11.5571 ' \ + '12.0061 11.7816 11.7816C12.0062 11.557 12.0062 11.193 11.7816 10.9684L8.31322 ' \ + '7.49999L11.7816 4.03157Z', + fill: 'currentColor', + fill_rule: 'evenodd', + clip_rule: 'evenodd' + ) + end + span(class: 'sr-only') { 'Close menu' } + end + end + def render_navigation_links div(class: 'flex flex-col gap-2') do render RubyUI::Link.new(href: medicines_path, variant: :ghost, size: :xl, From 41868b1481a1645f074425d641166eafc66fe612 Mon Sep 17 00:00:00 2001 From: Dan Webb Date: Mon, 9 Feb 2026 22:43:11 +0000 Subject: [PATCH 5/5] refactor: simplify drawer nav wrapper spacing Remove unnecessary grid gap-4 from single-child wrapper. py-4 provides section separation; inner gap-2 handles item spacing. --- app/components/layouts/mobile_menu.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/layouts/mobile_menu.rb b/app/components/layouts/mobile_menu.rb index 26909925..c8a6e038 100644 --- a/app/components/layouts/mobile_menu.rb +++ b/app/components/layouts/mobile_menu.rb @@ -34,7 +34,7 @@ def view_template close_drawer_button end - div(class: 'grid gap-4 py-4') do + div(class: 'py-4') do render_navigation_links end