From cf8342f8d4c758c528ab0738aa9fc3842ebf9b6d Mon Sep 17 00:00:00 2001 From: Max Amundsen Date: Mon, 13 Jul 2026 13:01:26 -0400 Subject: [PATCH] Add fonts, autotable, autotable examples --- CLAUDE.md | 20 + go/bundler/tailwind.go | 8 + go/bundler/tailwind_test.go | 58 + go/cmd/examples/go-wasm-web/app/kit.go | 67 +- go/cmd/examples/go-wasm-web/app/overlays.go | 350 + go/cmd/examples/go-wasm-web/app/pages.go | 23 +- go/cmd/examples/go-wasm-web/app/routes.gen.go | 29 +- go/cmd/examples/go-wasm-web/app/ssr_test.go | 171 + go/cmd/examples/go-wasm-web/app/table.go | 290 + go/cmd/examples/go-wasm-web/css/app.css | 61 + go/cmd/examples/go-wasm-web/server/main.go | 2 +- go/cmd/examples/go-wasm-web/wwwroot/app.css | 38 +- .../wwwroot/fonts/lora-latin-ext-italic.woff2 | Bin 0 -> 21128 bytes .../wwwroot/fonts/lora-latin-ext-normal.woff2 | Bin 0 -> 20088 bytes .../wwwroot/fonts/lora-latin-italic.woff2 | Bin 0 -> 40772 bytes .../wwwroot/fonts/lora-latin-normal.woff2 | Bin 0 -> 37788 bytes go/rsc/server.go | 16 +- go/vdom/events.go | 63 +- go/vdom/ref.go | 55 + go/vdom/tags.go | 83 +- go/vdom/vnode.go | 44 +- go/wasmruntime/host.go | 92 + go/wasmruntime/host_native.go | 49 + go/wasmruntime/host_test.go | 214 + go/wasmruntime/host_wasm.go | 438 ++ go/wasmruntime/hydrate_test.go | 80 + go/wasmruntime/mount.go | 3 + go/wasmruntime/reconcile.go | 226 +- go/wasmruntime/style_test.go | 41 + go/wasmruntime/svg_test.go | 91 + go/wasmruntime/testdata/domexec.js | 68 +- go/webui/accordion.go | 15 +- go/webui/alerts.go | 6 +- go/webui/autotable.go | 5701 ++++++++++++++++- go/webui/autotable_calc_test.go | 492 ++ go/webui/autotable_ssr_test.go | 81 + go/webui/autotable_test.go | 1962 ++++++ go/webui/badges.go | 4 +- go/webui/buttons.go | 15 +- go/webui/calendar.go | 29 +- go/webui/cards.go | 14 +- go/webui/cellgrid.go | 34 +- go/webui/chart.go | 5 +- go/webui/crmtabs.go | 29 +- go/webui/datepicker.go | 736 ++- go/webui/envbadge.go | 2 +- go/webui/floating.go | 658 +- go/webui/forms.go | 82 +- go/webui/fuzzymatch.go | 27 +- go/webui/general.go | 39 +- go/webui/icons.go | 72 +- go/webui/icons_test.go | 116 + go/webui/menu.go | 524 +- go/webui/modal.go | 701 +- go/webui/pdf.go | 580 ++ go/webui/pdf_border_test.go | 91 + go/webui/pdf_summary_test.go | 66 + go/webui/pdf_test.go | 391 ++ go/webui/popovers.go | 299 +- go/webui/position.go | 295 + go/webui/position_test.go | 198 + go/webui/prettytable.go | 24 +- go/webui/remoteupdateflash.go | 6 +- go/webui/sidebar.go | 28 +- go/webui/tabs.go | 16 +- go/webui/toast.go | 255 +- go/webui/toast_calc_test.go | 83 + go/webui/toggleswitch.go | 13 +- go/webui/tooltips.go | 279 +- go/webui/tutorial.go | 848 ++- go/webui/webui.go | 31 +- 71 files changed, 16084 insertions(+), 1443 deletions(-) create mode 100644 go/cmd/examples/go-wasm-web/app/overlays.go create mode 100644 go/cmd/examples/go-wasm-web/app/ssr_test.go create mode 100644 go/cmd/examples/go-wasm-web/app/table.go create mode 100644 go/cmd/examples/go-wasm-web/wwwroot/fonts/lora-latin-ext-italic.woff2 create mode 100644 go/cmd/examples/go-wasm-web/wwwroot/fonts/lora-latin-ext-normal.woff2 create mode 100644 go/cmd/examples/go-wasm-web/wwwroot/fonts/lora-latin-italic.woff2 create mode 100644 go/cmd/examples/go-wasm-web/wwwroot/fonts/lora-latin-normal.woff2 create mode 100644 go/vdom/ref.go create mode 100644 go/wasmruntime/host.go create mode 100644 go/wasmruntime/host_native.go create mode 100644 go/wasmruntime/host_test.go create mode 100644 go/wasmruntime/host_wasm.go create mode 100644 go/wasmruntime/hydrate_test.go create mode 100644 go/wasmruntime/style_test.go create mode 100644 go/wasmruntime/svg_test.go create mode 100644 go/webui/autotable_calc_test.go create mode 100644 go/webui/autotable_ssr_test.go create mode 100644 go/webui/autotable_test.go create mode 100644 go/webui/icons_test.go create mode 100644 go/webui/pdf.go create mode 100644 go/webui/pdf_border_test.go create mode 100644 go/webui/pdf_summary_test.go create mode 100644 go/webui/pdf_test.go create mode 100644 go/webui/position.go create mode 100644 go/webui/position_test.go create mode 100644 go/webui/toast_calc_test.go diff --git a/CLAUDE.md b/CLAUDE.md index 6c441de8..6729f74f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -48,6 +48,26 @@ go -C go vet ./... go -C go test ./... ``` +**The wasm host API** (`wasmruntime/host.go` + `host_wasm.go` / `host_native.go`) is how neutral +component code reaches the browser: element measurement (`Measure`, `Viewport`), imperative style +writes (`SetStyle` — positioning must NOT go through signals, which re-render the whole tree), +the post-commit hook (`AfterRender`, the only point at which a just-rendered element can be +measured), document/window listeners, timers, localStorage, and file download. It is **dual-build**: +real under `js && wasm`, no-op stubs natively — which is what lets `webui` call it unconditionally +and still SSR. Refs come from `vdom.Ref` + `vdom.WithRef`; `vdom.Portal` mounts children at +`document.body` (needed to escape `overflow:hidden` / `transform` ancestors). + +The reconciler is wasm-only and needs a DOM, so `go test ./...` cannot reach it. It has its own +harness — a minimal DOM under node: +``` +GOOS=js GOARCH=wasm go -C go test -exec="node testdata/domexec.js" ./wasmruntime +``` + +`webui` components that measure the page (Tooltip, Popover, Menu, Modal, DatePicker, Tutorial, +AutoTable) are **controllers**: create them once alongside your signals, never inside a render +closure. Floating panels share one positioning engine (`webui/position.go`, pure math, unit-tested +natively) driven by the `Floating` controller (`webui/floating.go`). + ### web/ - `kit/` — Solid.js `.tsx` component kit. Apps import components as `@ui/*`. diff --git a/go/bundler/tailwind.go b/go/bundler/tailwind.go index b4e94af2..8e37abd3 100644 --- a/go/bundler/tailwind.go +++ b/go/bundler/tailwind.go @@ -1420,6 +1420,14 @@ func twCompile(input, baseDir string, candidates []string) (string, int, error) if e != nil { return "", 0, e } + // The preflight is written against Tailwind's compile-time CSS functions — + // `font-family: --theme(--default-font-family, …)` and five more like it. They + // have to be resolved here, exactly as the theme's own declarations are above. + // Left in, `--theme(…)` reaches the browser verbatim, which cannot parse it and + // so DROPS THE WHOLE DECLARATION: html ends up with no font-family at all and + // falls back to the browser default, and no @theme override of --font-sans can + // ever take effect. + substituteFunctions(pfAst, ds) out = append(out, atRule("@layer", "base", pfAst...)) } diff --git a/go/bundler/tailwind_test.go b/go/bundler/tailwind_test.go index e2c107bd..554b24c9 100644 --- a/go/bundler/tailwind_test.go +++ b/go/bundler/tailwind_test.go @@ -215,3 +215,61 @@ func TestExtractCandidatesRegexLiterals(t *testing.T) { } } } + +// The preflight is written against Tailwind's compile-time CSS functions, e.g. +// `font-family: --theme(--default-font-family, …)`. If those are not resolved, they +// reach the browser verbatim; the browser cannot parse `--theme(…)` and DROPS THE +// WHOLE DECLARATION. The symptom is subtle and global: every page silently loses its +// font-family and falls back to the browser default, and no @theme override of +// --font-sans can ever take effect. That shipped for a while, so pin it. +func TestPreflightResolvesThemeFunctions(t *testing.T) { + css, _, err := twCompile(`@import "tailwindcss";`, ".", nil) + if err != nil { + t.Fatal(err) + } + + flat := strings.Join(strings.Fields(css), " ") + if strings.Contains(css, "--theme(") { + t.Error("the compiled CSS still contains an unresolved --theme(…); the browser will drop those declarations") + } + if !strings.Contains(flat, "font-family: var(--default-font-family)") { + t.Error("preflight did not resolve html's font-family to a var()") + } +} + +// And the whole point of resolving it: an app's @theme override of --font-sans must +// actually reach the page. +func TestThemeFontOverrideReachesHTML(t *testing.T) { + css, _, err := twCompile(` +@import "tailwindcss"; + +@font-face { + font-family: "Lora"; + src: url("/fonts/lora.woff2") format("woff2"); +} + +@theme { + --font-sans: "Lora", serif; +} +`, ".", nil) + if err != nil { + t.Fatal(err) + } + + // The chain the browser walks: html -> --default-font-family -> --font-sans. + flat := strings.Join(strings.Fields(css), " ") + for _, want := range []string{ + "font-family: var(--default-font-family)", + "--default-font-family: var(--font-sans)", + `--font-sans: "Lora", serif`, + } { + if !strings.Contains(flat, want) { + t.Errorf("missing %q — the font override does not reach the page", want) + } + } + // A vendored face must survive the build; dropping it would leave the family + // declared but never loaded. + if !strings.Contains(css, "@font-face") || !strings.Contains(css, "lora.woff2") { + t.Error("@font-face was dropped from the output") + } +} diff --git a/go/cmd/examples/go-wasm-web/app/kit.go b/go/cmd/examples/go-wasm-web/app/kit.go index 63b0bc14..ade59706 100644 --- a/go/cmd/examples/go-wasm-web/app/kit.go +++ b/go/cmd/examples/go-wasm-web/app/kit.go @@ -38,12 +38,17 @@ func KitPage(d Deps) func() *VNode { acc := NewSignal(0) notify := NewSignal(true) span := NewSignal("week") - modalOpen := NewSignal(false) - menuOpen := NewSignal(false) name := NewSignal("") email := NewSignal("") plan := NewSignal("pro") + // Floating components are CONTROLLERS: they own refs, timers and open state, so + // they are built once here — never inside the render closure below, which would + // rebuild them (and lose their state) on every frame. + modal := ui.NewModal(ui.ModalOptions{Size: ui.ModalMedium}) + menu := ui.NewMenu(ui.MenuOptions{Placement: ui.PlacementBottomStart}) + tip := ui.NewHoverTooltip(ui.PlacementTop, "") + return func() *VNode { return Div(Attr("class", "space-y-8"), Div( @@ -148,39 +153,45 @@ func KitPage(d Deps) func() *VNode { ), ), - kitSection("Overlays (interactive)", + kitSection("Overlays (measured, portaled)", row("flex flex-wrap items-center gap-4", - // Modal, toggled by a signal. - ui.Button(ui.ButtonProps{Color: ui.ButtonPrimary, Text: "Open modal", OnClick: func() { modalOpen.Set(true) }}), - // Menu, toggled by a signal. - ui.Menu("relative inline-block", - ui.MenuTrigger(func() { menuOpen.Set(!menuOpen.Get()) }, "", - ui.Button(ui.ButtonProps{Color: ui.ButtonWhite, Text: "Menu ▾"})), - ui.MenuContent(menuOpen.Get(), ui.MenuPlacementBottomStart, "", - ui.MenuItem(ui.MenuItemProps{Icon: "check", OnClick: func() { menuOpen.Set(false) }}, Text("Profile")), - ui.MenuItem(ui.MenuItemProps{OnClick: func() { menuOpen.Set(false) }}, Text("Settings")), - ui.MenuDivider(""), - ui.MenuItem(ui.MenuItemProps{OnClick: func() { menuOpen.Set(false) }}, Text("Sign out")), - ), + ui.Button(ui.ButtonProps{Color: ui.ButtonPrimary, Text: "Open modal", OnClick: modal.Open}), + + // The menu measures itself against the viewport: drag the window + // narrow, or scroll it to the bottom, and it flips/shifts to stay on + // screen. Items close the menu themselves — no callback plumbing. + menu.TriggerFunc(ui.MenuTriggerProps{Tag: "div"}, func(open bool) *VNode { + caret := " ▾" + if open { + caret = " ▴" + } + return ui.Button(ui.ButtonProps{Color: ui.ButtonWhite, Text: "Menu" + caret}) + }), + menu.Content("", + menu.Item(ui.MenuItemProps{Icon: "check"}, Text("Profile")), + menu.Item(ui.MenuItemProps{}, Text("Settings")), + ui.MenuDivider(""), + menu.Item(ui.MenuItemProps{}, Text("Sign out")), ), - // Tooltip (pure CSS hover). - ui.HoverTooltip(Span(Text("A CSS-only tooltip")), "top", "", - ui.Button(ui.ButtonProps{Color: ui.ButtonNeutral, Outline: true, Text: "Hover me"})), + + // The tooltip's arrow tracks the trigger even when the panel gets + // shifted away from it near a viewport edge. + tip.Render(Span(Text("A measured tooltip — try it near the window edge")), + ui.Button(ui.ButtonProps{Color: ui.ButtonLightNeutral, Text: "Hover me"})), ), - ui.Modal(ui.ModalProps{ - IsOpen: modalOpen.Get(), - OnClose: func() { modalOpen.Set(false) }, - Size: ui.ModalMedium, - Header: H3(Attr("class", "text-lg font-semibold text-text-heading"), Text("Example modal")), + modal.Render(ui.ModalProps{ + Header: H3(Attr("class", "text-lg font-semibold text-text-heading"), Text("Example modal")), }, - P(Attr("class", "text-neutral-600"), Text("This modal is toggled by a signal; the backdrop and close button round-trip through OnClose.")), + P(Attr("class", "text-neutral-600"), + Text("Portaled to document.body, so it is not clipped by any ancestor. Escape closes "+ + "the topmost modal; the backdrop click closes too.")), ), ), - ui.Alert(ui.AlertGray, "About this page", - Text("Floating/positioned components (menus, tooltips, modals, dropdowns) are ported as "+ - "structure + Tailwind + signal/event wiring — the neutral runtime has no floating-ui, "+ - "portals, or element measurement, so positioning is approximated with static classes.")), + ui.Alert(ui.AlertGreen, "About this page", + Text("Menus, tooltips, modals and dropdowns are now really measured: they are portaled to "+ + "document.body, positioned from getBoundingClientRect against the viewport, and they "+ + "flip and shift to stay on screen. Resize the window or scroll while one is open.")), ) } } diff --git a/go/cmd/examples/go-wasm-web/app/overlays.go b/go/cmd/examples/go-wasm-web/app/overlays.go new file mode 100644 index 00000000..8f45d1bd --- /dev/null +++ b/go/cmd/examples/go-wasm-web/app/overlays.go @@ -0,0 +1,350 @@ +package app + +import ( + "strconv" + + . "kjol/vdom" + ui "kjol/webui" +) + +// Every floating component in the kit, on one page: tooltips, popovers, menus and +// submenus, the date picker, modals (plain, confirm, wizard, imperative), toasts, +// and the tutorial's spotlight coachmarks. +// +// All of them are CONTROLLERS. They own refs, timers and open state, so they are +// created once here — never inside the render closure, which runs on every signal +// write and would rebuild them (and their refs) from scratch every frame. That is +// the single rule to remember about the floating layer. +// +// The page is NOT `static`: nothing is open during SSR anyway, so pre-rendering it +// buys nothing, and it keeps the example honest about which routes need it. +// +//gowasm:page /overlays layout=app +func OverlaysPage(d Deps) func() *VNode { + // --- tooltips ----------------------------------------------------------- + tipTop := ui.NewHoverTooltip(ui.PlacementTop, "") + tipRight := ui.NewHoverTooltip(ui.PlacementRight, "") + tipFocus := ui.NewFocusTooltip(ui.PlacementBottom, "") + tipFast := ui.NewTooltip(ui.TooltipProps{Placement: ui.PlacementTop, Delay: -1}) + + // --- popovers ----------------------------------------------------------- + pop := ui.NewPopover(ui.PopoverProps{Placement: ui.PlacementBottomStart}) + popEnd := ui.NewPopover(ui.PopoverProps{Placement: ui.PlacementBottomEnd}) + hoverPop := ui.NewHoverPopover(ui.HoverPopoverProps{ + Placement: ui.PlacementTop, + // The bridge: the cursor gets 300ms of grace to cross the gap from the + // trigger onto the panel. Without it, the panel closes in the dead space + // between them — which is exactly what happens once a panel is portaled and + // CSS :hover no longer reaches it. + HoverCloseDelay: 300, + }) + + // --- menus -------------------------------------------------------------- + menu := ui.NewMenu(ui.MenuOptions{Placement: ui.PlacementBottomStart}) + sub := ui.NewSubmenu(menu) + hoverMenu := ui.NewMenu(ui.MenuOptions{Placement: ui.PlacementBottomStart, OpenOnHover: true}) + + // --- date pickers ------------------------------------------------------- + picked := NewSignal("") + dp := ui.NewDatePicker(ui.DatePickerProps{ + Placeholder: "Pick a date", + Clearable: true, + OnChange: func(v string) { picked.Set(v) }, + }) + dob := ui.NewDateOfBirthPicker(ui.DatePickerProps{Placeholder: "Date of birth"}) + + // --- modals ------------------------------------------------------------- + modal := ui.NewModal(ui.ModalOptions{Size: ui.ModalMedium}) + nested := ui.NewModal(ui.ModalOptions{Size: ui.ModalSmall}) + deleted := NewSignal(false) + confirm := ui.NewModal(ui.ModalOptions{}) + + // --- wizard ------------------------------------------------------------- + wizardName := NewSignal("") + wizardDone := NewSignal(false) + wizard := ui.NewWizard(ui.ModalOptions{}) + + // --- toasts ------------------------------------------------------------- + // The Toaster owns the queue AND the clocks: it generates IDs, runs the + // auto-dismiss timer, and animates the countdown bar down to zero. (ToastProvider, + // the dumb half, renders a list you hand it and removes nothing — a toast pushed + // through it stays until you take it away yourself.) + toaster := ui.NewToaster(ui.ToasterOptions{Position: ui.ToastBottomRight}) + pushToast := func(kind ui.ToastType, msg string) { + toaster.Push(ui.Toast{Message: msg, Type: kind}) + } + + // --- tutorial ----------------------------------------------------------- + // Steps target elements by CSS SELECTOR. The tour resolves each one with + // document.querySelector, measures it, scrolls it into view, and cuts a hole in + // the dimmed overlay around it — the spotlight animates from target to target. + tour := ui.NewTutorial(ui.TutorialOptions{ + Steps: []ui.TutorialStep{ + { + Title: "Tooltips", + Target: "#demo-tooltips", + Content: func() *VNode { return Text("Measured, portaled, and they flip near a viewport edge.") }, + }, + { + Title: "Popovers", + Target: "#demo-popovers", + Placement: ui.PlacementBottom, + Content: func() *VNode { return Text("Click or hover. The hover bridge lets you reach the panel.") }, + }, + { + Title: "Menus", + Target: "#demo-menus", + Content: func() *VNode { return Text("Items close the menu themselves; submenus are portaled.") }, + }, + { + // No Target: the page dims flat and the card centres in the viewport. + Title: "That's the tour", + Content: func() *VNode { return Text("Escape ends it. Arrow keys and Enter move between steps.") }, + }, + }, + }) + + return func() *VNode { + return Div(Attr("class", "space-y-8"), + Div( + H2(Attr("class", "text-2xl font-semibold tracking-tight text-text-heading"), Text("Overlays")), + P(Attr("class", "mt-1 text-neutral-500"), + Text("Every floating component, really measured: portaled to document.body, positioned from "+ + "getBoundingClientRect against the viewport, flipping and shifting to stay on screen. "+ + "Scroll or resize the window with one open.")), + row("mt-3 flex gap-2", tour.StartButton(0, "", Text("Take the tour"))), + ), + + // ---- tooltips ---- + El("div", Attr("id", "demo-tooltips"), + kitSection("Tooltips", + row("flex flex-wrap items-center gap-3", + tipTop.Render(Span(Text("Above — the default")), + ui.Button(ui.ButtonProps{Color: ui.ButtonLightNeutral, Text: "Top"})), + tipRight.Render(Span(Text("To the right, unless it would run off the edge")), + ui.Button(ui.ButtonProps{Color: ui.ButtonLightNeutral, Text: "Right"})), + tipFast.Render(Span(Text("No open delay")), + ui.Button(ui.ButtonProps{Color: ui.ButtonLightNeutral, Text: "Instant"})), + tipFocus.Render(Span(Text("Shown on focus, not hover — tab to the field")), + ui.FormInput(ui.FormInputProps{Placeholder: "Focus me"})), + ), + P(Attr("class", "text-xs text-neutral-500"), + Text("Drag the window narrow and hover the Right one: it flips to the left, and its arrow "+ + "follows. Near an edge the panel shifts back on screen and the arrow slides to keep "+ + "pointing at the trigger — the original kit's arrow detached here.")), + ), + ), + + // ---- popovers ---- + El("div", Attr("id", "demo-popovers"), + kitSection("Popovers", + row("flex flex-wrap items-center gap-3", + pop.Trigger(ui.PopoverTriggerProps{}, + ui.Button(ui.ButtonProps{Color: ui.ButtonPrimary, Text: "Click me"})), + pop.Content(ui.PopoverContentProps{Class: "w-64"}, + P(Attr("class", "text-sm text-neutral-600"), + Text("Click outside, or press Escape, to close. Only the topmost floating closes per press.")), + ), + + popEnd.Trigger(ui.PopoverTriggerProps{}, + ui.Button(ui.ButtonProps{Color: ui.ButtonLightNeutral, Text: "Aligned to my right edge"})), + popEnd.Content(ui.PopoverContentProps{Class: "w-56"}, + P(Attr("class", "text-sm text-neutral-600"), Text("Placement bottom-end.")), + ), + + hoverPop.Trigger(ui.PopoverTriggerProps{}, + ui.Button(ui.ButtonProps{Color: ui.ButtonBlue, Outline: true, Text: "Hover me, then reach the panel"})), + hoverPop.Content(ui.PopoverContentProps{Class: "w-64"}, + P(Attr("class", "text-sm text-neutral-600"), + Text("Move the cursor across the gap and onto this panel — it stays open. "+ + "Select this text to prove it.")), + ), + ), + ), + ), + + // ---- menus ---- + El("div", Attr("id", "demo-menus"), + kitSection("Menus & submenus", + row("flex flex-wrap items-center gap-3", + menu.TriggerFunc(ui.MenuTriggerProps{Tag: "div"}, func(open bool) *VNode { + caret := " ▾" + if open { + caret = " ▴" + } + return ui.Button(ui.ButtonProps{Color: ui.ButtonWhite, Text: "Actions" + caret}) + }), + menu.Content("", + menu.Item(ui.MenuItemProps{Icon: "check", OnClick: func() { pushToast(ui.ToastSuccess, "Profile opened") }}, + Text("Profile")), + menu.Item(ui.MenuItemProps{OnClick: func() { pushToast(ui.ToastInfo, "Settings opened") }}, + Text("Settings")), + + // The submenu is portaled — it used to be clipped by the parent + // menu's own overflow-y-auto. + sub.Submenu(ui.SubmenuProps{Trigger: "More", Icon: "ellipsis"}, + sub.Item(ui.MenuItemProps{OnClick: func() { pushToast(ui.ToastInfo, "Archived") }}, Text("Archive")), + sub.Item(ui.MenuItemProps{OnClick: func() { pushToast(ui.ToastWarning, "Duplicated") }}, Text("Duplicate")), + ), + + ui.MenuDivider(""), + // KeepOpen is the TSX's closeOnClick inverted: by default an item + // closes the menu, which the first Go port dropped entirely. + menu.Item(ui.MenuItemProps{KeepOpen: true, OnClick: func() { pushToast(ui.ToastGeneric, "Menu stayed open") }}, + Text("Stay open (KeepOpen)")), + menu.Item(ui.MenuItemProps{Icon: "arrow-right-from-bracket", + OnClick: func() { pushToast(ui.ToastError, "Signed out") }}, Text("Sign out")), + ), + + hoverMenu.TriggerFunc(ui.MenuTriggerProps{Tag: "div"}, func(bool) *VNode { + return ui.Button(ui.ButtonProps{Color: ui.ButtonLightNeutral, Text: "Opens on hover"}) + }), + hoverMenu.Content("", + hoverMenu.Item(ui.MenuItemProps{}, Text("One")), + hoverMenu.Item(ui.MenuItemProps{}, Text("Two")), + ), + ), + P(Attr("class", "text-xs text-neutral-500"), + Text("Opening one menu closes the other: a single-open manager, with submenus exempt "+ + "(Standalone), or a submenu would close its own parent.")), + ), + ), + + // ---- date pickers ---- + kitSection("Date picker", + row("grid gap-4 sm:grid-cols-2", + row("flex flex-col gap-1", + ui.FormLabel(ui.FormLabelProps{}, Text("Date (portaled, flips near the bottom)")), + dp.Render(), + ), + row("flex flex-col gap-1", + ui.FormLabel(ui.FormLabelProps{}, Text("Date of birth (inline, three selects)")), + dob.Render(), + ), + ), + P(Attr("class", "text-xs text-neutral-500"), + Text("Picked: \""+picked.Get()+"\". Type into the field too — it parses loosely "+ + "(7/4/26, Jul 4 2026, 2026-07-04) and commits on blur.")), + ), + + // ---- modals ---- + kitSection("Modals", + row("flex flex-wrap items-center gap-3", + ui.Button(ui.ButtonProps{Color: ui.ButtonPrimary, Text: "Open modal", OnClick: modal.Open}), + ui.Button(ui.ButtonProps{Color: ui.ButtonRed, Outline: true, Text: "Delete something…", OnClick: confirm.Open}), + ui.Button(ui.ButtonProps{Color: ui.ButtonBlue, Outline: true, Text: "Open wizard", OnClick: wizard.Open}), + ui.Button(ui.ButtonProps{Color: ui.ButtonLightNeutral, Text: "Open imperatively", + OnClick: func() { + // No component in the tree owns this one: OpenModal hands content + // to the shared host rendered in the layout. + ui.OpenModal(func() *VNode { + return ui.ModalContent(ui.ModalContentProps{ + Header: H3(Attr("class", "text-lg font-semibold text-text-heading"), Text("Opened from anywhere")), + }, + P(Attr("class", "text-neutral-600"), + Text("This content was not rendered by any component — it was handed to "+ + "ModalHost (see AppLayout) by webui.OpenModal.")), + ) + }, ui.ModalOptions{Size: ui.ModalSmall}) + }}), + ), + P(Attr("class", "text-xs text-neutral-500"), + Text("Deleted: "+strconv.FormatBool(deleted.Get())+ + ". Open the modal, then the nested one inside it, and press Escape twice — "+ + "modals unwind one layer per press.")), + + modal.Render(ui.ModalProps{ + Header: H3(Attr("class", "text-lg font-semibold text-text-heading"), Text("A modal")), + Footer: ui.Button(ui.ButtonProps{Color: ui.ButtonNeutral, Text: "Close", OnClick: modal.Close}), + }, + P(Attr("class", "text-neutral-600"), + Text("Portaled to document.body, so no ancestor's overflow:hidden can clip it. It fades "+ + "and scales in — a double requestAnimationFrame, because a single frame does not "+ + "give the browser time to commit the initial style.")), + row("mt-4", + ui.Button(ui.ButtonProps{Color: ui.ButtonBlue, Outline: true, Text: "Open a nested modal", OnClick: nested.Open}), + ), + ), + nested.Render(ui.ModalProps{ + Header: H3(Attr("class", "text-lg font-semibold text-text-heading"), Text("Nested")), + }, + P(Attr("class", "text-neutral-600"), Text("Escape closes THIS one first, not the one behind it.")), + ), + confirm.Confirm(ui.ConfirmModalProps{ + Title: "Delete row", + Message: "This cannot be undone.", + OnConfirm: func() { + deleted.Set(true) + pushToast(ui.ToastError, "Row deleted") + }, + }), + wizard.Render(ui.WizardProps{ + Title: "Set up your account", + FinishText: "Finish", + OnComplete: func() { + wizardDone.Set(true) + pushToast(ui.ToastSuccess, "Wizard complete: "+wizardName.Get()) + }, + Steps: []ui.WizardStep{ + { + Title: "Your name", + // Each step gets its own context: SetCanContinue gates THIS step's + // Next button, which a single shared bool could not express. + Content: func(ctx ui.WizardStepContext) *VNode { + ctx.SetCanContinue(wizardName.Get() != "") + return row("flex flex-col gap-1", + ui.FormLabel(ui.FormLabelProps{}, Text("Name (required to continue)")), + ui.FormInput(ui.FormInputProps{ + Value: wizardName.Get(), + Placeholder: "Ada Lovelace", + OnInput: func(v string) { wizardName.Set(v) }, + }), + ) + }, + }, + { + Title: "Confirm", + Content: func(ctx ui.WizardStepContext) *VNode { + ctx.SetCanContinue(true) + return P(Attr("class", "text-neutral-600"), + Text("All set for "+wizardName.Get()+". Finish to close.")) + }, + }, + }, + }), + ), + + // ---- toasts ---- + kitSection("Toasts", + row("flex flex-wrap items-center gap-2", + ui.Button(ui.ButtonProps{Color: ui.ButtonGreen, Small: true, Text: "Success", + OnClick: func() { toaster.Success("Saved.") }}), + ui.Button(ui.ButtonProps{Color: ui.ButtonRed, Small: true, Text: "Error", + OnClick: func() { toaster.Error("Something went wrong.") }}), + ui.Button(ui.ButtonProps{Color: ui.ButtonBlue, Small: true, Text: "Info", + OnClick: func() { toaster.Info("Just so you know.") }}), + ui.Button(ui.ButtonProps{Color: ui.ButtonLightNeutral, Small: true, Text: "Sticky (no timer)", + OnClick: func() { + toaster.Push(ui.Toast{ + Message: "This one waits for you to dismiss it.", + Type: ui.ToastWarning, + Duration: ui.ToastSticky, + }) + }}), + ui.Button(ui.ButtonProps{Color: ui.ButtonLightNeutral, Small: true, Text: "Clear all", + OnClick: toaster.Clear}), + ), + P(Attr("class", "text-xs text-neutral-500"), + Text("These auto-dismiss after 5 seconds — watch the bar count down; it is a CSS transition "+ + "driven straight at the DOM, not a re-render per frame. A sticky one (Duration: "+ + "ToastSticky) never leaves on its own. The menu items above raise toasts too, which is "+ + "how you can see that an item really does close its own menu.")), + ), + + // The toast container and the tutorial's overlay both render here; both are + // fixed-position, so where they sit in the tree does not matter. + toaster.Render(), + tour.Render(), + ) + } +} diff --git a/go/cmd/examples/go-wasm-web/app/pages.go b/go/cmd/examples/go-wasm-web/app/pages.go index eef647a4..1a4d989d 100644 --- a/go/cmd/examples/go-wasm-web/app/pages.go +++ b/go/cmd/examples/go-wasm-web/app/pages.go @@ -72,21 +72,40 @@ func PublicLayout(d Deps, content *VNode) *VNode { ) } +// wideRoutes get a roomier container. A table with a dozen columns, a drag handle +// and three calculated columns has no business being squeezed into a reading-width +// column; prose pages still are. +var wideRoutes = map[string]bool{"/table": true} + //gowasm:layout app func AppLayout(d Deps, content *VNode) *VNode { + width := "max-w-5xl" + if wideRoutes[d.Path()] { + width = "max-w-[100rem]" + } + return Div(Attr("class", "min-h-screen"), Nav(Attr("class", "app-nav border-b border-neutral-800 bg-neutral-900"), - Div(Attr("class", "mx-auto flex max-w-5xl items-center gap-2 px-4 py-3"), + // The nav tracks the content's width, so the logo stays flush with the page + // rather than floating in from the left on the wide routes. + Div(Attr("class", "mx-auto flex "+width+" items-center gap-2 px-4 py-3"), A(Attr("class", "text-lg font-semibold tracking-tight text-text-on-dark no-underline"), Attr("href", "/chart"), navigate(d, "/chart"), Text("gowasm · app")), Ul(Attr("class", "ml-4 flex items-center gap-1"), navItem(d, "/chart", "Chart", true), navItem(d, "/server", "Server", true), navItem(d, "/data", "Data", true), + navItem(d, "/table", "Table", true), + navItem(d, "/overlays", "Overlays", true), navItem(d, "/kit", "UI Kit", true)), Ul(Attr("class", "ml-auto flex items-center"), navItem(d, "/", "Home", true)), )), - Main(Attr("class", "mx-auto max-w-5xl px-4 py-8"), content), + Main(Attr("class", "mx-auto "+width+" px-4 py-8"), content), + + // The host for webui.OpenModal — content opened imperatively, by code that + // owns no component in the tree, is portaled out of here. Render it ONCE, + // near the root. It is an empty portal when nothing is open. + ui.ModalHost(), ) } diff --git a/go/cmd/examples/go-wasm-web/app/routes.gen.go b/go/cmd/examples/go-wasm-web/app/routes.gen.go index 60f9cf8c..ac5a961a 100644 --- a/go/cmd/examples/go-wasm-web/app/routes.gen.go +++ b/go/cmd/examples/go-wasm-web/app/routes.gen.go @@ -6,12 +6,14 @@ import "kjol/vdom" // Routes maps each //gowasm:page path to its instantiated render function. func Routes(d Deps) map[string]func() *vdom.VNode { return map[string]func() *vdom.VNode{ - "/": HomePage(d), - "/about": AboutPage(d), - "/chart": ChartPage(d), - "/data": DataPage(d), - "/kit": KitPage(d), - "/server": ServerPage(d), + "/": HomePage(d), + "/about": AboutPage(d), + "/chart": ChartPage(d), + "/data": DataPage(d), + "/kit": KitPage(d), + "/overlays": OverlaysPage(d), + "/server": ServerPage(d), + "/table": TablePage(d), } } @@ -21,16 +23,19 @@ var StaticPaths = map[string]bool{ "/about": true, "/chart": true, "/data": true, + "/table": true, } // RouteLayout maps each route to the name of the layout that wraps it. var RouteLayout = map[string]string{ - "/": "public", - "/about": "public", - "/chart": "app", - "/data": "app", - "/kit": "app", - "/server": "app", + "/": "public", + "/about": "public", + "/chart": "app", + "/data": "app", + "/kit": "app", + "/overlays": "app", + "/server": "app", + "/table": "app", } // LayoutFor wraps a page's content in the layout declared for its route. diff --git a/go/cmd/examples/go-wasm-web/app/ssr_test.go b/go/cmd/examples/go-wasm-web/app/ssr_test.go new file mode 100644 index 00000000..1f9e1a56 --- /dev/null +++ b/go/cmd/examples/go-wasm-web/app/ssr_test.go @@ -0,0 +1,171 @@ +package app + +import ( + "bytes" + "os" + "strings" + "testing" + + "kjol/vdom" + "kjol/webui" +) + +func TestSSRPages(t *testing.T) { + for _, path := range []string{"/", "/about", "/chart", "/data", "/table", "/overlays", "/kit"} { + deps := Deps{Path: func() string { return path }} + html := vdom.RenderHTML(Shell(deps, Routes(deps))) + t.Logf("%-8s %6d bytes portals=%d", path, len(html), strings.Count(html, "data-portal")) + if len(html) < 200 { + t.Errorf("%s rendered only %d bytes", path, len(html)) + } + } +} + +func TestSSRTablePage(t *testing.T) { + deps := Deps{Path: func() string { return "/table" }} + html := vdom.RenderHTML(Shell(deps, Routes(deps))) + + // The table persists a personal layout in localStorage, which the SERVER CANNOT + // READ. So the server renders a SKELETON, not the default table: if it rendered + // the default one, a user who had reordered their columns would watch them + // rearrange themselves once the wasm booted. + // + // This is a real cost — the page ships no table content — and it is the price of + // never showing the wrong table. See webui.RestoreLayout. + if !strings.Contains(html, `aria-busy="true"`) { + t.Error("SSR /table should render the loading skeleton, not a table") + } + if !strings.Contains(html, "animate-pulse") { + t.Error("the skeleton bars are missing") + } + if strings.Contains(html, "Ada Lovelace") { + t.Error("SSR rendered table CONTENT — a user with a saved layout would watch it rearrange") + } +} + +// renderedTable drives the very table the page renders, past its skeleton. Natively +// there is nothing to restore, so RestoreLayout just marks the layout settled. +func renderedTable(t *testing.T) string { + t.Helper() + highlight := vdom.NewSignal("") + table := newEmployeeTable(highlight) + table.SetRows(employees()) + table.RestoreLayout() + return vdom.RenderHTML(table.Render()) +} + +// Once the layout has settled, the table renders in full. +func TestTableRendersOnceSettled(t *testing.T) { + html := renderedTable(t) + + for _, want := range []string{"Ada Lovelace", "Salary"} { + if !strings.Contains(html, want) { + t.Errorf("settled table missing %q", want) + } + } + // PerPage is 5, so page one holds 5 of the 12 rows. + if got := strings.Count(html, "@example.com"); got != 5 { + t.Errorf("rendered %d rows, want 5 (one page)", got) + } + // The Rank column is HiddenByDefault. + if strings.Contains(html, ">Rank<") { + t.Error("a HiddenByDefault column was rendered") + } + if !strings.Contains(html, "Page 1 of 3") { + t.Error("pagination did not compute 3 pages for 12 rows at 5/page") + } +} + +// Calculated columns, end to end through the page, in all three shapes. +// +// Page 1 (declared order): +// +// salary 1200.50 1500.00 980.00 1340.00 1610.25 +// bonus 150.00 300.00 0.00 220.00 400.00 +func TestSSRCalculatedColumns(t *testing.T) { + html := renderedTable(t) + + // BASIC: sum over the operand columns [Salary, Bonus], combined ACROSS each row. + // If this ever aggregated DOWN the column instead, every row would read the same + // number — which is exactly the bug these values are here to catch. + for _, want := range []string{"$1,350.50", "$1,800.00", "$980.00", "$1,560.00", "$2,010.25"} { + if !strings.Contains(html, want) { + t.Errorf("Total comp missing %s (a per-row Salary + Bonus)", want) + } + } + + // ADVANCED: ([Salary] + [Bonus]) * 12. + for _, want := range []string{"$16,206.00", "$21,600.00", "$11,760.00"} { + if !strings.Contains(html, want) { + t.Errorf("Annual column missing %s", want) + } + } + + // ADVANCED, position-dependent: SUM({Salary:1:ROW()}) accumulates down the rows. + for _, want := range []string{"$2,700.50", "$3,680.50", "$5,020.50", "$6,630.75"} { + if !strings.Contains(html, want) { + t.Errorf("running total missing %s", want) + } + } + + // SUMMARY: aggregated DOWN the column, over ALL 12 filtered rows — not the 5 on + // this page. 1200.50+1500+980+1340+1610.25+1120+1275.75+1050+1400+860+1180+990. + if !strings.Contains(html, "$14,506.50") { + t.Error("footer did not total the whole filtered set ($14,506.50)") + } + if !strings.Contains(html, "Average salary") { + t.Error("summary row label missing") + } +} + +// The export path, driven through the very table the /table page renders. +// +// Export must write what the FILTER selected — every matching row across every page +// — not the five rows on screen; the columns the user can SEE, in their order; and +// the calculated columns, with each row's own value. +func TestTableExport(t *testing.T) { + highlight := vdom.NewSignal("") + table := newEmployeeTable(highlight) + table.RestoreLayout() // nothing to restore natively; reveals the table over its skeleton + table.SetRows(employees()) + + // Filter to one team, then render (which resolves FilteredRows). + table.SetSearchValue("Team", "Research", true) + table.Render() + + csv := string(webui.ExportCSV(table.ExportColumns(), table.FilteredRows(), nil)) + + // PerPage is 5 and Research has 4 members, but the point is that export ignores + // paging entirely: every filtered row, no one else's. + for _, want := range []string{"Alan Turing", "Katherine Johnson", "Barbara Liskov", "Evelyn Boyd Granville"} { + if !strings.Contains(csv, want) { + t.Errorf("CSV missing filtered row %q", want) + } + } + if strings.Contains(csv, "Ada Lovelace") { + t.Error("CSV contains a row the filter excluded") + } + // Rank is HiddenByDefault, so it must not be exported. + if strings.Contains(csv, "Item 10") { + t.Error("CSV exported a hidden column") + } + // The calculated columns come along, and the running total ACCUMULATES — + // $1,500.00 then $2,840.00 (Turing + Johnson), not the same number twice. + if !strings.Contains(csv, "Running total") || !strings.Contains(csv, "$2,840.00") { + t.Errorf("running total did not accumulate in the export:\n%s", csv) + } + + // And the PDF: a real file, with the same filtered content. + pdf := table.ExportPDFBytes(webui.AutoTablePDFHeader{ + Title: "Employees", ShowDate: true, Orientation: webui.PDF_ORIENTATION_LANDSCAPE, + }) + if !bytes.HasPrefix(pdf, []byte("%PDF-")) || !bytes.Contains(pdf, []byte("%%EOF")) { + t.Fatalf("PDF is not a PDF (%d bytes)", len(pdf)) + } + if out := os.Getenv("PDF_OUT"); out != "" { + if err := os.WriteFile(out, pdf, 0o644); err != nil { + t.Fatal(err) + } + t.Logf("wrote %s (%d bytes)", out, len(pdf)) + } +} diff --git a/go/cmd/examples/go-wasm-web/app/table.go b/go/cmd/examples/go-wasm-web/app/table.go new file mode 100644 index 00000000..22301e65 --- /dev/null +++ b/go/cmd/examples/go-wasm-web/app/table.go @@ -0,0 +1,290 @@ +package app + +import ( + . "kjol/vdom" + ui "kjol/webui" +) + +// Employee is a row in the table demo. Salary and Bonus are both money, so a +// calculated column has two numeric columns to combine ACROSS a row. +type Employee struct { + Name string + Email string + Team string + Status string + Salary string + Bonus string + Rank string + Note string +} + +func employees() []any { + rows := []Employee{ + {"Ada Lovelace", "ada@example.com", "Engineering", "active", "$1,200.50", "$150.00", "Item 2", "Wrote the first algorithm."}, + {"Alan Turing", "alan@example.com", "Research", "active", "$1,500.00", "$300.00", "Item 10", "Decidability, and the machine."}, + {"Grace Hopper", "grace@example.com", "Engineering", "inactive", "$980.00", "$0.00", "Item 1", "Found the first bug. Literally."}, + {"Katherine Johnson", "katherine@example.com", "Research", "active", "$1,340.00", "$220.00", "Item 3", "Orbital mechanics, by hand."}, + {"Margaret Hamilton", "margaret@example.com", "Engineering", "active", "$1,610.25", "$400.00", "Item 21", "Coined 'software engineering'."}, + {"Barbara Liskov", "barbara@example.com", "Research", "inactive", "$1,120.00", "$90.00", "Item 7", "The substitution principle."}, + {"Radia Perlman", "radia@example.com", "Networking", "active", "$1,275.75", "$180.00", "Item 12", "Spanning tree protocol."}, + {"Karen Sparck Jones", "karen@example.com", "Research", "active", "$1,050.00", "$60.00", "Item 5", "Inverse document frequency."}, + {"Frances Allen", "frances@example.com", "Engineering", "inactive", "$1,400.00", "$250.00", "Item 9", "Optimizing compilers."}, + {"Jean Bartik", "jean@example.com", "Engineering", "active", "$860.00", "$40.00", "Item 4", "Programmed the ENIAC."}, + {"Evelyn Boyd Granville", "evelyn@example.com", "Research", "active", "$1,180.00", "$130.00", "Item 15", "Trajectory analysis."}, + {"Annie Easley", "annie@example.com", "Networking", "inactive", "$990.00", "$75.00", "Item 6", "Rocket propulsion code."}, + } + out := make([]any, len(rows)) + for i, r := range rows { + out[i] = r + } + return out +} + +func emp(row any) Employee { return row.(Employee) } + +func tableColumns() []ui.AutoTableColumn { + return []ui.AutoTableColumn{ + { + Key: "name", DisplayName: "Name", Sortable: true, SortIdentifier: "Name", + CSV: true, CSVValue: func(r any) string { return emp(r).Name }, + // No Toggleable: the name is what identifies a row, so it cannot be hidden. + Cell: func(r any) *VNode { return ui.AutoTableTdLeft("text-neutral-800", Text(emp(r).Name)) }, + }, + { + Key: "email", DisplayName: "Email", Sortable: true, SortIdentifier: "Email", + Toggleable: true, CSV: true, CSVValue: func(r any) string { return emp(r).Email }, + Cell: func(r any) *VNode { return ui.AutoTableTdLeft("text-neutral-500", Text(emp(r).Email)) }, + }, + { + Key: "team", DisplayName: "Team", Sortable: true, SortIdentifier: "Team", + Toggleable: true, CSV: true, CSVValue: func(r any) string { return emp(r).Team }, + Cell: func(r any) *VNode { return ui.AutoTableTdLeft("", Text(emp(r).Team)) }, + }, + { + Key: "status", DisplayName: "Status", Sortable: true, SortIdentifier: "Status", + Toggleable: true, CSV: true, CSVValue: func(r any) string { return emp(r).Status }, + Cell: func(r any) *VNode { + color := ui.BadgeGreen + if emp(r).Status != "active" { + color = ui.BadgeNeutral + } + return ui.AutoTableTdLeft("", ui.Badge(ui.BadgeProps{Color: color}, Text(emp(r).Status))) + }, + }, + { + // SortTypeMoney parses "$1,200.50" as a number — a plain string sort would + // put $1,200.50 before $980.00. + Key: "salary", DisplayName: "Salary", DisplayPosition: ui.COL_POS_RIGHT, + Sortable: true, SortIdentifier: "Salary", SortType: ui.SortTypeMoney, + Toggleable: true, CSV: true, CSVValue: func(r any) string { return emp(r).Salary }, + Cell: func(r any) *VNode { return ui.AutoTableTdRight("tabular-nums", Text(emp(r).Salary)) }, + }, + { + Key: "bonus", DisplayName: "Bonus", DisplayPosition: ui.COL_POS_RIGHT, + Sortable: true, SortIdentifier: "Bonus", SortType: ui.SortTypeMoney, + Toggleable: true, CSV: true, CSVValue: func(r any) string { return emp(r).Bonus }, + Cell: func(r any) *VNode { return ui.AutoTableTdRight("tabular-nums", Text(emp(r).Bonus)) }, + }, + { + // SortTypeNumeric sorts "Item 2" before "Item 10". + Key: "rank", DisplayName: "Rank", Sortable: true, SortIdentifier: "Rank", + SortType: ui.SortTypeNumeric, Toggleable: true, HiddenByDefault: true, + CSV: true, CSVValue: func(r any) string { return emp(r).Rank }, + Cell: func(r any) *VNode { return ui.AutoTableTdLeft("", Text(emp(r).Rank)) }, + }, + } +} + +// newEmployeeTable builds the table controller. +// +// It is factored out of TablePage so a test can drive the very same table the page +// renders — the export test checks the bytes this exact configuration produces, +// rather than a second copy of it that could drift. +// +// The controller owns the search, sort, page, expansion and column state. Build it +// ONCE, never inside a render closure: rebuilding it per frame would reset every +// filter on each keystroke. + +func newEmployeeTable(highlight *Signal[string]) *ui.AutoTableState { + return ui.NewAutoTableState(tableColumns(), ui.AutoTableStateOptions{ + PerPage: 5, + + // The table PAGES ITSELF to wherever the highlighted row landed after + // filtering and sorting. + HighlightMatch: func(r any) bool { + return highlight.Get() != "" && emp(r).Email == highlight.Get() + }, + + // Calculated columns come in two shapes, and the difference is the thing to + // understand: + // + // BASIC — a function over OPERAND COLUMNS, combined ACROSS each row. + // Sum over [Salary, Bonus] is this row's salary + bonus. It does + // NOT total the column. Operands are column KEYS (SortIdentifier), + // and subtract/divide are binary and ORDERED. + // + // ADVANCED — an Excel-style formula, which names columns by DISPLAY name: + // [Salary] is this row's cell, {Salary} is the whole column, and + // {Salary:1:ROW()} is everything up to this row — a running total. + // + // Either way they are evaluated against the FILTERED, SORTED rows, so filtering + // re-runs them. (ToCalcNumber parses "$1,200.50" for you.) + Calculated: []ui.UserCalculatedColumn{ + { + // Basic: two columns, added together, per row. + ID: "comp", DisplayName: "Total comp", Fn: ui.CALC_FN_SUM, + Operands: []string{"Salary", "Bonus"}, + DataType: ui.CALC_TYPE_MONEY, DisplayPosition: ui.COL_POS_RIGHT, + }, + { + // Advanced: a formula. + ID: "annual", DisplayName: "Annual", Fn: ui.CALC_FN_CUSTOM, + Formula: "([Salary] + [Bonus]) * 12", DataType: ui.CALC_TYPE_MONEY, + DisplayPosition: ui.COL_POS_RIGHT, + }, + { + // Advanced, and position-dependent: a running total down the page. + ID: "running", DisplayName: "Running total", Fn: ui.CALC_FN_CUSTOM, + Formula: "SUM({Salary:1:ROW()})", DataType: ui.CALC_TYPE_MONEY, + DisplayPosition: ui.COL_POS_RIGHT, + }, + }, + // A summary row goes the OTHER way: one column, aggregated DOWN the whole + // filtered set — not just the page on screen. Basic mode does that with a + // function + one operand; this one uses a formula for the same thing. + SummaryRows: []ui.UserSummaryRow{ + {ID: "total", Label: "Total salary", Fn: ui.CALC_FN_SUM, + Operands: []string{"Salary"}, DataType: ui.CALC_TYPE_MONEY}, + {ID: "avg", Label: "Average salary", Fn: ui.CALC_FN_CUSTOM, + Formula: "AVERAGE({Salary})", DataType: ui.CALC_TYPE_MONEY}, + }, + + Accordion: true, + RowKey: func(r any) string { return emp(r).Email }, + AccordionContent: func(r any) *VNode { + return P(Attr("class", "px-4 py-2 text-sm text-neutral-600"), Text(emp(r).Note)) + }, + + Columns: ui.AutoTableColumnOptions{ + Toggleable: true, + Draggable: true, + Resizable: true, + StorageKey: "gowasm-example-employees", + }, + }) +} + +//gowasm:page /table layout=app static +func TablePage(d Deps) func() *VNode { + // Which row to spotlight, if any. + highlight := NewSignal("") + + table := newEmployeeTable(highlight) + table.SetRows(employees()) + + // The export menu, with a submenu for the PDF's page orientation. Both are + // controllers, both built once. A submenu is Standalone — opening it must not + // close the menu it lives in. + exportMenu := ui.NewMenu(ui.MenuOptions{Placement: ui.PlacementBottomEnd}) + pdfSub := ui.NewSubmenu(exportMenu) + + // What the PDF prints above the table. + // + // Note what is NOT here: the footer lines. The export takes the table's OWN + // summary rows — including any the user builds at runtime in the Calculated + // editor — and evaluates them against the same filtered rows it is printing. Only + // pass Summaries explicitly to print something that is not one of the table's own + // rows. + pdfHeader := func(landscape bool) ui.AutoTablePDFHeader { + orientation := ui.PDF_ORIENTATION_PORTRAIT + if landscape { + orientation = ui.PDF_ORIENTATION_LANDSCAPE + } + return ui.AutoTablePDFHeader{ + Title: "Employees", + Subtitle: "Exported from the gowasm example", + ShowDate: true, + Orientation: orientation, + } + } + + return func() *VNode { + return Div(Attr("class", "space-y-6"), + Div( + H2(Attr("class", "text-2xl font-semibold tracking-tight text-text-heading"), Text("AutoTable")), + P(Attr("class", "mt-1 text-neutral-500"), + Text("Filtering, sorting, pagination, expandable rows and column management — all in Go. "+ + "Drag a header to reorder, drag its right edge to resize; both persist across reloads.")), + ), + + table.Render( + ui.AutoTableWithHover(), + ui.AutoTableWithAlternate(), + ui.AutoTableWithSurroundingBorder(), + ui.AutoTableWithPaginationShowAll(), + ui.AutoTableWithSearchFields( + // One box, several fields: a global search. + table.GlobalSearch("Search name or email…", "Name", "Email"), + // Exact-match dropdown. + table.SelectSearch("Status", []string{"active", "inactive"}, "Any status"), + // IN-set: matches any of the selected teams. + table.MultiSelectSearch("Team", "Any team", []string{"Engineering", "Research", "Networking"}), + ), + ui.AutoTableWithToolbarActions( + table.ColumnPicker(), + + // Build calculated columns and footer rows at runtime. Basic picks a + // function and the columns it combines across each row; Advanced writes + // a formula, with insert menus for columns, functions and constants. + // The formula is compiled and previewed against the real first row as + // you type, so a typo shows up immediately rather than as a column of + // dashes. What you build is persisted with the rest of the layout. + table.CalculatedColumnEditor(), + + // Export writes what the FILTER selected — every matching row across + // every page — not the five rows on screen. And it writes the columns + // you can actually see, in the order you dragged them into. + exportMenu.TriggerFunc(ui.MenuTriggerProps{Tag: "div"}, func(open bool) *VNode { + return ui.Button(ui.ButtonProps{Color: ui.ButtonLightNeutral, Small: true, + Icon: "download", Text: "Export"}) + }), + exportMenu.Content("", + exportMenu.Item(ui.MenuItemProps{Icon: "file-csv", + OnClick: func() { table.DownloadCSV("employees") }}, Text("Download CSV")), + + // A submenu — portaled, so it is not clipped by the menu's own + // overflow-y-auto, which is what broke it before. + pdfSub.Submenu(ui.SubmenuProps{Trigger: "Download PDF", Icon: "file-pdf"}, + pdfSub.Item(ui.MenuItemProps{ + OnClick: func() { table.DownloadPDF("employees", pdfHeader(false)) }}, Text("Portrait")), + pdfSub.Item(ui.MenuItemProps{ + OnClick: func() { table.DownloadPDF("employees", pdfHeader(true)) }}, Text("Landscape")), + ), + + ui.MenuDivider(""), + exportMenu.Item(ui.MenuItemProps{Icon: "print", + OnClick: func() { table.PrintPDF(pdfHeader(true)) }}, Text("Print")), + ), + ), + ), + + // Highlight + auto-page-jump: Radia is on page 3 by default, and the table + // pages itself to wherever she actually is once filters and sorting move her. + row("flex flex-wrap items-center gap-2", + ui.Button(ui.ButtonProps{Color: ui.ButtonLightNeutral, Small: true, + Text: "Find Radia Perlman", + OnClick: func() { highlight.Set("radia@example.com") }}), + ui.Button(ui.ButtonProps{Color: ui.ButtonLightNeutral, Small: true, + Text: "Clear highlight", + OnClick: func() { highlight.Set("") }}), + ), + + ui.Alert(ui.AlertBlue, "What to try", + Text("Search (it matches name OR email); pick a status; select several teams. Sort by Salary — "+ + "it parses the currency, so $980 sorts below $1,200.50. Unhide Rank and sort it: 'Item 2' "+ + "comes before 'Item 10'. Click a row to expand it. Drag a header to reorder, drag its right "+ + "edge to resize — both survive a reload. Filter the table, then export: you get every "+ + "matching row, not just this page. 'Find Radia' jumps to whichever page she is on.")), + ) + } +} diff --git a/go/cmd/examples/go-wasm-web/css/app.css b/go/cmd/examples/go-wasm-web/css/app.css index b4367c30..c0d7709d 100644 --- a/go/cmd/examples/go-wasm-web/css/app.css +++ b/go/cmd/examples/go-wasm-web/css/app.css @@ -1,5 +1,59 @@ @import "tailwindcss"; +/* --------------------------------------------------------------------------- + Lora, vendored from Google Fonts — self-hosted, not linked. + --------------------------------------------------------------------------- + The files live in wwwroot/fonts (served by the dev server straight out of + ./wwwroot), so the app pulls no third-party request at runtime: no CDN to be + blocked, no extra DNS round trip, and no dependency on fonts.gstatic.com being + up. It is a VARIABLE font, so ONE file per style covers weights 400-700 — + hence "font-weight: 400 700" rather than a file per weight. + + Only the latin and latin-ext subsets are vendored (~120 KB in total). The + unicode-range on each face is what lets the browser skip downloading latin-ext + entirely unless the page actually uses a character from it. + + To refresh: fetch + https://fonts.googleapis.com/css2?family=Lora:ital,wght@0,400..700;1,400..700 + and re-download the woff2 URLs it names. + --------------------------------------------------------------------------- */ + +@font-face { + font-family: "Lora"; + font-style: italic; + font-weight: 400 700; /* a variable font: one file covers the whole range */ + font-display: swap; + src: url("/fonts/lora-latin-ext-italic.woff2") format("woff2"); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} + +@font-face { + font-family: "Lora"; + font-style: italic; + font-weight: 400 700; /* a variable font: one file covers the whole range */ + font-display: swap; + src: url("/fonts/lora-latin-italic.woff2") format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} + +@font-face { + font-family: "Lora"; + font-style: normal; + font-weight: 400 700; /* a variable font: one file covers the whole range */ + font-display: swap; + src: url("/fonts/lora-latin-ext-normal.woff2") format("woff2"); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} + +@font-face { + font-family: "Lora"; + font-style: normal; + font-weight: 400 700; /* a variable font: one file covers the whole range */ + font-display: swap; + src: url("/fonts/lora-latin-normal.woff2") format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} + /* App-side design tokens the webui kit references (Tailwind v4 @theme). Brand values live with the app; the kit stays generic. */ @theme { @@ -11,4 +65,11 @@ --color-text-heading: #111827; --color-text-on-dark: #f9fafb; --color-text-on-dark-muted: #9ca3af; + + /* Lora is the body face. Declaring it as --font-sans makes it the default for + everything (Tailwind's preflight sets `font-family: var(--font-sans)` on + html), and also gives you `font-sans` as a utility. --font-serif points at it + too, so `font-serif` is not a different, unvendored face. */ + --font-sans: "Lora", ui-serif, Georgia, Cambria, "Times New Roman", serif; + --font-serif: "Lora", ui-serif, Georgia, Cambria, "Times New Roman", serif; } diff --git a/go/cmd/examples/go-wasm-web/server/main.go b/go/cmd/examples/go-wasm-web/server/main.go index 6cb2fb6e..ce8bf56a 100644 --- a/go/cmd/examples/go-wasm-web/server/main.go +++ b/go/cmd/examples/go-wasm-web/server/main.go @@ -60,7 +60,7 @@ func sampleQuotes() []app.Quote { } // render SSRs a static route's #app inner HTML; ok=false ships an empty #app -// (client-rendered). It's the same neutral render the client runs, so the client +// (client-rendered). It is the same neutral render the client runs, so the client // hydrates it. func render(path string) (string, bool) { if !app.StaticPaths[path] { diff --git a/go/cmd/examples/go-wasm-web/wwwroot/app.css b/go/cmd/examples/go-wasm-web/wwwroot/app.css index e176512b..7aac5cdc 100644 --- a/go/cmd/examples/go-wasm-web/wwwroot/app.css +++ b/go/cmd/examples/go-wasm-web/wwwroot/app.css @@ -1,6 +1,5 @@ -@layer theme,base,components,utilities;@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', - 'Noto Color Emoji';--font-serif:ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', - monospace;--color-red-50:oklch(97.1% 0.013 17.38);--color-red-100:oklch(93.6% 0.032 17.717);--color-red-200:oklch(88.5% 0.062 18.334);--color-red-300:oklch(80.8% 0.114 19.571);--color-red-400:oklch(70.4% 0.191 22.216);--color-red-500:oklch(63.7% 0.237 25.331);--color-red-600:oklch(57.7% 0.245 27.325);--color-red-700:oklch(50.5% 0.213 27.518);--color-red-800:oklch(44.4% 0.177 26.899);--color-red-900:oklch(39.6% 0.141 25.723);--color-red-950:oklch(25.8% 0.092 26.042);--color-orange-50:oklch(98% 0.016 73.684);--color-orange-100:oklch(95.4% 0.038 75.164);--color-orange-200:oklch(90.1% 0.076 70.697);--color-orange-300:oklch(83.7% 0.128 66.29);--color-orange-400:oklch(75% 0.183 55.934);--color-orange-500:oklch(70.5% 0.213 47.604);--color-orange-600:oklch(64.6% 0.222 41.116);--color-orange-700:oklch(55.3% 0.195 38.402);--color-orange-800:oklch(47% 0.157 37.304);--color-orange-900:oklch(40.8% 0.123 38.172);--color-orange-950:oklch(26.6% 0.079 36.259);--color-amber-50:oklch(98.7% 0.022 95.277);--color-amber-100:oklch(96.2% 0.059 95.617);--color-amber-200:oklch(92.4% 0.12 95.746);--color-amber-300:oklch(87.9% 0.169 91.605);--color-amber-400:oklch(82.8% 0.189 84.429);--color-amber-500:oklch(76.9% 0.188 70.08);--color-amber-600:oklch(66.6% 0.179 58.318);--color-amber-700:oklch(55.5% 0.163 48.998);--color-amber-800:oklch(47.3% 0.137 46.201);--color-amber-900:oklch(41.4% 0.112 45.904);--color-amber-950:oklch(27.9% 0.077 45.635);--color-yellow-50:oklch(98.7% 0.026 102.212);--color-yellow-100:oklch(97.3% 0.071 103.193);--color-yellow-200:oklch(94.5% 0.129 101.54);--color-yellow-300:oklch(90.5% 0.182 98.111);--color-yellow-400:oklch(85.2% 0.199 91.936);--color-yellow-500:oklch(79.5% 0.184 86.047);--color-yellow-600:oklch(68.1% 0.162 75.834);--color-yellow-700:oklch(55.4% 0.135 66.442);--color-yellow-800:oklch(47.6% 0.114 61.907);--color-yellow-900:oklch(42.1% 0.095 57.708);--color-yellow-950:oklch(28.6% 0.066 53.813);--color-lime-50:oklch(98.6% 0.031 120.757);--color-lime-100:oklch(96.7% 0.067 122.328);--color-lime-200:oklch(93.8% 0.127 124.321);--color-lime-300:oklch(89.7% 0.196 126.665);--color-lime-400:oklch(84.1% 0.238 128.85);--color-lime-500:oklch(76.8% 0.233 130.85);--color-lime-600:oklch(64.8% 0.2 131.684);--color-lime-700:oklch(53.2% 0.157 131.589);--color-lime-800:oklch(45.3% 0.124 130.933);--color-lime-900:oklch(40.5% 0.101 131.063);--color-lime-950:oklch(27.4% 0.072 132.109);--color-green-50:oklch(98.2% 0.018 155.826);--color-green-100:oklch(96.2% 0.044 156.743);--color-green-200:oklch(92.5% 0.084 155.995);--color-green-300:oklch(87.1% 0.15 154.449);--color-green-400:oklch(79.2% 0.209 151.711);--color-green-500:oklch(72.3% 0.219 149.579);--color-green-600:oklch(62.7% 0.194 149.214);--color-green-700:oklch(52.7% 0.154 150.069);--color-green-800:oklch(44.8% 0.119 151.328);--color-green-900:oklch(39.3% 0.095 152.535);--color-green-950:oklch(26.6% 0.065 152.934);--color-emerald-50:oklch(97.9% 0.021 166.113);--color-emerald-100:oklch(95% 0.052 163.051);--color-emerald-200:oklch(90.5% 0.093 164.15);--color-emerald-300:oklch(84.5% 0.143 164.978);--color-emerald-400:oklch(76.5% 0.177 163.223);--color-emerald-500:oklch(69.6% 0.17 162.48);--color-emerald-600:oklch(59.6% 0.145 163.225);--color-emerald-700:oklch(50.8% 0.118 165.612);--color-emerald-800:oklch(43.2% 0.095 166.913);--color-emerald-900:oklch(37.8% 0.077 168.94);--color-emerald-950:oklch(26.2% 0.051 172.552);--color-teal-50:oklch(98.4% 0.014 180.72);--color-teal-100:oklch(95.3% 0.051 180.801);--color-teal-200:oklch(91% 0.096 180.426);--color-teal-300:oklch(85.5% 0.138 181.071);--color-teal-400:oklch(77.7% 0.152 181.912);--color-teal-500:oklch(70.4% 0.14 182.503);--color-teal-600:oklch(60% 0.118 184.704);--color-teal-700:oklch(51.1% 0.096 186.391);--color-teal-800:oklch(43.7% 0.078 188.216);--color-teal-900:oklch(38.6% 0.063 188.416);--color-teal-950:oklch(27.7% 0.046 192.524);--color-cyan-50:oklch(98.4% 0.019 200.873);--color-cyan-100:oklch(95.6% 0.045 203.388);--color-cyan-200:oklch(91.7% 0.08 205.041);--color-cyan-300:oklch(86.5% 0.127 207.078);--color-cyan-400:oklch(78.9% 0.154 211.53);--color-cyan-500:oklch(71.5% 0.143 215.221);--color-cyan-600:oklch(60.9% 0.126 221.723);--color-cyan-700:oklch(52% 0.105 223.128);--color-cyan-800:oklch(45% 0.085 224.283);--color-cyan-900:oklch(39.8% 0.07 227.392);--color-cyan-950:oklch(30.2% 0.056 229.695);--color-sky-50:oklch(97.7% 0.013 236.62);--color-sky-100:oklch(95.1% 0.026 236.824);--color-sky-200:oklch(90.1% 0.058 230.902);--color-sky-300:oklch(82.8% 0.111 230.318);--color-sky-400:oklch(74.6% 0.16 232.661);--color-sky-500:oklch(68.5% 0.169 237.323);--color-sky-600:oklch(58.8% 0.158 241.966);--color-sky-700:oklch(50% 0.134 242.749);--color-sky-800:oklch(44.3% 0.11 240.79);--color-sky-900:oklch(39.1% 0.09 240.876);--color-sky-950:oklch(29.3% 0.066 243.157);--color-blue-50:oklch(97% 0.014 254.604);--color-blue-100:oklch(93.2% 0.032 255.585);--color-blue-200:oklch(88.2% 0.059 254.128);--color-blue-300:oklch(80.9% 0.105 251.813);--color-blue-400:oklch(70.7% 0.165 254.624);--color-blue-500:oklch(62.3% 0.214 259.815);--color-blue-600:oklch(54.6% 0.245 262.881);--color-blue-700:oklch(48.8% 0.243 264.376);--color-blue-800:oklch(42.4% 0.199 265.638);--color-blue-900:oklch(37.9% 0.146 265.522);--color-blue-950:oklch(28.2% 0.091 267.935);--color-indigo-50:oklch(96.2% 0.018 272.314);--color-indigo-100:oklch(93% 0.034 272.788);--color-indigo-200:oklch(87% 0.065 274.039);--color-indigo-300:oklch(78.5% 0.115 274.713);--color-indigo-400:oklch(67.3% 0.182 276.935);--color-indigo-500:oklch(58.5% 0.233 277.117);--color-indigo-600:oklch(51.1% 0.262 276.966);--color-indigo-700:oklch(45.7% 0.24 277.023);--color-indigo-800:oklch(39.8% 0.195 277.366);--color-indigo-900:oklch(35.9% 0.144 278.697);--color-indigo-950:oklch(25.7% 0.09 281.288);--color-violet-50:oklch(96.9% 0.016 293.756);--color-violet-100:oklch(94.3% 0.029 294.588);--color-violet-200:oklch(89.4% 0.057 293.283);--color-violet-300:oklch(81.1% 0.111 293.571);--color-violet-400:oklch(70.2% 0.183 293.541);--color-violet-500:oklch(60.6% 0.25 292.717);--color-violet-600:oklch(54.1% 0.281 293.009);--color-violet-700:oklch(49.1% 0.27 292.581);--color-violet-800:oklch(43.2% 0.232 292.759);--color-violet-900:oklch(38% 0.189 293.745);--color-violet-950:oklch(28.3% 0.141 291.089);--color-purple-50:oklch(97.7% 0.014 308.299);--color-purple-100:oklch(94.6% 0.033 307.174);--color-purple-200:oklch(90.2% 0.063 306.703);--color-purple-300:oklch(82.7% 0.119 306.383);--color-purple-400:oklch(71.4% 0.203 305.504);--color-purple-500:oklch(62.7% 0.265 303.9);--color-purple-600:oklch(55.8% 0.288 302.321);--color-purple-700:oklch(49.6% 0.265 301.924);--color-purple-800:oklch(43.8% 0.218 303.724);--color-purple-900:oklch(38.1% 0.176 304.987);--color-purple-950:oklch(29.1% 0.149 302.717);--color-fuchsia-50:oklch(97.7% 0.017 320.058);--color-fuchsia-100:oklch(95.2% 0.037 318.852);--color-fuchsia-200:oklch(90.3% 0.076 319.62);--color-fuchsia-300:oklch(83.3% 0.145 321.434);--color-fuchsia-400:oklch(74% 0.238 322.16);--color-fuchsia-500:oklch(66.7% 0.295 322.15);--color-fuchsia-600:oklch(59.1% 0.293 322.896);--color-fuchsia-700:oklch(51.8% 0.253 323.949);--color-fuchsia-800:oklch(45.2% 0.211 324.591);--color-fuchsia-900:oklch(40.1% 0.17 325.612);--color-fuchsia-950:oklch(29.3% 0.136 325.661);--color-pink-50:oklch(97.1% 0.014 343.198);--color-pink-100:oklch(94.8% 0.028 342.258);--color-pink-200:oklch(89.9% 0.061 343.231);--color-pink-300:oklch(82.3% 0.12 346.018);--color-pink-400:oklch(71.8% 0.202 349.761);--color-pink-500:oklch(65.6% 0.241 354.308);--color-pink-600:oklch(59.2% 0.249 0.584);--color-pink-700:oklch(52.5% 0.223 3.958);--color-pink-800:oklch(45.9% 0.187 3.815);--color-pink-900:oklch(40.8% 0.153 2.432);--color-pink-950:oklch(28.4% 0.109 3.907);--color-rose-50:oklch(96.9% 0.015 12.422);--color-rose-100:oklch(94.1% 0.03 12.58);--color-rose-200:oklch(89.2% 0.058 10.001);--color-rose-300:oklch(81% 0.117 11.638);--color-rose-400:oklch(71.2% 0.194 13.428);--color-rose-500:oklch(64.5% 0.246 16.439);--color-rose-600:oklch(58.6% 0.253 17.585);--color-rose-700:oklch(51.4% 0.222 16.935);--color-rose-800:oklch(45.5% 0.188 13.697);--color-rose-900:oklch(41% 0.159 10.272);--color-rose-950:oklch(27.1% 0.105 12.094);--color-slate-50:oklch(98.4% 0.003 247.858);--color-slate-100:oklch(96.8% 0.007 247.896);--color-slate-200:oklch(92.9% 0.013 255.508);--color-slate-300:oklch(86.9% 0.022 252.894);--color-slate-400:oklch(70.4% 0.04 256.788);--color-slate-500:oklch(55.4% 0.046 257.417);--color-slate-600:oklch(44.6% 0.043 257.281);--color-slate-700:oklch(37.2% 0.044 257.287);--color-slate-800:oklch(27.9% 0.041 260.031);--color-slate-900:oklch(20.8% 0.042 265.755);--color-slate-950:oklch(12.9% 0.042 264.695);--color-gray-50:oklch(98.5% 0.002 247.839);--color-gray-100:oklch(96.7% 0.003 264.542);--color-gray-200:oklch(92.8% 0.006 264.531);--color-gray-300:oklch(87.2% 0.01 258.338);--color-gray-400:oklch(70.7% 0.022 261.325);--color-gray-500:oklch(55.1% 0.027 264.364);--color-gray-600:oklch(44.6% 0.03 256.802);--color-gray-700:oklch(37.3% 0.034 259.733);--color-gray-800:oklch(27.8% 0.033 256.848);--color-gray-900:oklch(21% 0.034 264.665);--color-gray-950:oklch(13% 0.028 261.692);--color-zinc-50:oklch(98.5% 0 0);--color-zinc-100:oklch(96.7% 0.001 286.375);--color-zinc-200:oklch(92% 0.004 286.32);--color-zinc-300:oklch(87.1% 0.006 286.286);--color-zinc-400:oklch(70.5% 0.015 286.067);--color-zinc-500:oklch(55.2% 0.016 285.938);--color-zinc-600:oklch(44.2% 0.017 285.786);--color-zinc-700:oklch(37% 0.013 285.805);--color-zinc-800:oklch(27.4% 0.006 286.033);--color-zinc-900:oklch(21% 0.006 285.885);--color-zinc-950:oklch(14.1% 0.005 285.823);--color-neutral-50:oklch(98.5% 0 0);--color-neutral-100:oklch(97% 0 0);--color-neutral-200:oklch(92.2% 0 0);--color-neutral-300:oklch(87% 0 0);--color-neutral-400:oklch(70.8% 0 0);--color-neutral-500:oklch(55.6% 0 0);--color-neutral-600:oklch(43.9% 0 0);--color-neutral-700:oklch(37.1% 0 0);--color-neutral-800:oklch(26.9% 0 0);--color-neutral-900:oklch(20.5% 0 0);--color-neutral-950:oklch(14.5% 0 0);--color-stone-50:oklch(98.5% 0.001 106.423);--color-stone-100:oklch(97% 0.001 106.424);--color-stone-200:oklch(92.3% 0.003 48.717);--color-stone-300:oklch(86.9% 0.005 56.366);--color-stone-400:oklch(70.9% 0.01 56.259);--color-stone-500:oklch(55.3% 0.013 58.071);--color-stone-600:oklch(44.4% 0.011 73.639);--color-stone-700:oklch(37.4% 0.01 67.558);--color-stone-800:oklch(26.8% 0.007 34.298);--color-stone-900:oklch(21.6% 0.006 56.043);--color-stone-950:oklch(14.7% 0.004 49.25);--color-mauve-50:oklch(98.5% 0 0);--color-mauve-100:oklch(96% 0.003 325.6);--color-mauve-200:oklch(92.2% 0.005 325.62);--color-mauve-300:oklch(86.5% 0.012 325.68);--color-mauve-400:oklch(71.1% 0.019 323.02);--color-mauve-500:oklch(54.2% 0.034 322.5);--color-mauve-600:oklch(43.5% 0.029 321.78);--color-mauve-700:oklch(36.4% 0.029 323.89);--color-mauve-800:oklch(26.3% 0.024 320.12);--color-mauve-900:oklch(21.2% 0.019 322.12);--color-mauve-950:oklch(14.5% 0.008 326);--color-olive-50:oklch(98.8% 0.003 106.5);--color-olive-100:oklch(96.6% 0.005 106.5);--color-olive-200:oklch(93% 0.007 106.5);--color-olive-300:oklch(88% 0.011 106.6);--color-olive-400:oklch(73.7% 0.021 106.9);--color-olive-500:oklch(58% 0.031 107.3);--color-olive-600:oklch(46.6% 0.025 107.3);--color-olive-700:oklch(39.4% 0.023 107.4);--color-olive-800:oklch(28.6% 0.016 107.4);--color-olive-900:oklch(22.8% 0.013 107.4);--color-olive-950:oklch(15.3% 0.006 107.1);--color-mist-50:oklch(98.7% 0.002 197.1);--color-mist-100:oklch(96.3% 0.002 197.1);--color-mist-200:oklch(92.5% 0.005 214.3);--color-mist-300:oklch(87.2% 0.007 219.6);--color-mist-400:oklch(72.3% 0.014 214.4);--color-mist-500:oklch(56% 0.021 213.5);--color-mist-600:oklch(45% 0.017 213.2);--color-mist-700:oklch(37.8% 0.015 216);--color-mist-800:oklch(27.5% 0.011 216.9);--color-mist-900:oklch(21.8% 0.008 223.9);--color-mist-950:oklch(14.8% 0.004 228.8);--color-taupe-50:oklch(98.6% 0.002 67.8);--color-taupe-100:oklch(96% 0.002 17.2);--color-taupe-200:oklch(92.2% 0.005 34.3);--color-taupe-300:oklch(86.8% 0.007 39.5);--color-taupe-400:oklch(71.4% 0.014 41.2);--color-taupe-500:oklch(54.7% 0.021 43.1);--color-taupe-600:oklch(43.8% 0.017 39.3);--color-taupe-700:oklch(36.7% 0.016 35.7);--color-taupe-800:oklch(26.8% 0.011 36.5);--color-taupe-900:oklch(21.4% 0.009 43.1);--color-taupe-950:oklch(14.7% 0.004 49.3);--color-black:#000;--color-white:#fff;--spacing:0.25rem;--breakpoint-sm:40rem;--breakpoint-md:48rem;--breakpoint-lg:64rem;--breakpoint-xl:80rem;--breakpoint-2xl:96rem;--container-3xs:16rem;--container-2xs:18rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:0.75rem;--text-xs--line-height:calc(1 / 0.75);--text-sm:0.875rem;--text-sm--line-height:calc(1.25 / 0.875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--text-7xl:4.5rem;--text-7xl--line-height:1;--text-8xl:6rem;--text-8xl--line-height:1;--text-9xl:8rem;--text-9xl--line-height:1;--font-weight-thin:100;--font-weight-extralight:200;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--tracking-tighter:-0.05em;--tracking-tight:-0.025em;--tracking-normal:0em;--tracking-wide:0.025em;--tracking-wider:0.05em;--tracking-widest:0.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-normal:1.5;--leading-relaxed:1.625;--leading-loose:2;--radius-xs:0.125rem;--radius-sm:0.25rem;--radius-md:0.375rem;--radius-lg:0.5rem;--radius-xl:0.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--radius-4xl:2rem;--shadow-2xs:0 1px rgb(0 0 0 / 0.05);--shadow-xs:0 1px 2px 0 rgb(0 0 0 / 0.05);--shadow-sm:0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);--shadow-md:0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);--shadow-lg:0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);--shadow-xl:0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);--shadow-2xl:0 25px 50px -12px rgb(0 0 0 / 0.25);--inset-shadow-2xs:inset 0 1px rgb(0 0 0 / 0.05);--inset-shadow-xs:inset 0 1px 1px rgb(0 0 0 / 0.05);--inset-shadow-sm:inset 0 2px 4px rgb(0 0 0 / 0.05);--drop-shadow-xs:0 1px 1px rgb(0 0 0 / 0.05);--drop-shadow-sm:0 1px 2px rgb(0 0 0 / 0.15);--drop-shadow-md:0 3px 3px rgb(0 0 0 / 0.12);--drop-shadow-lg:0 4px 4px rgb(0 0 0 / 0.15);--drop-shadow-xl:0 9px 7px rgb(0 0 0 / 0.1);--drop-shadow-2xl:0 25px 25px rgb(0 0 0 / 0.15);--text-shadow-2xs:0px 1px 0px rgb(0 0 0 / 0.15);--text-shadow-xs:0px 1px 1px rgb(0 0 0 / 0.2);--text-shadow-sm:0px 1px 0px rgb(0 0 0 / 0.075), 0px 1px 1px rgb(0 0 0 / 0.075), 0px 2px 2px rgb(0 0 0 / 0.075);--text-shadow-md:0px 1px 1px rgb(0 0 0 / 0.1), 0px 1px 2px rgb(0 0 0 / 0.1), 0px 2px 4px rgb(0 0 0 / 0.1);--text-shadow-lg:0px 1px 2px rgb(0 0 0 / 0.1), 0px 3px 2px rgb(0 0 0 / 0.1), 0px 4px 8px rgb(0 0 0 / 0.1);--ease-in:cubic-bezier(0.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, 0.2, 1);--ease-in-out:cubic-bezier(0.4, 0, 0.2, 1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;--animate-bounce:bounce 1s infinite;--blur-xs:4px;--blur-sm:8px;--blur-md:12px;--blur-lg:16px;--blur-xl:24px;--blur-2xl:40px;--blur-3xl:64px;--perspective-dramatic:100px;--perspective-near:300px;--perspective-normal:500px;--perspective-midrange:800px;--perspective-distant:1200px;--aspect-video:16 / 9;--default-transition-duration:150ms;--default-transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);--default-font-family:var(--font-sans);--default-font-feature-settings:initial;--default-font-variation-settings:initial;--default-mono-font-family:var(--font-mono);--default-mono-font-feature-settings:initial;--default-mono-font-variation-settings:initial;--radius-default:0.375rem;--color-primary:#4f46e5;--color-primary-hover:#4338ca;--color-text-heading:#111827;--color-text-on-dark:#f9fafb;--color-text-on-dark-muted:#9ca3af}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,100%{transform:scale(2);opacity:0}}@keyframes pulse{50%{opacity:.5}}@keyframes bounce{0%,100%{transform:translateY(-25%);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;animation-timing-function:cubic-bezier(0,0,.2,1)}}@layer base{*,::after,::before,::backdrop,::file-selector-button{box-sizing:border-box;margin:0;padding:0;border:0 solid}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;tab-size:4;font-family:--theme( --default-font-family,ui-sans-serif,system-ui,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol','Noto Color Emoji' );font-feature-settings:--theme(--default-font-feature-settings,normal);font-variation-settings:--theme(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:--theme( --default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,'Liberation Mono','Courier New',monospace );font-feature-settings:--theme(--default-mono-font-feature-settings,normal);font-variation-settings:--theme(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea,::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;border-radius:0;background-color:initial;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports(not (-webkit-appearance:-apple-pay-button)) or (contain-intrinsic-size:1px){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]),::file-selector-button{appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.inset-y-0{inset-block:0}.-top-\[6px\]{top:calc(6px * -1)}.top-0{top:0}.top-1\/2{top:calc(1/2 * 100%)}.top-20{top:calc(var(--spacing) * 20)}.top-4{top:calc(var(--spacing) * 4)}.top-full{top:100%}.-right-2{right:calc(var(--spacing) * -2)}.-right-\[6px\]{right:calc(6px * -1)}.right-0{right:0}.right-0\.5{right:calc(var(--spacing) * .5)}.right-4{right:calc(var(--spacing) * 4)}.right-8{right:calc(var(--spacing) * 8)}.right-full{right:100%}.-bottom-\[6px\]{bottom:calc(6px * -1)}.bottom-0{bottom:0}.bottom-4{bottom:calc(var(--spacing) * 4)}.bottom-full{bottom:100%}.-left-\[6px\]{left:calc(6px * -1)}.left-0{left:0}.left-1\/2{left:calc(1/2 * 100%)}.left-4{left:calc(var(--spacing) * 4)}.left-full{left:100%}.isolate{isolation:isolate}.z-10{z-index:10}.z-150{z-index:150}.z-200{z-index:200}.z-50{z-index:50}.z-\[100\]{z-index:100}.z-\[110\]{z-index:110}.z-\[1\]{z-index:1}.z-\[200\]{z-index:200}.z-\[51\]{z-index:51}.col-span-1{grid-column:span 1/span 1}.m-0{margin:0}.-mx-1\.5{margin-inline:calc(var(--spacing) * -1.5)}.mx-3{margin-inline:calc(var(--spacing) * 3)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mx-\[0\.15rem\]{margin-inline:.15rem}.mx-auto{margin-inline:auto}.my-1{margin-block:var(--spacing)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-1{margin-right:var(--spacing)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-5{margin-right:calc(var(--spacing) * 5)}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-square{aspect-ratio:1/1}.h-0{height:0}.h-0\.5{height:calc(var(--spacing) * .5)}.h-1{height:var(--spacing)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-72{height:calc(var(--spacing) * 72)}.h-8{height:calc(var(--spacing) * 8)}.h-\[30px\]{height:30px}.h-\[38px\]{height:38px}.h-dvh{height:100dvh}.h-full{height:100%}.h-screen{height:100vh}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[calc\(100dvh_-_5rem\)\]{max-height:calc(100dvh - 5rem)}.max-h-\[calc\(100vh_-_7rem\)\]{max-height:calc(100vh - 7rem)}.max-h-dvh{max-height:100dvh}.min-h-0{min-height:0}.min-h-9{min-height:calc(var(--spacing) * 9)}.min-h-\[6\.5rem\]{min-height:6.5rem}.min-h-screen{min-height:100vh}.w-0{width:0}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-4{width:calc(var(--spacing) * 4)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-auto{width:auto}.w-full{width:100%}.w-max{width:max-content}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-64{max-width:calc(var(--spacing) * 64)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-80{max-width:calc(var(--spacing) * 80)}.max-w-\[11rem\]{max-width:11rem}.max-w-\[14rem\]{max-width:14rem}.max-w-\[16rem\]{max-width:16rem}.max-w-\[20rem\]{max-width:20rem}.max-w-\[90rem\]{max-width:90rem}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-screen{max-width:100vw}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-48{min-width:calc(var(--spacing) * 48)}.min-w-5{min-width:calc(var(--spacing) * 5)}.min-w-72{min-width:calc(var(--spacing) * 72)}.min-w-8{min-width:calc(var(--spacing) * 8)}.min-w-\[10rem\]{min-width:10rem}.min-w-\[16rem\]{min-width:16rem}.min-w-\[240px\]{min-width:240px}.min-w-\[7rem\]{min-width:7rem}.min-w-\[8rem\]{min-width:8rem}.min-w-\[9rem\]{min-width:9rem}.min-w-full{min-width:100%}.flex-1{flex:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.table-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-0\.5{--tw-translate-x:calc(var(--spacing) * 0.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-\[18px\]{--tw-translate-x:18px;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x)var(--tw-translate-y)}.scale-110{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x)var(--tw-scale-y)}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-\[2px\]{gap:2px}.space-y-6{ :where(& > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse))); }}.space-y-8{ :where(& > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse))); }}.self-end{align-self:flex-end}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-default{border-radius:var(--radius-default)}.rounded-full{border-radius:calc(infinity * 1px)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-l-default{border-top-left-radius:var(--radius-default);border-bottom-left-radius:var(--radius-default)}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-b-default{border-bottom-right-radius:var(--radius-default);border-bottom-left-radius:var(--radius-default)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-4{border-style:var(--tw-border-style);border-width:4px}.border-x{border-inline-style:var(--tw-border-style);border-inline-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-t-\[6px\]{border-top-style:var(--tw-border-style);border-top-width:6px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-r-0{border-right-style:var(--tw-border-style);border-right-width:0}.border-r-\[6px\]{border-right-style:var(--tw-border-style);border-right-width:6px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-b-\[6px\]{border-bottom-style:var(--tw-border-style);border-bottom-width:6px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-l-\[6px\]{border-left-style:var(--tw-border-style);border-left-width:6px}.border-none{--tw-border-style:none;border-style:none}.border-emerald-300{border-color:var(--color-emerald-300)}.border-green-200{border-color:var(--color-green-200)}.border-green-500{border-color:var(--color-green-500)}.border-neutral-100{border-color:var(--color-neutral-100)}.border-neutral-200{border-color:var(--color-neutral-200)}.border-neutral-300{border-color:var(--color-neutral-300)}.border-neutral-700{border-color:var(--color-neutral-700)}.border-neutral-800{border-color:var(--color-neutral-800)}.border-primary{border-color:var(--color-primary)}.border-red-200{border-color:var(--color-red-200)}.border-red-500{border-color:var(--color-red-500)}.border-sky-200{border-color:var(--color-sky-200)}.border-sky-700{border-color:var(--color-sky-700)}.border-yellow-200{border-color:var(--color-yellow-200)}.border-t-neutral-800{border-top-color:var(--color-neutral-800)}.border-t-sky-700{border-top-color:var(--color-sky-700)}.border-t-transparent{border-top-color:transparent}.border-r-neutral-800{border-right-color:var(--color-neutral-800)}.border-r-transparent{border-right-color:transparent}.border-b-neutral-800{border-bottom-color:var(--color-neutral-800)}.border-b-transparent{border-bottom-color:transparent}.border-l-green-700{border-left-color:var(--color-green-700)}.border-l-neutral-300{border-left-color:var(--color-neutral-300)}.border-l-neutral-400{border-left-color:var(--color-neutral-400)}.border-l-neutral-800{border-left-color:var(--color-neutral-800)}.border-l-red-700{border-left-color:var(--color-red-700)}.border-l-sky-800{border-left-color:var(--color-sky-800)}.border-l-transparent{border-left-color:transparent}.border-l-yellow-500{border-left-color:var(--color-yellow-500)}.\!bg-primary{background-color:var(--color-primary)!important}.bg-amber-100{background-color:var(--color-amber-100)}.bg-amber-700{background-color:var(--color-amber-700)}.bg-black\/10{background-color:color-mix(in oklab,var(--color-black) 10%,transparent)}.bg-black\/30{background-color:color-mix(in oklab,var(--color-black) 30%,transparent)}.bg-black\/5{background-color:color-mix(in oklab,var(--color-black) 5%,transparent)}.bg-black\/50{background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-700{background-color:var(--color-green-700)}.bg-green-900{background-color:var(--color-green-900)}.bg-neutral-100{background-color:var(--color-neutral-100)}.bg-neutral-200{background-color:var(--color-neutral-200)}.bg-neutral-300{background-color:var(--color-neutral-300)}.bg-neutral-50{background-color:var(--color-neutral-50)}.bg-neutral-500{background-color:var(--color-neutral-500)}.bg-neutral-600{background-color:var(--color-neutral-600)}.bg-neutral-700{background-color:var(--color-neutral-700)}.bg-neutral-800{background-color:var(--color-neutral-800)}.bg-neutral-900{background-color:var(--color-neutral-900)}.bg-orange-500{background-color:var(--color-orange-500)}.bg-orange-600{background-color:var(--color-orange-600)}.bg-primary{background-color:var(--color-primary)}.bg-primary\/10{background-color:color-mix(in oklab,var(--color-primary) 10%,transparent)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-600{background-color:var(--color-red-600)}.bg-red-700{background-color:var(--color-red-700)}.bg-red-900{background-color:var(--color-red-900)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-sky-600{background-color:var(--color-sky-600)}.bg-sky-700{background-color:var(--color-sky-700)}.bg-sky-800{background-color:var(--color-sky-800)}.bg-sky-900{background-color:var(--color-sky-900)}.bg-transparent{background-color:initial}.bg-white{background-color:var(--color-white)}.bg-white\/10{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}.bg-yellow-400{background-color:var(--color-yellow-400)}.bg-yellow-50{background-color:var(--color-yellow-50)}.bg-yellow-700{background-color:var(--color-yellow-700)}.fill-current{fill:currentcolor}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-8{padding:calc(var(--spacing) * 8)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-7{padding-inline:calc(var(--spacing) * 7)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-px{padding-block:1px}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-10{padding-top:calc(var(--spacing) * 10)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-14{padding-right:calc(var(--spacing) * 14)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-9{padding-right:calc(var(--spacing) * 9)}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-\[calc\(1rem_\+_env\(safe-area-inset-bottom\,0px\)\)\]{padding-bottom:calc(1rem + env(safe-area-inset-bottom,0px))}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-\[inherit\]{font-family:inherit}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.5rem\]{font-size:.5rem}.text-\[10px\]{font-size:10px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.whitespace-nowrap{white-space:nowrap}.\!text-white{color:var(--color-white)!important}.text-amber-600{color:var(--color-amber-600)}.text-black{color:var(--color-black)}.text-current{color:currentcolor}.text-emerald-700{color:var(--color-emerald-700)}.text-gray-900{color:var(--color-gray-900)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-green-900{color:var(--color-green-900)}.text-neutral-100{color:var(--color-neutral-100)}.text-neutral-200{color:var(--color-neutral-200)}.text-neutral-300{color:var(--color-neutral-300)}.text-neutral-400{color:var(--color-neutral-400)}.text-neutral-500{color:var(--color-neutral-500)}.text-neutral-600{color:var(--color-neutral-600)}.text-neutral-700{color:var(--color-neutral-700)}.text-neutral-800{color:var(--color-neutral-800)}.text-neutral-900{color:var(--color-neutral-900)}.text-orange-600{color:var(--color-orange-600)}.text-primary{color:var(--color-primary)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-red-900{color:var(--color-red-900)}.text-sky-700{color:var(--color-sky-700)}.text-sky-900{color:var(--color-sky-900)}.text-text-heading{color:var(--color-text-heading)}.text-text-on-dark{color:var(--color-text-on-dark)}.text-text-on-dark-muted{color:var(--color-text-on-dark-muted)}.text-white{color:var(--color-white)}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.no-underline{text-decoration-line:none}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0%}.opacity-50{opacity:50%}.shadow-\[0_4px_12px_rgba\(0\,0\,0\,0\.15\)\]{--tw-shadow:0 4px 12px var(--tw-shadow-color, rgba(0,0,0,0.15));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[inset_0_0_0_1px_currentColor\]{--tw-shadow:inset 0 0 0 1px var(--tw-shadow-color, currentColor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[color\,border-color\]{transition-property:color,border-color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[opacity\,transform\]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:150ms;transition-duration:150ms}.duration-200{--tw-duration:200ms;transition-duration:200ms}.duration-300{--tw-duration:300ms;transition-duration:300ms}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.group-focus-within\:visible{&:is(:where(.group):focus-within *){visibility:visible}}.group-focus-within\:opacity-100{&:is(:where(.group):focus-within *){opacity:100%}}.group-hover\:visible{&:is(:where(.group):hover *){@media(hover:hover){visibility: visible;}}}.group-hover\:opacity-100{&:is(:where(.group):hover *){@media(hover:hover){opacity: 100%;}}}.file\:mr-2{&::file-selector-button{margin-right:calc(var(--spacing) * 2)}}.file\:ml-1{&::file-selector-button{margin-left:var(--spacing)}}.file\:cursor-pointer{&::file-selector-button{cursor:pointer}}.file\:rounded-default{&::file-selector-button{border-radius:var(--radius-default)}}.file\:border{&::file-selector-button{border-style:var(--tw-border-style);border-width:1px}}.file\:border-neutral-300{&::file-selector-button{border-color:var(--color-neutral-300)}}.file\:bg-neutral-100{&::file-selector-button{background-color:var(--color-neutral-100)}}.file\:px-3{&::file-selector-button{padding-inline:calc(var(--spacing) * 3)}}.file\:px-4{&::file-selector-button{padding-inline:calc(var(--spacing) * 4)}}.file\:py-\[2px\]{&::file-selector-button{padding-block:2px}}.file\:py-\[3px\]{&::file-selector-button{padding-block:3px}}.file\:text-sm{&::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.file\:shadow-xs{&::file-selector-button{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.placeholder\:text-neutral-400{&::placeholder{color:var(--color-neutral-400)}}.before\:absolute{&::before{content:var(--tw-content);position:absolute}}.before\:inset-0{&::before{content:var(--tw-content);inset:0}}.before\:-z-20{&::before{content:var(--tw-content);z-index:calc(20 * -1)}}.before\:bg-neutral-300{&::before{content:var(--tw-content);background-color:var(--color-neutral-300)}}.before\:content-\[\'\'\]{&::before{--tw-content:'';content:var(--tw-content)}}.before\:\[clip-path\:polygon\(16px_0\,100\%_0\,100\%_calc\(100\%_-_16px\)\,calc\(100\%_-_16px\)_100\%\,0_100\%\,0_16px\)\]{&::before{content:var(--tw-content);clip-path:polygon(16px 0,100% 0,100% calc(100% - 16px),calc(100% - 16px) 100%,0 100%,0 16px)}}.after\:absolute{&::after{content:var(--tw-content);position:absolute}}.after\:inset-\[1px\]{&::after{content:var(--tw-content);inset:1px}}.after\:-z-10{&::after{content:var(--tw-content);z-index:calc(10 * -1)}}.after\:bg-white{&::after{content:var(--tw-content);background-color:var(--color-white)}}.after\:content-\[\'\'\]{&::after{--tw-content:'';content:var(--tw-content)}}.after\:\[clip-path\:polygon\(15px_0\,100\%_0\,100\%_calc\(100\%_-_15px\)\,calc\(100\%_-_15px\)_100\%\,0_100\%\,0_15px\)\]{&::after{content:var(--tw-content);clip-path:polygon(15px 0,100% 0,100% calc(100% - 15px),calc(100% - 15px) 100%,0 100%,0 15px)}}.last\:border-r-0{&:last-child{border-right-style:var(--tw-border-style);border-right-width:0}}.last\:border-b-0{&:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}}.odd\:bg-white{&:nth-child(odd){background-color:var(--color-white)}}.even\:bg-neutral-100{&:nth-child(even){background-color:var(--color-neutral-100)}}.hover\:bg-green-100{&:hover{@media(hover:hover){background-color: var(--color-green-100);}}}.hover\:bg-green-800{&:hover{@media(hover:hover){background-color: var(--color-green-800);}}}.hover\:bg-green-950{&:hover{@media(hover:hover){background-color: var(--color-green-950);}}}.hover\:bg-neutral-100{&:hover{@media(hover:hover){background-color: var(--color-neutral-100);}}}.hover\:bg-neutral-200{&:hover{@media(hover:hover){background-color: var(--color-neutral-200);}}}.hover\:bg-neutral-300{&:hover{@media(hover:hover){background-color: var(--color-neutral-300);}}}.hover\:bg-neutral-50{&:hover{@media(hover:hover){background-color: var(--color-neutral-50);}}}.hover\:bg-neutral-500{&:hover{@media(hover:hover){background-color: var(--color-neutral-500);}}}.hover\:bg-neutral-800{&:hover{@media(hover:hover){background-color: var(--color-neutral-800);}}}.hover\:bg-orange-700{&:hover{@media(hover:hover){background-color: var(--color-orange-700);}}}.hover\:bg-primary-hover{&:hover{@media(hover:hover){background-color: var(--color-primary-hover);}}}.hover\:bg-red-700{&:hover{@media(hover:hover){background-color: var(--color-red-700);}}}.hover\:bg-red-800{&:hover{@media(hover:hover){background-color: var(--color-red-800);}}}.hover\:bg-red-950{&:hover{@media(hover:hover){background-color: var(--color-red-950);}}}.hover\:bg-sky-100{&:hover{@media(hover:hover){background-color: var(--color-sky-100);}}}.hover\:bg-sky-500{&:hover{@media(hover:hover){background-color: var(--color-sky-500);}}}.hover\:bg-sky-800{&:hover{@media(hover:hover){background-color: var(--color-sky-800);}}}.hover\:bg-sky-950{&:hover{@media(hover:hover){background-color: var(--color-sky-950);}}}.hover\:bg-white\/5{&:hover{@media(hover:hover){background-color: color-mix(in oklab,var(--color-white) 5%,transparent);}}}.hover\:bg-yellow-800{&:hover{@media(hover:hover){background-color: var(--color-yellow-800);}}}.hover\:text-neutral-600{&:hover{@media(hover:hover){color: var(--color-neutral-600);}}}.hover\:text-neutral-700{&:hover{@media(hover:hover){color: var(--color-neutral-700);}}}.hover\:text-neutral-800{&:hover{@media(hover:hover){color: var(--color-neutral-800);}}}.hover\:text-neutral-900{&:hover{@media(hover:hover){color: var(--color-neutral-900);}}}.hover\:text-sky-800{&:hover{@media(hover:hover){color: var(--color-sky-800);}}}.hover\:text-text-on-dark{&:hover{@media(hover:hover){color: var(--color-text-on-dark);}}}.hover\:text-white{&:hover{@media(hover:hover){color: var(--color-white);}}}.hover\:underline{&:hover{@media(hover:hover){text-decoration-line: underline;}}}.hover\:decoration-1{&:hover{@media(hover:hover){text-decoration-thickness: 1px;}}}.hover\:shadow-\[inset_0_0_0_2px_currentColor\]{&:hover{@media(hover:hover){--tw-shadow: inset 0 0 0 2px var(--tw-shadow-color,currentColor); box-shadow: var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);}}}.file\:hover\:bg-neutral-200{&::file-selector-button{&:hover{@media(hover:hover){background-color: var(--color-neutral-200);}}}}.focus\:border-primary{&:focus{border-color:var(--color-primary)}}.focus\:bg-neutral-100{&:focus{background-color:var(--color-neutral-100)}}.focus\:bg-red-50{&:focus{background-color:var(--color-red-50)}}.focus\:shadow-\[inset_0_0_0_2px_var\(--color-red-500\)\]{&:focus{--tw-shadow:inset 0 0 0 2px var(--tw-shadow-color, var(--color-red-500));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\:outline-hidden{&:focus{--tw-outline-style:none;outline-style:none;@media(forced-colors:active){outline: 2px solid transparent; outline-offset: 2px;}}}.focus\:outline-2{&:focus{outline-style:var(--tw-outline-style);outline-width:2px}}.focus\:outline-offset-1{&:focus{outline-offset:1px}}.focus\:outline-green-500{&:focus{outline-color:var(--color-green-500)}}.focus\:outline-red-500{&:focus{outline-color:var(--color-red-500)}}.focus\:outline-sky-500{&:focus{outline-color:var(--color-sky-500)}}.focus-visible\:outline-2{&:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}}.focus-visible\:outline-offset-2{&:focus-visible{outline-offset:2px}}.focus-visible\:outline-current{&:focus-visible{outline-color:currentcolor}}.focus-visible\:outline-primary{&:focus-visible{outline-color:var(--color-primary)}}.active\:bg-neutral-200{&:active{background-color:var(--color-neutral-200)}}.enabled\:hover\:bg-neutral-50{&:enabled{&:hover{@media(hover:hover){background-color: var(--color-neutral-50);}}}}.enabled\:hover\:bg-neutral-900{&:enabled{&:hover{@media(hover:hover){background-color: var(--color-neutral-900);}}}}.enabled\:hover\:bg-red-700{&:enabled{&:hover{@media(hover:hover){background-color: var(--color-red-700);}}}}.disabled\:cursor-not-allowed{&:disabled{cursor:not-allowed}}.disabled\:bg-neutral-100{&:disabled{background-color:var(--color-neutral-100)}}.disabled\:bg-neutral-50{&:disabled{background-color:var(--color-neutral-50)}}.disabled\:text-neutral-300{&:disabled{color:var(--color-neutral-300)}}.disabled\:text-neutral-400{&:disabled{color:var(--color-neutral-400)}}.disabled\:opacity-40{&:disabled{opacity:40%}}.disabled\:opacity-50{&:disabled{opacity:50%}}.disabled\:hover\:bg-transparent{&:disabled{&:hover{@media(hover:hover){background-color: transparent;}}}}.sm\:block{@media(width >= 40rem){display: block;}}.sm\:flex{@media(width >= 40rem){display: flex;}}.sm\:grid-cols-2{@media(width >= 40rem){grid-template-columns: repeat(2,minmax(0,1fr));}}.sm\:grid-cols-3{@media(width >= 40rem){grid-template-columns: repeat(3,minmax(0,1fr));}}.md\:flex-initial{@media(width >= 48rem){flex: 0 auto;}}.md\:justify-start{@media(width >= 48rem){justify-content: flex-start;}}.lg\:col-span-10{@media(width >= 64rem){grid-column: span 10 / span 10;}}.lg\:col-span-2{@media(width >= 64rem){grid-column: span 2 / span 2;}}.lg\:col-span-5{@media(width >= 64rem){grid-column: span 5 / span 5;}}.lg\:col-span-7{@media(width >= 64rem){grid-column: span 7 / span 7;}}.lg\:block{@media(width >= 64rem){display: block;}}.lg\:h-full{@media(width >= 64rem){height: 100%;}}.lg\:grid-cols-12{@media(width >= 64rem){grid-template-columns: repeat(12,minmax(0,1fr));}}.lg\:self-start{@media(width >= 64rem){align-self: flex-start;}}.lg\:pr-8{@media(width >= 64rem){padding-right: calc(var(--spacing) * 8);}}.\[\&_\.ui-form\]\:m-0{& .ui-form{margin:0}}.\[\&_input\]\:cursor-text{& input{cursor:text}}.\[\&_td\]\:p-4{& td{padding:calc(var(--spacing) * 4)}}.\[\&_td\]\:px-2{& td{padding-inline:calc(var(--spacing) * 2)}}.\[\&_td\]\:py-0\.5{& td{padding-block:calc(var(--spacing) * .5)}}.\[\&_td\]\:py-1{& td{padding-block:var(--spacing)}}.\[\&_td\+td\]\:border-l{& td+td{border-left-style:var(--tw-border-style);border-left-width:1px}}.\[\&_td\+td\]\:border-neutral-300{& td+td{border-color:var(--color-neutral-300)}}.\[\&_th\]\:border-b{& th{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}}.\[\&_th\]\:border-neutral-300{& th{border-color:var(--color-neutral-300)}}.\[\&_tr\:hover\]\:\!bg-green-100{& tr:hover{background-color:var(--color-green-100)!important}}.\[\&_tr\:hover\]\:\!bg-neutral-200{& tr:hover{background-color:var(--color-neutral-200)!important}}.\[\&_tr\:hover\]\:\!bg-sky-100{& tr:hover{background-color:var(--color-sky-100)!important}}.\[\&_tr\:not\(\:last-child\)\]\:border-b{& tr:not(:last-child){border-bottom-style:var(--tw-border-style);border-bottom-width:1px}}.\[\&_tr\:not\(\:last-child\)\]\:border-neutral-300{& tr:not(:last-child){border-color:var(--color-neutral-300)}}.\[\&_tr\:nth-child\(even\)\]\:bg-neutral-100{& tr:nth-child(even){background-color:var(--color-neutral-100)}}}@property --tw-translate-x{syntax: "*"; +@layer theme,base,components,utilities;@layer theme{:root,:host{--font-sans:"Lora", ui-serif, Georgia, Cambria, "Times New Roman", serif;--font-serif:"Lora", ui-serif, Georgia, Cambria, "Times New Roman", serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', + monospace;--color-red-50:oklch(97.1% 0.013 17.38);--color-red-100:oklch(93.6% 0.032 17.717);--color-red-200:oklch(88.5% 0.062 18.334);--color-red-300:oklch(80.8% 0.114 19.571);--color-red-400:oklch(70.4% 0.191 22.216);--color-red-500:oklch(63.7% 0.237 25.331);--color-red-600:oklch(57.7% 0.245 27.325);--color-red-700:oklch(50.5% 0.213 27.518);--color-red-800:oklch(44.4% 0.177 26.899);--color-red-900:oklch(39.6% 0.141 25.723);--color-red-950:oklch(25.8% 0.092 26.042);--color-orange-50:oklch(98% 0.016 73.684);--color-orange-100:oklch(95.4% 0.038 75.164);--color-orange-200:oklch(90.1% 0.076 70.697);--color-orange-300:oklch(83.7% 0.128 66.29);--color-orange-400:oklch(75% 0.183 55.934);--color-orange-500:oklch(70.5% 0.213 47.604);--color-orange-600:oklch(64.6% 0.222 41.116);--color-orange-700:oklch(55.3% 0.195 38.402);--color-orange-800:oklch(47% 0.157 37.304);--color-orange-900:oklch(40.8% 0.123 38.172);--color-orange-950:oklch(26.6% 0.079 36.259);--color-amber-50:oklch(98.7% 0.022 95.277);--color-amber-100:oklch(96.2% 0.059 95.617);--color-amber-200:oklch(92.4% 0.12 95.746);--color-amber-300:oklch(87.9% 0.169 91.605);--color-amber-400:oklch(82.8% 0.189 84.429);--color-amber-500:oklch(76.9% 0.188 70.08);--color-amber-600:oklch(66.6% 0.179 58.318);--color-amber-700:oklch(55.5% 0.163 48.998);--color-amber-800:oklch(47.3% 0.137 46.201);--color-amber-900:oklch(41.4% 0.112 45.904);--color-amber-950:oklch(27.9% 0.077 45.635);--color-yellow-50:oklch(98.7% 0.026 102.212);--color-yellow-100:oklch(97.3% 0.071 103.193);--color-yellow-200:oklch(94.5% 0.129 101.54);--color-yellow-300:oklch(90.5% 0.182 98.111);--color-yellow-400:oklch(85.2% 0.199 91.936);--color-yellow-500:oklch(79.5% 0.184 86.047);--color-yellow-600:oklch(68.1% 0.162 75.834);--color-yellow-700:oklch(55.4% 0.135 66.442);--color-yellow-800:oklch(47.6% 0.114 61.907);--color-yellow-900:oklch(42.1% 0.095 57.708);--color-yellow-950:oklch(28.6% 0.066 53.813);--color-lime-50:oklch(98.6% 0.031 120.757);--color-lime-100:oklch(96.7% 0.067 122.328);--color-lime-200:oklch(93.8% 0.127 124.321);--color-lime-300:oklch(89.7% 0.196 126.665);--color-lime-400:oklch(84.1% 0.238 128.85);--color-lime-500:oklch(76.8% 0.233 130.85);--color-lime-600:oklch(64.8% 0.2 131.684);--color-lime-700:oklch(53.2% 0.157 131.589);--color-lime-800:oklch(45.3% 0.124 130.933);--color-lime-900:oklch(40.5% 0.101 131.063);--color-lime-950:oklch(27.4% 0.072 132.109);--color-green-50:oklch(98.2% 0.018 155.826);--color-green-100:oklch(96.2% 0.044 156.743);--color-green-200:oklch(92.5% 0.084 155.995);--color-green-300:oklch(87.1% 0.15 154.449);--color-green-400:oklch(79.2% 0.209 151.711);--color-green-500:oklch(72.3% 0.219 149.579);--color-green-600:oklch(62.7% 0.194 149.214);--color-green-700:oklch(52.7% 0.154 150.069);--color-green-800:oklch(44.8% 0.119 151.328);--color-green-900:oklch(39.3% 0.095 152.535);--color-green-950:oklch(26.6% 0.065 152.934);--color-emerald-50:oklch(97.9% 0.021 166.113);--color-emerald-100:oklch(95% 0.052 163.051);--color-emerald-200:oklch(90.5% 0.093 164.15);--color-emerald-300:oklch(84.5% 0.143 164.978);--color-emerald-400:oklch(76.5% 0.177 163.223);--color-emerald-500:oklch(69.6% 0.17 162.48);--color-emerald-600:oklch(59.6% 0.145 163.225);--color-emerald-700:oklch(50.8% 0.118 165.612);--color-emerald-800:oklch(43.2% 0.095 166.913);--color-emerald-900:oklch(37.8% 0.077 168.94);--color-emerald-950:oklch(26.2% 0.051 172.552);--color-teal-50:oklch(98.4% 0.014 180.72);--color-teal-100:oklch(95.3% 0.051 180.801);--color-teal-200:oklch(91% 0.096 180.426);--color-teal-300:oklch(85.5% 0.138 181.071);--color-teal-400:oklch(77.7% 0.152 181.912);--color-teal-500:oklch(70.4% 0.14 182.503);--color-teal-600:oklch(60% 0.118 184.704);--color-teal-700:oklch(51.1% 0.096 186.391);--color-teal-800:oklch(43.7% 0.078 188.216);--color-teal-900:oklch(38.6% 0.063 188.416);--color-teal-950:oklch(27.7% 0.046 192.524);--color-cyan-50:oklch(98.4% 0.019 200.873);--color-cyan-100:oklch(95.6% 0.045 203.388);--color-cyan-200:oklch(91.7% 0.08 205.041);--color-cyan-300:oklch(86.5% 0.127 207.078);--color-cyan-400:oklch(78.9% 0.154 211.53);--color-cyan-500:oklch(71.5% 0.143 215.221);--color-cyan-600:oklch(60.9% 0.126 221.723);--color-cyan-700:oklch(52% 0.105 223.128);--color-cyan-800:oklch(45% 0.085 224.283);--color-cyan-900:oklch(39.8% 0.07 227.392);--color-cyan-950:oklch(30.2% 0.056 229.695);--color-sky-50:oklch(97.7% 0.013 236.62);--color-sky-100:oklch(95.1% 0.026 236.824);--color-sky-200:oklch(90.1% 0.058 230.902);--color-sky-300:oklch(82.8% 0.111 230.318);--color-sky-400:oklch(74.6% 0.16 232.661);--color-sky-500:oklch(68.5% 0.169 237.323);--color-sky-600:oklch(58.8% 0.158 241.966);--color-sky-700:oklch(50% 0.134 242.749);--color-sky-800:oklch(44.3% 0.11 240.79);--color-sky-900:oklch(39.1% 0.09 240.876);--color-sky-950:oklch(29.3% 0.066 243.157);--color-blue-50:oklch(97% 0.014 254.604);--color-blue-100:oklch(93.2% 0.032 255.585);--color-blue-200:oklch(88.2% 0.059 254.128);--color-blue-300:oklch(80.9% 0.105 251.813);--color-blue-400:oklch(70.7% 0.165 254.624);--color-blue-500:oklch(62.3% 0.214 259.815);--color-blue-600:oklch(54.6% 0.245 262.881);--color-blue-700:oklch(48.8% 0.243 264.376);--color-blue-800:oklch(42.4% 0.199 265.638);--color-blue-900:oklch(37.9% 0.146 265.522);--color-blue-950:oklch(28.2% 0.091 267.935);--color-indigo-50:oklch(96.2% 0.018 272.314);--color-indigo-100:oklch(93% 0.034 272.788);--color-indigo-200:oklch(87% 0.065 274.039);--color-indigo-300:oklch(78.5% 0.115 274.713);--color-indigo-400:oklch(67.3% 0.182 276.935);--color-indigo-500:oklch(58.5% 0.233 277.117);--color-indigo-600:oklch(51.1% 0.262 276.966);--color-indigo-700:oklch(45.7% 0.24 277.023);--color-indigo-800:oklch(39.8% 0.195 277.366);--color-indigo-900:oklch(35.9% 0.144 278.697);--color-indigo-950:oklch(25.7% 0.09 281.288);--color-violet-50:oklch(96.9% 0.016 293.756);--color-violet-100:oklch(94.3% 0.029 294.588);--color-violet-200:oklch(89.4% 0.057 293.283);--color-violet-300:oklch(81.1% 0.111 293.571);--color-violet-400:oklch(70.2% 0.183 293.541);--color-violet-500:oklch(60.6% 0.25 292.717);--color-violet-600:oklch(54.1% 0.281 293.009);--color-violet-700:oklch(49.1% 0.27 292.581);--color-violet-800:oklch(43.2% 0.232 292.759);--color-violet-900:oklch(38% 0.189 293.745);--color-violet-950:oklch(28.3% 0.141 291.089);--color-purple-50:oklch(97.7% 0.014 308.299);--color-purple-100:oklch(94.6% 0.033 307.174);--color-purple-200:oklch(90.2% 0.063 306.703);--color-purple-300:oklch(82.7% 0.119 306.383);--color-purple-400:oklch(71.4% 0.203 305.504);--color-purple-500:oklch(62.7% 0.265 303.9);--color-purple-600:oklch(55.8% 0.288 302.321);--color-purple-700:oklch(49.6% 0.265 301.924);--color-purple-800:oklch(43.8% 0.218 303.724);--color-purple-900:oklch(38.1% 0.176 304.987);--color-purple-950:oklch(29.1% 0.149 302.717);--color-fuchsia-50:oklch(97.7% 0.017 320.058);--color-fuchsia-100:oklch(95.2% 0.037 318.852);--color-fuchsia-200:oklch(90.3% 0.076 319.62);--color-fuchsia-300:oklch(83.3% 0.145 321.434);--color-fuchsia-400:oklch(74% 0.238 322.16);--color-fuchsia-500:oklch(66.7% 0.295 322.15);--color-fuchsia-600:oklch(59.1% 0.293 322.896);--color-fuchsia-700:oklch(51.8% 0.253 323.949);--color-fuchsia-800:oklch(45.2% 0.211 324.591);--color-fuchsia-900:oklch(40.1% 0.17 325.612);--color-fuchsia-950:oklch(29.3% 0.136 325.661);--color-pink-50:oklch(97.1% 0.014 343.198);--color-pink-100:oklch(94.8% 0.028 342.258);--color-pink-200:oklch(89.9% 0.061 343.231);--color-pink-300:oklch(82.3% 0.12 346.018);--color-pink-400:oklch(71.8% 0.202 349.761);--color-pink-500:oklch(65.6% 0.241 354.308);--color-pink-600:oklch(59.2% 0.249 0.584);--color-pink-700:oklch(52.5% 0.223 3.958);--color-pink-800:oklch(45.9% 0.187 3.815);--color-pink-900:oklch(40.8% 0.153 2.432);--color-pink-950:oklch(28.4% 0.109 3.907);--color-rose-50:oklch(96.9% 0.015 12.422);--color-rose-100:oklch(94.1% 0.03 12.58);--color-rose-200:oklch(89.2% 0.058 10.001);--color-rose-300:oklch(81% 0.117 11.638);--color-rose-400:oklch(71.2% 0.194 13.428);--color-rose-500:oklch(64.5% 0.246 16.439);--color-rose-600:oklch(58.6% 0.253 17.585);--color-rose-700:oklch(51.4% 0.222 16.935);--color-rose-800:oklch(45.5% 0.188 13.697);--color-rose-900:oklch(41% 0.159 10.272);--color-rose-950:oklch(27.1% 0.105 12.094);--color-slate-50:oklch(98.4% 0.003 247.858);--color-slate-100:oklch(96.8% 0.007 247.896);--color-slate-200:oklch(92.9% 0.013 255.508);--color-slate-300:oklch(86.9% 0.022 252.894);--color-slate-400:oklch(70.4% 0.04 256.788);--color-slate-500:oklch(55.4% 0.046 257.417);--color-slate-600:oklch(44.6% 0.043 257.281);--color-slate-700:oklch(37.2% 0.044 257.287);--color-slate-800:oklch(27.9% 0.041 260.031);--color-slate-900:oklch(20.8% 0.042 265.755);--color-slate-950:oklch(12.9% 0.042 264.695);--color-gray-50:oklch(98.5% 0.002 247.839);--color-gray-100:oklch(96.7% 0.003 264.542);--color-gray-200:oklch(92.8% 0.006 264.531);--color-gray-300:oklch(87.2% 0.01 258.338);--color-gray-400:oklch(70.7% 0.022 261.325);--color-gray-500:oklch(55.1% 0.027 264.364);--color-gray-600:oklch(44.6% 0.03 256.802);--color-gray-700:oklch(37.3% 0.034 259.733);--color-gray-800:oklch(27.8% 0.033 256.848);--color-gray-900:oklch(21% 0.034 264.665);--color-gray-950:oklch(13% 0.028 261.692);--color-zinc-50:oklch(98.5% 0 0);--color-zinc-100:oklch(96.7% 0.001 286.375);--color-zinc-200:oklch(92% 0.004 286.32);--color-zinc-300:oklch(87.1% 0.006 286.286);--color-zinc-400:oklch(70.5% 0.015 286.067);--color-zinc-500:oklch(55.2% 0.016 285.938);--color-zinc-600:oklch(44.2% 0.017 285.786);--color-zinc-700:oklch(37% 0.013 285.805);--color-zinc-800:oklch(27.4% 0.006 286.033);--color-zinc-900:oklch(21% 0.006 285.885);--color-zinc-950:oklch(14.1% 0.005 285.823);--color-neutral-50:oklch(98.5% 0 0);--color-neutral-100:oklch(97% 0 0);--color-neutral-200:oklch(92.2% 0 0);--color-neutral-300:oklch(87% 0 0);--color-neutral-400:oklch(70.8% 0 0);--color-neutral-500:oklch(55.6% 0 0);--color-neutral-600:oklch(43.9% 0 0);--color-neutral-700:oklch(37.1% 0 0);--color-neutral-800:oklch(26.9% 0 0);--color-neutral-900:oklch(20.5% 0 0);--color-neutral-950:oklch(14.5% 0 0);--color-stone-50:oklch(98.5% 0.001 106.423);--color-stone-100:oklch(97% 0.001 106.424);--color-stone-200:oklch(92.3% 0.003 48.717);--color-stone-300:oklch(86.9% 0.005 56.366);--color-stone-400:oklch(70.9% 0.01 56.259);--color-stone-500:oklch(55.3% 0.013 58.071);--color-stone-600:oklch(44.4% 0.011 73.639);--color-stone-700:oklch(37.4% 0.01 67.558);--color-stone-800:oklch(26.8% 0.007 34.298);--color-stone-900:oklch(21.6% 0.006 56.043);--color-stone-950:oklch(14.7% 0.004 49.25);--color-mauve-50:oklch(98.5% 0 0);--color-mauve-100:oklch(96% 0.003 325.6);--color-mauve-200:oklch(92.2% 0.005 325.62);--color-mauve-300:oklch(86.5% 0.012 325.68);--color-mauve-400:oklch(71.1% 0.019 323.02);--color-mauve-500:oklch(54.2% 0.034 322.5);--color-mauve-600:oklch(43.5% 0.029 321.78);--color-mauve-700:oklch(36.4% 0.029 323.89);--color-mauve-800:oklch(26.3% 0.024 320.12);--color-mauve-900:oklch(21.2% 0.019 322.12);--color-mauve-950:oklch(14.5% 0.008 326);--color-olive-50:oklch(98.8% 0.003 106.5);--color-olive-100:oklch(96.6% 0.005 106.5);--color-olive-200:oklch(93% 0.007 106.5);--color-olive-300:oklch(88% 0.011 106.6);--color-olive-400:oklch(73.7% 0.021 106.9);--color-olive-500:oklch(58% 0.031 107.3);--color-olive-600:oklch(46.6% 0.025 107.3);--color-olive-700:oklch(39.4% 0.023 107.4);--color-olive-800:oklch(28.6% 0.016 107.4);--color-olive-900:oklch(22.8% 0.013 107.4);--color-olive-950:oklch(15.3% 0.006 107.1);--color-mist-50:oklch(98.7% 0.002 197.1);--color-mist-100:oklch(96.3% 0.002 197.1);--color-mist-200:oklch(92.5% 0.005 214.3);--color-mist-300:oklch(87.2% 0.007 219.6);--color-mist-400:oklch(72.3% 0.014 214.4);--color-mist-500:oklch(56% 0.021 213.5);--color-mist-600:oklch(45% 0.017 213.2);--color-mist-700:oklch(37.8% 0.015 216);--color-mist-800:oklch(27.5% 0.011 216.9);--color-mist-900:oklch(21.8% 0.008 223.9);--color-mist-950:oklch(14.8% 0.004 228.8);--color-taupe-50:oklch(98.6% 0.002 67.8);--color-taupe-100:oklch(96% 0.002 17.2);--color-taupe-200:oklch(92.2% 0.005 34.3);--color-taupe-300:oklch(86.8% 0.007 39.5);--color-taupe-400:oklch(71.4% 0.014 41.2);--color-taupe-500:oklch(54.7% 0.021 43.1);--color-taupe-600:oklch(43.8% 0.017 39.3);--color-taupe-700:oklch(36.7% 0.016 35.7);--color-taupe-800:oklch(26.8% 0.011 36.5);--color-taupe-900:oklch(21.4% 0.009 43.1);--color-taupe-950:oklch(14.7% 0.004 49.3);--color-black:#000;--color-white:#fff;--spacing:0.25rem;--breakpoint-sm:40rem;--breakpoint-md:48rem;--breakpoint-lg:64rem;--breakpoint-xl:80rem;--breakpoint-2xl:96rem;--container-3xs:16rem;--container-2xs:18rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:0.75rem;--text-xs--line-height:calc(1 / 0.75);--text-sm:0.875rem;--text-sm--line-height:calc(1.25 / 0.875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--text-7xl:4.5rem;--text-7xl--line-height:1;--text-8xl:6rem;--text-8xl--line-height:1;--text-9xl:8rem;--text-9xl--line-height:1;--font-weight-thin:100;--font-weight-extralight:200;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--tracking-tighter:-0.05em;--tracking-tight:-0.025em;--tracking-normal:0em;--tracking-wide:0.025em;--tracking-wider:0.05em;--tracking-widest:0.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-normal:1.5;--leading-relaxed:1.625;--leading-loose:2;--radius-xs:0.125rem;--radius-sm:0.25rem;--radius-md:0.375rem;--radius-lg:0.5rem;--radius-xl:0.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--radius-4xl:2rem;--shadow-2xs:0 1px rgb(0 0 0 / 0.05);--shadow-xs:0 1px 2px 0 rgb(0 0 0 / 0.05);--shadow-sm:0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);--shadow-md:0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);--shadow-lg:0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);--shadow-xl:0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);--shadow-2xl:0 25px 50px -12px rgb(0 0 0 / 0.25);--inset-shadow-2xs:inset 0 1px rgb(0 0 0 / 0.05);--inset-shadow-xs:inset 0 1px 1px rgb(0 0 0 / 0.05);--inset-shadow-sm:inset 0 2px 4px rgb(0 0 0 / 0.05);--drop-shadow-xs:0 1px 1px rgb(0 0 0 / 0.05);--drop-shadow-sm:0 1px 2px rgb(0 0 0 / 0.15);--drop-shadow-md:0 3px 3px rgb(0 0 0 / 0.12);--drop-shadow-lg:0 4px 4px rgb(0 0 0 / 0.15);--drop-shadow-xl:0 9px 7px rgb(0 0 0 / 0.1);--drop-shadow-2xl:0 25px 25px rgb(0 0 0 / 0.15);--text-shadow-2xs:0px 1px 0px rgb(0 0 0 / 0.15);--text-shadow-xs:0px 1px 1px rgb(0 0 0 / 0.2);--text-shadow-sm:0px 1px 0px rgb(0 0 0 / 0.075), 0px 1px 1px rgb(0 0 0 / 0.075), 0px 2px 2px rgb(0 0 0 / 0.075);--text-shadow-md:0px 1px 1px rgb(0 0 0 / 0.1), 0px 1px 2px rgb(0 0 0 / 0.1), 0px 2px 4px rgb(0 0 0 / 0.1);--text-shadow-lg:0px 1px 2px rgb(0 0 0 / 0.1), 0px 3px 2px rgb(0 0 0 / 0.1), 0px 4px 8px rgb(0 0 0 / 0.1);--ease-in:cubic-bezier(0.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, 0.2, 1);--ease-in-out:cubic-bezier(0.4, 0, 0.2, 1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;--animate-bounce:bounce 1s infinite;--blur-xs:4px;--blur-sm:8px;--blur-md:12px;--blur-lg:16px;--blur-xl:24px;--blur-2xl:40px;--blur-3xl:64px;--perspective-dramatic:100px;--perspective-near:300px;--perspective-normal:500px;--perspective-midrange:800px;--perspective-distant:1200px;--aspect-video:16 / 9;--default-transition-duration:150ms;--default-transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);--default-font-family:var(--font-sans);--default-font-feature-settings:initial;--default-font-variation-settings:initial;--default-mono-font-family:var(--font-mono);--default-mono-font-feature-settings:initial;--default-mono-font-variation-settings:initial;--radius-default:0.375rem;--color-primary:#4f46e5;--color-primary-hover:#4338ca;--color-text-heading:#111827;--color-text-on-dark:#f9fafb;--color-text-on-dark-muted:#9ca3af}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,100%{transform:scale(2);opacity:0}}@keyframes pulse{50%{opacity:.5}}@keyframes bounce{0%,100%{transform:translateY(-25%);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;animation-timing-function:cubic-bezier(0,0,.2,1)}}@layer base{*,::after,::before,::backdrop,::file-selector-button{box-sizing:border-box;margin:0;padding:0;border:0 solid}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;tab-size:4;font-family:var(--default-font-family);font-feature-settings:var(--default-font-feature-settings);font-variation-settings:var(--default-font-variation-settings);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family);font-feature-settings:var(--default-mono-font-feature-settings);font-variation-settings:var(--default-mono-font-variation-settings);font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea,::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;border-radius:0;background-color:initial;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports(not (-webkit-appearance:-apple-pay-button)) or (contain-intrinsic-size:1px){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]),::file-selector-button{appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@font-face{font-family:lora;font-style:italic;font-weight:400 700;font-display:swap;src:url(/fonts/lora-latin-ext-italic.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:lora;font-style:italic;font-weight:400 700;font-display:swap;src:url(/fonts/lora-latin-italic.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:lora;font-style:normal;font-weight:400 700;font-display:swap;src:url(/fonts/lora-latin-ext-normal.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:lora;font-style:normal;font-weight:400 700;font-display:swap;src:url(/fonts/lora-latin-normal.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.inset-y-0{inset-block:0}.top-0{top:0}.top-1\/2{top:calc(1/2 * 100%)}.top-20{top:calc(var(--spacing) * 20)}.top-4{top:calc(var(--spacing) * 4)}.top-full{top:100%}.-right-2{right:calc(var(--spacing) * -2)}.right-0{right:0}.right-0\.5{right:calc(var(--spacing) * .5)}.right-4{right:calc(var(--spacing) * 4)}.right-8{right:calc(var(--spacing) * 8)}.bottom-4{bottom:calc(var(--spacing) * 4)}.left-0{left:0}.left-1\/2{left:calc(1/2 * 100%)}.left-4{left:calc(var(--spacing) * 4)}.isolate{isolation:isolate}.-z-10{z-index:calc(10 * -1)}.z-10{z-index:10}.z-150{z-index:150}.z-200{z-index:200}.z-50{z-index:50}.z-\[100\]{z-index:100}.z-\[110\]{z-index:110}.z-\[1\]{z-index:1}.z-\[200\]{z-index:200}.col-span-1{grid-column:span 1/span 1}.m-0{margin:0}.-mx-1\.5{margin-inline:calc(var(--spacing) * -1.5)}.mx-3{margin-inline:calc(var(--spacing) * 3)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mx-\[0\.15rem\]{margin-inline:.15rem}.mx-auto{margin-inline:auto}.my-1{margin-block:var(--spacing)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-5{margin-right:calc(var(--spacing) * 5)}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-auto{margin-left:auto}.box-border{box-sizing:border-box}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-square{aspect-ratio:1/1}.h-0{height:0}.h-0\.5{height:calc(var(--spacing) * .5)}.h-1{height:var(--spacing)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-72{height:calc(var(--spacing) * 72)}.h-8{height:calc(var(--spacing) * 8)}.h-\[30px\]{height:30px}.h-\[38px\]{height:38px}.h-dvh{height:100dvh}.h-full{height:100%}.h-screen{height:100vh}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[34rem\]{max-height:34rem}.max-h-\[calc\(100dvh_-_5rem\)\]{max-height:calc(100dvh - 5rem)}.max-h-\[calc\(100vh_-_7rem\)\]{max-height:calc(100vh - 7rem)}.max-h-dvh{max-height:100dvh}.min-h-0{min-height:0}.min-h-9{min-height:calc(var(--spacing) * 9)}.min-h-\[6\.5rem\]{min-height:6.5rem}.min-h-screen{min-height:100vh}.w-0{width:0}.w-1{width:var(--spacing)}.w-10{width:calc(var(--spacing) * 10)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-4{width:calc(var(--spacing) * 4)}.w-40{width:calc(var(--spacing) * 40)}.w-52{width:calc(var(--spacing) * 52)}.w-56{width:calc(var(--spacing) * 56)}.w-6{width:calc(var(--spacing) * 6)}.w-64{width:calc(var(--spacing) * 64)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-\[26rem\]{width:26rem}.w-auto{width:auto}.w-full{width:100%}.w-max{width:max-content}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-64{max-width:calc(var(--spacing) * 64)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-80{max-width:calc(var(--spacing) * 80)}.max-w-\[100rem\]{max-width:100rem}.max-w-\[11rem\]{max-width:11rem}.max-w-\[14rem\]{max-width:14rem}.max-w-\[16rem\]{max-width:16rem}.max-w-\[20rem\]{max-width:20rem}.max-w-\[90rem\]{max-width:90rem}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-screen{max-width:100vw}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-48{min-width:calc(var(--spacing) * 48)}.min-w-5{min-width:calc(var(--spacing) * 5)}.min-w-72{min-width:calc(var(--spacing) * 72)}.min-w-8{min-width:calc(var(--spacing) * 8)}.min-w-\[10rem\]{min-width:10rem}.min-w-\[16rem\]{min-width:16rem}.min-w-\[240px\]{min-width:240px}.min-w-\[7rem\]{min-width:7rem}.min-w-\[8rem\]{min-width:8rem}.min-w-\[9rem\]{min-width:9rem}.min-w-full{min-width:100%}.flex-1{flex:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.table-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-0\.5{--tw-translate-x:calc(var(--spacing) * 0.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-\[18px\]{--tw-translate-x:18px;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x)var(--tw-translate-y)}.scale-110{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.rotate-180{rotate:180deg}.rotate-90{rotate:90deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-col-resize{cursor:col-resize}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-\[2px\]{gap:2px}.space-y-6{ :where(& > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse))); }}.space-y-8{ :where(& > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse))); }}.self-end{align-self:flex-end}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.rounded{border-radius:.25rem}.rounded-default{border-radius:var(--radius-default)}.rounded-full{border-radius:calc(infinity * 1px)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-l-default{border-top-left-radius:var(--radius-default);border-bottom-left-radius:var(--radius-default)}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-b-default{border-bottom-right-radius:var(--radius-default);border-bottom-left-radius:var(--radius-default)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-4{border-style:var(--tw-border-style);border-width:4px}.border-x{border-inline-style:var(--tw-border-style);border-inline-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-r-0{border-right-style:var(--tw-border-style);border-right-width:0}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-none{--tw-border-style:none;border-style:none}.border-emerald-300{border-color:var(--color-emerald-300)}.border-green-200{border-color:var(--color-green-200)}.border-green-500{border-color:var(--color-green-500)}.border-neutral-100{border-color:var(--color-neutral-100)}.border-neutral-200{border-color:var(--color-neutral-200)}.border-neutral-300{border-color:var(--color-neutral-300)}.border-neutral-700{border-color:var(--color-neutral-700)}.border-neutral-800{border-color:var(--color-neutral-800)}.border-primary{border-color:var(--color-primary)}.border-red-200{border-color:var(--color-red-200)}.border-red-500{border-color:var(--color-red-500)}.border-sky-200{border-color:var(--color-sky-200)}.border-sky-700{border-color:var(--color-sky-700)}.border-transparent{border-color:transparent}.border-yellow-200{border-color:var(--color-yellow-200)}.border-t-sky-700{border-top-color:var(--color-sky-700)}.border-t-transparent{border-top-color:transparent}.border-l-green-700{border-left-color:var(--color-green-700)}.border-l-neutral-300{border-left-color:var(--color-neutral-300)}.border-l-neutral-400{border-left-color:var(--color-neutral-400)}.border-l-red-700{border-left-color:var(--color-red-700)}.border-l-sky-800{border-left-color:var(--color-sky-800)}.border-l-yellow-500{border-left-color:var(--color-yellow-500)}.\!bg-primary{background-color:var(--color-primary)!important}.bg-amber-100{background-color:var(--color-amber-100)}.bg-amber-100\!{background-color:var(--color-amber-100)!important}.bg-amber-700{background-color:var(--color-amber-700)}.bg-black\/10{background-color:color-mix(in oklab,var(--color-black) 10%,transparent)}.bg-black\/30{background-color:color-mix(in oklab,var(--color-black) 30%,transparent)}.bg-black\/5{background-color:color-mix(in oklab,var(--color-black) 5%,transparent)}.bg-black\/50{background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-700{background-color:var(--color-green-700)}.bg-green-900{background-color:var(--color-green-900)}.bg-neutral-100{background-color:var(--color-neutral-100)}.bg-neutral-200{background-color:var(--color-neutral-200)}.bg-neutral-300{background-color:var(--color-neutral-300)}.bg-neutral-50{background-color:var(--color-neutral-50)}.bg-neutral-500{background-color:var(--color-neutral-500)}.bg-neutral-600{background-color:var(--color-neutral-600)}.bg-neutral-700{background-color:var(--color-neutral-700)}.bg-neutral-800{background-color:var(--color-neutral-800)}.bg-neutral-900{background-color:var(--color-neutral-900)}.bg-orange-500{background-color:var(--color-orange-500)}.bg-orange-600{background-color:var(--color-orange-600)}.bg-primary{background-color:var(--color-primary)}.bg-primary\/10{background-color:color-mix(in oklab,var(--color-primary) 10%,transparent)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-600{background-color:var(--color-red-600)}.bg-red-700{background-color:var(--color-red-700)}.bg-red-900{background-color:var(--color-red-900)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-sky-600{background-color:var(--color-sky-600)}.bg-sky-700{background-color:var(--color-sky-700)}.bg-sky-800{background-color:var(--color-sky-800)}.bg-sky-900{background-color:var(--color-sky-900)}.bg-transparent{background-color:initial}.bg-white{background-color:var(--color-white)}.bg-white\/10{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}.bg-yellow-400{background-color:var(--color-yellow-400)}.bg-yellow-50{background-color:var(--color-yellow-50)}.bg-yellow-700{background-color:var(--color-yellow-700)}.fill-current{fill:currentcolor}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-8{padding:calc(var(--spacing) * 8)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-7{padding-inline:calc(var(--spacing) * 7)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-px{padding-block:1px}.pt-1{padding-top:var(--spacing)}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-10{padding-top:calc(var(--spacing) * 10)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-14{padding-right:calc(var(--spacing) * 14)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-9{padding-right:calc(var(--spacing) * 9)}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-\[calc\(1rem_\+_env\(safe-area-inset-bottom\,0px\)\)\]{padding-bottom:calc(1rem + env(safe-area-inset-bottom,0px))}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-\[inherit\]{font-family:inherit}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.5rem\]{font-size:.5rem}.text-\[10px\]{font-size:10px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.\!text-white{color:var(--color-white)!important}.text-amber-600{color:var(--color-amber-600)}.text-black{color:var(--color-black)}.text-current{color:currentcolor}.text-emerald-700{color:var(--color-emerald-700)}.text-gray-900{color:var(--color-gray-900)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-green-900{color:var(--color-green-900)}.text-neutral-100{color:var(--color-neutral-100)}.text-neutral-200{color:var(--color-neutral-200)}.text-neutral-300{color:var(--color-neutral-300)}.text-neutral-400{color:var(--color-neutral-400)}.text-neutral-500{color:var(--color-neutral-500)}.text-neutral-600{color:var(--color-neutral-600)}.text-neutral-700{color:var(--color-neutral-700)}.text-neutral-800{color:var(--color-neutral-800)}.text-neutral-900{color:var(--color-neutral-900)}.text-orange-600{color:var(--color-orange-600)}.text-primary{color:var(--color-primary)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-red-900{color:var(--color-red-900)}.text-sky-600{color:var(--color-sky-600)}.text-sky-700{color:var(--color-sky-700)}.text-sky-900{color:var(--color-sky-900)}.text-text-heading{color:var(--color-text-heading)}.text-text-on-dark{color:var(--color-text-on-dark)}.text-text-on-dark-muted{color:var(--color-text-on-dark-muted)}.text-transparent{color:transparent}.text-violet-600{color:var(--color-violet-600)}.text-white{color:var(--color-white)}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.no-underline{text-decoration-line:none}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.caret-neutral-800{caret-color:var(--color-neutral-800)}.opacity-0{opacity:0%}.opacity-50{opacity:50%}.opacity-60{opacity:60%}.shadow-\[0_4px_12px_rgba\(0\,0\,0\,0\.15\)\]{--tw-shadow:0 4px 12px var(--tw-shadow-color, rgba(0,0,0,0.15));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[inset_0_0_0_1px_currentColor\]{--tw-shadow:inset 0 0 0 1px var(--tw-shadow-color, currentColor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[inset_3px_0_0_0_theme\(colors\.amber\.500\)\]{--tw-shadow:inset 3px 0 0 0 var(--tw-shadow-color, theme(colors.amber.500));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline-hidden{--tw-outline-style:none;outline-style:none;@media(forced-colors:active){outline: 2px solid transparent; outline-offset: 2px;}}.outline-2{outline-style:var(--tw-outline-style);outline-width:2px}.outline-sky-500{outline-color:var(--color-sky-500)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[color\,border-color\]{transition-property:color,border-color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[opacity\,transform\]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:150ms;transition-duration:150ms}.duration-200{--tw-duration:200ms;transition-duration:200ms}.duration-300{--tw-duration:300ms;transition-duration:300ms}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.group-hover\/th\:opacity-50{&:is(:where(.group\/th):hover *){@media(hover:hover){opacity: 50%;}}}.file\:mr-2{&::file-selector-button{margin-right:calc(var(--spacing) * 2)}}.file\:ml-1{&::file-selector-button{margin-left:var(--spacing)}}.file\:cursor-pointer{&::file-selector-button{cursor:pointer}}.file\:rounded-default{&::file-selector-button{border-radius:var(--radius-default)}}.file\:border{&::file-selector-button{border-style:var(--tw-border-style);border-width:1px}}.file\:border-neutral-300{&::file-selector-button{border-color:var(--color-neutral-300)}}.file\:bg-neutral-100{&::file-selector-button{background-color:var(--color-neutral-100)}}.file\:px-3{&::file-selector-button{padding-inline:calc(var(--spacing) * 3)}}.file\:px-4{&::file-selector-button{padding-inline:calc(var(--spacing) * 4)}}.file\:py-\[2px\]{&::file-selector-button{padding-block:2px}}.file\:py-\[3px\]{&::file-selector-button{padding-block:3px}}.file\:text-sm{&::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.file\:shadow-xs{&::file-selector-button{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.placeholder\:text-neutral-400{&::placeholder{color:var(--color-neutral-400)}}.before\:absolute{&::before{content:var(--tw-content);position:absolute}}.before\:inset-0{&::before{content:var(--tw-content);inset:0}}.before\:-z-20{&::before{content:var(--tw-content);z-index:calc(20 * -1)}}.before\:bg-neutral-300{&::before{content:var(--tw-content);background-color:var(--color-neutral-300)}}.before\:content-\[\'\'\]{&::before{--tw-content:'';content:var(--tw-content)}}.before\:\[clip-path\:polygon\(16px_0\,100\%_0\,100\%_calc\(100\%_-_16px\)\,calc\(100\%_-_16px\)_100\%\,0_100\%\,0_16px\)\]{&::before{content:var(--tw-content);clip-path:polygon(16px 0,100% 0,100% calc(100% - 16px),calc(100% - 16px) 100%,0 100%,0 16px)}}.after\:absolute{&::after{content:var(--tw-content);position:absolute}}.after\:inset-\[1px\]{&::after{content:var(--tw-content);inset:1px}}.after\:-z-10{&::after{content:var(--tw-content);z-index:calc(10 * -1)}}.after\:bg-white{&::after{content:var(--tw-content);background-color:var(--color-white)}}.after\:content-\[\'\'\]{&::after{--tw-content:'';content:var(--tw-content)}}.after\:\[clip-path\:polygon\(15px_0\,100\%_0\,100\%_calc\(100\%_-_15px\)\,calc\(100\%_-_15px\)_100\%\,0_100\%\,0_15px\)\]{&::after{content:var(--tw-content);clip-path:polygon(15px 0,100% 0,100% calc(100% - 15px),calc(100% - 15px) 100%,0 100%,0 15px)}}.last\:border-r-0{&:last-child{border-right-style:var(--tw-border-style);border-right-width:0}}.last\:border-b-0{&:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}}.odd\:bg-white{&:nth-child(odd){background-color:var(--color-white)}}.even\:bg-neutral-100{&:nth-child(even){background-color:var(--color-neutral-100)}}.hover\:bg-green-100{&:hover{@media(hover:hover){background-color: var(--color-green-100);}}}.hover\:bg-green-800{&:hover{@media(hover:hover){background-color: var(--color-green-800);}}}.hover\:bg-green-950{&:hover{@media(hover:hover){background-color: var(--color-green-950);}}}.hover\:bg-neutral-100{&:hover{@media(hover:hover){background-color: var(--color-neutral-100);}}}.hover\:bg-neutral-200{&:hover{@media(hover:hover){background-color: var(--color-neutral-200);}}}.hover\:bg-neutral-300{&:hover{@media(hover:hover){background-color: var(--color-neutral-300);}}}.hover\:bg-neutral-50{&:hover{@media(hover:hover){background-color: var(--color-neutral-50);}}}.hover\:bg-neutral-500{&:hover{@media(hover:hover){background-color: var(--color-neutral-500);}}}.hover\:bg-neutral-800{&:hover{@media(hover:hover){background-color: var(--color-neutral-800);}}}.hover\:bg-orange-700{&:hover{@media(hover:hover){background-color: var(--color-orange-700);}}}.hover\:bg-primary-hover{&:hover{@media(hover:hover){background-color: var(--color-primary-hover);}}}.hover\:bg-red-700{&:hover{@media(hover:hover){background-color: var(--color-red-700);}}}.hover\:bg-red-800{&:hover{@media(hover:hover){background-color: var(--color-red-800);}}}.hover\:bg-red-950{&:hover{@media(hover:hover){background-color: var(--color-red-950);}}}.hover\:bg-sky-100{&:hover{@media(hover:hover){background-color: var(--color-sky-100);}}}.hover\:bg-sky-500{&:hover{@media(hover:hover){background-color: var(--color-sky-500);}}}.hover\:bg-sky-500\/50{&:hover{@media(hover:hover){background-color: color-mix(in oklab,var(--color-sky-500) 50%,transparent);}}}.hover\:bg-sky-800{&:hover{@media(hover:hover){background-color: var(--color-sky-800);}}}.hover\:bg-sky-950{&:hover{@media(hover:hover){background-color: var(--color-sky-950);}}}.hover\:bg-white\/5{&:hover{@media(hover:hover){background-color: color-mix(in oklab,var(--color-white) 5%,transparent);}}}.hover\:bg-yellow-800{&:hover{@media(hover:hover){background-color: var(--color-yellow-800);}}}.hover\:text-neutral-600{&:hover{@media(hover:hover){color: var(--color-neutral-600);}}}.hover\:text-neutral-700{&:hover{@media(hover:hover){color: var(--color-neutral-700);}}}.hover\:text-neutral-800{&:hover{@media(hover:hover){color: var(--color-neutral-800);}}}.hover\:text-neutral-900{&:hover{@media(hover:hover){color: var(--color-neutral-900);}}}.hover\:text-sky-800{&:hover{@media(hover:hover){color: var(--color-sky-800);}}}.hover\:text-text-on-dark{&:hover{@media(hover:hover){color: var(--color-text-on-dark);}}}.hover\:text-white{&:hover{@media(hover:hover){color: var(--color-white);}}}.hover\:underline{&:hover{@media(hover:hover){text-decoration-line: underline;}}}.hover\:decoration-1{&:hover{@media(hover:hover){text-decoration-thickness: 1px;}}}.hover\:shadow-\[inset_0_0_0_2px_currentColor\]{&:hover{@media(hover:hover){--tw-shadow: inset 0 0 0 2px var(--tw-shadow-color,currentColor); box-shadow: var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);}}}.file\:hover\:bg-neutral-200{&::file-selector-button{&:hover{@media(hover:hover){background-color: var(--color-neutral-200);}}}}.focus\:border-primary{&:focus{border-color:var(--color-primary)}}.focus\:border-sky-500{&:focus{border-color:var(--color-sky-500)}}.focus\:bg-neutral-100{&:focus{background-color:var(--color-neutral-100)}}.focus\:bg-red-50{&:focus{background-color:var(--color-red-50)}}.focus\:shadow-\[inset_0_0_0_2px_var\(--color-red-500\)\]{&:focus{--tw-shadow:inset 0 0 0 2px var(--tw-shadow-color, var(--color-red-500));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\:outline-hidden{&:focus{--tw-outline-style:none;outline-style:none;@media(forced-colors:active){outline: 2px solid transparent; outline-offset: 2px;}}}.focus\:outline-2{&:focus{outline-style:var(--tw-outline-style);outline-width:2px}}.focus\:outline-offset-1{&:focus{outline-offset:1px}}.focus\:outline-green-500{&:focus{outline-color:var(--color-green-500)}}.focus\:outline-red-500{&:focus{outline-color:var(--color-red-500)}}.focus\:outline-sky-500{&:focus{outline-color:var(--color-sky-500)}}.focus-visible\:outline-2{&:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}}.focus-visible\:outline-offset-2{&:focus-visible{outline-offset:2px}}.focus-visible\:outline-current{&:focus-visible{outline-color:currentcolor}}.focus-visible\:outline-primary{&:focus-visible{outline-color:var(--color-primary)}}.active\:bg-neutral-200{&:active{background-color:var(--color-neutral-200)}}.enabled\:hover\:bg-neutral-50{&:enabled{&:hover{@media(hover:hover){background-color: var(--color-neutral-50);}}}}.enabled\:hover\:bg-neutral-900{&:enabled{&:hover{@media(hover:hover){background-color: var(--color-neutral-900);}}}}.enabled\:hover\:bg-red-700{&:enabled{&:hover{@media(hover:hover){background-color: var(--color-red-700);}}}}.disabled\:cursor-not-allowed{&:disabled{cursor:not-allowed}}.disabled\:bg-neutral-100{&:disabled{background-color:var(--color-neutral-100)}}.disabled\:bg-neutral-50{&:disabled{background-color:var(--color-neutral-50)}}.disabled\:text-neutral-300{&:disabled{color:var(--color-neutral-300)}}.disabled\:text-neutral-400{&:disabled{color:var(--color-neutral-400)}}.disabled\:opacity-40{&:disabled{opacity:40%}}.disabled\:opacity-50{&:disabled{opacity:50%}}.disabled\:hover\:bg-transparent{&:disabled{&:hover{@media(hover:hover){background-color: transparent;}}}}.sm\:block{@media(width >= 40rem){display: block;}}.sm\:flex{@media(width >= 40rem){display: flex;}}.sm\:hidden{@media(width >= 40rem){display: none;}}.sm\:w-48{@media(width >= 40rem){width: calc(var(--spacing) * 48);}}.sm\:w-64{@media(width >= 40rem){width: calc(var(--spacing) * 64);}}.sm\:grow-0{@media(width >= 40rem){flex-grow: 0;}}.sm\:grid-cols-2{@media(width >= 40rem){grid-template-columns: repeat(2,minmax(0,1fr));}}.sm\:grid-cols-3{@media(width >= 40rem){grid-template-columns: repeat(3,minmax(0,1fr));}}.sm\:flex-row{@media(width >= 40rem){flex-direction: row;}}.md\:flex-initial{@media(width >= 48rem){flex: 0 auto;}}.md\:justify-start{@media(width >= 48rem){justify-content: flex-start;}}.lg\:col-span-10{@media(width >= 64rem){grid-column: span 10 / span 10;}}.lg\:col-span-2{@media(width >= 64rem){grid-column: span 2 / span 2;}}.lg\:col-span-5{@media(width >= 64rem){grid-column: span 5 / span 5;}}.lg\:col-span-7{@media(width >= 64rem){grid-column: span 7 / span 7;}}.lg\:block{@media(width >= 64rem){display: block;}}.lg\:h-full{@media(width >= 64rem){height: 100%;}}.lg\:grid-cols-12{@media(width >= 64rem){grid-template-columns: repeat(12,minmax(0,1fr));}}.lg\:self-start{@media(width >= 64rem){align-self: flex-start;}}.lg\:pr-8{@media(width >= 64rem){padding-right: calc(var(--spacing) * 8);}}.\[\&_\.ui-form\]\:m-0{& .ui-form{margin:0}}.\[\&_input\]\:cursor-text{& input{cursor:text}}.\[\&_td\]\:p-3{& td{padding:calc(var(--spacing) * 3)}}.\[\&_td\]\:p-4{& td{padding:calc(var(--spacing) * 4)}}.\[\&_td\]\:px-2{& td{padding-inline:calc(var(--spacing) * 2)}}.\[\&_td\]\:py-0\.5{& td{padding-block:calc(var(--spacing) * .5)}}.\[\&_td\]\:py-1{& td{padding-block:var(--spacing)}}.\[\&_td\+td\]\:border-l{& td+td{border-left-style:var(--tw-border-style);border-left-width:1px}}.\[\&_td\+td\]\:border-neutral-300{& td+td{border-color:var(--color-neutral-300)}}.\[\&_th\]\:border-b{& th{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}}.\[\&_th\]\:border-neutral-300{& th{border-color:var(--color-neutral-300)}}.\[\&_tr\:hover\]\:\!bg-green-100{& tr:hover{background-color:var(--color-green-100)!important}}.\[\&_tr\:hover\]\:\!bg-neutral-200{& tr:hover{background-color:var(--color-neutral-200)!important}}.\[\&_tr\:hover\]\:\!bg-sky-100{& tr:hover{background-color:var(--color-sky-100)!important}}.\[\&_tr\:not\(\:last-child\)\]\:border-b{& tr:not(:last-child){border-bottom-style:var(--tw-border-style);border-bottom-width:1px}}.\[\&_tr\:not\(\:last-child\)\]\:border-neutral-300{& tr:not(:last-child){border-color:var(--color-neutral-300)}}.\[\&_tr\:nth-child\(even\)\]\:bg-neutral-100{& tr:nth-child(even){background-color:var(--color-neutral-100)}}}@property --tw-translate-x{syntax: "*"; inherits: false; initial-value: 0; }@property --tw-translate-y{syntax: "*"; @@ -87,6 +86,36 @@ }@property --tw-ring-offset-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000; +}@property --tw-outline-style{syntax: "*"; + inherits: false; + initial-value: solid; +}@property --tw-blur{syntax: "*"; + inherits: false; +}@property --tw-brightness{syntax: "*"; + inherits: false; +}@property --tw-contrast{syntax: "*"; + inherits: false; +}@property --tw-grayscale{syntax: "*"; + inherits: false; +}@property --tw-hue-rotate{syntax: "*"; + inherits: false; +}@property --tw-invert{syntax: "*"; + inherits: false; +}@property --tw-opacity{syntax: "*"; + inherits: false; +}@property --tw-saturate{syntax: "*"; + inherits: false; +}@property --tw-sepia{syntax: "*"; + inherits: false; +}@property --tw-drop-shadow{syntax: "*"; + inherits: false; +}@property --tw-drop-shadow-color{syntax: "*"; + inherits: false; +}@property --tw-drop-shadow-alpha{syntax: ""; + inherits: false; + initial-value: 100%; +}@property --tw-drop-shadow-size{syntax: "*"; + inherits: false; }@property --tw-duration{syntax: "*"; inherits: false; }@property --tw-ease{syntax: "*"; @@ -94,7 +123,4 @@ }@property --tw-content{syntax: "*"; initial-value: ""; inherits: false; -}@property --tw-outline-style{syntax: "*"; - inherits: false; - initial-value: solid; } \ No newline at end of file diff --git a/go/cmd/examples/go-wasm-web/wwwroot/fonts/lora-latin-ext-italic.woff2 b/go/cmd/examples/go-wasm-web/wwwroot/fonts/lora-latin-ext-italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..61ff30a0001ddc12f20739a38be0cde3e66c1e84 GIT binary patch literal 21128 zcmV(;K-<4}Pew8T0RR9108)qm6951J0ImQ408$$O0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/go/cmd/examples/go-wasm-web/wwwroot/fonts/lora-latin-italic.woff2 b/go/cmd/examples/go-wasm-web/wwwroot/fonts/lora-latin-italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..856707df67588bb5ba78e76d58da956adf2724b0 GIT binary patch literal 40772 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 %P4654+xh>G9{v9#qU*mK8o%)B%lt=t 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 literal 0 HcmV?d00001 diff --git a/go/cmd/examples/go-wasm-web/wwwroot/fonts/lora-latin-normal.woff2 b/go/cmd/examples/go-wasm-web/wwwroot/fonts/lora-latin-normal.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..918a477265cafbb788c473ab9b701a99a11dda6e GIT binary patch literal 37788 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 built as ordinary HTML is an +// inert unknown element that renders nothing. +func Svg(m ...Mod) *VNode { return El("svg", m...) } +func Path(m ...Mod) *VNode { return El("path", m...) } diff --git a/go/vdom/vnode.go b/go/vdom/vnode.go index f9226d0b..c891a49b 100644 --- a/go/vdom/vnode.go +++ b/go/vdom/vnode.go @@ -11,14 +11,24 @@ import ( ) // Event is a DOM event passed to handlers. The client provides a concrete -// implementation; on the server events are never invoked. +// implementation; on the server events are never invoked, and every accessor +// returns its zero value. type Event interface { PreventDefault() - Value() string // target.value (for inputs) + StopPropagation() + Value() string // target.value (for inputs) + Checked() bool // target.checked (for checkboxes / radios) + Key() string // KeyboardEvent.key — compare against the KEY_* constants + ClientX() int // pointer position, viewport coordinates + ClientY() int // + Target() any // the platform DOM handle of event.target; nil on the server + SetData(format, data string) // DataTransfer — no-ops off a drag event + GetData(format string) string } // VNode is a virtual DOM node. Tag == "" is a text node (content in Text). HTML, -// if set on an element, is raw innerHTML (children ignored). +// if set on an element, is raw innerHTML (children ignored). Tag == TagPortal +// renders its children into document.body instead of in place. type VNode struct { Tag string Text string @@ -28,6 +38,9 @@ type VNode struct { Events map[string]func(Event) Children []*VNode + // Ref, if set, receives the DOM node this VNode renders to (see WithRef). + Ref *Ref + // Runtime holds the wasm reconciler's per-node bookkeeping (DOM handle, // listener wrappers). It's `any` so this package stays platform-neutral; it // is nil on the server. @@ -37,6 +50,13 @@ type VNode struct { // Mod configures a VNode while it is built. type Mod interface{ apply(*VNode) } +// TagPortal marks a node whose children are mounted into document.body rather +// than into its own parent. It is how a floating panel escapes an ancestor's +// `overflow: hidden` (menus scroll, modals clip) or `transform` (which would +// re-root `position: fixed` onto the modal instead of the viewport). In the tree +// it occupies a hidden, zero-size placeholder; the children live at body level. +const TagPortal = "#portal" + // El builds an element VNode. func El(tag string, mods ...Mod) *VNode { n := &VNode{Tag: tag, Attrs: map[string]string{}, Props: map[string]string{}, Events: map[string]func(Event){}} @@ -46,6 +66,17 @@ func El(tag string, mods ...Mod) *VNode { return n } +// Portal renders its children into document.body. On the server it renders the +// placeholder only — floating content is closed during SSR, so there is nothing +// to emit, and the placeholder keeps the client's hydration walk aligned. +func Portal(children ...*VNode) *VNode { + n := El(TagPortal) + for _, c := range children { + c.apply(n) + } + return n +} + // Text builds a text VNode. func Text(s string) *VNode { return &VNode{Text: s} } @@ -106,6 +137,13 @@ func writeNode(b *strings.Builder, n *VNode) { b.WriteString(html.EscapeString(n.Text)) return } + if n.Tag == TagPortal { + // Placeholder only — the children belong to document.body, which SSR does + // not own. Emitting the same element the client creates keeps hydration's + // childNodes lined up. + b.WriteString(`
`) + return + } b.WriteByte('<') b.WriteString(n.Tag) writeAttrs(b, n.Attrs) diff --git a/go/wasmruntime/host.go b/go/wasmruntime/host.go new file mode 100644 index 00000000..eb09b125 --- /dev/null +++ b/go/wasmruntime/host.go @@ -0,0 +1,92 @@ +package wasmruntime + +import ( + "strconv" + "strings" +) + +// The host API: the channel through which the browser tells WebAssembly things Go +// cannot work out on its own — how big an element is, where the pointer is, how +// tall the viewport is — plus the imperative escape hatches (write a style, focus +// an input, download a file) that a pure re-render cannot express. +// +// Every function here exists in two builds: the real one (host_wasm.go, js+wasm) +// and a no-op that returns zero values (host_native.go). That is what lets the +// neutral kjol/webui components — which must also compile on the server for SSR — +// call them unconditionally. On the server a measurement is simply the zero Rect, +// a listener is never installed, and a timer never fires; components render their +// pre-measurement state (a panel with `visibility: hidden`), which is exactly what +// SSR should ship. +// +// Two rules for callers: +// +// 1. Measure only after the DOM exists. A ref is empty until the reconciler has +// committed; use AfterRender to run measurement code once the current render +// is on screen. +// 2. Do NOT position through signals. Signal.Set re-renders the whole tree; doing +// that on every scroll frame is pathological. Write positions with SetStyle, +// which mutates the DOM node directly and leaves the vdom alone. + +// Rect is an element's box in viewport coordinates — the result of +// getBoundingClientRect. Viewport coordinates compose directly with +// `position: fixed`, so no scroll compensation is needed (or wanted) anywhere. +type Rect struct{ X, Y, Width, Height float64 } + +func (r Rect) Top() float64 { return r.Y } +func (r Rect) Left() float64 { return r.X } +func (r Rect) Right() float64 { return r.X + r.Width } +func (r Rect) Bottom() float64 { return r.Y + r.Height } +func (r Rect) CenterX() float64 { return r.X + r.Width/2 } +func (r Rect) CenterY() float64 { return r.Y + r.Height/2 } + +// Empty reports whether the rect carries no useful geometry — an unmounted ref, or +// an element that has not been laid out yet. Positioning code must treat this as +// "cannot measure yet" rather than as a box at the origin, or the panel paints at +// 0,0 for a frame. +func (r Rect) Empty() bool { return r.Width == 0 && r.Height == 0 } + +// Size is a width/height pair — the viewport, or an element's size. +type Size struct{ Width, Height float64 } + +// Unsub removes a listener installed by OnWindow / OnDocument / ObserveResize. +// Always call it when the thing that installed it goes away; a floating panel that +// leaks a window scroll listener per open will crawl. +type Unsub func() + +// ScrollBlock values for ScrollIntoView. +const ( + ScrollBlockStart = "start" + ScrollBlockCenter = "center" + ScrollBlockEnd = "end" + ScrollBlockNearest = "nearest" +) + +// parseCSSLength resolves a CSS length to pixels. rootFontSize is the computed +// font-size of :root (itself a px string), which is what a rem is measured +// against. Unitless and unparseable values yield 0. +func parseCSSLength(value, rootFontSize string) float64 { + value = strings.TrimSpace(value) + if value == "" { + return 0 + } + switch { + case strings.HasSuffix(value, "px"): + return parseFloat(strings.TrimSuffix(value, "px")) + case strings.HasSuffix(value, "rem"): + root := parseFloat(strings.TrimSuffix(strings.TrimSpace(rootFontSize), "px")) + if root == 0 { + root = 16 // the browser default, if :root's font-size is unreadable + } + return parseFloat(strings.TrimSuffix(value, "rem")) * root + default: + return parseFloat(value) + } +} + +func parseFloat(s string) float64 { + f, err := strconv.ParseFloat(strings.TrimSpace(s), 64) + if err != nil { + return 0 + } + return f +} diff --git a/go/wasmruntime/host_native.go b/go/wasmruntime/host_native.go new file mode 100644 index 00000000..d11a58c9 --- /dev/null +++ b/go/wasmruntime/host_native.go @@ -0,0 +1,49 @@ +//go:build !(js && wasm) + +package wasmruntime + +import "kjol/vdom" + +// The server half of the host API (see host.go). Nothing here touches a browser, +// because there isn't one: measurements are zero, listeners are never installed, +// timers never fire, storage is always empty. Components call these +// unconditionally and render their unmeasured state, which is what SSR ships. + +func Measure(*vdom.Ref) Rect { return Rect{} } +func Viewport() Size { return Size{} } +func CSSVarPx(string) float64 { return 0 } + +func RAF(func()) int { return 0 } +func CancelRAF(int) {} +func AfterRender(func()) {} + +func SetStyle(*vdom.Ref, string, string) {} +func RemoveStyle(*vdom.Ref, string) {} +func SetText(*vdom.Ref, string) {} +func SetHTML(*vdom.Ref, string) {} + +func Focus(*vdom.Ref) {} +func Blur(*vdom.Ref) {} +func SelectionRange(*vdom.Ref) (int, int) { return 0, 0 } +func SetSelectionRange(*vdom.Ref, int, int) {} +func ScrollIntoView(*vdom.Ref, bool, string) {} +func ScrollLeft(*vdom.Ref) float64 { return 0 } +func SetScrollLeft(*vdom.Ref, float64) {} + +func Contains(*vdom.Ref, any) bool { return false } +func ClosestAttr(any, string, string) (string, bool) { return "", false } +func QuerySelector(string) *vdom.Ref { return vdom.NewRef() } + +func OnWindow(string, bool, func(vdom.Event)) Unsub { return func() {} } +func OnDocument(string, bool, func(vdom.Event)) Unsub { return func() {} } +func ObserveResize(*vdom.Ref, func()) Unsub { return func() {} } + +func SetTimeout(int, func()) int { return 0 } +func ClearTimeout(int) {} + +func StorageGet(string) (string, bool) { return "", false } +func StorageSet(string, string) {} +func StorageRemove(string) {} + +func Download(string, string, []byte) {} +func Print(string, []byte) {} diff --git a/go/wasmruntime/host_test.go b/go/wasmruntime/host_test.go new file mode 100644 index 00000000..111ea611 --- /dev/null +++ b/go/wasmruntime/host_test.go @@ -0,0 +1,214 @@ +//go:build js && wasm + +package wasmruntime + +import ( + "strings" + "syscall/js" + "testing" + + "kjol/vdom" +) + +// Run from kjol/go: +// +// GOOS=js GOARCH=wasm go test -exec="node testdata/domexec.js" ./wasmruntime + +// A Ref must be attached when the element is created, survive a diff that reuses +// the element, and be nil again once the element is gone — otherwise measurement +// code silently reads a stale node. +func TestRefLifecycle(t *testing.T) { + root := document.Call("createElement", "div") + panel := vdom.NewRef() + + if panel.Mounted() { + t.Fatal("a fresh ref should not be mounted") + } + + a := vdom.El("div", vdom.WithRef(panel), vdom.Attr("class", "one")) + patchChildren(root, nil, one(a)) + if !panel.Mounted() { + t.Fatal("ref was not attached on create") + } + created, _ := panel.Node().(js.Value) + + // A re-render builds a fresh VNode carrying the same *Ref; the diff adopts the + // existing element, so the ref must still point at it. + b := vdom.El("div", vdom.WithRef(panel), vdom.Attr("class", "two")) + patchChildren(root, one(a), one(b)) + if !panel.Mounted() { + t.Fatal("ref was detached by a re-render that reused the element") + } + if adopted, _ := panel.Node().(js.Value); !adopted.Equal(created) { + t.Error("ref points at a different node after a reusing diff") + } + + // Removing the element must clear the ref. + patchChildren(root, one(b), nil) + if panel.Mounted() { + t.Error("ref still points at a removed element") + } +} + +// A tag change replaces the element. createDOM runs before release (replaceChild +// needs both nodes), so a naive detach-on-release would nil the ref that was just +// pointed at the NEW element. +func TestRefSurvivesTagChange(t *testing.T) { + root := document.Call("createElement", "div") + r := vdom.NewRef() + + a := vdom.El("div", vdom.WithRef(r)) + patchChildren(root, nil, one(a)) + + b := vdom.El("span", vdom.WithRef(r)) + patchChildren(root, one(a), one(b)) + + if !r.Mounted() { + t.Fatal("ref was cleared when the element changed tag") + } + if got := Measure(r); got != (Rect{}) { // shim reports a zero rect by default + _ = got + } + if !strings.Contains(root.Get("innerHTML").String(), "/