@whykusanagi/corrupted-theme 0.1.1 → 0.1.3
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/CHANGELOG.md +253 -0
- package/README.md +97 -7
- package/docs/CAPABILITIES.md +209 -0
- package/docs/CHARACTER_LEVEL_CORRUPTION.md +264 -0
- package/docs/COMPONENTS_REFERENCE.md +295 -8
- package/docs/CORRUPTION_PHRASES.md +529 -0
- package/docs/FUTURE_WORK.md +189 -0
- package/docs/IMPLEMENTATION_VALIDATION.md +401 -0
- package/docs/LLM_PROVIDERS.md +345 -0
- package/docs/PERSONALITY.md +128 -0
- package/docs/ROADMAP.md +266 -0
- package/docs/ROUTING.md +324 -0
- package/docs/STYLE_GUIDE.md +605 -0
- package/docs/brand/BRAND_OVERVIEW.md +413 -0
- package/docs/brand/COLOR_SYSTEM.md +583 -0
- package/docs/brand/DESIGN_TOKENS.md +1009 -0
- package/docs/brand/TRANSLATION_FAILURE_AESTHETIC.md +525 -0
- package/docs/brand/TYPOGRAPHY.md +624 -0
- package/docs/components/ANIMATION_GUIDELINES.md +901 -0
- package/docs/components/COMPONENT_LIBRARY.md +1061 -0
- package/docs/components/GLASSMORPHISM.md +602 -0
- package/docs/components/INTERACTIVE_STATES.md +766 -0
- package/docs/governance/CONTRIBUTION_GUIDELINES.md +593 -0
- package/docs/governance/DESIGN_SYSTEM_GOVERNANCE.md +451 -0
- package/docs/governance/VERSION_MANAGEMENT.md +447 -0
- package/docs/governance/VERSION_REFERENCES.md +229 -0
- package/docs/platforms/CLI_IMPLEMENTATION.md +1025 -0
- package/docs/platforms/COMPONENT_MAPPING.md +579 -0
- package/docs/platforms/NPM_PACKAGE.md +854 -0
- package/docs/platforms/WEB_IMPLEMENTATION.md +1221 -0
- package/docs/standards/ACCESSIBILITY.md +715 -0
- package/docs/standards/ANTI_PATTERNS.md +554 -0
- package/docs/standards/SPACING_SYSTEM.md +549 -0
- package/examples/assets/celeste-avatar.png +0 -0
- package/examples/button.html +22 -10
- package/examples/card.html +22 -9
- package/examples/extensions-showcase.html +716 -0
- package/examples/form.html +22 -9
- package/examples/index.html +619 -396
- package/examples/layout.html +22 -8
- package/examples/nikke-team-builder.html +23 -9
- package/examples/showcase-complete.html +884 -28
- package/examples/showcase.html +21 -8
- package/package.json +14 -5
- package/src/css/components.css +676 -0
- package/src/css/extensions.css +933 -0
- package/src/css/theme.css +6 -74
- package/src/css/typography.css +5 -0
- package/src/lib/character-corruption.js +563 -0
- package/src/lib/components.js +283 -0
- package/src/lib/countdown-widget.js +609 -0
- package/src/lib/gallery.js +481 -0
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
# Character-Level Corruption - Implementation Guide
|
|
2
|
+
|
|
3
|
+
**Date**: 2025-12-12
|
|
4
|
+
**Issue Fixed**: Dashboard titles now use character-level Japanese mixing instead of word replacement
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## The Problem
|
|
9
|
+
|
|
10
|
+
The old dashboard had Japanese characters mixed **INTO** English words like:
|
|
11
|
+
```
|
|
12
|
+
👁️ US使AGE ANア統LYTICS 👁️
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
But the implementation was using word-level replacement:
|
|
16
|
+
```
|
|
17
|
+
👁️ 使用 tōkei 👁️ (replaces whole words)
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
This didn't match the style guide examples like:
|
|
21
|
+
- `"loaディング"` - Japanese mixed into "loading"
|
|
22
|
+
- `"pro理cessing"` - Japanese mixed into "processing"
|
|
23
|
+
- `"ana分lysing"` - Japanese mixed into "analyzing"
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## The Solution
|
|
28
|
+
|
|
29
|
+
### New Function: `CorruptTextJapanese()`
|
|
30
|
+
|
|
31
|
+
**Location**: `cmd/celeste/tui/streaming.go` (line 252) and `cmd/celeste/commands/corruption.go`
|
|
32
|
+
|
|
33
|
+
This function mixes Japanese characters **INTO** English words at the character level:
|
|
34
|
+
|
|
35
|
+
```go
|
|
36
|
+
func CorruptTextJapanese(text string, intensity float64) string {
|
|
37
|
+
katakana := []rune("アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン")
|
|
38
|
+
kanjiFragments := []rune("壊虚深淵闇処理分析監視接続統計使用読込実行")
|
|
39
|
+
|
|
40
|
+
// For each character:
|
|
41
|
+
// 50% chance: Replace with Katakana
|
|
42
|
+
// 25% chance: Replace with Kanji
|
|
43
|
+
// 25% chance: Keep + maybe insert Katakana after
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Example Outputs
|
|
48
|
+
|
|
49
|
+
**Input**: `"USAGE ANALYTICS"`
|
|
50
|
+
**Intensity**: `0.35`
|
|
51
|
+
|
|
52
|
+
**Possible outputs** (randomized each time):
|
|
53
|
+
```
|
|
54
|
+
"US使AGE ANア統LYTICS"
|
|
55
|
+
"USアGE AN統AL読TICSカ"
|
|
56
|
+
"USカGE 分NALYTI監S"
|
|
57
|
+
"U接AGE処A壊ALYTICS"
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
The Japanese characters are mixed IN, making it readable but glitchy!
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Files Updated
|
|
65
|
+
|
|
66
|
+
### 1. `cmd/celeste/commands/corruption.go`
|
|
67
|
+
|
|
68
|
+
**Added** (line 124):
|
|
69
|
+
```go
|
|
70
|
+
func corruptTextCharacterLevel(text string, intensity float64) string {
|
|
71
|
+
// Character-level Japanese mixing
|
|
72
|
+
// Same implementation as CorruptTextJapanese
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### 2. `cmd/celeste/commands/stats.go`
|
|
77
|
+
|
|
78
|
+
**Changed** (line 194):
|
|
79
|
+
```go
|
|
80
|
+
// OLD (word replacement):
|
|
81
|
+
title := corruptTextSimple("USAGE ANALYTICS", 0.40)
|
|
82
|
+
|
|
83
|
+
// NEW (character mixing):
|
|
84
|
+
title := corruptTextCharacterLevel("USAGE ANALYTICS", 0.35)
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 3. `cmd/celeste/tui/streaming.go`
|
|
88
|
+
|
|
89
|
+
**Added** (line 252):
|
|
90
|
+
```go
|
|
91
|
+
func CorruptTextJapanese(text string, intensity float64) string {
|
|
92
|
+
// Character-level Japanese mixing
|
|
93
|
+
// Available throughout TUI
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
**Kept** (line 233):
|
|
98
|
+
```go
|
|
99
|
+
func CorruptText(text string, intensity float64) string {
|
|
100
|
+
// Block character corruption (█▓▒░)
|
|
101
|
+
// For skill execution, heavy glitching
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Two Corruption Types
|
|
108
|
+
|
|
109
|
+
### Type 1: Character-Level Japanese Mixing ✨ **NEW**
|
|
110
|
+
|
|
111
|
+
**Function**: `CorruptTextJapanese()` or `corruptTextCharacterLevel()`
|
|
112
|
+
**Output**: `"US使AGE ANア統LYTICS"` (readable with Japanese)
|
|
113
|
+
**Use for**: Dashboard titles, section headers, any text that should stay readable
|
|
114
|
+
|
|
115
|
+
```go
|
|
116
|
+
// Dashboard header
|
|
117
|
+
title := tui.CorruptTextJapanese("USAGE ANALYTICS", 0.35)
|
|
118
|
+
|
|
119
|
+
// Section header
|
|
120
|
+
section := tui.CorruptTextJapanese("PROVIDER BREAKDOWN", 0.30)
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**Intensity Guide**:
|
|
124
|
+
- `0.25-0.30`: Light corruption (25-30% chars replaced)
|
|
125
|
+
- `0.30-0.35`: Medium corruption (30-35% chars replaced) ← **Recommended for titles**
|
|
126
|
+
- `0.35-0.40`: Heavy corruption (35-40% chars replaced)
|
|
127
|
+
|
|
128
|
+
### Type 2: Block Character Corruption
|
|
129
|
+
|
|
130
|
+
**Function**: `CorruptText()`
|
|
131
|
+
**Output**: `"tar▓█_r▒ad░ng"` (hard to read, heavy glitching)
|
|
132
|
+
**Use for**: Skill names during execution, loading animations
|
|
133
|
+
|
|
134
|
+
```go
|
|
135
|
+
// Skill execution (strikethrough + corruption)
|
|
136
|
+
skillName := tui.CorruptText("tarot_reading", 0.40)
|
|
137
|
+
|
|
138
|
+
// Loading state
|
|
139
|
+
loading := tui.CorruptText("Loading...", 0.30)
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**Intensity Guide**:
|
|
143
|
+
- `0.30-0.35`: Light block corruption
|
|
144
|
+
- `0.35-0.40`: Medium block corruption ← **Recommended for skills**
|
|
145
|
+
- `0.40-0.50`: Heavy block corruption
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## When to Use Each Function
|
|
150
|
+
|
|
151
|
+
| Context | Function | Intensity | Example |
|
|
152
|
+
|---------|----------|-----------|---------|
|
|
153
|
+
| Dashboard title | `CorruptTextJapanese` | 0.35 | "US使AGE ANア統LYTICS" |
|
|
154
|
+
| Section header | `CorruptTextJapanese` | 0.30 | "PROバIDERア BREア統KDOWN" |
|
|
155
|
+
| Subsection | `CorruptTextJapanese` | 0.25 | "TO監AL SEセSSI使NS" |
|
|
156
|
+
| Skill executing | `CorruptText` | 0.40 | "tar▓█_r▒ad░ng" |
|
|
157
|
+
| Loading animation | `CorruptText` | 0.30 | "L▓ad█ng..." |
|
|
158
|
+
| Status phrases | Neither (use phrase bank) | N/A | "処理 processing purosesu..." |
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Testing the Fix
|
|
163
|
+
|
|
164
|
+
### Before (Word Replacement):
|
|
165
|
+
```bash
|
|
166
|
+
celeste chat
|
|
167
|
+
/stats
|
|
168
|
+
```
|
|
169
|
+
Output was:
|
|
170
|
+
```
|
|
171
|
+
👁️ 使用 tōkei 👁️ (whole words replaced)
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### After (Character Mixing):
|
|
175
|
+
```bash
|
|
176
|
+
celeste chat
|
|
177
|
+
/stats
|
|
178
|
+
```
|
|
179
|
+
Output is now (randomized):
|
|
180
|
+
```
|
|
181
|
+
👁️ US使AGE ANア統LYTICS 👁️ (Japanese mixed in)
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Each time you run `/stats`, the corruption is randomized, so you'll see different variations like:
|
|
185
|
+
- `"US使AGE ANア統LYTICS"`
|
|
186
|
+
- `"USアGE AN統AL読TICSカ"`
|
|
187
|
+
- `"USカGE 分NALYTI監S"`
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## Visual Comparison
|
|
192
|
+
|
|
193
|
+
### Old Implementation (Word-Level)
|
|
194
|
+
```
|
|
195
|
+
▓▒░ ═══════════════════════════════════════ ░▒▓
|
|
196
|
+
👁️ 使用 統計 👁️
|
|
197
|
+
⟨ tōkei dēta wo... fuhai sasete iru... ⟩
|
|
198
|
+
▓▒░ ═══════════════════════════════════════ ░▒▓
|
|
199
|
+
```
|
|
200
|
+
**Problem**: Entire words replaced, not mixed
|
|
201
|
+
|
|
202
|
+
### New Implementation (Character-Level)
|
|
203
|
+
```
|
|
204
|
+
▓▒░ ═══════════════════════════════════════ ░▒▓
|
|
205
|
+
👁️ US使AGE ANア統LYTICS 👁️
|
|
206
|
+
⟨ tōkei dēta wo... fuhai sasete iru... ⟩
|
|
207
|
+
▓▒░ ═══════════════════════════════════════ ░▒▓
|
|
208
|
+
```
|
|
209
|
+
**Solution**: Japanese characters mixed INTO English ✓
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Matches Style Guide Examples
|
|
214
|
+
|
|
215
|
+
The new implementation now matches all the examples from `STYLE_GUIDE.md`:
|
|
216
|
+
|
|
217
|
+
✅ `"loading"` → `"loaディング"`
|
|
218
|
+
✅ `"processing"` → `"pro理cessing"`
|
|
219
|
+
✅ `"analyzing"` → `"ana分lysing"`
|
|
220
|
+
✅ `"corrupting"` → `"cor壊rupting"`
|
|
221
|
+
✅ `"statistics"` → `"sta計stics"`
|
|
222
|
+
|
|
223
|
+
And the dashboard title:
|
|
224
|
+
✅ `"USAGE ANALYTICS"` → `"US使AGE ANア統LYTICS"`
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## Implementation Notes
|
|
229
|
+
|
|
230
|
+
### Why Two Functions?
|
|
231
|
+
|
|
232
|
+
1. **Readable corruption** (Japanese mixing) - For UI text users need to read
|
|
233
|
+
2. **Heavy corruption** (block characters) - For dramatic effect when readability isn't critical
|
|
234
|
+
|
|
235
|
+
### Why the Old Implementation Was Wrong
|
|
236
|
+
|
|
237
|
+
The old `corruptTextSimple()` function did **semantic word replacement**:
|
|
238
|
+
- "USAGE" → `"使用"` (whole word)
|
|
239
|
+
- "ANALYTICS" → `"統計"` (whole word)
|
|
240
|
+
|
|
241
|
+
This was more of a **translation** than **corruption**. The aesthetic requires **glitchy mixing** where Japanese interrupts English mid-word.
|
|
242
|
+
|
|
243
|
+
### Performance
|
|
244
|
+
|
|
245
|
+
Character-level mixing is slightly more expensive than word replacement, but the difference is negligible:
|
|
246
|
+
- Dashboard renders once per `/stats` command
|
|
247
|
+
- Randomization happens at display time
|
|
248
|
+
- No caching needed (variations are a feature!)
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## Related Files
|
|
253
|
+
|
|
254
|
+
- **Implementation**: `tui/streaming.go:252` and `commands/corruption.go:124`
|
|
255
|
+
- **Usage**: `commands/stats.go:194`
|
|
256
|
+
- **Style Guide**: `docs/STYLE_GUIDE.md`
|
|
257
|
+
- **Phrase Library**: `docs/CORRUPTION_PHRASES.md`
|
|
258
|
+
- **Validation**: `docs/IMPLEMENTATION_VALIDATION.md`
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
**Status**: ✅ **FIXED** - Dashboard now uses character-level corruption
|
|
263
|
+
**Tested**: Visual output matches style guide examples
|
|
264
|
+
**Impact**: All dashboard headers now have proper translation-failure aesthetic
|
|
@@ -17,6 +17,12 @@ This document provides a comprehensive reference for all components available in
|
|
|
17
17
|
6. [API Documentation](#api-documentation)
|
|
18
18
|
7. [Nikke Components](#nikke-components)
|
|
19
19
|
8. [Background & Images](#background--images)
|
|
20
|
+
9. [Extension Components](#extension-components)
|
|
21
|
+
- [Gallery System](#gallery-system)
|
|
22
|
+
- [Lightbox](#lightbox)
|
|
23
|
+
- [NSFW Content Blur](#nsfw-content-blur)
|
|
24
|
+
- [Social Links List](#social-links-list)
|
|
25
|
+
- [Countdown Widget](#countdown-widget)
|
|
20
26
|
|
|
21
27
|
---
|
|
22
28
|
|
|
@@ -445,7 +451,7 @@ Complete API documentation components for building readable API docs.
|
|
|
445
451
|
|
|
446
452
|
## Nikke Components
|
|
447
453
|
|
|
448
|
-
Game-specific components for Nikke applications.
|
|
454
|
+
Game-specific components for Nikke applications.
|
|
449
455
|
|
|
450
456
|
### Element Badges
|
|
451
457
|
|
|
@@ -632,7 +638,7 @@ All components follow accessibility best practices:
|
|
|
632
638
|
|
|
633
639
|
## Customization
|
|
634
640
|
|
|
635
|
-
All components use CSS variables for easy customization. See
|
|
641
|
+
All components use CSS variables for easy customization. See `src/css/variables.css` for the complete variable list.
|
|
636
642
|
|
|
637
643
|
```css
|
|
638
644
|
:root {
|
|
@@ -644,16 +650,297 @@ All components use CSS variables for easy customization. See [VARIABLES_REFERENC
|
|
|
644
650
|
|
|
645
651
|
---
|
|
646
652
|
|
|
653
|
+
## Extension Components
|
|
654
|
+
|
|
655
|
+
Production-tested components from whykusanagi.xyz for galleries, social links, countdowns, and more. Import via `extensions.css` (included in `theme.css`) or individually.
|
|
656
|
+
|
|
657
|
+
### Gallery System
|
|
658
|
+
|
|
659
|
+
Responsive gallery grid with filtering and lightbox integration.
|
|
660
|
+
|
|
661
|
+
**Filter Bar:**
|
|
662
|
+
```html
|
|
663
|
+
<div class="filter-bar">
|
|
664
|
+
<button class="filter-btn active" data-filter="all">All</button>
|
|
665
|
+
<button class="filter-btn" data-filter="photos">Photos</button>
|
|
666
|
+
<button class="filter-btn" data-filter="art">Art</button>
|
|
667
|
+
</div>
|
|
668
|
+
```
|
|
669
|
+
|
|
670
|
+
**Gallery Container:**
|
|
671
|
+
```html
|
|
672
|
+
<div class="gallery-container" id="my-gallery">
|
|
673
|
+
<div class="gallery-item" data-tags="photos">
|
|
674
|
+
<img src="image.jpg" alt="Description">
|
|
675
|
+
<div class="gallery-caption">
|
|
676
|
+
<div class="title">Image Title</div>
|
|
677
|
+
<div class="meta">Category • Date</div>
|
|
678
|
+
</div>
|
|
679
|
+
</div>
|
|
680
|
+
</div>
|
|
681
|
+
```
|
|
682
|
+
|
|
683
|
+
**Variants:**
|
|
684
|
+
- `.gallery-container.compact` - Smaller grid items (200px min)
|
|
685
|
+
- `.gallery-container.large` - Larger grid items (350px min)
|
|
686
|
+
- `.gallery-item.square` - 1:1 aspect ratio
|
|
687
|
+
- `.gallery-item.portrait` - 3:4 aspect ratio
|
|
688
|
+
- `.gallery-item.landscape` - 16:9 aspect ratio
|
|
689
|
+
- `.filter-bar.left` - Left-aligned filters
|
|
690
|
+
- `.filter-bar.right` - Right-aligned filters
|
|
691
|
+
|
|
692
|
+
**JavaScript Integration:**
|
|
693
|
+
```javascript
|
|
694
|
+
import { initGallery } from '@whykusanagi/corrupted-theme/gallery';
|
|
695
|
+
|
|
696
|
+
const gallery = initGallery('#my-gallery', {
|
|
697
|
+
filterBarSelector: '.filter-bar .filter-btn',
|
|
698
|
+
enableLightbox: true,
|
|
699
|
+
enableNsfw: true,
|
|
700
|
+
filterAnimation: true,
|
|
701
|
+
onFilter: (filter) => console.log('Filtered:', filter)
|
|
702
|
+
});
|
|
703
|
+
|
|
704
|
+
// Manual filter
|
|
705
|
+
gallery.filter('photos');
|
|
706
|
+
```
|
|
707
|
+
|
|
708
|
+
---
|
|
709
|
+
|
|
710
|
+
### Lightbox
|
|
711
|
+
|
|
712
|
+
Fullscreen image viewer with keyboard navigation and touch gestures.
|
|
713
|
+
|
|
714
|
+
```html
|
|
715
|
+
<!-- Lightbox is auto-created by gallery.js -->
|
|
716
|
+
<!-- Manual creation (if needed): -->
|
|
717
|
+
<div class="lightbox" id="my-lightbox">
|
|
718
|
+
<button class="lightbox-close">×</button>
|
|
719
|
+
<button class="lightbox-prev"><i class="fas fa-chevron-left"></i></button>
|
|
720
|
+
<img class="lightbox-image" src="" alt="">
|
|
721
|
+
<button class="lightbox-next"><i class="fas fa-chevron-right"></i></button>
|
|
722
|
+
<div class="lightbox-caption"></div>
|
|
723
|
+
<div class="lightbox-counter"></div>
|
|
724
|
+
</div>
|
|
725
|
+
```
|
|
726
|
+
|
|
727
|
+
**Features:**
|
|
728
|
+
- Keyboard navigation (Arrow keys, Escape)
|
|
729
|
+
- Touch swipe gestures on mobile
|
|
730
|
+
- Click outside to close
|
|
731
|
+
- Image counter display
|
|
732
|
+
- Automatic caption display
|
|
733
|
+
|
|
734
|
+
**JavaScript API:**
|
|
735
|
+
```javascript
|
|
736
|
+
const gallery = initGallery('#gallery');
|
|
737
|
+
|
|
738
|
+
// Open specific image
|
|
739
|
+
gallery.openLightbox(0);
|
|
740
|
+
|
|
741
|
+
// Close lightbox
|
|
742
|
+
gallery.closeLightbox();
|
|
743
|
+
```
|
|
744
|
+
|
|
745
|
+
---
|
|
746
|
+
|
|
747
|
+
### NSFW Content Blur
|
|
748
|
+
|
|
749
|
+
Content warning overlay with click-to-reveal functionality.
|
|
750
|
+
|
|
751
|
+
```html
|
|
752
|
+
<!-- Default warning text -->
|
|
753
|
+
<div class="gallery-item nsfw-content">
|
|
754
|
+
<img src="sensitive-image.jpg" alt="Description">
|
|
755
|
+
</div>
|
|
756
|
+
|
|
757
|
+
<!-- Custom warning text -->
|
|
758
|
+
<div class="gallery-item nsfw-content" data-warning="Sensitive Content">
|
|
759
|
+
<img src="image.jpg" alt="Description">
|
|
760
|
+
</div>
|
|
761
|
+
```
|
|
762
|
+
|
|
763
|
+
**States:**
|
|
764
|
+
- Default: Blurred with "18+ Click to View" overlay
|
|
765
|
+
- `.revealed`: Blur removed, overlay hidden
|
|
766
|
+
|
|
767
|
+
**JavaScript API:**
|
|
768
|
+
```javascript
|
|
769
|
+
const gallery = initGallery('#gallery', {
|
|
770
|
+
enableNsfw: true,
|
|
771
|
+
nsfwWarning: 'Click to View',
|
|
772
|
+
onNsfwReveal: (element) => console.log('Revealed:', element)
|
|
773
|
+
});
|
|
774
|
+
|
|
775
|
+
// Manual reveal
|
|
776
|
+
gallery.revealNsfw(element);
|
|
777
|
+
```
|
|
778
|
+
|
|
779
|
+
---
|
|
780
|
+
|
|
781
|
+
### Social Links List
|
|
782
|
+
|
|
783
|
+
Link-in-bio style layout for social profiles.
|
|
784
|
+
|
|
785
|
+
```html
|
|
786
|
+
<div class="social-links-container">
|
|
787
|
+
<img src="avatar.jpg" alt="Profile" class="profile-avatar">
|
|
788
|
+
<h1 class="profile-name">@username</h1>
|
|
789
|
+
<p class="profile-bio">Your bio text here.</p>
|
|
790
|
+
|
|
791
|
+
<div class="link-list">
|
|
792
|
+
<!-- Platform-specific hover colors -->
|
|
793
|
+
<a href="#" class="link-item twitter">
|
|
794
|
+
<i class="fab fa-twitter"></i> Twitter
|
|
795
|
+
</a>
|
|
796
|
+
<a href="#" class="link-item instagram">
|
|
797
|
+
<i class="fab fa-instagram"></i> Instagram
|
|
798
|
+
</a>
|
|
799
|
+
<a href="#" class="link-item youtube">
|
|
800
|
+
<i class="fab fa-youtube"></i> YouTube
|
|
801
|
+
</a>
|
|
802
|
+
<a href="#" class="link-item github">
|
|
803
|
+
<i class="fab fa-github"></i> GitHub
|
|
804
|
+
</a>
|
|
805
|
+
<a href="#" class="link-item discord">
|
|
806
|
+
<i class="fab fa-discord"></i> Discord
|
|
807
|
+
</a>
|
|
808
|
+
<a href="#" class="link-item twitch">
|
|
809
|
+
<i class="fab fa-twitch"></i> Twitch
|
|
810
|
+
</a>
|
|
811
|
+
<!-- Default accent color -->
|
|
812
|
+
<a href="#" class="link-item">
|
|
813
|
+
<i class="fas fa-globe"></i> Website
|
|
814
|
+
</a>
|
|
815
|
+
</div>
|
|
816
|
+
</div>
|
|
817
|
+
```
|
|
818
|
+
|
|
819
|
+
**Avatar Sizes:**
|
|
820
|
+
- `.profile-avatar.sm` - 100px diameter
|
|
821
|
+
- `.profile-avatar` - 140px diameter (default)
|
|
822
|
+
- `.profile-avatar.lg` - 180px diameter
|
|
823
|
+
|
|
824
|
+
**Platform Classes:**
|
|
825
|
+
Each platform class applies branded hover colors:
|
|
826
|
+
- `.twitter` - Twitter blue
|
|
827
|
+
- `.instagram` - Instagram gradient
|
|
828
|
+
- `.youtube` - YouTube red
|
|
829
|
+
- `.github` - GitHub dark
|
|
830
|
+
- `.discord` - Discord purple
|
|
831
|
+
- `.twitch` - Twitch purple
|
|
832
|
+
|
|
833
|
+
---
|
|
834
|
+
|
|
835
|
+
### Countdown Widget
|
|
836
|
+
|
|
837
|
+
Event countdown with configurable shapes and animations.
|
|
838
|
+
|
|
839
|
+
**HTML Container:**
|
|
840
|
+
```html
|
|
841
|
+
<div id="countdown-widget"></div>
|
|
842
|
+
```
|
|
843
|
+
|
|
844
|
+
**JavaScript Initialization:**
|
|
845
|
+
```javascript
|
|
846
|
+
import { initCountdown } from '@whykusanagi/corrupted-theme/countdown';
|
|
847
|
+
|
|
848
|
+
// Inline configuration
|
|
849
|
+
initCountdown({
|
|
850
|
+
config: {
|
|
851
|
+
title: 'Product Launch',
|
|
852
|
+
eventDate: '2025-04-01T00:00:00-07:00',
|
|
853
|
+
completedMessage: 'Now Available!',
|
|
854
|
+
character: {
|
|
855
|
+
image: 'character.png',
|
|
856
|
+
rotation: 0,
|
|
857
|
+
background: {
|
|
858
|
+
type: 'diamond',
|
|
859
|
+
color: 'radial-gradient(circle, rgba(54, 83, 161, 0.6), rgba(217, 79, 144, 0.6))',
|
|
860
|
+
borderColor: '#4c2967'
|
|
861
|
+
},
|
|
862
|
+
overlay: {
|
|
863
|
+
image: 'overlay.png',
|
|
864
|
+
position: 'behind',
|
|
865
|
+
animation: 'float'
|
|
866
|
+
}
|
|
867
|
+
},
|
|
868
|
+
popup: {
|
|
869
|
+
message: '<strong>Pre-order now!</strong>',
|
|
870
|
+
frequency: 15000,
|
|
871
|
+
duration: 5000
|
|
872
|
+
}
|
|
873
|
+
}
|
|
874
|
+
});
|
|
875
|
+
|
|
876
|
+
// Or load from JSON via URL parameter
|
|
877
|
+
// Access: page.html?event=kirara loads /data/countdown/kirara.json
|
|
878
|
+
initCountdown();
|
|
879
|
+
```
|
|
880
|
+
|
|
881
|
+
**Shape Types:**
|
|
882
|
+
- `diamond` - Rotated square (default)
|
|
883
|
+
- `circle` - Round container
|
|
884
|
+
- `heart` - Heart shape
|
|
885
|
+
- `star` - 5-point star
|
|
886
|
+
- `hexagon` - 6-sided polygon
|
|
887
|
+
- `octagon` - 8-sided polygon
|
|
888
|
+
|
|
889
|
+
**Configuration Schema:**
|
|
890
|
+
```javascript
|
|
891
|
+
{
|
|
892
|
+
title: string, // Display title
|
|
893
|
+
eventDate: string, // ISO 8601 date
|
|
894
|
+
completedMessage: string, // Message when countdown ends
|
|
895
|
+
character: {
|
|
896
|
+
image: string, // Image URL
|
|
897
|
+
rotation: number, // Degrees (0-360)
|
|
898
|
+
objectPosition: string, // CSS object-position
|
|
899
|
+
background: {
|
|
900
|
+
type: string, // Shape type
|
|
901
|
+
color: string, // CSS background
|
|
902
|
+
borderColor: string // Hex color
|
|
903
|
+
},
|
|
904
|
+
overlay: {
|
|
905
|
+
image: string, // Overlay image URL
|
|
906
|
+
position: 'behind'|'front',
|
|
907
|
+
animation: 'float'|null,
|
|
908
|
+
rotation: number
|
|
909
|
+
}
|
|
910
|
+
},
|
|
911
|
+
popup: {
|
|
912
|
+
message: string, // HTML content
|
|
913
|
+
frequency: number, // Ms between popups
|
|
914
|
+
duration: number, // Ms popup visible
|
|
915
|
+
colors: {
|
|
916
|
+
bg: string,
|
|
917
|
+
border: string,
|
|
918
|
+
text: string
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
```
|
|
923
|
+
|
|
924
|
+
**CSS Classes:**
|
|
925
|
+
- `.countdown-container` - Main wrapper (600×600px)
|
|
926
|
+
- `.shape-container` - Shape wrapper (375×375px)
|
|
927
|
+
- `.shape-container.diamond|circle|heart|star|hexagon|octagon`
|
|
928
|
+
- `.countdown-box` - Timer display
|
|
929
|
+
- `.countdown-popup` - Popup message
|
|
930
|
+
- `.countdown-character` - Character image
|
|
931
|
+
- `.countdown-overlay-wrapper` - Overlay container
|
|
932
|
+
|
|
933
|
+
---
|
|
934
|
+
|
|
647
935
|
## Related Documentation
|
|
648
936
|
|
|
649
|
-
- [
|
|
650
|
-
- [
|
|
651
|
-
- [
|
|
652
|
-
- [ACCESSIBILITY.md](./ACCESSIBILITY.md) - Accessibility standards
|
|
937
|
+
- [README.md](../README.md) - Main documentation and quick start guide
|
|
938
|
+
- [Variables Reference](#customization) - CSS variables for customization (see Customization section above)
|
|
939
|
+
- [Nikke Components](#nikke-components) - Game-specific components (see section above)
|
|
653
940
|
|
|
654
941
|
---
|
|
655
942
|
|
|
656
|
-
**Last Updated:** 2025-11-
|
|
657
|
-
**Version:** 1.
|
|
943
|
+
**Last Updated:** 2025-11-26
|
|
944
|
+
**Version:** 1.1
|
|
658
945
|
**Status:** Complete and Production Ready
|
|
659
946
|
|