@adminide-stack/yantra-mobile 12.0.141-alpha.1 → 12.0.142-alpha.0

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 (227) hide show
  1. package/lib/features/agent-chat/NativeAgentChat.js +21 -4
  2. package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
  3. package/lib/features/chat/ApprovalCard.js +353 -0
  4. package/lib/features/chat/ApprovalCard.js.map +1 -0
  5. package/lib/features/chat/AskUserCard.js +9 -2
  6. package/lib/features/chat/AskUserCard.js.map +1 -1
  7. package/lib/features/chat/askUser.js +25 -3
  8. package/lib/features/chat/askUser.js.map +1 -1
  9. package/lib/features/chat/queuedFollowUpRows.js +13 -0
  10. package/lib/features/chat/queuedFollowUpRows.js.map +1 -0
  11. package/lib/features/dictate/DictateExperience.js +59 -7
  12. package/lib/features/dictate/DictateExperience.js.map +1 -1
  13. package/lib/features/dictate/components/NoteView.js +227 -12
  14. package/lib/features/dictate/components/NoteView.js.map +1 -1
  15. package/lib/features/dictate/dictateClient.js +93 -23
  16. package/lib/features/dictate/dictateClient.js.map +1 -1
  17. package/lib/features/dictate/dictatePreference.js +19 -0
  18. package/lib/features/dictate/dictatePreference.js.map +1 -0
  19. package/lib/features/dictate/noteText.js +17 -2
  20. package/lib/features/dictate/noteText.js.map +1 -1
  21. package/lib/features/dictate/privacy.js +96 -0
  22. package/lib/features/dictate/privacy.js.map +1 -0
  23. package/lib/features/dictate/shownNote.js +24 -0
  24. package/lib/features/dictate/shownNote.js.map +1 -0
  25. package/lib/features/discover/DiscoverArticle.js +105 -92
  26. package/lib/features/discover/DiscoverArticle.js.map +1 -1
  27. package/lib/features/discover/DiscoverFeed.js +97 -48
  28. package/lib/features/discover/DiscoverFeed.js.map +1 -1
  29. package/lib/features/discover/DiscoverFollowUp.js +135 -0
  30. package/lib/features/discover/DiscoverFollowUp.js.map +1 -0
  31. package/lib/features/discover/DiscoverSidebar.js +555 -0
  32. package/lib/features/discover/DiscoverSidebar.js.map +1 -0
  33. package/lib/features/discover/DiscoverSkeletons.js +123 -0
  34. package/lib/features/discover/DiscoverSkeletons.js.map +1 -0
  35. package/lib/features/discover/DiscoverStoryCards.js +193 -87
  36. package/lib/features/discover/DiscoverStoryCards.js.map +1 -1
  37. package/lib/features/discover/followUpQuery.js +42 -0
  38. package/lib/features/discover/followUpQuery.js.map +1 -0
  39. package/lib/features/discover/markets.js +37 -0
  40. package/lib/features/discover/markets.js.map +1 -0
  41. package/lib/features/discover/useDiscoverSidebar.js +148 -0
  42. package/lib/features/discover/useDiscoverSidebar.js.map +1 -0
  43. package/lib/features/discover/weather.js +42 -0
  44. package/lib/features/discover/weather.js.map +1 -0
  45. package/lib/features/expenses/ExpensesAgentChatPane.js +1 -1
  46. package/lib/features/expenses/ExpensesAgentChatPane.js.map +1 -1
  47. package/lib/features/inbox/InboxAgentChatPane.js +1 -1
  48. package/lib/features/inbox/InboxAgentChatPane.js.map +1 -1
  49. package/lib/features/job-search/JobSearchAgentChatPane.js +1 -0
  50. package/lib/features/job-search/JobSearchAgentChatPane.js.map +1 -1
  51. package/lib/features/local-services/LocalServicesAgentChatPane.js +1 -1
  52. package/lib/features/local-services/LocalServicesAgentChatPane.js.map +1 -1
  53. package/lib/features/movies/MoviesAgentChatPane.js +1 -1
  54. package/lib/features/movies/MoviesAgentChatPane.js.map +1 -1
  55. package/lib/features/notion/NotionBlockSheets.js +206 -0
  56. package/lib/features/notion/NotionBlockSheets.js.map +1 -0
  57. package/lib/features/notion/NotionBlockView.js +36 -0
  58. package/lib/features/notion/NotionBlockView.js.map +1 -0
  59. package/lib/features/notion/NotionCommentsSheet.js +461 -0
  60. package/lib/features/notion/NotionCommentsSheet.js.map +1 -0
  61. package/lib/features/notion/NotionConnectionsSheet.js +244 -0
  62. package/lib/features/notion/NotionConnectionsSheet.js.map +1 -0
  63. package/lib/features/notion/NotionHistorySheet.js +439 -0
  64. package/lib/features/notion/NotionHistorySheet.js.map +1 -0
  65. package/lib/features/notion/NotionMediaBlocks.js +803 -0
  66. package/lib/features/notion/NotionMediaBlocks.js.map +1 -0
  67. package/lib/features/notion/NotionMentionSheet.js +279 -0
  68. package/lib/features/notion/NotionMentionSheet.js.map +1 -0
  69. package/lib/features/notion/NotionPageMenu.js +585 -0
  70. package/lib/features/notion/NotionPageMenu.js.map +1 -0
  71. package/lib/features/notion/NotionPageTree.js +220 -0
  72. package/lib/features/notion/NotionPageTree.js.map +1 -0
  73. package/lib/features/notion/NotionPageView.js +1253 -152
  74. package/lib/features/notion/NotionPageView.js.map +1 -1
  75. package/lib/features/notion/NotionShareSheet.js +606 -0
  76. package/lib/features/notion/NotionShareSheet.js.map +1 -0
  77. package/lib/features/notion/NotionSheets.js +87 -15
  78. package/lib/features/notion/NotionSheets.js.map +1 -1
  79. package/lib/features/notion/NotionSidebarSections.js +492 -0
  80. package/lib/features/notion/NotionSidebarSections.js.map +1 -0
  81. package/lib/features/notion/NotionWorkspaceAdmin.js +659 -0
  82. package/lib/features/notion/NotionWorkspaceAdmin.js.map +1 -0
  83. package/lib/features/notion/NotionWorkspaceView.js +257 -45
  84. package/lib/features/notion/NotionWorkspaceView.js.map +1 -1
  85. package/lib/features/notion/database/DatabaseCells.js +554 -0
  86. package/lib/features/notion/database/DatabaseCells.js.map +1 -0
  87. package/lib/features/notion/database/DatabaseDateLayouts.js +792 -0
  88. package/lib/features/notion/database/DatabaseDateLayouts.js.map +1 -0
  89. package/lib/features/notion/database/DatabaseLayouts.js +461 -0
  90. package/lib/features/notion/database/DatabaseLayouts.js.map +1 -0
  91. package/lib/features/notion/database/DatabaseSheets.js +791 -0
  92. package/lib/features/notion/database/DatabaseSheets.js.map +1 -0
  93. package/lib/features/notion/database/NotionDatabaseView.js +817 -0
  94. package/lib/features/notion/database/NotionDatabaseView.js.map +1 -0
  95. package/lib/features/notion/database/RowPropertiesPanel.js +162 -0
  96. package/lib/features/notion/database/RowPropertiesPanel.js.map +1 -0
  97. package/lib/features/notion/database/chartData.js +89 -0
  98. package/lib/features/notion/database/chartData.js.map +1 -0
  99. package/lib/features/notion/database/chartView.js +112 -0
  100. package/lib/features/notion/database/chartView.js.map +1 -0
  101. package/lib/features/notion/database/connectorButton.js +33 -0
  102. package/lib/features/notion/database/connectorButton.js.map +1 -0
  103. package/lib/features/notion/database/databaseCalc.js +208 -0
  104. package/lib/features/notion/database/databaseCalc.js.map +1 -0
  105. package/lib/features/notion/database/databaseCalendar.js +157 -0
  106. package/lib/features/notion/database/databaseCalendar.js.map +1 -0
  107. package/lib/features/notion/database/databaseCsv.js +98 -0
  108. package/lib/features/notion/database/databaseCsv.js.map +1 -0
  109. package/lib/features/notion/database/databaseCsvActions.js +58 -0
  110. package/lib/features/notion/database/databaseCsvActions.js.map +1 -0
  111. package/lib/features/notion/database/databaseFilter.js +473 -0
  112. package/lib/features/notion/database/databaseFilter.js.map +1 -0
  113. package/lib/features/notion/database/databaseFormula.js +1072 -0
  114. package/lib/features/notion/database/databaseFormula.js.map +1 -0
  115. package/lib/features/notion/database/databaseGroup.js +151 -0
  116. package/lib/features/notion/database/databaseGroup.js.map +1 -0
  117. package/lib/features/notion/database/databaseRollup.js +58 -0
  118. package/lib/features/notion/database/databaseRollup.js.map +1 -0
  119. package/lib/features/notion/database/databaseTimeline.js +156 -0
  120. package/lib/features/notion/database/databaseTimeline.js.map +1 -0
  121. package/lib/features/notion/database/databaseView.js +1188 -0
  122. package/lib/features/notion/database/databaseView.js.map +1 -0
  123. package/lib/features/notion/database/databaseViews.js +310 -0
  124. package/lib/features/notion/database/databaseViews.js.map +1 -0
  125. package/lib/features/notion/database/relationSource.js +92 -0
  126. package/lib/features/notion/database/relationSource.js.map +1 -0
  127. package/lib/features/notion/database/uniqueId.js +17 -0
  128. package/lib/features/notion/database/uniqueId.js.map +1 -0
  129. package/lib/features/notion/database/useNotionDatabase.js +617 -0
  130. package/lib/features/notion/database/useNotionDatabase.js.map +1 -0
  131. package/lib/features/notion/notionAgentRunStatus.js +39 -0
  132. package/lib/features/notion/notionAgentRunStatus.js.map +1 -0
  133. package/lib/features/notion/notionCodeLanguages.js +112 -0
  134. package/lib/features/notion/notionCodeLanguages.js.map +1 -0
  135. package/lib/features/notion/notionComments.js +86 -0
  136. package/lib/features/notion/notionComments.js.map +1 -0
  137. package/lib/features/notion/notionConnections.js +74 -0
  138. package/lib/features/notion/notionConnections.js.map +1 -0
  139. package/lib/features/notion/notionDocuments.js +453 -1
  140. package/lib/features/notion/notionDocuments.js.map +1 -1
  141. package/lib/features/notion/notionEditorModel.js +142 -7
  142. package/lib/features/notion/notionEditorModel.js.map +1 -1
  143. package/lib/features/notion/notionMarkdownShortcuts.js +51 -0
  144. package/lib/features/notion/notionMarkdownShortcuts.js.map +1 -0
  145. package/lib/features/notion/notionMedia.js +119 -0
  146. package/lib/features/notion/notionMedia.js.map +1 -0
  147. package/lib/features/notion/notionMentionDate.js +32 -0
  148. package/lib/features/notion/notionMentionDate.js.map +1 -0
  149. package/lib/features/notion/notionMentionOptions.js +162 -0
  150. package/lib/features/notion/notionMentionOptions.js.map +1 -0
  151. package/lib/features/notion/notionNotesAgent.js +445 -0
  152. package/lib/features/notion/notionNotesAgent.js.map +1 -0
  153. package/lib/features/notion/notionPageAccess.js +168 -0
  154. package/lib/features/notion/notionPageAccess.js.map +1 -0
  155. package/lib/features/notion/notionPageActions.js +138 -0
  156. package/lib/features/notion/notionPageActions.js.map +1 -0
  157. package/lib/features/notion/notionPageHistory.js +154 -0
  158. package/lib/features/notion/notionPageHistory.js.map +1 -0
  159. package/lib/features/notion/notionPageKinds.js +200 -0
  160. package/lib/features/notion/notionPageKinds.js.map +1 -0
  161. package/lib/features/notion/notionRecents.js +48 -0
  162. package/lib/features/notion/notionRecents.js.map +1 -0
  163. package/lib/features/notion/notionRichText.js +177 -0
  164. package/lib/features/notion/notionRichText.js.map +1 -0
  165. package/lib/features/notion/notionRichTitle.js +336 -0
  166. package/lib/features/notion/notionRichTitle.js.map +1 -0
  167. package/lib/features/notion/useNotionWorkspace.js +272 -13
  168. package/lib/features/notion/useNotionWorkspace.js.map +1 -1
  169. package/lib/features/notion/usePageActions.js +155 -0
  170. package/lib/features/notion/usePageActions.js.map +1 -0
  171. package/lib/features/resume/ResumeAgentChatPane.js +1 -1
  172. package/lib/features/resume/ResumeAgentChatPane.js.map +1 -1
  173. package/lib/features/shopping/ShoppingAgentChatPane.js +1 -1
  174. package/lib/features/shopping/ShoppingAgentChatPane.js.map +1 -1
  175. package/lib/features/study/StudyAgentChatPane.js +1 -1
  176. package/lib/features/study/StudyAgentChatPane.js.map +1 -1
  177. package/lib/features/travel/TravelAgentChatPane.js +1 -1
  178. package/lib/features/travel/TravelAgentChatPane.js.map +1 -1
  179. package/lib/features/webbuilder/WebBuilderExperience.js +40 -8
  180. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
  181. package/lib/features/webbuilder/buildFragments.js +1 -1
  182. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  183. package/lib/features/webbuilder/codeFiles.js +302 -0
  184. package/lib/features/webbuilder/codeFiles.js.map +1 -0
  185. package/lib/features/webbuilder/codeHighlight.js +209 -0
  186. package/lib/features/webbuilder/codeHighlight.js.map +1 -0
  187. package/lib/features/webbuilder/components/CodeView.js +682 -52
  188. package/lib/features/webbuilder/components/CodeView.js.map +1 -1
  189. package/lib/features/webbuilder/components/PreviewScreen.js +59 -38
  190. package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
  191. package/lib/features/webbuilder/components/ProjectChat.js +3 -3
  192. package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
  193. package/lib/features/webbuilder/stepLabels.js +68 -0
  194. package/lib/features/webbuilder/stepLabels.js.map +1 -0
  195. package/lib/hooks/useHostChatSteering.js +45 -0
  196. package/lib/hooks/useHostChatSteering.js.map +1 -0
  197. package/lib/screens/Chat/index.js +2 -12
  198. package/lib/screens/Chat/index.js.map +1 -1
  199. package/lib/screens/ExpensesNative/useExpensesHostChat.js +25 -5
  200. package/lib/screens/ExpensesNative/useExpensesHostChat.js.map +1 -1
  201. package/lib/screens/InboxNative/useInboxHostChat.js +25 -5
  202. package/lib/screens/InboxNative/useInboxHostChat.js.map +1 -1
  203. package/lib/screens/JobSearchNative/useJobSearchHostChat.js +25 -5
  204. package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
  205. package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js +25 -5
  206. package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js.map +1 -1
  207. package/lib/screens/MoviesNative/useMoviesHostChat.js +25 -5
  208. package/lib/screens/MoviesNative/useMoviesHostChat.js.map +1 -1
  209. package/lib/screens/NotionPage/index.js +2 -2
  210. package/lib/screens/NotionPage/index.js.map +1 -1
  211. package/lib/screens/ResumeNative/useResumeHostChat.js +25 -5
  212. package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
  213. package/lib/screens/ShoppingNative/useShoppingHostChat.js +25 -5
  214. package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
  215. package/lib/screens/StudyNative/useStudyHostChat.js +25 -5
  216. package/lib/screens/StudyNative/useStudyHostChat.js.map +1 -1
  217. package/lib/screens/TravelNative/useTravelHostChat.js +25 -5
  218. package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -1
  219. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js +222 -0
  220. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js.map +1 -0
  221. package/lib/screens/WebBuilderNative/index.js +1 -1
  222. package/lib/screens/WebBuilderNative/index.js.map +1 -1
  223. package/lib/screens/WebBuilderNative/sandboxProxyApi.js +126 -4
  224. package/lib/screens/WebBuilderNative/sandboxProxyApi.js.map +1 -1
  225. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +120 -11
  226. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  227. package/package.json +3 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codeFiles.js","sources":["../../../src/features/webbuilder/codeFiles.ts"],"sourcesContent":["/**\n * The Code view's rules, ported from the web surface (`code/codeFiles.ts`,\n * `code/codeSearch.ts`, `code/savedCode.ts`). Pure: the host runs the commands.\n *\n * - The file tree is a `WEBBUILDER_RUN_COMMAND` listing (`git ls-files` plus\n * untracked, non-ignored files; `find` without a repo), never node_modules,\n * .git, dist, .output or any .env* file.\n * - A file opens editable, read-only (over 1 MB) or as \"can't show\" (binary).\n * - Before a save the file is read again: if it changed on disk since it was\n * opened, the person chooses Overwrite or Reload.\n * - Search is one capped, read-only, case-insensitive `git grep`.\n * - Without a sandbox the code comes from the backup repo (`fromRepo`), read-only.\n */\nimport { siteProjectName } from './siteAddress';\n\n/** Files over this size open read-only. */\nexport const MAX_EDITABLE_BYTES = 1_048_576;\n/** READ_FILE's own cap (2 MB). */\nexport const READ_FILE_MAX_BYTES = 2_097_152;\nexport const MAX_TREE_FILES = 2000;\n\nconst SKIP_DIRS = new Set(['node_modules', '.git', 'dist', '.output']);\n\n/** True for a path that may appear in the tree (and be read or written by the editor). */\nexport function isListablePath(path: string): boolean {\n const p = path.trim();\n if (!p || p.includes('\\0') || p.startsWith('/')) return false;\n const segments = p.split('/');\n if (segments.some((s) => s === '' || s === '.' || s === '..')) return false;\n if (segments.some((s) => SKIP_DIRS.has(s))) return false;\n return !segments.some((s) => s.startsWith('.env'));\n}\n\n/** Normalised relative path for READ/WRITE, or null when it isn't allowed. */\nexport function normalizeEditorPath(path: string | null | undefined): string | null {\n const p = (path || '')\n .trim()\n .replace(/\\\\/g, '/')\n .replace(/^(\\.\\/)+/, '');\n return isListablePath(p) ? p : null;\n}\n\nconst TREE_EXCLUDE =\n \"':!node_modules' ':!**/node_modules/**' ':!dist' ':!**/dist/**' ':!.output' ':!.env*' ':!**/.env*'\";\n\n/** RUN_COMMAND script (project folder): one path per line between markers. */\nexport function buildListFilesCommand(): string {\n return [\n 'echo \"__FILES_BEGIN\"',\n 'if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then',\n ` git -c core.quotepath=off ls-files --cached --others --exclude-standard -- . ${TREE_EXCLUDE} 2>/dev/null | head -n ${MAX_TREE_FILES + 1}`,\n 'else',\n ` find . -type d \\\\( -name node_modules -o -name .git -o -name dist -o -name .output \\\\) -prune -o -type f ! -name '.env*' -print 2>/dev/null | sed 's|^\\\\./||' | head -n ${MAX_TREE_FILES + 1}`,\n 'fi',\n 'echo \"__FILES_END\"',\n 'exit 0',\n ].join('\\n');\n}\n\nexport interface FileTree {\n files: string[];\n /** More files exist than are shown. */\n partial: boolean;\n}\n\n/** Folders first, then files, case-insensitive - the order a file tree shows. */\nexport function sortTree(paths: string[]): string[] {\n return [...paths].sort((a, b) => {\n const pa = a.split('/');\n const pb = b.split('/');\n const n = Math.min(pa.length, pb.length);\n for (let i = 0; i < n; i += 1) {\n if (pa[i] !== pb[i]) {\n const aDir = i < pa.length - 1;\n const bDir = i < pb.length - 1;\n if (aDir !== bDir) return aDir ? -1 : 1;\n return pa[i].localeCompare(pb[i], undefined, { sensitivity: 'base' }) || (pa[i] < pb[i] ? -1 : 1);\n }\n }\n return pa.length - pb.length;\n });\n}\n\nfunction betweenMarkers(stdout: string, begin: string, end: string): { lines: string[]; cut: boolean } | null {\n const text = String(stdout || '');\n const at = text.indexOf(begin);\n if (at < 0) return null;\n const endIdx = text.indexOf(end, at);\n const lines = text\n .slice(at + begin.length, endIdx < 0 ? undefined : endIdx)\n .split('\\n')\n .map((l) => l.replace(/\\r$/, ''));\n // Output cut off mid-line: the last line may be partial.\n if (endIdx < 0) lines.pop();\n return { lines, cut: endIdx < 0 };\n}\n\nexport function parseListFilesOutput(stdout: string, opts?: { truncated?: boolean }): FileTree | null {\n const body = betweenMarkers(stdout, '__FILES_BEGIN', '__FILES_END');\n if (!body) return null;\n const seen = new Set<string>();\n for (const line of body.lines) {\n const p = normalizeEditorPath(line);\n if (p) seen.add(p);\n }\n const all = sortTree([...seen]);\n return {\n files: all.slice(0, MAX_TREE_FILES),\n partial: body.cut || Boolean(opts?.truncated) || all.length > MAX_TREE_FILES,\n };\n}\n\n/** LIST_FILES `{source, files, truncated}` (the saved code) as a file tree, same filters. */\nexport function parseListFilesResult(data: unknown): FileTree | null {\n if (!data || typeof data !== 'object') return null;\n const d = data as Record<string, unknown>;\n if (!Array.isArray(d.files)) return null;\n const seen = new Set<string>();\n for (const f of d.files) {\n const p = typeof f === 'string' ? normalizeEditorPath(f) : null;\n if (p) seen.add(p);\n }\n const all = sortTree([...seen]);\n return { files: all.slice(0, MAX_TREE_FILES), partial: d.truncated === true || all.length > MAX_TREE_FILES };\n}\n\n/** Default file to open: the app entry when present. */\nexport function preferredFile(paths: string[]): string {\n const preferred = [\n 'src/App.tsx',\n 'src/App.jsx',\n 'src/main.tsx',\n 'src/main.jsx',\n 'app/page.tsx',\n 'pages/index.tsx',\n 'index.html',\n 'package.json',\n ];\n return preferred.find((p) => paths.includes(p)) || paths[0] || '';\n}\n\nconst BINARY_EXT =\n /\\.(png|jpe?g|gif|webp|avif|ico|bmp|tiff?|psd|woff2?|ttf|otf|eot|mp3|mp4|m4a|wav|ogg|webm|mov|avi|zip|gz|tgz|bz2|xz|7z|rar|tar|pdf|wasm|exe|dll|so|dylib|bin|class|jar|sqlite|db|lockb)$/i;\n\nexport function isBinaryPath(path: string): boolean {\n return BINARY_EXT.test(path);\n}\n\nexport type OpenMode =\n | { kind: 'edit' }\n | { kind: 'readonly'; reason: 'large' }\n | { kind: 'binary' }\n | { kind: 'error'; message: string };\n\n/** How a READ_FILE result opens. */\nexport function openModeFor(path: string, data: Record<string, unknown>): OpenMode {\n if (isBinaryPath(path) || data.binary === true || data.encoding === 'base64') return { kind: 'binary' };\n if (typeof data.content !== 'string') return { kind: 'error', message: 'The file came back empty.' };\n const size = typeof data.size === 'number' ? data.size : data.content.length;\n if (data.truncated === true || size > MAX_EDITABLE_BYTES) return { kind: 'readonly', reason: 'large' };\n return { kind: 'edit' };\n}\n\nexport type SaveDecision = 'write' | 'unchanged' | 'conflict' | 'missing';\n\n/**\n * Before writing: `base` is what was loaded, `disk` what is on disk now (null =\n * gone), `draft` the edited text. A file changed on disk since it was opened is\n * a conflict (the person chooses: overwrite or reload).\n */\nexport function decideSave(base: string, disk: string | null, draft: string): SaveDecision {\n if (disk === null) return 'missing';\n if (disk !== base) return disk === draft ? 'unchanged' : 'conflict';\n return draft === base ? 'unchanged' : 'write';\n}\n\n/** Changed line counts (common prefix/suffix trimmed - cheap and good enough for a summary). */\nexport function lineDelta(before: string, after: string): { added: number; removed: number } {\n const a = before.split('\\n');\n const b = after.split('\\n');\n let start = 0;\n while (start < a.length && start < b.length && a[start] === b[start]) start += 1;\n let endA = a.length - 1;\n let endB = b.length - 1;\n while (endA >= start && endB >= start && a[endA] === b[endB]) {\n endA -= 1;\n endB -= 1;\n }\n return { removed: Math.max(0, endA - start + 1), added: Math.max(0, endB - start + 1) };\n}\n\n/** The hand-edit summary for a file saved from the Code view. */\nexport function codeEditSummary(before: string, after: string): string {\n const { added, removed } = lineDelta(before, after);\n const parts: string[] = [];\n if (added) parts.push(`+${added}`);\n if (removed) parts.push(`-${removed}`);\n return `edited in the code view (${parts.join(' / ') || 'whitespace'} lines)`;\n}\n\n/** The note the next agent turn carries, so it keeps hand edits (web `agentTurnNotes`). */\nexport function handEditsNote(edits: ReadonlyArray<{ file: string; summary: string }>): string {\n if (!edits.length) return '';\n return `[Hand edits] The user already changed these by hand (keep them): ${edits\n .map((m) => `${m.file}: ${m.summary}`)\n .join('; ')}.`;\n}\n\n// ── Search ─────────────────────────────────────────────────────────────────\n\nexport const MIN_SEARCH_CHARS = 2;\nexport const MAX_SEARCH_CHARS = 200;\nexport const MAX_SEARCH_LINES = 400;\nconst MAX_RAW_LINE_CHARS = 400;\nconst PREVIEW_CHARS = 160;\nconst MAX_NAME_MATCHES = 50;\n\nexport interface SearchMatch {\n line: number;\n /** The preview text (whitespace trimmed, long lines cut around the first match). */\n text: string;\n /** [start, end) offsets of the query in `text`. */\n ranges: Array<[number, number]>;\n}\n\nexport interface ContentSearchResult {\n files: Array<{ path: string; matches: SearchMatch[] }>;\n total: number;\n /** More matches exist than are shown. */\n truncated: boolean;\n}\n\n/** The query as searched: one line, trimmed, bounded; null when too short. */\nexport function normalizeQuery(query: string): string | null {\n const q = String(query || '')\n .replace(/[\\r\\n\\0]+/g, ' ')\n .trim()\n .slice(0, MAX_SEARCH_CHARS);\n return q.length >= MIN_SEARCH_CHARS ? q : null;\n}\n\n/** POSIX single-quoting: safe for any text. */\nexport function shellQuote(s: string): string {\n return `'${s.replace(/'/g, `'\\\\''`)}'`;\n}\n\n/** RUN_COMMAND script: fixed-string, case-insensitive, text files only, the tree's exclusions, capped. */\nexport function buildSearchCommand(query: string): string {\n const q = normalizeQuery(query);\n if (!q) throw new Error('query too short');\n const pattern = shellQuote(q);\n const exclude = `${TREE_EXCLUDE} ':!**/.output/**'`;\n const cap = `cut -c1-${MAX_RAW_LINE_CHARS} | head -n ${MAX_SEARCH_LINES + 1}`;\n return [\n 'echo \"__GREP_BEGIN\"',\n 'if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then',\n ` git -c core.quotepath=off grep --untracked -n -I -i -F --no-color -e ${pattern} -- . ${exclude} 2>/dev/null | ${cap}`,\n 'else',\n ` grep -rnIiF --exclude-dir=node_modules --exclude-dir=.git --exclude-dir=dist --exclude-dir=.output --exclude='.env*' -e ${pattern} . 2>/dev/null | sed 's|^\\\\./||' | ${cap}`,\n 'fi',\n 'echo \"__GREP_END\"',\n 'exit 0',\n ].join('\\n');\n}\n\n/** Case-insensitive offsets of `query` in `text`. */\nexport function matchRanges(text: string, query: string): Array<[number, number]> {\n const q = query.toLowerCase();\n if (!q) return [];\n const hay = text.toLowerCase();\n const out: Array<[number, number]> = [];\n let at = hay.indexOf(q);\n while (at >= 0 && out.length < 20) {\n out.push([at, at + q.length]);\n at = hay.indexOf(q, at + q.length);\n }\n return out;\n}\n\nfunction previewLine(raw: string, query: string): Omit<SearchMatch, 'line'> {\n let text = raw.replace(/\\t/g, ' ').replace(/\\s+$/, '');\n text = text.slice(text.length - text.trimStart().length);\n if (text.length > PREVIEW_CHARS) {\n const first = text.toLowerCase().indexOf(query.toLowerCase());\n const start = first > PREVIEW_CHARS / 3 ? first - Math.floor(PREVIEW_CHARS / 3) : 0;\n text = `${start > 0 ? '…' : ''}${text.slice(start, start + PREVIEW_CHARS)}${start + PREVIEW_CHARS < text.length ? '…' : ''}`;\n }\n return { text, ranges: matchRanges(text, query) };\n}\n\nfunction groupRows(\n rows: Array<{ path: string; line: number; raw: string }>,\n query: string,\n truncated: boolean,\n): ContentSearchResult {\n const byPath = new Map<string, SearchMatch[]>();\n for (const r of rows) {\n const list = byPath.get(r.path) ?? [];\n list.push({ line: r.line, ...previewLine(r.raw, query) });\n byPath.set(r.path, list);\n }\n return { files: [...byPath].map(([path, matches]) => ({ path, matches })), total: rows.length, truncated };\n}\n\nconst GREP_LINE = /^(.+?):(\\d+):(.*)$/;\n\n/** The search command's output (`path:line:text`); null when the markers are missing. */\nexport function parseSearchOutput(\n stdout: string,\n query: string,\n opts?: { truncated?: boolean },\n): ContentSearchResult | null {\n const body = betweenMarkers(stdout, '__GREP_BEGIN', '__GREP_END');\n if (!body) return null;\n const rows: Array<{ path: string; line: number; raw: string }> = [];\n for (const l of body.lines) {\n const m = GREP_LINE.exec(l);\n const path = m ? m[1].replace(/^\\.\\//, '') : '';\n if (m && isListablePath(path)) rows.push({ path, line: Number(m[2]), raw: m[3] });\n }\n const truncated = body.cut || Boolean(opts?.truncated) || rows.length > MAX_SEARCH_LINES;\n return groupRows(rows.slice(0, MAX_SEARCH_LINES), query, truncated);\n}\n\n/** Search contents already in memory (open files, drafts) when the project can't be searched. */\nexport function searchDocs(docs: Record<string, string>, query: string): ContentSearchResult {\n const q = normalizeQuery(query);\n if (!q) return { files: [], total: 0, truncated: false };\n const needle = q.toLowerCase();\n const rows: Array<{ path: string; line: number; raw: string }> = [];\n let truncated = false;\n Object.keys(docs)\n .sort()\n .filter(isListablePath)\n .forEach((path) => {\n docs[path].split('\\n').forEach((text, i) => {\n if (!text.toLowerCase().includes(needle)) return;\n if (rows.length >= MAX_SEARCH_LINES) {\n truncated = true;\n return;\n }\n rows.push({ path, line: i + 1, raw: text.slice(0, MAX_RAW_LINE_CHARS) });\n });\n });\n return groupRows(rows, q, truncated);\n}\n\n/** Files whose name or path contains the query: names that match first, then shorter paths. */\nexport function matchFileNames(files: readonly string[], query: string): string[] {\n const q = normalizeQuery(query)?.toLowerCase();\n if (!q) return [];\n const scored: Array<{ path: string; score: number }> = [];\n for (const path of files) {\n const lower = path.toLowerCase();\n if (lower.includes(q)) {\n const base = lower.slice(lower.lastIndexOf('/') + 1);\n let rank = 2;\n if (base.startsWith(q)) rank = 0;\n else if (base.includes(q)) rank = 1;\n scored.push({ path, score: rank * 1000 + path.length });\n }\n }\n return scored\n .sort((a, b) => a.score - b.score || a.path.localeCompare(b.path))\n .slice(0, MAX_NAME_MATCHES)\n .map((s) => s.path);\n}\n\n// ── Saved code (the backup repo, when the sandbox is gone) ─────────────────\n\nexport interface FromRepo {\n /** The project name the backup repo was made for (the connector adds `<userId>-`). */\n projectName: string;\n}\n\n/**\n * `fromRepo` for the saved code (web `savedCodeSource`): the published name or address,\n * else the backup repo recorded on the project (retention `backupRepo`). The proxy swaps\n * in the repo recorded on the channel - it never trusts the name - so this only has to\n * say \"read the saved code\". Null when none is known.\n */\nexport function savedCodeSource(opts: {\n backupRepo?: string | null;\n publishProjectName?: string | null;\n liveUrl?: string | null;\n}): FromRepo | null {\n const published = String(opts.publishProjectName || '').trim() || siteProjectName(opts.liveUrl);\n if (published) return { projectName: published };\n const repo = String(opts.backupRepo || '').trim();\n const name = repo.split('/').filter(Boolean).pop() || '';\n return name ? { projectName: name } : null;\n}\n\n/** A read answered from the backup repo (`readOnly` / `sandboxGone` / `source:\"repo\"`). */\nexport function isSavedCodeRead(data: unknown): boolean {\n if (!data || typeof data !== 'object') return false;\n const d = data as Record<string, unknown>;\n return d.readOnly === true || d.sandboxGone === true || d.source === 'repo';\n}\n\n/** The live listing failed because the sandbox is not there (switch to the saved code). */\nexport function isSandboxUnavailableError(message: string | null | undefined): boolean {\n return /sandbox not found|not found \\(404\\)|no sandbox|does not exist|sandbox.*(paused|expired|killed)|not running anymore|timed? ?out|ETIMEDOUT|\\b502\\b/i.test(\n String(message || ''),\n );\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,209 @@
1
+ function codeLanguage(path) {
2
+ var _a, _b, _c;
3
+ const ext = (_c = (_b = (_a = /\.([a-z0-9]+)$/i.exec(path)) == null ? void 0 : _a[1]) == null ? void 0 : _b.toLowerCase()) != null ? _c : "";
4
+ if (["js", "mjs", "cjs", "jsx", "ts", "mts", "cts", "tsx"].includes(ext)) return "js";
5
+ if (["css", "scss", "less", "pcss"].includes(ext)) return "css";
6
+ if (["html", "htm", "vue", "svelte", "svg", "xml"].includes(ext)) return "html";
7
+ if (["json", "jsonc"].includes(ext)) return "json";
8
+ return "text";
9
+ }
10
+ const JS_KEYWORDS = new Set("import export from default const let var function return if else for while do switch case break continue new class extends super this typeof instanceof in of async await try catch finally throw yield delete void interface type enum implements public private protected readonly static as satisfies keyof declare namespace true false null undefined".split(" "));
11
+ function pushToken(out, kind, text) {
12
+ if (!text) return;
13
+ const last = out[out.length - 1];
14
+ if (last && last.kind === kind) last.text += text;
15
+ else out.push({
16
+ kind,
17
+ text
18
+ });
19
+ }
20
+ function stringEnd(line, i) {
21
+ const quote = line[i];
22
+ let j = i + 1;
23
+ while (j < line.length) {
24
+ if (line[j] === "\\") j += 2;
25
+ else if (line[j] === quote) return j + 1;
26
+ else j += 1;
27
+ }
28
+ return line.length;
29
+ }
30
+ function tokenizeJs(line, state, json) {
31
+ var _a, _b, _c;
32
+ const out = [];
33
+ let i = 0;
34
+ while (i < line.length) {
35
+ if (state.inBlockComment) {
36
+ const close = line.indexOf("*/", i);
37
+ const end = close < 0 ? line.length : close + 2;
38
+ pushToken(out, "comment", line.slice(i, end));
39
+ if (close >= 0) state.inBlockComment = false;
40
+ i = end;
41
+ } else {
42
+ const ch = line[i];
43
+ const rest = line.slice(i);
44
+ if (!json && rest.startsWith("//")) {
45
+ pushToken(out, "comment", rest);
46
+ i = line.length;
47
+ } else if (!json && rest.startsWith("/*")) {
48
+ state.inBlockComment = true;
49
+ pushToken(out, "comment", "/*");
50
+ i += 2;
51
+ } else if (ch === '"' || ch === "'" || ch === "`") {
52
+ const end = stringEnd(line, i);
53
+ const isKey = json && /^\s*:/.test(line.slice(end));
54
+ pushToken(out, isKey ? "property" : "string", line.slice(i, end));
55
+ i = end;
56
+ } else if (/[0-9]/.test(ch) && !/[A-Za-z_$]/.test((_a = line[i - 1]) != null ? _a : "")) {
57
+ const m = /^(0x[0-9a-f]+|\d[\d_]*(\.\d+)?(e[+-]?\d+)?)/i.exec(rest);
58
+ const text = m ? m[0] : ch;
59
+ pushToken(out, "number", text);
60
+ i += text.length;
61
+ } else if (/[A-Za-z_$]/.test(ch)) {
62
+ const word = (_c = (_b = /^[A-Za-z_$][\w$]*/.exec(rest)) == null ? void 0 : _b[0]) != null ? _c : ch;
63
+ const prev = line.slice(0, i).trimEnd();
64
+ const isTag = !json && (prev.endsWith("<") || prev.endsWith("</"));
65
+ let kind = "plain";
66
+ if (isTag) kind = "tag";
67
+ else if (JS_KEYWORDS.has(word)) kind = "keyword";
68
+ pushToken(out, kind, word);
69
+ i += word.length;
70
+ } else {
71
+ pushToken(out, /[{}()[\];,.:<>=+\-*/!?&|]/.test(ch) ? "punct" : "plain", ch);
72
+ i += 1;
73
+ }
74
+ }
75
+ }
76
+ return out;
77
+ }
78
+ function tokenizeCss(line, state) {
79
+ var _a, _b, _c, _d, _e;
80
+ const out = [];
81
+ let i = 0;
82
+ while (i < line.length) {
83
+ if (state.inBlockComment) {
84
+ const close = line.indexOf("*/", i);
85
+ const end = close < 0 ? line.length : close + 2;
86
+ pushToken(out, "comment", line.slice(i, end));
87
+ if (close >= 0) state.inBlockComment = false;
88
+ i = end;
89
+ } else {
90
+ const rest = line.slice(i);
91
+ const ch = line[i];
92
+ if (rest.startsWith("/*")) {
93
+ state.inBlockComment = true;
94
+ pushToken(out, "comment", "/*");
95
+ i += 2;
96
+ } else if (ch === '"' || ch === "'") {
97
+ const end = stringEnd(line, i);
98
+ pushToken(out, "string", line.slice(i, end));
99
+ i = end;
100
+ } else {
101
+ const before = line.slice(0, i);
102
+ const inValue = /:[^;{}]*$/.test(before);
103
+ const prop = /^([a-z-]+)(\s*:)/i.exec(rest);
104
+ if (prop && !inValue && /(^|[{;])\s*$/.test(before)) {
105
+ pushToken(out, "property", prop[1]);
106
+ i += prop[1].length;
107
+ } else {
108
+ const num = /^-?\d+(\.\d+)?(px|rem|em|%|vh|vw|s|ms|deg)?/.exec(rest);
109
+ if (num && !/[\w-]/.test((_a = line[i - 1]) != null ? _a : "")) {
110
+ pushToken(out, "number", num[0]);
111
+ i += num[0].length;
112
+ } else if (ch === "#" && inValue) {
113
+ const hex = (_c = (_b = /^#[0-9a-f]{3,8}\b/i.exec(rest)) == null ? void 0 : _b[0]) != null ? _c : ch;
114
+ pushToken(out, "number", hex);
115
+ i += hex.length;
116
+ } else if (ch === "#" || ch === "." || ch === "@") {
117
+ const sel = (_e = (_d = /^[#.@][\w-]+/.exec(rest)) == null ? void 0 : _d[0]) != null ? _e : ch;
118
+ pushToken(out, ch === "@" ? "keyword" : "tag", sel);
119
+ i += sel.length;
120
+ } else {
121
+ pushToken(out, /[{}();:,]/.test(ch) ? "punct" : "plain", ch);
122
+ i += 1;
123
+ }
124
+ }
125
+ }
126
+ }
127
+ }
128
+ return out;
129
+ }
130
+ function tokenizeHtml(line, state) {
131
+ const out = [];
132
+ let i = 0;
133
+ while (i < line.length) {
134
+ if (state.inBlockComment) {
135
+ const close = line.indexOf("-->", i);
136
+ const end = close < 0 ? line.length : close + 3;
137
+ pushToken(out, "comment", line.slice(i, end));
138
+ if (close >= 0) state.inBlockComment = false;
139
+ i = end;
140
+ } else {
141
+ const rest = line.slice(i);
142
+ if (rest.startsWith("<!--")) {
143
+ state.inBlockComment = true;
144
+ pushToken(out, "comment", "<!--");
145
+ i += 4;
146
+ } else {
147
+ const tag = /^<\/?[A-Za-z][\w:-]*/.exec(rest);
148
+ if (tag) {
149
+ pushToken(out, "punct", tag[0].startsWith("</") ? "</" : "<");
150
+ pushToken(out, "tag", tag[0].replace(/^<\/?/, ""));
151
+ i += tag[0].length;
152
+ } else {
153
+ const attr = /^([\w:@.-]+)(=)/.exec(rest);
154
+ if (attr && /\s$/.test(line.slice(0, i))) {
155
+ pushToken(out, "attr", attr[1]);
156
+ pushToken(out, "punct", "=");
157
+ i += attr[0].length;
158
+ } else if (line[i] === '"' || line[i] === "'") {
159
+ const end = stringEnd(line, i);
160
+ pushToken(out, "string", line.slice(i, end));
161
+ i = end;
162
+ } else {
163
+ pushToken(out, /[<>/=]/.test(line[i]) ? "punct" : "plain", line[i]);
164
+ i += 1;
165
+ }
166
+ }
167
+ }
168
+ }
169
+ }
170
+ return out;
171
+ }
172
+ function highlightLines(lines, language) {
173
+ const state = {
174
+ inBlockComment: false
175
+ };
176
+ return lines.map((line) => {
177
+ if (language === "js") return tokenizeJs(line, state, false);
178
+ if (language === "json") return tokenizeJs(line, state, true);
179
+ if (language === "css") return tokenizeCss(line, state);
180
+ if (language === "html") return tokenizeHtml(line, state);
181
+ return line ? [{
182
+ kind: "plain",
183
+ text: line
184
+ }] : [];
185
+ });
186
+ }
187
+ function tokenColors(isDark) {
188
+ return isDark ? {
189
+ plain: void 0,
190
+ keyword: "#c792ea",
191
+ string: "#a5e844",
192
+ comment: "#7f8ea3",
193
+ number: "#f78c6c",
194
+ tag: "#82aaff",
195
+ attr: "#ffcb6b",
196
+ property: "#89ddff",
197
+ punct: "#a6accd"
198
+ } : {
199
+ plain: void 0,
200
+ keyword: "#7c3aed",
201
+ string: "#15803d",
202
+ comment: "#8a8f98",
203
+ number: "#c2410c",
204
+ tag: "#1d4ed8",
205
+ attr: "#b45309",
206
+ property: "#0e7490",
207
+ punct: "#6b7280"
208
+ };
209
+ }export{codeLanguage,highlightLines,tokenColors};//# sourceMappingURL=codeHighlight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codeHighlight.js","sources":["../../../src/features/webbuilder/codeHighlight.ts"],"sourcesContent":["/**\n * Syntax colours for the Code view, the phone twin of the web editor's highlight\n * (CodeMirror, light and dark, #472). A small line tokenizer - keywords, strings,\n * comments, numbers, tags and attributes, CSS properties - with the block-comment\n * state carried from line to line. Pure: the view colours the spans.\n */\n\nexport type TokenKind = 'plain' | 'keyword' | 'string' | 'comment' | 'number' | 'tag' | 'attr' | 'property' | 'punct';\n\nexport interface Token {\n kind: TokenKind;\n text: string;\n}\n\nexport type CodeLanguage = 'js' | 'css' | 'html' | 'json' | 'text';\n\nexport function codeLanguage(path: string): CodeLanguage {\n const ext = /\\.([a-z0-9]+)$/i.exec(path)?.[1]?.toLowerCase() ?? '';\n if (['js', 'mjs', 'cjs', 'jsx', 'ts', 'mts', 'cts', 'tsx'].includes(ext)) return 'js';\n if (['css', 'scss', 'less', 'pcss'].includes(ext)) return 'css';\n if (['html', 'htm', 'vue', 'svelte', 'svg', 'xml'].includes(ext)) return 'html';\n if (['json', 'jsonc'].includes(ext)) return 'json';\n return 'text';\n}\n\nconst JS_KEYWORDS = new Set(\n (\n 'import export from default const let var function return if else for while do switch case break continue ' +\n 'new class extends super this typeof instanceof in of async await try catch finally throw yield delete void ' +\n 'interface type enum implements public private protected readonly static as satisfies keyof declare namespace ' +\n 'true false null undefined'\n ).split(' '),\n);\n\n/** Block comments (and HTML comments) may span lines; the state carries over. */\nexport interface LineState {\n inBlockComment: boolean;\n}\n\nfunction pushToken(out: Token[], kind: TokenKind, text: string): void {\n if (!text) return;\n const last = out[out.length - 1];\n if (last && last.kind === kind) last.text += text;\n else out.push({ kind, text });\n}\n\n/** Read a quoted string from `i` (the quote); returns the end index (exclusive). */\nfunction stringEnd(line: string, i: number): number {\n const quote = line[i];\n let j = i + 1;\n while (j < line.length) {\n if (line[j] === '\\\\') j += 2;\n else if (line[j] === quote) return j + 1;\n else j += 1;\n }\n return line.length;\n}\n\nfunction tokenizeJs(line: string, state: LineState, json: boolean): Token[] {\n const out: Token[] = [];\n let i = 0;\n while (i < line.length) {\n if (state.inBlockComment) {\n const close = line.indexOf('*/', i);\n const end = close < 0 ? line.length : close + 2;\n pushToken(out, 'comment', line.slice(i, end));\n if (close >= 0) state.inBlockComment = false; // eslint-disable-line no-param-reassign\n i = end;\n } else {\n const ch = line[i];\n const rest = line.slice(i);\n if (!json && rest.startsWith('//')) {\n pushToken(out, 'comment', rest);\n i = line.length;\n } else if (!json && rest.startsWith('/*')) {\n state.inBlockComment = true; // eslint-disable-line no-param-reassign\n pushToken(out, 'comment', '/*');\n i += 2;\n } else if (ch === '\"' || ch === \"'\" || ch === '`') {\n const end = stringEnd(line, i);\n // A JSON key reads as a property, its value as a string.\n const isKey = json && /^\\s*:/.test(line.slice(end));\n pushToken(out, isKey ? 'property' : 'string', line.slice(i, end));\n i = end;\n } else if (/[0-9]/.test(ch) && !/[A-Za-z_$]/.test(line[i - 1] ?? '')) {\n const m = /^(0x[0-9a-f]+|\\d[\\d_]*(\\.\\d+)?(e[+-]?\\d+)?)/i.exec(rest);\n const text = m ? m[0] : ch;\n pushToken(out, 'number', text);\n i += text.length;\n } else if (/[A-Za-z_$]/.test(ch)) {\n const word = /^[A-Za-z_$][\\w$]*/.exec(rest)?.[0] ?? ch;\n // `<Component` / `</div` in JSX: a tag.\n const prev = line.slice(0, i).trimEnd();\n const isTag = !json && (prev.endsWith('<') || prev.endsWith('</'));\n let kind: TokenKind = 'plain';\n if (isTag) kind = 'tag';\n else if (JS_KEYWORDS.has(word)) kind = 'keyword';\n pushToken(out, kind, word);\n i += word.length;\n } else {\n pushToken(out, /[{}()[\\];,.:<>=+\\-*/!?&|]/.test(ch) ? 'punct' : 'plain', ch);\n i += 1;\n }\n }\n }\n return out;\n}\n\nfunction tokenizeCss(line: string, state: LineState): Token[] {\n const out: Token[] = [];\n let i = 0;\n while (i < line.length) {\n if (state.inBlockComment) {\n const close = line.indexOf('*/', i);\n const end = close < 0 ? line.length : close + 2;\n pushToken(out, 'comment', line.slice(i, end));\n if (close >= 0) state.inBlockComment = false; // eslint-disable-line no-param-reassign\n i = end;\n } else {\n const rest = line.slice(i);\n const ch = line[i];\n if (rest.startsWith('/*')) {\n state.inBlockComment = true; // eslint-disable-line no-param-reassign\n pushToken(out, 'comment', '/*');\n i += 2;\n } else if (ch === '\"' || ch === \"'\") {\n const end = stringEnd(line, i);\n pushToken(out, 'string', line.slice(i, end));\n i = end;\n } else {\n // Inside a declaration's value: after a `:` since the last `;` / `{`.\n const before = line.slice(0, i);\n const inValue = /:[^;{}]*$/.test(before);\n const prop = /^([a-z-]+)(\\s*:)/i.exec(rest);\n if (prop && !inValue && /(^|[{;])\\s*$/.test(before)) {\n pushToken(out, 'property', prop[1]);\n i += prop[1].length;\n } else {\n const num = /^-?\\d+(\\.\\d+)?(px|rem|em|%|vh|vw|s|ms|deg)?/.exec(rest);\n if (num && !/[\\w-]/.test(line[i - 1] ?? '')) {\n pushToken(out, 'number', num[0]);\n i += num[0].length;\n } else if (ch === '#' && inValue) {\n // A colour (#fff) in a value, not an id selector.\n const hex = /^#[0-9a-f]{3,8}\\b/i.exec(rest)?.[0] ?? ch;\n pushToken(out, 'number', hex);\n i += hex.length;\n } else if (ch === '#' || ch === '.' || ch === '@') {\n const sel = /^[#.@][\\w-]+/.exec(rest)?.[0] ?? ch;\n pushToken(out, ch === '@' ? 'keyword' : 'tag', sel);\n i += sel.length;\n } else {\n pushToken(out, /[{}();:,]/.test(ch) ? 'punct' : 'plain', ch);\n i += 1;\n }\n }\n }\n }\n }\n return out;\n}\n\nfunction tokenizeHtml(line: string, state: LineState): Token[] {\n const out: Token[] = [];\n let i = 0;\n while (i < line.length) {\n if (state.inBlockComment) {\n const close = line.indexOf('-->', i);\n const end = close < 0 ? line.length : close + 3;\n pushToken(out, 'comment', line.slice(i, end));\n if (close >= 0) state.inBlockComment = false; // eslint-disable-line no-param-reassign\n i = end;\n } else {\n const rest = line.slice(i);\n if (rest.startsWith('<!--')) {\n state.inBlockComment = true; // eslint-disable-line no-param-reassign\n pushToken(out, 'comment', '<!--');\n i += 4;\n } else {\n const tag = /^<\\/?[A-Za-z][\\w:-]*/.exec(rest);\n if (tag) {\n pushToken(out, 'punct', tag[0].startsWith('</') ? '</' : '<');\n pushToken(out, 'tag', tag[0].replace(/^<\\/?/, ''));\n i += tag[0].length;\n } else {\n const attr = /^([\\w:@.-]+)(=)/.exec(rest);\n if (attr && /\\s$/.test(line.slice(0, i))) {\n pushToken(out, 'attr', attr[1]);\n pushToken(out, 'punct', '=');\n i += attr[0].length;\n } else if (line[i] === '\"' || line[i] === \"'\") {\n const end = stringEnd(line, i);\n pushToken(out, 'string', line.slice(i, end));\n i = end;\n } else {\n pushToken(out, /[<>/=]/.test(line[i]) ? 'punct' : 'plain', line[i]);\n i += 1;\n }\n }\n }\n }\n }\n return out;\n}\n\n/** Tokens per line for the whole file (the block-comment state carries line to line). */\nexport function highlightLines(lines: readonly string[], language: CodeLanguage): Token[][] {\n const state: LineState = { inBlockComment: false };\n return lines.map((line) => {\n if (language === 'js') return tokenizeJs(line, state, false);\n if (language === 'json') return tokenizeJs(line, state, true);\n if (language === 'css') return tokenizeCss(line, state);\n if (language === 'html') return tokenizeHtml(line, state);\n return line ? [{ kind: 'plain' as const, text: line }] : [];\n });\n}\n\n/** Colours per token kind, light and dark (the web editor's highlight style family). */\nexport function tokenColors(isDark: boolean): Record<TokenKind, string | undefined> {\n return isDark\n ? {\n plain: undefined,\n keyword: '#c792ea',\n string: '#a5e844',\n comment: '#7f8ea3',\n number: '#f78c6c',\n tag: '#82aaff',\n attr: '#ffcb6b',\n property: '#89ddff',\n punct: '#a6accd',\n }\n : {\n plain: undefined,\n keyword: '#7c3aed',\n string: '#15803d',\n comment: '#8a8f98',\n number: '#c2410c',\n tag: '#1d4ed8',\n attr: '#b45309',\n property: '#0e7490',\n punct: '#6b7280',\n };\n}\n"],"names":[],"mappings":"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"}