@adamosuiteservices/ui 1.7.12 → 1.8.13

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 (307) hide show
  1. package/dist/accordion-rounded.cjs +24 -2
  2. package/dist/accordion-rounded.js +46 -8
  3. package/dist/accordion.cjs +20 -1
  4. package/dist/accordion.js +29 -5
  5. package/dist/alert.cjs +26 -1
  6. package/dist/alert.js +33 -8
  7. package/dist/avatar.cjs +7 -1
  8. package/dist/avatar.js +8 -2
  9. package/dist/badge.cjs +83 -1
  10. package/dist/badge.js +106 -24
  11. package/dist/breadcrumb.cjs +8 -1
  12. package/dist/breadcrumb.js +11 -4
  13. package/dist/button-B7ZP4LZN.js +127 -0
  14. package/dist/button-D-qFRXiM.cjs +70 -0
  15. package/dist/button-group.cjs +25 -1
  16. package/dist/button-group.js +33 -9
  17. package/dist/button.cjs +1 -1
  18. package/dist/button.js +1 -1
  19. package/dist/calendar.cjs +74 -1
  20. package/dist/calendar.js +114 -35
  21. package/dist/card.cjs +35 -1
  22. package/dist/card.js +45 -11
  23. package/dist/{checkbox-YWAnswaW.cjs → checkbox-CdnZ8VFJ.cjs} +21 -1
  24. package/dist/{checkbox-Dr487kAg.js → checkbox-DhBcmKze.js} +34 -4
  25. package/dist/checkbox.cjs +1 -1
  26. package/dist/checkbox.js +1 -1
  27. package/dist/combobox.cjs +36 -2
  28. package/dist/combobox.js +302 -253
  29. package/dist/components/icons/account-balance-icon.d.ts +3 -0
  30. package/dist/components/icons/account-icon.d.ts +3 -0
  31. package/dist/components/icons/add-circle-icon.d.ts +3 -0
  32. package/dist/components/icons/alarm-icon.d.ts +3 -0
  33. package/dist/components/icons/archive-icon.d.ts +3 -0
  34. package/dist/components/icons/arrow-back-icon.d.ts +3 -0
  35. package/dist/components/icons/arrow-circle-up-icon.d.ts +3 -0
  36. package/dist/components/icons/arrow-forward-icon.d.ts +3 -0
  37. package/dist/components/icons/arrow-outward-icon.d.ts +3 -0
  38. package/dist/components/icons/article-icon.d.ts +3 -0
  39. package/dist/components/icons/attach-file-icon.d.ts +3 -0
  40. package/dist/components/icons/autorenew-icon.d.ts +3 -0
  41. package/dist/components/icons/bookmark-icon.d.ts +3 -0
  42. package/dist/components/icons/calculate-icon.d.ts +3 -0
  43. package/dist/components/icons/calendar-today-icon.d.ts +3 -0
  44. package/dist/components/icons/call-split-icon.d.ts +3 -0
  45. package/dist/components/icons/cancel-filled-icon.d.ts +3 -0
  46. package/dist/components/icons/cancel-icon.d.ts +3 -0
  47. package/dist/components/icons/check-circle-icon.d.ts +3 -0
  48. package/dist/components/icons/check-icon.d.ts +3 -0
  49. package/dist/components/icons/chevron-back-icon.d.ts +3 -0
  50. package/dist/components/icons/chevron-down-icon.d.ts +3 -0
  51. package/dist/components/icons/chevron-forward-icon.d.ts +3 -0
  52. package/dist/components/icons/chevron-up-icon.d.ts +3 -0
  53. package/dist/components/icons/clarify-icon.d.ts +3 -0
  54. package/dist/components/icons/clock-icon.d.ts +3 -0
  55. package/dist/components/icons/close-icon.d.ts +3 -0
  56. package/dist/components/icons/confirmation-number-icon.d.ts +3 -0
  57. package/dist/components/icons/contacts-icon.d.ts +3 -0
  58. package/dist/components/icons/contract-delete-icon.d.ts +3 -0
  59. package/dist/components/icons/copy-icon.d.ts +3 -0
  60. package/dist/components/icons/do-not-touch-icon.d.ts +3 -0
  61. package/dist/components/icons/download-icon.d.ts +3 -0
  62. package/dist/components/icons/dragger-icon.d.ts +3 -0
  63. package/dist/components/icons/edit-icon.d.ts +3 -0
  64. package/dist/components/icons/edit-square-icon.d.ts +3 -0
  65. package/dist/components/icons/exclamation-icon.d.ts +3 -0
  66. package/dist/components/icons/expand-circle-right-icon.d.ts +3 -0
  67. package/dist/components/icons/feature-search-icon.d.ts +3 -0
  68. package/dist/components/icons/filter-icon.d.ts +3 -0
  69. package/dist/components/icons/folder-icon.d.ts +3 -0
  70. package/dist/components/icons/folder-open-icon.d.ts +3 -0
  71. package/dist/components/icons/format-list-bulleted-icon.d.ts +3 -0
  72. package/dist/components/icons/hamburger-menu-icon.d.ts +3 -0
  73. package/dist/components/icons/help-icon.d.ts +3 -0
  74. package/dist/components/icons/hide-pass-icon.d.ts +3 -0
  75. package/dist/components/icons/home-icon.d.ts +3 -0
  76. package/dist/components/icons/id-card-icon.d.ts +3 -0
  77. package/dist/components/icons/index.d.ts +88 -0
  78. package/dist/components/icons/info-icon.d.ts +3 -0
  79. package/dist/components/icons/kid-star-icon.d.ts +3 -0
  80. package/dist/components/icons/language-icon.d.ts +3 -0
  81. package/dist/components/icons/last-page-icon.d.ts +3 -0
  82. package/dist/components/icons/layers-icon.d.ts +3 -0
  83. package/dist/components/icons/location-icon.d.ts +3 -0
  84. package/dist/components/icons/mail-icon.d.ts +3 -0
  85. package/dist/components/icons/manage-search-icon.d.ts +3 -0
  86. package/dist/components/icons/menu-icon.d.ts +3 -0
  87. package/dist/components/icons/message-icon.d.ts +3 -0
  88. package/dist/components/icons/metrics-icon.d.ts +3 -0
  89. package/dist/components/icons/mic-icon.d.ts +3 -0
  90. package/dist/components/icons/minus-icon.d.ts +3 -0
  91. package/dist/components/icons/mode-comment-icon.d.ts +3 -0
  92. package/dist/components/icons/money-icon.d.ts +3 -0
  93. package/dist/components/icons/monitoring-icon.d.ts +3 -0
  94. package/dist/components/icons/more-icon.d.ts +3 -0
  95. package/dist/components/icons/notifications-icon.d.ts +3 -0
  96. package/dist/components/icons/open-in-new-icon.d.ts +3 -0
  97. package/dist/components/icons/palette-icon.d.ts +3 -0
  98. package/dist/components/icons/password-icon.d.ts +3 -0
  99. package/dist/components/icons/pending-icon.d.ts +3 -0
  100. package/dist/components/icons/person-add-icon.d.ts +3 -0
  101. package/dist/components/icons/person-search-icon.d.ts +3 -0
  102. package/dist/components/icons/photo-icon.d.ts +3 -0
  103. package/dist/components/icons/plus-icon.d.ts +3 -0
  104. package/dist/components/icons/policy-icon.d.ts +3 -0
  105. package/dist/components/icons/publish-icon.d.ts +3 -0
  106. package/dist/components/icons/ready-icon.d.ts +3 -0
  107. package/dist/components/icons/receipt-icon.d.ts +3 -0
  108. package/dist/components/icons/receive-icon.d.ts +3 -0
  109. package/dist/components/icons/refresh-icon.d.ts +3 -0
  110. package/dist/components/icons/search-icon.d.ts +3 -0
  111. package/dist/components/icons/see-icon.d.ts +3 -0
  112. package/dist/components/icons/send-icon.d.ts +3 -0
  113. package/dist/components/icons/settings-icon.d.ts +3 -0
  114. package/dist/components/icons/shield-icon.d.ts +3 -0
  115. package/dist/components/icons/swap-horiz-icon.d.ts +3 -0
  116. package/dist/components/icons/tag-icon.d.ts +3 -0
  117. package/dist/components/icons/trash-icon.d.ts +3 -0
  118. package/dist/components/layout/toaster/toaster.d.ts +1 -1
  119. package/dist/components/layout/toaster/toaster.stories.d.ts +1 -1
  120. package/dist/components/ui/accordion/accordion.d.ts +1 -1
  121. package/dist/components/ui/accordion/accordion.stories.d.ts +1 -1
  122. package/dist/components/ui/accordion-rounded/accordion-rounded.d.ts +1 -1
  123. package/dist/components/ui/accordion-rounded/accordion-rounded.stories.d.ts +1 -1
  124. package/dist/components/ui/alert/alert.stories.d.ts +1 -1
  125. package/dist/components/ui/avatar/avatar.d.ts +1 -1
  126. package/dist/components/ui/avatar/avatar.stories.d.ts +1 -1
  127. package/dist/components/ui/badge/badge.stories.d.ts +1 -1
  128. package/dist/components/ui/breadcrumb/breadcrumb.stories.d.ts +1 -1
  129. package/dist/components/ui/button/button.stories.d.ts +1 -1
  130. package/dist/components/ui/button-group/button-group.d.ts +1 -1
  131. package/dist/components/ui/button-group/button-group.stories.d.ts +1 -1
  132. package/dist/components/ui/calendar/calendar.d.ts +1 -1
  133. package/dist/components/ui/calendar/calendar.stories.d.ts +1 -1
  134. package/dist/components/ui/card/card.stories.d.ts +1 -1
  135. package/dist/components/ui/checkbox/checkbox.d.ts +1 -1
  136. package/dist/components/ui/checkbox/checkbox.stories.d.ts +1 -1
  137. package/dist/components/ui/collapsible/collapsible.stories.d.ts +1 -1
  138. package/dist/components/ui/combobox/combobox.stories.d.ts +1 -1
  139. package/dist/components/ui/command/command.d.ts +1 -1
  140. package/dist/components/ui/context-menu/context-menu.d.ts +1 -1
  141. package/dist/components/ui/context-menu/context-menu.stories.d.ts +1 -1
  142. package/dist/components/ui/dialog/dialog.d.ts +1 -1
  143. package/dist/components/ui/dialog/dialog.stories.d.ts +1 -1
  144. package/dist/components/ui/dropdown-menu/dropdown-menu.d.ts +1 -1
  145. package/dist/components/ui/dropdown-menu/dropdown-menu.stories.d.ts +1 -1
  146. package/dist/components/ui/field/field.d.ts +1 -1
  147. package/dist/components/ui/field/field.stories.d.ts +1 -1
  148. package/dist/components/ui/hover-card/hover-card.d.ts +1 -1
  149. package/dist/components/ui/hover-card/hover-card.stories.d.ts +1 -1
  150. package/dist/components/ui/input/input.stories.d.ts +1 -1
  151. package/dist/components/ui/input-group/Input-group.stories.d.ts +1 -1
  152. package/dist/components/ui/input-group/input-group.d.ts +1 -1
  153. package/dist/components/ui/kbd/kbd.stories.d.ts +1 -1
  154. package/dist/components/ui/label/label.d.ts +1 -1
  155. package/dist/components/ui/label/label.stories.d.ts +1 -1
  156. package/dist/components/ui/pagination/pagination.stories.d.ts +1 -1
  157. package/dist/components/ui/popover/popover.d.ts +1 -1
  158. package/dist/components/ui/popover/popover.stories.d.ts +1 -1
  159. package/dist/components/ui/progress/progress.d.ts +1 -1
  160. package/dist/components/ui/progress/progress.stories.d.ts +1 -1
  161. package/dist/components/ui/radio-group/radio-group.d.ts +1 -1
  162. package/dist/components/ui/radio-group/radio-group.stories.d.ts +1 -1
  163. package/dist/components/ui/scroll-area/scroll-area.d.ts +1 -1
  164. package/dist/components/ui/scroll-area/scroll-area.stories.d.ts +1 -1
  165. package/dist/components/ui/select/select.d.ts +1 -1
  166. package/dist/components/ui/select/select.stories.d.ts +1 -1
  167. package/dist/components/ui/separator/separator.d.ts +1 -1
  168. package/dist/components/ui/separator/separator.stories.d.ts +1 -1
  169. package/dist/components/ui/sheet/sheet.d.ts +1 -1
  170. package/dist/components/ui/sheet/sheet.stories.d.ts +1 -1
  171. package/dist/components/ui/skeleton/skeleton.stories.d.ts +1 -1
  172. package/dist/components/ui/slider/slider.d.ts +1 -1
  173. package/dist/components/ui/slider/slider.stories.d.ts +1 -1
  174. package/dist/components/ui/spinner/spinner.stories.d.ts +1 -1
  175. package/dist/components/ui/switch/switch.d.ts +1 -1
  176. package/dist/components/ui/switch/switch.stories.d.ts +1 -1
  177. package/dist/components/ui/tabs/tabs.d.ts +1 -1
  178. package/dist/components/ui/tabs/tabs.stories.d.ts +1 -1
  179. package/dist/components/ui/tabs-underline/tabs-underline.d.ts +1 -1
  180. package/dist/components/ui/tabs-underline/tabs-underline.stories.d.ts +1 -1
  181. package/dist/components/ui/textarea/textarea.stories.d.ts +1 -1
  182. package/dist/components/ui/toggle/toggle.d.ts +1 -1
  183. package/dist/components/ui/toggle/toggle.stories.d.ts +1 -1
  184. package/dist/components/ui/tooltip/tooltip.d.ts +1 -1
  185. package/dist/components/ui/tooltip/tooltip.stories.d.ts +1 -1
  186. package/dist/context-menu.cjs +79 -1
  187. package/dist/context-menu.js +101 -11
  188. package/dist/custom-layered-styles.css +1 -1
  189. package/dist/dialog.cjs +30 -1
  190. package/dist/dialog.js +35 -6
  191. package/dist/dropdown-menu.cjs +79 -1
  192. package/dist/dropdown-menu.js +101 -11
  193. package/dist/field.cjs +66 -1
  194. package/dist/field.js +91 -26
  195. package/dist/hover-card.cjs +15 -1
  196. package/dist/hover-card.js +15 -1
  197. package/dist/icons.cjs +1 -0
  198. package/dist/icons.js +1507 -0
  199. package/dist/input-BQZUpTEY.js +42 -0
  200. package/dist/input-DSmxdfq5.cjs +21 -0
  201. package/dist/input-group.cjs +76 -1
  202. package/dist/input-group.js +99 -24
  203. package/dist/input.cjs +1 -1
  204. package/dist/input.js +1 -1
  205. package/dist/kbd.cjs +10 -1
  206. package/dist/kbd.js +11 -2
  207. package/dist/{label-CmwGvhy1.js → label-BJ8Yf6Ft.js} +7 -1
  208. package/dist/{label-BjXORCBM.cjs → label-CNGQhi5L.cjs} +7 -1
  209. package/dist/label.cjs +1 -1
  210. package/dist/label.js +1 -1
  211. package/dist/pagination.cjs +13 -1
  212. package/dist/pagination.js +30 -6
  213. package/dist/{popover-FCKBtFo-.cjs → popover-CYbik-H4.cjs} +15 -1
  214. package/dist/{popover-3rIoNCXs.js → popover-DAwH8jUh.js} +15 -1
  215. package/dist/popover.cjs +1 -1
  216. package/dist/popover.js +1 -1
  217. package/dist/radio-group.cjs +14 -1
  218. package/dist/radio-group.js +20 -2
  219. package/dist/select.cjs +68 -1
  220. package/dist/select.js +83 -10
  221. package/dist/{separator-BaZqZZ9R.cjs → separator-Brpax0EI.cjs} +7 -1
  222. package/dist/{separator-DR7lQjv9.js → separator-DVypR3Qf.js} +7 -1
  223. package/dist/separator.cjs +1 -1
  224. package/dist/separator.js +1 -1
  225. package/dist/sheet-CGahUP7F.cjs +41 -0
  226. package/dist/sheet-Q3dBOQG-.js +174 -0
  227. package/dist/sheet.cjs +1 -1
  228. package/dist/sheet.js +1 -1
  229. package/dist/sidebar.cjs +20 -2
  230. package/dist/sidebar.js +58 -26
  231. package/dist/skeleton.cjs +1 -1
  232. package/dist/skeleton.js +1 -1
  233. package/dist/slider.cjs +27 -1
  234. package/dist/slider.js +30 -4
  235. package/dist/space.css +1 -1
  236. package/dist/styles.css +1 -1
  237. package/dist/switch.cjs +18 -1
  238. package/dist/switch.js +19 -2
  239. package/dist/table.cjs +20 -1
  240. package/dist/table.js +26 -7
  241. package/dist/tabs-underline.cjs +21 -1
  242. package/dist/tabs-underline.js +23 -3
  243. package/dist/tabs.cjs +22 -1
  244. package/dist/tabs.js +24 -3
  245. package/dist/textarea-CG7iQcb3.cjs +14 -0
  246. package/dist/textarea-CUPWKl-S.js +32 -0
  247. package/dist/textarea.cjs +1 -1
  248. package/dist/textarea.js +1 -1
  249. package/dist/toaster.cjs +4 -1
  250. package/dist/toaster.js +9 -6
  251. package/dist/toggle.cjs +17 -1
  252. package/dist/toggle.js +25 -9
  253. package/dist/tooltip.cjs +16 -1
  254. package/dist/tooltip.js +22 -2
  255. package/dist/typography.cjs +1 -1
  256. package/dist/typography.js +6 -6
  257. package/docs/AI-GUIDE.md +321 -321
  258. package/docs/components/layout/sidebar.md +404 -404
  259. package/docs/components/layout/toaster.md +436 -436
  260. package/docs/components/ui/accordion-rounded.md +583 -583
  261. package/docs/components/ui/accordion.md +267 -267
  262. package/docs/components/ui/alert.md +671 -671
  263. package/docs/components/ui/avatar.md +588 -588
  264. package/docs/components/ui/badge.md +1024 -1024
  265. package/docs/components/ui/button-group.md +1002 -1002
  266. package/docs/components/ui/button.md +1078 -1078
  267. package/docs/components/ui/calendar.md +1159 -1159
  268. package/docs/components/ui/card.md +1265 -1265
  269. package/docs/components/ui/checkbox.md +292 -292
  270. package/docs/components/ui/collapsible.md +320 -320
  271. package/docs/components/ui/command.md +454 -454
  272. package/docs/components/ui/context-menu.md +540 -540
  273. package/docs/components/ui/dialog.md +628 -628
  274. package/docs/components/ui/dropdown-menu.md +731 -731
  275. package/docs/components/ui/field.md +706 -706
  276. package/docs/components/ui/hover-card.md +446 -446
  277. package/docs/components/ui/input-group.md +509 -509
  278. package/docs/components/ui/input.md +362 -362
  279. package/docs/components/ui/kbd.md +434 -434
  280. package/docs/components/ui/label.md +359 -359
  281. package/docs/components/ui/pagination.md +650 -650
  282. package/docs/components/ui/popover.md +536 -536
  283. package/docs/components/ui/progress.md +182 -182
  284. package/docs/components/ui/radio-group.md +311 -311
  285. package/docs/components/ui/select.md +352 -352
  286. package/docs/components/ui/separator.md +214 -214
  287. package/docs/components/ui/sheet.md +142 -142
  288. package/docs/components/ui/skeleton.md +140 -140
  289. package/docs/components/ui/slider.md +341 -341
  290. package/docs/components/ui/spinner.md +170 -170
  291. package/docs/components/ui/switch.md +402 -402
  292. package/docs/components/ui/table.md +183 -183
  293. package/docs/components/ui/tabs-underline.md +106 -106
  294. package/docs/components/ui/tabs.md +122 -122
  295. package/docs/components/ui/textarea.md +243 -243
  296. package/docs/components/ui/toggle.md +243 -243
  297. package/docs/components/ui/tooltip.md +320 -320
  298. package/docs/components/ui/typography.md +191 -191
  299. package/package.json +7 -1
  300. package/dist/button-2GdKenQI.js +0 -58
  301. package/dist/button-DEQVHMrX.cjs +0 -1
  302. package/dist/input-BF73maXg.cjs +0 -1
  303. package/dist/input-C04hsVXE.js +0 -22
  304. package/dist/sheet-B-9YHdR5.js +0 -128
  305. package/dist/sheet-CU-sFSaJ.cjs +0 -1
  306. package/dist/textarea-3ZdbFRDN.cjs +0 -1
  307. package/dist/textarea-BZbcAAAu.js +0 -19
@@ -1,402 +1,402 @@
1
- # Switch
2
-
3
- Toggle binario on/off. Basado en Radix UI con animación de thumb.
4
-
5
- ## Descripción
6
-
7
- El componente `Switch` es un control de toggle que representa un estado booleano (on/off).
8
-
9
- ## Importación
10
-
11
- ```typescript
12
- import { Switch } from "@adamosuiteservices/ui/switch";
13
- ```
14
-
15
- ## Anatomía
16
-
17
- ```tsx
18
- <Switch />
19
- ```
20
-
21
- **Componentes**: 1 (Switch) con thumb interno
22
-
23
- ## Props
24
-
25
- | Prop | Tipo | Descripción |
26
- | ----------------- | ---------------------------- | ----------------------------- |
27
- | `defaultChecked` | `boolean` | Estado inicial (uncontrolled) |
28
- | `checked` | `boolean` | Estado controlado |
29
- | `onCheckedChange` | `(checked: boolean) => void` | Callback al cambiar |
30
- | `disabled` | `boolean` | Deshabilita el switch |
31
- | `required` | `boolean` | Campo requerido |
32
- | `name` | `string` | Nombre (formularios) |
33
- | `value` | `string` | Valor (formularios) |
34
- | `id` | `string` | ID para asociar con Label |
35
- | `className` | `string` | Clases CSS adicionales |
36
-
37
- **Nota**: Acepta todas las props de Radix UI Switch.Root
38
-
39
- ## Patrones de Uso
40
-
41
- ### Básico
42
-
43
- ```tsx
44
- import { Switch } from "@adamosuiteservices/ui/switch";
45
-
46
- <Switch />;
47
- ```
48
-
49
- ### Con Label
50
-
51
- ```tsx
52
- import { Label } from "@adamosuiteservices/ui/label";
53
-
54
- <div className="flex items-center space-x-2">
55
- <Switch id="airplane-mode" />
56
- <Label htmlFor="airplane-mode">Airplane Mode</Label>
57
- </div>;
58
- ```
59
-
60
- ### Controlado
61
-
62
- ```tsx
63
- import { useState } from "react";
64
-
65
- function App() {
66
- const [isChecked, setIsChecked] = useState(false);
67
-
68
- return (
69
- <div className="flex items-center space-x-2">
70
- <Switch
71
- id="controlled-switch"
72
- checked={isChecked}
73
- onCheckedChange={setIsChecked}
74
- />
75
- <Label htmlFor="controlled-switch">
76
- Notifications {isChecked ? "enabled" : "disabled"}
77
- </Label>
78
- </div>
79
- );
80
- }
81
- ```
82
-
83
- ### Con Iconos y Badges
84
-
85
- ```tsx
86
- import { BellIcon, MoonIcon, WifiIcon } from "lucide-react";
87
- import { Badge } from "@adamosuiteservices/ui/badge";
88
-
89
- function Settings() {
90
- const [settings, setSettings] = useState({
91
- notifications: true,
92
- darkMode: false,
93
- wifi: true,
94
- });
95
-
96
- return (
97
- <div className="space-y-4">
98
- <div className="flex items-center space-x-3">
99
- <BellIcon className="size-4 text-muted-foreground" />
100
- <Switch
101
- checked={settings.notifications}
102
- onCheckedChange={(checked) =>
103
- setSettings((prev) => ({ ...prev, notifications: checked }))
104
- }
105
- />
106
- <Label>Notifications</Label>
107
- <Badge variant={settings.notifications ? "default" : "secondary"}>
108
- {settings.notifications ? "On" : "Off"}
109
- </Badge>
110
- </div>
111
-
112
- <div className="flex items-center space-x-3">
113
- <MoonIcon className="size-4 text-muted-foreground" />
114
- <Switch
115
- checked={settings.darkMode}
116
- onCheckedChange={(checked) =>
117
- setSettings((prev) => ({ ...prev, darkMode: checked }))
118
- }
119
- />
120
- <Label>Dark Mode</Label>
121
- <Badge variant={settings.darkMode ? "default" : "secondary"}>
122
- {settings.darkMode ? "On" : "Off"}
123
- </Badge>
124
- </div>
125
- </div>
126
- );
127
- }
128
- ```
129
-
130
- ### Device Controls
131
-
132
- ```tsx
133
- import {
134
- Card,
135
- CardContent,
136
- CardDescription,
137
- CardHeader,
138
- CardTitle,
139
- } from "@adamosuiteservices/ui/card";
140
- import { AirplayIcon, WifiIcon, BluetoothIcon } from "lucide-react";
141
-
142
- function ControlCenter() {
143
- const [deviceSettings, setDeviceSettings] = useState({
144
- airplaneMode: false,
145
- wifi: true,
146
- bluetooth: false,
147
- });
148
-
149
- const updateSetting = (key: keyof typeof deviceSettings) => {
150
- setDeviceSettings((prev) => ({ ...prev, [key]: !prev[key] }));
151
- };
152
-
153
- return (
154
- <Card className="w-full max-w-sm">
155
- <CardHeader>
156
- <CardTitle>Control Center</CardTitle>
157
- <CardDescription>Quick access to device settings</CardDescription>
158
- </CardHeader>
159
- <CardContent className="space-y-4">
160
- <div className="grid grid-cols-2 gap-4">
161
- <div className="flex flex-col items-center space-y-2 p-3 border rounded-lg">
162
- <AirplayIcon className="size-6 text-muted-foreground" />
163
- <span className="text-sm font-medium">Airplane</span>
164
- <Switch
165
- checked={deviceSettings.airplaneMode}
166
- onCheckedChange={() => updateSetting("airplaneMode")}
167
- className="scale-75"
168
- />
169
- </div>
170
-
171
- <div className="flex flex-col items-center space-y-2 p-3 border rounded-lg">
172
- <WifiIcon className="size-6 text-muted-foreground" />
173
- <span className="text-sm font-medium">Wi-Fi</span>
174
- <Switch
175
- checked={deviceSettings.wifi}
176
- onCheckedChange={() => updateSetting("wifi")}
177
- className="scale-75"
178
- />
179
- </div>
180
-
181
- <div className="flex flex-col items-center space-y-2 p-3 border rounded-lg">
182
- <BluetoothIcon className="size-6 text-muted-foreground" />
183
- <span className="text-sm font-medium">Bluetooth</span>
184
- <Switch
185
- checked={deviceSettings.bluetooth}
186
- onCheckedChange={() => updateSetting("bluetooth")}
187
- className="scale-75"
188
- />
189
- </div>
190
- </div>
191
- </CardContent>
192
- </Card>
193
- );
194
- }
195
- ```
196
-
197
- ### Privacy Settings
198
-
199
- ```tsx
200
- import { ShieldIcon } from "lucide-react";
201
- import { Button } from "@adamosuiteservices/ui/button";
202
-
203
- function PrivacySettings() {
204
- const [privacySettings, setPrivacySettings] = useState({
205
- locationServices: true,
206
- analyticsData: false,
207
- crashReports: true,
208
- personalizedAds: false,
209
- });
210
-
211
- return (
212
- <Card className="w-full max-w-lg">
213
- <CardHeader>
214
- <CardTitle className="flex items-center space-x-2">
215
- <ShieldIcon className="size-5" />
216
- <span>Privacy & Security</span>
217
- </CardTitle>
218
- <CardDescription>
219
- Control how your data is collected and used
220
- </CardDescription>
221
- </CardHeader>
222
- <CardContent className="space-y-6">
223
- <div className="space-y-4">
224
- <div className="flex items-start justify-between space-x-4">
225
- <div className="flex-1">
226
- <Label className="text-sm font-medium">Location Services</Label>
227
- <p className="text-xs text-muted-foreground mt-1">
228
- Allow apps to access your location for personalized experiences
229
- </p>
230
- </div>
231
- <Switch
232
- checked={privacySettings.locationServices}
233
- onCheckedChange={(checked) =>
234
- setPrivacySettings((prev) => ({
235
- ...prev,
236
- locationServices: checked,
237
- }))
238
- }
239
- />
240
- </div>
241
-
242
- <div className="flex items-start justify-between space-x-4">
243
- <div className="flex-1">
244
- <Label className="text-sm font-medium">
245
- Analytics & Diagnostics
246
- </Label>
247
- <p className="text-xs text-muted-foreground mt-1">
248
- Share analytics data to help improve our products
249
- </p>
250
- </div>
251
- <Switch
252
- checked={privacySettings.analyticsData}
253
- onCheckedChange={(checked) =>
254
- setPrivacySettings((prev) => ({
255
- ...prev,
256
- analyticsData: checked,
257
- }))
258
- }
259
- />
260
- </div>
261
- </div>
262
-
263
- <div className="flex justify-end space-x-2 pt-4 border-t">
264
- <Button variant="outline" size="sm">
265
- Reset to Defaults
266
- </Button>
267
- <Button size="sm">Save Changes</Button>
268
- </div>
269
- </CardContent>
270
- </Card>
271
- );
272
- }
273
- ```
274
-
275
- ### Feature Toggles
276
-
277
- ```tsx
278
- function FeatureToggles() {
279
- const [features, setFeatures] = useState({
280
- newDashboard: false,
281
- betaFeatures: false,
282
- experimentalUI: false,
283
- });
284
-
285
- const updateFeature = (key: keyof typeof features) => {
286
- setFeatures((prev) => ({ ...prev, [key]: !prev[key] }));
287
- };
288
-
289
- return (
290
- <Card className="w-full max-w-lg">
291
- <CardHeader>
292
- <CardTitle>Feature Toggles</CardTitle>
293
- <CardDescription>
294
- Enable or disable experimental features
295
- </CardDescription>
296
- </CardHeader>
297
- <CardContent className="space-y-4">
298
- <div className="flex items-start justify-between space-x-4 p-3 border rounded-lg">
299
- <div className="flex-1 space-y-1">
300
- <div className="flex items-center space-x-2">
301
- <Label className="text-sm font-medium">New Dashboard</Label>
302
- <Badge variant="default" className="text-xs">
303
- New
304
- </Badge>
305
- </div>
306
- <p className="text-xs text-muted-foreground">
307
- Try our redesigned dashboard interface
308
- </p>
309
- </div>
310
- <Switch
311
- checked={features.newDashboard}
312
- onCheckedChange={() => updateFeature("newDashboard")}
313
- />
314
- </div>
315
-
316
- <div className="flex items-start justify-between space-x-4 p-3 border rounded-lg">
317
- <div className="flex-1 space-y-1">
318
- <div className="flex items-center space-x-2">
319
- <Label className="text-sm font-medium">Beta Features</Label>
320
- <Badge variant="secondary" className="text-xs">
321
- Beta
322
- </Badge>
323
- </div>
324
- <p className="text-xs text-muted-foreground">
325
- Access features currently in beta testing
326
- </p>
327
- </div>
328
- <Switch
329
- checked={features.betaFeatures}
330
- onCheckedChange={() => updateFeature("betaFeatures")}
331
- />
332
- </div>
333
- </CardContent>
334
- </Card>
335
- );
336
- }
337
- ```
338
-
339
- ### Deshabilitado
340
-
341
- ```tsx
342
- <div className="space-y-4">
343
- <div className="flex items-center space-x-2">
344
- <Switch disabled />
345
- <Label className="text-muted-foreground">Disabled (off)</Label>
346
- </div>
347
- <div className="flex items-center space-x-2">
348
- <Switch disabled checked />
349
- <Label className="text-muted-foreground">Disabled (on)</Label>
350
- </div>
351
- </div>
352
- ```
353
-
354
- ## Casos de Uso
355
-
356
- **Settings**: On/off toggles para configuración
357
- **Feature flags**: Activar/desactivar features
358
- **Notifications**: Habilitar/deshabilitar notificaciones
359
- **Privacy**: Controles de privacidad y permisos
360
- **Device controls**: Wi-Fi, Bluetooth, Airplane mode
361
- **Filters**: Mostrar/ocultar contenido
362
-
363
- ## Estilos Base
364
-
365
- - **Size**: `h-5 w-8`
366
- - **Checked bg**: `bg-primary`
367
- - **Unchecked bg**: `bg-input` (dark: `bg-input/80`)
368
- - **Thumb**: `size-4` con `bg-background`
369
- - **Thumb checked**: `translate-x-[calc(100%-2px)]`
370
- - **Thumb unchecked**: `translate-x-0`
371
- - **Focus**: `ring-ring/50` con `ring-[3px]`
372
- - **Transition**: `transition-all` en thumb y background
373
-
374
- ## Accesibilidad
375
-
376
- - ✅ **Role**: `role="switch"` con `aria-checked`
377
- - ✅ **Keyboard**: Space/Enter para toggle
378
- - ✅ **Focus**: Focus ring visible
379
- - ✅ **Label**: Asociar con `htmlFor` e `id`
380
- - ✅ **State**: Screen readers anuncian checked/unchecked
381
-
382
- ## Notas de Implementación
383
-
384
- - **Radix UI**: Basado en `@radix-ui/react-switch`
385
- - **Peer class**: Usa `peer` para estilos relacionados con Label
386
- - **Data states**: `data-state="checked|unchecked"` para estilos
387
- - **Controlled**: Usa `checked` + `onCheckedChange`
388
- - **Uncontrolled**: Usa `defaultChecked`
389
- - **Dark mode**: Thumb color cambia automáticamente
390
-
391
- ## Troubleshooting
392
-
393
- **No cambia estado**: En modo controlado usa `checked` + `onCheckedChange`, no `defaultChecked`
394
- **Label no clickeable**: Asegura `htmlFor` en Label coincida con `id` del Switch
395
- **Thumb no anima**: Verifica que estilos de `transition-transform` no estén sobrescritos
396
- **Color incorrecto**: Switch usa `bg-primary` checked, `bg-input` unchecked
397
- **Disabled no funciona**: Prop `disabled` deshabilita interacción
398
-
399
- ## Referencias
400
-
401
- - **Radix UI Switch**: <https://www.radix-ui.com/primitives/docs/components/switch>
402
- - **shadcn/ui Switch**: <https://ui.shadcn.com/docs/components/switch>
1
+ # Switch
2
+
3
+ Toggle binario on/off. Basado en Radix UI con animación de thumb.
4
+
5
+ ## Descripción
6
+
7
+ El componente `Switch` es un control de toggle que representa un estado booleano (on/off).
8
+
9
+ ## Importación
10
+
11
+ ```typescript
12
+ import { Switch } from "@adamosuiteservices/ui/switch";
13
+ ```
14
+
15
+ ## Anatomía
16
+
17
+ ```tsx
18
+ <Switch />
19
+ ```
20
+
21
+ **Componentes**: 1 (Switch) con thumb interno
22
+
23
+ ## Props
24
+
25
+ | Prop | Tipo | Descripción |
26
+ | ----------------- | ---------------------------- | ----------------------------- |
27
+ | `defaultChecked` | `boolean` | Estado inicial (uncontrolled) |
28
+ | `checked` | `boolean` | Estado controlado |
29
+ | `onCheckedChange` | `(checked: boolean) => void` | Callback al cambiar |
30
+ | `disabled` | `boolean` | Deshabilita el switch |
31
+ | `required` | `boolean` | Campo requerido |
32
+ | `name` | `string` | Nombre (formularios) |
33
+ | `value` | `string` | Valor (formularios) |
34
+ | `id` | `string` | ID para asociar con Label |
35
+ | `className` | `string` | Clases CSS adicionales |
36
+
37
+ **Nota**: Acepta todas las props de Radix UI Switch.Root
38
+
39
+ ## Patrones de Uso
40
+
41
+ ### Básico
42
+
43
+ ```tsx
44
+ import { Switch } from "@adamosuiteservices/ui/switch";
45
+
46
+ <Switch />;
47
+ ```
48
+
49
+ ### Con Label
50
+
51
+ ```tsx
52
+ import { Label } from "@adamosuiteservices/ui/label";
53
+
54
+ <div className="flex items-center space-x-2">
55
+ <Switch id="airplane-mode" />
56
+ <Label htmlFor="airplane-mode">Airplane Mode</Label>
57
+ </div>;
58
+ ```
59
+
60
+ ### Controlado
61
+
62
+ ```tsx
63
+ import { useState } from "react";
64
+
65
+ function App() {
66
+ const [isChecked, setIsChecked] = useState(false);
67
+
68
+ return (
69
+ <div className="flex items-center space-x-2">
70
+ <Switch
71
+ id="controlled-switch"
72
+ checked={isChecked}
73
+ onCheckedChange={setIsChecked}
74
+ />
75
+ <Label htmlFor="controlled-switch">
76
+ Notifications {isChecked ? "enabled" : "disabled"}
77
+ </Label>
78
+ </div>
79
+ );
80
+ }
81
+ ```
82
+
83
+ ### Con Iconos y Badges
84
+
85
+ ```tsx
86
+ import { BellIcon, MoonIcon, WifiIcon } from "lucide-react";
87
+ import { Badge } from "@adamosuiteservices/ui/badge";
88
+
89
+ function Settings() {
90
+ const [settings, setSettings] = useState({
91
+ notifications: true,
92
+ darkMode: false,
93
+ wifi: true,
94
+ });
95
+
96
+ return (
97
+ <div className="space-y-4">
98
+ <div className="flex items-center space-x-3">
99
+ <BellIcon className="size-4 text-muted-foreground" />
100
+ <Switch
101
+ checked={settings.notifications}
102
+ onCheckedChange={(checked) =>
103
+ setSettings((prev) => ({ ...prev, notifications: checked }))
104
+ }
105
+ />
106
+ <Label>Notifications</Label>
107
+ <Badge variant={settings.notifications ? "default" : "secondary"}>
108
+ {settings.notifications ? "On" : "Off"}
109
+ </Badge>
110
+ </div>
111
+
112
+ <div className="flex items-center space-x-3">
113
+ <MoonIcon className="size-4 text-muted-foreground" />
114
+ <Switch
115
+ checked={settings.darkMode}
116
+ onCheckedChange={(checked) =>
117
+ setSettings((prev) => ({ ...prev, darkMode: checked }))
118
+ }
119
+ />
120
+ <Label>Dark Mode</Label>
121
+ <Badge variant={settings.darkMode ? "default" : "secondary"}>
122
+ {settings.darkMode ? "On" : "Off"}
123
+ </Badge>
124
+ </div>
125
+ </div>
126
+ );
127
+ }
128
+ ```
129
+
130
+ ### Device Controls
131
+
132
+ ```tsx
133
+ import {
134
+ Card,
135
+ CardContent,
136
+ CardDescription,
137
+ CardHeader,
138
+ CardTitle,
139
+ } from "@adamosuiteservices/ui/card";
140
+ import { AirplayIcon, WifiIcon, BluetoothIcon } from "lucide-react";
141
+
142
+ function ControlCenter() {
143
+ const [deviceSettings, setDeviceSettings] = useState({
144
+ airplaneMode: false,
145
+ wifi: true,
146
+ bluetooth: false,
147
+ });
148
+
149
+ const updateSetting = (key: keyof typeof deviceSettings) => {
150
+ setDeviceSettings((prev) => ({ ...prev, [key]: !prev[key] }));
151
+ };
152
+
153
+ return (
154
+ <Card className="w-full max-w-sm">
155
+ <CardHeader>
156
+ <CardTitle>Control Center</CardTitle>
157
+ <CardDescription>Quick access to device settings</CardDescription>
158
+ </CardHeader>
159
+ <CardContent className="space-y-4">
160
+ <div className="grid grid-cols-2 gap-4">
161
+ <div className="flex flex-col items-center space-y-2 p-3 border rounded-lg">
162
+ <AirplayIcon className="size-6 text-muted-foreground" />
163
+ <span className="text-sm font-medium">Airplane</span>
164
+ <Switch
165
+ checked={deviceSettings.airplaneMode}
166
+ onCheckedChange={() => updateSetting("airplaneMode")}
167
+ className="scale-75"
168
+ />
169
+ </div>
170
+
171
+ <div className="flex flex-col items-center space-y-2 p-3 border rounded-lg">
172
+ <WifiIcon className="size-6 text-muted-foreground" />
173
+ <span className="text-sm font-medium">Wi-Fi</span>
174
+ <Switch
175
+ checked={deviceSettings.wifi}
176
+ onCheckedChange={() => updateSetting("wifi")}
177
+ className="scale-75"
178
+ />
179
+ </div>
180
+
181
+ <div className="flex flex-col items-center space-y-2 p-3 border rounded-lg">
182
+ <BluetoothIcon className="size-6 text-muted-foreground" />
183
+ <span className="text-sm font-medium">Bluetooth</span>
184
+ <Switch
185
+ checked={deviceSettings.bluetooth}
186
+ onCheckedChange={() => updateSetting("bluetooth")}
187
+ className="scale-75"
188
+ />
189
+ </div>
190
+ </div>
191
+ </CardContent>
192
+ </Card>
193
+ );
194
+ }
195
+ ```
196
+
197
+ ### Privacy Settings
198
+
199
+ ```tsx
200
+ import { ShieldIcon } from "lucide-react";
201
+ import { Button } from "@adamosuiteservices/ui/button";
202
+
203
+ function PrivacySettings() {
204
+ const [privacySettings, setPrivacySettings] = useState({
205
+ locationServices: true,
206
+ analyticsData: false,
207
+ crashReports: true,
208
+ personalizedAds: false,
209
+ });
210
+
211
+ return (
212
+ <Card className="w-full max-w-lg">
213
+ <CardHeader>
214
+ <CardTitle className="flex items-center space-x-2">
215
+ <ShieldIcon className="size-5" />
216
+ <span>Privacy & Security</span>
217
+ </CardTitle>
218
+ <CardDescription>
219
+ Control how your data is collected and used
220
+ </CardDescription>
221
+ </CardHeader>
222
+ <CardContent className="space-y-6">
223
+ <div className="space-y-4">
224
+ <div className="flex items-start justify-between space-x-4">
225
+ <div className="flex-1">
226
+ <Label className="text-sm font-medium">Location Services</Label>
227
+ <p className="text-xs text-muted-foreground mt-1">
228
+ Allow apps to access your location for personalized experiences
229
+ </p>
230
+ </div>
231
+ <Switch
232
+ checked={privacySettings.locationServices}
233
+ onCheckedChange={(checked) =>
234
+ setPrivacySettings((prev) => ({
235
+ ...prev,
236
+ locationServices: checked,
237
+ }))
238
+ }
239
+ />
240
+ </div>
241
+
242
+ <div className="flex items-start justify-between space-x-4">
243
+ <div className="flex-1">
244
+ <Label className="text-sm font-medium">
245
+ Analytics & Diagnostics
246
+ </Label>
247
+ <p className="text-xs text-muted-foreground mt-1">
248
+ Share analytics data to help improve our products
249
+ </p>
250
+ </div>
251
+ <Switch
252
+ checked={privacySettings.analyticsData}
253
+ onCheckedChange={(checked) =>
254
+ setPrivacySettings((prev) => ({
255
+ ...prev,
256
+ analyticsData: checked,
257
+ }))
258
+ }
259
+ />
260
+ </div>
261
+ </div>
262
+
263
+ <div className="flex justify-end space-x-2 pt-4 border-t">
264
+ <Button variant="outline" size="sm">
265
+ Reset to Defaults
266
+ </Button>
267
+ <Button size="sm">Save Changes</Button>
268
+ </div>
269
+ </CardContent>
270
+ </Card>
271
+ );
272
+ }
273
+ ```
274
+
275
+ ### Feature Toggles
276
+
277
+ ```tsx
278
+ function FeatureToggles() {
279
+ const [features, setFeatures] = useState({
280
+ newDashboard: false,
281
+ betaFeatures: false,
282
+ experimentalUI: false,
283
+ });
284
+
285
+ const updateFeature = (key: keyof typeof features) => {
286
+ setFeatures((prev) => ({ ...prev, [key]: !prev[key] }));
287
+ };
288
+
289
+ return (
290
+ <Card className="w-full max-w-lg">
291
+ <CardHeader>
292
+ <CardTitle>Feature Toggles</CardTitle>
293
+ <CardDescription>
294
+ Enable or disable experimental features
295
+ </CardDescription>
296
+ </CardHeader>
297
+ <CardContent className="space-y-4">
298
+ <div className="flex items-start justify-between space-x-4 p-3 border rounded-lg">
299
+ <div className="flex-1 space-y-1">
300
+ <div className="flex items-center space-x-2">
301
+ <Label className="text-sm font-medium">New Dashboard</Label>
302
+ <Badge variant="default" className="text-xs">
303
+ New
304
+ </Badge>
305
+ </div>
306
+ <p className="text-xs text-muted-foreground">
307
+ Try our redesigned dashboard interface
308
+ </p>
309
+ </div>
310
+ <Switch
311
+ checked={features.newDashboard}
312
+ onCheckedChange={() => updateFeature("newDashboard")}
313
+ />
314
+ </div>
315
+
316
+ <div className="flex items-start justify-between space-x-4 p-3 border rounded-lg">
317
+ <div className="flex-1 space-y-1">
318
+ <div className="flex items-center space-x-2">
319
+ <Label className="text-sm font-medium">Beta Features</Label>
320
+ <Badge variant="secondary" className="text-xs">
321
+ Beta
322
+ </Badge>
323
+ </div>
324
+ <p className="text-xs text-muted-foreground">
325
+ Access features currently in beta testing
326
+ </p>
327
+ </div>
328
+ <Switch
329
+ checked={features.betaFeatures}
330
+ onCheckedChange={() => updateFeature("betaFeatures")}
331
+ />
332
+ </div>
333
+ </CardContent>
334
+ </Card>
335
+ );
336
+ }
337
+ ```
338
+
339
+ ### Deshabilitado
340
+
341
+ ```tsx
342
+ <div className="space-y-4">
343
+ <div className="flex items-center space-x-2">
344
+ <Switch disabled />
345
+ <Label className="text-muted-foreground">Disabled (off)</Label>
346
+ </div>
347
+ <div className="flex items-center space-x-2">
348
+ <Switch disabled checked />
349
+ <Label className="text-muted-foreground">Disabled (on)</Label>
350
+ </div>
351
+ </div>
352
+ ```
353
+
354
+ ## Casos de Uso
355
+
356
+ **Settings**: On/off toggles para configuración
357
+ **Feature flags**: Activar/desactivar features
358
+ **Notifications**: Habilitar/deshabilitar notificaciones
359
+ **Privacy**: Controles de privacidad y permisos
360
+ **Device controls**: Wi-Fi, Bluetooth, Airplane mode
361
+ **Filters**: Mostrar/ocultar contenido
362
+
363
+ ## Estilos Base
364
+
365
+ - **Size**: `h-5 w-8`
366
+ - **Checked bg**: `bg-primary`
367
+ - **Unchecked bg**: `bg-input` (dark: `bg-input/80`)
368
+ - **Thumb**: `size-4` con `bg-background`
369
+ - **Thumb checked**: `translate-x-[calc(100%-2px)]`
370
+ - **Thumb unchecked**: `translate-x-0`
371
+ - **Focus**: `ring-ring/50` con `ring-[3px]`
372
+ - **Transition**: `transition-all` en thumb y background
373
+
374
+ ## Accesibilidad
375
+
376
+ - ✅ **Role**: `role="switch"` con `aria-checked`
377
+ - ✅ **Keyboard**: Space/Enter para toggle
378
+ - ✅ **Focus**: Focus ring visible
379
+ - ✅ **Label**: Asociar con `htmlFor` e `id`
380
+ - ✅ **State**: Screen readers anuncian checked/unchecked
381
+
382
+ ## Notas de Implementación
383
+
384
+ - **Radix UI**: Basado en `@radix-ui/react-switch`
385
+ - **Peer class**: Usa `peer` para estilos relacionados con Label
386
+ - **Data states**: `data-state="checked|unchecked"` para estilos
387
+ - **Controlled**: Usa `checked` + `onCheckedChange`
388
+ - **Uncontrolled**: Usa `defaultChecked`
389
+ - **Dark mode**: Thumb color cambia automáticamente
390
+
391
+ ## Troubleshooting
392
+
393
+ **No cambia estado**: En modo controlado usa `checked` + `onCheckedChange`, no `defaultChecked`
394
+ **Label no clickeable**: Asegura `htmlFor` en Label coincida con `id` del Switch
395
+ **Thumb no anima**: Verifica que estilos de `transition-transform` no estén sobrescritos
396
+ **Color incorrecto**: Switch usa `bg-primary` checked, `bg-input` unchecked
397
+ **Disabled no funciona**: Prop `disabled` deshabilita interacción
398
+
399
+ ## Referencias
400
+
401
+ - **Radix UI Switch**: <https://www.radix-ui.com/primitives/docs/components/switch>
402
+ - **shadcn/ui Switch**: <https://ui.shadcn.com/docs/components/switch>