@flamingo-stack/openframe-frontend-core 0.0.562 → 0.0.563-snapshot.20260824140722
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/{chunk-4PCVRVRP.cjs → chunk-6OPEULTD.cjs} +9 -9
- package/dist/{chunk-4PCVRVRP.cjs.map → chunk-6OPEULTD.cjs.map} +1 -1
- package/dist/{chunk-T2WSZ2W4.js → chunk-7D62XVHH.js} +6 -6
- package/dist/{chunk-ACIVGQA4.js → chunk-ASULU3T2.js} +2 -2
- package/dist/{chunk-3QP6VIXF.cjs → chunk-AZPUAPXW.cjs} +469 -471
- package/dist/chunk-AZPUAPXW.cjs.map +1 -0
- package/dist/{chunk-JVXF5DIA.js → chunk-BK7V6CH5.js} +831 -833
- package/dist/chunk-BK7V6CH5.js.map +1 -0
- package/dist/{chunk-P4G3I3OE.js → chunk-CP7TMQBH.js} +2 -2
- package/dist/{chunk-FFQ7IHZZ.js → chunk-CQNK6RS6.js} +2 -2
- package/dist/{chunk-ICAWPAGF.js → chunk-DPMOEYEM.js} +2 -2
- package/dist/{chunk-PRXMZB6K.cjs → chunk-E6PW7GRQ.cjs} +62 -62
- package/dist/{chunk-PRXMZB6K.cjs.map → chunk-E6PW7GRQ.cjs.map} +1 -1
- package/dist/{chunk-TGREMQ5Z.cjs → chunk-FG4BSJ4A.cjs} +26 -26
- package/dist/{chunk-TGREMQ5Z.cjs.map → chunk-FG4BSJ4A.cjs.map} +1 -1
- package/dist/{chunk-DHB2ODZC.js → chunk-G2VDS3M5.js} +2 -2
- package/dist/{chunk-WEMZGECB.cjs → chunk-GEC2NHQH.cjs} +20 -20
- package/dist/{chunk-WEMZGECB.cjs.map → chunk-GEC2NHQH.cjs.map} +1 -1
- package/dist/{chunk-BHHJTOKI.cjs → chunk-J7R3VZL5.cjs} +14 -14
- package/dist/{chunk-BHHJTOKI.cjs.map → chunk-J7R3VZL5.cjs.map} +1 -1
- package/dist/{chunk-NIQGA3YT.js → chunk-NQ6UF4LP.js} +4 -4
- package/dist/{chunk-PL6FTS27.js → chunk-NUKQWLOG.js} +5 -5
- package/dist/{chunk-UNR2ROYX.js → chunk-O3SEC45L.js} +4 -4
- package/dist/{chunk-E5L6FGRF.cjs → chunk-OYFXHET4.cjs} +7 -7
- package/dist/{chunk-E5L6FGRF.cjs.map → chunk-OYFXHET4.cjs.map} +1 -1
- package/dist/{chunk-W6RG3S5S.cjs → chunk-PKCZL56Y.cjs} +4 -4
- package/dist/{chunk-W6RG3S5S.cjs.map → chunk-PKCZL56Y.cjs.map} +1 -1
- package/dist/{chunk-D6I24QAR.cjs → chunk-PT4GS4CE.cjs} +3 -3
- package/dist/{chunk-D6I24QAR.cjs.map → chunk-PT4GS4CE.cjs.map} +1 -1
- package/dist/{chunk-35U4SIQA.js → chunk-T3P56JKN.js} +2 -2
- package/dist/{chunk-5HD3SSC2.js → chunk-TDYF6Q2D.js} +2 -2
- package/dist/{chunk-AYJAWSDY.cjs → chunk-U5EVZLL5.cjs} +5 -5
- package/dist/{chunk-AYJAWSDY.cjs.map → chunk-U5EVZLL5.cjs.map} +1 -1
- package/dist/{chunk-JAJKPAV3.cjs → chunk-VVDLVCPW.cjs} +39 -39
- package/dist/{chunk-JAJKPAV3.cjs.map → chunk-VVDLVCPW.cjs.map} +1 -1
- package/dist/{chunk-WCHOWGKI.cjs → chunk-WGDZW237.cjs} +86 -86
- package/dist/{chunk-WCHOWGKI.cjs.map → chunk-WGDZW237.cjs.map} +1 -1
- package/dist/{chunk-6U2VJFKW.js → chunk-X4JKXYY5.js} +2 -2
- package/dist/{chunk-VYHMCNZT.cjs → chunk-XFI5PCER.cjs} +31 -31
- package/dist/{chunk-VYHMCNZT.cjs.map → chunk-XFI5PCER.cjs.map} +1 -1
- package/dist/{chunk-RWGX2HIB.cjs → chunk-YFLSOYX4.cjs} +11 -11
- package/dist/{chunk-RWGX2HIB.cjs.map → chunk-YFLSOYX4.cjs.map} +1 -1
- package/dist/{chunk-3QYCR7I6.js → chunk-Z4VU6MJ4.js} +2 -2
- package/dist/components/case-studies/index.cjs +8 -8
- package/dist/components/case-studies/index.js +2 -2
- package/dist/components/chat/index.cjs +2 -2
- package/dist/components/chat/index.js +1 -1
- package/dist/components/contact/index.cjs +3 -3
- package/dist/components/contact/index.js +2 -2
- package/dist/components/docs/index.cjs +5 -5
- package/dist/components/docs/index.js +4 -4
- package/dist/components/embeds/index.cjs +3 -3
- package/dist/components/embeds/index.js +2 -2
- package/dist/components/faq/index.cjs +3 -3
- package/dist/components/faq/index.js +2 -2
- package/dist/components/features/index.cjs +2 -2
- package/dist/components/features/index.js +1 -1
- package/dist/components/form.d.ts +1 -1
- package/dist/components/form.d.ts.map +1 -1
- package/dist/components/help-center-pages/index.cjs +22 -22
- package/dist/components/help-center-pages/index.js +13 -13
- package/dist/components/index.cjs +131 -131
- package/dist/components/index.js +11 -11
- package/dist/components/meeting-scheduler/index.cjs +30 -30
- package/dist/components/meeting-scheduler/index.js +3 -3
- package/dist/components/navigation/index.cjs +2 -2
- package/dist/components/navigation/index.js +1 -1
- package/dist/components/onboarding-guides/hooks/use-onboarding-guides.d.ts +3 -3
- package/dist/components/onboarding-guides/hooks/use-onboarding-guides.d.ts.map +1 -1
- package/dist/components/onboarding-guides/index.cjs +5 -5
- package/dist/components/onboarding-guides/index.js +4 -4
- package/dist/components/related-content/index.cjs +3 -3
- package/dist/components/related-content/index.js +2 -2
- package/dist/components/tickets/index.cjs +6 -6
- package/dist/components/tickets/index.js +5 -5
- package/dist/components/ui/dashboard-info-card.d.ts +1 -1
- package/dist/components/ui/index.cjs +2 -2
- package/dist/components/ui/index.js +1 -1
- package/dist/components/ui/ticket-info-section.d.ts +10 -6
- package/dist/components/ui/ticket-info-section.d.ts.map +1 -1
- package/dist/components/ui/ticket-status-tag.d.ts +8 -1
- package/dist/components/ui/ticket-status-tag.d.ts.map +1 -1
- package/dist/hooks/use-meeting-booking.d.ts +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/src/components/features/board/types.ts +1 -1
- package/src/components/ui/dashboard-info-card.tsx +1 -1
- package/src/components/ui/ticket-info-section.tsx +90 -87
- package/src/components/ui/ticket-status-tag.tsx +74 -52
- package/src/stories/.Board.stories.md +1 -1
- package/src/stories/Board.stories.tsx +4 -4
- package/src/stories/DashboardInfoCard.stories.tsx +1 -1
- package/src/stories/InfoSection.stories.tsx +1 -1
- package/src/stories/TicketEventMessage.stories.tsx +1 -1
- package/dist/chunk-3QP6VIXF.cjs.map +0 -1
- package/dist/chunk-JVXF5DIA.js.map +0 -1
- /package/dist/{chunk-T2WSZ2W4.js.map → chunk-7D62XVHH.js.map} +0 -0
- /package/dist/{chunk-ACIVGQA4.js.map → chunk-ASULU3T2.js.map} +0 -0
- /package/dist/{chunk-P4G3I3OE.js.map → chunk-CP7TMQBH.js.map} +0 -0
- /package/dist/{chunk-FFQ7IHZZ.js.map → chunk-CQNK6RS6.js.map} +0 -0
- /package/dist/{chunk-ICAWPAGF.js.map → chunk-DPMOEYEM.js.map} +0 -0
- /package/dist/{chunk-DHB2ODZC.js.map → chunk-G2VDS3M5.js.map} +0 -0
- /package/dist/{chunk-NIQGA3YT.js.map → chunk-NQ6UF4LP.js.map} +0 -0
- /package/dist/{chunk-PL6FTS27.js.map → chunk-NUKQWLOG.js.map} +0 -0
- /package/dist/{chunk-UNR2ROYX.js.map → chunk-O3SEC45L.js.map} +0 -0
- /package/dist/{chunk-35U4SIQA.js.map → chunk-T3P56JKN.js.map} +0 -0
- /package/dist/{chunk-5HD3SSC2.js.map → chunk-TDYF6Q2D.js.map} +0 -0
- /package/dist/{chunk-6U2VJFKW.js.map → chunk-X4JKXYY5.js.map} +0 -0
- /package/dist/{chunk-3QYCR7I6.js.map → chunk-Z4VU6MJ4.js.map} +0 -0
|
@@ -4093,7 +4093,7 @@ ErrorMessageDisplay.displayName = "ErrorMessageDisplay";
|
|
|
4093
4093
|
|
|
4094
4094
|
// src/components/chat/chat-container.tsx
|
|
4095
4095
|
init_cn();
|
|
4096
|
-
import * as
|
|
4096
|
+
import * as React11 from "react";
|
|
4097
4097
|
|
|
4098
4098
|
// src/components/ui/square-avatar.tsx
|
|
4099
4099
|
import * as React4 from "react";
|
|
@@ -4529,6 +4529,273 @@ function PlusCircleIcon2({ className, whiteOverlay = false, iconSize = 24, ...pr
|
|
|
4529
4529
|
);
|
|
4530
4530
|
}
|
|
4531
4531
|
|
|
4532
|
+
// src/components/ui/ticket-status-tag.tsx
|
|
4533
|
+
init_cn();
|
|
4534
|
+
|
|
4535
|
+
// src/utils/color-analysis.ts
|
|
4536
|
+
var DESIGN_PALETTE = [
|
|
4537
|
+
{ name: "yellow", hex: "#FFC008", rgb: [255, 192, 8] },
|
|
4538
|
+
{ name: "black", hex: "#161616", rgb: [22, 22, 22] },
|
|
4539
|
+
{ name: "gray", hex: "#888888", rgb: [136, 136, 136] }
|
|
4540
|
+
];
|
|
4541
|
+
function hexToRgb(hex) {
|
|
4542
|
+
const normalized = hex.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i, (_, r, g, b) => `${r}${r}${g}${g}${b}${b}`);
|
|
4543
|
+
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(normalized);
|
|
4544
|
+
return result ? [parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16)] : [0, 0, 0];
|
|
4545
|
+
}
|
|
4546
|
+
function getLuminance(rgb) {
|
|
4547
|
+
const [r, g, b] = rgb.map((c) => {
|
|
4548
|
+
c = c / 255;
|
|
4549
|
+
return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
|
|
4550
|
+
});
|
|
4551
|
+
return 0.2126 * r + 0.7152 * g + 0.0722 * b;
|
|
4552
|
+
}
|
|
4553
|
+
function getContrastRatio(color1, color2) {
|
|
4554
|
+
const lum1 = getLuminance(color1);
|
|
4555
|
+
const lum2 = getLuminance(color2);
|
|
4556
|
+
const brightest = Math.max(lum1, lum2);
|
|
4557
|
+
const darkest = Math.min(lum1, lum2);
|
|
4558
|
+
return (brightest + 0.05) / (darkest + 0.05);
|
|
4559
|
+
}
|
|
4560
|
+
function pickReadableTextColor(bgHex) {
|
|
4561
|
+
const bg = hexToRgb(bgHex);
|
|
4562
|
+
const darkContrast = getContrastRatio(bg, [26, 26, 26]);
|
|
4563
|
+
const lightContrast = getContrastRatio(bg, [250, 250, 250]);
|
|
4564
|
+
return darkContrast >= lightContrast ? "dark" : "light";
|
|
4565
|
+
}
|
|
4566
|
+
function extractDominantColor(canvas) {
|
|
4567
|
+
const ctx = canvas.getContext("2d");
|
|
4568
|
+
if (!ctx) return [128, 128, 128];
|
|
4569
|
+
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
|
|
4570
|
+
const data = imageData.data;
|
|
4571
|
+
const sampleSize = Math.max(1, Math.floor(data.length / (4 * 1e3)));
|
|
4572
|
+
const colorCounts = {};
|
|
4573
|
+
for (let i = 0; i < data.length; i += 4 * sampleSize) {
|
|
4574
|
+
const r = data[i];
|
|
4575
|
+
const g = data[i + 1];
|
|
4576
|
+
const b = data[i + 2];
|
|
4577
|
+
const alpha = data[i + 3];
|
|
4578
|
+
if (alpha < 128) continue;
|
|
4579
|
+
const bucketR = Math.round(r / 32) * 32;
|
|
4580
|
+
const bucketG = Math.round(g / 32) * 32;
|
|
4581
|
+
const bucketB = Math.round(b / 32) * 32;
|
|
4582
|
+
const key = `${bucketR},${bucketG},${bucketB}`;
|
|
4583
|
+
colorCounts[key] = (colorCounts[key] || 0) + 1;
|
|
4584
|
+
}
|
|
4585
|
+
let maxCount = 0;
|
|
4586
|
+
let dominantColor = [128, 128, 128];
|
|
4587
|
+
for (const [colorKey, count] of Object.entries(colorCounts)) {
|
|
4588
|
+
if (count > maxCount) {
|
|
4589
|
+
maxCount = count;
|
|
4590
|
+
const [r, g, b] = colorKey.split(",").map(Number);
|
|
4591
|
+
dominantColor = [r, g, b];
|
|
4592
|
+
}
|
|
4593
|
+
}
|
|
4594
|
+
return dominantColor;
|
|
4595
|
+
}
|
|
4596
|
+
function getBestContrastColor(imageColor) {
|
|
4597
|
+
let bestColor = DESIGN_PALETTE[0];
|
|
4598
|
+
let bestContrast = 0;
|
|
4599
|
+
for (const color of DESIGN_PALETTE) {
|
|
4600
|
+
const contrast = getContrastRatio(imageColor, color.rgb);
|
|
4601
|
+
if (contrast > bestContrast) {
|
|
4602
|
+
bestContrast = contrast;
|
|
4603
|
+
bestColor = color;
|
|
4604
|
+
}
|
|
4605
|
+
}
|
|
4606
|
+
return bestContrast >= 3 ? bestColor : DESIGN_PALETTE.find((c) => c.name === "black") || bestColor;
|
|
4607
|
+
}
|
|
4608
|
+
function analyzeImageColor(imageSrc) {
|
|
4609
|
+
return new Promise((resolve, reject) => {
|
|
4610
|
+
const img = new Image();
|
|
4611
|
+
img.crossOrigin = "anonymous";
|
|
4612
|
+
img.onload = () => {
|
|
4613
|
+
try {
|
|
4614
|
+
const canvas = document.createElement("canvas");
|
|
4615
|
+
const ctx = canvas.getContext("2d");
|
|
4616
|
+
if (!ctx) {
|
|
4617
|
+
reject(new Error("Could not get canvas context"));
|
|
4618
|
+
return;
|
|
4619
|
+
}
|
|
4620
|
+
const maxSize = 100;
|
|
4621
|
+
const scale = Math.min(maxSize / img.width, maxSize / img.height);
|
|
4622
|
+
canvas.width = img.width * scale;
|
|
4623
|
+
canvas.height = img.height * scale;
|
|
4624
|
+
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
|
|
4625
|
+
const dominantColor = extractDominantColor(canvas);
|
|
4626
|
+
const bestContrastColor = getBestContrastColor(dominantColor);
|
|
4627
|
+
resolve(bestContrastColor);
|
|
4628
|
+
} catch (error) {
|
|
4629
|
+
reject(error);
|
|
4630
|
+
}
|
|
4631
|
+
};
|
|
4632
|
+
img.onerror = () => reject(new Error("Failed to load image"));
|
|
4633
|
+
img.src = imageSrc;
|
|
4634
|
+
});
|
|
4635
|
+
}
|
|
4636
|
+
async function extractImageEdgeColorAsync(imageUrl) {
|
|
4637
|
+
return new Promise((resolve) => {
|
|
4638
|
+
if (typeof window === "undefined") {
|
|
4639
|
+
resolve("#000000");
|
|
4640
|
+
return;
|
|
4641
|
+
}
|
|
4642
|
+
const img = new Image();
|
|
4643
|
+
img.crossOrigin = "anonymous";
|
|
4644
|
+
img.onload = () => {
|
|
4645
|
+
try {
|
|
4646
|
+
const canvas = document.createElement("canvas");
|
|
4647
|
+
const ctx = canvas.getContext("2d");
|
|
4648
|
+
if (!ctx) {
|
|
4649
|
+
resolve("#000000");
|
|
4650
|
+
return;
|
|
4651
|
+
}
|
|
4652
|
+
const maxSize = 50;
|
|
4653
|
+
const scale = Math.min(maxSize / img.naturalWidth, maxSize / img.naturalHeight);
|
|
4654
|
+
const w = Math.round(img.naturalWidth * scale);
|
|
4655
|
+
const h = Math.round(img.naturalHeight * scale);
|
|
4656
|
+
canvas.width = w;
|
|
4657
|
+
canvas.height = h;
|
|
4658
|
+
ctx.drawImage(img, 0, 0, w, h);
|
|
4659
|
+
const data = ctx.getImageData(0, 0, w, h).data;
|
|
4660
|
+
const edgeW = Math.max(2, Math.round(w * 0.15));
|
|
4661
|
+
const edgeH = Math.max(2, Math.round(h * 0.15));
|
|
4662
|
+
const bucketSize = 32;
|
|
4663
|
+
const buckets = /* @__PURE__ */ new Map();
|
|
4664
|
+
for (let y = 0; y < h; y++) {
|
|
4665
|
+
for (let x = 0; x < w; x++) {
|
|
4666
|
+
if (!(x < edgeW || x >= w - edgeW || y < edgeH || y >= h - edgeH)) continue;
|
|
4667
|
+
const i = (y * w + x) * 4;
|
|
4668
|
+
if (data[i + 3] < 128) continue;
|
|
4669
|
+
const br = Math.floor(data[i] / bucketSize) * bucketSize;
|
|
4670
|
+
const bg = Math.floor(data[i + 1] / bucketSize) * bucketSize;
|
|
4671
|
+
const bb = Math.floor(data[i + 2] / bucketSize) * bucketSize;
|
|
4672
|
+
const key = `${br},${bg},${bb}`;
|
|
4673
|
+
const existing = buckets.get(key);
|
|
4674
|
+
if (existing) {
|
|
4675
|
+
existing.r += data[i];
|
|
4676
|
+
existing.g += data[i + 1];
|
|
4677
|
+
existing.b += data[i + 2];
|
|
4678
|
+
existing.count++;
|
|
4679
|
+
} else {
|
|
4680
|
+
buckets.set(key, { r: data[i], g: data[i + 1], b: data[i + 2], count: 1 });
|
|
4681
|
+
}
|
|
4682
|
+
}
|
|
4683
|
+
}
|
|
4684
|
+
let best = { r: 0, g: 0, b: 0, count: 0 };
|
|
4685
|
+
for (const b2 of buckets.values()) {
|
|
4686
|
+
if (b2.count > best.count) best = b2;
|
|
4687
|
+
}
|
|
4688
|
+
if (best.count === 0) {
|
|
4689
|
+
resolve("#000000");
|
|
4690
|
+
return;
|
|
4691
|
+
}
|
|
4692
|
+
const r = Math.round(best.r / best.count), g = Math.round(best.g / best.count), b = Math.round(best.b / best.count);
|
|
4693
|
+
resolve(`#${r.toString(16).padStart(2, "0")}${g.toString(16).padStart(2, "0")}${b.toString(16).padStart(2, "0")}`);
|
|
4694
|
+
} catch {
|
|
4695
|
+
resolve("#000000");
|
|
4696
|
+
}
|
|
4697
|
+
};
|
|
4698
|
+
img.onerror = () => resolve("#000000");
|
|
4699
|
+
img.src = imageUrl;
|
|
4700
|
+
});
|
|
4701
|
+
}
|
|
4702
|
+
|
|
4703
|
+
// src/utils/ods-color-utils.ts
|
|
4704
|
+
function getPlatformAccentColor(platform) {
|
|
4705
|
+
const currentPlatform = platform || getCurrentPlatform();
|
|
4706
|
+
const platformColors2 = {
|
|
4707
|
+
"openmsp": "var(--ods-open-yellow-base)",
|
|
4708
|
+
// CSS variable instead of hex
|
|
4709
|
+
"openframe": "var(--ods-open-yellow-base)",
|
|
4710
|
+
// CSS variable instead of hex
|
|
4711
|
+
"flamingo": "var(--ods-flamingo-pink-base)"
|
|
4712
|
+
// CSS variable instead of hex
|
|
4713
|
+
};
|
|
4714
|
+
return platformColors2[currentPlatform];
|
|
4715
|
+
}
|
|
4716
|
+
function getCurrentPlatform() {
|
|
4717
|
+
if (typeof window === "undefined") {
|
|
4718
|
+
return process.env.NEXT_PUBLIC_APP_TYPE || "openmsp";
|
|
4719
|
+
}
|
|
4720
|
+
const domPlatform = document.documentElement.getAttribute("data-app-type");
|
|
4721
|
+
if (domPlatform) {
|
|
4722
|
+
return domPlatform;
|
|
4723
|
+
}
|
|
4724
|
+
return process.env.NEXT_PUBLIC_APP_TYPE || "openmsp";
|
|
4725
|
+
}
|
|
4726
|
+
function getReadableTextColor(hex) {
|
|
4727
|
+
return pickReadableTextColor(hex) === "dark" ? "#212121" : "#fafafa";
|
|
4728
|
+
}
|
|
4729
|
+
var HEX_PATTERN = /^#[0-9a-fA-F]{6}$/;
|
|
4730
|
+
function clamp(n, min, max) {
|
|
4731
|
+
return Math.max(min, Math.min(max, n));
|
|
4732
|
+
}
|
|
4733
|
+
function hexToRgb2(hex) {
|
|
4734
|
+
if (!HEX_PATTERN.test(hex)) return null;
|
|
4735
|
+
const n = Number.parseInt(hex.slice(1), 16);
|
|
4736
|
+
return { r: n >> 16 & 255, g: n >> 8 & 255, b: n & 255 };
|
|
4737
|
+
}
|
|
4738
|
+
function rgbToHex(r, g, b) {
|
|
4739
|
+
const to = (n) => clamp(Math.round(n), 0, 255).toString(16).padStart(2, "0");
|
|
4740
|
+
return `#${to(r)}${to(g)}${to(b)}`;
|
|
4741
|
+
}
|
|
4742
|
+
var HOVER_DARKEN_STEP = 10;
|
|
4743
|
+
var ACTIVE_DARKEN_STEP = 20;
|
|
4744
|
+
function darkenByStep(hex, step) {
|
|
4745
|
+
const rgb = hexToRgb2(hex);
|
|
4746
|
+
if (!rgb) return hex;
|
|
4747
|
+
return rgbToHex(rgb.r - step, rgb.g - step, rgb.b - step);
|
|
4748
|
+
}
|
|
4749
|
+
function deriveHoverColor(hex) {
|
|
4750
|
+
return darkenByStep(hex, HOVER_DARKEN_STEP);
|
|
4751
|
+
}
|
|
4752
|
+
function deriveActiveColor(hex) {
|
|
4753
|
+
return darkenByStep(hex, ACTIVE_DARKEN_STEP);
|
|
4754
|
+
}
|
|
4755
|
+
function rgbToHsl(r, g, b) {
|
|
4756
|
+
const rn = r / 255;
|
|
4757
|
+
const gn = g / 255;
|
|
4758
|
+
const bn = b / 255;
|
|
4759
|
+
const max = Math.max(rn, gn, bn);
|
|
4760
|
+
const min = Math.min(rn, gn, bn);
|
|
4761
|
+
const l = (max + min) / 2;
|
|
4762
|
+
if (max === min) return { h: 0, s: 0, l: Math.round(l * 100) };
|
|
4763
|
+
const d = max - min;
|
|
4764
|
+
const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
|
|
4765
|
+
let h;
|
|
4766
|
+
if (max === rn) h = (gn - bn) / d + (gn < bn ? 6 : 0);
|
|
4767
|
+
else if (max === gn) h = (bn - rn) / d + 2;
|
|
4768
|
+
else h = (rn - gn) / d + 4;
|
|
4769
|
+
h *= 60;
|
|
4770
|
+
return { h: Math.round(h), s: Math.round(s * 100), l: Math.round(l * 100) };
|
|
4771
|
+
}
|
|
4772
|
+
function hslToRgb(h, s, l) {
|
|
4773
|
+
const sn = clamp(s, 0, 100) / 100;
|
|
4774
|
+
const ln = clamp(l, 0, 100) / 100;
|
|
4775
|
+
const hn = (h % 360 + 360) % 360;
|
|
4776
|
+
if (sn === 0) {
|
|
4777
|
+
const v = Math.round(ln * 255);
|
|
4778
|
+
return { r: v, g: v, b: v };
|
|
4779
|
+
}
|
|
4780
|
+
const q = ln < 0.5 ? ln * (1 + sn) : ln + sn - ln * sn;
|
|
4781
|
+
const p = 2 * ln - q;
|
|
4782
|
+
const hue2rgb = (t) => {
|
|
4783
|
+
let tn = t;
|
|
4784
|
+
if (tn < 0) tn += 1;
|
|
4785
|
+
if (tn > 1) tn -= 1;
|
|
4786
|
+
if (tn < 1 / 6) return p + (q - p) * 6 * tn;
|
|
4787
|
+
if (tn < 1 / 2) return q;
|
|
4788
|
+
if (tn < 2 / 3) return p + (q - p) * (2 / 3 - tn) * 6;
|
|
4789
|
+
return p;
|
|
4790
|
+
};
|
|
4791
|
+
const hk = hn / 360;
|
|
4792
|
+
return {
|
|
4793
|
+
r: Math.round(hue2rgb(hk + 1 / 3) * 255),
|
|
4794
|
+
g: Math.round(hue2rgb(hk) * 255),
|
|
4795
|
+
b: Math.round(hue2rgb(hk - 1 / 3) * 255)
|
|
4796
|
+
};
|
|
4797
|
+
}
|
|
4798
|
+
|
|
4532
4799
|
// src/components/ui/actions-menu.tsx
|
|
4533
4800
|
import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
|
|
4534
4801
|
|
|
@@ -5084,282 +5351,42 @@ function ColorSwatch({ color, className }) {
|
|
|
5084
5351
|
);
|
|
5085
5352
|
}
|
|
5086
5353
|
|
|
5087
|
-
// src/components/ui/
|
|
5354
|
+
// src/components/ui/tooltip.tsx
|
|
5088
5355
|
init_cn();
|
|
5089
|
-
|
|
5090
|
-
|
|
5091
|
-
|
|
5092
|
-
|
|
5093
|
-
|
|
5094
|
-
|
|
5095
|
-
|
|
5096
|
-
|
|
5097
|
-
|
|
5098
|
-
|
|
5099
|
-
|
|
5100
|
-
|
|
5101
|
-
|
|
5102
|
-
|
|
5103
|
-
|
|
5104
|
-
|
|
5105
|
-
|
|
5106
|
-
|
|
5107
|
-
|
|
5108
|
-
|
|
5109
|
-
const lum1 = getLuminance(color1);
|
|
5110
|
-
const lum2 = getLuminance(color2);
|
|
5111
|
-
const brightest = Math.max(lum1, lum2);
|
|
5112
|
-
const darkest = Math.min(lum1, lum2);
|
|
5113
|
-
return (brightest + 0.05) / (darkest + 0.05);
|
|
5114
|
-
}
|
|
5115
|
-
function pickReadableTextColor(bgHex) {
|
|
5116
|
-
const bg = hexToRgb(bgHex);
|
|
5117
|
-
const darkContrast = getContrastRatio(bg, [26, 26, 26]);
|
|
5118
|
-
const lightContrast = getContrastRatio(bg, [250, 250, 250]);
|
|
5119
|
-
return darkContrast >= lightContrast ? "dark" : "light";
|
|
5120
|
-
}
|
|
5121
|
-
function extractDominantColor(canvas) {
|
|
5122
|
-
const ctx = canvas.getContext("2d");
|
|
5123
|
-
if (!ctx) return [128, 128, 128];
|
|
5124
|
-
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
|
|
5125
|
-
const data = imageData.data;
|
|
5126
|
-
const sampleSize = Math.max(1, Math.floor(data.length / (4 * 1e3)));
|
|
5127
|
-
const colorCounts = {};
|
|
5128
|
-
for (let i = 0; i < data.length; i += 4 * sampleSize) {
|
|
5129
|
-
const r = data[i];
|
|
5130
|
-
const g = data[i + 1];
|
|
5131
|
-
const b = data[i + 2];
|
|
5132
|
-
const alpha = data[i + 3];
|
|
5133
|
-
if (alpha < 128) continue;
|
|
5134
|
-
const bucketR = Math.round(r / 32) * 32;
|
|
5135
|
-
const bucketG = Math.round(g / 32) * 32;
|
|
5136
|
-
const bucketB = Math.round(b / 32) * 32;
|
|
5137
|
-
const key = `${bucketR},${bucketG},${bucketB}`;
|
|
5138
|
-
colorCounts[key] = (colorCounts[key] || 0) + 1;
|
|
5139
|
-
}
|
|
5140
|
-
let maxCount = 0;
|
|
5141
|
-
let dominantColor = [128, 128, 128];
|
|
5142
|
-
for (const [colorKey, count] of Object.entries(colorCounts)) {
|
|
5143
|
-
if (count > maxCount) {
|
|
5144
|
-
maxCount = count;
|
|
5145
|
-
const [r, g, b] = colorKey.split(",").map(Number);
|
|
5146
|
-
dominantColor = [r, g, b];
|
|
5147
|
-
}
|
|
5148
|
-
}
|
|
5149
|
-
return dominantColor;
|
|
5150
|
-
}
|
|
5151
|
-
function getBestContrastColor(imageColor) {
|
|
5152
|
-
let bestColor = DESIGN_PALETTE[0];
|
|
5153
|
-
let bestContrast = 0;
|
|
5154
|
-
for (const color of DESIGN_PALETTE) {
|
|
5155
|
-
const contrast = getContrastRatio(imageColor, color.rgb);
|
|
5156
|
-
if (contrast > bestContrast) {
|
|
5157
|
-
bestContrast = contrast;
|
|
5158
|
-
bestColor = color;
|
|
5159
|
-
}
|
|
5160
|
-
}
|
|
5161
|
-
return bestContrast >= 3 ? bestColor : DESIGN_PALETTE.find((c) => c.name === "black") || bestColor;
|
|
5162
|
-
}
|
|
5163
|
-
function analyzeImageColor(imageSrc) {
|
|
5164
|
-
return new Promise((resolve, reject) => {
|
|
5165
|
-
const img = new Image();
|
|
5166
|
-
img.crossOrigin = "anonymous";
|
|
5167
|
-
img.onload = () => {
|
|
5168
|
-
try {
|
|
5169
|
-
const canvas = document.createElement("canvas");
|
|
5170
|
-
const ctx = canvas.getContext("2d");
|
|
5171
|
-
if (!ctx) {
|
|
5172
|
-
reject(new Error("Could not get canvas context"));
|
|
5173
|
-
return;
|
|
5174
|
-
}
|
|
5175
|
-
const maxSize = 100;
|
|
5176
|
-
const scale = Math.min(maxSize / img.width, maxSize / img.height);
|
|
5177
|
-
canvas.width = img.width * scale;
|
|
5178
|
-
canvas.height = img.height * scale;
|
|
5179
|
-
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
|
|
5180
|
-
const dominantColor = extractDominantColor(canvas);
|
|
5181
|
-
const bestContrastColor = getBestContrastColor(dominantColor);
|
|
5182
|
-
resolve(bestContrastColor);
|
|
5183
|
-
} catch (error) {
|
|
5184
|
-
reject(error);
|
|
5185
|
-
}
|
|
5186
|
-
};
|
|
5187
|
-
img.onerror = () => reject(new Error("Failed to load image"));
|
|
5188
|
-
img.src = imageSrc;
|
|
5189
|
-
});
|
|
5190
|
-
}
|
|
5191
|
-
async function extractImageEdgeColorAsync(imageUrl) {
|
|
5192
|
-
return new Promise((resolve) => {
|
|
5193
|
-
if (typeof window === "undefined") {
|
|
5194
|
-
resolve("#000000");
|
|
5195
|
-
return;
|
|
5356
|
+
import * as React10 from "react";
|
|
5357
|
+
import * as TooltipPrimitive from "@radix-ui/react-tooltip";
|
|
5358
|
+
import { jsx as jsx24 } from "react/jsx-runtime";
|
|
5359
|
+
var TooltipProvider = TooltipPrimitive.Provider;
|
|
5360
|
+
var Tooltip = TooltipPrimitive.Root;
|
|
5361
|
+
var TooltipTrigger = TooltipPrimitive.Trigger;
|
|
5362
|
+
var TooltipContent = React10.forwardRef(({ className, sideOffset = 4, ...props }, ref) => {
|
|
5363
|
+
const container = usePortalContainer();
|
|
5364
|
+
return /* @__PURE__ */ jsx24(TooltipPrimitive.Portal, { container: container ?? void 0, children: /* @__PURE__ */ jsx24(
|
|
5365
|
+
TooltipPrimitive.Content,
|
|
5366
|
+
{
|
|
5367
|
+
ref,
|
|
5368
|
+
sideOffset,
|
|
5369
|
+
className: cn(
|
|
5370
|
+
// `max-h` uses Radix's available-height var so tall content scrolls inside
|
|
5371
|
+
// the tooltip instead of overflowing off-screen (only engages on overflow).
|
|
5372
|
+
"z-[1400] max-h-[var(--radix-popper-available-height)] overflow-y-auto rounded-md bg-ods-card border border-ods-border px-3 py-2 text-h6 text-ods-text-primary shadow-lg animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
|
|
5373
|
+
className
|
|
5374
|
+
),
|
|
5375
|
+
...props
|
|
5196
5376
|
}
|
|
5197
|
-
|
|
5198
|
-
|
|
5199
|
-
|
|
5200
|
-
try {
|
|
5201
|
-
const canvas = document.createElement("canvas");
|
|
5202
|
-
const ctx = canvas.getContext("2d");
|
|
5203
|
-
if (!ctx) {
|
|
5204
|
-
resolve("#000000");
|
|
5205
|
-
return;
|
|
5206
|
-
}
|
|
5207
|
-
const maxSize = 50;
|
|
5208
|
-
const scale = Math.min(maxSize / img.naturalWidth, maxSize / img.naturalHeight);
|
|
5209
|
-
const w = Math.round(img.naturalWidth * scale);
|
|
5210
|
-
const h = Math.round(img.naturalHeight * scale);
|
|
5211
|
-
canvas.width = w;
|
|
5212
|
-
canvas.height = h;
|
|
5213
|
-
ctx.drawImage(img, 0, 0, w, h);
|
|
5214
|
-
const data = ctx.getImageData(0, 0, w, h).data;
|
|
5215
|
-
const edgeW = Math.max(2, Math.round(w * 0.15));
|
|
5216
|
-
const edgeH = Math.max(2, Math.round(h * 0.15));
|
|
5217
|
-
const bucketSize = 32;
|
|
5218
|
-
const buckets = /* @__PURE__ */ new Map();
|
|
5219
|
-
for (let y = 0; y < h; y++) {
|
|
5220
|
-
for (let x = 0; x < w; x++) {
|
|
5221
|
-
if (!(x < edgeW || x >= w - edgeW || y < edgeH || y >= h - edgeH)) continue;
|
|
5222
|
-
const i = (y * w + x) * 4;
|
|
5223
|
-
if (data[i + 3] < 128) continue;
|
|
5224
|
-
const br = Math.floor(data[i] / bucketSize) * bucketSize;
|
|
5225
|
-
const bg = Math.floor(data[i + 1] / bucketSize) * bucketSize;
|
|
5226
|
-
const bb = Math.floor(data[i + 2] / bucketSize) * bucketSize;
|
|
5227
|
-
const key = `${br},${bg},${bb}`;
|
|
5228
|
-
const existing = buckets.get(key);
|
|
5229
|
-
if (existing) {
|
|
5230
|
-
existing.r += data[i];
|
|
5231
|
-
existing.g += data[i + 1];
|
|
5232
|
-
existing.b += data[i + 2];
|
|
5233
|
-
existing.count++;
|
|
5234
|
-
} else {
|
|
5235
|
-
buckets.set(key, { r: data[i], g: data[i + 1], b: data[i + 2], count: 1 });
|
|
5236
|
-
}
|
|
5237
|
-
}
|
|
5238
|
-
}
|
|
5239
|
-
let best = { r: 0, g: 0, b: 0, count: 0 };
|
|
5240
|
-
for (const b2 of buckets.values()) {
|
|
5241
|
-
if (b2.count > best.count) best = b2;
|
|
5242
|
-
}
|
|
5243
|
-
if (best.count === 0) {
|
|
5244
|
-
resolve("#000000");
|
|
5245
|
-
return;
|
|
5246
|
-
}
|
|
5247
|
-
const r = Math.round(best.r / best.count), g = Math.round(best.g / best.count), b = Math.round(best.b / best.count);
|
|
5248
|
-
resolve(`#${r.toString(16).padStart(2, "0")}${g.toString(16).padStart(2, "0")}${b.toString(16).padStart(2, "0")}`);
|
|
5249
|
-
} catch {
|
|
5250
|
-
resolve("#000000");
|
|
5251
|
-
}
|
|
5252
|
-
};
|
|
5253
|
-
img.onerror = () => resolve("#000000");
|
|
5254
|
-
img.src = imageUrl;
|
|
5255
|
-
});
|
|
5256
|
-
}
|
|
5257
|
-
|
|
5258
|
-
// src/utils/ods-color-utils.ts
|
|
5259
|
-
function getPlatformAccentColor(platform) {
|
|
5260
|
-
const currentPlatform = platform || getCurrentPlatform();
|
|
5261
|
-
const platformColors2 = {
|
|
5262
|
-
"openmsp": "var(--ods-open-yellow-base)",
|
|
5263
|
-
// CSS variable instead of hex
|
|
5264
|
-
"openframe": "var(--ods-open-yellow-base)",
|
|
5265
|
-
// CSS variable instead of hex
|
|
5266
|
-
"flamingo": "var(--ods-flamingo-pink-base)"
|
|
5267
|
-
// CSS variable instead of hex
|
|
5268
|
-
};
|
|
5269
|
-
return platformColors2[currentPlatform];
|
|
5270
|
-
}
|
|
5271
|
-
function getCurrentPlatform() {
|
|
5272
|
-
if (typeof window === "undefined") {
|
|
5273
|
-
return process.env.NEXT_PUBLIC_APP_TYPE || "openmsp";
|
|
5274
|
-
}
|
|
5275
|
-
const domPlatform = document.documentElement.getAttribute("data-app-type");
|
|
5276
|
-
if (domPlatform) {
|
|
5277
|
-
return domPlatform;
|
|
5278
|
-
}
|
|
5279
|
-
return process.env.NEXT_PUBLIC_APP_TYPE || "openmsp";
|
|
5280
|
-
}
|
|
5281
|
-
function getReadableTextColor(hex) {
|
|
5282
|
-
return pickReadableTextColor(hex) === "dark" ? "#212121" : "#fafafa";
|
|
5283
|
-
}
|
|
5284
|
-
var HEX_PATTERN = /^#[0-9a-fA-F]{6}$/;
|
|
5285
|
-
function clamp(n, min, max) {
|
|
5286
|
-
return Math.max(min, Math.min(max, n));
|
|
5287
|
-
}
|
|
5288
|
-
function hexToRgb2(hex) {
|
|
5289
|
-
if (!HEX_PATTERN.test(hex)) return null;
|
|
5290
|
-
const n = Number.parseInt(hex.slice(1), 16);
|
|
5291
|
-
return { r: n >> 16 & 255, g: n >> 8 & 255, b: n & 255 };
|
|
5292
|
-
}
|
|
5293
|
-
function rgbToHex(r, g, b) {
|
|
5294
|
-
const to = (n) => clamp(Math.round(n), 0, 255).toString(16).padStart(2, "0");
|
|
5295
|
-
return `#${to(r)}${to(g)}${to(b)}`;
|
|
5296
|
-
}
|
|
5297
|
-
var HOVER_DARKEN_STEP = 10;
|
|
5298
|
-
var ACTIVE_DARKEN_STEP = 20;
|
|
5299
|
-
function darkenByStep(hex, step) {
|
|
5300
|
-
const rgb = hexToRgb2(hex);
|
|
5301
|
-
if (!rgb) return hex;
|
|
5302
|
-
return rgbToHex(rgb.r - step, rgb.g - step, rgb.b - step);
|
|
5303
|
-
}
|
|
5304
|
-
function deriveHoverColor(hex) {
|
|
5305
|
-
return darkenByStep(hex, HOVER_DARKEN_STEP);
|
|
5306
|
-
}
|
|
5307
|
-
function deriveActiveColor(hex) {
|
|
5308
|
-
return darkenByStep(hex, ACTIVE_DARKEN_STEP);
|
|
5309
|
-
}
|
|
5310
|
-
function rgbToHsl(r, g, b) {
|
|
5311
|
-
const rn = r / 255;
|
|
5312
|
-
const gn = g / 255;
|
|
5313
|
-
const bn = b / 255;
|
|
5314
|
-
const max = Math.max(rn, gn, bn);
|
|
5315
|
-
const min = Math.min(rn, gn, bn);
|
|
5316
|
-
const l = (max + min) / 2;
|
|
5317
|
-
if (max === min) return { h: 0, s: 0, l: Math.round(l * 100) };
|
|
5318
|
-
const d = max - min;
|
|
5319
|
-
const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
|
|
5320
|
-
let h;
|
|
5321
|
-
if (max === rn) h = (gn - bn) / d + (gn < bn ? 6 : 0);
|
|
5322
|
-
else if (max === gn) h = (bn - rn) / d + 2;
|
|
5323
|
-
else h = (rn - gn) / d + 4;
|
|
5324
|
-
h *= 60;
|
|
5325
|
-
return { h: Math.round(h), s: Math.round(s * 100), l: Math.round(l * 100) };
|
|
5326
|
-
}
|
|
5327
|
-
function hslToRgb(h, s, l) {
|
|
5328
|
-
const sn = clamp(s, 0, 100) / 100;
|
|
5329
|
-
const ln = clamp(l, 0, 100) / 100;
|
|
5330
|
-
const hn = (h % 360 + 360) % 360;
|
|
5331
|
-
if (sn === 0) {
|
|
5332
|
-
const v = Math.round(ln * 255);
|
|
5333
|
-
return { r: v, g: v, b: v };
|
|
5334
|
-
}
|
|
5335
|
-
const q = ln < 0.5 ? ln * (1 + sn) : ln + sn - ln * sn;
|
|
5336
|
-
const p = 2 * ln - q;
|
|
5337
|
-
const hue2rgb = (t) => {
|
|
5338
|
-
let tn = t;
|
|
5339
|
-
if (tn < 0) tn += 1;
|
|
5340
|
-
if (tn > 1) tn -= 1;
|
|
5341
|
-
if (tn < 1 / 6) return p + (q - p) * 6 * tn;
|
|
5342
|
-
if (tn < 1 / 2) return q;
|
|
5343
|
-
if (tn < 2 / 3) return p + (q - p) * (2 / 3 - tn) * 6;
|
|
5344
|
-
return p;
|
|
5345
|
-
};
|
|
5346
|
-
const hk = hn / 360;
|
|
5347
|
-
return {
|
|
5348
|
-
r: Math.round(hue2rgb(hk + 1 / 3) * 255),
|
|
5349
|
-
g: Math.round(hue2rgb(hk) * 255),
|
|
5350
|
-
b: Math.round(hue2rgb(hk - 1 / 3) * 255)
|
|
5351
|
-
};
|
|
5352
|
-
}
|
|
5377
|
+
) });
|
|
5378
|
+
});
|
|
5379
|
+
TooltipContent.displayName = TooltipPrimitive.Content.displayName;
|
|
5353
5380
|
|
|
5354
5381
|
// src/components/ui/ticket-status-tag.tsx
|
|
5355
|
-
import { jsx as
|
|
5382
|
+
import { jsx as jsx25, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
5356
5383
|
var STATUS_CONFIG = {
|
|
5357
5384
|
ACTIVE: {
|
|
5358
5385
|
label: "Active",
|
|
5359
5386
|
variant: "success"
|
|
5360
5387
|
},
|
|
5361
5388
|
AI_ASSISTANCE: {
|
|
5362
|
-
label: "AI
|
|
5389
|
+
label: "AI Handling",
|
|
5363
5390
|
variant: "outline"
|
|
5364
5391
|
},
|
|
5365
5392
|
TECH_REQUIRED: {
|
|
@@ -5373,7 +5400,7 @@ var STATUS_CONFIG = {
|
|
|
5373
5400
|
RESOLVED: {
|
|
5374
5401
|
label: "Resolved",
|
|
5375
5402
|
variant: "outline",
|
|
5376
|
-
icon: /* @__PURE__ */
|
|
5403
|
+
icon: /* @__PURE__ */ jsx25(CheckCircleIcon, { size: 16, color: "var(--color-success)" })
|
|
5377
5404
|
},
|
|
5378
5405
|
ARCHIVED: {
|
|
5379
5406
|
label: "Archived",
|
|
@@ -5452,7 +5479,9 @@ function TicketStatusTag({
|
|
|
5452
5479
|
showIcon = true,
|
|
5453
5480
|
options,
|
|
5454
5481
|
onSelect,
|
|
5455
|
-
isPending = false
|
|
5482
|
+
isPending = false,
|
|
5483
|
+
disabled = false,
|
|
5484
|
+
disabledReason
|
|
5456
5485
|
}) {
|
|
5457
5486
|
const config = getTicketStatusConfig(status);
|
|
5458
5487
|
const customStyle = color ? {
|
|
@@ -5462,7 +5491,7 @@ function TicketStatusTag({
|
|
|
5462
5491
|
color: getReadableTextColor(color)
|
|
5463
5492
|
} : void 0;
|
|
5464
5493
|
const customColorClasses = color ? "bg-[var(--tag-bg)] hover:bg-[var(--tag-bg-hover)] active:bg-[var(--tag-bg-active)]" : void 0;
|
|
5465
|
-
const tag = /* @__PURE__ */
|
|
5494
|
+
const tag = /* @__PURE__ */ jsx25(
|
|
5466
5495
|
Tag,
|
|
5467
5496
|
{
|
|
5468
5497
|
label: label ?? config.label,
|
|
@@ -5472,10 +5501,16 @@ function TicketStatusTag({
|
|
|
5472
5501
|
style: customStyle
|
|
5473
5502
|
}
|
|
5474
5503
|
);
|
|
5475
|
-
if (!options || options.length === 0 || !onSelect) {
|
|
5504
|
+
if (disabled || !options || options.length === 0 || !onSelect) {
|
|
5505
|
+
if (disabled && disabledReason) {
|
|
5506
|
+
return /* @__PURE__ */ jsx25(TooltipProvider, { delayDuration: 0, children: /* @__PURE__ */ jsxs17(Tooltip, { children: [
|
|
5507
|
+
/* @__PURE__ */ jsx25(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx25("span", { className: "w-fit shrink-0 cursor-not-allowed", children: tag }) }),
|
|
5508
|
+
/* @__PURE__ */ jsx25(TooltipContent, { children: disabledReason })
|
|
5509
|
+
] }) });
|
|
5510
|
+
}
|
|
5476
5511
|
return tag;
|
|
5477
5512
|
}
|
|
5478
|
-
return /* @__PURE__ */
|
|
5513
|
+
return /* @__PURE__ */ jsx25(
|
|
5479
5514
|
ActionsMenuDropdown,
|
|
5480
5515
|
{
|
|
5481
5516
|
align: "start",
|
|
@@ -5484,7 +5519,7 @@ function TicketStatusTag({
|
|
|
5484
5519
|
items: options.map((option) => ({
|
|
5485
5520
|
id: option.id,
|
|
5486
5521
|
label: option.name,
|
|
5487
|
-
icon: /* @__PURE__ */
|
|
5522
|
+
icon: /* @__PURE__ */ jsx25(ColorSwatch, { color: option.color }),
|
|
5488
5523
|
onClick: () => onSelect(option.id),
|
|
5489
5524
|
disabled: isPending
|
|
5490
5525
|
}))
|
|
@@ -5509,10 +5544,10 @@ function TicketStatusTag({
|
|
|
5509
5544
|
),
|
|
5510
5545
|
children: [
|
|
5511
5546
|
/* @__PURE__ */ jsxs17("span", { className: "flex items-center gap-[var(--spacing-system-xxs)] px-[var(--spacing-system-xsf)]", children: [
|
|
5512
|
-
showIcon && config.icon && /* @__PURE__ */
|
|
5513
|
-
/* @__PURE__ */
|
|
5547
|
+
showIcon && config.icon && /* @__PURE__ */ jsx25("span", { className: "flex items-center justify-center size-5 shrink-0", children: config.icon }),
|
|
5548
|
+
/* @__PURE__ */ jsx25("span", { className: "truncate", children: label ?? config.label })
|
|
5514
5549
|
] }),
|
|
5515
|
-
/* @__PURE__ */
|
|
5550
|
+
/* @__PURE__ */ jsx25("span", { className: "flex items-center justify-center self-stretch border-l border-ods-border px-[var(--spacing-system-xsf)]", children: /* @__PURE__ */ jsx25(Chevron02DownIcon, { className: "size-4 shrink-0" }) })
|
|
5516
5551
|
]
|
|
5517
5552
|
}
|
|
5518
5553
|
)
|
|
@@ -5523,7 +5558,7 @@ function TicketStatusTag({
|
|
|
5523
5558
|
// src/components/chat/msp-organization-card.tsx
|
|
5524
5559
|
init_cn();
|
|
5525
5560
|
init_button2();
|
|
5526
|
-
import { jsx as
|
|
5561
|
+
import { jsx as jsx26, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
5527
5562
|
function MspOrganizationCard({
|
|
5528
5563
|
name,
|
|
5529
5564
|
website,
|
|
@@ -5545,12 +5580,12 @@ function MspOrganizationCard({
|
|
|
5545
5580
|
className
|
|
5546
5581
|
),
|
|
5547
5582
|
children: [
|
|
5548
|
-
/* @__PURE__ */
|
|
5583
|
+
/* @__PURE__ */ jsx26(SquareAvatar, { src: logoUrl, alt: name, fallback: name, size: "lg", variant: "square" }),
|
|
5549
5584
|
/* @__PURE__ */ jsxs18("div", { className: "flex min-w-0 flex-1 flex-col", children: [
|
|
5550
|
-
/* @__PURE__ */
|
|
5551
|
-
website ? /* @__PURE__ */
|
|
5585
|
+
/* @__PURE__ */ jsx26("span", { className: "truncate text-h3 text-ods-text-primary", children: title ?? `Your IT is managed by ${name}` }),
|
|
5586
|
+
website ? /* @__PURE__ */ jsx26("span", { className: "truncate text-h4 text-ods-text-secondary", children: website }) : null
|
|
5552
5587
|
] }),
|
|
5553
|
-
href ? /* @__PURE__ */
|
|
5588
|
+
href ? /* @__PURE__ */ jsx26(Button, { asChild: true, variant: "outline", size: "icon", "aria-label": actionLabel, children: /* @__PURE__ */ jsx26("a", { href, target: "_blank", rel: "noreferrer noopener", children: /* @__PURE__ */ jsx26(ExternalLinkIcon, {}) }) }) : onOpenWebsite ? /* @__PURE__ */ jsx26(Button, { variant: "outline", size: "icon", "aria-label": actionLabel, onClick: onOpenWebsite, children: /* @__PURE__ */ jsx26(ExternalLinkIcon, {}) }) : null
|
|
5554
5589
|
]
|
|
5555
5590
|
}
|
|
5556
5591
|
);
|
|
@@ -5558,7 +5593,7 @@ function MspOrganizationCard({
|
|
|
5558
5593
|
|
|
5559
5594
|
// src/components/chat/msp-organization-card-skeleton.tsx
|
|
5560
5595
|
init_cn();
|
|
5561
|
-
import { jsx as
|
|
5596
|
+
import { jsx as jsx27, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
5562
5597
|
function MspOrganizationCardSkeleton({ className }) {
|
|
5563
5598
|
return /* @__PURE__ */ jsxs19(
|
|
5564
5599
|
"div",
|
|
@@ -5568,19 +5603,19 @@ function MspOrganizationCardSkeleton({ className }) {
|
|
|
5568
5603
|
className
|
|
5569
5604
|
),
|
|
5570
5605
|
children: [
|
|
5571
|
-
/* @__PURE__ */
|
|
5606
|
+
/* @__PURE__ */ jsx27(Skeleton, { className: "size-12 shrink-0 rounded-md" }),
|
|
5572
5607
|
/* @__PURE__ */ jsxs19("div", { className: "flex min-w-0 flex-1 flex-col justify-center gap-2 self-stretch", children: [
|
|
5573
|
-
/* @__PURE__ */
|
|
5574
|
-
/* @__PURE__ */
|
|
5608
|
+
/* @__PURE__ */ jsx27(Skeleton, { className: "h-5 w-3/5 rounded-md" }),
|
|
5609
|
+
/* @__PURE__ */ jsx27(Skeleton, { className: "h-4 w-2/5 rounded-md" })
|
|
5575
5610
|
] }),
|
|
5576
|
-
/* @__PURE__ */
|
|
5611
|
+
/* @__PURE__ */ jsx27(Skeleton, { className: "size-12 shrink-0 rounded-md" })
|
|
5577
5612
|
]
|
|
5578
5613
|
}
|
|
5579
5614
|
);
|
|
5580
5615
|
}
|
|
5581
5616
|
|
|
5582
5617
|
// src/components/chat/chat-container.tsx
|
|
5583
|
-
import { Fragment as Fragment5, jsx as
|
|
5618
|
+
import { Fragment as Fragment5, jsx as jsx28, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
5584
5619
|
var ConnectionIndicator = ({ status }) => {
|
|
5585
5620
|
const getStatusStyles = () => {
|
|
5586
5621
|
switch (status) {
|
|
@@ -5596,7 +5631,7 @@ var ConnectionIndicator = ({ status }) => {
|
|
|
5596
5631
|
return "bg-ods-text-tertiary";
|
|
5597
5632
|
}
|
|
5598
5633
|
};
|
|
5599
|
-
return /* @__PURE__ */
|
|
5634
|
+
return /* @__PURE__ */ jsx28("div", { className: "flex items-center", children: /* @__PURE__ */ jsx28(
|
|
5600
5635
|
"output",
|
|
5601
5636
|
{
|
|
5602
5637
|
className: cn(
|
|
@@ -5608,9 +5643,9 @@ var ConnectionIndicator = ({ status }) => {
|
|
|
5608
5643
|
}
|
|
5609
5644
|
) });
|
|
5610
5645
|
};
|
|
5611
|
-
var ChatContainer =
|
|
5646
|
+
var ChatContainer = React11.forwardRef(
|
|
5612
5647
|
({ className, children, ...props }, ref) => {
|
|
5613
|
-
return /* @__PURE__ */
|
|
5648
|
+
return /* @__PURE__ */ jsx28(
|
|
5614
5649
|
"div",
|
|
5615
5650
|
{
|
|
5616
5651
|
ref,
|
|
@@ -5627,7 +5662,7 @@ var ChatContainer = React10.forwardRef(
|
|
|
5627
5662
|
}
|
|
5628
5663
|
);
|
|
5629
5664
|
ChatContainer.displayName = "ChatContainer";
|
|
5630
|
-
var ChatHeader =
|
|
5665
|
+
var ChatHeader = React11.forwardRef(
|
|
5631
5666
|
({ className, userName = 'Grace "Fae" Meadows', userTitle = "Your Personal Assistant", userAvatar, userIcon, onSettingsClick, onNewChat, onClose, onBack, showNewChat = false, connectionStatus = "disconnected", serverUrl = null, headerActions, ticketInfo, mspOrganization, isMspLoading = false, fullWidth = false, bare = false, isLoading = false, ...props }, ref) => {
|
|
5632
5667
|
const cardClasses = bare ? "" : "rounded-md bg-ods-card border border-ods-border";
|
|
5633
5668
|
return /* @__PURE__ */ jsxs20(
|
|
@@ -5643,14 +5678,14 @@ var ChatHeader = React10.forwardRef(
|
|
|
5643
5678
|
),
|
|
5644
5679
|
...props,
|
|
5645
5680
|
children: [
|
|
5646
|
-
onBack && /* @__PURE__ */
|
|
5681
|
+
onBack && /* @__PURE__ */ jsx28(
|
|
5647
5682
|
Button,
|
|
5648
5683
|
{
|
|
5649
5684
|
onClick: onBack,
|
|
5650
5685
|
variant: "transparent",
|
|
5651
5686
|
size: "icon",
|
|
5652
5687
|
"aria-label": "Back",
|
|
5653
|
-
leftIcon: /* @__PURE__ */
|
|
5688
|
+
leftIcon: /* @__PURE__ */ jsx28(Chevron02LeftIcon, { size: 24, className: "text-ods-text-primary" }),
|
|
5654
5689
|
className: cn(
|
|
5655
5690
|
cardClasses,
|
|
5656
5691
|
"absolute top-0 right-full mr-[var(--spacing-system-s)] hover:bg-ods-bg-hover"
|
|
@@ -5660,13 +5695,13 @@ var ChatHeader = React10.forwardRef(
|
|
|
5660
5695
|
/* @__PURE__ */ jsxs20("div", { className: cardClasses, children: [
|
|
5661
5696
|
/* @__PURE__ */ jsxs20("div", { className: "flex items-center justify-between gap-4 px-4 py-3", children: [
|
|
5662
5697
|
isLoading ? /* @__PURE__ */ jsxs20("div", { className: "flex items-center gap-3", children: [
|
|
5663
|
-
/* @__PURE__ */
|
|
5698
|
+
/* @__PURE__ */ jsx28(Skeleton, { className: "w-16 h-16 rounded-full shrink-0" }),
|
|
5664
5699
|
/* @__PURE__ */ jsxs20("div", { className: "flex flex-col gap-1", children: [
|
|
5665
|
-
/* @__PURE__ */
|
|
5666
|
-
/* @__PURE__ */
|
|
5700
|
+
/* @__PURE__ */ jsx28(Skeleton, { className: "h-6 w-40" }),
|
|
5701
|
+
/* @__PURE__ */ jsx28(Skeleton, { className: "h-4 w-28" })
|
|
5667
5702
|
] })
|
|
5668
5703
|
] }) : /* @__PURE__ */ jsxs20("div", { className: "flex items-center gap-3", children: [
|
|
5669
|
-
userIcon ? /* @__PURE__ */
|
|
5704
|
+
userIcon ? /* @__PURE__ */ jsx28("div", { className: "flex items-center justify-center w-16 h-16 rounded-full bg-ods-accent", children: userIcon }) : /* @__PURE__ */ jsx28(
|
|
5670
5705
|
SquareAvatar,
|
|
5671
5706
|
{
|
|
5672
5707
|
src: userAvatar,
|
|
@@ -5678,26 +5713,26 @@ var ChatHeader = React10.forwardRef(
|
|
|
5678
5713
|
}
|
|
5679
5714
|
),
|
|
5680
5715
|
/* @__PURE__ */ jsxs20("div", { className: "flex flex-col", children: [
|
|
5681
|
-
/* @__PURE__ */
|
|
5682
|
-
/* @__PURE__ */
|
|
5683
|
-
/* @__PURE__ */
|
|
5684
|
-
/* @__PURE__ */
|
|
5716
|
+
/* @__PURE__ */ jsx28("span", { className: "text-h3", children: userName }),
|
|
5717
|
+
/* @__PURE__ */ jsx28("div", { className: "flex items-center gap-2", children: serverUrl && /* @__PURE__ */ jsxs20(Fragment5, { children: [
|
|
5718
|
+
/* @__PURE__ */ jsx28("span", { className: "text-h4 text-ods-text-secondary", children: serverUrl }),
|
|
5719
|
+
/* @__PURE__ */ jsx28(ConnectionIndicator, { status: connectionStatus })
|
|
5685
5720
|
] }) })
|
|
5686
5721
|
] })
|
|
5687
5722
|
] }),
|
|
5688
5723
|
/* @__PURE__ */ jsxs20("div", { className: "flex items-center gap-1", children: [
|
|
5689
|
-
showNewChat && onNewChat && /* @__PURE__ */
|
|
5724
|
+
showNewChat && onNewChat && /* @__PURE__ */ jsx28(
|
|
5690
5725
|
Button,
|
|
5691
5726
|
{
|
|
5692
5727
|
onClick: onNewChat,
|
|
5693
5728
|
variant: "transparent",
|
|
5694
5729
|
size: "small-legacy",
|
|
5695
|
-
leftIcon: /* @__PURE__ */
|
|
5730
|
+
leftIcon: /* @__PURE__ */ jsx28(PlusCircleIcon2, { className: "w-5 h-5", whiteOverlay: true }),
|
|
5696
5731
|
className: "text-ods-text-primary hover:bg-ods-bg-hover",
|
|
5697
5732
|
children: "New Chat"
|
|
5698
5733
|
}
|
|
5699
5734
|
),
|
|
5700
|
-
onClose && /* @__PURE__ */
|
|
5735
|
+
onClose && /* @__PURE__ */ jsx28(
|
|
5701
5736
|
Button,
|
|
5702
5737
|
{
|
|
5703
5738
|
onClick: onClose,
|
|
@@ -5705,15 +5740,15 @@ var ChatHeader = React10.forwardRef(
|
|
|
5705
5740
|
size: "small-legacy",
|
|
5706
5741
|
"aria-label": "Close",
|
|
5707
5742
|
className: "text-ods-text-muted hover:text-ods-text-primary hover:bg-ods-bg-hover !p-1.5",
|
|
5708
|
-
children: /* @__PURE__ */
|
|
5743
|
+
children: /* @__PURE__ */ jsx28(XmarkIcon, { size: 16 })
|
|
5709
5744
|
}
|
|
5710
5745
|
),
|
|
5711
5746
|
headerActions
|
|
5712
5747
|
] })
|
|
5713
5748
|
] }),
|
|
5714
5749
|
!ticketInfo && (isMspLoading || mspOrganization) && /* @__PURE__ */ jsxs20(Fragment5, { children: [
|
|
5715
|
-
/* @__PURE__ */
|
|
5716
|
-
isMspLoading || !mspOrganization ? /* @__PURE__ */
|
|
5750
|
+
/* @__PURE__ */ jsx28("div", { className: "h-px bg-ods-border" }),
|
|
5751
|
+
isMspLoading || !mspOrganization ? /* @__PURE__ */ jsx28(MspOrganizationCardSkeleton, { className: cn("ring-0 rounded-none", !bare && "rounded-b-md") }) : /* @__PURE__ */ jsx28(
|
|
5717
5752
|
MspOrganizationCard,
|
|
5718
5753
|
{
|
|
5719
5754
|
...mspOrganization,
|
|
@@ -5722,13 +5757,13 @@ var ChatHeader = React10.forwardRef(
|
|
|
5722
5757
|
)
|
|
5723
5758
|
] }),
|
|
5724
5759
|
ticketInfo && /* @__PURE__ */ jsxs20(Fragment5, { children: [
|
|
5725
|
-
/* @__PURE__ */
|
|
5760
|
+
/* @__PURE__ */ jsx28("div", { className: "h-px bg-ods-border" }),
|
|
5726
5761
|
/* @__PURE__ */ jsxs20("div", { className: "flex items-center justify-between gap-4 px-4 py-2", children: [
|
|
5727
5762
|
/* @__PURE__ */ jsxs20("div", { className: "flex flex-col min-w-0", children: [
|
|
5728
|
-
/* @__PURE__ */
|
|
5729
|
-
ticketInfo.meta && /* @__PURE__ */
|
|
5763
|
+
/* @__PURE__ */ jsx28("span", { className: "text-heading-3 truncate", title: typeof ticketInfo.title === "string" ? ticketInfo.title : void 0, children: ticketInfo.title }),
|
|
5764
|
+
ticketInfo.meta && /* @__PURE__ */ jsx28("div", { className: "text-h6 text-ods-text-secondary truncate", title: typeof ticketInfo.meta === "string" ? ticketInfo.meta : void 0, children: ticketInfo.meta })
|
|
5730
5765
|
] }),
|
|
5731
|
-
(ticketInfo.status || ticketInfo.statusName) && /* @__PURE__ */
|
|
5766
|
+
(ticketInfo.status || ticketInfo.statusName) && /* @__PURE__ */ jsx28(
|
|
5732
5767
|
TicketStatusTag,
|
|
5733
5768
|
{
|
|
5734
5769
|
...resolveStatusTagProps({
|
|
@@ -5748,9 +5783,9 @@ var ChatHeader = React10.forwardRef(
|
|
|
5748
5783
|
}
|
|
5749
5784
|
);
|
|
5750
5785
|
ChatHeader.displayName = "ChatHeader";
|
|
5751
|
-
var ChatContent =
|
|
5786
|
+
var ChatContent = React11.forwardRef(
|
|
5752
5787
|
({ className, children, ...props }, ref) => {
|
|
5753
|
-
return /* @__PURE__ */
|
|
5788
|
+
return /* @__PURE__ */ jsx28(
|
|
5754
5789
|
"div",
|
|
5755
5790
|
{
|
|
5756
5791
|
ref,
|
|
@@ -5765,9 +5800,9 @@ var ChatContent = React10.forwardRef(
|
|
|
5765
5800
|
}
|
|
5766
5801
|
);
|
|
5767
5802
|
ChatContent.displayName = "ChatContent";
|
|
5768
|
-
var ChatFooter =
|
|
5803
|
+
var ChatFooter = React11.forwardRef(
|
|
5769
5804
|
({ className, contentClassName, fullWidth = false, children, ...props }, ref) => {
|
|
5770
|
-
return /* @__PURE__ */
|
|
5805
|
+
return /* @__PURE__ */ jsx28(
|
|
5771
5806
|
"div",
|
|
5772
5807
|
{
|
|
5773
5808
|
ref,
|
|
@@ -5776,7 +5811,7 @@ var ChatFooter = React10.forwardRef(
|
|
|
5776
5811
|
className
|
|
5777
5812
|
),
|
|
5778
5813
|
...props,
|
|
5779
|
-
children: /* @__PURE__ */
|
|
5814
|
+
children: /* @__PURE__ */ jsx28(
|
|
5780
5815
|
"div",
|
|
5781
5816
|
{
|
|
5782
5817
|
className: cn(
|
|
@@ -5799,14 +5834,14 @@ ChatFooter.displayName = "ChatFooter";
|
|
|
5799
5834
|
|
|
5800
5835
|
// src/components/chat/chat-input.tsx
|
|
5801
5836
|
init_cn();
|
|
5802
|
-
import { useState as useState10, useRef as useRef7, useImperativeHandle, forwardRef as
|
|
5837
|
+
import { useState as useState10, useRef as useRef7, useImperativeHandle, forwardRef as forwardRef16, useCallback as useCallback3, useEffect as useEffect6, useMemo as useMemo7 } from "react";
|
|
5803
5838
|
import { renderToStaticMarkup } from "react-dom/server";
|
|
5804
5839
|
|
|
5805
5840
|
// src/components/chat/chat-typing-indicator.tsx
|
|
5806
5841
|
init_cn();
|
|
5807
|
-
import * as
|
|
5808
|
-
import { jsx as
|
|
5809
|
-
var ChatTypingIndicator =
|
|
5842
|
+
import * as React12 from "react";
|
|
5843
|
+
import { jsx as jsx29, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
5844
|
+
var ChatTypingIndicator = React12.forwardRef(
|
|
5810
5845
|
({ className, size: size2 = "md", showText = false, dotClassName, ...props }, ref) => {
|
|
5811
5846
|
const dotSizeClasses = {
|
|
5812
5847
|
sm: "w-1 h-1",
|
|
@@ -5837,13 +5872,13 @@ var ChatTypingIndicator = React11.forwardRef(
|
|
|
5837
5872
|
className: cn("flex items-center gap-2", className),
|
|
5838
5873
|
...props,
|
|
5839
5874
|
children: [
|
|
5840
|
-
/* @__PURE__ */
|
|
5841
|
-
showText && /* @__PURE__ */
|
|
5875
|
+
/* @__PURE__ */ jsx29("style", { dangerouslySetInnerHTML: { __html: dotAnimation } }),
|
|
5876
|
+
showText && /* @__PURE__ */ jsx29("span", { className: "text-ods-text-secondary text-h6", children: "Assistant is typing" }),
|
|
5842
5877
|
/* @__PURE__ */ jsxs21("div", { className: cn(
|
|
5843
5878
|
"inline-flex items-center justify-center gap-1",
|
|
5844
5879
|
containerSizeClasses[size2]
|
|
5845
5880
|
), children: [
|
|
5846
|
-
/* @__PURE__ */
|
|
5881
|
+
/* @__PURE__ */ jsx29(
|
|
5847
5882
|
"div",
|
|
5848
5883
|
{
|
|
5849
5884
|
className: cn(
|
|
@@ -5857,7 +5892,7 @@ var ChatTypingIndicator = React11.forwardRef(
|
|
|
5857
5892
|
}
|
|
5858
5893
|
}
|
|
5859
5894
|
),
|
|
5860
|
-
/* @__PURE__ */
|
|
5895
|
+
/* @__PURE__ */ jsx29(
|
|
5861
5896
|
"div",
|
|
5862
5897
|
{
|
|
5863
5898
|
className: cn(
|
|
@@ -5871,7 +5906,7 @@ var ChatTypingIndicator = React11.forwardRef(
|
|
|
5871
5906
|
}
|
|
5872
5907
|
}
|
|
5873
5908
|
),
|
|
5874
|
-
/* @__PURE__ */
|
|
5909
|
+
/* @__PURE__ */ jsx29(
|
|
5875
5910
|
"div",
|
|
5876
5911
|
{
|
|
5877
5912
|
className: cn(
|
|
@@ -5899,7 +5934,7 @@ init_cn();
|
|
|
5899
5934
|
// src/components/chat/mingo-onboarding-card.tsx
|
|
5900
5935
|
init_cn();
|
|
5901
5936
|
init_button2();
|
|
5902
|
-
import { jsx as
|
|
5937
|
+
import { jsx as jsx30, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
5903
5938
|
function MingoOnboardingCard({
|
|
5904
5939
|
icon,
|
|
5905
5940
|
title,
|
|
@@ -5918,13 +5953,13 @@ function MingoOnboardingCard({
|
|
|
5918
5953
|
// consumers can drop any `icons-v2-generated` glyph (they use
|
|
5919
5954
|
// `currentColor`) without per-card styling. Brand multi-color
|
|
5920
5955
|
// SVGs ignore this color.
|
|
5921
|
-
/* @__PURE__ */
|
|
5956
|
+
/* @__PURE__ */ jsx30("span", { className: "flex shrink-0 size-4 items-center justify-center text-ods-text-secondary", children: icon })
|
|
5922
5957
|
) : null,
|
|
5923
|
-
/* @__PURE__ */
|
|
5924
|
-
slashCommand ? /* @__PURE__ */
|
|
5958
|
+
/* @__PURE__ */ jsx30("span", { className: "flex-1 min-w-0 truncate text-h6 text-ods-text-primary", children: title }),
|
|
5959
|
+
slashCommand ? /* @__PURE__ */ jsx30("span", { className: "text-h6 text-ods-text-secondary whitespace-nowrap", children: slashCommand }) : null
|
|
5925
5960
|
] }),
|
|
5926
|
-
description ? /* @__PURE__ */
|
|
5927
|
-
hasActions ? /* @__PURE__ */
|
|
5961
|
+
description ? /* @__PURE__ */ jsx30("p", { className: "text-h6 text-ods-text-secondary w-full", children: description }) : null,
|
|
5962
|
+
hasActions ? /* @__PURE__ */ jsx30("div", { className: "flex flex-wrap items-center gap-[var(--spacing-system-xxs)] mt-[var(--spacing-system-xs)]", children: actions.map((action) => /* @__PURE__ */ jsx30(
|
|
5928
5963
|
Button,
|
|
5929
5964
|
{
|
|
5930
5965
|
type: "button",
|
|
@@ -5945,9 +5980,9 @@ function MingoOnboardingCard({
|
|
|
5945
5980
|
className
|
|
5946
5981
|
);
|
|
5947
5982
|
if (isInteractive) {
|
|
5948
|
-
return /* @__PURE__ */
|
|
5983
|
+
return /* @__PURE__ */ jsx30("button", { type: "button", onClick, className: baseClass, children: body });
|
|
5949
5984
|
}
|
|
5950
|
-
return /* @__PURE__ */
|
|
5985
|
+
return /* @__PURE__ */ jsx30("div", { className: baseClass, children: body });
|
|
5951
5986
|
}
|
|
5952
5987
|
|
|
5953
5988
|
// src/components/chat/utils/icon-registry.ts
|
|
@@ -6146,10 +6181,10 @@ function getDynamicIcon(iconName, size2 = "md", className) {
|
|
|
6146
6181
|
|
|
6147
6182
|
// src/components/chat/utils/icon-library.tsx
|
|
6148
6183
|
import { Megaphone as Megaphone2, Bell as Bell2, Info as Info2, Star as Star2, Package as PackageGlyph } from "lucide-react";
|
|
6149
|
-
import { jsx as
|
|
6184
|
+
import { jsx as jsx31 } from "react/jsx-runtime";
|
|
6150
6185
|
function sizedLogo(Logo) {
|
|
6151
6186
|
return function SizedLogo({ size: size2 = 16, className }) {
|
|
6152
|
-
return /* @__PURE__ */
|
|
6187
|
+
return /* @__PURE__ */ jsx31(Logo, { className, style: { width: size2, height: size2 } });
|
|
6153
6188
|
};
|
|
6154
6189
|
}
|
|
6155
6190
|
var OpenmspLogoIcon = sizedLogo(OpenmspLogo);
|
|
@@ -6160,7 +6195,7 @@ function LogoOpenframeIcon({
|
|
|
6160
6195
|
color
|
|
6161
6196
|
}) {
|
|
6162
6197
|
const tint = color ?? "currentColor";
|
|
6163
|
-
return /* @__PURE__ */
|
|
6198
|
+
return /* @__PURE__ */ jsx31(
|
|
6164
6199
|
OpenFrameLogo,
|
|
6165
6200
|
{
|
|
6166
6201
|
className,
|
|
@@ -6433,7 +6468,7 @@ var ICON_OPTIONS = [
|
|
|
6433
6468
|
];
|
|
6434
6469
|
|
|
6435
6470
|
// src/components/chat/slash-command-suggestions.tsx
|
|
6436
|
-
import { jsx as
|
|
6471
|
+
import { jsx as jsx32 } from "react/jsx-runtime";
|
|
6437
6472
|
function SlashCommandSuggestions({
|
|
6438
6473
|
commands,
|
|
6439
6474
|
highlightedIdx,
|
|
@@ -6444,7 +6479,7 @@ function SlashCommandSuggestions({
|
|
|
6444
6479
|
className
|
|
6445
6480
|
}) {
|
|
6446
6481
|
if (commands.length === 0) return null;
|
|
6447
|
-
return /* @__PURE__ */
|
|
6482
|
+
return /* @__PURE__ */ jsx32(
|
|
6448
6483
|
"div",
|
|
6449
6484
|
{
|
|
6450
6485
|
role: "menu",
|
|
@@ -6469,7 +6504,7 @@ function SlashCommandSuggestions({
|
|
|
6469
6504
|
onAction(cmd, action.id);
|
|
6470
6505
|
}
|
|
6471
6506
|
})) : void 0;
|
|
6472
|
-
return /* @__PURE__ */
|
|
6507
|
+
return /* @__PURE__ */ jsx32(
|
|
6473
6508
|
"div",
|
|
6474
6509
|
{
|
|
6475
6510
|
role: "menuitem",
|
|
@@ -6484,10 +6519,10 @@ function SlashCommandSuggestions({
|
|
|
6484
6519
|
}
|
|
6485
6520
|
},
|
|
6486
6521
|
className: "cursor-pointer outline-none",
|
|
6487
|
-
children: /* @__PURE__ */
|
|
6522
|
+
children: /* @__PURE__ */ jsx32(
|
|
6488
6523
|
MingoOnboardingCard,
|
|
6489
6524
|
{
|
|
6490
|
-
icon: LegacyIcon ? /* @__PURE__ */
|
|
6525
|
+
icon: LegacyIcon ? /* @__PURE__ */ jsx32(LegacyIcon, { className: "size-4" }) : /* @__PURE__ */ jsx32(Icon2, { size: 16 }),
|
|
6491
6526
|
title,
|
|
6492
6527
|
slashCommand: slashLabel,
|
|
6493
6528
|
description: cmd.description,
|
|
@@ -6507,7 +6542,7 @@ function SlashCommandSuggestions({
|
|
|
6507
6542
|
}
|
|
6508
6543
|
|
|
6509
6544
|
// src/components/chat/chat-input.tsx
|
|
6510
|
-
import { jsx as
|
|
6545
|
+
import { jsx as jsx33, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
6511
6546
|
var SLASH_INPUT_TRIGGER = /^\/([a-z][a-z0-9-]*)?$/;
|
|
6512
6547
|
var MENTION_GLOBAL = /@[A-Za-z0-9_.+/=-]+:[A-Za-z0-9_.+/=-]+/g;
|
|
6513
6548
|
var MENTION_TRIGGER_AT_END = /(^|\s)@([\w.-]*)$/;
|
|
@@ -6543,7 +6578,7 @@ function buildChipEl(token, label, icon) {
|
|
|
6543
6578
|
span.setAttribute("contenteditable", "false");
|
|
6544
6579
|
span.className = "mx-0.5 inline-flex h-9 items-center select-none align-top";
|
|
6545
6580
|
span.innerHTML = renderToStaticMarkup(
|
|
6546
|
-
/* @__PURE__ */
|
|
6581
|
+
/* @__PURE__ */ jsx33(
|
|
6547
6582
|
Tag,
|
|
6548
6583
|
{
|
|
6549
6584
|
as: "span",
|
|
@@ -6601,7 +6636,7 @@ function insertTextAtCaret(text) {
|
|
|
6601
6636
|
sel.removeAllRanges();
|
|
6602
6637
|
sel.addRange(range);
|
|
6603
6638
|
}
|
|
6604
|
-
var ChatInput =
|
|
6639
|
+
var ChatInput = forwardRef16((allProps, ref) => {
|
|
6605
6640
|
const { slashCommands, ...rest } = allProps;
|
|
6606
6641
|
const {
|
|
6607
6642
|
className,
|
|
@@ -6881,7 +6916,7 @@ var ChatInput = forwardRef15((allProps, ref) => {
|
|
|
6881
6916
|
const sendDisabled = sending || disabled || !hasContent2;
|
|
6882
6917
|
const isEmpty = value.length === 0;
|
|
6883
6918
|
const showPreview = !sending && !disabled && !!previewText && !previewDismissed;
|
|
6884
|
-
return /* @__PURE__ */
|
|
6919
|
+
return /* @__PURE__ */ jsx33(
|
|
6885
6920
|
"div",
|
|
6886
6921
|
{
|
|
6887
6922
|
className: cn(
|
|
@@ -6889,10 +6924,10 @@ var ChatInput = forwardRef15((allProps, ref) => {
|
|
|
6889
6924
|
className
|
|
6890
6925
|
),
|
|
6891
6926
|
children: awaitingResponse ? /* @__PURE__ */ jsxs23("div", { className: "relative flex items-center justify-center gap-[var(--spacing-system-xs)] rounded-md bg-ods-card border border-ods-border px-[var(--spacing-system-s)] py-[var(--spacing-system-s)] transition-colors", children: [
|
|
6892
|
-
/* @__PURE__ */
|
|
6893
|
-
/* @__PURE__ */
|
|
6927
|
+
/* @__PURE__ */ jsx33(ChatTypingIndicator, { size: "sm", dotClassName: "bg-ods-text-primary" }),
|
|
6928
|
+
/* @__PURE__ */ jsx33("p", { className: "text-h4 text-ods-text-secondary", children: "Waiting for Technician Response" })
|
|
6894
6929
|
] }) : /* @__PURE__ */ jsxs23("div", { className: "relative", children: [
|
|
6895
|
-
/* @__PURE__ */
|
|
6930
|
+
/* @__PURE__ */ jsx33(
|
|
6896
6931
|
SlashCommandSuggestions,
|
|
6897
6932
|
{
|
|
6898
6933
|
commands: slashPrefix !== null ? slashSuggestions : [],
|
|
@@ -6928,11 +6963,11 @@ var ChatInput = forwardRef15((allProps, ref) => {
|
|
|
6928
6963
|
hideBorder && "bg-transparent"
|
|
6929
6964
|
),
|
|
6930
6965
|
children: [
|
|
6931
|
-
startIcon && /* @__PURE__ */
|
|
6966
|
+
startIcon && /* @__PURE__ */ jsx33("span", { className: "flex h-6 shrink-0 items-center", children: startIcon }),
|
|
6932
6967
|
/* @__PURE__ */ jsxs23("div", { className: "relative flex-1 min-w-0", children: [
|
|
6933
|
-
isEmpty && !showPreview && /* @__PURE__ */
|
|
6934
|
-
showPreview && /* @__PURE__ */
|
|
6935
|
-
/* @__PURE__ */
|
|
6968
|
+
isEmpty && !showPreview && /* @__PURE__ */ jsx33("span", { className: "pointer-events-none absolute left-0 top-0 select-none text-h4 text-ods-text-secondary", children: disabled ? "Connection lost. Waiting to reconnect..." : placeholder }),
|
|
6969
|
+
showPreview && /* @__PURE__ */ jsx33("p", { className: cn("pointer-events-none absolute inset-x-0 top-0 m-0 select-none truncate text-h4 text-ods-text-secondary", hasChips && "!leading-9"), children: previewText }),
|
|
6970
|
+
/* @__PURE__ */ jsx33(
|
|
6936
6971
|
"div",
|
|
6937
6972
|
{
|
|
6938
6973
|
ref: editorRef,
|
|
@@ -6986,7 +7021,7 @@ var ChatInput = forwardRef15((allProps, ref) => {
|
|
|
6986
7021
|
}
|
|
6987
7022
|
)
|
|
6988
7023
|
] }),
|
|
6989
|
-
/* @__PURE__ */
|
|
7024
|
+
/* @__PURE__ */ jsx33(
|
|
6990
7025
|
"button",
|
|
6991
7026
|
{
|
|
6992
7027
|
type: "button",
|
|
@@ -7005,7 +7040,7 @@ var ChatInput = forwardRef15((allProps, ref) => {
|
|
|
7005
7040
|
"focus-visible:outline-none focus-visible:text-ods-accent",
|
|
7006
7041
|
"disabled:cursor-not-allowed disabled:opacity-40 disabled:hover:text-ods-text-secondary"
|
|
7007
7042
|
),
|
|
7008
|
-
children: isStopMode ? /* @__PURE__ */
|
|
7043
|
+
children: isStopMode ? /* @__PURE__ */ jsx33(StopCircleIcon, { size: 20 }) : /* @__PURE__ */ jsx33(Send01Icon, { size: 20 })
|
|
7009
7044
|
}
|
|
7010
7045
|
)
|
|
7011
7046
|
]
|
|
@@ -7019,7 +7054,7 @@ ChatInput.displayName = "ChatInput";
|
|
|
7019
7054
|
|
|
7020
7055
|
// src/components/chat/chat-message-enhanced.tsx
|
|
7021
7056
|
init_cn();
|
|
7022
|
-
import
|
|
7057
|
+
import React14, { forwardRef as forwardRef18, memo as memo3, useEffect as useEffect8, useMemo as useMemo10, useRef as useRef9 } from "react";
|
|
7023
7058
|
|
|
7024
7059
|
// src/utils/date-utils.ts
|
|
7025
7060
|
function formatTicketRelativeTime(iso) {
|
|
@@ -7152,10 +7187,10 @@ function createUTCTimestamp() {
|
|
|
7152
7187
|
|
|
7153
7188
|
// src/components/chat/tool-execution-display.tsx
|
|
7154
7189
|
init_cn();
|
|
7155
|
-
import { forwardRef as
|
|
7156
|
-
import { Fragment as Fragment6, jsx as
|
|
7190
|
+
import { forwardRef as forwardRef17, useMemo as useMemo8, useState as useState11 } from "react";
|
|
7191
|
+
import { Fragment as Fragment6, jsx as jsx34, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
7157
7192
|
var COMMAND_BODY_KEYS2 = new Set(COMMAND_BODY_ARG_KEYS);
|
|
7158
|
-
var ToolExecutionDisplay =
|
|
7193
|
+
var ToolExecutionDisplay = forwardRef17(
|
|
7159
7194
|
({ className, message: message2, assistantType, variant = "admin", ...props }, ref) => {
|
|
7160
7195
|
const [expanded, setExpanded] = useState11(false);
|
|
7161
7196
|
const { innerRef, containerStyle } = useCollapsible({ expanded });
|
|
@@ -7180,14 +7215,14 @@ var ToolExecutionDisplay = forwardRef16(
|
|
|
7180
7215
|
const hasResult = isExecuted && typeof message2.result === "string" && message2.result.length > 0;
|
|
7181
7216
|
const hasBody = argEntries.length > 0 || hasResult || isExecuting;
|
|
7182
7217
|
const renderStatusIcon = () => {
|
|
7183
|
-
if (isExecuting) return /* @__PURE__ */
|
|
7184
|
-
if (isExecuted && message2.success === true) return /* @__PURE__ */
|
|
7185
|
-
if (isExecuted && message2.success === false) return /* @__PURE__ */
|
|
7218
|
+
if (isExecuting) return /* @__PURE__ */ jsx34(DotsLoaderIcon, { size: 16, className: "text-ods-text-secondary" });
|
|
7219
|
+
if (isExecuted && message2.success === true) return /* @__PURE__ */ jsx34(CheckCircleIcon, { className: "w-4 h-4 text-ods-success" });
|
|
7220
|
+
if (isExecuted && message2.success === false) return /* @__PURE__ */ jsx34(XmarkCircleIcon, { className: "w-4 h-4 text-ods-error" });
|
|
7186
7221
|
return null;
|
|
7187
7222
|
};
|
|
7188
7223
|
const headerContent = /* @__PURE__ */ jsxs24(Fragment6, { children: [
|
|
7189
|
-
!isClient && /* @__PURE__ */
|
|
7190
|
-
/* @__PURE__ */
|
|
7224
|
+
!isClient && /* @__PURE__ */ jsx34("div", { className: "flex items-center justify-center shrink-0 w-5 h-5", children: /* @__PURE__ */ jsx34(ToolIcon, { toolType: integratedToolType, size: 16 }) }),
|
|
7225
|
+
/* @__PURE__ */ jsx34(
|
|
7191
7226
|
"div",
|
|
7192
7227
|
{
|
|
7193
7228
|
className: cn(
|
|
@@ -7197,10 +7232,10 @@ var ToolExecutionDisplay = forwardRef16(
|
|
|
7197
7232
|
children: previewText
|
|
7198
7233
|
}
|
|
7199
7234
|
),
|
|
7200
|
-
/* @__PURE__ */
|
|
7201
|
-
!isClientView && /* @__PURE__ */
|
|
7235
|
+
/* @__PURE__ */ jsx34("div", { className: "flex items-center justify-center shrink-0 w-5 h-5", children: renderStatusIcon() }),
|
|
7236
|
+
!isClientView && /* @__PURE__ */ jsx34("div", { className: "flex items-center justify-center shrink-0 w-5 h-5", children: /* @__PURE__ */ jsx34(ExpandChevron, { expanded }) })
|
|
7202
7237
|
] });
|
|
7203
|
-
return /* @__PURE__ */
|
|
7238
|
+
return /* @__PURE__ */ jsx34(
|
|
7204
7239
|
"div",
|
|
7205
7240
|
{
|
|
7206
7241
|
ref,
|
|
@@ -7214,9 +7249,9 @@ var ToolExecutionDisplay = forwardRef16(
|
|
|
7214
7249
|
children: isClientView ? (
|
|
7215
7250
|
// Client (Fae end-user): static, non-expandable row — no chevron, no
|
|
7216
7251
|
// body. Just the explanation + status; command/args/result are hidden.
|
|
7217
|
-
/* @__PURE__ */
|
|
7252
|
+
/* @__PURE__ */ jsx34("div", { className: "flex gap-[var(--spacing-system-xs)] items-start p-[var(--spacing-system-s)] w-full text-left", children: headerContent })
|
|
7218
7253
|
) : /* @__PURE__ */ jsxs24(Fragment6, { children: [
|
|
7219
|
-
/* @__PURE__ */
|
|
7254
|
+
/* @__PURE__ */ jsx34(
|
|
7220
7255
|
"button",
|
|
7221
7256
|
{
|
|
7222
7257
|
type: "button",
|
|
@@ -7225,9 +7260,9 @@ var ToolExecutionDisplay = forwardRef16(
|
|
|
7225
7260
|
children: headerContent
|
|
7226
7261
|
}
|
|
7227
7262
|
),
|
|
7228
|
-
/* @__PURE__ */
|
|
7229
|
-
argEntries.map(([key, value]) => /* @__PURE__ */
|
|
7230
|
-
hasResult && /* @__PURE__ */
|
|
7263
|
+
/* @__PURE__ */ jsx34("div", { className: "w-full", style: containerStyle, children: /* @__PURE__ */ jsx34("div", { ref: innerRef, children: hasBody && /* @__PURE__ */ jsxs24("div", { className: "flex flex-col gap-0 items-start w-full text-h6 p-[var(--spacing-system-sf)] bg-ods-card", children: [
|
|
7264
|
+
argEntries.map(([key, value]) => /* @__PURE__ */ jsx34(ArgRow, { argKey: key, value }, key)),
|
|
7265
|
+
hasResult && /* @__PURE__ */ jsx34(
|
|
7231
7266
|
ResultBlock,
|
|
7232
7267
|
{
|
|
7233
7268
|
result: message2.result,
|
|
@@ -7242,8 +7277,8 @@ var ToolExecutionDisplay = forwardRef16(
|
|
|
7242
7277
|
argEntries.length > 0 && "mt-[var(--spacing-system-xsf)]"
|
|
7243
7278
|
),
|
|
7244
7279
|
children: [
|
|
7245
|
-
/* @__PURE__ */
|
|
7246
|
-
/* @__PURE__ */
|
|
7280
|
+
/* @__PURE__ */ jsx34("span", { className: "text-ods-text-secondary", children: "Result:" }),
|
|
7281
|
+
/* @__PURE__ */ jsx34(DotsLoaderIcon, { size: 16, className: "text-ods-text-secondary" })
|
|
7247
7282
|
]
|
|
7248
7283
|
}
|
|
7249
7284
|
)
|
|
@@ -7360,9 +7395,9 @@ import { Fragment as Fragment8, Suspense, useCallback as useCallback5, useEffect
|
|
|
7360
7395
|
init_cn();
|
|
7361
7396
|
|
|
7362
7397
|
// src/components/chat/context-items-list.tsx
|
|
7363
|
-
import * as
|
|
7398
|
+
import * as React13 from "react";
|
|
7364
7399
|
init_cn();
|
|
7365
|
-
import { Fragment as Fragment7, jsx as
|
|
7400
|
+
import { Fragment as Fragment7, jsx as jsx35, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
7366
7401
|
var itemKey = (i) => `${i.type}:${i.id}`;
|
|
7367
7402
|
var CONTEXT_ROW_CLASS = "flex w-full items-center gap-2 border-b border-ods-border bg-ods-bg py-3 pl-4 pr-2 text-left outline-none transition-colors last:border-b-0 hover:bg-ods-bg-hover focus-visible:bg-ods-bg-hover [&_svg]:size-4 md:[&_svg]:size-6";
|
|
7368
7403
|
var CONTEXT_ICON_CLASS = "flex size-4 shrink-0 items-center justify-center text-ods-text-secondary md:size-6";
|
|
@@ -7390,19 +7425,19 @@ function ContextMenuRow({
|
|
|
7390
7425
|
title,
|
|
7391
7426
|
className: cn(CONTEXT_ROW_CLASS, disabled && "cursor-not-allowed opacity-40 hover:bg-ods-bg"),
|
|
7392
7427
|
children: [
|
|
7393
|
-
icon != null && /* @__PURE__ */
|
|
7394
|
-
/* @__PURE__ */
|
|
7428
|
+
icon != null && /* @__PURE__ */ jsx35("span", { className: CONTEXT_ICON_CLASS, children: icon }),
|
|
7429
|
+
/* @__PURE__ */ jsx35("span", { className: CONTEXT_LABEL_CLASS, children: label }),
|
|
7395
7430
|
trailing
|
|
7396
7431
|
]
|
|
7397
7432
|
}
|
|
7398
7433
|
);
|
|
7399
7434
|
}
|
|
7400
7435
|
function ContextItemsSkeleton({ count }) {
|
|
7401
|
-
return /* @__PURE__ */
|
|
7436
|
+
return /* @__PURE__ */ jsx35(Fragment7, { children: Array.from({ length: count }, (_, i) => /* @__PURE__ */ jsx35(
|
|
7402
7437
|
"div",
|
|
7403
7438
|
{
|
|
7404
7439
|
className: "flex items-center border-b border-ods-border bg-ods-bg py-3 pl-4 pr-2 last:border-b-0",
|
|
7405
|
-
children: /* @__PURE__ */
|
|
7440
|
+
children: /* @__PURE__ */ jsx35(Skeleton, { className: "h-5 w-1/2" })
|
|
7406
7441
|
},
|
|
7407
7442
|
`ctx-skeleton-${i}`
|
|
7408
7443
|
)) });
|
|
@@ -7418,7 +7453,7 @@ function ContextItemsList({
|
|
|
7418
7453
|
emptyLabel = "No results",
|
|
7419
7454
|
className
|
|
7420
7455
|
}) {
|
|
7421
|
-
const onScroll =
|
|
7456
|
+
const onScroll = React13.useCallback(
|
|
7422
7457
|
(e) => {
|
|
7423
7458
|
if (!hasMore || loadingMore || !onLoadMore) return;
|
|
7424
7459
|
const el = e.currentTarget;
|
|
@@ -7427,7 +7462,7 @@ function ContextItemsList({
|
|
|
7427
7462
|
[hasMore, loadingMore, onLoadMore]
|
|
7428
7463
|
);
|
|
7429
7464
|
if (items.length === 0 && !loadingMore) {
|
|
7430
|
-
return /* @__PURE__ */
|
|
7465
|
+
return /* @__PURE__ */ jsx35("div", { className: CONTEXT_STATE_CLASS, children: emptyLabel });
|
|
7431
7466
|
}
|
|
7432
7467
|
return /* @__PURE__ */ jsxs25(
|
|
7433
7468
|
"div",
|
|
@@ -7439,7 +7474,7 @@ function ContextItemsList({
|
|
|
7439
7474
|
children: [
|
|
7440
7475
|
items.map((item) => {
|
|
7441
7476
|
const selected = selectedKeys.has(itemKey(item));
|
|
7442
|
-
return /* @__PURE__ */
|
|
7477
|
+
return /* @__PURE__ */ jsx35(
|
|
7443
7478
|
ContextMenuRow,
|
|
7444
7479
|
{
|
|
7445
7480
|
role: "option",
|
|
@@ -7448,17 +7483,17 @@ function ContextItemsList({
|
|
|
7448
7483
|
onClick: () => onToggle(item),
|
|
7449
7484
|
label: item.label,
|
|
7450
7485
|
title: !selected && atLimit ? "Selection limit reached" : void 0,
|
|
7451
|
-
trailing: selected ? /* @__PURE__ */
|
|
7486
|
+
trailing: selected ? /* @__PURE__ */ jsx35(CheckFillIcon, { className: "size-4 shrink-0 text-ods-accent md:size-6" }) : void 0
|
|
7452
7487
|
},
|
|
7453
7488
|
itemKey(item)
|
|
7454
7489
|
);
|
|
7455
7490
|
}),
|
|
7456
|
-
loadingMore && /* @__PURE__ */
|
|
7491
|
+
loadingMore && /* @__PURE__ */ jsx35(ContextItemsSkeleton, { count: 3 })
|
|
7457
7492
|
]
|
|
7458
7493
|
}
|
|
7459
7494
|
);
|
|
7460
7495
|
}
|
|
7461
|
-
var ContextErrorBoundary = class extends
|
|
7496
|
+
var ContextErrorBoundary = class extends React13.Component {
|
|
7462
7497
|
constructor() {
|
|
7463
7498
|
super(...arguments);
|
|
7464
7499
|
this.state = { errored: false };
|
|
@@ -7481,7 +7516,7 @@ var ContextErrorBoundary = class extends React12.Component {
|
|
|
7481
7516
|
};
|
|
7482
7517
|
|
|
7483
7518
|
// src/components/chat/chat-context-picker.tsx
|
|
7484
|
-
import { Fragment as Fragment9, jsx as
|
|
7519
|
+
import { Fragment as Fragment9, jsx as jsx36, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
7485
7520
|
var CHAT_CONTEXT_ITEMS_DEFAULT_MAX = 10;
|
|
7486
7521
|
var ITEMS_SKELETON_ROWS = 10;
|
|
7487
7522
|
var SEARCH_DEBOUNCE_MS = 300;
|
|
@@ -7496,7 +7531,7 @@ function ChatComposerPlusMenu({
|
|
|
7496
7531
|
// `relative` so the dropdown anchors to the button itself (bottom-full),
|
|
7497
7532
|
// aligning the popover to the `+` rather than the input row.
|
|
7498
7533
|
/* @__PURE__ */ jsxs26("span", { className: "relative inline-flex", children: [
|
|
7499
|
-
/* @__PURE__ */
|
|
7534
|
+
/* @__PURE__ */ jsx36(
|
|
7500
7535
|
"button",
|
|
7501
7536
|
{
|
|
7502
7537
|
type: "button",
|
|
@@ -7511,7 +7546,7 @@ function ChatComposerPlusMenu({
|
|
|
7511
7546
|
open ? "text-ods-accent" : "text-ods-text-secondary hover:text-ods-text-primary active:text-ods-accent",
|
|
7512
7547
|
"focus-visible:text-ods-text-primary disabled:cursor-not-allowed disabled:opacity-40"
|
|
7513
7548
|
),
|
|
7514
|
-
children: /* @__PURE__ */
|
|
7549
|
+
children: /* @__PURE__ */ jsx36(PlusIcon, { className: "h-6 w-6" })
|
|
7515
7550
|
}
|
|
7516
7551
|
),
|
|
7517
7552
|
dropdown
|
|
@@ -7613,7 +7648,7 @@ function ChatContextPicker({
|
|
|
7613
7648
|
[config.entityTypes, typeFilter]
|
|
7614
7649
|
);
|
|
7615
7650
|
if (!open) return null;
|
|
7616
|
-
return /* @__PURE__ */
|
|
7651
|
+
return /* @__PURE__ */ jsx36(
|
|
7617
7652
|
"div",
|
|
7618
7653
|
{
|
|
7619
7654
|
ref: rootRef,
|
|
@@ -7637,15 +7672,15 @@ function ChatContextPicker({
|
|
|
7637
7672
|
children: view === "root" ? (
|
|
7638
7673
|
/* Level 0 — Upload File / Assign Item (Figma 31:28312). */
|
|
7639
7674
|
/* @__PURE__ */ jsxs26("div", { role: "menu", "aria-label": "Add context", children: [
|
|
7640
|
-
config.onUploadFile && /* @__PURE__ */
|
|
7675
|
+
config.onUploadFile && /* @__PURE__ */ jsx36(
|
|
7641
7676
|
ContextMenuRow,
|
|
7642
7677
|
{
|
|
7643
|
-
icon: /* @__PURE__ */
|
|
7678
|
+
icon: /* @__PURE__ */ jsx36(Upload02Icon, { size: 24 }),
|
|
7644
7679
|
label: "Upload File",
|
|
7645
7680
|
onClick: () => config.onUploadFile?.()
|
|
7646
7681
|
}
|
|
7647
7682
|
),
|
|
7648
|
-
/* @__PURE__ */
|
|
7683
|
+
/* @__PURE__ */ jsx36(ContextMenuRow, { icon: /* @__PURE__ */ jsx36(PackagePlusIcon, { size: 24 }), label: "Assign Item", onClick: () => setView("types") })
|
|
7649
7684
|
] })
|
|
7650
7685
|
) : view === "types" ? (
|
|
7651
7686
|
/* Level 1 — Back + entity-type list (Figma 31:28708). Back stays pinned;
|
|
@@ -7658,23 +7693,23 @@ function ChatContextPicker({
|
|
|
7658
7693
|
onClick: () => setView("root"),
|
|
7659
7694
|
className: cn(CONTEXT_BACK_CLASS, "sticky top-0 z-10"),
|
|
7660
7695
|
children: [
|
|
7661
|
-
/* @__PURE__ */
|
|
7662
|
-
/* @__PURE__ */
|
|
7696
|
+
/* @__PURE__ */ jsx36(Chevron02LeftIcon, { size: 24, className: "shrink-0" }),
|
|
7697
|
+
/* @__PURE__ */ jsx36("span", { className: "truncate", children: "Back" })
|
|
7663
7698
|
]
|
|
7664
7699
|
}
|
|
7665
7700
|
),
|
|
7666
|
-
visibleTypes.length === 0 ? /* @__PURE__ */
|
|
7701
|
+
visibleTypes.length === 0 ? /* @__PURE__ */ jsx36("div", { className: CONTEXT_STATE_CLASS, children: "No matching types" }) : visibleTypes.map((type) => /* @__PURE__ */ jsx36(ContextMenuRow, { icon: type.icon, label: type.label, onClick: () => openType(type) }, type.type))
|
|
7667
7702
|
] })
|
|
7668
7703
|
) : activeType ? (
|
|
7669
7704
|
/* Level 2 — Back + search + HOST-rendered items (Figma 31:29102). */
|
|
7670
7705
|
/* @__PURE__ */ jsxs26(Fragment9, { children: [
|
|
7671
7706
|
/* @__PURE__ */ jsxs26("button", { type: "button", onClick: backToTypes, className: cn(CONTEXT_BACK_CLASS, "sticky top-0 z-10"), children: [
|
|
7672
|
-
/* @__PURE__ */
|
|
7673
|
-
/* @__PURE__ */
|
|
7707
|
+
/* @__PURE__ */ jsx36(Chevron02LeftIcon, { size: 24, className: "shrink-0" }),
|
|
7708
|
+
/* @__PURE__ */ jsx36("span", { className: "truncate", children: "Back" })
|
|
7674
7709
|
] }),
|
|
7675
7710
|
/* @__PURE__ */ jsxs26("div", { className: "flex shrink-0 items-center gap-2 border-b border-ods-border bg-ods-card p-3", children: [
|
|
7676
|
-
/* @__PURE__ */
|
|
7677
|
-
/* @__PURE__ */
|
|
7711
|
+
/* @__PURE__ */ jsx36(SearchIcon, { className: "size-4 shrink-0 text-ods-text-secondary md:size-6" }),
|
|
7712
|
+
/* @__PURE__ */ jsx36(
|
|
7678
7713
|
"input",
|
|
7679
7714
|
{
|
|
7680
7715
|
ref: searchRef,
|
|
@@ -7685,13 +7720,13 @@ function ChatContextPicker({
|
|
|
7685
7720
|
}
|
|
7686
7721
|
)
|
|
7687
7722
|
] }),
|
|
7688
|
-
/* @__PURE__ */
|
|
7723
|
+
/* @__PURE__ */ jsx36(QueryErrorResetBoundary, { children: ({ reset }) => /* @__PURE__ */ jsx36(
|
|
7689
7724
|
ContextErrorBoundary,
|
|
7690
7725
|
{
|
|
7691
7726
|
resetKey: `${activeType.type}:${debouncedQuery}`,
|
|
7692
7727
|
fallback: (retry) => /* @__PURE__ */ jsxs26("div", { className: "flex items-center justify-between gap-2 bg-ods-bg px-4 py-3 text-h4 text-ods-attention-red-error", children: [
|
|
7693
|
-
/* @__PURE__ */
|
|
7694
|
-
/* @__PURE__ */
|
|
7728
|
+
/* @__PURE__ */ jsx36("span", { children: "Failed to load" }),
|
|
7729
|
+
/* @__PURE__ */ jsx36(
|
|
7695
7730
|
"button",
|
|
7696
7731
|
{
|
|
7697
7732
|
type: "button",
|
|
@@ -7704,10 +7739,10 @@ function ChatContextPicker({
|
|
|
7704
7739
|
}
|
|
7705
7740
|
)
|
|
7706
7741
|
] }),
|
|
7707
|
-
children: /* @__PURE__ */
|
|
7742
|
+
children: /* @__PURE__ */ jsx36(
|
|
7708
7743
|
Suspense,
|
|
7709
7744
|
{
|
|
7710
|
-
fallback: /* @__PURE__ */
|
|
7745
|
+
fallback: /* @__PURE__ */ jsx36("div", { className: "max-h-[340px] overflow-hidden", children: /* @__PURE__ */ jsx36(ContextItemsSkeleton, { count: ITEMS_SKELETON_ROWS }) }),
|
|
7711
7746
|
children: config.renderItems({
|
|
7712
7747
|
type: activeType.type,
|
|
7713
7748
|
query: debouncedQuery,
|
|
@@ -7736,9 +7771,9 @@ function ChatContextChipStrip({
|
|
|
7736
7771
|
return (
|
|
7737
7772
|
// `tag` pills (Figma 1:6073): 32px tall, card surface, bordered, mono-
|
|
7738
7773
|
// uppercase label, 16px lead icon + xmark-circle remove. Wraps to new rows.
|
|
7739
|
-
/* @__PURE__ */
|
|
7774
|
+
/* @__PURE__ */ jsx36("div", { className: cn("flex flex-wrap content-center items-center gap-2", className), children: items.map((item) => {
|
|
7740
7775
|
const hostNode = renderItem?.(item);
|
|
7741
|
-
if (hostNode != null) return /* @__PURE__ */
|
|
7776
|
+
if (hostNode != null) return /* @__PURE__ */ jsx36(Fragment8, { children: hostNode }, itemKey2(item));
|
|
7742
7777
|
return /* @__PURE__ */ jsxs26(
|
|
7743
7778
|
"div",
|
|
7744
7779
|
{
|
|
@@ -7746,8 +7781,8 @@ function ChatContextChipStrip({
|
|
|
7746
7781
|
role: "group",
|
|
7747
7782
|
"aria-label": `Context ${item.label}`,
|
|
7748
7783
|
children: [
|
|
7749
|
-
resolveIcon2 && /* @__PURE__ */
|
|
7750
|
-
/* @__PURE__ */
|
|
7784
|
+
resolveIcon2 && /* @__PURE__ */ jsx36("span", { className: "flex size-4 shrink-0 items-center justify-center text-ods-text-secondary [&_svg]:size-4", children: resolveIcon2(item) }),
|
|
7785
|
+
/* @__PURE__ */ jsx36(
|
|
7751
7786
|
"span",
|
|
7752
7787
|
{
|
|
7753
7788
|
className: "max-w-[220px] truncate font-mono text-h5 font-medium uppercase tracking-[-0.28px] text-ods-text-primary",
|
|
@@ -7755,7 +7790,7 @@ function ChatContextChipStrip({
|
|
|
7755
7790
|
children: item.label
|
|
7756
7791
|
}
|
|
7757
7792
|
),
|
|
7758
|
-
onRemove && /* @__PURE__ */
|
|
7793
|
+
onRemove && /* @__PURE__ */ jsx36(
|
|
7759
7794
|
"button",
|
|
7760
7795
|
{
|
|
7761
7796
|
type: "button",
|
|
@@ -7763,7 +7798,7 @@ function ChatContextChipStrip({
|
|
|
7763
7798
|
disabled,
|
|
7764
7799
|
"aria-label": `Remove ${item.label}`,
|
|
7765
7800
|
className: "flex size-4 shrink-0 items-center justify-center text-ods-text-secondary outline-none transition-colors hover:text-ods-text-primary focus-visible:text-ods-text-primary disabled:cursor-not-allowed disabled:opacity-40 [&_svg]:size-4",
|
|
7766
|
-
children: /* @__PURE__ */
|
|
7801
|
+
children: /* @__PURE__ */ jsx36(XmarkCircleIcon, { size: 16 })
|
|
7767
7802
|
}
|
|
7768
7803
|
)
|
|
7769
7804
|
]
|
|
@@ -7775,7 +7810,7 @@ function ChatContextChipStrip({
|
|
|
7775
7810
|
}
|
|
7776
7811
|
|
|
7777
7812
|
// src/components/chat/chat-message-enhanced.tsx
|
|
7778
|
-
import { Fragment as Fragment10, jsx as
|
|
7813
|
+
import { Fragment as Fragment10, jsx as jsx37, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
7779
7814
|
var MENTION_MARKER_REGEX = /(^|[^\w@])@[a-zA-Z]+:([A-Za-z0-9_.+/=-]*[A-Za-z0-9_+/=])/g;
|
|
7780
7815
|
var CARD_MARKER_REGEX = /\[card:\/\/([a-zA-Z0-9_-]+):([a-zA-Z0-9_-]+)[\])]/g;
|
|
7781
7816
|
function formatMessageTimestamp(timestamp) {
|
|
@@ -7805,7 +7840,7 @@ function groupAskRuns(segments) {
|
|
|
7805
7840
|
});
|
|
7806
7841
|
return runs;
|
|
7807
7842
|
}
|
|
7808
|
-
var ChatMessageEnhanced =
|
|
7843
|
+
var ChatMessageEnhanced = forwardRef18(
|
|
7809
7844
|
({ className, role, content, name, avatar, isTyping = false, timestamp, showAvatar = true, assistantType, approvalVariant, authorType: authorTypeProp, assistantIcon, contextItems, resolveContextIcon, renderContextItem, renderMention, renderEntityCard, onAskSelect, NavLinkAnchor, ...props }, ref) => {
|
|
7810
7845
|
const isUser = role === "user";
|
|
7811
7846
|
const isError = role === "error";
|
|
@@ -7870,7 +7905,7 @@ var ChatMessageEnhanced = forwardRef17(
|
|
|
7870
7905
|
cache.set(key, entry);
|
|
7871
7906
|
}
|
|
7872
7907
|
const rendered = entry.node;
|
|
7873
|
-
if (
|
|
7908
|
+
if (React14.isValidElement(rendered) && rendered.type === BlockCard) {
|
|
7874
7909
|
const props2 = rendered.props;
|
|
7875
7910
|
const markerEnd = match2.index + match2[0].length;
|
|
7876
7911
|
parts.push({ kind: "text", text: text.slice(cursor, markerEnd) });
|
|
@@ -7881,7 +7916,7 @@ var ChatMessageEnhanced = forwardRef17(
|
|
|
7881
7916
|
cursor = markerEnd;
|
|
7882
7917
|
inlineByKey.set(
|
|
7883
7918
|
key,
|
|
7884
|
-
props2.inline != null ? props2.inline : /* @__PURE__ */
|
|
7919
|
+
props2.inline != null ? props2.inline : /* @__PURE__ */ jsx37("span", { className: "text-ods-text-primary font-medium", children: cardId })
|
|
7885
7920
|
);
|
|
7886
7921
|
} else if (rendered != null) {
|
|
7887
7922
|
parts.push({ kind: "text", text: text.slice(cursor, match2.index) });
|
|
@@ -7927,8 +7962,8 @@ var ChatMessageEnhanced = forwardRef17(
|
|
|
7927
7962
|
const marker = sepIdx === -1 ? stripped : stripped.slice(0, sepIdx);
|
|
7928
7963
|
const id = sepIdx === -1 ? "" : stripped.slice(sepIdx + 1);
|
|
7929
7964
|
const node = renderMention?.({ marker, id });
|
|
7930
|
-
if (node != null) return /* @__PURE__ */
|
|
7931
|
-
return /* @__PURE__ */
|
|
7965
|
+
if (node != null) return /* @__PURE__ */ jsx37(Fragment10, { children: node });
|
|
7966
|
+
return /* @__PURE__ */ jsx37("span", { className: "text-ods-text-secondary opacity-60", children });
|
|
7932
7967
|
}
|
|
7933
7968
|
if (typeof href === "string" && href.startsWith("card://")) {
|
|
7934
7969
|
const stripped = href.slice("card://".length);
|
|
@@ -7939,20 +7974,20 @@ var ChatMessageEnhanced = forwardRef17(
|
|
|
7939
7974
|
const key = `${cardType}:${cardId}`;
|
|
7940
7975
|
const inline = renderingPlanRef.current?.inlineByKey.get(key);
|
|
7941
7976
|
if (inline != null) return inline;
|
|
7942
|
-
return /* @__PURE__ */
|
|
7977
|
+
return /* @__PURE__ */ jsx37("span", { className: "text-ods-text-secondary opacity-60", children: cardId });
|
|
7943
7978
|
}
|
|
7944
7979
|
}
|
|
7945
7980
|
if (typeof href === "string" && NavLinkAnchor && !href.startsWith("#")) {
|
|
7946
|
-
return /* @__PURE__ */
|
|
7981
|
+
return /* @__PURE__ */ jsx37(NavLinkAnchor, { href, className: linkClassName, ...rest, children });
|
|
7947
7982
|
}
|
|
7948
|
-
return /* @__PURE__ */
|
|
7983
|
+
return /* @__PURE__ */ jsx37("a", { href, className: linkClassName, ...rest, children });
|
|
7949
7984
|
}
|
|
7950
7985
|
};
|
|
7951
7986
|
}, [hasMarkerSupport, hasMentionSupport, renderMention, NavLinkAnchor]);
|
|
7952
7987
|
const renderSegmentBody = (segIndex, text, isStreaming) => {
|
|
7953
7988
|
const parts = renderingPlan?.partsBySegment.get(segIndex);
|
|
7954
7989
|
if (!parts || parts.length === 0) {
|
|
7955
|
-
return /* @__PURE__ */
|
|
7990
|
+
return /* @__PURE__ */ jsx37(
|
|
7956
7991
|
SimpleMarkdownRenderer,
|
|
7957
7992
|
{
|
|
7958
7993
|
content: text,
|
|
@@ -7965,7 +8000,7 @@ var ChatMessageEnhanced = forwardRef17(
|
|
|
7965
8000
|
}
|
|
7966
8001
|
return parts.map((part, pIdx) => {
|
|
7967
8002
|
if (part.kind === "text") {
|
|
7968
|
-
return /* @__PURE__ */
|
|
8003
|
+
return /* @__PURE__ */ jsx37(
|
|
7969
8004
|
SimpleMarkdownRenderer,
|
|
7970
8005
|
{
|
|
7971
8006
|
content: part.text,
|
|
@@ -7977,7 +8012,7 @@ var ChatMessageEnhanced = forwardRef17(
|
|
|
7977
8012
|
`t-${pIdx}`
|
|
7978
8013
|
);
|
|
7979
8014
|
}
|
|
7980
|
-
return /* @__PURE__ */
|
|
8015
|
+
return /* @__PURE__ */ jsx37("div", { className: "my-3", children: part.node }, `b-${part.key}`);
|
|
7981
8016
|
});
|
|
7982
8017
|
};
|
|
7983
8018
|
const getAvatarProps = () => {
|
|
@@ -8005,7 +8040,7 @@ var ChatMessageEnhanced = forwardRef17(
|
|
|
8005
8040
|
};
|
|
8006
8041
|
const avatarProps = getAvatarProps();
|
|
8007
8042
|
const isSystem = authorType === "system";
|
|
8008
|
-
return /* @__PURE__ */
|
|
8043
|
+
return /* @__PURE__ */ jsx37(
|
|
8009
8044
|
"div",
|
|
8010
8045
|
{
|
|
8011
8046
|
ref,
|
|
@@ -8019,8 +8054,8 @@ var ChatMessageEnhanced = forwardRef17(
|
|
|
8019
8054
|
showAvatar && !isSystem && !(isUser && !avatar) && (!isUser && assistantIcon && !avatar ? (
|
|
8020
8055
|
// Host-supplied brand icon (e.g. Mingo): render it directly,
|
|
8021
8056
|
// no filled pill — the icon carries its own brand accent.
|
|
8022
|
-
/* @__PURE__ */
|
|
8023
|
-
) : /* @__PURE__ */
|
|
8057
|
+
/* @__PURE__ */ jsx37("div", { className: "flex items-center justify-center flex-shrink-0", children: assistantIcon })
|
|
8058
|
+
) : /* @__PURE__ */ jsx37(SquareAvatar, { ...avatarProps })),
|
|
8024
8059
|
/* @__PURE__ */ jsxs27("span", { className: cn(
|
|
8025
8060
|
"text-h3 !font-mono !font-medium flex-1",
|
|
8026
8061
|
authorType === "system" ? "text-ods-open-yellow" : authorType === "admin" ? "text-ods-open-yellow" : authorType === "mingo" ? "text-ods-flamingo-cyan" : authorType === "fae" ? "text-ods-flamingo-pink" : "text-ods-text-secondary"
|
|
@@ -8028,12 +8063,12 @@ var ChatMessageEnhanced = forwardRef17(
|
|
|
8028
8063
|
name || (isUser ? "User" : assistantType === "mingo" ? "Mingo" : "Fae"),
|
|
8029
8064
|
!isSystem && ":"
|
|
8030
8065
|
] }),
|
|
8031
|
-
timestamp && /* @__PURE__ */
|
|
8066
|
+
timestamp && /* @__PURE__ */ jsx37("span", { className: "text-h6 text-ods-text-secondary shrink-0 whitespace-nowrap", children: formatMessageTimestamp(timestamp) })
|
|
8032
8067
|
] }),
|
|
8033
|
-
(!isSystem || segments.length > 0) && /* @__PURE__ */
|
|
8068
|
+
(!isSystem || segments.length > 0) && /* @__PURE__ */ jsx37("div", { className: "flex flex-col gap-2", children: segments.map((segment, index) => {
|
|
8034
8069
|
const segmentIsStreaming = index === segments.length - 1 && !!isTyping;
|
|
8035
8070
|
if (segment.type === "text") {
|
|
8036
|
-
return /* @__PURE__ */
|
|
8071
|
+
return /* @__PURE__ */ jsx37(
|
|
8037
8072
|
"div",
|
|
8038
8073
|
{
|
|
8039
8074
|
className: cn(
|
|
@@ -8045,13 +8080,13 @@ var ChatMessageEnhanced = forwardRef17(
|
|
|
8045
8080
|
index
|
|
8046
8081
|
);
|
|
8047
8082
|
} else if (segment.type === "guide") {
|
|
8048
|
-
return /* @__PURE__ */
|
|
8083
|
+
return /* @__PURE__ */ jsx37(GuideDisplay, { children: renderSegmentBody(index, segment.text, segmentIsStreaming) }, index);
|
|
8049
8084
|
} else if (segment.type === "ask") {
|
|
8050
8085
|
const run = askRuns.get(index);
|
|
8051
8086
|
if (!run) return null;
|
|
8052
|
-
return /* @__PURE__ */
|
|
8087
|
+
return /* @__PURE__ */ jsx37(AskDisplay, { cards: run, onSelect: onAskSelect }, index);
|
|
8053
8088
|
} else if (segment.type === "tool_execution") {
|
|
8054
|
-
return /* @__PURE__ */
|
|
8089
|
+
return /* @__PURE__ */ jsx37(
|
|
8055
8090
|
ToolExecutionDisplay,
|
|
8056
8091
|
{
|
|
8057
8092
|
message: segment.data,
|
|
@@ -8061,7 +8096,7 @@ var ChatMessageEnhanced = forwardRef17(
|
|
|
8061
8096
|
index
|
|
8062
8097
|
);
|
|
8063
8098
|
} else if (segment.type === "approval_request") {
|
|
8064
|
-
return /* @__PURE__ */
|
|
8099
|
+
return /* @__PURE__ */ jsx37(
|
|
8065
8100
|
ApprovalRequestMessage,
|
|
8066
8101
|
{
|
|
8067
8102
|
data: segment.data,
|
|
@@ -8075,7 +8110,7 @@ var ChatMessageEnhanced = forwardRef17(
|
|
|
8075
8110
|
index
|
|
8076
8111
|
);
|
|
8077
8112
|
} else if (segment.type === "approval_batch") {
|
|
8078
|
-
return /* @__PURE__ */
|
|
8113
|
+
return /* @__PURE__ */ jsx37(
|
|
8079
8114
|
ApprovalBatchMessage,
|
|
8080
8115
|
{
|
|
8081
8116
|
data: segment.data,
|
|
@@ -8089,7 +8124,7 @@ var ChatMessageEnhanced = forwardRef17(
|
|
|
8089
8124
|
index
|
|
8090
8125
|
);
|
|
8091
8126
|
} else if (segment.type === "escalation_offer") {
|
|
8092
|
-
return /* @__PURE__ */
|
|
8127
|
+
return /* @__PURE__ */ jsx37(
|
|
8093
8128
|
EscalationOfferMessage,
|
|
8094
8129
|
{
|
|
8095
8130
|
data: segment.data,
|
|
@@ -8101,11 +8136,11 @@ var ChatMessageEnhanced = forwardRef17(
|
|
|
8101
8136
|
index
|
|
8102
8137
|
);
|
|
8103
8138
|
} else if (segment.type === "ticket_escalated") {
|
|
8104
|
-
return /* @__PURE__ */
|
|
8139
|
+
return /* @__PURE__ */ jsx37(TicketEscalatedMessage, { data: segment.data, timestamp }, index);
|
|
8105
8140
|
} else if (segment.type === "ticket_event") {
|
|
8106
|
-
return /* @__PURE__ */
|
|
8141
|
+
return /* @__PURE__ */ jsx37(TicketEventMessage, { data: segment.data, timestamp }, index);
|
|
8107
8142
|
} else if (segment.type === "error") {
|
|
8108
|
-
return /* @__PURE__ */
|
|
8143
|
+
return /* @__PURE__ */ jsx37(
|
|
8109
8144
|
ErrorMessageDisplay,
|
|
8110
8145
|
{
|
|
8111
8146
|
title: segment.title,
|
|
@@ -8114,7 +8149,7 @@ var ChatMessageEnhanced = forwardRef17(
|
|
|
8114
8149
|
index
|
|
8115
8150
|
);
|
|
8116
8151
|
} else if (segment.type === "context_compaction") {
|
|
8117
|
-
return /* @__PURE__ */
|
|
8152
|
+
return /* @__PURE__ */ jsx37(
|
|
8118
8153
|
ContextCompactionDisplay,
|
|
8119
8154
|
{
|
|
8120
8155
|
status: segment.status
|
|
@@ -8123,7 +8158,7 @@ var ChatMessageEnhanced = forwardRef17(
|
|
|
8123
8158
|
);
|
|
8124
8159
|
} else if (segment.type === "thinking") {
|
|
8125
8160
|
const isStreaming = index === segments.length - 1 && isTyping;
|
|
8126
|
-
return /* @__PURE__ */
|
|
8161
|
+
return /* @__PURE__ */ jsx37(
|
|
8127
8162
|
ThinkingDisplay,
|
|
8128
8163
|
{
|
|
8129
8164
|
text: segment.text,
|
|
@@ -8134,7 +8169,7 @@ var ChatMessageEnhanced = forwardRef17(
|
|
|
8134
8169
|
}
|
|
8135
8170
|
return null;
|
|
8136
8171
|
}) }),
|
|
8137
|
-
stripContextItems && stripContextItems.length > 0 && /* @__PURE__ */
|
|
8172
|
+
stripContextItems && stripContextItems.length > 0 && /* @__PURE__ */ jsx37(
|
|
8138
8173
|
ChatContextChipStrip,
|
|
8139
8174
|
{
|
|
8140
8175
|
items: stripContextItems,
|
|
@@ -8163,12 +8198,12 @@ MemoizedChatMessageEnhanced.displayName = "MemoizedChatMessageEnhanced";
|
|
|
8163
8198
|
|
|
8164
8199
|
// src/components/chat/chat-message-list.tsx
|
|
8165
8200
|
init_cn();
|
|
8166
|
-
import { useRef as useRef10, useState as useState14, useCallback as useCallback6, useEffect as useEffect10, useLayoutEffect as useLayoutEffect4, useImperativeHandle as useImperativeHandle2, useMemo as useMemo12, forwardRef as
|
|
8201
|
+
import { useRef as useRef10, useState as useState14, useCallback as useCallback6, useEffect as useEffect10, useLayoutEffect as useLayoutEffect4, useImperativeHandle as useImperativeHandle2, useMemo as useMemo12, forwardRef as forwardRef19 } from "react";
|
|
8167
8202
|
import { useStickToBottom } from "use-stick-to-bottom";
|
|
8168
8203
|
|
|
8169
8204
|
// src/components/chat/chat-message-skeleton.tsx
|
|
8170
8205
|
init_cn();
|
|
8171
|
-
import { jsx as
|
|
8206
|
+
import { jsx as jsx38, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
8172
8207
|
var BODY_LINE_WIDTHS = ["w-full", "w-11/12", "w-4/5", "w-5/6"];
|
|
8173
8208
|
var bodyLineWidth = (index, total) => index === total - 1 ? "w-3/5" : BODY_LINE_WIDTHS[index % BODY_LINE_WIDTHS.length];
|
|
8174
8209
|
function ChatMessageSkeleton({
|
|
@@ -8178,13 +8213,13 @@ function ChatMessageSkeleton({
|
|
|
8178
8213
|
bodyLines = 3
|
|
8179
8214
|
}) {
|
|
8180
8215
|
const lines = Math.max(1, bodyLines);
|
|
8181
|
-
return /* @__PURE__ */
|
|
8216
|
+
return /* @__PURE__ */ jsx38("div", { className: cn("relative py-[var(--spacing-system-s)]", className), children: /* @__PURE__ */ jsxs28("div", { className: "flex min-w-0 flex-col gap-[var(--spacing-system-xxs)]", children: [
|
|
8182
8217
|
/* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-[var(--spacing-system-xs)]", children: [
|
|
8183
|
-
showAvatar && !isUser && /* @__PURE__ */
|
|
8184
|
-
/* @__PURE__ */
|
|
8185
|
-
/* @__PURE__ */
|
|
8218
|
+
showAvatar && !isUser && /* @__PURE__ */ jsx38("div", { className: "h-8 w-8 flex-shrink-0 rounded-full bg-ods-border animate-pulse" }),
|
|
8219
|
+
/* @__PURE__ */ jsx38("div", { className: "h-5 w-32 rounded bg-ods-border animate-pulse" }),
|
|
8220
|
+
/* @__PURE__ */ jsx38("div", { className: "ml-auto h-4 w-14 rounded bg-ods-border animate-pulse" })
|
|
8186
8221
|
] }),
|
|
8187
|
-
/* @__PURE__ */
|
|
8222
|
+
/* @__PURE__ */ jsx38("div", { className: "flex flex-col gap-2 pt-[var(--spacing-system-xxs)]", children: Array.from({ length: lines }, (_, i) => /* @__PURE__ */ jsx38(
|
|
8188
8223
|
"div",
|
|
8189
8224
|
{
|
|
8190
8225
|
className: cn("h-4 rounded bg-ods-border animate-pulse", bodyLineWidth(i, lines))
|
|
@@ -8206,7 +8241,7 @@ function ChatMessageListSkeleton({
|
|
|
8206
8241
|
id: index,
|
|
8207
8242
|
isUser: index % 3 === 0
|
|
8208
8243
|
}));
|
|
8209
|
-
return /* @__PURE__ */
|
|
8244
|
+
return /* @__PURE__ */ jsx38("div", { className: "relative flex-1 min-h-0 flex flex-col", children: /* @__PURE__ */ jsx38(
|
|
8210
8245
|
"div",
|
|
8211
8246
|
{
|
|
8212
8247
|
className: cn(
|
|
@@ -8223,8 +8258,8 @@ function ChatMessageListSkeleton({
|
|
|
8223
8258
|
),
|
|
8224
8259
|
style: fill ? void 0 : { minHeight: "100%" },
|
|
8225
8260
|
children: [
|
|
8226
|
-
!fill && /* @__PURE__ */
|
|
8227
|
-
messages.map((message2) => /* @__PURE__ */
|
|
8261
|
+
!fill && /* @__PURE__ */ jsx38("div", { className: "flex-1" }),
|
|
8262
|
+
messages.map((message2) => /* @__PURE__ */ jsx38(
|
|
8228
8263
|
ChatMessageSkeleton,
|
|
8229
8264
|
{
|
|
8230
8265
|
showAvatar: showAvatars,
|
|
@@ -8243,7 +8278,7 @@ function ChatMessageListSkeleton({
|
|
|
8243
8278
|
// src/components/chat/cycling-phrase.tsx
|
|
8244
8279
|
init_cn();
|
|
8245
8280
|
import { useEffect as useEffect9, useMemo as useMemo11, useState as useState13 } from "react";
|
|
8246
|
-
import { jsx as
|
|
8281
|
+
import { jsx as jsx39, jsxs as jsxs29 } from "react/jsx-runtime";
|
|
8247
8282
|
var BLINK_KEYFRAMES = `
|
|
8248
8283
|
@keyframes cyclingCursorBlink {
|
|
8249
8284
|
50% { opacity: 0; }
|
|
@@ -8295,7 +8330,7 @@ function CyclingPhrase({
|
|
|
8295
8330
|
if (words.length === 0) return null;
|
|
8296
8331
|
const before = text.slice(0, cursor);
|
|
8297
8332
|
const after = text.slice(cursor);
|
|
8298
|
-
const cursorBlock = /* @__PURE__ */
|
|
8333
|
+
const cursorBlock = /* @__PURE__ */ jsx39(
|
|
8299
8334
|
"span",
|
|
8300
8335
|
{
|
|
8301
8336
|
"aria-hidden": true,
|
|
@@ -8311,22 +8346,22 @@ function CyclingPhrase({
|
|
|
8311
8346
|
}
|
|
8312
8347
|
);
|
|
8313
8348
|
return /* @__PURE__ */ jsxs29("span", { className: cn("relative inline-block whitespace-nowrap", className), children: [
|
|
8314
|
-
/* @__PURE__ */
|
|
8349
|
+
/* @__PURE__ */ jsx39("style", { dangerouslySetInnerHTML: { __html: BLINK_KEYFRAMES } }),
|
|
8315
8350
|
/* @__PURE__ */ jsxs29("span", { "aria-hidden": true, className: "invisible", children: [
|
|
8316
8351
|
placeholder,
|
|
8317
8352
|
"..."
|
|
8318
8353
|
] }),
|
|
8319
8354
|
/* @__PURE__ */ jsxs29("span", { className: "absolute inset-0 inline-flex items-baseline", "aria-live": "polite", children: [
|
|
8320
|
-
/* @__PURE__ */
|
|
8355
|
+
/* @__PURE__ */ jsx39("span", { children: before }),
|
|
8321
8356
|
!holding && cursorBlock,
|
|
8322
|
-
/* @__PURE__ */
|
|
8323
|
-
/* @__PURE__ */
|
|
8357
|
+
/* @__PURE__ */ jsx39("span", { children: after }),
|
|
8358
|
+
/* @__PURE__ */ jsx39("span", { children: "..." })
|
|
8324
8359
|
] })
|
|
8325
8360
|
] });
|
|
8326
8361
|
}
|
|
8327
8362
|
|
|
8328
8363
|
// src/components/chat/chat-message-list.tsx
|
|
8329
|
-
import { jsx as
|
|
8364
|
+
import { jsx as jsx40, jsxs as jsxs30 } from "react/jsx-runtime";
|
|
8330
8365
|
var STREAMING_WORDS = [
|
|
8331
8366
|
"Thinking",
|
|
8332
8367
|
"Vibing",
|
|
@@ -8351,7 +8386,7 @@ function disposeAnchorWatcher(w) {
|
|
|
8351
8386
|
w.ro.disconnect();
|
|
8352
8387
|
clearTimeout(w.timer);
|
|
8353
8388
|
}
|
|
8354
|
-
var ChatMessageList =
|
|
8389
|
+
var ChatMessageList = forwardRef19(
|
|
8355
8390
|
({
|
|
8356
8391
|
className,
|
|
8357
8392
|
messages,
|
|
@@ -8675,7 +8710,7 @@ var ChatMessageList = forwardRef18(
|
|
|
8675
8710
|
[contentRef]
|
|
8676
8711
|
);
|
|
8677
8712
|
if (isLoading) {
|
|
8678
|
-
return /* @__PURE__ */
|
|
8713
|
+
return /* @__PURE__ */ jsx40(
|
|
8679
8714
|
ChatMessageListSkeleton,
|
|
8680
8715
|
{
|
|
8681
8716
|
className,
|
|
@@ -8691,9 +8726,9 @@ var ChatMessageList = forwardRef18(
|
|
|
8691
8726
|
const lastSegment = lastSegments?.[lastSegments.length - 1];
|
|
8692
8727
|
const isPausedOnApproval = !!lastSegment && (lastSegment.type === "approval_request" || lastSegment.type === "approval_batch" || lastSegment.type === "escalation_offer") && (lastSegment.status === void 0 || lastSegment.status === "pending");
|
|
8693
8728
|
const showStreamingLoader = isTyping && !isPausedOnApproval && !(pendingApprovals && pendingApprovals.length > 0);
|
|
8694
|
-
return /* @__PURE__ */
|
|
8729
|
+
return /* @__PURE__ */ jsx40(OverlayOpenRegistryProvider, { onOpenChange: handleOverlayOpenChange, children: /* @__PURE__ */ jsxs30("div", { className: "flex-1 min-h-0 flex flex-col", children: [
|
|
8695
8730
|
/* @__PURE__ */ jsxs30("div", { className: "relative flex-1 min-h-0 flex flex-col", children: [
|
|
8696
|
-
/* @__PURE__ */
|
|
8731
|
+
/* @__PURE__ */ jsx40(
|
|
8697
8732
|
"div",
|
|
8698
8733
|
{
|
|
8699
8734
|
ref: setScrollRef,
|
|
@@ -8725,13 +8760,13 @@ var ChatMessageList = forwardRef18(
|
|
|
8725
8760
|
),
|
|
8726
8761
|
style: { minHeight: "100%" },
|
|
8727
8762
|
children: [
|
|
8728
|
-
hasNextPage && /* @__PURE__ */
|
|
8729
|
-
/* @__PURE__ */
|
|
8763
|
+
hasNextPage && /* @__PURE__ */ jsx40("div", { ref: sentinelRef, className: "h-px" }),
|
|
8764
|
+
/* @__PURE__ */ jsx40("div", { className: "flex-1" }),
|
|
8730
8765
|
messages.map((message2, index) => {
|
|
8731
8766
|
if (message2.hidden) return null;
|
|
8732
8767
|
const isEmptyPendingTurn = index === messages.length - 1 && isTyping && message2.role === "assistant" && !hasNonEmptyContent(message2.content) && (!Array.isArray(message2.content) || message2.content.every((s) => s.type === "text"));
|
|
8733
8768
|
if (isEmptyPendingTurn) return null;
|
|
8734
|
-
return /* @__PURE__ */
|
|
8769
|
+
return /* @__PURE__ */ jsx40(
|
|
8735
8770
|
MemoizedChatMessageEnhanced,
|
|
8736
8771
|
{
|
|
8737
8772
|
ref: getRegisterMessageEl(message2.id),
|
|
@@ -8762,7 +8797,7 @@ var ChatMessageList = forwardRef18(
|
|
|
8762
8797
|
)
|
|
8763
8798
|
}
|
|
8764
8799
|
),
|
|
8765
|
-
autoScroll && !atBottom && messages.length > 0 && /* @__PURE__ */
|
|
8800
|
+
autoScroll && !atBottom && messages.length > 0 && /* @__PURE__ */ jsx40(
|
|
8766
8801
|
"button",
|
|
8767
8802
|
{
|
|
8768
8803
|
type: "button",
|
|
@@ -8777,7 +8812,7 @@ var ChatMessageList = forwardRef18(
|
|
|
8777
8812
|
"bg-ods-card text-ods-text-primary border border-ods-border shadow-lg",
|
|
8778
8813
|
"hover:bg-ods-bg-hover transition-colors"
|
|
8779
8814
|
),
|
|
8780
|
-
children: /* @__PURE__ */
|
|
8815
|
+
children: /* @__PURE__ */ jsx40(Arrow02DownIcon, { size: 16 })
|
|
8781
8816
|
}
|
|
8782
8817
|
)
|
|
8783
8818
|
] }),
|
|
@@ -8792,16 +8827,16 @@ var ChatMessageList = forwardRef18(
|
|
|
8792
8827
|
role: "status",
|
|
8793
8828
|
"aria-live": "polite",
|
|
8794
8829
|
children: [
|
|
8795
|
-
/* @__PURE__ */
|
|
8796
|
-
/* @__PURE__ */
|
|
8830
|
+
/* @__PURE__ */ jsx40(DotsLoaderIcon, { className: "w-6 h-6" }),
|
|
8831
|
+
/* @__PURE__ */ jsx40(CyclingPhrase, { words: STREAMING_WORDS, className: "text-h6" })
|
|
8797
8832
|
]
|
|
8798
8833
|
}
|
|
8799
8834
|
),
|
|
8800
|
-
pendingApprovals && pendingApprovals.length > 0 && /* @__PURE__ */
|
|
8835
|
+
pendingApprovals && pendingApprovals.length > 0 && /* @__PURE__ */ jsx40("div", { className: cn(
|
|
8801
8836
|
"border-t border-ods-border bg-ods-bg/95 backdrop-blur-sm",
|
|
8802
8837
|
fullWidth ? "w-full" : "mx-auto w-full max-w-ods-content-narrow",
|
|
8803
8838
|
contentClassName ?? "px-[var(--spacing-system-m)]"
|
|
8804
|
-
), children: /* @__PURE__ */
|
|
8839
|
+
), children: /* @__PURE__ */ jsx40(
|
|
8805
8840
|
MemoizedChatMessageEnhanced,
|
|
8806
8841
|
{
|
|
8807
8842
|
role: "assistant",
|
|
@@ -8875,7 +8910,7 @@ function useProxiedImageUrl(url) {
|
|
|
8875
8910
|
|
|
8876
8911
|
// src/components/chat/chat-message-row.tsx
|
|
8877
8912
|
import { useState as useState15 } from "react";
|
|
8878
|
-
import { jsx as
|
|
8913
|
+
import { jsx as jsx41, jsxs as jsxs31 } from "react/jsx-runtime";
|
|
8879
8914
|
function ChatMessageRow({
|
|
8880
8915
|
displayName,
|
|
8881
8916
|
avatarUrl,
|
|
@@ -8889,7 +8924,7 @@ function ChatMessageRow({
|
|
|
8889
8924
|
const src = resolvedAvatar && resolvedAvatar !== failedSrc ? resolvedAvatar : void 0;
|
|
8890
8925
|
const hasBody = body.trim().length > 0;
|
|
8891
8926
|
return /* @__PURE__ */ jsxs31("div", { className: "flex gap-2 md:gap-3 w-full min-w-0", children: [
|
|
8892
|
-
src ? /* @__PURE__ */
|
|
8927
|
+
src ? /* @__PURE__ */ jsx41(
|
|
8893
8928
|
next_image_default,
|
|
8894
8929
|
{
|
|
8895
8930
|
src,
|
|
@@ -8899,46 +8934,46 @@ function ChatMessageRow({
|
|
|
8899
8934
|
height: 40,
|
|
8900
8935
|
onError: () => setFailedSrc(resolvedAvatar ?? null)
|
|
8901
8936
|
}
|
|
8902
|
-
) : /* @__PURE__ */
|
|
8937
|
+
) : /* @__PURE__ */ jsx41("div", { className: "w-8 h-8 md:w-10 md:h-10 rounded-lg flex-shrink-0 flex items-center justify-center bg-ods-bg border border-ods-border text-h6 text-ods-text-primary", children: getFirstLastInitials(displayName) || "?" }),
|
|
8903
8938
|
/* @__PURE__ */ jsxs31("div", { className: "flex-1 min-w-0 max-w-full", children: [
|
|
8904
8939
|
/* @__PURE__ */ jsxs31("div", { className: "flex items-center gap-2 max-w-full mb-1 min-w-0", children: [
|
|
8905
|
-
/* @__PURE__ */
|
|
8906
|
-
timeLabel && /* @__PURE__ */
|
|
8940
|
+
/* @__PURE__ */ jsx41("span", { className: "text-[14px] md:text-[15px] font-bold leading-[1.33] text-ods-text-primary font-body tracking-[-0.02em] truncate", children: displayName }),
|
|
8941
|
+
timeLabel && /* @__PURE__ */ jsx41("span", { className: "text-h6 text-ods-text-secondary flex-shrink-0", children: timeLabel })
|
|
8907
8942
|
] }),
|
|
8908
|
-
hasBody && /* @__PURE__ */
|
|
8943
|
+
hasBody && /* @__PURE__ */ jsx41("div", { className: "text-h6 text-ods-text-primary whitespace-pre-wrap break-words min-w-0 max-w-full", children: body }),
|
|
8909
8944
|
footer
|
|
8910
8945
|
] })
|
|
8911
8946
|
] });
|
|
8912
8947
|
}
|
|
8913
8948
|
function ChatMessageRowSkeleton() {
|
|
8914
8949
|
return /* @__PURE__ */ jsxs31("div", { className: "flex gap-2 md:gap-3 w-full min-w-0", children: [
|
|
8915
|
-
/* @__PURE__ */
|
|
8950
|
+
/* @__PURE__ */ jsx41("div", { className: "w-8 h-8 md:w-10 md:h-10 rounded-lg flex-shrink-0 bg-ods-border animate-pulse" }),
|
|
8916
8951
|
/* @__PURE__ */ jsxs31("div", { className: "flex-1 min-w-0", children: [
|
|
8917
8952
|
/* @__PURE__ */ jsxs31("div", { className: "flex items-center gap-2 mb-1", children: [
|
|
8918
|
-
/* @__PURE__ */
|
|
8919
|
-
/* @__PURE__ */
|
|
8953
|
+
/* @__PURE__ */ jsx41("div", { className: "h-[15px] md:h-[20px] w-24 md:w-32 bg-ods-border rounded animate-pulse" }),
|
|
8954
|
+
/* @__PURE__ */ jsx41("div", { className: "h-[12px] md:h-[16px] w-12 md:w-16 bg-ods-border rounded animate-pulse" })
|
|
8920
8955
|
] }),
|
|
8921
|
-
/* @__PURE__ */
|
|
8922
|
-
/* @__PURE__ */
|
|
8956
|
+
/* @__PURE__ */ jsx41("div", { className: "h-[14px] md:h-[18px] w-full bg-ods-border rounded animate-pulse" }),
|
|
8957
|
+
/* @__PURE__ */ jsx41("div", { className: "h-[14px] md:h-[18px] w-3/4 bg-ods-border rounded animate-pulse mt-1" })
|
|
8923
8958
|
] })
|
|
8924
8959
|
] });
|
|
8925
8960
|
}
|
|
8926
8961
|
|
|
8927
8962
|
// src/components/chat/quick-action-chip.tsx
|
|
8928
8963
|
init_cn();
|
|
8929
|
-
import * as
|
|
8964
|
+
import * as React15 from "react";
|
|
8930
8965
|
|
|
8931
8966
|
// src/assets/fae-avatar.ts
|
|
8932
8967
|
var FAE_AVATAR_DATA_URI = "data:image/png;base64,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";
|
|
8933
8968
|
|
|
8934
8969
|
// src/components/agent-mark.tsx
|
|
8935
|
-
import { jsx as
|
|
8970
|
+
import { jsx as jsx42 } from "react/jsx-runtime";
|
|
8936
8971
|
function AgentMark({ agent, className = "", faeAvatarSrc = FAE_AVATAR_DATA_URI }) {
|
|
8937
|
-
return agent === "mingo" ? /* @__PURE__ */
|
|
8972
|
+
return agent === "mingo" ? /* @__PURE__ */ jsx42(MingoIcon, { className, "aria-hidden": "true", focusable: "false" }) : /* @__PURE__ */ jsx42("img", { src: faeAvatarSrc, alt: "", className });
|
|
8938
8973
|
}
|
|
8939
8974
|
|
|
8940
8975
|
// src/components/icon-display.tsx
|
|
8941
|
-
import { jsx as
|
|
8976
|
+
import { jsx as jsx43 } from "react/jsx-runtime";
|
|
8942
8977
|
var BRAND_MARK_NAMES = /* @__PURE__ */ new Set(["fae", "mingo"]);
|
|
8943
8978
|
function EntityIcon({
|
|
8944
8979
|
icon,
|
|
@@ -8946,7 +8981,7 @@ function EntityIcon({
|
|
|
8946
8981
|
className
|
|
8947
8982
|
}) {
|
|
8948
8983
|
if (icon?.url) {
|
|
8949
|
-
return /* @__PURE__ */
|
|
8984
|
+
return /* @__PURE__ */ jsx43(
|
|
8950
8985
|
"img",
|
|
8951
8986
|
{
|
|
8952
8987
|
src: icon.url,
|
|
@@ -8959,21 +8994,21 @@ function EntityIcon({
|
|
|
8959
8994
|
);
|
|
8960
8995
|
}
|
|
8961
8996
|
if (icon?.name && BRAND_MARK_NAMES.has(icon.name)) {
|
|
8962
|
-
return /* @__PURE__ */
|
|
8997
|
+
return /* @__PURE__ */ jsx43(
|
|
8963
8998
|
"span",
|
|
8964
8999
|
{
|
|
8965
9000
|
className: `inline-flex${className ? ` ${className}` : ""}`,
|
|
8966
9001
|
style: className ? void 0 : { width: size2, height: size2 },
|
|
8967
|
-
children: /* @__PURE__ */
|
|
9002
|
+
children: /* @__PURE__ */ jsx43(AgentMark, { agent: icon.name, className: "w-full h-full" })
|
|
8968
9003
|
}
|
|
8969
9004
|
);
|
|
8970
9005
|
}
|
|
8971
9006
|
const Glyph = resolveIcon(icon?.name ?? void 0);
|
|
8972
|
-
return /* @__PURE__ */
|
|
9007
|
+
return /* @__PURE__ */ jsx43(Glyph, { size: size2, className, ...icon?.props ?? {} });
|
|
8973
9008
|
}
|
|
8974
9009
|
|
|
8975
9010
|
// src/components/chat/quick-action-chip.tsx
|
|
8976
|
-
import { Fragment as Fragment11, jsx as
|
|
9011
|
+
import { Fragment as Fragment11, jsx as jsx44, jsxs as jsxs32 } from "react/jsx-runtime";
|
|
8977
9012
|
var AGENT_ACCENTS = { fae: "pink", mingo: "cyan" };
|
|
8978
9013
|
function getAgentAccent(slug) {
|
|
8979
9014
|
return slug === "fae" || slug === "mingo" ? AGENT_ACCENTS[slug] : void 0;
|
|
@@ -8987,7 +9022,7 @@ var ACCENT_CLASS = {
|
|
|
8987
9022
|
cyan: "text-ods-flamingo-cyan"
|
|
8988
9023
|
};
|
|
8989
9024
|
function isQuickActionIconSpec(icon) {
|
|
8990
|
-
return typeof icon === "object" && icon !== null && !Array.isArray(icon) && !
|
|
9025
|
+
return typeof icon === "object" && icon !== null && !Array.isArray(icon) && !React15.isValidElement(icon);
|
|
8991
9026
|
}
|
|
8992
9027
|
function renderQuickActionIcon(icon) {
|
|
8993
9028
|
if (!isQuickActionIconSpec(icon)) {
|
|
@@ -8997,7 +9032,7 @@ function renderQuickActionIcon(icon) {
|
|
|
8997
9032
|
if (!spec.name && !spec.url) return void 0;
|
|
8998
9033
|
const accentClass = spec.accent ? ACCENT_CLASS[spec.accent] : void 0;
|
|
8999
9034
|
const props = spec.accent && !accentClass ? { color: spec.accent, ...spec.props ?? {} } : spec.props;
|
|
9000
|
-
return /* @__PURE__ */
|
|
9035
|
+
return /* @__PURE__ */ jsx44(
|
|
9001
9036
|
EntityIcon,
|
|
9002
9037
|
{
|
|
9003
9038
|
icon: { name: spec.name, url: spec.url, props },
|
|
@@ -9009,7 +9044,7 @@ function renderQuickActionIcon(icon) {
|
|
|
9009
9044
|
function composeChipLabel(label, lozenge) {
|
|
9010
9045
|
if (!lozenge) return label;
|
|
9011
9046
|
return /* @__PURE__ */ jsxs32(Fragment11, { children: [
|
|
9012
|
-
/* @__PURE__ */
|
|
9047
|
+
/* @__PURE__ */ jsx44(
|
|
9013
9048
|
"span",
|
|
9014
9049
|
{
|
|
9015
9050
|
className: cn(
|
|
@@ -9029,19 +9064,19 @@ function composeChipLabel(label, lozenge) {
|
|
|
9029
9064
|
] });
|
|
9030
9065
|
}
|
|
9031
9066
|
function ChipSkelBar({ className, style }) {
|
|
9032
|
-
return /* @__PURE__ */
|
|
9067
|
+
return /* @__PURE__ */ jsx44("span", { "aria-hidden": true, className: cn("animate-pulse rounded-md bg-ods-border", className), style });
|
|
9033
9068
|
}
|
|
9034
9069
|
function QuickActionChipSkeleton({ labelCh = 16, icon = true, lozenge = false, size: size2 = "default", className }) {
|
|
9035
|
-
return /* @__PURE__ */
|
|
9070
|
+
return /* @__PURE__ */ jsx44(
|
|
9036
9071
|
Tag,
|
|
9037
9072
|
{
|
|
9038
9073
|
variant: "outline",
|
|
9039
9074
|
size: size2,
|
|
9040
9075
|
className,
|
|
9041
|
-
icon: icon ? /* @__PURE__ */
|
|
9076
|
+
icon: icon ? /* @__PURE__ */ jsx44(ChipSkelBar, { className: size2 === "large" ? "block size-5" : "block size-4" }) : void 0,
|
|
9042
9077
|
label: /* @__PURE__ */ jsxs32(Fragment11, { children: [
|
|
9043
|
-
lozenge && /* @__PURE__ */
|
|
9044
|
-
/* @__PURE__ */
|
|
9078
|
+
lozenge && /* @__PURE__ */ jsx44(ChipSkelBar, { className: "mr-2 inline-block h-[16px] w-[26px] translate-y-[2px]" }),
|
|
9079
|
+
/* @__PURE__ */ jsx44(ChipSkelBar, { className: "inline-block h-[0.9em] translate-y-[0.08em]", style: { width: `${labelCh}ch` } })
|
|
9045
9080
|
] })
|
|
9046
9081
|
}
|
|
9047
9082
|
);
|
|
@@ -9067,9 +9102,9 @@ function QuickActionChipButton({
|
|
|
9067
9102
|
const resolvedLabel = composeChipLabel(label, resolvedLozenge);
|
|
9068
9103
|
const tagVariant = selected ? selectedAccent === "cyan" ? "selectedCyan" : "selected" : variant;
|
|
9069
9104
|
if (!interactive) {
|
|
9070
|
-
return /* @__PURE__ */
|
|
9105
|
+
return /* @__PURE__ */ jsx44(Tag, { variant: tagVariant, size: size2, icon: resolvedIcon, label: resolvedLabel, className });
|
|
9071
9106
|
}
|
|
9072
|
-
return /* @__PURE__ */
|
|
9107
|
+
return /* @__PURE__ */ jsx44(
|
|
9073
9108
|
"button",
|
|
9074
9109
|
{
|
|
9075
9110
|
type: "button",
|
|
@@ -9083,7 +9118,7 @@ function QuickActionChipButton({
|
|
|
9083
9118
|
"shrink-0 rounded-md focus:outline-none focus-visible:ring-2 focus-visible:ring-ods-accent",
|
|
9084
9119
|
className
|
|
9085
9120
|
),
|
|
9086
|
-
children: /* @__PURE__ */
|
|
9121
|
+
children: /* @__PURE__ */ jsx44(Tag, { variant: tagVariant, size: size2, icon: resolvedIcon, label: resolvedLabel })
|
|
9087
9122
|
}
|
|
9088
9123
|
);
|
|
9089
9124
|
}
|
|
@@ -9094,7 +9129,7 @@ function QuickActionChipFromData({
|
|
|
9094
9129
|
interactive = true,
|
|
9095
9130
|
className
|
|
9096
9131
|
}) {
|
|
9097
|
-
return /* @__PURE__ */
|
|
9132
|
+
return /* @__PURE__ */ jsx44(
|
|
9098
9133
|
QuickActionChipButton,
|
|
9099
9134
|
{
|
|
9100
9135
|
label: chip.label,
|
|
@@ -9114,21 +9149,21 @@ function QuickActionChipFromData({
|
|
|
9114
9149
|
}
|
|
9115
9150
|
|
|
9116
9151
|
// src/components/chat/quick-action-marquee.tsx
|
|
9117
|
-
import * as
|
|
9152
|
+
import * as React18 from "react";
|
|
9118
9153
|
|
|
9119
9154
|
// src/components/chat/quick-action-wall.tsx
|
|
9120
9155
|
init_cn();
|
|
9121
|
-
import * as
|
|
9156
|
+
import * as React17 from "react";
|
|
9122
9157
|
|
|
9123
9158
|
// src/components/ui/marquee-wall.tsx
|
|
9124
9159
|
init_cn();
|
|
9125
|
-
import * as
|
|
9126
|
-
import { Fragment as Fragment12, jsx as
|
|
9160
|
+
import * as React16 from "react";
|
|
9161
|
+
import { Fragment as Fragment12, jsx as jsx45, jsxs as jsxs33 } from "react/jsx-runtime";
|
|
9127
9162
|
function normalizeFades(fade) {
|
|
9128
9163
|
return fade ? Array.isArray(fade) ? fade : [fade] : [];
|
|
9129
9164
|
}
|
|
9130
9165
|
function useMarqueeSync() {
|
|
9131
|
-
return
|
|
9166
|
+
return React16.useRef({ members: /* @__PURE__ */ new Set(), driver: null, position: 0 }).current;
|
|
9132
9167
|
}
|
|
9133
9168
|
var MARQUEE_TRACK_OFFSETS = /* @__PURE__ */ new Map();
|
|
9134
9169
|
var ZERO_OFFSET = { x: 0, y: 0, wrapX: 0, wrapY: 0 };
|
|
@@ -9167,11 +9202,11 @@ function MarqueeWallFades({
|
|
|
9167
9202
|
fadeColor = "var(--color-bg)",
|
|
9168
9203
|
fadeSize
|
|
9169
9204
|
}) {
|
|
9170
|
-
return /* @__PURE__ */
|
|
9205
|
+
return /* @__PURE__ */ jsx45(Fragment12, { children: normalizeFades(fade).map((edge) => {
|
|
9171
9206
|
const size2 = (typeof fadeSize === "object" && fadeSize !== null ? fadeSize[edge] : fadeSize) ?? DEFAULT_FADE_SIZE[edge];
|
|
9172
9207
|
const px = typeof size2 === "number" ? `${size2}px` : size2;
|
|
9173
9208
|
const isY = edge === "top" || edge === "bottom";
|
|
9174
|
-
return /* @__PURE__ */
|
|
9209
|
+
return /* @__PURE__ */ jsx45(
|
|
9175
9210
|
"div",
|
|
9176
9211
|
{
|
|
9177
9212
|
"aria-hidden": true,
|
|
@@ -9192,7 +9227,7 @@ function CloneCopy({
|
|
|
9192
9227
|
children
|
|
9193
9228
|
}) {
|
|
9194
9229
|
const ref = useSuppressCloneFocus(true);
|
|
9195
|
-
return /* @__PURE__ */
|
|
9230
|
+
return /* @__PURE__ */ jsx45("div", { ref, "aria-hidden": true, "data-marquee-copy": "clone", className, style, children });
|
|
9196
9231
|
}
|
|
9197
9232
|
function MarqueeWall({
|
|
9198
9233
|
mode = "animated",
|
|
@@ -9213,16 +9248,16 @@ function MarqueeWall({
|
|
|
9213
9248
|
sync,
|
|
9214
9249
|
trackId
|
|
9215
9250
|
}) {
|
|
9216
|
-
const fades =
|
|
9251
|
+
const fades = React16.useMemo(() => normalizeFades(fade), [fade]);
|
|
9217
9252
|
const axis = axisProp ?? (fades.includes("top") || fades.includes("bottom") ? "y" : "x");
|
|
9218
|
-
const containerRef =
|
|
9219
|
-
const trackRef =
|
|
9220
|
-
const copyRef =
|
|
9253
|
+
const containerRef = React16.useRef(null);
|
|
9254
|
+
const trackRef = React16.useRef(null);
|
|
9255
|
+
const copyRef = React16.useRef(null);
|
|
9221
9256
|
const reducedMotion = useMediaQuery("(prefers-reduced-motion: reduce)") ?? false;
|
|
9222
|
-
const [overflows, setOverflows] =
|
|
9223
|
-
const copySizeRef =
|
|
9224
|
-
const wrapSizeRef =
|
|
9225
|
-
const measure =
|
|
9257
|
+
const [overflows, setOverflows] = React16.useState(false);
|
|
9258
|
+
const copySizeRef = React16.useRef(0);
|
|
9259
|
+
const wrapSizeRef = React16.useRef(0);
|
|
9260
|
+
const measure = React16.useCallback(() => {
|
|
9226
9261
|
const container = containerRef.current;
|
|
9227
9262
|
const copy = copyRef.current;
|
|
9228
9263
|
if (!container || !copy) return;
|
|
@@ -9235,7 +9270,7 @@ function MarqueeWall({
|
|
|
9235
9270
|
}, [axis, copyGap]);
|
|
9236
9271
|
const marqueeMounted = mode === "animated" && !reducedMotion && overflows;
|
|
9237
9272
|
const marqueeActive = marqueeMounted && animate;
|
|
9238
|
-
|
|
9273
|
+
React16.useEffect(() => {
|
|
9239
9274
|
measure();
|
|
9240
9275
|
const container = containerRef.current;
|
|
9241
9276
|
const copy = copyRef.current;
|
|
@@ -9245,8 +9280,8 @@ function MarqueeWall({
|
|
|
9245
9280
|
ro.observe(copy);
|
|
9246
9281
|
return () => ro.disconnect();
|
|
9247
9282
|
}, [measure, marqueeMounted]);
|
|
9248
|
-
const [nearViewport, setNearViewport] =
|
|
9249
|
-
|
|
9283
|
+
const [nearViewport, setNearViewport] = React16.useState(true);
|
|
9284
|
+
React16.useEffect(() => {
|
|
9250
9285
|
const el = containerRef.current;
|
|
9251
9286
|
if (!el || typeof IntersectionObserver === "undefined") return;
|
|
9252
9287
|
const io = new IntersectionObserver(
|
|
@@ -9256,22 +9291,22 @@ function MarqueeWall({
|
|
|
9256
9291
|
io.observe(el);
|
|
9257
9292
|
return () => io.disconnect();
|
|
9258
9293
|
}, []);
|
|
9259
|
-
const pointerInsideRef =
|
|
9260
|
-
const clearPointerInside =
|
|
9294
|
+
const pointerInsideRef = React16.useRef(false);
|
|
9295
|
+
const clearPointerInside = React16.useCallback(() => {
|
|
9261
9296
|
pointerInsideRef.current = false;
|
|
9262
9297
|
}, []);
|
|
9263
|
-
const onPointerEnter =
|
|
9298
|
+
const onPointerEnter = React16.useCallback((e) => {
|
|
9264
9299
|
if (e.pointerType === "touch") return;
|
|
9265
9300
|
pointerInsideRef.current = true;
|
|
9266
9301
|
}, []);
|
|
9267
|
-
const onPointerLeave =
|
|
9302
|
+
const onPointerLeave = React16.useCallback((e) => {
|
|
9268
9303
|
if (e.pointerType === "touch") return;
|
|
9269
9304
|
pointerInsideRef.current = false;
|
|
9270
9305
|
}, []);
|
|
9271
9306
|
useResetOnPageHidden(clearPointerInside);
|
|
9272
|
-
const draggingRef =
|
|
9273
|
-
const dragSuppressUntilRef =
|
|
9274
|
-
const applyTransform =
|
|
9307
|
+
const draggingRef = React16.useRef(false);
|
|
9308
|
+
const dragSuppressUntilRef = React16.useRef(0);
|
|
9309
|
+
const applyTransform = React16.useCallback(
|
|
9275
9310
|
(pos) => {
|
|
9276
9311
|
const track = trackRef.current;
|
|
9277
9312
|
if (!track) return;
|
|
@@ -9287,7 +9322,7 @@ function MarqueeWall({
|
|
|
9287
9322
|
},
|
|
9288
9323
|
[axis, reverse, trackId]
|
|
9289
9324
|
);
|
|
9290
|
-
const applyPos =
|
|
9325
|
+
const applyPos = React16.useCallback(
|
|
9291
9326
|
(pos) => {
|
|
9292
9327
|
if (sync) {
|
|
9293
9328
|
sync.position = pos;
|
|
@@ -9298,14 +9333,14 @@ function MarqueeWall({
|
|
|
9298
9333
|
},
|
|
9299
9334
|
[sync, applyTransform]
|
|
9300
9335
|
);
|
|
9301
|
-
|
|
9336
|
+
React16.useEffect(() => {
|
|
9302
9337
|
if (marqueeMounted) return;
|
|
9303
9338
|
const track = trackRef.current;
|
|
9304
9339
|
if (track) track.style.transform = "";
|
|
9305
9340
|
if (trackId) MARQUEE_TRACK_OFFSETS.set(trackId, ZERO_OFFSET);
|
|
9306
9341
|
}, [marqueeMounted, trackId]);
|
|
9307
|
-
const [isDriver, setIsDriver] =
|
|
9308
|
-
|
|
9342
|
+
const [isDriver, setIsDriver] = React16.useState(!sync);
|
|
9343
|
+
React16.useEffect(() => {
|
|
9309
9344
|
if (!sync) {
|
|
9310
9345
|
setIsDriver(true);
|
|
9311
9346
|
return;
|
|
@@ -9333,7 +9368,7 @@ function MarqueeWall({
|
|
|
9333
9368
|
// (engine seeds from readBack on activation) instead of restarting at 0.
|
|
9334
9369
|
readBack: sync ? () => sync.position : void 0
|
|
9335
9370
|
});
|
|
9336
|
-
|
|
9371
|
+
React16.useLayoutEffect(() => {
|
|
9337
9372
|
if (!marqueeMounted) {
|
|
9338
9373
|
posRef.current = 0;
|
|
9339
9374
|
return;
|
|
@@ -9343,17 +9378,17 @@ function MarqueeWall({
|
|
|
9343
9378
|
}
|
|
9344
9379
|
}, [marqueeMounted, reverse, posRef]);
|
|
9345
9380
|
const DRAG_RESUME_MS = 1200;
|
|
9346
|
-
const dragStartRef =
|
|
9347
|
-
const dragMovedRef =
|
|
9348
|
-
const suppressClickRef =
|
|
9349
|
-
const onDragPointerDown =
|
|
9381
|
+
const dragStartRef = React16.useRef({ coord: 0, pos: 0 });
|
|
9382
|
+
const dragMovedRef = React16.useRef(false);
|
|
9383
|
+
const suppressClickRef = React16.useRef(false);
|
|
9384
|
+
const onDragPointerDown = React16.useCallback((e) => {
|
|
9350
9385
|
if (!marqueeMounted) return;
|
|
9351
9386
|
draggingRef.current = true;
|
|
9352
9387
|
dragMovedRef.current = false;
|
|
9353
9388
|
suppressClickRef.current = false;
|
|
9354
9389
|
dragStartRef.current = { coord: axis === "y" ? e.clientY : e.clientX, pos: posRef.current };
|
|
9355
9390
|
}, [marqueeMounted, axis, posRef]);
|
|
9356
|
-
const onDragPointerMove =
|
|
9391
|
+
const onDragPointerMove = React16.useCallback((e) => {
|
|
9357
9392
|
if (!draggingRef.current) return;
|
|
9358
9393
|
const delta = (axis === "y" ? e.clientY : e.clientX) - dragStartRef.current.coord;
|
|
9359
9394
|
if (Math.abs(delta) > 3 && !dragMovedRef.current) {
|
|
@@ -9367,7 +9402,7 @@ function MarqueeWall({
|
|
|
9367
9402
|
applyPos(posRef.current);
|
|
9368
9403
|
dragSuppressUntilRef.current = performance.now() + DRAG_RESUME_MS;
|
|
9369
9404
|
}, [axis, reverse, wrap, posRef, applyPos]);
|
|
9370
|
-
const onDragPointerUp =
|
|
9405
|
+
const onDragPointerUp = React16.useCallback((e) => {
|
|
9371
9406
|
if (!draggingRef.current) return;
|
|
9372
9407
|
draggingRef.current = false;
|
|
9373
9408
|
if (dragMovedRef.current) suppressClickRef.current = true;
|
|
@@ -9379,18 +9414,18 @@ function MarqueeWall({
|
|
|
9379
9414
|
}
|
|
9380
9415
|
}
|
|
9381
9416
|
}, []);
|
|
9382
|
-
const onDragPointerLeave =
|
|
9417
|
+
const onDragPointerLeave = React16.useCallback((e) => {
|
|
9383
9418
|
onPointerLeave(e);
|
|
9384
9419
|
if (draggingRef.current && !dragMovedRef.current) draggingRef.current = false;
|
|
9385
9420
|
}, [onPointerLeave]);
|
|
9386
|
-
const onDragClickCapture =
|
|
9421
|
+
const onDragClickCapture = React16.useCallback((e) => {
|
|
9387
9422
|
if (suppressClickRef.current) {
|
|
9388
9423
|
suppressClickRef.current = false;
|
|
9389
9424
|
e.preventDefault();
|
|
9390
9425
|
e.stopPropagation();
|
|
9391
9426
|
}
|
|
9392
9427
|
}, []);
|
|
9393
|
-
|
|
9428
|
+
React16.useEffect(() => {
|
|
9394
9429
|
const el = containerRef.current;
|
|
9395
9430
|
if (!el || !dragScroll || !marqueeMounted) return;
|
|
9396
9431
|
const onWheel = (e) => {
|
|
@@ -9440,7 +9475,7 @@ function MarqueeWall({
|
|
|
9440
9475
|
),
|
|
9441
9476
|
style: marqueeMounted ? { gap: copyGap } : void 0,
|
|
9442
9477
|
children: [
|
|
9443
|
-
/* @__PURE__ */
|
|
9478
|
+
/* @__PURE__ */ jsx45(
|
|
9444
9479
|
"div",
|
|
9445
9480
|
{
|
|
9446
9481
|
ref: copyRef,
|
|
@@ -9450,18 +9485,18 @@ function MarqueeWall({
|
|
|
9450
9485
|
children: renderContent(false)
|
|
9451
9486
|
}
|
|
9452
9487
|
),
|
|
9453
|
-
marqueeMounted && /* @__PURE__ */
|
|
9488
|
+
marqueeMounted && /* @__PURE__ */ jsx45(CloneCopy, { className: cn(axis === "x" && "w-max shrink-0", contentClassName), style: contentStyle, children: renderContent(true) })
|
|
9454
9489
|
]
|
|
9455
9490
|
}
|
|
9456
9491
|
),
|
|
9457
|
-
mode === "animated" && overflows && /* @__PURE__ */
|
|
9492
|
+
mode === "animated" && overflows && /* @__PURE__ */ jsx45(MarqueeWallFades, { fade, fadeColor, fadeSize })
|
|
9458
9493
|
]
|
|
9459
9494
|
}
|
|
9460
9495
|
);
|
|
9461
9496
|
}
|
|
9462
9497
|
|
|
9463
9498
|
// src/components/chat/quick-action-wall.tsx
|
|
9464
|
-
import { jsx as
|
|
9499
|
+
import { jsx as jsx46, jsxs as jsxs34 } from "react/jsx-runtime";
|
|
9465
9500
|
var WALL_SKELETON_LABEL_CH = [17, 24, 14, 20, 15, 25, 12, 21, 16, 19, 13, 23];
|
|
9466
9501
|
function interleave(a, b) {
|
|
9467
9502
|
const out = [];
|
|
@@ -9501,10 +9536,10 @@ function QuickActionWall({
|
|
|
9501
9536
|
contentClassName,
|
|
9502
9537
|
sync
|
|
9503
9538
|
}) {
|
|
9504
|
-
const brickRef =
|
|
9505
|
-
const [brickWidth, setBrickWidth] =
|
|
9506
|
-
const [chipWidth, setChipWidth] =
|
|
9507
|
-
|
|
9539
|
+
const brickRef = React17.useRef(null);
|
|
9540
|
+
const [brickWidth, setBrickWidth] = React17.useState(0);
|
|
9541
|
+
const [chipWidth, setChipWidth] = React17.useState(0);
|
|
9542
|
+
React17.useEffect(() => {
|
|
9508
9543
|
const el = brickRef.current;
|
|
9509
9544
|
if (!el) return;
|
|
9510
9545
|
const measure = () => {
|
|
@@ -9523,7 +9558,7 @@ function QuickActionWall({
|
|
|
9523
9558
|
return () => ro.disconnect();
|
|
9524
9559
|
}, [chips]);
|
|
9525
9560
|
const padTarget = rows ? void 0 : minChips;
|
|
9526
|
-
const track =
|
|
9561
|
+
const track = React17.useMemo(() => {
|
|
9527
9562
|
if (!padTarget || chips.length === 0 || chips.length >= padTarget) return chips;
|
|
9528
9563
|
const repeats = Math.ceil(padTarget / chips.length);
|
|
9529
9564
|
return Array.from(
|
|
@@ -9531,7 +9566,7 @@ function QuickActionWall({
|
|
|
9531
9566
|
(_, r) => r === 0 ? chips : chips.map((chip) => ({ ...chip, id: `${chip.id}__r${r}` }))
|
|
9532
9567
|
).flat();
|
|
9533
9568
|
}, [chips, padTarget]);
|
|
9534
|
-
const renderSkeletons = (count, offset2 = 0) => Array.from({ length: count }, (_, i) => /* @__PURE__ */
|
|
9569
|
+
const renderSkeletons = (count, offset2 = 0) => Array.from({ length: count }, (_, i) => /* @__PURE__ */ jsx46(
|
|
9535
9570
|
QuickActionChipSkeleton,
|
|
9536
9571
|
{
|
|
9537
9572
|
lozenge: lozenges,
|
|
@@ -9539,7 +9574,7 @@ function QuickActionWall({
|
|
|
9539
9574
|
},
|
|
9540
9575
|
i
|
|
9541
9576
|
));
|
|
9542
|
-
const renderChipNodes = (list) => list.map((chip) => /* @__PURE__ */
|
|
9577
|
+
const renderChipNodes = (list) => list.map((chip) => /* @__PURE__ */ jsx46(
|
|
9543
9578
|
QuickActionChipFromData,
|
|
9544
9579
|
{
|
|
9545
9580
|
chip,
|
|
@@ -9573,7 +9608,7 @@ function QuickActionWall({
|
|
|
9573
9608
|
});
|
|
9574
9609
|
const skelPerRow = Math.ceil(skeletonCount / stackRows);
|
|
9575
9610
|
return /* @__PURE__ */ jsxs34("div", { ref: brickRef, className: cn("relative flex flex-col overflow-hidden", className), style: { gap }, children: [
|
|
9576
|
-
rowLists.map((list, r) => /* @__PURE__ */
|
|
9611
|
+
rowLists.map((list, r) => /* @__PURE__ */ jsx46(
|
|
9577
9612
|
MarqueeWall,
|
|
9578
9613
|
{
|
|
9579
9614
|
mode,
|
|
@@ -9590,10 +9625,10 @@ function QuickActionWall({
|
|
|
9590
9625
|
},
|
|
9591
9626
|
r
|
|
9592
9627
|
)),
|
|
9593
|
-
mode === "animated" && /* @__PURE__ */
|
|
9628
|
+
mode === "animated" && /* @__PURE__ */ jsx46(MarqueeWallFades, { fade, fadeColor, fadeSize })
|
|
9594
9629
|
] });
|
|
9595
9630
|
}
|
|
9596
|
-
return /* @__PURE__ */
|
|
9631
|
+
return /* @__PURE__ */ jsx46(
|
|
9597
9632
|
MarqueeWall,
|
|
9598
9633
|
{
|
|
9599
9634
|
mode,
|
|
@@ -9617,7 +9652,7 @@ function QuickActionWall({
|
|
|
9617
9652
|
}
|
|
9618
9653
|
|
|
9619
9654
|
// src/components/chat/quick-action-marquee.tsx
|
|
9620
|
-
import { jsx as
|
|
9655
|
+
import { jsx as jsx47 } from "react/jsx-runtime";
|
|
9621
9656
|
function QuickActionMarquee({
|
|
9622
9657
|
items,
|
|
9623
9658
|
mode = "animated",
|
|
@@ -9629,7 +9664,7 @@ function QuickActionMarquee({
|
|
|
9629
9664
|
sync,
|
|
9630
9665
|
className
|
|
9631
9666
|
}) {
|
|
9632
|
-
const chips =
|
|
9667
|
+
const chips = React18.useMemo(
|
|
9633
9668
|
() => items.map((item) => ({
|
|
9634
9669
|
id: item.id,
|
|
9635
9670
|
label: item.label,
|
|
@@ -9639,7 +9674,7 @@ function QuickActionMarquee({
|
|
|
9639
9674
|
[items, onSelect]
|
|
9640
9675
|
);
|
|
9641
9676
|
if (items.length === 0) return null;
|
|
9642
|
-
return /* @__PURE__ */
|
|
9677
|
+
return /* @__PURE__ */ jsx47(
|
|
9643
9678
|
QuickActionWall,
|
|
9644
9679
|
{
|
|
9645
9680
|
chips,
|
|
@@ -9659,16 +9694,16 @@ function QuickActionMarquee({
|
|
|
9659
9694
|
|
|
9660
9695
|
// src/components/chat/chat-ticket-list.tsx
|
|
9661
9696
|
init_cn();
|
|
9662
|
-
import * as
|
|
9697
|
+
import * as React21 from "react";
|
|
9663
9698
|
|
|
9664
9699
|
// src/components/ui/scroll-fade.tsx
|
|
9665
9700
|
init_cn();
|
|
9666
|
-
import * as
|
|
9667
|
-
import { jsx as
|
|
9701
|
+
import * as React19 from "react";
|
|
9702
|
+
import { jsx as jsx48, jsxs as jsxs35 } from "react/jsx-runtime";
|
|
9668
9703
|
function useScrollFade(axis = "vertical") {
|
|
9669
|
-
const scrollRef =
|
|
9670
|
-
const [fade, setFade] =
|
|
9671
|
-
const update =
|
|
9704
|
+
const scrollRef = React19.useRef(null);
|
|
9705
|
+
const [fade, setFade] = React19.useState({ top: false, bottom: false, left: false, right: false });
|
|
9706
|
+
const update = React19.useCallback(() => {
|
|
9672
9707
|
const el = scrollRef.current;
|
|
9673
9708
|
if (!el) return;
|
|
9674
9709
|
setFade((prev) => {
|
|
@@ -9681,7 +9716,7 @@ function useScrollFade(axis = "vertical") {
|
|
|
9681
9716
|
return prev.top === top && prev.bottom === bottom && prev.left === left && prev.right === right ? prev : { top, bottom, left, right };
|
|
9682
9717
|
});
|
|
9683
9718
|
}, [axis]);
|
|
9684
|
-
|
|
9719
|
+
React19.useLayoutEffect(() => {
|
|
9685
9720
|
update();
|
|
9686
9721
|
const el = scrollRef.current;
|
|
9687
9722
|
if (!el) return;
|
|
@@ -9722,7 +9757,7 @@ function ScrollFadeOverlay({
|
|
|
9722
9757
|
className
|
|
9723
9758
|
}) {
|
|
9724
9759
|
const isVertical = edge === "top" || edge === "bottom";
|
|
9725
|
-
return /* @__PURE__ */
|
|
9760
|
+
return /* @__PURE__ */ jsx48(
|
|
9726
9761
|
"div",
|
|
9727
9762
|
{
|
|
9728
9763
|
"aria-hidden": true,
|
|
@@ -9755,7 +9790,7 @@ function ScrollShadow({
|
|
|
9755
9790
|
const vertical = axis !== "horizontal";
|
|
9756
9791
|
const horizontal = axis !== "vertical";
|
|
9757
9792
|
return /* @__PURE__ */ jsxs35("div", { className: cn("relative", className), ...rest, children: [
|
|
9758
|
-
/* @__PURE__ */
|
|
9793
|
+
/* @__PURE__ */ jsx48(
|
|
9759
9794
|
"div",
|
|
9760
9795
|
{
|
|
9761
9796
|
ref: scrollRef,
|
|
@@ -9764,19 +9799,19 @@ function ScrollShadow({
|
|
|
9764
9799
|
children
|
|
9765
9800
|
}
|
|
9766
9801
|
),
|
|
9767
|
-
vertical && /* @__PURE__ */
|
|
9768
|
-
vertical && /* @__PURE__ */
|
|
9769
|
-
horizontal && /* @__PURE__ */
|
|
9770
|
-
horizontal && /* @__PURE__ */
|
|
9802
|
+
vertical && /* @__PURE__ */ jsx48(ScrollFadeOverlay, { edge: "top", visible: fadeTop, color, className: overlayClassName }),
|
|
9803
|
+
vertical && /* @__PURE__ */ jsx48(ScrollFadeOverlay, { edge: "bottom", visible: fadeBottom, color, className: overlayClassName }),
|
|
9804
|
+
horizontal && /* @__PURE__ */ jsx48(ScrollFadeOverlay, { edge: "left", visible: fadeLeft, color, className: overlayClassName }),
|
|
9805
|
+
horizontal && /* @__PURE__ */ jsx48(ScrollFadeOverlay, { edge: "right", visible: fadeRight, color, className: overlayClassName })
|
|
9771
9806
|
] });
|
|
9772
9807
|
}
|
|
9773
9808
|
|
|
9774
9809
|
// src/components/chat/entity-cards/chat-ticket-item.tsx
|
|
9775
9810
|
init_cn();
|
|
9776
|
-
import * as
|
|
9811
|
+
import * as React20 from "react";
|
|
9777
9812
|
import { ChevronRight } from "lucide-react";
|
|
9778
|
-
import { jsx as
|
|
9779
|
-
var ChatTicketItem =
|
|
9813
|
+
import { jsx as jsx49, jsxs as jsxs36 } from "react/jsx-runtime";
|
|
9814
|
+
var ChatTicketItem = React20.forwardRef(
|
|
9780
9815
|
({ className, ticket, onClick, isLoading = false, ...props }, ref) => {
|
|
9781
9816
|
if (isLoading) {
|
|
9782
9817
|
return /* @__PURE__ */ jsxs36(
|
|
@@ -9790,11 +9825,11 @@ var ChatTicketItem = React19.forwardRef(
|
|
|
9790
9825
|
),
|
|
9791
9826
|
children: [
|
|
9792
9827
|
/* @__PURE__ */ jsxs36("div", { className: "flex flex-col justify-center flex-1 min-w-0 gap-1", children: [
|
|
9793
|
-
/* @__PURE__ */
|
|
9794
|
-
/* @__PURE__ */
|
|
9828
|
+
/* @__PURE__ */ jsx49(Skeleton, { className: "h-5 w-1/2" }),
|
|
9829
|
+
/* @__PURE__ */ jsx49(Skeleton, { className: "h-4 w-1/3" })
|
|
9795
9830
|
] }),
|
|
9796
|
-
/* @__PURE__ */
|
|
9797
|
-
/* @__PURE__ */
|
|
9831
|
+
/* @__PURE__ */ jsx49(Skeleton, { className: "h-8 w-20 rounded-r-md shrink-0" }),
|
|
9832
|
+
/* @__PURE__ */ jsx49(Skeleton, { className: "size-12 rounded-md shrink-0" })
|
|
9798
9833
|
]
|
|
9799
9834
|
}
|
|
9800
9835
|
);
|
|
@@ -9830,7 +9865,7 @@ var ChatTicketItem = React19.forwardRef(
|
|
|
9830
9865
|
...props,
|
|
9831
9866
|
children: [
|
|
9832
9867
|
/* @__PURE__ */ jsxs36("div", { className: "flex flex-col justify-center flex-1 min-w-0 text-left", children: [
|
|
9833
|
-
/* @__PURE__ */
|
|
9868
|
+
/* @__PURE__ */ jsx49(
|
|
9834
9869
|
"p",
|
|
9835
9870
|
{
|
|
9836
9871
|
className: cn(
|
|
@@ -9841,19 +9876,19 @@ var ChatTicketItem = React19.forwardRef(
|
|
|
9841
9876
|
children: ticket.title
|
|
9842
9877
|
}
|
|
9843
9878
|
),
|
|
9844
|
-
subtitle && /* @__PURE__ */
|
|
9879
|
+
subtitle && /* @__PURE__ */ jsx49("p", { className: "text-h6 text-ods-text-secondary truncate", title: subtitle, children: subtitle })
|
|
9845
9880
|
] }),
|
|
9846
|
-
ticket.linkedTaskLabel && /* @__PURE__ */
|
|
9881
|
+
ticket.linkedTaskLabel && /* @__PURE__ */ jsx49(
|
|
9847
9882
|
Tag,
|
|
9848
9883
|
{
|
|
9849
9884
|
label: ticket.linkedTaskLabel,
|
|
9850
9885
|
variant: "outline",
|
|
9851
|
-
icon: /* @__PURE__ */
|
|
9886
|
+
icon: /* @__PURE__ */ jsx49(WrenchIcon, { size: 14, color: "var(--color-text-secondary)" }),
|
|
9852
9887
|
className: "shrink-0 hidden sm:inline-flex"
|
|
9853
9888
|
}
|
|
9854
9889
|
),
|
|
9855
|
-
(statusTagProps.status || statusTagProps.label) && /* @__PURE__ */
|
|
9856
|
-
/* @__PURE__ */
|
|
9890
|
+
(statusTagProps.status || statusTagProps.label) && /* @__PURE__ */ jsx49(TicketStatusTag, { ...statusTagProps }),
|
|
9891
|
+
/* @__PURE__ */ jsx49("div", { className: "flex items-center justify-center shrink-0 size-12 rounded-md bg-ods-card border border-ods-border", children: /* @__PURE__ */ jsx49(ChevronRight, { className: "size-6 text-ods-text-secondary" }) })
|
|
9857
9892
|
]
|
|
9858
9893
|
}
|
|
9859
9894
|
);
|
|
@@ -9862,22 +9897,22 @@ var ChatTicketItem = React19.forwardRef(
|
|
|
9862
9897
|
ChatTicketItem.displayName = "ChatTicketItem";
|
|
9863
9898
|
|
|
9864
9899
|
// src/components/chat/chat-ticket-list.tsx
|
|
9865
|
-
import { jsx as
|
|
9866
|
-
var ChatTicketList =
|
|
9900
|
+
import { jsx as jsx50, jsxs as jsxs37 } from "react/jsx-runtime";
|
|
9901
|
+
var ChatTicketList = React21.forwardRef(
|
|
9867
9902
|
({ className, tickets, onTicketClick, isLoading = false, skeletonCount = 5, ...props }, ref) => {
|
|
9868
9903
|
const { scrollRef, fadeTop, fadeBottom, update: updateFade } = useScrollFade();
|
|
9869
9904
|
if (isLoading) {
|
|
9870
9905
|
return /* @__PURE__ */ jsxs37("div", { ref, className: cn("flex flex-col gap-2 min-h-0", className), ...props, children: [
|
|
9871
|
-
/* @__PURE__ */
|
|
9872
|
-
/* @__PURE__ */
|
|
9906
|
+
/* @__PURE__ */ jsx50("p", { className: "text-h5 text-ods-text-secondary shrink-0", children: "Your Chats:" }),
|
|
9907
|
+
/* @__PURE__ */ jsx50("div", { className: "border border-ods-border rounded-md flex-1 min-h-0 overflow-hidden", children: Array.from({ length: skeletonCount }).map((_, i) => (
|
|
9873
9908
|
// eslint-disable-next-line react/no-array-index-key
|
|
9874
|
-
/* @__PURE__ */
|
|
9909
|
+
/* @__PURE__ */ jsx50(ChatTicketItem, { isLoading: true }, i)
|
|
9875
9910
|
)) })
|
|
9876
9911
|
] });
|
|
9877
9912
|
}
|
|
9878
9913
|
if (tickets.length === 0) return null;
|
|
9879
9914
|
return /* @__PURE__ */ jsxs37("div", { ref, className: cn("flex flex-col gap-2 min-h-0", className), ...props, children: [
|
|
9880
|
-
/* @__PURE__ */
|
|
9915
|
+
/* @__PURE__ */ jsx50("p", { className: "text-h5 text-ods-text-secondary shrink-0", children: "Your Chats:" }),
|
|
9881
9916
|
/* @__PURE__ */ jsxs37(
|
|
9882
9917
|
"div",
|
|
9883
9918
|
{
|
|
@@ -9887,7 +9922,7 @@ var ChatTicketList = React20.forwardRef(
|
|
|
9887
9922
|
!fadeBottom && "border-b rounded-b-md"
|
|
9888
9923
|
),
|
|
9889
9924
|
children: [
|
|
9890
|
-
/* @__PURE__ */
|
|
9925
|
+
/* @__PURE__ */ jsx50("div", { ref: scrollRef, className: "overflow-y-auto overscroll-contain h-full", onScroll: updateFade, children: tickets.map((ticket) => /* @__PURE__ */ jsx50(
|
|
9891
9926
|
ChatTicketItem,
|
|
9892
9927
|
{
|
|
9893
9928
|
ticket,
|
|
@@ -9895,8 +9930,8 @@ var ChatTicketList = React20.forwardRef(
|
|
|
9895
9930
|
},
|
|
9896
9931
|
ticket.id
|
|
9897
9932
|
)) }),
|
|
9898
|
-
/* @__PURE__ */
|
|
9899
|
-
/* @__PURE__ */
|
|
9933
|
+
/* @__PURE__ */ jsx50(ScrollFadeOverlay, { edge: "top", visible: fadeTop }),
|
|
9934
|
+
/* @__PURE__ */ jsx50(ScrollFadeOverlay, { edge: "bottom", visible: fadeBottom })
|
|
9900
9935
|
]
|
|
9901
9936
|
}
|
|
9902
9937
|
)
|
|
@@ -9907,7 +9942,7 @@ ChatTicketList.displayName = "ChatTicketList";
|
|
|
9907
9942
|
|
|
9908
9943
|
// src/components/chat/mingo-onboarding-card-skeleton.tsx
|
|
9909
9944
|
init_cn();
|
|
9910
|
-
import { jsx as
|
|
9945
|
+
import { jsx as jsx51, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
9911
9946
|
function MingoOnboardingCardSkeleton({
|
|
9912
9947
|
titleWidth = "w-32",
|
|
9913
9948
|
slashWidth = "w-20",
|
|
@@ -9916,7 +9951,7 @@ function MingoOnboardingCardSkeleton({
|
|
|
9916
9951
|
className
|
|
9917
9952
|
}) {
|
|
9918
9953
|
const hasChips = chipWidths.length > 0;
|
|
9919
|
-
return /* @__PURE__ */
|
|
9954
|
+
return /* @__PURE__ */ jsx51(
|
|
9920
9955
|
"div",
|
|
9921
9956
|
{
|
|
9922
9957
|
className: cn(
|
|
@@ -9925,16 +9960,16 @@ function MingoOnboardingCardSkeleton({
|
|
|
9925
9960
|
),
|
|
9926
9961
|
children: /* @__PURE__ */ jsxs38("div", { className: "flex flex-col gap-[var(--spacing-system-xxs)] w-full", children: [
|
|
9927
9962
|
/* @__PURE__ */ jsxs38("div", { className: "flex items-center gap-[var(--spacing-system-xxs)] w-full", children: [
|
|
9928
|
-
/* @__PURE__ */
|
|
9929
|
-
/* @__PURE__ */
|
|
9930
|
-
/* @__PURE__ */
|
|
9931
|
-
/* @__PURE__ */
|
|
9963
|
+
/* @__PURE__ */ jsx51(Skeleton, { className: "size-4 shrink-0 rounded-sm" }),
|
|
9964
|
+
/* @__PURE__ */ jsx51(Skeleton, { className: cn("h-3.5 rounded-sm", titleWidth) }),
|
|
9965
|
+
/* @__PURE__ */ jsx51("span", { className: "flex-1" }),
|
|
9966
|
+
/* @__PURE__ */ jsx51(Skeleton, { className: cn("h-3.5 rounded-sm shrink-0", slashWidth) })
|
|
9932
9967
|
] }),
|
|
9933
9968
|
/* @__PURE__ */ jsxs38("div", { className: "flex flex-col gap-[var(--spacing-system-xxs)]", children: [
|
|
9934
|
-
/* @__PURE__ */
|
|
9935
|
-
descriptionLines === 2 ? /* @__PURE__ */
|
|
9969
|
+
/* @__PURE__ */ jsx51(Skeleton, { className: "h-3.5 w-full rounded-sm" }),
|
|
9970
|
+
descriptionLines === 2 ? /* @__PURE__ */ jsx51(Skeleton, { className: "h-3.5 w-[70%] rounded-sm" }) : null
|
|
9936
9971
|
] }),
|
|
9937
|
-
hasChips ? /* @__PURE__ */
|
|
9972
|
+
hasChips ? /* @__PURE__ */ jsx51("div", { className: "flex flex-wrap items-center gap-[var(--spacing-system-xxs)] mt-[var(--spacing-system-xs)]", children: chipWidths.map((w, i) => /* @__PURE__ */ jsx51(Skeleton, { className: cn("h-7 rounded-md", w) }, i)) }) : null
|
|
9938
9973
|
] })
|
|
9939
9974
|
}
|
|
9940
9975
|
);
|
|
@@ -9943,7 +9978,7 @@ function MingoOnboardingListSkeleton({
|
|
|
9943
9978
|
rows = 6,
|
|
9944
9979
|
className
|
|
9945
9980
|
}) {
|
|
9946
|
-
return /* @__PURE__ */
|
|
9981
|
+
return /* @__PURE__ */ jsx51(
|
|
9947
9982
|
"div",
|
|
9948
9983
|
{
|
|
9949
9984
|
role: "status",
|
|
@@ -9955,7 +9990,7 @@ function MingoOnboardingListSkeleton({
|
|
|
9955
9990
|
),
|
|
9956
9991
|
children: Array.from({ length: rows }).map((_, i) => {
|
|
9957
9992
|
const variant = ROW_VARIANTS[i % ROW_VARIANTS.length];
|
|
9958
|
-
return /* @__PURE__ */
|
|
9993
|
+
return /* @__PURE__ */ jsx51(
|
|
9959
9994
|
MingoOnboardingCardSkeleton,
|
|
9960
9995
|
{
|
|
9961
9996
|
titleWidth: variant.titleWidth,
|
|
@@ -9979,16 +10014,16 @@ var ROW_VARIANTS = [
|
|
|
9979
10014
|
|
|
9980
10015
|
// src/components/chat/mingo-welcome.tsx
|
|
9981
10016
|
init_cn();
|
|
9982
|
-
import * as
|
|
10017
|
+
import * as React24 from "react";
|
|
9983
10018
|
|
|
9984
10019
|
// src/components/chat/mingo-chat-history.tsx
|
|
9985
10020
|
init_cn();
|
|
9986
|
-
import * as
|
|
10021
|
+
import * as React23 from "react";
|
|
9987
10022
|
init_button2();
|
|
9988
10023
|
|
|
9989
10024
|
// src/components/chat/chat-list-empty-state.tsx
|
|
9990
10025
|
init_cn();
|
|
9991
|
-
import { jsx as
|
|
10026
|
+
import { jsx as jsx52, jsxs as jsxs39 } from "react/jsx-runtime";
|
|
9992
10027
|
function ChatListEmptyState({
|
|
9993
10028
|
icon,
|
|
9994
10029
|
title,
|
|
@@ -10003,10 +10038,10 @@ function ChatListEmptyState({
|
|
|
10003
10038
|
className
|
|
10004
10039
|
),
|
|
10005
10040
|
children: [
|
|
10006
|
-
/* @__PURE__ */
|
|
10041
|
+
/* @__PURE__ */ jsx52("span", { className: "flex size-6 shrink-0 items-center justify-center", children: icon }),
|
|
10007
10042
|
/* @__PURE__ */ jsxs39("div", { className: "flex flex-col", children: [
|
|
10008
|
-
/* @__PURE__ */
|
|
10009
|
-
description && /* @__PURE__ */
|
|
10043
|
+
/* @__PURE__ */ jsx52("p", { className: "text-h4", children: title }),
|
|
10044
|
+
description && /* @__PURE__ */ jsx52("p", { className: "text-h6", children: description })
|
|
10010
10045
|
] })
|
|
10011
10046
|
]
|
|
10012
10047
|
}
|
|
@@ -10014,7 +10049,7 @@ function ChatListEmptyState({
|
|
|
10014
10049
|
}
|
|
10015
10050
|
|
|
10016
10051
|
// src/components/chat/mingo-chat-history.tsx
|
|
10017
|
-
import { jsx as
|
|
10052
|
+
import { jsx as jsx53, jsxs as jsxs40 } from "react/jsx-runtime";
|
|
10018
10053
|
function dialogTime(d) {
|
|
10019
10054
|
if (!d.timestamp) return null;
|
|
10020
10055
|
const t = typeof d.timestamp === "string" ? Date.parse(d.timestamp) : d.timestamp.getTime();
|
|
@@ -10055,7 +10090,7 @@ function MingoChatHistoryRow({
|
|
|
10055
10090
|
const hasMenu = !!onRequestRename || !!onRequestArchive;
|
|
10056
10091
|
const owner = dialog.owner;
|
|
10057
10092
|
const hasAvatar = !!(owner?.name || owner?.avatarUrl);
|
|
10058
|
-
const [menuOpen, setMenuOpen] =
|
|
10093
|
+
const [menuOpen, setMenuOpen] = React23.useState(false);
|
|
10059
10094
|
const menuItems = [
|
|
10060
10095
|
onRequestRename && {
|
|
10061
10096
|
id: "rename",
|
|
@@ -10079,7 +10114,7 @@ function MingoChatHistoryRow({
|
|
|
10079
10114
|
isActive ? "bg-ods-open-yellow-secondary" : "bg-ods-bg hover:bg-ods-bg-hover"
|
|
10080
10115
|
),
|
|
10081
10116
|
children: [
|
|
10082
|
-
isActive ? /* @__PURE__ */
|
|
10117
|
+
isActive ? /* @__PURE__ */ jsx53(
|
|
10083
10118
|
"span",
|
|
10084
10119
|
{
|
|
10085
10120
|
"aria-hidden": true,
|
|
@@ -10100,8 +10135,8 @@ function MingoChatHistoryRow({
|
|
|
10100
10135
|
},
|
|
10101
10136
|
className: "flex min-w-0 flex-1 items-center gap-[var(--spacing-system-xsf)] p-[var(--spacing-system-s)] cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ods-accent",
|
|
10102
10137
|
children: [
|
|
10103
|
-
unread > 0 ? /* @__PURE__ */
|
|
10104
|
-
/* @__PURE__ */
|
|
10138
|
+
unread > 0 ? /* @__PURE__ */ jsx53("span", { className: "flex h-8 min-w-8 shrink-0 items-center justify-center rounded-md bg-ods-accent px-[var(--spacing-system-xsf)] text-h5 text-ods-text-on-accent", children: unread > 99 ? "99+" : unread }) : null,
|
|
10139
|
+
/* @__PURE__ */ jsx53(
|
|
10105
10140
|
"span",
|
|
10106
10141
|
{
|
|
10107
10142
|
className: cn(
|
|
@@ -10134,7 +10169,7 @@ function MingoChatHistoryRow({
|
|
|
10134
10169
|
// is open. Hidden on mobile — it's a hover affordance. `peer/menu`
|
|
10135
10170
|
// so the avatar layer (a later sibling) can fade when the trigger
|
|
10136
10171
|
// holds keyboard focus.
|
|
10137
|
-
/* @__PURE__ */
|
|
10172
|
+
/* @__PURE__ */ jsx53(
|
|
10138
10173
|
"span",
|
|
10139
10174
|
{
|
|
10140
10175
|
onClick: (e) => e.stopPropagation(),
|
|
@@ -10142,7 +10177,7 @@ function MingoChatHistoryRow({
|
|
|
10142
10177
|
"peer/menu absolute inset-0 transition-opacity max-md:hidden",
|
|
10143
10178
|
menuOpen ? "opacity-100" : "opacity-0 group-hover/row:opacity-100 focus-within:opacity-100"
|
|
10144
10179
|
),
|
|
10145
|
-
children: /* @__PURE__ */
|
|
10180
|
+
children: /* @__PURE__ */ jsx53(
|
|
10146
10181
|
ActionsMenuDropdown,
|
|
10147
10182
|
{
|
|
10148
10183
|
triggerAriaLabel: "Chat actions",
|
|
@@ -10150,14 +10185,14 @@ function MingoChatHistoryRow({
|
|
|
10150
10185
|
open: menuOpen,
|
|
10151
10186
|
onOpenChange: setMenuOpen,
|
|
10152
10187
|
onCloseAutoFocus: (e) => e.preventDefault(),
|
|
10153
|
-
customTrigger: /* @__PURE__ */
|
|
10188
|
+
customTrigger: /* @__PURE__ */ jsx53(
|
|
10154
10189
|
Button,
|
|
10155
10190
|
{
|
|
10156
10191
|
variant: "transparent",
|
|
10157
10192
|
size: "icon",
|
|
10158
10193
|
"aria-label": "Chat actions",
|
|
10159
10194
|
className: "h-full md:h-full w-full rounded-none p-0 text-ods-text-secondary hover:text-ods-text-primary",
|
|
10160
|
-
children: /* @__PURE__ */
|
|
10195
|
+
children: /* @__PURE__ */ jsx53(Ellipsis01Icon, {})
|
|
10161
10196
|
}
|
|
10162
10197
|
)
|
|
10163
10198
|
}
|
|
@@ -10169,7 +10204,7 @@ function MingoChatHistoryRow({
|
|
|
10169
10204
|
// Avatar layer — clicks fall through to row selection (it covers
|
|
10170
10205
|
// the cell whenever the menu trigger is faded out). On desktop it
|
|
10171
10206
|
// fades for the menu swap; on mobile it's always shown.
|
|
10172
|
-
/* @__PURE__ */
|
|
10207
|
+
/* @__PURE__ */ jsx53(
|
|
10173
10208
|
"span",
|
|
10174
10209
|
{
|
|
10175
10210
|
onClick: () => onSelect?.(dialog.id),
|
|
@@ -10178,7 +10213,7 @@ function MingoChatHistoryRow({
|
|
|
10178
10213
|
"absolute inset-0 flex cursor-pointer items-center justify-center transition-opacity",
|
|
10179
10214
|
hasMenu && (menuOpen ? "opacity-0 pointer-events-none" : "md:group-hover/row:opacity-0 md:group-hover/row:pointer-events-none md:peer-[:focus-within]/menu:opacity-0 md:peer-[:focus-within]/menu:pointer-events-none")
|
|
10180
10215
|
),
|
|
10181
|
-
children: /* @__PURE__ */
|
|
10216
|
+
children: /* @__PURE__ */ jsx53(
|
|
10182
10217
|
SquareAvatar,
|
|
10183
10218
|
{
|
|
10184
10219
|
variant: "round",
|
|
@@ -10207,7 +10242,7 @@ function MingoChatHistorySkeleton({
|
|
|
10207
10242
|
["w-3/5", "w-4/5", "w-2/5", "w-3/4"],
|
|
10208
10243
|
["w-1/2", "w-2/3"]
|
|
10209
10244
|
];
|
|
10210
|
-
return /* @__PURE__ */
|
|
10245
|
+
return /* @__PURE__ */ jsx53(
|
|
10211
10246
|
"div",
|
|
10212
10247
|
{
|
|
10213
10248
|
"aria-hidden": true,
|
|
@@ -10216,12 +10251,12 @@ function MingoChatHistorySkeleton({
|
|
|
10216
10251
|
className
|
|
10217
10252
|
),
|
|
10218
10253
|
children: groups.map((widths, g) => /* @__PURE__ */ jsxs40("div", { className: "flex shrink-0 flex-col gap-[var(--spacing-system-xxs)]", children: [
|
|
10219
|
-
/* @__PURE__ */
|
|
10220
|
-
/* @__PURE__ */
|
|
10254
|
+
/* @__PURE__ */ jsx53("div", { className: "h-3 w-16 animate-pulse rounded bg-ods-border" }),
|
|
10255
|
+
/* @__PURE__ */ jsx53("div", { className: "overflow-hidden rounded-md border border-ods-border", children: widths.map((w, i) => /* @__PURE__ */ jsx53(
|
|
10221
10256
|
"div",
|
|
10222
10257
|
{
|
|
10223
10258
|
className: "flex h-12 items-center bg-ods-bg border-b border-ods-border px-[var(--spacing-system-s)] last:border-b-0",
|
|
10224
|
-
children: /* @__PURE__ */
|
|
10259
|
+
children: /* @__PURE__ */ jsx53("div", { className: cn("h-4 animate-pulse rounded bg-ods-border", w) })
|
|
10225
10260
|
},
|
|
10226
10261
|
i
|
|
10227
10262
|
)) })
|
|
@@ -10241,16 +10276,16 @@ function MingoChatHistory({
|
|
|
10241
10276
|
onLoadMore,
|
|
10242
10277
|
className
|
|
10243
10278
|
}) {
|
|
10244
|
-
const groups =
|
|
10279
|
+
const groups = React23.useMemo(() => groupDialogs(dialogs), [dialogs]);
|
|
10245
10280
|
const noSearchResults = groups.length === 0 && !!searchQuery?.trim();
|
|
10246
10281
|
const { scrollRef, fadeTop, fadeBottom, update: updateFade } = useScrollFade();
|
|
10247
|
-
const sentinelRef =
|
|
10248
|
-
const onLoadMoreRef =
|
|
10282
|
+
const sentinelRef = React23.useRef(null);
|
|
10283
|
+
const onLoadMoreRef = React23.useRef(onLoadMore);
|
|
10249
10284
|
onLoadMoreRef.current = onLoadMore;
|
|
10250
|
-
const isLoadingMoreRef =
|
|
10285
|
+
const isLoadingMoreRef = React23.useRef(isLoadingMore);
|
|
10251
10286
|
isLoadingMoreRef.current = isLoadingMore;
|
|
10252
10287
|
const dialogCount = dialogs.length;
|
|
10253
|
-
|
|
10288
|
+
React23.useEffect(() => {
|
|
10254
10289
|
const root = scrollRef.current;
|
|
10255
10290
|
const sentinel = sentinelRef.current;
|
|
10256
10291
|
if (!root || !sentinel || !hasMore || typeof IntersectionObserver === "undefined")
|
|
@@ -10266,7 +10301,7 @@ function MingoChatHistory({
|
|
|
10266
10301
|
io.observe(sentinel);
|
|
10267
10302
|
return () => io.disconnect();
|
|
10268
10303
|
}, [hasMore, isLoadingMore, dialogCount]);
|
|
10269
|
-
return /* @__PURE__ */
|
|
10304
|
+
return /* @__PURE__ */ jsx53("div", { className: cn("relative flex flex-1 min-h-0 flex-col gap-[var(--spacing-system-m)]", className), children: /* @__PURE__ */ jsxs40("div", { className: "relative flex flex-1 min-h-0 flex-col", children: [
|
|
10270
10305
|
/* @__PURE__ */ jsxs40(
|
|
10271
10306
|
"div",
|
|
10272
10307
|
{
|
|
@@ -10277,10 +10312,10 @@ function MingoChatHistory({
|
|
|
10277
10312
|
noSearchResults ? (
|
|
10278
10313
|
// No search matches — same centred glyph + title + caption layout as
|
|
10279
10314
|
// the other chat-list empty states (Figma 113:60939).
|
|
10280
|
-
/* @__PURE__ */
|
|
10315
|
+
/* @__PURE__ */ jsx53(
|
|
10281
10316
|
ChatListEmptyState,
|
|
10282
10317
|
{
|
|
10283
|
-
icon: /* @__PURE__ */
|
|
10318
|
+
icon: /* @__PURE__ */ jsx53(SearchXmarkIcon, { size: 24 }),
|
|
10284
10319
|
title: "No Chats Found",
|
|
10285
10320
|
description: "Try a different search term"
|
|
10286
10321
|
}
|
|
@@ -10290,8 +10325,8 @@ function MingoChatHistory({
|
|
|
10290
10325
|
{
|
|
10291
10326
|
className: "flex flex-col gap-[var(--spacing-system-xxs)]",
|
|
10292
10327
|
children: [
|
|
10293
|
-
/* @__PURE__ */
|
|
10294
|
-
/* @__PURE__ */
|
|
10328
|
+
/* @__PURE__ */ jsx53("p", { className: "text-h5 text-ods-text-secondary", children: group.label }),
|
|
10329
|
+
/* @__PURE__ */ jsx53("div", { className: "overflow-hidden rounded-md border border-ods-border", children: group.items.map((dialog) => /* @__PURE__ */ jsx53(
|
|
10295
10330
|
MingoChatHistoryRow,
|
|
10296
10331
|
{
|
|
10297
10332
|
dialog,
|
|
@@ -10306,18 +10341,18 @@ function MingoChatHistory({
|
|
|
10306
10341
|
},
|
|
10307
10342
|
group.key
|
|
10308
10343
|
)),
|
|
10309
|
-
hasMore ? /* @__PURE__ */
|
|
10344
|
+
hasMore ? /* @__PURE__ */ jsx53("div", { ref: sentinelRef, className: "h-px shrink-0" }) : null
|
|
10310
10345
|
]
|
|
10311
10346
|
}
|
|
10312
10347
|
),
|
|
10313
|
-
/* @__PURE__ */
|
|
10314
|
-
/* @__PURE__ */
|
|
10348
|
+
/* @__PURE__ */ jsx53(ScrollFadeOverlay, { edge: "top", visible: fadeTop, color: "var(--color-bg-card)", className: "h-12" }),
|
|
10349
|
+
/* @__PURE__ */ jsx53(ScrollFadeOverlay, { edge: "bottom", visible: fadeBottom, color: "var(--color-bg-card)", className: "h-12" })
|
|
10315
10350
|
] }) });
|
|
10316
10351
|
}
|
|
10317
10352
|
|
|
10318
10353
|
// src/components/chat/mingo-welcome.tsx
|
|
10319
10354
|
init_button2();
|
|
10320
|
-
import { Fragment as Fragment13, jsx as
|
|
10355
|
+
import { Fragment as Fragment13, jsx as jsx54, jsxs as jsxs41 } from "react/jsx-runtime";
|
|
10321
10356
|
var DEFAULT_SUBTITLE = "Ready to help with your technical tasks. What can I do for you?";
|
|
10322
10357
|
var DEFAULT_PROMO = {
|
|
10323
10358
|
title: "New to OpenFrame?",
|
|
@@ -10344,8 +10379,8 @@ function MingoWelcome({
|
|
|
10344
10379
|
}) {
|
|
10345
10380
|
const heading = title ?? "Hey, I'm Mingo";
|
|
10346
10381
|
const resolvedPromo = hasExistingChats ? null : promo === void 0 ? onStartGuideChat ? DEFAULT_PROMO : null : promo;
|
|
10347
|
-
const [promoDismissed, setPromoDismissed] =
|
|
10348
|
-
|
|
10382
|
+
const [promoDismissed, setPromoDismissed] = React24.useState(false);
|
|
10383
|
+
React24.useEffect(() => {
|
|
10349
10384
|
if (!resolvedPromo) return;
|
|
10350
10385
|
try {
|
|
10351
10386
|
const store = promoStorage === "session" ? window.sessionStorage : window.localStorage;
|
|
@@ -10353,7 +10388,7 @@ function MingoWelcome({
|
|
|
10353
10388
|
} catch {
|
|
10354
10389
|
}
|
|
10355
10390
|
}, [resolvedPromo, promoStorage, promoStorageKey]);
|
|
10356
|
-
const dismissPromo =
|
|
10391
|
+
const dismissPromo = React24.useCallback(() => {
|
|
10357
10392
|
setPromoDismissed(true);
|
|
10358
10393
|
try {
|
|
10359
10394
|
const store = promoStorage === "session" ? window.sessionStorage : window.localStorage;
|
|
@@ -10375,30 +10410,30 @@ function MingoWelcome({
|
|
|
10375
10410
|
),
|
|
10376
10411
|
children: [
|
|
10377
10412
|
dialogHistory ?? (loadError ? /* @__PURE__ */ jsxs41("div", { className: "flex flex-1 min-h-0 flex-col items-center justify-center gap-[var(--spacing-system-m)] text-center", children: [
|
|
10378
|
-
/* @__PURE__ */
|
|
10413
|
+
/* @__PURE__ */ jsx54(AlertCircleIcon, { className: "h-8 w-8 text-ods-text-secondary shrink-0" }),
|
|
10379
10414
|
/* @__PURE__ */ jsxs41("div", { className: "flex flex-col gap-[var(--spacing-system-xxs)]", children: [
|
|
10380
|
-
/* @__PURE__ */
|
|
10381
|
-
/* @__PURE__ */
|
|
10415
|
+
/* @__PURE__ */ jsx54("p", { className: "text-h4 text-ods-text-primary", children: "Couldn\u2019t load your chats" }),
|
|
10416
|
+
/* @__PURE__ */ jsx54("p", { className: "text-body-sm text-ods-text-secondary", children: "Something went wrong reaching the server. Check your connection and try again." })
|
|
10382
10417
|
] }),
|
|
10383
|
-
onRetry && /* @__PURE__ */
|
|
10418
|
+
onRetry && /* @__PURE__ */ jsx54(
|
|
10384
10419
|
Button,
|
|
10385
10420
|
{
|
|
10386
10421
|
variant: "outline",
|
|
10387
10422
|
size: "small",
|
|
10388
|
-
leftIcon: /* @__PURE__ */
|
|
10423
|
+
leftIcon: /* @__PURE__ */ jsx54(Refresh01RightIcon, {}),
|
|
10389
10424
|
onClick: onRetry,
|
|
10390
10425
|
children: "Try again"
|
|
10391
10426
|
}
|
|
10392
10427
|
)
|
|
10393
|
-
] }) : isLoadingHistory ? /* @__PURE__ */
|
|
10394
|
-
/* @__PURE__ */
|
|
10428
|
+
] }) : isLoadingHistory ? /* @__PURE__ */ jsx54(MingoChatHistorySkeleton, {}) : /* @__PURE__ */ jsx54(Fragment13, { children: /* @__PURE__ */ jsxs41("div", { className: "relative flex flex-1 min-h-0 flex-col", children: [
|
|
10429
|
+
/* @__PURE__ */ jsx54(
|
|
10395
10430
|
"div",
|
|
10396
10431
|
{
|
|
10397
10432
|
ref: scrollRef,
|
|
10398
10433
|
onScroll: updateScrollFade,
|
|
10399
10434
|
className: "flex flex-1 min-h-0 flex-col gap-[var(--spacing-system-m)] overflow-y-auto overscroll-contain",
|
|
10400
10435
|
children: /* @__PURE__ */ jsxs41("div", { className: "flex flex-1 flex-col items-center justify-center gap-[var(--spacing-system-l)] px-[var(--spacing-system-l)] py-[var(--spacing-system-xxl)] text-center", children: [
|
|
10401
|
-
/* @__PURE__ */
|
|
10436
|
+
/* @__PURE__ */ jsx54(
|
|
10402
10437
|
MingoIcon,
|
|
10403
10438
|
{
|
|
10404
10439
|
className: "h-12 w-12",
|
|
@@ -10408,45 +10443,45 @@ function MingoWelcome({
|
|
|
10408
10443
|
}
|
|
10409
10444
|
),
|
|
10410
10445
|
/* @__PURE__ */ jsxs41("div", { className: "flex w-full flex-col gap-[var(--spacing-system-l)]", children: [
|
|
10411
|
-
/* @__PURE__ */
|
|
10412
|
-
/* @__PURE__ */
|
|
10446
|
+
/* @__PURE__ */ jsx54("p", { className: "text-h2 text-ods-text-primary", children: heading }),
|
|
10447
|
+
/* @__PURE__ */ jsx54("p", { className: "text-h4 text-ods-text-secondary", children: subtitle })
|
|
10413
10448
|
] })
|
|
10414
10449
|
] })
|
|
10415
10450
|
}
|
|
10416
10451
|
),
|
|
10417
|
-
/* @__PURE__ */
|
|
10418
|
-
/* @__PURE__ */
|
|
10452
|
+
/* @__PURE__ */ jsx54(ScrollFadeOverlay, { edge: "top", visible: fadeTop, className: "h-12" }),
|
|
10453
|
+
/* @__PURE__ */ jsx54(ScrollFadeOverlay, { edge: "bottom", visible: fadeBottom, className: "h-12" })
|
|
10419
10454
|
] }) })),
|
|
10420
10455
|
showPinnedRegion && /* @__PURE__ */ jsxs41("div", { className: "flex shrink-0 flex-col gap-[var(--spacing-system-m)]", children: [
|
|
10421
10456
|
resolvedPromo && !promoDismissed && /* @__PURE__ */ jsxs41("div", { className: "relative shrink-0 flex items-center gap-[var(--spacing-system-m)] rounded-md border border-ods-border bg-ods-bg p-[var(--spacing-system-m)] pr-[var(--spacing-system-xl)]", children: [
|
|
10422
|
-
/* @__PURE__ */
|
|
10457
|
+
/* @__PURE__ */ jsx54("span", { className: "hidden @2xl:flex size-4 shrink-0 items-center justify-center text-ods-text-primary", children: /* @__PURE__ */ jsx54(Arrow01DownIcon, { size: 16 }) }),
|
|
10423
10458
|
/* @__PURE__ */ jsxs41("div", { className: "flex min-w-0 flex-col items-start gap-1", children: [
|
|
10424
|
-
/* @__PURE__ */
|
|
10425
|
-
/* @__PURE__ */
|
|
10459
|
+
/* @__PURE__ */ jsx54("span", { className: "text-h3 text-ods-text-primary", children: resolvedPromo.title }),
|
|
10460
|
+
/* @__PURE__ */ jsx54("span", { className: "text-h6 text-ods-text-secondary", children: resolvedPromo.description })
|
|
10426
10461
|
] }),
|
|
10427
|
-
/* @__PURE__ */
|
|
10462
|
+
/* @__PURE__ */ jsx54(
|
|
10428
10463
|
"button",
|
|
10429
10464
|
{
|
|
10430
10465
|
type: "button",
|
|
10431
10466
|
onClick: dismissPromo,
|
|
10432
10467
|
"aria-label": "Dismiss",
|
|
10433
10468
|
className: "absolute right-2 top-2 text-ods-text-secondary transition-colors hover:text-ods-text-primary focus:outline-none focus-visible:ring-2 focus-visible:ring-ods-accent rounded-sm",
|
|
10434
|
-
children: /* @__PURE__ */
|
|
10469
|
+
children: /* @__PURE__ */ jsx54(XmarkIcon, { size: 16 })
|
|
10435
10470
|
}
|
|
10436
10471
|
)
|
|
10437
10472
|
] }),
|
|
10438
10473
|
(onStartGuideChat || quickActions && quickActions.length > 0) && /* @__PURE__ */ jsxs41("div", { className: "flex shrink-0 flex-col gap-[var(--spacing-system-xsf)]", children: [
|
|
10439
|
-
onStartGuideChat && /* @__PURE__ */
|
|
10474
|
+
onStartGuideChat && /* @__PURE__ */ jsx54(
|
|
10440
10475
|
QuickActionChipButton,
|
|
10441
10476
|
{
|
|
10442
10477
|
label: "Start Guide Chat",
|
|
10443
|
-
icon: /* @__PURE__ */
|
|
10478
|
+
icon: /* @__PURE__ */ jsx54(CompassIcon, { size: 16 }),
|
|
10444
10479
|
variant: hasExistingChats ? "outline" : "primary",
|
|
10445
10480
|
onSelect: onStartGuideChat,
|
|
10446
10481
|
className: "self-start"
|
|
10447
10482
|
}
|
|
10448
10483
|
),
|
|
10449
|
-
quickActions && quickActions.length > 0 && /* @__PURE__ */
|
|
10484
|
+
quickActions && quickActions.length > 0 && /* @__PURE__ */ jsx54(
|
|
10450
10485
|
QuickActionWall,
|
|
10451
10486
|
{
|
|
10452
10487
|
chips: quickActions.map((action) => ({
|
|
@@ -10478,8 +10513,8 @@ function MingoWelcome({
|
|
|
10478
10513
|
|
|
10479
10514
|
// src/components/chat/guide-welcome.tsx
|
|
10480
10515
|
init_cn();
|
|
10481
|
-
import * as
|
|
10482
|
-
import { jsx as
|
|
10516
|
+
import * as React25 from "react";
|
|
10517
|
+
import { jsx as jsx55, jsxs as jsxs42 } from "react/jsx-runtime";
|
|
10483
10518
|
var DEFAULT_TITLE = "Guide Mode Chat";
|
|
10484
10519
|
function GuideWelcome({
|
|
10485
10520
|
title = DEFAULT_TITLE,
|
|
@@ -10495,7 +10530,7 @@ function GuideWelcome({
|
|
|
10495
10530
|
className
|
|
10496
10531
|
}) {
|
|
10497
10532
|
const { scrollRef, fadeTop, fadeBottom, update: updateScrollFade } = useScrollFade();
|
|
10498
|
-
const chipItems =
|
|
10533
|
+
const chipItems = React25.useMemo(
|
|
10499
10534
|
() => quickActions.map((action) => ({
|
|
10500
10535
|
id: action.id,
|
|
10501
10536
|
label: action.label,
|
|
@@ -10536,8 +10571,8 @@ function GuideWelcome({
|
|
|
10536
10571
|
icon && (icon.name || icon.url) ? (
|
|
10537
10572
|
// Agent-mode identity glyph (chat-config Identity tab). Sized to
|
|
10538
10573
|
// match the default Mingo mark (48px).
|
|
10539
|
-
/* @__PURE__ */
|
|
10540
|
-
) : /* @__PURE__ */
|
|
10574
|
+
/* @__PURE__ */ jsx55(EntityIcon, { icon: { name: icon.name, url: icon.url, props: icon.props }, size: 48 })
|
|
10575
|
+
) : /* @__PURE__ */ jsx55(
|
|
10541
10576
|
MingoIcon,
|
|
10542
10577
|
{
|
|
10543
10578
|
className: "h-12 w-12",
|
|
@@ -10547,18 +10582,18 @@ function GuideWelcome({
|
|
|
10547
10582
|
}
|
|
10548
10583
|
),
|
|
10549
10584
|
/* @__PURE__ */ jsxs42("div", { className: "flex w-full flex-col gap-[var(--spacing-system-l)]", children: [
|
|
10550
|
-
/* @__PURE__ */
|
|
10551
|
-
subtitle ? /* @__PURE__ */
|
|
10585
|
+
/* @__PURE__ */ jsx55("p", { className: "text-h2 text-ods-text-primary", children: title }),
|
|
10586
|
+
subtitle ? /* @__PURE__ */ jsx55("p", { className: "text-h4 text-ods-text-secondary", children: subtitle }) : subtitleLoading ? /* @__PURE__ */ jsx55("div", { className: "flex w-full justify-center", children: /* @__PURE__ */ jsx55(Skeleton, { className: "h-5 w-3/4 max-w-80 rounded-sm" }) }) : null
|
|
10552
10587
|
] })
|
|
10553
10588
|
] }),
|
|
10554
10589
|
children
|
|
10555
10590
|
]
|
|
10556
10591
|
}
|
|
10557
10592
|
),
|
|
10558
|
-
/* @__PURE__ */
|
|
10559
|
-
/* @__PURE__ */
|
|
10593
|
+
/* @__PURE__ */ jsx55(ScrollFadeOverlay, { edge: "top", visible: fadeTop, className: "h-12" }),
|
|
10594
|
+
/* @__PURE__ */ jsx55(ScrollFadeOverlay, { edge: "bottom", visible: fadeBottom, className: "h-12" })
|
|
10560
10595
|
] }),
|
|
10561
|
-
quickActions.length > 0 && /* @__PURE__ */
|
|
10596
|
+
quickActions.length > 0 && /* @__PURE__ */ jsx55(
|
|
10562
10597
|
QuickActionWall,
|
|
10563
10598
|
{
|
|
10564
10599
|
chips: chipItems,
|
|
@@ -10580,35 +10615,6 @@ function GuideWelcome({
|
|
|
10580
10615
|
|
|
10581
10616
|
// src/components/chat/guide-mode-banner.tsx
|
|
10582
10617
|
init_cn();
|
|
10583
|
-
|
|
10584
|
-
// src/components/ui/tooltip.tsx
|
|
10585
|
-
init_cn();
|
|
10586
|
-
import * as React25 from "react";
|
|
10587
|
-
import * as TooltipPrimitive from "@radix-ui/react-tooltip";
|
|
10588
|
-
import { jsx as jsx55 } from "react/jsx-runtime";
|
|
10589
|
-
var TooltipProvider = TooltipPrimitive.Provider;
|
|
10590
|
-
var Tooltip = TooltipPrimitive.Root;
|
|
10591
|
-
var TooltipTrigger = TooltipPrimitive.Trigger;
|
|
10592
|
-
var TooltipContent = React25.forwardRef(({ className, sideOffset = 4, ...props }, ref) => {
|
|
10593
|
-
const container = usePortalContainer();
|
|
10594
|
-
return /* @__PURE__ */ jsx55(TooltipPrimitive.Portal, { container: container ?? void 0, children: /* @__PURE__ */ jsx55(
|
|
10595
|
-
TooltipPrimitive.Content,
|
|
10596
|
-
{
|
|
10597
|
-
ref,
|
|
10598
|
-
sideOffset,
|
|
10599
|
-
className: cn(
|
|
10600
|
-
// `max-h` uses Radix's available-height var so tall content scrolls inside
|
|
10601
|
-
// the tooltip instead of overflowing off-screen (only engages on overflow).
|
|
10602
|
-
"z-[1400] max-h-[var(--radix-popper-available-height)] overflow-y-auto rounded-md bg-ods-card border border-ods-border px-3 py-2 text-h6 text-ods-text-primary shadow-lg animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
|
|
10603
|
-
className
|
|
10604
|
-
),
|
|
10605
|
-
...props
|
|
10606
|
-
}
|
|
10607
|
-
) });
|
|
10608
|
-
});
|
|
10609
|
-
TooltipContent.displayName = TooltipPrimitive.Content.displayName;
|
|
10610
|
-
|
|
10611
|
-
// src/components/chat/guide-mode-banner.tsx
|
|
10612
10618
|
import { jsx as jsx56, jsxs as jsxs43 } from "react/jsx-runtime";
|
|
10613
10619
|
var DEFAULT_LABEL = "Guide Mode Chat";
|
|
10614
10620
|
var DEFAULT_TOOLTIP = "A quick session chat for exploring OpenFrame. Mingo answers how-to questions and guides you through configuration, but won\u2019t touch devices, run scripts, or perform any actions.";
|
|
@@ -41033,7 +41039,7 @@ function Board({
|
|
|
41033
41039
|
// src/components/features/board/types.ts
|
|
41034
41040
|
var STATUS_DEFAULTS = {
|
|
41035
41041
|
ACTIVE: { label: "Active", color: "#5ea62e" },
|
|
41036
|
-
AI_ASSISTANCE: { label: "AI
|
|
41042
|
+
AI_ASSISTANCE: { label: "AI Handling", color: "#888888" },
|
|
41037
41043
|
TECH_REQUIRED: { label: "Tech Required", color: "#e1b32f" },
|
|
41038
41044
|
ON_HOLD: { label: "On Hold", color: "#f36666" },
|
|
41039
41045
|
RESOLVED: { label: "Resolved", color: "#888888" },
|
|
@@ -49182,23 +49188,13 @@ function useTestRunState(campaign) {
|
|
|
49182
49188
|
// src/components/ui/ticket-info-section.tsx
|
|
49183
49189
|
init_cn();
|
|
49184
49190
|
|
|
49185
|
-
// src/components/ui/ticket-detail-section.tsx
|
|
49186
|
-
init_cn();
|
|
49187
|
-
import { jsx as jsx375, jsxs as jsxs295 } from "react/jsx-runtime";
|
|
49188
|
-
function TicketDetailSection({ label, children, className }) {
|
|
49189
|
-
return /* @__PURE__ */ jsxs295("div", { className: cn("flex flex-col gap-1", className), children: [
|
|
49190
|
-
/* @__PURE__ */ jsx375("p", { className: "text-h5 text-ods-text-secondary", children: label }),
|
|
49191
|
-
children
|
|
49192
|
-
] });
|
|
49193
|
-
}
|
|
49194
|
-
|
|
49195
49191
|
// src/components/ui/ticket-attachments-list.tsx
|
|
49196
49192
|
init_cn();
|
|
49197
|
-
import { jsx as
|
|
49193
|
+
import { jsx as jsx375, jsxs as jsxs295 } from "react/jsx-runtime";
|
|
49198
49194
|
function TicketAttachmentsList({ attachments, className, size: size2 = "default" }) {
|
|
49199
49195
|
if (attachments.length === 0) return null;
|
|
49200
49196
|
const compact = size2 === "compact";
|
|
49201
|
-
return /* @__PURE__ */
|
|
49197
|
+
return /* @__PURE__ */ jsx375("div", { className: cn("rounded-[6px] border border-ods-border overflow-hidden", className), children: attachments.map((attachment, index) => /* @__PURE__ */ jsxs295(
|
|
49202
49198
|
"div",
|
|
49203
49199
|
{
|
|
49204
49200
|
className: cn(
|
|
@@ -49207,7 +49203,7 @@ function TicketAttachmentsList({ attachments, className, size: size2 = "default"
|
|
|
49207
49203
|
index < attachments.length - 1 && "border-b border-ods-border"
|
|
49208
49204
|
),
|
|
49209
49205
|
children: [
|
|
49210
|
-
attachment.thumbnailSrc ? /* @__PURE__ */
|
|
49206
|
+
attachment.thumbnailSrc ? /* @__PURE__ */ jsx375(
|
|
49211
49207
|
SquareAvatar,
|
|
49212
49208
|
{
|
|
49213
49209
|
src: attachment.thumbnailSrc,
|
|
@@ -49215,18 +49211,18 @@ function TicketAttachmentsList({ attachments, className, size: size2 = "default"
|
|
|
49215
49211
|
size: compact ? "sm" : "md",
|
|
49216
49212
|
className: "shrink-0"
|
|
49217
49213
|
}
|
|
49218
|
-
) : /* @__PURE__ */
|
|
49214
|
+
) : /* @__PURE__ */ jsx375(
|
|
49219
49215
|
"div",
|
|
49220
49216
|
{
|
|
49221
49217
|
className: cn(
|
|
49222
49218
|
"shrink-0 flex items-center justify-center rounded-[6px] bg-ods-card border border-ods-border",
|
|
49223
49219
|
compact ? "size-8" : "size-10"
|
|
49224
49220
|
),
|
|
49225
|
-
children: /* @__PURE__ */
|
|
49221
|
+
children: /* @__PURE__ */ jsx375(FileIcon, { className: cn("text-ods-text-secondary", compact ? "size-4" : "size-6") })
|
|
49226
49222
|
}
|
|
49227
49223
|
),
|
|
49228
|
-
/* @__PURE__ */
|
|
49229
|
-
/* @__PURE__ */
|
|
49224
|
+
/* @__PURE__ */ jsxs295("div", { className: "flex-1 min-w-0 overflow-hidden", children: [
|
|
49225
|
+
/* @__PURE__ */ jsx375(
|
|
49230
49226
|
"p",
|
|
49231
49227
|
{
|
|
49232
49228
|
className: cn("text-ods-text-primary truncate", compact ? "text-h5" : "text-h4"),
|
|
@@ -49234,26 +49230,26 @@ function TicketAttachmentsList({ attachments, className, size: size2 = "default"
|
|
|
49234
49230
|
children: attachment.fileName
|
|
49235
49231
|
}
|
|
49236
49232
|
),
|
|
49237
|
-
attachment.fileSize && /* @__PURE__ */
|
|
49233
|
+
attachment.fileSize && /* @__PURE__ */ jsx375("p", { className: "text-h6 text-ods-text-secondary", children: attachment.fileSize })
|
|
49238
49234
|
] }),
|
|
49239
|
-
attachment.onDelete && /* @__PURE__ */
|
|
49235
|
+
attachment.onDelete && /* @__PURE__ */ jsx375(
|
|
49240
49236
|
"button",
|
|
49241
49237
|
{
|
|
49242
49238
|
type: "button",
|
|
49243
49239
|
onClick: attachment.onDelete,
|
|
49244
49240
|
className: "shrink-0 text-ods-text-secondary hover:text-ods-error transition-colors",
|
|
49245
49241
|
"aria-label": `Delete ${attachment.fileName}`,
|
|
49246
|
-
children: /* @__PURE__ */
|
|
49242
|
+
children: /* @__PURE__ */ jsx375(TrashIcon, { className: compact ? "size-4" : "size-5" })
|
|
49247
49243
|
}
|
|
49248
49244
|
),
|
|
49249
|
-
attachment.onDownload && /* @__PURE__ */
|
|
49245
|
+
attachment.onDownload && /* @__PURE__ */ jsx375(
|
|
49250
49246
|
"button",
|
|
49251
49247
|
{
|
|
49252
49248
|
type: "button",
|
|
49253
49249
|
onClick: attachment.onDownload,
|
|
49254
49250
|
className: "shrink-0 text-ods-text-secondary hover:text-ods-text-primary transition-colors",
|
|
49255
49251
|
"aria-label": `Download ${attachment.fileName}`,
|
|
49256
|
-
children: /* @__PURE__ */
|
|
49252
|
+
children: /* @__PURE__ */ jsx375(Download02Icon, { className: compact ? "size-4" : "size-6" })
|
|
49257
49253
|
}
|
|
49258
49254
|
)
|
|
49259
49255
|
]
|
|
@@ -49262,6 +49258,16 @@ function TicketAttachmentsList({ attachments, className, size: size2 = "default"
|
|
|
49262
49258
|
)) });
|
|
49263
49259
|
}
|
|
49264
49260
|
|
|
49261
|
+
// src/components/ui/ticket-detail-section.tsx
|
|
49262
|
+
init_cn();
|
|
49263
|
+
import { jsx as jsx376, jsxs as jsxs296 } from "react/jsx-runtime";
|
|
49264
|
+
function TicketDetailSection({ label, children, className }) {
|
|
49265
|
+
return /* @__PURE__ */ jsxs296("div", { className: cn("flex flex-col gap-1", className), children: [
|
|
49266
|
+
/* @__PURE__ */ jsx376("p", { className: "text-h5 text-ods-text-secondary", children: label }),
|
|
49267
|
+
children
|
|
49268
|
+
] });
|
|
49269
|
+
}
|
|
49270
|
+
|
|
49265
49271
|
// src/components/ui/ticket-notes-section.tsx
|
|
49266
49272
|
import * as React138 from "react";
|
|
49267
49273
|
init_cn();
|
|
@@ -49451,7 +49457,12 @@ function TicketNotesSection({
|
|
|
49451
49457
|
|
|
49452
49458
|
// src/components/ui/ticket-info-section.tsx
|
|
49453
49459
|
import { Fragment as Fragment77, jsx as jsx379, jsxs as jsxs299 } from "react/jsx-runtime";
|
|
49454
|
-
function InfoCell2({
|
|
49460
|
+
function InfoCell2({
|
|
49461
|
+
value,
|
|
49462
|
+
label,
|
|
49463
|
+
icon,
|
|
49464
|
+
onClick
|
|
49465
|
+
}) {
|
|
49455
49466
|
return /* @__PURE__ */ jsx379("div", { className: "flex-1 min-w-0 overflow-hidden", children: /* @__PURE__ */ jsxs299("div", { className: "flex flex-col justify-center", children: [
|
|
49456
49467
|
/* @__PURE__ */ jsxs299("div", { className: "flex items-center gap-1 w-full min-w-0", children: [
|
|
49457
49468
|
icon && /* @__PURE__ */ jsx379("span", { className: "shrink-0 size-4 flex items-center justify-center text-ods-text-secondary", children: icon }),
|
|
@@ -49478,6 +49489,8 @@ function TicketInfoSection({
|
|
|
49478
49489
|
statusOptions,
|
|
49479
49490
|
onStatusSelect,
|
|
49480
49491
|
isStatusPending,
|
|
49492
|
+
isStatusDisabled,
|
|
49493
|
+
statusDisabledReason,
|
|
49481
49494
|
onExpand,
|
|
49482
49495
|
expanded = false,
|
|
49483
49496
|
className,
|
|
@@ -49492,110 +49505,95 @@ function TicketInfoSection({
|
|
|
49492
49505
|
onDeleteNote,
|
|
49493
49506
|
isAddingNote
|
|
49494
49507
|
}) {
|
|
49495
|
-
return /* @__PURE__ */ jsxs299(
|
|
49496
|
-
"div",
|
|
49497
|
-
|
|
49498
|
-
|
|
49499
|
-
|
|
49500
|
-
|
|
49501
|
-
|
|
49502
|
-
|
|
49503
|
-
|
|
49504
|
-
|
|
49505
|
-
|
|
49506
|
-
|
|
49507
|
-
|
|
49508
|
-
|
|
49509
|
-
|
|
49510
|
-
|
|
49511
|
-
|
|
49512
|
-
|
|
49513
|
-
|
|
49508
|
+
return /* @__PURE__ */ jsxs299("div", { className: cn("rounded-[6px] border border-ods-border overflow-hidden", className), children: [
|
|
49509
|
+
/* @__PURE__ */ jsxs299("div", { className: "grid grid-cols-2 lg:grid-cols-[1fr_1fr_1fr_auto] gap-4 px-4 py-3 bg-ods-card border-b border-ods-border items-center", children: [
|
|
49510
|
+
/* @__PURE__ */ jsxs299("div", { className: "flex items-center gap-2 min-w-0", children: [
|
|
49511
|
+
/* @__PURE__ */ jsx379(
|
|
49512
|
+
SquareAvatar,
|
|
49513
|
+
{
|
|
49514
|
+
src: organization?.imageSrc,
|
|
49515
|
+
alt: organization?.name,
|
|
49516
|
+
fallback: organization?.name || "Org",
|
|
49517
|
+
size: "md",
|
|
49518
|
+
className: "shrink-0"
|
|
49519
|
+
}
|
|
49520
|
+
),
|
|
49521
|
+
/* @__PURE__ */ jsx379(InfoCell2, { value: organization?.name || "Unassigned", label: "Organization" })
|
|
49522
|
+
] }),
|
|
49523
|
+
/* @__PURE__ */ jsx379("div", { className: "min-w-0", children: assigned ? /* @__PURE__ */ jsx379(
|
|
49524
|
+
AssigneeDropdown,
|
|
49525
|
+
{
|
|
49526
|
+
currentAssignee: assigned.currentAssignee,
|
|
49527
|
+
options: assigned.options,
|
|
49528
|
+
isLoading: assigned.isLoading,
|
|
49529
|
+
isPending: assigned.isPending,
|
|
49530
|
+
onAssign: assigned.onAssign
|
|
49531
|
+
}
|
|
49532
|
+
) : /* @__PURE__ */ jsxs299("div", { className: "min-w-0", children: [
|
|
49533
|
+
/* @__PURE__ */ jsxs299("div", { className: "flex items-center gap-1 text-h4 text-ods-text-secondary", children: [
|
|
49534
|
+
/* @__PURE__ */ jsx379(UserIcon2, { className: "size-4 shrink-0" }),
|
|
49535
|
+
/* @__PURE__ */ jsx379("span", { className: "truncate", children: "Unassigned" })
|
|
49536
|
+
] }),
|
|
49537
|
+
/* @__PURE__ */ jsx379("span", { className: "text-h6 text-ods-text-secondary truncate block", children: "Assigned" })
|
|
49538
|
+
] }) }),
|
|
49539
|
+
/* @__PURE__ */ jsx379(InfoCell2, { value: device?.name || "Unassigned", label: "Device", icon: device?.icon, onClick: device?.onClick }),
|
|
49540
|
+
/* @__PURE__ */ jsxs299("div", { className: "flex items-center gap-4 min-w-0", children: [
|
|
49541
|
+
(status || statusLabel) && /* @__PURE__ */ jsx379("div", { className: "min-w-0", children: /* @__PURE__ */ jsx379(
|
|
49542
|
+
TicketStatusTag,
|
|
49543
|
+
{
|
|
49544
|
+
status: status ?? "",
|
|
49545
|
+
label: statusLabel,
|
|
49546
|
+
color: statusColor,
|
|
49547
|
+
options: statusOptions,
|
|
49548
|
+
onSelect: onStatusSelect,
|
|
49549
|
+
isPending: isStatusPending,
|
|
49550
|
+
disabled: isStatusDisabled,
|
|
49551
|
+
disabledReason: statusDisabledReason
|
|
49552
|
+
}
|
|
49553
|
+
) }),
|
|
49554
|
+
onExpand && /* @__PURE__ */ jsx379(
|
|
49555
|
+
"button",
|
|
49556
|
+
{
|
|
49557
|
+
type: "button",
|
|
49558
|
+
onClick: onExpand,
|
|
49559
|
+
className: cn(
|
|
49560
|
+
"shrink-0 flex items-center justify-center p-3 rounded-[6px]",
|
|
49561
|
+
"bg-ods-card border border-ods-border",
|
|
49562
|
+
"hover:bg-ods-bg-hover transition-colors duration-150"
|
|
49514
49563
|
),
|
|
49515
|
-
|
|
49516
|
-
|
|
49517
|
-
|
|
49518
|
-
AssigneeDropdown,
|
|
49519
|
-
{
|
|
49520
|
-
currentAssignee: assigned.currentAssignee,
|
|
49521
|
-
options: assigned.options,
|
|
49522
|
-
isLoading: assigned.isLoading,
|
|
49523
|
-
isPending: assigned.isPending,
|
|
49524
|
-
onAssign: assigned.onAssign
|
|
49525
|
-
}
|
|
49526
|
-
) : /* @__PURE__ */ jsxs299("div", { className: "min-w-0", children: [
|
|
49527
|
-
/* @__PURE__ */ jsxs299("div", { className: "flex items-center gap-1 text-h4 text-ods-text-secondary", children: [
|
|
49528
|
-
/* @__PURE__ */ jsx379(UserIcon2, { className: "size-4 shrink-0" }),
|
|
49529
|
-
/* @__PURE__ */ jsx379("span", { className: "truncate", children: "Unassigned" })
|
|
49530
|
-
] }),
|
|
49531
|
-
/* @__PURE__ */ jsx379("span", { className: "text-h6 text-ods-text-secondary truncate block", children: "Assigned" })
|
|
49532
|
-
] }) }),
|
|
49533
|
-
/* @__PURE__ */ jsx379(
|
|
49534
|
-
InfoCell2,
|
|
49535
|
-
{
|
|
49536
|
-
value: device?.name || "Unassigned",
|
|
49537
|
-
label: "Device",
|
|
49538
|
-
icon: device?.icon,
|
|
49539
|
-
onClick: device?.onClick
|
|
49540
|
-
}
|
|
49541
|
-
),
|
|
49542
|
-
/* @__PURE__ */ jsxs299("div", { className: "flex items-center gap-4 min-w-0", children: [
|
|
49543
|
-
(status || statusLabel) && /* @__PURE__ */ jsx379("div", { className: "min-w-0", children: /* @__PURE__ */ jsx379(
|
|
49544
|
-
TicketStatusTag,
|
|
49545
|
-
{
|
|
49546
|
-
status: status ?? "",
|
|
49547
|
-
label: statusLabel,
|
|
49548
|
-
color: statusColor,
|
|
49549
|
-
options: statusOptions,
|
|
49550
|
-
onSelect: onStatusSelect,
|
|
49551
|
-
isPending: isStatusPending
|
|
49552
|
-
}
|
|
49553
|
-
) }),
|
|
49554
|
-
onExpand && /* @__PURE__ */ jsx379(
|
|
49555
|
-
"button",
|
|
49564
|
+
"aria-label": expanded ? "Collapse" : "Expand",
|
|
49565
|
+
children: /* @__PURE__ */ jsx379(
|
|
49566
|
+
Chevron02DownIcon,
|
|
49556
49567
|
{
|
|
49557
|
-
type: "button",
|
|
49558
|
-
onClick: onExpand,
|
|
49559
49568
|
className: cn(
|
|
49560
|
-
"
|
|
49561
|
-
|
|
49562
|
-
"hover:bg-ods-bg-hover transition-colors duration-150"
|
|
49563
|
-
),
|
|
49564
|
-
"aria-label": expanded ? "Collapse" : "Expand",
|
|
49565
|
-
children: /* @__PURE__ */ jsx379(
|
|
49566
|
-
Chevron02DownIcon,
|
|
49567
|
-
{
|
|
49568
|
-
className: cn(
|
|
49569
|
-
"size-6 text-ods-text-primary transition-transform duration-200",
|
|
49570
|
-
expanded && "rotate-180"
|
|
49571
|
-
)
|
|
49572
|
-
}
|
|
49569
|
+
"size-6 text-ods-text-primary transition-transform duration-200",
|
|
49570
|
+
expanded && "rotate-180"
|
|
49573
49571
|
)
|
|
49574
49572
|
}
|
|
49575
49573
|
)
|
|
49576
|
-
|
|
49577
|
-
|
|
49578
|
-
|
|
49579
|
-
|
|
49580
|
-
|
|
49581
|
-
|
|
49582
|
-
|
|
49583
|
-
|
|
49584
|
-
|
|
49585
|
-
|
|
49586
|
-
|
|
49587
|
-
|
|
49588
|
-
|
|
49589
|
-
|
|
49590
|
-
|
|
49591
|
-
|
|
49592
|
-
|
|
49593
|
-
|
|
49594
|
-
|
|
49595
|
-
|
|
49596
|
-
]
|
|
49597
|
-
}
|
|
49598
|
-
);
|
|
49574
|
+
}
|
|
49575
|
+
)
|
|
49576
|
+
] })
|
|
49577
|
+
] }),
|
|
49578
|
+
expanded && /* @__PURE__ */ jsxs299(Fragment77, { children: [
|
|
49579
|
+
createdAt && /* @__PURE__ */ jsx379("div", { className: "grid grid-cols-2 gap-4 px-4 py-3 bg-ods-bg border-b border-ods-border items-center", children: /* @__PURE__ */ jsx379(InfoCell2, { value: createdAt, label: "Created" }) }),
|
|
49580
|
+
/* @__PURE__ */ jsxs299("div", { className: "flex flex-col gap-4 p-4 bg-ods-bg border-b border-ods-border", children: [
|
|
49581
|
+
description && /* @__PURE__ */ jsx379(SimpleMarkdownRenderer, { content: description }),
|
|
49582
|
+
attachments && attachments.length > 0 && /* @__PURE__ */ jsx379(TicketDetailSection, { label: "Attachments", children: /* @__PURE__ */ jsx379(TicketAttachmentsList, { attachments }) }),
|
|
49583
|
+
tags && tags.length > 0 && /* @__PURE__ */ jsx379(TicketDetailSection, { label: "Tags", children: /* @__PURE__ */ jsx379("div", { className: "flex flex-wrap gap-2 min-w-0", children: tags.map((tag) => /* @__PURE__ */ jsx379(Tag, { label: tag, variant: "outline", className: "max-w-full" }, tag)) }) }),
|
|
49584
|
+
(notes || onAddNote) && /* @__PURE__ */ jsx379(TicketDetailSection, { label: "Notes", children: /* @__PURE__ */ jsx379(
|
|
49585
|
+
TicketNotesSection,
|
|
49586
|
+
{
|
|
49587
|
+
notes: notes || [],
|
|
49588
|
+
onAddNote,
|
|
49589
|
+
onEditNote,
|
|
49590
|
+
onDeleteNote,
|
|
49591
|
+
isAddingNote
|
|
49592
|
+
}
|
|
49593
|
+
) })
|
|
49594
|
+
] })
|
|
49595
|
+
] })
|
|
49596
|
+
] });
|
|
49599
49597
|
}
|
|
49600
49598
|
|
|
49601
49599
|
// src/components/ui/take-over-ticket-modal.tsx
|
|
@@ -62662,9 +62660,6 @@ export {
|
|
|
62662
62660
|
formatBioText,
|
|
62663
62661
|
SquareAvatar,
|
|
62664
62662
|
AssigneeDropdown,
|
|
62665
|
-
ActionsMenu,
|
|
62666
|
-
ActionsMenuDropdown,
|
|
62667
|
-
ColorSwatch,
|
|
62668
62663
|
DESIGN_PALETTE,
|
|
62669
62664
|
getContrastRatio,
|
|
62670
62665
|
pickReadableTextColor,
|
|
@@ -62680,6 +62675,13 @@ export {
|
|
|
62680
62675
|
rgbToHex,
|
|
62681
62676
|
deriveHoverColor,
|
|
62682
62677
|
deriveActiveColor,
|
|
62678
|
+
ActionsMenu,
|
|
62679
|
+
ActionsMenuDropdown,
|
|
62680
|
+
ColorSwatch,
|
|
62681
|
+
TooltipProvider,
|
|
62682
|
+
Tooltip,
|
|
62683
|
+
TooltipTrigger,
|
|
62684
|
+
TooltipContent,
|
|
62683
62685
|
resolveTicketStatus,
|
|
62684
62686
|
getTicketStatusConfig,
|
|
62685
62687
|
getTicketStatusTag,
|
|
@@ -62982,10 +62984,6 @@ export {
|
|
|
62982
62984
|
MingoChatHistory,
|
|
62983
62985
|
MingoWelcome,
|
|
62984
62986
|
GuideWelcome,
|
|
62985
|
-
TooltipProvider,
|
|
62986
|
-
Tooltip,
|
|
62987
|
-
TooltipTrigger,
|
|
62988
|
-
TooltipContent,
|
|
62989
62987
|
GuideModeBanner,
|
|
62990
62988
|
TabSelector,
|
|
62991
62989
|
MingoHistoryRail,
|
|
@@ -63644,8 +63642,8 @@ export {
|
|
|
63644
63642
|
TimingStat,
|
|
63645
63643
|
TestRunStatusStat,
|
|
63646
63644
|
useTestRunState,
|
|
63647
|
-
TicketDetailSection,
|
|
63648
63645
|
TicketAttachmentsList,
|
|
63646
|
+
TicketDetailSection,
|
|
63649
63647
|
TicketNoteCard,
|
|
63650
63648
|
TicketNotesSection,
|
|
63651
63649
|
TicketInfoSection,
|
|
@@ -63698,4 +63696,4 @@ export {
|
|
|
63698
63696
|
LogsList,
|
|
63699
63697
|
assets
|
|
63700
63698
|
};
|
|
63701
|
-
//# sourceMappingURL=chunk-
|
|
63699
|
+
//# sourceMappingURL=chunk-BK7V6CH5.js.map
|