├── .editorconfig ├── .gitignore ├── .prettierignore ├── .prettierrc.json ├── .vscode ├── extensions.json └── settings.json ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── Restart-Firefox.ps1 ├── docs ├── .nojekyll └── index.html ├── img ├── feature-buttons-false.dark.png ├── feature-buttons-false.light.png ├── feature-buttons-grouped.dark.png ├── feature-buttons-grouped.light.png ├── feature-buttons-true.dark.png ├── feature-buttons-true.light.png ├── feature-float-false.dark.png ├── feature-float-false.light.png ├── feature-float-true.dark.png ├── feature-float-true.light.png ├── feature-hide-close-button.dark.png ├── feature-hide-close-button.light.png ├── feature-order.dark.png └── feature-order.light.png ├── package.json ├── pnpm-lock.yaml └── src └── refined-findbar.scss /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = tab 6 | insert_final_newline = true 7 | trim_trailing_whitespace = true 8 | 9 | [*.md] 10 | indent_style = unset 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | dist/ 3 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | dist/ 3 | LICENSE 4 | pnpm-lock.yaml 5 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 100, 3 | "singleQuote": true, 4 | "proseWrap": "always", 5 | "endOfLine": "auto", 6 | "overrides": [ 7 | { 8 | "files": [".vscode/*.json"], 9 | "options": { 10 | "parser": "json5", 11 | "trailingComma": "all", 12 | "quoteProps": "preserve", 13 | "singleQuote": false 14 | } 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "EditorConfig.EditorConfig", 4 | "SomewhatStationery.some-sass", 5 | "esbenp.prettier-vscode", 6 | "ms-vscode.powershell", 7 | ], 8 | } 9 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.exclude": { 3 | "**/node_modules": true, 4 | }, 5 | "editor.defaultFormatter": "esbenp.prettier-vscode", 6 | "editor.formatOnSave": true, 7 | "files.trimFinalNewlines": true, 8 | } 9 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | ## Tools 4 | 5 | - This project uses [PNPM](https://pnpm.io/). 6 | 7 | - Consider using [Visual Studio Code](https://code.visualstudio.com/) to make your changes. The repo 8 | includes a [workspace configuration](./.vscode/) that runs [Prettier](https://prettier.io/) on 9 | save. 10 | 11 | If you prefer to use a different text editor, please run the `pretty` script and resolve any 12 | issues reported before committing your changes. 13 | 14 | ## Scripts 15 | 16 | | Name | Description | 17 | | -------- | ----------------------------------------------------------------------------------------------- | 18 | | `build` | Compile the SCSS to the `./dist` folder. | 19 | | `watch` | Similar to build, but compile every time the SCSS changes. | 20 | | `clean` | Clean the build output. | 21 | | `site` | Starts an HTTP server at the root of the project. View the site at http://localhost:8080/docs/. | 22 | | `pretty` | Run Prettier. | 23 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Ravindu Liyanapathirana 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Refined find bar for Firefox 2 | 3 | `userChrome.css`[^userchrome] styles that improve the Firefox find bar by repositioning it, 4 | adjusting spacing and styling its elements. 5 | 6 | [^userchrome]: 7 | Learn more about `userChrome.css` at: https://kb.mozillazine.org/UserChrome.css, 8 | https://old.reddit.com/r/firefox/wiki/userchrome, 9 | https://old.reddit.com/r/FirefoxCSS/wiki/index/tutorials 10 | 11 |
12 | 13 | ## Features 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 46 | 47 | 48 | 49 | 50 | 51 | 56 | 57 | 58 | 59 | 60 | 61 | 66 | 67 | 68 | 69 | 70 | 71 | 88 | 89 | 90 | 91 | 92 | 93 | 103 | 104 | 105 | 106 | 107 | 108 | 124 | 125 | 126 | 127 | 128 | 129 | 139 | 140 | 141 | 142 | 143 | 144 | 150 | 151 | 152 | 153 | 154 | 155 | 172 | 173 | 174 | 175 |
VariableDescription
$float 28 | 29 | If `true`, detaches the find bar from the toolbar, and positions it floating above the contents of 30 | web page, 31 | 32 | 33 | 34 | 35 | 36 | 37 | If `false`, positions the find bar towards the top right-hand corner of the browser window, docked 38 | to the toolbar, 39 | 40 | 41 | 42 | 43 | 44 | 45 |
$float-alignment 52 | 53 | Vertically positions the floating find bar. Either `top` or `bottom`. 54 | 55 |
$float-distance 62 | 63 | Distance between the floating find bar and the respective window corner. 64 | 65 |
$buttons 72 | 73 | If `true`, styles the find bar checkboxes to resemble buttons, 74 | 75 | 76 | 77 | 78 | 79 | 80 | If `false`, leaves them as is, 81 | 82 | 83 | 84 | 85 | 86 | 87 |
$buttons-grouped 94 | 95 | If `true`, groups find bar buttons together, 96 | 97 | 98 | 99 | 100 | 101 | 102 |
$hide-close-button 109 | 110 | If `true`, hides the close button. 111 | 112 | > [!IMPORTANT] 113 | > 114 | > With this option enabled, the only way to close the find bar would be to press Esc when 115 | > its textbox or buttons are focused. To focus the textbox, press the find shortcut 116 | > Ctrl/Cmd+F. 117 | 118 | 119 | 120 | 121 | 122 | 123 |
$hide-when-unfocused 130 | 131 | If `true`, hides the find bar when its elements (textbox or buttons) are not in focus. 132 | 133 | > [!IMPORTANT] 134 | > 135 | > With this option enabled, press Ctrl/Cmd+F to reopen/focus the find bar, if 136 | > it loses focus (and is therefore, hidden). 137 | 138 |
$opacity-when-unfocused 145 | 146 | Transparency of the find bar when its elements (textbox or buttons) are not in focus. Excepts a 147 | number between 0 (fully transparent) and 1 (fully opaque). 148 | 149 |
$order 156 | 157 | Reorders elements of the find bar. 158 | 159 | This is a list that contains all of the following tokens (listed here in the default order), in any 160 | order: `TEXT_BOX`, `CHECKBOX_HIGHLIGHT_ALL`, `CHECKBOX_MATCH_CASE`, `CHECKBOX_MATCH_DIACRITICS`, 161 | `CHECKBOX_WHOLE_WORDS`, `LABELS`, `DESCRIPTION`. 162 | 163 | e.g., If the order is specified as `DESCRIPTION`, `LABELS`, `TEXT_BOX`, `CHECKBOX_HIGHLIGHT_ALL`, 164 | `CHECKBOX_MATCH_CASE`, `CHECKBOX_WHOLE_WORDS`, `CHECKBOX_MATCH_DIACRITICS`, 165 | 166 | 167 | 168 | 169 | 170 | 171 |
176 | 177 |
178 | 179 | ## Usage 180 | 181 | This style is authored as an [SCSS mixin][sassMixin] and must be transpiled to CSS first. 182 | 183 | - **The quickest way to get started** is to, 184 | 185 | 1. Visit https://ravindUwU.github.io/firefox-refined-findbar, which will automatically generate a 186 | link to the [Sass Playground][sassPlay]. 187 | 188 | 2. Visit the generated link, modify the SCSS as necessary (specifically, the highlighted 189 | `@include` statement). 190 | 191 | 3. Copy the CSS output into your `userChrome.css` file and restart Firefox. 192 | 193 |
194 | If that didn't work, 195 | 196 | 1. Open an online transpiler (e.g., [Sass Playground][sassPlay] or 197 | [SassMeister](https://www.sassmeister.com/)). 198 | 199 | 2. Copy the contents of [`refined-findbar.scss`][src] into the SCSS pane. 200 | 201 | 3. Add the line `@include refined-findbar()` after the copied contents, and override variables as 202 | necessary. The default values can be found in the `@mixin refined-findbar` declaration near the 203 | top of the contents copied in step 2. 204 | 205 | ```scss 206 | // 207 | 208 | // prettier-ignore 209 | @include refined-findbar( 210 | $float: true, 211 | $float-alignment: top, 212 | // etc.. 213 | ); 214 | ``` 215 | 216 | 4. Copy the CSS output into your `userChrome.css` file and restart Firefox. 217 | 218 |
219 | 220 | - **To transpile locally**, [`@use`][sassUse] the [`refined-findbar.scss`][src] file, 221 | [`@include`][sassMixin] the mixin changing any variables as necessary, and use [`sass`][npmSass] 222 | to transpile to CSS. 223 | 224 |
225 | 226 | [src]: ./src/refined-findbar.scss 227 | [sassUse]: https://sass-lang.com/documentation/at-rules/use/ 228 | [sassMixin]: https://sass-lang.com/documentation/at-rules/mixin/ 229 | [sassPlay]: https://sass-lang.com/playground/ 230 | [npmSass]: https://www.npmjs.com/package/sass 231 | -------------------------------------------------------------------------------- /Restart-Firefox.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | .SYNOPSIS 3 | Stops currently running Firefox processes, stops them, and starts one. 4 | #> 5 | [CmdletBinding()] 6 | param ( 7 | # Only affects Firefox developer edition (by checking whether "Developer" exists in path to the 8 | # process binary. 9 | [switch] 10 | $Dev 11 | ) 12 | 13 | function main { 14 | $foxxos = Get-Process firefox -ErrorAction Ignore | Where-Object { $null -ne $_.Path } 15 | 16 | if ($Dev) { 17 | $foxxos = $foxxos | Where-Object { $_.Path.Contains('Developer') } 18 | } 19 | 20 | logMeh "Found $($foxxos.Count) foxxos" 21 | 22 | if ($foxxos.Count -eq 0) { 23 | kthxbai👋 24 | } 25 | 26 | $foxxo = ($foxxos | Select-Object Path -Unique).Path 27 | 28 | if ($foxxo.Count -eq 1) { 29 | logYay "Using foxxo at ``$foxxo`` :3" 30 | } else { 31 | logNay "Found $($foxxo.Count) unique foxxos; not sure which one to use :3" 32 | kthxbai👋 33 | } 34 | 35 | logYay 'Stopping foxxos' 36 | $foxxos | stoppppp😭 37 | 38 | logYay 'Starting Firefox' 39 | omghai❤️ $foxxo 40 | } 41 | 42 | function logYay($huh) { 43 | Write-Host -NoNewline -ForegroundColor Green '^_^ ' 44 | Write-Host $huh 45 | } 46 | 47 | function logMeh($huh) { 48 | Write-Host -NoNewline -ForegroundColor Blue '-_- ' 49 | Write-Host $huh 50 | } 51 | 52 | function logNay($huh) { 53 | Write-Host -NoNewline -ForegroundColor Red '>_< ' 54 | Write-Host $huh 55 | } 56 | 57 | function stoppppp😭 { 58 | param( 59 | [Parameter(ValueFromPipeline)] 60 | $fox 61 | ) 62 | 63 | process { 64 | $fox | Stop-Process 65 | } 66 | } 67 | 68 | function omghai❤️ { 69 | param($fox) 70 | 71 | & $fox 72 | } 73 | 74 | function kthxbai👋 { 75 | exit 76 | } 77 | 78 | main 79 | -------------------------------------------------------------------------------- /docs/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravindUwU/firefox-refined-findbar/616ca6aa94e28c779b0ce0011ab768221797f210/docs/.nojekyll -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 36 | 37 | 38 | 39 |
40 |
41 | 42 | ← Back to Repository 43 | 44 |

45 | This page fetches the refined find bar mixin, adds a corresponding 46 | @include rule with default arguments, and generates a link to open it in the 47 | Sass playground. 48 |

49 |
50 |
51 |
52 | 53 | 54 | 212 | 213 | 214 | -------------------------------------------------------------------------------- /img/feature-buttons-false.dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravindUwU/firefox-refined-findbar/616ca6aa94e28c779b0ce0011ab768221797f210/img/feature-buttons-false.dark.png -------------------------------------------------------------------------------- /img/feature-buttons-false.light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravindUwU/firefox-refined-findbar/616ca6aa94e28c779b0ce0011ab768221797f210/img/feature-buttons-false.light.png -------------------------------------------------------------------------------- /img/feature-buttons-grouped.dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravindUwU/firefox-refined-findbar/616ca6aa94e28c779b0ce0011ab768221797f210/img/feature-buttons-grouped.dark.png -------------------------------------------------------------------------------- /img/feature-buttons-grouped.light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravindUwU/firefox-refined-findbar/616ca6aa94e28c779b0ce0011ab768221797f210/img/feature-buttons-grouped.light.png -------------------------------------------------------------------------------- /img/feature-buttons-true.dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravindUwU/firefox-refined-findbar/616ca6aa94e28c779b0ce0011ab768221797f210/img/feature-buttons-true.dark.png -------------------------------------------------------------------------------- /img/feature-buttons-true.light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravindUwU/firefox-refined-findbar/616ca6aa94e28c779b0ce0011ab768221797f210/img/feature-buttons-true.light.png -------------------------------------------------------------------------------- /img/feature-float-false.dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravindUwU/firefox-refined-findbar/616ca6aa94e28c779b0ce0011ab768221797f210/img/feature-float-false.dark.png -------------------------------------------------------------------------------- /img/feature-float-false.light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravindUwU/firefox-refined-findbar/616ca6aa94e28c779b0ce0011ab768221797f210/img/feature-float-false.light.png -------------------------------------------------------------------------------- /img/feature-float-true.dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravindUwU/firefox-refined-findbar/616ca6aa94e28c779b0ce0011ab768221797f210/img/feature-float-true.dark.png -------------------------------------------------------------------------------- /img/feature-float-true.light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravindUwU/firefox-refined-findbar/616ca6aa94e28c779b0ce0011ab768221797f210/img/feature-float-true.light.png -------------------------------------------------------------------------------- /img/feature-hide-close-button.dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravindUwU/firefox-refined-findbar/616ca6aa94e28c779b0ce0011ab768221797f210/img/feature-hide-close-button.dark.png -------------------------------------------------------------------------------- /img/feature-hide-close-button.light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravindUwU/firefox-refined-findbar/616ca6aa94e28c779b0ce0011ab768221797f210/img/feature-hide-close-button.light.png -------------------------------------------------------------------------------- /img/feature-order.dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravindUwU/firefox-refined-findbar/616ca6aa94e28c779b0ce0011ab768221797f210/img/feature-order.dark.png -------------------------------------------------------------------------------- /img/feature-order.light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravindUwU/firefox-refined-findbar/616ca6aa94e28c779b0ce0011ab768221797f210/img/feature-order.light.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "firefox-refined-findbar", 3 | "engines": { 4 | "node": "22" 5 | }, 6 | "packageManager": "pnpm@9.15.1+sha512.1acb565e6193efbebda772702950469150cf12bcc764262e7587e71d19dc98a423dff9536e57ea44c49bdf790ff694e83c27be5faa23d67e0c033b583be4bfcf", 7 | "scripts": { 8 | "build": "sass ./src/refined-findbar.scss:./dist/refined-findbar.css --no-source-map --no-error-css", 9 | "watch": "pnpm run build -w", 10 | "clean": "rimraf ./dist", 11 | "site": "http-server", 12 | "pretty": "prettier -c ." 13 | }, 14 | "devDependencies": { 15 | "http-server": "^14.1.1", 16 | "prettier": "^3.5.3", 17 | "rimraf": "^6.0.1", 18 | "sass": "^1.86.3" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | http-server: 12 | specifier: ^14.1.1 13 | version: 14.1.1 14 | prettier: 15 | specifier: ^3.5.3 16 | version: 3.5.3 17 | rimraf: 18 | specifier: ^6.0.1 19 | version: 6.0.1 20 | sass: 21 | specifier: ^1.86.3 22 | version: 1.86.3 23 | 24 | packages: 25 | 26 | '@isaacs/cliui@8.0.2': 27 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 28 | engines: {node: '>=12'} 29 | 30 | '@parcel/watcher-android-arm64@2.5.1': 31 | resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} 32 | engines: {node: '>= 10.0.0'} 33 | cpu: [arm64] 34 | os: [android] 35 | 36 | '@parcel/watcher-darwin-arm64@2.5.1': 37 | resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} 38 | engines: {node: '>= 10.0.0'} 39 | cpu: [arm64] 40 | os: [darwin] 41 | 42 | '@parcel/watcher-darwin-x64@2.5.1': 43 | resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} 44 | engines: {node: '>= 10.0.0'} 45 | cpu: [x64] 46 | os: [darwin] 47 | 48 | '@parcel/watcher-freebsd-x64@2.5.1': 49 | resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} 50 | engines: {node: '>= 10.0.0'} 51 | cpu: [x64] 52 | os: [freebsd] 53 | 54 | '@parcel/watcher-linux-arm-glibc@2.5.1': 55 | resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} 56 | engines: {node: '>= 10.0.0'} 57 | cpu: [arm] 58 | os: [linux] 59 | 60 | '@parcel/watcher-linux-arm-musl@2.5.1': 61 | resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} 62 | engines: {node: '>= 10.0.0'} 63 | cpu: [arm] 64 | os: [linux] 65 | 66 | '@parcel/watcher-linux-arm64-glibc@2.5.1': 67 | resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} 68 | engines: {node: '>= 10.0.0'} 69 | cpu: [arm64] 70 | os: [linux] 71 | 72 | '@parcel/watcher-linux-arm64-musl@2.5.1': 73 | resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} 74 | engines: {node: '>= 10.0.0'} 75 | cpu: [arm64] 76 | os: [linux] 77 | 78 | '@parcel/watcher-linux-x64-glibc@2.5.1': 79 | resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} 80 | engines: {node: '>= 10.0.0'} 81 | cpu: [x64] 82 | os: [linux] 83 | 84 | '@parcel/watcher-linux-x64-musl@2.5.1': 85 | resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} 86 | engines: {node: '>= 10.0.0'} 87 | cpu: [x64] 88 | os: [linux] 89 | 90 | '@parcel/watcher-win32-arm64@2.5.1': 91 | resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} 92 | engines: {node: '>= 10.0.0'} 93 | cpu: [arm64] 94 | os: [win32] 95 | 96 | '@parcel/watcher-win32-ia32@2.5.1': 97 | resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} 98 | engines: {node: '>= 10.0.0'} 99 | cpu: [ia32] 100 | os: [win32] 101 | 102 | '@parcel/watcher-win32-x64@2.5.1': 103 | resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} 104 | engines: {node: '>= 10.0.0'} 105 | cpu: [x64] 106 | os: [win32] 107 | 108 | '@parcel/watcher@2.5.1': 109 | resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} 110 | engines: {node: '>= 10.0.0'} 111 | 112 | '@pkgjs/parseargs@0.11.0': 113 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 114 | engines: {node: '>=14'} 115 | 116 | ansi-regex@5.0.1: 117 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 118 | engines: {node: '>=8'} 119 | 120 | ansi-regex@6.0.1: 121 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 122 | engines: {node: '>=12'} 123 | 124 | ansi-styles@4.3.0: 125 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 126 | engines: {node: '>=8'} 127 | 128 | ansi-styles@6.2.1: 129 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 130 | engines: {node: '>=12'} 131 | 132 | async@2.6.4: 133 | resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} 134 | 135 | balanced-match@1.0.2: 136 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 137 | 138 | basic-auth@2.0.1: 139 | resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} 140 | engines: {node: '>= 0.8'} 141 | 142 | brace-expansion@2.0.1: 143 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 144 | 145 | braces@3.0.3: 146 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 147 | engines: {node: '>=8'} 148 | 149 | call-bind@1.0.7: 150 | resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} 151 | engines: {node: '>= 0.4'} 152 | 153 | chalk@4.1.2: 154 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 155 | engines: {node: '>=10'} 156 | 157 | chokidar@4.0.3: 158 | resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} 159 | engines: {node: '>= 14.16.0'} 160 | 161 | color-convert@2.0.1: 162 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 163 | engines: {node: '>=7.0.0'} 164 | 165 | color-name@1.1.4: 166 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 167 | 168 | corser@2.0.1: 169 | resolution: {integrity: sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==} 170 | engines: {node: '>= 0.4.0'} 171 | 172 | cross-spawn@7.0.3: 173 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 174 | engines: {node: '>= 8'} 175 | 176 | debug@3.2.7: 177 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} 178 | peerDependencies: 179 | supports-color: '*' 180 | peerDependenciesMeta: 181 | supports-color: 182 | optional: true 183 | 184 | define-data-property@1.1.4: 185 | resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} 186 | engines: {node: '>= 0.4'} 187 | 188 | detect-libc@1.0.3: 189 | resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} 190 | engines: {node: '>=0.10'} 191 | hasBin: true 192 | 193 | eastasianwidth@0.2.0: 194 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 195 | 196 | emoji-regex@8.0.0: 197 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 198 | 199 | emoji-regex@9.2.2: 200 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 201 | 202 | es-define-property@1.0.0: 203 | resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} 204 | engines: {node: '>= 0.4'} 205 | 206 | es-errors@1.3.0: 207 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 208 | engines: {node: '>= 0.4'} 209 | 210 | eventemitter3@4.0.7: 211 | resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} 212 | 213 | fill-range@7.1.1: 214 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 215 | engines: {node: '>=8'} 216 | 217 | follow-redirects@1.15.6: 218 | resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} 219 | engines: {node: '>=4.0'} 220 | peerDependencies: 221 | debug: '*' 222 | peerDependenciesMeta: 223 | debug: 224 | optional: true 225 | 226 | foreground-child@3.2.1: 227 | resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} 228 | engines: {node: '>=14'} 229 | 230 | function-bind@1.1.2: 231 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 232 | 233 | get-intrinsic@1.2.4: 234 | resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} 235 | engines: {node: '>= 0.4'} 236 | 237 | glob@11.0.0: 238 | resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} 239 | engines: {node: 20 || >=22} 240 | hasBin: true 241 | 242 | gopd@1.0.1: 243 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} 244 | 245 | has-flag@4.0.0: 246 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 247 | engines: {node: '>=8'} 248 | 249 | has-property-descriptors@1.0.2: 250 | resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} 251 | 252 | has-proto@1.0.3: 253 | resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} 254 | engines: {node: '>= 0.4'} 255 | 256 | has-symbols@1.0.3: 257 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 258 | engines: {node: '>= 0.4'} 259 | 260 | hasown@2.0.2: 261 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 262 | engines: {node: '>= 0.4'} 263 | 264 | he@1.2.0: 265 | resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} 266 | hasBin: true 267 | 268 | html-encoding-sniffer@3.0.0: 269 | resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} 270 | engines: {node: '>=12'} 271 | 272 | http-proxy@1.18.1: 273 | resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} 274 | engines: {node: '>=8.0.0'} 275 | 276 | http-server@14.1.1: 277 | resolution: {integrity: sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==} 278 | engines: {node: '>=12'} 279 | hasBin: true 280 | 281 | iconv-lite@0.6.3: 282 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 283 | engines: {node: '>=0.10.0'} 284 | 285 | immutable@5.1.1: 286 | resolution: {integrity: sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg==} 287 | 288 | is-extglob@2.1.1: 289 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 290 | engines: {node: '>=0.10.0'} 291 | 292 | is-fullwidth-code-point@3.0.0: 293 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 294 | engines: {node: '>=8'} 295 | 296 | is-glob@4.0.3: 297 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 298 | engines: {node: '>=0.10.0'} 299 | 300 | is-number@7.0.0: 301 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 302 | engines: {node: '>=0.12.0'} 303 | 304 | isexe@2.0.0: 305 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 306 | 307 | jackspeak@4.0.1: 308 | resolution: {integrity: sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==} 309 | engines: {node: 20 || >=22} 310 | 311 | lodash@4.17.21: 312 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 313 | 314 | lru-cache@11.0.0: 315 | resolution: {integrity: sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==} 316 | engines: {node: 20 || >=22} 317 | 318 | micromatch@4.0.8: 319 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 320 | engines: {node: '>=8.6'} 321 | 322 | mime@1.6.0: 323 | resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} 324 | engines: {node: '>=4'} 325 | hasBin: true 326 | 327 | minimatch@10.0.1: 328 | resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} 329 | engines: {node: 20 || >=22} 330 | 331 | minimist@1.2.8: 332 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 333 | 334 | minipass@7.1.2: 335 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 336 | engines: {node: '>=16 || 14 >=14.17'} 337 | 338 | mkdirp@0.5.6: 339 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} 340 | hasBin: true 341 | 342 | ms@2.1.3: 343 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 344 | 345 | node-addon-api@7.1.1: 346 | resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} 347 | 348 | object-inspect@1.13.2: 349 | resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} 350 | engines: {node: '>= 0.4'} 351 | 352 | opener@1.5.2: 353 | resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} 354 | hasBin: true 355 | 356 | package-json-from-dist@1.0.0: 357 | resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} 358 | 359 | path-key@3.1.1: 360 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 361 | engines: {node: '>=8'} 362 | 363 | path-scurry@2.0.0: 364 | resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} 365 | engines: {node: 20 || >=22} 366 | 367 | picomatch@2.3.1: 368 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 369 | engines: {node: '>=8.6'} 370 | 371 | portfinder@1.0.32: 372 | resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} 373 | engines: {node: '>= 0.12.0'} 374 | 375 | prettier@3.5.3: 376 | resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} 377 | engines: {node: '>=14'} 378 | hasBin: true 379 | 380 | qs@6.12.3: 381 | resolution: {integrity: sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ==} 382 | engines: {node: '>=0.6'} 383 | 384 | readdirp@4.1.2: 385 | resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} 386 | engines: {node: '>= 14.18.0'} 387 | 388 | requires-port@1.0.0: 389 | resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} 390 | 391 | rimraf@6.0.1: 392 | resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} 393 | engines: {node: 20 || >=22} 394 | hasBin: true 395 | 396 | safe-buffer@5.1.2: 397 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 398 | 399 | safer-buffer@2.1.2: 400 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 401 | 402 | sass@1.86.3: 403 | resolution: {integrity: sha512-iGtg8kus4GrsGLRDLRBRHY9dNVA78ZaS7xr01cWnS7PEMQyFtTqBiyCrfpTYTZXRWM94akzckYjh8oADfFNTzw==} 404 | engines: {node: '>=14.0.0'} 405 | hasBin: true 406 | 407 | secure-compare@3.0.1: 408 | resolution: {integrity: sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==} 409 | 410 | set-function-length@1.2.2: 411 | resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} 412 | engines: {node: '>= 0.4'} 413 | 414 | shebang-command@2.0.0: 415 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 416 | engines: {node: '>=8'} 417 | 418 | shebang-regex@3.0.0: 419 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 420 | engines: {node: '>=8'} 421 | 422 | side-channel@1.0.6: 423 | resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} 424 | engines: {node: '>= 0.4'} 425 | 426 | signal-exit@4.1.0: 427 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 428 | engines: {node: '>=14'} 429 | 430 | source-map-js@1.2.1: 431 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 432 | engines: {node: '>=0.10.0'} 433 | 434 | string-width@4.2.3: 435 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 436 | engines: {node: '>=8'} 437 | 438 | string-width@5.1.2: 439 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 440 | engines: {node: '>=12'} 441 | 442 | strip-ansi@6.0.1: 443 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 444 | engines: {node: '>=8'} 445 | 446 | strip-ansi@7.1.0: 447 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 448 | engines: {node: '>=12'} 449 | 450 | supports-color@7.2.0: 451 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 452 | engines: {node: '>=8'} 453 | 454 | to-regex-range@5.0.1: 455 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 456 | engines: {node: '>=8.0'} 457 | 458 | union@0.5.0: 459 | resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==} 460 | engines: {node: '>= 0.8.0'} 461 | 462 | url-join@4.0.1: 463 | resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} 464 | 465 | whatwg-encoding@2.0.0: 466 | resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} 467 | engines: {node: '>=12'} 468 | 469 | which@2.0.2: 470 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 471 | engines: {node: '>= 8'} 472 | hasBin: true 473 | 474 | wrap-ansi@7.0.0: 475 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 476 | engines: {node: '>=10'} 477 | 478 | wrap-ansi@8.1.0: 479 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 480 | engines: {node: '>=12'} 481 | 482 | snapshots: 483 | 484 | '@isaacs/cliui@8.0.2': 485 | dependencies: 486 | string-width: 5.1.2 487 | string-width-cjs: string-width@4.2.3 488 | strip-ansi: 7.1.0 489 | strip-ansi-cjs: strip-ansi@6.0.1 490 | wrap-ansi: 8.1.0 491 | wrap-ansi-cjs: wrap-ansi@7.0.0 492 | 493 | '@parcel/watcher-android-arm64@2.5.1': 494 | optional: true 495 | 496 | '@parcel/watcher-darwin-arm64@2.5.1': 497 | optional: true 498 | 499 | '@parcel/watcher-darwin-x64@2.5.1': 500 | optional: true 501 | 502 | '@parcel/watcher-freebsd-x64@2.5.1': 503 | optional: true 504 | 505 | '@parcel/watcher-linux-arm-glibc@2.5.1': 506 | optional: true 507 | 508 | '@parcel/watcher-linux-arm-musl@2.5.1': 509 | optional: true 510 | 511 | '@parcel/watcher-linux-arm64-glibc@2.5.1': 512 | optional: true 513 | 514 | '@parcel/watcher-linux-arm64-musl@2.5.1': 515 | optional: true 516 | 517 | '@parcel/watcher-linux-x64-glibc@2.5.1': 518 | optional: true 519 | 520 | '@parcel/watcher-linux-x64-musl@2.5.1': 521 | optional: true 522 | 523 | '@parcel/watcher-win32-arm64@2.5.1': 524 | optional: true 525 | 526 | '@parcel/watcher-win32-ia32@2.5.1': 527 | optional: true 528 | 529 | '@parcel/watcher-win32-x64@2.5.1': 530 | optional: true 531 | 532 | '@parcel/watcher@2.5.1': 533 | dependencies: 534 | detect-libc: 1.0.3 535 | is-glob: 4.0.3 536 | micromatch: 4.0.8 537 | node-addon-api: 7.1.1 538 | optionalDependencies: 539 | '@parcel/watcher-android-arm64': 2.5.1 540 | '@parcel/watcher-darwin-arm64': 2.5.1 541 | '@parcel/watcher-darwin-x64': 2.5.1 542 | '@parcel/watcher-freebsd-x64': 2.5.1 543 | '@parcel/watcher-linux-arm-glibc': 2.5.1 544 | '@parcel/watcher-linux-arm-musl': 2.5.1 545 | '@parcel/watcher-linux-arm64-glibc': 2.5.1 546 | '@parcel/watcher-linux-arm64-musl': 2.5.1 547 | '@parcel/watcher-linux-x64-glibc': 2.5.1 548 | '@parcel/watcher-linux-x64-musl': 2.5.1 549 | '@parcel/watcher-win32-arm64': 2.5.1 550 | '@parcel/watcher-win32-ia32': 2.5.1 551 | '@parcel/watcher-win32-x64': 2.5.1 552 | optional: true 553 | 554 | '@pkgjs/parseargs@0.11.0': 555 | optional: true 556 | 557 | ansi-regex@5.0.1: {} 558 | 559 | ansi-regex@6.0.1: {} 560 | 561 | ansi-styles@4.3.0: 562 | dependencies: 563 | color-convert: 2.0.1 564 | 565 | ansi-styles@6.2.1: {} 566 | 567 | async@2.6.4: 568 | dependencies: 569 | lodash: 4.17.21 570 | 571 | balanced-match@1.0.2: {} 572 | 573 | basic-auth@2.0.1: 574 | dependencies: 575 | safe-buffer: 5.1.2 576 | 577 | brace-expansion@2.0.1: 578 | dependencies: 579 | balanced-match: 1.0.2 580 | 581 | braces@3.0.3: 582 | dependencies: 583 | fill-range: 7.1.1 584 | optional: true 585 | 586 | call-bind@1.0.7: 587 | dependencies: 588 | es-define-property: 1.0.0 589 | es-errors: 1.3.0 590 | function-bind: 1.1.2 591 | get-intrinsic: 1.2.4 592 | set-function-length: 1.2.2 593 | 594 | chalk@4.1.2: 595 | dependencies: 596 | ansi-styles: 4.3.0 597 | supports-color: 7.2.0 598 | 599 | chokidar@4.0.3: 600 | dependencies: 601 | readdirp: 4.1.2 602 | 603 | color-convert@2.0.1: 604 | dependencies: 605 | color-name: 1.1.4 606 | 607 | color-name@1.1.4: {} 608 | 609 | corser@2.0.1: {} 610 | 611 | cross-spawn@7.0.3: 612 | dependencies: 613 | path-key: 3.1.1 614 | shebang-command: 2.0.0 615 | which: 2.0.2 616 | 617 | debug@3.2.7: 618 | dependencies: 619 | ms: 2.1.3 620 | 621 | define-data-property@1.1.4: 622 | dependencies: 623 | es-define-property: 1.0.0 624 | es-errors: 1.3.0 625 | gopd: 1.0.1 626 | 627 | detect-libc@1.0.3: 628 | optional: true 629 | 630 | eastasianwidth@0.2.0: {} 631 | 632 | emoji-regex@8.0.0: {} 633 | 634 | emoji-regex@9.2.2: {} 635 | 636 | es-define-property@1.0.0: 637 | dependencies: 638 | get-intrinsic: 1.2.4 639 | 640 | es-errors@1.3.0: {} 641 | 642 | eventemitter3@4.0.7: {} 643 | 644 | fill-range@7.1.1: 645 | dependencies: 646 | to-regex-range: 5.0.1 647 | optional: true 648 | 649 | follow-redirects@1.15.6: {} 650 | 651 | foreground-child@3.2.1: 652 | dependencies: 653 | cross-spawn: 7.0.3 654 | signal-exit: 4.1.0 655 | 656 | function-bind@1.1.2: {} 657 | 658 | get-intrinsic@1.2.4: 659 | dependencies: 660 | es-errors: 1.3.0 661 | function-bind: 1.1.2 662 | has-proto: 1.0.3 663 | has-symbols: 1.0.3 664 | hasown: 2.0.2 665 | 666 | glob@11.0.0: 667 | dependencies: 668 | foreground-child: 3.2.1 669 | jackspeak: 4.0.1 670 | minimatch: 10.0.1 671 | minipass: 7.1.2 672 | package-json-from-dist: 1.0.0 673 | path-scurry: 2.0.0 674 | 675 | gopd@1.0.1: 676 | dependencies: 677 | get-intrinsic: 1.2.4 678 | 679 | has-flag@4.0.0: {} 680 | 681 | has-property-descriptors@1.0.2: 682 | dependencies: 683 | es-define-property: 1.0.0 684 | 685 | has-proto@1.0.3: {} 686 | 687 | has-symbols@1.0.3: {} 688 | 689 | hasown@2.0.2: 690 | dependencies: 691 | function-bind: 1.1.2 692 | 693 | he@1.2.0: {} 694 | 695 | html-encoding-sniffer@3.0.0: 696 | dependencies: 697 | whatwg-encoding: 2.0.0 698 | 699 | http-proxy@1.18.1: 700 | dependencies: 701 | eventemitter3: 4.0.7 702 | follow-redirects: 1.15.6 703 | requires-port: 1.0.0 704 | transitivePeerDependencies: 705 | - debug 706 | 707 | http-server@14.1.1: 708 | dependencies: 709 | basic-auth: 2.0.1 710 | chalk: 4.1.2 711 | corser: 2.0.1 712 | he: 1.2.0 713 | html-encoding-sniffer: 3.0.0 714 | http-proxy: 1.18.1 715 | mime: 1.6.0 716 | minimist: 1.2.8 717 | opener: 1.5.2 718 | portfinder: 1.0.32 719 | secure-compare: 3.0.1 720 | union: 0.5.0 721 | url-join: 4.0.1 722 | transitivePeerDependencies: 723 | - debug 724 | - supports-color 725 | 726 | iconv-lite@0.6.3: 727 | dependencies: 728 | safer-buffer: 2.1.2 729 | 730 | immutable@5.1.1: {} 731 | 732 | is-extglob@2.1.1: 733 | optional: true 734 | 735 | is-fullwidth-code-point@3.0.0: {} 736 | 737 | is-glob@4.0.3: 738 | dependencies: 739 | is-extglob: 2.1.1 740 | optional: true 741 | 742 | is-number@7.0.0: 743 | optional: true 744 | 745 | isexe@2.0.0: {} 746 | 747 | jackspeak@4.0.1: 748 | dependencies: 749 | '@isaacs/cliui': 8.0.2 750 | optionalDependencies: 751 | '@pkgjs/parseargs': 0.11.0 752 | 753 | lodash@4.17.21: {} 754 | 755 | lru-cache@11.0.0: {} 756 | 757 | micromatch@4.0.8: 758 | dependencies: 759 | braces: 3.0.3 760 | picomatch: 2.3.1 761 | optional: true 762 | 763 | mime@1.6.0: {} 764 | 765 | minimatch@10.0.1: 766 | dependencies: 767 | brace-expansion: 2.0.1 768 | 769 | minimist@1.2.8: {} 770 | 771 | minipass@7.1.2: {} 772 | 773 | mkdirp@0.5.6: 774 | dependencies: 775 | minimist: 1.2.8 776 | 777 | ms@2.1.3: {} 778 | 779 | node-addon-api@7.1.1: 780 | optional: true 781 | 782 | object-inspect@1.13.2: {} 783 | 784 | opener@1.5.2: {} 785 | 786 | package-json-from-dist@1.0.0: {} 787 | 788 | path-key@3.1.1: {} 789 | 790 | path-scurry@2.0.0: 791 | dependencies: 792 | lru-cache: 11.0.0 793 | minipass: 7.1.2 794 | 795 | picomatch@2.3.1: 796 | optional: true 797 | 798 | portfinder@1.0.32: 799 | dependencies: 800 | async: 2.6.4 801 | debug: 3.2.7 802 | mkdirp: 0.5.6 803 | transitivePeerDependencies: 804 | - supports-color 805 | 806 | prettier@3.5.3: {} 807 | 808 | qs@6.12.3: 809 | dependencies: 810 | side-channel: 1.0.6 811 | 812 | readdirp@4.1.2: {} 813 | 814 | requires-port@1.0.0: {} 815 | 816 | rimraf@6.0.1: 817 | dependencies: 818 | glob: 11.0.0 819 | package-json-from-dist: 1.0.0 820 | 821 | safe-buffer@5.1.2: {} 822 | 823 | safer-buffer@2.1.2: {} 824 | 825 | sass@1.86.3: 826 | dependencies: 827 | chokidar: 4.0.3 828 | immutable: 5.1.1 829 | source-map-js: 1.2.1 830 | optionalDependencies: 831 | '@parcel/watcher': 2.5.1 832 | 833 | secure-compare@3.0.1: {} 834 | 835 | set-function-length@1.2.2: 836 | dependencies: 837 | define-data-property: 1.1.4 838 | es-errors: 1.3.0 839 | function-bind: 1.1.2 840 | get-intrinsic: 1.2.4 841 | gopd: 1.0.1 842 | has-property-descriptors: 1.0.2 843 | 844 | shebang-command@2.0.0: 845 | dependencies: 846 | shebang-regex: 3.0.0 847 | 848 | shebang-regex@3.0.0: {} 849 | 850 | side-channel@1.0.6: 851 | dependencies: 852 | call-bind: 1.0.7 853 | es-errors: 1.3.0 854 | get-intrinsic: 1.2.4 855 | object-inspect: 1.13.2 856 | 857 | signal-exit@4.1.0: {} 858 | 859 | source-map-js@1.2.1: {} 860 | 861 | string-width@4.2.3: 862 | dependencies: 863 | emoji-regex: 8.0.0 864 | is-fullwidth-code-point: 3.0.0 865 | strip-ansi: 6.0.1 866 | 867 | string-width@5.1.2: 868 | dependencies: 869 | eastasianwidth: 0.2.0 870 | emoji-regex: 9.2.2 871 | strip-ansi: 7.1.0 872 | 873 | strip-ansi@6.0.1: 874 | dependencies: 875 | ansi-regex: 5.0.1 876 | 877 | strip-ansi@7.1.0: 878 | dependencies: 879 | ansi-regex: 6.0.1 880 | 881 | supports-color@7.2.0: 882 | dependencies: 883 | has-flag: 4.0.0 884 | 885 | to-regex-range@5.0.1: 886 | dependencies: 887 | is-number: 7.0.0 888 | optional: true 889 | 890 | union@0.5.0: 891 | dependencies: 892 | qs: 6.12.3 893 | 894 | url-join@4.0.1: {} 895 | 896 | whatwg-encoding@2.0.0: 897 | dependencies: 898 | iconv-lite: 0.6.3 899 | 900 | which@2.0.2: 901 | dependencies: 902 | isexe: 2.0.0 903 | 904 | wrap-ansi@7.0.0: 905 | dependencies: 906 | ansi-styles: 4.3.0 907 | string-width: 4.2.3 908 | strip-ansi: 6.0.1 909 | 910 | wrap-ansi@8.1.0: 911 | dependencies: 912 | ansi-styles: 6.2.1 913 | string-width: 5.1.2 914 | strip-ansi: 7.1.0 915 | -------------------------------------------------------------------------------- /src/refined-findbar.scss: -------------------------------------------------------------------------------- 1 | @use 'sass:list'; 2 | @use 'sass:math'; 3 | @use 'sass:map'; 4 | 5 | @mixin /* sig:start */ 6 | refined-findbar( 7 | $float: true, 8 | $float-alignment: bottom, 9 | $float-distance: 18px, 10 | 11 | $buttons: true, 12 | $buttons-grouped: true, 13 | 14 | $hide-close-button: false, 15 | $hide-when-unfocused: false, 16 | $opacity-when-unfocused: 1, 17 | 18 | $order: ( 19 | TEXT_BOX, 20 | CHECKBOX_HIGHLIGHT_ALL, 21 | CHECKBOX_MATCH_CASE, 22 | CHECKBOX_MATCH_DIACRITICS, 23 | CHECKBOX_WHOLE_WORDS, 24 | LABELS, 25 | DESCRIPTION, 26 | ) 27 | ) 28 | /* sig:end */ { 29 | @namespace url('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul'); 30 | @namespace htmlNs url('http://www.w3.org/1999/xhtml'); 31 | 32 | // MARK: Position 33 | 34 | findbar { 35 | contain: content; 36 | 37 | // The findbar sits in a relatively positioned a vbox.browserContainer, so we're free to 38 | // absolutely position the findbar within it. 39 | position: absolute; 40 | 41 | @if $float { 42 | // Top or bottom align the floating findbar. 43 | right: $float-distance; 44 | #{$float-alignment}: $float-distance; 45 | } @else { 46 | // Otherwise, top-align the findbar, move it up by 1px to "merge" it with the rest of 47 | // the chrome. 48 | top: -1px; 49 | right: 44px; 50 | } 51 | } 52 | 53 | // MARK: Children 54 | 55 | findbar { 56 | // Uniformly pad & space out direct descendants. 57 | gap: $-space; 58 | padding: 6px; 59 | padding-inline-start: $-space; 60 | padding-inline-end: $-space; 61 | 62 | // Remove horizontal margins of direct descendants because the gap (above) will space them 63 | // out. 64 | & > * { 65 | margin-inline-start: 0 !important; 66 | margin-inline-end: 0 !important; 67 | } 68 | 69 | // Findbar controls live within an hbox.findbar-container, which is a flex parent. Remove 70 | // horizontal margins of direct descendants and space them out evenly with gap. 71 | .findbar-container { 72 | gap: $-space; 73 | 74 | & > * { 75 | margin-inline-start: 0 !important; 76 | margin-inline-end: 0 !important; 77 | } 78 | } 79 | 80 | // Hide empty description element. 81 | description.findbar-label:empty { 82 | display: none; 83 | } 84 | 85 | @if ($hide-close-button) { 86 | toolbarbutton.findbar-closebutton { 87 | display: none; 88 | } 89 | } 90 | } 91 | 92 | // MARK: Border 93 | 94 | findbar { 95 | border: 1px solid var(--chrome-content-separator-color); 96 | 97 | @if $float { 98 | border-radius: var(--toolbarbutton-border-radius); 99 | } @else { 100 | border-bottom-left-radius: var(--toolbarbutton-border-radius); 101 | border-bottom-right-radius: var(--toolbarbutton-border-radius); 102 | border-top-width: 0 !important; 103 | } 104 | } 105 | 106 | // MARK: Animation 107 | 108 | @keyframes refined-findbar-scale-in { 109 | 0% { 110 | transform: scaleY(0); 111 | } 112 | 100% { 113 | transform: scaleY(1); 114 | } 115 | } 116 | 117 | @keyframes refined-findbar-scale-out { 118 | // Prolong visibility during animation. 119 | 0% { 120 | transform: scaleY(1); 121 | visibility: visible; 122 | } 123 | 99% { 124 | transform: scaleY(0); 125 | visibility: visible; 126 | } 127 | 100% { 128 | transform: scaleY(0); 129 | } 130 | } 131 | 132 | findbar { 133 | transform-origin: if($float, $float-alignment, top) center; 134 | 135 | // Scale in when shown, out when hidden. 136 | animation: refined-findbar-scale-in 0.1s; 137 | 138 | &[hidden='true'] { 139 | animation: refined-findbar-scale-out 0.1s; 140 | } 141 | } 142 | 143 | // MARK: Hide when unfocused 144 | 145 | @if ($hide-when-unfocused) { 146 | @keyframes refined-findbar-hide-when-unfocused { 147 | // Prolong opacity & height during animation. 148 | 0% { 149 | opacity: 1; 150 | height: auto; 151 | } 152 | 99% { 153 | opacity: 1; 154 | height: auto; 155 | } 156 | 100% { 157 | } 158 | } 159 | 160 | findbar:not(:focus-within) { 161 | animation: 162 | refined-findbar-scale-out 0.1s, 163 | refined-findbar-hide-when-unfocused 0.1s; 164 | height: 0; 165 | opacity: 0; 166 | pointer-events: none; 167 | overflow: hidden; 168 | } 169 | } 170 | 171 | // MARK: Opacity when unfocused 172 | 173 | @if ($opacity-when-unfocused < 1) { 174 | findbar { 175 | transition: opacity 0.1s; 176 | opacity: 1; 177 | 178 | &:not(:focus-within) { 179 | opacity: $opacity-when-unfocused; 180 | } 181 | } 182 | } 183 | 184 | // MARK: Text box 185 | 186 | findbar [anonid='findbar-textbox-wrapper'] { 187 | htmlNs|input { 188 | border: 1px solid ThreeDShadow; 189 | 190 | @if $buttons and $buttons-grouped { 191 | // Remove border radii along the right edge to merge the text box with the prev 192 | // & next buttons, if the findbar isn't opened in quick find mode. 193 | &:not(.minimal) { 194 | border-top-right-radius: 0 !important; 195 | border-bottom-right-radius: 0 !important; 196 | } 197 | } 198 | } 199 | 200 | /* Previous & next buttons. Hidden if the findbar is opened in quick find mode. */ 201 | toolbarbutton { 202 | color: var(--button-color); 203 | background-color: #{-var(button-background-color, button-bgcolor)}; 204 | border: 1px solid ThreeDShadow; 205 | 206 | // The previous & next buttons have left & right margins respectively, by default. 207 | // Remove them to merge the buttons with the text box. 208 | margin-inline: 0 !important; 209 | 210 | @if $buttons and $buttons-grouped { 211 | &:last-of-type { 212 | border-top-left-radius: 0 !important; 213 | border-bottom-left-radius: 0 !important; 214 | } 215 | &:not(:last-of-type) { 216 | border-radius: 0 !important; 217 | border-right-width: 0 !important; 218 | } 219 | } 220 | } 221 | } 222 | 223 | // MARK: Checkboxes 224 | 225 | // The :first-of-type and :last-of-type pseudo-classes can't be used here because the 226 | // selectors follow the DOM order, and checkboxes might have been reordered via $order. 227 | // Instead, identify the first & last checkboxes via their position in $order. 228 | $checkbox-by-index: (); 229 | @each $name in map.keys($-checkbox-selectors) { 230 | $checkbox-by-index: map.set($checkbox-by-index, list.index($order, $name), $name); 231 | } 232 | $first-checkbox: map.get($checkbox-by-index, math.min(map.keys($checkbox-by-index)...)); 233 | $last-checkbox: map.get($checkbox-by-index, math.max(map.keys($checkbox-by-index)...)); 234 | 235 | findbar checkbox { 236 | @if $buttons { 237 | padding: 3px 6px; 238 | border: 1px solid ThreeDShadow; 239 | border-radius: var(--toolbarbutton-border-radius); 240 | color: var(--button-color); 241 | background-color: #{-var(button-background-color, button-bgcolor)}; 242 | 243 | &:hover { 244 | background-color: #{-var(button-background-color-hover, button-hover-bgcolor)}; 245 | } 246 | 247 | &:active { 248 | background-color: #{-var(button-background-color-active, button-active-bgcolor)}; 249 | } 250 | 251 | &[checked='true'] { 252 | color: #{-var(button-text-color-primary, button-primary-color)}; 253 | background-color: #{-var(color-accent-primary, button-primary-bgcolor)}; 254 | 255 | &:hover { 256 | background-color: #{-var(color-accent-primary-hover, button-primary-hover-bgcolor)}; 257 | } 258 | 259 | &:active { 260 | background-color: #{-var(color-accent-primary-active, button-primary-active-bgcolor)}; 261 | } 262 | } 263 | 264 | &:focus-visible { 265 | outline: var(--focus-outline); 266 | outline-offset: var(--focus-outline-inset); 267 | } 268 | 269 | .checkbox-check { 270 | display: none; 271 | } 272 | 273 | @if $buttons-grouped { 274 | // Restyle border thicknesses & radii of first & last checkboxes so they appear 275 | // grouped together. 276 | 277 | &:not(#{map.get($-checkbox-selectors, $last-checkbox)}) { 278 | border-top-right-radius: 0; 279 | border-bottom-right-radius: 0; 280 | } 281 | 282 | &:not(#{map.get($-checkbox-selectors, $first-checkbox)}) { 283 | border-top-left-radius: 0; 284 | border-bottom-left-radius: 0; 285 | border-left-width: 0; 286 | 287 | // Remove space between consecutive grouped buttons. 288 | margin-inline-start: -$-space !important; 289 | } 290 | } @else { 291 | &:not(#{map.get($-checkbox-selectors, $first-checkbox)}) { 292 | // Move non-grouped buttons closer to each other. 293 | margin-inline-start: -1 * math.div($-space, 2) !important; 294 | } 295 | } 296 | } @else { 297 | &:is(#{map.get($-checkbox-selectors, $first-checkbox)}) { 298 | margin-inline-start: math.div($-space, 2) !important; 299 | } 300 | &:is(#{map.get($-checkbox-selectors, $last-checkbox)}) { 301 | margin-inline-end: math.div($-space, 2) !important; 302 | } 303 | } 304 | } 305 | 306 | // MARK: Order 307 | 308 | findbar { 309 | [anonid='findbar-textbox-wrapper'] { 310 | order: list.index($order, TEXT_BOX) - 1; 311 | } 312 | 313 | @each $name, $selector in $-checkbox-selectors { 314 | #{$selector} { 315 | order: list.index($order, $name) - 1; 316 | } 317 | } 318 | 319 | label.findbar-label { 320 | order: list.index($order, LABELS) - 1; 321 | } 322 | 323 | description.findbar-label { 324 | order: list.index($order, DESCRIPTION) - 1; 325 | } 326 | } 327 | } 328 | 329 | $-space: 8px; 330 | 331 | /// `$order` tokens that match checkboxes, mapped to the corresponding CSS selector. 332 | $-checkbox-selectors: ( 333 | CHECKBOX_HIGHLIGHT_ALL: "checkbox[anonid='highlight']", 334 | CHECKBOX_MATCH_CASE: "checkbox[anonid='find-case-sensitive']", 335 | CHECKBOX_MATCH_DIACRITICS: "checkbox[anonid='find-match-diacritics']", 336 | CHECKBOX_WHOLE_WORDS: "checkbox[anonid='find-entire-word']", 337 | ); 338 | 339 | /// Makes a CSS `var()` expression that references a variable and any fallbacks, in the specified 340 | /// order. 341 | /// 342 | /// @example scss Variable without fallback 343 | /// @debug -var(a); 344 | /// // Prints var(--a) 345 | /// 346 | /// @example scss Variable with fallbacks 347 | /// @debug -var(a, b, c); 348 | /// // var(--a, var(--b, var(--c))) 349 | @function -var($names...) { 350 | $css: ''; 351 | @for $i from list.length($names) through 1 { 352 | @if $css == '' { 353 | $css: 'var(--' + list.nth($names, $i) + ')'; 354 | } @else { 355 | $css: 'var(--' + list.nth($names, $i) + ', ' + $css + ')'; 356 | } 357 | } 358 | @return $css; 359 | } 360 | --------------------------------------------------------------------------------