@estiva-app/ui 0.61.0 → 0.62.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -21,13 +21,16 @@ export interface MembersDialogProps {
21
21
  /** The number in the title's chip. Defaults to how many rows there are. */
22
22
  count?: number;
23
23
  /**
24
- * The viewer's own row on top: "Join" when they are not in, "Leave" when
25
- * they are. Absent while it is not known, or where they cannot change it —
26
- * no row is better than a wrong one.
24
+ * What the viewer can do: "Leave" on their own row when they are in, which
25
+ * is drawn first; a "Join" row on top when they are not. Absent while it is
26
+ * not known, or where they cannot change it — no button is better than a
27
+ * wrong one.
27
28
  */
28
29
  self?: {
29
30
  action: MembersDialogSelfAction;
30
31
  onToggle: () => void | Promise<unknown>;
32
+ /** The viewer's id: the row in `members` that carries Leave and comes first. */
33
+ id: string;
31
34
  };
32
35
  /** Who "Add members" may offer. Members are left out by id. */
33
36
  candidates?: MembersDialogCandidate[];
@@ -49,8 +52,10 @@ export interface MembersDialogProps {
49
52
  *
50
53
  * Moved from Peek's `MembersDialog` (2026-10-06; Katerina's design of 22 July,
51
54
  * with the row and inset rulings of 15 September). Two layers in one dialog:
52
- * the roster, with the viewer's Join or Leave and "Add members" on top, and the
53
- * add layer, whose back arrow returns to the roster. Adding returns to the
55
+ * the roster, with "Add members" (and Join, for a non-member) on top, and the
56
+ * add layer, whose back arrow returns to the roster. Leave is a small red
57
+ * button on the viewer's own row, which always comes first (Katerina, 8
58
+ * October: a Leave row on top looked like an invite, the same as Add members). Adding returns to the
54
59
  * roster so the new people are visible at once.
55
60
  */
56
61
  export declare function MembersDialog({ members, count, self, candidates, onAdd, note, initialView, onClose }: MembersDialogProps): import("react").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"MembersDialog.d.ts","sourceRoot":"","sources":["../src/MembersDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAKvD,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,aAAa,CAAA;AAO7D,0EAA0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,mEAAmE;AACnE,MAAM,WAAW,sBAAuB,SAAQ,eAAe;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,oFAAoF;AACpF,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,OAAO,CAAA;AAEtD,MAAM,WAAW,kBAAkB;IACjC,iGAAiG;IACjG,OAAO,EAAE,mBAAmB,EAAE,CAAA;IAC9B,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;;OAIG;IACH,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,uBAAuB,CAAA;QAC/B,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;KACxC,CAAA;IACD,+DAA+D;IAC/D,UAAU,CAAC,EAAE,sBAAsB,EAAE,CAAA;IACrC;;;;OAIG;IACH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,sBAAsB,EAAE,KAAK,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,CAAA;IACtF,2EAA2E;IAC3E,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;IAC5B,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAID;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAe,EAAE,KAAK,EAAE,IAAI,EAAE,WAAoB,EAAE,OAAO,EAAE,EAAE,kBAAkB,+BAgHtI"}
1
+ {"version":3,"file":"MembersDialog.d.ts","sourceRoot":"","sources":["../src/MembersDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAKvD,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,aAAa,CAAA;AAO7D,0EAA0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,mEAAmE;AACnE,MAAM,WAAW,sBAAuB,SAAQ,eAAe;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,oFAAoF;AACpF,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,OAAO,CAAA;AAEtD,MAAM,WAAW,kBAAkB;IACjC,iGAAiG;IACjG,OAAO,EAAE,mBAAmB,EAAE,CAAA;IAC9B,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;;;OAKG;IACH,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,uBAAuB,CAAA;QAC/B,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QACvC,gFAAgF;QAChF,EAAE,EAAE,MAAM,CAAA;KACX,CAAA;IACD,+DAA+D;IAC/D,UAAU,CAAC,EAAE,sBAAsB,EAAE,CAAA;IACrC;;;;OAIG;IACH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,sBAAsB,EAAE,KAAK,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,CAAA;IACtF,2EAA2E;IAC3E,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;IAC5B,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAKD;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAe,EAAE,KAAK,EAAE,IAAI,EAAE,WAAoB,EAAE,OAAO,EAAE,EAAE,kBAAkB,+BA0HtI"}
package/dist/index.js CHANGED
@@ -1710,7 +1710,7 @@ function Form({ onSubmit, busy: ownBusy = false, enterSends = true, layout = "fi
1710
1710
 
1711
1711
  // src/MembersDialog.tsx
1712
1712
  import { Fragment as Fragment5, jsx as jsx26, jsxs as jsxs17 } from "react/jsx-runtime";
1713
- var LEADING_CLASSES = "size-8 rounded-md bg-accent-muted flex items-center justify-center shrink-0 text-accent-primary";
1713
+ var LEADING_CLASSES = "size-8 rounded-md bg-accent-muted flex items-center justify-center shrink-0 text-accent-text";
1714
1714
  function MembersDialog({ members, count, self, candidates = [], onAdd, note, initialView = "list", onClose }) {
1715
1715
  const [view, setView] = useState3(onAdd ? initialView : "list");
1716
1716
  const [chosen, setChosen] = useState3([]);
@@ -1731,6 +1731,9 @@ function MembersDialog({ members, count, self, candidates = [], onAdd, note, ini
1731
1731
  setChosen([]);
1732
1732
  setView("list");
1733
1733
  };
1734
+ const ownRow = self?.action === "leave" ? members.find((m) => m.id === self.id) : void 0;
1735
+ const roster = ownRow ? [ownRow, ...members.filter((m) => m !== ownRow)] : members;
1736
+ const selfOnTop = self && !ownRow;
1734
1737
  if (view === "add" && onAdd) {
1735
1738
  return /* @__PURE__ */ jsx26(
1736
1739
  DialogShell,
@@ -1774,8 +1777,8 @@ function MembersDialog({ members, count, self, candidates = [], onAdd, note, ini
1774
1777
  bodyMaxHeight: "max-h-[400px]",
1775
1778
  bodyClassName: "p-0 py-2",
1776
1779
  children: [
1777
- (self || onAdd) && /* @__PURE__ */ jsxs17("div", { className: "flex flex-col px-2", children: [
1778
- self && /* @__PURE__ */ jsx26(
1780
+ (selfOnTop || onAdd) && /* @__PURE__ */ jsxs17("div", { className: "flex flex-col px-2", children: [
1781
+ selfOnTop && /* @__PURE__ */ jsx26(
1779
1782
  MenuItem,
1780
1783
  {
1781
1784
  size: "tall",
@@ -1797,12 +1800,13 @@ function MembersDialog({ members, count, self, candidates = [], onAdd, note, ini
1797
1800
  }
1798
1801
  )
1799
1802
  ] }),
1800
- members.map((member) => /* @__PURE__ */ jsxs17("div", { className: "flex h-12 items-center gap-3 px-5", children: [
1803
+ roster.map((member) => /* @__PURE__ */ jsxs17("div", { className: "flex h-12 items-center gap-3 px-5", children: [
1801
1804
  /* @__PURE__ */ jsx26(Avatar, { size: 32, name: member.name, src: member.picture }),
1802
1805
  /* @__PURE__ */ jsxs17("div", { className: "flex min-w-0 flex-1 flex-col justify-center gap-[2px]", children: [
1803
1806
  /* @__PURE__ */ jsx26("div", { className: "truncate text-body-2 text-text-primary", children: member.name }),
1804
1807
  member.caption && /* @__PURE__ */ jsx26("div", { className: "truncate text-caption text-text-secondary", children: member.caption })
1805
- ] })
1808
+ ] }),
1809
+ member === ownRow && /* @__PURE__ */ jsx26(Button, { variant: "destructive", size: "small", disabled: toggling, onClick: () => void toggle(), children: "Leave" })
1806
1810
  ] }, member.id)),
1807
1811
  note && /* @__PURE__ */ jsx26("div", { className: "px-5 pb-2 pt-3 text-caption text-text-secondary", children: note })
1808
1812
  ]