@crewlethq/ui 0.10.0 → 0.11.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 (80) hide show
  1. package/README.md +17 -1
  2. package/dist/Accordion/index.js +3 -3
  3. package/dist/AppShell/index.js +2 -2
  4. package/dist/AvatarPicker/AvatarPicker.d.ts +32 -0
  5. package/dist/AvatarPicker/index.d.ts +3 -0
  6. package/dist/AvatarPicker/index.js +14 -0
  7. package/dist/AvatarPicker-PREY36MG.css +54 -0
  8. package/dist/Canvas/index.js +3 -3
  9. package/dist/Card/index.js +2 -2
  10. package/dist/CharacterPicker/index.js +2 -1
  11. package/dist/CodeBlock/index.js +3 -3
  12. package/dist/Combobox/index.js +3 -3
  13. package/dist/CommandPalette/index.js +6 -6
  14. package/dist/Copyable/index.js +2 -2
  15. package/dist/DataTable/index.js +6 -6
  16. package/dist/DataView/index.js +11 -11
  17. package/dist/DateTimePicker/index.js +4 -4
  18. package/dist/Disclosure/index.js +3 -3
  19. package/dist/FactList/FactList.d.ts +33 -0
  20. package/dist/FactList/index.d.ts +3 -0
  21. package/dist/FactList/index.js +6 -0
  22. package/dist/FactList-G2H73NFR.css +57 -0
  23. package/dist/HuePicker/index.js +4 -3
  24. package/dist/Input/FormField.d.ts +8 -1
  25. package/dist/Input/index.js +1 -1
  26. package/dist/{Input-DRFNI26F.css → Input-RAKNQJCV.css} +7 -0
  27. package/dist/ListInput/ListInput.d.ts +3 -1
  28. package/dist/ListInput/index.js +3 -3
  29. package/dist/Menu/index.js +3 -3
  30. package/dist/Modal/index.js +3 -3
  31. package/dist/OrgTable/index.js +5 -5
  32. package/dist/SegmentedControl/index.js +3 -3
  33. package/dist/Tabs/Tabs.d.ts +18 -0
  34. package/dist/Tabs/index.d.ts +1 -1
  35. package/dist/Tabs/index.js +1 -1
  36. package/dist/{Tabs-BWFQSWY3.css → Tabs-5I5Q5KKM.css} +33 -0
  37. package/dist/TagsInput/index.js +2 -2
  38. package/dist/ThemeSwitcher/index.js +4 -4
  39. package/dist/TimeWindowPicker/index.js +5 -5
  40. package/dist/TreeCanvas/index.js +4 -4
  41. package/dist/TreeGrid/index.js +2 -2
  42. package/dist/chunk-3L5NHASN.js +1 -0
  43. package/dist/{chunk-L7THQMFB.js → chunk-5WEVLIB6.js} +1 -1
  44. package/dist/{chunk-IGWPZZIB.js → chunk-6SDGRKQ7.js} +2 -2
  45. package/dist/{chunk-EUT7VBQG.js → chunk-CIOKUMVC.js} +6 -6
  46. package/dist/{chunk-LPHHDCN3.js → chunk-EBBAAQDY.js} +1 -1
  47. package/dist/{chunk-UYK72NOS.js → chunk-ELZKOVEC.js} +1 -1
  48. package/dist/chunk-EXHQ2QVW.js +1 -0
  49. package/dist/{chunk-ZGX2DP7F.js → chunk-FTEJPHBI.js} +8 -2
  50. package/dist/{chunk-RIAZM6L3.js → chunk-G2AVKPSL.js} +1 -1
  51. package/dist/{chunk-IZHN5I3H.js → chunk-HLBRPES3.js} +4 -4
  52. package/dist/chunk-HV6IZFBK.js +64 -0
  53. package/dist/{chunk-HEOVQZL7.js → chunk-JHQUT4WJ.js} +6 -2
  54. package/dist/{chunk-26TXVHN2.js → chunk-K5Q2DK3P.js} +1 -2
  55. package/dist/{chunk-MORLKUGM.js → chunk-KGTQ5CVD.js} +1 -1
  56. package/dist/{chunk-6HXH57BL.js → chunk-LZP7FGT7.js} +4 -2
  57. package/dist/{chunk-CVB7O3SZ.js → chunk-R4ZJB5YX.js} +4 -4
  58. package/dist/{chunk-MICH6QSJ.js → chunk-S4RCG44T.js} +1 -1
  59. package/dist/{chunk-UI6HWAWE.js → chunk-UAQIUSSK.js} +1 -1
  60. package/dist/chunk-URYDN2KA.js +25 -0
  61. package/dist/{chunk-X6K6OZ47.js → chunk-WEIINZPA.js} +1 -1
  62. package/dist/{chunk-UO5UK7V2.js → chunk-YXMCUKFI.js} +0 -1
  63. package/dist/{chunk-7FFDJQ23.js → chunk-ZMJHK7DR.js} +1 -1
  64. package/dist/generated/index.d.ts +2 -0
  65. package/dist/generated/index.js +53 -49
  66. package/dist/index.js +53 -49
  67. package/dist/styles.css +159 -2
  68. package/dist/utils/index.js +1 -1
  69. package/package.json +3 -3
  70. package/dist/{chunk-VE6LD3KM.js → chunk-2PZBIHRV.js} +2 -2
  71. package/dist/{chunk-MPXI6FM6.js → chunk-7JGWSOLM.js} +1 -1
  72. package/dist/{chunk-OVLJEVQS.js → chunk-7LD6P32I.js} +1 -1
  73. package/dist/{chunk-CEOXFO3E.js → chunk-EG6NYWVK.js} +1 -1
  74. package/dist/{chunk-FZVJDJFN.js → chunk-ENJUPIND.js} +1 -1
  75. package/dist/{chunk-5I56UXBJ.js → chunk-JCNUQ3US.js} +2 -2
  76. package/dist/{chunk-SX2DFTQV.js → chunk-MCPKHYMC.js} +1 -1
  77. package/dist/{chunk-YPTC4TX5.js → chunk-PQLMLG5K.js} +0 -0
  78. package/dist/{chunk-BTHX2FS3.js → chunk-TEEJSTFG.js} +2 -2
  79. package/dist/{chunk-LSB3EHBW.js → chunk-TFH6SYWB.js} +2 -2
  80. package/dist/{chunk-26SCUACK.js → chunk-YACKC3K2.js} +1 -1
package/README.md CHANGED
@@ -42,7 +42,7 @@ import { Button } from '@crewlethq/ui/Button'; // 8 KB of CSS, not 182 KB
42
42
  | ---- | ---------- |
43
43
  | Actions | `Button` and `ButtonLink` (variants `primary`, `secondary`, `outline`, `ghost`, `accent`, `danger`; sizes `small`, `medium`, `large`; shapes `square`, `pill`), `IconButton`, `Menu`, `Link`, `Copyable`, `CopyButton`, `Kbd` |
44
44
  | Content and text | `Text` (the eight registers), `Prose`, `InlineCode`, `List` and `ListItem`, `DescriptionList`, `Timeline`, `RelativeTime` |
45
- | Forms | `Input`, `Textarea`, `Label`, `FormField`, `FormRow`, `Checkbox`, `Select`, `Tag`, `TagsInput`, `DateTimePicker`, `TimeWindowPicker`, `ImageUpload`, `CharacterPicker`, `HuePicker` |
45
+ | Forms | `Input`, `Textarea`, `Label`, `FormField`, `FormRow`, `Checkbox`, `Select`, `Tag`, `TagsInput`, `DateTimePicker`, `TimeWindowPicker`, `ImageUpload`, `CharacterPicker`, `HuePicker`, `AvatarPicker`, `FactList` |
46
46
  | Data display | `DataTable`, `CopyableCell`, `Table`, `StatCard`, `Meter`, `SegmentedMeter`, `Stepper`, `PricingCard`, `Avatar`, `AvatarStack`, `EntityChip`, `CodeBlock`, `Skeleton`, `Eyebrow` |
47
47
  | List screens | `DataView`, and its parts on their own: `DataViewToolbar`, `FilterAxisBar`, `FilterAxisChip`, plus the filter model (`filterDefsFromColumns`, `applyColumnFilters`, `filterPredicate`, `blankFilterValue`) |
48
48
  | Feedback and overlays | `Callout`, `Toaster`, `Modal` (with `variant="sheet"`), `ConfirmModal`, `CommandPalette`, `Tooltip`, `Popover`, `Announcer` |
@@ -191,6 +191,22 @@ places:
191
191
  - A surface that pans or zooms dispatches `LAYER_REPOSITION_EVENT` on its host
192
192
  when the content beneath it moves, and every panel anchored inside follows.
193
193
 
194
+ ## Changes in 0.11.0
195
+
196
+ 0.11.0 adds the parts a dense editing form is built from.
197
+
198
+ **`FactList`** draws facts a form shows and does not edit as 32px rows in one bordered box: the label on the left, the value on the right. A row with a `reason` carries a lock and says why in a tooltip on hover and to a screen reader after its value, in place of a caption under every value.
199
+
200
+ **`AvatarPicker`** is an agent's badge that opens its own picker. Pressing it opens the characters and the hues in a popover, and each choice applies as it is made; a `disabled` one is the badge alone. It replaces a `CharacterPicker` and a `HuePicker` drawn open in a form.
201
+
202
+ **`Tabs` take a `marker`** per item: `{ tone: 'danger', count, label }` for problems, or `{ tone: 'warning' | 'changed', label }` for a 6px dot. One per tab, the most urgent, and it stands in for the item's `count` while set; `label` is what a screen reader hears. `TabsMarker` is its type.
203
+
204
+ **`FormField` takes `helperOnFocus`**: the helper is still in `aria-describedby`, and is drawn only while the field has focus, so a form whose every field carries a sentence reads as labels and values at rest. `ListInput` passes the same prop to its field.
205
+
206
+ `@crewlethq/icons` adds `LockGlyph` (Lucide's `lock`), which `FactList` draws.
207
+
208
+ What to change: nothing. Every addition is new.
209
+
194
210
  ## Breaking changes in 0.10.0
195
211
 
196
212
  0.10.0 moves an agent's state off the ring round its badge and onto a small badge on its corner.
@@ -1,6 +1,6 @@
1
- export { Accordion, AccordionItem } from '../chunk-RIAZM6L3.js';
2
- import '../chunk-FZVJDJFN.js';
3
- import '../chunk-BHHIIK3M.js';
1
+ export { Accordion, AccordionItem } from '../chunk-G2AVKPSL.js';
2
+ import '../chunk-ENJUPIND.js';
4
3
  import '../chunk-PQADV6P6.js';
4
+ import '../chunk-BHHIIK3M.js';
5
5
  import '../chunk-BZFWDIV6.js';
6
6
  import '../chunk-ODEQTPFM.js';
@@ -1,6 +1,6 @@
1
- export { AppShell, AppShellRail, AppShellRailRow, AppShellToggle, AppShellTopbar, useAppShell } from '../chunk-OVLJEVQS.js';
1
+ export { AppShell, AppShellRail, AppShellRailRow, AppShellToggle, AppShellTopbar, useAppShell } from '../chunk-7LD6P32I.js';
2
+ import '../chunk-4FQT6ZAY.js';
2
3
  import '../chunk-7RPGY3JE.js';
3
4
  import '../chunk-R25RGPUB.js';
4
- import '../chunk-4FQT6ZAY.js';
5
5
  import '../chunk-BZFWDIV6.js';
6
6
  import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,32 @@
1
+ import { type CrewletCharacterId } from '@crewlethq/icons/characters';
2
+ import { type AvatarSize } from '../Avatar/Avatar.js';
3
+ import { type NodeHue } from '../utils/nodeHue.js';
4
+ /** An agent's look: its character and the hue it is drawn in. */
5
+ export interface AvatarPickerValue {
6
+ character: CrewletCharacterId;
7
+ hue: NodeHue;
8
+ }
9
+ export interface AvatarPickerProps {
10
+ value: AvatarPickerValue;
11
+ onChange: (next: AvatarPickerValue) => void;
12
+ /** The agent's name, for the button's accessible name. */
13
+ name: string;
14
+ /** The badge's size. 40px, the size a form's header draws an identity at. */
15
+ size?: AvatarSize | undefined;
16
+ /** The characters offered, in order. Every character, by default. */
17
+ characters?: readonly CrewletCharacterId[] | undefined;
18
+ /** The badge is drawn, and nothing opens. */
19
+ disabled?: boolean | undefined;
20
+ className?: string | undefined;
21
+ }
22
+ /**
23
+ * An agent's badge that opens its own picker: press it and the characters and
24
+ * the hues open in a popover beside it.
25
+ *
26
+ * THE BADGE IS THE CONTROL. The two pickers drawn open in a form took about
27
+ * 330px for a choice made once, so the form keeps one badge, marked with a
28
+ * pencil pip as the thing that changes it, and the grid opens on demand. A
29
+ * choice applies as it is made, as the pickers' own radios do; Escape or a
30
+ * press outside closes the popover.
31
+ */
32
+ export declare function AvatarPicker({ value, onChange, name, size, characters, disabled, className, }: AvatarPickerProps): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import './AvatarPicker.css';
2
+ export { AvatarPicker } from './AvatarPicker.js';
3
+ export type { AvatarPickerProps, AvatarPickerValue } from './AvatarPicker.js';
@@ -0,0 +1,14 @@
1
+ export { AvatarPicker } from '../chunk-HV6IZFBK.js';
2
+ import '../chunk-K5Q2DK3P.js';
3
+ import '../chunk-AYKXMIOR.js';
4
+ import '../chunk-EBBAAQDY.js';
5
+ import '../chunk-JHQUT4WJ.js';
6
+ import '../chunk-PDUZO35I.js';
7
+ import '../chunk-YXMCUKFI.js';
8
+ import '../chunk-CBOICT64.js';
9
+ import '../chunk-BHHIIK3M.js';
10
+ import '../chunk-7RPGY3JE.js';
11
+ import '../chunk-R25RGPUB.js';
12
+ import '../chunk-BZFWDIV6.js';
13
+ import '../chunk-HI6Q2UXQ.js';
14
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,54 @@
1
+ /*
2
+ * The badge as a button, with a pencil pip on its corner saying it changes
3
+ * the badge. No chrome of its own beyond the focus ring: the badge is the
4
+ * control's face.
5
+ */
6
+ .crewlet-avatar-picker {
7
+ position: relative;
8
+ display: inline-flex;
9
+ flex: none;
10
+ padding: 0;
11
+ border: 0;
12
+ border-radius: var(--radius-lg);
13
+ background: none;
14
+ cursor: pointer;
15
+ }
16
+
17
+ button.crewlet-avatar-picker:focus-visible {
18
+ outline: 2px solid var(--color-focus);
19
+ outline-offset: 2px;
20
+ }
21
+
22
+ .crewlet-avatar-picker__pip {
23
+ position: absolute;
24
+ right: calc(var(--spacing-1) * -1);
25
+ bottom: calc(var(--spacing-1) * -1);
26
+ display: grid;
27
+ place-items: center;
28
+ width: 16px;
29
+ height: 16px;
30
+ border: 1px solid var(--color-border-strong);
31
+ border-radius: var(--radius-circle);
32
+ background: var(--color-surface-elevated);
33
+ color: var(--color-text-secondary);
34
+ }
35
+
36
+ button.crewlet-avatar-picker:hover .crewlet-avatar-picker__pip {
37
+ color: var(--color-text-primary);
38
+ }
39
+
40
+ .crewlet-avatar-picker__body {
41
+ display: grid;
42
+ gap: var(--spacing-2);
43
+ width: max-content;
44
+ max-width: 100%;
45
+ padding: var(--spacing-3);
46
+ }
47
+
48
+ .crewlet-avatar-picker__label {
49
+ font-size: var(--font-size-2xs);
50
+ font-weight: var(--font-weight-medium);
51
+ letter-spacing: var(--font-letter-spacing-wide);
52
+ text-transform: uppercase;
53
+ color: var(--color-text-tertiary);
54
+ }
@@ -1,8 +1,8 @@
1
- export { CANVAS_COMPOSE_CONTEXT, CANVAS_FIT_MAX_ZOOM, CANVAS_FIT_PADDING, CANVAS_FOCUS_CONTEXT, CANVAS_MAX_ZOOM, CANVAS_MIN_ZOOM, CANVAS_PAN_MARGIN, CANVAS_PAN_STEP, CANVAS_REVEAL_PADDING, CANVAS_TAP_SLOP, CANVAS_WHEEL_LINE_PX, CANVAS_WHEEL_ZOOM_PER_PIXEL, CANVAS_ZOOM_CEILING, CANVAS_ZOOM_LIMITS, CANVAS_ZOOM_STEP, Canvas, IDENTITY_VIEW, anchorView, beyondSlop, clampPan, clampZoom, fitView, panBy, pinchView, regionView, revealView, screenRect, toScreen, toWorld, wheelPixels, wheelZoomFactor, zoomAt, zoomLimits } from '../chunk-VE6LD3KM.js';
1
+ export { CANVAS_COMPOSE_CONTEXT, CANVAS_FIT_MAX_ZOOM, CANVAS_FIT_PADDING, CANVAS_FOCUS_CONTEXT, CANVAS_MAX_ZOOM, CANVAS_MIN_ZOOM, CANVAS_PAN_MARGIN, CANVAS_PAN_STEP, CANVAS_REVEAL_PADDING, CANVAS_TAP_SLOP, CANVAS_WHEEL_LINE_PX, CANVAS_WHEEL_ZOOM_PER_PIXEL, CANVAS_ZOOM_CEILING, CANVAS_ZOOM_LIMITS, CANVAS_ZOOM_STEP, Canvas, IDENTITY_VIEW, anchorView, beyondSlop, clampPan, clampZoom, fitView, panBy, pinchView, regionView, revealView, screenRect, toScreen, toWorld, wheelPixels, wheelZoomFactor, zoomAt, zoomLimits } from '../chunk-2PZBIHRV.js';
2
2
  import '../chunk-53DVJCVW.js';
3
+ import '../chunk-OG6CL3EB.js';
4
+ import '../chunk-4FQT6ZAY.js';
3
5
  import '../chunk-7RPGY3JE.js';
4
6
  import '../chunk-R25RGPUB.js';
5
- import '../chunk-4FQT6ZAY.js';
6
- import '../chunk-OG6CL3EB.js';
7
7
  import '../chunk-BZFWDIV6.js';
8
8
  import '../chunk-ODEQTPFM.js';
@@ -1,6 +1,6 @@
1
- export { Card } from '../chunk-CEOXFO3E.js';
1
+ export { Card } from '../chunk-EG6NYWVK.js';
2
2
  export { useCardHeaderSlot } from '../chunk-AV2DXAEL.js';
3
- import '../chunk-BHHIIK3M.js';
4
3
  import '../chunk-PQADV6P6.js';
4
+ import '../chunk-BHHIIK3M.js';
5
5
  import '../chunk-BZFWDIV6.js';
6
6
  import '../chunk-ODEQTPFM.js';
@@ -1,4 +1,5 @@
1
- export { CHARACTER_PICKER_COLUMNS, CharacterPicker } from '../chunk-UO5UK7V2.js';
1
+ import '../chunk-3L5NHASN.js';
2
+ export { CHARACTER_PICKER_COLUMNS, CharacterPicker } from '../chunk-YXMCUKFI.js';
2
3
  import '../chunk-CBOICT64.js';
3
4
  import '../chunk-HI6Q2UXQ.js';
4
5
  import '../chunk-ODEQTPFM.js';
@@ -1,7 +1,7 @@
1
- export { CodeBlock } from '../chunk-MORLKUGM.js';
2
- import '../chunk-26SCUACK.js';
1
+ export { CodeBlock } from '../chunk-KGTQ5CVD.js';
2
+ import '../chunk-YACKC3K2.js';
3
3
  import '../chunk-5VNUYO76.js';
4
- import '../chunk-4FQT6ZAY.js';
5
4
  import '../chunk-OG6CL3EB.js';
5
+ import '../chunk-4FQT6ZAY.js';
6
6
  import '../chunk-BZFWDIV6.js';
7
7
  import '../chunk-ODEQTPFM.js';
@@ -1,8 +1,8 @@
1
- export { Combobox } from '../chunk-UYK72NOS.js';
1
+ export { Combobox } from '../chunk-ELZKOVEC.js';
2
+ import '../chunk-FTEJPHBI.js';
2
3
  import '../chunk-6MU7HNB4.js';
3
- import '../chunk-ZGX2DP7F.js';
4
4
  import '../chunk-PQADV6P6.js';
5
- import '../chunk-R25RGPUB.js';
6
5
  import '../chunk-4FQT6ZAY.js';
6
+ import '../chunk-R25RGPUB.js';
7
7
  import '../chunk-BZFWDIV6.js';
8
8
  import '../chunk-ODEQTPFM.js';
@@ -1,13 +1,13 @@
1
- export { CommandPalette } from '../chunk-IGWPZZIB.js';
1
+ export { CommandPalette } from '../chunk-6SDGRKQ7.js';
2
2
  import '../chunk-SMBKXWML.js';
3
+ import '../chunk-FTEJPHBI.js';
3
4
  import '../chunk-6MU7HNB4.js';
4
- import '../chunk-ZGX2DP7F.js';
5
- import '../chunk-BTHX2FS3.js';
6
- import '../chunk-BHHIIK3M.js';
5
+ import '../chunk-TEEJSTFG.js';
6
+ import '../chunk-OG6CL3EB.js';
7
7
  import '../chunk-PQADV6P6.js';
8
+ import '../chunk-4FQT6ZAY.js';
9
+ import '../chunk-BHHIIK3M.js';
8
10
  import '../chunk-7RPGY3JE.js';
9
11
  import '../chunk-R25RGPUB.js';
10
- import '../chunk-4FQT6ZAY.js';
11
- import '../chunk-OG6CL3EB.js';
12
12
  import '../chunk-BZFWDIV6.js';
13
13
  import '../chunk-ODEQTPFM.js';
@@ -1,6 +1,6 @@
1
- export { CopyButton, Copyable } from '../chunk-26SCUACK.js';
1
+ export { CopyButton, Copyable } from '../chunk-YACKC3K2.js';
2
2
  import '../chunk-5VNUYO76.js';
3
- import '../chunk-4FQT6ZAY.js';
4
3
  import '../chunk-OG6CL3EB.js';
4
+ import '../chunk-4FQT6ZAY.js';
5
5
  import '../chunk-BZFWDIV6.js';
6
6
  import '../chunk-ODEQTPFM.js';
@@ -1,14 +1,14 @@
1
- export { ALL_ITEMS, CopyableCell, DATA_TABLE_LABELS, DataTable, RowActionsMenu } from '../chunk-CVB7O3SZ.js';
2
- import '../chunk-LSB3EHBW.js';
1
+ export { ALL_ITEMS, CopyableCell, DATA_TABLE_LABELS, DataTable, RowActionsMenu } from '../chunk-R4ZJB5YX.js';
2
+ import '../chunk-TFH6SYWB.js';
3
3
  import '../chunk-EUCC37WY.js';
4
- import '../chunk-BTHX2FS3.js';
4
+ import '../chunk-TEEJSTFG.js';
5
+ import '../chunk-5VNUYO76.js';
6
+ import '../chunk-OG6CL3EB.js';
5
7
  import '../chunk-AV2DXAEL.js';
6
8
  import '../chunk-YCTMKKRA.js';
7
- import '../chunk-5VNUYO76.js';
8
9
  import '../chunk-PQADV6P6.js';
10
+ import '../chunk-4FQT6ZAY.js';
9
11
  import '../chunk-7RPGY3JE.js';
10
12
  import '../chunk-R25RGPUB.js';
11
- import '../chunk-4FQT6ZAY.js';
12
- import '../chunk-OG6CL3EB.js';
13
13
  import '../chunk-BZFWDIV6.js';
14
14
  import '../chunk-ODEQTPFM.js';
@@ -1,25 +1,25 @@
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-EUT7VBQG.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-CIOKUMVC.js';
2
2
  import '../chunk-PGRPNDWM.js';
3
3
  import '../chunk-3CZ7XAVY.js';
4
4
  import '../chunk-HOXGBLEY.js';
5
+ import '../chunk-JCNUQ3US.js';
5
6
  import '../chunk-SMBKXWML.js';
7
+ import '../chunk-FTEJPHBI.js';
6
8
  import '../chunk-6MU7HNB4.js';
7
- import '../chunk-ZGX2DP7F.js';
8
- import '../chunk-CVB7O3SZ.js';
9
- import '../chunk-LSB3EHBW.js';
9
+ import '../chunk-R4ZJB5YX.js';
10
+ import '../chunk-TFH6SYWB.js';
10
11
  import '../chunk-EUCC37WY.js';
11
- import '../chunk-BTHX2FS3.js';
12
- import '../chunk-5I56UXBJ.js';
13
- import '../chunk-PDUZO35I.js';
12
+ import '../chunk-TEEJSTFG.js';
13
+ import '../chunk-5VNUYO76.js';
14
14
  import '../chunk-GXQ3B46I.js';
15
+ import '../chunk-OG6CL3EB.js';
15
16
  import '../chunk-AV2DXAEL.js';
16
17
  import '../chunk-YCTMKKRA.js';
17
- import '../chunk-5VNUYO76.js';
18
- import '../chunk-BHHIIK3M.js';
19
18
  import '../chunk-PQADV6P6.js';
19
+ import '../chunk-4FQT6ZAY.js';
20
+ import '../chunk-PDUZO35I.js';
21
+ import '../chunk-BHHIIK3M.js';
20
22
  import '../chunk-7RPGY3JE.js';
21
23
  import '../chunk-R25RGPUB.js';
22
- import '../chunk-4FQT6ZAY.js';
23
- import '../chunk-OG6CL3EB.js';
24
24
  import '../chunk-BZFWDIV6.js';
25
25
  import '../chunk-ODEQTPFM.js';
@@ -1,9 +1,9 @@
1
- export { DEFAULT_DATE_TIME_PICKER_LABELS, DateTimePicker } from '../chunk-5I56UXBJ.js';
2
- import '../chunk-PDUZO35I.js';
1
+ export { DEFAULT_DATE_TIME_PICKER_LABELS, DateTimePicker } from '../chunk-JCNUQ3US.js';
3
2
  import '../chunk-GXQ3B46I.js';
3
+ import '../chunk-OG6CL3EB.js';
4
+ import '../chunk-4FQT6ZAY.js';
5
+ import '../chunk-PDUZO35I.js';
4
6
  import '../chunk-7RPGY3JE.js';
5
7
  import '../chunk-R25RGPUB.js';
6
- import '../chunk-4FQT6ZAY.js';
7
- import '../chunk-OG6CL3EB.js';
8
8
  import '../chunk-BZFWDIV6.js';
9
9
  import '../chunk-ODEQTPFM.js';
@@ -1,6 +1,6 @@
1
- export { Disclosure } from '../chunk-MICH6QSJ.js';
2
- export { DisclosureAnatomy } from '../chunk-FZVJDJFN.js';
3
- import '../chunk-BHHIIK3M.js';
1
+ export { Disclosure } from '../chunk-S4RCG44T.js';
2
+ export { DisclosureAnatomy } from '../chunk-ENJUPIND.js';
4
3
  import '../chunk-PQADV6P6.js';
4
+ import '../chunk-BHHIIK3M.js';
5
5
  import '../chunk-BZFWDIV6.js';
6
6
  import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,33 @@
1
+ import type { ReactNode } from 'react';
2
+ /** One read-only fact: what it is, its value, and why it cannot be changed here. */
3
+ export interface FactListItem {
4
+ /** Stable identity within the list. */
5
+ key: string;
6
+ /** What the fact is: "Handle", "Placement". */
7
+ label: ReactNode;
8
+ /** Its value, as text or a short node (a link, a tag). */
9
+ value: ReactNode;
10
+ /**
11
+ * Why it cannot be changed here, in one sentence. Shown as a tooltip when
12
+ * the pointer rests on the row, and read by a screen reader after the value;
13
+ * with one, the row is drawn with a lock.
14
+ */
15
+ reason?: string | undefined;
16
+ }
17
+ export interface FactListProps {
18
+ items: readonly FactListItem[];
19
+ /** Names the list for a screen reader, where nothing above it does. */
20
+ label?: string | undefined;
21
+ className?: string | undefined;
22
+ }
23
+ /**
24
+ * Facts a form shows and does not edit, as rows in one bordered box: the label
25
+ * on the left, the value on the right, 32px a row.
26
+ *
27
+ * ONE LINE A FACT. A read-only value used to be drawn as a label, the value
28
+ * and a sentence under it, three lines each, so a form's locked facts
29
+ * outweighed its fields. The sentence is the row's tooltip now, and the lock
30
+ * says there is one. It is a description list, so a screen reader reads each
31
+ * label with its value.
32
+ */
33
+ export declare function FactList({ items, label, className }: FactListProps): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import './FactList.css';
2
+ export { FactList } from './FactList.js';
3
+ export type { FactListItem, FactListProps } from './FactList.js';
@@ -0,0 +1,6 @@
1
+ export { FactList } from '../chunk-URYDN2KA.js';
2
+ import '../chunk-CQY5NTRS.js';
3
+ import '../chunk-7RPGY3JE.js';
4
+ import '../chunk-R25RGPUB.js';
5
+ import '../chunk-BZFWDIV6.js';
6
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,57 @@
1
+ /*
2
+ * Read-only facts in one bordered box, a 32px row each: label and lock on the
3
+ * left, the value on the right. The rows share the box's hairline between
4
+ * them, so a list of six reads as one object rather than six cards.
5
+ */
6
+ .crewlet-fact-list {
7
+ display: grid;
8
+ margin: 0;
9
+ border: 1px solid var(--color-border-default);
10
+ border-radius: var(--radius-md);
11
+ overflow: hidden;
12
+ }
13
+
14
+ .crewlet-fact-list__row {
15
+ display: flex;
16
+ align-items: center;
17
+ gap: var(--spacing-2);
18
+ min-height: 32px;
19
+ padding: var(--spacing-1) var(--spacing-3);
20
+ font-size: var(--font-size-compact);
21
+ }
22
+
23
+ .crewlet-fact-list__row + .crewlet-fact-list__row {
24
+ border-top: 1px solid var(--color-border-default);
25
+ }
26
+
27
+ .crewlet-fact-list__row.is-locked {
28
+ cursor: help;
29
+ }
30
+
31
+ .crewlet-fact-list__label {
32
+ display: flex;
33
+ flex: 1 1 auto;
34
+ align-items: center;
35
+ gap: var(--spacing-1);
36
+ min-width: 0;
37
+ margin: 0;
38
+ color: var(--color-text-tertiary);
39
+ }
40
+
41
+ .crewlet-fact-list__lock {
42
+ flex: none;
43
+ color: var(--color-text-tertiary);
44
+ }
45
+
46
+ .crewlet-fact-list__value {
47
+ display: flex;
48
+ flex: 0 1 auto;
49
+ align-items: center;
50
+ justify-content: flex-end;
51
+ gap: var(--spacing-2);
52
+ min-width: 0;
53
+ margin: 0;
54
+ color: var(--color-text-secondary);
55
+ text-align: right;
56
+ overflow-wrap: anywhere;
57
+ }
@@ -1,7 +1,8 @@
1
- export { HuePicker } from '../chunk-26TXVHN2.js';
1
+ import '../chunk-EXHQ2QVW.js';
2
+ export { HuePicker } from '../chunk-K5Q2DK3P.js';
2
3
  import '../chunk-AYKXMIOR.js';
3
- import '../chunk-LPHHDCN3.js';
4
- import '../chunk-HEOVQZL7.js';
4
+ import '../chunk-EBBAAQDY.js';
5
+ import '../chunk-JHQUT4WJ.js';
5
6
  import '../chunk-CBOICT64.js';
6
7
  import '../chunk-BHHIIK3M.js';
7
8
  import '../chunk-BZFWDIV6.js';
@@ -19,6 +19,13 @@ export interface FormFieldProps extends Omit<HTMLAttributes<HTMLElement>, 'child
19
19
  requiredNews?: boolean | undefined;
20
20
  /** Where the value comes from, or what shape it takes. */
21
21
  helper?: ReactNode;
22
+ /**
23
+ * Show the helper only while the field has focus. For a dense form whose
24
+ * every field carries a sentence: at rest the form is labels and values,
25
+ * and the sentence appears under the field the reader is in. It stays in
26
+ * `aria-describedby` either way, so a screen reader hears it on entry.
27
+ */
28
+ helperOnFocus?: boolean | undefined;
22
29
  /** Why the last value was refused. */
23
30
  error?: ReactNode;
24
31
  /** A control rendered beside the label, such as an Add button. */
@@ -58,4 +65,4 @@ export interface FormFieldProps extends Omit<HTMLAttributes<HTMLElement>, 'child
58
65
  * instant, the only line that said what right looks like disappeared. Both
59
66
  * lines are joined into `aria-describedby` in reading order, help first.
60
67
  */
61
- export declare const FormField: ({ label, required, optional, requiredNews, helper, error, labelAction, as, describedBy, htmlFor, className, children, ...rest }: FormFieldProps) => import("react").JSX.Element;
68
+ export declare const FormField: ({ label, required, optional, requiredNews, helper, helperOnFocus, error, labelAction, as, describedBy, htmlFor, className, children, ...rest }: FormFieldProps) => import("react").JSX.Element;
@@ -1,4 +1,4 @@
1
- export { FormField, FormRow, FormSection, Input, InputAffix, Label, ReadOnlyField, Textarea } from '../chunk-ZGX2DP7F.js';
1
+ export { FormField, FormRow, FormSection, Input, InputAffix, Label, ReadOnlyField, Textarea } from '../chunk-FTEJPHBI.js';
2
2
  import '../chunk-PQADV6P6.js';
3
3
  import '../chunk-4FQT6ZAY.js';
4
4
  import '../chunk-BZFWDIV6.js';
@@ -502,6 +502,13 @@
502
502
  color: var(--color-text-tertiary);
503
503
  }
504
504
 
505
+ /* SHOWN ONLY WHILE THE FIELD HAS FOCUS (`helperOnFocus`): a dense form reads as
506
+ labels and values at rest, and the sentence appears under the field the
507
+ reader is in. Still described, so a screen reader hears it on entry. */
508
+ .crewlet-form-field--helper-on-focus:not(:focus-within) .crewlet-form-field__helper {
509
+ display: none;
510
+ }
511
+
505
512
  /*
506
513
  * The error line, on the danger INK. It stays BESIDE the help rather than
507
514
  * replacing it: a reader told they are wrong needs the line that says what
@@ -10,6 +10,8 @@ export interface ListInputProps {
10
10
  multiline?: boolean | undefined;
11
11
  /** Where the values come from, or what shape they take. */
12
12
  helper?: ReactNode | undefined;
13
+ /** Show the helper only while the list has focus, as `FormField`'s `helperOnFocus`. */
14
+ helperOnFocus?: boolean | undefined;
13
15
  /** Why the last value was refused. */
14
16
  error?: ReactNode | undefined;
15
17
  /** Shown in the new-item box. */
@@ -65,4 +67,4 @@ export interface ListInputProps {
65
67
  *
66
68
  * Ported from the engine dashboard's `ui/ListField.tsx`.
67
69
  */
68
- export declare function ListInput({ label, itemName, value, onChange, multiline, helper, error, placeholder, disabled, optional, enterHint, addLabel, itemLabel, newItemLabel, moveUpLabel, moveDownLabel, removeLabel, addedMessage, removedMessage, movedMessage, }: ListInputProps): import("react").JSX.Element;
70
+ export declare function ListInput({ label, itemName, value, onChange, multiline, helper, helperOnFocus, error, placeholder, disabled, optional, enterHint, addLabel, itemLabel, newItemLabel, moveUpLabel, moveDownLabel, removeLabel, addedMessage, removedMessage, movedMessage, }: ListInputProps): import("react").JSX.Element;
@@ -1,10 +1,10 @@
1
- export { ListInput } from '../chunk-6HXH57BL.js';
1
+ export { ListInput } from '../chunk-LZP7FGT7.js';
2
2
  import '../chunk-SMBKXWML.js';
3
- import '../chunk-ZGX2DP7F.js';
3
+ import '../chunk-FTEJPHBI.js';
4
4
  import '../chunk-PQADV6P6.js';
5
+ import '../chunk-4FQT6ZAY.js';
5
6
  import '../chunk-RSAQOKH3.js';
6
7
  import '../chunk-7RPGY3JE.js';
7
8
  import '../chunk-R25RGPUB.js';
8
- import '../chunk-4FQT6ZAY.js';
9
9
  import '../chunk-BZFWDIV6.js';
10
10
  import '../chunk-ODEQTPFM.js';
@@ -1,7 +1,7 @@
1
- export { Menu } from '../chunk-LSB3EHBW.js';
1
+ export { Menu } from '../chunk-TFH6SYWB.js';
2
+ import '../chunk-OG6CL3EB.js';
3
+ import '../chunk-4FQT6ZAY.js';
2
4
  import '../chunk-7RPGY3JE.js';
3
5
  import '../chunk-R25RGPUB.js';
4
- import '../chunk-4FQT6ZAY.js';
5
- import '../chunk-OG6CL3EB.js';
6
6
  import '../chunk-BZFWDIV6.js';
7
7
  import '../chunk-ODEQTPFM.js';
@@ -1,8 +1,8 @@
1
- export { ConfirmModal, Modal } from '../chunk-BTHX2FS3.js';
1
+ export { ConfirmModal, Modal } from '../chunk-TEEJSTFG.js';
2
+ import '../chunk-OG6CL3EB.js';
2
3
  import '../chunk-PQADV6P6.js';
4
+ import '../chunk-4FQT6ZAY.js';
3
5
  import '../chunk-7RPGY3JE.js';
4
6
  import '../chunk-R25RGPUB.js';
5
- import '../chunk-4FQT6ZAY.js';
6
- import '../chunk-OG6CL3EB.js';
7
7
  import '../chunk-BZFWDIV6.js';
8
8
  import '../chunk-ODEQTPFM.js';
@@ -1,13 +1,13 @@
1
- export { OrgTable, OrgTableActions, OrgTableAdd, OrgTableName } from '../chunk-7FFDJQ23.js';
2
- import '../chunk-SX2DFTQV.js';
1
+ export { OrgTable, OrgTableActions, OrgTableAdd, OrgTableName } from '../chunk-ZMJHK7DR.js';
2
+ import '../chunk-MCPKHYMC.js';
3
3
  import '../chunk-S3BCVWTU.js';
4
4
  import '../chunk-6OF2DBKY.js';
5
5
  import '../chunk-53DVJCVW.js';
6
6
  import '../chunk-74WGARJE.js';
7
- import '../chunk-7RPGY3JE.js';
8
- import '../chunk-R25RGPUB.js';
9
7
  import '../chunk-4FQT6ZAY.js';
10
8
  import '../chunk-3UK4VFSK.js';
11
- import '../chunk-HI6Q2UXQ.js';
9
+ import '../chunk-7RPGY3JE.js';
10
+ import '../chunk-R25RGPUB.js';
12
11
  import '../chunk-BZFWDIV6.js';
12
+ import '../chunk-HI6Q2UXQ.js';
13
13
  import '../chunk-ODEQTPFM.js';
@@ -1,6 +1,6 @@
1
- import '../chunk-UI6HWAWE.js';
2
- export { SegmentedControl } from '../chunk-LPHHDCN3.js';
3
- import '../chunk-HEOVQZL7.js';
1
+ import '../chunk-UAQIUSSK.js';
2
+ export { SegmentedControl } from '../chunk-EBBAAQDY.js';
3
+ import '../chunk-JHQUT4WJ.js';
4
4
  import '../chunk-CBOICT64.js';
5
5
  import '../chunk-BHHIIK3M.js';
6
6
  import '../chunk-BZFWDIV6.js';
@@ -10,10 +10,28 @@ export interface TabsItem {
10
10
  icon?: ReactNode;
11
11
  /** How many things are behind this tab. Drawn as a Count beside the label. */
12
12
  count?: number | null;
13
+ /**
14
+ * What needs the reader behind this tab, drawn after the label: problems
15
+ * as a danger count, a warning or an unsaved change as a 6px dot. It
16
+ * replaces the count while it is set. `label` is what a screen reader hears.
17
+ */
18
+ marker?: TabsMarker | undefined;
13
19
  disabled?: boolean;
14
20
  /** Any extra props the consumer's renderItem needs to read. */
15
21
  [key: string]: unknown;
16
22
  }
23
+ /**
24
+ * A tab's marker. ONE PER TAB, the most urgent: a problem, then a warning,
25
+ * then a change, so a row of tabs reads as "where is something wrong" first.
26
+ */
27
+ export type TabsMarker = {
28
+ tone: 'danger';
29
+ count: number;
30
+ label: string;
31
+ } | {
32
+ tone: 'warning' | 'changed';
33
+ label: string;
34
+ };
17
35
  export interface TabsRenderItemProps {
18
36
  item: TabsItem;
19
37
  /**
@@ -1,3 +1,3 @@
1
1
  import './Tabs.css';
2
2
  export { TabPanel, Tabs, tabId } from './Tabs.js';
3
- export type { TabPanelProps, TabsItem, TabsProps, TabsRenderItemProps, TabsSize, TabsVariant, } from './Tabs.js';
3
+ export type { TabPanelProps, TabsItem, TabsMarker, TabsProps, TabsRenderItemProps, TabsSize, TabsVariant, } from './Tabs.js';
@@ -1,4 +1,4 @@
1
- export { TabPanel, Tabs, tabId } from '../chunk-HEOVQZL7.js';
1
+ export { TabPanel, Tabs, tabId } from '../chunk-JHQUT4WJ.js';
2
2
  import '../chunk-CBOICT64.js';
3
3
  import '../chunk-BHHIIK3M.js';
4
4
  import '../chunk-BZFWDIV6.js';