endfield-vision 0.0.0-stage → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +205 -2
- package/README.ru.md +206 -0
- package/dist/components/Accordion.d.ts +49 -0
- package/dist/components/Accordion.d.ts.map +1 -0
- package/dist/components/Accordion.js +63 -0
- package/dist/components/Accordion.js.map +1 -0
- package/dist/components/AnimatedNumber.d.ts +25 -0
- package/dist/components/AnimatedNumber.d.ts.map +1 -0
- package/dist/components/AnimatedNumber.js +33 -0
- package/dist/components/AnimatedNumber.js.map +1 -0
- package/dist/components/AppShell.d.ts +54 -0
- package/dist/components/AppShell.d.ts.map +1 -0
- package/dist/components/AppShell.js +75 -0
- package/dist/components/AppShell.js.map +1 -0
- package/dist/components/AvatarGroup.d.ts +21 -0
- package/dist/components/AvatarGroup.d.ts.map +1 -0
- package/dist/components/AvatarGroup.js +15 -0
- package/dist/components/AvatarGroup.js.map +1 -0
- package/dist/components/BadgeStack.d.ts +26 -0
- package/dist/components/BadgeStack.d.ts.map +1 -0
- package/dist/components/BadgeStack.js +24 -0
- package/dist/components/BadgeStack.js.map +1 -0
- package/dist/components/Banner.d.ts +29 -0
- package/dist/components/Banner.d.ts.map +1 -0
- package/dist/components/Banner.js +68 -0
- package/dist/components/Banner.js.map +1 -0
- package/dist/components/Button.d.ts +44 -0
- package/dist/components/Button.d.ts.map +1 -0
- package/dist/components/Button.js +27 -0
- package/dist/components/Button.js.map +1 -0
- package/dist/components/Calendar.d.ts +18 -0
- package/dist/components/Calendar.d.ts.map +1 -0
- package/dist/components/Calendar.js +124 -0
- package/dist/components/Calendar.js.map +1 -0
- package/dist/components/Chat.d.ts +160 -0
- package/dist/components/Chat.d.ts.map +1 -0
- package/dist/components/Chat.js +343 -0
- package/dist/components/Chat.js.map +1 -0
- package/dist/components/Chip.d.ts +35 -0
- package/dist/components/Chip.d.ts.map +1 -0
- package/dist/components/Chip.js +31 -0
- package/dist/components/Chip.js.map +1 -0
- package/dist/components/Choice.d.ts +72 -0
- package/dist/components/Choice.d.ts.map +1 -0
- package/dist/components/Choice.js +93 -0
- package/dist/components/Choice.js.map +1 -0
- package/dist/components/CodeBlock.d.ts +38 -0
- package/dist/components/CodeBlock.d.ts.map +1 -0
- package/dist/components/CodeBlock.js +177 -0
- package/dist/components/CodeBlock.js.map +1 -0
- package/dist/components/ColorField.d.ts +25 -0
- package/dist/components/ColorField.d.ts.map +1 -0
- package/dist/components/ColorField.js +119 -0
- package/dist/components/ColorField.js.map +1 -0
- package/dist/components/CommandPalette.d.ts +71 -0
- package/dist/components/CommandPalette.d.ts.map +1 -0
- package/dist/components/CommandPalette.js +168 -0
- package/dist/components/CommandPalette.js.map +1 -0
- package/dist/components/CompletenessBadge.d.ts +38 -0
- package/dist/components/CompletenessBadge.d.ts.map +1 -0
- package/dist/components/CompletenessBadge.js +57 -0
- package/dist/components/CompletenessBadge.js.map +1 -0
- package/dist/components/ConnectionStatus.d.ts +16 -0
- package/dist/components/ConnectionStatus.d.ts.map +1 -0
- package/dist/components/ConnectionStatus.js +16 -0
- package/dist/components/ConnectionStatus.js.map +1 -0
- package/dist/components/ContextMenu.d.ts +121 -0
- package/dist/components/ContextMenu.d.ts.map +1 -0
- package/dist/components/ContextMenu.js +319 -0
- package/dist/components/ContextMenu.js.map +1 -0
- package/dist/components/DataTable.d.ts +109 -0
- package/dist/components/DataTable.d.ts.map +1 -0
- package/dist/components/DataTable.js +155 -0
- package/dist/components/DataTable.js.map +1 -0
- package/dist/components/DateField.d.ts +42 -0
- package/dist/components/DateField.d.ts.map +1 -0
- package/dist/components/DateField.js +129 -0
- package/dist/components/DateField.js.map +1 -0
- package/dist/components/Display.d.ts +172 -0
- package/dist/components/Display.d.ts.map +1 -0
- package/dist/components/Display.js +133 -0
- package/dist/components/Display.js.map +1 -0
- package/dist/components/EditablePanel.d.ts +33 -0
- package/dist/components/EditablePanel.d.ts.map +1 -0
- package/dist/components/EditablePanel.js +99 -0
- package/dist/components/EditablePanel.js.map +1 -0
- package/dist/components/ExpandableText.d.ts +20 -0
- package/dist/components/ExpandableText.d.ts.map +1 -0
- package/dist/components/ExpandableText.js +39 -0
- package/dist/components/ExpandableText.js.map +1 -0
- package/dist/components/Field.d.ts +62 -0
- package/dist/components/Field.d.ts.map +1 -0
- package/dist/components/Field.js +61 -0
- package/dist/components/Field.js.map +1 -0
- package/dist/components/Highlight.d.ts +24 -0
- package/dist/components/Highlight.d.ts.map +1 -0
- package/dist/components/Highlight.js +85 -0
- package/dist/components/Highlight.js.map +1 -0
- package/dist/components/InlineEdit.d.ts +32 -0
- package/dist/components/InlineEdit.d.ts.map +1 -0
- package/dist/components/InlineEdit.js +129 -0
- package/dist/components/InlineEdit.js.map +1 -0
- package/dist/components/Input.d.ts +62 -0
- package/dist/components/Input.d.ts.map +1 -0
- package/dist/components/Input.js +143 -0
- package/dist/components/Input.js.map +1 -0
- package/dist/components/KanbanBoard.d.ts +82 -0
- package/dist/components/KanbanBoard.d.ts.map +1 -0
- package/dist/components/KanbanBoard.js +266 -0
- package/dist/components/KanbanBoard.js.map +1 -0
- package/dist/components/Lightbox.d.ts +27 -0
- package/dist/components/Lightbox.d.ts.map +1 -0
- package/dist/components/Lightbox.js +69 -0
- package/dist/components/Lightbox.js.map +1 -0
- package/dist/components/MaskedInput.d.ts +90 -0
- package/dist/components/MaskedInput.d.ts.map +1 -0
- package/dist/components/MaskedInput.js +167 -0
- package/dist/components/MaskedInput.js.map +1 -0
- package/dist/components/Menu.d.ts +20 -0
- package/dist/components/Menu.d.ts.map +1 -0
- package/dist/components/Menu.js +70 -0
- package/dist/components/Menu.js.map +1 -0
- package/dist/components/MenuCore.d.ts +151 -0
- package/dist/components/MenuCore.d.ts.map +1 -0
- package/dist/components/MenuCore.js +228 -0
- package/dist/components/MenuCore.js.map +1 -0
- package/dist/components/Modal.d.ts +115 -0
- package/dist/components/Modal.d.ts.map +1 -0
- package/dist/components/Modal.js +217 -0
- package/dist/components/Modal.js.map +1 -0
- package/dist/components/NotificationCenter.d.ts +65 -0
- package/dist/components/NotificationCenter.d.ts.map +1 -0
- package/dist/components/NotificationCenter.js +108 -0
- package/dist/components/NotificationCenter.js.map +1 -0
- package/dist/components/OtpInput.d.ts +48 -0
- package/dist/components/OtpInput.d.ts.map +1 -0
- package/dist/components/OtpInput.js +140 -0
- package/dist/components/OtpInput.js.map +1 -0
- package/dist/components/Page.d.ts +56 -0
- package/dist/components/Page.d.ts.map +1 -0
- package/dist/components/Page.js +34 -0
- package/dist/components/Page.js.map +1 -0
- package/dist/components/PermissionMatrix.d.ts +52 -0
- package/dist/components/PermissionMatrix.d.ts.map +1 -0
- package/dist/components/PermissionMatrix.js +145 -0
- package/dist/components/PermissionMatrix.js.map +1 -0
- package/dist/components/Popover.d.ts +25 -0
- package/dist/components/Popover.d.ts.map +1 -0
- package/dist/components/Popover.js +62 -0
- package/dist/components/Popover.js.map +1 -0
- package/dist/components/RecordHeader.d.ts +52 -0
- package/dist/components/RecordHeader.d.ts.map +1 -0
- package/dist/components/RecordHeader.js +13 -0
- package/dist/components/RecordHeader.js.map +1 -0
- package/dist/components/RecordLayout.d.ts +16 -0
- package/dist/components/RecordLayout.d.ts.map +1 -0
- package/dist/components/RecordLayout.js +10 -0
- package/dist/components/RecordLayout.js.map +1 -0
- package/dist/components/RelativeTime.d.ts +28 -0
- package/dist/components/RelativeTime.d.ts.map +1 -0
- package/dist/components/RelativeTime.js +51 -0
- package/dist/components/RelativeTime.js.map +1 -0
- package/dist/components/RingProgress.d.ts +54 -0
- package/dist/components/RingProgress.d.ts.map +1 -0
- package/dist/components/RingProgress.js +84 -0
- package/dist/components/RingProgress.js.map +1 -0
- package/dist/components/ScreenOverlay.d.ts +67 -0
- package/dist/components/ScreenOverlay.d.ts.map +1 -0
- package/dist/components/ScreenOverlay.js +75 -0
- package/dist/components/ScreenOverlay.js.map +1 -0
- package/dist/components/Select.d.ts +57 -0
- package/dist/components/Select.d.ts.map +1 -0
- package/dist/components/Select.js +231 -0
- package/dist/components/Select.js.map +1 -0
- package/dist/components/SettingsList.d.ts +83 -0
- package/dist/components/SettingsList.d.ts.map +1 -0
- package/dist/components/SettingsList.js +79 -0
- package/dist/components/SettingsList.js.map +1 -0
- package/dist/components/SlaTimer.d.ts +60 -0
- package/dist/components/SlaTimer.d.ts.map +1 -0
- package/dist/components/SlaTimer.js +122 -0
- package/dist/components/SlaTimer.js.map +1 -0
- package/dist/components/Slider.d.ts +62 -0
- package/dist/components/Slider.d.ts.map +1 -0
- package/dist/components/Slider.js +215 -0
- package/dist/components/Slider.js.map +1 -0
- package/dist/components/Spinner.d.ts +13 -0
- package/dist/components/Spinner.d.ts.map +1 -0
- package/dist/components/Spinner.js +15 -0
- package/dist/components/Spinner.js.map +1 -0
- package/dist/components/StatusBar.d.ts +57 -0
- package/dist/components/StatusBar.d.ts.map +1 -0
- package/dist/components/StatusBar.js +54 -0
- package/dist/components/StatusBar.js.map +1 -0
- package/dist/components/Steps.d.ts +34 -0
- package/dist/components/Steps.d.ts.map +1 -0
- package/dist/components/Steps.js +63 -0
- package/dist/components/Steps.js.map +1 -0
- package/dist/components/Tabs.d.ts +46 -0
- package/dist/components/Tabs.d.ts.map +1 -0
- package/dist/components/Tabs.js +80 -0
- package/dist/components/Tabs.js.map +1 -0
- package/dist/components/TagInput.d.ts +72 -0
- package/dist/components/TagInput.d.ts.map +1 -0
- package/dist/components/TagInput.js +262 -0
- package/dist/components/TagInput.js.map +1 -0
- package/dist/components/Timeline.d.ts +27 -0
- package/dist/components/Timeline.d.ts.map +1 -0
- package/dist/components/Timeline.js +19 -0
- package/dist/components/Timeline.js.map +1 -0
- package/dist/components/Toast.d.ts +60 -0
- package/dist/components/Toast.d.ts.map +1 -0
- package/dist/components/Toast.js +118 -0
- package/dist/components/Toast.js.map +1 -0
- package/dist/components/Tooltip.d.ts +11 -0
- package/dist/components/Tooltip.d.ts.map +1 -0
- package/dist/components/Tooltip.js +140 -0
- package/dist/components/Tooltip.js.map +1 -0
- package/dist/components/TreeView.d.ts +80 -0
- package/dist/components/TreeView.d.ts.map +1 -0
- package/dist/components/TreeView.js +304 -0
- package/dist/components/TreeView.js.map +1 -0
- package/dist/components/UptimeBar.d.ts +32 -0
- package/dist/components/UptimeBar.d.ts.map +1 -0
- package/dist/components/UptimeBar.js +86 -0
- package/dist/components/UptimeBar.js.map +1 -0
- package/dist/components/Utility.d.ts +60 -0
- package/dist/components/Utility.d.ts.map +1 -0
- package/dist/components/Utility.js +127 -0
- package/dist/components/Utility.js.map +1 -0
- package/dist/components/WorkspaceSwitcher.d.ts +43 -0
- package/dist/components/WorkspaceSwitcher.d.ts.map +1 -0
- package/dist/components/WorkspaceSwitcher.js +168 -0
- package/dist/components/WorkspaceSwitcher.js.map +1 -0
- package/dist/components/charts/Charts.d.ts +99 -0
- package/dist/components/charts/Charts.d.ts.map +1 -0
- package/dist/components/charts/Charts.js +346 -0
- package/dist/components/charts/Charts.js.map +1 -0
- package/dist/components/charts/DonutChart.d.ts +70 -0
- package/dist/components/charts/DonutChart.d.ts.map +1 -0
- package/dist/components/charts/DonutChart.js +216 -0
- package/dist/components/charts/DonutChart.js.map +1 -0
- package/dist/components/charts/Gauge.d.ts +50 -0
- package/dist/components/charts/Gauge.d.ts.map +1 -0
- package/dist/components/charts/Gauge.js +72 -0
- package/dist/components/charts/Gauge.js.map +1 -0
- package/dist/components/charts/Heatmap.d.ts +98 -0
- package/dist/components/charts/Heatmap.d.ts.map +1 -0
- package/dist/components/charts/Heatmap.js +287 -0
- package/dist/components/charts/Heatmap.js.map +1 -0
- package/dist/index.d.ts +76 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +90 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/color.d.ts +20 -0
- package/dist/lib/color.d.ts.map +1 -0
- package/dist/lib/color.js +52 -0
- package/dist/lib/color.js.map +1 -0
- package/dist/lib/cx.d.ts +7 -0
- package/dist/lib/cx.d.ts.map +1 -0
- package/dist/lib/cx.js +17 -0
- package/dist/lib/cx.js.map +1 -0
- package/dist/lib/dates.d.ts +69 -0
- package/dist/lib/dates.d.ts.map +1 -0
- package/dist/lib/dates.js +185 -0
- package/dist/lib/dates.js.map +1 -0
- package/dist/lib/files.d.ts +6 -0
- package/dist/lib/files.d.ts.map +1 -0
- package/dist/lib/files.js +32 -0
- package/dist/lib/files.js.map +1 -0
- package/dist/lib/hooks.d.ts +27 -0
- package/dist/lib/hooks.d.ts.map +1 -0
- package/dist/lib/hooks.js +126 -0
- package/dist/lib/hooks.js.map +1 -0
- package/dist/lib/i18n-messages.d.ts +356 -0
- package/dist/lib/i18n-messages.d.ts.map +1 -0
- package/dist/lib/i18n-messages.js +729 -0
- package/dist/lib/i18n-messages.js.map +1 -0
- package/dist/lib/i18n.d.ts +15 -0
- package/dist/lib/i18n.d.ts.map +1 -0
- package/dist/lib/i18n.js +27 -0
- package/dist/lib/i18n.js.map +1 -0
- package/dist/lib/link.d.ts +26 -0
- package/dist/lib/link.d.ts.map +1 -0
- package/dist/lib/link.js +19 -0
- package/dist/lib/link.js.map +1 -0
- package/dist/lib/masks.d.ts +112 -0
- package/dist/lib/masks.d.ts.map +1 -0
- package/dist/lib/masks.js +292 -0
- package/dist/lib/masks.js.map +1 -0
- package/dist/lib/motion-values.d.ts +14 -0
- package/dist/lib/motion-values.d.ts.map +1 -0
- package/dist/lib/motion-values.js +36 -0
- package/dist/lib/motion-values.js.map +1 -0
- package/dist/lib/motion.d.ts +66 -0
- package/dist/lib/motion.d.ts.map +1 -0
- package/dist/lib/motion.js +169 -0
- package/dist/lib/motion.js.map +1 -0
- package/dist/lib/overlay.d.ts +58 -0
- package/dist/lib/overlay.d.ts.map +1 -0
- package/dist/lib/overlay.js +217 -0
- package/dist/lib/overlay.js.map +1 -0
- package/dist/lib/relative-time.d.ts +15 -0
- package/dist/lib/relative-time.d.ts.map +1 -0
- package/dist/lib/relative-time.js +49 -0
- package/dist/lib/relative-time.js.map +1 -0
- package/dist/lib/theme-script.d.ts +30 -0
- package/dist/lib/theme-script.d.ts.map +1 -0
- package/dist/lib/theme-script.js +17 -0
- package/dist/lib/theme-script.js.map +1 -0
- package/dist/lib/theme.d.ts +29 -0
- package/dist/lib/theme.d.ts.map +1 -0
- package/dist/lib/theme.js +92 -0
- package/dist/lib/theme.js.map +1 -0
- package/dist/lib/url-filters.d.ts +58 -0
- package/dist/lib/url-filters.d.ts.map +1 -0
- package/dist/lib/url-filters.js +194 -0
- package/dist/lib/url-filters.js.map +1 -0
- package/dist/styles/accents.css +232 -0
- package/dist/styles/base.css +243 -0
- package/dist/styles/components/button.css +201 -0
- package/dist/styles/components/chart-extras.css +459 -0
- package/dist/styles/components/chart.css +273 -0
- package/dist/styles/components/communication.css +850 -0
- package/dist/styles/components/content.css +311 -0
- package/dist/styles/components/data.css +437 -0
- package/dist/styles/components/display.css +1491 -0
- package/dist/styles/components/form.css +688 -0
- package/dist/styles/components/input-extras.css +563 -0
- package/dist/styles/components/navigation.css +791 -0
- package/dist/styles/components/overlay.css +503 -0
- package/dist/styles/components/records.css +511 -0
- package/dist/styles/components/select.css +567 -0
- package/dist/styles/components/shell-extras.css +374 -0
- package/dist/styles/components/workflow.css +723 -0
- package/dist/styles/index.css +27 -0
- package/dist/styles/shell.css +404 -0
- package/dist/styles/slim.css +93 -0
- package/dist/styles/tokens.css +429 -0
- package/package.json +68 -4
- package/src/components/Accordion.tsx +189 -0
- package/src/components/AnimatedNumber.tsx +74 -0
- package/src/components/AppShell.tsx +193 -0
- package/src/components/AvatarGroup.tsx +88 -0
- package/src/components/BadgeStack.tsx +75 -0
- package/src/components/Banner.tsx +123 -0
- package/src/components/Button.tsx +144 -0
- package/src/components/Calendar.tsx +263 -0
- package/src/components/Chat.tsx +791 -0
- package/src/components/Chip.tsx +127 -0
- package/src/components/Choice.tsx +299 -0
- package/src/components/CodeBlock.tsx +303 -0
- package/src/components/ColorField.tsx +243 -0
- package/src/components/CommandPalette.tsx +337 -0
- package/src/components/CompletenessBadge.tsx +194 -0
- package/src/components/ConnectionStatus.tsx +85 -0
- package/src/components/ContextMenu.tsx +525 -0
- package/src/components/DataTable.tsx +510 -0
- package/src/components/DateField.tsx +349 -0
- package/src/components/Display.tsx +503 -0
- package/src/components/EditablePanel.tsx +222 -0
- package/src/components/ExpandableText.tsx +72 -0
- package/src/components/Field.tsx +168 -0
- package/src/components/Highlight.tsx +116 -0
- package/src/components/InlineEdit.tsx +278 -0
- package/src/components/Input.tsx +379 -0
- package/src/components/KanbanBoard.tsx +473 -0
- package/src/components/Lightbox.tsx +193 -0
- package/src/components/MaskedInput.tsx +393 -0
- package/src/components/Menu.tsx +107 -0
- package/src/components/MenuCore.tsx +372 -0
- package/src/components/Modal.tsx +526 -0
- package/src/components/NotificationCenter.tsx +391 -0
- package/src/components/OtpInput.tsx +240 -0
- package/src/components/Page.tsx +154 -0
- package/src/components/PermissionMatrix.tsx +329 -0
- package/src/components/Popover.tsx +126 -0
- package/src/components/RecordHeader.tsx +140 -0
- package/src/components/RecordLayout.tsx +55 -0
- package/src/components/RelativeTime.tsx +86 -0
- package/src/components/RingProgress.tsx +244 -0
- package/src/components/ScreenOverlay.tsx +308 -0
- package/src/components/Select.tsx +612 -0
- package/src/components/SettingsList.tsx +228 -0
- package/src/components/SlaTimer.tsx +206 -0
- package/src/components/Slider.tsx +377 -0
- package/src/components/Spinner.tsx +35 -0
- package/src/components/StatusBar.tsx +161 -0
- package/src/components/Steps.tsx +164 -0
- package/src/components/Tabs.tsx +163 -0
- package/src/components/TagInput.tsx +446 -0
- package/src/components/Timeline.tsx +90 -0
- package/src/components/Toast.tsx +259 -0
- package/src/components/Tooltip.tsx +202 -0
- package/src/components/TreeView.tsx +477 -0
- package/src/components/UptimeBar.tsx +187 -0
- package/src/components/Utility.tsx +281 -0
- package/src/components/WorkspaceSwitcher.tsx +381 -0
- package/src/components/charts/Charts.tsx +710 -0
- package/src/components/charts/DonutChart.tsx +396 -0
- package/src/components/charts/Gauge.tsx +198 -0
- package/src/components/charts/Heatmap.tsx +574 -0
- package/src/index.ts +385 -0
- package/src/lib/color.ts +59 -0
- package/src/lib/cx.ts +17 -0
- package/src/lib/dates.ts +236 -0
- package/src/lib/files.ts +30 -0
- package/src/lib/hooks.ts +154 -0
- package/src/lib/i18n-messages.ts +1077 -0
- package/src/lib/i18n.tsx +39 -0
- package/src/lib/link.tsx +32 -0
- package/src/lib/masks.ts +345 -0
- package/src/lib/motion-values.tsx +40 -0
- package/src/lib/motion.tsx +230 -0
- package/src/lib/overlay.tsx +251 -0
- package/src/lib/relative-time.ts +53 -0
- package/src/lib/theme-script.tsx +54 -0
- package/src/lib/theme.ts +118 -0
- package/src/lib/url-filters.ts +250 -0
- package/src/styles/accents.css +232 -0
- package/src/styles/base.css +243 -0
- package/src/styles/components/button.css +201 -0
- package/src/styles/components/chart-extras.css +459 -0
- package/src/styles/components/chart.css +273 -0
- package/src/styles/components/communication.css +850 -0
- package/src/styles/components/content.css +311 -0
- package/src/styles/components/data.css +437 -0
- package/src/styles/components/display.css +1491 -0
- package/src/styles/components/form.css +688 -0
- package/src/styles/components/input-extras.css +563 -0
- package/src/styles/components/navigation.css +791 -0
- package/src/styles/components/overlay.css +503 -0
- package/src/styles/components/records.css +511 -0
- package/src/styles/components/select.css +567 -0
- package/src/styles/components/shell-extras.css +374 -0
- package/src/styles/components/workflow.css +723 -0
- package/src/styles/index.css +27 -0
- package/src/styles/shell.css +404 -0
- package/src/styles/slim.css +93 -0
- package/src/styles/tokens.css +429 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 RetentionSoftware
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,206 @@
|
|
|
1
|
-
#
|
|
1
|
+
# endfield-vision
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**English** | [Русский](https://github.com/RetentionSoftware/endfield-vision/blob/main/packages/vision/README.ru.md)
|
|
4
|
+
|
|
5
|
+
A design system for React 19 and Next.js (App Router). Tokens on CSS variables, a dark theme by default plus light and "follow the system", two styles, accent presets, and accessible components with no third-party UI kit underneath (the only dependency is `lucide-react` for icons).
|
|
6
|
+
|
|
7
|
+
The live catalog is the **ENDFIELD Vision** section of the playground in the [repository](https://github.com/RetentionSoftware/endfield-vision) (`npm run dev`, then open `/vision`).
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm i endfield-vision
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
While the package is on its way to npm, install it from the GitHub release (same build, same imports):
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm i https://github.com/RetentionSoftware/endfield-vision/releases/download/v2.1.0/endfield-vision-2.1.0.tgz
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Requires `react` and `react-dom` 19.
|
|
22
|
+
|
|
23
|
+
## Setup (Next.js App Router)
|
|
24
|
+
|
|
25
|
+
```tsx
|
|
26
|
+
// app/layout.tsx
|
|
27
|
+
import 'endfield-vision/styles.css'
|
|
28
|
+
import { ThemeScript } from 'endfield-vision'
|
|
29
|
+
import { Inter, JetBrains_Mono } from 'next/font/google'
|
|
30
|
+
|
|
31
|
+
const inter = Inter({ subsets: ['latin', 'cyrillic'], variable: '--font-inter' })
|
|
32
|
+
const mono = JetBrains_Mono({ subsets: ['latin', 'cyrillic'], variable: '--font-jetbrains-mono' })
|
|
33
|
+
|
|
34
|
+
export default function RootLayout({ children }) {
|
|
35
|
+
return (
|
|
36
|
+
<html lang="en" data-theme="dark" className={`${inter.variable} ${mono.variable}`} suppressHydrationWarning>
|
|
37
|
+
<head>
|
|
38
|
+
<ThemeScript /> {/* theme and accent before the first paint, no flash */}
|
|
39
|
+
</head>
|
|
40
|
+
<body>
|
|
41
|
+
<Providers>{children}</Providers>
|
|
42
|
+
</body>
|
|
43
|
+
</html>
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
```tsx
|
|
49
|
+
// app/providers.tsx
|
|
50
|
+
'use client'
|
|
51
|
+
import { LinkProvider, ModalsProvider, Toaster, type LinkComponent } from 'endfield-vision'
|
|
52
|
+
import NextLink from 'next/link'
|
|
53
|
+
|
|
54
|
+
const AppLink: LinkComponent = ({ href, ...rest }) => <NextLink href={href} {...rest} />
|
|
55
|
+
|
|
56
|
+
export function Providers({ children }) {
|
|
57
|
+
return (
|
|
58
|
+
<LinkProvider component={AppLink}>
|
|
59
|
+
<ModalsProvider>
|
|
60
|
+
{children}
|
|
61
|
+
<Toaster />
|
|
62
|
+
</ModalsProvider>
|
|
63
|
+
</LinkProvider>
|
|
64
|
+
)
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
The library does not depend on Next.js: without `LinkProvider` links are plain `<a>` elements, and everything else works in any React app (Vite and others). Components are marked `'use client'` file by file, so you can render them from Server Components, and utilities (`cx`, `formatIsoDate`, masks, `themeBootstrap`) can be imported on the server too.
|
|
69
|
+
|
|
70
|
+
## Language
|
|
71
|
+
|
|
72
|
+
Built-in texts (button labels, aria-labels, empty states, pagination, the calendar) ship in English and Russian. Without a provider the library speaks English.
|
|
73
|
+
|
|
74
|
+
```tsx
|
|
75
|
+
import { LocaleProvider } from 'endfield-vision'
|
|
76
|
+
|
|
77
|
+
<LocaleProvider locale="ru">{children}</LocaleProvider>
|
|
78
|
+
|
|
79
|
+
// Your own wording on top of the dictionary - any branch, any string:
|
|
80
|
+
<LocaleProvider locale="en" messages={{ table: { empty: 'Nothing here yet' }, common: { retry: 'Reload' } }}>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
- `useMessages()` returns the current dictionary (for your own components in the same style), `useLocale()` returns `'ru' | 'en'`, `useNumberFormat()` formats numbers by the language rules.
|
|
84
|
+
- Providers can be nested: part of a page can use another language.
|
|
85
|
+
- The dictionaries are exported (`ru`, `en`): use one as the base for a third language, and the `Messages` type will list every key.
|
|
86
|
+
- Date fields use `dd.mm.yyyy` in both languages; weeks start on Monday.
|
|
87
|
+
|
|
88
|
+
Fonts come from the app (`--font-inter`, `--font-jetbrains-mono`); without them the system fonts are used.
|
|
89
|
+
|
|
90
|
+
## Theme, style and accent
|
|
91
|
+
|
|
92
|
+
Three independent settings on `<html>`:
|
|
93
|
+
|
|
94
|
+
- **Theme** - `data-theme="dark|light"`.
|
|
95
|
+
- **Style** - `data-style="slim"` (no attribute means `default`). A style changes how elements look, not their size: control heights, spacing and type scale stay the same, so switching never breaks a layout.
|
|
96
|
+
- `default` - contrasting, accent-colored selection, viewfinder corners, uppercase section labels.
|
|
97
|
+
- `slim` - flat and calm: warm neutrals, nothing glows, selection is a neutral tone, outlined secondary and danger buttons, sentence-case labels, a crisp focus line instead of a soft halo.
|
|
98
|
+
- **Accent** - `data-accent="amber|emerald|cyan|rose|violet|ink"` (no attribute means indigo). `ink` is a neutral accent: the primary button is ink-colored and color stays in statuses only. Each preset has its own values for each style and theme; contrast is checked by tests.
|
|
99
|
+
|
|
100
|
+
`ThemeScript` sets all three before rendering. Options: `defaultTheme` (`'dark' | 'light' | 'system'`), `defaultStyle`, `defaultAccent`, `themeKey`, `styleKey`, `accentKey`, `nonce` (for CSP).
|
|
101
|
+
|
|
102
|
+
```tsx
|
|
103
|
+
<ThemeScript defaultTheme="system" defaultStyle="slim" defaultAccent="ink" />
|
|
104
|
+
|
|
105
|
+
// client code
|
|
106
|
+
const { theme, preference, style, accent, setTheme, setStyle, setAccent } = useTheme()
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
`STYLES` and `ACCENTS` list the available values; `setTheme`, `setStyle` and `setAccent` also work outside React.
|
|
110
|
+
|
|
111
|
+
Your own accent: override the tokens in your app styles (unlayered styles always win):
|
|
112
|
+
|
|
113
|
+
```css
|
|
114
|
+
:root {
|
|
115
|
+
--ev-accent-rgb: 255, 122, 69;
|
|
116
|
+
--ev-accent-text: #ff9a70;
|
|
117
|
+
--ev-accent-strong: #d9480f; /* primary button fill */
|
|
118
|
+
--ev-accent-strong-hover: #e8590c;
|
|
119
|
+
--ev-text-on-accent: #ffffff;
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Entrance motion
|
|
124
|
+
|
|
125
|
+
Numbers count up and charts draw themselves the first time an element scrolls into view. Off by default.
|
|
126
|
+
|
|
127
|
+
```tsx
|
|
128
|
+
import { MotionProvider, StatTile, BarChart } from 'endfield-vision'
|
|
129
|
+
|
|
130
|
+
<MotionProvider>{children}</MotionProvider> // for the whole app (duration in ms)
|
|
131
|
+
<StatTile label="Stock" value="$12,845,000" animate /> // or for a single component
|
|
132
|
+
<BarChart animate={false} ... /> // the prop wins over the provider
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
- Supported by `StatTile` (the number is found inside the value string and its format is kept), `AnimatedNumber`, `Progress`, `BarChart`, `LineChart`, `AreaChart`, `Sparkline`, `DonutChart`, `Heatmap`, `HeatmapMatrix`, `RingProgress`, `Gauge`, `UptimeBar`. Use `animationDuration` for a custom duration.
|
|
136
|
+
- The animation plays once; when data updates, numbers glide to the new value and charts are not redrawn from scratch.
|
|
137
|
+
- `prefers-reduced-motion` turns it off. Server markup is the final state, and screen readers always get the final values.
|
|
138
|
+
- For your own components: `useEntranceMotion(ref, animate)` (phases `static` / `idle` / `run`, plus a `data-ev-motion` attribute for CSS), `useMotionProgress`, `useCountUp`.
|
|
139
|
+
|
|
140
|
+
## Layers and prefixes
|
|
141
|
+
|
|
142
|
+
- All library styles live in cascade layers `@layer ev.reset, ev.tokens, ev.base, ev.components, ev.shell, ev.styles, ev.utilities`. `ev.styles` holds the component rules of styles such as `slim`. Your unlayered styles always win, no specificity battles needed.
|
|
143
|
+
- Classes use `ev-*` and variables use `--ev-*`, so they never collide with Tailwind or your app styles. With Tailwind v4, set the order with one line before the imports: `@layer theme, base, ev, components, utilities;`.
|
|
144
|
+
- Tokens only: `endfield-vision/tokens.css` (+ `accents.css`) brings the variables without components or the reset.
|
|
145
|
+
|
|
146
|
+
## Rules
|
|
147
|
+
|
|
148
|
+
- For dropdowns use `Select` / `MultiSelect`, not `<select>`; for hints use `Tooltip` (built into `IconButton` through `label`), not the `title=` attribute.
|
|
149
|
+
- Colors, spacing, radii, shadows and layers come only from `var(--ev-...)`.
|
|
150
|
+
- An empty value in tables and cards is `EMPTY_VALUE` (a hyphen); `DataTable` and `KeyValueList` insert it themselves.
|
|
151
|
+
- Cards, panels, tiles and tables have no border: the surface separates them, plus `--ev-shadow-card` in the light theme. A block inside a card, dialog or drawer sits on `--ev-surface-nested`. Borders belong to inputs and controls.
|
|
152
|
+
- To mark a panel's tone, use **viewfinder corners** instead of a colored edge stripe: `<div className="ev-corners" data-corners="diagonal" data-tone="warning">`. `data-corners` variants: no value (top-left corner), `diagonal`, `frame` (all four corners), `off`. Size, width and inset are the `--ev-corner-size`, `--ev-corner-width` and `--ev-corner-inset` tokens; the color is the element tone or `--ev-corner-color`. The `slim` style hides the corners, so also give the element a toned or selected background.
|
|
153
|
+
- Selected or current items (a menu item, tab, page, row, option) use the `--ev-selected-*` tokens, not the accent directly: in `default` they are accent-colored, in `slim` they are neutral.
|
|
154
|
+
- `Card flush` renders a table edge to edge; other direct children of the body (filters, notices, pagination) get the card padding on their own.
|
|
155
|
+
|
|
156
|
+
## Tokens
|
|
157
|
+
|
|
158
|
+
| Group | Tokens |
|
|
159
|
+
|---|---|
|
|
160
|
+
| Surfaces | `--ev-bg`, `--ev-surface-1` (cards), `--ev-surface-2` (popovers, table header), `--ev-surface-3` (buttons), `--ev-surface-nested`, `--ev-surface-input`, `--ev-hover`, `--ev-active`, `--ev-tint-1..4` |
|
|
161
|
+
| Shadows | `--ev-shadow-card`, `--ev-shadow-sm`, `--ev-shadow`, `--ev-shadow-pop`, `--ev-shadow-modal`, `--ev-shadow-primary` |
|
|
162
|
+
| Borders | `--ev-border-soft`, `--ev-border`, `--ev-border-strong`, `--ev-border-control` (inputs, 3:1), `--ev-border-hover` |
|
|
163
|
+
| Text | `--ev-text`, `--ev-text-secondary`, `--ev-text-muted` (>= 4.5:1), `--ev-text-disabled`, `--ev-text-on-accent` |
|
|
164
|
+
| Accent | `--ev-accent`, `--ev-accent-text`, `--ev-accent-strong`, `--ev-accent-soft`, `--ev-accent-edge`, `--ev-accent-rgb`, `--ev-accent-swatch-<preset>` |
|
|
165
|
+
| Selection | `--ev-selected-bg`, `--ev-selected-bg-subtle`, `--ev-selected-edge`, `--ev-selected-text`, `--ev-selected-indicator` |
|
|
166
|
+
| Focus | `--ev-focus-ring` (buttons and other controls), `--ev-focus-ring-inset` (borderless items: menu rows, tabs), `--ev-focus-field` and `--ev-focus-field-invalid` (bordered fields; in `slim` the border only changes color) |
|
|
167
|
+
| Semantic | `--ev-success`, `--ev-warning`, `--ev-danger`, `--ev-info`, `--ev-violet` (+ `-soft`, `-edge`, `-strong`), independent of the accent |
|
|
168
|
+
| Charts | `--ev-chart-1..8`, `--ev-chart-grid`, `--ev-chart-axis` |
|
|
169
|
+
| Geometry | `--ev-radius-xs..xl`, `--ev-space-0..11` (2..56px), `--ev-control-h-sm/-h/-h-lg` (28/34/40) |
|
|
170
|
+
| Typography | `--ev-fs-2xs..3xl` (11..30px, 14px base), `--ev-fw-*`, `--ev-fw-title`, `--ev-lh`; section labels: `--ev-caps-transform`, `--ev-caps-size`, `--ev-caps-weight`, `--ev-tracking-caps` |
|
|
171
|
+
| Layers | `--ev-z-sticky` < `--ev-z-topbar` < `--ev-z-drawer` < `--ev-z-modal` < `--ev-z-dropdown` < `--ev-z-toast` < `--ev-z-tooltip` |
|
|
172
|
+
| Motion | `--ev-dur-fast/-dur/-dur-slow`, `--ev-ease`, `--ev-ease-out`; `prefers-reduced-motion` is handled globally |
|
|
173
|
+
|
|
174
|
+
Component tone (`Badge`, `StatusPill`, `Callout`, `StatTile`, `Avatar`, `Progress`) is the `tone` prop: `neutral | accent | success | warning | danger | info | violet`.
|
|
175
|
+
|
|
176
|
+
## Components
|
|
177
|
+
|
|
178
|
+
- **Actions:** `Button` (`primary | secondary | ghost | danger | danger-ghost | link`, `sm | md | lg`, `loading`, `icon`, `iconRight`, `block`), `LinkButton`, `IconButton` (required `label` = aria-label + tooltip), `Menu`, `Popover`.
|
|
179
|
+
- **Forms:** `Field` (label, hint, error; wires up `id`, `aria-invalid` and `aria-describedby` itself), `FormSection`, `Input`, `SearchInput`, `PasswordInput`, `Textarea` (`autoResize`), `NumberInput` (`min/max/step`, `decimals`, `unit`, `stepper`), `MoneyInput` (value in minor units), `PhoneInput` (22 countries with a picker, country code detection on paste, E.164), `SnilsInput`, `PlateInput`, `DigitsInput`, `MaskedDigitsInput`, `TimeInput` (`HH:MM`, `min/max`), `ColorField`.
|
|
180
|
+
- **Choice:** `Select` (search with more than 7 options, groups, `clearable`, server search via `onSearch`), `MultiSelect`, `DateField` (`YYYY-MM-DD`), `DateRangePicker`, `Calendar`, `Checkbox` (`indeterminate`), `Switch`, `RadioGroup` (`variant="card"`), `SegmentedControl`, `Tabs` (buttons or `href` links), `TabPanel`.
|
|
181
|
+
- **Data:** `DataTable` (column config, sorting, row selection, `loading`, `fetching`, `error` + `onRetry`, `empty`, `maxHeight`, cards on narrow screens), `Pagination`, `FilterBar`, `KeyValueList`, `StatTile`, `Badge`, `StatusPill`, `Avatar` (initials or photo), `Progress` (including overrun), `Timeline` (event feed, upcoming steps, "show more"), `UptimeBar` (daily availability with tooltips), `CopyButton`, `CopyValue`.
|
|
182
|
+
- **Charts:** `BarChart` (grouped or `stacked`), `LineChart`, `AreaChart`, `Sparkline`, `DonutChart` (shares, "Other", legend), `Heatmap` (activity calendar) and `HeatmapMatrix` ("row x column" matrix), `RingProgress` (ring, segments, overrun), `Gauge` (half-circle scale with zones). Tooltips on hover and arrow keys, a legend for 2+ series, a hidden table for screen readers.
|
|
183
|
+
- **Feedback and overlays:** `Callout`, `EmptyState`, `ErrorState`, `Skeleton`, `SkeletonText`, `Spinner`, `LoadingBlock`, `Modal`, `useModals()` (`open`, `confirm`, `alert`), `Drawer`, `toast.*` / `useToast()` (callable outside React too), `FileDrop`.
|
|
184
|
+
- **Navigation and structure:** `CommandPalette` (Ctrl+K, groups, word search), `Steps` (wizard steps, horizontal and vertical), `Accordion` and `Disclosure`, `TreeView` (single or multiple selection with a partial state, WAI-ARIA keyboard).
|
|
185
|
+
- **More inputs:** `Slider` (value and range, marks), `TagInput` (tags, suggestions, limit, validation), `Chip` and `ChipGroup` (filters and tags), `OtpInput` (verification code, paste as a whole), `InlineEdit` (edit in place with async save).
|
|
186
|
+
- **Content:** `Banner` (full-width announcement, dismissal is remembered), `CodeBlock` and `InlineCode` (line numbers, line and syntax highlighting with no dependencies, collapsing), `Highlight` (search matches), `RelativeTime` ("5 minutes ago" in both languages), `ExpandableText` ("Show more").
|
|
187
|
+
- **App shell:** `AppShell` (`statusBar` slot), `Topbar`, `Sidebar`, `SidebarSection`, `SidebarItem`, `SidebarCollapseButton`, `useAppShell()`, `PageHeader`, `Breadcrumbs`, `SectionTitle`, `Card`, `Panel`, `Divider`, `Kbd`, `StatusBar` (`StatusBarItem`, `StatusBarClock`), `WorkspaceSwitcher`, `ScreenOverlay` (maintenance, new version), `ContextMenu` and `ContextMenuProvider` (right click, registry by `data-ctx-kind`).
|
|
188
|
+
- **CRM, record card:** `RecordHeader` (header with avatar, copyable identifiers, metrics, actions), `RecordLayout` (main and side columns), `EditablePanel` (section with an edit mode and async save), `CompletenessBadge` (what is missing and what expires), `BadgeStack` and `AvatarGroup` (+N), presence on `Avatar` (`status`, `lastSeen`), `missing` on `KeyValueList` rows.
|
|
189
|
+
- **CRM, workflows:** `KanbanBoard` and `KanbanCard` (columns with counters and "show more", drag and drop plus keyboard moves), `SlaTimer` (elapsed / remaining, tones by threshold, `formatDuration`), `PermissionMatrix` (sections x roles, modes, changes against the saved state), `SettingsList`, `SettingRow`, `SaveBar`, `useDirtyState`.
|
|
190
|
+
- **CRM, communication:** `NotificationCenter` and `NotificationList` (history, read state, actions), `toast` with several actions, `ChatThread`, `ChatMessage`, `Composer` (attachments, pasted screenshots, drag and drop), `Lightbox`, `ConnectionStatus`.
|
|
191
|
+
- **Filters in the URL:** `useUrlFilters` syncs filters with the address and remembers them per scope.
|
|
192
|
+
- **Language:** `LocaleProvider`, `useMessages`, `useLocale`, `useNumberFormat`, dictionaries `ru`, `en`.
|
|
193
|
+
- **Theme:** `ThemeScript` (`nonce` for CSP), `themeBootstrap`, `useTheme`, `setTheme`, `setAccent`, `ACCENTS`.
|
|
194
|
+
- **Utilities:** `cx`, `normalizeSearch`, `formatPhone`, `isCompletePhone`, `normalizePlate`, `normalizeHexColor`, `useMediaQuery`, `useDebouncedValue`, `useControllable`, `LinkProvider`. Layout classes: `ev-stack`, `ev-row`, `ev-grid` (`--ev-gap`, `--ev-grid-min`), `ev-mono`, `ev-num`, `ev-muted`, `ev-truncate`, `ev-link`, `ev-visually-hidden`.
|
|
195
|
+
|
|
196
|
+
## Making it yours
|
|
197
|
+
|
|
198
|
+
The package publishes both the build (`dist/`) and the source (`src/`). Three levels of customization:
|
|
199
|
+
|
|
200
|
+
1. **Tokens.** Override `--ev-*` in your styles: colors, radii, density (`--ev-control-h`), fonts.
|
|
201
|
+
2. **Component styles.** The `ev-*` classes and data attributes (`data-variant`, `data-size`, `data-tone`) are stable; your unlayered rules override the library.
|
|
202
|
+
3. **Code.** Copy a component from `node_modules/endfield-vision/src/components` into your project and edit it as your own.
|
|
203
|
+
|
|
204
|
+
## License
|
|
205
|
+
|
|
206
|
+
[MIT](LICENSE)
|
package/README.ru.md
ADDED
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
# endfield-vision
|
|
2
|
+
|
|
3
|
+
[English](https://github.com/RetentionSoftware/endfield-vision/blob/main/packages/vision/README.md) | **Русский**
|
|
4
|
+
|
|
5
|
+
Дизайн-система для React 19 и Next.js (App Router). Токены на CSS-переменных, тёмная тема по умолчанию, светлая и «как в системе», два стиля оформления, пресеты акцента, доступные компоненты без сторонних UI-библиотек (зависимость одна - `lucide-react` для иконок).
|
|
6
|
+
|
|
7
|
+
Живой каталог - раздел **ENDFIELD Vision** в плейграунде [репозитория](https://github.com/RetentionSoftware/endfield-vision) (`npm run dev`, затем `/vision`).
|
|
8
|
+
|
|
9
|
+
## Установка
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm i endfield-vision
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Пока пакет готовится к публикации в npm, ставьте его из релиза на GitHub (та же сборка, те же импорты):
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm i https://github.com/RetentionSoftware/endfield-vision/releases/download/v2.1.0/endfield-vision-2.1.0.tgz
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Нужны `react` и `react-dom` 19.
|
|
22
|
+
|
|
23
|
+
## Подключение (Next.js App Router)
|
|
24
|
+
|
|
25
|
+
```tsx
|
|
26
|
+
// app/layout.tsx
|
|
27
|
+
import 'endfield-vision/styles.css'
|
|
28
|
+
import { ThemeScript } from 'endfield-vision'
|
|
29
|
+
import { Inter, JetBrains_Mono } from 'next/font/google'
|
|
30
|
+
|
|
31
|
+
const inter = Inter({ subsets: ['latin', 'cyrillic'], variable: '--font-inter' })
|
|
32
|
+
const mono = JetBrains_Mono({ subsets: ['latin', 'cyrillic'], variable: '--font-jetbrains-mono' })
|
|
33
|
+
|
|
34
|
+
export default function RootLayout({ children }) {
|
|
35
|
+
return (
|
|
36
|
+
<html lang="ru" data-theme="dark" className={`${inter.variable} ${mono.variable}`} suppressHydrationWarning>
|
|
37
|
+
<head>
|
|
38
|
+
<ThemeScript /> {/* тема и акцент до первой отрисовки, без вспышки */}
|
|
39
|
+
</head>
|
|
40
|
+
<body>
|
|
41
|
+
<Providers>{children}</Providers>
|
|
42
|
+
</body>
|
|
43
|
+
</html>
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
```tsx
|
|
49
|
+
// app/providers.tsx
|
|
50
|
+
'use client'
|
|
51
|
+
import { LinkProvider, ModalsProvider, Toaster, type LinkComponent } from 'endfield-vision'
|
|
52
|
+
import NextLink from 'next/link'
|
|
53
|
+
|
|
54
|
+
const AppLink: LinkComponent = ({ href, ...rest }) => <NextLink href={href} {...rest} />
|
|
55
|
+
|
|
56
|
+
export function Providers({ children }) {
|
|
57
|
+
return (
|
|
58
|
+
<LinkProvider component={AppLink}>
|
|
59
|
+
<ModalsProvider>
|
|
60
|
+
{children}
|
|
61
|
+
<Toaster />
|
|
62
|
+
</ModalsProvider>
|
|
63
|
+
</LinkProvider>
|
|
64
|
+
)
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Библиотека не зависит от Next.js: без `LinkProvider` ссылки - обычные `<a>`, остальное работает в любом React-приложении (Vite и т. п.). Компоненты помечены `'use client'` пофайлово: их можно рендерить из серверных компонентов, а утилиты (`cx`, `formatIsoDate`, маски, `themeBootstrap`) импортируются и на сервере.
|
|
69
|
+
|
|
70
|
+
## Язык
|
|
71
|
+
|
|
72
|
+
Встроенные тексты (подписи кнопок, aria-label, пустые состояния, пагинация, календарь) есть на английском и русском. Без провайдера - английский.
|
|
73
|
+
|
|
74
|
+
```tsx
|
|
75
|
+
import { LocaleProvider } from 'endfield-vision'
|
|
76
|
+
|
|
77
|
+
<LocaleProvider locale="ru">{children}</LocaleProvider>
|
|
78
|
+
|
|
79
|
+
// Свои формулировки поверх словаря - любые ветки и строки:
|
|
80
|
+
<LocaleProvider locale="en" messages={{ table: { empty: 'Nothing here yet' }, common: { retry: 'Reload' } }}>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
- `useMessages()` - словарь текущего языка (для своих компонентов в том же стиле), `useLocale()` - `'ru' | 'en'`, `useNumberFormat()` - числа по правилам языка.
|
|
84
|
+
- Провайдеры можно вкладывать: часть страницы на другом языке.
|
|
85
|
+
- Словари экспортируются (`ru`, `en`): их можно взять за основу третьего языка - тип `Messages` подскажет все ключи.
|
|
86
|
+
- Формат дат в полях - `дд.мм.гггг` на обоих языках, неделя начинается с понедельника.
|
|
87
|
+
|
|
88
|
+
Шрифты задаёт приложение (`--font-inter`, `--font-jetbrains-mono`); без них - системные.
|
|
89
|
+
|
|
90
|
+
## Тема, стиль и акцент
|
|
91
|
+
|
|
92
|
+
Три независимые настройки на `<html>`:
|
|
93
|
+
|
|
94
|
+
- **Тема** - `data-theme="dark|light"`.
|
|
95
|
+
- **Стиль** - `data-style="slim"` (без атрибута - `default`). Стиль меняет подачу элементов, а не размеры: высоты контролов, отступы и кегль те же, поэтому переключение не ломает раскладку.
|
|
96
|
+
- `default` («Стандартный») - контрастный, выделение акцентом, уголки видоискателя, подписи разделов капсом.
|
|
97
|
+
- `slim` («Утончённый») - плоский и спокойный: тёплые нейтрали, ничего не светится, выбранное - нейтральным тоном, вторичная и опасная кнопки контуром, подписи без капса, фокус - чёткая линия вместо мягкого ореола.
|
|
98
|
+
- **Акцент** - `data-accent="amber|emerald|cyan|rose|violet|ink"` (без атрибута - indigo). `ink` («Чернила») - нейтральный акцент: основная кнопка чернильная, цвет остаётся только в статусах. У каждого пресета свои значения для каждого стиля и темы; контраст проверяют тесты.
|
|
99
|
+
|
|
100
|
+
`ThemeScript` ставит все три до отрисовки. Опции: `defaultTheme` (`'dark' | 'light' | 'system'`), `defaultStyle`, `defaultAccent`, `themeKey`, `styleKey`, `accentKey`, `nonce` (для CSP).
|
|
101
|
+
|
|
102
|
+
```tsx
|
|
103
|
+
<ThemeScript defaultTheme="system" defaultStyle="slim" defaultAccent="ink" />
|
|
104
|
+
|
|
105
|
+
// в клиентском коде
|
|
106
|
+
const { theme, preference, style, accent, setTheme, setStyle, setAccent } = useTheme()
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
`STYLES` и `ACCENTS` - списки доступных значений; `setTheme`, `setStyle` и `setAccent` работают и вне React.
|
|
110
|
+
|
|
111
|
+
Свой акцент - переопределите токены в стилях приложения (вне слоёв они сильнее):
|
|
112
|
+
|
|
113
|
+
```css
|
|
114
|
+
:root {
|
|
115
|
+
--ev-accent-rgb: 255, 122, 69;
|
|
116
|
+
--ev-accent-text: #ff9a70;
|
|
117
|
+
--ev-accent-strong: #d9480f; /* заливка primary-кнопки */
|
|
118
|
+
--ev-accent-strong-hover: #e8590c;
|
|
119
|
+
--ev-text-on-accent: #ffffff;
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Анимация появления
|
|
124
|
+
|
|
125
|
+
Числа набираются, графики строятся, когда элемент впервые попадает в видимую область. По умолчанию выключено.
|
|
126
|
+
|
|
127
|
+
```tsx
|
|
128
|
+
import { MotionProvider, StatTile, BarChart } from 'endfield-vision'
|
|
129
|
+
|
|
130
|
+
<MotionProvider>{children}</MotionProvider> // для всего приложения (duration - длительность, мс)
|
|
131
|
+
<StatTile label="Запасы" value="12 845 000 ₽" animate /> // или на отдельном компоненте
|
|
132
|
+
<BarChart animate={false} ... /> // проп сильнее провайдера
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
- Поддерживают: `StatTile` (число ищется в строке значения, формат сохраняется), `AnimatedNumber`, `Progress`, `BarChart`, `LineChart`, `AreaChart`, `Sparkline`, `DonutChart`, `Heatmap`, `HeatmapMatrix`, `RingProgress`, `Gauge`, `UptimeBar`. Проп `animationDuration` - своя длительность.
|
|
136
|
+
- Анимация проигрывается один раз; при обновлении данных числа плавно переходят к новому значению, графики не перерисовываются заново.
|
|
137
|
+
- `prefers-reduced-motion` выключает анимацию. Серверная разметка - итоговое состояние; скринридер всегда получает итоговые значения.
|
|
138
|
+
- Для своих компонентов: `useEntranceMotion(ref, animate)` (фазы `static` / `idle` / `run`, атрибут `data-ev-motion` для CSS), `useMotionProgress`, `useCountUp`.
|
|
139
|
+
|
|
140
|
+
## Слои и префиксы
|
|
141
|
+
|
|
142
|
+
- Все стили библиотеки - в каскадных слоях `@layer ev.reset, ev.tokens, ev.base, ev.components, ev.shell, ev.styles, ev.utilities`. В `ev.styles` - правила компонентов для стилей вроде `slim`. Стили приложения вне слоёв всегда сильнее, специфичность бороться не нужно.
|
|
143
|
+
- Классы - `ev-*`, переменные - `--ev-*`: не пересекаются с Tailwind и стилями приложения. С Tailwind v4 порядок задаётся одной строкой до импортов: `@layer theme, base, ev, components, utilities;`.
|
|
144
|
+
- Только токены: `endfield-vision/tokens.css` (+ `accents.css`) подключает переменные без компонентов и сброса.
|
|
145
|
+
|
|
146
|
+
## Правила
|
|
147
|
+
|
|
148
|
+
- Выпадающий список - `Select`/`MultiSelect`, не `<select>`; подсказка - `Tooltip` (у `IconButton` встроена через `label`), не атрибут `title=`.
|
|
149
|
+
- Цвета, отступы, радиусы, тени, слои - только `var(--ev-...)`.
|
|
150
|
+
- Пустое значение в таблицах и карточках - `EMPTY_VALUE` (дефис), `DataTable` и `KeyValueList` подставляют его сами.
|
|
151
|
+
- Карточки, панели, плитки, таблицы - без рамки: их отделяет поверхность, в светлой теме ещё `--ev-shadow-card`. Блок внутри карточки, окна или шторки - на `--ev-surface-nested`. Рамка - у полей ввода и контролов.
|
|
152
|
+
- Акцент тона на панели - **уголки видоискателя**, а не цветная полоса по краю: `<div className="ev-corners" data-corners="diagonal" data-tone="warning">`. Варианты `data-corners`: без значения (уголок сверху слева), `diagonal`, `frame` (четыре уголка), `off`. Размер, толщина и отступ - токены `--ev-corner-size`, `--ev-corner-width`, `--ev-corner-inset`, цвет - тон элемента или `--ev-corner-color`. Стиль `slim` уголки скрывает, поэтому выделяйте элемент ещё и тоном фона.
|
|
153
|
+
- Выбранное и текущее (пункт меню, вкладка, страница, строка, опция) - через токены `--ev-selected-*`, а не напрямую акцентом: в `default` они акцентные, в `slim` - нейтральные.
|
|
154
|
+
- `Card flush` - таблица от края до края; остальные прямые дети тела (фильтры, плашки, пагинация) получают отступ карточки сами.
|
|
155
|
+
|
|
156
|
+
## Токены (главное)
|
|
157
|
+
|
|
158
|
+
| Группа | Токены |
|
|
159
|
+
|---|---|
|
|
160
|
+
| Поверхности | `--ev-bg`, `--ev-surface-1` (карточки), `--ev-surface-2` (поповеры, шапка таблицы), `--ev-surface-3` (кнопки), `--ev-surface-nested`, `--ev-surface-input`, `--ev-hover`, `--ev-active`, `--ev-tint-1..4` |
|
|
161
|
+
| Тени | `--ev-shadow-card`, `--ev-shadow-sm`, `--ev-shadow`, `--ev-shadow-pop`, `--ev-shadow-modal`, `--ev-shadow-primary` |
|
|
162
|
+
| Рамки | `--ev-border-soft`, `--ev-border`, `--ev-border-strong`, `--ev-border-control` (поля, 3:1), `--ev-border-hover` |
|
|
163
|
+
| Текст | `--ev-text`, `--ev-text-secondary`, `--ev-text-muted` (>= 4.5:1), `--ev-text-disabled`, `--ev-text-on-accent` |
|
|
164
|
+
| Акцент | `--ev-accent`, `--ev-accent-text`, `--ev-accent-strong`, `--ev-accent-soft`, `--ev-accent-edge`, `--ev-accent-rgb`, `--ev-accent-swatch-<пресет>` |
|
|
165
|
+
| Выделение | `--ev-selected-bg`, `--ev-selected-bg-subtle`, `--ev-selected-edge`, `--ev-selected-text`, `--ev-selected-indicator` |
|
|
166
|
+
| Фокус | `--ev-focus-ring` (кнопки и другие контролы), `--ev-focus-ring-inset` (элементы без рамки: пункты меню, вкладки), `--ev-focus-field` и `--ev-focus-field-invalid` (поля с рамкой; в `slim` рамка только меняет цвет) |
|
|
167
|
+
| Семантика | `--ev-success`, `--ev-warning`, `--ev-danger`, `--ev-info`, `--ev-violet` (+ `-soft`, `-edge`, `-strong`) - не зависят от акцента |
|
|
168
|
+
| Графики | `--ev-chart-1..8`, `--ev-chart-grid`, `--ev-chart-axis` |
|
|
169
|
+
| Геометрия | `--ev-radius-xs..xl`, `--ev-space-0..11` (2..56px), `--ev-control-h-sm/-h/-h-lg` (28/34/40) |
|
|
170
|
+
| Типографика | `--ev-fs-2xs..3xl` (11..30px, база 14px), `--ev-fw-*`, `--ev-fw-title`, `--ev-lh`; подписи разделов: `--ev-caps-transform`, `--ev-caps-size`, `--ev-caps-weight`, `--ev-tracking-caps` |
|
|
171
|
+
| Слои | `--ev-z-sticky` < `--ev-z-topbar` < `--ev-z-drawer` < `--ev-z-modal` < `--ev-z-dropdown` < `--ev-z-toast` < `--ev-z-tooltip` |
|
|
172
|
+
| Движение | `--ev-dur-fast/-dur/-dur-slow`, `--ev-ease`, `--ev-ease-out`; `prefers-reduced-motion` учтён глобально |
|
|
173
|
+
|
|
174
|
+
Тон компонента (`Badge`, `StatusPill`, `Callout`, `StatTile`, `Avatar`, `Progress`) - проп `tone`: `neutral | accent | success | warning | danger | info | violet`.
|
|
175
|
+
|
|
176
|
+
## Компоненты
|
|
177
|
+
|
|
178
|
+
- **Действия:** `Button` (`primary | secondary | ghost | danger | danger-ghost | link`, `sm | md | lg`, `loading`, `icon`, `iconRight`, `block`), `LinkButton`, `IconButton` (обязательный `label` = aria-label + подсказка), `Menu`, `Popover`.
|
|
179
|
+
- **Формы:** `Field` (подпись, подсказка, ошибка; сам связывает `id`, `aria-invalid`, `aria-describedby`), `FormSection`, `Input`, `SearchInput`, `PasswordInput`, `Textarea` (`autoResize`), `NumberInput` (`min/max/step`, `decimals`, `unit`, `stepper`), `MoneyInput` (значение в копейках), `PhoneInput` (22 страны с выбором из списка, распознавание кода при вставке, E.164), `SnilsInput`, `PlateInput`, `DigitsInput`, `MaskedDigitsInput`, `TimeInput` (`ЧЧ:ММ`, `min/max`), `ColorField`.
|
|
180
|
+
- **Выбор:** `Select` (поиск при > 7 опций, группы, `clearable`, серверный поиск `onSearch`), `MultiSelect`, `DateField` (`YYYY-MM-DD`), `DateRangePicker`, `Calendar`, `Checkbox` (`indeterminate`), `Switch`, `RadioGroup` (`variant="card"`), `SegmentedControl`, `Tabs` (кнопки или ссылки `href`), `TabPanel`.
|
|
181
|
+
- **Данные:** `DataTable` (колонки конфигом, сортировка, выбор строк, `loading`, `fetching`, `error` + `onRetry`, `empty`, `maxHeight`, на узком экране - карточки), `Pagination`, `FilterBar`, `KeyValueList`, `StatTile`, `Badge`, `StatusPill`, `Avatar` (инициалы или фото), `Progress` (в том числе перерасход), `Timeline` (лента событий, будущие шаги, «показать ещё»), `UptimeBar` (доступность по дням с подсказками), `CopyButton`, `CopyValue`.
|
|
182
|
+
- **Графики:** `BarChart` (рядом или `stacked`), `LineChart`, `AreaChart`, `Sparkline`, `DonutChart` (доли, «Прочее», легенда), `Heatmap` (календарь активности) и `HeatmapMatrix` (матрица «строка x столбец»), `RingProgress` (кольцо, секции, перерасход), `Gauge` (шкала-полукруг с зонами). Подсказка по наведению и стрелками, легенда при 2+ сериях, скрытая таблица для скринридера.
|
|
183
|
+
- **Состояния и окна:** `Callout`, `EmptyState`, `ErrorState`, `Skeleton`, `SkeletonText`, `Spinner`, `LoadingBlock`, `Modal`, `useModals()` (`open`, `confirm`, `alert`), `Drawer`, `toast.*` / `useToast()` (вызов и вне React), `FileDrop`.
|
|
184
|
+
- **Навигация и структура:** `CommandPalette` (Ctrl+K, группы, поиск по словам), `Steps` (шаги мастера, горизонтально и вертикально), `Accordion` и `Disclosure`, `TreeView` (выбор одного или нескольких с частичным состоянием, клавиатура WAI-ARIA).
|
|
185
|
+
- **Ввод (дополнительно):** `Slider` (значение и диапазон, метки), `TagInput` (метки, подсказки, лимит, проверка), `Chip` и `ChipGroup` (фильтры и метки), `OtpInput` (код подтверждения, вставка целиком), `InlineEdit` (правка на месте с асинхронным сохранением).
|
|
186
|
+
- **Контент:** `Banner` (объявление на всю ширину, скрытие запоминается), `CodeBlock` и `InlineCode` (номера строк, подсветка строк и синтаксиса без зависимостей, сворачивание), `Highlight` (совпадения поиска, ё = е), `RelativeTime` («5 минут назад» на обоих языках), `ExpandableText` («Показать полностью»).
|
|
187
|
+
- **Каркас:** `AppShell` (слот `statusBar`), `Topbar`, `Sidebar`, `SidebarSection`, `SidebarItem`, `SidebarCollapseButton`, `useAppShell()`, `PageHeader`, `Breadcrumbs`, `SectionTitle`, `Card`, `Panel`, `Divider`, `Kbd`, `StatusBar` (`StatusBarItem`, `StatusBarClock`), `WorkspaceSwitcher`, `ScreenOverlay` (техработы, новая версия), `ContextMenu` и `ContextMenuProvider` (правый клик, реестр по `data-ctx-kind`).
|
|
188
|
+
- **CRM - карточка записи:** `RecordHeader` (шапка: аватар, идентификаторы с копированием, показатели, действия), `RecordLayout` (основная и боковая колонки), `EditablePanel` (секция с режимом правки и асинхронным сохранением), `CompletenessBadge` (что не заполнено и что истекает), `BadgeStack` и `AvatarGroup` (+N), присутствие у `Avatar` (`status`, `lastSeen`), `missing` у строк `KeyValueList`.
|
|
189
|
+
- **CRM - процессы:** `KanbanBoard` и `KanbanCard` (колонки со счётчиками и «показать ещё», перетаскивание и перенос с клавиатуры), `SlaTimer` (прошло / осталось, тоны по порогам, `formatDuration`), `PermissionMatrix` (разделы × роли, режимы, изменения против сохранённого), `SettingsList`, `SettingRow`, `SaveBar`, `useDirtyState`.
|
|
190
|
+
- **CRM - коммуникации:** `NotificationCenter` и `NotificationList` (история, прочитано, действия), `toast` с несколькими действиями, `ChatThread`, `ChatMessage`, `Composer` (вложения, вставка скриншотов, перетаскивание), `Lightbox`, `ConnectionStatus`.
|
|
191
|
+
- **Фильтры в адресе:** `useUrlFilters` - синхронизация с URL и память по области.
|
|
192
|
+
- **Язык:** `LocaleProvider`, `useMessages`, `useLocale`, `useNumberFormat`, словари `ru`, `en`.
|
|
193
|
+
- **Тема:** `ThemeScript` (`nonce` для CSP), `themeBootstrap`, `useTheme`, `setTheme`, `setAccent`, `ACCENTS`.
|
|
194
|
+
- **Утилиты:** `cx`, `normalizeSearch`, `formatPhone`, `isCompletePhone`, `normalizePlate`, `normalizeHexColor`, `useMediaQuery`, `useDebouncedValue`, `useControllable`, `LinkProvider`. Классы раскладки: `ev-stack`, `ev-row`, `ev-grid` (`--ev-gap`, `--ev-grid-min`), `ev-mono`, `ev-num`, `ev-muted`, `ev-truncate`, `ev-link`, `ev-visually-hidden`.
|
|
195
|
+
|
|
196
|
+
## Доработка под себя
|
|
197
|
+
|
|
198
|
+
Пакет публикует и сборку (`dist/`), и исходники (`src/`). Три уровня настройки:
|
|
199
|
+
|
|
200
|
+
1. **Токены** - переопределите `--ev-*` в своих стилях: цвета, радиусы, плотность (`--ev-control-h`), шрифты.
|
|
201
|
+
2. **Стили компонентов** - классы `ev-*` и data-атрибуты (`data-variant`, `data-size`, `data-tone`) стабильны; ваши правила вне слоёв перекрывают библиотеку.
|
|
202
|
+
3. **Код** - скопируйте нужный компонент из `node_modules/endfield-vision/src/components` в проект и правьте как свой.
|
|
203
|
+
|
|
204
|
+
## Лицензия
|
|
205
|
+
|
|
206
|
+
[MIT](LICENSE)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export interface AccordionItem {
|
|
3
|
+
id: string;
|
|
4
|
+
title: ReactNode;
|
|
5
|
+
content: ReactNode;
|
|
6
|
+
icon?: ReactNode;
|
|
7
|
+
/** Справа в заголовке: счётчик, статус, дата. */
|
|
8
|
+
meta?: ReactNode;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
}
|
|
11
|
+
type HeadingLevel = 2 | 3 | 4 | 5 | 6;
|
|
12
|
+
export interface AccordionProps {
|
|
13
|
+
items: AccordionItem[];
|
|
14
|
+
/** Несколько открытых секций одновременно. По умолчанию открыта не больше одной. */
|
|
15
|
+
multiple?: boolean;
|
|
16
|
+
/** Открытые секции (id), контролируемый режим. */
|
|
17
|
+
value?: string[];
|
|
18
|
+
/** Открытые секции при первом рендере. */
|
|
19
|
+
defaultValue?: string[];
|
|
20
|
+
onValueChange?: (value: string[]) => void;
|
|
21
|
+
/** separated - отдельные карточки на поверхности, flush - список с разделителями. */
|
|
22
|
+
variant?: 'separated' | 'flush';
|
|
23
|
+
/** Кнопка «Развернуть все / Свернуть все» над списком (только при multiple). */
|
|
24
|
+
showExpandAll?: boolean;
|
|
25
|
+
/** Уровень заголовков секций в структуре страницы. По умолчанию - 3. */
|
|
26
|
+
headingLevel?: HeadingLevel;
|
|
27
|
+
className?: string;
|
|
28
|
+
}
|
|
29
|
+
/** Новое множество открытых секций после щелчка по секции id. */
|
|
30
|
+
export declare function toggleAccordionValue(value: string[], id: string, multiple: boolean): string[];
|
|
31
|
+
/** id секций, которые можно открыть (без отключённых). */
|
|
32
|
+
export declare function expandableIds(items: Pick<AccordionItem, 'id' | 'disabled'>[]): string[];
|
|
33
|
+
export declare function Accordion({ items, multiple, value, defaultValue, onValueChange, variant, showExpandAll, headingLevel, className, }: AccordionProps): import("react").JSX.Element;
|
|
34
|
+
export interface DisclosureProps {
|
|
35
|
+
/** Подпись кнопки-переключателя. */
|
|
36
|
+
title: ReactNode;
|
|
37
|
+
children: ReactNode;
|
|
38
|
+
/** Открыт (контролируемый режим). */
|
|
39
|
+
open?: boolean;
|
|
40
|
+
/** Открыт при первом рендере. */
|
|
41
|
+
defaultOpen?: boolean;
|
|
42
|
+
onOpenChange?: (open: boolean) => void;
|
|
43
|
+
disabled?: boolean;
|
|
44
|
+
className?: string;
|
|
45
|
+
}
|
|
46
|
+
/** Одиночный раскрывающийся блок: подробности, дополнительные параметры формы. */
|
|
47
|
+
export declare function Disclosure({ title, children, open, defaultOpen, onOpenChange, disabled, className }: DisclosureProps): import("react").JSX.Element;
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=Accordion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Accordion.d.ts","sourceRoot":"","sources":["../../src/components/Accordion.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAqC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAazE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,SAAS,CAAA;IAChB,OAAO,EAAE,SAAS,CAAA;IAClB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,iDAAiD;IACjD,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,KAAK,YAAY,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AAErC,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,aAAa,EAAE,CAAA;IACtB,oFAAoF;IACpF,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IACzC,qFAAqF;IACrF,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAA;IAC/B,gFAAgF;IAChF,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,wEAAwE;IACxE,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,iEAAiE;AACjE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,EAAE,CAI7F;AAED,0DAA0D;AAC1D,wBAAgB,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,UAAU,CAAC,EAAE,GAAG,MAAM,EAAE,CAEvF;AA4BD,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,QAAgB,EAChB,KAAK,EACL,YAAY,EACZ,aAAa,EACb,OAAqB,EACrB,aAAqB,EACrB,YAAgB,EAChB,SAAS,GACV,EAAE,cAAc,+BAwDhB;AAED,MAAM,WAAW,eAAe;IAC9B,oCAAoC;IACpC,KAAK,EAAE,SAAS,CAAA;IAChB,QAAQ,EAAE,SAAS,CAAA;IACnB,qCAAqC;IACrC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,iCAAiC;IACjC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,kFAAkF;AAClF,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAmB,EAAE,YAAY,EAAE,QAAgB,EAAE,SAAS,EAAE,EAAE,eAAe,+BAsBpI"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { ChevronDown } from 'lucide-react';
|
|
4
|
+
import { useId, useRef } from 'react';
|
|
5
|
+
import { cx } from '../lib/cx.js';
|
|
6
|
+
import { useControllable } from '../lib/hooks.js';
|
|
7
|
+
import { useMessages } from '../lib/i18n.js';
|
|
8
|
+
import { Button } from './Button.js';
|
|
9
|
+
/** Новое множество открытых секций после щелчка по секции id. */
|
|
10
|
+
export function toggleAccordionValue(value, id, multiple) {
|
|
11
|
+
const open = value.includes(id);
|
|
12
|
+
if (multiple)
|
|
13
|
+
return open ? value.filter((v) => v !== id) : [...value, id];
|
|
14
|
+
return open ? [] : [id];
|
|
15
|
+
}
|
|
16
|
+
/** id секций, которые можно открыть (без отключённых). */
|
|
17
|
+
export function expandableIds(items) {
|
|
18
|
+
return items.filter((it) => !it.disabled).map((it) => it.id);
|
|
19
|
+
}
|
|
20
|
+
/** Перевод фокуса между заголовками стрелками, Home и End. */
|
|
21
|
+
function onHeadersKey(e, root) {
|
|
22
|
+
if (!root || !['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(e.key))
|
|
23
|
+
return;
|
|
24
|
+
const target = e.target;
|
|
25
|
+
if (!target.hasAttribute('data-ev-accordion-trigger'))
|
|
26
|
+
return;
|
|
27
|
+
const triggers = Array.from(root.querySelectorAll('[data-ev-accordion-trigger]')).filter((b) => !b.disabled && b.closest('.ev-accordion') === root);
|
|
28
|
+
const i = triggers.indexOf(target);
|
|
29
|
+
if (i < 0)
|
|
30
|
+
return;
|
|
31
|
+
const n = triggers.length;
|
|
32
|
+
const next = e.key === 'Home' ? 0 : e.key === 'End' ? n - 1 : e.key === 'ArrowDown' ? (i + 1) % n : (i - 1 + n) % n;
|
|
33
|
+
e.preventDefault();
|
|
34
|
+
triggers[next]?.focus();
|
|
35
|
+
}
|
|
36
|
+
/** Панель с анимацией высоты. */
|
|
37
|
+
function Collapse({ open, id, children, ...rest }) {
|
|
38
|
+
return (_jsx("div", { ...rest, id: id, className: cx('ev-collapse', rest.className), "data-open": open || undefined, children: _jsx("div", { className: "ev-collapse-inner", children: children }) }));
|
|
39
|
+
}
|
|
40
|
+
export function Accordion({ items, multiple = false, value, defaultValue, onValueChange, variant = 'separated', showExpandAll = false, headingLevel = 3, className, }) {
|
|
41
|
+
const t = useMessages();
|
|
42
|
+
const base = useId();
|
|
43
|
+
const rootRef = useRef(null);
|
|
44
|
+
const [openIds, setOpenIds] = useControllable(value, defaultValue ?? [], onValueChange);
|
|
45
|
+
const Heading = `h${headingLevel}`;
|
|
46
|
+
const enabled = expandableIds(items);
|
|
47
|
+
const allOpen = enabled.length > 0 && enabled.every((id) => openIds.includes(id));
|
|
48
|
+
return (_jsxs("div", { className: cx('ev-accordion-wrap', className), children: [multiple && showExpandAll && enabled.length > 0 ? (_jsx("div", { className: "ev-accordion-toolbar", children: _jsx(Button, { variant: "ghost", size: "sm", onClick: () => setOpenIds(allOpen ? [] : enabled), children: allOpen ? t.accordion.collapseAll : t.accordion.expandAll }) })) : null, _jsx("div", { ref: rootRef, className: "ev-accordion", "data-variant": variant, onKeyDown: (e) => onHeadersKey(e, rootRef.current), children: items.map((it, i) => {
|
|
49
|
+
const open = openIds.includes(it.id) && !it.disabled;
|
|
50
|
+
// id в DOM - по индексу: id секции может содержать пробелы, а aria-controls - список через пробел.
|
|
51
|
+
const triggerId = `${base}-t${i}`;
|
|
52
|
+
const panelId = `${base}-p${i}`;
|
|
53
|
+
return (_jsxs("div", { className: "ev-accordion-item", "data-open": open || undefined, "data-disabled": it.disabled || undefined, children: [_jsx(Heading, { className: "ev-accordion-heading", children: _jsxs("button", { type: "button", id: triggerId, className: "ev-accordion-trigger", "aria-expanded": open, "aria-controls": panelId, disabled: it.disabled, "data-ev-accordion-trigger": "", onClick: () => setOpenIds(toggleAccordionValue(openIds, it.id, multiple)), children: [it.icon ? (_jsx("span", { className: "ev-accordion-icon", "aria-hidden": "true", children: it.icon })) : null, _jsx("span", { className: "ev-accordion-title", children: it.title }), it.meta ? _jsx("span", { className: "ev-accordion-meta", children: it.meta }) : null, _jsx(ChevronDown, { size: 16, className: "ev-accordion-chevron", "aria-hidden": "true" })] }) }), _jsx(Collapse, { open: open, id: panelId, role: "region", "aria-labelledby": triggerId, children: _jsx("div", { className: "ev-accordion-content", children: it.content }) })] }, it.id));
|
|
54
|
+
}) })] }));
|
|
55
|
+
}
|
|
56
|
+
/** Одиночный раскрывающийся блок: подробности, дополнительные параметры формы. */
|
|
57
|
+
export function Disclosure({ title, children, open, defaultOpen = false, onOpenChange, disabled = false, className }) {
|
|
58
|
+
const panelId = useId();
|
|
59
|
+
const [isOpen, setOpen] = useControllable(open, defaultOpen, onOpenChange);
|
|
60
|
+
const shown = isOpen && !disabled;
|
|
61
|
+
return (_jsxs("div", { className: cx('ev-disclosure', className), "data-open": shown || undefined, children: [_jsxs("button", { type: "button", className: "ev-disclosure-trigger", "aria-expanded": shown, "aria-controls": panelId, disabled: disabled, onClick: () => setOpen(!isOpen), children: [_jsx(ChevronDown, { size: 16, className: "ev-disclosure-chevron", "aria-hidden": "true" }), _jsx("span", { children: title })] }), _jsx(Collapse, { open: shown, id: panelId, children: _jsx("div", { className: "ev-disclosure-content", children: children }) })] }));
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=Accordion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Accordion.js","sourceRoot":"","sources":["../../src/components/Accordion.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAsC,MAAM,OAAO,CAAA;AACzE,OAAO,EAAE,EAAE,EAAE,MAAM,WAAW,CAAA;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAuCjC,iEAAiE;AACjE,MAAM,UAAU,oBAAoB,CAAC,KAAe,EAAE,EAAU,EAAE,QAAiB;IACjF,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC/B,IAAI,QAAQ;QAAE,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC,CAAA;IAC1E,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;AACzB,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,aAAa,CAAC,KAA+C;IAC3E,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;AAC9D,CAAC;AAED,8DAA8D;AAC9D,SAAS,YAAY,CAAC,CAA6B,EAAE,IAAwB;IAC3E,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;QAAE,OAAM;IAC7E,MAAM,MAAM,GAAG,CAAC,CAAC,MAAqB,CAAA;IACtC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,2BAA2B,CAAC;QAAE,OAAM;IAC7D,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAoB,6BAA6B,CAAC,CAAC,CAAC,MAAM,CACzG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,IAAI,CAC1D,CAAA;IACD,MAAM,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,MAA2B,CAAC,CAAA;IACvD,IAAI,CAAC,GAAG,CAAC;QAAE,OAAM;IACjB,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAA;IACzB,MAAM,IAAI,GACR,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;IACxG,CAAC,CAAC,cAAc,EAAE,CAAA;IAClB,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAA;AACzB,CAAC;AAED,iCAAiC;AACjC,SAAS,QAAQ,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAqH;IAClK,OAAO,CACL,iBAAS,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,eAAa,IAAI,IAAI,SAAS,YAC/F,cAAK,SAAS,EAAC,mBAAmB,YAAE,QAAQ,GAAO,GAC/C,CACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EACxB,KAAK,EACL,QAAQ,GAAG,KAAK,EAChB,KAAK,EACL,YAAY,EACZ,aAAa,EACb,OAAO,GAAG,WAAW,EACrB,aAAa,GAAG,KAAK,EACrB,YAAY,GAAG,CAAC,EAChB,SAAS,GACM;IACf,MAAM,CAAC,GAAG,WAAW,EAAE,CAAA;IACvB,MAAM,IAAI,GAAG,KAAK,EAAE,CAAA;IACpB,MAAM,OAAO,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAA;IACnD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,eAAe,CAAC,KAAK,EAAE,YAAY,IAAI,EAAE,EAAE,aAAa,CAAC,CAAA;IACvF,MAAM,OAAO,GAAG,IAAI,YAAY,EAAW,CAAA;IAC3C,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;IACpC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;IAEjF,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,mBAAmB,EAAE,SAAS,CAAC,aAC/C,QAAQ,IAAI,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACjD,cAAK,SAAS,EAAC,sBAAsB,YACnC,KAAC,MAAM,IAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,YAChF,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,GACnD,GACL,CACP,CAAC,CAAC,CAAC,IAAI,EACR,cAAK,GAAG,EAAE,OAAO,EAAE,SAAS,EAAC,cAAc,kBAAe,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,YAClH,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;oBACnB,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAA;oBACpD,mGAAmG;oBACnG,MAAM,SAAS,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,CAAA;oBACjC,MAAM,OAAO,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,CAAA;oBAC/B,OAAO,CACL,eAAiB,SAAS,EAAC,mBAAmB,eAAY,IAAI,IAAI,SAAS,mBAAiB,EAAE,CAAC,QAAQ,IAAI,SAAS,aAClH,KAAC,OAAO,IAAC,SAAS,EAAC,sBAAsB,YACvC,kBACE,IAAI,EAAC,QAAQ,EACb,EAAE,EAAE,SAAS,EACb,SAAS,EAAC,sBAAsB,mBACjB,IAAI,mBACJ,OAAO,EACtB,QAAQ,EAAE,EAAE,CAAC,QAAQ,+BACK,EAAE,EAC5B,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,oBAAoB,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,aAExE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CACT,eAAM,SAAS,EAAC,mBAAmB,iBAAa,MAAM,YACnD,EAAE,CAAC,IAAI,GACH,CACR,CAAC,CAAC,CAAC,IAAI,EACR,eAAM,SAAS,EAAC,oBAAoB,YAAE,EAAE,CAAC,KAAK,GAAQ,EACrD,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,mBAAmB,YAAE,EAAE,CAAC,IAAI,GAAQ,CAAC,CAAC,CAAC,IAAI,EACtE,KAAC,WAAW,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,sBAAsB,iBAAa,MAAM,GAAG,IACtE,GACD,EACV,KAAC,QAAQ,IAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAC,QAAQ,qBAAkB,SAAS,YACzE,cAAK,SAAS,EAAC,sBAAsB,YAAE,EAAE,CAAC,OAAO,GAAO,GAC/C,KAxBH,EAAE,CAAC,EAAE,CAyBT,CACP,CAAA;gBACH,CAAC,CAAC,GACE,IACF,CACP,CAAA;AACH,CAAC;AAeD,kFAAkF;AAClF,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,GAAG,KAAK,EAAE,YAAY,EAAE,QAAQ,GAAG,KAAK,EAAE,SAAS,EAAmB;IACnI,MAAM,OAAO,GAAG,KAAK,EAAE,CAAA;IACvB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,YAAY,CAAC,CAAA;IAC1E,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAA;IACjC,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,eAAe,EAAE,SAAS,CAAC,eAAa,KAAK,IAAI,SAAS,aAC3E,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,uBAAuB,mBAClB,KAAK,mBACL,OAAO,EACtB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,aAE/B,KAAC,WAAW,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,uBAAuB,iBAAa,MAAM,GAAG,EAC9E,yBAAO,KAAK,GAAQ,IACb,EACT,KAAC,QAAQ,IAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,YAChC,cAAK,SAAS,EAAC,uBAAuB,YAAE,QAAQ,GAAO,GAC9C,IACP,CACP,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export interface AnimatedNumberProps {
|
|
3
|
+
value: number;
|
|
4
|
+
/** Формат вывода; по умолчанию - число по правилам языка с decimals знаками. */
|
|
5
|
+
format?: (value: number) => string;
|
|
6
|
+
/** Знаков после запятой при формате по умолчанию. */
|
|
7
|
+
decimals?: number;
|
|
8
|
+
/** Анимировать (по умолчанию - из MotionProvider). */
|
|
9
|
+
animate?: boolean;
|
|
10
|
+
/** Длительность, мс (по умолчанию - из MotionProvider). */
|
|
11
|
+
duration?: number;
|
|
12
|
+
className?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function AnimatedNumber({ value, format, decimals, animate, duration, className }: AnimatedNumberProps): import("react").JSX.Element;
|
|
15
|
+
/**
|
|
16
|
+
* Число внутри готовой строки («12 845 000 ₽», «96,4%»): набирается с
|
|
17
|
+
* сохранением формата, префикса и суффикса. Строка без числа или узел -
|
|
18
|
+
* выводится как есть.
|
|
19
|
+
*/
|
|
20
|
+
export declare function AnimatedText({ children, animate, duration }: {
|
|
21
|
+
children: ReactNode;
|
|
22
|
+
animate?: boolean;
|
|
23
|
+
duration?: number;
|
|
24
|
+
}): import("react").JSX.Element;
|
|
25
|
+
//# sourceMappingURL=AnimatedNumber.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnimatedNumber.d.ts","sourceRoot":"","sources":["../../src/components/AnimatedNumber.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAU,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAW9C,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,gFAAgF;IAChF,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IAClC,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,sDAAsD;IACtD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,mBAAmB,+BAoBhH;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,+BAoB1H"}
|