Monorepo for Tangled
0

Configure Feed

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

web: use lucide icons in footer

Signed-off-by: oppiliappan <me@oppi.li>

oppiliappan (Jul 9, 2026, 1:23 PM +0100) 16b54eae 5ff15074

+33 -152
+1
flake.nix
··· 372 372 pkgs.e2fsprogs 373 373 pkgs.util-linux 374 374 pkgs.pnpm 375 + pkgs.nodejs 375 376 ] 376 377 ++ pkgs.lib.optionals pkgs.stdenv.isLinux [ 377 378 pkgs.parted
+1 -1
web/src/lib/components/home/MarketingHome.svelte
··· 48 48 <section class="overflow-hidden px-6 pb-24 pt-28 md:pb-32 md:pt-36"> 49 49 <div class="mx-auto grid max-w-screen-xl grid-cols-1 items-center gap-14 md:grid-cols-2"> 50 50 <h1 51 - class="text-6xl font-bold leading-[0.98] tracking-[-0.05em] text-fg-strong md:text-7xl lg:text-8xl" 51 + class="text-6xl font-bold text-fg-strong md:text-7xl lg:text-8xl" 52 52 > 53 53 tightly-knit<br />social coding. 54 54 </h1>
+31 -151
web/src/lib/components/shell/Footer.svelte
··· 1 1 <script lang="ts"> 2 2 import { resolve } from '$app/paths'; 3 3 import LogotypeSmall from '../ui/LogotypeSmall.svelte'; 4 + import FileText from '$icon/file-text'; 5 + import Shield from '$icon/shield'; 6 + import BookOpen from '$icon/book-open'; 7 + import Book from '$icon/book'; 8 + import Code from '$icon/code'; 9 + import Paintbrush from '$icon/paintbrush'; 10 + import MessageCircle from '$icon/message-circle'; 11 + import Hash from '$icon/hash'; 12 + import Mail from '$icon/mail'; 13 + import ShieldCheck from '$icon/shield-check'; 4 14 5 15 interface Props { 6 16 variant?: 'full' | 'minimal'; ··· 164 174 165 175 {#snippet footerIcon(icon: FooterIcon)} 166 176 {#if icon === 'terms'} 167 - <svg 168 - class="size-4 shrink-0" 169 - viewBox="0 0 24 24" 170 - fill="none" 171 - stroke="currentColor" 172 - stroke-width="2" 173 - stroke-linecap="round" 174 - stroke-linejoin="round" 175 - > 176 - <path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z" /> 177 - <path d="M14 2v4a2 2 0 0 0 2 2h4" /> 178 - <path d="M10 9H8" /> 179 - <path d="M16 13H8" /> 180 - <path d="M16 17H8" /> 181 - </svg> 177 + <FileText class="size-4 shrink-0" /> 182 178 {:else if icon === 'privacy'} 183 - <svg 184 - class="size-4 shrink-0" 185 - viewBox="0 0 24 24" 186 - fill="none" 187 - stroke="currentColor" 188 - stroke-width="2" 189 - stroke-linecap="round" 190 - stroke-linejoin="round" 191 - > 192 - <path 193 - d="M20 13c0 5-3.5 7.5-7.66 9.7a1 1 0 0 1-.68 0C7.5 20.5 4 18 4 13V6a1 1 0 0 1 .76-.97l8-2a1 1 0 0 1 .48 0l8 2c.47.12.76.54.76.97Z" 194 - /> 195 - </svg> 179 + <Shield class="size-4 shrink-0" /> 196 180 {:else if icon === 'blog'} 197 - <svg 198 - class="size-4 shrink-0" 199 - viewBox="0 0 24 24" 200 - fill="none" 201 - stroke="currentColor" 202 - stroke-width="2" 203 - stroke-linecap="round" 204 - stroke-linejoin="round" 205 - > 206 - <path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z" /> 207 - <path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z" /> 208 - </svg> 181 + <BookOpen class="size-4 shrink-0" /> 209 182 {:else if icon === 'docs'} 210 - <svg 211 - class="size-4 shrink-0" 212 - viewBox="0 0 24 24" 213 - fill="none" 214 - stroke="currentColor" 215 - stroke-width="2" 216 - stroke-linecap="round" 217 - stroke-linejoin="round" 218 - > 219 - <path 220 - d="M4 19.5V15a2 2 0 0 1 2-2h2M20 19.5V5a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2z" 221 - /> 222 - </svg> 183 + <Book class="size-4 shrink-0" /> 223 184 {:else if icon === 'source'} 224 - <svg 225 - class="size-4 shrink-0" 226 - viewBox="0 0 24 24" 227 - fill="none" 228 - stroke="currentColor" 229 - stroke-width="2" 230 - stroke-linecap="round" 231 - stroke-linejoin="round" 232 - > 233 - <polyline points="16 18 22 12 16 6" /> 234 - <polyline points="8 6 2 12 8 18" /> 235 - </svg> 185 + <Code class="size-4 shrink-0" /> 236 186 {:else if icon === 'brand'} 237 - <svg 238 - class="size-4 shrink-0" 239 - viewBox="0 0 24 24" 240 - fill="none" 241 - stroke="currentColor" 242 - stroke-width="2" 243 - stroke-linecap="round" 244 - stroke-linejoin="round" 245 - > 246 - <path d="M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10z" /> 247 - <path 248 - d="M7.5 10.5c.828 0 1.5-.672 1.5-1.5s-.672-1.5-1.5-1.5-1.5.672-1.5 1.5.672 1.5 1.5 1.5z" 249 - /> 250 - <path 251 - d="M11.5 7.5c.828 0 1.5-.672 1.5-1.5S12.328 4.5 11.5 4.5 10 5.172 10 6s.672 1.5 1.5 1.5z" 252 - /> 253 - <path 254 - d="M16.5 9.5c.828 0 1.5-.672 1.5-1.5s-.672-1.5-1.5-1.5-1.5.672-1.5 1.5.672 1.5 1.5 1.5z" 255 - /> 256 - <path d="M6 14c0-2 2-3 4-3 2.5 0 4.5 1.5 4.5 3.5S12.5 18 10 18c-2.5 0-4-2-4-4z" /> 257 - </svg> 187 + <Paintbrush class="size-4 shrink-0" /> 258 188 {:else if icon === 'discord'} 259 - <svg 260 - class="size-4 shrink-0" 261 - viewBox="0 0 24 24" 262 - fill="none" 263 - stroke="currentColor" 264 - stroke-width="2" 265 - stroke-linecap="round" 266 - stroke-linejoin="round" 267 - > 268 - <path d="M7.9 20A9 9 0 1 0 4 16.1L2 22Z" /> 269 - </svg> 189 + <MessageCircle class="size-4 shrink-0" /> 270 190 {:else if icon === 'irc'} 271 - <svg 272 - class="size-4 shrink-0" 273 - viewBox="0 0 24 24" 274 - fill="none" 275 - stroke="currentColor" 276 - stroke-width="2" 277 - stroke-linecap="round" 278 - stroke-linejoin="round" 279 - > 280 - <line x1="4" y1="9" x2="20" y2="9" /> 281 - <line x1="4" y1="15" x2="20" y2="15" /> 282 - <line x1="10" y1="3" x2="8" y2="21" /> 283 - <line x1="16" y1="3" x2="14" y2="21" /> 284 - </svg> 191 + <Hash class="size-4 shrink-0" /> 285 192 {:else if icon === 'bluesky'} 286 - <svg 287 - class="size-4 shrink-0" 288 - viewBox="0 0 24 24" 289 - fill="none" 290 - stroke-dasharray="none" 291 - stroke-width="2" 292 - stroke-linecap="round" 293 - stroke-linejoin="round" 294 - > 295 - <path d="M12 21a9 9 0 0 0 9-9 9 9 0 0 0-9-9 9 9 0 0 0-9 9 9 9 0 0 0 9 9Z" /> 296 - <path d="M12 12c2-3 5-3 5 0s-3 3-5 0Zm0 0c-2-3-5-3-5 0s3 3 5 0Z" /> 193 + <svg class="size-4 shrink-0" viewBox="-3 -3 30 30" fill="none" stroke="currentColor" stroke-width="2.25"> 194 + <path d="M12 10.8c-1.087-2.114-4.046-6.053-6.798-7.995C2.566.944 1.561 1.266.902 1.565.139 1.908 0 3.08 0 3.768c0 .69.378 5.65.624 6.479.815 2.736 3.713 3.66 6.383 3.364.136-.02.275-.039.415-.056-.138.022-.276.04-.415.056-3.912.58-7.387 2.005-2.83 7.078 5.013 5.19 6.87-1.113 7.823-4.308.953 3.195 2.05 9.271 7.733 4.308 4.267-4.308 1.172-6.498-2.74-7.078a8.741 8.741 0 0 1-.415-.056c.14.017.279.036.415.056 2.67.297 5.568-.628 6.383-3.364.246-.828.624-5.79.624-6.478 0-.69-.139-1.861-.902-2.206-.659-.298-1.664-.62-4.3 1.24C16.046 4.748 13.087 8.687 12 10.8Z" /> 297 195 </svg> 298 196 {:else if icon === 'twitter'} 299 197 <svg class="size-4 shrink-0" viewBox="0 0 24 24" fill="currentColor"> ··· 302 200 /> 303 201 </svg> 304 202 {:else if icon === 'email'} 305 - <svg 306 - class="size-4 shrink-0" 307 - viewBox="0 0 24 24" 308 - fill="none" 309 - stroke="currentColor" 310 - stroke-width="2" 311 - stroke-linecap="round" 312 - stroke-linejoin="round" 313 - > 314 - <rect width="20" height="16" x="2" y="4" rx="2" /> 315 - <path d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7" /> 316 - </svg> 203 + <Mail class="size-4 shrink-0" /> 317 204 {:else if icon === 'security'} 318 - <svg 319 - class="size-4 shrink-0" 320 - viewBox="0 0 24 24" 321 - fill="none" 322 - stroke="currentColor" 323 - stroke-width="2" 324 - stroke-linecap="round" 325 - stroke-linejoin="round" 326 - > 327 - <path 328 - d="M20 13c0 5-3.5 7.5-7.66 9.7a1 1 0 0 1-.68 0C7.5 20.5 4 18 4 13V6a1 1 0 0 1 .76-.97l8-2a1 1 0 0 1 .48 0l8 2c.47.12.76.54.76.97Z" 329 - /> 330 - <path d="m9 12 2 2 4-4" /> 331 - </svg> 205 + <ShieldCheck class="size-4 shrink-0" /> 332 206 {/if} 333 207 {/snippet} 334 208 ··· 414 288 </a> 415 289 </div> 416 290 417 - <div class="grid grid-cols-1 gap-6 sm:grid-cols-2 md:grid-cols-4 md:gap-2"> 291 + <div class="grid grid-cols-1 gap-6 sm:grid-cols-1 md:grid-cols-4 md:gap-2"> 418 292 {#each footerSections as section (section.title)} 419 293 <div class="flex flex-col gap-1"> 420 294 <div class={mobileHeaderStyle}>{section.title}</div> 421 295 {#each section.links as link (link.href)} 422 296 {#if link.internal} 423 - <a href={appPath(link.href)} class={linkStyle}>{link.label}</a> 297 + <a href={appPath(link.href)} class={linkStyle}> 298 + {@render footerIcon(link.icon)} 299 + <span>{link.label}</span> 300 + </a> 424 301 {:else} 425 302 <a 426 303 href={link.href} 427 304 class={linkStyle} 428 305 target={linkTarget(link, 'mobile')} 429 - rel="external noopener noreferrer">{link.label}</a 306 + rel="external noopener noreferrer" 430 307 > 308 + {@render footerIcon(link.icon)} 309 + <span>{link.label}</span> 310 + </a> 431 311 {/if} 432 312 {/each} 433 313 </div>