@crewlethq/ui 0.37.1 → 0.39.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/README.md +70 -2
- package/dist/Accordion/index.js +1 -1
- package/dist/AgentHandoffPanel/index.js +2 -2
- package/dist/AppShell/index.js +1 -1
- package/dist/{AppShell-JBCZSSX3.css → AppShell-NDU4XMGF.css} +39 -6
- package/dist/ArtifactBar/index.js +1 -1
- package/dist/{ArtifactBar-FWPBBKQ5.css → ArtifactBar-6PGWGKN2.css} +13 -1
- package/dist/ArtifactCard/index.js +2 -2
- package/dist/ArtifactMakeRow/ArtifactMakeRow.d.ts +3 -1
- package/dist/ArtifactMakeRow/index.js +1 -1
- package/dist/{ArtifactMakeRow-W3RD5YWZ.css → ArtifactMakeRow-6UX2LTF7.css} +43 -5
- package/dist/AuthLayout/index.js +2 -2
- package/dist/Card/Card.d.ts +14 -2
- package/dist/Card/index.js +1 -1
- package/dist/{Card-QOVASQNU.css → Card-JR2UPQH7.css} +63 -0
- package/dist/CatalogTile/CatalogTile.d.ts +47 -0
- package/dist/CatalogTile/index.d.ts +3 -0
- package/dist/CatalogTile/index.js +3 -0
- package/dist/CatalogTile-TGR2ZZVQ.css +131 -0
- package/dist/CodeBlock/index.js +1 -1
- package/dist/{CodeBlock-GYNJ2HI6.css → CodeBlock-N5ETJF24.css} +13 -0
- package/dist/CommandPalette/index.js +2 -2
- package/dist/DataTable/index.js +2 -2
- package/dist/DataView/index.js +3 -3
- package/dist/DatasetSource/DatasetSource.d.ts +7 -1
- package/dist/DatasetSource/index.js +2 -2
- package/dist/DescriptionList/DescriptionList.d.ts +12 -1
- package/dist/DescriptionList/index.js +1 -1
- package/dist/{DescriptionList-IXMRCSMK.css → DescriptionList-DEZISDLQ.css} +8 -1
- package/dist/Disclosure/index.js +1 -1
- package/dist/{Disclosure-VKBJJIZ7.css → Disclosure-P4FH3C35.css} +28 -2
- package/dist/LinkInterstitial/index.js +2 -2
- package/dist/List/List.d.ts +8 -0
- package/dist/List/index.js +1 -1
- package/dist/{List-MYJIV6MP.css → List-YHLIZFK4.css} +46 -0
- package/dist/ListInput/ListInput.d.ts +9 -1
- package/dist/ListInput/index.js +1 -1
- package/dist/Modal/index.js +1 -1
- package/dist/{Modal-7MWRCWAI.css → Modal-TOEWHDCQ.css} +5 -0
- package/dist/ObjectHeader/index.js +1 -1
- package/dist/{ObjectHeader-D7GU7QNI.css → ObjectHeader-ZOS22FKX.css} +7 -8
- package/dist/PricingCard/index.js +2 -2
- package/dist/SettingsTable/SettingsTable.d.ts +66 -0
- package/dist/SettingsTable/index.d.ts +3 -0
- package/dist/SettingsTable/index.js +3 -0
- package/dist/SettingsTable-6DUFAFXG.css +160 -0
- package/dist/ShareDialog/index.js +2 -2
- package/dist/SheetGrid/index.js +2 -2
- package/dist/StatCard/index.js +1 -1
- package/dist/{StatCard-4T7TMWMN.css → StatCard-HAA3F5GX.css} +8 -3
- package/dist/StatGroup/StatGroup.d.ts +11 -7
- package/dist/StatGroup/index.js +1 -1
- package/dist/StatGroup-ZMW7VQWP.css +195 -0
- package/dist/Switcher/index.js +2 -2
- package/dist/TableCells/index.js +2 -2
- package/dist/Tag/index.js +1 -1
- package/dist/{Tag-SRGTK5KI.css → Tag-2DQOVE6W.css} +15 -5
- package/dist/TagsInput/index.js +2 -2
- package/dist/TileGrid/TileGrid.d.ts +33 -0
- package/dist/TileGrid/index.d.ts +3 -0
- package/dist/TileGrid/index.js +2 -0
- package/dist/TileGrid-I6LNYD2H.css +52 -0
- package/dist/{chunk-YSG3DW7W.js → chunk-3TXY3PJZ.js} +1 -1
- package/dist/{chunk-K4VP6ZKE.js → chunk-4BJK7FE5.js} +1 -1
- package/dist/chunk-4RKTZSEW.js +64 -0
- package/dist/{chunk-3SBM4DGI.js → chunk-BH52LIY6.js} +1 -1
- package/dist/{chunk-HDHZWIFL.js → chunk-DYB66CNM.js} +16 -2
- package/dist/{chunk-A23KDROH.js → chunk-FXBGEANQ.js} +1 -1
- package/dist/{chunk-HMLAWVG6.js → chunk-HQJ24WPM.js} +5 -3
- package/dist/{chunk-SVGARBDY.js → chunk-IAGYPTEJ.js} +2 -2
- package/dist/{chunk-5QXRI35B.js → chunk-INHXF2CL.js} +24 -11
- package/dist/{chunk-6NNY5WBF.js → chunk-JKAGN4V4.js} +1 -1
- package/dist/{chunk-DZSBFITC.js → chunk-JZPK4IXR.js} +1 -1
- package/dist/{chunk-UWRBD2YO.js → chunk-KNHUBHFX.js} +1 -1
- package/dist/{chunk-GFV4LJHH.js → chunk-KYIAFNU7.js} +1 -1
- package/dist/{chunk-F2XSYBKH.js → chunk-MFS6F2P7.js} +4 -1
- package/dist/{chunk-NRBAXRWE.js → chunk-N3TFYBN3.js} +1 -1
- package/dist/chunk-NNTO3TNC.js +9 -0
- package/dist/{chunk-DS2C73RJ.js → chunk-NZWX27J7.js} +2 -2
- package/dist/{chunk-VGE3G3T4.js → chunk-ODOJJGXH.js} +1 -1
- package/dist/{chunk-MICH6QSJ.js → chunk-OGXHZHRX.js} +1 -1
- package/dist/{chunk-JXRI5YD2.js → chunk-OUD75UB2.js} +2 -1
- package/dist/{chunk-MG3HTY6F.js → chunk-QRKT4XTT.js} +1 -1
- package/dist/{chunk-NS4NSHVX.js → chunk-R2IBCEU6.js} +12 -2
- package/dist/{chunk-WX2NIG4G.js → chunk-S4DREXGM.js} +1 -1
- package/dist/{chunk-GDDE4UM7.js → chunk-SEC2GR2V.js} +1 -1
- package/dist/{chunk-S27UBCVX.js → chunk-TZYFTC4M.js} +1 -1
- package/dist/{chunk-OHA6WSAG.js → chunk-U2XAJONO.js} +1 -1
- package/dist/{chunk-DQSXWQMJ.js → chunk-U3ILLCR2.js} +1 -1
- package/dist/{chunk-DOLATMGF.js → chunk-WYYCPV46.js} +5 -0
- package/dist/{chunk-A72JPXIV.js → chunk-XGBUUQDU.js} +1 -1
- package/dist/chunk-XNXK5MA4.js +48 -0
- package/dist/{chunk-XO7PUL4F.js → chunk-YPTTSJPM.js} +1 -1
- package/dist/{chunk-RIAZM6L3.js → chunk-ZNOXQACX.js} +1 -1
- package/dist/generated/index.d.ts +3 -0
- package/dist/generated/index.js +56 -53
- package/dist/index.js +56 -53
- package/dist/styles.css +782 -64
- package/package.json +3 -3
- package/dist/StatGroup-PADTJCUQ.css +0 -86
- /package/dist/{chunk-4QQ3MND5.js → chunk-QRLIWCLX.js} +0 -0
package/README.md
CHANGED
|
@@ -43,14 +43,14 @@ import { Button } from '@crewlethq/ui/Button'; // 8 KB of CSS, not 182 KB
|
|
|
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
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` |
|
|
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
|
-
| 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` |
|
|
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`) |
|
|
48
48
|
| Feedback and overlays | `Callout`, `ConflictNote`, `EditingStatus`, `Toaster`, `Modal` (with `variant="sheet"`), `ConfirmModal`, `CommandPalette`, `Tooltip`, `Popover`, `Announcer` |
|
|
49
49
|
| Documents and review | `DiffView` and `DiffSummary` with the line diff they draw (`diffLines`, `diffStat`, `collapseDiff`, `firstChangedLines`, `splitLines`, `MAX_DIFF_LINES`, with no React in it), `DiffList`, `VersionCompare`, `CommentThread` |
|
|
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`, `Tabs`, `Accordion`, `Disclosure`, `Outline` (with `useActiveHeading` and `scrollToHeading`), `TreeGrid` |
|
|
53
|
+
| Layout | `Container`, `Section`, `Card`, `TileGrid`, `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`, `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 |
|
|
@@ -204,6 +204,74 @@ 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.39.0
|
|
208
|
+
|
|
209
|
+
These come from a production polish of the engine dashboard's Settings › Limits, Company › Integrations and Company › Policies, and the same patterns everywhere else it draws them.
|
|
210
|
+
|
|
211
|
+
### New
|
|
212
|
+
|
|
213
|
+
**`SettingsTable` draws a read-only table of settings** (with `SettingsTable.Row`). Each row is the setting's name with its key in the document it is written in under it (`settingKey`, in the monospace face, quiet), the value in force in tabular figures, and where the value comes from (`source`). A value that is the default says so as a quiet word; a row marked `changed` carries a mark before its source, the one row in a table a reader scanning it came to find. The tracks are fractions of the table's width (`--crewlet-settings-table-columns`), so a page that stacks a table per group in cards of one width puts every value and every source on one line down the page, which a term column sized to its own longest term never did. It is announced as a table with Setting, Value and Source column headers (drawn with `header`, renamed with `columns`) and each setting's name as its row's header. In a `Card` (with `padding="none"`) it gives up its own edge and corner, as `StatGroup` does; under 32rem of table the name takes the row's first line and the value and its source share the second.
|
|
214
|
+
|
|
215
|
+
**`TileGrid` lays tiles out on a fixed track count that folds by its own width.** Two sections of tiles each on a track count of its own put their edges in different places, and an `auto-fill` grid left a hole at the end of a short section. `columns` is the count at full width: `3` (the default) folds straight to one under 40rem of grid, never to two, so a set of three or six never strands a tile; `4` folds to two under 56rem; every count is one track under 28rem. `as="ul"` makes the track the list.
|
|
216
|
+
|
|
217
|
+
**`CatalogTile` is one entry in a catalogue**: the mark in a well of one size and ground for every tile, the name as a heading at the level its place gives it, a `status` only when the state carries meaning (On, Connected, Needs attention, Coming soon), one sentence, and a foot with a quiet `meta` fact and one `action`, drawn only when there is something to put in it. A tile in its resting state carries no pill, and its name stands centred beside its mark; `quiet` puts a tile that is available but not set up on the page's own ground rather than draining its mark, because a drained vendor mark (Datadog's white plate on grey) read as a placeholder image. The sentence reserves two lines in a row of tiles so their feet line up, and reserves nothing once the grid is one track.
|
|
218
|
+
|
|
219
|
+
**`List` takes `variant="numbered-divided"`**: an `ol` whose numbers stand in a column of their own, in tabular figures, with a hairline between rows at a card's inset and the body's leading. For statements a reader cites by number, such as a company's standing policies, each of which may run to several lines and wraps under its own first word. The drawn number is the list's counter and is not read a second time.
|
|
220
|
+
|
|
221
|
+
**`ListInput` takes `focusOnMount`**, as `TagsInput` does: the focus goes to the new-item box when the list mounts, once, so a form opened to change that one list (an "Edit policies" link) lands where the next item is written. It is taken during mount, so a dialog the list opens in keeps it rather than moving focus to its own first control.
|
|
222
|
+
|
|
223
|
+
### Fixes
|
|
224
|
+
|
|
225
|
+
**A card header's plain words are its title** (`Card.Header`). A header given a string or a number drew it as a bare text node at the regular weight with no heading element, beside cards whose `Card.Title` was a semibold heading: two title treatments on one page (Models, People, Nodes and a dozen more beside Limits and Sign-in policy), and the plain ones missing from the document outline. Plain words are now drawn as `Card.Title`. **A count of zero is not drawn**: the card's own empty state already says there is nothing, and "Models 0" said it twice.
|
|
226
|
+
|
|
227
|
+
**A card head can stack its subtitle at every width** (`Card.Header` `subtitlePlacement="below"`), for a row of cards of different widths whose heads must stand at one height: by default a wide card keeps its subtitle beside the title while a narrow one stacks it, so one row drew heads of 48 and 68px. **A code block that is a card's content is that card's surface** (`CodeBlock`): placed straight in a `Card` with `padding="none"` it gives up its own edge, corner and ground, so there is no box inside a box; in a padded body it stays a well.
|
|
228
|
+
|
|
229
|
+
**A dataset source can leave out its kind** (`DatasetSource` `kind` is optional): a list whose every entry reads from one place, grouped under list labels of its own, draws no kind tag on every row.
|
|
230
|
+
|
|
231
|
+
**A catalogue tile's fact-only foot stands as tall as one with a button** (`CatalogTile`), so the rules of a row's feet sit on one line.
|
|
232
|
+
|
|
233
|
+
**A dialog's title is its `h1`** (`Modal`). It was a paragraph while the body's headings started at level 2, so the outline a screen reader walks had no top; it keeps its register (the text face at the dialog's size), and still names the dialog.
|
|
234
|
+
|
|
235
|
+
**An object header's eyebrow and fact labels keep the words as written** (`ObjectHeader`, `FactLine`). They were the uppercase, tracked-open micro-caps of a table's column head, so a unit's page read "UNIT" over its name and TYPE, LEAD and SEATS under it, like a form. They are sentence case at the caption step now, as `StatCard`'s label already is.
|
|
236
|
+
|
|
237
|
+
**A row of stat tiles shares its lines** (`StatGroup`). Each tile in a row is a subgrid over the row's three lines (label, number, sub), so a label that wraps no longer pushes its own figure below the others; and a label stands on its number, one gap above it, where another label in the row takes two lines. **A stat tile's sub wraps** (`StatCard`), balanced, rather than ending in an ellipsis: its end is the half that says what the number means, and a grid of tiles gives every tile in a row one height anyway. These were the engine dashboard's own rules over the components; an application that restated them drops them.
|
|
238
|
+
|
|
239
|
+
**The artifact bar takes the shell top bar's inset** (`ArtifactBar`): 20px, 16px under the shell's breakpoint, plus the scroller's gutter at its end, since it stands in that bar's place. At a 12px inset of its own a create page's controls ended past the content under them.
|
|
240
|
+
|
|
241
|
+
## Changes in 0.38.0
|
|
242
|
+
|
|
243
|
+
### Icons
|
|
244
|
+
|
|
245
|
+
**`VendorMark` draws Crewlet's own mark** (`vendor="crewlet"`), for the services built into Crewlet (its tracker, its knowledge base) where a catalogue of integrations lists them beside the third-party apps they stand in for. It is drawn from the brand mark `@crewlethq/icons` already carries (`CrewletIcon`), not a second copy, and takes the same `size` and `muted` as every other vendor. `VENDORS` lists it, so the VendorMark story shows it with the others.
|
|
246
|
+
|
|
247
|
+
**Every vendor mark draws at one weight in its square.** GitLab's press-kit drawing framed its logo in twice its own width, so at 20px it drew 10px beside marks of 20; it is cropped to its logo. Crewlet's mark is framed in the square its own extent fits rather than in the wide brand file's artwork margins, so at 20px it draws 20 by 10 where it drew 17 by 9. The VendorMark story's One weight draws every mark at 20px in a 48px box.
|
|
248
|
+
|
|
249
|
+
### Layout
|
|
250
|
+
|
|
251
|
+
These come from a layout audit of the engine dashboard at 1440, 1024 and 390 in both themes; each names what was measured.
|
|
252
|
+
|
|
253
|
+
**A stat row folds by its own width** (`StatGroup`). It dropped to two columns under a 1024px window, but a row is as wide as its column leaves it: beside the rail and a settings column at 1024 a four-column row was 489px and cut its figures ("Not s…"), and on a phone three tiles stood two and a lone third at double width. The row is a size container on twelve tracks: four a row fold to two under 640px of row, three stack one a row under 480px, and the hairlines follow. The row carries `data-columns` beside `--crewlet-stat-group-cols`. An application that restated the old `width < 1024px` step for a stat row drops it.
|
|
254
|
+
|
|
255
|
+
**A stat row in a card is flush without being told.** A `StatGroup` that is a `Card`'s content, or a `Card.Body`'s, gives up its own surface, edge and corner, so a card no longer draws a box inside a box (or a third frame inside a padded body). `flush` stays for any other host.
|
|
256
|
+
|
|
257
|
+
**A disclosure's fact gives way before its title** (`Disclosure`, `Accordion`). The fact (`meta`) held its full width and the title shrank to nothing beside a long one: a log row stopped saying which log it was, and its fact ran under the status badge beside it. The fact now shrinks first, at a hundred to the title's one, ends in an ellipsis, and keeps a floor of one glyph. It is still the toggle's name in full.
|
|
258
|
+
|
|
259
|
+
**A narrow card's subtitle takes a line of its own** (`Card.Header`). Under 480px of card the head wraps: the title and the card's controls keep the first line, and the subtitle takes the whole of the next and wraps there rather than ending ("Resets today at midnight, the week…"). Only a card whose head has a subtitle becomes a size container. An application that wrapped a subtitle under the title for itself at narrow widths can drop that rule.
|
|
260
|
+
|
|
261
|
+
**Description lists on one page share a term column** (`DescriptionList`). The term track is `--crewlet-description-list-term`, inherited, so a page sets it once and every list under it starts its values on one line; `termWidth` sets it on one list. The default track, `fit` and the narrow step are unchanged.
|
|
262
|
+
|
|
263
|
+
**The make row lays out the kinds it is given** (`ArtifactMakeRow`). Five kinds stood in six fixed columns with an empty sixth at the end of the line, and three across on a phone left a hole after the fifth. The line takes a column per kind (`--crewlet-make-row-count`, with `data-count`, both set from `items`), and on a narrow tray a short last row is centred and two or four kinds stand two a row.
|
|
264
|
+
|
|
265
|
+
**The rail foot stands on the nav's columns** (`AppShell`). A foot row's transparent boundary spends a pixel of its row pad, as it spent one of its block inset, so its mark and words start where the nav's do rather than a pixel right. In the foot, `AccountRow` takes the nav row's pad and glyph-to-word gap and centres its badge over a glyph's width, so the avatar is centred on the glyph column and the name starts on the word line.
|
|
266
|
+
|
|
267
|
+
**The top bar lines up with the content** (`AppShell`). It stood 16px from each edge over content inset 20px, and the scroller's reserved gutter moved the content's end in further, so with classic scrollbars every page's actions ended 15px past the cards under them. The bar now takes the content's inset on both sides and, at its end, the scroller's gutter, which the shell measures and sets as `--crewlet-app-shell-gutter` on its root (0 with overlay scrollbars).
|
|
268
|
+
|
|
269
|
+
### Colour
|
|
270
|
+
|
|
271
|
+
**The neutral outline tag is drawn in the neutral pill's edge** (`Tag`). It took the plain hairline, which on a dark card measured 1.07:1, so "Off" beside a filled "Default" read as a loose word. It takes the strong step the neutral soft pill draws (1.49:1 dark, 1.52:1 light on the card) and keeps its tertiary ink and empty ground, so the two neutral pills differ by their fill alone.
|
|
272
|
+
|
|
273
|
+
**Every hairline inside a card is easier to see.** `@crewlethq/tokens` holds the plain hairline to dE 5 on the card and the sheet (it held dE 3), and the default dark hairline moves from 1.07:1 to 1.13:1 on the card. A stat row's dividers, a card head's rule, a tile's footer rule and a code block's edge all draw it. See the tokens README.
|
|
274
|
+
|
|
207
275
|
## Changes in 0.37.1
|
|
208
276
|
|
|
209
277
|
### Sheets
|
package/dist/Accordion/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { AGENT_HANDOFF_LABELS, AgentHandoffPanel } from '../chunk-
|
|
1
|
+
export { AGENT_HANDOFF_LABELS, AgentHandoffPanel } from '../chunk-3TXY3PJZ.js';
|
|
2
2
|
import '../chunk-AUQPBL4O.js';
|
|
3
3
|
import '../chunk-3TFDQLW3.js';
|
|
4
|
-
import '../chunk-
|
|
4
|
+
import '../chunk-OGXHZHRX.js';
|
|
5
5
|
import '../chunk-ISA2O2BK.js';
|
|
6
6
|
import '../chunk-Y5BD4MTE.js';
|
|
7
7
|
import '../chunk-TYONQSOK.js';
|
package/dist/AppShell/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellToggle, AppShellTopbar, useAppShell } from '../chunk-
|
|
1
|
+
export { AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellToggle, AppShellTopbar, useAppShell } from '../chunk-DYB66CNM.js';
|
|
2
2
|
import '../chunk-RTPQDNW3.js';
|
|
3
3
|
import '../chunk-D6FEHY5G.js';
|
|
4
4
|
import '../chunk-OMV5W53A.js';
|
|
@@ -181,7 +181,9 @@
|
|
|
181
181
|
* compact density cannot take the target under it.
|
|
182
182
|
*
|
|
183
183
|
* And the boundary is TRANSPARENT rather than absent, spending one pixel of
|
|
184
|
-
* that step rather than adding one on top of it.
|
|
184
|
+
* that step rather than adding one on top of it. It spends a pixel of the row
|
|
185
|
+
* pad too: added to it, the boundary stood the row's mark and words a pixel
|
|
186
|
+
* right of every nav glyph and word above them. A button carries one at every
|
|
185
187
|
* variant so that a bordered variant and a borderless one stand the same
|
|
186
188
|
* height, and the row this package draws carries the same one for the same
|
|
187
189
|
* reason: without it the two rows in one foot are 34px and 36px, and the
|
|
@@ -196,7 +198,7 @@
|
|
|
196
198
|
width: 100%;
|
|
197
199
|
min-width: 0;
|
|
198
200
|
min-height: var(--size-row-sm);
|
|
199
|
-
padding: calc(var(--spacing-2) - 1px) var(--size-nav-row-pad);
|
|
201
|
+
padding: calc(var(--spacing-2) - 1px) calc(var(--size-nav-row-pad) - 1px);
|
|
200
202
|
border: 1px solid transparent;
|
|
201
203
|
border-radius: var(--radius-md);
|
|
202
204
|
background: transparent;
|
|
@@ -427,13 +429,22 @@
|
|
|
427
429
|
overflow: hidden;
|
|
428
430
|
}
|
|
429
431
|
|
|
432
|
+
/*
|
|
433
|
+
* THE BAR'S INSET IS THE CONTENT'S, so a page's first line starts under the
|
|
434
|
+
* bar's title and its cards end under the bar's last control. It stood 16px
|
|
435
|
+
* from each edge over a content column inset 20px, and at its end the
|
|
436
|
+
* content also gives up the scroller's gutter, which the bar, not scrolling,
|
|
437
|
+
* did not: with scrollbars drawn in the layout every page's actions ended
|
|
438
|
+
* 15px past the cards under them. The gutter is measured by the shell
|
|
439
|
+
* (`--crewlet-app-shell-gutter`, 0 where scrollbars overlay the content).
|
|
440
|
+
*/
|
|
430
441
|
.crewlet-app-shell__topbar {
|
|
431
442
|
display: flex;
|
|
432
443
|
align-items: center;
|
|
433
444
|
gap: var(--spacing-3);
|
|
434
445
|
flex: none;
|
|
435
446
|
height: var(--crewlet-app-shell-topbar);
|
|
436
|
-
padding: 0 var(--spacing-
|
|
447
|
+
padding: 0 calc(var(--spacing-5) + var(--crewlet-app-shell-gutter, 0px)) 0 var(--spacing-5);
|
|
437
448
|
border-bottom: 1px solid var(--color-border-default);
|
|
438
449
|
background: var(--color-surface-background);
|
|
439
450
|
}
|
|
@@ -616,7 +627,12 @@
|
|
|
616
627
|
}
|
|
617
628
|
|
|
618
629
|
/* THE TOP BAR'S GUTTER, 16px: the content's 12px stood every page's first
|
|
619
|
-
line 4px left of the title and the controls over it.
|
|
630
|
+
line 4px left of the title and the controls over it. The bar and the
|
|
631
|
+
content take it together. */
|
|
632
|
+
.crewlet-app-shell__topbar {
|
|
633
|
+
padding: 0 calc(var(--spacing-4) + var(--crewlet-app-shell-gutter, 0px)) 0 var(--spacing-4);
|
|
634
|
+
}
|
|
635
|
+
|
|
620
636
|
.crewlet-app-shell__content {
|
|
621
637
|
padding: var(--spacing-4) var(--spacing-4) var(--spacing-9);
|
|
622
638
|
}
|
|
@@ -662,10 +678,27 @@
|
|
|
662
678
|
transition: background var(--motion-duration-fast) var(--motion-easing-default);
|
|
663
679
|
}
|
|
664
680
|
|
|
665
|
-
/*
|
|
666
|
-
|
|
681
|
+
/*
|
|
682
|
+
* In the rail's foot, the account row reaches up across its own padding to
|
|
683
|
+
* half the foot's gap, to meet the row above (HitArea.css).
|
|
684
|
+
*
|
|
685
|
+
* AND IT STANDS ON THE NAV'S COLUMNS: the avatar centred on the column every
|
|
686
|
+
* nav glyph is centred on, and the name starting on the line every nav word
|
|
687
|
+
* starts on. On a 4px inset with an 8px gap a 26px avatar stood 2px left of
|
|
688
|
+
* the glyphs above it and the name 2px right of their words. The avatar's box
|
|
689
|
+
* takes a nav glyph's width (`sm`, 14px) and the badge is centred over it, so
|
|
690
|
+
* whatever size of badge a caller hands the row, it is centred where a glyph
|
|
691
|
+
* is, and the row takes the nav row's pad and its glyph-to-word gap.
|
|
692
|
+
*/
|
|
667
693
|
.crewlet-app-shell__rail-foot .crewlet-account-row__who {
|
|
668
694
|
--crewlet-hit-area-block-start: calc(var(--crewlet-rail-foot-gap) / 2 + var(--crewlet-account-row-pad));
|
|
695
|
+
gap: calc(var(--spacing-2) + var(--spacing-1) / 2);
|
|
696
|
+
padding-inline-start: var(--size-nav-row-pad);
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
.crewlet-app-shell__rail-foot .crewlet-account-row__avatar {
|
|
700
|
+
justify-content: center;
|
|
701
|
+
width: 14px;
|
|
669
702
|
}
|
|
670
703
|
|
|
671
704
|
/* The row as the reader's menu button: a button drawn as the link is. */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { ARTIFACT_BAR_LABELS, ArtifactBar, ArtifactVersionChip } from '../chunk-
|
|
1
|
+
export { ARTIFACT_BAR_LABELS, ArtifactBar, ArtifactVersionChip } from '../chunk-TZYFTC4M.js';
|
|
2
2
|
import '../chunk-4ISUIS6F.js';
|
|
3
3
|
import '../chunk-2QZ2VPHR.js';
|
|
4
4
|
import '../chunk-7SDUKCNW.js';
|
|
@@ -29,7 +29,12 @@
|
|
|
29
29
|
its place, and at a row's height of its own the line under it jumped by
|
|
30
30
|
three pixels between the gallery and the artifact opened from it. */
|
|
31
31
|
height: calc(var(--size-shell-topbar) - 1px);
|
|
32
|
-
|
|
32
|
+
/* THE SHELL TOP BAR'S INSET, the scroller's gutter at its end included: the
|
|
33
|
+
bar stands in that bar's place, and at a 12px inset of its own a create
|
|
34
|
+
page's controls ended 19px past the content under them, where every other
|
|
35
|
+
page's end over it. The same two steps as the top bar, 20px wide and 16px
|
|
36
|
+
under the shell's breakpoint (below). */
|
|
37
|
+
padding: 0 calc(var(--spacing-5) + var(--crewlet-app-shell-gutter, 0px)) 0 var(--spacing-5);
|
|
33
38
|
min-width: 0;
|
|
34
39
|
}
|
|
35
40
|
|
|
@@ -413,3 +418,10 @@
|
|
|
413
418
|
transition: none;
|
|
414
419
|
}
|
|
415
420
|
}
|
|
421
|
+
|
|
422
|
+
/* The shell's breakpoint, where its top bar and content take 16px. */
|
|
423
|
+
@media (width < 1024px) {
|
|
424
|
+
.crewlet-artifact-bar__row {
|
|
425
|
+
padding: 0 calc(var(--spacing-4) + var(--crewlet-app-shell-gutter, 0px)) 0 var(--spacing-4);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
export { ArtifactCard, ArtifactCardSkeleton, ArtifactPreviewGlyph } from '../chunk-
|
|
1
|
+
export { ArtifactCard, ArtifactCardSkeleton, ArtifactPreviewGlyph } from '../chunk-U2XAJONO.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
6
|
import '../chunk-UBZDYOCA.js';
|
|
7
|
-
import '../chunk-
|
|
7
|
+
import '../chunk-INHXF2CL.js';
|
|
8
8
|
import '../chunk-AV2DXAEL.js';
|
|
9
9
|
import '../chunk-5AQBPHZD.js';
|
|
10
10
|
import '../chunk-PZKHBB7D.js';
|
|
@@ -25,7 +25,9 @@ export interface ArtifactMakeRowProps {
|
|
|
25
25
|
* kind's glyph on its own tint, its name and what it is for, the whole item
|
|
26
26
|
* one link. A toolbar for making things rather than a hero: one line high on
|
|
27
27
|
* a wide page, the details dropped before a name is cut, and three across on
|
|
28
|
-
* a phone.
|
|
28
|
+
* a phone. However many kinds a reader is offered, the tray holds no empty
|
|
29
|
+
* cell: the line has a column per kind, and on a phone a short last row is
|
|
30
|
+
* centred, or four kinds stand two by two.
|
|
29
31
|
*
|
|
30
32
|
* THE TRAY IS A WORKBENCH, Crewlet's dotted field under the kinds the way the
|
|
31
33
|
* org chart's canvas sits under its seats, and an item lifts off it as a card
|
|
@@ -8,9 +8,16 @@
|
|
|
8
8
|
*
|
|
9
9
|
* THE TRAY SIZES ITSELF BY ITS OWN WIDTH, never the window's: it sits in a
|
|
10
10
|
* page column a sidebar narrows, so three steps are container queries on the
|
|
11
|
-
* tray. Under 560px three across
|
|
12
|
-
* line,
|
|
13
|
-
* the mark beside the name and what the kind is for under it.
|
|
11
|
+
* tray. Under 560px three across, each its mark over its name; from 560px
|
|
12
|
+
* every kind in one line, still mark over name, so a long name is never cut;
|
|
13
|
+
* from 920px the mark beside the name and what the kind is for under it.
|
|
14
|
+
*
|
|
15
|
+
* AND BY ITS OWN COUNT. A reader is offered the kinds their company runs, so
|
|
16
|
+
* a tray holds five as often as six, and a grid fixed at six columns left an
|
|
17
|
+
* empty sixth of dotted field at the end of the line, and three across left a
|
|
18
|
+
* hole after the fifth. The line takes one column per kind
|
|
19
|
+
* (`--crewlet-make-row-count`, set from the items), and the narrow tray fills
|
|
20
|
+
* its rows by the count (`data-count`): see the narrow step below.
|
|
14
21
|
*/
|
|
15
22
|
|
|
16
23
|
.crewlet-make-row {
|
|
@@ -28,7 +35,7 @@
|
|
|
28
35
|
.crewlet-make-row__list {
|
|
29
36
|
--crewlet-make-row-gap: var(--spacing-1);
|
|
30
37
|
display: grid;
|
|
31
|
-
grid-template-columns: repeat(
|
|
38
|
+
grid-template-columns: repeat(6, minmax(0, 1fr));
|
|
32
39
|
gap: var(--crewlet-make-row-gap);
|
|
33
40
|
margin: 0;
|
|
34
41
|
padding: var(--spacing-1);
|
|
@@ -109,9 +116,40 @@
|
|
|
109
116
|
line-height: 1.35;
|
|
110
117
|
}
|
|
111
118
|
|
|
119
|
+
/*
|
|
120
|
+
* THE NARROW TRAY, on six tracks, each kind two of them: three a row. A last
|
|
121
|
+
* row that is short is centred under the full one rather than left with a
|
|
122
|
+
* hole after it, so five kinds stand three and two, the two in the middle.
|
|
123
|
+
* Two and four kinds stand two a row, which fills every row, and one kind
|
|
124
|
+
* takes the tray.
|
|
125
|
+
*/
|
|
126
|
+
@container (width < 560px) {
|
|
127
|
+
.crewlet-make-row__cell {
|
|
128
|
+
grid-column: span 2;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/* One kind short of a full last row: the first of the two moves in a track. */
|
|
132
|
+
.crewlet-make-row__cell:nth-child(3n + 1):nth-last-child(2) {
|
|
133
|
+
grid-column: 2 / span 2;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/* A last row of one stands in the middle. */
|
|
137
|
+
.crewlet-make-row__cell:nth-child(3n + 1):last-child {
|
|
138
|
+
grid-column: 3 / span 2;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.crewlet-make-row__list:is([data-count='2'], [data-count='4']) > .crewlet-make-row__cell {
|
|
142
|
+
grid-column: span 3;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.crewlet-make-row__list[data-count='1'] > .crewlet-make-row__cell {
|
|
146
|
+
grid-column: span 6;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
112
150
|
@container (width >= 560px) {
|
|
113
151
|
.crewlet-make-row__list {
|
|
114
|
-
grid-template-columns: repeat(6, minmax(0, 1fr));
|
|
152
|
+
grid-template-columns: repeat(var(--crewlet-make-row-count, 6), minmax(0, 1fr));
|
|
115
153
|
}
|
|
116
154
|
|
|
117
155
|
.crewlet-make-row__item {
|
package/dist/AuthLayout/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { AuthLayout } from '../chunk-
|
|
1
|
+
export { AuthLayout } from '../chunk-S4DREXGM.js';
|
|
2
2
|
import '../chunk-7KBNFFM3.js';
|
|
3
|
-
import '../chunk-
|
|
3
|
+
import '../chunk-INHXF2CL.js';
|
|
4
4
|
import '../chunk-AV2DXAEL.js';
|
|
5
5
|
import '../chunk-BHHIIK3M.js';
|
|
6
6
|
import '../chunk-PQADV6P6.js';
|
package/dist/Card/Card.d.ts
CHANGED
|
@@ -105,10 +105,22 @@ export interface CardHeaderProps extends HTMLAttributes<HTMLDivElement> {
|
|
|
105
105
|
divided?: boolean | undefined;
|
|
106
106
|
/** A glyph before the title. Decoration: the title carries the meaning. */
|
|
107
107
|
icon?: ReactNode;
|
|
108
|
-
/**
|
|
108
|
+
/**
|
|
109
|
+
* How many of something the card is about. A count of zero is not drawn:
|
|
110
|
+
* the card's own empty state says there is nothing, and a "0" badge beside
|
|
111
|
+
* the title said it a second time.
|
|
112
|
+
*/
|
|
109
113
|
count?: number | string | undefined;
|
|
110
114
|
/** A second line under the title. It truncates; a title does not. */
|
|
111
115
|
subtitle?: ReactNode;
|
|
116
|
+
/**
|
|
117
|
+
* Where the subtitle stands. `beside` (the default) keeps the head one line
|
|
118
|
+
* and moves the subtitle under the title only on a card narrower than
|
|
119
|
+
* 480px; `below` always puts it under the title, for a row of cards of
|
|
120
|
+
* different widths (a wide card beside a narrow one) whose heads must stand
|
|
121
|
+
* at one height.
|
|
122
|
+
*/
|
|
123
|
+
subtitlePlacement?: 'beside' | 'below' | undefined;
|
|
112
124
|
/** The card's own controls, at the end of the header row. */
|
|
113
125
|
actions?: ReactNode;
|
|
114
126
|
}
|
|
@@ -159,7 +171,7 @@ export interface CardTitleProps extends HTMLAttributes<HTMLHeadingElement> {
|
|
|
159
171
|
truncate?: boolean | undefined;
|
|
160
172
|
}
|
|
161
173
|
export declare const Card: (({ variant, padding, interactive, rail, selected, as, href, asChild, className, children, ...rest }: CardProps) => import("react").JSX.Element) & {
|
|
162
|
-
Header: ({ divided, icon, count, subtitle, actions, className, children, ...rest }: CardHeaderProps) => import("react").JSX.Element;
|
|
174
|
+
Header: ({ divided, icon, count, subtitle, subtitlePlacement, actions, className, children, ...rest }: CardHeaderProps) => import("react").JSX.Element;
|
|
163
175
|
Body: ({ padding, className, children, ...rest }: CardSectionProps) => import("react").JSX.Element;
|
|
164
176
|
Footer: ({ variant, padding, className, children, ...rest }: CardFooterProps) => import("react").JSX.Element;
|
|
165
177
|
Title: ({ as, truncate, className, children, ...rest }: CardTitleProps) => import("react").JSX.Element;
|
package/dist/Card/index.js
CHANGED
|
@@ -452,6 +452,69 @@
|
|
|
452
452
|
min-width: 0;
|
|
453
453
|
}
|
|
454
454
|
|
|
455
|
+
/*
|
|
456
|
+
* ON A NARROW CARD THE SUBTITLE TAKES A LINE OF ITS OWN, under the title and
|
|
457
|
+
* the card's controls, and wraps there rather than ending.
|
|
458
|
+
*
|
|
459
|
+
* One line is right while the subtitle has room to say something beside the
|
|
460
|
+
* title. In a card under 480px wide it had none: on a phone an Agent seats
|
|
461
|
+
* card drew "Resets today at midnight, the week…" in 202px of a 361px
|
|
462
|
+
* sentence, and the half it cut was the half that said when. On its own line
|
|
463
|
+
* the subtitle has the head's whole width, and the title and the controls
|
|
464
|
+
* keep the first.
|
|
465
|
+
*
|
|
466
|
+
* THE CARD IS THE CONTAINER, and only a card whose head has a subtitle, since
|
|
467
|
+
* that is the one card this changes. Inline-size containment takes a card's
|
|
468
|
+
* width from where it stands, never from its contents, which is how a panel
|
|
469
|
+
* is laid out anyway; a card that sized itself to its contents (a tile in a
|
|
470
|
+
* row that does not stretch it) and carried no subtitle is untouched.
|
|
471
|
+
*
|
|
472
|
+
* THE NAME BLOCK TAKES THE FIRST LINE'S ROOM rather than its own width. With
|
|
473
|
+
* the row free to wrap, a title wider than what the controls leave would
|
|
474
|
+
* otherwise push the controls onto a second line; from a zero basis it grows
|
|
475
|
+
* into the room they leave and clips there, exactly as the one-line head does.
|
|
476
|
+
*/
|
|
477
|
+
.crewlet-card:has(> .crewlet-card__header > .crewlet-card__subtitle) {
|
|
478
|
+
container: crewlet-card / inline-size;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
@container crewlet-card (width < 480px) {
|
|
482
|
+
.crewlet-card__header:has(> .crewlet-card__subtitle) {
|
|
483
|
+
flex-wrap: wrap;
|
|
484
|
+
row-gap: var(--spacing-1);
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
.crewlet-card__header:has(> .crewlet-card__subtitle) > .crewlet-card__header-main {
|
|
488
|
+
flex: 1 1 0;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
.crewlet-card__header > .crewlet-card__subtitle {
|
|
492
|
+
order: 1;
|
|
493
|
+
flex: 1 1 100%;
|
|
494
|
+
white-space: normal;
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
/*
|
|
499
|
+
* STACKED, ASKED FOR: the subtitle under the title at every width, the shape
|
|
500
|
+
* the narrow step above draws, for a row of cards of different widths whose
|
|
501
|
+
* heads have to stand at one height rather than one inline and one stacked.
|
|
502
|
+
*/
|
|
503
|
+
.crewlet-card__header--stacked {
|
|
504
|
+
flex-wrap: wrap;
|
|
505
|
+
row-gap: var(--spacing-1);
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
.crewlet-card__header--stacked > .crewlet-card__header-main {
|
|
509
|
+
flex: 1 1 0;
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
.crewlet-card__header--stacked > .crewlet-card__subtitle {
|
|
513
|
+
order: 1;
|
|
514
|
+
flex: 1 1 100%;
|
|
515
|
+
white-space: normal;
|
|
516
|
+
}
|
|
517
|
+
|
|
455
518
|
.crewlet-card__description {
|
|
456
519
|
margin: 0;
|
|
457
520
|
font-size: var(--font-size-compact);
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type HTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
import { type HeadingLevel } from '../utils/headingLevel.js';
|
|
3
|
+
export type CatalogTileElement = 'article' | 'li' | 'div';
|
|
4
|
+
export interface CatalogTileProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {
|
|
5
|
+
/** The element the tile is: an `li` in a `TileGrid as="ul"`. */
|
|
6
|
+
as?: CatalogTileElement | undefined;
|
|
7
|
+
/**
|
|
8
|
+
* What the entry is told apart by before its name is read: a `VendorMark`,
|
|
9
|
+
* a glyph. Drawn in the tile's mark well, at one size and on one ground for
|
|
10
|
+
* every tile, and hidden from assistive technology: the name is what is read.
|
|
11
|
+
*/
|
|
12
|
+
mark: ReactNode;
|
|
13
|
+
/** The entry's name, as the tile's heading. */
|
|
14
|
+
title: ReactNode;
|
|
15
|
+
/** Overrides the level the name is rendered at. */
|
|
16
|
+
headingLevel?: HeadingLevel | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* The entry's state, as a `Tag`, ONLY when the state is worth reading: On,
|
|
19
|
+
* Connected, Needs attention, Coming soon. An entry in its resting state
|
|
20
|
+
* (available, not set up) carries none, and its name stands centred beside
|
|
21
|
+
* its mark; a pill under every name is a column a reader learns to skip.
|
|
22
|
+
*/
|
|
23
|
+
status?: ReactNode;
|
|
24
|
+
/** One sentence: what the entry is for, or what is owed when something is. */
|
|
25
|
+
description?: ReactNode;
|
|
26
|
+
/** A quiet fact at the foot (`2 agents · 14 deliveries`). */
|
|
27
|
+
meta?: ReactNode;
|
|
28
|
+
/** The tile's one control, at the foot's end. */
|
|
29
|
+
action?: ReactNode;
|
|
30
|
+
/**
|
|
31
|
+
* Available but not set up: the tile sits one rung lower, on the page's own
|
|
32
|
+
* ground, rather than on the card's. Its text and its mark keep their
|
|
33
|
+
* strength, because a tile not yet set up is the one a reader came to set up.
|
|
34
|
+
*/
|
|
35
|
+
quiet?: boolean | undefined;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* One entry in a catalogue: its mark, its name, its state when it has one, a
|
|
39
|
+
* sentence, and a foot with a quiet fact and one action.
|
|
40
|
+
*
|
|
41
|
+
* EVERY TILE IN A ROW IS ONE SHAPE. The sentence reserves two lines and takes
|
|
42
|
+
* what is left of the tile's height, so tiles stretched to one row height in a
|
|
43
|
+
* `TileGrid` keep their feet on one line; a tile with neither a fact nor an
|
|
44
|
+
* action draws no foot at all, since a rule with nothing under it reads as a
|
|
45
|
+
* missing control.
|
|
46
|
+
*/
|
|
47
|
+
export declare function CatalogTile({ as: Element, mark, title, headingLevel, status, description, meta, action, quiet, className, ...rest }: CatalogTileProps): import("react").JSX.Element;
|