*, ::before, ::after {
  --tw-border-spacing-x: 0;
  --tw-border-spacing-y: 0;
  --tw-translate-x: 0;
  --tw-translate-y: 0;
  --tw-rotate: 0;
  --tw-skew-x: 0;
  --tw-skew-y: 0;
  --tw-scale-x: 1;
  --tw-scale-y: 1;
  --tw-pan-x:  ;
  --tw-pan-y:  ;
  --tw-pinch-zoom:  ;
  --tw-scroll-snap-strictness: proximity;
  --tw-gradient-from-position:  ;
  --tw-gradient-via-position:  ;
  --tw-gradient-to-position:  ;
  --tw-ordinal:  ;
  --tw-slashed-zero:  ;
  --tw-numeric-figure:  ;
  --tw-numeric-spacing:  ;
  --tw-numeric-fraction:  ;
  --tw-ring-inset:  ;
  --tw-ring-offset-width: 0px;
  --tw-ring-offset-color: #fff;
  --tw-ring-color: rgb(59 130 246 / 0.5);
  --tw-ring-offset-shadow: 0 0 #0000;
  --tw-ring-shadow: 0 0 #0000;
  --tw-shadow: 0 0 #0000;
  --tw-shadow-colored: 0 0 #0000;
  --tw-blur:  ;
  --tw-brightness:  ;
  --tw-contrast:  ;
  --tw-grayscale:  ;
  --tw-hue-rotate:  ;
  --tw-invert:  ;
  --tw-saturate:  ;
  --tw-sepia:  ;
  --tw-drop-shadow:  ;
  --tw-backdrop-blur:  ;
  --tw-backdrop-brightness:  ;
  --tw-backdrop-contrast:  ;
  --tw-backdrop-grayscale:  ;
  --tw-backdrop-hue-rotate:  ;
  --tw-backdrop-invert:  ;
  --tw-backdrop-opacity:  ;
  --tw-backdrop-saturate:  ;
  --tw-backdrop-sepia:  ;
  --tw-contain-size:  ;
  --tw-contain-layout:  ;
  --tw-contain-paint:  ;
  --tw-contain-style:  ;
}

::backdrop {
  --tw-border-spacing-x: 0;
  --tw-border-spacing-y: 0;
  --tw-translate-x: 0;
  --tw-translate-y: 0;
  --tw-rotate: 0;
  --tw-skew-x: 0;
  --tw-skew-y: 0;
  --tw-scale-x: 1;
  --tw-scale-y: 1;
  --tw-pan-x:  ;
  --tw-pan-y:  ;
  --tw-pinch-zoom:  ;
  --tw-scroll-snap-strictness: proximity;
  --tw-gradient-from-position:  ;
  --tw-gradient-via-position:  ;
  --tw-gradient-to-position:  ;
  --tw-ordinal:  ;
  --tw-slashed-zero:  ;
  --tw-numeric-figure:  ;
  --tw-numeric-spacing:  ;
  --tw-numeric-fraction:  ;
  --tw-ring-inset:  ;
  --tw-ring-offset-width: 0px;
  --tw-ring-offset-color: #fff;
  --tw-ring-color: rgb(59 130 246 / 0.5);
  --tw-ring-offset-shadow: 0 0 #0000;
  --tw-ring-shadow: 0 0 #0000;
  --tw-shadow: 0 0 #0000;
  --tw-shadow-colored: 0 0 #0000;
  --tw-blur:  ;
  --tw-brightness:  ;
  --tw-contrast:  ;
  --tw-grayscale:  ;
  --tw-hue-rotate:  ;
  --tw-invert:  ;
  --tw-saturate:  ;
  --tw-sepia:  ;
  --tw-drop-shadow:  ;
  --tw-backdrop-blur:  ;
  --tw-backdrop-brightness:  ;
  --tw-backdrop-contrast:  ;
  --tw-backdrop-grayscale:  ;
  --tw-backdrop-hue-rotate:  ;
  --tw-backdrop-invert:  ;
  --tw-backdrop-opacity:  ;
  --tw-backdrop-saturate:  ;
  --tw-backdrop-sepia:  ;
  --tw-contain-size:  ;
  --tw-contain-layout:  ;
  --tw-contain-paint:  ;
  --tw-contain-style:  ;
}/*
! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com
*//*
1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
*/

*,
::before,
::after {
  box-sizing: border-box; /* 1 */
  border-width: 0; /* 2 */
  border-style: solid; /* 2 */
  border-color: #e5e7eb; /* 2 */
}

::before,
::after {
  --tw-content: '';
}

/*
1. Use a consistent sensible line-height in all browsers.
2. Prevent adjustments of font size after orientation changes in iOS.
3. Use a more readable tab size.
4. Use the user's configured `sans` font-family by default.
5. Use the user's configured `sans` font-feature-settings by default.
6. Use the user's configured `sans` font-variation-settings by default.
7. Disable tap highlights on iOS
*/

html,
:host {
  line-height: 1.5; /* 1 */
  -webkit-text-size-adjust: 100%; /* 2 */
  -moz-tab-size: 4; /* 3 */
  -o-tab-size: 4;
     tab-size: 4; /* 3 */
  font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* 4 */
  font-feature-settings: normal; /* 5 */
  font-variation-settings: normal; /* 6 */
  -webkit-tap-highlight-color: transparent; /* 7 */
}

/*
1. Remove the margin in all browsers.
2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
*/

body {
  margin: 0; /* 1 */
  line-height: inherit; /* 2 */
}

/*
1. Add the correct height in Firefox.
2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
3. Ensure horizontal rules are visible by default.
*/

hr {
  height: 0; /* 1 */
  color: inherit; /* 2 */
  border-top-width: 1px; /* 3 */
}

/*
Add the correct text decoration in Chrome, Edge, and Safari.
*/

abbr:where([title]) {
  -webkit-text-decoration: underline dotted;
          text-decoration: underline dotted;
}

/*
Remove the default font size and weight for headings.
*/

h1,
h2,
h3,
h4,
h5,
h6 {
  font-size: inherit;
  font-weight: inherit;
}

/*
Reset links to optimize for opt-in styling instead of opt-out.
*/

a {
  color: inherit;
  text-decoration: inherit;
}

/*
Add the correct font weight in Edge and Safari.
*/

b,
strong {
  font-weight: bolder;
}

/*
1. Use the user's configured `mono` font-family by default.
2. Use the user's configured `mono` font-feature-settings by default.
3. Use the user's configured `mono` font-variation-settings by default.
4. Correct the odd `em` font sizing in all browsers.
*/

code,
kbd,
samp,
pre {
  font-family: var(--font-mono), monospace; /* 1 */
  font-feature-settings: normal; /* 2 */
  font-variation-settings: normal; /* 3 */
  font-size: 1em; /* 4 */
}

/*
Add the correct font size in all browsers.
*/

small {
  font-size: 80%;
}

/*
Prevent `sub` and `sup` elements from affecting the line height in all browsers.
*/

sub,
sup {
  font-size: 75%;
  line-height: 0;
  position: relative;
  vertical-align: baseline;
}

sub {
  bottom: -0.25em;
}

sup {
  top: -0.5em;
}

/*
1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
3. Remove gaps between table borders by default.
*/

table {
  text-indent: 0; /* 1 */
  border-color: inherit; /* 2 */
  border-collapse: collapse; /* 3 */
}

/*
1. Change the font styles in all browsers.
2. Remove the margin in Firefox and Safari.
3. Remove default padding in all browsers.
*/

button,
input,
optgroup,
select,
textarea {
  font-family: inherit; /* 1 */
  font-feature-settings: inherit; /* 1 */
  font-variation-settings: inherit; /* 1 */
  font-size: 100%; /* 1 */
  font-weight: inherit; /* 1 */
  line-height: inherit; /* 1 */
  letter-spacing: inherit; /* 1 */
  color: inherit; /* 1 */
  margin: 0; /* 2 */
  padding: 0; /* 3 */
}

/*
Remove the inheritance of text transform in Edge and Firefox.
*/

button,
select {
  text-transform: none;
}

/*
1. Correct the inability to style clickable types in iOS and Safari.
2. Remove default button styles.
*/

button,
input:where([type='button']),
input:where([type='reset']),
input:where([type='submit']) {
  -webkit-appearance: button; /* 1 */
  background-color: transparent; /* 2 */
  background-image: none; /* 2 */
}

/*
Use the modern Firefox focus style for all focusable elements.
*/

:-moz-focusring {
  outline: auto;
}

/*
Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
*/

:-moz-ui-invalid {
  box-shadow: none;
}

/*
Add the correct vertical alignment in Chrome and Firefox.
*/

progress {
  vertical-align: baseline;
}

/*
Correct the cursor style of increment and decrement buttons in Safari.
*/

::-webkit-inner-spin-button,
::-webkit-outer-spin-button {
  height: auto;
}

/*
1. Correct the odd appearance in Chrome and Safari.
2. Correct the outline style in Safari.
*/

[type='search'] {
  -webkit-appearance: textfield; /* 1 */
  outline-offset: -2px; /* 2 */
}

/*
Remove the inner padding in Chrome and Safari on macOS.
*/

::-webkit-search-decoration {
  -webkit-appearance: none;
}

/*
1. Correct the inability to style clickable types in iOS and Safari.
2. Change font properties to `inherit` in Safari.
*/

::-webkit-file-upload-button {
  -webkit-appearance: button; /* 1 */
  font: inherit; /* 2 */
}

/*
Add the correct display in Chrome and Safari.
*/

summary {
  display: list-item;
}

/*
Removes the default spacing and border for appropriate elements.
*/

blockquote,
dl,
dd,
h1,
h2,
h3,
h4,
h5,
h6,
hr,
figure,
p,
pre {
  margin: 0;
}

fieldset {
  margin: 0;
  padding: 0;
}

legend {
  padding: 0;
}

ol,
ul,
menu {
  list-style: none;
  margin: 0;
  padding: 0;
}

/*
Reset default styling for dialogs.
*/
dialog {
  padding: 0;
}

/*
Prevent resizing textareas horizontally by default.
*/

textarea {
  resize: vertical;
}

/*
1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
2. Set the default placeholder color to the user's configured gray 400 color.
*/

input::-moz-placeholder, textarea::-moz-placeholder {
  opacity: 1; /* 1 */
  color: #9ca3af; /* 2 */
}

input::placeholder,
textarea::placeholder {
  opacity: 1; /* 1 */
  color: #9ca3af; /* 2 */
}

/*
Set the default cursor for buttons.
*/

button,
[role="button"] {
  cursor: pointer;
}

/*
Make sure disabled buttons don't get the pointer cursor.
*/
:disabled {
  cursor: default;
}

/*
1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
   This can trigger a poorly considered lint error in some tools but is included by design.
*/

img,
svg,
video,
canvas,
audio,
iframe,
embed,
object {
  display: block; /* 1 */
  vertical-align: middle; /* 2 */
}

/*
Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
*/

img,
video {
  max-width: 100%;
  height: auto;
}

/* Make elements with the HTML hidden attribute stay hidden by default */
[hidden]:where(:not([hidden="until-found"])) {
  display: none;
}
  :root {
    --font-display: "Bricolage Grotesque";
    --font-body: "Figtree";
    --font-mono: "Geist Mono";
    --font-handwritten: "Caveat";
    --font-script: "Sacramento";
    --radius: 0.9rem;

    /* Sunny Garden — warm leafy canvas, saturated garden hues, alive not sterile */
    --background: 0.97 0.018 110;
    --foreground: 0.22 0.03 145;
    --card: 0.99 0.012 110;
    --card-foreground: 0.22 0.03 145;
    --popover: 0.99 0.012 110;
    --popover-foreground: 0.22 0.03 145;

    --primary: 0.55 0.16 145;
    --primary-foreground: 0.99 0.01 145;

    --secondary: 0.93 0.03 130;
    --secondary-foreground: 0.3 0.05 145;
    --muted: 0.93 0.025 120;
    --muted-foreground: 0.48 0.03 145;

    --accent: 0.78 0.17 70;
    --accent-foreground: 0.22 0.05 70;

    --destructive: 0.58 0.22 25;
    --destructive-foreground: 0.99 0.01 25;

    --success: 0.62 0.17 145;
    --success-foreground: 0.99 0.01 145;
    --warning: 0.8 0.16 85;
    --warning-foreground: 0.24 0.05 85;

    --border: 0.88 0.025 130;
    --input: 0.88 0.025 130;
    --ring: 0.55 0.16 145;

    --chart-1: 0.62 0.17 145;
    --chart-2: 0.6 0.18 230;
    --chart-3: 0.55 0.13 55;
    --chart-4: 0.82 0.18 85;
    --chart-5: 0.58 0.22 25;

    /* Garden event colours — four core job types, richer + more saturated */
    --event-plant: 0.6 0.2 145;
    --event-plant-foreground: 0.99 0.01 145;
    --event-water: 0.58 0.18 230;
    --event-water-foreground: 0.99 0.01 230;
    --event-food: 0.48 0.12 55;
    --event-food-foreground: 0.99 0.01 55;
    --event-harvest: 0.82 0.19 85;
    --event-harvest-foreground: 0.24 0.05 85;

    /* Growth Photo — lens magenta/rose, distinct from the four garden hues.
       Reads as photographic (camera-lens accent) and never collides with
       GREEN/BLUE/BROWN/YELLOW. */
    --event-camera: 0.6 0.19 350;
    --event-camera-foreground: 0.99 0.01 350;

    /* Soft tints for label backgrounds and calendar dots — brighter, more colourful */
    --event-plant-soft: 0.92 0.07 145;
    --event-water-soft: 0.92 0.06 230;
    --event-food-soft: 0.91 0.045 55;
    --event-harvest-soft: 0.94 0.09 85;
    --event-camera-soft: 0.92 0.07 350;

    --sidebar: 0.96 0.02 120;
    --sidebar-foreground: 0.22 0.03 145;
    --sidebar-primary: 0.55 0.16 145;
    --sidebar-primary-foreground: 0.99 0.01 145;
    --sidebar-accent: 0.92 0.04 130;
    --sidebar-accent-foreground: 0.3 0.05 145;
    --sidebar-border: 0.88 0.025 130;
    --sidebar-ring: 0.55 0.16 145;

    --gradient-subtle: linear-gradient(
      180deg,
      oklch(0.97 0.018 110) 0%,
      oklch(0.94 0.03 120) 100%
    );
    --gradient-primary: linear-gradient(
      135deg,
      oklch(0.6 0.2 145) 0%,
      oklch(0.55 0.18 165) 100%
    );
    --gradient-sunny: linear-gradient(
      135deg,
      oklch(0.82 0.19 85) 0%,
      oklch(0.78 0.17 70) 100%
    );
    --transition-smooth: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
    --transition-spring: all 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);

    /* ── Identify Plant — raised pill button + identifier flow ───────────────
       Reuses garden greens (--primary, --event-plant) and the lens-magenta
       --event-camera accent already in the system. New tokens only cover the
       raised 3D pill depth/highlight/glow, the identifier result surface, and
       the API-key settings surface. */
    --pill-raise: 0 10px 24px -6px oklch(0.35 0.12 145 / 0.42), 0 4px 10px -2px
      oklch(0.35 0.12 145 / 0.22);
    --pill-highlight: inset 0 1px 0 0 oklch(1 0 0 / 0.55), inset 0 -1px 0 0
      oklch(0.35 0.12 145 / 0.18);
    --pill-glow: 0 0 0 1px oklch(var(--event-plant) / 0.18), 0 6px 22px -4px
      oklch(var(--event-plant) / 0.32);
    --pill-glow-soft: 0 0 18px -2px oklch(var(--event-plant) / 0.22);
    --pill-press: inset 0 2px 6px -1px oklch(0.25 0.1 145 / 0.4), 0 2px 6px -2px
      oklch(0.35 0.12 145 / 0.18);

    /* Identifier result surface — frosted garden-green tinted glass, distinct
       from the lens-magenta camera-confirm by using leafy greens. */
    --identify-result-bg: oklch(0.97 0.025 130 / 0.6);
    --identify-result-border: oklch(0.99 0.012 110 / 0.7);
    --identify-result-shadow: 0 12px 36px -8px oklch(0.3 0.1 145 / 0.3), 0 4px
      14px -2px oklch(0.3 0.1 145 / 0.16), inset 0 1px 0 0 oklch(1 0 0 / 0.5);

    /* Settings surface — API-key field. Reuses card/border tokens; this is a
       subtle tint to distinguish the settings panel from regular cards. */
    --settings-surface: 0.96 0.022 130;
    --settings-surface-foreground: 0.3 0.04 145;

    /* ── Happy Snaps — honey-amber memory-book tokens ───────────────────────
       A warm, golden honey accent DISTINCT from Growth Diary's lens-magenta
       --event-camera (hue 350). Honey sits at hue 78 — warmer and more golden
       than the existing sunny --accent (hue 70) so the memory-book reads as
       its own language, not a reuse of the sunny gradient. The memory-book
       surface is a cream paper page (warmer/yellower than --card) with a
       soft warm page-edge shadow and translucent washi-tape corners. */
    --honey: 0.76 0.16 78;
    --honey-foreground: 0.2 0.05 78;
    --honey-soft: 0.93 0.07 78;
    --honey-ring: 0.76 0.16 78;

    /* Memory-book page — warm cream paper, distinct from the cooler --card.
       Slightly yellower + lower lightness so it reads as aged book paper. */
    --memory-page: 0.97 0.025 85;
    --memory-page-foreground: 0.25 0.035 80;
    --memory-page-border: 0.86 0.035 80;

    /* Washi tape — translucent honey-tinted strip for taped/tucked corners. */
    --memory-tape: 0.84 0.08 78;

    /* Warm soft page drop-shadow — the shadow a photo casts on a book page.
       Honey-warm, never the green-tinted photo shadow of the task deck. */
    --memory-shadow: 0 6px 18px -4px oklch(0.4 0.06 78 / 0.28), 0 2px 8px -2px
      oklch(0.4 0.06 78 / 0.16);
    --memory-shadow-lift: 0 12px 32px -6px oklch(0.38 0.07 78 / 0.34), 0 4px
      14px -3px oklch(0.38 0.07 78 / 0.2);

    /* Open-spread centre crease — a soft inner shadow where two pages meet. */
    --memory-crease: inset 6px 0 14px -4px oklch(0.3 0.04 80 / 0.22), inset -6px
      0 14px -4px oklch(0.3 0.04 80 / 0.22);

    /* ── Garden Style — rustic wooden garden sign / plank ─────────────────
       A handcrafted wooden plank that lives INSIDE the garden scene, not a
       digital card sitting on top of it. Warm timber tones (hue ~55-65, low-
       mid chroma) — distinct from the garden-green primary (hue 145) and the
       honey-amber memory tokens (hue 78). The plank has slightly imperfect
       edges, visible timber grain, a soft weathered surface, and the words
       "Garden Style" + "Choose your world" plus a three-line menu mark and a
       trailing chevron all look BURNED / hand-CARVED into the wood. No glass,
       no honey, no shimmer. Tokens cover the plank surface, the grain, the
       carved-text shadow, the burned-mark color, the plank border, and the
       press feedback. */
    --garden-style-plank: oklch(0.62 0.07 62);
    --garden-style-plank-light: oklch(0.7 0.08 58);
    --garden-style-plank-dark: oklch(0.5 0.06 55);
    --garden-style-plank-edge: oklch(0.42 0.05 50);
    --garden-style-grain: oklch(0.46 0.05 52);
    --garden-style-grain-soft: oklch(0.54 0.05 55);
    --garden-style-weather: oklch(0.4 0.04 50 / 0.18);
    --garden-style-raise: 0 12px 24px -10px oklch(0.3 0.05 50 / 0.5), 0 5px 12px
      -4px oklch(0.3 0.05 50 / 0.32);
    --garden-style-highlight: inset 0 2px 1px 0 oklch(0.78 0.07 60 / 0.55),
      inset 0 -3px 2px -1px oklch(0.32 0.05 50 / 0.4);
    --garden-style-press: inset 0 3px 6px -1px oklch(0.25 0.04 50 / 0.5), 0 2px
      5px -2px oklch(0.3 0.05 50 / 0.3);
    --garden-style-burn: oklch(0.3 0.05 45);
    --garden-style-burn-soft: oklch(0.38 0.05 48);
    --garden-style-carve: 0 1px 0 oklch(0.74 0.07 60 / 0.6), 0 -1px 1px 0
      oklch(0.22 0.04 45 / 0.85), 0 1px 2px 0 oklch(0.22 0.04 45 / 0.55);
    --garden-style-ring: oklch(0.55 0.12 145);

    /* ── Garden Style PAGE — upload + gallery route ─────────────────────────
       The full Garden Style page (reached by tapping the wooden sign on Home)
       is a functional upload/storage surface, NOT a wood-textured overlay. It
       uses the standard garden --card / --background elevation so it reads as
       part of the app, with a warm timber-derived accent that ties it back to
       the wooden sign the user tapped to get here. The accent sits at hue 58
       (warm timber) — distinct from --primary green (145), --honey amber (78),
       and --accent sunny (70) — so the page has its own quiet identity while
       staying inside the Sunny Garden palette. */
    --garden-style-page-accent: 0.62 0.1 58;
    --garden-style-page-accent-foreground: 0.99 0.01 110;
    --garden-style-page-accent-soft: 0.93 0.045 58;
    --garden-style-page-accent-ring: 0.62 0.1 58;
    /* Warm timber-tinted lift for gallery thumbnail cards — echoes the plank's
       warm shadow without copying the green-tinted --shadow-card-photo. */
    --garden-style-card-shadow: 0 6px 20px -5px oklch(0.35 0.06 55 / 0.26), 0
      3px 10px -2px oklch(0.35 0.06 55 / 0.16);
    --garden-style-card-shadow-lift: 0 10px 28px -6px oklch(0.35 0.06 55 / 0.34),
      0 4px 14px -3px oklch(0.35 0.06 55 / 0.2);
    --garden-style-card-shadow-press: 0 3px 10px -3px oklch(0.35 0.06 55 / 0.22);
  }

  .dark {
    /* Warm Night Garden — deep leafy charcoal, garden hues glow */
    --background: 0.17 0.02 145;
    --foreground: 0.94 0.012 110;
    --card: 0.21 0.024 145;
    --card-foreground: 0.94 0.012 110;
    --popover: 0.21 0.024 145;
    --popover-foreground: 0.94 0.012 110;

    --primary: 0.72 0.17 145;
    --primary-foreground: 0.17 0.02 145;

    --secondary: 0.26 0.03 145;
    --secondary-foreground: 0.88 0.012 110;
    --muted: 0.26 0.03 145;
    --muted-foreground: 0.6 0.02 130;

    --accent: 0.8 0.16 70;
    --accent-foreground: 0.17 0.02 70;

    --destructive: 0.62 0.21 25;
    --destructive-foreground: 0.17 0.02 25;

    --success: 0.7 0.16 145;
    --success-foreground: 0.17 0.02 145;
    --warning: 0.82 0.16 85;
    --warning-foreground: 0.2 0.04 85;

    --border: 0.3 0.025 145;
    --input: 0.3 0.025 145;
    --ring: 0.72 0.17 145;

    --chart-1: 0.72 0.17 145;
    --chart-2: 0.68 0.16 230;
    --chart-3: 0.62 0.12 55;
    --chart-4: 0.82 0.18 85;
    --chart-5: 0.68 0.2 25;

    /* Garden event colours — dark mode tuned for AA contrast on leafy charcoal */
    --event-plant: 0.72 0.18 145;
    --event-plant-foreground: 0.16 0.03 145;
    --event-water: 0.7 0.16 230;
    --event-water-foreground: 0.16 0.03 230;
    --event-food: 0.62 0.12 55;
    --event-food-foreground: 0.16 0.03 55;
    --event-harvest: 0.82 0.18 85;
    --event-harvest-foreground: 0.2 0.04 85;

    /* Growth Photo — lens magenta/rose, dark-mode tuned for AA on leafy charcoal */
    --event-camera: 0.7 0.17 350;
    --event-camera-foreground: 0.16 0.03 350;

    /* Soft tints — dark mode uses richer translucent overlays on card surfaces */
    --event-plant-soft: 0.28 0.06 145;
    --event-water-soft: 0.28 0.05 230;
    --event-food-soft: 0.28 0.04 55;
    --event-harvest-soft: 0.32 0.07 85;
    --event-camera-soft: 0.3 0.07 350;

    --sidebar: 0.21 0.024 145;
    --sidebar-foreground: 0.94 0.012 110;
    --sidebar-primary: 0.72 0.17 145;
    --sidebar-primary-foreground: 0.17 0.02 145;
    --sidebar-accent: 0.26 0.03 145;
    --sidebar-accent-foreground: 0.88 0.012 110;
    --sidebar-border: 0.3 0.025 145;
    --sidebar-ring: 0.72 0.17 145;

    --gradient-subtle: linear-gradient(
      180deg,
      oklch(0.17 0.02 145) 0%,
      oklch(0.2 0.024 145) 100%
    );
    --gradient-primary: linear-gradient(
      135deg,
      oklch(0.72 0.17 145) 0%,
      oklch(0.68 0.16 165) 100%
    );
    --gradient-sunny: linear-gradient(
      135deg,
      oklch(0.82 0.18 85) 0%,
      oklch(0.8 0.16 70) 100%
    );

    /* Identify Plant — dark mode tuned for AA on leafy charcoal */
    --pill-raise: 0 10px 24px -6px oklch(0 0 0 / 0.55), 0 4px 10px -2px
      oklch(0 0 0 / 0.32);
    --pill-highlight: inset 0 1px 0 0 oklch(0.7 0.06 145 / 0.4), inset 0 -1px 0
      0 oklch(0 0 0 / 0.25);
    --pill-glow: 0 0 0 1px oklch(var(--event-plant) / 0.28), 0 6px 22px -4px
      oklch(var(--event-plant) / 0.42);
    --pill-glow-soft: 0 0 18px -2px oklch(var(--event-plant) / 0.3);
    --pill-press: inset 0 2px 6px -1px oklch(0 0 0 / 0.5), 0 2px 6px -2px
      oklch(0 0 0 / 0.3);

    --identify-result-bg: oklch(0.21 0.03 145 / 0.55);
    --identify-result-border: oklch(0.4 0.04 145 / 0.55);
    --identify-result-shadow: 0 12px 36px -8px oklch(0 0 0 / 0.6), 0 4px 14px
      -2px oklch(0 0 0 / 0.32), inset 0 1px 0 0 oklch(0.65 0.05 145 / 0.4);

    --settings-surface: 0.24 0.03 145;
    --settings-surface-foreground: 0.88 0.012 110;

    /* Happy Snaps — honey-amber memory-book tokens, dark-mode tuned for AA
       on leafy charcoal. Honey brightens; the cream page becomes a warm
       low-key panel that still reads as "paper" against the dark garden. */
    --honey: 0.8 0.15 78;
    --honey-foreground: 0.18 0.04 78;
    --honey-soft: 0.3 0.07 78;
    --honey-ring: 0.8 0.15 78;

    --memory-page: 0.24 0.028 80;
    --memory-page-foreground: 0.9 0.015 85;
    --memory-page-border: 0.36 0.035 80;

    --memory-tape: 0.42 0.08 78;

    --memory-shadow: 0 6px 18px -4px oklch(0 0 0 / 0.5), 0 2px 8px -2px
      oklch(0 0 0 / 0.34);
    --memory-shadow-lift: 0 12px 32px -6px oklch(0 0 0 / 0.62), 0 4px 14px -3px
      oklch(0 0 0 / 0.4);

    --memory-crease: inset 6px 0 16px -4px oklch(0 0 0 / 0.45), inset -6px 0
      16px -4px oklch(0 0 0 / 0.45);

    /* Garden Style — dark-mode tuned for AA on leafy charcoal. The plank
       becomes a deeper, warmer timber lit by the garden's ambient glow; the
       grain and burned marks stay readable against the dark garden. Still
       warm timber, never honey. */
    --garden-style-plank: oklch(0.42 0.06 58);
    --garden-style-plank-light: oklch(0.5 0.07 56);
    --garden-style-plank-dark: oklch(0.32 0.05 52);
    --garden-style-plank-edge: oklch(0.24 0.04 48);
    --garden-style-grain: oklch(0.3 0.05 52);
    --garden-style-grain-soft: oklch(0.38 0.05 55);
    --garden-style-weather: oklch(0.2 0.03 48 / 0.4);
    --garden-style-raise: 0 12px 26px -10px oklch(0 0 0 / 0.6), 0 5px 14px -4px
      oklch(0 0 0 / 0.4);
    --garden-style-highlight: inset 0 2px 1px 0 oklch(0.56 0.07 58 / 0.4), inset
      0 -3px 2px -1px oklch(0 0 0 / 0.45);
    --garden-style-press: inset 0 3px 7px -1px oklch(0 0 0 / 0.6), 0 2px 6px
      -2px oklch(0 0 0 / 0.35);
    --garden-style-burn: oklch(0.26 0.04 45);
    --garden-style-burn-soft: oklch(0.34 0.05 48);
    --garden-style-carve: 0 1px 0 oklch(0.6 0.07 58 / 0.45), 0 -1px 1px 0
      oklch(0.1 0.02 45 / 0.9), 0 1px 2px 0 oklch(0.1 0.02 45 / 0.6);
    --garden-style-ring: oklch(0.7 0.14 145);

    /* Garden Style PAGE — dark-mode tuned for AA on leafy charcoal. The timber
       accent brightens so it stays warm and readable against the dark garden;
       the soft tint becomes a low-key translucent overlay. */
    --garden-style-page-accent: 0.72 0.1 58;
    --garden-style-page-accent-foreground: 0.16 0.02 58;
    --garden-style-page-accent-soft: 0.28 0.05 58;
    --garden-style-page-accent-ring: 0.72 0.1 58;
    --garden-style-card-shadow: 0 6px 20px -5px oklch(0 0 0 / 0.5), 0 3px 10px
      -2px oklch(0 0 0 / 0.32);
    --garden-style-card-shadow-lift: 0 10px 28px -6px oklch(0 0 0 / 0.6), 0 4px
      14px -3px oklch(0 0 0 / 0.4);
    --garden-style-card-shadow-press: 0 3px 10px -3px oklch(0 0 0 / 0.4);
  }

  * {
  border-color: oklch(var(--border));
}
  /* Dark base paint behind everything — independent of the light/dark theme
     toggle on the Home page. The Home cover layer is a fixed oversized <img>
     (z-0) that paints ABOVE this body background, but during extreme mobile
     overscroll/bounce the cover can momentarily expose the body underneath.
     A dark garden-toned base (the dark-mode --background value) ensures no
     white strip can ever appear there, matching the dark scrim aesthetic. */
  html,
  body {
    background-color: oklch(0.17 0.02 145);
  }
  body {
  background-color: oklch(var(--background));
  font-family: var(--font-body), sans-serif;
  color: oklch(var(--foreground));
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

  /* ── Stable dynamic viewport height for root containers ───────────────────
     Use 100dvh (dynamic viewport height) so the root layout does NOT change
     when the mobile browser toolbar collapses or reappears on scroll. A 100vh
     fallback is provided first for older browsers that do not understand dvh;
     the @supports guard upgrades to 100dvh only when the UA supports it. This
     applies to html, body, and #root so every page (Layout outer div, Home
     root div) inherits a stable height basis without altering any existing
     component rule, background color, or @apply behavior. */
  html,
  body,
  #root {
    min-height: 100vh;
  }
  @supports (height: 100dvh) {
    html,
    body,
    #root {
      min-height: 100dvh;
    }
  }
.container {
  width: 100%;
  margin-right: auto;
  margin-left: auto;
  padding-right: 2rem;
  padding-left: 2rem;
}
@media (min-width: 1400px) {

  .container {
    max-width: 1400px;
  }
}
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border-width: 0;
}
.pointer-events-none {
  pointer-events: none;
}
.pointer-events-auto {
  pointer-events: auto;
}
.\!visible {
  visibility: visible !important;
}
.visible {
  visibility: visible;
}
.invisible {
  visibility: hidden;
}
.collapse {
  visibility: collapse;
}
.static {
  position: static;
}
.fixed {
  position: fixed;
}
.absolute {
  position: absolute;
}
.relative {
  position: relative;
}
.sticky {
  position: sticky;
}
.inset-0 {
  inset: 0px;
}
.inset-2 {
  inset: 0.5rem;
}
.inset-x-0 {
  left: 0px;
  right: 0px;
}
.inset-x-3 {
  left: 0.75rem;
  right: 0.75rem;
}
.inset-x-4 {
  left: 1rem;
  right: 1rem;
}
.inset-y-0 {
  top: 0px;
  bottom: 0px;
}
.inset-y-2 {
  top: 0.5rem;
  bottom: 0.5rem;
}
.-bottom-12 {
  bottom: -3rem;
}
.-left-12 {
  left: -3rem;
}
.-right-1 {
  right: -0.25rem;
}
.-right-12 {
  right: -3rem;
}
.-right-2 {
  right: -0.5rem;
}
.-top-12 {
  top: -3rem;
}
.-top-2 {
  top: -0.5rem;
}
.bottom-0 {
  bottom: 0px;
}
.bottom-2 {
  bottom: 0.5rem;
}
.bottom-3 {
  bottom: 0.75rem;
}
.bottom-7 {
  bottom: 1.75rem;
}
.bottom-\[3px\] {
  bottom: 3px;
}
.bottom-\[72px\] {
  bottom: 72px;
}
.left-0 {
  left: 0px;
}
.left-1 {
  left: 0.25rem;
}
.left-1\/2 {
  left: 50%;
}
.left-2 {
  left: 0.5rem;
}
.left-3 {
  left: 0.75rem;
}
.left-4 {
  left: 1rem;
}
.left-\[50\%\] {
  left: 50%;
}
.right-0 {
  right: 0px;
}
.right-1 {
  right: 0.25rem;
}
.right-2 {
  right: 0.5rem;
}
.right-3 {
  right: 0.75rem;
}
.right-4 {
  right: 1rem;
}
.top-0 {
  top: 0px;
}
.top-1 {
  top: 0.25rem;
}
.top-1\.5 {
  top: 0.375rem;
}
.top-1\/2 {
  top: 50%;
}
.top-2 {
  top: 0.5rem;
}
.top-3 {
  top: 0.75rem;
}
.top-3\.5 {
  top: 0.875rem;
}
.top-4 {
  top: 1rem;
}
.top-6 {
  top: 1.5rem;
}
.top-\[1px\] {
  top: 1px;
}
.top-\[50\%\] {
  top: 50%;
}
.top-\[60\%\] {
  top: 60%;
}
.top-full {
  top: 100%;
}
.isolate {
  isolation: isolate;
}
.z-0 {
  z-index: 0;
}
.z-10 {
  z-index: 10;
}
.z-20 {
  z-index: 20;
}
.z-30 {
  z-index: 30;
}
.z-50 {
  z-index: 50;
}
.z-\[1\] {
  z-index: 1;
}
.z-\[70\] {
  z-index: 70;
}
.col-span-2 {
  grid-column: span 2 / span 2;
}
.col-start-2 {
  grid-column-start: 2;
}
.row-span-2 {
  grid-row: span 2 / span 2;
}
.row-start-1 {
  grid-row-start: 1;
}
.m-2 {
  margin: 0.5rem;
}
.-mx-1 {
  margin-left: -0.25rem;
  margin-right: -0.25rem;
}
.-mx-4 {
  margin-left: -1rem;
  margin-right: -1rem;
}
.-mx-5 {
  margin-left: -1.25rem;
  margin-right: -1.25rem;
}
.mx-2 {
  margin-left: 0.5rem;
  margin-right: 0.5rem;
}
.mx-3\.5 {
  margin-left: 0.875rem;
  margin-right: 0.875rem;
}
.mx-auto {
  margin-left: auto;
  margin-right: auto;
}
.my-0\.5 {
  margin-top: 0.125rem;
  margin-bottom: 0.125rem;
}
.my-1 {
  margin-top: 0.25rem;
  margin-bottom: 0.25rem;
}
.-ml-0\.5 {
  margin-left: -0.125rem;
}
.-ml-4 {
  margin-left: -1rem;
}
.-mt-4 {
  margin-top: -1rem;
}
.-mt-6 {
  margin-top: -1.5rem;
}
.mb-2 {
  margin-bottom: 0.5rem;
}
.mb-3 {
  margin-bottom: 0.75rem;
}
.mb-4 {
  margin-bottom: 1rem;
}
.mb-6 {
  margin-bottom: 1.5rem;
}
.ml-1 {
  margin-left: 0.25rem;
}
.ml-auto {
  margin-left: auto;
}
.mr-2 {
  margin-right: 0.5rem;
}
.mt-0\.5 {
  margin-top: 0.125rem;
}
.mt-1 {
  margin-top: 0.25rem;
}
.mt-1\.5 {
  margin-top: 0.375rem;
}
.mt-2 {
  margin-top: 0.5rem;
}
.mt-3 {
  margin-top: 0.75rem;
}
.mt-4 {
  margin-top: 1rem;
}
.mt-5 {
  margin-top: 1.25rem;
}
.mt-auto {
  margin-top: auto;
}
.line-clamp-1 {
  overflow: hidden;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 1;
}
.line-clamp-2 {
  overflow: hidden;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
}
.block {
  display: block;
}
.inline-block {
  display: inline-block;
}
.inline {
  display: inline;
}
.flex {
  display: flex;
}
.inline-flex {
  display: inline-flex;
}
.table {
  display: table;
}
.table-caption {
  display: table-caption;
}
.table-cell {
  display: table-cell;
}
.table-row {
  display: table-row;
}
.grid {
  display: grid;
}
.hidden {
  display: none;
}
.aspect-\[16\/10\] {
  aspect-ratio: 16/10;
}
.aspect-\[3\/4\] {
  aspect-ratio: 3/4;
}
.aspect-\[4\/3\] {
  aspect-ratio: 4/3;
}
.aspect-\[5\/3\] {
  aspect-ratio: 5/3;
}
.aspect-square {
  aspect-ratio: 1 / 1;
}
.aspect-video {
  aspect-ratio: 16 / 9;
}
.size-11 {
  width: 2.75rem;
  height: 2.75rem;
}
.size-2 {
  width: 0.5rem;
  height: 0.5rem;
}
.size-2\.5 {
  width: 0.625rem;
  height: 0.625rem;
}
.size-3 {
  width: 0.75rem;
  height: 0.75rem;
}
.size-3\.5 {
  width: 0.875rem;
  height: 0.875rem;
}
.size-4 {
  width: 1rem;
  height: 1rem;
}
.size-7 {
  width: 1.75rem;
  height: 1.75rem;
}
.size-8 {
  width: 2rem;
  height: 2rem;
}
.size-9 {
  width: 2.25rem;
  height: 2.25rem;
}
.size-auto {
  width: auto;
  height: auto;
}
.size-full {
  width: 100%;
  height: 100%;
}
.h-1\.5 {
  height: 0.375rem;
}
.h-10 {
  height: 2.5rem;
}
.h-11 {
  height: 2.75rem;
}
.h-12 {
  height: 3rem;
}
.h-14 {
  height: 3.5rem;
}
.h-16 {
  height: 4rem;
}
.h-2 {
  height: 0.5rem;
}
.h-2\.5 {
  height: 0.625rem;
}
.h-20 {
  height: 5rem;
}
.h-24 {
  height: 6rem;
}
.h-28 {
  height: 7rem;
}
.h-3 {
  height: 0.75rem;
}
.h-3\.5 {
  height: 0.875rem;
}
.h-3\/5 {
  height: 60%;
}
.h-4 {
  height: 1rem;
}
.h-40 {
  height: 10rem;
}
.h-44 {
  height: 11rem;
}
.h-5 {
  height: 1.25rem;
}
.h-6 {
  height: 1.5rem;
}
.h-7 {
  height: 1.75rem;
}
.h-8 {
  height: 2rem;
}
.h-80 {
  height: 20rem;
}
.h-9 {
  height: 2.25rem;
}
.h-\[1\.15rem\] {
  height: 1.15rem;
}
.h-\[50vh\] {
  height: 50vh;
}
.h-\[68px\] {
  height: 68px;
}
.h-\[9px\] {
  height: 9px;
}
.h-\[calc\(100\%-1px\)\] {
  height: calc(100% - 1px);
}
.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;
}
.h-svh {
  height: 100svh;
}
.max-h-\[300px\] {
  max-height: 300px;
}
.max-h-\[70vh\] {
  max-height: 70vh;
}
.max-h-full {
  max-height: 100%;
}
.min-h-0 {
  min-height: 0px;
}
.min-h-16 {
  min-height: 4rem;
}
.min-h-4 {
  min-height: 1rem;
}
.min-h-\[360px\] {
  min-height: 360px;
}
.min-h-\[60vh\] {
  min-height: 60vh;
}
.min-h-dvh {
  min-height: 100dvh;
}
.min-h-screen {
  min-height: 100vh;
}
.min-h-svh {
  min-height: 100svh;
}
.w-0 {
  width: 0px;
}
.w-1 {
  width: 0.25rem;
}
.w-1\/2 {
  width: 50%;
}
.w-10 {
  width: 2.5rem;
}
.w-11 {
  width: 2.75rem;
}
.w-12 {
  width: 3rem;
}
.w-14 {
  width: 3.5rem;
}
.w-16 {
  width: 4rem;
}
.w-2 {
  width: 0.5rem;
}
.w-2\.5 {
  width: 0.625rem;
}
.w-2\/3 {
  width: 66.666667%;
}
.w-20 {
  width: 5rem;
}
.w-24 {
  width: 6rem;
}
.w-28 {
  width: 7rem;
}
.w-3 {
  width: 0.75rem;
}
.w-3\.5 {
  width: 0.875rem;
}
.w-3\/4 {
  width: 75%;
}
.w-32 {
  width: 8rem;
}
.w-4 {
  width: 1rem;
}
.w-40 {
  width: 10rem;
}
.w-5 {
  width: 1.25rem;
}
.w-6 {
  width: 1.5rem;
}
.w-64 {
  width: 16rem;
}
.w-7 {
  width: 1.75rem;
}
.w-72 {
  width: 18rem;
}
.w-8 {
  width: 2rem;
}
.w-9 {
  width: 2.25rem;
}
.w-\[100px\] {
  width: 100px;
}
.w-\[9px\] {
  width: 9px;
}
.w-\[calc\(100\%\+2\.5rem\)\] {
  width: calc(100% + 2.5rem);
}
.w-auto {
  width: auto;
}
.w-fit {
  width: -moz-fit-content;
  width: fit-content;
}
.w-full {
  width: 100%;
}
.w-max {
  width: -moz-max-content;
  width: max-content;
}
.w-px {
  width: 1px;
}
.min-w-0 {
  min-width: 0px;
}
.min-w-10 {
  min-width: 2.5rem;
}
.min-w-5 {
  min-width: 1.25rem;
}
.min-w-8 {
  min-width: 2rem;
}
.min-w-9 {
  min-width: 2.25rem;
}
.min-w-\[12rem\] {
  min-width: 12rem;
}
.min-w-\[8rem\] {
  min-width: 8rem;
}
.min-w-\[var\(--radix-select-trigger-width\)\] {
  min-width: var(--radix-select-trigger-width);
}
.max-w-2xl {
  max-width: 42rem;
}
.max-w-3xl {
  max-width: 48rem;
}
.max-w-\[16rem\] {
  max-width: 16rem;
}
.max-w-\[18rem\] {
  max-width: 18rem;
}
.max-w-\[20rem\] {
  max-width: 20rem;
}
.max-w-\[220px\] {
  max-width: 220px;
}
.max-w-\[240px\] {
  max-width: 240px;
}
.max-w-\[260px\] {
  max-width: 260px;
}
.max-w-\[480px\] {
  max-width: 480px;
}
.max-w-\[60vw\] {
  max-width: 60vw;
}
.max-w-\[78\%\] {
  max-width: 78%;
}
.max-w-\[80\%\] {
  max-width: 80%;
}
.max-w-\[88\%\] {
  max-width: 88%;
}
.max-w-\[calc\(100\%-2rem\)\] {
  max-width: calc(100% - 2rem);
}
.max-w-full {
  max-width: 100%;
}
.max-w-max {
  max-width: -moz-max-content;
  max-width: max-content;
}
.max-w-md {
  max-width: 28rem;
}
.max-w-sm {
  max-width: 24rem;
}
.max-w-xs {
  max-width: 20rem;
}
.flex-1 {
  flex: 1 1 0%;
}
.flex-shrink {
  flex-shrink: 1;
}
.flex-shrink-0 {
  flex-shrink: 0;
}
.shrink {
  flex-shrink: 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: -50%;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.-translate-x-2 {
  --tw-translate-x: -0.5rem;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.-translate-x-px {
  --tw-translate-x: -1px;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.-translate-y-1\/2 {
  --tw-translate-y: -50%;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.translate-x-0\.5 {
  --tw-translate-x: 0.125rem;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.translate-x-5 {
  --tw-translate-x: 1.25rem;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.translate-x-\[-50\%\] {
  --tw-translate-x: -50%;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.translate-x-px {
  --tw-translate-x: 1px;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.translate-y-0\.5 {
  --tw-translate-y: 0.125rem;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.translate-y-\[-50\%\] {
  --tw-translate-y: -50%;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.translate-y-\[calc\(-50\%_-_2px\)\] {
  --tw-translate-y: calc(-50% - 2px);
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.rotate-45 {
  --tw-rotate: 45deg;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.rotate-90 {
  --tw-rotate: 90deg;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.transform {
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
@keyframes card-entrance {

  0% {
    opacity: 0;
    transform: translateY(12px) scale(0.97);
  }

  60% {
    opacity: 1;
    transform: translateY(-2px) scale(1.01);
  }

  100% {
    opacity: 1;
    transform: translateY(0) scale(1);
  }
}
.animate-card-entrance {
  animation: card-entrance 0.45s cubic-bezier(0.34, 1.56, 0.64, 1);
}
@keyframes fade-in-up {

  from {
    opacity: 0;
    transform: translateY(8px);
  }

  to {
    opacity: 1;
    transform: translateY(0);
  }
}
.animate-fade-in-up {
  animation: fade-in-up 0.35s cubic-bezier(0.4, 0, 0.2, 1);
}
@keyframes pulse {

  50% {
    opacity: .5;
  }
}
.animate-pulse {
  animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
}
@keyframes spin {

  to {
    transform: rotate(360deg);
  }
}
.animate-spin {
  animation: spin 1s linear infinite;
}
@keyframes swipe-tick {

  0% {
    opacity: 0;
    transform: scale(0.8);
  }

  50% {
    opacity: 1;
    transform: scale(1.15);
  }

  100% {
    opacity: 1;
    transform: scale(1);
  }
}
.animate-swipe-tick {
  animation: swipe-tick 0.4s ease-out;
}
.cursor-default {
  cursor: default;
}
.cursor-grab {
  cursor: grab;
}
.cursor-pointer {
  cursor: pointer;
}
.cursor-text {
  cursor: text;
}
.touch-none {
  touch-action: none;
}
.select-none {
  -webkit-user-select: none;
     -moz-user-select: none;
          user-select: none;
}
.resize {
  resize: both;
}
.scroll-my-1 {
  scroll-margin-top: 0.25rem;
  scroll-margin-bottom: 0.25rem;
}
.scroll-py-1 {
  scroll-padding-top: 0.25rem;
  scroll-padding-bottom: 0.25rem;
}
.list-none {
  list-style-type: none;
}
.auto-rows-min {
  grid-auto-rows: min-content;
}
.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-7 {
  grid-template-columns: repeat(7, minmax(0, 1fr));
}
.grid-cols-\[0_1fr\] {
  grid-template-columns: 0 1fr;
}
.grid-rows-\[auto_auto\] {
  grid-template-rows: auto auto;
}
.flex-row {
  flex-direction: row;
}
.flex-col {
  flex-direction: column;
}
.flex-col-reverse {
  flex-direction: column-reverse;
}
.flex-wrap {
  flex-wrap: wrap;
}
.place-items-center {
  place-items: center;
}
.content-center {
  align-content: center;
}
.items-start {
  align-items: flex-start;
}
.items-end {
  align-items: flex-end;
}
.items-center {
  align-items: center;
}
.items-baseline {
  align-items: baseline;
}
.items-stretch {
  align-items: stretch;
}
.justify-start {
  justify-content: flex-start;
}
.justify-end {
  justify-content: flex-end;
}
.justify-center {
  justify-content: center;
}
.justify-between {
  justify-content: space-between;
}
.justify-items-start {
  justify-items: start;
}
.justify-items-center {
  justify-items: center;
}
.gap-0\.5 {
  gap: 0.125rem;
}
.gap-1 {
  gap: 0.25rem;
}
.gap-1\.5 {
  gap: 0.375rem;
}
.gap-2 {
  gap: 0.5rem;
}
.gap-2\.5 {
  gap: 0.625rem;
}
.gap-3 {
  gap: 0.75rem;
}
.gap-4 {
  gap: 1rem;
}
.gap-5 {
  gap: 1.25rem;
}
.gap-6 {
  gap: 1.5rem;
}
.gap-7 {
  gap: 1.75rem;
}
.gap-\[1px\] {
  gap: 1px;
}
.gap-\[3px\] {
  gap: 3px;
}
.gap-px {
  gap: 1px;
}
.gap-x-4 {
  -moz-column-gap: 1rem;
       column-gap: 1rem;
}
.gap-y-0\.5 {
  row-gap: 0.125rem;
}
.gap-y-1 {
  row-gap: 0.25rem;
}
.space-y-0\.5 > :not([hidden]) ~ :not([hidden]) {
  --tw-space-y-reverse: 0;
  margin-top: calc(0.125rem * calc(1 - var(--tw-space-y-reverse)));
  margin-bottom: calc(0.125rem * var(--tw-space-y-reverse));
}
.space-y-1 > :not([hidden]) ~ :not([hidden]) {
  --tw-space-y-reverse: 0;
  margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse)));
  margin-bottom: calc(0.25rem * var(--tw-space-y-reverse));
}
.space-y-1\.5 > :not([hidden]) ~ :not([hidden]) {
  --tw-space-y-reverse: 0;
  margin-top: calc(0.375rem * calc(1 - var(--tw-space-y-reverse)));
  margin-bottom: calc(0.375rem * var(--tw-space-y-reverse));
}
.space-y-2 > :not([hidden]) ~ :not([hidden]) {
  --tw-space-y-reverse: 0;
  margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse)));
  margin-bottom: calc(0.5rem * var(--tw-space-y-reverse));
}
.space-y-3 > :not([hidden]) ~ :not([hidden]) {
  --tw-space-y-reverse: 0;
  margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse)));
  margin-bottom: calc(0.75rem * var(--tw-space-y-reverse));
}
.space-y-4 > :not([hidden]) ~ :not([hidden]) {
  --tw-space-y-reverse: 0;
  margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));
  margin-bottom: calc(1rem * var(--tw-space-y-reverse));
}
.space-y-5 > :not([hidden]) ~ :not([hidden]) {
  --tw-space-y-reverse: 0;
  margin-top: calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));
  margin-bottom: calc(1.25rem * var(--tw-space-y-reverse));
}
.space-y-6 > :not([hidden]) ~ :not([hidden]) {
  --tw-space-y-reverse: 0;
  margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));
  margin-bottom: calc(1.5rem * var(--tw-space-y-reverse));
}
.self-start {
  align-self: flex-start;
}
.self-center {
  align-self: center;
}
.justify-self-end {
  justify-self: end;
}
.overflow-auto {
  overflow: auto;
}
.overflow-hidden {
  overflow: hidden;
}
.overflow-visible {
  overflow: visible;
}
.overflow-x-auto {
  overflow-x: auto;
}
.overflow-y-auto {
  overflow-y: auto;
}
.overflow-x-hidden {
  overflow-x: hidden;
}
.truncate {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.whitespace-nowrap {
  white-space: nowrap;
}
.whitespace-pre-wrap {
  white-space: pre-wrap;
}
.text-balance {
  text-wrap: balance;
}
.break-words {
  overflow-wrap: break-word;
}
.rounded {
  border-radius: 0.25rem;
}
.rounded-2xl {
  border-radius: 1rem;
}
.rounded-3xl {
  border-radius: 1.5rem;
}
.rounded-\[1\.25rem\] {
  border-radius: 1.25rem;
}
.rounded-\[1\.35rem\] {
  border-radius: 1.35rem;
}
.rounded-\[1\.65rem\] {
  border-radius: 1.65rem;
}
.rounded-\[1\.75rem\] {
  border-radius: 1.75rem;
}
.rounded-\[14px\] {
  border-radius: 14px;
}
.rounded-\[2px\] {
  border-radius: 2px;
}
.rounded-\[4px\] {
  border-radius: 4px;
}
.rounded-\[inherit\] {
  border-radius: inherit;
}
.rounded-full {
  border-radius: 9999px;
}
.rounded-lg {
  border-radius: var(--radius);
}
.rounded-md {
  border-radius: calc(var(--radius) - 2px);
}
.rounded-none {
  border-radius: 0px;
}
.rounded-sm {
  border-radius: calc(var(--radius) - 4px);
}
.rounded-xl {
  border-radius: 0.75rem;
}
.rounded-b-2xl {
  border-bottom-right-radius: 1rem;
  border-bottom-left-radius: 1rem;
}
.rounded-l-md {
  border-top-left-radius: calc(var(--radius) - 2px);
  border-bottom-left-radius: calc(var(--radius) - 2px);
}
.rounded-r {
  border-top-right-radius: 0.25rem;
  border-bottom-right-radius: 0.25rem;
}
.rounded-r-md {
  border-top-right-radius: calc(var(--radius) - 2px);
  border-bottom-right-radius: calc(var(--radius) - 2px);
}
.rounded-t-3xl {
  border-top-left-radius: 1.5rem;
  border-top-right-radius: 1.5rem;
}
.rounded-t-\[1\.5rem\] {
  border-top-left-radius: 1.5rem;
  border-top-right-radius: 1.5rem;
}
.rounded-t-\[1\.65rem\] {
  border-top-left-radius: 1.65rem;
  border-top-right-radius: 1.65rem;
}
.rounded-tl-sm {
  border-top-left-radius: calc(var(--radius) - 4px);
}
.border {
  border-width: 1px;
}
.border-2 {
  border-width: 2px;
}
.border-4 {
  border-width: 4px;
}
.border-\[1\.5px\] {
  border-width: 1.5px;
}
.border-y {
  border-top-width: 1px;
  border-bottom-width: 1px;
}
.border-b {
  border-bottom-width: 1px;
}
.border-l {
  border-left-width: 1px;
}
.border-r {
  border-right-width: 1px;
}
.border-t {
  border-top-width: 1px;
}
.border-dashed {
  border-style: dashed;
}
.border-\[oklch\(var\(--honey\)\/0\.45\)\] {
  border-color: oklch(var(--honey)/0.45);
}
.border-\[oklch\(var\(--memory-page-border\)\)\] {
  border-color: oklch(var(--memory-page-border));
}
.border-\[oklch\(var\(--memory-page-border\)\/0\.4\)\] {
  border-color: oklch(var(--memory-page-border)/0.4);
}
.border-\[oklch\(var\(--memory-page-border\)\/0\.5\)\] {
  border-color: oklch(var(--memory-page-border)/0.5);
}
.border-border {
  border-color: oklch(var(--border));
}
.border-event-camera\/40 {
  border-color: oklch(var(--event-camera) / 0.4);
}
.border-input {
  border-color: oklch(var(--input));
}
.border-primary {
  --tw-border-opacity: 1;
  border-color: oklch(var(--primary) / var(--tw-border-opacity, 1));
}
.border-primary\/30 {
  border-color: oklch(var(--primary) / 0.3);
}
.border-sidebar-border {
  border-color: oklch(var(--sidebar-border));
}
.border-transparent {
  border-color: transparent;
}
.border-white\/30 {
  border-color: rgb(255 255 255 / 0.3);
}
.border-white\/40 {
  border-color: rgb(255 255 255 / 0.4);
}
.border-white\/50 {
  border-color: rgb(255 255 255 / 0.5);
}
.border-white\/60 {
  border-color: rgb(255 255 255 / 0.6);
}
.border-white\/70 {
  border-color: rgb(255 255 255 / 0.7);
}
.border-l-transparent {
  border-left-color: transparent;
}
.border-t-transparent {
  border-top-color: transparent;
}
.bg-\[oklch\(var\(--honey-soft\)\/0\.3\)\] {
  background-color: oklch(var(--honey-soft)/0.3);
}
.bg-\[oklch\(var\(--honey-soft\)\/0\.4\)\] {
  background-color: oklch(var(--honey-soft)/0.4);
}
.bg-\[oklch\(var\(--memory-page\)\)\] {
  background-color: oklch(var(--memory-page));
}
.bg-\[oklch\(var\(--memory-page\)\/0\.6\)\] {
  background-color: oklch(var(--memory-page)/0.6);
}
.bg-\[oklch\(var\(--muted\)\)\] {
  background-color: oklch(var(--muted));
}
.bg-accent {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--accent) / var(--tw-bg-opacity, 1));
}
.bg-background {
  background-color: oklch(var(--background));
}
.bg-black\/30 {
  background-color: rgb(0 0 0 / 0.3);
}
.bg-black\/40 {
  background-color: rgb(0 0 0 / 0.4);
}
.bg-black\/45 {
  background-color: rgb(0 0 0 / 0.45);
}
.bg-black\/50 {
  background-color: rgb(0 0 0 / 0.5);
}
.bg-black\/90 {
  background-color: rgb(0 0 0 / 0.9);
}
.bg-border {
  background-color: oklch(var(--border));
}
.bg-card {
  background-color: oklch(var(--card));
}
.bg-destructive {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--destructive) / var(--tw-bg-opacity, 1));
}
.bg-destructive\/10 {
  background-color: oklch(var(--destructive) / 0.1);
}
.bg-event-camera {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--event-camera) / var(--tw-bg-opacity, 1));
}
.bg-event-camera-soft {
  background-color: oklch(var(--event-camera-soft));
}
.bg-event-camera\/15 {
  background-color: oklch(var(--event-camera) / 0.15);
}
.bg-event-camera\/20 {
  background-color: oklch(var(--event-camera) / 0.2);
}
.bg-event-camera\/5 {
  background-color: oklch(var(--event-camera) / 0.05);
}
.bg-event-food {
  background-color: oklch(var(--event-food));
}
.bg-event-food-soft {
  background-color: oklch(var(--event-food-soft));
}
.bg-event-harvest {
  background-color: oklch(var(--event-harvest));
}
.bg-event-harvest-soft {
  background-color: oklch(var(--event-harvest-soft));
}
.bg-event-plant {
  background-color: oklch(var(--event-plant));
}
.bg-event-plant-soft {
  background-color: oklch(var(--event-plant-soft));
}
.bg-event-water {
  background-color: oklch(var(--event-water));
}
.bg-event-water-soft {
  background-color: oklch(var(--event-water-soft));
}
.bg-foreground {
  background-color: oklch(var(--foreground));
}
.bg-muted {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--muted) / var(--tw-bg-opacity, 1));
}
.bg-muted-foreground\/40 {
  background-color: oklch(var(--muted-foreground) / 0.4);
}
.bg-muted-foreground\/60 {
  background-color: oklch(var(--muted-foreground) / 0.6);
}
.bg-muted\/40 {
  background-color: oklch(var(--muted) / 0.4);
}
.bg-muted\/50 {
  background-color: oklch(var(--muted) / 0.5);
}
.bg-muted\/60 {
  background-color: oklch(var(--muted) / 0.6);
}
.bg-muted\/70 {
  background-color: oklch(var(--muted) / 0.7);
}
.bg-popover {
  background-color: oklch(var(--popover));
}
.bg-primary {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--primary) / var(--tw-bg-opacity, 1));
}
.bg-primary\/10 {
  background-color: oklch(var(--primary) / 0.1);
}
.bg-primary\/15 {
  background-color: oklch(var(--primary) / 0.15);
}
.bg-primary\/20 {
  background-color: oklch(var(--primary) / 0.2);
}
.bg-secondary {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--secondary) / var(--tw-bg-opacity, 1));
}
.bg-secondary\/60 {
  background-color: oklch(var(--secondary) / 0.6);
}
.bg-sidebar {
  background-color: oklch(var(--sidebar));
}
.bg-sidebar-border {
  background-color: oklch(var(--sidebar-border));
}
.bg-transparent {
  background-color: transparent;
}
.bg-white {
  --tw-bg-opacity: 1;
  background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));
}
.bg-white\/10 {
  background-color: rgb(255 255 255 / 0.1);
}
.bg-white\/90 {
  background-color: rgb(255 255 255 / 0.9);
}
.bg-gradient-to-b {
  background-image: linear-gradient(to bottom, var(--tw-gradient-stops));
}
.bg-gradient-to-t {
  background-image: linear-gradient(to top, var(--tw-gradient-stops));
}
.from-black\/35 {
  --tw-gradient-from: rgb(0 0 0 / 0.35) var(--tw-gradient-from-position);
  --tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);
  --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
}
.from-black\/40 {
  --tw-gradient-from: rgb(0 0 0 / 0.4) var(--tw-gradient-from-position);
  --tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);
  --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
}
.from-black\/45 {
  --tw-gradient-from: rgb(0 0 0 / 0.45) var(--tw-gradient-from-position);
  --tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);
  --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
}
.from-black\/55 {
  --tw-gradient-from: rgb(0 0 0 / 0.55) var(--tw-gradient-from-position);
  --tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);
  --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
}
.from-black\/75 {
  --tw-gradient-from: rgb(0 0 0 / 0.75) var(--tw-gradient-from-position);
  --tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);
  --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
}
.from-black\/80 {
  --tw-gradient-from: rgb(0 0 0 / 0.8) var(--tw-gradient-from-position);
  --tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);
  --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
}
.via-black\/15 {
  --tw-gradient-to: rgb(0 0 0 / 0)  var(--tw-gradient-to-position);
  --tw-gradient-stops: var(--tw-gradient-from), rgb(0 0 0 / 0.15) var(--tw-gradient-via-position), var(--tw-gradient-to);
}
.via-black\/20 {
  --tw-gradient-to: rgb(0 0 0 / 0)  var(--tw-gradient-to-position);
  --tw-gradient-stops: var(--tw-gradient-from), rgb(0 0 0 / 0.2) var(--tw-gradient-via-position), var(--tw-gradient-to);
}
.via-black\/25 {
  --tw-gradient-to: rgb(0 0 0 / 0)  var(--tw-gradient-to-position);
  --tw-gradient-stops: var(--tw-gradient-from), rgb(0 0 0 / 0.25) var(--tw-gradient-via-position), var(--tw-gradient-to);
}
.via-black\/30 {
  --tw-gradient-to: rgb(0 0 0 / 0)  var(--tw-gradient-to-position);
  --tw-gradient-stops: var(--tw-gradient-from), rgb(0 0 0 / 0.3) var(--tw-gradient-via-position), var(--tw-gradient-to);
}
.to-black\/25 {
  --tw-gradient-to: rgb(0 0 0 / 0.25) var(--tw-gradient-to-position);
}
.to-black\/30 {
  --tw-gradient-to: rgb(0 0 0 / 0.3) var(--tw-gradient-to-position);
}
.to-black\/45 {
  --tw-gradient-to: rgb(0 0 0 / 0.45) var(--tw-gradient-to-position);
}
.to-transparent {
  --tw-gradient-to: transparent var(--tw-gradient-to-position);
}
.bg-cover {
  background-size: cover;
}
.bg-center {
  background-position: center;
}
.fill-current {
  fill: currentColor;
}
.fill-primary {
  fill: oklch(var(--primary) / 1);
}
.object-contain {
  -o-object-fit: contain;
     object-fit: contain;
}
.object-cover {
  -o-object-fit: cover;
     object-fit: cover;
}
.object-center {
  -o-object-position: center;
     object-position: center;
}
.p-0 {
  padding: 0px;
}
.p-1 {
  padding: 0.25rem;
}
.p-2 {
  padding: 0.5rem;
}
.p-3 {
  padding: 0.75rem;
}
.p-4 {
  padding: 1rem;
}
.p-5 {
  padding: 1.25rem;
}
.p-6 {
  padding: 1.5rem;
}
.p-\[3px\] {
  padding: 3px;
}
.p-px {
  padding: 1px;
}
.px-0\.5 {
  padding-left: 0.125rem;
  padding-right: 0.125rem;
}
.px-1 {
  padding-left: 0.25rem;
  padding-right: 0.25rem;
}
.px-1\.5 {
  padding-left: 0.375rem;
  padding-right: 0.375rem;
}
.px-2 {
  padding-left: 0.5rem;
  padding-right: 0.5rem;
}
.px-2\.5 {
  padding-left: 0.625rem;
  padding-right: 0.625rem;
}
.px-3 {
  padding-left: 0.75rem;
  padding-right: 0.75rem;
}
.px-4 {
  padding-left: 1rem;
  padding-right: 1rem;
}
.px-5 {
  padding-left: 1.25rem;
  padding-right: 1.25rem;
}
.px-6 {
  padding-left: 1.5rem;
  padding-right: 1.5rem;
}
.px-8 {
  padding-left: 2rem;
  padding-right: 2rem;
}
.px-\[3px\] {
  padding-left: 3px;
  padding-right: 3px;
}
.py-0\.5 {
  padding-top: 0.125rem;
  padding-bottom: 0.125rem;
}
.py-1 {
  padding-top: 0.25rem;
  padding-bottom: 0.25rem;
}
.py-1\.5 {
  padding-top: 0.375rem;
  padding-bottom: 0.375rem;
}
.py-10 {
  padding-top: 2.5rem;
  padding-bottom: 2.5rem;
}
.py-12 {
  padding-top: 3rem;
  padding-bottom: 3rem;
}
.py-16 {
  padding-top: 4rem;
  padding-bottom: 4rem;
}
.py-2 {
  padding-top: 0.5rem;
  padding-bottom: 0.5rem;
}
.py-2\.5 {
  padding-top: 0.625rem;
  padding-bottom: 0.625rem;
}
.py-20 {
  padding-top: 5rem;
  padding-bottom: 5rem;
}
.py-3 {
  padding-top: 0.75rem;
  padding-bottom: 0.75rem;
}
.py-4 {
  padding-top: 1rem;
  padding-bottom: 1rem;
}
.py-5 {
  padding-top: 1.25rem;
  padding-bottom: 1.25rem;
}
.py-6 {
  padding-top: 1.5rem;
  padding-bottom: 1.5rem;
}
.py-7 {
  padding-top: 1.75rem;
  padding-bottom: 1.75rem;
}
.py-8 {
  padding-top: 2rem;
  padding-bottom: 2rem;
}
.py-\[1px\] {
  padding-top: 1px;
  padding-bottom: 1px;
}
.pb-16 {
  padding-bottom: 4rem;
}
.pb-24 {
  padding-bottom: 6rem;
}
.pb-28 {
  padding-bottom: 7rem;
}
.pb-3 {
  padding-bottom: 0.75rem;
}
.pb-4 {
  padding-bottom: 1rem;
}
.pb-6 {
  padding-bottom: 1.5rem;
}
.pb-7 {
  padding-bottom: 1.75rem;
}
.pb-8 {
  padding-bottom: 2rem;
}
.pl-2 {
  padding-left: 0.5rem;
}
.pl-4 {
  padding-left: 1rem;
}
.pl-8 {
  padding-left: 2rem;
}
.pr-1 {
  padding-right: 0.25rem;
}
.pr-2 {
  padding-right: 0.5rem;
}
.pr-2\.5 {
  padding-right: 0.625rem;
}
.pr-8 {
  padding-right: 2rem;
}
.pt-0 {
  padding-top: 0px;
}
.pt-1 {
  padding-top: 0.25rem;
}
.pt-12 {
  padding-top: 3rem;
}
.pt-3 {
  padding-top: 0.75rem;
}
.pt-4 {
  padding-top: 1rem;
}
.pt-6 {
  padding-top: 1.5rem;
}
.pt-\[3px\] {
  padding-top: 3px;
}
.text-left {
  text-align: left;
}
.text-center {
  text-align: center;
}
.align-middle {
  vertical-align: middle;
}
.font-body {
  font-family: var(--font-body), sans-serif;
}
.font-display {
  font-family: var(--font-display), sans-serif;
}
.font-handwritten {
  font-family: var(--font-handwritten), cursive;
}
.font-mono {
  font-family: var(--font-mono), monospace;
}
.text-2xl {
  font-size: 1.5rem;
  line-height: 2rem;
}
.text-3xl {
  font-size: 1.875rem;
  line-height: 2.25rem;
}
.text-4xl {
  font-size: 2.25rem;
  line-height: 2.5rem;
}
.text-6xl {
  font-size: 3.75rem;
  line-height: 1;
}
.text-\[0\.65rem\] {
  font-size: 0.65rem;
}
.text-\[0\.7rem\] {
  font-size: 0.7rem;
}
.text-\[0\.8rem\] {
  font-size: 0.8rem;
}
.text-\[10px\] {
  font-size: 10px;
}
.text-\[11px\] {
  font-size: 11px;
}
.text-\[7px\] {
  font-size: 7px;
}
.text-base {
  font-size: 1rem;
  line-height: 1.5rem;
}
.text-lg {
  font-size: 1.125rem;
  line-height: 1.75rem;
}
.text-sm {
  font-size: 0.875rem;
  line-height: 1.25rem;
}
.text-xl {
  font-size: 1.25rem;
  line-height: 1.75rem;
}
.text-xs {
  font-size: 0.75rem;
  line-height: 1rem;
}
.font-bold {
  font-weight: 700;
}
.font-extrabold {
  font-weight: 800;
}
.font-medium {
  font-weight: 500;
}
.font-normal {
  font-weight: 400;
}
.font-semibold {
  font-weight: 600;
}
.uppercase {
  text-transform: uppercase;
}
.italic {
  font-style: italic;
}
.ordinal {
  --tw-ordinal: ordinal;
  font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);
}
.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);
}
.leading-none {
  line-height: 1;
}
.leading-relaxed {
  line-height: 1.625;
}
.leading-tight {
  line-height: 1.25;
}
.tracking-\[0\.06em\] {
  letter-spacing: 0.06em;
}
.tracking-\[0\.18em\] {
  letter-spacing: 0.18em;
}
.tracking-tight {
  letter-spacing: -0.025em;
}
.tracking-wide {
  letter-spacing: 0.025em;
}
.tracking-wider {
  letter-spacing: 0.05em;
}
.tracking-widest {
  letter-spacing: 0.1em;
}
.text-\[oklch\(var\(--honey\)\)\] {
  color: oklch(var(--honey));
}
.text-\[oklch\(var\(--honey\)\/0\.55\)\] {
  color: oklch(var(--honey)/0.55);
}
.text-\[oklch\(var\(--honey\)\/0\.65\)\] {
  color: oklch(var(--honey)/0.65);
}
.text-\[oklch\(var\(--memory-page-foreground\)\)\] {
  color: oklch(var(--memory-page-foreground));
}
.text-\[oklch\(var\(--memory-page-foreground\)\/0\.6\)\] {
  color: oklch(var(--memory-page-foreground)/0.6);
}
.text-\[oklch\(var\(--memory-page-foreground\)\/0\.78\)\] {
  color: oklch(var(--memory-page-foreground)/0.78);
}
.text-accent-foreground {
  color: oklch(var(--accent-foreground));
}
.text-black {
  --tw-text-opacity: 1;
  color: rgb(0 0 0 / var(--tw-text-opacity, 1));
}
.text-card-foreground {
  color: oklch(var(--card-foreground));
}
.text-current {
  color: currentColor;
}
.text-destructive {
  --tw-text-opacity: 1;
  color: oklch(var(--destructive) / var(--tw-text-opacity, 1));
}
.text-destructive-foreground {
  color: oklch(var(--destructive-foreground));
}
.text-event-camera {
  --tw-text-opacity: 1;
  color: oklch(var(--event-camera) / var(--tw-text-opacity, 1));
}
.text-event-camera-foreground {
  color: oklch(var(--event-camera-foreground));
}
.text-event-food {
  color: oklch(var(--event-food));
}
.text-event-food-foreground {
  color: oklch(var(--event-food-foreground));
}
.text-event-harvest {
  color: oklch(var(--event-harvest));
}
.text-event-harvest-foreground {
  color: oklch(var(--event-harvest-foreground));
}
.text-event-plant {
  color: oklch(var(--event-plant));
}
.text-event-plant-foreground {
  color: oklch(var(--event-plant-foreground));
}
.text-event-water {
  color: oklch(var(--event-water));
}
.text-event-water-foreground {
  color: oklch(var(--event-water-foreground));
}
.text-foreground {
  color: oklch(var(--foreground));
}
.text-muted-foreground {
  --tw-text-opacity: 1;
  color: oklch(var(--muted-foreground) / var(--tw-text-opacity, 1));
}
.text-muted-foreground\/70 {
  color: oklch(var(--muted-foreground) / 0.7);
}
.text-muted-foreground\/80 {
  color: oklch(var(--muted-foreground) / 0.8);
}
.text-popover-foreground {
  color: oklch(var(--popover-foreground));
}
.text-primary {
  --tw-text-opacity: 1;
  color: oklch(var(--primary) / var(--tw-text-opacity, 1));
}
.text-primary-foreground {
  color: oklch(var(--primary-foreground));
}
.text-primary\/60 {
  color: oklch(var(--primary) / 0.6);
}
.text-red-300 {
  --tw-text-opacity: 1;
  color: rgb(252 165 165 / var(--tw-text-opacity, 1));
}
.text-secondary-foreground {
  color: oklch(var(--secondary-foreground));
}
.text-sidebar-foreground {
  color: oklch(var(--sidebar-foreground));
}
.text-white {
  --tw-text-opacity: 1;
  color: rgb(255 255 255 / var(--tw-text-opacity, 1));
}
.text-white\/50 {
  color: rgb(255 255 255 / 0.5);
}
.text-white\/60 {
  color: rgb(255 255 255 / 0.6);
}
.text-white\/70 {
  color: rgb(255 255 255 / 0.7);
}
.text-white\/80 {
  color: rgb(255 255 255 / 0.8);
}
.text-white\/85 {
  color: rgb(255 255 255 / 0.85);
}
.text-white\/90 {
  color: rgb(255 255 255 / 0.9);
}
.underline {
  text-decoration-line: underline;
}
.underline-offset-2 {
  text-underline-offset: 2px;
}
.underline-offset-4 {
  text-underline-offset: 4px;
}
.antialiased {
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
.accent-foreground {
  accent-color: oklch(var(--foreground));
}
.opacity-0 {
  opacity: 0;
}
.opacity-20 {
  opacity: 0.2;
}
.opacity-30 {
  opacity: 0.3;
}
.opacity-50 {
  opacity: 0.5;
}
.opacity-70 {
  opacity: 0.7;
}
.opacity-\[0\.12\] {
  opacity: 0.12;
}
.mix-blend-overlay {
  mix-blend-mode: overlay;
}
.shadow {
  --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
  --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.shadow-2xl {
  --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);
  --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.shadow-\[0_0_0_1px_hsl\(var\(--sidebar-border\)\)\] {
  --tw-shadow: 0 0 0 1px hsl(var(--sidebar-border));
  --tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.shadow-\[0_8px_28px_-6px_oklch\(var\(--event-plant\)\/0\.55\)\] {
  --tw-shadow: 0 8px 28px -6px oklch(var(--event-plant)/0.55);
  --tw-shadow-colored: 0 8px 28px -6px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.shadow-\[0_8px_28px_-8px_oklch\(0\.25_0\.05_145\/0\.28\)\2c 0_2px_8px_-2px_oklch\(0\.25_0\.05_145\/0\.14\)\] {
  --tw-shadow: 0 8px 28px -8px oklch(0.25 0.05 145/0.28),0 2px 8px -2px oklch(0.25 0.05 145/0.14);
  --tw-shadow-colored: 0 8px 28px -8px var(--tw-shadow-color), 0 2px 8px -2px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.shadow-card-pop {
  --tw-shadow: 0 8px 28px -6px oklch(0.35 0.1 145 / 0.28), 0 4px 12px -2px oklch(0.35 0.1 145 / 0.16);
  --tw-shadow-colored: 0 8px 28px -6px var(--tw-shadow-color), 0 4px 12px -2px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.shadow-event-glow {
  --tw-shadow: 0 2px 10px -2px oklch(var(--event-plant) / 0.3);
  --tw-shadow-colored: 0 2px 10px -2px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.shadow-lg {
  --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
  --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.shadow-md {
  --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
  --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.shadow-none {
  --tw-shadow: 0 0 #0000;
  --tw-shadow-colored: 0 0 #0000;
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.shadow-sm {
  --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
  --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.shadow-subtle {
  --tw-shadow: 0 1px 3px 0 rgba(20, 40, 20, 0.05), 0 1px 2px -1px rgba(20, 40, 20, 0.05);
  --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.shadow-xl {
  --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
  --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.shadow-xs {
  --tw-shadow: 0 1px 2px 0 rgba(0,0,0,0.05);
  --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.shadow-\[var\(--pill-raise\)\] {
  --tw-shadow-color: var(--pill-raise);
  --tw-shadow: var(--tw-shadow-colored);
}
.shadow-black\/30 {
  --tw-shadow-color: rgb(0 0 0 / 0.3);
  --tw-shadow: var(--tw-shadow-colored);
}
.outline-none {
  outline: 2px solid transparent;
  outline-offset: 2px;
}
.outline {
  outline-style: solid;
}
.ring {
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);
  box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
}
.ring-0 {
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);
  box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
}
.ring-1 {
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
  box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
}
.ring-2 {
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
  box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
}
.ring-inset {
  --tw-ring-inset: inset;
}
.ring-border {
  --tw-ring-color: oklch(var(--border));
}
.ring-event-camera\/40 {
  --tw-ring-color: oklch(var(--event-camera) / 0.4);
}
.ring-primary {
  --tw-ring-opacity: 1;
  --tw-ring-color: oklch(var(--primary) / var(--tw-ring-opacity, 1));
}
.ring-primary\/60 {
  --tw-ring-color: oklch(var(--primary) / 0.6);
}
.ring-ring\/50 {
  --tw-ring-color: oklch(var(--ring) / 0.5);
}
.ring-sidebar-ring {
  --tw-ring-color: oklch(var(--sidebar-ring));
}
.ring-white\/30 {
  --tw-ring-color: rgb(255 255 255 / 0.3);
}
.ring-offset-background {
  --tw-ring-offset-color: oklch(var(--background));
}
.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);
}
.drop-shadow {
  --tw-drop-shadow: drop-shadow(0 1px 2px rgb(0 0 0 / 0.1)) drop-shadow(0 1px 1px rgb(0 0 0 / 0.06));
  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);
}
.drop-shadow-md {
  --tw-drop-shadow: drop-shadow(0 4px 3px rgb(0 0 0 / 0.07)) drop-shadow(0 2px 2px rgb(0 0 0 / 0.06));
  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);
}
.backdrop-blur {
  --tw-backdrop-blur: blur(8px);
  backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
}
.backdrop-blur-md {
  --tw-backdrop-blur: blur(12px);
  backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
}
.backdrop-blur-sm {
  --tw-backdrop-blur: blur(4px);
  backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
}
.backdrop-blur-xl {
  --tw-backdrop-blur: blur(24px);
  backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
}
.backdrop-saturate-150 {
  --tw-backdrop-saturate: saturate(1.5);
  backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
}
.backdrop-filter {
  backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
}
.transition {
  transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}
.transition-\[color\2c box-shadow\] {
  transition-property: color,box-shadow;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}
.transition-\[left\2c right\2c width\] {
  transition-property: left,right,width;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}
.transition-\[margin\2c opacity\] {
  transition-property: margin,opacity;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}
.transition-\[width\2c height\2c padding\] {
  transition-property: width,height,padding;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}
.transition-\[width\] {
  transition-property: width;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}
.transition-all {
  transition-property: all;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}
.transition-colors {
  transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}
.transition-none {
  transition-property: none;
}
.transition-opacity {
  transition-property: opacity;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}
.transition-shadow {
  transition-property: box-shadow;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}
.transition-transform {
  transition-property: transform;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}
.duration-100 {
  transition-duration: 100ms;
}
.duration-1000 {
  transition-duration: 1000ms;
}
.duration-200 {
  transition-duration: 200ms;
}
.duration-300 {
  transition-duration: 300ms;
}
.ease-in-out {
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
}
.ease-linear {
  transition-timing-function: linear;
}
.ease-out {
  transition-timing-function: cubic-bezier(0, 0, 0.2, 1);
}
.\@container\/card-header {
  container-type: inline-size;
  container-name: card-header;
}
@keyframes enter {

  from {
    opacity: var(--tw-enter-opacity, 1);
    transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0));
  }
}
@keyframes exit {

  to {
    opacity: var(--tw-exit-opacity, 1);
    transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0));
  }
}
.animate-in {
  animation-name: enter;
  animation-duration: 150ms;
  --tw-enter-opacity: initial;
  --tw-enter-scale: initial;
  --tw-enter-rotate: initial;
  --tw-enter-translate-x: initial;
  --tw-enter-translate-y: initial;
}
.fade-in {
  --tw-enter-opacity: 0;
}
.fade-in-0 {
  --tw-enter-opacity: 0;
}
.zoom-in-95 {
  --tw-enter-scale: .95;
}
.duration-100 {
  animation-duration: 100ms;
}
.duration-1000 {
  animation-duration: 1000ms;
}
.duration-200 {
  animation-duration: 200ms;
}
.duration-300 {
  animation-duration: 300ms;
}
.ease-in-out {
  animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
}
.ease-linear {
  animation-timing-function: linear;
}
.ease-out {
  animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
}
.transition-smooth {
    transition: var(--transition-smooth);
  }
.transition-spring {
    transition: var(--transition-spring);
  }
.bg-gradient-subtle {
    background-image: var(--gradient-subtle);
  }
.bg-gradient-primary {
    background-image: var(--gradient-primary);
  }
.bg-gradient-sunny {
    background-image: var(--gradient-sunny);
  }
.text-gradient-primary {
    background-image: var(--gradient-primary);
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
  }
.text-gradient-sunny {
    background-image: var(--gradient-sunny);
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
  }
/* ── Glassmorphism — frosted-glass panels floating over a full-bleed garden photo ──
     Tinted with the garden palette (leafy in light, deep leafy in dark) so the
     frost reads as part of the garden, not generic white. backdrop-filter blurs
     the photo behind; a soft inner highlight + ring edge gives the glass its
     "lifted off the photo" quality. Three tiers cover the full range of needs. */
.glass-panel {
    background-color: oklch(0.97 0.02 120 / 0.55);
    backdrop-filter: blur(16px) saturate(1.35);
    -webkit-backdrop-filter: blur(16px) saturate(1.35);
    border: 1px solid oklch(0.99 0.012 110 / 0.55);
    box-shadow: 0 8px 28px -8px oklch(0.25 0.05 145 / 0.28), 0 2px 8px -2px
      oklch(0.25 0.05 145 / 0.14), inset 0 1px 0 0 oklch(1 0 0 / 0.4);
  }
.glass-panel-strong {
    background-color: oklch(0.98 0.015 120 / 0.31);
    backdrop-filter: blur(22px) saturate(1.4);
    -webkit-backdrop-filter: blur(22px) saturate(1.4);
    border: 1px solid oklch(0.99 0.012 110 / 0.7);
    box-shadow: 0 10px 32px -8px oklch(0.25 0.05 145 / 0.32), 0 3px 10px -2px
      oklch(0.25 0.05 145 / 0.16), inset 0 1px 0 0 oklch(1 0 0 / 0.5);
  }
.glass-panel-subtle {
    background-color: oklch(0.97 0.02 120 / 0.32);
    backdrop-filter: blur(10px) saturate(1.25);
    -webkit-backdrop-filter: blur(10px) saturate(1.25);
    border: 1px solid oklch(0.99 0.012 110 / 0.4);
    box-shadow: 0 4px 18px -6px oklch(0.25 0.05 145 / 0.18), inset 0 1px 0 0
      oklch(1 0 0 / 0.25);
  }
.dark .glass-panel {
    background-color: oklch(0.21 0.03 145 / 0.5);
    border-color: oklch(0.4 0.04 145 / 0.45);
    box-shadow: 0 8px 28px -8px oklch(0 0 0 / 0.5), 0 2px 8px -2px
      oklch(0 0 0 / 0.32), inset 0 1px 0 0 oklch(0.6 0.04 145 / 0.35);
  }
.dark .glass-panel-strong {
    background-color: oklch(0.24 0.03 145 / 0.29);
    border-color: oklch(0.45 0.04 145 / 0.6);
    box-shadow: 0 10px 32px -8px oklch(0 0 0 / 0.56), 0 3px 10px -2px
      oklch(0 0 0 / 0.36), inset 0 1px 0 0 oklch(0.65 0.04 145 / 0.4);
  }
.dark .glass-panel-subtle {
    background-color: oklch(0.2 0.025 145 / 0.3);
    border-color: oklch(0.35 0.035 145 / 0.35);
    box-shadow: 0 4px 18px -6px oklch(0 0 0 / 0.4), inset 0 1px 0 0
      oklch(0.55 0.04 145 / 0.22);
  }
/* Full-bleed fixed background photo — fills the screen behind all Home content
      and stays put while the page scrolls. NOTE: the Home cover is now rendered
      as a fixed-position full-viewport div with background-image (see Home.tsx
      and .home-cover-fixed below) because `background-attachment: fixed`
      combined with `background-size: cover` re-crops the photo on mobile as the
      layout viewport resizes during scroll. This class is retained for any
      other fixed-cover use but intentionally omits `background-attachment: fixed`
      to avoid the mobile scroll-jump bug. */
.bg-cover-fixed {
    background-size: cover;
    background-position: center;
    background-repeat: no-repeat;
  }
/* ── Home cover — stationary full-viewport fixed background ──────────────
     A single fixed-position full-viewport div whose background-image is the
     resolved Garden Style cover URL. This is a PURE CSS approach that is
     immune to viewport-height changes during scroll:

       - `position: fixed` is relative to the VIEWPORT (not the scroll
         container), so the div NEVER moves while the page scrolls.
       - The div's box is the viewport itself: width: 100vw, height: 100vh
         (upgraded to 100svh via @supports when available). The small-
         viewport-height unit (svh) is intentionally STABLE across mobile
         URL-bar collapse/expand — it does not change when the browser
         toolbar shows/hides — so the div's dimensions never change during
         scroll and the background never re-crops.
       - `background-size: cover` + `background-position: center center` +
         `background-repeat: no-repeat` crop the image consistently to the
         viewport for ANY image dimensions or aspect ratio, so every Garden
         Style image renders identically (no per-image variation).
       - `background-attachment: fixed` is intentionally OMITTED — it is not
         reliable on mobile and would re-crop the photo on scroll. The fixed
         DIV itself provides the stationary behaviour.

     There are NO JavaScript scroll listeners, NO resize observers, NO
     transforms, NO parallax, NO dynamic pixel-rectangle sizing, and NO 120%
     oversize. The dark scrim overlay is rendered as an absolutely-positioned
     child of this div (see Home.tsx) so it sits on top of the background and
     below the foreground content, exactly as before. */
.home-cover-fixed {
    inset: 0;
    width: 100vw;
    height: 100vh;
    background-size: cover;
    background-position: center center;
    background-repeat: no-repeat;
    /* background-attachment: fixed is intentionally omitted — it re-crops
       on mobile scroll. The fixed div itself provides the stationary
       behaviour. */
  }
@supports (height: 100svh) {
    .home-cover-fixed {
      height: 100svh;
    }
  }
/* Soft text scrim so 'Garden Keeper' and headings stay legible over any photo
     region — a tight dark shadow with low blur, not a heavy halo. */
/* ── Botanical foliage — polished garden-illustration placeholder for
      photo-less Area cards. Layered, overlapping leaf shapes (monstera-style
      lobed leaves, slender fern fronds, soft oval leaves) in several natural
      greens over a soft green-to-cream gradient. Reads as a real botanical
      illustration / garden wallpaper — green, alive, with depth — not thin
      line drawings. Vein details add depth without busy noise. Tiling is
      large (480x480) so leaves overlap organically across the card. */
.bg-botanical-leaves {
    background-color: oklch(0.96 0.04 130);
    /* soft dappled light spots — faint warm highlights for life */
    background-image: radial-gradient(
        ellipse 60% 50% at 22% 18%,
        oklch(0.99 0.05 95 / 0.55) 0%,
        oklch(0.99 0.05 95 / 0) 70%
      ),
      radial-gradient(
        ellipse 50% 45% at 78% 82%,
        oklch(0.98 0.06 90 / 0.5) 0%,
        oklch(0.98 0.06 90 / 0) 70%
      ),
      /* the leaf illustration layer — large overlapping leaves in natural greens */
      url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='480' height='480' viewBox='0 0 480 480'><defs><linearGradient id='leafA' x1='0' y1='0' x2='1' y2='1'><stop offset='0' stop-color='oklch(0.62 0.15 145)'/><stop offset='1' stop-color='oklch(0.48 0.13 150)'/></linearGradient><linearGradient id='leafB' x1='0' y1='0' x2='1' y2='1'><stop offset='0' stop-color='oklch(0.7 0.14 140)'/><stop offset='1' stop-color='oklch(0.55 0.14 155)'/></linearGradient><linearGradient id='leafC' x1='0' y1='0' x2='1' y2='1'><stop offset='0' stop-color='oklch(0.78 0.12 135)'/><stop offset='1' stop-color='oklch(0.66 0.13 145)'/></linearGradient><linearGradient id='leafD' x1='0' y1='0' x2='1' y2='1'><stop offset='0' stop-color='oklch(0.58 0.16 155)'/><stop offset='1' stop-color='oklch(0.45 0.12 145)'/></linearGradient></defs><g><path fill='url(%23leafA)' d='M70 410 C 30 360 30 280 90 230 C 130 280 140 360 110 410 C 95 430 80 425 70 410 Z'/><path fill='none' stroke='oklch(0.4 0.1 150)' stroke-width='1.6' stroke-linecap='round' opacity='0.5' d='M70 410 C 90 360 95 300 90 230'/><path fill='none' stroke='oklch(0.4 0.1 150)' stroke-width='1' stroke-linecap='round' opacity='0.35' d='M82 380 C 75 370 65 365 55 366'/><path fill='none' stroke='oklch(0.4 0.1 150)' stroke-width='1' stroke-linecap='round' opacity='0.35' d='M86 350 C 78 340 66 335 54 338'/><path fill='none' stroke='oklch(0.4 0.1 150)' stroke-width='1' stroke-linecap='round' opacity='0.35' d='M90 320 C 82 310 70 305 58 310'/><path fill='none' stroke='oklch(0.4 0.1 150)' stroke-width='1' stroke-linecap='round' opacity='0.35' d='M92 290 C 84 282 74 278 62 284'/></g><g><path fill='url(%23leafB)' d='M410 70 C 450 120 450 200 390 250 C 350 200 340 120 370 70 C 385 50 400 55 410 70 Z'/><path fill='none' stroke='oklch(0.42 0.1 145)' stroke-width='1.6' stroke-linecap='round' opacity='0.5' d='M410 70 C 390 120 385 180 390 250'/><path fill='none' stroke='oklch(0.42 0.1 145)' stroke-width='1' stroke-linecap='round' opacity='0.35' d='M398 100 C 405 90 415 85 425 86'/><path fill='none' stroke='oklch(0.42 0.1 145)' stroke-width='1' stroke-linecap='round' opacity='0.35' d='M394 130 C 402 120 414 115 426 118'/><path fill='none' stroke='oklch(0.42 0.1 145)' stroke-width='1' stroke-linecap='round' opacity='0.35' d='M390 160 C 398 150 410 145 422 150'/><path fill='none' stroke='oklch(0.42 0.1 145)' stroke-width='1' stroke-linecap='round' opacity='0.35' d='M388 190 C 396 180 408 175 420 182'/></g><g><path fill='url(%23leafC)' d='M240 460 C 220 410 220 350 250 310 C 270 350 280 410 268 460 C 260 475 246 475 240 460 Z'/><path fill='none' stroke='oklch(0.5 0.1 140)' stroke-width='1.4' stroke-linecap='round' opacity='0.45' d='M240 460 C 248 410 250 360 250 310'/><path fill='none' stroke='oklch(0.5 0.1 140)' stroke-width='0.9' stroke-linecap='round' opacity='0.3' d='M244 430 C 250 422 258 418 266 420'/><path fill='none' stroke='oklch(0.5 0.1 140)' stroke-width='0.9' stroke-linecap='round' opacity='0.3' d='M246 400 C 252 392 260 388 268 390'/><path fill='none' stroke='oklch(0.5 0.1 140)' stroke-width='0.9' stroke-linecap='round' opacity='0.3' d='M248 370 C 254 362 262 358 270 360'/></g><g><path fill='url(%23leafD)' d='M30 150 C 50 110 90 90 140 100 C 130 140 100 170 60 180 C 40 184 28 170 30 150 Z'/><path fill='none' stroke='oklch(0.38 0.1 150)' stroke-width='1.4' stroke-linecap='round' opacity='0.45' d='M30 150 C 60 135 100 118 140 100'/><path fill='none' stroke='oklch(0.38 0.1 150)' stroke-width='0.9' stroke-linecap='round' opacity='0.3' d='M55 138 C 60 128 70 122 80 122'/><path fill='none' stroke='oklch(0.38 0.1 150)' stroke-width='0.9' stroke-linecap='round' opacity='0.3' d='M80 128 C 86 118 96 112 106 114'/><path fill='none' stroke='oklch(0.38 0.1 150)' stroke-width='0.9' stroke-linecap='round' opacity='0.3' d='M105 118 C 112 108 122 102 132 104'/></g><g><path fill='url(%23leafB)' d='M450 330 C 430 290 390 270 340 280 C 350 320 380 350 420 360 C 440 364 452 350 450 330 Z'/><path fill='none' stroke='oklch(0.42 0.1 145)' stroke-width='1.4' stroke-linecap='round' opacity='0.45' d='M450 330 C 420 315 380 298 340 280'/><path fill='none' stroke='oklch(0.42 0.1 145)' stroke-width='0.9' stroke-linecap='round' opacity='0.3' d='M425 318 C 420 308 410 302 400 302'/><path fill='none' stroke='oklch(0.42 0.1 145)' stroke-width='0.9' stroke-linecap='round' opacity='0.3' d='M400 298 C 394 288 384 282 374 284'/></g><g><path fill='url(%23leafA)' d='M180 200 C 200 175 235 165 270 175 C 262 205 235 225 200 230 C 185 232 175 218 180 200 Z'/><path fill='none' stroke='oklch(0.4 0.1 150)' stroke-width='1.3' stroke-linecap='round' opacity='0.4' d='M180 200 C 205 192 240 184 270 175'/><path fill='none' stroke='oklch(0.4 0.1 150)' stroke-width='0.85' stroke-linecap='round' opacity='0.28' d='M205 192 C 210 184 218 180 226 180'/><path fill='none' stroke='oklch(0.4 0.1 150)' stroke-width='0.85' stroke-linecap='round' opacity='0.28' d='M230 186 C 236 178 244 174 252 174'/></g><g><path fill='url(%23leafC)' d='M320 410 C 305 388 302 360 318 340 C 335 358 342 388 332 410 C 327 420 322 420 320 410 Z'/><path fill='none' stroke='oklch(0.5 0.1 140)' stroke-width='1.2' stroke-linecap='round' opacity='0.4' d='M320 410 C 326 388 328 364 318 340'/></g><g><path fill='url(%23leafD)' d='M150 90 C 168 72 195 68 220 80 C 213 100 188 112 162 112 C 150 112 144 100 150 90 Z'/><path fill='none' stroke='oklch(0.38 0.1 150)' stroke-width='1.2' stroke-linecap='round' opacity='0.4' d='M150 90 C 172 84 198 82 220 80'/></g></svg>");
    background-repeat: repeat;
    background-size: 480px 480px, 480px 480px, 480px 480px;
    background-position: center;
  }
.dark .bg-botanical-leaves {
    background-color: oklch(0.2 0.04 150);
    background-image: radial-gradient(
        ellipse 60% 50% at 22% 18%,
        oklch(0.32 0.05 145 / 0.5) 0%,
        oklch(0.32 0.05 145 / 0) 70%
      ),
      radial-gradient(
        ellipse 50% 45% at 78% 82%,
        oklch(0.3 0.05 150 / 0.45) 0%,
        oklch(0.3 0.05 150 / 0) 70%
      ),
      url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='480' height='480' viewBox='0 0 480 480'><defs><linearGradient id='leafAd' x1='0' y1='0' x2='1' y2='1'><stop offset='0' stop-color='oklch(0.5 0.13 150)'/><stop offset='1' stop-color='oklch(0.38 0.11 155)'/></linearGradient><linearGradient id='leafBd' x1='0' y1='0' x2='1' y2='1'><stop offset='0' stop-color='oklch(0.58 0.13 145)'/><stop offset='1' stop-color='oklch(0.45 0.12 155)'/></linearGradient><linearGradient id='leafCd' x1='0' y1='0' x2='1' y2='1'><stop offset='0' stop-color='oklch(0.66 0.12 140)'/><stop offset='1' stop-color='oklch(0.52 0.12 145)'/></linearGradient><linearGradient id='leafDd' x1='0' y1='0' x2='1' y2='1'><stop offset='0' stop-color='oklch(0.46 0.14 155)'/><stop offset='1' stop-color='oklch(0.34 0.1 145)'/></linearGradient></defs><g><path fill='url(%23leafAd)' d='M70 410 C 30 360 30 280 90 230 C 130 280 140 360 110 410 C 95 430 80 425 70 410 Z'/><path fill='none' stroke='oklch(0.62 0.1 145)' stroke-width='1.6' stroke-linecap='round' opacity='0.55' d='M70 410 C 90 360 95 300 90 230'/><path fill='none' stroke='oklch(0.62 0.1 145)' stroke-width='1' stroke-linecap='round' opacity='0.4' d='M82 380 C 75 370 65 365 55 366'/><path fill='none' stroke='oklch(0.62 0.1 145)' stroke-width='1' stroke-linecap='round' opacity='0.4' d='M86 350 C 78 340 66 335 54 338'/><path fill='none' stroke='oklch(0.62 0.1 145)' stroke-width='1' stroke-linecap='round' opacity='0.4' d='M90 320 C 82 310 70 305 58 310'/><path fill='none' stroke='oklch(0.62 0.1 145)' stroke-width='1' stroke-linecap='round' opacity='0.4' d='M92 290 C 84 282 74 278 62 284'/></g><g><path fill='url(%23leafBd)' d='M410 70 C 450 120 450 200 390 250 C 350 200 340 120 370 70 C 385 50 400 55 410 70 Z'/><path fill='none' stroke='oklch(0.64 0.1 145)' stroke-width='1.6' stroke-linecap='round' opacity='0.55' d='M410 70 C 390 120 385 180 390 250'/><path fill='none' stroke='oklch(0.64 0.1 145)' stroke-width='1' stroke-linecap='round' opacity='0.4' d='M398 100 C 405 90 415 85 425 86'/><path fill='none' stroke='oklch(0.64 0.1 145)' stroke-width='1' stroke-linecap='round' opacity='0.4' d='M394 130 C 402 120 414 115 426 118'/><path fill='none' stroke='oklch(0.64 0.1 145)' stroke-width='1' stroke-linecap='round' opacity='0.4' d='M390 160 C 398 150 410 145 422 150'/><path fill='none' stroke='oklch(0.64 0.1 145)' stroke-width='1' stroke-linecap='round' opacity='0.4' d='M388 190 C 396 180 408 175 420 182'/></g><g><path fill='url(%23leafCd)' d='M240 460 C 220 410 220 350 250 310 C 270 350 280 410 268 460 C 260 475 246 475 240 460 Z'/><path fill='none' stroke='oklch(0.66 0.1 140)' stroke-width='1.4' stroke-linecap='round' opacity='0.5' d='M240 460 C 248 410 250 360 250 310'/><path fill='none' stroke='oklch(0.66 0.1 140)' stroke-width='0.9' stroke-linecap='round' opacity='0.35' d='M244 430 C 250 422 258 418 266 420'/><path fill='none' stroke='oklch(0.66 0.1 140)' stroke-width='0.9' stroke-linecap='round' opacity='0.35' d='M246 400 C 252 392 260 388 268 390'/><path fill='none' stroke='oklch(0.66 0.1 140)' stroke-width='0.9' stroke-linecap='round' opacity='0.35' d='M248 370 C 254 362 262 358 270 360'/></g><g><path fill='url(%23leafDd)' d='M30 150 C 50 110 90 90 140 100 C 130 140 100 170 60 180 C 40 184 28 170 30 150 Z'/><path fill='none' stroke='oklch(0.6 0.1 150)' stroke-width='1.4' stroke-linecap='round' opacity='0.5' d='M30 150 C 60 135 100 118 140 100'/><path fill='none' stroke='oklch(0.6 0.1 150)' stroke-width='0.9' stroke-linecap='round' opacity='0.35' d='M55 138 C 60 128 70 122 80 122'/><path fill='none' stroke='oklch(0.6 0.1 150)' stroke-width='0.9' stroke-linecap='round' opacity='0.35' d='M80 128 C 86 118 96 112 106 114'/><path fill='none' stroke='oklch(0.6 0.1 150)' stroke-width='0.9' stroke-linecap='round' opacity='0.35' d='M105 118 C 112 108 122 102 132 104'/></g><g><path fill='url(%23leafBd)' d='M450 330 C 430 290 390 270 340 280 C 350 320 380 350 420 360 C 440 364 452 350 450 330 Z'/><path fill='none' stroke='oklch(0.64 0.1 145)' stroke-width='1.4' stroke-linecap='round' opacity='0.5' d='M450 330 C 420 315 380 298 340 280'/><path fill='none' stroke='oklch(0.64 0.1 145)' stroke-width='0.9' stroke-linecap='round' opacity='0.35' d='M425 318 C 420 308 410 302 400 302'/><path fill='none' stroke='oklch(0.64 0.1 145)' stroke-width='0.9' stroke-linecap='round' opacity='0.35' d='M400 298 C 394 288 384 282 374 284'/></g><g><path fill='url(%23leafAd)' d='M180 200 C 200 175 235 165 270 175 C 262 205 235 225 200 230 C 185 232 175 218 180 200 Z'/><path fill='none' stroke='oklch(0.62 0.1 145)' stroke-width='1.3' stroke-linecap='round' opacity='0.45' d='M180 200 C 205 192 240 184 270 175'/><path fill='none' stroke='oklch(0.62 0.1 145)' stroke-width='0.85' stroke-linecap='round' opacity='0.32' d='M205 192 C 210 184 218 180 226 180'/><path fill='none' stroke='oklch(0.62 0.1 145)' stroke-width='0.85' stroke-linecap='round' opacity='0.32' d='M230 186 C 236 178 244 174 252 174'/></g><g><path fill='url(%23leafCd)' d='M320 410 C 305 388 302 360 318 340 C 335 358 342 388 332 410 C 327 420 322 420 320 410 Z'/><path fill='none' stroke='oklch(0.66 0.1 140)' stroke-width='1.2' stroke-linecap='round' opacity='0.45' d='M320 410 C 326 388 328 364 318 340'/></g><g><path fill='url(%23leafDd)' d='M150 90 C 168 72 195 68 220 80 C 213 100 188 112 162 112 C 150 112 144 100 150 90 Z'/><path fill='none' stroke='oklch(0.6 0.1 150)' stroke-width='1.2' stroke-linecap='round' opacity='0.45' d='M150 90 C 172 84 198 82 220 80'/></g></svg>");
    background-size: 480px 480px, 480px 480px, 480px 480px;
  }
.text-shadow-soft {
    text-shadow: 0 1px 2px oklch(0.15 0.02 145 / 0.55), 0 2px 8px
      oklch(0.15 0.02 145 / 0.35);
  }
.text-shadow-strong {
    text-shadow: 0 1px 3px oklch(0.12 0.02 145 / 0.7), 0 2px 10px
      oklch(0.12 0.02 145 / 0.5), 0 0 24px oklch(0.12 0.02 145 / 0.3);
  }
/* ── Growth Photo — camera-shaped calendar day cell ──────────────────────────
     A camera silhouette frame drawn around an aspect-square calendar cell so
     the cell itself reads as a camera. Built from a 2px lens-magenta border with
     two pseudo-elements:
       ::before  = the top "viewfinder bar" (the camera's prism housing) — a
                    short centered bar sitting on the top edge, slightly wider
                    than the cell, in the same lens colour.
       ::after   = the lens — a centered ring (transparent fill, 2px lens border)
                    sitting behind the date number + pills, low enough not to
                    clip them. Scales with the cell via % units.
     The cell keeps its own bg-card + content; the frame is purely decorative.
     Apply `.camera-frame` to the day-cell button. Combine with the existing
     aspect-square overflow-visible (the frame needs to overflow slightly on
     the top bar). Inner content stays fully visible. */
.camera-frame {
    position: relative;
    border: 2px solid oklch(var(--event-camera));
    border-radius: 6px;
    overflow: visible;
  }
.camera-frame::before {
    content: "";
    position: absolute;
    top: -5px;
    left: 50%;
    transform: translateX(-50%);
    width: 38%;
    height: 6px;
    background: oklch(var(--event-camera));
    border-radius: 2px 2px 0 0;
    z-index: 2;
    pointer-events: none;
  }
.camera-frame::after {
    content: "";
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -38%);
    width: 46%;
    aspect-ratio: 1 / 1;
    border: 2px solid oklch(var(--event-camera) / 0.55);
    border-radius: 9999px;
    background: transparent;
    z-index: 0;
    pointer-events: none;
  }
/* The day-number + pill grid must sit above the lens ring */
.camera-frame > * {
    position: relative;
    z-index: 1;
  }
/* Soft camera-day tint — a faint lens-magenta wash inside the frame so the
     camera day reads as a unit even before the border registers. */
.camera-frame-tint {
    background-color: oklch(var(--event-camera-soft) / 0.35);
  }
.dark .camera-frame-tint {
    background-color: oklch(var(--event-camera-soft) / 0.5);
  }
/* ── Growth Diary — rotating photo card deck ───────────────────────────────
     Large photo cards in the same Rolodex idiom as the Home task deck. The
     photo fills the card (object-cover), a date label sits in a lens-magenta
     chip at the bottom, and the card lifts with a green-tinted photo shadow. */
.diary-photo-card {
    border-radius: var(--radius);
    overflow: hidden;
    background: oklch(var(--card));
    border: 1px solid oklch(var(--border));
    box-shadow: 0 8px 28px -6px oklch(0.3 0.08 145 / 0.24), 0 4px 12px -2px
      oklch(0.3 0.08 145 / 0.14);
  }
.diary-photo-card .diary-photo {
    width: 100%;
    height: 100%;
    -o-object-fit: cover;
       object-fit: cover;
    -o-object-position: center;
       object-position: center;
  }
.diary-date-chip {
    background: oklch(var(--event-camera) / 0.92);
    color: oklch(var(--event-camera-foreground));
    border-radius: 9999px;
    font-family: var(--font-mono);
    letter-spacing: 0.02em;
  }
.diary-empty-frame {
    border: 2px dashed oklch(var(--event-camera) / 0.45);
    border-radius: var(--radius);
    background: oklch(var(--event-camera-soft) / 0.25);
  }
/* ── Growth Diary — photo-library picker overlay (swipe-to-upload) ───────
     Full-screen modal that opens the device photo picker after a Growth Diary
     swipe. Reuses the existing Growth Diary visual language: very light grey
     (bg-muted) surfaces, BLACK text, the lens-magenta --event-camera accent
     for the picker chrome. No new palette — every colour is an existing token.
     The chosen preview fills the composition frame; the chrome (header bar,
     Choose Photo / Upload / Yes-No buttons) floats above it. */
.camera-overlay {
    position: fixed;
    inset: 0;
    z-index: 60;
    /* NOTE: `isolation: isolate` was removed. The overlay's `position: fixed`
       + `z-index: 60` still establishes its own stacking context, so the
       overlay's backdrop paints below the floating .identify-pill (z-70 in
       the parent Home stacking context) as before. The Cancel/Save
       confirmation bar is now rendered via a React portal to document.body
       (see JobCard.tsx) so it can paint ABOVE the pill (z-80) in the shared
       root stacking context — the prior isolation:isolate trapped the bar
       below the pill regardless of any z-index set inside the overlay. */
    background: oklch(0.15 0.02 145 / 0.92);
    backdrop-filter: blur(2px);
    -webkit-backdrop-filter: blur(2px);
    display: flex;
    flex-direction: column;
    /* Defensive fallback: if the confirmation screen's sizing math ever
       underestimates on an unusual viewport, allow the user to scroll to
       reach the question + Cancel/Save buttons instead of clipping them. */
    overflow-y: auto;
  }
.camera-overlay-bar {
    background: oklch(0.12 0.02 145 / 0.55);
    backdrop-filter: blur(10px) saturate(1.2);
    -webkit-backdrop-filter: blur(10px) saturate(1.2);
    color: oklch(0.99 0.01 145);
  }
/* ── Upload-progress indicator ──────────────────────────────────────────
     Slim determinate bar shown over the JobCard while the chosen photo
     uploads to platform file storage. Track is the very light grey Growth
     Diary surface (bg-muted), fill is the lens-magenta accent with a soft
     moving sheen so the user sees the upload is alive. Inline style sets
     the fill width as a percentage. */
.upload-progress-track {
    width: 100%;
    height: 6px;
    border-radius: 9999px;
    background: oklch(var(--muted));
    overflow: hidden;
  }
.upload-progress-fill {
    height: 100%;
    border-radius: 9999px;
    background: oklch(var(--event-camera));
    background-image: linear-gradient(
      90deg,
      oklch(var(--event-camera)) 0%,
      oklch(var(--event-camera) / 0.78) 50%,
      oklch(var(--event-camera)) 100%
    );
    background-size: 200% 100%;
    animation: progress-shimmer 1.4s linear infinite;
    transition: width 0.25s cubic-bezier(0.4, 0, 0.2, 1);
  }
/* Overlay entrance — fade + slight scale so the picker modal arrives
     gently rather than snapping over the deck. */
.animate-overlay-in {
    animation: overlay-fade-in 0.28s cubic-bezier(0.4, 0, 0.2, 1) both;
  }
/* ── Growth Diary — upload confirmation screen ───────────────────────────
     Shown within the picker overlay after the user selects a photo, asking
     whether to upload it to the Growth Diary. Reuses the same camera-overlay
     visual language: dark scrim, lens-magenta --event-camera accent,
     glassmorphism, animate-overlay-in. No new palette — every colour is an
     existing token. The preview fills the composition frame area; the
     question + Yes/No buttons sit in a frosted bar at the bottom. */
.camera-confirm {
    position: relative;
    z-index: 10;
    display: flex;
    flex-direction: column;
    flex: 1;
    width: 100%;
  }
.camera-confirm-preview {
    /* shrink-to-fit the image instead of growing to fill all available
       vertical space. With flex:1 the preview container consumed every
       remaining pixel and pushed .camera-confirm-bar to the very bottom of
       the overlay — directly on top of the floating Identify Plant pill —
       so the Cancel/Save row was hidden behind / under the pill. Using
       flex:0 1 auto lets the preview take only the space the image needs,
       so the bar naturally lands directly beneath the photo and the empty
       space falls BELOW the bar (between the bar and the pill), giving the
       required vertical order: photo → Cancel/Save row → gap → Identify
       Plant → bottom nav. */
    flex: 0 1 auto;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 3rem 1rem 1rem;
    min-height: 0;
    overflow: hidden;
  }
.camera-confirm-image {
    width: min(86vw, 420px);
    aspect-ratio: 3 / 4;
    -o-object-fit: cover;
       object-fit: cover;
    -o-object-position: center;
       object-position: center;
    border-radius: 14px;
    box-shadow: 0 12px 36px -8px oklch(0 0 0 / 0.6), 0 0 0 3px
      oklch(var(--event-camera) / 0.85);
    /* Cap the image height so it shrinks vertically on short screens instead
       of pushing the Cancel/Save row below the visible area or underneath the
       floating Identify Plant pill. The row now sits directly beneath the
       photo (no bottom reservation), so the subtracted constant reserves
       room for:
         - the overlay header / top padding (~3rem)
         - the confirm bar (48px buttons + small padding + gap ~5.25rem)
         - a clear gap between the row and the floating Identify Plant pill
           (the pill's normal top edge is ~6rem + 52px ≈ 9.25rem from the
           viewport bottom)
         - the device's bottom safe-area inset
       The width-based aspect-ratio still governs on tall screens, so the
       photo stays large and clearly visible there. The 23rem constant keeps
       the row comfortably above the pill zone with visible separation on
       short mobile viewports — the larger reservation (vs the previous 20rem)
       guarantees the Cancel/Save row lands well above the pill's ~9.25rem
       top edge with zero overlap. */
    max-height: calc(100dvh - 23rem - env(safe-area-inset-bottom));
  }
.camera-confirm-bar {
    /* The bar is rendered via a React portal to document.body (see
       JobCard.tsx) so it can paint ABOVE the floating .identify-pill (z-70)
       in the shared root stacking context. `position: fixed` + z-index: 80
       lifts it above the pill; the inline `bottom` style (set by the
       measurement effect in JobCard) places it directly beneath the photo
       preview with a visible gap above (photo→bar) and below (bar→pill).
       The bar is horizontally centered with a max-width actions row. */
    position: fixed;
    left: 0;
    right: 0;
    z-index: 80;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.85rem;
    /* Symmetric padding — the bar is no longer glued to the screen bottom
       (the prior large bottom reservation caused the row to overlap the
       pill). The inline `bottom` style controls vertical placement so the
       row lands in the empty space between the photo and the pill. */
    padding: 0.9rem 1.5rem 1rem;
    background: oklch(0.12 0.02 145 / 0.55);
    backdrop-filter: blur(10px) saturate(1.2);
    -webkit-backdrop-filter: blur(10px) saturate(1.2);
    /* Never let the bar shrink — the buttons must keep their full height so
       they stay fully visible and accessible. */
    flex-shrink: 0;
  }
.camera-confirm-title {
    color: oklch(0.99 0.01 145);
    font-family: var(--font-display);
    font-size: 1.05rem;
    font-weight: 600;
    text-align: center;
    letter-spacing: 0.01em;
  }
.camera-confirm-actions {
    display: flex;
    gap: 0.85rem;
    width: 100%;
    max-width: 320px;
  }
.camera-confirm-btn {
    flex: 1;
    height: 48px;
    border-radius: 9999px;
    font-family: var(--font-body);
    font-size: 0.95rem;
    font-weight: 600;
    letter-spacing: 0.02em;
    cursor: pointer;
    transition: transform 0.12s cubic-bezier(0.4, 0, 0.2, 1), background 0.2s
      ease, box-shadow 0.2s ease;
  }
.camera-confirm-btn:active {
    transform: scale(0.96);
  }
.camera-confirm-btn-primary {
    background: oklch(var(--event-camera));
    color: oklch(var(--event-camera-foreground));
    border: none;
    box-shadow: 0 6px 20px -4px oklch(var(--event-camera) / 0.55);
  }
.camera-confirm-btn-primary:hover {
    box-shadow: 0 8px 24px -4px oklch(var(--event-camera) / 0.7);
  }
.camera-confirm-btn-secondary {
    background: oklch(0.99 0.01 145 / 0.12);
    color: oklch(0.99 0.01 145);
    border: 1.5px solid oklch(0.99 0.01 145 / 0.35);
  }
.camera-confirm-btn-secondary:hover {
    background: oklch(0.99 0.01 145 / 0.2);
  }
/* ── Identify Plant — raised 3D pill button (Home, bottom-right) ──────────
     A floating pill that reads as physically raised off the Home surface:
     depth shadow underneath, a subtle upper-edge highlight (inset top),
     and a restrained garden-green glow ring. Press feedback depresses then
     springs back via the .identify-press utility (drives the depress-then-
     spring keyframe). Premium and polished — never neon or cartoonish. */
.identify-pill {
    position: fixed;
    z-index: 70;
    /* Anchored to the top-left corner of the Home screen. The initial-scroll
        logic in Home.tsx reads this button via getBoundingClientRect() and
        adapts dynamically, so no scroll code needs to change. Other .identify-pill
        usages (IdentifyPlantOverlay.tsx, JobCard.tsx) override position to
        relative via inline style, so changing the fixed-positioning anchors here
        does not affect them. */
    top: 1rem;
    left: 1rem;
    display: inline-flex;
    align-items: center;
    gap: 0.6rem;
    padding: 0.7rem 1.1rem 0.7rem 0.85rem;
    border-radius: 9999px;
    background: linear-gradient(
      180deg,
      oklch(0.62 0.18 145) 0%,
      oklch(0.52 0.16 145) 100%
    );
    color: oklch(var(--primary-foreground));
    font-family: var(--font-body);
    font-size: 0.95rem;
    font-weight: 600;
    letter-spacing: 0.01em;
    border: 1px solid oklch(0.45 0.14 145 / 0.5);
    box-shadow: var(--pill-raise), var(--pill-highlight), var(--pill-glow-soft);
    transition: transform 0.18s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.22s
      cubic-bezier(0.4, 0, 0.2, 1);
    cursor: pointer;
    will-change: transform, box-shadow;
  }
.identify-pill:hover {
    box-shadow: var(--pill-raise), var(--pill-highlight), var(--pill-glow);
    transform: translateY(-1px);
  }
.identify-pill:active,
  .identify-pill.is-pressed {
    transform: translateY(1px) scale(0.97);
    box-shadow: var(--pill-press), var(--pill-glow-soft);
  }
.dark .identify-pill {
    background: linear-gradient(
      180deg,
      oklch(0.74 0.17 145) 0%,
      oklch(0.66 0.16 145) 100%
    );
    color: oklch(var(--primary-foreground));
    border-color: oklch(0.5 0.1 145 / 0.55);
  }
/* Depress-then-spring keyframe — used on the pill when the identifier flow
     opens so the button visibly pushes in then springs back to rest. */
.identify-press {
    animation: identify-press 0.42s cubic-bezier(0.34, 1.56, 0.64, 1) both;
  }
/* ── Identify Plant — identifier flow overlay ─────────────────────────────
     Full-screen overlay reusing the camera-overlay dark scrim language but
     with garden-green accents for the identification result. The capture
     prompt and analyzing states reuse the existing camera-overlay classes. */
.identify-overlay {
    position: fixed;
    inset: 0;
    z-index: 60;
    background: oklch(0.15 0.02 145 / 0.92);
    backdrop-filter: blur(2px);
    -webkit-backdrop-filter: blur(2px);
    display: flex;
    flex-direction: column;
    animation: overlay-fade-in 0.28s cubic-bezier(0.4, 0, 0.2, 1) both;
  }
/* Identification result card — frosted garden-green glass, distinct from
     the lens-magenta camera-confirm. Plant name is the main focus. */
.identify-result {
    background-color: var(--identify-result-bg);
    backdrop-filter: blur(18px) saturate(1.35);
    -webkit-backdrop-filter: blur(18px) saturate(1.35);
    border: 1px solid var(--identify-result-border);
    box-shadow: var(--identify-result-shadow);
    border-radius: var(--radius);
  }
.identify-result-name {
    font-family: var(--font-display);
    font-weight: 700;
    letter-spacing: -0.01em;
    color: oklch(var(--foreground));
  }
.dark .identify-result-name {
    color: oklch(0.96 0.012 110);
  }
/* Analyzing pulse — a restrained green glow ring that breathes while the
     AI vision service processes the image. Slow and calm, not flashy. */
.identify-analyzing {
    animation: identify-pulse 2.2s ease-in-out infinite;
  }
/* ── Identify Plant — API-key settings surface ───────────────────────────
     A subtle tinted panel distinguishing the settings surface from regular
     cards. Reuses card/border tokens for inputs and chrome. */
.settings-surface {
    background-color: oklch(var(--settings-surface));
    color: oklch(var(--settings-surface-foreground));
  }
/* ── Identify Plant — photo-choice action buttons ─────────────────────────
     Scoped rules for the Take Photo / Upload Photo buttons inside the
     PhotoCaptureStep. The shared container (.identify-plant-actions) controls
     alignment so both buttons share one horizontal centre with a 20px vertical
     gap. The shared button rule (.identify-plant-action-btn) normalises width
     (220px, max 80%), centring, and spacing so the two buttons line up
     perfectly. The --primary modifier ports the green gradient visual from the
     global .identify-pill rule into a scoped rule that applies ONLY here, so
     the Take Photo button keeps its colours/rounded corners/shadow without
     inheriting .identify-pill's asymmetric padding/gap/position/transform. The
     global .identify-pill rule is intentionally left untouched. */
.identify-plant-actions {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 20px;
    width: 100%;
  }
.identify-plant-actions .identify-plant-action-btn {
    width: 220px;
    max-width: 80%;
    margin: 0;
    transform: none;
    position: static;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    padding: 0.75rem 1.25rem;
    border-radius: 9999px;
    font-family: var(--font-body);
    font-size: 0.95rem;
    font-weight: 600;
    cursor: pointer;
    transition: transform 0.18s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.22s
      cubic-bezier(0.4, 0, 0.2, 1);
  }
.identify-plant-actions .identify-plant-action-btn--primary {
    background: linear-gradient(
      180deg,
      oklch(0.62 0.18 145) 0%,
      oklch(0.52 0.16 145) 100%
    );
    color: oklch(var(--primary-foreground));
    border: 1px solid oklch(0.45 0.14 145 / 0.5);
    box-shadow: var(--pill-raise), var(--pill-highlight), var(--pill-glow-soft);
  }
.identify-plant-actions .identify-plant-action-btn--primary:hover {
    box-shadow: var(--pill-raise), var(--pill-highlight), var(--pill-glow);
    transform: translateY(-1px);
  }
.identify-plant-actions .identify-plant-action-btn--primary:active {
    transform: translateY(1px) scale(0.97);
    box-shadow: var(--pill-press), var(--pill-glow-soft);
  }
.dark .identify-plant-actions .identify-plant-action-btn--primary {
    background: linear-gradient(
      180deg,
      oklch(0.74 0.17 145) 0%,
      oklch(0.66 0.16 145) 100%
    );
    color: oklch(var(--primary-foreground));
    border-color: oklch(0.5 0.1 145 / 0.55);
  }
/* ── Happy Snaps — honey-amber memory-book / open scrapbook ──────────────
     A warm, personal garden scrapbook section appended BELOW the task-card
     deck on Home. Visually DISTINCT from Growth Diary's leather-journal +
     lens-magenta language: cream paper pages, honey-amber accent, photos
     taped/tucked into the pages with washi-tape corners and slight rotations
     — never rectangular app cards. The preview shows exactly the three most
     recent snaps; missing slots render as dashed honey placeholders that
     still read as tucked-photo spaces. Reuses existing fonts (Bricolage
     Grotesque title, Figtree tagline, Caveat handwritten captions) — no new
     fonts. All colours are the new --honey / --memory-* tokens above. */
/* Section shell — warm cream-tinted band so the scrapbook sits in its own
     warm zone, visually separated from the cooler task deck above. */
.snaps-section {
    background: linear-gradient(
      180deg,
      oklch(var(--memory-page) / 0.6) 0%,
      oklch(var(--memory-page) / 0.85) 100%
    );
    border-top: 1px solid oklch(var(--memory-page-border) / 0.5);
    border-bottom: 1px solid oklch(var(--memory-page-border) / 0.5);
  }
/* Title — Sacramento script, honey-amber, centered above the diary. The
     heading is the most playful and prominent text in the section: a flowing
     script font that reads as a hand-lettered scrapbook title while staying
     highly legible at heading size. Sunflowers flank the text via inline
     .snaps-sunflower spans (see below) inside a flex row, so the whole title
     reads as "🌻 Happy Snaps 🌻". The honey underline bar is preserved but
     centered under the text (left:50% + translateX(-50%)) to match the new
     centered layout. */
.snaps-title {
    font-family: var(--font-script);
    font-weight: 400;
    letter-spacing: 0.005em;
    color: oklch(var(--honey));
    position: relative;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.35em;
    text-align: center;
    line-height: 1.05;
    text-shadow: 0 1px 2px oklch(0.4 0.06 78 / 0.18);
  }
.snaps-title::after {
    content: "";
    position: absolute;
    left: 50%;
    bottom: -0.35rem;
    width: 42%;
    height: 4px;
    border-radius: 9999px;
    transform: translateX(-50%);
    background: linear-gradient(
      90deg,
      oklch(var(--honey)) 0%,
      oklch(var(--honey) / 0.35) 100%
    );
  }
/* Sunflower — a decorative glyph flanking the Happy Snaps title. Sized to
     the heading (0.85em) so it scales with the title on both pages, given a
     gentle opposing tilt on each side so the pair feels hand-arranged and
     alive, and a soft honey drop-shadow so it sits naturally in the garden
     palette rather than reading as a pasted emoji. A slow sway keyframe gives
     it life; the left flower sways one way and the right the other so the
     motion stays balanced and symmetric. Honors prefers-reduced-motion. */
.snaps-sunflower {
    display: inline-block;
    font-size: 0.85em;
    line-height: 1;
    filter: drop-shadow(0 1px 2px oklch(0.4 0.06 78 / 0.35));
    transform-origin: 50% 80%;
    animation: snaps-sunflower-sway 4.5s ease-in-out infinite;
    -webkit-user-select: none;
       -moz-user-select: none;
            user-select: none;
  }
.snaps-sunflower--left {
    transform: rotate(-12deg);
    animation-name: snaps-sunflower-sway-left;
  }
.snaps-sunflower--right {
    transform: rotate(12deg);
    animation-name: snaps-sunflower-sway-right;
  }
@keyframes snaps-sunflower-sway-left {
    0%,
    100% {
      transform: rotate(-12deg);
    }
    50% {
      transform: rotate(-4deg);
    }
  }
@keyframes snaps-sunflower-sway-right {
    0%,
    100% {
      transform: rotate(12deg);
    }
    50% {
      transform: rotate(4deg);
    }
  }
@keyframes snaps-sunflower-sway {
    0%,
    100% {
      transform: rotate(-8deg);
    }
    50% {
      transform: rotate(8deg);
    }
  }
@media (prefers-reduced-motion: reduce) {
    .snaps-sunflower,
    .snaps-sunflower--left,
    .snaps-sunflower--right {
      animation: none;
    }
  }
/* Tagline — Caveat handwritten, warm muted garden ink, centered beneath
     the diary. Softer and more casual than the Sacramento script heading so
     the two complement without competing: the heading carries the playful
     prominence, the tagline carries the warm, inviting whisper. The
     handwritten font is already expressive, so no italic. Slightly larger
     line-height keeps the script comfortable to read. */
.snaps-tagline {
    font-family: var(--font-handwritten);
    color: oklch(var(--memory-page-foreground) / 0.82);
    text-align: center;
    line-height: 1.3;
  }
/* The open scrapbook — a two-page spread with a centre crease. The spread
     is the tappable preview that opens the full gallery. */
.scrapbook {
    position: relative;
    border-radius: 14px;
    background: oklch(var(--memory-page));
    border: 1px solid oklch(var(--memory-page-border));
    box-shadow: var(--memory-shadow);
    overflow: hidden;
    cursor: pointer;
    transition: transform 0.22s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.26s
      cubic-bezier(0.4, 0, 0.2, 1);
  }
.scrapbook:hover {
    transform: translateY(-2px);
    box-shadow: var(--memory-shadow-lift);
  }
.scrapbook:active {
    transform: translateY(0) scale(0.995);
  }
/* Two-page spread — left + right page with a centre crease shadow. On
     narrow phones the spread stays a single page (crease hidden via the
     component's responsive layout); the crease only paints when both pages
     are side by side. */
.scrapbook-spread {
    position: relative;
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 0;
  }
.scrapbook-spread::before {
    /* centre crease — soft inner shadow where the two pages meet */
    content: "";
    position: absolute;
    top: 0;
    bottom: 0;
    left: 50%;
    width: 2px;
    transform: translateX(-50%);
    background: oklch(var(--memory-page-border) / 0.7);
    box-shadow: var(--memory-crease);
    pointer-events: none;
    z-index: 1;
  }
@media (max-width: 380px) {
    /* single-page fallback on very narrow phones — hide the crease */
    .scrapbook-spread {
      grid-template-columns: 1fr;
    }
    .scrapbook-spread::before {
      display: none;
    }
  }
/* A single page of the spread — faint paper grain via a soft warm radial
     so the page reads as paper, not a flat colour block. */
.scrapbook-page {
    position: relative;
    padding: 1.1rem 1rem 1.4rem;
    min-height: 180px;
    background-image: radial-gradient(
      ellipse 70% 60% at 30% 20%,
      oklch(0.99 0.02 90 / 0.5) 0%,
      oklch(0.99 0.02 90 / 0) 75%
    );
  }
/* A taped/tucked photo — the core scrapbook element. Slight rotation,
     warm page shadow, rounded corners, and a translucent washi-tape strip
     across one corner. The photo fills the frame (object-cover). */
.snap-photo {
    position: relative;
    border-radius: 6px;
    overflow: visible;
    background: oklch(0.99 0.012 110);
    padding: 4px;
    box-shadow: var(--memory-shadow);
    transition: transform 0.2s cubic-bezier(0.34, 1.56, 0.64, 1), box-shadow
      0.24s ease;
  }
.snap-photo img {
    display: block;
    width: 100%;
    height: 100%;
    -o-object-fit: cover;
       object-fit: cover;
    -o-object-position: center;
       object-position: center;
    border-radius: 3px;
  }
/* Taped variant — washi-tape strip across the top corner + slight tilt. */
.snap-photo-taped {
    transform: rotate(-2.2deg);
  }
.snap-photo-taped::before {
    /* washi tape — translucent honey strip, slightly rotated, overlapping
       the top-left corner of the photo as if pressed on by hand. */
    content: "";
    position: absolute;
    top: -8px;
    left: 10px;
    width: 46px;
    height: 18px;
    background: oklch(var(--memory-tape) / 0.78);
    border: 1px solid oklch(var(--memory-tape) / 0.4);
    transform: rotate(-8deg);
    box-shadow: 0 1px 3px -1px oklch(0.4 0.06 78 / 0.3);
    z-index: 2;
    pointer-events: none;
    /* torn-tape edge — subtle jagged ends via a faint inner gradient */
    background-image: linear-gradient(
      90deg,
      oklch(var(--memory-tape) / 0.6) 0%,
      oklch(var(--memory-tape) / 0.9) 50%,
      oklch(var(--memory-tape) / 0.6) 100%
    );
  }
.snap-photo-taped:hover {
    transform: rotate(-2.2deg) translateY(-3px) scale(1.02);
    box-shadow: var(--memory-shadow-lift);
  }
/* Tucked variant — photo slid under the page edge (bottom corner tucked),
     opposite rotation so the two pages feel hand-arranged, not mirrored. */
.snap-photo-tucked {
    transform: rotate(1.8deg);
  }
.snap-photo-tucked::after {
    /* tucked corner — a small page-fold triangle in the bottom-right that
       overlaps the photo's corner, reading as the page tucking it in. */
    content: "";
    position: absolute;
    bottom: -2px;
    right: -2px;
    width: 22px;
    height: 22px;
    background: oklch(var(--memory-page));
    border-left: 1px solid oklch(var(--memory-page-border) / 0.6);
    border-top: 1px solid oklch(var(--memory-page-border) / 0.6);
    transform: rotate(-3deg) skewX(8deg);
    box-shadow: -2px -2px 4px -2px oklch(0.4 0.06 78 / 0.25);
    z-index: 2;
    pointer-events: none;
  }
.snap-photo-tucked:hover {
    transform: rotate(1.8deg) translateY(-3px) scale(1.02);
    box-shadow: var(--memory-shadow-lift);
  }
/* Empty / placeholder slot — a dashed honey outline shaped like a tucked
     photo, so a missing snap reads as "a space waiting for a memory", not a
     broken card. Keeps the scrapbook aesthetic when < 3 photos exist. */
.snap-empty-slot {
    position: relative;
    border: 2px dashed oklch(var(--honey) / 0.5);
    border-radius: 6px;
    background: oklch(var(--honey-soft) / 0.22);
    display: flex;
    align-items: center;
    justify-content: center;
    color: oklch(var(--honey) / 0.7);
    font-family: var(--font-handwritten);
    font-size: 1.05rem;
    transform: rotate(-1.5deg);
  }
.snap-empty-slot::before {
    /* a faint washi-tape strip on the empty slot too, so it matches the
       taped-photo language even when empty. */
    content: "";
    position: absolute;
    top: -8px;
    left: 10px;
    width: 38px;
    height: 16px;
    background: oklch(var(--memory-tape) / 0.5);
    transform: rotate(-7deg);
    z-index: 2;
    pointer-events: none;
  }
/* Handwritten caption — Caveat, honey-amber, sits beneath a photo as if
     jotted in the margin of the scrapbook page. */
.snap-caption {
    font-family: var(--font-handwritten);
    color: oklch(var(--honey));
    line-height: 1.2;
    text-align: center;
  }
/* "Open Happy Snaps" pill — honey-amber, sits below the spread. Distinct
     from the green .identify-pill and the lens-magenta camera buttons. */
.snaps-open-btn {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.6rem 1.2rem;
    border-radius: 9999px;
    background: linear-gradient(
      180deg,
      oklch(0.8 0.15 78) 0%,
      oklch(0.72 0.15 78) 100%
    );
    color: oklch(var(--honey-foreground));
    font-family: var(--font-body);
    font-size: 0.95rem;
    font-weight: 600;
    border: 1px solid oklch(0.6 0.12 78 / 0.5);
    box-shadow: 0 6px 18px -4px oklch(var(--honey) / 0.45), inset 0 1px 0 0
      oklch(1 0 0 / 0.4);
    cursor: pointer;
    transition: transform 0.18s cubic-bezier(0.34, 1.56, 0.64, 1), box-shadow
      0.22s ease;
  }
.snaps-open-btn:hover {
    transform: translateY(-1px);
    box-shadow: 0 8px 22px -4px oklch(var(--honey) / 0.6), inset 0 1px 0 0
      oklch(1 0 0 / 0.5);
  }
.snaps-open-btn:active {
    transform: translateY(1px) scale(0.97);
  }
.dark .snaps-open-btn {
    background: linear-gradient(
      180deg,
      oklch(0.82 0.14 78) 0%,
      oklch(0.74 0.14 78) 100%
    );
    color: oklch(var(--honey-foreground));
    border-color: oklch(0.5 0.1 78 / 0.55);
  }
/* "Show More" control — appears below the smaller scrapbook grid ONLY when
     additional Happy Snaps exist beyond the initial four. A honey-amber
     handwritten-style affordance that continues the scrapbook language: a
     soft honey-tinted pill with a gentle lift on hover, never a flat app
     button. Tapping it reveals the remaining small photos underneath in the
     existing taped/tucked styling. Distinct from the green .identify-pill
     and the lens-magenta camera buttons. */
.snaps-show-more {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.4rem;
    margin: 0.25rem auto 0;
    padding: 0.55rem 1.15rem;
    border-radius: 9999px;
    background: oklch(var(--honey-soft) / 0.55);
    border: 1px solid oklch(var(--honey) / 0.45);
    color: oklch(var(--honey));
    font-family: var(--font-handwritten);
    font-size: 1.15rem;
    line-height: 1;
    cursor: pointer;
    transition: transform 0.18s cubic-bezier(0.34, 1.56, 0.64, 1), box-shadow
      0.22s ease, background 0.2s ease;
    box-shadow: 0 2px 8px -3px oklch(0.4 0.06 78 / 0.25);
  }
.snaps-show-more:hover {
    transform: translateY(-1px);
    background: oklch(var(--honey-soft) / 0.75);
    box-shadow: 0 4px 12px -3px oklch(0.4 0.06 78 / 0.35);
  }
.snaps-show-more:active {
    transform: translateY(0) scale(0.98);
  }
.snaps-show-more:focus-visible {
    outline: none;
    box-shadow: 0 0 0 2px oklch(var(--honey-ring)), 0 4px 12px -3px
      oklch(0.4 0.06 78 / 0.35);
  }
.dark .snaps-show-more {
    background: oklch(var(--honey-soft) / 0.4);
    border-color: oklch(var(--honey) / 0.5);
    color: oklch(var(--honey));
    box-shadow: 0 2px 8px -3px oklch(0 0 0 / 0.4);
  }
.dark .snaps-show-more:hover {
    background: oklch(var(--honey-soft) / 0.6);
    box-shadow: 0 4px 12px -3px oklch(0 0 0 / 0.5);
  }
/* ── Happy Snaps — swipeable featured photo (full gallery) ──────────────
      The large featured photo at the top of the /happy-snaps gallery. It is
      swipeable left/right to cycle through every Happy Snap, and on each
      swipe the previously-featured photo moves back into the smaller
      scrapbook grid below while a different photo moves up into the featured
      slot — so the page reads as photos being rearranged on the scrapbook,
      not as a conventional carousel overlay.

      The featured photo keeps the existing taped-scrapbook language
      (.snap-photo .snap-photo-taped) so it never breaks the physical
      memory-book feel. The only additions are:
        .snap-featured       — the larger featured frame + its drag surface
        .snap-rearrange      — the subtle position-swap animation fired on
                               each cycle for both the featured photo and the
                               smaller photo it swapped places with
        .snap-date-overlay   — the handwritten date inscription over the
                               featured photo's bottom-right corner
        .snap-date-glow      — the soft white shadow/glow behind the date
                               text so it stays readable over any photo
        @keyframes snap-settle — the entrance animation referenced by
                               .snap-settle (was previously missing)
        @keyframes snap-rearrange — the position-swap animation */
/* The featured photo frame — larger than the grid photos, taped, centred
     above the grid. Reuses .snap-photo .snap-photo-taped for the washi-tape
     corner + rotation so it stays in the scrapbook language. The extra
     padding + max-width give it the "lead photo" presence the gallery opens
     with. The drag surface is the motion.div wrapping this in the component;
     this class only owns the visual frame. */
.snap-featured {
    position: relative;
    width: 100%;
    max-width: 30rem;
    margin-left: auto;
    margin-right: auto;
  }
/* ── Happy Snaps — green navigation arrows on the featured photo ─────────
     At rest these show ONLY the small green arrow icon with its green border
     ring — no white bubble, no movement. They sit on the left and right edges
     of the featured photo, vertically centred. They are clickable buttons
     (pointer-events enabled) that cycle the photo in their direction; a tap
     also briefly flashes a white circular bubble behind the pressed arrow as
     feedback. The same white flash fires behind the matching arrow on a
     swipe in that direction (left swipe flashes the left arrow, right swipe
     flashes the right arrow). Green = the garden --primary / --event-plant
     tokens (oklch hue 145) so the arrows read as part of the garden
     language, not the honey-amber scrapbook accent. Honors
     prefers-reduced-motion (no flash animation when reduced motion is on). */
.snap-swipe-arrow {
    position: absolute;
    top: 50%;
    z-index: 4;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 2rem;
    height: 2rem;
    padding: 0;
    border-radius: 9999px;
    color: oklch(var(--primary));
    background: transparent;
    border: 1.5px solid oklch(var(--primary) / 0.55);
    box-shadow: 0 2px 8px -2px oklch(0.3 0.1 145 / 0.25);
    transform: translateY(-50%);
    cursor: pointer;
    transition: background 0.18s ease-out, box-shadow 0.18s ease-out;
  }
.snap-swipe-arrow:focus-visible {
    outline: none;
    box-shadow: 0 0 0 2px oklch(var(--honey-ring)), 0 2px 8px -2px
      oklch(0.3 0.1 145 / 0.25);
  }
.snap-swipe-arrow--left {
    left: 0.5rem;
  }
.snap-swipe-arrow--right {
    right: 0.5rem;
  }
/* Brief white-bubble flash behind the arrow that matches the navigation
     direction. Toggled on by the TSX (`.snap-swipe-arrow--flash`) for ~450ms
     on a swipe or a tap. Quick and satisfying, runs once. */
.snap-swipe-arrow--flash {
    animation: snap-arrow-flash 0.45s ease-out;
  }
@keyframes snap-arrow-flash {
    0% {
      background: transparent;
      box-shadow: 0 0 0 0 oklch(0.99 0.01 110 / 0);
    }
    30% {
      background: oklch(0.99 0.01 110 / 0.78);
      box-shadow: 0 2px 8px -2px oklch(0.3 0.1 145 / 0.35), 0 0 0 3px
        oklch(0.99 0.01 110 / 0.4);
    }
    100% {
      background: transparent;
      box-shadow: 0 0 0 0 oklch(0.99 0.01 110 / 0);
    }
  }
@media (min-width: 640px) {
    .snap-swipe-arrow {
      width: 2.25rem;
      height: 2.25rem;
    }
  }
@media (prefers-reduced-motion: reduce) {
    .snap-swipe-arrow--left,
    .snap-swipe-arrow--right,
    .snap-swipe-arrow--flash {
      animation: none;
    }
  }
.dark .snap-swipe-arrow {
    color: oklch(var(--primary));
    background: transparent;
    border-color: oklch(var(--primary) / 0.6);
    box-shadow: 0 2px 8px -2px oklch(0 0 0 / 0.45);
  }
.dark .snap-swipe-arrow--flash {
    animation-name: snap-arrow-flash-dark;
  }
@keyframes snap-arrow-flash-dark {
    0% {
      background: transparent;
      box-shadow: 0 0 0 0 oklch(0.99 0.01 110 / 0);
    }
    30% {
      background: oklch(0.92 0.02 145 / 0.55);
      box-shadow: 0 2px 8px -2px oklch(0 0 0 / 0.5), 0 0 0 3px
        oklch(0.92 0.02 145 / 0.35);
    }
    100% {
      background: transparent;
      box-shadow: 0 0 0 0 oklch(0.99 0.01 110 / 0);
    }
  }
/* Position-swap animation — fired on the featured photo AND the smaller
     grid photo it swapped places with each cycle. A quick, subtle tilt +
     fade + tiny scale so the two photos read as being picked up and set
     down in their new positions on the page, not as a crossfade or a slide.
     Honors prefers-reduced-motion (the component also gates the animation
     via the `animate` prop, but this ensures the keyframe itself is inert
     when the user has reduced motion on). */
.snap-rearrange {
    animation: snap-rearrange 0.42s cubic-bezier(0.34, 1.4, 0.64, 1) both;
  }
@keyframes snap-rearrange {
    0% {
      opacity: 0.35;
      transform: var(--snap-rotate, rotate(-2.2deg)) scale(0.97);
    }
    60% {
      opacity: 1;
      transform: var(--snap-rotate, rotate(-2.2deg)) scale(1.015);
    }
    100% {
      opacity: 1;
      transform: var(--snap-rotate, rotate(-2.2deg)) scale(1);
    }
  }
@media (prefers-reduced-motion: reduce) {
    .snap-rearrange {
      animation: none;
    }
  }
/* Date overlay — the handwritten date inscription over the featured photo.
     Sits toward the bottom-right corner, in the Caveat handwritten font at a
     clearly readable size (never tiny or thin), black text with a soft white
     shadow/glow so it stays legible over both light and dark photographs.
     The pointer-events:none lets drag/swipe gestures pass through to the
     motion.div drag surface beneath. */
.snap-date-overlay {
    position: absolute;
    right: 0.75rem;
    bottom: 0.75rem;
    z-index: 4;
    pointer-events: none;
    font-family: var(--font-handwritten);
    font-size: 1.6rem;
    line-height: 1.1;
    font-weight: 600;
    color: oklch(0.16 0.01 80);
    text-align: right;
    max-width: 70%;
    /* Soft white shadow/glow behind the black lettering — a tight white
       halo with low blur plus a wider fainter white bloom so the date
       reads clearly over light AND dark photos without a heavy panel. */
    text-shadow:
      0 0 4px oklch(0.99 0.01 90 / 0.92),
      0 0 10px oklch(0.99 0.01 90 / 0.7),
      0 1px 2px oklch(0.99 0.01 90 / 0.95),
      -1px 0 2px oklch(0.99 0.01 90 / 0.85),
      1px 0 2px oklch(0.99 0.01 90 / 0.85);
  }
@media (min-width: 640px) {
    .snap-date-overlay {
      font-size: 1.85rem;
    }
  }
/* Entrance — photos settle into the page with a gentle tilt + fade, as if
     being placed by hand. Staggered by the component via inline delay.
     NOTE: the @keyframes snap-settle definition lives just below so the
     animation referenced here actually resolves. */
.snap-settle {
    animation: snap-settle 0.5s cubic-bezier(0.34, 1.4, 0.64, 1) both;
  }
/* The settle keyframe — a gentle tilt-from-slight-rotation + fade-in, as
     if the photo is being placed onto the page by hand. Was previously
     referenced by .snap-settle but not defined; defined here so the
     entrance animation resolves. The starting rotation is a small tilt that
     relaxes back to the photo's resting transform (set inline by the
     component via the --snap-rotate custom property, defaulting to a 0deg
     settle so the keyframe is safe for any photo). */
@keyframes snap-settle {
    0% {
      opacity: 0;
      transform: var(--snap-rotate, rotate(0deg)) scale(0.96) rotate(-3deg);
    }
    60% {
      opacity: 1;
      transform: var(--snap-rotate, rotate(0deg)) scale(1.01);
    }
    100% {
      opacity: 1;
      transform: var(--snap-rotate, rotate(0deg)) scale(1);
    }
  }
@media (prefers-reduced-motion: reduce) {
    .snap-settle {
      animation: none;
    }
  }
/* ── Happy Snaps — control row (month/year selector + add FAB) ───────────
     The row that sits between the header and the gallery, holding the
     month/year selector on the left and the floating gold add button on the
     right. Replaces the old large labelled "Add a Happy Snap" button. The two
     controls get plenty of horizontal space so the row never feels cluttered.
     All colours reuse the existing --honey / --memory-* / --primary tokens;
     no new tokens. All glow/animation is disabled under
     prefers-reduced-motion. */
/* The control row — a flex row with space between the two controls and
     generous horizontal padding/gap so the selector and the add FAB each have
     room to breathe. Centred to the gallery's max width. */
.snaps-control-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1.25rem;
    width: 100%;
    padding: 0.25rem 0.5rem;
  }
/* Month/year selector trigger — a small scrapbook-paper chip with a
     hand-drawn border, the Caveat handwritten font, a slight counter-clockwise
     tilt (~-1deg) so it reads as a hand-pasted label, and a green downward
     chevron (--primary / --event-plant) so it is obviously tappable. The
     green chevron signals "this opens something" in the same garden language
     as the featured-photo arrows. */
.snaps-month-year {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0.4rem 0.85rem;
    font-family: var(--font-handwritten);
    font-size: 1.35rem;
    font-weight: 600;
    line-height: 1.1;
    color: oklch(var(--memory-page-foreground));
    background: oklch(var(--memory-page));
    border: 1.5px solid oklch(var(--memory-page-border));
    border-radius: 8px;
    /* hand-drawn border — a slightly irregular double ring via a faint inner
       box-shadow so the edge reads as sketched rather than machine-ruled. */
    box-shadow: inset 0 0 0 1px oklch(var(--memory-page-border) / 0.35),
      var(--memory-shadow);
    transform: rotate(-1deg);
    cursor: pointer;
    transition: transform 0.18s ease-out, box-shadow 0.18s ease-out, background
      0.18s ease-out;
  }
.snaps-month-year:hover {
    transform: rotate(-1deg) translateY(-1px);
    box-shadow: inset 0 0 0 1px oklch(var(--memory-page-border) / 0.5),
      var(--memory-shadow-lift);
  }
.snaps-month-year:focus-visible {
    outline: none;
    box-shadow: inset 0 0 0 1px oklch(var(--memory-page-border) / 0.5), 0 0 0
      2px oklch(var(--honey-ring)), var(--memory-shadow);
  }
/* The green downward chevron — garden --primary token so it matches the
     featured-photo arrows and reads as "tappable, opens a menu". */
.snaps-month-year__chevron {
    width: 1.1rem;
    height: 1.1rem;
    color: oklch(var(--primary));
    flex-shrink: 0;
    transition: transform 0.18s ease-out;
  }
/* The popover panel — two plain <select> elements (month + year) in the
     scrapbook language. NOT a calendar. Anchored under the trigger, scrapbook
     paper background, hand-drawn border, soft page shadow. The selects
     themselves are styled to match (Caveat label, Figtree option text so the
     dropdown stays legible). */
.snaps-month-year__popover {
    position: absolute;
    top: calc(100% + 0.5rem);
    left: 0;
    z-index: 30;
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
    min-width: 11rem;
    padding: 0.75rem 0.85rem;
    background: oklch(var(--memory-page));
    border: 1.5px solid oklch(var(--memory-page-border));
    border-radius: 10px;
    box-shadow: var(--memory-shadow-lift);
    transform: rotate(-0.5deg);
  }
.snaps-month-year__field {
    display: flex;
    flex-direction: column;
    gap: 0.2rem;
  }
.snaps-month-year__label {
    font-family: var(--font-handwritten);
    font-size: 1.05rem;
    font-weight: 600;
    color: oklch(var(--memory-page-foreground) / 0.8);
    line-height: 1;
  }
.snaps-month-year__select {
    -moz-appearance: none;
         appearance: none;
    -webkit-appearance: none;
    width: 100%;
    padding: 0.35rem 0.6rem;
    font-family: var(--font-body);
    font-size: 0.95rem;
    color: oklch(var(--memory-page-foreground));
    background: oklch(var(--memory-page) / 0.6);
    border: 1.25px solid oklch(var(--memory-page-border));
    border-radius: 6px;
    cursor: pointer;
    transition: border-color 0.18s ease-out, box-shadow 0.18s ease-out;
  }
.snaps-month-year__select:hover {
    border-color: oklch(var(--honey) / 0.6);
  }
.snaps-month-year__select:focus-visible {
    outline: none;
    border-color: oklch(var(--honey));
    box-shadow: 0 0 0 2px oklch(var(--honey-ring));
  }
/* Floating gold add button — overrides PhotoUploader's iconOnly white
     styling to the honey-amber floating scrapbook appearance. The
     PhotoUploader renders a shadcn <Button size="icon"> with the lucide
     ImagePlus icon; we hide that icon via [&_svg]:hidden and inject a
     hand-drawn plus via a ::after pseudo-element so the FAB reads as a
     honey-amber "add" affordance in the scrapbook language, not a generic
     white circular button. Honey background, honey-foreground text/icon,
     honey-ring focus ring, a honey-coloured glow box-shadow, and the soft
     --memory-shadow / --memory-shadow-lift page shadow. Rounded-full,
     ~48px. The glow + hover lift are disabled under prefers-reduced-motion. */
.snaps-add-fab {
    /* Override the PhotoUploader iconOnly white button styling. The
       PhotoUploader applies its own classes to the inner <Button>; this
       class is on the wrapping <div>, so we target the inner button via
       the descendant selector. */
  }
.snaps-add-fab button {
    width: 3rem;
    height: 3rem;
    border-radius: 9999px;
    color: oklch(var(--honey-foreground));
    background: oklch(var(--honey));
    border: 1.5px solid oklch(var(--honey-ring) / 0.7);
    /* honey glow + soft page shadow so it floats above the scrapbook */
    box-shadow: 0 0 0 3px oklch(var(--honey) / 0.18), 0 0 14px 2px
      oklch(var(--honey) / 0.35), var(--memory-shadow);
    transition: transform 0.18s ease-out, box-shadow 0.18s ease-out;
  }
.snaps-add-fab button:hover {
    transform: translateY(-2px) scale(1.04);
    box-shadow: 0 0 0 4px oklch(var(--honey) / 0.22), 0 0 18px 4px
      oklch(var(--honey) / 0.45), var(--memory-shadow-lift);
  }
.snaps-add-fab button:focus-visible {
    outline: none;
    box-shadow: 0 0 0 3px oklch(var(--honey) / 0.2), 0 0 0 5px
      oklch(var(--honey-ring)), 0 0 18px 4px oklch(var(--honey) / 0.45),
      var(--memory-shadow-lift);
  }
.snaps-add-fab button:active {
    transform: translateY(0) scale(0.97);
  }
/* Hide the default lucide ImagePlus icon — we draw a hand-drawn plus
     instead so the FAB reads as a scrapbook "add" mark, not a generic
     photo-upload glyph. */
.snaps-add-fab button svg {
    display: none;
  }
/* Hand-drawn plus — a CSS-drawn plus via two pseudo-element bars, slightly
     rotated and given a hand-drawn weight so it matches the Caveat
     handwritten language. Centred in the circular button. */
.snaps-add-fab button::before,
  .snaps-add-fab button::after {
    content: "";
    position: absolute;
    top: 50%;
    left: 50%;
    background: oklch(var(--honey-foreground));
    border-radius: 9999px;
    pointer-events: none;
  }
.snaps-add-fab button::before {
    /* horizontal bar */
    width: 1.1rem;
    height: 0.22rem;
    transform: translate(-50%, -50%) rotate(-3deg);
  }
.snaps-add-fab button::after {
    /* vertical bar */
    width: 0.22rem;
    height: 1.1rem;
    transform: translate(-50%, -50%) rotate(-3deg);
  }
/* Dark theme — the honey tokens already adapt, but the glow reads better
     with a slightly stronger ring so the FAB stays visible on the dark
     leafy background. */
.dark .snaps-add-fab button {
    box-shadow: 0 0 0 3px oklch(var(--honey) / 0.22), 0 0 16px 3px
      oklch(var(--honey) / 0.4), var(--memory-shadow);
  }
.dark .snaps-add-fab button:hover {
    box-shadow: 0 0 0 4px oklch(var(--honey) / 0.28), 0 0 20px 5px
      oklch(var(--honey) / 0.5), var(--memory-shadow-lift);
  }
/* Reduced motion — disable the glow pulse, hover lift, and active scale so
      the FAB is a calm static honey circle. The honey background and page
      shadow remain so the affordance is still clear. */
@media (prefers-reduced-motion: reduce) {
    .snaps-month-year,
    .snaps-month-year:hover,
    .snaps-month-year__chevron,
    .snaps-add-fab button,
    .snaps-add-fab button:hover,
    .snaps-add-fab button:active {
      transition: none;
      transform: rotate(-1deg);
    }
    .snaps-add-fab button,
    .snaps-add-fab button:hover {
      transform: none;
    }
    .snaps-month-year:hover {
      transform: rotate(-1deg);
    }
  }
/* ── Happy Snaps — chronological counter ─────────────────────────────────
     A very small, understated black handwritten label that sits directly
     above the month/year selector in the control row. Shows the featured
     photo's chronological position within the selected month (earliest = 1)
     and the total count of snaps in that month, e.g. "1 of 6 of August 2026".
     The text is near-black ink on the scrapbook page, in the Caveat
     handwritten font, slightly tilted to match the hand-pasted label
     language of the month/year selector. No background, no border, no
     shadow — just a quiet ink inscription. Centred to the control row.
     No animation; the value simply updates as the user cycles. */
.snaps-counter {
    margin: 0;
    padding: 0 0.5rem;
    font-family: var(--font-handwritten);
    font-size: 0.95rem;
    font-weight: 600;
    line-height: 1.2;
    /* near-black ink — reads as a handwritten pen mark on the scrapbook page,
       consistent with the date overlay's black text. Uses the memory-page
       foreground token so it adapts to the dark theme legibly. */
    color: oklch(var(--memory-page-foreground));
    text-align: center;
    /* slight hand-pasted tilt to match the month/year selector's -1deg, but a
       touch less so the counter reads as a quieter, secondary inscription. */
    transform: rotate(-0.6deg);
    /* keep the counter on its own line above the control row */
    align-self: center;
  }
/* ── Happy Snaps — full-screen featured-photo viewer ──────────────────────
     A single-photo full-screen viewer opened by a genuine tap on the large
     featured photo's main area (NOT a swipe, NOT an arrow, NOT a small grid
     photo). Shows the currently-featured photo centered, as large as fits the
     viewport (object-fit: contain), on a dark backdrop — with the SAME
     handwritten date overlay (.snap-date-overlay) the featured photo uses, so
     the date reads exactly like "August 7th, 2026" with the same Caveat font,
     black text, and white text-shadow glow.

     Closing: a visible X close control (top-right), Escape key, and clicking
     the backdrop. Closing only unmounts the viewer — featuredIndex and the
     derived month are owned by the parent and are NOT touched, so the same
     photo stays featured and the same month stays selected.

     No prev/next arrows, no swipe, no delete — the viewer is for viewing the
     single featured photo at a larger size only. Built inline in HappySnaps.tsx
     (NOT imported from GrowthDiaryViewer, which has navigation/delete that are
     not wanted here). The overlay structure references GrowthDiaryViewer's
     fixed inset-0 z-50 bg-black/90 backdrop-blur-sm pattern. All animations
     honor prefers-reduced-motion. */
/* The viewer overlay — fixed full-screen, dark backdrop, sits above all
     page content. The entrance is a short fade + tiny scale so it arrives
     gently; disabled under prefers-reduced-motion. */
.snaps-viewer {
    position: fixed;
    inset: 0;
    z-index: 50;
    display: flex;
    align-items: center;
    justify-content: center;
    background: oklch(0.15 0.02 145 / 0.92);
    backdrop-filter: blur(2px);
    -webkit-backdrop-filter: blur(2px);
    animation: snaps-viewer-in 0.22s cubic-bezier(0.4, 0, 0.2, 1) both;
  }
@keyframes snaps-viewer-in {
    0% {
      opacity: 0;
    }
    100% {
      opacity: 1;
    }
  }
/* The backdrop close target — fills the overlay so a click anywhere outside
     the photo closes the viewer. Sits behind the photo + close button. */
.snaps-viewer__backdrop {
    position: absolute;
    inset: 0;
    cursor: default;
    border: none;
    background: transparent;
    padding: 0;
  }
/* The photo stage — holds the photo + its date overlay, centered. Taps on
     the stage are stopped so they don't bubble to the backdrop close target. */
.snaps-viewer__stage {
    position: relative;
    z-index: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    height: 100%;
    padding: 1rem;
  }
/* The photo — as large as fits the viewport (object-fit: contain), centered.
     A relative wrapper so the date overlay can position against the photo's
     rendered box rather than the full stage. */
.snaps-viewer__photo-wrap {
    position: relative;
    display: inline-block;
    max-width: 100%;
    max-height: 100%;
  }
.snaps-viewer__photo {
    display: block;
    max-width: 100vw;
    max-height: 100vh;
    width: auto;
    height: auto;
    -o-object-fit: contain;
       object-fit: contain;
    -o-object-position: center;
       object-position: center;
    border-radius: 6px;
    box-shadow: 0 12px 48px -8px oklch(0 0 0 / 0.7);
    -webkit-user-select: none;
       -moz-user-select: none;
            user-select: none;
    -webkit-user-drag: none;
  }
/* The date overlay inside the viewer — reuses the EXACT .snap-date-overlay
     class (Caveat font, black text, white text-shadow glow) so the date reads
     exactly like the featured photo's date. This rule only re-anchors it to
     the viewer's photo wrapper (bottom-right of the photo, not the stage) and
     keeps pointer-events:none so it never blocks the backdrop close. The
     font-size/colour/shadow all come from .snap-date-overlay above. */
.snaps-viewer__photo-wrap .snap-date-overlay {
    right: 0.75rem;
    bottom: 0.75rem;
  }
/* The close button — top-right, a visible X in a translucent circle. High
     contrast against any photo. Sits above the photo + backdrop. */
.snaps-viewer__close {
    position: absolute;
    top: 1rem;
    right: 1rem;
    z-index: 2;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 2.75rem;
    height: 2.75rem;
    padding: 0;
    border-radius: 9999px;
    color: oklch(0.99 0.01 110);
    background: oklch(0.15 0.02 145 / 0.55);
    border: 1.5px solid oklch(0.99 0.01 110 / 0.4);
    backdrop-filter: blur(8px);
    -webkit-backdrop-filter: blur(8px);
    cursor: pointer;
    transition: background 0.18s ease-out, transform 0.18s ease-out;
  }
.snaps-viewer__close:hover {
    background: oklch(0.15 0.02 145 / 0.75);
    transform: scale(1.05);
  }
.snaps-viewer__close:focus-visible {
    outline: none;
    box-shadow: 0 0 0 2px oklch(var(--honey-ring));
  }
.snaps-viewer__close:active {
    transform: scale(0.96);
  }
/* Reduced motion — the viewer appears instantly (no fade) and the close
     button has no hover/active transform. The dark backdrop, photo, date
     overlay, and close affordance all remain fully visible and usable. */
@media (prefers-reduced-motion: reduce) {
    .snaps-viewer {
      animation: none;
    }
    .snaps-viewer__close,
    .snaps-viewer__close:hover,
    .snaps-viewer__close:active {
      transition: none;
      transform: none;
    }
  }
/* ── Garden Style — rustic wooden garden sign / plank ──────────────────────
     A single tappable section sitting between the Jobs deck and the Happy
     Snaps scrapbook on Home. It is a visual placeholder for now (no image
     Rolodex / selector inside, no backend calls, no navigation target yet)
     but reads as a handcrafted WOODEN GARDEN SIGN that lives inside the
     garden scene — warm timber, slightly imperfect edges, visible grain,
     and the words "Garden Style" + "Choose your world" plus a three-line
     menu mark and a trailing chevron all BURNED / hand-CARVED into the wood.
     No glass, no honey, no shimmer. The whole plank is the tap target.

     Pattern: each domain owns a token block + utility classes in index.css
     (Happy Snaps → --honey/--memory-* + .snaps-*; identify-pill → --pill-*
     + .identify-pill). Garden Style follows the same convention with
     --garden-style-* tokens above and .garden-style-* classes here. */
/* Section shell — NO background, NO borders, NO padding band. The wooden
     sign PNG sits directly over the Home garden background with no visible
     rectangle or frame behind or around it. Only the horizontal padding
     (applied via the section's utility classes in Home.tsx) remains so the
     image aligns with the page's content edges; the vertical rhythm is
     carried by the image itself. */
.garden-style-section {
    background: none;
    border-top: none;
    border-bottom: none;
  }
/* The button — NO plank styling. No brown gradient, no padding, no border,
     no rounded corners, no ::before wash, no grain. The button is a
     transparent wrapper whose only content is the sign <img>, so nothing
     creates a rectangle or frame behind or around the image. The whole sign
     remains the tap target. A focus-visible ring is preserved for keyboard
     accessibility.

     Interaction cues (apply to the wrapper, NEVER the frozen <img>):
       • A very gentle, slow side-to-side sway — a couple of degrees either
         way, ease-in-out, infinite — so the wooden sign reads as softly
         moving in a breeze. Not bouncy, fast, or cartoonish.
       • A soft, slightly stronger drop shadow around and underneath the
         whole sign so it separates from the garden background behind it and
         sits slightly forward in 3D space.
       • A subtle press: on :active the whole sign scales down / presses
         backward briefly, then returns as the Garden Style page opens. */
.garden-style-button {
    display: block;
    width: 100%;
    padding: 0;
    border: none;
    background: none;
    /* Soft drop shadow around and underneath the entire sign so it lifts off
       whatever Garden Style background is behind it and reads as sitting
       slightly forward. Two layers: a tight ambient contact + a longer, very
       soft cast beneath. */
    box-shadow: 0 1px 2px oklch(0.32 0.02 60 / 0.28), 0 10px 22px -6px
      oklch(0.28 0.03 60 / 0.34);
    border-radius: 0;
    color: inherit;
    font-family: inherit;
    text-align: left;
    cursor: pointer;
    overflow: visible;
    isolation: auto;
    /* transform is shared by the sway animation, the hover lift, and the
       press — keep the transition snappy for hover/press while the sway runs
       on its own timeline via animation. */
    transition: transform 0.18s cubic-bezier(0.34, 1.4, 0.64, 1), box-shadow
      0.18s ease;
    will-change: transform;
    /* Gentle, slow breeze sway. ~6s, ease-in-out, infinite. Origin at the
       top centre so the sign pivots like it is hung from a post. */
    animation: garden-style-sway 6s ease-in-out infinite;
    transform-origin: 50% 8%;
  }
.garden-style-button:hover {
    transform: translateY(-2px);
  }
.garden-style-button:focus-visible {
    outline: none;
    box-shadow: 0 0 0 3px oklch(var(--garden-style-ring) / 0.55), 0 1px 2px
      oklch(0.32 0.02 60 / 0.28), 0 10px 22px -6px oklch(0.28 0.03 60 / 0.34);
    border-radius: 0.5rem;
  }
/* Press: the whole sign briefly scales down / presses backward slightly,
     then returns as the Garden Style page opens. Feels like physically
     pressing a button. Slightly stronger than the previous tiny settle so
     the cue reads, still subtle. */
.garden-style-button:active {
    transform: translateY(1px) scale(0.972);
  }
/* Gentle breeze sway for the wooden sign — a couple of degrees either way,
     ease-in-out, infinite. Defined here alongside the other domain @keyframes
     (e.g. snaps-sunflower-sway) per project convention, NOT in
     tailwind.config.js. Origin is set on .garden-style-button so the sign
     pivots from near its top, like a real plank hung from a post. */
@keyframes garden-style-sway {
    0%,
    100% {
      transform: rotate(-1.5deg);
    }
    50% {
      transform: rotate(1.5deg);
    }
  }
/* The sign image — the uploaded PNG has a SOLID BLACK background.
     `mix-blend-mode: screen` drops the black out: black (0,0,0) screens to
     transparent against whatever paints behind, so only the wooden sign and
     its vines remain visible over the garden background. The image scales
     proportionally (display:block, width:100%, height:auto) so it never
     stretches, squashes, or crops. `pointer-events` stays auto so the whole
     sign remains tappable via the parent <button>. */
.garden-style-sign-image {
    display: block;
    width: 100%;
    height: auto;
    max-width: 100%;
    mix-blend-mode: screen;
    -webkit-mix-blend-mode: screen;
    -webkit-user-select: none;
       -moz-user-select: none;
            user-select: none;
    -webkit-user-drag: none;
  }
/* Reduced motion — the gentle hover lift, the press, AND the breeze sway
      are all removed; the static sign remains. */
@media (prefers-reduced-motion: reduce) {
    .garden-style-button,
    .garden-style-button:hover,
    .garden-style-button:active {
      transition: none;
      transform: none;
      animation: none;
    }
  }
/* Page shell — a standard app route, not a wood overlay. Centred max-width
     column over the warm garden --background, with generous vertical rhythm so
     the heading, upload form, and gallery each get breathing room. */
.garden-style-page {
    width: 100%;
    min-height: 100dvh;
    background: oklch(var(--background));
    color: oklch(var(--foreground));
    font-family: var(--font-body);
    padding: 1.25rem 1rem 3rem;
    display: flex;
    flex-direction: column;
    gap: 1.5rem;
  }
@media (min-width: 640px) {
    .garden-style-page {
      padding: 2rem 1.5rem 3.5rem;
      gap: 2rem;
    }
  }
/* Page heading — Bricolage Grotesque display, warm timber accent so the
     page reads as the destination the wooden sign pointed to. A short
     timber underline bar beneath echoes the sign's carved warmth without
     copying its wood texture. */
.garden-style-page-heading {
    font-family: var(--font-display);
    font-weight: 700;
    letter-spacing: -0.01em;
    color: oklch(var(--garden-style-page-accent));
    line-height: 1.1;
    position: relative;
    display: inline-block;
    padding-bottom: 0.6rem;
  }
.garden-style-page-heading::after {
    content: "";
    position: absolute;
    left: 0;
    bottom: 0;
    width: 38%;
    height: 4px;
    border-radius: 9999px;
    background: linear-gradient(
      90deg,
      oklch(var(--garden-style-page-accent)) 0%,
      oklch(var(--garden-style-page-accent) / 0.35) 100%
    );
  }
/* Back affordance — a ghost pill that returns to Home. Transparent at rest,
     picks up the warm timber accent on hover/active so it stays in the page's
     language. */
.garden-style-back {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0.5rem 0.9rem;
    border-radius: 9999px;
    background: transparent;
    color: oklch(var(--muted-foreground));
    border: 1px solid oklch(var(--border));
    font-family: var(--font-body);
    font-size: 0.9rem;
    font-weight: 600;
    cursor: pointer;
    transition: var(--transition-smooth);
    align-self: flex-start;
  }
.garden-style-back:hover {
    color: oklch(var(--garden-style-page-accent));
    border-color: oklch(var(--garden-style-page-accent) / 0.55);
    background: oklch(var(--garden-style-page-accent-soft) / 0.5);
  }
.garden-style-back:active {
    transform: scale(0.97);
  }
.garden-style-back:focus-visible {
    outline: none;
    box-shadow: 0 0 0 3px oklch(var(--garden-style-page-accent-ring) / 0.5);
  }
/* Upload form card — an elevated garden --card surface with a soft warm
     timber-tinted lift, distinct from the green-tinted photo-card shadows
     elsewhere. Holds the name input, file picker, and submit button as a
     single grouped unit. */
.garden-style-upload-card {
    background: oklch(var(--card));
    color: oklch(var(--card-foreground));
    border: 1px solid oklch(var(--border));
    border-radius: var(--radius);
    box-shadow: var(--garden-style-card-shadow);
    padding: 1.25rem;
    display: flex;
    flex-direction: column;
    gap: 1rem;
  }
@media (min-width: 640px) {
    .garden-style-upload-card {
      padding: 1.5rem;
    }
  }
/* Field label — uppercase tracking label above each form field, in muted
     garden ink. Matches the existing label pattern (text-xs font-semibold
     tracking-widest uppercase text-muted-foreground). */
.garden-style-upload-label {
    font-family: var(--font-body);
    font-size: 0.72rem;
    font-weight: 600;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: oklch(var(--muted-foreground));
    display: block;
  }
/* Name input — the required name for each uploaded background. Standard
     garden input treatment (border-input, bg-card) with the focus ring in
     the timber page accent so the form's active state stays in language. */
.garden-style-upload-input {
    width: 100%;
    padding: 0.7rem 0.85rem;
    border-radius: 0.6rem;
    border: 1px solid oklch(var(--input));
    background: oklch(var(--card));
    color: oklch(var(--foreground));
    font-family: var(--font-body);
    font-size: 1rem;
    line-height: 1.4;
    transition: var(--transition-smooth);
  }
.garden-style-upload-input::-moz-placeholder {
    color: oklch(var(--muted-foreground) / 0.7);
  }
.garden-style-upload-input::placeholder {
    color: oklch(var(--muted-foreground) / 0.7);
  }
.garden-style-upload-input:focus {
    outline: none;
    border-color: oklch(var(--garden-style-page-accent) / 0.7);
    box-shadow: 0 0 0 3px oklch(var(--garden-style-page-accent-ring) / 0.35);
  }
/* File picker — the "choose image" affordance. A soft timber-tinted button
     with a dashed timber border so it reads as a drop/choose zone, not a
     plain CTA. One image per upload action (per user preference). */
.garden-style-file-picker {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.45rem;
    padding: 0.7rem 1rem;
    border-radius: 0.6rem;
    border: 1.5px dashed oklch(var(--garden-style-page-accent) / 0.55);
    background: oklch(var(--garden-style-page-accent-soft) / 0.45);
    color: oklch(var(--garden-style-page-accent));
    font-family: var(--font-body);
    font-size: 0.92rem;
    font-weight: 600;
    cursor: pointer;
    transition: var(--transition-smooth);
    text-align: center;
  }
.garden-style-file-picker:hover {
    background: oklch(var(--garden-style-page-accent-soft) / 0.8);
    border-color: oklch(var(--garden-style-page-accent) / 0.8);
  }
.garden-style-file-picker:active {
    transform: scale(0.98);
  }
/* Submit button — the primary action. Timber accent fill with the page
     accent-foreground for AA contrast, spring press feedback. Distinct from
     the green identify pill and the honey snaps button so each domain keeps
     its own CTA colour. */
.garden-style-submit {
    align-self: flex-start;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.45rem;
    padding: 0.7rem 1.4rem;
    border-radius: 9999px;
    border: none;
    background: oklch(var(--garden-style-page-accent));
    color: oklch(var(--garden-style-page-accent-foreground));
    font-family: var(--font-body);
    font-size: 0.95rem;
    font-weight: 600;
    letter-spacing: 0.01em;
    cursor: pointer;
    box-shadow: var(--garden-style-card-shadow-press);
    transition: var(--transition-spring);
  }
.garden-style-submit:hover {
    box-shadow: var(--garden-style-card-shadow-lift);
    transform: translateY(-1px);
  }
.garden-style-submit:active {
    transform: translateY(1px) scale(0.97);
  }
.garden-style-submit:focus-visible {
    outline: none;
    box-shadow: var(--garden-style-card-shadow-lift), 0 0 0 3px
      oklch(var(--garden-style-page-accent-ring) / 0.45);
  }
.garden-style-submit:disabled {
    opacity: 0.55;
    cursor: not-allowed;
    transform: none;
    box-shadow: none;
  }
/* Gallery — a responsive grid of named thumbnail cards. 2 columns on
     mobile (single-thumb reach, readable thumbnails), 3 on small tablets,
     4 on larger screens. */
.garden-style-gallery {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 0.85rem;
  }
@media (min-width: 480px) {
    .garden-style-gallery {
      grid-template-columns: repeat(3, minmax(0, 1fr));
      gap: 1rem;
    }
  }
@media (min-width: 768px) {
    .garden-style-gallery {
      grid-template-columns: repeat(4, minmax(0, 1fr));
      gap: 1.1rem;
    }
  }
/* Gallery item — a single named thumbnail card. bg-card with the warm
     timber card shadow; lifts on hover. Holds the thumbnail image and the
     name label stacked. */
.garden-style-gallery-item {
    background: oklch(var(--card));
    border: 1px solid oklch(var(--border));
    border-radius: 0.7rem;
    box-shadow: var(--garden-style-card-shadow);
    overflow: hidden;
    display: flex;
    flex-direction: column;
    transition: transform 0.2s cubic-bezier(0.34, 1.56, 0.64, 1), box-shadow
      0.24s ease;
  }
.garden-style-gallery-item:hover {
    transform: translateY(-2px);
    box-shadow: var(--garden-style-card-shadow-lift);
  }
.garden-style-gallery-item:active {
    transform: translateY(0) scale(0.99);
  }
/* Thumbnail image — aspect-square, object-cover so any uploaded background
     crops cleanly into a uniform tile. */
.garden-style-gallery-thumb {
    display: block;
    width: 100%;
    aspect-ratio: 1 / 1;
    -o-object-fit: cover;
       object-fit: cover;
    -o-object-position: center;
       object-position: center;
    background: oklch(var(--muted));
  }
/* Name label — the required name of each uploaded background, Figtree
     beneath the thumbnail. Truncates to a single line so the grid stays
     tidy even with long names. */
.garden-style-gallery-name {
    padding: 0.5rem 0.65rem 0.6rem;
    font-family: var(--font-body);
    font-size: 0.85rem;
    font-weight: 600;
    color: oklch(var(--foreground));
    line-height: 1.25;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
/* Empty state — shown when no backgrounds are available. A dashed
     timber-bordered panel with muted garden ink, echoing the page's warm
     timber language so the page reads as one consistent "waiting" surface. */
.garden-style-empty {
    border: 1.5px dashed oklch(var(--garden-style-page-accent) / 0.45);
    border-radius: var(--radius);
    background: oklch(var(--garden-style-page-accent-soft) / 0.25);
    color: oklch(var(--muted-foreground));
    font-family: var(--font-body);
    font-size: 0.95rem;
    text-align: center;
    padding: 2rem 1.25rem;
    line-height: 1.5;
  }
/* ── Garden Style carousel — single large centred swipeable card ───────
     The carousel replaces the old upload + gallery interface. One large
     centred card shows the current preset image; the user swipes left/right
     to browse (wrapping at both ends) and taps to choose. Reuses the warm
     timber page accent and the existing --garden-style-card-shadow-* tokens
     so the card reads as part of the page's language. No raw literals. */
/* The draggable card shell — a large rounded card with the warm timber
     lift shadow. Sized to feel prominent and centred on screen without
     filling the entire viewport, so the heading and name label still
     breathe. The motion.div drag surface is this element. */
.garden-style-card {
    position: relative;
    width: min(86vw, 420px);
    aspect-ratio: 3 / 4;
    border-radius: 1.25rem;
    overflow: hidden;
    background: oklch(var(--card));
    border: 1px solid oklch(var(--border));
    box-shadow: var(--garden-style-card-shadow-lift);
    display: flex;
    align-items: center;
    justify-content: center;
    touch-action: pan-y;
  }
/* The centred image — fills the card with object-cover so any preset
     background crops cleanly into the uniform card. */
.garden-style-card-image {
    width: 100%;
    height: 100%;
    -o-object-fit: cover;
       object-fit: cover;
    -o-object-position: center;
       object-position: center;
    display: block;
  }
/* Placeholder — a soft timber-tinted fill shown while the asset URL
     resolves or when no URL is available, so the card never looks broken. */
.garden-style-card-image--placeholder {
    background: linear-gradient(
      135deg,
      oklch(var(--garden-style-page-accent-soft) / 0.6) 0%,
      oklch(var(--garden-style-page-accent-soft) / 0.3) 100%
    );
  }
/* Tick confirmation overlay — a green circle with a check icon that
     fades in over the centred image when the user taps to select, indicating
     the selection was accepted. Centred over the card, sits above the image.
     Uses the garden --success green so it reads as a positive confirmation
     within the garden palette. */
.garden-style-tick {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    pointer-events: none;
    z-index: 5;
  }
.garden-style-tick > svg {
    position: relative;
    z-index: 2;
    color: oklch(var(--success-foreground));
    filter: drop-shadow(0 2px 6px oklch(0 0 0 / 0.35));
  }
/* The solid green circle behind the check — a crisp achievement emblem
     with a soft lift shadow and a subtle inner highlight. */
.garden-style-tick::before {
    content: "";
    position: absolute;
    z-index: 1;
    width: 5rem;
    height: 5rem;
    border-radius: 9999px;
    background: radial-gradient(
      circle at 50% 38%,
      oklch(0.72 0.17 145) 0%,
      oklch(0.6 0.18 145) 100%
    );
    box-shadow: 0 8px 24px -6px oklch(0.3 0.1 145 / 0.5), inset 0 1px 0 0
      oklch(1 0 0 / 0.45);
    border: 3px solid oklch(0.99 0.01 145 / 0.85);
  }
/* Expanding impact ring — a thin cream ring that scales out and fades
     around the emblem the moment it lands, giving the pop a sense of impact. */
.garden-style-tick-ring {
    position: absolute;
    z-index: 1;
    width: 5rem;
    height: 5rem;
    border-radius: 9999px;
    border: 2px solid oklch(0.99 0.01 145 / 0.85);
  }
/* Name label — the visible name of the centred garden, displayed beneath
     the card. Bricolage Grotesque display, warm timber accent so it ties
     back to the heading, centred so it always reads as belonging to the
     card above. */
.garden-style-name-label {
    font-family: var(--font-display);
    font-weight: 700;
    letter-spacing: -0.01em;
    color: oklch(var(--garden-style-page-accent));
    font-size: 1.5rem;
    line-height: 1.2;
    text-align: center;
    max-width: 90vw;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
/* Position counter — a small, understated label showing the centred
     garden's 1-based position and the total count. Muted garden ink so it
     stays quiet and informational, never competing with the name label. */
.garden-style-counter {
    font-family: var(--font-body);
    font-size: 0.85rem;
    font-weight: 600;
    letter-spacing: 0.04em;
    color: oklch(var(--muted-foreground));
    text-align: center;
  }
/* Reduced motion — page hover lifts and presses settle to static. */
@media (prefers-reduced-motion: reduce) {
    .garden-style-back,
    .garden-style-back:hover,
    .garden-style-back:active,
    .garden-style-card,
    .garden-style-card:hover,
    .garden-style-card:active {
      transition: none;
      transform: none;
    }
  }
/* ── Garden Style — temporary admin upload section ─────────────────────
     A small, unobtrusive admin affordance appended BELOW the carousel so
     the existing carousel layout, selection behaviour, and newest-first
     sort are untouched. Reuses the existing .garden-style-upload-card /
     .garden-style-upload-label / .garden-style-upload-input /
     .garden-style-file-picker / .garden-style-submit classes for the form
     chrome; these rules cover only the admin-specific header, badge, hint,
     chosen-image indicator, and error message so the section reads as
     clearly temporary/admin and can be located and removed later. Every
     colour is an existing token. */
/* Section — slightly smaller padding than the standard upload card so it
     sits quietly beneath the carousel. A muted top border separates it
     from the carousel/counter area without competing with it. */
.garden-style-admin-upload {
    margin-top: 0.5rem;
    padding-top: 1rem;
    border-top: 1px dashed oklch(var(--garden-style-page-accent) / 0.35);
    box-shadow: none;
    border-left: 1px solid oklch(var(--border));
    border-right: 1px solid oklch(var(--border));
    border-bottom: 1px solid oklch(var(--border));
    background: oklch(var(--card) / 0.7);
  }
@media (min-width: 640px) {
    .garden-style-admin-upload {
      margin-top: 0.75rem;
    }
  }
/* Header row — the section title on the left, the TEMPORARY · ADMIN badge
     on the right. Keeps the title small and quiet so it never competes with
     the page heading or the carousel name label. */
.garden-style-admin-upload__header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.75rem;
    flex-wrap: wrap;
  }
.garden-style-admin-upload__title {
    font-family: var(--font-display);
    font-weight: 600;
    font-size: 1rem;
    letter-spacing: -0.01em;
    color: oklch(var(--foreground));
    margin: 0;
  }
/* TEMPORARY · ADMIN badge — a small uppercase pill in muted garden ink
     with a dashed timber border so it reads as clearly temporary/admin at a
     glance. Sits at the top-right of the section header. */
.garden-style-admin-upload__badge {
    display: inline-flex;
    align-items: center;
    padding: 0.2rem 0.55rem;
    border-radius: 9999px;
    border: 1px dashed oklch(var(--garden-style-page-accent) / 0.55);
    background: oklch(var(--garden-style-page-accent-soft) / 0.35);
    color: oklch(var(--garden-style-page-accent));
    font-family: var(--font-mono);
    font-size: 0.62rem;
    font-weight: 600;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    white-space: nowrap;
  }
/* Hint — a single line of muted garden ink explaining what the section
     does and that it is temporary. Stays quiet so it never competes with
     the carousel. */
.garden-style-admin-upload__hint {
    font-family: var(--font-body);
    font-size: 0.82rem;
    line-height: 1.45;
    color: oklch(var(--muted-foreground));
    margin: 0;
  }
/* Chosen-image indicator — a small green-tinted chip shown next to the
     file picker once an image has uploaded successfully, so the admin knows
     the image is ready before entering a name. Uses the garden --success
     green so it reads as a positive confirmation. */
.garden-style-admin-upload__chosen {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    padding: 0.25rem 0.6rem;
    border-radius: 9999px;
    background: oklch(var(--success) / 0.12);
    color: oklch(var(--success));
    font-family: var(--font-body);
    font-size: 0.78rem;
    font-weight: 600;
  }
/* Error — a small inline alert shown when the backend
     addGardenStyleBackground call fails. Uses the destructive token so it
     reads as an error within the garden palette. */
.garden-style-admin-upload__error {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    color: oklch(var(--destructive));
    font-family: var(--font-body);
    font-size: 0.82rem;
    line-height: 1.4;
  }
.\[--cell-size\:--spacing\(8\)\] {
  --cell-size: var(--spacing(8));
}

@font-face {
  font-family: "Bricolage Grotesque";
  src: url("/assets/fonts/BricolageGrotesque.woff2") format("woff2");
  font-display: swap;
}

@font-face {
  font-family: "Figtree";
  src: url("/assets/fonts/Figtree.woff2") format("woff2");
  font-display: swap;
}

@font-face {
  font-family: "Geist Mono";
  src: url("/assets/fonts/GeistMono.woff2") format("woff2");
  font-display: swap;
}

@font-face {
  font-family: "Caveat";
  src: url("/assets/fonts/Caveat-Regular.ttf") format("truetype");
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}

@font-face {
  font-family: "Sacramento";
  src: url("/assets/fonts/Sacramento-Regular.ttf") format("truetype");
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}

/* ── Garden Emblem (inline button + selector popover) ─────────────────────
   The inline Garden Emblem button replaces the small leaf icon beside the
   user's name on Home. It renders the user's currently selected emblem as a
   colourful, semi-realistic SVG with a soft drop shadow so it reads as
   slightly raised/floating above the background — obviously pressable. Tapping
   it opens the GardenEmblemSelector popover anchored below the button. The
   selector presents exactly ten emblem options in a grid; the selected one
   gets a green ring + green check. The selector closes on outside-click,
   Escape, or selection (handled in GardenEmblemSelector via useDismissable).
   All animations honor prefers-reduced-motion; the shadow/depth remain static
   when reduced motion is requested. Green is used for the selected-state ring
   and check per the user's "arrows and indicators should be green" preference.
   This block is appended AFTER the Happy Snaps viewer block so existing
   classes and keyframes are untouched. */

.garden-emblem-inline {
  position: relative;
  display: inline-flex;
  align-items: center;
}

/* The inline emblem button — a circular, slightly-raised disc that holds the
   SVG emblem. The soft drop shadow + gentle float animation make it obviously
   pressable. Hit target is 44px (mobile-friendly). */
.garden-emblem-inline__button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2.75rem;
  height: 2.75rem;
  padding: 0;
  border-radius: 9999px;
  border: none;
  background: transparent;
  cursor: pointer;
  /* Soft drop shadow so the emblem reads as slightly raised/floating above
     the background. Static (not animated) so it remains under reduced motion. */
  box-shadow: 0 1px 2px oklch(0.2 0.02 145 / 0.35), 0 4px 10px
    oklch(0.2 0.02 145 / 0.28);
  transition: transform 0.22s ease-out, box-shadow 0.22s ease-out;
  animation: garden-emblem-float 4.5s ease-in-out infinite;
}

.garden-emblem-inline__button:hover {
  transform: translateY(-2px) scale(1.04);
  box-shadow: 0 2px 4px oklch(0.2 0.02 145 / 0.4), 0 6px 16px
    oklch(0.2 0.02 145 / 0.34);
}

.garden-emblem-inline__button:focus-visible {
  outline: none;
  box-shadow: 0 0 0 2.5px oklch(var(--honey-ring)), 0 1px 2px
    oklch(0.2 0.02 145 / 0.35), 0 4px 10px oklch(0.2 0.02 145 / 0.28);
}

.garden-emblem-inline__button:active {
  transform: translateY(0) scale(0.97);
}

/* Scale the displayed emblem SVG to 200% of its rendered size, growing outward
   from the button's centre. Applied to the <svg> inside the button (not the
   button itself) so the float animation's translateY and the hover/active
   transforms on the button remain untouched. The SVG already has
   overflow:visible, so scale(2) expands visually without reflowing layout or
   moving the emblem's centre point. This affects ONLY the inline displayed
   emblem beside the user's name on the Home screen — the selector menu uses a
   separate size prop and its own classes, which are not targeted here. The
   scale is a static transform (not motion), so no prefers-reduced-motion guard
   is needed. */
.garden-emblem-inline__button svg {
  transform: scale(2);
  transform-origin: center;
}

/* Gentle float — a small, tasteful vertical bob so the emblem reads as
   floating above the background. Only transform is animated (never layout). */
@keyframes garden-emblem-float {
  0%,
  100% {
    transform: translateY(0);
  }
  50% {
    transform: translateY(-4px);
  }
}

/* ── Selector popover ──
   Anchored below the inline emblem button (absolute, top: 100% + small gap).
   A small glass panel with a soft shadow; no full-screen scrim so other Home
   interactions remain unblocked. Closes on outside-click / Escape / selection
   (handled in GardenEmblemSelector via useDismissable). */
.garden-emblem-selector {
  position: absolute;
  top: calc(100% + 0.6rem);
  left: 0;
  z-index: 60;
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
  min-width: 16rem;
  max-width: 20rem;
  padding: 1rem;
  border-radius: 1.25rem;
  /* Glass panel — translucent warm card so it reads as a floating layer over
     the cover background. */
  background: oklch(0.99 0.01 110 / 0.92);
  border: 1px solid oklch(0.85 0.04 110 / 0.6);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
  box-shadow: 0 8px 24px oklch(0.2 0.02 145 / 0.28), 0 2px 6px
    oklch(0.2 0.02 145 / 0.18);
  animation: garden-emblem-selector-in 0.18s ease-out;
}

@keyframes garden-emblem-selector-in {
  from {
    opacity: 0;
    transform: translateY(-4px) scale(0.98);
  }
  to {
    opacity: 1;
    transform: translateY(0) scale(1);
  }
}

.garden-emblem-selector__title {
  margin: 0;
  font-family: var(--font-display, inherit);
  font-size: 0.95rem;
  font-weight: 600;
  color: oklch(0.25 0.02 145);
  letter-spacing: 0.01em;
}

/* The 15-option grid — 5 columns × 3 rows on wider popovers, 4 columns on
   narrow ones. Each option is a button with the emblem SVG + label. */
.garden-emblem-selector__grid {
  display: grid;
  grid-template-columns: repeat(5, minmax(0, 1fr));
  gap: 0.5rem;
}

@media (max-width: 22rem) {
  .garden-emblem-selector__grid {
    grid-template-columns: repeat(4, minmax(0, 1fr));
  }
}

.garden-emblem-option {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.3rem;
  padding: 0.5rem 0.25rem;
  border-radius: 0.85rem;
  border: 1.5px solid transparent;
  background: oklch(0.97 0.01 110 / 0.7);
  cursor: pointer;
  transition: background 0.16s ease-out, border-color 0.16s ease-out, transform
    0.16s ease-out;
}

.garden-emblem-option:hover {
  background: oklch(0.94 0.02 110 / 0.9);
  transform: translateY(-1px);
}

.garden-emblem-option:focus-visible {
  outline: none;
  border-color: oklch(var(--honey-ring));
  box-shadow: 0 0 0 2px oklch(var(--honey-ring) / 0.4);
}

.garden-emblem-option:active {
  transform: translateY(0) scale(0.97);
}

/* Selected state — green ring + green check per the user's "indicators should
   be green" preference. The ring is a solid green border; the check sits in
   a small green circle at the top-right corner of the option. */
.garden-emblem-option--selected {
  border-color: oklch(0.62 0.18 145);
  background: oklch(0.95 0.04 145 / 0.85);
}

.garden-emblem-option--selected:hover {
  background: oklch(0.93 0.05 145 / 0.9);
}

.garden-emblem-option__label {
  font-size: 0.7rem;
  font-weight: 500;
  line-height: 1.1;
  text-align: center;
  color: oklch(0.3 0.02 145);
  /* Allow up to 2 lines for the longer labels (e.g. "Cherry Blossom"). */
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.garden-emblem-option__check {
  position: absolute;
  top: 0.25rem;
  right: 0.25rem;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.1rem;
  height: 1.1rem;
  border-radius: 9999px;
  color: oklch(0.99 0.01 110);
  background: oklch(0.62 0.18 145);
  box-shadow: 0 1px 3px oklch(0.2 0.02 145 / 0.3);
}

/* Reduced motion — the inline emblem does not float and the selector appears
   instantly (no fade/scale). The static drop shadow and depth remain so the
   emblem still reads as raised/floating; only the motion is removed. */
@media (prefers-reduced-motion: reduce) {
  .garden-emblem-inline__button,
  .garden-emblem-inline__button:hover,
  .garden-emblem-inline__button:active {
    animation: none;
    transition: none;
    transform: none;
  }
  .garden-emblem-selector {
    animation: none;
  }
  .garden-emblem-option,
  .garden-emblem-option:hover,
  .garden-emblem-option:active {
    transition: none;
    transform: none;
  }
}

/* Garden Style utilities live in their own utilities layer so the rules stay
   scoped and every brace balances independently of the main utilities block
   above. Re-opening @layer utilities merges with the earlier block. */

/* ── Garden Style PAGE — upload + gallery route component classes ──────────
   The full Garden Style page (a dedicated route like Happy Snaps, reached by
   tapping the wooden sign on Home) is a FUNCTIONAL upload/storage surface,
   NOT a wood-textured overlay. It uses the standard garden --card /
   --background elevation so it reads as part of the app, with a warm timber-
   derived accent (--garden-style-page-accent, hue 58) that ties it back to
   the wooden sign the user tapped to get here. Every colour is an existing
   token: the --garden-style-page-* / --garden-style-card-shadow-* tokens
   above plus the Sunny Garden --card / --background / --border / --input /
   --foreground / --muted / --muted-foreground / --ring system. No raw
   literals. The frozen .garden-style-button / .garden-style-sign-image
   classes above are NOT modified. */

.selection\:bg-primary *::-moz-selection {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--primary) / var(--tw-bg-opacity, 1));
}

.selection\:bg-primary *::selection {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--primary) / var(--tw-bg-opacity, 1));
}

.selection\:text-primary-foreground *::-moz-selection {
  color: oklch(var(--primary-foreground));
}

.selection\:text-primary-foreground *::selection {
  color: oklch(var(--primary-foreground));
}

.selection\:bg-primary::-moz-selection {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--primary) / var(--tw-bg-opacity, 1));
}

.selection\:bg-primary::selection {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--primary) / var(--tw-bg-opacity, 1));
}

.selection\:text-primary-foreground::-moz-selection {
  color: oklch(var(--primary-foreground));
}

.selection\:text-primary-foreground::selection {
  color: oklch(var(--primary-foreground));
}

.file\:inline-flex::file-selector-button {
  display: inline-flex;
}

.file\:h-7::file-selector-button {
  height: 1.75rem;
}

.file\:border-0::file-selector-button {
  border-width: 0px;
}

.file\:bg-transparent::file-selector-button {
  background-color: transparent;
}

.file\:text-sm::file-selector-button {
  font-size: 0.875rem;
  line-height: 1.25rem;
}

.file\:font-medium::file-selector-button {
  font-weight: 500;
}

.file\:text-foreground::file-selector-button {
  color: oklch(var(--foreground));
}

.placeholder\:text-\[oklch\(var\(--memory-page-foreground\)\/0\.4\)\]::-moz-placeholder {
  color: oklch(var(--memory-page-foreground)/0.4);
}

.placeholder\:text-\[oklch\(var\(--memory-page-foreground\)\/0\.4\)\]::placeholder {
  color: oklch(var(--memory-page-foreground)/0.4);
}

.placeholder\:text-muted-foreground::-moz-placeholder {
  --tw-text-opacity: 1;
  color: oklch(var(--muted-foreground) / var(--tw-text-opacity, 1));
}

.placeholder\:text-muted-foreground::placeholder {
  --tw-text-opacity: 1;
  color: oklch(var(--muted-foreground) / var(--tw-text-opacity, 1));
}

.placeholder\:text-muted-foreground\/70::-moz-placeholder {
  color: oklch(var(--muted-foreground) / 0.7);
}

.placeholder\:text-muted-foreground\/70::placeholder {
  color: oklch(var(--muted-foreground) / 0.7);
}

.placeholder\:text-white\/40::-moz-placeholder {
  color: rgb(255 255 255 / 0.4);
}

.placeholder\:text-white\/40::placeholder {
  color: rgb(255 255 255 / 0.4);
}

.before\:pointer-events-none::before {
  content: var(--tw-content);
  pointer-events: none;
}

.before\:absolute::before {
  content: var(--tw-content);
  position: absolute;
}

.before\:inset-x-0::before {
  content: var(--tw-content);
  left: 0px;
  right: 0px;
}

.before\:top-0::before {
  content: var(--tw-content);
  top: 0px;
}

.before\:h-px::before {
  content: var(--tw-content);
  height: 1px;
}

.before\:bg-gradient-to-r::before {
  content: var(--tw-content);
  background-image: linear-gradient(to right, var(--tw-gradient-stops));
}

.before\:from-transparent::before {
  content: var(--tw-content);
  --tw-gradient-from: transparent var(--tw-gradient-from-position);
  --tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);
  --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
}

.before\:via-white\/70::before {
  content: var(--tw-content);
  --tw-gradient-to: rgb(255 255 255 / 0)  var(--tw-gradient-to-position);
  --tw-gradient-stops: var(--tw-gradient-from), rgb(255 255 255 / 0.7) var(--tw-gradient-via-position), var(--tw-gradient-to);
}

.before\:to-transparent::before {
  content: var(--tw-content);
  --tw-gradient-to: transparent var(--tw-gradient-to-position);
}

.after\:absolute::after {
  content: var(--tw-content);
  position: absolute;
}

.after\:-inset-2::after {
  content: var(--tw-content);
  inset: -0.5rem;
}

.after\:inset-y-0::after {
  content: var(--tw-content);
  top: 0px;
  bottom: 0px;
}

.after\:left-1\/2::after {
  content: var(--tw-content);
  left: 50%;
}

.after\:w-1::after {
  content: var(--tw-content);
  width: 0.25rem;
}

.after\:w-\[2px\]::after {
  content: var(--tw-content);
  width: 2px;
}

.after\:-translate-x-1\/2::after {
  content: var(--tw-content);
  --tw-translate-x: -50%;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.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-width: 1px;
}

.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-width: 0px;
}

.focus-within\:ring-2:focus-within {
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
  box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
}

.focus-within\:ring-ring:focus-within {
  --tw-ring-opacity: 1;
  --tw-ring-color: oklch(var(--ring) / var(--tw-ring-opacity, 1));
}

.hover\:-translate-y-0\.5:hover {
  --tw-translate-y: -0.125rem;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.hover\:scale-105:hover {
  --tw-scale-x: 1.05;
  --tw-scale-y: 1.05;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.hover\:border-primary\/30:hover {
  border-color: oklch(var(--primary) / 0.3);
}

.hover\:bg-\[oklch\(var\(--honey-soft\)\/0\.3\)\]:hover {
  background-color: oklch(var(--honey-soft)/0.3);
}

.hover\:bg-\[oklch\(var\(--honey-soft\)\/0\.4\)\]:hover {
  background-color: oklch(var(--honey-soft)/0.4);
}

.hover\:bg-\[oklch\(var\(--memory-page\)\/0\.85\)\]:hover {
  background-color: oklch(var(--memory-page)/0.85);
}

.hover\:bg-\[oklch\(var\(--memory-page-border\)\/0\.3\)\]:hover {
  background-color: oklch(var(--memory-page-border)/0.3);
}

.hover\:bg-accent:hover {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--accent) / var(--tw-bg-opacity, 1));
}

.hover\:bg-accent\/10:hover {
  background-color: oklch(var(--accent) / 0.1);
}

.hover\:bg-black\/60:hover {
  background-color: rgb(0 0 0 / 0.6);
}

.hover\:bg-black\/65:hover {
  background-color: rgb(0 0 0 / 0.65);
}

.hover\:bg-destructive:hover {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--destructive) / var(--tw-bg-opacity, 1));
}

.hover\:bg-destructive\/10:hover {
  background-color: oklch(var(--destructive) / 0.1);
}

.hover\:bg-destructive\/90:hover {
  background-color: oklch(var(--destructive) / 0.9);
}

.hover\:bg-muted:hover {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--muted) / var(--tw-bg-opacity, 1));
}

.hover\:bg-muted\/50:hover {
  background-color: oklch(var(--muted) / 0.5);
}

.hover\:bg-primary\/90:hover {
  background-color: oklch(var(--primary) / 0.9);
}

.hover\:bg-secondary:hover {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--secondary) / var(--tw-bg-opacity, 1));
}

.hover\:bg-secondary\/30:hover {
  background-color: oklch(var(--secondary) / 0.3);
}

.hover\:bg-secondary\/80:hover {
  background-color: oklch(var(--secondary) / 0.8);
}

.hover\:bg-sidebar-accent:hover {
  background-color: oklch(var(--sidebar-accent));
}

.hover\:bg-white:hover {
  --tw-bg-opacity: 1;
  background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));
}

.hover\:bg-white\/15:hover {
  background-color: rgb(255 255 255 / 0.15);
}

.hover\:bg-white\/25:hover {
  background-color: rgb(255 255 255 / 0.25);
}

.hover\:text-\[oklch\(var\(--destructive-foreground\)\)\]:hover {
  color: oklch(var(--destructive-foreground));
}

.hover\:text-accent-foreground:hover {
  color: oklch(var(--accent-foreground));
}

.hover\:text-foreground:hover {
  color: oklch(var(--foreground));
}

.hover\:text-muted-foreground:hover {
  --tw-text-opacity: 1;
  color: oklch(var(--muted-foreground) / var(--tw-text-opacity, 1));
}

.hover\:text-primary:hover {
  --tw-text-opacity: 1;
  color: oklch(var(--primary) / var(--tw-text-opacity, 1));
}

.hover\:text-sidebar-accent-foreground:hover {
  color: oklch(var(--sidebar-accent-foreground));
}

.hover\:text-white\/90:hover {
  color: rgb(255 255 255 / 0.9);
}

.hover\:underline:hover {
  text-decoration-line: underline;
}

.hover\:opacity-100:hover {
  opacity: 1;
}

.hover\:opacity-90:hover {
  opacity: 0.9;
}

.hover\:shadow-\[0_0_0_1px_hsl\(var\(--sidebar-accent\)\)\]:hover {
  --tw-shadow: 0 0 0 1px hsl(var(--sidebar-accent));
  --tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}

.hover\:shadow-lg:hover {
  --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
  --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}

.hover\:shadow-md:hover {
  --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
  --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}

.hover\:shadow-sm:hover {
  --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
  --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}

.hover\:shadow-xl:hover {
  --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
  --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}

.hover\:shadow-black\/40:hover {
  --tw-shadow-color: rgb(0 0 0 / 0.4);
  --tw-shadow: var(--tw-shadow-colored);
}

.hover\:ring-4:hover {
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);
  box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
}

.hover\:brightness-105:hover {
  --tw-brightness: brightness(1.05);
  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);
}

.hover\:after\:bg-sidebar-border:hover::after {
  content: var(--tw-content);
  background-color: oklch(var(--sidebar-border));
}

.focus\:z-10:focus {
  z-index: 10;
}

.focus\:border-white\/80:focus {
  border-color: rgb(255 255 255 / 0.8);
}

.focus\:bg-accent:focus {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--accent) / var(--tw-bg-opacity, 1));
}

.focus\:text-accent-foreground:focus {
  color: oklch(var(--accent-foreground));
}

.focus\:text-destructive:focus {
  --tw-text-opacity: 1;
  color: oklch(var(--destructive) / var(--tw-text-opacity, 1));
}

.focus\:opacity-100:focus {
  opacity: 1;
}

.focus\:outline-none:focus {
  outline: 2px solid transparent;
  outline-offset: 2px;
}

.focus\:ring-2:focus {
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
  box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
}

.focus\:ring-ring:focus {
  --tw-ring-opacity: 1;
  --tw-ring-color: oklch(var(--ring) / var(--tw-ring-opacity, 1));
}

.focus\:ring-offset-2:focus {
  --tw-ring-offset-width: 2px;
}

.focus-visible\:z-10:focus-visible {
  z-index: 10;
}

.focus-visible\:border-ring:focus-visible {
  --tw-border-opacity: 1;
  border-color: oklch(var(--ring) / var(--tw-border-opacity, 1));
}

.focus-visible\:underline:focus-visible {
  text-decoration-line: underline;
}

.focus-visible\:underline-offset-2:focus-visible {
  text-underline-offset: 2px;
}

.focus-visible\:outline-none:focus-visible {
  outline: 2px solid transparent;
  outline-offset: 2px;
}

.focus-visible\:outline-1:focus-visible {
  outline-width: 1px;
}

.focus-visible\:outline-ring:focus-visible {
  outline-color: oklch(var(--ring) / 1);
}

.focus-visible\:ring-1:focus-visible {
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
  box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
}

.focus-visible\:ring-2:focus-visible {
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
  box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
}

.focus-visible\:ring-4:focus-visible {
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);
  box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
}

.focus-visible\:ring-\[3px\]:focus-visible {
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);
  box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
}

.focus-visible\:ring-inset:focus-visible {
  --tw-ring-inset: inset;
}

.focus-visible\:ring-\[oklch\(var\(--garden-style-page-accent-ring\)\/0\.5\)\]:focus-visible {
  --tw-ring-color: oklch(var(--garden-style-page-accent-ring)/0.5);
}

.focus-visible\:ring-\[oklch\(var\(--honey-ring\)\)\]:focus-visible {
  --tw-ring-color: oklch(var(--honey-ring));
}

.focus-visible\:ring-\[oklch\(var\(--memory-page-accent\)\)\]:focus-visible {
  --tw-ring-color: oklch(var(--memory-page-accent));
}

.focus-visible\:ring-destructive\/20:focus-visible {
  --tw-ring-color: oklch(var(--destructive) / 0.2);
}

.focus-visible\:ring-ring:focus-visible {
  --tw-ring-opacity: 1;
  --tw-ring-color: oklch(var(--ring) / var(--tw-ring-opacity, 1));
}

.focus-visible\:ring-ring\/50:focus-visible {
  --tw-ring-color: oklch(var(--ring) / 0.5);
}

.focus-visible\:ring-white:focus-visible {
  --tw-ring-opacity: 1;
  --tw-ring-color: rgb(255 255 255 / var(--tw-ring-opacity, 1));
}

.focus-visible\:ring-white\/60:focus-visible {
  --tw-ring-color: rgb(255 255 255 / 0.6);
}

.focus-visible\:ring-offset-0:focus-visible {
  --tw-ring-offset-width: 0px;
}

.focus-visible\:ring-offset-1:focus-visible {
  --tw-ring-offset-width: 1px;
}

.focus-visible\:ring-offset-2:focus-visible {
  --tw-ring-offset-width: 2px;
}

.focus-visible\:ring-offset-\[oklch\(var\(--memory-page\)\)\]:focus-visible {
  --tw-ring-offset-color: oklch(var(--memory-page));
}

.focus-visible\:ring-offset-background:focus-visible {
  --tw-ring-offset-color: oklch(var(--background));
}

.focus-visible\:ring-offset-transparent:focus-visible {
  --tw-ring-offset-color: transparent;
}

.active\:scale-95:active {
  --tw-scale-x: .95;
  --tw-scale-y: .95;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.active\:scale-\[0\.98\]:active {
  --tw-scale-x: 0.98;
  --tw-scale-y: 0.98;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.active\:scale-\[0\.99\]:active {
  --tw-scale-x: 0.99;
  --tw-scale-y: 0.99;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.active\:bg-sidebar-accent:active {
  background-color: oklch(var(--sidebar-accent));
}

.active\:bg-white\/25:active {
  background-color: rgb(255 255 255 / 0.25);
}

.active\:text-sidebar-accent-foreground:active {
  color: oklch(var(--sidebar-accent-foreground));
}

.disabled\:pointer-events-none:disabled {
  pointer-events: none;
}

.disabled\:cursor-not-allowed:disabled {
  cursor: not-allowed;
}

.disabled\:opacity-50:disabled {
  opacity: 0.5;
}

.disabled\:opacity-60:disabled {
  opacity: 0.6;
}

.disabled\:hover\:brightness-100:hover:disabled {
  --tw-brightness: brightness(1);
  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);
}

.group\/menu-item:focus-within .group-focus-within\/menu-item\:opacity-100 {
  opacity: 1;
}

.group:hover .group-hover\:translate-y-\[-2px\] {
  --tw-translate-y: -2px;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.group\/caption:hover .group-hover\/caption\:opacity-100 {
  opacity: 1;
}

.group\/menu-item:hover .group-hover\/menu-item\:opacity-100 {
  opacity: 1;
}

.peer\/menu-button:hover ~ .peer-hover\/menu-button\:text-sidebar-accent-foreground {
  color: oklch(var(--sidebar-accent-foreground));
}

.peer:disabled ~ .peer-disabled\:cursor-not-allowed {
  cursor: not-allowed;
}

.peer:disabled ~ .peer-disabled\:opacity-50 {
  opacity: 0.5;
}

.has-\[\>svg\]\:grid-cols-\[calc\(var\(--spacing\)\*4\)_1fr\]:has(>svg) {
  grid-template-columns: calc(var(--spacing) * 4) 1fr;
}

.has-\[\>svg\]\:gap-x-3:has(>svg) {
  -moz-column-gap: 0.75rem;
       column-gap: 0.75rem;
}

.has-\[\>svg\]\:px-2\.5:has(>svg) {
  padding-left: 0.625rem;
  padding-right: 0.625rem;
}

.has-\[\>svg\]\:px-3:has(>svg) {
  padding-left: 0.75rem;
  padding-right: 0.75rem;
}

.has-\[\>svg\]\:px-4:has(>svg) {
  padding-left: 1rem;
  padding-right: 1rem;
}

.aria-disabled\:pointer-events-none[aria-disabled="true"] {
  pointer-events: none;
}

.aria-disabled\:opacity-50[aria-disabled="true"] {
  opacity: 0.5;
}

.aria-selected\:text-muted-foreground[aria-selected="true"] {
  --tw-text-opacity: 1;
  color: oklch(var(--muted-foreground) / var(--tw-text-opacity, 1));
}

.data-\[disabled\=true\]\:pointer-events-none[data-disabled="true"] {
  pointer-events: none;
}

.data-\[disabled\]\:pointer-events-none[data-disabled] {
  pointer-events: none;
}

.data-\[vaul-drawer-direction\=bottom\]\:inset-x-0[data-vaul-drawer-direction="bottom"] {
  left: 0px;
  right: 0px;
}

.data-\[vaul-drawer-direction\=left\]\:inset-y-0[data-vaul-drawer-direction="left"] {
  top: 0px;
  bottom: 0px;
}

.data-\[vaul-drawer-direction\=right\]\:inset-y-0[data-vaul-drawer-direction="right"] {
  top: 0px;
  bottom: 0px;
}

.data-\[vaul-drawer-direction\=top\]\:inset-x-0[data-vaul-drawer-direction="top"] {
  left: 0px;
  right: 0px;
}

.data-\[vaul-drawer-direction\=bottom\]\:bottom-0[data-vaul-drawer-direction="bottom"] {
  bottom: 0px;
}

.data-\[vaul-drawer-direction\=left\]\:left-0[data-vaul-drawer-direction="left"] {
  left: 0px;
}

.data-\[vaul-drawer-direction\=right\]\:right-0[data-vaul-drawer-direction="right"] {
  right: 0px;
}

.data-\[vaul-drawer-direction\=top\]\:top-0[data-vaul-drawer-direction="top"] {
  top: 0px;
}

.data-\[active\=true\]\:z-10[data-active="true"] {
  z-index: 10;
}

.data-\[vaul-drawer-direction\=bottom\]\:mt-24[data-vaul-drawer-direction="bottom"] {
  margin-top: 6rem;
}

.data-\[vaul-drawer-direction\=top\]\:mb-24[data-vaul-drawer-direction="top"] {
  margin-bottom: 6rem;
}

.data-\[orientation\=horizontal\]\:h-1\.5[data-orientation="horizontal"] {
  height: 0.375rem;
}

.data-\[orientation\=horizontal\]\:h-full[data-orientation="horizontal"] {
  height: 100%;
}

.data-\[orientation\=horizontal\]\:h-px[data-orientation="horizontal"] {
  height: 1px;
}

.data-\[orientation\=vertical\]\:h-full[data-orientation="vertical"] {
  height: 100%;
}

.data-\[panel-group-direction\=vertical\]\:h-px[data-panel-group-direction="vertical"] {
  height: 1px;
}

.data-\[size\=default\]\:h-9[data-size="default"] {
  height: 2.25rem;
}

.data-\[size\=sm\]\:h-8[data-size="sm"] {
  height: 2rem;
}

.data-\[vaul-drawer-direction\=bottom\]\:max-h-\[80vh\][data-vaul-drawer-direction="bottom"] {
  max-height: 80vh;
}

.data-\[vaul-drawer-direction\=top\]\:max-h-\[80vh\][data-vaul-drawer-direction="top"] {
  max-height: 80vh;
}

.data-\[orientation\=vertical\]\:min-h-44[data-orientation="vertical"] {
  min-height: 11rem;
}

.data-\[orientation\=horizontal\]\:w-full[data-orientation="horizontal"] {
  width: 100%;
}

.data-\[orientation\=vertical\]\:w-1\.5[data-orientation="vertical"] {
  width: 0.375rem;
}

.data-\[orientation\=vertical\]\:w-auto[data-orientation="vertical"] {
  width: auto;
}

.data-\[orientation\=vertical\]\:w-full[data-orientation="vertical"] {
  width: 100%;
}

.data-\[orientation\=vertical\]\:w-px[data-orientation="vertical"] {
  width: 1px;
}

.data-\[panel-group-direction\=vertical\]\:w-full[data-panel-group-direction="vertical"] {
  width: 100%;
}

.data-\[vaul-drawer-direction\=left\]\:w-3\/4[data-vaul-drawer-direction="left"] {
  width: 75%;
}

.data-\[vaul-drawer-direction\=right\]\:w-3\/4[data-vaul-drawer-direction="right"] {
  width: 75%;
}

.data-\[side\=bottom\]\:translate-y-1[data-side="bottom"] {
  --tw-translate-y: 0.25rem;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.data-\[side\=left\]\:-translate-x-1[data-side="left"] {
  --tw-translate-x: -0.25rem;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.data-\[side\=right\]\:translate-x-1[data-side="right"] {
  --tw-translate-x: 0.25rem;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.data-\[side\=top\]\:-translate-y-1[data-side="top"] {
  --tw-translate-y: -0.25rem;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.data-\[state\=checked\]\:translate-x-\[calc\(100\%-2px\)\][data-state="checked"] {
  --tw-translate-x: calc(100% - 2px);
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.data-\[state\=unchecked\]\:translate-x-0[data-state="unchecked"] {
  --tw-translate-x: 0px;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

@keyframes accordion-up {

  from {
    height: var(--radix-accordion-content-height);
  }

  to {
    height: 0;
  }
}

.data-\[state\=closed\]\:animate-accordion-up[data-state="closed"] {
  animation: accordion-up 0.2s ease-out;
}

@keyframes accordion-down {

  from {
    height: 0;
  }

  to {
    height: var(--radix-accordion-content-height);
  }
}

.data-\[state\=open\]\:animate-accordion-down[data-state="open"] {
  animation: accordion-down 0.2s ease-out;
}

.data-\[orientation\=vertical\]\:flex-col[data-orientation="vertical"] {
  flex-direction: column;
}

.data-\[panel-group-direction\=vertical\]\:flex-col[data-panel-group-direction="vertical"] {
  flex-direction: column;
}

.data-\[range-end\=true\]\:rounded-md[data-range-end="true"] {
  border-radius: calc(var(--radius) - 2px);
}

.data-\[range-middle\=true\]\:rounded-none[data-range-middle="true"] {
  border-radius: 0px;
}

.data-\[range-start\=true\]\:rounded-md[data-range-start="true"] {
  border-radius: calc(var(--radius) - 2px);
}

.data-\[selected\=true\]\:rounded-none[data-selected="true"] {
  border-radius: 0px;
}

.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-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-\[vaul-drawer-direction\=bottom\]\:rounded-t-lg[data-vaul-drawer-direction="bottom"] {
  border-top-left-radius: var(--radius);
  border-top-right-radius: var(--radius);
}

.data-\[vaul-drawer-direction\=top\]\:rounded-b-lg[data-vaul-drawer-direction="top"] {
  border-bottom-right-radius: var(--radius);
  border-bottom-left-radius: var(--radius);
}

.data-\[variant\=outline\]\:border-l-0[data-variant="outline"] {
  border-left-width: 0px;
}

.data-\[vaul-drawer-direction\=bottom\]\:border-t[data-vaul-drawer-direction="bottom"] {
  border-top-width: 1px;
}

.data-\[vaul-drawer-direction\=left\]\:border-r[data-vaul-drawer-direction="left"] {
  border-right-width: 1px;
}

.data-\[vaul-drawer-direction\=right\]\:border-l[data-vaul-drawer-direction="right"] {
  border-left-width: 1px;
}

.data-\[vaul-drawer-direction\=top\]\:border-b[data-vaul-drawer-direction="top"] {
  border-bottom-width: 1px;
}

.data-\[active\=true\]\:border-ring[data-active="true"] {
  --tw-border-opacity: 1;
  border-color: oklch(var(--ring) / var(--tw-border-opacity, 1));
}

.data-\[state\=checked\]\:border-primary[data-state="checked"] {
  --tw-border-opacity: 1;
  border-color: oklch(var(--primary) / var(--tw-border-opacity, 1));
}

.data-\[active\=true\]\:bg-accent\/50[data-active="true"] {
  background-color: oklch(var(--accent) / 0.5);
}

.data-\[active\=true\]\:bg-sidebar-accent[data-active="true"] {
  background-color: oklch(var(--sidebar-accent));
}

.data-\[range-end\=true\]\:bg-primary[data-range-end="true"] {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--primary) / var(--tw-bg-opacity, 1));
}

.data-\[range-middle\=true\]\:bg-accent[data-range-middle="true"] {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--accent) / var(--tw-bg-opacity, 1));
}

.data-\[range-start\=true\]\:bg-primary[data-range-start="true"] {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--primary) / var(--tw-bg-opacity, 1));
}

.data-\[selected-single\=true\]\:bg-primary[data-selected-single="true"] {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--primary) / var(--tw-bg-opacity, 1));
}

.data-\[selected\=true\]\:bg-accent[data-selected="true"] {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--accent) / var(--tw-bg-opacity, 1));
}

.data-\[state\=active\]\:bg-background[data-state="active"] {
  background-color: oklch(var(--background));
}

.data-\[state\=checked\]\:bg-primary[data-state="checked"] {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--primary) / var(--tw-bg-opacity, 1));
}

.data-\[state\=on\]\:bg-accent[data-state="on"] {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--accent) / var(--tw-bg-opacity, 1));
}

.data-\[state\=open\]\:bg-accent[data-state="open"] {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--accent) / var(--tw-bg-opacity, 1));
}

.data-\[state\=open\]\:bg-accent\/50[data-state="open"] {
  background-color: oklch(var(--accent) / 0.5);
}

.data-\[state\=open\]\:bg-secondary[data-state="open"] {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--secondary) / var(--tw-bg-opacity, 1));
}

.data-\[state\=selected\]\:bg-muted[data-state="selected"] {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--muted) / var(--tw-bg-opacity, 1));
}

.data-\[state\=unchecked\]\:bg-input[data-state="unchecked"] {
  background-color: oklch(var(--input));
}

.data-\[inset\]\:pl-8[data-inset] {
  padding-left: 2rem;
}

.data-\[active\=true\]\:font-medium[data-active="true"] {
  font-weight: 500;
}

.data-\[active\=true\]\:text-accent-foreground[data-active="true"] {
  color: oklch(var(--accent-foreground));
}

.data-\[active\=true\]\:text-sidebar-accent-foreground[data-active="true"] {
  color: oklch(var(--sidebar-accent-foreground));
}

.data-\[error\=true\]\:text-destructive[data-error="true"] {
  --tw-text-opacity: 1;
  color: oklch(var(--destructive) / var(--tw-text-opacity, 1));
}

.data-\[placeholder\]\:text-muted-foreground[data-placeholder] {
  --tw-text-opacity: 1;
  color: oklch(var(--muted-foreground) / var(--tw-text-opacity, 1));
}

.data-\[range-end\=true\]\:text-primary-foreground[data-range-end="true"] {
  color: oklch(var(--primary-foreground));
}

.data-\[range-middle\=true\]\:text-accent-foreground[data-range-middle="true"] {
  color: oklch(var(--accent-foreground));
}

.data-\[range-start\=true\]\:text-primary-foreground[data-range-start="true"] {
  color: oklch(var(--primary-foreground));
}

.data-\[selected-single\=true\]\:text-primary-foreground[data-selected-single="true"] {
  color: oklch(var(--primary-foreground));
}

.data-\[selected\=true\]\:text-accent-foreground[data-selected="true"] {
  color: oklch(var(--accent-foreground));
}

.data-\[state\=checked\]\:text-primary-foreground[data-state="checked"] {
  color: oklch(var(--primary-foreground));
}

.data-\[state\=on\]\:text-accent-foreground[data-state="on"] {
  color: oklch(var(--accent-foreground));
}

.data-\[state\=open\]\:text-accent-foreground[data-state="open"] {
  color: oklch(var(--accent-foreground));
}

.data-\[state\=open\]\:text-muted-foreground[data-state="open"] {
  --tw-text-opacity: 1;
  color: oklch(var(--muted-foreground) / var(--tw-text-opacity, 1));
}

.data-\[variant\=destructive\]\:text-destructive[data-variant="destructive"] {
  --tw-text-opacity: 1;
  color: oklch(var(--destructive) / var(--tw-text-opacity, 1));
}

.data-\[disabled\=true\]\:opacity-50[data-disabled="true"] {
  opacity: 0.5;
}

.data-\[disabled\]\:opacity-50[data-disabled] {
  opacity: 0.5;
}

.data-\[state\=open\]\:opacity-100[data-state="open"] {
  opacity: 1;
}

.data-\[state\=active\]\:shadow-sm[data-state="active"] {
  --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
  --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}

.data-\[variant\=outline\]\:shadow-xs[data-variant="outline"] {
  --tw-shadow: 0 1px 2px 0 rgba(0,0,0,0.05);
  --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}

.data-\[active\=true\]\:ring-\[3px\][data-active="true"] {
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);
  box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
}

.data-\[active\=true\]\:ring-ring\/50[data-active="true"] {
  --tw-ring-color: oklch(var(--ring) / 0.5);
}

.data-\[state\=closed\]\:duration-300[data-state="closed"] {
  transition-duration: 300ms;
}

.data-\[state\=open\]\:duration-500[data-state="open"] {
  transition-duration: 500ms;
}

.data-\[motion\^\=from-\]\:animate-in[data-motion^="from-"] {
  animation-name: enter;
  animation-duration: 150ms;
  --tw-enter-opacity: initial;
  --tw-enter-scale: initial;
  --tw-enter-rotate: initial;
  --tw-enter-translate-x: initial;
  --tw-enter-translate-y: initial;
}

.data-\[state\=open\]\:animate-in[data-state="open"] {
  animation-name: enter;
  animation-duration: 150ms;
  --tw-enter-opacity: initial;
  --tw-enter-scale: initial;
  --tw-enter-rotate: initial;
  --tw-enter-translate-x: initial;
  --tw-enter-translate-y: initial;
}

.data-\[state\=visible\]\:animate-in[data-state="visible"] {
  animation-name: enter;
  animation-duration: 150ms;
  --tw-enter-opacity: initial;
  --tw-enter-scale: initial;
  --tw-enter-rotate: initial;
  --tw-enter-translate-x: initial;
  --tw-enter-translate-y: initial;
}

.data-\[motion\^\=to-\]\:animate-out[data-motion^="to-"] {
  animation-name: exit;
  animation-duration: 150ms;
  --tw-exit-opacity: initial;
  --tw-exit-scale: initial;
  --tw-exit-rotate: initial;
  --tw-exit-translate-x: initial;
  --tw-exit-translate-y: initial;
}

.data-\[state\=closed\]\:animate-out[data-state="closed"] {
  animation-name: exit;
  animation-duration: 150ms;
  --tw-exit-opacity: initial;
  --tw-exit-scale: initial;
  --tw-exit-rotate: initial;
  --tw-exit-translate-x: initial;
  --tw-exit-translate-y: initial;
}

.data-\[state\=hidden\]\:animate-out[data-state="hidden"] {
  animation-name: exit;
  animation-duration: 150ms;
  --tw-exit-opacity: initial;
  --tw-exit-scale: initial;
  --tw-exit-rotate: initial;
  --tw-exit-translate-x: initial;
  --tw-exit-translate-y: initial;
}

.data-\[motion\^\=from-\]\:fade-in[data-motion^="from-"] {
  --tw-enter-opacity: 0;
}

.data-\[motion\^\=to-\]\:fade-out[data-motion^="to-"] {
  --tw-exit-opacity: 0;
}

.data-\[state\=closed\]\:fade-out-0[data-state="closed"] {
  --tw-exit-opacity: 0;
}

.data-\[state\=hidden\]\:fade-out[data-state="hidden"] {
  --tw-exit-opacity: 0;
}

.data-\[state\=open\]\:fade-in-0[data-state="open"] {
  --tw-enter-opacity: 0;
}

.data-\[state\=visible\]\:fade-in[data-state="visible"] {
  --tw-enter-opacity: 0;
}

.data-\[state\=closed\]\:zoom-out-95[data-state="closed"] {
  --tw-exit-scale: .95;
}

.data-\[state\=open\]\:zoom-in-90[data-state="open"] {
  --tw-enter-scale: .9;
}

.data-\[state\=open\]\:zoom-in-95[data-state="open"] {
  --tw-enter-scale: .95;
}

.data-\[motion\=from-end\]\:slide-in-from-right-52[data-motion="from-end"] {
  --tw-enter-translate-x: 13rem;
}

.data-\[motion\=from-start\]\:slide-in-from-left-52[data-motion="from-start"] {
  --tw-enter-translate-x: -13rem;
}

.data-\[motion\=to-end\]\:slide-out-to-right-52[data-motion="to-end"] {
  --tw-exit-translate-x: 13rem;
}

.data-\[motion\=to-start\]\:slide-out-to-left-52[data-motion="to-start"] {
  --tw-exit-translate-x: -13rem;
}

.data-\[side\=bottom\]\:slide-in-from-top-2[data-side="bottom"] {
  --tw-enter-translate-y: -0.5rem;
}

.data-\[side\=left\]\:slide-in-from-right-2[data-side="left"] {
  --tw-enter-translate-x: 0.5rem;
}

.data-\[side\=right\]\:slide-in-from-left-2[data-side="right"] {
  --tw-enter-translate-x: -0.5rem;
}

.data-\[side\=top\]\:slide-in-from-bottom-2[data-side="top"] {
  --tw-enter-translate-y: 0.5rem;
}

.data-\[state\=closed\]\:slide-out-to-bottom[data-state="closed"] {
  --tw-exit-translate-y: 100%;
}

.data-\[state\=closed\]\:slide-out-to-left[data-state="closed"] {
  --tw-exit-translate-x: -100%;
}

.data-\[state\=closed\]\:slide-out-to-right[data-state="closed"] {
  --tw-exit-translate-x: 100%;
}

.data-\[state\=closed\]\:slide-out-to-top[data-state="closed"] {
  --tw-exit-translate-y: -100%;
}

.data-\[state\=open\]\:slide-in-from-bottom[data-state="open"] {
  --tw-enter-translate-y: 100%;
}

.data-\[state\=open\]\:slide-in-from-left[data-state="open"] {
  --tw-enter-translate-x: -100%;
}

.data-\[state\=open\]\:slide-in-from-right[data-state="open"] {
  --tw-enter-translate-x: 100%;
}

.data-\[state\=open\]\:slide-in-from-top[data-state="open"] {
  --tw-enter-translate-y: -100%;
}

.data-\[state\=closed\]\:duration-300[data-state="closed"] {
  animation-duration: 300ms;
}

.data-\[state\=open\]\:duration-500[data-state="open"] {
  animation-duration: 500ms;
}

.\*\:data-\[slot\=select-value\]\:line-clamp-1[data-slot="select-value"] > * {
  overflow: hidden;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 1;
}

.\*\:data-\[slot\=select-value\]\:flex[data-slot="select-value"] > * {
  display: flex;
}

.\*\:data-\[slot\=select-value\]\:items-center[data-slot="select-value"] > * {
  align-items: center;
}

.\*\:data-\[slot\=select-value\]\:gap-2[data-slot="select-value"] > * {
  gap: 0.5rem;
}

.\*\:data-\[slot\=alert-description\]\:text-destructive\/90[data-slot="alert-description"] > * {
  color: oklch(var(--destructive) / 0.9);
}

.data-\[panel-group-direction\=vertical\]\:after\:left-0[data-panel-group-direction="vertical"]::after {
  content: var(--tw-content);
  left: 0px;
}

.data-\[panel-group-direction\=vertical\]\:after\:h-1[data-panel-group-direction="vertical"]::after {
  content: var(--tw-content);
  height: 0.25rem;
}

.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-y-1\/2[data-panel-group-direction="vertical"]::after {
  content: var(--tw-content);
  --tw-translate-y: -50%;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.data-\[panel-group-direction\=vertical\]\:after\:translate-x-0[data-panel-group-direction="vertical"]::after {
  content: var(--tw-content);
  --tw-translate-x: 0px;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.data-\[variant\=outline\]\:first\:border-l:first-child[data-variant="outline"] {
  border-left-width: 1px;
}

.data-\[active\=true\]\:hover\:bg-accent:hover[data-active="true"] {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--accent) / var(--tw-bg-opacity, 1));
}

.data-\[state\=open\]\:hover\:bg-accent:hover[data-state="open"] {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--accent) / var(--tw-bg-opacity, 1));
}

.data-\[state\=open\]\:hover\:bg-sidebar-accent:hover[data-state="open"] {
  background-color: oklch(var(--sidebar-accent));
}

.data-\[state\=open\]\:hover\:text-sidebar-accent-foreground:hover[data-state="open"] {
  color: oklch(var(--sidebar-accent-foreground));
}

.data-\[active\=true\]\:focus\:bg-accent:focus[data-active="true"] {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--accent) / var(--tw-bg-opacity, 1));
}

.data-\[state\=open\]\:focus\:bg-accent:focus[data-state="open"] {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--accent) / var(--tw-bg-opacity, 1));
}

.data-\[variant\=destructive\]\:focus\:bg-destructive\/10:focus[data-variant="destructive"] {
  background-color: oklch(var(--destructive) / 0.1);
}

.data-\[variant\=destructive\]\:focus\:text-destructive:focus[data-variant="destructive"] {
  --tw-text-opacity: 1;
  color: oklch(var(--destructive) / var(--tw-text-opacity, 1));
}

.group[data-disabled="true"] .group-data-\[disabled\=true\]\:pointer-events-none {
  pointer-events: none;
}

.group\/day[data-focused="true"] .group-data-\[focused\=true\]\/day\:relative {
  position: relative;
}

.group[data-collapsible="offcanvas"] .group-data-\[collapsible\=offcanvas\]\:left-\[calc\(var\(--sidebar-width\)\*-1\)\] {
  left: calc(var(--sidebar-width) * -1);
}

.group[data-collapsible="offcanvas"] .group-data-\[collapsible\=offcanvas\]\:right-\[calc\(var\(--sidebar-width\)\*-1\)\] {
  right: calc(var(--sidebar-width) * -1);
}

.group[data-side="left"] .group-data-\[side\=left\]\:-right-4 {
  right: -1rem;
}

.group[data-side="right"] .group-data-\[side\=right\]\:left-0 {
  left: 0px;
}

.group\/navigation-menu[data-viewport="false"] .group-data-\[viewport\=false\]\/navigation-menu\:top-full {
  top: 100%;
}

.group\/day[data-focused="true"] .group-data-\[focused\=true\]\/day\:z-10 {
  z-index: 10;
}

.group[data-collapsible="icon"] .group-data-\[collapsible\=icon\]\:-mt-8 {
  margin-top: -2rem;
}

.group\/navigation-menu[data-viewport="false"] .group-data-\[viewport\=false\]\/navigation-menu\:mt-1\.5 {
  margin-top: 0.375rem;
}

.group\/drawer-content[data-vaul-drawer-direction="bottom"] .group-data-\[vaul-drawer-direction\=bottom\]\/drawer-content\:block {
  display: block;
}

.group[data-collapsible="icon"] .group-data-\[collapsible\=icon\]\:hidden {
  display: none;
}

.group[data-collapsible="icon"] .group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)\+\(--spacing\(4\)\)\)\] {
  width: calc(var(--sidebar-width-icon) + (--spacing(4)));
}

.group[data-collapsible="icon"] .group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)\+\(--spacing\(4\)\)\+2px\)\] {
  width: calc(var(--sidebar-width-icon) + (--spacing(4)) + 2px);
}

.group[data-collapsible="offcanvas"] .group-data-\[collapsible\=offcanvas\]\:w-0 {
  width: 0px;
}

.group[data-collapsible="offcanvas"] .group-data-\[collapsible\=offcanvas\]\:translate-x-0 {
  --tw-translate-x: 0px;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.group[data-side="right"] .group-data-\[side\=right\]\:rotate-180 {
  --tw-rotate: 180deg;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.group[data-state="open"] .group-data-\[state\=open\]\:rotate-180 {
  --tw-rotate: 180deg;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.group[data-collapsible="icon"] .group-data-\[collapsible\=icon\]\:overflow-hidden {
  overflow: hidden;
}

.group\/navigation-menu[data-viewport="false"] .group-data-\[viewport\=false\]\/navigation-menu\:overflow-hidden {
  overflow: hidden;
}

.group[data-variant="floating"] .group-data-\[variant\=floating\]\:rounded-lg {
  border-radius: var(--radius);
}

.group\/navigation-menu[data-viewport="false"] .group-data-\[viewport\=false\]\/navigation-menu\:rounded-md {
  border-radius: calc(var(--radius) - 2px);
}

.group[data-variant="floating"] .group-data-\[variant\=floating\]\:border {
  border-width: 1px;
}

.group\/navigation-menu[data-viewport="false"] .group-data-\[viewport\=false\]\/navigation-menu\:border {
  border-width: 1px;
}

.group[data-side="left"] .group-data-\[side\=left\]\:border-r {
  border-right-width: 1px;
}

.group[data-side="right"] .group-data-\[side\=right\]\:border-l {
  border-left-width: 1px;
}

.group\/day[data-focused="true"] .group-data-\[focused\=true\]\/day\:border-ring {
  --tw-border-opacity: 1;
  border-color: oklch(var(--ring) / var(--tw-border-opacity, 1));
}

.group[data-variant="floating"] .group-data-\[variant\=floating\]\:border-sidebar-border {
  border-color: oklch(var(--sidebar-border));
}

.group\/navigation-menu[data-viewport="false"] .group-data-\[viewport\=false\]\/navigation-menu\:bg-popover {
  background-color: oklch(var(--popover));
}

.group\/drawer-content[data-vaul-drawer-direction="bottom"] .group-data-\[vaul-drawer-direction\=bottom\]\/drawer-content\:text-center {
  text-align: center;
}

.group\/drawer-content[data-vaul-drawer-direction="top"] .group-data-\[vaul-drawer-direction\=top\]\/drawer-content\:text-center {
  text-align: center;
}

.group\/navigation-menu[data-viewport="false"] .group-data-\[viewport\=false\]\/navigation-menu\:text-popover-foreground {
  color: oklch(var(--popover-foreground));
}

.group[data-collapsible="icon"] .group-data-\[collapsible\=icon\]\:opacity-0 {
  opacity: 0;
}

.group[data-disabled="true"] .group-data-\[disabled\=true\]\:opacity-50 {
  opacity: 0.5;
}

.group[data-variant="floating"] .group-data-\[variant\=floating\]\:shadow-sm {
  --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
  --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}

.group\/navigation-menu[data-viewport="false"] .group-data-\[viewport\=false\]\/navigation-menu\:shadow {
  --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
  --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}

.group\/day[data-focused="true"] .group-data-\[focused\=true\]\/day\:ring-\[3px\] {
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);
  box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
}

.group\/day[data-focused="true"] .group-data-\[focused\=true\]\/day\:ring-ring\/50 {
  --tw-ring-color: oklch(var(--ring) / 0.5);
}

.group\/navigation-menu[data-viewport="false"] .group-data-\[viewport\=false\]\/navigation-menu\:duration-200 {
  transition-duration: 200ms;
  animation-duration: 200ms;
}

.group[data-collapsible="offcanvas"] .group-data-\[collapsible\=offcanvas\]\:after\:left-full::after {
  content: var(--tw-content);
  left: 100%;
}

.group[data-collapsible="offcanvas"] .hover\:group-data-\[collapsible\=offcanvas\]\:bg-sidebar:hover {
  background-color: oklch(var(--sidebar));
}

.group\/navigation-menu[data-viewport="false"] .group-data-\[viewport\=false\]\/navigation-menu\:data-\[state\=open\]\:animate-in[data-state="open"] {
  animation-name: enter;
  animation-duration: 150ms;
  --tw-enter-opacity: initial;
  --tw-enter-scale: initial;
  --tw-enter-rotate: initial;
  --tw-enter-translate-x: initial;
  --tw-enter-translate-y: initial;
}

.group\/navigation-menu[data-viewport="false"] .group-data-\[viewport\=false\]\/navigation-menu\:data-\[state\=closed\]\:animate-out[data-state="closed"] {
  animation-name: exit;
  animation-duration: 150ms;
  --tw-exit-opacity: initial;
  --tw-exit-scale: initial;
  --tw-exit-rotate: initial;
  --tw-exit-translate-x: initial;
  --tw-exit-translate-y: initial;
}

.group\/navigation-menu[data-viewport="false"] .group-data-\[viewport\=false\]\/navigation-menu\:data-\[state\=closed\]\:fade-out-0[data-state="closed"] {
  --tw-exit-opacity: 0;
}

.group\/navigation-menu[data-viewport="false"] .group-data-\[viewport\=false\]\/navigation-menu\:data-\[state\=open\]\:fade-in-0[data-state="open"] {
  --tw-enter-opacity: 0;
}

.group\/navigation-menu[data-viewport="false"] .group-data-\[viewport\=false\]\/navigation-menu\:data-\[state\=closed\]\:zoom-out-95[data-state="closed"] {
  --tw-exit-scale: .95;
}

.group\/navigation-menu[data-viewport="false"] .group-data-\[viewport\=false\]\/navigation-menu\:data-\[state\=open\]\:zoom-in-95[data-state="open"] {
  --tw-enter-scale: .95;
}

.peer\/menu-button[data-size="default"] ~ .peer-data-\[size\=default\]\/menu-button\:top-1\.5 {
  top: 0.375rem;
}

.peer\/menu-button[data-size="lg"] ~ .peer-data-\[size\=lg\]\/menu-button\:top-2\.5 {
  top: 0.625rem;
}

.peer\/menu-button[data-size="sm"] ~ .peer-data-\[size\=sm\]\/menu-button\:top-1 {
  top: 0.25rem;
}

.peer\/menu-button[data-active="true"] ~ .peer-data-\[active\=true\]\/menu-button\:text-sidebar-accent-foreground {
  color: oklch(var(--sidebar-accent-foreground));
}

.dark\:border-input:is(.dark *) {
  border-color: oklch(var(--input));
}

.dark\:bg-destructive\/60:is(.dark *) {
  background-color: oklch(var(--destructive) / 0.6);
}

.dark\:text-muted-foreground:is(.dark *) {
  --tw-text-opacity: 1;
  color: oklch(var(--muted-foreground) / var(--tw-text-opacity, 1));
}

.dark\:hover\:bg-accent\/50:hover:is(.dark *) {
  background-color: oklch(var(--accent) / 0.5);
}

.dark\:hover\:text-accent-foreground:hover:is(.dark *) {
  color: oklch(var(--accent-foreground));
}

.dark\:focus-visible\:ring-destructive\/40:focus-visible:is(.dark *) {
  --tw-ring-color: oklch(var(--destructive) / 0.4);
}

.dark\:data-\[state\=active\]\:border-input[data-state="active"]:is(.dark *) {
  border-color: oklch(var(--input));
}

.dark\:data-\[state\=checked\]\:bg-primary[data-state="checked"]:is(.dark *) {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--primary) / var(--tw-bg-opacity, 1));
}

.dark\:data-\[state\=checked\]\:bg-primary-foreground[data-state="checked"]:is(.dark *) {
  background-color: oklch(var(--primary-foreground));
}

.dark\:data-\[state\=unchecked\]\:bg-foreground[data-state="unchecked"]:is(.dark *) {
  background-color: oklch(var(--foreground));
}

.dark\:data-\[state\=active\]\:text-foreground[data-state="active"]:is(.dark *) {
  color: oklch(var(--foreground));
}

.dark\:data-\[variant\=destructive\]\:focus\:bg-destructive\/20:focus[data-variant="destructive"]:is(.dark *) {
  background-color: oklch(var(--destructive) / 0.2);
}

@media (min-width: 640px) {

  .sm\:-mx-6 {
    margin-left: -1.5rem;
    margin-right: -1.5rem;
  }

  .sm\:block {
    display: block;
  }

  .sm\:flex {
    display: flex;
  }

  .sm\:h-96 {
    height: 24rem;
  }

  .sm\:w-20 {
    width: 5rem;
  }

  .sm\:w-24 {
    width: 6rem;
  }

  .sm\:w-\[calc\(100\%\+3rem\)\] {
    width: calc(100% + 3rem);
  }

  .sm\:max-w-\[360px\] {
    max-width: 360px;
  }

  .sm\:max-w-lg {
    max-width: 32rem;
  }

  .sm\:max-w-sm {
    max-width: 24rem;
  }

  .sm\:grid-cols-2 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .sm\:flex-row {
    flex-direction: row;
  }

  .sm\:items-center {
    align-items: center;
  }

  .sm\:justify-end {
    justify-content: flex-end;
  }

  .sm\:justify-between {
    justify-content: space-between;
  }

  .sm\:gap-2\.5 {
    gap: 0.625rem;
  }

  .sm\:gap-6 {
    gap: 1.5rem;
  }

  .sm\:self-auto {
    align-self: auto;
  }

  .sm\:px-6 {
    padding-left: 1.5rem;
    padding-right: 1.5rem;
  }

  .sm\:pl-2\.5 {
    padding-left: 0.625rem;
  }

  .sm\:pr-2\.5 {
    padding-right: 0.625rem;
  }

  .sm\:text-left {
    text-align: left;
  }

  .sm\:text-3xl {
    font-size: 1.875rem;
    line-height: 2.25rem;
  }

  .sm\:text-4xl {
    font-size: 2.25rem;
    line-height: 2.5rem;
  }

  .sm\:text-5xl {
    font-size: 3rem;
    line-height: 1;
  }

  .sm\:text-lg {
    font-size: 1.125rem;
    line-height: 1.75rem;
  }

  .data-\[vaul-drawer-direction\=left\]\:sm\:max-w-sm[data-vaul-drawer-direction="left"] {
    max-width: 24rem;
  }

  .data-\[vaul-drawer-direction\=right\]\:sm\:max-w-sm[data-vaul-drawer-direction="right"] {
    max-width: 24rem;
  }
}

@media (min-width: 768px) {

  .md\:absolute {
    position: absolute;
  }

  .md\:block {
    display: block;
  }

  .md\:flex {
    display: flex;
  }

  .md\:w-\[var\(--radix-navigation-menu-viewport-width\)\] {
    width: var(--radix-navigation-menu-viewport-width);
  }

  .md\:w-auto {
    width: auto;
  }

  .md\:flex-row {
    flex-direction: row;
  }

  .md\:gap-1\.5 {
    gap: 0.375rem;
  }

  .md\:text-left {
    text-align: left;
  }

  .md\:text-sm {
    font-size: 0.875rem;
    line-height: 1.25rem;
  }

  .md\:opacity-0 {
    opacity: 0;
  }

  .md\:after\:hidden::after {
    content: var(--tw-content);
    display: none;
  }

  .peer[data-variant="inset"] ~ .md\:peer-data-\[variant\=inset\]\:m-2 {
    margin: 0.5rem;
  }

  .peer[data-variant="inset"] ~ .md\:peer-data-\[variant\=inset\]\:ml-0 {
    margin-left: 0px;
  }

  .peer[data-variant="inset"][data-state="collapsed"] ~ .md\:peer-data-\[variant\=inset\]\:peer-data-\[state\=collapsed\]\:ml-2 {
    margin-left: 0.5rem;
  }

  .peer[data-variant="inset"] ~ .md\:peer-data-\[variant\=inset\]\:rounded-xl {
    border-radius: 0.75rem;
  }

  .peer[data-variant="inset"] ~ .md\:peer-data-\[variant\=inset\]\:shadow-sm {
    --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
    --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
    box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
  }
}

.\[\&\: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: 0px;
}

.\[\&\: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);
}

.\[\&\>\[role\=checkbox\]\]\:translate-y-\[2px\]>[role=checkbox] {
  --tw-translate-y: 2px;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.\[\&\>button\]\:hidden>button {
  display: none;
}

.\[\&\>span\:last-child\]\:truncate>span:last-child {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.\[\&\>span\]\:text-xs>span {
  font-size: 0.75rem;
  line-height: 1rem;
}

.\[\&\>span\]\:opacity-70>span {
  opacity: 0.7;
}

.\[\&\>svg\]\:pointer-events-none>svg {
  pointer-events: none;
}

.\[\&\>svg\]\:size-3>svg {
  width: 0.75rem;
  height: 0.75rem;
}

.\[\&\>svg\]\:size-3\.5>svg {
  width: 0.875rem;
  height: 0.875rem;
}

.\[\&\>svg\]\:size-4>svg {
  width: 1rem;
  height: 1rem;
}

.\[\&\>svg\]\:h-2\.5>svg {
  height: 0.625rem;
}

.\[\&\>svg\]\:h-3>svg {
  height: 0.75rem;
}

.\[\&\>svg\]\:w-2\.5>svg {
  width: 0.625rem;
}

.\[\&\>svg\]\:w-3>svg {
  width: 0.75rem;
}

.\[\&\>svg\]\:shrink-0>svg {
  flex-shrink: 0;
}

.\[\&\>svg\]\:translate-y-0\.5>svg {
  --tw-translate-y: 0.125rem;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.\[\&\>svg\]\:text-current>svg {
  color: currentColor;
}

.\[\&\>svg\]\:text-muted-foreground>svg {
  --tw-text-opacity: 1;
  color: oklch(var(--muted-foreground) / var(--tw-text-opacity, 1));
}

.\[\&\>svg\]\:text-sidebar-accent-foreground>svg {
  color: oklch(var(--sidebar-accent-foreground));
}

.\[\&\>tr\]\:last\:border-b-0:last-child>tr {
  border-bottom-width: 0px;
}

.\[\&\[data-panel-group-direction\=vertical\]\>div\]\:rotate-90[data-panel-group-direction=vertical]>div {
  --tw-rotate: 90deg;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg {
  --tw-rotate: 180deg;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.\[\&_\.recharts-cartesian-axis-tick_text\]\:fill-muted-foreground .recharts-cartesian-axis-tick text {
  fill: oklch(var(--muted-foreground) / 1);
}

.\[\&_\.recharts-curve\.recharts-tooltip-cursor\]\:stroke-border .recharts-curve.recharts-tooltip-cursor {
  stroke: oklch(var(--border));
}

.\[\&_\.recharts-dot\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-dot[stroke='#fff'] {
  stroke: transparent;
}

.\[\&_\.recharts-polar-grid_\[stroke\=\'\#ccc\'\]\]\:stroke-border .recharts-polar-grid [stroke='#ccc'] {
  stroke: oklch(var(--border));
}

.\[\&_\.recharts-radial-bar-background-sector\]\:fill-muted .recharts-radial-bar-background-sector {
  fill: oklch(var(--muted) / 1);
}

.\[\&_\.recharts-rectangle\.recharts-tooltip-cursor\]\:fill-muted .recharts-rectangle.recharts-tooltip-cursor {
  fill: oklch(var(--muted) / 1);
}

.\[\&_\.recharts-reference-line_\[stroke\=\'\#ccc\'\]\]\:stroke-border .recharts-reference-line [stroke='#ccc'] {
  stroke: oklch(var(--border));
}

.\[\&_\.recharts-sector\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-sector[stroke='#fff'] {
  stroke: transparent;
}

.\[\&_\[cmdk-group-heading\]\]\:px-2 [cmdk-group-heading] {
  padding-left: 0.5rem;
  padding-right: 0.5rem;
}

.\[\&_\[cmdk-group-heading\]\]\:py-1\.5 [cmdk-group-heading] {
  padding-top: 0.375rem;
  padding-bottom: 0.375rem;
}

.\[\&_\[cmdk-group-heading\]\]\:text-xs [cmdk-group-heading] {
  font-size: 0.75rem;
  line-height: 1rem;
}

.\[\&_\[cmdk-group-heading\]\]\:font-medium [cmdk-group-heading] {
  font-weight: 500;
}

.\[\&_\[cmdk-group-heading\]\]\:text-muted-foreground [cmdk-group-heading] {
  --tw-text-opacity: 1;
  color: oklch(var(--muted-foreground) / var(--tw-text-opacity, 1));
}

.\[\&_\[cmdk-group\]\:not\(\[hidden\]\)_\~\[cmdk-group\]\]\:pt-0 [cmdk-group]:not([hidden]) ~[cmdk-group] {
  padding-top: 0px;
}

.\[\&_\[cmdk-group\]\]\:px-2 [cmdk-group] {
  padding-left: 0.5rem;
  padding-right: 0.5rem;
}

.\[\&_\[cmdk-input-wrapper\]_svg\]\:h-5 [cmdk-input-wrapper] svg {
  height: 1.25rem;
}

.\[\&_\[cmdk-input-wrapper\]_svg\]\:w-5 [cmdk-input-wrapper] svg {
  width: 1.25rem;
}

.\[\&_\[cmdk-input\]\]\:h-12 [cmdk-input] {
  height: 3rem;
}

.\[\&_\[cmdk-item\]\]\:px-2 [cmdk-item] {
  padding-left: 0.5rem;
  padding-right: 0.5rem;
}

.\[\&_\[cmdk-item\]\]\:py-3 [cmdk-item] {
  padding-top: 0.75rem;
  padding-bottom: 0.75rem;
}

.\[\&_\[cmdk-item\]_svg\]\:h-5 [cmdk-item] svg {
  height: 1.25rem;
}

.\[\&_\[cmdk-item\]_svg\]\:w-5 [cmdk-item] svg {
  width: 1.25rem;
}

.\[\&_button\:hover\]\:shadow-2xl button:hover {
  --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);
  --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}

.\[\&_button\:hover\]\:shadow-black\/50 button:hover {
  --tw-shadow-color: rgb(0 0 0 / 0.5);
  --tw-shadow: var(--tw-shadow-colored);
}

.\[\&_button\]\:size-16 button {
  width: 4rem;
  height: 4rem;
}

.\[\&_button\]\:shadow-xl button {
  --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
  --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}

.\[\&_button\]\:shadow-black\/40 button {
  --tw-shadow-color: rgb(0 0 0 / 0.4);
  --tw-shadow: var(--tw-shadow-colored);
}

.\[\&_button_svg\]\:size-7 button svg {
  width: 1.75rem;
  height: 1.75rem;
}

.\[\&_p\]\:leading-relaxed p {
  line-height: 1.625;
}

.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*='size-']) {
  width: 1rem;
  height: 1rem;
}

.\[\&_svg\:not\(\[class\*\=\'text-\'\]\)\]\:text-muted-foreground svg:not([class*='text-']) {
  --tw-text-opacity: 1;
  color: oklch(var(--muted-foreground) / var(--tw-text-opacity, 1));
}

.\[\&_svg\]\:pointer-events-none svg {
  pointer-events: none;
}

.\[\&_svg\]\:hidden svg {
  display: none;
}

.\[\&_svg\]\:size-5 svg {
  width: 1.25rem;
  height: 1.25rem;
}

.\[\&_svg\]\:shrink-0 svg {
  flex-shrink: 0;
}

.\[\&_svg\]\:text-foreground svg {
  color: oklch(var(--foreground));
}

.\[\&_tr\:last-child\]\:border-0 tr:last-child {
  border-width: 0px;
}

.\[\&_tr\]\:border-b tr {
  border-bottom-width: 1px;
}

[data-side=left][data-collapsible=offcanvas] .\[\[data-side\=left\]\[data-collapsible\=offcanvas\]_\&\]\:-right-2 {
  right: -0.5rem;
}

[data-side=left][data-state=collapsed] .\[\[data-side\=left\]\[data-state\=collapsed\]_\&\]\:cursor-e-resize {
  cursor: e-resize;
}

[data-side=right][data-collapsible=offcanvas] .\[\[data-side\=right\]\[data-collapsible\=offcanvas\]_\&\]\:-left-2 {
  left: -0.5rem;
}

[data-side=right][data-state=collapsed] .\[\[data-side\=right\]\[data-state\=collapsed\]_\&\]\:cursor-w-resize {
  cursor: w-resize;
}

[data-slot=card-content] .\[\[data-slot\=card-content\]_\&\]\:bg-transparent {
  background-color: transparent;
}

[data-slot=popover-content] .\[\[data-slot\=popover-content\]_\&\]\:bg-transparent {
  background-color: transparent;
}

a.\[a\&\]\:hover\:bg-accent:hover {
  --tw-bg-opacity: 1;
  background-color: oklch(var(--accent) / var(--tw-bg-opacity, 1));
}

a.\[a\&\]\:hover\:bg-destructive\/90:hover {
  background-color: oklch(var(--destructive) / 0.9);
}

a.\[a\&\]\:hover\:bg-primary\/90:hover {
  background-color: oklch(var(--primary) / 0.9);
}

a.\[a\&\]\:hover\:bg-secondary\/90:hover {
  background-color: oklch(var(--secondary) / 0.9);
}

a.\[a\&\]\:hover\:text-accent-foreground:hover {
  color: oklch(var(--accent-foreground));
}
