@crewlethq/ui 0.60.0 → 0.61.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.
- package/dist/Prose/Prose.d.ts +5 -2
- package/dist/Prose/index.js +1 -1
- package/dist/{Prose-BTXNFT2Q.css → Prose-OMV2T6NT.css} +19 -2
- package/dist/RichEditor/index.js +1 -1
- package/dist/SendButton/SendButton.d.ts +25 -11
- package/dist/SendButton/index.d.ts +1 -0
- package/dist/SendButton/index.js +1 -1
- package/dist/SendButton-L4UX54XS.css +173 -0
- package/dist/ThinkingIndicator/ThinkingIndicator.d.ts +37 -0
- package/dist/ThinkingIndicator/index.d.ts +3 -0
- package/dist/ThinkingIndicator/index.js +3 -0
- package/dist/ThinkingIndicator-QJMX2TXC.css +122 -0
- package/dist/{chunk-V57TGM2L.js → chunk-5MN2HISF.js} +1 -1
- package/dist/{chunk-JCSA3XVH.js → chunk-DVVP27OD.js} +1 -1
- package/dist/chunk-E2MIUNUU.js +19 -0
- package/dist/chunk-PBR5C5MX.js +33 -0
- package/dist/generated/index.d.ts +1 -0
- package/dist/generated/index.js +19 -18
- package/dist/index.js +19 -18
- package/dist/styles.css +321 -3
- package/package.json +3 -3
- package/dist/chunk-XN5L5E5D.js +0 -27
- package/dist/{Editor-EQBOZPXS.js → Editor-DM7X24B7.js} +1 -1
- /package/dist/{chunk-DJV2FVD2.js → chunk-OXZKRUGM.js} +0 -0
package/dist/Prose/Prose.d.ts
CHANGED
|
@@ -5,8 +5,11 @@ export interface ProseProps extends HTMLAttributes<HTMLElement> {
|
|
|
5
5
|
as?: ElementType | undefined;
|
|
6
6
|
tone?: ProseTone | undefined;
|
|
7
7
|
/**
|
|
8
|
-
* The text is still arriving. It draws a caret
|
|
9
|
-
* the
|
|
8
|
+
* The text is still arriving. It draws a caret at the end of the last line
|
|
9
|
+
* of text (after the last paragraph or heading of rendered Markdown, and
|
|
10
|
+
* none on an empty block), and the caret holds still under a reduced-motion
|
|
11
|
+
* preference. A chat answer draws `ThinkingIndicator` after its prose
|
|
12
|
+
* instead, which never sits inside the words.
|
|
10
13
|
*/
|
|
11
14
|
streaming?: boolean | undefined;
|
|
12
15
|
/**
|
package/dist/Prose/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Prose } from '../chunk-
|
|
1
|
+
export { Prose } from '../chunk-DVVP27OD.js';
|
|
2
2
|
import '../chunk-ODEQTPFM.js';
|
|
@@ -61,7 +61,23 @@
|
|
|
61
61
|
transition: color var(--motion-duration-slow) var(--motion-easing-default);
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
/*
|
|
65
|
+
* THE CARET ENDS THE LAST LINE OF TEXT, never a line of its own. On a block
|
|
66
|
+
* that holds rendered Markdown, the block's own ::after came after its last
|
|
67
|
+
* paragraph or list, so the caret stood alone on a new line; and on a reply
|
|
68
|
+
* with no words yet it stood alone at the start. So: no caret on an empty
|
|
69
|
+
* block, none on the block itself when its children are blocks, and the caret
|
|
70
|
+
* after the last child instead when that child is a paragraph or a heading,
|
|
71
|
+
* whose last line it then ends. A list, a table or code last draws none: a
|
|
72
|
+
* caret after its final row reads as a stray mark, not as the end of a line.
|
|
73
|
+
*/
|
|
74
|
+
.crewlet-prose--streaming:empty::after,
|
|
75
|
+
.crewlet-prose--streaming:has(> :is(p, div, ul, ol, pre, table, blockquote, h1, h2, h3, h4, h5, h6))::after {
|
|
76
|
+
content: none;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.crewlet-prose--streaming::after,
|
|
80
|
+
.crewlet-prose--streaming > :is(p, h1, h2, h3, h4, h5, h6):last-child::after {
|
|
65
81
|
content: '';
|
|
66
82
|
display: inline-block;
|
|
67
83
|
width: 2px;
|
|
@@ -93,7 +109,8 @@
|
|
|
93
109
|
transition: none;
|
|
94
110
|
}
|
|
95
111
|
|
|
96
|
-
.crewlet-prose--streaming::after
|
|
112
|
+
.crewlet-prose--streaming::after,
|
|
113
|
+
.crewlet-prose--streaming > :is(p, h1, h2, h3, h4, h5, h6):last-child::after {
|
|
97
114
|
animation: none;
|
|
98
115
|
}
|
|
99
116
|
}
|
package/dist/RichEditor/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { RichEditor, preloadRichEditor } from '../chunk-
|
|
1
|
+
export { RichEditor, preloadRichEditor } from '../chunk-5MN2HISF.js';
|
|
2
2
|
export { RICH_EDITOR_LABELS, richEditorLabels } from '../chunk-CSQTDGTS.js';
|
|
3
3
|
import '../chunk-BAKPMH3S.js';
|
|
4
4
|
import '../chunk-BPCY7ZID.js';
|
|
@@ -2,9 +2,9 @@ import { type IconButtonProps } from '../IconButton/index.js';
|
|
|
2
2
|
/** Whether the button sends the message or stops the request already running. */
|
|
3
3
|
export type SendButtonMode = 'send' | 'stop';
|
|
4
4
|
export interface SendButtonLabels {
|
|
5
|
-
/** The send button's name
|
|
5
|
+
/** The send button's name. */
|
|
6
6
|
send: string;
|
|
7
|
-
/** The stop button's name
|
|
7
|
+
/** The stop button's name. */
|
|
8
8
|
stop: string;
|
|
9
9
|
}
|
|
10
10
|
export declare const SEND_BUTTON_LABELS: SendButtonLabels;
|
|
@@ -14,10 +14,14 @@ export interface SendButtonProps extends Omit<IconButtonProps, 'label' | 'icon'
|
|
|
14
14
|
/** Called on a press in either mode: the caller sends, or stops what is running. */
|
|
15
15
|
onPress: () => void;
|
|
16
16
|
/**
|
|
17
|
-
* Why it cannot
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
17
|
+
* Why it cannot be pressed right now, in a few words. Soft disabled, as
|
|
18
|
+
* every disabled control here is: it keeps its place in the tab order, a
|
|
19
|
+
* screen reader is told the reason, and the pointer's tooltip says it.
|
|
20
|
+
*
|
|
21
|
+
* In `send` mode it is why there is nothing to send ("Type a question
|
|
22
|
+
* first", "Offline"). In `stop` mode it is a stop already under way
|
|
23
|
+
* ("Stopping"), which a second press could not hurry; leave it out while
|
|
24
|
+
* the request runs and Stop is always available.
|
|
21
25
|
*/
|
|
22
26
|
disabledReason?: string | undefined;
|
|
23
27
|
labels?: Partial<SendButtonLabels> | undefined;
|
|
@@ -27,12 +31,22 @@ export interface SendButtonProps extends Omit<IconButtonProps, 'label' | 'icon'
|
|
|
27
31
|
*
|
|
28
32
|
* ONE ELEMENT IN BOTH MODES, so the button a keyboard reader is on stays
|
|
29
33
|
* focused when the request starts or ends: it changes what it says ("Send",
|
|
30
|
-
* "Stop") and how it looks, never which element it is.
|
|
34
|
+
* "Stop") and how it looks, never which element it is. Both glyphs are drawn
|
|
35
|
+
* in one cell and the one not in use is faded and scaled away, so the change
|
|
36
|
+
* is a short cross fade in place rather than a swap.
|
|
37
|
+
*
|
|
38
|
+
* SEND is the accent square with the arrow, the one decision in the composer.
|
|
39
|
+
* With nothing to send it is not a faded accent, which read as a muddy block
|
|
40
|
+
* on the dark ground: it is the accent's soft tint with the arrow in the
|
|
41
|
+
* tertiary ink, and it lights up in the accent the moment there is something
|
|
42
|
+
* to send.
|
|
43
|
+
*
|
|
44
|
+
* STOP is the bordered square with a small filled square in the primary ink,
|
|
45
|
+
* the mark every media control uses for "stop", and an accent arc travelling
|
|
46
|
+
* round its edge while the request runs: the button says both that something
|
|
47
|
+
* is under way and how to end it. Stop is quieter than Send on purpose, a way
|
|
48
|
+
* out rather than the decision.
|
|
31
49
|
*
|
|
32
|
-
* SEND is the accent square (IconButton `primary`) with the arrow; STOP is the
|
|
33
|
-
* bordered square (IconButton `secondary`) with a filled square in the primary
|
|
34
|
-
* ink. Stop is quieter than Send on purpose: an inverse block was the loudest
|
|
35
|
-
* thing on the panel in dark mode, and Stop is a way out, not the decision.
|
|
36
50
|
* Inside a `Composer`'s `trailing` slot its corner nests in the composer's.
|
|
37
51
|
*/
|
|
38
52
|
export declare const SendButton: import("react").ForwardRefExoticComponent<SendButtonProps & import("react").RefAttributes<HTMLButtonElement>>;
|
package/dist/SendButton/index.js
CHANGED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* A chat composer's Send, which becomes Stop. See SendButton.tsx for what each
|
|
3
|
+
* state says. The surfaces, edges and hover and press inks are IconButton's
|
|
4
|
+
* primary and secondary squares; this sheet adds the glyph cross fade, the
|
|
5
|
+
* quiet held state, the press and the running arc.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
* THE ARC'S ANGLE, registered so it can turn. An unregistered custom property
|
|
10
|
+
* animates in one step at the halfway point, which would make the arc jump
|
|
11
|
+
* between two places rather than travel.
|
|
12
|
+
*/
|
|
13
|
+
@property --crewlet-send-button-arc {
|
|
14
|
+
syntax: '<angle>';
|
|
15
|
+
inherits: false;
|
|
16
|
+
initial-value: 0deg;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.crewlet-send-button {
|
|
20
|
+
position: relative;
|
|
21
|
+
transition:
|
|
22
|
+
background var(--motion-duration-fast) var(--motion-easing-default),
|
|
23
|
+
border-color var(--motion-duration-fast) var(--motion-easing-default),
|
|
24
|
+
color var(--motion-duration-fast) var(--motion-easing-default),
|
|
25
|
+
transform var(--motion-duration-instant) var(--motion-easing-out);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* A press sinks the square a little, so the pointer feels it land. */
|
|
29
|
+
.crewlet-send-button:active:not([aria-disabled='true']) {
|
|
30
|
+
transform: scale(0.94);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/*
|
|
34
|
+
* BOTH GLYPHS IN ONE CELL. The one in use stands at full size; the other is
|
|
35
|
+
* faded and scaled to half, and the two trade places on the base step with
|
|
36
|
+
* the entering surface's ease, so Send turning into Stop reads as one control
|
|
37
|
+
* changing its mind rather than as two buttons swapping.
|
|
38
|
+
*/
|
|
39
|
+
.crewlet-send-button__glyphs {
|
|
40
|
+
display: grid;
|
|
41
|
+
place-items: center;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.crewlet-send-button__glyph {
|
|
45
|
+
grid-area: 1 / 1;
|
|
46
|
+
transition:
|
|
47
|
+
opacity var(--motion-duration-base) var(--motion-easing-default),
|
|
48
|
+
transform var(--motion-duration-base) var(--motion-easing-emphasized);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.crewlet-send-button--send .crewlet-send-button__glyph--stop,
|
|
52
|
+
.crewlet-send-button--stop .crewlet-send-button__glyph--send {
|
|
53
|
+
opacity: 0;
|
|
54
|
+
transform: scale(0.5);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/*
|
|
58
|
+
* THE STOP SQUARE IS SMALLER THAN THE ARROW: a filled block at the arrow's
|
|
59
|
+
* 14px was the heaviest mark on the panel. At the 12px step its square is
|
|
60
|
+
* nine pixels, crisp on the pixel grid and the weight of the arrow's stroke.
|
|
61
|
+
*/
|
|
62
|
+
.crewlet-send-button.crewlet-icon-btn--md .crewlet-send-button__glyph--stop {
|
|
63
|
+
width: var(--font-size-xs);
|
|
64
|
+
height: var(--font-size-xs);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/*
|
|
68
|
+
* HELD, AT FULL OPACITY, with the glyph in the tertiary ink. A faded accent
|
|
69
|
+
* block read as a muddy, broken button on the dark ground, and the composer's
|
|
70
|
+
* own fade multiplied it further. Send held is the accent's soft tint, so it
|
|
71
|
+
* is still the purple control that lights up the moment there is something
|
|
72
|
+
* to send; Stop held (a stop already under way) is the neutral hover overlay,
|
|
73
|
+
* since nothing about it is waiting to light up.
|
|
74
|
+
*/
|
|
75
|
+
.crewlet-send-button.crewlet-icon-btn[aria-disabled='true'] {
|
|
76
|
+
opacity: 1;
|
|
77
|
+
border-color: transparent;
|
|
78
|
+
color: var(--color-text-tertiary);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.crewlet-send-button--send.crewlet-icon-btn[aria-disabled='true'] {
|
|
82
|
+
background: var(--color-brand-accent-soft);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.crewlet-send-button--stop.crewlet-icon-btn[aria-disabled='true'] {
|
|
86
|
+
background: var(--color-surface-hover);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/*
|
|
90
|
+
* THE RUNNING ARC: a band of the accent travelling round Stop's edge, over its
|
|
91
|
+
* own 1px border, with a tail that fades behind it. The band is a conic
|
|
92
|
+
* gradient cut to a 2px ring by a mask (a mask reads only alpha, so its black
|
|
93
|
+
* is opacity rather than a colour), so it follows the rounded corner exactly.
|
|
94
|
+
* One round is the working ring's sweep period, and it fades in on the
|
|
95
|
+
* moderate step as Stop arrives.
|
|
96
|
+
*/
|
|
97
|
+
.crewlet-send-button--stop::before {
|
|
98
|
+
content: '';
|
|
99
|
+
position: absolute;
|
|
100
|
+
inset: -1px;
|
|
101
|
+
padding: 2px;
|
|
102
|
+
border-radius: inherit;
|
|
103
|
+
background: conic-gradient(
|
|
104
|
+
from var(--crewlet-send-button-arc),
|
|
105
|
+
transparent 0turn,
|
|
106
|
+
transparent 0.55turn,
|
|
107
|
+
var(--color-brand-accent) 1turn
|
|
108
|
+
);
|
|
109
|
+
-webkit-mask:
|
|
110
|
+
linear-gradient(#000 0 0) content-box,
|
|
111
|
+
linear-gradient(#000 0 0);
|
|
112
|
+
-webkit-mask-composite: xor;
|
|
113
|
+
mask:
|
|
114
|
+
linear-gradient(#000 0 0) content-box exclude,
|
|
115
|
+
linear-gradient(#000 0 0);
|
|
116
|
+
/* Paint, never a target. */
|
|
117
|
+
pointer-events: none;
|
|
118
|
+
animation:
|
|
119
|
+
crewlet-send-button-arc var(--motion-duration-sweep) linear infinite,
|
|
120
|
+
crewlet-send-button-arc-in var(--motion-duration-moderate) var(--motion-easing-out);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/* A stop already under way has nothing left to show running. */
|
|
124
|
+
.crewlet-send-button--stop[aria-disabled='true']::before {
|
|
125
|
+
display: none;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
@keyframes crewlet-send-button-arc {
|
|
129
|
+
to {
|
|
130
|
+
--crewlet-send-button-arc: 360deg;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
@keyframes crewlet-send-button-arc-in {
|
|
135
|
+
from {
|
|
136
|
+
opacity: 0;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
to {
|
|
140
|
+
opacity: 1;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/*
|
|
145
|
+
* UNDER REDUCED MOTION nothing travels or scales: the glyphs change in place,
|
|
146
|
+
* and the arc becomes the whole edge in the accent, still and still saying
|
|
147
|
+
* that something runs.
|
|
148
|
+
*/
|
|
149
|
+
@media (prefers-reduced-motion: reduce) {
|
|
150
|
+
.crewlet-send-button {
|
|
151
|
+
transition: none;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.crewlet-send-button:active:not([aria-disabled='true']) {
|
|
155
|
+
transform: none;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
.crewlet-send-button__glyph {
|
|
159
|
+
transition: none;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.crewlet-send-button--stop::before {
|
|
163
|
+
background: var(--color-brand-accent);
|
|
164
|
+
animation: none;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/* The system draws its own edge; a masked gradient is not repainted there. */
|
|
169
|
+
@media (forced-colors: active) {
|
|
170
|
+
.crewlet-send-button--stop::before {
|
|
171
|
+
display: none;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { HTMLAttributes } from 'react';
|
|
2
|
+
export interface ThinkingIndicatorProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {
|
|
3
|
+
/**
|
|
4
|
+
* What the assistant is doing now, beside the mark, under a slow shimmer:
|
|
5
|
+
* "Thinking", then the step that runs ("Listing the agents"). Left out, the
|
|
6
|
+
* mark stands alone, as it does while an answer's words arrive.
|
|
7
|
+
*/
|
|
8
|
+
status?: string | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* What a screen reader is told, once, when the indicator appears.
|
|
11
|
+
* "Thinking" by default. It never changes with `status`, so a reader is not
|
|
12
|
+
* told every step the assistant takes while they read.
|
|
13
|
+
*/
|
|
14
|
+
label?: string | undefined;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The assistant at work, drawn where its answer will be: the Assistant's mark
|
|
18
|
+
* with its four blades turning a quarter at a time around a still core, and,
|
|
19
|
+
* while nothing of the answer is on screen yet, a line saying what it is doing
|
|
20
|
+
* under a slow shimmer.
|
|
21
|
+
*
|
|
22
|
+
* IN PLACE OF A CARET. A blinking bar after streamed text lands wherever the
|
|
23
|
+
* last block ends, on a line of its own under a list or at the start of an
|
|
24
|
+
* empty reply. The mark is a block of its own after the answer, one line of
|
|
25
|
+
* prose tall, so it never sits inside the words, and nothing moves when the
|
|
26
|
+
* first of them arrive: they are written above it, and it keeps its height.
|
|
27
|
+
*
|
|
28
|
+
* ONE ANNOUNCEMENT. `label` is said once, through a status region that keeps
|
|
29
|
+
* the same words for as long as the indicator stands; the visible line, which
|
|
30
|
+
* changes with every step, is hidden from assistive technology, where the
|
|
31
|
+
* steps are read from their own list.
|
|
32
|
+
*
|
|
33
|
+
* UNDER REDUCED MOTION the blades hold still and the line is drawn in the
|
|
34
|
+
* secondary ink without the shimmer: the mark and the words still say that
|
|
35
|
+
* work is under way.
|
|
36
|
+
*/
|
|
37
|
+
export declare function ThinkingIndicator({ status, label, className, ...rest }: ThinkingIndicatorProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* The assistant at work: the Assistant's mark, its blades turning, and a line
|
|
3
|
+
* of status under a shimmer. See ThinkingIndicator.tsx for why it replaces a
|
|
4
|
+
* caret and how it is announced.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/*
|
|
8
|
+
* ONE LINE OF PROSE TALL, at every state: the mark alone, the mark with a
|
|
9
|
+
* status line, and the line changing from one step to the next all keep the
|
|
10
|
+
* same height, so the thread never moves while the assistant works.
|
|
11
|
+
*/
|
|
12
|
+
.crewlet-thinking {
|
|
13
|
+
display: flex;
|
|
14
|
+
align-items: center;
|
|
15
|
+
gap: var(--spacing-2);
|
|
16
|
+
min-width: 0;
|
|
17
|
+
min-height: calc(var(--font-size-compact) * var(--font-line-height-relaxed));
|
|
18
|
+
font-family: var(--font-family-sans);
|
|
19
|
+
font-size: var(--font-size-compact);
|
|
20
|
+
line-height: var(--font-line-height-relaxed);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/*
|
|
24
|
+
* THE BLADES TURN A QUARTER, THEN REST. The figure is four blades around a
|
|
25
|
+
* core, the same after a quarter turn, so each round ends where the next
|
|
26
|
+
* begins and the loop never shows a seam. One round is the breath period
|
|
27
|
+
* (2.2s): the turn takes its first half on the in-out ease and the second
|
|
28
|
+
* half is still, which reads as steady thought rather than as a spinner. The
|
|
29
|
+
* core holds still, as the mark's own description promises.
|
|
30
|
+
*/
|
|
31
|
+
.crewlet-thinking__mark [data-motion='turn'] {
|
|
32
|
+
transform-box: view-box;
|
|
33
|
+
transform-origin: 50% 50%;
|
|
34
|
+
animation: crewlet-thinking-turn var(--motion-duration-breath) var(--motion-easing-in-out) infinite;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
@keyframes crewlet-thinking-turn {
|
|
38
|
+
0% {
|
|
39
|
+
transform: rotate(0deg);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
50%,
|
|
43
|
+
100% {
|
|
44
|
+
transform: rotate(90deg);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/*
|
|
49
|
+
* THE SHIMMER IS A LIGHTER BAND CROSSING THE WORDS, the band Skeleton sweeps
|
|
50
|
+
* across a placeholder, set in ink rather than in surface: the words are the
|
|
51
|
+
* secondary ink at rest, so they read at every point of the sweep, and the
|
|
52
|
+
* band is the primary ink. The gradient is clipped to the glyphs and is three
|
|
53
|
+
* times the line's width, so the band crosses it rather than standing in it.
|
|
54
|
+
*/
|
|
55
|
+
.crewlet-thinking__status {
|
|
56
|
+
min-width: 0;
|
|
57
|
+
overflow: hidden;
|
|
58
|
+
color: var(--color-text-secondary);
|
|
59
|
+
text-overflow: ellipsis;
|
|
60
|
+
white-space: nowrap;
|
|
61
|
+
animation: crewlet-thinking-enter var(--motion-duration-moderate) var(--motion-easing-out);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
@supports (background-clip: text) or (-webkit-background-clip: text) {
|
|
65
|
+
.crewlet-thinking__status {
|
|
66
|
+
background-image: linear-gradient(
|
|
67
|
+
90deg,
|
|
68
|
+
var(--color-text-secondary) 0%,
|
|
69
|
+
var(--color-text-secondary) 40%,
|
|
70
|
+
var(--color-text-primary) 50%,
|
|
71
|
+
var(--color-text-secondary) 60%,
|
|
72
|
+
var(--color-text-secondary) 100%
|
|
73
|
+
);
|
|
74
|
+
background-size: 300% 100%;
|
|
75
|
+
-webkit-background-clip: text;
|
|
76
|
+
background-clip: text;
|
|
77
|
+
color: transparent;
|
|
78
|
+
animation:
|
|
79
|
+
crewlet-thinking-enter var(--motion-duration-moderate) var(--motion-easing-out),
|
|
80
|
+
crewlet-thinking-shimmer var(--motion-duration-breath) linear infinite;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
@keyframes crewlet-thinking-shimmer {
|
|
85
|
+
from {
|
|
86
|
+
background-position: 100% 50%;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
to {
|
|
90
|
+
background-position: 0 50%;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
@keyframes crewlet-thinking-enter {
|
|
95
|
+
from {
|
|
96
|
+
opacity: 0;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
to {
|
|
100
|
+
opacity: 1;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
@media (prefers-reduced-motion: reduce) {
|
|
105
|
+
.crewlet-thinking__mark [data-motion='turn'] {
|
|
106
|
+
animation: none;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.crewlet-thinking__status {
|
|
110
|
+
background-image: none;
|
|
111
|
+
color: var(--color-text-secondary);
|
|
112
|
+
animation: none;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/* The system's own ink: a gradient clipped to text is dropped there. */
|
|
117
|
+
@media (forced-colors: active) {
|
|
118
|
+
.crewlet-thinking__status {
|
|
119
|
+
background-image: none;
|
|
120
|
+
color: CanvasText;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
@@ -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-
|
|
12
|
+
loading ??= import('./Editor-DM7X24B7.js').then(
|
|
13
13
|
(module) => {
|
|
14
14
|
engine = module.Editor;
|
|
15
15
|
return engine;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { VisuallyHidden } from './chunk-UT6CW3C7.js';
|
|
2
|
+
import { cx } from './chunk-ODEQTPFM.js';
|
|
3
|
+
import './ThinkingIndicator-QJMX2TXC.css';
|
|
4
|
+
import { ProductMark } from '@crewlethq/icons/product-mark';
|
|
5
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
function ThinkingIndicator({ status, label = "Thinking", className, ...rest }) {
|
|
8
|
+
return /* @__PURE__ */ jsxs("div", { ...rest, className: cx("crewlet-thinking", className), children: [
|
|
9
|
+
/* @__PURE__ */ jsx(ProductMark, { product: "assistant", size: "md", className: "crewlet-thinking__mark" }),
|
|
10
|
+
status === void 0 || status === "" ? null : (
|
|
11
|
+
// Keyed by its words, so a new step's line fades in rather than
|
|
12
|
+
// swapping in place mid shimmer.
|
|
13
|
+
/* @__PURE__ */ jsx("span", { className: "crewlet-thinking__status", "aria-hidden": "true", children: status }, status)
|
|
14
|
+
),
|
|
15
|
+
/* @__PURE__ */ jsx(VisuallyHidden, { children: /* @__PURE__ */ jsx("span", { role: "status", children: label }) })
|
|
16
|
+
] });
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export { ThinkingIndicator };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { IconButton } from './chunk-2XWFWNDT.js';
|
|
2
|
+
import { cx } from './chunk-ODEQTPFM.js';
|
|
3
|
+
import './SendButton-L4UX54XS.css';
|
|
4
|
+
import { forwardRef } from 'react';
|
|
5
|
+
import { ArrowUpGlyph, SquareGlyph } from '@crewlethq/icons/glyphs';
|
|
6
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
var SEND_BUTTON_LABELS = { send: "Send", stop: "Stop" };
|
|
9
|
+
var SendButton = forwardRef(function SendButton2({ mode, onPress, disabledReason, labels: overrides, className, title, ...rest }, ref) {
|
|
10
|
+
const labels = overrides ? { ...SEND_BUTTON_LABELS, ...overrides } : SEND_BUTTON_LABELS;
|
|
11
|
+
const stopping = mode === "stop";
|
|
12
|
+
const name = stopping ? labels.stop : labels.send;
|
|
13
|
+
return /* @__PURE__ */ jsx(
|
|
14
|
+
IconButton,
|
|
15
|
+
{
|
|
16
|
+
...rest,
|
|
17
|
+
ref,
|
|
18
|
+
size: "md",
|
|
19
|
+
variant: stopping ? "secondary" : "primary",
|
|
20
|
+
label: name,
|
|
21
|
+
title: disabledReason ?? title ?? name,
|
|
22
|
+
icon: /* @__PURE__ */ jsxs("span", { className: "crewlet-send-button__glyphs", "aria-hidden": "true", children: [
|
|
23
|
+
/* @__PURE__ */ jsx(ArrowUpGlyph, { className: "crewlet-send-button__glyph crewlet-send-button__glyph--send" }),
|
|
24
|
+
/* @__PURE__ */ jsx(SquareGlyph, { filled: true, className: "crewlet-send-button__glyph crewlet-send-button__glyph--stop" })
|
|
25
|
+
] }),
|
|
26
|
+
disabledReason,
|
|
27
|
+
className: cx("crewlet-send-button", `crewlet-send-button--${mode}`, className),
|
|
28
|
+
onClick: onPress
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
export { SEND_BUTTON_LABELS, SendButton };
|
|
@@ -207,6 +207,7 @@ export * from '../ThemeGallery/index.js';
|
|
|
207
207
|
export * from '../ThemeSwatch/index.js';
|
|
208
208
|
export * from '../ThemeSwitcher/index.js';
|
|
209
209
|
export * from '../ThemeToggle/index.js';
|
|
210
|
+
export * from '../ThinkingIndicator/index.js';
|
|
210
211
|
export * from '../TileGrid/index.js';
|
|
211
212
|
export * from '../TimeRangePicker/index.js';
|
|
212
213
|
export * from '../TimeWindowPicker/index.js';
|
package/dist/generated/index.js
CHANGED
|
@@ -1,69 +1,70 @@
|
|
|
1
|
-
import '../chunk-
|
|
1
|
+
import '../chunk-OXZKRUGM.js';
|
|
2
2
|
export { WidgetFrame } from '../chunk-3DMPZZQ6.js';
|
|
3
3
|
export { ElementToPngError, elementToPng, parseCsv, serializeElement, toCsv } from '../chunk-FEJANUZK.js';
|
|
4
4
|
export { TreeCanvas } from '../chunk-5NJ4BIUA.js';
|
|
5
5
|
export { TypeSpecimen } from '../chunk-JKAFEFFC.js';
|
|
6
6
|
export { VERSION_COMPARE_LABELS, VERSION_COMPARE_LENSES, VersionCompare } from '../chunk-NL72YZWF.js';
|
|
7
7
|
export { VersionTimeline } from '../chunk-TUNEMQXF.js';
|
|
8
|
-
export { DensitySwitcher, ThemeSwitcher } from '../chunk-53NTMTRM.js';
|
|
9
8
|
export { ThemeToggle } from '../chunk-RLFPBRN4.js';
|
|
10
|
-
export {
|
|
9
|
+
export { ThinkingIndicator } from '../chunk-E2MIUNUU.js';
|
|
11
10
|
export { TileGrid } from '../chunk-Q6CQMS6R.js';
|
|
12
11
|
export { TIME_RANGE_CUSTOM, TIME_RANGE_PICKER_LABELS, TimeRangePicker, timeRangeFieldKey, timeRangeProblem } from '../chunk-LND6XSXN.js';
|
|
13
12
|
export { DEFAULT_TIME_WINDOW_LABELS, TIME_WINDOW_SPANS, TimeWindowPicker, describeTimeWindow, isTimeWindowSet, parseTimeWindowDuration, resolveTimeWindow, timeWindowMatchesPreset } from '../chunk-SG2375ZY.js';
|
|
14
13
|
export { ToastProvider, Toaster, toasterInsetStyle, useToast } from '../chunk-XQBLBJN4.js';
|
|
15
|
-
export { TABLE_TAGS_CELL_LABELS, TableDateCell, TableEntityCell, TableKeyCell, TableNumberCell, TableStatusCell, TableTagsCell, TableTextCell } from '../chunk-U4AXQI6U.js';
|
|
16
14
|
export { TagsInput } from '../chunk-VSTD65SL.js';
|
|
17
15
|
export { ThemeGallery } from '../chunk-ESUZ27TS.js';
|
|
18
16
|
export { ThemeSwatch } from '../chunk-MNFU2RNT.js';
|
|
19
|
-
export {
|
|
17
|
+
export { DensitySwitcher, ThemeSwitcher } from '../chunk-53NTMTRM.js';
|
|
18
|
+
export { applyStoredPreferences, resolveTheme, useDensityPreference, useSystemTheme, useThemePreference } from '../chunk-Z24ZUSTX.js';
|
|
19
|
+
export { StatGroup } from '../chunk-OUD75UB2.js';
|
|
20
20
|
export { SuggestionList, SuggestionRow } from '../chunk-YBI7M2JH.js';
|
|
21
21
|
export { Switcher } from '../chunk-ZRKUTFYE.js';
|
|
22
|
-
export {
|
|
22
|
+
export { TABLE_TAGS_CELL_LABELS, TableDateCell, TableEntityCell, TableKeyCell, TableNumberCell, TableStatusCell, TableTagsCell, TableTextCell } from '../chunk-U4AXQI6U.js';
|
|
23
|
+
export { SLIDE_COMPARE_LABELS, SlideCompare } from '../chunk-W2Q5DZJB.js';
|
|
23
24
|
export { SlideGrid } from '../chunk-3V5T5K5H.js';
|
|
24
25
|
export { SOURCE_EDITOR_KEYS, SourceEditor, lineStart } from '../chunk-CVDK3LDB.js';
|
|
25
26
|
export { StatCard } from '../chunk-VO2PDDRE.js';
|
|
26
|
-
export {
|
|
27
|
+
export { Statement } from '../chunk-MZJKPTA5.js';
|
|
27
28
|
export { SHEET_COLUMN_EDITOR_LABELS, SheetColumnEditor, SheetColumnTypeGlyph } from '../chunk-5PMFRAGL.js';
|
|
28
29
|
export { CellDisplay, CellEditor, CheckboxCell, DateCell, LongTextCell, MultiSelectCell, NumberCell, PersonCell, RatingCell, SelectCell, SheetCell, SheetGrid, StatusCell, TextCell, UrlCell } from '../chunk-WXSGCYZO.js';
|
|
29
30
|
export { TagGroup } from '../chunk-4U2D6BPR.js';
|
|
30
31
|
export { matchesShortcut, useShortcut } from '../chunk-AYHIF6DH.js';
|
|
31
32
|
import '../chunk-73GUXYYE.js';
|
|
32
|
-
export {
|
|
33
|
+
export { SlideFilmstrip } from '../chunk-XLJPLCK6.js';
|
|
33
34
|
export { SegmentedMeter, segmentedMeterLabel } from '../chunk-4AK52VHB.js';
|
|
34
35
|
export { SelectionBar } from '../chunk-6Z4JZHRB.js';
|
|
35
|
-
export { SEND_BUTTON_LABELS, SendButton } from '../chunk-
|
|
36
|
+
export { SEND_BUTTON_LABELS, SendButton } from '../chunk-PBR5C5MX.js';
|
|
36
37
|
export { SettingsTable, SettingsTableRow } from '../chunk-4RKTZSEW.js';
|
|
37
38
|
export { SetupWizard } from '../chunk-T4THNJ6E.js';
|
|
38
39
|
export { ARTIFACT_ROLES, SHAREABLE_ROLES, ShareDialog, roleAtLeast } from '../chunk-B5ZHJWAZ.js';
|
|
39
40
|
export { Select } from '../chunk-XQZ6EWOE.js';
|
|
40
41
|
export { ReviewList } from '../chunk-OJ2QULVH.js';
|
|
42
|
+
export { RichEditor, preloadRichEditor } from '../chunk-5MN2HISF.js';
|
|
43
|
+
export { RICH_EDITOR_LABELS, richEditorLabels } from '../chunk-CSQTDGTS.js';
|
|
41
44
|
export { canonicalMarkdown, roundTripMarkdown } from '../chunk-SWD4QBL6.js';
|
|
42
45
|
import '../chunk-QH6VYJ3X.js';
|
|
43
|
-
export { RichEditor, preloadRichEditor } from '../chunk-V57TGM2L.js';
|
|
44
|
-
export { RICH_EDITOR_LABELS, richEditorLabels } from '../chunk-CSQTDGTS.js';
|
|
45
46
|
export { RUN_STATES, RunChip } from '../chunk-75QASA62.js';
|
|
46
47
|
export { STEP_STATES, STEP_STATE_LABELS, StepList, StepStateMark, Stepper, stepDetailPieces } from '../chunk-Z4EKUMZW.js';
|
|
47
48
|
export { FRAME_HELLO_TIMEOUT_MS, FRAME_LOAD_GRACE_MS, SandboxedFrame, SandboxedFrameNotice, SandboxedFramePlaceholder } from '../chunk-WR7UDG7U.js';
|
|
48
49
|
export { SearchTrigger } from '../chunk-YZR57QGE.js';
|
|
49
50
|
export { SectionFrame, SectionFrameBody, SectionFrameNav } from '../chunk-SHLP2BNA.js';
|
|
50
51
|
export { NavGroup, NavItem, SidebarNav } from '../chunk-B53FUJ53.js';
|
|
51
|
-
export { QR_DARK, QR_LIGHT, QR_QUIET_ZONE, QrCode, qrModulePath, qrModules } from '../chunk-Y56FM3K4.js';
|
|
52
52
|
export { ReadingPane, ReadingPaneByline, ReadingPaneLead, ReadingPaneOutcome, ReadingPaneQuote, ReadingPaneReasoning, ReadingPaneSection, ReadingPaneTitle } from '../chunk-ZAJHGDAW.js';
|
|
53
|
+
export { Prose } from '../chunk-DVVP27OD.js';
|
|
53
54
|
export { REFUSAL_CARD_LABELS, RefusalCard } from '../chunk-JE4FCRVL.js';
|
|
54
55
|
export { RelatedRow } from '../chunk-MYJZCSMA.js';
|
|
55
56
|
export { Text } from '../chunk-QP2P6GDQ.js';
|
|
56
57
|
export { RESULT_TABLE_CARD_LABELS, RESULT_TABLE_COLLAPSED_ROWS, RESULT_TABLE_MAX_ROWS, ResultTableCard } from '../chunk-OM6CPZB7.js';
|
|
57
58
|
export { Table } from '../chunk-5DJMFRSZ.js';
|
|
58
|
-
export { PresenceStack } from '../chunk-FGRJXZUU.js';
|
|
59
59
|
export { PresenterView, formatStopwatch } from '../chunk-P5S2SPTK.js';
|
|
60
60
|
export { SLIDE_NAV_LABELS, SlideNav } from '../chunk-DEAFAK3U.js';
|
|
61
61
|
export { SLIDE_HEIGHT, SLIDE_WIDTH, SlideStage, useSlideKeys } from '../chunk-RMEBFYL7.js';
|
|
62
|
+
export { PresenceStack } from '../chunk-FGRJXZUU.js';
|
|
62
63
|
export { PricingCard } from '../chunk-U3ILLCR2.js';
|
|
63
64
|
export { PrincipalPicker } from '../chunk-RPHQNXE5.js';
|
|
64
65
|
export { PropertyList } from '../chunk-VBYRA3W6.js';
|
|
65
66
|
export { PROPOSAL_CARD_LABELS, PROPOSAL_FAILURE_OUTCOMES, PROPOSAL_STATES, ProposalCard } from '../chunk-PFXUEEHT.js';
|
|
66
|
-
export {
|
|
67
|
+
export { QR_DARK, QR_LIGHT, QR_QUIET_ZONE, QrCode, qrModulePath, qrModules } from '../chunk-Y56FM3K4.js';
|
|
67
68
|
export { PageNote } from '../chunk-CV4NES3P.js';
|
|
68
69
|
export { PEEK_RAIL_LABELS, PEEK_RAIL_MAX_WIDTH, PEEK_RAIL_MIN_WIDTH, PEEK_RAIL_WIDTH, PeekHost, PeekNeighbours, PeekRail, isPlainPress, peekClickHandler, peekRowActivation, usePeekNeighbours, usePeekOrder, usePeekStep } from '../chunk-VBO2GYWX.js';
|
|
69
70
|
export { PEOPLE_RAIL_LABELS, PeopleRail, peopleRailKey } from '../chunk-EFIURN3U.js';
|
|
@@ -74,11 +75,11 @@ export { FactLine, ObjectHeader, SetByLine } from '../chunk-4MC2EEGO.js';
|
|
|
74
75
|
export { OPEN_IN_APP_CARD_LABELS, OpenInAppCard } from '../chunk-I43D5K6A.js';
|
|
75
76
|
export { REFUSAL_STRIP_LABELS, ReceiptStrip, RefusalStrip } from '../chunk-NLI7OVO2.js';
|
|
76
77
|
export { OrgNodeDisclosure, OrgNodeLabel, OrgNodeLead } from '../chunk-YA3AWELW.js';
|
|
78
|
+
export { Outline, scrollToHeading, useActiveHeading } from '../chunk-A5YKNRG6.js';
|
|
77
79
|
export { OrgTable, OrgTableActions, OrgTableAdd, OrgTableName } from '../chunk-PGKETYGL.js';
|
|
78
80
|
export { TreeGrid } from '../chunk-Q4DNAO3O.js';
|
|
79
81
|
export { SIZE_EPSILON, TYPE_AHEAD_RESET_MS, createTreeModel, isTypeAheadKey, layoutConnectors, layoutForest, placeGroups, treeAllExpandable, treeAncestors, treeCollapseOrAscend, treeExpandOrDescend, treeExpandTo, treeExpandable, treeFirst, treeFirstChild, treeItemAction, treeLast, treeLevel, treeNext, treeParent, treePosInSet, treePrevious, treeSetSize, treeStep, treeTypeAhead, treeVisible, typeAheadBuffer, useLayoutAnchor, useMeasuredSizes, useTreeState } from '../chunk-MY374UUD.js';
|
|
80
82
|
export { OrgLabel } from '../chunk-ONQKKHON.js';
|
|
81
|
-
export { Outline, scrollToHeading, useActiveHeading } from '../chunk-A5YKNRG6.js';
|
|
82
83
|
export { MARKDOWN_CALLOUT_NAMES, MARKDOWN_CALLOUT_TONES, markdownBreaks, markdownClosesFence, markdownCodeText, markdownFenceOf, markdownHeadingOf, markdownInline, markdownLines, parseMarkdown, parseMarkdownSpans, safeHref } from '../chunk-BAKPMH3S.js';
|
|
83
84
|
export { MARKDOWN_FORMATS, MarkdownEditor, formatMarkdown, insertMarkdown, markdownWords } from '../chunk-VRPDQSXZ.js';
|
|
84
85
|
export { MERGE_CONFLICTS_LABELS, MergeConflicts } from '../chunk-5G76O23M.js';
|
|
@@ -96,8 +97,8 @@ export { AutoGrid, Inline, Spacer, Stack } from '../chunk-ZAC7SKUN.js';
|
|
|
96
97
|
export { Link } from '../chunk-HOP3J622.js';
|
|
97
98
|
export { LinkInterstitial, openExternal } from '../chunk-EQHJTGLY.js';
|
|
98
99
|
import '../chunk-FFMCMSJB.js';
|
|
99
|
-
export { ImageUpload } from '../chunk-PPVWWJIB.js';
|
|
100
100
|
export { IconTile } from '../chunk-3LI4TRUR.js';
|
|
101
|
+
export { ImageUpload } from '../chunk-PPVWWJIB.js';
|
|
101
102
|
export { InboxGroup, InboxList, InboxMore, InboxRow, InboxToggle } from '../chunk-5KEVSZ4K.js';
|
|
102
103
|
export { IndicatorAnchor } from '../chunk-27MJPU7G.js';
|
|
103
104
|
export { INLINE_EDITOR_LABELS, InlineEditor } from '../chunk-46VE5TVS.js';
|
|
@@ -111,9 +112,9 @@ export { IDLE_AFTER_MS, useFullscreen, useIdle } from '../chunk-W5XCNEZC.js';
|
|
|
111
112
|
export { Highlight, highlightRanges, highlightTerms } from '../chunk-H6VKCIWV.js';
|
|
112
113
|
import '../chunk-MICRGE3J.js';
|
|
113
114
|
export { EntityChip } from '../chunk-OSKJZNBT.js';
|
|
114
|
-
export { ErrorBoundary } from '../chunk-ZEPUKRO7.js';
|
|
115
115
|
export { EntityList } from '../chunk-OB5N3FV2.js';
|
|
116
116
|
export { StatusCard } from '../chunk-WW4E5EUS.js';
|
|
117
|
+
export { ErrorBoundary } from '../chunk-ZEPUKRO7.js';
|
|
117
118
|
export { Eyebrow } from '../chunk-RK4XPHVG.js';
|
|
118
119
|
export { FactList } from '../chunk-HACEB6L4.js';
|
|
119
120
|
export { FileDrop, FilePickButton, droppedFiles, pickedFiles } from '../chunk-2JHGPXYG.js';
|
|
@@ -221,6 +222,7 @@ export { ARTIFACT_KINDS, ArtifactKindGlyph } from '../chunk-RSKW25Y5.js';
|
|
|
221
222
|
export { ACCESS_DENIED_REASONS, AccessDeniedCard } from '../chunk-QTMUKRTN.js';
|
|
222
223
|
export { EmptyState } from '../chunk-PPUR46MK.js';
|
|
223
224
|
export { Accordion, AccordionItem } from '../chunk-K4U2VDOJ.js';
|
|
225
|
+
export { ADD_PILL_MS, AddPill } from '../chunk-QC2DEQCN.js';
|
|
224
226
|
export { AGENT_HANDOFF_LABELS, AgentHandoffPanel } from '../chunk-5UPWU6ZJ.js';
|
|
225
227
|
export { Timeline, TimelineItem } from '../chunk-Z6X3F4H6.js';
|
|
226
228
|
export { Section } from '../chunk-JQ7IFSF6.js';
|
|
@@ -234,7 +236,6 @@ export { CHARACTER_COUNT_LABELS, CHARACTER_COUNT_NEAR, CharacterCount, character
|
|
|
234
236
|
export { DisclosureAnatomy } from '../chunk-ZYO2QFU6.js';
|
|
235
237
|
export { Count } from '../chunk-5KRRJNQO.js';
|
|
236
238
|
export { HeadingLevelProvider, headingTag, nextHeadingLevel, useHeadingLevel } from '../chunk-PQADV6P6.js';
|
|
237
|
-
export { ADD_PILL_MS, AddPill } from '../chunk-QC2DEQCN.js';
|
|
238
239
|
export { Announcer, announce, useAnnouncer } from '../chunk-2G355KDJ.js';
|
|
239
240
|
export { APP_SHELL_ASIDE_WIDTH, AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellRailStatus, AppShellToggle, AppShellTopbar, readStoredWidth, useAppShell, useStoredWidth } from '../chunk-7SRSPU4O.js';
|
|
240
241
|
export { useMediaMatch } from '../chunk-RTPQDNW3.js';
|
package/dist/index.js
CHANGED
|
@@ -1,69 +1,70 @@
|
|
|
1
|
-
import './chunk-
|
|
1
|
+
import './chunk-OXZKRUGM.js';
|
|
2
2
|
export { WidgetFrame } from './chunk-3DMPZZQ6.js';
|
|
3
3
|
export { ElementToPngError, elementToPng, parseCsv, serializeElement, toCsv } from './chunk-FEJANUZK.js';
|
|
4
4
|
export { TreeCanvas } from './chunk-5NJ4BIUA.js';
|
|
5
5
|
export { TypeSpecimen } from './chunk-JKAFEFFC.js';
|
|
6
6
|
export { VERSION_COMPARE_LABELS, VERSION_COMPARE_LENSES, VersionCompare } from './chunk-NL72YZWF.js';
|
|
7
7
|
export { VersionTimeline } from './chunk-TUNEMQXF.js';
|
|
8
|
-
export { DensitySwitcher, ThemeSwitcher } from './chunk-53NTMTRM.js';
|
|
9
8
|
export { ThemeToggle } from './chunk-RLFPBRN4.js';
|
|
10
|
-
export {
|
|
9
|
+
export { ThinkingIndicator } from './chunk-E2MIUNUU.js';
|
|
11
10
|
export { TileGrid } from './chunk-Q6CQMS6R.js';
|
|
12
11
|
export { TIME_RANGE_CUSTOM, TIME_RANGE_PICKER_LABELS, TimeRangePicker, timeRangeFieldKey, timeRangeProblem } from './chunk-LND6XSXN.js';
|
|
13
12
|
export { DEFAULT_TIME_WINDOW_LABELS, TIME_WINDOW_SPANS, TimeWindowPicker, describeTimeWindow, isTimeWindowSet, parseTimeWindowDuration, resolveTimeWindow, timeWindowMatchesPreset } from './chunk-SG2375ZY.js';
|
|
14
13
|
export { ToastProvider, Toaster, toasterInsetStyle, useToast } from './chunk-XQBLBJN4.js';
|
|
15
|
-
export { TABLE_TAGS_CELL_LABELS, TableDateCell, TableEntityCell, TableKeyCell, TableNumberCell, TableStatusCell, TableTagsCell, TableTextCell } from './chunk-U4AXQI6U.js';
|
|
16
14
|
export { TagsInput } from './chunk-VSTD65SL.js';
|
|
17
15
|
export { ThemeGallery } from './chunk-ESUZ27TS.js';
|
|
18
16
|
export { ThemeSwatch } from './chunk-MNFU2RNT.js';
|
|
19
|
-
export {
|
|
17
|
+
export { DensitySwitcher, ThemeSwitcher } from './chunk-53NTMTRM.js';
|
|
18
|
+
export { applyStoredPreferences, resolveTheme, useDensityPreference, useSystemTheme, useThemePreference } from './chunk-Z24ZUSTX.js';
|
|
19
|
+
export { StatGroup } from './chunk-OUD75UB2.js';
|
|
20
20
|
export { SuggestionList, SuggestionRow } from './chunk-YBI7M2JH.js';
|
|
21
21
|
export { Switcher } from './chunk-ZRKUTFYE.js';
|
|
22
|
-
export {
|
|
22
|
+
export { TABLE_TAGS_CELL_LABELS, TableDateCell, TableEntityCell, TableKeyCell, TableNumberCell, TableStatusCell, TableTagsCell, TableTextCell } from './chunk-U4AXQI6U.js';
|
|
23
|
+
export { SLIDE_COMPARE_LABELS, SlideCompare } from './chunk-W2Q5DZJB.js';
|
|
23
24
|
export { SlideGrid } from './chunk-3V5T5K5H.js';
|
|
24
25
|
export { SOURCE_EDITOR_KEYS, SourceEditor, lineStart } from './chunk-CVDK3LDB.js';
|
|
25
26
|
export { StatCard } from './chunk-VO2PDDRE.js';
|
|
26
|
-
export {
|
|
27
|
+
export { Statement } from './chunk-MZJKPTA5.js';
|
|
27
28
|
export { SHEET_COLUMN_EDITOR_LABELS, SheetColumnEditor, SheetColumnTypeGlyph } from './chunk-5PMFRAGL.js';
|
|
28
29
|
export { CellDisplay, CellEditor, CheckboxCell, DateCell, LongTextCell, MultiSelectCell, NumberCell, PersonCell, RatingCell, SelectCell, SheetCell, SheetGrid, StatusCell, TextCell, UrlCell } from './chunk-WXSGCYZO.js';
|
|
29
30
|
export { TagGroup } from './chunk-4U2D6BPR.js';
|
|
30
31
|
export { matchesShortcut, useShortcut } from './chunk-AYHIF6DH.js';
|
|
31
32
|
import './chunk-73GUXYYE.js';
|
|
32
|
-
export {
|
|
33
|
+
export { SlideFilmstrip } from './chunk-XLJPLCK6.js';
|
|
33
34
|
export { SegmentedMeter, segmentedMeterLabel } from './chunk-4AK52VHB.js';
|
|
34
35
|
export { SelectionBar } from './chunk-6Z4JZHRB.js';
|
|
35
|
-
export { SEND_BUTTON_LABELS, SendButton } from './chunk-
|
|
36
|
+
export { SEND_BUTTON_LABELS, SendButton } from './chunk-PBR5C5MX.js';
|
|
36
37
|
export { SettingsTable, SettingsTableRow } from './chunk-4RKTZSEW.js';
|
|
37
38
|
export { SetupWizard } from './chunk-T4THNJ6E.js';
|
|
38
39
|
export { ARTIFACT_ROLES, SHAREABLE_ROLES, ShareDialog, roleAtLeast } from './chunk-B5ZHJWAZ.js';
|
|
39
40
|
export { Select } from './chunk-XQZ6EWOE.js';
|
|
40
41
|
export { ReviewList } from './chunk-OJ2QULVH.js';
|
|
42
|
+
export { RichEditor, preloadRichEditor } from './chunk-5MN2HISF.js';
|
|
43
|
+
export { RICH_EDITOR_LABELS, richEditorLabels } from './chunk-CSQTDGTS.js';
|
|
41
44
|
export { canonicalMarkdown, roundTripMarkdown } from './chunk-SWD4QBL6.js';
|
|
42
45
|
import './chunk-QH6VYJ3X.js';
|
|
43
|
-
export { RichEditor, preloadRichEditor } from './chunk-V57TGM2L.js';
|
|
44
|
-
export { RICH_EDITOR_LABELS, richEditorLabels } from './chunk-CSQTDGTS.js';
|
|
45
46
|
export { RUN_STATES, RunChip } from './chunk-75QASA62.js';
|
|
46
47
|
export { STEP_STATES, STEP_STATE_LABELS, StepList, StepStateMark, Stepper, stepDetailPieces } from './chunk-Z4EKUMZW.js';
|
|
47
48
|
export { FRAME_HELLO_TIMEOUT_MS, FRAME_LOAD_GRACE_MS, SandboxedFrame, SandboxedFrameNotice, SandboxedFramePlaceholder } from './chunk-WR7UDG7U.js';
|
|
48
49
|
export { SearchTrigger } from './chunk-YZR57QGE.js';
|
|
49
50
|
export { SectionFrame, SectionFrameBody, SectionFrameNav } from './chunk-SHLP2BNA.js';
|
|
50
51
|
export { NavGroup, NavItem, SidebarNav } from './chunk-B53FUJ53.js';
|
|
51
|
-
export { QR_DARK, QR_LIGHT, QR_QUIET_ZONE, QrCode, qrModulePath, qrModules } from './chunk-Y56FM3K4.js';
|
|
52
52
|
export { ReadingPane, ReadingPaneByline, ReadingPaneLead, ReadingPaneOutcome, ReadingPaneQuote, ReadingPaneReasoning, ReadingPaneSection, ReadingPaneTitle } from './chunk-ZAJHGDAW.js';
|
|
53
|
+
export { Prose } from './chunk-DVVP27OD.js';
|
|
53
54
|
export { REFUSAL_CARD_LABELS, RefusalCard } from './chunk-JE4FCRVL.js';
|
|
54
55
|
export { RelatedRow } from './chunk-MYJZCSMA.js';
|
|
55
56
|
export { Text } from './chunk-QP2P6GDQ.js';
|
|
56
57
|
export { RESULT_TABLE_CARD_LABELS, RESULT_TABLE_COLLAPSED_ROWS, RESULT_TABLE_MAX_ROWS, ResultTableCard } from './chunk-OM6CPZB7.js';
|
|
57
58
|
export { Table } from './chunk-5DJMFRSZ.js';
|
|
58
|
-
export { PresenceStack } from './chunk-FGRJXZUU.js';
|
|
59
59
|
export { PresenterView, formatStopwatch } from './chunk-P5S2SPTK.js';
|
|
60
60
|
export { SLIDE_NAV_LABELS, SlideNav } from './chunk-DEAFAK3U.js';
|
|
61
61
|
export { SLIDE_HEIGHT, SLIDE_WIDTH, SlideStage, useSlideKeys } from './chunk-RMEBFYL7.js';
|
|
62
|
+
export { PresenceStack } from './chunk-FGRJXZUU.js';
|
|
62
63
|
export { PricingCard } from './chunk-U3ILLCR2.js';
|
|
63
64
|
export { PrincipalPicker } from './chunk-RPHQNXE5.js';
|
|
64
65
|
export { PropertyList } from './chunk-VBYRA3W6.js';
|
|
65
66
|
export { PROPOSAL_CARD_LABELS, PROPOSAL_FAILURE_OUTCOMES, PROPOSAL_STATES, ProposalCard } from './chunk-PFXUEEHT.js';
|
|
66
|
-
export {
|
|
67
|
+
export { QR_DARK, QR_LIGHT, QR_QUIET_ZONE, QrCode, qrModulePath, qrModules } from './chunk-Y56FM3K4.js';
|
|
67
68
|
export { PageNote } from './chunk-CV4NES3P.js';
|
|
68
69
|
export { PEEK_RAIL_LABELS, PEEK_RAIL_MAX_WIDTH, PEEK_RAIL_MIN_WIDTH, PEEK_RAIL_WIDTH, PeekHost, PeekNeighbours, PeekRail, isPlainPress, peekClickHandler, peekRowActivation, usePeekNeighbours, usePeekOrder, usePeekStep } from './chunk-VBO2GYWX.js';
|
|
69
70
|
export { PEOPLE_RAIL_LABELS, PeopleRail, peopleRailKey } from './chunk-EFIURN3U.js';
|
|
@@ -74,11 +75,11 @@ export { FactLine, ObjectHeader, SetByLine } from './chunk-4MC2EEGO.js';
|
|
|
74
75
|
export { OPEN_IN_APP_CARD_LABELS, OpenInAppCard } from './chunk-I43D5K6A.js';
|
|
75
76
|
export { REFUSAL_STRIP_LABELS, ReceiptStrip, RefusalStrip } from './chunk-NLI7OVO2.js';
|
|
76
77
|
export { OrgNodeDisclosure, OrgNodeLabel, OrgNodeLead } from './chunk-YA3AWELW.js';
|
|
78
|
+
export { Outline, scrollToHeading, useActiveHeading } from './chunk-A5YKNRG6.js';
|
|
77
79
|
export { OrgTable, OrgTableActions, OrgTableAdd, OrgTableName } from './chunk-PGKETYGL.js';
|
|
78
80
|
export { TreeGrid } from './chunk-Q4DNAO3O.js';
|
|
79
81
|
export { SIZE_EPSILON, TYPE_AHEAD_RESET_MS, createTreeModel, isTypeAheadKey, layoutConnectors, layoutForest, placeGroups, treeAllExpandable, treeAncestors, treeCollapseOrAscend, treeExpandOrDescend, treeExpandTo, treeExpandable, treeFirst, treeFirstChild, treeItemAction, treeLast, treeLevel, treeNext, treeParent, treePosInSet, treePrevious, treeSetSize, treeStep, treeTypeAhead, treeVisible, typeAheadBuffer, useLayoutAnchor, useMeasuredSizes, useTreeState } from './chunk-MY374UUD.js';
|
|
80
82
|
export { OrgLabel } from './chunk-ONQKKHON.js';
|
|
81
|
-
export { Outline, scrollToHeading, useActiveHeading } from './chunk-A5YKNRG6.js';
|
|
82
83
|
export { MARKDOWN_CALLOUT_NAMES, MARKDOWN_CALLOUT_TONES, markdownBreaks, markdownClosesFence, markdownCodeText, markdownFenceOf, markdownHeadingOf, markdownInline, markdownLines, parseMarkdown, parseMarkdownSpans, safeHref } from './chunk-BAKPMH3S.js';
|
|
83
84
|
export { MARKDOWN_FORMATS, MarkdownEditor, formatMarkdown, insertMarkdown, markdownWords } from './chunk-VRPDQSXZ.js';
|
|
84
85
|
export { MERGE_CONFLICTS_LABELS, MergeConflicts } from './chunk-5G76O23M.js';
|
|
@@ -96,8 +97,8 @@ export { AutoGrid, Inline, Spacer, Stack } from './chunk-ZAC7SKUN.js';
|
|
|
96
97
|
export { Link } from './chunk-HOP3J622.js';
|
|
97
98
|
export { LinkInterstitial, openExternal } from './chunk-EQHJTGLY.js';
|
|
98
99
|
import './chunk-FFMCMSJB.js';
|
|
99
|
-
export { ImageUpload } from './chunk-PPVWWJIB.js';
|
|
100
100
|
export { IconTile } from './chunk-3LI4TRUR.js';
|
|
101
|
+
export { ImageUpload } from './chunk-PPVWWJIB.js';
|
|
101
102
|
export { InboxGroup, InboxList, InboxMore, InboxRow, InboxToggle } from './chunk-5KEVSZ4K.js';
|
|
102
103
|
export { IndicatorAnchor } from './chunk-27MJPU7G.js';
|
|
103
104
|
export { INLINE_EDITOR_LABELS, InlineEditor } from './chunk-46VE5TVS.js';
|
|
@@ -111,9 +112,9 @@ export { IDLE_AFTER_MS, useFullscreen, useIdle } from './chunk-W5XCNEZC.js';
|
|
|
111
112
|
export { Highlight, highlightRanges, highlightTerms } from './chunk-H6VKCIWV.js';
|
|
112
113
|
import './chunk-MICRGE3J.js';
|
|
113
114
|
export { EntityChip } from './chunk-OSKJZNBT.js';
|
|
114
|
-
export { ErrorBoundary } from './chunk-ZEPUKRO7.js';
|
|
115
115
|
export { EntityList } from './chunk-OB5N3FV2.js';
|
|
116
116
|
export { StatusCard } from './chunk-WW4E5EUS.js';
|
|
117
|
+
export { ErrorBoundary } from './chunk-ZEPUKRO7.js';
|
|
117
118
|
export { Eyebrow } from './chunk-RK4XPHVG.js';
|
|
118
119
|
export { FactList } from './chunk-HACEB6L4.js';
|
|
119
120
|
export { FileDrop, FilePickButton, droppedFiles, pickedFiles } from './chunk-2JHGPXYG.js';
|
|
@@ -221,6 +222,7 @@ export { ARTIFACT_KINDS, ArtifactKindGlyph } from './chunk-RSKW25Y5.js';
|
|
|
221
222
|
export { ACCESS_DENIED_REASONS, AccessDeniedCard } from './chunk-QTMUKRTN.js';
|
|
222
223
|
export { EmptyState } from './chunk-PPUR46MK.js';
|
|
223
224
|
export { Accordion, AccordionItem } from './chunk-K4U2VDOJ.js';
|
|
225
|
+
export { ADD_PILL_MS, AddPill } from './chunk-QC2DEQCN.js';
|
|
224
226
|
export { AGENT_HANDOFF_LABELS, AgentHandoffPanel } from './chunk-5UPWU6ZJ.js';
|
|
225
227
|
export { Timeline, TimelineItem } from './chunk-Z6X3F4H6.js';
|
|
226
228
|
export { Section } from './chunk-JQ7IFSF6.js';
|
|
@@ -234,7 +236,6 @@ export { CHARACTER_COUNT_LABELS, CHARACTER_COUNT_NEAR, CharacterCount, character
|
|
|
234
236
|
export { DisclosureAnatomy } from './chunk-ZYO2QFU6.js';
|
|
235
237
|
export { Count } from './chunk-5KRRJNQO.js';
|
|
236
238
|
export { HeadingLevelProvider, headingTag, nextHeadingLevel, useHeadingLevel } from './chunk-PQADV6P6.js';
|
|
237
|
-
export { ADD_PILL_MS, AddPill } from './chunk-QC2DEQCN.js';
|
|
238
239
|
export { Announcer, announce, useAnnouncer } from './chunk-2G355KDJ.js';
|
|
239
240
|
export { APP_SHELL_ASIDE_WIDTH, AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellRailStatus, AppShellToggle, AppShellTopbar, readStoredWidth, useAppShell, useStoredWidth } from './chunk-7SRSPU4O.js';
|
|
240
241
|
export { useMediaMatch } from './chunk-RTPQDNW3.js';
|
package/dist/styles.css
CHANGED
|
@@ -25354,7 +25354,7 @@ button.crewlet-presence-stack__member:focus-visible {
|
|
|
25354
25354
|
}
|
|
25355
25355
|
|
|
25356
25356
|
|
|
25357
|
-
/* Prose-
|
|
25357
|
+
/* Prose-OMV2T6NT.css */
|
|
25358
25358
|
/*
|
|
25359
25359
|
* Natural language: the proportional face, real leading, a bounded measure.
|
|
25360
25360
|
*/
|
|
@@ -25418,7 +25418,23 @@ button.crewlet-presence-stack__member:focus-visible {
|
|
|
25418
25418
|
transition: color var(--motion-duration-slow) var(--motion-easing-default);
|
|
25419
25419
|
}
|
|
25420
25420
|
|
|
25421
|
-
|
|
25421
|
+
/*
|
|
25422
|
+
* THE CARET ENDS THE LAST LINE OF TEXT, never a line of its own. On a block
|
|
25423
|
+
* that holds rendered Markdown, the block's own ::after came after its last
|
|
25424
|
+
* paragraph or list, so the caret stood alone on a new line; and on a reply
|
|
25425
|
+
* with no words yet it stood alone at the start. So: no caret on an empty
|
|
25426
|
+
* block, none on the block itself when its children are blocks, and the caret
|
|
25427
|
+
* after the last child instead when that child is a paragraph or a heading,
|
|
25428
|
+
* whose last line it then ends. A list, a table or code last draws none: a
|
|
25429
|
+
* caret after its final row reads as a stray mark, not as the end of a line.
|
|
25430
|
+
*/
|
|
25431
|
+
.crewlet-prose--streaming:empty::after,
|
|
25432
|
+
.crewlet-prose--streaming:has(> :is(p, div, ul, ol, pre, table, blockquote, h1, h2, h3, h4, h5, h6))::after {
|
|
25433
|
+
content: none;
|
|
25434
|
+
}
|
|
25435
|
+
|
|
25436
|
+
.crewlet-prose--streaming::after,
|
|
25437
|
+
.crewlet-prose--streaming > :is(p, h1, h2, h3, h4, h5, h6):last-child::after {
|
|
25422
25438
|
content: '';
|
|
25423
25439
|
display: inline-block;
|
|
25424
25440
|
width: 2px;
|
|
@@ -25450,7 +25466,8 @@ button.crewlet-presence-stack__member:focus-visible {
|
|
|
25450
25466
|
transition: none;
|
|
25451
25467
|
}
|
|
25452
25468
|
|
|
25453
|
-
.crewlet-prose--streaming::after
|
|
25469
|
+
.crewlet-prose--streaming::after,
|
|
25470
|
+
.crewlet-prose--streaming > :is(p, h1, h2, h3, h4, h5, h6):last-child::after {
|
|
25454
25471
|
animation: none;
|
|
25455
25472
|
}
|
|
25456
25473
|
}
|
|
@@ -27905,6 +27922,182 @@ svg.crewlet-select__chevron {
|
|
|
27905
27922
|
}
|
|
27906
27923
|
|
|
27907
27924
|
|
|
27925
|
+
/* SendButton-L4UX54XS.css */
|
|
27926
|
+
/*
|
|
27927
|
+
* A chat composer's Send, which becomes Stop. See SendButton.tsx for what each
|
|
27928
|
+
* state says. The surfaces, edges and hover and press inks are IconButton's
|
|
27929
|
+
* primary and secondary squares; this sheet adds the glyph cross fade, the
|
|
27930
|
+
* quiet held state, the press and the running arc.
|
|
27931
|
+
*/
|
|
27932
|
+
|
|
27933
|
+
/*
|
|
27934
|
+
* THE ARC'S ANGLE, registered so it can turn. An unregistered custom property
|
|
27935
|
+
* animates in one step at the halfway point, which would make the arc jump
|
|
27936
|
+
* between two places rather than travel.
|
|
27937
|
+
*/
|
|
27938
|
+
@property --crewlet-send-button-arc {
|
|
27939
|
+
syntax: '<angle>';
|
|
27940
|
+
inherits: false;
|
|
27941
|
+
initial-value: 0deg;
|
|
27942
|
+
}
|
|
27943
|
+
|
|
27944
|
+
.crewlet-send-button {
|
|
27945
|
+
position: relative;
|
|
27946
|
+
transition:
|
|
27947
|
+
background var(--motion-duration-fast) var(--motion-easing-default),
|
|
27948
|
+
border-color var(--motion-duration-fast) var(--motion-easing-default),
|
|
27949
|
+
color var(--motion-duration-fast) var(--motion-easing-default),
|
|
27950
|
+
transform var(--motion-duration-instant) var(--motion-easing-out);
|
|
27951
|
+
}
|
|
27952
|
+
|
|
27953
|
+
/* A press sinks the square a little, so the pointer feels it land. */
|
|
27954
|
+
.crewlet-send-button:active:not([aria-disabled='true']) {
|
|
27955
|
+
transform: scale(0.94);
|
|
27956
|
+
}
|
|
27957
|
+
|
|
27958
|
+
/*
|
|
27959
|
+
* BOTH GLYPHS IN ONE CELL. The one in use stands at full size; the other is
|
|
27960
|
+
* faded and scaled to half, and the two trade places on the base step with
|
|
27961
|
+
* the entering surface's ease, so Send turning into Stop reads as one control
|
|
27962
|
+
* changing its mind rather than as two buttons swapping.
|
|
27963
|
+
*/
|
|
27964
|
+
.crewlet-send-button__glyphs {
|
|
27965
|
+
display: grid;
|
|
27966
|
+
place-items: center;
|
|
27967
|
+
}
|
|
27968
|
+
|
|
27969
|
+
.crewlet-send-button__glyph {
|
|
27970
|
+
grid-area: 1 / 1;
|
|
27971
|
+
transition:
|
|
27972
|
+
opacity var(--motion-duration-base) var(--motion-easing-default),
|
|
27973
|
+
transform var(--motion-duration-base) var(--motion-easing-emphasized);
|
|
27974
|
+
}
|
|
27975
|
+
|
|
27976
|
+
.crewlet-send-button--send .crewlet-send-button__glyph--stop,
|
|
27977
|
+
.crewlet-send-button--stop .crewlet-send-button__glyph--send {
|
|
27978
|
+
opacity: 0;
|
|
27979
|
+
transform: scale(0.5);
|
|
27980
|
+
}
|
|
27981
|
+
|
|
27982
|
+
/*
|
|
27983
|
+
* THE STOP SQUARE IS SMALLER THAN THE ARROW: a filled block at the arrow's
|
|
27984
|
+
* 14px was the heaviest mark on the panel. At the 12px step its square is
|
|
27985
|
+
* nine pixels, crisp on the pixel grid and the weight of the arrow's stroke.
|
|
27986
|
+
*/
|
|
27987
|
+
.crewlet-send-button.crewlet-icon-btn--md .crewlet-send-button__glyph--stop {
|
|
27988
|
+
width: var(--font-size-xs);
|
|
27989
|
+
height: var(--font-size-xs);
|
|
27990
|
+
}
|
|
27991
|
+
|
|
27992
|
+
/*
|
|
27993
|
+
* HELD, AT FULL OPACITY, with the glyph in the tertiary ink. A faded accent
|
|
27994
|
+
* block read as a muddy, broken button on the dark ground, and the composer's
|
|
27995
|
+
* own fade multiplied it further. Send held is the accent's soft tint, so it
|
|
27996
|
+
* is still the purple control that lights up the moment there is something
|
|
27997
|
+
* to send; Stop held (a stop already under way) is the neutral hover overlay,
|
|
27998
|
+
* since nothing about it is waiting to light up.
|
|
27999
|
+
*/
|
|
28000
|
+
.crewlet-send-button.crewlet-icon-btn[aria-disabled='true'] {
|
|
28001
|
+
opacity: 1;
|
|
28002
|
+
border-color: transparent;
|
|
28003
|
+
color: var(--color-text-tertiary);
|
|
28004
|
+
}
|
|
28005
|
+
|
|
28006
|
+
.crewlet-send-button--send.crewlet-icon-btn[aria-disabled='true'] {
|
|
28007
|
+
background: var(--color-brand-accent-soft);
|
|
28008
|
+
}
|
|
28009
|
+
|
|
28010
|
+
.crewlet-send-button--stop.crewlet-icon-btn[aria-disabled='true'] {
|
|
28011
|
+
background: var(--color-surface-hover);
|
|
28012
|
+
}
|
|
28013
|
+
|
|
28014
|
+
/*
|
|
28015
|
+
* THE RUNNING ARC: a band of the accent travelling round Stop's edge, over its
|
|
28016
|
+
* own 1px border, with a tail that fades behind it. The band is a conic
|
|
28017
|
+
* gradient cut to a 2px ring by a mask (a mask reads only alpha, so its black
|
|
28018
|
+
* is opacity rather than a colour), so it follows the rounded corner exactly.
|
|
28019
|
+
* One round is the working ring's sweep period, and it fades in on the
|
|
28020
|
+
* moderate step as Stop arrives.
|
|
28021
|
+
*/
|
|
28022
|
+
.crewlet-send-button--stop::before {
|
|
28023
|
+
content: '';
|
|
28024
|
+
position: absolute;
|
|
28025
|
+
inset: -1px;
|
|
28026
|
+
padding: 2px;
|
|
28027
|
+
border-radius: inherit;
|
|
28028
|
+
background: conic-gradient(
|
|
28029
|
+
from var(--crewlet-send-button-arc),
|
|
28030
|
+
transparent 0turn,
|
|
28031
|
+
transparent 0.55turn,
|
|
28032
|
+
var(--color-brand-accent) 1turn
|
|
28033
|
+
);
|
|
28034
|
+
-webkit-mask:
|
|
28035
|
+
linear-gradient(#000 0 0) content-box,
|
|
28036
|
+
linear-gradient(#000 0 0);
|
|
28037
|
+
-webkit-mask-composite: xor;
|
|
28038
|
+
mask:
|
|
28039
|
+
linear-gradient(#000 0 0) content-box exclude,
|
|
28040
|
+
linear-gradient(#000 0 0);
|
|
28041
|
+
/* Paint, never a target. */
|
|
28042
|
+
pointer-events: none;
|
|
28043
|
+
animation:
|
|
28044
|
+
crewlet-send-button-arc var(--motion-duration-sweep) linear infinite,
|
|
28045
|
+
crewlet-send-button-arc-in var(--motion-duration-moderate) var(--motion-easing-out);
|
|
28046
|
+
}
|
|
28047
|
+
|
|
28048
|
+
/* A stop already under way has nothing left to show running. */
|
|
28049
|
+
.crewlet-send-button--stop[aria-disabled='true']::before {
|
|
28050
|
+
display: none;
|
|
28051
|
+
}
|
|
28052
|
+
|
|
28053
|
+
@keyframes crewlet-send-button-arc {
|
|
28054
|
+
to {
|
|
28055
|
+
--crewlet-send-button-arc: 360deg;
|
|
28056
|
+
}
|
|
28057
|
+
}
|
|
28058
|
+
|
|
28059
|
+
@keyframes crewlet-send-button-arc-in {
|
|
28060
|
+
from {
|
|
28061
|
+
opacity: 0;
|
|
28062
|
+
}
|
|
28063
|
+
|
|
28064
|
+
to {
|
|
28065
|
+
opacity: 1;
|
|
28066
|
+
}
|
|
28067
|
+
}
|
|
28068
|
+
|
|
28069
|
+
/*
|
|
28070
|
+
* UNDER REDUCED MOTION nothing travels or scales: the glyphs change in place,
|
|
28071
|
+
* and the arc becomes the whole edge in the accent, still and still saying
|
|
28072
|
+
* that something runs.
|
|
28073
|
+
*/
|
|
28074
|
+
@media (prefers-reduced-motion: reduce) {
|
|
28075
|
+
.crewlet-send-button {
|
|
28076
|
+
transition: none;
|
|
28077
|
+
}
|
|
28078
|
+
|
|
28079
|
+
.crewlet-send-button:active:not([aria-disabled='true']) {
|
|
28080
|
+
transform: none;
|
|
28081
|
+
}
|
|
28082
|
+
|
|
28083
|
+
.crewlet-send-button__glyph {
|
|
28084
|
+
transition: none;
|
|
28085
|
+
}
|
|
28086
|
+
|
|
28087
|
+
.crewlet-send-button--stop::before {
|
|
28088
|
+
background: var(--color-brand-accent);
|
|
28089
|
+
animation: none;
|
|
28090
|
+
}
|
|
28091
|
+
}
|
|
28092
|
+
|
|
28093
|
+
/* The system draws its own edge; a masked gradient is not repainted there. */
|
|
28094
|
+
@media (forced-colors: active) {
|
|
28095
|
+
.crewlet-send-button--stop::before {
|
|
28096
|
+
display: none;
|
|
28097
|
+
}
|
|
28098
|
+
}
|
|
28099
|
+
|
|
28100
|
+
|
|
27908
28101
|
/* SettingsTable-6DUFAFXG.css */
|
|
27909
28102
|
/*
|
|
27910
28103
|
* SettingsTable: a read-only table of settings, one row each, on one grid.
|
|
@@ -35608,6 +35801,131 @@ b.crewlet-switcher__match {
|
|
|
35608
35801
|
}
|
|
35609
35802
|
|
|
35610
35803
|
|
|
35804
|
+
/* ThinkingIndicator-QJMX2TXC.css */
|
|
35805
|
+
/*
|
|
35806
|
+
* The assistant at work: the Assistant's mark, its blades turning, and a line
|
|
35807
|
+
* of status under a shimmer. See ThinkingIndicator.tsx for why it replaces a
|
|
35808
|
+
* caret and how it is announced.
|
|
35809
|
+
*/
|
|
35810
|
+
|
|
35811
|
+
/*
|
|
35812
|
+
* ONE LINE OF PROSE TALL, at every state: the mark alone, the mark with a
|
|
35813
|
+
* status line, and the line changing from one step to the next all keep the
|
|
35814
|
+
* same height, so the thread never moves while the assistant works.
|
|
35815
|
+
*/
|
|
35816
|
+
.crewlet-thinking {
|
|
35817
|
+
display: flex;
|
|
35818
|
+
align-items: center;
|
|
35819
|
+
gap: var(--spacing-2);
|
|
35820
|
+
min-width: 0;
|
|
35821
|
+
min-height: calc(var(--font-size-compact) * var(--font-line-height-relaxed));
|
|
35822
|
+
font-family: var(--font-family-sans);
|
|
35823
|
+
font-size: var(--font-size-compact);
|
|
35824
|
+
line-height: var(--font-line-height-relaxed);
|
|
35825
|
+
}
|
|
35826
|
+
|
|
35827
|
+
/*
|
|
35828
|
+
* THE BLADES TURN A QUARTER, THEN REST. The figure is four blades around a
|
|
35829
|
+
* core, the same after a quarter turn, so each round ends where the next
|
|
35830
|
+
* begins and the loop never shows a seam. One round is the breath period
|
|
35831
|
+
* (2.2s): the turn takes its first half on the in-out ease and the second
|
|
35832
|
+
* half is still, which reads as steady thought rather than as a spinner. The
|
|
35833
|
+
* core holds still, as the mark's own description promises.
|
|
35834
|
+
*/
|
|
35835
|
+
.crewlet-thinking__mark [data-motion='turn'] {
|
|
35836
|
+
transform-box: view-box;
|
|
35837
|
+
transform-origin: 50% 50%;
|
|
35838
|
+
animation: crewlet-thinking-turn var(--motion-duration-breath) var(--motion-easing-in-out) infinite;
|
|
35839
|
+
}
|
|
35840
|
+
|
|
35841
|
+
@keyframes crewlet-thinking-turn {
|
|
35842
|
+
0% {
|
|
35843
|
+
transform: rotate(0deg);
|
|
35844
|
+
}
|
|
35845
|
+
|
|
35846
|
+
50%,
|
|
35847
|
+
100% {
|
|
35848
|
+
transform: rotate(90deg);
|
|
35849
|
+
}
|
|
35850
|
+
}
|
|
35851
|
+
|
|
35852
|
+
/*
|
|
35853
|
+
* THE SHIMMER IS A LIGHTER BAND CROSSING THE WORDS, the band Skeleton sweeps
|
|
35854
|
+
* across a placeholder, set in ink rather than in surface: the words are the
|
|
35855
|
+
* secondary ink at rest, so they read at every point of the sweep, and the
|
|
35856
|
+
* band is the primary ink. The gradient is clipped to the glyphs and is three
|
|
35857
|
+
* times the line's width, so the band crosses it rather than standing in it.
|
|
35858
|
+
*/
|
|
35859
|
+
.crewlet-thinking__status {
|
|
35860
|
+
min-width: 0;
|
|
35861
|
+
overflow: hidden;
|
|
35862
|
+
color: var(--color-text-secondary);
|
|
35863
|
+
text-overflow: ellipsis;
|
|
35864
|
+
white-space: nowrap;
|
|
35865
|
+
animation: crewlet-thinking-enter var(--motion-duration-moderate) var(--motion-easing-out);
|
|
35866
|
+
}
|
|
35867
|
+
|
|
35868
|
+
@supports (background-clip: text) or (-webkit-background-clip: text) {
|
|
35869
|
+
.crewlet-thinking__status {
|
|
35870
|
+
background-image: linear-gradient(
|
|
35871
|
+
90deg,
|
|
35872
|
+
var(--color-text-secondary) 0%,
|
|
35873
|
+
var(--color-text-secondary) 40%,
|
|
35874
|
+
var(--color-text-primary) 50%,
|
|
35875
|
+
var(--color-text-secondary) 60%,
|
|
35876
|
+
var(--color-text-secondary) 100%
|
|
35877
|
+
);
|
|
35878
|
+
background-size: 300% 100%;
|
|
35879
|
+
-webkit-background-clip: text;
|
|
35880
|
+
background-clip: text;
|
|
35881
|
+
color: transparent;
|
|
35882
|
+
animation:
|
|
35883
|
+
crewlet-thinking-enter var(--motion-duration-moderate) var(--motion-easing-out),
|
|
35884
|
+
crewlet-thinking-shimmer var(--motion-duration-breath) linear infinite;
|
|
35885
|
+
}
|
|
35886
|
+
}
|
|
35887
|
+
|
|
35888
|
+
@keyframes crewlet-thinking-shimmer {
|
|
35889
|
+
from {
|
|
35890
|
+
background-position: 100% 50%;
|
|
35891
|
+
}
|
|
35892
|
+
|
|
35893
|
+
to {
|
|
35894
|
+
background-position: 0 50%;
|
|
35895
|
+
}
|
|
35896
|
+
}
|
|
35897
|
+
|
|
35898
|
+
@keyframes crewlet-thinking-enter {
|
|
35899
|
+
from {
|
|
35900
|
+
opacity: 0;
|
|
35901
|
+
}
|
|
35902
|
+
|
|
35903
|
+
to {
|
|
35904
|
+
opacity: 1;
|
|
35905
|
+
}
|
|
35906
|
+
}
|
|
35907
|
+
|
|
35908
|
+
@media (prefers-reduced-motion: reduce) {
|
|
35909
|
+
.crewlet-thinking__mark [data-motion='turn'] {
|
|
35910
|
+
animation: none;
|
|
35911
|
+
}
|
|
35912
|
+
|
|
35913
|
+
.crewlet-thinking__status {
|
|
35914
|
+
background-image: none;
|
|
35915
|
+
color: var(--color-text-secondary);
|
|
35916
|
+
animation: none;
|
|
35917
|
+
}
|
|
35918
|
+
}
|
|
35919
|
+
|
|
35920
|
+
/* The system's own ink: a gradient clipped to text is dropped there. */
|
|
35921
|
+
@media (forced-colors: active) {
|
|
35922
|
+
.crewlet-thinking__status {
|
|
35923
|
+
background-image: none;
|
|
35924
|
+
color: CanvasText;
|
|
35925
|
+
}
|
|
35926
|
+
}
|
|
35927
|
+
|
|
35928
|
+
|
|
35611
35929
|
/* TileGrid-UYMVVVJK.css */
|
|
35612
35930
|
/*
|
|
35613
35931
|
* TileGrid: tiles on a fixed track count that folds by the grid's own width.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@crewlethq/ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.61.0",
|
|
4
4
|
"description": "Crewlet shared React components built on @crewlethq/tokens and @crewlethq/icons.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
"clean": "rm -rf dist src/generated"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@crewlethq/icons": "0.
|
|
46
|
-
"@crewlethq/tokens": "0.
|
|
45
|
+
"@crewlethq/icons": "0.61.0",
|
|
46
|
+
"@crewlethq/tokens": "0.61.0",
|
|
47
47
|
"prosemirror-commands": "1.7.2",
|
|
48
48
|
"prosemirror-gapcursor": "1.4.1",
|
|
49
49
|
"prosemirror-history": "1.5.1",
|
package/dist/chunk-XN5L5E5D.js
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { IconButton } from './chunk-2XWFWNDT.js';
|
|
2
|
-
import { cx } from './chunk-ODEQTPFM.js';
|
|
3
|
-
import { forwardRef } from 'react';
|
|
4
|
-
import { SquareGlyph, ArrowUpGlyph } from '@crewlethq/icons/glyphs';
|
|
5
|
-
import { jsx } from 'react/jsx-runtime';
|
|
6
|
-
|
|
7
|
-
var SEND_BUTTON_LABELS = { send: "Send", stop: "Stop" };
|
|
8
|
-
var SendButton = forwardRef(function SendButton2({ mode, onPress, disabledReason, labels: overrides, className, ...rest }, ref) {
|
|
9
|
-
const labels = overrides ? { ...SEND_BUTTON_LABELS, ...overrides } : SEND_BUTTON_LABELS;
|
|
10
|
-
const stopping = mode === "stop";
|
|
11
|
-
return /* @__PURE__ */ jsx(
|
|
12
|
-
IconButton,
|
|
13
|
-
{
|
|
14
|
-
...rest,
|
|
15
|
-
ref,
|
|
16
|
-
size: "md",
|
|
17
|
-
variant: stopping ? "secondary" : "primary",
|
|
18
|
-
label: stopping ? labels.stop : labels.send,
|
|
19
|
-
icon: stopping ? /* @__PURE__ */ jsx(SquareGlyph, { filled: true }) : /* @__PURE__ */ jsx(ArrowUpGlyph, {}),
|
|
20
|
-
disabledReason: stopping ? void 0 : disabledReason,
|
|
21
|
-
className: cx("crewlet-send-button", `crewlet-send-button--${mode}`, className),
|
|
22
|
-
onClick: onPress
|
|
23
|
-
}
|
|
24
|
-
);
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
export { SEND_BUTTON_LABELS, SendButton };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { schema, readMarkdown, writeMarkdown } from './chunk-QH6VYJ3X.js';
|
|
2
1
|
import { richEditorLabels } from './chunk-CSQTDGTS.js';
|
|
2
|
+
import { schema, readMarkdown, writeMarkdown } from './chunk-QH6VYJ3X.js';
|
|
3
3
|
import { safeHref, MARKDOWN_CALLOUT_TONES } from './chunk-BAKPMH3S.js';
|
|
4
4
|
import { Toolbar } from './chunk-NR4CPM4T.js';
|
|
5
5
|
import { FormField, Input } from './chunk-TLIJG4TP.js';
|
|
File without changes
|