@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.
- package/dist/_vendor/shared/runtime-versions.d.ts +9 -0
- package/dist/browser/browser-panel.d.ts +2 -1
- package/dist/browser/browser-panel.js +12 -2
- package/dist/customize/settings/tabs/sandbox-template-form.js +8 -1
- package/dist/files/renderers/show-content-renderer.d.ts +2 -2
- package/dist/files/renderers/show-content-renderer.js +2 -1
- package/dist/i18n/en.d.ts +18 -0
- package/dist/i18n/en.js +30 -12
- package/dist/i18n/ui-catalog/remaining-ui-translation-keys.generated.js +3 -3
- package/dist/internal/branding/branding-provider.js +3 -3
- package/dist/internal/hooks/use-notification-center.d.ts +10 -6
- package/dist/internal/hooks/use-notification-center.js +32 -10
- package/dist/internal/lib/browser-noise/rules/extensions.js +3 -0
- package/dist/internal/lib/site-metadata.js +4 -4
- package/dist/internal/notifications/notification-bell.js +4 -3
- package/dist/internal/notifications/notification-rows.d.ts +1 -1
- package/dist/internal/notifications/notification-rows.js +2 -0
- package/dist/internal/stores/kortix-computer-store.d.ts +3 -2
- package/dist/internal/stores/kortix-computer-store.js +5 -3
- package/dist/session/composer/index.d.ts +1 -0
- package/dist/session/composer/index.js +1 -0
- package/dist/session/composer/send-stop-control.js +8 -3
- package/dist/session/header/session-site-header.js +3 -1
- package/dist/session/panel/easy/detail-view.js +11 -0
- package/dist/session/panel/mobile-tool-drawer.js +10 -4
- package/dist/session/panel/open-session-quick-view.js +3 -3
- package/dist/session/panel/panel-fallback.js +10 -7
- package/dist/session/panel/session-desktop.d.ts +6 -0
- package/dist/session/panel/session-desktop.js +74 -0
- package/dist/session/panel/session-panel-provider.d.ts +1 -0
- package/dist/session/panel/session-panel-provider.js +17 -1
- package/dist/session/panel/shared/use-panel-handoffs.d.ts +2 -2
- package/dist/session/panel/shared/use-panel-handoffs.js +5 -1
- package/dist/session/panel/use-session-panel-layout.js +8 -0
- package/dist/session/status/session-tab-title.d.ts +1 -1
- package/dist/session/status/session-tab-title.js +1 -1
- package/dist/session/thread/session-chat.js +12 -0
- package/dist/session/thread/session-context-sub-sessions.js +1 -1
- package/dist/session/tool/tools/image-gen-tool.d.ts +1 -1
- package/dist/session/tool/tools/image-gen-tool.js +17 -8
- package/dist/session/turn/user-message.d.ts +5 -4
- package/dist/session/turn/user-message.js +7 -5
- package/dist/styles.css +1 -1
- package/dist/workspace/session-workspace.js +24 -5
- package/package.json +3 -3
- 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 (
|
|
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
|
-
|
|
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
|
|
22
|
-
* written before channel names were recorded
|
|
23
|
-
* project's Slack bindings name it, read only
|
|
24
|
-
*
|
|
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
|
|
82
|
-
* written before channel names were recorded
|
|
83
|
-
* project's Slack bindings name it, read only
|
|
84
|
-
*
|
|
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:
|
|
98
|
+
{ label: place, value: channel },
|
|
97
99
|
{ label: tI18nComplete('text218197693424'), value: info.userName },
|
|
98
100
|
] }));
|
|
99
101
|
}
|