├── .gitignore
├── .vscode
├── extensions.json
└── launch.json
├── README.md
├── astro.config.mjs
├── package-lock.json
├── package.json
├── postcss.config.js
├── public
└── icons
│ ├── Group.svg
│ ├── Option.svg
│ ├── Pie1.svg
│ ├── Pie2.svg
│ ├── Star.svg
│ └── favicon.svg
├── src
├── components
│ ├── AuthNum.jsx
│ ├── BarChart.jsx
│ ├── LastSalesTable.jsx
│ ├── LineChart.jsx
│ ├── LinkButton.jsx
│ ├── MarketTable.jsx
│ ├── SmallButton.jsx
│ ├── lastsales
│ │ └── index.jsx
│ ├── market
│ │ ├── components
│ │ │ └── PieChart.jsx
│ │ └── index.jsx
│ └── state
│ │ ├── components
│ │ ├── Header.jsx
│ │ ├── MarketRange.jsx
│ │ ├── SalesProgress.jsx
│ │ ├── States.jsx
│ │ ├── StatesChart.jsx
│ │ └── TotalPrice.jsx
│ │ └── index.jsx
├── env.d.ts
├── layouts
│ └── Layout.astro
├── pages
│ └── index.astro
└── styles
│ └── global.css
├── tailwind.config.js
└── tsconfig.json
/.gitignore:
--------------------------------------------------------------------------------
1 | # build output
2 | dist/
3 |
4 | # generated types
5 | .astro/
6 |
7 | # dependencies
8 | node_modules/
9 |
10 | # logs
11 | npm-debug.log*
12 | yarn-debug.log*
13 | yarn-error.log*
14 | pnpm-debug.log*
15 |
16 | # environment variables
17 | .env
18 | .env.production
19 |
20 | # macOS-specific files
21 | .DS_Store
22 |
23 | # jetbrains setting folder
24 | .idea/
25 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": ["astro-build.astro-vscode"],
3 | "unwantedRecommendations": []
4 | }
5 |
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "0.2.0",
3 | "configurations": [
4 | {
5 | "command": "./node_modules/.bin/astro dev",
6 | "name": "Development server",
7 | "request": "launch",
8 | "type": "node-terminal"
9 | }
10 | ]
11 | }
12 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Astro Starter Kit: Basics
2 |
3 | ```sh
4 | npm create astro@latest -- --template basics
5 | ```
6 |
7 | [](https://stackblitz.com/github/withastro/astro/tree/latest/examples/basics)
8 | [](https://codesandbox.io/p/sandbox/github/withastro/astro/tree/latest/examples/basics)
9 | [](https://codespaces.new/withastro/astro?devcontainer_path=.devcontainer/basics/devcontainer.json)
10 |
11 | > 🧑🚀 **Seasoned astronaut?** Delete this file. Have fun!
12 |
13 | 
14 |
15 | ## 🚀 Project Structure
16 |
17 | Inside of your Astro project, you'll see the following folders and files:
18 |
19 | ```text
20 | /
21 | ├── public/
22 | │ └── favicon.svg
23 | ├── src/
24 | │ ├── components/
25 | │ │ └── Card.astro
26 | │ ├── layouts/
27 | │ │ └── Layout.astro
28 | │ └── pages/
29 | │ └── index.astro
30 | └── package.json
31 | ```
32 |
33 | Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name.
34 |
35 | There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components.
36 |
37 | Any static assets, like images, can be placed in the `public/` directory.
38 |
39 | ## 🧞 Commands
40 |
41 | All commands are run from the root of the project, from a terminal:
42 |
43 | | Command | Action |
44 | | :------------------------ | :----------------------------------------------- |
45 | | `npm install` | Installs dependencies |
46 | | `npm run dev` | Starts local dev server at `localhost:4321` |
47 | | `npm run build` | Build your production site to `./dist/` |
48 | | `npm run preview` | Preview your build locally, before deploying |
49 | | `npm run astro ...` | Run CLI commands like `astro add`, `astro check` |
50 | | `npm run astro -- --help` | Get help using the Astro CLI |
51 |
52 | ## 👀 Want to learn more?
53 |
54 | Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat).
55 |
--------------------------------------------------------------------------------
/astro.config.mjs:
--------------------------------------------------------------------------------
1 | // astro.config.mjs
2 | import { defineConfig } from 'astro/config';
3 | import react from '@astrojs/react';
4 |
5 | export default defineConfig({
6 | integrations: [react()],
7 | });
8 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "strong-sphere",
3 | "type": "module",
4 | "version": "0.0.1",
5 | "scripts": {
6 | "dev": "astro dev",
7 | "start": "astro dev",
8 | "build": "astro build",
9 | "preview": "astro preview",
10 | "astro": "astro"
11 | },
12 | "dependencies": {
13 | "@astrojs/react": "^3.3.4",
14 | "astro": "^4.8.6",
15 | "chart.js": "^4.4.3",
16 | "react": "^18.3.1",
17 | "react-chartjs-2": "^5.2.0",
18 | "react-dom": "^18.3.1",
19 | "recharts": "^2.12.7"
20 | },
21 | "devDependencies": {
22 | "autoprefixer": "^10.4.19",
23 | "postcss": "^8.4.38",
24 | "tailwindcss": "^3.4.3"
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
--------------------------------------------------------------------------------
/public/icons/Group.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/public/icons/Option.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/public/icons/Pie1.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/public/icons/Pie2.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/public/icons/Star.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/public/icons/favicon.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
--------------------------------------------------------------------------------
/src/components/AuthNum.jsx:
--------------------------------------------------------------------------------
1 | const AuthNum = () => {
2 | return (
3 |
4 | );
5 | };
6 | export default AuthNum;
7 |
--------------------------------------------------------------------------------
/src/components/BarChart.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | const data = [
4 | { month: 'Jan', value: 70 },
5 | { month: 'Feb', value: 140 },
6 | { month: 'Mar', value: 120 },
7 | { month: 'Apr', value: 150 },
8 | { month: 'May', value: 110 },
9 | { month: 'Jun', value: 165 },
10 | { month: 'Jul', value: 100 },
11 | { month: 'Aug', value: 140 },
12 | { month: 'Sep', value: 60 },
13 | { month: 'Oct', value: 120 },
14 | { month: 'Nov', value: 70 },
15 | { month: 'Dec', value: 110 }
16 | ];
17 |
18 | const BarChart = () => {
19 | return (
20 |
21 | {data.map((item, index) => (
22 |
23 |
32 |
{item.month}
33 |
34 | ))}
35 |
36 | );
37 | }
38 |
39 | export default BarChart;
40 |
--------------------------------------------------------------------------------
/src/components/LastSalesTable.jsx:
--------------------------------------------------------------------------------
1 | import LinkButton from "./LinkButton";
2 |
3 | const LastSalesTable = (props) => {
4 | return (
5 | <>
6 |
7 |
8 |
9 |
{props.name}
10 |
{props.available}
11 |
12 |
13 |
14 |
{props.maxPrice}
15 |
16 |
17 | >
18 | );
19 | };
20 | export default LastSalesTable;
21 |
--------------------------------------------------------------------------------
/src/components/LineChart.jsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { LineChart, Line, ResponsiveContainer, Legend } from "recharts";
3 | import BarChart from "./BarChart";
4 |
5 | const data = [
6 | { name: "Jan", Retail: 3000, Market: 2400 },
7 | { name: "Feb", Retail: 4000, Market: 3398 },
8 | { name: "Mar", Retail: 5000, Market: 6800 },
9 | { name: "Apr", Retail: 2780, Market: 3908 },
10 | { name: "May", Retail: 1890, Market: 4800 },
11 | { name: "Jun", Retail: 2390, Market: 3800 },
12 | { name: "Jul", Retail: 3490, Market: 4300 },
13 | { name: "Aug", Retail: 2000, Market: 2400 },
14 | { name: "Sep", Retail: 2780, Market: 3908 },
15 | { name: "Oct", Retail: 1890, Market: 4800 },
16 | { name: "Nov", Retail: 2390, Market: 3800 },
17 | { name: "Dec", Retail: 3490, Market: 4300 },
18 | ];
19 |
20 | const CustomChart = ({ children }) => {
21 | return (
22 |
23 |
30 |
31 |
32 |
33 |
34 |
35 |
43 |
51 |
52 |
53 |
54 |
55 | {children}
56 |
57 |
58 |
59 | );
60 | };
61 |
62 | export default CustomChart;
63 |
--------------------------------------------------------------------------------
/src/components/LinkButton.jsx:
--------------------------------------------------------------------------------
1 | const LinkButton = () => {
2 | return (
3 |
4 | Link
5 |
6 | );
7 | };
8 | export default LinkButton;
9 |
--------------------------------------------------------------------------------
/src/components/MarketTable.jsx:
--------------------------------------------------------------------------------
1 | import LinkButton from "./LinkButton";
2 |
3 | const MarketTable = (props) => {
4 | return (
5 | <>
6 |
7 |
8 |
9 |
{props.name}
10 |
11 | Over {props.available} Available
12 |
13 |
14 |
15 |
16 |
17 | Max Price {props.maxPrice} Min Price {props.minPrice}
18 |
19 |
20 |
21 | >
22 | );
23 | };
24 | export default MarketTable;
25 |
--------------------------------------------------------------------------------
/src/components/SmallButton.jsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 |
3 | const SmallButton = (props) => {
4 | return {props.name} ;
5 | };
6 |
7 | export default SmallButton;
8 |
--------------------------------------------------------------------------------
/src/components/lastsales/index.jsx:
--------------------------------------------------------------------------------
1 | import LinkButton from "../LinkButton";
2 | import SmallButton from "../SmallButton";
3 | import LastSalesTable from "../LastSalesTable";
4 |
5 | const lastSales = [
6 | { name: "Ebay", available: 2938, maxPrice: "16.690 €", minPrice: "14.690 €" },
7 | {
8 | name: "WordWideWatch",
9 | available: 1790,
10 | maxPrice: "16.690 €",
11 | minPrice: "14.690 €",
12 | },
13 | {
14 | name: "SearchWatch",
15 | available: 1234,
16 | maxPrice: "16.690 €",
17 | minPrice: "14.690 €",
18 | },
19 | { name: "SEW", available: 456, maxPrice: "16.690 €", minPrice: "14.690 €" },
20 | {
21 | name: "Chronos24",
22 | available: 234,
23 | maxPrice: "16.690 €",
24 | minPrice: "14.690 €",
25 | },
26 | { name: "Ebay", available: 2938, maxPrice: "16.690 €", minPrice: "14.690 €" },
27 | {
28 | name: "WordWideWatch",
29 | available: 1790,
30 | maxPrice: "16.690 €",
31 | minPrice: "14.690 €",
32 | },
33 | {
34 | name: "SearchWatch",
35 | available: 1234,
36 | maxPrice: "16.690 €",
37 | minPrice: "14.690 €",
38 | },
39 | { name: "SEW", available: 456, maxPrice: "16.690 €", minPrice: "14.690 €" },
40 | ];
41 |
42 | const LastSales = () => {
43 | return (
44 |
45 |
46 |
47 |
LAST SALES
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 | {lastSales.map((item, index) => (
58 |
64 |
69 |
70 | ))}
71 |
72 |
73 |
74 | );
75 | };
76 |
77 | export default LastSales;
78 |
--------------------------------------------------------------------------------
/src/components/market/components/PieChart.jsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { Pie } from "react-chartjs-2";
3 | import { Chart as ChartJS, ArcElement, Tooltip, Legend } from "chart.js";
4 | ChartJS.register(ArcElement, Tooltip, Legend);
5 | const PieChart = () => {
6 | const data = {
7 | labels: [
8 | "Ebay",
9 | "MarketWatch",
10 | "Chronos24",
11 | "MyWatches",
12 | "WatchChart",
13 | "Others",
14 | ],
15 | datasets: [
16 | {
17 | label: "Watches in the market",
18 | data: [37.5, 12.5, 12.5, 12.5, 12.5, 12.5],
19 | backgroundColor: [
20 | "#FFC403",
21 | "#3B009A",
22 | "#560BAD",
23 | "#7209B7",
24 | "#B5179E",
25 | "#F72585",
26 | ],
27 | borderWidth: 0,
28 | },
29 | ],
30 | };
31 | const options = {
32 | plugins: {
33 | legend: {
34 | display: false,
35 | },
36 | },
37 | };
38 | return (
39 |
40 |
41 |
42 |
43 | Market Watch Share
44 |
45 | around over 100 website
46 |
47 |
48 |
49 |
May, 2024
50 |
Watches in the Market
51 |
52 |
57 |
58 |
59 |
List Countries
60 |
61 |
62 |
63 |
64 |
72 | {data.labels.map((label, index) => (
73 |
85 | ))}
86 |
87 |
88 |
89 | );
90 | };
91 | export default PieChart;
92 |
--------------------------------------------------------------------------------
/src/components/market/index.jsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from "react";
2 | import PieChart from "./components/PieChart";
3 | import SmallButton from "../SmallButton";
4 | import MarketTable from "../MarketTable";
5 |
6 | const marketData = [
7 | { name: "Ebay", available: 2938, maxPrice: "16.690 €", minPrice: "14.690 €" },
8 | {
9 | name: "WordWideWatch",
10 | available: 1790,
11 | maxPrice: "16.690 €",
12 | minPrice: "14.690 €",
13 | },
14 | {
15 | name: "SearchWatch",
16 | available: 1234,
17 | maxPrice: "16.690 €",
18 | minPrice: "14.690 €",
19 | },
20 | { name: "SEW", available: 456, maxPrice: "16.690 €", minPrice: "14.690 €" },
21 | {
22 | name: "Chronos24",
23 | available: 234,
24 | maxPrice: "16.690 €",
25 | minPrice: "14.690 €",
26 | },
27 | { name: "SEW", available: 456, maxPrice: "16.690 €", minPrice: "14.690 €" },
28 | {
29 | name: "Chronos24",
30 | available: 234,
31 | maxPrice: "16.690 €",
32 | minPrice: "14.690 €",
33 | },
34 | {
35 | name: "WordWideWatch",
36 | available: 1790,
37 | maxPrice: "16.690 €",
38 | minPrice: "14.690 €",
39 | },
40 | { name: "Ebay", available: 2938, maxPrice: "16.690 €", minPrice: "14.690 €" },
41 | {
42 | name: "SearchWatch",
43 | available: 1234,
44 | maxPrice: "16.690 €",
45 | minPrice: "14.690 €",
46 | },
47 | { name: "SEW", available: 456, maxPrice: "16.690 €", minPrice: "14.690 €" },
48 | {
49 | name: "WordWideWatch",
50 | available: 1790,
51 | maxPrice: "16.690 €",
52 | minPrice: "14.690 €",
53 | },
54 | { name: "Ebay", available: 2938, maxPrice: "16.690 €", minPrice: "14.690 €" },
55 | {
56 | name: "SearchWatch",
57 | available: 1234,
58 | maxPrice: "16.690 €",
59 | minPrice: "14.690 €",
60 | },
61 | { name: "SEW", available: 456, maxPrice: "16.690 €", minPrice: "14.690 €" },
62 | {
63 | name: "Chronos24",
64 | available: 234,
65 | maxPrice: "16.690 €",
66 | minPrice: "14.690 €",
67 | },
68 | { name: "SEW", available: 456, maxPrice: "16.690 €", minPrice: "14.690 €" },
69 | {
70 | name: "Chronos24",
71 | available: 234,
72 | maxPrice: "16.690 €",
73 | minPrice: "14.690 €",
74 | },
75 | {
76 | name: "WordWideWatch",
77 | available: 1790,
78 | maxPrice: "16.690 €",
79 | minPrice: "14.690 €",
80 | },
81 | { name: "Ebay", available: 2938, maxPrice: "16.690 €", minPrice: "14.690 €" },
82 | {
83 | name: "SearchWatch",
84 | available: 1234,
85 | maxPrice: "16.690 €",
86 | minPrice: "14.690 €",
87 | },
88 | { name: "SEW", available: 456, maxPrice: "16.690 €", minPrice: "14.690 €" },
89 | {
90 | name: "WordWideWatch",
91 | available: 1790,
92 | maxPrice: "16.690 €",
93 | minPrice: "14.690 €",
94 | },
95 | { name: "Ebay", available: 2938, maxPrice: "16.690 €", minPrice: "14.690 €" },
96 | {
97 | name: "SearchWatch",
98 | available: 1234,
99 | maxPrice: "16.690 €",
100 | minPrice: "14.690 €",
101 | },
102 | {
103 | name: "SearchWatch",
104 | available: 1234,
105 | maxPrice: "16.690 €",
106 | minPrice: "14.690 €",
107 | },
108 | { name: "SEW", available: 456, maxPrice: "16.690 €", minPrice: "14.690 €" },
109 | ];
110 |
111 | const MarketShare = () => {
112 | const [active, setActive] = useState(1);
113 | const dataPerPage = 5;
114 | const totalPages = Math.ceil(marketData.length / dataPerPage);
115 | const displayedPages = marketData.slice(
116 | (active - 1) * dataPerPage,
117 | active * dataPerPage
118 | );
119 |
120 | const next = () => {
121 | if (active < totalPages) {
122 | setActive(active + 1);
123 | }
124 | };
125 |
126 | const prev = () => {
127 | if (active > 1) {
128 | setActive(active - 1);
129 | }
130 | };
131 |
132 | return (
133 |
134 |
135 |
Market Share (23456)
136 |
137 | {displayedPages.map((item, index) => (
138 |
142 |
148 |
149 | ))}
150 |
151 |
152 |
157 | {"<"}
158 |
159 | {Array.from({ length: totalPages }, (_, i) => i + 1).map((index) => (
160 | setActive(index)}
166 | >
167 | {index}
168 |
169 | ))}
170 |
175 | {">"}
176 |
177 |
178 |
179 |
180 |
181 | );
182 | };
183 |
184 | export default MarketShare;
185 |
--------------------------------------------------------------------------------
/src/components/state/components/Header.jsx:
--------------------------------------------------------------------------------
1 | const Header = () => {
2 | return (
3 |
4 |
5 |
GMT Master II
6 |
7 |
GMT-Master II (Batgirl)
8 |
9 | Current Production Model
10 |
11 |
12 |
13 | );
14 | };
15 | export default Header;
16 |
--------------------------------------------------------------------------------
/src/components/state/components/MarketRange.jsx:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useRef } from "react";
2 | import { Chart } from "chart.js/auto";
3 | const data = {
4 | labels: ["Jan", "Feb", "Mar", "Apr", "May", "Jun"],
5 | datasets: [
6 | {
7 | label: "Group A",
8 | data: [14500, 15000, 14000, 16500, 14000, 15500, 16000, 15000],
9 | borderColor: "#FF0066",
10 | backgroundColor: "rgba(255, 0, 102, 0.2)",
11 | fill: false,
12 | tension: 0.4,
13 | pointRadius: 0, // No peak circles
14 | pointHoverRadius: 0, // No hover effect on points
15 | },
16 | {
17 | label: "Group B",
18 | data: [14000, 14500, 13500, 13800, 13200, 15000, 15500, 14500],
19 | borderColor: "#FFC107",
20 | backgroundColor: "rgba(255, 193, 7, 0.2)",
21 | fill: false,
22 | tension: 0.4,
23 | pointRadius: 0, // No peak circles
24 | pointHoverRadius: 0, // No hover effect on points
25 | },
26 | ],
27 | };
28 | const MarketRangeChart = () => {
29 | const canvasRef = useRef(null);
30 | useEffect(() => {
31 | const canvas = canvasRef.current;
32 | if (canvas) {
33 | const ctx = canvas.getContext("2d");
34 | if (ctx) {
35 | new Chart(ctx, {
36 | type: "line",
37 | data: data,
38 | options: {
39 | responsive: true,
40 | maintainAspectRatio: false,
41 | scales: {
42 | y: {
43 | beginAtZero: false,
44 | min: 13000,
45 | max: 17000,
46 | ticks: {
47 | color: "white",
48 | stepSize: 1000, // Setting y-axis interval to 1000
49 | },
50 | grid: {
51 | color: "rgba(255, 255, 255, 0.1)",
52 | },
53 | },
54 | x: {
55 | ticks: {
56 | color: "white",
57 | padding: 15,
58 | },
59 | grid: {
60 | display: false,
61 | },
62 | },
63 | },
64 | plugins: {
65 | legend: {
66 | labels: {
67 | color: "white",
68 | },
69 | },
70 | },
71 | },
72 | });
73 | }
74 | }
75 | }, []);
76 | return (
77 |
78 |
79 | Market Range
80 |
81 | Last 12 M
82 |
83 |
84 |
85 |
86 |
87 |
88 | Good range pricing. Under 15,000€ is a very good pricing.
89 |
90 | Maecenas faucibus mollis interdum. Nulla vitae elit libero, a pharetra
91 | augue. Donec id elit non mi porta gravida at eget metus.
92 |
93 |
94 |
95 | );
96 | };
97 | export default MarketRangeChart;
98 |
--------------------------------------------------------------------------------
/src/components/state/components/SalesProgress.jsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from "react";
2 |
3 | const years = [2021, 2022, 2023, 2024];
4 | const months = ["Nov", "Dec", "Jan", "Feb", "Mar", "Apr"];
5 |
6 | const SalesProgress = () => {
7 | const [selectedYear, setSelectedYear] = useState(2021);
8 | return (
9 | <>
10 |
11 |
12 |
13 |
14 | Sales this Month
15 |
16 |
17 | 263 Sales in the last year
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 | {years.map((year) => (
26 | setSelectedYear(year)}
29 | className={`px-3 py-1 rounded-full text-xs font-normal ${
30 | selectedYear === year
31 | ? "bg-[#3DE4ED]"
32 | : "text-white border-2 border-[#3DE4ED]"
33 | }`}
34 | >
35 | {year}
36 |
37 | ))}
38 |
39 |
40 | Minim dolor in amet nulla laboris enim dolore consequatt.
41 |
42 |
43 | {months.map((month) => (
44 |
45 | {month}
46 |
47 | ))}
48 |
49 |
50 | {Array(12 * months.length)
51 | .fill(0)
52 | .map((_, idx) => {
53 | const randomValue = Math.floor(Math.random() * 4); // Generate a random integer between 0 and 3
54 | const className = `h-4 w-4 rounded-[1px] ${
55 | randomValue === 0
56 | ? "bg-[#00202D]"
57 | : randomValue === 1
58 | ? "bg-[#003246]"
59 | : randomValue === 2
60 | ? "bg-[#007C84]"
61 | : "bg-[#A3FECC]"
62 | }`;
63 | return
;
64 | })}
65 |
66 |
79 |
80 |
81 |
82 | Show more activity
83 |
84 |
85 | >
86 | );
87 | };
88 |
89 | export default SalesProgress;
90 |
--------------------------------------------------------------------------------
/src/components/state/components/States.jsx:
--------------------------------------------------------------------------------
1 | import { useState } from "react";
2 | import SalesProgress from "./SalesProgress";
3 |
4 | const Chart = ({ total, description, children }) => {
5 | return (
6 |
7 |
8 |
{total}
9 |
{description}
10 |
11 | {children }
12 |
13 |
14 |
15 | );
16 | };
17 |
18 | export default Chart;
19 |
--------------------------------------------------------------------------------
/src/components/state/components/StatesChart.jsx:
--------------------------------------------------------------------------------
1 | import LineChart from "../../LineChart";
2 | import BarChart from "../../BarChart";
3 | import SmallButton from "../../SmallButton";
4 |
5 | const StatesChart = () => {
6 | return (
7 | <>
8 |
9 |
GMT Master Batgirl
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | >
22 | );
23 | };
24 | export default StatesChart;
25 |
--------------------------------------------------------------------------------
/src/components/state/components/TotalPrice.jsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 |
3 | const TotalPrice = (props) => {
4 | const colorStyle = { color: props.color };
5 |
6 | return (
7 |
8 |
9 |
{props.title}
10 |
{props.description}
11 |
12 |
13 |
{props.total}
14 |
{props.date}
15 |
16 |
17 | );
18 | };
19 | export default TotalPrice;
--------------------------------------------------------------------------------
/src/components/state/index.jsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import States from "./components/States";
3 | import Header from "./components/Header";
4 | import TotalPrice from "./components/TotalPrice";
5 | import AuthNum from "../AuthNum";
6 | import SalesProgress from "./components/SalesProgress";
7 | import MarketRangeChart from "./components/MarketRange";
8 | import StatesChart from "./components/StatesChart";
9 |
10 | const State = () => {
11 | return (
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
26 |
27 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 | The Rolex 126710BLNR is a watch model from the Rolex brand
53 | and GMT-Master collection. As of May 2024, the average price of
54 | the Rolex GMT-Master II (126710BLNR) on the private sales market
55 | is €15,159, while you can expect to pay €16,244 from a secondary
56 | market dealer.
57 |
58 |
59 | Praesent commodo cursus magna, vel scelerisque nisl consectetur
60 | et. Nulla vitae elit libero, a pharetra augue. Vestibulum id
61 | ligula porta felis euismod semper.
62 |
63 | Praesent commodo cursus magna, vel scelerisque nisl consectetur
64 | et. Nulla vitae elit libero, a pharetra augue. Vestibulum id
65 | ligula porta felis euismod semper.Praesent commodo cursus magna,
66 | vel scelerisque nisl consectetur et. Nulla vitae elit libero, a
67 | pharetra augue.
68 |
69 |
70 |
71 |
72 | Steel
73 |
74 |
75 | 40mm
76 |
77 |
78 | 100meters
79 |
80 |
81 |
82 | all specs
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 | );
99 | };
100 |
101 | export default State;
102 |
--------------------------------------------------------------------------------
/src/env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/src/layouts/Layout.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import "../styles/global.css";
3 | interface Props {
4 | title: string;
5 | }
6 |
7 | const { title } = Astro.props;
8 | ---
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | {title}
19 |
23 |
26 |
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/src/pages/index.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import Layout from "../layouts/Layout.astro";
3 | import Chart from "../components/state/components/States";
4 | import MarketShare from "../components/market";
5 | import LastSales from "../components/lastsales"
6 | import State from "../components/state";
7 | ---
8 |
9 |
10 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/src/styles/global.css:
--------------------------------------------------------------------------------
1 | /* src/styles/global.css */
2 | @tailwind base;
3 | @tailwind components;
4 | @tailwind utilities;
5 |
--------------------------------------------------------------------------------
/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | export default {
3 | content: [
4 | "./src/**/*.{astro,html,js,jsx,ts,tsx,vue}",
5 | "./components/**/*.{astro,html,js,jsx,ts,tsx}",
6 | ],
7 | theme: {
8 | extend: {
9 | backgroundImage: {
10 | 'gradient-three-color': 'linear-gradient(to right, #1FA2FF, #12D8FA, #A6FFCB)',
11 | },
12 | fontFamily: {
13 | montserrat: ['Montserrat', 'sans-serif'],
14 | },
15 | },
16 | },
17 | plugins: [],
18 | }
19 |
20 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "astro/tsconfigs/base"
3 | }
4 |
--------------------------------------------------------------------------------