Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,12 @@ This is the living history of Chimera's evolution. Each entry represents a day o

---

### Day 55: 2026-03-10

**Feature/Change**: UUID Generator
**Description**: Added a UUID v4 generator and validator tool. Developers can generate 1–100 UUIDs at a time in four formats: standard lowercase, uppercase, no-dashes, and brace-wrapped. Each UUID can be individually copied with one click, or all can be copied at once. A live validation panel lets users paste any string and instantly see whether it is a valid UUID v4. The tool uses the native `crypto.randomUUID()` API with a polyfill fallback, requires no external libraries, and fits naturally into the growing developer toolbox.
**Files Modified**: src/uuidGenerator.ts, src/uuidGeneratorUI.ts, src/uuidGenerator.test.ts, src/uuidGeneratorUI.test.ts, src/main.ts, src/style.css, README.md, public/README.md

### Day 54: 2026-03-08

**Feature/Change**: Frontend Polish - Inter font, animated gradient title, CSS variable consistency
Expand Down
6 changes: 6 additions & 0 deletions public/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,12 @@ This is the living history of Chimera's evolution. Each entry represents a day o

---

### Day 55: 2026-03-10

**Feature/Change**: UUID Generator
**Description**: Added a UUID v4 generator and validator tool. Developers can generate 1–100 UUIDs at a time in four formats: standard lowercase, uppercase, no-dashes, and brace-wrapped. Each UUID can be individually copied with one click, or all can be copied at once. A live validation panel lets users paste any string and instantly see whether it is a valid UUID v4. The tool uses the native `crypto.randomUUID()` API with a polyfill fallback, requires no external libraries, and fits naturally into the growing developer toolbox.
**Files Modified**: src/uuidGenerator.ts, src/uuidGeneratorUI.ts, src/uuidGenerator.test.ts, src/uuidGeneratorUI.test.ts, src/main.ts, src/style.css, README.md, public/README.md

### Day 54: 2026-03-08

**Feature/Change**: Frontend Polish - Inter font, animated gradient title, CSS variable consistency
Expand Down
2 changes: 2 additions & 0 deletions src/activityFeed.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ export type ActivityType =
| 'timestamp_converter'
| 'hash_generator'
| 'jwt_decode'
| 'uuid_generator'

export interface Activity {
id: string
Expand Down Expand Up @@ -169,6 +170,7 @@ function getActivityIcon(type: ActivityType): string {
timestamp_converter: '🕐',
hash_generator: '#️⃣',
jwt_decode: '🔐',
uuid_generator: '🔑',
}
return icons[type] || '•'
}
Expand Down
12 changes: 12 additions & 0 deletions src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ import { createNumberBaseConverterUI } from './numberBaseConverterUI.ts'
import { createTimestampConverterUI } from './timestampConverterUI.ts'
import { createHashGeneratorUI } from './hashGeneratorUI.ts'
import { createJwtDecoderUI } from './jwtDecoderUI.ts'
import { createUuidGeneratorUI } from './uuidGeneratorUI.ts'

// Initialize accessibility features
accessibilityManager.initialize()
Expand Down Expand Up @@ -212,6 +213,10 @@ document.querySelector<HTMLDivElement>('#app')!.innerHTML = `
<div id="jwt-decoder-section">
<p class="loading">Loading JWT Decoder...</p>
</div>

<div id="uuid-generator-section">
<p class="loading">Loading UUID Generator...</p>
</div>

<div class="evolution-section" id="main-content" tabindex="-1">
<h2 class="section-title">Evolution Timeline</h2>
Expand Down Expand Up @@ -736,6 +741,7 @@ function setupScrollReveal(): void {
'#timestamp-converter-section',
'#hash-generator-section',
'#jwt-decoder-section',
'#uuid-generator-section',
]

const observer = new IntersectionObserver(
Expand Down Expand Up @@ -985,6 +991,12 @@ async function initializeApp() {
jwtDecoderSection.innerHTML = ''
jwtDecoderSection.appendChild(createJwtDecoderUI())
trackActivity('page_view', 'Loaded JWT Decoder', 'JWT decoder and inspector initialized')

// Setup UUID Generator
const uuidGeneratorSection = document.querySelector<HTMLDivElement>('#uuid-generator-section')!
uuidGeneratorSection.innerHTML = ''
uuidGeneratorSection.appendChild(createUuidGeneratorUI())
trackActivity('page_view', 'Loaded UUID Generator', 'UUID v4 generator and validator initialized')

// Setup search UI with URL state integration
const initialFilters: SearchFilters = {
Expand Down
210 changes: 210 additions & 0 deletions src/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -12996,3 +12996,213 @@ tr.diff-unchanged .diff-cell {
[data-theme="light"] .jwt-claims-row:not(:last-child) td {
border-bottom-color: rgba(0,0,0,0.06);
}

/* ── UUID Generator ─────────────────────────────────────────── */
.uuid-generator-container {
display: flex;
flex-direction: column;
gap: 1rem;
}

.uuid-controls-row {
display: flex;
align-items: center;
gap: 0.75rem;
flex-wrap: wrap;
}

.uuid-label {
font-size: 0.85rem;
color: var(--text-secondary, #aaa);
white-space: nowrap;
}

.uuid-count-input {
width: 70px;
padding: 0.45rem 0.6rem;
border-radius: 6px;
border: 1px solid rgba(255,255,255,0.12);
background: rgba(255,255,255,0.06);
color: var(--text-primary, #e0e0e0);
font-size: 0.9rem;
}

.uuid-format-select {
padding: 0.45rem 0.6rem;
border-radius: 6px;
border: 1px solid rgba(255,255,255,0.12);
background: rgba(255,255,255,0.06);
color: var(--text-primary, #e0e0e0);
font-size: 0.85rem;
cursor: pointer;
}

.uuid-btn {
padding: 0.45rem 1rem;
border-radius: 6px;
border: none;
font-size: 0.85rem;
cursor: pointer;
transition: opacity 0.15s, background 0.15s;
}

.uuid-btn:disabled {
opacity: 0.4;
cursor: not-allowed;
}

.uuid-btn-primary {
background: var(--accent-primary, #7c3aed);
color: #fff;
}

.uuid-btn-primary:hover:not(:disabled) {
background: var(--accent-hover, #6d28d9);
}

.uuid-btn-secondary {
background: rgba(255,255,255,0.08);
color: var(--text-primary, #e0e0e0);
border: 1px solid rgba(255,255,255,0.12);
}

.uuid-btn-secondary:hover:not(:disabled) {
background: rgba(255,255,255,0.14);
}

.uuid-btn-icon {
padding: 0.3rem 0.5rem;
background: transparent;
color: var(--text-secondary, #aaa);
border: 1px solid rgba(255,255,255,0.1);
font-size: 0.8rem;
line-height: 1;
}

.uuid-btn-icon:hover {
background: rgba(255,255,255,0.08);
}

.uuid-output-header {
display: flex;
justify-content: space-between;
align-items: center;
gap: 0.5rem;
}

.uuid-output-label {
font-size: 0.85rem;
color: var(--text-secondary, #aaa);
}

.uuid-output-actions {
display: flex;
gap: 0.5rem;
}

.uuid-output-list {
display: flex;
flex-direction: column;
gap: 0.4rem;
max-height: 320px;
overflow-y: auto;
padding: 0.5rem;
border-radius: 8px;
background: rgba(0,0,0,0.2);
border: 1px solid rgba(255,255,255,0.07);
}

.uuid-item {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.3rem 0.4rem;
border-radius: 5px;
background: rgba(255,255,255,0.03);
}

.uuid-item:hover {
background: rgba(255,255,255,0.06);
}

.uuid-index {
font-size: 0.72rem;
color: var(--text-secondary, #aaa);
min-width: 1.8rem;
text-align: right;
}

.uuid-value {
flex: 1;
font-family: 'JetBrains Mono', 'Fira Code', monospace;
font-size: 0.82rem;
color: var(--accent-secondary, #a78bfa);
word-break: break-all;
}

.uuid-empty-state {
color: var(--text-secondary, #aaa);
font-size: 0.85rem;
text-align: center;
padding: 1.5rem 0;
margin: 0;
}

.uuid-validate-section {
border-top: 1px solid rgba(255,255,255,0.07);
padding-top: 0.75rem;
}

.uuid-validate-title {
font-size: 0.9rem;
margin: 0 0 0.5rem;
color: var(--text-secondary, #aaa);
}

.uuid-validate-row {
display: flex;
align-items: center;
gap: 0.75rem;
flex-wrap: wrap;
}

.uuid-validate-input {
flex: 1;
min-width: 200px;
padding: 0.45rem 0.7rem;
border-radius: 6px;
border: 1px solid rgba(255,255,255,0.12);
background: rgba(255,255,255,0.06);
color: var(--text-primary, #e0e0e0);
font-family: 'JetBrains Mono', monospace;
font-size: 0.82rem;
}

.uuid-validate-result {
font-size: 0.85rem;
font-weight: 500;
white-space: nowrap;
}

.uuid-valid { color: #4ade80; }
.uuid-invalid { color: #f87171; }

/* Light theme */
[data-theme="light"] .uuid-count-input,
[data-theme="light"] .uuid-format-select,
[data-theme="light"] .uuid-validate-input {
background: #fff;
color: #333;
border-color: rgba(0,0,0,0.15);
}

[data-theme="light"] .uuid-output-list {
background: rgba(0,0,0,0.04);
border-color: rgba(0,0,0,0.1);
}

[data-theme="light"] .uuid-btn-secondary {
background: rgba(0,0,0,0.05);
color: #333;
border-color: rgba(0,0,0,0.15);
}
Loading