@ai-matrx/design-system 0.27.0 → 0.28.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/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.28.0 — 2026-09-21
4
+
5
+ **Two organizations with the same name were indistinguishable in the picker.**
6
+
7
+ Real-data crews made duplicates while working — two called "Kessler Lab for
8
+ Applied Microbial Ecology", two called "Wraithmoor Regional Museum of Art &
9
+ Craft" — and reported that a person had no way of knowing which one they were
10
+ about to work in: identical name, identical abbreviation tile, nothing else on
11
+ the row. The list drew the name and nothing else, so there was nothing for it
12
+ to draw.
13
+
14
+ `OrganizationPickerOrganization.distinguisher` is the address — the host's slug,
15
+ or whatever else tells two of them apart — and the picker draws it ONLY on rows
16
+ whose name another row in the same list also carries. That is what Slack does
17
+ with a workspace URL and Google with an account's email, and only where it
18
+ settles the question: a list of distinct names is unchanged, because a second
19
+ line under every row is noise a person learns to skip.
20
+
21
+ **Consumer action:** pass `distinguisher` from whatever your host has (in
22
+ matrx-frontend it is the organization's slug). Omit it and nothing changes.
23
+
3
24
  ## 0.27.0 — 2026-09-20
4
25
 
5
26
  **Released so the app can have what landed on main after 0.26.0 and had no
package/dist/index.cjs CHANGED
@@ -3674,6 +3674,7 @@ function OrganizationPicker({
3674
3674
  }) {
3675
3675
  const active = organizations.find((o) => o.id === activeOrganizationId) ?? null;
3676
3676
  const isDefault = (id) => !!defaultOrganizationId && id === defaultOrganizationId;
3677
+ const sharesItsName = (org) => organizations.filter((other) => other.name.trim() === org.name.trim()).length > 1;
3677
3678
  return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("div", { className: cn("flex flex-col", className), "data-slot": "organization-picker", children: [
3678
3679
  !hideHeading && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("p", { className: "px-2 py-1.5 text-[11px] font-semibold uppercase tracking-wide text-muted-foreground", children: "Organization" }),
3679
3680
  loading ? /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("div", { className: "space-y-1 px-1 py-1", "aria-busy": "true", "aria-label": "Loading organizations", children: [
@@ -3715,7 +3716,10 @@ function OrganizationPicker({
3715
3716
  )
3716
3717
  }
3717
3718
  ),
3718
- /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("span", { className: "min-w-0 flex-1 truncate", children: org.name }),
3719
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("span", { className: "flex min-w-0 flex-1 flex-col", children: [
3720
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("span", { className: "truncate", children: org.name }),
3721
+ sharesItsName(org) && org.distinguisher ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("span", { className: "truncate text-[10px] font-normal text-muted-foreground", children: org.distinguisher }) : null
3722
+ ] }),
3719
3723
  org.isPersonal && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("span", { className: "shrink-0 rounded-full bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground", children: "Personal" }),
3720
3724
  isDefault(org.id) && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
3721
3725
  StarIcon,