# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.

nb.preferred.color.profile=FlatLaf Light

#---- EditorView ----

Nb.EmptyEditorArea.background=darken(@background,12%)


#---- EditorTab ----

EditorTab.background=$Nb.EmptyEditorArea.background
EditorTab.foreground=lighten(@foreground,25%)
EditorTab.activeBackground=mix($EditorTab.background, $TabbedPane.underlineColor, 85%)
EditorTab.activeForeground=lighten(@foreground,25%)
EditorTab.selectedBackground=@background
EditorTab.selectedForeground=@foreground
# Add the hover effect only for unselected tabs.
EditorTab.hoverBackground=lighten($EditorTab.activeBackground,7%)
EditorTab.selectedHoverBackground=$EditorTab.selectedBackground
EditorTab.hoverForeground=@foreground
EditorTab.attentionBackground=#E6C840
EditorTab.attentionForeground=#000
EditorTab.underlineColor=$TabbedPane.underlineColor
EditorTab.inactiveUnderlineColor=#00000000


#---- ViewTab ----

ViewTab.background=$EditorTab.background
ViewTab.foreground=$EditorTab.foreground
ViewTab.activeBackground=$EditorTab.activeBackground
ViewTab.activeForeground=$EditorTab.activeForeground
ViewTab.selectedBackground=$EditorTab.selectedBackground
ViewTab.selectedForeground=$EditorTab.selectedForeground
ViewTab.hoverBackground=$EditorTab.hoverBackground
ViewTab.selectedHoverBackground=$EditorTab.selectedHoverBackground
ViewTab.hoverForeground=$EditorTab.hoverForeground
ViewTab.attentionBackground=$EditorTab.attentionBackground
ViewTab.attentionForeground=$EditorTab.attentionForeground
ViewTab.underlineColor=$EditorTab.underlineColor
ViewTab.inactiveUnderlineColor=$EditorTab.inactiveUnderlineColor


#---- SlidingButton ----

SlidingButton.hoverBackground=$ViewTab.hoverBackground
SlidingButton.selectedBackground=darken($SlidingButton.hoverBackground,10%)
SlidingButton.attentionBackground=$ViewTab.attentionBackground
SlidingButton.attentionForeground=$ViewTab.attentionForeground


#---- PropSheet ----

PropSheet.setBackground=darken(@background,10%)
PropSheet.setForeground=@foreground

# Start Page
nb.startpage.topbar.background=darken($TabbedPane.focusColor, 25%)
nb.startpage.tab.border1.color=$nb.startpage.topbar.background
nb.startpage.tab.border2.color=$nb.startpage.topbar.background

# QuickSearch
nb.quicksearch.border=1,1,1,1,@background

# output
nb.output.selectionBackground=#89BCED


#---- OptionsPanel ----

nb.options.categories.selectionBackground = rgb(193, 210, 238)
nb.options.categories.highlightBackground = rgb(224, 232, 246)
