diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index 4f8fa3d..0000000 --- a/.dockerignore +++ /dev/null @@ -1,13 +0,0 @@ -node_modules -.next -out -dist -tmp -npm-debug.log -.npmrc -.env* -public/social/ -.git -.gitignore -Dockerfile -.dockerignore diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml deleted file mode 100644 index 76a110b..0000000 --- a/.github/workflows/docker-publish.yml +++ /dev/null @@ -1,320 +0,0 @@ -name: Build and Publish Container Image - -concurrency: - group: website-build-${{ github.ref }} - cancel-in-progress: true - -on: - push: - branches: ["**"] - pull_request: - workflow_dispatch: - -env: - REGISTRY: ghcr.io - IMAGE_NAME: "www-website" - LINKEDIN_SYNC_IMAGE_NAME: "www-website-linkedin-sync" - -jobs: - build: - runs-on: ubuntu-latest - permissions: - contents: read - - steps: - - name: Configure Git default branch - run: git config --global init.defaultBranch master - - - name: Checkout - uses: actions/checkout@v6 - with: - fetch-depth: 0 - - - name: Check repository size budget - env: - BASE_SHA: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || github.event.before }} - run: bash scripts/check-size-budget.sh - - - name: Compute image name (lowercase owner/repo) - id: img - run: | - OWNER="$(echo "${GITHUB_REPOSITORY_OWNER}" | tr '[:upper:]' '[:lower:]')" - REPO_NAME="${GITHUB_REPOSITORY##*/}" - IMAGE_NAME="${IMAGE_NAME:-$REPO_NAME}" - IMAGE_NAME="$(echo "${IMAGE_NAME}" | tr '[:upper:]' '[:lower:]')" - LINKEDIN_SYNC_IMAGE_NAME="$(echo "${LINKEDIN_SYNC_IMAGE_NAME}" | tr '[:upper:]' '[:lower:]')" - echo "IMAGE=${REGISTRY}/${OWNER}/${IMAGE_NAME}" >> "$GITHUB_ENV" - echo "LINKEDIN_SYNC_IMAGE=${REGISTRY}/${OWNER}/${LINKEDIN_SYNC_IMAGE_NAME}" >> "$GITHUB_ENV" - echo "Image namespace: ${REGISTRY}/${OWNER}/${IMAGE_NAME}" - echo "LinkedIn sync image namespace: ${REGISTRY}/${OWNER}/${LINKEDIN_SYNC_IMAGE_NAME}" - - - name: Compute build info - id: build_info - run: | - { - echo "created=$(date -u +%Y-%m-%dT%H:%M:%SZ)" - echo "source=https://github.com/${GITHUB_REPOSITORY}" - echo "branch=${GITHUB_REF_NAME}" - echo "run_url=https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}" - echo "author<> "$GITHUB_OUTPUT" - - - name: Docker metadata - id: meta - uses: docker/metadata-action@v6 - with: - images: ${{ env.IMAGE }} - tags: | - type=sha - type=ref,event=branch,enable=${{ github.ref == 'refs/heads/master' }} - type=raw,value=latest,enable=${{ github.ref == 'refs/heads/master' }} - - - name: Docker metadata for LinkedIn sync - id: meta_linkedin_sync - uses: docker/metadata-action@v6 - with: - images: ${{ env.LINKEDIN_SYNC_IMAGE }} - tags: | - type=sha - type=ref,event=branch,enable=${{ github.ref == 'refs/heads/master' }} - type=raw,value=latest,enable=${{ github.ref == 'refs/heads/master' }} - - - name: Set up Buildx - uses: docker/setup-buildx-action@v4 - - - name: Build image for tests - uses: docker/build-push-action@v7 - with: - context: . - file: ./Dockerfile - push: false - load: true - tags: | - ${{ env.IMAGE }}:ci - ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - build-args: | - BUILD_DATE=${{ steps.build_info.outputs.created }} - VCS_REF=${{ github.sha }} - VCS_URL=${{ steps.build_info.outputs.source }} - SOURCE_BRANCH=${{ steps.build_info.outputs.branch }} - IMAGE_NAME=${{ env.IMAGE }} - GITHUB_RUN_ID=${{ github.run_id }} - GITHUB_RUN_ATTEMPT=${{ github.run_attempt }} - GITHUB_RUN_URL=${{ steps.build_info.outputs.run_url }} - GITHUB_ACTOR=${{ github.actor }} - COMMIT_AUTHOR=${{ steps.build_info.outputs.author }} - cache-from: type=gha - cache-to: type=gha,mode=max,ignore-error=true - - - name: Build LinkedIn sync image for tests - uses: docker/build-push-action@v7 - with: - context: . - file: ./Dockerfile.linkedin-sync - push: false - load: true - tags: | - ${{ env.LINKEDIN_SYNC_IMAGE }}:ci - ${{ steps.meta_linkedin_sync.outputs.tags }} - labels: ${{ steps.meta_linkedin_sync.outputs.labels }} - cache-from: type=gha - cache-to: type=gha,mode=max,ignore-error=true - - - name: Run smoke test - env: - IMAGE_UNDER_TEST: ${{ env.IMAGE }}:ci - run: | - set -euo pipefail - cid=$(docker run -d -p 0:3000 "$IMAGE_UNDER_TEST") - trap 'docker rm -f "$cid" >/dev/null 2>&1' EXIT - port=$(docker inspect -f '{{ (index (index .NetworkSettings.Ports "3000/tcp") 0).HostPort }}' "$cid") - if [ -z "$port" ]; then - echo "Failed to resolve mapped port for container $cid" >&2 - docker logs "$cid" || true - exit 1 - fi - for i in {1..20}; do - if curl -fsS "http://127.0.0.1:${port}/" > /dev/null; then - break - fi - if [ "$i" -eq 20 ]; then - echo "Service did not respond on / after 20s" >&2 - docker logs "$cid" || true - exit 1 - fi - sleep 1 - done - for path in / /about /services /nabla /presentations /healthz; do - curl -fsS "http://127.0.0.1:${port}${path}" > /dev/null - done - - publish: - needs: build - if: github.event_name == 'push' && github.ref == 'refs/heads/master' - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - - steps: - - name: Configure Git default branch - run: git config --global init.defaultBranch master - - - name: Checkout - uses: actions/checkout@v6 - - - name: Compute image name (lowercase owner/repo) - id: img - run: | - OWNER="$(echo "${GITHUB_REPOSITORY_OWNER}" | tr '[:upper:]' '[:lower:]')" - REPO_NAME="${GITHUB_REPOSITORY##*/}" - IMAGE_NAME="${IMAGE_NAME:-$REPO_NAME}" - IMAGE_NAME="$(echo "${IMAGE_NAME}" | tr '[:upper:]' '[:lower:]')" - LINKEDIN_SYNC_IMAGE_NAME="$(echo "${LINKEDIN_SYNC_IMAGE_NAME}" | tr '[:upper:]' '[:lower:]')" - echo "IMAGE=${REGISTRY}/${OWNER}/${IMAGE_NAME}" >> "$GITHUB_ENV" - echo "LINKEDIN_SYNC_IMAGE=${REGISTRY}/${OWNER}/${LINKEDIN_SYNC_IMAGE_NAME}" >> "$GITHUB_ENV" - echo "Image namespace: ${REGISTRY}/${OWNER}/${IMAGE_NAME}" - echo "LinkedIn sync image namespace: ${REGISTRY}/${OWNER}/${LINKEDIN_SYNC_IMAGE_NAME}" - - - name: Compute build info - id: build_info - run: | - { - echo "created=$(date -u +%Y-%m-%dT%H:%M:%SZ)" - echo "source=https://github.com/${GITHUB_REPOSITORY}" - echo "branch=${GITHUB_REF_NAME}" - echo "run_url=https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}" - echo "author<> "$GITHUB_OUTPUT" - - - name: Docker metadata - id: meta - uses: docker/metadata-action@v6 - with: - images: ${{ env.IMAGE }} - tags: | - type=sha - type=ref,event=branch - type=raw,value=latest - - - name: Docker metadata for LinkedIn sync - id: meta_linkedin_sync - uses: docker/metadata-action@v6 - with: - images: ${{ env.LINKEDIN_SYNC_IMAGE }} - tags: | - type=sha - type=ref,event=branch - type=raw,value=latest - - - name: Set up Buildx - uses: docker/setup-buildx-action@v4 - - - name: Log in to GHCR - env: - GHCR_TOKEN: ${{ secrets.CR_PAT != '' && secrets.CR_PAT || secrets.GITHUB_TOKEN }} - run: | - set -euo pipefail - for attempt in 1 2 3 4 5; do - log_file="$(mktemp)" - if printf '%s\n' "$GHCR_TOKEN" | docker login "$REGISTRY" -u "$GITHUB_ACTOR" --password-stdin >"$log_file" 2>&1; then - rm -f "$log_file" - echo "GHCR login succeeded" - exit 0 - fi - cat "$log_file" >&2 - rm -f "$log_file" - if [ "$attempt" -eq 5 ]; then - exit 1 - fi - sleep $((attempt * 10)) - done - - - name: Build and push - uses: docker/build-push-action@v7 - with: - context: . - file: ./Dockerfile - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - build-args: | - BUILD_DATE=${{ steps.build_info.outputs.created }} - VCS_REF=${{ github.sha }} - VCS_URL=${{ steps.build_info.outputs.source }} - SOURCE_BRANCH=${{ steps.build_info.outputs.branch }} - IMAGE_NAME=${{ env.IMAGE }} - GITHUB_RUN_ID=${{ github.run_id }} - GITHUB_RUN_ATTEMPT=${{ github.run_attempt }} - GITHUB_RUN_URL=${{ steps.build_info.outputs.run_url }} - GITHUB_ACTOR=${{ github.actor }} - COMMIT_AUTHOR=${{ steps.build_info.outputs.author }} - cache-from: type=gha - cache-to: type=gha,mode=max,ignore-error=true - - - name: Build and push LinkedIn sync - uses: docker/build-push-action@v7 - with: - context: . - file: ./Dockerfile.linkedin-sync - push: true - tags: ${{ steps.meta_linkedin_sync.outputs.tags }} - labels: ${{ steps.meta_linkedin_sync.outputs.labels }} - cache-from: type=gha - cache-to: type=gha,mode=max,ignore-error=true - - update-size-badge: - needs: build - if: github.event_name == 'push' && github.ref == 'refs/heads/master' - runs-on: ubuntu-latest - continue-on-error: true - permissions: - contents: write - - steps: - - name: Configure Git default branch - run: git config --global init.defaultBranch master - - - name: Checkout - uses: actions/checkout@v6 - with: - fetch-depth: 0 - - - name: Generate badge data - run: BADGE_PATH=tmp/master-payload-size.json bash scripts/update-size-badge.sh - - - name: Publish badge data - run: | - set -euo pipefail - badge_branch="size-badge-data" - badge_file="tmp/master-payload-size.json" - worktree="$(mktemp -d)" - - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - - if git ls-remote --exit-code --heads origin "$badge_branch" >/dev/null 2>&1; then - git fetch origin "$badge_branch" - git worktree add "$worktree" "origin/$badge_branch" - git -C "$worktree" switch -c "$badge_branch" - else - git worktree add --detach "$worktree" - git -C "$worktree" switch --orphan "$badge_branch" - git -C "$worktree" rm -rf . >/dev/null 2>&1 || true - fi - - cp "$badge_file" "$worktree/master-payload-size.json" - git -C "$worktree" add master-payload-size.json - - if git -C "$worktree" diff --cached --quiet; then - echo "Badge data unchanged" - exit 0 - fi - - git -C "$worktree" commit -m "Update master payload badge" - git -C "$worktree" push origin "HEAD:$badge_branch" diff --git a/.gitignore b/.gitignore index 08ffb52..69673c1 100644 --- a/.gitignore +++ b/.gitignore @@ -41,14 +41,4 @@ yarn-error.log* next-env.d.ts # updating user ssh dir -.ssh - -# Transient cleanup -.old_nm_trash* -tmp/ - -# Generated static documents -/public/pricing.pdf - -# Runtime-generated social feed -/public/social/ +.ssh \ No newline at end of file diff --git a/.npmrc b/.npmrc deleted file mode 100644 index 61e34c2..0000000 --- a/.npmrc +++ /dev/null @@ -1,2 +0,0 @@ -auto-install-peers=false -strict-peer-dependencies=false diff --git a/Caddyfile b/Caddyfile deleted file mode 100644 index 3abf266..0000000 --- a/Caddyfile +++ /dev/null @@ -1,10 +0,0 @@ -:3000 { - respond /healthz 200 - redir /blog /blog/ 308 - handle /blog* { - reverse_proxy blog:3000 - } - handle { - reverse_proxy site:3000 - } -} diff --git a/Caddyfile.site b/Caddyfile.site deleted file mode 100644 index 3d8c62d..0000000 --- a/Caddyfile.site +++ /dev/null @@ -1,17 +0,0 @@ -:3000 { - root * /srv - encode zstd gzip - respond /healthz 200 - header /build-info.json Cache-Control "no-store" - header /social/linkedin-posts.json Cache-Control "no-store" - header /_next/static/* Cache-Control "public, max-age=31536000, immutable" - header /optimized/* Cache-Control "public, max-age=604800" - header /partners/* Cache-Control "public, max-age=604800" - header /testimonials/* Cache-Control "public, max-age=604800" - header /devsh_transparent_1920.png Cache-Control "public, max-age=604800" - header /logo.png Cache-Control "public, max-age=604800" - header /nabla-glow.svg Cache-Control "public, max-age=604800" - header /list/* Cache-Control "public, max-age=604800" - try_files {path} {path}.html {path}/index.html - file_server -} diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index f9d5d58..0000000 --- a/Dockerfile +++ /dev/null @@ -1,68 +0,0 @@ -# syntax=docker/dockerfile:1 - -FROM node:22-alpine AS build -WORKDIR /app - -ENV NEXT_TELEMETRY_DISABLED=1 - -RUN apk add --no-cache libc6-compat - -COPY package.json package-lock.json ./ -RUN npm ci - -COPY . . -RUN npm run build - -FROM caddy:2.9-alpine AS runner -WORKDIR /srv - -ARG BUILD_DATE="unknown" -ARG VCS_REF="unknown" -ARG VCS_URL="https://github.com/Devsh-Graphics-Programming/MainWebsite" -ARG SOURCE_BRANCH="unknown" -ARG IMAGE_NAME="www-website" -ARG GITHUB_RUN_ID="unknown" -ARG GITHUB_RUN_ATTEMPT="unknown" -ARG GITHUB_RUN_URL="unknown" -ARG GITHUB_ACTOR="unknown" -ARG COMMIT_AUTHOR="unknown" - -LABEL org.opencontainers.image.title="DevSH Graphics Programming Website" \ - org.opencontainers.image.description="Static DevSH website served by Caddy" \ - org.opencontainers.image.url="https://www.devsh.eu" \ - org.opencontainers.image.source="${VCS_URL}" \ - org.opencontainers.image.revision="${VCS_REF}" \ - org.opencontainers.image.created="${BUILD_DATE}" \ - org.opencontainers.image.authors="${COMMIT_AUTHOR}" - -RUN addgroup -S caddy && adduser -S caddy -G caddy - -COPY --from=build --chown=caddy:caddy /app/out ./ -COPY --chown=caddy:caddy Caddyfile.site /etc/caddy/Caddyfile - -RUN set -eu; \ - json_escape() { printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g'; }; \ - { \ - printf '{\n'; \ - printf ' "schemaVersion": 1,\n'; \ - printf ' "image": "%s",\n' "$(json_escape "$IMAGE_NAME")"; \ - printf ' "source": "%s",\n' "$(json_escape "$VCS_URL")"; \ - printf ' "revision": "%s",\n' "$(json_escape "$VCS_REF")"; \ - printf ' "branch": "%s",\n' "$(json_escape "$SOURCE_BRANCH")"; \ - printf ' "created": "%s",\n' "$(json_escape "$BUILD_DATE")"; \ - printf ' "commitAuthor": "%s",\n' "$(json_escape "$COMMIT_AUTHOR")"; \ - printf ' "builder": {\n'; \ - printf ' "actor": "%s",\n' "$(json_escape "$GITHUB_ACTOR")"; \ - printf ' "runId": "%s",\n' "$(json_escape "$GITHUB_RUN_ID")"; \ - printf ' "runAttempt": "%s",\n' "$(json_escape "$GITHUB_RUN_ATTEMPT")"; \ - printf ' "runUrl": "%s"\n' "$(json_escape "$GITHUB_RUN_URL")"; \ - printf ' }\n'; \ - printf '}\n'; \ - } > /srv/build-info.json - -EXPOSE 3000 -RUN mkdir -p /config/caddy /data/caddy \ - && chown -R caddy:caddy /config /data \ - && setcap -r /usr/bin/caddy -USER caddy -ENTRYPOINT ["caddy", "run", "--config=/etc/caddy/Caddyfile"] diff --git a/Dockerfile.linkedin-sync b/Dockerfile.linkedin-sync deleted file mode 100644 index b10a287..0000000 --- a/Dockerfile.linkedin-sync +++ /dev/null @@ -1,11 +0,0 @@ -# syntax=docker/dockerfile:1 - -FROM node:22-alpine -WORKDIR /app - -ENV NODE_ENV=production - -COPY scripts/sync-linkedin-feed.mjs ./scripts/sync-linkedin-feed.mjs - -USER node -CMD ["node", "scripts/sync-linkedin-feed.mjs"] diff --git a/README.md b/README.md index ba1667a..e215bc4 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,36 @@ -

- - Build Status - - - Master payload size - - - Join our Discord - -

- -This repo is a Next.js app used to generate a static site. The final production image contains only static assets served by Caddy on a read-only filesystem (no Node/npm runtime in the shipped image). - -## Development (local only) -- Install deps: `npm install` -- Run dev server: `npm run dev` then open http://localhost:3000 -> ⚠️ These steps are purely for local development; the production image ships only static assets and never contains a Node/npm runtime. - -## Build (production image) -- `docker build -t www-website .` -- Runtime is static files only; mount/serve with RO filesystem (e.g., `docker run --read-only --tmpfs /tmp --tmpfs /config --tmpfs /data -p 3000:3000 www-website`). -> ⚠️ The final container maps only the generated `out` directory and static assets; keep it read-only and do not run any Node/npm scripts there. - -## Repository size budget -- CI fails if the tracked tree exceeds `10 MiB`, `public/` exceeds `8 MiB`, any tracked blob exceeds `1 MiB`, or HEAD Git blob payloads exceed `15 MiB`. -- Run `scripts/check-size-budget.sh` locally before adding new media. The README badge is informational and is updated outside the size gate. - -## Runtime filesystem layout -- The image is read-only, but Caddy still needs tiny writable slots for TLS cache/autosave/lock files. -- Align tmpfs mounts with `docker-compose.yml`: `/tmp:size=32m`, `/config:size=16m`, `/data:size=16m`. -- These small tmpfs allocations keep RAM usage predictable while allowing the static server to update its metadata safely. - -## Deployment notes -- Published image: `ghcr.io/devsh-graphics-programming/www-website` (tags: `latest`, `master`, `sha-*`). -- Blog content is proxied separately; the main image does not include Node/npm or blog runtime. -- Security -- Enable GitHub's push protection/secret scanning (see https://docs.github.com/en/code-security/secret-scanning/introduction/about-push-protection) so that any accidental secret leaks are flagged before a push finishes. +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. diff --git a/app/about/page.tsx b/app/about/page.tsx index c390fa3..9592628 100644 --- a/app/about/page.tsx +++ b/app/about/page.tsx @@ -1,42 +1,38 @@ -import { aboutParagraphs } from "../data/aboutContent"; -import NablaShaderBackdrop from "../nabla/NablaShaderBackdrop"; - -const heroStatement = "We are not a traditional software house"; -const extractedSentence = `${heroStatement}.`; -const bodyParagraphs = aboutParagraphs.map((paragraph) => - paragraph.replace(` ${extractedSentence}`, "") -); +import Link from "next/link" +import { Paragraph, Chapter } from "../components/TextUtils" +import ContactEmail from "./ContactEmail" export default function Page() { - return ( -
-
-
+ return ( +
+ + + DevSH Graphics Programming (DevSH) sp. z o.o. ( devsh.eu ) is a company specializing in High + Performance Computing with a particular focus on Computer Graphics and GPU Programming. + Currently boasting a team of 10 Consultants and 3 separate concurrent projects. + We offer consulting and co-development to Third Parties with their own products, as well as con- + duct our own Research and Development, developing Open-Source Middleware and Libraries. + + + + The primary mission for all of our self-funded developments is to advance open source ecosys- + tems with innovative tooling, with a particular focus on Vulkan and SPIR-V. + We maintain a single source HLSL202x/C++20 Standard Template Header Only Library and our + Utility and Rapid Prototyping Framework Nabla designed {/*this prevents visual bug, "designed must stay here"*/} + to give a CUDA-like programming experience in the Vulkan ecosystem. + -
-
- {bodyParagraphs.map((paragraph, index) => ( -

- {paragraph} -

- ))} -
-
-
- ); -} + + We've honed the culture of remote work, since the company's inception before 2019. Subject to + availability of consultants and specific expertise required their regular working hours overlap the + normal working hours from San Francisco to Sydney. + + + + + If you're interested in our offer, you can reach us at this e-mail address: + + +
+ ) +} \ No newline at end of file diff --git a/app/apple-icon.png b/app/apple-icon.png deleted file mode 100644 index ea964fb..0000000 Binary files a/app/apple-icon.png and /dev/null differ diff --git a/app/components/AboutSection.tsx b/app/components/AboutSection.tsx deleted file mode 100644 index ff3d052..0000000 --- a/app/components/AboutSection.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import CTAButton from "./CTAButton"; - -export default function AboutSection() { - return ( -
-
-
-

Who We Are

-
- -
-
-
-
- ); -} diff --git a/app/components/CTAButton.tsx b/app/components/CTAButton.tsx deleted file mode 100644 index afe0f60..0000000 --- a/app/components/CTAButton.tsx +++ /dev/null @@ -1,40 +0,0 @@ -type Size = "md" | "lg"; - -export default function CTAButton({ - href = "#", - label = "Talk to our experts", - size = "lg", -}: { - href?: string; - label?: string; - size?: Size; -}) { - const sizing = - size === "lg" - ? "w-full max-w-64 sm:w-auto sm:min-w-56 px-4 py-2.5 text-sm sm:px-5 sm:text-base" - : "px-4 py-2.5 text-sm sm:px-5 sm:text-base"; - - return ( - - {label} - - - - - ); -} diff --git a/app/components/CommunitySupportSection.tsx b/app/components/CommunitySupportSection.tsx deleted file mode 100644 index 756b0ce..0000000 --- a/app/components/CommunitySupportSection.tsx +++ /dev/null @@ -1,117 +0,0 @@ -import CTAButton from "./CTAButton"; - -type Event = { - name: string; - fullName: string; - location: string; - status: string; - href: string; - image: string; - imageClassName: string; - description: string; -}; - -const events: Event[] = [ - { - name: "GPC 2026", - fullName: "Graphics Programming Conference", - location: "Breda, Netherlands", - status: "Sponsor", - href: "https://graphicsprogrammingconference.com/", - image: "https://graphicsprogrammingconference.com/images/gpc-og.jpg", - imageClassName: "community-event-visual-image--gpc", - description: - "Supporting one of the most focused gatherings for real-time and interactive graphics programming.", - }, - { - name: "SGP 2026", - fullName: "Eurographics Symposium on Geometry Processing", - location: "Bern, Switzerland", - status: "Software Award Sponsor", - href: "https://sgp26.org/", - image: "https://sgp26.org/images/banner.jpg", - imageClassName: "community-event-visual-image--sgp", - description: - "Supporting research and engineering around geometry processing, modeling, and computational design.", - }, -]; - -function ExternalArrow() { - return ( - - ); -} - -function EventPanel({ event }: { event: Event }) { - return ( - -