diff --git a/nextjs/components.json b/nextjs/components.json
index 53e16a6ca..8c574b77e 100644
--- a/nextjs/components.json
+++ b/nextjs/components.json
@@ -6,7 +6,7 @@
"tailwind": {
"config": "tailwind.config.ts",
"css": "src/app/globals.css",
- "baseColor": "meepGray",
+ "baseColor": "slate",
"cssVariables": true,
"prefix": ""
},
@@ -14,4 +14,4 @@
"components": "@/components",
"utils": "@/lib/utils"
}
-}
+}
\ No newline at end of file
diff --git a/nextjs/next.config.js b/nextjs/next.config.js
new file mode 100644
index 000000000..83ec25334
--- /dev/null
+++ b/nextjs/next.config.js
@@ -0,0 +1,10 @@
+module.exports = {
+ images: {
+ remotePatterns: [
+ {
+ protocol: 'https',
+ hostname: 'www.localintelligencehub.com',
+ },
+ ],
+ },
+ }
\ No newline at end of file
diff --git a/nextjs/package-lock.json b/nextjs/package-lock.json
index 434b2478c..e4651731c 100644
--- a/nextjs/package-lock.json
+++ b/nextjs/package-lock.json
@@ -12,7 +12,9 @@
"@apollo/experimental-nextjs-app-support": "^0.8.0",
"@hookform/resolvers": "^3.3.4",
"@parcel/watcher": "^2.4.1",
+ "@radix-ui/react-accordion": "^1.1.2",
"@radix-ui/react-alert-dialog": "^1.0.5",
+ "@radix-ui/react-checkbox": "^1.0.4",
"@radix-ui/react-collapsible": "^1.0.3",
"@radix-ui/react-dialog": "^1.0.5",
"@radix-ui/react-dropdown-menu": "^2.0.6",
@@ -22,6 +24,8 @@
"@radix-ui/react-switch": "^1.0.3",
"@radix-ui/react-tabs": "^1.0.4",
"@radix-ui/react-toggle": "^1.0.3",
+ "@radix-ui/react-toggle-group": "^1.0.4",
+ "@radix-ui/react-tooltip": "^1.0.7",
"@tanstack/react-table": "^8.13.2",
"@types/date-fns": "^2.6.0",
"class-variance-authority": "^0.7.0",
@@ -3169,6 +3173,37 @@
"@babel/runtime": "^7.13.10"
}
},
+ "node_modules/@radix-ui/react-accordion": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.1.2.tgz",
+ "integrity": "sha512-fDG7jcoNKVjSK6yfmuAs0EnPDro0WMXIhMtXdTBWqEioVW206ku+4Lw07e+13lUkFkpoEQ2PdeMIAGpdqEAmDg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "1.0.1",
+ "@radix-ui/react-collapsible": "1.0.3",
+ "@radix-ui/react-collection": "1.0.3",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-context": "1.0.1",
+ "@radix-ui/react-direction": "1.0.1",
+ "@radix-ui/react-id": "1.0.1",
+ "@radix-ui/react-primitive": "1.0.3",
+ "@radix-ui/react-use-controllable-state": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@radix-ui/react-alert-dialog": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.0.5.tgz",
@@ -3220,6 +3255,36 @@
}
}
},
+ "node_modules/@radix-ui/react-checkbox": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.0.4.tgz",
+ "integrity": "sha512-CBuGQa52aAYnADZVt/KBQzXrwx6TqnlwtcIPGtVt5JkkzQwMOLJjPukimhfKEr4GQNd43C+djUh5Ikopj8pSLg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "1.0.1",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-context": "1.0.1",
+ "@radix-ui/react-presence": "1.0.1",
+ "@radix-ui/react-primitive": "1.0.3",
+ "@radix-ui/react-use-controllable-state": "1.0.1",
+ "@radix-ui/react-use-previous": "1.0.1",
+ "@radix-ui/react-use-size": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@radix-ui/react-collapsible": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.0.3.tgz",
@@ -3814,6 +3879,69 @@
}
}
},
+ "node_modules/@radix-ui/react-toggle-group": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.0.4.tgz",
+ "integrity": "sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "1.0.1",
+ "@radix-ui/react-context": "1.0.1",
+ "@radix-ui/react-direction": "1.0.1",
+ "@radix-ui/react-primitive": "1.0.3",
+ "@radix-ui/react-roving-focus": "1.0.4",
+ "@radix-ui/react-toggle": "1.0.3",
+ "@radix-ui/react-use-controllable-state": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-tooltip": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.0.7.tgz",
+ "integrity": "sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "1.0.1",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-context": "1.0.1",
+ "@radix-ui/react-dismissable-layer": "1.0.5",
+ "@radix-ui/react-id": "1.0.1",
+ "@radix-ui/react-popper": "1.1.3",
+ "@radix-ui/react-portal": "1.0.4",
+ "@radix-ui/react-presence": "1.0.1",
+ "@radix-ui/react-primitive": "1.0.3",
+ "@radix-ui/react-slot": "1.0.2",
+ "@radix-ui/react-use-controllable-state": "1.0.1",
+ "@radix-ui/react-visually-hidden": "1.0.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@radix-ui/react-use-callback-ref": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz",
@@ -3937,6 +4065,29 @@
}
}
},
+ "node_modules/@radix-ui/react-visually-hidden": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz",
+ "integrity": "sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-primitive": "1.0.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@radix-ui/rect": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.1.tgz",
diff --git a/nextjs/package.json b/nextjs/package.json
index 1a1b95755..d6f0a7979 100644
--- a/nextjs/package.json
+++ b/nextjs/package.json
@@ -16,7 +16,9 @@
"@apollo/experimental-nextjs-app-support": "^0.8.0",
"@hookform/resolvers": "^3.3.4",
"@parcel/watcher": "^2.4.1",
+ "@radix-ui/react-accordion": "^1.1.2",
"@radix-ui/react-alert-dialog": "^1.0.5",
+ "@radix-ui/react-checkbox": "^1.0.4",
"@radix-ui/react-collapsible": "^1.0.3",
"@radix-ui/react-dialog": "^1.0.5",
"@radix-ui/react-dropdown-menu": "^2.0.6",
@@ -26,6 +28,8 @@
"@radix-ui/react-switch": "^1.0.3",
"@radix-ui/react-tabs": "^1.0.4",
"@radix-ui/react-toggle": "^1.0.3",
+ "@radix-ui/react-toggle-group": "^1.0.4",
+ "@radix-ui/react-tooltip": "^1.0.7",
"@tanstack/react-table": "^8.13.2",
"@types/date-fns": "^2.6.0",
"class-variance-authority": "^0.7.0",
diff --git a/nextjs/src/app/external-data-source-updates/ExternalDataSourceUpdates.tsx b/nextjs/src/app/external-data-source-updates/ExternalDataSourceUpdates.tsx
index 351b350bd..b9e39d63d 100644
--- a/nextjs/src/app/external-data-source-updates/ExternalDataSourceUpdates.tsx
+++ b/nextjs/src/app/external-data-source-updates/ExternalDataSourceUpdates.tsx
@@ -46,7 +46,7 @@ export default function ExternalDataSourceUpdates() {
-
Active Syncs
+
Active Syncs
{loading ? (
diff --git a/nextjs/src/app/globals.css b/nextjs/src/app/globals.css
index c8100447a..021054e93 100644
--- a/nextjs/src/app/globals.css
+++ b/nextjs/src/app/globals.css
@@ -16,15 +16,27 @@
}
@font-face {
- font-family: IBMPlexSans;
+ font-family: IBMPlexSansReg;
src: url("../fonts/IBMPlexSans/IBMPlexSans-Regular.ttf");
}
-
+@font-face {
+ font-family: IBMPlexSansMedium;
+ src: url("../fonts/IBMPlexSans/IBMPlexSans-Medium.ttf");
+}
+@font-face {
+ font-family: IBMPlexSansSemiBold;
+ src: url("../fonts/IBMPlexSans/IBMPlexSans-SemiBold.ttf");
+}
@font-face {
font-family: IBMPlexSansCondensed;
src: url("../fonts/IBMPlexSans/IBMPlexSansCondensed-Regular.ttf");
}
+@font-face {
+ font-family: IBMPlexMono;
+ src: url("../fonts/IBMPlexMono/IBMPlexMono-Regular.ttf");
+}
+
@layer base {
:root {
--meep-gray-100: 220, 14%, 96%;
@@ -46,14 +58,14 @@
--card-foreground: 222.2 84% 4.9%;
--popover: 0 0% 100%;
--popover-foreground: 222.2 84% 4.9%;
- --primary: 222.2 47.4% 11.2%;
+ --primary: 222, 14%, 34%;
--primary-foreground: 210 40% 98%;
--secondary: 210 40% 96.1%;
- --secondary-foreground: 222.2 47.4% 11.2%;
+ --secondary-foreground: 222, 14%, 34%;
--muted: 210 40% 96.1%;
--muted-foreground: 215.4 16.3% 46.9%;
--accent: 210 40% 96.1%;
- --accent-foreground: 222.2 47.4% 11.2%;
+ --accent-foreground: 222, 14%, 34%;
--border: 0, 0%, 100%, 0.32;
--brand: 222, 69%, 65%;
@@ -75,7 +87,6 @@
body {
@apply bg-meepGray-800 text-white font-IBMPlexSans;
}
-
}
@layer components {
diff --git a/nextjs/src/app/reports/[id]/page.tsx b/nextjs/src/app/reports/[id]/page.tsx
index 1cbf0af62..974c0c9a8 100644
--- a/nextjs/src/app/reports/[id]/page.tsx
+++ b/nextjs/src/app/reports/[id]/page.tsx
@@ -1,8 +1,14 @@
// page.js
"use client";
-import Map from "react-map-gl";
+import { useState } from "react";
+
+
+import Map, { Marker, Popup } from "react-map-gl";
import "mapbox-gl/dist/mapbox-gl.css";
+import Pin from "@/components/Pin";
+
+
import {
Card,
CardContent,
@@ -12,51 +18,165 @@ import {
CardTitle,
} from "@/components/ui/card"
+import {
+ Accordion,
+ AccordionContent,
+ AccordionItem,
+ AccordionTrigger,
+} from "@/components/ui/accordion"
-import { BarChart3, Layers, LibraryBig } from "lucide-react"
-import { Button } from "@/components/ui/button"
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuLabel,
+ DropdownMenuSeparator,
+ DropdownMenuTrigger,
+} from "@/components/ui/dropdown-menu"
+
+import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
+import { Checkbox } from "@/components/ui/checkbox"
+import { BarChart3, Layers, LibraryBig, File, Plus, Wrench } from "lucide-react"
+import { Button } from "@/components/ui/button"
+import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"
+import ReportsConsItem from "@/components/reportsConstituencyItem";
+import DataConfig from "@/components/dataConfig";
+
export default function Home() {
const mapboxToken = process.env.NEXT_PUBLIC_MAPBOX_ACCESS_TOKEN;
+
+ const [isDataConfigOpen, setDataConfigOpen] = useState(false);
+ const toggleDataConfig = () => setDataConfigOpen(!isDataConfigOpen);
+
+ const [isConsDataOpen, setConsDataOpen] = useState(false);
+ const toggleConsData = () => setConsDataOpen(!isConsDataOpen);
+
+ let testLong = "-2.296605"
+ let testLat = "53.593349"
+
+
+
return (
+
+ >
+
+
+
+
+
+ TEST
+
+
+
+
+
-
-
+
+
-
- Main List
+
+ Main List
+
+
+
+
+
+ Report Settings
+
+ Share
+ Invite
+ Delete
+
+
+
-
-
-
-
- Data configuration
-
-
-
-
-
- Constituency data
-
+
+
+ Data Configuration
+
+
+ Constituency Data
+
+
+ {isDataConfigOpen && (
+
+
+ )}
+ {isConsDataOpen && (
+
+
+
+
+ All Constituencies
+ Bury North
+
+
+
+
+
+
+ Change your password here.
+
+
+
+
+
+
+ )}
+
diff --git a/nextjs/src/app/reports/page.tsx b/nextjs/src/app/reports/page.tsx
index 8497cbfda..6876b938c 100644
--- a/nextjs/src/app/reports/page.tsx
+++ b/nextjs/src/app/reports/page.tsx
@@ -16,9 +16,10 @@ export default function Report() {
-
Active Syncs
+
Your reports
+
@@ -28,6 +29,7 @@ export default function Report() {
Last Edited: 27 Feb 2024
+
Create new report
@@ -44,7 +46,7 @@ function PageHeader() {
return (
-
Reports
+
Reports
Maximise your organisations impact by securely connecting your CRM platforms with Mapped and select from a range of data sources to enhance your membership lists.
diff --git a/nextjs/src/components/Pin.tsx b/nextjs/src/components/Pin.tsx
new file mode 100644
index 000000000..b346a7a79
--- /dev/null
+++ b/nextjs/src/components/Pin.tsx
@@ -0,0 +1,28 @@
+import * as React from 'react';
+
+const ICON = `M20.2,15.7L20.2,15.7c1.1-1.6,1.8-3.6,1.8-5.7c0-5.6-4.5-10-10-10S2,4.5,2,10c0,2,0.6,3.9,1.6,5.4c0,0.1,0.1,0.2,0.2,0.3
+ c0,0,0.1,0.1,0.1,0.2c0.2,0.3,0.4,0.6,0.7,0.9c2.6,3.1,7.4,7.6,7.4,7.6s4.8-4.5,7.4-7.5c0.2-0.3,0.5-0.6,0.7-0.9
+ C20.1,15.8,20.2,15.8,20.2,15.7z`;
+
+
+
+const pinStyle = {
+ cursor: 'pointer',
+ fill: '#678DE3',
+ stroke: 'none'
+};
+
+function Pin({ size = 30 }) {
+ return (
+
+
+
+
+ );
+}
+
+
+
+
+
+export default React.memo(Pin);
\ No newline at end of file
diff --git a/nextjs/src/components/dataConfig.tsx b/nextjs/src/components/dataConfig.tsx
new file mode 100644
index 000000000..3faf6bdb7
--- /dev/null
+++ b/nextjs/src/components/dataConfig.tsx
@@ -0,0 +1,147 @@
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardFooter,
+ CardHeader,
+ CardTitle,
+} from "@/components/ui/card"
+
+import {
+ Accordion,
+ AccordionContent,
+ AccordionItem,
+ AccordionTrigger,
+} from "@/components/ui/accordion"
+
+import { Button } from "@/components/ui/button"
+
+import { Checkbox } from "@/components/ui/checkbox"
+
+import { File, Plus } from "lucide-react"
+
+
+
+
+interface Props {
+
+}
+
+
+
+const ReportsConsItem: React.FC
= ({}) => {
+
+
+ return (
+
+
+ Data Configuration
+
+
+
+
+
Your membership data
+
+
+ Main-list-2024.csv
+
+
+
+
+ add new member list
+
+
+
+
+
+
Data Layers
+
+
+ Geographic
+
+
+
+
+
+ Constituency
+
+
+
+
+
+
+
+
+ Something else
+
+
+
+
+
+
+ Demographic
+
+
+
+
+
+ Nationality
+
+
+
+
+
+
+
+
+ Something else
+
+
+
+
+
+
+
+
+
+
+ )
+ // return some JSX
+};
+
+
+
+export default ReportsConsItem;
+
diff --git a/nextjs/src/components/reportsConstituencyItem.tsx b/nextjs/src/components/reportsConstituencyItem.tsx
new file mode 100644
index 000000000..c19f3d11e
--- /dev/null
+++ b/nextjs/src/components/reportsConstituencyItem.tsx
@@ -0,0 +1,90 @@
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardFooter,
+ CardHeader,
+ CardTitle,
+} from "@/components/ui/card"
+
+import Image from "next/image";
+
+interface ConsProps {
+ id?: string;
+ consName: string;
+ firstIn2019: string;
+ secondIn2019: string;
+ mpName?: string;
+ mpImgUrl?: string | undefined;
+}
+
+
+
+const ReportsConsItem: React.FC = ({ id, consName, firstIn2019, secondIn2019, mpName, mpImgUrl }) => {
+
+ let first2019lowercase = firstIn2019.toLowerCase()
+ let second2019lowercase = secondIn2019.toLowerCase()
+
+
+ if (mpImgUrl === undefined) {
+ throw new Error("img is undefined!");
+ }
+
+
+ return (
+ <>
+
+
+ {consName}
+
+
+
+
+
Member of Parliment
+
+
+
+
{mpName}
+
{firstIn2019} Party
+
+
+
+
+
+
+
+ >
+ )
+ // return some JSX
+};
+
+
+
+export default ReportsConsItem;
+
+
+
+
diff --git a/nextjs/src/components/ui/accordion.tsx b/nextjs/src/components/ui/accordion.tsx
new file mode 100644
index 000000000..5794b3518
--- /dev/null
+++ b/nextjs/src/components/ui/accordion.tsx
@@ -0,0 +1,58 @@
+"use client"
+
+import * as React from "react"
+import * as AccordionPrimitive from "@radix-ui/react-accordion"
+import { ChevronDown } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const Accordion = AccordionPrimitive.Root
+
+const AccordionItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+AccordionItem.displayName = "AccordionItem"
+
+const AccordionTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ svg]:rotate-180",
+ className
+ )}
+ {...props}
+ >
+ {children}
+
+
+
+))
+AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName
+
+const AccordionContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ {children}
+
+))
+
+AccordionContent.displayName = AccordionPrimitive.Content.displayName
+
+export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }
diff --git a/nextjs/src/components/ui/button.tsx b/nextjs/src/components/ui/button.tsx
index 72aadcca8..f1dbabd41 100644
--- a/nextjs/src/components/ui/button.tsx
+++ b/nextjs/src/components/ui/button.tsx
@@ -16,7 +16,7 @@ const buttonVariants = cva(
outline:
"border border-meepGray-600 bg-meepGray-800 hover:bg-accent hover:text-accent-foreground",
secondary:
- "bg-secondary text-secondary-foreground hover:bg-secondary/80",
+ "bg-secondary text-secondary-foreground hover:bg-secondary/80 ",
ghost: "hover:bg-accent hover:text-accent-foreground",
link: "text-primary underline-offset-4 hover:underline",
reverse:
diff --git a/nextjs/src/components/ui/card.tsx b/nextjs/src/components/ui/card.tsx
index 61e737bff..2791e96bb 100644
--- a/nextjs/src/components/ui/card.tsx
+++ b/nextjs/src/components/ui/card.tsx
@@ -9,7 +9,7 @@ const Card = React.forwardRef<
,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+
+
+))
+Checkbox.displayName = CheckboxPrimitive.Root.displayName
+
+export { Checkbox }
diff --git a/nextjs/src/components/ui/toggle-group.tsx b/nextjs/src/components/ui/toggle-group.tsx
new file mode 100644
index 000000000..b81ca1853
--- /dev/null
+++ b/nextjs/src/components/ui/toggle-group.tsx
@@ -0,0 +1,61 @@
+"use client"
+
+import * as React from "react"
+import * as ToggleGroupPrimitive from "@radix-ui/react-toggle-group"
+import { VariantProps } from "class-variance-authority"
+
+import { cn } from "@/lib/utils"
+import { toggleVariants } from "@/components/ui/toggle"
+
+const ToggleGroupContext = React.createContext<
+ VariantProps
+>({
+ size: "default",
+ variant: "default",
+})
+
+const ToggleGroup = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef &
+ VariantProps
+>(({ className, variant, size, children, ...props }, ref) => (
+
+
+ {children}
+
+
+))
+
+ToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName
+
+const ToggleGroupItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef &
+ VariantProps
+>(({ className, children, variant, size, ...props }, ref) => {
+ const context = React.useContext(ToggleGroupContext)
+
+ return (
+
+ {children}
+
+ )
+})
+
+ToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName
+
+export { ToggleGroup, ToggleGroupItem }
diff --git a/nextjs/src/components/ui/toggle.tsx b/nextjs/src/components/ui/toggle.tsx
index e5a176980..f47f68715 100644
--- a/nextjs/src/components/ui/toggle.tsx
+++ b/nextjs/src/components/ui/toggle.tsx
@@ -7,7 +7,7 @@ import { cva, type VariantProps } from "class-variance-authority";
import { cn } from "@/lib/utils";
const toggleVariants = cva(
- "inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-meepGray-800 transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground",
+ "inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-meepGray-800 transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-meepGray-700 data-[state=on]:text-meepGray-200",
{
variants: {
variant: {
diff --git a/nextjs/src/components/ui/tooltip.tsx b/nextjs/src/components/ui/tooltip.tsx
new file mode 100644
index 000000000..30fc44d90
--- /dev/null
+++ b/nextjs/src/components/ui/tooltip.tsx
@@ -0,0 +1,30 @@
+"use client"
+
+import * as React from "react"
+import * as TooltipPrimitive from "@radix-ui/react-tooltip"
+
+import { cn } from "@/lib/utils"
+
+const TooltipProvider = TooltipPrimitive.Provider
+
+const Tooltip = TooltipPrimitive.Root
+
+const TooltipTrigger = TooltipPrimitive.Trigger
+
+const TooltipContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, sideOffset = 4, ...props }, ref) => (
+
+))
+TooltipContent.displayName = TooltipPrimitive.Content.displayName
+
+export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
diff --git a/nextjs/src/fonts/IBMPlexMono/IBMPlexMono-Regular.ttf b/nextjs/src/fonts/IBMPlexMono/IBMPlexMono-Regular.ttf
new file mode 100644
index 000000000..81ca3dcc9
Binary files /dev/null and b/nextjs/src/fonts/IBMPlexMono/IBMPlexMono-Regular.ttf differ
diff --git a/nextjs/tailwind.config.ts b/nextjs/tailwind.config.ts
index b89c6ec7d..6976f2aa4 100644
--- a/nextjs/tailwind.config.ts
+++ b/nextjs/tailwind.config.ts
@@ -19,19 +19,28 @@ const config = {
},
extend: {
fontFamily: {
- 'IBMPlexSans': ["IBMPlexSans", 'sans-serif'],
+ 'IBMPlexSans': ["IBMPlexSansReg", 'sans-serif'],
+ 'IBMPlexSansSemiBold': ["IBMPlexSansSemiBold", 'sans-serif'],
+ 'IBMPlexSansMedium': ["IBMPlexSansMedium", 'sans-serif'],
'IBMPlexSansCondensed': ["IBMPlexSansCondensed", 'sans-serif'],
- 'IBMPlexMono': ['"IBM Plex Mono", sans-serif'],
+ 'IBMPlexMono': ["IBMPlexMono", 'sans-serif'],
'PPRightGrotesk': ['PPRightGrotesk, sans-serif'],
+
},
fontSize: {
hXlg: ['73.488px', {
lineHeight: '107%',
}],
hLg: ['36px', {
- lineHeight: '47px',
- letterSpacing: '0em',
+ lineHeight: '100%',
fontWeight: '700',
+
+ }],
+ hLgPP: ['36px', {
+ lineHeight: '100%',
+ fontWeight: '700',
+ letterSpacing: '0.05rem'
+
}],
hMd: ['21px', {
lineHeight: 'normal',