goldenChat base source add

This commit is contained in:
aidev
2026-05-23 15:11:48 +09:00
commit a4ea7762b5
2081 changed files with 1155760 additions and 0 deletions
@@ -0,0 +1,106 @@
/**
* 알림 팝업 표시 방식 미니 아이콘 (위치 + 배치)
*/
import React from 'react';
import type { TradeAlertPopupLayout, TradeAlertPopupPosition } from '../utils/tradeAlertPopupLayout';
interface Props {
position: TradeAlertPopupPosition;
layout: TradeAlertPopupLayout;
size?: number;
className?: string;
}
/** 화면 프레임 안 카드 배치를 그린 24×18 미니 프리뷰 */
const ICON_H = 18;
function slotOrigin(
position: TradeAlertPopupPosition,
cols: number,
rows: number,
): { x: number; y: number } {
const blockW = cols === 1 ? 5 : cols === 3 ? 9.4 : 6.2;
const blockH = rows === 1 ? 3.2 : rows === 3 ? 10.2 : 6.2;
switch (position) {
case 'left':
return { x: 2, y: (ICON_H - blockH) / 2 };
case 'bottom':
return { x: (24 - blockW) / 2, y: ICON_H - blockH - 1.5 };
case 'right':
default:
return { x: 24 - blockW - 2, y: (ICON_H - blockH) / 2 };
}
}
export const TradeAlertPopupModeIcon: React.FC<Props> = ({
position,
layout,
size = 22,
className,
}) => {
const w = 24;
const h = ICON_H;
const cards: React.ReactNode[] = [];
const card = (x: number, y: number, cw: number, ch: number, key: string) => (
<rect
key={key}
x={x}
y={y}
width={cw}
height={ch}
rx={1}
fill="currentColor"
opacity={0.85}
/>
);
if (layout === 'single') {
const slots = slotOrigin(position, 1, 1);
cards.push(card(slots.x, slots.y, 5, 4, 's'));
} else if (layout === 'strip') {
const o = slotOrigin(position, 3, 1);
for (let i = 0; i < 3; i++) {
cards.push(card(o.x + i * 3.2, o.y, 2.6, 3.2, `h${i}`));
}
} else if (layout === 'grid') {
const o = slotOrigin(position, 2, 2);
for (let r = 0; r < 2; r++) {
for (let c = 0; c < 2; c++) {
cards.push(card(o.x + c * 3.2, o.y + r * 3.4, 2.6, 2.8, `g${r}${c}`));
}
}
} else {
// stack
const o = slotOrigin(position, 1, 3);
for (let i = 0; i < 3; i++) {
cards.push(card(o.x, o.y + i * 3.4, 5, 2.8, `v${i}`));
}
}
return (
<svg
width={size}
height={Math.round(size * (h / w))}
viewBox={`0 0 ${w} ${h}`}
className={className}
aria-hidden
>
<rect
x={0.5}
y={0.5}
width={w - 1}
height={h - 1}
rx={2}
fill="none"
stroke="currentColor"
strokeWidth={1}
opacity={0.45}
/>
{cards}
</svg>
);
};
export default TradeAlertPopupModeIcon;