autokap 1.0.2 → 1.0.3

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.
Files changed (83) hide show
  1. package/dist/cli-config.d.ts +13 -0
  2. package/dist/cli-config.js +42 -0
  3. package/dist/cli-utils.d.ts +0 -19
  4. package/dist/cli-utils.js +2 -65
  5. package/dist/cli.d.ts +0 -1
  6. package/dist/cli.js +266 -305
  7. package/package.json +23 -16
  8. package/assets/chrome/ios-statusbar-comparison-reference.jpg +0 -0
  9. package/assets/chrome/ios-statusbar-dark-reference.jpg +0 -0
  10. package/assets/chrome/ios-statusbar-light-reference.jpg +0 -0
  11. package/assets/devices/ipad-pro-11-m4.json +0 -52
  12. package/assets/devices/iphone-16-pro.json +0 -53
  13. package/assets/devices/macbook-air-13.json +0 -45
  14. package/assets/frames/MacBook Air 13.svg +0 -242
  15. package/assets/frames/Status bar - iPhone.png +0 -0
  16. package/assets/frames/Status bar and Menu bar- iPad.png +0 -0
  17. package/assets/frames/iPad Pro M4 11_.png +0 -0
  18. package/assets/frames/iPhone 16 Pro.png +0 -0
  19. package/assets/icons/Cellular Connection.svg +0 -3
  20. package/assets/icons/Union.svg +0 -6
  21. package/assets/icons/Wifi.svg +0 -3
  22. package/assets/icons/battery.svg +0 -5
  23. package/assets/icons/battery_charging.svg +0 -8
  24. package/dist/abort.d.ts +0 -5
  25. package/dist/abort.js +0 -44
  26. package/dist/agent.d.ts +0 -142
  27. package/dist/agent.js +0 -4504
  28. package/dist/browser-bar.d.ts +0 -40
  29. package/dist/browser-bar.js +0 -147
  30. package/dist/clip-orchestrator.d.ts +0 -148
  31. package/dist/clip-orchestrator.js +0 -950
  32. package/dist/clip-postprocess.d.ts +0 -42
  33. package/dist/clip-postprocess.js +0 -192
  34. package/dist/credential-templates.d.ts +0 -5
  35. package/dist/credential-templates.js +0 -60
  36. package/dist/element-capture.d.ts +0 -53
  37. package/dist/element-capture.js +0 -766
  38. package/dist/hybrid-navigator.d.ts +0 -138
  39. package/dist/hybrid-navigator.js +0 -468
  40. package/dist/index.d.ts +0 -15
  41. package/dist/index.js +0 -11
  42. package/dist/llm-usage.d.ts +0 -17
  43. package/dist/llm-usage.js +0 -45
  44. package/dist/mockup-html.d.ts +0 -119
  45. package/dist/mockup-html.js +0 -253
  46. package/dist/mockup.d.ts +0 -94
  47. package/dist/mockup.js +0 -604
  48. package/dist/mouse-animation.d.ts +0 -46
  49. package/dist/mouse-animation.js +0 -100
  50. package/dist/overlay-utils.d.ts +0 -14
  51. package/dist/overlay-utils.js +0 -13
  52. package/dist/posthog.d.ts +0 -4
  53. package/dist/posthog.js +0 -26
  54. package/dist/prompt-cache.d.ts +0 -10
  55. package/dist/prompt-cache.js +0 -24
  56. package/dist/prompts.d.ts +0 -167
  57. package/dist/prompts.js +0 -1165
  58. package/dist/security.d.ts +0 -20
  59. package/dist/security.js +0 -569
  60. package/dist/session-profile.d.ts +0 -86
  61. package/dist/session-profile.js +0 -1471
  62. package/dist/sf-pro-fonts.d.ts +0 -4
  63. package/dist/sf-pro-fonts.js +0 -7
  64. package/dist/status-bar-l10n.d.ts +0 -14
  65. package/dist/status-bar-l10n.js +0 -177
  66. package/dist/status-bar.d.ts +0 -44
  67. package/dist/status-bar.js +0 -336
  68. package/dist/tools.d.ts +0 -4
  69. package/dist/tools.js +0 -578
  70. package/dist/video-agent.d.ts +0 -143
  71. package/dist/video-agent.js +0 -4783
  72. package/dist/video-observation.d.ts +0 -36
  73. package/dist/video-observation.js +0 -192
  74. package/dist/video-planner.d.ts +0 -12
  75. package/dist/video-planner.js +0 -500
  76. package/dist/video-prompts.d.ts +0 -37
  77. package/dist/video-prompts.js +0 -554
  78. package/dist/video-tools.d.ts +0 -3
  79. package/dist/video-tools.js +0 -59
  80. package/dist/video-variant-state.d.ts +0 -29
  81. package/dist/video-variant-state.js +0 -80
  82. package/dist/vision-model.d.ts +0 -17
  83. package/dist/vision-model.js +0 -74
@@ -1,14 +0,0 @@
1
- /**
2
- * Status bar localization — adapts date and Mac menu bar items
3
- * to match the capture language.
4
- */
5
- import type { StatusBarConfig } from './status-bar.js';
6
- /**
7
- * Localize a StatusBarConfig for the given language.
8
- * Returns a new config with date and menuBarItems adapted.
9
- *
10
- * If date/menuBarItems are not set, English defaults are injected first
11
- * so the localization always has values to translate — otherwise the
12
- * renderer's own English defaults would bypass localization.
13
- */
14
- export declare function localizeStatusBar(config: StatusBarConfig | undefined, lang: string): StatusBarConfig;
@@ -1,177 +0,0 @@
1
- /**
2
- * Status bar localization — adapts date and Mac menu bar items
3
- * to match the capture language.
4
- */
5
- // ── Localized day/month names ────────────────────────────────────────
6
- const DAYS_SHORT = {
7
- en: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
8
- fr: ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'],
9
- de: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
10
- es: ['Dom', 'Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sáb'],
11
- it: ['Dom', 'Lun', 'Mar', 'Mer', 'Gio', 'Ven', 'Sab'],
12
- pt: ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sáb'],
13
- nl: ['Zo', 'Ma', 'Di', 'Wo', 'Do', 'Vr', 'Za'],
14
- ja: ['日', '月', '火', '水', '木', '金', '土'],
15
- zh: ['日', '一', '二', '三', '四', '五', '六'],
16
- ko: ['일', '월', '화', '수', '목', '금', '토'],
17
- };
18
- const MONTHS_SHORT = {
19
- en: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
20
- fr: ['Janv', 'Fév', 'Mars', 'Avr', 'Mai', 'Juin', 'Juil', 'Août', 'Sep', 'Oct', 'Nov', 'Déc'],
21
- de: ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],
22
- es: ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'],
23
- it: ['Gen', 'Feb', 'Mar', 'Apr', 'Mag', 'Giu', 'Lug', 'Ago', 'Set', 'Ott', 'Nov', 'Dic'],
24
- pt: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'],
25
- nl: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'],
26
- ja: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
27
- zh: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
28
- ko: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],
29
- };
30
- // ── Carrier names (iPhone SE / home button) ─────────────────────────
31
- const CARRIER_NAMES = {
32
- en: 'Carrier',
33
- fr: 'Opérateur',
34
- de: 'Netzbetreiber',
35
- es: 'Operador',
36
- it: 'Operatore',
37
- pt: 'Operadora',
38
- nl: 'Provider',
39
- ja: 'キャリア',
40
- zh: '运营商',
41
- ko: '통신사',
42
- };
43
- // ── Mac app name defaults ────────────────────────────────────────────
44
- const DEFAULT_APP_NAMES = {
45
- Finder: {
46
- en: 'Finder', fr: 'Finder', de: 'Finder', es: 'Finder',
47
- it: 'Finder', pt: 'Finder', nl: 'Finder', ja: 'Finder',
48
- zh: '访达', ko: 'Finder',
49
- },
50
- Safari: {
51
- en: 'Safari', fr: 'Safari', de: 'Safari', es: 'Safari',
52
- it: 'Safari', pt: 'Safari', nl: 'Safari', ja: 'Safari',
53
- zh: 'Safari', ko: 'Safari',
54
- },
55
- };
56
- // ── Time format (12h vs 24h) ────────────────────────────────────────
57
- // Languages that default to 24h format
58
- const USES_24H = new Set(['fr', 'de', 'it', 'pt', 'nl', 'ja', 'zh', 'ko']);
59
- /**
60
- * Convert "h:mm" 12h time (like "9:41") to 24h format.
61
- * Since status bar times are typically morning (9:41), we keep them as-is
62
- * — the difference is cosmetic (no AM/PM indicator, leading zero optional).
63
- */
64
- function formatTime24h(time) {
65
- // Already in 24h format or no conversion needed for typical status bar times
66
- return time;
67
- }
68
- // ── Mac menu bar items (per-item lookup) ─────────────────────────────
69
- // Covers items from both Finder and Safari menus
70
- const MENU_ITEM_TRANSLATIONS = {
71
- // Common items
72
- File: { fr: 'Fichier', de: 'Ablage', es: 'Archivo', it: 'File', pt: 'Ficheiro', nl: 'Archief', ja: 'ファイル', zh: '文件', ko: '파일' },
73
- Edit: { fr: 'Modifier', de: 'Bearbeiten', es: 'Edición', it: 'Modifica', pt: 'Editar', nl: 'Wijzig', ja: '編集', zh: '编辑', ko: '편집' },
74
- View: { fr: 'Présentation', de: 'Darstellung', es: 'Visualización', it: 'Vista', pt: 'Visualização', nl: 'Weergave', ja: '表示', zh: '显示', ko: '보기' },
75
- Window: { fr: 'Fenêtre', de: 'Fenster', es: 'Ventana', it: 'Finestra', pt: 'Janela', nl: 'Venster', ja: 'ウインドウ', zh: '窗口', ko: '윈도우' },
76
- Help: { fr: 'Aide', de: 'Hilfe', es: 'Ayuda', it: 'Aiuto', pt: 'Ajuda', nl: 'Help', ja: 'ヘルプ', zh: '帮助', ko: '도움말' },
77
- // Finder-specific
78
- Go: { fr: 'Aller', de: 'Gehe zu', es: 'Ir', it: 'Vai', pt: 'Ir', nl: 'Ga', ja: '移動', zh: '前往', ko: '이동' },
79
- // Safari-specific
80
- History: { fr: 'Historique', de: 'Verlauf', es: 'Historial', it: 'Cronologia', pt: 'Histórico', nl: 'Geschiedenis', ja: '履歴', zh: '历史记录', ko: '방문 기록' },
81
- Bookmarks: { fr: 'Signets', de: 'Lesezeichen', es: 'Marcadores', it: 'Segnalibri', pt: 'Favoritos', nl: 'Bladwijzers', ja: 'ブックマーク', zh: '书签', ko: '책갈피' },
82
- };
83
- // ── Date formatting ──────────────────────────────────────────────────
84
- /**
85
- * Parse an English-format date like "Sat 1 Mar" and return its components,
86
- * or return null if the format doesn't match.
87
- */
88
- function parseEnglishDate(dateStr) {
89
- const enDays = DAYS_SHORT.en;
90
- const enMonths = MONTHS_SHORT.en;
91
- const parts = dateStr.trim().split(/\s+/);
92
- if (parts.length < 3)
93
- return null;
94
- const dayOfWeek = enDays.findIndex(d => d.toLowerCase() === parts[0].toLowerCase());
95
- const day = parseInt(parts[1], 10);
96
- const month = enMonths.findIndex(m => m.toLowerCase() === parts[2].toLowerCase());
97
- if (dayOfWeek === -1 || isNaN(day) || month === -1)
98
- return null;
99
- return { dayOfWeek, day, month };
100
- }
101
- /**
102
- * Format a date for a given locale. Apple uses "Day DayNum Month" on iPad/Mac.
103
- * For CJK locales, uses "M月D日 周X" style.
104
- */
105
- function formatDate(dayOfWeek, day, month, lang) {
106
- const baseLang = lang.split('-')[0].toLowerCase();
107
- const days = DAYS_SHORT[baseLang] ?? DAYS_SHORT.en;
108
- const months = MONTHS_SHORT[baseLang] ?? MONTHS_SHORT.en;
109
- if (baseLang === 'ja' || baseLang === 'zh') {
110
- return `${months[month]}${day}日 周${days[dayOfWeek]}`;
111
- }
112
- if (baseLang === 'ko') {
113
- return `${months[month]} ${day}일 ${days[dayOfWeek]}`;
114
- }
115
- return `${days[dayOfWeek]} ${day} ${months[month]}`;
116
- }
117
- // ── Menu bar localization ────────────────────────────────────────────
118
- /**
119
- * Map English menu items to their localized equivalents.
120
- * If a custom item doesn't match a known English item, keep it as-is.
121
- */
122
- function localizeMenuItems(items, lang) {
123
- const baseLang = lang.split('-')[0].toLowerCase();
124
- return items.map(item => {
125
- const translations = MENU_ITEM_TRANSLATIONS[item];
126
- return translations?.[baseLang] ?? item;
127
- });
128
- }
129
- // ── Public API ───────────────────────────────────────────────────────
130
- /**
131
- * Localize a StatusBarConfig for the given language.
132
- * Returns a new config with date and menuBarItems adapted.
133
- *
134
- * If date/menuBarItems are not set, English defaults are injected first
135
- * so the localization always has values to translate — otherwise the
136
- * renderer's own English defaults would bypass localization.
137
- */
138
- export function localizeStatusBar(config, lang) {
139
- if (!config)
140
- return {};
141
- // Skip localization if autoLocale is explicitly disabled
142
- if (config.autoLocale === false)
143
- return config;
144
- const baseLang = lang.split('-')[0].toLowerCase();
145
- if (baseLang === 'en')
146
- return config; // no-op for English
147
- const result = { ...config };
148
- // Inject English defaults for fields that will be localized,
149
- // so downstream defaults don't skip localization
150
- const date = result.date ?? 'Sat 1 Mar';
151
- const parsed = parseEnglishDate(date);
152
- if (parsed) {
153
- result.date = formatDate(parsed.dayOfWeek, parsed.day, parsed.month, baseLang);
154
- }
155
- // Localize menu bar items (inject Safari defaults if not set)
156
- const defaultMenuItems = ['File', 'Edit', 'View', 'History', 'Bookmarks', 'Window', 'Help'];
157
- const menuItems = result.menuBarItems ?? defaultMenuItems;
158
- result.menuBarItems = localizeMenuItems(menuItems, baseLang);
159
- // Localize Mac app name (only if still a known default)
160
- const appName = result.menuBarApp ?? 'Safari';
161
- const appTranslations = DEFAULT_APP_NAMES[appName];
162
- if (appTranslations?.[baseLang]) {
163
- result.menuBarApp = appTranslations[baseLang];
164
- }
165
- // Localize carrier name (only if still default English "Carrier")
166
- const carrier = result.carrierName ?? 'Carrier';
167
- if (carrier === 'Carrier' && CARRIER_NAMES[baseLang]) {
168
- result.carrierName = CARRIER_NAMES[baseLang];
169
- }
170
- // Time format: 24h locales don't change the displayed time (9:41 is valid in both)
171
- // but we store the info for potential future use
172
- if (USES_24H.has(baseLang)) {
173
- result.time = formatTime24h(result.time ?? '9:41');
174
- }
175
- return result;
176
- }
177
- //# sourceMappingURL=status-bar-l10n.js.map
@@ -1,44 +0,0 @@
1
- export interface StatusBarConfig {
2
- time?: string;
3
- date?: string;
4
- menuBarApp?: string;
5
- menuBarItems?: string[];
6
- signalStrength?: number;
7
- showNetworkType?: boolean;
8
- networkType?: string;
9
- wifiStrength?: number;
10
- batteryLevel?: number;
11
- batteryCharging?: boolean;
12
- showBatteryPercentage?: boolean;
13
- colorScheme?: 'light' | 'dark';
14
- carrierName?: string;
15
- autoLocale?: boolean;
16
- }
17
- export interface StatusBarLayout {
18
- leftInset: number;
19
- rightInset: number;
20
- centerGap?: {
21
- left: number;
22
- right: number;
23
- };
24
- fontSize: {
25
- time: number;
26
- networkType: number;
27
- };
28
- iconSize: {
29
- signal: number;
30
- wifi: number;
31
- battery: number;
32
- };
33
- iconGap: number;
34
- }
35
- export type StatusBarDeviceType = 'iphone-dynamic-island' | 'iphone-notch' | 'iphone-home-button' | 'ipad' | 'mac-notch';
36
- export interface StatusBarRenderOptions {
37
- config: StatusBarConfig;
38
- width: number;
39
- height: number;
40
- scale: number;
41
- deviceType: StatusBarDeviceType;
42
- layout?: StatusBarLayout;
43
- }
44
- export declare function generateStatusBarHtml(options: StatusBarRenderOptions): string;
@@ -1,336 +0,0 @@
1
- // ── Status Bar HTML Generator ─────────────────────────────────────────
2
- // Pure function — works in both server (Playwright) and client (React) contexts.
3
- // SF Pro fonts are embedded as base64 data URIs (see sf-pro-fonts.ts).
4
- //
5
- // Icon shapes and positioning measured pixel-by-pixel from Apple's native
6
- // iOS status bar reference PNG (402×62 @ 1x for iPhone 16 Pro Dynamic Island).
7
- const DEFAULT_CONFIG = {
8
- time: '9:41',
9
- date: 'Sat 1 Mar',
10
- menuBarApp: 'Safari',
11
- menuBarItems: ['File', 'Edit', 'View', 'History', 'Bookmarks', 'Window', 'Help'],
12
- signalStrength: 4,
13
- showNetworkType: false,
14
- networkType: '5G',
15
- wifiStrength: 3,
16
- batteryLevel: 100,
17
- batteryCharging: false,
18
- showBatteryPercentage: true,
19
- colorScheme: 'light',
20
- carrierName: 'Carrier',
21
- autoLocale: true,
22
- };
23
- // Measured from Apple's native status bar assets (pixel-level analysis)
24
- // Reference PNG: 402×62 @ 1x for iPhone 16 Pro Dynamic Island
25
- // Time "9:41": cap height 13px → SF Pro font-size 17px (semibold, -0.4 tracking)
26
- // Signal: x:288-307, 4 bars, 4px wide, 2px gap, heights [5,8,11,13]
27
- // WiFi: x:315-331, 17px wide × 13px tall, filled fan with 3 tiers + gaps
28
- // Battery: x:339-366, body 25px × 13px, nub 3px, total 28px
29
- const DEFAULT_LAYOUTS = {
30
- 'iphone-dynamic-island': {
31
- leftInset: 56,
32
- rightInset: 36,
33
- centerGap: { left: 128, right: 274 },
34
- fontSize: { time: 17, networkType: 13 },
35
- iconSize: { signal: 20, wifi: 18, battery: 28 },
36
- iconGap: 7,
37
- },
38
- 'iphone-notch': {
39
- leftInset: 56,
40
- rightInset: 36,
41
- centerGap: { left: 128, right: 274 },
42
- fontSize: { time: 17, networkType: 13 },
43
- iconSize: { signal: 20, wifi: 18, battery: 28 },
44
- iconGap: 7,
45
- },
46
- 'iphone-home-button': {
47
- leftInset: 6,
48
- rightInset: 6,
49
- fontSize: { time: 14, networkType: 14 },
50
- iconSize: { signal: 16, wifi: 14, battery: 24 },
51
- iconGap: 4,
52
- },
53
- 'ipad': {
54
- leftInset: 24,
55
- rightInset: 24,
56
- fontSize: { time: 15, networkType: 11 },
57
- iconSize: { signal: 17, wifi: 15, battery: 25 },
58
- iconGap: 6,
59
- },
60
- 'mac-notch': {
61
- leftInset: 12,
62
- rightInset: 12,
63
- centerGap: { left: 700, right: 936 },
64
- fontSize: { time: 13, networkType: 11 },
65
- iconSize: { signal: 0, wifi: 14, battery: 22 },
66
- iconGap: 8,
67
- },
68
- };
69
- // ── SF Pro Font Face ──────────────────────────────────────────────────
70
- // Subset woff2 fonts embedded as base64 data URIs so they work on any OS
71
- // (macOS, Linux VPS, Docker) without requiring system font installation.
72
- // local() is tried first so the native SF Pro is used when available.
73
- import { SF_PRO_TEXT_REGULAR, SF_PRO_TEXT_SEMIBOLD, SF_PRO_DISPLAY_REGULAR, SF_PRO_DISPLAY_SEMIBOLD, } from './sf-pro-fonts.js';
74
- const SF_PRO_STYLE = `<style>
75
- @font-face {
76
- font-family: 'SF Pro Text';
77
- src: local('SF Pro Text'), local('.SFNSText'), local('SFProText-Regular'),
78
- url('${SF_PRO_TEXT_REGULAR}') format('woff2');
79
- font-weight: 400;
80
- font-style: normal;
81
- }
82
- @font-face {
83
- font-family: 'SF Pro Text';
84
- src: local('SF Pro Text Semibold'), local('.SFNSText-Semibold'), local('SFProText-Semibold'),
85
- url('${SF_PRO_TEXT_SEMIBOLD}') format('woff2');
86
- font-weight: 600;
87
- font-style: normal;
88
- }
89
- @font-face {
90
- font-family: 'SF Pro Display';
91
- src: local('SF Pro Display'), local('.SFNSDisplay'), local('SFProDisplay-Regular'),
92
- url('${SF_PRO_DISPLAY_REGULAR}') format('woff2');
93
- font-weight: 400;
94
- font-style: normal;
95
- }
96
- @font-face {
97
- font-family: 'SF Pro Display';
98
- src: local('SF Pro Display Semibold'), local('.SFNSDisplay-Semibold'), local('SFProDisplay-Semibold'),
99
- url('${SF_PRO_DISPLAY_SEMIBOLD}') format('woff2');
100
- font-weight: 600;
101
- font-style: normal;
102
- }
103
- </style>`;
104
- // ── Main Generator ────────────────────────────────────────────────────
105
- export function generateStatusBarHtml(options) {
106
- const cfg = { ...DEFAULT_CONFIG, ...options.config };
107
- const layout = options.layout ?? DEFAULT_LAYOUTS[options.deviceType];
108
- const { width, height } = options;
109
- const color = cfg.colorScheme === 'dark' ? '#FFFFFF' : '#000000';
110
- const fontFamily = "'SF Pro Text','SF Pro Display','-apple-system',BlinkMacSystemFont,system-ui,sans-serif";
111
- if (options.deviceType === 'iphone-home-button') {
112
- return SF_PRO_STYLE + buildIPhoneHomeButtonStatusBar(cfg, layout, width, height, color, fontFamily);
113
- }
114
- if (options.deviceType === 'iphone-dynamic-island' || options.deviceType === 'iphone-notch') {
115
- return SF_PRO_STYLE + buildIPhoneStatusBar(cfg, layout, width, height, color, fontFamily);
116
- }
117
- if (options.deviceType === 'mac-notch') {
118
- return SF_PRO_STYLE + buildMacMenuBar(cfg, layout, width, height, color, fontFamily);
119
- }
120
- return SF_PRO_STYLE + buildIPadStatusBar(cfg, layout, width, height, color, fontFamily);
121
- }
122
- // ── iPhone Status Bar ──────────────────────────────────────────────────
123
- function buildIPhoneStatusBar(cfg, layout, width, height, color, fontFamily) {
124
- const timeSize = layout.fontSize.time;
125
- const networkSize = layout.fontSize.networkType;
126
- const gap = layout.iconGap;
127
- const { signal: signalW, wifi: wifiW, battery: batteryW } = layout.iconSize;
128
- const signalSvg = renderSignalBars(cfg.signalStrength, color, signalW);
129
- const wifiSvg = renderWifi(cfg.wifiStrength, color, wifiW);
130
- const batterySvg = renderBattery(cfg.batteryLevel, cfg.batteryCharging, color, batteryW, cfg.colorScheme === 'dark');
131
- const networkLabel = cfg.showNetworkType
132
- ? `<span style="font-size:${networkSize}px;font-weight:600;letter-spacing:0.2px;color:${color};line-height:1;">${escapeHtml(cfg.networkType)}</span>`
133
- : '';
134
- return `<div style="position:relative;width:${width}px;height:${height}px;font-family:${fontFamily};-webkit-font-smoothing:antialiased;overflow:hidden;">
135
- <div style="position:absolute;left:${layout.leftInset}px;top:0;height:100%;display:flex;align-items:center;">
136
- <span style="font-size:${timeSize}px;font-weight:600;letter-spacing:-0.4px;color:${color};line-height:1;">${escapeHtml(cfg.time)}</span>
137
- </div>
138
- <div style="position:absolute;right:${layout.rightInset}px;top:0;height:100%;display:flex;align-items:center;gap:${gap}px;">
139
- ${signalSvg}
140
- ${networkLabel}
141
- ${wifiSvg}
142
- ${batterySvg}
143
- </div>
144
- </div>`;
145
- }
146
- // ── iPhone Home Button Status Bar (SE / 8 / classic layout) ───────────
147
- // Authentic iOS ≤ 15 classic status bar:
148
- // Left: signal bars · carrier name (clipped if long) · Wi-Fi fan
149
- // Center: time (semibold, perfectly centered)
150
- // Right: battery % · battery icon
151
- function buildIPhoneHomeButtonStatusBar(cfg, layout, width, height, color, fontFamily) {
152
- const timeSize = layout.fontSize.time;
153
- const labelSize = layout.fontSize.networkType;
154
- const gap = layout.iconGap;
155
- const { signal: signalW, wifi: wifiW, battery: batteryW } = layout.iconSize;
156
- const signalSvg = renderSignalBars(cfg.signalStrength, color, signalW);
157
- const wifiSvg = renderWifi(cfg.wifiStrength, color, wifiW);
158
- const batterySvg = renderBattery(cfg.batteryLevel, cfg.batteryCharging, color, batteryW, cfg.colorScheme === 'dark');
159
- // Carrier label — classic iOS shows "Carrier" or "Orange" etc., NOT "5G"
160
- const carrierLabel = `<span style="font-size:${labelSize}px;font-weight:400;color:${color};line-height:1;max-width:80px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;">${escapeHtml(cfg.carrierName)}</span>`;
161
- // Network type badge (LTE / 4G / 5G) shown after carrier when enabled
162
- const networkBadge = cfg.showNetworkType
163
- ? `<span style="font-size:${labelSize - 1}px;font-weight:600;color:${color};line-height:1;">${escapeHtml(cfg.networkType)}</span>`
164
- : '';
165
- const batteryPct = cfg.showBatteryPercentage
166
- ? `<span style="font-size:${labelSize}px;font-weight:400;color:${color};line-height:1;">${cfg.batteryLevel}%</span>`
167
- : '';
168
- return `<div style="position:relative;width:${width}px;height:${height}px;font-family:${fontFamily};-webkit-font-smoothing:antialiased;overflow:hidden;">
169
- <div style="position:absolute;left:${layout.leftInset}px;top:0;height:100%;display:flex;align-items:center;gap:${gap}px;">
170
- ${signalSvg}
171
- ${carrierLabel}
172
- ${networkBadge}
173
- ${wifiSvg}
174
- </div>
175
- <div style="position:absolute;left:50%;top:0;height:100%;transform:translateX(-50%);display:flex;align-items:center;">
176
- <span style="font-size:${timeSize}px;font-weight:600;letter-spacing:-0.4px;color:${color};line-height:1;">${escapeHtml(cfg.time)}</span>
177
- </div>
178
- <div style="position:absolute;right:${layout.rightInset}px;top:0;height:100%;display:flex;align-items:center;gap:${gap}px;">
179
- ${batteryPct}
180
- ${batterySvg}
181
- </div>
182
- </div>`;
183
- }
184
- // ── iPad Status Bar ────────────────────────────────────────────────────
185
- function buildIPadStatusBar(cfg, layout, width, height, color, fontFamily) {
186
- const timeSize = layout.fontSize.time;
187
- const gap = layout.iconGap;
188
- const { signal: signalW, wifi: wifiW, battery: batteryW } = layout.iconSize;
189
- const signalSvg = renderSignalBars(cfg.signalStrength, color, signalW);
190
- const wifiSvg = renderWifi(cfg.wifiStrength, color, wifiW);
191
- const batterySvg = renderBattery(cfg.batteryLevel, cfg.batteryCharging, color, batteryW, cfg.colorScheme === 'dark');
192
- const batteryLabel = `<span style="font-size:${layout.fontSize.networkType}px;font-weight:400;color:${color};line-height:1;">${cfg.batteryLevel}%</span>`;
193
- const dateLabel = cfg.date
194
- ? `<span style="font-size:${timeSize}px;font-weight:400;letter-spacing:-0.4px;color:${color};line-height:1;margin-left:16px;">${escapeHtml(cfg.date)}</span>`
195
- : '';
196
- return `<div style="position:relative;width:${width}px;height:${height}px;font-family:${fontFamily};-webkit-font-smoothing:antialiased;overflow:hidden;">
197
- <div style="position:absolute;left:${layout.leftInset}px;top:0;height:100%;display:flex;align-items:center;">
198
- <span style="font-size:${timeSize}px;font-weight:400;letter-spacing:-0.4px;color:${color};line-height:1;">${escapeHtml(cfg.time)}</span>
199
- ${dateLabel}
200
- </div>
201
- <div style="position:absolute;right:${layout.rightInset}px;top:0;height:100%;display:flex;align-items:center;gap:${gap}px;">
202
- ${signalSvg}
203
- ${wifiSvg}
204
- ${batteryLabel}
205
- ${batterySvg}
206
- </div>
207
- </div>`;
208
- }
209
- // ── macOS Menu Bar ────────────────────────────────────────────────────
210
- function buildMacMenuBar(cfg, layout, width, height, color, fontFamily) {
211
- const fontSize = layout.fontSize.time;
212
- const gap = layout.iconGap;
213
- const { wifi: wifiW, battery: batteryW } = layout.iconSize;
214
- const wifiSvg = renderWifi(cfg.wifiStrength, color, wifiW);
215
- const batterySvg = renderBattery(cfg.batteryLevel, cfg.batteryCharging, color, batteryW, cfg.colorScheme === 'dark');
216
- const batteryLabel = `<span style="font-size:${fontSize - 1}px;font-weight:400;color:${color};line-height:1;">${cfg.batteryLevel}%</span>`;
217
- // SF Symbol icon helper — uses SF Pro font glyphs from Private Use Area
218
- const sfIcon = (char, size = fontSize) => `<span style="font-family:'SF Pro','SF Pro Display',system-ui;font-size:${size}px;color:${color};line-height:1;">${char}</span>`;
219
- // Apple logo — U+F8FF renders as in SF Pro / Apple system fonts
220
- const appleLogo = sfIcon('\uF8FF', fontSize + 3);
221
- // SF Symbol characters (macOS Sequoia) — literal glyphs from SF Pro font
222
- const searchIcon = sfIcon('􀊫'); // magnifyingglass
223
- const ccIcon = sfIcon('􀜊'); // control center (switch.2)
224
- const avatarIcon = sfIcon('􀉭'); // person.crop.circle
225
- // App name (bold) + menu items (regular weight)
226
- const appName = `<span style="font-size:${fontSize}px;font-weight:700;color:${color};line-height:1;">${escapeHtml(cfg.menuBarApp)}</span>`;
227
- const menuItems = cfg.menuBarItems.map(item => `<span style="font-size:${fontSize}px;font-weight:400;color:${color};line-height:1;">${item}</span>`).join('');
228
- // Date + time for right side
229
- const dateTime = cfg.date
230
- ? `<span style="font-size:${fontSize}px;font-weight:500;color:${color};line-height:1;">${escapeHtml(cfg.date)}</span>`
231
- : '';
232
- const timeLabel = `<span style="font-size:${fontSize}px;font-weight:500;color:${color};line-height:1;">${escapeHtml(cfg.time)}</span>`;
233
- // macOS right-side order: WiFi → Battery% BatteryIcon → Search → CC → Avatar → Date Time
234
- return `<div style="position:relative;width:${width}px;height:${height}px;font-family:${fontFamily};-webkit-font-smoothing:antialiased;overflow:hidden;">
235
- <div style="position:absolute;left:${layout.leftInset}px;top:0;height:100%;display:flex;align-items:center;gap:${gap + 6}px;">
236
- ${appleLogo}
237
- ${appName}
238
- <div style="display:flex;align-items:center;gap:${gap + 10}px;">
239
- ${menuItems}
240
- </div>
241
- </div>
242
- <div style="position:absolute;right:${layout.rightInset}px;top:0;height:100%;display:flex;align-items:center;gap:${gap + 2}px;">
243
- ${wifiSvg}
244
- <div style="display:flex;align-items:center;gap:3px;">
245
- ${cfg.showBatteryPercentage ? batteryLabel : ''}
246
- ${batterySvg}
247
- </div>
248
- ${searchIcon}
249
- ${ccIcon}
250
- ${avatarIcon}
251
- ${dateTime}
252
- ${timeLabel}
253
- </div>
254
- </div>`;
255
- }
256
- // ── SVG Icon Renderers ─────────────────────────────────────────────────
257
- // Paths extracted from native Apple iOS status bar SVG assets.
258
- // Signal: 20×13 viewBox, 4 rounded bars
259
- // WiFi: 18×13 viewBox, 3 tiers (outer arc, inner arc, dot)
260
- // Battery: 28×13 viewBox, outline + nub + fill
261
- // Native signal bar paths (from Cellular Connection.svg)
262
- // Each bar is an individual path, ordered left→right (shortest→tallest)
263
- const SIGNAL_BAR_PATHS = [
264
- 'M2.13333 7.53962H1.06667C0.477563 7.53962 0 8.06421 0 8.71132V11.0547C0 11.7018 0.477563 12.2264 1.06667 12.2264H2.13333C2.72244 12.2264 3.2 11.7018 3.2 11.0547V8.71132C3.2 8.06421 2.72244 7.53962 2.13333 7.53962Z',
265
- 'M7.43411 5.09433H6.36745C5.77834 5.09433 5.30078 5.62652 5.30078 6.28301V11.0377C5.30078 11.6942 5.77834 12.2264 6.36745 12.2264H7.43411C8.02322 12.2264 8.50078 11.6942 8.50078 11.0377V6.28301C8.50078 5.62652 8.02322 5.09433 7.43411 5.09433Z',
266
- 'M11.7659 2.44528H12.8326C13.4217 2.44528 13.8992 2.97078 13.8992 3.61902V11.0527C13.8992 11.7009 13.4217 12.2264 12.8326 12.2264H11.7659C11.1768 12.2264 10.6992 11.7009 10.6992 11.0527V3.61902C10.6992 2.97078 11.1768 2.44528 11.7659 2.44528Z',
267
- 'M19.2 1.14623C19.2 0.513183 18.7224 0 18.1333 0H17.0667C16.4776 0 16 0.513183 16 1.14623V11.0802C16 11.7132 16.4776 12.2264 17.0667 12.2264H18.1333C18.7224 12.2264 19.2 11.7132 19.2 11.0802V1.14623Z',
268
- ];
269
- // Native WiFi paths (from Wifi.svg) — 3 tiers, outer→inner→dot
270
- const WIFI_TIER_PATHS = [
271
- // Tier 3 (outer arc)
272
- 'M8.5713 2.46628C11.0584 2.46639 13.4504 3.38847 15.2529 5.04195C15.3887 5.1696 15.6056 5.16799 15.7393 5.03834L17.0368 3.77487C17.1045 3.70911 17.1422 3.62004 17.1417 3.52735C17.1411 3.43467 17.1023 3.34603 17.0338 3.28104C12.3028 -1.09368 4.83907 -1.09368 0.108056 3.28104C0.039524 3.34598 0.000639766 3.4346 7.82398e-06 3.52728C-0.000624118 3.61996 0.0370483 3.70906 0.104689 3.77487L1.40255 5.03834C1.53615 5.16819 1.75327 5.1698 1.88893 5.04195C3.69167 3.38836 6.08395 2.46628 8.5713 2.46628Z',
273
- // Tier 2 (inner arc)
274
- 'M8.56795 6.68656C9.92527 6.68647 11.2341 7.19821 12.2403 8.12234C12.3763 8.2535 12.5907 8.25065 12.7234 8.11593L14.0106 6.79663C14.0784 6.72742 14.1161 6.63355 14.1151 6.536C14.1141 6.43844 14.0746 6.34536 14.0054 6.27757C10.9416 3.38672 6.19688 3.38672 3.13305 6.27757C3.06384 6.34536 3.02435 6.43849 3.02345 6.53607C3.02254 6.63366 3.06028 6.72752 3.12822 6.79663L4.41513 8.11593C4.54778 8.25065 4.76215 8.2535 4.89823 8.12234C5.90368 7.19882 7.21152 6.68713 8.56795 6.68656Z',
275
- // Tier 1 (dot)
276
- 'M11.0924 9.48011C11.0943 9.58546 11.0572 9.68703 10.9899 9.76084L8.81327 12.2156C8.74946 12.2877 8.66247 12.3283 8.5717 12.3283C8.48093 12.3283 8.39394 12.2877 8.33013 12.2156L6.1531 9.76084C6.08585 9.68697 6.04886 9.58537 6.05085 9.48002C6.05284 9.37467 6.09365 9.27491 6.16364 9.20429C7.55374 7.8904 9.58966 7.8904 10.9798 9.20429C11.0497 9.27497 11.0904 9.37476 11.0924 9.48011Z',
277
- ];
278
- function renderSignalBars(strength, color, size) {
279
- // Native viewBox: 20×13 (from Cellular Connection.svg)
280
- const viewW = 20; // native: 19.2 rounded to 20
281
- const viewH = 13;
282
- const paths = SIGNAL_BAR_PATHS.map((d, i) => {
283
- const opacity = i < strength ? 1 : 0.25;
284
- return `<path d="${d}" fill="${color}" opacity="${opacity}"/>`;
285
- });
286
- const h = size * (viewH / viewW);
287
- return `<svg width="${size}" height="${h}" viewBox="0 0 ${viewW} ${viewH}" fill="none" style="display:block;">${paths.join('')}</svg>`;
288
- }
289
- function renderWifi(strength, color, size) {
290
- // Native viewBox: 18×13 (from Wifi.svg)
291
- const viewW = 18;
292
- const viewH = 13;
293
- // Tiers are ordered outer→inner→dot, mapped to strength 3→2→1
294
- const tiers = WIFI_TIER_PATHS.map((d, i) => {
295
- const tierLevel = 3 - i; // 3, 2, 1
296
- const opacity = strength >= tierLevel ? 1 : 0.25;
297
- return `<path d="${d}" fill="${color}" opacity="${opacity}"/>`;
298
- });
299
- const h = size * (viewH / viewW);
300
- return `<svg width="${size}" height="${h}" viewBox="0 0 ${viewW} ${viewH}" fill="none" style="display:block;">${tiers.join('')}</svg>`;
301
- }
302
- function renderBattery(level, charging, color, size, isDark = false) {
303
- if (charging) {
304
- // Charging battery icon (from assets/icons/battery_charging.svg)
305
- // ViewBox: 35×16 — paths: 1,2=border, 3=nub, 4,5=inner fill, 6=bolt
306
- const chargingGreen = isDark ? '#0DF07D' : '#32CB58';
307
- const chargingBorder = '#ADADB1';
308
- const boltColor = color; // black on light, white on dark
309
- const w = size;
310
- const h = size * (16 / 35);
311
- return `<svg width="${w}" height="${h}" viewBox="0 0 35 16" fill="none" style="display:block;">
312
- <path d="M17.332 13.9694L15.8203 15.8561H24.668C25.668 15.8561 26.582 15.778 27.4102 15.6217C28.2383 15.4576 28.9531 15.0748 29.5547 14.4733C30.1484 13.8795 30.5234 13.1725 30.6797 12.3522C30.8438 11.524 30.9258 10.61 30.9258 9.60998V6.2467C30.9258 5.2467 30.8438 4.33655 30.6797 3.51624C30.5234 2.68811 30.1484 1.97717 29.5547 1.38342C28.9531 0.78186 28.2383 0.402954 27.4102 0.246704C26.582 0.0826416 25.668 0.000610352 24.668 0.000610352H19.6992C19.7695 0.18811 19.8086 0.37561 19.8164 0.56311C19.8242 0.742798 19.8047 0.93811 19.7578 1.14905C19.7188 1.35999 19.6523 1.60608 19.5586 1.88733H24.9961C25.5977 1.88733 26.1875 1.94592 26.7656 2.06311C27.3516 2.17249 27.8203 2.40295 28.1719 2.75452C28.5312 3.11389 28.7656 3.58264 28.875 4.16077C28.9844 4.73108 29.0391 5.31702 29.0391 5.91858V9.92639C29.0391 10.5358 28.9844 11.1295 28.875 11.7076C28.7656 12.278 28.5312 12.7428 28.1719 13.1022C27.8203 13.4537 27.3516 13.6881 26.7656 13.8053C26.1875 13.9147 25.5977 13.9694 24.9961 13.9694H17.332Z" fill="${chargingBorder}"/>
313
- <path d="M13.5937 1.88672L15.1055 9.53674e-07L6.25781 1.72716e-06C5.25781 1.81458e-06 4.34375 0.0781269 3.51562 0.234377C2.6875 0.39844 1.97265 0.781252 1.37109 1.38281C0.777343 1.97656 0.402343 2.6836 0.246093 3.50391C0.0820302 4.33203 -9.27501e-07 5.2461 -8.40078e-07 6.2461L-5.46051e-07 9.60938C-4.58628e-07 10.6094 0.0820309 11.5195 0.246093 12.3398C0.402344 13.168 0.777344 13.8789 1.37109 14.4727C1.97266 15.0742 2.6875 15.4531 3.51562 15.6094C4.34375 15.7734 5.25781 15.8555 6.25781 15.8555L11.2266 15.8555C11.1562 15.668 11.1172 15.4805 11.1094 15.293C11.1016 15.1133 11.1211 14.918 11.168 14.707C11.207 14.4961 11.2734 14.25 11.3672 13.9688L5.92969 13.9688C5.32812 13.9688 4.73828 13.9102 4.16016 13.793C3.57422 13.6836 3.10547 13.4531 2.75391 13.1016C2.39453 12.7422 2.16016 12.2734 2.05078 11.6953C1.94141 11.125 1.88672 10.5391 1.88672 9.9375L1.88672 5.92969C1.88672 5.32031 1.94141 4.72656 2.05078 4.14844C2.16016 3.57813 2.39453 3.11328 2.75391 2.75391C3.10547 2.40235 3.57422 2.16797 4.16016 2.05078C4.73828 1.94141 5.32812 1.88672 5.92969 1.88672L13.5937 1.88672Z" fill="${chargingBorder}"/>
314
- <path d="M32.5195 4.89905V10.9576C32.832 10.9342 33.1562 10.7975 33.4922 10.5475C33.8281 10.2897 34.1094 9.93811 34.3359 9.4928C34.5703 9.04749 34.6875 8.52405 34.6875 7.92249C34.6875 7.32874 34.5703 6.8092 34.3359 6.36389C34.1094 5.91858 33.8281 5.56702 33.4922 5.3092C33.1562 5.05139 32.832 4.91467 32.5195 4.89905Z" fill="${chargingBorder}"/>
315
- <path d="M4.32422 12.5162C4.58203 12.5787 4.91016 12.61 5.30859 12.61H12.1758L12.7969 10.9225H11.1328C10.5469 10.9225 10.043 10.7194 9.62109 10.3131C9.20703 9.90686 9 9.40686 9 8.81311C9 8.29749 9.17578 7.81702 9.52734 7.3717L12.8086 3.2467H5.34375C4.92969 3.2467 4.59375 3.28186 4.33594 3.35217C4.07812 3.41467 3.86719 3.52795 3.70312 3.69202C3.54688 3.85608 3.43359 4.06702 3.36328 4.32483C3.29297 4.57483 3.25781 4.90686 3.25781 5.32092V10.5592C3.25781 10.9655 3.29297 11.2936 3.36328 11.5436C3.43359 11.7936 3.54688 12.0006 3.70312 12.1647C3.86719 12.3287 4.07422 12.4459 4.32422 12.5162Z" fill="${chargingGreen}"/>
316
- <path d="M21.6914 8.48499L18.4102 12.61H25.6172C26.0234 12.61 26.3516 12.5787 26.6016 12.5162C26.8516 12.4459 27.0586 12.3287 27.2227 12.1647C27.5273 11.86 27.6797 11.3248 27.6797 10.5592V5.29749C27.6797 4.89124 27.6445 4.56311 27.5742 4.31311C27.5039 4.06311 27.3867 3.85608 27.2227 3.69202C27.0586 3.52795 26.8516 3.41467 26.6016 3.35217C26.3516 3.28186 26.0234 3.2467 25.6172 3.2467H19.043L18.4219 4.9342H20.0742C20.668 4.9342 21.1719 5.13733 21.5859 5.54358C22.0078 5.94983 22.2188 6.44983 22.2188 7.04358C22.2188 7.5592 22.043 8.03967 21.6914 8.48499Z" fill="${chargingGreen}"/>
317
- <path d="M10.7812 8.34432C10.6484 8.52401 10.582 8.68026 10.582 8.81307C10.582 8.96151 10.6328 9.0826 10.7344 9.17635C10.8438 9.2701 10.9727 9.31698 11.1211 9.31698H15.0938L12.9727 15.0123C12.8867 15.2623 12.8945 15.4654 12.9961 15.6217C13.1055 15.7779 13.2578 15.8599 13.4531 15.8678C13.6484 15.8678 13.8242 15.7701 13.9805 15.5748L20.4023 7.50057C20.5352 7.3287 20.6016 7.17635 20.6016 7.04354C20.6016 6.8951 20.5469 6.77401 20.4375 6.68026C20.3359 6.58651 20.2109 6.53963 20.0625 6.53963H16.0898L18.2109 0.844323C18.3047 0.594323 18.2969 0.391198 18.1875 0.234948C18.0781 0.0786978 17.9258 0.000572791 17.7305 0.000572791C17.543 -0.00723971 17.3672 0.0865103 17.2031 0.281823L10.7812 8.34432Z" fill="${boltColor}"/>
318
- </svg>`;
319
- }
320
- // Non-charging battery icon (from assets/icons/battery.svg)
321
- // ViewBox: 35×16 — paths: 1=inner fill, 2=border (evenodd), 3=nub
322
- const batteryBorder = '#ADADB1';
323
- const fillColor = color;
324
- const w = size;
325
- const h = size * (16 / 35);
326
- return `<svg width="${w}" height="${h}" viewBox="0 0 35 16" fill="none" style="display:block;">
327
- <path d="M12.8057 3.25098H19.042L19.043 3.24707H25.6172C26.0234 3.24707 26.3516 3.28223 26.6016 3.35254C26.8515 3.41504 27.0586 3.52834 27.2227 3.69238C27.3866 3.85642 27.5039 4.06357 27.5742 4.31348C27.6445 4.56343 27.6797 4.89179 27.6797 5.29785V10.5596C27.6796 11.325 27.5273 11.8604 27.2227 12.165C27.0586 12.329 26.8515 12.4463 26.6016 12.5166C26.3516 12.5791 26.0234 12.6104 25.6172 12.6104H5.30859C4.9102 12.6104 4.58202 12.5791 4.32422 12.5166C4.07431 12.4463 3.86716 12.329 3.70312 12.165C3.54695 12.0011 3.4336 11.7938 3.36328 11.5439C3.29299 11.294 3.25783 10.9657 3.25781 10.5596V5.32129C3.25781 4.90741 3.29303 4.57516 3.36328 4.3252C3.43357 4.06748 3.54697 3.85642 3.70312 3.69238C3.86717 3.52834 4.07816 3.41504 4.33594 3.35254C4.59375 3.28223 4.92969 3.24707 5.34375 3.24707H12.8086L12.8057 3.25098Z" fill="${fillColor}"/>
328
- <path fill-rule="evenodd" clip-rule="evenodd" d="M24.668 0.000976562C25.668 0.000976562 26.582 0.0830078 27.4102 0.24707C28.2383 0.403328 28.9531 0.782242 29.5547 1.38379C30.1483 1.9775 30.5235 2.68856 30.6797 3.5166C30.8437 4.33682 30.9258 5.24721 30.9258 6.24707V9.61035C30.9258 10.6102 30.8437 11.5245 30.6797 12.3525C30.5234 13.1727 30.1484 13.88 29.5547 14.4736C28.9532 15.0751 28.2382 15.458 27.4102 15.6221C26.582 15.7783 25.6679 15.8564 24.668 15.8564L10.5156 15.8574V15.8555H6.25781C5.25781 15.8555 4.34375 15.7734 3.51562 15.6094C2.6875 15.4531 1.97266 15.0742 1.37109 14.4727C0.777344 13.8789 0.402344 13.168 0.246094 12.3398C0.0820312 11.5195 9.34357e-08 10.6094 0 9.60938V6.24609C-6.73586e-08 5.24609 0.0820313 4.33203 0.246094 3.50391C0.402344 2.68359 0.777344 1.97656 1.37109 1.38281C1.97266 0.78125 2.6875 0.398438 3.51562 0.234375C4.34375 0.078125 5.25781 1.64241e-07 6.25781 0L24.668 0.000976562ZM5.92969 1.88672C5.32813 1.88672 4.73828 1.94141 4.16016 2.05078C3.57422 2.16797 3.10547 2.40234 2.75391 2.75391C2.39453 3.11328 2.16016 3.57813 2.05078 4.14844C1.94141 4.72656 1.88672 5.32031 1.88672 5.92969V9.9375C1.88672 10.5391 1.94141 11.125 2.05078 11.6953C2.16016 12.2734 2.39453 12.7422 2.75391 13.1016C3.10547 13.4531 3.57422 13.6836 4.16016 13.793C4.73828 13.9102 5.32813 13.9687 5.92969 13.9688L24.9961 13.9697C25.5976 13.9697 26.1875 13.915 26.7656 13.8057C27.3515 13.6885 27.8203 13.454 28.1719 13.1025C28.5312 12.7432 28.7656 12.2782 28.875 11.708C28.9844 11.13 29.039 10.536 29.0391 9.92676V5.91895C29.0391 5.3175 28.9843 4.73134 28.875 4.16113C28.7656 3.5831 28.5311 3.11423 28.1719 2.75488C27.8203 2.40333 27.3515 2.17286 26.7656 2.06348C26.1875 1.94629 25.5977 1.8877 24.9961 1.8877L13 1.88867V1.88672H5.92969Z" fill="${batteryBorder}"/>
329
- <path d="M32.5195 4.89941C32.832 4.91504 33.1563 5.05176 33.4922 5.30957C33.828 5.56737 34.1094 5.91902 34.3359 6.36426C34.5702 6.80951 34.6875 7.32923 34.6875 7.92285C34.6875 8.52426 34.5703 9.04794 34.3359 9.49316C34.1094 9.93834 33.8281 10.2901 33.4922 10.5479C33.1563 10.7978 32.832 10.9346 32.5195 10.958V4.89941Z" fill="${batteryBorder}"/>
330
- </svg>`;
331
- }
332
- // ── Utilities ──────────────────────────────────────────────────────────
333
- function escapeHtml(str) {
334
- return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
335
- }
336
- //# sourceMappingURL=status-bar.js.map
package/dist/tools.d.ts DELETED
@@ -1,4 +0,0 @@
1
- import type { ChatCompletionFunctionTool } from 'openai/resources/chat/completions';
2
- export declare const agentTools: ChatCompletionFunctionTool[];
3
- /** Restricted tool set for the element capture mini-agent */
4
- export declare const elementCaptureTools: ChatCompletionFunctionTool[];