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 +134 -34
- package/dist/components/Badge.d.ts +1 -1
- package/dist/components/Button.d.ts +1 -1
- package/dist/components/Card.d.ts +3 -1
- package/dist/components/Checkbox.d.ts +1 -1
- package/dist/components/Input.d.ts +1 -2
- package/dist/components/Menu.d.ts +17 -0
- package/dist/components/Modal.d.ts +1 -1
- package/dist/components/Progress.d.ts +13 -0
- package/dist/components/Scroll.d.ts +8 -0
- package/dist/components/Select.d.ts +2 -2
- package/dist/components/Separator.d.ts +2 -1
- package/dist/components/Skeleton.d.ts +17 -0
- package/dist/components/Tabs.d.ts +2 -2
- package/dist/components/Toast.d.ts +13 -0
- package/dist/components/Tooltip.d.ts +9 -0
- package/dist/index.cjs.js +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.es.js +1763 -1092
- package/dist/index.umd.js +1 -1
- package/dist/providers/ToastProvider.d.ts +19 -0
- package/dist/style.css +1 -1
- package/dist/types/window.d.ts +9 -0
- package/package.json +1 -1
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.
|
|
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
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
38
|
+
```bash
|
|
39
|
+
npm install nocturna-ui
|
|
40
|
+
```
|
|
27
41
|
|
|
28
|
-
|
|
42
|
+
### 2. Dependências (Peer Dependencies)
|
|
29
43
|
|
|
30
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
133
|
+
**Inicialização e Uso:**
|
|
52
134
|
|
|
53
|
-
```
|
|
54
|
-
|
|
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
|
-
|
|
58
|
-
import "nocturna-ui/dist/style.css";
|
|
59
|
-
import { VoidButton, CryptModal } from "nocturna-ui";
|
|
159
|
+
---
|
|
60
160
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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.
|
|
7
|
+
interface SoulTabsProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
8
8
|
tabs: Tab[];
|
|
9
9
|
variant?: "void" | "blood";
|
|
10
10
|
}
|
|
11
|
-
export declare const SoulTabs:
|
|
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 {};
|