siesa-ui-kit 1.0.2 → 1.0.4

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 (189) hide show
  1. package/README.md +115 -115
  2. package/bin/install.cjs +502 -502
  3. package/bin/prepare-publish.cjs +28 -28
  4. package/bin/restore-folders.cjs +28 -28
  5. package/claude/agents/siesa-ui-kit-specialist.md +2445 -0
  6. package/claude/prompts/component-template.md +121 -0
  7. package/claude/prompts/siesa-ui-kit.md +28 -0
  8. package/claude/settings.local.json +67 -2
  9. package/dist/components/Button/icons.d.ts +6 -5
  10. package/dist/components/Button/icons.d.ts.map +1 -1
  11. package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.d.ts.map +1 -1
  12. package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.types.d.ts +21 -0
  13. package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.types.d.ts.map +1 -1
  14. package/dist/components/NavigationRailCommercial/NavigationRailCommercial.d.ts +122 -0
  15. package/dist/components/NavigationRailCommercial/NavigationRailCommercial.d.ts.map +1 -0
  16. package/dist/components/NavigationRailCommercial/NavigationRailCommercial.types.d.ts +139 -0
  17. package/dist/components/NavigationRailCommercial/NavigationRailCommercial.types.d.ts.map +1 -0
  18. package/dist/components/NavigationRailCommercial/icons.d.ts +33 -0
  19. package/dist/components/NavigationRailCommercial/icons.d.ts.map +1 -0
  20. package/dist/components/NavigationRailCommercial/index.d.ts +4 -0
  21. package/dist/components/NavigationRailCommercial/index.d.ts.map +1 -0
  22. package/dist/components/NavigationRailItem/NavigationRailItem.d.ts.map +1 -1
  23. package/dist/components/NavigationRailItem/NavigationRailItem.types.d.ts +7 -0
  24. package/dist/components/NavigationRailItem/NavigationRailItem.types.d.ts.map +1 -1
  25. package/dist/components/NavigationRailTypes/NavigationRailTypes.d.ts.map +1 -1
  26. package/dist/components/NavigationRailTypes/NavigationRailTypes.types.d.ts +41 -0
  27. package/dist/components/NavigationRailTypes/NavigationRailTypes.types.d.ts.map +1 -1
  28. package/dist/components/NavigationRailTypes/icons.d.ts +15 -29
  29. package/dist/components/NavigationRailTypes/icons.d.ts.map +1 -1
  30. package/dist/components/Select/Select.d.ts.map +1 -1
  31. package/dist/components/Select/icons.d.ts +6 -2
  32. package/dist/components/Select/icons.d.ts.map +1 -1
  33. package/dist/index.d.ts +32 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/siesa-ui-kit.cjs +404 -190
  36. package/dist/siesa-ui-kit.cjs.map +1 -1
  37. package/dist/siesa-ui-kit.mjs +6590 -1506
  38. package/dist/siesa-ui-kit.mjs.map +1 -1
  39. package/dist/views/LayoutCommercial/LayoutCommercial.d.ts +48 -0
  40. package/dist/views/LayoutCommercial/LayoutCommercial.d.ts.map +1 -0
  41. package/dist/views/LayoutCommercial/LayoutCommercial.types.d.ts +49 -0
  42. package/dist/views/LayoutCommercial/LayoutCommercial.types.d.ts.map +1 -0
  43. package/dist/views/LayoutCommercial/index.d.ts +3 -0
  44. package/dist/views/LayoutCommercial/index.d.ts.map +1 -0
  45. package/docs/icons.md +12 -31
  46. package/package.json +111 -110
  47. package/src/components/Avatar/Avatar.stories.tsx +494 -494
  48. package/src/components/Button/Button.stories.tsx +950 -950
  49. package/src/components/Button/Button.tsx +337 -337
  50. package/src/components/Button/Button.types.ts +180 -180
  51. package/src/components/Button/icons.tsx +23 -62
  52. package/src/components/DescriptionList/DescriptionList.stories.tsx +250 -250
  53. package/src/components/Divider/Divider.stories.tsx +263 -263
  54. package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.stories.tsx +317 -317
  55. package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.tsx +307 -287
  56. package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.types.ts +136 -111
  57. package/src/components/DropdownItemCollapsible/README.md +264 -264
  58. package/src/components/DropdownItemCollapsible/icons.tsx +57 -57
  59. package/src/components/DropdownItemCollapsible/index.ts +12 -12
  60. package/src/components/DropdownItemHeading/DropdownItemHeading.stories.tsx +386 -386
  61. package/src/components/DropdownItemHeading/DropdownItemHeading.tsx +216 -216
  62. package/src/components/DropdownItemHeading/DropdownItemHeading.types.ts +93 -93
  63. package/src/components/DropdownItemHeading/README.md +573 -573
  64. package/src/components/DropdownItemHeading/icons.tsx +125 -125
  65. package/src/components/DropdownItemHeading/index.ts +3 -3
  66. package/src/components/Input/Input.stories.tsx +583 -583
  67. package/src/components/LoginView/LoginView.stories.tsx +148 -148
  68. package/src/components/LoginView/LoginView.tsx +426 -426
  69. package/src/components/LoginView/LoginView.types.ts +52 -52
  70. package/src/components/LoginView/README.md +396 -396
  71. package/src/components/LoginView/icons.tsx +85 -85
  72. package/src/components/LoginView/index.ts +3 -3
  73. package/src/components/Navbar/Navbar.stories.tsx +810 -810
  74. package/src/components/Navbar/Navbar.tsx +755 -755
  75. package/src/components/Navbar/Navbar.types.ts +219 -219
  76. package/src/components/Navbar/README.md +279 -279
  77. package/src/components/Navbar/index.ts +8 -8
  78. package/src/components/NavigationRailCommercial/NavigationRailCommercial.stories.tsx +464 -0
  79. package/src/components/NavigationRailCommercial/NavigationRailCommercial.tsx +301 -0
  80. package/src/components/NavigationRailCommercial/NavigationRailCommercial.types.ts +162 -0
  81. package/src/components/NavigationRailCommercial/README.md +251 -0
  82. package/src/components/NavigationRailCommercial/icons.tsx +54 -0
  83. package/src/components/NavigationRailCommercial/index.ts +6 -0
  84. package/src/components/NavigationRailItem/NavigationRailItem.stories.tsx +667 -667
  85. package/src/components/NavigationRailItem/NavigationRailItem.tsx +314 -313
  86. package/src/components/NavigationRailItem/NavigationRailItem.types.ts +175 -167
  87. package/src/components/NavigationRailItem/README.md +476 -476
  88. package/src/components/NavigationRailItem/index.ts +2 -2
  89. package/src/components/NavigationRailPanel/NavigationRailPanel.stories.tsx +462 -462
  90. package/src/components/NavigationRailPanel/NavigationRailPanel.tsx +332 -332
  91. package/src/components/NavigationRailPanel/NavigationRailPanel.types.ts +178 -178
  92. package/src/components/NavigationRailPanel/README.md +461 -461
  93. package/src/components/NavigationRailPanel/index.ts +6 -6
  94. package/src/components/NavigationRailTypes/NavigationRailTypes.stories.tsx +682 -528
  95. package/src/components/NavigationRailTypes/NavigationRailTypes.tsx +363 -378
  96. package/src/components/NavigationRailTypes/NavigationRailTypes.types.ts +178 -130
  97. package/src/components/NavigationRailTypes/README.md +573 -573
  98. package/src/components/NavigationRailTypes/icons.tsx +76 -141
  99. package/src/components/NavigationRailTypes/index.ts +7 -7
  100. package/src/components/Notification/Notification.stories.tsx +513 -513
  101. package/src/components/Notification/Notification.tsx +145 -145
  102. package/src/components/Notification/Notification.types.ts +142 -142
  103. package/src/components/Notification/README.md +409 -409
  104. package/src/components/POSConvention/POSConvention.stories.tsx +235 -235
  105. package/src/components/POSConvention/POSConvention.tsx +129 -129
  106. package/src/components/POSConvention/POSConvention.types.ts +38 -38
  107. package/src/components/POSConvention/README.md +123 -123
  108. package/src/components/POSConvention/icons.tsx +45 -45
  109. package/src/components/POSConvention/index.ts +3 -3
  110. package/src/components/POSLocationButton/POSLocationButton.stories.tsx +531 -531
  111. package/src/components/POSLocationButton/POSLocationButton.tsx +247 -247
  112. package/src/components/POSLocationButton/POSLocationButton.types.ts +87 -87
  113. package/src/components/POSLocationButton/README.md +253 -253
  114. package/src/components/POSLocationButton/icons.tsx +120 -120
  115. package/src/components/POSLocationButton/index.ts +14 -14
  116. package/src/components/POSNumberButton/POSNumberButton.stories.tsx +415 -415
  117. package/src/components/POSNumberButton/POSNumberButton.tsx +179 -179
  118. package/src/components/POSNumberButton/POSNumberButton.types.ts +51 -51
  119. package/src/components/POSNumberButton/README.md +321 -321
  120. package/src/components/POSNumberButton/index.ts +3 -3
  121. package/src/components/POSProductButton/POSProductButton.stories.tsx +318 -318
  122. package/src/components/POSProductCard/POSProductCard.stories.tsx +642 -642
  123. package/src/components/POSProductCard/POSProductCard.tsx +208 -208
  124. package/src/components/POSProductCard/POSProductCard.types.ts +76 -76
  125. package/src/components/POSProductCard/README.md +179 -179
  126. package/src/components/POSProductCard/icons.tsx +26 -26
  127. package/src/components/POSProductCard/index.ts +2 -2
  128. package/src/components/POSProductSidebarItems/POSProductSidebarItems.stories.tsx +753 -753
  129. package/src/components/POSProductSidebarItems/POSProductSidebarItems.tsx +332 -332
  130. package/src/components/POSProductSidebarItems/POSProductSidebarItems.types.ts +119 -119
  131. package/src/components/POSProductSidebarItems/README.md +198 -198
  132. package/src/components/POSProductSidebarItems/icons.tsx +21 -21
  133. package/src/components/POSProductSidebarItems/index.ts +3 -3
  134. package/src/components/POSTable/POSTable.stories.tsx +737 -737
  135. package/src/components/POSTable/POSTable.tsx +401 -401
  136. package/src/components/POSTable/README.md +286 -286
  137. package/src/components/Quantity/Quantity.stories.tsx +457 -457
  138. package/src/components/Radio/Radio.stories.tsx +523 -523
  139. package/src/components/Radio/Radio.tsx +1 -1
  140. package/src/components/Select/Select.stories.tsx +32 -0
  141. package/src/components/Select/Select.tsx +457 -454
  142. package/src/components/Select/icons.tsx +16 -41
  143. package/src/components/SignUpView/SignUpView.stories.tsx +129 -129
  144. package/src/components/SignUpView/SignUpView.tsx +503 -503
  145. package/src/components/SignUpView/SignUpView.types.ts +58 -58
  146. package/src/components/SignUpView/icons.tsx +71 -71
  147. package/src/components/SignUpView/index.ts +3 -3
  148. package/src/components/Switch/README.md +112 -112
  149. package/src/components/Switch/Switch.stories.tsx +550 -550
  150. package/src/components/Switch/Switch.tsx +246 -246
  151. package/src/components/Switch/Switch.types.ts +67 -67
  152. package/src/components/Table/Table.stories.tsx +805 -805
  153. package/src/components/Tabs/README.md +201 -201
  154. package/src/components/Tabs/Tabs.stories.tsx +580 -580
  155. package/src/components/Tabs/Tabs.tsx +356 -356
  156. package/src/components/Tabs/Tabs.types.ts +127 -127
  157. package/src/components/Tabs/icons.tsx +129 -129
  158. package/src/components/Tabs/index.ts +11 -11
  159. package/src/components/Textarea/Textarea.stories.tsx +535 -535
  160. package/src/index.ts +133 -102
  161. package/src/views/LayoutCommercial/LayoutCommercial.stories.tsx +374 -0
  162. package/src/views/LayoutCommercial/LayoutCommercial.tsx +125 -0
  163. package/src/views/LayoutCommercial/LayoutCommercial.types.ts +54 -0
  164. package/src/views/LayoutCommercial/README.md +286 -0
  165. package/src/views/LayoutCommercial/index.ts +2 -0
  166. package/src/views/ListView/ListView.stories.tsx +329 -329
  167. package/src/views/ListView/ListView.tsx +570 -570
  168. package/src/views/ListView/ListView.types.ts +211 -211
  169. package/src/views/ListView/icons.tsx +282 -282
  170. package/src/views/ListView/index.ts +11 -11
  171. package/src/views/LoginView/LoginView.tsx +426 -426
  172. package/src/views/ProductsView/ProductsView.stories.tsx +344 -344
  173. package/src/views/ProductsView/ProductsView.tsx +480 -480
  174. package/src/views/ProductsView/ProductsView.types.ts +238 -238
  175. package/src/views/ProductsView/README.md +312 -312
  176. package/src/views/ProductsView/icons.tsx +38 -38
  177. package/src/views/ProductsView/index.ts +8 -8
  178. package/src/views/RecoverPasswordView/RecoverPasswordView.tsx +376 -376
  179. package/src/views/SignUpView/SignUpView.tsx +503 -503
  180. package/src/views/TableLayoutView/README.md +268 -268
  181. package/src/views/TableLayoutView/TableLayoutView.stories.tsx +235 -235
  182. package/src/views/TableLayoutView/TableLayoutView.tsx +461 -461
  183. package/src/views/TableLayoutView/TableLayoutView.types.ts +209 -209
  184. package/src/views/TableLayoutView/icons.tsx +113 -113
  185. package/src/views/TableLayoutView/index.ts +6 -6
  186. package/storybook/main.ts +19 -19
  187. package/storybook/preview.tsx +84 -84
  188. package/storybook/vitest.setup.ts +6 -6
  189. package/tailwind.config.js +128 -128
@@ -1,513 +1,513 @@
1
- import type { Meta, StoryObj } from '@storybook/react';
2
- import { Notification } from './Notification';
3
-
4
- const meta = {
5
- title: 'Siesa UI Kit/Notification',
6
- component: Notification,
7
- parameters: {
8
- layout: 'centered',
9
- docs: {
10
- description: {
11
- component:
12
- 'Badge de notificación para mostrar alertas, mensajes o notificaciones pendientes. Puede mostrar un punto simple o un contador numérico con límite automático a 99+. Ideal para usar como overlay en iconos o botones.',
13
- },
14
- },
15
- },
16
- tags: ['autodocs'],
17
- argTypes: {
18
- count: {
19
- control: 'number',
20
- description: 'Número de notificaciones (undefined = punto simple, 1-99 = número exacto, 100+ = "99+")',
21
- },
22
- color: {
23
- control: 'select',
24
- options: ['red', 'orange', 'yellow', 'green', 'blue', 'purple', 'zinc', 'primary'],
25
- description: 'Color del badge (default: red)',
26
- },
27
- className: {
28
- control: 'text',
29
- description: 'Clases CSS adicionales para posicionamiento',
30
- },
31
- ariaLabel: {
32
- control: 'text',
33
- description: 'Label para accesibilidad (se genera automáticamente si no se especifica)',
34
- },
35
- },
36
- } satisfies Meta<typeof Notification>;
37
-
38
- export default meta;
39
- type Story = StoryObj<typeof meta>;
40
-
41
- // ============================================
42
- // 1. PLAYGROUND INTERACTIVO
43
- // ============================================
44
- export const Playground: Story = {
45
- name: 'Playground',
46
- args: {
47
- count: 5,
48
- color: 'red',
49
- },
50
- };
51
-
52
- // ============================================
53
- // 2. VARIANTES BÁSICAS
54
- // ============================================
55
- export const VariantesBasicas: Story = {
56
- name: 'Variantes Básicas',
57
- render: () => (
58
- <div className="space-y-8 p-6">
59
- {/* Badge Simple (Dot) */}
60
- <div>
61
- <h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
62
- Badge Simple (Dot)
63
- </h3>
64
- <div className="flex items-center gap-6">
65
- <div className="flex flex-col items-center gap-2">
66
- <Notification />
67
- <span className="text-xs text-gray-500 dark:text-gray-300">Default (sin count)</span>
68
- </div>
69
- <div className="flex flex-col items-center gap-2">
70
- <Notification count={0} />
71
- <span className="text-xs text-gray-500 dark:text-gray-300">count={0}</span>
72
- </div>
73
- </div>
74
- <p className="text-xs text-gray-500 dark:text-gray-300 mt-2">
75
- Punto rojo de 8px × 8px para indicar notificaciones sin especificar cantidad
76
- </p>
77
- </div>
78
-
79
- {/* Badge con Número */}
80
- <div>
81
- <h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
82
- Badge con Número
83
- </h3>
84
- <div className="flex items-center gap-6">
85
- <div className="flex flex-col items-center gap-2">
86
- <Notification count={1} />
87
- <span className="text-xs text-gray-500 dark:text-gray-300">1</span>
88
- </div>
89
- <div className="flex flex-col items-center gap-2">
90
- <Notification count={5} />
91
- <span className="text-xs text-gray-500 dark:text-gray-300">5</span>
92
- </div>
93
- <div className="flex flex-col items-center gap-2">
94
- <Notification count={12} />
95
- <span className="text-xs text-gray-500 dark:text-gray-300">12</span>
96
- </div>
97
- <div className="flex flex-col items-center gap-2">
98
- <Notification count={99} />
99
- <span className="text-xs text-gray-500 dark:text-gray-300">99</span>
100
- </div>
101
- <div className="flex flex-col items-center gap-2">
102
- <Notification count={150} />
103
- <span className="text-xs text-gray-500 dark:text-gray-300">99+ (150)</span>
104
- </div>
105
- </div>
106
- <p className="text-xs text-gray-500 dark:text-gray-300 mt-2">
107
- Badge de 16px altura con número. Límite automático a &quot;99+&quot; para valores ≥ 100
108
- </p>
109
- </div>
110
-
111
- <div className="mt-6 p-4 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg">
112
- <p className="text-xs text-gray-600 dark:text-gray-300">
113
- <strong>💡 Especificaciones:</strong>
114
- <br />• Badge simple: 8px × 8px (w-2 h-2), rounded-full
115
- <br />• Badge con número: 16px altura, 10px Bold, padding horizontal 4px
116
- <br />• Límite automático: números ≥ 100 muestran &quot;99+&quot;
117
- <br />• Color default: content-extensions-red (#b91c1c)
118
- </p>
119
- </div>
120
- </div>
121
- ),
122
- };
123
-
124
- // ============================================
125
- // 3. RANGOS DE CONTEO
126
- // ============================================
127
- export const RangosDeConteo: Story = {
128
- name: 'Rangos de Conteo',
129
- render: () => (
130
- <div className="space-y-8 p-6">
131
- <div>
132
- <h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
133
- Pocas Notificaciones (1-9)
134
- </h3>
135
- <div className="flex gap-4">
136
- <Notification count={1} />
137
- <Notification count={3} />
138
- <Notification count={5} />
139
- <Notification count={9} />
140
- </div>
141
- <p className="text-xs text-gray-500 dark:text-gray-300 mt-2">
142
- Badge angosto para números de un dígito
143
- </p>
144
- </div>
145
-
146
- <div>
147
- <h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
148
- Muchas Notificaciones (10-99)
149
- </h3>
150
- <div className="flex gap-4">
151
- <Notification count={10} />
152
- <Notification count={25} />
153
- <Notification count={50} />
154
- <Notification count={99} />
155
- </div>
156
- <p className="text-xs text-gray-500 dark:text-gray-300 mt-2">
157
- Badge se expande automáticamente para dos dígitos
158
- </p>
159
- </div>
160
-
161
- <div>
162
- <h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
163
- Demasiadas Notificaciones (100+)
164
- </h3>
165
- <div className="flex gap-4">
166
- <Notification count={100} />
167
- <Notification count={250} />
168
- <Notification count={500} />
169
- <Notification count={999} />
170
- </div>
171
- <p className="text-xs text-gray-500 dark:text-gray-300 mt-2">
172
- Todos muestran &quot;99+&quot; para mantener badge compacto
173
- </p>
174
- </div>
175
- </div>
176
- ),
177
- };
178
-
179
- // ============================================
180
- // 4. COLORES
181
- // ============================================
182
- export const Colores: Story = {
183
- name: 'Colores',
184
- render: () => (
185
- <div className="space-y-8 p-6">
186
- <div>
187
- <h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
188
- Badge con Número - Colores Disponibles
189
- </h3>
190
- <div className="flex flex-wrap items-center gap-6">
191
- <div className="flex flex-col items-center gap-2">
192
- <Notification count={5} color="red" />
193
- <span className="text-xs text-gray-500 dark:text-gray-300">Red (default)</span>
194
- </div>
195
- <div className="flex flex-col items-center gap-2">
196
- <Notification count={8} color="orange" />
197
- <span className="text-xs text-gray-500 dark:text-gray-300">Orange</span>
198
- </div>
199
- <div className="flex flex-col items-center gap-2">
200
- <Notification count={3} color="yellow" />
201
- <span className="text-xs text-gray-500 dark:text-gray-300">Yellow</span>
202
- </div>
203
- <div className="flex flex-col items-center gap-2">
204
- <Notification count={12} color="green" />
205
- <span className="text-xs text-gray-500 dark:text-gray-300">Green</span>
206
- </div>
207
- <div className="flex flex-col items-center gap-2">
208
- <Notification count={7} color="blue" />
209
- <span className="text-xs text-gray-500 dark:text-gray-300">Blue</span>
210
- </div>
211
- <div className="flex flex-col items-center gap-2">
212
- <Notification count={15} color="purple" />
213
- <span className="text-xs text-gray-500 dark:text-gray-300">Purple</span>
214
- </div>
215
- <div className="flex flex-col items-center gap-2">
216
- <Notification count={2} color="zinc" />
217
- <span className="text-xs text-gray-500 dark:text-gray-300">Zinc</span>
218
- </div>
219
- <div className="flex flex-col items-center gap-2">
220
- <Notification count={9} color="primary" />
221
- <span className="text-xs text-gray-500 dark:text-gray-300">Primary</span>
222
- </div>
223
- </div>
224
- </div>
225
-
226
- <div>
227
- <h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
228
- Badge Simple - Colores Disponibles
229
- </h3>
230
- <div className="flex flex-wrap items-center gap-6">
231
- <div className="flex flex-col items-center gap-2">
232
- <Notification color="red" />
233
- <span className="text-xs text-gray-500 dark:text-gray-300">Red</span>
234
- </div>
235
- <div className="flex flex-col items-center gap-2">
236
- <Notification color="orange" />
237
- <span className="text-xs text-gray-500 dark:text-gray-300">Orange</span>
238
- </div>
239
- <div className="flex flex-col items-center gap-2">
240
- <Notification color="green" />
241
- <span className="text-xs text-gray-500 dark:text-gray-300">Green</span>
242
- </div>
243
- <div className="flex flex-col items-center gap-2">
244
- <Notification color="blue" />
245
- <span className="text-xs text-gray-500 dark:text-gray-300">Blue</span>
246
- </div>
247
- <div className="flex flex-col items-center gap-2">
248
- <Notification color="purple" />
249
- <span className="text-xs text-gray-500 dark:text-gray-300">Purple</span>
250
- </div>
251
- </div>
252
- </div>
253
-
254
- <div className="mt-6 p-4 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg">
255
- <p className="text-xs text-gray-600 dark:text-gray-300">
256
- <strong>💡 Uso recomendado:</strong>
257
- <br />• <strong>Red:</strong> Errores, alertas críticas
258
- <br />• <strong>Orange:</strong> Advertencias importantes
259
- <br />• <strong>Yellow:</strong> Avisos, atención requerida
260
- <br />• <strong>Green:</strong> Confirmaciones, éxitos
261
- <br />• <strong>Blue:</strong> Información general
262
- <br />• <strong>Purple:</strong> Especiales o premium
263
- <br />• <strong>Zinc:</strong> Neutras
264
- </p>
265
- </div>
266
- </div>
267
- ),
268
- };
269
-
270
- // ============================================
271
- // 5. DARK MODE
272
- // ============================================
273
- export const DarkMode: Story = {
274
- name: 'Dark Mode',
275
- parameters: {
276
- backgrounds: {
277
- default: 'dark',
278
- },
279
- },
280
- render: () => (
281
- <div className="dark bg-dark-bg-primary p-8 rounded-lg space-y-8">
282
- <div>
283
- <h3 className="text-sm font-bold mb-4 text-dark-content-primary">
284
- Badge Simple en Dark Mode
285
- </h3>
286
- <div className="flex gap-6">
287
- <Notification />
288
- <Notification color="orange" />
289
- <Notification color="green" />
290
- <Notification color="blue" />
291
- </div>
292
- <p className="text-xs text-gray-400 mt-4">
293
- Punto de 8px mantiene visibilidad en fondos oscuros
294
- </p>
295
- </div>
296
-
297
- <div>
298
- <h3 className="text-sm font-bold mb-4 text-dark-content-primary">
299
- Badge con Número en Dark Mode
300
- </h3>
301
- <div className="flex gap-6">
302
- <Notification count={3} />
303
- <Notification count={12} color="orange" />
304
- <Notification count={25} color="green" />
305
- <Notification count={99} color="blue" />
306
- </div>
307
- <p className="text-xs text-gray-400 mt-4">
308
- Badge con contraste óptimo: colores mantienen intensidad en dark mode
309
- </p>
310
- </div>
311
-
312
- <div className="mt-6 p-4 bg-blue-900/20 border border-blue-800 rounded-lg">
313
- <p className="text-xs text-gray-300">
314
- <strong>✨ Dark Mode:</strong>
315
- <br />• Colores mantienen intensidad (ej: content-extensions-red #b91c1c)
316
- <br />• Texto siempre blanco para máximo contraste
317
- <br />• Sin bordes en badge simple
318
- </p>
319
- </div>
320
- </div>
321
- ),
322
- };
323
-
324
- // ============================================
325
- // 6. COMO OVERLAY
326
- // ============================================
327
- export const ComoOverlay: Story = {
328
- name: 'Como Overlay',
329
- render: () => (
330
- <div className="space-y-8 p-6">
331
- <div>
332
- <h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
333
- Overlay en Botón
334
- </h3>
335
- <div className="flex gap-6">
336
- <button className="relative p-3 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors">
337
- <svg className="w-6 h-6 text-gray-700 dark:text-white" fill="none" viewBox="0 0 24 24" stroke="currentColor">
338
- <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9" />
339
- </svg>
340
- <Notification count={5} className="absolute -top-1 -right-1" />
341
- </button>
342
-
343
- <button className="relative p-3 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors">
344
- <svg className="w-6 h-6 text-gray-700 dark:text-white" fill="none" viewBox="0 0 24 24" stroke="currentColor">
345
- <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
346
- </svg>
347
- <Notification className="absolute -top-1 -right-1" />
348
- </button>
349
-
350
- <button className="relative p-3 bg-primary-custom-600 text-white rounded-lg hover:bg-primary-custom-500 transition-colors">
351
- <svg className="w-6 h-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
352
- <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9" />
353
- </svg>
354
- <Notification count={12} className="absolute -top-1 -right-1" />
355
- </button>
356
- </div>
357
- <p className="text-xs text-gray-500 dark:text-gray-300 mt-2">
358
- Usa <code className="px-1 bg-gray-100 dark:bg-gray-700">className=&quot;absolute -top-1 -right-1&quot;</code> para posicionar
359
- </p>
360
- </div>
361
-
362
- <div>
363
- <h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
364
- Overlay en Avatar
365
- </h3>
366
- <div className="flex gap-6">
367
- <div className="relative">
368
- <div className="w-12 h-12 bg-gradient-to-br from-purple-400 to-pink-500 rounded-full flex items-center justify-center text-white font-bold">
369
- JD
370
- </div>
371
- <Notification count={3} className="absolute -top-1 -right-1" />
372
- </div>
373
-
374
- <div className="relative">
375
- <div className="w-12 h-12 bg-gradient-to-br from-blue-400 to-cyan-500 rounded-full flex items-center justify-center text-white font-bold">
376
- AS
377
- </div>
378
- <Notification className="absolute -top-1 -right-1" />
379
- </div>
380
- </div>
381
- <p className="text-xs text-gray-500 dark:text-gray-300 mt-2">
382
- Badge como indicador de estado en avatares
383
- </p>
384
- </div>
385
-
386
- <div>
387
- <h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
388
- En Barra de Navegación
389
- </h3>
390
- <div className="bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-4">
391
- <div className="flex items-center justify-between">
392
- <span className="text-sm font-medium text-gray-700 dark:text-white">Mi App</span>
393
- <div className="flex items-center gap-4">
394
- <button className="relative p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded transition-colors">
395
- <svg className="w-5 h-5 text-gray-700 dark:text-white" fill="none" viewBox="0 0 24 24" stroke="currentColor">
396
- <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9" />
397
- </svg>
398
- <Notification count={7} className="absolute top-0 right-0" />
399
- </button>
400
- <button className="relative p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded transition-colors">
401
- <svg className="w-5 h-5 text-gray-700 dark:text-white" fill="none" viewBox="0 0 24 24" stroke="currentColor">
402
- <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
403
- </svg>
404
- <Notification count={2} className="absolute top-0 right-0" />
405
- </button>
406
- </div>
407
- </div>
408
- </div>
409
- </div>
410
-
411
- <div className="mt-6 p-4 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg">
412
- <p className="text-xs text-gray-600 dark:text-gray-300">
413
- <strong>💡 Posicionamiento:</strong>
414
- <br />• Envuelve el elemento en <code className="px-1 bg-white dark:bg-gray-700">relative</code>
415
- <br />• Agrega badge con <code className="px-1 bg-white dark:bg-gray-700">absolute -top-1 -right-1</code>
416
- <br />• Ajusta offset según necesites (top-0, -top-2, etc.)
417
- </p>
418
- </div>
419
- </div>
420
- ),
421
- };
422
-
423
- // ============================================
424
- // 7. CASOS DE USO REALES
425
- // ============================================
426
- export const CasosDeUso: Story = {
427
- name: 'Casos de Uso Reales',
428
- render: () => (
429
- <div className="space-y-8 p-6">
430
- {/* Menú Lateral */}
431
- <div>
432
- <h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
433
- Menú Lateral con Notificaciones
434
- </h3>
435
- <div className="bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-4 w-64">
436
- <div className="space-y-2">
437
- <div className="flex items-center justify-between p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded cursor-pointer">
438
- <span className="text-sm text-gray-700 dark:text-white">Dashboard</span>
439
- </div>
440
- <div className="flex items-center justify-between p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded cursor-pointer">
441
- <span className="text-sm text-gray-700 dark:text-white">Notificaciones</span>
442
- <Notification count={12} />
443
- </div>
444
- <div className="flex items-center justify-between p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded cursor-pointer">
445
- <span className="text-sm text-gray-700 dark:text-white">Mensajes</span>
446
- <Notification count={5} />
447
- </div>
448
- <div className="flex items-center justify-between p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded cursor-pointer">
449
- <span className="text-sm text-gray-700 dark:text-white">Configuración</span>
450
- </div>
451
- </div>
452
- </div>
453
- </div>
454
-
455
- {/* Lista de Tareas */}
456
- <div>
457
- <h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
458
- Lista de Tareas con Prioridades
459
- </h3>
460
- <div className="bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-4 space-y-3">
461
- <div className="flex items-center gap-3 p-2 hover:bg-gray-50 dark:hover:bg-gray-700 rounded cursor-pointer">
462
- <Notification color="red" />
463
- <div className="flex-1">
464
- <p className="text-sm font-medium text-gray-700 dark:text-white">Urgente: Revisar servidor</p>
465
- <p className="text-xs text-gray-500 dark:text-gray-400">Prioridad alta</p>
466
- </div>
467
- </div>
468
- <div className="flex items-center gap-3 p-2 hover:bg-gray-50 dark:hover:bg-gray-700 rounded cursor-pointer">
469
- <Notification color="orange" />
470
- <div className="flex-1">
471
- <p className="text-sm font-medium text-gray-700 dark:text-white">Advertencia: Actualización disponible</p>
472
- <p className="text-xs text-gray-500 dark:text-gray-400">Prioridad media</p>
473
- </div>
474
- </div>
475
- <div className="flex items-center gap-3 p-2 hover:bg-gray-50 dark:hover:bg-gray-700 rounded cursor-pointer">
476
- <Notification color="blue" />
477
- <div className="flex-1">
478
- <p className="text-sm font-medium text-gray-700 dark:text-white">Info: Nuevo feature disponible</p>
479
- <p className="text-xs text-gray-500 dark:text-gray-400">Prioridad baja</p>
480
- </div>
481
- </div>
482
- </div>
483
- </div>
484
-
485
- {/* Tabs con Contadores */}
486
- <div>
487
- <h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
488
- Tabs con Contadores
489
- </h3>
490
- <div className="bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg">
491
- <div className="flex border-b border-gray-200 dark:border-gray-700">
492
- <button className="flex items-center gap-2 px-4 py-3 border-b-2 border-primary-custom-600 text-sm font-medium text-primary-custom-600">
493
- Pendientes
494
- <Notification count={8} />
495
- </button>
496
- <button className="flex items-center gap-2 px-4 py-3 text-sm font-medium text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300">
497
- En Progreso
498
- <Notification count={3} color="blue" />
499
- </button>
500
- <button className="flex items-center gap-2 px-4 py-3 text-sm font-medium text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300">
501
- Completados
502
- </button>
503
- </div>
504
- <div className="p-4">
505
- <p className="text-sm text-gray-600 dark:text-gray-300">
506
- Contenido de la pestaña seleccionada
507
- </p>
508
- </div>
509
- </div>
510
- </div>
511
- </div>
512
- ),
513
- };
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { Notification } from './Notification';
3
+
4
+ const meta = {
5
+ title: 'Siesa UI Kit/Notification',
6
+ component: Notification,
7
+ parameters: {
8
+ layout: 'centered',
9
+ docs: {
10
+ description: {
11
+ component:
12
+ 'Badge de notificación para mostrar alertas, mensajes o notificaciones pendientes. Puede mostrar un punto simple o un contador numérico con límite automático a 99+. Ideal para usar como overlay en iconos o botones.',
13
+ },
14
+ },
15
+ },
16
+ tags: ['autodocs'],
17
+ argTypes: {
18
+ count: {
19
+ control: 'number',
20
+ description: 'Número de notificaciones (undefined = punto simple, 1-99 = número exacto, 100+ = "99+")',
21
+ },
22
+ color: {
23
+ control: 'select',
24
+ options: ['red', 'orange', 'yellow', 'green', 'blue', 'purple', 'zinc', 'primary'],
25
+ description: 'Color del badge (default: red)',
26
+ },
27
+ className: {
28
+ control: 'text',
29
+ description: 'Clases CSS adicionales para posicionamiento',
30
+ },
31
+ ariaLabel: {
32
+ control: 'text',
33
+ description: 'Label para accesibilidad (se genera automáticamente si no se especifica)',
34
+ },
35
+ },
36
+ } satisfies Meta<typeof Notification>;
37
+
38
+ export default meta;
39
+ type Story = StoryObj<typeof meta>;
40
+
41
+ // ============================================
42
+ // 1. PLAYGROUND INTERACTIVO
43
+ // ============================================
44
+ export const Playground: Story = {
45
+ name: 'Playground',
46
+ args: {
47
+ count: 5,
48
+ color: 'red',
49
+ },
50
+ };
51
+
52
+ // ============================================
53
+ // 2. VARIANTES BÁSICAS
54
+ // ============================================
55
+ export const VariantesBasicas: Story = {
56
+ name: 'Variantes Básicas',
57
+ render: () => (
58
+ <div className="space-y-8 p-6">
59
+ {/* Badge Simple (Dot) */}
60
+ <div>
61
+ <h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
62
+ Badge Simple (Dot)
63
+ </h3>
64
+ <div className="flex items-center gap-6">
65
+ <div className="flex flex-col items-center gap-2">
66
+ <Notification />
67
+ <span className="text-xs text-gray-500 dark:text-gray-300">Default (sin count)</span>
68
+ </div>
69
+ <div className="flex flex-col items-center gap-2">
70
+ <Notification count={0} />
71
+ <span className="text-xs text-gray-500 dark:text-gray-300">count={0}</span>
72
+ </div>
73
+ </div>
74
+ <p className="text-xs text-gray-500 dark:text-gray-300 mt-2">
75
+ Punto rojo de 8px × 8px para indicar notificaciones sin especificar cantidad
76
+ </p>
77
+ </div>
78
+
79
+ {/* Badge con Número */}
80
+ <div>
81
+ <h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
82
+ Badge con Número
83
+ </h3>
84
+ <div className="flex items-center gap-6">
85
+ <div className="flex flex-col items-center gap-2">
86
+ <Notification count={1} />
87
+ <span className="text-xs text-gray-500 dark:text-gray-300">1</span>
88
+ </div>
89
+ <div className="flex flex-col items-center gap-2">
90
+ <Notification count={5} />
91
+ <span className="text-xs text-gray-500 dark:text-gray-300">5</span>
92
+ </div>
93
+ <div className="flex flex-col items-center gap-2">
94
+ <Notification count={12} />
95
+ <span className="text-xs text-gray-500 dark:text-gray-300">12</span>
96
+ </div>
97
+ <div className="flex flex-col items-center gap-2">
98
+ <Notification count={99} />
99
+ <span className="text-xs text-gray-500 dark:text-gray-300">99</span>
100
+ </div>
101
+ <div className="flex flex-col items-center gap-2">
102
+ <Notification count={150} />
103
+ <span className="text-xs text-gray-500 dark:text-gray-300">99+ (150)</span>
104
+ </div>
105
+ </div>
106
+ <p className="text-xs text-gray-500 dark:text-gray-300 mt-2">
107
+ Badge de 16px altura con número. Límite automático a &quot;99+&quot; para valores ≥ 100
108
+ </p>
109
+ </div>
110
+
111
+ <div className="mt-6 p-4 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg">
112
+ <p className="text-xs text-gray-600 dark:text-gray-300">
113
+ <strong>💡 Especificaciones:</strong>
114
+ <br />• Badge simple: 8px × 8px (w-2 h-2), rounded-full
115
+ <br />• Badge con número: 16px altura, 10px Bold, padding horizontal 4px
116
+ <br />• Límite automático: números ≥ 100 muestran &quot;99+&quot;
117
+ <br />• Color default: content-extensions-red (#b91c1c)
118
+ </p>
119
+ </div>
120
+ </div>
121
+ ),
122
+ };
123
+
124
+ // ============================================
125
+ // 3. RANGOS DE CONTEO
126
+ // ============================================
127
+ export const RangosDeConteo: Story = {
128
+ name: 'Rangos de Conteo',
129
+ render: () => (
130
+ <div className="space-y-8 p-6">
131
+ <div>
132
+ <h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
133
+ Pocas Notificaciones (1-9)
134
+ </h3>
135
+ <div className="flex gap-4">
136
+ <Notification count={1} />
137
+ <Notification count={3} />
138
+ <Notification count={5} />
139
+ <Notification count={9} />
140
+ </div>
141
+ <p className="text-xs text-gray-500 dark:text-gray-300 mt-2">
142
+ Badge angosto para números de un dígito
143
+ </p>
144
+ </div>
145
+
146
+ <div>
147
+ <h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
148
+ Muchas Notificaciones (10-99)
149
+ </h3>
150
+ <div className="flex gap-4">
151
+ <Notification count={10} />
152
+ <Notification count={25} />
153
+ <Notification count={50} />
154
+ <Notification count={99} />
155
+ </div>
156
+ <p className="text-xs text-gray-500 dark:text-gray-300 mt-2">
157
+ Badge se expande automáticamente para dos dígitos
158
+ </p>
159
+ </div>
160
+
161
+ <div>
162
+ <h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
163
+ Demasiadas Notificaciones (100+)
164
+ </h3>
165
+ <div className="flex gap-4">
166
+ <Notification count={100} />
167
+ <Notification count={250} />
168
+ <Notification count={500} />
169
+ <Notification count={999} />
170
+ </div>
171
+ <p className="text-xs text-gray-500 dark:text-gray-300 mt-2">
172
+ Todos muestran &quot;99+&quot; para mantener badge compacto
173
+ </p>
174
+ </div>
175
+ </div>
176
+ ),
177
+ };
178
+
179
+ // ============================================
180
+ // 4. COLORES
181
+ // ============================================
182
+ export const Colores: Story = {
183
+ name: 'Colores',
184
+ render: () => (
185
+ <div className="space-y-8 p-6">
186
+ <div>
187
+ <h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
188
+ Badge con Número - Colores Disponibles
189
+ </h3>
190
+ <div className="flex flex-wrap items-center gap-6">
191
+ <div className="flex flex-col items-center gap-2">
192
+ <Notification count={5} color="red" />
193
+ <span className="text-xs text-gray-500 dark:text-gray-300">Red (default)</span>
194
+ </div>
195
+ <div className="flex flex-col items-center gap-2">
196
+ <Notification count={8} color="orange" />
197
+ <span className="text-xs text-gray-500 dark:text-gray-300">Orange</span>
198
+ </div>
199
+ <div className="flex flex-col items-center gap-2">
200
+ <Notification count={3} color="yellow" />
201
+ <span className="text-xs text-gray-500 dark:text-gray-300">Yellow</span>
202
+ </div>
203
+ <div className="flex flex-col items-center gap-2">
204
+ <Notification count={12} color="green" />
205
+ <span className="text-xs text-gray-500 dark:text-gray-300">Green</span>
206
+ </div>
207
+ <div className="flex flex-col items-center gap-2">
208
+ <Notification count={7} color="blue" />
209
+ <span className="text-xs text-gray-500 dark:text-gray-300">Blue</span>
210
+ </div>
211
+ <div className="flex flex-col items-center gap-2">
212
+ <Notification count={15} color="purple" />
213
+ <span className="text-xs text-gray-500 dark:text-gray-300">Purple</span>
214
+ </div>
215
+ <div className="flex flex-col items-center gap-2">
216
+ <Notification count={2} color="zinc" />
217
+ <span className="text-xs text-gray-500 dark:text-gray-300">Zinc</span>
218
+ </div>
219
+ <div className="flex flex-col items-center gap-2">
220
+ <Notification count={9} color="primary" />
221
+ <span className="text-xs text-gray-500 dark:text-gray-300">Primary</span>
222
+ </div>
223
+ </div>
224
+ </div>
225
+
226
+ <div>
227
+ <h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
228
+ Badge Simple - Colores Disponibles
229
+ </h3>
230
+ <div className="flex flex-wrap items-center gap-6">
231
+ <div className="flex flex-col items-center gap-2">
232
+ <Notification color="red" />
233
+ <span className="text-xs text-gray-500 dark:text-gray-300">Red</span>
234
+ </div>
235
+ <div className="flex flex-col items-center gap-2">
236
+ <Notification color="orange" />
237
+ <span className="text-xs text-gray-500 dark:text-gray-300">Orange</span>
238
+ </div>
239
+ <div className="flex flex-col items-center gap-2">
240
+ <Notification color="green" />
241
+ <span className="text-xs text-gray-500 dark:text-gray-300">Green</span>
242
+ </div>
243
+ <div className="flex flex-col items-center gap-2">
244
+ <Notification color="blue" />
245
+ <span className="text-xs text-gray-500 dark:text-gray-300">Blue</span>
246
+ </div>
247
+ <div className="flex flex-col items-center gap-2">
248
+ <Notification color="purple" />
249
+ <span className="text-xs text-gray-500 dark:text-gray-300">Purple</span>
250
+ </div>
251
+ </div>
252
+ </div>
253
+
254
+ <div className="mt-6 p-4 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg">
255
+ <p className="text-xs text-gray-600 dark:text-gray-300">
256
+ <strong>💡 Uso recomendado:</strong>
257
+ <br />• <strong>Red:</strong> Errores, alertas críticas
258
+ <br />• <strong>Orange:</strong> Advertencias importantes
259
+ <br />• <strong>Yellow:</strong> Avisos, atención requerida
260
+ <br />• <strong>Green:</strong> Confirmaciones, éxitos
261
+ <br />• <strong>Blue:</strong> Información general
262
+ <br />• <strong>Purple:</strong> Especiales o premium
263
+ <br />• <strong>Zinc:</strong> Neutras
264
+ </p>
265
+ </div>
266
+ </div>
267
+ ),
268
+ };
269
+
270
+ // ============================================
271
+ // 5. DARK MODE
272
+ // ============================================
273
+ export const DarkMode: Story = {
274
+ name: 'Dark Mode',
275
+ parameters: {
276
+ backgrounds: {
277
+ default: 'dark',
278
+ },
279
+ },
280
+ render: () => (
281
+ <div className="dark bg-dark-bg-primary p-8 rounded-lg space-y-8">
282
+ <div>
283
+ <h3 className="text-sm font-bold mb-4 text-dark-content-primary">
284
+ Badge Simple en Dark Mode
285
+ </h3>
286
+ <div className="flex gap-6">
287
+ <Notification />
288
+ <Notification color="orange" />
289
+ <Notification color="green" />
290
+ <Notification color="blue" />
291
+ </div>
292
+ <p className="text-xs text-gray-400 mt-4">
293
+ Punto de 8px mantiene visibilidad en fondos oscuros
294
+ </p>
295
+ </div>
296
+
297
+ <div>
298
+ <h3 className="text-sm font-bold mb-4 text-dark-content-primary">
299
+ Badge con Número en Dark Mode
300
+ </h3>
301
+ <div className="flex gap-6">
302
+ <Notification count={3} />
303
+ <Notification count={12} color="orange" />
304
+ <Notification count={25} color="green" />
305
+ <Notification count={99} color="blue" />
306
+ </div>
307
+ <p className="text-xs text-gray-400 mt-4">
308
+ Badge con contraste óptimo: colores mantienen intensidad en dark mode
309
+ </p>
310
+ </div>
311
+
312
+ <div className="mt-6 p-4 bg-blue-900/20 border border-blue-800 rounded-lg">
313
+ <p className="text-xs text-gray-300">
314
+ <strong>✨ Dark Mode:</strong>
315
+ <br />• Colores mantienen intensidad (ej: content-extensions-red #b91c1c)
316
+ <br />• Texto siempre blanco para máximo contraste
317
+ <br />• Sin bordes en badge simple
318
+ </p>
319
+ </div>
320
+ </div>
321
+ ),
322
+ };
323
+
324
+ // ============================================
325
+ // 6. COMO OVERLAY
326
+ // ============================================
327
+ export const ComoOverlay: Story = {
328
+ name: 'Como Overlay',
329
+ render: () => (
330
+ <div className="space-y-8 p-6">
331
+ <div>
332
+ <h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
333
+ Overlay en Botón
334
+ </h3>
335
+ <div className="flex gap-6">
336
+ <button className="relative p-3 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors">
337
+ <svg className="w-6 h-6 text-gray-700 dark:text-white" fill="none" viewBox="0 0 24 24" stroke="currentColor">
338
+ <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9" />
339
+ </svg>
340
+ <Notification count={5} className="absolute -top-1 -right-1" />
341
+ </button>
342
+
343
+ <button className="relative p-3 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors">
344
+ <svg className="w-6 h-6 text-gray-700 dark:text-white" fill="none" viewBox="0 0 24 24" stroke="currentColor">
345
+ <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
346
+ </svg>
347
+ <Notification className="absolute -top-1 -right-1" />
348
+ </button>
349
+
350
+ <button className="relative p-3 bg-primary-custom-600 text-white rounded-lg hover:bg-primary-custom-500 transition-colors">
351
+ <svg className="w-6 h-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
352
+ <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9" />
353
+ </svg>
354
+ <Notification count={12} className="absolute -top-1 -right-1" />
355
+ </button>
356
+ </div>
357
+ <p className="text-xs text-gray-500 dark:text-gray-300 mt-2">
358
+ Usa <code className="px-1 bg-gray-100 dark:bg-gray-700">className=&quot;absolute -top-1 -right-1&quot;</code> para posicionar
359
+ </p>
360
+ </div>
361
+
362
+ <div>
363
+ <h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
364
+ Overlay en Avatar
365
+ </h3>
366
+ <div className="flex gap-6">
367
+ <div className="relative">
368
+ <div className="w-12 h-12 bg-gradient-to-br from-purple-400 to-pink-500 rounded-full flex items-center justify-center text-white font-bold">
369
+ JD
370
+ </div>
371
+ <Notification count={3} className="absolute -top-1 -right-1" />
372
+ </div>
373
+
374
+ <div className="relative">
375
+ <div className="w-12 h-12 bg-gradient-to-br from-blue-400 to-cyan-500 rounded-full flex items-center justify-center text-white font-bold">
376
+ AS
377
+ </div>
378
+ <Notification className="absolute -top-1 -right-1" />
379
+ </div>
380
+ </div>
381
+ <p className="text-xs text-gray-500 dark:text-gray-300 mt-2">
382
+ Badge como indicador de estado en avatares
383
+ </p>
384
+ </div>
385
+
386
+ <div>
387
+ <h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
388
+ En Barra de Navegación
389
+ </h3>
390
+ <div className="bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-4">
391
+ <div className="flex items-center justify-between">
392
+ <span className="text-sm font-medium text-gray-700 dark:text-white">Mi App</span>
393
+ <div className="flex items-center gap-4">
394
+ <button className="relative p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded transition-colors">
395
+ <svg className="w-5 h-5 text-gray-700 dark:text-white" fill="none" viewBox="0 0 24 24" stroke="currentColor">
396
+ <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9" />
397
+ </svg>
398
+ <Notification count={7} className="absolute top-0 right-0" />
399
+ </button>
400
+ <button className="relative p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded transition-colors">
401
+ <svg className="w-5 h-5 text-gray-700 dark:text-white" fill="none" viewBox="0 0 24 24" stroke="currentColor">
402
+ <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
403
+ </svg>
404
+ <Notification count={2} className="absolute top-0 right-0" />
405
+ </button>
406
+ </div>
407
+ </div>
408
+ </div>
409
+ </div>
410
+
411
+ <div className="mt-6 p-4 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg">
412
+ <p className="text-xs text-gray-600 dark:text-gray-300">
413
+ <strong>💡 Posicionamiento:</strong>
414
+ <br />• Envuelve el elemento en <code className="px-1 bg-white dark:bg-gray-700">relative</code>
415
+ <br />• Agrega badge con <code className="px-1 bg-white dark:bg-gray-700">absolute -top-1 -right-1</code>
416
+ <br />• Ajusta offset según necesites (top-0, -top-2, etc.)
417
+ </p>
418
+ </div>
419
+ </div>
420
+ ),
421
+ };
422
+
423
+ // ============================================
424
+ // 7. CASOS DE USO REALES
425
+ // ============================================
426
+ export const CasosDeUso: Story = {
427
+ name: 'Casos de Uso Reales',
428
+ render: () => (
429
+ <div className="space-y-8 p-6">
430
+ {/* Menú Lateral */}
431
+ <div>
432
+ <h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
433
+ Menú Lateral con Notificaciones
434
+ </h3>
435
+ <div className="bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-4 w-64">
436
+ <div className="space-y-2">
437
+ <div className="flex items-center justify-between p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded cursor-pointer">
438
+ <span className="text-sm text-gray-700 dark:text-white">Dashboard</span>
439
+ </div>
440
+ <div className="flex items-center justify-between p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded cursor-pointer">
441
+ <span className="text-sm text-gray-700 dark:text-white">Notificaciones</span>
442
+ <Notification count={12} />
443
+ </div>
444
+ <div className="flex items-center justify-between p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded cursor-pointer">
445
+ <span className="text-sm text-gray-700 dark:text-white">Mensajes</span>
446
+ <Notification count={5} />
447
+ </div>
448
+ <div className="flex items-center justify-between p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded cursor-pointer">
449
+ <span className="text-sm text-gray-700 dark:text-white">Configuración</span>
450
+ </div>
451
+ </div>
452
+ </div>
453
+ </div>
454
+
455
+ {/* Lista de Tareas */}
456
+ <div>
457
+ <h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
458
+ Lista de Tareas con Prioridades
459
+ </h3>
460
+ <div className="bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-4 space-y-3">
461
+ <div className="flex items-center gap-3 p-2 hover:bg-gray-50 dark:hover:bg-gray-700 rounded cursor-pointer">
462
+ <Notification color="red" />
463
+ <div className="flex-1">
464
+ <p className="text-sm font-medium text-gray-700 dark:text-white">Urgente: Revisar servidor</p>
465
+ <p className="text-xs text-gray-500 dark:text-gray-400">Prioridad alta</p>
466
+ </div>
467
+ </div>
468
+ <div className="flex items-center gap-3 p-2 hover:bg-gray-50 dark:hover:bg-gray-700 rounded cursor-pointer">
469
+ <Notification color="orange" />
470
+ <div className="flex-1">
471
+ <p className="text-sm font-medium text-gray-700 dark:text-white">Advertencia: Actualización disponible</p>
472
+ <p className="text-xs text-gray-500 dark:text-gray-400">Prioridad media</p>
473
+ </div>
474
+ </div>
475
+ <div className="flex items-center gap-3 p-2 hover:bg-gray-50 dark:hover:bg-gray-700 rounded cursor-pointer">
476
+ <Notification color="blue" />
477
+ <div className="flex-1">
478
+ <p className="text-sm font-medium text-gray-700 dark:text-white">Info: Nuevo feature disponible</p>
479
+ <p className="text-xs text-gray-500 dark:text-gray-400">Prioridad baja</p>
480
+ </div>
481
+ </div>
482
+ </div>
483
+ </div>
484
+
485
+ {/* Tabs con Contadores */}
486
+ <div>
487
+ <h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
488
+ Tabs con Contadores
489
+ </h3>
490
+ <div className="bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg">
491
+ <div className="flex border-b border-gray-200 dark:border-gray-700">
492
+ <button className="flex items-center gap-2 px-4 py-3 border-b-2 border-primary-custom-600 text-sm font-medium text-primary-custom-600">
493
+ Pendientes
494
+ <Notification count={8} />
495
+ </button>
496
+ <button className="flex items-center gap-2 px-4 py-3 text-sm font-medium text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300">
497
+ En Progreso
498
+ <Notification count={3} color="blue" />
499
+ </button>
500
+ <button className="flex items-center gap-2 px-4 py-3 text-sm font-medium text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300">
501
+ Completados
502
+ </button>
503
+ </div>
504
+ <div className="p-4">
505
+ <p className="text-sm text-gray-600 dark:text-gray-300">
506
+ Contenido de la pestaña seleccionada
507
+ </p>
508
+ </div>
509
+ </div>
510
+ </div>
511
+ </div>
512
+ ),
513
+ };