From bcd9f7c06dd95167065d306c7cfa7abe880728ee Mon Sep 17 00:00:00 2001 From: Alex Ant Date: Thu, 12 Mar 2026 14:27:54 +0500 Subject: [PATCH] restyle --- index.html | 14 +- src/app/App.tsx | 8 + src/app/styles/app.css | 7 - src/app/styles/calculator-theme.css | 184 ++++++++++++++++ src/app/styles/frame-shell.css | 71 ++++++ src/app/styles/index.css | 58 ----- src/main.tsx | 2 + src/pages/calculator/CalculatorPage.tsx | 5 +- src/pages/calculator/WizardCalculatorPage.tsx | 29 ++- src/pages/calculator/styles/calculator.css | 18 ++ src/shared/index.ts | 3 +- src/shared/lib/texts.ts | 207 ++++++++++++++++++ src/shared/ui/card/ui/BaseCard.tsx | 2 +- .../ui/ContributionFormSection.tsx | 10 +- .../ui/ContributionResultsSection.tsx | 62 +++--- src/widgets/footer-note/ui/FooterNote.tsx | 7 +- .../ui/InvestmentFormSection.tsx | 6 +- .../legend-section/ui/LegendSection.tsx | 50 ++--- .../ui/MonthlyContributionsSection.tsx | 16 +- .../ui/MonthlyResultsTable.tsx | 50 ++--- .../ui/ProfitabilityResultsSection.tsx | 22 +- .../ui/SystemParamsSection.tsx | 68 +++--- .../ui/WithdrawalRateSection.tsx | 11 +- 23 files changed, 670 insertions(+), 240 deletions(-) create mode 100644 src/app/styles/calculator-theme.css create mode 100644 src/app/styles/frame-shell.css create mode 100644 src/shared/lib/texts.ts diff --git a/index.html b/index.html index 5cc0046..248bae7 100644 --- a/index.html +++ b/index.html @@ -1,14 +1,24 @@ - + + + + C9S Калькулятор Выгоды
- + diff --git a/src/app/App.tsx b/src/app/App.tsx index 9a6f67d..0a93f6a 100644 --- a/src/app/App.tsx +++ b/src/app/App.tsx @@ -1,6 +1,14 @@ +import { useEffect } from 'react'; import './styles/app.css'; import { AppProvider } from './providers'; +import { TEXTS } from '../shared'; export function App() { + useEffect(() => { + document.title = TEXTS.html.title; + const metaDesc = document.querySelector('meta[name="description"]'); + if (metaDesc) metaDesc.setAttribute('content', TEXTS.html.description); + }, []); + return ; } \ No newline at end of file diff --git a/src/app/styles/app.css b/src/app/styles/app.css index a7bfb49..46db9c1 100644 --- a/src/app/styles/app.css +++ b/src/app/styles/app.css @@ -1,10 +1,3 @@ -#root { - width: 100%; - margin: 0; - padding: 0; - text-align: center; -} - .calculator-container { max-width: 100%; margin: 0 auto; diff --git a/src/app/styles/calculator-theme.css b/src/app/styles/calculator-theme.css new file mode 100644 index 0000000..8d2b197 --- /dev/null +++ b/src/app/styles/calculator-theme.css @@ -0,0 +1,184 @@ +:root { + --theme-card-bg: rgba(12, 16, 24, 0.92); + --theme-card-border: rgba(201, 151, 58, 0.2); + --theme-card-shadow: 0 10px 28px rgba(0, 0, 0, 0.3); + --theme-card-head-bg: linear-gradient(180deg, rgba(28, 34, 48, 0.92) 0%, rgba(18, 23, 33, 0.95) 100%); + --theme-card-head-text: #eef0f5; + --theme-card-body-text: #c8cdd8; + --theme-muted-text: #9ea6b7; + --theme-accent: #c9973a; + --theme-disclaimer-bg: rgba(201, 151, 58, 0.16); + --theme-disclaimer-border: rgba(201, 151, 58, 0.4); + --theme-stat-value: #f5f7fb; + --theme-page-title: #f2f4f9; + --theme-page-subtitle: #c8cdd8; + --theme-input-bg: rgba(19, 25, 36, 0.92); + --theme-input-border: rgba(201, 151, 58, 0.35); + --theme-input-text: #eef0f5; + --theme-input-addon-bg: rgba(24, 31, 45, 0.96); + --theme-table-head-bg: rgba(24, 31, 45, 0.95); + --theme-table-row-bg: rgba(15, 20, 30, 0.94); + --theme-table-row-hover: rgba(201, 151, 58, 0.1); + --theme-table-border: rgba(201, 151, 58, 0.18); +} + +.ant-card { + border-radius: 10px; + border: 1px solid var(--theme-card-border); + background: var(--theme-card-bg); + box-shadow: var(--theme-card-shadow); + color: var(--theme-card-body-text); +} + +.ant-card:hover { + border-color: rgba(201, 151, 58, 0.35); + box-shadow: 0 12px 34px rgba(0, 0, 0, 0.36); +} + +.ant-card .ant-card-head { + border-bottom: 1px solid rgba(201, 151, 58, 0.14); + border-top-left-radius: 10px; + border-top-right-radius: 10px; + background: var(--theme-card-head-bg); +} + +.ant-card .ant-card-head-title { + color: var(--theme-card-head-text); + font-weight: 600; + letter-spacing: 0.01em; +} + +.ant-card .ant-card-body { + color: var(--theme-card-body-text); +} + +.ant-card .ant-typography, +.ant-card .ant-statistic-title, +.ant-card .ant-badge-status-text, +.ant-card .ant-descriptions-item-label, +.ant-card .ant-descriptions-item-content { + color: var(--theme-card-body-text); +} + +.ant-card .ant-badge-status-text, +.ant-card .ant-badge-status-text span, +.ant-card .ant-badge-status-text b, +.ant-card .ant-badge-status-text strong, +.ant-card .label-text { + color: var(--theme-card-body-text) !important; +} + +.ant-card .card-description, +.ant-card .unit-suffix { + color: var(--theme-muted-text); +} + +.calculator-page-title { + color: var(--theme-page-title) !important; +} + +.calculator-page-subtitle { + color: var(--theme-page-subtitle) !important; + display: block; +} + +.ant-card .ant-input-number, +.ant-card .ant-input, +.ant-card .ant-input-affix-wrapper, +.ant-card .ant-input-number-group-addon { + background: var(--theme-input-bg); + border-color: var(--theme-input-border); + color: var(--theme-input-text); +} + +.ant-card .ant-input-number-group-addon { + background: var(--theme-input-addon-bg); + color: var(--theme-input-text); +} + +.ant-card .ant-input-number-input, +.ant-card .ant-input::placeholder, +.ant-card .ant-input-number-input::placeholder { + color: var(--theme-input-text); +} + +.ant-card .ant-input-number:hover, +.ant-card .ant-input:hover, +.ant-card .ant-input-affix-wrapper:hover { + border-color: rgba(201, 151, 58, 0.5); +} + +.ant-card .ant-input-number-focused, +.ant-card .ant-input-affix-wrapper-focused, +.ant-card .ant-input:focus, +.ant-card .ant-input:focus-within { + border-color: rgba(201, 151, 58, 0.75); + box-shadow: 0 0 0 2px rgba(201, 151, 58, 0.2); +} + +.ant-card .ant-table-wrapper .ant-table, +.ant-card .ant-table-wrapper .ant-table-container, +.ant-card .ant-table-wrapper .ant-table-content, +.ant-card .ant-table-wrapper .ant-table-tbody > tr > td { + background: var(--theme-table-row-bg); + color: var(--theme-card-body-text); +} + +.ant-card .ant-table-wrapper .ant-table-thead > tr > th { + background: var(--theme-table-head-bg) !important; + color: var(--theme-card-head-text) !important; + border-color: var(--theme-table-border) !important; +} + +.ant-card .ant-table-wrapper .ant-table-tbody > tr > td, +.ant-card .ant-table-wrapper .ant-table-thead > tr > th, +.ant-card .ant-table-wrapper .ant-table-cell, +.ant-card .ant-table-wrapper .ant-table-content table { + border-color: var(--theme-table-border); +} + +.ant-card .ant-table-wrapper .ant-table-tbody > tr.ant-table-row:hover > td, +.ant-card .ant-table-wrapper .ant-table-tbody > tr > td.ant-table-cell-row-hover { + background: var(--theme-table-row-hover) !important; +} + +.ant-card .ant-table-wrapper .ant-table-placeholder .ant-table-cell { + background: transparent; + color: var(--theme-muted-text); +} + +.ant-card .apexcharts-legend.apx-legend-position-bottom.apexcharts-align-center, +.ant-card .apexcharts-legend.apx-legend-position-top.apexcharts-align-center, +.ant-card .apexcharts-legend.apx-legend-position-left.apexcharts-align-center, +.ant-card .apexcharts-legend.apx-legend-position-right.apexcharts-align-center { + justify-content: flex-start !important; + align-items: center; +} + +.theme-stat-value .ant-statistic-content { + color: var(--theme-stat-value); + font-size: 30px; + font-weight: 700; +} + +.profitability-stats-row .ant-statistic { + text-align: center; +} + +.profitability-stats-row .ant-statistic-title { + min-height: 44px; + display: flex; + align-items: flex-end; + justify-content: center; + text-align: center; + line-height: 1.35; +} + +.theme-disclaimer { + margin-top: 16px; + padding: 12px; + font-size: 12px; + border-radius: 8px; + border: 1px solid var(--theme-disclaimer-border); + background: var(--theme-disclaimer-bg); +} diff --git a/src/app/styles/frame-shell.css b/src/app/styles/frame-shell.css new file mode 100644 index 0000000..4949dc0 --- /dev/null +++ b/src/app/styles/frame-shell.css @@ -0,0 +1,71 @@ +:root { + --shell-gold: #c9973a; + --shell-dark: #080a0e; + --shell-dark-2: #0e1118; + --shell-text: #c8cdd8; +} + +* { + box-sizing: border-box; +} + +html, +body, +#root { + width: 100%; + min-height: 100%; +} + +html { + scroll-behavior: smooth; +} + +body { + margin: 0; + color: var(--shell-text); + font-family: 'Manrope', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; + line-height: 1.6; + background: + radial-gradient(circle at 18% 12%, rgba(201, 151, 58, 0.12), transparent 42%), + radial-gradient(circle at 90% 10%, rgba(201, 151, 58, 0.08), transparent 48%), + linear-gradient(180deg, var(--shell-dark-2) 0%, var(--shell-dark) 100%); + overflow-x: hidden; +} + +body::before { + content: ''; + position: fixed; + inset: 0; + pointer-events: none; + z-index: 0; + opacity: 0.28; + background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.04'/%3E%3C/svg%3E"); +} + +#root { + position: relative; + z-index: 1; + margin: 0 auto; + max-width: 1320px; + padding: 20px 16px 28px; +} + +::-webkit-scrollbar { + width: 6px; + height: 6px; +} + +::-webkit-scrollbar-track { + background: rgba(255, 255, 255, 0.04); +} + +::-webkit-scrollbar-thumb { + background: rgba(201, 151, 58, 0.45); + border-radius: 999px; +} + +@media (max-width: 768px) { + #root { + padding: 12px 10px 20px; + } +} diff --git a/src/app/styles/index.css b/src/app/styles/index.css index a9241e3..51d00cd 100644 --- a/src/app/styles/index.css +++ b/src/app/styles/index.css @@ -1,64 +1,6 @@ :root { - font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color:rgb(255, 255, 255); - font-synthesis: none; text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} -a:hover { - color: #535bf2; -} - -body { - margin: 0; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; - cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; -} - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - a:hover { - color: #747bff; - } - button { - background-color: #f9f9f9; - } } \ No newline at end of file diff --git a/src/main.tsx b/src/main.tsx index 2a46936..8c98dcb 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,6 +1,8 @@ import React from 'react' import ReactDOM from 'react-dom/client' import { App } from './app/index' +import './app/styles/frame-shell.css' +import './app/styles/calculator-theme.css' import './app/styles/index.css' ReactDOM.createRoot(document.getElementById('root')!).render( diff --git a/src/pages/calculator/CalculatorPage.tsx b/src/pages/calculator/CalculatorPage.tsx index 327e5b6..decaf60 100644 --- a/src/pages/calculator/CalculatorPage.tsx +++ b/src/pages/calculator/CalculatorPage.tsx @@ -1,4 +1,5 @@ import { Row, Col, Typography } from 'antd'; +import { TEXTS } from '../../shared'; import { useState, useEffect, FC } from 'react'; import { calculateBenefits, CALCULATOR_CONSTANTS, ColumnVisibility } from '../../entities/core'; @@ -144,8 +145,8 @@ export const CalculatorPage: FC = ({ initialParams }) => { return (
- Калькулятор выгоды - от участия в создании платформы и приложений "Кооперативной Экономики" + {TEXTS.page.calculatorTitle} + {TEXTS.page.calculatorSubtitle} diff --git a/src/pages/calculator/WizardCalculatorPage.tsx b/src/pages/calculator/WizardCalculatorPage.tsx index 7b87d3a..5dbdf00 100644 --- a/src/pages/calculator/WizardCalculatorPage.tsx +++ b/src/pages/calculator/WizardCalculatorPage.tsx @@ -1,4 +1,5 @@ import { Button } from 'antd'; +import { TEXTS } from '../../shared'; import { useState, useEffect, FC } from 'react'; import { calculateBenefits, CALCULATOR_CONSTANTS, ColumnVisibility, CalculationParams } from '../../entities/core'; import { @@ -142,7 +143,7 @@ export const WizardCalculatorPage: FC = ({ initialPar />
@@ -157,10 +158,10 @@ export const WizardCalculatorPage: FC = ({ initialPar />
@@ -181,10 +182,10 @@ export const WizardCalculatorPage: FC = ({ initialPar />
@@ -213,10 +214,10 @@ export const WizardCalculatorPage: FC = ({ initialPar />
@@ -227,10 +228,10 @@ export const WizardCalculatorPage: FC = ({ initialPar
= ({ initialPar }; return ( -
+
{renderStepContent()}
); diff --git a/src/pages/calculator/styles/calculator.css b/src/pages/calculator/styles/calculator.css index 2c1f9af..7d7f4f7 100644 --- a/src/pages/calculator/styles/calculator.css +++ b/src/pages/calculator/styles/calculator.css @@ -23,6 +23,16 @@ width: 100%; } +.wizard-container { + width: 100%; + max-width: 760px; + margin: 0 auto; +} + +.wizard-container-wide { + max-width: 1160px; +} + /* Ограничение ширины для десктопов */ @media (min-width: 769px) { .input-container .ant-space-compact, @@ -60,6 +70,14 @@ /* Медиа-запросы */ @media (max-width: 768px) { + .wizard-container { + max-width: 100%; + } + + .wizard-container-wide { + max-width: 100%; + } + /* Адаптивное отображение на мобильных */ .result-item { flex-direction: column; diff --git a/src/shared/index.ts b/src/shared/index.ts index 8a7caf6..1feff6b 100644 --- a/src/shared/index.ts +++ b/src/shared/index.ts @@ -1,3 +1,4 @@ export * from './ui'; export * from './lib/urlParams'; -export * from './lib/hooks/useUrlParams'; \ No newline at end of file +export * from './lib/hooks/useUrlParams'; +export { TEXTS } from './lib/texts'; \ No newline at end of file diff --git a/src/shared/lib/texts.ts b/src/shared/lib/texts.ts new file mode 100644 index 0000000..6254b8c --- /dev/null +++ b/src/shared/lib/texts.ts @@ -0,0 +1,207 @@ +/** + * Все текстовые строки калькулятора. + * Ключ-значение для удобного перевода и централизованного управления. + */ +export const TEXTS = { + // === Страницы === + page: { + calculatorTitle: 'Калькулятор выгоды', + calculatorSubtitle: 'для пайщиков, участвующих в создании платформы и приложений экосистемы "Кооперативная Экономика"', + }, + + // === Wizard (пошаговый калькулятор) === + wizard: { + continue: 'Продолжить', + back: 'Назад', + moreDetails: 'Подробнее', + evenMoreDetails: 'Еще подробнее', + goToFullCalculator: 'Перейти к полному калькулятору', + }, + + common: { + rublesPerMonth: '₽/мес', + }, + + // === Легенда === + legend: { + title: 'Легенда', + executor: 'Исполнитель', + executorDesc: 'Пайщик, который воплощает продукт компетенциями и профессиональным навыком, фиксируя результат в коммитах.', + author: 'Автор / Соавтор', + authorDesc: 'Пайщик, который вносит идею как паевой взнос и сопровождает проект на этапах концепции, модели и реализации.', + investor: 'Инвестор', + investorDesc: 'Пайщик, который вносит денежные средства в программу и получает долю в ОАП с возвратами из членских взносов.', + participant: 'Участник программы', + participantDesc: 'Пайщик Благороста в любой роли: Исполнитель, Автор/Соавтор, Инвестор или Координатор.', + result: 'ОАП', + resultDesc: 'Объект авторских прав платформы "Кооперативная Экономика", формируемый из паевых взносов участников.', + share: 'Доля в ОАП', + shareDesc: 'Имущественная доля пайщика в объекте авторских прав, закрепляемая через паевые взносы.', + bonus: 'Дополнительный паевой взнос', + bonusDesc: 'Капитализируемый взнос, который начисляется участникам программы при росте стоимости ОАП.', + blagorost: 'Благорост', + blagorostDesc: 'Дополнительные паевые взносы участникам программы по коэффициенту золотого сечения (1,618).', + howItWorks: 'Как это работает:', + howItWorksText: 'Взносы Исполнителей и Соавторов формируют себестоимость проектов, а по коэффициенту 1,618 дополнительно формируется Благорост для участников программы. Денежные взносы Инвесторов обеспечивают возврат себестоимости компетенций команд и увеличивают долю в ОАП.', + businessModel: 'Бизнес-модель:', + businessModelText: 'Кооперативы в экосистеме оплачивают членские взносы за документы, проведенные через приложения платформы. Этот поток покрывает текущие расходы кооператива и обеспечивает возвраты участникам программы Благорост.', + }, + + // === Форма взноса временем === + contributionForm: { + title: 'Ваш паевой взнос результатом', + description: 'Укажите стоимость вашего взноса как Исполнителя из расчета стоимости вашего времени. Такой взнос увеличивает вашу долю в ОАП и участвует в формировании Благороста через дополнительные паевые взносы участников программы.', + }, + + // === Форма взноса деньгами === + investmentForm: { + title: 'Ваш паевой взнос деньгами', + description: 'Сумма денежных средств, которые вы вносите в программу как Инвестор. Денежный взнос увеличивает вашу долю в ОАП и обеспечивает возврат себестоимости компетенций Исполнителей и Соавторов.', + }, + + // === Возврат стоимости труда === + withdrawalRate: { + title: 'Возврат себестоимости компетенций', + description: 'Определяет, какую долю стоимости вашего взноса вы возвращаете, а какую оставляете в программе. В модели используется правило "все действуют как вы": такой же процент и поведение применяется к другим Исполнителям и Соавторам.', + }, + + // === Результаты выгоды === + profitabilityResults: { + title: 'Предполагаемая выгода участия', + annual: 'Годовых', + creatorBonus: 'Взнос Исполнителя по астрономическому времени', + description: 'Показатель учитывает Благорост, возвраты из членских взносов за документы и взнос Исполнителя по астрономическому времени.', + disclaimer: 'Показатели являются модельной оценкой и могут отличаться от фактических значений в зависимости от динамики взносов, эффективности капитала и поведения участников программы.', + }, + + // === Результаты взносов (диаграмма) === + contributionResults: { + title: 'Складочный капитал в первый месяц участия', + pieLabels: { + yourExecutorContribution: 'Ваш взнос Исполнителя', + yourInvestorContribution: 'Ваш взнос Инвестора', + authorsContribution: 'Взнос Авторов / Соавторов', + yourExecutorBonus: 'Ваш взнос Исполнителя по астрономическому времени', + authorsBonus: 'Взнос Авторов / Соавторов по астрономическому времени', + participantsBonus: 'Благорост участникам программы', + participantsBonusResult: 'Благорост участникам программы', + otherInvestorsContribution: 'Взнос других Инвесторов', + otherInvestorsContributionResult: 'Взнос других Инвесторов', + otherCreatorsContribution: 'Взнос других Исполнителей', + otherCreatorsBonus: 'Взнос других Исполнителей по астрономическому времени', + }, + tooltips: { + yourExecutorContribution: 'Стоимость вашего паевого взноса как Исполнителя. Эта сумма участвует в расчете возвратов и формировании вашей доли в ОАП.', + yourInvestorContribution: 'Сумма вашего денежного взноса как Инвестора. Она увеличивает долю в ОАП и поддерживает возврат себестоимости команд.', + yourExecutorBonus: 'Часть вашего паевого взноса, отражающая стоимость астрономического времени Исполнителя.', + authorsContribution: 'Суммарная стоимость взносов Авторов/Соавторов в первом месяце, включая ваш проект и проекты других Исполнителей.', + authorsBonus: 'Суммарная часть взносов Авторов/Соавторов по астрономическому времени в первом месяце.', + participantsBonus: 'Благорост участникам программы (Исполнителям, Авторам/Соавторам и Инвесторам), рассчитанный по коэффициенту золотого сечения. Увеличивает общий складочный капитал и распределяется по долям в ОАП.', + otherInvestorsContribution: 'Суммарный денежный взнос других Инвесторов в первом месяце. Повышает общий складочный капитал и обеспечивает возвраты командам.', + otherCreatorsContribution: 'Стоимость паевых взносов результатами других Исполнителей в первом месяце.', + otherCreatorsBonus: 'Часть взносов других Исполнителей по астрономическому времени в первом месяце.', + }, + }, + + // === Параметры системы === + systemParams: { + title: 'Параметры модели и допущения', + constants: 'Константы', + executorLaborCost: 'Стоимость компетенций Исполнителя', + executorLaborCostTooltip: 'Часть взноса Исполнителя, отражающая стоимость профессиональных компетенций (v\').', + authorLaborCost: 'Стоимость компетенций Соавторов', + authorLaborCostTooltip: 'Часть взноса Соавторов, связанная со стоимостью компетенций и рассчитываемая от взноса Исполнителя.', + executorBonus: 'Стоимость астрономического времени Исполнителя', + executorBonusTooltip: 'Часть взноса Исполнителя, отражающая стоимость астрономического времени (v).', + authorBonus: 'Стоимость астрономического времени Соавторов', + authorBonusTooltip: 'Часть взноса Соавторов, отражающая стоимость астрономического времени.', + participantsBonus: 'Благорост участникам программы', + participantsBonusTooltip: 'Коэффициент золотого сечения (1,618), по которому рассчитывается дополнительная капитализация участникам программы.', + payoutMonths: 'Месяцы выплат', + payoutMonthsTooltip: 'Месяцы выплат — периоды, в которые участникам выплачиваются накопленные членские взносы.', + delayedFirstPayments: 'Отложенные первые выплаты', + delayedFirstPaymentsTooltip: 'Начало накопления членских взносов откладывается на указанное количество месяцев после первого взноса.', + investmentProvision: 'Покрытие себестоимости инвестициями', + investmentProvisionTooltip: 'Модель предполагает, что денежные взносы Инвесторов достаточны для возврата себестоимости компетенций Исполнителей и Соавторов.', + disclaimer: 'Если денежные взносы Инвесторов снижаются, возвраты Исполнителям и Соавторам могут быть перенесены до поступления достаточного объема средств.', + initialCapital: 'Стартовый складочный капитал', + initialCapitalDesc: 'Начальный складочный капитал, на базе которого производится расчет. Фиксируется и публикуется в бухгалтерской отчетности кооператива ежеквартально.', + monthlyContributions: 'Ежемесячные взносы результатами других Исполнителей', + monthlyContributionsDesc: 'Общая сумма паевых взносов результатами других Исполнителей, вносимая ежемесячно после вашего входа в программу. Эти взносы увеличивают складочный капитал и формируют Благорост.', + growthMultiplier: 'Множитель роста взносов результатами', + growthMultiplierDesc: 'Определяет ежемесячную динамику роста взносов результатами других Исполнителей.', + capitalEfficiency: 'Эффективность капитала в месяц', + capitalEfficiencyDesc: 'Показывает, сколько членских взносов за документы формируется на каждый новый рубль складочного капитала в месяц.', + membershipFeeGrowth: 'Множитель роста эффективности капитала', + membershipFeeGrowthDesc: 'Определяет ежемесячный прирост членских взносов по формуле сложного процента, которая применяется на эффективности капитала.', + months: 'мес.', + }, + + // === Таблица результатов по месяцам === + monthlyResultsTable: { + title: 'Складочный капитал по месяцам', + brief: 'Кратко', + detailed: 'Подробно', + columns: { + month: 'Месяц', + monthTooltip: 'Номер месяца от начала участия. Месяц 1 - момент вступления, месяц 2 - первый месяц после внесения вашего взноса', + shareholderCapital: 'Складочный капитал', + shareholderCapitalTooltip: 'Общая сумма всех взносов и Премий в системе на конец месяца, с учетом выплат членских взносов, которые уменьшают складочный капитал', + capitalGrowth: 'Прирост складочного капитала', + capitalGrowthTooltip: 'Общий прирост складочного капитала за месяц с учетом всех взносов и Премий', + monthlyGeneration: 'Сумма генерации', + monthlyGenerationTooltip: 'Общая сумма стоимости взносов Исполнителей и Авторов/Соавторов, а также их дополнительных взносов за месяц (без учета Благороста участникам программы и взносов Инвесторов).', + contributorsBonus: 'Благорост участникам программы', + contributorsBonusTooltip: 'Дополнительная капитализация, рассчитываемая по коэффициенту золотого сечения от новых взносов Исполнителей и Авторов/Соавторов.', + monthlyInvestorAmount: 'Взнос других Инвесторов', + monthlyInvestorAmountTooltip: 'Денежный взнос других Инвесторов в текущем месяце', + totalInvestorsAmount: 'Сумма взносов Инвесторов', + totalInvestorsAmountTooltip: 'Накопительная сумма всех взносов всех Инвесторов с начала учета (включая Вас)', + investorsShare: 'Доля Инвесторов', + investorsShareTooltip: 'Процентная доля всех Инвесторов в общем складочном капитале системы', + currentMonthlyContributions: 'Взносы других Исполнителей и Инвесторов', + currentMonthlyContributionsTooltip: 'Общая сумма взносов других Исполнителей и Инвесторов в текущем месяце', + othersCreatorBase: 'Взнос других Исполнителей', + othersCreatorBaseTooltip: 'Базовая стоимость Результатов труда других Исполнителей в текущем месяце', + othersAuthorBase: 'Взнос Соавторов других Исполнителей', + othersAuthorBaseTooltip: 'Стоимость взносов Авторов/Соавторов, связанных с проектами других Исполнителей (61,8% от их базовой стоимости).', + othersCreatorBonus: 'Взнос других Исполнителей по астрономическому времени', + othersCreatorBonusTooltip: 'Часть взносов других Исполнителей, отражающая стоимость их астрономического времени.', + othersAuthorBonus: 'Взнос Соавторов других Исполнителей по астрономическому времени', + othersAuthorBonusTooltip: 'Часть взносов Соавторов других Исполнителей, отражающая стоимость астрономического времени.', + othersWithdrawalAmount: 'Возврат другим Исполнителям и Соавторам', + othersWithdrawalAmountTooltip: 'Сумма возвратов другим Исполнителям и их Соавторам в текущем месяце.', + initialContribution: 'Предполагаемая стоимость вашего паевого взноса', + initialContributionTooltip: 'Общая стоимость вашего взноса на конец месяца, включая первоначальный взнос и накопленную долю в Благоросте.', + creatorShare: 'Ваша предполагаемая доля в ОАП', + creatorShareTooltip: 'Процент вашей доли в общем складочном капитале, который формирует стоимость ОАП.', + monthlyFee: 'Предполагаемые членские взносы за документы', + monthlyFeeTooltip: 'Сумма членских взносов от кооперативов за документы, проведенные через приложения платформы в текущем месяце.', + accumulatedFees: 'Накопленные членские взносы за документооборот', + accumulatedFeesTooltip: 'Общая сумма накопленных членских взносов, ожидающих выплаты', + creatorMembershipFeePayment: 'Ваши предполагаемые возвраты из членских взносов', + creatorMembershipFeePaymentTooltip: 'Сумма, которую вы предположительно получите в текущем месяце: возврат стоимости взноса или выплаты из потока членских взносов.', + }, + }, + + // === Ежемесячные взносы (отдельная секция) === + monthlyContributions: { + title: 'Ежемесячные взносы результатами других Исполнителей', + sumLabel: 'Сумма взносов в месяц', + sumTooltip: 'Общая сумма паевых взносов результатами других Исполнителей, которые ежемесячно увеличивают складочный капитал и формируют Благорост.', + description: 'Ежемесячная сумма паевых взносов результатами других Исполнителей', + }, + + // === Footer === + footer: { + note: 'Модель показывает, как ваш паевой взнос результатом и/или деньгами увеличивает долю в ОАП за счет капитализации и Благороста. Возвраты формируются потоком членских взносов кооперативов за документы в приложениях платформы.', + }, + + // === HTML (index.html) === + html: { + title: 'БЛАГОРОСТ — Калькулятор модели', + description: 'Калькулятор модели Благорост: расчет предполагаемой выгоды, доли в ОАП и возвратов при паевых взносах результатом и/или деньгами.', + }, +} as const; + +export type Texts = typeof TEXTS; diff --git a/src/shared/ui/card/ui/BaseCard.tsx b/src/shared/ui/card/ui/BaseCard.tsx index 54c9b3b..cfbd246 100644 --- a/src/shared/ui/card/ui/BaseCard.tsx +++ b/src/shared/ui/card/ui/BaseCard.tsx @@ -11,7 +11,7 @@ export const BaseCard: FC = ({ title, children, className = 'mb-md', - headStyle = { backgroundColor: '#f0f5ff', fontWeight: 'bold' }, + headStyle, flexGrow = true, style, bodyStyle, diff --git a/src/widgets/contribution-form-section/ui/ContributionFormSection.tsx b/src/widgets/contribution-form-section/ui/ContributionFormSection.tsx index d9b0182..6c4e9d7 100644 --- a/src/widgets/contribution-form-section/ui/ContributionFormSection.tsx +++ b/src/widgets/contribution-form-section/ui/ContributionFormSection.tsx @@ -1,4 +1,4 @@ -import { BaseCard, LabelText, DescriptionText, SharedTooltip, DebouncedInputSlider } from '../../../shared'; +import { BaseCard, DescriptionText, DebouncedInputSlider, TEXTS } from '../../../shared'; import { FC } from 'react'; interface ContributionFormSectionProps { @@ -11,12 +11,8 @@ export const ContributionFormSection: FC = ({ onContributionAmountChange, }) => { return ( - +
- {/* */} - {/* Укажите стоимость труда */} - {/* */} - {/* */} = ({ tooltipFormatter={(value: number | undefined) => `${value?.toLocaleString('ru-RU')} ₽`} /> - Укажите стоимость труда, который Вы вносите в «Результат» как «Исполнитель». Взнос увеличивает вашу долю в складочном капитале и создаёт «Премии», которые капитализируются новыми взносами "трудом" и возвращаются из числа членских взносов кооперативов за использование системы электронного документооборота платформы. Стоимость взноса расчитывается как затраченное время на «Результат» по вашей ставке за час. + {TEXTS.contributionForm.description}
diff --git a/src/widgets/contribution-results-section/ui/ContributionResultsSection.tsx b/src/widgets/contribution-results-section/ui/ContributionResultsSection.tsx index 94a85f6..c8ea808 100644 --- a/src/widgets/contribution-results-section/ui/ContributionResultsSection.tsx +++ b/src/widgets/contribution-results-section/ui/ContributionResultsSection.tsx @@ -1,6 +1,6 @@ import { Typography, Row, Col } from 'antd'; import { FC, useEffect, useState } from 'react'; -import { BaseCard, LabelText, SharedTooltip } from '../../../shared'; +import { BaseCard, SharedTooltip, TEXTS } from '../../../shared'; import ReactApexChart from 'react-apexcharts'; const { Text } = Typography; @@ -53,15 +53,15 @@ export const ContributionResultsSection: FC = ( // Метки для графика const pieLabels = [ - 'Ваш взнос «Исполнителя»', - 'Ваш взнос «Инвестора»', - 'Взнос «Авторов»', - 'Ваша «Прибавка» «Исполнителя»', - '«Прибавка» «Авторов»', - '«Прибавка» «Участников»', - 'Вклад других «Инвесторов»', - 'Взнос других «Создателей»', - '«Прибавка» других «Создателей»' + TEXTS.contributionResults.pieLabels.yourExecutorContribution, + TEXTS.contributionResults.pieLabels.yourInvestorContribution, + TEXTS.contributionResults.pieLabels.authorsContribution, + TEXTS.contributionResults.pieLabels.yourExecutorBonus, + TEXTS.contributionResults.pieLabels.authorsBonus, + TEXTS.contributionResults.pieLabels.participantsBonus, + TEXTS.contributionResults.pieLabels.otherInvestorsContribution, + TEXTS.contributionResults.pieLabels.otherCreatorsContribution, + TEXTS.contributionResults.pieLabels.otherCreatorsBonus, ]; // Цвета для графика @@ -107,6 +107,7 @@ export const ContributionResultsSection: FC = ( colors: pieColors, legend: { position: 'bottom', + horizontalAlign: 'left', fontSize: '14px', }, dataLabels: { @@ -129,7 +130,8 @@ export const ContributionResultsSection: FC = ( height: 300 }, legend: { - position: 'bottom' + position: 'bottom', + horizontalAlign: 'left' } } }] @@ -137,70 +139,70 @@ export const ContributionResultsSection: FC = ( }, [creatorBaseValue, authorBaseValue, creatorBonus, authorBonus, additionalCapitalization, initialMonthlyInvestorAmount, investorAmount, firstMonthOthersCreatorBase, firstMonthOthersAuthorBase, firstMonthOthersCreatorBonus, firstMonthOthersAuthorBonus]); return ( - +
- Ваш взнос «Исполнителя»: - + {TEXTS.contributionResults.pieLabels.yourExecutorContribution}: + {creatorBaseValue.toLocaleString('ru-RU')} ₽
- Ваш взнос «Инвестора»: - + {TEXTS.contributionResults.pieLabels.yourInvestorContribution}: + {investorAmount.toLocaleString('ru-RU')} ₽
- Ваша «Прибавка» «Исполнителя»: - + {TEXTS.contributionResults.pieLabels.yourExecutorBonus}: + {creatorBonus.toLocaleString('ru-RU')} ₽
- Взнос «Авторов»: - + {TEXTS.contributionResults.pieLabels.authorsContribution}: + {((authorBaseValue || 0) + (firstMonthOthersAuthorBase || 0)).toLocaleString('ru-RU')} ₽
- «Прибавка» «Авторов»: - + {TEXTS.contributionResults.pieLabels.authorsBonus}: + {((authorBonus || 0) + (firstMonthOthersAuthorBonus || 0)).toLocaleString('ru-RU')} ₽
- «Прибавка» «Ранние участники»: - + {TEXTS.contributionResults.pieLabels.participantsBonusResult}: + {additionalCapitalization.toLocaleString('ru-RU')} ₽
- Взнос других «Инвесторов»: - + {TEXTS.contributionResults.pieLabels.otherInvestorsContributionResult}: + {initialMonthlyInvestorAmount.toLocaleString('ru-RU')} ₽
- Взнос других «Создателей»: - + {TEXTS.contributionResults.pieLabels.otherCreatorsContribution}: + {firstMonthOthersCreatorBase.toLocaleString('ru-RU')} ₽
- «Прибавка» других «Создателей»: - + {TEXTS.contributionResults.pieLabels.otherCreatorsBonus}: + {firstMonthOthersCreatorBonus.toLocaleString('ru-RU')} ₽
diff --git a/src/widgets/footer-note/ui/FooterNote.tsx b/src/widgets/footer-note/ui/FooterNote.tsx index ed47c15..9b91264 100644 --- a/src/widgets/footer-note/ui/FooterNote.tsx +++ b/src/widgets/footer-note/ui/FooterNote.tsx @@ -1,16 +1,13 @@ import { Typography } from 'antd'; import { FC } from 'react'; +import { TEXTS } from '../../../shared'; const { Text } = Typography; export const FooterNote: FC = () => { return (
- - Модель демонстрирует рост вашей доли от взносов других участников при взносе результатом и/или деньгами. - Капитализация распределяется пропорционально долям, что увеличивает ваш взнос с каждым месяцем. - Членские взносы кооперативов за электронный документооборот обеспечивают возврат взносов. - + {TEXTS.footer.note}
); }; \ No newline at end of file diff --git a/src/widgets/investment-form-section/ui/InvestmentFormSection.tsx b/src/widgets/investment-form-section/ui/InvestmentFormSection.tsx index 3892027..3e4b20b 100644 --- a/src/widgets/investment-form-section/ui/InvestmentFormSection.tsx +++ b/src/widgets/investment-form-section/ui/InvestmentFormSection.tsx @@ -1,4 +1,4 @@ -import { BaseCard, LabelText, DescriptionText, SharedTooltip, DebouncedInputSlider } from '../../../shared'; +import { BaseCard, DescriptionText, DebouncedInputSlider, TEXTS } from '../../../shared'; import { FC } from 'react'; interface InvestmentFormSectionProps { @@ -11,7 +11,7 @@ export const InvestmentFormSection: FC = ({ onInvestorAmountChange, }) => { return ( - +
= ({ tooltipFormatter={(value: number | undefined) => `${value?.toLocaleString('ru-RU')} ₽`} /> - Сумма денежных средств, которые вы вносите в «Результат» как «Инвестор». Взнос деньгами увеличивает вашу долю в складочном капитале и позволяет авторам и исполнителям получать выплаты по стоимости их труда. + {TEXTS.investmentForm.description}
diff --git a/src/widgets/legend-section/ui/LegendSection.tsx b/src/widgets/legend-section/ui/LegendSection.tsx index 7ce7b21..6b312d6 100644 --- a/src/widgets/legend-section/ui/LegendSection.tsx +++ b/src/widgets/legend-section/ui/LegendSection.tsx @@ -1,6 +1,6 @@ import { FC } from 'react'; import { Typography, Divider, Row, Col } from 'antd'; -import { BaseCard } from '../../../shared'; +import { BaseCard, TEXTS } from '../../../shared'; import '../styles/legend.css'; import { UserOutlined, BulbOutlined, DollarCircleOutlined, TeamOutlined, FileTextOutlined } from '@ant-design/icons'; @@ -9,71 +9,71 @@ const { Text } = Typography; export const LegendSection: FC = () => { return (
- «Исполнитель» - Участник, который создаёт результат, внося своё время. + {TEXTS.legend.executor} + {TEXTS.legend.executorDesc}
- «Автор» - Участник, который предложил проектную идею для «Результата». + {TEXTS.legend.author} + {TEXTS.legend.authorDesc}
- «Инвестор» - Участник, который предоставляет денежные средства для создания результата. + {TEXTS.legend.investor} + {TEXTS.legend.investorDesc}
- Участник - Любой участник системы, получающий выгоду от капитализации взносов в результат. + {TEXTS.legend.participant} + {TEXTS.legend.participantDesc}
- - + +
- «Результат» - Полезный объект интеллектуальной собственности - программа, презентация, приложение, метод, ... + {TEXTS.legend.result} + {TEXTS.legend.resultDesc}
- +
- «Доля» - Часть складочного капитала, выраженная в праве требования возврата паевого взноса из кооператива. + {TEXTS.legend.share} + {TEXTS.legend.shareDesc}
- +
- «Прибавка» - Дополнительный взнос, который образуется при внесении «Результата» в кооператив. + {TEXTS.legend.bonus} + {TEXTS.legend.bonusDesc}
- +
- «Благорост» - Увеличение «Доли» в «Результате» от «Премий». + {TEXTS.legend.blagorost} + {TEXTS.legend.blagorostDesc}
- Как это работает: Каждый взнос «Исполнителя» в «Результат» образует дополнительные взносы («Премии») для «Исполнителей», «Авторов» и «Ранние участники», которые определяются по золотому сечению, увеличивая «Долю» и «Результат» в целом. Денежные взносы «Инвесторов» не образуют дополнительных взносов («Премий») и обеспечивают компенсацию стоимости труда «Авторов» и «Исполнителей». + {TEXTS.legend.howItWorks} {TEXTS.legend.howItWorksText}
- Бизнес-модель: Увеличение «Результатов» ведет к расширению экосистемы платформы «Кооперативной Экономики», где подключенные кооперативы оплачивают членские взносы за электронный документооборот по минимальной подписке и по факту за каждый произведенный документ. Эти членские взносы составляют основной источник обеспечения возвратов сформированной выгоды для «Ранние участники». + {TEXTS.legend.businessModel} {TEXTS.legend.businessModelText}
diff --git a/src/widgets/monthly-contributions-section/ui/MonthlyContributionsSection.tsx b/src/widgets/monthly-contributions-section/ui/MonthlyContributionsSection.tsx index 4a93612..92d8107 100644 --- a/src/widgets/monthly-contributions-section/ui/MonthlyContributionsSection.tsx +++ b/src/widgets/monthly-contributions-section/ui/MonthlyContributionsSection.tsx @@ -1,4 +1,4 @@ -import { BaseCard, LabelText, DescriptionText, SharedTooltip, DebouncedInputSlider } from '../../../shared'; +import { BaseCard, LabelText, DescriptionText, SharedTooltip, DebouncedInputSlider, TEXTS } from '../../../shared'; import { FC } from 'react'; interface MonthlyContributionsSectionProps { @@ -11,11 +11,11 @@ export const MonthlyContributionsSection: FC = onMonthlyContributionsChange, }) => { return ( - +
- Сумма взносов в месяц - + {TEXTS.monthlyContributions.sumLabel} + = step={100000} formatter={(value: number | string) => `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ' ')} parser={(value: string | undefined) => value ? Number(value.replace(/\s/g, '')) : 0} - addonAfter="₽/мес" - tooltipFormatter={(value: number | undefined) => `${value?.toLocaleString('ru-RU')} ₽/мес`} + addonAfter={TEXTS.common.rublesPerMonth} + tooltipFormatter={(value: number | undefined) => `${value?.toLocaleString('ru-RU')} ${TEXTS.common.rublesPerMonth}`} /> - - Ежемесячная сумма взносов результатами других исполнителей - + {TEXTS.monthlyContributions.description}
); diff --git a/src/widgets/monthly-results-table/ui/MonthlyResultsTable.tsx b/src/widgets/monthly-results-table/ui/MonthlyResultsTable.tsx index 1d78299..4352c87 100644 --- a/src/widgets/monthly-results-table/ui/MonthlyResultsTable.tsx +++ b/src/widgets/monthly-results-table/ui/MonthlyResultsTable.tsx @@ -1,7 +1,9 @@ import { Table, Switch } from 'antd'; import { FC, useState } from 'react'; import { MonthlyResult, ColumnVisibility } from '../../../entities/core'; -import { BaseCard, SharedTooltip } from '../../../shared'; +import { BaseCard, SharedTooltip, TEXTS } from '../../../shared'; + +const C = TEXTS.monthlyResultsTable.columns; interface MonthlyResultsTableProps { results: MonthlyResult[]; @@ -25,117 +27,115 @@ export const MonthlyResultsTable: FC = ({ // Колонки для таблицы результатов const allColumns = [ { - title: columnTitle('Месяц', 'Номер месяца от начала участия. Месяц 1 - момент вступления, месяц 2 - первый месяц после внесения вашего взноса'), + title: columnTitle(C.month, C.monthTooltip), dataIndex: 'month', key: 'month', render: (value: number) => value + 1 }, { - title: columnTitle('Складочный капитал', 'Общая сумма всех взносов и «Премий» в системе на конец месяца, с учетом выплат членских взносов, которые уменьшают складочный капитал'), + title: columnTitle(C.shareholderCapital, C.shareholderCapitalTooltip), dataIndex: 'shareholderCapital', key: 'shareholderCapital', render: (value: number) => value.toLocaleString('ru-RU') + ' RUB' }, { - title: columnTitle('Прирост складочного капитала', 'Общий прирост складочного капитала за месяц с учетом всех взносов и «Премий»'), + title: columnTitle(C.capitalGrowth, C.capitalGrowthTooltip), dataIndex: 'capitalGrowth', key: 'capitalGrowth', render: (value: number) => value.toLocaleString('ru-RU') + ' RUB' }, - { - title: columnTitle('Сумма генерации', 'Общая сумма стоимости взносов «Результатов» труда «Исполнителей» и «Авторов», а также их «Премий» (без учёта «Премий» «Ранние участники» и взносов «Инвесторов») за месяц'), + title: columnTitle(C.monthlyGeneration, C.monthlyGenerationTooltip), dataIndex: 'monthlyGeneration', key: 'monthlyGeneration', render: (value: number) => value.toLocaleString('ru-RU') + ' RUB' }, { - title: columnTitle('«Прибавка» «Ранние участники»', 'Дополнительная капитализация от новых взносов «Результатами» труда «Исполнителей» и «Авторов» (161.8% от суммы стоимости труда и их «Премий» за вычетом возвратов)'), + title: columnTitle(C.contributorsBonus, C.contributorsBonusTooltip), dataIndex: 'contributorsBonus', key: 'contributorsBonus', render: (value: number) => value.toLocaleString('ru-RU') + ' RUB' }, { - title: columnTitle('Взнос других «Инвесторов»', 'Денежный взнос других «Инвесторов» в текущем месяце'), + title: columnTitle(C.monthlyInvestorAmount, C.monthlyInvestorAmountTooltip), dataIndex: 'monthlyInvestorAmount', key: 'monthlyInvestorAmount', render: (value: number) => value.toLocaleString('ru-RU') + ' RUB' }, { - title: columnTitle('Сумма взносов «Инвесторов»', 'Накопительная сумма всех взносов всех «Инвесторов» с начала учета (включая Вас)'), + title: columnTitle(C.totalInvestorsAmount, C.totalInvestorsAmountTooltip), dataIndex: 'totalInvestorsAmount', key: 'totalInvestorsAmount', render: (value: number) => value.toLocaleString('ru-RU') + ' RUB' }, { - title: columnTitle('Доля «Инвесторов»', 'Процентная доля всех «Инвесторов» в общем складочном капитале системы'), + title: columnTitle(C.investorsShare, C.investorsShareTooltip), dataIndex: 'investorsShare', key: 'investorsShare', render: (value: number) => value + ' %' }, { - title: columnTitle('Взносы других «Исполнителей» и «Инвесторов»', 'Общая сумма взносов других «Исполнителей» и «Инвесторов» в текущем месяце'), + title: columnTitle(C.currentMonthlyContributions, C.currentMonthlyContributionsTooltip), dataIndex: 'currentMonthlyContributions', key: 'currentMonthlyContributions', render: (value: number) => value.toLocaleString('ru-RU') + ' RUB' }, - , { - title: columnTitle('Взнос других «Исполнителей»', 'Базовая стоимость «Результатов» труда других «Исполнителей» в текущем месяце'), + title: columnTitle(C.othersCreatorBase, C.othersCreatorBaseTooltip), dataIndex: 'othersCreatorBase', key: 'othersCreatorBase', render: (value: number) => value.toLocaleString('ru-RU') + ' RUB' }, { - title: columnTitle('Взнос «Авторов» других', 'Стоимость труда «Авторов», связанных с «Результатами» других «Исполнителей» (61.8% от их базовой стоимости)'), + title: columnTitle(C.othersAuthorBase, C.othersAuthorBaseTooltip), dataIndex: 'othersAuthorBase', key: 'othersAuthorBase', render: (value: number) => value.toLocaleString('ru-RU') + ' RUB' }, { - title: columnTitle('«Прибавка» других «Создателей»', 'Дополнительная сумма, начисляемая другим «Исполнителям» (100% от стоимости их «Результатов»)'), + title: columnTitle(C.othersCreatorBonus, C.othersCreatorBonusTooltip), dataIndex: 'othersCreatorBonus', key: 'othersCreatorBonus', render: (value: number) => value.toLocaleString('ru-RU') + ' RUB' }, { - title: columnTitle('«Прибавка» «Авторов» других', 'Дополнительная сумма, начисляемая «Авторам» других «Создателей» (100% от стоимости их труда)'), + title: columnTitle(C.othersAuthorBonus, C.othersAuthorBonusTooltip), dataIndex: 'othersAuthorBonus', key: 'othersAuthorBonus', render: (value: number) => value.toLocaleString('ru-RU') + ' RUB' }, { - title: columnTitle('Возврат другим', 'Сумма возврата стоимости «Результатов» другим «Исполнителям» и их «Авторам» в текущем месяце'), + title: columnTitle(C.othersWithdrawalAmount, C.othersWithdrawalAmountTooltip), dataIndex: 'othersWithdrawalAmount', key: 'othersWithdrawalAmount', render: (value: number) => value.toLocaleString('ru-RU') + ' RUB' }, { - title: columnTitle('Предполагаемая стоимость вашего взноса', 'Общая сумма вашего взноса на конец месяца, включая первоначальный взнос и накопленную долю в «Прибавка»х «Ранние участники»'), + title: columnTitle(C.initialContribution, C.initialContributionTooltip), dataIndex: 'initialContribution', key: 'initialContribution', render: (value: number) => value.toLocaleString('ru-RU') + ' RUB' }, { - title: columnTitle('Ваша предполагаемая доля', 'Процент Вашей доли в общем складочном капитале системы'), + title: columnTitle(C.creatorShare, C.creatorShareTooltip), dataIndex: 'creatorShare', key: 'creatorShare', render: (value: number) => value + ' %' }, { - title: columnTitle('Предполагаемые членские взносы за документооборот', 'Сумма членских взносов за электронный документооборот, получаемые от подключенных кооперативов в текущем месяце'), + title: columnTitle(C.monthlyFee, C.monthlyFeeTooltip), dataIndex: 'monthlyFee', key: 'monthlyFee', render: (value: number) => value.toLocaleString('ru-RU') + ' RUB' }, { - title: columnTitle('Накопленные членские взносы за документооборот', 'Общая сумма накопленных членских взносов, ожидающих выплаты'), + title: columnTitle(C.accumulatedFees, C.accumulatedFeesTooltip), dataIndex: 'accumulatedFees', key: 'accumulatedFees', render: (value: number) => value.toLocaleString('ru-RU') + ' RUB' }, { - title: columnTitle('Ваши предполагаемые возвраты', 'Сумма, которую вы предположительно получите в текущем месяце (возврат стоимости «Результата» в 1 месяце или членские взносы в последующих месяцах выплат)'), + title: columnTitle(C.creatorMembershipFeePayment, C.creatorMembershipFeePaymentTooltip), dataIndex: 'creatorMembershipFeePayment', key: 'creatorMembershipFeePayment', render: (value: number) => value.toLocaleString('ru-RU') + ' RUB' @@ -159,14 +159,14 @@ export const MonthlyResultsTable: FC = ({ .filter(Boolean) as Exclude[]; // Явно приводим к массиву колонок без undefined return ( - +
- Кратко + {TEXTS.monthlyResultsTable.brief} - Подробно + {TEXTS.monthlyResultsTable.detailed}
= creatorBonus, }) => { return ( - - + + - Включает в себя: предполагаемую выгоду от дополнительных взносов («Премий»), увеличивающих стоимость Вашего права требования; членские взносы кооперативов за использование электронного документооборота платформы; а также единоразовую «Премию» «Исполнителя» за взнос трудом. + {TEXTS.profitabilityResults.description} -
+
- Указанное значение годовой выгоды является предположительным и может изменяться как в большую так и в меньшую сторону в зависимости - от фактической эффективности использования капитала, динамики прироста новых взносов, - а также поведения «Авторов» и «Создателей» в отношении возвратов стоимости их труда. + {TEXTS.profitabilityResults.disclaimer}
diff --git a/src/widgets/system-params-section/ui/SystemParamsSection.tsx b/src/widgets/system-params-section/ui/SystemParamsSection.tsx index dc21d91..56a54c7 100644 --- a/src/widgets/system-params-section/ui/SystemParamsSection.tsx +++ b/src/widgets/system-params-section/ui/SystemParamsSection.tsx @@ -1,6 +1,6 @@ import { Row, Col, Space, Badge } from 'antd'; import { FC } from 'react'; -import { BaseCard, LabelText, DescriptionText, SharedTooltip, DebouncedInputSlider } from '../../../shared'; +import { BaseCard, LabelText, DescriptionText, SharedTooltip, DebouncedInputSlider, TEXTS } from '../../../shared'; import { CALCULATOR_CONSTANTS } from '../../../entities/core/model/constants'; @@ -30,7 +30,7 @@ export const SystemParamsSection: FC = ({ onMonthlyContributionsChange, }) => { return ( - + {/* Левая колонка — константы */}
@@ -40,14 +40,14 @@ export const SystemParamsSection: FC = ({ word-break: break-all; } `} - Константы + {TEXTS.systemParams.constants} - Стоимость труда «Исполнителя»: {(100).toFixed(1)}% - + {TEXTS.systemParams.executorLaborCost}: {(100).toFixed(1)}% + } /> @@ -55,8 +55,8 @@ export const SystemParamsSection: FC = ({ color="#52c41a" text={ - Стоимость труда «Автора» от «Исполнителя»: {(CALCULATOR_CONSTANTS.AUTHOR_RATIO * 100).toFixed(1)}% - + {TEXTS.systemParams.authorLaborCost}: {(CALCULATOR_CONSTANTS.AUTHOR_RATIO * 100).toFixed(1)}% + } /> @@ -64,8 +64,8 @@ export const SystemParamsSection: FC = ({ color="#1890ff" text={ - «Прибавка» «Исполнителя»: {(CALCULATOR_CONSTANTS.CREATOR_BONUS_RATIO * 100).toFixed(0)}% - + {TEXTS.systemParams.executorBonus}: {(CALCULATOR_CONSTANTS.CREATOR_BONUS_RATIO * 100).toFixed(0)}% + } /> @@ -73,8 +73,8 @@ export const SystemParamsSection: FC = ({ color="#722ed1" text={ - «Прибавка» «Автора»: {(CALCULATOR_CONSTANTS.AUTHOR_BONUS_RATIO * 100).toFixed(0)}% - + {TEXTS.systemParams.authorBonus}: {(CALCULATOR_CONSTANTS.AUTHOR_BONUS_RATIO * 100).toFixed(0)}% + } /> @@ -82,8 +82,8 @@ export const SystemParamsSection: FC = ({ color="#faad14" text={ - «Прибавка» «Ранние участники»: {CALCULATOR_CONSTANTS.GOLDEN_RATIO * 100}% - + {TEXTS.systemParams.participantsBonus}: {CALCULATOR_CONSTANTS.GOLDEN_RATIO * 100}% + } /> @@ -91,8 +91,8 @@ export const SystemParamsSection: FC = ({ color="#d4380d" text={ - Месяцы выплат: {CALCULATOR_CONSTANTS.PAYOUT_MONTHS.join(', ')} - + {TEXTS.systemParams.payoutMonths}: {CALCULATOR_CONSTANTS.PAYOUT_MONTHS.join(', ')} + } /> @@ -100,8 +100,8 @@ export const SystemParamsSection: FC = ({ color="#9254de" text={ - Отложенные первые выплаты: {CALCULATOR_CONSTANTS.DELAYED_FIRST_PAYMENTS} мес. - + {TEXTS.systemParams.delayedFirstPayments}: {CALCULATOR_CONSTANTS.DELAYED_FIRST_PAYMENTS} {TEXTS.systemParams.months} + } /> @@ -109,16 +109,14 @@ export const SystemParamsSection: FC = ({ color="#d4380d" text={ - Обеспечение инвестициями: 100% - + {TEXTS.systemParams.investmentProvision}: 100% + } /> -
- - При снижении уровня взносов от инвесторов возвраты стоимости труда «Исполнителям» и «Авторам» могут быть отложены до поступления достаточного объёма новых инвестиций. - +
+ {TEXTS.systemParams.disclaimer}
@@ -127,7 +125,7 @@ export const SystemParamsSection: FC = ({ {/* Стартовая капитализация */}
- Стартовый складочный капитал + {TEXTS.systemParams.initialCapital} = ({ sliderStyle={{ marginBottom: 16 }} /> - Начальный складочный капитал, на базе которого производится расчет. Фиксируется и публикуется в бухгалтерской отчетности кооператива ежеквартально. + {TEXTS.systemParams.initialCapitalDesc}
{/* Ежемесячные взносы результатами других создателей */}
- Ежемесячные взносы трудом других «Создателей» + {TEXTS.systemParams.monthlyContributions} = ({ step={100000} formatter={(value: number | string) => `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ' ')} parser={(value: string | undefined) => value ? Number(value.replace(/\s/g, '')) : 0} - addonAfter="₽/мес" - tooltipFormatter={(value: number | undefined) => `${value?.toLocaleString('ru-RU')} ₽/мес`} + addonAfter={TEXTS.common.rublesPerMonth} + tooltipFormatter={(value: number | undefined) => `${value?.toLocaleString('ru-RU')} ${TEXTS.common.rublesPerMonth}`} sliderStyle={{ marginBottom: 16 }} /> - Общая сумма взносов «Результатами» других «Создателей», вносимая ими в систему ежемесячно после вашего внесения «Результата». Эти взносы создают «Премии», которые увеличивают складочный капитал и приносят выгоду всем участникам, включая Вас. + {TEXTS.systemParams.monthlyContributionsDesc}
{/* Множитель роста взносов результатами */}
- Множитель роста взносов «Результатами» + {TEXTS.systemParams.growthMultiplier} = ({ unitSuffix="%" /> - Определяет динамику роста «Результатов» - насколько увеличиваются взносы «Результатов» других «Создателей» каждый месяц + {TEXTS.systemParams.growthMultiplierDesc}
{/* Эффективность капитала */}
- Эффективность капитала в месяц + {TEXTS.systemParams.capitalEfficiency} = ({ unitSuffix="%" /> - Эффективность показывает, сколько членских взносов приходит за электронный документооборот на каждый новый рубль складочного капитала в месяц. + {TEXTS.systemParams.capitalEfficiencyDesc}
{/* Множитель роста членских взносов */}
- Множитель роста эффективности капитала + {TEXTS.systemParams.membershipFeeGrowth} = ({ unitSuffix="%" /> - Определяет ежемесячный прирост членских взносов по формуле сложного процента, которая применяется на эффективности капитала. + {TEXTS.systemParams.membershipFeeGrowthDesc}
diff --git a/src/widgets/withdrawal-rate-section/ui/WithdrawalRateSection.tsx b/src/widgets/withdrawal-rate-section/ui/WithdrawalRateSection.tsx index 0e27648..1192745 100644 --- a/src/widgets/withdrawal-rate-section/ui/WithdrawalRateSection.tsx +++ b/src/widgets/withdrawal-rate-section/ui/WithdrawalRateSection.tsx @@ -1,4 +1,4 @@ -import { BaseCard, LabelText, DescriptionText, SharedTooltip, DebouncedInputSlider } from '../../../shared'; +import { BaseCard, DescriptionText, DebouncedInputSlider, TEXTS } from '../../../shared'; import { FC } from 'react'; interface WithdrawalRateSectionProps { @@ -11,7 +11,7 @@ export const WithdrawalRateSection: FC = ({ onWithdrawalRateChange, }) => { return ( - +
= ({ />
- Определяет долю стоимости труда, которая будет выплачена после внесения «Результата» в кооператив. Оставленная в кооперативе часть стоимости капитализируется новыми взносами «Исполнителей». Важно: в этой модели мы предполагаем, что `Все действуют как Вы` - т.е. каждый исполнитель и автор будет возвращать такую же часть стоимости, какую Вы укажите здесь для себя. - {/* {withdrawalRate === 0 - ? "Вся стоимость труда остается в системе (максимальная выгода)" - : withdrawalRate === 100 - ? "Вся стоимость труда возвращается при внесении «Результата» (минимальная выгода)" - : "Часть стоимости труда возвращается, а часть капитализируется новыми «Результатами»"} */} + {TEXTS.withdrawalRate.description}