import type { Meta, StoryObj } from "@storybook/react-vite"; import type { AccountPagePosition } from "../../AccountPage.vm"; import { PositionCard } from "./PositionCard.view"; const syntheticPosition = { figi: null, displayName: "Учебные технологии", type: "STOCK", quantity: "100", currentValue: { currency: "RUB", value: "25000" }, averagePurchasePrice: { currency: "RUB", value: "200" }, absoluteReturn: { currency: "RUB", value: "5000" }, isin: null, ticker: "DEMO", logoName: null, shareText: "20%", returnText: "+5 000 ₽", returnTone: "positive", logoSrc: null, } satisfies AccountPagePosition; const meta = { title: "Product/PositionCard", component: PositionCard, tags: ["autodocs"], argTypes: { kind: { control: "inline-radio", options: ["stocks", "bonds", "other"], }, position: { control: false }, }, parameters: { docs: { description: { component: "Позиция портфеля WealthLedger: количество, стоимость, результат и доля. Доля и текст результата поступают готовыми из модели представления. Карточка не рассчитывает доходность. Все данные вымышлены; логотип заменён буквенным обозначением.", }, }, }, args: { kind: "stocks", position: syntheticPosition }, } satisfies Meta; export default meta; type Story = StoryObj; export const StockGain: Story = { name: "Акция с положительным результатом", parameters: { docs: { description: { story: "Развёрнутая карточка акции показывает тикер, оценку позиции и положительный результат. Цвет дополняет знак суммы.", }, }, }, }; export const BondLoss: Story = { name: "Облигация с отрицательным результатом", args: { kind: "bonds", position: { ...syntheticPosition, displayName: "Учебные облигации для долгосрочных накоплений, выпуск 2030", type: "BOND", quantity: "10", currentValue: { currency: "RUB", value: "9500" }, averagePurchasePrice: { currency: "RUB", value: "1000" }, absoluteReturn: { currency: "RUB", value: "-500" }, isin: "DEMO-BOND-2030", ticker: null, shareText: "7,6%", returnText: "−500 ₽", returnTone: "negative", }, }, parameters: { docs: { description: { story: "Для облигации используется идентификатор выпуска. Длинное имя и отрицательная сумма позволяют проверить компактное представление на узком экране.", }, }, }, }; export const Other: Story = { name: "Прочий инструмент", args: { kind: "other", position: { ...syntheticPosition, displayName: "Учебный фонд", type: "FUND", isin: "DEMO-FUND", ticker: null, }, }, parameters: { docs: { description: { story: "Компактный вариант для остальных инструментов сохраняет количество, стоимость и пояснение результата без оформления акции или облигации.", }, }, }, }; export const MissingValuation: Story = { name: "Оценка и идентификаторы отсутствуют", args: { position: { ...syntheticPosition, displayName: "Учебная позиция без текущей оценки", currentValue: null, averagePurchasePrice: null, absoluteReturn: null, ticker: null, shareText: null, returnText: null, returnTone: undefined, }, }, parameters: { docs: { description: { story: "При отсутствии оценки остаются название и количество. Неизвестная стоимость, доля и результат не изображаются нулевыми значениями.", }, }, }, };