@layer ui-reset, ui;

/* loading */
@layer ui {
  :root, :host {
    --ui-loading: url("data:image/svg+xml,%3Csvg fill='none' height='24' width='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cstyle%3E g %7B animation: rotate 2s linear infinite; transform-origin: center center; %7D circle %7B stroke-dasharray: 75,100; stroke-dashoffset: -5; animation: dash 1.5s ease-in-out infinite; stroke-linecap: round; %7D @keyframes rotate %7B 0%25 %7B transform: rotate(0deg); %7D 100%25 %7B transform: rotate(360deg); %7D %7D @keyframes dash %7B 0%25 %7B stroke-dasharray: 1,100; stroke-dashoffset: 0; %7D 50%25 %7B stroke-dasharray: 44.5,100; stroke-dashoffset: -17.5; %7D 100%25 %7B stroke-dasharray: 44.5,100; stroke-dashoffset: -62; %7D %7D %3C/style%3E%3Cg%3E%3Ccircle cx='12' cy='12' r='10' fill='none' stroke='white' stroke-width='4' /%3E%3C/g%3E%3C/svg%3E");
  }

  :where(:not(button)[aria-busy]:not([aria-busy="false"])):before {
    content: "";
    mask-image: var(--ui-loading);
    aspect-ratio: 1;
    background-color: currentColor;
    width: 1lh;
    display: inline-block;
    mask-size: 1lh;
    mask-repeat: no-repeat;
  }
}

/* text-field */
@layer ui {
  input[type="text"], input[type="email"], input[type="search"], input[type="password"], input[type="number"], input[type="tel"], input[type="url"], input[type="date"], input[type="time"], input[type="datetime-local"], input[type="month"], input[type="week"], input:not([type]) {
    appearance: none;
    background-color: var(--bg, transparent);
    box-shadow: 0 0 0 1px var(--border-color, var(--ui-neutral-300)) inset;
    padding-block: var(--ui-spacing-2);
    padding-inline: calc(var(--ui-spacing-3) * clamp(1, var(--ui-rounded-scale) * .75, 1.3));
    border-radius: var(--ui-rounded-3);
    font: inherit;
    transition: padding-inline-start var(--ease-glide-2);
    border: none;
    line-height: 1.14286rem;

    @media (width < 600px) {
      font-size: 16px;
    }

    &:focus-visible {
      outline: none;
      box-shadow: inset 0 0 0 1px;
    }
  }

  label:has([data-suffix]) input[type="search"]::-webkit-search-cancel-button {
    display: none;
  }

  input[type="search"]::-webkit-search-cancel-button {
    appearance: none;
    cursor: pointer;
    background-color: var(--ui-neutral-400);
    width: 1em;
    height: 1em;
    mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M18 6l-12 12'/%3E%3Cpath d='M6 6l12 12'/%3E%3C/svg%3E");
    mask-position: center;
    mask-size: contain;
    mask-repeat: no-repeat;
  }

  label:not(.toggle):has( > [data-prefix],  > [data-suffix]) {
    cursor: text;
    grid-template-columns: auto 1fr auto auto;
    align-items: center;
    display: grid;

    & > input:is([type="text"], [type="email"], [type="search"], [type="password"], [type="number"], [type="tel"], [type="url"], :not([type])) {
      grid-area: 1 / 1 / auto / -1;
    }

    & > [data-prefix], & > [data-suffix] {
      z-index: 1;
      grid-row: 1;
      position: relative;
    }

    & > [data-prefix]:not(button), & > [data-suffix]:not(button) {
      color: var(--ui-neutral-600);
    }

    & > [data-prefix] {
      margin-inline: var(--ui-spacing-3) var(--ui-spacing-2);
      transition: opacity var(--ease-glide-2);
      grid-column: 1;
    }

    & > [data-suffix]:last-child {
      margin-inline: var(--ui-spacing-2) var(--ui-spacing-3);
      grid-column: 4;
    }

    & > [data-suffix]:not(:last-child) {
      margin-inline: var(--ui-spacing-2) 0;
      grid-column: 3;
    }

    & > button[data-suffix] {
      padding: var(--ui-spacing-2) var(--ui-spacing-2);
      border-radius: calc(var(--ui-rounded-3) - 3px);
      height: calc(100% - 8px);
      font-size: smaller;

      &:last-child {
        margin-inline-end: 4px;
      }
    }

    &:before {
      content: "";
      z-index: 2;
      background-color: var(--ui-neutral-400);
      width: 1em;
      height: 1em;
      mask-image: var(--ui-loading);
      margin-inline: var(--ui-spacing-3) var(--ui-spacing-2);
      opacity: 0;
      transition: opacity var(--ease-glide-2);
      grid-area: 1 / 1;
      display: block;
      position: relative;
      mask-size: contain;
      mask-repeat: no-repeat;
    }

    &:has( > input[aria-busy]:not([aria-busy="false"])) {
      & > [data-prefix] {
        opacity: 0;
      }

      &:before {
        opacity: 1;
      }
    }
  }

  label:not(.toggle):not(:has( > [data-prefix],  > [data-suffix])):has( > input[aria-busy]:not([aria-busy="false"])) {
    &:before {
      opacity: 1;
    }
  }

  label:not(.toggle):not(:has( > [data-prefix],  > [data-suffix])):has( > input[aria-busy]:not([aria-busy="false"])) {
    cursor: text;
    grid-template-columns: auto 1fr;
    align-items: center;
    display: grid;

    &:before {
      content: "";
      z-index: 1;
      background-color: var(--ui-neutral-400);
      width: 1em;
      height: 1em;
      mask-image: var(--ui-loading);
      margin-inline: var(--ui-spacing-3) var(--ui-spacing-2);
      transition: opacity var(--ease-glide-2);
      grid-area: 1 / 1;
      display: block;
      position: relative;
      mask-size: contain;
      mask-repeat: no-repeat;

      @starting-style {
        opacity: 0;
      }
    }

    & > input:is([type="text"], [type="email"], [type="search"], [type="password"], [type="number"], [type="tel"], [type="url"], :not([type])) {
      grid-area: 1 / 1 / auto / -1;
      padding-inline-start: calc(var(--ui-spacing-3) + 1rem + var(--ui-spacing-2));
    }
  }

  label:not(.toggle):has( > [data-prefix]) > input:is([type="text"], [type="email"], [type="search"], [type="password"], [type="number"], [type="tel"], [type="url"], :not([type])) {
    padding-inline-start: calc(var(--ui-spacing-3) + 1lh + var(--ui-spacing-2));
  }

  label:not(.toggle):has( > [data-suffix]) > input:is([type="text"], [type="email"], [type="search"], [type="password"], [type="number"], [type="tel"], [type="url"], :not([type])) {
    padding-inline-end: calc(var(--ui-spacing-3) + 1lh + var(--ui-spacing-2));
  }

  label:not(.toggle):has( > [data-suffix]:not(:last-child)) > input:is([type="text"], [type="email"], [type="search"], [type="password"], [type="number"], [type="tel"], [type="url"], :not([type])) {
    padding-inline-end: calc(var(--ui-spacing-3) + 2lh + var(--ui-spacing-2));
  }
}

/* popover */
@layer ui {
  [popover] {
    inset: unset;
    position-anchor: auto;
    top: calc(anchor(bottom) + var(--ui-spacing-1));
    left: anchor(left);
    min-width: anchor-size(width);
    --_translate-from: 0 -2px;
    position-try-fallbacks: --popover-right, --popover-above, --popover-above-right;
    box-shadow: var(--ui-shadow-3);
    border: none;
    margin: 0;
    padding: 0;
    position: fixed;

    &:not(:has(.card, article:is([role="alert"], [role="status"]))) {
      background: var(--ui-background-color);
      border: 1px solid var(--ui-neutral-200);
      border-radius: calc(var(--ui-rounded-3) + var(--ui-spacing-1));
    }

    &:has(.card, article:is([role="alert"], [role="status"])) {
      border-radius: var(--ui-rounded-5);
      background: none;
    }

    opacity: 0;
    translate: var(--_translate-from);
    transition: opacity var(--ease-glide-1),
    translate var(--ease-glide-1),
    display .1s allow-discrete,
    overlay .1s allow-discrete;

    &:not(:popover-open) {
      display: none !important;
    }

    &:popover-open {
      display: unset;
      opacity: 1;
      translate: 0;
    }

    @starting-style {
      &:popover-open {
        opacity: 0;
        translate: var(--_translate-from);
      }
    }
  }

  @position-try --popover-above {
    top: unset;
  bottom: calc(anchor(top) + var(--ui-spacing-1));
  left: anchor(left);
  translate: 0 4px;
  }

  @position-try --popover-right {
    top: calc(anchor(bottom) + var(--ui-spacing-1));
  left: unset;
  right: anchor(right);
  }

  @position-try --popover-above-right {
    top: unset;
  bottom: calc(anchor(top) + var(--ui-spacing-1));
  left: unset;
  right: anchor(right);
  translate: 0 4px;
  }

  [popover][data-placement^="top"] {
    --_translate-from: 0 2px;
  }

  [popover][data-placement^="left"] {
    --_translate-from: 2px 0;
  }

  [popover][data-placement^="right"] {
    --_translate-from: -2px 0;
  }

  [popover][data-placement="bottom left"] {
    top: calc(anchor(bottom) + var(--ui-spacing-1));
    bottom: unset;
    left: anchor(left);
    right: unset;
  }

  [popover][data-placement="bottom right"] {
    top: calc(anchor(bottom) + var(--ui-spacing-1));
    bottom: unset;
    left: unset;
    right: anchor(right);
  }

  [popover][data-placement="top left"] {
    top: unset;
    bottom: calc(anchor(top) + var(--ui-spacing-1));
    left: anchor(left);
    right: unset;
  }

  [popover][data-placement="top right"] {
    top: unset;
    bottom: calc(anchor(top) + var(--ui-spacing-1));
    left: unset;
    right: anchor(right);
  }

  [popover][data-placement="left top"] {
    top: anchor(top);
    bottom: unset;
    left: unset;
    right: calc(anchor(left) + var(--ui-spacing-1));
    min-width: unset;
  }

  [popover][data-placement="left bottom"] {
    top: unset;
    bottom: anchor(bottom);
    left: unset;
    right: calc(anchor(left) + var(--ui-spacing-1));
    min-width: unset;
  }

  [popover][data-placement="right top"] {
    top: anchor(top);
    bottom: unset;
    left: calc(anchor(right) + var(--ui-spacing-1));
    right: unset;
    min-width: unset;
  }

  [popover][data-placement="right bottom"] {
    top: unset;
    bottom: anchor(bottom);
    left: calc(anchor(right) + var(--ui-spacing-1));
    right: unset;
    min-width: unset;
  }
}

/* button */
@layer ui {
  button, .button {
    --contrast-color: light-dark(color-mix(var(--ui-primary), black 15%), color-mix(var(--ui-primary), black 25%));
    background-color: var(--ui-primary);
    color: var(--ui-primary-fg, contrast-color(var(--contrast-color)));
    min-width: calc(1lh + var(--ui-spacing-2) * 2);
    padding-block: var(--ui-spacing-2);
    padding-inline: calc(var(--ui-spacing-3) * clamp(1, var(--ui-rounded-scale) * .75, 1.3));
    border-radius: var(--ui-rounded-3);
    font: inherit;
    cursor: pointer;
    -webkit-user-select: none;
    user-select: none;
    border: none;
    justify-content: center;
    align-items: center;
    gap: .5em;
    font-weight: 500;
    line-height: 1.14286rem;
    text-decoration: none;
    transition-property: translate, background-color;
    transition-duration: .1s;
    transition-timing-function: ease-out;
    display: inline-flex;

    @media (width < 600px) {
      font-size: 16px;
    }

    &:not(:disabled):not([aria-disabled="true"]) {
      @media (hover: hover) {
        &:hover {
          background-color: var(--ui-primary-600);
        }
      }

      &:active {
        background-color: var(--ui-primary-700);
        translate: 0 1px;
      }

      &:focus-visible {
        outline: 2px solid var(--ui-neutral-950);
        outline-offset: 2px;
      }
    }

    &:disabled, &[aria-disabled="true"] {
      cursor: default;
      opacity: .4;
    }

    & svg {
      flex-shrink: 0;
    }

    & kbd, & .badge {
      margin-right: calc((var(--ui-spacing-1) * clamp(0, var(--ui-rounded-scale) * .75, 1.3)) * -1);
      margin-left: auto;
    }

    &[aria-busy]:not([aria-busy="false"]):before {
      content: "";
      mask-image: var(--ui-loading);
      background-color: currentColor;
      width: 1rem;
      height: 1rem;
      display: inline-block;
      mask-size: 1rem;
      mask-repeat: no-repeat;
    }

    &[popovertarget]:has( + [popover]:popover-open) {
      background-color: var(--ui-primary-600);
      translate: 0 1px;
    }

    &.square:not(.avatar), &.round {
      padding-inline: var(--ui-spacing-2);
    }

    &.round {
      border-radius: var(--ui-rounded-full);
    }

    &.outlined {
      color: var(--ui-neutral-950);
      box-shadow: 0 0 0 1px var(--border-color, var(--ui-neutral-300)) inset;
      background-color: #0000;

      &:not(:disabled):not([aria-disabled="true"]) {
        @media (hover: hover) {
          &:hover {
            background-color: var(--ui-neutral-100);
          }
        }

        &:active {
          background-color: var(--ui-neutral-200);
        }
      }

      &[popovertarget]:has( + [popover]:popover-open) {
        background-color: var(--ui-neutral-100);
      }
    }

    &.secondary {
      background-color: var(--bg, var(--ui-neutral-200));
      color: var(--ui-neutral-950);

      &:not(:disabled):not([aria-disabled="true"]) {
        @media (hover: hover) {
          &:hover {
            background-color: var(--ui-neutral-300);
          }
        }

        &:active {
          background-color: var(--ui-neutral-400);
        }
      }

      &[popovertarget]:has( + [popover]:popover-open) {
        background-color: var(--ui-neutral-400);
      }
    }

    &.ghost {
      color: var(--ui-neutral-950);
      background-color: #0000;

      &:not(:disabled):not([aria-disabled]) {
        @media (hover: hover) {
          &:hover {
            background-color: var(--ui-neutral-100);
          }
        }

        &:active {
          background-color: var(--ui-neutral-200);
        }
      }

      &[popovertarget]:has( + [popover]:popover-open) {
        background-color: var(--ui-neutral-200);
      }
    }

    &.link {
      color: var(--ui-neutral-950);
      transition: text-decoration-color var(--ease-glide-2);
      background-color: #0000;
      -webkit-text-decoration: underline #0000;
      text-decoration: underline #0000;

      &:not(:disabled):not([aria-disabled="true"]) {
        @media (hover: hover) {
          &:hover {
            background-color: #0000;
            text-decoration-color: currentColor;
          }
        }

        &:active {
          background-color: #0000;
          text-decoration-color: currentColor;
        }
      }
    }

    &:not(.secondary):not(.outlined):not(.ghost):not(.link):not(.destructive) {
      --ui-shadow-shine-color: light-dark(var(--ui-primary-300), var(--ui-primary-700));
    }

    &.destructive {
      --ui-shadow-shine-color: light-dark(var(--ui-destructive-300), var(--ui-destructive-700));
      background-color: var(--ui-destructive);
      color: var(--ui-destructive-100);

      &:not(:disabled):not([aria-disabled="true"]) {
        @media (hover: hover) {
          &:hover {
            background-color: var(--ui-destructive-600);
          }
        }

        &:active {
          background-color: var(--ui-destructive-700);
        }
      }

      &[popovertarget]:has( + [popover]:popover-open) {
        background-color: var(--ui-destructive-600);
      }
    }

    &.ghost.destructive {
      color: var(--ui-destructive);
      background-color: #0000;

      &:not(:disabled):not([aria-disabled="true"]) {
        @media (hover: hover) {
          &:hover {
            background-color: var(--ui-destructive-100);
          }
        }

        &:active {
          background-color: var(--ui-destructive-200);
        }
      }

      &[popovertarget]:has( + [popover]:popover-open) {
        background-color: var(--ui-destructive-100);
      }
    }
  }
}

/* menu */
@layer ui {
  menu {
    & > li {
      list-style: none;

      & > button, & > .button {
        white-space: nowrap;
        justify-content: flex-start;
        width: 100%;
      }

      & > label {
        width: 100%;
        padding-block: var(--ui-spacing-2);
        padding-inline: var(--ui-spacing-3);
        border-radius: var(--ui-rounded-3);
        white-space: nowrap;
        cursor: pointer;
        -webkit-user-select: none;
        user-select: none;

        & > input[type="radio"], & > input[type="checkbox"] {
          appearance: none;
          opacity: 0;
          pointer-events: none;
          width: 0;
          height: 0;
          position: absolute;
        }

        @media (hover: hover) {
          &:hover {
            background: var(--ui-neutral-100);
          }
        }

        &:has(input[type="checkbox"], input[type="radio"]) {
          &:after {
            content: "";
            visibility: hidden;
            background-color: currentColor;
            width: 1rem;
            height: 1rem;
            margin-left: auto;
            display: inline-block;
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E");
            mask-position: center;
            mask-size: 1rem;
            mask-repeat: no-repeat;
          }

          &:has(input:checked):after {
            visibility: visible;
          }
        }
      }

      & > small:only-child:not(:has(*)) {
        padding: var(--ui-spacing-2) var(--ui-spacing-3) var(--ui-spacing-1);
        color: var(--ui-neutral-500);
        -webkit-user-select: none;
        user-select: none;
        margin-left: 2px;
        font-size: .8125rem;
        display: block;
      }
    }

    & hr {
      margin-block: var(--ui-spacing-1);
    }
  }
}

/* combobox */
@layer ui {
  .combobox {
    display: inline-block;

    & > input {
      width: 100%;
    }

    & > [popover] > menu:not(:has(li:not([hidden]))):after {
      content: "No results";
      padding: var(--ui-spacing-2) var(--ui-spacing-3);
      color: var(--ui-neutral-400);
      text-align: center;
      display: block;
    }
  }
}
