@crewlethq/ui 0.9.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 (96) hide show
  1. package/README.md +32 -1
  2. package/dist/Accordion/index.js +3 -3
  3. package/dist/AppShell/index.js +2 -2
  4. package/dist/Avatar/Avatar.d.ts +45 -14
  5. package/dist/Avatar/AvatarStack.d.ts +1 -3
  6. package/dist/Avatar/index.d.ts +2 -2
  7. package/dist/Avatar/index.js +2 -2
  8. package/dist/{Avatar-JAU77SHZ.css → Avatar-QHYOFID3.css} +83 -25
  9. package/dist/AvatarPicker/AvatarPicker.d.ts +32 -0
  10. package/dist/AvatarPicker/index.d.ts +3 -0
  11. package/dist/AvatarPicker/index.js +14 -0
  12. package/dist/AvatarPicker-PREY36MG.css +54 -0
  13. package/dist/Canvas/index.js +3 -3
  14. package/dist/Card/index.js +2 -2
  15. package/dist/CharacterPicker/index.js +3 -2
  16. package/dist/CodeBlock/index.js +3 -3
  17. package/dist/Combobox/index.js +3 -3
  18. package/dist/CommandPalette/index.js +6 -6
  19. package/dist/Copyable/index.js +2 -2
  20. package/dist/DataTable/index.js +6 -6
  21. package/dist/DataView/index.js +11 -11
  22. package/dist/DateTimePicker/index.js +4 -4
  23. package/dist/Disclosure/index.js +3 -3
  24. package/dist/EntityChip/index.js +3 -3
  25. package/dist/FactList/FactList.d.ts +33 -0
  26. package/dist/FactList/index.d.ts +3 -0
  27. package/dist/FactList/index.js +6 -0
  28. package/dist/FactList-G2H73NFR.css +57 -0
  29. package/dist/HuePicker/index.js +4 -3
  30. package/dist/ImageUpload/index.js +3 -3
  31. package/dist/Input/FormField.d.ts +8 -1
  32. package/dist/Input/index.js +1 -1
  33. package/dist/{Input-DRFNI26F.css → Input-RAKNQJCV.css} +7 -0
  34. package/dist/ListInput/ListInput.d.ts +3 -1
  35. package/dist/ListInput/index.js +3 -3
  36. package/dist/Menu/index.js +3 -3
  37. package/dist/Modal/index.js +3 -3
  38. package/dist/OrgLabel/index.js +3 -3
  39. package/dist/OrgNode/index.js +4 -4
  40. package/dist/OrgTable/index.js +6 -6
  41. package/dist/SegmentedControl/index.js +3 -3
  42. package/dist/Tabs/Tabs.d.ts +18 -0
  43. package/dist/Tabs/index.d.ts +1 -1
  44. package/dist/Tabs/index.js +1 -1
  45. package/dist/{Tabs-BWFQSWY3.css → Tabs-5I5Q5KKM.css} +33 -0
  46. package/dist/TagsInput/index.js +2 -2
  47. package/dist/ThemeSwitcher/index.js +4 -4
  48. package/dist/TimeWindowPicker/index.js +5 -5
  49. package/dist/TreeCanvas/index.js +4 -4
  50. package/dist/TreeGrid/index.js +2 -2
  51. package/dist/chunk-3L5NHASN.js +1 -0
  52. package/dist/{chunk-OAH4IEQJ.js → chunk-3UK4VFSK.js} +2 -3
  53. package/dist/{chunk-L7THQMFB.js → chunk-5WEVLIB6.js} +1 -1
  54. package/dist/{chunk-J3IS2TOA.js → chunk-6OF2DBKY.js} +1 -1
  55. package/dist/{chunk-IGWPZZIB.js → chunk-6SDGRKQ7.js} +2 -2
  56. package/dist/{chunk-EUT7VBQG.js → chunk-CIOKUMVC.js} +6 -6
  57. package/dist/{chunk-Y2V3TSQC.js → chunk-DDTDN5L2.js} +1 -1
  58. package/dist/{chunk-LPHHDCN3.js → chunk-EBBAAQDY.js} +1 -1
  59. package/dist/{chunk-UYK72NOS.js → chunk-ELZKOVEC.js} +1 -1
  60. package/dist/chunk-EXHQ2QVW.js +1 -0
  61. package/dist/{chunk-ZGX2DP7F.js → chunk-FTEJPHBI.js} +8 -2
  62. package/dist/{chunk-RIAZM6L3.js → chunk-G2AVKPSL.js} +1 -1
  63. package/dist/chunk-HI6Q2UXQ.js +169 -0
  64. package/dist/{chunk-IZHN5I3H.js → chunk-HLBRPES3.js} +4 -4
  65. package/dist/chunk-HV6IZFBK.js +64 -0
  66. package/dist/{chunk-K7OS4O2U.js → chunk-IHGKPEEV.js} +1 -1
  67. package/dist/{chunk-HEOVQZL7.js → chunk-JHQUT4WJ.js} +6 -2
  68. package/dist/{chunk-26TXVHN2.js → chunk-K5Q2DK3P.js} +1 -2
  69. package/dist/{chunk-MORLKUGM.js → chunk-KGTQ5CVD.js} +1 -1
  70. package/dist/{chunk-E3HDS4F7.js → chunk-LAQK4V3Z.js} +1 -1
  71. package/dist/{chunk-6HXH57BL.js → chunk-LZP7FGT7.js} +4 -2
  72. package/dist/{chunk-CVB7O3SZ.js → chunk-R4ZJB5YX.js} +4 -4
  73. package/dist/{chunk-MICH6QSJ.js → chunk-S4RCG44T.js} +1 -1
  74. package/dist/{chunk-UI6HWAWE.js → chunk-UAQIUSSK.js} +1 -1
  75. package/dist/chunk-URYDN2KA.js +25 -0
  76. package/dist/{chunk-X6K6OZ47.js → chunk-WEIINZPA.js} +1 -1
  77. package/dist/{chunk-IKH3Y4MP.js → chunk-YXMCUKFI.js} +1 -2
  78. package/dist/{chunk-JB6AN4ZC.js → chunk-ZMJHK7DR.js} +2 -2
  79. package/dist/generated/index.d.ts +2 -0
  80. package/dist/generated/index.js +58 -54
  81. package/dist/index.js +58 -54
  82. package/dist/styles.css +245 -30
  83. package/dist/utils/index.js +1 -1
  84. package/package.json +3 -3
  85. package/dist/chunk-UDW3DAP5.js +0 -125
  86. package/dist/{chunk-VE6LD3KM.js → chunk-2PZBIHRV.js} +2 -2
  87. package/dist/{chunk-MPXI6FM6.js → chunk-7JGWSOLM.js} +1 -1
  88. package/dist/{chunk-OVLJEVQS.js → chunk-7LD6P32I.js} +1 -1
  89. package/dist/{chunk-CEOXFO3E.js → chunk-EG6NYWVK.js} +1 -1
  90. package/dist/{chunk-FZVJDJFN.js → chunk-ENJUPIND.js} +1 -1
  91. package/dist/{chunk-5I56UXBJ.js → chunk-JCNUQ3US.js} +2 -2
  92. package/dist/{chunk-SX2DFTQV.js → chunk-MCPKHYMC.js} +1 -1
  93. package/dist/{chunk-YPTC4TX5.js → chunk-PQLMLG5K.js} +0 -0
  94. package/dist/{chunk-BTHX2FS3.js → chunk-TEEJSTFG.js} +2 -2
  95. package/dist/{chunk-LSB3EHBW.js → chunk-TFH6SYWB.js} +2 -2
  96. package/dist/{chunk-26SCUACK.js → chunk-YACKC3K2.js} +1 -1
@@ -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';
@@ -1,4 +1,4 @@
1
- export { ImageUpload } from '../chunk-E3HDS4F7.js';
2
- import '../chunk-OAH4IEQJ.js';
3
- import '../chunk-UDW3DAP5.js';
1
+ export { ImageUpload } from '../chunk-LAQK4V3Z.js';
2
+ import '../chunk-3UK4VFSK.js';
3
+ import '../chunk-HI6Q2UXQ.js';
4
4
  import '../chunk-ODEQTPFM.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,4 +1,4 @@
1
- export { OrgLabel } from '../chunk-J3IS2TOA.js';
2
- import '../chunk-OAH4IEQJ.js';
3
- import '../chunk-UDW3DAP5.js';
1
+ export { OrgLabel } from '../chunk-6OF2DBKY.js';
2
+ import '../chunk-3UK4VFSK.js';
3
+ import '../chunk-HI6Q2UXQ.js';
4
4
  import '../chunk-ODEQTPFM.js';
@@ -1,5 +1,5 @@
1
- export { OrgNodeDisclosure, OrgNodeLabel, OrgNodeLead } from '../chunk-K7OS4O2U.js';
2
- import '../chunk-J3IS2TOA.js';
3
- import '../chunk-OAH4IEQJ.js';
4
- import '../chunk-UDW3DAP5.js';
1
+ export { OrgNodeDisclosure, OrgNodeLabel, OrgNodeLead } from '../chunk-IHGKPEEV.js';
2
+ import '../chunk-6OF2DBKY.js';
3
+ import '../chunk-3UK4VFSK.js';
4
+ import '../chunk-HI6Q2UXQ.js';
5
5
  import '../chunk-ODEQTPFM.js';
@@ -1,13 +1,13 @@
1
- export { OrgTable, OrgTableActions, OrgTableAdd, OrgTableName } from '../chunk-JB6AN4ZC.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
- import '../chunk-J3IS2TOA.js';
4
+ import '../chunk-6OF2DBKY.js';
5
5
  import '../chunk-53DVJCVW.js';
6
6
  import '../chunk-74WGARJE.js';
7
+ import '../chunk-4FQT6ZAY.js';
8
+ import '../chunk-3UK4VFSK.js';
7
9
  import '../chunk-7RPGY3JE.js';
8
10
  import '../chunk-R25RGPUB.js';
9
- import '../chunk-4FQT6ZAY.js';
10
- import '../chunk-OAH4IEQJ.js';
11
- import '../chunk-UDW3DAP5.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';
@@ -337,3 +337,36 @@
337
337
  transition: none;
338
338
  }
339
339
  }
340
+
341
+ /* ── markers ──────────────────────────────────────────────────────────────
342
+ What needs the reader behind a tab: a danger count for problems, a 6px
343
+ dot for a warning or an unsaved change. One per tab, the most urgent. */
344
+ .crewlet-tabs__marker {
345
+ display: inline-flex;
346
+ align-items: center;
347
+ justify-content: center;
348
+ flex: none;
349
+ }
350
+ .crewlet-tabs__marker--danger {
351
+ min-width: 16px;
352
+ height: 16px;
353
+ padding: 0 var(--spacing-1);
354
+ border-radius: var(--radius-circle);
355
+ background: var(--color-feedback-danger-soft);
356
+ color: var(--color-feedback-danger-ink);
357
+ font-family: var(--font-family-mono);
358
+ font-size: var(--font-size-2xs);
359
+ line-height: 1;
360
+ }
361
+ .crewlet-tabs__marker--warning,
362
+ .crewlet-tabs__marker--changed {
363
+ width: 6px;
364
+ height: 6px;
365
+ border-radius: var(--radius-circle);
366
+ }
367
+ .crewlet-tabs__marker--warning {
368
+ background: var(--color-feedback-warning);
369
+ }
370
+ .crewlet-tabs__marker--changed {
371
+ background: var(--color-brand-accent);
372
+ }
@@ -1,10 +1,10 @@
1
- export { TagsInput } from '../chunk-MPXI6FM6.js';
1
+ export { TagsInput } from '../chunk-7JGWSOLM.js';
2
2
  import '../chunk-LOECRMHA.js';
3
3
  import '../chunk-WIATRXEJ.js';
4
4
  import '../chunk-6MU7HNB4.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,8 +1,8 @@
1
- export { DensitySwitcher, ThemeSwitcher } from '../chunk-X6K6OZ47.js';
1
+ export { DensitySwitcher, ThemeSwitcher } from '../chunk-WEIINZPA.js';
2
2
  export { applyDensity, applyStoredPreferences, applyTheme, resolveTheme, useDensityPreference, useSystemTheme, useThemePreference } from '../chunk-K3OWD7BJ.js';
3
- import '../chunk-UI6HWAWE.js';
4
- import '../chunk-LPHHDCN3.js';
5
- import '../chunk-HEOVQZL7.js';
3
+ import '../chunk-UAQIUSSK.js';
4
+ import '../chunk-EBBAAQDY.js';
5
+ import '../chunk-JHQUT4WJ.js';
6
6
  import '../chunk-CBOICT64.js';
7
7
  import '../chunk-BHHIIK3M.js';
8
8
  import '../chunk-BZFWDIV6.js';
@@ -1,13 +1,13 @@
1
- export { DEFAULT_TIME_WINDOW_LABELS, TIME_WINDOW_SPANS, TimeWindowPicker, describeTimeWindow, isTimeWindowSet, parseTimeWindowDuration, resolveTimeWindow, timeWindowMatchesPreset } from '../chunk-IZHN5I3H.js';
1
+ export { DEFAULT_TIME_WINDOW_LABELS, TIME_WINDOW_SPANS, TimeWindowPicker, describeTimeWindow, isTimeWindowSet, parseTimeWindowDuration, resolveTimeWindow, timeWindowMatchesPreset } from '../chunk-HLBRPES3.js';
2
2
  import '../chunk-SEFMO2EV.js';
3
+ import '../chunk-FTEJPHBI.js';
3
4
  import '../chunk-6MU7HNB4.js';
4
- import '../chunk-ZGX2DP7F.js';
5
- import '../chunk-PDUZO35I.js';
6
5
  import '../chunk-GXQ3B46I.js';
6
+ import '../chunk-OG6CL3EB.js';
7
7
  import '../chunk-PQADV6P6.js';
8
+ import '../chunk-4FQT6ZAY.js';
9
+ import '../chunk-PDUZO35I.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,10 +1,10 @@
1
- export { TreeCanvas } from '../chunk-L7THQMFB.js';
1
+ export { TreeCanvas } from '../chunk-5WEVLIB6.js';
2
2
  import '../chunk-S3BCVWTU.js';
3
- import '../chunk-VE6LD3KM.js';
3
+ import '../chunk-2PZBIHRV.js';
4
4
  import '../chunk-53DVJCVW.js';
5
+ import '../chunk-OG6CL3EB.js';
6
+ import '../chunk-4FQT6ZAY.js';
5
7
  import '../chunk-7RPGY3JE.js';
6
8
  import '../chunk-R25RGPUB.js';
7
- import '../chunk-4FQT6ZAY.js';
8
- import '../chunk-OG6CL3EB.js';
9
9
  import '../chunk-BZFWDIV6.js';
10
10
  import '../chunk-ODEQTPFM.js';
@@ -1,8 +1,8 @@
1
- export { TreeGrid } from '../chunk-SX2DFTQV.js';
1
+ export { TreeGrid } from '../chunk-MCPKHYMC.js';
2
2
  import '../chunk-S3BCVWTU.js';
3
3
  import '../chunk-53DVJCVW.js';
4
+ import '../chunk-4FQT6ZAY.js';
4
5
  import '../chunk-7RPGY3JE.js';
5
6
  import '../chunk-R25RGPUB.js';
6
- import '../chunk-4FQT6ZAY.js';
7
7
  import '../chunk-BZFWDIV6.js';
8
8
  import '../chunk-ODEQTPFM.js';
@@ -0,0 +1 @@
1
+ import './CharacterPicker-ZEYIKUNQ.css';
@@ -1,6 +1,6 @@
1
- import { AVATAR_SIZES, Avatar } from './chunk-UDW3DAP5.js';
1
+ import { AVATAR_SIZES, Avatar } from './chunk-HI6Q2UXQ.js';
2
2
  import { cx } from './chunk-ODEQTPFM.js';
3
- import './Avatar-JAU77SHZ.css';
3
+ import './Avatar-QHYOFID3.css';
4
4
  import './AvatarStack-GEJBNV7E.css';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
6
6
 
@@ -48,7 +48,6 @@ function AvatarStack({
48
48
  name: member.name,
49
49
  kind: member.kind,
50
50
  src: member.src,
51
- ring: member.ring,
52
51
  character: member.character,
53
52
  hue: member.hue,
54
53
  size,
@@ -1,5 +1,5 @@
1
1
  import { useTreeState, useMeasuredSizes, layoutForest, treeAncestors, useLayoutAnchor, treeExpandable, layoutConnectors, treeItemAction, treeStep, treePosInSet, treeSetSize, treeLevel, placeGroups } from './chunk-S3BCVWTU.js';
2
- import { CANVAS_COMPOSE_CONTEXT, CANVAS_FIT_MAX_ZOOM, Canvas } from './chunk-VE6LD3KM.js';
2
+ import { CANVAS_COMPOSE_CONTEXT, CANVAS_FIT_MAX_ZOOM, Canvas } from './chunk-2PZBIHRV.js';
3
3
  import { focusables } from './chunk-R25RGPUB.js';
4
4
  import { cx } from './chunk-ODEQTPFM.js';
5
5
  import './TreeCanvas-L2XYONWL.css';
@@ -1,4 +1,4 @@
1
- import { Avatar } from './chunk-UDW3DAP5.js';
1
+ import { Avatar } from './chunk-HI6Q2UXQ.js';
2
2
  import { cx } from './chunk-ODEQTPFM.js';
3
3
  import './OrgLabel-6WSKJQOT.css';
4
4
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -1,7 +1,7 @@
1
1
  import { Kbd } from './chunk-SMBKXWML.js';
2
+ import { Input } from './chunk-FTEJPHBI.js';
2
3
  import { useListbox } from './chunk-6MU7HNB4.js';
3
- import { Input } from './chunk-ZGX2DP7F.js';
4
- import { Modal } from './chunk-BTHX2FS3.js';
4
+ import { Modal } from './chunk-TEEJSTFG.js';
5
5
  import { Count } from './chunk-BHHIIK3M.js';
6
6
  import { isComposing } from './chunk-R25RGPUB.js';
7
7
  import { VisuallyHidden } from './chunk-BZFWDIV6.js';
@@ -1,16 +1,16 @@
1
1
  import { Toolbar } from './chunk-PGRPNDWM.js';
2
2
  import { RelativeTime } from './chunk-3CZ7XAVY.js';
3
3
  import { PageHeader } from './chunk-HOXGBLEY.js';
4
+ import { DateTimePicker } from './chunk-JCNUQ3US.js';
4
5
  import { Kbd } from './chunk-SMBKXWML.js';
6
+ import { Input } from './chunk-FTEJPHBI.js';
5
7
  import { useListbox, useOptionKeys } from './chunk-6MU7HNB4.js';
6
- import { Input } from './chunk-ZGX2DP7F.js';
7
- import { DataTable } from './chunk-CVB7O3SZ.js';
8
- import { Menu } from './chunk-LSB3EHBW.js';
9
- import { DateTimePicker } from './chunk-5I56UXBJ.js';
8
+ import { DataTable } from './chunk-R4ZJB5YX.js';
9
+ import { Menu } from './chunk-TFH6SYWB.js';
10
+ import { Button } from './chunk-OG6CL3EB.js';
11
+ import { IconButton } from './chunk-4FQT6ZAY.js';
10
12
  import { Popover } from './chunk-PDUZO35I.js';
11
13
  import { Count } from './chunk-BHHIIK3M.js';
12
- import { IconButton } from './chunk-4FQT6ZAY.js';
13
- import { Button } from './chunk-OG6CL3EB.js';
14
14
  import { VisuallyHidden } from './chunk-BZFWDIV6.js';
15
15
  import { cx } from './chunk-ODEQTPFM.js';
16
16
  import './DataView-N6JX464S.css';
@@ -1,4 +1,4 @@
1
- import { Avatar } from './chunk-UDW3DAP5.js';
1
+ import { Avatar } from './chunk-HI6Q2UXQ.js';
2
2
  import { cx } from './chunk-ODEQTPFM.js';
3
3
  import './EntityChip-LUCPZBBG.css';
4
4
  import { Children, isValidElement, cloneElement } from 'react';
@@ -1,4 +1,4 @@
1
- import { tabId } from './chunk-HEOVQZL7.js';
1
+ import { tabId } from './chunk-JHQUT4WJ.js';
2
2
  import { useRoving, tabStop } from './chunk-CBOICT64.js';
3
3
  import { Count } from './chunk-BHHIIK3M.js';
4
4
  import { VisuallyHidden } from './chunk-BZFWDIV6.js';
@@ -1,5 +1,5 @@
1
+ import { Input } from './chunk-FTEJPHBI.js';
1
2
  import { useListbox } from './chunk-6MU7HNB4.js';
2
- import { Input } from './chunk-ZGX2DP7F.js';
3
3
  import { cx } from './chunk-ODEQTPFM.js';
4
4
  import './Combobox-4FUVYIE7.css';
5
5
  import { forwardRef, useId, useMemo, useRef, useCallback } from 'react';
@@ -0,0 +1 @@
1
+ import './HuePicker-5QIUR6L7.css';
@@ -2,7 +2,7 @@ import { useHeadingLevel, headingTag, HeadingLevelProvider, nextHeadingLevel } f
2
2
  import { IconButton } from './chunk-4FQT6ZAY.js';
3
3
  import { VisuallyHidden } from './chunk-BZFWDIV6.js';
4
4
  import { cx } from './chunk-ODEQTPFM.js';
5
- import './Input-DRFNI26F.css';
5
+ import './Input-RAKNQJCV.css';
6
6
  import { forwardRef, useRef, useState, useImperativeHandle, useEffect, useId } from 'react';
7
7
  import { XGlyph } from '@crewlethq/icons/glyphs';
8
8
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
@@ -162,6 +162,7 @@ var FormField = ({
162
162
  optional,
163
163
  requiredNews,
164
164
  helper,
165
+ helperOnFocus = false,
165
166
  error,
166
167
  labelAction,
167
168
  as = "div",
@@ -188,7 +189,12 @@ var FormField = ({
188
189
  helper ? /* @__PURE__ */ jsx("div", { id: helperId, className: "crewlet-form-field__helper", children: helper }) : null,
189
190
  error ? /* @__PURE__ */ jsx("div", { id: errorId, className: "crewlet-form-field__error", role: "alert", children: error }) : null
190
191
  ] });
191
- const classes = cx("crewlet-form-field", Boolean(error) && "is-error", className);
192
+ const classes = cx(
193
+ "crewlet-form-field",
194
+ Boolean(error) && "is-error",
195
+ helperOnFocus && helper ? "crewlet-form-field--helper-on-focus" : null,
196
+ className
197
+ );
192
198
  if (as === "fieldset") {
193
199
  return (
194
200
  /*
@@ -1,4 +1,4 @@
1
- import { DisclosureAnatomy } from './chunk-FZVJDJFN.js';
1
+ import { DisclosureAnatomy } from './chunk-ENJUPIND.js';
2
2
  import { useHeadingLevel } from './chunk-PQADV6P6.js';
3
3
  import { cx } from './chunk-ODEQTPFM.js';
4
4
  import './Disclosure-VKBJJIZ7.css';