From d090116dd68979be421b01004e1de4972b437d78 Mon Sep 17 00:00:00 2001 From: Dan D Date: Sat, 29 Nov 2025 15:45:56 -0500 Subject: [PATCH 01/49] feat(ui): responsive updates --- packages/ui/package.json | 1 + packages/ui/src/components/ui/sheet.tsx | 2 - packages/ui/src/components/ui/sidebar.tsx | 2 - .../src/lib/components/Sidebar/AppSidebar.tsx | 2 +- packages/web/package.json | 5 + packages/web/src/App.tsx | 58 +- .../src/__mocks__/components/UI/Button.tsx | 2 +- .../src/__mocks__/components/UI/Checkbox.tsx | 2 +- .../web/src/__mocks__/components/UI/Label.tsx | 2 +- .../web/src/__mocks__/components/UI/Link.tsx | 2 +- packages/web/src/components/AppLayout.tsx | 23 + .../src/components/AppSidebar/AppSidebar.tsx | 168 ++++ .../src/components/CommandPalette/index.tsx | 4 +- .../AddConnectionDialog.tsx | 10 +- .../ClientNotificationDialog.tsx | 2 +- .../src/components/Dialog/DialogWrapper.tsx | 6 +- .../src/components/Dialog/ImportDialog.tsx | 12 +- .../components/Dialog/ManagedModeDialog.tsx | 6 +- .../src/components/Dialog/NewDeviceDialog.tsx | 4 +- .../NodeDetailsDialog/NodeDetailsDialog.tsx | 10 +- .../src/components/Dialog/PKIBackupDialog.tsx | 4 +- .../components/Dialog/PkiRegenerateDialog.tsx | 4 +- .../web/src/components/Dialog/QRDialog.tsx | 6 +- .../components/Dialog/RebootDialog.test.tsx | 10 +- .../src/components/Dialog/RebootDialog.tsx | 12 +- .../RefreshKeysDialog/RefreshKeysDialog.tsx | 4 +- .../components/Dialog/RemoveNodeDialog.tsx | 2 +- .../src/components/Dialog/ShutdownDialog.tsx | 4 +- .../UnsafeRolesDialog/UnsafeRolesDialog.tsx | 8 +- .../web/src/components/Form/DynamicForm.tsx | 6 +- .../web/src/components/Form/FormInput.tsx | 2 +- .../components/Form/FormPasswordGenerator.tsx | 2 +- .../web/src/components/Form/FormSelect.tsx | 2 +- .../web/src/components/Form/FormToggle.tsx | 2 +- .../web/src/components/Form/FormWrapper.tsx | 2 +- .../PageComponents/Channels/Channels.tsx | 6 +- .../PageComponents/Map/Markers/NodeMarker.tsx | 4 +- .../PageComponents/Map/Popups/NodeDetail.tsx | 8 +- .../Map/Popups/WaypointDetail.tsx | 2 +- .../PageComponents/Map/Tools/MapLayerTool.tsx | 4 +- .../PageComponents/Messages/ChannelChat.tsx | 4 +- .../Messages/MessageActionsMenu.tsx | 2 +- .../Messages/MessageInput.test.tsx | 4 +- .../PageComponents/Messages/MessageInput.tsx | 4 +- .../PageComponents/Messages/MessageItem.tsx | 4 +- packages/web/src/components/PageLayout.tsx | 6 +- packages/web/src/components/Sidebar.tsx | 8 +- packages/web/src/components/ThemeSwitcher.tsx | 101 -- packages/web/src/components/Toaster.tsx | 2 +- packages/web/src/components/UI/Accordion.tsx | 44 - packages/web/src/components/UI/Avatar.tsx | 112 --- packages/web/src/components/UI/Badge.tsx | 35 - packages/web/src/components/UI/Label.tsx | 20 - packages/web/src/components/UI/Select.tsx | 110 --- packages/web/src/components/UI/Separator.tsx | 28 - packages/web/src/components/UI/Skeleton.tsx | 18 - packages/web/src/components/UI/Switch.tsx | 27 - .../web/src/components/UI/ToggleGroup.tsx | 45 - .../components/UI/Typography/Blockquote.tsx | 9 - .../web/src/components/UI/Typography/Code.tsx | 9 - .../src/components/UI/Typography/Heading.tsx | 30 - .../web/src/components/UI/Typography/Link.tsx | 30 - .../web/src/components/UI/Typography/P.tsx | 10 - .../src/components/UI/Typography/Subtle.tsx | 12 - .../generic/Filter/FilterComponents.tsx | 10 +- .../generic/Filter/FilterControl.tsx | 6 +- packages/web/src/components/ui/Skeleton.tsx | 16 + .../components/ui/Typography/Blockquote.tsx | 11 + .../web/src/components/ui/Typography/Code.tsx | 14 + .../src/components/ui/Typography/Heading.tsx | 22 + .../web/src/components/ui/Typography/Link.tsx | 17 + .../web/src/components/ui/Typography/P.tsx | 11 + .../src/components/ui/Typography/Subtle.tsx | 11 + packages/web/src/components/ui/accordion.tsx | 58 ++ .../AlertDialog.tsx => ui/alert-dialog.tsx} | 2 +- packages/web/src/components/ui/avatar.tsx | 50 + packages/web/src/components/ui/badge.tsx | 36 + .../{UI/Button.tsx => ui/button.tsx} | 0 .../components/{UI/Card.tsx => ui/card.tsx} | 48 +- .../checkbox.test.tsx} | 2 +- .../Checkbox/index.tsx => ui/checkbox.tsx} | 0 .../{UI/Command.tsx => ui/command.tsx} | 2 +- .../{UI/Dialog.tsx => ui/dialog.tsx} | 0 .../DropdownMenu.tsx => ui/dropdown-menu.tsx} | 0 .../{UI/ErrorPage.tsx => ui/error-page.tsx} | 6 +- .../{UI/Footer.tsx => ui/footer.tsx} | 0 .../{UI/Generator.tsx => ui/generator.tsx} | 6 +- .../components/{UI/Input.tsx => ui/input.tsx} | 0 packages/web/src/components/ui/label.tsx | 26 + .../{UI/Menubar.tsx => ui/menubar.tsx} | 0 .../MultiSelect.tsx => ui/multi-select.tsx} | 0 .../{UI/Popover.tsx => ui/popover.tsx} | 0 .../{UI/ScrollArea.tsx => ui/scroll-area.tsx} | 0 packages/web/src/components/ui/select.tsx | 160 ++++ packages/web/src/components/ui/separator.tsx | 26 + packages/web/src/components/ui/sheet.tsx | 140 +++ packages/web/src/components/ui/sidebar.tsx | 716 ++++++++++++++ .../sidebar/sidebar-button.tsx} | 2 +- .../sidebar/sidebar-section.tsx} | 2 +- .../{UI/Slider.tsx => ui/slider.tsx} | 0 .../{UI/Spinner.tsx => ui/spinner.tsx} | 0 packages/web/src/components/ui/switch.tsx | 29 + .../components/{UI/Tabs.tsx => ui/tabs.tsx} | 0 .../components/{UI/Toast.tsx => ui/toast.tsx} | 81 +- .../web/src/components/ui/toggle-group.tsx | 61 ++ packages/web/src/components/ui/toggle.tsx | 45 + .../{UI/Tooltip.tsx => ui/tooltip.tsx} | 17 +- packages/web/src/core/hooks/useIsMobile.ts | 19 + .../src/core/hooks/useKeyBackupReminder.tsx | 2 +- packages/web/src/core/hooks/useToast.test.tsx | 2 +- packages/web/src/core/hooks/useToast.ts | 2 +- packages/web/src/index.css | 286 +++--- packages/web/src/pages/Connections/index.tsx | 12 +- packages/web/src/pages/Messages.tsx | 892 +++++++++++------- packages/web/src/pages/Nodes/index.tsx | 4 +- .../web/src/pages/Settings/DeviceConfig.tsx | 4 +- .../web/src/pages/Settings/ModuleConfig.tsx | 4 +- .../web/src/pages/Settings/RadioConfig.tsx | 4 +- packages/web/src/pages/Settings/index.tsx | 4 +- packages/web/tsconfig.json | 3 +- packages/web/vite.config.ts | 1 + pnpm-lock.yaml | 293 ++++-- 122 files changed, 2788 insertions(+), 1468 deletions(-) create mode 100644 packages/web/src/components/AppLayout.tsx create mode 100644 packages/web/src/components/AppSidebar/AppSidebar.tsx delete mode 100644 packages/web/src/components/ThemeSwitcher.tsx delete mode 100644 packages/web/src/components/UI/Accordion.tsx delete mode 100644 packages/web/src/components/UI/Avatar.tsx delete mode 100644 packages/web/src/components/UI/Badge.tsx delete mode 100644 packages/web/src/components/UI/Label.tsx delete mode 100644 packages/web/src/components/UI/Select.tsx delete mode 100644 packages/web/src/components/UI/Separator.tsx delete mode 100644 packages/web/src/components/UI/Skeleton.tsx delete mode 100644 packages/web/src/components/UI/Switch.tsx delete mode 100644 packages/web/src/components/UI/ToggleGroup.tsx delete mode 100644 packages/web/src/components/UI/Typography/Blockquote.tsx delete mode 100644 packages/web/src/components/UI/Typography/Code.tsx delete mode 100644 packages/web/src/components/UI/Typography/Heading.tsx delete mode 100644 packages/web/src/components/UI/Typography/Link.tsx delete mode 100644 packages/web/src/components/UI/Typography/P.tsx delete mode 100644 packages/web/src/components/UI/Typography/Subtle.tsx create mode 100644 packages/web/src/components/ui/Skeleton.tsx create mode 100644 packages/web/src/components/ui/Typography/Blockquote.tsx create mode 100644 packages/web/src/components/ui/Typography/Code.tsx create mode 100644 packages/web/src/components/ui/Typography/Heading.tsx create mode 100644 packages/web/src/components/ui/Typography/Link.tsx create mode 100644 packages/web/src/components/ui/Typography/P.tsx create mode 100644 packages/web/src/components/ui/Typography/Subtle.tsx create mode 100644 packages/web/src/components/ui/accordion.tsx rename packages/web/src/components/{UI/AlertDialog.tsx => ui/alert-dialog.tsx} (98%) create mode 100644 packages/web/src/components/ui/avatar.tsx create mode 100644 packages/web/src/components/ui/badge.tsx rename packages/web/src/components/{UI/Button.tsx => ui/button.tsx} (100%) rename packages/web/src/components/{UI/Card.tsx => ui/card.tsx} (63%) rename packages/web/src/components/{UI/Checkbox/Checkbox.test.tsx => ui/checkbox.test.tsx} (98%) rename packages/web/src/components/{UI/Checkbox/index.tsx => ui/checkbox.tsx} (100%) rename packages/web/src/components/{UI/Command.tsx => ui/command.tsx} (99%) rename packages/web/src/components/{UI/Dialog.tsx => ui/dialog.tsx} (100%) rename packages/web/src/components/{UI/DropdownMenu.tsx => ui/dropdown-menu.tsx} (100%) rename packages/web/src/components/{UI/ErrorPage.tsx => ui/error-page.tsx} (95%) rename packages/web/src/components/{UI/Footer.tsx => ui/footer.tsx} (100%) rename packages/web/src/components/{UI/Generator.tsx => ui/generator.tsx} (94%) rename packages/web/src/components/{UI/Input.tsx => ui/input.tsx} (100%) create mode 100644 packages/web/src/components/ui/label.tsx rename packages/web/src/components/{UI/Menubar.tsx => ui/menubar.tsx} (100%) rename packages/web/src/components/{UI/MultiSelect.tsx => ui/multi-select.tsx} (100%) rename packages/web/src/components/{UI/Popover.tsx => ui/popover.tsx} (100%) rename packages/web/src/components/{UI/ScrollArea.tsx => ui/scroll-area.tsx} (100%) create mode 100644 packages/web/src/components/ui/select.tsx create mode 100644 packages/web/src/components/ui/separator.tsx create mode 100644 packages/web/src/components/ui/sheet.tsx create mode 100644 packages/web/src/components/ui/sidebar.tsx rename packages/web/src/components/{UI/Sidebar/SidebarButton.tsx => ui/sidebar/sidebar-button.tsx} (97%) rename packages/web/src/components/{UI/Sidebar/SidebarSection.tsx => ui/sidebar/sidebar-section.tsx} (93%) rename packages/web/src/components/{UI/Slider.tsx => ui/slider.tsx} (100%) rename packages/web/src/components/{UI/Spinner.tsx => ui/spinner.tsx} (100%) create mode 100644 packages/web/src/components/ui/switch.tsx rename packages/web/src/components/{UI/Tabs.tsx => ui/tabs.tsx} (100%) rename packages/web/src/components/{UI/Toast.tsx => ui/toast.tsx} (64%) create mode 100644 packages/web/src/components/ui/toggle-group.tsx create mode 100644 packages/web/src/components/ui/toggle.tsx rename packages/web/src/components/{UI/Tooltip.tsx => ui/tooltip.tsx} (56%) create mode 100644 packages/web/src/core/hooks/useIsMobile.ts diff --git a/packages/ui/package.json b/packages/ui/package.json index f12f10e1a..e6a91300b 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -56,6 +56,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^0.545.0", + "@meshtastic/ui": "workspace:*", "tailwind-merge": "^2.6.0" }, "devDependencies": { diff --git a/packages/ui/src/components/ui/sheet.tsx b/packages/ui/src/components/ui/sheet.tsx index 577a724e2..62683a9b0 100644 --- a/packages/ui/src/components/ui/sheet.tsx +++ b/packages/ui/src/components/ui/sheet.tsx @@ -1,5 +1,3 @@ -"use client"; - import * as SheetPrimitive from "@radix-ui/react-dialog"; import { XIcon } from "lucide-react"; import type * as React from "react"; diff --git a/packages/ui/src/components/ui/sidebar.tsx b/packages/ui/src/components/ui/sidebar.tsx index bf103684a..63200e138 100644 --- a/packages/ui/src/components/ui/sidebar.tsx +++ b/packages/ui/src/components/ui/sidebar.tsx @@ -1,5 +1,3 @@ -"use client"; - import { Slot } from "@radix-ui/react-slot"; import { cva, type VariantProps } from "class-variance-authority"; import { PanelLeftIcon } from "lucide-react"; diff --git a/packages/ui/src/lib/components/Sidebar/AppSidebar.tsx b/packages/ui/src/lib/components/Sidebar/AppSidebar.tsx index 2bca97d28..fca549b03 100644 --- a/packages/ui/src/lib/components/Sidebar/AppSidebar.tsx +++ b/packages/ui/src/lib/components/Sidebar/AppSidebar.tsx @@ -23,7 +23,7 @@ import { SidebarMenuSubItem, useSidebar, } from "@/components/ui/sidebar"; -import { cn } from "@/lib/utils"; +import { cn } from "../../lib/utils.ts"; export interface AppSidebarProps { children?: React.ReactNode; diff --git a/packages/web/package.json b/packages/web/package.json index c66c60ebf..0726c5441 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -33,10 +33,13 @@ "@meshtastic/transport-http": "workspace:*", "@meshtastic/transport-web-bluetooth": "workspace:*", "@meshtastic/transport-web-serial": "workspace:*", + "@meshtastic/ui": "workspace:*", "@noble/curves": "^1.9.2", "@radix-ui/react-accordion": "^1.2.12", "@radix-ui/react-alert-dialog": "^1.1.15", + "@radix-ui/react-avatar": "^1.1.11", "@radix-ui/react-checkbox": "^1.3.3", + "@radix-ui/react-collapsible": "^1.1.12", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.16", "@radix-ui/react-label": "^2.1.7", @@ -46,9 +49,11 @@ "@radix-ui/react-select": "^2.2.6", "@radix-ui/react-separator": "^1.1.7", "@radix-ui/react-slider": "^1.3.6", + "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-switch": "^1.2.6", "@radix-ui/react-tabs": "^1.1.13", "@radix-ui/react-toast": "^1.2.15", + "@radix-ui/react-toggle": "^1.1.10", "@radix-ui/react-toggle-group": "^1.1.11", "@radix-ui/react-tooltip": "^1.2.8", "@radix-ui/react-visually-hidden": "^1.2.3", diff --git a/packages/web/src/App.tsx b/packages/web/src/App.tsx index 5fc115c6f..04e6b206d 100644 --- a/packages/web/src/App.tsx +++ b/packages/web/src/App.tsx @@ -1,12 +1,13 @@ import { DeviceWrapper } from "@app/DeviceWrapper.tsx"; +import AppLayout from "@components/AppLayout"; import { CommandPalette } from "@components/CommandPalette/index.tsx"; import { DialogManager } from "@components/Dialog/DialogManager.tsx"; import { KeyBackupReminder } from "@components/KeyBackupReminder.tsx"; import { Toaster } from "@components/Toaster.tsx"; -import { ErrorPage } from "@components/UI/ErrorPage.tsx"; -import Footer from "@components/UI/Footer.tsx"; +import { ErrorPage } from "@components/ui/error-page.tsx"; +import Footer from "@components/ui/footer.tsx"; import { useTheme } from "@core/hooks/useTheme.ts"; -import { SidebarProvider, useAppStore, useDeviceStore } from "@core/stores"; +import { useAppStore, useDeviceStore } from "@core/stores"; import { Connections } from "@pages/Connections/index.tsx"; import { Outlet } from "@tanstack/react-router"; import { TanStackRouterDevtools } from "@tanstack/react-router-devtools"; @@ -22,43 +23,28 @@ export function App() { const device = getDevice(selectedDeviceId); return ( - // - {/* { - setConnectDialogOpen(open); - }} - /> */} -
- -
- {device ? ( -
- - - - - - -
- ) : ( - <> - -
- - )} -
-
-
+ + {device ? ( + <> + + + + + + + + ) : ( + <> + +