@vadimcomanescu/nadicode-design-system 2.0.6 → 2.0.8
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/.agents/skills/seed/SKILL.md +17 -8
- package/.agents/skills/seed/contract.md +5 -4
- package/.agents/skills/seed/intent-map.md +3 -3
- package/.agents/skills/seed/recipes/agents-chat.md +44 -20
- package/.agents/skills/seed/recipes/marketing-shell.md +10 -19
- package/.agents/skills/seed/recipes/navigation-shell.md +5 -5
- package/.agents/skills/seed/recipes/service-detail.md +1 -1
- package/.agents/skills/seed/references/blocks.md +30 -26
- package/.agents/skills/seed/references/brand-override.md +3 -1
- package/.agents/skills/seed/references/components.md +22 -2
- package/.agents/skills/seed/references/dashboard-patterns.md +12 -12
- package/.agents/skills/seed/references/nextjs.md +20 -80
- package/.agents/skills/seed/references/tokens.md +57 -248
- package/README.md +43 -215
- package/contracts/block-props-schemas.json +2186 -0
- package/contracts/component-props-schemas.json +8322 -0
- package/contracts/consumer-contract.json +178 -0
- package/contracts/consumer-intent-map.json +707 -0
- package/contracts/message-catalog-contract.json +820 -0
- package/contracts/page-kit-props-schemas.json +1894 -0
- package/contracts/public-surface-registry.json +6162 -0
- package/contracts/public-surface-registry.schema.json +227 -0
- package/contracts/release-governance-baseline.json +850 -0
- package/contracts/spec-manifest.json +46 -0
- package/css/tokens.css +300 -122
- package/dist/catalog.json +2166 -162
- package/dist/chunk-2BADJLMV.js +117 -0
- package/dist/chunk-35EX5FP5.js +106 -0
- package/dist/chunk-4IGBBIYW.js +47 -0
- package/dist/chunk-4WPZ6T7V.js +186 -0
- package/dist/chunk-5PZ4VR2D.js +142 -0
- package/dist/chunk-5UESKK6S.js +76 -0
- package/dist/chunk-7A2RXKGH.js +205 -0
- package/dist/{chunk-DF47R6LN.js → chunk-AWIG4QN6.js} +9 -9
- package/dist/chunk-AYWL4IYM.js +67 -0
- package/dist/chunk-C7WHMSF3.js +114 -0
- package/dist/{chunk-SV3KZ6CB.js → chunk-DSMGCFMJ.js} +7 -2
- package/dist/{chunk-4K3PATUT.js → chunk-EEL4RAPC.js} +13 -1
- package/dist/{chunk-ILIHQ2KZ.js → chunk-EK43W2Y6.js} +16 -10
- package/dist/chunk-FV2G6SAF.js +134 -0
- package/dist/chunk-FX23F33E.js +57 -0
- package/dist/chunk-GJPTPLCQ.js +52 -0
- package/dist/chunk-HJ3A2YNO.js +163 -0
- package/dist/chunk-HJZRSPWB.js +38 -0
- package/dist/chunk-HWHJ6IRQ.js +78 -0
- package/dist/chunk-HZERHGBT.js +77 -0
- package/dist/{chunk-AUSYEAIJ.js → chunk-I66XWYSS.js} +32 -8
- package/dist/chunk-IXQGKJU4.js +183 -0
- package/dist/chunk-JDJY4ABS.js +60 -0
- package/dist/chunk-K7NQ6ZAW.js +84 -0
- package/dist/chunk-KWILREVQ.js +147 -0
- package/dist/chunk-LCKLZ4XK.js +60 -0
- package/dist/{chunk-WI37ZYIF.js → chunk-M4XKO45H.js} +13 -1
- package/dist/chunk-NEHCPO53.js +44 -0
- package/dist/chunk-OJ7OO3QB.js +269 -0
- package/dist/{chunk-ZHTQF2KI.js → chunk-OSNTB6RY.js} +29 -22
- package/dist/{chunk-GMMPLZLC.js → chunk-PDSQC6VE.js} +1 -1
- package/dist/chunk-QIHA7S3A.js +36 -0
- package/dist/chunk-QQOWC53X.js +98 -0
- package/dist/chunk-RKQPU75I.js +126 -0
- package/dist/chunk-U4GYSYGN.js +120 -0
- package/dist/chunk-UGV45DH3.js +18 -0
- package/dist/chunk-VBZQ4DBE.js +52 -0
- package/dist/{chunk-LQLFA2EL.js → chunk-VDONTZZX.js} +2 -2
- package/dist/chunk-VEO56RH4.js +105 -0
- package/dist/chunk-VJ5VD4UT.js +91 -0
- package/dist/{chunk-RWNJ54CI.js → chunk-VN475YZS.js} +1 -1
- package/dist/chunk-VNNAL4A6.js +110 -0
- package/dist/chunk-VZCB4APK.js +94 -0
- package/dist/chunk-W7FXDRQJ.js +94 -0
- package/dist/{chunk-5I3FWRC5.js → chunk-WOYBVPXK.js} +10 -10
- package/dist/chunk-WST5NLLC.js +73 -0
- package/dist/chunk-X6VXWEDO.js +125 -0
- package/dist/chunk-XTASI4IY.js +60 -0
- package/dist/chunk-Z233ZQZE.js +33 -0
- package/dist/chunk-ZKLB5N3Q.js +110 -0
- package/dist/chunk-ZM2NODUK.js +39 -0
- package/dist/components/blocks/AccountLockedBlock.js +7 -57
- package/dist/components/blocks/ActivityFeedBlock.js +6 -39
- package/dist/components/blocks/AgentConversationBlock.d.ts +6 -1
- package/dist/components/blocks/AgentConversationBlock.js +45 -71
- package/dist/components/blocks/AgentRunOverviewBlock.js +1 -1
- package/dist/components/blocks/AgentWorkbenchBlock.d.ts +5 -1
- package/dist/components/blocks/AgentWorkbenchBlock.js +47 -46
- package/dist/components/blocks/AudioVisualizerBlock.d.ts +1 -1
- package/dist/components/blocks/AudioVisualizerBlock.js +2 -2
- package/dist/components/blocks/AuthLayout.js +2 -2
- package/dist/components/blocks/AuthSuccessBlock.js +5 -60
- package/dist/components/blocks/BannerBlock.js +38 -38
- package/dist/components/blocks/BarChartBlock.d.ts +1 -1
- package/dist/components/blocks/BarChartBlock.js +2 -2
- package/dist/components/blocks/CallToActionBlock.d.ts +1 -1
- package/dist/components/blocks/CallToActionBlock.js +7 -53
- package/dist/components/blocks/ChangelogBlock.js +45 -142
- package/dist/components/blocks/ChartBlock.js +38 -38
- package/dist/components/blocks/ChartCollectionBlock.js +3 -3
- package/dist/components/blocks/ChatLayout.d.ts +4 -1
- package/dist/components/blocks/ChatLayout.js +39 -39
- package/dist/components/blocks/CodeBlock.js +7 -60
- package/dist/components/blocks/ComparisonBlock.js +9 -94
- package/dist/components/blocks/ContactBlock.js +11 -120
- package/dist/components/blocks/CreateBlock.js +39 -39
- package/dist/components/blocks/DataGridBlock.js +40 -40
- package/dist/components/blocks/DirectoryBlock.js +43 -43
- package/dist/components/blocks/FAQBlock.js +44 -82
- package/dist/components/blocks/FeatureBlock.d.ts +10 -14
- package/dist/components/blocks/FeatureBlock.js +54 -196
- package/dist/components/blocks/FeatureGridBlock.d.ts +1 -1
- package/dist/components/blocks/FeatureGridBlock.js +2 -2
- package/dist/components/blocks/FooterBlock.d.ts +2 -2
- package/dist/components/blocks/FooterBlock.js +11 -67
- package/dist/components/blocks/GalleryBlock.js +38 -38
- package/dist/components/blocks/HeaderBlock.d.ts +2 -2
- package/dist/components/blocks/HeaderBlock.js +39 -39
- package/dist/components/blocks/HeatmapChartBlock.d.ts +1 -1
- package/dist/components/blocks/HeatmapChartBlock.js +1 -1
- package/dist/components/blocks/HeroBlock.d.ts +6 -3
- package/dist/components/blocks/HeroBlock.js +53 -236
- package/dist/components/blocks/HeroSectionBlock.d.ts +1 -1
- package/dist/components/blocks/HeroSectionBlock.js +59 -63
- package/dist/components/blocks/IntegrationsBlock.d.ts +1 -1
- package/dist/components/blocks/IntegrationsBlock.js +42 -42
- package/dist/components/blocks/InteractiveAreaChartBlock.d.ts +1 -1
- package/dist/components/blocks/InteractiveAreaChartBlock.js +40 -40
- package/dist/components/blocks/KanbanDemoBlock.js +3 -3
- package/dist/components/blocks/LoginBlock.js +2 -2
- package/dist/components/blocks/LogoCloud.js +2 -13
- package/dist/components/blocks/NavUser.js +42 -42
- package/dist/components/blocks/NewsletterBlock.js +11 -84
- package/dist/components/blocks/NotFoundBlock.js +41 -41
- package/dist/components/blocks/OnboardingBlock.js +38 -38
- package/dist/components/blocks/PasswordRecoveryBlock.js +14 -142
- package/dist/components/blocks/PricingBlock.d.ts +1 -1
- package/dist/components/blocks/PricingBlock.js +13 -112
- package/dist/components/blocks/ProcessFlowBlock.js +10 -77
- package/dist/components/blocks/ResetPasswordBlock.js +11 -125
- package/dist/components/blocks/SettingsLayout.js +42 -42
- package/dist/components/blocks/SignUpBlock.d.ts +1 -1
- package/dist/components/blocks/SignUpBlock.js +3 -3
- package/dist/components/blocks/SocialProofBlock.d.ts +7 -11
- package/dist/components/blocks/SocialProofBlock.js +10 -108
- package/dist/components/blocks/StatsBlock.d.ts +1 -1
- package/dist/components/blocks/StatsBlock.js +40 -40
- package/dist/components/blocks/StatsMarketingBlock.d.ts +1 -1
- package/dist/components/blocks/StatsMarketingBlock.js +7 -38
- package/dist/components/blocks/TeamBlock.d.ts +1 -1
- package/dist/components/blocks/TeamBlock.js +4 -52
- package/dist/components/blocks/TestimonialsBlock.d.ts +1 -1
- package/dist/components/blocks/TestimonialsBlock.js +5 -133
- package/dist/components/blocks/TwoFactorChallengeBlock.js +46 -131
- package/dist/components/blocks/TwoFactorSetupBlock.js +53 -220
- package/dist/components/blocks/UsageDonutBlock.d.ts +1 -1
- package/dist/components/blocks/UsageDonutBlock.js +2 -2
- package/dist/components/blocks/VoiceAgentCard.d.ts +3 -1
- package/dist/components/blocks/VoiceAgentCard.js +7 -76
- package/dist/components/blocks/WizardBlock.js +39 -39
- package/dist/components/blocks/user/InviteUserModal.js +38 -38
- package/dist/components/logos/index.js +2 -2
- package/dist/components/page-kits/AccountLockedPageKit.d.ts +10 -0
- package/dist/components/page-kits/AccountLockedPageKit.js +48 -0
- package/dist/components/page-kits/AgentsChatPageKit.d.ts +46 -0
- package/dist/components/page-kits/AgentsChatPageKit.js +290 -0
- package/dist/components/page-kits/AnalyticsPageKit.d.ts +49 -0
- package/dist/components/page-kits/AnalyticsPageKit.js +277 -0
- package/dist/components/page-kits/BlogContentPageKit.d.ts +64 -0
- package/dist/components/page-kits/BlogContentPageKit.js +296 -0
- package/dist/components/page-kits/CheckoutPageKit.d.ts +36 -0
- package/dist/components/page-kits/CheckoutPageKit.js +209 -0
- package/dist/components/page-kits/CompanySuitePageKit.d.ts +25 -0
- package/dist/components/page-kits/CompanySuitePageKit.js +240 -0
- package/dist/components/page-kits/CrudFormPageKit.d.ts +54 -0
- package/dist/components/page-kits/CrudFormPageKit.js +138 -0
- package/dist/components/page-kits/CrudListDetailPageKit.d.ts +70 -0
- package/dist/components/page-kits/CrudListDetailPageKit.js +138 -0
- package/dist/components/page-kits/DashboardPageKit.d.ts +39 -0
- package/dist/components/page-kits/DashboardPageKit.js +284 -0
- package/dist/components/page-kits/ErrorPageKit.d.ts +22 -0
- package/dist/components/page-kits/ErrorPageKit.js +55 -0
- package/dist/components/page-kits/KanbanBoardPageKit.d.ts +31 -0
- package/dist/components/page-kits/KanbanBoardPageKit.js +305 -0
- package/dist/components/page-kits/LandingPageKit.d.ts +29 -0
- package/dist/components/page-kits/LandingPageKit.js +222 -0
- package/dist/components/page-kits/LoginPageKit.d.ts +16 -0
- package/dist/components/page-kits/LoginPageKit.js +43 -0
- package/dist/components/page-kits/MarketingShellPageKit.d.ts +21 -0
- package/dist/components/page-kits/MarketingShellPageKit.js +131 -0
- package/dist/components/page-kits/NavigationShellPageKit.d.ts +41 -0
- package/dist/components/page-kits/NavigationShellPageKit.js +132 -0
- package/dist/components/page-kits/OnboardingPageKit.d.ts +26 -0
- package/dist/components/page-kits/OnboardingPageKit.js +248 -0
- package/dist/components/page-kits/PricingPageKit.d.ts +41 -0
- package/dist/components/page-kits/PricingPageKit.js +279 -0
- package/dist/components/page-kits/ProfileSettingsPageKit.d.ts +50 -0
- package/dist/components/page-kits/ProfileSettingsPageKit.js +171 -0
- package/dist/components/page-kits/RecoveryPageKit.d.ts +17 -0
- package/dist/components/page-kits/RecoveryPageKit.js +58 -0
- package/dist/components/page-kits/ResetPageKit.d.ts +14 -0
- package/dist/components/page-kits/ResetPageKit.js +52 -0
- package/dist/components/page-kits/ServiceSuitePageKit.d.ts +25 -0
- package/dist/components/page-kits/ServiceSuitePageKit.js +321 -0
- package/dist/components/page-kits/SettingsPageKit.d.ts +27 -0
- package/dist/components/page-kits/SettingsPageKit.js +11 -0
- package/dist/components/page-kits/SignupPageKit.d.ts +15 -0
- package/dist/components/page-kits/SignupPageKit.js +41 -0
- package/dist/components/page-kits/SuccessPageKit.d.ts +15 -0
- package/dist/components/page-kits/SuccessPageKit.js +146 -0
- package/dist/components/page-kits/TeamSettingsPageKit.d.ts +50 -0
- package/dist/components/page-kits/TeamSettingsPageKit.js +297 -0
- package/dist/components/page-kits/TwoFactorPageKit.d.ts +16 -0
- package/dist/components/page-kits/TwoFactorPageKit.js +156 -0
- package/dist/components/page-kits/VerifyEmailPageKit.d.ts +15 -0
- package/dist/components/page-kits/VerifyEmailPageKit.js +146 -0
- package/dist/components/page-kits/VoiceAgentsPageKit.d.ts +35 -0
- package/dist/components/page-kits/VoiceAgentsPageKit.js +250 -0
- package/dist/components/ui/Accordion.js +38 -38
- package/dist/components/ui/AgentMessageBubble.d.ts +20 -4
- package/dist/components/ui/AgentMessageBubble.js +39 -39
- package/dist/components/ui/AgentStatus.d.ts +1 -1
- package/dist/components/ui/AgentStatus.js +5 -10
- package/dist/components/ui/AgentTerminal.d.ts +4 -1
- package/dist/components/ui/AgentTerminal.js +3 -1
- package/dist/components/ui/AgentTimeline.d.ts +2 -2
- package/dist/components/ui/AgentTimeline.js +15 -6
- package/dist/components/ui/AnimatedDialog.js +38 -38
- package/dist/components/ui/AnimatedSheet.js +38 -38
- package/dist/components/ui/ApprovalCard.js +1 -1
- package/dist/components/ui/AudioWaveform.js +2 -76
- package/dist/components/ui/AvatarUpload.js +1 -1
- package/dist/components/ui/Breadcrumb.js +41 -143
- package/dist/components/ui/Calendar.js +38 -38
- package/dist/components/ui/Carousel.js +38 -38
- package/dist/components/ui/ChartCard.js +5 -38
- package/dist/components/ui/ChatActions.d.ts +14 -0
- package/dist/components/ui/ChatActions.js +52 -0
- package/dist/components/ui/ChatBranch.d.ts +18 -0
- package/dist/components/ui/ChatBranch.js +84 -0
- package/dist/components/ui/ChatChainOfThought.d.ts +25 -0
- package/dist/components/ui/ChatChainOfThought.js +99 -0
- package/dist/components/ui/ChatConfirmation.d.ts +37 -0
- package/dist/components/ui/ChatConfirmation.js +115 -0
- package/dist/components/ui/ChatGreeting.d.ts +18 -0
- package/dist/components/ui/ChatGreeting.js +80 -0
- package/dist/components/ui/ChatMessage.d.ts +40 -0
- package/dist/components/ui/ChatMessage.js +96 -0
- package/dist/components/ui/ChatPlan.d.ts +29 -0
- package/dist/components/ui/ChatPlan.js +86 -0
- package/dist/components/ui/ChatPromptInput.d.ts +32 -0
- package/dist/components/ui/ChatPromptInput.js +193 -0
- package/dist/components/ui/ChatPromptInputAttachments.d.ts +9 -0
- package/dist/components/ui/ChatPromptInputAttachments.js +145 -0
- package/dist/components/ui/ChatQueue.d.ts +32 -0
- package/dist/components/ui/ChatQueue.js +93 -0
- package/dist/components/ui/ChatReasoning.d.ts +20 -0
- package/dist/components/ui/ChatReasoning.js +91 -0
- package/dist/components/ui/ChatResponse.d.ts +14 -0
- package/dist/components/ui/ChatResponse.js +25 -0
- package/dist/components/ui/ChatShimmer.d.ts +23 -0
- package/dist/components/ui/ChatShimmer.js +6 -0
- package/dist/components/ui/ChatSources.d.ts +30 -0
- package/dist/components/ui/ChatSources.js +113 -0
- package/dist/components/ui/ChatSuggestion.d.ts +13 -0
- package/dist/components/ui/ChatSuggestion.js +41 -0
- package/dist/components/ui/ChatThinkingMessage.d.ts +12 -0
- package/dist/components/ui/ChatThinkingMessage.js +55 -0
- package/dist/components/ui/ChatToolCall.d.ts +41 -0
- package/dist/components/ui/ChatToolCall.js +192 -0
- package/dist/components/ui/CheckStatus.d.ts +1 -1
- package/dist/components/ui/Checkbox.js +38 -38
- package/dist/components/ui/CheckoutForm.js +38 -38
- package/dist/components/ui/CheckoutFormDemo.js +43 -44
- package/dist/components/ui/Combobox.js +38 -38
- package/dist/components/ui/Command.js +38 -38
- package/dist/components/ui/ContextMenu.js +38 -38
- package/dist/components/ui/Conversation.d.ts +21 -0
- package/dist/components/ui/Conversation.js +196 -0
- package/dist/components/ui/ConversationThread.d.ts +8 -2
- package/dist/components/ui/ConversationThread.js +34 -16
- package/dist/components/ui/DataFreshness.js +2 -73
- package/dist/components/ui/DataTable.js +40 -40
- package/dist/components/ui/DatePicker.js +38 -38
- package/dist/components/ui/DateRangePicker.js +38 -38
- package/dist/components/ui/Dialog.js +38 -38
- package/dist/components/ui/DropdownMenu.js +39 -39
- package/dist/components/ui/FileUpload.js +38 -38
- package/dist/components/ui/InputOTP.js +38 -38
- package/dist/components/ui/KanbanBoard.js +2 -2
- package/dist/components/ui/LanguageSwitcher.js +38 -38
- package/dist/components/ui/Menubar.js +38 -38
- package/dist/components/ui/MouseEffect.js +1 -1
- package/dist/components/ui/NativeSelect.js +2 -18
- package/dist/components/ui/NavigationMenu.js +38 -38
- package/dist/components/ui/NotificationCenter.js +38 -38
- package/dist/components/ui/Pagination.js +42 -153
- package/dist/components/ui/RadioGroup.js +38 -38
- package/dist/components/ui/Resizable.js +38 -38
- package/dist/components/ui/SearchCommand.js +38 -38
- package/dist/components/ui/Select.js +38 -38
- package/dist/components/ui/SettingsModal.js +38 -38
- package/dist/components/ui/ShaderBackground.js +2 -2
- package/dist/components/ui/Sheet.js +38 -38
- package/dist/components/ui/Sidebar.js +41 -41
- package/dist/components/ui/StyleToggle.js +1 -1
- package/dist/components/ui/TagInput.js +38 -38
- package/dist/components/ui/ThemeToggle.js +39 -39
- package/dist/components/ui/ThinkingIndicator.d.ts +3 -1
- package/dist/components/ui/ThinkingIndicator.js +2 -1
- package/dist/components/ui/Toast.js +38 -38
- package/dist/components/ui/Toaster.js +38 -38
- package/dist/components/ui/ToolCallCard.d.ts +1 -1
- package/dist/components/ui/ToolCallCard.js +5 -1
- package/dist/components/ui/TreeView.js +38 -38
- package/dist/components/ui/charts/index.js +1 -1
- package/dist/components/ui/icons/index.js +38 -38
- package/dist/components/ui/text-effects/index.js +2 -2
- package/dist/hooks/use-scroll-to-bottom.d.ts +13 -0
- package/dist/hooks/use-scroll-to-bottom.js +2 -0
- package/dist/hooks/use-shader-preset.js +2 -2
- package/dist/index.js +43 -43
- package/dist/internal/local-image-assets.d.ts +12 -0
- package/dist/lib/shader-presets.js +1 -1
- package/dist/lib/tokens.config.d.ts +19 -0
- package/dist/messages/en.js +1 -1
- package/dist/messages/it.js +1 -1
- package/dist/test/PublicSeedTestProvider.js +2 -2
- package/dist/test/simulate-ime-composition.d.ts +54 -0
- package/dist/test/simulate-ime-composition.js +55 -0
- package/eslint-rules/nadicode/config.js +2 -0
- package/eslint-rules/nadicode/index.js +4 -0
- package/eslint-rules/nadicode/rules/no-deprecated-ds-import.js +77 -0
- package/eslint-rules/nadicode/rules/no-forbidden-page-kit-import.js +99 -0
- package/eslint-rules/nadicode/rules/no-unregistered-glass.js +2 -0
- package/package.json +895 -686
- package/scripts/ds-check.mjs +102 -73
- package/src/lib/tokens.config.js +63 -41
- package/dist/chunk-MLUSJTS2.js +0 -107
- package/dist/{chunk-5DKCZWC6.js → chunk-CQEUNASC.js} +1 -1
- package/dist/{chunk-4HRVRW2X.js → chunk-J2DCQDXO.js} +2 -2
- package/dist/{chunk-6MFAZU4B.js → chunk-RGE5OQMZ.js} +1 -1
- package/dist/{chunk-PJNHVPHF.js → chunk-TYP2MR3Q.js} +1 -1
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Typography } from './chunk-N53OMWW2.js';
|
|
2
|
+
import { Heading } from './chunk-WI547C47.js';
|
|
3
|
+
import { ScrollFadeIn } from './chunk-I23DDSU7.js';
|
|
4
|
+
import { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from './chunk-W4YX7N46.js';
|
|
5
|
+
import { cn } from './chunk-QYZT24TS.js';
|
|
6
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
var defaultItems = [
|
|
9
|
+
{
|
|
10
|
+
question: "What frameworks are supported?",
|
|
11
|
+
answer: "We support React 18+, Next.js 13+, and any framework that works with Tailwind CSS. Our components are built on Radix UI primitives for maximum accessibility."
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
question: "Can I customize the design tokens?",
|
|
15
|
+
answer: "Yes. All colors, spacing, typography, and shadows are driven by a single tokens.config.js file. Change the tokens and every component updates automatically."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
question: "Is dark mode supported?",
|
|
19
|
+
answer: "Both light and dark themes are built in via CSS custom properties. The ThemeProvider handles persistence and system preference detection out of the box."
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: "How do I get support?",
|
|
23
|
+
answer: "Community support is available on GitHub Discussions. Pro and Enterprise plans include priority email and dedicated Slack channels."
|
|
24
|
+
}
|
|
25
|
+
];
|
|
26
|
+
function FAQBlock({
|
|
27
|
+
items = defaultItems,
|
|
28
|
+
title = "Frequently asked questions",
|
|
29
|
+
description,
|
|
30
|
+
className
|
|
31
|
+
}) {
|
|
32
|
+
return /* @__PURE__ */ jsx("section", { className: cn("py-16 md:py-24", className), children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-3xl px-6", children: [
|
|
33
|
+
/* @__PURE__ */ jsx(ScrollFadeIn, { children: /* @__PURE__ */ jsxs("div", { className: "mb-12 text-center", children: [
|
|
34
|
+
/* @__PURE__ */ jsx(Heading, { level: 2, size: "section", className: "text-text-primary", children: title }),
|
|
35
|
+
!!description && /* @__PURE__ */ jsx(Typography, { variant: "body", className: "mt-4 text-text-secondary", children: description })
|
|
36
|
+
] }) }),
|
|
37
|
+
/* @__PURE__ */ jsx(Accordion, { type: "single", collapsible: true, className: "w-full", children: items.map((item, index) => /* @__PURE__ */ jsx(ScrollFadeIn, { delay: index * 0.05, children: /* @__PURE__ */ jsxs(AccordionItem, { value: `faq-${index}`, children: [
|
|
38
|
+
/* @__PURE__ */ jsx(AccordionTrigger, { className: "text-left text-base font-medium text-text-primary", children: item.question }),
|
|
39
|
+
/* @__PURE__ */ jsx(AccordionContent, { className: "text-text-secondary leading-relaxed", children: item.answer })
|
|
40
|
+
] }) }, index)) })
|
|
41
|
+
] }) });
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export { FAQBlock };
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import { NavigationShellPageKit } from './chunk-ZKLB5N3Q.js';
|
|
2
|
+
import { Typography } from './chunk-N53OMWW2.js';
|
|
3
|
+
import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription } from './chunk-HOWTYZL5.js';
|
|
4
|
+
import { Pagination, PaginationContent, PaginationItem, PaginationPrevious, PaginationLink, PaginationNext } from './chunk-2BADJLMV.js';
|
|
5
|
+
import { Heading } from './chunk-WI547C47.js';
|
|
6
|
+
import { Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from './chunk-PXDHNGTG.js';
|
|
7
|
+
import { Input } from './chunk-AP3XXYAY.js';
|
|
8
|
+
import { Empty, EmptyTitle, EmptyDescription } from './chunk-55HD4L6G.js';
|
|
9
|
+
import { Card, CardHeader, CardTitle, CardContent } from './chunk-AH6YSYYT.js';
|
|
10
|
+
import { Button } from './chunk-7KIDDF3I.js';
|
|
11
|
+
import { Badge } from './chunk-S4JAHKOP.js';
|
|
12
|
+
import { cn } from './chunk-QYZT24TS.js';
|
|
13
|
+
import { useMemo } from 'react';
|
|
14
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
15
|
+
|
|
16
|
+
var EMPTY_FILTER_CONTROLS = [];
|
|
17
|
+
var EMPTY_SELECTED_ROW_IDS = [];
|
|
18
|
+
var EMPTY_BULK_ACTIONS = [];
|
|
19
|
+
function toPlainText(value) {
|
|
20
|
+
if (typeof value === "string" || typeof value === "number") {
|
|
21
|
+
return String(value);
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
function deriveRowLabel(row, columns) {
|
|
26
|
+
if (row.summaryLabel) {
|
|
27
|
+
return row.summaryLabel;
|
|
28
|
+
}
|
|
29
|
+
const firstColumn = columns[0];
|
|
30
|
+
if (!firstColumn) {
|
|
31
|
+
return row.id;
|
|
32
|
+
}
|
|
33
|
+
const firstCellValue = row.cells[firstColumn.id];
|
|
34
|
+
return toPlainText(firstCellValue) ?? row.id;
|
|
35
|
+
}
|
|
36
|
+
function deriveState(state, rows, selectedRowId) {
|
|
37
|
+
if (state) {
|
|
38
|
+
return state;
|
|
39
|
+
}
|
|
40
|
+
if (rows.length === 0) {
|
|
41
|
+
return "empty";
|
|
42
|
+
}
|
|
43
|
+
if (selectedRowId) {
|
|
44
|
+
return "selected-row";
|
|
45
|
+
}
|
|
46
|
+
return "has-data";
|
|
47
|
+
}
|
|
48
|
+
function clampPage(value, min, max) {
|
|
49
|
+
return Math.min(Math.max(value, min), max);
|
|
50
|
+
}
|
|
51
|
+
function CrudListDetailPageKit({
|
|
52
|
+
shell,
|
|
53
|
+
title = "CRUD list detail",
|
|
54
|
+
description = "Browse records, apply filters, and inspect row details without rebuilding route scaffolding.",
|
|
55
|
+
state,
|
|
56
|
+
columns,
|
|
57
|
+
rows,
|
|
58
|
+
filterControls = EMPTY_FILTER_CONTROLS,
|
|
59
|
+
selectedRowId = null,
|
|
60
|
+
selectedRowIds = EMPTY_SELECTED_ROW_IDS,
|
|
61
|
+
onRowSelect,
|
|
62
|
+
bulkActions = EMPTY_BULK_ACTIONS,
|
|
63
|
+
detailPanel,
|
|
64
|
+
emptyState,
|
|
65
|
+
pagination,
|
|
66
|
+
errorMessage,
|
|
67
|
+
listAriaLabel = "CRUD list region",
|
|
68
|
+
headerActions,
|
|
69
|
+
renderCollection,
|
|
70
|
+
className
|
|
71
|
+
}) {
|
|
72
|
+
const selectedRow = useMemo(
|
|
73
|
+
() => selectedRowId ? rows.find((row) => row.id === selectedRowId) ?? null : null,
|
|
74
|
+
[rows, selectedRowId]
|
|
75
|
+
);
|
|
76
|
+
const resolvedState = deriveState(state, rows, selectedRowId);
|
|
77
|
+
const detailMode = detailPanel?.mode ?? "inline";
|
|
78
|
+
const computedSelectedRowIds = useMemo(() => {
|
|
79
|
+
if (selectedRowIds.length > 0) {
|
|
80
|
+
return selectedRowIds;
|
|
81
|
+
}
|
|
82
|
+
if (selectedRowId) {
|
|
83
|
+
return [selectedRowId];
|
|
84
|
+
}
|
|
85
|
+
return EMPTY_SELECTED_ROW_IDS;
|
|
86
|
+
}, [selectedRowId, selectedRowIds]);
|
|
87
|
+
const pages = useMemo(() => {
|
|
88
|
+
const totalPages = Math.max(1, pagination.totalPages);
|
|
89
|
+
const currentPage = clampPage(pagination.page, 1, totalPages);
|
|
90
|
+
const visible = 5;
|
|
91
|
+
const half = Math.floor(visible / 2);
|
|
92
|
+
let start = Math.max(1, currentPage - half);
|
|
93
|
+
const end = Math.min(totalPages, start + visible - 1);
|
|
94
|
+
if (end - start < visible - 1) {
|
|
95
|
+
start = Math.max(1, end - visible + 1);
|
|
96
|
+
}
|
|
97
|
+
return Array.from({ length: end - start + 1 }, (_, index) => start + index);
|
|
98
|
+
}, [pagination.page, pagination.totalPages]);
|
|
99
|
+
const showInlineDetail = Boolean(detailPanel && detailMode === "inline" && selectedRow);
|
|
100
|
+
const showSheetDetail = Boolean(detailPanel && detailMode === "sheet" && selectedRow);
|
|
101
|
+
return /* @__PURE__ */ jsx(NavigationShellPageKit, { ...shell, children: /* @__PURE__ */ jsxs("section", { className: cn("space-y-6", className), children: [
|
|
102
|
+
/* @__PURE__ */ jsxs("header", { className: "space-y-2", children: [
|
|
103
|
+
/* @__PURE__ */ jsx(Heading, { level: 3, children: title }),
|
|
104
|
+
/* @__PURE__ */ jsx(Typography, { variant: "muted", children: description })
|
|
105
|
+
] }),
|
|
106
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3", children: [
|
|
107
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
108
|
+
computedSelectedRowIds.length > 0 ? /* @__PURE__ */ jsxs(Badge, { variant: "secondary", children: [
|
|
109
|
+
computedSelectedRowIds.length,
|
|
110
|
+
" selected"
|
|
111
|
+
] }) : null,
|
|
112
|
+
resolvedState === "loading" ? /* @__PURE__ */ jsx(Badge, { variant: "outline", children: "Loading" }) : null,
|
|
113
|
+
resolvedState === "filtered" ? /* @__PURE__ */ jsx(Badge, { variant: "outline", children: "Filtered results" }) : null,
|
|
114
|
+
resolvedState === "error" ? /* @__PURE__ */ jsx(Badge, { variant: "destructive", children: "Error" }) : null
|
|
115
|
+
] }),
|
|
116
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
117
|
+
bulkActions.map((action) => /* @__PURE__ */ jsx(
|
|
118
|
+
Button,
|
|
119
|
+
{
|
|
120
|
+
variant: "secondary",
|
|
121
|
+
disabled: action.disabled || computedSelectedRowIds.length === 0,
|
|
122
|
+
onClick: () => action.onAction(computedSelectedRowIds, rows),
|
|
123
|
+
children: action.label
|
|
124
|
+
},
|
|
125
|
+
action.id
|
|
126
|
+
)),
|
|
127
|
+
headerActions
|
|
128
|
+
] })
|
|
129
|
+
] }),
|
|
130
|
+
filterControls.length > 0 ? /* @__PURE__ */ jsxs(Card, { children: [
|
|
131
|
+
/* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(CardTitle, { children: "Filters" }) }),
|
|
132
|
+
/* @__PURE__ */ jsx(CardContent, { className: "grid gap-3 md:grid-cols-2 xl:grid-cols-3", children: filterControls.map((filter) => /* @__PURE__ */ jsxs("label", { className: "space-y-1", children: [
|
|
133
|
+
/* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-text-secondary", children: filter.label }),
|
|
134
|
+
/* @__PURE__ */ jsx(
|
|
135
|
+
Input,
|
|
136
|
+
{
|
|
137
|
+
"aria-label": filter.label,
|
|
138
|
+
value: filter.value,
|
|
139
|
+
placeholder: filter.placeholder,
|
|
140
|
+
onChange: (event) => filter.onChange(event.target.value)
|
|
141
|
+
}
|
|
142
|
+
)
|
|
143
|
+
] }, filter.id)) })
|
|
144
|
+
] }) : null,
|
|
145
|
+
/* @__PURE__ */ jsxs("div", { className: cn("grid gap-4", showInlineDetail ? "xl:grid-cols-[minmax(0,1fr)_340px]" : "grid-cols-1"), children: [
|
|
146
|
+
/* @__PURE__ */ jsxs("section", { "aria-label": listAriaLabel, className: "space-y-3", children: [
|
|
147
|
+
resolvedState === "loading" ? /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-text-secondary", children: "Loading list data" }) : null,
|
|
148
|
+
resolvedState === "error" ? /* @__PURE__ */ jsx(
|
|
149
|
+
"div",
|
|
150
|
+
{
|
|
151
|
+
role: "alert",
|
|
152
|
+
className: "rounded-md border border-destructive/40 bg-destructive/10 px-4 py-3 text-sm text-destructive",
|
|
153
|
+
children: errorMessage ?? "The list is unavailable. Retry once the data source recovers."
|
|
154
|
+
}
|
|
155
|
+
) : null,
|
|
156
|
+
(resolvedState === "empty" || resolvedState === "filtered") && rows.length === 0 ? /* @__PURE__ */ jsxs(Empty, { children: [
|
|
157
|
+
/* @__PURE__ */ jsx(EmptyTitle, { children: emptyState?.title ?? "No rows to display" }),
|
|
158
|
+
/* @__PURE__ */ jsx(EmptyDescription, { children: emptyState?.description ?? "Adjust your filters or create a new record to populate this table." })
|
|
159
|
+
] }) : null,
|
|
160
|
+
resolvedState !== "loading" && resolvedState !== "error" && rows.length > 0 ? renderCollection ? renderCollection({
|
|
161
|
+
rows,
|
|
162
|
+
columns,
|
|
163
|
+
selectedRowId,
|
|
164
|
+
onRowSelect
|
|
165
|
+
}) : /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsx(CardContent, { className: "p-0", children: /* @__PURE__ */ jsx("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsxs(Table, { children: [
|
|
166
|
+
/* @__PURE__ */ jsx(TableHeader, { children: /* @__PURE__ */ jsx(TableRow, { children: columns.map((column) => /* @__PURE__ */ jsx(TableHead, { className: column.headerClassName, children: column.header }, column.id)) }) }),
|
|
167
|
+
/* @__PURE__ */ jsx(TableBody, { children: rows.map((row) => {
|
|
168
|
+
const rowLabel = deriveRowLabel(row, columns);
|
|
169
|
+
return /* @__PURE__ */ jsx(
|
|
170
|
+
TableRow,
|
|
171
|
+
{
|
|
172
|
+
className: cn(
|
|
173
|
+
selectedRowId === row.id ? "bg-surface-secondary/70" : void 0
|
|
174
|
+
),
|
|
175
|
+
children: columns.map((column, columnIndex) => {
|
|
176
|
+
const cell = row.cells[column.id] ?? "-";
|
|
177
|
+
if (columnIndex === 0) {
|
|
178
|
+
return /* @__PURE__ */ jsx(TableCell, { className: column.cellClassName, children: /* @__PURE__ */ jsx(
|
|
179
|
+
Button,
|
|
180
|
+
{
|
|
181
|
+
variant: "ghost",
|
|
182
|
+
className: "h-auto w-full justify-start px-0 text-left",
|
|
183
|
+
"aria-label": `Select row ${rowLabel}`,
|
|
184
|
+
onClick: () => onRowSelect?.(row.id),
|
|
185
|
+
children: cell
|
|
186
|
+
}
|
|
187
|
+
) }, column.id);
|
|
188
|
+
}
|
|
189
|
+
return /* @__PURE__ */ jsx(TableCell, { className: column.cellClassName, children: cell }, column.id);
|
|
190
|
+
})
|
|
191
|
+
},
|
|
192
|
+
row.id
|
|
193
|
+
);
|
|
194
|
+
}) })
|
|
195
|
+
] }) }) }) }) : null,
|
|
196
|
+
/* @__PURE__ */ jsx(Pagination, { children: /* @__PURE__ */ jsxs(PaginationContent, { children: [
|
|
197
|
+
/* @__PURE__ */ jsx(PaginationItem, { children: /* @__PURE__ */ jsx(
|
|
198
|
+
PaginationPrevious,
|
|
199
|
+
{
|
|
200
|
+
href: "#",
|
|
201
|
+
onClick: (event) => {
|
|
202
|
+
event.preventDefault();
|
|
203
|
+
if (pagination.page > 1) {
|
|
204
|
+
pagination.onPageChange(pagination.page - 1);
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
"aria-disabled": pagination.page <= 1,
|
|
208
|
+
className: pagination.page <= 1 ? "pointer-events-none opacity-50" : void 0
|
|
209
|
+
}
|
|
210
|
+
) }),
|
|
211
|
+
pages.map((page) => /* @__PURE__ */ jsx(PaginationItem, { children: /* @__PURE__ */ jsx(
|
|
212
|
+
PaginationLink,
|
|
213
|
+
{
|
|
214
|
+
href: "#",
|
|
215
|
+
isActive: page === pagination.page,
|
|
216
|
+
onClick: (event) => {
|
|
217
|
+
event.preventDefault();
|
|
218
|
+
pagination.onPageChange(page);
|
|
219
|
+
},
|
|
220
|
+
children: page
|
|
221
|
+
}
|
|
222
|
+
) }, page)),
|
|
223
|
+
/* @__PURE__ */ jsx(PaginationItem, { children: /* @__PURE__ */ jsx(
|
|
224
|
+
PaginationNext,
|
|
225
|
+
{
|
|
226
|
+
href: "#",
|
|
227
|
+
onClick: (event) => {
|
|
228
|
+
event.preventDefault();
|
|
229
|
+
if (pagination.page < pagination.totalPages) {
|
|
230
|
+
pagination.onPageChange(pagination.page + 1);
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
"aria-disabled": pagination.page >= pagination.totalPages,
|
|
234
|
+
className: pagination.page >= pagination.totalPages ? "pointer-events-none opacity-50" : void 0
|
|
235
|
+
}
|
|
236
|
+
) })
|
|
237
|
+
] }) })
|
|
238
|
+
] }),
|
|
239
|
+
showInlineDetail && detailPanel ? /* @__PURE__ */ jsx("aside", { "aria-label": detailPanel.title ?? "Detail panel", children: /* @__PURE__ */ jsxs(Card, { children: [
|
|
240
|
+
/* @__PURE__ */ jsxs(CardHeader, { children: [
|
|
241
|
+
/* @__PURE__ */ jsx(CardTitle, { children: detailPanel.title ?? "Detail" }),
|
|
242
|
+
detailPanel.description ? /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-text-secondary", children: detailPanel.description }) : null
|
|
243
|
+
] }),
|
|
244
|
+
/* @__PURE__ */ jsx(CardContent, { children: selectedRow ? detailPanel.renderDetail(selectedRow) : null })
|
|
245
|
+
] }) }) : null
|
|
246
|
+
] }),
|
|
247
|
+
showSheetDetail && detailPanel && selectedRow ? /* @__PURE__ */ jsx(
|
|
248
|
+
Sheet,
|
|
249
|
+
{
|
|
250
|
+
open: showSheetDetail,
|
|
251
|
+
onOpenChange: (open) => {
|
|
252
|
+
detailPanel.onOpenChange?.(open);
|
|
253
|
+
if (!open) {
|
|
254
|
+
onRowSelect?.(null);
|
|
255
|
+
}
|
|
256
|
+
},
|
|
257
|
+
children: /* @__PURE__ */ jsxs(SheetContent, { side: "right", children: [
|
|
258
|
+
/* @__PURE__ */ jsxs(SheetHeader, { children: [
|
|
259
|
+
/* @__PURE__ */ jsx(SheetTitle, { children: detailPanel.title ?? "Detail" }),
|
|
260
|
+
detailPanel.description ? /* @__PURE__ */ jsx(SheetDescription, { children: detailPanel.description }) : null
|
|
261
|
+
] }),
|
|
262
|
+
/* @__PURE__ */ jsx("div", { className: "mt-4", children: detailPanel.renderDetail(selectedRow) })
|
|
263
|
+
] })
|
|
264
|
+
}
|
|
265
|
+
) : null
|
|
266
|
+
] }) });
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
export { CrudListDetailPageKit };
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { m } from './chunk-PD2YEH3H.js';
|
|
2
2
|
import { bezier } from './chunk-CRY67BIF.js';
|
|
3
|
+
import { CheckIcon } from './chunk-CXACRCZ4.js';
|
|
3
4
|
import { ChevronDownIcon } from './chunk-HJBXUXTD.js';
|
|
4
5
|
import { cn } from './chunk-QYZT24TS.js';
|
|
5
6
|
import * as React from 'react';
|
|
6
7
|
import { useTranslations } from 'next-intl';
|
|
7
8
|
import { cva } from 'class-variance-authority';
|
|
8
9
|
import { useReducedMotion } from 'motion/react';
|
|
9
|
-
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
10
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
10
11
|
|
|
11
12
|
var PULSE_TRANSITION = { duration: 1.2, repeat: Infinity, ease: bezier["ease-in-out"] };
|
|
12
13
|
var thinkingIndicatorVariants = cva(
|
|
@@ -29,33 +30,38 @@ var dotSizes = {
|
|
|
29
30
|
default: "h-1.5 w-1.5",
|
|
30
31
|
lg: "h-2 w-2"
|
|
31
32
|
};
|
|
32
|
-
function ThinkingIndicator({ className, size = "default", reasoning, ref, ...props }) {
|
|
33
|
+
function ThinkingIndicator({ className, size = "default", reasoning, state = "thinking", ref, ...props }) {
|
|
33
34
|
const t = useTranslations("components.thinkingIndicator");
|
|
34
35
|
const prefersReduced = useReducedMotion();
|
|
35
36
|
const [expanded, setExpanded] = React.useState(false);
|
|
36
37
|
const dotSize = dotSizes[size ?? "default"];
|
|
37
38
|
const reasoningPanelId = React.useId();
|
|
38
|
-
return /* @__PURE__ */ jsxs("div", { ref, className: cn("flex flex-col", className), ...props, children: [
|
|
39
|
+
return /* @__PURE__ */ jsxs("div", { ref, role: "status", className: cn("flex flex-col", className), ...props, children: [
|
|
39
40
|
/* @__PURE__ */ jsxs("div", { className: cn(thinkingIndicatorVariants({ size })), children: [
|
|
40
|
-
/* @__PURE__ */
|
|
41
|
-
"
|
|
42
|
-
{
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
41
|
+
state === "complete" ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
42
|
+
/* @__PURE__ */ jsx(CheckIcon, { size: 14, "aria-hidden": "true", className: "text-success" }),
|
|
43
|
+
/* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: t("complete") })
|
|
44
|
+
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
45
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-center gap-1.5", role: "group", "aria-label": t("thinking"), children: [0, 1, 2].map((i) => prefersReduced ? /* @__PURE__ */ jsx(
|
|
46
|
+
"span",
|
|
47
|
+
{
|
|
48
|
+
className: cn("rounded-full bg-accent", dotSize)
|
|
49
|
+
},
|
|
50
|
+
i
|
|
51
|
+
) : /* @__PURE__ */ jsx(
|
|
52
|
+
m.span,
|
|
53
|
+
{
|
|
54
|
+
className: cn("rounded-full bg-accent", dotSize),
|
|
55
|
+
animate: { opacity: [0.3, 1, 0.3] },
|
|
56
|
+
transition: {
|
|
57
|
+
...PULSE_TRANSITION,
|
|
58
|
+
delay: i * 0.2
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
i
|
|
62
|
+
)) }),
|
|
63
|
+
/* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: t("thinking") })
|
|
64
|
+
] }),
|
|
59
65
|
!!reasoning && /* @__PURE__ */ jsx(
|
|
60
66
|
"button",
|
|
61
67
|
{
|
|
@@ -69,6 +75,7 @@ function ThinkingIndicator({ className, size = "default", reasoning, ref, ...pro
|
|
|
69
75
|
ChevronDownIcon,
|
|
70
76
|
{
|
|
71
77
|
size: 14,
|
|
78
|
+
"aria-hidden": "true",
|
|
72
79
|
className: cn("transition-transform", expanded && "rotate-180")
|
|
73
80
|
}
|
|
74
81
|
)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from './chunk-PXDHNGTG.js';
|
|
2
|
-
import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuCheckboxItem } from './chunk-
|
|
2
|
+
import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuCheckboxItem } from './chunk-CQEUNASC.js';
|
|
3
3
|
import { Input } from './chunk-AP3XXYAY.js';
|
|
4
4
|
import { Button } from './chunk-7KIDDF3I.js';
|
|
5
5
|
import { Settings2Icon } from './chunk-TXGANOAX.js';
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { CountingNumber } from './chunk-F3T2U7YL.js';
|
|
2
|
+
import { StaggerChildren } from './chunk-DQPK2XRL.js';
|
|
3
|
+
import { Heading } from './chunk-WI547C47.js';
|
|
4
|
+
import { siteConfig } from './chunk-A7NUWD76.js';
|
|
5
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var defaultStats = [
|
|
8
|
+
{ value: 1200, label: "Stars on GitHub", prefix: "+" },
|
|
9
|
+
{ value: 22, label: "Active Users", suffix: " Million" },
|
|
10
|
+
{ value: 500, label: "Powered Apps", prefix: "+" }
|
|
11
|
+
];
|
|
12
|
+
var defaultTitle = `${siteConfig.name} in numbers`;
|
|
13
|
+
var defaultDescription = `The numbers speak for themselves. ${siteConfig.name} powers the next generation of AI interfaces with premium design tokens, glass effects, and accessible components.`;
|
|
14
|
+
function StatsMarketingBlock({
|
|
15
|
+
title = defaultTitle,
|
|
16
|
+
description = defaultDescription,
|
|
17
|
+
stats = defaultStats,
|
|
18
|
+
className
|
|
19
|
+
}) {
|
|
20
|
+
return /* @__PURE__ */ jsx("section", { className: className ?? "py-12 md:py-16", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-5xl space-y-8 px-6 md:space-y-16", children: [
|
|
21
|
+
/* @__PURE__ */ jsxs("div", { className: "relative z-10 mx-auto max-w-xl space-y-6 text-center", children: [
|
|
22
|
+
/* @__PURE__ */ jsx(Heading, { level: 2, size: "section", className: "text-4xl lg:text-5xl", children: title }),
|
|
23
|
+
/* @__PURE__ */ jsx("p", { className: "text-text-secondary", children: description })
|
|
24
|
+
] }),
|
|
25
|
+
/* @__PURE__ */ jsx(StaggerChildren, { staggerMs: 150, className: "grid gap-12 divide-y *:text-center md:grid-cols-3 md:gap-2 md:divide-x md:divide-y-0", children: stats.map((stat) => /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
26
|
+
/* @__PURE__ */ jsxs("div", { className: "text-5xl font-bold tabular-nums", children: [
|
|
27
|
+
stat.prefix,
|
|
28
|
+
/* @__PURE__ */ jsx(CountingNumber, { number: stat.value, inViewOnce: true }),
|
|
29
|
+
stat.suffix
|
|
30
|
+
] }),
|
|
31
|
+
/* @__PURE__ */ jsx("p", { children: stat.label })
|
|
32
|
+
] }, stat.label)) })
|
|
33
|
+
] }) });
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export { StatsMarketingBlock };
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// src/internal/local-image-assets.ts
|
|
2
|
+
function escapeXml(value) {
|
|
3
|
+
return value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
4
|
+
}
|
|
5
|
+
function hashString(value) {
|
|
6
|
+
let hash = 0;
|
|
7
|
+
for (let i = 0; i < value.length; i += 1) {
|
|
8
|
+
hash = hash * 31 + value.charCodeAt(i) >>> 0;
|
|
9
|
+
}
|
|
10
|
+
return hash;
|
|
11
|
+
}
|
|
12
|
+
function svgDataUri(svg) {
|
|
13
|
+
return `data:image/svg+xml;charset=UTF-8,${encodeURIComponent(svg)}`;
|
|
14
|
+
}
|
|
15
|
+
function createLogoDataUri(template) {
|
|
16
|
+
const ring = escapeXml(template.accent);
|
|
17
|
+
const fill = escapeXml(template.accent2);
|
|
18
|
+
const label = escapeXml(template.initials);
|
|
19
|
+
const seed = hashString(template.label);
|
|
20
|
+
const ornament = seed % 3 === 0 ? `<path d="M18 44c10-8 18-12 30-12" stroke="white" stroke-width="3" stroke-linecap="round" opacity="0.85"/>` : seed % 3 === 1 ? `<path d="M20 18l16 28 16-28" stroke="white" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" opacity="0.85"/>` : `<circle cx="34" cy="32" r="13" stroke="white" stroke-width="4" opacity="0.85"/>`;
|
|
21
|
+
return svgDataUri(`
|
|
22
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 64" role="img" aria-label="${escapeXml(template.label)} logo">
|
|
23
|
+
<defs>
|
|
24
|
+
<linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
25
|
+
<stop offset="0%" stop-color="${ring}"/>
|
|
26
|
+
<stop offset="100%" stop-color="${fill}"/>
|
|
27
|
+
</linearGradient>
|
|
28
|
+
</defs>
|
|
29
|
+
<rect x="1" y="1" width="158" height="62" rx="18" fill="url(#bg)" opacity="0.95"/>
|
|
30
|
+
<rect x="8" y="8" width="48" height="48" rx="14" fill="rgba(255,255,255,0.12)"/>
|
|
31
|
+
${ornament}
|
|
32
|
+
<text
|
|
33
|
+
x="80"
|
|
34
|
+
y="40"
|
|
35
|
+
text-anchor="middle"
|
|
36
|
+
fill="white"
|
|
37
|
+
font-family="Inter, ui-sans-serif, system-ui, sans-serif"
|
|
38
|
+
font-size="22"
|
|
39
|
+
font-weight="700"
|
|
40
|
+
letter-spacing="0.12em"
|
|
41
|
+
>${label}</text>
|
|
42
|
+
</svg>
|
|
43
|
+
`);
|
|
44
|
+
}
|
|
45
|
+
function createAvatarDataUri(seed, initials) {
|
|
46
|
+
const hash = hashString(seed);
|
|
47
|
+
const hue = hash % 360;
|
|
48
|
+
const hue2 = (hue + 36) % 360;
|
|
49
|
+
const label = escapeXml(initials.slice(0, 2).toUpperCase());
|
|
50
|
+
return svgDataUri(`
|
|
51
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" role="img" aria-label="${escapeXml(seed)} avatar">
|
|
52
|
+
<defs>
|
|
53
|
+
<radialGradient id="bg" cx="30%" cy="30%" r="80%">
|
|
54
|
+
<stop offset="0%" stop-color="hsl(${hue} 75% 62%)"/>
|
|
55
|
+
<stop offset="100%" stop-color="hsl(${hue2} 62% 38%)"/>
|
|
56
|
+
</radialGradient>
|
|
57
|
+
</defs>
|
|
58
|
+
<circle cx="64" cy="64" r="60" fill="url(#bg)"/>
|
|
59
|
+
<circle cx="46" cy="44" r="12" fill="rgba(255,255,255,0.22)"/>
|
|
60
|
+
<path d="M34 92c6-16 18-24 30-24s24 8 30 24" fill="none" stroke="rgba(255,255,255,0.28)" stroke-width="8" stroke-linecap="round"/>
|
|
61
|
+
<text
|
|
62
|
+
x="64"
|
|
63
|
+
y="74"
|
|
64
|
+
text-anchor="middle"
|
|
65
|
+
fill="white"
|
|
66
|
+
font-family="Inter, ui-sans-serif, system-ui, sans-serif"
|
|
67
|
+
font-size="38"
|
|
68
|
+
font-weight="800"
|
|
69
|
+
>${label}</text>
|
|
70
|
+
</svg>
|
|
71
|
+
`);
|
|
72
|
+
}
|
|
73
|
+
var BRAND_LOGO_TEMPLATES = [
|
|
74
|
+
{ label: "Nvidia", initials: "NV", accent: "#0e9f6e", accent2: "#084c41" },
|
|
75
|
+
{ label: "Column", initials: "CL", accent: "#1d4ed8", accent2: "#312e81" },
|
|
76
|
+
{ label: "GitHub", initials: "GH", accent: "#111827", accent2: "#374151" },
|
|
77
|
+
{ label: "Nike", initials: "NK", accent: "#0f172a", accent2: "#2563eb" },
|
|
78
|
+
{ label: "Lemon Squeezy", initials: "LS", accent: "#eab308", accent2: "#b45309" },
|
|
79
|
+
{ label: "Laravel", initials: "LR", accent: "#ef4444", accent2: "#7f1d1d" },
|
|
80
|
+
{ label: "Lilly", initials: "LL", accent: "#db2777", accent2: "#831843" },
|
|
81
|
+
{ label: "OpenAI", initials: "OA", accent: "#14b8a6", accent2: "#0f766e" },
|
|
82
|
+
{ label: "Tailwind CSS", initials: "TW", accent: "#38bdf8", accent2: "#0369a1" },
|
|
83
|
+
{ label: "Vercel", initials: "VC", accent: "#020617", accent2: "#334155" },
|
|
84
|
+
{ label: "Zapier", initials: "ZI", accent: "#f97316", accent2: "#9a3412" }
|
|
85
|
+
];
|
|
86
|
+
var LOCAL_CLOUD_LOGOS = BRAND_LOGO_TEMPLATES.map((template, index) => ({
|
|
87
|
+
src: createLogoDataUri(template),
|
|
88
|
+
alt: `${template.label} Logo`,
|
|
89
|
+
height: [20, 16, 16, 20, 16, 28, 20, 24, 16, 20, 20][index]
|
|
90
|
+
}));
|
|
91
|
+
var LOCAL_HERO_LOGOS = BRAND_LOGO_TEMPLATES.slice(0, 8).map((template, index) => ({
|
|
92
|
+
src: createLogoDataUri(template),
|
|
93
|
+
alt: `${template.label} Logo`,
|
|
94
|
+
height: String([20, 16, 16, 20, 20, 16, 28, 24][index])
|
|
95
|
+
}));
|
|
96
|
+
var LOCAL_NIKE_LOGO_SRC = createLogoDataUri(BRAND_LOGO_TEMPLATES[3]);
|
|
97
|
+
|
|
98
|
+
export { LOCAL_CLOUD_LOGOS, LOCAL_HERO_LOGOS, LOCAL_NIKE_LOGO_SRC, createAvatarDataUri };
|