Реализуй карточку товара с эмодзи 💻, кнопками “Добавить” и “Убрать”, ограничениями количества (0…stock) и пересчётом цены.
Интерактивный UI. Контролируй количество, не выходя за границы — это базовая логика корзины.
quantity с начальным значением 0.stock, “Убрать” уменьшает до 0.unitPrice * quantity. Обновляй её на каждый клик.Карточка товара с эмодзи 💻, названием, остатком, контролами и итоговой ценой.
Финальный результат должен быть таким:

const [quantity, setQuantity] = useState(0).quantity > 0 и quantity < stock.import React, { useState } from 'react';
import './styles.css';
export function ProductCard({ title, unitPrice, stock }) {
const [quantity, setQuantity] = useState(0);
const canDecrease = quantity > 0;
const canIncrease = quantity < stock;
const total = unitPrice * quantity;
return (
<article className="product-card" data-testid="product-card">
<div className="emoji" aria-hidden="true">💻</div>
<div>
<h3 className="product-title">{title}</h3>
<p className="product-stock">Остаток на складе: {stock}</p>
</div>
<div className="qty-controls">
<button className="action-button" onClick={() => canDecrease && setQuantity(q => q - 1)} disabled={!canDecrease}>
Убрать
</button>
<span aria-label="quantity">{quantity}</span>
<button className="action-button" onClick={() => canIncrease && setQuantity(q => q + 1)} disabled={!canIncrease}>
Добавить
</button>
</div>
<p className="price">Итого: {total} ₽</p>
</article>
);
}
export default function App() {
return (
<main className="challenge-container">
<section>
<ProductCard title="Ноутбук Pro" unitPrice={999} stock={3} />
</section>
</main>
);
}Реализуй карточку товара с эмодзи 💻, кнопками “Добавить” и “Убрать”, ограничениями количества (0…stock) и пересчётом цены.
Интерактивный UI. Контролируй количество, не выходя за границы — это базовая логика корзины.
quantity с начальным значением 0.stock, “Убрать” уменьшает до 0.unitPrice * quantity. Обновляй её на каждый клик.Карточка товара с эмодзи 💻, названием, остатком, контролами и итоговой ценой.
Финальный результат должен быть таким:

const [quantity, setQuantity] = useState(0).quantity > 0 и quantity < stock.import React, { useState } from 'react';
import './styles.css';
export function ProductCard({ title, unitPrice, stock }) {
const [quantity, setQuantity] = useState(0);
const canDecrease = quantity > 0;
const canIncrease = quantity < stock;
const total = unitPrice * quantity;
return (
<article className="product-card" data-testid="product-card">
<div className="emoji" aria-hidden="true">💻</div>
<div>
<h3 className="product-title">{title}</h3>
<p className="product-stock">Остаток на складе: {stock}</p>
</div>
<div className="qty-controls">
<button className="action-button" onClick={() => canDecrease && setQuantity(q => q - 1)} disabled={!canDecrease}>
Убрать
</button>
<span aria-label="quantity">{quantity}</span>
<button className="action-button" onClick={() => canIncrease && setQuantity(q => q + 1)} disabled={!canIncrease}>
Добавить
</button>
</div>
<p className="price">Итого: {total} ₽</p>
</article>
);
}
export default function App() {
return (
<main className="challenge-container">
<section>
<ProductCard title="Ноутбук Pro" unitPrice={999} stock={3} />
</section>
</main>
);
}Редактор кода намеренно скрыт на мобильном.
Поверь, так лучше: я оберегаю тебя от искушения писать код в неидеальных условиях. Маленький экран и виртуальная клавиатура — не лучшие помощники для программиста.
📖 Сейчас: Изучи задачу, продумай решение. Действуй как стратег.
💻 Потом: Сядь за компьютер, открой сайт и реализуй все идеи с комфортом. Действуй как код-джедай!