'use client';
import { styled } from '@linaria/react';
import type { ReactNode } from 'react';
import { theme } from '@/theme';
import { VISUAL_TOKENS } from '../Shared/utils/app-preview-tokens';
import { WINDOW_SHADOWS } from '../Shared/utils/window-shadows';
import { AppWindow } from './AppWindow';
import { MacWindowBar } from './MacWindowBar';
export type AppPreviewFrameMode = 'static' | 'windowed';
const APP_PREVIEW_FRAME_MAX_WIDTH = 1040;
const APP_PREVIEW_FRAME_ASPECT_RATIO = '1280 / 832';
const StaticFrameRoot = styled.div`
align-items: stretch;
display: flex;
height: 100%;
justify-content: center;
width: 100%;
`;
// compact fills the (fixed-height, fluid-width) scene box without aspect-ratio,
// so the board reflows instead of the whole window scaling with width.
// floatingShadow swaps the resting halo for a downward-biased shadow (product
// hero only), so the soft shadow drops below instead of haloing above the title.
const StaticShell = styled.div<{ $compact: boolean; $floatingShadow: boolean }>`
aspect-ratio: ${({ $compact }) =>
$compact ? 'auto' : APP_PREVIEW_FRAME_ASPECT_RATIO};
background-color: ${VISUAL_TOKENS.background.primary};
background-image: ${VISUAL_TOKENS.background.noisy};
border: 1px solid ${VISUAL_TOKENS.border.color.medium};
border-radius: 20px;
box-shadow: ${({ $floatingShadow }) =>
$floatingShadow
? WINDOW_SHADOWS.mobileFloating
: WINDOW_SHADOWS.mobileResting};
display: flex;
flex-direction: column;
height: ${({ $compact }) => ($compact ? '100%' : 'auto')};
max-height: ${({ $compact }) => ($compact ? 'none' : '100%')};
max-width: ${({ $compact }) =>
$compact ? 'none' : `${APP_PREVIEW_FRAME_MAX_WIDTH}px`};
overflow: hidden;
position: relative;
width: 100%;
@media (min-width: ${theme.breakpoints.md}px) {
box-shadow: ${({ $floatingShadow }) =>
$floatingShadow ? WINDOW_SHADOWS.floating : WINDOW_SHADOWS.resting};
}
`;
const StaticContent = styled.div`
display: flex;
flex: 1 1 auto;
min-height: 0;
width: 100%;
`;
type AppPreviewFrameProps = {
children: ReactNode;
compact?: boolean;
floatingShadow?: boolean;
mode: AppPreviewFrameMode;
};
export function AppPreviewFrame({
children,
compact = false,
floatingShadow = false,
mode,
}: AppPreviewFrameProps) {
if (mode === 'windowed') {
return {children};
}
return (
{children}
);
}