The code and data behind xeiaso.net
5
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix(cmd/sponsor-panel): bring styles into line with my website (#1125)

* chore: add npm run generate command

Signed-off-by: Xe Iaso <me@xeiaso.net>

* docs(sponsor-panel/AGENTS): give subtle hint about relevant skills

Signed-off-by: Xe Iaso <me@xeiaso.net>

* fix(cmd/sponsor-panel): bring styles into line with the rest of my site

This pulls in styles from my Lume config and tries to make the sponsor
panel "look Xe". I think that this ends up looking a lot better than the
"generic shadcn" look that I started out with.

Assisted-by: GLM-5, Claude Opus, and Open AI GPT-5.3-Codex via OpenCode
Signed-off-by: Xe Iaso <me@xeiaso.net>

---------

Signed-off-by: Xe Iaso <me@xeiaso.net>

authored by

Xe Iaso and committed by
GitHub
907f1de7 916d8152

+606 -153
+10
cmd/sponsor-panel/AGENTS.md
··· 13 13 ```bash 14 14 npm run dev:sponsor-panel 15 15 ``` 16 + 17 + ## Important information 18 + 19 + This service is written in Go with Templ, HTMX, and Tailwind CSS. Please reference the following skills as required: 20 + 21 + - `templ-syntax` 22 + - `templ-htmx` 23 + - `tailwindcss` 24 + 25 + Templates are in `./templates/*.templ` using Templ syntax.
+369 -13
cmd/sponsor-panel/styles.css
··· 1 1 @import url("https://cdn.xeiaso.net/static/pkg/iosevka/family.css"); 2 2 @import url("https://cdn.xeiaso.net/static/pkg/podkova/family.css"); 3 3 4 - @import "tailwindcss/preflight"; 5 - @import "tailwindcss/utilities"; 4 + @import "tailwindcss"; 6 5 7 6 @theme { 8 7 --font-sans: "Iosevka Aile Iaso", sans-serif; 9 8 --font-mono: "Iosevka Curly Iaso", monospace; 10 9 --font-serif: "Podkova", serif; 10 + 11 + /* Gruvbox color palette - consistent with main site */ 12 + --color-bg-hard: #f9f5d7; 13 + --color-bg-soft: #f2e5bc; 14 + --color-bg-0: #fbf1c7; 15 + --color-bg-1: #ebdbb2; 16 + --color-bg-2: #d5c4a1; 17 + --color-bg-3: #bdae93; 18 + --color-bg-4: #a89984; 19 + 20 + --color-bgDark-hard: #1d2021; 21 + --color-bgDark-soft: #32302f; 22 + --color-bgDark-0: #282828; 23 + --color-bgDark-1: #3c3836; 24 + --color-bgDark-2: #504945; 25 + --color-bgDark-3: #665c54; 26 + --color-bgDark-4: #7c6f64; 27 + 28 + --color-fg-0: #282828; 29 + --color-fg-1: #3c3836; 30 + --color-fg-2: #504945; 31 + --color-fg-3: #665c54; 32 + --color-fg-4: #7c6f64; 33 + 34 + --color-fgDark-0: #fbf1c7; 35 + --color-fgDark-1: #ebdbb2; 36 + --color-fgDark-2: #d5c4a1; 37 + --color-fgDark-3: #bdae93; 38 + --color-fgDark-4: #a89984; 39 + 40 + --color-red-light: #cc241d; 41 + --color-red-dark: #9d0006; 42 + --color-redDark-dark: #cc241d; 43 + --color-redDark-light: #fb4934; 44 + 45 + --color-green-light: #98971a; 46 + --color-green-dark: #79740e; 47 + --color-greenDark-dark: #98971a; 48 + --color-greenDark-light: #b8bb26; 49 + 50 + --color-yellow-light: #d79921; 51 + --color-yellow-dark: #b57614; 52 + --color-yellowDark-light: #d79921; 53 + --color-yellowDark-dark: #fabd2f; 54 + 55 + --color-blue-light: #458588; 56 + --color-blue-dark: #076678; 57 + --color-blueDark-dark: #458588; 58 + --color-blueDark-light: #83a598; 59 + 60 + --color-purple-light: #b16286; 61 + --color-purple-dark: #8f3f71; 62 + --color-purpleDark-dark: #b16286; 63 + --color-purpleDark-light: #d3869b; 64 + 65 + --color-aqua-light: #689d6a; 66 + --color-aqua-dark: #427b58; 67 + --color-aquaDark-dark: #689d6a; 68 + --color-aquaDark-light: #8ec07c; 69 + 70 + --color-orange-light: #d65d0e; 71 + --color-orange-dark: #af3a03; 72 + --color-orangeDark-dark: #d65d0e; 73 + --color-orangeDark-light: #fe8019; 74 + 75 + --color-link-light-normal: #b80050; 76 + --color-link-light-hover: #fdf4c1; 77 + --color-link-light-hoverBg: #9e0045; 78 + --color-link-light-visited: #53493c; 79 + --color-link-light-visitedHover: #fff; 80 + --color-link-light-visitedHoverBg: #282828; 81 + 82 + --color-link-dark-normal: #ffa8ce; 83 + --color-link-dark-hover: #fff; 84 + --color-link-dark-hoverBg: #b3004d; 85 + --color-link-dark-visited: #c1b7a9; 86 + --color-link-dark-visitedHover: #fdf4c1; 87 + --color-link-dark-visitedHoverBg: #282828; 88 + 89 + /* Semantic aliases */ 90 + --color-canvas: var(--color-bg-hard); 91 + --color-canvas-dark: var(--color-bgDark-hard); 92 + --color-surface: var(--color-bg-0); 93 + --color-surface-dark: var(--color-bgDark-0); 94 + --color-surface-elevated: var(--color-bg-soft); 95 + --color-surface-elevated-dark: var(--color-bgDark-1); 96 + 97 + --color-border: var(--color-bg-3); 98 + --color-border-dark: var(--color-bgDark-3); 99 + 100 + --color-text: var(--color-fg-0); 101 + --color-text-muted: var(--color-fg-3); 102 + --color-text-muted-dark: var(--color-fgDark-3); 103 + 104 + /* Accent colors using gruvbox */ 105 + --color-accent-warm: var(--color-orange-light); 106 + --color-accent-warm-dark: var(--color-orangeDark-light); 107 + --color-accent-cool: var(--color-blue-light); 108 + --color-accent-cool-dark: var(--color-blueDark-light); 109 + --color-accent-pink: var(--color-link-light-normal); 110 + --color-accent-pink-dark: var(--color-link-dark-normal); 111 + --color-accent-green: var(--color-green-light); 112 + --color-accent-green-dark: var(--color-greenDark-light); 113 + --color-accent-purple: var(--color-purple-light); 114 + --color-accent-purple-dark: var(--color-purpleDark-light); 11 115 } 12 116 13 117 @layer base { 14 - @reference "tailwindcss"; 118 + * { 119 + @apply border-border dark:border-border-dark; 120 + } 15 121 16 122 h1, 17 123 h2, ··· 19 125 h4, 20 126 h5, 21 127 h6 { 22 - @apply font-serif; 128 + @apply font-serif tracking-tight; 129 + } 130 + 131 + body { 132 + @apply bg-canvas dark:bg-canvas-dark text-text dark:text-fgDark-1; 133 + background-image: 134 + radial-gradient( 135 + ellipse at top left, 136 + rgba(214, 93, 14, 0.05) 0%, 137 + transparent 50% 138 + ), 139 + radial-gradient( 140 + ellipse at bottom right, 141 + rgba(69, 133, 136, 0.05) 0%, 142 + transparent 50% 143 + ); 144 + } 145 + 146 + body { 147 + @variant dark { 148 + background-image: 149 + radial-gradient( 150 + ellipse at top left, 151 + rgba(254, 128, 25, 0.08) 0%, 152 + transparent 50% 153 + ), 154 + radial-gradient( 155 + ellipse at bottom right, 156 + rgba(131, 165, 152, 0.08) 0%, 157 + transparent 50% 158 + ); 159 + } 23 160 } 161 + } 24 162 25 - .xe-hero-image { 26 - background-image: url("/static/img/hero.avif"); 27 - background-size: cover; 28 - background-position: center; 163 + @layer components { 164 + /* Card with subtle depth and warm border accent */ 165 + .card { 166 + @apply bg-surface dark:bg-surface-dark rounded-2xl p-10 shadow-sm; 167 + @apply border border-bg-2 dark:border-bgDark-2; 168 + @apply relative overflow-hidden; 169 + } 170 + 171 + .card::before { 172 + content: ""; 173 + @apply absolute top-0 left-0 right-0 h-[2px]; 174 + background: linear-gradient( 175 + 90deg, 176 + var(--color-orange-light) 0%, 177 + var(--color-blue-light) 50%, 178 + var(--color-purple-light) 100% 179 + ); 180 + opacity: 0.6; 29 181 } 30 182 31 - .frosted-glass { 32 - backdrop-filter: blur(10px); 33 - background-color: rgba(255, 255, 255, 0.7); 34 - border-radius: 12px; 35 - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); 183 + .card::before { 184 + @variant dark { 185 + background: linear-gradient( 186 + 90deg, 187 + var(--color-orangeDark-light) 0%, 188 + var(--color-blueDark-light) 50%, 189 + var(--color-purpleDark-light) 100% 190 + ); 191 + opacity: 0.8; 192 + } 36 193 } 194 + 195 + /* Card variants for visual variety */ 196 + .card-warm::before { 197 + background: linear-gradient( 198 + 90deg, 199 + var(--color-orange-light), 200 + var(--color-link-light-normal) 201 + ); 202 + } 203 + 204 + .card-cool::before { 205 + background: linear-gradient( 206 + 90deg, 207 + var(--color-blue-light), 208 + var(--color-purple-light) 209 + ); 210 + } 211 + 212 + .card-green::before { 213 + background: linear-gradient( 214 + 90deg, 215 + var(--color-green-light), 216 + var(--color-aqua-light) 217 + ); 218 + } 219 + 220 + .card-warm::before { 221 + @variant dark { 222 + background: linear-gradient( 223 + 90deg, 224 + var(--color-orangeDark-light), 225 + var(--color-link-dark-normal) 226 + ); 227 + } 228 + } 229 + 230 + .card-cool::before { 231 + @variant dark { 232 + background: linear-gradient( 233 + 90deg, 234 + var(--color-blueDark-light), 235 + var(--color-purpleDark-light) 236 + ); 237 + } 238 + } 239 + 240 + .card-green::before { 241 + @variant dark { 242 + background: linear-gradient( 243 + 90deg, 244 + var(--color-greenDark-light), 245 + var(--color-aquaDark-light) 246 + ); 247 + } 248 + } 249 + 250 + /* Buttons with depth and personality */ 251 + .btn { 252 + @apply inline-flex items-center justify-center px-6 py-3 rounded-xl; 253 + @apply font-medium text-sm transition-all duration-200; 254 + @apply focus:outline-none focus:ring-2 focus:ring-offset-2; 255 + @apply shadow-sm hover:shadow-md active:shadow-sm; 256 + @apply transform hover:-translate-y-px active:translate-y-0; 257 + } 258 + 259 + .btn-primary { 260 + @apply bg-orange-light dark:bg-orangeDark-light text-white; 261 + @apply hover:bg-orange-dark dark:hover:bg-yellowDark-dark; 262 + @apply focus:ring-orange-light dark:focus:ring-orangeDark-light; 263 + @apply dark:text-white; 264 + } 265 + 266 + .btn-secondary { 267 + @apply bg-blue-light dark:bg-blueDark-dark text-white; 268 + @apply hover:bg-blue-dark dark:hover:bg-blue-dark; 269 + @apply focus:ring-blue-light dark:focus:ring-blueDark-light; 270 + @apply dark:text-white; 271 + } 272 + 273 + .btn-dark { 274 + @apply bg-fg-0 dark:bg-purpleDark-light text-white; 275 + @apply hover:bg-fg-1 dark:hover:bg-purpleDark-dark; 276 + @apply focus:ring-fg-0 dark:focus:ring-purpleDark-light; 277 + @apply dark:text-white; 278 + } 279 + 280 + .btn-pink { 281 + @apply bg-link-light-normal dark:bg-link-dark-normal text-white; 282 + @apply hover:bg-link-light-hoverBg dark:hover:bg-link-dark-hoverBg; 283 + @apply focus:ring-link-light-normal dark:focus:ring-link-dark-normal; 284 + @apply dark:text-white; 285 + } 286 + 287 + .btn-ghost { 288 + @apply bg-transparent text-fg-1 dark:text-fgDark-1; 289 + @apply hover:bg-bg-1 dark:hover:bg-bgDark-1; 290 + @apply focus:ring-bg-3 dark:focus:ring-bgDark-3; 291 + @apply shadow-none hover:shadow-none; 292 + @apply dark:bg-bgDark-2/50; 293 + } 294 + 295 + /* Input styling */ 296 + .input { 297 + @apply w-full rounded-xl px-5 py-3.5 text-sm; 298 + @apply bg-bg-0 dark:bg-bgDark-4; 299 + @apply border-2 border-bg-4 dark:border-bgDark-4; 300 + @apply text-fg-0 dark:text-fgDark-1; 301 + @apply placeholder:text-fg-4 dark:placeholder:text-fgDark-4; 302 + @apply focus:outline-none focus:ring-2 focus:ring-orange-light/50 dark:focus:ring-orangeDark-dark/50; 303 + @apply focus:border-orange-light dark:focus:border-orangeDark-dark; 304 + @apply transition-all duration-200; 305 + } 306 + 307 + /* Navigation styling */ 308 + .navbar { 309 + @apply bg-bg-0/80 dark:bg-bgDark-0/80; 310 + @apply backdrop-blur-lg border-b border-bg-3 dark:border-bgDark-3; 311 + } 312 + 313 + /* Hero section with gradient text */ 314 + .hero-title { 315 + @apply text-3xl md:text-4xl font-bold font-serif; 316 + background: linear-gradient( 317 + 135deg, 318 + var(--color-orange-light) 0%, 319 + var(--color-link-light-normal) 100% 320 + ); 321 + -webkit-background-clip: text; 322 + -webkit-text-fill-color: transparent; 323 + background-clip: text; 324 + } 325 + 326 + .hero-title { 327 + @variant dark { 328 + background: linear-gradient( 329 + 135deg, 330 + var(--color-orangeDark-light) 0%, 331 + var(--color-link-dark-normal) 100% 332 + ); 333 + -webkit-background-clip: text; 334 + -webkit-text-fill-color: transparent; 335 + background-clip: text; 336 + } 337 + } 338 + 339 + /* Success/error states */ 340 + .alert-success { 341 + @apply bg-greenDark-dark/10 dark:bg-greenDark-dark/20 border border-green-light dark:border-greenDark-light; 342 + @apply rounded-xl p-5; 343 + } 344 + 345 + .alert-error { 346 + @apply bg-redDark-dark/10 dark:bg-redDark-dark/20 border border-red-light dark:border-redDark-light; 347 + @apply rounded-xl p-5; 348 + } 349 + 350 + /* Card section headers */ 351 + .card-title { 352 + @apply text-lg font-semibold font-serif text-fg-0 dark:text-fgDark-1 mb-2; 353 + } 354 + 355 + .card-description { 356 + @apply text-sm text-fg-3 dark:text-fgDark-3 mb-4; 357 + } 358 + 359 + /* Decorative elements */ 360 + .accent-dot { 361 + @apply inline-block w-2 h-2 rounded-full bg-orange-light dark:bg-orangeDark-light mr-2; 362 + } 363 + 364 + /* File input styling */ 365 + .file-input { 366 + @apply block w-full text-sm text-fg-4 dark:text-fgDark-4; 367 + @apply file:mr-4 file:py-2 file:px-4; 368 + @apply file:rounded-lg file:border-0; 369 + @apply file:text-sm file:font-medium; 370 + @apply file:bg-orange-light/10 dark:file:bg-orangeDark-dark/50; 371 + @apply file:text-orange-light dark:file:text-orangeDark-light; 372 + @apply hover:file:bg-orange-light/20 dark:hover:file:bg-orangeDark-dark/30; 373 + @apply cursor-pointer; 374 + } 375 + } 376 + 377 + /* Custom scrollbar */ 378 + ::-webkit-scrollbar { 379 + width: 8px; 380 + height: 8px; 381 + } 382 + 383 + ::-webkit-scrollbar-track { 384 + @apply bg-canvas dark:bg-canvas-dark; 385 + } 386 + 387 + ::-webkit-scrollbar-thumb { 388 + @apply bg-bg-3 dark:bg-bgDark-3 rounded-full; 389 + } 390 + 391 + ::-webkit-scrollbar-thumb:hover { 392 + @apply bg-fg-4 dark:bg-fgDark-4; 37 393 }
-14
cmd/sponsor-panel/tailwind.config.js
··· 1 - /** @type {import('tailwindcss').Config} */ 2 - module.exports = { 3 - content: ["./*.templ", "./templates/**/*.templ"], 4 - theme: { 5 - extend: { 6 - fontFamily: { 7 - sans: ["Iosevka Aile Iaso", "sans-serif"], 8 - mono: ["Iosevka Curly Iaso", "monospace"], 9 - serif: ["Podkova", "serif"], 10 - }, 11 - }, 12 - }, 13 - plugins: [require("@tailwindcss/typography"), require("@tailwindcss/forms")], 14 - };
+2 -2
cmd/sponsor-panel/templates/base.templ
··· 4 4 5 5 templ Base(title string, content templ.Component) { 6 6 <!DOCTYPE html> 7 - <html lang="en"> 7 + <html lang="en" class="bg-canvas dark:bg-canvas-dark"> 8 8 <head> 9 9 <meta charset="UTF-8"/> 10 10 <meta name="viewport" content="width=device-width, initial-scale=1.0"/> ··· 16 16 <link rel="stylesheet" href="/static/css/styles.css"/> 17 17 @htmx.Use("remove-me") 18 18 </head> 19 - <body class="bg-gray-50 dark:bg-gray-900"> 19 + <body> 20 20 @content 21 21 </body> 22 22 </html>
+2 -2
cmd/sponsor-panel/templates/base_templ.go
··· 31 31 templ_7745c5c3_Var1 = templ.NopComponent 32 32 } 33 33 ctx = templ.ClearChildren(ctx) 34 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "<!doctype html><html lang=\"en\"><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">") 34 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "<!doctype html><html lang=\"en\" class=\"bg-canvas dark:bg-canvas-dark\"><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">") 35 35 if templ_7745c5c3_Err != nil { 36 36 return templ_7745c5c3_Err 37 37 } ··· 67 67 if templ_7745c5c3_Err != nil { 68 68 return templ_7745c5c3_Err 69 69 } 70 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "</head><body class=\"bg-gray-50 dark:bg-gray-900\">") 70 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "</head><body>") 71 71 if templ_7745c5c3_Err != nil { 72 72 return templ_7745c5c3_Err 73 73 }
+65 -36
cmd/sponsor-panel/templates/dashboard.templ
··· 18 18 19 19 templ Dashboard(props DashboardProps) { 20 20 @Navbar(props.User.Login, props.User.AvatarURL) 21 - <main class="max-w-4xl mx-auto px-4 py-8"> 22 - <h1 class="text-2xl font-bold text-gray-900 dark:text-gray-100 mb-6">Welcome, { props.User.Login }!</h1> 23 - <div class="grid md:grid-cols-2 gap-6"> 21 + <main class="max-w-4xl mx-auto px-4 md:px-10 py-4 md:py-10"> 22 + <div class=""> 23 + <h1 class="hero-title mb-3">Welcome back, { props.User.Login }</h1> 24 + <p class="text-fg-3 dark:text-fgDark-3">Manage your sponsorship benefits</p> 25 + </div> 26 + <div class="grid md:grid-cols-2 gap-8 mt-4"> 24 27 if props.IsSponsor { 25 28 @DiscordCard(props.DiscordInvite) 26 29 } 27 30 @SponsorshipCard(props.IsSponsor, props.SponsorAmount, props.SponsorTier) 28 31 </div> 29 - <div class="grid md:grid-cols-2 gap-6 mt-6"> 32 + <div class="grid md:grid-cols-2 gap-8 mt-8"> 30 33 if props.IsFiftyPlus { 31 34 @TeamInviteCard() 32 35 } ··· 38 41 } 39 42 40 43 templ Navbar(login, avatarURL string) { 41 - <nav class="bg-white dark:bg-slate-800/90 border-b border-gray-200 dark:border-slate-700 px-4 py-3"> 44 + <nav class="navbar sticky top-0 z-50 px-8 py-5 md:px-12"> 42 45 <div class="max-w-4xl mx-auto flex items-center justify-between"> 43 46 <div class="flex items-center gap-3"> 44 - <img src={ templ.SafeURL(avatarURL) } class="w-8 h-8 rounded-full" alt=""/> 45 - <span class="font-semibold text-gray-900 dark:text-gray-100">{ login }</span> 47 + <img src={ templ.SafeURL(avatarURL) } class="w-9 h-9 rounded-full ring-2 ring-bg-3 dark:ring-bgDark-3" alt=""/> 48 + <span class="font-medium text-fg-1 dark:text-fgDark-1">{ login }</span> 46 49 </div> 47 - <a href="/logout" class="text-sm text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white transition-colors"> 50 + <a href="/logout" class="btn btn-ghost text-sm p-2"> 48 51 Logout 49 52 </a> 50 53 </div> ··· 52 55 } 53 56 54 57 templ DiscordCard(inviteURL string) { 55 - <div class="bg-white dark:bg-slate-800/80 rounded-xl p-6 shadow-sm border border-gray-200 dark:border-slate-700"> 56 - <h2 class="font-semibold text-gray-900 dark:text-gray-100 mb-2">Discord Community</h2> 57 - <p class="text-sm text-gray-600 dark:text-gray-300 mb-4"> 58 - Join our Discord server to chat with other sponsors. 58 + <div class="card card-cool p-4"> 59 + <h2 class="card-title flex items-center gap-3 !mb-4"> 60 + <svg class="w-6 h-6 text-blue-light dark:text-blueDark-light" viewBox="0 0 24 24" fill="currentColor"> 61 + <path d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028 14.09 14.09 0 0 0 1.226-1.994.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z"></path> 62 + </svg> 63 + Discord Community 64 + </h2> 65 + <p class="card-description !mb-6"> 66 + Connect with other sponsors and get early access to updates. 59 67 </p> 60 - <a href={ templ.SafeURL(inviteURL) } target="_blank" class="inline-block bg-indigo-600 hover:bg-indigo-700 text-white px-4 py-2 rounded-lg text-sm transition-colors"> 68 + <a href={ templ.SafeURL(inviteURL) } target="_blank" class="btn btn-secondary p-2"> 61 69 Join Discord 62 70 </a> 63 71 </div> 64 72 } 65 73 66 74 templ SponsorshipCard(isSponsor bool, amount int, tier string) { 67 - <div class="bg-white dark:bg-slate-800/80 rounded-xl p-6 shadow-sm border border-gray-200 dark:border-slate-700"> 68 - <h2 class="font-semibold text-gray-900 dark:text-gray-100 mb-2">Your Sponsorship</h2> 75 + <div class="card card-warm p-4"> 76 + <h2 class="card-title flex items-center gap-2"> 77 + <svg class="w-5 h-5 text-orange-light dark:text-orangeDark-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> 78 + <path stroke-linecap="round" stroke-linejoin="round" d="M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z"></path> 79 + </svg> 80 + Your Sponsorship 81 + </h2> 69 82 if isSponsor { 70 - <p class="text-green-600 dark:text-green-400"> 71 - ${ formatDollars(amount) }/month - { tier } 72 - </p> 73 - <p class="text-sm text-gray-600 dark:text-gray-300 mt-1">Thank you for your support!</p> 83 + <div class="flex items-center gap-2 mb-2"> 84 + <span class="accent-dot"></span> 85 + <span class="text-lg font-semibold text-green-light dark:text-greenDark-light"> 86 + ${ formatDollars(amount) }/month 87 + </span> 88 + </div> 89 + <p class="text-sm text-fg-3 dark:text-fgDark-3 mb-3">{ tier }</p> 90 + <p class="text-sm font-medium text-orange-light dark:text-orangeDark-light">Thank you for your support!</p> 74 91 } else { 75 - <p class="text-gray-600 dark:text-gray-300">Not an active sponsor.</p> 76 - <a href="https://github.com/sponsors/Xe" target="_blank" class="inline-block bg-pink-600 hover:bg-pink-700 text-white px-4 py-2 rounded-lg text-sm mt-2 transition-colors"> 92 + <p class="card-description">You're not currently an active sponsor.</p> 93 + <a href="https://github.com/sponsors/Xe" target="_blank" class="btn btn-pink"> 77 94 Become a Sponsor 78 95 </a> 79 - <p class="text-sm text-gray-600 dark:text-gray-300 mt-1">If you are a part of an organization that sponsors Anubis and see this message, please contact me@xeiaso.net for help.</p> 96 + <p class="text-xs text-fg-4 dark:text-fgDark-4 mt-4 leading-relaxed"> 97 + If you're part of an organization that sponsors Anubis and see this message, please contact me@xeiaso.net for help. 98 + </p> 80 99 } 81 100 </div> 82 101 } 83 102 84 103 templ TeamInviteCard() { 85 - <div class="bg-white dark:bg-slate-800/80 rounded-xl p-6 shadow-sm border border-gray-200 dark:border-slate-700"> 86 - <h2 class="font-semibold text-gray-900 dark:text-gray-100 mb-2">Team Invitation</h2> 87 - <p class="text-sm text-gray-600 dark:text-gray-300 mb-4"> 88 - Invite team members to TecharoHQ. 104 + <div class="card card-green p-4"> 105 + <h2 class="card-title flex items-center gap-2"> 106 + <svg class="w-5 h-5 text-green-light dark:text-greenDark-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> 107 + <path stroke-linecap="round" stroke-linejoin="round" d="M18 9v3m0 0v3m0-3h3m-3 0h-3m-2-5a4 4 0 11-8 0 4 4 0 018 0zM3 20a6 6 0 0112 0v1H3v-1z"></path> 108 + </svg> 109 + Team Invitation 110 + </h2> 111 + <p class="card-description"> 112 + Invite team members to TecharoHQ as part of your sponsorship. 89 113 </p> 90 114 <form hx-post="/invite" hx-target="#invite-result" class="space-y-3"> 91 115 <input ··· 93 117 name="username" 94 118 placeholder="GitHub username" 95 119 required 96 - class="w-full border border-gray-300 dark:border-slate-600 rounded-lg px-3 py-2 dark:bg-slate-700 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500 dark:focus:ring-blue-400" 120 + class="input" 97 121 /> 98 - <button type="submit" class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-lg text-sm w-full transition-colors"> 99 - Invite to Team 122 + <button type="submit" class="btn btn-primary w-full"> 123 + Send Invitation 100 124 </button> 101 125 </form> 102 126 <div id="invite-result"></div> ··· 104 128 } 105 129 106 130 templ LogoSubmitCard() { 107 - <div class="bg-white dark:bg-slate-800/80 rounded-xl p-6 shadow-sm border border-gray-200 dark:border-slate-700"> 108 - <h2 class="font-semibold text-gray-900 dark:text-gray-100 mb-2">Logo Submission</h2> 109 - <p class="text-sm text-gray-600 dark:text-gray-300 mb-4"> 131 + <div class="card p-4"> 132 + <h2 class="card-title flex items-center gap-2"> 133 + <svg class="w-5 h-5 text-purple-light dark:text-purpleDark-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> 134 + <path stroke-linecap="round" stroke-linejoin="round" d="M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"></path> 135 + </svg> 136 + Logo Submission 137 + </h2> 138 + <p class="card-description"> 110 139 Submit your company logo for the Anubis README. 111 140 </p> 112 141 <form hx-post="/logo" hx-encoding="multipart/form-data" hx-target="#logo-result" class="space-y-3"> ··· 115 144 name="company" 116 145 placeholder="Company Name" 117 146 required 118 - class="w-full border border-gray-300 dark:border-slate-600 rounded-lg px-3 py-2 dark:bg-slate-700 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-orange-500 dark:focus:ring-orange-400" 147 + class="input" 119 148 /> 120 149 <input 121 150 type="url" 122 151 name="website" 123 152 placeholder="Website URL" 124 153 required 125 - class="w-full border border-gray-300 dark:border-slate-600 rounded-lg px-3 py-2 dark:bg-slate-700 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-orange-500 dark:focus:ring-orange-400" 154 + class="input" 126 155 /> 127 156 <input 128 157 type="file" 129 158 name="logo" 130 159 accept="image/png,image/jpeg,image/svg+xml" 131 160 required 132 - class="w-full border border-gray-300 dark:border-slate-600 rounded-lg px-3 py-2 dark:bg-slate-700 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-orange-500 dark:focus:ring-orange-400" 161 + class="file-input" 133 162 /> 134 - <button type="submit" class="bg-orange-600 hover:bg-orange-700 text-white px-4 py-2 rounded-lg text-sm w-full transition-colors"> 163 + <button type="submit" class="btn btn-dark w-full"> 135 164 Submit Logo 136 165 </button> 137 166 </form>
+20 -20
cmd/sponsor-panel/templates/dashboard_templ.go
··· 49 49 if templ_7745c5c3_Err != nil { 50 50 return templ_7745c5c3_Err 51 51 } 52 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "<main class=\"max-w-4xl mx-auto px-4 py-8\"><h1 class=\"text-2xl font-bold text-gray-900 dark:text-gray-100 mb-6\">Welcome, ") 52 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "<main class=\"max-w-4xl mx-auto px-4 md:px-10 py-4 md:py-10\"><div class=\"\"><h1 class=\"hero-title mb-3\">Welcome back, ") 53 53 if templ_7745c5c3_Err != nil { 54 54 return templ_7745c5c3_Err 55 55 } 56 56 var templ_7745c5c3_Var2 string 57 57 templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(props.User.Login) 58 58 if templ_7745c5c3_Err != nil { 59 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/dashboard.templ`, Line: 22, Col: 98} 59 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/dashboard.templ`, Line: 23, Col: 63} 60 60 } 61 61 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2)) 62 62 if templ_7745c5c3_Err != nil { 63 63 return templ_7745c5c3_Err 64 64 } 65 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "!</h1><div class=\"grid md:grid-cols-2 gap-6\">") 65 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "</h1><p class=\"text-fg-3 dark:text-fgDark-3\">Manage your sponsorship benefits</p></div><div class=\"grid md:grid-cols-2 gap-8 mt-4\">") 66 66 if templ_7745c5c3_Err != nil { 67 67 return templ_7745c5c3_Err 68 68 } ··· 76 76 if templ_7745c5c3_Err != nil { 77 77 return templ_7745c5c3_Err 78 78 } 79 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "</div><div class=\"grid md:grid-cols-2 gap-6 mt-6\">") 79 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "</div><div class=\"grid md:grid-cols-2 gap-8 mt-8\">") 80 80 if templ_7745c5c3_Err != nil { 81 81 return templ_7745c5c3_Err 82 82 } ··· 121 121 templ_7745c5c3_Var3 = templ.NopComponent 122 122 } 123 123 ctx = templ.ClearChildren(ctx) 124 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "<nav class=\"bg-white dark:bg-slate-800/90 border-b border-gray-200 dark:border-slate-700 px-4 py-3\"><div class=\"max-w-4xl mx-auto flex items-center justify-between\"><div class=\"flex items-center gap-3\"><img src=\"") 124 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "<nav class=\"navbar sticky top-0 z-50 px-8 py-5 md:px-12\"><div class=\"max-w-4xl mx-auto flex items-center justify-between\"><div class=\"flex items-center gap-3\"><img src=\"") 125 125 if templ_7745c5c3_Err != nil { 126 126 return templ_7745c5c3_Err 127 127 } 128 128 var templ_7745c5c3_Var4 string 129 129 templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(templ.SafeURL(avatarURL)) 130 130 if templ_7745c5c3_Err != nil { 131 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/dashboard.templ`, Line: 44, Col: 39} 131 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/dashboard.templ`, Line: 47, Col: 39} 132 132 } 133 133 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4)) 134 134 if templ_7745c5c3_Err != nil { 135 135 return templ_7745c5c3_Err 136 136 } 137 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "\" class=\"w-8 h-8 rounded-full\" alt=\"\"> <span class=\"font-semibold text-gray-900 dark:text-gray-100\">") 137 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "\" class=\"w-9 h-9 rounded-full ring-2 ring-bg-3 dark:ring-bgDark-3\" alt=\"\"> <span class=\"font-medium text-fg-1 dark:text-fgDark-1\">") 138 138 if templ_7745c5c3_Err != nil { 139 139 return templ_7745c5c3_Err 140 140 } 141 141 var templ_7745c5c3_Var5 string 142 142 templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(login) 143 143 if templ_7745c5c3_Err != nil { 144 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/dashboard.templ`, Line: 45, Col: 72} 144 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/dashboard.templ`, Line: 48, Col: 66} 145 145 } 146 146 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5)) 147 147 if templ_7745c5c3_Err != nil { 148 148 return templ_7745c5c3_Err 149 149 } 150 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "</span></div><a href=\"/logout\" class=\"text-sm text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white transition-colors\">Logout</a></div></nav>") 150 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "</span></div><a href=\"/logout\" class=\"btn btn-ghost text-sm p-2\">Logout</a></div></nav>") 151 151 if templ_7745c5c3_Err != nil { 152 152 return templ_7745c5c3_Err 153 153 } ··· 176 176 templ_7745c5c3_Var6 = templ.NopComponent 177 177 } 178 178 ctx = templ.ClearChildren(ctx) 179 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "<div class=\"bg-white dark:bg-slate-800/80 rounded-xl p-6 shadow-sm border border-gray-200 dark:border-slate-700\"><h2 class=\"font-semibold text-gray-900 dark:text-gray-100 mb-2\">Discord Community</h2><p class=\"text-sm text-gray-600 dark:text-gray-300 mb-4\">Join our Discord server to chat with other sponsors.</p><a href=\"") 179 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "<div class=\"card card-cool p-4\"><h2 class=\"card-title flex items-center gap-3 !mb-4\"><svg class=\"w-6 h-6 text-blue-light dark:text-blueDark-light\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028 14.09 14.09 0 0 0 1.226-1.994.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z\"></path></svg> Discord Community</h2><p class=\"card-description !mb-6\">Connect with other sponsors and get early access to updates.</p><a href=\"") 180 180 if templ_7745c5c3_Err != nil { 181 181 return templ_7745c5c3_Err 182 182 } ··· 185 185 if templ_7745c5c3_Err != nil { 186 186 return templ_7745c5c3_Err 187 187 } 188 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "\" target=\"_blank\" class=\"inline-block bg-indigo-600 hover:bg-indigo-700 text-white px-4 py-2 rounded-lg text-sm transition-colors\">Join Discord</a></div>") 188 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "\" target=\"_blank\" class=\"btn btn-secondary p-2\">Join Discord</a></div>") 189 189 if templ_7745c5c3_Err != nil { 190 190 return templ_7745c5c3_Err 191 191 } ··· 214 214 templ_7745c5c3_Var8 = templ.NopComponent 215 215 } 216 216 ctx = templ.ClearChildren(ctx) 217 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "<div class=\"bg-white dark:bg-slate-800/80 rounded-xl p-6 shadow-sm border border-gray-200 dark:border-slate-700\"><h2 class=\"font-semibold text-gray-900 dark:text-gray-100 mb-2\">Your Sponsorship</h2>") 217 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "<div class=\"card card-warm p-4\"><h2 class=\"card-title flex items-center gap-2\"><svg class=\"w-5 h-5 text-orange-light dark:text-orangeDark-light\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z\"></path></svg> Your Sponsorship</h2>") 218 218 if templ_7745c5c3_Err != nil { 219 219 return templ_7745c5c3_Err 220 220 } 221 221 if isSponsor { 222 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, "<p class=\"text-green-600 dark:text-green-400\">$") 222 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, "<div class=\"flex items-center gap-2 mb-2\"><span class=\"accent-dot\"></span> <span class=\"text-lg font-semibold text-green-light dark:text-greenDark-light\">$") 223 223 if templ_7745c5c3_Err != nil { 224 224 return templ_7745c5c3_Err 225 225 } 226 226 var templ_7745c5c3_Var9 string 227 227 templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(formatDollars(amount)) 228 228 if templ_7745c5c3_Err != nil { 229 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/dashboard.templ`, Line: 71, Col: 28} 229 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/dashboard.templ`, Line: 86, Col: 29} 230 230 } 231 231 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9)) 232 232 if templ_7745c5c3_Err != nil { 233 233 return templ_7745c5c3_Err 234 234 } 235 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "/month - ") 235 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "/month</span></div><p class=\"text-sm text-fg-3 dark:text-fgDark-3 mb-3\">") 236 236 if templ_7745c5c3_Err != nil { 237 237 return templ_7745c5c3_Err 238 238 } 239 239 var templ_7745c5c3_Var10 string 240 240 templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(tier) 241 241 if templ_7745c5c3_Err != nil { 242 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/dashboard.templ`, Line: 71, Col: 45} 242 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/dashboard.templ`, Line: 89, Col: 62} 243 243 } 244 244 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10)) 245 245 if templ_7745c5c3_Err != nil { 246 246 return templ_7745c5c3_Err 247 247 } 248 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "</p><p class=\"text-sm text-gray-600 dark:text-gray-300 mt-1\">Thank you for your support!</p>") 248 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "</p><p class=\"text-sm font-medium text-orange-light dark:text-orangeDark-light\">Thank you for your support!</p>") 249 249 if templ_7745c5c3_Err != nil { 250 250 return templ_7745c5c3_Err 251 251 } 252 252 } else { 253 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "<p class=\"text-gray-600 dark:text-gray-300\">Not an active sponsor.</p><a href=\"https://github.com/sponsors/Xe\" target=\"_blank\" class=\"inline-block bg-pink-600 hover:bg-pink-700 text-white px-4 py-2 rounded-lg text-sm mt-2 transition-colors\">Become a Sponsor</a><p class=\"text-sm text-gray-600 dark:text-gray-300 mt-1\">If you are a part of an organization that sponsors Anubis and see this message, please contact me@xeiaso.net for help.</p>") 253 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "<p class=\"card-description\">You're not currently an active sponsor.</p><a href=\"https://github.com/sponsors/Xe\" target=\"_blank\" class=\"btn btn-pink\">Become a Sponsor</a><p class=\"text-xs text-fg-4 dark:text-fgDark-4 mt-4 leading-relaxed\">If you're part of an organization that sponsors Anubis and see this message, please contact me@xeiaso.net for help.</p>") 254 254 if templ_7745c5c3_Err != nil { 255 255 return templ_7745c5c3_Err 256 256 } ··· 284 284 templ_7745c5c3_Var11 = templ.NopComponent 285 285 } 286 286 ctx = templ.ClearChildren(ctx) 287 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "<div class=\"bg-white dark:bg-slate-800/80 rounded-xl p-6 shadow-sm border border-gray-200 dark:border-slate-700\"><h2 class=\"font-semibold text-gray-900 dark:text-gray-100 mb-2\">Team Invitation</h2><p class=\"text-sm text-gray-600 dark:text-gray-300 mb-4\">Invite team members to TecharoHQ.</p><form hx-post=\"/invite\" hx-target=\"#invite-result\" class=\"space-y-3\"><input type=\"text\" name=\"username\" placeholder=\"GitHub username\" required class=\"w-full border border-gray-300 dark:border-slate-600 rounded-lg px-3 py-2 dark:bg-slate-700 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500 dark:focus:ring-blue-400\"> <button type=\"submit\" class=\"bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-lg text-sm w-full transition-colors\">Invite to Team</button></form><div id=\"invite-result\"></div></div>") 287 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "<div class=\"card card-green p-4\"><h2 class=\"card-title flex items-center gap-2\"><svg class=\"w-5 h-5 text-green-light dark:text-greenDark-light\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M18 9v3m0 0v3m0-3h3m-3 0h-3m-2-5a4 4 0 11-8 0 4 4 0 018 0zM3 20a6 6 0 0112 0v1H3v-1z\"></path></svg> Team Invitation</h2><p class=\"card-description\">Invite team members to TecharoHQ as part of your sponsorship.</p><form hx-post=\"/invite\" hx-target=\"#invite-result\" class=\"space-y-3\"><input type=\"text\" name=\"username\" placeholder=\"GitHub username\" required class=\"input\"> <button type=\"submit\" class=\"btn btn-primary w-full\">Send Invitation</button></form><div id=\"invite-result\"></div></div>") 288 288 if templ_7745c5c3_Err != nil { 289 289 return templ_7745c5c3_Err 290 290 } ··· 313 313 templ_7745c5c3_Var12 = templ.NopComponent 314 314 } 315 315 ctx = templ.ClearChildren(ctx) 316 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "<div class=\"bg-white dark:bg-slate-800/80 rounded-xl p-6 shadow-sm border border-gray-200 dark:border-slate-700\"><h2 class=\"font-semibold text-gray-900 dark:text-gray-100 mb-2\">Logo Submission</h2><p class=\"text-sm text-gray-600 dark:text-gray-300 mb-4\">Submit your company logo for the Anubis README.</p><form hx-post=\"/logo\" hx-encoding=\"multipart/form-data\" hx-target=\"#logo-result\" class=\"space-y-3\"><input type=\"text\" name=\"company\" placeholder=\"Company Name\" required class=\"w-full border border-gray-300 dark:border-slate-600 rounded-lg px-3 py-2 dark:bg-slate-700 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-orange-500 dark:focus:ring-orange-400\"> <input type=\"url\" name=\"website\" placeholder=\"Website URL\" required class=\"w-full border border-gray-300 dark:border-slate-600 rounded-lg px-3 py-2 dark:bg-slate-700 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-orange-500 dark:focus:ring-orange-400\"> <input type=\"file\" name=\"logo\" accept=\"image/png,image/jpeg,image/svg+xml\" required class=\"w-full border border-gray-300 dark:border-slate-600 rounded-lg px-3 py-2 dark:bg-slate-700 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-orange-500 dark:focus:ring-orange-400\"> <button type=\"submit\" class=\"bg-orange-600 hover:bg-orange-700 text-white px-4 py-2 rounded-lg text-sm w-full transition-colors\">Submit Logo</button></form><div id=\"logo-result\"></div></div>") 316 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "<div class=\"card p-4\"><h2 class=\"card-title flex items-center gap-2\"><svg class=\"w-5 h-5 text-purple-light dark:text-purpleDark-light\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"></path></svg> Logo Submission</h2><p class=\"card-description\">Submit your company logo for the Anubis README.</p><form hx-post=\"/logo\" hx-encoding=\"multipart/form-data\" hx-target=\"#logo-result\" class=\"space-y-3\"><input type=\"text\" name=\"company\" placeholder=\"Company Name\" required class=\"input\"> <input type=\"url\" name=\"website\" placeholder=\"Website URL\" required class=\"input\"> <input type=\"file\" name=\"logo\" accept=\"image/png,image/jpeg,image/svg+xml\" required class=\"file-input\"> <button type=\"submit\" class=\"btn btn-dark w-full\">Submit Logo</button></form><div id=\"logo-result\"></div></div>") 317 317 if templ_7745c5c3_Err != nil { 318 318 return templ_7745c5c3_Err 319 319 }
+14 -4
cmd/sponsor-panel/templates/formresult.templ
··· 2 2 3 3 templ FormResult(message string, isSuccess bool) { 4 4 if isSuccess { 5 - <div class="bg-green-50 dark:bg-green-900/20 text-green-700 dark:text-green-300 p-4 rounded-lg"> 6 - { message } 5 + <div class="alert-success mt-3"> 6 + <div class="flex items-start gap-3"> 7 + <svg class="w-5 h-5 text-green-light dark:text-greenDark-light flex-shrink-0 mt-0.5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> 8 + <path stroke-linecap="round" stroke-linejoin="round" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/> 9 + </svg> 10 + <p class="text-sm text-green-dark dark:text-greenDark-dark font-medium">{ message }</p> 11 + </div> 7 12 </div> 8 13 } else { 9 - <div class="bg-red-50 dark:bg-red-900/20 text-red-700 dark:text-red-300 p-4 rounded-lg"> 10 - { message } 14 + <div class="alert-error mt-3"> 15 + <div class="flex items-start gap-3"> 16 + <svg class="w-5 h-5 text-red-light dark:text-redDark-light flex-shrink-0 mt-0.5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> 17 + <path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/> 18 + </svg> 19 + <p class="text-sm text-red-dark dark:text-redDark-dark font-medium">{ message }</p> 20 + </div> 11 21 </div> 12 22 } 13 23 }
+6 -6
cmd/sponsor-panel/templates/formresult_templ.go
··· 30 30 } 31 31 ctx = templ.ClearChildren(ctx) 32 32 if isSuccess { 33 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "<div class=\"bg-green-50 dark:bg-green-900/20 text-green-700 dark:text-green-300 p-4 rounded-lg\">") 33 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "<div class=\"alert-success mt-3\"><div class=\"flex items-start gap-3\"><svg class=\"w-5 h-5 text-green-light dark:text-greenDark-light flex-shrink-0 mt-0.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\"></path></svg><p class=\"text-sm text-green-dark dark:text-greenDark-dark font-medium\">") 34 34 if templ_7745c5c3_Err != nil { 35 35 return templ_7745c5c3_Err 36 36 } 37 37 var templ_7745c5c3_Var2 string 38 38 templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(message) 39 39 if templ_7745c5c3_Err != nil { 40 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/formresult.templ`, Line: 6, Col: 12} 40 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/formresult.templ`, Line: 10, Col: 85} 41 41 } 42 42 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2)) 43 43 if templ_7745c5c3_Err != nil { 44 44 return templ_7745c5c3_Err 45 45 } 46 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "</div>") 46 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "</p></div></div>") 47 47 if templ_7745c5c3_Err != nil { 48 48 return templ_7745c5c3_Err 49 49 } 50 50 } else { 51 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "<div class=\"bg-red-50 dark:bg-red-900/20 text-red-700 dark:text-red-300 p-4 rounded-lg\">") 51 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "<div class=\"alert-error mt-3\"><div class=\"flex items-start gap-3\"><svg class=\"w-5 h-5 text-red-light dark:text-redDark-light flex-shrink-0 mt-0.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"></path></svg><p class=\"text-sm text-red-dark dark:text-redDark-dark font-medium\">") 52 52 if templ_7745c5c3_Err != nil { 53 53 return templ_7745c5c3_Err 54 54 } 55 55 var templ_7745c5c3_Var3 string 56 56 templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(message) 57 57 if templ_7745c5c3_Err != nil { 58 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/formresult.templ`, Line: 10, Col: 12} 58 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/formresult.templ`, Line: 19, Col: 81} 59 59 } 60 60 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) 61 61 if templ_7745c5c3_Err != nil { 62 62 return templ_7745c5c3_Err 63 63 } 64 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "</div>") 64 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "</p></div></div>") 65 65 if templ_7745c5c3_Err != nil { 66 66 return templ_7745c5c3_Err 67 67 }
+32 -15
cmd/sponsor-panel/templates/formsuccess.templ
··· 2 2 3 3 // InviteSuccess renders the success response for team invitation. 4 4 templ InviteSuccess(username, state string) { 5 - <div class="bg-green-50 dark:bg-green-900/20 p-4 rounded-lg"> 6 - <p class="text-green-700 dark:text-green-300 font-semibold">Invitation sent!</p> 7 - <p class="text-sm text-gray-600 dark:text-gray-400 mt-1"> 8 - { "@" + username } is { state } 9 - </p> 5 + <div class="alert-success mt-3"> 6 + <div class="flex items-start gap-3"> 7 + <svg class="w-5 h-5 text-green-light dark:text-greenDark-light flex-shrink-0 mt-0.5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> 8 + <path stroke-linecap="round" stroke-linejoin="round" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/> 9 + </svg> 10 + <div> 11 + <p class="text-sm text-green-dark dark:text-greenDark-dark font-semibold">Invitation sent!</p> 12 + <p class="text-sm text-green-light dark:text-greenDark-light mt-1"> 13 + <code class="bg-greenDark-dark/20 dark:bg-greenDark-dark/30 px-1.5 py-0.5 rounded">{ "@" + username }</code> is { state } 14 + </p> 15 + </div> 16 + </div> 10 17 </div> 11 18 } 12 19 13 20 // LogoSuccess renders the success response for logo submission. 14 21 templ LogoSuccess(company, issueURL string, issueNumber int) { 15 - <div class="bg-green-50 dark:bg-green-900/20 p-4 rounded-lg"> 16 - <p class="text-green-700 dark:text-green-300 font-semibold">Logo submitted!</p> 17 - <p class="text-sm text-gray-600 dark:text-gray-400 mt-1"> 18 - Your logo for { company } has been submitted for review. 19 - </p> 20 - <p class="text-sm mt-2"> 21 - <a href={ templ.SafeURL(issueURL) } target="_blank" class="text-blue-600 dark:text-blue-400 hover:underline"> 22 - View issue #{ issueNumber } 23 - </a> 24 - </p> 22 + <div class="alert-success mt-3"> 23 + <div class="flex items-start gap-3"> 24 + <svg class="w-5 h-5 text-green-light dark:text-greenDark-light flex-shrink-0 mt-0.5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> 25 + <path stroke-linecap="round" stroke-linejoin="round" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/> 26 + </svg> 27 + <div> 28 + <p class="text-sm text-green-dark dark:text-greenDark-dark font-semibold">Logo submitted!</p> 29 + <p class="text-sm text-green-light dark:text-greenDark-light mt-1"> 30 + Your logo for <strong>{ company }</strong> has been submitted for review. 31 + </p> 32 + <p class="text-sm mt-2"> 33 + <a href={ templ.SafeURL(issueURL) } target="_blank" class="inline-flex items-center gap-1.5 text-blue-light dark:text-blueDark-light hover:underline"> 34 + <svg class="w-4 h-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> 35 + <path stroke-linecap="round" stroke-linejoin="round" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/> 36 + </svg> 37 + View issue #{ issueNumber } 38 + </a> 39 + </p> 40 + </div> 41 + </div> 25 42 </div> 26 43 }
+11 -11
cmd/sponsor-panel/templates/formsuccess_templ.go
··· 30 30 templ_7745c5c3_Var1 = templ.NopComponent 31 31 } 32 32 ctx = templ.ClearChildren(ctx) 33 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "<div class=\"bg-green-50 dark:bg-green-900/20 p-4 rounded-lg\"><p class=\"text-green-700 dark:text-green-300 font-semibold\">Invitation sent!</p><p class=\"text-sm text-gray-600 dark:text-gray-400 mt-1\">") 33 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "<div class=\"alert-success mt-3\"><div class=\"flex items-start gap-3\"><svg class=\"w-5 h-5 text-green-light dark:text-greenDark-light flex-shrink-0 mt-0.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\"></path></svg><div><p class=\"text-sm text-green-dark dark:text-greenDark-dark font-semibold\">Invitation sent!</p><p class=\"text-sm text-green-light dark:text-greenDark-light mt-1\"><code class=\"bg-greenDark-dark/20 dark:bg-greenDark-dark/30 px-1.5 py-0.5 rounded\">") 34 34 if templ_7745c5c3_Err != nil { 35 35 return templ_7745c5c3_Err 36 36 } 37 37 var templ_7745c5c3_Var2 string 38 38 templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs("@" + username) 39 39 if templ_7745c5c3_Err != nil { 40 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/formsuccess.templ`, Line: 8, Col: 19} 40 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/formsuccess.templ`, Line: 13, Col: 104} 41 41 } 42 42 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2)) 43 43 if templ_7745c5c3_Err != nil { 44 44 return templ_7745c5c3_Err 45 45 } 46 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, " is ") 46 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "</code> is ") 47 47 if templ_7745c5c3_Err != nil { 48 48 return templ_7745c5c3_Err 49 49 } 50 50 var templ_7745c5c3_Var3 string 51 51 templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(state) 52 52 if templ_7745c5c3_Err != nil { 53 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/formsuccess.templ`, Line: 8, Col: 32} 53 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/formsuccess.templ`, Line: 13, Col: 124} 54 54 } 55 55 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) 56 56 if templ_7745c5c3_Err != nil { 57 57 return templ_7745c5c3_Err 58 58 } 59 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "</p></div>") 59 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "</p></div></div></div>") 60 60 if templ_7745c5c3_Err != nil { 61 61 return templ_7745c5c3_Err 62 62 } ··· 86 86 templ_7745c5c3_Var4 = templ.NopComponent 87 87 } 88 88 ctx = templ.ClearChildren(ctx) 89 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "<div class=\"bg-green-50 dark:bg-green-900/20 p-4 rounded-lg\"><p class=\"text-green-700 dark:text-green-300 font-semibold\">Logo submitted!</p><p class=\"text-sm text-gray-600 dark:text-gray-400 mt-1\">Your logo for ") 89 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "<div class=\"alert-success mt-3\"><div class=\"flex items-start gap-3\"><svg class=\"w-5 h-5 text-green-light dark:text-greenDark-light flex-shrink-0 mt-0.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\"></path></svg><div><p class=\"text-sm text-green-dark dark:text-greenDark-dark font-semibold\">Logo submitted!</p><p class=\"text-sm text-green-light dark:text-greenDark-light mt-1\">Your logo for <strong>") 90 90 if templ_7745c5c3_Err != nil { 91 91 return templ_7745c5c3_Err 92 92 } 93 93 var templ_7745c5c3_Var5 string 94 94 templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(company) 95 95 if templ_7745c5c3_Err != nil { 96 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/formsuccess.templ`, Line: 18, Col: 26} 96 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/formsuccess.templ`, Line: 30, Col: 36} 97 97 } 98 98 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5)) 99 99 if templ_7745c5c3_Err != nil { 100 100 return templ_7745c5c3_Err 101 101 } 102 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, " has been submitted for review.</p><p class=\"text-sm mt-2\"><a href=\"") 102 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "</strong> has been submitted for review.</p><p class=\"text-sm mt-2\"><a href=\"") 103 103 if templ_7745c5c3_Err != nil { 104 104 return templ_7745c5c3_Err 105 105 } ··· 108 108 if templ_7745c5c3_Err != nil { 109 109 return templ_7745c5c3_Err 110 110 } 111 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "\" target=\"_blank\" class=\"text-blue-600 dark:text-blue-400 hover:underline\">View issue #") 111 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "\" target=\"_blank\" class=\"inline-flex items-center gap-1.5 text-blue-light dark:text-blueDark-light hover:underline\"><svg class=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\"></path></svg> View issue #") 112 112 if templ_7745c5c3_Err != nil { 113 113 return templ_7745c5c3_Err 114 114 } 115 115 var templ_7745c5c3_Var7 string 116 116 templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(issueNumber) 117 117 if templ_7745c5c3_Err != nil { 118 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/formsuccess.templ`, Line: 22, Col: 29} 118 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/formsuccess.templ`, Line: 37, Col: 31} 119 119 } 120 120 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7)) 121 121 if templ_7745c5c3_Err != nil { 122 122 return templ_7745c5c3_Err 123 123 } 124 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "</a></p></div>") 124 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "</a></p></div></div></div>") 125 125 if templ_7745c5c3_Err != nil { 126 126 return templ_7745c5c3_Err 127 127 }
+47 -19
cmd/sponsor-panel/templates/login.templ
··· 1 1 package templates 2 2 3 3 templ Login() { 4 - <div class="min-h-screen flex items-center justify-center px-4"> 5 - <div class="max-w-md w-full bg-white dark:bg-slate-800/80 backdrop-blur-sm rounded-xl p-8 shadow-lg border border-gray-200 dark:border-slate-700"> 6 - <h1 class="text-2xl font-bold text-gray-900 dark:text-gray-100 mb-2">Sponsor Panel</h1> 7 - <p class="text-gray-600 dark:text-gray-300 mb-6">Manage your sponsorship benefits</p> 8 - <a href="/login" class="block w-full bg-gray-900 dark:bg-orange-600 hover:bg-gray-800 dark:hover:bg-orange-700 text-white text-center py-3 rounded-lg mb-6 transition-colors"> 9 - Login with GitHub 10 - </a> 11 - <div class="border-t border-gray-200 dark:border-slate-700 pt-4"> 12 - <h3 class="font-semibold text-gray-900 dark:text-gray-100 mb-2">Benefits:</h3> 13 - <ul class="text-sm text-gray-600 dark:text-gray-300 space-y-1"> 14 - <li>✓ All sponsors: Discord access</li> 15 - <li>✓ $50+/month: Team invitations</li> 16 - <li>✓ All sponsors: Logo submission</li> 17 - </ul> 4 + <div class="min-h-screen flex items-center justify-center px-8 py-20 md:px-12 md:py-28"> 5 + <div class="max-w-md w-full"> 6 + <div class="card p-4"> 7 + <div class="text-center mb-8"> 8 + <h1 class="hero-title mb-3">Sponsor Panel</h1> 9 + <p class="text-fg-3 dark:text-fgDark-3">Manage your sponsorship benefits</p> 10 + </div> 11 + <a href="/login" class="btn btn-dark w-full mb-8 p-2"> 12 + <svg class="w-5 h-5 mr-2" viewBox="0 0 24 24" fill="currentColor"> 13 + <path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"></path> 14 + </svg> 15 + Login with GitHub 16 + </a> 17 + <div class="border-t border-bg-3 dark:border-bgDark-3 pt-6"> 18 + <h3 class="font-semibold text-fg-1 dark:text-fgDark-1 mb-3 flex items-center gap-2"> 19 + <svg class="w-4 h-4 text-orange-light dark:text-orangeDark-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> 20 + <path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7"></path> 21 + </svg> 22 + Sponsor Benefits 23 + </h3> 24 + <ul class="text-sm text-fg-3 dark:text-fgDark-3 space-y-2"> 25 + <li class="flex items-start gap-2"> 26 + <span class="text-orange-light dark:text-orangeDark-light mt-0.5">•</span> 27 + <span><strong class="text-fg-1 dark:text-fgDark-1">All sponsors:</strong> Discord community access</span> 28 + </li> 29 + <li class="flex items-start gap-2"> 30 + <span class="text-blue-light dark:text-blueDark-light mt-0.5">•</span> 31 + <span><strong class="text-fg-1 dark:text-fgDark-1">$50+/month:</strong> Team invitations</span> 32 + </li> 33 + <li class="flex items-start gap-2"> 34 + <span class="text-purple-light dark:text-purpleDark-light mt-0.5">•</span> 35 + <span><strong class="text-fg-1 dark:text-fgDark-1">All sponsors:</strong> Logo submission for README</span> 36 + </li> 37 + </ul> 38 + </div> 18 39 </div> 19 - <div class="mt-4 bg-red-300 dark:bg-red-800/80 rounded-xl p-6 shadow-sm border border-gray-200 dark:border-slate-700"> 20 - <h2 class="font-semibold text-gray-900 dark:text-gray-100 mb-2">Important note</h2> 21 - <p class="text-sm text-gray-600 dark:text-gray-300 mb-4"> 22 - If you are sponsoring via an organization, please make sure to grant the app access to that organization. 23 - </p> 40 + <div class="card card-warm mt-4 p-4"> 41 + <div class="flex items-start gap-3"> 42 + <svg class="w-5 h-5 text-orange-light dark:text-orangeDark-light flex-shrink-0 mt-0.5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> 43 + <path stroke-linecap="round" stroke-linejoin="round" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path> 44 + </svg> 45 + <div> 46 + <h3 class="font-semibold text-fg-1 dark:text-fgDark-1 mb-1">Organization Sponsors</h3> 47 + <p class="text-sm text-fg-3 dark:text-fgDark-3 leading-relaxed"> 48 + If you're sponsoring via an organization, make sure to grant the app access to that organization in your GitHub settings. 49 + </p> 50 + </div> 51 + </div> 24 52 </div> 25 53 </div> 26 54 </div>
+1 -1
cmd/sponsor-panel/templates/login_templ.go
··· 29 29 templ_7745c5c3_Var1 = templ.NopComponent 30 30 } 31 31 ctx = templ.ClearChildren(ctx) 32 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "<div class=\"min-h-screen flex items-center justify-center px-4\"><div class=\"max-w-md w-full bg-white dark:bg-slate-800/80 backdrop-blur-sm rounded-xl p-8 shadow-lg border border-gray-200 dark:border-slate-700\"><h1 class=\"text-2xl font-bold text-gray-900 dark:text-gray-100 mb-2\">Sponsor Panel</h1><p class=\"text-gray-600 dark:text-gray-300 mb-6\">Manage your sponsorship benefits</p><a href=\"/login\" class=\"block w-full bg-gray-900 dark:bg-orange-600 hover:bg-gray-800 dark:hover:bg-orange-700 text-white text-center py-3 rounded-lg mb-6 transition-colors\">Login with GitHub</a><div class=\"border-t border-gray-200 dark:border-slate-700 pt-4\"><h3 class=\"font-semibold text-gray-900 dark:text-gray-100 mb-2\">Benefits:</h3><ul class=\"text-sm text-gray-600 dark:text-gray-300 space-y-1\"><li>✓ All sponsors: Discord access</li><li>✓ $50+/month: Team invitations</li><li>✓ All sponsors: Logo submission</li></ul></div><div class=\"mt-4 bg-red-300 dark:bg-red-800/80 rounded-xl p-6 shadow-sm border border-gray-200 dark:border-slate-700\"><h2 class=\"font-semibold text-gray-900 dark:text-gray-100 mb-2\">Important note</h2><p class=\"text-sm text-gray-600 dark:text-gray-300 mb-4\">If you are sponsoring via an organization, please make sure to grant the app access to that organization.</p></div></div></div>") 32 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "<div class=\"min-h-screen flex items-center justify-center px-8 py-20 md:px-12 md:py-28\"><div class=\"max-w-md w-full\"><div class=\"card p-4\"><div class=\"text-center mb-8\"><h1 class=\"hero-title mb-3\">Sponsor Panel</h1><p class=\"text-fg-3 dark:text-fgDark-3\">Manage your sponsorship benefits</p></div><a href=\"/login\" class=\"btn btn-dark w-full mb-8 p-2\"><svg class=\"w-5 h-5 mr-2\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\"></path></svg> Login with GitHub</a><div class=\"border-t border-bg-3 dark:border-bgDark-3 pt-6\"><h3 class=\"font-semibold text-fg-1 dark:text-fgDark-1 mb-3 flex items-center gap-2\"><svg class=\"w-4 h-4 text-orange-light dark:text-orangeDark-light\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M5 13l4 4L19 7\"></path></svg> Sponsor Benefits</h3><ul class=\"text-sm text-fg-3 dark:text-fgDark-3 space-y-2\"><li class=\"flex items-start gap-2\"><span class=\"text-orange-light dark:text-orangeDark-light mt-0.5\">•</span> <span><strong class=\"text-fg-1 dark:text-fgDark-1\">All sponsors:</strong> Discord community access</span></li><li class=\"flex items-start gap-2\"><span class=\"text-blue-light dark:text-blueDark-light mt-0.5\">•</span> <span><strong class=\"text-fg-1 dark:text-fgDark-1\">$50+/month:</strong> Team invitations</span></li><li class=\"flex items-start gap-2\"><span class=\"text-purple-light dark:text-purpleDark-light mt-0.5\">•</span> <span><strong class=\"text-fg-1 dark:text-fgDark-1\">All sponsors:</strong> Logo submission for README</span></li></ul></div></div><div class=\"card card-warm mt-4 p-4\"><div class=\"flex items-start gap-3\"><svg class=\"w-5 h-5 text-orange-light dark:text-orangeDark-light flex-shrink-0 mt-0.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"></path></svg><div><h3 class=\"font-semibold text-fg-1 dark:text-fgDark-1 mb-1\">Organization Sponsors</h3><p class=\"text-sm text-fg-3 dark:text-fgDark-3 leading-relaxed\">If you're sponsoring via an organization, make sure to grant the app access to that organization in your GitHub settings.</p></div></div></div></div></div>") 33 33 if templ_7745c5c3_Err != nil { 34 34 return templ_7745c5c3_Err 35 35 }
+23 -7
cmd/sponsor-panel/templates/oautherror.templ
··· 1 1 package templates 2 2 3 3 templ OAuthError(message string) { 4 - <div class="min-h-screen flex items-center justify-center px-4"> 5 - <div class="max-w-md w-full bg-red-50 dark:bg-red-950/50 rounded-xl p-8 text-center border border-red-200 dark:border-red-900"> 6 - <h1 class="text-xl font-bold text-red-900 dark:text-red-200 mb-2">Authentication Failed</h1> 7 - <p class="text-red-700 dark:text-red-300 mb-6">{ message }</p> 8 - <a href="/login" class="inline-block bg-red-600 hover:bg-red-700 text-white px-6 py-2 rounded-lg transition-colors"> 9 - Try Again 10 - </a> 4 + <div class="min-h-screen flex items-center justify-center px-8 py-20 md:px-12 md:py-28"> 5 + <div class="max-w-md w-full"> 6 + <div class="card card-warm"> 7 + <div class="flex items-start gap-4"> 8 + <div class="flex-shrink-0"> 9 + <div class="w-12 h-12 rounded-full bg-redDark-dark/20 dark:bg-redDark-dark/30 flex items-center justify-center"> 10 + <svg class="w-6 h-6 text-red-light dark:text-redDark-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> 11 + <path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"/> 12 + </svg> 13 + </div> 14 + </div> 15 + <div> 16 + <h1 class="text-xl font-bold font-serif text-fg-1 dark:text-fgDark-1 mb-2">Authentication Failed</h1> 17 + <p class="text-fg-3 dark:text-fgDark-3 mb-4">{ message }</p> 18 + <a href="/login" class="btn btn-primary"> 19 + <svg class="w-4 h-4 mr-2" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> 20 + <path stroke-linecap="round" stroke-linejoin="round" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"/> 21 + </svg> 22 + Try Again 23 + </a> 24 + </div> 25 + </div> 26 + </div> 11 27 </div> 12 28 </div> 13 29 }
+3 -3
cmd/sponsor-panel/templates/oautherror_templ.go
··· 29 29 templ_7745c5c3_Var1 = templ.NopComponent 30 30 } 31 31 ctx = templ.ClearChildren(ctx) 32 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "<div class=\"min-h-screen flex items-center justify-center px-4\"><div class=\"max-w-md w-full bg-red-50 dark:bg-red-950/50 rounded-xl p-8 text-center border border-red-200 dark:border-red-900\"><h1 class=\"text-xl font-bold text-red-900 dark:text-red-200 mb-2\">Authentication Failed</h1><p class=\"text-red-700 dark:text-red-300 mb-6\">") 32 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "<div class=\"min-h-screen flex items-center justify-center px-8 py-20 md:px-12 md:py-28\"><div class=\"max-w-md w-full\"><div class=\"card card-warm\"><div class=\"flex items-start gap-4\"><div class=\"flex-shrink-0\"><div class=\"w-12 h-12 rounded-full bg-redDark-dark/20 dark:bg-redDark-dark/30 flex items-center justify-center\"><svg class=\"w-6 h-6 text-red-light dark:text-redDark-light\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"></path></svg></div></div><div><h1 class=\"text-xl font-bold font-serif text-fg-1 dark:text-fgDark-1 mb-2\">Authentication Failed</h1><p class=\"text-fg-3 dark:text-fgDark-3 mb-4\">") 33 33 if templ_7745c5c3_Err != nil { 34 34 return templ_7745c5c3_Err 35 35 } 36 36 var templ_7745c5c3_Var2 string 37 37 templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(message) 38 38 if templ_7745c5c3_Err != nil { 39 - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/oautherror.templ`, Line: 7, Col: 59} 39 + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/oautherror.templ`, Line: 17, Col: 60} 40 40 } 41 41 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2)) 42 42 if templ_7745c5c3_Err != nil { 43 43 return templ_7745c5c3_Err 44 44 } 45 - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "</p><a href=\"/login\" class=\"inline-block bg-red-600 hover:bg-red-700 text-white px-6 py-2 rounded-lg transition-colors\">Try Again</a></div></div>") 45 + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "</p><a href=\"/login\" class=\"btn btn-primary\"><svg class=\"w-4 h-4 mr-2\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\"></path></svg> Try Again</a></div></div></div></div></div>") 46 46 if templ_7745c5c3_Err != nil { 47 47 return templ_7745c5c3_Err 48 48 }
+1
package.json
··· 9 9 }, 10 10 "scripts": { 11 11 "test": "go test ./...", 12 + "generate": "go generate ./...", 12 13 "dev": "go run ./cmd/xesite --site-url https://preview.xeiaso.net --devel", 13 14 "dev:sponsor-panel": "cd ./cmd/sponsor-panel && go generate ./... && go run .", 14 15 "deploy": "kubectl --context limsa-lominsa apply -k manifest",