@estiva-app/ui 0.39.0 → 0.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/RichText.d.ts +78 -0
- package/dist/RichText.d.ts.map +1 -0
- package/dist/eslint/index.js +1 -0
- package/dist/eslint/index.js.map +2 -2
- package/dist/eslint/no-restyled-part.d.ts.map +1 -1
- package/dist/gates/app-checks.d.ts.map +1 -1
- package/dist/gates/index.js +11 -1
- package/dist/gates/index.js.map +2 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +350 -209
- package/dist/index.js.map +4 -4
- package/package.json +1 -1
- package/registry.json +90 -3
- package/src/RichText.mdx +79 -0
- package/src/RichText.stories.tsx +91 -0
- package/src/RichText.test.tsx +149 -0
- package/src/RichText.tsx +294 -0
- package/src/eslint/no-restyled-part.ts +1 -0
- package/src/gates/app-checks.ts +7 -0
- package/src/index.ts +1 -0
- package/src/registry/registry.test.ts +5 -5
- package/stories/Choosing.mdx +1 -0
- package/tailwind-preset.js +1 -0
- package/tokens.css +15 -0
package/dist/index.js
CHANGED
|
@@ -1955,19 +1955,158 @@ function InlineChip({ tone = "neutral", icon, href, className, children, ...prop
|
|
|
1955
1955
|
return /* @__PURE__ */ jsx27("a", { href, className: classes, ...props, children: body });
|
|
1956
1956
|
}
|
|
1957
1957
|
|
|
1958
|
+
// src/RichText.tsx
|
|
1959
|
+
import { Fragment as Fragment6, jsx as jsx28, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
1960
|
+
var RICH_TEXT_CLASSES = {
|
|
1961
|
+
base: "flex flex-col gap-1 break-words text-text-secondary",
|
|
1962
|
+
/* A heading binds to what follows it: 12px above (8 and the 4px gap), 8px below (4 and the gap); two headings in a row, 12px apart. Level 3 keeps the text's colour, one step lower. */
|
|
1963
|
+
headings: "[&>:is(h1,h2,h3)]:mb-1 [&>:is(h1,h2,h3)]:mt-2 [&>:is(h1,h2,h3):first-child]:mt-0 [&>:is(h1,h2,h3):last-child]:mb-0 [&>:is(h1,h2,h3)+:is(h1,h2,h3)]:mt-1 [&>:is(h1,h2)]:text-text-primary",
|
|
1964
|
+
lists: "[&_:is(ul,ol)]:pl-5 [&_li>p]:m-0 [&_li]:break-words [&_li]:marker:text-text-muted [&_ol]:list-decimal [&_ul]:list-disc",
|
|
1965
|
+
// eslint-disable-next-line token-spacing/no-restricted-classes -- @estiva-escape: the quote line is Peek's, 3px, between the ramp's 2 and 4
|
|
1966
|
+
quote: "[&_blockquote>p]:m-0 [&_blockquote]:border-l-[3px] [&_blockquote]:border-border-strong [&_blockquote]:pl-2.5",
|
|
1967
|
+
// eslint-disable-next-line token-values/no-restricted-classes -- @estiva-escape: code is 0.9 of the text around it, so it scales with a heading and with `small`; a named size is fixed
|
|
1968
|
+
code: "[&_:not(pre)>code]:rounded-sm [&_:not(pre)>code]:bg-bg-code [&_:not(pre)>code]:px-1 [&_:not(pre)>code]:py-0.5 [&_code]:font-mono [&_code]:text-[0.9em] [&_code]:text-text-primary",
|
|
1969
|
+
// eslint-disable-next-line token-values/no-restricted-classes -- @estiva-escape: code is 0.9 of the text around it; the code inside the block is the block's own size, not 0.9 of it again
|
|
1970
|
+
codeBlock: "[&_pre>code]:text-[1em] [&_pre]:whitespace-pre-wrap [&_pre]:break-words [&_pre]:rounded-md [&_pre]:bg-bg-code [&_pre]:p-2 [&_pre]:font-mono [&_pre]:text-[0.9em] [&_pre]:text-text-primary",
|
|
1971
|
+
divider: "[&_hr]:border-border-default",
|
|
1972
|
+
table: "[&_:is(th,td)>p]:m-0 [&_:is(th,td)]:border [&_:is(th,td)]:border-border-default [&_:is(th,td)]:px-2 [&_:is(th,td)]:py-1 [&_:is(th,td)]:text-left [&_:is(th,td)]:align-top [&_table]:w-full [&_table]:border-collapse [&_th]:bg-bg-code [&_th]:font-medium [&_th]:text-text-primary",
|
|
1973
|
+
marks: "[&_em]:italic [&_strong]:font-semibold [&_u]:underline [&_u]:underline-offset-2",
|
|
1974
|
+
default: "text-body-2 [&>:is(h2,h3)]:text-body-2 [&>:is(h2,h3)]:font-semibold [&>h1]:text-h4",
|
|
1975
|
+
small: "text-caption leading-snug [&>:is(h2,h3)]:text-caption [&>:is(h2,h3)]:font-semibold [&>h1]:text-body-2 [&>h1]:font-semibold"
|
|
1976
|
+
};
|
|
1977
|
+
function richTextClassName(size = "default", className) {
|
|
1978
|
+
const { base, headings, lists, quote, code, codeBlock, divider, table, marks } = RICH_TEXT_CLASSES;
|
|
1979
|
+
return cn(base, headings, lists, quote, code, codeBlock, divider, table, marks, RICH_TEXT_CLASSES[size], className);
|
|
1980
|
+
}
|
|
1981
|
+
var LINK_SPLIT = /(\[[^[\]\n]+\]\((?:https?:\/\/|mailto:)[^\s)]+\)|https?:\/\/[^\s]+)/g;
|
|
1982
|
+
var WRITTEN_LINK = /^\[([^[\]\n]+)\]\(((?:https?:\/\/|mailto:)[^\s)]+)\)$/;
|
|
1983
|
+
var BARE_LINK = /^(https?:\/\/\S+?)([.,;:!?)\]]*)$/;
|
|
1984
|
+
var keepToLink = (event) => event.stopPropagation();
|
|
1985
|
+
function textWithLinks(text, renderText) {
|
|
1986
|
+
const parts = text.split(LINK_SPLIT);
|
|
1987
|
+
if (parts.length === 1) return renderText(text);
|
|
1988
|
+
return parts.map((part, i) => {
|
|
1989
|
+
const written = part.match(WRITTEN_LINK);
|
|
1990
|
+
if (written) {
|
|
1991
|
+
return /* @__PURE__ */ jsx28("span", { className: "break-words", children: /* @__PURE__ */ jsx28(Link, { href: written[2], external: true, onClick: keepToLink, children: written[1] }) }, i);
|
|
1992
|
+
}
|
|
1993
|
+
const bare = i % 2 === 1 ? part.match(BARE_LINK) : null;
|
|
1994
|
+
if (bare) {
|
|
1995
|
+
return (
|
|
1996
|
+
// An address has no spaces to wrap at, so it may break anywhere.
|
|
1997
|
+
/* @__PURE__ */ jsxs20("span", { className: "break-all", children: [
|
|
1998
|
+
/* @__PURE__ */ jsx28(Link, { href: bare[1], external: true, onClick: keepToLink, children: bare[1] }),
|
|
1999
|
+
bare[2]
|
|
2000
|
+
] }, i)
|
|
2001
|
+
);
|
|
2002
|
+
}
|
|
2003
|
+
return part ? /* @__PURE__ */ jsx28("span", { children: renderText(part) }, i) : null;
|
|
2004
|
+
});
|
|
2005
|
+
}
|
|
2006
|
+
function Runs({ runs, draw }) {
|
|
2007
|
+
return /* @__PURE__ */ jsx28(Fragment6, { children: (runs ?? []).map((run, i) => {
|
|
2008
|
+
if (run.reference) return /* @__PURE__ */ jsx28("span", { children: draw.renderReference(run.reference, run) }, i);
|
|
2009
|
+
if (run.marks.includes("code")) {
|
|
2010
|
+
return /* @__PURE__ */ jsx28("code", { children: run.text }, i);
|
|
2011
|
+
}
|
|
2012
|
+
let node = run.text.split("\n").map((line, j) => /* @__PURE__ */ jsxs20("span", { children: [
|
|
2013
|
+
j > 0 && /* @__PURE__ */ jsx28("br", {}),
|
|
2014
|
+
textWithLinks(line, draw.renderText)
|
|
2015
|
+
] }, j));
|
|
2016
|
+
if (run.marks.includes("underline")) node = /* @__PURE__ */ jsx28("u", { children: node });
|
|
2017
|
+
if (run.marks.includes("italic")) node = /* @__PURE__ */ jsx28("em", { children: node });
|
|
2018
|
+
if (run.marks.includes("bold")) node = /* @__PURE__ */ jsx28("strong", { children: node });
|
|
2019
|
+
return /* @__PURE__ */ jsx28("span", { children: node }, i);
|
|
2020
|
+
}) });
|
|
2021
|
+
}
|
|
2022
|
+
var named = (block) => block.typeName ?? block.type;
|
|
2023
|
+
function Table({ block, draw }) {
|
|
2024
|
+
const rows = (block.children ?? []).filter((row) => named(row) === "tableRow");
|
|
2025
|
+
if (!rows.length) return null;
|
|
2026
|
+
const cells = (row) => (row.children ?? []).map((cell, i) => {
|
|
2027
|
+
const header = named(cell) === "tableHeader";
|
|
2028
|
+
const Cell = header ? "th" : "td";
|
|
2029
|
+
const { colspan, rowspan } = cell.attrs ?? {};
|
|
2030
|
+
return /* @__PURE__ */ jsxs20(
|
|
2031
|
+
Cell,
|
|
2032
|
+
{
|
|
2033
|
+
"data-block-id": cell.id,
|
|
2034
|
+
colSpan: colspan && colspan > 1 ? colspan : void 0,
|
|
2035
|
+
rowSpan: rowspan && rowspan > 1 ? rowspan : void 0,
|
|
2036
|
+
children: [
|
|
2037
|
+
(cell.children ?? []).map((child, j) => /* @__PURE__ */ jsx28(Runs, { runs: child.inline, draw }, j)),
|
|
2038
|
+
/* @__PURE__ */ jsx28(Runs, { runs: cell.inline, draw })
|
|
2039
|
+
]
|
|
2040
|
+
},
|
|
2041
|
+
cell.id ?? i
|
|
2042
|
+
);
|
|
2043
|
+
});
|
|
2044
|
+
const first = rows[0].children ?? [];
|
|
2045
|
+
const headerRow = first.length > 0 && first.every((cell) => named(cell) === "tableHeader");
|
|
2046
|
+
return /* @__PURE__ */ jsxs20("table", { "data-block-id": block.id, children: [
|
|
2047
|
+
headerRow && /* @__PURE__ */ jsx28("thead", { children: /* @__PURE__ */ jsx28("tr", { "data-block-id": rows[0].id, children: cells(rows[0]) }) }),
|
|
2048
|
+
/* @__PURE__ */ jsx28("tbody", { children: (headerRow ? rows.slice(1) : rows).map((row, i) => /* @__PURE__ */ jsx28("tr", { "data-block-id": row.id, children: cells(row) }, row.id ?? i)) })
|
|
2049
|
+
] });
|
|
2050
|
+
}
|
|
2051
|
+
function Block({ block, draw }) {
|
|
2052
|
+
const own = draw.renderBlock?.(block);
|
|
2053
|
+
if (own !== void 0) return own;
|
|
2054
|
+
const runs = /* @__PURE__ */ jsx28(Runs, { runs: block.inline, draw });
|
|
2055
|
+
switch (block.type) {
|
|
2056
|
+
case "heading": {
|
|
2057
|
+
if (block.level === 1) return /* @__PURE__ */ jsx28("h1", { "data-block-id": block.id, children: runs });
|
|
2058
|
+
if (block.level === 3) return /* @__PURE__ */ jsx28("h3", { "data-block-id": block.id, children: runs });
|
|
2059
|
+
return /* @__PURE__ */ jsx28("h2", { "data-block-id": block.id, children: runs });
|
|
2060
|
+
}
|
|
2061
|
+
case "paragraph":
|
|
2062
|
+
return /* @__PURE__ */ jsx28("p", { "data-block-id": block.id, children: runs });
|
|
2063
|
+
case "bulletList":
|
|
2064
|
+
case "orderedList": {
|
|
2065
|
+
const items = (block.children ?? []).map((item, i) => /* @__PURE__ */ jsx28("li", { "data-block-id": item.id, children: /* @__PURE__ */ jsx28(Runs, { runs: item.inline, draw }) }, item.id ?? i));
|
|
2066
|
+
return block.type === "bulletList" ? /* @__PURE__ */ jsx28("ul", { "data-block-id": block.id, children: items }) : /* @__PURE__ */ jsx28("ol", { "data-block-id": block.id, start: block.start, children: items });
|
|
2067
|
+
}
|
|
2068
|
+
case "blockquote":
|
|
2069
|
+
return /* @__PURE__ */ jsx28("blockquote", { "data-block-id": block.id, children: runs });
|
|
2070
|
+
case "codeBlock":
|
|
2071
|
+
return /* @__PURE__ */ jsx28("pre", { "data-block-id": block.id, "data-language": block.language, children: /* @__PURE__ */ jsx28("code", { children: (block.inline ?? []).map((run) => run.text).join("") }) });
|
|
2072
|
+
case "horizontalRule":
|
|
2073
|
+
return /* @__PURE__ */ jsx28("hr", { "data-block-id": block.id });
|
|
2074
|
+
case "table": {
|
|
2075
|
+
const table = /* @__PURE__ */ jsx28(Table, { block, draw });
|
|
2076
|
+
if ((block.children ?? []).some((row) => named(row) === "tableRow")) return table;
|
|
2077
|
+
break;
|
|
2078
|
+
}
|
|
2079
|
+
}
|
|
2080
|
+
return /* @__PURE__ */ jsxs20("div", { "data-block-id": block.id, "data-block-type": named(block), children: [
|
|
2081
|
+
runs,
|
|
2082
|
+
(block.children ?? []).map((child, i) => /* @__PURE__ */ jsx28(Block, { block: child, draw }, child.id ?? i))
|
|
2083
|
+
] });
|
|
2084
|
+
}
|
|
2085
|
+
function RichText({
|
|
2086
|
+
blocks,
|
|
2087
|
+
size = "default",
|
|
2088
|
+
renderText = (text) => text,
|
|
2089
|
+
renderReference = (_reference, run) => run.text,
|
|
2090
|
+
renderBlock
|
|
2091
|
+
}) {
|
|
2092
|
+
if (blocks.length === 0) return null;
|
|
2093
|
+
const draw = { renderText, renderReference, renderBlock };
|
|
2094
|
+
return /* @__PURE__ */ jsx28("div", { "data-rich-text": true, className: richTextClassName(size), children: blocks.map((block, i) => /* @__PURE__ */ jsx28(Block, { block, draw }, block.id ?? i)) });
|
|
2095
|
+
}
|
|
2096
|
+
|
|
1958
2097
|
// src/IdentityMenu.tsx
|
|
1959
2098
|
import { useCallback, useRef as useRef5 } from "react";
|
|
1960
2099
|
|
|
1961
2100
|
// src/Person.tsx
|
|
1962
|
-
import { jsx as
|
|
2101
|
+
import { jsx as jsx29, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
1963
2102
|
function Person({ name, picture, fallback = "\u2014", size = 20, className }) {
|
|
1964
2103
|
return (
|
|
1965
2104
|
// gap-2: the face-to-name distance is one rule (8px) wherever a person
|
|
1966
2105
|
// appears — Katerina, 2026-09-01, set on Person so PersonTrigger and every
|
|
1967
2106
|
// row agree by construction.
|
|
1968
|
-
/* @__PURE__ */
|
|
1969
|
-
/* @__PURE__ */
|
|
1970
|
-
/* @__PURE__ */
|
|
2107
|
+
/* @__PURE__ */ jsxs21("span", { className: cn("flex min-w-0 items-center gap-2", className), children: [
|
|
2108
|
+
/* @__PURE__ */ jsx29(Avatar, { name, src: picture, size }),
|
|
2109
|
+
/* @__PURE__ */ jsx29("span", { className: cn("truncate", !name && "text-text-muted"), children: name ?? fallback })
|
|
1971
2110
|
] })
|
|
1972
2111
|
);
|
|
1973
2112
|
}
|
|
@@ -1975,10 +2114,10 @@ function Person({ name, picture, fallback = "\u2014", size = 20, className }) {
|
|
|
1975
2114
|
// src/PersonTrigger.tsx
|
|
1976
2115
|
import { Button as BaseButton5 } from "@base-ui/react/button";
|
|
1977
2116
|
import { IconChevronDown } from "@tabler/icons-react";
|
|
1978
|
-
import { jsx as
|
|
2117
|
+
import { jsx as jsx30, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
1979
2118
|
function PersonTrigger({ name, picture, fallback, size, open = false, compact = false, className, ...props }) {
|
|
1980
2119
|
if (compact) {
|
|
1981
|
-
return /* @__PURE__ */
|
|
2120
|
+
return /* @__PURE__ */ jsx30(
|
|
1982
2121
|
BaseButton5,
|
|
1983
2122
|
{
|
|
1984
2123
|
type: "button",
|
|
@@ -1987,13 +2126,13 @@ function PersonTrigger({ name, picture, fallback, size, open = false, compact =
|
|
|
1987
2126
|
"aria-label": props["aria-label"] ?? name ?? fallback,
|
|
1988
2127
|
className: cn("cursor-pointer rounded-full", className),
|
|
1989
2128
|
...props,
|
|
1990
|
-
children: /* @__PURE__ */
|
|
2129
|
+
children: /* @__PURE__ */ jsx30(Avatar, { name, src: picture, size: size ?? 36 })
|
|
1991
2130
|
}
|
|
1992
2131
|
);
|
|
1993
2132
|
}
|
|
1994
2133
|
return (
|
|
1995
2134
|
// @estiva-escape(no-copied-look): N5 (Katerina, 24 September: record only): a row that fills on hover, as NavItem also does
|
|
1996
|
-
/* @__PURE__ */
|
|
2135
|
+
/* @__PURE__ */ jsxs22(
|
|
1997
2136
|
BaseButton5,
|
|
1998
2137
|
{
|
|
1999
2138
|
type: "button",
|
|
@@ -2011,8 +2150,8 @@ function PersonTrigger({ name, picture, fallback, size, open = false, compact =
|
|
|
2011
2150
|
),
|
|
2012
2151
|
...props,
|
|
2013
2152
|
children: [
|
|
2014
|
-
/* @__PURE__ */
|
|
2015
|
-
/* @__PURE__ */
|
|
2153
|
+
/* @__PURE__ */ jsx30(Person, { name, picture, fallback, size: size ?? 22 }),
|
|
2154
|
+
/* @__PURE__ */ jsx30(IconChevronDown, { size: 14, stroke: 1.5, className: "shrink-0 text-text-muted" })
|
|
2016
2155
|
]
|
|
2017
2156
|
}
|
|
2018
2157
|
)
|
|
@@ -2020,10 +2159,10 @@ function PersonTrigger({ name, picture, fallback, size, open = false, compact =
|
|
|
2020
2159
|
}
|
|
2021
2160
|
|
|
2022
2161
|
// src/IdentityMenu.tsx
|
|
2023
|
-
import { Fragment as
|
|
2162
|
+
import { Fragment as Fragment7, jsx as jsx31, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
2024
2163
|
function IdentityPanel({ className, onClose = () => {
|
|
2025
2164
|
}, ...rest }) {
|
|
2026
|
-
return /* @__PURE__ */
|
|
2165
|
+
return /* @__PURE__ */ jsx31(MenuPanel, { className: cn("w-72", className), children: /* @__PURE__ */ jsx31(IdentityRows, { ...rest, onClose }) });
|
|
2027
2166
|
}
|
|
2028
2167
|
function IdentityRows({ me, signedIn, relayUrl, idBase, onCopyKey, onSignOut, onClose, children }) {
|
|
2029
2168
|
const act = (action) => () => {
|
|
@@ -2031,36 +2170,36 @@ function IdentityRows({ me, signedIn, relayUrl, idBase, onCopyKey, onSignOut, on
|
|
|
2031
2170
|
action();
|
|
2032
2171
|
};
|
|
2033
2172
|
const appRows = typeof children === "function" ? children(onClose) : children;
|
|
2034
|
-
return /* @__PURE__ */
|
|
2035
|
-
/* @__PURE__ */
|
|
2036
|
-
/* @__PURE__ */
|
|
2037
|
-
/* @__PURE__ */
|
|
2038
|
-
me.email && /* @__PURE__ */
|
|
2173
|
+
return /* @__PURE__ */ jsxs23(Fragment7, { children: [
|
|
2174
|
+
/* @__PURE__ */ jsxs23(MenuSection, { label: signedIn ? "Signed in as" : "Acting as", children: [
|
|
2175
|
+
/* @__PURE__ */ jsx31(MenuRow, { children: /* @__PURE__ */ jsx31("div", { className: "flex min-w-0 text-body-2-strong", children: /* @__PURE__ */ jsx31(Person, { name: me.name, picture: me.picture, fallback: "Anonymous", size: 28 }) }) }),
|
|
2176
|
+
/* @__PURE__ */ jsx31(Note, { children: signedIn ? "Your Estiva ID. The same person you are in every Estiva app." : "A key held by this browser only. Nobody else knows who you are." }),
|
|
2177
|
+
me.email && /* @__PURE__ */ jsxs23(Note, { children: [
|
|
2039
2178
|
me.email,
|
|
2040
2179
|
" \xB7 known to Estiva, never published to the relay"
|
|
2041
2180
|
] })
|
|
2042
2181
|
] }),
|
|
2043
|
-
relayUrl && /* @__PURE__ */
|
|
2044
|
-
/* @__PURE__ */
|
|
2045
|
-
/* @__PURE__ */
|
|
2046
|
-
/* @__PURE__ */
|
|
2047
|
-
/* @__PURE__ */
|
|
2182
|
+
relayUrl && /* @__PURE__ */ jsxs23(Fragment7, { children: [
|
|
2183
|
+
/* @__PURE__ */ jsx31(Divider, { className: "mx-0 my-2" }),
|
|
2184
|
+
/* @__PURE__ */ jsxs23(MenuSection, { label: "Workspace", children: [
|
|
2185
|
+
/* @__PURE__ */ jsx31(MenuRow, { children: /* @__PURE__ */ jsx31("span", { className: "break-all font-mono text-caption text-text-primary", children: relayUrl }) }),
|
|
2186
|
+
/* @__PURE__ */ jsx31(Note, { children: "Everyone on this relay shares this workspace, in every app." })
|
|
2048
2187
|
] })
|
|
2049
2188
|
] }),
|
|
2050
|
-
appRows && /* @__PURE__ */
|
|
2051
|
-
/* @__PURE__ */
|
|
2189
|
+
appRows && /* @__PURE__ */ jsxs23(Fragment7, { children: [
|
|
2190
|
+
/* @__PURE__ */ jsx31(Divider, { className: "mx-0 my-2" }),
|
|
2052
2191
|
appRows
|
|
2053
2192
|
] }),
|
|
2054
|
-
signedIn && idBase || onCopyKey || idBase && onSignOut ? /* @__PURE__ */
|
|
2055
|
-
signedIn && idBase && /* @__PURE__ */
|
|
2193
|
+
signedIn && idBase || onCopyKey || idBase && onSignOut ? /* @__PURE__ */ jsx31(Divider, { className: "mx-0 my-2" }) : null,
|
|
2194
|
+
signedIn && idBase && /* @__PURE__ */ jsx31(
|
|
2056
2195
|
MenuItem,
|
|
2057
2196
|
{
|
|
2058
2197
|
label: "Edit your profile in Estiva ID",
|
|
2059
2198
|
onClick: act(() => window.open(idBase, "_blank", "noopener,noreferrer"))
|
|
2060
2199
|
}
|
|
2061
2200
|
),
|
|
2062
|
-
onCopyKey && /* @__PURE__ */
|
|
2063
|
-
idBase && onSignOut && /* @__PURE__ */
|
|
2201
|
+
onCopyKey && /* @__PURE__ */ jsx31(MenuItem, { label: "Copy public key", onClick: act(onCopyKey) }),
|
|
2202
|
+
idBase && onSignOut && /* @__PURE__ */ jsx31(MenuItem, { label: "Sign out", onClick: act(onSignOut) })
|
|
2064
2203
|
] });
|
|
2065
2204
|
}
|
|
2066
2205
|
function IdentityMenu({ me, signedIn, relayUrl, idBase, onCopyKey, onSignOut, compact = false, className, children }) {
|
|
@@ -2071,13 +2210,13 @@ function IdentityMenu({ me, signedIn, relayUrl, idBase, onCopyKey, onSignOut, co
|
|
|
2071
2210
|
to be `relative`, because the panel was positioned against it; the panel
|
|
2072
2211
|
hangs from the trigger and portals now, so a positioning context here
|
|
2073
2212
|
would only be a lie about what this box does. */
|
|
2074
|
-
/* @__PURE__ */
|
|
2213
|
+
/* @__PURE__ */ jsx31("div", { className, children: /* @__PURE__ */ jsx31(
|
|
2075
2214
|
Menu,
|
|
2076
2215
|
{
|
|
2077
2216
|
align: "right",
|
|
2078
2217
|
actionsRef: actions,
|
|
2079
2218
|
className: "w-72",
|
|
2080
|
-
trigger: /* @__PURE__ */
|
|
2219
|
+
trigger: /* @__PURE__ */ jsx31(
|
|
2081
2220
|
PersonTrigger,
|
|
2082
2221
|
{
|
|
2083
2222
|
name: me.name,
|
|
@@ -2088,7 +2227,7 @@ function IdentityMenu({ me, signedIn, relayUrl, idBase, onCopyKey, onSignOut, co
|
|
|
2088
2227
|
"aria-label": compact ? "Account menu" : void 0
|
|
2089
2228
|
}
|
|
2090
2229
|
),
|
|
2091
|
-
children: /* @__PURE__ */
|
|
2230
|
+
children: /* @__PURE__ */ jsx31(
|
|
2092
2231
|
IdentityRows,
|
|
2093
2232
|
{
|
|
2094
2233
|
me,
|
|
@@ -2106,14 +2245,14 @@ function IdentityMenu({ me, signedIn, relayUrl, idBase, onCopyKey, onSignOut, co
|
|
|
2106
2245
|
);
|
|
2107
2246
|
}
|
|
2108
2247
|
function Note({ children }) {
|
|
2109
|
-
return /* @__PURE__ */
|
|
2248
|
+
return /* @__PURE__ */ jsx31("span", { className: "px-2 pb-1.5 text-caption text-text-secondary", children });
|
|
2110
2249
|
}
|
|
2111
2250
|
|
|
2112
2251
|
// src/FilePicker.tsx
|
|
2113
2252
|
import { forwardRef } from "react";
|
|
2114
|
-
import { jsx as
|
|
2253
|
+
import { jsx as jsx32 } from "react/jsx-runtime";
|
|
2115
2254
|
var FilePicker = forwardRef(function FilePicker2({ onPick, ...props }, ref) {
|
|
2116
|
-
return /* @__PURE__ */
|
|
2255
|
+
return /* @__PURE__ */ jsx32(
|
|
2117
2256
|
"input",
|
|
2118
2257
|
{
|
|
2119
2258
|
ref,
|
|
@@ -2134,7 +2273,7 @@ var FilePicker = forwardRef(function FilePicker2({ onPick, ...props }, ref) {
|
|
|
2134
2273
|
// src/Select.tsx
|
|
2135
2274
|
import { IconCheck as IconCheck2, IconChevronDown as IconChevronDown2 } from "@tabler/icons-react";
|
|
2136
2275
|
import { Select as BaseSelect } from "@base-ui/react/select";
|
|
2137
|
-
import { jsx as
|
|
2276
|
+
import { jsx as jsx33, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
2138
2277
|
var GAP4 = 4;
|
|
2139
2278
|
var VIEWPORT_PAD4 = 8;
|
|
2140
2279
|
function Select({ value, onChange, options, size = "default", ariaLabel, placeholder = "Select\u2026", disabled, disabledReason, className, ...aria }) {
|
|
@@ -2142,7 +2281,7 @@ function Select({ value, onChange, options, size = "default", ariaLabel, placeho
|
|
|
2142
2281
|
const held = Boolean(disabledReason);
|
|
2143
2282
|
const trigger = (
|
|
2144
2283
|
// @estiva-escape(no-copied-look): N1 (Katerina, 24 September: record only): Select's box drops the hover while held, so it cannot take FIELD_SHELL_CLASSES as it is
|
|
2145
|
-
/* @__PURE__ */
|
|
2284
|
+
/* @__PURE__ */ jsxs24(
|
|
2146
2285
|
BaseSelect.Trigger,
|
|
2147
2286
|
{
|
|
2148
2287
|
"aria-label": ariaLabel,
|
|
@@ -2172,21 +2311,21 @@ function Select({ value, onChange, options, size = "default", ariaLabel, placeho
|
|
|
2172
2311
|
className
|
|
2173
2312
|
),
|
|
2174
2313
|
children: [
|
|
2175
|
-
/* @__PURE__ */
|
|
2176
|
-
selected?.leading && /* @__PURE__ */
|
|
2177
|
-
/* @__PURE__ */
|
|
2314
|
+
/* @__PURE__ */ jsxs24("span", { className: cn("flex min-w-0 items-center gap-2", !selected && "text-text-muted"), children: [
|
|
2315
|
+
selected?.leading && /* @__PURE__ */ jsx33("span", { className: "flex shrink-0 items-center", children: selected.leading }),
|
|
2316
|
+
/* @__PURE__ */ jsx33(BaseSelect.Value, { className: "truncate", children: () => selected?.label ?? placeholder })
|
|
2178
2317
|
] }),
|
|
2179
|
-
/* @__PURE__ */
|
|
2318
|
+
/* @__PURE__ */ jsx33(
|
|
2180
2319
|
BaseSelect.Icon,
|
|
2181
2320
|
{
|
|
2182
|
-
render: /* @__PURE__ */
|
|
2321
|
+
render: /* @__PURE__ */ jsx33(IconChevronDown2, { size: size === "small" ? 14 : 16, stroke: 1.5, className: "shrink-0 text-text-secondary" })
|
|
2183
2322
|
}
|
|
2184
2323
|
)
|
|
2185
2324
|
]
|
|
2186
2325
|
}
|
|
2187
2326
|
)
|
|
2188
2327
|
);
|
|
2189
|
-
return /* @__PURE__ */
|
|
2328
|
+
return /* @__PURE__ */ jsxs24(
|
|
2190
2329
|
BaseSelect.Root,
|
|
2191
2330
|
{
|
|
2192
2331
|
value,
|
|
@@ -2198,8 +2337,8 @@ function Select({ value, onChange, options, size = "default", ariaLabel, placeho
|
|
|
2198
2337
|
disabled: disabled && !held,
|
|
2199
2338
|
modal: false,
|
|
2200
2339
|
children: [
|
|
2201
|
-
held ? /* @__PURE__ */
|
|
2202
|
-
/* @__PURE__ */
|
|
2340
|
+
held ? /* @__PURE__ */ jsx33(TooltipTrigger, { label: disabledReason ?? "", children: trigger }) : trigger,
|
|
2341
|
+
/* @__PURE__ */ jsx33(BaseSelect.Portal, { children: /* @__PURE__ */ jsx33(
|
|
2203
2342
|
BaseSelect.Positioner,
|
|
2204
2343
|
{
|
|
2205
2344
|
side: "bottom",
|
|
@@ -2208,25 +2347,25 @@ function Select({ value, onChange, options, size = "default", ariaLabel, placeho
|
|
|
2208
2347
|
collisionPadding: VIEWPORT_PAD4,
|
|
2209
2348
|
alignItemWithTrigger: false,
|
|
2210
2349
|
className: "z-50 data-[anchor-hidden]:hidden",
|
|
2211
|
-
children: /* @__PURE__ */
|
|
2350
|
+
children: /* @__PURE__ */ jsx33(
|
|
2212
2351
|
BaseSelect.Popup,
|
|
2213
2352
|
{
|
|
2214
|
-
render: /* @__PURE__ */
|
|
2353
|
+
render: /* @__PURE__ */ jsx33(MenuPanel, {}),
|
|
2215
2354
|
className: "min-w-[var(--anchor-width)] p-0",
|
|
2216
|
-
children: /* @__PURE__ */
|
|
2355
|
+
children: /* @__PURE__ */ jsx33(ScrollArea, { viewportClassName: "max-h-[min(288px,var(--available-height))]", contentClassName: "flex flex-col p-2", children: options.map((option) => /* @__PURE__ */ jsxs24(
|
|
2217
2356
|
BaseSelect.Item,
|
|
2218
2357
|
{
|
|
2219
2358
|
value: option.value,
|
|
2220
2359
|
className: cn(menuItemClassName({ size: "default" }), "justify-between data-[selected]:font-medium"),
|
|
2221
2360
|
children: [
|
|
2222
|
-
/* @__PURE__ */
|
|
2223
|
-
option.leading && /* @__PURE__ */
|
|
2224
|
-
/* @__PURE__ */
|
|
2361
|
+
/* @__PURE__ */ jsxs24("span", { className: "flex min-w-0 items-center gap-2", children: [
|
|
2362
|
+
option.leading && /* @__PURE__ */ jsx33("span", { className: "flex shrink-0 items-center", children: option.leading }),
|
|
2363
|
+
/* @__PURE__ */ jsx33(BaseSelect.ItemText, { className: "truncate text-body-2 text-text-primary", children: option.label })
|
|
2225
2364
|
] }),
|
|
2226
|
-
/* @__PURE__ */
|
|
2365
|
+
/* @__PURE__ */ jsx33(
|
|
2227
2366
|
BaseSelect.ItemIndicator,
|
|
2228
2367
|
{
|
|
2229
|
-
render: /* @__PURE__ */
|
|
2368
|
+
render: /* @__PURE__ */ jsx33(IconCheck2, { size: 16, stroke: 1.5, className: "shrink-0 text-text-secondary" })
|
|
2230
2369
|
}
|
|
2231
2370
|
)
|
|
2232
2371
|
]
|
|
@@ -2245,9 +2384,9 @@ function Select({ value, onChange, options, size = "default", ariaLabel, placeho
|
|
|
2245
2384
|
// src/TextInput.tsx
|
|
2246
2385
|
import { forwardRef as forwardRef2 } from "react";
|
|
2247
2386
|
import { Input } from "@base-ui/react/input";
|
|
2248
|
-
import { jsx as
|
|
2387
|
+
import { jsx as jsx34 } from "react/jsx-runtime";
|
|
2249
2388
|
var TextInput = forwardRef2(function TextInput2({ className, type = "text", size = "default", ...props }, ref) {
|
|
2250
|
-
return /* @__PURE__ */
|
|
2389
|
+
return /* @__PURE__ */ jsx34(
|
|
2251
2390
|
Input,
|
|
2252
2391
|
{
|
|
2253
2392
|
ref,
|
|
@@ -2273,13 +2412,13 @@ var TextInput = forwardRef2(function TextInput2({ className, type = "text", size
|
|
|
2273
2412
|
// src/Textarea.tsx
|
|
2274
2413
|
import { forwardRef as forwardRef3 } from "react";
|
|
2275
2414
|
import { Field as BaseField3 } from "@base-ui/react/field";
|
|
2276
|
-
import { jsx as
|
|
2415
|
+
import { jsx as jsx35 } from "react/jsx-runtime";
|
|
2277
2416
|
var Textarea = forwardRef3(function Textarea2({ className, ...props }, ref) {
|
|
2278
|
-
return /* @__PURE__ */
|
|
2417
|
+
return /* @__PURE__ */ jsx35(
|
|
2279
2418
|
BaseField3.Control,
|
|
2280
2419
|
{
|
|
2281
2420
|
ref,
|
|
2282
|
-
render: /* @__PURE__ */
|
|
2421
|
+
render: /* @__PURE__ */ jsx35("textarea", {}),
|
|
2283
2422
|
className: cn(
|
|
2284
2423
|
// The border strengthens on hover, as Select's and ChipInput's do (Katerina, 16 September:
|
|
2285
2424
|
// "aren't there hover states in text input and text area?"). Focus comes after hover in
|
|
@@ -2308,33 +2447,33 @@ import { IconX as IconX5 } from "@tabler/icons-react";
|
|
|
2308
2447
|
|
|
2309
2448
|
// src/ContainerHeader.tsx
|
|
2310
2449
|
import { IconChevronDown as IconChevronDown3 } from "@tabler/icons-react";
|
|
2311
|
-
import { jsx as
|
|
2450
|
+
import { jsx as jsx36, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
2312
2451
|
function ContainerHeader({ title, chevron = false, actions, className }) {
|
|
2313
2452
|
const text = typeof title === "string";
|
|
2314
|
-
return /* @__PURE__ */
|
|
2315
|
-
/* @__PURE__ */
|
|
2316
|
-
text ? /* @__PURE__ */
|
|
2317
|
-
chevron && /* @__PURE__ */
|
|
2453
|
+
return /* @__PURE__ */ jsxs25("div", { className: cn("flex h-12 shrink-0 items-center justify-between overflow-hidden border-b border-border-subtle py-2 pr-4 pl-5", className), children: [
|
|
2454
|
+
/* @__PURE__ */ jsx36("div", { className: cn("flex items-center gap-2 overflow-hidden", text ? "shrink-0" : "min-w-0 flex-1"), children: /* @__PURE__ */ jsxs25("div", { className: cn("flex items-center gap-1", text ? "shrink-0" : "min-w-0 flex-1"), children: [
|
|
2455
|
+
text ? /* @__PURE__ */ jsx36("span", { className: "whitespace-nowrap text-body-2-strong text-text-primary", children: title }) : /* @__PURE__ */ jsx36("div", { className: "min-w-0 flex-1", children: title }),
|
|
2456
|
+
chevron && /* @__PURE__ */ jsx36(IconChevronDown3, { size: 12, stroke: 1.5, className: "shrink-0 text-text-secondary" })
|
|
2318
2457
|
] }) }),
|
|
2319
|
-
actions && /* @__PURE__ */
|
|
2458
|
+
actions && /* @__PURE__ */ jsx36("div", { className: "flex shrink-0 items-center justify-end gap-3", children: /* @__PURE__ */ jsx36("div", { className: "flex shrink-0 items-center gap-1", children: actions }) })
|
|
2320
2459
|
] });
|
|
2321
2460
|
}
|
|
2322
2461
|
|
|
2323
2462
|
// src/DialogShell.tsx
|
|
2324
|
-
import { jsx as
|
|
2463
|
+
import { jsx as jsx37, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
2325
2464
|
function DialogShell({ title, onClose, headerContent, footer, children, bodyClassName, bodyMaxHeight, width = 502, alert = false }) {
|
|
2326
2465
|
const Parts = alert ? AlertDialog : Dialog3;
|
|
2327
2466
|
const popupRef = useRef6(null);
|
|
2328
|
-
return /* @__PURE__ */
|
|
2467
|
+
return /* @__PURE__ */ jsx37(
|
|
2329
2468
|
Parts.Root,
|
|
2330
2469
|
{
|
|
2331
2470
|
open: true,
|
|
2332
2471
|
onOpenChange: (open) => {
|
|
2333
2472
|
if (!open) onClose();
|
|
2334
2473
|
},
|
|
2335
|
-
children: /* @__PURE__ */
|
|
2336
|
-
/* @__PURE__ */
|
|
2337
|
-
/* @__PURE__ */
|
|
2474
|
+
children: /* @__PURE__ */ jsxs26(Parts.Portal, { children: [
|
|
2475
|
+
/* @__PURE__ */ jsx37(Parts.Backdrop, { className: "fixed inset-0 z-40 bg-scrim" }),
|
|
2476
|
+
/* @__PURE__ */ jsx37("div", { className: "fixed inset-0 z-50 flex items-center justify-center pointer-events-none", children: /* @__PURE__ */ jsxs26(
|
|
2338
2477
|
Parts.Popup,
|
|
2339
2478
|
{
|
|
2340
2479
|
ref: popupRef,
|
|
@@ -2343,10 +2482,10 @@ function DialogShell({ title, onClose, headerContent, footer, children, bodyClas
|
|
|
2343
2482
|
className: "bg-bg-elevated border border-border-subtle rounded-lg shadow-lg pointer-events-auto flex flex-col overflow-hidden outline-none",
|
|
2344
2483
|
style: { width },
|
|
2345
2484
|
children: [
|
|
2346
|
-
/* @__PURE__ */
|
|
2485
|
+
/* @__PURE__ */ jsx37(
|
|
2347
2486
|
ContainerHeader,
|
|
2348
2487
|
{
|
|
2349
|
-
title: headerContent ?? /* @__PURE__ */
|
|
2488
|
+
title: headerContent ?? /* @__PURE__ */ jsx37(Parts.Title, { className: "text-h4 text-text-primary", render: /* @__PURE__ */ jsx37("span", {}), children: title }),
|
|
2350
2489
|
actions: (
|
|
2351
2490
|
/*
|
|
2352
2491
|
The ✕ IS the `Close` part now, rather than a button that calls
|
|
@@ -2360,10 +2499,10 @@ function DialogShell({ title, onClose, headerContent, footer, children, bodyClas
|
|
|
2360
2499
|
so the ✕, Escape and the outside press are one path with one
|
|
2361
2500
|
reason attached, instead of one of the three going around.
|
|
2362
2501
|
*/
|
|
2363
|
-
/* @__PURE__ */
|
|
2502
|
+
/* @__PURE__ */ jsx37(
|
|
2364
2503
|
Parts.Close,
|
|
2365
2504
|
{
|
|
2366
|
-
render: /* @__PURE__ */
|
|
2505
|
+
render: /* @__PURE__ */ jsx37(IconButton, { tooltip: "Close", "aria-label": "Close", children: /* @__PURE__ */ jsx37(IconX5, { size: 16, stroke: 1.5 }) })
|
|
2367
2506
|
}
|
|
2368
2507
|
)
|
|
2369
2508
|
)
|
|
@@ -2371,9 +2510,9 @@ function DialogShell({ title, onClose, headerContent, footer, children, bodyClas
|
|
|
2371
2510
|
),
|
|
2372
2511
|
bodyMaxHeight ? (
|
|
2373
2512
|
// The line above the footer on a box of the shell's own, not pushed into ScrollArea (UIG-9).
|
|
2374
|
-
/* @__PURE__ */
|
|
2375
|
-
) : /* @__PURE__ */
|
|
2376
|
-
footer != null && /* @__PURE__ */
|
|
2513
|
+
/* @__PURE__ */ jsx37("div", { className: cn(footer != null && "border-b border-border-subtle"), children: /* @__PURE__ */ jsx37(ScrollArea, { viewportClassName: bodyMaxHeight, contentClassName: cn("pl-5 pr-4 py-4", bodyClassName), children }) })
|
|
2514
|
+
) : /* @__PURE__ */ jsx37("div", { className: cn("pl-5 pr-4 py-4", footer != null && "border-b border-border-subtle", bodyClassName), children }),
|
|
2515
|
+
footer != null && /* @__PURE__ */ jsx37("div", { className: "h-12 flex items-center justify-end gap-2 pl-5 pr-4 shrink-0", children: footer })
|
|
2377
2516
|
]
|
|
2378
2517
|
}
|
|
2379
2518
|
) })
|
|
@@ -2383,7 +2522,7 @@ function DialogShell({ title, onClose, headerContent, footer, children, bodyClas
|
|
|
2383
2522
|
}
|
|
2384
2523
|
|
|
2385
2524
|
// src/ConfirmDialog.tsx
|
|
2386
|
-
import { Fragment as
|
|
2525
|
+
import { Fragment as Fragment8, jsx as jsx38, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
2387
2526
|
function ConfirmDialog({ title, children, confirmLabel, destructive = false, onConfirm, onClose }) {
|
|
2388
2527
|
const [busy, setBusy] = useState4(false);
|
|
2389
2528
|
const confirm = async () => {
|
|
@@ -2395,17 +2534,17 @@ function ConfirmDialog({ title, children, confirmLabel, destructive = false, onC
|
|
|
2395
2534
|
setBusy(false);
|
|
2396
2535
|
}
|
|
2397
2536
|
};
|
|
2398
|
-
return /* @__PURE__ */
|
|
2537
|
+
return /* @__PURE__ */ jsx38(
|
|
2399
2538
|
DialogShell,
|
|
2400
2539
|
{
|
|
2401
2540
|
alert: true,
|
|
2402
2541
|
title,
|
|
2403
2542
|
onClose,
|
|
2404
|
-
footer: /* @__PURE__ */
|
|
2405
|
-
/* @__PURE__ */
|
|
2406
|
-
/* @__PURE__ */
|
|
2543
|
+
footer: /* @__PURE__ */ jsxs27(Fragment8, { children: [
|
|
2544
|
+
/* @__PURE__ */ jsx38(Button, { variant: "muted", onClick: onClose, disabled: busy, children: "Cancel" }),
|
|
2545
|
+
/* @__PURE__ */ jsx38(Button, { variant: destructive ? "destructive" : "primary", onClick: () => void confirm(), disabled: busy, children: confirmLabel })
|
|
2407
2546
|
] }),
|
|
2408
|
-
children: /* @__PURE__ */
|
|
2547
|
+
children: /* @__PURE__ */ jsx38("div", { className: "flex flex-col gap-3 text-body-2 text-text-primary", children })
|
|
2409
2548
|
}
|
|
2410
2549
|
);
|
|
2411
2550
|
}
|
|
@@ -2414,7 +2553,7 @@ function ConfirmDialog({ title, children, confirmLabel, destructive = false, onC
|
|
|
2414
2553
|
import { useEffect as useEffect3, useRef as useRef7, useState as useState5 } from "react";
|
|
2415
2554
|
import { Field as BaseField4 } from "@base-ui/react/field";
|
|
2416
2555
|
import { Input as Input2 } from "@base-ui/react/input";
|
|
2417
|
-
import { jsx as
|
|
2556
|
+
import { jsx as jsx39 } from "react/jsx-runtime";
|
|
2418
2557
|
function EditableText({ value, display, displayNode, placeholder, onCommit, multiline = false, className, label, readOnly = false }) {
|
|
2419
2558
|
const [editing, setEditing] = useState5(false);
|
|
2420
2559
|
const [draft, setDraft] = useState5(value);
|
|
@@ -2472,7 +2611,7 @@ function EditableText({ value, display, displayNode, placeholder, onCommit, mult
|
|
|
2472
2611
|
written and never read. Read-only, this is a line of text: whatever
|
|
2473
2612
|
names the region around it (a `Field`, a `Property`) names this too.
|
|
2474
2613
|
*/
|
|
2475
|
-
/* @__PURE__ */
|
|
2614
|
+
/* @__PURE__ */ jsx39(
|
|
2476
2615
|
"div",
|
|
2477
2616
|
{
|
|
2478
2617
|
className: cn("w-full px-2 py-1", multiline && !displayNode && "whitespace-pre-wrap", display ?? value ? "text-text-primary" : "text-text-muted", className),
|
|
@@ -2482,11 +2621,11 @@ function EditableText({ value, display, displayNode, placeholder, onCommit, mult
|
|
|
2482
2621
|
);
|
|
2483
2622
|
}
|
|
2484
2623
|
if (editing) {
|
|
2485
|
-
return multiline ? /* @__PURE__ */
|
|
2624
|
+
return multiline ? /* @__PURE__ */ jsx39(
|
|
2486
2625
|
BaseField4.Control,
|
|
2487
2626
|
{
|
|
2488
2627
|
ref: fieldRef,
|
|
2489
|
-
render: /* @__PURE__ */
|
|
2628
|
+
render: /* @__PURE__ */ jsx39("textarea", { rows: 4 }),
|
|
2490
2629
|
"aria-label": label,
|
|
2491
2630
|
value: draft,
|
|
2492
2631
|
disabled: busy,
|
|
@@ -2495,7 +2634,7 @@ function EditableText({ value, display, displayNode, placeholder, onCommit, mult
|
|
|
2495
2634
|
onBlur: () => void commit(),
|
|
2496
2635
|
className: fieldClass
|
|
2497
2636
|
}
|
|
2498
|
-
) : /* @__PURE__ */
|
|
2637
|
+
) : /* @__PURE__ */ jsx39(
|
|
2499
2638
|
Input2,
|
|
2500
2639
|
{
|
|
2501
2640
|
ref: fieldRef,
|
|
@@ -2509,7 +2648,7 @@ function EditableText({ value, display, displayNode, placeholder, onCommit, mult
|
|
|
2509
2648
|
}
|
|
2510
2649
|
);
|
|
2511
2650
|
}
|
|
2512
|
-
return /* @__PURE__ */
|
|
2651
|
+
return /* @__PURE__ */ jsx39(
|
|
2513
2652
|
"button",
|
|
2514
2653
|
{
|
|
2515
2654
|
type: "button",
|
|
@@ -2529,7 +2668,7 @@ function EditableText({ value, display, displayNode, placeholder, onCommit, mult
|
|
|
2529
2668
|
// src/ErrorBoundary.tsx
|
|
2530
2669
|
import { Component } from "react";
|
|
2531
2670
|
import { IconAlertTriangle as IconAlertTriangle2 } from "@tabler/icons-react";
|
|
2532
|
-
import { jsx as
|
|
2671
|
+
import { jsx as jsx40 } from "react/jsx-runtime";
|
|
2533
2672
|
var ErrorBoundary = class extends Component {
|
|
2534
2673
|
state = { hasError: false };
|
|
2535
2674
|
static getDerivedStateFromError() {
|
|
@@ -2540,22 +2679,22 @@ var ErrorBoundary = class extends Component {
|
|
|
2540
2679
|
}
|
|
2541
2680
|
render() {
|
|
2542
2681
|
if (!this.state.hasError) return this.props.children;
|
|
2543
|
-
const message = /* @__PURE__ */
|
|
2682
|
+
const message = /* @__PURE__ */ jsx40(
|
|
2544
2683
|
EmptyState,
|
|
2545
2684
|
{
|
|
2546
|
-
icon: /* @__PURE__ */
|
|
2685
|
+
icon: /* @__PURE__ */ jsx40(IconAlertTriangle2, { size: 16, stroke: 1.5 }),
|
|
2547
2686
|
message: `Something went wrong${this.props.label ? ` in the ${this.props.label}` : ""}. Your data is safe \u2014 try again.`,
|
|
2548
2687
|
action: { label: "Try again", onClick: () => this.setState({ hasError: false }) }
|
|
2549
2688
|
}
|
|
2550
2689
|
);
|
|
2551
2690
|
if (this.props.frame) return this.props.frame(message);
|
|
2552
|
-
return this.props.fallbackClassName ? /* @__PURE__ */
|
|
2691
|
+
return this.props.fallbackClassName ? /* @__PURE__ */ jsx40("div", { className: this.props.fallbackClassName, children: message }) : message;
|
|
2553
2692
|
}
|
|
2554
2693
|
};
|
|
2555
2694
|
|
|
2556
2695
|
// src/ProgressBar.tsx
|
|
2557
2696
|
import { Progress } from "@base-ui/react/progress";
|
|
2558
|
-
import { jsx as
|
|
2697
|
+
import { jsx as jsx41 } from "react/jsx-runtime";
|
|
2559
2698
|
var TRACK_CLASSES = {
|
|
2560
2699
|
default: "h-1.5 w-full overflow-hidden rounded-full bg-bg-inset",
|
|
2561
2700
|
// 4px, Katerina's ruling of 14 September; Peek's own bar is 3px until it takes this one.
|
|
@@ -2568,13 +2707,13 @@ var INDICATOR_CLASSES = {
|
|
|
2568
2707
|
function ProgressBar({ value, max, label, variant = "default", className }) {
|
|
2569
2708
|
return (
|
|
2570
2709
|
// `max={0}` needs no guard: Base UI reads the 0/0 share as an empty bar.
|
|
2571
|
-
/* @__PURE__ */
|
|
2710
|
+
/* @__PURE__ */ jsx41(Progress.Root, { value, max, "aria-label": label, className, children: /* @__PURE__ */ jsx41(Progress.Track, { className: TRACK_CLASSES[variant], children: /* @__PURE__ */ jsx41(Progress.Indicator, { className: INDICATOR_CLASSES[variant] }) }) })
|
|
2572
2711
|
);
|
|
2573
2712
|
}
|
|
2574
2713
|
|
|
2575
2714
|
// src/Breadcrumb.tsx
|
|
2576
|
-
import { Fragment as
|
|
2577
|
-
import { jsx as
|
|
2715
|
+
import { Fragment as Fragment9, useCallback as useCallback2, useLayoutEffect as useLayoutEffect4, useRef as useRef8, useState as useState6 } from "react";
|
|
2716
|
+
import { jsx as jsx42, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
2578
2717
|
function Breadcrumb({ items, className }) {
|
|
2579
2718
|
const navRef = useRef8(null);
|
|
2580
2719
|
const labelRefs = useRef8([]);
|
|
@@ -2594,7 +2733,7 @@ function Breadcrumb({ items, className }) {
|
|
|
2594
2733
|
observer.observe(nav);
|
|
2595
2734
|
return () => observer.disconnect();
|
|
2596
2735
|
}, [measure, items]);
|
|
2597
|
-
return /* @__PURE__ */
|
|
2736
|
+
return /* @__PURE__ */ jsx42("nav", { ref: navRef, "aria-label": "Breadcrumb", className: cn("flex min-w-0 items-center gap-1.5 text-body-2", className), children: items.map((item, index) => {
|
|
2598
2737
|
const last = index === items.length - 1;
|
|
2599
2738
|
const tone = item.muted || last && item.mono ? "text-text-muted" : last ? "text-text-primary" : "text-text-secondary";
|
|
2600
2739
|
const text = cn(
|
|
@@ -2615,27 +2754,27 @@ function Breadcrumb({ items, className }) {
|
|
|
2615
2754
|
// on a box around it, which the link takes them from, rather than
|
|
2616
2755
|
// pushed into it (UIG-9); the link is still the one element that
|
|
2617
2756
|
// truncates and is measured.
|
|
2618
|
-
/* @__PURE__ */
|
|
2619
|
-
) : /* @__PURE__ */
|
|
2620
|
-
return /* @__PURE__ */
|
|
2621
|
-
index > 0 && /* @__PURE__ */
|
|
2622
|
-
item.icon && /* @__PURE__ */
|
|
2757
|
+
/* @__PURE__ */ jsx42("span", { className: cn("flex min-w-0", item.mono && "shrink-0 font-mono text-caption", tone, "hover:text-text-primary"), children: /* @__PURE__ */ jsx42(Link, { ref: setLabelRef, variant: "plain", truncate: true, href: item.href, onClick: item.onClick, children: item.label }) })
|
|
2758
|
+
) : /* @__PURE__ */ jsx42("span", { ref: setLabelRef, className: text, "aria-current": last ? "page" : void 0, children: item.label });
|
|
2759
|
+
return /* @__PURE__ */ jsxs28(Fragment9, { children: [
|
|
2760
|
+
index > 0 && /* @__PURE__ */ jsx42("span", { "aria-hidden": "true", className: "shrink-0 text-text-muted", children: "/" }),
|
|
2761
|
+
item.icon && /* @__PURE__ */ jsx42("span", { "aria-hidden": "true", className: cn("flex shrink-0", tone), children: item.icon }),
|
|
2623
2762
|
truncated.has(index) ? (
|
|
2624
2763
|
// `min-w-0 shrink` undoes the wrapper's own shrink-0 — the crumb
|
|
2625
2764
|
// must keep truncating inside it, or wrapping it would widen the
|
|
2626
2765
|
// trail and the tooltip would never be needed again.
|
|
2627
|
-
/* @__PURE__ */
|
|
2766
|
+
/* @__PURE__ */ jsx42(WithTooltip, { label: item.label, wrapperClassName: "min-w-0 shrink", children: crumb })
|
|
2628
2767
|
) : crumb
|
|
2629
2768
|
] }, `${item.label}-${index}`);
|
|
2630
2769
|
}) });
|
|
2631
2770
|
}
|
|
2632
2771
|
|
|
2633
2772
|
// src/NavItem.tsx
|
|
2634
|
-
import { jsx as
|
|
2773
|
+
import { jsx as jsx43, jsxs as jsxs29 } from "react/jsx-runtime";
|
|
2635
2774
|
function NavItem({ label, href, count, countLabel, active = false, icon, className, ...props }) {
|
|
2636
2775
|
return (
|
|
2637
2776
|
// @estiva-escape(no-copied-look): N5 (Katerina, 24 September: record only): a row that fills on hover, as PersonTrigger's row also does
|
|
2638
|
-
/* @__PURE__ */
|
|
2777
|
+
/* @__PURE__ */ jsxs29(
|
|
2639
2778
|
"a",
|
|
2640
2779
|
{
|
|
2641
2780
|
href,
|
|
@@ -2650,9 +2789,9 @@ function NavItem({ label, href, count, countLabel, active = false, icon, classNa
|
|
|
2650
2789
|
),
|
|
2651
2790
|
...props,
|
|
2652
2791
|
children: [
|
|
2653
|
-
icon && /* @__PURE__ */
|
|
2654
|
-
/* @__PURE__ */
|
|
2655
|
-
count ? /* @__PURE__ */
|
|
2792
|
+
icon && /* @__PURE__ */ jsx43("span", { className: "flex shrink-0 items-center", children: icon }),
|
|
2793
|
+
/* @__PURE__ */ jsx43("span", { className: "flex-1 truncate", children: label }),
|
|
2794
|
+
count ? /* @__PURE__ */ jsx43(WithTooltip, { label: countLabel ?? `${count} open`, children: /* @__PURE__ */ jsx43("span", { className: "min-w-4 shrink-0 text-center font-mono text-caption tabular-nums text-text-muted", children: count }) }) : null
|
|
2656
2795
|
]
|
|
2657
2796
|
}
|
|
2658
2797
|
)
|
|
@@ -2662,7 +2801,7 @@ function NavItem({ label, href, count, countLabel, active = false, icon, classNa
|
|
|
2662
2801
|
// src/Popover.tsx
|
|
2663
2802
|
import { useMemo as useMemo3 } from "react";
|
|
2664
2803
|
import { Popover as BasePopover } from "@base-ui/react/popover";
|
|
2665
|
-
import { jsx as
|
|
2804
|
+
import { jsx as jsx44, jsxs as jsxs30 } from "react/jsx-runtime";
|
|
2666
2805
|
var GAP5 = 4;
|
|
2667
2806
|
var VIEWPORT_PAD5 = 8;
|
|
2668
2807
|
function Popover({ trigger, anchor, align = "left", side = "bottom", open, onOpenChange, finalFocus, actionsRef, ariaLabel, children, className, contentClassName, maxHeight }) {
|
|
@@ -2671,7 +2810,7 @@ function Popover({ trigger, anchor, align = "left", side = "bottom", open, onOpe
|
|
|
2671
2810
|
if (anchor instanceof Element) return anchor;
|
|
2672
2811
|
return { getBoundingClientRect: () => anchor };
|
|
2673
2812
|
}, [anchor]);
|
|
2674
|
-
return /* @__PURE__ */
|
|
2813
|
+
return /* @__PURE__ */ jsxs30(
|
|
2675
2814
|
BasePopover.Root,
|
|
2676
2815
|
{
|
|
2677
2816
|
open,
|
|
@@ -2679,8 +2818,8 @@ function Popover({ trigger, anchor, align = "left", side = "bottom", open, onOpe
|
|
|
2679
2818
|
actionsRef,
|
|
2680
2819
|
modal: false,
|
|
2681
2820
|
children: [
|
|
2682
|
-
trigger && /* @__PURE__ */
|
|
2683
|
-
/* @__PURE__ */
|
|
2821
|
+
trigger && /* @__PURE__ */ jsx44(BasePopover.Trigger, { render: trigger, disabled: triggerDisabled(trigger) }),
|
|
2822
|
+
/* @__PURE__ */ jsx44(BasePopover.Portal, { children: /* @__PURE__ */ jsx44(
|
|
2684
2823
|
BasePopover.Positioner,
|
|
2685
2824
|
{
|
|
2686
2825
|
anchor: anchorTarget,
|
|
@@ -2689,20 +2828,20 @@ function Popover({ trigger, anchor, align = "left", side = "bottom", open, onOpe
|
|
|
2689
2828
|
sideOffset: GAP5,
|
|
2690
2829
|
collisionPadding: VIEWPORT_PAD5,
|
|
2691
2830
|
className: "z-50 data-[anchor-hidden]:hidden",
|
|
2692
|
-
children: /* @__PURE__ */
|
|
2831
|
+
children: /* @__PURE__ */ jsx44(
|
|
2693
2832
|
BasePopover.Popup,
|
|
2694
2833
|
{
|
|
2695
2834
|
"aria-label": ariaLabel,
|
|
2696
2835
|
initialFocus: trigger ? void 0 : false,
|
|
2697
2836
|
finalFocus,
|
|
2698
2837
|
className: cn("min-w-[180px] outline-none p-0", className),
|
|
2699
|
-
render: /* @__PURE__ */
|
|
2700
|
-
children: /* @__PURE__ */
|
|
2838
|
+
render: /* @__PURE__ */ jsx44(MenuPanel, {}),
|
|
2839
|
+
children: /* @__PURE__ */ jsx44(
|
|
2701
2840
|
ScrollArea,
|
|
2702
2841
|
{
|
|
2703
2842
|
viewportClassName: maxHeight ?? "max-h-[var(--available-height)]",
|
|
2704
2843
|
contentClassName: cn("flex flex-col p-2", contentClassName),
|
|
2705
|
-
children: /* @__PURE__ */
|
|
2844
|
+
children: /* @__PURE__ */ jsx44(DividerInPanel.Provider, { value: true, children })
|
|
2706
2845
|
}
|
|
2707
2846
|
)
|
|
2708
2847
|
}
|
|
@@ -2716,9 +2855,9 @@ function Popover({ trigger, anchor, align = "left", side = "bottom", open, onOpe
|
|
|
2716
2855
|
|
|
2717
2856
|
// src/Toolbar.tsx
|
|
2718
2857
|
import { Toolbar as BaseToolbar } from "@base-ui/react/toolbar";
|
|
2719
|
-
import { jsx as
|
|
2858
|
+
import { jsx as jsx45 } from "react/jsx-runtime";
|
|
2720
2859
|
function Toolbar({ "aria-label": ariaLabel, orientation = "horizontal", loopFocus = true, surface = true, children, className }) {
|
|
2721
|
-
const strip = /* @__PURE__ */
|
|
2860
|
+
const strip = /* @__PURE__ */ jsx45(
|
|
2722
2861
|
BaseToolbar.Root,
|
|
2723
2862
|
{
|
|
2724
2863
|
"aria-label": ariaLabel,
|
|
@@ -2729,27 +2868,27 @@ function Toolbar({ "aria-label": ariaLabel, orientation = "horizontal", loopFocu
|
|
|
2729
2868
|
}
|
|
2730
2869
|
);
|
|
2731
2870
|
if (!surface) return strip;
|
|
2732
|
-
return /* @__PURE__ */
|
|
2871
|
+
return /* @__PURE__ */ jsx45(MenuPanel, { className: "w-fit p-1", children: strip });
|
|
2733
2872
|
}
|
|
2734
2873
|
function ToolbarButton({ ref, disabled, disabledReason, ...props }) {
|
|
2735
|
-
return /* @__PURE__ */
|
|
2874
|
+
return /* @__PURE__ */ jsx45(
|
|
2736
2875
|
BaseToolbar.Button,
|
|
2737
2876
|
{
|
|
2738
2877
|
ref,
|
|
2739
2878
|
disabled: disabled || !!disabledReason,
|
|
2740
2879
|
focusableWhenDisabled: true,
|
|
2741
|
-
render: /* @__PURE__ */
|
|
2880
|
+
render: /* @__PURE__ */ jsx45(IconButton, { disabled, disabledReason, ...props })
|
|
2742
2881
|
}
|
|
2743
2882
|
);
|
|
2744
2883
|
}
|
|
2745
2884
|
function ToolbarLink({ ref, href, ...props }) {
|
|
2746
|
-
return /* @__PURE__ */
|
|
2885
|
+
return /* @__PURE__ */ jsx45(BaseToolbar.Link, { ref, render: /* @__PURE__ */ jsx45(IconButton, { href, ...props }) });
|
|
2747
2886
|
}
|
|
2748
2887
|
function ToolbarInput({ size, ...props }) {
|
|
2749
|
-
return /* @__PURE__ */
|
|
2888
|
+
return /* @__PURE__ */ jsx45(BaseToolbar.Input, { render: /* @__PURE__ */ jsx45(TextInput, { size }), ...props });
|
|
2750
2889
|
}
|
|
2751
2890
|
function ToolbarSeparator({ className }) {
|
|
2752
|
-
return /* @__PURE__ */
|
|
2891
|
+
return /* @__PURE__ */ jsx45(
|
|
2753
2892
|
BaseToolbar.Separator,
|
|
2754
2893
|
{
|
|
2755
2894
|
orientation: "vertical",
|
|
@@ -2759,9 +2898,9 @@ function ToolbarSeparator({ className }) {
|
|
|
2759
2898
|
}
|
|
2760
2899
|
|
|
2761
2900
|
// src/ReactionPicker.tsx
|
|
2762
|
-
import { jsx as
|
|
2901
|
+
import { jsx as jsx46 } from "react/jsx-runtime";
|
|
2763
2902
|
function ReactionPicker({ options, onSelect, "aria-label": ariaLabel = "Reactions", surface = true, className }) {
|
|
2764
|
-
return /* @__PURE__ */
|
|
2903
|
+
return /* @__PURE__ */ jsx46(Toolbar, { "aria-label": ariaLabel, surface, className: cn("gap-0.5", className), children: options.map((option) => (
|
|
2765
2904
|
/*
|
|
2766
2905
|
A `ToolbarButton`, not a button in a tooltip wrapper. The wrapper
|
|
2767
2906
|
would become the toolbar's item and the button inside it would never
|
|
@@ -2771,14 +2910,14 @@ function ReactionPicker({ options, onSelect, "aria-label": ariaLabel = "Reaction
|
|
|
2771
2910
|
The tooltip names it for a pointer, `aria-label` for everything else,
|
|
2772
2911
|
and both say the meaning rather than the glyph.
|
|
2773
2912
|
*/
|
|
2774
|
-
/* @__PURE__ */
|
|
2913
|
+
/* @__PURE__ */ jsx46(
|
|
2775
2914
|
ToolbarButton,
|
|
2776
2915
|
{
|
|
2777
2916
|
"aria-label": option.label,
|
|
2778
2917
|
tooltip: option.label,
|
|
2779
2918
|
onClick: () => onSelect(option.emoji),
|
|
2780
2919
|
className: "size-7",
|
|
2781
|
-
children: /* @__PURE__ */
|
|
2920
|
+
children: /* @__PURE__ */ jsx46("span", { "aria-hidden": "true", className: "text-h3 leading-none", children: option.emoji })
|
|
2782
2921
|
},
|
|
2783
2922
|
option.emoji
|
|
2784
2923
|
)
|
|
@@ -2787,23 +2926,23 @@ function ReactionPicker({ options, onSelect, "aria-label": ariaLabel = "Reaction
|
|
|
2787
2926
|
|
|
2788
2927
|
// src/PreviewCard.tsx
|
|
2789
2928
|
import { PreviewCard as BasePreviewCard } from "@base-ui/react/preview-card";
|
|
2790
|
-
import { jsx as
|
|
2929
|
+
import { jsx as jsx47, jsxs as jsxs31 } from "react/jsx-runtime";
|
|
2791
2930
|
var GAP6 = 12;
|
|
2792
2931
|
var VIEWPORT_PAD6 = 8;
|
|
2793
2932
|
var OPEN_DELAY2 = 350;
|
|
2794
2933
|
var CLOSE_DELAY = 200;
|
|
2795
2934
|
function PreviewCard({ content, children, side = "right", delay = OPEN_DELAY2, closeDelay = CLOSE_DELAY, className, contentClassName, wrapperClassName }) {
|
|
2796
|
-
return /* @__PURE__ */
|
|
2797
|
-
/* @__PURE__ */
|
|
2935
|
+
return /* @__PURE__ */ jsxs31(BasePreviewCard.Root, { children: [
|
|
2936
|
+
/* @__PURE__ */ jsx47(
|
|
2798
2937
|
BasePreviewCard.Trigger,
|
|
2799
2938
|
{
|
|
2800
2939
|
delay,
|
|
2801
2940
|
closeDelay,
|
|
2802
|
-
render: /* @__PURE__ */
|
|
2941
|
+
render: /* @__PURE__ */ jsx47("span", { className: cn("inline-flex", wrapperClassName) }),
|
|
2803
2942
|
children
|
|
2804
2943
|
}
|
|
2805
2944
|
),
|
|
2806
|
-
/* @__PURE__ */
|
|
2945
|
+
/* @__PURE__ */ jsx47(BasePreviewCard.Portal, { children: /* @__PURE__ */ jsx47(
|
|
2807
2946
|
BasePreviewCard.Positioner,
|
|
2808
2947
|
{
|
|
2809
2948
|
side,
|
|
@@ -2811,12 +2950,12 @@ function PreviewCard({ content, children, side = "right", delay = OPEN_DELAY2, c
|
|
|
2811
2950
|
sideOffset: GAP6,
|
|
2812
2951
|
collisionPadding: VIEWPORT_PAD6,
|
|
2813
2952
|
className: "z-50 data-[anchor-hidden]:hidden",
|
|
2814
|
-
children: /* @__PURE__ */
|
|
2953
|
+
children: /* @__PURE__ */ jsx47(
|
|
2815
2954
|
BasePreviewCard.Popup,
|
|
2816
2955
|
{
|
|
2817
2956
|
className: cn("w-[360px] p-0 outline-none", className),
|
|
2818
|
-
render: /* @__PURE__ */
|
|
2819
|
-
children: /* @__PURE__ */
|
|
2957
|
+
render: /* @__PURE__ */ jsx47(MenuPanel, {}),
|
|
2958
|
+
children: /* @__PURE__ */ jsx47(ScrollArea, { viewportClassName: "max-h-[min(300px,var(--available-height))]", contentClassName: cn("flex flex-col gap-3 p-3", contentClassName), children: content })
|
|
2820
2959
|
}
|
|
2821
2960
|
)
|
|
2822
2961
|
}
|
|
@@ -2825,15 +2964,15 @@ function PreviewCard({ content, children, side = "right", delay = OPEN_DELAY2, c
|
|
|
2825
2964
|
}
|
|
2826
2965
|
|
|
2827
2966
|
// src/Rail.tsx
|
|
2828
|
-
import { jsx as
|
|
2967
|
+
import { jsx as jsx48 } from "react/jsx-runtime";
|
|
2829
2968
|
function Rail({ "aria-label": ariaLabel = "Navigation", children, className }) {
|
|
2830
|
-
return /* @__PURE__ */
|
|
2969
|
+
return /* @__PURE__ */ jsx48("nav", { "aria-label": ariaLabel, className: cn("flex w-16 shrink-0 flex-col items-start gap-2 px-2 py-3", className), children });
|
|
2831
2970
|
}
|
|
2832
2971
|
|
|
2833
2972
|
// src/RailItem.tsx
|
|
2834
|
-
import { jsx as
|
|
2973
|
+
import { jsx as jsx49, jsxs as jsxs32 } from "react/jsx-runtime";
|
|
2835
2974
|
function RailItem({ href, icon, label, active = false, className, ...props }) {
|
|
2836
|
-
return /* @__PURE__ */
|
|
2975
|
+
return /* @__PURE__ */ jsxs32(
|
|
2837
2976
|
"a",
|
|
2838
2977
|
{
|
|
2839
2978
|
href,
|
|
@@ -2841,14 +2980,14 @@ function RailItem({ href, icon, label, active = false, className, ...props }) {
|
|
|
2841
2980
|
className: cn("group flex h-12 w-full shrink-0 flex-col items-center gap-0.5 px-2 py-0.5", className),
|
|
2842
2981
|
...props,
|
|
2843
2982
|
children: [
|
|
2844
|
-
/* @__PURE__ */
|
|
2983
|
+
/* @__PURE__ */ jsx49(
|
|
2845
2984
|
"div",
|
|
2846
2985
|
{
|
|
2847
2986
|
className: cn(
|
|
2848
2987
|
"flex items-center justify-center rounded-lg p-2 transition-colors",
|
|
2849
2988
|
active ? "bg-bg-selected" : "group-hover:bg-bg-hover"
|
|
2850
2989
|
),
|
|
2851
|
-
children: /* @__PURE__ */
|
|
2990
|
+
children: /* @__PURE__ */ jsx49(
|
|
2852
2991
|
"span",
|
|
2853
2992
|
{
|
|
2854
2993
|
className: cn(
|
|
@@ -2860,14 +2999,14 @@ function RailItem({ href, icon, label, active = false, className, ...props }) {
|
|
|
2860
2999
|
)
|
|
2861
3000
|
}
|
|
2862
3001
|
),
|
|
2863
|
-
/* @__PURE__ */
|
|
3002
|
+
/* @__PURE__ */ jsx49("span", { className: cn("text-center text-menu", active ? "text-text-primary" : "text-text-secondary"), children: label })
|
|
2864
3003
|
]
|
|
2865
3004
|
}
|
|
2866
3005
|
);
|
|
2867
3006
|
}
|
|
2868
3007
|
|
|
2869
3008
|
// src/Property.tsx
|
|
2870
|
-
import { jsx as
|
|
3009
|
+
import { jsx as jsx50, jsxs as jsxs33 } from "react/jsx-runtime";
|
|
2871
3010
|
var VALUE_CLASSES = "contents";
|
|
2872
3011
|
function Property({ label, layout = "row", children, className }) {
|
|
2873
3012
|
if (layout === "stacked") {
|
|
@@ -2875,25 +3014,25 @@ function Property({ label, layout = "row", children, className }) {
|
|
|
2875
3014
|
// gap-3 — the one label-above-content distance (Katerina, 2026-09-01):
|
|
2876
3015
|
// Peek's topic-details sections already sit at 12px, Ship's rail was
|
|
2877
3016
|
// 6px, and unifying means the bigger, calmer one.
|
|
2878
|
-
/* @__PURE__ */
|
|
2879
|
-
/* @__PURE__ */
|
|
2880
|
-
/* @__PURE__ */
|
|
3017
|
+
/* @__PURE__ */ jsxs33("dl", { className: cn("flex flex-col gap-3", className), children: [
|
|
3018
|
+
/* @__PURE__ */ jsx50("dt", { className: "text-menu uppercase tracking-widest text-text-secondary", children: label }),
|
|
3019
|
+
/* @__PURE__ */ jsx50("dd", { className: VALUE_CLASSES, children })
|
|
2881
3020
|
] })
|
|
2882
3021
|
);
|
|
2883
3022
|
}
|
|
2884
|
-
return /* @__PURE__ */
|
|
2885
|
-
/* @__PURE__ */
|
|
2886
|
-
/* @__PURE__ */
|
|
3023
|
+
return /* @__PURE__ */ jsxs33("dl", { className: cn("flex items-center gap-2", className), children: [
|
|
3024
|
+
/* @__PURE__ */ jsx50("dt", { className: "w-[68px] shrink-0 text-caption text-text-secondary", children: label }),
|
|
3025
|
+
/* @__PURE__ */ jsx50("dd", { className: VALUE_CLASSES, children })
|
|
2887
3026
|
] });
|
|
2888
3027
|
}
|
|
2889
3028
|
|
|
2890
3029
|
// src/Reaction.tsx
|
|
2891
3030
|
import { Toggle } from "@base-ui/react/toggle";
|
|
2892
|
-
import { jsx as
|
|
3031
|
+
import { jsx as jsx51, jsxs as jsxs34 } from "react/jsx-runtime";
|
|
2893
3032
|
function Reaction({ emoji, count, pressed = false, className, ...props }) {
|
|
2894
3033
|
return (
|
|
2895
3034
|
// @estiva-escape(no-copied-look): W1 (Katerina, 24 September: leave alone): a reaction pill shares four words with a field's box by coincidence
|
|
2896
|
-
/* @__PURE__ */
|
|
3035
|
+
/* @__PURE__ */ jsxs34(
|
|
2897
3036
|
Toggle,
|
|
2898
3037
|
{
|
|
2899
3038
|
pressed,
|
|
@@ -2915,8 +3054,8 @@ function Reaction({ emoji, count, pressed = false, className, ...props }) {
|
|
|
2915
3054
|
),
|
|
2916
3055
|
...props,
|
|
2917
3056
|
children: [
|
|
2918
|
-
/* @__PURE__ */
|
|
2919
|
-
/* @__PURE__ */
|
|
3057
|
+
/* @__PURE__ */ jsx51("span", { "aria-hidden": "true", className: "shrink-0 text-body-1 leading-none", children: emoji }),
|
|
3058
|
+
/* @__PURE__ */ jsx51("span", { className: CHIP_TEXT_CLASSES, children: count })
|
|
2920
3059
|
]
|
|
2921
3060
|
}
|
|
2922
3061
|
)
|
|
@@ -2926,9 +3065,9 @@ function Reaction({ emoji, count, pressed = false, className, ...props }) {
|
|
|
2926
3065
|
// src/SearchInput.tsx
|
|
2927
3066
|
import "react";
|
|
2928
3067
|
import { Input as Input3 } from "@base-ui/react/input";
|
|
2929
|
-
import { jsx as
|
|
3068
|
+
import { jsx as jsx52, jsxs as jsxs35 } from "react/jsx-runtime";
|
|
2930
3069
|
function SearchInput({ shortcut, className, placeholder = "Search\u2026", ...props }) {
|
|
2931
|
-
return /* @__PURE__ */
|
|
3070
|
+
return /* @__PURE__ */ jsxs35(
|
|
2932
3071
|
"div",
|
|
2933
3072
|
{
|
|
2934
3073
|
className: cn(
|
|
@@ -2940,7 +3079,7 @@ function SearchInput({ shortcut, className, placeholder = "Search\u2026", ...pro
|
|
|
2940
3079
|
className
|
|
2941
3080
|
),
|
|
2942
3081
|
children: [
|
|
2943
|
-
/* @__PURE__ */
|
|
3082
|
+
/* @__PURE__ */ jsx52(
|
|
2944
3083
|
Input3,
|
|
2945
3084
|
{
|
|
2946
3085
|
className: cn("flex-1 min-w-0 text-input-value", BARE_INPUT_CLASSES),
|
|
@@ -2948,7 +3087,7 @@ function SearchInput({ shortcut, className, placeholder = "Search\u2026", ...pro
|
|
|
2948
3087
|
...props
|
|
2949
3088
|
}
|
|
2950
3089
|
),
|
|
2951
|
-
shortcut && /* @__PURE__ */
|
|
3090
|
+
shortcut && /* @__PURE__ */ jsx52(Kbd, { children: shortcut })
|
|
2952
3091
|
]
|
|
2953
3092
|
}
|
|
2954
3093
|
);
|
|
@@ -2957,17 +3096,17 @@ function SearchInput({ shortcut, className, placeholder = "Search\u2026", ...pro
|
|
|
2957
3096
|
// src/SectionHeader.tsx
|
|
2958
3097
|
import { IconChevronRight as IconChevronRight2 } from "@tabler/icons-react";
|
|
2959
3098
|
import { useRender } from "@base-ui/react/use-render";
|
|
2960
|
-
import { Fragment as
|
|
3099
|
+
import { Fragment as Fragment10, jsx as jsx53, jsxs as jsxs36 } from "react/jsx-runtime";
|
|
2961
3100
|
function SectionHeader({ title, chevron = false, isExpanded = true, onToggle, trailing, actions, showActions = "hover", hover = "fill", render, className }) {
|
|
2962
3101
|
const titleElement = useRender({
|
|
2963
|
-
render: render ?? (chevron ? /* @__PURE__ */
|
|
3102
|
+
render: render ?? (chevron ? /* @__PURE__ */ jsx53("button", { type: "button", onClick: onToggle, "aria-expanded": isExpanded }) : /* @__PURE__ */ jsx53("span", {})),
|
|
2964
3103
|
props: {
|
|
2965
3104
|
// `text-left`: a button centres its text. `h-full` and `flex-1`: the
|
|
2966
3105
|
// whole row up to the actions is the hit target, as it was when the
|
|
2967
3106
|
// row itself carried the click.
|
|
2968
3107
|
className: "flex h-full min-w-0 flex-1 items-center gap-1 text-left",
|
|
2969
|
-
children: /* @__PURE__ */
|
|
2970
|
-
chevron && /* @__PURE__ */
|
|
3108
|
+
children: /* @__PURE__ */ jsxs36(Fragment10, { children: [
|
|
3109
|
+
chevron && /* @__PURE__ */ jsx53(
|
|
2971
3110
|
IconChevronRight2,
|
|
2972
3111
|
{
|
|
2973
3112
|
size: 12,
|
|
@@ -2975,11 +3114,11 @@ function SectionHeader({ title, chevron = false, isExpanded = true, onToggle, tr
|
|
|
2975
3114
|
className: cn("shrink-0 text-text-secondary transition-transform duration-150", isExpanded && "rotate-90")
|
|
2976
3115
|
}
|
|
2977
3116
|
),
|
|
2978
|
-
/* @__PURE__ */
|
|
3117
|
+
/* @__PURE__ */ jsx53(SectionLabel, { children: title })
|
|
2979
3118
|
] })
|
|
2980
3119
|
}
|
|
2981
3120
|
});
|
|
2982
|
-
return /* @__PURE__ */
|
|
3121
|
+
return /* @__PURE__ */ jsxs36(
|
|
2983
3122
|
"div",
|
|
2984
3123
|
{
|
|
2985
3124
|
className: cn(
|
|
@@ -2992,15 +3131,15 @@ function SectionHeader({ title, chevron = false, isExpanded = true, onToggle, tr
|
|
|
2992
3131
|
),
|
|
2993
3132
|
children: [
|
|
2994
3133
|
titleElement,
|
|
2995
|
-
trailing != null && /* @__PURE__ */
|
|
2996
|
-
actions && actions.length > 0 && /* @__PURE__ */
|
|
3134
|
+
trailing != null && /* @__PURE__ */ jsx53("div", { className: "flex shrink-0 items-center", children: trailing }),
|
|
3135
|
+
actions && actions.length > 0 && /* @__PURE__ */ jsx53(
|
|
2997
3136
|
"div",
|
|
2998
3137
|
{
|
|
2999
3138
|
className: cn(
|
|
3000
3139
|
"-mr-1 flex shrink-0 items-center gap-1",
|
|
3001
3140
|
showActions === "hover" && "opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100"
|
|
3002
3141
|
),
|
|
3003
|
-
children: actions.map((action) => /* @__PURE__ */
|
|
3142
|
+
children: actions.map((action) => /* @__PURE__ */ jsx53(IconButton, { tooltip: action.tooltip, "aria-label": action.tooltip, onClick: action.onClick, children: action.icon }, action.tooltip))
|
|
3004
3143
|
}
|
|
3005
3144
|
)
|
|
3006
3145
|
]
|
|
@@ -3009,35 +3148,35 @@ function SectionHeader({ title, chevron = false, isExpanded = true, onToggle, tr
|
|
|
3009
3148
|
}
|
|
3010
3149
|
|
|
3011
3150
|
// src/Panel.tsx
|
|
3012
|
-
import { jsx as
|
|
3151
|
+
import { jsx as jsx54, jsxs as jsxs37 } from "react/jsx-runtime";
|
|
3013
3152
|
function Frame({ title, chevron = false, actions, children, footer, bodyClassName, bodyRef, onBodyScroll, className, broken = false }) {
|
|
3014
|
-
return /* @__PURE__ */
|
|
3015
|
-
/* @__PURE__ */
|
|
3153
|
+
return /* @__PURE__ */ jsxs37("div", { className: cn("flex h-full min-h-0 flex-1 flex-col", className), children: [
|
|
3154
|
+
/* @__PURE__ */ jsx54(ContainerHeader, { title, chevron, actions }),
|
|
3016
3155
|
broken ? (
|
|
3017
3156
|
// The message takes the room the body had and centres itself in it.
|
|
3018
|
-
/* @__PURE__ */
|
|
3019
|
-
) : /* @__PURE__ */
|
|
3020
|
-
!broken && footer && /* @__PURE__ */
|
|
3157
|
+
/* @__PURE__ */ jsx54("div", { className: "flex min-h-0 flex-1 flex-col px-4", children })
|
|
3158
|
+
) : /* @__PURE__ */ jsx54(ScrollArea, { className: "min-h-0 flex-1", contentClassName: bodyClassName, viewportRef: bodyRef, onScroll: onBodyScroll, children }),
|
|
3159
|
+
!broken && footer && /* @__PURE__ */ jsx54("div", { className: "shrink-0", children: footer })
|
|
3021
3160
|
] });
|
|
3022
3161
|
}
|
|
3023
3162
|
function Panel(props) {
|
|
3024
|
-
return /* @__PURE__ */
|
|
3163
|
+
return /* @__PURE__ */ jsx54(
|
|
3025
3164
|
ErrorBoundary,
|
|
3026
3165
|
{
|
|
3027
3166
|
label: "panel",
|
|
3028
3167
|
frame: (message) => (
|
|
3029
3168
|
// Only the name comes back with the message: the actions and the footer may be what threw.
|
|
3030
|
-
/* @__PURE__ */
|
|
3169
|
+
/* @__PURE__ */ jsx54(Frame, { title: props.title, chevron: props.chevron, className: props.className, broken: true, children: message })
|
|
3031
3170
|
),
|
|
3032
|
-
children: /* @__PURE__ */
|
|
3171
|
+
children: /* @__PURE__ */ jsx54(Frame, { ...props })
|
|
3033
3172
|
}
|
|
3034
3173
|
);
|
|
3035
3174
|
}
|
|
3036
3175
|
|
|
3037
3176
|
// src/ListColumn.tsx
|
|
3038
|
-
import { jsx as
|
|
3177
|
+
import { jsx as jsx55, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
3039
3178
|
function Column({ title, chevron = false, actions, above, collapsed = false, children, className, broken = false }) {
|
|
3040
|
-
return /* @__PURE__ */
|
|
3179
|
+
return /* @__PURE__ */ jsxs38(
|
|
3041
3180
|
"div",
|
|
3042
3181
|
{
|
|
3043
3182
|
className: cn(
|
|
@@ -3048,26 +3187,26 @@ function Column({ title, chevron = false, actions, above, collapsed = false, chi
|
|
|
3048
3187
|
),
|
|
3049
3188
|
"data-collapsed": collapsed || void 0,
|
|
3050
3189
|
children: [
|
|
3051
|
-
/* @__PURE__ */
|
|
3190
|
+
/* @__PURE__ */ jsx55(ContainerHeader, { title, chevron, actions }),
|
|
3052
3191
|
above,
|
|
3053
3192
|
broken ? (
|
|
3054
3193
|
// The message takes the room the list had and centres itself in it (Katerina, 19 September).
|
|
3055
|
-
/* @__PURE__ */
|
|
3056
|
-
) : /* @__PURE__ */
|
|
3194
|
+
/* @__PURE__ */ jsx55("div", { className: "flex min-h-0 flex-1 flex-col px-3", children })
|
|
3195
|
+
) : /* @__PURE__ */ jsx55(ScrollArea, { className: "flex-1", contentClassName: "flex flex-col gap-0.5 px-3 pt-4 pb-3", children })
|
|
3057
3196
|
]
|
|
3058
3197
|
}
|
|
3059
3198
|
);
|
|
3060
3199
|
}
|
|
3061
3200
|
function ListColumn(props) {
|
|
3062
|
-
return /* @__PURE__ */
|
|
3201
|
+
return /* @__PURE__ */ jsx55(
|
|
3063
3202
|
ErrorBoundary,
|
|
3064
3203
|
{
|
|
3065
3204
|
label: "list panel",
|
|
3066
3205
|
frame: (message) => (
|
|
3067
3206
|
// Only the name comes back with the message: the actions and the row above may be what threw.
|
|
3068
|
-
/* @__PURE__ */
|
|
3207
|
+
/* @__PURE__ */ jsx55(Column, { title: props.title, chevron: props.chevron, collapsed: props.collapsed, className: props.className, broken: true, children: message })
|
|
3069
3208
|
),
|
|
3070
|
-
children: /* @__PURE__ */
|
|
3209
|
+
children: /* @__PURE__ */ jsx55(Column, { ...props })
|
|
3071
3210
|
}
|
|
3072
3211
|
);
|
|
3073
3212
|
}
|
|
@@ -3075,7 +3214,7 @@ function ListColumn(props) {
|
|
|
3075
3214
|
// src/CollapsibleSection.tsx
|
|
3076
3215
|
import { useState as useState7 } from "react";
|
|
3077
3216
|
import { Collapsible } from "@base-ui/react/collapsible";
|
|
3078
|
-
import { jsx as
|
|
3217
|
+
import { jsx as jsx56, jsxs as jsxs39 } from "react/jsx-runtime";
|
|
3079
3218
|
var OPEN = "open";
|
|
3080
3219
|
var CLOSED = "closed";
|
|
3081
3220
|
function readStored(key) {
|
|
@@ -3102,14 +3241,14 @@ function CollapsibleSection({ title, defaultOpen = true, open: openProp, onOpenC
|
|
|
3102
3241
|
writeStored(storageKey, next);
|
|
3103
3242
|
onOpenChange?.(next);
|
|
3104
3243
|
};
|
|
3105
|
-
return /* @__PURE__ */
|
|
3106
|
-
/* @__PURE__ */
|
|
3107
|
-
/* @__PURE__ */
|
|
3244
|
+
return /* @__PURE__ */ jsxs39(Collapsible.Root, { open, onOpenChange: setOpen, className: cn("flex flex-col", className), children: [
|
|
3245
|
+
/* @__PURE__ */ jsx56(SectionHeader, { title, chevron: true, isExpanded: open, trailing, actions, showActions, className: "shrink-0", render: /* @__PURE__ */ jsx56(Collapsible.Trigger, {}) }),
|
|
3246
|
+
/* @__PURE__ */ jsx56(
|
|
3108
3247
|
Collapsible.Panel,
|
|
3109
3248
|
{
|
|
3110
3249
|
hiddenUntilFound: true,
|
|
3111
3250
|
className: "h-[var(--collapsible-panel-height)] overflow-hidden transition-[height] duration-150 ease-out motion-reduce:transition-none data-[starting-style]:h-0 data-[ending-style]:h-0",
|
|
3112
|
-
children: /* @__PURE__ */
|
|
3251
|
+
children: /* @__PURE__ */ jsx56("div", { className: cn("flex flex-col", contentClassName), children })
|
|
3113
3252
|
}
|
|
3114
3253
|
)
|
|
3115
3254
|
] });
|
|
@@ -3117,9 +3256,9 @@ function CollapsibleSection({ title, defaultOpen = true, open: openProp, onOpenC
|
|
|
3117
3256
|
|
|
3118
3257
|
// src/Tabs.tsx
|
|
3119
3258
|
import { Tabs as BaseTabs } from "@base-ui/react/tabs";
|
|
3120
|
-
import { jsx as
|
|
3259
|
+
import { jsx as jsx57, jsxs as jsxs40 } from "react/jsx-runtime";
|
|
3121
3260
|
function Tabs({ tabs, active, onChange, size = "default", className, ...aria }) {
|
|
3122
|
-
return /* @__PURE__ */
|
|
3261
|
+
return /* @__PURE__ */ jsx57(
|
|
3123
3262
|
BaseTabs.Root,
|
|
3124
3263
|
{
|
|
3125
3264
|
value: active,
|
|
@@ -3127,14 +3266,14 @@ function Tabs({ tabs, active, onChange, size = "default", className, ...aria })
|
|
|
3127
3266
|
if (details.reason === "none") onChange(value);
|
|
3128
3267
|
},
|
|
3129
3268
|
className,
|
|
3130
|
-
children: /* @__PURE__ */
|
|
3269
|
+
children: /* @__PURE__ */ jsx57(
|
|
3131
3270
|
BaseTabs.List,
|
|
3132
3271
|
{
|
|
3133
3272
|
activateOnFocus: true,
|
|
3134
3273
|
"aria-label": aria["aria-label"],
|
|
3135
3274
|
"aria-labelledby": aria["aria-labelledby"],
|
|
3136
3275
|
className: "flex items-center gap-2",
|
|
3137
|
-
children: tabs.map((tab) => /* @__PURE__ */
|
|
3276
|
+
children: tabs.map((tab) => /* @__PURE__ */ jsxs40(
|
|
3138
3277
|
BaseTabs.Tab,
|
|
3139
3278
|
{
|
|
3140
3279
|
value: tab.id,
|
|
@@ -3147,9 +3286,9 @@ function Tabs({ tabs, active, onChange, size = "default", className, ...aria })
|
|
|
3147
3286
|
),
|
|
3148
3287
|
children: [
|
|
3149
3288
|
tab.icon,
|
|
3150
|
-
/* @__PURE__ */
|
|
3289
|
+
/* @__PURE__ */ jsxs40("span", { className: "flex items-baseline", children: [
|
|
3151
3290
|
tab.label,
|
|
3152
|
-
tab.count !== void 0 ? /* @__PURE__ */
|
|
3291
|
+
tab.count !== void 0 ? /* @__PURE__ */ jsx57("span", { className: "ml-2.5 font-mono text-caption tabular-nums text-text-secondary", children: tab.count }) : null
|
|
3153
3292
|
] })
|
|
3154
3293
|
]
|
|
3155
3294
|
},
|
|
@@ -3165,7 +3304,7 @@ function Tabs({ tabs, active, onChange, size = "default", className, ...aria })
|
|
|
3165
3304
|
import { createContext as createContext6, useContext as useContext6, useMemo as useMemo4 } from "react";
|
|
3166
3305
|
import { Toast as BaseToast } from "@base-ui/react/toast";
|
|
3167
3306
|
import { IconAlertCircle as IconAlertCircle2, IconCircleCheck, IconCircleX } from "@tabler/icons-react";
|
|
3168
|
-
import { jsx as
|
|
3307
|
+
import { jsx as jsx58, jsxs as jsxs41 } from "react/jsx-runtime";
|
|
3169
3308
|
var SURFACE_STYLES = {
|
|
3170
3309
|
success: "bg-success-muted signal:bg-bg-inset signal:border signal:border-border-default signal:shadow-md leaf:bg-bg-inset leaf:border leaf:border-border-default leaf:shadow-md",
|
|
3171
3310
|
brand: "bg-accent-muted signal:bg-bg-inset signal:border signal:border-border-default signal:shadow-md leaf:bg-bg-inset leaf:border leaf:border-border-default leaf:shadow-md",
|
|
@@ -3201,16 +3340,16 @@ var pillClassName = (type, hasAction, className) => cn(
|
|
|
3201
3340
|
);
|
|
3202
3341
|
function LeadingIcon({ type }) {
|
|
3203
3342
|
const Icon = ICONS[type];
|
|
3204
|
-
return /* @__PURE__ */
|
|
3343
|
+
return /* @__PURE__ */ jsx58(Icon, { size: 16, stroke: 1.5, className: cn("text-text-primary shrink-0", ICON_STYLES[type]) });
|
|
3205
3344
|
}
|
|
3206
3345
|
function Toast({ label, type = "neutral", leadingIcon = true, actionLabel, onAction, className }) {
|
|
3207
3346
|
const hasAction = !!(actionLabel && onAction);
|
|
3208
|
-
return /* @__PURE__ */
|
|
3209
|
-
/* @__PURE__ */
|
|
3210
|
-
leadingIcon && /* @__PURE__ */
|
|
3211
|
-
/* @__PURE__ */
|
|
3347
|
+
return /* @__PURE__ */ jsxs41("div", { className: pillClassName(type, hasAction, className), children: [
|
|
3348
|
+
/* @__PURE__ */ jsxs41("div", { className: "flex items-center gap-2 shrink-0", children: [
|
|
3349
|
+
leadingIcon && /* @__PURE__ */ jsx58(LeadingIcon, { type }),
|
|
3350
|
+
/* @__PURE__ */ jsx58("span", { className: LABEL_CLASSES, children: label })
|
|
3212
3351
|
] }),
|
|
3213
|
-
hasAction && /* @__PURE__ */
|
|
3352
|
+
hasAction && /* @__PURE__ */ jsx58(Button, { variant: "outlined", size: "small", onClick: onAction, children: actionLabel })
|
|
3214
3353
|
] });
|
|
3215
3354
|
}
|
|
3216
3355
|
var ToastContext = createContext6(null);
|
|
@@ -3231,9 +3370,9 @@ function ToastProvider({ children }) {
|
|
|
3231
3370
|
}),
|
|
3232
3371
|
[manager]
|
|
3233
3372
|
);
|
|
3234
|
-
return /* @__PURE__ */
|
|
3373
|
+
return /* @__PURE__ */ jsx58(ToastContext.Provider, { value, children: /* @__PURE__ */ jsxs41(BaseToast.Provider, { toastManager: manager, limit: VISIBLE_TOASTS, children: [
|
|
3235
3374
|
children,
|
|
3236
|
-
/* @__PURE__ */
|
|
3375
|
+
/* @__PURE__ */ jsx58(BaseToast.Portal, { children: /* @__PURE__ */ jsx58(BaseToast.Viewport, { className: "fixed bottom-4 left-4 z-[100] flex flex-col-reverse items-start gap-2 pointer-events-none", children: /* @__PURE__ */ jsx58(ToastList, {}) }) })
|
|
3237
3376
|
] }) });
|
|
3238
3377
|
}
|
|
3239
3378
|
function ToastList() {
|
|
@@ -3241,25 +3380,25 @@ function ToastList() {
|
|
|
3241
3380
|
return toasts.map((toast) => {
|
|
3242
3381
|
const type = toast.type ?? "neutral";
|
|
3243
3382
|
const { leadingIcon = true, actionLabel, onAction } = toast.data ?? {};
|
|
3244
|
-
return /* @__PURE__ */
|
|
3383
|
+
return /* @__PURE__ */ jsxs41(
|
|
3245
3384
|
BaseToast.Root,
|
|
3246
3385
|
{
|
|
3247
3386
|
toast,
|
|
3248
3387
|
swipeDirection: ["left", "down"],
|
|
3249
3388
|
className: pillClassName(type, !!actionLabel, "pointer-events-auto data-[limited]:hidden"),
|
|
3250
3389
|
children: [
|
|
3251
|
-
/* @__PURE__ */
|
|
3252
|
-
leadingIcon && /* @__PURE__ */
|
|
3253
|
-
/* @__PURE__ */
|
|
3390
|
+
/* @__PURE__ */ jsxs41("div", { className: "flex items-center gap-2 shrink-0", children: [
|
|
3391
|
+
leadingIcon && /* @__PURE__ */ jsx58(LeadingIcon, { type }),
|
|
3392
|
+
/* @__PURE__ */ jsx58(BaseToast.Title, { render: /* @__PURE__ */ jsx58("span", {}), className: LABEL_CLASSES })
|
|
3254
3393
|
] }),
|
|
3255
|
-
actionLabel && /* @__PURE__ */
|
|
3394
|
+
actionLabel && /* @__PURE__ */ jsx58(
|
|
3256
3395
|
BaseToast.Action,
|
|
3257
3396
|
{
|
|
3258
3397
|
onClick: () => {
|
|
3259
3398
|
onAction?.();
|
|
3260
3399
|
close(toast.id);
|
|
3261
3400
|
},
|
|
3262
|
-
render: /* @__PURE__ */
|
|
3401
|
+
render: /* @__PURE__ */ jsx58(Button, { variant: "outlined", size: "small", children: actionLabel })
|
|
3263
3402
|
}
|
|
3264
3403
|
)
|
|
3265
3404
|
]
|
|
@@ -3334,6 +3473,7 @@ export {
|
|
|
3334
3473
|
RailItem,
|
|
3335
3474
|
Reaction,
|
|
3336
3475
|
ReactionPicker,
|
|
3476
|
+
RichText,
|
|
3337
3477
|
ScrollArea,
|
|
3338
3478
|
SearchInput,
|
|
3339
3479
|
SectionHeader,
|
|
@@ -3361,6 +3501,7 @@ export {
|
|
|
3361
3501
|
hueFor,
|
|
3362
3502
|
initialsFor,
|
|
3363
3503
|
inlineChipClassName,
|
|
3504
|
+
richTextClassName,
|
|
3364
3505
|
useToast
|
|
3365
3506
|
};
|
|
3366
3507
|
//# sourceMappingURL=index.js.map
|