Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
140 commits
Select commit Hold shift + click to select a range
453bc9c
Switch to raw layout for Events and Meetups page
hasparus Nov 3, 2025
ddda507
Merge remote-tracking branch 'upstream/source' into new-events-and-me…
hasparus Nov 6, 2025
abab590
wip
hasparus Nov 6, 2025
27196ac
Fix the navbar in 404 page
hasparus Nov 6, 2025
5dff180
Move events page to `app` directory
hasparus Nov 6, 2025
aed8b2b
Draft Benefits section
hasparus Nov 6, 2025
e0305d5
Move sections to separate files
hasparus Nov 7, 2025
5ed798b
Update Discord channel reference to #locals
hasparus Nov 7, 2025
4906555
Add Get Your Meetup Noticed section
hasparus Nov 7, 2025
f2b01a1
Initialize Leaflet once to avoid noisy errors
hasparus Nov 7, 2025
dde6d38
Update to colors based the new design version
hasparus Nov 7, 2025
17a029d
Extract EventsList, write todos
hasparus Nov 7, 2025
f2590ab
Try Maptiler
hasparus Nov 7, 2025
acd760f
wip
hasparus Nov 7, 2025
2693ab7
Show both events and meetups in the same lists
hasparus Nov 9, 2025
79ee563
Remove a scrollview from the MeetupsMap
hasparus Nov 9, 2025
6d6c2c3
Rename the component
hasparus Nov 9, 2025
fc47e24
Add Bring GraphQL to Your Community
hasparus Nov 9, 2025
10a1bf1
Add event filter tags
hasparus Nov 9, 2025
4b40b4f
Add a mask
hasparus Nov 9, 2025
39759a5
Filter events
hasparus Nov 9, 2025
8dd424e
Fix colors and spacing
hasparus Nov 9, 2025
246ca76
wip
hasparus Nov 9, 2025
00ca919
fix colors
hasparus Nov 9, 2025
965fb48
wip
hasparus Nov 9, 2025
622140d
Fix vertical panning
hasparus Nov 9, 2025
509b308
wip
hasparus Nov 10, 2025
3f04fae
Stop relying on Nextra's MenuProvider
hasparus Nov 10, 2025
f78832d
Fix an unrelated typo
hasparus Nov 10, 2025
c6984f9
Run format
hasparus Nov 10, 2025
a05a3f8
Add comments
hasparus Nov 10, 2025
4254d36
Use different colors in dark mode.
hasparus Nov 10, 2025
819197b
add comments
hasparus Nov 10, 2025
fca9b16
Preserve consistent aspect ratio
hasparus Nov 10, 2025
1261786
Clean up options
hasparus Nov 10, 2025
281e7c7
wip
hasparus Nov 10, 2025
37ea6ee
Limit panning
hasparus Nov 10, 2025
1e5cb14
Make the pinch zoom stronger
hasparus Nov 10, 2025
15a5473
Move the styles inline to the file
hasparus Nov 10, 2025
07f3e35
Remove extra top padding
hasparus Nov 10, 2025
436a5ba
Use correct transition function
hasparus Nov 10, 2025
0caf862
Merge branch 'source' into new-events-and-meetups
hasparus Nov 10, 2025
42e2045
Use the same cursors as google maps
hasparus Nov 10, 2025
c55389c
Style MeetupsList
hasparus Nov 10, 2025
244c062
Improve the map
hasparus Nov 10, 2025
64e0c0b
Merge remote-tracking branch 'origin/meetups-list' into new-events-an…
hasparus Nov 10, 2025
102d27e
Make the meetups list wider
hasparus Nov 11, 2025
9fcbf7a
Use a more detailed land mask
hasparus Nov 11, 2025
62dbc82
Fix the divide rendering in wrong place
hasparus Nov 11, 2025
73a1ecd
Put the markers in correct places
hasparus Nov 11, 2025
86351a9
Move the offsets to the projection
hasparus Nov 11, 2025
9b3799a
Write down a todo
hasparus Nov 11, 2025
05b55f9
Extract MAP_COLORS to a separate file
hasparus Nov 11, 2025
b3bbfae
Extract viewport math
hasparus Nov 11, 2025
920ee2a
Correct the border
hasparus Nov 11, 2025
5900062
Clean up
hasparus Nov 11, 2025
f7f8d7c
Include env.d.ts
hasparus Nov 11, 2025
dbd94f0
Remove redundant ts-expect-error
hasparus Nov 11, 2025
b9f7f1e
Add Float32Array to Vec2Like
hasparus Nov 11, 2025
d6a44d8
Fiddle with screenToUV for the active marker
hasparus Nov 11, 2025
263e429
wip
hasparus Nov 12, 2025
de212ec
Add infotip
hasparus Nov 12, 2025
60e937a
Fix `group` class clash
hasparus Nov 12, 2025
88c103f
Add a skeleton state to meetups map
hasparus Nov 12, 2025
9361a6b
Flip y
hasparus Nov 12, 2025
e95a72a
Merge remote-tracking branch 'origin/map-loading' into new-events-and…
hasparus Nov 12, 2025
ed8da5e
Fix zoom jumps
hasparus Nov 12, 2025
0ccdb2c
Move the InfoTip to a component
hasparus Nov 12, 2025
72473e0
wip
hasparus Nov 12, 2025
596c3e9
Fix meetups list background color
hasparus Nov 12, 2025
1dc4d02
Stop losing cities when we scroll past London
hasparus Nov 12, 2025
8dbb19a
Hardcode sampling quality 4
hasparus Nov 12, 2025
1c0c54e
Remove dev methods changing square and cell size
hasparus Nov 12, 2025
7619e4f
fixup! Hardcode sampling quality 4
hasparus Nov 12, 2025
79bec73
draft halo effect
hasparus Nov 12, 2025
8cf2bf0
wip
hasparus Nov 12, 2025
2a782d1
wip
hasparus Nov 12, 2025
bd4fed7
wip
hasparus Nov 12, 2025
1ae3b7b
Add an end-to-end test for the meetups map
hasparus Nov 12, 2025
72d6592
Simplify the test using getByText
hasparus Nov 12, 2025
c02607b
Eureka
hasparus Nov 12, 2025
7eb94e4
Use sea color for halo
hasparus Nov 12, 2025
4cdc63f
Discard sea squares, fix border
hasparus Nov 12, 2025
1a9dc94
Move the background
hasparus Nov 12, 2025
f7ebec5
Make the halo gentler
hasparus Nov 12, 2025
5169b92
Improve the halo
hasparus Nov 12, 2025
752bc2f
Lower opacity
hasparus Nov 12, 2025
00ca416
Add haloMinOpacity
hasparus Nov 12, 2025
5c29a48
Add a trail
hasparus Nov 12, 2025
5c66420
Add map tooltip
hasparus Nov 12, 2025
21b490a
Tweak styles
hasparus Nov 12, 2025
c811472
Use tooltip role in the test
hasparus Nov 12, 2025
30f6230
Make markers clickable
hasparus Nov 12, 2025
e116a9b
Update cursor
hasparus Nov 12, 2025
f983734
Format
hasparus Nov 12, 2025
3d998e2
Take whole width on mobile
hasparus Nov 13, 2025
2f969c6
Improve mobile layout
hasparus Nov 13, 2025
b500205
Update src/nextra-theme-docs.css
hasparus Nov 13, 2025
d65157e
Move "use client" and dynamically import GalleryStrip (to move motin …
hasparus Nov 13, 2025
ee36721
Format
hasparus Nov 13, 2025
c33cf34
Merge branch 'fix-404-sidebar' into new-events-and-meetups
hasparus Nov 13, 2025
34c6017
Remove redundant dependencies
hasparus Nov 13, 2025
c472e53
Update lockfile
hasparus Nov 13, 2025
ec39664
Merge branch 'source' into new-events-and-meetups
hasparus Nov 14, 2025
548b2f5
Reduce one level of nesting in e2e test
hasparus Nov 14, 2025
4e62367
Use list reporter
hasparus Nov 14, 2025
8a1232e
Remove a TODO file
hasparus Nov 14, 2025
ed84b5c
getByRole first
hasparus Nov 14, 2025
b511a15
Retain screenshots on failure
hasparus Nov 14, 2025
6498a98
Add html reporter back
hasparus Nov 14, 2025
d21a592
Increase timeout and retries to work around a hydration error that ha…
hasparus Nov 14, 2025
2ad0f60
Tweak tests
hasparus Nov 14, 2025
e25fbc5
Add a test to check if we have webgl on CI
hasparus Nov 14, 2025
54cd16b
Add a redundant argument to satisfy Playwright
hasparus Nov 14, 2025
92a9eb7
Change job name to test
hasparus Nov 14, 2025
904f2e5
Add a button to add events to the UI
hasparus Nov 14, 2025
e15367a
Add an issue template
hasparus Nov 14, 2025
1607067
Improve the event submission issue template
hasparus Nov 14, 2025
99d9f6d
Change Playwright run args
hasparus Nov 14, 2025
4025270
Fiddle with tests
hasparus Nov 14, 2025
3a40b7d
Move the issue template to community-wg repo
hasparus Nov 14, 2025
e6c1de0
Fight Playwright
hasparus Nov 14, 2025
48fb8a9
Tinker with Chrome flags
hasparus Nov 14, 2025
7782253
Split e2e and unit tests to separate jobs
hasparus Nov 14, 2025
b70b7f6
Use ANGLE
hasparus Nov 14, 2025
1ecd30e
Get tests to work locally again
hasparus Nov 14, 2025
929393b
Gitignore local .pnpm-store
hasparus Nov 14, 2025
5e1ba8c
Try channel Chromium
hasparus Nov 14, 2025
e0025d0
Actually visit the page before test
hasparus Nov 14, 2025
501479d
Increase the timeout to 45 seconds
hasparus Nov 14, 2025
0554fcf
Go back to old job name
hasparus Nov 14, 2025
8c0cd40
Increase the timeout to 60 seconds
hasparus Nov 14, 2025
49afd64
Wait until Playwright stops scrolling until doing something
hasparus Nov 14, 2025
5147d4d
Remove redundant line from test
hasparus Nov 14, 2025
dc996d2
Try adding flags
hasparus Nov 14, 2025
da08805
Merge pull request #55 from hasparus/add-an-event
hasparus Nov 14, 2025
8001f6d
Once again try to run on CI, this time with test.slow()
hasparus Nov 14, 2025
adf8c7c
Do not use .poll on CI
hasparus Nov 14, 2025
d941a50
Add --enable-gpu flag
hasparus Nov 14, 2025
fac227c
Give up. It seems everything works it just times out on CI
hasparus Nov 14, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 19 additions & 5 deletions .github/workflows/check.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Lint and check formatting
name: lint & test

on: pull_request

Expand Down Expand Up @@ -26,6 +26,23 @@ jobs:
- name: Validate code snippets
run: pnpm validate:snippets

unit-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: the-guild-org/shared-config/setup@main
name: setup env
with:
packageManager: pnpm
workingDirectory: ./

- name: Install Dependencies
run: pnpm i

- name: Run unit tests
run: pnpm test:unit

playwright:
runs-on: ubuntu-latest
steps:
Expand All @@ -46,12 +63,9 @@ jobs:
- name: Install Playwright Browsers
run: ./node_modules/.bin/playwright install --with-deps

- name: Run Playwright tests
- name: Run end-to-end tests
run: ./node_modules/.bin/playwright test

- name: Run unit tests
run: pnpm test:unit

- uses: actions/upload-artifact@v4
if: ${{ !cancelled() }}
with:
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -65,3 +65,5 @@ out/
tsconfig.tsbuildinfo

playwright-report/

.pnpm-store/
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
"@hasparus/lezer-json-shikified": "1.1.3",
"@headlessui/react": "^2.2.4",
"@igorkowalczyk/is-browser": "^5.1.0",
"@lezer/highlight": "1.2.1",
"@lezer/highlight": "^1.2.1",
"@next/bundle-analyzer": "^15.4.5",
"@plaiceholder/next": "^3.0.0",
"@sparticuz/chromium": "^138.0.2",
Expand Down
25 changes: 21 additions & 4 deletions playwright.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,35 @@ export default defineConfig({
outputDir: "./test/out",
fullyParallel: true,
forbidOnly: !!process.env.CI,
retries: process.env.CI ? 2 : 0,
retries: process.env.CI ? 2 : 1,
workers: process.env.CI ? 1 : undefined,
reporter: "html",
reporter: process.env.CI ? [["github"], ["html"]] : "list",
use: {
baseURL: "http://localhost:3000",
trace: "on-first-retry",
trace: "retain-on-first-failure",
screenshot: "only-on-failure",
},

timeout: 60 * 1000,

projects: [
{
name: "chromium",
use: { ...devices["Desktop Chrome"] },
use: {
...devices["Desktop Chrome"],
channel: "chromium",
...(process.env.CI
? {
args: [
"--enable-gpu",
"--use-gl=angle",
"--use-angle=gl-egl",
"--ignore-gpu-blocklist",
"--enable-unsafe-swiftshader",
],
}
: {}),
},
},
],

Expand Down
1 change: 0 additions & 1 deletion src/app/(development)/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import React from "react"
import { notFound } from "next/navigation"
import { NewFontsStyleTag } from "../fonts"

// @ts-expect-error: we want to import the same version as Nextra for the main page
import { ThemeProvider } from "next-themes"

import "../colors.css"
Expand Down
21 changes: 21 additions & 0 deletions src/app/(main)/community/events/benefit-card.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { ReactNode } from "react"

export function BenefitCard({
title,
description,
icon,
}: {
title: string
description: string
icon: ReactNode
}) {
return (
<article className="flex h-full flex-col gap-6 border border-neu-200 bg-neu-0 p-6 text-left dark:border-neu-100">
{icon}
<div className="flex flex-col gap-3 text-neu-900">
<h3 className="text-[20px] font-normal leading-tight">{title}</h3>
<p className="typography-body-md text-neu-800">{description}</p>
</div>
</article>
)
}
45 changes: 45 additions & 0 deletions src/app/(main)/community/events/benefits-section.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import UsersIcon from "@/app/conf/_design-system/pixelarticons/users.svg?svgr"
import CommentIcon from "@/app/conf/_design-system/pixelarticons/comment.svg?svgr"
import SlidersIcon from "@/app/conf/_design-system/pixelarticons/sliders.svg?svgr"
import EyeIcon from "@/app/conf/_design-system/pixelarticons/eye.svg?svgr"

import { BenefitCard } from "./benefit-card"

export function BenefitsSection() {
return (
<section className="gql-section">
<div className="mx-auto max-w-3xl text-center">
<h2 className="typography-h2 text-balance">
Benefits of getting involved
</h2>
<p className="typography-body-lg mt-4 text-balance text-neu-800 lg:mt-6">
Contributing to GraphQL means more than writing code — it’s a chance
to collaborate, share ideas, and shape the future of the ecosystem.
</p>
</div>

<div className="mt-10 grid gap-4 md:grid-cols-2 lg:mt-16 xl:grid-cols-4">
<BenefitCard
icon={<UsersIcon aria-hidden className="size-10 text-sec-darker" />}
title="Valuable networking opportunities"
description="Engage in conversations and hands-on projects to deepen your understanding of GraphQL."
/>
<BenefitCard
icon={<CommentIcon aria-hidden className="size-10 text-sec-darker" />}
title="Collaborate with others"
description="Connect with contributors and teams building GraphQL tools and platforms."
/>
<BenefitCard
icon={<SlidersIcon aria-hidden className="size-10 text-sec-darker" />}
title="Help guide the spec"
description="Share ideas, give feedback, or participate in working groups to influence the future of GraphQL."
/>
<BenefitCard
icon={<EyeIcon aria-hidden className="size-10 text-sec-darker" />}
title="Connect in real life"
description="Put a face to the handle — meet contributors in person at events and meetups. Build lasting connections beyond the screen."
/>
</div>
</section>
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import { Button } from "../../../conf/_design-system/button"
import { StripesDecoration } from "../../../conf/_design-system/stripes-decoration"
import { DISCORD_CHANNEL_LINK } from "./links"

export function BringGraphQLToYourCommunity() {
return (
<section className="gql-section gql-container">
<div className="relative flex gap-8 border border-sec-dark bg-sec-lighter px-6 py-10 dark:border-sec-base/40 dark:bg-sec-darker/20 max-lg:flex-col sm:px-10 md:gap-12 lg:flex-row lg:items-center lg:gap-16 lg:px-16 xl:gap-24">
<Stripes />
<div>
<h2 className="typography-h2">Bring GraphQL to your community</h2>
<p className="typography-body-lg mt-6">
Learn how to start a local initiative and create your own – host
events, share knowledge, and grow the GraphQL community where you
live.
</p>
</div>
<div className="mt-auto flex shrink-0 flex-col gap-2 lg:w-[324px]">
<Button
href={
"#"
// TODO: Where does this link? Docs?
}
variant="primary"
>
Learn more
</Button>
<Button
href={DISCORD_CHANNEL_LINK}
variant="tertiary"
className="[.light_&]:bg-white"
>
Start GraphQL Local
</Button>
</div>
</div>
</section>
)
}

function Stripes() {
const mask = "linear-gradient(20deg, transparent 80%, rgb(0 0 0 / 0.6))"
return (
<div
className="absolute inset-0"
role="presentation"
style={{
maskImage: mask,
WebkitMaskImage: mask,
}}
>
<StripesDecoration oddClassName="bg-gradient-to-b from-sec-dark to-sec-base/10" />
</div>
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ import { clsx } from "clsx"

import { CalendarIcon } from "@/app/conf/_design-system/pixelarticons/calendar-icon"
import { PinIcon } from "@/app/conf/_design-system/pixelarticons/pin-icon"
import { Tag } from "../../app/conf/_design-system/tag"
import { Tag } from "@/app/conf/_design-system/tag"
import { eventTagColors } from "./event-filter-tag"

const dateFormatter = new Intl.DateTimeFormat("en", {
day: "numeric",
Expand Down Expand Up @@ -55,6 +56,7 @@ export interface EventCardProps {
name: ReactNode
meta?: ReactNode
official?: boolean
kind: "meetup" | "conference" | "working-group"
}

export function EventCard({
Expand All @@ -64,43 +66,43 @@ export function EventCard({
name,
meta,
official,
kind,
}: EventCardProps) {
const dateLabel = formatDateLabel(date)
const parsedDate = normaliseDate(date)

return (
<a
href={href}
className={clsx(
"gql-focus-visible group flex min-w-[260px] flex-col overflow-hidden border border-neu-200 bg-neu-0 text-left text-current no-underline ring-neu-400 hover:bg-sec-base/[.035] hover:ring-1 hover:ring-offset-1 hover:ring-offset-neu-0 dark:border-neu-100 dark:ring-neu-100 xs:min-w-[352px]",
"gql-focus-visible group flex min-h-[214px] min-w-[260px] flex-col overflow-hidden border border-neu-200 text-left text-current no-underline ring-neu-400 hover:ring-1 hover:ring-offset-1 hover:ring-offset-neu-0 dark:border-neu-50 dark:ring-neu-100 xs:min-w-[352px]",
"[--bg-opacity:0.05] hover:[--bg-opacity:0.07] dark:[--bg-opacity:0.03] hover:dark:[--bg-opacity:0.06]",

"z-[4]",
kind === "meetup" &&
"bg-[hsl(var(--color-sec-base)/var(--bg-opacity))]",
kind === "conference" &&
"bg-[hsl(var(--color-pri-base)/var(--bg-opacity))] dark:bg-white/5",
kind === "working-group" &&
"bg-[hsl(229deg_100%_70.4%_/_var(--bg-opacity))]",
)}
target="_blank"
rel="noreferrer"
>
<div className="flex flex-1 flex-col">
<div
className={clsx(
"flex items-center justify-between gap-2 px-2 text-neu-700 dark:text-neu-600 xs:px-4",
"flex h-[45px] items-center justify-between gap-2 px-2 text-neu-800 dark:text-neu-600 xs:px-4",
meta
? "border-b border-neu-200 py-2.5 dark:border-neu-100"
? "border-b border-neu-200 py-2.5 dark:border-neu-50"
: "-mb-2 pt-2 xs:-mb-4 xs:pt-3",
)}
>
<Tag color={eventTagColors[kind]}>{kind}</Tag>
{meta ? (
<span className="typography-body-md font-medium">{meta}</span>
<span className="typography-body-md">{meta}</span>
) : (
<span className="sr-only">Official GraphQL Local</span>
)}
{official ? (
<Tag color="hsl(var(--color-pri-base))" className="*:gap-1">
<span className="font-sans" aria-hidden>
</span>
Official
</Tag>
) : meta ? null : (
<div className="h-[22px]" />
)}
</div>

<div className="typography-h3 flex min-h-[100px] flex-1 flex-col justify-center px-2 py-3 text-neu-900 xs:min-h-[124px] xs:px-4 xs:py-6">
Expand All @@ -109,15 +111,15 @@ export function EventCard({

<div
className={clsx(
"flex flex-wrap border-t border-neu-200 text-neu-700 dark:border-neu-100",
"flex flex-wrap border-t border-neu-200 text-neu-800 dark:border-neu-50",
dateLabel && city
? "grid grid-cols-2 divide-x divide-neu-200 dark:divide-neu-100"
? "grid grid-cols-2 divide-x divide-neu-200 dark:divide-neu-50"
: "",
)}
>
{dateLabel && (
<div className="typography-body-sm flex items-center gap-1 px-2 py-1.5 text-neu-700 dark:text-neu-600 xs:gap-1.5 xs:px-4 xs:py-2.5">
<CalendarIcon className="size-4 shrink-0 translate-y-[-.5px] text-neu-600 dark:text-neu-500 xs:size-5" />
<div className="typography-body-sm flex items-center gap-1 px-2 py-1.5 text-neu-800 dark:text-neu-600 xs:gap-1.5 xs:px-4 xs:py-2.5">
<CalendarIcon className="size-4 shrink-0 translate-y-[-.5px] text-neu-800 dark:text-neu-500 xs:size-5" />
{parsedDate ? (
<time dateTime={parsedDate.toISOString()}>{dateLabel}</time>
) : (
Expand All @@ -126,8 +128,8 @@ export function EventCard({
</div>
)}
{city && (
<div className="typography-body-sm flex items-center gap-1.5 whitespace-pre px-2 py-1.5 text-neu-700 dark:text-neu-600 xs:px-4 xs:py-2.5">
<PinIcon className="size-4 shrink-0 translate-y-[-.5px] text-neu-600 dark:text-neu-500 xs:size-5" />
<div className="typography-body-sm flex items-center gap-1.5 whitespace-pre px-2 py-1.5 text-neu-800 dark:text-neu-600 xs:px-4 xs:py-2.5">
<PinIcon className="size-4 shrink-0 translate-y-[-.5px] text-neu-800 dark:text-neu-500 xs:size-5" />
{city}
</div>
)}
Expand Down
51 changes: 51 additions & 0 deletions src/app/(main)/community/events/event-filter-tag.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { Tag } from "@/app/conf/_design-system/tag"
import { CheckboxIcon } from "@/app/conf/_design-system/pixelarticons/checkbox-icon"
import clsx from "clsx"

export type EventKind = "meetup" | "conference" | "working-group"

export const eventTagColors = {
conference: "hsl(var(--color-pri-base))",
meetup: "hsl(var(--color-sec-dark))",
"working-group": "#6883FF",
}

export interface EventFilterTagProps
extends Omit<React.HTMLAttributes<HTMLLabelElement>, "onChange"> {
kind: EventKind
checked: boolean
onChange: (event: React.ChangeEvent<HTMLInputElement>) => void
}

export function EventFilterTag({
kind,
checked,
onChange,
...rest
}: EventFilterTagProps) {
return (
<label
{...rest}
className="cursor-pointer select-none hover:opacity-90 hover:ring hover:ring-neu-100 dark:hover:ring-neu-50"
>
<input
type="checkbox"
className="sr-only"
onChange={onChange}
checked={checked}
/>
<Tag
color={eventTagColors[kind]}
className="flex py-[3px] pl-[3px] *:gap-1"
>
<CheckboxIcon
checked={checked}
style={{
color: eventTagColors[kind],
}}
/>
{kind.replace("-", " ")}
</Tag>
</label>
)
}
Loading
Loading