@sequenceholdings/atlas-ui 0.3.2 → 1.0.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.
package/dist/index.d.ts CHANGED
@@ -1506,68 +1506,13 @@ export declare interface FilterOption<T extends string> {
1506
1506
  swatch?: ReactNode;
1507
1507
  }
1508
1508
 
1509
- export declare function FilterPill({ label, options, selected, onChange }: FilterPillProps): JSX.Element | null;
1510
-
1511
- /**
1512
- * @deprecated Do not use in new code, and migrate existing usages off it.
1513
- * `FilterPill` is being retired from the design system: filtering must go
1514
- * through the canonical support — `ProDataTable`'s native filter funnel
1515
- * (`meta.filter` → `FilterMenu`), which owns state, ordering (search always
1516
- * before filter), and DS-composed controls. This standalone pill is removed
1517
- * from the design-system gallery; it is still exported from
1518
- * `@sequenceholdings/atlas-ui` (deprecated) purely so existing consumers keep
1519
- * compiling — kept only until the remaining app consumers (chat / crm /
1520
- * permissions / groups / jarvis / billing) are migrated to the funnel, after
1521
- * which the exports and this file go away (DES-126).
1522
- *
1523
- * FilterPill — a compact multi-select filter anchored to a table toolbar.
1524
- *
1525
- * Visual contract mirrors `SelectTrigger` so a toolbar of FilterPills +
1526
- * SearchInput + Select reads as one coherent row of controls, not a
1527
- * grab-bag of visual treatments:
1528
- *
1529
- * - Height: h-9 (36px)
1530
- * - Radius: `rounded-control` — operable and one line tall
1531
- * - Border/bg: `border bg-card` — `--input` border, raised surface,
1532
- * same palette as Select/Input. NOT `background`: that is
1533
- * the PAGE role (ds-neutral-50 under v2, not white), which
1534
- * rendered the pill as a grey chip next to the white
1535
- * outline controls beside it. `Button variant="outline"`
1536
- * carries the same note and the same `dark:bg-input/30`
1537
- * lift, since in dark the resting fill matches the darkest
1538
- * surface and vanishes.
1539
- * - Padding: px-3 py-1
1540
- * - Text: text-base md:text-sm (14px on desktop)
1541
- * - Focus ring: focus:ring-1 focus:ring-ring (keyboard-visible)
1542
- *
1543
- * Rationale for NOT using `rounded-full` + primary fill (the old shape):
1544
- * 1. Visual noise. When a toolbar mixes a SearchInput (8px radius),
1545
- * two FilterPills (full radius), and a Select (8px radius), the
1546
- * eye has to re-parse each control. A consistent radius reads as
1547
- * one group.
1548
- * 2. Active state hierarchy. A solid primary-colored pill made the
1549
- * active filter feel like a CTA. Filters are not CTAs — the
1550
- * primary action on a dashboard is "run query" / "save", not
1551
- * "I've narrowed my view". A subtle count chip communicates
1552
- * activity without competing with real buttons.
1553
- *
1554
- * Active state now uses a tiny pill-shaped count badge next to the
1555
- * label. The trigger itself stays in the Select-aligned neutral look.
1556
- */
1557
- declare interface FilterPillProps {
1558
- label: string;
1559
- options: string[];
1560
- selected: string[];
1561
- onChange: (values: string[]) => void;
1562
- }
1563
-
1564
1509
  /**
1565
1510
  * @deprecated Do not use in new code, and migrate existing usages off it.
1566
1511
  * `FilterSelect` is retired in favor of `MultiSelect` (searchable cmdk list,
1567
1512
  * always-visible checkboxes, stacked trigger icons). It is still exported from
1568
1513
  * `@sequenceholdings/atlas-ui` (deprecated) so remaining consumers keep
1569
- * compiling — remove only after the blast-radius scan is clean (FilterPill /
1570
- * DES-261 deprecate-before-delete pattern).
1514
+ * compiling — remove only after the blast-radius scan is clean (DES-261
1515
+ * deprecate-before-delete pattern).
1571
1516
  *
1572
1517
  * A compact multi-select filter for a table/list toolbar: a trigger with a count
1573
1518
  * chip when active, and a popover of swatch + label rows with a check on the
@@ -1933,7 +1878,7 @@ declare interface MetricGridProps {
1933
1878
  className?: string;
1934
1879
  }
1935
1880
 
1936
- export declare function MultiSelect({ label, countLabel, options, selected, onChange, searchPlaceholder, emptyMessage, maxStackedIcons, hideWhenEmpty, className, }: MultiSelectProps): JSX.Element | null;
1881
+ export declare function MultiSelect({ label, countLabel, options, selected, onChange, searchPlaceholder, emptyMessage, maxStackedIcons, hideWhenEmpty, modal, className, }: MultiSelectProps): JSX.Element | null;
1937
1882
 
1938
1883
  /**
1939
1884
  * Fields shared by `MultiSelect` (trigger + popover) and the standalone
@@ -2050,6 +1995,27 @@ declare interface MultiSelectProps extends MultiSelectCoreProps {
2050
1995
  * that hasn't loaded yet).
2051
1996
  */
2052
1997
  hideWhenEmpty?: boolean;
1998
+ /**
1999
+ * Render the popover as a modal layer. Pass `true` when the MultiSelect
2000
+ * lives inside a Dialog.
2001
+ *
2002
+ * A Dialog scroll-locks the page with react-remove-scroll, allowing wheel
2003
+ * events only within the dialog's own content subtree. This popover portals
2004
+ * to the body, so it sits outside that subtree and the lock swallows every
2005
+ * wheel event over the option list — the list is a real scroll container
2006
+ * (`max-h-[300px] overflow-y-auto`) but cannot be scrolled, stranding every
2007
+ * option past the ~7th. Radix `Select` is unaffected because it implements
2008
+ * its own scrolling rather than relying on native overflow.
2009
+ *
2010
+ * Modal mode gives the popover its own scroll lock. react-remove-scroll
2011
+ * keeps a stack of locks with only the innermost active, so the popover's
2012
+ * lock supersedes the dialog's and allows wheel within the popover.
2013
+ *
2014
+ * Defaults to `false` because modal mode also traps focus and blocks outside
2015
+ * pointer events — in a filter toolbar that breaks clicking straight from one
2016
+ * open facet to the next, which is the dominant use of this component.
2017
+ */
2018
+ modal?: boolean;
2053
2019
  className?: string;
2054
2020
  }
2055
2021