├── CHANGELOG.md ├── README.md ├── dist ├── agent │ ├── agent-pkg.js │ ├── agent.js │ └── xdg-open ├── codestream.js ├── icons │ ├── codestream.svg │ ├── marker-bookmark-aqua.svg │ ├── marker-bookmark-blue.svg │ ├── marker-bookmark-gray.svg │ ├── marker-bookmark-green.svg │ ├── marker-bookmark-orange.svg │ ├── marker-bookmark-purple.svg │ ├── marker-bookmark-red.svg │ ├── marker-bookmark-yellow.svg │ ├── marker-bookmark.svg │ ├── marker-codestream.svg │ ├── marker-comment-aqua.svg │ ├── marker-comment-blue.svg │ ├── marker-comment-gray.svg │ ├── marker-comment-green.svg │ ├── marker-comment-orange.svg │ ├── marker-comment-purple.svg │ ├── marker-comment-red.svg │ ├── marker-comment-yellow.svg │ ├── marker-comment.svg │ ├── marker-issue-aqua.svg │ ├── marker-issue-blue.svg │ ├── marker-issue-gray.svg │ ├── marker-issue-green.svg │ ├── marker-issue-orange.svg │ ├── marker-issue-purple.svg │ ├── marker-issue-red.svg │ ├── marker-issue-yellow.svg │ ├── marker-issue.svg │ ├── marker-question-aqua.svg │ ├── marker-question-blue.svg │ ├── marker-question-gray.svg │ ├── marker-question-green.svg │ ├── marker-question-orange.svg │ ├── marker-question-purple.svg │ ├── marker-question-red.svg │ ├── marker-question-yellow.svg │ ├── marker-question.svg │ ├── marker-trap-aqua.svg │ ├── marker-trap-blue.svg │ ├── marker-trap-gray.svg │ ├── marker-trap-green.svg │ ├── marker-trap-orange.svg │ ├── marker-trap-purple.svg │ ├── marker-trap-red.svg │ ├── marker-trap-yellow.svg │ └── marker-trap.svg └── webview │ ├── index.html │ ├── node_modules │ ├── emoji-mart │ │ └── css │ │ │ └── emoji-mart.css │ └── rc-tooltip │ │ └── assets │ │ └── bootstrap.css │ ├── preload.js │ ├── styles │ ├── codemark-form.less │ ├── codemarks-panel.less │ ├── codemarks.less │ ├── color.less │ ├── error-page.less │ ├── feedback.less │ ├── inline.less │ ├── login.less │ ├── main.less │ ├── spinner.less │ ├── stream.less │ ├── syntax-highlighting.less │ ├── tags.less │ └── webview.less │ ├── webview-data.js │ └── webview.js ├── keymaps └── codestream.json ├── menus └── codestream.json ├── package.json └── styles ├── codestream.lessb └── main.less /README.md: -------------------------------------------------------------------------------- 1 | # CodeStream 2 | 3 | CodeStream is a developer collaboration platform that integrates all of your essential dev tools into Atom. Eliminate context-switching and simplify code discussion and code review by putting collaboration tools in your IDE. 4 | 5 | ### Integrations 6 | 7 | - **Code Hosts:** Bitbucket, Bitbucket Server, GitHub, GitHub Enterprise, GitLab, GitLab Self-Managed 8 | - **Issue Trackers:** Asana, Azure DevOps, Bitbucket, Clubhouse, GitHub, GitHub Enterprise, GitLab, GitLab Self-Managed, Jira, Linear, Trello, YouTrack 9 | - **Messaging Services:** Slack, Microsoft Teams 10 | 11 | ### Requirements 12 | 13 | - CodeStream requires version 1.34 or later of Atom, and is also available for [JetBrains](https://plugins.jetbrains.com/plugin/12206-codestream), [VS Code](https://marketplace.visualstudio.com/items?itemName=CodeStream.codestream) or [Visual Studio](https://marketplace.visualstudio.com/items?itemName=CodeStream.codestream-vs). 14 | - Your repository must be managed by Git, or a Git hosting service like GitHub. 15 | 16 | ### Installation 17 | 18 | You have two options for installing CodeStream. 19 | 20 | - Search for "CodeStream" in Atom's built-in package manager and install from there. 21 | - Or, run the command `apm install codestream` in your terminal. 22 | 23 | # Create and Review Pull Requests in Atom 24 | 25 | Create, review and merge pull requests inside Atom, with full source-tree and full file access, your favorite keybindings, built-in diff tool, and code intelligence. 26 | 27 | ![Pull Request](https://raw.githubusercontent.com/TeamCodeStream/codestream-guide/develop/docs/src/assets/images/animated/PullRequest-Atom.gif) 28 | 29 | # Simplified Code Discussion 30 | 31 | Rather than copying & pasting, CodeStream enables in-editor commenting on any code in your repository, with optional sharing to Slack, MS Teams or via email, with automatic at-mentioning of code authors via git blame. 32 | 33 | ![CodeStream](https://raw.githubusercontent.com/TeamCodeStream/codestream-guide/develop/docs/src/assets/images/animated/DiscussCode1-Atom.gif) 34 | 35 | Your teammates can participate in the discussion right from their IDE, or from Slack, Teams, or replying to the email. 36 | 37 | ![Share on Slack](https://raw.githubusercontent.com/TeamCodeStream/CodeStream/master/images/ShareOnSlack1.png) 38 | 39 | # Build the Knowledge Base Behind Your Codebase 40 | 41 | CodeStream turns conversation into documentation by capturing all of the discussion about your code, and saving it with your code. Comment and code review threads are automatically repositioned as your code changes, even across branches. All with zero effort on your part. 42 | 43 | ![Knowledge Base](https://raw.githubusercontent.com/TeamCodeStream/codestream-guide/develop/docs/src/assets/images/animated/KnowledgeBase1-Atom.gif) 44 | 45 | Previously discussed questions and issues that explain important decisions are now accessible right where you need them, when you need them. Just click on the codemark to expand it and see how something works or why something was done a certain way. 46 | 47 | # Frequently Asked Questions 48 | 49 | #### Where are messages stored? 50 | 51 | Your team’s codemarks, which include the message text and the code snippet, are stored in the cloud on CodeStream’s servers. CodeStream uses best practices when it comes to [security](https://www.codestream.com/security), but if your team has stringent infosec requirements we also offer an [on-prem solution](https://docs.codestream.com/onprem/). 52 | 53 | # Help & Feedback 54 | 55 | Check out the [user guide](https://docs.codestream.com/userguide/) for more information on getting started with CodeStream. Please follow [@teamcodestream](http://twitter.com/teamcodestream) for product updates and to share feedback and questions. You can also email us at support@codestream.com. 56 | 57 | [![CodeStream Logo](https://alt-images.codestream.com/codestream_logo_atommarketplace.png)](https://codestream.com?utm_source=atommarket&utm_medium=banner&utm_campaign=codestream) -------------------------------------------------------------------------------- /dist/agent/xdg-open: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | #--------------------------------------------- 3 | # xdg-open 4 | # 5 | # Utility script to open a URL in the registered default application. 6 | # 7 | # Refer to the usage() function below for usage. 8 | # 9 | # Copyright 2009-2010, Fathi Boudra 10 | # Copyright 2009-2010, Rex Dieter 11 | # Copyright 2006, Kevin Krammer 12 | # Copyright 2006, Jeremy White 13 | # 14 | # LICENSE: 15 | # 16 | # Permission is hereby granted, free of charge, to any person obtaining a 17 | # copy of this software and associated documentation files (the "Software"), 18 | # to deal in the Software without restriction, including without limitation 19 | # the rights to use, copy, modify, merge, publish, distribute, sublicense, 20 | # and/or sell copies of the Software, and to permit persons to whom the 21 | # Software is furnished to do so, subject to the following conditions: 22 | # 23 | # The above copyright notice and this permission notice shall be included 24 | # in all copies or substantial portions of the Software. 25 | # 26 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 27 | # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 28 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 29 | # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 30 | # OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 31 | # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 32 | # OTHER DEALINGS IN THE SOFTWARE. 33 | # 34 | #--------------------------------------------- 35 | 36 | manualpage() 37 | { 38 | cat << _MANUALPAGE 39 | Name 40 | 41 | xdg-open -- opens a file or URL in the user's preferred 42 | application 43 | 44 | Synopsis 45 | 46 | xdg-open { file | URL } 47 | 48 | xdg-open { --help | --manual | --version } 49 | 50 | Description 51 | 52 | xdg-open opens a file or URL in the user's preferred 53 | application. If a URL is provided the URL will be opened in the 54 | user's preferred web browser. If a file is provided the file 55 | will be opened in the preferred application for files of that 56 | type. xdg-open supports file, ftp, http and https URLs. 57 | 58 | xdg-open is for use inside a desktop session only. It is not 59 | recommended to use xdg-open as root. 60 | 61 | Options 62 | 63 | --help 64 | Show command synopsis. 65 | 66 | --manual 67 | Show this manual page. 68 | 69 | --version 70 | Show the xdg-utils version information. 71 | 72 | Exit Codes 73 | 74 | An exit code of 0 indicates success while a non-zero exit code 75 | indicates failure. The following failure codes can be returned: 76 | 77 | 1 78 | Error in command line syntax. 79 | 80 | 2 81 | One of the files passed on the command line did not 82 | exist. 83 | 84 | 3 85 | A required tool could not be found. 86 | 87 | 4 88 | The action failed. 89 | 90 | See Also 91 | 92 | xdg-mime(1), xdg-settings(1), MIME applications associations 93 | specification 94 | 95 | Examples 96 | 97 | xdg-open 'http://www.freedesktop.org/' 98 | 99 | Opens the freedesktop.org website in the user's default 100 | browser. 101 | 102 | xdg-open /tmp/foobar.png 103 | 104 | Opens the PNG image file /tmp/foobar.png in the user's default 105 | image viewing application. 106 | _MANUALPAGE 107 | } 108 | 109 | usage() 110 | { 111 | cat << _USAGE 112 | xdg-open -- opens a file or URL in the user's preferred 113 | application 114 | 115 | Synopsis 116 | 117 | xdg-open { file | URL } 118 | 119 | xdg-open { --help | --manual | --version } 120 | 121 | _USAGE 122 | } 123 | 124 | #@xdg-utils-common@ 125 | 126 | #---------------------------------------------------------------------------- 127 | # Common utility functions included in all XDG wrapper scripts 128 | #---------------------------------------------------------------------------- 129 | 130 | DEBUG() 131 | { 132 | [ -z "${XDG_UTILS_DEBUG_LEVEL}" ] && return 0; 133 | [ ${XDG_UTILS_DEBUG_LEVEL} -lt $1 ] && return 0; 134 | shift 135 | echo "$@" >&2 136 | } 137 | 138 | # This handles backslashes but not quote marks. 139 | first_word() 140 | { 141 | read first rest 142 | echo "$first" 143 | } 144 | 145 | #------------------------------------------------------------- 146 | # map a binary to a .desktop file 147 | binary_to_desktop_file() 148 | { 149 | search="${XDG_DATA_HOME:-$HOME/.local/share}:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}" 150 | binary="`which "$1"`" 151 | binary="`readlink -f "$binary"`" 152 | base="`basename "$binary"`" 153 | IFS=: 154 | for dir in $search; do 155 | unset IFS 156 | [ "$dir" ] || continue 157 | [ -d "$dir/applications" ] || [ -d "$dir/applnk" ] || continue 158 | for file in "$dir"/applications/*.desktop "$dir"/applications/*/*.desktop "$dir"/applnk/*.desktop "$dir"/applnk/*/*.desktop; do 159 | [ -r "$file" ] || continue 160 | # Check to make sure it's worth the processing. 161 | grep -q "^Exec.*$base" "$file" || continue 162 | # Make sure it's a visible desktop file (e.g. not "preferred-web-browser.desktop"). 163 | grep -Eq "^(NoDisplay|Hidden)=true" "$file" && continue 164 | command="`grep -E "^Exec(\[[^]=]*])?=" "$file" | cut -d= -f 2- | first_word`" 165 | command="`which "$command"`" 166 | if [ x"`readlink -f "$command"`" = x"$binary" ]; then 167 | # Fix any double slashes that got added path composition 168 | echo "$file" | sed -e 's,//*,/,g' 169 | return 170 | fi 171 | done 172 | done 173 | } 174 | 175 | #------------------------------------------------------------- 176 | # map a .desktop file to a binary 177 | desktop_file_to_binary() 178 | { 179 | search="${XDG_DATA_HOME:-$HOME/.local/share}:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}" 180 | desktop="`basename "$1"`" 181 | IFS=: 182 | for dir in $search; do 183 | unset IFS 184 | [ "$dir" ] && [ -d "$dir/applications" ] || [ -d "$dir/applnk" ] || continue 185 | # Check if desktop file contains - 186 | if [ "${desktop#*-}" != "$desktop" ]; then 187 | vendor=${desktop%-*} 188 | app=${desktop#*-} 189 | if [ -r $dir/applications/$vendor/$app ]; then 190 | file_path=$dir/applications/$vendor/$app 191 | elif [ -r $dir/applnk/$vendor/$app ]; then 192 | file_path=$dir/applnk/$vendor/$app 193 | fi 194 | fi 195 | if test -z "$file_path" ; then 196 | for indir in "$dir"/applications/ "$dir"/applications/*/ "$dir"/applnk/ "$dir"/applnk/*/; do 197 | file="$indir/$desktop" 198 | if [ -r "$file" ]; then 199 | file_path=$file 200 | break 201 | fi 202 | done 203 | fi 204 | if [ -r "$file_path" ]; then 205 | # Remove any arguments (%F, %f, %U, %u, etc.). 206 | command="`grep -E "^Exec(\[[^]=]*])?=" "$file_path" | cut -d= -f 2- | first_word`" 207 | command="`which "$command"`" 208 | readlink -f "$command" 209 | return 210 | fi 211 | done 212 | } 213 | 214 | #------------------------------------------------------------- 215 | # Exit script on successfully completing the desired operation 216 | 217 | exit_success() 218 | { 219 | if [ $# -gt 0 ]; then 220 | echo "$@" 221 | echo 222 | fi 223 | 224 | exit 0 225 | } 226 | 227 | 228 | #----------------------------------------- 229 | # Exit script on malformed arguments, not enough arguments 230 | # or missing required option. 231 | # prints usage information 232 | 233 | exit_failure_syntax() 234 | { 235 | if [ $# -gt 0 ]; then 236 | echo "xdg-open: $@" >&2 237 | echo "Try 'xdg-open --help' for more information." >&2 238 | else 239 | usage 240 | echo "Use 'man xdg-open' or 'xdg-open --manual' for additional info." 241 | fi 242 | 243 | exit 1 244 | } 245 | 246 | #------------------------------------------------------------- 247 | # Exit script on missing file specified on command line 248 | 249 | exit_failure_file_missing() 250 | { 251 | if [ $# -gt 0 ]; then 252 | echo "xdg-open: $@" >&2 253 | fi 254 | 255 | exit 2 256 | } 257 | 258 | #------------------------------------------------------------- 259 | # Exit script on failure to locate necessary tool applications 260 | 261 | exit_failure_operation_impossible() 262 | { 263 | if [ $# -gt 0 ]; then 264 | echo "xdg-open: $@" >&2 265 | fi 266 | 267 | exit 3 268 | } 269 | 270 | #------------------------------------------------------------- 271 | # Exit script on failure returned by a tool application 272 | 273 | exit_failure_operation_failed() 274 | { 275 | if [ $# -gt 0 ]; then 276 | echo "xdg-open: $@" >&2 277 | fi 278 | 279 | exit 4 280 | } 281 | 282 | #------------------------------------------------------------ 283 | # Exit script on insufficient permission to read a specified file 284 | 285 | exit_failure_file_permission_read() 286 | { 287 | if [ $# -gt 0 ]; then 288 | echo "xdg-open: $@" >&2 289 | fi 290 | 291 | exit 5 292 | } 293 | 294 | #------------------------------------------------------------ 295 | # Exit script on insufficient permission to write a specified file 296 | 297 | exit_failure_file_permission_write() 298 | { 299 | if [ $# -gt 0 ]; then 300 | echo "xdg-open: $@" >&2 301 | fi 302 | 303 | exit 6 304 | } 305 | 306 | check_input_file() 307 | { 308 | if [ ! -e "$1" ]; then 309 | exit_failure_file_missing "file '$1' does not exist" 310 | fi 311 | if [ ! -r "$1" ]; then 312 | exit_failure_file_permission_read "no permission to read file '$1'" 313 | fi 314 | } 315 | 316 | check_vendor_prefix() 317 | { 318 | file_label="$2" 319 | [ -n "$file_label" ] || file_label="filename" 320 | file=`basename "$1"` 321 | case "$file" in 322 | [[:alpha:]]*-*) 323 | return 324 | ;; 325 | esac 326 | 327 | echo "xdg-open: $file_label '$file' does not have a proper vendor prefix" >&2 328 | echo 'A vendor prefix consists of alpha characters ([a-zA-Z]) and is terminated' >&2 329 | echo 'with a dash ("-"). An example '"$file_label"' is '"'example-$file'" >&2 330 | echo "Use --novendor to override or 'xdg-open --manual' for additional info." >&2 331 | exit 1 332 | } 333 | 334 | check_output_file() 335 | { 336 | # if the file exists, check if it is writeable 337 | # if it does not exists, check if we are allowed to write on the directory 338 | if [ -e "$1" ]; then 339 | if [ ! -w "$1" ]; then 340 | exit_failure_file_permission_write "no permission to write to file '$1'" 341 | fi 342 | else 343 | DIR=`dirname "$1"` 344 | if [ ! -w "$DIR" ] || [ ! -x "$DIR" ]; then 345 | exit_failure_file_permission_write "no permission to create file '$1'" 346 | fi 347 | fi 348 | } 349 | 350 | #---------------------------------------- 351 | # Checks for shared commands, e.g. --help 352 | 353 | check_common_commands() 354 | { 355 | while [ $# -gt 0 ] ; do 356 | parm="$1" 357 | shift 358 | 359 | case "$parm" in 360 | --help) 361 | usage 362 | echo "Use 'man xdg-open' or 'xdg-open --manual' for additional info." 363 | exit_success 364 | ;; 365 | 366 | --manual) 367 | manualpage 368 | exit_success 369 | ;; 370 | 371 | --version) 372 | echo "xdg-open 1.1.3" 373 | exit_success 374 | ;; 375 | esac 376 | done 377 | } 378 | 379 | check_common_commands "$@" 380 | 381 | [ -z "${XDG_UTILS_DEBUG_LEVEL}" ] && unset XDG_UTILS_DEBUG_LEVEL; 382 | if [ ${XDG_UTILS_DEBUG_LEVEL-0} -lt 1 ]; then 383 | # Be silent 384 | xdg_redirect_output=" > /dev/null 2> /dev/null" 385 | else 386 | # All output to stderr 387 | xdg_redirect_output=" >&2" 388 | fi 389 | 390 | #-------------------------------------- 391 | # Checks for known desktop environments 392 | # set variable DE to the desktop environments name, lowercase 393 | 394 | detectDE() 395 | { 396 | # see https://bugs.freedesktop.org/show_bug.cgi?id=34164 397 | unset GREP_OPTIONS 398 | 399 | if [ -n "${XDG_CURRENT_DESKTOP}" ]; then 400 | case "${XDG_CURRENT_DESKTOP}" in 401 | # only recently added to menu-spec, pre-spec X- still in use 402 | Cinnamon|X-Cinnamon) 403 | DE=cinnamon; 404 | ;; 405 | ENLIGHTENMENT) 406 | DE=enlightenment; 407 | ;; 408 | # GNOME, GNOME-Classic:GNOME, or GNOME-Flashback:GNOME 409 | GNOME*) 410 | DE=gnome; 411 | ;; 412 | KDE) 413 | DE=kde; 414 | ;; 415 | # Deepin Desktop Environments 416 | DEEPIN|Deepin|deepin) 417 | DE=dde; 418 | ;; 419 | LXDE) 420 | DE=lxde; 421 | ;; 422 | LXQt) 423 | DE=lxqt; 424 | ;; 425 | MATE) 426 | DE=mate; 427 | ;; 428 | XFCE) 429 | DE=xfce 430 | ;; 431 | X-Generic) 432 | DE=generic 433 | ;; 434 | esac 435 | fi 436 | 437 | if [ x"$DE" = x"" ]; then 438 | # classic fallbacks 439 | if [ x"$KDE_FULL_SESSION" != x"" ]; then DE=kde; 440 | elif [ x"$GNOME_DESKTOP_SESSION_ID" != x"" ]; then DE=gnome; 441 | elif [ x"$MATE_DESKTOP_SESSION_ID" != x"" ]; then DE=mate; 442 | elif `dbus-send --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.GetNameOwner string:org.gnome.SessionManager > /dev/null 2>&1` ; then DE=gnome; 443 | elif xprop -root _DT_SAVE_MODE 2> /dev/null | grep ' = \"xfce4\"$' >/dev/null 2>&1; then DE=xfce; 444 | elif xprop -root 2> /dev/null | grep -i '^xfce_desktop_window' >/dev/null 2>&1; then DE=xfce 445 | elif echo $DESKTOP | grep -q '^Enlightenment'; then DE=enlightenment; 446 | elif [ x"$LXQT_SESSION_CONFIG" != x"" ]; then DE=lxqt; 447 | fi 448 | fi 449 | 450 | if [ x"$DE" = x"" ]; then 451 | # fallback to checking $DESKTOP_SESSION 452 | case "$DESKTOP_SESSION" in 453 | gnome) 454 | DE=gnome; 455 | ;; 456 | LXDE|Lubuntu) 457 | DE=lxde; 458 | ;; 459 | MATE) 460 | DE=mate; 461 | ;; 462 | xfce|xfce4|'Xfce Session') 463 | DE=xfce; 464 | ;; 465 | esac 466 | fi 467 | 468 | if [ x"$DE" = x"" ]; then 469 | # fallback to uname output for other platforms 470 | case "$(uname 2>/dev/null)" in 471 | CYGWIN*) 472 | DE=cygwin; 473 | ;; 474 | Darwin) 475 | DE=darwin; 476 | ;; 477 | esac 478 | fi 479 | 480 | if [ x"$DE" = x"gnome" ]; then 481 | # gnome-default-applications-properties is only available in GNOME 2.x 482 | # but not in GNOME 3.x 483 | which gnome-default-applications-properties > /dev/null 2>&1 || DE="gnome3" 484 | fi 485 | 486 | if [ -f "$XDG_RUNTIME_DIR/flatpak-info" ]; then 487 | DE="flatpak" 488 | fi 489 | } 490 | 491 | #---------------------------------------------------------------------------- 492 | # kfmclient exec/openURL can give bogus exit value in KDE <= 3.5.4 493 | # It also always returns 1 in KDE 3.4 and earlier 494 | # Simply return 0 in such case 495 | 496 | kfmclient_fix_exit_code() 497 | { 498 | version=`LC_ALL=C.UTF-8 kde-config --version 2>/dev/null | grep '^KDE'` 499 | major=`echo $version | sed 's/KDE.*: \([0-9]\).*/\1/'` 500 | minor=`echo $version | sed 's/KDE.*: [0-9]*\.\([0-9]\).*/\1/'` 501 | release=`echo $version | sed 's/KDE.*: [0-9]*\.[0-9]*\.\([0-9]\).*/\1/'` 502 | test "$major" -gt 3 && return $1 503 | test "$minor" -gt 5 && return $1 504 | test "$release" -gt 4 && return $1 505 | return 0 506 | } 507 | 508 | #---------------------------------------------------------------------------- 509 | # Returns true if there is a graphical display attached. 510 | 511 | has_display() 512 | { 513 | if [ -n "$DISPLAY" ] || [ -n "$WAYLAND_DISPLAY" ]; then 514 | return 0 515 | else 516 | return 1 517 | fi 518 | } 519 | 520 | # This handles backslashes but not quote marks. 521 | last_word() 522 | { 523 | read first rest 524 | echo "$rest" 525 | } 526 | 527 | # Get the value of a key in a desktop file's Desktop Entry group. 528 | # Example: Use get_key foo.desktop Exec 529 | # to get the values of the Exec= key for the Desktop Entry group. 530 | get_key() 531 | { 532 | local file="${1}" 533 | local key="${2}" 534 | local desktop_entry="" 535 | 536 | IFS_="${IFS}" 537 | IFS="" 538 | while read line 539 | do 540 | case "$line" in 541 | "[Desktop Entry]") 542 | desktop_entry="y" 543 | ;; 544 | # Reset match flag for other groups 545 | "["*) 546 | desktop_entry="" 547 | ;; 548 | "${key}="*) 549 | # Only match Desktop Entry group 550 | if [ -n "${desktop_entry}" ] 551 | then 552 | echo "${line}" | cut -d= -f 2- 553 | fi 554 | esac 555 | done < "${file}" 556 | IFS="${IFS_}" 557 | } 558 | 559 | # Returns true if argument is a file:// URL or path 560 | is_file_url_or_path() 561 | { 562 | if echo "$1" | grep -q '^file://' \ 563 | || ! echo "$1" | egrep -q '^[[:alpha:]+\.\-]+:'; then 564 | return 0 565 | else 566 | return 1 567 | fi 568 | } 569 | 570 | # If argument is a file URL, convert it to a (percent-decoded) path. 571 | # If not, leave it as it is. 572 | file_url_to_path() 573 | { 574 | local file="$1" 575 | if echo "$file" | grep -q '^file:///'; then 576 | file=${file#file://} 577 | file=${file%%#*} 578 | file=$(echo "$file" | sed -r 's/\?.*$//') 579 | local printf=printf 580 | if [ -x /usr/bin/printf ]; then 581 | printf=/usr/bin/printf 582 | fi 583 | file=$($printf "$(echo "$file" | sed -e 's@%\([a-f0-9A-F]\{2\}\)@\\x\1@g')") 584 | fi 585 | echo "$file" 586 | } 587 | 588 | open_cygwin() 589 | { 590 | cygstart "$1" 591 | 592 | if [ $? -eq 0 ]; then 593 | exit_success 594 | else 595 | exit_failure_operation_failed 596 | fi 597 | } 598 | 599 | open_darwin() 600 | { 601 | open "$1" 602 | 603 | if [ $? -eq 0 ]; then 604 | exit_success 605 | else 606 | exit_failure_operation_failed 607 | fi 608 | } 609 | 610 | open_kde() 611 | { 612 | if [ -n "${KDE_SESSION_VERSION}" ]; then 613 | case "${KDE_SESSION_VERSION}" in 614 | 4) 615 | kde-open "$1" 616 | ;; 617 | 5) 618 | kde-open${KDE_SESSION_VERSION} "$1" 619 | ;; 620 | esac 621 | else 622 | kfmclient exec "$1" 623 | kfmclient_fix_exit_code $? 624 | fi 625 | 626 | if [ $? -eq 0 ]; then 627 | exit_success 628 | else 629 | exit_failure_operation_failed 630 | fi 631 | } 632 | 633 | open_dde() 634 | { 635 | if dde-open -version >/dev/null 2>&1; then 636 | dde-open "$1" 637 | else 638 | open_generic "$1" 639 | fi 640 | 641 | if [ $? -eq 0 ]; then 642 | exit_success 643 | else 644 | exit_failure_operation_failed 645 | fi 646 | } 647 | 648 | open_gnome3() 649 | { 650 | if gio help open 2>/dev/null 1>&2; then 651 | gio open "$1" 652 | elif gvfs-open --help 2>/dev/null 1>&2; then 653 | gvfs-open "$1" 654 | else 655 | open_generic "$1" 656 | fi 657 | 658 | if [ $? -eq 0 ]; then 659 | exit_success 660 | else 661 | exit_failure_operation_failed 662 | fi 663 | } 664 | 665 | open_gnome() 666 | { 667 | if gio help open 2>/dev/null 1>&2; then 668 | gio open "$1" 669 | elif gvfs-open --help 2>/dev/null 1>&2; then 670 | gvfs-open "$1" 671 | elif gnome-open --help 2>/dev/null 1>&2; then 672 | gnome-open "$1" 673 | else 674 | open_generic "$1" 675 | fi 676 | 677 | if [ $? -eq 0 ]; then 678 | exit_success 679 | else 680 | exit_failure_operation_failed 681 | fi 682 | } 683 | 684 | open_mate() 685 | { 686 | if gio help open 2>/dev/null 1>&2; then 687 | gio open "$1" 688 | elif gvfs-open --help 2>/dev/null 1>&2; then 689 | gvfs-open "$1" 690 | elif mate-open --help 2>/dev/null 1>&2; then 691 | mate-open "$1" 692 | else 693 | open_generic "$1" 694 | fi 695 | 696 | if [ $? -eq 0 ]; then 697 | exit_success 698 | else 699 | exit_failure_operation_failed 700 | fi 701 | } 702 | 703 | open_xfce() 704 | { 705 | if exo-open --help 2>/dev/null 1>&2; then 706 | exo-open "$1" 707 | elif gio help open 2>/dev/null 1>&2; then 708 | gio open "$1" 709 | elif gvfs-open --help 2>/dev/null 1>&2; then 710 | gvfs-open "$1" 711 | else 712 | open_generic "$1" 713 | fi 714 | 715 | if [ $? -eq 0 ]; then 716 | exit_success 717 | else 718 | exit_failure_operation_failed 719 | fi 720 | } 721 | 722 | open_enlightenment() 723 | { 724 | if enlightenment_open --help 2>/dev/null 1>&2; then 725 | enlightenment_open "$1" 726 | else 727 | open_generic "$1" 728 | fi 729 | 730 | if [ $? -eq 0 ]; then 731 | exit_success 732 | else 733 | exit_failure_operation_failed 734 | fi 735 | } 736 | 737 | open_flatpak() 738 | { 739 | gdbus call --session \ 740 | --dest org.freedesktop.portal.Desktop \ 741 | --object-path /org/freedesktop/portal/desktop \ 742 | --method org.freedesktop.portal.OpenURI.OpenURI \ 743 | "" "$1" {} 744 | 745 | if [ $? -eq 0 ]; then 746 | exit_success 747 | else 748 | exit_failure_operation_failed 749 | fi 750 | } 751 | 752 | #----------------------------------------- 753 | # Recursively search .desktop file 754 | 755 | search_desktop_file() 756 | { 757 | local default="$1" 758 | local dir="$2" 759 | local target="$3" 760 | 761 | local file="" 762 | # look for both vendor-app.desktop, vendor/app.desktop 763 | if [ -r "$dir/$default" ]; then 764 | file="$dir/$default" 765 | elif [ -r "$dir/`echo $default | sed -e 's|-|/|'`" ]; then 766 | file="$dir/`echo $default | sed -e 's|-|/|'`" 767 | fi 768 | 769 | if [ -r "$file" ] ; then 770 | command="$(get_key "${file}" "Exec" | first_word)" 771 | command_exec=`which $command 2>/dev/null` 772 | icon="$(get_key "${file}" "Icon")" 773 | # FIXME: Actually LC_MESSAGES should be used as described in 774 | # http://standards.freedesktop.org/desktop-entry-spec/latest/ar01s04.html 775 | localised_name="$(get_key "${file}" "Name")" 776 | set -- $(get_key "${file}" "Exec" | last_word) 777 | # We need to replace any occurrence of "%f", "%F" and 778 | # the like by the target file. We examine each 779 | # argument and append the modified argument to the 780 | # end then shift. 781 | local args=$# 782 | local replaced=0 783 | while [ $args -gt 0 ]; do 784 | case $1 in 785 | %[c]) 786 | replaced=1 787 | arg="${localised_name}" 788 | shift 789 | set -- "$@" "$arg" 790 | ;; 791 | %[fFuU]) 792 | replaced=1 793 | arg="$target" 794 | shift 795 | set -- "$@" "$arg" 796 | ;; 797 | %[i]) 798 | replaced=1 799 | shift 800 | set -- "$@" "--icon" "$icon" 801 | ;; 802 | *) 803 | arg="$1" 804 | shift 805 | set -- "$@" "$arg" 806 | ;; 807 | esac 808 | args=$(( $args - 1 )) 809 | done 810 | [ $replaced -eq 1 ] || set -- "$@" "$target" 811 | "$command_exec" "$@" 812 | 813 | if [ $? -eq 0 ]; then 814 | exit_success 815 | fi 816 | fi 817 | 818 | for d in $dir/*/; do 819 | [ -d "$d" ] && search_desktop_file "$default" "$d" "$target" 820 | done 821 | } 822 | 823 | 824 | open_generic_xdg_mime() 825 | { 826 | filetype="$2" 827 | default=`xdg-mime query default "$filetype"` 828 | if [ -n "$default" ] ; then 829 | xdg_user_dir="$XDG_DATA_HOME" 830 | [ -n "$xdg_user_dir" ] || xdg_user_dir="$HOME/.local/share" 831 | 832 | xdg_system_dirs="$XDG_DATA_DIRS" 833 | [ -n "$xdg_system_dirs" ] || xdg_system_dirs=/usr/local/share/:/usr/share/ 834 | 835 | DEBUG 3 "$xdg_user_dir:$xdg_system_dirs" 836 | for x in `echo "$xdg_user_dir:$xdg_system_dirs" | sed 's/:/ /g'`; do 837 | search_desktop_file "$default" "$x/applications/" "$1" 838 | done 839 | fi 840 | } 841 | 842 | open_generic_xdg_file_mime() 843 | { 844 | filetype=`xdg-mime query filetype "$1" | sed "s/;.*//"` 845 | open_generic_xdg_mime "$1" "$filetype" 846 | } 847 | 848 | open_generic_xdg_x_scheme_handler() 849 | { 850 | scheme="`echo $1 | sed -n 's/\(^[[:alnum:]+\.-]*\):.*$/\1/p'`" 851 | if [ -n $scheme ]; then 852 | filetype="x-scheme-handler/$scheme" 853 | open_generic_xdg_mime "$1" "$filetype" 854 | fi 855 | } 856 | 857 | has_single_argument() 858 | { 859 | test $# = 1 860 | } 861 | 862 | open_envvar() 863 | { 864 | local oldifs="$IFS" 865 | local browser browser_with_arg 866 | 867 | IFS=":" 868 | for browser in $BROWSER; do 869 | IFS="$oldifs" 870 | 871 | if [ -z "$browser" ]; then 872 | continue 873 | fi 874 | 875 | if echo "$browser" | grep -q %s; then 876 | # Avoid argument injection. 877 | # See https://bugs.freedesktop.org/show_bug.cgi?id=103807 878 | # URIs don't have IFS characters spaces anyway. 879 | has_single_argument $1 && $(printf "$browser" "$1") 880 | else 881 | $browser "$1" 882 | fi 883 | 884 | if [ $? -eq 0 ]; then 885 | exit_success 886 | fi 887 | done 888 | } 889 | 890 | open_generic() 891 | { 892 | if is_file_url_or_path "$1"; then 893 | local file="$(file_url_to_path "$1")" 894 | 895 | check_input_file "$file" 896 | 897 | if has_display; then 898 | filetype=`xdg-mime query filetype "$file" | sed "s/;.*//"` 899 | open_generic_xdg_mime "$file" "$filetype" 900 | fi 901 | 902 | if which run-mailcap 2>/dev/null 1>&2; then 903 | run-mailcap --action=view "$file" 904 | if [ $? -eq 0 ]; then 905 | exit_success 906 | fi 907 | fi 908 | 909 | if has_display && mimeopen -v 2>/dev/null 1>&2; then 910 | mimeopen -L -n "$file" 911 | if [ $? -eq 0 ]; then 912 | exit_success 913 | fi 914 | fi 915 | fi 916 | 917 | if has_display; then 918 | open_generic_xdg_x_scheme_handler "$1" 919 | fi 920 | 921 | if [ -n "$BROWSER" ]; then 922 | open_envvar "$1" 923 | fi 924 | 925 | # if BROWSER variable is not set, check some well known browsers instead 926 | if [ x"$BROWSER" = x"" ]; then 927 | BROWSER=www-browser:links2:elinks:links:lynx:w3m 928 | if has_display; then 929 | BROWSER=x-www-browser:firefox:iceweasel:seamonkey:mozilla:epiphany:konqueror:chromium:chromium-browser:google-chrome:$BROWSER 930 | fi 931 | fi 932 | 933 | open_envvar "$1" 934 | 935 | exit_failure_operation_impossible "no method available for opening '$1'" 936 | } 937 | 938 | open_lxde() 939 | { 940 | 941 | # pcmanfm only knows how to handle file:// urls and filepaths, it seems. 942 | if pcmanfm --help >/dev/null 2>&1 && is_file_url_or_path "$1"; then 943 | local file="$(file_url_to_path "$1")" 944 | 945 | # handle relative paths 946 | if ! echo "$file" | grep -q ^/; then 947 | file="$(pwd)/$file" 948 | fi 949 | 950 | pcmanfm "$file" 951 | else 952 | open_generic "$1" 953 | fi 954 | 955 | if [ $? -eq 0 ]; then 956 | exit_success 957 | else 958 | exit_failure_operation_failed 959 | fi 960 | } 961 | 962 | open_lxqt() 963 | { 964 | open_generic "$1" 965 | } 966 | 967 | [ x"$1" != x"" ] || exit_failure_syntax 968 | 969 | url= 970 | while [ $# -gt 0 ] ; do 971 | parm="$1" 972 | shift 973 | 974 | case "$parm" in 975 | -*) 976 | exit_failure_syntax "unexpected option '$parm'" 977 | ;; 978 | 979 | *) 980 | if [ -n "$url" ] ; then 981 | exit_failure_syntax "unexpected argument '$parm'" 982 | fi 983 | url="$parm" 984 | ;; 985 | esac 986 | done 987 | 988 | if [ -z "${url}" ] ; then 989 | exit_failure_syntax "file or URL argument missing" 990 | fi 991 | 992 | detectDE 993 | 994 | if [ x"$DE" = x"" ]; then 995 | DE=generic 996 | fi 997 | 998 | DEBUG 2 "Selected DE $DE" 999 | 1000 | # sanitize BROWSER (avoid caling ourselves in particular) 1001 | case "${BROWSER}" in 1002 | *:"xdg-open"|"xdg-open":*) 1003 | BROWSER=$(echo $BROWSER | sed -e 's|:xdg-open||g' -e 's|xdg-open:||g') 1004 | ;; 1005 | "xdg-open") 1006 | BROWSER= 1007 | ;; 1008 | esac 1009 | 1010 | case "$DE" in 1011 | kde) 1012 | open_kde "$url" 1013 | ;; 1014 | 1015 | dde) 1016 | open_dde "$url" 1017 | ;; 1018 | 1019 | gnome3|cinnamon) 1020 | open_gnome3 "$url" 1021 | ;; 1022 | 1023 | gnome) 1024 | open_gnome "$url" 1025 | ;; 1026 | 1027 | mate) 1028 | open_mate "$url" 1029 | ;; 1030 | 1031 | xfce) 1032 | open_xfce "$url" 1033 | ;; 1034 | 1035 | lxde) 1036 | open_lxde "$url" 1037 | ;; 1038 | 1039 | lxqt) 1040 | open_lxqt "$url" 1041 | ;; 1042 | 1043 | enlightenment) 1044 | open_enlightenment "$url" 1045 | ;; 1046 | 1047 | cygwin) 1048 | open_cygwin "$url" 1049 | ;; 1050 | 1051 | darwin) 1052 | open_darwin "$url" 1053 | ;; 1054 | 1055 | flatpak) 1056 | open_flatpak "$url" 1057 | ;; 1058 | 1059 | generic) 1060 | open_generic "$url" 1061 | ;; 1062 | 1063 | *) 1064 | exit_failure_operation_impossible "no method available for opening '$url'" 1065 | ;; 1066 | esac 1067 | -------------------------------------------------------------------------------- /dist/icons/codestream.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Product_icon_dark Copy@1x 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /dist/icons/marker-bookmark-aqua.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-bookmark-blue.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-bookmark-gray.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-bookmark-green.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-bookmark-orange.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-bookmark-purple.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-bookmark-red.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-bookmark-yellow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-bookmark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /dist/icons/marker-codestream.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /dist/icons/marker-comment-aqua.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-comment-blue.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-comment-gray.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-comment-green.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-comment-orange.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-comment-purple.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-comment-red.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-comment-yellow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-comment.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /dist/icons/marker-issue-aqua.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-issue-blue.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-issue-gray.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-issue-green.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-issue-orange.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-issue-purple.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-issue-red.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-issue-yellow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-issue.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /dist/icons/marker-question-aqua.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-question-blue.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-question-gray.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-question-green.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-question-orange.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-question-purple.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-question-red.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-question-yellow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-question.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /dist/icons/marker-trap-aqua.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-trap-blue.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-trap-gray.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-trap-green.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-trap-orange.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-trap-purple.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-trap-red.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-trap-yellow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /dist/icons/marker-trap.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /dist/webview/index.html: -------------------------------------------------------------------------------- 1 | CodeStream
-------------------------------------------------------------------------------- /dist/webview/node_modules/emoji-mart/css/emoji-mart.css: -------------------------------------------------------------------------------- 1 | .emoji-mart, 2 | .emoji-mart * { 3 | box-sizing: border-box; 4 | line-height: 1.15; 5 | } 6 | 7 | .emoji-mart { 8 | font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", sans-serif; 9 | font-size: 16px; 10 | display: inline-block; 11 | color: #222427; 12 | border: 1px solid #d9d9d9; 13 | border-radius: 5px; 14 | background: #fff; 15 | } 16 | 17 | .emoji-mart .emoji-mart-emoji { 18 | padding: 6px; 19 | } 20 | 21 | .emoji-mart-bar { 22 | border: 0 solid #d9d9d9; 23 | } 24 | .emoji-mart-bar:first-child { 25 | border-bottom-width: 1px; 26 | border-top-left-radius: 5px; 27 | border-top-right-radius: 5px; 28 | } 29 | .emoji-mart-bar:last-child { 30 | border-top-width: 1px; 31 | border-bottom-left-radius: 5px; 32 | border-bottom-right-radius: 5px; 33 | } 34 | 35 | .emoji-mart-anchors { 36 | display: flex; 37 | flex-direction: row; 38 | justify-content: space-between; 39 | padding: 0 6px; 40 | color: #858585; 41 | line-height: 0; 42 | } 43 | 44 | .emoji-mart-anchor { 45 | position: relative; 46 | display: block; 47 | flex: 1 1 auto; 48 | text-align: center; 49 | padding: 12px 4px; 50 | overflow: hidden; 51 | transition: color .1s ease-out; 52 | margin: 0; 53 | box-shadow: none; 54 | background: none; 55 | border: none; 56 | } 57 | .emoji-mart-anchor:hover, 58 | .emoji-mart-anchor-selected { 59 | color: #464646; 60 | } 61 | 62 | .emoji-mart-anchor-selected .emoji-mart-anchor-bar { 63 | bottom: 0; 64 | } 65 | 66 | .emoji-mart-anchor-bar { 67 | position: absolute; 68 | bottom: -3px; left: 0; 69 | width: 100%; height: 3px; 70 | background-color: #464646; 71 | } 72 | 73 | .emoji-mart-anchors i { 74 | display: inline-block; 75 | width: 100%; 76 | max-width: 22px; 77 | } 78 | 79 | .emoji-mart-anchors svg, 80 | .emoji-mart-anchors img { 81 | fill: #858585; 82 | height: 18px; 83 | width: 18px; 84 | } 85 | 86 | .emoji-mart-scroll { 87 | overflow-y: scroll; 88 | height: 270px; 89 | padding: 0 6px 6px 6px; 90 | will-change: transform; /* avoids "repaints on scroll" in mobile Chrome */ 91 | } 92 | 93 | .emoji-mart-search { 94 | margin-top: 6px; 95 | padding: 0 6px; 96 | position: relative; 97 | } 98 | 99 | .emoji-mart-search input { 100 | font-size: 16px; 101 | display: block; 102 | width: 100%; 103 | padding: 5px 25px 6px 10px; 104 | border-radius: 5px; 105 | border: 1px solid #d9d9d9; 106 | outline: 0; 107 | } 108 | 109 | .emoji-mart-search input, 110 | .emoji-mart-search input::-webkit-search-decoration, 111 | .emoji-mart-search input::-webkit-search-cancel-button, 112 | .emoji-mart-search input::-webkit-search-results-button, 113 | .emoji-mart-search input::-webkit-search-results-decoration { 114 | /* remove webkit/blink styles for 115 | * via https://stackoverflow.com/a/9422689 */ 116 | -webkit-appearance: none; 117 | } 118 | 119 | .emoji-mart-search-icon { 120 | position: absolute; 121 | top: 7px; 122 | right: 11px; 123 | z-index: 2; 124 | padding: 2px 5px 1px; 125 | border: none; 126 | background: none; 127 | } 128 | 129 | .emoji-mart-category .emoji-mart-emoji span { 130 | z-index: 1; 131 | position: relative; 132 | text-align: center; 133 | cursor: default; 134 | } 135 | 136 | .emoji-mart-category .emoji-mart-emoji:hover:before { 137 | z-index: 0; 138 | content: ""; 139 | position: absolute; 140 | top: 0; left: 0; 141 | width: 100%; height: 100%; 142 | background-color: #f4f4f4; 143 | border-radius: 100%; 144 | } 145 | 146 | .emoji-mart-category-label { 147 | z-index: 2; 148 | position: relative; 149 | position: -webkit-sticky; 150 | position: sticky; 151 | top: 0; 152 | } 153 | 154 | .emoji-mart-category-label span { 155 | display: block; 156 | width: 100%; 157 | font-weight: 500; 158 | padding: 5px 6px; 159 | background-color: #fff; 160 | background-color: rgba(255, 255, 255, .95); 161 | } 162 | 163 | .emoji-mart-category-list { 164 | margin: 0; 165 | padding: 0; 166 | } 167 | 168 | .emoji-mart-category-list li { 169 | list-style: none; 170 | margin: 0; 171 | padding: 0; 172 | display: inline-block; 173 | } 174 | 175 | .emoji-mart-emoji { 176 | position: relative; 177 | display: inline-block; 178 | font-size: 0; 179 | margin: 0; 180 | padding: 0; 181 | border: none; 182 | background: none; 183 | box-shadow: none; 184 | } 185 | 186 | .emoji-mart-emoji-native { 187 | font-family: "Segoe UI Emoji", "Segoe UI Symbol", "Segoe UI", "Apple Color Emoji", "Twemoji Mozilla", "Noto Color Emoji", "EmojiOne Color", "Android Emoji"; 188 | } 189 | 190 | .emoji-mart-no-results { 191 | font-size: 14px; 192 | text-align: center; 193 | padding-top: 70px; 194 | color: #858585; 195 | } 196 | .emoji-mart-no-results-img { 197 | display: block; 198 | margin-left: auto; 199 | margin-right: auto; 200 | width: 50%; 201 | } 202 | .emoji-mart-no-results .emoji-mart-category-label { 203 | display: none; 204 | } 205 | .emoji-mart-no-results .emoji-mart-no-results-label { 206 | margin-top: .2em; 207 | } 208 | .emoji-mart-no-results .emoji-mart-emoji:hover:before { 209 | content: none; 210 | } 211 | 212 | .emoji-mart-preview { 213 | position: relative; 214 | height: 70px; 215 | } 216 | 217 | .emoji-mart-preview-emoji, 218 | .emoji-mart-preview-data, 219 | .emoji-mart-preview-skins { 220 | position: absolute; 221 | top: 50%; 222 | transform: translateY(-50%); 223 | } 224 | 225 | .emoji-mart-preview-emoji { 226 | left: 12px; 227 | } 228 | 229 | .emoji-mart-preview-data { 230 | left: 68px; right: 12px; 231 | word-break: break-all; 232 | } 233 | 234 | .emoji-mart-preview-skins { 235 | right: 30px; 236 | text-align: right; 237 | } 238 | 239 | .emoji-mart-preview-skins.custom { 240 | right: 10px; 241 | text-align: right; 242 | } 243 | 244 | .emoji-mart-preview-name { 245 | font-size: 14px; 246 | } 247 | 248 | .emoji-mart-preview-shortname { 249 | font-size: 12px; 250 | color: #888; 251 | } 252 | .emoji-mart-preview-shortname + .emoji-mart-preview-shortname, 253 | .emoji-mart-preview-shortname + .emoji-mart-preview-emoticon, 254 | .emoji-mart-preview-emoticon + .emoji-mart-preview-emoticon { 255 | margin-left: .5em; 256 | } 257 | 258 | .emoji-mart-preview-emoticon { 259 | font-size: 11px; 260 | color: #bbb; 261 | } 262 | 263 | .emoji-mart-title span { 264 | display: inline-block; 265 | vertical-align: middle; 266 | } 267 | 268 | .emoji-mart-title .emoji-mart-emoji { 269 | padding: 0; 270 | } 271 | 272 | .emoji-mart-title-label { 273 | color: #999A9C; 274 | font-size: 26px; 275 | font-weight: 300; 276 | } 277 | 278 | .emoji-mart-skin-swatches { 279 | font-size: 0; 280 | padding: 2px 0; 281 | border: 1px solid #d9d9d9; 282 | border-radius: 12px; 283 | background-color: #fff; 284 | } 285 | 286 | .emoji-mart-skin-swatches.custom { 287 | font-size: 0; 288 | border: none; 289 | background-color: #fff; 290 | } 291 | 292 | .emoji-mart-skin-swatches.opened .emoji-mart-skin-swatch { 293 | width: 16px; 294 | padding: 0 2px; 295 | } 296 | 297 | .emoji-mart-skin-swatches.opened .emoji-mart-skin-swatch.selected:after { 298 | opacity: .75; 299 | } 300 | 301 | .emoji-mart-skin-swatch { 302 | display: inline-block; 303 | width: 0; 304 | vertical-align: middle; 305 | transition-property: width, padding; 306 | transition-duration: .125s; 307 | transition-timing-function: ease-out; 308 | } 309 | 310 | .emoji-mart-skin-swatch:nth-child(1) { transition-delay: 0s } 311 | .emoji-mart-skin-swatch:nth-child(2) { transition-delay: .03s } 312 | .emoji-mart-skin-swatch:nth-child(3) { transition-delay: .06s } 313 | .emoji-mart-skin-swatch:nth-child(4) { transition-delay: .09s } 314 | .emoji-mart-skin-swatch:nth-child(5) { transition-delay: .12s } 315 | .emoji-mart-skin-swatch:nth-child(6) { transition-delay: .15s } 316 | 317 | .emoji-mart-skin-swatch.selected { 318 | position: relative; 319 | width: 16px; 320 | padding: 0 2px; 321 | } 322 | 323 | .emoji-mart-skin-swatch.selected:after { 324 | content: ""; 325 | position: absolute; 326 | top: 50%; left: 50%; 327 | width: 4px; height: 4px; 328 | margin: -2px 0 0 -2px; 329 | background-color: #fff; 330 | border-radius: 100%; 331 | pointer-events: none; 332 | opacity: 0; 333 | transition: opacity .2s ease-out; 334 | } 335 | 336 | .emoji-mart-skin-swatch.custom { 337 | display: inline-block; 338 | width: 0; 339 | height: 38px; 340 | overflow: hidden; 341 | vertical-align: middle; 342 | transition-property: width, height; 343 | transition-duration: .125s; 344 | transition-timing-function: ease-out; 345 | cursor: default; 346 | } 347 | 348 | .emoji-mart-skin-swatch.custom.selected { 349 | position: relative; 350 | width: 36px; 351 | height: 38px; 352 | padding: 0 2px 0 0; 353 | } 354 | 355 | .emoji-mart-skin-swatch.custom.selected:after { 356 | content: ""; 357 | width: 0; 358 | height: 0; 359 | } 360 | 361 | .emoji-mart-skin-swatches.custom .emoji-mart-skin-swatch.custom:hover { 362 | background-color: #f4f4f4; 363 | border-radius: 10%; 364 | } 365 | 366 | .emoji-mart-skin-swatches.custom.opened .emoji-mart-skin-swatch.custom { 367 | width: 36px; 368 | height: 38px; 369 | padding: 0 2px 0 0; 370 | } 371 | 372 | .emoji-mart-skin-swatches.custom.opened .emoji-mart-skin-swatch.custom.selected:after { 373 | opacity: .75; 374 | } 375 | 376 | .emoji-mart-skin-text.opened { 377 | display: inline-block; 378 | vertical-align: middle; 379 | text-align: left; 380 | color: #888; 381 | font-size: 11px; 382 | padding: 5px 2px; 383 | width: 95px; 384 | height: 40px; 385 | border-radius: 10%; 386 | background-color: #fff; 387 | } 388 | 389 | .emoji-mart-skin { 390 | display: inline-block; 391 | width: 100%; 392 | padding-top: 100%; 393 | max-width: 12px; 394 | border-radius: 100%; 395 | } 396 | 397 | .emoji-mart-skin-tone-1 { background-color: #ffc93a } 398 | .emoji-mart-skin-tone-2 { background-color: #fadcbc } 399 | .emoji-mart-skin-tone-3 { background-color: #e0bb95 } 400 | .emoji-mart-skin-tone-4 { background-color: #bf8f68 } 401 | .emoji-mart-skin-tone-5 { background-color: #9b643d } 402 | .emoji-mart-skin-tone-6 { background-color: #594539 } 403 | 404 | /* For screenreaders only, via https://stackoverflow.com/a/19758620 */ 405 | .emoji-mart-sr-only { 406 | position: absolute; 407 | width: 1px; 408 | height: 1px; 409 | padding: 0; 410 | margin: -1px; 411 | overflow: hidden; 412 | clip: rect(0, 0, 0, 0); 413 | border: 0; 414 | } 415 | 416 | 417 | -------------------------------------------------------------------------------- /dist/webview/node_modules/rc-tooltip/assets/bootstrap.css: -------------------------------------------------------------------------------- 1 | .rc-tooltip.rc-tooltip-zoom-enter, 2 | .rc-tooltip.rc-tooltip-zoom-leave { 3 | display: block; 4 | } 5 | .rc-tooltip-zoom-enter, 6 | .rc-tooltip-zoom-appear { 7 | opacity: 0; 8 | animation-duration: 0.3s; 9 | animation-fill-mode: both; 10 | animation-timing-function: cubic-bezier(0.18, 0.89, 0.32, 1.28); 11 | animation-play-state: paused; 12 | } 13 | .rc-tooltip-zoom-leave { 14 | animation-duration: 0.3s; 15 | animation-fill-mode: both; 16 | animation-timing-function: cubic-bezier(0.6, -0.3, 0.74, 0.05); 17 | animation-play-state: paused; 18 | } 19 | .rc-tooltip-zoom-enter.rc-tooltip-zoom-enter-active, 20 | .rc-tooltip-zoom-appear.rc-tooltip-zoom-appear-active { 21 | animation-name: rcToolTipZoomIn; 22 | animation-play-state: running; 23 | } 24 | .rc-tooltip-zoom-leave.rc-tooltip-zoom-leave-active { 25 | animation-name: rcToolTipZoomOut; 26 | animation-play-state: running; 27 | } 28 | @keyframes rcToolTipZoomIn { 29 | 0% { 30 | opacity: 0; 31 | transform-origin: 50% 50%; 32 | transform: scale(0, 0); 33 | } 34 | 100% { 35 | opacity: 1; 36 | transform-origin: 50% 50%; 37 | transform: scale(1, 1); 38 | } 39 | } 40 | @keyframes rcToolTipZoomOut { 41 | 0% { 42 | opacity: 1; 43 | transform-origin: 50% 50%; 44 | transform: scale(1, 1); 45 | } 46 | 100% { 47 | opacity: 0; 48 | transform-origin: 50% 50%; 49 | transform: scale(0, 0); 50 | } 51 | } 52 | .rc-tooltip { 53 | position: absolute; 54 | z-index: 1070; 55 | display: block; 56 | visibility: visible; 57 | font-size: 12px; 58 | line-height: 1.5; 59 | opacity: 0.9; 60 | } 61 | .rc-tooltip-hidden { 62 | display: none; 63 | } 64 | .rc-tooltip-placement-top, 65 | .rc-tooltip-placement-topLeft, 66 | .rc-tooltip-placement-topRight { 67 | padding: 5px 0 9px 0; 68 | } 69 | .rc-tooltip-placement-right, 70 | .rc-tooltip-placement-rightTop, 71 | .rc-tooltip-placement-rightBottom { 72 | padding: 0 5px 0 9px; 73 | } 74 | .rc-tooltip-placement-bottom, 75 | .rc-tooltip-placement-bottomLeft, 76 | .rc-tooltip-placement-bottomRight { 77 | padding: 9px 0 5px 0; 78 | } 79 | .rc-tooltip-placement-left, 80 | .rc-tooltip-placement-leftTop, 81 | .rc-tooltip-placement-leftBottom { 82 | padding: 0 9px 0 5px; 83 | } 84 | .rc-tooltip-inner { 85 | padding: 8px 10px; 86 | color: #fff; 87 | text-align: left; 88 | text-decoration: none; 89 | background-color: #373737; 90 | border-radius: 6px; 91 | box-shadow: 0 0 4px rgba(0, 0, 0, 0.17); 92 | min-height: 34px; 93 | } 94 | .rc-tooltip-arrow { 95 | position: absolute; 96 | width: 0; 97 | height: 0; 98 | border-color: transparent; 99 | border-style: solid; 100 | } 101 | .rc-tooltip-placement-top .rc-tooltip-arrow, 102 | .rc-tooltip-placement-topLeft .rc-tooltip-arrow, 103 | .rc-tooltip-placement-topRight .rc-tooltip-arrow { 104 | bottom: 4px; 105 | margin-left: -5px; 106 | border-width: 5px 5px 0; 107 | border-top-color: #373737; 108 | } 109 | .rc-tooltip-placement-top .rc-tooltip-arrow { 110 | left: 50%; 111 | } 112 | .rc-tooltip-placement-topLeft .rc-tooltip-arrow { 113 | left: 15%; 114 | } 115 | .rc-tooltip-placement-topRight .rc-tooltip-arrow { 116 | right: 15%; 117 | } 118 | .rc-tooltip-placement-right .rc-tooltip-arrow, 119 | .rc-tooltip-placement-rightTop .rc-tooltip-arrow, 120 | .rc-tooltip-placement-rightBottom .rc-tooltip-arrow { 121 | left: 4px; 122 | margin-top: -5px; 123 | border-width: 5px 5px 5px 0; 124 | border-right-color: #373737; 125 | } 126 | .rc-tooltip-placement-right .rc-tooltip-arrow { 127 | top: 50%; 128 | } 129 | .rc-tooltip-placement-rightTop .rc-tooltip-arrow { 130 | top: 15%; 131 | margin-top: 0; 132 | } 133 | .rc-tooltip-placement-rightBottom .rc-tooltip-arrow { 134 | bottom: 15%; 135 | } 136 | .rc-tooltip-placement-left .rc-tooltip-arrow, 137 | .rc-tooltip-placement-leftTop .rc-tooltip-arrow, 138 | .rc-tooltip-placement-leftBottom .rc-tooltip-arrow { 139 | right: 4px; 140 | margin-top: -5px; 141 | border-width: 5px 0 5px 5px; 142 | border-left-color: #373737; 143 | } 144 | .rc-tooltip-placement-left .rc-tooltip-arrow { 145 | top: 50%; 146 | } 147 | .rc-tooltip-placement-leftTop .rc-tooltip-arrow { 148 | top: 15%; 149 | margin-top: 0; 150 | } 151 | .rc-tooltip-placement-leftBottom .rc-tooltip-arrow { 152 | bottom: 15%; 153 | } 154 | .rc-tooltip-placement-bottom .rc-tooltip-arrow, 155 | .rc-tooltip-placement-bottomLeft .rc-tooltip-arrow, 156 | .rc-tooltip-placement-bottomRight .rc-tooltip-arrow { 157 | top: 4px; 158 | margin-left: -5px; 159 | border-width: 0 5px 5px; 160 | border-bottom-color: #373737; 161 | } 162 | .rc-tooltip-placement-bottom .rc-tooltip-arrow { 163 | left: 50%; 164 | } 165 | .rc-tooltip-placement-bottomLeft .rc-tooltip-arrow { 166 | left: 15%; 167 | } 168 | .rc-tooltip-placement-bottomRight .rc-tooltip-arrow { 169 | right: 15%; 170 | } 171 | -------------------------------------------------------------------------------- /dist/webview/preload.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | const { ipcRenderer } = require("electron"); 3 | 4 | const host = { 5 | on(channel, cb) { 6 | ipcRenderer.on(channel, (e, args) => cb(args)); 7 | }, 8 | 9 | send(channel, message) { 10 | ipcRenderer.sendToHost(channel, message); 11 | }, 12 | }; 13 | 14 | Object.defineProperty(window, "acquireAtomApi", { 15 | value: () => host, 16 | }); 17 | 18 | document.addEventListener("DOMContentLoaded", () => { 19 | host.send("ready"); 20 | document.addEventListener("keydown", e => { 21 | host.send("did-keydown", { 22 | key: e.key, 23 | keyCode: e.keyCode, 24 | code: e.code, 25 | shiftKey: e.shiftKey, 26 | altKey: e.altKey, 27 | ctrlKey: e.ctrlKey, 28 | metaKey: e.metaKey, 29 | repeat: e.repeat, 30 | }); 31 | }); 32 | }); 33 | -------------------------------------------------------------------------------- /dist/webview/styles/codemark-form.less: -------------------------------------------------------------------------------- 1 | .full-height-codemark-form { 2 | background: @app-background-color; 3 | position: absolute; 4 | top: 0; 5 | bottom: 0; 6 | left: 0; 7 | right: 0; 8 | z-index: 50; 9 | max-height: 100%; 10 | overflow: auto; 11 | .plane-container { 12 | // tag: codemark-width 13 | padding: 20px; 14 | } 15 | .review-container { 16 | padding: 20px; 17 | } 18 | 19 | .codemark-form, 20 | .review-form { 21 | max-height: none !important; 22 | } 23 | padding-top: 20px; 24 | > .align-right-button { 25 | position: absolute; 26 | top: 10px; 27 | right: 20px; 28 | } 29 | } 30 | #modal-root .codemark-form { 31 | max-height: none !important; 32 | } 33 | 34 | // should go into message-input.less 35 | .message-input-wrapper { 36 | position: relative; 37 | } 38 | 39 | #code-comment-form .message-input.preview { 40 | outline: none !important; 41 | padding-left: 0 !important; 42 | padding-right: 0 !important; 43 | max-height: none; 44 | } 45 | 46 | .codemark-form, 47 | .review-form { 48 | width: 100%; 49 | max-height: 100vh !important; 50 | padding: 0 10px 10px 10px; 51 | position: relative; 52 | 53 | .code { 54 | margin: 5px 0 !important; 55 | } 56 | 57 | .codemark-actions-button:not(:hover) { 58 | background: @base-background-color; 59 | } 60 | .codemark-actions-button:hover { 61 | color: var(--button-foreground-color); 62 | } 63 | 64 | .form-body { 65 | min-width: 180px; 66 | } 67 | 68 | .message-input { 69 | min-height: 50px; 70 | max-width: calc(~"100vw - 62px") !important; 71 | outline: 1px solid @base-border-color !important; 72 | background: var(--app-background-color) !important; 73 | .vscode-dark & { 74 | background: rgba(0, 0, 0, 0.1) !important; 75 | } 76 | } 77 | 78 | .input-text { 79 | border: 1px solid @base-border-color !important; 80 | margin-bottom: 5px; 81 | background: var(--app-background-color) !important; 82 | .vscode-dark & { 83 | background: rgba(0, 0, 0, 0.1) !important; 84 | } 85 | } 86 | 87 | .connect-issue { 88 | display: flex; 89 | margin-bottom: 10px; 90 | flex-wrap: wrap; 91 | } 92 | 93 | .connect-issue-label { 94 | // white-space: nowrap; 95 | padding-right: 5px; 96 | } 97 | 98 | .channel-label { 99 | font-weight: normal; 100 | color: @text-color-highlight; 101 | // white-space: nowrap; 102 | cursor: pointer; 103 | // text-overflow: ellipsis; 104 | // overflow: hidden; 105 | 106 | .icon { 107 | display: inline-block; 108 | transform: scale(0.7); 109 | margin-left: 2px; 110 | } 111 | } 112 | 113 | .location { 114 | &.live { 115 | // color: var(--text-color-info); 116 | } 117 | } 118 | 119 | @keyframes yellow-fade { 120 | 50% { 121 | color: @text-color-highlight; 122 | // border: 1px solid rgba(255, 255, 0, 0.25); 123 | background: rgba(127, 127, 127, 0.25); 124 | } 125 | 100% { 126 | color: @text-color; 127 | // border: 1px solid @base-border-color; 128 | background: rgba(0, 0, 0, 0.1); 129 | } 130 | } 131 | 132 | .add-range { 133 | animation: yellow-fade 1.25s ease 1; 134 | display: block; 135 | // color: @text-color-info; 136 | padding: 10px; 137 | border: 1px solid @base-border-color; 138 | margin: 35px 0 10px 0; 139 | background: rgba(0, 0, 0, 0.1); 140 | } 141 | 142 | .headline { 143 | padding-left: 25px; 144 | // height: 20px; 145 | margin-top: 10px; 146 | padding-bottom: 8px; 147 | // display: inline-flex; 148 | width: 100%; 149 | } 150 | .headline-flex { 151 | margin-top: 10px; 152 | padding-bottom: 8px; 153 | display: inline-flex; 154 | width: 100%; 155 | } 156 | .subhead { 157 | opacity: 0.75; 158 | padding-left: 5px; 159 | // white-space: nowrap; 160 | // text-overflow: ellipsis; 161 | // overflow: hidden; 162 | } 163 | 164 | .headshot-gravatar, 165 | .headshot-image, 166 | .headshot-system { 167 | display: block; 168 | position: absolute; 169 | width: 18px; 170 | height: 18px; 171 | border-radius: 4px; 172 | background: none; 173 | z-index: 2; 174 | left: 10px; 175 | } 176 | 177 | .headshot-initials { 178 | display: block; 179 | position: absolute; 180 | width: 18px; 181 | height: 18px; 182 | font-size: 11px; 183 | text-transform: capitalize; 184 | text-align: center; 185 | padding-top: 1px; 186 | font-weight: 700; 187 | border-radius: 4px; 188 | color: @app-background-color; 189 | z-index: 1; 190 | left: 10px; 191 | } 192 | 193 | .tab-group { 194 | margin-bottom: 10px; 195 | } 196 | 197 | fieldset { 198 | padding: 0 !important; 199 | // padding: 0 0 40px 0 !important; 200 | max-width: 100% !important; 201 | // width: calc(100vw - 60px) !important; 202 | } 203 | .form-body { 204 | padding: 0; 205 | } 206 | .align-right-button { 207 | right: 0px; 208 | } 209 | // .chat-bubble { 210 | // vertical-align: -2px; 211 | // } 212 | label { 213 | margin-top: 5px !important; 214 | } 215 | .more { 216 | color: @text-color !important; 217 | } 218 | .permalink { 219 | background-color: @app-background-color-hover; 220 | padding: 10px !important; 221 | text-align: center; 222 | overflow: hidden; 223 | // text-overflow: ellipsis; 224 | margin: 10px 0; 225 | border: 1px solid @base-border-color; 226 | width: 100%; 227 | white-space: nowrap; 228 | } 229 | .permalink-warning { 230 | color: @text-color-warning; 231 | margin: 10px 0 5px 0; 232 | .icon { 233 | margin-right: 5px; 234 | } 235 | } 236 | } 237 | 238 | .issue-type-icon { 239 | width: 16px; 240 | height: 16px; 241 | vertical-align: -3px; 242 | margin-right: 5px; 243 | margin-left: 2px; 244 | } 245 | 246 | .review-form { 247 | max-height: none !important; 248 | .message-input { 249 | min-height: 100px !important; 250 | } 251 | } 252 | 253 | @keyframes highlight-fade { 254 | 50% { 255 | color: @text-color-highlight; 256 | background: rgba(127, 127, 127, 0.25); 257 | border-color: orange; 258 | } 259 | 100% { 260 | color: @text-color; 261 | background: transparent; 262 | } 263 | } 264 | 265 | .highlight-pulse { 266 | animation: highlight-fade 1.25s ease 1; 267 | } 268 | 269 | @keyframes highlight-outline { 270 | 50% { 271 | color: @text-color-highlight; 272 | border-color: orange; 273 | } 274 | 100% { 275 | color: @text-color; 276 | } 277 | } 278 | 279 | .highlight-outline { 280 | animation: highlight-outline 1.25s ease 1; 281 | } 282 | 283 | .row-with-icon-actions { 284 | position: relative; 285 | padding-top: 3px; 286 | padding-bottom: 3px; 287 | margin: 0 !important; 288 | &:not(.no-hover) { 289 | cursor: pointer; 290 | } 291 | &.with-file-icon { 292 | // padding-left: 20px; 293 | } 294 | &.wide { 295 | padding-left: 20px; 296 | padding-right: 20px; 297 | .icon.file-icon { 298 | // left: 20px; 299 | } 300 | } 301 | &.with-action-icons { 302 | padding-right: 40px; 303 | } 304 | .icon.file-icon { 305 | // position: absolute !important; 306 | // left: 0; 307 | // top: 2px; 308 | margin-top: -1px; 309 | opacity: 0.6; 310 | display: inline-block; 311 | margin-right: 3px; 312 | &.spin { 313 | // margin-top: -1px; 314 | // top: 3px; 315 | // left: 1px; 316 | } 317 | } 318 | &.ellipsis-left-container { 319 | height: 1.8em; 320 | // overflow-x: hidden; 321 | white-space: nowrap; 322 | display: flex; 323 | } 324 | &.selected, 325 | &.selected-simple { 326 | color: var(--text-color-highlight); 327 | // font-weight: bold; 328 | position: relative; 329 | background: var(--app-background-color-hover); 330 | .icon.file-icon { 331 | opacity: 1; 332 | // left: 3px; 333 | display: inline-block; 334 | // transform: scale(1.25); 335 | } 336 | } 337 | .ellipsis-right-container { 338 | overflow: hidden; 339 | text-overflow: ellipsis; 340 | white-space: nowrap; 341 | margin-top: 0 !important; 342 | display: inline-block; 343 | } 344 | &.monospace, 345 | .file-info { 346 | font-size: 12px; 347 | } 348 | &.muted:not(.litup), 349 | &.dimmed:not(.excluded-file) { 350 | opacity: 0.4; 351 | } 352 | // align the X vertically centered 353 | .actions { 354 | position: absolute; 355 | right: 15px; 356 | top: 2px; 357 | &.opaque { 358 | right: 0; 359 | } 360 | } 361 | .badge { 362 | display: block; 363 | margin: 0 10px 0 auto !important; 364 | transform: translateX(10px); 365 | // using border as a padding here since we 366 | // want some space but margin-left has to be auto 367 | } 368 | &:hover:not(.no-hover) { 369 | color: @text-color-highlight; 370 | background-color: @app-background-color-hover; 371 | .actions.opaque { 372 | background: @app-background-color-hover; 373 | } 374 | .icon.action { 375 | display: inline-block; 376 | visibility: visible; 377 | pointer-events: all; 378 | opacity: 0.5; 379 | &:hover { 380 | opacity: 1; 381 | } 382 | } 383 | .message { 384 | color: @text-color; 385 | } 386 | } 387 | .message { 388 | color: @text-color-subtle; 389 | .emoji { 390 | color: @text-color; 391 | } 392 | } 393 | .icon.action { 394 | visibility: hidden; 395 | pointer-events: none; 396 | margin-left: 10px; 397 | } 398 | .icon.merge { 399 | color: orange; 400 | margin-left: -22px; 401 | margin-right: 6px; 402 | margin-top: -2px; 403 | opacity: 0.8; 404 | display: inline-block; 405 | } 406 | .merge { 407 | color: orange; 408 | } 409 | p { 410 | display: inline; 411 | margin: 0; 412 | } 413 | .icon.conflict { 414 | margin-left: 5px; 415 | vertical-align: 2px; 416 | } 417 | &.file-has-conflict { 418 | color: @text-color-warning !important; 419 | } 420 | a { 421 | color: var(--text-color); 422 | } 423 | } 424 | 425 | .added { 426 | white-space: nowrap; 427 | padding-left: 5px; 428 | color: #66aa66; 429 | } 430 | .deleted { 431 | white-space: nowrap; 432 | padding-left: 5px; 433 | color: #cc3366; 434 | } 435 | 436 | .icon.conflict { 437 | color: @text-color-warning; 438 | } 439 | 440 | .stomped { 441 | white-space: nowrap; 442 | padding-left: 5px; 443 | color: var(--text-color-info); 444 | } 445 | 446 | .ellipsis-container { 447 | height: 1.8em; 448 | overflow: hidden; 449 | white-space: pre; 450 | } 451 | 452 | //https://stackoverflow.com/questions/9793473/text-overflow-ellipsis-on-left-side 453 | .ellipsis-left { 454 | height: 1.8em; 455 | overflow: hidden; 456 | text-overflow: ellipsis; 457 | direction: rtl; 458 | } 459 | 460 | .active-drag .message-attach-icons { 461 | display: none; 462 | } 463 | 464 | .message-attach-icons { 465 | position: absolute; 466 | bottom: 5px; 467 | right: 5px; 468 | .icon { 469 | // position: absolute; 470 | // bottom: 5px; 471 | // right: 38px; 472 | margin: 0 0 0 10px !important; 473 | padding: 0 !important; 474 | opacity: 0.4; 475 | cursor: pointer; 476 | transition: transform 0.1s; 477 | display: inline-block; 478 | &:hover, 479 | &.hover { 480 | opacity: 1; 481 | color: @text-color-info; 482 | transform: scale(1.4) !important; 483 | } 484 | &.selected { 485 | opacity: 1; 486 | color: @text-color-highlight; 487 | } 488 | } 489 | .icon-wrapper { 490 | cursor: pointer; 491 | position: relative; 492 | margin-left: 10px; 493 | .icon { 494 | margin: 0 !important; 495 | } 496 | // https://stackoverflow.com/questions/1537223/change-cursor-type-on-input-type-file 497 | input[type="file"]::-webkit-file-upload-button { 498 | cursor: pointer; 499 | } 500 | } 501 | .icon-wrapper:hover .icon { 502 | opacity: 1; 503 | color: @text-color-info; 504 | transform: scale(1.4) !important; 505 | } 506 | } 507 | 508 | .add-location { 509 | display: block; 510 | // text-align: right; 511 | // flex-grow: 10; 512 | white-space: nowrap; 513 | float: right; 514 | padding-left: 10px; 515 | 516 | span { 517 | opacity: 0.75; 518 | cursor: pointer; 519 | .icon { 520 | display: inline-block; 521 | transform: scale(0.7); 522 | margin-right: 2px; 523 | } 524 | &:hover { 525 | opacity: 1; 526 | color: @text-color-highlight; 527 | } 528 | } 529 | } 530 | 531 | &:hover > .code-buttons, 532 | .code-buttons.live { 533 | display: block; 534 | } 535 | .code-buttons { 536 | position: absolute; 537 | bottom: 5px; 538 | right: 7px; 539 | // display: none; 540 | // float: right; 541 | .ok { 542 | background: var(--button-background-color) !important; 543 | border: 1px solid var(--button-background-color); 544 | color: var(--button-foreground-color) !important; 545 | margin-right: 5px; 546 | &:hover { 547 | background: var(--button-background-color-hover) !important; 548 | } 549 | } 550 | .icon { 551 | opacity: 0.4; 552 | margin-left: 10px; 553 | &:hover { 554 | opacity: 1; 555 | } 556 | } 557 | } 558 | 559 | .loading-boards { 560 | margin: 13px 0 5px 0; 561 | .spin { 562 | vertical-align: 2px; 563 | margin-right: 5px; 564 | } 565 | } 566 | 567 | #controls .has-input-actions { 568 | .actions { 569 | position: absolute; 570 | right: 0; 571 | top: 5px; 572 | .icon { 573 | opacity: 0.5; 574 | margin: 0 5px; 575 | &:hover { 576 | opacity: 1; 577 | } 578 | } 579 | } 580 | input[type="text"] { 581 | padding-right: 100px !important; 582 | } 583 | &.two-buttons input[type="text"] { 584 | padding-right: 50px !important; 585 | } 586 | } 587 | 588 | // TODO: 🔥 589 | // what fire is needed? 590 | @media only screen and (max-width: 350px) { 591 | .codemark-form .tab-group label b { 592 | display: none; 593 | } 594 | } 595 | @media only screen and (max-width: 430px) { 596 | .codemark-form .tab-group label { 597 | max-width: calc(~"25% - 10"); 598 | } 599 | } 600 | -------------------------------------------------------------------------------- /dist/webview/styles/codemarks-panel.less: -------------------------------------------------------------------------------- 1 | .codemarks-panel, 2 | .reviews-panel { 3 | .getting-started { 4 | padding: 0 20px 0 20px; 5 | } 6 | 7 | .info { 8 | padding-top: 20px; 9 | 10 | .codemark-info { 11 | display: flex; 12 | flex-direction: row; 13 | margin-bottom: 10px; 14 | &:hover { 15 | cursor: pointer; 16 | background: @app-background-color-hover; 17 | } 18 | } 19 | 20 | .type-icon { 21 | height: 30px; 22 | width: 30px; 23 | margin-right: 10px; 24 | svg { 25 | height: 25px; 26 | width: 25px; 27 | } 28 | } 29 | 30 | .text { 31 | h3 { 32 | margin: 0; 33 | } 34 | p { 35 | margin-top: 5px; 36 | } 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /dist/webview/styles/codemarks.less: -------------------------------------------------------------------------------- 1 | .editing-codemark-container { 2 | .card; 3 | padding-bottom: 10px; 4 | width: 100%; 5 | } 6 | .btn-locate-repo { 7 | margin-left: 4px; 8 | padding: 1px 4px !important; 9 | line-height: initial !important; 10 | 11 | & > .spin, 12 | & > .icon svg { 13 | height: 12px; 14 | } 15 | } 16 | 17 | .codemark { 18 | padding-left: 10px; 19 | // transition: top 0.1s; 20 | &.injecting { 21 | width: 100% !important; 22 | .header { 23 | display: none; 24 | } 25 | .info-wrapper { 26 | display: none; 27 | } 28 | .contents { 29 | width: 100% !important; 30 | } 31 | .contents > .body { 32 | overflow-x: hidden !important; 33 | width: 100% !important; 34 | } 35 | } 36 | &.wrap { 37 | cursor: pointer; 38 | .contents .title > p { 39 | margin: 0; 40 | white-space: pre-wrap; 41 | } 42 | width: 100%; 43 | padding: 2px 10px 2px 20px; 44 | .contents .body, 45 | .contents span { 46 | white-space: pre-wrap; 47 | overflow: visible; 48 | } 49 | .type-icon { 50 | margin-right: 5px; 51 | } 52 | img { 53 | max-height: 18px; 54 | } 55 | } 56 | &.archived { 57 | opacity: 0.5; 58 | } 59 | &.collapsed { 60 | // height: 25px; 61 | width: 100%; 62 | padding: 2px 10px 2px 20px; 63 | overflow: hidden; 64 | cursor: pointer; 65 | .contents { 66 | .body { 67 | background: none; 68 | white-space: nowrap; 69 | overflow: hidden; 70 | text-overflow: ellipsis; 71 | } 72 | span { 73 | white-space: nowrap; 74 | } 75 | br { 76 | display: none; 77 | } 78 | img { 79 | max-height: 18px; 80 | } 81 | p { 82 | display: inline; 83 | } 84 | .type-icon { 85 | margin-right: 5px; 86 | } 87 | .file-name { 88 | padding-left: 10px; 89 | opacity: 0.25; 90 | } 91 | pre.prettyprint, 92 | blockquote { 93 | display: none; 94 | } 95 | code { 96 | display: inline; 97 | } 98 | } 99 | .align-far-left { 100 | margin-left: -22px; 101 | float: left; 102 | } 103 | .status-button { 104 | // float: right; 105 | display: inline-block; 106 | // border: 2px solid green; 107 | border-radius: 3px; 108 | width: 14px; 109 | height: 14px; 110 | text-align: center; 111 | border: 2px solid @text-color; 112 | opacity: 1; 113 | margin-top: 2px; 114 | .check { 115 | opacity: 1; 116 | transform: scale(0.01); 117 | transition: transform 0.3s; 118 | display: inline-block; 119 | top: -2px !important; 120 | color: @text-color !important; 121 | visibility: hidden; 122 | } 123 | &.checked { 124 | .check { 125 | visibility: visible; 126 | } 127 | background-color: @text-color; 128 | border: none; 129 | vertical-align: 2px !important; 130 | .check { 131 | // opacity: 0.6; 132 | transform: scale(1); 133 | transform: scale(0.85); 134 | color: @app-background-color !important; 135 | } 136 | } 137 | } 138 | .show-on-hover { 139 | padding: 5px 0 0 0; 140 | opacity: 0; 141 | transition: opacity 0.4s; 142 | .details { 143 | padding-left: 8px; 144 | } 145 | } 146 | &:hover .show-on-hover { 147 | opacity: 0.6; 148 | } 149 | .cs-tag { 150 | margin-bottom: 0; 151 | } 152 | .cs-tag-container { 153 | display: inline-block; 154 | margin-top: -1px; 155 | vertical-align: top; 156 | padding-left: 10px; 157 | } 158 | .angle-arrow { 159 | width: 16px; 160 | height: 16px; 161 | position: relative; 162 | display: inline-block; 163 | margin-right: 8px; 164 | margin-left: 3px; 165 | &::before { 166 | content: ""; 167 | position: absolute; 168 | display: block; 169 | top: 0; 170 | left: 8px; 171 | width: 2px; 172 | height: 8px; 173 | background: @text-color; 174 | } 175 | &::after { 176 | content: ""; 177 | position: absolute; 178 | display: block; 179 | top: 8px; 180 | left: 8px; 181 | width: 8px; 182 | height: 2px; 183 | background: @text-color; 184 | } 185 | } 186 | .clickable:hover { 187 | color: @text-color-highlight; 188 | } 189 | .username { 190 | font-weight: bold; 191 | } 192 | .actions { 193 | float: right; 194 | display: none; 195 | .icon { 196 | margin-left: 5px; 197 | } 198 | } 199 | &:hover .actions { 200 | display: inline-block; 201 | } 202 | } 203 | &:hover { 204 | // color: @text-color-highlight; 205 | // background: rgba(127, 127, 127, 0.4); 206 | background: var(--app-background-color-hover); 207 | color: var(--text-color-highlight); 208 | } 209 | &.inline { 210 | position: relative; 211 | padding: 0 !important; 212 | z-index: 1; 213 | background: @app-background-color; 214 | height: auto; 215 | // box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); 216 | 217 | .header, 218 | .detail-icons, 219 | .striped-header { 220 | // visibility: hidden; 221 | } 222 | border-top: 1px solid var(--base-border-color); 223 | border-bottom: 1px solid var(--base-border-color); 224 | background: var(--app-background-color); 225 | 226 | // &.has-striped-header:not(.selected) { 227 | // opacity: 0.5; 228 | // &:hover { 229 | // opacity: 1; 230 | // } 231 | // } 232 | margin-top: -21px; 233 | &.selected { 234 | margin-top: 0; 235 | border: 1px solid @base-border-color; 236 | background: @base-background-color; 237 | .card; 238 | } 239 | &.selected, 240 | &:hover { 241 | .header, 242 | .striped-header, 243 | .detail-icons { 244 | visibility: visible; 245 | } 246 | } 247 | flex: auto; 248 | width: 100%; 249 | // overflow: hidden; 250 | 251 | .assignees { 252 | // float: right; 253 | } 254 | .status-button { 255 | display: none; 256 | } 257 | 258 | &.type-bookmark:not(.selected) .header { 259 | margin-bottom: 0 !important; 260 | } 261 | .contents { 262 | width: 100%; 263 | } 264 | .contents > .body { 265 | display: flex; 266 | flex-direction: column; 267 | padding-top: 2px; 268 | padding-bottom: 2px; 269 | padding-left: 49px !important; 270 | white-space: nowrap; 271 | text-overflow: ellipsis; 272 | overflow-x: hidden; 273 | .type-icon { 274 | margin-left: -23px; 275 | } 276 | } 277 | .description { 278 | padding: 0 10px 0 10px; 279 | p { 280 | margin: 0; 281 | } 282 | } 283 | &.selected .contents, 284 | &:hover .contents { 285 | // &.selected .contents { 286 | color: @text-color-highlight; 287 | background: rgba(127, 127, 127, 0.05); 288 | } 289 | 290 | &:not(.selected) { 291 | cursor: pointer; 292 | } 293 | 294 | &.selected { 295 | // transform: scale(1.05); 296 | // transform: translate(-20px, 0); 297 | z-index: 2; 298 | // box-shadow: 0 25px 50px rgba(0, 0, 0, 0.4); 299 | } 300 | &.cs-hidden { 301 | // transform: none; 302 | 303 | .contents { 304 | // visibility: hidden; 305 | } 306 | &.unpinned { 307 | border-left: 1px solid var(--base-border-color); 308 | border-right: 1px solid var(--base-border-color); 309 | background: @base-background-color; 310 | } 311 | // &.unpinned { 312 | // background: repeating-linear-gradient( 313 | // -45deg, 314 | // transparent, 315 | // transparent 5px, 316 | // @app-background-color 5px, 317 | // @app-background-color 10px 318 | // ) !important; 319 | // } 320 | } 321 | .postslist { 322 | // max-height: 200px; 323 | // overflow: auto; 324 | } 325 | .date-separator { 326 | display: none; 327 | } 328 | .contents > .body { 329 | white-space: normal; 330 | text-overflow: initial; 331 | overflow-x: auto; 332 | padding: 10px 20px 10px 20px !important; 333 | .code.prettyprint { 334 | margin: 0; 335 | } 336 | } 337 | &.selected .contents > .body { 338 | padding: 10px 10px 10px 10px !important; 339 | } 340 | .contents > .body > .title > p { 341 | margin: 0; 342 | white-space: pre-wrap; 343 | } 344 | .codemark-details { 345 | margin-top: -10px; 346 | } 347 | .right { 348 | float: right; 349 | display: flex; 350 | flex-direction: row-reverse; 351 | margin-right: 0; 352 | .kebab-vertical { 353 | padding: 3px 5px; 354 | margin-left: 5px; 355 | } 356 | } 357 | .contents > .body, 358 | .codemark-details { 359 | .post { 360 | padding: 10px; 361 | min-height: 36px; 362 | .body { 363 | padding: 0 0 0 23px; 364 | } 365 | 366 | &.reply .author { 367 | cursor: unset; 368 | } 369 | &:hover { 370 | .align-right { 371 | visibility: visible; 372 | } 373 | } 374 | .align-right { 375 | visibility: hidden; 376 | } 377 | .gear { 378 | margin-left: 10px; 379 | } 380 | } 381 | 382 | .header { 383 | margin-bottom: 8px; 384 | } 385 | .author { 386 | display: inline; 387 | cursor: pointer; 388 | font-size: 13px; 389 | font-weight: 700; 390 | // padding-bottom: 5px; 391 | .verb { 392 | font-weight: normal; 393 | color: var(--text-color); 394 | } 395 | } 396 | .headshot { 397 | display: inline-block; 398 | position: relative; 399 | width: 16px; 400 | height: 16px; 401 | margin-right: 7px; 402 | vertical-align: -4px; 403 | left: 0; 404 | } 405 | .headshot-image { 406 | position: absolute; 407 | width: 16px; 408 | height: 16px; 409 | border-radius: 3px; 410 | z-index: 2; 411 | left: 0; 412 | } 413 | .headshot-gravatar { 414 | position: absolute; 415 | width: 16px; 416 | height: 16px; 417 | border-radius: 3px; 418 | z-index: 2; 419 | left: 0; 420 | overflow: hidden; 421 | } 422 | .headshot-initials { 423 | position: absolute; 424 | width: 16px; 425 | height: 16px; 426 | border-radius: 3px; 427 | text-align: center; 428 | font-size: 10px; 429 | font-weight: normal; 430 | text-transform: capitalize; 431 | padding-top: 0px; 432 | z-index: 1; 433 | color: @app-background-color; 434 | left: 0; 435 | } 436 | .headshot-system { 437 | position: absolute; 438 | width: 16px; 439 | height: 16px; 440 | border-radius: 3px; 441 | z-index: 2; 442 | left: 0; 443 | } 444 | } 445 | .kebab-vertical, 446 | .smiley { 447 | opacity: 0.5; 448 | margin-left: 2px; 449 | padding: 0 5px; 450 | } 451 | } 452 | .replies { 453 | // margin-top: 1px; 454 | } 455 | .post-details { 456 | padding: 5px 10px 10px 10px; 457 | } 458 | .code { 459 | margin: 5px 0 !important; 460 | } 461 | a { 462 | text-decoration: none; 463 | &:hover { 464 | text-decoration: underline; 465 | } 466 | } 467 | .info-wrapper { 468 | opacity: 0.5; 469 | position: absolute; 470 | right: 5px; 471 | bottom: 5px; 472 | } 473 | &.type-bookmark:not(.selected) { 474 | .contents > .body { 475 | padding-left: 28px !important; 476 | .author, 477 | .kebab-vertical-x { 478 | display: none; 479 | } 480 | .type-icon { 481 | margin-left: -23px; 482 | } 483 | p { 484 | margin: 0; 485 | display: inline; 486 | padding-left: 5px; 487 | } 488 | } 489 | } 490 | .pinned-replies { 491 | margin-top: 10px; 492 | } 493 | .pinned-reply { 494 | // padding: 10px 10px 3px 10px; 495 | // margin: 10px -10px 0 -10px; 496 | // width: calc(100% + 30px); 497 | // border-top: 1px solid @base-border-color; 498 | margin: 0 0 5px 0; 499 | .pinned-reply-body { 500 | opacity: 0.5; 501 | // see COMPUTATION below 502 | padding-left: 49px; 503 | margin-top: -18px; 504 | } 505 | .title p { 506 | margin: 0; 507 | } 508 | } 509 | &.type-bookmark:not(.selected) { 510 | .pinned-reply { 511 | margin-left: -24px; // COMPUTATION = 49-28 512 | } 513 | } 514 | .post + .post { 515 | // border-top: 1px solid @base-border-color; 516 | border: none; 517 | } 518 | .detail-icons { 519 | margin-top: 10px; 520 | color: @text-color; 521 | .detail-icon { 522 | opacity: 0.4; 523 | padding-right: 10px; 524 | cursor: pointer; 525 | user-select: none; 526 | &:hover { 527 | opacity: 1; 528 | } 529 | .icon { 530 | color: @text-color; 531 | } 532 | .octicon-comment { 533 | margin-top: 1px; 534 | } 535 | } 536 | .tag { 537 | // margin-top: 2px; 538 | cursor: pointer; 539 | margin-bottom: 0; 540 | &:last-of-type { 541 | margin-right: 10px; 542 | } 543 | &:hover { 544 | box-shadow: 0 0 2px white, 0 0 2px white, 0 0 2px white, 0 0 2px white, 0 0 2px white; 545 | } 546 | } 547 | // commented out since there's no real reason for hover state, as there's no click action 548 | // .headshot { 549 | // cursor: pointer; 550 | // border-radius: 3px; 551 | // &:hover { 552 | // box-shadow: 0 0 2px white, 0 0 2px white, 0 0 2px white, 0 0 2px white, 0 0 2px white; 553 | // } 554 | // } 555 | .assignees { 556 | padding-right: 5px; 557 | } 558 | } 559 | } 560 | .related-row { 561 | display: flex; 562 | .related { 563 | flex-grow: 1; 564 | margin-bottom: 0; 565 | } 566 | // this should match the margin-bottom of .related 567 | margin-bottom: 20px; 568 | } 569 | .related { 570 | margin: 20px 0; 571 | } 572 | .related.clickable-marker pre.code { 573 | // cursor: pointer; 574 | &:hover { 575 | // background: rgba(0, 0, 0, 0.2); 576 | } 577 | } 578 | .file-info { 579 | font-size: 11px; 580 | .monospace { 581 | white-space: nowrap; 582 | } 583 | .icon { 584 | vertical-align: 2px; 585 | } 586 | } 587 | &.live { 588 | // color: @text-color-info; 589 | .code.prettyprint { 590 | border: 1px solid @text-focus-border-color; 591 | } 592 | } 593 | .related-label, 594 | .posts-header { 595 | text-transform: uppercase; 596 | font-weight: 800; 597 | opacity: 0.7; 598 | color: var(--text-color-subtle); 599 | font-size: 11px; 600 | margin-bottom: 3px; 601 | // this is to show a text-variant DropdownButton 602 | // within a related-label 603 | button { 604 | font-weight: 800; 605 | font-size: 11px; 606 | text-transform: uppercase; 607 | color: var(--text-color-subtle); 608 | // color: var(--text-color-highlight); 609 | } 610 | .no-transform { 611 | text-transform: none; 612 | user-select: all; 613 | } 614 | } 615 | .posts-header { 616 | margin: 10px 0 -7px 10px; 617 | } 618 | .icon.pinned-reply-star { 619 | opacity: 0.6; 620 | margin: 0 6px 0 2px; 621 | } 622 | .no-codemarks-container { 623 | position: fixed; 624 | width: 100%; 625 | top: 50%; 626 | left: 0; 627 | transform: translateY(-50%); 628 | z-index: 0; 629 | } 630 | .no-codemarks { 631 | max-width: 30em; 632 | margin: 0 auto; 633 | color: @text-color-subtle; 634 | // text-align: center; 635 | font-size: 13px; 636 | padding: 0 20px; 637 | .keybindings { 638 | background-color: @base-background-color; 639 | padding: 10px; 640 | margin: 10px auto; 641 | // box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); 642 | .card; 643 | .function-row { 644 | padding: 5px 0; 645 | } 646 | } 647 | a { 648 | white-space: nowrap; 649 | } 650 | } 651 | 652 | .compose-title { 653 | .binding { 654 | float: right; 655 | white-space: nowrap; 656 | } 657 | } 658 | .codemark-faq { 659 | width: 70vw; 660 | color: @text-color-subtle; 661 | padding: 10px 10px 0 10px; // 0 on the bottom because the li has a margin-bottom of 10 662 | a { 663 | text-decoration: none; 664 | &:hover { 665 | text-decoration: underline; 666 | } 667 | } 668 | b { 669 | color: @text-color; 670 | } 671 | li { 672 | margin-bottom: 10px; 673 | } 674 | } 675 | 676 | // currently only used in CodemarkDetails 677 | .progress-container { 678 | width: 100%; 679 | display: flex; 680 | overflow: hidden; 681 | // margin-top: -2px; 682 | 683 | .progress-bar { 684 | background-color: transparent; 685 | height: 1px; 686 | width: 100%; 687 | } 688 | 689 | .progress-cursor { 690 | width: 25%; 691 | height: inherit; 692 | background-image: linear-gradient( 693 | to right, 694 | transparent 10%, 695 | var(--text-focus-border-color) 75%, 696 | transparent 90% 697 | ); 698 | animation: 1s ease infinite move-cursor; 699 | } 700 | } 701 | 702 | @keyframes move-cursor { 703 | from { 704 | transform: translateX(-100%); 705 | } 706 | to { 707 | transform: translateX(350%); 708 | } 709 | } 710 | .attachment { 711 | margin: 0 0 5px 0; 712 | display: flex; 713 | color: var(--text-color); 714 | > span { 715 | word-break: break-all; 716 | } 717 | > span:first-child { 718 | flex-grow: 0; 719 | flex-shrink: 0; 720 | margin-right: 5px; 721 | } 722 | > span:last-child { 723 | padding-left: 5px; 724 | margin-left: auto; 725 | .icon { 726 | margin-left: 5px; 727 | opacity: 0.4; 728 | } 729 | white-space: nowrap; 730 | } 731 | &:hover > span:last-child .icon { 732 | opacity: 1; 733 | } 734 | &.clickable { 735 | cursor: pointer; 736 | &:hover { 737 | color: var(--text-color-highlight); 738 | } 739 | } 740 | } 741 | .related-codemark { 742 | margin: 0 0 5px 0; 743 | cursor: pointer; 744 | &:hover { 745 | color: var(--text-color-info); 746 | } 747 | } 748 | .codestream a.external-link, 749 | .codestream a.internal-link { 750 | color: @text-color; 751 | overflow: hidden; 752 | white-space: nowrap; 753 | display: block; 754 | text-overflow: ellipsis; 755 | text-decoration: none; 756 | cursor: pointer; 757 | 758 | &:hover { 759 | color: @text-color-info; 760 | text-decoration: none !important; 761 | } 762 | .icon { 763 | margin-right: 5px; 764 | } 765 | } 766 | .internal-link { 767 | display: inline; 768 | } 769 | .codemark-file, 770 | .external-url { 771 | padding-left: 5px; 772 | opacity: 0.5; 773 | } 774 | .menu-selected { 775 | color: @text-color-info; 776 | font-weight: bold; 777 | } 778 | 779 | .codemark-view { 780 | z-index: 51; 781 | position: absolute; 782 | // tag: codemark-width 783 | padding: 45px 20px 80px 20px; 784 | top: 0; 785 | left: 0; 786 | bottom: 0; 787 | right: 0; 788 | overflow: auto; 789 | 790 | // this is the X cancel button 791 | .align-right-button { 792 | position: absolute !important; 793 | right: 20px; 794 | top: 10px; 795 | .icon { 796 | display: block !important; 797 | padding: 5px 8px 5px 8px !important; 798 | cursor: pointer; 799 | &:hover { 800 | color: var(--text-color-highlight); 801 | background-color: var(--base-background-color); 802 | } 803 | } 804 | } 805 | } 806 | 807 | form#inject-form, 808 | form#reposition-form { 809 | padding: 0 !important; 810 | button { 811 | padding-left: 10px; 812 | padding-right: 10px; 813 | } 814 | } 815 | #inject-form, 816 | #reposition-form { 817 | .form-body { 818 | padding: 0; 819 | min-width: 0; 820 | max-width: 100%; 821 | width: 100%; 822 | overflow: hidden; 823 | } 824 | .control-group { 825 | margin-bottom: 0 !important; 826 | max-width: 100%; 827 | } 828 | h4 { 829 | padding: 0; 830 | margin: 0; 831 | } 832 | .switch { 833 | margin: 0 5px 5px 0; 834 | vertical-align: -8px; 835 | } 836 | pre { 837 | margin-top: 0; 838 | margin-bottom: 0; 839 | max-width: 100%; 840 | overflow: auto; 841 | padding: 10px !important; 842 | } 843 | max-width: 100%; 844 | } 845 | #switches div { 846 | cursor: pointer; 847 | } 848 | .has-diff { 849 | position: absolute; 850 | right: 15px; 851 | bottom: 5px; 852 | .icon { 853 | color: @text-color-warning; 854 | } 855 | } 856 | .button-spread { 857 | display: flex; 858 | padding: 0 10px 5px 10px; 859 | > div { 860 | flex-grow: 1; 861 | } 862 | &.no-padding { 863 | padding: 0 0 5px 0; 864 | } 865 | } 866 | .resolve-button, 867 | .codemark-actions-button { 868 | border: 1px solid @base-border-color; 869 | padding: 2px 10px; 870 | // float: right; 871 | margin: -3px 5px 0 5px; 872 | cursor: pointer; 873 | color: @text-color; 874 | &:hover { 875 | color: var(--button-foreground-color); 876 | background: var(--button-background-color); 877 | border: 1px solid var(--button-background-color); 878 | } 879 | } 880 | .codemark-actions-button { 881 | margin: 0 0 5px 10px; 882 | float: right; 883 | } 884 | .reposition-dialog { 885 | position: absolute; 886 | top: 10%; 887 | z-index: 65; 888 | border: 1px solid @base-border-color; 889 | background: @base-background-color; 890 | box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); 891 | padding: 10px; 892 | width: auto; 893 | left: 0; 894 | right: 0; 895 | // top: 50%; 896 | // transform: translateY(-50%); 897 | } 898 | #reposition-blanket { 899 | z-index: 60; 900 | background: rgba(0, 0, 0, 0.25); 901 | position: absolute; 902 | top: 0; 903 | bottom: 0; 904 | left: 0; 905 | right: 0; 906 | } 907 | .striped-header { 908 | padding: 10px; 909 | background: repeating-linear-gradient( 910 | -45deg, 911 | transparent, 912 | transparent 5px, 913 | @base-background-color 5px, 914 | @base-background-color 10px 915 | ); 916 | border-bottom: 1px solid @base-border-color; 917 | } 918 | -------------------------------------------------------------------------------- /dist/webview/styles/color.less: -------------------------------------------------------------------------------- 1 | &.blue .type-icon, 2 | &.blue-color { 3 | color: #3578ba; 4 | } 5 | &.green .type-icon, 6 | &.green-color { 7 | color: #7aba5d; 8 | } 9 | &.yellow .type-icon, 10 | &.yellow-color { 11 | color: #edd648; 12 | } 13 | &.orange .type-icon, 14 | &.orange-color { 15 | color: #f1a340; 16 | } 17 | &.red .type-icon, 18 | &.red-color { 19 | color: #d9634f; 20 | } 21 | &.purple .type-icon, 22 | &.purple-color { 23 | color: #b87cda; 24 | } 25 | &.aqua .type-icon, 26 | &.aqua-color { 27 | color: #5abfdc; 28 | } 29 | &.gray .type-icon, 30 | &.gray-color { 31 | color: #888888; 32 | } 33 | &.blue-background { 34 | background-color: #3578ba; 35 | } 36 | &.green-background { 37 | background-color: #7aba5d; 38 | background-color: #24a100; 39 | } 40 | &.yellow-background { 41 | background-color: #edd648; 42 | } 43 | &.orange-background { 44 | background-color: #f1a340; 45 | } 46 | &.red-background { 47 | background-color: #d9634f; 48 | } 49 | &.purple-background { 50 | background-color: #b87cda; 51 | } 52 | &.pr-purple-background { 53 | background-color: #6f42c1; 54 | } 55 | &.aqua-background { 56 | background-color: #5abfdc; 57 | } 58 | &.gray-background { 59 | background-color: #888888; 60 | } 61 | &.blue-border { 62 | border-color: #3578ba !important; 63 | } 64 | &.green-border { 65 | border-color: #7aba5d !important; 66 | } 67 | &.yellow-border { 68 | border-color: #edd648 !important; 69 | } 70 | &.orange-border { 71 | border-color: #f1a340 !important; 72 | } 73 | &.red-border { 74 | border-color: #d9634f !important; 75 | } 76 | &.purple-border { 77 | border-color: #b87cda !important; 78 | } 79 | &.aqua-border { 80 | border-color: #5abfdc !important; 81 | } 82 | &.gray-border { 83 | border-color: #888888 !important; 84 | } 85 | .color-choices { 86 | padding-left: 5px; 87 | padding-top: 3px; 88 | display: inline-block; 89 | user-select: none; 90 | white-space: nowrap; 91 | .icon.chevron-down { 92 | display: inline-block; 93 | transform: scale(0.7); 94 | margin-left: 2px; 95 | } 96 | } 97 | .label-label { 98 | cursor: pointer; 99 | color: @text-color-highlight; 100 | } 101 | -------------------------------------------------------------------------------- /dist/webview/styles/error-page.less: -------------------------------------------------------------------------------- 1 | #oops { 2 | .onboarding-page(); 3 | } 4 | -------------------------------------------------------------------------------- /dist/webview/styles/feedback.less: -------------------------------------------------------------------------------- 1 | .feedback-popup { 2 | position: fixed; 3 | bottom: 7px; 4 | right: 10px; 5 | z-index: 18; 6 | font-size: 15px; 7 | .icon { 8 | opacity: 0.6; 9 | } 10 | .octicon { 11 | vertical-align: text-bottom !important; 12 | } 13 | h2, 14 | h4 { 15 | font-weight: normal; 16 | margin: 0; 17 | padding: 0; 18 | } 19 | h2 { 20 | margin-bottom: 15px; 21 | } 22 | .emotion { 23 | margin-top: 10px; 24 | margin-bottom: 30px; 25 | .icon { 26 | display: inline-block; 27 | transform: scale(1.5); 28 | cursor: pointer; 29 | color: #fc0; 30 | border: 1px solid transparent; 31 | opacity: 1; 32 | line-height: 16px; 33 | margin-right: 8px; 34 | margin-left: 8px; 35 | } 36 | 37 | .icon.selected { 38 | border: 1px solid @text-color-info; 39 | } 40 | } 41 | .dialog { 42 | box-sizing: border-box; 43 | box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); 44 | border: 1px solid @base-border-color; 45 | background: @app-background-color; 46 | height: auto; 47 | max-width: 500px; 48 | position: relative; 49 | z-index: 5000; 50 | .input-text { 51 | margin-bottom: 5px; 52 | } 53 | .align-right-button { 54 | position: absolute; 55 | cursor: pointer; 56 | right: 5px; 57 | top: 10px; 58 | } 59 | } 60 | .input-text { 61 | margin-bottom: 20px !important; 62 | font-size: 15px !important; 63 | padding: 5px; 64 | background: @base-background-color; 65 | color: @text-color; 66 | border: 1px solid @base-background-color; 67 | min-height: 60px; 68 | } 69 | button { 70 | float: right; 71 | font-size: 13px !important; 72 | .icon { 73 | display: inline-block; 74 | transform: scale(1.25); 75 | margin-right: 8px; 76 | opacity: 1; 77 | padding: 0; 78 | } 79 | &:disabled { 80 | opacity: 0.4; 81 | } 82 | } 83 | .contact-us { 84 | float: right; 85 | background: @base-background-color; 86 | padding: 10px; 87 | margin: 0 0 10px 10px; 88 | font-size: 13px; 89 | } 90 | .happy-icon { 91 | float: right; 92 | } 93 | .warn { 94 | color: @text-color-warning; 95 | } 96 | a { 97 | text-decoration: none; 98 | &:hover { 99 | text-decoration: underline; 100 | } 101 | } 102 | .show-smiley { 103 | margin-top: 10px; 104 | // the 110px leaves room for the Tweet button 105 | max-width: calc(~"100% - 110px"); 106 | #show-smiley-checkbox { 107 | margin-left: -20px; 108 | } 109 | label { 110 | display: block; 111 | float: left; 112 | margin-left: 20px !important; 113 | } 114 | } 115 | } 116 | 117 | .vscode-light .happy-icon { 118 | opacity: 0.5; 119 | } 120 | -------------------------------------------------------------------------------- /dist/webview/styles/inline.less: -------------------------------------------------------------------------------- 1 | .spatial-list .codemark-container { 2 | margin-bottom: 20px; 3 | // tag: codemark-width 4 | padding: 0; 5 | } 6 | 7 | .knowledge-panel .codemark-container { 8 | margin-top: 20px; 9 | margin-bottom: 20px; 10 | } 11 | 12 | .card { 13 | box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); 14 | background-color: @base-background-color; 15 | border: 1px solid @base-border-color; 16 | 17 | .vscode-light & { 18 | box-shadow: 0 2px 5px rgba(0, 0, 0, 0.08); 19 | } 20 | } 21 | 22 | .plane-container { 23 | position: absolute; 24 | width: 100%; 25 | transition: transform 20ms, margin-top 20ms; 26 | will-change: transform; 27 | // tag: codemark-width 28 | padding: 0 20px 0 20px; 29 | z-index: 2; // one above the