@wakastellar/ui 2.3.5 → 2.4.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/dist/stories/Button.d.ts +14 -0
- package/dist/stories/Button.stories.d.ts +8 -0
- package/dist/stories/Header.d.ts +11 -0
- package/dist/stories/Header.stories.d.ts +6 -0
- package/dist/stories/Page.d.ts +2 -0
- package/dist/stories/Page.stories.d.ts +6 -0
- package/package.json +11 -3
- package/src/blocks/activity-timeline/ActivityTimeline.stories.tsx +460 -0
- package/src/blocks/apm-overview/APMOverview.stories.tsx +435 -0
- package/src/blocks/auth-2fa/Auth2FA.stories.tsx +308 -0
- package/src/blocks/calendar-view/CalendarView.stories.tsx +398 -0
- package/src/blocks/chat/Chat.stories.tsx +466 -0
- package/src/blocks/chat-interface/ChatInterface.stories.tsx +412 -0
- package/src/blocks/checkout-flow/CheckoutFlow.stories.tsx +408 -0
- package/src/blocks/cicd-builder/CICDBuilder.stories.tsx +499 -0
- package/src/blocks/cloud-cost-dashboard/CloudCostDashboard.stories.tsx +356 -0
- package/src/blocks/container-orchestrator/ContainerOrchestrator.stories.tsx +461 -0
- package/src/blocks/dashboard/Dashboard.stories.tsx +559 -0
- package/src/blocks/dashboard-kpi/DashboardKPI.stories.tsx +422 -0
- package/src/blocks/database-admin/DatabaseAdmin.stories.tsx +393 -0
- package/src/blocks/deployment-dashboard/DeploymentDashboard.stories.tsx +457 -0
- package/src/blocks/empty-states/EmptyStates.stories.tsx +467 -0
- package/src/blocks/error-pages/ErrorPages.stories.tsx +401 -0
- package/src/blocks/faq/FAQ.stories.tsx +416 -0
- package/src/blocks/file-manager/FileManager.stories.tsx +413 -0
- package/src/blocks/footer/Footer.stories.tsx +328 -0
- package/src/blocks/gitops-sync-status/GitOpsSyncStatus.stories.tsx +529 -0
- package/src/blocks/header/WakaHeader.stories.tsx +455 -0
- package/src/blocks/headtab/Headtab.stories.tsx +369 -0
- package/src/blocks/i18n-editor/I18nEditor.stories.tsx +451 -0
- package/src/blocks/incident-manager/IncidentManager.stories.tsx +464 -0
- package/src/blocks/infrastructure-map/InfrastructureMap.stories.tsx +533 -0
- package/src/blocks/kanban-board/KanbanBoard.stories.tsx +494 -0
- package/src/blocks/landing/WakaLanding.stories.tsx +449 -0
- package/src/blocks/language-selector/LanguageSelector.stories.tsx +345 -0
- package/src/blocks/layout/Layout.stories.tsx +373 -0
- package/src/blocks/login/Login.stories.tsx +443 -0
- package/src/blocks/on-call-schedule/OnCallSchedule.stories.tsx +381 -0
- package/src/blocks/player-profile/PlayerProfile.stories.tsx +316 -0
- package/src/blocks/pricing/WakaPricing.stories.tsx +530 -0
- package/src/blocks/profile/Profile.stories.tsx +371 -0
- package/src/blocks/release-notes/ReleaseNotes.stories.tsx +431 -0
- package/src/blocks/settings/Settings.stories.tsx +520 -0
- package/src/blocks/sidebar/WakaSidebar.stories.tsx +513 -0
- package/src/blocks/theme-creator-block/ThemeCreatorBlock.stories.tsx +370 -0
- package/src/blocks/user-management/UserManagement.stories.tsx +411 -0
- package/src/blocks/wizard/Wizard.stories.tsx +683 -0
- package/src/components/accordion/Accordion.stories.tsx +93 -0
- package/src/components/alert/Alert.stories.tsx +95 -0
- package/src/components/alert-dialog/AlertDialog.stories.tsx +126 -0
- package/src/components/aspect-ratio/AspectRatio.stories.tsx +118 -0
- package/src/components/avatar/Avatar.stories.tsx +104 -0
- package/src/components/button/Button.stories.tsx +12 -1
- package/src/components/calendar/Calendar.stories.tsx +102 -0
- package/src/components/card/Card.stories.tsx +125 -0
- package/src/components/checkbox/Checkbox.stories.tsx +100 -0
- package/src/components/code/Code.stories.tsx +402 -0
- package/src/components/collapsible/Collapsible.stories.tsx +123 -0
- package/src/components/command/Command.stories.tsx +207 -0
- package/src/components/context-menu/ContextMenu.stories.tsx +220 -0
- package/src/components/dialog/Dialog.stories.tsx +157 -0
- package/src/components/dropdown-menu/DropdownMenu.stories.tsx +225 -0
- package/src/components/form/Form.stories.tsx +413 -0
- package/src/components/hover-card/HoverCard.stories.tsx +148 -0
- package/src/components/input-otp/InputOTP.stories.tsx +255 -0
- package/src/components/label/Label.stories.tsx +68 -0
- package/src/components/menubar/Menubar.stories.tsx +278 -0
- package/src/components/navigation-menu/NavigationMenu.stories.tsx +202 -0
- package/src/components/popover/Popover.stories.tsx +199 -0
- package/src/components/progress/Progress.stories.tsx +104 -0
- package/src/components/radio-group/RadioGroup.stories.tsx +138 -0
- package/src/components/scroll-area/ScrollArea.stories.tsx +153 -0
- package/src/components/select/Select.stories.tsx +146 -0
- package/src/components/separator/Separator.stories.tsx +117 -0
- package/src/components/sheet/Sheet.stories.tsx +195 -0
- package/src/components/skeleton/Skeleton.stories.tsx +114 -0
- package/src/components/slider/Slider.stories.tsx +157 -0
- package/src/components/switch/Switch.stories.tsx +114 -0
- package/src/components/table/Table.stories.tsx +153 -0
- package/src/components/tabs/Tabs.stories.tsx +155 -0
- package/src/components/textarea/Textarea.stories.tsx +116 -0
- package/src/components/toast/Toast.stories.tsx +160 -0
- package/src/components/toggle/Toggle.stories.tsx +125 -0
- package/src/components/tooltip/Tooltip.stories.tsx +133 -0
- package/src/components/typography/Typography.stories.tsx +207 -0
- package/src/components/waka-3d-pie-chart/Waka3DPieChart.stories.tsx +308 -0
- package/src/components/waka-achievement-unlock/WakaAchievementUnlock.stories.tsx +353 -0
- package/src/components/waka-artifact-list/WakaArtifactList.stories.tsx +258 -0
- package/src/components/waka-autocomplete/WakaAutocomplete.stories.tsx +224 -0
- package/src/components/waka-badge-showcase/WakaBadgeShowcase.stories.tsx +269 -0
- package/src/components/waka-barcode/WakaBarcode.stories.tsx +227 -0
- package/src/components/waka-bottom-sheet/WakaBottomSheet.stories.tsx +408 -0
- package/src/components/waka-breadcrumb/WakaBreadcrumb.stories.tsx +237 -0
- package/src/components/waka-build-matrix/WakaBuildMatrix.stories.tsx +328 -0
- package/src/components/waka-carousel/WakaCarousel.stories.tsx +296 -0
- package/src/components/waka-charts/WakaCharts.stories.tsx +519 -0
- package/src/components/waka-color-picker/WakaColorPicker.stories.tsx +200 -0
- package/src/components/waka-combobox/WakaCombobox.stories.tsx +250 -0
- package/src/components/waka-container-list/WakaContainerList.stories.tsx +315 -0
- package/src/components/waka-contribution-graph/WakaContributionGraph.stories.tsx +354 -0
- package/src/components/waka-cost-breakdown/WakaCostBreakdown.stories.tsx +348 -0
- package/src/components/waka-daily-reward/WakaDailyReward.stories.tsx +365 -0
- package/src/components/waka-database-card/WakaDatabaseCard.stories.tsx +306 -0
- package/src/components/waka-date-range-picker/WakaDateRangePicker.stories.tsx +339 -0
- package/src/components/waka-datetime-picker/WakaDateTimePicker.stories.tsx +317 -0
- package/src/components/waka-deployment-lane/WakaDeploymentLane.stories.tsx +292 -0
- package/src/components/waka-dock/WakaDock.stories.tsx +332 -0
- package/src/components/waka-drawer/WakaDrawer.stories.tsx +437 -0
- package/src/components/waka-env-var-editor/WakaEnvVarEditor.stories.tsx +263 -0
- package/src/components/waka-error-shake/WakaErrorShake.stories.tsx +410 -0
- package/src/components/waka-file-upload/WakaFileUpload.stories.tsx +239 -0
- package/src/components/waka-flow-diagram/WakaFlowDiagram.stories.tsx +365 -0
- package/src/components/waka-funnel-chart/WakaFunnelChart.stories.tsx +281 -0
- package/src/components/waka-glow-card/WakaGlowCard.stories.tsx +274 -0
- package/src/components/waka-haptic-button/WakaHapticButton.stories.tsx +349 -0
- package/src/components/waka-health-pulse/WakaHealthPulse.stories.tsx +293 -0
- package/src/components/waka-heatmap/WakaHeatmap.stories.tsx +376 -0
- package/src/components/waka-image/WakaImage.stories.tsx +255 -0
- package/src/components/waka-incident-timeline/WakaIncidentTimeline.stories.tsx +300 -0
- package/src/components/waka-kanban/WakaKanban.stories.tsx +399 -0
- package/src/components/waka-kubernetes-overview/WakaKubernetesOverview.stories.tsx +281 -0
- package/src/components/waka-leaderboard/WakaLeaderboard.stories.tsx +300 -0
- package/src/components/waka-level-progress/WakaLevelProgress.stories.tsx +313 -0
- package/src/components/waka-loading-orbit/WakaLoadingOrbit.stories.tsx +413 -0
- package/src/components/waka-log-viewer/WakaLogViewer.stories.tsx +312 -0
- package/src/components/waka-loot-box/WakaLootBox.stories.tsx +374 -0
- package/src/components/waka-metric-sparkline/WakaMetricSparkline.stories.tsx +312 -0
- package/src/components/waka-migration-list/WakaMigrationList.stories.tsx +289 -0
- package/src/components/waka-modal/WakaModal.stories.tsx +434 -0
- package/src/components/waka-morph-button/WakaMorphButton.stories.tsx +405 -0
- package/src/components/waka-network-topology/WakaNetworkTopology.stories.tsx +364 -0
- package/src/components/waka-notifications/WakaNotifications.stories.tsx +290 -0
- package/src/components/waka-number-input/WakaNumberInput.stories.tsx +282 -0
- package/src/components/waka-pagination/WakaPagination.stories.tsx +328 -0
- package/src/components/waka-password-strength/WakaPasswordStrength.stories.tsx +318 -0
- package/src/components/waka-pipeline-view/WakaPipelineView.stories.tsx +386 -0
- package/src/components/waka-player-card/WakaPlayerCard.stories.tsx +333 -0
- package/src/components/waka-pod-card/WakaPodCard.stories.tsx +435 -0
- package/src/components/waka-qrcode/WakaQRCode.stories.tsx +232 -0
- package/src/components/waka-query-explain/WakaQueryExplain.stories.tsx +407 -0
- package/src/components/waka-quest-card/WakaQuestCard.stories.tsx +394 -0
- package/src/components/waka-quota-bar/WakaQuotaBar.stories.tsx +435 -0
- package/src/components/waka-radar-score/WakaRadarScore.stories.tsx +372 -0
- package/src/components/waka-resource-gauge/WakaResourceGauge.stories.tsx +366 -0
- package/src/components/waka-rich-text-editor/WakaRichTextEditor.stories.tsx +238 -0
- package/src/components/waka-sankey-diagram/WakaSankeyDiagram.stories.tsx +389 -0
- package/src/components/waka-scratch-card/WakaScratchCard.stories.tsx +388 -0
- package/src/components/waka-secret-card/WakaSecretCard.stories.tsx +314 -0
- package/src/components/waka-segmented-control/WakaSegmentedControl.stories.tsx +309 -0
- package/src/components/waka-server-rack/WakaServerRack.stories.tsx +382 -0
- package/src/components/waka-service-graph/WakaServiceGraph.stories.tsx +262 -0
- package/src/components/waka-skeleton-wave/WakaSkeletonWave.stories.tsx +321 -0
- package/src/components/waka-skill-tree/WakaSkillTree.stories.tsx +308 -0
- package/src/components/waka-spin-wheel/WakaSpinWheel.stories.tsx +368 -0
- package/src/components/waka-spinner/WakaSpinner.stories.tsx +156 -0
- package/src/components/waka-stat/WakaStat.stories.tsx +334 -0
- package/src/components/waka-status-matrix/WakaStatusMatrix.stories.tsx +331 -0
- package/src/components/waka-stepper/WakaStepper.stories.tsx +468 -0
- package/src/components/waka-streak-counter/WakaStreakCounter.stories.tsx +235 -0
- package/src/components/waka-success-explosion/WakaSuccessExplosion.stories.tsx +389 -0
- package/src/components/waka-tabs-morph/WakaTabsMorph.stories.tsx +471 -0
- package/src/components/waka-terminal-output/WakaTerminalOutput.stories.tsx +351 -0
- package/src/components/waka-test-report/WakaTestReport.stories.tsx +322 -0
- package/src/components/waka-tilt-card/WakaTiltCard.stories.tsx +300 -0
- package/src/components/waka-time-picker/WakaTimePicker.stories.tsx +227 -0
- package/src/components/waka-timeline/WakaTimeline.stories.tsx +383 -0
- package/src/components/waka-tournament-bracket/WakaTournamentBracket.stories.tsx +375 -0
- package/src/components/waka-trace-viewer/WakaTraceViewer.stories.tsx +445 -0
- package/src/components/waka-tree/WakaTree.stories.tsx +359 -0
- package/src/components/waka-treemap-chart/WakaTreemapChart.stories.tsx +378 -0
- package/src/components/waka-typewriter/WakaTypewriter.stories.tsx +366 -0
- package/src/components/waka-versus-card/WakaVersusCard.stories.tsx +530 -0
- package/src/components/waka-video/WakaVideo.stories.tsx +203 -0
- package/src/components/waka-virtual-list/WakaVirtualList.stories.tsx +273 -0
- package/src/components/waka-xp-bar/WakaXPBar.stories.tsx +305 -0
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react'
|
|
2
|
+
import { LanguageSelector } from './index'
|
|
3
|
+
import type { LanguageConfig } from '../../context/language-context'
|
|
4
|
+
import * as React from 'react'
|
|
5
|
+
|
|
6
|
+
// Mock the useLanguage hook since we can't use the real provider in Storybook
|
|
7
|
+
// We need to create a wrapper that provides the context
|
|
8
|
+
|
|
9
|
+
const mockLanguages: LanguageConfig[] = [
|
|
10
|
+
{ code: 'fr', label: 'Français', flagEmoji: '🇫🇷' },
|
|
11
|
+
{ code: 'en', label: 'English', flagEmoji: '🇬🇧' },
|
|
12
|
+
{ code: 'es', label: 'Español', flagEmoji: '🇪🇸' },
|
|
13
|
+
{ code: 'de', label: 'Deutsch', flagEmoji: '🇩🇪' },
|
|
14
|
+
{ code: 'it', label: 'Italiano', flagEmoji: '🇮🇹' },
|
|
15
|
+
{ code: 'pt', label: 'Português', flagEmoji: '🇵🇹' },
|
|
16
|
+
{ code: 'ja', label: '日本語', flagEmoji: '🇯🇵' },
|
|
17
|
+
{ code: 'zh', label: '中文', flagEmoji: '🇨🇳' },
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
// Create a mock context for storybook demos
|
|
21
|
+
const MockLanguageContext = React.createContext<{
|
|
22
|
+
currentLanguage: string
|
|
23
|
+
languages: LanguageConfig[]
|
|
24
|
+
changeLanguage: (code: string) => void
|
|
25
|
+
isLoading: boolean
|
|
26
|
+
} | null>(null)
|
|
27
|
+
|
|
28
|
+
function MockLanguageProvider({
|
|
29
|
+
children,
|
|
30
|
+
initialLanguage = 'fr',
|
|
31
|
+
languages = mockLanguages.slice(0, 4),
|
|
32
|
+
}: {
|
|
33
|
+
children: React.ReactNode
|
|
34
|
+
initialLanguage?: string
|
|
35
|
+
languages?: LanguageConfig[]
|
|
36
|
+
}) {
|
|
37
|
+
const [currentLanguage, setCurrentLanguage] = React.useState(initialLanguage)
|
|
38
|
+
const [isLoading, setIsLoading] = React.useState(false)
|
|
39
|
+
|
|
40
|
+
const changeLanguage = React.useCallback((code: string) => {
|
|
41
|
+
setIsLoading(true)
|
|
42
|
+
// Simulate async language change
|
|
43
|
+
setTimeout(() => {
|
|
44
|
+
setCurrentLanguage(code)
|
|
45
|
+
setIsLoading(false)
|
|
46
|
+
console.log('Language changed to:', code)
|
|
47
|
+
}, 500)
|
|
48
|
+
}, [])
|
|
49
|
+
|
|
50
|
+
return (
|
|
51
|
+
<MockLanguageContext.Provider value={{ currentLanguage, languages, changeLanguage, isLoading }}>
|
|
52
|
+
{children}
|
|
53
|
+
</MockLanguageContext.Provider>
|
|
54
|
+
)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Mock LanguageSelector that uses our mock context
|
|
58
|
+
function MockLanguageSelector({
|
|
59
|
+
variant = 'dropdown',
|
|
60
|
+
showFlags = true,
|
|
61
|
+
className,
|
|
62
|
+
}: {
|
|
63
|
+
variant?: 'dropdown' | 'select'
|
|
64
|
+
showFlags?: boolean
|
|
65
|
+
className?: string
|
|
66
|
+
}) {
|
|
67
|
+
const context = React.useContext(MockLanguageContext)
|
|
68
|
+
|
|
69
|
+
if (!context) {
|
|
70
|
+
return <div className="text-red-500">Error: Missing MockLanguageProvider</div>
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const { currentLanguage, languages, changeLanguage, isLoading } = context
|
|
74
|
+
const currentLang = languages.find(lang => lang.code === currentLanguage)
|
|
75
|
+
|
|
76
|
+
if (variant === 'select') {
|
|
77
|
+
return (
|
|
78
|
+
<div className={className}>
|
|
79
|
+
<select
|
|
80
|
+
value={currentLanguage}
|
|
81
|
+
onChange={(e) => changeLanguage(e.target.value)}
|
|
82
|
+
disabled={isLoading}
|
|
83
|
+
className="h-10 px-3 py-2 border rounded-md bg-background text-sm min-w-[180px]"
|
|
84
|
+
>
|
|
85
|
+
{languages.map((lang) => (
|
|
86
|
+
<option key={lang.code} value={lang.code}>
|
|
87
|
+
{showFlags && lang.flagEmoji ? `${lang.flagEmoji} ` : ''}{lang.label}
|
|
88
|
+
</option>
|
|
89
|
+
))}
|
|
90
|
+
</select>
|
|
91
|
+
</div>
|
|
92
|
+
)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return (
|
|
96
|
+
<div className={`relative ${className}`}>
|
|
97
|
+
<details className="group">
|
|
98
|
+
<summary className="flex items-center gap-2 px-3 py-2 border rounded-md cursor-pointer text-sm hover:bg-accent list-none">
|
|
99
|
+
<svg className="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
100
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9" />
|
|
101
|
+
</svg>
|
|
102
|
+
{showFlags && currentLang?.flagEmoji && <span>{currentLang.flagEmoji}</span>}
|
|
103
|
+
<span>{currentLang?.label || 'Select language'}</span>
|
|
104
|
+
{isLoading && <span className="animate-spin">⏳</span>}
|
|
105
|
+
</summary>
|
|
106
|
+
<div className="absolute top-full left-0 mt-1 w-48 bg-popover border rounded-md shadow-lg z-50">
|
|
107
|
+
{languages.map((lang) => (
|
|
108
|
+
<button
|
|
109
|
+
key={lang.code}
|
|
110
|
+
onClick={() => {
|
|
111
|
+
changeLanguage(lang.code)
|
|
112
|
+
// Close the details
|
|
113
|
+
const details = document.querySelector('details[open]')
|
|
114
|
+
if (details) details.removeAttribute('open')
|
|
115
|
+
}}
|
|
116
|
+
className="w-full px-3 py-2 text-left text-sm hover:bg-accent flex items-center gap-2"
|
|
117
|
+
>
|
|
118
|
+
{showFlags && lang.flagEmoji && <span>{lang.flagEmoji}</span>}
|
|
119
|
+
{lang.label}
|
|
120
|
+
</button>
|
|
121
|
+
))}
|
|
122
|
+
</div>
|
|
123
|
+
</details>
|
|
124
|
+
</div>
|
|
125
|
+
)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const meta: Meta<typeof MockLanguageSelector> = {
|
|
129
|
+
title: 'Blocks/LanguageSelector',
|
|
130
|
+
component: MockLanguageSelector,
|
|
131
|
+
parameters: {
|
|
132
|
+
layout: 'centered',
|
|
133
|
+
docs: {
|
|
134
|
+
description: {
|
|
135
|
+
component:
|
|
136
|
+
'A language selector component with dropdown or select variants, flag emojis, and loading states. Requires LanguageProvider context.',
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
tags: ['autodocs'],
|
|
141
|
+
argTypes: {
|
|
142
|
+
variant: {
|
|
143
|
+
control: 'select',
|
|
144
|
+
options: ['dropdown', 'select'],
|
|
145
|
+
},
|
|
146
|
+
showFlags: {
|
|
147
|
+
control: 'boolean',
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export default meta
|
|
153
|
+
type Story = StoryObj<typeof MockLanguageSelector>
|
|
154
|
+
|
|
155
|
+
export const Default: Story = {
|
|
156
|
+
render: () => (
|
|
157
|
+
<MockLanguageProvider>
|
|
158
|
+
<MockLanguageSelector />
|
|
159
|
+
</MockLanguageProvider>
|
|
160
|
+
),
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export const SelectVariant: Story = {
|
|
164
|
+
render: () => (
|
|
165
|
+
<MockLanguageProvider>
|
|
166
|
+
<MockLanguageSelector variant="select" />
|
|
167
|
+
</MockLanguageProvider>
|
|
168
|
+
),
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export const WithoutFlags: Story = {
|
|
172
|
+
render: () => (
|
|
173
|
+
<MockLanguageProvider>
|
|
174
|
+
<div className="space-y-4">
|
|
175
|
+
<div>
|
|
176
|
+
<p className="text-sm text-muted-foreground mb-2">Dropdown without flags</p>
|
|
177
|
+
<MockLanguageSelector showFlags={false} />
|
|
178
|
+
</div>
|
|
179
|
+
<div>
|
|
180
|
+
<p className="text-sm text-muted-foreground mb-2">Select without flags</p>
|
|
181
|
+
<MockLanguageSelector variant="select" showFlags={false} />
|
|
182
|
+
</div>
|
|
183
|
+
</div>
|
|
184
|
+
</MockLanguageProvider>
|
|
185
|
+
),
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
export const ManyLanguages: Story = {
|
|
189
|
+
render: () => (
|
|
190
|
+
<MockLanguageProvider languages={mockLanguages}>
|
|
191
|
+
<div className="space-y-4">
|
|
192
|
+
<div>
|
|
193
|
+
<p className="text-sm text-muted-foreground mb-2">Dropdown with many languages</p>
|
|
194
|
+
<MockLanguageSelector />
|
|
195
|
+
</div>
|
|
196
|
+
<div>
|
|
197
|
+
<p className="text-sm text-muted-foreground mb-2">Select with many languages</p>
|
|
198
|
+
<MockLanguageSelector variant="select" />
|
|
199
|
+
</div>
|
|
200
|
+
</div>
|
|
201
|
+
</MockLanguageProvider>
|
|
202
|
+
),
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export const TwoLanguages: Story = {
|
|
206
|
+
render: () => (
|
|
207
|
+
<MockLanguageProvider languages={mockLanguages.slice(0, 2)}>
|
|
208
|
+
<div className="space-y-4">
|
|
209
|
+
<div>
|
|
210
|
+
<p className="text-sm text-muted-foreground mb-2">Dropdown with 2 languages</p>
|
|
211
|
+
<MockLanguageSelector />
|
|
212
|
+
</div>
|
|
213
|
+
<div>
|
|
214
|
+
<p className="text-sm text-muted-foreground mb-2">Select with 2 languages</p>
|
|
215
|
+
<MockLanguageSelector variant="select" />
|
|
216
|
+
</div>
|
|
217
|
+
</div>
|
|
218
|
+
</MockLanguageProvider>
|
|
219
|
+
),
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export const InHeaderContext: Story = {
|
|
223
|
+
render: () => (
|
|
224
|
+
<MockLanguageProvider>
|
|
225
|
+
<div className="w-[800px] border rounded-lg">
|
|
226
|
+
<header className="flex items-center justify-between px-4 py-3 border-b">
|
|
227
|
+
<div className="flex items-center gap-4">
|
|
228
|
+
<span className="font-bold text-lg">MyApp</span>
|
|
229
|
+
<nav className="flex gap-4 text-sm">
|
|
230
|
+
<a href="#" className="text-muted-foreground hover:text-foreground">Home</a>
|
|
231
|
+
<a href="#" className="text-muted-foreground hover:text-foreground">Products</a>
|
|
232
|
+
<a href="#" className="text-muted-foreground hover:text-foreground">About</a>
|
|
233
|
+
</nav>
|
|
234
|
+
</div>
|
|
235
|
+
<div className="flex items-center gap-3">
|
|
236
|
+
<MockLanguageSelector />
|
|
237
|
+
<button className="px-3 py-1.5 text-sm bg-primary text-primary-foreground rounded-md">
|
|
238
|
+
Sign In
|
|
239
|
+
</button>
|
|
240
|
+
</div>
|
|
241
|
+
</header>
|
|
242
|
+
<main className="p-6">
|
|
243
|
+
<h1 className="text-2xl font-bold mb-2">Welcome</h1>
|
|
244
|
+
<p className="text-muted-foreground">
|
|
245
|
+
Select a language from the header to change the interface language.
|
|
246
|
+
</p>
|
|
247
|
+
</main>
|
|
248
|
+
</div>
|
|
249
|
+
</MockLanguageProvider>
|
|
250
|
+
),
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
export const InFooterContext: Story = {
|
|
254
|
+
render: () => (
|
|
255
|
+
<MockLanguageProvider>
|
|
256
|
+
<div className="w-[800px] border rounded-lg">
|
|
257
|
+
<main className="p-6 min-h-[200px]">
|
|
258
|
+
<h1 className="text-2xl font-bold mb-2">Page Content</h1>
|
|
259
|
+
<p className="text-muted-foreground">
|
|
260
|
+
The language selector can also be placed in the footer.
|
|
261
|
+
</p>
|
|
262
|
+
</main>
|
|
263
|
+
<footer className="flex items-center justify-between px-4 py-3 border-t bg-muted/30">
|
|
264
|
+
<span className="text-sm text-muted-foreground">
|
|
265
|
+
© 2024 MyApp Inc.
|
|
266
|
+
</span>
|
|
267
|
+
<div className="flex items-center gap-4">
|
|
268
|
+
<a href="#" className="text-sm text-muted-foreground hover:text-foreground">Privacy</a>
|
|
269
|
+
<a href="#" className="text-sm text-muted-foreground hover:text-foreground">Terms</a>
|
|
270
|
+
<MockLanguageSelector variant="select" />
|
|
271
|
+
</div>
|
|
272
|
+
</footer>
|
|
273
|
+
</div>
|
|
274
|
+
</MockLanguageProvider>
|
|
275
|
+
),
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
export const BothVariantsSideBySide: Story = {
|
|
279
|
+
render: () => (
|
|
280
|
+
<MockLanguageProvider>
|
|
281
|
+
<div className="flex gap-8 items-start">
|
|
282
|
+
<div>
|
|
283
|
+
<p className="text-sm font-medium mb-2">Dropdown Variant</p>
|
|
284
|
+
<MockLanguageSelector variant="dropdown" />
|
|
285
|
+
</div>
|
|
286
|
+
<div>
|
|
287
|
+
<p className="text-sm font-medium mb-2">Select Variant</p>
|
|
288
|
+
<MockLanguageSelector variant="select" />
|
|
289
|
+
</div>
|
|
290
|
+
</div>
|
|
291
|
+
</MockLanguageProvider>
|
|
292
|
+
),
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
export const StartWithDifferentLanguage: Story = {
|
|
296
|
+
render: () => (
|
|
297
|
+
<div className="space-y-6">
|
|
298
|
+
<MockLanguageProvider initialLanguage="en">
|
|
299
|
+
<div>
|
|
300
|
+
<p className="text-sm text-muted-foreground mb-2">Starting with English</p>
|
|
301
|
+
<MockLanguageSelector />
|
|
302
|
+
</div>
|
|
303
|
+
</MockLanguageProvider>
|
|
304
|
+
<MockLanguageProvider initialLanguage="es" languages={mockLanguages.slice(0, 4)}>
|
|
305
|
+
<div>
|
|
306
|
+
<p className="text-sm text-muted-foreground mb-2">Starting with Spanish</p>
|
|
307
|
+
<MockLanguageSelector />
|
|
308
|
+
</div>
|
|
309
|
+
</MockLanguageProvider>
|
|
310
|
+
<MockLanguageProvider initialLanguage="de" languages={mockLanguages.slice(0, 4)}>
|
|
311
|
+
<div>
|
|
312
|
+
<p className="text-sm text-muted-foreground mb-2">Starting with German</p>
|
|
313
|
+
<MockLanguageSelector />
|
|
314
|
+
</div>
|
|
315
|
+
</MockLanguageProvider>
|
|
316
|
+
</div>
|
|
317
|
+
),
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
export const AsianLanguages: Story = {
|
|
321
|
+
render: () => {
|
|
322
|
+
const asianLanguages: LanguageConfig[] = [
|
|
323
|
+
{ code: 'ja', label: '日本語', flagEmoji: '🇯🇵' },
|
|
324
|
+
{ code: 'zh', label: '中文', flagEmoji: '🇨🇳' },
|
|
325
|
+
{ code: 'ko', label: '한국어', flagEmoji: '🇰🇷' },
|
|
326
|
+
{ code: 'th', label: 'ไทย', flagEmoji: '🇹🇭' },
|
|
327
|
+
{ code: 'vi', label: 'Tiếng Việt', flagEmoji: '🇻🇳' },
|
|
328
|
+
]
|
|
329
|
+
|
|
330
|
+
return (
|
|
331
|
+
<MockLanguageProvider initialLanguage="ja" languages={asianLanguages}>
|
|
332
|
+
<div className="space-y-4">
|
|
333
|
+
<div>
|
|
334
|
+
<p className="text-sm text-muted-foreground mb-2">Dropdown with Asian languages</p>
|
|
335
|
+
<MockLanguageSelector />
|
|
336
|
+
</div>
|
|
337
|
+
<div>
|
|
338
|
+
<p className="text-sm text-muted-foreground mb-2">Select with Asian languages</p>
|
|
339
|
+
<MockLanguageSelector variant="select" />
|
|
340
|
+
</div>
|
|
341
|
+
</div>
|
|
342
|
+
</MockLanguageProvider>
|
|
343
|
+
)
|
|
344
|
+
},
|
|
345
|
+
}
|