@wakastellar/ui 2.3.4 → 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/blocks/dashboard/index.d.ts +4 -1
- package/dist/blocks/empty-states/index.d.ts +4 -1
- package/dist/blocks/error-pages/index.d.ts +4 -1
- package/dist/blocks/index.d.ts +1 -1
- package/dist/blocks/landing/index.d.ts +4 -1
- package/dist/blocks/pricing/index.d.ts +5 -1
- package/dist/blocks/sidebar/index.d.ts +5 -1
- package/dist/index.cjs.js +130 -130
- package/dist/index.d.ts +1 -0
- package/dist/index.es.js +7905 -7856
- 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/dist/types/index.d.ts +1 -0
- package/dist/types/link.d.ts +23 -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/index.tsx +68 -27
- 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/empty-states/index.tsx +26 -8
- package/src/blocks/error-pages/ErrorPages.stories.tsx +401 -0
- package/src/blocks/error-pages/index.tsx +26 -8
- 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/index.ts +1 -1
- 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/landing/index.tsx +125 -66
- 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/pricing/index.tsx +38 -4
- 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/sidebar/index.tsx +49 -20
- 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,114 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react'
|
|
2
|
+
import { Skeleton } from './index'
|
|
3
|
+
|
|
4
|
+
const meta: Meta<typeof Skeleton> = {
|
|
5
|
+
title: 'Components/Skeleton',
|
|
6
|
+
component: Skeleton,
|
|
7
|
+
parameters: {
|
|
8
|
+
layout: 'centered',
|
|
9
|
+
docs: {
|
|
10
|
+
description: {
|
|
11
|
+
component: 'Used to show a placeholder while content is loading.',
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
tags: ['autodocs'],
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export default meta
|
|
19
|
+
type Story = StoryObj<typeof Skeleton>
|
|
20
|
+
|
|
21
|
+
export const Default: Story = {
|
|
22
|
+
args: {
|
|
23
|
+
className: 'w-[200px] h-[20px]',
|
|
24
|
+
},
|
|
25
|
+
render: (args) => <Skeleton {...args} />,
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export const Card: Story = {
|
|
29
|
+
render: () => (
|
|
30
|
+
<div className="flex flex-col space-y-3">
|
|
31
|
+
<Skeleton className="h-[125px] w-[250px] rounded-xl" />
|
|
32
|
+
<div className="space-y-2">
|
|
33
|
+
<Skeleton className="h-4 w-[250px]" />
|
|
34
|
+
<Skeleton className="h-4 w-[200px]" />
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
),
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export const Avatar: Story = {
|
|
41
|
+
render: () => (
|
|
42
|
+
<div className="flex items-center space-x-4">
|
|
43
|
+
<Skeleton className="h-12 w-12 rounded-full" />
|
|
44
|
+
<div className="space-y-2">
|
|
45
|
+
<Skeleton className="h-4 w-[250px]" />
|
|
46
|
+
<Skeleton className="h-4 w-[200px]" />
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
),
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export const List: Story = {
|
|
53
|
+
render: () => (
|
|
54
|
+
<div className="space-y-4 w-[300px]">
|
|
55
|
+
{[1, 2, 3].map((i) => (
|
|
56
|
+
<div key={i} className="flex items-center space-x-4">
|
|
57
|
+
<Skeleton className="h-10 w-10 rounded-full" />
|
|
58
|
+
<div className="space-y-2 flex-1">
|
|
59
|
+
<Skeleton className="h-4 w-full" />
|
|
60
|
+
<Skeleton className="h-4 w-3/4" />
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
))}
|
|
64
|
+
</div>
|
|
65
|
+
),
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export const Table: Story = {
|
|
69
|
+
render: () => (
|
|
70
|
+
<div className="space-y-4 w-[500px]">
|
|
71
|
+
<div className="flex gap-4">
|
|
72
|
+
<Skeleton className="h-8 w-24" />
|
|
73
|
+
<Skeleton className="h-8 flex-1" />
|
|
74
|
+
<Skeleton className="h-8 w-20" />
|
|
75
|
+
</div>
|
|
76
|
+
{[1, 2, 3, 4].map((i) => (
|
|
77
|
+
<div key={i} className="flex gap-4">
|
|
78
|
+
<Skeleton className="h-6 w-24" />
|
|
79
|
+
<Skeleton className="h-6 flex-1" />
|
|
80
|
+
<Skeleton className="h-6 w-20" />
|
|
81
|
+
</div>
|
|
82
|
+
))}
|
|
83
|
+
</div>
|
|
84
|
+
),
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export const Article: Story = {
|
|
88
|
+
render: () => (
|
|
89
|
+
<div className="space-y-4 w-[400px]">
|
|
90
|
+
<Skeleton className="h-8 w-3/4" />
|
|
91
|
+
<Skeleton className="h-4 w-full" />
|
|
92
|
+
<Skeleton className="h-4 w-full" />
|
|
93
|
+
<Skeleton className="h-4 w-2/3" />
|
|
94
|
+
<Skeleton className="h-[200px] w-full rounded-lg" />
|
|
95
|
+
<Skeleton className="h-4 w-full" />
|
|
96
|
+
<Skeleton className="h-4 w-full" />
|
|
97
|
+
<Skeleton className="h-4 w-1/2" />
|
|
98
|
+
</div>
|
|
99
|
+
),
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export const Dashboard: Story = {
|
|
103
|
+
render: () => (
|
|
104
|
+
<div className="grid grid-cols-2 gap-4 w-[500px]">
|
|
105
|
+
{[1, 2, 3, 4].map((i) => (
|
|
106
|
+
<div key={i} className="p-4 border rounded-lg space-y-3">
|
|
107
|
+
<Skeleton className="h-4 w-20" />
|
|
108
|
+
<Skeleton className="h-8 w-24" />
|
|
109
|
+
<Skeleton className="h-2 w-full" />
|
|
110
|
+
</div>
|
|
111
|
+
))}
|
|
112
|
+
</div>
|
|
113
|
+
),
|
|
114
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react'
|
|
2
|
+
import { Slider } from './index'
|
|
3
|
+
import { Label } from '../label'
|
|
4
|
+
import * as React from 'react'
|
|
5
|
+
|
|
6
|
+
const meta: Meta<typeof Slider> = {
|
|
7
|
+
title: 'Components/Slider',
|
|
8
|
+
component: Slider,
|
|
9
|
+
parameters: {
|
|
10
|
+
layout: 'centered',
|
|
11
|
+
docs: {
|
|
12
|
+
description: {
|
|
13
|
+
component: 'An input where the user selects a value from within a given range.',
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
tags: ['autodocs'],
|
|
18
|
+
argTypes: {
|
|
19
|
+
defaultValue: {
|
|
20
|
+
control: { type: 'object' },
|
|
21
|
+
description: 'The default value of the slider',
|
|
22
|
+
},
|
|
23
|
+
max: {
|
|
24
|
+
control: { type: 'number' },
|
|
25
|
+
description: 'The maximum value of the slider',
|
|
26
|
+
},
|
|
27
|
+
step: {
|
|
28
|
+
control: { type: 'number' },
|
|
29
|
+
description: 'The step increment',
|
|
30
|
+
},
|
|
31
|
+
disabled: {
|
|
32
|
+
control: 'boolean',
|
|
33
|
+
description: 'When true, prevents the user from interacting with the slider',
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export default meta
|
|
39
|
+
type Story = StoryObj<typeof Slider>
|
|
40
|
+
|
|
41
|
+
export const Default: Story = {
|
|
42
|
+
args: {
|
|
43
|
+
defaultValue: [50],
|
|
44
|
+
max: 100,
|
|
45
|
+
step: 1,
|
|
46
|
+
className: 'w-[300px]',
|
|
47
|
+
},
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export const WithLabel: Story = {
|
|
51
|
+
render: function SliderWithLabel() {
|
|
52
|
+
const [value, setValue] = React.useState([50])
|
|
53
|
+
|
|
54
|
+
return (
|
|
55
|
+
<div className="w-[300px] space-y-4">
|
|
56
|
+
<div className="flex justify-between">
|
|
57
|
+
<Label>Volume</Label>
|
|
58
|
+
<span className="text-sm text-muted-foreground">{value}%</span>
|
|
59
|
+
</div>
|
|
60
|
+
<Slider
|
|
61
|
+
value={value}
|
|
62
|
+
onValueChange={setValue}
|
|
63
|
+
max={100}
|
|
64
|
+
step={1}
|
|
65
|
+
/>
|
|
66
|
+
</div>
|
|
67
|
+
)
|
|
68
|
+
},
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export const Range: Story = {
|
|
72
|
+
render: function SliderRange() {
|
|
73
|
+
const [value, setValue] = React.useState([25, 75])
|
|
74
|
+
|
|
75
|
+
return (
|
|
76
|
+
<div className="w-[300px] space-y-4">
|
|
77
|
+
<div className="flex justify-between">
|
|
78
|
+
<Label>Price Range</Label>
|
|
79
|
+
<span className="text-sm text-muted-foreground">
|
|
80
|
+
${value[0]} - ${value[1]}
|
|
81
|
+
</span>
|
|
82
|
+
</div>
|
|
83
|
+
<Slider
|
|
84
|
+
value={value}
|
|
85
|
+
onValueChange={setValue}
|
|
86
|
+
max={100}
|
|
87
|
+
step={1}
|
|
88
|
+
/>
|
|
89
|
+
</div>
|
|
90
|
+
)
|
|
91
|
+
},
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export const Steps: Story = {
|
|
95
|
+
render: () => (
|
|
96
|
+
<div className="w-[300px] space-y-6">
|
|
97
|
+
<div className="space-y-2">
|
|
98
|
+
<Label>Step: 1</Label>
|
|
99
|
+
<Slider defaultValue={[50]} max={100} step={1} />
|
|
100
|
+
</div>
|
|
101
|
+
<div className="space-y-2">
|
|
102
|
+
<Label>Step: 10</Label>
|
|
103
|
+
<Slider defaultValue={[50]} max={100} step={10} />
|
|
104
|
+
</div>
|
|
105
|
+
<div className="space-y-2">
|
|
106
|
+
<Label>Step: 25</Label>
|
|
107
|
+
<Slider defaultValue={[50]} max={100} step={25} />
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
),
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export const Disabled: Story = {
|
|
114
|
+
render: () => (
|
|
115
|
+
<Slider
|
|
116
|
+
defaultValue={[50]}
|
|
117
|
+
max={100}
|
|
118
|
+
step={1}
|
|
119
|
+
disabled
|
|
120
|
+
className="w-[300px]"
|
|
121
|
+
/>
|
|
122
|
+
),
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export const FormExample: Story = {
|
|
126
|
+
render: function FormSlider() {
|
|
127
|
+
const [brightness, setBrightness] = React.useState([70])
|
|
128
|
+
const [contrast, setContrast] = React.useState([50])
|
|
129
|
+
const [saturation, setSaturation] = React.useState([100])
|
|
130
|
+
|
|
131
|
+
return (
|
|
132
|
+
<div className="w-[300px] space-y-6">
|
|
133
|
+
<div className="space-y-2">
|
|
134
|
+
<div className="flex justify-between">
|
|
135
|
+
<Label>Brightness</Label>
|
|
136
|
+
<span className="text-sm text-muted-foreground">{brightness}%</span>
|
|
137
|
+
</div>
|
|
138
|
+
<Slider value={brightness} onValueChange={setBrightness} max={100} />
|
|
139
|
+
</div>
|
|
140
|
+
<div className="space-y-2">
|
|
141
|
+
<div className="flex justify-between">
|
|
142
|
+
<Label>Contrast</Label>
|
|
143
|
+
<span className="text-sm text-muted-foreground">{contrast}%</span>
|
|
144
|
+
</div>
|
|
145
|
+
<Slider value={contrast} onValueChange={setContrast} max={100} />
|
|
146
|
+
</div>
|
|
147
|
+
<div className="space-y-2">
|
|
148
|
+
<div className="flex justify-between">
|
|
149
|
+
<Label>Saturation</Label>
|
|
150
|
+
<span className="text-sm text-muted-foreground">{saturation}%</span>
|
|
151
|
+
</div>
|
|
152
|
+
<Slider value={saturation} onValueChange={setSaturation} max={200} />
|
|
153
|
+
</div>
|
|
154
|
+
</div>
|
|
155
|
+
)
|
|
156
|
+
},
|
|
157
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react'
|
|
2
|
+
import { Switch } from './index'
|
|
3
|
+
import { Label } from '../label'
|
|
4
|
+
|
|
5
|
+
const meta: Meta<typeof Switch> = {
|
|
6
|
+
title: 'Components/Switch',
|
|
7
|
+
component: Switch,
|
|
8
|
+
parameters: {
|
|
9
|
+
layout: 'centered',
|
|
10
|
+
docs: {
|
|
11
|
+
description: {
|
|
12
|
+
component: 'A control that allows the user to toggle between checked and not checked.',
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
tags: ['autodocs'],
|
|
17
|
+
argTypes: {
|
|
18
|
+
checked: {
|
|
19
|
+
control: 'boolean',
|
|
20
|
+
description: 'The controlled checked state of the switch',
|
|
21
|
+
},
|
|
22
|
+
disabled: {
|
|
23
|
+
control: 'boolean',
|
|
24
|
+
description: 'When true, prevents the user from interacting with the switch',
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export default meta
|
|
30
|
+
type Story = StoryObj<typeof Switch>
|
|
31
|
+
|
|
32
|
+
export const Default: Story = {
|
|
33
|
+
args: {
|
|
34
|
+
id: 'airplane-mode',
|
|
35
|
+
disabled: false,
|
|
36
|
+
},
|
|
37
|
+
render: (args) => (
|
|
38
|
+
<div className="flex items-center space-x-2">
|
|
39
|
+
<Switch {...args} />
|
|
40
|
+
<Label htmlFor="airplane-mode">Airplane Mode</Label>
|
|
41
|
+
</div>
|
|
42
|
+
),
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export const Checked: Story = {
|
|
46
|
+
render: () => (
|
|
47
|
+
<div className="flex items-center space-x-2">
|
|
48
|
+
<Switch id="checked" defaultChecked />
|
|
49
|
+
<Label htmlFor="checked">Enabled by default</Label>
|
|
50
|
+
</div>
|
|
51
|
+
),
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export const Disabled: Story = {
|
|
55
|
+
render: () => (
|
|
56
|
+
<div className="flex flex-col gap-4">
|
|
57
|
+
<div className="flex items-center space-x-2">
|
|
58
|
+
<Switch id="disabled" disabled />
|
|
59
|
+
<Label htmlFor="disabled" className="text-muted-foreground">Disabled</Label>
|
|
60
|
+
</div>
|
|
61
|
+
<div className="flex items-center space-x-2">
|
|
62
|
+
<Switch id="disabled-checked" disabled defaultChecked />
|
|
63
|
+
<Label htmlFor="disabled-checked" className="text-muted-foreground">Disabled (checked)</Label>
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
),
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export const FormExample: Story = {
|
|
70
|
+
render: () => (
|
|
71
|
+
<form className="w-[400px] space-y-6">
|
|
72
|
+
<div className="space-y-4">
|
|
73
|
+
<h4 className="font-medium">Email Notifications</h4>
|
|
74
|
+
<div className="flex items-center justify-between">
|
|
75
|
+
<div className="space-y-0.5">
|
|
76
|
+
<Label htmlFor="marketing">Marketing emails</Label>
|
|
77
|
+
<p className="text-sm text-muted-foreground">
|
|
78
|
+
Receive emails about new products, features, and more.
|
|
79
|
+
</p>
|
|
80
|
+
</div>
|
|
81
|
+
<Switch id="marketing" />
|
|
82
|
+
</div>
|
|
83
|
+
<div className="flex items-center justify-between">
|
|
84
|
+
<div className="space-y-0.5">
|
|
85
|
+
<Label htmlFor="security">Security emails</Label>
|
|
86
|
+
<p className="text-sm text-muted-foreground">
|
|
87
|
+
Receive emails about your account security.
|
|
88
|
+
</p>
|
|
89
|
+
</div>
|
|
90
|
+
<Switch id="security" defaultChecked />
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
</form>
|
|
94
|
+
),
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export const Sizes: Story = {
|
|
98
|
+
render: () => (
|
|
99
|
+
<div className="flex flex-col gap-4">
|
|
100
|
+
<div className="flex items-center space-x-2">
|
|
101
|
+
<Switch id="small" className="h-5 w-9 [&>span]:h-4 [&>span]:w-4 [&>span]:data-[state=checked]:translate-x-4" />
|
|
102
|
+
<Label htmlFor="small">Small</Label>
|
|
103
|
+
</div>
|
|
104
|
+
<div className="flex items-center space-x-2">
|
|
105
|
+
<Switch id="default" />
|
|
106
|
+
<Label htmlFor="default">Default</Label>
|
|
107
|
+
</div>
|
|
108
|
+
<div className="flex items-center space-x-2">
|
|
109
|
+
<Switch id="large" className="h-7 w-14 [&>span]:h-6 [&>span]:w-6 [&>span]:data-[state=checked]:translate-x-7" />
|
|
110
|
+
<Label htmlFor="large">Large</Label>
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
),
|
|
114
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react'
|
|
2
|
+
import {
|
|
3
|
+
Table,
|
|
4
|
+
TableBody,
|
|
5
|
+
TableCaption,
|
|
6
|
+
TableCell,
|
|
7
|
+
TableFooter,
|
|
8
|
+
TableHead,
|
|
9
|
+
TableHeader,
|
|
10
|
+
TableRow,
|
|
11
|
+
} from './index'
|
|
12
|
+
|
|
13
|
+
const meta: Meta<typeof Table> = {
|
|
14
|
+
title: 'Components/Table',
|
|
15
|
+
component: Table,
|
|
16
|
+
parameters: {
|
|
17
|
+
layout: 'centered',
|
|
18
|
+
docs: {
|
|
19
|
+
description: {
|
|
20
|
+
component: 'A responsive table component for displaying data.',
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
tags: ['autodocs'],
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export default meta
|
|
28
|
+
type Story = StoryObj<typeof Table>
|
|
29
|
+
|
|
30
|
+
const invoices = [
|
|
31
|
+
{ invoice: "INV001", status: "Paid", method: "Credit Card", amount: "$250.00" },
|
|
32
|
+
{ invoice: "INV002", status: "Pending", method: "PayPal", amount: "$150.00" },
|
|
33
|
+
{ invoice: "INV003", status: "Unpaid", method: "Bank Transfer", amount: "$350.00" },
|
|
34
|
+
{ invoice: "INV004", status: "Paid", method: "Credit Card", amount: "$450.00" },
|
|
35
|
+
{ invoice: "INV005", status: "Paid", method: "PayPal", amount: "$550.00" },
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
export const Default: Story = {
|
|
39
|
+
args: {
|
|
40
|
+
className: 'w-[600px]',
|
|
41
|
+
},
|
|
42
|
+
render: (args) => (
|
|
43
|
+
<Table {...args}>
|
|
44
|
+
<TableCaption>A list of your recent invoices.</TableCaption>
|
|
45
|
+
<TableHeader>
|
|
46
|
+
<TableRow>
|
|
47
|
+
<TableHead className="w-[100px]">Invoice</TableHead>
|
|
48
|
+
<TableHead>Status</TableHead>
|
|
49
|
+
<TableHead>Method</TableHead>
|
|
50
|
+
<TableHead className="text-right">Amount</TableHead>
|
|
51
|
+
</TableRow>
|
|
52
|
+
</TableHeader>
|
|
53
|
+
<TableBody>
|
|
54
|
+
{invoices.map((invoice) => (
|
|
55
|
+
<TableRow key={invoice.invoice}>
|
|
56
|
+
<TableCell className="font-medium">{invoice.invoice}</TableCell>
|
|
57
|
+
<TableCell>{invoice.status}</TableCell>
|
|
58
|
+
<TableCell>{invoice.method}</TableCell>
|
|
59
|
+
<TableCell className="text-right">{invoice.amount}</TableCell>
|
|
60
|
+
</TableRow>
|
|
61
|
+
))}
|
|
62
|
+
</TableBody>
|
|
63
|
+
</Table>
|
|
64
|
+
),
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export const WithFooter: Story = {
|
|
68
|
+
render: () => (
|
|
69
|
+
<Table className="w-[600px]">
|
|
70
|
+
<TableHeader>
|
|
71
|
+
<TableRow>
|
|
72
|
+
<TableHead className="w-[100px]">Invoice</TableHead>
|
|
73
|
+
<TableHead>Status</TableHead>
|
|
74
|
+
<TableHead>Method</TableHead>
|
|
75
|
+
<TableHead className="text-right">Amount</TableHead>
|
|
76
|
+
</TableRow>
|
|
77
|
+
</TableHeader>
|
|
78
|
+
<TableBody>
|
|
79
|
+
{invoices.map((invoice) => (
|
|
80
|
+
<TableRow key={invoice.invoice}>
|
|
81
|
+
<TableCell className="font-medium">{invoice.invoice}</TableCell>
|
|
82
|
+
<TableCell>{invoice.status}</TableCell>
|
|
83
|
+
<TableCell>{invoice.method}</TableCell>
|
|
84
|
+
<TableCell className="text-right">{invoice.amount}</TableCell>
|
|
85
|
+
</TableRow>
|
|
86
|
+
))}
|
|
87
|
+
</TableBody>
|
|
88
|
+
<TableFooter>
|
|
89
|
+
<TableRow>
|
|
90
|
+
<TableCell colSpan={3}>Total</TableCell>
|
|
91
|
+
<TableCell className="text-right">$1,750.00</TableCell>
|
|
92
|
+
</TableRow>
|
|
93
|
+
</TableFooter>
|
|
94
|
+
</Table>
|
|
95
|
+
),
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const users = [
|
|
99
|
+
{ id: 1, name: "John Doe", email: "john@example.com", role: "Admin" },
|
|
100
|
+
{ id: 2, name: "Jane Smith", email: "jane@example.com", role: "User" },
|
|
101
|
+
{ id: 3, name: "Bob Johnson", email: "bob@example.com", role: "User" },
|
|
102
|
+
{ id: 4, name: "Alice Brown", email: "alice@example.com", role: "Editor" },
|
|
103
|
+
]
|
|
104
|
+
|
|
105
|
+
export const UsersTable: Story = {
|
|
106
|
+
render: () => (
|
|
107
|
+
<Table className="w-[600px]">
|
|
108
|
+
<TableHeader>
|
|
109
|
+
<TableRow>
|
|
110
|
+
<TableHead>Name</TableHead>
|
|
111
|
+
<TableHead>Email</TableHead>
|
|
112
|
+
<TableHead>Role</TableHead>
|
|
113
|
+
</TableRow>
|
|
114
|
+
</TableHeader>
|
|
115
|
+
<TableBody>
|
|
116
|
+
{users.map((user) => (
|
|
117
|
+
<TableRow key={user.id}>
|
|
118
|
+
<TableCell className="font-medium">{user.name}</TableCell>
|
|
119
|
+
<TableCell>{user.email}</TableCell>
|
|
120
|
+
<TableCell>
|
|
121
|
+
<span className="inline-flex items-center rounded-full px-2 py-1 text-xs font-medium bg-primary/10 text-primary">
|
|
122
|
+
{user.role}
|
|
123
|
+
</span>
|
|
124
|
+
</TableCell>
|
|
125
|
+
</TableRow>
|
|
126
|
+
))}
|
|
127
|
+
</TableBody>
|
|
128
|
+
</Table>
|
|
129
|
+
),
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export const Striped: Story = {
|
|
133
|
+
render: () => (
|
|
134
|
+
<Table className="w-[600px]">
|
|
135
|
+
<TableHeader>
|
|
136
|
+
<TableRow>
|
|
137
|
+
<TableHead>Name</TableHead>
|
|
138
|
+
<TableHead>Email</TableHead>
|
|
139
|
+
<TableHead>Role</TableHead>
|
|
140
|
+
</TableRow>
|
|
141
|
+
</TableHeader>
|
|
142
|
+
<TableBody>
|
|
143
|
+
{users.map((user, index) => (
|
|
144
|
+
<TableRow key={user.id} className={index % 2 === 0 ? "bg-muted/50" : ""}>
|
|
145
|
+
<TableCell className="font-medium">{user.name}</TableCell>
|
|
146
|
+
<TableCell>{user.email}</TableCell>
|
|
147
|
+
<TableCell>{user.role}</TableCell>
|
|
148
|
+
</TableRow>
|
|
149
|
+
))}
|
|
150
|
+
</TableBody>
|
|
151
|
+
</Table>
|
|
152
|
+
),
|
|
153
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react'
|
|
2
|
+
import { Tabs, TabsContent, TabsList, TabsTrigger } from './index'
|
|
3
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../card'
|
|
4
|
+
import { Button } from '../button'
|
|
5
|
+
import { Input } from '../input'
|
|
6
|
+
import { Label } from '../label'
|
|
7
|
+
|
|
8
|
+
const meta: Meta<typeof Tabs> = {
|
|
9
|
+
title: 'Components/Tabs',
|
|
10
|
+
component: Tabs,
|
|
11
|
+
parameters: {
|
|
12
|
+
layout: 'centered',
|
|
13
|
+
docs: {
|
|
14
|
+
description: {
|
|
15
|
+
component: 'A set of layered sections of content that are displayed one at a time.',
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
tags: ['autodocs'],
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export default meta
|
|
23
|
+
type Story = StoryObj<typeof Tabs>
|
|
24
|
+
|
|
25
|
+
export const Default: Story = {
|
|
26
|
+
args: {
|
|
27
|
+
defaultValue: 'account',
|
|
28
|
+
className: 'w-[400px]',
|
|
29
|
+
},
|
|
30
|
+
render: (args) => (
|
|
31
|
+
<Tabs {...args}>
|
|
32
|
+
<TabsList className="grid w-full grid-cols-2">
|
|
33
|
+
<TabsTrigger value="account">Account</TabsTrigger>
|
|
34
|
+
<TabsTrigger value="password">Password</TabsTrigger>
|
|
35
|
+
</TabsList>
|
|
36
|
+
<TabsContent value="account">
|
|
37
|
+
<Card>
|
|
38
|
+
<CardHeader>
|
|
39
|
+
<CardTitle>Account</CardTitle>
|
|
40
|
+
<CardDescription>
|
|
41
|
+
Make changes to your account here. Click save when you're done.
|
|
42
|
+
</CardDescription>
|
|
43
|
+
</CardHeader>
|
|
44
|
+
<CardContent className="space-y-2">
|
|
45
|
+
<div className="space-y-1">
|
|
46
|
+
<Label htmlFor="name">Name</Label>
|
|
47
|
+
<Input id="name" defaultValue="Pedro Duarte" />
|
|
48
|
+
</div>
|
|
49
|
+
<div className="space-y-1">
|
|
50
|
+
<Label htmlFor="username">Username</Label>
|
|
51
|
+
<Input id="username" defaultValue="@peduarte" />
|
|
52
|
+
</div>
|
|
53
|
+
</CardContent>
|
|
54
|
+
</Card>
|
|
55
|
+
</TabsContent>
|
|
56
|
+
<TabsContent value="password">
|
|
57
|
+
<Card>
|
|
58
|
+
<CardHeader>
|
|
59
|
+
<CardTitle>Password</CardTitle>
|
|
60
|
+
<CardDescription>
|
|
61
|
+
Change your password here. After saving, you'll be logged out.
|
|
62
|
+
</CardDescription>
|
|
63
|
+
</CardHeader>
|
|
64
|
+
<CardContent className="space-y-2">
|
|
65
|
+
<div className="space-y-1">
|
|
66
|
+
<Label htmlFor="current">Current password</Label>
|
|
67
|
+
<Input id="current" type="password" />
|
|
68
|
+
</div>
|
|
69
|
+
<div className="space-y-1">
|
|
70
|
+
<Label htmlFor="new">New password</Label>
|
|
71
|
+
<Input id="new" type="password" />
|
|
72
|
+
</div>
|
|
73
|
+
</CardContent>
|
|
74
|
+
</Card>
|
|
75
|
+
</TabsContent>
|
|
76
|
+
</Tabs>
|
|
77
|
+
),
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export const Simple: Story = {
|
|
81
|
+
render: () => (
|
|
82
|
+
<Tabs defaultValue="tab1" className="w-[400px]">
|
|
83
|
+
<TabsList>
|
|
84
|
+
<TabsTrigger value="tab1">Tab 1</TabsTrigger>
|
|
85
|
+
<TabsTrigger value="tab2">Tab 2</TabsTrigger>
|
|
86
|
+
<TabsTrigger value="tab3">Tab 3</TabsTrigger>
|
|
87
|
+
</TabsList>
|
|
88
|
+
<TabsContent value="tab1" className="p-4">
|
|
89
|
+
Content for Tab 1
|
|
90
|
+
</TabsContent>
|
|
91
|
+
<TabsContent value="tab2" className="p-4">
|
|
92
|
+
Content for Tab 2
|
|
93
|
+
</TabsContent>
|
|
94
|
+
<TabsContent value="tab3" className="p-4">
|
|
95
|
+
Content for Tab 3
|
|
96
|
+
</TabsContent>
|
|
97
|
+
</Tabs>
|
|
98
|
+
),
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export const WithDisabled: Story = {
|
|
102
|
+
render: () => (
|
|
103
|
+
<Tabs defaultValue="overview" className="w-[400px]">
|
|
104
|
+
<TabsList>
|
|
105
|
+
<TabsTrigger value="overview">Overview</TabsTrigger>
|
|
106
|
+
<TabsTrigger value="analytics">Analytics</TabsTrigger>
|
|
107
|
+
<TabsTrigger value="reports" disabled>Reports</TabsTrigger>
|
|
108
|
+
<TabsTrigger value="notifications" disabled>Notifications</TabsTrigger>
|
|
109
|
+
</TabsList>
|
|
110
|
+
<TabsContent value="overview" className="p-4">
|
|
111
|
+
Overview content
|
|
112
|
+
</TabsContent>
|
|
113
|
+
<TabsContent value="analytics" className="p-4">
|
|
114
|
+
Analytics content
|
|
115
|
+
</TabsContent>
|
|
116
|
+
</Tabs>
|
|
117
|
+
),
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export const FullWidth: Story = {
|
|
121
|
+
render: () => (
|
|
122
|
+
<Tabs defaultValue="music" className="w-[500px]">
|
|
123
|
+
<TabsList className="grid w-full grid-cols-4">
|
|
124
|
+
<TabsTrigger value="music">Music</TabsTrigger>
|
|
125
|
+
<TabsTrigger value="podcasts">Podcasts</TabsTrigger>
|
|
126
|
+
<TabsTrigger value="live">Live</TabsTrigger>
|
|
127
|
+
<TabsTrigger value="settings">Settings</TabsTrigger>
|
|
128
|
+
</TabsList>
|
|
129
|
+
<TabsContent value="music" className="p-4 border rounded-b-md">
|
|
130
|
+
<h3 className="font-medium">Music Library</h3>
|
|
131
|
+
<p className="text-sm text-muted-foreground mt-1">
|
|
132
|
+
Browse your music collection
|
|
133
|
+
</p>
|
|
134
|
+
</TabsContent>
|
|
135
|
+
<TabsContent value="podcasts" className="p-4 border rounded-b-md">
|
|
136
|
+
<h3 className="font-medium">Podcasts</h3>
|
|
137
|
+
<p className="text-sm text-muted-foreground mt-1">
|
|
138
|
+
Listen to your favorite podcasts
|
|
139
|
+
</p>
|
|
140
|
+
</TabsContent>
|
|
141
|
+
<TabsContent value="live" className="p-4 border rounded-b-md">
|
|
142
|
+
<h3 className="font-medium">Live Radio</h3>
|
|
143
|
+
<p className="text-sm text-muted-foreground mt-1">
|
|
144
|
+
Tune in to live radio stations
|
|
145
|
+
</p>
|
|
146
|
+
</TabsContent>
|
|
147
|
+
<TabsContent value="settings" className="p-4 border rounded-b-md">
|
|
148
|
+
<h3 className="font-medium">Settings</h3>
|
|
149
|
+
<p className="text-sm text-muted-foreground mt-1">
|
|
150
|
+
Customize your experience
|
|
151
|
+
</p>
|
|
152
|
+
</TabsContent>
|
|
153
|
+
</Tabs>
|
|
154
|
+
),
|
|
155
|
+
}
|