@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.
Files changed (194) hide show
  1. package/dist/blocks/dashboard/index.d.ts +4 -1
  2. package/dist/blocks/empty-states/index.d.ts +4 -1
  3. package/dist/blocks/error-pages/index.d.ts +4 -1
  4. package/dist/blocks/index.d.ts +1 -1
  5. package/dist/blocks/landing/index.d.ts +4 -1
  6. package/dist/blocks/pricing/index.d.ts +5 -1
  7. package/dist/blocks/sidebar/index.d.ts +5 -1
  8. package/dist/index.cjs.js +130 -130
  9. package/dist/index.d.ts +1 -0
  10. package/dist/index.es.js +7905 -7856
  11. package/dist/stories/Button.d.ts +14 -0
  12. package/dist/stories/Button.stories.d.ts +8 -0
  13. package/dist/stories/Header.d.ts +11 -0
  14. package/dist/stories/Header.stories.d.ts +6 -0
  15. package/dist/stories/Page.d.ts +2 -0
  16. package/dist/stories/Page.stories.d.ts +6 -0
  17. package/dist/types/index.d.ts +1 -0
  18. package/dist/types/link.d.ts +23 -0
  19. package/package.json +11 -3
  20. package/src/blocks/activity-timeline/ActivityTimeline.stories.tsx +460 -0
  21. package/src/blocks/apm-overview/APMOverview.stories.tsx +435 -0
  22. package/src/blocks/auth-2fa/Auth2FA.stories.tsx +308 -0
  23. package/src/blocks/calendar-view/CalendarView.stories.tsx +398 -0
  24. package/src/blocks/chat/Chat.stories.tsx +466 -0
  25. package/src/blocks/chat-interface/ChatInterface.stories.tsx +412 -0
  26. package/src/blocks/checkout-flow/CheckoutFlow.stories.tsx +408 -0
  27. package/src/blocks/cicd-builder/CICDBuilder.stories.tsx +499 -0
  28. package/src/blocks/cloud-cost-dashboard/CloudCostDashboard.stories.tsx +356 -0
  29. package/src/blocks/container-orchestrator/ContainerOrchestrator.stories.tsx +461 -0
  30. package/src/blocks/dashboard/Dashboard.stories.tsx +559 -0
  31. package/src/blocks/dashboard/index.tsx +68 -27
  32. package/src/blocks/dashboard-kpi/DashboardKPI.stories.tsx +422 -0
  33. package/src/blocks/database-admin/DatabaseAdmin.stories.tsx +393 -0
  34. package/src/blocks/deployment-dashboard/DeploymentDashboard.stories.tsx +457 -0
  35. package/src/blocks/empty-states/EmptyStates.stories.tsx +467 -0
  36. package/src/blocks/empty-states/index.tsx +26 -8
  37. package/src/blocks/error-pages/ErrorPages.stories.tsx +401 -0
  38. package/src/blocks/error-pages/index.tsx +26 -8
  39. package/src/blocks/faq/FAQ.stories.tsx +416 -0
  40. package/src/blocks/file-manager/FileManager.stories.tsx +413 -0
  41. package/src/blocks/footer/Footer.stories.tsx +328 -0
  42. package/src/blocks/gitops-sync-status/GitOpsSyncStatus.stories.tsx +529 -0
  43. package/src/blocks/header/WakaHeader.stories.tsx +455 -0
  44. package/src/blocks/headtab/Headtab.stories.tsx +369 -0
  45. package/src/blocks/i18n-editor/I18nEditor.stories.tsx +451 -0
  46. package/src/blocks/incident-manager/IncidentManager.stories.tsx +464 -0
  47. package/src/blocks/index.ts +1 -1
  48. package/src/blocks/infrastructure-map/InfrastructureMap.stories.tsx +533 -0
  49. package/src/blocks/kanban-board/KanbanBoard.stories.tsx +494 -0
  50. package/src/blocks/landing/WakaLanding.stories.tsx +449 -0
  51. package/src/blocks/landing/index.tsx +125 -66
  52. package/src/blocks/language-selector/LanguageSelector.stories.tsx +345 -0
  53. package/src/blocks/layout/Layout.stories.tsx +373 -0
  54. package/src/blocks/login/Login.stories.tsx +443 -0
  55. package/src/blocks/on-call-schedule/OnCallSchedule.stories.tsx +381 -0
  56. package/src/blocks/player-profile/PlayerProfile.stories.tsx +316 -0
  57. package/src/blocks/pricing/WakaPricing.stories.tsx +530 -0
  58. package/src/blocks/pricing/index.tsx +38 -4
  59. package/src/blocks/profile/Profile.stories.tsx +371 -0
  60. package/src/blocks/release-notes/ReleaseNotes.stories.tsx +431 -0
  61. package/src/blocks/settings/Settings.stories.tsx +520 -0
  62. package/src/blocks/sidebar/WakaSidebar.stories.tsx +513 -0
  63. package/src/blocks/sidebar/index.tsx +49 -20
  64. package/src/blocks/theme-creator-block/ThemeCreatorBlock.stories.tsx +370 -0
  65. package/src/blocks/user-management/UserManagement.stories.tsx +411 -0
  66. package/src/blocks/wizard/Wizard.stories.tsx +683 -0
  67. package/src/components/accordion/Accordion.stories.tsx +93 -0
  68. package/src/components/alert/Alert.stories.tsx +95 -0
  69. package/src/components/alert-dialog/AlertDialog.stories.tsx +126 -0
  70. package/src/components/aspect-ratio/AspectRatio.stories.tsx +118 -0
  71. package/src/components/avatar/Avatar.stories.tsx +104 -0
  72. package/src/components/button/Button.stories.tsx +12 -1
  73. package/src/components/calendar/Calendar.stories.tsx +102 -0
  74. package/src/components/card/Card.stories.tsx +125 -0
  75. package/src/components/checkbox/Checkbox.stories.tsx +100 -0
  76. package/src/components/code/Code.stories.tsx +402 -0
  77. package/src/components/collapsible/Collapsible.stories.tsx +123 -0
  78. package/src/components/command/Command.stories.tsx +207 -0
  79. package/src/components/context-menu/ContextMenu.stories.tsx +220 -0
  80. package/src/components/dialog/Dialog.stories.tsx +157 -0
  81. package/src/components/dropdown-menu/DropdownMenu.stories.tsx +225 -0
  82. package/src/components/form/Form.stories.tsx +413 -0
  83. package/src/components/hover-card/HoverCard.stories.tsx +148 -0
  84. package/src/components/input-otp/InputOTP.stories.tsx +255 -0
  85. package/src/components/label/Label.stories.tsx +68 -0
  86. package/src/components/menubar/Menubar.stories.tsx +278 -0
  87. package/src/components/navigation-menu/NavigationMenu.stories.tsx +202 -0
  88. package/src/components/popover/Popover.stories.tsx +199 -0
  89. package/src/components/progress/Progress.stories.tsx +104 -0
  90. package/src/components/radio-group/RadioGroup.stories.tsx +138 -0
  91. package/src/components/scroll-area/ScrollArea.stories.tsx +153 -0
  92. package/src/components/select/Select.stories.tsx +146 -0
  93. package/src/components/separator/Separator.stories.tsx +117 -0
  94. package/src/components/sheet/Sheet.stories.tsx +195 -0
  95. package/src/components/skeleton/Skeleton.stories.tsx +114 -0
  96. package/src/components/slider/Slider.stories.tsx +157 -0
  97. package/src/components/switch/Switch.stories.tsx +114 -0
  98. package/src/components/table/Table.stories.tsx +153 -0
  99. package/src/components/tabs/Tabs.stories.tsx +155 -0
  100. package/src/components/textarea/Textarea.stories.tsx +116 -0
  101. package/src/components/toast/Toast.stories.tsx +160 -0
  102. package/src/components/toggle/Toggle.stories.tsx +125 -0
  103. package/src/components/tooltip/Tooltip.stories.tsx +133 -0
  104. package/src/components/typography/Typography.stories.tsx +207 -0
  105. package/src/components/waka-3d-pie-chart/Waka3DPieChart.stories.tsx +308 -0
  106. package/src/components/waka-achievement-unlock/WakaAchievementUnlock.stories.tsx +353 -0
  107. package/src/components/waka-artifact-list/WakaArtifactList.stories.tsx +258 -0
  108. package/src/components/waka-autocomplete/WakaAutocomplete.stories.tsx +224 -0
  109. package/src/components/waka-badge-showcase/WakaBadgeShowcase.stories.tsx +269 -0
  110. package/src/components/waka-barcode/WakaBarcode.stories.tsx +227 -0
  111. package/src/components/waka-bottom-sheet/WakaBottomSheet.stories.tsx +408 -0
  112. package/src/components/waka-breadcrumb/WakaBreadcrumb.stories.tsx +237 -0
  113. package/src/components/waka-build-matrix/WakaBuildMatrix.stories.tsx +328 -0
  114. package/src/components/waka-carousel/WakaCarousel.stories.tsx +296 -0
  115. package/src/components/waka-charts/WakaCharts.stories.tsx +519 -0
  116. package/src/components/waka-color-picker/WakaColorPicker.stories.tsx +200 -0
  117. package/src/components/waka-combobox/WakaCombobox.stories.tsx +250 -0
  118. package/src/components/waka-container-list/WakaContainerList.stories.tsx +315 -0
  119. package/src/components/waka-contribution-graph/WakaContributionGraph.stories.tsx +354 -0
  120. package/src/components/waka-cost-breakdown/WakaCostBreakdown.stories.tsx +348 -0
  121. package/src/components/waka-daily-reward/WakaDailyReward.stories.tsx +365 -0
  122. package/src/components/waka-database-card/WakaDatabaseCard.stories.tsx +306 -0
  123. package/src/components/waka-date-range-picker/WakaDateRangePicker.stories.tsx +339 -0
  124. package/src/components/waka-datetime-picker/WakaDateTimePicker.stories.tsx +317 -0
  125. package/src/components/waka-deployment-lane/WakaDeploymentLane.stories.tsx +292 -0
  126. package/src/components/waka-dock/WakaDock.stories.tsx +332 -0
  127. package/src/components/waka-drawer/WakaDrawer.stories.tsx +437 -0
  128. package/src/components/waka-env-var-editor/WakaEnvVarEditor.stories.tsx +263 -0
  129. package/src/components/waka-error-shake/WakaErrorShake.stories.tsx +410 -0
  130. package/src/components/waka-file-upload/WakaFileUpload.stories.tsx +239 -0
  131. package/src/components/waka-flow-diagram/WakaFlowDiagram.stories.tsx +365 -0
  132. package/src/components/waka-funnel-chart/WakaFunnelChart.stories.tsx +281 -0
  133. package/src/components/waka-glow-card/WakaGlowCard.stories.tsx +274 -0
  134. package/src/components/waka-haptic-button/WakaHapticButton.stories.tsx +349 -0
  135. package/src/components/waka-health-pulse/WakaHealthPulse.stories.tsx +293 -0
  136. package/src/components/waka-heatmap/WakaHeatmap.stories.tsx +376 -0
  137. package/src/components/waka-image/WakaImage.stories.tsx +255 -0
  138. package/src/components/waka-incident-timeline/WakaIncidentTimeline.stories.tsx +300 -0
  139. package/src/components/waka-kanban/WakaKanban.stories.tsx +399 -0
  140. package/src/components/waka-kubernetes-overview/WakaKubernetesOverview.stories.tsx +281 -0
  141. package/src/components/waka-leaderboard/WakaLeaderboard.stories.tsx +300 -0
  142. package/src/components/waka-level-progress/WakaLevelProgress.stories.tsx +313 -0
  143. package/src/components/waka-loading-orbit/WakaLoadingOrbit.stories.tsx +413 -0
  144. package/src/components/waka-log-viewer/WakaLogViewer.stories.tsx +312 -0
  145. package/src/components/waka-loot-box/WakaLootBox.stories.tsx +374 -0
  146. package/src/components/waka-metric-sparkline/WakaMetricSparkline.stories.tsx +312 -0
  147. package/src/components/waka-migration-list/WakaMigrationList.stories.tsx +289 -0
  148. package/src/components/waka-modal/WakaModal.stories.tsx +434 -0
  149. package/src/components/waka-morph-button/WakaMorphButton.stories.tsx +405 -0
  150. package/src/components/waka-network-topology/WakaNetworkTopology.stories.tsx +364 -0
  151. package/src/components/waka-notifications/WakaNotifications.stories.tsx +290 -0
  152. package/src/components/waka-number-input/WakaNumberInput.stories.tsx +282 -0
  153. package/src/components/waka-pagination/WakaPagination.stories.tsx +328 -0
  154. package/src/components/waka-password-strength/WakaPasswordStrength.stories.tsx +318 -0
  155. package/src/components/waka-pipeline-view/WakaPipelineView.stories.tsx +386 -0
  156. package/src/components/waka-player-card/WakaPlayerCard.stories.tsx +333 -0
  157. package/src/components/waka-pod-card/WakaPodCard.stories.tsx +435 -0
  158. package/src/components/waka-qrcode/WakaQRCode.stories.tsx +232 -0
  159. package/src/components/waka-query-explain/WakaQueryExplain.stories.tsx +407 -0
  160. package/src/components/waka-quest-card/WakaQuestCard.stories.tsx +394 -0
  161. package/src/components/waka-quota-bar/WakaQuotaBar.stories.tsx +435 -0
  162. package/src/components/waka-radar-score/WakaRadarScore.stories.tsx +372 -0
  163. package/src/components/waka-resource-gauge/WakaResourceGauge.stories.tsx +366 -0
  164. package/src/components/waka-rich-text-editor/WakaRichTextEditor.stories.tsx +238 -0
  165. package/src/components/waka-sankey-diagram/WakaSankeyDiagram.stories.tsx +389 -0
  166. package/src/components/waka-scratch-card/WakaScratchCard.stories.tsx +388 -0
  167. package/src/components/waka-secret-card/WakaSecretCard.stories.tsx +314 -0
  168. package/src/components/waka-segmented-control/WakaSegmentedControl.stories.tsx +309 -0
  169. package/src/components/waka-server-rack/WakaServerRack.stories.tsx +382 -0
  170. package/src/components/waka-service-graph/WakaServiceGraph.stories.tsx +262 -0
  171. package/src/components/waka-skeleton-wave/WakaSkeletonWave.stories.tsx +321 -0
  172. package/src/components/waka-skill-tree/WakaSkillTree.stories.tsx +308 -0
  173. package/src/components/waka-spin-wheel/WakaSpinWheel.stories.tsx +368 -0
  174. package/src/components/waka-spinner/WakaSpinner.stories.tsx +156 -0
  175. package/src/components/waka-stat/WakaStat.stories.tsx +334 -0
  176. package/src/components/waka-status-matrix/WakaStatusMatrix.stories.tsx +331 -0
  177. package/src/components/waka-stepper/WakaStepper.stories.tsx +468 -0
  178. package/src/components/waka-streak-counter/WakaStreakCounter.stories.tsx +235 -0
  179. package/src/components/waka-success-explosion/WakaSuccessExplosion.stories.tsx +389 -0
  180. package/src/components/waka-tabs-morph/WakaTabsMorph.stories.tsx +471 -0
  181. package/src/components/waka-terminal-output/WakaTerminalOutput.stories.tsx +351 -0
  182. package/src/components/waka-test-report/WakaTestReport.stories.tsx +322 -0
  183. package/src/components/waka-tilt-card/WakaTiltCard.stories.tsx +300 -0
  184. package/src/components/waka-time-picker/WakaTimePicker.stories.tsx +227 -0
  185. package/src/components/waka-timeline/WakaTimeline.stories.tsx +383 -0
  186. package/src/components/waka-tournament-bracket/WakaTournamentBracket.stories.tsx +375 -0
  187. package/src/components/waka-trace-viewer/WakaTraceViewer.stories.tsx +445 -0
  188. package/src/components/waka-tree/WakaTree.stories.tsx +359 -0
  189. package/src/components/waka-treemap-chart/WakaTreemapChart.stories.tsx +378 -0
  190. package/src/components/waka-typewriter/WakaTypewriter.stories.tsx +366 -0
  191. package/src/components/waka-versus-card/WakaVersusCard.stories.tsx +530 -0
  192. package/src/components/waka-video/WakaVideo.stories.tsx +203 -0
  193. package/src/components/waka-virtual-list/WakaVirtualList.stories.tsx +273 -0
  194. package/src/components/waka-xp-bar/WakaXPBar.stories.tsx +305 -0
@@ -0,0 +1,435 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import { WakaQuotaBar, WakaMultiQuotaBar, useQuota } from './index'
3
+ import type { QuotaResource } from './index'
4
+ import * as React from 'react'
5
+
6
+ const meta: Meta<typeof WakaQuotaBar> = {
7
+ title: 'Components/Charts/WakaQuotaBar',
8
+ component: WakaQuotaBar,
9
+ parameters: {
10
+ layout: 'centered',
11
+ docs: {
12
+ description: {
13
+ component: 'A quota/usage bar for displaying resource consumption with soft/hard limits, overflow indicators, and animated progress.',
14
+ },
15
+ },
16
+ },
17
+ tags: ['autodocs'],
18
+ argTypes: {
19
+ current: {
20
+ control: { type: 'range', min: 0, max: 150, step: 5 },
21
+ description: 'Current usage value',
22
+ },
23
+ softLimit: {
24
+ control: { type: 'range', min: 50, max: 90, step: 5 },
25
+ description: 'Soft limit threshold',
26
+ },
27
+ hardLimit: {
28
+ control: { type: 'range', min: 80, max: 150, step: 10 },
29
+ description: 'Hard limit (maximum)',
30
+ },
31
+ size: {
32
+ control: 'select',
33
+ options: ['sm', 'md', 'lg'],
34
+ description: 'Bar size',
35
+ },
36
+ variant: {
37
+ control: 'select',
38
+ options: ['simple', 'detailed'],
39
+ description: 'Display variant',
40
+ },
41
+ showLabels: {
42
+ control: 'boolean',
43
+ description: 'Show value labels',
44
+ },
45
+ showMarkers: {
46
+ control: 'boolean',
47
+ description: 'Show limit markers',
48
+ },
49
+ animated: {
50
+ control: 'boolean',
51
+ description: 'Enable animations',
52
+ },
53
+ },
54
+ }
55
+
56
+ export default meta
57
+ type Story = StoryObj<typeof WakaQuotaBar>
58
+
59
+ export const Default: Story = {
60
+ args: {
61
+ current: 65,
62
+ softLimit: 80,
63
+ hardLimit: 100,
64
+ label: 'Storage',
65
+ unit: 'GB',
66
+ },
67
+ render: (args) => (
68
+ <div className="w-[500px]">
69
+ <WakaQuotaBar {...args} />
70
+ </div>
71
+ ),
72
+ }
73
+
74
+ export const UsageZones: Story = {
75
+ render: () => (
76
+ <div className="w-[500px] space-y-6">
77
+ <div>
78
+ <p className="text-sm text-muted-foreground mb-2">Normal usage (below soft limit)</p>
79
+ <WakaQuotaBar
80
+ current={45}
81
+ softLimit={70}
82
+ hardLimit={100}
83
+ label="Storage"
84
+ unit="GB"
85
+ />
86
+ </div>
87
+ <div>
88
+ <p className="text-sm text-muted-foreground mb-2">Warning zone (approaching soft limit)</p>
89
+ <WakaQuotaBar
90
+ current={75}
91
+ softLimit={70}
92
+ hardLimit={100}
93
+ label="Storage"
94
+ unit="GB"
95
+ />
96
+ </div>
97
+ <div>
98
+ <p className="text-sm text-muted-foreground mb-2">Danger zone (approaching hard limit)</p>
99
+ <WakaQuotaBar
100
+ current={92}
101
+ softLimit={70}
102
+ hardLimit={100}
103
+ label="Storage"
104
+ unit="GB"
105
+ />
106
+ </div>
107
+ <div>
108
+ <p className="text-sm text-muted-foreground mb-2">Overflow (exceeded hard limit)</p>
109
+ <WakaQuotaBar
110
+ current={115}
111
+ softLimit={70}
112
+ hardLimit={100}
113
+ label="Storage"
114
+ unit="GB"
115
+ />
116
+ </div>
117
+ </div>
118
+ ),
119
+ }
120
+
121
+ export const Variants: Story = {
122
+ render: () => (
123
+ <div className="w-[500px] space-y-8">
124
+ <div>
125
+ <p className="text-sm text-muted-foreground mb-2">Simple Variant</p>
126
+ <WakaQuotaBar
127
+ current={72}
128
+ softLimit={70}
129
+ hardLimit={100}
130
+ label="API Calls"
131
+ unit="K"
132
+ variant="simple"
133
+ />
134
+ </div>
135
+ <div>
136
+ <p className="text-sm text-muted-foreground mb-2">Detailed Variant</p>
137
+ <WakaQuotaBar
138
+ current={72}
139
+ softLimit={70}
140
+ hardLimit={100}
141
+ label="API Calls"
142
+ unit="K"
143
+ variant="detailed"
144
+ />
145
+ </div>
146
+ </div>
147
+ ),
148
+ }
149
+
150
+ export const Sizes: Story = {
151
+ render: () => (
152
+ <div className="w-[500px] space-y-6">
153
+ <div>
154
+ <p className="text-sm text-muted-foreground mb-2">Small</p>
155
+ <WakaQuotaBar
156
+ current={65}
157
+ softLimit={70}
158
+ hardLimit={100}
159
+ size="sm"
160
+ />
161
+ </div>
162
+ <div>
163
+ <p className="text-sm text-muted-foreground mb-2">Medium (Default)</p>
164
+ <WakaQuotaBar
165
+ current={65}
166
+ softLimit={70}
167
+ hardLimit={100}
168
+ size="md"
169
+ />
170
+ </div>
171
+ <div>
172
+ <p className="text-sm text-muted-foreground mb-2">Large</p>
173
+ <WakaQuotaBar
174
+ current={65}
175
+ softLimit={70}
176
+ hardLimit={100}
177
+ size="lg"
178
+ />
179
+ </div>
180
+ </div>
181
+ ),
182
+ }
183
+
184
+ export const WithoutSoftLimit: Story = {
185
+ render: () => (
186
+ <div className="w-[500px]">
187
+ <WakaQuotaBar
188
+ current={75}
189
+ hardLimit={100}
190
+ label="Bandwidth"
191
+ unit="GB"
192
+ />
193
+ </div>
194
+ ),
195
+ }
196
+
197
+ export const NoMarkers: Story = {
198
+ render: () => (
199
+ <div className="w-[500px]">
200
+ <WakaQuotaBar
201
+ current={65}
202
+ softLimit={70}
203
+ hardLimit={100}
204
+ label="Storage"
205
+ unit="GB"
206
+ showMarkers={false}
207
+ />
208
+ </div>
209
+ ),
210
+ }
211
+
212
+ export const NoLabels: Story = {
213
+ render: () => (
214
+ <div className="w-[500px]">
215
+ <WakaQuotaBar
216
+ current={65}
217
+ softLimit={70}
218
+ hardLimit={100}
219
+ label="Storage"
220
+ showLabels={false}
221
+ />
222
+ </div>
223
+ ),
224
+ }
225
+
226
+ export const CustomFormatter: Story = {
227
+ render: () => (
228
+ <div className="w-[500px]">
229
+ <WakaQuotaBar
230
+ current={1536}
231
+ softLimit={2048}
232
+ hardLimit={3072}
233
+ label="Memory"
234
+ unit="MB"
235
+ formatValue={(value) => {
236
+ if (value >= 1024) {
237
+ return `${(value / 1024).toFixed(1)} GB`
238
+ }
239
+ return `${value} MB`
240
+ }}
241
+ />
242
+ </div>
243
+ ),
244
+ }
245
+
246
+ export const MultipleQuotas: Story = {
247
+ render: () => {
248
+ const resources: QuotaResource[] = [
249
+ { id: 'storage', label: 'Storage', current: 65, softLimit: 70, hardLimit: 100, unit: 'GB' },
250
+ { id: 'bandwidth', label: 'Bandwidth', current: 450, softLimit: 400, hardLimit: 500, unit: 'GB' },
251
+ { id: 'api', label: 'API Calls', current: 8500, softLimit: 8000, hardLimit: 10000 },
252
+ { id: 'users', label: 'Team Members', current: 8, hardLimit: 10 },
253
+ ]
254
+
255
+ return (
256
+ <div className="w-[600px]">
257
+ <WakaMultiQuotaBar resources={resources} />
258
+ </div>
259
+ )
260
+ },
261
+ }
262
+
263
+ export const CompactMultiQuota: Story = {
264
+ render: () => {
265
+ const resources: QuotaResource[] = [
266
+ { id: 'storage', label: 'Storage', current: 65, softLimit: 70, hardLimit: 100, unit: 'GB' },
267
+ { id: 'bandwidth', label: 'Bandwidth', current: 450, hardLimit: 500, unit: 'GB' },
268
+ { id: 'api', label: 'API Calls', current: 8500, hardLimit: 10000 },
269
+ ]
270
+
271
+ return (
272
+ <div className="w-[400px]">
273
+ <WakaMultiQuotaBar resources={resources} compact />
274
+ </div>
275
+ )
276
+ },
277
+ }
278
+
279
+ export const WithHook: Story = {
280
+ render: () => {
281
+ const {
282
+ current,
283
+ usagePercentage,
284
+ remaining,
285
+ zone,
286
+ isOverflow,
287
+ add,
288
+ subtract,
289
+ reset,
290
+ } = useQuota({
291
+ initialValue: 50,
292
+ softLimit: 70,
293
+ hardLimit: 100,
294
+ onApproachingSoftLimit: (v) => console.log('Approaching soft limit:', v),
295
+ onApproachingHardLimit: (v) => console.log('Approaching hard limit:', v),
296
+ onOverflow: (v, o) => console.log('Overflow:', v, 'by', o),
297
+ })
298
+
299
+ return (
300
+ <div className="w-[500px] space-y-4">
301
+ <div className="flex gap-2 justify-center">
302
+ <button
303
+ onClick={() => subtract(10)}
304
+ className="px-3 py-1 text-sm border rounded hover:bg-muted"
305
+ >
306
+ -10
307
+ </button>
308
+ <button
309
+ onClick={() => add(10)}
310
+ className="px-3 py-1 text-sm border rounded hover:bg-muted"
311
+ >
312
+ +10
313
+ </button>
314
+ <button
315
+ onClick={reset}
316
+ className="px-3 py-1 text-sm border rounded hover:bg-muted"
317
+ >
318
+ Reset
319
+ </button>
320
+ </div>
321
+ <WakaQuotaBar
322
+ current={current}
323
+ softLimit={70}
324
+ hardLimit={100}
325
+ label="Interactive"
326
+ unit="units"
327
+ />
328
+ <div className="grid grid-cols-4 gap-4 text-center text-sm">
329
+ <div className="p-2 border rounded">
330
+ <p className="font-medium">{current}</p>
331
+ <p className="text-xs text-muted-foreground">Current</p>
332
+ </div>
333
+ <div className="p-2 border rounded">
334
+ <p className="font-medium">{usagePercentage.toFixed(1)}%</p>
335
+ <p className="text-xs text-muted-foreground">Usage</p>
336
+ </div>
337
+ <div className="p-2 border rounded">
338
+ <p className="font-medium">{remaining}</p>
339
+ <p className="text-xs text-muted-foreground">Remaining</p>
340
+ </div>
341
+ <div className="p-2 border rounded">
342
+ <p className={`font-medium ${zone === 'overflow' ? 'text-red-600' : zone === 'danger' ? 'text-orange-600' : zone === 'warning' ? 'text-yellow-600' : 'text-green-600'}`}>
343
+ {zone}
344
+ </p>
345
+ <p className="text-xs text-muted-foreground">Zone</p>
346
+ </div>
347
+ </div>
348
+ </div>
349
+ )
350
+ },
351
+ }
352
+
353
+ export const PlanUsageDashboard: Story = {
354
+ render: () => {
355
+ const resources: QuotaResource[] = [
356
+ { id: 'storage', label: 'Storage', current: 8.2, softLimit: 8, hardLimit: 10, unit: 'GB' },
357
+ { id: 'bandwidth', label: 'Bandwidth', current: 45, softLimit: 40, hardLimit: 50, unit: 'GB/mo' },
358
+ { id: 'api', label: 'API Calls', current: 85000, softLimit: 80000, hardLimit: 100000 },
359
+ { id: 'projects', label: 'Projects', current: 5, hardLimit: 5 },
360
+ ]
361
+
362
+ return (
363
+ <div className="w-[650px] p-6 border rounded-lg">
364
+ <div className="flex justify-between items-start mb-6">
365
+ <div>
366
+ <h3 className="text-lg font-semibold">Plan Usage</h3>
367
+ <p className="text-sm text-muted-foreground">Pro Plan • Billing cycle ends in 12 days</p>
368
+ </div>
369
+ <button className="px-3 py-1 text-sm border rounded hover:bg-muted">
370
+ Upgrade Plan
371
+ </button>
372
+ </div>
373
+ <WakaMultiQuotaBar resources={resources} />
374
+ </div>
375
+ )
376
+ },
377
+ }
378
+
379
+ export const ServerResourceDashboard: Story = {
380
+ render: () => (
381
+ <div className="w-[550px] p-6 border rounded-lg">
382
+ <div className="flex justify-between items-start mb-4">
383
+ <div>
384
+ <h3 className="text-lg font-semibold">Server Resources</h3>
385
+ <p className="text-sm text-muted-foreground">web-prod-01.example.com</p>
386
+ </div>
387
+ <div className="flex items-center gap-2">
388
+ <div className="w-2 h-2 rounded-full bg-yellow-500" />
389
+ <span className="text-sm text-yellow-600">Warning</span>
390
+ </div>
391
+ </div>
392
+ <div className="space-y-4">
393
+ <WakaQuotaBar
394
+ current={78}
395
+ softLimit={70}
396
+ hardLimit={100}
397
+ label="CPU Usage"
398
+ unit="%"
399
+ variant="detailed"
400
+ />
401
+ <WakaQuotaBar
402
+ current={12.8}
403
+ softLimit={12}
404
+ hardLimit={16}
405
+ label="Memory"
406
+ unit="GB"
407
+ variant="detailed"
408
+ />
409
+ <WakaQuotaBar
410
+ current={420}
411
+ softLimit={400}
412
+ hardLimit={500}
413
+ label="Disk"
414
+ unit="GB"
415
+ variant="detailed"
416
+ />
417
+ </div>
418
+ </div>
419
+ ),
420
+ }
421
+
422
+ export const NoAnimation: Story = {
423
+ render: () => (
424
+ <div className="w-[500px]">
425
+ <WakaQuotaBar
426
+ current={65}
427
+ softLimit={70}
428
+ hardLimit={100}
429
+ label="Storage"
430
+ unit="GB"
431
+ animated={false}
432
+ />
433
+ </div>
434
+ ),
435
+ }