@klu_dev/ui-klu-green 1.2.2 → 1.2.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.
package/README.md CHANGED
@@ -654,4 +654,85 @@ export default function NavigationDashboard() {
654
654
  | `id` | `string` | Identificador único de la pestaña. |
655
655
  | `label` | `string` | Texto descriptivo de la opción que verá el usuario. |
656
656
  | `icon` | `ReactNode` | Elemento gráfico/ícono extraído del objeto `Icons`. |
657
- | `content` | `ReactNode` | (Opcional) Componente o vista que se renderizará automáticamente al activar la pestaña. |
657
+ | `content` | `ReactNode` | (Opcional) Componente o vista que se renderizará automáticamente al activar la pestaña. |
658
+
659
+
660
+ ## Uso de MobileMenuDrawer
661
+
662
+ Componente presentacional ("tonto") diseñado para desplegar la barra de navegación en vistas responsivas móviles. Al cambiar de pestaña, delega el control de la acción a la aplicación contenedora para poder mutar layouts completos de forma dinámica mediante un Mapeo de Componentes.
663
+
664
+
665
+
666
+ ```tsx
667
+ import { useState } from 'react'
668
+ import { MobileMenuDrawer, Button, Icons } from '@klu_dev/ui-klu-green'
669
+ import { MoreHorizontal } from 'lucide-react'
670
+
671
+ // 1. Importa tus componentes/vistas completos del proyecto
672
+ import { MiVistaInicio } from './views/MiVistaInicio'
673
+ import { MiVistaTarjeta } from './views/MiVistaTarjeta'
674
+ import { MiVistaMovimientos } from './views/MiVistaMovimientos'
675
+
676
+ export function AppMobileLayout() {
677
+ const [isMenuOpen, setIsMenuOpen] = useState(false)
678
+ const [activeTab, setActiveTab] = useState('inicio')
679
+
680
+ // Opciones compartidas con el menú
681
+ const opcionesMenu = [
682
+ { id: 'inicio', label: 'Inicio', icon: Icons.HOME },
683
+ { id: 'tarjeta', label: 'Mi Tarjeta', icon: Icons.MYCARD },
684
+ { id: 'movimientos', label: 'Movimientos', icon: Icons.MOVEMENTS },
685
+ ]
686
+
687
+ // 2. Diccionario de mapeo: Asocia cada ID string con su respectiva vista
688
+ const rendersDeVistas: Record<string, React.ReactNode> = {
689
+ inicio: <MiVistaInicio />,
690
+ tarjeta: <MiVistaTarjeta />,
691
+ movimientos: <MiVistaMovimientos />,
692
+ }
693
+
694
+ return (
695
+ <div className="uiklu-w-full uiklu-min-h-screen uiklu-bg-gray-50 uiklu-flex uiklu-flex-col">
696
+ <header className="uiklu-bg-white uiklu-p-4 uiklu-flex uiklu-justify-between uiklu-items-center uiklu-border-b">
697
+ <span>Mi Banca Web</span>
698
+
699
+ {/* Botón para abrir el drawer */}
700
+ <Button
701
+ variant="iconCircle"
702
+ size="iconOnly"
703
+ onClick={() => setIsMenuOpen(true)}
704
+ icon={<MoreHorizontal style={{ width: '20px', height: '20px', color: '#FFF' }} />}
705
+ />
706
+ </header>
707
+
708
+ {/* 3. Contenedor Dinámico: Se monta la vista completa en base al ID seleccionado */}
709
+ <main className="uiklu-p-4 uiklu-flex-1">
710
+ {rendersDeVistas[activeTab] || <MiVistaInicio />}
711
+ </main>
712
+
713
+ {/* Render del Drawer Mobile */}
714
+ <MobileMenuDrawer
715
+ isOpen={isMenuOpen}
716
+ onClose={() => setIsMenuOpen(false)}
717
+ items={opcionesMenu}
718
+ activeTab={activeTab}
719
+ onTabChange={setActiveTab}
720
+ />
721
+ </div>
722
+ )
723
+ }
724
+ ```
725
+
726
+
727
+ ### Props de MobileMenuDrawer
728
+ ### Props de MobileMenuDrawer
729
+
730
+ | Prop | Tipo | Descripción |
731
+ | :--- | :--- | :--- |
732
+ | `isOpen` | `boolean` | Controla la visibilidad en pantalla del menú desplegable. |
733
+ | `onClose` | `() => void` | Callback ejecutado al presionar el botón de cerrar (`X`) o seleccionar una pestaña. |
734
+ | `items` | `NavItem[]` | Array de opciones con estructura `{ id, label, icon, hasDivider? }`. |
735
+ | `activeTab` | `string` | ID de la pestaña seleccionada actualmente. |
736
+ | `onTabChange` | `(id: string) => void` | Callback gatillado al pulsar una nueva opción del menú. Devuelve el `id`. |
737
+
738
+
package/dist/index.css CHANGED
@@ -266,6 +266,10 @@ button,
266
266
  .uiklu-m-0{
267
267
  margin: 0px;
268
268
  }
269
+ .uiklu-mx-auto{
270
+ margin-left: auto;
271
+ margin-right: auto;
272
+ }
269
273
  .uiklu-my-2{
270
274
  margin-top: 0.5rem;
271
275
  margin-bottom: 0.5rem;
@@ -342,6 +346,9 @@ button,
342
346
  .uiklu-block{
343
347
  display: block;
344
348
  }
349
+ .uiklu-inline-block{
350
+ display: inline-block;
351
+ }
345
352
  .uiklu-flex{
346
353
  display: flex;
347
354
  }
@@ -363,6 +370,9 @@ button,
363
370
  .uiklu-h-4{
364
371
  height: 1rem;
365
372
  }
373
+ .uiklu-h-44{
374
+ height: 11rem;
375
+ }
366
376
  .uiklu-h-5{
367
377
  height: 1.25rem;
368
378
  }
@@ -402,6 +412,9 @@ button,
402
412
  .uiklu-h-\[6px\]{
403
413
  height: 6px;
404
414
  }
415
+ .uiklu-h-auto{
416
+ height: auto;
417
+ }
405
418
  .uiklu-h-full{
406
419
  height: 100%;
407
420
  }
@@ -423,9 +436,6 @@ button,
423
436
  .uiklu-min-h-\[20px\]{
424
437
  min-height: 20px;
425
438
  }
426
- .uiklu-min-h-\[350px\]{
427
- min-height: 350px;
428
- }
429
439
  .uiklu-min-h-\[400px\]{
430
440
  min-height: 400px;
431
441
  }
@@ -435,6 +445,9 @@ button,
435
445
  .uiklu-min-h-screen{
436
446
  min-height: 100vh;
437
447
  }
448
+ .uiklu-w-12{
449
+ width: 3rem;
450
+ }
438
451
  .uiklu-w-2{
439
452
  width: 0.5rem;
440
453
  }
@@ -483,6 +496,9 @@ button,
483
496
  .uiklu-w-\[383px\]{
484
497
  width: 383px;
485
498
  }
499
+ .uiklu-w-\[40px\]{
500
+ width: 40px;
501
+ }
486
502
  .uiklu-w-\[450px\]{
487
503
  width: 450px;
488
504
  }
@@ -532,6 +548,9 @@ button,
532
548
  .uiklu-min-w-\[383px\]{
533
549
  min-width: 383px;
534
550
  }
551
+ .uiklu-min-w-\[40px\]{
552
+ min-width: 40px;
553
+ }
535
554
  .uiklu-min-w-\[75px\]{
536
555
  min-width: 75px;
537
556
  }
@@ -562,6 +581,9 @@ button,
562
581
  .uiklu-max-w-\[400px\]{
563
582
  max-width: 400px;
564
583
  }
584
+ .uiklu-max-w-\[40px\]{
585
+ max-width: 40px;
586
+ }
565
587
  .uiklu-max-w-\[450px\]{
566
588
  max-width: 450px;
567
589
  }
@@ -630,6 +652,9 @@ button,
630
652
  .uiklu-grid-cols-1{
631
653
  grid-template-columns: repeat(1, minmax(0, 1fr));
632
654
  }
655
+ .uiklu-grid-cols-2{
656
+ grid-template-columns: repeat(2, minmax(0, 1fr));
657
+ }
633
658
  .uiklu-flex-row{
634
659
  flex-direction: row;
635
660
  }
@@ -710,17 +735,39 @@ button,
710
735
  margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse)));
711
736
  margin-bottom: calc(0.5rem * var(--tw-space-y-reverse));
712
737
  }
738
+ .uiklu-space-y-3 > :not([hidden]) ~ :not([hidden]){
739
+ --tw-space-y-reverse: 0;
740
+ margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse)));
741
+ margin-bottom: calc(0.75rem * var(--tw-space-y-reverse));
742
+ }
743
+ .uiklu-space-y-4 > :not([hidden]) ~ :not([hidden]){
744
+ --tw-space-y-reverse: 0;
745
+ margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));
746
+ margin-bottom: calc(1rem * var(--tw-space-y-reverse));
747
+ }
713
748
  .uiklu-space-y-6 > :not([hidden]) ~ :not([hidden]){
714
749
  --tw-space-y-reverse: 0;
715
750
  margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));
716
751
  margin-bottom: calc(1.5rem * var(--tw-space-y-reverse));
717
752
  }
753
+ .uiklu-divide-y > :not([hidden]) ~ :not([hidden]){
754
+ --tw-divide-y-reverse: 0;
755
+ border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));
756
+ border-bottom-width: calc(1px * var(--tw-divide-y-reverse));
757
+ }
758
+ .uiklu-divide-gray-100 > :not([hidden]) ~ :not([hidden]){
759
+ --tw-divide-opacity: 1;
760
+ border-color: rgb(243 244 246 / var(--tw-divide-opacity, 1));
761
+ }
718
762
  .uiklu-self-center{
719
763
  align-self: center;
720
764
  }
721
765
  .uiklu-overflow-hidden{
722
766
  overflow: hidden;
723
767
  }
768
+ .uiklu-overflow-y-auto{
769
+ overflow-y: auto;
770
+ }
724
771
  .uiklu-truncate{
725
772
  overflow: hidden;
726
773
  text-overflow: ellipsis;
@@ -795,6 +842,9 @@ button,
795
842
  .uiklu-border-\[1px\]{
796
843
  border-width: 1px;
797
844
  }
845
+ .uiklu-border-b{
846
+ border-bottom-width: 1px;
847
+ }
798
848
  .uiklu-border-b-\[1px\]{
799
849
  border-bottom-width: 1px;
800
850
  }
@@ -830,6 +880,10 @@ button,
830
880
  --tw-border-opacity: 1;
831
881
  border-color: hsl(var(--uiklu-destructive) / var(--tw-border-opacity, 1));
832
882
  }
883
+ .uiklu-border-gray-100{
884
+ --tw-border-opacity: 1;
885
+ border-color: rgb(243 244 246 / var(--tw-border-opacity, 1));
886
+ }
833
887
  .uiklu-border-gray-200{
834
888
  --tw-border-opacity: 1;
835
889
  border-color: rgb(229 231 235 / var(--tw-border-opacity, 1));
@@ -946,6 +1000,10 @@ button,
946
1000
  --tw-bg-opacity: 1;
947
1001
  background-color: rgb(220 252 231 / var(--tw-bg-opacity, 1));
948
1002
  }
1003
+ .uiklu-bg-green-50{
1004
+ --tw-bg-opacity: 1;
1005
+ background-color: rgb(240 253 244 / var(--tw-bg-opacity, 1));
1006
+ }
949
1007
  .uiklu-bg-orange{
950
1008
  --tw-bg-opacity: 1;
951
1009
  background-color: hsl(var(--uiklu-orange) / var(--tw-bg-opacity, 1));
@@ -978,6 +1036,10 @@ button,
978
1036
  --tw-bg-opacity: 1;
979
1037
  background-color: hsl(var(--uiklu-primary-light) / var(--tw-bg-opacity, 1));
980
1038
  }
1039
+ .uiklu-bg-red-50{
1040
+ --tw-bg-opacity: 1;
1041
+ background-color: rgb(254 242 242 / var(--tw-bg-opacity, 1));
1042
+ }
981
1043
  .uiklu-bg-slate-50{
982
1044
  --tw-bg-opacity: 1;
983
1045
  background-color: rgb(248 250 252 / var(--tw-bg-opacity, 1));
@@ -990,6 +1052,10 @@ button,
990
1052
  --tw-bg-opacity: 1;
991
1053
  background-color: rgb(13 148 136 / var(--tw-bg-opacity, 1));
992
1054
  }
1055
+ .uiklu-bg-teal-700{
1056
+ --tw-bg-opacity: 1;
1057
+ background-color: rgb(15 118 110 / var(--tw-bg-opacity, 1));
1058
+ }
993
1059
  .uiklu-bg-transparent{
994
1060
  background-color: transparent;
995
1061
  }
@@ -1016,6 +1082,11 @@ button,
1016
1082
  --tw-gradient-to: rgb(251 160 34 / 0) var(--tw-gradient-to-position);
1017
1083
  --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
1018
1084
  }
1085
+ .uiklu-from-teal-600{
1086
+ --tw-gradient-from: #0d9488 var(--tw-gradient-from-position);
1087
+ --tw-gradient-to: rgb(13 148 136 / 0) var(--tw-gradient-to-position);
1088
+ --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
1089
+ }
1019
1090
  .uiklu-via-\[\#225c4e\]{
1020
1091
  --tw-gradient-to: rgb(34 92 78 / 0) var(--tw-gradient-to-position);
1021
1092
  --tw-gradient-stops: var(--tw-gradient-from), #225c4e var(--tw-gradient-via-position), var(--tw-gradient-to);
@@ -1026,6 +1097,9 @@ button,
1026
1097
  .uiklu-to-\[\#d9a041\]{
1027
1098
  --tw-gradient-to: #d9a041 var(--tw-gradient-to-position);
1028
1099
  }
1100
+ .uiklu-to-teal-700{
1101
+ --tw-gradient-to: #0f766e var(--tw-gradient-to-position);
1102
+ }
1029
1103
  .uiklu-bg-cover{
1030
1104
  background-size: cover;
1031
1105
  }
@@ -1054,6 +1128,9 @@ button,
1054
1128
  .uiklu-p-10{
1055
1129
  padding: 2.5rem;
1056
1130
  }
1131
+ .uiklu-p-2{
1132
+ padding: 0.5rem;
1133
+ }
1057
1134
  .uiklu-p-2\.5{
1058
1135
  padding: 0.625rem;
1059
1136
  }
@@ -1143,6 +1220,9 @@ button,
1143
1220
  padding-top: 0.75rem;
1144
1221
  padding-bottom: 0.75rem;
1145
1222
  }
1223
+ .uiklu-pb-4{
1224
+ padding-bottom: 1rem;
1225
+ }
1146
1226
  .uiklu-pb-\[20px\]{
1147
1227
  padding-bottom: 20px;
1148
1228
  }
@@ -1189,6 +1269,10 @@ button,
1189
1269
  font-size: 16px;
1190
1270
  line-height: 28px;
1191
1271
  }
1272
+ .uiklu-text-3xl{
1273
+ font-size: 18px;
1274
+ line-height: 28px;
1275
+ }
1192
1276
  .uiklu-text-4xl{
1193
1277
  font-size: 20px;
1194
1278
  line-height: 22px;
@@ -1286,6 +1370,9 @@ button,
1286
1370
  .uiklu-tracking-wider{
1287
1371
  letter-spacing: 0.05em;
1288
1372
  }
1373
+ .uiklu-tracking-widest{
1374
+ letter-spacing: 0.1em;
1375
+ }
1289
1376
  .\!uiklu-text-destructive{
1290
1377
  --tw-text-opacity: 1 !important;
1291
1378
  color: hsl(var(--uiklu-destructive) / var(--tw-text-opacity, 1)) !important;
@@ -1350,6 +1437,14 @@ button,
1350
1437
  --tw-text-opacity: 1;
1351
1438
  color: hsl(var(--uiklu-gray-900) / var(--tw-text-opacity, 1));
1352
1439
  }
1440
+ .uiklu-text-green-500{
1441
+ --tw-text-opacity: 1;
1442
+ color: rgb(34 197 94 / var(--tw-text-opacity, 1));
1443
+ }
1444
+ .uiklu-text-green-600{
1445
+ --tw-text-opacity: 1;
1446
+ color: rgb(22 163 74 / var(--tw-text-opacity, 1));
1447
+ }
1353
1448
  .uiklu-text-green-700{
1354
1449
  --tw-text-opacity: 1;
1355
1450
  color: rgb(21 128 61 / var(--tw-text-opacity, 1));
@@ -1394,10 +1489,30 @@ button,
1394
1489
  --tw-text-opacity: 1;
1395
1490
  color: hsl(var(--uiklu-primary-900) / var(--tw-text-opacity, 1));
1396
1491
  }
1492
+ .uiklu-text-red-500{
1493
+ --tw-text-opacity: 1;
1494
+ color: rgb(239 68 68 / var(--tw-text-opacity, 1));
1495
+ }
1496
+ .uiklu-text-red-600{
1497
+ --tw-text-opacity: 1;
1498
+ color: rgb(220 38 38 / var(--tw-text-opacity, 1));
1499
+ }
1397
1500
  .uiklu-text-secondary{
1398
1501
  --tw-text-opacity: 1;
1399
1502
  color: hsl(var(--uiklu-secondary) / var(--tw-text-opacity, 1));
1400
1503
  }
1504
+ .uiklu-text-teal-400{
1505
+ --tw-text-opacity: 1;
1506
+ color: rgb(45 212 191 / var(--tw-text-opacity, 1));
1507
+ }
1508
+ .uiklu-text-teal-600{
1509
+ --tw-text-opacity: 1;
1510
+ color: rgb(13 148 136 / var(--tw-text-opacity, 1));
1511
+ }
1512
+ .uiklu-text-teal-700{
1513
+ --tw-text-opacity: 1;
1514
+ color: rgb(15 118 110 / var(--tw-text-opacity, 1));
1515
+ }
1401
1516
  .uiklu-text-white{
1402
1517
  --tw-text-opacity: 1;
1403
1518
  color: rgb(255 255 255 / var(--tw-text-opacity, 1));
package/dist/index.d.ts CHANGED
@@ -16,8 +16,8 @@ interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "
16
16
  declare const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<HTMLInputElement>>;
17
17
 
18
18
  declare const buttonVariants: (props?: ({
19
- variant?: "primary" | "primaryOrange" | "secondary" | "outline" | "outlinePrimary" | "outlineSecondary" | "outlineWhite" | null | undefined;
20
- size?: "sm" | "md" | "lg" | "full" | "xl" | "fullh" | null | undefined;
19
+ variant?: "primary" | "primaryOrange" | "secondary" | "outline" | "outlinePrimary" | "outlineSecondary" | "outlineWhite" | "iconCircle" | null | undefined;
20
+ size?: "sm" | "md" | "lg" | "full" | "xl" | "fullh" | "iconOnly" | null | undefined;
21
21
  } & class_variance_authority_types.ClassProp) | undefined) => string;
22
22
  interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
23
23
  asChild?: boolean;
@@ -36,7 +36,7 @@ declare const Select: React.FC<SelectPrimitive.SelectProps>;
36
36
 
37
37
  declare const typographyVariants: (props?: ({
38
38
  size?: "sm" | "md" | "xl" | "xxxl" | "xxl" | null | undefined;
39
- color?: "primary" | "secondary" | "white" | "black" | "orange" | null | undefined;
39
+ color?: "primary" | "secondary" | "black" | "orange" | "white" | null | undefined;
40
40
  align?: "left" | "right" | "center" | "justify" | null | undefined;
41
41
  } & class_variance_authority_types.ClassProp) | undefined) => string;
42
42
  interface TypographyProps extends Omit<React.HTMLAttributes<HTMLParagraphElement>, "color">, VariantProps<typeof typographyVariants> {
@@ -155,6 +155,8 @@ declare const Icons: {
155
155
  MOVEMENTS: react_jsx_runtime.JSX.Element;
156
156
  SERVICES: react_jsx_runtime.JSX.Element;
157
157
  BOXES: react_jsx_runtime.JSX.Element;
158
+ MENU: react_jsx_runtime.JSX.Element;
159
+ CIRCLE_MOVEMENTS: react_jsx_runtime.JSX.Element;
158
160
  };
159
161
 
160
162
  export { BackButton, BalanceInfo, Button, Icons, Input, LoadingScreen, Modal, PromoBanner, Select, SidebarTabs, ToastAction, Toaster, Typography, useToast };
package/dist/index.js CHANGED
@@ -202,6 +202,14 @@ var buttonVariants = cva(
202
202
  uiklu-text-basewhite
203
203
  uiklu-rounded-[48px]
204
204
  hover:uiklu-bg-white/10
205
+ `,
206
+ iconCircle: `
207
+ uiklu-bg-primary900
208
+ uiklu-text-white
209
+ hover:uiklu-bg-primary900/90
210
+ uiklu-rounded-full
211
+ uiklu-border-transparent
212
+ uiklu-p-0
205
213
  `
206
214
  },
207
215
  size: {
@@ -210,7 +218,8 @@ var buttonVariants = cva(
210
218
  lg: "uiklu-h-[50px] uiklu-w-[350px] uiklu-px-[32px] uiklu-text-2xl",
211
219
  xl: "uiklu-h-[60px] uiklu-w-[450px] uiklu-px-[40px] uiklu-text-2xl",
212
220
  full: "uiklu-w-full uiklu-h-[50px] uiklu-max-h-[60px] uiklu-px-[48px] uiklu-text-2xl uiklu-font-bold",
213
- fullh: "uiklu-w-full uiklu-h-[40px] uiklu-max-h-[40px] uiklu-px-[40px] uiklu-text-xl uiklu-font-medium"
221
+ fullh: "uiklu-w-full uiklu-h-[40px] uiklu-max-h-[40px] uiklu-px-[40px] uiklu-text-xl uiklu-font-medium",
222
+ iconOnly: "uiklu-h-[40px] uiklu-w-[40px] uiklu-min-w-[40px] uiklu-max-w-[40px]"
214
223
  }
215
224
  },
216
225
  defaultVariants: {
@@ -220,8 +229,9 @@ var buttonVariants = cva(
220
229
  }
221
230
  );
222
231
  var Button = React2.forwardRef(
223
- ({ className, variant, size, asChild = false, icon, iconAlign = "left", children, ...props }, ref) => {
232
+ ({ className, variant, size, asChild = false, icon, iconAlign = "left", children, style, ...props }, ref) => {
224
233
  const Comp = asChild ? Slot : "button";
234
+ const isIconCircle = variant === "iconCircle";
225
235
  return /* @__PURE__ */ jsxs2(
226
236
  Comp,
227
237
  {
@@ -231,6 +241,17 @@ var Button = React2.forwardRef(
231
241
  className
232
242
  ),
233
243
  ref,
244
+ style: {
245
+ ...isIconCircle && {
246
+ borderRadius: "50%",
247
+ aspectRatio: "1 / 1",
248
+ padding: 0,
249
+ display: "flex",
250
+ alignItems: "center",
251
+ justifyContent: "center"
252
+ },
253
+ ...style
254
+ },
234
255
  ...props,
235
256
  children: [
236
257
  icon && /* @__PURE__ */ jsx2("span", { className: "uiklu-flex uiklu-items-center uiklu-justify-center uiklu-shrink-0", children: icon }),
@@ -666,6 +687,50 @@ var SettingsIcon = ({ className }) => /* @__PURE__ */ jsx7("svg", { xmlns: "http
666
687
  fill: "currentColor"
667
688
  }
668
689
  ) });
690
+ var IconMenu = ({ className }) => /* @__PURE__ */ jsx7("svg", { xmlns: "http://www.w3.org/2000/svg", width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", className, children: /* @__PURE__ */ jsx7(
691
+ "path",
692
+ {
693
+ d: "M12 9C11.4067 9 10.8266 9.17595 10.3333 9.50559C9.83994 9.83524 9.45543 10.3038 9.22836 10.8519C9.0013 11.4001 8.94189 12.0033 9.05765 12.5853C9.1734 13.1672 9.45912 13.7018 9.87868 14.1213C10.2982 14.5409 10.8328 14.8266 11.4147 14.9424C11.9967 15.0581 12.5999 14.9987 13.1481 14.7716C13.6962 14.5446 14.1648 14.1601 14.4944 13.6667C14.8241 13.1734 15 12.5933 15 12C15 11.2044 14.6839 10.4413 14.1213 9.87868C13.5587 9.31607 12.7957 9 12 9ZM12 13.5C11.7033 13.5 11.4133 13.412 11.1666 13.2472C10.92 13.0824 10.7277 12.8481 10.6142 12.574C10.5007 12.2999 10.4709 11.9983 10.5288 11.7074C10.5867 11.4164 10.7296 11.1491 10.9393 10.9393C11.1491 10.7296 11.4164 10.5867 11.7074 10.5288C11.9983 10.4709 12.2999 10.5006 12.574 10.6142C12.8481 10.7277 13.0824 10.92 13.2472 11.1666C13.412 11.4133 13.5 11.7033 13.5 12C13.5 12.3978 13.342 12.7794 13.0607 13.0607C12.7794 13.342 12.3978 13.5 12 13.5ZM4.5 9C3.90666 9 3.32664 9.17595 2.83329 9.50559C2.33994 9.83524 1.95543 10.3038 1.72836 10.8519C1.5013 11.4001 1.44189 12.0033 1.55765 12.5853C1.6734 13.1672 1.95912 13.7018 2.37868 14.1213C2.79824 14.5409 3.33279 14.8266 3.91473 14.9424C4.49667 15.0581 5.09987 14.9987 5.64805 14.7716C6.19623 14.5446 6.66477 14.1601 6.99441 13.6667C7.32405 13.1734 7.5 12.5933 7.5 12C7.5 11.2044 7.18393 10.4413 6.62132 9.87868C6.05871 9.31607 5.29565 9 4.5 9ZM4.5 13.5C4.20333 13.5 3.91332 13.412 3.66665 13.2472C3.41997 13.0824 3.22771 12.8481 3.11418 12.574C3.00065 12.2999 2.97095 11.9983 3.02882 11.7074C3.0867 11.4164 3.22956 11.1491 3.43934 10.9393C3.64912 10.7296 3.91639 10.5867 4.20737 10.5288C4.49834 10.4709 4.79994 10.5006 5.07403 10.6142C5.34812 10.7277 5.58238 10.92 5.74721 11.1666C5.91203 11.4133 6 11.7033 6 12C6 12.3978 5.84197 12.7794 5.56066 13.0607C5.27936 13.342 4.89783 13.5 4.5 13.5ZM19.5 9C18.9067 9 18.3266 9.17595 17.8333 9.50559C17.3399 9.83524 16.9554 10.3038 16.7284 10.8519C16.5013 11.4001 16.4419 12.0033 16.5576 12.5853C16.6734 13.1672 16.9591 13.7018 17.3787 14.1213C17.7982 14.5409 18.3328 14.8266 18.9147 14.9424C19.4967 15.0581 20.0999 14.9987 20.6481 14.7716C21.1962 14.5446 21.6648 14.1601 21.9944 13.6667C22.3241 13.1734 22.5 12.5933 22.5 12C22.5 11.2044 22.1839 10.4413 21.6213 9.87868C21.0587 9.31607 20.2957 9 19.5 9ZM19.5 13.5C19.2033 13.5 18.9133 13.412 18.6666 13.2472C18.42 13.0824 18.2277 12.8481 18.1142 12.574C18.0007 12.2999 17.9709 11.9983 18.0288 11.7074C18.0867 11.4164 18.2296 11.1491 18.4393 10.9393C18.6491 10.7296 18.9164 10.5867 19.2074 10.5288C19.4983 10.4709 19.7999 10.5006 20.074 10.6142C20.3481 10.7277 20.5824 10.92 20.7472 11.1666C20.912 11.4133 21 11.7033 21 12C21 12.3978 20.842 12.7794 20.5607 13.0607C20.2794 13.342 19.8978 13.5 19.5 13.5Z",
694
+ fill: "currentColor"
695
+ }
696
+ ) });
697
+ var MovementsIconCircle = ({ className }) => /* @__PURE__ */ jsxs7(
698
+ "svg",
699
+ {
700
+ xmlns: "http://www.w3.org/2000/svg",
701
+ width: "24",
702
+ height: "24",
703
+ viewBox: "0 0 24 24",
704
+ fill: "none",
705
+ className,
706
+ style: {
707
+ display: "flex",
708
+ width: "24px",
709
+ height: "24px",
710
+ justifyContent: "center",
711
+ alignItems: "center",
712
+ aspectRatio: "1/1"
713
+ },
714
+ children: [
715
+ /* @__PURE__ */ jsx7(
716
+ "rect",
717
+ {
718
+ width: "24",
719
+ height: "24",
720
+ rx: "24",
721
+ fill: "var(--Paleta-Verde-Bosque-Oscuro-Key-Verde-Bosque-Oscuro-300, #49A6A4)"
722
+ }
723
+ ),
724
+ /* @__PURE__ */ jsx7("g", { transform: "translate(4.2, 4.2) scale(0.975)", children: /* @__PURE__ */ jsx7(
725
+ "path",
726
+ {
727
+ d: "M7.35375 10.6462C7.40024 10.6462 7.43712 10.7478 7.46228 10.8085C7.48745 10.8692 7.5004 10.9343 7.5004 11C7.5004 11.0657 7.48745 11.1308 7.46228 11.1915C7.43712 11.2522 7.40024 11.3073 7.35375 11.3537L5.35375 13.3537C5.30732 13.4002 5.25217 13.4371 5.19147 13.4623C5.13077 13.4874 5.06571 13.5004 5 13.5004C4.9343 13.5004 4.86923 13.4874 4.80853 13.4623C4.74783 13.4371 4.69269 13.4002 4.64625 13.3537L2.64625 11.3537C2.5998 11.3073 2.56295 11.2521 2.53781 11.1914C2.51267 11.1307 2.49973 11.0657 2.49973 11C2.49973 10.9343 2.51267 10.8692 2.53781 10.8085C2.56295 10.7479 2.5998 10.6927 2.64625 10.6462C2.74007 10.5524 2.86732 10.4997 3 10.4997C3.0657 10.4997 3.13076 10.5127 3.19145 10.5378C3.25215 10.5629 3.3073 10.5998 3.35375 10.6462L4.5 11.7931V3C4.5 2.86739 4.55268 2.74021 4.64645 2.64644C4.74022 2.55268 4.8674 2.5 5 2.5C5.13261 2.5 5.25979 2.55268 5.35356 2.64644C5.44732 2.74021 5.5 2.86739 5.5 3V11.7931L6.64625 10.6462C6.69269 10.5998 6.74783 10.5629 6.80853 10.5377C6.86923 10.5126 6.9343 10.4996 7 10.4996C7.06571 10.4996 7.13077 10.5126 7.19147 10.5377C7.25217 10.5629 7.30732 10.5998 7.35375 10.6462ZM13.3538 4.64625L11.3538 2.64625C11.3073 2.59976 11.2522 2.56288 11.1915 2.53772C11.1308 2.51255 11.0657 2.4996 11 2.4996C10.9343 2.4996 10.8692 2.51255 10.8085 2.53772C10.7478 2.56288 10.6927 2.59976 10.6463 2.64625L8.64625 4.64625C8.55243 4.74007 8.49972 4.86731 8.49972 5C8.49972 5.13268 8.55243 5.25993 8.64625 5.35375C8.74007 5.44757 8.86732 5.50027 9 5.50027C9.13269 5.50027 9.25993 5.44757 9.35375 5.35375L10.5 4.20687V13C10.5 13.1326 10.5527 13.2598 10.6465 13.3535C10.7402 13.4473 10.8674 13.5 11 13.5C11.1326 13.5 11.2598 13.4473 11.3536 13.3535C11.4473 13.2598 11.5 13.1326 11.5 13V4.20687L12.6463 5.35375C12.7401 5.44757 12.8673 5.50027 13 5.50027C13.1327 5.50027 13.2599 5.44757 13.3538 5.35375C13.4476 5.25993 13.5003 5.13268 13.5003 5C13.5003 4.86731 13.4476 4.74007 13.3538 4.64625Z",
728
+ fill: "white"
729
+ }
730
+ ) })
731
+ ]
732
+ }
733
+ );
669
734
  var Icons = {
670
735
  CARD: /* @__PURE__ */ jsx7(CardIcon, {}),
671
736
  TICKET: /* @__PURE__ */ jsx7(TicketIcon, {}),
@@ -689,7 +754,9 @@ var Icons = {
689
754
  MYCARD: /* @__PURE__ */ jsx7(MyCardIcon, {}),
690
755
  MOVEMENTS: /* @__PURE__ */ jsx7(MovementsIcon, {}),
691
756
  SERVICES: /* @__PURE__ */ jsx7(ServicesPayIcon, {}),
692
- BOXES: /* @__PURE__ */ jsx7(BoxesIcon, {})
757
+ BOXES: /* @__PURE__ */ jsx7(BoxesIcon, {}),
758
+ MENU: /* @__PURE__ */ jsx7(IconMenu, {}),
759
+ CIRCLE_MOVEMENTS: /* @__PURE__ */ jsx7(MovementsIconCircle, {})
693
760
  };
694
761
 
695
762
  // src/components/ui/modal.tsx
@@ -1208,7 +1275,7 @@ function PromoBanner({
1208
1275
  }) {
1209
1276
  return /* @__PURE__ */ jsxs12("div", { className: cn(
1210
1277
  "uiklu-relative uiklu-overflow-hidden uiklu-rounded-2xl uiklu-p-8 uiklu-text-white uiklu-font-sans uiklu-box-border",
1211
- "uiklu-w-full uiklu-min-h-[350px] uiklu-flex uiklu-flex-col uiklu-items-center uiklu-justify-between",
1278
+ "uiklu-w-full uiklu-h-auto uiklu-gap-6 uiklu-flex uiklu-flex-col uiklu-items-center uiklu-justify-between",
1212
1279
  "uiklu-bg-[#06372D]",
1213
1280
  className
1214
1281
  ), children: [