@crewlethq/ui 0.36.0 → 0.37.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 (55) hide show
  1. package/README.md +17 -1
  2. package/dist/AgentHandoffPanel/index.js +1 -1
  3. package/dist/ArtifactAccess/ArtifactAccess.d.ts +40 -0
  4. package/dist/ArtifactAccess/index.d.ts +3 -0
  5. package/dist/ArtifactAccess/index.js +2 -0
  6. package/dist/ArtifactAccess-Y53ZTRFS.css +31 -0
  7. package/dist/ArtifactCard/ArtifactCard.d.ts +1 -6
  8. package/dist/ArtifactCard/index.d.ts +2 -1
  9. package/dist/ArtifactCard/index.js +3 -2
  10. package/dist/ArtifactKindIllustration/ArtifactKindIllustration.d.ts +1 -1
  11. package/dist/ArtifactKindIllustration/index.js +1 -1
  12. package/dist/{ArtifactKindIllustration-5KTP43QS.css → ArtifactKindIllustration-KLFL7KBG.css} +1 -1
  13. package/dist/ArtifactMakeRow/index.js +1 -1
  14. package/dist/{ArtifactMakeRow-RWUTS5MC.css → ArtifactMakeRow-XBA2MPSY.css} +1 -1
  15. package/dist/ArtifactNameCell/ArtifactNameCell.d.ts +37 -0
  16. package/dist/ArtifactNameCell/index.d.ts +4 -0
  17. package/dist/ArtifactNameCell/index.js +4 -0
  18. package/dist/ArtifactNameCell-RTVP4LO4.css +104 -0
  19. package/dist/CommandPalette/index.js +1 -1
  20. package/dist/CommentThread/index.js +3 -3
  21. package/dist/Composer/index.js +1 -1
  22. package/dist/DataTable/index.js +2 -2
  23. package/dist/DataView/index.js +5 -5
  24. package/dist/DocTabsEditor/index.js +1 -1
  25. package/dist/ListInput/index.js +3 -3
  26. package/dist/LivePreview/LivePreview.d.ts +15 -3
  27. package/dist/LivePreview/index.d.ts +2 -2
  28. package/dist/LivePreview/index.js +1 -1
  29. package/dist/PresenterView/index.js +2 -2
  30. package/dist/ShareDialog/index.js +3 -3
  31. package/dist/SheetColumnEditor/index.js +1 -1
  32. package/dist/SheetGrid/index.js +1 -1
  33. package/dist/SlideFilmstrip/index.js +1 -1
  34. package/dist/Switcher/index.js +2 -2
  35. package/dist/TagsInput/index.js +2 -2
  36. package/dist/chunk-BGLKLXL3.js +29 -0
  37. package/dist/{chunk-66ADEPFB.js → chunk-EAKC24BW.js} +1 -1
  38. package/dist/{chunk-ES4RKQ7B.js → chunk-GS7ZTHPF.js} +1 -1
  39. package/dist/{chunk-OSZDHN5Z.js → chunk-OHA6WSAG.js} +5 -10
  40. package/dist/chunk-P5VGSVWG.js +39 -0
  41. package/dist/{chunk-MJW6SQYB.js → chunk-UBZDYOCA.js} +1 -1
  42. package/dist/{chunk-XGBLRDSU.js → chunk-WYKWXRJ4.js} +16 -6
  43. package/dist/generated/index.d.ts +2 -0
  44. package/dist/generated/index.js +43 -41
  45. package/dist/index.js +43 -41
  46. package/dist/styles.css +145 -4
  47. package/package.json +3 -3
  48. package/dist/{chunk-WNAYQQ6Y.js → chunk-44WJLPQS.js} +1 -1
  49. package/dist/{chunk-MRMHZ437.js → chunk-66NGUD5S.js} +1 -1
  50. package/dist/{chunk-3PTUDKSR.js → chunk-AOLCZDZ6.js} +1 -1
  51. package/dist/{chunk-IQH3DDZ2.js → chunk-BIQDJOJZ.js} +1 -1
  52. package/dist/{chunk-2DV4THNQ.js → chunk-EARDAJQY.js} +1 -1
  53. package/dist/{chunk-DEMALFHY.js → chunk-F23N4MVU.js} +1 -1
  54. package/dist/{chunk-XMRTFPWX.js → chunk-JML75PGJ.js} +1 -1
  55. /package/dist/{chunk-5BP6IS3N.js → chunk-PNNYVN52.js} +0 -0
package/README.md CHANGED
@@ -54,7 +54,7 @@ import { Button } from '@crewlethq/ui/Button'; // 8 KB of CSS, not 182 KB
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`, `AppShell.Topbar`, `AppShell.AccountRow` and `useAppShell`, `AuthLayout`, `SidebarNav` and `NavItem`, `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 |
57
- | Artifacts | `SandboxedFrame` (with `SandboxedFramePlaceholder` and `SandboxedFrameNotice`), `LinkInterstitial` and `openExternal`, `VersionTimeline`, `ShareDialog` with the role ladder (`ARTIFACT_ROLES`, `SHAREABLE_ROLES`, `roleAtLeast`), `PrincipalPicker`, `Principal` and `PrincipalAvatar`, `ArtifactCard`, `ArtifactKindGlyph` and `ArtifactPreviewGlyph` (the preview a card draws with no cover, for a cover with nothing to draw), `ArtifactBar` and `ArtifactVersionChip` (an open artifact's one slim bar), `ArtifactPanel` and `ArtifactWorkspace` (the panels it opens beside or over the artifact), `CanvasBoard` (a design's artboards and notes on a `Canvas`, with the visibility budget `liveBoards`), `CanvasToolbar` (a canvas's tool palette, with `toolForKey`), `LayersList` (the list of a canvas's items beside it, marked by the canvas's selection), `CanvasSchematic` (a design's cover, drawn from its boards' frames), `AccessDeniedCard`, `ArtifactIcon` (with `artifactIconGlyph` and `ARTIFACT_ICON_WORDS`), the native gallery covers (`DocCover`, `SheetCover`, `DashboardCover`), `MergeConflicts`, the dashboard pieces (`WidgetFrame`, `DatasetSource` and `DatasetSourceList`), and `FrameProtocol` (the wire between a host page and an embedded artifact, with no React in it) |
57
+ | Artifacts | `SandboxedFrame` (with `SandboxedFramePlaceholder` and `SandboxedFrameNotice`), `LinkInterstitial` and `openExternal`, `VersionTimeline`, `ShareDialog` with the role ladder (`ARTIFACT_ROLES`, `SHAREABLE_ROLES`, `roleAtLeast`), `PrincipalPicker`, `Principal` and `PrincipalAvatar`, `ArtifactCard`, `ArtifactKindGlyph` and `ArtifactPreviewGlyph` (the preview a card draws with no cover, for a cover with nothing to draw), `ArtifactBar` and `ArtifactVersionChip` (an open artifact's one slim bar), `ArtifactPanel` and `ArtifactWorkspace` (the panels it opens beside or over the artifact), `CanvasBoard` (a design's artboards and notes on a `Canvas`, with the visibility budget `liveBoards`), `CanvasToolbar` (a canvas's tool palette, with `toolForKey`), `LayersList` (the list of a canvas's items beside it, marked by the canvas's selection), `CanvasSchematic` (a design's cover, drawn from its boards' frames), `AccessDeniedCard`, `ArtifactIcon` (with `artifactIconGlyph` and `ARTIFACT_ICON_WORDS`), the native gallery covers (`DocCover`, `SheetCover`, `DashboardCover`), `MergeConflicts`, the dashboard pieces (`WidgetFrame`, `DatasetSource` and `DatasetSourceList`), and `FrameProtocol` (the wire between a host page and an embedded artifact, with no React in it), `ArtifactNameCell` and `ArtifactAccessLabel` (with `ArtifactAccessGlyph`) for a list of artifacts |
58
58
  | Sheets | `SheetGrid`, the cells on their own (`CheckboxCell`, `TextCell`, `LongTextCell`, `NumberCell`, `SelectCell`, `MultiSelectCell`, `PersonCell`, `StatusCell`, `DateCell`, `UrlCell`, `RatingCell`, and `SheetCell` for any type), `ChangeMark`, and `SheetModel` (every rule a sheet is drawn from, with no React in it: values, parsing, the keyboard model, TSV, the pending edits of D23) |
59
59
  | Presence | `PresenceStack`, `PresenceRing` and `presenceHueClass`, `CursorFlag`, `LiveCursor`, `FollowBanner`, `PeopleRail` (with `peopleRailKey`), and `PresenceModel` (the roster order, one entry per person, the session hues from `PRESENCE_HUES`, with no React in it) |
60
60
  | Presentations | `SlideStage` (a slide laid out at 1920 by 1080 and scaled to its box, with `SLIDE_WIDTH` and `SLIDE_HEIGHT`), `useSlideKeys` (the keys a show and a clicker send), `SlideNav` (Previous, the position and Next, with `SLIDE_NAV_LABELS`), `SlideFilmstrip`, `SlideGrid`, `SlideCompare` (with `SLIDE_COMPARE_LABELS`), `PresenterView` (with `formatStopwatch`) |
@@ -204,6 +204,22 @@ 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.37.0
208
+
209
+ ### An artifact list with an identity
210
+
211
+ **`ArtifactNameCell` names an artifact in a list.** The kind's glyph on the kind's tint (the Make row's tile at a list's size, so a doc started from the tray is found in the list by the same mark in the same colour), the title, and under it the kind's word and the artifact's description (`detail`) on one quiet line, each cut on one line with the whole of it on hover. The kind is printed, so a list needs no Type column of its own. Under the pointer the row's ground moves and the mark's hairline takes the kind's hue; nothing lifts. `pinned` draws and says a pin, and `trashed` draws the mark without its tint. Every word is in `labels`.
212
+
213
+ **`ArtifactAccessLabel` says who can open an artifact** as its glyph and a word: Private, Shared or Company (`ARTIFACT_ACCESS_LABELS`), or the caller's own `label` and `title`. Access is a fact about reach, never a status, so it takes no colour: the word is a step stronger where others can open it. The glyphs are `ArtifactAccessGlyph`, which `ArtifactCard` now draws its access with too, and the `ArtifactAccess` type has moved to this module (the card's subpath still exports it).
214
+
215
+ ### Previews
216
+
217
+ **`PreviewScale` fills a box with `fit="fill"`.** The content covers the box edge to edge, centred across and held at the top, wherever that leaves at most a fifth of it outside the box (`PREVIEW_FILL_MAX_CUT`), and is contained whole otherwise. A design's laptop board (16:10) in a gallery card (16:9) was contained, which left an empty strip down each side of the card; filled, it reaches both sides and loses a tenth of its foot. A phone's board is still shown whole. `PreviewFit` names the three fits.
218
+
219
+ ### Wording
220
+
221
+ **The gallery's tray is "Start a new artifact"** in the stories, the tests and the notes on `ArtifactMakeRow` and `ArtifactKindTile`, where it was "Make something new".
222
+
207
223
  ## Changes in 0.36.0
208
224
 
209
225
  ### New on a create page and in the gallery
@@ -5,8 +5,8 @@ import '../chunk-MICH6QSJ.js';
5
5
  import '../chunk-RH2NCQBZ.js';
6
6
  import '../chunk-Y5BD4MTE.js';
7
7
  import '../chunk-IUYUS2SO.js';
8
- import '../chunk-SMBKXWML.js';
9
8
  import '../chunk-YSGLEHND.js';
9
+ import '../chunk-SMBKXWML.js';
10
10
  import '../chunk-FZVJDJFN.js';
11
11
  import '../chunk-BHHIIK3M.js';
12
12
  import '../chunk-PQADV6P6.js';
@@ -0,0 +1,40 @@
1
+ import { type GlyphSize } from '@crewlethq/icons/glyphs';
2
+ /**
3
+ * Who can open an artifact: only its owner (and those they shared it with by
4
+ * name, which the owner alone sees), people it is shared with, or the whole
5
+ * company.
6
+ */
7
+ export type ArtifactAccess = 'private' | 'shared' | 'company';
8
+ /** Every access, from the narrowest to the widest. */
9
+ export declare const ARTIFACT_ACCESSES: readonly ["private", "shared", "company"];
10
+ /**
11
+ * What each access is called where there is room for a word: a list's column,
12
+ * a card's hover text. Short, because a column of them is read down.
13
+ */
14
+ export declare const ARTIFACT_ACCESS_LABELS: Readonly<Record<ArtifactAccess, string>>;
15
+ /**
16
+ * The glyph an access is drawn with, wherever it is drawn: a lock, people or
17
+ * the company's building. Decorative: whatever draws it says the word too,
18
+ * printed or for assistive technology.
19
+ */
20
+ export declare function ArtifactAccessGlyph({ access, size }: {
21
+ access: ArtifactAccess;
22
+ size?: GlyphSize | undefined;
23
+ }): import("react").JSX.Element;
24
+ export interface ArtifactAccessLabelProps {
25
+ access: ArtifactAccess;
26
+ /** The word printed beside the glyph. The design system's short word by default. */
27
+ label?: string | undefined;
28
+ /** The hover text, where the word is not the whole story: "Shared with 3 people". */
29
+ title?: string | undefined;
30
+ className?: string | undefined;
31
+ }
32
+ /**
33
+ * Who can open an artifact, as a glyph and its word: a list's Access column.
34
+ *
35
+ * QUIET FOR PRIVATE, A STEP UP FOR SHARED. The glyph is the tertiary step,
36
+ * and an artifact others can open prints its word a step stronger than one
37
+ * nobody else sees, so a column read down picks out what is shared without
38
+ * a hue: access is a fact about reach, never a status, and takes no colour.
39
+ */
40
+ export declare function ArtifactAccessLabel({ access, label, title, className }: ArtifactAccessLabelProps): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import './ArtifactAccess.css';
2
+ export { ARTIFACT_ACCESSES, ARTIFACT_ACCESS_LABELS, ArtifactAccessGlyph, ArtifactAccessLabel } from './ArtifactAccess.js';
3
+ export type { ArtifactAccess, ArtifactAccessLabelProps } from './ArtifactAccess.js';
@@ -0,0 +1,2 @@
1
+ export { ARTIFACT_ACCESSES, ARTIFACT_ACCESS_LABELS, ArtifactAccessGlyph, ArtifactAccessLabel } from '../chunk-BGLKLXL3.js';
2
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,31 @@
1
+ /*
2
+ * An artifact's access as a glyph and its word. No colour of its own: the
3
+ * glyph is the tertiary step and the word the secondary, one step stronger
4
+ * where others can open it.
5
+ */
6
+
7
+ .crewlet-artifact-access {
8
+ display: inline-flex;
9
+ align-items: center;
10
+ gap: calc(var(--spacing-1) * 1.5);
11
+ min-width: 0;
12
+ max-width: 100%;
13
+ color: var(--color-text-tertiary);
14
+ }
15
+
16
+ .crewlet-artifact-access__glyph {
17
+ display: inline-flex;
18
+ flex: none;
19
+ }
20
+
21
+ .crewlet-artifact-access__word {
22
+ min-width: 0;
23
+ overflow: hidden;
24
+ text-overflow: ellipsis;
25
+ white-space: nowrap;
26
+ }
27
+
28
+ .crewlet-artifact-access--shared,
29
+ .crewlet-artifact-access--company {
30
+ color: var(--color-text-secondary);
31
+ }
@@ -1,4 +1,5 @@
1
1
  import { type ReactNode } from 'react';
2
+ import { type ArtifactAccess } from '../ArtifactAccess/index.js';
2
3
  import { type ArtifactKind } from '../ArtifactKindGlyph/index.js';
3
4
  import { type AvatarStackMember } from '../Avatar/index.js';
4
5
  import { type Principal } from '../Principal/index.js';
@@ -14,12 +15,6 @@ import { type TimeValue } from '../RelativeTime/index.js';
14
15
  export declare function ArtifactPreviewGlyph({ kind }: {
15
16
  kind: ArtifactKind;
16
17
  }): import("react").JSX.Element;
17
- /**
18
- * Who can open an artifact, as its card says it: only its owner (and those
19
- * they shared it with by name, which the owner alone sees), people it is
20
- * shared with, or the whole company.
21
- */
22
- export type ArtifactAccess = 'private' | 'shared' | 'company';
23
18
  export type ArtifactCardSize = 'card' | 'compact';
24
19
  export interface ArtifactCardLabels {
25
20
  kinds: Record<ArtifactKind, string>;
@@ -1,6 +1,7 @@
1
1
  import '../ArtifactKindIllustration/ArtifactKinds.css';
2
2
  import './ArtifactCard.css';
3
3
  export { ArtifactCard, ArtifactCardSkeleton, ArtifactPreviewGlyph } from './ArtifactCard.js';
4
- export type { ArtifactAccess, ArtifactCardLabels, ArtifactCardProps, ArtifactCardSize } from './ArtifactCard.js';
4
+ export type { ArtifactCardLabels, ArtifactCardProps, ArtifactCardSize } from './ArtifactCard.js';
5
5
  export { ARTIFACT_KINDS, ArtifactKindGlyph } from '../ArtifactKindGlyph/index.js';
6
6
  export type { ArtifactKind } from '../ArtifactKindGlyph/index.js';
7
+ export type { ArtifactAccess } from '../ArtifactAccess/index.js';
@@ -1,13 +1,14 @@
1
- export { ArtifactCard, ArtifactCardSkeleton, ArtifactPreviewGlyph } from '../chunk-OSZDHN5Z.js';
1
+ export { ArtifactCard, ArtifactCardSkeleton, ArtifactPreviewGlyph } from '../chunk-OHA6WSAG.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-MJW6SQYB.js';
6
+ import '../chunk-UBZDYOCA.js';
7
7
  import '../chunk-5QXRI35B.js';
8
8
  import '../chunk-AV2DXAEL.js';
9
9
  import '../chunk-5AQBPHZD.js';
10
10
  import '../chunk-PZKHBB7D.js';
11
+ import '../chunk-BGLKLXL3.js';
11
12
  export { ARTIFACT_KINDS, ArtifactKindGlyph } from '../chunk-CE2THTQR.js';
12
13
  import '../chunk-BHHIIK3M.js';
13
14
  import '../chunk-PQADV6P6.js';
@@ -65,7 +65,7 @@ export interface ArtifactKindTileProps {
65
65
  * One kind, or one starting point of a kind, as a tile: the kind's drawing on
66
66
  * its tinted ground (or the starting point's own `face`), framed, with its
67
67
  * name under it, such as a create page's starting layouts. The whole tile is
68
- * one link or button named by the name. The gallery's Make something new row
68
+ * one link or button named by the name. The gallery's "Start a new artifact" row
69
69
  * is the quieter `ArtifactMakeRow`, a toolbar of glyphs rather than pictures.
70
70
  *
71
71
  * A TILE THAT CANNOT START is still a stop on the row, so a reader moving
@@ -1,3 +1,3 @@
1
- export { ArtifactKindGround, ArtifactKindIllustration, ArtifactKindTile } from '../chunk-MJW6SQYB.js';
1
+ export { ArtifactKindGround, ArtifactKindIllustration, ArtifactKindTile } from '../chunk-UBZDYOCA.js';
2
2
  import '../chunk-BZFWDIV6.js';
3
3
  import '../chunk-ODEQTPFM.js';
@@ -1,5 +1,5 @@
1
1
  /*
2
- * A kind's drawing, its tinted ground and the Make something new tile.
2
+ * A kind's drawing, its tinted ground and the "Start a new artifact" tile.
3
3
  *
4
4
  * Every colour is the kind's token, `--color-artifact-kind-<kind>` and its
5
5
  * Fill and Line steps, set once per kind on `--crewlet-kind-*`
@@ -1,4 +1,4 @@
1
- export { ArtifactMakeRow } from '../chunk-66ADEPFB.js';
1
+ export { ArtifactMakeRow } from '../chunk-EAKC24BW.js';
2
2
  import '../chunk-CE2THTQR.js';
3
3
  import '../chunk-BZFWDIV6.js';
4
4
  import '../chunk-ODEQTPFM.js';
@@ -1,5 +1,5 @@
1
1
  /*
2
- * The Make something new tray.
2
+ * The "Start a new artifact" tray.
3
3
  *
4
4
  * Every colour is a token: the tray's ground, its dots and its hairlines are
5
5
  * the surface and border steps, and each kind's mark reads the kind's own
@@ -0,0 +1,37 @@
1
+ import { type ArtifactKind } from '../ArtifactKindGlyph/index.js';
2
+ export interface ArtifactNameCellLabels {
3
+ kinds: Record<ArtifactKind, string>;
4
+ pinned: string;
5
+ }
6
+ export interface ArtifactNameCellProps {
7
+ kind: ArtifactKind;
8
+ title: string;
9
+ /**
10
+ * What it is about, in a line under the title after the kind's word: the
11
+ * artifact's own description. Left out, the kind's word stands alone.
12
+ */
13
+ detail?: string | undefined;
14
+ pinned?: boolean | undefined;
15
+ /** It is in the trash: its mark is drawn without its kind's tint. */
16
+ trashed?: boolean | undefined;
17
+ className?: string | undefined;
18
+ labels?: Partial<ArtifactNameCellLabels> | undefined;
19
+ }
20
+ /**
21
+ * An artifact's name in a list: its kind's glyph on the kind's tint, the
22
+ * title, and under it the kind's word and what it is about.
23
+ *
24
+ * THE SAME MARK AS THE MAKE ROW'S, so a reader who started a doc from the
25
+ * tray finds it in the list by the same tile in the same colour, and the
26
+ * grid's badge and the list's mark name one kind one way. The mark is the one
27
+ * coloured thing on the row; the words are the text steps.
28
+ *
29
+ * TWO LINES, ONE NAME. The title is the row's name and the line under it is
30
+ * its description, each cut on one line with the whole of it on hover, so a
31
+ * list of long titles keeps one row height. The kind's word is printed rather
32
+ * than only drawn, which is what lets the list drop a Type column of its own.
33
+ *
34
+ * Not a link: the row it sits in is. The mark is decorative because the kind
35
+ * is printed beside it.
36
+ */
37
+ export declare function ArtifactNameCell({ kind, title, detail, pinned, trashed, className, labels }: ArtifactNameCellProps): import("react").JSX.Element;
@@ -0,0 +1,4 @@
1
+ import '../ArtifactKindIllustration/ArtifactKinds.css';
2
+ import './ArtifactNameCell.css';
3
+ export { ArtifactNameCell } from './ArtifactNameCell.js';
4
+ export type { ArtifactNameCellLabels, ArtifactNameCellProps } from './ArtifactNameCell.js';
@@ -0,0 +1,4 @@
1
+ export { ArtifactNameCell } from '../chunk-P5VGSVWG.js';
2
+ import '../chunk-CE2THTQR.js';
3
+ import '../chunk-BZFWDIV6.js';
4
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,104 @@
1
+ /*
2
+ * An artifact's name in a list: the kind's mark on its tint, the title over
3
+ * one quiet line. Every colour is a token: the mark reads the kind's own Fill,
4
+ * Line and Ink (`ArtifactKinds.css`), the words the text steps.
5
+ */
6
+
7
+ .crewlet-artifact-name {
8
+ display: flex;
9
+ align-items: center;
10
+ gap: var(--spacing-3);
11
+ min-width: 0;
12
+ max-width: 100%;
13
+ padding-block: var(--spacing-1);
14
+ }
15
+
16
+ /* THE MARK, the Make row's tile at a list's size: the kind's glyph on its
17
+ tint inside the kind's hairline. */
18
+ .crewlet-artifact-name__mark {
19
+ display: inline-flex;
20
+ flex: none;
21
+ align-items: center;
22
+ justify-content: center;
23
+ width: 32px;
24
+ height: 32px;
25
+ box-sizing: border-box;
26
+ border-radius: var(--radius-md);
27
+ background: var(--crewlet-kind-fill);
28
+ box-shadow: inset 0 0 0 1px var(--crewlet-kind-line);
29
+ color: var(--crewlet-kind-ink);
30
+ transition: box-shadow var(--motion-duration-fast) var(--motion-easing-out);
31
+ }
32
+
33
+ /* UNDER THE POINTER the row's ground moves (the row's own hover), and the
34
+ mark's hairline takes the kind's hue, so the one coloured thing on the row
35
+ answers too. No lift and no movement: a list is read down, not played. */
36
+ :is(tr, [role='row']):hover .crewlet-artifact-name__mark {
37
+ box-shadow: inset 0 0 0 1px var(--crewlet-kind-hue);
38
+ }
39
+
40
+ .crewlet-artifact-name--trashed .crewlet-artifact-name__mark {
41
+ background: var(--color-surface-inset);
42
+ box-shadow: inset 0 0 0 1px var(--color-border-default);
43
+ color: var(--color-text-tertiary);
44
+ }
45
+
46
+ .crewlet-artifact-name__words {
47
+ display: flex;
48
+ flex-direction: column;
49
+ gap: 2px;
50
+ min-width: 0;
51
+ }
52
+
53
+ .crewlet-artifact-name__title-row {
54
+ display: flex;
55
+ align-items: center;
56
+ gap: var(--spacing-1);
57
+ min-width: 0;
58
+ }
59
+
60
+ .crewlet-artifact-name__title {
61
+ min-width: 0;
62
+ overflow: hidden;
63
+ text-overflow: ellipsis;
64
+ white-space: nowrap;
65
+ color: var(--color-text-primary);
66
+ font-size: var(--font-size-sm);
67
+ font-weight: var(--font-weight-medium);
68
+ line-height: 1.35;
69
+ }
70
+
71
+ .crewlet-artifact-name__pin {
72
+ display: inline-flex;
73
+ flex: none;
74
+ color: var(--color-text-tertiary);
75
+ }
76
+
77
+ .crewlet-artifact-name__detail {
78
+ display: flex;
79
+ align-items: baseline;
80
+ gap: var(--spacing-1);
81
+ min-width: 0;
82
+ overflow: hidden;
83
+ white-space: nowrap;
84
+ color: var(--color-text-tertiary);
85
+ font-size: var(--font-size-xs);
86
+ line-height: 1.35;
87
+ }
88
+
89
+ .crewlet-artifact-name__kind,
90
+ .crewlet-artifact-name__dot {
91
+ flex: none;
92
+ }
93
+
94
+ .crewlet-artifact-name__about {
95
+ min-width: 0;
96
+ overflow: hidden;
97
+ text-overflow: ellipsis;
98
+ }
99
+
100
+ @media (prefers-reduced-motion: reduce) {
101
+ .crewlet-artifact-name__mark {
102
+ transition: none;
103
+ }
104
+ }
@@ -2,8 +2,8 @@ export { CommandPalette } from '../chunk-N5SKHIAP.js';
2
2
  import '../chunk-XEGZHHRH.js';
3
3
  import '../chunk-F73MC7EZ.js';
4
4
  import '../chunk-IUYUS2SO.js';
5
- import '../chunk-SMBKXWML.js';
6
5
  import '../chunk-YSGLEHND.js';
6
+ import '../chunk-SMBKXWML.js';
7
7
  import '../chunk-BHHIIK3M.js';
8
8
  import '../chunk-PQADV6P6.js';
9
9
  import '../chunk-OMV5W53A.js';
@@ -1,14 +1,14 @@
1
- export { COMMENT_THREAD_LABELS, CommentThread } from '../chunk-WNAYQQ6Y.js';
1
+ export { COMMENT_THREAD_LABELS, CommentThread } from '../chunk-44WJLPQS.js';
2
+ import '../chunk-P6WFZDKS.js';
2
3
  import '../chunk-CI3VPIJN.js';
3
4
  import '../chunk-3CZ7XAVY.js';
4
5
  import '../chunk-EUCC37WY.js';
5
6
  import '../chunk-5AQBPHZD.js';
6
7
  import '../chunk-PZKHBB7D.js';
7
- import '../chunk-P6WFZDKS.js';
8
8
  import '../chunk-RH2NCQBZ.js';
9
9
  import '../chunk-IUYUS2SO.js';
10
- import '../chunk-SMBKXWML.js';
11
10
  import '../chunk-YSGLEHND.js';
11
+ import '../chunk-SMBKXWML.js';
12
12
  import '../chunk-BHHIIK3M.js';
13
13
  import '../chunk-PQADV6P6.js';
14
14
  import '../chunk-OG6CL3EB.js';
@@ -1,7 +1,7 @@
1
1
  export { COMPOSER_COUNTER_AT, Composer } from '../chunk-RH2NCQBZ.js';
2
2
  import '../chunk-IUYUS2SO.js';
3
- import '../chunk-SMBKXWML.js';
4
3
  import '../chunk-YSGLEHND.js';
4
+ import '../chunk-SMBKXWML.js';
5
5
  import '../chunk-PQADV6P6.js';
6
6
  import '../chunk-4FQT6ZAY.js';
7
7
  import '../chunk-BZFWDIV6.js';
@@ -1,7 +1,7 @@
1
- export { ALL_ITEMS, CopyableCell, DATA_TABLE_LABELS, DataTable, RowActionsMenu } from '../chunk-XMRTFPWX.js';
2
- import '../chunk-XEGZHHRH.js';
1
+ export { ALL_ITEMS, CopyableCell, DATA_TABLE_LABELS, DataTable, RowActionsMenu } from '../chunk-JML75PGJ.js';
3
2
  import '../chunk-STJ7QBC3.js';
4
3
  import '../chunk-DTIW4CHZ.js';
4
+ import '../chunk-XEGZHHRH.js';
5
5
  import '../chunk-PJIPUEJ3.js';
6
6
  import '../chunk-EUCC37WY.js';
7
7
  import '../chunk-AV2DXAEL.js';
@@ -1,11 +1,11 @@
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-ES4RKQ7B.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-GS7ZTHPF.js';
2
2
  import '../chunk-HOXGBLEY.js';
3
- import '../chunk-XMRTFPWX.js';
3
+ import '../chunk-JML75PGJ.js';
4
4
  import '../chunk-L4WZSVMT.js';
5
- import '../chunk-XEGZHHRH.js';
6
- import '../chunk-F73MC7EZ.js';
7
5
  import '../chunk-STJ7QBC3.js';
8
6
  import '../chunk-DTIW4CHZ.js';
7
+ import '../chunk-XEGZHHRH.js';
8
+ import '../chunk-F73MC7EZ.js';
9
9
  import '../chunk-GXQ3B46I.js';
10
10
  import '../chunk-PGRPNDWM.js';
11
11
  import '../chunk-K3IJQNB7.js';
@@ -14,8 +14,8 @@ import '../chunk-3CZ7XAVY.js';
14
14
  import '../chunk-EUCC37WY.js';
15
15
  import '../chunk-AV2DXAEL.js';
16
16
  import '../chunk-IUYUS2SO.js';
17
- import '../chunk-SMBKXWML.js';
18
17
  import '../chunk-YSGLEHND.js';
18
+ import '../chunk-SMBKXWML.js';
19
19
  import '../chunk-BHHIIK3M.js';
20
20
  import '../chunk-PQADV6P6.js';
21
21
  import '../chunk-BUVCV3WI.js';
@@ -3,11 +3,11 @@ import '../chunk-XJ2QEBMM.js';
3
3
  import '../chunk-IUYUS2SO.js';
4
4
  import '../chunk-YSGLEHND.js';
5
5
  import '../chunk-PQADV6P6.js';
6
- import '../chunk-RSAQOKH3.js';
7
6
  import '../chunk-BUVCV3WI.js';
8
7
  import '../chunk-OMV5W53A.js';
9
8
  import '../chunk-R25RGPUB.js';
10
9
  import '../chunk-OG6CL3EB.js';
10
+ import '../chunk-RSAQOKH3.js';
11
11
  import '../chunk-4FQT6ZAY.js';
12
12
  import '../chunk-BZFWDIV6.js';
13
13
  import '../chunk-ODEQTPFM.js';
@@ -1,11 +1,11 @@
1
- export { ListInput } from '../chunk-IQH3DDZ2.js';
1
+ export { ListInput } from '../chunk-BIQDJOJZ.js';
2
2
  import '../chunk-IUYUS2SO.js';
3
- import '../chunk-SMBKXWML.js';
4
3
  import '../chunk-YSGLEHND.js';
4
+ import '../chunk-SMBKXWML.js';
5
5
  import '../chunk-PQADV6P6.js';
6
- import '../chunk-RSAQOKH3.js';
7
6
  import '../chunk-OMV5W53A.js';
8
7
  import '../chunk-R25RGPUB.js';
8
+ import '../chunk-RSAQOKH3.js';
9
9
  import '../chunk-4FQT6ZAY.js';
10
10
  import '../chunk-BZFWDIV6.js';
11
11
  import '../chunk-ODEQTPFM.js';
@@ -137,6 +137,15 @@ export interface LivePreviewProps {
137
137
  * and every scroller between the box and the root clips it at its own edge.
138
138
  */
139
139
  export declare function scrollRoot(el: Element): Element | null;
140
+ /** How a layer laid out at a size of its own is fitted to its box (`PreviewScaleProps.fit`). */
141
+ export type PreviewFit = 'width' | 'contain' | 'fill';
142
+ /**
143
+ * The most of a filled layer's content that may fall outside its box, on
144
+ * either axis, before `fill` contains it instead: a fifth. A laptop's board
145
+ * (16:10) in a card's 16:9 loses a tenth of its foot; a phone's board would
146
+ * lose four fifths of itself, and is shown whole.
147
+ */
148
+ export declare const PREVIEW_FILL_MAX_CUT = 0.2;
140
149
  /**
141
150
  * A preview whose `snapshot` key changes is another preview: what it holds
142
151
  * belongs to the content it drew, so it starts again under the new key.
@@ -150,10 +159,13 @@ export interface PreviewScaleProps {
150
159
  height?: number | undefined;
151
160
  /**
152
161
  * `width` scales the content to the box's width from its top (the top of a
153
- * page); `contain` scales it to fit inside the box whole, centred (a board
154
- * of its own size).
162
+ * page); `contain` scales it to fit inside the box whole, centred; `fill`
163
+ * covers the box edge to edge, centred across and held at the top, wherever
164
+ * that leaves at most [PREVIEW_FILL_MAX_CUT] of the content outside it, and
165
+ * contains it otherwise (a design's board, which may be a laptop's screen
166
+ * or a phone's). `contain` and `fill` need a `height`.
155
167
  */
156
- fit?: 'width' | 'contain' | undefined;
168
+ fit?: PreviewFit | undefined;
157
169
  }
158
170
  /**
159
171
  * Content laid out at a size of its own and scaled to the box it is drawn in,
@@ -1,6 +1,6 @@
1
1
  import './LivePreview.css';
2
- export { LIVE_PREVIEW_DWELL_MS, LIVE_PREVIEW_MARGIN, LIVE_PREVIEW_RENDER_MS, LivePreview, LivePreviewBudgetProvider, PreviewScale, useLivePreview } from './LivePreview.js';
3
- export type { LivePreviewProps, LivePreviewSignals, LivePreviewState, PreviewScaleProps } from './LivePreview.js';
2
+ export { LIVE_PREVIEW_DWELL_MS, LIVE_PREVIEW_MARGIN, LIVE_PREVIEW_RENDER_MS, LivePreview, LivePreviewBudgetProvider, PREVIEW_FILL_MAX_CUT, PreviewScale, useLivePreview } from './LivePreview.js';
3
+ export type { LivePreviewProps, LivePreviewSignals, LivePreviewState, PreviewFit, PreviewScaleProps } from './LivePreview.js';
4
4
  export { createLivePreviewBudget, immediately, LIVE_PREVIEW_MAX, LIVE_PREVIEW_MAX_FRAMES, perFrame } from './budget.js';
5
5
  export type { LivePreviewBudget, LivePreviewSchedule, LivePreviewSlot } from './budget.js';
6
6
  export { createLivePreviewStills, LIVE_PREVIEW_STILLS_KEPT } from './stills.js';
@@ -1,2 +1,2 @@
1
- export { LIVE_PREVIEW_DWELL_MS, LIVE_PREVIEW_MARGIN, LIVE_PREVIEW_MAX, LIVE_PREVIEW_MAX_FRAMES, LIVE_PREVIEW_RENDER_MS, LIVE_PREVIEW_STILLS_KEPT, LivePreview, LivePreviewBudgetProvider, PreviewScale, createLivePreviewBudget, createLivePreviewStills, immediately, perFrame, useLivePreview } from '../chunk-XGBLRDSU.js';
1
+ export { LIVE_PREVIEW_DWELL_MS, LIVE_PREVIEW_MARGIN, LIVE_PREVIEW_MAX, LIVE_PREVIEW_MAX_FRAMES, LIVE_PREVIEW_RENDER_MS, LIVE_PREVIEW_STILLS_KEPT, LivePreview, LivePreviewBudgetProvider, PREVIEW_FILL_MAX_CUT, PreviewScale, createLivePreviewBudget, createLivePreviewStills, immediately, perFrame, useLivePreview } from '../chunk-WYKWXRJ4.js';
2
2
  import '../chunk-ODEQTPFM.js';
@@ -1,6 +1,6 @@
1
- export { PresenterView, formatStopwatch } from '../chunk-DEMALFHY.js';
2
- import '../chunk-NQGPD6NX.js';
1
+ export { PresenterView, formatStopwatch } from '../chunk-F23N4MVU.js';
3
2
  import '../chunk-6VOS2GMB.js';
3
+ import '../chunk-NQGPD6NX.js';
4
4
  import '../chunk-RK4XPHVG.js';
5
5
  import '../chunk-OMV5W53A.js';
6
6
  import '../chunk-R25RGPUB.js';
@@ -1,10 +1,10 @@
1
- export { ARTIFACT_ROLES, SHAREABLE_ROLES, ShareDialog, roleAtLeast } from '../chunk-2DV4THNQ.js';
1
+ export { ARTIFACT_ROLES, SHAREABLE_ROLES, ShareDialog, roleAtLeast } from '../chunk-EARDAJQY.js';
2
2
  import '../chunk-VKKUGZ3G.js';
3
- import '../chunk-XEGZHHRH.js';
4
- import '../chunk-F73MC7EZ.js';
5
3
  import '../chunk-W46LPU4R.js';
6
4
  import '../chunk-STJ7QBC3.js';
7
5
  import '../chunk-DTIW4CHZ.js';
6
+ import '../chunk-XEGZHHRH.js';
7
+ import '../chunk-F73MC7EZ.js';
8
8
  import '../chunk-SZZRIHGT.js';
9
9
  import '../chunk-CI3VPIJN.js';
10
10
  import '../chunk-5AQBPHZD.js';
@@ -11,8 +11,8 @@ import '../chunk-CCAXYHQS.js';
11
11
  import '../chunk-VL6CUNSX.js';
12
12
  import '../chunk-RKKO7QHH.js';
13
13
  import '../chunk-IUYUS2SO.js';
14
- import '../chunk-SMBKXWML.js';
15
14
  import '../chunk-YSGLEHND.js';
15
+ import '../chunk-SMBKXWML.js';
16
16
  import '../chunk-BHHIIK3M.js';
17
17
  import '../chunk-PQADV6P6.js';
18
18
  import '../chunk-BUVCV3WI.js';
@@ -13,11 +13,11 @@ import '../chunk-AYKXMIOR.js';
13
13
  import '../chunk-6ZJ3N7QI.js';
14
14
  import '../chunk-5AQBPHZD.js';
15
15
  import '../chunk-PZKHBB7D.js';
16
- import '../chunk-RSAQOKH3.js';
17
16
  import '../chunk-BUVCV3WI.js';
18
17
  import '../chunk-OMV5W53A.js';
19
18
  import '../chunk-R25RGPUB.js';
20
19
  import '../chunk-OG6CL3EB.js';
20
+ import '../chunk-RSAQOKH3.js';
21
21
  import '../chunk-4FQT6ZAY.js';
22
22
  import '../chunk-BZFWDIV6.js';
23
23
  import '../chunk-ODEQTPFM.js';
@@ -2,11 +2,11 @@ export { SlideFilmstrip } from '../chunk-KYZMN6I6.js';
2
2
  import '../chunk-NQGPD6NX.js';
3
3
  import '../chunk-XJ2QEBMM.js';
4
4
  import '../chunk-SMBKXWML.js';
5
- import '../chunk-RSAQOKH3.js';
6
5
  import '../chunk-BUVCV3WI.js';
7
6
  import '../chunk-OMV5W53A.js';
8
7
  import '../chunk-R25RGPUB.js';
9
8
  import '../chunk-OG6CL3EB.js';
9
+ import '../chunk-RSAQOKH3.js';
10
10
  import '../chunk-4FQT6ZAY.js';
11
11
  import '../chunk-BZFWDIV6.js';
12
12
  import '../chunk-ODEQTPFM.js';
@@ -1,4 +1,4 @@
1
- export { Switcher } from '../chunk-MRMHZ437.js';
1
+ export { Switcher } from '../chunk-66NGUD5S.js';
2
2
  import '../chunk-XEGZHHRH.js';
3
3
  import '../chunk-F73MC7EZ.js';
4
4
  import '../chunk-FYTIJM2T.js';
@@ -7,11 +7,11 @@ import '../chunk-TEUQWOWZ.js';
7
7
  import '../chunk-IUYUS2SO.js';
8
8
  import '../chunk-YSGLEHND.js';
9
9
  import '../chunk-PQADV6P6.js';
10
- import '../chunk-RSAQOKH3.js';
11
10
  import '../chunk-RTPQDNW3.js';
12
11
  import '../chunk-OMV5W53A.js';
13
12
  import '../chunk-R25RGPUB.js';
14
13
  import '../chunk-OG6CL3EB.js';
14
+ import '../chunk-RSAQOKH3.js';
15
15
  import '../chunk-4FQT6ZAY.js';
16
16
  import '../chunk-BZFWDIV6.js';
17
17
  import '../chunk-ODEQTPFM.js';
@@ -1,11 +1,11 @@
1
- export { TagsInput } from '../chunk-3PTUDKSR.js';
1
+ export { TagsInput } from '../chunk-AOLCZDZ6.js';
2
2
  import '../chunk-GFV4LJHH.js';
3
3
  import '../chunk-WIATRXEJ.js';
4
4
  import '../chunk-F73MC7EZ.js';
5
5
  import '../chunk-YSGLEHND.js';
6
- import '../chunk-RSAQOKH3.js';
7
6
  import '../chunk-OMV5W53A.js';
8
7
  import '../chunk-R25RGPUB.js';
8
+ import '../chunk-RSAQOKH3.js';
9
9
  import '../chunk-4FQT6ZAY.js';
10
10
  import '../chunk-BZFWDIV6.js';
11
11
  import '../chunk-ODEQTPFM.js';