@botiverse/raft-ui 0.20.0 → 0.21.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,7 +2,7 @@ import { cn } from "./cn.mjs";
2
2
  import { Dialog } from "@base-ui/react/dialog";
3
3
  import { Check, Minus, X } from "lucide-react";
4
4
  import { tv } from "tailwind-variants/lite";
5
- import { Children, Fragment, createContext, isValidElement, use, useCallback, useContext, useEffect, useMemo, useRef, useSyncExternalStore } from "react";
5
+ import { Children, Fragment, createContext, isValidElement, use, useCallback, useContext, useEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
6
6
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
7
7
  import { Button } from "@base-ui/react/button";
8
8
  import { mergeProps } from "@base-ui/react/merge-props";
@@ -12,6 +12,9 @@ import { Checkbox } from "@base-ui/react/checkbox";
12
12
  import { ScrollArea } from "@base-ui/react/scroll-area";
13
13
  import { Avatar } from "@base-ui/react";
14
14
  import { Menu } from "@base-ui/react/menu";
15
+ import { flushSync } from "react-dom";
16
+ import { Radio } from "@base-ui/react/radio";
17
+ import { RadioGroup } from "@base-ui/react/radio-group";
15
18
  import { Toggle } from "@base-ui/react/toggle";
16
19
  import { Toolbar } from "@base-ui/react/toolbar";
17
20
  import { PointerSensor, TouchSensor, useSensor } from "@dnd-kit/core";
@@ -624,6 +627,7 @@ const badge = tv$1({
624
627
  "font-sans text-caption font-semibold normal-case tracking-normal",
625
628
  "transition-[filter,opacity] duration-100",
626
629
  "[&_svg]:size-3.5 [&_svg]:shrink-0 [&_[data-slot='spinner']]:size-3 [&_[data-slot='spinner']]:text-xs",
630
+ "*:data-[slot=status]:lead-dot",
627
631
  "disabled:cursor-not-allowed disabled:bg-fill-muted disabled:text-foreground-disabled disabled:opacity-100 disabled:inset-ring-0"
628
632
  ] },
629
633
  variants: {
@@ -797,6 +801,36 @@ function Experimental(props) {
797
801
  }
798
802
  const Badge = Object.assign(BadgeRoot, { Experimental });
799
803
  //#endregion
804
+ //#region src/components/text-link/text-link.tsx
805
+ const textLinkVariants = tv$1({
806
+ base: [
807
+ "rounded-[2px]",
808
+ "decoration-[1.5px] underline-offset-[3px] not-disabled:hover:underline",
809
+ "outline-none focus-visible:shadow-focus",
810
+ "disabled:cursor-not-allowed disabled:text-foreground-disabled"
811
+ ],
812
+ variants: { variant: {
813
+ muted: ["font-medium text-foreground-muted", "hover:text-foreground"],
814
+ strong: ["font-semibold text-foreground"]
815
+ } },
816
+ defaultVariants: { variant: "muted" }
817
+ });
818
+ function TextLink({ variant, className, render, ...props }) {
819
+ const defaultProps = {
820
+ className: textLinkVariants({
821
+ variant,
822
+ className
823
+ }),
824
+ ...render ? {} : { type: "button" }
825
+ };
826
+ return useRender({
827
+ defaultTagName: "button",
828
+ render,
829
+ props: mergeProps(defaultProps, props),
830
+ state: { slot: "text-link" }
831
+ });
832
+ }
833
+ //#endregion
800
834
  //#region src/components/tooltip/tooltip.tsx
801
835
  const tooltip = tv$1({
802
836
  slots: {
@@ -942,7 +976,7 @@ const CONTENT_COLLISION_AVOIDANCE = {
942
976
  align: "shift",
943
977
  fallbackAxisSide: "none"
944
978
  };
945
- function TooltipContent({ align = "center", alignOffset = 0, anchor, arrowPadding, collisionAvoidance = CONTENT_COLLISION_AVOIDANCE, collisionBoundary, collisionPadding, disableAnchorTracking = false, positionMethod = "fixed", side = "top", sideOffset, sticky, container, portalProps, className, children, ...props }) {
979
+ function TooltipContent({ align = "center", alignOffset = 0, anchor, arrowPadding, collisionAvoidance = CONTENT_COLLISION_AVOIDANCE, collisionBoundary, collisionPadding, disableAnchorTracking, positionMethod = "fixed", side = "top", sideOffset, sticky, container, portalProps, className, children, ...props }) {
946
980
  const { positioner, content } = tooltip();
947
981
  const portalContainer = container !== void 0 ? container : portalProps?.container;
948
982
  return /* @__PURE__ */ jsx(TooltipPortal, {
@@ -1050,7 +1084,9 @@ const checkbox = tv$1({ slots: {
1050
1084
  "relative inline-flex size-5 shrink-0 touch-manipulation items-center justify-center outline-none",
1051
1085
  "rounded-sticker focus-visible:shadow-focus",
1052
1086
  "data-disabled:cursor-not-allowed",
1053
- "after:absolute after:-inset-x-3 after:-inset-y-2 after:content-['']"
1087
+ "after:absolute after:-inset-x-3 after:-inset-y-2 after:content-[''] pointer-coarse:after:-inset-y-3",
1088
+ "[label>&]:my-[max(0px,calc((1lh-1.25rem)/2))]",
1089
+ "[label>&]:after:-inset-y-[calc(max(0px,(1lh-1.25rem)/2)+4px)]"
1054
1090
  ],
1055
1091
  indicator: "pointer-events-none"
1056
1092
  } });
@@ -1401,7 +1437,7 @@ function DropdownMenuPopup({ className, ...props }) {
1401
1437
  ...props
1402
1438
  });
1403
1439
  }
1404
- function DropdownMenuContent({ align = "start", alignOffset = 0, anchor, arrowPadding, collisionAvoidance, collisionBoundary, collisionPadding, disableAnchorTracking = false, positionMethod = "fixed", side = "bottom", sideOffset, sticky, portalProps, className, ...props }) {
1440
+ function DropdownMenuContent({ align = "start", alignOffset = 0, anchor, arrowPadding, collisionAvoidance, collisionBoundary, collisionPadding, disableAnchorTracking, positionMethod = "fixed", side = "bottom", sideOffset, sticky, portalProps, className, ...props }) {
1405
1441
  const resolvedSideOffset = sideOffset ?? 6;
1406
1442
  const { positioner, content } = dropdownMenu();
1407
1443
  return /* @__PURE__ */ jsx(DropdownMenuPortal, {
@@ -1589,10 +1625,157 @@ function DropdownMenuCheckboxItemIndicator({ className, ...props }) {
1589
1625
  ...props
1590
1626
  });
1591
1627
  }
1628
+ function contentBox(element) {
1629
+ const rect = element.getBoundingClientRect();
1630
+ if (rect.width === 0 && rect.height === 0) return void 0;
1631
+ const style = element.ownerDocument.defaultView?.getComputedStyle(element);
1632
+ const px = (value) => Number.parseFloat(value ?? "") || 0;
1633
+ return {
1634
+ left: rect.left + px(style?.borderLeftWidth) + px(style?.paddingLeft),
1635
+ right: rect.right - px(style?.borderRightWidth) - px(style?.paddingRight),
1636
+ top: rect.top + px(style?.borderTopWidth) + px(style?.paddingTop),
1637
+ bottom: rect.bottom - px(style?.borderBottomWidth) - px(style?.paddingBottom)
1638
+ };
1639
+ }
1640
+ /**
1641
+ * Whether laid-out text `rects` overflow `box`: past either inline edge, or
1642
+ * on a line whose middle is below the bottom edge (a clamped line is still
1643
+ * laid out, below the box; the middle, not the top, so a glyph box taller
1644
+ * than a tight line-height does not count as a cut).
1645
+ */
1646
+ function overflows(rects, box) {
1647
+ for (const rect of Array.from(rects)) {
1648
+ if (rect.width === 0 && rect.height === 0) continue;
1649
+ if (rect.right > box.right + .5 || rect.left < box.left - .5) return true;
1650
+ if (rect.top + rect.height / 2 > box.bottom + .5) return true;
1651
+ }
1652
+ return false;
1653
+ }
1654
+ /** Whether the text inside `element` overflows its content box. */
1655
+ function measureElement(element) {
1656
+ if (!element.isConnected) return void 0;
1657
+ const box = contentBox(element);
1658
+ if (!box) return void 0;
1659
+ const range = element.ownerDocument.createRange();
1660
+ range.selectNodeContents(element);
1661
+ return overflows(range.getClientRects(), box);
1662
+ }
1663
+ /**
1664
+ * Whether the inline `content` overflows `text`, the box that clips it.
1665
+ * Used where `text` holds more than the content (an Ellipsis's floats).
1666
+ */
1667
+ function measureContent(text, content) {
1668
+ if (!text.isConnected) return void 0;
1669
+ const box = contentBox(text);
1670
+ if (!box) return void 0;
1671
+ return overflows(content.getClientRects(), box);
1672
+ }
1673
+ /** Isolates, reads and restores one target now, outside the batch. */
1674
+ function readNow(target) {
1675
+ const restore = target.isolate?.();
1676
+ try {
1677
+ return target.read();
1678
+ } finally {
1679
+ restore?.();
1680
+ }
1681
+ }
1682
+ const targets = /* @__PURE__ */ new Set();
1683
+ const byElement = /* @__PURE__ */ new WeakMap();
1684
+ const pending = /* @__PURE__ */ new Set();
1685
+ let frame = 0;
1686
+ let resizeObserver;
1687
+ let mutationObserver;
1688
+ let fontsListening = false;
1689
+ function flush() {
1690
+ frame = 0;
1691
+ const batch = Array.from(pending).filter((target) => targets.has(target));
1692
+ pending.clear();
1693
+ const restores = batch.map((target) => target.isolate?.());
1694
+ const results = batch.map((target) => target.read());
1695
+ for (const restore of restores) restore?.();
1696
+ flushSync(() => {
1697
+ batch.forEach((target, index) => {
1698
+ if (targets.has(target)) target.commit(results[index]);
1699
+ });
1700
+ });
1701
+ }
1702
+ /** Asks for `target` to be measured in the next frame, before it paints. */
1703
+ function scheduleMeasure(target) {
1704
+ if (!targets.has(target)) return;
1705
+ pending.add(target);
1706
+ if (frame === 0 && typeof requestAnimationFrame === "function") frame = requestAnimationFrame(flush);
1707
+ }
1708
+ function scheduleAll() {
1709
+ for (const target of targets) scheduleMeasure(target);
1710
+ }
1711
+ function ownerOf(node) {
1712
+ for (let current = node; current; current = current.parentNode) {
1713
+ const target = byElement.get(current);
1714
+ if (target) return target;
1715
+ }
1716
+ }
1717
+ function observers(view) {
1718
+ if (!resizeObserver && "ResizeObserver" in view) resizeObserver = new view.ResizeObserver((entries) => {
1719
+ for (const entry of entries) {
1720
+ const target = byElement.get(entry.target);
1721
+ if (target) scheduleMeasure(target);
1722
+ }
1723
+ });
1724
+ if (!mutationObserver && "MutationObserver" in view) mutationObserver = new view.MutationObserver((records) => {
1725
+ for (const record of records) {
1726
+ const target = ownerOf(record.target);
1727
+ if (target) scheduleMeasure(target);
1728
+ }
1729
+ });
1730
+ const fonts = view.document.fonts;
1731
+ if (!fontsListening && fonts && typeof fonts.addEventListener === "function") {
1732
+ fonts.addEventListener("loadingdone", scheduleAll);
1733
+ fontsListening = true;
1734
+ }
1735
+ }
1736
+ /**
1737
+ * Starts watching `target`: the elements it names, the text under `watch`
1738
+ * and the page's fonts. Measures it in the next frame. Returns the cleanup.
1739
+ */
1740
+ function observeTruncation(target) {
1741
+ const observed = target.observe().filter((element) => element != null);
1742
+ const first = observed[0];
1743
+ const view = first?.ownerDocument.defaultView;
1744
+ if (!first || !view) return () => void 0;
1745
+ observers(view);
1746
+ targets.add(target);
1747
+ for (const element of observed) {
1748
+ byElement.set(element, target);
1749
+ resizeObserver?.observe(element);
1750
+ }
1751
+ const watched = target.watch();
1752
+ if (watched) {
1753
+ byElement.set(watched, target);
1754
+ mutationObserver?.observe(watched, {
1755
+ childList: true,
1756
+ characterData: true,
1757
+ subtree: true
1758
+ });
1759
+ }
1760
+ scheduleMeasure(target);
1761
+ return () => {
1762
+ targets.delete(target);
1763
+ pending.delete(target);
1764
+ for (const element of observed) {
1765
+ if (byElement.get(element) === target) byElement.delete(element);
1766
+ resizeObserver?.unobserve(element);
1767
+ }
1768
+ if (watched && byElement.get(watched) === target) byElement.delete(watched);
1769
+ if (targets.size === 0) {
1770
+ mutationObserver?.disconnect();
1771
+ mutationObserver = void 0;
1772
+ }
1773
+ };
1774
+ }
1592
1775
  //#endregion
1593
1776
  //#region src/lib/use-overflow-title.ts
1594
1777
  function cut(element) {
1595
- return element.scrollWidth > element.clientWidth + 1 || element.scrollHeight > element.clientHeight + 1;
1778
+ return measureElement(element) === true;
1596
1779
  }
1597
1780
  function assign(ref, node) {
1598
1781
  if (typeof ref === "function") ref(node);
@@ -1621,28 +1804,153 @@ function useOverflowTitle(ref, title) {
1621
1804
  cleanup.current = void 0;
1622
1805
  assign(ref, node);
1623
1806
  const view = node?.ownerDocument.defaultView;
1624
- if (!node || own || !view || !("ResizeObserver" in view)) return;
1625
- const update = () => {
1626
- const text = node.textContent?.trim() ?? "";
1627
- if (text && (cut(node) || Array.from(node.children).some(cut))) node.title = text;
1628
- else node.removeAttribute("title");
1629
- };
1630
- const resize = new view.ResizeObserver(update);
1631
- resize.observe(node);
1632
- for (const child of Array.from(node.children)) resize.observe(child);
1633
- const mutation = new view.MutationObserver(update);
1634
- mutation.observe(node, {
1635
- childList: true,
1636
- characterData: true,
1637
- subtree: true
1807
+ if (!node || own || !view) return;
1808
+ const children = Array.from(node.children);
1809
+ cleanup.current = observeTruncation({
1810
+ observe: () => [node, ...children],
1811
+ watch: () => node,
1812
+ read: () => cut(node) || children.some(cut),
1813
+ commit: (truncated) => {
1814
+ const text = node.textContent?.trim() ?? "";
1815
+ if (text && truncated) node.title = text;
1816
+ else node.removeAttribute("title");
1817
+ }
1638
1818
  });
1639
- cleanup.current = () => {
1640
- resize.disconnect();
1641
- mutation.disconnect();
1642
- };
1643
1819
  }, [own, ref]);
1644
1820
  }
1645
1821
  //#endregion
1822
+ //#region src/components/segmented-control/segmented-control.tsx
1823
+ const segmentedControl = tv$1({
1824
+ slots: {
1825
+ root: ["inline-flex shrink-0 items-center", "w-fit flex-nowrap gap-[3px] rounded-[11px] bg-fill-muted p-[3px]"],
1826
+ item: [
1827
+ "inline-flex min-w-0 shrink-0 items-center gap-1.5",
1828
+ "outline-none disabled:pointer-events-none",
1829
+ "[&_svg]:pointer-events-none [&_svg]:shrink-0",
1830
+ "h-8 justify-center rounded-control border-[1.5px] border-transparent bg-transparent px-3",
1831
+ "font-sans text-callout font-semibold text-foreground-muted",
1832
+ "[&_svg:not([class*='size-'])]:size-4",
1833
+ "hover:bg-fill-medium active:bg-fill-medium",
1834
+ "data-checked:border-sticker-ink data-checked:bg-brand data-checked:font-bold data-checked:text-sticker-ink data-checked:ring-[1.5px] data-checked:ring-sticker-edge",
1835
+ "data-checked:hover:bg-brand data-checked:active:bg-brand data-checked:active:overlay-sticker-medium",
1836
+ "focus-visible:shadow-focus",
1837
+ "data-disabled:cursor-not-allowed data-disabled:text-foreground-disabled data-disabled:hover:bg-transparent"
1838
+ ],
1839
+ label: ["truncate"],
1840
+ count: ["font-mono", "text-mono-meta font-normal"]
1841
+ },
1842
+ variants: {
1843
+ variant: {
1844
+ default: {},
1845
+ "on-frame": { root: [
1846
+ "bg-fill-frame-medium",
1847
+ "**:data-[slot=segmented-control-item]:text-foreground-on-frame-muted **:data-[slot=segmented-control-item]:hover:text-foreground-on-frame",
1848
+ "**:data-[slot=segmented-control-item]:hover:bg-transparent **:data-[slot=segmented-control-item]:hover:overlay-frame-medium **:data-[slot=segmented-control-item]:active:bg-transparent **:data-[slot=segmented-control-item]:active:overlay-frame-medium",
1849
+ "**:data-[slot=segmented-control-item]:data-checked:border-line-frame-active **:data-[slot=segmented-control-item]:data-checked:bg-layer-frame-active **:data-[slot=segmented-control-item]:data-checked:text-foreground-on-frame-active",
1850
+ "**:data-[slot=segmented-control-item]:data-checked:hover:bg-layer-frame-active **:data-[slot=segmented-control-item]:data-checked:hover:bg-none **:data-[slot=segmented-control-item]:data-checked:active:bg-layer-frame-active"
1851
+ ] }
1852
+ },
1853
+ iconsOnlyBelow: {
1854
+ xs: { root: ["@max-xs:**:data-[slot=segmented-control-item]:relative @max-xs:**:data-[slot=segmented-control-item]:w-8 @max-xs:**:data-[slot=segmented-control-item]:px-0", "@max-xs:**:data-[slot=segmented-control-label]:sr-only @max-xs:**:data-[slot=segmented-control-count]:sr-only"] },
1855
+ sm: { root: ["@max-sm:**:data-[slot=segmented-control-item]:relative @max-sm:**:data-[slot=segmented-control-item]:w-8 @max-sm:**:data-[slot=segmented-control-item]:px-0", "@max-sm:**:data-[slot=segmented-control-label]:sr-only @max-sm:**:data-[slot=segmented-control-count]:sr-only"] },
1856
+ md: { root: ["@max-md:**:data-[slot=segmented-control-item]:relative @max-md:**:data-[slot=segmented-control-item]:w-8 @max-md:**:data-[slot=segmented-control-item]:px-0", "@max-md:**:data-[slot=segmented-control-label]:sr-only @max-md:**:data-[slot=segmented-control-count]:sr-only"] },
1857
+ lg: { root: ["@max-lg:**:data-[slot=segmented-control-item]:relative @max-lg:**:data-[slot=segmented-control-item]:w-8 @max-lg:**:data-[slot=segmented-control-item]:px-0", "@max-lg:**:data-[slot=segmented-control-label]:sr-only @max-lg:**:data-[slot=segmented-control-count]:sr-only"] },
1858
+ xl: { root: ["@max-xl:**:data-[slot=segmented-control-item]:relative @max-xl:**:data-[slot=segmented-control-item]:w-8 @max-xl:**:data-[slot=segmented-control-item]:px-0", "@max-xl:**:data-[slot=segmented-control-label]:sr-only @max-xl:**:data-[slot=segmented-control-count]:sr-only"] },
1859
+ "2xl": { root: ["@max-2xl:**:data-[slot=segmented-control-item]:relative @max-2xl:**:data-[slot=segmented-control-item]:w-8 @max-2xl:**:data-[slot=segmented-control-item]:px-0", "@max-2xl:**:data-[slot=segmented-control-label]:sr-only @max-2xl:**:data-[slot=segmented-control-count]:sr-only"] }
1860
+ }
1861
+ }
1862
+ });
1863
+ const SegmentedControlIconsOnlyContext = createContext(false);
1864
+ function SegmentedControl({ disabled = false, iconsOnlyBelow, variant = "default", className, ...props }) {
1865
+ const { root } = segmentedControl({
1866
+ iconsOnlyBelow,
1867
+ variant
1868
+ });
1869
+ return /* @__PURE__ */ jsx(SegmentedControlIconsOnlyContext, {
1870
+ value: iconsOnlyBelow !== void 0,
1871
+ children: /* @__PURE__ */ jsx(RadioGroup, {
1872
+ disabled,
1873
+ "data-slot": "segmented-control",
1874
+ className: root({ className }),
1875
+ ...props
1876
+ })
1877
+ });
1878
+ }
1879
+ function SegmentedControlItem({ className, ...props }) {
1880
+ const { item } = segmentedControl();
1881
+ const iconsOnly = use(SegmentedControlIconsOnlyContext);
1882
+ const radio = /* @__PURE__ */ jsx(Radio.Root, {
1883
+ render: /* @__PURE__ */ jsx("button", { type: "button" }),
1884
+ nativeButton: true,
1885
+ "data-slot": "segmented-control-item",
1886
+ className: item({ className: `group/segmented-control-item ${className ?? ""}`.trim() }),
1887
+ ...props
1888
+ });
1889
+ return iconsOnly ? /* @__PURE__ */ jsx(SegmentedControlItemTooltip, { children: radio }) : radio;
1890
+ }
1891
+ function SegmentedControlItemTooltip({ children }) {
1892
+ const [text, setText] = useState("");
1893
+ const triggerRef = useRef(null);
1894
+ const handleOpenChange = useCallback((open, details) => {
1895
+ if (!open) return;
1896
+ const label = triggerRef.current?.querySelector("[data-slot=segmented-control-label]");
1897
+ if (!label || label.getBoundingClientRect().width > 1) {
1898
+ details.cancel();
1899
+ return;
1900
+ }
1901
+ setText(label.textContent ?? "");
1902
+ }, []);
1903
+ return /* @__PURE__ */ jsxs(Tooltip$1, {
1904
+ onOpenChange: handleOpenChange,
1905
+ children: [/* @__PURE__ */ jsx(TooltipTrigger, {
1906
+ ref: triggerRef,
1907
+ render: children
1908
+ }), /* @__PURE__ */ jsx(TooltipContent, { children: text })]
1909
+ });
1910
+ }
1911
+ function SegmentedControlLabel({ className, ...props }) {
1912
+ const { label } = segmentedControl();
1913
+ return /* @__PURE__ */ jsx("span", {
1914
+ "data-slot": "segmented-control-label",
1915
+ className: label({ className }),
1916
+ ...props
1917
+ });
1918
+ }
1919
+ function SegmentedControlCount({ className, ...props }) {
1920
+ const { count } = segmentedControl();
1921
+ return /* @__PURE__ */ jsx("span", {
1922
+ "data-slot": "segmented-control-count",
1923
+ className: count({ className }),
1924
+ ...props
1925
+ });
1926
+ }
1927
+ /**
1928
+ * The same track for choices that are places, not values: each segment is a
1929
+ * link to another URL (a language, a version of the page), so it can be
1930
+ * opened in a new tab and copied. Name it with `aria-label`.
1931
+ */
1932
+ function SegmentedControlNav({ variant = "default", className, ...props }) {
1933
+ const { root } = segmentedControl({ variant });
1934
+ return /* @__PURE__ */ jsx("nav", {
1935
+ "data-slot": "segmented-control",
1936
+ className: root({ className }),
1937
+ ...props
1938
+ });
1939
+ }
1940
+ /** One segment of a `SegmentedControlNav`: a link, `<a>` unless `render` gives a router link. */
1941
+ function SegmentedControlLink({ current = false, className, render, ...props }) {
1942
+ const { item } = segmentedControl();
1943
+ return useRender({
1944
+ render: render ?? /* @__PURE__ */ jsx("a", {}),
1945
+ props: mergeProps({
1946
+ "data-slot": "segmented-control-item",
1947
+ "aria-current": current ? "page" : void 0,
1948
+ ...current ? { "data-checked": "" } : {},
1949
+ className: item({ className: `group/segmented-control-item ${className ?? ""}`.trim() })
1950
+ }, props)
1951
+ });
1952
+ }
1953
+ //#endregion
1646
1954
  //#region src/components/avatar/avatar.tsx
1647
1955
  const avatar = tv$1({
1648
1956
  slots: {
@@ -1936,7 +2244,7 @@ const messageItem = tv$1({
1936
2244
  "group/message relative flex h-fit gap-3",
1937
2245
  "hover:[--mi-toolbar-opacity:1] hover:[--mi-toolbar-pe:auto] focus-within:[--mi-toolbar-opacity:1] focus-within:[--mi-toolbar-pe:auto]",
1938
2246
  "has-data-popup-open:[--mi-toolbar-opacity:1] has-data-popup-open:[--mi-toolbar-pe:auto]",
1939
- "min-h-0 px-2 py-1 border-t-8 border-transparent bg-clip-padding",
2247
+ "min-h-0 px-2 py-timeline-row border-t-(length:--spacing-timeline-turn) border-transparent bg-clip-padding",
1940
2248
  "hover:[--mi-ct-color:var(--foreground-hint)] has-data-popup-open:[--mi-ct-color:var(--foreground-hint)]",
1941
2249
  "bg-(--mi-row-fill) [--mi-row-fill:initial]",
1942
2250
  "hover:[--mi-row-fill:var(--fill-subtle)]",
@@ -2350,7 +2658,7 @@ const messageFooter = tv$1({
2350
2658
  savedIndicator: [
2351
2659
  "inline-flex min-w-0 max-w-full items-center gap-1 overflow-hidden whitespace-nowrap select-none",
2352
2660
  "[&_svg]:shrink-0",
2353
- "h-[22px] rounded-chip px-1.5",
2661
+ "h-[22px] rounded-chip pr-[6.5px] pl-[5.5px]",
2354
2662
  "text-caption font-semibold text-foreground-muted",
2355
2663
  "bg-fill-muted hover:overlay-medium active:overlay-medium",
2356
2664
  "outline-none focus-visible:shadow-focus",
@@ -2462,7 +2770,7 @@ const messageReaction = tv$1({ slots: {
2462
2770
  chip: [
2463
2771
  "inline-flex min-w-0 max-w-full items-center overflow-hidden whitespace-nowrap",
2464
2772
  "transition-colors",
2465
- "h-6 gap-1 rounded-chip pr-2 pl-1.5 text-callout text-foreground",
2773
+ "h-6 gap-1 rounded-chip px-[7px] text-callout text-foreground",
2466
2774
  "bg-fill-muted hover:overlay-medium active:overlay-medium",
2467
2775
  "data-pressed:bg-attention-soft",
2468
2776
  "has-data-[slot=message-reaction-error-indicator]:bg-warning-soft",
@@ -2691,12 +2999,17 @@ function MessageReactionTooltipMeta({ className, render, ...props }) {
2691
2999
  //#endregion
2692
3000
  //#region src/components/message-item/message-reference.recipe.ts
2693
3001
  const chip = (fill) => [
2694
- "items-baseline gap-0.5 rounded-sticker px-1.5 py-px has-[>svg]:pl-[3px]",
3002
+ "items-baseline gap-0.5 rounded-sticker px-1.5 py-px has-[>svg]:px-[4.5px]",
2695
3003
  "[font-size:0.875em] leading-5 font-semibold",
3004
+ "[--message-reference-em:1em]",
2696
3005
  "[&_svg]:size-3.5 [&_svg]:text-foreground-muted",
2697
3006
  fill
2698
3007
  ];
2699
3008
  const linkChip = (fill) => [...chip(fill), "text-foreground cursor-pointer hover:overlay-medium active:overlay-medium"];
3009
+ const SUFFIX_LIFT = {
3010
+ "x-height": "top-[calc((1em-var(--message-reference-em))/4)]",
3011
+ icon: "top-[calc(0.25em-var(--message-reference-em)*0.35)]"
3012
+ }["x-height"];
2700
3013
  const messageReference = tv$1({
2701
3014
  slots: {
2702
3015
  root: [
@@ -2706,11 +3019,17 @@ const messageReference = tv$1({
2706
3019
  "max-w-full truncate select-text no-underline",
2707
3020
  "outline-none focus-visible:shadow-focus",
2708
3021
  "[&_svg]:size-[0.857em] [&_svg]:shrink-0 [&_svg]:self-center",
3022
+ "*:data-[slot=spinner]:self-center",
2709
3023
  "has-[>[data-slot=message-reference-indicator]]:relative has-[>[data-slot=message-reference-indicator]]:mr-2",
2710
3024
  "has-[>[data-slot=message-reference-indicator]]:inline-block",
2711
3025
  "has-[>[data-slot=message-reference-indicator]]:overflow-visible"
2712
3026
  ],
2713
3027
  chipLabel: "min-w-0 truncate",
3028
+ suffix: [
3029
+ "relative shrink-0",
3030
+ SUFFIX_LIFT,
3031
+ "font-mono text-label leading-none font-normal text-foreground-hint"
3032
+ ],
2714
3033
  indicator: ["pointer-events-none absolute -right-1.5 top-0 inline-flex size-2 shrink-0 items-center justify-center", "*:data-[slot=status]:size-full"]
2715
3034
  },
2716
3035
  variants: { variant: {
@@ -2768,6 +3087,18 @@ function MessageReferenceLabel({ className, render, ...props }) {
2768
3087
  state: { slot: "message-reference-label" }
2769
3088
  });
2770
3089
  }
3090
+ /** A short note after a chip's label in muted machine type, such as `msg` on a
3091
+ * link to a message. It lines up with the label by the middle of its letters. */
3092
+ function MessageReferenceSuffix({ className, render, ...props }) {
3093
+ const { suffix } = messageReference();
3094
+ const defaultProps = { className: suffix({ className }) };
3095
+ return useRender({
3096
+ defaultTagName: "span",
3097
+ render,
3098
+ props: mergeProps(defaultProps, props),
3099
+ state: { slot: "message-reference-suffix" }
3100
+ });
3101
+ }
2771
3102
  function MessageReferencePending({ className, render, ...props }) {
2772
3103
  const { root } = messageReference({ variant: "pending" });
2773
3104
  return useReferenceRender(root({ className }), render, props);
@@ -2948,8 +3279,8 @@ const messageQuotedPreview = tv$1({ slots: {
2948
3279
  "has-data-[slot=message-quoted-preview-author-delegated-by]:flex-wrap",
2949
3280
  "gap-1.5 p-0 pb-0.5"
2950
3281
  ],
2951
- channel: ["inline-flex items-center", "gap-1 text-footnote font-semibold text-foreground-hint [&_svg]:size-3.5"],
2952
- thread: ["inline-flex items-center", "gap-1 text-footnote font-semibold text-foreground-hint [&_svg]:size-3.5"],
3282
+ channel: ["inline-flex items-start", "gap-1 text-footnote font-semibold text-foreground-hint [&_svg]:size-3.5 [&_svg]:lead-icon"],
3283
+ thread: ["inline-flex items-start", "gap-1 text-footnote font-semibold text-foreground-hint [&_svg]:size-3.5 [&_svg]:lead-icon"],
2953
3284
  author: ["inline-flex min-w-0 items-center", "gap-1.5"],
2954
3285
  authorName: ["truncate", "text-footnote font-bold text-foreground-muted"],
2955
3286
  authorMeta: ["truncate", "text-caption text-foreground-hint"],
@@ -3115,10 +3446,20 @@ const messageList = tv$1({
3115
3446
  root: ["relative h-full min-h-0"],
3116
3447
  viewport: ["min-w-0 overscroll-none"],
3117
3448
  content: ["flex min-h-full w-full min-w-0 flex-col"],
3118
- dateDividerRoot: ["flex select-none items-center", "gap-2 px-4 py-3"],
3449
+ dateDividerRoot: [
3450
+ "flex select-none items-center",
3451
+ "gap-2 px-4",
3452
+ "pt-[calc(var(--spacing-timeline-section)-var(--spacing-timeline-row)-var(--text-mono-meta--line-height)/2)]",
3453
+ "pb-[calc(var(--spacing-timeline-section)-var(--spacing-timeline-lead)-var(--text-mono-meta--line-height)/2)]"
3454
+ ],
3119
3455
  dateDividerRule: ["flex-1", "min-w-3 border-t border-line-hairline"],
3120
3456
  dateDividerChip: ["inline-flex items-center", "font-mono text-mono-meta whitespace-nowrap text-foreground-hint"],
3121
- notice: ["text-center", "pb-2 font-mono text-mono-meta"],
3457
+ endFade: [
3458
+ "pointer-events-none absolute inset-x-0 bottom-0 z-5",
3459
+ "h-timeline-section",
3460
+ "bg-linear-to-t from-layer-canvas to-transparent"
3461
+ ],
3462
+ notice: ["text-center", "pt-timeline-lead pb-timeline-row font-mono text-mono-meta"],
3122
3463
  historyLimited: [
3123
3464
  "inline-flex items-center",
3124
3465
  "h-[22px] gap-1 rounded-chip px-1.5",
@@ -3247,6 +3588,19 @@ function MessageListHistoryLimited({ className, render, ...props }) {
3247
3588
  props: mergeProps(defaultProps, props)
3248
3589
  });
3249
3590
  }
3591
+ function MessageListEndFade({ className, render, ...props }) {
3592
+ const { endFade } = messageList();
3593
+ const defaultProps = {
3594
+ "data-slot": "message-list-end-fade",
3595
+ "aria-hidden": true,
3596
+ className: endFade({ className })
3597
+ };
3598
+ return useRender({
3599
+ defaultTagName: "div",
3600
+ render,
3601
+ props: mergeProps(defaultProps, props)
3602
+ });
3603
+ }
3250
3604
  //#endregion
3251
3605
  //#region src/components/message-list/message-list-jump.tsx
3252
3606
  function MessageListJumpControls({ className, render, side = "bottom", ...props }) {
@@ -3407,4 +3761,143 @@ function useMouseOnlyPointerSensor(distance) {
3407
3761
  return useSensor(MouseOnlyPointerSensor, options);
3408
3762
  }
3409
3763
  //#endregion
3410
- export { MessageReactionTooltipContent as $, useTheme as $n, DropdownMenuRadioGroup as $t, messageEmbed as A, TooltipTrigger as An, MessageItemAvatarSlot as At, MessageReferenceLabel as B, DialogOverlay as Bn, AvatarImage as Bt, MessageQuotedPreviewThread as C, Checkbox$1 as Cn, MessageItemAttachments as Ct, MessageEmbedContent as D, TooltipContent as Dn, MessageItemEmbedded as Dt, MessageEmbed as E, Tooltip$1 as En, MessageItemEdited as Et, MessageMultiSelectCheckbox as F, DialogContent as Fn, Avatar$1 as Ft, MessageReactionChip as G, Button$1 as Gn, DropdownMenuContent as Gt, MessageReferenceText as H, DialogSurface as Hn, DropdownMenu as Ht, MessageMultiSelectToolbar as I, DialogDescription as In, AvatarBadge as It, MessageReactionGlyph as J, defaultNativeButton as Jn, DropdownMenuItemCount as Jt, MessageReactionCount as K, buttonVariants as Kn, DropdownMenuFooter as Kt, MessageMultiSelectToolbarActions as L, DialogFooter as Ln, AvatarFallback as Lt, MessageTextSelectionToolbarButton as M, Dialog$1 as Mn, MessageItemGutter as Mt, MessageTextSelectionToolbarSeparator as N, DialogBody as Nn, MessageItem as Nt, MessageEmbedFooter as O, TooltipPortal as On, MessageItemFooter as Ot, MessageMultiSelect as P, DialogClose as Pn, searchHit as Pt, MessageReactionQuickRow as Q, useThemeScopeProps as Qn, DropdownMenuPortal as Qt, MessageReferenceChip as R, DialogHeader as Rn, AvatarGroup as Rt, MessageQuotedPreviewText as S, useMobileViewport as Sn, MessageItemTime as St, MessageQuotedPreviewUnavailable as T, PRESENCE_COLOR as Tn, MessageItemContent as Tt, MessageReferenceUnavailable as U, DialogTitle as Un, DropdownMenuCheckboxItem as Ut, MessageReferencePending as V, DialogPortal as Vn, useOverflowTitle as Vt, MessageReactionAddButton as W, DialogTrigger as Wn, DropdownMenuCheckboxItemIndicator as Wt, MessageReactionPickerStatic as X, withOverlayLayer as Xn, DropdownMenuLabel as Xt, MessageReactionPickerContent as Y, useParentOverlayKind as Yn, DropdownMenuItemLabel as Yt, MessageReactionQuickButton as Z, resolveThemeScopeProps as Zn, DropdownMenuPopup as Zt, MessageQuotedPreviewAuthorName as _, ScrollAreaContent as _n, MessageItemMeta as _t, MessageListJumpPillDismiss as a, DropdownMenuSubmenuTrigger as an, decisionWidth as ar, MessageItemBadge as at, MessageQuotedPreviewHeader as b, ScrollAreaThumb as bn, MessageItemSenderButton as bt, MessageListHistoryLimited as c, KbdGroup as cn, MessageItemSavedIndicator as ct, MessageQuotedPreview as d, PanelFooter as dn, MessageItemDelegatedAvatar as dt, DropdownMenuRadioItem as en, ThemeStateContext as er, MessageReactionTooltipMeta as et, MessageQuotedPreviewAttachment as f, PanelHeaderRoot as fn, MessageItemDelegatedBy as ft, MessageQuotedPreviewAuthorMeta as g, ScrollArea$1 as gn, MessageItemInlineStatus as gt, MessageQuotedPreviewAuthorDelegatedBy as h, PanelSection as hn, MessageItemHeader as ht, MessageListJumpPill as i, DropdownMenuSubmenu as in, headEdges as ir, MessageReactionTooltipSeparator as it, MessageTextSelectionToolbar as j, Badge as jn, MessageItemContinuationTime as jt, MessageEmbedHeader as k, TooltipProvider as kn, MessageItemSearchMatch as kt, MessageListNotice as l, Panel as ln, MessageItemToolbar as lt, MessageQuotedPreviewAuthor as m, PanelScrollViewport as mn, MessageItemDelegatedByName as mt, useMouseOnlyPointerSensor as n, DropdownMenuSeparator as nn, controlIconInset as nr, MessageReactionTooltipNameText as nt, MessageListJumpPillGroup as o, DropdownMenuTrigger as on, MessageItemBadgeSeparator as ot, MessageQuotedPreviewAttachments as p, PanelScrollContent as pn, MessageItemDelegatedByButton as pt, MessageReactionErrorIndicator as q, Spinner as qn, DropdownMenuItem as qt, MessageListJumpControls as r, DropdownMenuShortcut as rn, headEdgePull as rr, MessageReactionTooltipNames as rt, MessageListDateDivider as s, Kbd as sn, MessageItemReadReceipt as st, useHoldThenMoveTouchSensor as t, DropdownMenuRadioItemIndicator as tn, tv$1 as tr, MessageReactionTooltipName as tt, MessageList as u, PanelBody as un, MessageItemToolbarButton as ut, MessageQuotedPreviewChannel as v, ScrollAreaCorner as vn, MessageItemSender as vt, MessageQuotedPreviewTimestamp as w, CheckboxIndicator as wn, MessageItemBody as wt, MessageQuotedPreviewLoading as x, ScrollAreaViewport as xn, MessageItemSenderGroup as xt, MessageQuotedPreviewContent as y, ScrollAreaScrollbar as yn, MessageItemSenderBadges as yt, MessageReferenceIndicator as z, DialogNav as zn, AvatarGroupCount as zt };
3764
+ //#region src/components/inbox-item/inbox-item.recipe.ts
3765
+ const inboxItem = tv$1({
3766
+ slots: {
3767
+ item: [
3768
+ "relative grid w-full grid-cols-[minmax(0,1fr)_auto] items-start gap-3 p-3 text-left",
3769
+ "has-data-[slot=inbox-item-selection]:grid-cols-[auto_minmax(0,1fr)_auto]",
3770
+ "has-data-[slot=inbox-item-leading]:grid-cols-[auto_minmax(0,1fr)_auto]",
3771
+ "has-data-[slot=inbox-item-selection]:has-data-[slot=inbox-item-leading]:grid-cols-[auto_auto_minmax(0,1fr)_auto]",
3772
+ "transition-colors",
3773
+ "gap-x-3 gap-y-0 rounded-none border-0 bg-transparent px-4 py-3 shadow-none",
3774
+ "before:pointer-events-none before:absolute before:top-0 before:right-0 before:left-4 before:hidden before:border-t before:border-line-hairline",
3775
+ "[[data-slot=inbox-item]+&]:before:block has-data-[slot=inbox-item-selection]:before:left-11",
3776
+ "has-data-[slot=inbox-item-leading]:before:left-16",
3777
+ "has-data-[slot=inbox-item-selection]:has-data-[slot=inbox-item-leading]:before:left-23",
3778
+ "hover:bg-fill-subtle not-data-[active=true]:active:bg-fill-medium",
3779
+ "not-data-[active=true]:data-popup-open:bg-fill-subtle not-data-[active=true]:has-data-popup-open:bg-fill-subtle",
3780
+ "data-[active=true]:bg-info-soft data-[active=true]:hover:bg-info-soft",
3781
+ "data-disabled:pointer-events-none data-disabled:hover:bg-transparent",
3782
+ "has-[[data-slot=inbox-item-open]:focus-visible]:keyboard:inset-ring-2 has-[[data-slot=inbox-item-open]:focus-visible]:keyboard:inset-ring-foreground",
3783
+ "not-data-[density=compact]:has-data-[slot=inbox-item-trailing]:[--inbox-item-content-display:grid] not-data-[density=compact]:has-data-[slot=inbox-item-trailing]:[--inbox-item-content-end:-1]"
3784
+ ],
3785
+ itemTrigger: ["absolute inset-0 z-0 outline-none"],
3786
+ itemLeading: ["pointer-events-none relative z-10 flex size-9 shrink-0 items-center justify-center"],
3787
+ itemLeadingBadge: [
3788
+ "absolute -right-0.5 -bottom-0.5 z-10 inline-flex size-3.5 items-center justify-center",
3789
+ "rounded-[3px] border border-sticker-ink outline-2 outline-layer-canvas outline-solid",
3790
+ "bg-layer-canvas bg-[linear-gradient(var(--info-soft),var(--info-soft))] text-foreground",
3791
+ "[&_svg]:size-2.5 [&_svg]:shrink-0"
3792
+ ],
3793
+ itemSelection: ["relative z-10 mt-0.5 flex size-4 shrink-0 items-center justify-center"],
3794
+ itemContent: [
3795
+ "pointer-events-none relative z-10 min-w-0 flex-1 text-left",
3796
+ "-col-start-3 col-end-(--inbox-item-content-end) row-start-1",
3797
+ "[display:var(--inbox-item-content-display,block)] grid-cols-subgrid"
3798
+ ],
3799
+ itemContext: [
3800
+ "col-span-full nth-[-n+2]:col-[1/2]",
3801
+ "flex min-w-0 items-center",
3802
+ "mb-0.5 gap-1.5 py-0",
3803
+ "text-caption text-foreground-hint"
3804
+ ],
3805
+ itemSubtitle: [
3806
+ "col-span-full nth-[-n+2]:col-[1/2]",
3807
+ "min-w-0",
3808
+ "mt-0.5 mb-0 py-0",
3809
+ "text-caption text-foreground-hint"
3810
+ ],
3811
+ itemHeading: [
3812
+ "col-span-full nth-[-n+2]:col-[1/2]",
3813
+ "flex min-w-0 items-start gap-2",
3814
+ "mb-0"
3815
+ ],
3816
+ itemTitle: [
3817
+ "relative line-clamp-2 min-w-0 flex-1 pl-[18px]",
3818
+ "[&>svg]:absolute [&>svg]:top-[calc((1lh-14px)/2)] [&>svg]:left-0 [&>svg]:size-3.5",
3819
+ "font-sans text-subhead font-semibold text-foreground-muted",
3820
+ "group-data-[unread=true]/inbox-item:font-bold group-data-[unread=true]/inbox-item:text-foreground",
3821
+ "[&>svg]:text-foreground-hint"
3822
+ ],
3823
+ itemTrailing: [
3824
+ "pointer-events-none relative z-10 col-[-2/-1] row-start-1",
3825
+ "flex shrink-0",
3826
+ "mt-0 flex-col items-end gap-2 pt-px",
3827
+ "max-md:flex-col max-md:items-end max-md:gap-2",
3828
+ "after:hidden after:size-[9px] after:shrink-0 after:rounded-[2px] after:border-[1.5px] after:border-sticker-ink after:bg-attention-400",
3829
+ "group-data-[unread=true]/inbox-item:after:block",
3830
+ "*:not-data-[reveal=hover]:opacity-[calc(1-var(--inbox-item-reveal-aside,0)*var(--inbox-item-revealed,0))] after:opacity-[calc(1-var(--inbox-item-reveal-aside,0)*var(--inbox-item-revealed,0))]",
3831
+ "*:not-data-[reveal=hover]:mr-(--inbox-item-aside-room,0px) after:mr-(--inbox-item-aside-room,0px)",
3832
+ "*:not-data-[reveal=hover]:transition-opacity after:transition-opacity",
3833
+ "pointer-fine:has-[>[data-reveal=hover]]:[--inbox-item-reveal-aside:1]",
3834
+ "pointer-coarse:has-[>[data-reveal=hover]]:[--inbox-item-aside-room:--spacing(11)]",
3835
+ "group-hover/inbox-item:[--inbox-item-revealed:1] group-focus-within/inbox-item:[--inbox-item-revealed:1]",
3836
+ "group-data-[active=true]/inbox-item:[--inbox-item-revealed:1] group-data-popup-open/inbox-item:[--inbox-item-revealed:1]",
3837
+ "has-[>[data-reveal=hover]_[data-popup-open]]:[--inbox-item-revealed:1]"
3838
+ ],
3839
+ itemMarks: ["flex h-5 shrink-0 items-center justify-end gap-1.5", "text-foreground-hint"],
3840
+ itemHoverTarget: ["pointer-events-auto"],
3841
+ itemTimestamp: ["shrink-0 whitespace-nowrap text-right tabular-nums", "font-mono text-mono-meta text-foreground-hint"],
3842
+ itemBody: [
3843
+ "col-span-full nth-[-n+2]:col-[1/2]",
3844
+ "line-clamp-2",
3845
+ "mt-0.5 text-callout text-foreground-muted"
3846
+ ],
3847
+ itemMessage: [
3848
+ "col-span-full nth-[-n+2]:col-[1/2]",
3849
+ "min-w-0",
3850
+ "mt-0.5 line-clamp-2 text-callout text-foreground-muted"
3851
+ ],
3852
+ itemSender: ["font-semibold text-foreground"],
3853
+ itemMetadata: [
3854
+ "col-span-full nth-[-n+2]:col-[1/2]",
3855
+ "flex min-h-5 flex-wrap items-center gap-1.5",
3856
+ "mt-2"
3857
+ ],
3858
+ itemActions: [
3859
+ "pointer-events-auto flex shrink-0 items-center",
3860
+ "order-last gap-0.5",
3861
+ "*:data-[slot=panel-action]:h-8 *:data-[slot=panel-action]:min-w-8 [&>[data-slot=panel-action]>svg]:size-[18px]",
3862
+ "*:data-[slot=panel-toggle-action]:h-8 *:data-[slot=panel-toggle-action]:min-w-8 [&>[data-slot=panel-toggle-action]>svg]:size-[18px]",
3863
+ "[&>[data-slot=panel-toggle-action][data-pressed]]:border-transparent",
3864
+ "[&>[data-slot=panel-toggle-action][data-pressed]]:bg-transparent",
3865
+ "[&>[data-slot=panel-toggle-action][data-pressed]]:text-foreground",
3866
+ "[&>[data-slot=panel-toggle-action][data-pressed]]:hover:bg-fill-medium [&>[data-slot=panel-toggle-action][data-pressed]]:active:bg-fill-medium",
3867
+ "pointer-coarse:gap-3",
3868
+ "pointer-coarse:*:data-[slot=panel-action]:after:absolute pointer-coarse:*:data-[slot=panel-action]:after:-inset-1.5",
3869
+ "pointer-coarse:*:data-[slot=panel-toggle-action]:after:absolute pointer-coarse:*:data-[slot=panel-toggle-action]:after:-inset-1.5"
3870
+ ]
3871
+ },
3872
+ variants: {
3873
+ density: { compact: {
3874
+ item: ["items-center"],
3875
+ itemTitle: ["line-clamp-1", "pl-0 has-[>svg]:pl-[18px]"],
3876
+ itemTrailing: [
3877
+ "gap-0 pt-0",
3878
+ "max-md:gap-0",
3879
+ "group-data-[unread=true]/inbox-item:after:hidden"
3880
+ ],
3881
+ itemTimestamp: ["leading-5"],
3882
+ itemBody: ["line-clamp-1", "mt-0"],
3883
+ itemMessage: ["line-clamp-1", "mt-0"]
3884
+ } },
3885
+ reveal: { hover: { itemActions: [
3886
+ "absolute top-0 right-0 z-10",
3887
+ "pointer-events-none opacity-0 transition-opacity",
3888
+ "group-hover/inbox-item:pointer-events-auto group-hover/inbox-item:opacity-100",
3889
+ "group-focus-within/inbox-item:pointer-events-auto group-focus-within/inbox-item:opacity-100",
3890
+ "group-data-[active=true]/inbox-item:pointer-events-auto group-data-[active=true]/inbox-item:opacity-100",
3891
+ "group-data-popup-open/inbox-item:pointer-events-auto group-data-popup-open/inbox-item:opacity-100",
3892
+ "has-data-popup-open:pointer-events-auto has-data-popup-open:opacity-100",
3893
+ "pointer-coarse:pointer-events-auto pointer-coarse:opacity-100 pointer-coarse:only:static"
3894
+ ] } }
3895
+ },
3896
+ compoundVariants: [{
3897
+ density: "compact",
3898
+ reveal: "hover",
3899
+ class: { itemActions: ["top-1/2 -translate-y-1/2", "pointer-coarse:only:translate-y-0"] }
3900
+ }]
3901
+ });
3902
+ //#endregion
3903
+ export { MessageReactionPickerStatic as $, DialogHeader as $n, observeTruncation as $t, MessageEmbedFooter as A, ScrollAreaContent as An, MessageItemEmbedded as At, MessageReferenceChip as B, TooltipContent as Bn, AvatarFallback as Bt, MessageQuotedPreviewLoading as C, PanelBody as Cn, MessageItemSenderButton as Ct, MessageQuotedPreviewUnavailable as D, PanelScrollViewport as Dn, MessageItemBody as Dt, MessageQuotedPreviewTimestamp as E, PanelScrollContent as En, MessageItemAttachments as Et, MessageTextSelectionToolbarSeparator as F, useMobileViewport as Fn, MessageItemGutter as Ft, MessageReferenceText as G, textLinkVariants as Gn, SegmentedControlCount as Gt, MessageReferenceLabel as H, TooltipProvider as Hn, AvatarGroupCount as Ht, MessageMultiSelect as I, Checkbox$1 as In, MessageItem as It, MessageReactionChip as J, DialogBody as Jn, SegmentedControlLink as Jt, MessageReferenceUnavailable as K, Badge as Kn, SegmentedControlItem as Kt, MessageMultiSelectCheckbox as L, CheckboxIndicator as Ln, searchHit as Lt, messageEmbed as M, ScrollAreaScrollbar as Mn, MessageItemSearchMatch as Mt, MessageTextSelectionToolbar as N, ScrollAreaThumb as Nn, MessageItemAvatarSlot as Nt, MessageEmbed as O, PanelSection as On, MessageItemContent as Ot, MessageTextSelectionToolbarButton as P, ScrollAreaViewport as Pn, MessageItemContinuationTime as Pt, MessageReactionPickerContent as Q, DialogFooter as Qn, measureElement as Qt, MessageMultiSelectToolbar as R, PRESENCE_COLOR as Rn, Avatar$1 as Rt, MessageQuotedPreviewHeader as S, Panel as Sn, MessageItemSenderBadges as St, MessageQuotedPreviewThread as T, PanelHeaderRoot as Tn, MessageItemTime as Tt, MessageReferencePending as U, TooltipTrigger as Un, AvatarImage as Ut, MessageReferenceIndicator as V, TooltipPortal as Vn, AvatarGroup as Vt, MessageReferenceSuffix as W, TextLink as Wn, SegmentedControl as Wt, MessageReactionErrorIndicator as X, DialogContent as Xn, useOverflowTitle as Xt, MessageReactionCount as Y, DialogClose as Yn, SegmentedControlNav as Yt, MessageReactionGlyph as Z, DialogDescription as Zn, measureContent as Zt, MessageQuotedPreviewAuthorDelegatedBy as _, DropdownMenuSubmenu as _n, controlIconInset as _r, MessageItemDelegatedByName as _t, MessageListJumpPill as a, DropdownMenuFooter as an, DialogTrigger as ar, MessageReactionTooltipNameText as at, MessageQuotedPreviewChannel as b, Kbd as bn, decisionWidth as br, MessageItemMeta as bt, MessageListDateDivider as c, DropdownMenuItemLabel as cn, Spinner as cr, MessageItemBadge as ct, MessageListNotice as d, DropdownMenuPortal as dn, withOverlayLayer as dr, MessageItemSavedIndicator as dt, readNow as en, DialogNav as er, MessageReactionQuickButton as et, MessageList as f, DropdownMenuRadioGroup as fn, resolveThemeScopeProps as fr, MessageItemToolbar as ft, MessageQuotedPreviewAuthor as g, DropdownMenuShortcut as gn, tv$1 as gr, MessageItemDelegatedByButton as gt, MessageQuotedPreviewAttachments as h, DropdownMenuSeparator as hn, ThemeStateContext as hr, MessageItemDelegatedBy as ht, MessageListJumpControls as i, DropdownMenuContent as in, DialogTitle as ir, MessageReactionTooltipName as it, MessageEmbedHeader as j, ScrollAreaCorner as jn, MessageItemFooter as jt, MessageEmbedContent as k, ScrollArea$1 as kn, MessageItemEdited as kt, MessageListEndFade as l, DropdownMenuLabel as ln, defaultNativeButton as lr, MessageItemBadgeSeparator as lt, MessageQuotedPreviewAttachment as m, DropdownMenuRadioItemIndicator as mn, useTheme as mr, MessageItemDelegatedAvatar as mt, useHoldThenMoveTouchSensor as n, DropdownMenuCheckboxItem as nn, DialogPortal as nr, MessageReactionTooltipContent as nt, MessageListJumpPillDismiss as o, DropdownMenuItem as on, Button$1 as or, MessageReactionTooltipNames as ot, MessageQuotedPreview as p, DropdownMenuRadioItem as pn, useThemeScopeProps as pr, MessageItemToolbarButton as pt, MessageReactionAddButton as q, Dialog$1 as qn, SegmentedControlLabel as qt, useMouseOnlyPointerSensor as r, DropdownMenuCheckboxItemIndicator as rn, DialogSurface as rr, MessageReactionTooltipMeta as rt, MessageListJumpPillGroup as s, DropdownMenuItemCount as sn, buttonVariants as sr, MessageReactionTooltipSeparator as st, inboxItem as t, DropdownMenu as tn, DialogOverlay as tr, MessageReactionQuickRow as tt, MessageListHistoryLimited as u, DropdownMenuPopup as un, useParentOverlayKind as ur, MessageItemReadReceipt as ut, MessageQuotedPreviewAuthorMeta as v, DropdownMenuSubmenuTrigger as vn, headEdgePull as vr, MessageItemHeader as vt, MessageQuotedPreviewText as w, PanelFooter as wn, MessageItemSenderGroup as wt, MessageQuotedPreviewContent as x, KbdGroup as xn, MessageItemSender as xt, MessageQuotedPreviewAuthorName as y, DropdownMenuTrigger as yn, headEdges as yr, MessageItemInlineStatus as yt, MessageMultiSelectToolbarActions as z, Tooltip$1 as zn, AvatarBadge as zt };