@crewlethq/ui 0.39.0 → 0.40.1
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 +47 -1
- package/dist/AppShell/AppShell.d.ts +13 -2
- package/dist/AppShell/index.js +1 -1
- package/dist/{AppShell-NDU4XMGF.css → AppShell-VE2MAV42.css} +71 -7
- package/dist/ArtifactBar/index.js +6 -5
- package/dist/AvatarPicker/index.js +10 -6
- package/dist/CatalogTile/index.js +1 -1
- package/dist/{CatalogTile-TGR2ZZVQ.css → CatalogTile-XL4XLFUH.css} +8 -4
- package/dist/CharacterPicker/index.js +2 -2
- package/dist/Charts/Histogram.d.ts +71 -0
- package/dist/Charts/index.d.ts +2 -0
- package/dist/Charts/index.js +1 -1
- package/dist/{Charts-MBJG72BS.css → Charts-TZ744HT6.css} +118 -0
- package/dist/DataGrid/DataGrid.d.ts +267 -0
- package/dist/DataGrid/index.d.ts +3 -0
- package/dist/DataGrid/index.js +7 -0
- package/dist/DataGrid-AQKPJD7W.css +482 -0
- package/dist/HuePicker/index.js +11 -4
- package/dist/LayersList/index.js +2 -2
- package/dist/LockedLabel/LockedLabel.d.ts +34 -0
- package/dist/LockedLabel/index.d.ts +3 -0
- package/dist/LockedLabel/index.js +3 -0
- package/dist/LockedLabel-VQEGEB7G.css +16 -0
- package/dist/MarkdownEditor/index.js +8 -5
- package/dist/MergeConflicts/index.js +11 -5
- package/dist/PageNote/PageNote.d.ts +14 -0
- package/dist/PageNote/index.d.ts +3 -0
- package/dist/PageNote/index.js +2 -0
- package/dist/PageNote-RHLXH3ML.css +12 -0
- package/dist/PropertyList/PropertyList.d.ts +88 -0
- package/dist/PropertyList/index.d.ts +3 -0
- package/dist/PropertyList/index.js +7 -0
- package/dist/PropertyList-SCYM66LL.css +96 -0
- package/dist/RelatedRow/RelatedRow.d.ts +27 -0
- package/dist/RelatedRow/index.d.ts +3 -0
- package/dist/RelatedRow/index.js +9 -0
- package/dist/RelatedRow-2FVS6QQA.css +6 -0
- package/dist/SectionFrame/SectionFrame.d.ts +76 -0
- package/dist/SectionFrame/index.d.ts +3 -0
- package/dist/SectionFrame/index.js +7 -0
- package/dist/SectionFrame-M62UUVFQ.css +164 -0
- package/dist/SegmentedControl/index.js +11 -4
- package/dist/SheetColumnEditor/index.js +6 -5
- package/dist/SheetGrid/index.js +2 -2
- package/dist/SidebarNav/SidebarNav.d.ts +35 -2
- package/dist/SidebarNav/index.js +2 -1
- package/dist/{SidebarNav-7SGUZYKK.css → SidebarNav-YI74SPDC.css} +10 -0
- package/dist/Tabs/Tabs.d.ts +55 -1
- package/dist/Tabs/fold.d.ts +54 -0
- package/dist/Tabs/index.d.ts +1 -1
- package/dist/Tabs/index.js +9 -2
- package/dist/Tabs/roving.d.ts +3 -3
- package/dist/{Tabs-WIF7457H.css → Tabs-S7F4RWAN.css} +77 -0
- package/dist/TagsInput/index.js +1 -1
- package/dist/ThemeGallery/index.js +2 -2
- package/dist/ThemeSwitcher/index.js +12 -5
- package/dist/VersionCompare/index.js +12 -5
- package/dist/{chunk-B5J23C73.js → chunk-2PEXZ7L4.js} +1 -1
- package/dist/{chunk-TZYFTC4M.js → chunk-2VOHUGUA.js} +1 -1
- package/dist/{chunk-2QZ2VPHR.js → chunk-4OK4DX3V.js} +2 -2
- package/dist/{chunk-ECGGQX2H.js → chunk-A44YHLCQ.js} +2 -2
- package/dist/{chunk-F4LPQA4E.js → chunk-BA32AVKS.js} +1 -1
- package/dist/chunk-CV4NES3P.js +9 -0
- package/dist/{chunk-PPHTIKZO.js → chunk-E4BOVKNJ.js} +1 -1
- package/dist/{chunk-W7PAIVAP.js → chunk-E7QLG3PG.js} +30 -9
- package/dist/{chunk-RKKO7QHH.js → chunk-EGMQURBR.js} +5 -4
- package/dist/{chunk-GMW4ZHST.js → chunk-EX22Q5SH.js} +2 -2
- package/dist/{chunk-F3WZ5AKM.js → chunk-GFYQKMQZ.js} +1 -1
- package/dist/{chunk-DYB66CNM.js → chunk-GR4YM7HT.js} +6 -3
- package/dist/{chunk-HG5VF3TZ.js → chunk-HMVQQEHW.js} +91 -2
- package/dist/chunk-INVSUFJK.js +71 -0
- package/dist/{chunk-4LRAJXHL.js → chunk-JSWOXRRE.js} +1 -1
- package/dist/{chunk-ZMDYQ2HH.js → chunk-KWWP3D7M.js} +1 -1
- package/dist/{chunk-46RL3E54.js → chunk-M6NQ4XGK.js} +1 -1
- package/dist/chunk-OHGH7O6T.js +19 -0
- package/dist/{chunk-4ISUIS6F.js → chunk-OOC7Q67K.js} +1 -1
- package/dist/{chunk-XNXK5MA4.js → chunk-PCT47E7O.js} +1 -1
- package/dist/{chunk-YEVG2X5R.js → chunk-SNQRGH4A.js} +1 -1
- package/dist/chunk-T6MXORP5.js +116 -0
- package/dist/chunk-X4IXXLWM.js +306 -0
- package/dist/chunk-XIDD7PJO.js +416 -0
- package/dist/chunk-ZUTUI27P.js +21 -0
- package/dist/generated/index.d.ts +6 -0
- package/dist/generated/index.js +62 -56
- package/dist/index.js +62 -56
- package/dist/styles.css +1087 -20
- package/package.json +3 -3
- package/dist/chunk-7SDUKCNW.js +0 -141
- package/dist/{chunk-JZPK4IXR.js → chunk-DKNBGL26.js} +1 -1
- /package/dist/{chunk-QRLIWCLX.js → chunk-S3QTFUJX.js} +0 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import { type SetBy } from '../ObjectHeader/index.js';
|
|
3
|
+
/** One fact about an object, as a labelled row of its properties. */
|
|
4
|
+
export interface PropertyListItem {
|
|
5
|
+
/** What the property is called. Also the row's identity within its group. */
|
|
6
|
+
label: string;
|
|
7
|
+
/**
|
|
8
|
+
* The value. Absent (null, undefined or "") draws the dash: the property
|
|
9
|
+
* exists and holds nothing. `0` and `false` are values and are drawn.
|
|
10
|
+
*/
|
|
11
|
+
value?: ReactNode;
|
|
12
|
+
/** A page the value links to. */
|
|
13
|
+
href?: string | undefined;
|
|
14
|
+
/** Who last changed it. Never drawn under an absent value, unless the change cleared it. */
|
|
15
|
+
setBy?: SetBy | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Which change set the value, where the by-line alone cannot tell two apart:
|
|
18
|
+
* one actor making two edits that both read "2h ago" are still two changes.
|
|
19
|
+
* Consecutive rows share one by-line only when their by-lines and this agree.
|
|
20
|
+
*/
|
|
21
|
+
change?: string | undefined;
|
|
22
|
+
/** Said on hover, where a label needs a sentence the list has no room for. */
|
|
23
|
+
title?: string | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* The label is an IDENTIFIER rather than a word (an environment variable's
|
|
26
|
+
* name, a tag's key), and wears the mono face. A value that is an identifier
|
|
27
|
+
* is the caller's to set.
|
|
28
|
+
*/
|
|
29
|
+
identifierLabel?: boolean | undefined;
|
|
30
|
+
}
|
|
31
|
+
/** A run of properties under one heading. */
|
|
32
|
+
export interface PropertyListGroup {
|
|
33
|
+
/** The section heading. Left out, the rows run on without one. */
|
|
34
|
+
name?: string | undefined;
|
|
35
|
+
items: readonly PropertyListItem[];
|
|
36
|
+
/**
|
|
37
|
+
* Said in place of the rows when every one of them is absent: a group nobody
|
|
38
|
+
* has filled in anywhere is one fact, not one dash per row. Set it only where
|
|
39
|
+
* the whole group genuinely means one thing when empty ("Nothing scheduled:
|
|
40
|
+
* no dates, no estimate, no size"); without it every dash stays.
|
|
41
|
+
*/
|
|
42
|
+
whenAllAbsent?: string | undefined;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* How a group's heading is set. `eyebrow` is the small capitals of a rail
|
|
46
|
+
* beside an object; `sentence` is sentence case, for a column whose other
|
|
47
|
+
* sections are titled that way.
|
|
48
|
+
*/
|
|
49
|
+
export type PropertyListHeadings = 'eyebrow' | 'sentence';
|
|
50
|
+
export interface PropertyListProps {
|
|
51
|
+
groups: readonly PropertyListGroup[];
|
|
52
|
+
headings?: PropertyListHeadings | undefined;
|
|
53
|
+
/** What an absent value is read as, in place of the dash. */
|
|
54
|
+
emptyLabel?: string | undefined;
|
|
55
|
+
/** The word a by-line's turn link is drawn with. See `SetByLine`. */
|
|
56
|
+
turnLabel?: string | undefined;
|
|
57
|
+
/** Names the list for a screen reader, where nothing above it does. */
|
|
58
|
+
'aria-label'?: string | undefined;
|
|
59
|
+
className?: string | undefined;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* An object's own facts, as labelled rows in sections, beside or under it.
|
|
63
|
+
*
|
|
64
|
+
* ONE TERM COLUMN DOWN THE WHOLE LIST. Each group is its own description list,
|
|
65
|
+
* so a screen reader hears each section as a list named by its heading, and
|
|
66
|
+
* each is a subgrid of the one grid, so the labels of every section share a
|
|
67
|
+
* single column instead of restarting it per section. The column is the
|
|
68
|
+
* description list's own measure (`--crewlet-description-list-term`), so a
|
|
69
|
+
* page that sets it once lines this list up with every key-value card on it.
|
|
70
|
+
*
|
|
71
|
+
* AN ABSENT VALUE IS A DECISION, not a default, and the caller makes it in
|
|
72
|
+
* one of four ways that are not interchangeable:
|
|
73
|
+
*
|
|
74
|
+
* - the row is LEFT OUT: this object has no such property at all;
|
|
75
|
+
* - the row is a DASH (`value` absent): the property exists and holds nothing;
|
|
76
|
+
* - the row SAYS SOMETHING: the emptiness means something a reader should know;
|
|
77
|
+
* - the WHOLE GROUP says one thing (`whenAllAbsent`), because every property
|
|
78
|
+
* in it is absent. Its heading stays: the group exists and is empty, which
|
|
79
|
+
* is a different claim from an object that has no such group.
|
|
80
|
+
*
|
|
81
|
+
* ONE ATTRIBUTION PER CHANGE, NOT PER ROW. A create sets several fields at
|
|
82
|
+
* once, and identical by-lines under each of them are one sentence copied out
|
|
83
|
+
* several times. A run of consecutive rows set by one change draws ONE line,
|
|
84
|
+
* naming what it covers, under the last of them. AND NEVER UNDER AN ABSENCE:
|
|
85
|
+
* provenance under a dash claims somebody set nothing. The exception is a
|
|
86
|
+
* change that emptied the field, which reads "cleared by".
|
|
87
|
+
*/
|
|
88
|
+
export declare function PropertyList({ groups, headings, emptyLabel, turnLabel, 'aria-label': ariaLabel, className, }: PropertyListProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* An object's properties, in sections, on one grid.
|
|
3
|
+
*
|
|
4
|
+
* ONE TERM COLUMN DOWN THE WHOLE LIST. Every section is a description list of
|
|
5
|
+
* its own, laid out as a SUBGRID of this one, so its terms and details sit on
|
|
6
|
+
* this grid's two tracks and every section's labels start and end where the
|
|
7
|
+
* others' do. The term track is the description list's own measure,
|
|
8
|
+
* `--crewlet-description-list-term`, so a page that sets it once lines a list
|
|
9
|
+
* of properties up with every key-value card on it. Unset, it is the rail's
|
|
10
|
+
* own: as wide as the longest label, and never under 92px, which a one-word
|
|
11
|
+
* label ("Due") would otherwise shrink the column to.
|
|
12
|
+
*
|
|
13
|
+
* SIDE BY SIDE AT EVERY WIDTH. A list of properties sits in a rail or a card
|
|
14
|
+
* of its own width, so the window's width says nothing about the room it has;
|
|
15
|
+
* the description list's narrow step (term over detail) is cancelled below.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
.crewlet-property-list {
|
|
19
|
+
display: grid;
|
|
20
|
+
grid-template-columns: var(--crewlet-description-list-term, minmax(92px, max-content)) minmax(0, 1fr);
|
|
21
|
+
gap: var(--spacing-2) var(--spacing-3);
|
|
22
|
+
align-items: baseline;
|
|
23
|
+
min-width: 0;
|
|
24
|
+
font-size: var(--font-size-compact);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/* Two classes, so the description list's own track and narrow step (one
|
|
28
|
+
class, in a media query) give way to the subgrid at every width. */
|
|
29
|
+
.crewlet-property-list > .crewlet-property-list__group {
|
|
30
|
+
grid-column: 1 / -1;
|
|
31
|
+
grid-template-columns: subgrid;
|
|
32
|
+
gap: inherit;
|
|
33
|
+
font-size: inherit;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.crewlet-property-list .crewlet-description-list__detail {
|
|
37
|
+
margin-bottom: 0;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/* THE LABEL IS AN IDENTIFIER (an environment variable's name, a tag's key),
|
|
41
|
+
set in the mono face; a word stays in the list's own. */
|
|
42
|
+
.crewlet-property-list__identifier {
|
|
43
|
+
font-family: var(--font-family-mono);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/*
|
|
47
|
+
* A SECTION'S HEADING, with a hairline above it that separates it from the
|
|
48
|
+
* section before. The list's FIRST heading has nothing to be separated from,
|
|
49
|
+
* so it alone loses the hairline; a list that opens with rows of no section
|
|
50
|
+
* keeps it on its first heading, which has rows above it.
|
|
51
|
+
*/
|
|
52
|
+
.crewlet-property-list__heading {
|
|
53
|
+
grid-column: 1 / -1;
|
|
54
|
+
margin-top: var(--spacing-2);
|
|
55
|
+
padding-top: var(--spacing-2);
|
|
56
|
+
border-top: 1px solid var(--color-border-default);
|
|
57
|
+
color: var(--color-text-tertiary);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.crewlet-property-list__heading:first-child {
|
|
61
|
+
margin-top: 0;
|
|
62
|
+
padding-top: 0;
|
|
63
|
+
border-top: none;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.crewlet-property-list--eyebrow .crewlet-property-list__heading {
|
|
67
|
+
font-size: var(--font-size-2xs);
|
|
68
|
+
font-weight: var(--font-weight-medium);
|
|
69
|
+
letter-spacing: var(--font-letter-spacing-wide);
|
|
70
|
+
text-transform: uppercase;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.crewlet-property-list--sentence .crewlet-property-list__heading {
|
|
74
|
+
font-size: var(--font-size-xs);
|
|
75
|
+
font-weight: var(--font-weight-medium);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* A SECTION NOBODY HAS FILLED IN, said once across both tracks in the words
|
|
79
|
+
its caller wrote. It is a sentence a reader has to read, so it takes the
|
|
80
|
+
tertiary rung, never the muted one (a floor for a mark). */
|
|
81
|
+
.crewlet-property-list__empty {
|
|
82
|
+
grid-column: 1 / -1;
|
|
83
|
+
margin: 0;
|
|
84
|
+
font-size: var(--font-size-xs);
|
|
85
|
+
color: var(--color-text-tertiary);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* WHO SET IT, under the value rather than beside it: the value is what the
|
|
89
|
+
reader came for. A line of its own, so a long actor name cannot push the
|
|
90
|
+
value out of its track. */
|
|
91
|
+
.crewlet-property-list__set-by {
|
|
92
|
+
display: block;
|
|
93
|
+
margin-top: 2px;
|
|
94
|
+
font-size: var(--font-size-2xs);
|
|
95
|
+
color: var(--color-text-tertiary);
|
|
96
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export interface RelatedRowProps {
|
|
3
|
+
/** Where the row goes. */
|
|
4
|
+
href: string;
|
|
5
|
+
/** The destination's own glyph, at the small step. */
|
|
6
|
+
icon: ReactNode;
|
|
7
|
+
/** The place, by its name. */
|
|
8
|
+
title: ReactNode;
|
|
9
|
+
/** One sentence: what is there, and where. */
|
|
10
|
+
description: ReactNode;
|
|
11
|
+
/** What the region is called for assistive technology. */
|
|
12
|
+
label?: string | undefined;
|
|
13
|
+
className?: string | undefined;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* The one related place a page points at, as a quiet linked row under its
|
|
17
|
+
* content (Policies to the engine's limits, Nodes to its backups).
|
|
18
|
+
*
|
|
19
|
+
* A ROW, NOT A FOOTNOTE. A trailing caption ("The caps are in Settings ›
|
|
20
|
+
* Limits.") was a sentence a reader had to find the link inside. The row
|
|
21
|
+
* stands on a card's own inset, so its glyph stands under the card heads'
|
|
22
|
+
* glyphs and its words under their titles, and the whole row is the link.
|
|
23
|
+
*
|
|
24
|
+
* An application offers it only to a reader who may open the place: a link to
|
|
25
|
+
* a page that refuses them is a dead end offered as a way on.
|
|
26
|
+
*/
|
|
27
|
+
export declare function RelatedRow({ href, icon, title, description, label, className }: RelatedRowProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { RelatedRow } from '../chunk-ZUTUI27P.js';
|
|
2
|
+
import '../chunk-IKBK4A5O.js';
|
|
3
|
+
import '../chunk-ZAC7SKUN.js';
|
|
4
|
+
import '../chunk-INHXF2CL.js';
|
|
5
|
+
import '../chunk-AV2DXAEL.js';
|
|
6
|
+
import '../chunk-BHHIIK3M.js';
|
|
7
|
+
import '../chunk-PQADV6P6.js';
|
|
8
|
+
import '../chunk-BZFWDIV6.js';
|
|
9
|
+
import '../chunk-ODEQTPFM.js';
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export interface SectionFrameProps {
|
|
3
|
+
/**
|
|
4
|
+
* The column's width, as a CSS length: `236px`, the rail's own. Handed in
|
|
5
|
+
* rather than fixed, so the number an application counts for its own
|
|
6
|
+
* layout (a peek's threshold) and the column drawn are one value.
|
|
7
|
+
*/
|
|
8
|
+
columnWidth: string;
|
|
9
|
+
/**
|
|
10
|
+
* The column folds to a one-row picker over the body, which takes the
|
|
11
|
+
* whole width. The APPLICATION decides when, because the width at which a
|
|
12
|
+
* section beside the column becomes too narrow is its own arithmetic (its
|
|
13
|
+
* rail, its sheet, the floor its sections need), and the same answer
|
|
14
|
+
* usually decides something else too; a second measurement here would be a
|
|
15
|
+
* second answer to one question.
|
|
16
|
+
*/
|
|
17
|
+
folded?: boolean | undefined;
|
|
18
|
+
/** A `SectionFrame.Nav` and a `SectionFrame.Body`. */
|
|
19
|
+
children?: ReactNode;
|
|
20
|
+
className?: string | undefined;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* A workspace's sections as a column beside the screen: a list of grouped
|
|
24
|
+
* sections that stays put while the section beside it scrolls, and that
|
|
25
|
+
* folds, where the window is too narrow for both, to one row naming the
|
|
26
|
+
* section the reader is on.
|
|
27
|
+
*
|
|
28
|
+
* FLUSH WITH THE SHEET. In an `AppShell` the frame takes back the content
|
|
29
|
+
* column's padding and gives it to the body, so the column runs the full
|
|
30
|
+
* height of the view with its hairline, and the section keeps the screen's
|
|
31
|
+
* own inset. The column is the view's height (`100cqb`, the shell's
|
|
32
|
+
* scroller is a size container), never the section's, so it sticks for the
|
|
33
|
+
* whole scroll and a long list scrolls inside itself.
|
|
34
|
+
*/
|
|
35
|
+
export declare function SectionFrame({ columnWidth, folded, className, children }: SectionFrameProps): import("react").JSX.Element;
|
|
36
|
+
export declare namespace SectionFrame {
|
|
37
|
+
var Nav: typeof SectionFrameNav;
|
|
38
|
+
var Body: typeof SectionFrameBody;
|
|
39
|
+
}
|
|
40
|
+
export interface SectionFrameNavProps {
|
|
41
|
+
/**
|
|
42
|
+
* The workspace the sections belong to, by its name: "Settings". The list
|
|
43
|
+
* is "Settings sections", and the folded picker reads "Settings Section:
|
|
44
|
+
* People" to a screen reader.
|
|
45
|
+
*/
|
|
46
|
+
scope: string;
|
|
47
|
+
/** The section the reader is on, for the folded picker's row. */
|
|
48
|
+
current?: {
|
|
49
|
+
label: string;
|
|
50
|
+
icon?: ReactNode;
|
|
51
|
+
} | undefined;
|
|
52
|
+
/**
|
|
53
|
+
* The address the reader is on, as the rows' own `href`s write it. A
|
|
54
|
+
* change of it is an arrival: the picker folds again where the reader
|
|
55
|
+
* picked a row of this list, and opens where `openOnArrival` asks.
|
|
56
|
+
*/
|
|
57
|
+
location: string;
|
|
58
|
+
/**
|
|
59
|
+
* Arriving here opens the folded picker rather than folding it: the
|
|
60
|
+
* workspace's own address on a phone, which names no section anybody
|
|
61
|
+
* picked, where a folded row naming the first section hid every group
|
|
62
|
+
* under it. A deep link to a section arrives folded, so the section it
|
|
63
|
+
* named starts right under the picker.
|
|
64
|
+
*/
|
|
65
|
+
openOnArrival?: boolean | undefined;
|
|
66
|
+
/** The groups of rows: `SidebarNav.Group`s of `SidebarNav.Item`s. */
|
|
67
|
+
children?: ReactNode;
|
|
68
|
+
}
|
|
69
|
+
/** The frame's column: the sections list, and the picker it folds to. */
|
|
70
|
+
export declare function SectionFrameNav({ scope, current, location, openOnArrival, children }: SectionFrameNavProps): import("react").JSX.Element;
|
|
71
|
+
export interface SectionFrameBodyProps {
|
|
72
|
+
children?: ReactNode;
|
|
73
|
+
className?: string | undefined;
|
|
74
|
+
}
|
|
75
|
+
/** The section beside the column, on the screen's own inset. */
|
|
76
|
+
export declare function SectionFrameBody({ children, className }: SectionFrameBodyProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { SectionFrame, SectionFrameBody, SectionFrameNav } from '../chunk-INVSUFJK.js';
|
|
2
|
+
import '../chunk-E7QLG3PG.js';
|
|
3
|
+
import '../chunk-OHGH7O6T.js';
|
|
4
|
+
import '../chunk-FYTIJM2T.js';
|
|
5
|
+
import '../chunk-2YTOOH3A.js';
|
|
6
|
+
import '../chunk-BZFWDIV6.js';
|
|
7
|
+
import '../chunk-ODEQTPFM.js';
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* SectionFrame: a column of sections beside the screen, and the one-row
|
|
3
|
+
* picker it folds to.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/* THE FRAME TAKES THE CONTENT COLUMN'S PADDING BACK and gives it to the body,
|
|
7
|
+
so the column is flush with the sheet and the section keeps the inset. */
|
|
8
|
+
.crewlet-app-shell__content:has(> .crewlet-section-frame) {
|
|
9
|
+
min-height: 100%;
|
|
10
|
+
padding: 0;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.crewlet-section-frame {
|
|
14
|
+
display: grid;
|
|
15
|
+
flex: 1 1 auto;
|
|
16
|
+
grid-template-columns: var(--crewlet-section-frame-column) minmax(0, 1fr);
|
|
17
|
+
min-height: 100%;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/*
|
|
21
|
+
* AS TALL AS THE VIEW, NEVER AS THE GRID. A sticky box moves only inside its
|
|
22
|
+
* grid area, which the section beside it makes as tall as its content; sized
|
|
23
|
+
* against that area the column was exactly as tall as the section, had
|
|
24
|
+
* nowhere to stick, and a wheel over a long section carried the list off the
|
|
25
|
+
* top. At the view's height (`100cqb`: the shell's scroller is a size
|
|
26
|
+
* container) it sticks for the whole scroll and a long list scrolls in itself.
|
|
27
|
+
*
|
|
28
|
+
* IT KEEPS THE WHEEL AT ITS ENDS. A box whose bottom is below the fold traps
|
|
29
|
+
* the wheel; this one is exactly the view and always all on screen, so what
|
|
30
|
+
* chaining would do is move the section beside it at the list's end, which
|
|
31
|
+
* is not what the pointer is over.
|
|
32
|
+
*/
|
|
33
|
+
.crewlet-section-frame__nav {
|
|
34
|
+
position: sticky;
|
|
35
|
+
top: 0;
|
|
36
|
+
align-self: start;
|
|
37
|
+
height: 100cqb;
|
|
38
|
+
overflow-y: auto;
|
|
39
|
+
overscroll-behavior: contain;
|
|
40
|
+
padding: var(--spacing-4) 0;
|
|
41
|
+
border-right: 1px solid var(--color-border-default);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.crewlet-section-frame__body {
|
|
45
|
+
display: flex;
|
|
46
|
+
flex-direction: column;
|
|
47
|
+
gap: var(--spacing-5);
|
|
48
|
+
min-width: 0;
|
|
49
|
+
padding: var(--spacing-5) var(--spacing-5) var(--spacing-10);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/* BESIDE THE SECTION there is room for the whole list: no toggle, and the
|
|
53
|
+
list is always drawn. */
|
|
54
|
+
.crewlet-section-frame__toggle {
|
|
55
|
+
display: none;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/*
|
|
59
|
+
* FOLDED: one pane, the picker above the section. The picker's row is its
|
|
60
|
+
* own height and the section takes the rest: two `auto` rows split a short
|
|
61
|
+
* section's spare height and opened a band of nothing between the picker
|
|
62
|
+
* and the section it names.
|
|
63
|
+
*/
|
|
64
|
+
.crewlet-section-frame[data-folded] {
|
|
65
|
+
grid-template-columns: minmax(0, 1fr);
|
|
66
|
+
grid-template-rows: auto 1fr;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/* IN THE FLOW, as tall as it is, on the section's own gutter: the list it
|
|
70
|
+
unfolds is part of the page rather than a pane of its own. */
|
|
71
|
+
.crewlet-section-frame[data-folded] > .crewlet-section-frame__nav {
|
|
72
|
+
position: static;
|
|
73
|
+
height: auto;
|
|
74
|
+
overflow-y: visible;
|
|
75
|
+
padding: var(--spacing-2) var(--spacing-5);
|
|
76
|
+
border-right: none;
|
|
77
|
+
border-bottom: 1px solid var(--color-border-default);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/* ONE ROW NAMING WHERE THE READER IS, which unfolds the list. Its glyph and
|
|
81
|
+
name stand over the glyphs and names of the rows: the rows' own inset,
|
|
82
|
+
less the toggle's border. */
|
|
83
|
+
.crewlet-section-frame[data-folded] .crewlet-section-frame__toggle {
|
|
84
|
+
display: flex;
|
|
85
|
+
align-items: center;
|
|
86
|
+
gap: var(--spacing-2);
|
|
87
|
+
width: 100%;
|
|
88
|
+
min-height: var(--size-target-min);
|
|
89
|
+
padding: 0 calc(var(--size-nav-row-pad) - 1px);
|
|
90
|
+
border: 1px solid var(--color-border-default);
|
|
91
|
+
border-radius: var(--radius-sm);
|
|
92
|
+
background: var(--color-surface-elevated);
|
|
93
|
+
color: var(--color-text-primary);
|
|
94
|
+
font: inherit;
|
|
95
|
+
font-weight: var(--font-weight-medium);
|
|
96
|
+
text-align: left;
|
|
97
|
+
cursor: pointer;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.crewlet-section-frame[data-folded] .crewlet-section-frame__toggle:hover {
|
|
101
|
+
background: var(--color-surface-hover);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/* INSIDE ITS OWN EDGE, as every control that draws one rings. */
|
|
105
|
+
.crewlet-section-frame__toggle:focus-visible {
|
|
106
|
+
outline: 2px solid var(--color-focus);
|
|
107
|
+
outline-offset: var(--size-focus-ring-inset-offset);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.crewlet-section-frame__toggle-icon {
|
|
111
|
+
display: inline-flex;
|
|
112
|
+
flex: none;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.crewlet-section-frame__toggle-name {
|
|
116
|
+
flex: 1 1 auto;
|
|
117
|
+
min-width: 0;
|
|
118
|
+
overflow: hidden;
|
|
119
|
+
text-overflow: ellipsis;
|
|
120
|
+
white-space: nowrap;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/* "Section ·" BEFORE THE NAME, in the quiet ink, so the row reads as a
|
|
124
|
+
control holding the other sections rather than as the page's title. */
|
|
125
|
+
.crewlet-section-frame__toggle-prefix {
|
|
126
|
+
color: var(--color-text-tertiary);
|
|
127
|
+
font-weight: var(--font-weight-regular);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.crewlet-section-frame__chevron {
|
|
131
|
+
flex: none;
|
|
132
|
+
color: var(--color-text-tertiary);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.crewlet-section-frame__nav[data-open] .crewlet-section-frame__chevron {
|
|
136
|
+
transform: rotate(180deg);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.crewlet-section-frame[data-folded] .crewlet-section-frame__nav:not([data-open]) .crewlet-section-frame__list {
|
|
140
|
+
display: none;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.crewlet-section-frame[data-folded] .crewlet-section-frame__nav[data-open] .crewlet-section-frame__list {
|
|
144
|
+
padding-top: var(--spacing-2);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/* THE LIST TAKES NO GUTTER OF ITS OWN inside the folded picker, which is
|
|
148
|
+
inset already: with the rail's gutter on top, its glyphs sat 11px right of
|
|
149
|
+
the toggle's. */
|
|
150
|
+
.crewlet-section-frame[data-folded] .crewlet-section-frame__list > .crewlet-sidebar-nav {
|
|
151
|
+
padding-inline: 0;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/* A PHONE'S ONE GUTTER: the section and the picker start where every other
|
|
155
|
+
screen's content does. */
|
|
156
|
+
@media (width < 640px) {
|
|
157
|
+
.crewlet-section-frame__body {
|
|
158
|
+
padding: var(--spacing-4) var(--spacing-4) var(--spacing-9);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
.crewlet-section-frame[data-folded] > .crewlet-section-frame__nav {
|
|
162
|
+
padding-inline: var(--spacing-4);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
@@ -1,8 +1,15 @@
|
|
|
1
|
-
import '../chunk-
|
|
2
|
-
export { SegmentedControl } from '../chunk-
|
|
3
|
-
import '../chunk-
|
|
4
|
-
import '../chunk-
|
|
1
|
+
import '../chunk-OOC7Q67K.js';
|
|
2
|
+
export { SegmentedControl } from '../chunk-4OK4DX3V.js';
|
|
3
|
+
import '../chunk-X4IXXLWM.js';
|
|
4
|
+
import '../chunk-WIATRXEJ.js';
|
|
5
|
+
import '../chunk-EGMQURBR.js';
|
|
5
6
|
import '../chunk-BHHIIK3M.js';
|
|
7
|
+
import '../chunk-D6FEHY5G.js';
|
|
8
|
+
import '../chunk-OMV5W53A.js';
|
|
9
|
+
import '../chunk-H5XTJ7GJ.js';
|
|
6
10
|
import '../chunk-2YTOOH3A.js';
|
|
11
|
+
import '../chunk-OG6CL3EB.js';
|
|
12
|
+
import '../chunk-4FQT6ZAY.js';
|
|
13
|
+
import '../chunk-NUZHC6MM.js';
|
|
7
14
|
import '../chunk-BZFWDIV6.js';
|
|
8
15
|
import '../chunk-ODEQTPFM.js';
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
export { SHEET_COLUMN_EDITOR_LABELS, SheetColumnEditor, SheetColumnTypeGlyph } from '../chunk-
|
|
1
|
+
export { SHEET_COLUMN_EDITOR_LABELS, SheetColumnEditor, SheetColumnTypeGlyph } from '../chunk-GFYQKMQZ.js';
|
|
2
2
|
import '../chunk-XQZ6EWOE.js';
|
|
3
3
|
import '../chunk-FFMCMSJB.js';
|
|
4
4
|
import '../chunk-7KHM2FZH.js';
|
|
5
5
|
import '../chunk-LFSIKGRQ.js';
|
|
6
6
|
import '../chunk-Z7JYG5TF.js';
|
|
7
|
-
import '../chunk-
|
|
7
|
+
import '../chunk-BA32AVKS.js';
|
|
8
8
|
import '../chunk-AYKXMIOR.js';
|
|
9
9
|
import '../chunk-AXS6MBNH.js';
|
|
10
|
-
import '../chunk-
|
|
11
|
-
import '../chunk-
|
|
12
|
-
import '../chunk-
|
|
10
|
+
import '../chunk-4OK4DX3V.js';
|
|
11
|
+
import '../chunk-X4IXXLWM.js';
|
|
12
|
+
import '../chunk-WIATRXEJ.js';
|
|
13
|
+
import '../chunk-EGMQURBR.js';
|
|
13
14
|
import '../chunk-TYONQSOK.js';
|
|
14
15
|
import '../chunk-SMBKXWML.js';
|
|
15
16
|
import '../chunk-BHHIIK3M.js';
|
package/dist/SheetGrid/index.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
export { CellDisplay, CellEditor, CheckboxCell, DateCell, LongTextCell, MultiSelectCell, NumberCell, PersonCell, RatingCell, SelectCell, SheetCell, SheetGrid, StatusCell, TextCell, UrlCell } from '../chunk-
|
|
1
|
+
export { CellDisplay, CellEditor, CheckboxCell, DateCell, LongTextCell, MultiSelectCell, NumberCell, PersonCell, RatingCell, SelectCell, SheetCell, SheetGrid, StatusCell, TextCell, UrlCell } from '../chunk-DKNBGL26.js';
|
|
2
2
|
import '../chunk-O2EGEONV.js';
|
|
3
3
|
import '../chunk-CENOOTAV.js';
|
|
4
4
|
import '../chunk-3BYIWOTV.js';
|
|
5
5
|
import '../chunk-I6POAB4V.js';
|
|
6
6
|
import '../chunk-KYIAFNU7.js';
|
|
7
|
-
import '../chunk-WIATRXEJ.js';
|
|
8
7
|
import '../chunk-66X5WDKE.js';
|
|
9
8
|
import '../chunk-LFSIKGRQ.js';
|
|
10
9
|
import '../chunk-Z7JYG5TF.js';
|
|
11
10
|
import '../chunk-KHJIEPZV.js';
|
|
12
11
|
import '../chunk-AYKXMIOR.js';
|
|
12
|
+
import '../chunk-WIATRXEJ.js';
|
|
13
13
|
import '../chunk-I33UIUZD.js';
|
|
14
14
|
import '../chunk-5AQBPHZD.js';
|
|
15
15
|
import '../chunk-PZKHBB7D.js';
|
|
@@ -69,6 +69,17 @@ export interface NavGroupProps {
|
|
|
69
69
|
* first row.
|
|
70
70
|
*/
|
|
71
71
|
action?: NavGroupAction | undefined;
|
|
72
|
+
/**
|
|
73
|
+
* Every row in the group is closed to this reader, for this reason
|
|
74
|
+
* ("Needs Admin access"). The key is drawn ONCE, after the group's label,
|
|
75
|
+
* which names the reason for a screen reader and as its title; the rows
|
|
76
|
+
* stay links, in the quiet ink, without a key each, so a reader who holds
|
|
77
|
+
* none of a column's access meets one mark per group rather than a wall of
|
|
78
|
+
* keys. A row still says its own reason (its `locked`) as its title and
|
|
79
|
+
* after its name. Only for a NAMED group: a run with no label has no
|
|
80
|
+
* heading to carry the key, so its rows keep theirs.
|
|
81
|
+
*/
|
|
82
|
+
locked?: string | undefined;
|
|
72
83
|
className?: string | undefined;
|
|
73
84
|
children?: ReactNode;
|
|
74
85
|
}
|
|
@@ -79,6 +90,11 @@ export interface NavLinkProps {
|
|
|
79
90
|
href?: string | undefined;
|
|
80
91
|
'aria-current'?: 'page' | undefined;
|
|
81
92
|
onClick?: MouseEventHandler<HTMLElement> | undefined;
|
|
93
|
+
/** The row's hint, as the pointer's title. */
|
|
94
|
+
title?: string | undefined;
|
|
95
|
+
/** The row's `onPrefetch`, on the pointer reaching it and on focus. */
|
|
96
|
+
onPointerEnter?: (() => void) | undefined;
|
|
97
|
+
onFocus?: (() => void) | undefined;
|
|
82
98
|
}
|
|
83
99
|
/**
|
|
84
100
|
* A figure at the end of a row, and what it counts.
|
|
@@ -145,6 +161,23 @@ export interface NavItemProps {
|
|
|
145
161
|
* read after its name.
|
|
146
162
|
*/
|
|
147
163
|
disabledReason?: string | undefined;
|
|
164
|
+
/**
|
|
165
|
+
* Closed to this reader, and why, as a sentence: "Needs Admin access". The
|
|
166
|
+
* row stays and stays a link (a place that vanished is one the reader
|
|
167
|
+
* cannot ask for); its words carry the key after them, the pointer's title
|
|
168
|
+
* says why, and a screen reader hears the reason after the name. See
|
|
169
|
+
* `LockedLabel`. Unlike `disabledReason`, the destination is reachable: it
|
|
170
|
+
* is the page that says the reader may not read it.
|
|
171
|
+
*/
|
|
172
|
+
locked?: string | undefined;
|
|
173
|
+
/** The row's hint, as the pointer's title: what the destination answers. */
|
|
174
|
+
title?: string | undefined;
|
|
175
|
+
/**
|
|
176
|
+
* Called when the pointer reaches the row and when it takes focus: the
|
|
177
|
+
* reader deciding, which is the moment to start fetching where it leads,
|
|
178
|
+
* so the destination is usually in by the time the press lands.
|
|
179
|
+
*/
|
|
180
|
+
onPrefetch?: (() => void) | undefined;
|
|
148
181
|
/** Draws the row's element, for a router that owns navigation. */
|
|
149
182
|
renderLink?: ((props: NavLinkProps) => ReactNode) | undefined;
|
|
150
183
|
onClick?: MouseEventHandler<HTMLElement> | undefined;
|
|
@@ -172,6 +205,6 @@ export declare namespace SidebarNav {
|
|
|
172
205
|
* `<div>` here still carries the label's own padding, which put sixteen blank
|
|
173
206
|
* pixels at the top of the rail and named a group nothing could read.
|
|
174
207
|
*/
|
|
175
|
-
export declare function NavGroup({ label, action, className, children }: NavGroupProps): import("react").JSX.Element;
|
|
208
|
+
export declare function NavGroup({ label, action, locked, className, children }: NavGroupProps): import("react").JSX.Element;
|
|
176
209
|
/** One row: a glyph, a label, an optional badge, and optionally rows beneath. */
|
|
177
|
-
export declare function NavItem({ label, icon, lead, count, badge, href, current, disabledReason, renderLink, onClick, children, expanded, defaultExpanded, onExpandedChange, expandLabel, className, }: NavItemProps): import("react").JSX.Element;
|
|
210
|
+
export declare function NavItem({ label, icon, lead, count, badge, href, current, disabledReason, locked, title, onPrefetch, renderLink, onClick, children, expanded, defaultExpanded, onExpandedChange, expandLabel, className, }: NavItemProps): import("react").JSX.Element;
|
package/dist/SidebarNav/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export { NavGroup, NavItem, SidebarNav } from '../chunk-
|
|
1
|
+
export { NavGroup, NavItem, SidebarNav } from '../chunk-E7QLG3PG.js';
|
|
2
|
+
import '../chunk-OHGH7O6T.js';
|
|
2
3
|
import '../chunk-FYTIJM2T.js';
|
|
3
4
|
import '../chunk-2YTOOH3A.js';
|
|
4
5
|
import '../chunk-BZFWDIV6.js';
|
|
@@ -426,3 +426,13 @@
|
|
|
426
426
|
transition: none;
|
|
427
427
|
}
|
|
428
428
|
}
|
|
429
|
+
|
|
430
|
+
/*
|
|
431
|
+
* A GROUP THE READER HOLDS NONE OF: the key once, after its label (see
|
|
432
|
+
* `NavGroup`'s `locked`), and its resting rows in the quiet ink, so a closed
|
|
433
|
+
* column reads as closed at a glance without a key on every row. A pointed
|
|
434
|
+
* row and the reader's own still lift to the primary step, as every row does.
|
|
435
|
+
*/
|
|
436
|
+
.crewlet-nav-group--locked .crewlet-nav-item__row:not([aria-current]):not(:hover) {
|
|
437
|
+
color: var(--color-text-tertiary);
|
|
438
|
+
}
|