@kortix/ui 0.14.10 → 0.14.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/_vendor/shared/runtime-versions.d.ts +9 -0
  2. package/dist/browser/browser-panel.d.ts +2 -1
  3. package/dist/browser/browser-panel.js +12 -2
  4. package/dist/customize/settings/tabs/sandbox-template-form.js +8 -1
  5. package/dist/files/renderers/show-content-renderer.d.ts +2 -2
  6. package/dist/files/renderers/show-content-renderer.js +2 -1
  7. package/dist/i18n/en.d.ts +18 -0
  8. package/dist/i18n/en.js +30 -12
  9. package/dist/i18n/ui-catalog/remaining-ui-translation-keys.generated.js +3 -3
  10. package/dist/internal/branding/branding-provider.js +3 -3
  11. package/dist/internal/hooks/use-notification-center.d.ts +10 -6
  12. package/dist/internal/hooks/use-notification-center.js +32 -10
  13. package/dist/internal/lib/browser-noise/rules/extensions.js +3 -0
  14. package/dist/internal/lib/site-metadata.js +4 -4
  15. package/dist/internal/notifications/notification-bell.js +4 -3
  16. package/dist/internal/notifications/notification-rows.d.ts +1 -1
  17. package/dist/internal/notifications/notification-rows.js +2 -0
  18. package/dist/internal/stores/kortix-computer-store.d.ts +3 -2
  19. package/dist/internal/stores/kortix-computer-store.js +5 -3
  20. package/dist/session/composer/index.d.ts +1 -0
  21. package/dist/session/composer/index.js +1 -0
  22. package/dist/session/composer/send-stop-control.js +8 -3
  23. package/dist/session/header/session-site-header.js +3 -1
  24. package/dist/session/panel/easy/detail-view.js +11 -0
  25. package/dist/session/panel/mobile-tool-drawer.js +10 -4
  26. package/dist/session/panel/open-session-quick-view.js +3 -3
  27. package/dist/session/panel/panel-fallback.js +10 -7
  28. package/dist/session/panel/session-desktop.d.ts +6 -0
  29. package/dist/session/panel/session-desktop.js +74 -0
  30. package/dist/session/panel/session-panel-provider.d.ts +1 -0
  31. package/dist/session/panel/session-panel-provider.js +17 -1
  32. package/dist/session/panel/shared/use-panel-handoffs.d.ts +2 -2
  33. package/dist/session/panel/shared/use-panel-handoffs.js +5 -1
  34. package/dist/session/panel/use-session-panel-layout.js +8 -0
  35. package/dist/session/status/session-tab-title.d.ts +1 -1
  36. package/dist/session/status/session-tab-title.js +1 -1
  37. package/dist/session/thread/session-chat.js +12 -0
  38. package/dist/session/thread/session-context-sub-sessions.js +1 -1
  39. package/dist/session/tool/tools/image-gen-tool.d.ts +1 -1
  40. package/dist/session/tool/tools/image-gen-tool.js +17 -8
  41. package/dist/session/turn/user-message.d.ts +5 -4
  42. package/dist/session/turn/user-message.js +7 -5
  43. package/dist/styles.css +1 -1
  44. package/dist/workspace/session-workspace.js +24 -5
  45. package/package.json +3 -3
  46. package/skills/kortix-ui/references/modules.md +1 -1
@@ -162,6 +162,8 @@ const cappedWidth = (rect) => `min(100%, calc(${IMAGE_MAX_HEIGHT} * ${rect}))`;
162
162
  * Five or more images (R38): ONE grid of six columns whose rows are the
163
163
  * bento patterns (`imageGenGrid().rows`: 5 = 3+2, 8 = 4+4, …). Every tile sits
164
164
  * in the same grid, placed by line numbers, so a tile is never re-parented.
165
+ * A strip (portrait tiles, `imageGenGrid().strip`) uses this grid at any count,
166
+ * with twelve columns: each row is its tiles side by side, one track tall.
165
167
  *
166
168
  * The grid is as wide as its tallest row allows under the cap (`width`), and
167
169
  * each row is exactly `width / rects[k]` tall (`rects[k]` = its tile ratio ×
@@ -172,19 +174,21 @@ const cappedWidth = (rect) => `min(100%, calc(${IMAGE_MAX_HEIGHT} * ${rect}))`;
172
174
  * summed below 1, e.g. 16:9 tiles.) A two-track row subtracts the gap between
173
175
  * its tracks, so a large tile spanning both is the row's height.
174
176
  */
175
- function gridPlacement(rows, rects) {
177
+ function gridPlacement(rows, rects, strip) {
176
178
  const width = `min(100cqw, ${IMAGE_MAX_HEIGHT} * ${Math.min(...rects)})`;
177
179
  const tracks = [];
178
180
  const places = [];
179
181
  rows.forEach((count, row) => {
180
182
  const track = tracks.length + 1;
181
183
  const height = `${width} / ${rects[row]}`;
182
- if (count === 2)
184
+ if (strip || count === 2)
183
185
  tracks.push(`calc(${height})`);
184
186
  else
185
187
  tracks.push(`calc((${height} - var(--spacing)) / 2)`, `calc((${height} - var(--spacing)) / 2)`);
186
188
  for (let i = 0; i < count; i++) {
187
- if (count === 2)
189
+ if (strip)
190
+ places.push({ gridColumn: `${1 + (12 / count) * i} / span ${12 / count}`, gridRow: `${track}` });
191
+ else if (count === 2)
188
192
  places.push({ gridColumn: `${1 + 3 * i} / span 3`, gridRow: `${track}` });
189
193
  else if (count === 4)
190
194
  places.push({ gridColumn: `${1 + 3 * (i % 2)} / span 3`, gridRow: `${track + Math.floor(i / 2)}` });
@@ -206,13 +210,17 @@ export function ImageGenTool({ call }) {
206
210
  const views = useMemo(() => (run ? run.map(sessionLogOpenCall) : [call]).map((one) => imageGenView(one, inTurn ? live : undefined)), [run, call, inTurn, live]);
207
211
  const grid = useMemo(() => imageGenGrid(views), [views]);
208
212
  const view = views[0];
209
- const solo = views.length === 1 && view.images.length === 1;
213
+ // One tile: a lone image, or one left beside calls the image cap refused.
214
+ const solo = grid.tiles.length === 1;
210
215
  // One fix per card, even when several frames failed for the same reason.
211
216
  const repairable = views.find((one) => one.error?.connectModel)?.error ??
212
217
  views.flatMap((one) => one.images).find((image) => image.error?.connectModel)?.error;
213
218
  const action = repairable ? _jsx(ConnectAction, { code: repairable.code, provider: repairable.provider }) : null;
214
219
  // The card carries no prompt and no model (R29): the frames are the content,
215
220
  // their status (busy, loading, an error) the only text.
221
+ // The image cap refused every call before any request: nothing was asked for, so nothing to show.
222
+ if (!grid.tiles.length)
223
+ return null;
216
224
  if (views.length === 1 && !view.images.length) {
217
225
  // The whole call failed or stopped.
218
226
  return (_jsx("div", { className: "w-full max-w-md", children: _jsx(FailureNote, { error: view.error, action: action }) }));
@@ -236,14 +244,15 @@ export function ImageGenTool({ call }) {
236
244
  return (_jsxs("figure", { className: "flex w-full flex-col gap-2", children: [frame(grid.tiles[0]), action ? _jsx("div", { className: "flex flex-col items-start", children: action }) : null] }));
237
245
  }
238
246
  const count = grid.tiles.length;
239
- const bento = grid.rows.length === 1 ? BENTO[count] : null;
247
+ const bento = !grid.strip && grid.rows.length === 1 ? BENTO[count] : null;
248
+ // A row's rectangle over its tile ratio: a strip row is its tiles side by side.
240
249
  const rowRects = grid.rows.map((size, row) => {
241
250
  const firstTile = grid.tiles[grid.rows.slice(0, row).reduce((sum, n) => sum + n, 0)];
242
- return ratioValue(views[firstTile.call].aspectRatio) * BENTO[size].scale;
251
+ return ratioValue(views[firstTile.call].aspectRatio) * (grid.strip ? size : BENTO[size].scale);
243
252
  });
244
- const placed = bento ? null : gridPlacement(grid.rows, rowRects);
253
+ const placed = bento ? null : gridPlacement(grid.rows, rowRects, grid.strip);
245
254
  return (
246
255
  // An inline-size container: the merged grid sizes its rows from its width (`cqw`).
247
- _jsxs("figure", { className: cn('flex w-full flex-col gap-2', !bento && '@container'), children: [_jsx("div", { ...(bento ? { 'data-image-gen-bento': count } : { 'data-image-gen-grid': grid.rows.join('+') }), className: cn('grid min-h-0 w-full gap-1', bento ? bento.grid : 'grid-cols-6'), style: placed ? placed.style : { aspectRatio: rowRects[0], width: cappedWidth(rowRects[0]) }, children: grid.tiles.map((tile, i) => (_jsx("div", { "data-image-gen-tile": i, className: cn('min-h-0 min-w-0', bento && i === 0 && bento.first), style: placed?.places[i], children: frame(tile) }, tileKey(tile, i)))) }), action ? _jsx("div", { className: "flex flex-col items-start", children: action }) : null] }));
256
+ _jsxs("figure", { className: cn('flex w-full flex-col gap-2', !bento && '@container'), children: [_jsx("div", { ...(bento ? { 'data-image-gen-bento': count } : { 'data-image-gen-grid': grid.rows.join('+'), ...(grid.strip && { 'data-image-gen-strip': '' }) }), className: cn('grid min-h-0 w-full gap-1', bento ? bento.grid : grid.strip ? 'grid-cols-12' : 'grid-cols-6'), style: placed ? placed.style : { aspectRatio: rowRects[0], width: cappedWidth(rowRects[0]) }, children: grid.tiles.map((tile, i) => (_jsx("div", { "data-image-gen-tile": i, className: cn('min-h-0 min-w-0', bento && i === 0 && bento.first), style: placed?.places[i], children: frame(tile) }, tileKey(tile, i)))) }), action ? _jsx("div", { className: "flex flex-col items-start", children: action }) : null] }));
248
257
  }
249
258
  ToolRegistry.register('image-gen', ImageGenTool);
@@ -18,10 +18,11 @@ export declare const BUBBLE_TEXT: string;
18
18
  export declare const BUBBLE_SURFACE: string;
19
19
  /**
20
20
  * Where a channel message came from, in the pill's hover card: the platform,
21
- * the channel or chat it was posted in, and who posted it. A Slack prompt
22
- * written before channel names were recorded carries a bare id (`C0DEV`); the
23
- * project's Slack bindings name it, read only while this card is open. A Teams
24
- * conversation id names nothing a person reads, so Teams shows no channel row.
21
+ * the channel or chat it was posted in (an email's subject, labelled Subject),
22
+ * and who posted it. A Slack prompt written before channel names were recorded
23
+ * carries a bare id (`C0DEV`); the project's Slack bindings name it, read only
24
+ * while this card is open. A Teams conversation id names nothing a person
25
+ * reads, so Teams shows no channel row.
25
26
  */
26
27
  export declare function ChannelOrigin({ info, platform }: {
27
28
  info: ChannelMessageInfo;
@@ -78,10 +78,11 @@ export const BUBBLE_TEXT = cn('text-[0.9rem] leading-[22px] font-medium', 'wrap-
78
78
  export const BUBBLE_SURFACE = cn('bg-muted text-foreground flex max-w-full flex-col px-3.5 py-2.5 select-none rounded-lg');
79
79
  /**
80
80
  * Where a channel message came from, in the pill's hover card: the platform,
81
- * the channel or chat it was posted in, and who posted it. A Slack prompt
82
- * written before channel names were recorded carries a bare id (`C0DEV`); the
83
- * project's Slack bindings name it, read only while this card is open. A Teams
84
- * conversation id names nothing a person reads, so Teams shows no channel row.
81
+ * the channel or chat it was posted in (an email's subject, labelled Subject),
82
+ * and who posted it. A Slack prompt written before channel names were recorded
83
+ * carries a bare id (`C0DEV`); the project's Slack bindings name it, read only
84
+ * while this card is open. A Teams conversation id names nothing a person
85
+ * reads, so Teams shows no channel row.
85
86
  */
86
87
  export function ChannelOrigin({ info, platform }) {
87
88
  const tI18nComplete = useTranslations('hardcodedUi.i18nComplete');
@@ -92,8 +93,9 @@ export function ChannelOrigin({ info, platform }) {
92
93
  ? data?.bindings.find((b) => b.platform === 'slack' && b.channelId === info.context)
93
94
  : undefined;
94
95
  const channel = info.platform === 'Teams' ? '' : (binding && slackConversationName(binding)) || info.context;
96
+ const place = info.platform === 'Email' ? tI18nComplete('text68971283841a') : tI18nComplete('textce4683e7013a');
95
97
  return (_jsx(SourceCard, { mark: _jsx(ChannelBrandMark, { platform: info.platform, className: "size-3.5 shrink-0" }), title: platform, rows: [
96
- { label: tI18nComplete('textce4683e7013a'), value: channel },
98
+ { label: place, value: channel },
97
99
  { label: tI18nComplete('text218197693424'), value: info.userName },
98
100
  ] }));
99
101
  }