@crewlethq/ui 0.77.0 → 0.78.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 (84) hide show
  1. package/README.md +10 -0
  2. package/dist/AgentHandoffPanel/index.js +1 -1
  3. package/dist/AppShell/index.js +1 -1
  4. package/dist/ArtifactBar/index.js +5 -5
  5. package/dist/ArtifactCard/index.js +4 -4
  6. package/dist/AvatarPicker/index.js +5 -5
  7. package/dist/Canvas/index.js +1 -1
  8. package/dist/CanvasBoard/index.js +1 -1
  9. package/dist/CanvasToolbar/index.js +1 -1
  10. package/dist/CommandPalette/index.js +1 -1
  11. package/dist/CommentThread/index.js +1 -1
  12. package/dist/ContrastBadge/index.js +2 -2
  13. package/dist/ContrastHelp/index.js +3 -3
  14. package/dist/DataTable/index.js +1 -1
  15. package/dist/DataView/index.js +1 -1
  16. package/dist/DateTimePicker/index.js +1 -1
  17. package/dist/DescriptionList/DescriptionList.d.ts +8 -1
  18. package/dist/DescriptionList/index.js +1 -1
  19. package/dist/{DescriptionList-DEZISDLQ.css → DescriptionList-VF7NIBXA.css} +6 -0
  20. package/dist/DocTabsEditor/index.js +1 -1
  21. package/dist/FollowBanner/index.js +1 -1
  22. package/dist/HuePicker/index.js +4 -4
  23. package/dist/InlineEditor/index.js +1 -1
  24. package/dist/LinkInterstitial/index.js +1 -1
  25. package/dist/ListInput/index.js +1 -1
  26. package/dist/LogoSlot/index.js +3 -3
  27. package/dist/MarkdownEditor/index.js +5 -5
  28. package/dist/Menu/index.js +1 -1
  29. package/dist/MergeConflicts/index.js +5 -5
  30. package/dist/Modal/index.js +1 -1
  31. package/dist/ObjectHeader/index.js +1 -1
  32. package/dist/{ObjectHeader-7BGA56VQ.css → ObjectHeader-VKQSEJDN.css} +3 -2
  33. package/dist/PeekRail/index.js +1 -1
  34. package/dist/PresenterView/index.js +1 -1
  35. package/dist/PropertyList/index.js +3 -3
  36. package/dist/RichEditor/index.js +1 -1
  37. package/dist/SegmentedControl/index.js +4 -4
  38. package/dist/SelectionBar/index.js +1 -1
  39. package/dist/SetupWizard/index.js +2 -2
  40. package/dist/ShareDialog/index.js +1 -1
  41. package/dist/SheetColumnEditor/index.js +5 -5
  42. package/dist/SheetGrid/index.js +3 -3
  43. package/dist/SlideCompare/index.js +1 -1
  44. package/dist/SlideFilmstrip/index.js +1 -1
  45. package/dist/Switcher/index.js +1 -1
  46. package/dist/Tabs/Tabs.d.ts +20 -2
  47. package/dist/Tabs/fold.d.ts +3 -1
  48. package/dist/Tabs/index.js +2 -2
  49. package/dist/{Tabs-7ZK2UF75.css → Tabs-M2ELSU3V.css} +68 -0
  50. package/dist/ThemeSwitcher/index.js +5 -5
  51. package/dist/TileGrid/index.js +1 -1
  52. package/dist/{TileGrid-UYMVVVJK.css → TileGrid-XOEJ4P52.css} +3 -1
  53. package/dist/TimeRangePicker/index.js +5 -5
  54. package/dist/TimeWindowPicker/index.js +1 -1
  55. package/dist/TreeCanvas/index.js +1 -1
  56. package/dist/VersionCompare/index.js +5 -5
  57. package/dist/{chunk-25AZQ3GZ.js → chunk-36WK24AI.js} +1 -1
  58. package/dist/{chunk-HQOEAUDJ.js → chunk-4O5XNGDC.js} +1 -1
  59. package/dist/{chunk-S7WG53JB.js → chunk-AXEXOAZQ.js} +1 -1
  60. package/dist/{chunk-KXYZ5XS2.js → chunk-JIBZ5SF5.js} +1 -1
  61. package/dist/{chunk-ELNUZDFK.js → chunk-KP5DDOMF.js} +1 -1
  62. package/dist/{chunk-YLYIVN72.js → chunk-L5PK2MXF.js} +1 -1
  63. package/dist/{chunk-4HO3NX3B.js → chunk-LE6K34SN.js} +1 -1
  64. package/dist/{chunk-MFS6F2P7.js → chunk-LH4OF7FI.js} +3 -1
  65. package/dist/{chunk-KQQWGWCC.js → chunk-LPN3RHMA.js} +41 -18
  66. package/dist/{chunk-OWHETZIU.js → chunk-LWKMJMVC.js} +1 -1
  67. package/dist/{chunk-HIWPPWNY.js → chunk-OPVTNHPH.js} +2 -2
  68. package/dist/{chunk-A5HENOP2.js → chunk-PP5E3FGY.js} +1 -1
  69. package/dist/{chunk-WOTGQVHZ.js → chunk-PQDQTK64.js} +1 -1
  70. package/dist/{chunk-2LIGIIE2.js → chunk-QEVYTXCY.js} +1 -1
  71. package/dist/{chunk-VJ6SSEMG.js → chunk-SZ75VYRX.js} +1 -1
  72. package/dist/{chunk-UEEWK7SO.js → chunk-TNU6U7C5.js} +2 -2
  73. package/dist/{chunk-Q6CQMS6R.js → chunk-UFID3DSP.js} +1 -1
  74. package/dist/{chunk-SOERZJVJ.js → chunk-UQHTHOSZ.js} +1 -1
  75. package/dist/{chunk-P34YWECQ.js → chunk-Y7OXW5SB.js} +1 -1
  76. package/dist/generated/index.js +65 -65
  77. package/dist/index.js +65 -65
  78. package/dist/styles.css +84 -7
  79. package/package.json +3 -3
  80. package/dist/{Editor-MPNGVAWD.js → Editor-QO2GRTMK.js} +1 -1
  81. package/dist/{chunk-PD2GOJ5V.js → chunk-5EFLA6BW.js} +1 -1
  82. package/dist/{chunk-HYGCGN37.js → chunk-5N3MF7O2.js} +1 -1
  83. package/dist/{chunk-XL2RXAPT.js → chunk-HZHFXKVP.js} +2 -2
  84. package/dist/{chunk-7PJFUQMY.js → chunk-MGWFVAPN.js} +1 -1
@@ -10,8 +10,8 @@ import '../chunk-PQADV6P6.js';
10
10
  import '../chunk-2G355KDJ.js';
11
11
  import '../chunk-RTPQDNW3.js';
12
12
  import '../chunk-DGXZ635L.js';
13
- import '../chunk-OMV5W53A.js';
14
13
  import '../chunk-XSPCITPN.js';
14
+ import '../chunk-OMV5W53A.js';
15
15
  import '../chunk-H5XTJ7GJ.js';
16
16
  import '../chunk-NUZHC6MM.js';
17
17
  import '../chunk-UAUP6XGK.js';
@@ -96,7 +96,10 @@ export interface TabsProps {
96
96
  size?: TabsSize;
97
97
  /** Names the row. A tab row with no name is announced as "tab list" alone. */
98
98
  ariaLabel?: string;
99
- /** On the row's root: the row, or with overflow `menu` on a tab list, the box holding the row and "More". */
99
+ /**
100
+ * On the outermost element: the row; with overflow `menu` on a tab list, the
101
+ * box holding the row and "More"; with `actions`, the bar holding both.
102
+ */
100
103
  className?: string;
101
104
  /** Currently active item value. */
102
105
  value?: string;
@@ -122,6 +125,21 @@ export interface TabsProps {
122
125
  * without `renderItem` ignores it.
123
126
  */
124
127
  trailing?: ReactNode;
128
+ /**
129
+ * Controls at the row's far end that act on the screen the tabs belong to,
130
+ * such as "Check now" or "New", in EITHER MODE.
131
+ *
132
+ * BESIDE THE ROW, NEVER IN IT. A tab list holds tabs alone, so the actions
133
+ * are the row's next sibling in one bar, and a screen reader meets the tab
134
+ * list and then the buttons, as the keyboard does: one stop for the tabs,
135
+ * then each action. In router mode they stand outside the navigation
136
+ * landmark for the same reason: an action is not a place.
137
+ *
138
+ * THE TABS GIVE WAY FIRST. The actions keep their own width at every size;
139
+ * the row takes what is left, and scrolls or folds into "More" inside it,
140
+ * so its slider and its fold are measured in that room.
141
+ */
142
+ actions?: ReactNode;
125
143
  /**
126
144
  * What the row does with tabs it has no room for. `scroll` (the default)
127
145
  * scrolls it. `menu` draws the tabs that FIT, in order, and folds the rest
@@ -174,7 +192,7 @@ export declare function tabId(panelId: string, value: string): string;
174
192
  * says. In router mode that IS what the items are, so the root becomes a
175
193
  * `nav`, the tab roles go, and the consumer's own link carries the state.
176
194
  */
177
- export declare function Tabs({ items, variant, size, ariaLabel, className, value, onValueChange, panelId, renderItem, trailing, overflow, moreLabel, moreMenuLabel, note, ref, }: TabsProps): React.JSX.Element;
195
+ export declare function Tabs({ items, variant, size, ariaLabel, className, value, onValueChange, panelId, renderItem, trailing, actions, overflow, moreLabel, moreMenuLabel, note, ref, }: TabsProps): React.JSX.Element;
178
196
  export interface TabPanelProps {
179
197
  /** The same id the row was given as `panelId`. */
180
198
  id: string;
@@ -51,4 +51,6 @@ export interface Fold {
51
51
  * of links, and two for a tab list, which holds tabs alone and leaves "More"
52
52
  * beside it, where the box's own gap and the row's chrome are counted too.
53
53
  */
54
- export declare function useFold(enabled: boolean, box: RefObject<HTMLElement | null>, row: RefObject<HTMLElement | null>, values: readonly string[], current: string | undefined): Fold;
54
+ export declare function useFold(enabled: boolean, box: RefObject<HTMLElement | null>, row: RefObject<HTMLElement | null>, values: readonly string[], current: string | undefined,
55
+ /** Anything else that moves the room the row has, such as actions arriving beside it. */
56
+ layout?: unknown): Fold;
@@ -1,12 +1,12 @@
1
- export { TabPanel, Tabs, tabId } from '../chunk-KQQWGWCC.js';
1
+ export { TabPanel, Tabs, tabId } from '../chunk-LPN3RHMA.js';
2
2
  import '../chunk-EGMQURBR.js';
3
3
  import '../chunk-CYQBDZ6M.js';
4
4
  import '../chunk-MLDTLZAO.js';
5
5
  import '../chunk-KNAHKQD4.js';
6
6
  import '../chunk-DGXZ635L.js';
7
+ import '../chunk-XSPCITPN.js';
7
8
  import '../chunk-OMV5W53A.js';
8
9
  import '../chunk-2YTOOH3A.js';
9
- import '../chunk-XSPCITPN.js';
10
10
  import '../chunk-H5XTJ7GJ.js';
11
11
  import '../chunk-NUZHC6MM.js';
12
12
  import '../chunk-UAUP6XGK.js';
@@ -478,6 +478,74 @@
478
478
  box-shadow: inset 0 -1px 0 var(--color-border-default);
479
479
  }
480
480
 
481
+ /*
482
+ * THE BAR: a row and its actions. The row (or the box holding the row and
483
+ * "More") takes the room the actions leave and gives way first: it shrinks
484
+ * before an action does, scrolling or folding its tabs inside that room. An
485
+ * underline row fills the bar, so its rule and its fold are measured in the
486
+ * space the actions leave; a pill or chip row keeps its own width while it
487
+ * fits and scrolls once it does not, so a tab never paints under an action.
488
+ */
489
+ .crewlet-tabs-host {
490
+ display: contents;
491
+ }
492
+
493
+ .crewlet-tabs-bar {
494
+ display: flex;
495
+ align-items: center;
496
+ gap: var(--spacing-3);
497
+ min-width: 0;
498
+ }
499
+
500
+ .crewlet-tabs-bar > .crewlet-tabs {
501
+ flex: 0 1 auto;
502
+ min-width: 0;
503
+ }
504
+
505
+ .crewlet-tabs-bar > .crewlet-tabs--underline,
506
+ .crewlet-tabs-bar > .crewlet-tabs-fold {
507
+ flex: 1 1 auto;
508
+ min-width: 0;
509
+ }
510
+
511
+ /* The scroll contract an underline row has on its own, for a pill or chip
512
+ row that must shrink beside its actions. Its ring is drawn inside the tab,
513
+ as the underline's is, because the scroller clips an outset one. */
514
+ .crewlet-tabs-bar > .crewlet-tabs--pill,
515
+ .crewlet-tabs-bar > .crewlet-tabs--chip {
516
+ overflow-x: auto;
517
+ scrollbar-width: none;
518
+ }
519
+
520
+ .crewlet-tabs-bar > .crewlet-tabs--pill::-webkit-scrollbar,
521
+ .crewlet-tabs-bar > .crewlet-tabs--chip::-webkit-scrollbar {
522
+ display: none;
523
+ }
524
+
525
+ .crewlet-tabs-bar > .crewlet-tabs--pill .crewlet-tabs__tab:focus-visible,
526
+ .crewlet-tabs-bar > .crewlet-tabs--chip .crewlet-tabs__tab:focus-visible {
527
+ outline-offset: var(--size-focus-ring-inset-offset);
528
+ }
529
+
530
+ .crewlet-tabs__actions {
531
+ display: inline-flex;
532
+ flex: none;
533
+ align-items: center;
534
+ gap: var(--spacing-2);
535
+ margin-inline-start: auto;
536
+ }
537
+
538
+ /* The underline's rule runs on under the actions to the bar's edge, painted
539
+ on the same last pixel row the row's own border sits on. */
540
+ .crewlet-tabs-bar--underline {
541
+ align-items: stretch;
542
+ box-shadow: inset 0 -1px 0 var(--color-border-default);
543
+ }
544
+
545
+ .crewlet-tabs-bar--underline > .crewlet-tabs__actions {
546
+ align-self: center;
547
+ }
548
+
481
549
  /*
482
550
  * The slider ARRIVES rather than travels, and a chip changes without a fade.
483
551
  * The indicator still moves; what stops is the animation between the two
@@ -1,17 +1,17 @@
1
- export { DensitySwitcher, ThemeSwitcher } from '../chunk-YLYIVN72.js';
1
+ export { DensitySwitcher, ThemeSwitcher } from '../chunk-L5PK2MXF.js';
2
2
  export { applyStoredPreferences, resolveTheme, useDensityPreference, useSystemTheme, useThemePreference } from '../chunk-Z24ZUSTX.js';
3
3
  export { DENSITY_PREFERENCES, PALETTE_ID, THEME_PREFERENCES, applyDensity, applyPalette, applyTheme, isDensityPreference, isPaletteId, isThemePreference } from '../chunk-ZXXDZJQN.js';
4
- import '../chunk-25AZQ3GZ.js';
5
- import '../chunk-WOTGQVHZ.js';
6
- import '../chunk-KQQWGWCC.js';
4
+ import '../chunk-36WK24AI.js';
5
+ import '../chunk-PQDQTK64.js';
6
+ import '../chunk-LPN3RHMA.js';
7
7
  import '../chunk-EGMQURBR.js';
8
8
  import '../chunk-CYQBDZ6M.js';
9
9
  import '../chunk-MLDTLZAO.js';
10
10
  import '../chunk-KNAHKQD4.js';
11
11
  import '../chunk-DGXZ635L.js';
12
+ import '../chunk-XSPCITPN.js';
12
13
  import '../chunk-OMV5W53A.js';
13
14
  import '../chunk-2YTOOH3A.js';
14
- import '../chunk-XSPCITPN.js';
15
15
  import '../chunk-H5XTJ7GJ.js';
16
16
  import '../chunk-NUZHC6MM.js';
17
17
  import '../chunk-UAUP6XGK.js';
@@ -1,2 +1,2 @@
1
- export { TileGrid } from '../chunk-Q6CQMS6R.js';
1
+ export { TileGrid } from '../chunk-UFID3DSP.js';
2
2
  import '../chunk-ODEQTPFM.js';
@@ -46,7 +46,9 @@
46
46
  }
47
47
 
48
48
  @container crewlet-tile-grid (width < 28rem) {
49
- .crewlet-tile-grid > .crewlet-tile-grid__track {
49
+ /* As specific as the per-count rules above and after them, so a grid of two
50
+ or four folds to one here too, not only a grid of three. */
51
+ .crewlet-tile-grid[data-columns] > .crewlet-tile-grid__track {
50
52
  --crewlet-tile-grid-tracks: 1;
51
53
  }
52
54
  }
@@ -1,9 +1,9 @@
1
- export { TIME_RANGE_CUSTOM, TIME_RANGE_PICKER_LABELS, TimeRangePicker, timeRangeFieldKey, timeRangeProblem } from '../chunk-KXYZ5XS2.js';
1
+ export { TIME_RANGE_CUSTOM, TIME_RANGE_PICKER_LABELS, TimeRangePicker, timeRangeFieldKey, timeRangeProblem } from '../chunk-JIBZ5SF5.js';
2
2
  import '../chunk-C667GCU7.js';
3
3
  import '../chunk-BPCY7ZID.js';
4
- import '../chunk-25AZQ3GZ.js';
5
- import '../chunk-WOTGQVHZ.js';
6
- import '../chunk-KQQWGWCC.js';
4
+ import '../chunk-36WK24AI.js';
5
+ import '../chunk-PQDQTK64.js';
6
+ import '../chunk-LPN3RHMA.js';
7
7
  import '../chunk-EGMQURBR.js';
8
8
  import '../chunk-CYQBDZ6M.js';
9
9
  import '../chunk-6Q7RW2JJ.js';
@@ -13,9 +13,9 @@ import '../chunk-PQADV6P6.js';
13
13
  import '../chunk-2G355KDJ.js';
14
14
  import '../chunk-KNAHKQD4.js';
15
15
  import '../chunk-DGXZ635L.js';
16
+ import '../chunk-XSPCITPN.js';
16
17
  import '../chunk-OMV5W53A.js';
17
18
  import '../chunk-2YTOOH3A.js';
18
- import '../chunk-XSPCITPN.js';
19
19
  import '../chunk-H5XTJ7GJ.js';
20
20
  import '../chunk-NUZHC6MM.js';
21
21
  import '../chunk-UAUP6XGK.js';
@@ -8,9 +8,9 @@ import '../chunk-PGCLHYVP.js';
8
8
  import '../chunk-PQADV6P6.js';
9
9
  import '../chunk-2G355KDJ.js';
10
10
  import '../chunk-DGXZ635L.js';
11
+ import '../chunk-XSPCITPN.js';
11
12
  import '../chunk-OMV5W53A.js';
12
13
  import '../chunk-2YTOOH3A.js';
13
- import '../chunk-XSPCITPN.js';
14
14
  import '../chunk-H5XTJ7GJ.js';
15
15
  import '../chunk-NUZHC6MM.js';
16
16
  import '../chunk-UAUP6XGK.js';
@@ -5,8 +5,8 @@ import '../chunk-LM3ISVJA.js';
5
5
  import '../chunk-I33UIUZD.js';
6
6
  import '../chunk-ANTAQAR4.js';
7
7
  import '../chunk-DGXZ635L.js';
8
- import '../chunk-OMV5W53A.js';
9
8
  import '../chunk-XSPCITPN.js';
9
+ import '../chunk-OMV5W53A.js';
10
10
  import '../chunk-H5XTJ7GJ.js';
11
11
  import '../chunk-NUZHC6MM.js';
12
12
  import '../chunk-UAUP6XGK.js';
@@ -1,8 +1,8 @@
1
- export { VERSION_COMPARE_LABELS, VERSION_COMPARE_LENSES, VersionCompare } from '../chunk-SOERZJVJ.js';
1
+ export { VERSION_COMPARE_LABELS, VERSION_COMPARE_LENSES, VersionCompare } from '../chunk-UQHTHOSZ.js';
2
2
  import '../chunk-AOFVXE6V.js';
3
- import '../chunk-25AZQ3GZ.js';
4
- import '../chunk-WOTGQVHZ.js';
5
- import '../chunk-KQQWGWCC.js';
3
+ import '../chunk-36WK24AI.js';
4
+ import '../chunk-PQDQTK64.js';
5
+ import '../chunk-LPN3RHMA.js';
6
6
  import '../chunk-EGMQURBR.js';
7
7
  import '../chunk-CYQBDZ6M.js';
8
8
  import '../chunk-PPUR46MK.js';
@@ -10,9 +10,9 @@ import '../chunk-MLDTLZAO.js';
10
10
  import '../chunk-PQADV6P6.js';
11
11
  import '../chunk-KNAHKQD4.js';
12
12
  import '../chunk-DGXZ635L.js';
13
+ import '../chunk-XSPCITPN.js';
13
14
  import '../chunk-OMV5W53A.js';
14
15
  import '../chunk-2YTOOH3A.js';
15
- import '../chunk-XSPCITPN.js';
16
16
  import '../chunk-H5XTJ7GJ.js';
17
17
  import '../chunk-NUZHC6MM.js';
18
18
  import '../chunk-UAUP6XGK.js';
@@ -1,3 +1,3 @@
1
1
  import './HitArea-QUOS6ZDJ.css';
2
- import './Tabs-7ZK2UF75.css';
2
+ import './Tabs-M2ELSU3V.css';
3
3
  import './SegmentedControl-B7XCUOML.css';
@@ -1,4 +1,4 @@
1
- import { ContrastLevelTag } from './chunk-7PJFUQMY.js';
1
+ import { ContrastLevelTag } from './chunk-MGWFVAPN.js';
2
2
  import { Popover } from './chunk-KHJIEPZV.js';
3
3
  import { IconButton } from './chunk-UAUP6XGK.js';
4
4
  import { cx } from './chunk-ODEQTPFM.js';
@@ -1,6 +1,6 @@
1
1
  import { Link } from './chunk-QF5UNP4T.js';
2
2
  import { cx } from './chunk-ODEQTPFM.js';
3
- import './ObjectHeader-7BGA56VQ.css';
3
+ import './ObjectHeader-VKQSEJDN.css';
4
4
  import { ArrowUpRightGlyph } from '@crewlethq/icons/glyphs';
5
5
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
6
6
 
@@ -1,6 +1,6 @@
1
1
  import { Modal } from './chunk-C667GCU7.js';
2
2
  import { Callout } from './chunk-BPCY7ZID.js';
3
- import { SegmentedControl } from './chunk-WOTGQVHZ.js';
3
+ import { SegmentedControl } from './chunk-PQDQTK64.js';
4
4
  import { FormField, Input } from './chunk-6Q7RW2JJ.js';
5
5
  import { Button } from './chunk-DGXZ635L.js';
6
6
  import { useState } from 'react';
@@ -1,6 +1,6 @@
1
1
  import { Select } from './chunk-VK45YJLH.js';
2
2
  import { SHEET_LABELS, SHEET_COLUMN_TYPES, optionHue, retypeColumn } from './chunk-LFSIKGRQ.js';
3
- import { HueSwatch } from './chunk-4HO3NX3B.js';
3
+ import { HueSwatch } from './chunk-LE6K34SN.js';
4
4
  import { NODE_HUES, NODE_HUE_NAMES } from './chunk-AYKXMIOR.js';
5
5
  import { Checkbox } from './chunk-GKWZTTFV.js';
6
6
  import { Kbd } from './chunk-ANTAQAR4.js';
@@ -1,5 +1,5 @@
1
1
  import { useThemePreference, useDensityPreference } from './chunk-Z24ZUSTX.js';
2
- import { SegmentedControl } from './chunk-WOTGQVHZ.js';
2
+ import { SegmentedControl } from './chunk-PQDQTK64.js';
3
3
  import { SunGlyph, MonitorGlyph, MoonGlyph } from '@crewlethq/icons/glyphs';
4
4
  import { jsx } from 'react/jsx-runtime';
5
5
 
@@ -1,5 +1,5 @@
1
1
  import { NODE_HUES, NODE_HUE_NAMES } from './chunk-AYKXMIOR.js';
2
- import { SegmentedControl } from './chunk-WOTGQVHZ.js';
2
+ import { SegmentedControl } from './chunk-PQDQTK64.js';
3
3
  import { cx } from './chunk-ODEQTPFM.js';
4
4
  import { jsx } from 'react/jsx-runtime';
5
5
 
@@ -1,11 +1,12 @@
1
1
  import { cx } from './chunk-ODEQTPFM.js';
2
- import './DescriptionList-DEZISDLQ.css';
2
+ import './DescriptionList-VF7NIBXA.css';
3
3
  import { jsxs, jsx } from 'react/jsx-runtime';
4
4
 
5
5
  function DescriptionList({
6
6
  dense = false,
7
7
  fit = false,
8
8
  termWidth,
9
+ uniform = false,
9
10
  items,
10
11
  className,
11
12
  style,
@@ -21,6 +22,7 @@ function DescriptionList({
21
22
  "crewlet-description-list",
22
23
  dense && "crewlet-description-list--dense",
23
24
  fit && "crewlet-description-list--fit",
25
+ uniform && "crewlet-description-list--uniform",
24
26
  className
25
27
  ),
26
28
  children: [
@@ -6,7 +6,7 @@ import { HIT_AREA_CLASS } from './chunk-2YTOOH3A.js';
6
6
  import { VisuallyHidden } from './chunk-UT6CW3C7.js';
7
7
  import { cx } from './chunk-ODEQTPFM.js';
8
8
  import './HitArea-QUOS6ZDJ.css';
9
- import './Tabs-7ZK2UF75.css';
9
+ import './Tabs-M2ELSU3V.css';
10
10
  import React, { useRef, useImperativeHandle, useLayoutEffect, useState } from 'react';
11
11
  import { ChevronDownGlyph } from '@crewlethq/icons/glyphs';
12
12
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -44,7 +44,7 @@ function noteFits({
44
44
  var NOTHING_FOLDED = { folded: [], note: true };
45
45
  var px = (value) => parseFloat(value) || 0;
46
46
  var widthOf = (el) => el ? el.getBoundingClientRect().width : 0;
47
- function useFold(enabled, box, row, values, current) {
47
+ function useFold(enabled, box, row, values, current, layout = null) {
48
48
  const [fold, setFold] = useState(NOTHING_FOLDED);
49
49
  const signature = values.join("\n");
50
50
  useLayoutEffect(() => {
@@ -81,7 +81,7 @@ function useFold(enabled, box, row, values, current) {
81
81
  watch.observe(item);
82
82
  }
83
83
  return () => watch.disconnect();
84
- }, [enabled, box, row, signature, current]);
84
+ }, [enabled, box, row, signature, current, layout]);
85
85
  return enabled ? fold : NOTHING_FOLDED;
86
86
  }
87
87
  var FOLDED = { "aria-hidden": true, inert: true };
@@ -112,6 +112,7 @@ function Tabs({
112
112
  panelId,
113
113
  renderItem,
114
114
  trailing,
115
+ actions,
115
116
  overflow = "scroll",
116
117
  moreLabel = "More",
117
118
  moreMenuLabel,
@@ -122,6 +123,7 @@ function Tabs({
122
123
  const boxRef = useRef(null);
123
124
  const folding = overflow === "menu";
124
125
  const boxed = folding && !renderItem;
126
+ const barred = actions !== void 0 && actions !== null && actions !== false;
125
127
  useImperativeHandle(ref, () => boxed ? boxRef.current : navRef.current, [boxed]);
126
128
  const { buttons, onKeyDown } = useRoving(items.length, null);
127
129
  const fold = useFold(
@@ -129,7 +131,8 @@ function Tabs({
129
131
  boxed ? boxRef : navRef,
130
132
  navRef,
131
133
  items.map((item) => item.value),
132
- value
134
+ value,
135
+ barred
133
136
  );
134
137
  const isFolded = (item) => fold.folded.includes(item.value);
135
138
  useLayoutEffect(() => {
@@ -161,13 +164,18 @@ function Tabs({
161
164
  mutation.disconnect();
162
165
  resize?.disconnect();
163
166
  };
164
- }, [variant, value, items]);
167
+ }, [variant, value, items, barred]);
168
+ useLayoutEffect(() => {
169
+ if (variant === "underline" || !barred) return;
170
+ const nav = navRef.current;
171
+ if (nav) reveal(nav);
172
+ }, [variant, value, items, barred]);
165
173
  const rootClass = cx(
166
174
  "crewlet-tabs",
167
175
  `crewlet-tabs--${variant}`,
168
176
  `crewlet-tabs--${size}`,
169
177
  folding && "crewlet-tabs--fold",
170
- !boxed && className
178
+ !boxed && !barred && className
171
179
  );
172
180
  const selected = tabStop(
173
181
  items.map((item) => ({ disabled: item.disabled || isFolded(item) })),
@@ -274,21 +282,36 @@ function Tabs({
274
282
  children: note
275
283
  }
276
284
  ) : null;
285
+ const bar = (row) => /* @__PURE__ */ jsxs("div", { className: barred ? cx("crewlet-tabs-bar", `crewlet-tabs-bar--${variant}`, className) : "crewlet-tabs-host", children: [
286
+ row,
287
+ barred ? /* @__PURE__ */ jsx("div", { className: "crewlet-tabs__actions", "data-tabs-actions": "", children: actions }) : null
288
+ ] });
277
289
  if (renderItem) {
278
- return /* @__PURE__ */ jsxs("nav", { ref: navRef, className: rootClass, "aria-label": ariaLabel, children: [
279
- rows,
280
- more,
281
- noteNode,
282
- folding && trailing ? /* @__PURE__ */ jsx("span", { className: "crewlet-tabs__trailing", "data-tabs-trailing": "", children: trailing }) : trailing
283
- ] });
290
+ return bar(
291
+ /* @__PURE__ */ jsxs("nav", { ref: navRef, className: rootClass, "aria-label": ariaLabel, children: [
292
+ rows,
293
+ more,
294
+ noteNode,
295
+ folding && trailing ? /* @__PURE__ */ jsx("span", { className: "crewlet-tabs__trailing", "data-tabs-trailing": "", children: trailing }) : trailing
296
+ ] })
297
+ );
284
298
  }
285
299
  const list = /* @__PURE__ */ jsx("div", { ref: navRef, className: rootClass, "aria-label": ariaLabel, role: "tablist", children: rows });
286
- if (!boxed) return list;
287
- return /* @__PURE__ */ jsxs("div", { ref: boxRef, className: cx("crewlet-tabs-fold", `crewlet-tabs-fold--${variant}`, className), children: [
288
- list,
289
- more,
290
- noteNode
291
- ] });
300
+ if (!boxed) return bar(list);
301
+ return bar(
302
+ /* @__PURE__ */ jsxs(
303
+ "div",
304
+ {
305
+ ref: boxRef,
306
+ className: cx("crewlet-tabs-fold", `crewlet-tabs-fold--${variant}`, !barred && className),
307
+ children: [
308
+ list,
309
+ more,
310
+ noteNode
311
+ ]
312
+ }
313
+ )
314
+ );
292
315
  }
293
316
  function TabPanel({ id, value, children, className }) {
294
317
  return /* @__PURE__ */ jsx(
@@ -1,5 +1,5 @@
1
1
  import { FileDrop, FilePickButton } from './chunk-KQWJWTED.js';
2
- import { contrastRatio } from './chunk-7PJFUQMY.js';
2
+ import { contrastRatio } from './chunk-MGWFVAPN.js';
3
3
  import { normalizeHex } from './chunk-7W3LYIOC.js';
4
4
  import { Button } from './chunk-DGXZ635L.js';
5
5
  import { VisuallyHidden } from './chunk-UT6CW3C7.js';
@@ -1,6 +1,6 @@
1
- import { SetByLine } from './chunk-S7WG53JB.js';
1
+ import { SetByLine } from './chunk-AXEXOAZQ.js';
2
2
  import { Link } from './chunk-QF5UNP4T.js';
3
- import { DescriptionList, DescriptionListItem } from './chunk-MFS6F2P7.js';
3
+ import { DescriptionList, DescriptionListItem } from './chunk-LH4OF7FI.js';
4
4
  import { EmptyValue } from './chunk-RE3FBGQQ.js';
5
5
  import { cx } from './chunk-ODEQTPFM.js';
6
6
  import './PropertyList-42MEVUXV.css';
@@ -1,4 +1,4 @@
1
- import { HuePicker } from './chunk-4HO3NX3B.js';
1
+ import { HuePicker } from './chunk-LE6K34SN.js';
2
2
  import { Popover } from './chunk-KHJIEPZV.js';
3
3
  import { NODE_HUE_NAMES } from './chunk-AYKXMIOR.js';
4
4
  import { CharacterPicker } from './chunk-I22MUEG7.js';
@@ -1,4 +1,4 @@
1
- import { tabId } from './chunk-KQQWGWCC.js';
1
+ import { tabId } from './chunk-LPN3RHMA.js';
2
2
  import { useRoving, tabStop } from './chunk-EGMQURBR.js';
3
3
  import { Count } from './chunk-MLDTLZAO.js';
4
4
  import { HIT_AREA_CLASS } from './chunk-2YTOOH3A.js';
@@ -1,5 +1,5 @@
1
1
  import { Tooltip } from './chunk-I33UIUZD.js';
2
- import { SegmentedControl } from './chunk-WOTGQVHZ.js';
2
+ import { SegmentedControl } from './chunk-PQDQTK64.js';
3
3
  import { ArtifactIcon } from './chunk-AVL52EME.js';
4
4
  import { isApplePlatform, Kbd } from './chunk-ANTAQAR4.js';
5
5
  import { Menu } from './chunk-KNAHKQD4.js';
@@ -9,7 +9,7 @@ import { jsx } from 'react/jsx-runtime';
9
9
  var engine = null;
10
10
  var loading = null;
11
11
  function loadEngine() {
12
- loading ??= import('./Editor-MPNGVAWD.js').then(
12
+ loading ??= import('./Editor-QO2GRTMK.js').then(
13
13
  (module) => {
14
14
  engine = module.Editor;
15
15
  return engine;
@@ -1,6 +1,6 @@
1
1
  import { Toolbar } from './chunk-NR4CPM4T.js';
2
- import { SegmentedControl } from './chunk-WOTGQVHZ.js';
3
- import { tabId } from './chunk-KQQWGWCC.js';
2
+ import { SegmentedControl } from './chunk-PQDQTK64.js';
3
+ import { tabId } from './chunk-LPN3RHMA.js';
4
4
  import { IconButton } from './chunk-UAUP6XGK.js';
5
5
  import { cx } from './chunk-ODEQTPFM.js';
6
6
  import './MarkdownEditor-BLCJRGDC.css';
@@ -1,5 +1,5 @@
1
1
  import { cx } from './chunk-ODEQTPFM.js';
2
- import './TileGrid-UYMVVVJK.css';
2
+ import './TileGrid-XOEJ4P52.css';
3
3
  import { jsx } from 'react/jsx-runtime';
4
4
 
5
5
  function TileGrid({ columns = 3, as: Track = "div", className, children, ...rest }) {
@@ -1,5 +1,5 @@
1
1
  import { diffLines, diffStat, collapseDiff, DiffSummary, DiffView } from './chunk-AOFVXE6V.js';
2
- import { SegmentedControl } from './chunk-WOTGQVHZ.js';
2
+ import { SegmentedControl } from './chunk-PQDQTK64.js';
3
3
  import { EmptyState } from './chunk-PPUR46MK.js';
4
4
  import { useHeadingLevel, headingTag, nextHeadingLevel, HeadingLevelProvider } from './chunk-PQADV6P6.js';
5
5
  import { cx } from './chunk-ODEQTPFM.js';
@@ -1,4 +1,4 @@
1
- import { SegmentedControl } from './chunk-WOTGQVHZ.js';
1
+ import { SegmentedControl } from './chunk-PQDQTK64.js';
2
2
  import { Button } from './chunk-DGXZ635L.js';
3
3
  import { cx } from './chunk-ODEQTPFM.js';
4
4
  import './MergeConflicts-HCXPRQVR.css';