From 0142e8181eac0f4a0844b8a247ae3426c5319911 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Fri, 5 Sep 2025 13:16:35 -0400 Subject: [PATCH 1/5] feat: add qr code page --- package.json | 4 ++- pnpm-lock.yaml | 17 ++++++++++ src/data/links.ts | 8 +++++ src/data/socials.ts | 2 +- src/pages/qr.astro | 75 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 src/pages/qr.astro diff --git a/package.json b/package.json index fb8cde7..3ed6e49 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,9 @@ "konami-emoji-blast": "^0.5.9", "lodash": "^4.17.21", "sharp": "^0.34.1", - "temporal-polyfill": "^0.3.0" + "temporal-polyfill": "^0.3.0", + "uqr": "^0.1.2", + "wifi-share-link": "^0.1.1" }, "devDependencies": { "@eslint-community/eslint-plugin-eslint-comments": "^4.5.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8d70e47..a7809fd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,6 +44,12 @@ importers: temporal-polyfill: specifier: ^0.3.0 version: 0.3.0 + uqr: + specifier: ^0.1.2 + version: 0.1.2 + wifi-share-link: + specifier: ^0.1.1 + version: 0.1.1 devDependencies: '@eslint-community/eslint-plugin-eslint-comments': specifier: ^4.5.0 @@ -3567,6 +3573,9 @@ packages: uploadthing: optional: true + uqr@0.1.2: + resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -3772,6 +3781,10 @@ packages: resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} engines: {node: '>=18'} + wifi-share-link@0.1.1: + resolution: {integrity: sha512-olagxtSm5jvkW1GAaLGtc2h41uzB85FTrL+NJ6DB2dFKsk45eUYVaUaQovk+LN6RnWuNBXlV5WNDKw1EeqgKXA==} + engines: {node: '>=20.19.0'} + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -7840,6 +7853,8 @@ snapshots: ofetch: 1.4.1 ufo: 1.6.1 + uqr@0.1.2: {} + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -8020,6 +8035,8 @@ snapshots: dependencies: string-width: 7.2.0 + wifi-share-link@0.1.1: {} + word-wrap@1.2.5: {} wrap-ansi@7.0.0: diff --git a/src/data/links.ts b/src/data/links.ts index 5ac777c..0e08d38 100644 --- a/src/data/links.ts +++ b/src/data/links.ts @@ -1,4 +1,5 @@ export const links = { + bluesky: "https://bsky.app/profile/squiggleconf.com", bostonTSClub: "https://bostonts.club", cfp: "https://cfp.squiggleconf.com", cfpQuestionsDiscord: @@ -6,10 +7,17 @@ export const links = { cfpQuestionsEmail: "mailto:cfp@squiggleconf.com", discord: "https://discord.squiggleconf.com", donate: "https://www.paypal.com/US/fundraiser/charity/5334863", + feedback: "http://feedback.squiggleconf.com", + github: "https://www.github.com/SquiggleTools/SquiggleConf.com", + instagram: "https://www.instagram.com/squiggleconf", + linkedin: "https://www.linkedin.com/company/squiggleconf", + mastodon: "https://fosstodon.org/@SquiggleConf", michiganTypeScript: "https://youtube.com/@MichiganTypeScript", partner: "https://partner.squiggleconf.com", shop: "https://shop.squiggle.tools", sponsor: "https://sponsor.squiggleconf.com", tickets: "https://buytickets.at/squiggleconf/1488622", volunteer: "https://volunteer.squiggleconf.com", + x: "https://x.com/SquiggleConf", + youtube: "https://www.youtube.com/@SquiggleConf", }; diff --git a/src/data/socials.ts b/src/data/socials.ts index d8ac4b0..5296150 100644 --- a/src/data/socials.ts +++ b/src/data/socials.ts @@ -15,7 +15,7 @@ export const socials = [ src: bluesky, }, { - alt: "Instgram", + alt: "Instagram", href: "https://www.instagram.com/squiggleconf", src: instagram, }, diff --git a/src/pages/qr.astro b/src/pages/qr.astro new file mode 100644 index 0000000..10d1f76 --- /dev/null +++ b/src/pages/qr.astro @@ -0,0 +1,75 @@ +--- +import { renderSVG } from "uqr"; +import { generateWifiShareLink } from "wifi-share-link"; +import BodyList from "~/components/BodyList.astro"; +import CommonContent from "~/components/CommonContent.astro"; +import Heading from "~/components/Heading.astro"; +import { links } from "~/data/links"; +import PageLayout from "~/layouts/PageLayout.astro"; + +const ssid = "NETWORK NAME"; +const password = "NETWORK PASSWORD"; + +const description = "Links for SquiggleConf 2025 attendees"; +const wifiLink = generateWifiShareLink({ + encryption: "WPA", + ssid, + password, +}); +const wifiImage = renderSVG(wifiLink); +--- + + + + Quick Badge Information + +
  • Day 1 Schedule
  • +
  • Day 2 Schedule
  • +
  • Discord
  • +
  • Feedback form
  • +
  • + Social media: + +
  • +
  • + Wifi: +
    {ssid}
    /
    {password}
    + +
    + +
    +
  • +
  • + Places to eat: +
      +
    • and a one
    • +
    • and a two
    • +
    +
  • +
    +
    +
    + + From ea29ae3ed299e01bd78b82e591bb58ae0d278ced Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Wed, 10 Sep 2025 17:36:34 -0400 Subject: [PATCH 2/5] feat: add /qr page --- cspell.json | 1 + src/components/Footer.astro | 14 ++- src/components/Logo.astro | 2 +- src/components/LogoBold.astro | 35 ++++++++ src/components/SocialLink.astro | 36 ++++++-- src/components/Socials.astro | 50 +++++++++-- src/components/TextSquiggly.astro | 8 +- src/pages/qr.astro | 141 +++++++++++++++++++++--------- 8 files changed, 230 insertions(+), 57 deletions(-) create mode 100644 src/components/LogoBold.astro diff --git a/cspell.json b/cspell.json index a216b16..c6bda54 100644 --- a/cspell.json +++ b/cspell.json @@ -34,6 +34,7 @@ "Logomark", "mariah", "MBTA", + "Merch", "mitropoulos", "mulroy", "Murg", diff --git a/src/components/Footer.astro b/src/components/Footer.astro index 3fe9b64..aaeafd3 100644 --- a/src/components/Footer.astro +++ b/src/components/Footer.astro @@ -38,7 +38,7 @@ const yearPairs = )) } - + @@ -82,6 +82,18 @@ const yearPairs = text-decoration: none; } + .footer-socials { + margin-top: 2rem; + max-width: 15rem; + } + + @media (width >= 490px) { + .footer-socials { + margin-top: 0; + max-width: none; + } + } + @media (width >= 819px) { .footer-content-area { flex-direction: row; diff --git a/src/components/Logo.astro b/src/components/Logo.astro index 714404f..2b5c0d7 100644 --- a/src/components/Logo.astro +++ b/src/components/Logo.astro @@ -1,5 +1,4 @@ --- -import { ClassificationTypeNames } from "typescript"; import TextSquiggly from "./TextSquiggly.astro"; interface Props { @@ -38,6 +37,7 @@ const { class: className, invert, year, ...props } = Astro.props; .logo.regular { --colorLogoText: var(--colorWhiteIsh); --colorLogoYear: var(--colorBlue2); + text-shadow: 0px 1.5px 1.5px rgba(0, 0, 0, 0.25); } .year { diff --git a/src/components/LogoBold.astro b/src/components/LogoBold.astro new file mode 100644 index 0000000..c8afa17 --- /dev/null +++ b/src/components/LogoBold.astro @@ -0,0 +1,35 @@ +--- +import TextSquiggly from "./TextSquiggly.astro"; + +interface Props { + class?: string; + year: number; +} + +const { class: className, ...props } = Astro.props; +--- + +
    + + Squiggle + Conf + + {Astro.props.year && {Astro.props.year}} +
    + + diff --git a/src/components/SocialLink.astro b/src/components/SocialLink.astro index 4ba28e8..0a759e7 100644 --- a/src/components/SocialLink.astro +++ b/src/components/SocialLink.astro @@ -2,23 +2,33 @@ import { ImageMetadata } from "astro"; import { Image } from "astro:assets"; +export type SocialLinkSize = "small" | "normal" | "large"; + interface Props { alt: string; class?: string; href: string; inverted?: boolean; + size?: SocialLinkSize; src: ImageMetadata; } -const { alt, class: className, inverted, href, src } = Astro.props; +const { + alt, + class: className, + inverted, + href, + size = "normal", + src, +} = Astro.props; --- - + {alt} diff --git a/src/components/Socials.astro b/src/components/Socials.astro index 2734084..a011ef9 100644 --- a/src/components/Socials.astro +++ b/src/components/Socials.astro @@ -1,27 +1,63 @@ --- import { socials } from "~/data/socials"; -import SocialLink from "./SocialLink.astro"; +import SocialLink, { SocialLinkSize } from "./SocialLink.astro"; + +export type SocialsPadding = "dense" | "normal"; + +interface Props { + class?: string; + inverted?: boolean; + padding?: SocialsPadding; + size?: SocialLinkSize; +} + +const { + class: className, + inverted, + padding = "normal", + size, + ...props +} = Astro.props; --- -
    - {socials.map((social) =>