@marktiderman/genesis-sites 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +241 -13
- package/dist/assets/islands.77d11f5697.js +1 -0
- package/dist/assets/sites-forms.732cc7e0c1.css +10 -0
- package/dist/assets/sites-forms.css +1 -1
- package/dist/assets/sites.716b4ac1a5.css +2 -0
- package/dist/assets/sites.css +1 -1
- package/dist/assets.generated-QSB7EJWX.js +3 -0
- package/dist/assets.generated-QSB7EJWX.js.map +1 -0
- package/dist/blocks.d.ts +1 -1
- package/dist/blocks.js +5 -1
- package/dist/blocks.js.map +1 -1
- package/dist/chunk-3VKTBE7S.js +69 -0
- package/dist/chunk-3VKTBE7S.js.map +1 -0
- package/dist/chunk-5IXDFFEG.js +465 -0
- package/dist/chunk-5IXDFFEG.js.map +1 -0
- package/dist/chunk-C375ZPU2.js +2241 -0
- package/dist/chunk-C375ZPU2.js.map +1 -0
- package/dist/{chunk-GA7U3CIN.js → chunk-FBQF2L7O.js} +317 -97
- package/dist/chunk-FBQF2L7O.js.map +1 -0
- package/dist/chunk-H6ED3K4R.js +18 -0
- package/dist/chunk-H6ED3K4R.js.map +1 -0
- package/dist/chunk-KPOX7D4S.js +250 -0
- package/dist/chunk-KPOX7D4S.js.map +1 -0
- package/dist/chunk-VZUDRPFG.js +13 -0
- package/dist/chunk-VZUDRPFG.js.map +1 -0
- package/dist/{chunk-KEF3V5ZN.js → chunk-ZGWGQGT2.js} +169 -73
- package/dist/chunk-ZGWGQGT2.js.map +1 -0
- package/dist/editor.d.ts +526 -0
- package/dist/editor.js +2480 -0
- package/dist/editor.js.map +1 -0
- package/dist/handler-QHH453YG.js +9 -0
- package/dist/handler-QHH453YG.js.map +1 -0
- package/dist/import.d.ts +130 -0
- package/dist/import.js +330 -0
- package/dist/import.js.map +1 -0
- package/dist/index.d.ts +47 -8
- package/dist/index.js +5 -250
- package/dist/index.js.map +1 -1
- package/dist/{registry-CdgVymsu.d.ts → registry-HBn1X60x.d.ts} +274 -8
- package/dist/sections.d.ts +422 -6
- package/dist/sections.js +4 -2
- package/dist/{store-BzGw2i5J.d.ts → store-BXiZeZzH.d.ts} +119 -53
- package/dist/supabase.d.ts +5 -5
- package/dist/supabase.js +115 -6
- package/dist/supabase.js.map +1 -1
- package/dist/web.d.ts +26 -8
- package/dist/web.js +7 -353
- package/dist/web.js.map +1 -1
- package/migrations/0001_genesis_sites.sql +64 -6
- package/migrations/0002_genesis_sites_posts.sql +404 -0
- package/migrations/tests/0001_genesis_sites.test.sql +30 -1
- package/migrations/tests/0002_genesis_sites_posts.test.sql +242 -0
- package/package.json +28 -10
- package/dist/assets/islands.230b20b9c4.js +0 -1
- package/dist/assets/sites-forms.5e6ebf31c3.css +0 -10
- package/dist/assets/sites.b28b796c6f.css +0 -2
- package/dist/chunk-43XUAO63.js +0 -1255
- package/dist/chunk-43XUAO63.js.map +0 -1
- package/dist/chunk-GA7U3CIN.js.map +0 -1
- package/dist/chunk-KEF3V5ZN.js.map +0 -1
package/README.md
CHANGED
|
@@ -8,29 +8,32 @@ hydration, and published as immutable releases you can roll back.
|
|
|
8
8
|
menus, redirects) in Puck's `{ root, content }` shape, the section registry
|
|
9
9
|
(`defineSection`), props migrations, SEO, the publish checks, the theme from
|
|
10
10
|
your brand, templates and the `SiteStore` contract.
|
|
11
|
-
- **Sections** (`/sections`):
|
|
11
|
+
- **Sections** (`/sections`): 20 server-rendered sections on Genesis UI.
|
|
12
12
|
- **Web** (`/web`): `handleSiteRequest`, the renderer and request handler.
|
|
13
13
|
- **Supabase** (`/supabase`): `createSupabaseSiteStore`, over the
|
|
14
14
|
`genesis_sites` schema in `migrations/`.
|
|
15
|
+
- **Import** (`/import`, Node): `importAssets`, which re-hosts an old site's
|
|
16
|
+
images and PDFs behind a guard against server-side request forgery, and
|
|
17
|
+
`rewriteUrls`.
|
|
18
|
+
- **Editor** (`/editor`): `<SiteEditor>`, the visual editor (on Puck).
|
|
15
19
|
- **Block** (`/blocks`): `sitesBlock`, so `genesis add sites` installs the
|
|
16
20
|
migration.
|
|
17
21
|
|
|
18
|
-
Status: beta. The
|
|
19
|
-
(`sectionManifests`, `sectionJsonSchema`, labels, categories, variants and
|
|
20
|
-
presets) are in place for it. The design and its reasoning are in
|
|
22
|
+
Status: beta. The design and its reasoning are in
|
|
21
23
|
[docs/SITES.md](../../docs/SITES.md).
|
|
22
24
|
|
|
23
25
|
## Install
|
|
24
26
|
|
|
25
27
|
```bash
|
|
26
|
-
genesis add sites # copies the
|
|
28
|
+
genesis add sites # copies the migrations (0001, 0002) and their pgTAP tests into supabase/
|
|
27
29
|
pnpm add @marktiderman/genesis-sites zod@^4
|
|
28
30
|
```
|
|
29
31
|
|
|
30
32
|
Peers: `react` and `react-dom` 19, `zod` 4, `@marktiderman/genesis-ui`,
|
|
31
33
|
`@marktiderman/genesis-design-system`, `@marktiderman/genesis-forms` and
|
|
32
|
-
`-forms-web` (the form embed), `lucide-react`,
|
|
33
|
-
the Supabase store.
|
|
34
|
+
`-forms-web` (the form embed), `lucide-react`, `@supabase/supabase-js` for
|
|
35
|
+
the Supabase store, and `@puckeditor/core` 0.23 for the editor. The last two
|
|
36
|
+
are optional: install them only if you use the Supabase store or `/editor`.
|
|
34
37
|
|
|
35
38
|
Then:
|
|
36
39
|
|
|
@@ -140,7 +143,11 @@ never public. A stored page that no longer parses is left out of the site
|
|
|
140
143
|
|
|
141
144
|
**Preview.** `mode: "preview"` renders the drafts, with `noindex` and
|
|
142
145
|
`Cache-Control: private, no-store`, through a store signed in as the viewer,
|
|
143
|
-
so the database's `can_view` decides who sees them.
|
|
146
|
+
so the database's `can_view` decides who sees them. Pass the signed-in
|
|
147
|
+
viewer's user id as `viewer`: without one, preview answers null before it
|
|
148
|
+
reads a draft (anon has no grant on them), and the host shows its sign-in
|
|
149
|
+
page or a 404. A failed read of the published posts on the live site logs and
|
|
150
|
+
renders an empty list (or, for one post, not found) instead of failing the page.
|
|
144
151
|
|
|
145
152
|
## Sections
|
|
146
153
|
|
|
@@ -159,6 +166,53 @@ so the database's `can_view` decides who sees them.
|
|
|
159
166
|
| `rich-text` | narrow, wide | Text |
|
|
160
167
|
| `form-embed` | card, split | Contact form; Form card |
|
|
161
168
|
| `footer` | simple, columns, minimal | Footer; Footer with columns |
|
|
169
|
+
| `schedule` | grid, agenda | Weekly timetable; Day by day |
|
|
170
|
+
| `team` | cards, list | Team cards; Team list |
|
|
171
|
+
| `blog-list` | grid, list | Blog index; Latest three |
|
|
172
|
+
| `post-body` | article, cover | Article; Title over the cover |
|
|
173
|
+
| `map` | split, stacked | Find us; Map and address |
|
|
174
|
+
| `timeline` | vertical, cards | Week by week; Steps as cards |
|
|
175
|
+
| `file` | list, cards | Downloads; File cards |
|
|
176
|
+
|
|
177
|
+
And inside the MVP sections: `features` has a `steps` variant (numbered,
|
|
178
|
+
a button and a note per step) and `numbered`; `pricing` takes plan `groups`
|
|
179
|
+
(each with its heading, anchor and up to 12 plans) beside or instead of
|
|
180
|
+
`tiers`; `logos` has a `trust-bar` variant (a short claim and badges), and an
|
|
181
|
+
item without an image is a text badge.
|
|
182
|
+
|
|
183
|
+
- **`schedule`**: the week's classes by time and day, with coach, place,
|
|
184
|
+
a note and a booking link per class, and chips per class type in the
|
|
185
|
+
brand's colours (`types`, with a legend). On wider screens it is a table
|
|
186
|
+
(a caption, a header cell per day and per time, an empty slot said as "No
|
|
187
|
+
classes"); on a phone a day picker: radio buttons and the stylesheet's
|
|
188
|
+
`:has()` show one day's classes, with no script (every day shows where
|
|
189
|
+
`:has()` isn't supported).
|
|
190
|
+
- **`team`**: photo, role, credentials, a long bio, a quote, a button and a
|
|
191
|
+
link to the person's page (`profile`). The cards open each bio in place
|
|
192
|
+
(`<details>`); the list shows it all. Each person can have an `anchor`.
|
|
193
|
+
- **`map`**: the address as text, a picture (`image`) and a link to the
|
|
194
|
+
provider. No map frame is in the HTML: the islands loader shows a "Show
|
|
195
|
+
the map" button, and only a click puts the OpenStreetMap or Google Maps
|
|
196
|
+
frame on the page, so nothing loads from the provider before the visitor
|
|
197
|
+
asks. The frame's URL is built from the address or the coordinates, never
|
|
198
|
+
typed, and the page's Content-Security-Policy frames only that provider
|
|
199
|
+
(`frameOrigins` on the definition).
|
|
200
|
+
- **`timeline`**: an ordered list of steps, each with a label (a date,
|
|
201
|
+
"Week 1"), a title, copy, a picture and a button.
|
|
202
|
+
- **`file`**: downloads that say their type and size before anyone clicks
|
|
203
|
+
("PDF, 1.2 MB"). Upload a PDF with `putAsset`: it is stored under
|
|
204
|
+
`sites/<site_id>/files/`.
|
|
205
|
+
|
|
206
|
+
### Links
|
|
207
|
+
|
|
208
|
+
Every button and link prop is a `Link`: `{ label, href, target?, external?,
|
|
209
|
+
event? }`. `external: true` marks an outbound link (a booking or
|
|
210
|
+
membership system): it must be an http(s) URL (checked when parsed, and
|
|
211
|
+
inert when rendered if a document skipped the check), and it renders with
|
|
212
|
+
`rel="noopener noreferrer"` and `data-gs-outbound`. `target: "_blank"` opens
|
|
213
|
+
an http(s) link in a new tab (never a site path), with a visually hidden
|
|
214
|
+
"(opens in a new tab)". `event` names the click for your analytics
|
|
215
|
+
(`data-gs-event`, `cta` by default on buttons).
|
|
162
216
|
|
|
163
217
|
Every section is server-safe React on Genesis UI (`Band`, `Display`,
|
|
164
218
|
`BandLead`, `Button`), sits on a surface (`base`, `muted`, `accent`,
|
|
@@ -239,13 +293,22 @@ the slug is:
|
|
|
239
293
|
```ts
|
|
240
294
|
forms: (slug) =>
|
|
241
295
|
slug === "free-class"
|
|
242
|
-
? { kind: "definition", definition: freeClass.definition, submitUrl: "/api/forms/free-class" }
|
|
243
|
-
: slug === "
|
|
244
|
-
? { kind: "
|
|
245
|
-
:
|
|
296
|
+
? { kind: "definition", definition: freeClass.definition, submitUrl: "/api/forms/free-class" } // your endpoint
|
|
297
|
+
: slug === "crm"
|
|
298
|
+
? { kind: "definition", definition: enquiry.definition, submitUrl: "https://crm.example/hooks/riverside" } // another service's
|
|
299
|
+
: slug === "write-to-us"
|
|
300
|
+
? { kind: "mailto", email: "hello@riverside.example", subject: "A question" } // no endpoint yet
|
|
301
|
+
: slug === "waitlist"
|
|
302
|
+
? { kind: "embed", url: "https://forms.example/waitlist", title: "Join the waitlist" }
|
|
303
|
+
: null,
|
|
246
304
|
```
|
|
247
305
|
|
|
248
|
-
- `submitUrl` is a site path or an https URL.
|
|
306
|
+
- `submitUrl` is a site path or an https URL. An https endpoint's origin is
|
|
307
|
+
added to the page's `connect-src` and `form-action`.
|
|
308
|
+
- `mailto` is the fallback for a site with no endpoint: a button that opens
|
|
309
|
+
the visitor's email, with the subject you give (line breaks removed). No
|
|
310
|
+
form is drawn, nothing is posted or stored, and a page never posts a form
|
|
311
|
+
to `mailto:`.
|
|
249
312
|
- A genesis-forms definition with no logic, pages, recall or hidden inputs
|
|
250
313
|
(most contact and sign-up forms) renders as a plain HTML form. The islands
|
|
251
314
|
loader sends `{ form, answers }` as JSON, with answers keyed by field id as
|
|
@@ -258,6 +321,77 @@ forms: (slug) =>
|
|
|
258
321
|
Either way, your endpoint checks the answers again (`validateSubmission` from
|
|
259
322
|
genesis-forms). An unknown slug renders nothing and logs.
|
|
260
323
|
|
|
324
|
+
## The blog
|
|
325
|
+
|
|
326
|
+
A site's posts live beside its pages, each with a draft and a published
|
|
327
|
+
copy (`site_posts`, migration `0002_genesis_sites_posts.sql`). A post goes
|
|
328
|
+
live on its own: `publishPost` checks the draft (`checkPost`: alt text on
|
|
329
|
+
its images, no `h1` and no skipped heading level in its text) and makes it
|
|
330
|
+
the published copy, without a new release of the site. `unpublishPost`
|
|
331
|
+
takes it down; `deletePost` removes it. A site's rollback doesn't touch its
|
|
332
|
+
posts.
|
|
333
|
+
|
|
334
|
+
```ts
|
|
335
|
+
const { id, rev } = await store.savePost(siteId, { slug: "first-class-tips", doc: { schemaVersion: 1, title: "Five tips for your first class", excerpt: "…", body } });
|
|
336
|
+
await store.savePost(siteId, { id, rev, slug: "first-class-tips", doc: edited }); // compare-and-swap: { conflict, rev } if someone saved first
|
|
337
|
+
await store.publishPost(id); // PublishBlockedError with `issues` when a check fails
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
The site's post page is a page of kind `post` (at most one, never `/`): the
|
|
341
|
+
template every post renders in. At its own path (`/blog`) it is the blog's
|
|
342
|
+
index; at `/blog/<slug>` it shows that post in its `post-body` section,
|
|
343
|
+
with the post's title as the page's `h1`, `og:type` article, `Article`
|
|
344
|
+
JSON-LD and a breadcrumb through the blog. A `blog-list` section lists the
|
|
345
|
+
published posts, newest first, in pages (`?page=2`, plain links), anywhere
|
|
346
|
+
on the site; on a post it leaves that post out. The sitemap lists every
|
|
347
|
+
published post, `/rss.xml` is the feed, and every page links to it.
|
|
348
|
+
|
|
349
|
+
Moving a blog in: `importPosts(siteId, posts)` takes up to 500 posts once,
|
|
350
|
+
each with its slug and its old `publishedAt`. A slug the site already has is
|
|
351
|
+
skipped, and a post that fails a check comes in as a draft with its
|
|
352
|
+
`issues`, so nothing goes live unchecked. Re-host its pictures first (see
|
|
353
|
+
Importing a site) and run `rewriteUrls` over each document.
|
|
354
|
+
|
|
355
|
+
Anon reads posts only through `genesis_sites.live_posts(site_id)` (the
|
|
356
|
+
published posts of a live site, without bodies) and `live_post(site_id,
|
|
357
|
+
slug)`; drafts are never public. `withCacheInvalidation` purges
|
|
358
|
+
`site:<id>` after a post goes up, comes down, is deleted or imported, and
|
|
359
|
+
the database sends a `genesis_sites` notification with `action: "post"`.
|
|
360
|
+
|
|
361
|
+
## Importing a site
|
|
362
|
+
|
|
363
|
+
```ts
|
|
364
|
+
import { importAssets, rewriteUrls } from "@marktiderman/genesis-sites/import";
|
|
365
|
+
|
|
366
|
+
const { map, assets, failed } = await importAssets(editorStore, siteId, oldImageAndPdfUrls, { alt: (url) => oldAlt[url] });
|
|
367
|
+
const page = rewriteUrls(importedPage, map); // image sources and file links now point at the copies
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
Each URL is fetched on your server, checked, and stored through the
|
|
371
|
+
store's `putAsset` (which records it in `site_assets`, with the image's
|
|
372
|
+
width and height) under `sites/<site_id>/` (a PDF under `files/`). An image
|
|
373
|
+
with no alt text yet is `needsAlt`; the publish check asks for it before
|
|
374
|
+
the page goes live. The fetch is guarded against server-side request
|
|
375
|
+
forgery:
|
|
376
|
+
|
|
377
|
+
- http and https only, ports 80 and 443, no user name or password in the URL;
|
|
378
|
+
- only public addresses: loopback, private, link-local (cloud metadata),
|
|
379
|
+
carrier-grade NAT, documentation, benchmark, multicast and reserved
|
|
380
|
+
ranges are refused, and so are their IPv6 forms (IPv4-mapped, NAT64,
|
|
381
|
+
6to4, unique local, site-local);
|
|
382
|
+
- the address is checked on every address a name resolves to, when the
|
|
383
|
+
socket connects (the request's own DNS lookup), so DNS rebinding can't
|
|
384
|
+
slip past it, and the request uses a fresh agent, never a pooled socket
|
|
385
|
+
or a proxy from the environment;
|
|
386
|
+
- every redirect is checked the same way, and at most three are followed;
|
|
387
|
+
- a size cap (15 MiB by default, by `Content-Length` and while reading)
|
|
388
|
+
and a time limit (20 s);
|
|
389
|
+
- the type comes from the bytes: PNG, JPEG, GIF, WebP, AVIF or PDF. SVG,
|
|
390
|
+
HTML and anything else are refused, whatever the name or `Content-Type`
|
|
391
|
+
says; an image over 20000 pixels a side is refused too.
|
|
392
|
+
|
|
393
|
+
A URL that fails is listed in `failed` with the reason, and the rest go on.
|
|
394
|
+
|
|
261
395
|
## Who may edit
|
|
262
396
|
|
|
263
397
|
The migration asks two hooks, which ship as stubs that fail closed:
|
|
@@ -286,6 +420,13 @@ stub, so neither `genesis migrate` nor a later genesis-sites migration ever
|
|
|
286
420
|
overwrites your version. `genesis_sites.reserved_paths()` works the same way
|
|
287
421
|
for the page paths your app keeps.
|
|
288
422
|
|
|
423
|
+
`reserved_paths()` covers redirects too: `save_site_draft` and `publish_site`
|
|
424
|
+
refuse a redirect whose `from` is a reserved path (any case, with or without a
|
|
425
|
+
query string), so a site can't take over `/auth` or your app's other routes.
|
|
426
|
+
`handleSiteRequest` checks `reserved` before redirects and returns `null` for
|
|
427
|
+
a reserved path. Anon can't execute `reserved_paths()`, so the renderer never
|
|
428
|
+
reads it: pass the same list to `handleSiteRequest({ reserved })` yourself.
|
|
429
|
+
|
|
289
430
|
The accessibility and content checks run in the stores (`prepareRelease`)
|
|
290
431
|
before `publish_site`; the database checks shape, paths and revisions. So the
|
|
291
432
|
checks guide editors but are not a security boundary: an editor calling the
|
|
@@ -300,6 +441,93 @@ Store uploads under `sites/<site_id>/...` so your storage policies can scope
|
|
|
300
441
|
by site with `can_edit`; the migration's header has an example policy. Limit
|
|
301
442
|
the bucket's `allowed_mime_types` to images and PDF: never SVG or HTML, which
|
|
302
443
|
a browser runs as a page. `putAsset` refuses other types before it uploads.
|
|
444
|
+
A public bucket serves any file to whoever has its URL, so give uploads random
|
|
445
|
+
names (`putAsset` does) and never put anything there that isn't meant for the
|
|
446
|
+
published site.
|
|
447
|
+
|
|
448
|
+
## The editor
|
|
449
|
+
|
|
450
|
+
```bash
|
|
451
|
+
pnpm add @puckeditor/core@^0.23 # only where the editor runs
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
```tsx
|
|
455
|
+
import { SiteEditor } from "@marktiderman/genesis-sites/editor";
|
|
456
|
+
|
|
457
|
+
<div style={{ height: "100dvh" }}>
|
|
458
|
+
<SiteEditor siteId={siteId} store={store} brand={brand} forms={forms} onPublish={(release) => purge(release)} />
|
|
459
|
+
</div>;
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
`SiteEditor` fills its parent, so give the parent a height. Props:
|
|
463
|
+
|
|
464
|
+
| Prop | |
|
|
465
|
+
|---|---|
|
|
466
|
+
| `siteId`, `store` | Any `SiteStore`: the Supabase store signed in as the editor, or the memory store. |
|
|
467
|
+
| `brand` | The site's brand: the canvas theme, and what publishing checks contrast against. |
|
|
468
|
+
| `forms?` | Your `FormsResolver`, so form embeds draw on the canvas and in preview. |
|
|
469
|
+
| `assets?` | `{ list?, upload?, maxBytes? }`: the image library, and an upload of your own instead of the store's `putAsset`. |
|
|
470
|
+
| `onPublish?` | Called with each new release. |
|
|
471
|
+
| `onDirtyChange?` | Called with whether anything isn't saved yet. Block your app's own navigation while it's true; closing the tab is guarded already. |
|
|
472
|
+
| `siteStylesheet?` | The site stylesheet's URL (`@marktiderman/genesis-sites/sites.css`, say through Vite's `?url`). Without it the canvas loads the renderer's bundled assets, a much larger download. |
|
|
473
|
+
| `reserved?` | Paths pages can't use (default: the store's rule, `DEFAULT_RESERVED_PATHS`). |
|
|
474
|
+
| `previewUrl?` | A link to your own preview route for a page path, shown in the Publish panel. |
|
|
475
|
+
| `readOnly?` | View only: the canvas, fields and SEO can't be changed; there is no Add picker, no page actions, no Publish and no Roll back; no autosaver is made, so nothing is saved. A "View only" note says so. |
|
|
476
|
+
| `autosaveDelay?`, `initialPageId?`, `className?` | |
|
|
477
|
+
|
|
478
|
+
What it does:
|
|
479
|
+
|
|
480
|
+
- **Generated from the registry.** Each section becomes one Add-picker entry
|
|
481
|
+
per preset, grouped by category, with fields made from its JSON Schema:
|
|
482
|
+
text and textareas, a select for its layout (variants) and for enums, the
|
|
483
|
+
image picker for images, the Genesis rich text editor, objects (links),
|
|
484
|
+
lists, one-per-line string lists, and Puck slots for props marked
|
|
485
|
+
`x-genesis-kind: "slot"`. A section at its `limit` can't be added again. A
|
|
486
|
+
prop the editor can't map shows as "can't be edited here" and warns in the
|
|
487
|
+
console; it is kept as it is. Register a section and it appears; nothing in
|
|
488
|
+
the editor changes.
|
|
489
|
+
- **The canvas** is an iframe drawn by each section's own renderer, with the
|
|
490
|
+
site stylesheet and your brand's theme, and the site's header and footer
|
|
491
|
+
as editable slots above and below the page. **Preview** runs the real
|
|
492
|
+
`/web` handler on the drafts (and **View it live** on the live release)
|
|
493
|
+
in a sandboxed frame with no scripts.
|
|
494
|
+
- **Autosave** saves a moment after each change by compare-and-swap. If
|
|
495
|
+
someone else saved first, it stops, keeps your edits, and asks: load their
|
|
496
|
+
version, or keep yours. Closing the tab with unsaved changes asks first;
|
|
497
|
+
for a route change in your app, use `onDirtyChange` to ask. When the editor
|
|
498
|
+
unmounts with changes still waiting it saves them on the way out, but it
|
|
499
|
+
can't wait for that save, so a host that must not lose them asks first.
|
|
500
|
+
Undo and redo are Puck's history (the toolbar, or Ctrl+Z and Ctrl+Shift+Z).
|
|
501
|
+
- **Pages**: open, add (blank, the landing page from your brand, or a starter
|
|
502
|
+
site page), change an address (the old one redirects with a 301; reserved
|
|
503
|
+
paths are refused), delete, and edit the header menu. Reordering pages
|
|
504
|
+
needs a store with `reorderPages(siteId, pageIds)`; without it the list is
|
|
505
|
+
in the store's order.
|
|
506
|
+
- **Publish**: the publish checks run on the saved drafts and errors block
|
|
507
|
+
the button. While a publish runs the canvas is read-only and autosave
|
|
508
|
+
waits, so no edit races the store's own re-saves; afterwards the editor
|
|
509
|
+
takes the new revisions and saves anything that waited; "Show" selects the section a check is about. Publish with a
|
|
510
|
+
note, see the release history, and roll back. Per-page SEO (search title,
|
|
511
|
+
description, share image, noindex) is in the same panel.
|
|
512
|
+
- **Images** come from an upload, the library, or a link; every one needs alt
|
|
513
|
+
text unless it is marked decorative. SVG isn't accepted.
|
|
514
|
+
- **Accessible**: every field has a label; nothing needs dragging (each
|
|
515
|
+
Add-picker entry has an Add button, and the selected section's Up, Down
|
|
516
|
+
and Remove buttons sit above its fields); actions are announced; and the
|
|
517
|
+
panels are Genesis UI tabs and dialogs. Puck's canvas and outline still
|
|
518
|
+
move sections only by dragging.
|
|
519
|
+
|
|
520
|
+
Puck is an optional peer dependency (`@puckeditor/core`): an app that only
|
|
521
|
+
serves sites never installs it, and the root, `/web` and `/sections` never
|
|
522
|
+
import it. It stays inside `/editor`: import everything from here (it re-exports `usePuck`, `createUsePuck` and the
|
|
523
|
+
`PuckConfig`, `PuckData` and `PuckOverrides` types for extensions), and
|
|
524
|
+
never from `@puckeditor/core`. `/web` never imports the editor, so published
|
|
525
|
+
pages carry no Puck code. The lower-level pieces are exported too:
|
|
526
|
+
`createEditorConfig`, `sectionFields`, `toEditorData` and `fromEditorData`,
|
|
527
|
+
`Autosaver`, and `checkSite`, `publishSite`, `renamePage` and
|
|
528
|
+
`pageTemplates`.
|
|
529
|
+
|
|
530
|
+
The sample app's `/sites-editor` route is a working demo on the memory store.
|
|
303
531
|
|
|
304
532
|
## Stores
|
|
305
533
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var d=document.querySelectorAll('details[data-gs-island="menu"]');d.forEach(e=>{e.addEventListener("focusout",n=>{let t=n.relatedTarget;e.open&&t&&!e.contains(t)&&(e.open=!1)}),e.addEventListener("keydown",n=>{n.key==="Escape"&&e.open&&(e.open=!1,e.querySelector("summary")?.focus())}),e.addEventListener("click",n=>{n.target.closest("a")&&(e.open=!1)})});d.length&&document.addEventListener("click",e=>{d.forEach(n=>{n.open&&!n.contains(e.target)&&(n.open=!1)})});function u(e,n,t){let s=[...e.querySelectorAll(`[name="${CSS.escape(n)}"]`)];if(t==="multi"){let c=s.filter(r=>r.checked).map(r=>r.value);return c.length?c:void 0}if(t==="single"||t==="yes-no"){let r=s.find(a=>a.type==="radio"?a.checked:!0)?.value??"";return r?t==="yes-no"?r==="yes":r:void 0}if(t==="consent")return s[0]?.checked?!0:void 0;let l=(s[0]?.value??"").trim();if(l)return t==="number"?Number(l):l}document.querySelectorAll('form[data-gs-island="light-form"]').forEach(e=>{let n=e.querySelector("[data-gs-status]"),t=e.querySelector('button[type="submit"]'),s=c=>{n&&(n.textContent=c)},l=()=>{let c=!0;return e.querySelectorAll('[data-gs-kind="multi"][data-gs-required]').forEach(r=>{let a=[...r.querySelectorAll('input[type="checkbox"]')],o=a.some(i=>i.checked)?"":"Choose at least one.";a[0]?.setCustomValidity(o),o&&(c=!1)}),c};e.addEventListener("change",l),e.addEventListener("submit",async c=>{if(c.preventDefault(),!l()||!e.checkValidity()){e.reportValidity();return}let r={};e.querySelectorAll("[data-gs-field]").forEach(a=>{let o=a.dataset.gsField,i=u(a,o,a.dataset.gsKind??"text");i!==void 0&&(r[o]=i)}),t&&(t.disabled=!0),s("Sending\u2026");try{let a=await fetch(e.action,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({form:e.dataset.gsForm,answers:r}),credentials:"same-origin"});if(!a.ok)throw new Error(String(a.status));let o=document.createElement("p");o.setAttribute("role","status"),o.tabIndex=-1,o.className="text-lg font-medium",o.textContent=e.dataset.gsSent??"Thanks.",e.replaceWith(o),o.focus()}catch(a){console.error(`[genesis-sites] the form "${e.dataset.gsForm}" couldn't be sent.`,a),s("That didn't send. Check your connection and try again."),t&&(t.disabled=!1,t.focus())}})});var f=["https://www.openstreetmap.org/","https://www.google.com/maps"];document.querySelectorAll('[data-gs-island="map"]').forEach(e=>{let n=e.dataset.gsMapSrc??"",t=e.querySelector("[data-gs-map-load]");!t||!f.some(s=>n.startsWith(s))||(t.hidden=!1,t.addEventListener("click",()=>{let s=document.createElement("iframe");s.src=n,s.title=e.dataset.gsMapTitle||"Map",s.loading="lazy",s.referrerPolicy="strict-origin-when-cross-origin",s.className="absolute inset-0 h-full w-full border-0",e.querySelectorAll("[data-gs-map-drop]").forEach(l=>l.remove()),e.prepend(s),s.focus()}))});document.querySelector('[data-gs-island="form"]')&&import(new URL("./form-island.c0f6fac859.js",import.meta.url).href).catch(e=>{console.error("[genesis-sites] the form couldn't load.",e)});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:""}}}@layer theme{:root,:host{--font-sans:var(--font-sans);--font-mono:var(--font-mono);--color-red-300:oklch(80.8% .114 19.571);--color-red-700:oklch(50.5% .213 27.518);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-800:oklch(47.3% .137 46.201);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-700:oklch(50.8% .118 165.612);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-700:oklch(48.8% .243 264.376);--color-black:#000;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .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;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-2xl:1rem;--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--aspect-video:16 / 9;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--color-accent:hsl(var(--accent));--color-border:hsl(var(--border));--font-display:var(--font-display)}}@layer base,components;@layer utilities{.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:0}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.-top-0\.5{top:calc(var(--spacing) * -.5)}.-top-12{top:calc(var(--spacing) * -12)}.top-0{top:0}.top-1{top:var(--spacing)}.top-1\/2{top:50%}.top-1\/3{top:33.3333%}.top-2\.5{top:calc(var(--spacing) * 2.5)}.top-4{top:calc(var(--spacing) * 4)}.top-11{top:calc(var(--spacing) * 11)}.top-\[1px\]{top:1px}.top-\[50\%\]{top:50%}.top-\[60\%\]{top:60%}.top-full{top:100%}.-right-12{right:calc(var(--spacing) * -12)}.right-0{right:0}.right-1{right:var(--spacing)}.right-4{right:calc(var(--spacing) * 4)}.-bottom-0\.5{bottom:calc(var(--spacing) * -.5)}.-bottom-12{bottom:calc(var(--spacing) * -12)}.bottom-0{bottom:0}.-left-12{left:calc(var(--spacing) * -12)}.left-0{left:0}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.left-\[1\.375rem\]{left:1.375rem}.left-\[50\%\]{left:50%}.isolate{isolation:isolate}.-z-10{z-index:calc(10 * -1)}.z-10{z-index:10}.z-50{z-index:50}.z-\[1\]{z-index:1}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.m-0{margin:0}.m-2{margin:calc(var(--spacing) * 2)}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.mx-1{margin-inline:var(--spacing)}.mx-auto{margin-inline:auto}.my-0\.5{margin-block:calc(var(--spacing) * .5)}.my-1{margin-block:var(--spacing)}.-mt-1{margin-top:calc(var(--spacing) * -1)}.-mt-2{margin-top:calc(var(--spacing) * -2)}.-mt-4{margin-top:calc(var(--spacing) * -4)}.mt-0{margin-top:0}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mt-24{margin-top:calc(var(--spacing) * 24)}.mt-auto{margin-top:auto}.mr-1{margin-right:var(--spacing)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-0{margin-bottom:0}.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)}.-ml-4{margin-left:calc(var(--spacing) * -4)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.field-sizing-content{field-sizing:content}.aspect-\[4\/3\]{aspect-ratio:4/3}.aspect-\[16\/9\]{aspect-ratio:16/9}.aspect-\[16\/10\]{aspect-ratio:16/10}.aspect-auto{aspect-ratio:auto}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.size-\(--cell-size\){width:var(--cell-size);height:var(--cell-size)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-11{width:calc(var(--spacing) * 11);height:calc(var(--spacing) * 11)}.size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.size-16{width:calc(var(--spacing) * 16);height:calc(var(--spacing) * 16)}.size-24{width:calc(var(--spacing) * 24);height:calc(var(--spacing) * 24)}.size-auto{width:auto;height:auto}.size-full{width:100%;height:100%}.h-\(--cell-size\){height:var(--cell-size)}.h-0\.5{height:calc(var(--spacing) * .5)}.h-1{height:var(--spacing)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.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-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-20{height:calc(var(--spacing) * 20)}.h-24{height:calc(var(--spacing) * 24)}.h-32{height:calc(var(--spacing) * 32)}.h-72{height:calc(var(--spacing) * 72)}.h-\[1px\]{height:1px}.h-\[90vh\]{height:90vh}.h-\[var\(--radix-navigation-menu-viewport-height\)\]{height:var(--radix-navigation-menu-viewport-height)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[300px\]{max-height:300px}.min-h-0{min-height:0}.min-h-6{min-height:calc(var(--spacing) * 6)}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-12{min-height:calc(var(--spacing) * 12)}.min-h-13{min-height:calc(var(--spacing) * 13)}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-40{min-height:calc(var(--spacing) * 40)}.min-h-48{min-height:calc(var(--spacing) * 48)}.min-h-64{min-height:calc(var(--spacing) * 64)}.min-h-\[28rem\]{min-height:28rem}.min-h-\[50vh\]{min-height:50vh}.min-h-\[80px\]{min-height:80px}.min-h-dvh{min-height:100dvh}.min-h-screen{min-height:100vh}.w-\(--cell-size\){width:var(--cell-size)}.w-0{width:0}.w-1{width:var(--spacing)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-3\/4{width:75%}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-12{width:calc(var(--spacing) * 12)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-48{width:calc(var(--spacing) * 48)}.w-56{width:calc(var(--spacing) * 56)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-\[1px\]{width:1px}.w-\[95vw\]{width:95vw}.w-\[100px\]{width:100px}.w-\[240px\]{width:240px}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.w-px{width:1px}.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-6xl{max-width:var(--container-6xl)}.max-w-32{max-width:calc(var(--spacing) * 32)}.max-w-40{max-width:calc(var(--spacing) * 40)}.max-w-64{max-width:calc(var(--spacing) * 64)}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.max-w-lg{max-width:var(--container-lg)}.max-w-max{max-width:max-content}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.min-w-\(--cell-size\){min-width:var(--cell-size)}.min-w-0{min-width:0}.min-w-9{min-width:calc(var(--spacing) * 9)}.min-w-10{min-width:calc(var(--spacing) * 10)}.min-w-11{min-width:calc(var(--spacing) * 11)}.min-w-28{min-width:calc(var(--spacing) * 28)}.min-w-\[8rem\]{min-width:8rem}.min-w-\[12rem\]{min-width:12rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.grow-0{flex-grow:0}.basis-full{flex-basis:100%}.caption-bottom{caption-side:bottom}.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-\[-50\%\]{--tw-translate-x:-50%;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)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-45{rotate:45deg}.rotate-90{rotate:90deg}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize-none{resize:none}.scroll-m-20{scroll-margin:calc(var(--spacing) * 20)}.scroll-mt-20{scroll-margin-top:calc(var(--spacing) * 20)}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.columns-1{columns:1}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-\[2\.75rem_1fr\]{grid-template-columns:2.75rem 1fr}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.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-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-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-10{gap:calc(var(--spacing) * 10)}.gap-12{gap:calc(var(--spacing) * 12)}.gap-16{gap:calc(var(--spacing) * 16)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>: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)))}:where(.space-y-8>: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)))}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-x-10{column-gap:calc(var(--spacing) * 10)}.gap-x-12{column-gap:calc(var(--spacing) * 12)}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(var(--spacing) * var(--tw-space-x-reverse));margin-inline-end:calc(var(--spacing) * calc(1 - var(--tw-space-x-reverse)))}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-3{row-gap:calc(var(--spacing) * 3)}.gap-y-6{row-gap:calc(var(--spacing) * 6)}.gap-y-8{row-gap:calc(var(--spacing) * 8)}.gap-y-10{row-gap:calc(var(--spacing) * 10)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:hsl(var(--border))}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\[2px\]{border-radius:2px}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-none{border-radius:0}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.rounded-t-\[10px\]{border-top-left-radius:10px;border-top-right-radius:10px}.rounded-t-xl{border-top-left-radius:calc(var(--radius) + 4px);border-top-right-radius:calc(var(--radius) + 4px)}.rounded-l-md{border-top-left-radius:calc(var(--radius) - 2px);border-bottom-left-radius:calc(var(--radius) - 2px)}.rounded-tl-sm{border-top-left-radius:calc(var(--radius) - 4px)}.rounded-r-md{border-top-right-radius:calc(var(--radius) - 2px);border-bottom-right-radius:calc(var(--radius) - 2px)}.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-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-8{border-top-style:var(--tw-border-style);border-top-width:8px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.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-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-solid{--tw-border-style:solid;border-style:solid}.border-\(--color-border\){border-color:var(--color-border)}.border-border,.border-border\/50{border-color:hsl(var(--border))}@supports (color:color-mix(in lab, red, red)){.border-border\/50{border-color:color-mix(in oklab, hsl(var(--border)) 50%, transparent)}}.border-current,.border-current\/20{border-color:currentColor}@supports (color:color-mix(in lab, red, red)){.border-current\/20{border-color:color-mix(in oklab, currentcolor 20%, transparent)}}.border-destructive,.border-destructive\/50{border-color:hsl(var(--destructive))}@supports (color:color-mix(in lab, red, red)){.border-destructive\/50{border-color:color-mix(in oklab, hsl(var(--destructive)) 50%, transparent)}}.border-input{border-color:hsl(var(--input))}.border-primary,.border-primary\/30{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab, red, red)){.border-primary\/30{border-color:color-mix(in oklab, hsl(var(--primary)) 30%, transparent)}}.border-primary\/50{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab, red, red)){.border-primary\/50{border-color:color-mix(in oklab, hsl(var(--primary)) 50%, transparent)}}.border-transparent{border-color:#0000}.border-t-primary{border-top-color:hsl(var(--primary))}.border-t-transparent{border-top-color:#0000}.border-l-transparent{border-left-color:#0000}.bg-\(--color-bg\){background-color:var(--color-bg)}.bg-accent{background-color:hsl(var(--accent))}.bg-background{background-color:hsl(var(--background))}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\/50{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.bg-border{background-color:hsl(var(--border))}.bg-card{background-color:hsl(var(--card))}.bg-current{background-color:currentColor}.bg-destructive,.bg-destructive\/15{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab, red, red)){.bg-destructive\/15{background-color:color-mix(in oklab, hsl(var(--destructive)) 15%, transparent)}}.bg-foreground,.bg-foreground\/80{background-color:hsl(var(--foreground))}@supports (color:color-mix(in lab, red, red)){.bg-foreground\/80{background-color:color-mix(in oklab, hsl(var(--foreground)) 80%, transparent)}}.bg-info,.bg-info\/15{background-color:hsl(var(--info))}@supports (color:color-mix(in lab, red, red)){.bg-info\/15{background-color:color-mix(in oklab, hsl(var(--info)) 15%, transparent)}}.bg-muted{background-color:hsl(var(--muted))}.bg-muted-foreground\/30{background-color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab, red, red)){.bg-muted-foreground\/30{background-color:color-mix(in oklab, hsl(var(--muted-foreground)) 30%, transparent)}}.bg-muted\/30{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab, red, red)){.bg-muted\/30{background-color:color-mix(in oklab, hsl(var(--muted)) 30%, transparent)}}.bg-muted\/40{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab, red, red)){.bg-muted\/40{background-color:color-mix(in oklab, hsl(var(--muted)) 40%, transparent)}}.bg-muted\/50{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab, red, red)){.bg-muted\/50{background-color:color-mix(in oklab, hsl(var(--muted)) 50%, transparent)}}.bg-popover{background-color:hsl(var(--popover))}.bg-primary,.bg-primary\/5{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab, red, red)){.bg-primary\/5{background-color:color-mix(in oklab, hsl(var(--primary)) 5%, transparent)}}.bg-primary\/10{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab, red, red)){.bg-primary\/10{background-color:color-mix(in oklab, hsl(var(--primary)) 10%, transparent)}}.bg-primary\/15{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab, red, red)){.bg-primary\/15{background-color:color-mix(in oklab, hsl(var(--primary)) 15%, transparent)}}.bg-primary\/20{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab, red, red)){.bg-primary\/20{background-color:color-mix(in oklab, hsl(var(--primary)) 20%, transparent)}}.bg-secondary{background-color:hsl(var(--secondary))}.bg-success,.bg-success\/15{background-color:hsl(var(--success))}@supports (color:color-mix(in lab, red, red)){.bg-success\/15{background-color:color-mix(in oklab, hsl(var(--success)) 15%, transparent)}}.bg-transparent{background-color:#0000}.bg-warning,.bg-warning\/15{background-color:hsl(var(--warning))}@supports (color:color-mix(in lab, red, red)){.bg-warning\/15{background-color:color-mix(in oklab, hsl(var(--warning)) 15%, transparent)}}.fill-current{fill:currentColor}.fill-primary{fill:hsl(var(--primary))}.fill-transparent{fill:#0000}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-0{padding:0}.p-1{padding:var(--spacing)}.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-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-\(--cell-size\){padding-inline:var(--cell-size)}.px-0{padding-inline:0}.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-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.px-16{padding-inline:calc(var(--spacing) * 16)}.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-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-24{padding-block:calc(var(--spacing) * 24)}.pt-0{padding-top:0}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pt-7{padding-top:calc(var(--spacing) * 7)}.pt-8{padding-top:calc(var(--spacing) * 8)}.pr-1{padding-right:var(--spacing)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-2\.5{padding-right:calc(var(--spacing) * 2.5)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pr-10{padding-right:calc(var(--spacing) * 10)}.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-5{padding-bottom:calc(var(--spacing) * 5)}.pb-10{padding-bottom:calc(var(--spacing) * 10)}.pb-20{padding-bottom:calc(var(--spacing) * 20)}.pb-24{padding-bottom:calc(var(--spacing) * 24)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.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}.align-top{vertical-align:top}.font-display{font-family:var(--font-display)}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--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\.8rem\]{font-size:.8rem}.text-\[10px\]{font-size:10px}.leading-7{--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.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-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.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)}.text-balance{text-wrap:balance}.text-pretty{text-wrap:pretty}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.text-accent-foreground{color:hsl(var(--accent-foreground))}.text-amber-800{color:var(--color-amber-800)}.text-background{color:hsl(var(--background))}.text-blue-700{color:var(--color-blue-700)}.text-card-foreground{color:hsl(var(--card-foreground))}.text-current{color:currentColor}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-emerald-700{color:var(--color-emerald-700)}.text-foreground{color:hsl(var(--foreground))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-red-700{color:var(--color-red-700)}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.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,)}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.accent-\[hsl\(var\(--primary\)\)\]{accent-color:hsl(var(--primary))}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-100{opacity:1}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);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,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);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,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);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,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-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)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-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)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-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)}.ring-primary\/50{--tw-ring-color:hsl(var(--primary))}@supports (color:color-mix(in lab, red, red)){.ring-primary\/50{--tw-ring-color:color-mix(in oklab, hsl(var(--primary)) 50%, transparent)}}.ring-ring{--tw-ring-color:hsl(var(--ring))}.ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);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,)}.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-\[opacity\,translate\]{transition-property:opacity,translate;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-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-1000{--tw-duration:1s;transition-duration:1s}.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}.\[--cell-size\:--spacing\(8\)\]{--cell-size:calc(var(--spacing) * 8)}.group-open\:rotate-180:is(:where(.group):is([open],:popover-open,:open) *){rotate:180deg}.group-focus-within\:block:is(:where(.group):focus-within *){display:block}@media (hover:hover){.group-hover\:block:is(:where(.group):hover *){display:block}}.group-has-\[\[data-state\=checked\]\]\/choice\:text-primary-foreground:is(:where(.group\/choice):has([data-state=checked]) *){color:hsl(var(--primary-foreground))}.group-has-\[\[data-state\=checked\]\]\/choice\:opacity-100:is(:where(.group\/choice):has([data-state=checked]) *){opacity:1}.group-data-\[focused\=true\]\/day\:relative:is(:where(.group\/day)[data-focused=true] *){position:relative}.group-data-\[focused\=true\]\/day\:z-10:is(:where(.group\/day)[data-focused=true] *){z-index:10}.group-data-\[focused\=true\]\/day\:border-ring:is(:where(.group\/day)[data-focused=true] *){border-color:hsl(var(--ring))}.group-data-\[focused\=true\]\/day\:ring-\[3px\]:is(:where(.group\/day)[data-focused=true] *){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-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)}.group-data-\[focused\=true\]\/day\:ring-ring\/50:is(:where(.group\/day)[data-focused=true] *){--tw-ring-color:hsl(var(--ring))}@supports (color:color-mix(in lab, red, red)){.group-data-\[focused\=true\]\/day\:ring-ring\/50:is(:where(.group\/day)[data-focused=true] *){--tw-ring-color:color-mix(in oklab, hsl(var(--ring)) 50%, transparent)}}.group-data-\[state\=open\]\:rotate-180:is(:where(.group)[data-state=open] *){rotate:180deg}.group-\[\.toast\]\:bg-muted:is(:where(.group).toast *){background-color:hsl(var(--muted))}.group-\[\.toast\]\:bg-primary:is(:where(.group).toast *){background-color:hsl(var(--primary))}.group-\[\.toast\]\:text-muted-foreground:is(:where(.group).toast *){color:hsl(var(--muted-foreground))}.group-\[\.toast\]\:text-primary-foreground:is(:where(.group).toast *){color:hsl(var(--primary-foreground))}.group-\[\.toaster\]\:border-border:is(:where(.group).toaster *){border-color:hsl(var(--border))}.group-\[\.toaster\]\:bg-background:is(:where(.group).toaster *){background-color:hsl(var(--background))}.group-\[\.toaster\]\:text-foreground:is(:where(.group).toaster *){color:hsl(var(--foreground))}.group-\[\.toaster\]\:shadow-lg:is(:where(.group).toaster *){--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.peer-checked\:border-primary:is(:where(.peer):checked~*){border-color:hsl(var(--primary))}.peer-checked\:bg-primary:is(:where(.peer):checked~*){background-color:hsl(var(--primary))}.peer-checked\:text-primary-foreground:is(:where(.peer):checked~*){color:hsl(var(--primary-foreground))}.peer-focus-visible\:outline-2:is(:where(.peer):focus-visible~*){outline-style:var(--tw-outline-style);outline-width:2px}.peer-focus-visible\:outline-offset-2:is(:where(.peer):focus-visible~*){outline-offset:2px}.peer-focus-visible\:outline-ring:is(:where(.peer):focus-visible~*){outline-color:hsl(var(--ring))}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.peer-data-\[state\=checked\]\:text-primary-foreground:is(:where(.peer)[data-state=checked]~*){color:hsl(var(--primary-foreground))}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:hsl(var(--foreground))}.placeholder\:text-muted-foreground::placeholder,.placeholder\:text-muted-foreground\/70::placeholder{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab, red, red)){.placeholder\:text-muted-foreground\/70::placeholder{color:color-mix(in oklab, hsl(var(--muted-foreground)) 70%, transparent)}}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:inset-y-0:after{content:var(--tw-content);inset-block:0}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:w-1:after{content:var(--tw-content);width:var(--spacing)}.after\:-translate-x-1\/2:after{content:var(--tw-content);--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.first\:mt-0:first-child{margin-top:0}.first\:rounded-l-md:first-child{border-top-left-radius:calc(var(--radius) - 2px);border-bottom-left-radius:calc(var(--radius) - 2px)}.first\:border-l:first-child{border-left-style:var(--tw-border-style);border-left-width:1px}.first\:pt-0:first-child{padding-top:0}.last\:rounded-r-md:last-child{border-top-right-radius:calc(var(--radius) - 2px);border-bottom-right-radius:calc(var(--radius) - 2px)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.last\:pb-0:last-child{padding-bottom:0}.focus-within\:ring-2:focus-within{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-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)}.focus-within\:ring-ring:focus-within{--tw-ring-color:hsl(var(--ring))}.focus-within\:ring-offset-2:focus-within{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}@media (hover:hover){.hover\:border-border:hover{border-color:hsl(var(--border))}.hover\:border-primary:hover{border-color:hsl(var(--primary))}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-background\/90:hover{background-color:hsl(var(--background))}@supports (color:color-mix(in lab, red, red)){.hover\:bg-background\/90:hover{background-color:color-mix(in oklab, hsl(var(--background)) 90%, transparent)}}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab, hsl(var(--destructive)) 90%, transparent)}}.hover\:bg-muted:hover{background-color:hsl(var(--muted))}.hover\:bg-muted-foreground\/30:hover{background-color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted-foreground\/30:hover{background-color:color-mix(in oklab, hsl(var(--muted-foreground)) 30%, transparent)}}.hover\:bg-muted\/50:hover{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab, hsl(var(--muted)) 50%, transparent)}}.hover\:bg-primary\/10:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/10:hover{background-color:color-mix(in oklab, hsl(var(--primary)) 10%, transparent)}}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, hsl(var(--primary)) 90%, transparent)}}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary))}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab, hsl(var(--secondary)) 80%, transparent)}}.hover\:bg-transparent:hover{background-color:#0000}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:text-muted-foreground:hover{color:hsl(var(--muted-foreground))}.hover\:text-primary\/80:hover{color:hsl(var(--primary))}@supports (color:color-mix(in lab, red, red)){.hover\:text-primary\/80:hover{color:color-mix(in oklab, hsl(var(--primary)) 80%, transparent)}}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}}.focus\:not-sr-only:focus{clip-path:none;white-space:normal;width:auto;height:auto;margin:0;padding:0;position:static;overflow:visible}.focus\:fixed:focus{position:fixed}.focus\:top-4:focus{top:calc(var(--spacing) * 4)}.focus\:left-4:focus{left:calc(var(--spacing) * 4)}.focus\:z-\[100\]:focus{z-index:100}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-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)}.focus\:ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-2:focus{outline-style:var(--tw-outline-style);outline-width:2px}.focus\:outline-ring:focus{outline-color:hsl(var(--ring))}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:border-primary:focus-visible{border-color:hsl(var(--primary))}.focus-visible\:ring-0:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-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)}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-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)}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-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)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.focus-visible\:ring-offset-0:focus-visible{--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color:hsl(var(--background))}.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-ring:focus-visible{outline-color:hsl(var(--ring))}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.has-focus\:border-ring:has(:focus){border-color:hsl(var(--ring))}.has-focus\:ring-\[3px\]:has(:focus){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-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)}.has-focus\:ring-ring\/50:has(:focus){--tw-ring-color:hsl(var(--ring))}@supports (color:color-mix(in lab, red, red)){.has-focus\:ring-ring\/50:has(:focus){--tw-ring-color:color-mix(in oklab, hsl(var(--ring)) 50%, transparent)}}.has-\[\:disabled\]\:cursor-not-allowed:has(:disabled){cursor:not-allowed}.has-\[\:disabled\]\:opacity-50:has(:disabled){opacity:.5}@media (hover:hover){.has-\[\:disabled\]\:hover\:bg-transparent:has(:disabled):hover{background-color:#0000}}.has-\[\:focus-visible\]\:ring-2:has(:focus-visible){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-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)}.has-\[\:focus-visible\]\:ring-ring:has(:focus-visible){--tw-ring-color:hsl(var(--ring))}.has-\[\:focus-visible\]\:ring-offset-2:has(:focus-visible){--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.has-\[\[aria-invalid\=true\]\]\:border-destructive:has([aria-invalid=true]){border-color:hsl(var(--destructive))}.has-\[\[data-state\=checked\]\]\:border-primary:has([data-state=checked]){border-color:hsl(var(--primary))}.has-\[\[data-state\=checked\]\]\:bg-primary\/15:has([data-state=checked]){background-color:hsl(var(--primary))}@supports (color:color-mix(in lab, red, red)){.has-\[\[data-state\=checked\]\]\:bg-primary\/15:has([data-state=checked]){background-color:color-mix(in oklab, hsl(var(--primary)) 15%, transparent)}}.aria-disabled\:opacity-50[aria-disabled=true]{opacity:.5}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:hsl(var(--destructive))}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:hsl(var(--destructive))}@supports (color:color-mix(in lab, red, red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, hsl(var(--destructive)) 20%, transparent)}}.aria-selected\:text-muted-foreground[aria-selected=true]{color:hsl(var(--muted-foreground))}.aria-\[current\=page\]\:underline[aria-current=page]{text-decoration-line:underline}.aria-\[current\=page\]\:underline-offset-8[aria-current=page]{text-underline-offset:8px}.data-\[active\]\:bg-accent\/50[data-active]{background-color:hsl(var(--accent))}@supports (color:color-mix(in lab, red, red)){.data-\[active\]\:bg-accent\/50[data-active]{background-color:color-mix(in oklab, hsl(var(--accent)) 50%, transparent)}}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[disabled\=true\]\:pointer-events-none[data-disabled=true]{pointer-events:none}.data-\[disabled\=true\]\:opacity-50[data-disabled=true]{opacity:.5}.data-\[orientation\=horizontal\]\:my-1[data-orientation=horizontal]{margin-block:var(--spacing)}.data-\[orientation\=horizontal\]\:h-px[data-orientation=horizontal]{height:1px}.data-\[orientation\=horizontal\]\:w-full[data-orientation=horizontal]{width:100%}.data-\[orientation\=vertical\]\:mx-1[data-orientation=vertical]{margin-inline:var(--spacing)}.data-\[orientation\=vertical\]\:h-full[data-orientation=vertical]{height:100%}.data-\[orientation\=vertical\]\:min-h-4[data-orientation=vertical]{min-height:calc(var(--spacing) * 4)}.data-\[orientation\=vertical\]\:w-px[data-orientation=vertical]{width:1px}.data-\[panel-group-direction\=vertical\]\:h-px[data-panel-group-direction=vertical]{height:1px}.data-\[panel-group-direction\=vertical\]\:w-full[data-panel-group-direction=vertical]{width:100%}.data-\[panel-group-direction\=vertical\]\:flex-col[data-panel-group-direction=vertical]{flex-direction:column}.data-\[panel-group-direction\=vertical\]\:after\:left-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);left:0}.data-\[panel-group-direction\=vertical\]\:after\:h-1[data-panel-group-direction=vertical]:after{content:var(--tw-content);height:var(--spacing)}.data-\[panel-group-direction\=vertical\]\:after\:w-full[data-panel-group-direction=vertical]:after{content:var(--tw-content);width:100%}.data-\[panel-group-direction\=vertical\]\:after\:translate-x-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[panel-group-direction\=vertical\]\:after\:-translate-y-1\/2[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[range-end\=true\]\:rounded-md[data-range-end=true]{border-radius:calc(var(--radius) - 2px)}.data-\[range-end\=true\]\:rounded-r-md[data-range-end=true]{border-top-right-radius:calc(var(--radius) - 2px);border-bottom-right-radius:calc(var(--radius) - 2px)}.data-\[range-end\=true\]\:bg-primary[data-range-end=true]{background-color:hsl(var(--primary))}.data-\[range-end\=true\]\:text-primary-foreground[data-range-end=true]{color:hsl(var(--primary-foreground))}.data-\[range-middle\=true\]\:rounded-none[data-range-middle=true]{border-radius:0}.data-\[range-middle\=true\]\:bg-accent[data-range-middle=true]{background-color:hsl(var(--accent))}.data-\[range-middle\=true\]\:text-accent-foreground[data-range-middle=true]{color:hsl(var(--accent-foreground))}.data-\[range-start\=true\]\:rounded-md[data-range-start=true]{border-radius:calc(var(--radius) - 2px)}.data-\[range-start\=true\]\:rounded-l-md[data-range-start=true]{border-top-left-radius:calc(var(--radius) - 2px);border-bottom-left-radius:calc(var(--radius) - 2px)}.data-\[range-start\=true\]\:bg-primary[data-range-start=true]{background-color:hsl(var(--primary))}.data-\[range-start\=true\]\:text-primary-foreground[data-range-start=true]{color:hsl(var(--primary-foreground))}.data-\[selected-single\=true\]\:bg-primary[data-selected-single=true]{background-color:hsl(var(--primary))}.data-\[selected-single\=true\]\:text-primary-foreground[data-selected-single=true]{color:hsl(var(--primary-foreground))}.data-\[selected\=\'true\'\]\:bg-accent[data-selected=true]{background-color:hsl(var(--accent))}.data-\[selected\=true\]\:rounded-none[data-selected=true]{border-radius:0}.data-\[selected\=true\]\:text-accent-foreground[data-selected=true]{color:hsl(var(--accent-foreground))}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:hsl(var(--background))}.data-\[state\=active\]\:text-foreground[data-state=active]{color:hsl(var(--foreground))}.data-\[state\=active\]\:shadow-sm[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.data-\[state\=checked\]\:translate-x-5[data-state=checked]{--tw-translate-x:calc(var(--spacing) * 5);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:border-primary[data-state=checked]{border-color:hsl(var(--primary))}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:hsl(var(--primary))}.data-\[state\=checked\]\:bg-transparent[data-state=checked]{background-color:#0000}.data-\[state\=checked\]\:text-primary-foreground[data-state=checked]{color:hsl(var(--primary-foreground))}@media (hover:hover){.data-\[state\=checked\]\:hover\:bg-primary[data-state=checked]:hover{background-color:hsl(var(--primary))}}.data-\[state\=closed\]\:duration-300[data-state=closed]{--tw-duration:.3s;transition-duration:.3s}.data-\[state\=indeterminate\]\:border-primary[data-state=indeterminate]{border-color:hsl(var(--primary))}.data-\[state\=indeterminate\]\:bg-primary[data-state=indeterminate]{background-color:hsl(var(--primary))}.data-\[state\=indeterminate\]\:text-primary-foreground[data-state=indeterminate]{color:hsl(var(--primary-foreground))}.data-\[state\=on\]\:bg-accent[data-state=on]{background-color:hsl(var(--accent))}.data-\[state\=on\]\:text-accent-foreground[data-state=on]{color:hsl(var(--accent-foreground))}.data-\[state\=open\]\:bg-accent[data-state=open],.data-\[state\=open\]\:bg-accent\/50[data-state=open]{background-color:hsl(var(--accent))}@supports (color:color-mix(in lab, red, red)){.data-\[state\=open\]\:bg-accent\/50[data-state=open]{background-color:color-mix(in oklab, hsl(var(--accent)) 50%, transparent)}}.data-\[state\=open\]\:bg-secondary[data-state=open]{background-color:hsl(var(--secondary))}.data-\[state\=open\]\:text-accent-foreground[data-state=open]{color:hsl(var(--accent-foreground))}.data-\[state\=open\]\:duration-500[data-state=open]{--tw-duration:.5s;transition-duration:.5s}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:hsl(var(--muted))}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:hsl(var(--input))}@media (prefers-reduced-motion:reduce){.motion-reduce\:animate-none{animation:none}.motion-reduce\:transition-none{transition-property:none}}@media not all and (min-width:48rem){.max-md\:hidden{display:none}}@media (min-width:40rem){.sm\:top-4\.5{top:calc(var(--spacing) * 4.5)}.sm\:left-4{left:calc(var(--spacing) * 4)}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:col-span-3{grid-column:span 3/span 3}.sm\:mt-0{margin-top:0}.sm\:size-28{width:calc(var(--spacing) * 28);height:calc(var(--spacing) * 28)}.sm\:h-16{height:calc(var(--spacing) * 16)}.sm\:h-20{height:calc(var(--spacing) * 20)}.sm\:h-44{height:calc(var(--spacing) * 44)}.sm\:w-auto{width:auto}.sm\:max-w-6xl{max-width:var(--container-6xl)}.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:max-w-md{max-width:var(--container-md)}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:min-w-48{min-width:calc(var(--spacing) * 48)}.sm\:columns-2{columns:2}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.sm\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.sm\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.sm\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.sm\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.sm\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.sm\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.sm\:grid-cols-\[7rem_1fr_auto\]{grid-template-columns:7rem 1fr auto}.sm\:flex-row{flex-direction:row}.sm\:flex-wrap{flex-wrap:wrap}.sm\:items-center{align-items:center}.sm\:items-end{align-items:flex-end}.sm\:justify-between{justify-content:space-between}.sm\:justify-center{justify-content:center}.sm\:justify-end{justify-content:flex-end}.sm\:gap-2\.5{gap:calc(var(--spacing) * 2.5)}.sm\:gap-3{gap:calc(var(--spacing) * 3)}:where(.sm\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:p-8{padding:calc(var(--spacing) * 8)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:px-8{padding-inline:calc(var(--spacing) * 8)}.sm\:px-12{padding-inline:calc(var(--spacing) * 12)}.sm\:py-8{padding-block:calc(var(--spacing) * 8)}.sm\:py-12{padding-block:calc(var(--spacing) * 12)}.sm\:pt-8{padding-top:calc(var(--spacing) * 8)}.sm\:pb-28{padding-bottom:calc(var(--spacing) * 28)}.sm\:text-left{text-align:left}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.sm\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.sm\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.sm\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.sm\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.sm\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}@media (min-width:48rem){.md\:absolute{position:absolute}.md\:order-2{order:2}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:inline-flex{display:inline-flex}.md\:w-\[var\(--radix-navigation-menu-viewport-width\)\]{width:var(--radix-navigation-menu-viewport-width)}.md\:w-auto{width:auto}.md\:w-full{width:100%}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-\[2fr_repeat\(3\,1fr\)\]{grid-template-columns:2fr repeat(3,1fr)}.md\:grid-cols-\[minmax\(0\,16rem\)_1fr\]{grid-template-columns:minmax(0,16rem) 1fr}.md\:flex-col{flex-direction:column}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:items-start{align-items:flex-start}.md\:justify-between{justify-content:space-between}.md\:justify-center{justify-content:center}.md\:justify-end{justify-content:flex-end}.md\:gap-10{gap:calc(var(--spacing) * 10)}.md\:gap-12{gap:calc(var(--spacing) * 12)}.md\:gap-16{gap:calc(var(--spacing) * 16)}.md\:py-4{padding-block:calc(var(--spacing) * 4)}.md\:text-left{text-align:left}.md\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.md\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media (min-width:64rem){.lg\:columns-3{columns:3}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-\[17rem_minmax\(0\,1fr\)_20rem\]{grid-template-columns:17rem minmax(0,1fr) 20rem}.lg\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.lg\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.lg\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.lg\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.lg\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}}.dark\:border-destructive:is(.dark *){border-color:hsl(var(--destructive))}.dark\:bg-destructive\/20:is(.dark *){background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab, red, red)){.dark\:bg-destructive\/20:is(.dark *){background-color:color-mix(in oklab, hsl(var(--destructive)) 20%, transparent)}}.dark\:bg-info\/20:is(.dark *){background-color:hsl(var(--info))}@supports (color:color-mix(in lab, red, red)){.dark\:bg-info\/20:is(.dark *){background-color:color-mix(in oklab, hsl(var(--info)) 20%, transparent)}}.dark\:bg-success\/20:is(.dark *){background-color:hsl(var(--success))}@supports (color:color-mix(in lab, red, red)){.dark\:bg-success\/20:is(.dark *){background-color:color-mix(in oklab, hsl(var(--success)) 20%, transparent)}}.dark\:bg-warning\/20:is(.dark *){background-color:hsl(var(--warning))}@supports (color:color-mix(in lab, red, red)){.dark\:bg-warning\/20:is(.dark *){background-color:color-mix(in oklab, hsl(var(--warning)) 20%, transparent)}}.dark\:text-amber-200:is(.dark *){color:var(--color-amber-200)}.dark\:text-blue-300:is(.dark *){color:var(--color-blue-300)}.dark\:text-emerald-300:is(.dark *){color:var(--color-emerald-300)}.dark\:text-red-300:is(.dark *){color:var(--color-red-300)}@media (hover:hover){.dark\:hover\:text-accent-foreground:is(.dark *):hover{color:hsl(var(--accent-foreground))}}@starting-style{.starting\:-translate-y-6{--tw-translate-y:calc(var(--spacing) * -6);translate:var(--tw-translate-x) var(--tw-translate-y)}.starting\:translate-y-6{--tw-translate-y:calc(var(--spacing) * 6);translate:var(--tw-translate-x) var(--tw-translate-y)}.starting\:opacity-0{opacity:0}}@media (pointer:fine){.pointer-fine\:inline{display:inline}}@media (prefers-reduced-motion:reduce){.motion-reduce\:\[\&_\.animate-spin\]\:animate-none .animate-spin{animation:none}}.\[\&_\.recharts-cartesian-axis-tick_text\]\:fill-muted-foreground .recharts-cartesian-axis-tick text{fill:hsl(var(--muted-foreground))}.\[\&_\.recharts-cartesian-grid_line\[stroke\=\'\#ccc\'\]\]\:stroke-border\/50 .recharts-cartesian-grid line[stroke=\#ccc]{stroke:hsl(var(--border))}@supports (color:color-mix(in lab, red, red)){.\[\&_\.recharts-cartesian-grid_line\[stroke\=\'\#ccc\'\]\]\:stroke-border\/50 .recharts-cartesian-grid line[stroke=\#ccc]{stroke:color-mix(in oklab, hsl(var(--border)) 50%, transparent)}}.\[\&_\.recharts-curve\.recharts-tooltip-cursor\]\:stroke-border .recharts-curve.recharts-tooltip-cursor{stroke:hsl(var(--border))}.\[\&_\.recharts-dot\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-dot[stroke=\#fff]{stroke:#0000}.\[\&_\.recharts-layer\]\:outline-hidden .recharts-layer{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.\[\&_\.recharts-layer\]\:outline-hidden .recharts-layer{outline-offset:2px;outline:2px solid #0000}}.\[\&_\.recharts-polar-grid_\[stroke\=\'\#ccc\'\]\]\:stroke-border .recharts-polar-grid [stroke=\#ccc]{stroke:hsl(var(--border))}.\[\&_\.recharts-radial-bar-background-sector\]\:fill-muted .recharts-radial-bar-background-sector,.\[\&_\.recharts-rectangle\.recharts-tooltip-cursor\]\:fill-muted .recharts-rectangle.recharts-tooltip-cursor{fill:hsl(var(--muted))}.\[\&_\.recharts-reference-line_\[stroke\=\'\#ccc\'\]\]\:stroke-border .recharts-reference-line [stroke=\#ccc]{stroke:hsl(var(--border))}.\[\&_\.recharts-sector\]\:outline-hidden .recharts-sector{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.\[\&_\.recharts-sector\]\:outline-hidden .recharts-sector{outline-offset:2px;outline:2px solid #0000}}.\[\&_\.recharts-sector\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-sector[stroke=\#fff]{stroke:#0000}.\[\&_\.recharts-surface\]\:outline-hidden .recharts-surface{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.\[\&_\.recharts-surface\]\:outline-hidden .recharts-surface{outline-offset:2px;outline:2px solid #0000}}.\[\&_\[cmdk-group-heading\]\]\:px-2 [cmdk-group-heading]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-group-heading\]\]\:py-1\.5 [cmdk-group-heading]{padding-block:calc(var(--spacing) * 1.5)}.\[\&_\[cmdk-group-heading\]\]\:text-xs [cmdk-group-heading]{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\[\&_\[cmdk-group-heading\]\]\:font-medium [cmdk-group-heading]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.\[\&_\[cmdk-group-heading\]\]\:text-muted-foreground [cmdk-group-heading]{color:hsl(var(--muted-foreground))}.\[\&_\[cmdk-group\]\]\:px-2 [cmdk-group]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-group\]\:not\(\[hidden\]\)_\~\[cmdk-group\]\]\:pt-0 [cmdk-group]:not([hidden])~[cmdk-group]{padding-top:0}.\[\&_\[cmdk-input-wrapper\]_svg\]\:h-5 [cmdk-input-wrapper] svg{height:calc(var(--spacing) * 5)}.\[\&_\[cmdk-input-wrapper\]_svg\]\:w-5 [cmdk-input-wrapper] svg{width:calc(var(--spacing) * 5)}.\[\&_\[cmdk-input\]\]\:h-12 [cmdk-input]{height:calc(var(--spacing) * 12)}.\[\&_\[cmdk-item\]\]\:px-2 [cmdk-item]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-item\]\]\:py-3 [cmdk-item]{padding-block:calc(var(--spacing) * 3)}.\[\&_\[cmdk-item\]_svg\]\:h-5 [cmdk-item] svg{height:calc(var(--spacing) * 5)}.\[\&_\[cmdk-item\]_svg\]\:w-5 [cmdk-item] svg{width:calc(var(--spacing) * 5)}.\[\&_h2\]\:font-display h2{font-family:var(--font-display)}.\[\&_h2\]\:text-2xl h2{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.\[\&_h3\]\:font-display h3{font-family:var(--font-display)}.\[\&_h3\]\:text-xl h3{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.\[\&_p\]\:leading-relaxed p{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:hidden svg{display:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\]\:size-5 svg{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.\[\&_svg\]\:size-6 svg{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.\[\&_svg\]\:h-4 svg{height:calc(var(--spacing) * 4)}.\[\&_svg\]\:w-4 svg{width:calc(var(--spacing) * 4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}.\[\&\:first-child\[data-selected\=true\]_button\]\:rounded-l-md:first-child[data-selected=true] button{border-top-left-radius:calc(var(--radius) - 2px);border-bottom-left-radius:calc(var(--radius) - 2px)}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}:is(.rtl\:\*\*\:\[\.rdp-button\\_next\>svg\]\:rotate-180:where(:dir(rtl),[dir=rtl],[dir=rtl] *) *):is(.rdp-button_next>svg),:is(.rtl\:\*\*\:\[\.rdp-button\\_previous\>svg\]\:rotate-180:where(:dir(rtl),[dir=rtl],[dir=rtl] *) *):is(.rdp-button_previous>svg){rotate:180deg}.\[\&\:last-child\[data-selected\=true\]_button\]\:rounded-r-md:last-child[data-selected=true] button{border-top-right-radius:calc(var(--radius) - 2px);border-bottom-right-radius:calc(var(--radius) - 2px)}.\[\&\:not\(\:first-child\)\]\:mt-6:not(:first-child){margin-top:calc(var(--spacing) * 6)}.\[\&\:nth-child\(2\)\[data-selected\=true\]_button\]\:rounded-l-md:nth-child(2)[data-selected=true] button{border-top-left-radius:calc(var(--radius) - 2px);border-bottom-left-radius:calc(var(--radius) - 2px)}.\[\&\>\*\:first-child\]\:rounded-r-none>:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.\[\&\>\*\:first-child\]\:rounded-b-none>:first-child{border-bottom-right-radius:0;border-bottom-left-radius:0}.\[\&\>\*\:last-child\]\:rounded-t-none>:last-child{border-top-left-radius:0;border-top-right-radius:0}.\[\&\>\*\:last-child\]\:rounded-l-none>:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.\[\&\>\*\:not\(\:first-child\)\]\:-mt-px>:not(:first-child){margin-top:-1px}.\[\&\>\*\:not\(\:first-child\)\]\:-ml-px>:not(:first-child){margin-left:-1px}.\[\&\>\*\:not\(\:first-child\)\:not\(\:last-child\)\]\:rounded-none>:not(:first-child):not(:last-child){border-radius:0}@media (prefers-reduced-motion:reduce){.motion-reduce\:\[\&\>div\]\:transition-none>div{transition-property:none}}.\[\&\>li\]\:mb-4>li{margin-bottom:calc(var(--spacing) * 4)}.\[\&\>li\]\:break-inside-avoid>li{break-inside:avoid}.\[\&\>span\]\:line-clamp-1>span{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\[\&\>span\]\:text-xs>span{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\[\&\>span\]\:opacity-70>span{opacity:.7}.\[\&\>svg\]\:absolute>svg{position:absolute}.\[\&\>svg\]\:top-4>svg{top:calc(var(--spacing) * 4)}.\[\&\>svg\]\:left-4>svg{left:calc(var(--spacing) * 4)}.\[\&\>svg\]\:size-3\.5>svg{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\[\&\>svg\]\:h-2\.5>svg{height:calc(var(--spacing) * 2.5)}.\[\&\>svg\]\:h-3>svg{height:calc(var(--spacing) * 3)}.\[\&\>svg\]\:h-3\.5>svg{height:calc(var(--spacing) * 3.5)}.\[\&\>svg\]\:w-2\.5>svg{width:calc(var(--spacing) * 2.5)}.\[\&\>svg\]\:w-3>svg{width:calc(var(--spacing) * 3)}.\[\&\>svg\]\:w-3\.5>svg{width:calc(var(--spacing) * 3.5)}.\[\&\>svg\]\:text-destructive>svg{color:hsl(var(--destructive))}.\[\&\>svg\]\:text-foreground>svg{color:hsl(var(--foreground))}.\[\&\>svg\]\:text-muted-foreground>svg{color:hsl(var(--muted-foreground))}.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div{--tw-translate-y:-3px;translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>svg\~\*\]\:pl-7>svg~*{padding-left:calc(var(--spacing) * 7)}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.\[\&\[data-panel-group-direction\=vertical\]\>div\]\:rotate-90[data-panel-group-direction=vertical]>div{rotate:90deg}.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg{rotate:180deg}[data-slot=card-content] .\[\[data-slot\=card-content\]_\&\]\:bg-transparent,[data-slot=popover-content] .\[\[data-slot\=popover-content\]_\&\]\:bg-transparent{background-color:#0000}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@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:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}
|
|
3
|
+
/*
|
|
4
|
+
* Tailwind v4 source entry for @marktiderman/genesis-forms-web.
|
|
5
|
+
*
|
|
6
|
+
* @import "tailwindcss";
|
|
7
|
+
* @import "@marktiderman/genesis-ui/styles.css";
|
|
8
|
+
* @import "@marktiderman/genesis-forms-web/styles.css";
|
|
9
|
+
*/
|
|
10
|
+
@source "./";
|