@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.
- package/CHANGELOG.md +157 -0
- package/codemods/button-sizes.mjs +340 -0
- package/dist/cn.mjs +8 -1
- package/dist/foundation.css +13 -0
- package/dist/{touch-drag-BA_Fxs2Z.mjs → inbox-item.recipe-DelZxRmY.mjs} +525 -32
- package/dist/{index-RFu5pOr7.d.mts → index-jTmbN7ov.d.mts} +95 -3
- package/dist/index.d.mts +2 -44
- package/dist/index.mjs +45 -291
- package/dist/styles.css +67 -0
- package/dist/tokens.json +24 -0
- package/dist/wip.d.mts +112 -3
- package/dist/wip.mjs +370 -3
- package/package.json +8 -1
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
1625
|
-
const
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
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-
|
|
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
|
|
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
|
|
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]:
|
|
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-
|
|
2952
|
-
thread: ["inline-flex items-
|
|
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: [
|
|
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
|
-
|
|
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
|
-
|
|
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 };
|