@crewlethq/ui 0.48.3 → 0.49.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 +56 -0
- package/dist/AgentHandoffPanel/index.js +3 -3
- package/dist/ArrangeList/index.js +2 -2
- package/dist/ArtifactBar/index.js +4 -4
- package/dist/{ArtifactBar-6PGWGKN2.css → ArtifactBar-UMZCTARR.css} +9 -0
- package/dist/ArtifactCard/ArtifactCard.d.ts +30 -1
- package/dist/ArtifactCard/index.js +10 -3
- package/dist/{ArtifactCard-OGTMO2KI.css → ArtifactCard-SOB63NV5.css} +72 -1
- package/dist/ArtifactCover/index.js +2 -2
- package/dist/ArtifactIcon/index.js +2 -2
- package/dist/ArtifactKindGlyph/ArtifactKindGlyph.d.ts +7 -3
- package/dist/ArtifactKindGlyph/index.js +1 -1
- package/dist/ArtifactKindIllustration/ArtifactKindIllustration.d.ts +4 -3
- package/dist/ArtifactKindIllustration/index.js +1 -1
- package/dist/{ArtifactKinds-CVD3FCYO.css → ArtifactKinds-O3CALPVX.css} +1 -0
- package/dist/ArtifactMakeRow/index.js +2 -2
- package/dist/ArtifactNameCell/ArtifactNameCell.d.ts +14 -1
- package/dist/ArtifactNameCell/index.d.ts +1 -1
- package/dist/ArtifactNameCell/index.js +2 -2
- package/dist/{ArtifactNameCell-RTVP4LO4.css → ArtifactNameCell-3AHLUSE5.css} +12 -0
- package/dist/BrandChip/BrandChip.d.ts +26 -0
- package/dist/BrandChip/index.d.ts +3 -0
- package/dist/BrandChip/index.js +2 -0
- package/dist/BrandChip-SQWBC2WU.css +81 -0
- package/dist/BrandSample/BrandSample.d.ts +75 -0
- package/dist/BrandSample/index.d.ts +3 -0
- package/dist/BrandSample/index.js +5 -0
- package/dist/BrandSample-G5V7GKR2.css +185 -0
- package/dist/BrandScope/BrandScope.d.ts +61 -0
- package/dist/BrandScope/index.d.ts +4 -0
- package/dist/BrandScope/index.js +4 -0
- package/dist/BrandScope-H2KZHGT7.css +29 -0
- package/dist/Checkbox/Checkbox.d.ts +8 -0
- package/dist/Checkbox/index.js +1 -1
- package/dist/{Checkbox-ALWG3WV2.css → Checkbox-MB22OW6P.css} +18 -0
- package/dist/ColorField/ColorField.d.ts +63 -0
- package/dist/ColorField/index.d.ts +3 -0
- package/dist/ColorField/index.js +11 -0
- package/dist/ColorField-2OIOWT3Z.css +68 -0
- package/dist/ColorSwatch/ColorSwatch.d.ts +43 -0
- package/dist/ColorSwatch/index.d.ts +3 -0
- package/dist/ColorSwatch/index.js +9 -0
- package/dist/ColorSwatch-DNMUFHNS.css +83 -0
- package/dist/Combobox/Combobox.d.ts +45 -4
- package/dist/Combobox/index.d.ts +1 -1
- package/dist/Combobox/index.js +1 -1
- package/dist/Combobox-GBCWXWEB.css +163 -0
- package/dist/CommandPalette/index.js +3 -3
- package/dist/CommentThread/index.js +3 -3
- package/dist/Composer/index.js +2 -2
- package/dist/ContrastBadge/ContrastBadge.d.ts +63 -0
- package/dist/ContrastBadge/index.d.ts +3 -0
- package/dist/ContrastBadge/index.js +6 -0
- package/dist/ContrastBadge-CBZPGG3G.css +47 -0
- package/dist/DataGrid/DataGrid.d.ts +28 -1
- package/dist/DataGrid/index.js +8 -1
- package/dist/{DataGrid-AQKPJD7W.css → DataGrid-VNGQESJA.css} +15 -0
- package/dist/DataTable/index.js +3 -3
- package/dist/DataView/index.js +8 -8
- package/dist/DateTimePicker/index.js +2 -2
- package/dist/FolderTile/FolderTile.d.ts +91 -0
- package/dist/FolderTile/index.d.ts +3 -0
- package/dist/FolderTile/index.js +7 -0
- package/dist/FolderTile-FDT5Y63Z.css +231 -0
- package/dist/LinkInterstitial/index.js +2 -2
- package/dist/ListInput/index.js +2 -2
- package/dist/LogoSlot/LogoSlot.d.ts +84 -0
- package/dist/LogoSlot/index.d.ts +3 -0
- package/dist/LogoSlot/index.js +9 -0
- package/dist/LogoSlot-T2UFOJXU.css +159 -0
- package/dist/Modal/Modal.d.ts +13 -0
- package/dist/Modal/index.js +1 -1
- package/dist/{Modal-TOEWHDCQ.css → Modal-3HMP7WAZ.css} +30 -0
- package/dist/PresenterView/index.js +2 -2
- package/dist/PrincipalPicker/index.js +2 -2
- package/dist/SelectionBar/SelectionBar.d.ts +50 -0
- package/dist/SelectionBar/index.d.ts +3 -0
- package/dist/SelectionBar/index.js +9 -0
- package/dist/SelectionBar-XPWKUOSC.css +61 -0
- package/dist/ShareDialog/index.js +3 -3
- package/dist/SheetColumnEditor/index.js +3 -3
- package/dist/SheetGrid/index.js +2 -2
- package/dist/Switcher/index.js +2 -2
- package/dist/ThemeGallery/ThemeGallery.d.ts +13 -2
- package/dist/ThemeGallery/index.js +3 -1
- package/dist/{ThemeGallery-X35Y25EX.css → ThemeGallery-UEFZRT6W.css} +21 -0
- package/dist/TimeWindowPicker/index.js +2 -2
- package/dist/TypeSpecimen/TypeSpecimen.d.ts +49 -0
- package/dist/TypeSpecimen/index.d.ts +3 -0
- package/dist/TypeSpecimen/index.js +3 -0
- package/dist/TypeSpecimen-WK6YNHL7.css +96 -0
- package/dist/chunk-5SGHW42B.js +23 -0
- package/dist/{chunk-ILDNJHRU.js → chunk-AVL52EME.js} +1 -1
- package/dist/chunk-B235ANDO.js +66 -0
- package/dist/{chunk-2MYSESZF.js → chunk-FB5CFQTG.js} +82 -12
- package/dist/{chunk-DY4DQ7EB.js → chunk-GP4YWZFO.js} +1 -1
- package/dist/{chunk-LIJQT74Y.js → chunk-H55D66IK.js} +1 -1
- package/dist/{chunk-6EBGPCAW.js → chunk-H7NMJ5AI.js} +1 -1
- package/dist/chunk-ITI2Z44C.js +139 -0
- package/dist/{chunk-P5VGSVWG.js → chunk-J24Q4HTD.js} +17 -8
- package/dist/{chunk-5EBDOE3C.js → chunk-JFDIMO3A.js} +1 -1
- package/dist/chunk-JKAFEFFC.js +44 -0
- package/dist/{chunk-32TGEMQQ.js → chunk-KHZYAEGZ.js} +1 -1
- package/dist/chunk-M4QM477B.js +80 -0
- package/dist/{chunk-TWZEWXNW.js → chunk-MIEBOO7Y.js} +2 -2
- package/dist/{chunk-SMOFYZJ5.js → chunk-NAWUXCBC.js} +3 -3
- package/dist/{chunk-F57N6ZJG.js → chunk-NCHKKYPQ.js} +5 -2
- package/dist/chunk-OCRVY42T.js +50 -0
- package/dist/chunk-OEEYL2CM.js +73 -0
- package/dist/chunk-P3OIM6OC.js +38 -0
- package/dist/{chunk-FWBKMPNR.js → chunk-P3QWT5VR.js} +1 -1
- package/dist/chunk-P5JBDHWC.js +206 -0
- package/dist/{chunk-OKE5YSLD.js → chunk-Q44X36QC.js} +79 -35
- package/dist/{chunk-R2IBCEU6.js → chunk-R3BA3C4Y.js} +2 -2
- package/dist/{chunk-CE2THTQR.js → chunk-RSKW25Y5.js} +4 -3
- package/dist/{chunk-UBZDYOCA.js → chunk-RV6XB5UV.js} +12 -1
- package/dist/{chunk-E4BOVKNJ.js → chunk-UTESMBPL.js} +5 -3
- package/dist/chunk-UZMNR366.js +9 -0
- package/dist/{chunk-CWKWMIIJ.js → chunk-V7GOOXPK.js} +1 -1
- package/dist/{chunk-7JED2NYP.js → chunk-VBIM6HFC.js} +1 -1
- package/dist/{chunk-U4HOKU6P.js → chunk-VN47PYUF.js} +5 -5
- package/dist/{chunk-MUQJCH2Y.js → chunk-VTSJMDGP.js} +2 -2
- package/dist/chunk-W6FOEBIL.js +119 -0
- package/dist/chunk-WLSEAIVC.js +48 -0
- package/dist/{chunk-AS2BMY3E.js → chunk-WQ7S7CKZ.js} +2 -2
- package/dist/{chunk-6AKG2VLR.js → chunk-YCC2S7DF.js} +4 -1
- package/dist/chunk-ZH77BXMA.js +14 -0
- package/dist/generated/index.d.ts +10 -0
- package/dist/generated/index.js +80 -68
- package/dist/index.js +80 -68
- package/dist/styles.css +1414 -85
- package/dist/utils/fontFamily.d.ts +29 -0
- package/dist/utils/hexColour.d.ts +12 -0
- package/package.json +3 -3
- package/scripts/check-css-variables.mjs +18 -2
- package/dist/Combobox-YDONYDTM.css +0 -81
- package/dist/chunk-OOJTPR7N.js +0 -137
- package/dist/{chunk-245IXG5P.js → chunk-3WMOEGEL.js} +0 -0
- package/dist/{chunk-ISDEXIXH.js → chunk-E6HXFFWO.js} +1 -1
- package/dist/{chunk-6R5BSA36.js → chunk-GHY63X4C.js} +1 -1
- package/dist/{chunk-ICVS3U4S.js → chunk-PGR2PKH6.js} +1 -1
- package/dist/{chunk-VKFG4FLE.js → chunk-R6R2UHVG.js} +1 -1
- package/dist/{chunk-OO7QJCJQ.js → chunk-WXOYHVWG.js} +1 -1
- package/dist/{chunk-UFXLNC2N.js → chunk-ZFM5L7M4.js} +1 -1
package/README.md
CHANGED
|
@@ -204,6 +204,62 @@ 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.49.0
|
|
208
|
+
|
|
209
|
+
The pieces of a company's brand and of the folders artifacts are filed in.
|
|
210
|
+
|
|
211
|
+
**`@crewlethq/icons` adds four glyphs**: `swatch-book` (`SwatchBookGlyph`) for a company's brand, `blend` (`BlendGlyph`) for its colours, `badge-check` (`BadgeCheckGlyph`) for an artifact drawn in the current brand, and `folder-open` (`FolderOpenGlyph`) for a folder with nothing in it, or nothing the reader can open. Each is vendored from the pinned `lucide-static`; see the icons package's `glyphs/README.md`.
|
|
212
|
+
|
|
213
|
+
**`ArtifactKind` takes `brand`**, a company's brand kit. `ARTIFACT_KINDS` lists it last, in the engine's order; `ArtifactKindGlyph` draws it with `swatch-book`; `crewlet-kind--brand` tints it in the kind's own orchid (`--color-artifact-kind-brand`, below); `ArtifactKindIllustration` and `ArtifactKindGround` draw a mark over a row of swatches; and `ArtifactCard` and `ArtifactNameCell` label it "Brand". What to change: a `Record<ArtifactKind, ...>` of your own, and a full `kinds` label set passed to either component, needs a `brand` key.
|
|
214
|
+
|
|
215
|
+
**`@crewlethq/tokens` adds `--color-artifact-kind-brand`** with its `-ink`, `-fill` and `-line` steps: `#cc7bd1` in dark and `#8f3884` in light, an orchid apart from design's purple and HTML's rose. The six node hues each already draw a kind, so brand is the one kind with a hue of its own, declared by every theme; the palette suite now measures every kind's hue as a mark, its ink on its own fill, and every pair of kind hues dE 8 apart. See the tokens README.
|
|
216
|
+
|
|
217
|
+
**`@crewlethq/tokens` exports the WCAG contrast maths at runtime**: `parseHex` (a `#rrggbb` value as channels, or `null`), `contrast` (the ratio between two colours, 1 to 21, unrounded), `luminance`, the frozen floors `WCAG_CONTRAST` (`aa` 4.5, `aaLarge` 3, `aaa` 7, `aaaLarge` 4.5) and the `Rgb` type. They are the functions the palette suite measures with, not copies, for an interface that shows whether two colours a person chose read on each other.
|
|
218
|
+
|
|
219
|
+
**`@crewlethq/artifact-kit` reads a company's brand from `--brand-*` input slots.** The kit's own tokens (`--color-brand-accent` and its hover, press, ink, soft fills and deep stop, the selected edge, the label on the accent, the quiet link, the glow, the grounds, the body text and the faces) read `--brand-primary`, `--brand-primary-on-dark`, `--brand-secondary`, `--brand-text`, `--brand-light-ground`, `--brand-dark-ground`, `--brand-font-heading` and `--brand-font-body`, mixing the family from one colour with `color-mix()` in each mode, so a page already written with kit tokens follows the brand. With no slot set every token is the theme's own value, under every theme. The `crewlet-logo` class draws the brand's logo from `--brand-logo-primary`, `--brand-logo-on-dark` or `--brand-logo-mark` (`data-variant`), at its ratio, choosing the on-dark logo in dark mode where there is one and drawing nothing where there is none. An engine-generated brand stylesheet defines only `--brand-*` custom properties and `@font-face` rules. See the kit README.
|
|
220
|
+
|
|
221
|
+
**`FolderTile` is new**: a folder in a gallery, shorter than an artifact's card and with no preview, the `folder` glyph on a neutral tint, the name on one line (the whole of it on hover), who can see it (`visibility`, an `ArtifactAccessLabel` with the folder's word) and what the reader can open inside (`contents`), with a More menu (`actions`) beside its link. The whole tile is one link. Who can see it and what is inside wrap onto a second line where the tile is narrow (four or three across a laptop's page) and are never cut; only the name is cut to one line, with the whole of it on hover. A folder holding nothing the reader can open says "Nothing you can open yet", never "Empty". `size="row"` is the full width, 44px row a phone takes, and a tile takes that shape by itself under the phone breakpoint. `selected` and `dropTarget` draw the chosen and the drop target states; dragging is the host's to drive. `describeFolderContents` is the one phrasing of the count ("12 artifacts · 2 folders").
|
|
222
|
+
|
|
223
|
+
**`ArtifactNameCell` takes `kind="folder"`**: a folder's row in the list, the folder glyph on a neutral tint and the word "Folder" over what is inside (`detail`, from `describeFolderContents`).
|
|
224
|
+
|
|
225
|
+
**`SelectionBar` is new**: what is picked and what can be done to all of it, the count ("3 selected"), the bulk actions as children and Clear, one toolbar in the tab order. It sticks under the top of the scroller (`--crewlet-selection-bar-top`) and docks at the foot of the screen under the phone breakpoint. The count is said politely through the shell's `Announcer` as it changes, and clearing the last pick says so. Nothing is drawn at zero, and `returnFocusRef` is where focus goes once Clear takes the bar away.
|
|
226
|
+
|
|
227
|
+
**`ArtifactCard` takes `selectable`, `selected`, `selecting` and `onSelectedChange`**: a box on the preview's foot, opposite the kind's badge and drawn as its twin (a cover's own title starts at the top corner, which the box would hide), shown on hover, on focus, on a screen with no hover and always once the card is picked, with the selected edge and fill on a picked card. While the gallery is choosing (`selecting`) every box shows and a press anywhere on the card ticks it rather than opening it. `onSelectedChange` says whether Shift was held (`range`), so the host that keeps the selection draws the range.
|
|
228
|
+
|
|
229
|
+
**`DataGrid` takes `selection`**: a box before the first column on every row and one in the head over every row drawn, mixed while some are picked, keyed by `rowKey` and controlled. Shift with a box sets every row between it and the box pressed before it, in drawn order. `isSelectable` disables the box of a row the reader cannot act on. A picked row takes the selected fill, apart from `isSelected`, the row the reader is on. The column is the grid's own: it is never in a column set and never gives way.
|
|
230
|
+
|
|
231
|
+
**`ThemeGallery` can draw a theme's `tag` on its card**, where the theme asks for it with `tagTone`: `'quiet'` draws a caption under the name (cut to one line, the whole of it on hover), and `'brand'` the accent's pill, for the company's own theme among the product's ("Your company brand" on the slides create page). A theme with no `tagTone` keeps its tag in its accessible name only and draws nothing, so the product's own theme picker looks exactly as it did. The card's name carries the tag once either way, so it is never read twice, and `tag` is now optional: a theme without one is its name alone.
|
|
232
|
+
|
|
233
|
+
**`ArtifactBar`'s read-only title is cut with an ellipsis**: its words sit in a block of their own (`.crewlet-artifact-bar__text`) that takes the ellipsis the flex heading around them could not, so a long title ends in "…" rather than being clipped mid-word, with the whole title on hover. A renamable title is unchanged.
|
|
234
|
+
|
|
235
|
+
**`Combobox` takes `inline`**: the list is the surface's body rather than a popup, for a picker whose list is the point of the dialog it sits in (Move to…). It is always on screen, in the flow under the field and filtered by it (no popover, no portal), so losing focus closes nothing and the dialog never changes size under the pointer between a press on Cancel and its release. Its box keeps one height, `rows` one-line rows (six by default), whatever the filter leaves in it, and a filter that leaves nothing says `emptyMessage` in its own row, announced politely. The field is an ARIA combobox controlling the inline listbox through `aria-activedescendant`: the arrows step over a disabled row, the highlight lands on the first match as the filter changes, Enter and a press take a row (focus stays in the field), and Home and End reach the ends while the field is empty and are the caret's once it holds text. Escape is never its own, so it reaches the dialog. `chosen` marks the option picked so far as selected, with a tick, and starts the highlight on it. `ComboboxProps` is now a union of `ComboboxPopupProps` (as before, with `open` and `onOpenChange`) and `ComboboxInlineProps`; an `interface` that extended `ComboboxProps` extends `ComboboxPopupProps` instead.
|
|
236
|
+
|
|
237
|
+
**`Modal` takes `phoneSheet`**: under the phone breakpoint the dialog takes the whole window as a full-height sheet, with no inset and no corners, the head and the foot standing still while the body scrolls between them and the foot clear of the home indicator, for a dialog whose body is a long list a thumb works through (Move to…). It is opt-in, so every other dialog keeps its shape on a phone; a prompt stays a prompt, and a side sheet is already the full width there.
|
|
238
|
+
|
|
239
|
+
**`Checkbox` takes `hideLabel`**: the box alone on a target the pointer floor allows, its label said and not drawn, for a card or a row that already shows what the box picks.
|
|
240
|
+
|
|
241
|
+
**`LogoSlot` is new**: one of a brand's logos on the ground it is made for, the brand's own ground colour or the product's sheet for that mode, whatever mode the page is in, with a dashed clear-space guide inked in whichever palette's text reads on that ground. Editable, it takes one file through a `FilePickButton` or a drop on the slot (`FileDrop`), offers Replace and Remove, spins while `uploading`, and draws and announces the engine's refusal (`error`). A reader gets a `download` slot beside its name.
|
|
242
|
+
|
|
243
|
+
**`ColorField` is new**: a colour a person chooses, a hex field beside a swatch that is the platform's colour picker. It reports a colour only once it reads as `#` and six hex digits, lowercased, and refuses anything else when the reader leaves the field, with a sentence saying what right looks like.
|
|
244
|
+
|
|
245
|
+
**`ColorSwatch` is new**: one colour of a brand, a chip of it with its own edge, its role, its value and a copy control that says whether the value landed. A role with no colour is the hatch of none.
|
|
246
|
+
|
|
247
|
+
**`ContrastBadge` is new**: whether one colour reads on another, a sample of the pair, the ratio said as "4.49 to 1", and the level in words and a glyph (AAA, AA, AA large text, Fails). It measures with `@crewlethq/tokens`' `contrast()` and its `WCAG_CONTRAST` floors, compares the ratio unrounded and prints it cut down, so it never claims a floor a pair misses. `scale="large"` holds large text and marks to their own floors. `contrastRatio`, `contrastLevel` and `formatContrastRatio` are exported for a dialog that lists pairs.
|
|
248
|
+
|
|
249
|
+
**`TypeSpecimen` is new**: a face shown in itself, its label ("Heading") and name in the interface's type, then "Aa" and a line set in the face, always falling back to the package's sans.
|
|
250
|
+
|
|
251
|
+
**`BrandChip` is new**: the company's brand as a small link, its mark, its name and a chevron, with the brand glyph standing in before a brand exists ("Set up your brand").
|
|
252
|
+
|
|
253
|
+
**`BrandSample` is new**: a company's brand, drawn, for the preview beside Company › Brand, a brand kit's own view and its gallery cover. `kind="doc"` is a doc's opening (the logo on its ground, a heading in the heading face, an accent rule, a sentence with a drawn link and a quiet byline); `kind="slide"` is a title slide (the mark, an accent bar in the primary and the secondary, a two-line heading and a footer with the company's name). It is a `BrandScope` pinned to its own `mode`, so it draws with the artifact kit's own mapping rather than a second reading of it, and a light and a dark sample sit side by side whatever the page is in; a role it is not given, or given as anything but `#rrggbb`, takes the default theme's value for that mode. `headingFamily` and `bodyFamily` are handed on only when they read as family names. It keeps a 16:9 frame and sets every length against its own width, so the same drawing reads as a cover and as an aside; `--crewlet-brand-sample-radius` sets its corner. It is an image to assistive technology, named by what it shows.
|
|
254
|
+
|
|
255
|
+
**`BrandScope` is new**: a region of the page in a company's brand (a doc, a board, a preview) while the chrome around it keeps the product's look. It sets the brand mapping's `--brand-*` inputs (each colour only as `#rrggbb`, each family list only when it reads as family names) on an outer element that draws no box, and the public tokens inside its box (the accent and its hover, press, ink and soft fills, the label on it, the selected edge, the grounds, the body text and the two faces) take the brand's values, following the page's light or dark, or a pinned `mode`. The focus ring stays the theme's. The mapping is `@crewlethq/tokens/css/brand-scope`, built from the one source the artifact kit's brand layer is built from, and the component imports it itself; an application that loads this package through `styles.css` alone imports that stylesheet too. `brandScopeInputs` is the gate, exported.
|
|
256
|
+
|
|
257
|
+
**`@crewlethq/tokens` carries the brand mapping**, which used to live in the artifact kit: `stylesheets/brand.css` is the one source, published as `css/brand` (the kit's root layer, which `@crewlethq/artifact-kit` now bundles from there) and, with its selectors moved onto `.crewlet-brand-scope__layer`, as `css/brand-scope`. The build accepts the mapping under its three root selectors only, so a rule reaches both stylesheets or neither, and `brandSlots`, `brandThemeName` and `parseBrandLayer` read its contract for the kit's build and the suites. A body face alone now sets the headings explicitly (`--brand-font-body` before the theme's display face), and the dark mode names the brand's text step as `initial`, so every mode declares the same steps.
|
|
258
|
+
|
|
259
|
+
**`TypeSpecimen` refuses a `fontFamily` that is not a list of family names** and draws the face by its name instead, through the same family grammar `BrandSample` and `BrandScope` use. The grammar takes every list the engine writes for a brand's face (the kit faces, the system stacks, and an uploaded family quoted in front of the system sans stack): a bare name may be a vendor identifier such as `-apple-system`, and a list holds up to eleven names, the engine's longest stack with one family registered in front of it. A `var()` other than the package's family tokens, a `url()`, a CSS-wide keyword, a name opening on two hyphens or a digit, and any punctuation are still refused, and the list falls back to the package's face.
|
|
260
|
+
|
|
261
|
+
Every colour a person chose reaches a stylesheet through one custom property per part, and only after it has passed `#rrggbb`.
|
|
262
|
+
|
|
207
263
|
## Changes in 0.48.3
|
|
208
264
|
|
|
209
265
|
**The account row in a rail's foot is slimmer, its controls stand as tall as it, and the foot gives it room.** In `AppShell.Rail`'s foot, `AccountRow` stands at 42px, half a spacing step under the large control step (`calc(var(--size-control-lg) - var(--spacing-1) / 2)`, exposed as `--crewlet-account-row-height`), where it stood 44px, with half a step above and below its two lines where it had a whole one. The room around it grows instead: the row is held one step off the foot's edge above and below (`--crewlet-account-row-pad`, from none), so the block reads less cramped while the row itself is slimmer. It stops at 42px because the medium badge's ring (1.5px, 2px outside the 32px badge) takes 39px, and 42px keeps it 1.5px clear of the row's hover fill. The controls beside the link (Settings, Preferences, or any `IconButton` or `IconButtonLink` in `actions`) take the row's height and keep their own width and glyph, so their hover fill meets the row's top and bottom where a 26px square floated in its middle. Measured in a 236px rail with Settings and Preferences beside the link: the row is 42px (from 44px), each control 26px by 42px (from 26px by 26px) with its 12px glyph centred, the name and the detail keep 116px, there is 8px between the row and the foot's edge above and below (from 4px), the foot holding the account row alone is 59px (from 53px), and the ring stands 1.5px inside the row's edge (from 2.5px). Every target stays over 24px at every density. Outside a rail's foot the row and its controls are unchanged.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
export { AGENT_HANDOFF_LABELS, AgentHandoffPanel } from '../chunk-
|
|
1
|
+
export { AGENT_HANDOFF_LABELS, AgentHandoffPanel } from '../chunk-V7GOOXPK.js';
|
|
2
2
|
import '../chunk-AUQPBL4O.js';
|
|
3
3
|
import '../chunk-JQ7IFSF6.js';
|
|
4
4
|
import '../chunk-OGXHZHRX.js';
|
|
5
|
-
import '../chunk-
|
|
5
|
+
import '../chunk-GHY63X4C.js';
|
|
6
6
|
import '../chunk-NBDN5JZV.js';
|
|
7
|
+
import '../chunk-SMBKXWML.js';
|
|
7
8
|
import '../chunk-EXRRTKWT.js';
|
|
8
9
|
import '../chunk-XCUUI7E7.js';
|
|
9
|
-
import '../chunk-SMBKXWML.js';
|
|
10
10
|
import '../chunk-FZVJDJFN.js';
|
|
11
11
|
import '../chunk-BHHIIK3M.js';
|
|
12
12
|
import '../chunk-PQADV6P6.js';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { ArrangeList, DEFAULT_ARRANGE_LABELS } from '../chunk-
|
|
1
|
+
export { ArrangeList, DEFAULT_ARRANGE_LABELS } from '../chunk-H55D66IK.js';
|
|
2
2
|
import '../chunk-A722MUNR.js';
|
|
3
3
|
import '../chunk-XJ2QEBMM.js';
|
|
4
|
-
import '../chunk-
|
|
4
|
+
import '../chunk-NCHKKYPQ.js';
|
|
5
5
|
import '../chunk-EXRRTKWT.js';
|
|
6
6
|
import '../chunk-XCUUI7E7.js';
|
|
7
7
|
import '../chunk-PQADV6P6.js';
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
export { ARTIFACT_BAR_LABELS, ArtifactBar, ArtifactVersionChip } from '../chunk-
|
|
1
|
+
export { ARTIFACT_BAR_LABELS, ArtifactBar, ArtifactVersionChip } from '../chunk-VN47PYUF.js';
|
|
2
2
|
import '../chunk-OOC7Q67K.js';
|
|
3
|
+
import '../chunk-I33UIUZD.js';
|
|
3
4
|
import '../chunk-6FVGSWLS.js';
|
|
4
5
|
import '../chunk-ILFEWRLG.js';
|
|
5
6
|
import '../chunk-WIATRXEJ.js';
|
|
6
7
|
import '../chunk-EGMQURBR.js';
|
|
7
|
-
import '../chunk-
|
|
8
|
-
import '../chunk-
|
|
9
|
-
import '../chunk-CE2THTQR.js';
|
|
8
|
+
import '../chunk-AVL52EME.js';
|
|
9
|
+
import '../chunk-RSKW25Y5.js';
|
|
10
10
|
import '../chunk-SMBKXWML.js';
|
|
11
11
|
import '../chunk-BHHIIK3M.js';
|
|
12
12
|
import '../chunk-TMM32U7D.js';
|
|
@@ -104,6 +104,15 @@
|
|
|
104
104
|
overflow: visible;
|
|
105
105
|
}
|
|
106
106
|
|
|
107
|
+
/* A read-only title's words: the block that takes the ellipsis, which the
|
|
108
|
+
flex heading around it cannot. */
|
|
109
|
+
.crewlet-artifact-bar__text {
|
|
110
|
+
min-width: 0;
|
|
111
|
+
overflow: hidden;
|
|
112
|
+
text-overflow: ellipsis;
|
|
113
|
+
white-space: nowrap;
|
|
114
|
+
}
|
|
115
|
+
|
|
107
116
|
.crewlet-artifact-bar__rename {
|
|
108
117
|
min-width: 0;
|
|
109
118
|
max-width: 100%;
|
|
@@ -28,6 +28,17 @@ export interface ArtifactCardLabels {
|
|
|
28
28
|
access: Record<ArtifactAccess, string>;
|
|
29
29
|
/** Who made it, after the time: "by Maya". */
|
|
30
30
|
by: (name: string) => string;
|
|
31
|
+
/** The selection box's name: "Select Vendor scorecard". */
|
|
32
|
+
select: (title: string) => string;
|
|
33
|
+
}
|
|
34
|
+
/** How a pick was made, for a host that keeps the selection across a gallery. */
|
|
35
|
+
export interface ArtifactCardSelectionChange {
|
|
36
|
+
/**
|
|
37
|
+
* The reader held Shift: they are asking for every card between the one
|
|
38
|
+
* they picked last and this one. The card cannot see its neighbours, so the
|
|
39
|
+
* host that holds the selection draws the range.
|
|
40
|
+
*/
|
|
41
|
+
range: boolean;
|
|
31
42
|
}
|
|
32
43
|
export interface ArtifactCardProps {
|
|
33
44
|
title: string;
|
|
@@ -65,6 +76,24 @@ export interface ArtifactCardProps {
|
|
|
65
76
|
* The `card` size only.
|
|
66
77
|
*/
|
|
67
78
|
actions?: ReactNode;
|
|
79
|
+
/**
|
|
80
|
+
* The card can be picked for a bulk action: a box on the preview's foot,
|
|
81
|
+
* opposite the kind's badge, shown on hover, while focus is inside the card,
|
|
82
|
+
* on a screen with no hover, and always once the card is picked or the
|
|
83
|
+
* gallery is choosing (`selecting`). The `card` size only.
|
|
84
|
+
*/
|
|
85
|
+
selectable?: boolean | undefined;
|
|
86
|
+
/** It is picked: its box is ticked, and the card takes the selected edge and fill. */
|
|
87
|
+
selected?: boolean | undefined;
|
|
88
|
+
/**
|
|
89
|
+
* The gallery is choosing (its Select toggle is on, or something is picked):
|
|
90
|
+
* every box shows, and the card's body PICKS rather than opens, a label for
|
|
91
|
+
* its box rather than a link, so a press anywhere on the card ticks it and a
|
|
92
|
+
* reader is never sent away mid-selection. The More menu stays a menu.
|
|
93
|
+
*/
|
|
94
|
+
selecting?: boolean | undefined;
|
|
95
|
+
/** The box was ticked or cleared, with whether the reader asked for a range. */
|
|
96
|
+
onSelectedChange?: ((selected: boolean, change: ArtifactCardSelectionChange) => void) | undefined;
|
|
68
97
|
/** It is in the trash: the preview is drawn faded. */
|
|
69
98
|
trashed?: boolean | undefined;
|
|
70
99
|
/** `compact` is a row for a narrow rail or a phone, with no preview. */
|
|
@@ -93,7 +122,7 @@ export interface ArtifactCardProps {
|
|
|
93
122
|
* THE COMPACT ROW (`size="compact"`) is a task rail's: the kind's glyph, the
|
|
94
123
|
* title and the facts, with no preview and no actions.
|
|
95
124
|
*/
|
|
96
|
-
export declare function ArtifactCard({ title, kind, href, preview, owner, updatedAt, updatedBy, presence, changes, pinned, version, project, access, actions, trashed, size, className, now, labels, }: ArtifactCardProps): import("react").JSX.Element;
|
|
125
|
+
export declare function ArtifactCard({ title, kind, href, preview, owner, updatedAt, updatedBy, presence, changes, pinned, version, project, access, actions, selectable, selected, selecting, onSelectedChange, trashed, size, className, now, labels, }: ArtifactCardProps): import("react").JSX.Element;
|
|
97
126
|
/**
|
|
98
127
|
* A gallery card while its listing loads: the card's own shape (the preview
|
|
99
128
|
* at its ratio, the badge over its foot, a title line and a meta line), so a
|
|
@@ -1,16 +1,23 @@
|
|
|
1
|
-
export { ArtifactCard, ArtifactCardSkeleton, ArtifactPreviewGlyph } from '../chunk-
|
|
1
|
+
export { ArtifactCard, ArtifactCardSkeleton, ArtifactPreviewGlyph } from '../chunk-Q44X36QC.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-5AQBPHZD.js';
|
|
7
7
|
import '../chunk-PZKHBB7D.js';
|
|
8
|
-
import '../chunk-
|
|
8
|
+
import '../chunk-RV6XB5UV.js';
|
|
9
9
|
import '../chunk-INHXF2CL.js';
|
|
10
10
|
import '../chunk-AV2DXAEL.js';
|
|
11
|
+
import '../chunk-NCHKKYPQ.js';
|
|
11
12
|
import '../chunk-BGLKLXL3.js';
|
|
12
|
-
export { ARTIFACT_KINDS, ArtifactKindGlyph } from '../chunk-
|
|
13
|
+
export { ARTIFACT_KINDS, ArtifactKindGlyph } from '../chunk-RSKW25Y5.js';
|
|
14
|
+
import '../chunk-EXRRTKWT.js';
|
|
15
|
+
import '../chunk-XCUUI7E7.js';
|
|
13
16
|
import '../chunk-BHHIIK3M.js';
|
|
14
17
|
import '../chunk-PQADV6P6.js';
|
|
18
|
+
import '../chunk-RSAQOKH3.js';
|
|
19
|
+
import '../chunk-H5XTJ7GJ.js';
|
|
20
|
+
import '../chunk-LACA4JGC.js';
|
|
21
|
+
import '../chunk-NUZHC6MM.js';
|
|
15
22
|
import '../chunk-BZFWDIV6.js';
|
|
16
23
|
import '../chunk-ODEQTPFM.js';
|
|
@@ -272,9 +272,80 @@
|
|
|
272
272
|
}
|
|
273
273
|
}
|
|
274
274
|
|
|
275
|
+
/*
|
|
276
|
+
* PICKED, as every chosen option in the package is drawn: the selected edge
|
|
277
|
+
* over the selected fill, laid as an image over the card's own ground so the
|
|
278
|
+
* card keeps it. Never the accent, which is the focus ring's hue.
|
|
279
|
+
*/
|
|
280
|
+
.crewlet-artifact-card--card.is-selected {
|
|
281
|
+
border-color: var(--color-border-selected);
|
|
282
|
+
background-image: linear-gradient(var(--color-surface-selected), var(--color-surface-selected));
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/*
|
|
286
|
+
* THE SELECTION BOX STANDS ON THE PREVIEW'S FOOT, opposite the kind's badge
|
|
287
|
+
* and drawn as its twin: half over the picture and half over the card, on a
|
|
288
|
+
* raised square in the badge's own size, hairline and shadow. A cover's own
|
|
289
|
+
* title starts at its top corner, and a box over that corner hid its first
|
|
290
|
+
* words; the foot's far corner is where a cover has the least to say.
|
|
291
|
+
*
|
|
292
|
+
* Its anchor has the preview's shape (the card's width at 16:9) and takes no
|
|
293
|
+
* pointer, so the box is placed against the preview's foot at any width
|
|
294
|
+
* without being nested in the link the preview belongs to. Hidden until the
|
|
295
|
+
* card is hovered or holds focus, and always there once the card is picked,
|
|
296
|
+
* while the gallery is choosing, and on a screen with no hover.
|
|
297
|
+
*/
|
|
298
|
+
.crewlet-artifact-card__select-anchor {
|
|
299
|
+
position: absolute;
|
|
300
|
+
inset: 0 0 auto 0;
|
|
301
|
+
aspect-ratio: 16 / 9;
|
|
302
|
+
pointer-events: none;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
.crewlet-artifact-card__select {
|
|
306
|
+
position: absolute;
|
|
307
|
+
right: var(--spacing-4);
|
|
308
|
+
bottom: 0;
|
|
309
|
+
display: inline-flex;
|
|
310
|
+
align-items: center;
|
|
311
|
+
justify-content: center;
|
|
312
|
+
width: 32px;
|
|
313
|
+
height: 32px;
|
|
314
|
+
box-sizing: border-box;
|
|
315
|
+
border: 1px solid var(--color-border-default);
|
|
316
|
+
border-radius: var(--radius-md);
|
|
317
|
+
background: var(--color-surface-background);
|
|
318
|
+
box-shadow: var(--shadow-sm);
|
|
319
|
+
transform: translateY(50%);
|
|
320
|
+
pointer-events: auto;
|
|
321
|
+
opacity: 0;
|
|
322
|
+
transition: opacity var(--motion-duration-fast) var(--motion-easing-out);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
.crewlet-artifact-card--card:hover .crewlet-artifact-card__select,
|
|
326
|
+
.crewlet-artifact-card--card:focus-within .crewlet-artifact-card__select,
|
|
327
|
+
.crewlet-artifact-card--card.is-selected .crewlet-artifact-card__select,
|
|
328
|
+
.crewlet-artifact-card--selecting .crewlet-artifact-card__select {
|
|
329
|
+
opacity: 1;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
@media (hover: none) {
|
|
333
|
+
.crewlet-artifact-card__select {
|
|
334
|
+
opacity: 1;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/* WHILE CHOOSING, THE BODY PICKS: the pointer says so, and a Shift-press
|
|
339
|
+
for a range selects no text on the way. */
|
|
340
|
+
.crewlet-artifact-card--selecting .crewlet-artifact-card__link {
|
|
341
|
+
cursor: pointer;
|
|
342
|
+
user-select: none;
|
|
343
|
+
}
|
|
344
|
+
|
|
275
345
|
@media (prefers-reduced-motion: reduce) {
|
|
276
346
|
.crewlet-artifact-card--card,
|
|
277
|
-
.crewlet-artifact-card__actions
|
|
347
|
+
.crewlet-artifact-card__actions,
|
|
348
|
+
.crewlet-artifact-card__select {
|
|
278
349
|
transition: none;
|
|
279
350
|
}
|
|
280
351
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { DashboardCover, DocCover, SHEET_COVER_COLUMNS, SHEET_COVER_ROWS, SheetCover } from '../chunk-
|
|
1
|
+
export { DashboardCover, DocCover, SHEET_COVER_COLUMNS, SHEET_COVER_ROWS, SheetCover } from '../chunk-P3QWT5VR.js';
|
|
2
2
|
import '../chunk-PWG3VHRQ.js';
|
|
3
|
-
import '../chunk-
|
|
3
|
+
import '../chunk-RSKW25Y5.js';
|
|
4
4
|
import '../chunk-NUZHC6MM.js';
|
|
5
5
|
import '../chunk-ODEQTPFM.js';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { ARTIFACT_ICON_WORDS, ArtifactIcon, artifactIconGlyph } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
1
|
+
export { ARTIFACT_ICON_WORDS, ArtifactIcon, artifactIconGlyph } from '../chunk-AVL52EME.js';
|
|
2
|
+
import '../chunk-RSKW25Y5.js';
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { type GlyphSize } from '@crewlethq/icons/glyphs';
|
|
2
|
-
/**
|
|
3
|
-
|
|
2
|
+
/**
|
|
3
|
+
* What an artifact is, as the engine names it (`artifacts.Kind`), which
|
|
4
|
+
* decides how it is drawn. `brand` is a company's brand kit: its logos,
|
|
5
|
+
* colours, type and voice.
|
|
6
|
+
*/
|
|
7
|
+
export type ArtifactKind = 'html' | 'doc' | 'slides' | 'design' | 'dashboard' | 'sheet' | 'brand';
|
|
4
8
|
/** Every kind, in the engine's order (`artifacts.Kinds`). */
|
|
5
|
-
export declare const ARTIFACT_KINDS: readonly ["html", "doc", "slides", "design", "dashboard", "sheet"];
|
|
9
|
+
export declare const ARTIFACT_KINDS: readonly ["html", "doc", "slides", "design", "dashboard", "sheet", "brand"];
|
|
6
10
|
/** The glyph a kind is drawn with, wherever a kind is drawn, at a glyph size step or in px. */
|
|
7
11
|
export declare function ArtifactKindGlyph({ kind, size }: {
|
|
8
12
|
kind: ArtifactKind;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { ARTIFACT_KINDS, ArtifactKindGlyph } from '../chunk-
|
|
1
|
+
export { ARTIFACT_KINDS, ArtifactKindGlyph } from '../chunk-RSKW25Y5.js';
|
|
@@ -3,13 +3,14 @@ import type { ArtifactKind } from '../ArtifactKindGlyph/index.js';
|
|
|
3
3
|
/**
|
|
4
4
|
* A kind of artifact, pictured: a simple geometric drawing of what the kind
|
|
5
5
|
* is (a page of prose, a slide, a phone screen, a board of bars, a window of
|
|
6
|
-
* code, a grid of cells) in the kind's
|
|
6
|
+
* code, a grid of cells, a brand kit's mark over its swatches) in the kind's
|
|
7
|
+
* own hue.
|
|
7
8
|
*
|
|
8
9
|
* ONE HUE PER KIND, FROM THE TOKENS. Every mark is drawn in
|
|
9
10
|
* `--color-artifact-kind-<kind>` at one of four fixed weights (the body, its
|
|
10
11
|
* lines, a soft block and the one solid accent), so a theme repaints every
|
|
11
|
-
* drawing by repainting the
|
|
12
|
-
* a colour of its own.
|
|
12
|
+
* drawing by repainting the kind's hue (a node hue, or brand's own), and
|
|
13
|
+
* nothing here holds a colour of its own.
|
|
13
14
|
*
|
|
14
15
|
* DECORATION. The drawing is hidden from assistive technology: the kind's
|
|
15
16
|
* name beside it is what is read.
|
|
@@ -12,4 +12,5 @@
|
|
|
12
12
|
.crewlet-kind--design { --crewlet-kind-hue: var(--color-artifact-kind-design); --crewlet-kind-fill: var(--color-artifact-kind-design-fill); --crewlet-kind-line: var(--color-artifact-kind-design-line); --crewlet-kind-ink: var(--color-artifact-kind-design-ink); }
|
|
13
13
|
.crewlet-kind--dashboard { --crewlet-kind-hue: var(--color-artifact-kind-dashboard); --crewlet-kind-fill: var(--color-artifact-kind-dashboard-fill); --crewlet-kind-line: var(--color-artifact-kind-dashboard-line); --crewlet-kind-ink: var(--color-artifact-kind-dashboard-ink); }
|
|
14
14
|
.crewlet-kind--html { --crewlet-kind-hue: var(--color-artifact-kind-html); --crewlet-kind-fill: var(--color-artifact-kind-html-fill); --crewlet-kind-line: var(--color-artifact-kind-html-line); --crewlet-kind-ink: var(--color-artifact-kind-html-ink); }
|
|
15
|
+
.crewlet-kind--brand { --crewlet-kind-hue: var(--color-artifact-kind-brand); --crewlet-kind-fill: var(--color-artifact-kind-brand-fill); --crewlet-kind-line: var(--color-artifact-kind-brand-line); --crewlet-kind-ink: var(--color-artifact-kind-brand-ink); }
|
|
15
16
|
.crewlet-kind--sheet { --crewlet-kind-hue: var(--color-artifact-kind-sheet); --crewlet-kind-fill: var(--color-artifact-kind-sheet-fill); --crewlet-kind-line: var(--color-artifact-kind-sheet-line); --crewlet-kind-ink: var(--color-artifact-kind-sheet-ink); }
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { ArtifactMakeRow } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
1
|
+
export { ArtifactMakeRow } from '../chunk-R3BA3C4Y.js';
|
|
2
|
+
import '../chunk-RSKW25Y5.js';
|
|
3
3
|
import '../chunk-2YTOOH3A.js';
|
|
4
4
|
import '../chunk-BZFWDIV6.js';
|
|
5
5
|
import '../chunk-ODEQTPFM.js';
|
|
@@ -2,9 +2,22 @@ import { type ArtifactKind } from '../ArtifactKindGlyph/index.js';
|
|
|
2
2
|
export interface ArtifactNameCellLabels {
|
|
3
3
|
kinds: Record<ArtifactKind, string>;
|
|
4
4
|
pinned: string;
|
|
5
|
+
/** The word under a folder's name, where an artifact's says its kind. */
|
|
6
|
+
folder: string;
|
|
5
7
|
}
|
|
8
|
+
/**
|
|
9
|
+
* What a list's name cell names: an artifact of a kind, or a folder, which a
|
|
10
|
+
* folder's page lists first in the same grid as the artifacts it holds.
|
|
11
|
+
*/
|
|
12
|
+
export type ArtifactNameKind = ArtifactKind | 'folder';
|
|
6
13
|
export interface ArtifactNameCellProps {
|
|
7
|
-
|
|
14
|
+
/**
|
|
15
|
+
* The artifact's kind, or `folder` for a folder's row: the folder glyph on
|
|
16
|
+
* a neutral tint (a folder is not a kind, so it takes no kind's colour) and
|
|
17
|
+
* the word "Folder", with what is inside as its `detail`
|
|
18
|
+
* (`describeFolderContents`).
|
|
19
|
+
*/
|
|
20
|
+
kind: ArtifactNameKind;
|
|
8
21
|
title: string;
|
|
9
22
|
/**
|
|
10
23
|
* What it is about, in a line under the title after the kind's word: the
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import '../ArtifactKindIllustration/ArtifactKinds.css';
|
|
2
2
|
import './ArtifactNameCell.css';
|
|
3
3
|
export { ArtifactNameCell } from './ArtifactNameCell.js';
|
|
4
|
-
export type { ArtifactNameCellLabels, ArtifactNameCellProps } from './ArtifactNameCell.js';
|
|
4
|
+
export type { ArtifactNameCellLabels, ArtifactNameCellProps, ArtifactNameKind } from './ArtifactNameCell.js';
|
|
@@ -37,6 +37,18 @@
|
|
|
37
37
|
box-shadow: inset 0 0 0 1px var(--crewlet-kind-hue);
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
+
/* A FOLDER'S MARK IS NEUTRAL: a folder is not a kind, so it takes the inset
|
|
41
|
+
ground and the plain hairline, and its hover takes the hover hairline. */
|
|
42
|
+
.crewlet-artifact-name__mark--folder {
|
|
43
|
+
background: var(--color-surface-inset);
|
|
44
|
+
box-shadow: inset 0 0 0 1px var(--color-border-default);
|
|
45
|
+
color: var(--color-text-secondary);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
:is(tr, [role='row']):hover .crewlet-artifact-name__mark--folder {
|
|
49
|
+
box-shadow: inset 0 0 0 1px var(--color-border-hover);
|
|
50
|
+
}
|
|
51
|
+
|
|
40
52
|
.crewlet-artifact-name--trashed .crewlet-artifact-name__mark {
|
|
41
53
|
background: var(--color-surface-inset);
|
|
42
54
|
box-shadow: inset 0 0 0 1px var(--color-border-default);
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { AnchorHTMLAttributes } from 'react';
|
|
2
|
+
export interface BrandChipProps extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'children'> {
|
|
3
|
+
/** Where the chip goes: the company's Brand page. */
|
|
4
|
+
href: string;
|
|
5
|
+
/** What it says, which is its name: "Acme brand", or "Set up your brand". */
|
|
6
|
+
label: string;
|
|
7
|
+
/**
|
|
8
|
+
* The brand's mark (its square logo), as an address the host has already
|
|
9
|
+
* validated: the engine's file route through the dashboard's checked blob
|
|
10
|
+
* path. Left out, the brand glyph stands in, which is also the chip an
|
|
11
|
+
* administrator sees before a brand exists.
|
|
12
|
+
*/
|
|
13
|
+
mark?: string | undefined;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* The company's brand, as a small link: its mark, its name and a chevron.
|
|
17
|
+
*
|
|
18
|
+
* WHERE IT IS DRAWN: the Make row of the artifacts gallery, the company theme
|
|
19
|
+
* in the slides picker and the note under the ask-an-agent panel, so the
|
|
20
|
+
* brand every new artifact follows is named where the artifact is started,
|
|
21
|
+
* one press from where it is set.
|
|
22
|
+
*
|
|
23
|
+
* ONE LINK, NAMED BY ITS WORDS. The mark is decorative (the label says whose
|
|
24
|
+
* brand it is), and the chevron says it goes somewhere.
|
|
25
|
+
*/
|
|
26
|
+
export declare function BrandChip({ href, label, mark, className, ...rest }: BrandChipProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* The company's brand as a small link: the mark, the name, a chevron. A quiet
|
|
3
|
+
* chip at a small control's height, inside the default hairline, that steps
|
|
4
|
+
* its hairline up under the pointer and moves nothing.
|
|
5
|
+
*/
|
|
6
|
+
.crewlet-brand-chip {
|
|
7
|
+
display: inline-flex;
|
|
8
|
+
align-items: center;
|
|
9
|
+
gap: var(--spacing-2);
|
|
10
|
+
min-width: 0;
|
|
11
|
+
max-width: 100%;
|
|
12
|
+
min-height: var(--size-control-sm);
|
|
13
|
+
box-sizing: border-box;
|
|
14
|
+
padding: 2px var(--spacing-2) 2px 2px;
|
|
15
|
+
border: 1px solid var(--color-border-default);
|
|
16
|
+
border-radius: var(--radius-pill);
|
|
17
|
+
background: var(--color-surface-subtle);
|
|
18
|
+
color: var(--color-text-secondary);
|
|
19
|
+
font-size: var(--font-size-compact);
|
|
20
|
+
font-weight: var(--font-weight-medium);
|
|
21
|
+
text-decoration: none;
|
|
22
|
+
transition:
|
|
23
|
+
border-color var(--motion-duration-fast) var(--motion-easing-out),
|
|
24
|
+
color var(--motion-duration-fast) var(--motion-easing-out);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.crewlet-brand-chip:hover {
|
|
28
|
+
border-color: var(--color-border-hover);
|
|
29
|
+
color: var(--color-text-primary);
|
|
30
|
+
text-decoration: none;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.crewlet-brand-chip:focus-visible {
|
|
34
|
+
outline: 2px solid var(--color-focus);
|
|
35
|
+
outline-offset: var(--size-focus-ring-inset-offset);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* THE MARK ON ITS OWN PLATE, so a mark drawn for a light ground still reads
|
|
39
|
+
on a dark theme: the brand's square logo at the chip's inner height. */
|
|
40
|
+
.crewlet-brand-chip__mark {
|
|
41
|
+
display: inline-flex;
|
|
42
|
+
flex: none;
|
|
43
|
+
align-items: center;
|
|
44
|
+
justify-content: center;
|
|
45
|
+
width: calc(var(--size-control-sm) - 6px);
|
|
46
|
+
height: calc(var(--size-control-sm) - 6px);
|
|
47
|
+
overflow: hidden;
|
|
48
|
+
border-radius: var(--radius-circle);
|
|
49
|
+
background: var(--color-surface-inset);
|
|
50
|
+
box-shadow: inset 0 0 0 1px var(--color-border-default);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.crewlet-brand-chip__mark--glyph {
|
|
54
|
+
color: var(--color-text-tertiary);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.crewlet-brand-chip__image {
|
|
58
|
+
display: block;
|
|
59
|
+
width: 100%;
|
|
60
|
+
height: 100%;
|
|
61
|
+
object-fit: contain;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.crewlet-brand-chip__label {
|
|
65
|
+
min-width: 0;
|
|
66
|
+
overflow: hidden;
|
|
67
|
+
text-overflow: ellipsis;
|
|
68
|
+
white-space: nowrap;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.crewlet-brand-chip__chevron {
|
|
72
|
+
display: inline-flex;
|
|
73
|
+
flex: none;
|
|
74
|
+
color: var(--color-text-tertiary);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
@media (prefers-reduced-motion: reduce) {
|
|
78
|
+
.crewlet-brand-chip {
|
|
79
|
+
transition: none;
|
|
80
|
+
}
|
|
81
|
+
}
|