browser_window.jsx 3.9 KB

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