Squashed initial commit

This commit is contained in:
2024-09-10 13:47:29 -04:00
commit 8ebb6ad265
6221 changed files with 2512206 additions and 0 deletions

5
.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
.old/
centos-upgrade-plan.txt
qhtcp-workflow/out/
qhtcp-workflow/scans/
last.dump.rda

355
.old/script-install-motd Executable file
View File

@@ -0,0 +1,355 @@
#!/usr/bin/env bash
# Install motd scripts
# Bryan C. Roessler
parent="${BASH_SOURCE[0]}"
parent=${parent%/*}
[[ -f "$parent"/script-functions ]] && . "$parent"/script-functions || exit 1
is_root
DEBUG=0
[[ "$#" -gt 0 ]] && echo "Debug on" && DEBUG=1
installdir="/usr/local/bin"
[[ -d "$installdir" ]] || mkdir -p "$installdir"
if (( DEBUG )); then
script="generate-motd.sh"
else
script="$installdir/generate-motd.sh"
fi
cat <<- 'EOF' > "$script"
#!/usr/bin/env bash
echo -n '
_ _ _ _ _
| | | | | | | | | |
| |__| | __ _ _ __| |_ _ __ ___ __ _ _ __ | | __ _| |__
| __ |/ _` | `__| __| `_ ` _ \ / _` | `_ \ | | / _` | `_ \
| | | | (_| | | | |_| | | | | | (_| | | | | | |___| (_| | |_) |
|_| |_|\__,_|_| \__|_| |_| |_|\__,_|_| |_| |______\__,_|_.__/
'
EOF
# System info
cat <<- 'EOF' >> "$script"
# get load averages
IFS=" " read LOAD1 LOAD5 LOAD15 <<<$(cat /proc/loadavg | awk '{ print $1,$2,$3 }')
# get free memory
IFS=" " read USED AVAIL TOTAL <<<$(free -htm | grep "Mem" | awk {'print $3,$7,$2'})
# get processes
PROCESS=`ps -eo user=|sort|uniq -c | awk '{ print $2 " " $1 }'`
PROCESS_ALL=`echo "$PROCESS"| awk {'print $2'} | awk '{ SUM += $1} END { print SUM }'`
PROCESS_ROOT=`echo "$PROCESS"| grep root | awk {'print $2'}`
PROCESS_USER=`echo "$PROCESS"| grep -v root | awk {'print $2'} | awk '{ SUM += $1} END { print SUM }'`
# get processors
PROCESSOR_NAME=`grep "model name" /proc/cpuinfo | cut -d ' ' -f3- | awk {'print $0'} | head -1`
PROCESSOR_COUNT=`grep -ioP 'processor\t:' /proc/cpuinfo | wc -l`
W="\e[0;39m"
G="\e[1;32m"
echo -e "
$W Distro......: $W`cat /etc/*release | grep "PRETTY_NAME" | cut -d "=" -f 2- | sed 's/"//g'`
$W Kernel......: $W`uname -sr`
$W Uptime......: $W`uptime -p`
$W Load........: $G$LOAD1$W (1m), $G$LOAD5$W (5m), $G$LOAD15$W (15m)
$W Processes...: $W$G$PROCESS_ROOT$W (root), $G$PROCESS_USER$W (user), $G$PROCESS_ALL$W (total)
$W CPU.........: $W$PROCESSOR_NAME ($G$PROCESSOR_COUNT$W vCPU)
$W Memory......: $G$USED$W used, $G$AVAIL$W avail, $G$TOTAL$W total$W"
EOF
# Disk usage
cat <<- 'EOF' >> "$script"
# config
max_usage=90
bar_width=50
# colors
white="\e[39m"
green="\e[1;32m"
red="\e[1;31m"
dim="\e[2m"
undim="\e[0m"
# disk usage: ignore zfs, squashfs & tmpfs
while IFS= read -r line; do dfs+=("$line"); done < <(df -H -x zfs -x squashfs -x tmpfs -x devtmpfs -x overlay --output=target,pcent,size | tail -n+2)
printf "\nDisk usage\n"
for line in "${dfs[@]}"; do
# get disk usage
usage=$(echo "$line" | awk '{print $2}' | sed 's/%//')
used_width=$((($usage*$bar_width)/100))
# color is green if usage < max_usage, else red
if [ "${usage}" -ge "${max_usage}" ]; then
color=$red
else
color=$green
fi
# print green/red bar until used_width
bar="[${color}"
for ((i=0; i<$used_width; i++)); do
bar+="="
done
# print dimmmed bar until end
bar+="${white}${dim}"
for ((i=$used_width; i<$bar_width; i++)); do
bar+="="
done
bar+="${undim}]"
# print usage line & bar
echo "${line}" | awk '{ printf("%-31s%+3s used out of %+4s\n", $1, $2, $3); }' | sed -e 's/^/ /'
echo -e "${bar}" | sed -e 's/^/ /'
done
EOF
# # Disk health
# cat <<- 'EOF' >> "$script"
# # config
# MAX_TEMP=40
# # set column width
# COLUMNS=2
# # colors
# white="\e[39m"
# green="\e[1;32m"
# red="\e[1;31m"
# dim="\e[2m"
# undim="\e[0m"
# # disks to check
# disks=(sda sdb sdc sdd sde sdf sdg sdi)
# disknames=(sda sdb sdc sdd sde sdf sdg sdi)
# # hddtemp
# hddtemp_host=localhost
# hddtemp_port=7634
# # logfiles to check
# logfiles='/var/log/syslog /var/log/syslog.1'
# # get all lines with smartd entries from syslog
# lines=$(tac $logfiles | grep -hiP 'smartd\[[[:digit:]]+\]:' | grep -iP "previous self-test")
# # use nc to query temps from hddtemp daemon
# hddtemp=$(timeout 0.01 nc $hddtemp_host $hddtemp_port | sed 's/|//m' | sed 's/||/ \n/g')
# out=""
# for i in "${!disks[@]}"; do
# disk=${disks[$i]}
# # use disknames if given
# diskname=${disknames[$i]}
# if [ -z "${diskname}" ]; then
# diskname=$disk
# fi
# uuid=$(blkid -s UUID -o value "/dev/${disk}")
# status=$( (grep "${uuid}" <<< "${lines}") | grep -m 1 -oP "previous self-test.*" | awk '{ print $4 " " $5 }')
# temp=$( (grep "${disk}" <<< "${hddtemp}") | awk -F'|' '{ print $3 }')
# # color green if temp <= MAX_TEMP, else red
# if [[ "${temp}" -gt "${MAX_TEMP}" ]]; then
# color=$red
# else
# color=$green
# fi
# # add "C" if temp is numeric
# if [[ "$temp" =~ ^[0-9]+$ ]]; then
# temp="${temp}C"
# fi
# # color green if status is "without error", else red
# if [[ "${status}" == "without error" ]]; then
# status_color=$green
# else
# status_color=$red
# fi
# # print temp & smartd error
# out+="${diskname}:,${color}${temp}${undim} | ${status_color}${status}${undim},"
# # insert \n every $COLUMNS column
# if [ $((($i+1) % $COLUMNS)) -eq 0 ]; then
# out+="\n"
# fi
# done
# out+="\n"
# printf "\ndisk status:\n"
# printf "$out" | column -ts $',' | sed -e 's/^/ /'
# EOF
# Services
cat <<- 'EOF' >> "$script"
# set column width
COLUMNS=2
# colors
green="\e[1;32m"
red="\e[1;31m"
undim="\e[0m"
services=("fail2ban" "firewalld" "nmb" "motion" "btrfs-balance.timer" "btrfs-scrub.timer" "smb" "backup.timer" "btrbk.timer" "fstrim.timer" "dnf-automatic.timer" "smartd" "cockpit.socket" "generate-motd.timer")
# sort services
IFS=$'\n' services=($(sort <<<"${services[*]}"))
unset IFS
service_status=()
# get status of all services
for service in "${services[@]}"; do
service_status+=($(systemctl is-active "$service"))
done
out=""
for i in ${!services[@]}; do
# color green if service is active, else red
if [[ "${service_status[$i]}" == "active" ]]; then
out+="${services[$i]}:,${green}${service_status[$i]}${undim},"
else
out+="${services[$i]}:,${red}${service_status[$i]}${undim},"
fi
# insert \n every $COLUMNS column
if [ $((($i+1) % $COLUMNS)) -eq 0 ]; then
out+="\n"
fi
done
out+="\n"
printf "\nServices\n"
printf "$out" | column -ts $',' | sed -e 's/^/ /'
EOF
# Fail2Ban
cat <<- 'EOF' >> "$script"
# fail2ban-client status to get all jails, takes about ~70ms
jails=($(fail2ban-client status | grep "Jail list:" | sed "s/ //g" | awk '{split($2,a,",");for(i in a) print a[i]}'))
out="jail,failed,total,banned,total\n"
for jail in ${jails[@]}; do
# slow because fail2ban-client has to be called for every jail (~70ms per jail)
status=$(fail2ban-client status ${jail})
failed=$(echo "$status" | grep -ioP '(?<=Currently failed:\t)[[:digit:]]+')
totalfailed=$(echo "$status" | grep -ioP '(?<=Total failed:\t)[[:digit:]]+')
banned=$(echo "$status" | grep -ioP '(?<=Currently banned:\t)[[:digit:]]+')
totalbanned=$(echo "$status" | grep -ioP '(?<=Total banned:\t)[[:digit:]]+')
out+="$jail,$failed,$totalfailed,$banned,$totalbanned\n"
done
printf "\nfail2ban status\n"
printf $out | column -ts $',' | sed -e 's/^/ /'
EOF
# Help links
cat <<- 'EOF' >> "$script"
echo "\
Links (ctrl+click to follow)
Server Manual.........: https://tinyurl.com/jjz9h6fr
Cockpit (for admins)..: http://localhost:9090
Robot Camera..........: http://localhost:9999
JupyterLab............: http://localhost:8888
RStudio Server........: http://localhost:8787
Robot Computer........: vnc://192.168.16.101:5900
Windows 10 VM.........: vnc://localhost:5900 (pw: hartman)
"
EOF
# Scheduled reboot
cat <<- "EOF" >> "$script"
if systemctl is-active scheduled-reboot.timer &>/dev/null; then
echo -n "Next scheduled reboot: "
time=$(systemctl cat scheduled-reboot.timer | grep OnCalendar=)
time=${time#*=}
echo "$time"
fi
EOF
# cat <<- 'EOF' > "$script"
# #!/usr/bin/env bash
# [[ -v NO_MOTD ]] && exit 0
# USER=$(whoami)
# HOSTNAME=$(uname -n)
# ARRAY=$(df -Ph | grep array | awk '{print $4}' | tr -d '\n')
# ROOT=$(df -Ph | grep sdb3 | awk '{print $4}' | tr -d '\n')
# BACKUP=$(df -Ph | grep backup | awk '{print $4}' | tr -d '\n')
# MEMUSED=$(free -t -m | grep "Mem:" | awk '{print $3" MB";}')
# MEMTOTAL=$(free -t -m | grep "Mem:" | awk '{print $2" MB";}')
# PSA=$(ps -Afl | wc -l)
# SWAPMEM=$(free -m | tail -n 1 | awk '{print $3}')
# #System uptime
# uptime=$(cut -f1 -d. /proc/uptime)
# upDays=$((uptime/60/60/24))
# upHours=$((uptime/60/60%24))
# upMins=$((uptime/60%60))
# upSecs=$((uptime%60))
# #System load
# LOAD1=$(awk {'print $1'} /proc/loadavg)
# LOAD5=$(awk {'print $2'} /proc/loadavg)
# LOAD15=$(awk {'print $3'} /proc/loadavg)
# echo "
# ===========================================================================
# - Hostname............: $HOSTNAME
# - Release.............: $(cat /etc/redhat-release)
# - Users...............: Currently $(users | wc -w) user(s) logged on
# ===========================================================================
# - Current user........: $USER
# - CPU usage...........: $LOAD1, $LOAD5, $LOAD15 (1, 5, 15 min)
# - Memory used.........: $MEMUSED / $MEMTOTAL
# - Processes...........: $PSA running
# - System uptime.......: $upDays days $upHours hours $upMins minutes $upSecs seconds
# - Disk space HOME|ROOT: $ROOT remaining
# - Disk space ARRAY....: $ARRAY remaining
# - Disk space BACKUP...: $BACKUP remaining
# ===========================================================================
# "
# EOF
generate-services() {
service="/usr/lib/systemd/system/generate-motd.service"
timer="/usr/lib/systemd/system/generate-motd.timer"
cat <<-EOF > "$service"
[Unit]
Description=Generate MoTD
[Service]
Type=simple
ExecStart=/usr/bin/bash -c '$script > /etc/motd'
[Install]
WantedBy=default.target
EOF
cat <<-'EOF' > "$timer"
[Unit]
Description=Generate MoTD every minute on a timer
[Timer]
OnCalendar=*:0/1
OnBootSec=10s
[Install]
WantedBy=timers.target
EOF
}
chmod +x "$script"
if (( DEBUG )); then
bash generate-motd.sh
cat -n generate-motd.sh
rm generate-motd.sh
else
generate-services && \
systemctl daemon-reload && \
systemctl enable --now generate-motd.timer
fi
exit $?

27
.old/script-install-motd.bk Executable file
View File

@@ -0,0 +1,27 @@
#!/usr/bin/env bash
# Install motd scripts
[[ -f functions ]] && . functions || exit 1
is_root
scripts=("10-hostname-color" "20-sysinfo" "35-diskspace" "36-diskstatus" "40-services" "50-fail2ban")
git clone "https://github.com/yboetz/motd.git"
systemdir="/etc/update-mot.d"
[[ ! -d "$systemdir" ]] && mkdir -p "$systemdir"
cd motd || exit $?
for script in "${scripts[@]}"; do
echo "$script"
cp "$script" "$systemdir"
done
cd ..
rm -rf motd
exit 0

10
.old/set-subuid-subgid Executable file
View File

@@ -0,0 +1,10 @@
#!/usr/bin/env bash
users=$(for s in /home/*; do echo "${s##*/}"; done)
subuid_start=100000
incr=65536
for user in ${users[@]}; do
uid=$(id -u "$user")
echo "$user:$subuid_start:$incr" >> /etc/subuid
echo "$user:$subuid_start:$incr" >> /etc/subgid
subuid_start=$((subuid_start + 100000))
done

72
LICENSE Normal file
View File

@@ -0,0 +1,72 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

1
README.md Normal file
View File

@@ -0,0 +1 @@
# RHEL Management Scripts

9
qhtcp-workflow/.lintr Normal file
View File

@@ -0,0 +1,9 @@
linters: linters_with_defaults(
object_name_linter = NULL,
object_usage_linter = NULL,
commented_code_linter = NULL,
trailing_whitespace_linter(allow_empty_lines = TRUE),
indentation_linter = NULL,
line_length_linter = line_length_linter(140)
)
encoding: "UTF-8"

34
qhtcp-workflow/.vscode/extensions.json vendored Normal file
View File

@@ -0,0 +1,34 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations.
// Extension identifier format: ${publisher}.${name}. Example: vscode.csharp
// List of extensions which should be recommended for users of this workspace.
"recommendations": [
"bierner.markdown-preview-github-styles",
"davidanson.vscode-markdownlint",
"dbaeumer.vscode-eslint",
"eamodio.gitlens",
"github.remotehub",
"github.vscode-pull-request-github",
"koppt.vscode-view-in-browser",
"mathworks.language-matlab",
"ms-python.debugpy",
"ms-python.python",
"ms-python.vscode-pylance",
"ms-vscode-remote.remote-ssh",
"ms-vscode.remote-explorer",
"ms-vscode.remote-repositories",
"redhat.java",
"redhat.vscode-yaml",
"reditorsupport.r",
"rogalmic.bash-debug",
"streetsidesoftware.code-spell-checker",
"timonwong.shellcheck",
"yzhang.markdown-all-in-one"
],
// List of extensions recommended by VS Code that should not be recommended for users of this workspace.
"unwantedRecommendations": [
]
}

50
qhtcp-workflow/.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,50 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "R-Debugger",
"request": "attach",
"name": "Attach to R process",
"splitOverwrittenOutput": true
},
{
"type": "R-Debugger",
"name": "Launch R-Workspace",
"request": "launch",
"debugMode": "workspace",
"workingDirectory": "${workspaceFolder}"
},
{
"type": "R-Debugger",
"name": "Debug R-File",
"request": "launch",
"debugMode": "file",
"workingDirectory": "${fileFolder}",
"file": "${file}",
},
{
"type": "R-Debugger",
"name": "Debug R-Function",
"request": "launch",
"debugMode": "function",
"workingDirectory": "${workspaceFolder}",
"file": "${file}",
"mainFunction": "main",
"allowGlobalDebugging": false
},
{
"type": "R-Debugger",
"name": "Debug R-Package",
"request": "launch",
"debugMode": "workspace",
"workingDirectory": "${workspaceFolder}",
"includePackageScopes": true,
"loadPackages": [
"."
]
}
]
}

963
qhtcp-workflow/README.md Normal file
View File

@@ -0,0 +1,963 @@
# Hartman Lab QHTCP Workflow
An opinionated yet flexible QHTCP analysis framework for the Hartman Lab.
## Overview
See the [User Input](#user-input) section for getting started.
Insert a general description of Q-HTCP and the Q-HTCP process here.
## Index
* [parse_input](#parseinput)
* [install_dependencies](#installdependencies)
* [init_project](#initproject)
* [easy](#easy)
* [ezview](#ezview)
* [qhtcp](#qhtcp)
* [remc](#remc)
* [gtf](#gtf)
* [gta](#gta)
* [r_gta](#rgta)
* [r_gta_pairwiselk](#rgtapairwiselk)
* [r_gta_heatmaps](#rgtaheatmaps)
* [r_interactions](#rinteractions)
* [r_join_interactions](#rjoininteractions)
* [java_extract](#javaextract)
* [r_add_shift_values](#raddshiftvalues)
* [r_create_heat_maps](#rcreateheatmaps)
* [r_heat_maps_homology](#rheatmapshomology)
* [py_gtf_dcon](#pygtfdcon)
* [pl_gtf_analyze](#plgtfanalyze)
* [pl_gtf_terms2tsv](#plgtfterms2tsv)
* [py_gtf_concat](#pygtfconcat)
* [r_compile_gtf](#rcompilegtf)
* [study_info](#studyinfo)
* [choose_easy_results](#chooseeasyresults)
## Notes
### TODO
* Variable scoping is horrible right now
* I wrote this sequentially and tried to keep track the best I could
* Local vars have a higher likelihood of being lower case, global vars are UPPER
* See MODULE specific TODOs below
### General guidelines for writing external scripts
* External scripts must be modular enough to handle input and output from multiple directories
* Don't cd in scripts (if you must, do it in a subshell!)
* Pass variables
* Pass options
* Pass arguments
## Project layout
&nbsp;&nbsp;**qhtcp-workflow/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;**scans/**
* This directory contains raw image data and image analysis results for the entire collection of Q-HTCP experiments.
* Subdirectories within "scans" should represent a single Q-HTCP study and be named using the following convention: yyymmdd_username_experimentDescription
* Each subdirectory contains the Raw Image Folders for that study.
* Each Raw Image Folder contains a series of N folders with successive integer labels 1 to N, each folder containing the time series of images for a single cell array.
* It also contains a user-supplied subfolder, which must be named "MasterPlateFiles" and must contain two excel files, one named 'DrugMedia_experimentDescription' and the other named 'MasterPlate_experimentDescription'.
* If the standard MasterPlate_Template file is being used, it's not needed to customize then name.
* If the template is modified, it is recommended to rename it and describe accordingly - a useful convention is to use the same experimentDescription for the MP files as given to the experiment
* The 'MasterPlate_' file contain associated cell array information (culture IDs for all of the cell arrays in the experiment) while the 'DrugMedia_' file contains information about the media that the cell array is printed to.
* Together they encapsulate and define the experimental design.
* The QHTCPImageFolders and 'MasterPlateFiles' folder are the inputs for image analysis with EASY software.
* As further described below, EASY will automatically generate a 'Results' directory (within the ExpJobs/'ExperimentJob' folder) with a name that consists of a system-generated timestamp and an optional short description provided by the user (Fig.2). The 'Results' directory is created and entered, using the "File >> New Experiment" dropdown in EASY. Multiple 'Results' files may be created (and uniquely named) within an 'ExperimentJob' folder.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;**apps/easy/**
* This directory contains the GUI-enabled MATLAB software to accomplish image analysis and growth curve fitting.
* EASY analyzes Q-HTCP image data within an 'ExperimentJob'' folder (described above; each cell array has its own folder containing its entire time series of images).
* EASY analysis produces image quantification data and growth curve fitting results for each cell array; these results are subsequently assembled into a single file and labeled, using information contained in the 'MasterPlate_' and 'DrugMedia_' files in the 'MasterPlateFiles' subdirectory.
* The final files (named '!!ResultsStd_.txt' or '!!ResultsELr_.txt') are produced in a subdirectory that EASY creates within the 'ExpJob#' folder, named '/ResultsTimeStampDesc/PrintResults' (Fig. 2).
* The /EASY directory is simply where the latest EASY version resides (additional versions in development or legacy versions may also be stored there).
* The raw data inputs and result outputs for EASY are kept in the 'ExpJobs' directory.
* EASY also outputs a '.mat' file that is stored in the 'matResults' folder and is named with the TimeStamp and user-provided name appended to the 'Results' folder name when 'New Experiment' is executed from the 'File' Dropdown menu in the EASY console.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;**apps/ezview/**
* This directory contains the GUI-enabled MATLAB software to conveniently and efficiently mine the raw cell array image data for a Q-HTCP experiment.
* It takes the Results.m file (created by EASY software) as an input and permits the user to navigate through the raw image data and growth curve results for the experiment.
* The /EZview provides a place for storing the the latest EZview version (as well as other EZview versions).
* The /EZview provides a GUI for examining the EASY results as provided in the …/matResults/… .mat file.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;**Master Plates**
* This optional folder is a convenient place to store copies of the 'MasterPlate_' and a 'DrugMedia_' file templates, along with previously used files that may have been modified and could be reused or further modified to enable future analyses.
* These two file types are required in the 'MasterPlateFiles' folder, which catalogs experimental information specific to individual Jobs in the ExpJobs folder, as described further below.
### parse_input
`--project`, `--module`, `--nomodule`, and `--wrapper` can be passed multiple times or with a comma-separated string
#### Options
* **-p\<value\>** | **--project=\<value\>**
One or more projects to analyze, can be passed multiple times or with a comma-separated string
* **-m\<value\>** | **--module=\<value\>**
One or more modules to run (default: all), can be passed multiple times or with a comma-separated string
* **-w\<value\>** | **--wrapper=\<value\>**
Requires two arguments: the name of the wrapper and its arguments, can be passed multiple times
* **-n\<value\>** | **--nomodule=\<value\>**
One or more modules (default: none) to exclude from the analysis
* **--markdown**
Generate the shdoc markdown file for this program
* **-y** | **--yes** | **--auto**
Assume yes answer to all questions (non-interactive mode)
* **-d** | **--debug**
Turn on extra debugging output
* **-h** | **--help**
Print help message and exit (overrides other options)
#### Variables set
* **PROJECTS** (array): List of projects to cycle through
* **MODULES** (array): List of modules to run on each project
* **WRAPPERS** (array): List of wrappers and their arguments to run on each project
* **EXCLUDE_MODULES** (array): List of modules not to run on each project
* **DEBUG** (int): Turn debugging on
* **YES** (int): Turn assume yes on
## Modules
A module contains a cohesive set of actions/experiments to run on a project
Use a module to:
* Build a new type of analysis from scratch
* Generate project directories
* Group multiple wrappers (and modules) into a larger task
* Dictate the ordering of multiple wrappers
* Competently handle pushd and popd for their wrappers if they do not reside in the SCANS/PROJECT_DIR
* Call their wrappers with the appropriate arguments
### install_dependencies
This module will automatically install the dependencies for running QHTCP.
If you wish to install them manually, you can use the following information to do so:
#### System dependencies
* R
* Perl
* Java
* MATLAB
#### MacOS
* `export HOMEBREW_BREW_GIT_REMOTE=https://github.com/Homebrew/brew`
* `/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"`
* `cpan File::Map ExtUtils::PkgConfig GD GO::TermFinder`
* `brew install graphiz gd pdftk-java pandoc shdoc nano rsync coreutils`
#### Linux DEB
* `apt install graphviz pandoc pdftk-java libgd-dev perl shdoc nano rsync coreutils libcurl-dev openssl-dev`
#### Linux RPM
* `dnf install graphviz pandoc pdftk-java gd-devel perl-CPAN shdoc nano rsync coreutils libcurl-devel openssl-devel`
#### Perl
* `cpan -I -i File::Map ExtUtils::PkgConfig GD GO::TermFinder`
#### R
* `install.packages(c('BiocManager', 'ontologyIndex', 'ggrepel', 'tidyverse', 'sos', 'openxlsx', 'ggplot2', 'plyr', 'extrafont', 'gridExtra', 'gplots', 'stringr', 'plotly', 'ggthemes', 'pandoc', 'rmarkdown', 'plotly', 'htmlwidgets'), dep=TRUE)`
* `BiocManager::install('UCSC.utils')`
* `BiocManager::install('org.Sc.sgd.db')`
### init_project
This function creates and initializes project directories
This module:
* Initializes a project directory in the scans directory
:bulb: **TODO**
* Copy over source image directories from robot
* MasterPlate_ file **should not be an xlsx file**, no portability
* We can keep the existing xlsx code for old style fallback
* But moving forward should switch to csv or something open
* Do we need to sync a QHTCP template?
:memo: **NOTES**
* Copy over the images from the robot and then DO NOT TOUCH that directory except to copy from it
* Write-protect (read-only) if we need to
* Copy data from scans/images directory to the project working dir and then begin analysis
* You may think...but doesn't that 2x data?
* No, btrfs subvolume uses reflinks, only data that is altered will be duplicated
* Most of the data are static images that are not written to, so the data is deduplicated
### easy
Run the EASY matlab program
INPUT FILES
* MasterPlate_.xls
* DrugMedia_.xls
OUTPUT FILES
* !!ResultsStd_.txt
* !!ResultsELr_.txt
TODO
* Don't create output in the scans folder, put it in an output directory
* The !!Results output files need standardized naming
* The input MasterPlate and DrugMedia sheets need to be converted to something standard like csv/tsv
* This would allow them to be created programmatically as well
NOTES
* I've modularized EASY to fit into this workflow but there may be things broken (especially in "stand-alone" mode)
* The scans/images and 'MasterPlateFiles' folder are the inputs for image analysis with EASY software.
* EASY will automatically generate a 'Results' directory (within the ExpJobs/'ExperimentJob' folder) w/ timestamp and an optional short description provided by the user (Fig.2).
* The 'Results' directory is created and entered, using the "File >> New Experiment" dropdown in EASY.
* Multiple 'Results' files may be created (and uniquely named) within an 'ExperimentJob' folder.
INSTRUCTIONS
* This program should handle the relevant directory and file creation and load the correct project into EASY
#### Pin-tool mapping
* Select at least two images from your experiment (or another experiment) to place in a 'PTmapFiles' folder.
* Sometimes an experiment doesn't have a complete set of quality spots for producing a pin tool map that will be used to start the spot search process.
* In this case the folder for Master Plate 1 (MP 1) is almost good but has a slight problem.
* At P13 the spot is extended. We might use this one but would like to include others that are more centered if possible.
* The other plates with higher drug concentrations could be used, but since a recent experiment has a better reference plate image, we will add it to the set of images to produce the pin tool map.
![Bad Pin Map](docs/imgs/easy/1-bad-pin-map.png "See the problem in Column 1, Row 13?")
* We will find a good image from another experiment
![Good Pin Map](docs/imgs/easy/2-good-pin-map.png "Nice pin map")
* We now have some images to generate a composite centered map for EASY to search and find the nucleation area of each spot as it forms.
* Click the Run menu tab.
* A drop down list of options is presented.
* Click the first item → [Plate Map Pintool ].
![Open PTmaps](docs/imgs/easy/3-open-ptmaps-dir.png "Where to find PTmaps")
* Open the PTmapFiles folder.
* Then click on the .bmp files you wish to include to make the pin tool map.
* Click the Open button.
![Open BMPs](docs/imgs/easy/4-select-bmps.png "Open BMPs")
* A warning dialog box may appear.
* This is nothing to be concerned about.
* Click OK and continue.
![Direct Map](docs/imgs/easy/5-direct-map.png "Map view, very pretty")
* 'Retry' takes you back so that to can select a different .bmp files from which to create the map from.
* In this case the spots from the two images are well aligned and give coverage to all the spots therefore we do not have to add new images.
* Remember, this map is just a good guess as to where to start looking for each spot not where it will focus to capture intensities.
* Click 'Open' again.
![Open BMPs](docs/imgs/easy/4-select-bmps.png "Open BMPs")
* We can now shift these values to get a better 'hard' start for this search.
* Maybe we can move this search point to the left a bit by decreasing the 'Initial Col Position' slightly to 120 and clicking continue.
![Open BMPs](docs/imgs/easy/6-shift-values.png "Open BMPs")
* Even though the first result image using 126 may have given a good map, we will use the improve second initiation point by clicking the 'Continue/Finish' button.
![Shifted map](docs/imgs/easy/7-shifted-map.png "See the dots are redder and centered")
* Note that the red “hot” spot is now well centered in each composite image spot.
* We can now click 'Continue / Finish' to proceed.
* The coordinates and parameters will be stored in the results folder 'PTmats'.
* This is where the .mat files which contain localization data for use in the next section of our work.
* The EASY GUI will come back.
* Now click the 'Run' → 'Image Curve ComboAnalysi'.
* This will perform the image quantification and then generate the curve fits for each plate selected.
* Typically we pick only one plate at a time for one or two master plates.
* The software will present the final image of the search if only 1 master plate is selected.
* If multiple plates are selected, no search images will be presented or stored as figures.
* However all the position data for every spot at every time point will be stored.
* This large data trove is used by EZview to produce the image click-on hot spot maps and the photo strips.
![Curve analysis](docs/imgs/easy/8-curve-analysis.png "Curve analysis")
* Note the 'Select Files' dialog.
* It allow the user to select the specific .bmp files to use.
* This can be useful if there are bad ones that need to be removed from the folder due to contamination.
* If all are good we can select them all and click 'Open' to run the process.
* There are other parameters that can be selected.
* For now we will continue and come back to those later.
![Select all BMPs](docs/imgs/easy/9-select-all-dialog.png "Select all BMPs")
![Contamination view](docs/imgs/easy/10-contamination-view.png "Contamination view")
* The search focus of each spot at the end of the run is presented for examination
* Notice that these have floated and locked in to a position determined on the fly to a point where the initial growth has exceed has reach a point of maturity.
* This prevents a jump to a late onset jump to a contamination site.
* If we found that we need to adjust our pin tool map or make other modifications, we can do that and rerun these single runs until we are satisfied.
![Search focus](docs/imgs/easy/11-search-focus.png "Search focus")
* Next we will run the entire experiment by clicking on all the other master plates from the list box.
![Run experiment](docs/imgs/easy/12-run-experiment.png "Run experiment")
* Depending on the number of master plates and the number of time point images taken for each, this next step can take a while.
* Click continue and do something else while the computer works.
* When the work is complete the EASY GUI will reappear without the master plate list.
* Now look in the /Results* /PrintResults folder to check that all the plates have run and produced data.
![Experiment complete](docs/imgs/easy/13-complete-experiment.png "Complete experiment")
* This is a legacy print copy of data, but is still useful to check that all the quantification was completed successfully.
![Check results](docs/imgs/easy/14-check-results.png "Check results")
#### Generate Reports
* Generate a MPDM.mat file from the Excel master plate and drug media sheets that the user prepared as part of the experiment preparation.
* These sheets must conform to certain format rules.
* It is best when creating these to use a working copy as a template and replace the data with that of the current experiment.
* See Master Plate and Drug-Media Plate topic for details.
* Click on the 'GenReports' menu tab and a drop down menu is presented the the first item 'DrugMediaMP Generate .mat'.
* This will take you to the /MasterPlateFiles folder within the experiment currently being analyzed.
* Do as the dialog box instructs. Select the Master Plate Excel file first.
* Important note: These files (both for master plates and drug-medias) must be generated or converted to the Excel 95 version to be read in Linux.
* This can be done on either a Windows or an Apple machine running Excel.
![Navigate to MasterPlateFiles](docs/imgs/easy/15-generate-mpdm-mat1.png "Navigate to MasterPlateFiles")
![Create a new MPDM.mat file](docs/imgs/easy/16-generate-mpdm-mat2.png "Create a new MPDM.mat file")
![Navigate to MasterPlateFiles](docs/imgs/easy/17-generate-mpdm-mat3.png "Navigate to MasterPlateFiles")
![Click OK](docs/imgs/easy/18-generate-mpdm-mat4.png "Click OK")
* A message dialog pops up.
* Click 'OK'.
![Navigate to MasterPlateFiles](docs/imgs/easy/19-generate-mpdm-mat5.png "Navigate to MasterPlateFiles")
* Next click on the 'GenReports' menu tab and the second item in the drop down list 'ResultsDB Generate'.
![Generate Reports](docs/imgs/easy/20-gen-reports.png "Generate Reports")
* A dialog box with options appears.
* The default is 'Both'.
* 'Res' produces only a standard result sheet in the current experiments /Results*/PrintResults folder.
* 'DB' produces only a special file for convenient upload to databases.
* This file has no blank rows separating the plates and combines the raw data for each line item into a 'blob' as this is a convenient way to store data of variant lengths in a single database field.
* The concatenation of data for each row take a while. But is useful for uploading data.
* Typically 'Both' is the preferred option, however, if one needs to review the results quickly, this provides that option.
* We can open the !!Results MI 16_0919 yor1-1 copy.txt text file using Libre Open Office to review the results.
![Results file](docs/imgs/easy/21-results-file.png "Results file")
* We can do likewise with the !!Dbase_MI 16_0919_yor1-2 copy.txt text file.
![Db file](docs/imgs/easy/22-dbase-file.png "Db file")
* Note that there are no headers or empty rows.
* Since Libre may corrupt the text files, it could be advisable to only read them and refrain from any 'Save' options presented.
#### Master Plate and Drug Media Spreadsheets
* The Master Plate and Drug- Media Spreadsheets correlate to the collected and calculated data with the defining definitions of the cultures, drugs and media involved in producing the experimental data.
* These spreadsheets have a very specific format which was instigated at the beginning of our work.
* To maintain compatibility over the years, we maintain that format.
* To begin with, our system can be used with Windows, Linux and Apple operating systems.
* To accommodate these OS's, the Excel version must be an older Excel 95 version which is cross compatible for Matlab versions within all three major OS's.
* Windows is more tolerant, but to avoid problems producing results reports, ALWAYS use the Excel 95 format for your spreadsheets.
* Do not remove any header rows. They can be modified with exception of the triple hash (###).
* Do not change the number or order of the columns.
* Next place a 'space' in unused empty spreadsheet entry positions.
* This can cause problems in general for some software utilities.
* It is just best to make this a standard practice.
* Avoid using special characters.
* Depending on the OS and software utility (especially database utilities), these can be problematic.
* Certain 'date' associated entries such as Oct1 or OCT1 will be interpreted by Excel as a date and automatically formatted as such.
* Do not use Oct1 (which is a yeast gene name) instead use Oct1_ or it's ORF name instead.
* When creating a Master Plate spreadsheet, it is best to start with a working spreadsheet template and adjust it to your descriptive data.
* Be sure that ### mark is always present in the first column of the header for each plate.
* This is important convention as it is used to defined a new plate set of entry data.
* Each plate is expected to have 384 rows of data correlated with the 384 wells of the source master plates.
* These have a particular order going through all 24 columns each row before proceeding to the next row.
* Gene names and ORF name entries should be as short as possible (4-5 character max if possible) as these are used repeatedly as part of concatenated descriptors.
* The 'Replicate' field and the 'Specifics' fields can be used for additional information.
* The 'Replicate' field was originally designed to allow the user to sort replicates but it can be used for other relevant information.
* The 'Specifics' field was created to handle special cases where the liquid media in which cultures were grown on a single source plate was selectively varied.
* This gives the researcher a way to sort by growth media as well as gene or ORF name.
* It can also be used to sort other properties instead of modifying the gene name field.
* Thoughtful experiment design and layout are important for the successful analysis of the resultant data.
* It is typically a good idea to create at least one reference full plate and make that plate the first source master plate.
* Typically we give those reference cultures the 'Gene Name' RF1.
* Traditionally we also made a second full reference plate with its cultures labeled RF2.
* More recently some researchers have gone to dispersing RF1 control reference cultures throughout the source master plates series in addition to the first full source master plate.
* The EZview software has been updated accordingly to find these references and perform associated calculations.
![Master Plate file](docs/imgs/easy/23-mp-file.png "Master Plate file")
* There are a number of fields on the spreadsheet which in this case were left empty.
* This spreadsheet format was created originally with studies of whole yeast genome SGA modifications incorporated.
* Therefore all fields may not be relevant.
* However, when ever relevant it is strongly advised to fill in all the appropriate data.
* The Drug-Media spreadsheet defines the perturbation components of each type of agar plate that the source master plates are printed on.
* Again the format adherence is essential.
* There is a '1' in the first column- second row (A2).
* This has as legacy going back to early use.
* It is still necessary and should not be deleted.
* The header row must not be deleted.
* A triple hash(###) must be placed in the cell below the last entry in the Drug field (Column 2).
* Again insert a 'space' in each unused or empty cell in each field.
* Again avoid special characters which may cause problems if not in the experiment quantification in subsequent analysis utilities.
* A utility looking for a text field may end up reading a null and respond inappropriately.
* As with the master plate Excel sheet, it is a good idea to use a working copy of an existing Drug-Media spreadsheet and adapt it to ones needs.
![Drug Media file](docs/imgs/easy/24-dm-file.png "Drug Media file")
To analyze a new Q-HTCP experiment:
* Open the EASY Software.
* Open 'EstartConsole.m' with MATLAB
* Click the Run icon (play button)
* When prompted, click "Change Folder" (do not select "Add to Path").
* In the pop-up display, select from the 'File' dropdown: 'New Experiment'.
* From the pop-up, choose where to save the new file.
* Navigate to the relevant job in the ExpJobs folder, name the file accordingly, and click 'save'.
* The newly created .mat file in the newly created Results folder will automatically be loaded.
* The file name will then be automatically appended by the code with the current date information (e.g. 'A1.mat' will become 'Results2023-07-19A1)
* If the experiment has already been created, it can be reloaded by clicking 'Load Experiment' instead of 'New Experiment' and selecting the relevant results
* In the pop-up display, click on the 'Run' dropdown menu and select 'Image CurveFit ComboAnalysis'.
* In the updated pop-up, choose/highlight all desired image folders for analysis (this is generally all of the folders, since only the ones that need analysis should be there) and then click on 'continue'.
* As the program is running, updates will periodically appear in the Command Window; there will be an initial pause at "Before call to NIscanIntens…..".
* When the curve fitting is finished, the EASY console will pop back up.
* Check to see the completed analysis results in the newly created 'PrintResults' Folder, inside of the 'Results' Folder.
* Other folders ('CFfigs', 'figs', 'Fotos') are created for later optional use and will be empty.
* **NOTE:** The image analysis is completed independent of labeling the data (strains, media type, etc. Labeling happens next with the 'GenReports' function).
* Click on the 'GenReports' dropdown and select 'DrugMediaMP Generate .mat'
* **NOTE:** The 'MasterPlate' and 'DrugMedia' files have very specific formats and should be completed from a template.
* The Masterplate file must be exact (it must contain all and only the strains that were actually tested).
* For example, if only part of a library is tested, the complete library file must be modified to remove irrelevant strains.
* You will be prompted to first select the 'MasterPlate' file. You will need to navigate away from the working directory to get to it.
* It is fine for the 'MasterPlate_' file to be .xlsx (or .xls), and if you don't see it in the popup window, then change the file type from '.xls' to "all files" and then select it.
* Once it is selected, a report of the number of master plates in the file will pop up; when the report appears, assuming it is correct, click on 'OK'.
* You will then be prompted to select the 'DrugMedia' file from the relevant job folder. You will automatically return to the correct prior directory location.
* Choose it and click 'OK'. You may see a warning about column headers being modified, but that's ok.
* This will create an additional file in the 'MasterPlatesFiles' folder named 'MPDMmat.mat'
* Click on the 'GenReports' dropdown and select 'Results_Generate.'
* You will first see '!!ResultsElr_.txt' generated in the 'PrintResults' folder.
* Refreshing will reveal an increasing file size until you see the '!!ResultsStd_.txt' being generated.
* When finished, the '!!ResultsStd_.txt' will be about the same file size and it should be used in the following StudiesQHTCP analysis.
* 'NoGrowth_.txt', and 'GrowthOnly_.txt' files will be generated in the 'PrintResults' folder.
Issues:
* We need full documentation for all of the current workflow. There are different documents that need to be integrated. This will need to be updated as we make improvements to the system.
* MasterPlate_ file must have ydl227c in orf column, or else it Z_interaction.R will fail, because it can't calculate shift values.
* Make sure there are no special characters; e.g., (), “, ', ?, etc.; dash and underscore are ok as delimiters
* Drug_Media_ file must have letter character to be read as 'text'.
* MasterPlate_ file and DrugMedia_ are .xlsx or .xls, but !!Results_ is .txt.
* In Z_interactions.R, does it require a zero concentration/perturbation (should we use zero for the low conc, even if it's not zero), e.g., in order to do the shift correctly.
* Need to enable all file types (not only .xls) as the default for GenerateResults (to select MP and DM files as .xlsx).
* Explore differences between the ELR and STD files - 24_0414; John R modified Z script to format ELR file for Z_interactions.R analysis.
* To keep time stamps when transferring with FileZilla, go to the transfer drop down and turn it on, see https://filezillapro.com/docs/v3/advanced/preserve-timestamps/
* Could we change the 'MasterPlateFiles' folder label in EASY to 'MasterPlate_DrugMedia' (since there should be only one MP and there is also a DM file required?
* I was also thinking of adding a 'MasterPlateFilesOnly' folder to the QHTCP directory template where one could house different MPFiles (e.g., with and without damps, with and without Refs on all MPs, etc; other custom MPFiles, updated versions, etc)
* Currently updated files are in '23_1011_NewUpdatedMasterPlate_Files' on Mac (yeast strains/23_0914…/)
* For EASY to report cell array positions (plate_row_column) to facilitate analyzing plate artifacts. The MP File in Col 3 is called 'LibraryLocation' and is reported after 'Specifics' in the !!Results.
* Can EASY/StudiesQ-HTCP be updated at any time by rerunning with updated MP file (new information for gene, desc, etc)- or maybe better to always start with a new template?
* Need to be aware of file formatting to avoid dates (e.g., with gene names like MAY24, OCT1, etc, and with plate locations 1E1, 1E2, etc)- this has been less of a problem.
* In StudiesQHTCP folders, remember to annotate Exp1, Exp2, in the StudyInfo.csv file.
* Where are gene names called from for labeling REMc heatmaps, TSHeatmaps, Z-interaction graphs, etc? Is this file in the QHTCP 'code' folder, or is it in the the results file (and thus ultimately the MP file)?
* Is it ok for a MasterPlate_ file to have multiple sheets (e.g., readme tab- is only the first tab read in)?
* What are the rules for pulling information from the MasterPlateFile to the !!Results_ (e.g., is it the column or the Header Name, etc that is searched? Particular cells in the DrugMedia file?).
* Modifier, Conc are from DM sheet, and refer to the agar media arrays. OrfRep is from MasterPlate_ File. 'Specifics' (Last Column) is experiment specific and accommodate designs involving differences across the multi-well liquid arrays. 'StrainBkGrd' (now 'Library location') is in the 3rd column and reported after 'Specifics' at the last col of the '!!Results..' file.
* Do we have / could we make an indicator- work in progress or idle/complete with MP/DM and after gen-report. Now, we can check for the MPDMmat.mat file, or we can look in PrintResults, but would be nice to know without looking there.
* File>>Load Experiment wasn't working (no popup to redirect). Check this again.
### ezview
TODO WIP
### qhtcp
System for Multi-QHTCP-Experiment Gene Interaction Profiling Analysis
* Functional rewrite of REMcMaster3.sh, RemcMaster2.sh, REMcJar2.sh, ExpFrontend.m, mProcess.sh, mFunction.sh, mComponent.sh
* Added a newline character to the end of the study info file so it is a valid text file
TODO
* Suggest renaming StudiesQHTCP to something like qhtcp qhtcp_output or output
* Move (hide) the study template somewhere else
* StudiesArchive should be smarter:
* Create a database with as much information as possible
* Write a function that easily loads and parses databse into easy-to-use variables
* Allow users to reference those variables to write their own modules
* Should not be using initials
* not unique enough and we don't have that data easily on hand
* usernames are unique and make more sense
* I don't know what all would have to be modified atm
Rerunning this module uses rsync --update to only copy files that are newer in the template
If you wish for the template to overwrite your changes, delete the file from your QHTCP project dir
To create a new study (Experiment Specific Interaction Zscores generation)
* StudyInfo.csv instructions:
* In your files directory, open the /Code folder, edit the 'StudyInfo.csv' spreadsheet, and save it as a 'csv' file to give each experiment the labels you wish to be used for the plots and specific files.
* Enter the desired Experiment names- **order the names in the way you want them to appear in the REMc heatmaps; and make sure to run the front end programs (below) in the correct order (e.g., run front end in 'exp1' folder to call the !!Results file for the experiment you named as exp1 in the StudyInfo.csv file)
* The GTA and pairwise, TSHeatmaps, JoinInteractions and GTF Heatmap scripts use this table to label results and heatmaps in a meaningful way for the user and others. The BackgroundSD and ZscoreJoinSD fields will be filled automatically according to user specifications, at a later step in the QHTCP study process.
* MATLAB ExpFrontend.m was made for recording into a spreadsheet ('StudiesDataArchive.txt') the date and files used (i.e., directory paths to the !!Results files used as input for Z-interaction script) for each multi-experiment study.
Give each experiment the labels you wish to be used for the plots and specific files.
Enter the desired Experiment names and order them in the way you want them to appear in the REMc heatmaps;
Run the front end MATLAB programs in the correct order (e.g., run front end in 'exp1' folder to call the !!Results file for the experiment you named as exp1 in the StudyInfo.csv file)
The GTA and pairwise, TSHeatmaps, JoinInteractions and GTF Heatmap scripts use this table to label results and heatmaps in a meaningful way for the user and others.
The BackgroundSD and ZscoreJoinSD fields will be filled automatically according to user specifications, at a later step in the QHTCP study process.
* Open MATLAB and in the application navigate to each specific /Exp folder, call and execute ExpFrontend.m by clicking the play icon.
* Use the "Open file" function from within Matlab.
* Do not double-click on the file from the directory.
* When prompted, navigate to the ExpJobs folder and the PrintResults folder within the correct job folder.
* Repeat this for every Exp# folder depending on how many experiments are being performed.
* Note: Before doing this, it's a good idea to compare the ref and non-ref CPP average and median values. If they are not approximately equal, then may be helpful to standardize Ref values to the measures of central tendency of the Non-refs, because the Ref CPPs are used for the z-scores, which should be centered around zero.
* This script will copy the !!ResultsStd file (located in /PrintResults in the relevant job folder in /scans **rename this !!Results file before running front end; we normally use the 'STD' (not the 'ELR' file) chosen to the Exp# directory as can be seen in the “Current Folder” column in MATLAB, and it updates 'StudiesDataArchive.txt' file that resides in the /StudiesQHTCP folder. 'StudiesDataArchive.txt' is a log of file paths used for different studies, including timestamps.
Do this to document the names, dates and paths of all the studies and experiment data used in each study. Note, one should only have a single '!!Results…' file for each /Exp_ to prevent ambiguity and confusion. If you decide to use a new or different '!!Results…' sheet from what was used in a previous “QHTCP Study”, remove the one not being used. NOTE: if you copy a '!!Results…' file in by hand, it will not be recorded in the 'StudiesDataArchive.txt' file and so will not be documented for future reference. If you use the ExpFrontend.m utility it will append the new source for the raw !!Results… to the 'StudiesDataArchive.txt' file.
As stated above, it is advantageous to think about the comparisons one wishes to make so as to order the experiments in a rational way as it relates to the presentation of plots. That is, which results from sheets and selected 'interaction … .R', user modified script, is used in /Exp1, Exp2, Exp3 and Exp4 as explained in the following section.
TODO MUST CLEAN UP QHTCP TEMPLATE DIRECTORY
As stated earlier, the user can add folders to back up temporary results, study-related notes, or other related work.
However, it is advised to set up and use separate STUDIES when evaluating differing data sets whether that is from experiment results files or from differing data selections in the first interaction … .R script stage.
This reduces confusion at the time of the study and especially for those reviewing study analysis in the future.
How-To Procedure: Execute a Multi-experiment Study:
* Consider the goals of the study and design a strategy of experiments to include in the study.
* Consider the quality of the experiment runs using EZview to see if there are systematic problems that are readily detectable.
* In some cases, one may wish to design a 'pilot' study for discovery purposes.
* There is no problem doing that, just take a template study, copy and rename it as XYZpilotStudy etc.
* However, careful examination of the experimental results using EZview will likely save time in the long run.
* One may be able to relatively quickly run the interaction Z scores (the main challenge there is the user creation of customized interaction… .R code.
* I have tried to simplify this by locating the user edits near the top).
### remc
remc module for QHTCP
TODO
* Which components can be parallelized?
#### Arguments
* **$1** (string): study info file
### gtf
GTF module for QHTCP
#### Arguments
* **$1** (string): output directory
* **$2** (string): gene_association.sgd
* **$3** (string): gene_ontology_edit.obo
* **$4** (string): ORF_List_Without_DAmPs.txt
### gta
GTA module for QHTCP
TODO
*
*
#### Arguments
* **$1** (string): output directory
* **$2** (string): gene_association.sgd
* **$3** (string): gene_ontology_edit.obo
* **$4** (string): go_terms.tab
* **$5** (string): All_SGD_GOTerms_for_QHTCPtk.csv
* **$6** (string): zscores_interaction.csv
## Wrappers
Wrappers:
* Allow scripts to be called by the main workflow script using input and output arguments as a translation mechanism.
* Only run by default if called by a module.
* Can be called directly with its arguments as a comma-separated string
### r_gta
GTAtemplate R script
TODO
* Is GTAtemplate.R actually a template?
* Do we need to allow user customization?
INPUT
* [gene_association.sgd](https://downloads.yeastgenome.org/curation/chromosomal_feature/gene_association.sgd)
* go_terms.tab
OUTPUT
* Average_GOTerms_All.csv
#### Arguments
* **$1** (string): Exp# name
* **$2** (string): ZScores_Interaction.csv file
* **$3** (string): go_terms.tab file
* **$4** (string): [gene_association.sgd](https://downloads.yeastgenome.org/curation/chromosomal_feature/gene_association.sgd)
* **$5** (string): output directory
### r_gta_pairwiselk
PairwiseLK.R R script
TODO
* Move directory creation from PairwiseLK.R to gta module
* Needs better output filenames and directory organization
* Needs more for looping to reduce verbosity
INPUT
* Average_GOTerms_All.csv
*
Output
*
This wrapper:
* Will perform both L and K comparisons for the specified experiment folders.
* The code uses the naming convention of PairwiseCompare_Exp#-Exp# to standardize and keep simple the structural naming (where X is either K or L and Y is the number of the experiment GTA results to be found in ../GTAresult/Exp_).
* {FYI There are also individual scripts that just do the L or K pairwise studies in the ../Code folder.}
#### Arguments
* **$1** (string): First Exp# name
* **$2** (string): Second Exp# name
* **$3** (string): study info file
* **$4** (string): output directory
### r_gta_heatmaps
TSHeatmaps5dev2.R R script
TODO
* Rename
* Refactor to automatically allow more studies
* Refactor with more looping to reduce verbosity
* Reduce cyclomatic complexity of some of the for loops
Files
*
*
Output
*
This wrapper:
* The Term Specific Heatmaps are produced directly from the ../ExpStudy/Exp_/ZScores/ZScores_Interaction.csv file generated by the user modified interaction… .R script.
* The heatmap labeling is per the names the user wrote into the study info file
* Verify that the All_SGD_GOTerms_for_QHTCPtk.csv found in ../Code is what you wish to use or if you wish to use a custom modified version.
* If you wish to use a custom modified version, create it and modify the TSHeatmaps template script (TSHeatmaps5dev2.R) and save it as a TSH_study specific name.
#### Arguments
* **$1** (string): study info file
* **$2** (string): gene_ontology_edit.obo file
* **$3** (string): go_terms.tab file
* **$4** (string): All_SGD_GOTerms_for_QHTCPtk.csv
* **$5** (string): ZScores_interaction.csv
* **$6** (string): base directory
* **$7** (string): output directory
### r_interactions
Run the R interactions analysis (deprecates Z_InteractionTemplate.R)
SCRIPT: interactions.R
TODO
* Parallelization (need to consult with Sean)
* Needs more loops to reduce verbosity, but don't want to limit flexibility
* Replace 1:length() with seq_along()
* Re-enable disabled linter checks
* Reduce cyclomatic complexity of some of the for loops
* There needs to be one point of truth for the SD factor
* Replace most paste() functions with printf()
INPUT
* easy/results_std.txt
NOTES
*
#### Arguments
* **$1** (string): The input results_std.txt
* **$2** (string): The zscores directory
* **$3** (string): The study info file
* **$4** (string): SGD_features.tab
* **$5** (integer): experiment number
* **$6** (integer): delta SD background value (default: 3)
### r_join_interactions
JoinInteractExps3dev.R creates REMcRdy_lm_only.csv and Shift_only.csv
TODO
* Needs more loops to reduce verbosity
INPUT
*
OUTPUT
* REMcRdy_lm_only.csv
* Shift_only.csv
* parameters.csv
#### Arguments
* **$1** (string): The output directory
* **$2** (string): The sd value
* **$3** (string): The study info file
### java_extract
Jingyu's REMc java utility
Input
* REMcRdy_lm_only.csv
Output
* REMcRdy_lm_only.csv-finalTable.csv
NOTE
* Closed-source w/ hardcoded output directory, so have to pushd/popd to run (not ideal)
#### Arguments
* **$1** (string): The output directory
* **$2** (string): ORF_List_Without_DAmPs.txt
* **$3** (string): REMcRdy_lm_only.csv
* **$4** (string): GeneByGOAttributeMatrix_nofiltering-2009Dec07.tab
* **$5** (string): The output file
#### Exit codes
* **0**: if expected output file exists
* **1**: if expected output file does not exist
### r_add_shift_values
Add shift values back to REMcRdy_lm_only.csv-finalTable.csv
and output "REMcWithShift.csv" for use with the REMc heat maps
#### Arguments
* **$1** (string): REMcRdy_lm_only.csv-finalTable.csv
* **$2** (string): Shift_only.csv
* **$3** (string): study info file
* **$4** (string): sd value
### r_create_heat_maps
Execute createHeatMaps.R
INPUT
* REMcWithShift.csv
OUTPUT
* compiledREMcHeatmaps.pdf
TODO
* Needs more looping for brevity
#### Arguments
* **$1** (string): The final shift table (REMcWithShift.csv)
* **$2** (string): The output directory
### r_heat_maps_homology
Execute createHeatMapsAll.R
#### Arguments
* **$1** (string): REMcRdy_lm_only.csv-finalTable.csv
* **$2** (string): Shift_only.csv
* **$3** (string): The (Yeast_Human_Homology_Mapping_biomaRt_18_0920.csv)
* **$4** (string): The output directory
### py_gtf_dcon
Perform python dcon portion of GTF
SCRIPT: [DconJG2.py](apps/python/DconJG2.py)
OUTPUT
* 1-0-0-finaltable.csv
#### Arguments
* **$1** (string): Directory to process
* **$2** (string): Output directory name
### pl_gtf_analyze
Perl analyze wrapper
SCRIPT: [analyze_v2.pl](https://metacpan.org/dist/GO-TermFinder/view/examples/analyze.pl)
TODO
* Are we just overwriting the same data for all set2 members?
* Why the custom version?
#### Arguments
* **$1** (string): gene_association.sgd
* **$2** (string): gene_ontology_edit.obo
* **$3** (string): ORF_List_Without_DAmPs.txt
* **$4** (string): TODO txt to anaylze? I'm not sure what this is called
### pl_gtf_terms2tsv
Perl terms2tsv wrapper
TODO
* Probably should be translated to shell/python
#### Arguments
* **$1** (string): Terms file TODO naming
### py_gtf_concat
Python concat wrapper for GTF
Concat the process ontology outputs from the /REMcReady_lm_only folder
TODO
* Probably should be translated to bash
#### Arguments
* **$1** (string): output directory name to look for txt files
* **$2** (string): output file
### r_compile_gtf
Compile GTF in R
#### Arguments
* **$1** (string): gtf output directory
### study_info
Creates, modifies, and parses the study info file
TODO
* Needs refactoring
* Ended up combining a few functions into one
#### Variables set
* **STUDIES_NUMS** (array): contains Exp numbers
#### Exit codes
* **0**: If one or more studies found
* **1**: If no studies found
### choose_easy_results
Chooses an EASY scans directory if the information is undefined
TODO Standardize EASY output, it's hard to understand
TODO eventually we could run this on multiple results dirs simultaneously with some refactoring
#### Arguments
* **$1** (string): directory containing EASY results dirs
#### Variables set
* **EASY_RESULTS_DIR** (string): The working EASY output directory
#### Exit codes
* **0**: if successfully choose anEASY results dir

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -0,0 +1,5 @@
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.10.1
Created-By: 17.0.1+12-LTS (Azul Systems, Inc.)
Main-Class: weka.gui.GUIChooser

View File

@@ -0,0 +1,69 @@
#
# Copyright 2019 FormDev Software GmbH
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# This file is loaded for "FlatLaf Darcula" theme (that extend class FlatDarculaLaf)
# and for all dark IntelliJ Platform themes.
#
# Documentation:
# - https://www.formdev.com/flatlaf/properties-files/
# - https://www.formdev.com/flatlaf/how-to-customize/
#
# NOTE: Avoid copying the whole content of this file to own properties files.
# This will make upgrading to newer FlatLaf versions complex and error-prone.
# Instead copy and modify only those properties that you need to alter.
#
# Colors and style mostly based on Darcula theme from IntelliJ IDEA Community Edition,
# which is licensed under the Apache 2.0 license. Copyright 2000-2019 JetBrains s.r.o.
# See: https://github.com/JetBrains/intellij-community/
#---- variables ----
# accent colors (blueish)
@accentFocusColor = if(@accentColor, darken(@accentColor,20%), shade(spin(@accentBaseColor,-8),20%))
#---- Button ----
Button.innerFocusWidth = 0
Button.default.boldText = true
#---- CheckBox ----
CheckBox.icon.focusWidth = null
CheckBox.icon.focusedBackground = null
#---- Component ----
Component.focusWidth = 2
Component.innerFocusWidth = 0
Component.innerOutlineWidth = 0
Component.arrowType = triangle
#---- ProgressBar ----
ProgressBar.foreground = darken(@foreground,10%)
ProgressBar.selectionForeground = @background
#---- RadioButton ----
RadioButton.icon.centerDiameter = 5

View File

@@ -0,0 +1,372 @@
#
# Copyright 2019 FormDev Software GmbH
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# This file is loaded for all dark themes (that extend class FlatDarkLaf).
#
# Documentation:
# - https://www.formdev.com/flatlaf/properties-files/
# - https://www.formdev.com/flatlaf/how-to-customize/
#
# NOTE: Avoid copying the whole content of this file to own properties files.
# This will make upgrading to newer FlatLaf versions complex and error-prone.
# Instead copy and modify only those properties that you need to alter.
#
# Colors and style mostly based on Darcula theme from IntelliJ IDEA Community Edition,
# which is licensed under the Apache 2.0 license. Copyright 2000-2019 JetBrains s.r.o.
# See: https://github.com/JetBrains/intellij-community/
#---- variables ----
# general background and foreground (text color)
@background = #3c3f41
@foreground = #bbb
@disabledBackground = @background
@disabledForeground = shade(@foreground,25%)
# component background
@buttonBackground = tint(@background,9%)
@componentBackground = tint(@background,5%)
@menuBackground = darken(@background,5%)
# selection
@selectionBackground = @accentSelectionBackground
@selectionForeground = contrast(@selectionBackground, @background, @foreground, 25%)
@selectionInactiveBackground = spin(saturate(shade(@selectionBackground,70%),20%),-15)
@selectionInactiveForeground = @foreground
# menu
@menuHoverBackground = lighten(@menuBackground,10%,derived)
@menuCheckBackground = darken(@selectionBackground,10%,derived noAutoInverse)
@menuAcceleratorForeground = darken(@foreground,15%)
@menuAcceleratorSelectionForeground = @selectionForeground
# misc
@cellFocusColor = #000
@icon = shade(@foreground,7%)
# accent colors (blueish)
# set @accentColor to use single accent color or
# modify @accentBaseColor to use variations of accent base color
@accentColor = null
@accentBaseColor = #4B6EAF
@accentBase2Color = lighten(saturate(spin(@accentBaseColor,-8),13%),5%)
# accent color variations
@accentFocusColor = if(@accentColor, @accentColor, shade(spin(@accentBaseColor,-8),20%))
@accentLinkColor = if(@accentColor, @accentColor, lighten(saturate(spin(@accentBaseColor,-5),50%),16%))
@accentSelectionBackground = if(@accentColor, @accentColor, @accentBaseColor)
@accentSliderColor = if(@accentColor, @accentColor, @accentBase2Color)
@accentUnderlineColor = if(@accentColor, @accentColor, @accentBase2Color)
@accentButtonDefaultBackground = if(@accentColor, @accentColor, darken(spin(@accentBaseColor,-8),13%))
# for buttons within components (e.g. combobox or spinner)
@buttonArrowColor = shade(@foreground,17%)
@buttonDisabledArrowColor = darken(@buttonArrowColor,25%)
@buttonHoverArrowColor = lighten(@buttonArrowColor,10%,derived noAutoInverse)
@buttonPressedArrowColor = lighten(@buttonArrowColor,20%,derived noAutoInverse)
# Drop (use lazy colors for IntelliJ platform themes, which usually do not specify these colors)
@dropCellBackground = darken(List.selectionBackground,10%,lazy)
@dropCellForeground = lazy(List.selectionForeground)
@dropLineColor = lighten(List.selectionBackground,10%,lazy)
@dropLineShortColor = lighten(List.selectionBackground,30%,lazy)
#---- system colors ----
activeCaption = #434E60
inactiveCaption = #393C3D
controlHighlight = darken($controlShadow,20%)
controlLtHighlight = darken($controlShadow,25%)
controlDkShadow = lighten($controlShadow,10%)
#---- Button ----
Button.background = @buttonBackground
Button.hoverBackground = lighten($Button.background,3%,derived)
Button.pressedBackground = lighten($Button.background,6%,derived)
Button.selectedBackground = lighten($Button.background,10%,derived)
Button.selectedForeground = $Button.foreground
Button.disabledSelectedBackground = lighten($Button.background,3%,derived)
Button.borderColor = tint($Button.background,10%)
Button.disabledBorderColor = $Button.borderColor
Button.focusedBorderColor = $Component.focusedBorderColor
Button.hoverBorderColor = $Button.focusedBorderColor
Button.innerFocusWidth = 1
Button.default.background = @accentButtonDefaultBackground
Button.default.foreground = contrast($Button.default.background, @background, $Button.foreground, 25%)
Button.default.hoverBackground = lighten($Button.default.background,3%,derived)
Button.default.pressedBackground = lighten($Button.default.background,6%,derived)
Button.default.borderColor = tint($Button.default.background,15%)
Button.default.hoverBorderColor = tint($Button.default.background,18%)
Button.default.focusedBorderColor = $Button.default.hoverBorderColor
Button.default.focusColor = lighten($Component.focusColor,3%)
Button.default.boldText = true
Button.toolbar.hoverBackground = lighten($Button.background,1%,derived)
Button.toolbar.pressedBackground = lighten($Button.background,4%,derived)
Button.toolbar.selectedBackground = lighten($Button.background,7%,derived)
#---- CheckBox ----
CheckBox.icon.focusWidth = 1
# enabled
CheckBox.icon.borderColor = tint($Component.borderColor,5%)
CheckBox.icon.background = tint(@background,5%)
CheckBox.icon.selectedBorderColor = tint($CheckBox.icon.borderColor,20%)
CheckBox.icon.selectedBackground = $CheckBox.icon.background
CheckBox.icon.checkmarkColor = shade(@foreground,10%)
# disabled
CheckBox.icon.disabledBorderColor = shade($CheckBox.icon.borderColor,20%)
CheckBox.icon.disabledBackground = @disabledBackground
CheckBox.icon.disabledCheckmarkColor = darken($CheckBox.icon.checkmarkColor,25%)
# focused
CheckBox.icon.focusedBorderColor = $Component.focusedBorderColor
CheckBox.icon.focusedBackground = fade($CheckBox.icon.focusedBorderColor,30%)
# hover
CheckBox.icon.hoverBorderColor = $CheckBox.icon.focusedBorderColor
CheckBox.icon.hoverBackground = lighten($CheckBox.icon.background,3%,derived)
# pressed
CheckBox.icon.pressedBorderColor = $CheckBox.icon.focusedBorderColor
CheckBox.icon.pressedBackground = lighten($CheckBox.icon.background,6%,derived)
# used if CheckBox.icon.style or RadioButton.icon.style = filled
# enabled
CheckBox.icon[filled].selectedBorderColor = $CheckBox.icon.checkmarkColor
CheckBox.icon[filled].selectedBackground = $CheckBox.icon.checkmarkColor
CheckBox.icon[filled].checkmarkColor = $CheckBox.icon.background
# hover
CheckBox.icon[filled].hoverSelectedBackground = darken($CheckBox.icon[filled].selectedBackground,3%,derived)
# pressed
CheckBox.icon[filled].pressedSelectedBackground = darken($CheckBox.icon[filled].selectedBackground,6%,derived)
#---- CheckBoxMenuItem ----
CheckBoxMenuItem.icon.checkmarkColor = @buttonArrowColor
CheckBoxMenuItem.icon.disabledCheckmarkColor = @buttonDisabledArrowColor
#---- Component ----
Component.borderColor = tint(@background,19%)
Component.disabledBorderColor = $Component.borderColor
Component.focusedBorderColor = lighten($Component.focusColor,5%)
Component.focusColor = @accentFocusColor
Component.linkColor = @accentLinkColor
Component.accentColor = if(@accentColor, @accentColor, @accentBaseColor)
Component.grayFilter = -20,-70,100
Component.error.borderColor = desaturate($Component.error.focusedBorderColor,25%)
Component.error.focusedBorderColor = #8b3c3c
Component.warning.borderColor = darken(desaturate($Component.warning.focusedBorderColor,20%),10%)
Component.warning.focusedBorderColor = #ac7920
Component.custom.borderColor = desaturate(#f00,50%,relative derived noAutoInverse)
#---- Desktop ----
Desktop.background = #3E434C
#---- DesktopIcon ----
DesktopIcon.background = lighten($Desktop.background,10%,derived)
#---- HelpButton ----
HelpButton.questionMarkColor = shade(@foreground,10%)
HelpButton.disabledQuestionMarkColor = tint(@background,30%)
#---- InternalFrame ----
InternalFrame.activeTitleBackground = darken(@background,10%)
InternalFrame.activeTitleForeground = @foreground
InternalFrame.inactiveTitleBackground = lighten($InternalFrame.activeTitleBackground,5%)
InternalFrame.inactiveTitleForeground = @disabledForeground
InternalFrame.activeBorderColor = darken(@background,7%)
InternalFrame.inactiveBorderColor = darken(@background,3%)
InternalFrame.buttonHoverBackground = lighten($InternalFrame.activeTitleBackground,10%,derived)
InternalFrame.buttonPressedBackground = lighten($InternalFrame.activeTitleBackground,20%,derived)
InternalFrame.closeHoverBackground = lazy(Actions.Red)
InternalFrame.closePressedBackground = darken(Actions.Red,10%,lazy)
InternalFrame.closeHoverForeground = #fff
InternalFrame.closePressedForeground = #fff
InternalFrame.activeDropShadowOpacity = 0.5
InternalFrame.inactiveDropShadowOpacity = 0.75
#---- Menu ----
Menu.icon.arrowColor = @buttonArrowColor
Menu.icon.disabledArrowColor = @buttonDisabledArrowColor
#---- MenuBar ----
MenuBar.borderColor = $Separator.foreground
#---- PasswordField ----
PasswordField.capsLockIconColor = #ffffff64
#---- Popup ----
Popup.dropShadowColor = #000
Popup.dropShadowOpacity = 0.25
#---- PopupMenu ----
PopupMenu.borderColor = tint(@background,17%)
#---- ProgressBar ----
ProgressBar.background = lighten(@background,8%)
ProgressBar.foreground = @accentSliderColor
ProgressBar.selectionBackground = @foreground
ProgressBar.selectionForeground = contrast($ProgressBar.foreground, @background, @foreground, 25%)
#---- RootPane ----
RootPane.activeBorderColor = lighten(@background,7%,derived)
RootPane.inactiveBorderColor = lighten(@background,5%,derived)
#---- ScrollBar ----
ScrollBar.track = lighten(@background,1%,derived noAutoInverse)
ScrollBar.thumb = lighten($ScrollBar.track,10%,derived noAutoInverse)
ScrollBar.hoverTrackColor = lighten($ScrollBar.track,4%,derived noAutoInverse)
ScrollBar.hoverThumbColor = lighten($ScrollBar.thumb,10%,derived noAutoInverse)
ScrollBar.pressedThumbColor = lighten($ScrollBar.thumb,15%,derived noAutoInverse)
ScrollBar.hoverButtonBackground = lighten(@background,5%,derived noAutoInverse)
ScrollBar.pressedButtonBackground = lighten(@background,10%,derived noAutoInverse)
#---- Separator ----
Separator.foreground = tint(@background,10%)
#---- Slider ----
Slider.trackValueColor = @accentSliderColor
Slider.trackColor = lighten(@background,15%)
Slider.thumbColor = $Slider.trackValueColor
Slider.tickColor = @disabledForeground
Slider.focusedColor = fade(changeLightness($Component.focusColor,60%,derived),30%,derived)
Slider.hoverThumbColor = lighten($Slider.thumbColor,5%,derived)
Slider.pressedThumbColor = lighten($Slider.thumbColor,8%,derived)
Slider.disabledTrackColor = lighten(@background,10%)
Slider.disabledThumbColor = $Slider.disabledTrackColor
#---- SplitPane ----
SplitPaneDivider.draggingColor = $Component.borderColor
#---- TabbedPane ----
TabbedPane.underlineColor = @accentUnderlineColor
TabbedPane.disabledUnderlineColor = lighten(@background,23%)
TabbedPane.hoverColor = darken($TabbedPane.background,5%,derived noAutoInverse)
TabbedPane.focusColor = mix(@selectionBackground,$TabbedPane.background,25%)
TabbedPane.contentAreaColor = $Component.borderColor
TabbedPane.buttonHoverBackground = darken($TabbedPane.background,5%,derived noAutoInverse)
TabbedPane.buttonPressedBackground = darken($TabbedPane.background,8%,derived noAutoInverse)
TabbedPane.closeBackground = null
TabbedPane.closeForeground = @disabledForeground
TabbedPane.closeHoverBackground = lighten($TabbedPane.background,5%,derived)
TabbedPane.closeHoverForeground = @foreground
TabbedPane.closePressedBackground = lighten($TabbedPane.background,10%,derived)
TabbedPane.closePressedForeground = $TabbedPane.closeHoverForeground
#---- Table ----
Table.gridColor = lighten($Table.background,5%)
#---- TableHeader ----
TableHeader.separatorColor = lighten($TableHeader.background,10%)
TableHeader.bottomSeparatorColor = $TableHeader.separatorColor
#---- TitlePane ----
TitlePane.embeddedForeground = darken($TitlePane.foreground,15%)
TitlePane.buttonHoverBackground = lighten($TitlePane.background,15%,derived)
TitlePane.buttonPressedBackground = lighten($TitlePane.background,10%,derived)
#---- ToggleButton ----
ToggleButton.selectedBackground = lighten($ToggleButton.background,10%,derived)
ToggleButton.disabledSelectedBackground = lighten($ToggleButton.background,3%,derived)
ToggleButton.toolbar.selectedBackground = lighten($ToggleButton.background,7%,derived)
#---- ToolTip ----
ToolTip.border = 4,6,4,6
ToolTip.background = shade(@background,50%)
#---- Tree ----
Tree.hash = lighten($Tree.background,5%)
#---- Styles ------------------------------------------------------------------
#---- inTextField ----
# for leading/trailing components in text fields
[style]Button.inTextField = \
focusable: false; \
toolbar.margin: 1,1,1,1; \
toolbar.spacingInsets: 1,1,1,1; \
toolbar.hoverBackground: fade(Actions.GreyInline,30%,lazy); \
toolbar.pressedBackground: fade(Actions.GreyInline,40%,lazy); \
toolbar.selectedBackground: fade(Actions.GreyInline,50%,lazy)

View File

@@ -0,0 +1,71 @@
#
# Copyright 2019 FormDev Software GmbH
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# This file is loaded for "FlatLaf IntelliJ" theme (that extend class FlatIntelliJLaf)
# and for all light IntelliJ Platform themes.
#
# Documentation:
# - https://www.formdev.com/flatlaf/properties-files/
# - https://www.formdev.com/flatlaf/how-to-customize/
#
# NOTE: Avoid copying the whole content of this file to own properties files.
# This will make upgrading to newer FlatLaf versions complex and error-prone.
# Instead copy and modify only those properties that you need to alter.
#
# Colors and style mostly based on IntelliJ theme from IntelliJ IDEA Community Edition,
# which is licensed under the Apache 2.0 license. Copyright 2000-2019 JetBrains s.r.o.
# See: https://github.com/JetBrains/intellij-community/
#---- variables ----
# accent colors (blueish)
@accentFocusColor = if(@accentColor, lighten(@accentColor,20%), lighten(@accentBaseColor,31%))
@accentButtonDefaultBackground = if(@accentColor, @accentColor, tint(@accentBaseColor,15%))
#---- Button ----
Button.focusedBackground = null
Button.default.background = @accentButtonDefaultBackground
Button.default.foreground = contrast($Button.default.background, tint($Button.foreground,50%), #fff, 50%)
Button.default.focusedBackground = null
Button.default.borderColor = shade($Button.default.background,15%)
Button.default.hoverBorderColor = tint($Button.default.background,50%)
Button.default.focusedBorderColor = $Button.default.hoverBorderColor
Button.default.boldText = true
Button.default.borderWidth = 1
#---- CheckBox ----
CheckBox.icon.style = filled
CheckBox.icon.focusWidth = null
CheckBox.icon.focusedBackground = null
#---- Component ----
Component.focusWidth = 2
Component.innerFocusWidth = 0
Component.innerOutlineWidth = 0
Component.arrowType = triangle
#---- RadioButton ----
RadioButton.icon.style = filled

View File

@@ -0,0 +1,924 @@
#
# Copyright 2019 FormDev Software GmbH
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# This file is loaded for all themes.
#
# Documentation:
# - https://www.formdev.com/flatlaf/properties-files/
# - https://www.formdev.com/flatlaf/how-to-customize/
#
# NOTE: Avoid copying the whole content of this file to own properties files.
# This will make upgrading to newer FlatLaf versions complex and error-prone.
# Instead copy and modify only those properties that you need to alter.
#
#---- typography / fonts ----
# headings
h00.font = +24
h0.font = +18
h1.font = +12 $semibold.font
h2.font = +6 $semibold.font
h3.font = +3 $semibold.font
h4.font = bold
h1.regular.font = +12
h2.regular.font = +6
h3.regular.font = +3
# text
large.font = +2
medium.font = -1
small.font = -2
mini.font = -3
# default font
#defaultFont = ...
# font weights
# Windows
[win]light.font = "Segoe UI Light"
[win]semibold.font = "Segoe UI Semibold"
# macOS
[mac]light.font = "HelveticaNeue-Thin"
[mac]semibold.font = "HelveticaNeue-Medium"
# Linux
[linux]light.font = "Lato Light", "Ubuntu Light", "Cantarell Light"
[linux]semibold.font = "Lato Semibold", "Ubuntu Medium", "Montserrat SemiBold"
# fallback for unknown platform
light.font = +0
semibold.font = +0
# monospaced
[win]monospaced.font = Consolas, "Courier New", Monospaced
[mac]monospaced.font = Menlo, Monospaced
[linux]monospaced.font = "Liberation Mono", "Ubuntu Mono", Monospaced
monospaced.font = Monospaced
# styles
[style].h00 = font: $h00.font
[style].h0 = font: $h0.font
[style].h1 = font: $h1.font
[style].h2 = font: $h2.font
[style].h3 = font: $h3.font
[style].h4 = font: $h4.font
[style].h1.regular = font: $h1.regular.font
[style].h2.regular = font: $h2.regular.font
[style].h3.regular = font: $h3.regular.font
[style].large = font: $large.font
[style].medium = font: $medium.font
[style].small = font: $small.font
[style].mini = font: $mini.font
[style].light = font: $light.font
[style].semibold = font: $semibold.font
[style].monospaced = font: $monospaced.font
#---- UI delegates ----
ButtonUI = com.formdev.flatlaf.ui.FlatButtonUI
CheckBoxUI = com.formdev.flatlaf.ui.FlatCheckBoxUI
CheckBoxMenuItemUI = com.formdev.flatlaf.ui.FlatCheckBoxMenuItemUI
ColorChooserUI = com.formdev.flatlaf.ui.FlatColorChooserUI
ComboBoxUI = com.formdev.flatlaf.ui.FlatComboBoxUI
DesktopIconUI = com.formdev.flatlaf.ui.FlatDesktopIconUI
DesktopPaneUI = com.formdev.flatlaf.ui.FlatDesktopPaneUI
EditorPaneUI = com.formdev.flatlaf.ui.FlatEditorPaneUI
FileChooserUI = com.formdev.flatlaf.ui.FlatFileChooserUI
FormattedTextFieldUI = com.formdev.flatlaf.ui.FlatFormattedTextFieldUI
InternalFrameUI = com.formdev.flatlaf.ui.FlatInternalFrameUI
LabelUI = com.formdev.flatlaf.ui.FlatLabelUI
ListUI = com.formdev.flatlaf.ui.FlatListUI
MenuUI = com.formdev.flatlaf.ui.FlatMenuUI
MenuBarUI = com.formdev.flatlaf.ui.FlatMenuBarUI
MenuItemUI = com.formdev.flatlaf.ui.FlatMenuItemUI
OptionPaneUI = com.formdev.flatlaf.ui.FlatOptionPaneUI
PanelUI = com.formdev.flatlaf.ui.FlatPanelUI
PasswordFieldUI = com.formdev.flatlaf.ui.FlatPasswordFieldUI
PopupMenuUI = com.formdev.flatlaf.ui.FlatPopupMenuUI
PopupMenuSeparatorUI = com.formdev.flatlaf.ui.FlatPopupMenuSeparatorUI
ProgressBarUI = com.formdev.flatlaf.ui.FlatProgressBarUI
RadioButtonUI = com.formdev.flatlaf.ui.FlatRadioButtonUI
RadioButtonMenuItemUI = com.formdev.flatlaf.ui.FlatRadioButtonMenuItemUI
RootPaneUI = com.formdev.flatlaf.ui.FlatRootPaneUI
ScrollBarUI = com.formdev.flatlaf.ui.FlatScrollBarUI
ScrollPaneUI = com.formdev.flatlaf.ui.FlatScrollPaneUI
SeparatorUI = com.formdev.flatlaf.ui.FlatSeparatorUI
SliderUI = com.formdev.flatlaf.ui.FlatSliderUI
SpinnerUI = com.formdev.flatlaf.ui.FlatSpinnerUI
SplitPaneUI = com.formdev.flatlaf.ui.FlatSplitPaneUI
TabbedPaneUI = com.formdev.flatlaf.ui.FlatTabbedPaneUI
TableUI = com.formdev.flatlaf.ui.FlatTableUI
TableHeaderUI = com.formdev.flatlaf.ui.FlatTableHeaderUI
TextAreaUI = com.formdev.flatlaf.ui.FlatTextAreaUI
TextFieldUI = com.formdev.flatlaf.ui.FlatTextFieldUI
TextPaneUI = com.formdev.flatlaf.ui.FlatTextPaneUI
ToggleButtonUI = com.formdev.flatlaf.ui.FlatToggleButtonUI
ToolBarUI = com.formdev.flatlaf.ui.FlatToolBarUI
ToolBarSeparatorUI = com.formdev.flatlaf.ui.FlatToolBarSeparatorUI
ToolTipUI = com.formdev.flatlaf.ui.FlatToolTipUI
TreeUI = com.formdev.flatlaf.ui.FlatTreeUI
ViewportUI = com.formdev.flatlaf.ui.FlatViewportUI
#---- variables ----
@componentMargin = 2,6,2,6
@menuItemMargin = 3,6,3,6
#---- wildcard replacements ----
*.background = @background
*.foreground = @foreground
*.disabledBackground = @disabledBackground
*.disabledForeground = @disabledForeground
*.disabledText = @disabledForeground
*.inactiveBackground = @disabledBackground
*.inactiveForeground = @disabledForeground
*.selectionBackground = @selectionBackground
*.selectionForeground = @selectionForeground
*.caretForeground = @foreground
*.acceleratorForeground = @menuAcceleratorForeground
*.acceleratorSelectionForeground = @menuAcceleratorSelectionForeground
#---- system colors ----
desktop = @componentBackground
activeCaptionText = @foreground
activeCaptionBorder = $activeCaption
inactiveCaptionText = @foreground
inactiveCaptionBorder = $inactiveCaption
window = @background
windowBorder = @foreground
windowText = @foreground
menu = @background
menuText = @foreground
text = @componentBackground
textText = @foreground
textHighlight = @selectionBackground
textHighlightText = @selectionForeground
textInactiveText = @disabledForeground
control = @background
controlText = @foreground
controlShadow = $Component.borderColor
scrollbar = $ScrollBar.track
info = $ToolTip.background
infoText = @foreground
#---- unused colors ----
# Colors that are defined in BasicLookAndFeel but are not used in FlatLaf.
# Keep them for compatibility (if used in 3rd party app) and give them useful values.
*.shadow = $controlShadow
*.darkShadow = $controlDkShadow
*.light = $controlHighlight
*.highlight = $controlLtHighlight
ComboBox.buttonShadow = $controlShadow
ComboBox.buttonDarkShadow = $controlDkShadow
ComboBox.buttonHighlight = $controlLtHighlight
InternalFrame.borderColor = $control
InternalFrame.borderShadow = $controlShadow
InternalFrame.borderDarkShadow = $controlDkShadow
InternalFrame.borderHighlight = $controlLtHighlight
InternalFrame.borderLight = $controlHighlight
Label.disabledShadow = $controlShadow
ScrollBar.trackHighlight = $controlDkShadow
ScrollBar.thumbHighlight = $controlLtHighlight
ScrollBar.thumbDarkShadow = $controlDkShadow
ScrollBar.thumbShadow = $controlShadow
Slider.focus = $controlDkShadow
TabbedPane.focus = $controlText
#---- Button ----
Button.border = com.formdev.flatlaf.ui.FlatButtonBorder
Button.arc = 6
Button.minimumWidth = 72
Button.margin = 2,14,2,14
Button.iconTextGap = 4
Button.rollover = true
Button.defaultButtonFollowsFocus = false
Button.borderWidth = 1
Button.default.borderWidth = 1
# for buttons in toolbars
Button.toolbar.margin = 3,3,3,3
Button.toolbar.spacingInsets = 1,2,1,2
#---- Caret ----
Caret.width = {scaledInteger}1
#---- CheckBox ----
CheckBox.border = com.formdev.flatlaf.ui.FlatMarginBorder
CheckBox.icon = com.formdev.flatlaf.icons.FlatCheckBoxIcon
CheckBox.arc = 4
CheckBox.margin = 2,2,2,2
CheckBox.iconTextGap = 4
CheckBox.rollover = true
#---- CheckBoxMenuItem ----
CheckBoxMenuItem.border = com.formdev.flatlaf.ui.FlatMenuItemBorder
CheckBoxMenuItem.checkIcon = com.formdev.flatlaf.icons.FlatCheckBoxMenuItemIcon
CheckBoxMenuItem.arrowIcon = com.formdev.flatlaf.icons.FlatMenuItemArrowIcon
CheckBoxMenuItem.margin = @menuItemMargin
CheckBoxMenuItem.opaque = false
CheckBoxMenuItem.borderPainted = true
CheckBoxMenuItem.background = @menuBackground
#---- ColorChooser ----
ColorChooser.swatchesSwatchSize = {scaledDimension}16,16
ColorChooser.swatchesRecentSwatchSize = {scaledDimension}16,16
ColorChooser.swatchesDefaultRecentColor = $control
#---- ComboBox ----
ComboBox.border = com.formdev.flatlaf.ui.FlatRoundBorder
ComboBox.padding = @componentMargin
ComboBox.minimumWidth = 72
ComboBox.editorColumns = 0
ComboBox.maximumRowCount = 15
[mac]ComboBox.showPopupOnNavigation = true
# allowed values: auto, button or none
ComboBox.buttonStyle = auto
ComboBox.background = @componentBackground
ComboBox.buttonBackground = $ComboBox.background
ComboBox.buttonEditableBackground = darken($ComboBox.background,2%)
ComboBox.buttonSeparatorColor = $Component.borderColor
ComboBox.buttonDisabledSeparatorColor = $Component.disabledBorderColor
ComboBox.buttonArrowColor = @buttonArrowColor
ComboBox.buttonDisabledArrowColor = @buttonDisabledArrowColor
ComboBox.buttonHoverArrowColor = @buttonHoverArrowColor
ComboBox.buttonPressedArrowColor = @buttonPressedArrowColor
#---- Component ----
Component.focusWidth = 0
Component.innerFocusWidth = 0.5
Component.innerOutlineWidth = 1
Component.borderWidth = 1
Component.arc = 5
Component.minimumWidth = 64
# allowed values: chevron or triangle
Component.arrowType = chevron
Component.hideMnemonics = true
#---- DesktopIcon ----
DesktopIcon.border = 4,4,4,4
DesktopIcon.iconSize = 64,64
DesktopIcon.closeSize = 20,20
DesktopIcon.closeIcon = com.formdev.flatlaf.icons.FlatInternalFrameCloseIcon
#---- EditorPane ----
EditorPane.border = com.formdev.flatlaf.ui.FlatMarginBorder
EditorPane.margin = @componentMargin
EditorPane.background = @componentBackground
#---- FileChooser ----
FileChooser.newFolderIcon = com.formdev.flatlaf.icons.FlatFileChooserNewFolderIcon
FileChooser.upFolderIcon = com.formdev.flatlaf.icons.FlatFileChooserUpFolderIcon
FileChooser.homeFolderIcon = com.formdev.flatlaf.icons.FlatFileChooserHomeFolderIcon
FileChooser.detailsViewIcon = com.formdev.flatlaf.icons.FlatFileChooserDetailsViewIcon
FileChooser.listViewIcon = com.formdev.flatlaf.icons.FlatFileChooserListViewIcon
FileChooser.usesSingleFilePane = true
[win]FileChooser.useSystemExtensionHiding = true
#---- FileView ----
FileView.directoryIcon = com.formdev.flatlaf.icons.FlatFileViewDirectoryIcon
FileView.fileIcon = com.formdev.flatlaf.icons.FlatFileViewFileIcon
FileView.computerIcon = com.formdev.flatlaf.icons.FlatFileViewComputerIcon
FileView.hardDriveIcon = com.formdev.flatlaf.icons.FlatFileViewHardDriveIcon
FileView.floppyDriveIcon = com.formdev.flatlaf.icons.FlatFileViewFloppyDriveIcon
#---- FormattedTextField ----
FormattedTextField.border = com.formdev.flatlaf.ui.FlatTextBorder
FormattedTextField.margin = @componentMargin
FormattedTextField.background = @componentBackground
FormattedTextField.placeholderForeground = @disabledForeground
FormattedTextField.iconTextGap = 4
#---- HelpButton ----
HelpButton.icon = com.formdev.flatlaf.icons.FlatHelpButtonIcon
HelpButton.borderColor = $Button.borderColor
HelpButton.disabledBorderColor = $Button.disabledBorderColor
HelpButton.focusedBorderColor = $Button.focusedBorderColor
HelpButton.hoverBorderColor = $?Button.hoverBorderColor
HelpButton.background = $Button.background
HelpButton.disabledBackground = $Button.disabledBackground
HelpButton.focusedBackground = $?Button.focusedBackground
HelpButton.hoverBackground = $?Button.hoverBackground
HelpButton.pressedBackground = $?Button.pressedBackground
HelpButton.borderWidth = $?Button.borderWidth
HelpButton.innerFocusWidth = $?Button.innerFocusWidth
#---- InternalFrame ----
InternalFrame.border = com.formdev.flatlaf.ui.FlatInternalFrameUI$FlatInternalFrameBorder
InternalFrame.borderLineWidth = 1
InternalFrame.borderMargins = 6,6,6,6
InternalFrame.buttonSize = 24,24
InternalFrame.closeIcon = com.formdev.flatlaf.icons.FlatInternalFrameCloseIcon
InternalFrame.iconifyIcon = com.formdev.flatlaf.icons.FlatInternalFrameIconifyIcon
InternalFrame.maximizeIcon = com.formdev.flatlaf.icons.FlatInternalFrameMaximizeIcon
InternalFrame.minimizeIcon = com.formdev.flatlaf.icons.FlatInternalFrameRestoreIcon
InternalFrame.windowBindings = null
# drop shadow
InternalFrame.dropShadowPainted = true
InternalFrame.activeDropShadowColor = null
InternalFrame.activeDropShadowInsets = 5,5,6,6
InternalFrame.inactiveDropShadowColor = null
InternalFrame.inactiveDropShadowInsets = 3,3,4,4
#---- InternalFrameTitlePane ----
InternalFrameTitlePane.border = 0,8,0,0
#---- List ----
List.border = 0,0,0,0
List.cellMargins = 1,6,1,6
List.cellFocusColor = @cellFocusColor
List.cellNoFocusBorder = com.formdev.flatlaf.ui.FlatListCellBorder$Default
List.focusCellHighlightBorder = com.formdev.flatlaf.ui.FlatListCellBorder$Focused
List.focusSelectedCellHighlightBorder = com.formdev.flatlaf.ui.FlatListCellBorder$Selected
List.background = @componentBackground
List.selectionInactiveBackground = @selectionInactiveBackground
List.selectionInactiveForeground = @selectionInactiveForeground
List.dropCellBackground = @dropCellBackground
List.dropCellForeground = @dropCellForeground
List.dropLineColor = @dropLineColor
List.showCellFocusIndicator = false
#---- Menu ----
Menu.border = com.formdev.flatlaf.ui.FlatMenuItemBorder
Menu.arrowIcon = com.formdev.flatlaf.icons.FlatMenuArrowIcon
Menu.checkIcon = null
Menu.margin = @menuItemMargin
Menu.submenuPopupOffsetX = {scaledInteger}-4
Menu.submenuPopupOffsetY = {scaledInteger}-4
Menu.opaque = false
Menu.borderPainted = true
Menu.background = @menuBackground
#---- MenuBar ----
MenuBar.border = com.formdev.flatlaf.ui.FlatMenuBarBorder
MenuBar.background = @menuBackground
MenuBar.hoverBackground = @menuHoverBackground
MenuBar.itemMargins = 3,8,3,8
#---- MenuItem ----
MenuItem.border = com.formdev.flatlaf.ui.FlatMenuItemBorder
MenuItem.arrowIcon = com.formdev.flatlaf.icons.FlatMenuItemArrowIcon
MenuItem.checkIcon = null
MenuItem.margin = @menuItemMargin
MenuItem.opaque = false
MenuItem.borderPainted = true
MenuItem.verticallyAlignText = true
MenuItem.background = @menuBackground
MenuItem.checkBackground = @menuCheckBackground
MenuItem.checkMargins = 2,2,2,2
MenuItem.minimumWidth = 72
MenuItem.minimumIconSize = 16,16
MenuItem.iconTextGap = 6
MenuItem.textAcceleratorGap = 24
MenuItem.textNoAcceleratorGap = 6
MenuItem.acceleratorArrowGap = 2
MenuItem.acceleratorDelimiter = +
[mac]MenuItem.acceleratorDelimiter =
# for MenuItem.selectionType = underline
MenuItem.underlineSelectionBackground = @menuHoverBackground
MenuItem.underlineSelectionCheckBackground = @menuCheckBackground
MenuItem.underlineSelectionColor = @accentUnderlineColor
MenuItem.underlineSelectionHeight = 3
#---- OptionPane ----
OptionPane.border = 12,12,12,12
OptionPane.messageAreaBorder = 0,0,0,0
OptionPane.buttonAreaBorder = 12,0,0,0
OptionPane.messageForeground = null
OptionPane.showIcon = false
OptionPane.maxCharactersPerLine = 80
OptionPane.iconMessageGap = 16
OptionPane.messagePadding = 3
OptionPane.buttonPadding = 8
OptionPane.buttonMinimumWidth = {scaledInteger}72
OptionPane.sameSizeButtons = true
OptionPane.setButtonMargin = false
OptionPane.buttonOrientation = 4
[mac]OptionPane.isYesLast = true
OptionPane.errorIcon = com.formdev.flatlaf.icons.FlatOptionPaneErrorIcon
OptionPane.informationIcon = com.formdev.flatlaf.icons.FlatOptionPaneInformationIcon
OptionPane.questionIcon = com.formdev.flatlaf.icons.FlatOptionPaneQuestionIcon
OptionPane.warningIcon = com.formdev.flatlaf.icons.FlatOptionPaneWarningIcon
#---- PasswordField ----
PasswordField.border = com.formdev.flatlaf.ui.FlatTextBorder
PasswordField.margin = @componentMargin
PasswordField.background = @componentBackground
PasswordField.placeholderForeground = @disabledForeground
PasswordField.iconTextGap = 4
PasswordField.echoChar = \u2022
PasswordField.showCapsLock = true
PasswordField.showRevealButton = false
PasswordField.capsLockIcon = com.formdev.flatlaf.icons.FlatCapsLockIcon
PasswordField.revealIcon = com.formdev.flatlaf.icons.FlatRevealIcon
PasswordField.revealIconColor = lazy(Actions.Grey)
#---- Popup ----
Popup.dropShadowPainted = true
Popup.dropShadowInsets = -4,-4,4,4
#---- PopupMenu ----
PopupMenu.border = com.formdev.flatlaf.ui.FlatPopupMenuBorder
PopupMenu.borderInsets = 4,1,4,1
PopupMenu.background = @menuBackground
#---- PopupMenuSeparator ----
PopupMenuSeparator.height = 9
PopupMenuSeparator.stripeWidth = 1
PopupMenuSeparator.stripeIndent = 4
#---- ProgressBar ----
ProgressBar.border = com.formdev.flatlaf.ui.FlatEmptyBorder
ProgressBar.arc = 4
ProgressBar.horizontalSize = 146,4
ProgressBar.verticalSize = 4,146
ProgressBar.cycleTime = 4000
ProgressBar.repaintInterval = 15
ProgressBar.font = -2
#---- RadioButton ----
RadioButton.border = com.formdev.flatlaf.ui.FlatMarginBorder
RadioButton.icon = com.formdev.flatlaf.icons.FlatRadioButtonIcon
RadioButton.icon.centerDiameter = 8
RadioButton.icon[filled].centerDiameter = 5
RadioButton.margin = 2,2,2,2
RadioButton.iconTextGap = 4
RadioButton.rollover = true
#---- RadioButtonMenuItem ----
RadioButtonMenuItem.border = com.formdev.flatlaf.ui.FlatMenuItemBorder
RadioButtonMenuItem.checkIcon = com.formdev.flatlaf.icons.FlatRadioButtonMenuItemIcon
RadioButtonMenuItem.arrowIcon = com.formdev.flatlaf.icons.FlatMenuItemArrowIcon
RadioButtonMenuItem.margin = @menuItemMargin
RadioButtonMenuItem.opaque = false
RadioButtonMenuItem.borderPainted = true
RadioButtonMenuItem.background = @menuBackground
#---- RootPane ----
RootPane.border = com.formdev.flatlaf.ui.FlatRootPaneUI$FlatWindowBorder
RootPane.borderDragThickness = 5
RootPane.cornerDragWidth = 16
RootPane.honorFrameMinimumSizeOnResize = false
RootPane.honorDialogMinimumSizeOnResize = true
#---- ScrollBar ----
ScrollBar.width = 10
ScrollBar.minimumThumbSize = 10,10
ScrollBar.maximumThumbSize = 100000,100000
ScrollBar.trackInsets = 0,0,0,0
ScrollBar.thumbInsets = 0,0,0,0
ScrollBar.trackArc = 0
ScrollBar.thumbArc = 0
ScrollBar.hoverThumbWithTrack = false
ScrollBar.pressedThumbWithTrack = false
ScrollBar.showButtons = false
ScrollBar.squareButtons = false
ScrollBar.buttonArrowColor = @buttonArrowColor
ScrollBar.buttonDisabledArrowColor = @buttonDisabledArrowColor
ScrollBar.allowsAbsolutePositioning = true
[mac]ScrollBar.minimumThumbSize = 18,18
[mac]ScrollBar.thumbInsets = 2,2,2,2
[mac]ScrollBar.thumbArc = 999
[mac]ScrollBar.hoverThumbWithTrack = true
[linux]ScrollBar.minimumThumbSize = 18,18
[linux]ScrollBar.thumbInsets = 2,2,2,2
[linux]ScrollBar.thumbArc = 999
#---- ScrollPane ----
ScrollPane.border = com.formdev.flatlaf.ui.FlatBorder
ScrollPane.background = $ScrollBar.track
ScrollPane.fillUpperCorner = true
ScrollPane.smoothScrolling = true
#---- SearchField ----
SearchField.searchIconColor = fade(Actions.GreyInline,90%,lazy)
SearchField.searchIconHoverColor = fade(Actions.GreyInline,70%,lazy)
SearchField.searchIconPressedColor = fade(Actions.GreyInline,50%,lazy)
SearchField.clearIconColor = fade(Actions.GreyInline,50%,lazy)
SearchField.clearIconHoverColor = $SearchField.clearIconColor
SearchField.clearIconPressedColor = fade(Actions.GreyInline,80%,lazy)
#---- Separator ----
Separator.height = 3
Separator.stripeWidth = 1
Separator.stripeIndent = 1
#---- Slider ----
Slider.focusInsets = 0,0,0,0
Slider.trackWidth = 2
Slider.thumbSize = 12,12
Slider.focusWidth = 4
#---- Spinner ----
Spinner.border = com.formdev.flatlaf.ui.FlatRoundBorder
Spinner.background = @componentBackground
Spinner.buttonBackground = darken($Spinner.background,2%)
Spinner.buttonSeparatorColor = $Component.borderColor
Spinner.buttonDisabledSeparatorColor = $Component.disabledBorderColor
Spinner.buttonArrowColor = @buttonArrowColor
Spinner.buttonDisabledArrowColor = @buttonDisabledArrowColor
Spinner.buttonHoverArrowColor = @buttonHoverArrowColor
Spinner.buttonPressedArrowColor = @buttonPressedArrowColor
Spinner.padding = @componentMargin
Spinner.editorBorderPainted = false
# allowed values: button or none
Spinner.buttonStyle = button
#---- SplitPane ----
SplitPane.dividerSize = 5
SplitPane.continuousLayout = true
SplitPane.border = null
SplitPane.centerOneTouchButtons = true
SplitPane.oneTouchButtonSize = {scaledInteger}6
SplitPane.oneTouchButtonOffset = {scaledInteger}2
SplitPaneDivider.border = null
SplitPaneDivider.oneTouchArrowColor = @buttonArrowColor
SplitPaneDivider.oneTouchHoverArrowColor = @buttonHoverArrowColor
SplitPaneDivider.oneTouchPressedArrowColor = @buttonPressedArrowColor
# allowed values: grip or plain
SplitPaneDivider.style = grip
SplitPaneDivider.gripColor = @icon
SplitPaneDivider.gripDotCount = 3
SplitPaneDivider.gripDotSize = 3
SplitPaneDivider.gripGap = 2
#---- TabbedPane ----
TabbedPane.tabHeight = 32
TabbedPane.tabSelectionHeight = 3
TabbedPane.cardTabSelectionHeight = 2
TabbedPane.contentSeparatorHeight = 1
TabbedPane.showTabSeparators = false
TabbedPane.tabSeparatorsFullHeight = false
TabbedPane.hasFullBorder = false
TabbedPane.tabInsets = 4,12,4,12
TabbedPane.tabAreaInsets = 0,0,0,0
TabbedPane.selectedTabPadInsets = 0,0,0,0
TabbedPane.tabRunOverlay = 0
TabbedPane.tabsOverlapBorder = false
TabbedPane.disabledForeground = @disabledForeground
TabbedPane.shadow = @background
TabbedPane.contentBorderInsets = null
# allowed values: moreTabsButton or arrowButtons
TabbedPane.hiddenTabsNavigation = moreTabsButton
# allowed values: leading, trailing, center or fill
TabbedPane.tabAreaAlignment = leading
# allowed values: leading, trailing or center
TabbedPane.tabAlignment = center
# allowed values: preferred, equal or compact
TabbedPane.tabWidthMode = preferred
# allowed values: underlined or card
TabbedPane.tabType = underlined
# allowed values: chevron or triangle
TabbedPane.arrowType = chevron
TabbedPane.buttonInsets = 2,1,2,1
TabbedPane.buttonArc = $Button.arc
# allowed values: wrap or scroll
#TabbedPane.tabLayoutPolicy = scroll
# allowed values: never or asNeeded
TabbedPane.tabsPopupPolicy = asNeeded
# allowed values: never, asNeeded or asNeededSingle
TabbedPane.scrollButtonsPolicy = asNeededSingle
# allowed values: both or trailing
TabbedPane.scrollButtonsPlacement = both
TabbedPane.closeIcon = com.formdev.flatlaf.icons.FlatTabbedPaneCloseIcon
TabbedPane.closeSize = 16,16
TabbedPane.closeArc = 4
TabbedPane.closeCrossPlainSize = 7.5
TabbedPane.closeCrossFilledSize = $TabbedPane.closeCrossPlainSize
TabbedPane.closeCrossLineWidth = 1
#---- Table ----
Table.rowHeight = 20
Table.showHorizontalLines = false
Table.showVerticalLines = false
Table.showTrailingVerticalLine = false
Table.consistentHomeEndKeyBehavior = true
Table.intercellSpacing = 0,0
Table.scrollPaneBorder = com.formdev.flatlaf.ui.FlatBorder
Table.ascendingSortIcon = com.formdev.flatlaf.icons.FlatAscendingSortIcon
Table.descendingSortIcon = com.formdev.flatlaf.icons.FlatDescendingSortIcon
Table.sortIconColor = @icon
Table.cellMargins = 2,3,2,3
Table.cellFocusColor = @cellFocusColor
Table.cellNoFocusBorder = com.formdev.flatlaf.ui.FlatTableCellBorder$Default
Table.focusCellHighlightBorder = com.formdev.flatlaf.ui.FlatTableCellBorder$Focused
Table.focusSelectedCellHighlightBorder = com.formdev.flatlaf.ui.FlatTableCellBorder$Selected
Table.focusCellBackground = $Table.background
Table.focusCellForeground = $Table.foreground
Table.background = @componentBackground
Table.selectionInactiveBackground = @selectionInactiveBackground
Table.selectionInactiveForeground = @selectionInactiveForeground
Table.dropCellBackground = @dropCellBackground
Table.dropCellForeground = @dropCellForeground
Table.dropLineColor = @dropLineColor
Table.dropLineShortColor = @dropLineShortColor
#---- TableHeader ----
TableHeader.height = 25
TableHeader.cellBorder = com.formdev.flatlaf.ui.FlatTableHeaderBorder
TableHeader.cellMargins = 2,3,2,3
TableHeader.focusCellBackground = $TableHeader.background
TableHeader.background = @componentBackground
TableHeader.showTrailingVerticalLine = false
#---- TextArea ----
TextArea.border = com.formdev.flatlaf.ui.FlatMarginBorder
TextArea.margin = @componentMargin
TextArea.background = @componentBackground
#---- TextComponent ----
# allowed values: never, once or always
TextComponent.selectAllOnFocusPolicy = once
TextComponent.selectAllOnMouseClick = false
TextComponent.arc = 0
#---- TextField ----
TextField.border = com.formdev.flatlaf.ui.FlatTextBorder
TextField.margin = @componentMargin
TextField.background = @componentBackground
TextField.placeholderForeground = @disabledForeground
TextField.iconTextGap = 4
#---- TextPane ----
TextPane.border = com.formdev.flatlaf.ui.FlatMarginBorder
TextPane.margin = @componentMargin
TextPane.background = @componentBackground
#---- TitledBorder ----
TitledBorder.titleColor = @foreground
TitledBorder.border = 1,1,1,1,$Separator.foreground
#---- TitlePane ----
TitlePane.useWindowDecorations = true
TitlePane.menuBarEmbedded = true
TitlePane.unifiedBackground = true
TitlePane.showIcon = true
TitlePane.noIconLeftGap = 8
TitlePane.iconSize = 16,16
TitlePane.iconMargins = 3,8,3,8
TitlePane.titleMargins = 3,0,3,0
TitlePane.buttonSize = 44,30
TitlePane.buttonMaximizedHeight = 22
TitlePane.centerTitle = false
TitlePane.centerTitleIfMenuBarEmbedded = true
TitlePane.menuBarTitleGap = 20
TitlePane.closeIcon = com.formdev.flatlaf.icons.FlatWindowCloseIcon
TitlePane.iconifyIcon = com.formdev.flatlaf.icons.FlatWindowIconifyIcon
TitlePane.maximizeIcon = com.formdev.flatlaf.icons.FlatWindowMaximizeIcon
TitlePane.restoreIcon = com.formdev.flatlaf.icons.FlatWindowRestoreIcon
TitlePane.background = $MenuBar.background
TitlePane.inactiveBackground = $TitlePane.background
TitlePane.foreground = @foreground
TitlePane.inactiveForeground = @disabledForeground
TitlePane.closeHoverBackground = #c42b1c
TitlePane.closePressedBackground = fade($TitlePane.closeHoverBackground,90%)
TitlePane.closeHoverForeground = #fff
TitlePane.closePressedForeground = #fff
#---- ToggleButton ----
ToggleButton.border = $Button.border
ToggleButton.margin = $Button.margin
ToggleButton.iconTextGap = $Button.iconTextGap
ToggleButton.rollover = $Button.rollover
ToggleButton.background = $Button.background
ToggleButton.pressedBackground = $Button.pressedBackground
ToggleButton.selectedForeground = $ToggleButton.foreground
ToggleButton.toolbar.hoverBackground = $Button.toolbar.hoverBackground
ToggleButton.toolbar.pressedBackground = $Button.toolbar.pressedBackground
# button type "tab"
ToggleButton.tab.underlineHeight = 2
ToggleButton.tab.underlineColor = $TabbedPane.underlineColor
ToggleButton.tab.disabledUnderlineColor = $TabbedPane.disabledUnderlineColor
ToggleButton.tab.selectedBackground = $?TabbedPane.selectedBackground
ToggleButton.tab.hoverBackground = $TabbedPane.hoverColor
ToggleButton.tab.focusBackground = $TabbedPane.focusColor
#---- ToolBar ----
ToolBar.border = com.formdev.flatlaf.ui.FlatToolBarBorder
ToolBar.borderMargins = 2,2,2,2
ToolBar.isRollover = true
ToolBar.focusableButtons = false
ToolBar.arrowKeysOnlyNavigation = true
ToolBar.floatable = false
ToolBar.gripColor = @icon
ToolBar.dockingBackground = darken($ToolBar.background,5%)
ToolBar.dockingForeground = $Component.borderColor
ToolBar.floatingBackground = $ToolBar.background
ToolBar.floatingForeground = $Component.borderColor
ToolBar.separatorSize = null
ToolBar.separatorWidth = 7
ToolBar.separatorColor = $Separator.foreground
# not used in FlatLaf; intended for custom components in toolbar
# https://github.com/JFormDesigner/FlatLaf/issues/56#issuecomment-586297814
ToolBar.spacingBorder = $Button.toolbar.spacingInsets
#---- ToolTipManager ----
ToolTipManager.enableToolTipMode = activeApplication
#---- Tree ----
Tree.border = 1,1,1,1
Tree.editorBorder = 1,1,1,1,@cellFocusColor
Tree.background = @componentBackground
Tree.selectionInactiveBackground = @selectionInactiveBackground
Tree.selectionInactiveForeground = @selectionInactiveForeground
Tree.textBackground = $Tree.background
Tree.textForeground = $Tree.foreground
Tree.selectionBorderColor = @cellFocusColor
Tree.dropCellBackground = @dropCellBackground
Tree.dropCellForeground = @dropCellForeground
Tree.dropLineColor = @dropLineColor
Tree.rendererFillBackground = false
Tree.rendererMargins = 1,2,1,2
Tree.wideSelection = true
Tree.repaintWholeRow = true
Tree.paintLines = false
Tree.showCellFocusIndicator = false
Tree.leftChildIndent = 7
Tree.rightChildIndent = 11
Tree.rowHeight = 0
Tree.expandedIcon = com.formdev.flatlaf.icons.FlatTreeExpandedIcon
Tree.collapsedIcon = com.formdev.flatlaf.icons.FlatTreeCollapsedIcon
Tree.leafIcon = com.formdev.flatlaf.icons.FlatTreeLeafIcon
Tree.closedIcon = com.formdev.flatlaf.icons.FlatTreeClosedIcon
Tree.openIcon = com.formdev.flatlaf.icons.FlatTreeOpenIcon
Tree.icon.expandedColor = @icon
Tree.icon.collapsedColor = @icon
Tree.icon.leafColor = @icon
Tree.icon.closedColor = @icon
Tree.icon.openColor = @icon
#---- Styles ------------------------------------------------------------------
#---- inTextField ----
# for leading/trailing components in text fields
[style]ToggleButton.inTextField = $[style]Button.inTextField
[style]ToolBar.inTextField = \
floatable: false; \
opaque: false; \
borderMargins: 0,0,0,0
[style]ToolBarSeparator.inTextField = \
separatorWidth: 3
#---- clearButton ----
# for clear/cancel button in text fields
[style]Button.clearButton = \
icon: com.formdev.flatlaf.icons.FlatClearIcon; \
focusable: false; \
toolbar.margin: 1,1,1,1; \
toolbar.spacingInsets: 1,1,1,1; \
toolbar.hoverBackground: null; \
toolbar.pressedBackground: null

View File

@@ -0,0 +1,379 @@
#
# Copyright 2019 FormDev Software GmbH
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# This file is loaded for all light themes (that extend class FlatLightLaf).
#
# Documentation:
# - https://www.formdev.com/flatlaf/properties-files/
# - https://www.formdev.com/flatlaf/how-to-customize/
#
# NOTE: Avoid copying the whole content of this file to own properties files.
# This will make upgrading to newer FlatLaf versions complex and error-prone.
# Instead copy and modify only those properties that you need to alter.
#
# Colors and style mostly based on IntelliJ theme from IntelliJ IDEA Community Edition,
# which is licensed under the Apache 2.0 license. Copyright 2000-2019 JetBrains s.r.o.
# See: https://github.com/JetBrains/intellij-community/
#---- variables ----
# general background and foreground (text color)
@background = #f2f2f2
@foreground = #000
@disabledBackground = @background
@disabledForeground = tint(@foreground,55%)
# component background
@buttonBackground = lighten(@background,5%)
@componentBackground = lighten(@background,5%)
@menuBackground = lighten(@background,5%)
# selection
@selectionBackground = @accentSelectionBackground
@selectionForeground = contrast(@selectionBackground, @foreground, #fff)
@selectionInactiveBackground = shade(@background,13%)
@selectionInactiveForeground = @foreground
# menu
@menuHoverBackground = darken(@menuBackground,10%,derived)
@menuCheckBackground = lighten(@selectionBackground,40%,derived noAutoInverse)
@menuAcceleratorForeground = lighten(@foreground,30%)
@menuAcceleratorSelectionForeground = @selectionForeground
# misc
@cellFocusColor = #000
@icon = shade(@background,27%)
# accent colors (blueish)
# set @accentColor to use single accent color or
# modify @accentBaseColor to use variations of accent base color
@accentColor = null
@accentBaseColor = #2675BF
@accentBase2Color = lighten(saturate(@accentBaseColor,10%),6%)
# accent color variations
@accentCheckmarkColor = if(@accentColor, @accentColor, tint(@accentBase2Color,20%))
@accentFocusColor = if(@accentColor, @accentColor, lighten(@accentBaseColor,31%))
@accentLinkColor = if(@accentColor, @accentColor, darken(@accentBaseColor,3%))
@accentSelectionBackground = if(@accentColor, @accentColor, @accentBaseColor)
@accentSliderColor = if(@accentColor, @accentColor, @accentBase2Color)
@accentUnderlineColor = if(@accentColor, @accentColor, tint(@accentBaseColor,10%))
@accentButtonDefaultBorderColor = if(@accentColor, @accentColor, tint(@accentBase2Color,20%))
# for buttons within components (e.g. combobox or spinner)
@buttonArrowColor = tint(@foreground,40%)
@buttonDisabledArrowColor = lighten(@buttonArrowColor,25%)
@buttonHoverArrowColor = lighten(@buttonArrowColor,20%,derived noAutoInverse)
@buttonPressedArrowColor = lighten(@buttonArrowColor,30%,derived noAutoInverse)
# Drop (use lazy colors for IntelliJ platform themes, which usually do not specify these colors)
@dropCellBackground = lighten(List.selectionBackground,10%,lazy)
@dropCellForeground = lazy(List.selectionForeground)
@dropLineColor = lighten(List.selectionBackground,20%,lazy)
@dropLineShortColor = darken(List.selectionBackground,20%,lazy)
#---- system colors ----
activeCaption = #99b4d1
inactiveCaption = #bfcddb
controlHighlight = lighten($controlShadow,12%)
controlLtHighlight = lighten($controlShadow,25%)
controlDkShadow = darken($controlShadow,15%)
#---- Button ----
Button.background = @buttonBackground
Button.focusedBackground = changeLightness($Component.focusColor,95%)
Button.hoverBackground = darken($Button.background,3%,derived)
Button.pressedBackground = darken($Button.background,10%,derived)
Button.selectedBackground = darken($Button.background,20%,derived)
Button.selectedForeground = $Button.foreground
Button.disabledSelectedBackground = darken($Button.background,13%,derived)
Button.borderColor = $Component.borderColor
Button.disabledBorderColor = $Component.disabledBorderColor
Button.focusedBorderColor = $Component.focusedBorderColor
Button.hoverBorderColor = $Button.focusedBorderColor
Button.innerFocusWidth = 0
Button.default.background = $Button.background
Button.default.foreground = $Button.foreground
Button.default.focusedBackground = $Button.focusedBackground
Button.default.hoverBackground = darken($Button.default.background,3%,derived)
Button.default.pressedBackground = darken($Button.default.background,10%,derived)
Button.default.borderColor = @accentButtonDefaultBorderColor
Button.default.hoverBorderColor = $Button.hoverBorderColor
Button.default.focusedBorderColor = $Button.focusedBorderColor
Button.default.focusColor = $Component.focusColor
Button.default.borderWidth = 2
Button.toolbar.hoverBackground = darken($Button.background,12%,derived)
Button.toolbar.pressedBackground = darken($Button.background,15%,derived)
Button.toolbar.selectedBackground = $Button.selectedBackground
#---- CheckBox ----
CheckBox.icon.focusWidth = 1
# enabled
CheckBox.icon.borderColor = shade($Component.borderColor,10%)
CheckBox.icon.background = @buttonBackground
CheckBox.icon.selectedBorderColor = $CheckBox.icon.checkmarkColor
CheckBox.icon.selectedBackground = $CheckBox.icon.background
CheckBox.icon.checkmarkColor = @accentCheckmarkColor
# disabled
CheckBox.icon.disabledBorderColor = tint($CheckBox.icon.borderColor,20%)
CheckBox.icon.disabledBackground = @disabledBackground
CheckBox.icon.disabledCheckmarkColor = lighten(changeSaturation($CheckBox.icon.checkmarkColor,0%),5%)
# focused
CheckBox.icon.focusedBorderColor = shade($Component.focusedBorderColor,10%)
CheckBox.icon.focusedBackground = changeLightness($Component.focusColor,95%)
# hover
CheckBox.icon.hoverBorderColor = $CheckBox.icon.focusedBorderColor
CheckBox.icon.hoverBackground = darken($CheckBox.icon.background,3%,derived)
# pressed
CheckBox.icon.pressedBorderColor = $CheckBox.icon.focusedBorderColor
CheckBox.icon.pressedBackground = darken($CheckBox.icon.background,10%,derived)
# used if CheckBox.icon.style or RadioButton.icon.style = filled
# enabled
CheckBox.icon[filled].selectedBorderColor = shade($CheckBox.icon[filled].selectedBackground,5%)
CheckBox.icon[filled].selectedBackground = @accentCheckmarkColor
CheckBox.icon[filled].checkmarkColor = @buttonBackground
# focused
CheckBox.icon[filled].focusedSelectedBorderColor = tint($CheckBox.icon[filled].selectedBackground,50%)
CheckBox.icon[filled].focusedSelectedBackground = $CheckBox.icon[filled].selectedBackground
CheckBox.icon[filled].focusedCheckmarkColor = $CheckBox.icon.focusedBackground
# hover
CheckBox.icon[filled].hoverSelectedBackground = darken($CheckBox.icon[filled].selectedBackground,5%,derived)
# pressed
CheckBox.icon[filled].pressedSelectedBackground = darken($CheckBox.icon[filled].selectedBackground,10%,derived)
#---- CheckBoxMenuItem ----
CheckBoxMenuItem.icon.checkmarkColor = @accentCheckmarkColor
CheckBoxMenuItem.icon.disabledCheckmarkColor = @buttonDisabledArrowColor
#---- Component ----
Component.borderColor = shade(@background,20%)
Component.disabledBorderColor = tint($Component.borderColor,20%)
Component.focusedBorderColor = shade($Component.focusColor,10%)
Component.focusColor = @accentFocusColor
Component.linkColor = @accentLinkColor
Component.accentColor = if(@accentColor, @accentColor, @accentBaseColor)
Component.grayFilter = 25,-25,100
Component.error.borderColor = lighten(desaturate($Component.error.focusedBorderColor,20%),25%)
Component.error.focusedBorderColor = #e53e4d
Component.warning.borderColor = lighten(saturate($Component.warning.focusedBorderColor,25%),20%)
Component.warning.focusedBorderColor = #e2a53a
Component.custom.borderColor = lighten(desaturate(#f00,20%,derived noAutoInverse),25%,derived noAutoInverse)
#---- Desktop ----
Desktop.background = #E6EBF0
#---- DesktopIcon ----
DesktopIcon.background = darken($Desktop.background,10%,derived)
#---- HelpButton ----
HelpButton.questionMarkColor = @accentCheckmarkColor
HelpButton.disabledQuestionMarkColor = shade(@background,30%)
#---- InternalFrame ----
InternalFrame.activeTitleBackground = #fff
InternalFrame.activeTitleForeground = @foreground
InternalFrame.inactiveTitleBackground = darken($InternalFrame.activeTitleBackground,2%)
InternalFrame.inactiveTitleForeground = @disabledForeground
InternalFrame.activeBorderColor = shade(@background,40%)
InternalFrame.inactiveBorderColor = shade(@background,20%)
InternalFrame.buttonHoverBackground = darken($InternalFrame.activeTitleBackground,10%,derived)
InternalFrame.buttonPressedBackground = darken($InternalFrame.activeTitleBackground,20%,derived)
InternalFrame.closeHoverBackground = lazy(Actions.Red)
InternalFrame.closePressedBackground = darken(Actions.Red,10%,lazy)
InternalFrame.closeHoverForeground = #fff
InternalFrame.closePressedForeground = #fff
InternalFrame.activeDropShadowOpacity = 0.25
InternalFrame.inactiveDropShadowOpacity = 0.5
#---- Menu ----
Menu.icon.arrowColor = @buttonArrowColor
Menu.icon.disabledArrowColor = @buttonDisabledArrowColor
#---- MenuBar ----
MenuBar.borderColor = $Separator.foreground
#---- PasswordField ----
PasswordField.capsLockIconColor = #00000064
#---- Popup ----
Popup.dropShadowColor = #000
Popup.dropShadowOpacity = 0.15
#---- PopupMenu ----
PopupMenu.borderColor = shade(@background,28%)
#---- ProgressBar ----
ProgressBar.background = darken(@background,13%)
ProgressBar.foreground = @accentSliderColor
ProgressBar.selectionBackground = @foreground
ProgressBar.selectionForeground = contrast($ProgressBar.foreground, @foreground, @componentBackground)
#---- RootPane ----
RootPane.activeBorderColor = darken(@background,50%,derived)
RootPane.inactiveBorderColor = darken(@background,30%,derived)
#---- ScrollBar ----
ScrollBar.track = lighten(@background,1%,derived noAutoInverse)
ScrollBar.thumb = darken($ScrollBar.track,10%,derived noAutoInverse)
ScrollBar.hoverTrackColor = darken($ScrollBar.track,3%,derived noAutoInverse)
ScrollBar.hoverThumbColor = darken($ScrollBar.thumb,10%,derived noAutoInverse)
ScrollBar.pressedThumbColor = darken($ScrollBar.thumb,20%,derived noAutoInverse)
ScrollBar.hoverButtonBackground = darken(@background,5%,derived noAutoInverse)
ScrollBar.pressedButtonBackground = darken(@background,10%,derived noAutoInverse)
#---- Separator ----
Separator.foreground = shade(@background,15%)
#---- Slider ----
Slider.trackValueColor = @accentSliderColor
Slider.trackColor = darken(@background,18%)
Slider.thumbColor = $Slider.trackValueColor
Slider.tickColor = @disabledForeground
Slider.focusedColor = fade(changeLightness($Component.focusColor,75%,derived),50%,derived)
Slider.hoverThumbColor = darken($Slider.thumbColor,5%,derived)
Slider.pressedThumbColor = darken($Slider.thumbColor,8%,derived)
Slider.disabledTrackColor = darken(@background,13%)
Slider.disabledThumbColor = $Slider.disabledTrackColor
#---- SplitPane ----
SplitPaneDivider.draggingColor = $Component.borderColor
#---- TabbedPane ----
TabbedPane.underlineColor = @accentUnderlineColor
TabbedPane.disabledUnderlineColor = darken(@background,28%)
TabbedPane.hoverColor = darken($TabbedPane.background,7%,derived)
TabbedPane.focusColor = mix(@selectionBackground,$TabbedPane.background,10%)
TabbedPane.contentAreaColor = $Component.borderColor
TabbedPane.buttonHoverBackground = darken($TabbedPane.background,7%,derived)
TabbedPane.buttonPressedBackground = darken($TabbedPane.background,10%,derived)
TabbedPane.closeBackground = null
TabbedPane.closeForeground = @disabledForeground
TabbedPane.closeHoverBackground = darken($TabbedPane.background,20%,derived)
TabbedPane.closeHoverForeground = @foreground
TabbedPane.closePressedBackground = darken($TabbedPane.background,25%,derived)
TabbedPane.closePressedForeground = $TabbedPane.closeHoverForeground
#---- Table ----
Table.gridColor = darken($Table.background,5%)
#---- TableHeader ----
TableHeader.separatorColor = darken($TableHeader.background,10%)
TableHeader.bottomSeparatorColor = $TableHeader.separatorColor
#---- TitlePane ----
TitlePane.embeddedForeground = lighten($TitlePane.foreground,35%)
TitlePane.buttonHoverBackground = darken($TitlePane.background,10%,derived)
TitlePane.buttonPressedBackground = darken($TitlePane.background,8%,derived)
#---- ToggleButton ----
ToggleButton.selectedBackground = darken($ToggleButton.background,20%,derived)
ToggleButton.disabledSelectedBackground = darken($ToggleButton.background,13%,derived)
ToggleButton.toolbar.selectedBackground = $ToggleButton.selectedBackground
#---- ToolTip ----
ToolTip.border = 4,6,4,6,shade(@background,40%)
ToolTip.background = lighten(@background,3%)
#---- Tree ----
Tree.hash = darken($Tree.background,10%)
#---- Styles ------------------------------------------------------------------
#---- inTextField ----
# for leading/trailing components in text fields
[style]Button.inTextField = \
focusable: false; \
toolbar.margin: 1,1,1,1; \
toolbar.spacingInsets: 1,1,1,1; \
toolbar.hoverBackground: fade(Actions.GreyInline,10%,lazy); \
toolbar.pressedBackground: fade(Actions.GreyInline,20%,lazy); \
toolbar.selectedBackground: fade(Actions.GreyInline,30%,lazy)

View File

@@ -0,0 +1,260 @@
#
# Copyright 2019 FormDev Software GmbH
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# This file is loaded for all IntelliJ Platform themes.
#
# Documentation:
# - https://www.formdev.com/flatlaf/properties-files/
# - https://www.formdev.com/flatlaf/how-to-customize/
#
#---- system colors ----
# fix (most) system colors because they are usually not set in .json files
desktop = lazy(TextField.background)
activeCaptionText = lazy(TextField.foreground)
inactiveCaptionText = lazy(TextField.foreground)
window = lazy(Panel.background)
windowBorder = lazy(TextField.foreground)
windowText = lazy(TextField.foreground)
menu = lazy(Menu.background)
menuText = lazy(Menu.foreground)
text = lazy(TextField.background)
textText = lazy(TextField.foreground)
textHighlight = lazy(TextField.selectionBackground)
textHighlightText = lazy(TextField.selectionForeground)
textInactiveText = lazy(TextField.inactiveForeground)
control = lazy(Panel.background)
controlText = lazy(TextField.foreground)
info = lazy(ToolTip.background)
infoText = lazy(ToolTip.foreground)
#---- Button ----
Button.startBackground = $Button.background
Button.endBackground = $Button.background
Button.startBorderColor = $Button.borderColor
Button.endBorderColor = $Button.borderColor
Button.default.startBackground = $Button.default.background
Button.default.endBackground = $Button.default.background
Button.default.startBorderColor = $Button.default.borderColor
Button.default.endBorderColor = $Button.default.borderColor
Button.hoverBorderColor = null
Button.default.hoverBorderColor = null
#---- CheckBoxMenuItem ----
# colors from intellij/checkmark.svg and darcula/checkmark.svg
[light]CheckBoxMenuItem.icon.checkmarkColor=#3E3E3C
[dark]CheckBoxMenuItem.icon.checkmarkColor=#fff9
#---- HelpButton ----
HelpButton.hoverBorderColor = null
#---- Slider ----
Slider.focusedColor = fade($Component.focusColor,40%,derived)
#---- ToggleButton ----
ToggleButton.startBackground = $ToggleButton.background
ToggleButton.endBackground = $ToggleButton.background
[dark]ToggleButton.selectedBackground = lighten($ToggleButton.background,15%,derived)
[dark]ToggleButton.disabledSelectedBackground = lighten($ToggleButton.background,5%,derived)
#---- theme specific ----
@ijMenuCheckBackgroundL10 = lighten(@selectionBackground,10%,derived noAutoInverse)
@ijMenuCheckBackgroundL20 = lighten(@selectionBackground,20%,derived noAutoInverse)
@ijMenuCheckBackgroundD10 = darken(@selectionBackground,10%,derived noAutoInverse)
[Arc_Theme]CheckBoxMenuItem.foreground = lazy(MenuItem.foreground)
[Arc_Theme]PopupMenu.foreground = lazy(MenuItem.foreground)
[Arc_Theme]RadioButtonMenuItem.foreground = lazy(MenuItem.foreground)
[Arc_Theme]ProgressBar.selectionBackground = #000
[Arc_Theme]ProgressBar.selectionForeground = #fff
[Arc_Theme]List.selectionInactiveForeground = #fff
[Arc_Theme]Table.selectionInactiveForeground = #fff
[Arc_Theme]Tree.selectionInactiveForeground = #fff
[Arc_Theme_-_Orange]CheckBoxMenuItem.foreground = lazy(MenuItem.foreground)
[Arc_Theme_-_Orange]PopupMenu.foreground = lazy(MenuItem.foreground)
[Arc_Theme_-_Orange]RadioButtonMenuItem.foreground = lazy(MenuItem.foreground)
[Arc_Theme_-_Orange]ProgressBar.selectionBackground = #000
[Arc_Theme_-_Orange]ProgressBar.selectionForeground = #fff
[Arc_Theme_-_Orange]List.selectionInactiveForeground = #fff
[Arc_Theme_-_Orange]Table.selectionInactiveForeground = #fff
[Arc_Theme_-_Orange]Tree.selectionInactiveForeground = #fff
[Arc_Theme_Dark]CheckBoxMenuItem.foreground = lazy(MenuItem.foreground)
[Arc_Theme_Dark]PopupMenu.foreground = lazy(MenuItem.foreground)
[Arc_Theme_Dark]RadioButtonMenuItem.foreground = lazy(MenuItem.foreground)
[Arc_Theme_Dark]ProgressBar.selectionBackground = #ddd
[Arc_Theme_Dark]ProgressBar.selectionForeground = #ddd
[Arc_Theme_Dark_-_Orange]CheckBoxMenuItem.foreground = lazy(MenuItem.foreground)
[Arc_Theme_Dark_-_Orange]PopupMenu.foreground = lazy(MenuItem.foreground)
[Arc_Theme_Dark_-_Orange]RadioButtonMenuItem.foreground = lazy(MenuItem.foreground)
[Arc_Theme_Dark_-_Orange]ProgressBar.selectionBackground = #ddd
[Arc_Theme_Dark_-_Orange]ProgressBar.selectionForeground = #fff
[Cobalt_2]CheckBox.icon.background = #002946
[Cobalt_2]CheckBox.icon.checkmarkColor = #002946
[Cobalt_2]MenuItem.checkBackground = @ijMenuCheckBackgroundL10
[Cobalt_2]MenuItem.underlineSelectionCheckBackground = @ijMenuCheckBackgroundL10
[Cyan_light]MenuItem.checkBackground = @ijMenuCheckBackgroundL20
[Cyan_light]MenuItem.underlineSelectionCheckBackground = @ijMenuCheckBackgroundL20
[Dark_Flat_Theme]TableHeader.background = #3B3B3B
[Dark_purple]Slider.focusedColor = fade($Component.focusColor,70%,derived)
[Dracula---Zihan_Ma]ProgressBar.selectionBackground = #fff
[Dracula---Zihan_Ma]ProgressBar.selectionForeground = #fff
[Gradianto_Dark_Fuchsia]MenuItem.checkBackground = @ijMenuCheckBackgroundL10
[Gradianto_Dark_Fuchsia]MenuItem.underlineSelectionCheckBackground = @ijMenuCheckBackgroundL10
[Gruvbox_Dark_Hard]ToggleButton.selectedBackground = $ToggleButton.selectedBackground
[Gruvbox_Dark_Hard]ToggleButton.toolbar.selectedBackground = $ToggleButton.toolbar.selectedBackground
[Gruvbox_Dark_Medium]ToggleButton.selectedBackground = $ToggleButton.selectedBackground
[Gruvbox_Dark_Medium]ToggleButton.toolbar.selectedBackground = $ToggleButton.toolbar.selectedBackground
[Gruvbox_Dark_Soft]MenuItem.checkBackground = @ijMenuCheckBackgroundL10
[Gruvbox_Dark_Soft]MenuItem.underlineSelectionCheckBackground = @ijMenuCheckBackgroundL10
[Gruvbox_Dark_Soft]ToggleButton.selectedBackground = $ToggleButton.selectedBackground
[Gruvbox_Dark_Soft]ToggleButton.toolbar.selectedBackground = $ToggleButton.toolbar.selectedBackground
[Hiberbee_Dark]TabbedPane.focusColor = #5A5A5A
[Hiberbee_Dark]ToggleButton.selectedBackground = $ToggleButton.selectedBackground
[Hiberbee_Dark]ToggleButton.selectedBackground = $ToggleButton.selectedBackground
[Hiberbee_Dark]ToggleButton.toolbar.selectedBackground = $ToggleButton.toolbar.selectedBackground
[High_contrast]ToggleButton.selectedBackground = #fff
[High_contrast]ToggleButton.selectedForeground = #000
[High_contrast]ToggleButton.disabledSelectedBackground = #444
[High_contrast]ToggleButton.toolbar.selectedBackground = #fff
[Light_Flat]TableHeader.background = #E5E5E9
[Monocai]MenuItem.checkBackground = @ijMenuCheckBackgroundL10
[Monocai]MenuItem.underlineSelectionCheckBackground = @ijMenuCheckBackgroundL10
@Monocai.acceleratorForeground = lazy(MenuItem.disabledForeground)
@Monocai.acceleratorSelectionForeground = lighten(MenuItem.disabledForeground,10%,lazy)
[Monocai]CheckBoxMenuItem.acceleratorForeground = @Monocai.acceleratorForeground
[Monocai]CheckBoxMenuItem.acceleratorSelectionForeground = @Monocai.acceleratorSelectionForeground
[Monocai]Menu.acceleratorForeground = @Monocai.acceleratorForeground
[Monocai]Menu.acceleratorSelectionForeground = @Monocai.acceleratorSelectionForeground
[Monocai]MenuItem.acceleratorForeground = @Monocai.acceleratorForeground
[Monocai]MenuItem.acceleratorSelectionForeground = @Monocai.acceleratorSelectionForeground
[Monocai]RadioButtonMenuItem.acceleratorForeground = @Monocai.acceleratorForeground
[Monocai]RadioButtonMenuItem.acceleratorSelectionForeground = @Monocai.acceleratorSelectionForeground
[Nord]MenuItem.checkBackground = @ijMenuCheckBackgroundL10
[Nord]MenuItem.underlineSelectionCheckBackground = @ijMenuCheckBackgroundL10
[One_Dark]MenuItem.checkBackground = @ijMenuCheckBackgroundL10
[One_Dark]MenuItem.underlineSelectionCheckBackground = @ijMenuCheckBackgroundL10
[One_Dark]Slider.focusedColor = fade(#568af2,40%)
[Solarized_Dark---4lex4]Slider.focusedColor = fade($Component.focusColor,80%,derived)
[vuesion-theme]MenuItem.checkBackground = @ijMenuCheckBackgroundL10
[vuesion-theme]MenuItem.underlineSelectionCheckBackground = @ijMenuCheckBackgroundL10
[vuesion-theme]Slider.trackValueColor = #ececee
[vuesion-theme]Slider.trackColor = #303a45
[vuesion-theme]Slider.thumbColor = #ececee
[vuesion-theme]Slider.focusedColor = fade(#ececee,20%)
# Material Theme UI Lite
[light][author-Mallowigi]MenuItem.checkBackground = @ijMenuCheckBackgroundD10
[light][author-Mallowigi]MenuItem.underlineSelectionCheckBackground = @ijMenuCheckBackgroundD10
[dark][author-Mallowigi]MenuItem.checkBackground = @ijMenuCheckBackgroundL20
[dark][author-Mallowigi]MenuItem.underlineSelectionCheckBackground = @ijMenuCheckBackgroundL20
[Dracula---Mallowigi]ProgressBar.selectionBackground = #fff
[Dracula---Mallowigi]ProgressBar.selectionForeground = #fff
[Dracula_Contrast]ProgressBar.selectionBackground = #fff
[Dracula_Contrast]ProgressBar.selectionForeground = #fff
[GitHub]ProgressBar.selectionBackground = #222
[GitHub]ProgressBar.selectionForeground = #222
[GitHub_Contrast]ProgressBar.selectionBackground = #222
[GitHub_Contrast]ProgressBar.selectionForeground = #222
[Light_Owl]List.selectionInactiveForeground = lazy(List.foreground)
[Light_Owl]ProgressBar.selectionBackground = #111
[Light_Owl]ProgressBar.selectionForeground = #fff
[Light_Owl]TabbedPane.selectedForeground = lazy(TabbedPane.foreground)
[Light_Owl]Table.selectionForeground = lazy(Table.foreground)
[Light_Owl_Contrast]List.selectionInactiveForeground = lazy(List.foreground)
[Light_Owl_Contrast]ProgressBar.selectionBackground = #111
[Light_Owl_Contrast]ProgressBar.selectionForeground = #fff
[Light_Owl_Contrast]TabbedPane.selectedForeground = lazy(TabbedPane.foreground)
[Light_Owl_Contrast]Table.selectionForeground = lazy(Table.foreground)
[Material_Lighter]ProgressBar.selectionBackground = #222
[Material_Lighter]ProgressBar.selectionForeground = #fff
[Material_Lighter_Contrast]ProgressBar.selectionBackground = #222
[Material_Lighter_Contrast]ProgressBar.selectionForeground = #fff
[Material_Oceanic]ProgressBar.selectionBackground = #ddd
[Material_Oceanic]ProgressBar.selectionForeground = #ddd
[Material_Oceanic_Contrast]ProgressBar.selectionBackground = #ddd
[Material_Oceanic_Contrast]ProgressBar.selectionForeground = #ddd
[Material_Palenight]ProgressBar.selectionBackground = #ddd
[Material_Palenight]ProgressBar.selectionForeground = #ddd
[Material_Palenight_Contrast]ProgressBar.selectionBackground = #ddd
[Material_Palenight_Contrast]ProgressBar.selectionForeground = #ddd
[Night_Owl]ProgressBar.selectionBackground = #ddd
[Night_Owl]ProgressBar.selectionForeground = #ddd
[Night_Owl_Contrast]ProgressBar.selectionBackground = #ddd
[Night_Owl_Contrast]ProgressBar.selectionForeground = #ddd
[Solarized_Dark---Mallowigi]ProgressBar.selectionBackground = #ccc
[Solarized_Dark---Mallowigi]ProgressBar.selectionForeground = #ccc
[Solarized_Dark_Contrast]ProgressBar.selectionBackground = #ccc
[Solarized_Dark_Contrast]ProgressBar.selectionForeground = #ccc
[Solarized_Light---Mallowigi]ProgressBar.selectionBackground = #222
[Solarized_Light---Mallowigi]ProgressBar.selectionForeground = #fff
[Solarized_Light_Contrast]ProgressBar.selectionBackground = #222
[Solarized_Light_Contrast]ProgressBar.selectionForeground = #fff

Some files were not shown because too many files have changed in this diff Show More