@crewlethq/ui 0.50.0 → 0.51.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 (74) hide show
  1. package/README.md +20 -0
  2. package/dist/ArtifactCard/index.js +1 -1
  3. package/dist/{ArtifactCard-SOB63NV5.css → ArtifactCard-F7IVRL3A.css} +3 -0
  4. package/dist/AvatarPicker/index.js +2 -2
  5. package/dist/BrandSample/index.js +3 -3
  6. package/dist/BrandScope/index.js +2 -2
  7. package/dist/Callout/index.js +1 -1
  8. package/dist/{Callout-ZAVG3P66.css → Callout-G3N3IE6M.css} +9 -0
  9. package/dist/ColorChip/ColorChip.d.ts +26 -0
  10. package/dist/ColorChip/index.d.ts +3 -0
  11. package/dist/ColorChip/index.js +3 -0
  12. package/dist/ColorChip-A5XHTH3J.css +46 -0
  13. package/dist/ColorField/ColorField.d.ts +16 -8
  14. package/dist/ColorField/index.js +2 -2
  15. package/dist/ColorSwatch/index.js +2 -2
  16. package/dist/ContrastBadge/ContrastBadge.d.ts +13 -0
  17. package/dist/ContrastBadge/index.d.ts +2 -2
  18. package/dist/ContrastBadge/index.js +2 -2
  19. package/dist/ContrastHelp/ContrastHelp.d.ts +40 -0
  20. package/dist/ContrastHelp/index.d.ts +3 -0
  21. package/dist/ContrastHelp/index.js +12 -0
  22. package/dist/ContrastHelp-MZCAW5WQ.css +43 -0
  23. package/dist/DataView/index.js +2 -2
  24. package/dist/EditingStatus/EditingStatus.d.ts +3 -5
  25. package/dist/EditingStatus/index.js +1 -1
  26. package/dist/{EditingStatus-NNA2CKIL.css → EditingStatus-YU7EGM6Y.css} +22 -7
  27. package/dist/FolderTile/index.js +1 -1
  28. package/dist/{FolderTile-FDT5Y63Z.css → FolderTile-MIUEB7SO.css} +12 -5
  29. package/dist/FollowBanner/index.js +2 -2
  30. package/dist/InlineEditor/index.js +2 -2
  31. package/dist/LinkInterstitial/index.js +2 -2
  32. package/dist/ListInput/ListInput.d.ts +3 -1
  33. package/dist/ListInput/index.js +1 -1
  34. package/dist/{ListInput-WUP2YITQ.css → ListInput-P2ECUQJ2.css} +1 -1
  35. package/dist/LogoSlot/index.js +3 -3
  36. package/dist/RichEditor/index.js +2 -2
  37. package/dist/SandboxedFrame/index.js +2 -2
  38. package/dist/SetupWizard/SetupWizard.d.ts +13 -3
  39. package/dist/SetupWizard/index.js +1 -1
  40. package/dist/{SetupWizard-Y5BTXZX5.css → SetupWizard-GZK5UDKC.css} +27 -1
  41. package/dist/ShareDialog/index.js +2 -2
  42. package/dist/{chunk-BEAXJARF.js → chunk-2UFUP2ZH.js} +2 -2
  43. package/dist/{chunk-4A4QG6UC.js → chunk-34C7NYIQ.js} +1 -1
  44. package/dist/chunk-6GTTRJWJ.js +24 -0
  45. package/dist/{chunk-QGRA2RHC.js → chunk-6RMZH7P7.js} +1 -1
  46. package/dist/{chunk-W6FOEBIL.js → chunk-73WHPLWQ.js} +24 -15
  47. package/dist/chunk-7W3LYIOC.js +27 -0
  48. package/dist/{chunk-OEEYL2CM.js → chunk-AVMQMY66.js} +2 -2
  49. package/dist/{chunk-SZZRIHGT.js → chunk-BPCY7ZID.js} +1 -1
  50. package/dist/chunk-DTSZUH6H.js +124 -0
  51. package/dist/chunk-EJWPYEG4.js +38 -0
  52. package/dist/{chunk-M4QM477B.js → chunk-FXHWOXGD.js} +1 -1
  53. package/dist/{chunk-JWNYI7UD.js → chunk-KHP7TJF7.js} +1 -1
  54. package/dist/chunk-KIRQZG3G.js +53 -0
  55. package/dist/{chunk-JFDIMO3A.js → chunk-PGYIDNGG.js} +1 -1
  56. package/dist/{chunk-WLSEAIVC.js → chunk-RHPBTE3F.js} +1 -1
  57. package/dist/{chunk-Q44X36QC.js → chunk-S63QOMXC.js} +1 -1
  58. package/dist/{chunk-GP4YWZFO.js → chunk-U3LNU4B2.js} +1 -1
  59. package/dist/{chunk-PGR2PKH6.js → chunk-UUTEWGO6.js} +10 -10
  60. package/dist/{chunk-356JNSER.js → chunk-WQQ5T5SA.js} +1 -1
  61. package/dist/{chunk-NSSOWQCJ.js → chunk-WW7TU6HE.js} +15 -12
  62. package/dist/{chunk-P3OIM6OC.js → chunk-X7WEE3EK.js} +1 -1
  63. package/dist/generated/index.d.ts +2 -0
  64. package/dist/generated/index.js +75 -73
  65. package/dist/index.js +75 -73
  66. package/dist/styles.css +175 -20
  67. package/dist/utils/hexColour.d.ts +13 -0
  68. package/package.json +3 -3
  69. package/dist/chunk-KKHCUHWS.js +0 -107
  70. package/dist/chunk-MMOXWAUG.js +0 -42
  71. package/dist/chunk-UZMNR366.js +0 -9
  72. package/dist/{chunk-3QSKDZR5.js → chunk-EW2N4FOD.js} +1 -1
  73. package/dist/{chunk-HNQ2EIMR.js → chunk-P432I5DQ.js} +0 -0
  74. package/dist/{chunk-NAWUXCBC.js → chunk-WX6IJJ4U.js} +1 -1
package/README.md CHANGED
@@ -204,6 +204,26 @@ places:
204
204
  - A surface that pans or zooms dispatches `LAYER_REPOSITION_EVENT` on its host
205
205
  when the content beneath it moves, and every panel anchored inside follows.
206
206
 
207
+ ## Changes in 0.51.0
208
+
209
+ Polish of the setup wizard pieces, and the parts the brand setup asked for.
210
+
211
+ **`ColorField` draws its `#` and reads more than six digits.** The `#` is drawn at the start of the field, so a person types the six hex digits alone, and a pasted `#rrggbb` loses its own `#` to it. When the reader leaves the field (Enter or Tab), `rrggbb`, the three digit shorthand and `rgb(r, g, b)` or `rgb(r g b)` are normalised to lowercase `#rrggbb`; anything else is refused with one sentence. Six digits are still reported as they are typed, and `onChange` still receives only a colour, or `''` for an emptied optional field. What to change: a test that reads the text field's value reads the six digits without the `#`. The default `labels.invalid` and `labels.placeholder` changed, and `labels.prefix` is new.
212
+
213
+ **`ContrastHelp` is new**: a small info button beside a contrast heading that opens a short panel saying what AA, AAA and Low or Fails mean, each drawn as `ContrastBadge` draws it. It is a `Popover` the button toggles, so it opens by touch and from the keyboard, and closes on Escape with focus handed back. Place it beside the heading, not inside it. `ContrastLevelTag` is the one drawing of a level, shared by the badge and the panel.
214
+
215
+ **`ColorChip` is new**: a colour as a small decorative chip (12px `xs` or 16px `sm`, round or square) with an edge of its own and the hatch of no colour, for the mark on a button that applies a suggested colour.
216
+
217
+ **`SetupWizard` takes `footerStart` and `wide`.** `footerStart` stands at the start of the footer row (the way out), with `footer`, the step's actions, held at its end. `wide` lets a step that lays out columns of its own take the whole width beside the rail. A wizard with no `aside` no longer holds an empty 320px column from 70rem.
218
+
219
+ **`Callout`'s actions stand one step apart.** The action slot is a wrapping row with the kit's step between, so two actions never draw touching.
220
+
221
+ **`EditingStatus` reads cleanly.** Its text is "Draft Saved 24s ago", drawn "Draft · Saved 24s ago": no hidden comma and no second "Saved". The live region holds only the label and the state, and the time follows it in a `time` element outside the region, so it is shown and never announced. What to change: `labels.saved` is now the word alone (`'Saved'`), and `labels.savedSpoken` is gone. A test that reads `getByRole('status')` reads the label and the state only.
222
+
223
+ **`ListInput` ends its new-item row with an Add button.** The add control no longer floats beside the legend as a `+` square: it is a text button at the end of the box's own row, with or without a shown legend, beside Enter. It shows `addText` ("Add") and is named by `addLabel` ("Add policy").
224
+
225
+ **Folder tiles are set on the artifact card's type scale.** A `FolderTile`'s name and facts take a gallery card's title and facts steps at every width, on one 1.35 line height with the card's step between; a row, and a tile on a phone, no longer drop to smaller steps beside cards that keep theirs. `ArtifactCard`'s gallery facts take the title's line height. `ArtifactNameCell` is unchanged: a folder's row in the list is set as every artifact's row there.
226
+
207
227
  ## Changes in 0.50.0
208
228
 
209
229
  The pieces of a setup a person walks step by step, first used by the brand setup.
@@ -1,4 +1,4 @@
1
- export { ArtifactCard, ArtifactCardSkeleton, ArtifactPreviewGlyph } from '../chunk-Q44X36QC.js';
1
+ export { ArtifactCard, ArtifactCardSkeleton, ArtifactPreviewGlyph } from '../chunk-S63QOMXC.js';
2
2
  import '../chunk-TEUQWOWZ.js';
3
3
  import '../chunk-CI3VPIJN.js';
4
4
  import '../chunk-3CZ7XAVY.js';
@@ -215,6 +215,9 @@
215
215
 
216
216
  .crewlet-artifact-card--card .crewlet-artifact-card__facts {
217
217
  font-size: var(--font-size-sm);
218
+ /* The title's line height, so a card's words and a folder tile's beside it
219
+ keep one rhythm. */
220
+ line-height: 1.35;
218
221
  }
219
222
 
220
223
  .crewlet-artifact-card__meta {
@@ -1,8 +1,8 @@
1
- export { AvatarPicker } from '../chunk-3QSKDZR5.js';
1
+ export { AvatarPicker } from '../chunk-EW2N4FOD.js';
2
2
  import '../chunk-34RMTXDZ.js';
3
3
  import '../chunk-KHJIEPZV.js';
4
- import '../chunk-AYKXMIOR.js';
5
4
  import '../chunk-SNQRGH4A.js';
5
+ import '../chunk-AYKXMIOR.js';
6
6
  import '../chunk-6FVGSWLS.js';
7
7
  import '../chunk-ILFEWRLG.js';
8
8
  import '../chunk-WIATRXEJ.js';
@@ -1,5 +1,5 @@
1
- export { BrandSample } from '../chunk-OEEYL2CM.js';
2
- import '../chunk-P3OIM6OC.js';
1
+ export { BrandSample } from '../chunk-AVMQMY66.js';
2
+ import '../chunk-X7WEE3EK.js';
3
3
  import '../chunk-5SGHW42B.js';
4
- import '../chunk-UZMNR366.js';
4
+ import '../chunk-7W3LYIOC.js';
5
5
  import '../chunk-ODEQTPFM.js';
@@ -1,4 +1,4 @@
1
- export { BrandScope, brandScopeInputs } from '../chunk-P3OIM6OC.js';
1
+ export { BrandScope, brandScopeInputs } from '../chunk-X7WEE3EK.js';
2
2
  import '../chunk-5SGHW42B.js';
3
- import '../chunk-UZMNR366.js';
3
+ import '../chunk-7W3LYIOC.js';
4
4
  import '../chunk-ODEQTPFM.js';
@@ -1,2 +1,2 @@
1
- export { Callout } from '../chunk-SZZRIHGT.js';
1
+ export { Callout } from '../chunk-BPCY7ZID.js';
2
2
  import '../chunk-ODEQTPFM.js';
@@ -77,7 +77,16 @@
77
77
  font-weight: var(--font-weight-semibold);
78
78
  }
79
79
 
80
+ /*
81
+ * THE ACTIONS ARE A ROW one step apart, wrapping when there is no room, so a
82
+ * callout with two (Continue setting up, Review and adopt) never draws them
83
+ * touching, whatever the host wraps them in.
84
+ */
80
85
  .crewlet-callout__action {
86
+ display: flex;
87
+ flex-wrap: wrap;
88
+ align-items: center;
89
+ gap: var(--spacing-2);
81
90
  grid-column: 3;
82
91
  grid-row: 1;
83
92
  align-self: center;
@@ -0,0 +1,26 @@
1
+ /** `xs` is 12px, a mark inside a small button; `sm` is 16px, beside a word in a row. */
2
+ export type ColorChipSize = 'xs' | 'sm';
3
+ export type ColorChipShape = 'round' | 'square';
4
+ export interface ColorChipProps {
5
+ /**
6
+ * The colour, as `#rrggbb`. Anything else draws the hatch of no colour and
7
+ * is never put into a style.
8
+ */
9
+ value: string | null | undefined;
10
+ size?: ColorChipSize | undefined;
11
+ shape?: ColorChipShape | undefined;
12
+ className?: string | undefined;
13
+ }
14
+ /**
15
+ * A colour as a small chip and nothing else: the mark on a button that
16
+ * applies it ("Use #007f7f"), or beside a value in a row.
17
+ *
18
+ * DECORATION, hidden from a screen reader: the words beside it say what the
19
+ * colour is. Where a colour has to be named, read and copied, that is
20
+ * `ColorSwatch`.
21
+ *
22
+ * THE VALUE PASSES THE SAME GATE AS EVERY BRAND PART (`#rrggbb`, lowercased)
23
+ * before it reaches a style, and the chip draws an edge of its own, so a
24
+ * colour that matches the ground it sits on is still a chip.
25
+ */
26
+ export declare function ColorChip({ value, size, shape, className }: ColorChipProps): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import './ColorChip.css';
2
+ export { ColorChip } from './ColorChip.js';
3
+ export type { ColorChipProps, ColorChipShape, ColorChipSize } from './ColorChip.js';
@@ -0,0 +1,3 @@
1
+ export { ColorChip } from '../chunk-6GTTRJWJ.js';
2
+ import '../chunk-7W3LYIOC.js';
3
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,46 @@
1
+ /*
2
+ * A colour as a small chip (ColorChip.tsx). Its fill is the one value that is
3
+ * not a token, and it arrives through `--crewlet-color-chip-value` only after
4
+ * it has passed `#rrggbb`.
5
+ */
6
+ .crewlet-color-chip {
7
+ display: inline-block;
8
+ flex: none;
9
+ box-sizing: border-box;
10
+ width: var(--spacing-3);
11
+ height: var(--spacing-3);
12
+ background: var(--crewlet-color-chip-value, var(--color-surface-inset));
13
+ /* An edge of its own, so a colour that matches its ground is still a chip. */
14
+ box-shadow: inset 0 0 0 1px var(--color-border-hover);
15
+ vertical-align: middle;
16
+ }
17
+
18
+ .crewlet-color-chip--sm {
19
+ width: var(--spacing-4);
20
+ height: var(--spacing-4);
21
+ }
22
+
23
+ .crewlet-color-chip--round {
24
+ border-radius: var(--radius-circle);
25
+ }
26
+
27
+ .crewlet-color-chip--square {
28
+ border-radius: var(--radius-xs);
29
+ }
30
+
31
+ /* The hatch of no colour, as every swatch in the package draws it. */
32
+ .crewlet-color-chip.is-empty {
33
+ background: repeating-linear-gradient(-45deg, var(--color-border-hatch) 0 1px, transparent 1px var(--spacing-1));
34
+ }
35
+
36
+ /*
37
+ * FORCED COLORS drops backgrounds, which is all a chip is, so the mode keeps
38
+ * this one: the colour is the information, and the edge is drawn in the
39
+ * system's text colour so the chip still has a boundary.
40
+ */
41
+ @media (forced-colors: active) {
42
+ .crewlet-color-chip {
43
+ forced-color-adjust: none;
44
+ box-shadow: inset 0 0 0 1px CanvasText;
45
+ }
46
+ }
@@ -7,10 +7,12 @@ export interface ColorFieldLabels {
7
7
  /** Names the colour picker beside the field: "Pick the Primary colour". */
8
8
  picker: (label: string) => string;
9
9
  /**
10
- * What the empty field shows: the shape a value takes, never a colour, which
11
- * an empty field would seem to hold.
10
+ * What the empty field shows after its `#`: the shape a value takes, never
11
+ * a colour, which an empty field would seem to hold.
12
12
  */
13
13
  placeholder: string;
14
+ /** Said for the `#` drawn at the start of the field, which is not part of what is typed. */
15
+ prefix: string;
14
16
  }
15
17
  export interface ColorFieldProps {
16
18
  /** The colour's role, which is the field's name: "Primary". */
@@ -48,12 +50,18 @@ export interface ColorFieldProps {
48
50
  * A colour a person chooses: a hex field, a swatch that opens the platform's
49
51
  * colour picker, and the reason a value was refused.
50
52
  *
51
- * THE VALUE IS `#` AND SIX HEX DIGITS, and nothing else is ever reported: the
52
- * field holds what is being typed, and a value reaches `onChange` only once it
53
- * reads as a colour, lowercased, the one spelling the engine stores. A value
54
- * that does not read is refused when the reader leaves the field (Enter or
55
- * Tab), never while they are still typing it, with a sentence saying what
56
- * right looks like.
53
+ * THE `#` IS THE FIELD'S, drawn at its start, so a person types the six hex
54
+ * digits alone; a pasted `#rrggbb` loses its own `#` to it. When the reader
55
+ * leaves the field (Enter or Tab) what they wrote is read as a colour:
56
+ * `rrggbb`, the three digit shorthand, or `rgb(r, g, b)` (commas or spaces),
57
+ * each normalised to the one spelling the engine stores, lowercase
58
+ * `#rrggbb`. Anything else is refused then, never while they are still
59
+ * typing, with a sentence saying what right looks like.
60
+ *
61
+ * ONLY A COLOUR IS EVER REPORTED. Six hex digits reach `onChange` as they are
62
+ * typed, so a preview follows the field; the shorthand and `rgb()` reach it
63
+ * when the reader leaves, since `abc` on its way to `abcdef` is not the colour
64
+ * they mean. An optional field emptied reports `''`.
57
65
  *
58
66
  * THE SWATCH IS THE PICKER. It is the platform's own colour input, drawn as
59
67
  * the chip of the colour the field holds and named for it, so it is a real,
@@ -1,5 +1,5 @@
1
- export { ColorField } from '../chunk-W6FOEBIL.js';
2
- import '../chunk-UZMNR366.js';
1
+ export { ColorField } from '../chunk-73WHPLWQ.js';
2
+ import '../chunk-7W3LYIOC.js';
3
3
  import '../chunk-EXRRTKWT.js';
4
4
  import '../chunk-XCUUI7E7.js';
5
5
  import '../chunk-PQADV6P6.js';
@@ -1,8 +1,8 @@
1
- export { ColorSwatch } from '../chunk-WLSEAIVC.js';
1
+ export { ColorSwatch } from '../chunk-RHPBTE3F.js';
2
2
  import '../chunk-7SHAFLEX.js';
3
3
  import '../chunk-STJ7QBC3.js';
4
4
  import '../chunk-DTIW4CHZ.js';
5
- import '../chunk-UZMNR366.js';
5
+ import '../chunk-7W3LYIOC.js';
6
6
  import '../chunk-OG6CL3EB.js';
7
7
  import '../chunk-LACA4JGC.js';
8
8
  import '../chunk-BZFWDIV6.js';
@@ -44,6 +44,19 @@ export interface ContrastBadgeLabels {
44
44
  export type ContrastBadgeLabelsInput = Partial<Omit<ContrastBadgeLabels, 'levels'>> & {
45
45
  levels?: Partial<Record<ContrastBadgeLevel, string>> | undefined;
46
46
  };
47
+ export interface ContrastLevelTagProps {
48
+ /** The level drawn. */
49
+ level: ContrastBadgeLevel;
50
+ /** Its word: "AA", "Low". */
51
+ children: string;
52
+ }
53
+ /**
54
+ * A contrast level as the badge draws it: its word in its tone with its
55
+ * glyph (a check for AA and AAA, the warning triangle for large text only and
56
+ * Low, the alert circle for Fails). The one drawing of a level, so the badge
57
+ * and the explanation of the levels (`ContrastHelp`) never disagree.
58
+ */
59
+ export declare function ContrastLevelTag({ level, children }: ContrastLevelTagProps): import("react").JSX.Element;
47
60
  export interface ContrastBadgeProps {
48
61
  /** The colour read: text, a logo, an accent. `#rrggbb`. */
49
62
  foreground: string;
@@ -1,3 +1,3 @@
1
1
  import './ContrastBadge.css';
2
- export { ContrastBadge, contrastLevel, contrastRatio, formatContrastRatio } from './ContrastBadge.js';
3
- export type { ContrastBadgeLabels, ContrastBadgeLabelsInput, ContrastBadgeLevel, ContrastBadgeProps, ContrastLevel, ContrastScale, } from './ContrastBadge.js';
2
+ export { ContrastBadge, ContrastLevelTag, contrastLevel, contrastRatio, formatContrastRatio } from './ContrastBadge.js';
3
+ export type { ContrastBadgeLabels, ContrastBadgeLabelsInput, ContrastBadgeLevel, ContrastBadgeProps, ContrastLevelTagProps, ContrastLevel, ContrastScale, } from './ContrastBadge.js';
@@ -1,6 +1,6 @@
1
- export { ContrastBadge, contrastLevel, contrastRatio, formatContrastRatio } from '../chunk-NSSOWQCJ.js';
1
+ export { ContrastBadge, ContrastLevelTag, contrastLevel, contrastRatio, formatContrastRatio } from '../chunk-WW7TU6HE.js';
2
2
  import '../chunk-KYIAFNU7.js';
3
- import '../chunk-UZMNR366.js';
3
+ import '../chunk-7W3LYIOC.js';
4
4
  import '../chunk-WIATRXEJ.js';
5
5
  import '../chunk-BZFWDIV6.js';
6
6
  import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,40 @@
1
+ import { type PopoverAlign } from '../Popover/index.js';
2
+ export interface ContrastHelpLabels {
3
+ /** The button's name: "About contrast levels". */
4
+ trigger: string;
5
+ /** The panel's name: "Contrast levels". */
6
+ title: string;
7
+ /** What contrast is. */
8
+ intro: string;
9
+ /** The levels, each its word as the badge draws it and what it means. */
10
+ aa: {
11
+ term: string;
12
+ meaning: string;
13
+ };
14
+ aaa: {
15
+ term: string;
16
+ meaning: string;
17
+ };
18
+ low: {
19
+ term: string;
20
+ meaning: string;
21
+ };
22
+ }
23
+ export interface ContrastHelpProps {
24
+ /** Which edge of the button the panel lines up with. `start` by default. */
25
+ align?: PopoverAlign | undefined;
26
+ className?: string | undefined;
27
+ labels?: Partial<ContrastHelpLabels> | undefined;
28
+ }
29
+ /**
30
+ * What the contrast levels mean, a press away: a small info button beside a
31
+ * contrast heading that opens a short panel with AA, AAA and Low or Fails,
32
+ * each drawn as `ContrastBadge` draws it.
33
+ *
34
+ * A PRESS, NOT A HOVER. The panel is a `Popover` the button toggles, so it
35
+ * opens on a phone, where there is no hover, and from the keyboard (Enter or
36
+ * Space), and closes on Escape or a press outside, handing focus back to the
37
+ * button. A tooltip would hold this on hover alone and drop it the moment the
38
+ * pointer moved to read it. The panel is a dialog named by its title.
39
+ */
40
+ export declare function ContrastHelp({ align, className, labels }: ContrastHelpProps): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import './ContrastHelp.css';
2
+ export { ContrastHelp } from './ContrastHelp.js';
3
+ export type { ContrastHelpLabels, ContrastHelpProps } from './ContrastHelp.js';
@@ -0,0 +1,12 @@
1
+ export { ContrastHelp } from '../chunk-KIRQZG3G.js';
2
+ import '../chunk-WW7TU6HE.js';
3
+ import '../chunk-KYIAFNU7.js';
4
+ import '../chunk-KHJIEPZV.js';
5
+ import '../chunk-7W3LYIOC.js';
6
+ import '../chunk-WIATRXEJ.js';
7
+ import '../chunk-OMV5W53A.js';
8
+ import '../chunk-H5XTJ7GJ.js';
9
+ import '../chunk-LACA4JGC.js';
10
+ import '../chunk-NUZHC6MM.js';
11
+ import '../chunk-BZFWDIV6.js';
12
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,43 @@
1
+ /*
2
+ * ContrastHelp: what the contrast levels mean, in a short panel opened from an
3
+ * info button (ContrastHelp.tsx).
4
+ */
5
+ .crewlet-contrast-help {
6
+ display: flex;
7
+ flex-direction: column;
8
+ gap: var(--spacing-2);
9
+ padding: var(--spacing-3);
10
+ font-family: var(--font-family-sans);
11
+ font-size: var(--font-size-xs);
12
+ line-height: var(--font-line-height-snug);
13
+ }
14
+
15
+ .crewlet-contrast-help__title {
16
+ margin: 0;
17
+ color: var(--color-text-primary);
18
+ font-size: var(--font-size-sm);
19
+ font-weight: var(--font-weight-semibold);
20
+ }
21
+
22
+ .crewlet-contrast-help__intro {
23
+ margin: 0;
24
+ color: var(--color-text-secondary);
25
+ }
26
+
27
+ /* Each level's word as the badge draws it, beside what it means. */
28
+ .crewlet-contrast-help__levels {
29
+ display: grid;
30
+ grid-template-columns: max-content minmax(0, 1fr);
31
+ align-items: baseline;
32
+ gap: var(--spacing-2) var(--spacing-3);
33
+ margin: 0;
34
+ }
35
+
36
+ .crewlet-contrast-help__levels dt,
37
+ .crewlet-contrast-help__levels dd {
38
+ margin: 0;
39
+ }
40
+
41
+ .crewlet-contrast-help__levels dd {
42
+ color: var(--color-text-secondary);
43
+ }
@@ -1,7 +1,7 @@
1
- export { DATA_VIEW_TOOLBAR_LABELS, DataView, DataViewToolbar, FILTER_AXIS_LABELS, FilterAxisBar, FilterAxisChip, applyColumnFilters, applyFilters, blankFilterValue, defaultOperator, filterDefsFromColumns, filterHasValue, filterPredicate, formatFilterValue, operatorOf, tableColumns } from '../chunk-NAWUXCBC.js';
1
+ export { DATA_VIEW_TOOLBAR_LABELS, DataView, DataViewToolbar, FILTER_AXIS_LABELS, FilterAxisBar, FilterAxisChip, applyColumnFilters, applyFilters, blankFilterValue, defaultOperator, filterDefsFromColumns, filterHasValue, filterPredicate, formatFilterValue, operatorOf, tableColumns } from '../chunk-WX6IJJ4U.js';
2
2
  import '../chunk-DKB73KZI.js';
3
- import '../chunk-ZFM5L7M4.js';
4
3
  import '../chunk-WQ7S7CKZ.js';
4
+ import '../chunk-ZFM5L7M4.js';
5
5
  import '../chunk-YCC2S7DF.js';
6
6
  import '../chunk-7KHM2FZH.js';
7
7
  import '../chunk-STJ7QBC3.js';
@@ -4,13 +4,11 @@ export interface EditingStatusLabels {
4
4
  editing: string;
5
5
  unsaved: string;
6
6
  saving: string;
7
- /** Shown once the last save landed, with how long ago: "Saved 2 min ago". */
8
- saved: (ago: string) => string;
9
7
  /**
10
- * Said in its place: the time is shown and not announced, so a screen
11
- * reader hears "Saved" when the save lands rather than every minute after.
8
+ * The state once the last save landed, followed by how long ago: "Saved",
9
+ * drawn "Saved 2m ago". The word is announced; the time is not.
12
10
  */
13
- savedSpoken: string;
11
+ saved: string;
14
12
  }
15
13
  export interface EditingStatusProps {
16
14
  /** Whether anything differs from what was opened. */
@@ -1,4 +1,4 @@
1
- export { EditingStatus } from '../chunk-MMOXWAUG.js';
1
+ export { EditingStatus } from '../chunk-EJWPYEG4.js';
2
2
  import '../chunk-3CZ7XAVY.js';
3
3
  import '../chunk-EUCC37WY.js';
4
4
  import '../chunk-BZFWDIV6.js';
@@ -26,20 +26,32 @@
26
26
  background: var(--color-brand-accent);
27
27
  }
28
28
 
29
+ /*
30
+ * THE WORDS RUN AS TEXT, not as flex items, so the space between the label
31
+ * and the state (which the ear needs) and the space before the time are real
32
+ * spaces, and the row is cut with an ellipsis rather than squeezed.
33
+ */
34
+ .crewlet-editing-status__text {
35
+ min-width: 0;
36
+ overflow: hidden;
37
+ text-overflow: ellipsis;
38
+ }
39
+
29
40
  .crewlet-editing-status__label {
30
41
  color: var(--color-text-primary);
31
42
  font-weight: var(--font-weight-medium);
32
43
  }
33
44
 
34
- .crewlet-editing-status__state {
35
- overflow: hidden;
45
+ .crewlet-editing-status__state,
46
+ .crewlet-editing-status__ago {
36
47
  color: var(--color-text-tertiary);
37
- text-overflow: ellipsis;
38
48
  }
39
49
 
50
+ /* The dot between the label and the state: drawn, never read. The space
51
+ before it in the text gives it the step on its left. */
40
52
  .crewlet-editing-status__state::before {
41
53
  content: '\00b7';
42
- margin-right: var(--spacing-2);
54
+ margin-inline: var(--spacing-1) var(--spacing-2);
43
55
  }
44
56
 
45
57
  /*
@@ -53,7 +65,8 @@
53
65
  * "Editing" folds too, and Cancel and Save beside the dot say an edit is open.
54
66
  */
55
67
  @media (width < 480px) {
56
- .crewlet-editing-status__state {
68
+ .crewlet-editing-status__state,
69
+ .crewlet-editing-status__ago {
57
70
  position: absolute;
58
71
  width: 1px;
59
72
  height: 1px;
@@ -64,7 +77,8 @@
64
77
  }
65
78
 
66
79
  @container crewlet-artifact-bar (width < 900px) {
67
- .crewlet-editing-status__state {
80
+ .crewlet-editing-status__state,
81
+ .crewlet-editing-status__ago {
68
82
  position: absolute;
69
83
  width: 1px;
70
84
  height: 1px;
@@ -76,7 +90,8 @@
76
90
 
77
91
  @container crewlet-artifact-bar (width < 640px) {
78
92
  .crewlet-editing-status__label,
79
- .crewlet-editing-status__state {
93
+ .crewlet-editing-status__state,
94
+ .crewlet-editing-status__ago {
80
95
  position: absolute;
81
96
  width: 1px;
82
97
  height: 1px;
@@ -1,4 +1,4 @@
1
- export { FolderTile, describeFolderContents } from '../chunk-M4QM477B.js';
1
+ export { FolderTile, describeFolderContents } from '../chunk-FXHWOXGD.js';
2
2
  import '../chunk-INHXF2CL.js';
3
3
  import '../chunk-AV2DXAEL.js';
4
4
  import '../chunk-BHHIIK3M.js';
@@ -27,8 +27,17 @@
27
27
  --crewlet-folder-tile-floor: auto;
28
28
  --crewlet-folder-tile-glyph: 40px;
29
29
  --crewlet-folder-tile-glyph-radius: var(--radius-md);
30
+ /*
31
+ * THE WORDS ARE SET AS THE CARDS BESIDE THEM: a tile's name at a gallery
32
+ * card's title step and weight, its facts at the card's facts step, one
33
+ * line height for both and the card's step between them. The row (and a
34
+ * tile on a phone, which is the row) keeps the same two steps, since the
35
+ * cards it stands above keep theirs there too, with a tighter step between
36
+ * the lines so it stays one compact row.
37
+ */
30
38
  --crewlet-folder-tile-name: var(--font-size-md);
31
39
  --crewlet-folder-tile-facts: var(--font-size-sm);
40
+ --crewlet-folder-tile-words-gap: var(--spacing-1);
32
41
  --crewlet-folder-tile-actions-inset: var(--spacing-3);
33
42
  /*
34
43
  * A TILE STACKS: the glyph on top with the More menu level with it in the
@@ -61,8 +70,7 @@
61
70
  --crewlet-folder-tile-floor: var(--size-control-lg);
62
71
  --crewlet-folder-tile-glyph: 28px;
63
72
  --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);
73
+ --crewlet-folder-tile-words-gap: 2px;
66
74
  --crewlet-folder-tile-actions-inset: var(--spacing-2);
67
75
  --crewlet-folder-tile-direction: row;
68
76
  --crewlet-folder-tile-align: center;
@@ -82,8 +90,7 @@
82
90
  --crewlet-folder-tile-floor: var(--size-control-lg);
83
91
  --crewlet-folder-tile-glyph: 28px;
84
92
  --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);
93
+ --crewlet-folder-tile-words-gap: 2px;
87
94
  --crewlet-folder-tile-actions-inset: var(--spacing-2);
88
95
  --crewlet-folder-tile-direction: row;
89
96
  --crewlet-folder-tile-align: center;
@@ -151,7 +158,7 @@
151
158
  .crewlet-folder-tile__body {
152
159
  display: flex;
153
160
  flex-direction: column;
154
- gap: 2px;
161
+ gap: var(--crewlet-folder-tile-words-gap);
155
162
  min-width: 0;
156
163
  max-width: 100%;
157
164
  }
@@ -1,5 +1,5 @@
1
- export { FollowBanner } from '../chunk-4A4QG6UC.js';
2
- import '../chunk-SZZRIHGT.js';
1
+ export { FollowBanner } from '../chunk-34C7NYIQ.js';
2
+ import '../chunk-BPCY7ZID.js';
3
3
  import '../chunk-OMV5W53A.js';
4
4
  import '../chunk-OG6CL3EB.js';
5
5
  import '../chunk-H5XTJ7GJ.js';
@@ -1,5 +1,5 @@
1
- export { INLINE_EDITOR_LABELS, InlineEditor } from '../chunk-QGRA2RHC.js';
2
- import '../chunk-MMOXWAUG.js';
1
+ export { INLINE_EDITOR_LABELS, InlineEditor } from '../chunk-6RMZH7P7.js';
2
+ import '../chunk-EJWPYEG4.js';
3
3
  import '../chunk-3CZ7XAVY.js';
4
4
  import '../chunk-EUCC37WY.js';
5
5
  import '../chunk-SMBKXWML.js';
@@ -1,7 +1,7 @@
1
- export { LinkInterstitial, openExternal } from '../chunk-GP4YWZFO.js';
1
+ export { LinkInterstitial, openExternal } from '../chunk-U3LNU4B2.js';
2
2
  import '../chunk-YCC2S7DF.js';
3
3
  import '../chunk-5CLW2CXT.js';
4
- import '../chunk-SZZRIHGT.js';
4
+ import '../chunk-BPCY7ZID.js';
5
5
  import '../chunk-PQADV6P6.js';
6
6
  import '../chunk-OMV5W53A.js';
7
7
  import '../chunk-OG6CL3EB.js';
@@ -109,8 +109,10 @@ export interface ListInputProps {
109
109
  itemError?: ((index: number, value: string) => ReactNode) | undefined;
110
110
  /** What the list says in place of the new-item box once it is full. */
111
111
  fullMessage?: ((max: number) => string) | undefined;
112
- /** The name of the control beside the legend that appends what the box holds. */
112
+ /** The name of the button at the end of the box's row that appends what the box holds: "Add policy". */
113
113
  addLabel?: ((itemName: string) => string) | undefined;
114
+ /** The word that button shows, which its name begins with: "Add". */
115
+ addText?: string | undefined;
114
116
  itemLabel?: ((name: string, position: string) => string) | undefined;
115
117
  newItemLabel?: ((itemName: string) => string) | undefined;
116
118
  moveUpLabel?: ((itemName: string, position: string) => string) | undefined;
@@ -1,4 +1,4 @@
1
- export { ListInput, withDraft } from '../chunk-PGR2PKH6.js';
1
+ export { ListInput, withDraft } from '../chunk-UUTEWGO6.js';
2
2
  import '../chunk-XJ2QEBMM.js';
3
3
  import '../chunk-SMBKXWML.js';
4
4
  import '../chunk-EXRRTKWT.js';
@@ -257,7 +257,7 @@
257
257
  }
258
258
  }
259
259
 
260
- /* With a hidden legend the add control stands at the end of the box's row. */
260
+ /* The Add button ends the box's row: the field and its Add read as one control. */
261
261
  .crewlet-list-input__add-control {
262
262
  display: inline-flex;
263
263
  flex: none;
@@ -1,8 +1,8 @@
1
- export { LogoSlot } from '../chunk-BEAXJARF.js';
1
+ export { LogoSlot } from '../chunk-2UFUP2ZH.js';
2
2
  import '../chunk-THDGBD6Y.js';
3
- import '../chunk-NSSOWQCJ.js';
3
+ import '../chunk-WW7TU6HE.js';
4
4
  import '../chunk-KYIAFNU7.js';
5
- import '../chunk-UZMNR366.js';
5
+ import '../chunk-7W3LYIOC.js';
6
6
  import '../chunk-WIATRXEJ.js';
7
7
  import '../chunk-OG6CL3EB.js';
8
8
  import '../chunk-BZFWDIV6.js';
@@ -1,7 +1,7 @@
1
- export { RichEditor, preloadRichEditor } from '../chunk-JWNYI7UD.js';
1
+ export { RichEditor, preloadRichEditor } from '../chunk-KHP7TJF7.js';
2
2
  export { RICH_EDITOR_LABELS, richEditorLabels } from '../chunk-CSQTDGTS.js';
3
3
  import '../chunk-BAKPMH3S.js';
4
- import '../chunk-SZZRIHGT.js';
4
+ import '../chunk-BPCY7ZID.js';
5
5
  import '../chunk-TEUQWOWZ.js';
6
6
  import '../chunk-OG6CL3EB.js';
7
7
  import '../chunk-BZFWDIV6.js';