@sumi-forge/react 0.0.0-stage → 1.0.1
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.md +29 -0
- package/README.md +290 -2
- package/dist-lib/components/JapaneseCalligraphy.d.ts +21 -0
- package/dist-lib/components/SumiBrushCanvas.d.ts +41 -0
- package/dist-lib/components/SumiButton.d.ts +32 -0
- package/dist-lib/components/SumiIcon.d.ts +25 -0
- package/dist-lib/components/SumiLandscape.d.ts +33 -0
- package/dist-lib/components/SumiMaskReveal.d.ts +39 -0
- package/dist-lib/components/SumiSansui.d.ts +40 -0
- package/dist-lib/components/SumiSectionPainter.d.ts +24 -0
- package/dist-lib/components/SumiStroke.d.ts +25 -0
- package/dist-lib/components/SumiVFX.d.ts +23 -0
- package/dist-lib/gifEncoder.d.ts +7 -0
- package/dist-lib/index.cjs +2 -0
- package/dist-lib/index.cjs.map +1 -0
- package/dist-lib/index.d.ts +16 -0
- package/dist-lib/index.js +5882 -0
- package/dist-lib/index.js.map +1 -0
- package/dist-lib/math.d.ts +68 -0
- package/dist-lib/presets.d.ts +21 -0
- package/dist-lib/techniques.d.ts +107 -0
- package/dist-lib/types.d.ts +129 -0
- package/dist-lib/vfxRenderer.d.ts +13 -0
- package/package.json +90 -4
package/LICENSE.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Apache License 2.0
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025-2026 SumiForge (`@sumi-forge/react`) Contributors.
|
|
4
|
+
|
|
5
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
you may not use this file except in compliance with the License.
|
|
7
|
+
You may obtain a copy of the License at:
|
|
8
|
+
|
|
9
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
|
|
11
|
+
Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
See the License for the specific language governing permissions and
|
|
15
|
+
limitations under the License.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Resumo de Permissões (Português)
|
|
20
|
+
|
|
21
|
+
Você é livre para usar o **`@sumi-forge/react`** em projetos pessoais, acadêmicos ou comerciais, desde que mantenha os avisos de direitos autorais e a licença original.
|
|
22
|
+
|
|
23
|
+
- **Uso Comercial Permitido**: Utilize em landing pages, produtos SaaS, jogos web e portfólios.
|
|
24
|
+
- **Modificação e Distribuição**: Crie novos pincéis, paletas e coreografias de revelação.
|
|
25
|
+
- **Uso de Patentes e Contribuições**: Protegido pelos termos da Apache License 2.0.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
*made with love in Japa.... ops, Brazil*
|
package/README.md
CHANGED
|
@@ -1,3 +1,291 @@
|
|
|
1
|
-
|
|
1
|
+
<div align="center">
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
# 墨 SumiForge · `@sumi-forge/react`
|
|
4
|
+
|
|
5
|
+
**Onde a Web deixa de ser código e vira pintura viva.**
|
|
6
|
+
*Biblioteca React de arte japonesa procedural, revelação de imagens a pincel, sensibilidade à pressão no toque/mouse e cenários vivos em papel Washi.*
|
|
7
|
+
|
|
8
|
+
[](https://www.npmjs.com/)
|
|
9
|
+
[](https://react.dev/)
|
|
10
|
+
[](https://www.typescriptlang.org/)
|
|
11
|
+
[](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API)
|
|
12
|
+
[](#pintura-e-revelacao-no-mobile)
|
|
13
|
+
[](./LICENSE.md)
|
|
14
|
+
[](./CONTRIBUTING.md)
|
|
15
|
+
|
|
16
|
+
<br />
|
|
17
|
+
|
|
18
|
+
<img src="./public/og-sumi-forge.png" alt="SumiForge — Pintura Viva do Monte Fuji, Sakura e Sol Carmesim em Papel Washi" width="100%" />
|
|
19
|
+
|
|
20
|
+
<br />
|
|
21
|
+
|
|
22
|
+
[**Explorar Obra Viva**](#visao-geral) · [**Instalação**](#instalacao) · [**Componentes React**](#componentes-principais) · [**Pintura no Mobile**](#pintura-e-revelacao-no-mobile) · [**Como Contribuir**](./CONTRIBUTING.md)
|
|
23
|
+
|
|
24
|
+
</div>
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 一期一会 · Visão Geral (`Ichigo Ichie`)
|
|
29
|
+
|
|
30
|
+
> *"Cada encontro e cada pincelada são únicos na vida."*
|
|
31
|
+
|
|
32
|
+
**`@sumi-forge/react`** transforma aplicações React em pergaminhos vivos inspirados na arte japonesa tradicional (**Sumi-e**, **Suibokuga**, **Tarashikomi** e **Ukiyo-e**). Sem depender de vídeos pesados ou arquivos estáticos repetitivos, cada montanha, flor de cerejeira, rio de carpas e golpe de pincel nasce em tempo real na tela e adapta-se com nitidez absoluta a celulares, tablets e monitores ultrawide.
|
|
33
|
+
|
|
34
|
+
### Por que usar o `@sumi-forge/react`?
|
|
35
|
+
|
|
36
|
+
- **Cerimônia de Abertura em 3 Atos**: O Sol Carmesim surge como mancha de aquarela úmida (*Tarashikomi*), os traços de nanquim revelam o Monte Fuji e os galhos da cerejeira, e as flores de Sakura desabrocham como manchas vivas sobre a madeira.
|
|
37
|
+
- **Revelação Artística de Imagens (`<SumiMaskReveal />`)**: Revele qualquer fotografia ou arte com golpes de pincel animados ou deixe que o próprio visitante revele a imagem passando o dedo na tela do celular.
|
|
38
|
+
- **Atelier com Pressão e Velocidade (`<SumiBrushCanvas />`)**: Suporte nativo a telas sensíveis ao toque (iOS/Android), Apple Pencil, Wacom e mouse. Movimentos lentos depositam nanquim denso; movimentos rápidos abrem as cerdas secas (*Kasure*) ou fazem brotar flores de Sakura.
|
|
39
|
+
- **Performance Extrema (60/120 FPS)**: Arquitetura com cache offscreen inteligente e pausa automática fora da tela (`IntersectionObserver`), garantindo rolagem fluida mesmo em smartphones intermediários.
|
|
40
|
+
- **UI Desenhada à Mão (`<SumiButton />` & `<SumiIcon />`)**: Botões com bordas retas orgânicas e ícones caligráficos vetoriais gerados proceduralmente.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Instalação
|
|
45
|
+
|
|
46
|
+
Instale o pacote com seu gerenciador favorito:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# Usando npm
|
|
50
|
+
npm install @sumi-forge/react
|
|
51
|
+
|
|
52
|
+
# Usando pnpm
|
|
53
|
+
pnpm add @sumi-forge/react
|
|
54
|
+
|
|
55
|
+
# Usando yarn
|
|
56
|
+
yarn add @sumi-forge/react
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Componentes Principais
|
|
62
|
+
|
|
63
|
+
### 1. `<SumiMaskReveal />` · Revelação de Imagens a Pincel & Toque
|
|
64
|
+
|
|
65
|
+
Envolva qualquer imagem para que ela seja pintada ao vivo na tela ou revelada pelo dedo do usuário no celular.
|
|
66
|
+
|
|
67
|
+
```tsx
|
|
68
|
+
import { SumiMaskReveal } from '@sumi-forge/react';
|
|
69
|
+
|
|
70
|
+
export function ProductHeroArtwork() {
|
|
71
|
+
return (
|
|
72
|
+
<div className="w-full h-[420px] rounded-2xl overflow-hidden">
|
|
73
|
+
<SumiMaskReveal
|
|
74
|
+
src="/assets/minha-obra.png"
|
|
75
|
+
choreography="fuji_masterpiece" // 'fuji_masterpiece' | 'katana_slashes' | 'hokusai_tide' | 'enso_spiral' | 'interactive_brush'
|
|
76
|
+
duration={3.2}
|
|
77
|
+
bristleCount={26}
|
|
78
|
+
dryBrushGap={0.28}
|
|
79
|
+
showLiveInkAccents={true}
|
|
80
|
+
interactiveBrush={true}
|
|
81
|
+
showTouchControls={true}
|
|
82
|
+
/>
|
|
83
|
+
</div>
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
| Propriedade | Tipo | Padrão | Descrição |
|
|
89
|
+
| :--- | :--- | :--- | :--- |
|
|
90
|
+
| `src` | `string` | Obra Monte Fuji | URL ou Data URI da imagem a ser revelada pela máscara caligráfica. |
|
|
91
|
+
| `choreography` | `MaskChoreography` | `'fuji_masterpiece'` | Coreografia da revelação (`'fuji_masterpiece'`, `'katana_slashes'`, `'hokusai_tide'`, `'enso_spiral'`, `'interactive_brush'`). |
|
|
92
|
+
| `duration` | `number` | `3.4` | Duração da cerimônia de revelação em segundos. |
|
|
93
|
+
| `bristleCount` | `number` | `26` | Quantidade de cerdas de bambu no pincel (8 a 40). |
|
|
94
|
+
| `dryBrushGap` | `number` | `0.28` | Intensidade da textura de pincel seco *Kasure* (0.0 a 0.85). |
|
|
95
|
+
| `interactiveBrush` | `boolean` | `true` | Permite tocar ou arrastar o dedo/mouse para pintar e revelar novas áreas. |
|
|
96
|
+
| `showTouchControls` | `boolean` | `true` | Exibe a barra flutuante para alternar entre **Pintar do Zero (Toque)** e **Auto-Revelar**. |
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
### 2. `<SumiSansui />` · Paisagens Gerativas *Sansui* por Seed & Tema
|
|
101
|
+
|
|
102
|
+
Gera pinturas orientais de montanhas e águas (*Shan-Shui* / *Sansui* 山水) 100% procedurais e determinísticas por `seed`, com cristas caligráficas variáveis, hachuras internas de rocha (*Cunfa* 皴法), neblina na base das montanhas, pinheiros em nanquim e barco solitário. Adapta-se a temas prontos, **Modo Noturno** (`night_obsidian`), **Cores Personalizadas** ou **Variáveis CSS** do seu projeto (`theme="auto"`).
|
|
103
|
+
|
|
104
|
+
```tsx
|
|
105
|
+
import { SumiSansui } from '@sumi-forge/react';
|
|
106
|
+
|
|
107
|
+
export function GenerativeSansuiBanner() {
|
|
108
|
+
return (
|
|
109
|
+
<div className="w-full h-[380px] rounded-2xl overflow-hidden">
|
|
110
|
+
<SumiSansui
|
|
111
|
+
composition="panoramic_river" // 'panoramic_river' | 'karst_peaks' | 'layered_valley' | 'twin_gorges'
|
|
112
|
+
seed={8472}
|
|
113
|
+
theme="jade_mineral" // 'classic_washi' | 'jade_mineral' | 'night_obsidian' | 'crimson_dawn' | 'cobalt_porcelain' | 'auto'
|
|
114
|
+
ridgeLayers={5}
|
|
115
|
+
treeDensity={1.0}
|
|
116
|
+
mistDensity={1.0}
|
|
117
|
+
showBoat={true}
|
|
118
|
+
animated={true}
|
|
119
|
+
/>
|
|
120
|
+
</div>
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
| Propriedade | Tipo | Padrão | Descrição |
|
|
126
|
+
| :--- | :--- | :--- | :--- |
|
|
127
|
+
| `composition` | `SansuiComposition` | `'panoramic_river'` | Composição estrutural (`'panoramic_river'`, `'karst_peaks'`, `'layered_valley'`, `'twin_gorges'`). |
|
|
128
|
+
| `seed` | `number` | `8472` | Semente numérica determinística: a mesma seed recria exatamente a mesma cordilheira e vegetação. |
|
|
129
|
+
| `theme` | `SansuiThemeId` | `'classic_washi'` | Paleta pronta (`'classic_washi'`, `'jade_mineral'`, `'night_obsidian'`, `'crimson_dawn'`, `'cobalt_porcelain'`) ou `'auto'` (lê `--sumi-bg`, `--sumi-ink`, `--sumi-wash` e `.dark`). |
|
|
130
|
+
| `backgroundColor` | `string` | `undefined` | Sobrescreve livremente a cor de fundo do pergaminho. |
|
|
131
|
+
| `inkColor` | `string` | `undefined` | Sobrescreve livremente a cor dos traços de contorno, hachuras e árvores. |
|
|
132
|
+
| `washColor` | `string` | `undefined` | Sobrescreve livremente a cor da aguada mineral interna das montanhas. |
|
|
133
|
+
| `ridgeLayers` | `number` | `5` | Quantidade de planos atmosféricos de montanhas (2 a 8). |
|
|
134
|
+
| `treeDensity` | `number` | `1.0` | Densidade de pinheiros e árvores caligráficas nas encostas (0.0 a 2.0). |
|
|
135
|
+
| `showBoat` | `boolean` | `true` | Exibe a embarcação solitária deslizando nas águas calmas. |
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
### 3. `<SumiLandscape />` · Paisagem 100% Procedural do Monte Fuji & Sakura
|
|
140
|
+
|
|
141
|
+
Renderiza a cena viva do Monte Fuji, Sol Vermelho, Ilha de Pinheiros e Galho de Cerejeira com pétalas reagindo à brisa e ao cursor/toque.
|
|
142
|
+
|
|
143
|
+
```tsx
|
|
144
|
+
import { useRef } from 'react';
|
|
145
|
+
import { SumiLandscape, DEFAULT_FUJI_LAYERS } from '@sumi-forge/react';
|
|
146
|
+
|
|
147
|
+
export function LivingHeroBackground() {
|
|
148
|
+
const revealProgressRef = useRef<number>(1);
|
|
149
|
+
|
|
150
|
+
return (
|
|
151
|
+
<div className="w-full h-screen">
|
|
152
|
+
<SumiLandscape
|
|
153
|
+
revealProgressRef={revealProgressRef}
|
|
154
|
+
layers={DEFAULT_FUJI_LAYERS}
|
|
155
|
+
windSpeed={1.05}
|
|
156
|
+
animated={true}
|
|
157
|
+
interactive={true}
|
|
158
|
+
/>
|
|
159
|
+
</div>
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
### 3. `<SumiBrushCanvas />` · Atelier de Pintura com Pressão Real
|
|
167
|
+
|
|
168
|
+
Tela de pintura multi-camadas em papel Washi com 6 estilos de pincéis orientais e suporte completo a toque no celular.
|
|
169
|
+
|
|
170
|
+
```tsx
|
|
171
|
+
import { SumiBrushCanvas, MAGIC_SCHOOLS } from '@sumi-forge/react';
|
|
172
|
+
|
|
173
|
+
export function InteractivePaintingPad() {
|
|
174
|
+
return (
|
|
175
|
+
<div className="w-full h-[460px] rounded-xl overflow-hidden">
|
|
176
|
+
<SumiBrushCanvas
|
|
177
|
+
activeBrush="sakura_branch" // 'sakura_branch' | 'sumi_kasure' | 'hokusai_wave' | 'suibokuga_flame' | 'kumo_cloud' | 'tarashikomi_wash'
|
|
178
|
+
colors={MAGIC_SCHOOLS.fuji_sakura.colors}
|
|
179
|
+
strokeThickness={1.3}
|
|
180
|
+
bristleCount={26}
|
|
181
|
+
dryBrushGap={0.32}
|
|
182
|
+
activeLayer="foreground"
|
|
183
|
+
showReferenceGuide={true}
|
|
184
|
+
/>
|
|
185
|
+
</div>
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
### 4. `<SumiSectionPainter />` · Cenários que Pintam no Scroll
|
|
193
|
+
|
|
194
|
+
Pinta fundos de seção sincronizados com a rolagem da página (Galhos de Sakura, Rio de Carpas Koi, Cordilheiras na Neblina e Selo Imperial Ensō).
|
|
195
|
+
|
|
196
|
+
```tsx
|
|
197
|
+
import { useRef } from 'react';
|
|
198
|
+
import { SumiSectionPainter } from '@sumi-forge/react';
|
|
199
|
+
|
|
200
|
+
export function KoiRiverSection() {
|
|
201
|
+
const scrollProgressRef = useRef<number>(0.65);
|
|
202
|
+
|
|
203
|
+
return (
|
|
204
|
+
<section className="relative py-24 overflow-hidden">
|
|
205
|
+
<div className="absolute inset-0 z-0">
|
|
206
|
+
<SumiSectionPainter
|
|
207
|
+
theme="koi_river_rapids" // 'sakura_katana_canopy' | 'koi_river_rapids' | 'misty_mountains_sakura' | 'enso_imperial_seal'
|
|
208
|
+
scrollProgressRef={scrollProgressRef}
|
|
209
|
+
school="calligraphy_tide"
|
|
210
|
+
/>
|
|
211
|
+
</div>
|
|
212
|
+
<div className="relative z-10">
|
|
213
|
+
{/* Conteúdo da seção com cards em glassmorphismo */}
|
|
214
|
+
</div>
|
|
215
|
+
</section>
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
### 5. `<SumiButton />`, `<SumiIcon />` & `<JapaneseCalligraphy />`
|
|
223
|
+
|
|
224
|
+
Componentes de interface desenhados à mão com estética Samurai e selos japoneses (*Hanko*) com tradução interativa para Português Brasileiro ao tocar ou passar o mouse.
|
|
225
|
+
|
|
226
|
+
```tsx
|
|
227
|
+
import { SumiButton, SumiIcon, JapaneseCalligraphy } from '@sumi-forge/react';
|
|
228
|
+
|
|
229
|
+
export function SamuraiHeaderActions() {
|
|
230
|
+
return (
|
|
231
|
+
<div className="flex items-center gap-3">
|
|
232
|
+
<JapaneseCalligraphy
|
|
233
|
+
jp="花鳥風月"
|
|
234
|
+
romaji="Kachō Fūgetsu"
|
|
235
|
+
pt="Contemplar a beleza da natureza, das flores, do vento e da lua"
|
|
236
|
+
variant="hanko"
|
|
237
|
+
/>
|
|
238
|
+
|
|
239
|
+
<SumiButton variant="crimson" size="md">
|
|
240
|
+
<SumiIcon name="brush" size={18} color="#11100E" />
|
|
241
|
+
<span>Abrir Playground</span>
|
|
242
|
+
</SumiButton>
|
|
243
|
+
</div>
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## Pintura e Revelação no Mobile
|
|
251
|
+
|
|
252
|
+
O `@sumi-forge/react` foi projetado para oferecer uma experiência tátil de primeira classe em smartphones e tablets:
|
|
253
|
+
|
|
254
|
+
1. **Bloqueio Inteligente de Gestos (`touch-action: none`)**: Ao deslizar o dedo sobre o `<SumiMaskReveal />` ou `<SumiBrushCanvas />`, a página não rola acidentalmente, garantindo traços contínuos e precisos.
|
|
255
|
+
2. **Toque Simples (*Single-Tap Stamp*)**: Um único toque na tela do celular estampa automaticamente uma mancha de aquarela *Tarashikomi* acompanhada por um golpe caligráfico e flores de cerejeira.
|
|
256
|
+
3. **Modo "Pintar do Zero (Toque)"**: Limpa a máscara automática e exibe uma suave silhueta em papel Washi (12% de opacidade) para que o usuário revele a obra inteira passando o dedo na tela.
|
|
257
|
+
4. **Traços Iniciais Responsivos**: No Atelier, a composição inicial do Monte Fuji e Sakura redimensiona suas coordenadas proporcionalmente à tela do celular.
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
|
|
261
|
+
## Desenvolvimento Local
|
|
262
|
+
|
|
263
|
+
```bash
|
|
264
|
+
# 1. Instale as dependências
|
|
265
|
+
npm install
|
|
266
|
+
|
|
267
|
+
# 2. Inicie o servidor de desenvolvimento (porta 3000)
|
|
268
|
+
npm run dev
|
|
269
|
+
|
|
270
|
+
# 3. Verifique a tipagem e o build de produção
|
|
271
|
+
npm run lint
|
|
272
|
+
npm run build
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
## Documentação e Governança do Projeto
|
|
278
|
+
|
|
279
|
+
- [Guia de Contribuição (`CONTRIBUTING.md`)](./CONTRIBUTING.md)
|
|
280
|
+
- [Código de Conduta (`CODE_OF_CONDUCT.md`)](./CODE_OF_CONDUCT.md)
|
|
281
|
+
- [Template de Pull Request (`.github/PULL_REQUEST_TEMPLATE.md`)](./.github/PULL_REQUEST_TEMPLATE.md)
|
|
282
|
+
- [Licença Apache 2.0 (`LICENSE.md`)](./LICENSE.md)
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
<div align="center">
|
|
287
|
+
|
|
288
|
+
**墨 SumiForge · `@sumi-forge/react`**
|
|
289
|
+
*made with love in Japa.... ops, Brazil* 🇧🇷 ❤️ 🇯🇵
|
|
290
|
+
|
|
291
|
+
</div>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right';
|
|
3
|
+
export interface JapaneseCalligraphyProps {
|
|
4
|
+
/** Caracteres em Japonês (Kanji) */
|
|
5
|
+
jp: string;
|
|
6
|
+
/** Leitura Romaji opcional */
|
|
7
|
+
romaji?: string;
|
|
8
|
+
/** Significado auspicioso em Português-Brasileiro exibido no modal/tooltip ao passar o mouse */
|
|
9
|
+
pt: string;
|
|
10
|
+
/** Estilo visual: selo vermelho Hanko, caligrafia vertical Tategaki ou texto inline */
|
|
11
|
+
variant?: 'hanko' | 'tategaki' | 'inline';
|
|
12
|
+
/** Direção controlada onde o modal/tooltip de tradução deve aparecer */
|
|
13
|
+
tooltipPlacement?: TooltipPlacement;
|
|
14
|
+
className?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Componente <JapaneseCalligraphy /> — Mantém os ideogramas japoneses intactos no layout
|
|
18
|
+
* e exibe a tradução em Português-Brasileiro dentro de um pequeno modal/tooltip flutuante
|
|
19
|
+
* com direção controlada (top, bottom, left, right) e proteção automática contra fuga da tela.
|
|
20
|
+
*/
|
|
21
|
+
export declare const JapaneseCalligraphy: React.FC<JapaneseCalligraphyProps>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { InteractiveBrushType, SumiColors } from '../types';
|
|
3
|
+
export interface SumiBrushCanvasProps {
|
|
4
|
+
/** Tipo de pincel selecionado */
|
|
5
|
+
activeBrush?: InteractiveBrushType;
|
|
6
|
+
/** Paleta de cores atual */
|
|
7
|
+
colors?: SumiColors;
|
|
8
|
+
/** Multiplicador de espessura do pincel (0.4 a 2.5) */
|
|
9
|
+
strokeThickness?: number;
|
|
10
|
+
/** Quantidade de cerdas de bambu (6 a 40) */
|
|
11
|
+
bristleCount?: number;
|
|
12
|
+
/** Intensidade de falha de pincel seco Kasure (0.0 a 0.85) */
|
|
13
|
+
dryBrushGap?: number;
|
|
14
|
+
/** Camada onde os novos traços serão gravados */
|
|
15
|
+
activeLayer?: 'background' | 'midground' | 'foreground';
|
|
16
|
+
/** Opacidade individual de cada camada */
|
|
17
|
+
layerOpacities?: {
|
|
18
|
+
background: number;
|
|
19
|
+
midground: number;
|
|
20
|
+
foreground: number;
|
|
21
|
+
};
|
|
22
|
+
/** Exibe o guia translúcido da obra Monte Fuji & Sakura ao fundo */
|
|
23
|
+
showReferenceGuide?: boolean;
|
|
24
|
+
/** Callback de telemetria de pressão e velocidade em tempo real */
|
|
25
|
+
onTelemetryChange?: (telemetry: {
|
|
26
|
+
pressure: number;
|
|
27
|
+
velocity: number;
|
|
28
|
+
strokeCount: number;
|
|
29
|
+
isReplaying: boolean;
|
|
30
|
+
}) => void;
|
|
31
|
+
/** Referência imperativa para ações externas (replay, limpar, desfazer, exportar PNG) */
|
|
32
|
+
actionsRef?: React.MutableRefObject<{
|
|
33
|
+
replayStrokes: () => void;
|
|
34
|
+
undoStroke: () => void;
|
|
35
|
+
clearCanvas: () => void;
|
|
36
|
+
loadFujiPresetStrokes: () => void;
|
|
37
|
+
exportPng: () => void;
|
|
38
|
+
} | null>;
|
|
39
|
+
className?: string;
|
|
40
|
+
}
|
|
41
|
+
export declare const SumiBrushCanvas: React.FC<SumiBrushCanvasProps>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type SumiButtonVariant = 'crimson' | 'ink' | 'washi' | 'ghost' | 'outline';
|
|
3
|
+
export type SumiButtonSize = 'xs' | 'sm' | 'md' | 'lg';
|
|
4
|
+
export interface SumiButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
5
|
+
/** Estilo visual da caixa caligráfica */
|
|
6
|
+
variant?: SumiButtonVariant;
|
|
7
|
+
/** Tamanho e espaçamento interno */
|
|
8
|
+
size?: SumiButtonSize;
|
|
9
|
+
/** Estado ativo para abas e seletores */
|
|
10
|
+
active?: boolean;
|
|
11
|
+
/** Semente determinística para o traço Rough.js */
|
|
12
|
+
seed?: number;
|
|
13
|
+
/** Ocupar 100% da largura disponível */
|
|
14
|
+
fullWidth?: boolean;
|
|
15
|
+
children: React.ReactNode;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Componente <SumiButton />
|
|
19
|
+
* Botão retangular de bordas retas desenhadas com Rough.js, inspirado em selos e placas
|
|
20
|
+
* de xilogravura japonesa, com performance instantânea via cache de caminhos SVG.
|
|
21
|
+
*/
|
|
22
|
+
export declare const SumiButton: React.FC<SumiButtonProps>;
|
|
23
|
+
export interface SumiRoughBoxProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
24
|
+
strokeColor?: string;
|
|
25
|
+
innerAccentColor?: string | null;
|
|
26
|
+
seed?: number;
|
|
27
|
+
children: React.ReactNode;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Container retangular com borda reta desenhada por Rough.js (ideal para barras de comando, grupos de abas e selos).
|
|
31
|
+
*/
|
|
32
|
+
export declare const SumiRoughBox: React.FC<SumiRoughBoxProps>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type SumiIconName = 'logo' | 'brush' | 'katana' | 'sakura' | 'koi' | 'mountain' | 'scroll' | 'play' | 'pause' | 'replay' | 'copy' | 'check' | 'download' | 'upload' | 'undo' | 'trash' | 'eye' | 'layers' | 'sliders' | 'chevron-down' | 'close' | 'terminal';
|
|
3
|
+
export interface SumiIconProps {
|
|
4
|
+
name: SumiIconName;
|
|
5
|
+
size?: number;
|
|
6
|
+
color?: string;
|
|
7
|
+
accentColor?: string;
|
|
8
|
+
seed?: number;
|
|
9
|
+
className?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Componente <SumiIcon /> — Desenha todos os ícones da interface em nanquim monocromático
|
|
13
|
+
* nítido usando Rough.js (preserveVertices: true), mantendo estética orgânica de traço à mão
|
|
14
|
+
* com leitura imediata.
|
|
15
|
+
*/
|
|
16
|
+
export declare const SumiIcon: React.FC<SumiIconProps>;
|
|
17
|
+
export interface SumiBrandEmblemProps {
|
|
18
|
+
size?: number;
|
|
19
|
+
className?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Emblema Japonês Pintado (<SumiBrandEmblem />) — Pinta o círculo Ensō em nanquim,
|
|
23
|
+
* o sol carmesim e o ideograma 墨 (Sumi: Nanquim) à mão usando as técnicas da biblioteca.
|
|
24
|
+
*/
|
|
25
|
+
export declare const SumiBrandEmblem: React.FC<SumiBrandEmblemProps>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { SumiColors, SumiLayerIntensities } from '../types';
|
|
3
|
+
export interface SumiLandscapeProps {
|
|
4
|
+
/** Progresso de pintura animada (0.0 a 1.0). Se omitido, anima automaticamente ao montar */
|
|
5
|
+
revealProgress?: number;
|
|
6
|
+
/** Referência mutável opcional para atualizar o progresso sem re-renderizar o React */
|
|
7
|
+
revealProgressRef?: React.MutableRefObject<number | undefined>;
|
|
8
|
+
/** Controle granular de intensidade de cada camada artística (0.0 a 1.5) */
|
|
9
|
+
layers?: Partial<SumiLayerIntensities>;
|
|
10
|
+
/** Paleta cromática (padrão: Monte Fuji & Sakura Carmesim da referência) */
|
|
11
|
+
colors?: Partial<SumiColors>;
|
|
12
|
+
/** Semente determinística Mulberry32 */
|
|
13
|
+
seed?: number;
|
|
14
|
+
/** Se verdadeiro, anima continuamente pétalas de Sakura ao vento e reflexos solares na água */
|
|
15
|
+
animated?: boolean;
|
|
16
|
+
/** Velocidade da brisa das pétalas e água */
|
|
17
|
+
windSpeed?: number;
|
|
18
|
+
/** Classe CSS adicional */
|
|
19
|
+
className?: string;
|
|
20
|
+
/** Callback ao mover o cursor na cena para paralaxe sutil */
|
|
21
|
+
interactive?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Componente <SumiLandscape />
|
|
25
|
+
* Recria de forma 100% procedural, responsiva e animada a obra japonesa do Monte Fuji,
|
|
26
|
+
* Sol Vermelho, Galho de Sakura e Ilha de Pinheiros.
|
|
27
|
+
*
|
|
28
|
+
* Abertura em 3 atos fluidos a 60/120 FPS (sem engasgos):
|
|
29
|
+
* 1. O Sol Vermelho surge e se espalha como uma mancha de tinta úmida (Tarashikomi) no papel Washi.
|
|
30
|
+
* 2. Os traços de nanquim do Galho de Sakura, do Monte Fuji e da Ilha de Pinheiros deslizam pela tela.
|
|
31
|
+
* 3. Após o traço do galho estar pintado, as flores de Sakura brotam como manchas de aquarela carmesim.
|
|
32
|
+
*/
|
|
33
|
+
export declare const SumiLandscape: React.FC<SumiLandscapeProps>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { MaskChoreography } from '../types';
|
|
3
|
+
export interface SumiMaskRevealProps {
|
|
4
|
+
/** URL da imagem a ser pintada/revelada com a máscara de pinceladas (padrão: obra do Monte Fuji e Sakura) */
|
|
5
|
+
src?: string;
|
|
6
|
+
/** Texto alternativo para acessibilidade */
|
|
7
|
+
alt?: string;
|
|
8
|
+
/** Coreografia das pinceladas que revelam a imagem */
|
|
9
|
+
choreography?: MaskChoreography;
|
|
10
|
+
/** Duração total da animação de pintura em segundos */
|
|
11
|
+
duration?: number;
|
|
12
|
+
/** Quantidade de cerdas de bambu por pincelada (Técnica #03) */
|
|
13
|
+
bristleCount?: number;
|
|
14
|
+
/** Intensidade de falha de pincel seco Kasure (0.0 a 0.85) */
|
|
15
|
+
dryBrushGap?: number;
|
|
16
|
+
/** Semente determinística Mulberry32 */
|
|
17
|
+
seed?: number;
|
|
18
|
+
/** Se verdadeiro, exibe os acentos vivos de tinta úmida e pétalas sobre a imagem revelada */
|
|
19
|
+
showLiveInkAccents?: boolean;
|
|
20
|
+
/** Modo Raio-X para visualizar apenas a máscara de pinceladas pura */
|
|
21
|
+
maskOnlyPreview?: boolean;
|
|
22
|
+
/** Progresso controlado externamente (0.0 a 1.0). Se omitido, anima automaticamente */
|
|
23
|
+
progress?: number;
|
|
24
|
+
/** Chave de gatilho para reiniciar a pintura do zero */
|
|
25
|
+
replayTrigger?: number;
|
|
26
|
+
/** Permite ao usuário pintar/revelar ainda mais com o dedo, mouse ou caneta */
|
|
27
|
+
interactiveBrush?: boolean;
|
|
28
|
+
/** Exibe controles rápidos flutuantes para pintar com o dedo no mobile/desktop */
|
|
29
|
+
showTouchControls?: boolean;
|
|
30
|
+
/** Classe CSS do container */
|
|
31
|
+
className?: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Componente <SumiMaskReveal />
|
|
35
|
+
* Realiza a pintura animada de qualquer imagem passada via prop `src` combinando máscara de pinceladas
|
|
36
|
+
* Multi-Cerdas Kasure, Aguada Tarashikomi e Canvas Composite (`destination-in`), com cache offscreen
|
|
37
|
+
* e suporte completo a pintura por toque no mobile (arrastar ou tocar para revelar).
|
|
38
|
+
*/
|
|
39
|
+
export declare const SumiMaskReveal: React.FC<SumiMaskRevealProps>;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { SansuiColors, SansuiComposition, SansuiThemeId } from '../types';
|
|
3
|
+
export interface SumiSansuiProps {
|
|
4
|
+
/** Semente determinística Mulberry32: cada número gera uma paisagem única e reproduzível */
|
|
5
|
+
seed?: number;
|
|
6
|
+
/** Estilo de composição clássica Sansui (山水) */
|
|
7
|
+
composition?: SansuiComposition;
|
|
8
|
+
/** Tema pronto de cores (inclui Modo Noturno 'night_obsidian', 'jade_mineral', 'classic_washi' ou 'auto') */
|
|
9
|
+
theme?: SansuiThemeId;
|
|
10
|
+
/** Sobrescrita livre de cores (permite passar as cores da marca ou do tema do usuário) */
|
|
11
|
+
colors?: Partial<SansuiColors>;
|
|
12
|
+
/** Atalho para cor de fundo do papel/céu */
|
|
13
|
+
backgroundColor?: string;
|
|
14
|
+
/** Atalho para cor principal do nanquim / traços */
|
|
15
|
+
inkColor?: string;
|
|
16
|
+
/** Atalho para cor da aguada mineral das montanhas */
|
|
17
|
+
washColor?: string;
|
|
18
|
+
/** Quantidade de planos de montanhas (3 a 8) */
|
|
19
|
+
ridgeLayers?: number;
|
|
20
|
+
/** Densidade de pinheiros e árvores nas encostas (0.0 a 2.0) */
|
|
21
|
+
treeDensity?: number;
|
|
22
|
+
/** Intensidade da neblina entre os vales (0.0 a 1.5) */
|
|
23
|
+
mistDensity?: number;
|
|
24
|
+
/** Exibe o pescador solitário em seu barco (sampan) */
|
|
25
|
+
showBoat?: boolean;
|
|
26
|
+
/** Ativa o movimento sutil da água, da neblina e do barco */
|
|
27
|
+
animated?: boolean;
|
|
28
|
+
/** Referência opcional para exportar a pintura gerada em PNG de alta definição */
|
|
29
|
+
actionsRef?: React.MutableRefObject<{
|
|
30
|
+
exportPng: (filename?: string) => void;
|
|
31
|
+
} | null>;
|
|
32
|
+
/** Classe CSS adicional */
|
|
33
|
+
className?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Componente <SumiSansui />
|
|
37
|
+
* Motor próprio de pintura gerativa de paisagens Sansui / Shan-Shui (山水) controlado por seed,
|
|
38
|
+
* com suporte a temas prontos, Modo Noturno, variáveis CSS e cores customizadas.
|
|
39
|
+
*/
|
|
40
|
+
export declare const SumiSansui: React.FC<SumiSansuiProps>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { SchoolId } from '../types';
|
|
3
|
+
export type SectionPaintingTheme = 'header_single_stroke' | 'sakura_katana_canopy' | 'koi_river_rapids' | 'misty_mountains_sakura' | 'enso_imperial_seal';
|
|
4
|
+
export interface SumiSectionPainterProps {
|
|
5
|
+
/** Cena artística japonesa pintada pelo pacote */
|
|
6
|
+
theme: SectionPaintingTheme;
|
|
7
|
+
/** Progresso de pintura controlado pelo scroll GSAP ou animação (0.0 a 1.0) */
|
|
8
|
+
scrollProgress?: number;
|
|
9
|
+
/** Referência mutável opcional para atualizar progresso sem re-renderizar o React */
|
|
10
|
+
scrollProgressRef?: React.MutableRefObject<number>;
|
|
11
|
+
/** Paleta cromática ativa */
|
|
12
|
+
school?: SchoolId;
|
|
13
|
+
/** Semente determinística */
|
|
14
|
+
seed?: number;
|
|
15
|
+
/** Movimento orgânico contínuo (vento, água, nado das carpas) */
|
|
16
|
+
ambientMotion?: boolean;
|
|
17
|
+
className?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Componente <SumiSectionPainter />
|
|
21
|
+
* Pinta cenas completas de pergaminho japonês sincronizadas com o scroll.
|
|
22
|
+
* Utiliza cache em canvas offscreen e IntersectionObserver para manter 60/120 FPS com uso mínimo de CPU.
|
|
23
|
+
*/
|
|
24
|
+
export declare const SumiSectionPainter: React.FC<SumiSectionPainterProps>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface SumiStrokeProps {
|
|
3
|
+
/** Estilo da pincelada decorativa ou divisor de seção */
|
|
4
|
+
variant?: 'horizontal_kasure' | 's_curve_flourish' | 'enso_seal' | 'sakura_branch_divider';
|
|
5
|
+
/** Cor primária do nanquim */
|
|
6
|
+
inkColor?: string;
|
|
7
|
+
/** Cor secundária de acento (ex: vermelho Sakura / Hanko) */
|
|
8
|
+
accentColor?: string;
|
|
9
|
+
/** Quantidade de cerdas */
|
|
10
|
+
bristleCount?: number;
|
|
11
|
+
/** Falha de pincel seco Kasure */
|
|
12
|
+
dryBrushGap?: number;
|
|
13
|
+
/** Espessura máxima em pixels */
|
|
14
|
+
thickness?: number;
|
|
15
|
+
/** Semente determinística */
|
|
16
|
+
seed?: number;
|
|
17
|
+
/** Anima a pincelada ao montar */
|
|
18
|
+
animateOnMount?: boolean;
|
|
19
|
+
className?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Componente <SumiStroke /> — Pincelada caligráfica declarativa para divisores de seção,
|
|
23
|
+
* sublinhados editoriais, selos Ensō e ramos ornamentais de Sakura.
|
|
24
|
+
*/
|
|
25
|
+
export declare const SumiStroke: React.FC<SumiStrokeProps>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { VFXConfig } from '../types';
|
|
3
|
+
export interface SumiVFXProps {
|
|
4
|
+
/** Configuração parcial ou completa do efeito Sakuga */
|
|
5
|
+
config?: Partial<VFXConfig>;
|
|
6
|
+
/** Modo de exibição: animação contínua ('player') ou folha de sprites 4x4 ('spritesheet') */
|
|
7
|
+
mode?: 'player' | 'spritesheet';
|
|
8
|
+
/** Quadro fixo opcional [0..15]. Se omitido, anima continuamente na taxa `fps` */
|
|
9
|
+
fixedFrame?: number | null;
|
|
10
|
+
/** Resolução do canvas em pixels */
|
|
11
|
+
size?: number;
|
|
12
|
+
/** Se verdadeiro, pausa a reprodução automática */
|
|
13
|
+
paused?: boolean;
|
|
14
|
+
/** Callback por frame para sincronizar UI externa */
|
|
15
|
+
onFrameTick?: (frameIndex: number) => void;
|
|
16
|
+
className?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Componente <SumiVFX />
|
|
20
|
+
* Renderizador declarativo de efeitos procedurais de 16 quadros com Cinética Sakuga.
|
|
21
|
+
* Redesenha apenas quando o quadro avança (ex: 16 FPS) e pausa automaticamente fora da viewport.
|
|
22
|
+
*/
|
|
23
|
+
export declare const SumiVFX: React.FC<SumiVFXProps>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Técnica #12: Codificador Binário GIF89a LZW Completo
|
|
3
|
+
* Quantização de paleta 6x6x6 (216 cores) + índice dedicado de transparência (255),
|
|
4
|
+
* Graphics Control Extension (0x21 0xF9) com Disposal Method = 2 (Restore to Background),
|
|
5
|
+
* e compressão LZW de código variável (9 a 12 bits) sem dependências externas.
|
|
6
|
+
*/
|
|
7
|
+
export declare function encodeAnimatedGIF89a(frames: ImageData[], width: number, height: number, fps: number): Uint8Array;
|