@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
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* What a folder holds that the reader can open: its direct children only,
|
|
4
|
+
* counted from the reader's own view of them. A folder grants nothing, so a
|
|
5
|
+
* reader who can open nothing inside is told so rather than told it is empty.
|
|
6
|
+
*/
|
|
7
|
+
export interface FolderContents {
|
|
8
|
+
artifacts: number;
|
|
9
|
+
folders: number;
|
|
10
|
+
}
|
|
11
|
+
export interface FolderContentsLabels {
|
|
12
|
+
/** "12 artifacts", "1 artifact". */
|
|
13
|
+
artifacts: (count: number) => string;
|
|
14
|
+
/** "2 folders", "1 folder". */
|
|
15
|
+
folders: (count: number) => string;
|
|
16
|
+
/** Said when the reader can open nothing inside, which is never "Empty". */
|
|
17
|
+
nothing: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The line a folder's tile and its list row say about what is inside: "12
|
|
21
|
+
* artifacts · 2 folders", one part alone when the other is none, and "Nothing
|
|
22
|
+
* you can open yet" for neither.
|
|
23
|
+
*
|
|
24
|
+
* ONE PHRASING, EXPORTED, so the grid's tile and the list's name cell
|
|
25
|
+
* (`ArtifactNameCell kind="folder"`, whose `detail` takes this) never say the
|
|
26
|
+
* same count two ways.
|
|
27
|
+
*/
|
|
28
|
+
export declare function describeFolderContents(contents: FolderContents, labels?: Partial<FolderContentsLabels>): string;
|
|
29
|
+
export type FolderTileSize = 'tile' | 'row';
|
|
30
|
+
export interface FolderTileLabels extends FolderContentsLabels {
|
|
31
|
+
/** What it is, said after its name: the tile draws a folder rather than printing the word. */
|
|
32
|
+
folder: string;
|
|
33
|
+
/** Said when the tile is chosen, since the chosen edge is a picture of it. */
|
|
34
|
+
selected: string;
|
|
35
|
+
}
|
|
36
|
+
export interface FolderTileProps {
|
|
37
|
+
name: string;
|
|
38
|
+
/** The folder's page. The whole tile is one real link. */
|
|
39
|
+
href: string;
|
|
40
|
+
/**
|
|
41
|
+
* Who can see the folder, as a glyph and a short word: an
|
|
42
|
+
* `ArtifactAccessLabel` with the folder's own word ("Everyone", "Only you").
|
|
43
|
+
* Read as part of the tile's description.
|
|
44
|
+
*/
|
|
45
|
+
visibility?: ReactNode;
|
|
46
|
+
/** What is inside that the reader can open. Left out (still loading), no line is drawn. */
|
|
47
|
+
contents?: FolderContents | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* The tile's own controls (a More menu), drawn OUTSIDE its link at its
|
|
50
|
+
* trailing edge and shown on hover and while focus is inside the tile, so a
|
|
51
|
+
* keyboard reaches them after the link and they are never nested in it.
|
|
52
|
+
*/
|
|
53
|
+
actions?: ReactNode;
|
|
54
|
+
/** It is chosen (a selection the host keeps): the selected edge and fill. */
|
|
55
|
+
selected?: boolean | undefined;
|
|
56
|
+
/**
|
|
57
|
+
* Something held over it would land in it: the drop target's edge and fill.
|
|
58
|
+
* Reserved for dragging onto a folder, which the host drives.
|
|
59
|
+
*/
|
|
60
|
+
dropTarget?: boolean | undefined;
|
|
61
|
+
/**
|
|
62
|
+
* `tile` is a gallery's (a grid of them, a few across); `row` is the full
|
|
63
|
+
* width, 44px row a phone takes. A tile takes the row's shape on its own
|
|
64
|
+
* under the phone breakpoint.
|
|
65
|
+
*/
|
|
66
|
+
size?: FolderTileSize | undefined;
|
|
67
|
+
className?: string | undefined;
|
|
68
|
+
labels?: Partial<FolderTileLabels> | undefined;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* A folder in a gallery: the folder glyph on a neutral tint, the name on one
|
|
72
|
+
* line, who can see it and what is inside, and a More menu.
|
|
73
|
+
*
|
|
74
|
+
* SHORTER THAN AN ARTIFACT'S CARD AND WITH NO PREVIEW, so a folder and an
|
|
75
|
+
* artifact never look alike and the kind's badge keeps its meaning. The tint
|
|
76
|
+
* is neutral for the same reason: a folder is not a kind.
|
|
77
|
+
*
|
|
78
|
+
* THE FACTS ARE NEVER CUT. Who can see the folder and what is inside wrap
|
|
79
|
+
* onto a second line where the tile is narrow; only the name, which carries
|
|
80
|
+
* its whole self on hover, is cut to one line.
|
|
81
|
+
*
|
|
82
|
+
* THE WHOLE TILE IS ONE LINK, named by the folder's name alone and described
|
|
83
|
+
* by the rest, so a reader moving by link hears "Q3 launch" and then, if they
|
|
84
|
+
* wait, "Folder, Everyone, 12 artifacts · 2 folders". The More menu sits
|
|
85
|
+
* beside the link rather than inside it.
|
|
86
|
+
*
|
|
87
|
+
* ITS COUNT IS THE READER'S OWN. A folder grants nothing on what it holds, so
|
|
88
|
+
* the count is of what this reader can open, and a folder holding only things
|
|
89
|
+
* they cannot open says "Nothing you can open yet", never "Empty".
|
|
90
|
+
*/
|
|
91
|
+
export declare function FolderTile({ name, href, visibility, contents, actions, selected, dropTarget, size, className, labels, }: FolderTileProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { FolderTile, describeFolderContents } from '../chunk-M4QM477B.js';
|
|
2
|
+
import '../chunk-INHXF2CL.js';
|
|
3
|
+
import '../chunk-AV2DXAEL.js';
|
|
4
|
+
import '../chunk-BHHIIK3M.js';
|
|
5
|
+
import '../chunk-PQADV6P6.js';
|
|
6
|
+
import '../chunk-BZFWDIV6.js';
|
|
7
|
+
import '../chunk-ODEQTPFM.js';
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* A folder in a gallery: a short tile on Card (no preview), the folder glyph
|
|
3
|
+
* on a neutral tint over the name and one quiet line, and a More menu in the
|
|
4
|
+
* top corner outside the link. `row` is the full width, 44px row a phone
|
|
5
|
+
* takes, and a tile becomes one under the phone breakpoint.
|
|
6
|
+
*
|
|
7
|
+
* ON TOP OF CARD, so every rule that changes Card's own layout carries Card's
|
|
8
|
+
* class too: the two sheets meet at equal weight and the bundle orders them by
|
|
9
|
+
* file name, which puts Card's after this one.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/*
|
|
13
|
+
* THE ARTIFACT CARD'S CORNER, so a folder tile and the cards below it read as
|
|
14
|
+
* one gallery, and Card's own hover step (the hairline darkens, nothing
|
|
15
|
+
* lifts). The chosen state is Card's (`selected`): the selected edge over the
|
|
16
|
+
* selected fill.
|
|
17
|
+
*/
|
|
18
|
+
.crewlet-card.crewlet-folder-tile {
|
|
19
|
+
/*
|
|
20
|
+
* THE TWO SHAPES ARE ONE LAYOUT AT TWO SIZES, so the row (and a tile under
|
|
21
|
+
* the phone breakpoint) restates these and nothing else.
|
|
22
|
+
*/
|
|
23
|
+
--crewlet-folder-tile-radius: var(--radius-xl);
|
|
24
|
+
--crewlet-folder-tile-gap: var(--spacing-3);
|
|
25
|
+
--crewlet-folder-tile-pad-block: var(--spacing-4);
|
|
26
|
+
--crewlet-folder-tile-pad-inline: var(--spacing-4);
|
|
27
|
+
--crewlet-folder-tile-floor: auto;
|
|
28
|
+
--crewlet-folder-tile-glyph: 40px;
|
|
29
|
+
--crewlet-folder-tile-glyph-radius: var(--radius-md);
|
|
30
|
+
--crewlet-folder-tile-name: var(--font-size-md);
|
|
31
|
+
--crewlet-folder-tile-facts: var(--font-size-sm);
|
|
32
|
+
--crewlet-folder-tile-actions-inset: var(--spacing-3);
|
|
33
|
+
/*
|
|
34
|
+
* A TILE STACKS: the glyph on top with the More menu level with it in the
|
|
35
|
+
* other corner, then the name and the facts the full width of the tile,
|
|
36
|
+
* where a gallery four across has room for "Everyone · 12 artifacts · 2
|
|
37
|
+
* folders". A row is one line of glyph and words with the menu centred on
|
|
38
|
+
* it, and only the row gives the menu room.
|
|
39
|
+
*/
|
|
40
|
+
--crewlet-folder-tile-direction: column;
|
|
41
|
+
--crewlet-folder-tile-align: flex-start;
|
|
42
|
+
--crewlet-folder-tile-actions-top: calc(
|
|
43
|
+
var(--crewlet-folder-tile-pad-block) + (var(--crewlet-folder-tile-glyph) - var(--size-control-sm)) / 2
|
|
44
|
+
);
|
|
45
|
+
--crewlet-folder-tile-actions-shift: 0;
|
|
46
|
+
--crewlet-folder-tile-reserve-link: 0px;
|
|
47
|
+
|
|
48
|
+
flex-direction: row;
|
|
49
|
+
align-items: stretch;
|
|
50
|
+
min-width: 0;
|
|
51
|
+
border-radius: var(--crewlet-folder-tile-radius);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/* ---- the row: a phone's, full width at 44px ---- */
|
|
55
|
+
|
|
56
|
+
.crewlet-card.crewlet-folder-tile--row {
|
|
57
|
+
--crewlet-folder-tile-radius: var(--radius-lg);
|
|
58
|
+
--crewlet-folder-tile-gap: var(--spacing-2);
|
|
59
|
+
--crewlet-folder-tile-pad-block: var(--spacing-1);
|
|
60
|
+
--crewlet-folder-tile-pad-inline: var(--spacing-3);
|
|
61
|
+
--crewlet-folder-tile-floor: var(--size-control-lg);
|
|
62
|
+
--crewlet-folder-tile-glyph: 28px;
|
|
63
|
+
--crewlet-folder-tile-glyph-radius: var(--radius-sm);
|
|
64
|
+
--crewlet-folder-tile-name: var(--font-size-sm);
|
|
65
|
+
--crewlet-folder-tile-facts: var(--font-size-xs);
|
|
66
|
+
--crewlet-folder-tile-actions-inset: var(--spacing-2);
|
|
67
|
+
--crewlet-folder-tile-direction: row;
|
|
68
|
+
--crewlet-folder-tile-align: center;
|
|
69
|
+
--crewlet-folder-tile-actions-top: 50%;
|
|
70
|
+
--crewlet-folder-tile-actions-shift: -50%;
|
|
71
|
+
--crewlet-folder-tile-reserve-link: calc(var(--size-control-sm) + var(--spacing-1));
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/* UNDER THE PHONE BREAKPOINT A TILE IS THE ROW, strictly under, as the
|
|
75
|
+
package switches there everywhere else. */
|
|
76
|
+
@media (width < 640px) {
|
|
77
|
+
.crewlet-card.crewlet-folder-tile--tile {
|
|
78
|
+
--crewlet-folder-tile-radius: var(--radius-lg);
|
|
79
|
+
--crewlet-folder-tile-gap: var(--spacing-2);
|
|
80
|
+
--crewlet-folder-tile-pad-block: var(--spacing-1);
|
|
81
|
+
--crewlet-folder-tile-pad-inline: var(--spacing-3);
|
|
82
|
+
--crewlet-folder-tile-floor: var(--size-control-lg);
|
|
83
|
+
--crewlet-folder-tile-glyph: 28px;
|
|
84
|
+
--crewlet-folder-tile-glyph-radius: var(--radius-sm);
|
|
85
|
+
--crewlet-folder-tile-name: var(--font-size-sm);
|
|
86
|
+
--crewlet-folder-tile-facts: var(--font-size-xs);
|
|
87
|
+
--crewlet-folder-tile-actions-inset: var(--spacing-2);
|
|
88
|
+
--crewlet-folder-tile-direction: row;
|
|
89
|
+
--crewlet-folder-tile-align: center;
|
|
90
|
+
--crewlet-folder-tile-actions-top: 50%;
|
|
91
|
+
--crewlet-folder-tile-actions-shift: -50%;
|
|
92
|
+
--crewlet-folder-tile-reserve-link: calc(var(--size-control-sm) + var(--spacing-1));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/*
|
|
97
|
+
* SOMETHING HELD OVER IT WOULD LAND IN IT: the accent edge over the accent's
|
|
98
|
+
* soft fill, the same pair a file drop target takes while files are over it,
|
|
99
|
+
* so "let go here" reads one way across the package.
|
|
100
|
+
*/
|
|
101
|
+
.crewlet-card.crewlet-folder-tile.is-drop-target {
|
|
102
|
+
border-color: var(--color-brand-accent);
|
|
103
|
+
background-color: var(--color-brand-accent-soft);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.crewlet-card.crewlet-folder-tile:has(.crewlet-folder-tile__link:focus-visible) {
|
|
107
|
+
outline: 2px solid var(--color-focus);
|
|
108
|
+
outline-offset: var(--size-focus-ring-inset-offset);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/* THE LINK IS THE TILE: it fills it, and the ring is drawn on the tile. */
|
|
112
|
+
.crewlet-folder-tile__link,
|
|
113
|
+
.crewlet-folder-tile__link:hover {
|
|
114
|
+
text-decoration: none;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.crewlet-folder-tile__link {
|
|
118
|
+
display: flex;
|
|
119
|
+
flex: 1 1 auto;
|
|
120
|
+
flex-direction: var(--crewlet-folder-tile-direction);
|
|
121
|
+
align-items: var(--crewlet-folder-tile-align);
|
|
122
|
+
gap: var(--crewlet-folder-tile-gap);
|
|
123
|
+
min-width: 0;
|
|
124
|
+
min-height: var(--crewlet-folder-tile-floor);
|
|
125
|
+
padding: var(--crewlet-folder-tile-pad-block) var(--crewlet-folder-tile-pad-inline);
|
|
126
|
+
border-radius: inherit;
|
|
127
|
+
color: inherit;
|
|
128
|
+
outline: none;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/* Room for the More menu on a row, where it sits beside the words. */
|
|
132
|
+
.crewlet-folder-tile--with-actions .crewlet-folder-tile__link {
|
|
133
|
+
padding-inline-end: calc(var(--crewlet-folder-tile-pad-inline) + var(--crewlet-folder-tile-reserve-link));
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/* A NEUTRAL TINT, never a kind's: a folder is not a kind. */
|
|
137
|
+
.crewlet-folder-tile__glyph {
|
|
138
|
+
display: inline-flex;
|
|
139
|
+
flex: none;
|
|
140
|
+
align-items: center;
|
|
141
|
+
justify-content: center;
|
|
142
|
+
width: var(--crewlet-folder-tile-glyph);
|
|
143
|
+
height: var(--crewlet-folder-tile-glyph);
|
|
144
|
+
box-sizing: border-box;
|
|
145
|
+
border-radius: var(--crewlet-folder-tile-glyph-radius);
|
|
146
|
+
background: var(--color-surface-inset);
|
|
147
|
+
box-shadow: inset 0 0 0 1px var(--color-border-default);
|
|
148
|
+
color: var(--color-text-secondary);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.crewlet-folder-tile__body {
|
|
152
|
+
display: flex;
|
|
153
|
+
flex-direction: column;
|
|
154
|
+
gap: 2px;
|
|
155
|
+
min-width: 0;
|
|
156
|
+
max-width: 100%;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.crewlet-folder-tile__name {
|
|
160
|
+
overflow: hidden;
|
|
161
|
+
color: var(--color-text-primary);
|
|
162
|
+
font-size: var(--crewlet-folder-tile-name);
|
|
163
|
+
font-weight: var(--font-weight-medium);
|
|
164
|
+
line-height: 1.35;
|
|
165
|
+
text-overflow: ellipsis;
|
|
166
|
+
white-space: nowrap;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/*
|
|
170
|
+
* THE FACTS WRAP, NEVER CUT. "Everyone" and "Nothing you can open yet" are
|
|
171
|
+
* both things a reader has to read, and four tiles across a laptop's page do
|
|
172
|
+
* not have room for them on one line: the count moves under who can see the
|
|
173
|
+
* folder rather than losing its end to an ellipsis. The two are told apart by
|
|
174
|
+
* the visibility glyph and the gap between them, not by a separator, so a
|
|
175
|
+
* line that breaks never opens on a stray dot.
|
|
176
|
+
*/
|
|
177
|
+
.crewlet-folder-tile__facts {
|
|
178
|
+
display: flex;
|
|
179
|
+
flex-wrap: wrap;
|
|
180
|
+
align-items: center;
|
|
181
|
+
gap: 2px var(--spacing-3);
|
|
182
|
+
min-width: 0;
|
|
183
|
+
color: var(--color-text-tertiary);
|
|
184
|
+
font-size: var(--crewlet-folder-tile-facts);
|
|
185
|
+
line-height: 1.35;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
.crewlet-folder-tile__visibility {
|
|
189
|
+
display: inline-flex;
|
|
190
|
+
flex: none;
|
|
191
|
+
align-items: center;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.crewlet-folder-tile__contents {
|
|
195
|
+
min-width: 0;
|
|
196
|
+
overflow-wrap: anywhere;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/*
|
|
200
|
+
* THE TILE'S OWN CONTROLS, at its trailing edge and outside the link: hidden
|
|
201
|
+
* until the tile is hovered or holds focus, so a gallery rests as names, and
|
|
202
|
+
* always there on a screen with no hover or while their menu is open.
|
|
203
|
+
*/
|
|
204
|
+
.crewlet-folder-tile__actions {
|
|
205
|
+
position: absolute;
|
|
206
|
+
top: var(--crewlet-folder-tile-actions-top);
|
|
207
|
+
right: var(--crewlet-folder-tile-actions-inset);
|
|
208
|
+
display: inline-flex;
|
|
209
|
+
gap: var(--spacing-1);
|
|
210
|
+
transform: translateY(var(--crewlet-folder-tile-actions-shift));
|
|
211
|
+
opacity: 0;
|
|
212
|
+
transition: opacity var(--motion-duration-fast) var(--motion-easing-out);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
.crewlet-folder-tile:hover .crewlet-folder-tile__actions,
|
|
216
|
+
.crewlet-folder-tile:focus-within .crewlet-folder-tile__actions,
|
|
217
|
+
.crewlet-folder-tile__actions:has([aria-expanded='true']) {
|
|
218
|
+
opacity: 1;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
@media (hover: none) {
|
|
222
|
+
.crewlet-folder-tile__actions {
|
|
223
|
+
opacity: 1;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
@media (prefers-reduced-motion: reduce) {
|
|
228
|
+
.crewlet-folder-tile__actions {
|
|
229
|
+
transition: none;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { LinkInterstitial, openExternal } from '../chunk-
|
|
1
|
+
export { LinkInterstitial, openExternal } from '../chunk-GP4YWZFO.js';
|
|
2
|
+
import '../chunk-YCC2S7DF.js';
|
|
2
3
|
import '../chunk-5CLW2CXT.js';
|
|
3
|
-
import '../chunk-6AKG2VLR.js';
|
|
4
4
|
import '../chunk-SZZRIHGT.js';
|
|
5
5
|
import '../chunk-PQADV6P6.js';
|
|
6
6
|
import '../chunk-OMV5W53A.js';
|
package/dist/ListInput/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export { ListInput, withDraft } from '../chunk-
|
|
1
|
+
export { ListInput, withDraft } from '../chunk-PGR2PKH6.js';
|
|
2
2
|
import '../chunk-XJ2QEBMM.js';
|
|
3
|
+
import '../chunk-SMBKXWML.js';
|
|
3
4
|
import '../chunk-EXRRTKWT.js';
|
|
4
5
|
import '../chunk-XCUUI7E7.js';
|
|
5
|
-
import '../chunk-SMBKXWML.js';
|
|
6
6
|
import '../chunk-PQADV6P6.js';
|
|
7
7
|
import '../chunk-RSAQOKH3.js';
|
|
8
8
|
import '../chunk-OMV5W53A.js';
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
/** The ground a logo is drawn on: the light one it is usually made for, or a dark one. */
|
|
3
|
+
export type LogoSlotGround = 'light' | 'dark';
|
|
4
|
+
/** A wide logo (a wordmark, a lockup) or a square mark. */
|
|
5
|
+
export type LogoSlotShape = 'wide' | 'square';
|
|
6
|
+
export interface LogoSlotLabels {
|
|
7
|
+
/** The picker's label while the slot is empty. */
|
|
8
|
+
choose: string;
|
|
9
|
+
/** The picker's label once the slot holds a logo. */
|
|
10
|
+
replace: string;
|
|
11
|
+
remove: string;
|
|
12
|
+
/** What the overlay says while a file is held over the slot. */
|
|
13
|
+
drop: string;
|
|
14
|
+
/** Said and shown while a file is uploading. */
|
|
15
|
+
uploading: string;
|
|
16
|
+
/** Printed under an empty slot for a reader who cannot fill it. */
|
|
17
|
+
empty: string;
|
|
18
|
+
/** What may be brought, under the picker. */
|
|
19
|
+
hint: string;
|
|
20
|
+
}
|
|
21
|
+
export interface LogoSlotProps {
|
|
22
|
+
/** The slot's name: "Primary", "For dark grounds", "Mark". */
|
|
23
|
+
label: string;
|
|
24
|
+
/** One line under it: "On a light ground". */
|
|
25
|
+
description?: ReactNode;
|
|
26
|
+
/** The ground the logo is drawn on. */
|
|
27
|
+
ground: LogoSlotGround;
|
|
28
|
+
/**
|
|
29
|
+
* The brand's own colour for that ground, `#rrggbb`. Left out (or not a
|
|
30
|
+
* colour), the slot draws the product's own ground for that mode.
|
|
31
|
+
*/
|
|
32
|
+
groundColor?: string | undefined;
|
|
33
|
+
shape?: LogoSlotShape | undefined;
|
|
34
|
+
/**
|
|
35
|
+
* The logo, as an address the host has already validated (the engine's file
|
|
36
|
+
* route, through the dashboard's checked blob path). Empty, the slot shows
|
|
37
|
+
* where a logo would go.
|
|
38
|
+
*/
|
|
39
|
+
src?: string | null | undefined;
|
|
40
|
+
/** What the logo says, for a reader who cannot see it: "Acme logo". */
|
|
41
|
+
alt: string;
|
|
42
|
+
/** The clear-space guide: a dashed line round the logo at the space it keeps. On by default. */
|
|
43
|
+
guide?: boolean | undefined;
|
|
44
|
+
/** A file is uploading: the picker spins and the slot takes no new file until it lands. */
|
|
45
|
+
uploading?: boolean | undefined;
|
|
46
|
+
/** Why the last file was refused, with what to do about it. Drawn under the slot and announced. */
|
|
47
|
+
error?: ReactNode;
|
|
48
|
+
/** The reader may change the logo: a picker, Remove, and dropping a file on the slot. */
|
|
49
|
+
editable?: boolean | undefined;
|
|
50
|
+
/** A file was picked or dropped. One file: a slot holds one logo. */
|
|
51
|
+
onFile?: ((file: File) => void) | undefined;
|
|
52
|
+
/** Remove was pressed. Offered only while the slot holds a logo. */
|
|
53
|
+
onRemove?: (() => void) | undefined;
|
|
54
|
+
/** The types the picker offers, as the input's `accept` takes them. The engine still checks every file. */
|
|
55
|
+
accept?: string | undefined;
|
|
56
|
+
/** A reader's action beside the slot's name: a download of the logo. */
|
|
57
|
+
download?: ReactNode;
|
|
58
|
+
/**
|
|
59
|
+
* Said under an empty slot in place of `empty`: what an empty slot means
|
|
60
|
+
* here ("The primary logo is used on dark grounds until one is added").
|
|
61
|
+
*/
|
|
62
|
+
emptyNote?: ReactNode;
|
|
63
|
+
className?: string | undefined;
|
|
64
|
+
labels?: Partial<LogoSlotLabels> | undefined;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* One of a brand's logos, drawn on the ground it is made for, with the space
|
|
68
|
+
* it keeps round it.
|
|
69
|
+
*
|
|
70
|
+
* ON ITS OWN GROUND, NOT THE PAGE'S. A logo for a light ground is shown on a
|
|
71
|
+
* light ground in a dark theme too, and one for dark grounds on a dark one:
|
|
72
|
+
* the brand's own ground colour when it has one, the product's sheet for that
|
|
73
|
+
* mode when it has not. The guide and the placeholder are inked in whichever
|
|
74
|
+
* of the two palettes' text reads better on that ground.
|
|
75
|
+
*
|
|
76
|
+
* THE CLEAR-SPACE GUIDE is a dashed line round the logo at the space it keeps,
|
|
77
|
+
* so an administrator sees how it will sit in a header before it is in one.
|
|
78
|
+
*
|
|
79
|
+
* BRINGING A FILE IS NEVER ONLY A DROP. An editable slot carries a picker
|
|
80
|
+
* (`FilePickButton`), and the slot itself is a `FileDrop` region for a pointer.
|
|
81
|
+
* The engine checks every file; a refusal comes back as `error`, drawn under
|
|
82
|
+
* the slot and announced, saying what to change.
|
|
83
|
+
*/
|
|
84
|
+
export declare function LogoSlot({ label, description, ground, groundColor, shape, src, alt, guide, uploading, error, editable, onFile, onRemove, accept, download, emptyNote, className, labels, }: LogoSlotProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { LogoSlot } from '../chunk-ITI2Z44C.js';
|
|
2
|
+
import '../chunk-THDGBD6Y.js';
|
|
3
|
+
import '../chunk-B235ANDO.js';
|
|
4
|
+
import '../chunk-KYIAFNU7.js';
|
|
5
|
+
import '../chunk-UZMNR366.js';
|
|
6
|
+
import '../chunk-WIATRXEJ.js';
|
|
7
|
+
import '../chunk-OG6CL3EB.js';
|
|
8
|
+
import '../chunk-BZFWDIV6.js';
|
|
9
|
+
import '../chunk-ODEQTPFM.js';
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* One of a brand's logos on the ground it is made for. The ground and the ink
|
|
3
|
+
* of its guide are the only values here that are not tokens: they arrive
|
|
4
|
+
* through `--crewlet-logo-slot-ground` (the brand's own `#rrggbb`, or a
|
|
5
|
+
* palette's sheet read from the tokens package) and `--crewlet-logo-slot-ink`
|
|
6
|
+
* (whichever palette's text reads better on that ground).
|
|
7
|
+
*/
|
|
8
|
+
.crewlet-logo-slot {
|
|
9
|
+
/* Every stage is one height, so three slots side by side line up whatever
|
|
10
|
+
their logos' shapes. */
|
|
11
|
+
--crewlet-logo-slot-height: calc(var(--size-row-lg) * 3);
|
|
12
|
+
--crewlet-logo-slot-padding: var(--spacing-5);
|
|
13
|
+
--crewlet-logo-slot-clear: var(--spacing-3);
|
|
14
|
+
|
|
15
|
+
display: flex;
|
|
16
|
+
flex-direction: column;
|
|
17
|
+
gap: var(--spacing-2);
|
|
18
|
+
min-width: 0;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.crewlet-logo-slot__head {
|
|
22
|
+
display: flex;
|
|
23
|
+
align-items: flex-start;
|
|
24
|
+
justify-content: space-between;
|
|
25
|
+
gap: var(--spacing-2);
|
|
26
|
+
min-width: 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.crewlet-logo-slot__words {
|
|
30
|
+
display: flex;
|
|
31
|
+
flex-direction: column;
|
|
32
|
+
gap: 2px;
|
|
33
|
+
min-width: 0;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.crewlet-logo-slot__label {
|
|
37
|
+
color: var(--color-text-primary);
|
|
38
|
+
font-size: var(--font-size-sm);
|
|
39
|
+
font-weight: var(--font-weight-medium);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.crewlet-logo-slot__description {
|
|
43
|
+
color: var(--color-text-tertiary);
|
|
44
|
+
font-size: var(--font-size-xs);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.crewlet-logo-slot__download {
|
|
48
|
+
display: inline-flex;
|
|
49
|
+
flex: none;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/*
|
|
53
|
+
* THE STAGE: the logo's own ground, at one height, inside the page's hairline
|
|
54
|
+
* so a ground that matches the page is still a stage. An empty one draws its
|
|
55
|
+
* edge dashed, a place waiting to be filled.
|
|
56
|
+
*/
|
|
57
|
+
.crewlet-logo-slot__stage {
|
|
58
|
+
display: flex;
|
|
59
|
+
align-items: center;
|
|
60
|
+
justify-content: center;
|
|
61
|
+
height: var(--crewlet-logo-slot-height);
|
|
62
|
+
box-sizing: border-box;
|
|
63
|
+
padding: var(--crewlet-logo-slot-padding);
|
|
64
|
+
overflow: hidden;
|
|
65
|
+
border: 1px solid var(--color-border-hover);
|
|
66
|
+
border-radius: var(--radius-lg);
|
|
67
|
+
background: var(--crewlet-logo-slot-ground);
|
|
68
|
+
color: var(--crewlet-logo-slot-ink);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.crewlet-logo-slot__stage.is-empty {
|
|
72
|
+
border-style: dashed;
|
|
73
|
+
border-color: var(--color-border-strong);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/*
|
|
77
|
+
* THE SPACE THE LOGO KEEPS: padding round it at the clear space, and with the
|
|
78
|
+
* guide on, a dashed line at that edge in the ground's ink, half strength so
|
|
79
|
+
* it reads as a guide and never as part of the logo.
|
|
80
|
+
*/
|
|
81
|
+
.crewlet-logo-slot__space {
|
|
82
|
+
position: relative;
|
|
83
|
+
display: inline-flex;
|
|
84
|
+
align-items: center;
|
|
85
|
+
justify-content: center;
|
|
86
|
+
max-width: 100%;
|
|
87
|
+
box-sizing: border-box;
|
|
88
|
+
padding: var(--crewlet-logo-slot-clear);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.crewlet-logo-slot__space.has-guide::after {
|
|
92
|
+
content: '';
|
|
93
|
+
position: absolute;
|
|
94
|
+
inset: 0;
|
|
95
|
+
border: 1px dashed var(--crewlet-logo-slot-ink);
|
|
96
|
+
border-radius: var(--radius-xs);
|
|
97
|
+
opacity: 0.5;
|
|
98
|
+
pointer-events: none;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.crewlet-logo-slot__image {
|
|
102
|
+
display: block;
|
|
103
|
+
max-width: 100%;
|
|
104
|
+
max-height: calc(var(--crewlet-logo-slot-height) - 2 * var(--crewlet-logo-slot-padding) - 2 * var(--crewlet-logo-slot-clear));
|
|
105
|
+
object-fit: contain;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/* WHERE A LOGO WOULD GO, at the shape it would take: a wordmark's band or a
|
|
109
|
+
mark's square, with the image glyph in the ground's ink. */
|
|
110
|
+
.crewlet-logo-slot__placeholder {
|
|
111
|
+
display: inline-flex;
|
|
112
|
+
align-items: center;
|
|
113
|
+
justify-content: center;
|
|
114
|
+
width: calc(var(--size-row-lg) * 3);
|
|
115
|
+
height: var(--size-row-lg);
|
|
116
|
+
opacity: 0.7;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.crewlet-logo-slot__stage--square .crewlet-logo-slot__placeholder {
|
|
120
|
+
width: var(--size-row-lg);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.crewlet-logo-slot__stage.is-uploading .crewlet-logo-slot__space {
|
|
124
|
+
opacity: 0.5;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.crewlet-logo-slot__empty {
|
|
128
|
+
margin: 0;
|
|
129
|
+
color: var(--color-text-tertiary);
|
|
130
|
+
font-size: var(--font-size-xs);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/* A REFUSAL, in the danger ink with its glyph, so it never rests on the hue. */
|
|
134
|
+
.crewlet-logo-slot__error {
|
|
135
|
+
display: flex;
|
|
136
|
+
align-items: flex-start;
|
|
137
|
+
gap: var(--spacing-1);
|
|
138
|
+
margin: 0;
|
|
139
|
+
color: var(--color-feedback-danger-ink);
|
|
140
|
+
font-size: var(--font-size-xs);
|
|
141
|
+
line-height: var(--font-line-height-normal);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.crewlet-logo-slot__error > svg {
|
|
145
|
+
flex: none;
|
|
146
|
+
margin-top: 1px;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.crewlet-logo-slot__foot {
|
|
150
|
+
display: flex;
|
|
151
|
+
flex-wrap: wrap;
|
|
152
|
+
align-items: center;
|
|
153
|
+
gap: var(--spacing-2);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.crewlet-logo-slot__hint {
|
|
157
|
+
color: var(--color-text-tertiary);
|
|
158
|
+
font-size: var(--font-size-xs);
|
|
159
|
+
}
|
package/dist/Modal/Modal.d.ts
CHANGED
|
@@ -102,6 +102,19 @@ export interface ModalProps extends FrameAttributes {
|
|
|
102
102
|
variant?: ModalVariant | undefined;
|
|
103
103
|
shape?: ModalShape | undefined;
|
|
104
104
|
placement?: ModalPlacement | undefined;
|
|
105
|
+
/**
|
|
106
|
+
* On a phone (strictly under the phone breakpoint), the dialog takes the
|
|
107
|
+
* whole window as a full-height sheet: no inset and no corners, the head
|
|
108
|
+
* and the foot standing still while the body scrolls between them, and the
|
|
109
|
+
* foot clear of the home indicator. For a dialog whose body is a long list
|
|
110
|
+
* a thumb works through, such as a folder picker, where a dialog inset from
|
|
111
|
+
* every edge leaves a few rows of it on the screen at a time.
|
|
112
|
+
*
|
|
113
|
+
* OPT-IN, so every other dialog keeps its shape on a phone. It reshapes the
|
|
114
|
+
* framed dialog only: a prompt is one sentence and stays a prompt, and a
|
|
115
|
+
* side sheet is already the full width there.
|
|
116
|
+
*/
|
|
117
|
+
phoneSheet?: boolean | undefined;
|
|
105
118
|
role?: ModalRole | undefined;
|
|
106
119
|
/**
|
|
107
120
|
* False while a request is in flight: Escape, the veil and the close
|
package/dist/Modal/index.js
CHANGED
|
@@ -112,6 +112,32 @@
|
|
|
112
112
|
animation: crewlet-modal-lift var(--motion-duration-moderate) var(--motion-easing-emphasized);
|
|
113
113
|
}
|
|
114
114
|
|
|
115
|
+
/*
|
|
116
|
+
* THE PHONE SHEET (`phoneSheet`), strictly under the phone breakpoint as the
|
|
117
|
+
* package switches there everywhere else: the dialog takes the whole window,
|
|
118
|
+
* with no inset and no corners, so a long list in its body has the screen's
|
|
119
|
+
* height to scroll in between a head and a foot that stay put. It rises from
|
|
120
|
+
* the bottom edge as the bottom sheet does, and its foot stays clear of the
|
|
121
|
+
* home indicator. Above the breakpoint nothing here applies, and the dialog
|
|
122
|
+
* keeps its placement.
|
|
123
|
+
*/
|
|
124
|
+
@media (width < 640px) {
|
|
125
|
+
.crewlet-modal-overlay--dialog.crewlet-modal-overlay--phone-sheet {
|
|
126
|
+
align-items: stretch;
|
|
127
|
+
padding: 0;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.crewlet-modal-overlay--phone-sheet > .crewlet-modal--dialog {
|
|
131
|
+
width: 100%;
|
|
132
|
+
height: 100%;
|
|
133
|
+
max-height: none;
|
|
134
|
+
border: none;
|
|
135
|
+
border-radius: 0;
|
|
136
|
+
padding-bottom: env(safe-area-inset-bottom, 0px);
|
|
137
|
+
animation: crewlet-modal-lift var(--motion-duration-moderate) var(--motion-easing-emphasized);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
115
141
|
/*
|
|
116
142
|
* The sheet's veil fades over the same span the sheet itself travels, so the
|
|
117
143
|
* two are one movement rather than a ground that lands and a panel that
|
|
@@ -584,4 +610,8 @@
|
|
|
584
610
|
.crewlet-modal-overlay--bottom > .crewlet-modal--dialog {
|
|
585
611
|
animation: none;
|
|
586
612
|
}
|
|
613
|
+
|
|
614
|
+
.crewlet-modal-overlay--phone-sheet > .crewlet-modal--dialog {
|
|
615
|
+
animation: none;
|
|
616
|
+
}
|
|
587
617
|
}
|