@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,200 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react'
|
|
2
|
+
import { WakaColorPicker } from './index'
|
|
3
|
+
import * as React from 'react'
|
|
4
|
+
|
|
5
|
+
const meta: Meta<typeof WakaColorPicker> = {
|
|
6
|
+
title: 'Components/Forms/WakaColorPicker',
|
|
7
|
+
component: WakaColorPicker,
|
|
8
|
+
parameters: {
|
|
9
|
+
layout: 'centered',
|
|
10
|
+
docs: {
|
|
11
|
+
description: {
|
|
12
|
+
component: 'A color picker component with presets, EyeDropper support, and multiple formats.',
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
tags: ['autodocs'],
|
|
17
|
+
argTypes: {
|
|
18
|
+
format: {
|
|
19
|
+
control: 'select',
|
|
20
|
+
options: ['hex', 'rgb', 'hsl'],
|
|
21
|
+
description: 'Color format',
|
|
22
|
+
},
|
|
23
|
+
size: {
|
|
24
|
+
control: 'select',
|
|
25
|
+
options: ['sm', 'md', 'lg'],
|
|
26
|
+
description: 'Size of the trigger button',
|
|
27
|
+
},
|
|
28
|
+
showPresets: {
|
|
29
|
+
control: 'boolean',
|
|
30
|
+
description: 'Show preset colors',
|
|
31
|
+
},
|
|
32
|
+
showEyeDropper: {
|
|
33
|
+
control: 'boolean',
|
|
34
|
+
description: 'Show EyeDropper tool (if supported)',
|
|
35
|
+
},
|
|
36
|
+
disabled: {
|
|
37
|
+
control: 'boolean',
|
|
38
|
+
description: 'Disable the picker',
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export default meta
|
|
44
|
+
type Story = StoryObj<typeof WakaColorPicker>
|
|
45
|
+
|
|
46
|
+
export const Default: Story = {
|
|
47
|
+
render: function ColorPickerDemo() {
|
|
48
|
+
const [color, setColor] = React.useState('#3b82f6')
|
|
49
|
+
|
|
50
|
+
return (
|
|
51
|
+
<div className="flex items-center gap-4">
|
|
52
|
+
<WakaColorPicker value={color} onChange={setColor} />
|
|
53
|
+
<span className="text-sm font-mono">{color}</span>
|
|
54
|
+
</div>
|
|
55
|
+
)
|
|
56
|
+
},
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export const Sizes: Story = {
|
|
60
|
+
render: function SizesDemo() {
|
|
61
|
+
const [color, setColor] = React.useState('#ef4444')
|
|
62
|
+
|
|
63
|
+
return (
|
|
64
|
+
<div className="flex items-center gap-4">
|
|
65
|
+
<div className="text-center">
|
|
66
|
+
<WakaColorPicker value={color} onChange={setColor} size="sm" />
|
|
67
|
+
<p className="text-xs text-muted-foreground mt-1">Small</p>
|
|
68
|
+
</div>
|
|
69
|
+
<div className="text-center">
|
|
70
|
+
<WakaColorPicker value={color} onChange={setColor} size="md" />
|
|
71
|
+
<p className="text-xs text-muted-foreground mt-1">Medium</p>
|
|
72
|
+
</div>
|
|
73
|
+
<div className="text-center">
|
|
74
|
+
<WakaColorPicker value={color} onChange={setColor} size="lg" />
|
|
75
|
+
<p className="text-xs text-muted-foreground mt-1">Large</p>
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
)
|
|
79
|
+
},
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export const Formats: Story = {
|
|
83
|
+
render: function FormatsDemo() {
|
|
84
|
+
const [hexColor, setHexColor] = React.useState('#22c55e')
|
|
85
|
+
const [rgbColor, setRgbColor] = React.useState('rgb(34, 197, 94)')
|
|
86
|
+
const [hslColor, setHslColor] = React.useState('hsl(142, 71%, 45%)')
|
|
87
|
+
|
|
88
|
+
return (
|
|
89
|
+
<div className="space-y-4">
|
|
90
|
+
<div className="flex items-center gap-4">
|
|
91
|
+
<WakaColorPicker value={hexColor} onChange={setHexColor} format="hex" />
|
|
92
|
+
<span className="text-sm font-mono">HEX: {hexColor}</span>
|
|
93
|
+
</div>
|
|
94
|
+
<div className="flex items-center gap-4">
|
|
95
|
+
<WakaColorPicker value={rgbColor} onChange={setRgbColor} format="rgb" />
|
|
96
|
+
<span className="text-sm font-mono">RGB: {rgbColor}</span>
|
|
97
|
+
</div>
|
|
98
|
+
<div className="flex items-center gap-4">
|
|
99
|
+
<WakaColorPicker value={hslColor} onChange={setHslColor} format="hsl" />
|
|
100
|
+
<span className="text-sm font-mono">HSL: {hslColor}</span>
|
|
101
|
+
</div>
|
|
102
|
+
</div>
|
|
103
|
+
)
|
|
104
|
+
},
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export const CustomPresets: Story = {
|
|
108
|
+
render: function CustomPresetsDemo() {
|
|
109
|
+
const [color, setColor] = React.useState('#8b5cf6')
|
|
110
|
+
|
|
111
|
+
const customPresets = [
|
|
112
|
+
'#000000', '#ffffff',
|
|
113
|
+
'#ef4444', '#f97316', '#f59e0b',
|
|
114
|
+
'#22c55e', '#14b8a6', '#3b82f6',
|
|
115
|
+
'#8b5cf6', '#ec4899',
|
|
116
|
+
]
|
|
117
|
+
|
|
118
|
+
return (
|
|
119
|
+
<div className="flex items-center gap-4">
|
|
120
|
+
<WakaColorPicker
|
|
121
|
+
value={color}
|
|
122
|
+
onChange={setColor}
|
|
123
|
+
presets={customPresets}
|
|
124
|
+
/>
|
|
125
|
+
<span className="text-sm font-mono">{color}</span>
|
|
126
|
+
</div>
|
|
127
|
+
)
|
|
128
|
+
},
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export const NoPresets: Story = {
|
|
132
|
+
render: function NoPresetsDemo() {
|
|
133
|
+
const [color, setColor] = React.useState('#0ea5e9')
|
|
134
|
+
|
|
135
|
+
return (
|
|
136
|
+
<div className="flex items-center gap-4">
|
|
137
|
+
<WakaColorPicker
|
|
138
|
+
value={color}
|
|
139
|
+
onChange={setColor}
|
|
140
|
+
showPresets={false}
|
|
141
|
+
/>
|
|
142
|
+
<span className="text-sm font-mono">{color}</span>
|
|
143
|
+
</div>
|
|
144
|
+
)
|
|
145
|
+
},
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export const Disabled: Story = {
|
|
149
|
+
render: () => (
|
|
150
|
+
<WakaColorPicker value="#6b7280" disabled />
|
|
151
|
+
),
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export const InForm: Story = {
|
|
155
|
+
render: function InFormDemo() {
|
|
156
|
+
const [bgColor, setBgColor] = React.useState('#ffffff')
|
|
157
|
+
const [textColor, setTextColor] = React.useState('#000000')
|
|
158
|
+
const [accentColor, setAccentColor] = React.useState('#3b82f6')
|
|
159
|
+
|
|
160
|
+
return (
|
|
161
|
+
<div className="space-y-4 w-[300px]">
|
|
162
|
+
<div className="space-y-2">
|
|
163
|
+
<label className="text-sm font-medium">Background Color</label>
|
|
164
|
+
<div className="flex items-center gap-2">
|
|
165
|
+
<WakaColorPicker value={bgColor} onChange={setBgColor} />
|
|
166
|
+
<span className="text-sm font-mono flex-1">{bgColor}</span>
|
|
167
|
+
</div>
|
|
168
|
+
</div>
|
|
169
|
+
<div className="space-y-2">
|
|
170
|
+
<label className="text-sm font-medium">Text Color</label>
|
|
171
|
+
<div className="flex items-center gap-2">
|
|
172
|
+
<WakaColorPicker value={textColor} onChange={setTextColor} />
|
|
173
|
+
<span className="text-sm font-mono flex-1">{textColor}</span>
|
|
174
|
+
</div>
|
|
175
|
+
</div>
|
|
176
|
+
<div className="space-y-2">
|
|
177
|
+
<label className="text-sm font-medium">Accent Color</label>
|
|
178
|
+
<div className="flex items-center gap-2">
|
|
179
|
+
<WakaColorPicker value={accentColor} onChange={setAccentColor} />
|
|
180
|
+
<span className="text-sm font-mono flex-1">{accentColor}</span>
|
|
181
|
+
</div>
|
|
182
|
+
</div>
|
|
183
|
+
|
|
184
|
+
<div
|
|
185
|
+
className="p-4 rounded-lg mt-4"
|
|
186
|
+
style={{ backgroundColor: bgColor, color: textColor }}
|
|
187
|
+
>
|
|
188
|
+
<p className="font-semibold">Preview</p>
|
|
189
|
+
<p className="text-sm mt-1">This is how your colors look together.</p>
|
|
190
|
+
<button
|
|
191
|
+
className="mt-2 px-3 py-1 rounded text-white text-sm"
|
|
192
|
+
style={{ backgroundColor: accentColor }}
|
|
193
|
+
>
|
|
194
|
+
Accent Button
|
|
195
|
+
</button>
|
|
196
|
+
</div>
|
|
197
|
+
</div>
|
|
198
|
+
)
|
|
199
|
+
},
|
|
200
|
+
}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react'
|
|
2
|
+
import { WakaCombobox, type ComboboxOption } from './index'
|
|
3
|
+
import * as React from 'react'
|
|
4
|
+
import { User, Building, Globe } from 'lucide-react'
|
|
5
|
+
|
|
6
|
+
const meta: Meta<typeof WakaCombobox> = {
|
|
7
|
+
title: 'Components/Forms/WakaCombobox',
|
|
8
|
+
component: WakaCombobox,
|
|
9
|
+
parameters: {
|
|
10
|
+
layout: 'centered',
|
|
11
|
+
docs: {
|
|
12
|
+
description: {
|
|
13
|
+
component: 'A combobox component with single/multi-select, async search, and option creation.',
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
tags: ['autodocs'],
|
|
18
|
+
argTypes: {
|
|
19
|
+
multiple: {
|
|
20
|
+
control: 'boolean',
|
|
21
|
+
description: 'Enable multi-select mode',
|
|
22
|
+
},
|
|
23
|
+
creatable: {
|
|
24
|
+
control: 'boolean',
|
|
25
|
+
description: 'Allow creating new options',
|
|
26
|
+
},
|
|
27
|
+
size: {
|
|
28
|
+
control: 'select',
|
|
29
|
+
options: ['sm', 'md', 'lg'],
|
|
30
|
+
description: 'Size of the component',
|
|
31
|
+
},
|
|
32
|
+
disabled: {
|
|
33
|
+
control: 'boolean',
|
|
34
|
+
description: 'Disable the component',
|
|
35
|
+
},
|
|
36
|
+
clearable: {
|
|
37
|
+
control: 'boolean',
|
|
38
|
+
description: 'Allow clearing the selection',
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export default meta
|
|
44
|
+
type Story = StoryObj<typeof WakaCombobox>
|
|
45
|
+
|
|
46
|
+
const frameworks: ComboboxOption[] = [
|
|
47
|
+
{ value: 'nextjs', label: 'Next.js', description: 'The React Framework' },
|
|
48
|
+
{ value: 'sveltekit', label: 'SvelteKit', description: 'Web development, streamlined' },
|
|
49
|
+
{ value: 'nuxt', label: 'Nuxt', description: 'The Intuitive Vue Framework' },
|
|
50
|
+
{ value: 'remix', label: 'Remix', description: 'Build better websites' },
|
|
51
|
+
{ value: 'astro', label: 'Astro', description: 'The web framework for content' },
|
|
52
|
+
]
|
|
53
|
+
|
|
54
|
+
const groupedOptions: ComboboxOption[] = [
|
|
55
|
+
{ value: 'john', label: 'John Doe', group: 'Users', icon: <User className="h-4 w-4" /> },
|
|
56
|
+
{ value: 'jane', label: 'Jane Smith', group: 'Users', icon: <User className="h-4 w-4" /> },
|
|
57
|
+
{ value: 'acme', label: 'Acme Inc', group: 'Organizations', icon: <Building className="h-4 w-4" /> },
|
|
58
|
+
{ value: 'globex', label: 'Globex Corp', group: 'Organizations', icon: <Building className="h-4 w-4" /> },
|
|
59
|
+
{ value: 'us', label: 'United States', group: 'Countries', icon: <Globe className="h-4 w-4" /> },
|
|
60
|
+
{ value: 'uk', label: 'United Kingdom', group: 'Countries', icon: <Globe className="h-4 w-4" /> },
|
|
61
|
+
]
|
|
62
|
+
|
|
63
|
+
export const Default: Story = {
|
|
64
|
+
render: function ComboboxDemo() {
|
|
65
|
+
const [value, setValue] = React.useState<string | string[] | undefined>()
|
|
66
|
+
|
|
67
|
+
return (
|
|
68
|
+
<div className="w-[300px]">
|
|
69
|
+
<WakaCombobox
|
|
70
|
+
options={frameworks}
|
|
71
|
+
value={value as string}
|
|
72
|
+
onChange={(v) => setValue(v as string)}
|
|
73
|
+
placeholder="Select a framework..."
|
|
74
|
+
/>
|
|
75
|
+
</div>
|
|
76
|
+
)
|
|
77
|
+
},
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export const Multiple: Story = {
|
|
81
|
+
render: function MultipleDemo() {
|
|
82
|
+
const [value, setValue] = React.useState<string[] | undefined>()
|
|
83
|
+
|
|
84
|
+
return (
|
|
85
|
+
<div className="w-[300px]">
|
|
86
|
+
<WakaCombobox
|
|
87
|
+
options={frameworks}
|
|
88
|
+
value={value}
|
|
89
|
+
onChange={(v) => setValue(v as string[])}
|
|
90
|
+
multiple
|
|
91
|
+
placeholder="Select frameworks..."
|
|
92
|
+
/>
|
|
93
|
+
</div>
|
|
94
|
+
)
|
|
95
|
+
},
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export const WithGroups: Story = {
|
|
99
|
+
render: function GroupsDemo() {
|
|
100
|
+
const [value, setValue] = React.useState<string | undefined>()
|
|
101
|
+
|
|
102
|
+
return (
|
|
103
|
+
<div className="w-[300px]">
|
|
104
|
+
<WakaCombobox
|
|
105
|
+
options={groupedOptions}
|
|
106
|
+
value={value}
|
|
107
|
+
onChange={(v) => setValue(v as string)}
|
|
108
|
+
placeholder="Search..."
|
|
109
|
+
/>
|
|
110
|
+
</div>
|
|
111
|
+
)
|
|
112
|
+
},
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export const Creatable: Story = {
|
|
116
|
+
render: function CreatableDemo() {
|
|
117
|
+
const [value, setValue] = React.useState<string | undefined>()
|
|
118
|
+
|
|
119
|
+
return (
|
|
120
|
+
<div className="w-[300px]">
|
|
121
|
+
<WakaCombobox
|
|
122
|
+
options={frameworks}
|
|
123
|
+
value={value}
|
|
124
|
+
onChange={(v) => setValue(v as string)}
|
|
125
|
+
creatable
|
|
126
|
+
createLabel="Add"
|
|
127
|
+
placeholder="Select or create..."
|
|
128
|
+
/>
|
|
129
|
+
</div>
|
|
130
|
+
)
|
|
131
|
+
},
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export const AsyncSearch: Story = {
|
|
135
|
+
render: function AsyncDemo() {
|
|
136
|
+
const [value, setValue] = React.useState<string | undefined>()
|
|
137
|
+
const [loading, setLoading] = React.useState(false)
|
|
138
|
+
|
|
139
|
+
const searchFn = async (query: string): Promise<ComboboxOption[]> => {
|
|
140
|
+
setLoading(true)
|
|
141
|
+
await new Promise((resolve) => setTimeout(resolve, 500))
|
|
142
|
+
setLoading(false)
|
|
143
|
+
return frameworks.filter((f) =>
|
|
144
|
+
f.label.toLowerCase().includes(query.toLowerCase())
|
|
145
|
+
)
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return (
|
|
149
|
+
<div className="w-[300px]">
|
|
150
|
+
<WakaCombobox
|
|
151
|
+
options={frameworks}
|
|
152
|
+
value={value}
|
|
153
|
+
onChange={(v) => setValue(v as string)}
|
|
154
|
+
onSearch={searchFn}
|
|
155
|
+
loading={loading}
|
|
156
|
+
placeholder="Search frameworks..."
|
|
157
|
+
/>
|
|
158
|
+
</div>
|
|
159
|
+
)
|
|
160
|
+
},
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export const WithMaxSelections: Story = {
|
|
164
|
+
render: function MaxSelectionsDemo() {
|
|
165
|
+
const [value, setValue] = React.useState<string[]>([])
|
|
166
|
+
|
|
167
|
+
return (
|
|
168
|
+
<div className="w-[300px]">
|
|
169
|
+
<WakaCombobox
|
|
170
|
+
options={frameworks}
|
|
171
|
+
value={value}
|
|
172
|
+
onChange={(v) => setValue((v as string[]) || [])}
|
|
173
|
+
multiple
|
|
174
|
+
maxSelections={3}
|
|
175
|
+
placeholder="Select up to 3..."
|
|
176
|
+
/>
|
|
177
|
+
<p className="text-xs text-muted-foreground mt-2">
|
|
178
|
+
Selected: {value.length}/3
|
|
179
|
+
</p>
|
|
180
|
+
</div>
|
|
181
|
+
)
|
|
182
|
+
},
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export const Sizes: Story = {
|
|
186
|
+
render: function SizesDemo() {
|
|
187
|
+
const [value, setValue] = React.useState<string | undefined>()
|
|
188
|
+
|
|
189
|
+
return (
|
|
190
|
+
<div className="space-y-4 w-[300px]">
|
|
191
|
+
<div>
|
|
192
|
+
<p className="text-sm text-muted-foreground mb-1">Small</p>
|
|
193
|
+
<WakaCombobox
|
|
194
|
+
options={frameworks}
|
|
195
|
+
value={value}
|
|
196
|
+
onChange={(v) => setValue(v as string)}
|
|
197
|
+
size="sm"
|
|
198
|
+
placeholder="Select..."
|
|
199
|
+
/>
|
|
200
|
+
</div>
|
|
201
|
+
<div>
|
|
202
|
+
<p className="text-sm text-muted-foreground mb-1">Medium</p>
|
|
203
|
+
<WakaCombobox
|
|
204
|
+
options={frameworks}
|
|
205
|
+
value={value}
|
|
206
|
+
onChange={(v) => setValue(v as string)}
|
|
207
|
+
size="md"
|
|
208
|
+
placeholder="Select..."
|
|
209
|
+
/>
|
|
210
|
+
</div>
|
|
211
|
+
<div>
|
|
212
|
+
<p className="text-sm text-muted-foreground mb-1">Large</p>
|
|
213
|
+
<WakaCombobox
|
|
214
|
+
options={frameworks}
|
|
215
|
+
value={value}
|
|
216
|
+
onChange={(v) => setValue(v as string)}
|
|
217
|
+
size="lg"
|
|
218
|
+
placeholder="Select..."
|
|
219
|
+
/>
|
|
220
|
+
</div>
|
|
221
|
+
</div>
|
|
222
|
+
)
|
|
223
|
+
},
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export const WithError: Story = {
|
|
227
|
+
render: () => (
|
|
228
|
+
<div className="w-[300px]">
|
|
229
|
+
<WakaCombobox
|
|
230
|
+
options={frameworks}
|
|
231
|
+
error
|
|
232
|
+
placeholder="Required field..."
|
|
233
|
+
/>
|
|
234
|
+
<p className="text-sm text-destructive mt-1">This field is required</p>
|
|
235
|
+
</div>
|
|
236
|
+
),
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
export const Disabled: Story = {
|
|
240
|
+
render: () => (
|
|
241
|
+
<div className="w-[300px]">
|
|
242
|
+
<WakaCombobox
|
|
243
|
+
options={frameworks}
|
|
244
|
+
value="nextjs"
|
|
245
|
+
disabled
|
|
246
|
+
placeholder="Disabled..."
|
|
247
|
+
/>
|
|
248
|
+
</div>
|
|
249
|
+
),
|
|
250
|
+
}
|