From 06370529c66a7f7fba316da98c0293c3c9279d6c Mon Sep 17 00:00:00 2001 From: Brett Ferrante <83841899+findthelorax@users.noreply.github.com> Date: Mon, 20 Apr 2026 09:35:53 -0400 Subject: [PATCH 1/6] Update Docker image references to use repository owner --- .github/workflows/docker-publish.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 600ae67..fe0a4e8 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -15,13 +15,13 @@ jobs: strategy: matrix: include: - - image: ghcr.io/pouzor/homelable-backend + - image: ghcr.io/${{ github.repository_owner }}/homelable-backend dockerfile: Dockerfile.backend build_args: "" - - image: ghcr.io/pouzor/homelable-frontend + - image: ghcr.io/${{ github.repository_owner }}/homelable-frontend dockerfile: Dockerfile.frontend build_args: "" - - image: ghcr.io/pouzor/homelable-frontend-standalone + - image: ghcr.io/${{ github.repository_owner }}/homelable-frontend-standalone dockerfile: Dockerfile.frontend build_args: "VITE_STANDALONE=true" From 31b5bc451523b68f3c6cfbadae34d7309c8af2a3 Mon Sep 17 00:00:00 2001 From: findthelorax Date: Thu, 23 Apr 2026 15:59:46 -0400 Subject: [PATCH 2/6] fixed accessibility and keyboard navigation for edit node and connection modals --- frontend/src/components/modals/EdgeModal.tsx | 12 +++++++++--- frontend/src/components/modals/NodeModal.tsx | 20 ++++++++++++++------ 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/frontend/src/components/modals/EdgeModal.tsx b/frontend/src/components/modals/EdgeModal.tsx index 664b12d..ea6a441 100644 --- a/frontend/src/components/modals/EdgeModal.tsx +++ b/frontend/src/components/modals/EdgeModal.tsx @@ -68,7 +68,7 @@ export function EdgeModal({ open, onClose, onSubmit, onDelete, onClearWaypoints,
set('check_method', v as CheckMethod)}> - + {CHECK_METHOD_LABELS[(form.check_method ?? 'ping') as CheckMethod]} @@ -271,7 +275,7 @@ export function NodeModal({ open, onClose, onSubmit, initial, title = 'Add Node' value={form.parent_id ?? 'none'} onValueChange={(v) => set('parent_id', v === 'none' ? undefined : v)} > - + {form.parent_id ? (filteredParentNodes.find((n) => n.id === form.parent_id)?.label ?? 'None (standalone)') @@ -301,6 +305,8 @@ export function NodeModal({ open, onClose, onSubmit, initial, title = 'Add Node' aria-checked={!!form.container_mode} onClick={() => set('container_mode', !form.container_mode)} className="relative inline-flex h-5 w-9 shrink-0 cursor-pointer rounded-full transition-colors focus:outline-none" + tabIndex={0} + aria-label="Toggle container mode" style={{ background: form.container_mode ? '#ff6e00' : '#30363d' }} > set('bottom_handles', parseInt(v ?? '1', 10))} > - + From 896cd4fa21f482194d8dcbd656e6c04039834297 Mon Sep 17 00:00:00 2001 From: findthelorax Date: Thu, 23 Apr 2026 20:06:10 -0400 Subject: [PATCH 3/6] made a lot of accessibility fixes for the modalsincluding pointers, keyboard navigation and consistent border radius --- .github/workflows/docker-publish.yml | 6 +- frontend/src/components/modals/EdgeModal.tsx | 21 +++--- .../src/components/modals/GroupRectModal.tsx | 23 +++---- frontend/src/components/modals/NodeModal.tsx | 66 ++++++++++++------- .../modals/modal-interactive.module.css | 27 ++++++++ .../src/components/panels/DetailPanel.tsx | 10 +-- frontend/src/components/panels/Sidebar.tsx | 5 +- frontend/src/components/panels/Toolbar.tsx | 20 +++--- frontend/src/components/ui/dialog.tsx | 6 +- 9 files changed, 115 insertions(+), 69 deletions(-) create mode 100644 frontend/src/components/modals/modal-interactive.module.css diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index fe0a4e8..600ae67 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -15,13 +15,13 @@ jobs: strategy: matrix: include: - - image: ghcr.io/${{ github.repository_owner }}/homelable-backend + - image: ghcr.io/pouzor/homelable-backend dockerfile: Dockerfile.backend build_args: "" - - image: ghcr.io/${{ github.repository_owner }}/homelable-frontend + - image: ghcr.io/pouzor/homelable-frontend dockerfile: Dockerfile.frontend build_args: "" - - image: ghcr.io/${{ github.repository_owner }}/homelable-frontend-standalone + - image: ghcr.io/pouzor/homelable-frontend-standalone dockerfile: Dockerfile.frontend build_args: "VITE_STANDALONE=true" diff --git a/frontend/src/components/modals/EdgeModal.tsx b/frontend/src/components/modals/EdgeModal.tsx index ea6a441..ec4fc56 100644 --- a/frontend/src/components/modals/EdgeModal.tsx +++ b/frontend/src/components/modals/EdgeModal.tsx @@ -1,4 +1,5 @@ import { useState } from 'react' +import modalStyles from './modal-interactive.module.css' import { RotateCcw } from 'lucide-react' import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog' import { Button } from '@/components/ui/button' @@ -59,7 +60,7 @@ export function EdgeModal({ open, onClose, onSubmit, onDelete, onClearWaypoints, return ( !o && onClose()}> - + {title} @@ -68,7 +69,7 @@ export function EdgeModal({ open, onClose, onSubmit, onDelete, onClearWaypoints,
set('font', v ?? 'inter')}> - + @@ -162,7 +163,7 @@ export function GroupRectModal({ open, onClose, onSubmit, onDelete, initial, tit type="button" title={value} onClick={() => set('text_position', value)} - className="h-8 rounded text-base transition-colors" + className={`h-8 rounded text-base transition-colors cursor-pointer ${modalStyles['modal-interactive']}`} style={{ background: isSelected ? '#00d4ff22' : '#21262d', border: `1px solid ${isSelected ? '#00d4ff88' : '#30363d'}`, @@ -187,7 +188,7 @@ export function GroupRectModal({ open, onClose, onSubmit, onDelete, initial, tit key={value} type="button" onClick={() => set('label_position', value)} - className="flex items-center justify-center h-8 rounded text-xs transition-colors" + className={`flex items-center justify-center h-8 rounded text-xs transition-colors cursor-pointer ${modalStyles['modal-interactive']}`} style={{ background: isSelected ? '#00d4ff22' : '#21262d', border: `1px solid ${isSelected ? '#00d4ff88' : '#30363d'}`, @@ -248,7 +249,7 @@ export function GroupRectModal({ open, onClose, onSubmit, onDelete, initial, tit key={value} type="button" onClick={() => set('text_size', value)} - className="flex items-center justify-center h-8 rounded transition-colors" + className={`flex items-center justify-center h-8 rounded transition-colors cursor-pointer ${modalStyles['modal-interactive']}`} style={{ background: isSelected ? '#00d4ff22' : '#21262d', border: `1px solid ${isSelected ? '#00d4ff88' : '#30363d'}`, @@ -275,7 +276,7 @@ export function GroupRectModal({ open, onClose, onSubmit, onDelete, initial, tit type="button" title={label} onClick={() => set('border_style', value)} - className="flex flex-col items-center justify-center h-10 rounded text-xs gap-0.5 transition-colors" + className={`flex flex-col items-center justify-center h-10 rounded text-xs gap-0.5 transition-colors cursor-pointer ${modalStyles['modal-interactive']}`} style={{ background: isSelected ? '#00d4ff22' : '#21262d', border: `1px solid ${isSelected ? '#00d4ff88' : '#30363d'}`, @@ -301,7 +302,7 @@ export function GroupRectModal({ open, onClose, onSubmit, onDelete, initial, tit key={value} type="button" onClick={() => set('border_width', value)} - className="flex items-center justify-center h-8 rounded text-xs transition-colors" + className={`flex items-center justify-center h-8 rounded text-xs transition-colors cursor-pointer ${modalStyles['modal-interactive']}`} style={{ background: isSelected ? '#00d4ff22' : '#21262d', border: `1px solid ${isSelected ? '#00d4ff88' : '#30363d'}`, @@ -319,7 +320,7 @@ export function GroupRectModal({ open, onClose, onSubmit, onDelete, initial, tit
set('type', v as NodeType)}> - + {NODE_TYPE_LABELS[(form.type ?? 'server') as NodeType]} @@ -137,7 +138,7 @@ export function NodeModal({ open, onClose, onSubmit, initial, title = 'Add Node'
@@ -237,7 +238,7 @@ export function NodeModal({ open, onClose, onSubmit, initial, title = 'Add Node' value={form.ip ?? ''} onChange={(e) => set('ip', e.target.value)} placeholder="192.168.1.x, 2001:db8::1" - className="bg-[#21262d] border-[#30363d] font-mono text-sm h-8" + className={`bg-[#21262d] border-[#30363d] font-mono text-sm h-8 ${modalStyles['modal-radius']}`} />
@@ -245,7 +246,7 @@ export function NodeModal({ open, onClose, onSubmit, initial, title = 'Add Node'
- - - -