Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Before a pull request can be merged:
request, and approvals from staff do not count — you review each other's
code.
2. **Every review comment must be marked resolved.** Reply to each one, fix it
or explain why not, then click *Resolve conversation*.
or explain why not, then click _Resolve conversation_.
3. **Pushing new commits dismisses the approval**, so if you change something
after being approved, ask for another review. This is deliberate: what was
approved is what gets merged.
approved is what gets merged.
206 changes: 42 additions & 164 deletions t29-project-1/src/App.css
Original file line number Diff line number Diff line change
@@ -1,185 +1,63 @@
.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 {
/* Page Wrapper */
.app-container {
max-width: 800px;
margin: 0 auto;
padding: 1.5rem;
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;
}
gap: 1.5rem;
width: 100%;
}

#next-steps {
/* 1. FAVORITES STAR: Far Top Right */
.top-bar {
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);
}
justify-content: flex-end; /* Pushes star to the right */
width: 100%;
}

#next-steps ul {
list-style: none;
padding: 0;
/* 2. NAVIGATION & CARD: Compact Center Layout */
.nav-layout {
display: flex;
gap: 8px;
margin: 32px 0 0;

.logo {
height: 18px;
}
flex-direction: row;
align-items: center;
justify-content: center;
gap: 1rem; /* Small gap keeps arrow buttons close to the card */
margin: 1rem auto 0 auto; /* Centers the layout block */
width: 100%;
max-width: 580px; /* RESTRICTS WIDTH: Stops buttons from flying far apart */
}

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;
/* Make CatCard take central space naturally */
.nav-layout > article,
.nav-layout > .cat-card {
flex: 1;
width: 100%;
}

&:hover {
box-shadow: var(--shadow);
}
.button-icon {
height: 18px;
width: 18px;
}
}
/* Keep arrow buttons at their exact fixed size */
.nav-layout > button {
flex-shrink: 0;
}

@media (max-width: 1024px) {
margin-top: 20px;
/* Mobile Responsive Adjustments */
@media (max-width: 600px) {
.nav-layout {
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;
.nav-layout > article,
.nav-layout > .cat-card {
flex: 0 0 100%;
order: 1; /* Card on top */
}
}

.ticks {
position: relative;
width: 100%;

&::before,
&::after {
content: '';
position: absolute;
top: -4.5px;
border: 5px solid transparent;
.nav-layout > button:first-of-type {
order: 2; /* Previous button bottom-left */
}

&::before {
left: 0;
border-left-color: var(--border);
}
&::after {
right: 0;
border-right-color: var(--border);
.nav-layout > button:last-of-type {
order: 3; /* Next button bottom-right */
}
}

Expand Down
142 changes: 24 additions & 118 deletions t29-project-1/src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,125 +1,31 @@
import { useState } from 'react';
import heroImg from './assets/hero.png';
import reactLogo from './assets/react.svg';
import viteLogo from './assets/vite.svg';
import { NavPrevious, NavNext } from './components/ActionButtons';
import { CatCard } from './components/CatCard';
import { Favorites } from './components/Favorites';
import './App.css';
import Cat from './components/Cat';

function App() {
const [count, setCount] = useState(0);
export default function App() {
const [isViewingFavorites, setIsViewingFavorites] = useState(false);

return (
<>
<section id="center">
<div className="hero">
<img src={heroImg} className="base" width="170" height="179" alt="" />
<img src={reactLogo} className="framework" alt="React logo" />
<img src={viteLogo} className="vite" alt="Vite logo" />
</div>
<div>
<h1>Get started</h1>
<p>
Edit <code>src/App.tsx</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>

<Cat />
const handlePrevious = () => {};
const handleNext = () => {};

<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>
return (
<main className="app-container">
{/* Top bar containing ONLY the Star Button */}
<header className="top-bar">
<Favorites
onToggleFavorites={() => setIsViewingFavorites(!isViewingFavorites)}
isViewingFavorites={isViewingFavorites}
/>
</header>

<div className="ticks"></div>
<section id="spacer"></section>
</>
{/* 3-Column Navigation Grid */}
<nav className="nav-layout" aria-label="Main content navigation">
<NavPrevious onClick={handlePrevious} />
<CatCard />
<NavNext onClick={handleNext} />
</nav>
</main>
);
}

export default App;
}
Loading