@crewlethq/ui 0.24.0 → 0.25.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 (172) hide show
  1. package/README.md +65 -3
  2. package/dist/ArrangeList/index.js +2 -2
  3. package/dist/ArtifactCover/ArtifactCover.d.ts +37 -0
  4. package/dist/ArtifactCover/DashboardCover.d.ts +46 -0
  5. package/dist/ArtifactCover/index.d.ts +6 -0
  6. package/dist/ArtifactCover/index.js +14 -0
  7. package/dist/ArtifactCover-D4MBEJ5H.css +67 -0
  8. package/dist/ArtifactIcon/ArtifactIcon.d.ts +29 -0
  9. package/dist/ArtifactIcon/index.d.ts +2 -0
  10. package/dist/ArtifactIcon/index.js +13 -0
  11. package/dist/AvatarPicker/index.js +6 -6
  12. package/dist/Canvas/Canvas.d.ts +13 -2
  13. package/dist/Canvas/index.js +1 -1
  14. package/dist/CanvasBoard/CanvasBoard.d.ts +117 -0
  15. package/dist/CanvasBoard/budget.d.ts +38 -0
  16. package/dist/CanvasBoard/index.d.ts +5 -0
  17. package/dist/CanvasBoard/index.js +10 -0
  18. package/dist/CanvasBoard-ZLPDINSM.css +236 -0
  19. package/dist/CanvasSchematic/CanvasSchematic.d.ts +31 -0
  20. package/dist/CanvasSchematic/index.d.ts +3 -0
  21. package/dist/CanvasSchematic/index.js +2 -0
  22. package/dist/CanvasSchematic-PLB3N46J.css +36 -0
  23. package/dist/ChangeMark/index.js +3 -3
  24. package/dist/CharacterPicker/index.js +2 -2
  25. package/dist/Checkbox/Checkbox.d.ts +6 -0
  26. package/dist/Checkbox/index.js +1 -1
  27. package/dist/{Checkbox-KT7RS6QQ.css → Checkbox-5UORUG3F.css} +16 -0
  28. package/dist/CommentThread/index.js +2 -2
  29. package/dist/DashboardCover-RMINBODB.css +143 -0
  30. package/dist/DataTable/index.js +3 -3
  31. package/dist/DataView/index.js +5 -5
  32. package/dist/DatasetSource/DatasetSource.d.ts +83 -0
  33. package/dist/DatasetSource/index.d.ts +3 -0
  34. package/dist/DatasetSource/index.js +7 -0
  35. package/dist/DatasetSource-47LBDMPR.css +129 -0
  36. package/dist/DocTabsEditor/DocTabsEditor.d.ts +60 -0
  37. package/dist/DocTabsEditor/index.d.ts +3 -0
  38. package/dist/DocTabsEditor/index.js +9 -0
  39. package/dist/DocTabsEditor-RCOWHX5J.css +78 -0
  40. package/dist/DownloadButton/index.js +2 -2
  41. package/dist/HuePicker/index.js +4 -4
  42. package/dist/LinkInterstitial/index.js +2 -2
  43. package/dist/MarkdownEditor/index.js +5 -5
  44. package/dist/MergeConflicts/MergeConflicts.d.ts +51 -0
  45. package/dist/MergeConflicts/index.d.ts +3 -0
  46. package/dist/MergeConflicts/index.js +9 -0
  47. package/dist/MergeConflicts-O44ESH4T.css +77 -0
  48. package/dist/Meter/index.js +1 -1
  49. package/dist/{Meter-5VCSFMZW.css → Meter-ZZRFUEOH.css} +15 -0
  50. package/dist/ObjectHeader/ObjectHeader.d.ts +7 -1
  51. package/dist/ObjectHeader/index.js +1 -1
  52. package/dist/{ObjectHeader-UNVYM2KD.css → ObjectHeader-D7GU7QNI.css} +15 -0
  53. package/dist/PeopleRail/index.js +2 -2
  54. package/dist/PresenceModel/index.d.ts +1 -1
  55. package/dist/PresenceModel/index.js +1 -1
  56. package/dist/PresenceModel/presence.d.ts +10 -2
  57. package/dist/PresenceStack/index.js +2 -2
  58. package/dist/PresenterView/PresenterView.d.ts +52 -0
  59. package/dist/PresenterView/index.d.ts +3 -0
  60. package/dist/PresenterView/index.js +8 -0
  61. package/dist/PresenterView-T2C6ZZ3N.css +103 -0
  62. package/dist/Section/index.js +1 -1
  63. package/dist/{Section-QRUPRIQ2.css → Section-QR3ILQVK.css} +4 -1
  64. package/dist/SegmentedControl/SegmentedControl.d.ts +17 -0
  65. package/dist/SegmentedControl/index.js +4 -4
  66. package/dist/{SegmentedControl-PKBLJVSA.css → SegmentedControl-FLI45IOW.css} +13 -0
  67. package/dist/ShareDialog/index.js +3 -3
  68. package/dist/SheetGrid/SheetGrid.d.ts +24 -2
  69. package/dist/SheetGrid/index.js +10 -6
  70. package/dist/{SheetGrid-4HOXDVIB.css → SheetGrid-J3TKKXZL.css} +87 -17
  71. package/dist/SheetModel/edits.d.ts +7 -1
  72. package/dist/SheetModel/index.js +2 -2
  73. package/dist/SheetModel/labels.d.ts +9 -0
  74. package/dist/SheetModel/types.d.ts +6 -0
  75. package/dist/SlideCompare/SlideCompare.d.ts +52 -0
  76. package/dist/SlideCompare/index.d.ts +3 -0
  77. package/dist/SlideCompare/index.js +7 -0
  78. package/dist/SlideCompare-MGM3U2ME.css +80 -0
  79. package/dist/SlideFilmstrip/SlideFilmstrip.d.ts +50 -0
  80. package/dist/SlideFilmstrip/index.d.ts +3 -0
  81. package/dist/SlideFilmstrip/index.js +8 -0
  82. package/dist/SlideFilmstrip-BCLNAHFX.css +108 -0
  83. package/dist/SlideGrid/SlideGrid.d.ts +32 -0
  84. package/dist/SlideGrid/index.d.ts +3 -0
  85. package/dist/SlideGrid/index.js +5 -0
  86. package/dist/SlideGrid-RT6QEQEE.css +82 -0
  87. package/dist/SlideStage/SlideStage.d.ts +47 -0
  88. package/dist/SlideStage/index.d.ts +5 -0
  89. package/dist/SlideStage/index.js +4 -0
  90. package/dist/SlideStage/useSlideKeys.d.ts +21 -0
  91. package/dist/SlideStage-XIOTMMRU.css +32 -0
  92. package/dist/Switcher/index.js +2 -2
  93. package/dist/TableCells/index.js +2 -2
  94. package/dist/Tabs/index.js +2 -2
  95. package/dist/Tabs/roving.d.ts +1 -0
  96. package/dist/TagGroup/TagGroup.d.ts +16 -1
  97. package/dist/TagGroup/index.js +1 -1
  98. package/dist/{TagGroup-BCQZD7ZD.css → TagGroup-NAXTJHDS.css} +22 -0
  99. package/dist/ThemeGallery/index.js +2 -2
  100. package/dist/ThemeSwitcher/index.js +5 -5
  101. package/dist/TreeCanvas/index.js +2 -2
  102. package/dist/VersionCompare/VersionCompare.d.ts +8 -1
  103. package/dist/VersionCompare/index.js +5 -5
  104. package/dist/VersionTimeline/index.js +1 -1
  105. package/dist/{VersionTimeline-EBJ6MIPJ.css → VersionTimeline-6KRXEEOO.css} +7 -7
  106. package/dist/WidgetFrame/WidgetFrame.d.ts +73 -0
  107. package/dist/WidgetFrame/index.d.ts +3 -0
  108. package/dist/WidgetFrame/index.js +6 -0
  109. package/dist/WidgetFrame-4EFJOJMW.css +127 -0
  110. package/dist/chunk-3D7PSL2L.js +438 -0
  111. package/dist/{chunk-SJCKMSQK.js → chunk-5LUI3WQP.js} +1 -1
  112. package/dist/{chunk-IASV5UCP.js → chunk-7T42VQQT.js} +3 -1
  113. package/dist/{chunk-BJCFNRGH.js → chunk-BEHFTRMZ.js} +1 -1
  114. package/dist/chunk-BQYQWJPK.js +80 -0
  115. package/dist/{chunk-KLIEPFEZ.js → chunk-C2FRTWKO.js} +1 -1
  116. package/dist/{chunk-APS747CR.js → chunk-EHQTPVV4.js} +5 -3
  117. package/dist/{chunk-A2UXBCLO.js → chunk-FAQGGX2Z.js} +1 -1
  118. package/dist/chunk-FQCLKD7U.js +2 -0
  119. package/dist/{chunk-J4OKGJQ6.js → chunk-FVLCTCMV.js} +1 -1
  120. package/dist/{chunk-XJFOOXCF.js → chunk-HJEVSQN6.js} +1 -1
  121. package/dist/chunk-HONZQ4UR.js +107 -0
  122. package/dist/{chunk-5PSXBL73.js → chunk-HVIX5ECM.js} +1 -1
  123. package/dist/{chunk-36CWC2NH.js → chunk-INTEH4F3.js} +271 -143
  124. package/dist/{chunk-F6NZOVWL.js → chunk-IW55G7XG.js} +6 -2
  125. package/dist/chunk-KNLJL3VP.js +101 -0
  126. package/dist/chunk-KSSSFLE2.js +105 -0
  127. package/dist/{chunk-TXAFKH2A.js → chunk-KZOGQXSP.js} +6 -0
  128. package/dist/{chunk-CS65QSIJ.js → chunk-LZHLSQYK.js} +2 -2
  129. package/dist/chunk-MQEEQVG6.js +62 -0
  130. package/dist/chunk-NBWNLYWZ.js +62 -0
  131. package/dist/{chunk-YYZRLLLY.js → chunk-NHBP2XS5.js} +19 -3
  132. package/dist/chunk-O2EGEONV.js +90 -0
  133. package/dist/{chunk-YM3GJHGW.js → chunk-ODT5H4MN.js} +1 -1
  134. package/dist/{chunk-JCSXFAXG.js → chunk-OJRDEVHV.js} +1 -1
  135. package/dist/{chunk-U63Y5OCW.js → chunk-PRNX5AFE.js} +2 -2
  136. package/dist/chunk-Q4A5CGUB.js +43 -0
  137. package/dist/{chunk-7QL2OFP6.js → chunk-RCQXUT5K.js} +25 -9
  138. package/dist/{chunk-CBOICT64.js → chunk-RKKO7QHH.js} +2 -0
  139. package/dist/{chunk-TBIZSQHB.js → chunk-RSC7UJCR.js} +1 -1
  140. package/dist/chunk-RWA4H2TV.js +73 -0
  141. package/dist/{chunk-OQT7GSKJ.js → chunk-SGIQCI6Y.js} +1 -1
  142. package/dist/{chunk-35UKQ33X.js → chunk-SVW3VG72.js} +2 -2
  143. package/dist/{chunk-4PZ6FJKW.js → chunk-UGNUUVRI.js} +2 -2
  144. package/dist/chunk-UOR7TOAU.js +191 -0
  145. package/dist/{chunk-XMGB3ZAT.js → chunk-URUGEAFB.js} +3 -2
  146. package/dist/chunk-UZ7ZUSLH.js +179 -0
  147. package/dist/chunk-V2Z24W2Z.js +75 -0
  148. package/dist/{chunk-I7WXZOWA.js → chunk-VGE3G3T4.js} +3 -1
  149. package/dist/{chunk-UNZ7TVV5.js → chunk-W4XYY73O.js} +7 -9
  150. package/dist/{chunk-IPM2E6UI.js → chunk-WJDQ7XQA.js} +1 -1
  151. package/dist/{chunk-PPAQFGS2.js → chunk-YEKYVJQR.js} +1 -1
  152. package/dist/chunk-Z54BPRL6.js +74 -0
  153. package/dist/{chunk-S35G6PNC.js → chunk-Z7JYG5TF.js} +5 -4
  154. package/dist/chunk-ZZDY4XL7.js +112 -0
  155. package/dist/generated/index.d.ts +13 -0
  156. package/dist/generated/index.js +86 -73
  157. package/dist/index.js +86 -73
  158. package/dist/styles.css +1644 -153
  159. package/dist/utils/csv.d.ts +18 -0
  160. package/dist/utils/elementToPng.d.ts +49 -0
  161. package/dist/utils/index.d.ts +4 -1
  162. package/dist/utils/index.js +2 -2
  163. package/dist/utils/useDownload.d.ts +14 -4
  164. package/package.json +3 -3
  165. package/dist/chunk-E6UWRXNM.js +0 -52
  166. package/dist/chunk-M54K52ZU.js +0 -2
  167. package/dist/chunk-U5LQ2AS5.js +0 -1
  168. package/dist/{chunk-KG6XRG5Z.js → chunk-5OY4LJFH.js} +1 -1
  169. package/dist/{chunk-ZM7HLFOA.js → chunk-L2OQRPXJ.js} +1 -1
  170. package/dist/{chunk-MUGM7SEG.js → chunk-LFNUH4GY.js} +1 -1
  171. package/dist/{chunk-PBNP7H2C.js → chunk-M2VJGNCD.js} +1 -1
  172. /package/dist/{chunk-MSSZHDZI.js → chunk-SLRKS5PF.js} +0 -0
@@ -0,0 +1,80 @@
1
+ /*
2
+ * SlideCompare: two versions of a deck, slide by slide.
3
+ *
4
+ * A row that changed carries its change in words beside a glyph; the side a
5
+ * version lacks is a dashed, empty box of the slide's shape, so the pairing
6
+ * still reads at a glance.
7
+ */
8
+
9
+ .crewlet-slide-compare {
10
+ display: flex;
11
+ flex-direction: column;
12
+ gap: var(--spacing-3);
13
+ }
14
+
15
+ .crewlet-slide-compare__summary {
16
+ margin: 0;
17
+ color: var(--color-text-secondary);
18
+ font-size: var(--font-size-sm);
19
+ }
20
+
21
+ .crewlet-slide-compare__list {
22
+ display: flex;
23
+ flex-direction: column;
24
+ gap: var(--spacing-4);
25
+ margin: 0;
26
+ padding: 0;
27
+ list-style: none;
28
+ }
29
+
30
+ .crewlet-slide-compare__head {
31
+ display: flex;
32
+ flex-wrap: wrap;
33
+ align-items: center;
34
+ gap: var(--spacing-2) var(--spacing-3);
35
+ margin-bottom: var(--spacing-2);
36
+ }
37
+
38
+ .crewlet-slide-compare__title {
39
+ font-weight: var(--font-weight-semibold);
40
+ }
41
+
42
+ .crewlet-slide-compare__change {
43
+ display: inline-flex;
44
+ align-items: center;
45
+ gap: var(--spacing-1);
46
+ padding: 0 var(--spacing-2);
47
+ border: 1px solid var(--color-border-default);
48
+ border-radius: var(--radius-pill);
49
+ color: var(--color-text-secondary);
50
+ font-size: var(--font-size-xs);
51
+ }
52
+
53
+ .crewlet-slide-compare__sides {
54
+ display: grid;
55
+ grid-template-columns: repeat(2, minmax(0, 1fr));
56
+ gap: var(--spacing-3);
57
+ }
58
+
59
+ .crewlet-slide-compare__side .crewlet-slide-stage {
60
+ border-radius: var(--radius-sm);
61
+ outline: 1px solid var(--color-border-default);
62
+ }
63
+
64
+ .crewlet-slide-compare__missing {
65
+ display: flex;
66
+ align-items: center;
67
+ justify-content: center;
68
+ aspect-ratio: 16 / 9;
69
+ margin: 0;
70
+ border: 1px dashed var(--color-border-strong);
71
+ border-radius: var(--radius-sm);
72
+ color: var(--color-text-tertiary);
73
+ font-size: var(--font-size-sm);
74
+ }
75
+
76
+ @media (width < 640px) {
77
+ .crewlet-slide-compare__sides {
78
+ grid-template-columns: minmax(0, 1fr);
79
+ }
80
+ }
@@ -0,0 +1,50 @@
1
+ import { type ReactNode } from 'react';
2
+ /** One slide as the filmstrip lists it. */
3
+ export interface FilmstripSlide {
4
+ id: string;
5
+ /** What a reader calls it: its first heading. */
6
+ title: string;
7
+ /** Skipped when presenting; drawn dimmed here. */
8
+ hidden?: boolean | undefined;
9
+ }
10
+ export interface SlideFilmstripLabels {
11
+ /** The list's name. */
12
+ list: string;
13
+ /** A thumbnail's name: "Slide 4, The plan". */
14
+ slide: (position: number, title: string) => string;
15
+ hidden: string;
16
+ untitled: string;
17
+ }
18
+ export interface SlideFilmstripProps {
19
+ slides: readonly FilmstripSlide[];
20
+ /** The slide on the stage. */
21
+ selected: string;
22
+ onSelect: (id: string) => void;
23
+ /** Draws one slide for its thumbnail. */
24
+ renderSlide: (id: string) => ReactNode;
25
+ /**
26
+ * A new order, by a drag or by the arrow keys on a slide's handle. Left
27
+ * out, the filmstrip is read only and draws no handles.
28
+ */
29
+ onReorder?: ((ids: string[]) => void) | undefined;
30
+ className?: string | undefined;
31
+ labels?: Partial<SlideFilmstripLabels> | undefined;
32
+ }
33
+ /**
34
+ * The column of slide thumbnails beside a deck's stage: the slide on the stage
35
+ * marked, each one a press away, and, where the reader may edit, a handle that
36
+ * moves it.
37
+ *
38
+ * ONE STOP IN THE TAB ORDER for the thumbnails: each is a button marked
39
+ * `aria-current` when its slide is on the stage, and only that one is in the
40
+ * tab order; Up and Down move to the next or previous slide, Home and End to
41
+ * the ends, and the stage follows. A handle is its own control beside its
42
+ * thumbnail, since moving a slide is a different act from looking at it; its
43
+ * arrow keys move the slide, and the move is announced with where it landed.
44
+ * (A listbox would hold the handles inside its options, which a listbox may
45
+ * not.)
46
+ *
47
+ * THUMBNAILS ARE THE SLIDES THEMSELVES, drawn by the caller at the slide's own
48
+ * size and scaled by `SlideStage`, so what the strip shows is what presents.
49
+ */
50
+ export declare function SlideFilmstrip({ slides, selected, onSelect, renderSlide, onReorder, className, labels, }: SlideFilmstripProps): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import './SlideFilmstrip.css';
2
+ export { SlideFilmstrip } from './SlideFilmstrip.js';
3
+ export type { FilmstripSlide, SlideFilmstripLabels, SlideFilmstripProps } from './SlideFilmstrip.js';
@@ -0,0 +1,8 @@
1
+ export { SlideFilmstrip } from '../chunk-KSSSFLE2.js';
2
+ import '../chunk-KNLJL3VP.js';
3
+ import '../chunk-XJ2QEBMM.js';
4
+ import '../chunk-HMPFGIWM.js';
5
+ import '../chunk-R25RGPUB.js';
6
+ import '../chunk-RSAQOKH3.js';
7
+ import '../chunk-BZFWDIV6.js';
8
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,108 @@
1
+ /*
2
+ * SlideFilmstrip: the column of slide thumbnails beside a deck's stage.
3
+ *
4
+ * The selected slide is ringed in the brand accent rather than filled, so its
5
+ * thumbnail still shows the slide's own colours.
6
+ */
7
+
8
+ .crewlet-slide-filmstrip__list {
9
+ display: flex;
10
+ flex-direction: column;
11
+ gap: var(--spacing-2);
12
+ margin: 0;
13
+ padding: var(--spacing-1);
14
+ list-style: none;
15
+ }
16
+
17
+ .crewlet-slide-filmstrip__item {
18
+ display: grid;
19
+ grid-template-columns: var(--spacing-5) minmax(0, 1fr) auto;
20
+ align-items: start;
21
+ gap: var(--spacing-1);
22
+ }
23
+
24
+ .crewlet-slide-filmstrip__number {
25
+ padding-top: var(--spacing-1);
26
+ color: var(--color-text-tertiary);
27
+ font-size: var(--font-size-xs);
28
+ font-variant-numeric: tabular-nums;
29
+ text-align: right;
30
+ }
31
+
32
+ .crewlet-slide-filmstrip__thumb {
33
+ position: relative;
34
+ display: block;
35
+ width: 100%;
36
+ padding: 0;
37
+ border: 0;
38
+ background: transparent;
39
+ border-radius: var(--radius-sm);
40
+ outline: 1px solid var(--color-border-default);
41
+ cursor: pointer;
42
+ overflow: hidden;
43
+ }
44
+
45
+ .crewlet-slide-filmstrip__thumb:hover {
46
+ outline-color: var(--color-border-hover);
47
+ }
48
+
49
+ .crewlet-slide-filmstrip__item[data-selected='true'] .crewlet-slide-filmstrip__thumb {
50
+ outline: 2px solid var(--color-brand-accent);
51
+ }
52
+
53
+ /* ONE RING, OVER THE THUMBNAIL'S OWN EDGE: the focus outline takes the place
54
+ of the edge rather than standing off it as a second one. */
55
+ .crewlet-slide-filmstrip__thumb:focus-visible {
56
+ outline: 2px solid var(--color-focus);
57
+ outline-offset: var(--size-focus-ring-inset-offset);
58
+ }
59
+
60
+ .crewlet-slide-filmstrip__item[data-hidden='true'] .crewlet-slide-stage {
61
+ opacity: 0.45;
62
+ }
63
+
64
+ .crewlet-slide-filmstrip__hidden {
65
+ position: absolute;
66
+ right: var(--spacing-1);
67
+ bottom: var(--spacing-1);
68
+ display: inline-flex;
69
+ padding: var(--spacing-0);
70
+ border-radius: var(--radius-xs);
71
+ background: var(--color-surface-elevated);
72
+ color: var(--color-text-secondary);
73
+ }
74
+
75
+ .crewlet-slide-filmstrip__handle {
76
+ display: inline-flex;
77
+ align-items: center;
78
+ justify-content: center;
79
+ min-width: var(--size-target-min);
80
+ min-height: var(--size-target-min);
81
+ padding: 0;
82
+ border: 0;
83
+ border-radius: var(--radius-sm);
84
+ background: transparent;
85
+ color: var(--color-text-tertiary);
86
+ cursor: grab;
87
+ }
88
+
89
+ .crewlet-slide-filmstrip__handle:hover {
90
+ background: var(--color-surface-hover);
91
+ }
92
+
93
+ .crewlet-slide-filmstrip__handle:focus-visible {
94
+ outline: 2px solid var(--color-focus);
95
+ outline-offset: var(--size-focus-ring-inset-offset);
96
+ }
97
+
98
+ .crewlet-slide-filmstrip__item[data-reorder='dragging'] {
99
+ opacity: 0.4;
100
+ }
101
+
102
+ .crewlet-slide-filmstrip__item[data-reorder-target='before'] .crewlet-slide-filmstrip__thumb {
103
+ box-shadow: 0 calc(var(--spacing-1) * -1) 0 var(--color-brand-accent);
104
+ }
105
+
106
+ .crewlet-slide-filmstrip__item[data-reorder-target='after'] .crewlet-slide-filmstrip__thumb {
107
+ box-shadow: 0 var(--spacing-1) 0 var(--color-brand-accent);
108
+ }
@@ -0,0 +1,32 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { FilmstripSlide } from '../SlideFilmstrip/index.js';
3
+ /** A run of the deck's outline and the slides it holds, in order. */
4
+ export interface SlideGridSection {
5
+ /** The section's sentence; empty for slides before the first section. */
6
+ title: string;
7
+ slides: readonly FilmstripSlide[];
8
+ }
9
+ export interface SlideGridLabels {
10
+ slide: (position: number, title: string) => string;
11
+ hidden: string;
12
+ untitled: string;
13
+ }
14
+ export interface SlideGridProps {
15
+ sections: readonly SlideGridSection[];
16
+ renderSlide: (id: string) => ReactNode;
17
+ /** Open a slide: the editor's stage, or Present from it. */
18
+ onOpen: (id: string) => void;
19
+ /** The slide to mark as current, if any. */
20
+ current?: string | undefined;
21
+ className?: string | undefined;
22
+ labels?: Partial<SlideGridLabels> | undefined;
23
+ }
24
+ /**
25
+ * Every slide of a deck at once, laid out by its outline's sections: the view
26
+ * for finding a slide, checking the rhythm of a deck, or reviewing it whole.
27
+ *
28
+ * NUMBERED ACROSS THE DECK, not within a section, since a presenter says
29
+ * "slide 7" whatever section it sits in. Each card is a button naming its
30
+ * slide, so the grid is a list of choices to a screen reader.
31
+ */
32
+ export declare function SlideGrid({ sections, renderSlide, onOpen, current, className, labels }: SlideGridProps): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import './SlideGrid.css';
2
+ export { SlideGrid } from './SlideGrid.js';
3
+ export type { SlideGridLabels, SlideGridProps, SlideGridSection } from './SlideGrid.js';
@@ -0,0 +1,5 @@
1
+ export { SlideGrid } from '../chunk-Q4A5CGUB.js';
2
+ import '../chunk-KNLJL3VP.js';
3
+ import '../chunk-HMPFGIWM.js';
4
+ import '../chunk-R25RGPUB.js';
5
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,82 @@
1
+ /*
2
+ * SlideGrid: every slide of a deck at once, by its outline's sections.
3
+ */
4
+
5
+ .crewlet-slide-grid {
6
+ display: flex;
7
+ flex-direction: column;
8
+ gap: var(--spacing-6);
9
+ }
10
+
11
+ .crewlet-slide-grid__heading {
12
+ margin: 0 0 var(--spacing-3);
13
+ color: var(--color-text-secondary);
14
+ font-size: var(--font-size-sm);
15
+ font-weight: var(--font-weight-semibold);
16
+ }
17
+
18
+ .crewlet-slide-grid__list {
19
+ display: grid;
20
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 14rem), 1fr));
21
+ gap: var(--spacing-4);
22
+ margin: 0;
23
+ padding: 0;
24
+ list-style: none;
25
+ }
26
+
27
+ .crewlet-slide-grid__card {
28
+ display: flex;
29
+ flex-direction: column;
30
+ gap: var(--spacing-2);
31
+ width: 100%;
32
+ padding: 0;
33
+ border: 0;
34
+ background: transparent;
35
+ color: inherit;
36
+ font: inherit;
37
+ text-align: left;
38
+ cursor: pointer;
39
+ }
40
+
41
+ .crewlet-slide-grid__card .crewlet-slide-stage {
42
+ border-radius: var(--radius-sm);
43
+ outline: 1px solid var(--color-border-default);
44
+ }
45
+
46
+ .crewlet-slide-grid__card:hover .crewlet-slide-stage {
47
+ outline-color: var(--color-border-hover);
48
+ }
49
+
50
+ .crewlet-slide-grid__card[aria-current='true'] .crewlet-slide-stage {
51
+ outline: 2px solid var(--color-brand-accent);
52
+ }
53
+
54
+ /* ONE RING, round the whole card (its slide and its caption), on the inset
55
+ offset so it does not stand off the slide's own edge as a second line. */
56
+ .crewlet-slide-grid__card:focus-visible {
57
+ outline: 2px solid var(--color-focus);
58
+ outline-offset: var(--size-focus-ring-inset-offset);
59
+ }
60
+
61
+ .crewlet-slide-grid__card[data-hidden='true'] .crewlet-slide-stage {
62
+ opacity: 0.45;
63
+ }
64
+
65
+ .crewlet-slide-grid__caption {
66
+ display: flex;
67
+ align-items: center;
68
+ gap: var(--spacing-2);
69
+ color: var(--color-text-secondary);
70
+ font-size: var(--font-size-xs);
71
+ }
72
+
73
+ .crewlet-slide-grid__number {
74
+ color: var(--color-text-tertiary);
75
+ font-variant-numeric: tabular-nums;
76
+ }
77
+
78
+ .crewlet-slide-grid__title {
79
+ overflow: hidden;
80
+ text-overflow: ellipsis;
81
+ white-space: nowrap;
82
+ }
@@ -0,0 +1,47 @@
1
+ import { type ReactNode } from 'react';
2
+ /** A presentation's stage: 1920 by 1080 CSS pixels, 16:9. */
3
+ export declare const SLIDE_WIDTH = 1920;
4
+ export declare const SLIDE_HEIGHT = 1080;
5
+ /**
6
+ * How a stage fills its box.
7
+ *
8
+ * - `width`: as wide as its container, as tall as 16:9 makes it. A filmstrip
9
+ * thumbnail, a grid card, the editor's slide.
10
+ * - `contain`: as large as fits inside its container both ways, centred, the
11
+ * rest letterboxed. Present, full screen.
12
+ */
13
+ export type SlideStageFit = 'width' | 'contain';
14
+ export interface SlideStageProps {
15
+ /** The slide, laid out at the stage's own size (1920 by 1080 by default). */
16
+ children: ReactNode;
17
+ /** The slide's accessible name: "Slide 4 of 12, The plan". */
18
+ label: string;
19
+ fit?: SlideStageFit | undefined;
20
+ /**
21
+ * A fixed scale instead of one measured from the box: print, where the page
22
+ * is known and a measurement taken on screen would be the wrong one.
23
+ */
24
+ scale?: number | undefined;
25
+ /** The stage's own size, for a format other than 16:9 at 1920. */
26
+ width?: number | undefined;
27
+ height?: number | undefined;
28
+ className?: string | undefined;
29
+ }
30
+ /**
31
+ * A slide drawn at its authored size and scaled to whatever box it is given.
32
+ *
33
+ * ONE LAYOUT AT EVERY SIZE. A slide is authored on a fixed 1920 by 1080 stage,
34
+ * with pixel font sizes and pinned positions, so it is laid out at exactly that
35
+ * size and then scaled as a whole: a thumbnail, the editor and a projector all
36
+ * show the same line breaks. Reflowing it to the box would move every pinned
37
+ * element relative to the text beside it.
38
+ *
39
+ * MEASURED, NOT GUESSED: the scale is the box's own size over the stage's,
40
+ * read whenever the box resizes, so a filmstrip that narrows or a window that
41
+ * goes full screen redraws at the new size. A `scale` given outright is used
42
+ * as is, for print.
43
+ *
44
+ * A GROUP NAMED AS A SLIDE, so a screen reader announces "slide" with its
45
+ * name and reads its text in source order, which is the slide's reading order.
46
+ */
47
+ export declare function SlideStage({ children, label, fit, scale, width, height, className, }: SlideStageProps): import("react").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import './SlideStage.css';
2
+ export { SlideStage, SLIDE_WIDTH, SLIDE_HEIGHT } from './SlideStage.js';
3
+ export type { SlideStageFit, SlideStageProps } from './SlideStage.js';
4
+ export { useSlideKeys } from './useSlideKeys.js';
5
+ export type { SlideKeys } from './useSlideKeys.js';
@@ -0,0 +1,4 @@
1
+ export { SLIDE_HEIGHT, SLIDE_WIDTH, SlideStage, useSlideKeys } from '../chunk-KNLJL3VP.js';
2
+ import '../chunk-HMPFGIWM.js';
3
+ import '../chunk-R25RGPUB.js';
4
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,21 @@
1
+ export interface SlideKeys {
2
+ onNext: () => void;
3
+ onPrevious: () => void;
4
+ onFirst?: (() => void) | undefined;
5
+ onLast?: (() => void) | undefined;
6
+ /** Escape: leave the show. */
7
+ onExit?: (() => void) | undefined;
8
+ /** Listen only while the show is on. */
9
+ enabled?: boolean | undefined;
10
+ }
11
+ /**
12
+ * The keys every presentation answers, the ones a clicker sends too: Right,
13
+ * Down, Page Down, Space and Enter go forward; Left, Up, Page Up and Backspace
14
+ * go back; Home and End go to the ends; Escape leaves.
15
+ *
16
+ * AT THE DOCUMENT, because a show has no field to focus and a clicker sends
17
+ * its key wherever focus is. A key a field is typing, a composition is using,
18
+ * or a nearer surface (a menu, a dialog) already handled is left alone, and
19
+ * modified keys are the browser's.
20
+ */
21
+ export declare function useSlideKeys({ onNext, onPrevious, onFirst, onLast, onExit, enabled }: SlideKeys): void;
@@ -0,0 +1,32 @@
1
+ /*
2
+ * SlideStage: a slide laid out at its authored size and scaled to its box.
3
+ *
4
+ * The box clips: a pinned element authored past the stage's edge is cut there,
5
+ * as it is on a projector, rather than spilling over the next thumbnail.
6
+ */
7
+
8
+ .crewlet-slide-stage {
9
+ position: relative;
10
+ overflow: hidden;
11
+ width: 100%;
12
+ background: var(--color-surface-inset);
13
+ }
14
+
15
+ .crewlet-slide-stage--contain {
16
+ height: 100%;
17
+ }
18
+
19
+ .crewlet-slide-stage__frame {
20
+ position: absolute;
21
+ top: 0;
22
+ left: 0;
23
+ transform-origin: 0 0;
24
+ overflow: hidden;
25
+ }
26
+
27
+ @media print {
28
+ .crewlet-slide-stage {
29
+ break-inside: avoid;
30
+ background: transparent;
31
+ }
32
+ }
@@ -1,10 +1,10 @@
1
- export { Switcher } from '../chunk-KG6XRG5Z.js';
1
+ export { Switcher } from '../chunk-5OY4LJFH.js';
2
2
  import '../chunk-W5J7R5EB.js';
3
3
  import '../chunk-F4DPAJCN.js';
4
4
  import '../chunk-F73MC7EZ.js';
5
+ import '../chunk-FYTIJM2T.js';
5
6
  import '../chunk-6QFAK2WV.js';
6
7
  import '../chunk-BWRGFKJP.js';
7
- import '../chunk-FYTIJM2T.js';
8
8
  import '../chunk-PQADV6P6.js';
9
9
  import '../chunk-IG75YMUN.js';
10
10
  import '../chunk-OG6CL3EB.js';
@@ -1,7 +1,7 @@
1
- export { TABLE_TAGS_CELL_LABELS, TableDateCell, TableEntityCell, TableKeyCell, TableNumberCell, TableStatusCell, TableTagsCell, TableTextCell } from '../chunk-MUGM7SEG.js';
1
+ export { TABLE_TAGS_CELL_LABELS, TableDateCell, TableEntityCell, TableKeyCell, TableNumberCell, TableStatusCell, TableTagsCell, TableTextCell } from '../chunk-LFNUH4GY.js';
2
+ import '../chunk-FBSEJO2C.js';
2
3
  import '../chunk-GFV4LJHH.js';
3
4
  import '../chunk-WIATRXEJ.js';
4
- import '../chunk-FBSEJO2C.js';
5
5
  import '../chunk-3CZ7XAVY.js';
6
6
  import '../chunk-EUCC37WY.js';
7
7
  import '../chunk-UAN5NE7M.js';
@@ -1,5 +1,5 @@
1
- export { TabPanel, Tabs, tabId } from '../chunk-XJFOOXCF.js';
2
- import '../chunk-CBOICT64.js';
1
+ export { TabPanel, Tabs, tabId } from '../chunk-HJEVSQN6.js';
2
+ import '../chunk-RKKO7QHH.js';
3
3
  import '../chunk-BHHIIK3M.js';
4
4
  import '../chunk-BZFWDIV6.js';
5
5
  import '../chunk-ODEQTPFM.js';
@@ -71,5 +71,6 @@ export declare function useRoving(count: number, select: ((index: number) => voi
71
71
  buttons: import("react").RefObject<(HTMLButtonElement | null)[]>;
72
72
  onKeyDown: (event: KeyboardEvent<HTMLElement>, vertical: boolean) => void;
73
73
  onFocusAt: (index: number) => void;
74
+ reset: () => void;
74
75
  focused: number | null;
75
76
  };
@@ -13,8 +13,23 @@ export interface TagGroupProps {
13
13
  * thirty-six service accounts.
14
14
  */
15
15
  max?: number | undefined;
16
+ /**
17
+ * What happens to the tags that do not fit.
18
+ *
19
+ * `expand` (the default) folds everything past `max` behind a "+N more"
20
+ * button that shows them in place.
21
+ *
22
+ * `fit` keeps the group on ONE LINE in whatever width it is given: the tags
23
+ * that would wrap are left out and counted in a static "+N" chip, so a tag is
24
+ * never cut mid-glyph by the box it sits in. It is for a dense row (a sheet
25
+ * cell, a table) where a button per row would be a tab stop per row; the
26
+ * group's name still says how many there are.
27
+ */
28
+ overflow?: 'expand' | 'fit' | undefined;
16
29
  /** The overflow control's label. */
17
30
  moreLabel?: ((hidden: number) => string) | undefined;
31
+ /** The `fit` count chip's text. */
32
+ countLabel?: ((hidden: number) => string) | undefined;
18
33
  /** What is said once the rest are shown. */
19
34
  expandedMessage?: ((total: number) => string) | undefined;
20
35
  className?: string | undefined;
@@ -38,4 +53,4 @@ export interface TagGroupProps {
38
53
  * expansion still works and the announcer says loudly that nothing was said,
39
54
  * which is the point of it being one region rather than one per component.
40
55
  */
41
- export declare function TagGroup({ label, max, moreLabel, expandedMessage, className, children, }: TagGroupProps): import("react").JSX.Element;
56
+ export declare function TagGroup({ label, max, overflow, moreLabel, countLabel, expandedMessage, className, children, }: TagGroupProps): import("react").JSX.Element;
@@ -1,4 +1,4 @@
1
- export { TagGroup } from '../chunk-E6UWRXNM.js';
1
+ export { TagGroup } from '../chunk-O2EGEONV.js';
2
2
  import '../chunk-RSAQOKH3.js';
3
3
  import '../chunk-BZFWDIV6.js';
4
4
  import '../chunk-ODEQTPFM.js';
@@ -25,6 +25,28 @@
25
25
  outline-offset: 2px;
26
26
  }
27
27
 
28
+ /* ONE LINE (overflow="fit"): what wraps is measured and left out, so the
29
+ line is clipped only for the instant before the count replaces it. */
30
+ .crewlet-tag-group--fit {
31
+ flex-wrap: wrap;
32
+ overflow: hidden;
33
+ max-height: max(24px, calc(24px * var(--density, 1)));
34
+ }
35
+
36
+ .crewlet-tag-group__count {
37
+ display: inline-flex;
38
+ align-items: center;
39
+ height: max(20px, calc(20px * var(--density, 1)));
40
+ padding: 0 var(--spacing-1);
41
+ border-radius: var(--radius-xs);
42
+ background: var(--color-surface-subtle);
43
+ color: var(--color-text-secondary);
44
+ font-family: var(--font-family-sans);
45
+ font-size: var(--font-size-2xs);
46
+ font-weight: var(--font-weight-medium);
47
+ white-space: nowrap;
48
+ }
49
+
28
50
  .crewlet-tag-group__item {
29
51
  display: inline-flex;
30
52
  min-width: 0;
@@ -1,6 +1,6 @@
1
- export { ThemeGallery } from '../chunk-KLIEPFEZ.js';
1
+ export { ThemeGallery } from '../chunk-C2FRTWKO.js';
2
2
  import '../chunk-MNFU2RNT.js';
3
3
  import '../chunk-F73MC7EZ.js';
4
- import '../chunk-CBOICT64.js';
4
+ import '../chunk-RKKO7QHH.js';
5
5
  import '../chunk-R25RGPUB.js';
6
6
  import '../chunk-ODEQTPFM.js';
@@ -1,10 +1,10 @@
1
- export { DensitySwitcher, ThemeSwitcher } from '../chunk-IPM2E6UI.js';
1
+ export { DensitySwitcher, ThemeSwitcher } from '../chunk-WJDQ7XQA.js';
2
2
  export { applyStoredPreferences, resolveTheme, useDensityPreference, useSystemTheme, useThemePreference } from '../chunk-Z24ZUSTX.js';
3
- import '../chunk-M54K52ZU.js';
3
+ import '../chunk-FQCLKD7U.js';
4
4
  export { DENSITY_PREFERENCES, PALETTE_ID, THEME_PREFERENCES, applyDensity, applyPalette, applyTheme, isDensityPreference, isPaletteId, isThemePreference } from '../chunk-ZXXDZJQN.js';
5
- import '../chunk-7QL2OFP6.js';
6
- import '../chunk-XJFOOXCF.js';
7
- import '../chunk-CBOICT64.js';
5
+ import '../chunk-RCQXUT5K.js';
6
+ import '../chunk-HJEVSQN6.js';
7
+ import '../chunk-RKKO7QHH.js';
8
8
  import '../chunk-BHHIIK3M.js';
9
9
  import '../chunk-BZFWDIV6.js';
10
10
  import '../chunk-ODEQTPFM.js';
@@ -1,6 +1,6 @@
1
- export { TreeCanvas } from '../chunk-TBIZSQHB.js';
1
+ export { TreeCanvas } from '../chunk-RSC7UJCR.js';
2
2
  import '../chunk-MY374UUD.js';
3
- import '../chunk-TXAFKH2A.js';
3
+ import '../chunk-KZOGQXSP.js';
4
4
  import '../chunk-VYOKRN2I.js';
5
5
  import '../chunk-OG6CL3EB.js';
6
6
  import '../chunk-HMPFGIWM.js';
@@ -43,6 +43,13 @@ export interface VersionCompareProps {
43
43
  from?: ReactNode;
44
44
  /** The newer version, drawn for the versions lens. With `from` left out it is drawn alone. */
45
45
  to?: ReactNode;
46
+ /**
47
+ * The versions lens, drawn by the host in place of the two panes: content
48
+ * compared item by item, where two independent panes could not line the
49
+ * items up (a deck's slides, paired by id, with added and removed ones in
50
+ * place).
51
+ */
52
+ versions?: ReactNode;
46
53
  /** A sentence over the versions lens: "Both versions show today's data." */
47
54
  note?: ReactNode;
48
55
  /** Controls at the end of the head, after the lens switch: "Back to the page". */
@@ -67,4 +74,4 @@ export interface VersionCompareProps {
67
74
  * A LENS THAT CANNOT BE DRAWN IS ABSENT, not offered and then empty: a first
68
75
  * version has nothing to compare with, and a sheet has no side by side.
69
76
  */
70
- export declare function VersionCompare({ fromLabel, toLabel, title, description, lens, onLensChange, before, after, changes, context, from, to, note, actions, labels: overrides, className, }: VersionCompareProps): import("react").JSX.Element;
77
+ export declare function VersionCompare({ fromLabel, toLabel, title, description, lens, onLensChange, before, after, changes, context, from, to, versions, note, actions, labels: overrides, className, }: VersionCompareProps): import("react").JSX.Element;