@ai-matrx/design-system 0.31.0 → 0.34.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.d.cts CHANGED
@@ -1469,6 +1469,62 @@ declare const SheetFooter: {
1469
1469
  };
1470
1470
  declare const SheetTitle: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogTitleProps & React.RefAttributes<HTMLHeadingElement>, "ref"> & React.RefAttributes<HTMLHeadingElement>>;
1471
1471
 
1472
+ /**
1473
+ * OrganizationPicker — THE ONE "which organization am I acting in" control,
1474
+ * identical on every Matrx surface (the main app's user menu and header nudge,
1475
+ * Workflow Studio's sidebar, the admin dashboard's settings).
1476
+ *
1477
+ * Ported from matrx-frontend `features/organizations/components/
1478
+ * OrganizationPickerPanel.tsx` + `UserMenuOrgSection.tsx` + `DefaultOrgSwitch.tsx`
1479
+ * (2026-09-08), which until then were the ONLY surfaces with the full picker;
1480
+ * Studio and the dashboard each had a bare `<Select>` with different copy,
1481
+ * different placement and no default control. Three UIs for one fact.
1482
+ *
1483
+ * WHAT IT SAYS, IN WORDS (the rule the origin learned the hard way, five
1484
+ * reports across three rounds): the panel states which organization is
1485
+ * ACTIVE — "Working in Acme" — because a check mark and an accent colour are
1486
+ * not an answer to "which one am I in", and the default switch's sentence is
1487
+ * about STARTUP, not about now. A control whose only sentence describes a
1488
+ * different fact than the one the reader is looking for lies by omission.
1489
+ *
1490
+ * It is PRESENTATIONAL. The host supplies the memberships, the active id, the
1491
+ * default id, and two callbacks; it owns no fetch, no storage, no resolution.
1492
+ * The resolution order (this device's stored selection → sole membership →
1493
+ * make the person pick) and the shared cookie that carries the stored
1494
+ * selection live in the host's org-context module and `@ai-matrx/data/db`'s
1495
+ * `createActiveOrgCookie`. Persistence boundary (C10): none.
1496
+ *
1497
+ * 🚨 THE STAR DOES NOT PICK AN ORGANIZATION, AND MUST NOT SAY IT DOES.
1498
+ * Until 2026-09-21 this switch read "Set as my default" and promised "Next
1499
+ * startup opens Acme" / "Auto-select this at startup". That stopped being true
1500
+ * on 2026-09-19, when the owner deleted the durable-default rung from the
1501
+ * resolver — "a default organization is at most a per-client DISPLAY
1502
+ * preference; the org picker may show it and nothing else may read it" — and
1503
+ * nobody changed the words. Crew D2 met exactly that on 2026-09-21: the
1504
+ * selection gone on a fresh browser profile "with no persistence despite a
1505
+ * 'Set as my default' toggle implying it should stick". A control wearing a
1506
+ * false sentence is the one thing a screen may never do, so the switch now
1507
+ * says the thing it actually does — and DOES it: the starred organization is
1508
+ * drawn first, which is what a star is for in Slack and in Linear, and which
1509
+ * is the difference between finding your own workspace instantly and hunting
1510
+ * it among ninety.
1511
+ *
1512
+ * 🚨 A HUNDRED ROWS IS NOT A LIST (VERIFIER-8 MEDIUM-3, 2026-09-21).
1513
+ * The first screen of the data product offered the admin account's 116
1514
+ * organizations nine at a time, with no search, most of them lane fixtures.
1515
+ * Three things answer that, and all three are here rather than in one host:
1516
+ * • SEARCH over name and abbreviation, once the list passes eight rows.
1517
+ * • TEST ORGANIZATIONS HIDDEN by default behind the platform's one
1518
+ * archive-style disclosure (`ArchivedDisclosure`), with their count always
1519
+ * on screen. Hidden, never dropped.
1520
+ * • THE PERSON'S OWN organizations drawn first, under the starred one.
1521
+ * The host classifies (`isTestFixture`, `isOwn`); this component decides
1522
+ * nothing about a name it is given.
1523
+ *
1524
+ * Seam inversions from the origin: lucide `Check`/`Star` become package
1525
+ * SVGs (C19); the host `Switch` becomes this package's; `cn` is local.
1526
+ */
1527
+
1472
1528
  interface OrganizationPickerOrganization {
1473
1529
  id: string;
1474
1530
  name: string;
@@ -1491,6 +1547,27 @@ interface OrganizationPickerOrganization {
1491
1547
  * was, because a second line under every row is noise a person learns to skip.
1492
1548
  */
1493
1549
  distinguisher?: string | null;
1550
+ /**
1551
+ * This organization is a TEST FIXTURE — a lane's scratch organization, not a
1552
+ * business anybody works in. Classified in `iam.organizations.settings`
1553
+ * (`test_fixture`), never guessed from its name.
1554
+ *
1555
+ * 🚨 WHY (VERIFIER-8 MEDIUM-3, 2026-09-21). The admin account belongs to 116
1556
+ * organizations and 59 of them are fixtures. The first screen of the data
1557
+ * product offered all of them, nine at a time, with no search — so the two
1558
+ * or three a person actually works in were buried under lane debris. The
1559
+ * archived-items law already answers this shape everywhere else in the
1560
+ * platform: hide by default, ONE disclosure to reveal, and the count of what
1561
+ * is hidden is always on screen. It is hidden, never dropped: a fixture the
1562
+ * person genuinely wants is one click away.
1563
+ */
1564
+ isTestFixture?: boolean;
1565
+ /**
1566
+ * The signed-in person created this organization. Drawn before the rest,
1567
+ * under the starred one — the same reason Slack puts your own workspace
1568
+ * first: in a list of a hundred, yours must not be something you search for.
1569
+ */
1570
+ isOwn?: boolean;
1494
1571
  }
1495
1572
  interface OrganizationPickerProps {
1496
1573
  organizations: readonly OrganizationPickerOrganization[];
package/dist/index.d.ts CHANGED
@@ -1469,6 +1469,62 @@ declare const SheetFooter: {
1469
1469
  };
1470
1470
  declare const SheetTitle: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogTitleProps & React.RefAttributes<HTMLHeadingElement>, "ref"> & React.RefAttributes<HTMLHeadingElement>>;
1471
1471
 
1472
+ /**
1473
+ * OrganizationPicker — THE ONE "which organization am I acting in" control,
1474
+ * identical on every Matrx surface (the main app's user menu and header nudge,
1475
+ * Workflow Studio's sidebar, the admin dashboard's settings).
1476
+ *
1477
+ * Ported from matrx-frontend `features/organizations/components/
1478
+ * OrganizationPickerPanel.tsx` + `UserMenuOrgSection.tsx` + `DefaultOrgSwitch.tsx`
1479
+ * (2026-09-08), which until then were the ONLY surfaces with the full picker;
1480
+ * Studio and the dashboard each had a bare `<Select>` with different copy,
1481
+ * different placement and no default control. Three UIs for one fact.
1482
+ *
1483
+ * WHAT IT SAYS, IN WORDS (the rule the origin learned the hard way, five
1484
+ * reports across three rounds): the panel states which organization is
1485
+ * ACTIVE — "Working in Acme" — because a check mark and an accent colour are
1486
+ * not an answer to "which one am I in", and the default switch's sentence is
1487
+ * about STARTUP, not about now. A control whose only sentence describes a
1488
+ * different fact than the one the reader is looking for lies by omission.
1489
+ *
1490
+ * It is PRESENTATIONAL. The host supplies the memberships, the active id, the
1491
+ * default id, and two callbacks; it owns no fetch, no storage, no resolution.
1492
+ * The resolution order (this device's stored selection → sole membership →
1493
+ * make the person pick) and the shared cookie that carries the stored
1494
+ * selection live in the host's org-context module and `@ai-matrx/data/db`'s
1495
+ * `createActiveOrgCookie`. Persistence boundary (C10): none.
1496
+ *
1497
+ * 🚨 THE STAR DOES NOT PICK AN ORGANIZATION, AND MUST NOT SAY IT DOES.
1498
+ * Until 2026-09-21 this switch read "Set as my default" and promised "Next
1499
+ * startup opens Acme" / "Auto-select this at startup". That stopped being true
1500
+ * on 2026-09-19, when the owner deleted the durable-default rung from the
1501
+ * resolver — "a default organization is at most a per-client DISPLAY
1502
+ * preference; the org picker may show it and nothing else may read it" — and
1503
+ * nobody changed the words. Crew D2 met exactly that on 2026-09-21: the
1504
+ * selection gone on a fresh browser profile "with no persistence despite a
1505
+ * 'Set as my default' toggle implying it should stick". A control wearing a
1506
+ * false sentence is the one thing a screen may never do, so the switch now
1507
+ * says the thing it actually does — and DOES it: the starred organization is
1508
+ * drawn first, which is what a star is for in Slack and in Linear, and which
1509
+ * is the difference between finding your own workspace instantly and hunting
1510
+ * it among ninety.
1511
+ *
1512
+ * 🚨 A HUNDRED ROWS IS NOT A LIST (VERIFIER-8 MEDIUM-3, 2026-09-21).
1513
+ * The first screen of the data product offered the admin account's 116
1514
+ * organizations nine at a time, with no search, most of them lane fixtures.
1515
+ * Three things answer that, and all three are here rather than in one host:
1516
+ * • SEARCH over name and abbreviation, once the list passes eight rows.
1517
+ * • TEST ORGANIZATIONS HIDDEN by default behind the platform's one
1518
+ * archive-style disclosure (`ArchivedDisclosure`), with their count always
1519
+ * on screen. Hidden, never dropped.
1520
+ * • THE PERSON'S OWN organizations drawn first, under the starred one.
1521
+ * The host classifies (`isTestFixture`, `isOwn`); this component decides
1522
+ * nothing about a name it is given.
1523
+ *
1524
+ * Seam inversions from the origin: lucide `Check`/`Star` become package
1525
+ * SVGs (C19); the host `Switch` becomes this package's; `cn` is local.
1526
+ */
1527
+
1472
1528
  interface OrganizationPickerOrganization {
1473
1529
  id: string;
1474
1530
  name: string;
@@ -1491,6 +1547,27 @@ interface OrganizationPickerOrganization {
1491
1547
  * was, because a second line under every row is noise a person learns to skip.
1492
1548
  */
1493
1549
  distinguisher?: string | null;
1550
+ /**
1551
+ * This organization is a TEST FIXTURE — a lane's scratch organization, not a
1552
+ * business anybody works in. Classified in `iam.organizations.settings`
1553
+ * (`test_fixture`), never guessed from its name.
1554
+ *
1555
+ * 🚨 WHY (VERIFIER-8 MEDIUM-3, 2026-09-21). The admin account belongs to 116
1556
+ * organizations and 59 of them are fixtures. The first screen of the data
1557
+ * product offered all of them, nine at a time, with no search — so the two
1558
+ * or three a person actually works in were buried under lane debris. The
1559
+ * archived-items law already answers this shape everywhere else in the
1560
+ * platform: hide by default, ONE disclosure to reveal, and the count of what
1561
+ * is hidden is always on screen. It is hidden, never dropped: a fixture the
1562
+ * person genuinely wants is one click away.
1563
+ */
1564
+ isTestFixture?: boolean;
1565
+ /**
1566
+ * The signed-in person created this organization. Drawn before the rest,
1567
+ * under the starred one — the same reason Slack puts your own workspace
1568
+ * first: in a list of a hundred, yours must not be something you search for.
1569
+ */
1570
+ isOwn?: boolean;
1494
1571
  }
1495
1572
  interface OrganizationPickerProps {
1496
1573
  organizations: readonly OrganizationPickerOrganization[];