@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/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 jsx28, jsxs as jsxs20 } from "react/jsx-runtime";
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__ */ jsxs20("span", { className: cn("flex min-w-0 items-center gap-2", className), children: [
1969
- /* @__PURE__ */ jsx28(Avatar, { name, src: picture, size }),
1970
- /* @__PURE__ */ jsx28("span", { className: cn("truncate", !name && "text-text-muted"), children: name ?? fallback })
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 jsx29, jsxs as jsxs21 } from "react/jsx-runtime";
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__ */ jsx29(
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__ */ jsx29(Avatar, { name, src: picture, size: size ?? 36 })
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__ */ jsxs21(
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__ */ jsx29(Person, { name, picture, fallback, size: size ?? 22 }),
2015
- /* @__PURE__ */ jsx29(IconChevronDown, { size: 14, stroke: 1.5, className: "shrink-0 text-text-muted" })
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 Fragment6, jsx as jsx30, jsxs as jsxs22 } from "react/jsx-runtime";
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__ */ jsx30(MenuPanel, { className: cn("w-72", className), children: /* @__PURE__ */ jsx30(IdentityRows, { ...rest, onClose }) });
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__ */ jsxs22(Fragment6, { children: [
2035
- /* @__PURE__ */ jsxs22(MenuSection, { label: signedIn ? "Signed in as" : "Acting as", children: [
2036
- /* @__PURE__ */ jsx30(MenuRow, { children: /* @__PURE__ */ jsx30("div", { className: "flex min-w-0 text-body-2-strong", children: /* @__PURE__ */ jsx30(Person, { name: me.name, picture: me.picture, fallback: "Anonymous", size: 28 }) }) }),
2037
- /* @__PURE__ */ jsx30(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." }),
2038
- me.email && /* @__PURE__ */ jsxs22(Note, { children: [
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__ */ jsxs22(Fragment6, { children: [
2044
- /* @__PURE__ */ jsx30(Divider, { className: "mx-0 my-2" }),
2045
- /* @__PURE__ */ jsxs22(MenuSection, { label: "Workspace", children: [
2046
- /* @__PURE__ */ jsx30(MenuRow, { children: /* @__PURE__ */ jsx30("span", { className: "break-all font-mono text-caption text-text-primary", children: relayUrl }) }),
2047
- /* @__PURE__ */ jsx30(Note, { children: "Everyone on this relay shares this workspace, in every app." })
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__ */ jsxs22(Fragment6, { children: [
2051
- /* @__PURE__ */ jsx30(Divider, { className: "mx-0 my-2" }),
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__ */ jsx30(Divider, { className: "mx-0 my-2" }) : null,
2055
- signedIn && idBase && /* @__PURE__ */ jsx30(
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__ */ jsx30(MenuItem, { label: "Copy public key", onClick: act(onCopyKey) }),
2063
- idBase && onSignOut && /* @__PURE__ */ jsx30(MenuItem, { label: "Sign out", onClick: act(onSignOut) })
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__ */ jsx30("div", { className, children: /* @__PURE__ */ jsx30(
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__ */ jsx30(
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__ */ jsx30(
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__ */ jsx30("span", { className: "px-2 pb-1.5 text-caption text-text-secondary", children });
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 jsx31 } from "react/jsx-runtime";
2253
+ import { jsx as jsx32 } from "react/jsx-runtime";
2115
2254
  var FilePicker = forwardRef(function FilePicker2({ onPick, ...props }, ref) {
2116
- return /* @__PURE__ */ jsx31(
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 jsx32, jsxs as jsxs23 } from "react/jsx-runtime";
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__ */ jsxs23(
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__ */ jsxs23("span", { className: cn("flex min-w-0 items-center gap-2", !selected && "text-text-muted"), children: [
2176
- selected?.leading && /* @__PURE__ */ jsx32("span", { className: "flex shrink-0 items-center", children: selected.leading }),
2177
- /* @__PURE__ */ jsx32(BaseSelect.Value, { className: "truncate", children: () => selected?.label ?? placeholder })
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__ */ jsx32(
2318
+ /* @__PURE__ */ jsx33(
2180
2319
  BaseSelect.Icon,
2181
2320
  {
2182
- render: /* @__PURE__ */ jsx32(IconChevronDown2, { size: size === "small" ? 14 : 16, stroke: 1.5, className: "shrink-0 text-text-secondary" })
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__ */ jsxs23(
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__ */ jsx32(TooltipTrigger, { label: disabledReason ?? "", children: trigger }) : trigger,
2202
- /* @__PURE__ */ jsx32(BaseSelect.Portal, { children: /* @__PURE__ */ jsx32(
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__ */ jsx32(
2350
+ children: /* @__PURE__ */ jsx33(
2212
2351
  BaseSelect.Popup,
2213
2352
  {
2214
- render: /* @__PURE__ */ jsx32(MenuPanel, {}),
2353
+ render: /* @__PURE__ */ jsx33(MenuPanel, {}),
2215
2354
  className: "min-w-[var(--anchor-width)] p-0",
2216
- children: /* @__PURE__ */ jsx32(ScrollArea, { viewportClassName: "max-h-[min(288px,var(--available-height))]", contentClassName: "flex flex-col p-2", children: options.map((option) => /* @__PURE__ */ jsxs23(
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__ */ jsxs23("span", { className: "flex min-w-0 items-center gap-2", children: [
2223
- option.leading && /* @__PURE__ */ jsx32("span", { className: "flex shrink-0 items-center", children: option.leading }),
2224
- /* @__PURE__ */ jsx32(BaseSelect.ItemText, { className: "truncate text-body-2 text-text-primary", children: option.label })
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__ */ jsx32(
2365
+ /* @__PURE__ */ jsx33(
2227
2366
  BaseSelect.ItemIndicator,
2228
2367
  {
2229
- render: /* @__PURE__ */ jsx32(IconCheck2, { size: 16, stroke: 1.5, className: "shrink-0 text-text-secondary" })
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 jsx33 } from "react/jsx-runtime";
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__ */ jsx33(
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 jsx34 } from "react/jsx-runtime";
2415
+ import { jsx as jsx35 } from "react/jsx-runtime";
2277
2416
  var Textarea = forwardRef3(function Textarea2({ className, ...props }, ref) {
2278
- return /* @__PURE__ */ jsx34(
2417
+ return /* @__PURE__ */ jsx35(
2279
2418
  BaseField3.Control,
2280
2419
  {
2281
2420
  ref,
2282
- render: /* @__PURE__ */ jsx34("textarea", {}),
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 jsx35, jsxs as jsxs24 } from "react/jsx-runtime";
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__ */ jsxs24("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: [
2315
- /* @__PURE__ */ jsx35("div", { className: cn("flex items-center gap-2 overflow-hidden", text ? "shrink-0" : "min-w-0 flex-1"), children: /* @__PURE__ */ jsxs24("div", { className: cn("flex items-center gap-1", text ? "shrink-0" : "min-w-0 flex-1"), children: [
2316
- text ? /* @__PURE__ */ jsx35("span", { className: "whitespace-nowrap text-body-2-strong text-text-primary", children: title }) : /* @__PURE__ */ jsx35("div", { className: "min-w-0 flex-1", children: title }),
2317
- chevron && /* @__PURE__ */ jsx35(IconChevronDown3, { size: 12, stroke: 1.5, className: "shrink-0 text-text-secondary" })
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__ */ jsx35("div", { className: "flex shrink-0 items-center justify-end gap-3", children: /* @__PURE__ */ jsx35("div", { className: "flex shrink-0 items-center gap-1", children: actions }) })
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 jsx36, jsxs as jsxs25 } from "react/jsx-runtime";
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__ */ jsx36(
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__ */ jsxs25(Parts.Portal, { children: [
2336
- /* @__PURE__ */ jsx36(Parts.Backdrop, { className: "fixed inset-0 z-40 bg-scrim" }),
2337
- /* @__PURE__ */ jsx36("div", { className: "fixed inset-0 z-50 flex items-center justify-center pointer-events-none", children: /* @__PURE__ */ jsxs25(
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__ */ jsx36(
2485
+ /* @__PURE__ */ jsx37(
2347
2486
  ContainerHeader,
2348
2487
  {
2349
- title: headerContent ?? /* @__PURE__ */ jsx36(Parts.Title, { className: "text-h4 text-text-primary", render: /* @__PURE__ */ jsx36("span", {}), children: title }),
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__ */ jsx36(
2502
+ /* @__PURE__ */ jsx37(
2364
2503
  Parts.Close,
2365
2504
  {
2366
- render: /* @__PURE__ */ jsx36(IconButton, { tooltip: "Close", "aria-label": "Close", children: /* @__PURE__ */ jsx36(IconX5, { size: 16, stroke: 1.5 }) })
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__ */ jsx36("div", { className: cn(footer != null && "border-b border-border-subtle"), children: /* @__PURE__ */ jsx36(ScrollArea, { viewportClassName: bodyMaxHeight, contentClassName: cn("pl-5 pr-4 py-4", bodyClassName), children }) })
2375
- ) : /* @__PURE__ */ jsx36("div", { className: cn("pl-5 pr-4 py-4", footer != null && "border-b border-border-subtle", bodyClassName), children }),
2376
- footer != null && /* @__PURE__ */ jsx36("div", { className: "h-12 flex items-center justify-end gap-2 pl-5 pr-4 shrink-0", children: footer })
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 Fragment7, jsx as jsx37, jsxs as jsxs26 } from "react/jsx-runtime";
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__ */ jsx37(
2537
+ return /* @__PURE__ */ jsx38(
2399
2538
  DialogShell,
2400
2539
  {
2401
2540
  alert: true,
2402
2541
  title,
2403
2542
  onClose,
2404
- footer: /* @__PURE__ */ jsxs26(Fragment7, { children: [
2405
- /* @__PURE__ */ jsx37(Button, { variant: "muted", onClick: onClose, disabled: busy, children: "Cancel" }),
2406
- /* @__PURE__ */ jsx37(Button, { variant: destructive ? "destructive" : "primary", onClick: () => void confirm(), disabled: busy, children: confirmLabel })
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__ */ jsx37("div", { className: "flex flex-col gap-3 text-body-2 text-text-primary", children })
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 jsx38 } from "react/jsx-runtime";
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__ */ jsx38(
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__ */ jsx38(
2624
+ return multiline ? /* @__PURE__ */ jsx39(
2486
2625
  BaseField4.Control,
2487
2626
  {
2488
2627
  ref: fieldRef,
2489
- render: /* @__PURE__ */ jsx38("textarea", { rows: 4 }),
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__ */ jsx38(
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__ */ jsx38(
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 jsx39 } from "react/jsx-runtime";
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__ */ jsx39(
2682
+ const message = /* @__PURE__ */ jsx40(
2544
2683
  EmptyState,
2545
2684
  {
2546
- icon: /* @__PURE__ */ jsx39(IconAlertTriangle2, { size: 16, stroke: 1.5 }),
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__ */ jsx39("div", { className: this.props.fallbackClassName, children: message }) : message;
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 jsx40 } from "react/jsx-runtime";
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__ */ jsx40(Progress.Root, { value, max, "aria-label": label, className, children: /* @__PURE__ */ jsx40(Progress.Track, { className: TRACK_CLASSES[variant], children: /* @__PURE__ */ jsx40(Progress.Indicator, { className: INDICATOR_CLASSES[variant] }) }) })
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 Fragment8, useCallback as useCallback2, useLayoutEffect as useLayoutEffect4, useRef as useRef8, useState as useState6 } from "react";
2577
- import { jsx as jsx41, jsxs as jsxs27 } from "react/jsx-runtime";
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__ */ jsx41("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) => {
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__ */ jsx41("span", { className: cn("flex min-w-0", item.mono && "shrink-0 font-mono text-caption", tone, "hover:text-text-primary"), children: /* @__PURE__ */ jsx41(Link, { ref: setLabelRef, variant: "plain", truncate: true, href: item.href, onClick: item.onClick, children: item.label }) })
2619
- ) : /* @__PURE__ */ jsx41("span", { ref: setLabelRef, className: text, "aria-current": last ? "page" : void 0, children: item.label });
2620
- return /* @__PURE__ */ jsxs27(Fragment8, { children: [
2621
- index > 0 && /* @__PURE__ */ jsx41("span", { "aria-hidden": "true", className: "shrink-0 text-text-muted", children: "/" }),
2622
- item.icon && /* @__PURE__ */ jsx41("span", { "aria-hidden": "true", className: cn("flex shrink-0", tone), children: item.icon }),
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__ */ jsx41(WithTooltip, { label: item.label, wrapperClassName: "min-w-0 shrink", children: crumb })
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 jsx42, jsxs as jsxs28 } from "react/jsx-runtime";
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__ */ jsxs28(
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__ */ jsx42("span", { className: "flex shrink-0 items-center", children: icon }),
2654
- /* @__PURE__ */ jsx42("span", { className: "flex-1 truncate", children: label }),
2655
- count ? /* @__PURE__ */ jsx42(WithTooltip, { label: countLabel ?? `${count} open`, children: /* @__PURE__ */ jsx42("span", { className: "min-w-4 shrink-0 text-center font-mono text-caption tabular-nums text-text-muted", children: count }) }) : null
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 jsx43, jsxs as jsxs29 } from "react/jsx-runtime";
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__ */ jsxs29(
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__ */ jsx43(BasePopover.Trigger, { render: trigger, disabled: triggerDisabled(trigger) }),
2683
- /* @__PURE__ */ jsx43(BasePopover.Portal, { children: /* @__PURE__ */ jsx43(
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__ */ jsx43(
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__ */ jsx43(MenuPanel, {}),
2700
- children: /* @__PURE__ */ jsx43(
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__ */ jsx43(DividerInPanel.Provider, { value: true, children })
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 jsx44 } from "react/jsx-runtime";
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__ */ jsx44(
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__ */ jsx44(MenuPanel, { className: "w-fit p-1", children: strip });
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__ */ jsx44(
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__ */ jsx44(IconButton, { disabled, disabledReason, ...props })
2880
+ render: /* @__PURE__ */ jsx45(IconButton, { disabled, disabledReason, ...props })
2742
2881
  }
2743
2882
  );
2744
2883
  }
2745
2884
  function ToolbarLink({ ref, href, ...props }) {
2746
- return /* @__PURE__ */ jsx44(BaseToolbar.Link, { ref, render: /* @__PURE__ */ jsx44(IconButton, { href, ...props }) });
2885
+ return /* @__PURE__ */ jsx45(BaseToolbar.Link, { ref, render: /* @__PURE__ */ jsx45(IconButton, { href, ...props }) });
2747
2886
  }
2748
2887
  function ToolbarInput({ size, ...props }) {
2749
- return /* @__PURE__ */ jsx44(BaseToolbar.Input, { render: /* @__PURE__ */ jsx44(TextInput, { size }), ...props });
2888
+ return /* @__PURE__ */ jsx45(BaseToolbar.Input, { render: /* @__PURE__ */ jsx45(TextInput, { size }), ...props });
2750
2889
  }
2751
2890
  function ToolbarSeparator({ className }) {
2752
- return /* @__PURE__ */ jsx44(
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 jsx45 } from "react/jsx-runtime";
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__ */ jsx45(Toolbar, { "aria-label": ariaLabel, surface, className: cn("gap-0.5", className), children: options.map((option) => (
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__ */ jsx45(
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__ */ jsx45("span", { "aria-hidden": "true", className: "text-h3 leading-none", children: option.emoji })
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 jsx46, jsxs as jsxs30 } from "react/jsx-runtime";
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__ */ jsxs30(BasePreviewCard.Root, { children: [
2797
- /* @__PURE__ */ jsx46(
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__ */ jsx46("span", { className: cn("inline-flex", wrapperClassName) }),
2941
+ render: /* @__PURE__ */ jsx47("span", { className: cn("inline-flex", wrapperClassName) }),
2803
2942
  children
2804
2943
  }
2805
2944
  ),
2806
- /* @__PURE__ */ jsx46(BasePreviewCard.Portal, { children: /* @__PURE__ */ jsx46(
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__ */ jsx46(
2953
+ children: /* @__PURE__ */ jsx47(
2815
2954
  BasePreviewCard.Popup,
2816
2955
  {
2817
2956
  className: cn("w-[360px] p-0 outline-none", className),
2818
- render: /* @__PURE__ */ jsx46(MenuPanel, {}),
2819
- children: /* @__PURE__ */ jsx46(ScrollArea, { viewportClassName: "max-h-[min(300px,var(--available-height))]", contentClassName: cn("flex flex-col gap-3 p-3", contentClassName), children: content })
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 jsx47 } from "react/jsx-runtime";
2967
+ import { jsx as jsx48 } from "react/jsx-runtime";
2829
2968
  function Rail({ "aria-label": ariaLabel = "Navigation", children, className }) {
2830
- return /* @__PURE__ */ jsx47("nav", { "aria-label": ariaLabel, className: cn("flex w-16 shrink-0 flex-col items-start gap-2 px-2 py-3", className), children });
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 jsx48, jsxs as jsxs31 } from "react/jsx-runtime";
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__ */ jsxs31(
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__ */ jsx48(
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__ */ jsx48(
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__ */ jsx48("span", { className: cn("text-center text-menu", active ? "text-text-primary" : "text-text-secondary"), children: label })
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 jsx49, jsxs as jsxs32 } from "react/jsx-runtime";
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__ */ jsxs32("dl", { className: cn("flex flex-col gap-3", className), children: [
2879
- /* @__PURE__ */ jsx49("dt", { className: "text-menu uppercase tracking-widest text-text-secondary", children: label }),
2880
- /* @__PURE__ */ jsx49("dd", { className: VALUE_CLASSES, children })
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__ */ jsxs32("dl", { className: cn("flex items-center gap-2", className), children: [
2885
- /* @__PURE__ */ jsx49("dt", { className: "w-[68px] shrink-0 text-caption text-text-secondary", children: label }),
2886
- /* @__PURE__ */ jsx49("dd", { className: VALUE_CLASSES, children })
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 jsx50, jsxs as jsxs33 } from "react/jsx-runtime";
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__ */ jsxs33(
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__ */ jsx50("span", { "aria-hidden": "true", className: "shrink-0 text-body-1 leading-none", children: emoji }),
2919
- /* @__PURE__ */ jsx50("span", { className: CHIP_TEXT_CLASSES, children: count })
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 jsx51, jsxs as jsxs34 } from "react/jsx-runtime";
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__ */ jsxs34(
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__ */ jsx51(
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__ */ jsx51(Kbd, { children: shortcut })
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 Fragment9, jsx as jsx52, jsxs as jsxs35 } from "react/jsx-runtime";
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__ */ jsx52("button", { type: "button", onClick: onToggle, "aria-expanded": isExpanded }) : /* @__PURE__ */ jsx52("span", {})),
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__ */ jsxs35(Fragment9, { children: [
2970
- chevron && /* @__PURE__ */ jsx52(
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__ */ jsx52(SectionLabel, { children: title })
3117
+ /* @__PURE__ */ jsx53(SectionLabel, { children: title })
2979
3118
  ] })
2980
3119
  }
2981
3120
  });
2982
- return /* @__PURE__ */ jsxs35(
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__ */ jsx52("div", { className: "flex shrink-0 items-center", children: trailing }),
2996
- actions && actions.length > 0 && /* @__PURE__ */ jsx52(
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__ */ jsx52(IconButton, { tooltip: action.tooltip, "aria-label": action.tooltip, onClick: action.onClick, children: action.icon }, action.tooltip))
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 jsx53, jsxs as jsxs36 } from "react/jsx-runtime";
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__ */ jsxs36("div", { className: cn("flex h-full min-h-0 flex-1 flex-col", className), children: [
3015
- /* @__PURE__ */ jsx53(ContainerHeader, { title, chevron, actions }),
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__ */ jsx53("div", { className: "flex min-h-0 flex-1 flex-col px-4", children })
3019
- ) : /* @__PURE__ */ jsx53(ScrollArea, { className: "min-h-0 flex-1", contentClassName: bodyClassName, viewportRef: bodyRef, onScroll: onBodyScroll, children }),
3020
- !broken && footer && /* @__PURE__ */ jsx53("div", { className: "shrink-0", children: footer })
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__ */ jsx53(
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__ */ jsx53(Frame, { title: props.title, chevron: props.chevron, className: props.className, broken: true, children: message })
3169
+ /* @__PURE__ */ jsx54(Frame, { title: props.title, chevron: props.chevron, className: props.className, broken: true, children: message })
3031
3170
  ),
3032
- children: /* @__PURE__ */ jsx53(Frame, { ...props })
3171
+ children: /* @__PURE__ */ jsx54(Frame, { ...props })
3033
3172
  }
3034
3173
  );
3035
3174
  }
3036
3175
 
3037
3176
  // src/ListColumn.tsx
3038
- import { jsx as jsx54, jsxs as jsxs37 } from "react/jsx-runtime";
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__ */ jsxs37(
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__ */ jsx54(ContainerHeader, { title, chevron, actions }),
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__ */ jsx54("div", { className: "flex min-h-0 flex-1 flex-col px-3", children })
3056
- ) : /* @__PURE__ */ jsx54(ScrollArea, { className: "flex-1", contentClassName: "flex flex-col gap-0.5 px-3 pt-4 pb-3", children })
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__ */ jsx54(
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__ */ jsx54(Column, { title: props.title, chevron: props.chevron, collapsed: props.collapsed, className: props.className, broken: true, children: message })
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__ */ jsx54(Column, { ...props })
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 jsx55, jsxs as jsxs38 } from "react/jsx-runtime";
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__ */ jsxs38(Collapsible.Root, { open, onOpenChange: setOpen, className: cn("flex flex-col", className), children: [
3106
- /* @__PURE__ */ jsx55(SectionHeader, { title, chevron: true, isExpanded: open, trailing, actions, showActions, className: "shrink-0", render: /* @__PURE__ */ jsx55(Collapsible.Trigger, {}) }),
3107
- /* @__PURE__ */ jsx55(
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__ */ jsx55("div", { className: cn("flex flex-col", contentClassName), children })
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 jsx56, jsxs as jsxs39 } from "react/jsx-runtime";
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__ */ jsx56(
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__ */ jsx56(
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__ */ jsxs39(
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__ */ jsxs39("span", { className: "flex items-baseline", children: [
3289
+ /* @__PURE__ */ jsxs40("span", { className: "flex items-baseline", children: [
3151
3290
  tab.label,
3152
- tab.count !== void 0 ? /* @__PURE__ */ jsx56("span", { className: "ml-2.5 font-mono text-caption tabular-nums text-text-secondary", children: tab.count }) : null
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 jsx57, jsxs as jsxs40 } from "react/jsx-runtime";
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__ */ jsx57(Icon, { size: 16, stroke: 1.5, className: cn("text-text-primary shrink-0", ICON_STYLES[type]) });
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__ */ jsxs40("div", { className: pillClassName(type, hasAction, className), children: [
3209
- /* @__PURE__ */ jsxs40("div", { className: "flex items-center gap-2 shrink-0", children: [
3210
- leadingIcon && /* @__PURE__ */ jsx57(LeadingIcon, { type }),
3211
- /* @__PURE__ */ jsx57("span", { className: LABEL_CLASSES, children: label })
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__ */ jsx57(Button, { variant: "outlined", size: "small", onClick: onAction, children: actionLabel })
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__ */ jsx57(ToastContext.Provider, { value, children: /* @__PURE__ */ jsxs40(BaseToast.Provider, { toastManager: manager, limit: VISIBLE_TOASTS, children: [
3373
+ return /* @__PURE__ */ jsx58(ToastContext.Provider, { value, children: /* @__PURE__ */ jsxs41(BaseToast.Provider, { toastManager: manager, limit: VISIBLE_TOASTS, children: [
3235
3374
  children,
3236
- /* @__PURE__ */ jsx57(BaseToast.Portal, { children: /* @__PURE__ */ jsx57(BaseToast.Viewport, { className: "fixed bottom-4 left-4 z-[100] flex flex-col-reverse items-start gap-2 pointer-events-none", children: /* @__PURE__ */ jsx57(ToastList, {}) }) })
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__ */ jsxs40(
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__ */ jsxs40("div", { className: "flex items-center gap-2 shrink-0", children: [
3252
- leadingIcon && /* @__PURE__ */ jsx57(LeadingIcon, { type }),
3253
- /* @__PURE__ */ jsx57(BaseToast.Title, { render: /* @__PURE__ */ jsx57("span", {}), className: LABEL_CLASSES })
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__ */ jsx57(
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__ */ jsx57(Button, { variant: "outlined", size: "small", children: actionLabel })
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