flea-qml 0.0.0-stage → 0.2.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 (637) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +511 -2
  3. package/THIRD-PARTY-NOTICES.md +29 -0
  4. package/demos/App.java +5 -0
  5. package/demos/Dockerfile +4 -0
  6. package/demos/Main.kt +3 -0
  7. package/demos/Program.cs +1 -0
  8. package/demos/README.md +12 -0
  9. package/demos/app.dart +3 -0
  10. package/demos/app.deb +0 -0
  11. package/demos/app.js +1 -0
  12. package/demos/backup.tar +0 -0
  13. package/demos/budget.xlsx +0 -0
  14. package/demos/build.sh +2 -0
  15. package/demos/bundle.zip +0 -0
  16. package/demos/clip.mp4 +0 -0
  17. package/demos/data.sqlite +0 -0
  18. package/demos/disk.iso +0 -0
  19. package/demos/engine.cpp +5 -0
  20. package/demos/firmware.bin +0 -0
  21. package/demos/flake.nix +4 -0
  22. package/demos/folder/inside.txt +1 -0
  23. package/demos/font.ttf +0 -0
  24. package/demos/index.html +5 -0
  25. package/demos/index.php +2 -0
  26. package/demos/init.lua +1 -0
  27. package/demos/letter.docx +0 -0
  28. package/demos/lib.rs +3 -0
  29. package/demos/main.c +6 -0
  30. package/demos/main.h +3 -0
  31. package/demos/math-and-diagrams.md +200 -0
  32. package/demos/notes.tar.gz +0 -0
  33. package/demos/notes.txt +3 -0
  34. package/demos/photo.png +0 -0
  35. package/demos/program +2 -0
  36. package/demos/report.pdf +32 -0
  37. package/demos/script.py +1 -0
  38. package/demos/server.go +7 -0
  39. package/demos/settings.json +4 -0
  40. package/demos/slides.pptx +0 -0
  41. package/demos/song.mp3 +0 -0
  42. package/demos/style.css +4 -0
  43. package/demos/tool.rb +1 -0
  44. package/demos/types.ts +2 -0
  45. package/docs/pele.md +23 -0
  46. package/docs/protocol.md +3420 -0
  47. package/docs/temml.md +63 -0
  48. package/index.js +107 -0
  49. package/package.json +34 -4
  50. package/src/archive.js +407 -0
  51. package/src/archiveops.js +728 -0
  52. package/src/backend.js +369 -0
  53. package/src/bulkrename.js +95 -0
  54. package/src/clip-host.js +76 -0
  55. package/src/clip.js +462 -0
  56. package/src/code.js +168 -0
  57. package/src/compare.js +74 -0
  58. package/src/create.js +128 -0
  59. package/src/dirsize.js +147 -0
  60. package/src/figure-svg.js +530 -0
  61. package/src/figure-thread.js +23 -0
  62. package/src/figure.js +132 -0
  63. package/src/find.js +55 -0
  64. package/src/flea.js +39 -0
  65. package/src/fsinfo.js +39 -0
  66. package/src/highlight.js +141 -0
  67. package/src/html.js +52 -0
  68. package/src/kinds.js +89 -0
  69. package/src/listing.js +130 -0
  70. package/src/markdown-html.js +317 -0
  71. package/src/mathml.js +186 -0
  72. package/src/menu.js +180 -0
  73. package/src/meta.js +135 -0
  74. package/src/office.js +810 -0
  75. package/src/order.js +100 -0
  76. package/src/peek.js +49 -0
  77. package/src/pele-wrapper.js +695 -0
  78. package/src/permissions.js +180 -0
  79. package/src/places.js +313 -0
  80. package/src/preview-language.js +10 -0
  81. package/src/terminal-server.js +95 -0
  82. package/src/terminal-shell.js +26 -0
  83. package/src/transfer.js +669 -0
  84. package/src/trash-record.js +41 -0
  85. package/src/trash.js +210 -0
  86. package/src/trashbrowse.js +327 -0
  87. package/src/uistate.js +393 -0
  88. package/src/uistore.js +168 -0
  89. package/src/vendor/LICENSES/Apache-2.0.txt +202 -0
  90. package/src/vendor/LICENSES/MIT-katex-2015.txt +27 -0
  91. package/src/vendor/LICENSES/MIT-katex.txt +21 -0
  92. package/src/vendor/LICENSES/MIT-mermaid.txt +21 -0
  93. package/src/vendor/LICENSES/MIT-pele.txt +40 -0
  94. package/src/vendor/LICENSES/MIT-perseus.txt +18 -0
  95. package/src/vendor/LICENSES/MIT-temml.txt +21 -0
  96. package/src/vendor/pele.js +145 -0
  97. package/src/vendor/temml.mjs +14708 -0
  98. package/src/watch.js +98 -0
  99. package/src/wayland/client.js +109 -0
  100. package/src/wayland/protocol.js +55 -0
  101. package/src/wayland/protocols/ext-data-control-v1.xml +276 -0
  102. package/src/wayland/protocols/wayland.xml +3248 -0
  103. package/src/wayland/protocols/wlr-data-control-unstable-v1.xml +278 -0
  104. package/src/wayland/resource-io.js +6 -0
  105. package/src/wayland/socket-discovery.js +26 -0
  106. package/src/wayland/transport-posix.js +120 -0
  107. package/src/wayland/transport-win32.js +11 -0
  108. package/src/wayland/transport.js +3 -0
  109. package/src/wayland/win32-resources.js +80 -0
  110. package/src/wayland/win32-wire.js +62 -0
  111. package/test/archive.test.js +80 -0
  112. package/test/bench-markdown-scroll.mjs +190 -0
  113. package/test/clip-host.test.js +113 -0
  114. package/test/code-preview.test.js +35 -0
  115. package/test/compare-ui-paths.test.js +24 -0
  116. package/test/compare.test.js +54 -0
  117. package/test/delete-trash.test.js +67 -0
  118. package/test/dirsize.test.js +138 -0
  119. package/test/file-ops.test.js +307 -0
  120. package/test/file-url.test.js +24 -0
  121. package/test/find-contents.test.js +161 -0
  122. package/test/find-input.test.js +66 -0
  123. package/test/fixtures/pele-parity.json +1006 -0
  124. package/test/highlight-launcher.test.js +35 -0
  125. package/test/html-preview.test.js +22 -0
  126. package/test/input.test.js +15 -0
  127. package/test/keymap.test.js +26 -0
  128. package/test/language-icons.test.js +36 -0
  129. package/test/launcher.test.js +51 -0
  130. package/test/manual-archive-here-ui.mjs +47 -0
  131. package/test/manual-code-scroll.mjs +28 -0
  132. package/test/manual-column-scroll.mjs +24 -0
  133. package/test/manual-compare-ui.mjs +20 -0
  134. package/test/manual-find-status.mjs +37 -0
  135. package/test/manual-folder-focus.mjs +63 -0
  136. package/test/manual-html-security.mjs +23 -0
  137. package/test/manual-html-ui.mjs +30 -0
  138. package/test/manual-syntax-preview.mjs +26 -0
  139. package/test/manual-terminal-lifecycle.mjs +42 -0
  140. package/test/manual-terminal-navigation.mjs +48 -0
  141. package/test/manual-terminal-ui.mjs +47 -0
  142. package/test/manual-trash-ui.mjs +86 -0
  143. package/test/markdown-diagrams.test.js +93 -0
  144. package/test/markdown-html.test.js +105 -0
  145. package/test/mathml.test.js +92 -0
  146. package/test/menu-transfer.test.js +57 -0
  147. package/test/office-preview.test.js +154 -0
  148. package/test/pele-parity.test.js +28 -0
  149. package/test/places.test.js +134 -0
  150. package/test/preview-keys.test.js +60 -0
  151. package/test/preview-language.test.js +22 -0
  152. package/test/status-filename.test.js +20 -0
  153. package/test/transfer-replace-merge.test.js +187 -0
  154. package/test/trash-address.test.js +23 -0
  155. package/test/trash-view.test.js +37 -0
  156. package/test/trashbrowse.test.js +135 -0
  157. package/ui/AboutFacts.qml +78 -0
  158. package/ui/ArchiveCards.qml +95 -0
  159. package/ui/ArchiveCompressDialog.qml +378 -0
  160. package/ui/ArchiveHereConfirm.qml +127 -0
  161. package/ui/ArchivePasswordDialog.qml +257 -0
  162. package/ui/Backend.qml +775 -0
  163. package/ui/BulkOldNames.qml +47 -0
  164. package/ui/BulkRenameDialog.qml +380 -0
  165. package/ui/CardFrame.qml +67 -0
  166. package/ui/CardScroll.qml +79 -0
  167. package/ui/CheckBox.qml +73 -0
  168. package/ui/ChromeBar.qml +360 -0
  169. package/ui/ChromeButton.qml +131 -0
  170. package/ui/ChromeModes.qml +43 -0
  171. package/ui/CodeLines.qml +256 -0
  172. package/ui/CodeRefusal.qml +52 -0
  173. package/ui/CollideConfirm.qml +147 -0
  174. package/ui/CollideHost.qml +167 -0
  175. package/ui/ColumnPane.qml +525 -0
  176. package/ui/ColumnRow.qml +380 -0
  177. package/ui/ColumnsArea.qml +594 -0
  178. package/ui/ColumnsLanding.qml +147 -0
  179. package/ui/CompareView.qml +321 -0
  180. package/ui/ContextMenu.qml +743 -0
  181. package/ui/ConvertDialog.qml +456 -0
  182. package/ui/CountedWorker.qml +7 -0
  183. package/ui/Crumb.qml +64 -0
  184. package/ui/CrumbDrop.qml +25 -0
  185. package/ui/CsvTable.qml +394 -0
  186. package/ui/CursorMark.qml +41 -0
  187. package/ui/DefaultClaim.qml +130 -0
  188. package/ui/DeviceLock.qml +47 -0
  189. package/ui/DeviceMounts.qml +540 -0
  190. package/ui/DialogButton.qml +150 -0
  191. package/ui/DialogField.qml +147 -0
  192. package/ui/DialogHeader.qml +31 -0
  193. package/ui/DialogScrim.qml +20 -0
  194. package/ui/DialogTitle.qml +37 -0
  195. package/ui/Divider.qml +9 -0
  196. package/ui/DropInto.qml +126 -0
  197. package/ui/DropTarget.qml +35 -0
  198. package/ui/DropboxMark.qml +60 -0
  199. package/ui/EmptyState.qml +150 -0
  200. package/ui/EscapeHint.qml +11 -0
  201. package/ui/FactsTable.qml +54 -0
  202. package/ui/FastScrollHandler.qml +476 -0
  203. package/ui/FatNamesConfirm.qml +157 -0
  204. package/ui/Favourites.qml +143 -0
  205. package/ui/FigureService.qml +120 -0
  206. package/ui/FileDrag.qml +267 -0
  207. package/ui/FilterStrip.qml +133 -0
  208. package/ui/FitMetrics.qml +22 -0
  209. package/ui/FlashDriveRows.qml +137 -0
  210. package/ui/FlashHost.qml +72 -0
  211. package/ui/FlashImageRow.qml +104 -0
  212. package/ui/FlashRunner.qml +119 -0
  213. package/ui/FlashStepRow.qml +172 -0
  214. package/ui/FlashStrip.qml +38 -0
  215. package/ui/FlashView.qml +397 -0
  216. package/ui/FleaMark.qml +88 -0
  217. package/ui/FlyoutFade.qml +23 -0
  218. package/ui/FontPane.qml +170 -0
  219. package/ui/Glass.qml +114 -0
  220. package/ui/GlassTagger.qml +59 -0
  221. package/ui/Glyph.qml +64 -0
  222. package/ui/GlyphSolid.qml +22 -0
  223. package/ui/GridArea.qml +664 -0
  224. package/ui/GridTile.qml +325 -0
  225. package/ui/GvfsBridge.qml +164 -0
  226. package/ui/Header.qml +433 -0
  227. package/ui/HoverTimers.qml +39 -0
  228. package/ui/HtmlClip.qml +30 -0
  229. package/ui/HtmlPane.qml +63 -0
  230. package/ui/HyprlandMark.qml +45 -0
  231. package/ui/Ipc.qml +1005 -0
  232. package/ui/IpcControls.qml +7 -0
  233. package/ui/IpcMenuState.qml +48 -0
  234. package/ui/IpcPreviewState.qml +185 -0
  235. package/ui/JumpPath.qml +51 -0
  236. package/ui/KeymapSheet.qml +561 -0
  237. package/ui/KeymapSheetResult.qml +89 -0
  238. package/ui/KindStack.qml +40 -0
  239. package/ui/LangMark.qml +51 -0
  240. package/ui/LangMarkLoader.qml +26 -0
  241. package/ui/List.qml +480 -0
  242. package/ui/LoadingState.qml +54 -0
  243. package/ui/LocalSend.qml +56 -0
  244. package/ui/LocalSendMark.qml +73 -0
  245. package/ui/MarkdownBlockView.qml +311 -0
  246. package/ui/MarkdownBlocks.qml +35 -0
  247. package/ui/MarkdownFigure.qml +254 -0
  248. package/ui/MarkdownImages.qml +72 -0
  249. package/ui/MarkdownList.qml +81 -0
  250. package/ui/MarkdownMathsText.qml +97 -0
  251. package/ui/MarkdownPane.qml +83 -0
  252. package/ui/MarkdownPictures.qml +41 -0
  253. package/ui/MarkdownQuote.qml +52 -0
  254. package/ui/MarkdownRemote.qml +82 -0
  255. package/ui/MarkdownSource.qml +155 -0
  256. package/ui/MarkdownTable.qml +222 -0
  257. package/ui/MarkdownTableScroll.qml +64 -0
  258. package/ui/MarkdownTableWheel.qml +126 -0
  259. package/ui/MarkdownText.qml +87 -0
  260. package/ui/MarkdownWorker.js +132 -0
  261. package/ui/MatchText.qml +99 -0
  262. package/ui/MediaSession.qml +38 -0
  263. package/ui/MediaSound.qml +26 -0
  264. package/ui/MediaStrip.qml +191 -0
  265. package/ui/MediaTrack.qml +36 -0
  266. package/ui/MediaVolume.qml +54 -0
  267. package/ui/MenuActionDialog.qml +396 -0
  268. package/ui/MenuEdgeFade.qml +24 -0
  269. package/ui/MenuHost.qml +227 -0
  270. package/ui/MenuRow.qml +351 -0
  271. package/ui/MountListing.qml +100 -0
  272. package/ui/NetworkDialog.qml +435 -0
  273. package/ui/NetworkForm.qml +426 -0
  274. package/ui/NetworkMounts.qml +913 -0
  275. package/ui/NetworkPlaces.qml +127 -0
  276. package/ui/OpenWithDialog.qml +613 -0
  277. package/ui/Opener.qml +95 -0
  278. package/ui/Pane.qml +1320 -0
  279. package/ui/PaneMenuActions.qml +527 -0
  280. package/ui/PanePath.qml +90 -0
  281. package/ui/PaneRail.qml +268 -0
  282. package/ui/PaneStates.qml +88 -0
  283. package/ui/PaneSwap.qml +339 -0
  284. package/ui/PaneWire.qml +601 -0
  285. package/ui/ParkedWait.qml +9 -0
  286. package/ui/PathEntry.qml +186 -0
  287. package/ui/PathJump.qml +400 -0
  288. package/ui/PdfViewer.qml +297 -0
  289. package/ui/PermissionsDialog.qml +658 -0
  290. package/ui/PermissionsHeadings.qml +31 -0
  291. package/ui/PhoneMounts.qml +67 -0
  292. package/ui/PickerAnswers.qml +75 -0
  293. package/ui/PickerBox.qml +26 -0
  294. package/ui/PickerChrome.qml +295 -0
  295. package/ui/PickerFilter.qml +97 -0
  296. package/ui/PickerGrid.qml +308 -0
  297. package/ui/PickerHeader.qml +28 -0
  298. package/ui/PickerLifecycle.qml +27 -0
  299. package/ui/PickerList.qml +218 -0
  300. package/ui/PickerListing.qml +149 -0
  301. package/ui/PickerPathBar.qml +127 -0
  302. package/ui/PickerPlaces.qml +189 -0
  303. package/ui/PickerRecent.qml +92 -0
  304. package/ui/PickerSave.qml +101 -0
  305. package/ui/PickerSelection.qml +155 -0
  306. package/ui/PickerWindow.qml +846 -0
  307. package/ui/PowerSectorsReader.qml +10 -0
  308. package/ui/PrebuildDriver.qml +146 -0
  309. package/ui/Preview.qml +1005 -0
  310. package/ui/PreviewAnimation.qml +24 -0
  311. package/ui/PreviewArchive.qml +91 -0
  312. package/ui/PreviewColumn.qml +553 -0
  313. package/ui/PreviewEdge.qml +63 -0
  314. package/ui/PreviewFacts.qml +30 -0
  315. package/ui/PreviewFactsLine.qml +34 -0
  316. package/ui/PreviewHtml.qml +233 -0
  317. package/ui/PreviewImage.qml +253 -0
  318. package/ui/PreviewImagePan.qml +13 -0
  319. package/ui/PreviewImageSharp.qml +32 -0
  320. package/ui/PreviewLines.qml +106 -0
  321. package/ui/PreviewMarkdown.qml +706 -0
  322. package/ui/PreviewMedia.qml +250 -0
  323. package/ui/PreviewPdf.qml +482 -0
  324. package/ui/PreviewScroll.qml +201 -0
  325. package/ui/PreviewSwap.qml +335 -0
  326. package/ui/PreviewText.qml +149 -0
  327. package/ui/ProtocolChip.qml +18 -0
  328. package/ui/QuickLookArchive.qml +41 -0
  329. package/ui/QuickLookBar.qml +103 -0
  330. package/ui/QuickLookPrepare.qml +355 -0
  331. package/ui/QuickLookSwap.qml +10 -0
  332. package/ui/QuickLookWarm.qml +65 -0
  333. package/ui/RailDrop.qml +155 -0
  334. package/ui/RailHeading.qml +19 -0
  335. package/ui/RailPlaces.qml +38 -0
  336. package/ui/RailTrashRow.qml +67 -0
  337. package/ui/RenameField.qml +353 -0
  338. package/ui/RendererRetry.qml +11 -0
  339. package/ui/ResizeHandle.qml +52 -0
  340. package/ui/Reveal.qml +54 -0
  341. package/ui/Row.qml +476 -0
  342. package/ui/RowDrag.qml +213 -0
  343. package/ui/RowDropTarget.qml +27 -0
  344. package/ui/RunCard.qml +286 -0
  345. package/ui/Scripts.qml +65 -0
  346. package/ui/SearchStrip.qml +232 -0
  347. package/ui/SelectionBand.qml +140 -0
  348. package/ui/SelectionPreview.qml +370 -0
  349. package/ui/SettingsFavourite.qml +122 -0
  350. package/ui/SettingsGroup.qml +96 -0
  351. package/ui/SettingsHint.qml +12 -0
  352. package/ui/SettingsMetrics.qml +29 -0
  353. package/ui/SettingsPane.qml +178 -0
  354. package/ui/SettingsPanel.qml +547 -0
  355. package/ui/SettingsRail.qml +128 -0
  356. package/ui/SettingsRow.qml +409 -0
  357. package/ui/SettingsRuler.qml +85 -0
  358. package/ui/SettingsSegment.qml +85 -0
  359. package/ui/ShareBrowser.qml +113 -0
  360. package/ui/ShareLink.qml +67 -0
  361. package/ui/ShelfPins.qml +101 -0
  362. package/ui/Sidebar.qml +728 -0
  363. package/ui/SidebarRow.qml +358 -0
  364. package/ui/Spinner.qml +60 -0
  365. package/ui/StableModel.qml +89 -0
  366. package/ui/StateMessage.qml +84 -0
  367. package/ui/StatusBar.qml +512 -0
  368. package/ui/StatusFileName.qml +27 -0
  369. package/ui/TabBar.qml +673 -0
  370. package/ui/TabDragGeometry.qml +60 -0
  371. package/ui/TagMenuMark.qml +52 -0
  372. package/ui/TagRailSection.qml +53 -0
  373. package/ui/TagSlot.qml +40 -0
  374. package/ui/TagState.qml +150 -0
  375. package/ui/TagSwatch.qml +28 -0
  376. package/ui/Taildrop.qml +86 -0
  377. package/ui/TailscaleMark.qml +50 -0
  378. package/ui/TerminalService.qml +69 -0
  379. package/ui/TerminalTab.qml +48 -0
  380. package/ui/TerminalTabs.qml +27 -0
  381. package/ui/Theme.qml +460 -0
  382. package/ui/ThemeColors.qml +43 -0
  383. package/ui/TransferCard.qml +239 -0
  384. package/ui/TrashConfirm.qml +129 -0
  385. package/ui/TrashDropHandler.qml +11 -0
  386. package/ui/TrashHost.qml +202 -0
  387. package/ui/TrashMonitor.qml +30 -0
  388. package/ui/TrashToolbar.qml +19 -0
  389. package/ui/TrashView.qml +492 -0
  390. package/ui/UnlockDialog.qml +450 -0
  391. package/ui/UnlockHost.qml +206 -0
  392. package/ui/UpdateCheck.qml +97 -0
  393. package/ui/UserDirs.qml +25 -0
  394. package/ui/ViewState.qml +565 -0
  395. package/ui/ViewportScrollBar.qml +195 -0
  396. package/ui/ViewportScrollBars.qml +25 -0
  397. package/ui/WebPreview.qml +33 -0
  398. package/ui/WebPreviewView.qml +26 -0
  399. package/ui/WindowBody.qml +829 -0
  400. package/ui/WindowDrag.qml +35 -0
  401. package/ui/boot/Commons/AudioNodes.qml +50 -0
  402. package/ui/boot/Commons/AudioNodesModel.js +96 -0
  403. package/ui/boot/Commons/Border.qml +243 -0
  404. package/ui/boot/Commons/BorderGeometry.js +373 -0
  405. package/ui/boot/Commons/Color.qml +258 -0
  406. package/ui/boot/Commons/I18n.qml +118 -0
  407. package/ui/boot/Commons/InputDevices.qml +112 -0
  408. package/ui/boot/Commons/InputMethodState.qml +38 -0
  409. package/ui/boot/Commons/IpcRegistry.qml +77 -0
  410. package/ui/boot/Commons/Numbers.js +19 -0
  411. package/ui/boot/Commons/Plural.js +91 -0
  412. package/ui/boot/Commons/ShellIpc.qml +12 -0
  413. package/ui/boot/Commons/Style.qml +561 -0
  414. package/ui/boot/Commons/Translations.qml +100 -0
  415. package/ui/boot/Commons/UntypedInput.qml +152 -0
  416. package/ui/boot/Commons/Util.qml +188 -0
  417. package/ui/boot/Commons/qmldir +13 -0
  418. package/ui/boot/LICENSE-omarchy +20 -0
  419. package/ui/boot/Ui/BackgroundMedia.qml +49 -0
  420. package/ui/boot/Ui/BarIconButton.qml +106 -0
  421. package/ui/boot/Ui/BarIconContent.qml +38 -0
  422. package/ui/boot/Ui/BarIndicator.qml +53 -0
  423. package/ui/boot/Ui/BarWidget.qml +50 -0
  424. package/ui/boot/Ui/BorderOverlay.qml +54 -0
  425. package/ui/boot/Ui/BorderSurface.qml +40 -0
  426. package/ui/boot/Ui/Button.qml +224 -0
  427. package/ui/boot/Ui/ButtonGroup.qml +131 -0
  428. package/ui/boot/Ui/ConfirmDialog.qml +134 -0
  429. package/ui/boot/Ui/CursorSurface.qml +42 -0
  430. package/ui/boot/Ui/Dropdown.qml +245 -0
  431. package/ui/boot/Ui/FilterInput.qml +26 -0
  432. package/ui/boot/Ui/IconContentBounds.qml +141 -0
  433. package/ui/boot/Ui/KeyboardPanel.qml +453 -0
  434. package/ui/boot/Ui/MultiSelect.qml +624 -0
  435. package/ui/boot/Ui/NumberField.qml +86 -0
  436. package/ui/boot/Ui/OpticalGlyph.qml +68 -0
  437. package/ui/boot/Ui/OverlayWindow.qml +102 -0
  438. package/ui/boot/Ui/Panel.qml +60 -0
  439. package/ui/boot/Ui/PanelActionButton.qml +105 -0
  440. package/ui/boot/Ui/PanelController.qml +16 -0
  441. package/ui/boot/Ui/PanelHero.qml +112 -0
  442. package/ui/boot/Ui/PanelKeyCatcher.qml +100 -0
  443. package/ui/boot/Ui/PanelSectionHeader.qml +31 -0
  444. package/ui/boot/Ui/PanelSeparator.qml +19 -0
  445. package/ui/boot/Ui/PanelSlider.qml +156 -0
  446. package/ui/boot/Ui/PanelToolTip.qml +50 -0
  447. package/ui/boot/Ui/PluginBarApi.qml +89 -0
  448. package/ui/boot/Ui/PointerMoveGate.qml +54 -0
  449. package/ui/boot/Ui/PopupCard.qml +181 -0
  450. package/ui/boot/Ui/ScreenMoveRemap.qml +43 -0
  451. package/ui/boot/Ui/SearchableDropdown.qml +354 -0
  452. package/ui/boot/Ui/SizedImage.qml +125 -0
  453. package/ui/boot/Ui/SpeedTestOverlay.qml +412 -0
  454. package/ui/boot/Ui/TextField.qml +58 -0
  455. package/ui/boot/Ui/Toggle.qml +118 -0
  456. package/ui/boot/Ui/ToggleSwitch.qml +115 -0
  457. package/ui/boot/Ui/WidgetButton.qml +172 -0
  458. package/ui/boot/Ui/qmldir +41 -0
  459. package/ui/boot/fleatab.qml +50 -0
  460. package/ui/boot/picker.qml +39 -0
  461. package/ui/boot/shell.qml +131 -0
  462. package/ui/boot/tabtearoff.qml +51 -0
  463. package/ui/js/Anchor.js +379 -0
  464. package/ui/js/AnchorHold.js +162 -0
  465. package/ui/js/Archive.js +157 -0
  466. package/ui/js/ArchiveCard.js +44 -0
  467. package/ui/js/ArchiveOps.js +44 -0
  468. package/ui/js/BackReturn.js +118 -0
  469. package/ui/js/BulkRename.js +100 -0
  470. package/ui/js/Buttons.js +54 -0
  471. package/ui/js/ChromeKeys.js +116 -0
  472. package/ui/js/ClipMarks.js +73 -0
  473. package/ui/js/ClipSelection.js +67 -0
  474. package/ui/js/Clipboard.js +179 -0
  475. package/ui/js/Cloud.js +97 -0
  476. package/ui/js/CodeRuns.js +72 -0
  477. package/ui/js/Collide.js +212 -0
  478. package/ui/js/ColumnFit.js +28 -0
  479. package/ui/js/ColumnMenu.js +111 -0
  480. package/ui/js/Columns.js +298 -0
  481. package/ui/js/ColumnsCarry.js +103 -0
  482. package/ui/js/Compare.js +74 -0
  483. package/ui/js/Contrast.js +157 -0
  484. package/ui/js/ControlReader.js +42 -0
  485. package/ui/js/Convert.js +52 -0
  486. package/ui/js/CopyAs.js +52 -0
  487. package/ui/js/Crumbs.js +178 -0
  488. package/ui/js/Csv.js +231 -0
  489. package/ui/js/Density.js +44 -0
  490. package/ui/js/Devices.js +440 -0
  491. package/ui/js/DirSizes.js +180 -0
  492. package/ui/js/Drag.js +360 -0
  493. package/ui/js/DragOut.js +166 -0
  494. package/ui/js/DropDev.js +52 -0
  495. package/ui/js/Dropbox.js +41 -0
  496. package/ui/js/Eject.js +217 -0
  497. package/ui/js/Errors.js +188 -0
  498. package/ui/js/ExtThumbs.js +115 -0
  499. package/ui/js/Facts.js +402 -0
  500. package/ui/js/FigureDate.js +14 -0
  501. package/ui/js/Filter.js +285 -0
  502. package/ui/js/Find.js +46 -0
  503. package/ui/js/Flash.js +184 -0
  504. package/ui/js/FlashCard.js +79 -0
  505. package/ui/js/FlashEndings.js +125 -0
  506. package/ui/js/FlashPane.js +116 -0
  507. package/ui/js/FleaBin.js +12 -0
  508. package/ui/js/Focus.js +504 -0
  509. package/ui/js/FolderSorts.js +108 -0
  510. package/ui/js/FolderViews.js +44 -0
  511. package/ui/js/Format.js +314 -0
  512. package/ui/js/Fuzzy.js +141 -0
  513. package/ui/js/GlassTag.js +72 -0
  514. package/ui/js/Grid.js +33 -0
  515. package/ui/js/GridGeometry.js +90 -0
  516. package/ui/js/GridNames.js +153 -0
  517. package/ui/js/GvfsBridge.js +200 -0
  518. package/ui/js/HostClipboard.js +29 -0
  519. package/ui/js/Icons.js +218 -0
  520. package/ui/js/Input.js +50 -0
  521. package/ui/js/Jump.js +200 -0
  522. package/ui/js/KeyName.js +64 -0
  523. package/ui/js/Keymap.js +401 -0
  524. package/ui/js/Kinds.js +164 -0
  525. package/ui/js/LICENSES/ISC-lucide.txt +43 -0
  526. package/ui/js/LangMarkPaths.js +47 -0
  527. package/ui/js/LangMarks.js +120 -0
  528. package/ui/js/Lists.js +11 -0
  529. package/ui/js/LocalSend.js +39 -0
  530. package/ui/js/LockedMenu.js +63 -0
  531. package/ui/js/MakeDefault.js +186 -0
  532. package/ui/js/MarkBox.js +7 -0
  533. package/ui/js/Markdown.js +119 -0
  534. package/ui/js/MarkdownLists.js +86 -0
  535. package/ui/js/MarkdownMaths.js +58 -0
  536. package/ui/js/MarkdownPictures.js +32 -0
  537. package/ui/js/MarkdownPrepared.js +139 -0
  538. package/ui/js/MarkdownTableFit.js +34 -0
  539. package/ui/js/Marks.js +148 -0
  540. package/ui/js/Marquee.js +96 -0
  541. package/ui/js/Match.js +93 -0
  542. package/ui/js/Material.js +109 -0
  543. package/ui/js/MdBlocks.js +437 -0
  544. package/ui/js/MdBreak.js +71 -0
  545. package/ui/js/MdChunks.js +70 -0
  546. package/ui/js/MdContainer.js +137 -0
  547. package/ui/js/MdDocument.js +337 -0
  548. package/ui/js/MdEmph.js +97 -0
  549. package/ui/js/MdEntity.js +108 -0
  550. package/ui/js/MdEntityTable.js +223 -0
  551. package/ui/js/MdEscape.js +59 -0
  552. package/ui/js/MdFront.js +37 -0
  553. package/ui/js/MdHold.js +32 -0
  554. package/ui/js/MdHtml.js +307 -0
  555. package/ui/js/MdHtmlBlock.js +290 -0
  556. package/ui/js/MdHtmlHeading.js +53 -0
  557. package/ui/js/MdHtmlImage.js +179 -0
  558. package/ui/js/MdInline.js +154 -0
  559. package/ui/js/MdItems.js +212 -0
  560. package/ui/js/MdLeaf.js +309 -0
  561. package/ui/js/MdLink.js +196 -0
  562. package/ui/js/MdMath.js +67 -0
  563. package/ui/js/MdParagraphs.js +138 -0
  564. package/ui/js/MdRefs.js +232 -0
  565. package/ui/js/MdResolve.js +226 -0
  566. package/ui/js/MdRun.js +300 -0
  567. package/ui/js/MdUrl.js +226 -0
  568. package/ui/js/Menu.js +514 -0
  569. package/ui/js/MenuContext.js +85 -0
  570. package/ui/js/MenuFit.js +13 -0
  571. package/ui/js/MenuRefresh.js +74 -0
  572. package/ui/js/MenuWheel.js +35 -0
  573. package/ui/js/Messages.js +186 -0
  574. package/ui/js/Motion.js +16 -0
  575. package/ui/js/Mounts.js +320 -0
  576. package/ui/js/MouseNav.js +13 -0
  577. package/ui/js/Nav.js +329 -0
  578. package/ui/js/NetFs.js +26 -0
  579. package/ui/js/OpenWith.js +83 -0
  580. package/ui/js/Ops.js +585 -0
  581. package/ui/js/Palette.js +33 -0
  582. package/ui/js/PathBar.js +260 -0
  583. package/ui/js/Permissions.js +179 -0
  584. package/ui/js/Phones.js +112 -0
  585. package/ui/js/Picker.js +353 -0
  586. package/ui/js/PlaceMenu.js +96 -0
  587. package/ui/js/Places.js +265 -0
  588. package/ui/js/PreviewAsk.js +21 -0
  589. package/ui/js/PreviewKeys.js +155 -0
  590. package/ui/js/PreviewSettle.js +29 -0
  591. package/ui/js/PreviewSwap.js +101 -0
  592. package/ui/js/PropertyFacts.js +144 -0
  593. package/ui/js/Protocols.js +296 -0
  594. package/ui/js/QuickLookKinds.js +27 -0
  595. package/ui/js/QuickLookRect.js +24 -0
  596. package/ui/js/RailDrop.js +51 -0
  597. package/ui/js/RailKeys.js +87 -0
  598. package/ui/js/RailMenu.js +133 -0
  599. package/ui/js/Recent.js +135 -0
  600. package/ui/js/RecentMode.js +156 -0
  601. package/ui/js/Reload.js +60 -0
  602. package/ui/js/Renderer.js +9 -0
  603. package/ui/js/RunFile.js +143 -0
  604. package/ui/js/Scripts.js +28 -0
  605. package/ui/js/Scroll.js +304 -0
  606. package/ui/js/ScrollOff.js +69 -0
  607. package/ui/js/Search.js +478 -0
  608. package/ui/js/Selection.js +97 -0
  609. package/ui/js/Settings.js +476 -0
  610. package/ui/js/SettingsAbout.js +97 -0
  611. package/ui/js/SettingsShelf.js +52 -0
  612. package/ui/js/SheetKeys.js +42 -0
  613. package/ui/js/SheetQuery.js +281 -0
  614. package/ui/js/ShelfPile.js +27 -0
  615. package/ui/js/SlowClick.js +53 -0
  616. package/ui/js/SlowOp.js +6 -0
  617. package/ui/js/Sort.js +134 -0
  618. package/ui/js/Startup.js +63 -0
  619. package/ui/js/StateWords.js +17 -0
  620. package/ui/js/Status.js +238 -0
  621. package/ui/js/Swap.js +166 -0
  622. package/ui/js/TabMove.js +39 -0
  623. package/ui/js/Tabs.js +751 -0
  624. package/ui/js/Tags.js +134 -0
  625. package/ui/js/Taildrop.js +128 -0
  626. package/ui/js/Tap.js +180 -0
  627. package/ui/js/TextSize.js +107 -0
  628. package/ui/js/Thumbs.js +158 -0
  629. package/ui/js/Transfer.js +172 -0
  630. package/ui/js/Trash.js +84 -0
  631. package/ui/js/TrashDates.js +47 -0
  632. package/ui/js/TrashDrop.js +64 -0
  633. package/ui/js/UiState.js +438 -0
  634. package/ui/js/Unlock.js +152 -0
  635. package/ui/js/Update.js +130 -0
  636. package/ui/js/UserDirs.js +56 -0
  637. package/ui/qmldir +230 -0
@@ -0,0 +1,35 @@
1
+ import QtQuick
2
+
3
+ // The pointer's title bar: ui/shell.qml asks for no decorations, so nothing in this tree ever asked
4
+ // the compositor to move the window and only its own Super bind could.
5
+ Item {
6
+ id: root
7
+
8
+ // The caller's path editor is up, and a press that travels there selects text rather than moves.
9
+ required property bool editing
10
+ // False while something covers the chrome, so a drag that starts on it moves nothing beneath.
11
+ property bool inputLive: true
12
+
13
+ anchors.fill: parent
14
+
15
+ DragHandler {
16
+ id: move
17
+
18
+ // A handler and not a MouseArea, so a press that does not travel stays a click on the button,
19
+ // crumb or path under the pointer, and target is null because the move belongs to the window.
20
+ target: null
21
+ acceptedButtons: Qt.LeftButton
22
+ // Well under Qt's own 10, because a title bar reads a few pixels of travel as intent.
23
+ dragThreshold: 4
24
+ enabled: !root.editing && root.inputLive
25
+
26
+ onActiveChanged: {
27
+ if (!move.active)
28
+ return
29
+ // The same attached route ui/CardScroll.qml and ui/Ipc.qml take, so no window is threaded in.
30
+ var window = root.Window.window
31
+ if (window)
32
+ window.startSystemMove()
33
+ }
34
+ }
35
+ }
@@ -0,0 +1,50 @@
1
+ pragma Singleton
2
+ import QtQuick
3
+ import Quickshell
4
+ import Quickshell.Io
5
+ import "AudioNodesModel.js" as Model
6
+
7
+ // Which PipeWire nodes the audio panel and the microphone widget leave out:
8
+ // the shell's own level meters, and the nodes a platform's audio processing
9
+ // adds, which its platform package names in the fixed platform root (see
10
+ // Model.parsePlatformAudio). No environment variable moves that file, and most
11
+ // machines have none, so nothing of theirs is left out.
12
+ Singleton {
13
+ id: root
14
+
15
+ // Read synchronously at startup (the FileView blocks loading), then kept
16
+ // current by its load handlers below. Binding this to the missing flag
17
+ // the handlers write — as it was — loops on every shell start.
18
+ property var hints: Model.parsePlatformAudio(hintsFile.text())
19
+
20
+ // Whether the platform's hints hide a node, given the names of every node
21
+ // now in the graph (for a "replaced" node).
22
+ function platformHides(name, nodeNames) {
23
+ return Model.platformHidesNode(name, hints, nodeNames)
24
+ }
25
+
26
+ function isShellLevelMeter(name) {
27
+ return Model.isShellLevelMeter(name)
28
+ }
29
+
30
+ FileView {
31
+ id: hintsFile
32
+
33
+ // A file that went away hints nothing, whatever text() still holds.
34
+ property bool missing: false
35
+
36
+ path: "/usr/share/omarchy-platform/audio.json"
37
+ blockLoading: true
38
+ watchChanges: true
39
+ printErrors: false
40
+ onLoaded: {
41
+ missing = false
42
+ root.hints = Model.parsePlatformAudio(text())
43
+ }
44
+ onLoadFailed: {
45
+ missing = true
46
+ root.hints = Model.parsePlatformAudio("")
47
+ }
48
+ onFileChanged: reload()
49
+ }
50
+ }
@@ -0,0 +1,96 @@
1
+ // Audio node rules the bar and the audio panel share. Plain functions, so the
2
+ // tests load this file in Node.
3
+
4
+ // The level meter the shell runs itself: Quickshell's peak monitor stream,
5
+ // named after the shell or after its stream depending on the PipeWire version.
6
+ // It is not an app using the input.
7
+ function isShellLevelMeter(name) {
8
+ var value = String(name || "")
9
+ return value === "quickshell" || value === "quickshell-peak-monitor"
10
+ }
11
+
12
+ function wholeNamePattern(pattern) {
13
+ if (typeof pattern !== "string" || pattern === "") return null
14
+ try {
15
+ return new RegExp("^(?:" + pattern + ")$")
16
+ } catch (e) {
17
+ return null
18
+ }
19
+ }
20
+
21
+ // A platform's audio hints, which its own package ships in the platform root
22
+ // (/usr/share/omarchy-platform/audio.json, read by AudioNodes.qml; Omarchy
23
+ // ships none): nodes of its audio processing that are neither devices nor apps.
24
+ //
25
+ // { "hidden": ["<pattern>", ...],
26
+ // "replaced": [{ "node": "<pattern>", "by": "<pattern>" }, ...] }
27
+ //
28
+ // A pattern is a regular expression matched against a whole node.name. A
29
+ // hidden node is never listed as an output, an input or an app stream, and
30
+ // never counts as a recording; a replaced node is hidden while a node matching
31
+ // "by" exists. Missing or malformed text means no hints, and an invalid pattern
32
+ // or entry is skipped.
33
+ function parsePlatformAudio(text) {
34
+ var hints = { hidden: [], replaced: [] }
35
+ var data = null
36
+ try {
37
+ data = JSON.parse(String(text || ""))
38
+ } catch (e) {
39
+ return hints
40
+ }
41
+ if (!data || typeof data !== "object" || Array.isArray(data)) return hints
42
+
43
+ var hidden = Array.isArray(data.hidden) ? data.hidden : []
44
+ for (var i = 0; i < hidden.length; i++) {
45
+ var pattern = wholeNamePattern(hidden[i])
46
+ if (pattern) hints.hidden.push(pattern)
47
+ }
48
+
49
+ var replaced = Array.isArray(data.replaced) ? data.replaced : []
50
+ for (var j = 0; j < replaced.length; j++) {
51
+ var entry = replaced[j]
52
+ if (!entry || typeof entry !== "object") continue
53
+ var node = wholeNamePattern(entry.node)
54
+ var by = wholeNamePattern(entry.by)
55
+ if (node && by) hints.replaced.push({ node: node, by: by })
56
+ }
57
+ return hints
58
+ }
59
+
60
+ // Whether the platform's hints hide a node, given the names of every node now
61
+ // in the graph (for "replaced").
62
+ function platformHidesNode(name, hints, nodeNames) {
63
+ var value = String(name || "")
64
+ if (value === "" || !hints) return false
65
+ var hidden = hints.hidden || []
66
+ for (var i = 0; i < hidden.length; i++)
67
+ if (hidden[i].test(value)) return true
68
+
69
+ var replaced = hints.replaced || []
70
+ var names = Array.isArray(nodeNames) ? nodeNames : []
71
+ for (var j = 0; j < replaced.length; j++) {
72
+ if (!replaced[j].node.test(value)) continue
73
+ for (var k = 0; k < names.length; k++) {
74
+ var other = String(names[k] || "")
75
+ if (other !== value && replaced[j].by.test(other)) return true
76
+ }
77
+ }
78
+ return false
79
+ }
80
+
81
+ // `wpctl get-volume <id>` prints "Volume: 0.50", with " [MUTED]" when muted, on
82
+ // the same cubic scale as PwNodeAudio.volume.
83
+ function parseWpctlVolume(text) {
84
+ var match = /^Volume:\s+([0-9]+(?:\.[0-9]+)?)(\s+\[MUTED\])?$/.exec(String(text || "").trim())
85
+ if (!match) return null
86
+ return { volume: parseFloat(match[1]), muted: !!match[2] }
87
+ }
88
+
89
+ if (typeof module !== "undefined") {
90
+ module.exports = {
91
+ isShellLevelMeter: isShellLevelMeter,
92
+ parsePlatformAudio: parsePlatformAudio,
93
+ platformHidesNode: platformHidesNode,
94
+ parseWpctlVolume: parseWpctlVolume
95
+ }
96
+ }
@@ -0,0 +1,243 @@
1
+ pragma Singleton
2
+ import QtQuick
3
+ import qs.Commons as Commons
4
+ import "BorderGeometry.js" as Geometry
5
+
6
+ // Central border-spec factory for shell surfaces and controls. A spec carries
7
+ // color, optional gradient, and top/right/bottom/left widths so renderers can
8
+ // choose the cheap Rectangle path or the Shape-ring path without duplicating
9
+ // theme parsing logic.
10
+ QtObject {
11
+ id: root
12
+
13
+ function none() {
14
+ return flat("transparent", 0)
15
+ }
16
+
17
+ function flat(color, width) {
18
+ return {
19
+ color: color || "transparent",
20
+ widths: Geometry.parseWidthSpec(width, 0),
21
+ gradient: { colors: [], angle: 0, enabled: false },
22
+ }
23
+ }
24
+
25
+ function value(section, key) {
26
+ var v = Commons.Color.shellValues[section + "." + key]
27
+ return (v === undefined || v === null) ? "" : v
28
+ }
29
+
30
+ function valueOr(section, keys) {
31
+ for (var i = 0; i < keys.length; i++) {
32
+ var v = value(section, keys[i])
33
+ if (String(v).length > 0) return v
34
+ }
35
+ return ""
36
+ }
37
+
38
+ function resolveValueRef(raw) {
39
+ var s = String(raw || "").replace(/^\s+|\s+$/g, "")
40
+ var seen = {}
41
+ while (s.match(/^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/) && !seen[s]) {
42
+ seen[s] = true
43
+ var next = Commons.Color.shellValues[s]
44
+ if (next === undefined || next === null || String(next).length === 0) break
45
+ s = String(next).replace(/^\s+|\s+$/g, "")
46
+ }
47
+ return s
48
+ }
49
+
50
+ function alpha(section, key, fallback) {
51
+ var raw = value(section, key)
52
+ if (String(raw).length === 0) return fallback
53
+ var n = Number(raw)
54
+ return isFinite(n) ? Geometry.clampAlpha(n) : fallback
55
+ }
56
+
57
+ function cssColor(color, opacity) {
58
+ var a = opacity === undefined || opacity === null ? 1 : Geometry.clampAlpha(opacity)
59
+ if (color && typeof color === "object" && color.r !== undefined) {
60
+ if (typeof Qt !== "undefined" && Qt.rgba) {
61
+ return Qt.rgba(color.r, color.g, color.b, (color.a === undefined ? 1 : color.a) * a)
62
+ }
63
+ return "#"
64
+ + Geometry.padHex(color.r * 255)
65
+ + Geometry.padHex(color.g * 255)
66
+ + Geometry.padHex(color.b * 255)
67
+ + Geometry.padHex((color.a === undefined ? 1 : color.a) * a * 255)
68
+ }
69
+
70
+ var s = String(color || "").replace(/^\s+|\s+$/g, "")
71
+ var role = s.toLowerCase()
72
+ if (role === "foreground" || role === "text") return cssColor(Commons.Color.foreground, a)
73
+ if (role === "accent") return cssColor(Commons.Color.accent, a)
74
+ if (role === "urgent") return cssColor(Commons.Color.urgent, a)
75
+ if (role === "background") return cssColor(Commons.Color.background, a)
76
+ if (role === "transparent") return "transparent"
77
+ return Geometry.canonicalColor(s, a)
78
+ }
79
+
80
+ function resolvedGradient(raw, fallbackColor, opacity) {
81
+ var s = String(raw || "").replace(/^\s+|\s+$/g, "")
82
+ if (s.length === 0) return { colors: [], angle: 0, enabled: false }
83
+
84
+ var parts = s.split(/\s+/)
85
+ var colors = []
86
+ var angle = 0
87
+ for (var i = 0; i < parts.length; i++) {
88
+ if (parts[i].match(/^-?\d+(?:\.\d+)?deg$/)) angle = Number(parts[i].replace(/deg$/, ""))
89
+ else colors.push(cssColor(parts[i], opacity))
90
+ }
91
+ if (colors.length === 0) colors.push(cssColor(fallbackColor, opacity))
92
+ return { colors: colors, angle: angle, enabled: colors.length > 1 }
93
+ }
94
+
95
+ function sameColor(a, b) {
96
+ if (typeof Qt === "undefined" || !Qt.color) return String(a) === String(b)
97
+ var ca = typeof a === "string" ? Qt.color(a) : a
98
+ var cb = typeof b === "string" ? Qt.color(b) : b
99
+ if (!ca || !cb || ca.r === undefined || cb.r === undefined) return String(a) === String(b)
100
+ return Math.round(ca.r * 255) === Math.round(cb.r * 255)
101
+ && Math.round(ca.g * 255) === Math.round(cb.g * 255)
102
+ && Math.round(ca.b * 255) === Math.round(cb.b * 255)
103
+ && Math.round((ca.a === undefined ? 1 : ca.a) * 255) === Math.round((cb.a === undefined ? 1 : cb.a) * 255)
104
+ }
105
+
106
+ function localOrSurfaceSpec(section, token, localColor, defaultColor, fallbackWidth, alphaKey) {
107
+ if (!sameColor(localColor, defaultColor)) return flat(localColor, fallbackWidth)
108
+ return surfaceSpec(section, token, localColor, fallbackWidth, alphaKey)
109
+ }
110
+
111
+ function surfaceWidths(section, token, fallbackWidth) {
112
+ var base = valueOr(section, token === "border" ? ["border-width"] : [token + "-width", "border-width"])
113
+ var widths = Geometry.parseWidthSpec(base, fallbackWidth)
114
+ return Geometry.withSideOverrides(
115
+ widths,
116
+ valueOr(section, token === "border" ? ["border-width-top"] : [token + "-width-top", "border-width-top"]),
117
+ valueOr(section, token === "border" ? ["border-width-right"] : [token + "-width-right", "border-width-right"]),
118
+ valueOr(section, token === "border" ? ["border-width-bottom"] : [token + "-width-bottom", "border-width-bottom"]),
119
+ valueOr(section, token === "border" ? ["border-width-left"] : [token + "-width-left", "border-width-left"])
120
+ )
121
+ }
122
+
123
+ function borderValue(raw, fallbackColor, opacity, legacyGradientRaw) {
124
+ var fallback = cssColor(fallbackColor, opacity)
125
+ var primaryRaw = String(raw || "").replace(/^\s+|\s+$/g, "")
126
+ var primary = resolvedGradient(primaryRaw.length > 0 ? primaryRaw : fallbackColor, fallbackColor, opacity)
127
+ var color = primary.colors.length > 0 ? primary.colors[0] : fallback
128
+ var gradient = primary.enabled ? primary : { colors: [], angle: 0, enabled: false }
129
+
130
+ // Backward compatibility for existing configs written during the separate
131
+ // border-gradient experiment. New configs put solid colors and gradients in
132
+ // the same border token.
133
+ if (!gradient.enabled && String(legacyGradientRaw || "").replace(/^\s+|\s+$/g, "").length > 0) {
134
+ var legacy = resolvedGradient(legacyGradientRaw, color, opacity)
135
+ if (legacy.enabled) gradient = legacy
136
+ }
137
+
138
+ return { color: color, gradient: gradient }
139
+ }
140
+
141
+ function surfaceSpec(section, token, fallbackColor, fallbackWidth, alphaKey) {
142
+ var opacity = alpha(section, alphaKey || token + "-alpha", 1.0)
143
+ var legacyGradientRaw = valueOr(section, token === "border" ? ["border-gradient"] : [token + "-gradient", "border-gradient"])
144
+ var resolved = borderValue(resolveValueRef(value(section, token)), fallbackColor, opacity, legacyGradientRaw)
145
+
146
+ return {
147
+ color: resolved.color,
148
+ widths: surfaceWidths(section, token, fallbackWidth),
149
+ gradient: resolved.gradient,
150
+ }
151
+ }
152
+
153
+ function hyprlandActiveSpec(fallbackColor, fallbackWidth) {
154
+ var raw = value("hyprland", "active-border")
155
+ var opacity = alpha("hyprland", "active-border-alpha", 1.0)
156
+
157
+ // Existing generated themes predate [hyprland] and already keep the active
158
+ // border under [notifications]. Use it as the compatibility source until
159
+ // the next theme refresh writes the shared token.
160
+ if (String(raw).length === 0) {
161
+ raw = value("notifications", "border")
162
+ opacity = alpha("notifications", "border-alpha", opacity)
163
+ }
164
+
165
+ var resolved = borderValue(resolveValueRef(raw), fallbackColor, opacity, "")
166
+ return {
167
+ color: resolved.color,
168
+ widths: Geometry.parseWidthSpec(value("hyprland", "active-border-width"), fallbackWidth),
169
+ gradient: resolved.gradient,
170
+ }
171
+ }
172
+
173
+ function controlPrefix(state) {
174
+ if (state === "hover" || state === "hot") return "hover-cursor"
175
+ return state || "normal"
176
+ }
177
+
178
+ function controlColor(prefix, foreground, accent, urgent) {
179
+ if (prefix === "focus") return Style.focusStateColor(foreground, accent, urgent)
180
+ if (prefix === "hover-cursor") return Style.hoverStateColor(foreground, accent, urgent)
181
+ if (prefix === "selected") return Style.selectedStateColor(foreground, accent, urgent)
182
+ return Style.normalStateColor(foreground, accent, urgent)
183
+ }
184
+
185
+ function controlAlpha(prefix) {
186
+ if (prefix === "focus") return Style.focusBorderAlpha
187
+ if (prefix === "hover-cursor") return Style.hoverBorderAlpha
188
+ if (prefix === "selected") return Style.selectedBorderAlpha
189
+ return Style.normalBorderAlpha
190
+ }
191
+
192
+ function controlFallbackWidth(prefix) {
193
+ if (prefix === "focus") return Style.focusBorderWidth
194
+ if (prefix === "hover-cursor") return Style.hoverBorderWidth
195
+ if (prefix === "selected") return Style.selectedBorderWidth
196
+ return Style.normalBorderWidth
197
+ }
198
+
199
+ function controlWidths(state) {
200
+ var prefix = controlPrefix(state)
201
+ var fallbackWidth = controlFallbackWidth(prefix)
202
+ var base = Style.styleOverrides[prefix + "-border-width"]
203
+ var widths = Geometry.parseWidthSpec(base, fallbackWidth)
204
+ return Geometry.withSideOverrides(
205
+ widths,
206
+ Style.styleOverrides[prefix + "-border-width-top"],
207
+ Style.styleOverrides[prefix + "-border-width-right"],
208
+ Style.styleOverrides[prefix + "-border-width-bottom"],
209
+ Style.styleOverrides[prefix + "-border-width-left"]
210
+ )
211
+ }
212
+
213
+ function controlHasWidth(state) {
214
+ return Geometry.maxWidth(controlWidths(state)) > 0
215
+ }
216
+
217
+ function controlSpec(state, foreground, accent, urgent) {
218
+ var prefix = controlPrefix(state)
219
+ var resolved = borderValue(
220
+ Style.styleOverrides[prefix + "-border"],
221
+ controlColor(prefix, foreground, accent, urgent),
222
+ controlAlpha(prefix),
223
+ Style.styleOverrides[prefix + "-border-gradient"]
224
+ )
225
+
226
+ return { color: resolved.color, widths: controlWidths(prefix), gradient: resolved.gradient }
227
+ }
228
+
229
+ function withWidth(spec, width) {
230
+ if (!spec) return flat("transparent", 0)
231
+ return { color: spec.color, gradient: spec.gradient, widths: Geometry.parseWidthSpec(width, 0) }
232
+ }
233
+
234
+ function isNone(spec) { return !spec || Geometry.maxWidth(spec.widths) <= 0 }
235
+ function needsOverlay(spec) { return Geometry.needsOverlay(spec) }
236
+ function canUseNative(spec) { return Geometry.canUseNative(spec) }
237
+ function top(spec) { return spec && spec.widths ? spec.widths.top : 0 }
238
+ function right(spec) { return spec && spec.widths ? spec.widths.right : 0 }
239
+ function bottom(spec) { return spec && spec.widths ? spec.widths.bottom : 0 }
240
+ function left(spec) { return spec && spec.widths ? spec.widths.left : 0 }
241
+ function uniformWidth(spec) { return spec && spec.widths ? spec.widths.top : 0 }
242
+ function color(spec) { return spec ? spec.color : "transparent" }
243
+ }