aloha-ui-library 0.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Aloha Team
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,98 @@
1
+ # @srteam-dev/aloha-ui
2
+
3
+ A comprehensive React design system with UI components, typography system, and color palette for modern applications.
4
+
5
+ ## 📦 Installation
6
+
7
+ ### From GitHub Packages
8
+
9
+ 1. **Create a GitHub Personal Access Token** with `read:packages` permission
10
+ 2. **Configure npm** to authenticate with GitHub Packages:
11
+
12
+ Create a `.npmrc` file in your project root or home directory:
13
+
14
+ ```properties
15
+ @srteam-dev:registry=https://npm.pkg.github.com/
16
+ //npm.pkg.github.com/:_authToken=YOUR_GITHUB_TOKEN
17
+ ```
18
+
19
+ 3. **Install the package:**
20
+
21
+ ```bash
22
+ npm install @srteam-dev/aloha-ui
23
+ ```
24
+
25
+ 📖 See [INSTALL.md](./INSTALL.md) for detailed installation instructions.
26
+
27
+ ## 🚀 Quick Start
28
+
29
+ ```tsx
30
+ import { Button, H1, Card, colors } from '@srteam-dev/aloha-ui';
31
+ import '@srteam-dev/aloha-ui/dist/index.css';
32
+
33
+ function App() {
34
+ return (
35
+ <div>
36
+ <H1 font="nunito" color="theme-primary">
37
+ Welcome to Aloha UI
38
+ </H1>
39
+ <Button variant="default" onClick={() => alert('Hello!')}>
40
+ Click me
41
+ </Button>
42
+ </div>
43
+ );
44
+ }
45
+ ```
46
+
47
+ ## 🎨 Features
48
+
49
+ - **20+ UI Components**: Button, Card, Input, Badge, Avatar, Grid, Image, Popup, etc.
50
+ - **Typography System**: H1-H4, P, Subtitle, Lead, Small, Muted with font and color options
51
+ - **Color Palette**: 11 predefined colors + adaptive theme colors
52
+ - **Two Fonts**: JetBrains Mono and Nunito Sans with multiple weights
53
+ - **Dark Mode Support**: Theme colors that adapt automatically
54
+ - **TypeScript**: Fully typed for better DX
55
+ - **Storybook**: Interactive component documentation
56
+
57
+ ## 📚 Documentation
58
+
59
+ Visit our [Storybook](https://srteam-dev.github.io/aloha_lib/) to explore all components and examples.
60
+
61
+ ## Development
62
+
63
+ ### Install dependencies
64
+ ```bash
65
+ npm install
66
+ ```
67
+
68
+ ### Run Storybook
69
+ ```bash
70
+ npm run dev
71
+ ```
72
+
73
+ ### Build the library
74
+ ```bash
75
+ npm run build
76
+ ```
77
+
78
+ ### Build Storybook
79
+ ```bash
80
+ npm run build-storybook
81
+ ```
82
+
83
+ ## Publishing
84
+
85
+ 1. Update version in package.json
86
+ 2. Build the library: `npm run build`
87
+ 3. Publish to npm: `npm publish`
88
+
89
+ Or use the version scripts:
90
+ ```bash
91
+ npm run version:patch # 1.0.0 -> 1.0.1
92
+ npm run version:minor # 1.0.0 -> 1.1.0
93
+ npm run version:major # 1.0.0 -> 2.0.0
94
+ ```
95
+
96
+ ## License
97
+
98
+ MIT © Aloha Team
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Paleta de colores de Aloha UI
3
+ * Importa estos colores para usarlos en tus componentes
4
+ *
5
+ * @example
6
+ * import { colors, cssVars } from '@srteam-dev/aloha-ui';
7
+ *
8
+ * // Usar con valor hexadecimal directo
9
+ * <div style={{ backgroundColor: colors.olivo }}>
10
+ * Contenido
11
+ * </div>
12
+ *
13
+ * // Usar con variable CSS
14
+ * <div style={{ backgroundColor: cssVars.olivo }}>
15
+ * Contenido
16
+ * </div>
17
+ */
18
+ export declare const colors: {
19
+ readonly olivo: "#383517";
20
+ readonly lima: "#B4DE6E";
21
+ readonly bosque: "#648C2C";
22
+ readonly hueso: "#F5F5DC";
23
+ readonly piedra: "#4A443F";
24
+ readonly corteza: "#6B5B3E";
25
+ readonly girasol: "#FFD400";
26
+ readonly coral: "#FF6F61";
27
+ readonly aqua: "#66FFCC";
28
+ readonly lavanda: "#B388D3";
29
+ readonly electrico: "#0084FF";
30
+ };
31
+ /**
32
+ * Variables CSS para usar los colores
33
+ * Usa estas variables para aprovechar las CSS custom properties
34
+ *
35
+ * @example
36
+ * import { cssVars } from '@srteam-dev/aloha-ui';
37
+ *
38
+ * <div style={{ backgroundColor: cssVars.olivo }}>
39
+ * Contenido con variable CSS
40
+ * </div>
41
+ */
42
+ export declare const cssVars: {
43
+ readonly olivo: "var(--colors-olivo)";
44
+ readonly lima: "var(--colors-lima)";
45
+ readonly bosque: "var(--colors-bosque)";
46
+ readonly hueso: "var(--colors-hueso)";
47
+ readonly piedra: "var(--colors-piedra)";
48
+ readonly corteza: "var(--colors-corteza)";
49
+ readonly girasol: "var(--colors-girasol)";
50
+ readonly coral: "var(--colors-coral)";
51
+ readonly aqua: "var(--colors-aqua)";
52
+ readonly lavanda: "var(--colors-lavanda)";
53
+ readonly electrico: "var(--colors-electrico)";
54
+ };
55
+ export type ColorName = keyof typeof colors;
56
+ export type ColorValue = typeof colors[ColorName];
57
+ /**
58
+ * Obtiene el valor hexadecimal de un color por su nombre
59
+ */
60
+ export declare const getColor: (colorName: ColorName) => ColorValue;
61
+ /**
62
+ * Lista de todos los colores disponibles
63
+ */
64
+ export declare const colorEntries: [ColorName, ColorValue][];
65
+ /**
66
+ * Obtiene la variable CSS de un color por su nombre
67
+ */
68
+ export declare const getCssVar: (colorName: ColorName) => string;
69
+ /**
70
+ * Variables CSS para el tema (se adaptan automáticamente a modo claro/oscuro)
71
+ *
72
+ * Modo claro:
73
+ * - background: hueso (#F5F5DC)
74
+ * - text: olivo (#383517)
75
+ * - highlight: corteza (#6B5B3E)
76
+ * - primary: lima (#B4DE6E)
77
+ *
78
+ * Modo oscuro:
79
+ * - background: piedra (#4A443F)
80
+ * - text: hueso (#F5F5DC)
81
+ * - highlight: corteza (#6B5B3E)
82
+ * - primary: bosque (#648C2C)
83
+ *
84
+ * @example
85
+ * import { themeVars } from '@srteam-dev/aloha-ui';
86
+ *
87
+ * <div style={{
88
+ * backgroundColor: themeVars.background,
89
+ * color: themeVars.text
90
+ * }}>
91
+ * Este div se adapta automáticamente al tema
92
+ * </div>
93
+ */
94
+ export declare const themeVars: {
95
+ readonly background: "var(--theme-background)";
96
+ readonly text: "var(--theme-text)";
97
+ readonly highlight: "var(--theme-highlight)";
98
+ readonly primary: "var(--theme-primary)";
99
+ };
100
+ export type ThemeName = keyof typeof themeVars;
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ export interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {
3
+ src?: string;
4
+ alt?: string;
5
+ fallback?: string;
6
+ size?: 'sm' | 'md' | 'lg' | 'xl';
7
+ }
8
+ declare const Avatar: React.ForwardRefExoticComponent<AvatarProps & React.RefAttributes<HTMLDivElement>>;
9
+ export { Avatar };
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import { type VariantProps } from 'class-variance-authority';
3
+ declare const badgeVariants: (props?: ({
4
+ variant?: "default" | "destructive" | "outline" | "secondary" | null | undefined;
5
+ } & import("class-variance-authority/dist/types").ClassProp) | undefined) => string;
6
+ export interface BadgeProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof badgeVariants> {
7
+ }
8
+ declare function Badge({ className, variant, ...props }: BadgeProps): import("react/jsx-runtime").JSX.Element;
9
+ export { Badge, badgeVariants };
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import { type VariantProps } from 'class-variance-authority';
3
+ declare const buttonVariants: (props?: ({
4
+ variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link" | null | undefined;
5
+ size?: "default" | "sm" | "lg" | "icon" | null | undefined;
6
+ } & import("class-variance-authority/dist/types").ClassProp) | undefined) => string;
7
+ export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
8
+ asChild?: boolean;
9
+ /** Click handler function */
10
+ onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;
11
+ /** Disabled state */
12
+ disabled?: boolean;
13
+ /** Loading state */
14
+ loading?: boolean;
15
+ }
16
+ declare const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
17
+ export { Button, buttonVariants };
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ declare const Card: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
3
+ declare const CardHeader: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
4
+ declare const CardTitle: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLHeadingElement> & React.RefAttributes<HTMLParagraphElement>>;
5
+ declare const CardDescription: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLParagraphElement> & React.RefAttributes<HTMLParagraphElement>>;
6
+ declare const CardContent: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
7
+ declare const CardFooter: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
8
+ export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent };
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ export interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {
3
+ label?: string;
4
+ }
5
+ declare const Checkbox: React.ForwardRefExoticComponent<CheckboxProps & React.RefAttributes<HTMLInputElement>>;
6
+ export { Checkbox };
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ import { colors, ColorName } from '../colors';
3
+ export interface ColorSwatchProps {
4
+ name: ColorName;
5
+ value: string;
6
+ size?: 'sm' | 'md' | 'lg';
7
+ showHex?: boolean;
8
+ className?: string;
9
+ }
10
+ export declare const ColorSwatch: React.FC<ColorSwatchProps>;
11
+ export interface ColorPaletteProps {
12
+ size?: 'sm' | 'md' | 'lg';
13
+ showHex?: boolean;
14
+ columns?: 2 | 3 | 4 | 5 | 6;
15
+ className?: string;
16
+ }
17
+ export declare const ColorPalette: React.FC<ColorPaletteProps>;
18
+ export { colors };
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ export interface ErrorProps {
3
+ title?: string;
4
+ message?: string;
5
+ onRetry?: () => void;
6
+ retryText?: string;
7
+ className?: string;
8
+ variant?: 'inline' | 'card';
9
+ showIcon?: boolean;
10
+ }
11
+ export declare const Error: React.FC<ErrorProps>;
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ export interface ErrorFullScreenProps {
3
+ title?: string;
4
+ message?: string;
5
+ onRetry?: () => void;
6
+ retryText?: string;
7
+ className?: string;
8
+ background?: 'white' | 'gray' | 'dark' | 'transparent';
9
+ showIcon?: boolean;
10
+ }
11
+ export declare const ErrorFullScreen: React.FC<ErrorFullScreenProps>;
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ export interface FullPageProps {
3
+ children: React.ReactNode;
4
+ className?: string;
5
+ centered?: boolean;
6
+ background?: 'white' | 'gray' | 'dark' | 'transparent';
7
+ }
8
+ export declare const FullPage: React.FC<FullPageProps>;
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ export interface GridProps extends React.HTMLAttributes<HTMLDivElement> {
3
+ /** Number of columns (2, 3, or 4) */
4
+ columns?: 2 | 3 | 4;
5
+ /** Gap between grid items */
6
+ gap?: string;
7
+ /** Children components */
8
+ children: React.ReactNode;
9
+ /** Additional CSS classes */
10
+ className?: string;
11
+ }
12
+ export declare const Grid: React.ForwardRefExoticComponent<GridProps & React.RefAttributes<HTMLDivElement>>;
13
+ export interface GridItemProps extends React.HTMLAttributes<HTMLDivElement> {
14
+ /** Children components */
15
+ children: React.ReactNode;
16
+ /** Additional CSS classes */
17
+ className?: string;
18
+ }
19
+ export declare const GridItem: React.ForwardRefExoticComponent<GridItemProps & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,22 @@
1
+ import React from 'react';
2
+ export interface ImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {
3
+ /** Image source URL */
4
+ src: string;
5
+ /** Alternative text for accessibility */
6
+ alt: string;
7
+ /** Width of the image */
8
+ width?: number | string;
9
+ /** Height of the image */
10
+ height?: number | string;
11
+ /** Object fit style */
12
+ objectFit?: 'contain' | 'cover' | 'fill' | 'none' | 'scale-down';
13
+ /** Image loading strategy */
14
+ loading?: 'lazy' | 'eager';
15
+ /** Fallback image URL if main image fails to load */
16
+ fallbackSrc?: string;
17
+ /** Callback when image fails to load */
18
+ onError?: () => void;
19
+ /** Additional CSS classes */
20
+ className?: string;
21
+ }
22
+ export declare const Image: React.ForwardRefExoticComponent<ImageProps & React.RefAttributes<HTMLImageElement>>;
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ export interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {
3
+ }
4
+ declare const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<HTMLInputElement>>;
5
+ export { Input };
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ export interface LoadingProps {
3
+ message?: string;
4
+ className?: string;
5
+ size?: 'sm' | 'md' | 'lg';
6
+ centered?: boolean;
7
+ }
8
+ export declare const Loading: React.FC<LoadingProps>;
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ export interface LoadingFullScreenProps {
3
+ message?: string;
4
+ className?: string;
5
+ spinnerSize?: 'sm' | 'md' | 'lg' | 'xl';
6
+ background?: 'white' | 'gray' | 'dark' | 'transparent';
7
+ }
8
+ export declare const LoadingFullScreen: React.FC<LoadingFullScreenProps>;
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ export interface NavigationItem {
3
+ label: string;
4
+ href: string;
5
+ icon?: React.ReactNode;
6
+ active?: boolean;
7
+ }
8
+ export interface NavigationBarProps {
9
+ items?: NavigationItem[];
10
+ logo?: React.ReactNode;
11
+ className?: string;
12
+ position?: 'top' | 'bottom';
13
+ }
14
+ declare const NavigationBar: React.ForwardRefExoticComponent<NavigationBarProps & React.RefAttributes<HTMLElement>>;
15
+ export { NavigationBar };
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ export interface NotificationProps {
3
+ id?: string;
4
+ type: 'like' | 'comment' | 'follow' | 'mention' | 'info';
5
+ title: string;
6
+ message: string;
7
+ timestamp: string;
8
+ avatar?: string;
9
+ read?: boolean;
10
+ onClose?: () => void;
11
+ onClick?: () => void;
12
+ className?: string;
13
+ }
14
+ declare const Notification: React.ForwardRefExoticComponent<NotificationProps & React.RefAttributes<HTMLDivElement>>;
15
+ export { Notification };
@@ -0,0 +1,22 @@
1
+ import React from 'react';
2
+ export interface PopupProps {
3
+ /** Whether the popup is open */
4
+ open: boolean;
5
+ /** Callback when the popup should close */
6
+ onClose: () => void;
7
+ /** Popup title */
8
+ title?: string;
9
+ /** Popup content */
10
+ children: React.ReactNode;
11
+ /** Size of the popup */
12
+ size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';
13
+ /** Whether to show close button */
14
+ showCloseButton?: boolean;
15
+ /** Whether clicking overlay closes the popup */
16
+ closeOnOverlayClick?: boolean;
17
+ /** Additional CSS classes for the content */
18
+ className?: string;
19
+ /** Footer content */
20
+ footer?: React.ReactNode;
21
+ }
22
+ export declare const Popup: React.ForwardRefExoticComponent<PopupProps & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ export interface PostProps {
3
+ author: {
4
+ name: string;
5
+ username: string;
6
+ avatar?: string;
7
+ };
8
+ content: string;
9
+ image?: string;
10
+ timestamp: string;
11
+ likes?: number;
12
+ comments?: number;
13
+ isLiked?: boolean;
14
+ className?: string;
15
+ onLike?: () => void;
16
+ onComment?: () => void;
17
+ onShare?: () => void;
18
+ }
19
+ declare const Post: React.ForwardRefExoticComponent<PostProps & React.RefAttributes<HTMLDivElement>>;
20
+ export { Post };
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ export interface SearchInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {
3
+ onSearch?: (value: string) => void;
4
+ }
5
+ declare const SearchInput: React.ForwardRefExoticComponent<SearchInputProps & React.RefAttributes<HTMLInputElement>>;
6
+ export { SearchInput };
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ export interface SwitchProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {
3
+ label?: string;
4
+ }
5
+ declare const Switch: React.ForwardRefExoticComponent<SwitchProps & React.RefAttributes<HTMLInputElement>>;
6
+ export { Switch };
@@ -0,0 +1,34 @@
1
+ import React from 'react';
2
+ export type FontFamily = 'jetbrains' | 'nunito' | 'default';
3
+ export type FontWeight = 'light' | 'medium' | 'bold' | 'black';
4
+ export type ColorOption = 'olivo' | 'lima' | 'bosque' | 'hueso' | 'piedra' | 'corteza' | 'girasol' | 'coral' | 'aqua' | 'lavanda' | 'electrico' | 'theme-background' | 'theme-text' | 'theme-highlight' | 'theme-primary' | 'default';
5
+ export interface HeadingProps extends React.HTMLAttributes<HTMLHeadingElement> {
6
+ children: React.ReactNode;
7
+ className?: string;
8
+ font?: FontFamily;
9
+ weight?: FontWeight;
10
+ color?: ColorOption;
11
+ }
12
+ export declare const H1: React.ForwardRefExoticComponent<HeadingProps & React.RefAttributes<HTMLHeadingElement>>;
13
+ export declare const H2: React.ForwardRefExoticComponent<HeadingProps & React.RefAttributes<HTMLHeadingElement>>;
14
+ export declare const H3: React.ForwardRefExoticComponent<HeadingProps & React.RefAttributes<HTMLHeadingElement>>;
15
+ export declare const H4: React.ForwardRefExoticComponent<HeadingProps & React.RefAttributes<HTMLHeadingElement>>;
16
+ export interface ParagraphProps extends React.HTMLAttributes<HTMLParagraphElement> {
17
+ children: React.ReactNode;
18
+ className?: string;
19
+ font?: FontFamily;
20
+ weight?: FontWeight;
21
+ color?: ColorOption;
22
+ }
23
+ export declare const P: React.ForwardRefExoticComponent<ParagraphProps & React.RefAttributes<HTMLParagraphElement>>;
24
+ export declare const Subtitle: React.ForwardRefExoticComponent<ParagraphProps & React.RefAttributes<HTMLParagraphElement>>;
25
+ export declare const Lead: React.ForwardRefExoticComponent<ParagraphProps & React.RefAttributes<HTMLParagraphElement>>;
26
+ export interface SmallProps extends React.HTMLAttributes<HTMLElement> {
27
+ children: React.ReactNode;
28
+ className?: string;
29
+ font?: FontFamily;
30
+ weight?: FontWeight;
31
+ color?: ColorOption;
32
+ }
33
+ export declare const Small: React.ForwardRefExoticComponent<SmallProps & React.RefAttributes<HTMLElement>>;
34
+ export declare const Muted: React.ForwardRefExoticComponent<ParagraphProps & React.RefAttributes<HTMLParagraphElement>>;
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ export interface UserCardProps {
3
+ name: string;
4
+ username: string;
5
+ avatar?: string;
6
+ bio?: string;
7
+ followers?: number;
8
+ following?: number;
9
+ isFollowing?: boolean;
10
+ className?: string;
11
+ onFollow?: () => void;
12
+ }
13
+ declare const UserCard: React.ForwardRefExoticComponent<UserCardProps & React.RefAttributes<HTMLDivElement>>;
14
+ export { UserCard };
package/dist/index.css ADDED
@@ -0,0 +1,5 @@
1
+ @import url("https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;500;700&family=Nunito+Sans:wght@300;500;700;900&display=swap");*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }
2
+
3
+ /*
4
+ ! tailwindcss v3.4.18 | MIT License | https://tailwindcss.com
5
+ */*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-variation-settings:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-feature-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]:where(:not([hidden=until-found])){display:none}.sr-only{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.left-3{left:.75rem}.top-1\/2{top:50%}.z-50{z-index:50}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mr-2{margin-right:.5rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-8{margin-top:2rem}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1/1}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-16{height:4rem}.h-20{height:5rem}.h-24{height:6rem}.h-32{height:8rem}.h-4{height:1rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-96{height:24rem}.h-full{height:100%}.max-h-96{max-height:24rem}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-32{width:8rem}.w-4{width:1rem}.w-8{width:2rem}.w-\[350px\]{width:350px}.w-full{width:100%}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y:-50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.scroll-m-20{scroll-margin:5rem}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.flex-col{flex-direction:column}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.375rem*var(--tw-space-y-reverse));margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)))}.space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(3rem*var(--tw-space-y-reverse));margin-top:calc(3rem*(1 - var(--tw-space-y-reverse)))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2rem*var(--tw-space-y-reverse));margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.border{border-width:1px}.border-2{border-width:2px}.border-4{border-width:4px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}.border-current{border-color:currentColor}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.border-input{border-color:hsl(var(--input))}.border-primary{border-color:hsl(var(--primary))}.border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity,1))}.border-transparent{border-color:transparent}.border-t-transparent{border-top-color:transparent}.bg-\[\#383517\]{--tw-bg-opacity:1;background-color:rgb(56 53 23/var(--tw-bg-opacity,1))}.bg-background{background-color:hsl(var(--background))}.bg-black\/50{background-color:rgba(0,0,0,.5)}.bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.bg-blue-50\/50{background-color:rgba(239,246,255,.5)}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.bg-card{background-color:hsl(var(--background))}.bg-destructive{background-color:hsl(var(--destructive))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.bg-muted{background-color:hsl(var(--muted))}.bg-primary{background-color:hsl(var(--primary))}.bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.bg-secondary{background-color:hsl(var(--secondary))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-white\/90{background-color:hsla(0,0%,100%,.9)}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.object-fill{-o-object-fit:fill;object-fit:fill}.object-none{-o-object-fit:none;object-fit:none}.object-scale-down{-o-object-fit:scale-down;object-fit:scale-down}.p-2{padding:.5rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-bottom:.125rem;padding-top:.125rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.pb-2{padding-bottom:.5rem}.pl-10{padding-left:2.5rem}.pt-0{padding-top:0}.text-center{text-align:center}.font-jetbrains{font-family:JetBrains Mono,monospace}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.font-nunito{font-family:Nunito Sans,sans-serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-black{font-weight:900}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-light{font-weight:300}.font-medium{font-weight:500}.font-semibold{font-weight:600}.capitalize{text-transform:capitalize}.leading-7{line-height:1.75rem}.leading-none{line-height:1}.tracking-tight{letter-spacing:-.025em}.text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.text-blue-900{--tw-text-opacity:1;color:rgb(30 58 138/var(--tw-text-opacity,1))}.text-card-foreground{color:hsl(var(--foreground))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-foreground{color:hsl(var(--foreground))}.text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-purple-500{--tw-text-opacity:1;color:rgb(168 85 247/var(--tw-text-opacity,1))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-70{opacity:.7}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-lg,.shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-transform{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-300{transition-duration:.3s}:root{--primary:210 100% 50%;--primary-foreground:0 0% 100%;--secondary:220 14% 96%;--secondary-foreground:222 47% 11%;--muted:220 14% 96%;--muted-foreground:220 9% 46%;--accent:220 14% 96%;--accent-foreground:222 47% 11%;--destructive:0 84% 60%;--destructive-foreground:0 0% 100%;--border:220 13% 91%;--input:220 13% 91%;--ring:210 100% 50%;--radius:0.5rem;--background:0 0% 100%;--foreground:222 47% 11%;--colors-olivo:#383517;--colors-lima:#b4de6e;--colors-bosque:#648c2c;--colors-hueso:beige;--colors-piedra:#4a443f;--colors-corteza:#6b5b3e;--colors-girasol:#ffd400;--colors-coral:#ff6f61;--colors-aqua:#6fc;--colors-lavanda:#b388d3;--colors-electrico:#0084ff;--theme-background:var(--colors-hueso);--theme-text:var(--colors-olivo);--theme-highlight:var(--colors-corteza);--theme-primary:var(--colors-lima);--font-jetbrains:"JetBrains Mono",monospace;--font-nunito:"Nunito Sans",sans-serif}.dark{--primary:210 100% 50%;--primary-foreground:0 0% 100%;--secondary:217 33% 17%;--secondary-foreground:210 40% 98%;--muted:217 33% 17%;--muted-foreground:215 20% 65%;--accent:217 33% 17%;--accent-foreground:210 40% 98%;--destructive:0 63% 31%;--destructive-foreground:210 40% 98%;--border:217 33% 17%;--input:217 33% 17%;--ring:210 100% 50%;--background:222 47% 11%;--foreground:210 40% 98%;--theme-background:var(--colors-piedra);--theme-text:var(--colors-hueso);--theme-highlight:var(--colors-corteza);--theme-primary:var(--colors-bosque)}*{border-color:hsl(var(--border))}body{font-feature-settings:"rlig" 1,"calt" 1;background-color:hsl(var(--background));color:hsl(var(--foreground))}.file\:border-0::file-selector-button{border-width:0}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:left-\[2px\]:after{content:var(--tw-content);left:2px}.after\:top-\[2px\]:after{content:var(--tw-content);top:2px}.after\:h-5:after{content:var(--tw-content);height:1.25rem}.after\:w-5:after{content:var(--tw-content);width:1.25rem}.after\:rounded-full:after{border-radius:9999px;content:var(--tw-content)}.after\:border:after{border-width:1px;content:var(--tw-content)}.after\:border-gray-300:after{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1));content:var(--tw-content)}.after\:bg-white:after{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));content:var(--tw-content)}.after\:transition-all:after{content:var(--tw-content);transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.after\:content-\[\"\"\]:after{--tw-content:"";content:var(--tw-content)}.first\:mt-0:first-child{margin-top:0}.hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-destructive\/80:hover{background-color:hsl(var(--destructive)/.8)}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive)/.9)}.hover\:bg-primary\/80:hover{background-color:hsl(var(--primary)/.8)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary)/.9)}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary)/.8)}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.peer:checked~.peer-checked\:bg-primary{background-color:hsl(var(--primary))}.peer:checked~.peer-checked\:after\:translate-x-full:after{--tw-translate-x:100%;content:var(--tw-content);transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.peer:checked~.peer-checked\:after\:border-white:after{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1));content:var(--tw-content)}.peer:focus~.peer-focus\:outline-none{outline:2px solid transparent;outline-offset:2px}.peer:focus~.peer-focus\:ring-4{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.peer:focus~.peer-focus\:ring-ring\/20{--tw-ring-color:hsl(var(--ring)/0.2)}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-50{opacity:.5}.peer:disabled~.peer-disabled\:opacity-70{opacity:.7}.dark\:bg-blue-950\/20:is(.dark *){background-color:rgba(23,37,84,.2)}.dark\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}@media (min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1024px){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:text-5xl{font-size:3rem;line-height:1}}.\[\&\:not\(\:first-child\)\]\:mt-6:not(:first-child){margin-top:1.5rem}
@@ -0,0 +1,22 @@
1
+ export { Button, buttonVariants, type ButtonProps } from './components/Button';
2
+ export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } from './components/Card';
3
+ export { Avatar, type AvatarProps } from './components/Avatar';
4
+ export { Badge, badgeVariants, type BadgeProps } from './components/Badge';
5
+ export { Input, type InputProps } from './components/Input';
6
+ export { Checkbox, type CheckboxProps } from './components/Checkbox';
7
+ export { Switch, type SwitchProps } from './components/Switch';
8
+ export { SearchInput, type SearchInputProps } from './components/SearchInput';
9
+ export { Notification, type NotificationProps } from './components/Notification';
10
+ export { Image, type ImageProps } from './components/Image';
11
+ export { Popup, type PopupProps } from './components/Popup';
12
+ export { Error, type ErrorProps } from './components/Error';
13
+ export { Loading, type LoadingProps } from './components/Loading';
14
+ export { H1, H2, H3, H4, P, Subtitle, Lead, Small, Muted, type HeadingProps, type ParagraphProps, type SmallProps, type FontFamily, type FontWeight, type ColorOption } from './components/Typography';
15
+ export { Grid, GridItem, type GridProps, type GridItemProps } from './components/Grid';
16
+ export { FullPage, type FullPageProps } from './components/FullPage';
17
+ export { LoadingFullScreen, type LoadingFullScreenProps } from './components/LoadingFullScreen';
18
+ export { ErrorFullScreen, type ErrorFullScreenProps } from './components/ErrorFullScreen';
19
+ export { cn } from './lib/utils';
20
+ export { colors, cssVars, themeVars, getColor, getCssVar, colorEntries, type ColorName, type ColorValue, type ThemeName } from './colors';
21
+ export { ColorPalette, ColorSwatch, type ColorPaletteProps, type ColorSwatchProps } from './components/ColorPalette';
22
+ import './styles/globals.css';