@crewlethq/ui 0.43.0 → 0.45.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.
Files changed (67) hide show
  1. package/README.md +22 -2
  2. package/dist/AccessDeniedCard/index.js +2 -2
  3. package/dist/AgentHandoffPanel/index.js +2 -2
  4. package/dist/ArrangeFrame/index.js +2 -2
  5. package/dist/ArrangeList/index.js +1 -1
  6. package/dist/ArtifactCard/index.js +3 -3
  7. package/dist/AsideLayout/AsideLayout.d.ts +24 -0
  8. package/dist/AsideLayout/index.d.ts +3 -0
  9. package/dist/AsideLayout/index.js +2 -0
  10. package/dist/AsideLayout-TH5SQZNK.css +45 -0
  11. package/dist/AvatarPicker/index.js +3 -3
  12. package/dist/CatalogTile/CatalogTile.d.ts +12 -1
  13. package/dist/CatalogTile/index.d.ts +1 -1
  14. package/dist/CatalogTile/index.js +1 -1
  15. package/dist/{CatalogTile-XL4XLFUH.css → CatalogTile-VPSLCKJE.css} +55 -0
  16. package/dist/CharacterPicker/index.js +2 -2
  17. package/dist/DataGrid/index.js +2 -2
  18. package/dist/DataView/index.js +3 -3
  19. package/dist/DatasetSource/index.js +1 -1
  20. package/dist/DirectoryList/DirectoryList.d.ts +9 -4
  21. package/dist/DirectoryList/index.js +1 -1
  22. package/dist/{DirectoryList-EESYMH2U.css → DirectoryList-7OXXN47X.css} +30 -7
  23. package/dist/DocTabsEditor/index.js +1 -1
  24. package/dist/EmptyState/EmptyState.d.ts +9 -2
  25. package/dist/EmptyState/index.js +1 -1
  26. package/dist/{EmptyState-C6HRBGT7.css → EmptyState-7L4UAQBX.css} +34 -0
  27. package/dist/LinkInterstitial/index.js +2 -2
  28. package/dist/ListInput/index.js +2 -2
  29. package/dist/Section/Section.d.ts +6 -0
  30. package/dist/Section/index.js +1 -1
  31. package/dist/{Section-O5AHGSOG.css → Section-M7SG6NP2.css} +14 -0
  32. package/dist/SheetGrid/index.js +5 -5
  33. package/dist/SlideFilmstrip/index.js +1 -1
  34. package/dist/Statement/Statement.d.ts +45 -0
  35. package/dist/Statement/index.d.ts +3 -0
  36. package/dist/Statement/index.js +4 -0
  37. package/dist/Statement-M4QDXIMO.css +53 -0
  38. package/dist/Switcher/index.js +2 -2
  39. package/dist/TableCells/index.js +1 -1
  40. package/dist/TagsInput/index.js +2 -2
  41. package/dist/VersionCompare/index.js +2 -2
  42. package/dist/{chunk-XIDD7PJO.js → chunk-2MYSESZF.js} +1 -1
  43. package/dist/{chunk-SJ6DMG4R.js → chunk-4AA6WPQU.js} +1 -1
  44. package/dist/{chunk-PCT47E7O.js → chunk-5GNA4RKP.js} +36 -1
  45. package/dist/{chunk-3TFDQLW3.js → chunk-JQ7IFSF6.js} +1 -1
  46. package/dist/chunk-KY65C4XS.js +12 -0
  47. package/dist/chunk-MZJKPTA5.js +36 -0
  48. package/dist/{chunk-BO7Q6JP6.js → chunk-N3SHQ3VU.js} +1 -1
  49. package/dist/{chunk-RA2ULG6H.js → chunk-PPUR46MK.js} +10 -1
  50. package/dist/{chunk-PLLYOPS4.js → chunk-Q7HLZH32.js} +1 -1
  51. package/dist/{chunk-KV3ODJXH.js → chunk-QTMUKRTN.js} +1 -1
  52. package/dist/{chunk-IUQQGIHL.js → chunk-U44WGRFW.js} +1 -1
  53. package/dist/generated/index.d.ts +2 -0
  54. package/dist/generated/index.js +62 -60
  55. package/dist/index.js +62 -60
  56. package/dist/styles.css +241 -11
  57. package/package.json +3 -3
  58. package/dist/{chunk-VXCT6L3F.js → chunk-6IPEPSB5.js} +0 -0
  59. package/dist/{chunk-UAGDFEBG.js → chunk-KKUJSMLF.js} +1 -1
  60. package/dist/{chunk-524GGA67.js → chunk-NF6SWHQI.js} +1 -1
  61. package/dist/{chunk-Z5WMCBHR.js → chunk-NMYGJJJK.js} +1 -1
  62. package/dist/{chunk-U2XAJONO.js → chunk-OKE5YSLD.js} +1 -1
  63. package/dist/{chunk-OVHJTOKW.js → chunk-OWIGEE2Y.js} +2 -2
  64. package/dist/{chunk-VZICPYGR.js → chunk-SNQRGH4A.js} +1 -1
  65. package/dist/{chunk-IVAR7NRW.js → chunk-SXBJMBSV.js} +1 -1
  66. package/dist/{chunk-LKBZV5IT.js → chunk-VWYT3GVV.js} +1 -1
  67. package/dist/{chunk-NCM73C34.js → chunk-Y4GXCKOC.js} +2 -2
package/README.md CHANGED
@@ -41,7 +41,7 @@ import { Button } from '@crewlethq/ui/Button'; // 8 KB of CSS, not 182 KB
41
41
  | Area | Components |
42
42
  | ---- | ---------- |
43
43
  | Actions | `Button` and `ButtonLink` (variants `primary`, `secondary`, `outline`, `ghost`, `accent`, `danger`; sizes `small`, `medium`, `large`; shapes `square`, `pill`), `IconButton`, `Menu`, `Link`, `Copyable`, `CopyButton`, `DownloadButton`, `Kbd` |
44
- | Content and text | `Text` (the eight registers and `inherit`), `Prose`, `Document`, `DocumentTitle` and `DocumentTitleField`, the Markdown grammar (`parseMarkdown`, `parseMarkdownSpans`, `markdownInline`, `safeHref` and the line readers, with no React in it), `Highlight`, `InlineCode`, `List` and `ListItem`, `DescriptionList`, `Timeline`, `RelativeTime`, `Note`, `Divider` |
44
+ | Content and text | `Text` (the eight registers and `inherit`), `Prose`, `Statement`, `Document`, `DocumentTitle` and `DocumentTitleField`, the Markdown grammar (`parseMarkdown`, `parseMarkdownSpans`, `markdownInline`, `safeHref` and the line readers, with no React in it), `Highlight`, `InlineCode`, `List` and `ListItem`, `DescriptionList`, `Timeline`, `RelativeTime`, `Note`, `Divider` |
45
45
  | Forms | `Input`, `Textarea`, `Label`, `FormField`, `FormRow`, `Checkbox`, `CheckboxGroup`, `ConfirmField`, `Select`, `Tag`, `TagsInput`, `DateTimePicker`, `TimeWindowPicker`, `ImageUpload`, `CharacterPicker`, `HuePicker`, `AvatarPicker`, `FactList`, `ChoiceList`, `Composer`, `MarkdownEditor`, `RichEditor` (with `preloadRichEditor`, and the round trip `roundTripMarkdown` and `canonicalMarkdown` from `@crewlethq/ui/RichEditorMarkdown`) |
46
46
  | Data display | `DataTable`, `CopyableCell`, `Table`, the read-only table cells (`TableKeyCell`, `TableNumberCell`, `TableDateCell`, `TableEntityCell`, `TableStatusCell`, `TableTagsCell`, `TableTextCell`), `StatCard`, `Meter`, `SegmentedMeter`, `Stepper`, `PricingCard`, `Avatar`, `AvatarStack`, `EntityChip`, `CodeBlock`, `QrCode`, `ObjectHeader`, `FactLine`, `SetByLine`, `Skeleton`, `Eyebrow`, `StatGroup`, `PinTile`, `IconTile`, `SettingsTable` (with `SettingsTable.Row`), `CatalogTile` |
47
47
  | List screens | `DataView`, and its parts on their own: `DataViewToolbar`, `FilterAxisBar`, `FilterAxisChip`, plus the filter model (`filterDefsFromColumns`, `applyColumnFilters`, `filterPredicate`, `blankFilterValue`) |
@@ -50,7 +50,7 @@ import { Button } from '@crewlethq/ui/Button'; // 8 KB of CSS, not 182 KB
50
50
  | Charts | `Legend`, `BarList`, `StackedBar`, `StackedColumns`, `ActivityStrip`, `TimeSeries`, `Sparkline`, the reading layer they share (`ChartTooltip`, `useChartHover`), and the ramp (`DATA_COLORS`, `DATA_COLOR_OTHER`, `dataColor`) |
51
51
  | Marks | `Count`, `StatusDot`, `EmptyValue`, `VisuallyHidden` |
52
52
  | Hooks and seams | `useModalLayer`, `usePopupLayer`, `LayerHost`, `useListbox`, `useOptionKeys`, `useHighlightRest` and `HIGHLIGHT_REST_MS`, `useClipboard`, `useDownload`, `downloadText`, `downloadBlob`, `safeFilename`, `toCsv`, `elementToPng` and `ElementToPngError`, `useOutcome`, `useAnnouncer`, `useNow`, `formatRelative`, `HeadingLevelProvider`, `cx`, the node hues (`NODE_HUES`, `NODE_HUE_NAMES`, `isNodeHue`) |
53
- | Layout | `Container`, `Section`, `Card`, `TileGrid`, `ListDetail`, `Tabs`, `Accordion`, `Disclosure`, `Outline` (with `useActiveHeading` and `scrollToHeading`), `TreeGrid` |
53
+ | Layout | `Container`, `Section`, `Card`, `TileGrid`, `ListDetail`, `AsideLayout`, `Tabs`, `Accordion`, `Disclosure`, `Outline` (with `useActiveHeading` and `scrollToHeading`), `TreeGrid` |
54
54
  | Arranging a page | `ArrangeBoard`, `ArrangeGrid`, `ArrangeFrame` (with `useGridResize`), `ArrangeGroup`, `ArrangeList`, and the reorder hooks under them (`useReorder`, `useReorderLists`, `moveKey`) |
55
55
  | Application shell | `AppShell` with `AppShell.Rail`, `SectionFrame` (with `SectionFrame.Nav` and `SectionFrame.Body`), `LockedLabel`, `AppShell.Topbar`, `AppShell.AccountRow` and `useAppShell`, `AuthLayout`, `SidebarNav` and `NavItem`, `DirectoryList`, `BrandLockup`, `SearchTrigger`, `PageHeader`, `Toolbar`, `Stack`, `Inline`, `Spacer`, `AutoGrid`, `ErrorBoundary`, `useShortcut`, `useFullscreen`, `useIdle`, `useMediaMatch` |
56
56
  | Preferences | `ThemeToggle`, `ThemeSwitcher`, `DensitySwitcher`, `ThemeGallery`, `ThemeSwatch`, `useThemePreference`, `useDensityPreference`, `useSystemTheme`, `resolveTheme`, `applyStoredPreferences`, and the framework-free `applyTheme`, `applyPalette`, `applyDensity` with `THEME_PREFERENCES`, `DENSITY_PREFERENCES` and their guards |
@@ -204,6 +204,26 @@ places:
204
204
  - A surface that pans or zooms dispatches `LAYER_REPOSITION_EVENT` on its host
205
205
  when the content beneath it moves, and every panel anchored inside follows.
206
206
 
207
+ ## Changes in 0.45.0
208
+
209
+ The pieces of the engine's Company › Principles page: a company's mission, vision and policies beside the facts about it.
210
+
211
+ **`Statement` is new**: a label over the words a page exists to say (a mission, a vision, a goal), set a step over the body (`--font-size-lg`, the body's own step over it on a phone) at the reading measure, with the author's line breaks kept. A block such as a numbered list is drawn as given under the same label, so every statement on a page heads the same way. An unwritten one says so through `empty` (`title`, `description` and an optional `action`) as an inline empty state, never as grey text in the words' place. It is a region named by its label.
212
+
213
+ **`AsideLayout` is new**: a page's main column with an aside beside it from 56rem of the layout's own width (a container query, not the window's), the aside `--crewlet-aside-layout-aside` wide (18rem by default). Narrower, the aside follows the main column past one hairline. Each column is a stack one step apart, and the aside is a complementary landmark named by `asideLabel`.
214
+
215
+ **`EmptyState` takes `size="inline"`**: one left-aligned row on a dashed hairline, the sentence beside its one action and no glyph, for a part of a page that is empty while the rest of it is not.
216
+
217
+ ## Changes in 0.44.0
218
+
219
+ The pieces of the engine's Company › Integrations home, a summary of what a company has in use beside the directory of everything it could.
220
+
221
+ **`DirectoryList` lines stand at the rail's row step**: each line is exactly `--size-nav-row` (30px) in the rail's compact type, its mark at the glyph step (16px, `md`), its `hint` inline after the label in the quiet ink, giving way before the label in a narrow column, and its state held inside the row, so no line stands taller than the rest. Groups stand one small step (`--spacing-3`) apart.
222
+
223
+ **`CatalogTile` takes `density="compact"`**, a summary's tile at about half the height: the mark, the name, its state, its fact (`meta`) and the one action on the header line, and the sentence on one line under it, cut to fit with the whole of it in its title. The default, `comfortable`, is unchanged.
224
+
225
+ **`Section` takes `spacing="tight"`**: one small step (`--spacing-2`) between a heading and what it introduces, titled or not. A heading may carry the kit's `Count` of what is under it (`title={<>In use <Count value={4} /></>}`).
226
+
207
227
  ## Changes in 0.43.0
208
228
 
209
229
  The parts of the engine's Company › Integrations page, a directory of everything a company works in beside the detail of the one chosen.
@@ -1,4 +1,4 @@
1
- export { ACCESS_DENIED_REASONS, AccessDeniedCard } from '../chunk-KV3ODJXH.js';
2
- import '../chunk-RA2ULG6H.js';
1
+ export { ACCESS_DENIED_REASONS, AccessDeniedCard } from '../chunk-QTMUKRTN.js';
2
+ import '../chunk-PPUR46MK.js';
3
3
  import '../chunk-PQADV6P6.js';
4
4
  import '../chunk-ODEQTPFM.js';
@@ -1,6 +1,6 @@
1
- export { AGENT_HANDOFF_LABELS, AgentHandoffPanel } from '../chunk-BO7Q6JP6.js';
1
+ export { AGENT_HANDOFF_LABELS, AgentHandoffPanel } from '../chunk-N3SHQ3VU.js';
2
2
  import '../chunk-AUQPBL4O.js';
3
- import '../chunk-3TFDQLW3.js';
3
+ import '../chunk-JQ7IFSF6.js';
4
4
  import '../chunk-OGXHZHRX.js';
5
5
  import '../chunk-7CXGSS7D.js';
6
6
  import '../chunk-NBDN5JZV.js';
@@ -1,5 +1,5 @@
1
- export { ArrangeFrame, useGridResize } from '../chunk-LKBZV5IT.js';
2
- import '../chunk-LACA4JGC.js';
1
+ export { ArrangeFrame, useGridResize } from '../chunk-VWYT3GVV.js';
3
2
  import '../chunk-RSAQOKH3.js';
3
+ import '../chunk-LACA4JGC.js';
4
4
  import '../chunk-BZFWDIV6.js';
5
5
  import '../chunk-ODEQTPFM.js';
@@ -4,8 +4,8 @@ import '../chunk-XJ2QEBMM.js';
4
4
  import '../chunk-EY7LACIR.js';
5
5
  import '../chunk-ZI5G5RS7.js';
6
6
  import '../chunk-PQADV6P6.js';
7
+ import '../chunk-RSAQOKH3.js';
7
8
  import '../chunk-LACA4JGC.js';
8
9
  import '../chunk-NUZHC6MM.js';
9
- import '../chunk-RSAQOKH3.js';
10
10
  import '../chunk-BZFWDIV6.js';
11
11
  import '../chunk-ODEQTPFM.js';
@@ -1,13 +1,13 @@
1
- export { ArtifactCard, ArtifactCardSkeleton, ArtifactPreviewGlyph } from '../chunk-U2XAJONO.js';
1
+ export { ArtifactCard, ArtifactCardSkeleton, ArtifactPreviewGlyph } from '../chunk-OKE5YSLD.js';
2
2
  import '../chunk-TEUQWOWZ.js';
3
3
  import '../chunk-CI3VPIJN.js';
4
4
  import '../chunk-3CZ7XAVY.js';
5
5
  import '../chunk-EUCC37WY.js';
6
+ import '../chunk-5AQBPHZD.js';
7
+ import '../chunk-PZKHBB7D.js';
6
8
  import '../chunk-UBZDYOCA.js';
7
9
  import '../chunk-INHXF2CL.js';
8
10
  import '../chunk-AV2DXAEL.js';
9
- import '../chunk-5AQBPHZD.js';
10
- import '../chunk-PZKHBB7D.js';
11
11
  import '../chunk-BGLKLXL3.js';
12
12
  export { ARTIFACT_KINDS, ArtifactKindGlyph } from '../chunk-CE2THTQR.js';
13
13
  import '../chunk-BHHIIK3M.js';
@@ -0,0 +1,24 @@
1
+ import type { HTMLAttributes, ReactNode } from 'react';
2
+ export interface AsideLayoutProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {
3
+ /** The page's main column: what the page is about. */
4
+ children: ReactNode;
5
+ /** The column beside it: facts about the subject, how it is used, related places. */
6
+ aside: ReactNode;
7
+ /** What the aside is, for a screen reader's landmark: "About the company". */
8
+ asideLabel: string;
9
+ }
10
+ /**
11
+ * A page's main column with an aside beside it, each a stack of blocks one
12
+ * page step apart.
13
+ *
14
+ * THE COLUMNS FOLLOW THE ROOM THE PAGE HAS, NOT THE WINDOW. It is a container
15
+ * query on its own width, because a page beside a navigation rail is narrow
16
+ * on a wide screen too: from 56rem the aside stands beside the main column at
17
+ * `--crewlet-aside-layout-aside` (18rem by default), and below that it
18
+ * follows the main column under one hairline, so a phone reads the subject
19
+ * first and its facts after it.
20
+ *
21
+ * THE ASIDE IS A COMPLEMENTARY LANDMARK named by `asideLabel`, so a screen
22
+ * reader can skip to it or past it.
23
+ */
24
+ export declare function AsideLayout({ children, aside, asideLabel, className, ...rest }: AsideLayoutProps): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import './AsideLayout.css';
2
+ export { AsideLayout } from './AsideLayout.js';
3
+ export type { AsideLayoutProps } from './AsideLayout.js';
@@ -0,0 +1,2 @@
1
+ export { AsideLayout } from '../chunk-KY65C4XS.js';
2
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,45 @@
1
+ /*
2
+ * AsideLayout: a main column with an aside beside it from 56rem of its own
3
+ * width, and after it below that (AsideLayout.tsx).
4
+ */
5
+
6
+ .crewlet-aside-layout {
7
+ container-type: inline-size;
8
+ min-width: 0;
9
+ }
10
+
11
+ .crewlet-aside-layout__columns {
12
+ display: grid;
13
+ grid-template-columns: minmax(0, 1fr);
14
+ align-items: start;
15
+ gap: var(--spacing-7);
16
+ }
17
+
18
+ /* EACH COLUMN IS A STACK one step apart, so the blocks in it stand apart
19
+ evenly without each carrying a margin of its own. */
20
+ .crewlet-aside-layout__main,
21
+ .crewlet-aside-layout__aside {
22
+ display: flex;
23
+ flex-direction: column;
24
+ gap: var(--spacing-6);
25
+ min-width: 0;
26
+ }
27
+
28
+ /* FOLLOWING THE MAIN COLUMN, the aside is set off by one hairline, so its
29
+ facts read as about the page rather than as more of it. */
30
+ .crewlet-aside-layout__aside {
31
+ padding-top: var(--spacing-6);
32
+ border-top: 1px solid var(--color-border-default);
33
+ }
34
+
35
+ @container (min-width: 56rem) {
36
+ .crewlet-aside-layout__columns {
37
+ grid-template-columns: minmax(0, 1fr) var(--crewlet-aside-layout-aside, 18rem);
38
+ gap: var(--spacing-8);
39
+ }
40
+
41
+ .crewlet-aside-layout__aside {
42
+ padding-top: 0;
43
+ border-top: 0;
44
+ }
45
+ }
@@ -1,13 +1,13 @@
1
- export { AvatarPicker } from '../chunk-PLLYOPS4.js';
1
+ export { AvatarPicker } from '../chunk-Q7HLZH32.js';
2
2
  import '../chunk-QOP7QYUW.js';
3
3
  import '../chunk-KHJIEPZV.js';
4
4
  import '../chunk-AYKXMIOR.js';
5
- import '../chunk-VZICPYGR.js';
6
- import '../chunk-PZKHBB7D.js';
5
+ import '../chunk-SNQRGH4A.js';
7
6
  import '../chunk-BF5WV7NM.js';
8
7
  import '../chunk-KA75QPFM.js';
9
8
  import '../chunk-WIATRXEJ.js';
10
9
  import '../chunk-EGMQURBR.js';
10
+ import '../chunk-PZKHBB7D.js';
11
11
  import '../chunk-BHHIIK3M.js';
12
12
  import '../chunk-PCI7ZJ6Z.js';
13
13
  import '../chunk-OMV5W53A.js';
@@ -1,6 +1,15 @@
1
1
  import { type HTMLAttributes, type ReactNode } from 'react';
2
2
  import { type HeadingLevel } from '../utils/headingLevel.js';
3
3
  export type CatalogTileElement = 'article' | 'li' | 'div';
4
+ /**
5
+ * How much room a tile takes. `comfortable` (the default) is the catalogue's
6
+ * tile: a mark well, a name with its state under it, a reserved two-line
7
+ * sentence and a ruled foot. `compact` is a summary's: one header line (the
8
+ * mark, the name, its state and the fact, then the action at its end) over
9
+ * one line of sentence, about half the height, for a page that lists what is
10
+ * already in use rather than offers a choice.
11
+ */
12
+ export type CatalogTileDensity = 'comfortable' | 'compact';
4
13
  export interface CatalogTileProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {
5
14
  /** The element the tile is: an `li` in a `TileGrid as="ul"`. */
6
15
  as?: CatalogTileElement | undefined;
@@ -33,6 +42,8 @@ export interface CatalogTileProps extends Omit<HTMLAttributes<HTMLElement>, 'tit
33
42
  * strength, because a tile not yet set up is the one a reader came to set up.
34
43
  */
35
44
  quiet?: boolean | undefined;
45
+ /** How much room the tile takes; see [CatalogTileDensity]. */
46
+ density?: CatalogTileDensity | undefined;
36
47
  }
37
48
  /**
38
49
  * One entry in a catalogue: its mark, its name, its state when it has one, a
@@ -44,4 +55,4 @@ export interface CatalogTileProps extends Omit<HTMLAttributes<HTMLElement>, 'tit
44
55
  * action draws no foot at all, since a rule with nothing under it reads as a
45
56
  * missing control.
46
57
  */
47
- export declare function CatalogTile({ as: Element, mark, title, headingLevel, status, description, meta, action, quiet, className, ...rest }: CatalogTileProps): import("react").JSX.Element;
58
+ export declare function CatalogTile({ as: Element, mark, title, headingLevel, status, description, meta, action, quiet, density, className, ...rest }: CatalogTileProps): import("react").JSX.Element;
@@ -1,3 +1,3 @@
1
1
  import './CatalogTile.css';
2
2
  export { CatalogTile } from './CatalogTile.js';
3
- export type { CatalogTileElement, CatalogTileProps } from './CatalogTile.js';
3
+ export type { CatalogTileDensity, CatalogTileElement, CatalogTileProps } from './CatalogTile.js';
@@ -1,3 +1,3 @@
1
- export { CatalogTile } from '../chunk-PCT47E7O.js';
1
+ export { CatalogTile } from '../chunk-5GNA4RKP.js';
2
2
  import '../chunk-PQADV6P6.js';
3
3
  import '../chunk-ODEQTPFM.js';
@@ -133,3 +133,58 @@
133
133
  min-height: 0;
134
134
  }
135
135
  }
136
+
137
+ /*
138
+ * COMPACT: a summary's tile, about half the comfortable one's height. One
139
+ * header line holds the mark (the row step's well, 28px), the name, its state
140
+ * and its fact, and the action at the end; the sentence is one line under it,
141
+ * aligned to the name, cut to fit. No reserve and no foot, because a summary
142
+ * has no row of feet to line up.
143
+ */
144
+ .crewlet-catalog-tile--compact {
145
+ gap: var(--spacing-1);
146
+ padding: var(--spacing-3);
147
+ }
148
+
149
+ .crewlet-catalog-tile--compact .crewlet-catalog-tile__head {
150
+ align-items: center;
151
+ gap: var(--spacing-2);
152
+ }
153
+
154
+ .crewlet-catalog-tile--compact .crewlet-catalog-tile__mark {
155
+ width: var(--size-row-sm);
156
+ height: var(--size-row-sm);
157
+ }
158
+
159
+ .crewlet-catalog-tile--compact .crewlet-catalog-tile__title {
160
+ flex: 1 1 auto;
161
+ flex-direction: row;
162
+ align-items: center;
163
+ gap: var(--spacing-2);
164
+ padding-top: 0;
165
+ }
166
+
167
+ .crewlet-catalog-tile--compact .crewlet-catalog-tile__name {
168
+ flex: 0 1 auto;
169
+ min-width: 0;
170
+ overflow: hidden;
171
+ text-overflow: ellipsis;
172
+ white-space: nowrap;
173
+ }
174
+
175
+ .crewlet-catalog-tile--compact .crewlet-catalog-tile__status {
176
+ flex: none;
177
+ }
178
+
179
+ .crewlet-catalog-tile--compact .crewlet-catalog-tile__meta {
180
+ flex: 0 1 auto;
181
+ }
182
+
183
+ .crewlet-catalog-tile--compact .crewlet-catalog-tile__description {
184
+ flex: none;
185
+ min-height: 0;
186
+ padding-left: calc(var(--size-row-sm) + var(--spacing-2));
187
+ overflow: hidden;
188
+ text-overflow: ellipsis;
189
+ white-space: nowrap;
190
+ }
@@ -1,5 +1,5 @@
1
1
  import '../chunk-3L5NHASN.js';
2
- export { CHARACTER_PICKER_COLUMNS, CharacterPicker } from '../chunk-VZICPYGR.js';
3
- import '../chunk-PZKHBB7D.js';
2
+ export { CHARACTER_PICKER_COLUMNS, CharacterPicker } from '../chunk-SNQRGH4A.js';
4
3
  import '../chunk-EGMQURBR.js';
4
+ import '../chunk-PZKHBB7D.js';
5
5
  import '../chunk-ODEQTPFM.js';
@@ -1,5 +1,5 @@
1
- export { ChooserList, ColumnChooser, DataGrid, columnChoicesOf, fitGridColumns, parseGridSort } from '../chunk-XIDD7PJO.js';
2
- import '../chunk-RA2ULG6H.js';
1
+ export { ChooserList, ColumnChooser, DataGrid, columnChoicesOf, fitGridColumns, parseGridSort } from '../chunk-2MYSESZF.js';
2
+ import '../chunk-PPUR46MK.js';
3
3
  import '../chunk-PQADV6P6.js';
4
4
  import '../chunk-RTPQDNW3.js';
5
5
  import '../chunk-OG6CL3EB.js';
@@ -1,14 +1,14 @@
1
- export { DATA_VIEW_TOOLBAR_LABELS, DataView, DataViewToolbar, FILTER_AXIS_LABELS, FilterAxisBar, FilterAxisChip, applyColumnFilters, applyFilters, blankFilterValue, defaultOperator, filterDefsFromColumns, filterHasValue, filterPredicate, formatFilterValue, operatorOf, tableColumns } from '../chunk-NCM73C34.js';
1
+ export { DATA_VIEW_TOOLBAR_LABELS, DataView, DataViewToolbar, FILTER_AXIS_LABELS, FilterAxisBar, FilterAxisChip, applyColumnFilters, applyFilters, blankFilterValue, defaultOperator, filterDefsFromColumns, filterHasValue, filterPredicate, formatFilterValue, operatorOf, tableColumns } from '../chunk-Y4GXCKOC.js';
2
2
  import '../chunk-HOXGBLEY.js';
3
- import '../chunk-GI3S6RMM.js';
4
3
  import '../chunk-UFXLNC2N.js';
4
+ import '../chunk-GI3S6RMM.js';
5
5
  import '../chunk-STJ7QBC3.js';
6
6
  import '../chunk-DTIW4CHZ.js';
7
7
  import '../chunk-FYINAYAJ.js';
8
8
  import '../chunk-7KHM2FZH.js';
9
+ import '../chunk-NR4CPM4T.js';
9
10
  import '../chunk-KHJIEPZV.js';
10
11
  import '../chunk-GXQ3B46I.js';
11
- import '../chunk-NR4CPM4T.js';
12
12
  import '../chunk-EY7LACIR.js';
13
13
  import '../chunk-3CZ7XAVY.js';
14
14
  import '../chunk-EUCC37WY.js';
@@ -1,8 +1,8 @@
1
1
  export { DATASET_SOURCE_KINDS, DatasetSource, DatasetSourceList } from '../chunk-HQJ24WPM.js';
2
2
  import '../chunk-KYIAFNU7.js';
3
+ import '../chunk-WIATRXEJ.js';
3
4
  import '../chunk-3CZ7XAVY.js';
4
5
  import '../chunk-EUCC37WY.js';
5
- import '../chunk-WIATRXEJ.js';
6
6
  import '../chunk-2YTOOH3A.js';
7
7
  import '../chunk-BZFWDIV6.js';
8
8
  import '../chunk-ODEQTPFM.js';
@@ -5,10 +5,13 @@ export interface DirectoryItem {
5
5
  key: string;
6
6
  /** Where the line goes: the item's own page. */
7
7
  href: string;
8
- /** The item's mark: a vendor's, a product's. Decorative, since the label names it. */
8
+ /**
9
+ * The item's mark: a vendor's, a product's, at the glyph step (16px, `md`).
10
+ * Decorative, since the label names it.
11
+ */
9
12
  mark?: ReactNode;
10
13
  label: ReactNode;
11
- /** A quieter line under the label: the app a product belongs to. */
14
+ /** A quieter word after the label, on its line: the app a product belongs to. */
12
15
  hint?: ReactNode;
13
16
  /** The item's state where it has one: a status dot and word, or a pill. */
14
17
  status?: ReactNode;
@@ -43,8 +46,10 @@ export interface DirectoryListProps {
43
46
  * A NAVIGATION LANDMARK of lists under headings, so a screen reader can jump
44
47
  * group to group and is told how many lines each holds. The chosen line is
45
48
  * `aria-current="page"` and drawn on the selected ground. A line carries its
46
- * mark, its label (and a quieter hint under it) and its state where it has
47
- * one; a line with no state says nothing rather than "none".
49
+ * mark, its label (and a quieter hint after it) and its state where it has
50
+ * one; a line with no state says nothing rather than "none". A LINE STANDS
51
+ * AT THE RAIL'S ROW STEP (30px), in the rail's compact type, because a
52
+ * directory is navigation beside the page as the rail is beside the app.
48
53
  *
49
54
  * IT FILLS THE HEIGHT IT IS GIVEN. The groups take the room and scroll on
50
55
  * their own when they outgrow it, and the foot holds the bottom, one small
@@ -1,3 +1,3 @@
1
- export { DirectoryList } from '../chunk-SJ6DMG4R.js';
1
+ export { DirectoryList } from '../chunk-4AA6WPQU.js';
2
2
  import '../chunk-PQADV6P6.js';
3
3
  import '../chunk-ODEQTPFM.js';
@@ -22,7 +22,9 @@
22
22
  display: flex;
23
23
  flex: 1 1 auto;
24
24
  flex-direction: column;
25
- gap: var(--spacing-5);
25
+ /* One small step between groups, so a heading reads as the head of the lines
26
+ under it rather than a band between two runs of them. */
27
+ gap: var(--spacing-3);
26
28
  min-height: 0;
27
29
  overflow-y: auto;
28
30
  }
@@ -53,16 +55,24 @@
53
55
  list-style: none;
54
56
  }
55
57
 
58
+ /*
59
+ * THE RAIL'S ROW STEP, 30px (--size-nav-row): a directory is navigation beside
60
+ * the page as the rail is beside the app, so its lines stand at the rail's
61
+ * height and in its compact type. Everything a line says fits that one line:
62
+ * a mark the size of the rail's glyph box, the hint inline after the label,
63
+ * and the state compact at the end.
64
+ */
56
65
  .crewlet-directory__item {
57
66
  display: grid;
58
67
  grid-template-columns: auto minmax(0, 1fr) auto;
59
68
  align-items: center;
60
69
  gap: var(--spacing-2);
61
- min-height: var(--size-row-md);
62
- padding: var(--spacing-1) var(--spacing-2);
70
+ height: var(--size-nav-row);
71
+ padding: 0 var(--spacing-2);
63
72
  border-radius: var(--radius-md);
64
73
  color: var(--color-text-primary);
65
- font-size: var(--font-size-sm);
74
+ font-size: var(--font-size-compact);
75
+ line-height: var(--font-line-height-tight);
66
76
  text-decoration: none;
67
77
  }
68
78
 
@@ -80,22 +90,28 @@
80
90
  outline-offset: 1px;
81
91
  }
82
92
 
93
+ /* The box takes its mark, as the rail's glyph box does: a mark at the glyph's
94
+ own step (16px, `md`) sits in the row with room to spare. */
83
95
  .crewlet-directory__mark {
84
96
  display: inline-flex;
85
97
  flex: none;
86
98
  align-items: center;
87
99
  justify-content: center;
88
- width: var(--size-row-sm);
89
- height: var(--size-row-sm);
90
100
  }
91
101
 
102
+ /* ONE LINE: the label, then the hint after it in the quiet ink. The hint gives
103
+ way first, so a narrow column cuts "Atlassian" before it cuts "Confluence". */
92
104
  .crewlet-directory__text {
93
105
  display: flex;
94
- flex-direction: column;
106
+ align-items: baseline;
107
+ gap: var(--spacing-1);
95
108
  min-width: 0;
96
109
  }
97
110
 
98
111
  .crewlet-directory__label {
112
+ flex: 0 0 auto;
113
+ max-width: 100%;
114
+ min-width: 0;
99
115
  overflow: hidden;
100
116
  font-weight: var(--font-weight-medium);
101
117
  text-overflow: ellipsis;
@@ -103,6 +119,8 @@
103
119
  }
104
120
 
105
121
  .crewlet-directory__hint {
122
+ flex: 0 1 auto;
123
+ min-width: 0;
106
124
  overflow: hidden;
107
125
  font-size: var(--font-size-xs);
108
126
  color: var(--color-text-tertiary);
@@ -110,10 +128,15 @@
110
128
  white-space: nowrap;
111
129
  }
112
130
 
131
+ /* THE STATE IS COMPACT: a pill or a dot and its word in the small step, held
132
+ inside the row so a state never makes one line taller than the rest. */
113
133
  .crewlet-directory__status {
114
134
  display: inline-flex;
115
135
  flex: none;
136
+ align-items: center;
137
+ max-height: calc(var(--size-nav-row) - var(--spacing-2));
116
138
  font-size: var(--font-size-xs);
139
+ line-height: 1;
117
140
  color: var(--color-text-secondary);
118
141
  }
119
142
 
@@ -2,12 +2,12 @@ export { DOC_TABS_EDITOR_LABELS, DocTabsEditor } from '../chunk-W53CWWX3.js';
2
2
  import '../chunk-XJ2QEBMM.js';
3
3
  import '../chunk-ZI5G5RS7.js';
4
4
  import '../chunk-PQADV6P6.js';
5
+ import '../chunk-RSAQOKH3.js';
5
6
  import '../chunk-PCI7ZJ6Z.js';
6
7
  import '../chunk-OMV5W53A.js';
7
8
  import '../chunk-H5XTJ7GJ.js';
8
9
  import '../chunk-OG6CL3EB.js';
9
10
  import '../chunk-LACA4JGC.js';
10
11
  import '../chunk-NUZHC6MM.js';
11
- import '../chunk-RSAQOKH3.js';
12
12
  import '../chunk-BZFWDIV6.js';
13
13
  import '../chunk-ODEQTPFM.js';
@@ -1,6 +1,13 @@
1
1
  import type { HTMLAttributes, ReactNode } from 'react';
2
2
  import { type HeadingLevel } from '../utils/headingLevel.js';
3
- export type EmptyStateSize = 'default' | 'compact';
3
+ /**
4
+ * `default` is a screen's, `compact` a panel's, both centred under a glyph.
5
+ * `inline` is a field's or a section's: one left-aligned row on a dashed
6
+ * hairline, the sentence beside its one action and no glyph, for a part of a
7
+ * page that is empty while the rest of it is not (a mission nobody has
8
+ * written, a list with nothing in it yet).
9
+ */
10
+ export type EmptyStateSize = 'default' | 'compact' | 'inline';
4
11
  export interface EmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {
5
12
  /** A glyph, drawn large and quiet. Replaced by `illustration` when both are given. */
6
13
  icon?: ReactNode;
@@ -17,7 +24,7 @@ export interface EmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, 't
17
24
  description: ReactNode;
18
25
  /** What would fill it, as a control: "Create the first seat", "Connect Slack". */
19
26
  action?: ReactNode;
20
- /** `compact` is for an empty state inside a panel rather than a screen. */
27
+ /** How much room it takes; see [EmptyStateSize]. */
21
28
  size?: EmptyStateSize | undefined;
22
29
  /**
23
30
  * The heading level of the title. Taken from where the component finds
@@ -1,3 +1,3 @@
1
- export { EmptyState } from '../chunk-RA2ULG6H.js';
1
+ export { EmptyState } from '../chunk-PPUR46MK.js';
2
2
  import '../chunk-PQADV6P6.js';
3
3
  import '../chunk-ODEQTPFM.js';
@@ -71,3 +71,37 @@
71
71
  .crewlet-empty-state__action {
72
72
  margin-top: var(--spacing-2);
73
73
  }
74
+
75
+ /*
76
+ * INLINE: one left-aligned row on a dashed hairline, the sentence beside its
77
+ * action. The dash says "nothing here yet" without a glyph, and the box keeps
78
+ * the place the content will take, so the page does not move when it is
79
+ * filled. Narrow, the action wraps under the words.
80
+ */
81
+ .crewlet-empty-state--inline {
82
+ flex-direction: row;
83
+ flex-wrap: wrap;
84
+ justify-content: space-between;
85
+ gap: var(--spacing-2) var(--spacing-4);
86
+ padding: var(--spacing-3) var(--spacing-4);
87
+ border: 1px dashed var(--color-border-default);
88
+ border-radius: var(--radius-md);
89
+ text-align: start;
90
+ }
91
+
92
+ .crewlet-empty-state__text {
93
+ display: flex;
94
+ flex: 1 1 16rem;
95
+ flex-direction: column;
96
+ gap: var(--spacing-1);
97
+ min-width: 0;
98
+ }
99
+
100
+ .crewlet-empty-state--inline .crewlet-empty-state__description {
101
+ max-width: var(--size-measure);
102
+ }
103
+
104
+ .crewlet-empty-state--inline .crewlet-empty-state__action {
105
+ flex: none;
106
+ margin-top: 0;
107
+ }
@@ -1,6 +1,6 @@
1
- export { LinkInterstitial, openExternal } from '../chunk-UAGDFEBG.js';
2
- import '../chunk-FYINAYAJ.js';
1
+ export { LinkInterstitial, openExternal } from '../chunk-KKUJSMLF.js';
3
2
  import '../chunk-5CLW2CXT.js';
3
+ import '../chunk-FYINAYAJ.js';
4
4
  import '../chunk-SZZRIHGT.js';
5
5
  import '../chunk-PQADV6P6.js';
6
6
  import '../chunk-OMV5W53A.js';
@@ -1,11 +1,11 @@
1
- export { ListInput } from '../chunk-Z5WMCBHR.js';
1
+ export { ListInput } from '../chunk-NMYGJJJK.js';
2
2
  import '../chunk-ZI5G5RS7.js';
3
3
  import '../chunk-SMBKXWML.js';
4
4
  import '../chunk-PQADV6P6.js';
5
+ import '../chunk-RSAQOKH3.js';
5
6
  import '../chunk-OMV5W53A.js';
6
7
  import '../chunk-H5XTJ7GJ.js';
7
8
  import '../chunk-LACA4JGC.js';
8
9
  import '../chunk-NUZHC6MM.js';
9
- import '../chunk-RSAQOKH3.js';
10
10
  import '../chunk-BZFWDIV6.js';
11
11
  import '../chunk-ODEQTPFM.js';
@@ -9,6 +9,12 @@ export type SectionSpacing =
9
9
  * marketing band between each pair of panels puts one panel per viewport.
10
10
  */
11
11
  | 'compact'
12
+ /**
13
+ * The console band at its tightest: one small step between the heading and
14
+ * what it introduces, for a summary whose sections stand close, as a list's
15
+ * group headings do.
16
+ */
17
+ | 'tight'
12
18
  /** A marketing band. State one: a page of them is a deliberate page. */
13
19
  | 'sm' | 'md' | 'lg';
14
20
  export type SectionElement = 'section' | 'div' | 'header' | 'footer' | 'article';
@@ -1,3 +1,3 @@
1
- export { Section } from '../chunk-3TFDQLW3.js';
1
+ export { Section } from '../chunk-JQ7IFSF6.js';
2
2
  import '../chunk-PQADV6P6.js';
3
3
  import '../chunk-ODEQTPFM.js';
@@ -23,6 +23,14 @@
23
23
  padding-block: 0;
24
24
  }
25
25
 
26
+ /* The console band at its tightest: a group heading's step to what it names. */
27
+ .crewlet-section--tight {
28
+ display: flex;
29
+ flex-direction: column;
30
+ gap: var(--spacing-2);
31
+ padding-block: 0;
32
+ }
33
+
26
34
  .crewlet-section--sm {
27
35
  padding-block: var(--spacing-9);
28
36
  }
@@ -106,6 +114,12 @@
106
114
  gap: var(--spacing-3);
107
115
  }
108
116
 
117
+ /* A tight band keeps its one small step with a title too: the titled column's
118
+ gap would otherwise win, being later in the sheet. */
119
+ .crewlet-section--tight.crewlet-section--titled {
120
+ gap: var(--spacing-2);
121
+ }
122
+
109
123
  @media (max-width: 768px) {
110
124
  .crewlet-section--sm {
111
125
  padding-block: var(--spacing-7);