Skip to content

Commit

Permalink
Toolbar
Browse files Browse the repository at this point in the history
  • Loading branch information
ilyabo committed Sep 2, 2024
1 parent a821c76 commit 2ceff0e
Show file tree
Hide file tree
Showing 20 changed files with 216 additions and 239 deletions.
21 changes: 15 additions & 6 deletions assets/css/app.css
Original file line number Diff line number Diff line change
@@ -1,8 +1,17 @@
@import 'tailwindcss/base';
@import 'tailwindcss/components';
@import 'tailwindcss/utilities';

@import 'maplibre-gl/dist/maplibre-gl.css';
@import "tailwindcss/base";
@import "tailwindcss/components";
@import "tailwindcss/utilities";

@import "maplibre-gl/dist/maplibre-gl.css";

html,
body {
/* Prevent overscroll bounce */
overflow: hidden;
height: 100%;
margin: 0;
padding: 0;
}

/* This file is for your main application CSS */
@layer base {
Expand Down Expand Up @@ -79,6 +88,6 @@
}
body {
@apply bg-background text-foreground;
font-feature-settings: 'rlig' 1, 'calt' 1;
font-feature-settings: "rlig" 1, "calt" 1;
}
}
75 changes: 29 additions & 46 deletions assets/js/app.js
Original file line number Diff line number Diff line change
@@ -1,52 +1,35 @@
// If you want to use Phoenix channels, run `mix help phx.gen.channel`
// to get started and then uncomment the line below.
// import "./user_socket.js"

// You can include dependencies in two ways.
//
// The simplest option is to put them in assets/vendor and
// import them using relative paths:
//
// import "../vendor/some-package.js"
//
// Alternatively, you can `npm install some-package --prefix assets` and import
// them using a path starting with the package name:
//
// import "some-package"
//
import React from "react";
import {createRoot} from "react-dom/client";
import AppContainer from "./components/app-container";
const reactAppContainer = document.getElementById("react-app-container");
const root = createRoot(reactAppContainer);
root.render(<AppContainer />);

// // Establish Phoenix Socket and LiveView configuration.
// Include phoenix_html to handle method=PUT/DELETE in forms and buttons.
import "phoenix_html";
// Establish Phoenix Socket and LiveView configuration.
import {Socket} from "phoenix";
import {LiveSocket} from "phoenix_live_view";
import topbar from "../vendor/topbar";
// import "phoenix_html";
// import {Socket} from "phoenix";
// import {LiveSocket} from "phoenix_live_view";
// import topbar from "../vendor/topbar";

let csrfToken = document
.querySelector("meta[name='csrf-token']")
.getAttribute("content");
let liveSocket = new LiveSocket("/live", Socket, {
longPollFallbackMs: 2500,
params: {_csrf_token: csrfToken},
});
// let csrfToken = document
// .querySelector("meta[name='csrf-token']")
// .getAttribute("content");
// let liveSocket = new LiveSocket("/live", Socket, {
// longPollFallbackMs: 2500,
// params: {_csrf_token: csrfToken},
// });

// Show progress bar on live navigation and form submits
topbar.config({barColors: {0: "#29d"}, shadowColor: "rgba(0, 0, 0, .3)"});
window.addEventListener("phx:page-loading-start", (_info) => topbar.show(300));
window.addEventListener("phx:page-loading-stop", (_info) => topbar.hide());
// // Show progress bar on live navigation and form submits
// topbar.config({barColors: {0: "#29d"}, shadowColor: "rgba(0, 0, 0, .3)"});
// window.addEventListener("phx:page-loading-start", (_info) => topbar.show(300));
// window.addEventListener("phx:page-loading-stop", (_info) => topbar.hide());

// connect if there are any LiveViews on the page
liveSocket.connect();
// // connect if there are any LiveViews on the page
// liveSocket.connect();

// expose liveSocket on window for web console debug logs and latency simulation:
// >> liveSocket.enableDebug()
// >> liveSocket.enableLatencySim(1000) // enabled for duration of browser session
// >> liveSocket.disableLatencySim()
window.liveSocket = liveSocket;

import React from "react";
import {createRoot} from "react-dom/client";
import AppRoot from "./components/app-root";
const reactAppContainer = document.getElementById("react-app-container");
const root = createRoot(reactAppContainer);
root.render(<AppRoot />);
// // expose liveSocket on window for web console debug logs and latency simulation:
// // >> liveSocket.enableDebug()
// // >> liveSocket.enableLatencySim(1000) // enabled for duration of browser session
// // >> liveSocket.disableLatencySim()
// window.liveSocket = liveSocket;
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
// src/App.tsx
import React, {useEffect} from "react";
import {MapView} from "../map/map-view";
import {Menu} from "./menu";
import {ColorSelector} from "./color-selector";
import {HexSizeSelector} from "./hex-size-selector";
import {useAppStore} from "../store/store";
import {ToolbarContainer} from "./toolbar-container";

const AppRoot: React.FC = () => {
const AppContainer: React.FC = () => {
const initialize = useAppStore((state) => state.initialize);
useEffect(initialize, [initialize]);

Expand All @@ -15,15 +14,15 @@ const AppRoot: React.FC = () => {
<div className="map-container absolute w-[100vw] h-[100vh] top-0 left-0">
<MapView />
</div>
<div className="absolute top-4 left-4">
<Menu />
</div>
<div className="absolute top-0 right-0 p-4 flex flex-row gap-2 items-center">
<HexSizeSelector className="w-[110px]" />
<div className="absolute top-4 left-4 flex flex-col gap-1">
<ToolbarContainer />
<ColorSelector />
</div>
{/* <div className="absolute top-0 right-0 p-4 flex flex-row gap-2 items-center">
<HexSizeSelector className="w-[110px]" />
</div> */}
</>
);
};

export default AppRoot;
export default AppContainer;
2 changes: 1 addition & 1 deletion assets/js/components/color-selector.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import {FC} from "react";
export type ColorSelectorProps = {};
import {ColorPicker} from "../ui/color-picker";
import {ColorPicker} from "./ui/color-picker";
import React from "react";
import {useAppStore} from "../store/store";

Expand Down
4 changes: 2 additions & 2 deletions assets/js/components/hex-size-selector.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React, {FC} from "react";
import {useAppStore} from "../store/store";
import {Slider} from "../ui/slider";
import {cn} from "../ui/utils";
import {Slider} from "./ui/slider";
import {cn} from "./ui/utils";
import {DrawingMode} from "../drawing/types";

const MIN_HEX_RESOLUTION = 8;
Expand Down
56 changes: 0 additions & 56 deletions assets/js/components/menu.tsx

This file was deleted.

84 changes: 84 additions & 0 deletions assets/js/components/toolbar-container.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
import React, {FC} from "react";
import {
DRAWING_MODE_ICONS,
DrawingMode,
getDrawingModeIcon,
} from "../drawing/types";
import {useAppStore} from "../store/store";
import {Button} from "./ui/button";
import {LucideIcon} from "lucide-react";
import {cn} from "./ui/utils";

export type ModeSelectorProps = {};

const ToolbarButton: FC<{
icon: LucideIcon;
isSelected?: boolean;
onClick: () => void;
}> = ({icon: Icon, isSelected, onClick}) => {
return (
<Button
className={cn("border bg-gray-400 hover:bg-gray-600 transition-colors", {
"bg-gray-700": isSelected,
shadow: isSelected,
})}
size="icon"
onClick={onClick}
>
{Icon ? <Icon size="16px" /> : null}
</Button>
);
};

export const ToolbarContainer: FC<ModeSelectorProps> = (props) => {
const drawingMode = useAppStore((state) => state.mode);
const setDrawingMode = useAppStore((state) => state.setDrawingMode);

return (
<div className="flex flex-col gap-1">
{Object.keys(DrawingMode).map((mode) => {
return (
<ToolbarButton
key={mode}
icon={getDrawingModeIcon(DrawingMode[mode])}
isSelected={DrawingMode[mode] === drawingMode}
onClick={() => setDrawingMode(DrawingMode[mode])}
/>
);
})}
</div>

// <DropdownMenu>
// <DropdownMenuTrigger asChild>
// <div className="flex flex-row gap-2 items-center">
// <Button variant="default">
// <HamburgerMenuIcon />
// </Button>
// <div className="font-sm">{drawingMode}</div>
// </div>
// </DropdownMenuTrigger>
// <DropdownMenuContent className="w-56" align="start">
// <DropdownMenuLabel>Drawing Mode</DropdownMenuLabel>
// <DropdownMenuSeparator />
// <DropdownMenuGroup>
// {Object.keys(DrawingMode).map((mode) => (
// <DropdownMenuItem
// key={mode}
// onClick={() => setDrawingMode(DrawingMode[mode])}
// >
// {DrawingMode[mode]}
// <DropdownMenuShortcut>
// {KEYSTROKES_BY_MODE[DrawingMode[mode]]}
// </DropdownMenuShortcut>
// </DropdownMenuItem>
// ))}
// </DropdownMenuGroup>
// <DropdownMenuSeparator />
// <DropdownMenuItem disabled>
// Pan the map
// <DropdownMenuShortcut>Space + Drag</DropdownMenuShortcut>
// </DropdownMenuItem>
// </DropdownMenuContent>
// </DropdownMenu>
);
};
56 changes: 0 additions & 56 deletions assets/js/components/toolbar.tsx

This file was deleted.

File renamed without changes.
Loading

0 comments on commit 2ceff0e

Please sign in to comment.