@lukeashford/aurelius 4.6.0 → 4.7.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.
@@ -258,6 +258,58 @@
258
258
  pointer-events: auto;
259
259
  }
260
260
 
261
+ /* === Compact card ===
262
+ * Surfaced in chat-tree-style artifact lists where the full multi-page
263
+ * renderer would be cramped. Borrows the cover treatment but constrains it
264
+ * to card dimensions and adds a footer that invites the viewer to expand
265
+ * to the full presentation.
266
+ */
267
+
268
+ @utility deliverable-card {
269
+ --deliverable-accent: var(--color-gold);
270
+ display: flex;
271
+ flex-direction: column;
272
+ }
273
+
274
+ @utility deliverable-card-cover {
275
+ display: flex;
276
+ flex-direction: column;
277
+ align-items: flex-start;
278
+ gap: var(--spacing-2);
279
+ padding: var(--spacing-6);
280
+ border-bottom: 1px solid color-mix(in oklab, var(--deliverable-accent) 30%, transparent);
281
+ }
282
+
283
+ @utility deliverable-card-eyebrow {
284
+ text-transform: uppercase;
285
+ letter-spacing: var(--letter-spacing-widest);
286
+ color: var(--color-silver);
287
+ font-size: var(--text-xs);
288
+ }
289
+
290
+ @utility deliverable-card-title {
291
+ font-family: var(--font-heading);
292
+ font-size: var(--text-2xl);
293
+ line-height: var(--text-2xl--line-height);
294
+ color: var(--deliverable-accent);
295
+ letter-spacing: var(--letter-spacing-tight);
296
+ }
297
+
298
+ @utility deliverable-card-subtitle {
299
+ font-size: var(--text-sm);
300
+ color: var(--color-silver);
301
+ }
302
+
303
+ @utility deliverable-card-meta {
304
+ display: flex;
305
+ align-items: center;
306
+ padding: var(--spacing-3) var(--spacing-6);
307
+ font-size: var(--text-xs);
308
+ text-transform: uppercase;
309
+ letter-spacing: var(--letter-spacing-wider);
310
+ color: var(--color-silver);
311
+ }
312
+
261
313
  /* === Print path ===
262
314
  * Same React tree, different paint. The strategy:
263
315
  * - Cover gets its own named page (`@page cover`) with no margins so it
@@ -175,6 +175,7 @@
175
175
  /* ===== ANIMATIONS ===== */
176
176
  --animate-fade-in: fade-in 200ms ease-out;
177
177
  --animate-fade-out: fade-out 150ms ease-in;
178
+ --animate-lightbox-in: lightbox-in 220ms var(--ease-smooth);
178
179
  --animate-slide-in-right: slide-in-right 300ms var(--ease-smooth);
179
180
  --animate-slide-out-right: slide-out-right 200ms ease-in;
180
181
  --animate-pulse-glow: pulse-glow 2s ease-in-out infinite;
@@ -208,6 +209,17 @@
208
209
  }
209
210
  }
210
211
 
212
+ @keyframes lightbox-in {
213
+ 0% {
214
+ opacity: 0;
215
+ transform: scale(0.96);
216
+ }
217
+ 100% {
218
+ opacity: 1;
219
+ transform: scale(1);
220
+ }
221
+ }
222
+
211
223
  @keyframes slide-in-right {
212
224
  0% {
213
225
  transform: translateX(100%);
package/llms.md CHANGED
@@ -102,6 +102,7 @@ Import from `@lukeashford/aurelius`:
102
102
  | Alert | variant (info, success, warning, error), title |
103
103
  | ArtifactCard | artifact, onExpand, loading |
104
104
  | ArtifactGroup | node, onClick |
105
+ | ArtifactLightboxBody | artifact |
105
106
  | ArtifactVariantStack | node, onExpandArtifact, onGroupClick |
106
107
  | AttachmentPreview | attachments, onRemove, removable, maxVisible, onOpen |
107
108
  | AudioCard | src, title, subtitle, playing, controls, volume, muted, loop, mediaClassName, contentClassName, playerProps, height, loading |
@@ -115,6 +116,7 @@ Import from `@lukeashford/aurelius`:
115
116
  | Col | span, offset, order |
116
117
  | ColorSwatch | color, label |
117
118
  | Container | size (sm, md, lg, xl, fluid, responsive) |
119
+ | DeliverableCard | deliverable, title, subtitle, loading |
118
120
  | Dialog | description, confirmText, cancelText, onConfirm, onCancel, confirmVariant, isLoading, description, acknowledgeText, variant, description, placeholder, defaultValue, submitText, cancelText, onSubmit, onCancel, isLoading |
119
121
  | Divider | orientation (horizontal, vertical), variant (solid, dashed, dotted), label, color |
120
122
  | Drawer | isOpen, onClose, position (left, right, top, bottom), title, size, children, className |
@@ -124,6 +126,7 @@ Import from `@lukeashford/aurelius`:
124
126
  | Input | error, leadingIcon, trailingIcon |
125
127
  | InputGroup | children |
126
128
  | Label | required |
129
+ | Lightbox | onClose, actions, caption, children, className |
127
130
  | List | variant, ordered, leading, trailing, interactive, selected, disabled, primary, secondary |
128
131
  | MarkdownContent | content, isMarkdown, sanitizeConfig, isStreaming, cursorClassName |
129
132
  | Menu | children, open, onOpenChange, asChild, align, side, icon, destructive |
@@ -153,11 +156,11 @@ Import from `@lukeashford/aurelius`:
153
156
  | Toast | children, position (top-right, top-left, bottom-right, bottom-left, top-center, bottom-center), defaultDuration |
154
157
  | Tooltip | content, children, open, side (top, right, bottom, left) |
155
158
  | VideoCard | src, title, subtitle, aspectRatio (${number}/${number}), playing, controls, light, volume, muted, loop, mediaClassName, contentClassName, playerProps, loading |
156
- | ArtifactsPanel | nodes, loading, openArtifactId, onArtifactClosed, artifactCount, onExpand |
159
+ | ArtifactsPanel | nodes, loading, openArtifactId, onArtifactClosed, getArtifactActions, artifact, ctx, artifactCount, onExpand |
157
160
  | BranchNavigator | current, total, onPrevious, onNext, size, showIcon |
158
161
  | ChatInput | position (centered, bottom), placeholder, helperText, onSubmit, disabled, animate, isStreaming, onStop, attachments, onAttachmentsChange, onAttachmentRemove, showAttachmentButton, acceptedFileTypes, notice, onInputChange, initialInputValue, autoFocus |
159
- | ChatInterface | messages, conversationTree, onTreeChange, conversations, onMessageSubmit, onEditMessage, onRetryMessage, onJumpHere, onJumpToLatest, onStop, onSelectConversation, onNewChat, onRenameConversation, isStreaming, isThinking, thinkingLabel, placeholder, emptyStateHelper, emptyState, showAttachmentButton, enableMessageActions, attachments, onAttachmentsChange, onAttachmentRemove, onAttachmentOpen, artifactNodes, isArtifactsPanelOpen, onArtifactsPanelOpenChange, tasks, tasksTitle, onStopAllTasks |
160
- | ChatView | items, latestUserMessageIndex, isStreaming, isThinking, thinkingLabel, onScroll |
162
+ | ChatInterface | messages, conversationTree, onTreeChange, conversations, onMessageSubmit, onEditMessage, onRetryMessage, onJumpHere, onJumpToLatest, onStop, onSelectConversation, onNewChat, onRenameConversation, isStreaming, isThinking, thinkingLabel, placeholder, emptyStateHelper, emptyState, showAttachmentButton, enableMessageActions, attachments, onAttachmentsChange, onAttachmentRemove, onAttachmentOpen, artifactNodes, isArtifactsPanelOpen, onArtifactsPanelOpenChange, getArtifactActions, artifact, ctx |
163
+ | ChatView | items, latestUserMessageIndex |
161
164
  | Checkpoint | name, executionKind (task, submit, rename, init, ingest), status (completed, failed, cancelled), isActive, muted, branchInfo, onJumpHere |
162
165
  | GreyedDivider | messageCount, checkpointCount, onJumpToLatest |
163
166
  | HistoryPanel | conversations, onSelectConversation, onNewChat, onRenameConversation |
@@ -210,6 +213,7 @@ based on the artifact type.
210
213
  - **Artifact.isPending**: * Whether this artifact is still loading (shows skeleton)
211
214
  - **Artifact.fullWidth**: * Whether the artifact should span full width in the grid
212
215
  - **Artifact.scriptElements**: * For html artifacts - structured script elements (used by ScriptCard)
216
+ - **Artifact.deliverable**: * For deliverable artifacts - the resolved presentation spec, every artifact reference already inflated. Rendered as a compact card that links to the full DeliverableRenderer; surfaces the cover info and section count.
213
217
  - **artifact**: * The artifact object to display
214
218
  - **onExpand**: * Callback when the artifact should be expanded/opened
215
219
  - **loading**: * Whether the artifact is still loading
@@ -223,6 +227,22 @@ shows the total items.
223
227
  - **node**: * The GROUP node to display
224
228
  - **onClick**: * Called when the group is clicked (e.g. to navigate into it)
225
229
 
230
+ **ArtifactLightboxBody**
231
+ Picks the bare body for an artifact when displayed inside a {@link Lightbox}.
232
+
233
+ Each kind decides its own internal layout — an image aspect-fits the canvas,
234
+ a deliverable scrolls full-bleed, and so on. Crucially, none of these wrap
235
+ themselves in another Card frame: the lightbox already provides the canvas,
236
+ and a card-inside-modal produces the nested-frame look that signals "cheap
237
+ generic container." Kinds that don't yet have a dedicated bare body fall
238
+ back to {@link ArtifactCard} — adequate, but the stack-of-frames feel is the
239
+ thing to fix next when those kinds matter.
240
+
241
+ Callers don't choose the body explicitly; the registry dispatches by
242
+ `artifact.type`. To add a kind, extend the switch — never branch on type at
243
+ the call site.
244
+
245
+
226
246
  **ArtifactVariantStack**
227
247
  Renders a VARIANT_SET node as a Card with the set label as title.
228
248
  Children are displayed in a horizontal row inside the card body.
@@ -249,6 +269,17 @@ navigate for groups).
249
269
  **AudioCard**
250
270
  - **playerProps**: Forwarded to the underlying ReactPlayer.
251
271
 
272
+ **DeliverableCard**
273
+ Compact preview of a deliverable for surfaces that can't host the full
274
+ multi-page renderer (chat tree, artifact lists). Surfaces the deliverable's
275
+ cover info plus its section count. The whole card is clickable — the
276
+ affordance is the same expand-icon overlay that {@link ArtifactCard} shows
277
+ for every artifact kind, so we don't add a "Open preview" lure here.
278
+
279
+ - **deliverable**: * Resolved deliverable spec — every artifact reference already inflated. Same shape the full DeliverableRenderer accepts.
280
+ - **title**: Optional override for the cover title (otherwise derived from the spec).
281
+ - **subtitle**: Optional subtitle shown below the title.
282
+
252
283
  **FileChip**
253
284
  - **name**: * File name to display
254
285
  - **size**: * File size in bytes (optional, will be formatted)
@@ -261,6 +292,24 @@ navigate for groups).
261
292
  - **artifactId**: * Backend artifact id, set once the upload has been integrated. When both `artifactId` and `onOpen` are present, the chip becomes clickable.
262
293
  - **onOpen**: * Click handler invoked with `artifactId` when the chip is clicked. Compose-box (pre-integrate) chips should not pass this — the chip stays non-clickable except for its remove button.
263
294
 
295
+ **Lightbox**
296
+ Full-bleed modal canvas for one piece of content. Premium-haptic alternative
297
+ to a bordered modal: deep void backdrop, scale-fade entrance, no inner frame,
298
+ floating glass action cluster top-right.
299
+
300
+ The component is content-agnostic — it ships chrome, not artifact knowledge.
301
+ Compose it with kind-aware bodies and action sets to build the artifact
302
+ viewer; reach for it directly any time a single piece of content needs the
303
+ full screen.
304
+
305
+ Dismiss surfaces: ESC, backdrop click (outside the sized content area),
306
+ close button in the action cluster.
307
+
308
+ - **onClose**: * Called when the user dismisses the lightbox (ESC, backdrop click, X button). The caller owns the open/closed state — when `onClose` fires, unmount the lightbox.
309
+ - **actions**: * Optional kind-specific actions placed before the close button in the floating top-right cluster. Typically buttons like "Share" or "Download". The cluster always renders the close button; pass `undefined` if the only affordance is dismiss.
310
+ - **caption**: * Optional caption shown bottom-centre over the backdrop. Use for short metadata like a title and subtitle. Non-interactive — clicks pass through to the backdrop and dismiss.
311
+ - **children**: * The artifact body. Sits directly on the backdrop with no inner frame — the body is responsible for its own layout (object-contain image, scrollable deliverable, readable text column, etc.). Click events whose target is the sized content wrapper (i.e. the empty area around the body) dismiss the lightbox; clicks on the body itself do not.
312
+
264
313
  **MarkdownContent**
265
314
  - **content**: * Content to display (can be Markdown or HTML)
266
315
  - **isMarkdown**: * Whether the content should be treated as Markdown @default true
@@ -378,6 +427,7 @@ moving back from the content.
378
427
  - **loading**: * Whether artifacts are still loading (show skeletons)
379
428
  - **openArtifactId**: * When set to a non-null id, surfaces the same expanded artifact card the panel grid would. Drives chip click-through from outside the panel. Pair with `onArtifactClosed` so the parent can clear its controller state when the user dismisses the modal.
380
429
  - **onArtifactClosed**: * Called when the user closes the expanded card (X button or backdrop). The parent owns whether subsequent renders re-open by re-supplying `openArtifactId`.
430
+ - **getArtifactActions**: * Resolves the floating action cluster shown over the lightbox when an artifact is opened. Switch on `artifact.type` and return the host-owned buttons for that kind (e.g. Share + Download for deliverables, Download for images). Aurelius ships the close affordance itself; return only the kind-specific actions, or `null` when there are none. The `ctx.onClose` helper lets actions dismiss the lightbox after a successful operation.
381
431
 
382
432
  **BranchNavigator**
383
433
  BranchNavigator provides a UI for switching between conversation branches.
@@ -477,9 +527,7 @@ artifactNodes prop.
477
527
  - **artifactNodes**: * Top-level artifact tree nodes for the artifacts panel.
478
528
  - **isArtifactsPanelOpen**: * Whether the artifacts panel is currently open (controlled). When set, maps to the tool panel system — opens the artifacts tool.
479
529
  - **onArtifactsPanelOpenChange**: * Called when the artifacts panel is opened or closed (controlled).
480
- - **tasks**: * Tasks to display in the todos list tool panel. Shows a list of tasks with status indicators.
481
- - **tasksTitle**: * Title for the todos list @default "Tasks"
482
- - **onStopAllTasks**: * Called when the "Stop All Tasks" button is clicked in the tasks panel. Only shown when at least one task has in_progress status. The consumer app decides what stopping means (cancel API calls, mark tasks cancelled, etc.). * May return a Promise. While the Promise is pending, the button becomes disabled and displays a spinner with "Stopping tasks" so the user knows the stop request is in flight.
530
+ - **getArtifactActions**: * Resolves the floating action cluster shown over the artifact lightbox. The host switches on `artifact.type` and returns the right buttons for that kind (e.g. Share + Download for deliverables, Download for images). Aurelius ships the close affordance itself; return only the kind-specific actions, or `null` when none. Use `ctx.onClose` to dismiss the lightbox after a successful operation.
483
531
 
484
532
  **ChatView**
485
533
  Renders a heterogeneous chat stream — messages, checkpoints, and the
@@ -497,10 +545,6 @@ Key behaviors:
497
545
  - **ChatViewMessageItem.onJumpHere**: * Click handler for the bubble. When provided, the bubble becomes a navigational anchor that moves the active leaf to this node. Aurelius suppresses the click for `isActive` rows, link / button targets inside the bubble, and active text selections.
498
546
  - **items**: * Rows to render in the chat stream. Heterogeneous: messages, checkpoints, and the greyed-future divider live in the same list, ordered top-to-bottom.
499
547
  - **latestUserMessageIndex**: * Index of the latest user-message row to anchor scroll to. When this index changes, the corresponding row scrolls to the top. Defaults to the last-found user message in `items`.
500
- - **isStreaming**: * Whether the assistant is currently streaming a response. Drives the streaming cursor on the last assistant message and the thinking indicator.
501
- - **isThinking**: * Whether to show the thinking indicator (between user message and response).
502
- - **thinkingLabel**: * When set, the thinking indicator renders this label verbatim instead of its rotating phrases. Use for domain-specific waits like "Analyzing uploads..." (any animated suffix is the caller's responsibility).
503
- - **onScroll**: * Callback when the user scrolls manually.
504
548
 
505
549
  **Checkpoint**
506
550
  A single-line marker in the chat stream that anchors a chat position to a
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lukeashford/aurelius",
3
- "version": "4.6.0",
3
+ "version": "4.7.0",
4
4
  "description": "Design system for Aurelius applications — A cohesive visual language for creative technologists",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",