diff --git a/backend/bot.js b/backend/bot.js index 7dc0f44..17a51e5 100644 --- a/backend/bot.js +++ b/backend/bot.js @@ -86,7 +86,7 @@ app.post( // 8. Итоги let text = `🧼 Расчёт мыла: ${soapName}\n\n`; - text += `🔹 Вес мыла: ${weight} г\n`; + text += `🔹 Вес мыла: ${weight} г\n\n`; // text += `🔹 Цена за 1 кг основы: ${basePrice} ₽/кг\n\n`; // text += `🔹 Отдушка: ${aromaWeight} г по ${aromaPrice} ₽/фасовка\n`; diff --git a/frontend/app/globals.css b/frontend/app/globals.css index e72d494..6ca0ff8 100644 --- a/frontend/app/globals.css +++ b/frontend/app/globals.css @@ -1,4 +1,4 @@ -@import url('https://fonts.googleapis.com/css2?family=Sofia+Sans+Condensed:ital,wght@0,100..900;1,100..900&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=Sofia+Sans+Condensed:wght@300;400;500;700&display=swap'); @import "tailwindcss"; @@ -7,12 +7,32 @@ --foreground: #171717; } -body { - background: var(--background); - color: var(--foreground); +html, body { + /* Убираем «джамп» при скрытии скроллбара — оставляем технически скролл, но скрываем его */ + overflow-y: scroll; font-family: "Sofia Sans Condensed", sans-serif; } +/* WebKit (Chrome, Safari, Opera) */ +html::-webkit-scrollbar, +body::-webkit-scrollbar { + display: none; +} + +/* Firefox */ +html { + scrollbar-width: none; +} + +/* IE/Edge */ +html { + -ms-overflow-style: none; +} + +body { + +} + /* Скрываем стрелочки у input[type=number] */ input[type='number']::-webkit-outer-spin-button, input[type='number']::-webkit-inner-spin-button { diff --git a/frontend/app/layout.tsx b/frontend/app/layout.tsx index f7fa87e..1e6f515 100644 --- a/frontend/app/layout.tsx +++ b/frontend/app/layout.tsx @@ -25,7 +25,7 @@ export default function RootLayout({ return (
{children} diff --git a/frontend/components/SoapCalculator.tsx b/frontend/components/SoapCalculator.tsx index 0a8bbb2..fdcc4af 100644 --- a/frontend/components/SoapCalculator.tsx +++ b/frontend/components/SoapCalculator.tsx @@ -2,8 +2,8 @@ 'use client'; import { useState, useEffect, ChangeEvent, FormEvent } from 'react'; -import { calculateTotal } from '@/lib/calc'; import Image from 'next/image'; +import { calculateTotal } from '@/lib/calc'; type InputNumberProps = { label: string; @@ -12,7 +12,6 @@ type InputNumberProps = { }; const InputNumber = ({ label, value, onChange }: InputNumberProps) => { - // Генерируем id на основе текста лейбла (без пробелов) const id = label.toLowerCase().replace(/\s+/g, '-'); return ( @@ -41,14 +40,18 @@ const InputNumber = ({ label, value, onChange }: InputNumberProps) => { className={` absolute left-3 -top-5 - text-gray-400 text-sm + text-gray-400 transition-all + /* активное состояние: адаптивный размер шрифта */ + text-xs sm:text-sm md:text-base lg:text-lg + /* когда поле пустое: слегка больше (помещается внутри) */ peer-placeholder-shown:top-2 - peer-placeholder-shown:text-base peer-placeholder-shown:text-gray-500 + peer-placeholder-shown:text-sm sm:peer-placeholder-shown:text-base md:peer-placeholder-shown:text-lg + /* при фокусе или если есть содержимое: сжатый текст */ peer-focus:-top-5 peer-focus:text-gray-200 - peer-focus:text-sm + peer-focus:text-xs sm:peer-focus:text-sm md:peer-focus:text-base lg:peer-focus:text-lg `} > {label} @@ -75,7 +78,6 @@ export default function SoapCalculator() { const [photoFile, setPhotoFile] = useState