ccusage-ui 0.1.16 → 0.1.18

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.
Files changed (59) hide show
  1. package/CLAUDE.md +113 -0
  2. package/README.md +43 -0
  3. package/package.json +3 -2
  4. package/public/index.html +20 -3
  5. package/public/share/bronze.html +2 -2
  6. package/public/share/card-bronze.html +26 -3
  7. package/public/share/card-challenger.html +36 -81
  8. package/public/share/card-diamond.html +26 -3
  9. package/public/share/card-emerald.html +26 -3
  10. package/public/share/card-gold.html +26 -3
  11. package/public/share/card-grandmaster.html +26 -3
  12. package/public/share/card-iron.html +27 -4
  13. package/public/share/card-master.html +26 -3
  14. package/public/share/card-platinum.html +26 -3
  15. package/public/share/card-silver.html +26 -3
  16. package/public/share/challenger.html +2 -2
  17. package/public/share/diamond.html +2 -2
  18. package/public/share/emerald.html +2 -2
  19. package/public/share/gold.html +2 -2
  20. package/public/share/grandmaster.html +2 -2
  21. package/public/share/icons/bronze.png +0 -0
  22. package/public/share/icons/challenger.png +0 -0
  23. package/public/share/icons/diamond.png +0 -0
  24. package/public/share/icons/emerald.png +0 -0
  25. package/public/share/icons/gold.png +0 -0
  26. package/public/share/icons/grandmaster.png +0 -0
  27. package/public/share/icons/iron.png +0 -0
  28. package/public/share/icons/master.png +0 -0
  29. package/public/share/icons/platinum.png +0 -0
  30. package/public/share/icons/silver.png +0 -0
  31. package/public/share/images/Gemini_Generated_Image_fj59jyfj59jyfj59.jpeg +0 -0
  32. package/public/share/images/card-bronze.png +0 -0
  33. package/public/share/images/card-challenger.png +0 -0
  34. package/public/share/images/card-diamond.png +0 -0
  35. package/public/share/images/card-emerald.png +0 -0
  36. package/public/share/images/card-gold.png +0 -0
  37. package/public/share/images/card-grandmaster.png +0 -0
  38. package/public/share/images/card-iron.png +0 -0
  39. package/public/share/images/card-master.png +0 -0
  40. package/public/share/images/card-platinum.png +0 -0
  41. package/public/share/images/card-silver.png +0 -0
  42. package/public/share/iron.html +2 -2
  43. package/public/share/master.html +2 -2
  44. package/public/share/platinum.html +2 -2
  45. package/public/share/silver.html +2 -2
  46. package/scripts/capture-card.js +25 -0
  47. package/scripts/extract-tier-icons.js +185 -0
  48. package/scripts/generate-cards.js +260 -0
  49. package/scripts/process-emerald.js +55 -0
  50. package/public/share/images/bronze.png +0 -0
  51. package/public/share/images/challenger.png +0 -0
  52. package/public/share/images/diamond.png +0 -0
  53. package/public/share/images/emerald.png +0 -0
  54. package/public/share/images/gold.png +0 -0
  55. package/public/share/images/grandmaster.png +0 -0
  56. package/public/share/images/iron.png +0 -0
  57. package/public/share/images/master.png +0 -0
  58. package/public/share/images/platinum.png +0 -0
  59. package/public/share/images/silver.png +0 -0
package/CLAUDE.md ADDED
@@ -0,0 +1,113 @@
1
+ # CLAUDE.md
2
+
3
+ Context information for Claude when working on this project.
4
+
5
+ ## Project Overview
6
+
7
+ A UI project for visualizing Claude Code usage with a LoL-style tier system.
8
+
9
+ ## Tier Card System
10
+
11
+ ### Card Generation Script
12
+
13
+ ```bash
14
+ # Generate all tier card HTML files
15
+ node scripts/generate-cards.js
16
+ ```
17
+
18
+ Modify the `TIERS` array in [scripts/generate-cards.js](scripts/generate-cards.js) to regenerate all cards at once.
19
+
20
+ ### Icon Extraction Script
21
+
22
+ ```bash
23
+ # Extract individual icons from tier icon image (with transparent background)
24
+ node scripts/extract-tier-icons.js
25
+ ```
26
+
27
+ - Input: Source image in `public/share/images/` folder (5x2 grid)
28
+ - Output: Individual PNG files in `public/share/icons/`
29
+ - Magenta (#FF00FF) background is removed (chroma key)
30
+ - Erosion algorithm removes masking artifacts
31
+
32
+ ### Tier Order (Highest to Lowest)
33
+
34
+ 1. **Challenger** - Top 0.001%, 1.5B+ tokens/month
35
+ 2. **Grandmaster** - Top 0.01%, 1B+ tokens/month
36
+ 3. **Master** - Top 0.1%, 500M+ tokens/month
37
+ 4. **Diamond** - Top 1%, 300M+ tokens/month
38
+ 5. **Emerald** - Top 5%, 100M+ tokens/month
39
+ 6. **Platinum** - Top 10%, 50M+ tokens/month
40
+ 7. **Gold** - Top 20%, 30M+ tokens/month
41
+ 8. **Silver** - Top 40%, 10M+ tokens/month
42
+ 9. **Bronze** - Top 60%, 5M+ tokens/month
43
+ 10. **Iron** - Starter, <5M tokens/month
44
+
45
+ ### Card Structure
46
+
47
+ - Size: 1200x630px (OG image standard)
48
+ - Right side: 280px big-icon with glow effect
49
+ - Left side: Tier name, description, token usage, ranking
50
+
51
+ ### How to Replace Icons
52
+
53
+ Single 5x2 grid image with mixed chroma key backgrounds:
54
+ - **Green (#00FF00)**: Challenger, Grandmaster, Master, Gold, Silver, Bronze, Iron
55
+ - **Magenta (#FF00FF)**: Diamond, Emerald, Platinum (cyan/green-colored icons)
56
+
57
+ #### Gemini Prompt
58
+
59
+ ```
60
+ Create a 5x2 grid of League of Legends style tier icons.
61
+ Image aspect ratio: 5:2 (e.g., 2500x1000px or similar)
62
+ Each cell should be square and contain one icon, clearly separated with no effects bleeding between cells.
63
+
64
+ IMPORTANT - Background colors per cell (for chroma key extraction):
65
+ - Green (#00FF00): Challenger, Grandmaster, Master, Gold, Silver, Bronze, Iron
66
+ - Magenta (#FF00FF): Diamond, Emerald, Platinum (these have cyan/green colors, so use magenta background)
67
+
68
+ CRITICAL - DO NOT use these colors in the icons themselves:
69
+ - Icons with green background: DO NOT use pure green (#00FF00) or similar bright greens in the icon
70
+ - Icons with magenta background: DO NOT use pure magenta (#FF00FF) or similar magentas in the icon
71
+ - These colors are reserved for background removal (chroma key)
72
+
73
+ Grid layout (left to right):
74
+ - Row 1: Challenger(green bg), Grandmaster(green bg), Master(green bg), Diamond(magenta bg), Emerald(magenta bg)
75
+ - Row 2: Platinum(magenta bg), Gold(green bg), Silver(green bg), Bronze(green bg), Iron(green bg)
76
+
77
+ Icon descriptions (G=green bg, M=magenta bg):
78
+ 1. Challenger (G) - Golden winged crown emblem with red gems, most ornate
79
+ 2. Grandmaster (G) - Red/orange flaming emblem with golden wings
80
+ 3. Master (G) - Crimson red shield emblem with flame accents
81
+ 4. Diamond (M) - Cyan/light blue crystalline shield emblem
82
+ 5. Emerald (M) - Green gemstone shield emblem with facets
83
+ 6. Platinum (M) - Silver-white metallic shield emblem with teal accents
84
+ 7. Gold (G) - Golden shield emblem with warm yellow glow
85
+ 8. Silver (G) - Silver metallic shield emblem with cool gray tones
86
+ 9. Bronze (G) - Bronze/copper shield emblem with warm brown tones
87
+ 10. Iron (G) - Dark gray iron shield emblem, simplest design
88
+
89
+ Icon style: metallic shields with gemstones, fantasy game aesthetic, detailed 3D rendering.
90
+ All icons should be shield/emblem shaped for visual consistency (like League of Legends rank badges).
91
+ ```
92
+
93
+ #### Steps
94
+
95
+ 1. Generate image using the prompt above
96
+ 2. Save to `public/share/images/`
97
+ 3. Update `inputPath` in `scripts/extract-tier-icons.js`
98
+ 4. Run `node scripts/extract-tier-icons.js`
99
+ 5. Run `node scripts/generate-cards.js` to regenerate cards
100
+ 6. Run `node scripts/capture-card.js` to generate card images
101
+
102
+ ## File Structure
103
+
104
+ ```
105
+ public/share/
106
+ ├── icons/ # Extracted tier icons (PNG, transparent background)
107
+ ├── images/ # Source icon images
108
+ └── card-*.html # OG card HTML for each tier
109
+
110
+ scripts/
111
+ ├── extract-tier-icons.js # Icon extraction script
112
+ └── generate-cards.js # Card generation script
113
+ ```
package/README.md CHANGED
@@ -49,6 +49,49 @@ ccusage-ui
49
49
  [![Threads](https://img.shields.io/badge/Threads-@dohapark81-000000?style=flat&logo=threads)](https://www.threads.net/@dohapark81)
50
50
  [![LinkedIn](https://img.shields.io/badge/LinkedIn-dohapark81-0077B5?style=flat&logo=linkedin)](https://www.linkedin.com/in/dohapark81/)
51
51
 
52
+ ## Tier Icons
53
+
54
+ Tier icons were generated using **Gemini (via 나노바나나 프로)** and extracted with chroma key processing.
55
+
56
+ <details>
57
+ <summary>Image Generation Prompt</summary>
58
+
59
+ ```
60
+ Create a 5x2 grid of League of Legends style tier icons.
61
+ Image aspect ratio: 5:2 (e.g., 2500x1000px or similar)
62
+ Each cell should be square and contain one icon, clearly separated with no effects bleeding between cells.
63
+
64
+ IMPORTANT - Background colors per cell (for chroma key extraction):
65
+ - Green (#00FF00): Challenger, Grandmaster, Master, Gold, Silver, Bronze, Iron
66
+ - Magenta (#FF00FF): Diamond, Emerald, Platinum (these have cyan/green colors, so use magenta background)
67
+
68
+ CRITICAL - DO NOT use these colors in the icons themselves:
69
+ - Icons with green background: DO NOT use pure green (#00FF00) or similar bright greens in the icon
70
+ - Icons with magenta background: DO NOT use pure magenta (#FF00FF) or similar magentas in the icon
71
+ - These colors are reserved for background removal (chroma key)
72
+
73
+ Grid layout (left to right):
74
+ - Row 1: Challenger(green bg), Grandmaster(green bg), Master(green bg), Diamond(magenta bg), Emerald(magenta bg)
75
+ - Row 2: Platinum(magenta bg), Gold(green bg), Silver(green bg), Bronze(green bg), Iron(green bg)
76
+
77
+ Icon descriptions (G=green bg, M=magenta bg):
78
+ 1. Challenger (G) - Golden winged crown emblem with red gems
79
+ 2. Grandmaster (G) - Red/orange flaming emblem with golden wings
80
+ 3. Master (G) - Crimson red shield emblem with flame accents
81
+ 4. Diamond (M) - Cyan/light blue crystalline shield emblem
82
+ 5. Emerald (M) - Green gemstone shield emblem with facets
83
+ 6. Platinum (M) - Silver-white metallic shield emblem with teal accents
84
+ 7. Gold (G) - Golden shield emblem with warm yellow glow
85
+ 8. Silver (G) - Silver metallic shield emblem with cool gray tones
86
+ 9. Bronze (G) - Bronze/copper shield emblem with warm brown tones
87
+ 10. Iron (G) - Dark gray iron shield emblem, simplest design
88
+
89
+ Icon style: metallic shields with gemstones, fantasy game aesthetic, detailed 3D rendering.
90
+ All icons should be shield/emblem shaped for visual consistency (like League of Legends rank badges).
91
+ ```
92
+
93
+ </details>
94
+
52
95
  ## License
53
96
 
54
97
  MIT
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ccusage-ui",
3
- "version": "0.1.16",
3
+ "version": "0.1.18",
4
4
  "main": "server.js",
5
5
  "bin": {
6
6
  "ccusage-ui": "server.js"
@@ -35,6 +35,7 @@
35
35
  },
36
36
  "devDependencies": {
37
37
  "gh-pages": "^6.3.0",
38
- "puppeteer": "^24.34.0"
38
+ "puppeteer": "^24.34.0",
39
+ "sharp": "^0.34.5"
39
40
  }
40
41
  }
package/public/index.html CHANGED
@@ -327,6 +327,9 @@
327
327
  <tbody></tbody>
328
328
  </table>
329
329
  </div>
330
+ <button id="showMoreBtn" onclick="toggleTableRows()" style="margin-top: 16px; padding: 8px 16px; background: #f5f5f7; border: 1px solid #e5e5e7; border-radius: 8px; cursor: pointer; font-size: 13px; color: #0071e3; width: 100%;">
331
+ Show More (30 days)
332
+ </button>
330
333
  </div>
331
334
 
332
335
  <footer style="text-align: center; margin-top: 40px; padding: 30px 20px; color: var(--text-secondary); font-size: 13px; border-top: 1px solid #e5e5e7;">
@@ -732,12 +735,15 @@
732
735
  });
733
736
  }
734
737
 
738
+ let showAllDays = false;
739
+
735
740
  function renderTable() {
736
741
  const tbody = document.querySelector('#dataTable tbody');
737
742
  tbody.innerHTML = '';
738
- // Sort by date descending (newest first) and take top 10
739
- const recent = [...dailyData].sort((a, b) => b.date.localeCompare(a.date)).slice(0, 10);
740
-
743
+ // Sort by date descending (newest first), show 7 or 30 days
744
+ const count = showAllDays ? 30 : 7;
745
+ const recent = [...dailyData].sort((a, b) => b.date.localeCompare(a.date)).slice(0, count);
746
+
741
747
  recent.forEach(d => {
742
748
  const tr = document.createElement('tr');
743
749
  tr.innerHTML = `
@@ -749,6 +755,17 @@
749
755
  `;
750
756
  tbody.appendChild(tr);
751
757
  });
758
+
759
+ // Update button text
760
+ const btn = document.getElementById('showMoreBtn');
761
+ if (btn) {
762
+ btn.textContent = showAllDays ? 'Show Less (7 days)' : 'Show More (30 days)';
763
+ }
764
+ }
765
+
766
+ function toggleTableRows() {
767
+ showAllDays = !showAllDays;
768
+ renderTable();
752
769
  }
753
770
 
754
771
 
@@ -9,14 +9,14 @@
9
9
  <meta property="og:url" content="https://sowonlabs.github.io/ccusage-ui/share/bronze.html">
10
10
  <meta property="og:title" content="I'm a Bronze AI User">
11
11
  <meta property="og:description" content="My AI usage pace is over 5M tokens/month. Check your stats: npx ccusage-ui">
12
- <meta property="og:image" content="https://sowonlabs.github.io/ccusage-ui/share/images/bronze.png">
12
+ <meta property="og:image" content="https://sowonlabs.github.io/ccusage-ui/share/images/card-bronze.png">
13
13
 
14
14
  <!-- Twitter -->
15
15
  <meta property="twitter:card" content="summary_large_image">
16
16
  <meta property="twitter:url" content="https://sowonlabs.github.io/ccusage-ui/share/bronze.html">
17
17
  <meta property="twitter:title" content="I'm a Bronze AI User">
18
18
  <meta property="twitter:description" content="My AI usage pace is over 5M tokens/month. Check your stats: npx ccusage-ui">
19
- <meta property="twitter:image" content="https://sowonlabs.github.io/ccusage-ui/share/images/bronze.png">
19
+ <meta property="twitter:image" content="https://sowonlabs.github.io/ccusage-ui/share/images/card-bronze.png">
20
20
 
21
21
  <script>window.location.href = "https://github.com/sowonlabs/ccusage-ui";</script>
22
22
  <meta http-equiv="refresh" content="0;url=https://github.com/sowonlabs/ccusage-ui" />
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=1200, height=630">
6
- <title>Bronze Card</title>
6
+ <title>BRONZE Card</title>
7
7
  <style>
8
8
  * { margin: 0; padding: 0; box-sizing: border-box; }
9
9
  body {
@@ -39,8 +39,17 @@
39
39
  background: radial-gradient(circle, rgba(205, 127, 50, 0.15) 0%, transparent 70%);
40
40
  pointer-events: none;
41
41
  }
42
+ .big-icon {
43
+ position: absolute;
44
+ right: 60px;
45
+ top: 45%;
46
+ transform: translateY(-50%);
47
+ width: 280px;
48
+ height: 280px;
49
+ filter: drop-shadow(0 0 20px rgba(205, 127, 50, 0.8)) drop-shadow(0 0 40px rgba(205, 127, 50, 0.5)) drop-shadow(0 0 60px rgba(205, 127, 50, 0.3));
50
+ opacity: 0.95;
51
+ }
42
52
  .header { display: flex; align-items: center; gap: 24px; }
43
- .tier-icon { font-size: 80px; filter: drop-shadow(0 0 30px rgba(205, 127, 50, 0.8)); }
44
53
  .tier-info h1 {
45
54
  font-size: 64px;
46
55
  font-weight: 800;
@@ -62,9 +71,23 @@
62
71
  </style>
63
72
  </head>
64
73
  <body>
74
+ <!-- SVG filter to remove magenta fringing -->
75
+ <svg style="position: absolute; width: 0; height: 0;">
76
+ <defs>
77
+ <filter id="remove-magenta" color-interpolation-filters="sRGB">
78
+ <!-- Convert to separate channels and reduce magenta -->
79
+ <feColorMatrix type="matrix" values="
80
+ 1 0 0 0 0
81
+ 0 1 0 0 0
82
+ 0 0 1 0 0
83
+ -0.5 1 -0.5 1 0
84
+ "/>
85
+ </filter>
86
+ </defs>
87
+ </svg>
65
88
  <div class="card">
89
+ <img class="big-icon" src="./icons/bronze.png" alt="">
66
90
  <div class="header">
67
- <span class="tier-icon">🟫</span>
68
91
  <div class="tier-info">
69
92
  <h1>BRONZE</h1>
70
93
  <div class="subtitle">Casual AI User</div>
@@ -3,10 +3,9 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=1200, height=630">
6
- <title>Challenger Card</title>
6
+ <title>CHALLENGER Card</title>
7
7
  <style>
8
8
  * { margin: 0; padding: 0; box-sizing: border-box; }
9
-
10
9
  body {
11
10
  width: 1200px;
12
11
  height: 630px;
@@ -17,7 +16,6 @@
17
16
  justify-content: center;
18
17
  overflow: hidden;
19
18
  }
20
-
21
19
  .card {
22
20
  width: 1100px;
23
21
  height: 530px;
@@ -31,7 +29,6 @@
31
29
  position: relative;
32
30
  overflow: hidden;
33
31
  }
34
-
35
32
  .card::before {
36
33
  content: '';
37
34
  position: absolute;
@@ -42,18 +39,17 @@
42
39
  background: radial-gradient(circle, rgba(155, 89, 182, 0.15) 0%, transparent 70%);
43
40
  pointer-events: none;
44
41
  }
45
-
46
- .header {
47
- display: flex;
48
- align-items: center;
49
- gap: 24px;
50
- }
51
-
52
- .tier-icon {
53
- font-size: 80px;
54
- filter: drop-shadow(0 0 30px rgba(155, 89, 182, 0.8));
42
+ .big-icon {
43
+ position: absolute;
44
+ right: 60px;
45
+ top: 45%;
46
+ transform: translateY(-50%);
47
+ width: 280px;
48
+ height: 280px;
49
+ filter: drop-shadow(0 0 20px rgba(255, 215, 0, 0.8)) drop-shadow(0 0 40px rgba(255, 215, 0, 0.5)) drop-shadow(0 0 60px rgba(255, 215, 0, 0.3));
50
+ opacity: 0.95;
55
51
  }
56
-
52
+ .header { display: flex; align-items: center; gap: 24px; }
57
53
  .tier-info h1 {
58
54
  font-size: 64px;
59
55
  font-weight: 800;
@@ -63,77 +59,40 @@
63
59
  background-clip: text;
64
60
  letter-spacing: -2px;
65
61
  }
66
-
67
- .tier-info .subtitle {
68
- font-size: 28px;
69
- color: rgba(255, 255, 255, 0.6);
70
- margin-top: 8px;
71
- font-weight: 500;
72
- }
73
-
74
- .stats {
75
- display: flex;
76
- gap: 60px;
77
- }
78
-
79
- .stat {
80
- display: flex;
81
- flex-direction: column;
82
- gap: 8px;
83
- }
84
-
85
- .stat-value {
86
- font-size: 56px;
87
- font-weight: 700;
88
- color: #fff;
89
- letter-spacing: -1px;
90
- }
91
-
92
- .stat-label {
93
- font-size: 20px;
94
- color: rgba(255, 255, 255, 0.5);
95
- text-transform: uppercase;
96
- letter-spacing: 2px;
97
- }
98
-
99
- .footer {
100
- display: flex;
101
- justify-content: space-between;
102
- align-items: flex-end;
103
- }
104
-
105
- .command {
106
- background: rgba(255, 255, 255, 0.1);
107
- padding: 16px 32px;
108
- border-radius: 12px;
109
- font-family: 'SF Mono', Monaco, monospace;
110
- font-size: 24px;
111
- color: #34c759;
112
- border: 1px solid rgba(52, 199, 89, 0.3);
113
- }
114
-
115
- .branding {
116
- text-align: right;
117
- color: rgba(255, 255, 255, 0.4);
118
- font-size: 20px;
119
- }
120
-
121
- .branding strong {
122
- color: rgba(255, 255, 255, 0.7);
123
- font-size: 24px;
124
- }
62
+ .tier-info .subtitle { font-size: 28px; color: rgba(255, 255, 255, 0.6); margin-top: 8px; font-weight: 500; }
63
+ .stats { display: flex; gap: 60px; }
64
+ .stat { display: flex; flex-direction: column; gap: 8px; }
65
+ .stat-value { font-size: 56px; font-weight: 700; color: #fff; letter-spacing: -1px; }
66
+ .stat-label { font-size: 20px; color: rgba(255, 255, 255, 0.5); text-transform: uppercase; letter-spacing: 2px; }
67
+ .footer { display: flex; justify-content: space-between; align-items: flex-end; }
68
+ .command { background: rgba(255, 255, 255, 0.1); padding: 16px 32px; border-radius: 12px; font-family: 'SF Mono', Monaco, monospace; font-size: 24px; color: #34c759; border: 1px solid rgba(52, 199, 89, 0.3); }
69
+ .branding { text-align: right; color: rgba(255, 255, 255, 0.4); font-size: 20px; }
70
+ .branding strong { color: rgba(255, 255, 255, 0.7); font-size: 24px; }
125
71
  </style>
126
72
  </head>
127
73
  <body>
74
+ <!-- SVG filter to remove magenta fringing -->
75
+ <svg style="position: absolute; width: 0; height: 0;">
76
+ <defs>
77
+ <filter id="remove-magenta" color-interpolation-filters="sRGB">
78
+ <!-- Convert to separate channels and reduce magenta -->
79
+ <feColorMatrix type="matrix" values="
80
+ 1 0 0 0 0
81
+ 0 1 0 0 0
82
+ 0 0 1 0 0
83
+ -0.5 1 -0.5 1 0
84
+ "/>
85
+ </filter>
86
+ </defs>
87
+ </svg>
128
88
  <div class="card">
89
+ <img class="big-icon" src="./icons/challenger.png" alt="">
129
90
  <div class="header">
130
- <span class="tier-icon">🏆</span>
131
91
  <div class="tier-info">
132
92
  <h1>CHALLENGER</h1>
133
93
  <div class="subtitle">World #1 Level AI User</div>
134
94
  </div>
135
95
  </div>
136
-
137
96
  <div class="stats">
138
97
  <div class="stat">
139
98
  <div class="stat-value">1.5B+</div>
@@ -144,13 +103,9 @@
144
103
  <div class="stat-label">Global Ranking</div>
145
104
  </div>
146
105
  </div>
147
-
148
106
  <div class="footer">
149
107
  <div class="command">npx ccusage-ui</div>
150
- <div class="branding">
151
- <strong>Claude Code Usage</strong><br>
152
- sowonlabs.com
153
- </div>
108
+ <div class="branding"><strong>Claude Code Usage</strong><br>sowonlabs.com</div>
154
109
  </div>
155
110
  </div>
156
111
  </body>
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=1200, height=630">
6
- <title>Diamond Card</title>
6
+ <title>DIAMOND Card</title>
7
7
  <style>
8
8
  * { margin: 0; padding: 0; box-sizing: border-box; }
9
9
  body {
@@ -39,8 +39,17 @@
39
39
  background: radial-gradient(circle, rgba(0, 188, 212, 0.15) 0%, transparent 70%);
40
40
  pointer-events: none;
41
41
  }
42
+ .big-icon {
43
+ position: absolute;
44
+ right: 60px;
45
+ top: 45%;
46
+ transform: translateY(-50%);
47
+ width: 280px;
48
+ height: 280px;
49
+ filter: drop-shadow(0 0 20px rgba(0, 188, 212, 0.8)) drop-shadow(0 0 40px rgba(0, 188, 212, 0.5)) drop-shadow(0 0 60px rgba(0, 188, 212, 0.3));
50
+ opacity: 0.95;
51
+ }
42
52
  .header { display: flex; align-items: center; gap: 24px; }
43
- .tier-icon { font-size: 80px; filter: drop-shadow(0 0 30px rgba(0, 188, 212, 0.8)); }
44
53
  .tier-info h1 {
45
54
  font-size: 64px;
46
55
  font-weight: 800;
@@ -62,9 +71,23 @@
62
71
  </style>
63
72
  </head>
64
73
  <body>
74
+ <!-- SVG filter to remove magenta fringing -->
75
+ <svg style="position: absolute; width: 0; height: 0;">
76
+ <defs>
77
+ <filter id="remove-magenta" color-interpolation-filters="sRGB">
78
+ <!-- Convert to separate channels and reduce magenta -->
79
+ <feColorMatrix type="matrix" values="
80
+ 1 0 0 0 0
81
+ 0 1 0 0 0
82
+ 0 0 1 0 0
83
+ -0.5 1 -0.5 1 0
84
+ "/>
85
+ </filter>
86
+ </defs>
87
+ </svg>
65
88
  <div class="card">
89
+ <img class="big-icon" src="./icons/diamond.png" alt="">
66
90
  <div class="header">
67
- <span class="tier-icon">💠</span>
68
91
  <div class="tier-info">
69
92
  <h1>DIAMOND</h1>
70
93
  <div class="subtitle">Top 1% AI User</div>
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=1200, height=630">
6
- <title>Emerald Card</title>
6
+ <title>EMERALD Card</title>
7
7
  <style>
8
8
  * { margin: 0; padding: 0; box-sizing: border-box; }
9
9
  body {
@@ -39,8 +39,17 @@
39
39
  background: radial-gradient(circle, rgba(0, 229, 160, 0.15) 0%, transparent 70%);
40
40
  pointer-events: none;
41
41
  }
42
+ .big-icon {
43
+ position: absolute;
44
+ right: 60px;
45
+ top: 45%;
46
+ transform: translateY(-50%);
47
+ width: 280px;
48
+ height: 280px;
49
+ filter: drop-shadow(0 0 20px rgba(0, 229, 160, 0.8)) drop-shadow(0 0 40px rgba(0, 229, 160, 0.5)) drop-shadow(0 0 60px rgba(0, 229, 160, 0.3));
50
+ opacity: 0.95;
51
+ }
42
52
  .header { display: flex; align-items: center; gap: 24px; }
43
- .tier-icon { font-size: 80px; filter: drop-shadow(0 0 30px rgba(0, 229, 160, 0.8)); }
44
53
  .tier-info h1 {
45
54
  font-size: 64px;
46
55
  font-weight: 800;
@@ -62,9 +71,23 @@
62
71
  </style>
63
72
  </head>
64
73
  <body>
74
+ <!-- SVG filter to remove magenta fringing -->
75
+ <svg style="position: absolute; width: 0; height: 0;">
76
+ <defs>
77
+ <filter id="remove-magenta" color-interpolation-filters="sRGB">
78
+ <!-- Convert to separate channels and reduce magenta -->
79
+ <feColorMatrix type="matrix" values="
80
+ 1 0 0 0 0
81
+ 0 1 0 0 0
82
+ 0 0 1 0 0
83
+ -0.5 1 -0.5 1 0
84
+ "/>
85
+ </filter>
86
+ </defs>
87
+ </svg>
65
88
  <div class="card">
89
+ <img class="big-icon" src="./icons/emerald.png" alt="">
66
90
  <div class="header">
67
- <span class="tier-icon">💎</span>
68
91
  <div class="tier-info">
69
92
  <h1>EMERALD</h1>
70
93
  <div class="subtitle">Heavy AI User</div>
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=1200, height=630">
6
- <title>Gold Card</title>
6
+ <title>GOLD Card</title>
7
7
  <style>
8
8
  * { margin: 0; padding: 0; box-sizing: border-box; }
9
9
  body {
@@ -39,8 +39,17 @@
39
39
  background: radial-gradient(circle, rgba(255, 215, 0, 0.15) 0%, transparent 70%);
40
40
  pointer-events: none;
41
41
  }
42
+ .big-icon {
43
+ position: absolute;
44
+ right: 60px;
45
+ top: 45%;
46
+ transform: translateY(-50%);
47
+ width: 280px;
48
+ height: 280px;
49
+ filter: drop-shadow(0 0 20px rgba(255, 215, 0, 0.8)) drop-shadow(0 0 40px rgba(255, 215, 0, 0.5)) drop-shadow(0 0 60px rgba(255, 215, 0, 0.3));
50
+ opacity: 0.95;
51
+ }
42
52
  .header { display: flex; align-items: center; gap: 24px; }
43
- .tier-icon { font-size: 80px; filter: drop-shadow(0 0 30px rgba(255, 215, 0, 0.8)); }
44
53
  .tier-info h1 {
45
54
  font-size: 64px;
46
55
  font-weight: 800;
@@ -62,9 +71,23 @@
62
71
  </style>
63
72
  </head>
64
73
  <body>
74
+ <!-- SVG filter to remove magenta fringing -->
75
+ <svg style="position: absolute; width: 0; height: 0;">
76
+ <defs>
77
+ <filter id="remove-magenta" color-interpolation-filters="sRGB">
78
+ <!-- Convert to separate channels and reduce magenta -->
79
+ <feColorMatrix type="matrix" values="
80
+ 1 0 0 0 0
81
+ 0 1 0 0 0
82
+ 0 0 1 0 0
83
+ -0.5 1 -0.5 1 0
84
+ "/>
85
+ </filter>
86
+ </defs>
87
+ </svg>
65
88
  <div class="card">
89
+ <img class="big-icon" src="./icons/gold.png" alt="">
66
90
  <div class="header">
67
- <span class="tier-icon">🟡</span>
68
91
  <div class="tier-info">
69
92
  <h1>GOLD</h1>
70
93
  <div class="subtitle">Regular AI User</div>