@crewlethq/ui 0.56.0 → 0.57.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/README.md CHANGED
@@ -205,6 +205,16 @@ places:
205
205
  - A surface that pans or zooms dispatches `LAYER_REPOSITION_EVENT` on its host
206
206
  when the content beneath it moves, and every panel anchored inside follows.
207
207
 
208
+ ## Changes in 0.57.0
209
+
210
+ **`AppShell` takes `asideModal`**, so an `overlay` aside can leave the page live beside it. `true`, the default, keeps the 0.56.0 overlay: a modal dialog behind a veil with Tab held inside. `false` draws the overlay with no veil, no trap and nothing made inert: it is a complementary region named by `asideLabel`, focus moves into it when it opens, Escape from inside it calls `onAsideClose` (unless a control inside answered the key, or a menu or dialog on the layer stack owns it), and focus goes back to what opened it if it was still inside when it closed. A column is never modal and a `sheet` always is, whatever the prop says. The aside carries `data-modal`.
211
+
212
+ **`ProposalCard` takes `failureOutcome`** (`unchanged` or `unknown`; `ProposalFailureOutcome`, `PROPOSAL_FAILURE_OUTCOMES`), so a failed card says "Nothing changed." only when it is true. `unchanged`, the default, keeps the 0.56.0 drawing: the Tag "Not applied" and the engine's sentence followed by "Nothing changed.". `unknown` is a change sent without an answer, which may have landed: the Tag reads "Not confirmed" (`labels.notConfirmed`) and the strip is the `failure` sentence alone, or `labels.unknownNotice` ("Could not confirm whether this was applied. It may have landed.") without one. A failed card carries `data-outcome`. A consumer that drew an unknown outcome as `failed` passes `failureOutcome="unknown"`; nothing else changes.
213
+
214
+ **`ProposalCard` takes `decisionRefusal`** (`{ sentence, hint? }`; `ProposalDecisionRefusal`): why the person's last decision was refused while the card still waits on one, such as an approval that needs a fresh sign-in or that met a moved record, so the card stays `pending` or `stepup`. It is drawn above the decision as the inline `RefusalStrip`, and announced politely from a live region the foot keeps from the moment it holds a decision, through `applying`, so words that arrive later are heard. The consumer clears it. It is ignored once the card has settled. In `pending` and `stepup` the foot therefore holds one more `status` region, empty and visually hidden until a refusal arrives; a test that read the step-up notice with `getByRole('status')` should read it from the strip.
215
+
216
+ **`ReceiptStrip` and `RefusalStrip` take `announce`** (true by default). False drops the strip's own `alert` or `status` role, for a host that keeps the live region around it.
217
+
208
218
  ## Changes in 0.56.0
209
219
 
210
220
  ### The frame and its panels
@@ -45,7 +45,8 @@
45
45
  * gutter are all the sheet's, and the sheet keeps them. Where the window
46
46
  * cannot hold the page and the panel side by side the panel is an overlay
47
47
  * over the page's end, and on a phone it is the whole window; both are
48
- * modal surfaces on the shared layer stack. WHICH SHAPE is the host's
48
+ * modal surfaces on the shared layer stack, unless the host asks for an
49
+ * overlay that leaves the page live beside it (`asideModal={false}`). WHICH SHAPE is the host's
49
50
  * decision (`asideShape`), never a media query's: the width that leaves the
50
51
  * page its floor depends on what else the frame holds and on the density,
51
52
  * which only the application knows.
@@ -153,7 +154,16 @@ export interface AppShellProps extends Omit<HTMLAttributes<HTMLDivElement>, 'tit
153
154
  asideLabel?: string | undefined;
154
155
  /** Which shape the aside takes; the host decides it. */
155
156
  asideShape?: AppShellAsideShape | undefined;
156
- /** Closes the aside: Escape and a press on the veil, as an overlay or a sheet. */
157
+ /**
158
+ * Whether the aside is modal as an `overlay`: true (the default) draws it
159
+ * as a dialog behind a veil, with Tab held inside; false leaves the page
160
+ * live beside it, a complementary region with no veil and no trap that
161
+ * Escape from inside still closes, handing focus back to what opened it.
162
+ * A column is never modal and a sheet, which covers the whole window,
163
+ * always is.
164
+ */
165
+ asideModal?: boolean | undefined;
166
+ /** Closes the aside: Escape and, behind a veil, a press on the veil, as an overlay or a sheet. */
157
167
  onAsideClose?: (() => void) | undefined;
158
168
  /** Gives the aside a grip in the seam beside it while it is a column. */
159
169
  asideResize?: AppShellAsideResize | undefined;
@@ -171,7 +181,7 @@ export interface AppShellProps extends Omit<HTMLAttributes<HTMLDivElement>, 'tit
171
181
  peekShape?: AppShellPeekShape | undefined;
172
182
  children?: ReactNode;
173
183
  }
174
- export declare function AppShell({ sidebar, topbar, banner, footer, mainId, mainRef, fill, navigationKey, toggleLabel, skipLabel, aside, asideWidth, asideReserve, asideLabel, asideShape, onAsideClose, asideResize, peek, peekShape, className, style, children, ...rest }: AppShellProps): import("react").JSX.Element;
184
+ export declare function AppShell({ sidebar, topbar, banner, footer, mainId, mainRef, fill, navigationKey, toggleLabel, skipLabel, aside, asideWidth, asideReserve, asideLabel, asideShape, asideModal, onAsideClose, asideResize, peek, peekShape, className, style, children, ...rest }: AppShellProps): import("react").JSX.Element;
175
185
  export declare namespace AppShell {
176
186
  var Rail: typeof AppShellRail;
177
187
  var RailRow: import("react").ForwardRefExoticComponent<AppShellRailRowProps & import("react").RefAttributes<HTMLElement>>;
@@ -1,4 +1,4 @@
1
- export { APP_SHELL_ASIDE_WIDTH, AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellRailStatus, AppShellToggle, AppShellTopbar, readStoredWidth, useAppShell, useStoredWidth } from '../chunk-UVYGMCJ4.js';
1
+ export { APP_SHELL_ASIDE_WIDTH, AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellRailStatus, AppShellToggle, AppShellTopbar, readStoredWidth, useAppShell, useStoredWidth } from '../chunk-YGC7BFX2.js';
2
2
  import '../chunk-RTPQDNW3.js';
3
3
  import '../chunk-TKS7FTTO.js';
4
4
  export { RESIZE_HANDLE_LARGE_STEP, RESIZE_HANDLE_STEP, ResizeHandle, clampSize, useAppShellAside, useAppShellPeek } from '../chunk-PIYJNCN7.js';
@@ -11,6 +11,8 @@
11
11
  * region; the page reflows narrower and stays reachable with Tab.
12
12
  * - `overlay`: over the page's end edge, behind a veil, a modal dialog: Tab
13
13
  * stays in it, Escape and a press on the veil close it, focus returns.
14
+ * With `asideModal={false}` it has no veil and no trap: a complementary
15
+ * region the page stays live beside, which Escape from inside closes.
14
16
  * - `sheet`: the whole window, for a phone; modal in the same way.
15
17
  */
16
18
  export type AppShellAsideShape = 'column' | 'overlay' | 'sheet';
@@ -1,5 +1,5 @@
1
- export { OPEN_IN_APP_CARD_LABELS, OpenInAppCard } from '../chunk-YY445YFQ.js';
2
- import '../chunk-XQI2OUV4.js';
1
+ export { OPEN_IN_APP_CARD_LABELS, OpenInAppCard } from '../chunk-CZNG3V6L.js';
2
+ import '../chunk-LZXY6IMO.js';
3
3
  import '../chunk-BAKPMH3S.js';
4
4
  import '../chunk-3LI4TRUR.js';
5
5
  import '../chunk-WDIVALLP.js';
@@ -1,6 +1,7 @@
1
1
  import type { HTMLAttributes, ReactNode } from 'react';
2
2
  import { type ChangeListLabels, type ChangeListRow } from '../ChangeList/index.js';
3
3
  import type { DiffListLabels } from '../DiffList/index.js';
4
+ import '../VisuallyHidden/index.js';
4
5
  /**
5
6
  * Where a proposed change stands: `pending` (waiting on the person),
6
7
  * `stepup` (the approval needs a fresh sign-in), `applying` (approved and
@@ -19,6 +20,24 @@ export declare const PROPOSAL_STATES: readonly ["pending", "stepup", "applying",
19
20
  export type ProposalScope = 'page' | 'server';
20
21
  /** What the change does to a record: change fields of one, or create one. */
21
22
  export type ProposalKind = 'change' | 'create';
23
+ /**
24
+ * What a `failed` card came to: refused or not carried out, so nothing
25
+ * changed (`unchanged`), or carried out without an answer, so nobody can say
26
+ * whether it landed (`unknown`). Only `unchanged` says "Nothing changed.".
27
+ */
28
+ export type ProposalFailureOutcome = 'unchanged' | 'unknown';
29
+ export declare const PROPOSAL_FAILURE_OUTCOMES: readonly ["unchanged", "unknown"];
30
+ /**
31
+ * Why the person's own decision was refused while the card stays open to
32
+ * another one: the approval was turned down (a fresh sign-in, a change that
33
+ * moved) but the proposal itself still stands.
34
+ */
35
+ export interface ProposalDecisionRefusal {
36
+ /** The refusal, in the engine's own sentence. */
37
+ sentence: ReactNode;
38
+ /** What the person can do next, on its own quieter line. */
39
+ hint?: ReactNode;
40
+ }
22
41
  export interface ProposalCardLabels {
23
42
  needsApproval: string;
24
43
  needsSignIn: string;
@@ -30,6 +49,8 @@ export interface ProposalCardLabels {
30
49
  expired: string;
31
50
  stale: string;
32
51
  notApplied: string;
52
+ /** The Tag of a failed card whose outcome is `unknown`. */
53
+ notConfirmed: string;
33
54
  decline: string;
34
55
  confirmIdentity: string;
35
56
  prepareAgain: string;
@@ -44,6 +65,8 @@ export interface ProposalCardLabels {
44
65
  expiredNotice: string;
45
66
  staleNotice: string;
46
67
  nothingChanged: string;
68
+ /** The sentence of a failed card whose outcome is `unknown` and that has no `failure` of its own. */
69
+ unknownNotice: string;
47
70
  /** Why Decline is held while the approved change is carried out. */
48
71
  busy: string;
49
72
  }
@@ -81,12 +104,24 @@ export interface ProposalCardProps extends Omit<HTMLAttributes<HTMLElement>, 'ti
81
104
  onRetry?: (() => void) | undefined;
82
105
  /** What was done, for an applied card: "Created ENG-156 · assigned to Agent SWE". */
83
106
  receipt?: ReactNode;
84
- /** Why it was not applied, for a failed card, in the engine's own sentence. "Nothing changed." follows it. */
107
+ /**
108
+ * Why it was not applied, for a failed card, in the engine's own sentence.
109
+ * "Nothing changed." follows it when `failureOutcome` is `unchanged`.
110
+ */
85
111
  failure?: ReactNode;
112
+ /**
113
+ * What a failed card came to; see `ProposalFailureOutcome`. `unchanged`
114
+ * (the default) follows the sentence with "Nothing changed." under the Tag
115
+ * "Not applied". `unknown` never claims that: the Tag reads "Not
116
+ * confirmed" and the strip is the `failure` sentence alone, or
117
+ * `labels.unknownNotice` without one. Ignored in every other state.
118
+ */
119
+ failureOutcome?: ProposalFailureOutcome | undefined;
86
120
  /**
87
121
  * What the person can do next about a failure, on its own quieter line
88
- * after the failure sentence and "Nothing changed.": the route's next step,
89
- * such as "Ask an admin to give you access." Drawn only with `failure`.
122
+ * after the failure sentence (and "Nothing changed.", where it is said):
123
+ * the route's next step, such as "Ask an admin to give you access." Drawn
124
+ * only with `failure`.
90
125
  */
91
126
  failureHint?: ReactNode;
92
127
  /**
@@ -99,6 +134,16 @@ export interface ProposalCardProps extends Omit<HTMLAttributes<HTMLElement>, 'ti
99
134
  * other state. Decline stays available.
100
135
  */
101
136
  approveBlocked?: string | undefined;
137
+ /**
138
+ * Why the person's last decision was refused while the card still waits on
139
+ * one (`pending` or `stepup`): the approval came back refused, but the
140
+ * proposal stands and can be decided again. Drawn above the decision in the
141
+ * danger ink, with its hint, and announced politely: the foot keeps a live
142
+ * region for it from the moment the card can be decided, so words that
143
+ * arrive later are heard. The consumer clears it (on the next press, say).
144
+ * Ignored in every other state, where the strip says what happened.
145
+ */
146
+ decisionRefusal?: ProposalDecisionRefusal | undefined;
102
147
  /** Replaces the default sentence of a step-up, declined, expired or stale card. */
103
148
  notice?: ReactNode;
104
149
  labels?: Partial<ProposalCardLabels> | undefined;
@@ -130,5 +175,9 @@ export interface ProposalCardProps extends Omit<HTMLAttributes<HTMLElement>, 'ti
130
175
  *
131
176
  * Every sentence a refusal shows is the caller's (the engine's), never the
132
177
  * card's own words about why.
178
+ *
179
+ * "NOTHING CHANGED." ONLY WHEN IT IS TRUE. A failure whose outcome nobody
180
+ * could confirm (`failureOutcome="unknown"`) may have landed, so the card
181
+ * says "Not confirmed" and never adds the reassurance.
133
182
  */
134
- export declare function ProposalCard({ title, subtitle, state, scope, kind, summary, changes, changesHeading, note, approveLabel, onApprove, onDecline, onPrepareAgain, onRetry, receipt, failure, failureHint, approveBlocked, notice, labels: overrides, changeLabels, diffLabels, className, ...rest }: ProposalCardProps): import("react").JSX.Element;
183
+ export declare function ProposalCard({ title, subtitle, state, scope, kind, summary, changes, changesHeading, note, approveLabel, onApprove, onDecline, onPrepareAgain, onRetry, receipt, failure, failureOutcome, failureHint, approveBlocked, decisionRefusal, notice, labels: overrides, changeLabels, diffLabels, className, ...rest }: ProposalCardProps): import("react").JSX.Element;
@@ -1,3 +1,3 @@
1
1
  import './ProposalCard.css';
2
- export { PROPOSAL_CARD_LABELS, PROPOSAL_STATES, ProposalCard } from './ProposalCard.js';
3
- export type { ProposalCardLabels, ProposalCardProps, ProposalKind, ProposalScope, ProposalState } from './ProposalCard.js';
2
+ export { PROPOSAL_CARD_LABELS, PROPOSAL_FAILURE_OUTCOMES, PROPOSAL_STATES, ProposalCard } from './ProposalCard.js';
3
+ export type { ProposalCardLabels, ProposalCardProps, ProposalDecisionRefusal, ProposalFailureOutcome, ProposalKind, ProposalScope, ProposalState, } from './ProposalCard.js';
@@ -1,5 +1,5 @@
1
- export { PROPOSAL_CARD_LABELS, PROPOSAL_STATES, ProposalCard } from '../chunk-E4DZOE55.js';
2
- import '../chunk-XQI2OUV4.js';
1
+ export { PROPOSAL_CARD_LABELS, PROPOSAL_FAILURE_OUTCOMES, PROPOSAL_STATES, ProposalCard } from '../chunk-CIYHSTIF.js';
2
+ import '../chunk-LZXY6IMO.js';
3
3
  import '../chunk-WDIVALLP.js';
4
4
  import '../chunk-NEHSV55H.js';
5
5
  import '../chunk-Z3GDMNMU.js';
@@ -17,3 +17,13 @@
17
17
  font-size: var(--font-size-compact);
18
18
  text-align: end;
19
19
  }
20
+
21
+ /* WHY THE LAST DECISION WAS REFUSED, on a line of its own above the
22
+ decision and at its end, as the held primary's reason is: the refusal
23
+ strip's own inline drawing, which wraps rather than widening the row. */
24
+ .crewlet-proposal-card__refusal {
25
+ display: flex;
26
+ flex: 1 1 100%;
27
+ justify-content: flex-end;
28
+ text-align: end;
29
+ }
@@ -14,6 +14,13 @@ export interface ReceiptStripProps extends Omit<HTMLAttributes<HTMLDivElement>,
14
14
  children: ReactNode;
15
15
  /** Controls at the strip's end, such as Try again. */
16
16
  actions?: ReactNode;
17
+ /**
18
+ * Whether the strip is its own live region (true, the default: an alert
19
+ * for `danger`, a status otherwise). False leaves the announcement to a
20
+ * live region the host already keeps around it, which is the reliable way
21
+ * to announce words that arrive after the page did.
22
+ */
23
+ announce?: boolean | undefined;
17
24
  }
18
25
  /**
19
26
  * What happened, at the foot of a card: "Created ENG-156 · assigned to Agent
@@ -27,7 +34,7 @@ export interface ReceiptStripProps extends Omit<HTMLAttributes<HTMLDivElement>,
27
34
  * one tone a reader must not miss; every other tone is a polite status.
28
35
  * Colour is never alone: the mark and the words say the outcome.
29
36
  */
30
- export declare function ReceiptStrip({ tone, icon, children, actions, className, ...rest }: ReceiptStripProps): import("react").JSX.Element;
37
+ export declare function ReceiptStrip({ tone, icon, children, actions, announce, className, ...rest }: ReceiptStripProps): import("react").JSX.Element;
31
38
  export interface RefusalStripLabels {
32
39
  retry: string;
33
40
  dismiss: string;
@@ -48,6 +55,11 @@ export interface RefusalStripProps extends Omit<HTMLAttributes<HTMLElement>, 'ro
48
55
  onDismiss?: (() => void) | undefined;
49
56
  /** `inline` (the default) under a control; `foot` as a card's foot strip. */
50
57
  placement?: RefusalStripPlacement | undefined;
58
+ /**
59
+ * Whether the strip is its own alert (true, the default). False leaves the
60
+ * announcement to a live region the host keeps around it.
61
+ */
62
+ announce?: boolean | undefined;
51
63
  labels?: Partial<RefusalStripLabels> | undefined;
52
64
  }
53
65
  /**
@@ -63,4 +75,4 @@ export interface RefusalStripProps extends Omit<HTMLAttributes<HTMLElement>, 'ro
63
75
  * AN ALERT, because a write that did not happen is the one outcome a reader
64
76
  * must hear without looking for it.
65
77
  */
66
- export declare function RefusalStrip({ children, hint, onRetry, retrying, onDismiss, placement, labels: overrides, className, ...rest }: RefusalStripProps): import("react").JSX.Element;
78
+ export declare function RefusalStrip({ children, hint, onRetry, retrying, onDismiss, placement, announce, labels: overrides, className, ...rest }: RefusalStripProps): import("react").JSX.Element;
@@ -1,4 +1,4 @@
1
- export { REFUSAL_STRIP_LABELS, ReceiptStrip, RefusalStrip } from '../chunk-XQI2OUV4.js';
1
+ export { REFUSAL_STRIP_LABELS, ReceiptStrip, RefusalStrip } from '../chunk-LZXY6IMO.js';
2
2
  import '../chunk-HD4QJ2SI.js';
3
3
  import '../chunk-EA23JG6R.js';
4
4
  import '../chunk-BZFWDIV6.js';
@@ -1,4 +1,4 @@
1
- export { RichEditor, preloadRichEditor } from '../chunk-NI7WUPH3.js';
1
+ export { RichEditor, preloadRichEditor } from '../chunk-WBTCOFMZ.js';
2
2
  export { RICH_EDITOR_LABELS, richEditorLabels } from '../chunk-CSQTDGTS.js';
3
3
  import '../chunk-BAKPMH3S.js';
4
4
  import '../chunk-BPCY7ZID.js';
@@ -1,10 +1,10 @@
1
- import { ReceiptStrip, RefusalStrip } from './chunk-XQI2OUV4.js';
1
+ import { RefusalStrip, ReceiptStrip } from './chunk-LZXY6IMO.js';
2
2
  import { StatusCard } from './chunk-WDIVALLP.js';
3
3
  import { ChangeList } from './chunk-NEHSV55H.js';
4
4
  import { Button } from './chunk-HD4QJ2SI.js';
5
5
  import { Spinner } from './chunk-EA23JG6R.js';
6
6
  import { cx } from './chunk-ODEQTPFM.js';
7
- import './ProposalCard-HLB3FNLA.css';
7
+ import './ProposalCard-23575F4C.css';
8
8
  import { RefreshCwGlyph, LockGlyph, BanGlyph, ClockGlyph, CircleAlertGlyph, CircleCheckGlyph } from '@crewlethq/icons/glyphs';
9
9
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
10
10
 
@@ -18,6 +18,7 @@ var PROPOSAL_STATES = [
18
18
  "stale",
19
19
  "failed"
20
20
  ];
21
+ var PROPOSAL_FAILURE_OUTCOMES = ["unchanged", "unknown"];
21
22
  var PROPOSAL_CARD_LABELS = {
22
23
  needsApproval: "Needs your approval",
23
24
  needsSignIn: "Needs sign-in",
@@ -29,6 +30,7 @@ var PROPOSAL_CARD_LABELS = {
29
30
  expired: "Expired",
30
31
  stale: "Needs a fresh look",
31
32
  notApplied: "Not applied",
33
+ notConfirmed: "Not confirmed",
32
34
  decline: "Decline",
33
35
  confirmIdentity: "Confirm it\u2019s you",
34
36
  prepareAgain: "Prepare it again",
@@ -43,10 +45,11 @@ var PROPOSAL_CARD_LABELS = {
43
45
  expiredNotice: "This proposal expired. Nothing changed.",
44
46
  staleNotice: "What this would change moved after it was prepared, so it was not applied. Nothing changed.",
45
47
  nothingChanged: "Nothing changed.",
48
+ unknownNotice: "Could not confirm whether this was applied. It may have landed.",
46
49
  busy: "The approved change is being carried out"
47
50
  };
48
51
  var SETTLED = /* @__PURE__ */ new Set(["applied", "declined", "expired", "stale", "failed"]);
49
- function statusOf(state, scope, labels) {
52
+ function statusOf(state, scope, outcome, labels) {
50
53
  switch (state) {
51
54
  case "pending":
52
55
  return { label: labels.needsApproval, tone: "warning", icon: /* @__PURE__ */ jsx(ClockGlyph, { size: "xs" }) };
@@ -63,7 +66,11 @@ function statusOf(state, scope, labels) {
63
66
  case "stale":
64
67
  return { label: labels.stale, tone: "neutral", icon: /* @__PURE__ */ jsx(ClockGlyph, { size: "xs" }) };
65
68
  case "failed":
66
- return { label: labels.notApplied, tone: "danger", icon: /* @__PURE__ */ jsx(CircleAlertGlyph, { size: "xs" }) };
69
+ return {
70
+ label: outcome === "unknown" ? labels.notConfirmed : labels.notApplied,
71
+ tone: "danger",
72
+ icon: /* @__PURE__ */ jsx(CircleAlertGlyph, { size: "xs" })
73
+ };
67
74
  }
68
75
  }
69
76
  function headingOf(state, kind, labels) {
@@ -88,8 +95,10 @@ function ProposalCard({
88
95
  onRetry,
89
96
  receipt,
90
97
  failure,
98
+ failureOutcome = "unchanged",
91
99
  failureHint,
92
100
  approveBlocked,
101
+ decisionRefusal,
93
102
  notice,
94
103
  labels: overrides,
95
104
  changeLabels,
@@ -99,8 +108,18 @@ function ProposalCard({
99
108
  }) {
100
109
  const labels = overrides ? { ...PROPOSAL_CARD_LABELS, ...overrides } : PROPOSAL_CARD_LABELS;
101
110
  const settled = SETTLED.has(state);
102
- const blocked = (state === "pending" || state === "stepup") && approveBlocked ? approveBlocked : void 0;
103
- const decision = state === "pending" || state === "stepup" || state === "applying" ? /* @__PURE__ */ jsxs(Fragment, { children: [
111
+ const deciding = state === "pending" || state === "stepup";
112
+ const blocked = deciding && approveBlocked ? approveBlocked : void 0;
113
+ const refusal = deciding ? decisionRefusal : void 0;
114
+ const decision = deciding || state === "applying" ? /* @__PURE__ */ jsxs(Fragment, { children: [
115
+ /* @__PURE__ */ jsx(
116
+ "div",
117
+ {
118
+ role: "status",
119
+ className: cx("crewlet-proposal-card__refusal", refusal === void 0 && "crewlet-visually-hidden"),
120
+ children: refusal === void 0 ? null : /* @__PURE__ */ jsx(RefusalStrip, { announce: false, hint: refusal.hint, children: refusal.sentence })
121
+ }
122
+ ),
104
123
  blocked === void 0 ? null : /* @__PURE__ */ jsx("p", { className: "crewlet-proposal-card__blocked", "aria-hidden": "true", children: blocked }),
105
124
  /* @__PURE__ */ jsx(
106
125
  Button,
@@ -121,7 +140,7 @@ function ProposalCard({
121
140
  hint: failure === void 0 ? void 0 : failureHint,
122
141
  onRetry,
123
142
  labels: { retry: labels.tryAgain },
124
- children: failure === void 0 ? labels.nothingChanged : /* @__PURE__ */ jsxs(Fragment, { children: [
143
+ children: failureOutcome === "unknown" ? failure ?? labels.unknownNotice : failure === void 0 ? labels.nothingChanged : /* @__PURE__ */ jsxs(Fragment, { children: [
125
144
  failure,
126
145
  " ",
127
146
  labels.nothingChanged
@@ -134,13 +153,14 @@ function ProposalCard({
134
153
  ...rest,
135
154
  title,
136
155
  subtitle,
137
- status: statusOf(state, scope, labels),
156
+ status: statusOf(state, scope, failureOutcome, labels),
138
157
  settled,
139
158
  strip,
140
159
  actions: decision ?? again,
141
160
  actionsAlign: decision ? "end" : "start",
142
161
  className: cx("crewlet-proposal-card", `crewlet-proposal-card--${state}`, className),
143
162
  "data-state": state,
163
+ "data-outcome": state === "failed" ? failureOutcome : void 0,
144
164
  children: [
145
165
  summary === void 0 || summary === null ? null : /* @__PURE__ */ jsx("p", { className: "crewlet-proposal-card__summary", children: summary }),
146
166
  /* @__PURE__ */ jsx(
@@ -159,4 +179,4 @@ function ProposalCard({
159
179
  );
160
180
  }
161
181
 
162
- export { PROPOSAL_CARD_LABELS, PROPOSAL_STATES, ProposalCard };
182
+ export { PROPOSAL_CARD_LABELS, PROPOSAL_FAILURE_OUTCOMES, PROPOSAL_STATES, ProposalCard };
@@ -1,4 +1,4 @@
1
- import { ReceiptStrip } from './chunk-XQI2OUV4.js';
1
+ import { ReceiptStrip } from './chunk-LZXY6IMO.js';
2
2
  import { safeHref } from './chunk-BAKPMH3S.js';
3
3
  import { IconTile } from './chunk-3LI4TRUR.js';
4
4
  import { StatusCard } from './chunk-WDIVALLP.js';
@@ -11,12 +11,20 @@ var ICONS = {
11
11
  warning: /* @__PURE__ */ jsx(TriangleAlertGlyph, { size: "md" }),
12
12
  danger: /* @__PURE__ */ jsx(CircleAlertGlyph, { size: "md" })
13
13
  };
14
- function ReceiptStrip({ tone = "success", icon, children, actions, className, ...rest }) {
14
+ function ReceiptStrip({
15
+ tone = "success",
16
+ icon,
17
+ children,
18
+ actions,
19
+ announce = true,
20
+ className,
21
+ ...rest
22
+ }) {
15
23
  return /* @__PURE__ */ jsxs(
16
24
  "div",
17
25
  {
18
26
  ...rest,
19
- role: tone === "danger" ? "alert" : "status",
27
+ role: announce ? tone === "danger" ? "alert" : "status" : void 0,
20
28
  className: cx("crewlet-receipt-strip", `crewlet-receipt-strip--${tone}`, className),
21
29
  children: [
22
30
  /* @__PURE__ */ jsx("span", { className: "crewlet-receipt-strip__icon", "aria-hidden": "true", children: icon ?? ICONS[tone] }),
@@ -34,6 +42,7 @@ function RefusalStrip({
34
42
  retrying = false,
35
43
  onDismiss,
36
44
  placement = "inline",
45
+ announce = true,
37
46
  labels: overrides,
38
47
  className,
39
48
  ...rest
@@ -48,9 +57,9 @@ function RefusalStrip({
48
57
  hint === void 0 || hint === null ? null : /* @__PURE__ */ jsx("span", { className: "crewlet-refusal-strip__hint", children: hint })
49
58
  ] });
50
59
  if (placement === "foot") {
51
- return /* @__PURE__ */ jsx(ReceiptStrip, { ...rest, tone: "danger", actions, className: cx("crewlet-refusal-strip--foot", className), children: words });
60
+ return /* @__PURE__ */ jsx(ReceiptStrip, { ...rest, tone: "danger", announce, actions, className: cx("crewlet-refusal-strip--foot", className), children: words });
52
61
  }
53
- return /* @__PURE__ */ jsxs("span", { ...rest, role: "alert", className: cx("crewlet-refusal-strip", className), children: [
62
+ return /* @__PURE__ */ jsxs("span", { ...rest, role: announce ? "alert" : void 0, className: cx("crewlet-refusal-strip", className), children: [
54
63
  words,
55
64
  actions
56
65
  ] });
@@ -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-X2J47LPD.js').then(
12
+ loading ??= import('./Editor-S4HARQ7V.js').then(
13
13
  (module) => {
14
14
  engine = module.Editor;
15
15
  return engine;
@@ -2,8 +2,9 @@ import { useMediaMatch } from './chunk-RTPQDNW3.js';
2
2
  import { Menu } from './chunk-TKS7FTTO.js';
3
3
  import { PeekContext, AsideContext, ResizeHandle, clampSize } from './chunk-PIYJNCN7.js';
4
4
  import { HIT_AREA_CLASS } from './chunk-2YTOOH3A.js';
5
- import { useModalLayer, focusables } from './chunk-H5XTJ7GJ.js';
5
+ import { focusables, useModalLayer, isComposing, layerCount } from './chunk-H5XTJ7GJ.js';
6
6
  import { IconButton } from './chunk-2BQYODY3.js';
7
+ import { returnFocus } from './chunk-NUZHC6MM.js';
7
8
  import { VisuallyHidden } from './chunk-BZFWDIV6.js';
8
9
  import { cx } from './chunk-ODEQTPFM.js';
9
10
  import './HitArea-QUOS6ZDJ.css';
@@ -102,6 +103,7 @@ function AppShell({
102
103
  asideReserve,
103
104
  asideLabel,
104
105
  asideShape = "column",
106
+ asideModal = true,
105
107
  onAsideClose,
106
108
  asideResize,
107
109
  peek,
@@ -245,6 +247,7 @@ function AppShell({
245
247
  ShellAside,
246
248
  {
247
249
  shape: asideShape,
250
+ modal: asideShape === "sheet" || asideShape === "overlay" && asideModal,
248
251
  label: asideLabel,
249
252
  width: asideWidth,
250
253
  resize: asideResize,
@@ -256,10 +259,10 @@ function AppShell({
256
259
  }
257
260
  ) });
258
261
  }
259
- function ShellAside({ shape, label, width, resize, onClose, children }) {
262
+ function ShellAside({ shape, modal, label, width, resize, onClose, children }) {
260
263
  const region = useRef(null);
261
264
  const surfaceId = useId();
262
- const modal = shape !== "column";
265
+ useLooseOverlay(region, shape === "overlay" && !modal, onClose);
263
266
  const [z, setZ] = useState(null);
264
267
  return /* @__PURE__ */ jsxs(AsideContext.Provider, { value: { shape }, children: [
265
268
  /* @__PURE__ */ jsxs(
@@ -271,10 +274,11 @@ function ShellAside({ shape, label, width, resize, onClose, children }) {
271
274
  role: modal ? "dialog" : "complementary",
272
275
  "aria-modal": modal || void 0,
273
276
  "aria-label": label,
274
- tabIndex: modal ? -1 : void 0,
277
+ tabIndex: modal || shape === "overlay" ? -1 : void 0,
278
+ "data-modal": modal ? "true" : "false",
275
279
  style: modal && z !== null ? { zIndex: z + 1 } : void 0,
276
280
  children: [
277
- !modal && resize ? /* @__PURE__ */ jsx(
281
+ shape === "column" && resize ? /* @__PURE__ */ jsx(
278
282
  ResizeHandle,
279
283
  {
280
284
  label: resize.label,
@@ -295,6 +299,39 @@ function ShellAside({ shape, label, width, resize, onClose, children }) {
295
299
  modal ? /* @__PURE__ */ jsx(AsideVeil, { region, onClose, onZIndex: setZ }) : null
296
300
  ] });
297
301
  }
302
+ function useLooseOverlay(region, active, onClose) {
303
+ const [opener] = useState(() => typeof document === "undefined" ? null : document.activeElement);
304
+ const loose = useRef(active);
305
+ loose.current = active;
306
+ const close = useRef(onClose);
307
+ close.current = onClose;
308
+ useEffect(() => {
309
+ const panel = region.current;
310
+ if (!loose.current || !panel || panel.contains(document.activeElement)) return;
311
+ (focusables(panel)[0] ?? panel).focus();
312
+ }, [region]);
313
+ useLayoutEffect(() => {
314
+ const panel = region.current;
315
+ return () => {
316
+ if (!loose.current || !panel?.contains(document.activeElement)) return;
317
+ if (opener instanceof HTMLElement && opener.isConnected && opener !== document.body) returnFocus(opener);
318
+ };
319
+ }, [region, opener]);
320
+ useEffect(() => {
321
+ const panel = region.current;
322
+ if (!active || !panel) return void 0;
323
+ const doc = panel.ownerDocument;
324
+ const onKeyDown = (event) => {
325
+ if (event.key !== "Escape" || event.defaultPrevented || isComposing(event)) return;
326
+ if (!(event.target instanceof Node) || !panel.contains(event.target)) return;
327
+ if (layerCount() > 0 || !close.current) return;
328
+ event.preventDefault();
329
+ close.current();
330
+ };
331
+ doc.addEventListener("keydown", onKeyDown);
332
+ return () => doc.removeEventListener("keydown", onKeyDown);
333
+ }, [active, region]);
334
+ }
298
335
  function AsideVeil({
299
336
  region,
300
337
  onClose,
@@ -1,8 +1,8 @@
1
1
  import '../chunk-EWTPXRRM.js';
2
2
  export { ElementToPngError, elementToPng, parseCsv, serializeElement, toCsv } from '../chunk-FEJANUZK.js';
3
3
  export { TreeCanvas } from '../chunk-YCZ2FBKA.js';
4
- export { TypeSpecimen } from '../chunk-JKAFEFFC.js';
5
4
  export { VERSION_COMPARE_LABELS, VERSION_COMPARE_LENSES, VersionCompare } from '../chunk-OHG7762N.js';
5
+ export { TypeSpecimen } from '../chunk-JKAFEFFC.js';
6
6
  export { VersionTimeline } from '../chunk-67MW366X.js';
7
7
  export { WidgetFrame } from '../chunk-PDTEPN4D.js';
8
8
  export { ThemeToggle } from '../chunk-N3ISZVLK.js';
@@ -15,13 +15,13 @@ export { ThemeGallery } from '../chunk-ESUZ27TS.js';
15
15
  export { ThemeSwatch } from '../chunk-MNFU2RNT.js';
16
16
  export { DensitySwitcher, ThemeSwitcher } from '../chunk-S5C64PTT.js';
17
17
  export { applyStoredPreferences, resolveTheme, useDensityPreference, useSystemTheme, useThemePreference } from '../chunk-Z24ZUSTX.js';
18
- export { StatGroup } from '../chunk-OUD75UB2.js';
19
18
  export { SuggestionList, SuggestionRow } from '../chunk-SDSBVVLL.js';
20
19
  export { Switcher } from '../chunk-67F2AM4R.js';
21
20
  export { TABLE_TAGS_CELL_LABELS, TableDateCell, TableEntityCell, TableKeyCell, TableNumberCell, TableStatusCell, TableTagsCell, TableTextCell } from '../chunk-3EYSYEXP.js';
22
21
  export { SlideGrid } from '../chunk-3V5T5K5H.js';
23
22
  export { SOURCE_EDITOR_KEYS, SourceEditor, lineStart } from '../chunk-D3EJSLCL.js';
24
23
  export { StatCard } from '../chunk-YPTTSJPM.js';
24
+ export { StatGroup } from '../chunk-OUD75UB2.js';
25
25
  export { Statement } from '../chunk-MZJKPTA5.js';
26
26
  export { CellDisplay, CellEditor, CheckboxCell, DateCell, LongTextCell, MultiSelectCell, NumberCell, PersonCell, RatingCell, SelectCell, SheetCell, SheetGrid, StatusCell, TextCell, UrlCell } from '../chunk-TD3UHDFY.js';
27
27
  export { TagGroup } from '../chunk-O2EGEONV.js';
@@ -32,15 +32,15 @@ export { SlideFilmstrip } from '../chunk-WOW5SCEK.js';
32
32
  export { SegmentedMeter, segmentedMeterLabel } from '../chunk-4AK52VHB.js';
33
33
  export { SelectionBar } from '../chunk-NK3D66PB.js';
34
34
  export { SEND_BUTTON_LABELS, SendButton } from '../chunk-JILNCBBS.js';
35
- export { SettingsTable, SettingsTableRow } from '../chunk-4RKTZSEW.js';
36
35
  export { SetupWizard } from '../chunk-D5OSP3KI.js';
36
+ export { SettingsTable, SettingsTableRow } from '../chunk-4RKTZSEW.js';
37
37
  export { ARTIFACT_ROLES, SHAREABLE_ROLES, ShareDialog, roleAtLeast } from '../chunk-OOZ5AGPS.js';
38
38
  export { SHEET_COLUMN_EDITOR_LABELS, SheetColumnEditor, SheetColumnTypeGlyph } from '../chunk-EBG3V4MK.js';
39
39
  export { Select } from '../chunk-XQZ6EWOE.js';
40
- export { RichEditor, preloadRichEditor } from '../chunk-NI7WUPH3.js';
41
- export { RICH_EDITOR_LABELS, richEditorLabels } from '../chunk-CSQTDGTS.js';
42
40
  export { canonicalMarkdown, roundTripMarkdown } from '../chunk-SWD4QBL6.js';
43
41
  import '../chunk-QH6VYJ3X.js';
42
+ export { RichEditor, preloadRichEditor } from '../chunk-WBTCOFMZ.js';
43
+ export { RICH_EDITOR_LABELS, richEditorLabels } from '../chunk-CSQTDGTS.js';
44
44
  export { RUN_STATES, RunChip } from '../chunk-EVWTLFKI.js';
45
45
  export { STEP_STATES, STEP_STATE_LABELS, StepList, StepStateMark, Stepper, stepDetailPieces } from '../chunk-CGT4R7LW.js';
46
46
  export { FRAME_HELLO_TIMEOUT_MS, FRAME_LOAD_GRACE_MS, SandboxedFrame, SandboxedFrameNotice, SandboxedFramePlaceholder } from '../chunk-OZIBNFLO.js';
@@ -58,10 +58,10 @@ export { PresenterView, formatStopwatch } from '../chunk-EGL24VY5.js';
58
58
  export { SLIDE_NAV_LABELS, SlideNav } from '../chunk-OHBXOEP3.js';
59
59
  export { SLIDE_HEIGHT, SLIDE_WIDTH, SlideStage, useSlideKeys } from '../chunk-RMEBFYL7.js';
60
60
  export { PricingCard } from '../chunk-U3ILLCR2.js';
61
+ export { PrincipalPicker } from '../chunk-TA72CURM.js';
61
62
  export { PropertyList } from '../chunk-XZ42MKHK.js';
62
- export { PROPOSAL_CARD_LABELS, PROPOSAL_STATES, ProposalCard } from '../chunk-E4DZOE55.js';
63
+ export { PROPOSAL_CARD_LABELS, PROPOSAL_FAILURE_OUTCOMES, PROPOSAL_STATES, ProposalCard } from '../chunk-CIYHSTIF.js';
63
64
  export { Prose } from '../chunk-JCSA3XVH.js';
64
- export { PrincipalPicker } from '../chunk-TA72CURM.js';
65
65
  export { QR_DARK, QR_LIGHT, QR_QUIET_ZONE, QrCode, qrModulePath, qrModules } from '../chunk-Y56FM3K4.js';
66
66
  export { PageNote } from '../chunk-CV4NES3P.js';
67
67
  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-LXYSWQNE.js';
@@ -70,8 +70,8 @@ export { PinTile } from '../chunk-JMMS2PQU.js';
70
70
  export { PresenceStack } from '../chunk-3LYWD3BO.js';
71
71
  import '../chunk-CENOOTAV.js';
72
72
  export { FactLine, ObjectHeader, SetByLine } from '../chunk-ICWUDNAZ.js';
73
- export { OPEN_IN_APP_CARD_LABELS, OpenInAppCard } from '../chunk-YY445YFQ.js';
74
- export { REFUSAL_STRIP_LABELS, ReceiptStrip, RefusalStrip } from '../chunk-XQI2OUV4.js';
73
+ export { OPEN_IN_APP_CARD_LABELS, OpenInAppCard } from '../chunk-CZNG3V6L.js';
74
+ export { REFUSAL_STRIP_LABELS, ReceiptStrip, RefusalStrip } from '../chunk-LZXY6IMO.js';
75
75
  export { OrgNodeDisclosure, OrgNodeLabel, OrgNodeLead } from '../chunk-YA3AWELW.js';
76
76
  export { OrgTable, OrgTableActions, OrgTableAdd, OrgTableName } from '../chunk-GPW4M4OI.js';
77
77
  export { TreeGrid } from '../chunk-VRNUKH2W.js';
@@ -138,8 +138,8 @@ export { CONFLICT_NOTE_LABELS, ConflictNote } from '../chunk-HVEDVKXL.js';
138
138
  export { Container } from '../chunk-HJO4WCH6.js';
139
139
  export { ContrastHelp } from '../chunk-YCGZK2E4.js';
140
140
  export { ContrastBadge, ContrastLevelTag, contrastLevel, contrastRatio, formatContrastRatio } from '../chunk-WW7TU6HE.js';
141
- export { ChoiceList } from '../chunk-EAQLI2SO.js';
142
141
  export { CodeBlock } from '../chunk-6T6V5565.js';
142
+ export { ChoiceList } from '../chunk-EAQLI2SO.js';
143
143
  export { ColorChip } from '../chunk-6GTTRJWJ.js';
144
144
  export { ColorField } from '../chunk-3NQS6KYG.js';
145
145
  export { ColorSwatch } from '../chunk-NQGZRMUG.js';
@@ -165,18 +165,18 @@ export { CalendarGrid, compareDays, daysInMonth, sameDay, shiftDay, shiftMonth,
165
165
  export { Callout } from '../chunk-BPCY7ZID.js';
166
166
  export { BOARD_NAME_MIN_CHARS, CANVAS_BOARD_MAX_LIVE, CANVAS_BOARD_MIN_LIVE_WIDTH, CANVAS_BOARD_MIN_ZOOM, CANVAS_NOTE_COLORS, CanvasBoard, TITLE_GLYPH_EM, boardName, boardRoom, liveBoards, titleSize } from '../chunk-Q6R6EUQ4.js';
167
167
  export { Note } from '../chunk-5SZGKSGL.js';
168
+ export { CanvasSchematic } from '../chunk-NBWNLYWZ.js';
168
169
  export { CanvasToolbar, toolForKey } from '../chunk-LQ6AGUDL.js';
169
170
  export { Toolbar, ToolbarOverflow, ToolbarWide } from '../chunk-NR4CPM4T.js';
170
171
  export { CANVAS_COMPOSE_CONTEXT, CANVAS_FIT_MAX_ZOOM, CANVAS_FIT_PADDING, CANVAS_FOCUS_CONTEXT, CANVAS_MAX_ZOOM, CANVAS_MIN_ZOOM, CANVAS_PAN_MARGIN, CANVAS_PAN_STEP, CANVAS_REVEAL_PADDING, CANVAS_TAP_SLOP, CANVAS_WHEEL_LINE_PX, CANVAS_WHEEL_ZOOM_PER_PIXEL, CANVAS_ZOOM_CEILING, CANVAS_ZOOM_LIMITS, CANVAS_ZOOM_STEP, Canvas, IDENTITY_VIEW, ShortcutTip, anchorView, beyondSlop, clampPan, clampZoom, fitView, gridOf, panBy, pinchView, regionView, revealView, screenRect, toScreen, toWorld, wheelPixels, wheelZoomFactor, zoomAt, zoomLimits } from '../chunk-YEURM24I.js';
171
172
  import '../chunk-LM3ISVJA.js';
172
- export { CanvasSchematic } from '../chunk-NBWNLYWZ.js';
173
173
  export { CatalogTile } from '../chunk-TGSIVB6H.js';
174
- export { BrandChip } from '../chunk-ZH77BXMA.js';
175
174
  export { AvatarPicker } from '../chunk-4OINEWR4.js';
176
175
  export { HuePicker, HueSwatch } from '../chunk-OYAXKHVW.js';
177
176
  export { Popover } from '../chunk-KHJIEPZV.js';
178
177
  export { NODE_HUES, NODE_HUE_NAMES, isNodeHue } from '../chunk-AYKXMIOR.js';
179
178
  export { CHARACTER_PICKER_COLUMNS, CharacterPicker } from '../chunk-SNQRGH4A.js';
179
+ export { BrandChip } from '../chunk-ZH77BXMA.js';
180
180
  export { BrandSample } from '../chunk-AVMQMY66.js';
181
181
  export { BrandScope, brandScopeInputs } from '../chunk-X7WEE3EK.js';
182
182
  import '../chunk-5SGHW42B.js';
@@ -235,7 +235,7 @@ export { DisclosureAnatomy } from '../chunk-TFGCNBWP.js';
235
235
  export { Count } from '../chunk-BHHIIK3M.js';
236
236
  export { HeadingLevelProvider, headingTag, nextHeadingLevel, useHeadingLevel } from '../chunk-PQADV6P6.js';
237
237
  export { Announcer, announce, useAnnouncer } from '../chunk-RSAQOKH3.js';
238
- export { APP_SHELL_ASIDE_WIDTH, AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellRailStatus, AppShellToggle, AppShellTopbar, readStoredWidth, useAppShell, useStoredWidth } from '../chunk-UVYGMCJ4.js';
238
+ export { APP_SHELL_ASIDE_WIDTH, AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellRailStatus, AppShellToggle, AppShellTopbar, readStoredWidth, useAppShell, useStoredWidth } from '../chunk-YGC7BFX2.js';
239
239
  export { useMediaMatch } from '../chunk-RTPQDNW3.js';
240
240
  export { Menu } from '../chunk-TKS7FTTO.js';
241
241
  export { RESIZE_HANDLE_LARGE_STEP, RESIZE_HANDLE_STEP, ResizeHandle, clampSize, useAppShellAside, useAppShellPeek } from '../chunk-PIYJNCN7.js';
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import './chunk-EWTPXRRM.js';
2
2
  export { ElementToPngError, elementToPng, parseCsv, serializeElement, toCsv } from './chunk-FEJANUZK.js';
3
3
  export { TreeCanvas } from './chunk-YCZ2FBKA.js';
4
- export { TypeSpecimen } from './chunk-JKAFEFFC.js';
5
4
  export { VERSION_COMPARE_LABELS, VERSION_COMPARE_LENSES, VersionCompare } from './chunk-OHG7762N.js';
5
+ export { TypeSpecimen } from './chunk-JKAFEFFC.js';
6
6
  export { VersionTimeline } from './chunk-67MW366X.js';
7
7
  export { WidgetFrame } from './chunk-PDTEPN4D.js';
8
8
  export { ThemeToggle } from './chunk-N3ISZVLK.js';
@@ -15,13 +15,13 @@ export { ThemeGallery } from './chunk-ESUZ27TS.js';
15
15
  export { ThemeSwatch } from './chunk-MNFU2RNT.js';
16
16
  export { DensitySwitcher, ThemeSwitcher } from './chunk-S5C64PTT.js';
17
17
  export { applyStoredPreferences, resolveTheme, useDensityPreference, useSystemTheme, useThemePreference } from './chunk-Z24ZUSTX.js';
18
- export { StatGroup } from './chunk-OUD75UB2.js';
19
18
  export { SuggestionList, SuggestionRow } from './chunk-SDSBVVLL.js';
20
19
  export { Switcher } from './chunk-67F2AM4R.js';
21
20
  export { TABLE_TAGS_CELL_LABELS, TableDateCell, TableEntityCell, TableKeyCell, TableNumberCell, TableStatusCell, TableTagsCell, TableTextCell } from './chunk-3EYSYEXP.js';
22
21
  export { SlideGrid } from './chunk-3V5T5K5H.js';
23
22
  export { SOURCE_EDITOR_KEYS, SourceEditor, lineStart } from './chunk-D3EJSLCL.js';
24
23
  export { StatCard } from './chunk-YPTTSJPM.js';
24
+ export { StatGroup } from './chunk-OUD75UB2.js';
25
25
  export { Statement } from './chunk-MZJKPTA5.js';
26
26
  export { CellDisplay, CellEditor, CheckboxCell, DateCell, LongTextCell, MultiSelectCell, NumberCell, PersonCell, RatingCell, SelectCell, SheetCell, SheetGrid, StatusCell, TextCell, UrlCell } from './chunk-TD3UHDFY.js';
27
27
  export { TagGroup } from './chunk-O2EGEONV.js';
@@ -32,15 +32,15 @@ export { SlideFilmstrip } from './chunk-WOW5SCEK.js';
32
32
  export { SegmentedMeter, segmentedMeterLabel } from './chunk-4AK52VHB.js';
33
33
  export { SelectionBar } from './chunk-NK3D66PB.js';
34
34
  export { SEND_BUTTON_LABELS, SendButton } from './chunk-JILNCBBS.js';
35
- export { SettingsTable, SettingsTableRow } from './chunk-4RKTZSEW.js';
36
35
  export { SetupWizard } from './chunk-D5OSP3KI.js';
36
+ export { SettingsTable, SettingsTableRow } from './chunk-4RKTZSEW.js';
37
37
  export { ARTIFACT_ROLES, SHAREABLE_ROLES, ShareDialog, roleAtLeast } from './chunk-OOZ5AGPS.js';
38
38
  export { SHEET_COLUMN_EDITOR_LABELS, SheetColumnEditor, SheetColumnTypeGlyph } from './chunk-EBG3V4MK.js';
39
39
  export { Select } from './chunk-XQZ6EWOE.js';
40
- export { RichEditor, preloadRichEditor } from './chunk-NI7WUPH3.js';
41
- export { RICH_EDITOR_LABELS, richEditorLabels } from './chunk-CSQTDGTS.js';
42
40
  export { canonicalMarkdown, roundTripMarkdown } from './chunk-SWD4QBL6.js';
43
41
  import './chunk-QH6VYJ3X.js';
42
+ export { RichEditor, preloadRichEditor } from './chunk-WBTCOFMZ.js';
43
+ export { RICH_EDITOR_LABELS, richEditorLabels } from './chunk-CSQTDGTS.js';
44
44
  export { RUN_STATES, RunChip } from './chunk-EVWTLFKI.js';
45
45
  export { STEP_STATES, STEP_STATE_LABELS, StepList, StepStateMark, Stepper, stepDetailPieces } from './chunk-CGT4R7LW.js';
46
46
  export { FRAME_HELLO_TIMEOUT_MS, FRAME_LOAD_GRACE_MS, SandboxedFrame, SandboxedFrameNotice, SandboxedFramePlaceholder } from './chunk-OZIBNFLO.js';
@@ -58,10 +58,10 @@ export { PresenterView, formatStopwatch } from './chunk-EGL24VY5.js';
58
58
  export { SLIDE_NAV_LABELS, SlideNav } from './chunk-OHBXOEP3.js';
59
59
  export { SLIDE_HEIGHT, SLIDE_WIDTH, SlideStage, useSlideKeys } from './chunk-RMEBFYL7.js';
60
60
  export { PricingCard } from './chunk-U3ILLCR2.js';
61
+ export { PrincipalPicker } from './chunk-TA72CURM.js';
61
62
  export { PropertyList } from './chunk-XZ42MKHK.js';
62
- export { PROPOSAL_CARD_LABELS, PROPOSAL_STATES, ProposalCard } from './chunk-E4DZOE55.js';
63
+ export { PROPOSAL_CARD_LABELS, PROPOSAL_FAILURE_OUTCOMES, PROPOSAL_STATES, ProposalCard } from './chunk-CIYHSTIF.js';
63
64
  export { Prose } from './chunk-JCSA3XVH.js';
64
- export { PrincipalPicker } from './chunk-TA72CURM.js';
65
65
  export { QR_DARK, QR_LIGHT, QR_QUIET_ZONE, QrCode, qrModulePath, qrModules } from './chunk-Y56FM3K4.js';
66
66
  export { PageNote } from './chunk-CV4NES3P.js';
67
67
  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-LXYSWQNE.js';
@@ -70,8 +70,8 @@ export { PinTile } from './chunk-JMMS2PQU.js';
70
70
  export { PresenceStack } from './chunk-3LYWD3BO.js';
71
71
  import './chunk-CENOOTAV.js';
72
72
  export { FactLine, ObjectHeader, SetByLine } from './chunk-ICWUDNAZ.js';
73
- export { OPEN_IN_APP_CARD_LABELS, OpenInAppCard } from './chunk-YY445YFQ.js';
74
- export { REFUSAL_STRIP_LABELS, ReceiptStrip, RefusalStrip } from './chunk-XQI2OUV4.js';
73
+ export { OPEN_IN_APP_CARD_LABELS, OpenInAppCard } from './chunk-CZNG3V6L.js';
74
+ export { REFUSAL_STRIP_LABELS, ReceiptStrip, RefusalStrip } from './chunk-LZXY6IMO.js';
75
75
  export { OrgNodeDisclosure, OrgNodeLabel, OrgNodeLead } from './chunk-YA3AWELW.js';
76
76
  export { OrgTable, OrgTableActions, OrgTableAdd, OrgTableName } from './chunk-GPW4M4OI.js';
77
77
  export { TreeGrid } from './chunk-VRNUKH2W.js';
@@ -138,8 +138,8 @@ export { CONFLICT_NOTE_LABELS, ConflictNote } from './chunk-HVEDVKXL.js';
138
138
  export { Container } from './chunk-HJO4WCH6.js';
139
139
  export { ContrastHelp } from './chunk-YCGZK2E4.js';
140
140
  export { ContrastBadge, ContrastLevelTag, contrastLevel, contrastRatio, formatContrastRatio } from './chunk-WW7TU6HE.js';
141
- export { ChoiceList } from './chunk-EAQLI2SO.js';
142
141
  export { CodeBlock } from './chunk-6T6V5565.js';
142
+ export { ChoiceList } from './chunk-EAQLI2SO.js';
143
143
  export { ColorChip } from './chunk-6GTTRJWJ.js';
144
144
  export { ColorField } from './chunk-3NQS6KYG.js';
145
145
  export { ColorSwatch } from './chunk-NQGZRMUG.js';
@@ -165,18 +165,18 @@ export { CalendarGrid, compareDays, daysInMonth, sameDay, shiftDay, shiftMonth,
165
165
  export { Callout } from './chunk-BPCY7ZID.js';
166
166
  export { BOARD_NAME_MIN_CHARS, CANVAS_BOARD_MAX_LIVE, CANVAS_BOARD_MIN_LIVE_WIDTH, CANVAS_BOARD_MIN_ZOOM, CANVAS_NOTE_COLORS, CanvasBoard, TITLE_GLYPH_EM, boardName, boardRoom, liveBoards, titleSize } from './chunk-Q6R6EUQ4.js';
167
167
  export { Note } from './chunk-5SZGKSGL.js';
168
+ export { CanvasSchematic } from './chunk-NBWNLYWZ.js';
168
169
  export { CanvasToolbar, toolForKey } from './chunk-LQ6AGUDL.js';
169
170
  export { Toolbar, ToolbarOverflow, ToolbarWide } from './chunk-NR4CPM4T.js';
170
171
  export { CANVAS_COMPOSE_CONTEXT, CANVAS_FIT_MAX_ZOOM, CANVAS_FIT_PADDING, CANVAS_FOCUS_CONTEXT, CANVAS_MAX_ZOOM, CANVAS_MIN_ZOOM, CANVAS_PAN_MARGIN, CANVAS_PAN_STEP, CANVAS_REVEAL_PADDING, CANVAS_TAP_SLOP, CANVAS_WHEEL_LINE_PX, CANVAS_WHEEL_ZOOM_PER_PIXEL, CANVAS_ZOOM_CEILING, CANVAS_ZOOM_LIMITS, CANVAS_ZOOM_STEP, Canvas, IDENTITY_VIEW, ShortcutTip, anchorView, beyondSlop, clampPan, clampZoom, fitView, gridOf, panBy, pinchView, regionView, revealView, screenRect, toScreen, toWorld, wheelPixels, wheelZoomFactor, zoomAt, zoomLimits } from './chunk-YEURM24I.js';
171
172
  import './chunk-LM3ISVJA.js';
172
- export { CanvasSchematic } from './chunk-NBWNLYWZ.js';
173
173
  export { CatalogTile } from './chunk-TGSIVB6H.js';
174
- export { BrandChip } from './chunk-ZH77BXMA.js';
175
174
  export { AvatarPicker } from './chunk-4OINEWR4.js';
176
175
  export { HuePicker, HueSwatch } from './chunk-OYAXKHVW.js';
177
176
  export { Popover } from './chunk-KHJIEPZV.js';
178
177
  export { NODE_HUES, NODE_HUE_NAMES, isNodeHue } from './chunk-AYKXMIOR.js';
179
178
  export { CHARACTER_PICKER_COLUMNS, CharacterPicker } from './chunk-SNQRGH4A.js';
179
+ export { BrandChip } from './chunk-ZH77BXMA.js';
180
180
  export { BrandSample } from './chunk-AVMQMY66.js';
181
181
  export { BrandScope, brandScopeInputs } from './chunk-X7WEE3EK.js';
182
182
  import './chunk-5SGHW42B.js';
@@ -235,7 +235,7 @@ export { DisclosureAnatomy } from './chunk-TFGCNBWP.js';
235
235
  export { Count } from './chunk-BHHIIK3M.js';
236
236
  export { HeadingLevelProvider, headingTag, nextHeadingLevel, useHeadingLevel } from './chunk-PQADV6P6.js';
237
237
  export { Announcer, announce, useAnnouncer } from './chunk-RSAQOKH3.js';
238
- export { APP_SHELL_ASIDE_WIDTH, AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellRailStatus, AppShellToggle, AppShellTopbar, readStoredWidth, useAppShell, useStoredWidth } from './chunk-UVYGMCJ4.js';
238
+ export { APP_SHELL_ASIDE_WIDTH, AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellRailStatus, AppShellToggle, AppShellTopbar, readStoredWidth, useAppShell, useStoredWidth } from './chunk-YGC7BFX2.js';
239
239
  export { useMediaMatch } from './chunk-RTPQDNW3.js';
240
240
  export { Menu } from './chunk-TKS7FTTO.js';
241
241
  export { RESIZE_HANDLE_LARGE_STEP, RESIZE_HANDLE_STEP, ResizeHandle, clampSize, useAppShellAside, useAppShellPeek } from './chunk-PIYJNCN7.js';
package/dist/styles.css CHANGED
@@ -25260,7 +25260,7 @@ button.crewlet-presence-stack__member:focus-visible {
25260
25260
  }
25261
25261
 
25262
25262
 
25263
- /* ProposalCard-HLB3FNLA.css */
25263
+ /* ProposalCard-23575F4C.css */
25264
25264
  /*
25265
25265
  * A proposed change. The card, its head, its strip and its foot are
25266
25266
  * StatusCard's; only the note's register is said here: the consequence is a
@@ -25281,6 +25281,16 @@ button.crewlet-presence-stack__member:focus-visible {
25281
25281
  text-align: end;
25282
25282
  }
25283
25283
 
25284
+ /* WHY THE LAST DECISION WAS REFUSED, on a line of its own above the
25285
+ decision and at its end, as the held primary's reason is: the refusal
25286
+ strip's own inline drawing, which wraps rather than widening the row. */
25287
+ .crewlet-proposal-card__refusal {
25288
+ display: flex;
25289
+ flex: 1 1 100%;
25290
+ justify-content: flex-end;
25291
+ text-align: end;
25292
+ }
25293
+
25284
25294
 
25285
25295
  /* Prose-BTXNFT2Q.css */
25286
25296
  /*
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crewlethq/ui",
3
- "version": "0.56.0",
3
+ "version": "0.57.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.56.0",
46
- "@crewlethq/tokens": "0.56.0",
45
+ "@crewlethq/icons": "0.57.0",
46
+ "@crewlethq/tokens": "0.57.0",
47
47
  "prosemirror-commands": "1.7.2",
48
48
  "prosemirror-gapcursor": "1.4.1",
49
49
  "prosemirror-history": "1.5.1",
@@ -1,5 +1,5 @@
1
- import { richEditorLabels } from './chunk-CSQTDGTS.js';
2
1
  import { schema, readMarkdown, writeMarkdown } from './chunk-QH6VYJ3X.js';
2
+ import { richEditorLabels } from './chunk-CSQTDGTS.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-FXQLNETQ.js';