nocturna-ui 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,42 +2,120 @@
2
2
 
3
3
  > **Primitivos góticos e brutalistas forjados para a web que não teme a escuridão.**
4
4
 
5
- A **Nocturna UI** é uma biblioteca de componentes React focada em interfaces de alto contraste, tipografia serifada e estética minimalista/gótica. Na v0.0.2, expandimos nosso arsenal com componentes complexos e foco total em acessibilidade.
5
+ A **Nocturna UI** é uma biblioteca de componentes React focada em interfaces de alto contraste, tipografia serifada e estética minimalista/gótica. Na **v0.0.4**, expandimos nosso arsenal com componentes de feedback, navegação e um sistema robusto de notificações (Toasts) desacoplado.
6
6
 
7
7
  [Showcase (DEMO)](https://gothd.github.io/nocturna-ui/) | [NPM](https://www.npmjs.com/package/nocturna-ui) | [UNPKG](https://unpkg.com/nocturna-ui/)
8
8
 
9
9
  ---
10
10
 
11
- ## 🕸️ Componentes Disponíveis
11
+ ## 🕸️ Arsenal de Componentes
12
+
13
+ | Primitivo | Descrição |
14
+ | :------------------------- | :------------------------------------------------------------ |
15
+ | **VoidButton** | Botão brutalista com suporte a tamanhos sm/md/lg. |
16
+ | **CryptModal** | Modal com portal, trava de foco e suporte a tecla ESC. |
17
+ | **RitualSelect** | Select customizado com suporte total a navegação via teclado. |
18
+ | **AltarMenu** `Novo` | Menu dropdown acessível para ações e navegação. |
19
+ | **GrimoireAccordion** | Acordeão com animação de altura dinâmica via Framer Motion. |
20
+ | **SoulTabs** | Sistema de abas para organização de conteúdos densos. |
21
+ | **VeinInput** | Input de texto com labels integrados e validação visual. |
22
+ | **HexCheckbox** | Checkbox temático com animação de escala e ícone custom. |
23
+ | **OmenToast** `Novo` | Sistema de notificações (Toasts) via Hook ou Global. |
24
+ | **RuneTooltip** `Novo` | Tooltips informativos com posicionamento automático. |
25
+ | **VesselProgress** `Novo` | Barras de progresso (Valor ou Timer/Indeterminate). |
26
+ | **AbyssScroll** `Novo` | Container com scrollbar customizada cross-browser. |
27
+ | **SpectreSkeleton** `Novo` | Placeholders de carregamento (Avatar, Card). |
28
+ | **SigilBadge** | Emblemas para status e tags em versões Solid ou Outline. |
29
+ | **AbyssSeparator** | Divisor de seção com suporte a labels e sigilos. |
30
+ | **NocturnaCard** | Container clássico com sombras rígidas (hard shadows). |
12
31
 
13
- | Primitivo | Descrição |
14
- | :-------------------- | :------------------------------------------------------------ |
15
- | **VoidButton** | Botão brutalista com suporte a tamanhos sm/md/lg. |
16
- | **CryptModal** | Modal com portal e trava de foco para acessibilidade. |
17
- | **RitualSelect** | Select customizado com suporte total a navegação via teclado. |
18
- | **GrimoireAccordion** | Acordeão com animação de altura dinâmica via Framer Motion. |
19
- | **SoulTabs** | Sistema de abas para organização de conteúdos densos. |
20
- | **VeinInput** | Input de texto com estados de erro e animação de pulso. |
21
- | **HexCheckbox** | Checkbox temático com animação de escala. |
22
- | **AbyssSeparator** | Divisor de seção com suporte a labels e sigilos. |
23
- | **SigilBadge** | Emblemas para status e tags em versões Solid ou Outline. |
24
- | **NocturnaCard** | Container clássico com sombras rígidas (hard shadows). |
32
+ ---
33
+
34
+ ## 🌑 Instalação
35
+
36
+ ### 1. Instale o pacote
25
37
 
26
- ## 🌑 Requisitos de Instalação (Peer Dependencies)
38
+ ```bash
39
+ npm install nocturna-ui
40
+ ```
27
41
 
28
- Para evitar conflitos de instâncias do React (como o erro de `useState` nulo), a **Nocturna UI** utiliza `peerDependencies`. Certifique-se de que seu projeto possua:
42
+ ### 2. Dependências (Peer Dependencies)
29
43
 
30
- - **React** (^18.0.0)
31
- - **React-DOM** (^18.0.0)
32
- - **Framer Motion** (^11.0.0)
44
+ Para garantir animações fluidas e evitar conflitos de versão do React, certifique-se de ter instalado:
33
45
 
34
46
  ```bash
35
47
  npm install react react-dom framer-motion
36
48
  ```
37
49
 
38
- ## 📜 Uso via CDN (UMD)
50
+ _(Nota: Os ícones internos utilizam Lucide React e já estão inclusos no pacote. Você não precisa instalá-lo separadamente, a menos que queira usar os mesmos ícones em sua aplicação)._
51
+
52
+ ### 3. Setup do Provider
53
+
54
+ Para que o sistema de **Toasts** (OmenToast) funcione, você deve envolver sua aplicação com o `OmenToastProvider`:
55
+
56
+ ```tsx
57
+ // src/App.tsx ou src/layout.tsx
58
+ import { OmenToastProvider } from "nocturna-ui";
59
+ import "nocturna-ui/dist/style.css"; // Importação vital dos estilos
60
+
61
+ export default function App({ children }) {
62
+ return <OmenToastProvider>{children}</OmenToastProvider>;
63
+ }
64
+ ```
65
+
66
+ ---
67
+
68
+ ## 🩸 Como Usar
69
+
70
+ ### Componentes Básicos
71
+
72
+ ```tsx
73
+ import { VoidButton, SigilBadge } from "nocturna-ui";
74
+
75
+ export const Ritual = () => (
76
+ <div className="flex gap-4">
77
+ <SigilBadge variant="blood">Status: Ativo</SigilBadge>
78
+ <VoidButton variant="void" onClick={() => console.log("Invocado")}>
79
+ Iniciar Ritual
80
+ </VoidButton>
81
+ </div>
82
+ );
83
+ ```
84
+
85
+ ### Hook de Toast (React)
86
+
87
+ Dentro de qualquer componente filho do Provider:
88
+
89
+ ```tsx
90
+ import { useToast, VoidButton } from "nocturna-ui";
91
+
92
+ export const SummonToast = () => {
93
+ const { toast } = useToast();
94
+
95
+ return (
96
+ <VoidButton
97
+ onClick={() =>
98
+ toast({
99
+ title: "Oferenda Aceita",
100
+ description: "Os dados foram salvos no grimório.",
101
+ type: "success",
102
+ variant: "void",
103
+ })
104
+ }
105
+ >
106
+ Salvar
107
+ </VoidButton>
108
+ );
109
+ };
110
+ ```
111
+
112
+ ---
113
+
114
+ ## 📜 Uso via CDN (Vanilla JS / HTML)
39
115
 
40
- Para utilizar a biblioteca diretamente no navegador, a ordem dos scripts é fundamental para que as globais sejam injetadas corretamente:
116
+ A **Nocturna UI** injeta uma ponte global (`window.NocturnaUI`) quando carregada via script tag, permitindo o uso do sistema de Toasts mesmo fora do React.
117
+
118
+ **Ordem de Importação:**
41
119
 
42
120
  ```html
43
121
  <script src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
@@ -45,25 +123,47 @@ Para utilizar a biblioteca diretamente no navegador, a ordem dos scripts é fund
45
123
 
46
124
  <script src="https://unpkg.com/framer-motion@11/dist/framer-motion.js"></script>
47
125
 
48
- <script src="https://unpkg.com/nocturna-ui@0.0.3/dist/index.umd.js"></script>
126
+ <script src="https://unpkg.com/nocturna-ui@0.0.4/dist/index.umd.js"></script>
127
+ <link
128
+ rel="stylesheet"
129
+ href="https://unpkg.com/nocturna-ui@0.0.4/dist/style.css"
130
+ />
49
131
  ```
50
132
 
51
- ## 🩸 Instalação e Uso
133
+ **Inicialização e Uso:**
52
134
 
53
- ```bash
54
- npm install nocturna-ui
135
+ ```html
136
+ <div id="root"></div>
137
+
138
+ <script>
139
+ // 1. Inicializa o Provider (Necessário para a Bridge funcionar)
140
+ const root = ReactDOM.createRoot(document.getElementById("root"));
141
+ root.render(React.createElement(window.NocturnaUI.OmenToastProvider));
142
+
143
+ // 2. Dispara Toasts via JavaScript Puro
144
+ function invocarMensagem() {
145
+ if (window.NocturnaUI && window.NocturnaUI.toaster) {
146
+ window.NocturnaUI.toaster.toast({
147
+ title: "Vanilla JS",
148
+ description: "O sistema de notificações funciona sem build steps.",
149
+ variant: "blood",
150
+ type: "warning",
151
+ });
152
+ }
153
+ }
154
+ </script>
155
+
156
+ <button onclick="invocarMensagem()">Testar Toast</button>
55
157
  ```
56
158
 
57
- ```tsx
58
- import "nocturna-ui/dist/style.css";
59
- import { VoidButton, CryptModal } from "nocturna-ui";
159
+ ---
60
160
 
61
- export const Ritual = () => (
62
- <VoidButton variant="blood" size="lg">
63
- Iniciar Invocação
64
- </VoidButton>
65
- );
66
- ```
161
+ ## 🛠️ Tecnologias
162
+
163
+ - **TypeScript** - Tipagem estrita para rituais seguros.
164
+ - **Tailwind CSS** - Estilização atômica encapsulada (sem conflitos de classe).
165
+ - **Framer Motion** - Animações de entrada e saída (Accordions, Modais, Toasts).
166
+ - **Lucide React** - Iconografia leve e consistente.
67
167
 
68
168
  ---
69
169
 
@@ -5,5 +5,5 @@ interface SigilBadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
5
5
  size?: "sm" | "md";
6
6
  styleType?: "outline" | "solid";
7
7
  }
8
- export declare const SigilBadge: ({ children, variant, size, styleType, className, ...props }: SigilBadgeProps) => import("react/jsx-runtime").JSX.Element;
8
+ export declare const SigilBadge: React.ForwardRefExoticComponent<SigilBadgeProps & React.RefAttributes<HTMLSpanElement>>;
9
9
  export {};
@@ -3,5 +3,5 @@ interface VoidButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>
3
3
  variant?: "void" | "blood";
4
4
  size?: "sm" | "md" | "lg";
5
5
  }
6
- export declare const VoidButton: ({ variant, size, className, ...props }: VoidButtonProps) => import("react/jsx-runtime").JSX.Element;
6
+ export declare const VoidButton: React.ForwardRefExoticComponent<VoidButtonProps & React.RefAttributes<HTMLButtonElement>>;
7
7
  export {};
@@ -3,6 +3,8 @@ interface NocturnaCardProps extends React.HTMLAttributes<HTMLDivElement> {
3
3
  variant?: "void" | "blood";
4
4
  title: string;
5
5
  description?: string;
6
+ headingLevel?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6";
7
+ as?: React.ElementType;
6
8
  }
7
- export declare const NocturnaCard: ({ title, description, variant, className, children, ...props }: NocturnaCardProps) => import("react/jsx-runtime").JSX.Element;
9
+ export declare const NocturnaCard: React.ForwardRefExoticComponent<NocturnaCardProps & React.RefAttributes<HTMLDivElement>>;
8
10
  export {};
@@ -3,5 +3,5 @@ interface HexCheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputEleme
3
3
  label?: string;
4
4
  variant?: "void" | "blood";
5
5
  }
6
- export declare const HexCheckbox: ({ label, variant, checked, className, ...props }: HexCheckboxProps) => import("react/jsx-runtime").JSX.Element;
6
+ export declare const HexCheckbox: React.ForwardRefExoticComponent<HexCheckboxProps & React.RefAttributes<HTMLInputElement>>;
7
7
  export {};
@@ -4,7 +4,6 @@ interface VeinInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement
4
4
  size?: "sm" | "md";
5
5
  label?: string;
6
6
  error?: string;
7
- inputSize?: React.InputHTMLAttributes<HTMLInputElement>["size"];
8
7
  }
9
- export declare const VeinInput: ({ variant, size, label, error, className, inputSize, ...props }: VeinInputProps) => import("react/jsx-runtime").JSX.Element;
8
+ export declare const VeinInput: React.ForwardRefExoticComponent<VeinInputProps & React.RefAttributes<HTMLInputElement>>;
10
9
  export {};
@@ -0,0 +1,17 @@
1
+ import { default as React } from 'react';
2
+ interface AltarMenuItem {
3
+ id: string;
4
+ label: string;
5
+ icon?: React.ReactNode;
6
+ onClick: () => void;
7
+ danger?: boolean;
8
+ disabled?: boolean;
9
+ }
10
+ interface AltarMenuProps extends React.HTMLAttributes<HTMLDivElement> {
11
+ items: AltarMenuItem[];
12
+ variant?: "void" | "blood";
13
+ trigger?: React.ReactNode;
14
+ align?: "left" | "right";
15
+ }
16
+ export declare const AltarMenu: React.ForwardRefExoticComponent<AltarMenuProps & React.RefAttributes<HTMLButtonElement>>;
17
+ export {};
@@ -7,5 +7,5 @@ interface CryptModalProps extends React.HTMLAttributes<HTMLDivElement> {
7
7
  children?: React.ReactNode;
8
8
  variant?: "void" | "blood";
9
9
  }
10
- export declare const CryptModal: ({ isOpen, onClose, title, description, children, variant, className, ...props }: CryptModalProps) => React.ReactPortal | null;
10
+ export declare const CryptModal: React.ForwardRefExoticComponent<CryptModalProps & React.RefAttributes<HTMLDivElement>>;
11
11
  export {};
@@ -0,0 +1,13 @@
1
+ import { default as React } from 'react';
2
+ interface VesselProgressProps extends React.HTMLAttributes<HTMLDivElement> {
3
+ value?: number;
4
+ max?: number;
5
+ variant?: "void" | "blood";
6
+ label?: string;
7
+ showValue?: boolean;
8
+ mode?: "value" | "timer" | "indeterminate";
9
+ duration?: number;
10
+ paused?: boolean;
11
+ }
12
+ export declare const VesselProgress: React.ForwardRefExoticComponent<VesselProgressProps & React.RefAttributes<HTMLDivElement>>;
13
+ export {};
@@ -0,0 +1,8 @@
1
+ import { default as React } from 'react';
2
+ interface AbyssScrollProps extends React.HTMLAttributes<HTMLDivElement> {
3
+ children: React.ReactNode;
4
+ variant?: "void" | "blood";
5
+ maxHeight?: string | number;
6
+ }
7
+ export declare const AbyssScroll: React.ForwardRefExoticComponent<AbyssScrollProps & React.RefAttributes<HTMLDivElement>>;
8
+ export {};
@@ -3,7 +3,7 @@ interface RitualSelectOption {
3
3
  value: string;
4
4
  label: string;
5
5
  }
6
- interface RitualSelectProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "onChange"> {
6
+ interface RitualSelectProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "onChange" | "value"> {
7
7
  options: RitualSelectOption[];
8
8
  value?: string;
9
9
  onChange?: (value: string) => void;
@@ -12,5 +12,5 @@ interface RitualSelectProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonEl
12
12
  variant?: "void" | "blood";
13
13
  size?: "sm" | "md" | "lg";
14
14
  }
15
- export declare const RitualSelect: ({ options, value, onChange, placeholder, label, variant, size, className, }: RitualSelectProps) => import("react/jsx-runtime").JSX.Element;
15
+ export declare const RitualSelect: React.ForwardRefExoticComponent<RitualSelectProps & React.RefAttributes<HTMLButtonElement>>;
16
16
  export {};
@@ -2,6 +2,7 @@ import { default as React } from 'react';
2
2
  interface AbyssSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {
3
3
  variant?: "void" | "blood";
4
4
  label?: string;
5
+ as?: React.ElementType;
5
6
  }
6
- export declare const AbyssSeparator: ({ variant, label, className, ...props }: AbyssSeparatorProps) => import("react/jsx-runtime").JSX.Element;
7
+ export declare const AbyssSeparator: React.ForwardRefExoticComponent<AbyssSeparatorProps & React.RefAttributes<HTMLDivElement>>;
7
8
  export {};
@@ -0,0 +1,17 @@
1
+ import { default as React } from 'react';
2
+ interface SpectreSkeletonProps extends React.HTMLAttributes<HTMLDivElement> {
3
+ variant?: "void" | "blood";
4
+ width?: string | number;
5
+ height?: string | number;
6
+ }
7
+ export declare const SpectreSkeleton: React.ForwardRefExoticComponent<SpectreSkeletonProps & React.RefAttributes<HTMLDivElement>>;
8
+ interface SpectreSkeletonAvatarProps extends Omit<SpectreSkeletonProps, "width" | "height"> {
9
+ size?: "sm" | "md" | "lg";
10
+ }
11
+ export declare const SpectreSkeletonAvatar: React.ForwardRefExoticComponent<SpectreSkeletonAvatarProps & React.RefAttributes<HTMLDivElement>>;
12
+ interface SpectreSkeletonCardProps extends React.HTMLAttributes<HTMLDivElement> {
13
+ variant?: "void" | "blood";
14
+ lines?: number;
15
+ }
16
+ export declare const SpectreSkeletonCard: React.ForwardRefExoticComponent<SpectreSkeletonCardProps & React.RefAttributes<HTMLDivElement>>;
17
+ export {};
@@ -4,9 +4,9 @@ interface Tab {
4
4
  label: string;
5
5
  content: React.ReactNode;
6
6
  }
7
- interface SoulTabsProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
7
+ interface SoulTabsProps extends React.HTMLAttributes<HTMLDivElement> {
8
8
  tabs: Tab[];
9
9
  variant?: "void" | "blood";
10
10
  }
11
- export declare const SoulTabs: ({ tabs, variant, className, ...props }: SoulTabsProps) => import("react/jsx-runtime").JSX.Element;
11
+ export declare const SoulTabs: React.ForwardRefExoticComponent<SoulTabsProps & React.RefAttributes<HTMLDivElement>>;
12
12
  export {};
@@ -0,0 +1,13 @@
1
+ import { default as React } from 'react';
2
+ export type ToastVariant = "void" | "blood";
3
+ export type ToastType = "info" | "success" | "warning" | "error";
4
+ export interface OmenToastProps extends React.HTMLAttributes<HTMLDivElement> {
5
+ id: string;
6
+ title: string;
7
+ description?: string;
8
+ variant?: ToastVariant;
9
+ type?: ToastType;
10
+ duration?: number;
11
+ onClose: (id: string) => void;
12
+ }
13
+ export declare const OmenToast: React.ForwardRefExoticComponent<OmenToastProps & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,9 @@
1
+ import { default as React } from 'react';
2
+ interface RuneTooltipProps extends React.HTMLAttributes<HTMLDivElement> {
3
+ content: string;
4
+ children: React.ReactNode;
5
+ variant?: "void" | "blood";
6
+ position?: "top" | "bottom" | "left" | "right";
7
+ }
8
+ export declare const RuneTooltip: React.ForwardRefExoticComponent<RuneTooltipProps & React.RefAttributes<HTMLDivElement>>;
9
+ export {};