diff --git a/ordinis-admin-ui/src/auth/AuthBadge.tsx b/ordinis-admin-ui/src/auth/AuthBadge.tsx index 9d5a648..f091e7c 100644 --- a/ordinis-admin-ui/src/auth/AuthBadge.tsx +++ b/ordinis-admin-ui/src/auth/AuthBadge.tsx @@ -1,6 +1,6 @@ import { useAuth } from 'react-oidc-context' import { useTranslation } from 'react-i18next' -import { Button, IconButton } from '@nstart/ui' +import { Button, IconButton } from '@/ui' import { SignInIcon, SignOutIcon, UserIcon } from '@phosphor-icons/react' /** diff --git a/ordinis-admin-ui/src/components/form/SchemaDrivenForm.tsx b/ordinis-admin-ui/src/components/form/SchemaDrivenForm.tsx index cebc62d..d535330 100644 --- a/ordinis-admin-ui/src/components/form/SchemaDrivenForm.tsx +++ b/ordinis-admin-ui/src/components/form/SchemaDrivenForm.tsx @@ -20,7 +20,7 @@ import { TextInput, type SelectOption, type TabItem, -} from '@nstart/ui' +} from '@/ui' import type { CreateRecordRequest, FlattenedRecord, JsonSchema } from '@/api/client' import { useReferencedRecords } from '@/api/queries' import { diff --git a/ordinis-admin-ui/src/components/geo/AoiPickerDialog.tsx b/ordinis-admin-ui/src/components/geo/AoiPickerDialog.tsx index 417de71..e6e2945 100644 --- a/ordinis-admin-ui/src/components/geo/AoiPickerDialog.tsx +++ b/ordinis-admin-ui/src/components/geo/AoiPickerDialog.tsx @@ -1,6 +1,6 @@ import { useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' -import { Alert, Button, FormActions, Modal } from '@nstart/ui' +import { Alert, Button, FormActions, Modal } from '@/ui' import L from 'leaflet' import 'leaflet/dist/leaflet.css' diff --git a/ordinis-admin-ui/src/components/lineage/CascadeConfirmDialog.tsx b/ordinis-admin-ui/src/components/lineage/CascadeConfirmDialog.tsx index 353cbd2..1945dc5 100644 --- a/ordinis-admin-ui/src/components/lineage/CascadeConfirmDialog.tsx +++ b/ordinis-admin-ui/src/components/lineage/CascadeConfirmDialog.tsx @@ -1,6 +1,6 @@ import { useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' -import { Alert, Badge, Button, LoadingBlock, Modal, TextInput } from '@nstart/ui' +import { Alert, Badge, Button, LoadingBlock, Modal, TextInput } from '@/ui' import { WarningIcon, XCircleIcon } from '@phosphor-icons/react' import { useCascadePreview } from '@/api/queries' import { useCascadeCloseRecord } from '@/api/mutations' diff --git a/ordinis-admin-ui/src/components/lineage/DictionaryDependentsPanel.tsx b/ordinis-admin-ui/src/components/lineage/DictionaryDependentsPanel.tsx index a5605b6..1dadb5f 100644 --- a/ordinis-admin-ui/src/components/lineage/DictionaryDependentsPanel.tsx +++ b/ordinis-admin-ui/src/components/lineage/DictionaryDependentsPanel.tsx @@ -1,6 +1,6 @@ import { useTranslation } from 'react-i18next' import { Link } from '@tanstack/react-router' -import { Badge, Panel } from '@nstart/ui' +import { Badge, Panel } from '@/ui' import { ArrowRightIcon } from '@phosphor-icons/react' import { useDictionaryDependents } from '@/api/queries' import type { OnCloseAction } from '@/api/client' diff --git a/ordinis-admin-ui/src/components/lineage/DictionaryHubView.tsx b/ordinis-admin-ui/src/components/lineage/DictionaryHubView.tsx index 3cb8810..e89fb4d 100644 --- a/ordinis-admin-ui/src/components/lineage/DictionaryHubView.tsx +++ b/ordinis-admin-ui/src/components/lineage/DictionaryHubView.tsx @@ -16,7 +16,7 @@ import { useMemo } from 'react' import { Link } from '@tanstack/react-router' import { useTranslation } from 'react-i18next' -import { Badge } from '@nstart/ui' +import { Badge } from '@/ui' import { useDictionaryDependents, useDictionaries } from '@/api/queries' import type { DictionaryDetail, DictionaryDefinition, JsonSchema } from '@/api/client' diff --git a/ordinis-admin-ui/src/components/lineage/RecordDependentsPanel.tsx b/ordinis-admin-ui/src/components/lineage/RecordDependentsPanel.tsx index 47c1945..d9ad92b 100644 --- a/ordinis-admin-ui/src/components/lineage/RecordDependentsPanel.tsx +++ b/ordinis-admin-ui/src/components/lineage/RecordDependentsPanel.tsx @@ -1,7 +1,7 @@ import { useState } from 'react' import { useTranslation } from 'react-i18next' import { Link } from '@tanstack/react-router' -import { Alert, Badge, Button, LoadingBlock } from '@nstart/ui' +import { Alert, Badge, Button, LoadingBlock } from '@/ui' import { CaretLeftIcon, CaretRightIcon, ArrowSquareOutIcon } from '@phosphor-icons/react' import { useRecordDependents } from '@/api/queries' import type { OnCloseAction } from '@/api/client' diff --git a/ordinis-admin-ui/src/components/record/RecordHistoryDrawer.tsx b/ordinis-admin-ui/src/components/record/RecordHistoryDrawer.tsx index e7865df..46de657 100644 --- a/ordinis-admin-ui/src/components/record/RecordHistoryDrawer.tsx +++ b/ordinis-admin-ui/src/components/record/RecordHistoryDrawer.tsx @@ -1,5 +1,5 @@ import { useTranslation } from 'react-i18next' -import { Alert, Badge, Drawer, LoadingBlock } from '@nstart/ui' +import { Alert, Badge, Drawer, LoadingBlock } from '@/ui' import { useRecordHistory } from '@/api/queries' import { RecordDependentsPanel } from '@/components/lineage/RecordDependentsPanel' diff --git a/ordinis-admin-ui/src/components/schema/DictionaryEditorDialog.tsx b/ordinis-admin-ui/src/components/schema/DictionaryEditorDialog.tsx index 1451d90..ddedb12 100644 --- a/ordinis-admin-ui/src/components/schema/DictionaryEditorDialog.tsx +++ b/ordinis-admin-ui/src/components/schema/DictionaryEditorDialog.tsx @@ -14,7 +14,7 @@ import { TextInput, type SelectOption, type TabItem, -} from '@nstart/ui' +} from '@/ui' import { useCreateDictionary, useUpdateDictionary } from '@/api/mutations' import { dictionaryDetailQuery, useDictionaries } from '@/api/queries' import type { CreateDictionaryRequest, DataScope, DictionaryDetail } from '@/api/client' diff --git a/ordinis-admin-ui/src/components/schema/EventsPreviewTab.tsx b/ordinis-admin-ui/src/components/schema/EventsPreviewTab.tsx index 6063c46..905c493 100644 --- a/ordinis-admin-ui/src/components/schema/EventsPreviewTab.tsx +++ b/ordinis-admin-ui/src/components/schema/EventsPreviewTab.tsx @@ -1,6 +1,6 @@ import { useState } from 'react' import { useTranslation } from 'react-i18next' -import { Badge, Tabs, type TabItem } from '@nstart/ui' +import { Badge, Tabs, type TabItem } from '@/ui' import { generateEventPreviews } from './eventPreview' import type { DataScope, JsonSchema } from '@/api/client' diff --git a/ordinis-admin-ui/src/components/schema/PropertyEditor.tsx b/ordinis-admin-ui/src/components/schema/PropertyEditor.tsx index 9d4d6f2..e5170fb 100644 --- a/ordinis-admin-ui/src/components/schema/PropertyEditor.tsx +++ b/ordinis-admin-ui/src/components/schema/PropertyEditor.tsx @@ -9,7 +9,7 @@ import { TextInput, TextArea, type SelectOption, -} from '@nstart/ui' +} from '@/ui' import { TrashIcon, ArrowUpIcon, ArrowDownIcon } from '@phosphor-icons/react' import type { PropertyDef, PropertyKind } from './types' import { PROPERTY_KINDS } from './types' diff --git a/ordinis-admin-ui/src/components/schema/SchemaBuilder.tsx b/ordinis-admin-ui/src/components/schema/SchemaBuilder.tsx index 9b91754..16daf31 100644 --- a/ordinis-admin-ui/src/components/schema/SchemaBuilder.tsx +++ b/ordinis-admin-ui/src/components/schema/SchemaBuilder.tsx @@ -1,5 +1,5 @@ import { useTranslation } from 'react-i18next' -import { Button, EmptyState } from '@nstart/ui' +import { Button, EmptyState } from '@/ui' import { PlusIcon } from '@phosphor-icons/react' import { PropertyEditor } from './PropertyEditor' import { newPropertyDef, type PropertyDef } from './types' diff --git a/ordinis-admin-ui/src/components/version/UpdateBanner.tsx b/ordinis-admin-ui/src/components/version/UpdateBanner.tsx index 2fbceab..ec533f7 100644 --- a/ordinis-admin-ui/src/components/version/UpdateBanner.tsx +++ b/ordinis-admin-ui/src/components/version/UpdateBanner.tsx @@ -1,5 +1,5 @@ import { useTranslation } from 'react-i18next' -import { Button } from '@nstart/ui' +import { Button } from '@/ui' import { ArrowClockwise, BookOpen, X } from '@phosphor-icons/react' import { useState } from 'react' import { useAppVersion } from './useAppVersion' diff --git a/ordinis-admin-ui/src/main.tsx b/ordinis-admin-ui/src/main.tsx index 287bab3..087854a 100644 --- a/ordinis-admin-ui/src/main.tsx +++ b/ordinis-admin-ui/src/main.tsx @@ -2,7 +2,7 @@ import { StrictMode } from 'react' import { createRoot } from 'react-dom/client' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { RouterProvider, createRouter } from '@tanstack/react-router' -import { NStartUiProvider, DatePickerProvider, DATE_PICKER_LOCALE_RU } from '@nstart/ui' +import { NStartUiProvider, DatePickerProvider, DATE_PICKER_LOCALE_RU } from '@/ui' import { AuthProvider } from 'react-oidc-context' import { routeTree } from './routeTree.gen' import { oidcAuthConfig } from '@/auth/oidcConfig' diff --git a/ordinis-admin-ui/src/routes/__root.tsx b/ordinis-admin-ui/src/routes/__root.tsx index 31ddb23..6937da9 100644 --- a/ordinis-admin-ui/src/routes/__root.tsx +++ b/ordinis-admin-ui/src/routes/__root.tsx @@ -1,7 +1,7 @@ import { createRootRouteWithContext, Link, Outlet } from '@tanstack/react-router' import type { QueryClient } from '@tanstack/react-query' import { useTranslation } from 'react-i18next' -import { LanguageSwitch } from '@nstart/ui' +import { LanguageSwitch } from '@/ui' import { AuthBadge } from '@/auth/AuthBadge' import { useCanMutate } from '@/auth/useCanMutate' import { ThemeSwitch } from '@/components/layout/ThemeSwitch' diff --git a/ordinis-admin-ui/src/routes/audit.tsx b/ordinis-admin-ui/src/routes/audit.tsx index ebdf6da..02cbbde 100644 --- a/ordinis-admin-ui/src/routes/audit.tsx +++ b/ordinis-admin-ui/src/routes/audit.tsx @@ -19,7 +19,7 @@ import { TableHeaderCell, TableRow, TextInput, -} from '@nstart/ui' +} from '@/ui' import { ArrowsClockwiseIcon, CaretDownIcon, diff --git a/ordinis-admin-ui/src/routes/dictionaries.$name.tsx b/ordinis-admin-ui/src/routes/dictionaries.$name.tsx index c036249..80bbaa6 100644 --- a/ordinis-admin-ui/src/routes/dictionaries.$name.tsx +++ b/ordinis-admin-ui/src/routes/dictionaries.$name.tsx @@ -21,7 +21,7 @@ import { TableHeaderCell, TableRow, TextInput, -} from '@nstart/ui' +} from '@/ui' import { PlusIcon, PencilSimpleIcon, XCircleIcon, GearIcon, ClockCounterClockwiseIcon, MapTrifoldIcon, TrashIcon, CheckCircleIcon, WarningIcon, XIcon, DownloadSimpleIcon, CaretLeftIcon, CaretRightIcon } from '@phosphor-icons/react' import { useDictionaryDetail, diff --git a/ordinis-admin-ui/src/routes/dictionaries.index.tsx b/ordinis-admin-ui/src/routes/dictionaries.index.tsx index cdfcdc9..991646b 100644 --- a/ordinis-admin-ui/src/routes/dictionaries.index.tsx +++ b/ordinis-admin-ui/src/routes/dictionaries.index.tsx @@ -16,7 +16,7 @@ import { useDeferredValue, useMemo, useState } from 'react' import { createFileRoute, Link, useNavigate } from '@tanstack/react-router' import { useTranslation } from 'react-i18next' -import { Alert, Badge, Button, EmptyState, LoadingBlock, PageHeader, SearchInput } from '@nstart/ui' +import { Alert, Badge, Button, EmptyState, LoadingBlock, PageHeader, SearchInput } from '@/ui' import { PlusIcon } from '@phosphor-icons/react' import { useQueries } from '@tanstack/react-query' import { dictionaryDependentsQuery, useDictionaries, useDictionaryDependents } from '@/api/queries' diff --git a/ordinis-admin-ui/src/routes/my-drafts.tsx b/ordinis-admin-ui/src/routes/my-drafts.tsx index 765487c..435f784 100644 --- a/ordinis-admin-ui/src/routes/my-drafts.tsx +++ b/ordinis-admin-ui/src/routes/my-drafts.tsx @@ -15,7 +15,7 @@ import { TableHead, TableHeaderCell, TableRow, -} from '@nstart/ui' +} from '@/ui' import { useMyDrafts } from '@/api/queries' import { useWithdrawDraft } from '@/api/mutations' import type { DraftOperation, DraftStatus } from '@/api/client' diff --git a/ordinis-admin-ui/src/routes/outbox.tsx b/ordinis-admin-ui/src/routes/outbox.tsx index 612d163..54a29e7 100644 --- a/ordinis-admin-ui/src/routes/outbox.tsx +++ b/ordinis-admin-ui/src/routes/outbox.tsx @@ -14,7 +14,7 @@ import { TableHead, TableHeaderCell, TableRow, -} from '@nstart/ui' +} from '@/ui' import { ArrowsClockwiseIcon } from '@phosphor-icons/react' import { useDlq, useOutboxStats } from '@/api/queries' diff --git a/ordinis-admin-ui/src/routes/reviews.tsx b/ordinis-admin-ui/src/routes/reviews.tsx index 64bdc48..3dd5554 100644 --- a/ordinis-admin-ui/src/routes/reviews.tsx +++ b/ordinis-admin-ui/src/routes/reviews.tsx @@ -20,7 +20,7 @@ import { TableRow, TextArea, TextInput, -} from '@nstart/ui' +} from '@/ui' import { CheckCircleIcon, XCircleIcon } from '@phosphor-icons/react' import { useDraft, useLiveRecord, useReviewQueue } from '@/api/queries' import { useApproveDraft, useRejectDraft } from '@/api/mutations' diff --git a/ordinis-admin-ui/src/routes/search.tsx b/ordinis-admin-ui/src/routes/search.tsx index 7c288db..f9ba62e 100644 --- a/ordinis-admin-ui/src/routes/search.tsx +++ b/ordinis-admin-ui/src/routes/search.tsx @@ -9,7 +9,7 @@ import { PageHeader, Panel, SearchInput, -} from '@nstart/ui' +} from '@/ui' import { useSearch } from '@/api/queries' type SearchSearch = { q?: string } diff --git a/ordinis-admin-ui/src/routes/webhooks.$id.tsx b/ordinis-admin-ui/src/routes/webhooks.$id.tsx index 2280f38..ccfc593 100644 --- a/ordinis-admin-ui/src/routes/webhooks.$id.tsx +++ b/ordinis-admin-ui/src/routes/webhooks.$id.tsx @@ -16,7 +16,7 @@ import { TableHead, TableHeaderCell, TableRow, -} from '@nstart/ui' +} from '@/ui' import { ArrowClockwiseIcon, ArrowsClockwiseIcon, diff --git a/ordinis-admin-ui/src/routes/webhooks.index.tsx b/ordinis-admin-ui/src/routes/webhooks.index.tsx index b527810..c9f7229 100644 --- a/ordinis-admin-ui/src/routes/webhooks.index.tsx +++ b/ordinis-admin-ui/src/routes/webhooks.index.tsx @@ -21,7 +21,7 @@ import { TextArea, TextInput, type SelectOption, -} from '@nstart/ui' +} from '@/ui' import { CopyIcon, PlusIcon, diff --git a/ordinis-admin-ui/src/ui/components/alert.tsx b/ordinis-admin-ui/src/ui/components/alert.tsx index fdae404..b136d41 100644 --- a/ordinis-admin-ui/src/ui/components/alert.tsx +++ b/ordinis-admin-ui/src/ui/components/alert.tsx @@ -15,6 +15,8 @@ const alertVariants = cva( success: 'border-l-green bg-green-bg text-ink', warning: 'border-l-warn bg-warn-bg text-ink', danger: 'border-l-pink bg-pink-bg text-ink', + // Alias для nstart-compat: error === danger визуально. + error: 'border-l-pink bg-pink-bg text-ink', neutral: 'border-l-line bg-surface-2 text-ink', }, }, @@ -25,14 +27,21 @@ const alertVariants = cva( export type AlertProps = React.HTMLAttributes & VariantProps & { title?: React.ReactNode + /** Right-aligned slot для action button(s) inside alert. */ + action?: React.ReactNode } export const Alert = React.forwardRef( - function Alert({ className, variant, title, children, ...props }, ref) { + function Alert({ className, variant, title, action, children, ...props }, ref) { return (
- {title &&
{title}
} -
{children}
+
+
+ {title &&
{title}
} +
{children}
+
+ {action &&
{action}
} +
) }, diff --git a/ordinis-admin-ui/src/ui/components/badge.tsx b/ordinis-admin-ui/src/ui/components/badge.tsx index 86e7f3f..2cf2cc7 100644 --- a/ordinis-admin-ui/src/ui/components/badge.tsx +++ b/ordinis-admin-ui/src/ui/components/badge.tsx @@ -12,6 +12,13 @@ const badgeVariants = cva( success: 'bg-green-bg text-green', warning: 'bg-warn-bg text-warn', danger: 'bg-pink-bg text-pink', + // Aliases для nstart-compat: error == danger, neutral == default, + // info == accent. + error: 'bg-pink-bg text-pink', + neutral: 'bg-surface-2 text-ink-2 border border-line', + info: 'bg-accent-bg text-accent', + // Alias для nstart-compat — старый Badge variant='primary' эквивалентен accent. + primary: 'bg-accent text-on-accent', outline: 'border border-line text-ink-2', }, }, diff --git a/ordinis-admin-ui/src/ui/components/button.tsx b/ordinis-admin-ui/src/ui/components/button.tsx index fe693af..516a743 100644 --- a/ordinis-admin-ui/src/ui/components/button.tsx +++ b/ordinis-admin-ui/src/ui/components/button.tsx @@ -61,21 +61,44 @@ export type ButtonProps = React.ButtonHTMLAttributes & asChild?: boolean leftIcon?: React.ReactNode rightIcon?: React.ReactNode + /** Loading state — disables button + replaces leftIcon с inline spinner. */ + loading?: boolean } export const Button = React.forwardRef( function Button( - { className, variant, size, asChild, leftIcon, rightIcon, children, ...props }, + { + className, + variant, + size, + asChild, + leftIcon, + rightIcon, + loading, + disabled, + children, + ...props + }, ref, ) { const Comp = asChild ? Slot : 'button' + const renderedLeftIcon = loading ? ( + + + + + ) : ( + leftIcon + ) return ( - {leftIcon} + {renderedLeftIcon} {children} {rightIcon} diff --git a/ordinis-admin-ui/src/ui/components/drawer.tsx b/ordinis-admin-ui/src/ui/components/drawer.tsx new file mode 100644 index 0000000..aa1e400 --- /dev/null +++ b/ordinis-admin-ui/src/ui/components/drawer.tsx @@ -0,0 +1,68 @@ +import * as React from 'react' +import { + Sheet, + SheetContent, + SheetHeader, + SheetTitle, + SheetDescription, +} from './sheet' +import { cn } from '@/lib/utils' + +/** + * Drawer — adapter с @nstart/ui-style API над Radix Sheet (slide-over). + * Используется существующим кодом для side panels (record drawer, history, + * review preview). + * + * Props mapping: + * isOpen → Sheet.open + * onClose → Sheet.onOpenChange + * title → SheetTitle + * side → SheetContent.side (right default) + * widthClassName → custom className на SheetContent (override defaults) + * size → SheetContent.size shorthand (sm/md/lg/xl) + */ + +export type DrawerProps = { + isOpen: boolean + onClose: () => void + title?: React.ReactNode + description?: React.ReactNode + side?: 'left' | 'right' | 'top' | 'bottom' + size?: 'sm' | 'md' | 'lg' | 'xl' + widthClassName?: string + children?: React.ReactNode +} + +export function Drawer({ + isOpen, + onClose, + title, + description, + side = 'right', + size, + widthClassName, + children, +}: DrawerProps) { + return ( + { + if (!open) onClose() + }} + > + + {(title || description) && ( + + {title && {title}} + {description && {description}} + + )} + {children} + + + ) +} diff --git a/ordinis-admin-ui/src/ui/components/input.tsx b/ordinis-admin-ui/src/ui/components/input.tsx index bcb7d43..9979242 100644 --- a/ordinis-admin-ui/src/ui/components/input.tsx +++ b/ordinis-admin-ui/src/ui/components/input.tsx @@ -4,27 +4,71 @@ import { cn } from '@/lib/utils' /** * Text input — single-line. Использует наши tokens, focus-ring через accent. * - * Wrap'итесь в {@code