This commit is contained in:
Philippe Torrel
2026-08-25 15:30:29 +02:00
parent c804e05845
commit 27d9bf18aa
43 changed files with 4079 additions and 421 deletions

View File

@@ -0,0 +1,119 @@
[
{
"_id": "675bee96bb39023b77e6cd92",
"title": "Smart Coffee Mug with LCD Level Indicator",
"sku": "MUG0007",
"stock": 25,
"price": 49.99,
"description": "Know exactly how much coffee you have left with this LCD-equipped mug.",
"tagline": "Never face an empty mug again."
},
{
"_id": "675bee96bb39023b77e6cd93",
"title": "Bluetooth Coffee Mug with Fortune Telling Scanner",
"sku": "MUG0013",
"stock": 15,
"price": 99.99,
"description": "Get your daily fortune with every sip using this Bluetooth-connected mug.",
"tagline": "Coffee reading, made smart."
},
{
"_id": "675bee96bb39023b77e6cd94",
"title": "South Pole Tested Pre-Warmed Ink Pen",
"sku": "OFF3145",
"stock": 34,
"price": 29.95,
"description": "Write smoothly even in the coldest conditions with this pre-warmed ink pen.",
"tagline": "The pen that conquers the cold."
},
{
"_id": "675bee96bb39023b77e6cd95",
"title": "Ambidextrous Computer Mouse",
"sku": "COM1001",
"stock": 50,
"price": 19.9,
"description": "Finally, a mouse designed for both left and right-handed users.",
"tagline": "End the left-right struggle."
},
{
"_id": "675bee96bb39023b77e6cd96",
"title": "Easter Egg Themed Webcam",
"sku": "COM0404",
"stock": 8,
"price": 14.99,
"description": "Add some festive flair to your video calls with this Easter egg webcam.",
"tagline": "Happy Easter, every day."
},
{
"_id": "675bee96bb39023b77e6cd97",
"title": "Vulcan Language vi Cheatsheet",
"sku": "COM0001",
"stock": 6,
"price": 9.9,
"description": "Master the Vulcan language and vi editor simultaneously with this handy cheatsheet.",
"tagline": "Learn vi and Vulcan, live long and prosper."
},
{
"_id": "675bee96bb39023b77e6cd98",
"title": "Klingon Language emacs Cheatsheet",
"sku": "COM1536",
"stock": 33,
"price": 9.9,
"description": "Conquer the Klingon language and emacs with this comprehensive cheatsheet.",
"tagline": "Learn emacs and Klingon, qapla'!"
},
{
"_id": "675bee96bb39023b77e6cda0",
"title": "Self-Folding Laundry Basket",
"sku": "HME0023",
"stock": 15,
"price": 79.99,
"description": "Say goodbye to laundry clutter with this self-folding basket.",
"tagline": "Laundry day just got easier."
},
{
"_id": "675bee96bb39023b77e6cda1",
"title": "Noise-Cancelling Headphones for Cats",
"sku": "PET0112",
"stock": 39,
"price": 39.95,
"description": "Give your cat the gift of silence with these noise-canceling headphones.",
"tagline": "Purrfect tranquility for your feline friend."
},
{
"_id": "675bee96bb39023b77e6cda2",
"title": "Glow-in-the-Dark Toilet Paper",
"sku": "HME0221",
"stock": 65,
"price": 12.5,
"description": "Navigate your midnight bathroom trips with ease using this glow-in-the-dark toilet paper.",
"tagline": "A guiding light in the darkness."
},
{
"_id": "675bee96bb39023b77e6cda3",
"title": "Automatic Plant Waterer with Compliment Dispenser",
"sku": "GRD0334",
"stock": 17,
"price": 69.99,
"description": "Keep your plants happy and hydrated with automatic watering and daily compliments.",
"tagline": "Nurture your plants, boost their self-esteem."
},
{
"_id": "675bee96bb39023b77e6cda4",
"title": "Self-Stirring Cereal Bowl",
"sku": "KIT0445",
"stock": 55,
"price": 24.95,
"description": "Enjoy perfectly crunchy cereal every time with this self-stirring bowl.",
"tagline": "No more soggy surprises."
},
{
"_id": "675bee96bb39023b77e6cda5",
"title": "Polygon Planet Lamp",
"sku": "LMP0556",
"stock": 4,
"price": 39.9,
"description": "Transform your space with the enchanting glow of a planetarium-inspired lamp.",
"tagline": "Bring the cosmos into your home."
}
]

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.8 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

View File

@@ -1,184 +0,0 @@
.counter {
font-size: 16px;
padding: 5px 10px;
border-radius: 5px;
color: var(--accent);
background: var(--accent-bg);
border: 2px solid transparent;
transition: border-color 0.3s;
margin-bottom: 24px;
&:hover {
border-color: var(--accent-border);
}
&:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
}
.hero {
position: relative;
.base,
.framework,
.vite {
inset-inline: 0;
margin: 0 auto;
}
.base {
width: 170px;
position: relative;
z-index: 0;
}
.framework,
.vite {
position: absolute;
}
.framework {
z-index: 1;
top: 34px;
height: 28px;
transform: perspective(2000px) rotateZ(300deg) rotateX(44deg) rotateY(39deg)
scale(1.4);
}
.vite {
z-index: 0;
top: 107px;
height: 26px;
width: auto;
transform: perspective(2000px) rotateZ(300deg) rotateX(40deg) rotateY(39deg)
scale(0.8);
}
}
#center {
display: flex;
flex-direction: column;
gap: 25px;
place-content: center;
place-items: center;
flex-grow: 1;
@media (max-width: 1024px) {
padding: 32px 20px 24px;
gap: 18px;
}
}
#next-steps {
display: flex;
border-top: 1px solid var(--border);
text-align: left;
& > div {
flex: 1 1 0;
padding: 32px;
@media (max-width: 1024px) {
padding: 24px 20px;
}
}
.icon {
margin-bottom: 16px;
width: 22px;
height: 22px;
}
@media (max-width: 1024px) {
flex-direction: column;
text-align: center;
}
}
#docs {
border-right: 1px solid var(--border);
@media (max-width: 1024px) {
border-right: none;
border-bottom: 1px solid var(--border);
}
}
#next-steps ul {
list-style: none;
padding: 0;
display: flex;
gap: 8px;
margin: 32px 0 0;
.logo {
height: 18px;
}
a {
color: var(--text-h);
font-size: 16px;
border-radius: 6px;
background: var(--social-bg);
display: flex;
padding: 6px 12px;
align-items: center;
gap: 8px;
text-decoration: none;
transition: box-shadow 0.3s;
&:hover {
box-shadow: var(--shadow);
}
.button-icon {
height: 18px;
width: 18px;
}
}
@media (max-width: 1024px) {
margin-top: 20px;
flex-wrap: wrap;
justify-content: center;
li {
flex: 1 1 calc(50% - 8px);
}
a {
width: 100%;
justify-content: center;
box-sizing: border-box;
}
}
}
#spacer {
height: 88px;
border-top: 1px solid var(--border);
@media (max-width: 1024px) {
height: 48px;
}
}
.ticks {
position: relative;
width: 100%;
&::before,
&::after {
content: '';
position: absolute;
top: -4.5px;
border: 5px solid transparent;
}
&::before {
left: 0;
border-left-color: var(--border);
}
&::after {
right: 0;
border-right-color: var(--border);
}
}

View File

@@ -1,122 +1,17 @@
import { useState } from 'react' import FooterMain from './components/footers/FooterMain';
import heroImg from './assets/hero.png' import HeaderMain from './components/headers/HeaderMain';
import reactLogo from './assets/react.svg'
import viteLogo from './assets/vite.svg'
import './App.css'
function App() { function App(props) {
const [count, setCount] = useState(0) // const { } = props;
return ( return (
<> <>
<section id="center"> <HeaderMain />
<div className="hero"> <main>
<img src={heroImg} className="base" width="170" height="179" alt="" /> <p>Hello</p>
<img src={reactLogo} className="framework" alt="React logo" /> </main>
<img src={viteLogo} className="vite" alt="Vite logo" /> <FooterMain />
</div>
<div>
<h1>Get started</h1>
<p>
Edit <code>src/App.jsx</code> and save to test <code>HMR</code>
</p>
</div>
<button
type="button"
className="counter"
onClick={() => setCount((count) => count + 1)}
>
Count is {count}
</button>
</section>
<div className="ticks"></div>
<section id="next-steps">
<div id="docs">
<svg className="icon" role="presentation" aria-hidden="true">
<use href="/icons.svg#documentation-icon"></use>
</svg>
<h2>Documentation</h2>
<p>Your questions, answered</p>
<ul>
<li>
<a href="https://vite.dev/" target="_blank">
<img className="logo" src={viteLogo} alt="" />
Explore Vite
</a>
</li>
<li>
<a href="https://react.dev/" target="_blank">
<img className="button-icon" src={reactLogo} alt="" />
Learn more
</a>
</li>
</ul>
</div>
<div id="social">
<svg className="icon" role="presentation" aria-hidden="true">
<use href="/icons.svg#social-icon"></use>
</svg>
<h2>Connect with us</h2>
<p>Join the Vite community</p>
<ul>
<li>
<a href="https://github.com/vitejs/vite" target="_blank">
<svg
className="button-icon"
role="presentation"
aria-hidden="true"
>
<use href="/icons.svg#github-icon"></use>
</svg>
GitHub
</a>
</li>
<li>
<a href="https://chat.vite.dev/" target="_blank">
<svg
className="button-icon"
role="presentation"
aria-hidden="true"
>
<use href="/icons.svg#discord-icon"></use>
</svg>
Discord
</a>
</li>
<li>
<a href="https://x.com/vite_js" target="_blank">
<svg
className="button-icon"
role="presentation"
aria-hidden="true"
>
<use href="/icons.svg#x-icon"></use>
</svg>
X.com
</a>
</li>
<li>
<a href="https://bsky.app/profile/vite.dev" target="_blank">
<svg
className="button-icon"
role="presentation"
aria-hidden="true"
>
<use href="/icons.svg#bluesky-icon"></use>
</svg>
Bluesky
</a>
</li>
</ul>
</div>
</section>
<div className="ticks"></div>
<section id="spacer"></section>
</> </>
) );
} }
export default App;
export default App

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.8 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.8 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 150 KiB

View File

@@ -0,0 +1,46 @@
const FooterMain = (props) => {
// const { } = props;
return (
<footer className="m-footer-main footer-main">
<div className="container">
<div className="row">
<div className="col-12 col-md-4">
<div className="box">
<h2>Contact</h2>
<address>
John Smith
<br />
1 Example Street
<br />
Anytown, AB1 2CD
</address>
</div>
</div>
<div className="col-12 col-md-4">
<div className="box">
<h2>More Information</h2>
<nav className="nav-footer">
<ul className="list">
<li>
<a href="#">Imprint</a>
</li>
<li>
<a href="#">Our Privacy Policy</a>
</li>
</ul>
</nav>
</div>
</div>
<div className="col-12 col-md-4">
<div className="box">
<h2>Social Media</h2>
{/* social media icons */}
</div>
</div>
</div>
</div>
</footer>
);
};
export default FooterMain;

View File

@@ -0,0 +1,13 @@
import LogoMain from '../logos/LogoMain';
const HeaderMain = () => {
return (
<header className="m-header-main header-main">
<div className="content-box">
<LogoMain />
</div>
</header>
);
};
export default HeaderMain;

View File

@@ -0,0 +1,12 @@
import Logo from '../../assets/img/logo-react.min.svg';
const LogoMain = (props) => {
// const { } = props;
return (
<figure className="m-logo-main logo-main">
<img src={Logo} alt="React" />
</figure>
);
};
export default LogoMain;

View File

@@ -1,111 +0,0 @@
:root {
--text: #6b6375;
--text-h: #08060d;
--bg: #fff;
--border: #e5e4e7;
--code-bg: #f4f3ec;
--accent: #aa3bff;
--accent-bg: rgba(170, 59, 255, 0.1);
--accent-border: rgba(170, 59, 255, 0.5);
--social-bg: rgba(244, 243, 236, 0.5);
--shadow:
rgba(0, 0, 0, 0.1) 0 10px 15px -3px, rgba(0, 0, 0, 0.05) 0 4px 6px -2px;
--sans: system-ui, 'Segoe UI', Roboto, sans-serif;
--heading: system-ui, 'Segoe UI', Roboto, sans-serif;
--mono: ui-monospace, Consolas, monospace;
font: 18px/145% var(--sans);
letter-spacing: 0.18px;
color-scheme: light dark;
color: var(--text);
background: var(--bg);
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
@media (max-width: 1024px) {
font-size: 16px;
}
}
@media (prefers-color-scheme: dark) {
:root {
--text: #9ca3af;
--text-h: #f3f4f6;
--bg: #16171d;
--border: #2e303a;
--code-bg: #1f2028;
--accent: #c084fc;
--accent-bg: rgba(192, 132, 252, 0.15);
--accent-border: rgba(192, 132, 252, 0.5);
--social-bg: rgba(47, 48, 58, 0.5);
--shadow:
rgba(0, 0, 0, 0.4) 0 10px 15px -3px, rgba(0, 0, 0, 0.25) 0 4px 6px -2px;
}
#social .button-icon {
filter: invert(1) brightness(2);
}
}
body {
margin: 0;
}
#root {
width: 1126px;
max-width: 100%;
margin: 0 auto;
text-align: center;
border-inline: 1px solid var(--border);
min-height: 100svh;
display: flex;
flex-direction: column;
box-sizing: border-box;
}
h1,
h2 {
font-family: var(--heading);
font-weight: 500;
color: var(--text-h);
}
h1 {
font-size: 56px;
letter-spacing: -1.68px;
margin: 32px 0;
@media (max-width: 1024px) {
font-size: 36px;
margin: 20px 0;
}
}
h2 {
font-size: 24px;
line-height: 118%;
letter-spacing: -0.24px;
margin: 0 0 8px;
@media (max-width: 1024px) {
font-size: 20px;
}
}
p {
margin: 0;
}
code,
.counter {
font-family: var(--mono);
display: inline-flex;
border-radius: 4px;
color: var(--text-h);
}
code {
font-size: 15px;
line-height: 135%;
padding: 4px 8px;
background: var(--code-bg);
}

View File

@@ -1,10 +1,13 @@
import { StrictMode } from 'react' import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client' import { createRoot } from 'react-dom/client';
import './index.css'
import App from './App.jsx' // eigene separate Gestaltung mit main.scss (beinhaltet boostrap)
import './styles/main.scss';
import App from './App.jsx';
createRoot(document.getElementById('root')).render( createRoot(document.getElementById('root')).render(
<StrictMode> <StrictMode>
<App /> <App />
</StrictMode>, </StrictMode>,
) );

View File

@@ -16,7 +16,7 @@
max-height: 380px; max-height: 380px;
} }
background: $color-3 url('../img/header-image.webp') center no-repeat; background: $color-3 url('/img/header-bg.jpg') center no-repeat;
background-size: cover; background-size: cover;
&--min { &--min {

View File

@@ -1,7 +1,7 @@
@import 'button'; @import 'button';
@import 'footer-main'; @import 'footer-main';
@import 'header-main'; @import 'header-main';
@import 'inputAmount'; // @import 'inputAmount';
@import 'logo-main'; @import 'logo-main';
@import 'nav-menu'; @import 'nav-menu';
// @import 'menu-main'; // @import 'menu-main';

View File

@@ -1,7 +1,23 @@
import react from '@vitejs/plugin-react' import react from '@vitejs/plugin-react';
import { defineConfig } from 'vite' import { defineConfig } from 'vite';
// https://vite.dev/config/ // https://vite.dev/config/
export default defineConfig({ export default defineConfig({
plugins: [react()], plugins: [react()],
}) css: {
devSourcemap: true, // https://github.com/vitejs/vite/issues/8656#issuecomment-1159730991
preprocessorOptions: {
scss: {
quietDeps: true, // Unix
silenceDeprecations: [
'color-functions',
'global-builtin',
'import',
'legacy-js-api',
'abs-percent',
'if-function',
],
},
},
},
});