/ templates / browser_window.jsx
browser_window.jsx
  1  /**
  2   * BrowserWindow — Browser window frame (Chrome-style)
  3   *
  4   * Includes: traffic lights + tab bar + URL bar
  5   *
  6   * Usage:
  7   *   <BrowserWindow url="https://example.com" title="Example">
  8   *     <YourWebPage />
  9   *   </BrowserWindow>
 10   */
 11  
 12  const browserWindowStyles = {
 13    window: {
 14      display: 'inline-block',
 15      background: '#fff',
 16      borderRadius: 10,
 17      overflow: 'hidden',
 18      boxShadow: '0 30px 80px rgba(0,0,0,0.25), 0 0 0 0.5px rgba(0,0,0,0.15)',
 19    },
 20    chrome: {
 21      background: '#dee1e6',
 22      paddingTop: 10,
 23      paddingLeft: 10,
 24      paddingRight: 10,
 25      userSelect: 'none',
 26    },
 27    tabRow: {
 28      display: 'flex',
 29      alignItems: 'flex-end',
 30      gap: 6,
 31      position: 'relative',
 32    },
 33    trafficLights: {
 34      display: 'flex',
 35      gap: 8,
 36      alignItems: 'center',
 37      paddingBottom: 10,
 38      marginRight: 8,
 39    },
 40    light: {
 41      width: 12,
 42      height: 12,
 43      borderRadius: '50%',
 44      border: '0.5px solid rgba(0,0,0,0.15)',
 45    },
 46    close: { background: '#ff5f57' },
 47    minimize: { background: '#febc2e' },
 48    maximize: { background: '#28c840' },
 49    tab: {
 50      background: '#fff',
 51      padding: '8px 30px 8px 14px',
 52      borderTopLeftRadius: 10,
 53      borderTopRightRadius: 10,
 54      fontSize: 12,
 55      color: '#222',
 56      fontFamily: '-apple-system, sans-serif',
 57      maxWidth: 220,
 58      display: 'flex',
 59      alignItems: 'center',
 60      gap: 8,
 61      position: 'relative',
 62      whiteSpace: 'nowrap',
 63      overflow: 'hidden',
 64      textOverflow: 'ellipsis',
 65    },
 66    favicon: {
 67      width: 14,
 68      height: 14,
 69      borderRadius: 2,
 70      background: '#999',
 71      flexShrink: 0,
 72    },
 73    navBar: {
 74      background: '#fff',
 75      padding: '8px 14px',
 76      display: 'flex',
 77      alignItems: 'center',
 78      gap: 10,
 79      borderBottom: '1px solid #e5e7eb',
 80    },
 81    navButtons: {
 82      display: 'flex',
 83      gap: 4,
 84      color: '#5f6368',
 85      fontSize: 16,
 86    },
 87    navButton: {
 88      width: 28,
 89      height: 28,
 90      display: 'flex',
 91      alignItems: 'center',
 92      justifyContent: 'center',
 93      borderRadius: '50%',
 94      cursor: 'pointer',
 95    },
 96    urlBar: {
 97      flex: 1,
 98      background: '#f1f3f4',
 99      borderRadius: 999,
100      padding: '7px 14px',
101      fontSize: 13,
102      color: '#333',
103      display: 'flex',
104      alignItems: 'center',
105      gap: 8,
106      fontFamily: '-apple-system, sans-serif',
107    },
108    lockIcon: {
109      color: '#5f6368',
110      fontSize: 12,
111    },
112    content: {
113      position: 'relative',
114      overflow: 'auto',
115      background: '#fff',
116    },
117  };
118  
119  function BrowserWindow({
120    title = 'New Tab',
121    url = 'https://example.com',
122    width = 1200,
123    height = 800,
124    showTrafficLights = true,
125    children,
126  }) {
127    return (
128      <div style={browserWindowStyles.window}>
129        <div style={browserWindowStyles.chrome}>
130          <div style={browserWindowStyles.tabRow}>
131            {showTrafficLights && (
132              <div style={browserWindowStyles.trafficLights}>
133                <div style={{ ...browserWindowStyles.light, ...browserWindowStyles.close }} />
134                <div style={{ ...browserWindowStyles.light, ...browserWindowStyles.minimize }} />
135                <div style={{ ...browserWindowStyles.light, ...browserWindowStyles.maximize }} />
136              </div>
137            )}
138            <div style={browserWindowStyles.tab}>
139              <div style={browserWindowStyles.favicon} />
140              <span>{title}</span>
141            </div>
142          </div>
143        </div>
144  
145        <div style={browserWindowStyles.navBar}>
146          <div style={browserWindowStyles.navButtons}>
147            <div style={browserWindowStyles.navButton}>←</div>
148            <div style={browserWindowStyles.navButton}>→</div>
149            <div style={browserWindowStyles.navButton}>↻</div>
150          </div>
151          <div style={browserWindowStyles.urlBar}>
152            <span style={browserWindowStyles.lockIcon}>🔒</span>
153            <span>{url}</span>
154          </div>
155        </div>
156  
157        <div style={{ ...browserWindowStyles.content, width, height }}>
158          {children}
159        </div>
160      </div>
161    );
162  }
163  
164  if (typeof window !== 'undefined') {
165    window.BrowserWindow = BrowserWindow;
166  }