Сделайте управляемый input (0–100), который заполняет прогресс‑бар на соответствующий процент. Некорректные значения нужно клампить в диапазон.
Бизнес-кейс. LoadMeter — индикатор загрузки команды: вводишь процент — видишь прогресс.
onChange.Карточка с числовым полем, полосой прогресса и процентом.
Превью:

const [value, setValue] = useState(0).let n = parseInt(e.target.value, 10) || 0; n = Math.min(100, Math.max(0, n)); setValue(n);.style={{ width: value + '%' }}.type="number" с min/max.import React, { useState } from 'react';
import './styles.css';
export function ProgressInput() {
const [value, setValue] = useState(0);
function handleChange(e) {
const raw = e.target.value;
if (raw === '') {
setValue(0);
return;
}
let n = parseInt(raw, 10);
if (isNaN(n)) n = 0;
n = Math.max(0, Math.min(100, n));
setValue(n);
}
const fillStyle = { width: value + '%' };
return (
<article className="card" data-testid="progress-card">
<header>
<h2 className="title">LoadMeter: прогресс по вводу</h2>
<p className="subtitle">Ввод числа 0–100 управляет шириной полосы</p>
</header>
<div className="row">
<input
className="input"
type="number"
min={0}
max={100}
placeholder="Введите число от 0 до 100"
value={value}
onChange={handleChange}
aria-label="value"
/>
<div className="progress">
<div className="progress-track" aria-label="progress-track">
<div className="progress-fill" style={fillStyle} aria-label="progress-fill" />
</div>
<span className="percent" aria-label="percent">{value}%</span>
</div>
</div>
</article>
);
}
export default function App() {
return (
<main className="challenge-container">
<section>
<ProgressInput />
</section>
</main>
);
}Сделайте управляемый input (0–100), который заполняет прогресс‑бар на соответствующий процент. Некорректные значения нужно клампить в диапазон.
Бизнес-кейс. LoadMeter — индикатор загрузки команды: вводишь процент — видишь прогресс.
onChange.Карточка с числовым полем, полосой прогресса и процентом.
Превью:

const [value, setValue] = useState(0).let n = parseInt(e.target.value, 10) || 0; n = Math.min(100, Math.max(0, n)); setValue(n);.style={{ width: value + '%' }}.type="number" с min/max.import React, { useState } from 'react';
import './styles.css';
export function ProgressInput() {
const [value, setValue] = useState(0);
function handleChange(e) {
const raw = e.target.value;
if (raw === '') {
setValue(0);
return;
}
let n = parseInt(raw, 10);
if (isNaN(n)) n = 0;
n = Math.max(0, Math.min(100, n));
setValue(n);
}
const fillStyle = { width: value + '%' };
return (
<article className="card" data-testid="progress-card">
<header>
<h2 className="title">LoadMeter: прогресс по вводу</h2>
<p className="subtitle">Ввод числа 0–100 управляет шириной полосы</p>
</header>
<div className="row">
<input
className="input"
type="number"
min={0}
max={100}
placeholder="Введите число от 0 до 100"
value={value}
onChange={handleChange}
aria-label="value"
/>
<div className="progress">
<div className="progress-track" aria-label="progress-track">
<div className="progress-fill" style={fillStyle} aria-label="progress-fill" />
</div>
<span className="percent" aria-label="percent">{value}%</span>
</div>
</div>
</article>
);
}
export default function App() {
return (
<main className="challenge-container">
<section>
<ProgressInput />
</section>
</main>
);
}Редактор кода намеренно скрыт на мобильном.
Поверь, так лучше: я оберегаю тебя от искушения писать код в неидеальных условиях. Маленький экран и виртуальная клавиатура — не лучшие помощники для программиста.
📖 Сейчас: Изучи задачу, продумай решение. Действуй как стратег.
💻 Потом: Сядь за компьютер, открой сайт и реализуй все идеи с комфортом. Действуй как код-джедай!