@crewlethq/ui 0.83.0 → 0.84.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +34 -0
  2. package/dist/ActionCard/ActionCard.d.ts +7 -7
  3. package/dist/ActionCard/index.js +1 -1
  4. package/dist/ActionCard-YZKL3CKR.css +130 -0
  5. package/dist/AppShell/AppShell.d.ts +14 -11
  6. package/dist/AppShell/index.js +1 -1
  7. package/dist/{AppShell-U7D2MUUF.css → AppShell-NX5HCD4O.css} +84 -44
  8. package/dist/ArtifactBar/index.js +1 -1
  9. package/dist/ArtifactCard/index.js +2 -2
  10. package/dist/ArtifactKindIllustration/index.js +1 -1
  11. package/dist/{ArtifactKinds-3EH4KR3F.css → ArtifactKinds-27TE3KJL.css} +7 -7
  12. package/dist/ArtifactMakeRow/index.js +1 -1
  13. package/dist/ArtifactNameCell/index.js +1 -1
  14. package/dist/BriefCard/index.js +2 -1
  15. package/dist/CatalogTile/CatalogTile.d.ts +23 -5
  16. package/dist/CatalogTile/index.d.ts +1 -1
  17. package/dist/CatalogTile/index.js +2 -1
  18. package/dist/{CatalogTile-6VF36JWA.css → CatalogTile-TMOSGSV3.css} +4 -3
  19. package/dist/CompactNav/CompactNav.d.ts +10 -6
  20. package/dist/CompactNav/index.js +1 -1
  21. package/dist/DataView/index.js +1 -1
  22. package/dist/DirectoryList/index.js +1 -1
  23. package/dist/{DirectoryList-XZOWYOA3.css → DirectoryList-IXQIMNFS.css} +8 -1
  24. package/dist/InboxList/InboxList.d.ts +28 -2
  25. package/dist/InboxList/index.d.ts +1 -1
  26. package/dist/InboxList/index.js +6 -1
  27. package/dist/{InboxList-OFGSX5IH.css → InboxList-X5Q5WWAI.css} +63 -2
  28. package/dist/ListDetail/ListDetail.d.ts +6 -0
  29. package/dist/ListDetail/index.js +1 -1
  30. package/dist/{ListDetail-N3L7PB46.css → ListDetail-JGESKTR7.css} +38 -0
  31. package/dist/ReadingPane/ReadingPane.d.ts +17 -1
  32. package/dist/ReadingPane/index.d.ts +1 -1
  33. package/dist/ReadingPane/index.js +2 -1
  34. package/dist/{ReadingPane-VLYOWMCM.css → ReadingPane-VFTRDPC5.css} +19 -0
  35. package/dist/RichEditor/index.js +1 -1
  36. package/dist/SectionFrame/index.js +2 -2
  37. package/dist/ShareDialog/index.js +1 -1
  38. package/dist/SidebarNav/SidebarNav.d.ts +18 -2
  39. package/dist/SidebarNav/index.d.ts +1 -1
  40. package/dist/SidebarNav/index.js +1 -1
  41. package/dist/{SidebarNav-E7PZGGA6.css → SidebarNav-IKBKGXW4.css} +20 -0
  42. package/dist/{chunk-AUSFKGKL.js → chunk-3AMWXJQX.js} +1 -1
  43. package/dist/{chunk-Q7N2ATMC.js → chunk-64JNKLLP.js} +57 -9
  44. package/dist/chunk-6C7GQOBV.js +10 -0
  45. package/dist/{chunk-YRNNUCQP.js → chunk-7BDBO2NP.js} +1 -1
  46. package/dist/{chunk-25JQNHTC.js → chunk-BRK3HXGZ.js} +8 -2
  47. package/dist/{chunk-QM3432PH.js → chunk-C4JTX25K.js} +2 -2
  48. package/dist/{chunk-QE4OIE3Q.js → chunk-DJIWCW5Z.js} +6 -4
  49. package/dist/{chunk-QPHD4UUG.js → chunk-F6ZUM66S.js} +160 -25
  50. package/dist/{chunk-MVMVMHYI.js → chunk-HDEKHP65.js} +1 -1
  51. package/dist/{chunk-BXGBGYKH.js → chunk-HKUZ2GYX.js} +1 -1
  52. package/dist/{chunk-ZB3E2Z4Y.js → chunk-J5T5TDM2.js} +1 -1
  53. package/dist/{chunk-C46DDVTK.js → chunk-LTD7KLOU.js} +1 -1
  54. package/dist/{chunk-YBC2CYPD.js → chunk-O4VTQMEF.js} +1 -1
  55. package/dist/{chunk-HTBTAIH6.js → chunk-OM2LABPS.js} +2 -2
  56. package/dist/{chunk-PGBKZSSQ.js → chunk-ORONAXSF.js} +10 -7
  57. package/dist/{chunk-ICE3D63E.js → chunk-QWRAWKB2.js} +50 -9
  58. package/dist/{chunk-SRDNGGZE.js → chunk-RKIJAXQA.js} +1 -1
  59. package/dist/{chunk-CF4M6N6A.js → chunk-XYSSFI5C.js} +1 -7
  60. package/dist/generated/index.js +31 -30
  61. package/dist/index.js +31 -30
  62. package/dist/styles.css +294 -88
  63. package/dist/utils/developing.d.ts +10 -0
  64. package/package.json +3 -3
  65. package/dist/ActionCard-47WSZ2O5.css +0 -110
  66. package/dist/{Editor-5D5Z3LBQ.js → Editor-VGNB35NJ.js} +1 -1
package/README.md CHANGED
@@ -205,6 +205,40 @@ places:
205
205
  - A surface that pans or zooms dispatches `LAYER_REPOSITION_EVENT` on its host
206
206
  when the content beneath it moves, and every panel anchored inside follows.
207
207
 
208
+ ## Changes in 0.84.0
209
+
210
+ ### The application rail
211
+
212
+ **The fold control is a chevron again, before the brand's mark.** The plus and minus of 0.83.0 give way to the chevrons the control drew before them, pointing left to fold the rail while it is full and right to unfold it while it is compact, and the control moves from the rail's top left corner onto the head's row, just before the brand's mark. The control and the mark are one pair, a step apart (`--spacing-1`) and centred together in the compact column, so the 76px column holds both (12, 24, 4, 24, 12) and neither moves when the rail folds; the mark's inset follows from the same arithmetic. Its names, `aria-expanded`, `aria-controls`, `aria-keyshortcuts`, the keys in its tooltip, its target floor and its ring inside its own box are unchanged. In the compact rail the lockup gives up its end inset, so the mark is all the column holds. Props are unchanged.
213
+
214
+ **A badge takes a tone.** `NavItem`'s and `CompactNavItem`'s `badge` (type `NavBadge`) take `tone`, `'attention' | 'quiet'` (Count's own `CountTone`), with `attention` the default, so the inbox's accent pill is unchanged. `quiet` keeps the round pill, its size and its place on the row's end line, in the quiet count's grey: a neutral wash (`--color-fill-soft`) carrying the secondary ink, lifting to the row's ink on the reader's own row, measured on every ground a row can have in every palette. It is for work that is the reader's own and waits but does not call: My work beside the Inbox. In the compact rail a quiet badge is the tile's quiet figure, and a folded group's tile adds up only the badges that call. Story: `SidebarNav` Badge Tones.
215
+
216
+ **Choosing a place in a folded group's flyout leaves focus somewhere.** The flyout closed on every choice, by a press, by the pointer resting and by the keys, but only a choice made with the keys handed focus back to the tile; a press left focus on the place's link, which went with the flyout, so the reader's next Tab started from the top of the document. Focus now follows the navigation: the destination takes it first (the place's handler, or a router that focuses the page it lands on, in its handler or its effects, often only where nothing holds focus), and only where nothing has taken it by the next frame does it go back to the tile, by a press as by a key (without a ring for a pointer reader). A place with no `href` closes like Escape, with focus straight back on the tile.
217
+
218
+ **A choice does not reopen the flyout under a resting pointer.** Choosing a place closed the flyout with the pointer still on the tile or beside it, and resting there opened it again a moment later, over the page just chosen, so the flyout looked as if it had stayed open. After a choice, resting no longer opens it until the pointer has been somewhere other than the tile; a press and the keys still open it at once.
219
+
220
+ ### Screens that fill the window
221
+
222
+ **A list's detail draws its scrollbar on the sheet's edge.** On a fill screen the scroller reserved its scrollbar's gutter and the content column padded inside it, so a `ListDetail`'s detail drew its scrollbar 31px inside the sheet beside an empty strip, and a trailing control (a header's Disconnect, a tile's Open) touched that scrollbar. A fill screen's scroller now reserves no gutter: its column pads its end by the inset plus the gutter instead, so its content stands exactly where it did, publishes that length as `--crewlet-app-shell-bleed-end`, and runs the sheet's whole width (a fill column no longer takes the `--size-content-max` measure; prose inside it keeps its own). A `ListDetail` placed directly in that column takes the length back, so its detail is the pane's outermost box and its scrollbar the sheet's last pixel. The detail reserves its gutter (`scrollbar-gutter: stable`) and keeps the screen's side inset inside itself (`--crewlet-list-detail-end`, the shell's inset by default), so its content, header actions and right-aligned section buttons end under the bar's last control whether or not it scrolls; folded to one pane, the list does the same. Only there: a `ListDetail` on a scrolling or a flush screen, or outside a shell, is as wide as its box, with nothing reserved. On a fill screen the shell reads the scrollbar's width off a hidden gauge, so the bar's controls keep their place between a fill screen and a scrolling one; a flush screen is unchanged. The bar and the column now share one inset, `--crewlet-app-shell-inset` (20px, 16px under the shell's breakpoint). Props are unchanged. Story: `ListDetail` In A Fill Screen, whose play function measures these edges.
223
+
224
+ **A directory's lines clear its scrollbar.** `DirectoryList`'s groups, which scroll on their own above the foot, now reserve their scrollbar's gutter and end their lines a step (`--spacing-2`) before it, so a line's state pill no longer touches the scrollbar and does not move when the list grows long enough to scroll. Props are unchanged.
225
+
226
+ ### Catalogue tiles
227
+
228
+ **Breaking: `CatalogTile`'s `status` is a tone and a word.** It took any node, so one row of tiles drew a service's In use as a soft pill and an app's Connected as a dot and a word, at two heights. It now takes `{ tone, label }` (type `CatalogTileStatus`, `tone` from the kit's `Tone`), and the tile draws every state the same way, the tone's dot and its word, at the caption step. On a compact tile the state stands after the name and the fact after the state on the header line; on a comfortable tile the fact stays in the foot. Pass `status={{ tone: 'success', label: 'In use' }}` where a `Tag` or a `StatusDot` was passed.
229
+
230
+ ### Answering in the inbox
231
+
232
+ **A row taken from a group closes its height.** An `InboxGroup` keeps a keyed row that leaves its children drawn in its place, inert (focus inside it is let go), while its one track eases from `1fr` to `0fr` and it fades, on the slow step with the emphasized curve, so the rows under it slide up rather than jump; it is drawn no more once that motion has ended. The host only removes the row, in the same commit it adds it to another group. Rows need stable keys of their own, such as their ids: a row without one is told apart by its position, so it is not kept while it leaves (it goes at once), and the group says so once in development. Any keyed component child is kept as a row, so a host that draws its rows through a wrapper of its own (a memoized item) has the wrapper forward `leaving` and `onLeft` to its `InboxRow`; a plain element such as an empty state's `li` goes at once. The host's own `onLeft` on a row still runs, once, when the row has closed, which is how a host keeps a group that has emptied drawn until its last row has gone. A list of the host's own can drive the same with `InboxRow`'s `leaving` and `onLeft`. The row's content now stands in one box (`crewlet-inbox-row__body`) so its track can close over it. The motion a suite fakes is exported as `INBOX_ROW_LEAVE` (a transition of the row's own `grid-template-rows`).
233
+
234
+ **An arrival is washed.** `InboxRow`'s `arrived` plays a brief wash of the accent that fades back to the row's own ground, and `InboxGroup`'s `arrived`, a token such as the arriving row's key, plays it over the group's label and count each time it changes, so a row that lands in a closed group is seen to land. Pass either only for a row that has just arrived.
235
+
236
+ **`ReadingPane` moves on with its item.** `contentKey` names what the pane shows: a new value draws the item afresh and plays it in (a short fade and rise on the moderate step, `READING_PANE_ENTER` on the column), and moves focus to its title, without scrolling the page, where the reader was last in the pane (focus came into it, or a press landed in it), as after the control they answered with has gone with its item. A focused body is not taken as the pane's: Safari does not focus a pressed control and a live update moves nothing, so a reader in the list, or nowhere, keeps their place. Every change plays the item in, a return to the first item included. `focusTarget` names another place for it. `ReadingPaneTitle` is now focusable from code (`tabIndex={-1}`), never a tab stop. Under reduced motion nothing moves, and focus still follows. Story: `InboxList` Answering Moves On.
237
+
238
+ ### First-step cards
239
+
240
+ **`ActionCard` is calmer, in light and dark.** The cards a new room opens with ("Add people and agents", "Add a description", "Start from a template") stood on saturated slabs of the kind's hue, deep purple, navy and brown on the dark sheet, under a full-hue edge and a muddy glow. Each ground is now a calm tint: the card rung, tinted by a share of the kind's hue (`--color-artifact-kind-<kind>-ground` and its steps, derived by the tokens build at 0.42 of the hue's chroma and 0.12 of its lightness from the card's neutral, 0.6 and 0.18 under the pointer, held to a chroma ceiling and to 4.5:1 for the title in every palette). The edge is the kind's own, at 3:1: its hue stepped toward the palette's ink until it clears 3:1 on the sheet and on the card's tint (`--color-artifact-kind-<kind>-edge`, derived by the tokens build), and a step further under the pointer (`-edge-strong`, against the strong tint), where the tint deepens and a small shadow lifts the card; the ring is drawn over the card's own edge. The corner and the shadow are from the edge scale (`--radius-xl`, `--shadow-xs`, `--shadow-sm` under the pointer). Every kind's drawing takes the same box, the card's width less its inset at the drawing canvas's own shape, so a tall page and a wide slide weigh the same, set a step into the card's foot on a soft shadow of the kind's Fill, with a lower halo (the glow at 0.24, was 0.46). Props are unchanged.
241
+
208
242
  ## Changes in 0.83.0
209
243
 
210
244
  ### The application rail
@@ -19,14 +19,14 @@ export interface ActionCardProps extends Omit<ButtonHTMLAttributes<HTMLButtonEle
19
19
  onSelect: () => void;
20
20
  }
21
21
  /**
22
- * A first step offered as a picture: a tall card on one of the kit's colour
23
- * grounds, its title at the top and a drawing at its foot. A new room opens
24
- * with a row of these (add people, add a description, start from a
25
- * template) until its first message.
22
+ * A first step offered as a picture: a tall card on a calm tint of one of
23
+ * the kit's kind colours, edged in the kind's hairline, its title at the top
24
+ * and a drawing at its foot. A new room opens with a row of these (add
25
+ * people, add a description, start from a template) until its first message.
26
26
  *
27
- * A QUIET HOVER. The ground deepens a step and a small shadow lifts the card
28
- * off the page; nothing moves, so a row of cards holds still under a pointer
29
- * passing over it.
27
+ * A QUIET HOVER. The tint deepens a step, the edge takes the kind's hue and a
28
+ * small shadow lifts the card off the page; nothing moves, so a row of cards
29
+ * holds still under a pointer passing over it.
30
30
  *
31
31
  * A BUTTON NAMED BY ITS TITLE. The drawing is hidden from assistive
32
32
  * technology, so a reader hears "Add people and agents, button" and nothing
@@ -1,2 +1,2 @@
1
- export { ACTION_CARD_GROUND, ActionCard, ActionCardRow } from '../chunk-HTBTAIH6.js';
1
+ export { ACTION_CARD_GROUND, ActionCard, ActionCardRow } from '../chunk-OM2LABPS.js';
2
2
  import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,130 @@
1
+ /*
2
+ * ActionCard: a first step offered as a picture, on a CALM TINT of an
3
+ * artifact kind's hue. The ground is the kind's own Ground steps
4
+ * (ArtifactKinds.css): the card rung tinted by a share of the hue's chroma,
5
+ * never a slab of it, which the palette suite holds to 4.5:1 for the primary
6
+ * text in every palette and both modes and to a chroma ceiling. The edge is
7
+ * the kind's hue stepped toward the ink until it clears 3:1, a step further
8
+ * under the pointer, and a soft halo of the hue stands behind the drawing.
9
+ */
10
+
11
+ /*
12
+ * ONE ROW THAT SCROLLS SIDEWAYS when it runs out of width, so a phone shows
13
+ * two cards and part of the third (the part says there is more) instead of a
14
+ * tall stack. The block padding keeps the focus ring and the hover shadow
15
+ * inside the scroller's clip; the negative margin gives that space back to
16
+ * the layout. A host that runs the row to its container's edges sets the
17
+ * inline padding and `scroll-padding-inline` to its own inset.
18
+ */
19
+ .crewlet-action-cards {
20
+ display: flex;
21
+ gap: var(--spacing-2);
22
+ overflow-x: auto;
23
+ margin-block: calc(var(--spacing-1) * -1) calc(var(--spacing-2) * -1);
24
+ padding-block: var(--spacing-1) var(--spacing-2);
25
+ scroll-snap-type: x mandatory;
26
+ overscroll-behavior-x: contain;
27
+ scrollbar-width: none;
28
+ }
29
+
30
+ .crewlet-action-cards::-webkit-scrollbar {
31
+ display: none;
32
+ }
33
+
34
+ .crewlet-action-card {
35
+ --crewlet-action-card-ground: var(--crewlet-kind-ground);
36
+ --crewlet-action-card-edge: var(--crewlet-kind-edge);
37
+ position: relative;
38
+ display: flex;
39
+ flex: none;
40
+ flex-direction: column;
41
+ justify-content: space-between;
42
+ width: 148px;
43
+ height: 172px;
44
+ box-sizing: border-box;
45
+ overflow: hidden;
46
+ padding: var(--spacing-3) var(--spacing-3) 0;
47
+ /* THE KIND'S OWN EDGE: its hue stepped toward the ink until it clears 3:1
48
+ on the sheet and on the card's tint (`--color-artifact-kind-<kind>-edge`,
49
+ derived by the tokens build and held by its suite). The Line step, the
50
+ hue at 0.38, did not clear it, and a neutral grey outline read as a card
51
+ from another family. */
52
+ border: 1px solid var(--crewlet-action-card-edge);
53
+ /* The edge scale: the extra-large corner a tall card of its own takes, and
54
+ the smallest shadow, so the card sits on the page rather than in it. */
55
+ border-radius: var(--radius-xl);
56
+ background-color: var(--color-surface-subtle);
57
+ background-image:
58
+ radial-gradient(90% 56% at 50% 100%, var(--crewlet-kind-glow) 0%, transparent 72%),
59
+ linear-gradient(180deg, var(--crewlet-action-card-ground) 0%, var(--crewlet-kind-ground-end) 100%);
60
+ box-shadow: var(--shadow-xs);
61
+ color: var(--color-text-primary);
62
+ font: inherit;
63
+ text-align: left;
64
+ cursor: pointer;
65
+ scroll-snap-align: start;
66
+ transition:
67
+ box-shadow var(--motion-duration-fast) var(--motion-easing-default),
68
+ border-color var(--motion-duration-fast) var(--motion-easing-default);
69
+ }
70
+
71
+ /* A QUIET HOVER: the tint deepens a step, the edge takes a stronger step of
72
+ the hue, and a small shadow lifts the card off the page. Nothing moves, so
73
+ a row of cards stays still under a pointer passing over it. */
74
+ .crewlet-action-card:hover {
75
+ --crewlet-action-card-ground: var(--crewlet-kind-ground-strong);
76
+ --crewlet-action-card-edge: var(--crewlet-kind-edge-strong);
77
+ box-shadow: var(--shadow-sm);
78
+ }
79
+
80
+ /* The card draws its own edge, so the ring is drawn over it, on the same
81
+ corner. */
82
+ .crewlet-action-card:focus-visible {
83
+ outline: 2px solid var(--color-focus);
84
+ outline-offset: var(--size-focus-ring-inset-offset);
85
+ }
86
+
87
+ /* The title at the medium weight, as every emphasis in a conversation is,
88
+ two lines at most at its width, balanced so neither line is one word. */
89
+ .crewlet-action-card__title {
90
+ max-width: 14ch;
91
+ font-size: var(--font-size-sm);
92
+ font-weight: var(--font-weight-medium);
93
+ line-height: var(--font-line-height-snug);
94
+ text-wrap: balance;
95
+ }
96
+
97
+ /*
98
+ * THE DRAWING STANDS ON THE CARD'S FOOT, still, the card's own width less its
99
+ * inset. Every kind's drawing is one canvas (160 by 120), so each takes the
100
+ * same box whatever its shape, a tall page and a wide slide alike, where a
101
+ * fixed width and a height cap drew a page half the size of a slide. It is
102
+ * set a step into the foot, so it stands on the edge rather than floating
103
+ * above it, on a soft shadow of the kind's Fill.
104
+ */
105
+ .crewlet-action-card__art {
106
+ display: flex;
107
+ align-items: flex-end;
108
+ justify-content: center;
109
+ margin-bottom: calc(var(--spacing-2) * -1);
110
+ }
111
+
112
+ .crewlet-action-card__art .crewlet-kind-illustration {
113
+ width: 100%;
114
+ height: auto;
115
+ filter: drop-shadow(0 4px 10px var(--crewlet-kind-fill));
116
+ }
117
+
118
+ /* FORCED COLORS drops the ground and the hue; the edge is drawn in the
119
+ system's text colour, so the card keeps its outline. */
120
+ @media (forced-colors: active) {
121
+ .crewlet-action-card {
122
+ border-color: CanvasText;
123
+ }
124
+ }
125
+
126
+ @media (prefers-reduced-motion: reduce) {
127
+ .crewlet-action-card {
128
+ transition: none;
129
+ }
130
+ }
@@ -132,15 +132,18 @@ export interface AppShellProps extends Omit<HTMLAttributes<HTMLDivElement>, 'tit
132
132
  /** The scroll container itself, for a router restoring a position. */
133
133
  mainRef?: Ref<HTMLElement> | undefined;
134
134
  /**
135
- * Gives the screen the whole height left under the bar, as a flex column,
136
- * for a canvas or a split view that draws to the bottom of the window
137
- * instead of scrolling.
135
+ * Gives the screen the whole height and width left under the bar, as a flex
136
+ * column, for a canvas or a split view that draws to the bottom of the
137
+ * window instead of scrolling. The column keeps its pad, and its end pad
138
+ * counts the scrollbar's width, so its content stands where a scrolling
139
+ * screen's does; a `ListDetail` standing in it reaches past that pad, so
140
+ * its detail's scrollbar is on the sheet's edge.
138
141
  *
139
142
  * `flush` is the same column EDGE TO EDGE: the content column gives up its
140
- * pad, its measure and its gap, and the scroller reserves no gutter, for a
141
- * screen that draws its own frame to the sheet's edges (a conversation with
142
- * a list and a pane either side of it). The column is positioned, so a
143
- * `LayerHost` the screen keeps inside it fills exactly the screen.
143
+ * pad and its gap as well, for a screen that draws its own frame to the
144
+ * sheet's edges (a conversation with a list and a pane either side of it).
145
+ * The column is positioned, so a `LayerHost` the screen keeps inside it
146
+ * fills exactly the screen.
144
147
  */
145
148
  fill?: boolean | 'flush' | undefined;
146
149
  /**
@@ -162,10 +165,10 @@ export interface AppShellProps extends Omit<HTMLAttributes<HTMLDivElement>, 'tit
162
165
  rail?: AppShellRailShape | undefined;
163
166
  /**
164
167
  * Called with the other shape when the reader presses the fold control.
165
- * Given, the shell draws THE fold control (never in the drawer): a minus in
166
- * the rail's top left corner while it is full, and a plus in the same place
167
- * while it is compact. Keeping the choice, and binding a key to it, are the
168
- * application's.
168
+ * Given, the shell draws THE fold control (never in the drawer): a chevron
169
+ * on the head's row, before the brand's mark, pointing left while the rail
170
+ * is full and right while it is compact. Keeping the choice, and binding a
171
+ * key to it, are the application's.
169
172
  */
170
173
  onRailChange?: ((next: AppShellRailShape) => void) | undefined;
171
174
  /**
@@ -1,4 +1,4 @@
1
- export { APP_SHELL_ASIDE_WIDTH, AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellRailStatus, AppShellToggle, AppShellTopbar, readStoredWidth, useAppShell, useScreenBelow, useScreenWidth, useStoredWidth } from '../chunk-PGBKZSSQ.js';
1
+ export { APP_SHELL_ASIDE_WIDTH, AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellRailStatus, AppShellToggle, AppShellTopbar, readStoredWidth, useAppShell, useScreenBelow, useScreenWidth, useStoredWidth } from '../chunk-ORONAXSF.js';
2
2
  import '../chunk-PCAT2EFB.js';
3
3
  import '../chunk-JLOESTT2.js';
4
4
  import '../chunk-YJQXESOJ.js';
@@ -26,6 +26,11 @@
26
26
  .crewlet-app-shell {
27
27
  --crewlet-app-shell-rail: var(--size-shell-rail);
28
28
  --crewlet-app-shell-topbar: var(--size-shell-topbar);
29
+ /* THE SHEET'S SIDE INSET, ONE LENGTH: the bar's, the content column's, and
30
+ the inset a box that reaches past the column to the sheet's edge keeps
31
+ inside itself (a `ListDetail` on a fill screen), one step narrower on a
32
+ narrow window. */
33
+ --crewlet-app-shell-inset: var(--spacing-5);
29
34
  /* What stands on the frame to the sheet's left: the rail's column, or
30
35
  nothing where there is no rail or the rail is a drawer. */
31
36
  --crewlet-app-shell-beside: var(--crewlet-app-shell-rail);
@@ -628,7 +633,8 @@
628
633
  gap: var(--spacing-3);
629
634
  flex: none;
630
635
  height: var(--crewlet-app-shell-topbar);
631
- padding: 0 calc(var(--spacing-5) + var(--crewlet-app-shell-gutter, 0px)) 0 var(--spacing-5);
636
+ padding: 0 calc(var(--crewlet-app-shell-inset) + var(--crewlet-app-shell-gutter, 0px)) 0
637
+ var(--crewlet-app-shell-inset);
632
638
  border-bottom: 1px solid var(--color-border-default);
633
639
  background: var(--color-surface-background);
634
640
  }
@@ -718,46 +724,76 @@
718
724
  gap: var(--spacing-5);
719
725
  max-width: var(--size-content-max);
720
726
  margin: 0 auto;
721
- padding: var(--spacing-5) var(--spacing-5);
727
+ padding: var(--crewlet-app-shell-inset);
722
728
  padding-bottom: var(--crewlet-app-shell-content-end);
723
729
  min-width: 0;
724
730
  }
725
731
 
726
- /* A screen that draws to the bottom of the window: the scroller stops
727
- scrolling and the content column takes the height that is left.
728
-
729
- IT KEEPS THE GUTTER RESERVED, like every other screen. The top bar's end
730
- inset counts the scroller's gutter (`--crewlet-app-shell-gutter`, measured
731
- by the shell), so a fill screen that reserved none put the bar's controls
732
- one gutter further out than on the screen beside it: with classic
733
- scrollbars, Add seat moved 11px between an org chart and its roster, two
734
- tabs of one page. A strip at the end edge of a full-screen canvas is the
735
- smaller cost than a bar that moves under the pointer. */
732
+ /*
733
+ * A screen that draws to the bottom of the window: the scroller stops
734
+ * scrolling and the content column takes the height that is left, and the
735
+ * whole width, since a screen that fills the window is a frame for panes
736
+ * rather than a page of prose (prose inside it keeps its own measure).
737
+ *
738
+ * THE SCROLLER RESERVES NO GUTTER; THE COLUMN PADS BY IT INSTEAD. Nothing
739
+ * scrolls here, so the strip a scrolling screen keeps for its scrollbar is
740
+ * only there to hold the content where the bar's controls expect it (the
741
+ * bar's end inset counts the gutter). A reserved strip did that, and also
742
+ * stood between the sheet's edge and every pane that scrolls on its own: a
743
+ * list's detail drew its scrollbar 31px inside the sheet, beside an empty
744
+ * strip, and nothing in the screen could paint over a reserved gutter. The
745
+ * same length as padding holds the content exactly where it stood, and a box
746
+ * standing in the column can reach past padding: the column publishes it as
747
+ * `--crewlet-app-shell-bleed-end`, and a `ListDetail` takes it back so its
748
+ * scrollbar is the sheet's last pixel. The scrollbar's width is read off the
749
+ * shell's gauge here (AppShell.tsx), so the bar keeps its place between a
750
+ * fill screen and a scrolling one.
751
+ */
736
752
  .crewlet-app-shell--fill .crewlet-app-shell__main {
737
753
  overflow: hidden;
754
+ scrollbar-gutter: auto;
738
755
  }
739
756
 
740
757
  .crewlet-app-shell--fill .crewlet-app-shell__content {
741
758
  --crewlet-app-shell-content-end: var(--spacing-5);
759
+ --crewlet-app-shell-bleed-end: calc(var(--crewlet-app-shell-inset) + var(--crewlet-app-shell-gutter, 0px));
742
760
 
743
761
  height: 100%;
762
+ max-width: none;
763
+ padding-right: var(--crewlet-app-shell-bleed-end);
744
764
  }
745
765
 
746
766
  /*
747
- * A FLUSH SCREEN draws its own frame to the sheet's edges: the column gives up
748
- * its pad, its measure and its gap, and the scroller reserves no gutter, since
749
- * nothing in it scrolls and a strip at its end would cut the screen's own
750
- * edge. The column is the containing block for a `LayerHost` the screen
751
- * keeps, so its layers fill the screen rather than the window.
767
+ * THE GAUGE: an empty scroller, never seen, that always draws its scrollbar,
768
+ * so the shell can read the scrollbar's width on a fill screen, where the
769
+ * screen's own scroller reserves none. It is a row of no height in the
770
+ * sheet's column, clipped, so it takes no room and moves nothing; the ruler
771
+ * inside it has a height of its own, because a scroller of no height draws
772
+ * no scrollbar in Firefox and measured 0 there.
752
773
  */
753
- .crewlet-app-shell--fill-flush .crewlet-app-shell__main {
754
- scrollbar-gutter: auto;
774
+ .crewlet-app-shell__gauge {
775
+ flex: none;
776
+ height: 0;
777
+ overflow: hidden;
778
+ visibility: hidden;
779
+ }
780
+
781
+ .crewlet-app-shell__gauge-ruler {
782
+ height: var(--size-target-min);
783
+ overflow-y: scroll;
755
784
  }
756
785
 
786
+ /*
787
+ * A FLUSH SCREEN draws its own frame to the sheet's edges: the column gives up
788
+ * its pad and its gap as well, so there is nothing for a box in it to reach
789
+ * past. The column is the containing block for a `LayerHost` the screen
790
+ * keeps, so its layers fill the screen rather than the window.
791
+ */
757
792
  .crewlet-app-shell--fill-flush .crewlet-app-shell__content {
793
+ --crewlet-app-shell-bleed-end: 0px;
794
+
758
795
  position: relative;
759
796
  gap: 0;
760
- max-width: none;
761
797
  padding: 0;
762
798
  }
763
799
 
@@ -922,22 +958,26 @@
922
958
  }
923
959
 
924
960
  /*
925
- * THE FOLD CONTROL stands in the rail's top left corner, in both shapes, so
926
- * it never moves under the pointer that pressed it: a minus while the rail is
927
- * full and a plus while it is compact. The corner is the square the head
928
- * leaves empty up and to the left of the brand's mark, and the control is the
929
- * target floor (`--size-target-min`), so it ends short of the mark on the
930
- * compact column's centre at every density.
961
+ * THE FOLD CONTROL stands on the head's row, before the brand's mark, in both
962
+ * shapes, so it never moves under the pointer that pressed it: chevrons
963
+ * pointing left to fold the rail and right to unfold it.
964
+ *
965
+ * THE CONTROL AND THE MARK ARE ONE PAIR: the control at the target floor
966
+ * (`--size-target-min`, at every density), a step (`--spacing-1`), then the
967
+ * mark, which is a target's size too, the pair centred in the compact column
968
+ * so the 76px column holds both (12 + 24 + 4 + 24 + 12). The control is
969
+ * centred on the bar's line as the mark is: the inset, then half of what the
970
+ * bar leaves round it. The mark's inset below is the same arithmetic from the
971
+ * other side.
931
972
  *
932
973
  * Quiet until the rail is pointed at: the tertiary ink, which holds 3:1 on
933
974
  * the frame, then the secondary, and the ghost's own primary under the
934
- * pointer. Its ring is drawn inside its own box, because the corner it
935
- * stands in is the window's, and a ring outside it would be cut there.
975
+ * pointer. Its ring is drawn inside its own box, clear of the mark beside it.
936
976
  */
937
977
  .crewlet-app-shell__fold {
938
978
  position: absolute;
939
- top: 0;
940
- left: 0;
979
+ top: calc(var(--size-shell-inset) + (var(--crewlet-app-shell-topbar) - var(--size-target-min)) / 2);
980
+ left: calc((var(--size-shell-rail-compact) - 2 * var(--size-target-min) - var(--spacing-1)) / 2);
941
981
  z-index: 1;
942
982
  display: inline-flex;
943
983
  }
@@ -957,13 +997,20 @@
957
997
  }
958
998
 
959
999
  /*
960
- * THE MARK STANDS WHERE THE COMPACT RAIL'S DOES, in both shapes: centred over
961
- * the compact column, in the head. Full, the name follows it; compact, the
962
- * name is not drawn (the link keeps it as its name and title).
1000
+ * THE MARK STANDS WHERE THE COMPACT RAIL'S DOES, in both shapes. With no fold
1001
+ * control it is centred over the compact column; beside the fold control it
1002
+ * is the second of the pair (above), a step after the control, which is half
1003
+ * the column and half the step in. Full, the name follows it; compact, the
1004
+ * name is not drawn (the link keeps it as its name and title), and the
1005
+ * lockup's end inset is given up, so the mark is all the column holds.
963
1006
  */
964
- .crewlet-app-shell--foldable .crewlet-app-shell__rail-head > .crewlet-brand,
965
1007
  .crewlet-app-shell[data-rail='compact'] .crewlet-app-shell__rail-head > .crewlet-brand {
966
1008
  padding-left: calc((var(--size-shell-rail-compact) - var(--crewlet-brand-mark)) / 2);
1009
+ padding-right: 0;
1010
+ }
1011
+
1012
+ .crewlet-app-shell--foldable[data-rail] .crewlet-app-shell__rail-head > .crewlet-brand {
1013
+ padding-left: calc((var(--size-shell-rail-compact) + var(--spacing-1)) / 2);
967
1014
  }
968
1015
 
969
1016
  .crewlet-app-shell[data-rail='compact'] .crewlet-brand__name,
@@ -1087,6 +1134,9 @@
1087
1134
  @media (width < 1024px) {
1088
1135
  .crewlet-app-shell {
1089
1136
  --crewlet-app-shell-beside: 0px;
1137
+ /* 16px: the content's 12px stood every page's first line 4px left of
1138
+ the bar's title and the controls over it. */
1139
+ --crewlet-app-shell-inset: var(--spacing-4);
1090
1140
  grid-template-columns: minmax(0, 1fr);
1091
1141
  }
1092
1142
 
@@ -1169,18 +1219,8 @@
1169
1219
  display: inline-flex;
1170
1220
  }
1171
1221
 
1172
- /* THE TOP BAR'S GUTTER, 16px: the content's 12px stood every page's first
1173
- line 4px left of the title and the controls over it. The bar and the
1174
- content take it together. */
1175
- .crewlet-app-shell__topbar {
1176
- padding: 0 calc(var(--spacing-4) + var(--crewlet-app-shell-gutter, 0px)) 0 var(--spacing-4);
1177
- }
1178
-
1179
1222
  .crewlet-app-shell__content {
1180
1223
  --crewlet-app-shell-content-end: var(--spacing-9);
1181
-
1182
- padding: var(--spacing-4) var(--spacing-4);
1183
- padding-bottom: var(--crewlet-app-shell-content-end);
1184
1224
  }
1185
1225
  }
1186
1226
 
@@ -1,4 +1,4 @@
1
- export { ARTIFACT_BAR_LABELS, ArtifactBar, ArtifactVersionChip } from '../chunk-BXGBGYKH.js';
1
+ export { ARTIFACT_BAR_LABELS, ArtifactBar, ArtifactVersionChip } from '../chunk-HKUZ2GYX.js';
2
2
  import '../chunk-36WK24AI.js';
3
3
  import '../chunk-AZYE7NR4.js';
4
4
  import '../chunk-MVKUE4FI.js';
@@ -1,4 +1,4 @@
1
- export { ArtifactCard, ArtifactCardSkeleton, ArtifactPreviewGlyph } from '../chunk-QM3432PH.js';
1
+ export { ArtifactCard, ArtifactCardSkeleton, ArtifactPreviewGlyph } from '../chunk-C4JTX25K.js';
2
2
  import '../chunk-I4IUX3JF.js';
3
3
  import '../chunk-HF5L56YQ.js';
4
4
  import '../chunk-EJNJMHQG.js';
@@ -7,7 +7,7 @@ import '../chunk-U2IQNDDR.js';
7
7
  import '../chunk-AV2DXAEL.js';
8
8
  import '../chunk-IRONPJB4.js';
9
9
  import '../chunk-XZY6S3UC.js';
10
- import '../chunk-ZB3E2Z4Y.js';
10
+ import '../chunk-J5T5TDM2.js';
11
11
  import '../chunk-YQ7Q52XU.js';
12
12
  import '../chunk-DOY3KC6I.js';
13
13
  export { ARTIFACT_KINDS, ArtifactKindGlyph } from '../chunk-RSKW25Y5.js';
@@ -1,3 +1,3 @@
1
- export { ArtifactKindGround, ArtifactKindIllustration, ArtifactKindTile } from '../chunk-ZB3E2Z4Y.js';
1
+ export { ArtifactKindGround, ArtifactKindIllustration, ArtifactKindTile } from '../chunk-J5T5TDM2.js';
2
2
  import '../chunk-UT6CW3C7.js';
3
3
  import '../chunk-ODEQTPFM.js';
@@ -9,10 +9,10 @@
9
9
  * its own, imported by each surface that tints, because the glyph's module
10
10
  * carries no stylesheet (a frame that draws one glyph takes nothing else).
11
11
  */
12
- .crewlet-kind--doc { --crewlet-kind-hue: var(--color-artifact-kind-doc); --crewlet-kind-fill: var(--color-artifact-kind-doc-fill); --crewlet-kind-line: var(--color-artifact-kind-doc-line); --crewlet-kind-ink: var(--color-artifact-kind-doc-ink); --crewlet-kind-ground: var(--color-artifact-kind-doc-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-doc-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-doc-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-doc-glow); }
13
- .crewlet-kind--slides { --crewlet-kind-hue: var(--color-artifact-kind-slides); --crewlet-kind-fill: var(--color-artifact-kind-slides-fill); --crewlet-kind-line: var(--color-artifact-kind-slides-line); --crewlet-kind-ink: var(--color-artifact-kind-slides-ink); --crewlet-kind-ground: var(--color-artifact-kind-slides-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-slides-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-slides-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-slides-glow); }
14
- .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); --crewlet-kind-ground: var(--color-artifact-kind-design-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-design-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-design-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-design-glow); }
15
- .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); --crewlet-kind-ground: var(--color-artifact-kind-dashboard-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-dashboard-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-dashboard-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-dashboard-glow); }
16
- .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); --crewlet-kind-ground: var(--color-artifact-kind-html-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-html-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-html-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-html-glow); }
17
- .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); --crewlet-kind-ground: var(--color-artifact-kind-brand-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-brand-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-brand-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-brand-glow); }
18
- .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); --crewlet-kind-ground: var(--color-artifact-kind-sheet-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-sheet-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-sheet-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-sheet-glow); }
12
+ .crewlet-kind--doc { --crewlet-kind-hue: var(--color-artifact-kind-doc); --crewlet-kind-fill: var(--color-artifact-kind-doc-fill); --crewlet-kind-line: var(--color-artifact-kind-doc-line); --crewlet-kind-ink: var(--color-artifact-kind-doc-ink); --crewlet-kind-ground: var(--color-artifact-kind-doc-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-doc-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-doc-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-doc-glow); --crewlet-kind-edge: var(--color-artifact-kind-doc-edge); --crewlet-kind-edge-strong: var(--color-artifact-kind-doc-edge-strong); }
13
+ .crewlet-kind--slides { --crewlet-kind-hue: var(--color-artifact-kind-slides); --crewlet-kind-fill: var(--color-artifact-kind-slides-fill); --crewlet-kind-line: var(--color-artifact-kind-slides-line); --crewlet-kind-ink: var(--color-artifact-kind-slides-ink); --crewlet-kind-ground: var(--color-artifact-kind-slides-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-slides-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-slides-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-slides-glow); --crewlet-kind-edge: var(--color-artifact-kind-slides-edge); --crewlet-kind-edge-strong: var(--color-artifact-kind-slides-edge-strong); }
14
+ .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); --crewlet-kind-ground: var(--color-artifact-kind-design-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-design-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-design-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-design-glow); --crewlet-kind-edge: var(--color-artifact-kind-design-edge); --crewlet-kind-edge-strong: var(--color-artifact-kind-design-edge-strong); }
15
+ .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); --crewlet-kind-ground: var(--color-artifact-kind-dashboard-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-dashboard-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-dashboard-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-dashboard-glow); --crewlet-kind-edge: var(--color-artifact-kind-dashboard-edge); --crewlet-kind-edge-strong: var(--color-artifact-kind-dashboard-edge-strong); }
16
+ .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); --crewlet-kind-ground: var(--color-artifact-kind-html-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-html-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-html-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-html-glow); --crewlet-kind-edge: var(--color-artifact-kind-html-edge); --crewlet-kind-edge-strong: var(--color-artifact-kind-html-edge-strong); }
17
+ .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); --crewlet-kind-ground: var(--color-artifact-kind-brand-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-brand-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-brand-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-brand-glow); --crewlet-kind-edge: var(--color-artifact-kind-brand-edge); --crewlet-kind-edge-strong: var(--color-artifact-kind-brand-edge-strong); }
18
+ .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); --crewlet-kind-ground: var(--color-artifact-kind-sheet-ground); --crewlet-kind-ground-strong: var(--color-artifact-kind-sheet-ground-strong); --crewlet-kind-ground-end: var(--color-artifact-kind-sheet-ground-end); --crewlet-kind-glow: var(--color-artifact-kind-sheet-glow); --crewlet-kind-edge: var(--color-artifact-kind-sheet-edge); --crewlet-kind-edge-strong: var(--color-artifact-kind-sheet-edge-strong); }
@@ -1,4 +1,4 @@
1
- export { ArtifactMakeRow } from '../chunk-MVMVMHYI.js';
1
+ export { ArtifactMakeRow } from '../chunk-HDEKHP65.js';
2
2
  import '../chunk-RSKW25Y5.js';
3
3
  import '../chunk-2YTOOH3A.js';
4
4
  import '../chunk-UT6CW3C7.js';
@@ -1,4 +1,4 @@
1
- export { ArtifactNameCell } from '../chunk-C46DDVTK.js';
1
+ export { ArtifactNameCell } from '../chunk-LTD7KLOU.js';
2
2
  import '../chunk-RSKW25Y5.js';
3
3
  import '../chunk-UT6CW3C7.js';
4
4
  import '../chunk-ODEQTPFM.js';
@@ -1,5 +1,6 @@
1
- export { BRIEF_CARD_LABELS, BRIEF_CARD_MAX_FOLLOW_UPS, BRIEF_CARD_MAX_NEEDS, BRIEF_CARD_MAX_POINTS, BriefCard } from '../chunk-CF4M6N6A.js';
1
+ export { BRIEF_CARD_LABELS, BRIEF_CARD_MAX_FOLLOW_UPS, BRIEF_CARD_MAX_NEEDS, BRIEF_CARD_MAX_POINTS, BriefCard } from '../chunk-XYSSFI5C.js';
2
2
  import '../chunk-Y7PVLEZJ.js';
3
+ import '../chunk-6C7GQOBV.js';
3
4
  import '../chunk-FLW5U7YS.js';
4
5
  import '../chunk-LBGKLYBY.js';
5
6
  import '../chunk-U2IQNDDR.js';
@@ -1,5 +1,6 @@
1
1
  import { type HTMLAttributes, type ReactNode } from 'react';
2
2
  import { type HeadingLevel } from '../utils/headingLevel.js';
3
+ import type { Tone } from '../utils/tone.js';
3
4
  export type CatalogTileElement = 'article' | 'li' | 'div';
4
5
  /**
5
6
  * How much room a tile takes. `comfortable` (the default) is the catalogue's
@@ -10,6 +11,23 @@ export type CatalogTileElement = 'article' | 'li' | 'div';
10
11
  * already in use rather than offers a choice.
11
12
  */
12
13
  export type CatalogTileDensity = 'comfortable' | 'compact';
14
+ /**
15
+ * An entry's state, as data: the tile draws it, the same way on every tile.
16
+ *
17
+ * ONE PRESENTATION, NOT A SLOT. Taken as any node, a service's In use came as
18
+ * a soft pill and an app's Connected as a dot and a word, so one row of tiles
19
+ * drew its states two ways and at two heights. A tone and a word cannot be
20
+ * drawn two ways.
21
+ */
22
+ export interface CatalogTileStatus {
23
+ /**
24
+ * What the state is: `success` for in use or connected, `warning` for
25
+ * something owed, `danger` for broken, `neutral` for coming soon.
26
+ */
27
+ tone: Tone;
28
+ /** The state in a word or two: In use, Connected, Needs attention. */
29
+ label: string;
30
+ }
13
31
  export interface CatalogTileProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {
14
32
  /** The element the tile is: an `li` in a `TileGrid as="ul"`. */
15
33
  as?: CatalogTileElement | undefined;
@@ -24,12 +42,12 @@ export interface CatalogTileProps extends Omit<HTMLAttributes<HTMLElement>, 'tit
24
42
  /** Overrides the level the name is rendered at. */
25
43
  headingLevel?: HeadingLevel | undefined;
26
44
  /**
27
- * The entry's state, as a `Tag`, ONLY when the state is worth reading: On,
28
- * Connected, Needs attention, Coming soon. An entry in its resting state
29
- * (available, not set up) carries none, and its name stands centred beside
30
- * its mark; a pill under every name is a column a reader learns to skip.
45
+ * The entry's state, drawn as its tone's dot and its word, ONLY when the
46
+ * state is worth reading: In use, Connected, Needs attention, Coming soon.
47
+ * An entry in its resting state (available, not set up) carries none; a
48
+ * state under every name is a column a reader learns to skip.
31
49
  */
32
- status?: ReactNode;
50
+ status?: CatalogTileStatus | undefined;
33
51
  /** One sentence: what the entry is for, or what is owed when something is. */
34
52
  description?: ReactNode;
35
53
  /** A quiet fact at the foot (`2 agents · 14 deliveries`). */
@@ -1,3 +1,3 @@
1
1
  import './CatalogTile.css';
2
2
  export { CatalogTile } from './CatalogTile.js';
3
- export type { CatalogTileDensity, CatalogTileElement, CatalogTileProps } from './CatalogTile.js';
3
+ export type { CatalogTileDensity, CatalogTileElement, CatalogTileProps, CatalogTileStatus } from './CatalogTile.js';
@@ -1,3 +1,4 @@
1
- export { CatalogTile } from '../chunk-QE4OIE3Q.js';
1
+ export { CatalogTile } from '../chunk-DJIWCW5Z.js';
2
+ import '../chunk-CYQBDZ6M.js';
2
3
  import '../chunk-PQADV6P6.js';
3
4
  import '../chunk-ODEQTPFM.js';